/ Hex Artifact Content
Login

Artifact cd50269688fd37b3ce0fe204b61e9be8ec2cfcc0:


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 20 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f  .# include <sys/
0d60: 6d 6d 61 6e 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a  mman.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 20  E_LOCKING_STYLE 
0d90: 7c 7c 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 23 20  || OS_VXWORKS.# 
0da0: 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 69 6f 63  include <sys/ioc
0db0: 74 6c 2e 68 3e 0a 23 20 69 6e 63 6c 75 64 65 20  tl.h>.# include 
0dc0: 3c 75 75 69 64 2f 75 75 69 64 2e 68 3e 0a 23 20  <uuid/uuid.h>.# 
0dd0: 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
0de0: 4c 45 5f 5f 29 20 26 26 20 28 28 5f 5f 4d 41 43  LE__) && ((__MAC
0df0: 5f 4f 53 5f 58 5f 56 45 52 53 49 4f 4e 5f 4d 49  _OS_X_VERSION_MI
0e00: 4e 5f 52 45 51 55 49 52 45 44 20 3e 20 31 30 35  N_REQUIRED > 105
0e10: 30 29 20 7c 7c 20 5c 0a 20 20 20 20 20 20 20 20  0) || \.        
0e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0e30: 20 20 20 20 28 5f 5f 49 50 48 4f 4e 45 5f 4f 53      (__IPHONE_OS
0e40: 5f 56 45 52 53 49 4f 4e 5f 4d 49 4e 5f 52 45 51  _VERSION_MIN_REQ
0e50: 55 49 52 45 44 20 3e 20 32 30 30 30 29 29 0a 23  UIRED > 2000)).#
0e60: 20 20 64 65 66 69 6e 65 20 48 41 56 45 5f 47 45    define HAVE_GE
0e70: 54 48 4f 53 54 55 55 49 44 20 31 0a 23 20 65 6e  THOSTUUID 1.# en
0e80: 64 69 66 0a 23 20 69 66 20 4f 53 5f 56 58 57 4f  dif.# if OS_VXWO
0e90: 52 4b 53 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c  RKS.#  include <
0ea0: 73 65 6d 61 70 68 6f 72 65 2e 68 3e 0a 23 20 20  semaphore.h>.#  
0eb0: 69 6e 63 6c 75 64 65 20 3c 6c 69 6d 69 74 73 2e  include <limits.
0ec0: 68 3e 0a 23 20 65 6c 73 65 0a 23 20 20 69 6e 63  h>.# else.#  inc
0ed0: 6c 75 64 65 20 3c 73 79 73 2f 66 69 6c 65 2e 68  lude <sys/file.h
0ee0: 3e 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c 73 79  >.#  include <sy
0ef0: 73 2f 70 61 72 61 6d 2e 68 3e 0a 23 20 65 6e 64  s/param.h>.# end
0f00: 69 66 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  if.#endif /* SQL
0f10: 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
0f20: 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a 23 69 66  NG_STYLE */..#if
0f30: 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
0f40: 5f 5f 29 20 7c 7c 20 28 53 51 4c 49 54 45 5f 45  __) || (SQLITE_E
0f50: 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
0f60: 59 4c 45 20 26 26 20 21 4f 53 5f 56 58 57 4f 52  YLE && !OS_VXWOR
0f70: 4b 53 29 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73  KS).# include <s
0f80: 79 73 2f 6d 6f 75 6e 74 2e 68 3e 0a 23 65 6e 64  ys/mount.h>.#end
0f90: 69 66 0a 0a 23 69 66 64 65 66 20 48 41 56 45 5f  if..#ifdef HAVE_
0fa0: 55 54 49 4d 45 0a 23 20 69 6e 63 6c 75 64 65 20  UTIME.# include 
0fb0: 3c 75 74 69 6d 65 2e 68 3e 0a 23 65 6e 64 69 66  <utime.h>.#endif
0fc0: 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77 65 64 20  ../*.** Allowed 
0fd0: 76 61 6c 75 65 73 20 6f 66 20 75 6e 69 78 46 69  values of unixFi
0fe0: 6c 65 2e 66 73 46 6c 61 67 73 0a 2a 2f 0a 23 64  le.fsFlags.*/.#d
0ff0: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 46 53 46  efine SQLITE_FSF
1000: 4c 41 47 53 5f 49 53 5f 4d 53 44 4f 53 20 20 20  LAGS_IS_MSDOS   
1010: 20 20 30 78 31 0a 0a 2f 2a 0a 2a 2a 20 49 66 20    0x1../*.** If 
1020: 77 65 20 61 72 65 20 74 6f 20 62 65 20 74 68 72  we are to be thr
1030: 65 61 64 2d 73 61 66 65 2c 20 69 6e 63 6c 75 64  ead-safe, includ
1040: 65 20 74 68 65 20 70 74 68 72 65 61 64 73 20 68  e the pthreads h
1050: 65 61 64 65 72 20 61 6e 64 20 64 65 66 69 6e 65  eader and define
1060: 0a 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 55  .** the SQLITE_U
1070: 4e 49 58 5f 54 48 52 45 41 44 53 20 6d 61 63 72  NIX_THREADS macr
1080: 6f 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45  o..*/.#if SQLITE
1090: 5f 54 48 52 45 41 44 53 41 46 45 0a 23 20 69 6e  _THREADSAFE.# in
10a0: 63 6c 75 64 65 20 3c 70 74 68 72 65 61 64 2e 68  clude <pthread.h
10b0: 3e 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54  >.# define SQLIT
10c0: 45 5f 55 4e 49 58 5f 54 48 52 45 41 44 53 20 31  E_UNIX_THREADS 1
10d0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44  .#endif../*.** D
10e0: 65 66 61 75 6c 74 20 70 65 72 6d 69 73 73 69 6f  efault permissio
10f0: 6e 73 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67  ns when creating
1100: 20 61 20 6e 65 77 20 66 69 6c 65 0a 2a 2f 0a 23   a new file.*/.#
1110: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 45  ifndef SQLITE_DE
1120: 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49  FAULT_FILE_PERMI
1130: 53 53 49 4f 4e 53 0a 23 20 64 65 66 69 6e 65 20  SSIONS.# define 
1140: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46  SQLITE_DEFAULT_F
1150: 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 20  ILE_PERMISSIONS 
1160: 30 36 34 34 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  0644.#endif../*.
1170: 2a 2a 20 44 65 66 61 75 6c 74 20 70 65 72 6d 69  ** Default permi
1180: 73 73 69 6f 6e 73 20 77 68 65 6e 20 63 72 65 61  ssions when crea
1190: 74 69 6e 67 20 61 75 74 6f 20 70 72 6f 78 79 20  ting auto proxy 
11a0: 64 69 72 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  dir.*/.#ifndef S
11b0: 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 52  QLITE_DEFAULT_PR
11c0: 4f 58 59 44 49 52 5f 50 45 52 4d 49 53 53 49 4f  OXYDIR_PERMISSIO
11d0: 4e 53 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49  NS.# define SQLI
11e0: 54 45 5f 44 45 46 41 55 4c 54 5f 50 52 4f 58 59  TE_DEFAULT_PROXY
11f0: 44 49 52 5f 50 45 52 4d 49 53 53 49 4f 4e 53 20  DIR_PERMISSIONS 
1200: 30 37 35 35 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  0755.#endif../*.
1210: 2a 2a 20 4d 61 78 69 6d 75 6d 20 73 75 70 70 6f  ** Maximum suppo
1220: 72 74 65 64 20 70 61 74 68 2d 6c 65 6e 67 74 68  rted path-length
1230: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 41 58  ..*/.#define MAX
1240: 5f 50 41 54 48 4e 41 4d 45 20 35 31 32 0a 0a 2f  _PATHNAME 512../
1250: 2a 0a 2a 2a 20 4f 6e 6c 79 20 73 65 74 20 74 68  *.** Only set th
1260: 65 20 6c 61 73 74 45 72 72 6e 6f 20 69 66 20 74  e lastErrno if t
1270: 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  he error code is
1280: 20 61 20 72 65 61 6c 20 65 72 72 6f 72 20 61 6e   a real error an
1290: 64 20 6e 6f 74 20 0a 2a 2a 20 61 20 6e 6f 72 6d  d not .** a norm
12a0: 61 6c 20 65 78 70 65 63 74 65 64 20 72 65 74 75  al expected retu
12b0: 72 6e 20 63 6f 64 65 20 6f 66 20 53 51 4c 49 54  rn code of SQLIT
12c0: 45 5f 42 55 53 59 20 6f 72 20 53 51 4c 49 54 45  E_BUSY or SQLITE
12d0: 5f 4f 4b 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 49  _OK.*/.#define I
12e0: 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 78 29 20  S_LOCK_ERROR(x) 
12f0: 20 28 28 78 20 21 3d 20 53 51 4c 49 54 45 5f 4f   ((x != SQLITE_O
1300: 4b 29 20 26 26 20 28 78 20 21 3d 20 53 51 4c 49  K) && (x != SQLI
1310: 54 45 5f 42 55 53 59 29 29 0a 0a 2f 2a 20 46 6f  TE_BUSY))../* Fo
1320: 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 73  rward references
1330: 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75   */.typedef stru
1340: 63 74 20 75 6e 69 78 53 68 6d 20 75 6e 69 78 53  ct unixShm unixS
1350: 68 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  hm;             
1360: 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20    /* Connection 
1370: 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f  shared memory */
1380: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
1390: 75 6e 69 78 53 68 6d 4e 6f 64 65 20 75 6e 69 78  unixShmNode unix
13a0: 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20 20 20 2f  ShmNode;       /
13b0: 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  * Shared memory 
13c0: 69 6e 73 74 61 6e 63 65 20 2a 2f 0a 74 79 70 65  instance */.type
13d0: 64 65 66 20 73 74 72 75 63 74 20 75 6e 69 78 49  def struct unixI
13e0: 6e 6f 64 65 49 6e 66 6f 20 75 6e 69 78 49 6e 6f  nodeInfo unixIno
13f0: 64 65 49 6e 66 6f 3b 20 20 20 2f 2a 20 41 6e 20  deInfo;   /* An 
1400: 69 2d 6e 6f 64 65 20 2a 2f 0a 74 79 70 65 64 65  i-node */.typede
1410: 66 20 73 74 72 75 63 74 20 55 6e 69 78 55 6e 75  f struct UnixUnu
1420: 73 65 64 46 64 20 55 6e 69 78 55 6e 75 73 65 64  sedFd UnixUnused
1430: 46 64 3b 20 20 20 20 20 2f 2a 20 41 6e 20 75 6e  Fd;     /* An un
1440: 75 73 65 64 20 66 69 6c 65 20 64 65 73 63 72 69  used file descri
1450: 70 74 6f 72 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53  ptor */../*.** S
1460: 6f 6d 65 74 69 6d 65 73 2c 20 61 66 74 65 72 20  ometimes, after 
1470: 61 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 69 73  a file handle is
1480: 20 63 6c 6f 73 65 64 20 62 79 20 53 51 4c 69 74   closed by SQLit
1490: 65 2c 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  e, the file desc
14a0: 72 69 70 74 6f 72 0a 2a 2a 20 63 61 6e 6e 6f 74  riptor.** cannot
14b0: 20 62 65 20 63 6c 6f 73 65 64 20 69 6d 6d 65 64   be closed immed
14c0: 69 61 74 65 6c 79 2e 20 49 6e 20 74 68 65 73 65  iately. In these
14d0: 20 63 61 73 65 73 2c 20 69 6e 73 74 61 6e 63 65   cases, instance
14e0: 73 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  s of the followi
14f0: 6e 67 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20  ng.** structure 
1500: 61 72 65 20 75 73 65 64 20 74 6f 20 73 74 6f 72  are used to stor
1510: 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  e the file descr
1520: 69 70 74 6f 72 20 77 68 69 6c 65 20 77 61 69 74  iptor while wait
1530: 69 6e 67 20 66 6f 72 20 61 6e 0a 2a 2a 20 6f 70  ing for an.** op
1540: 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 65 69 74  portunity to eit
1550: 68 65 72 20 63 6c 6f 73 65 20 6f 72 20 72 65 75  her close or reu
1560: 73 65 20 69 74 2e 0a 2a 2f 0a 73 74 72 75 63 74  se it..*/.struct
1570: 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 7b 0a   UnixUnusedFd {.
1580: 20 20 69 6e 74 20 66 64 3b 20 20 20 20 20 20 20    int fd;       
1590: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
15a0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74  ile descriptor t
15b0: 6f 20 63 6c 6f 73 65 20 2a 2f 0a 20 20 69 6e 74  o close */.  int
15c0: 20 66 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20   flags;         
15d0: 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20         /* Flags 
15e0: 74 68 69 73 20 66 69 6c 65 20 64 65 73 63 72 69  this file descri
15f0: 70 74 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20  ptor was opened 
1600: 77 69 74 68 20 2a 2f 0a 20 20 55 6e 69 78 55 6e  with */.  UnixUn
1610: 75 73 65 64 46 64 20 2a 70 4e 65 78 74 3b 20 20  usedFd *pNext;  
1620: 20 20 20 20 2f 2a 20 4e 65 78 74 20 75 6e 75 73      /* Next unus
1630: 65 64 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ed file descript
1640: 6f 72 20 6f 6e 20 73 61 6d 65 20 66 69 6c 65 20  or on same file 
1650: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  */.};../*.** The
1660: 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63 74   unixFile struct
1670: 75 72 65 20 69 73 20 73 75 62 63 6c 61 73 73 20  ure is subclass 
1680: 6f 66 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  of sqlite3_file 
1690: 73 70 65 63 69 66 69 63 20 74 6f 20 74 68 65 20  specific to the 
16a0: 75 6e 69 78 0a 2a 2a 20 56 46 53 20 69 6d 70 6c  unix.** VFS impl
16b0: 65 6d 65 6e 74 61 74 69 6f 6e 73 2e 0a 2a 2f 0a  ementations..*/.
16c0: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 75  typedef struct u
16d0: 6e 69 78 46 69 6c 65 20 75 6e 69 78 46 69 6c 65  nixFile unixFile
16e0: 3b 0a 73 74 72 75 63 74 20 75 6e 69 78 46 69 6c  ;.struct unixFil
16f0: 65 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f  e {.  sqlite3_io
1700: 5f 6d 65 74 68 6f 64 73 20 63 6f 6e 73 74 20 2a  _methods const *
1710: 70 4d 65 74 68 6f 64 3b 20 20 2f 2a 20 41 6c 77  pMethod;  /* Alw
1720: 61 79 73 20 74 68 65 20 66 69 72 73 74 20 65 6e  ays the first en
1730: 74 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  try */.  sqlite3
1740: 5f 76 66 73 20 2a 70 56 66 73 3b 20 20 20 20 20  _vfs *pVfs;     
1750: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1760: 54 68 65 20 56 46 53 20 74 68 61 74 20 63 72 65  The VFS that cre
1770: 61 74 65 64 20 74 68 69 73 20 75 6e 69 78 46 69  ated this unixFi
1780: 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64  le */.  unixInod
1790: 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 20 20  eInfo *pInode;  
17a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
17b0: 6e 66 6f 20 61 62 6f 75 74 20 6c 6f 63 6b 73 20  nfo about locks 
17c0: 6f 6e 20 74 68 69 73 20 69 6e 6f 64 65 20 2a 2f  on this inode */
17d0: 0a 20 20 69 6e 74 20 68 3b 20 20 20 20 20 20 20  .  int h;       
17e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69         /* The fi
1800: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f  le descriptor */
1810: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
1820: 20 65 46 69 6c 65 4c 6f 63 6b 3b 20 20 20 20 20   eFileLock;     
1830: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 79         /* The ty
1840: 70 65 20 6f 66 20 6c 6f 63 6b 20 68 65 6c 64 20  pe of lock held 
1850: 6f 6e 20 74 68 69 73 20 66 64 20 2a 2f 0a 20 20  on this fd */.  
1860: 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20 69  unsigned short i
1870: 6e 74 20 63 74 72 6c 46 6c 61 67 73 3b 20 20 20  nt ctrlFlags;   
1880: 20 20 20 20 2f 2a 20 42 65 68 61 76 69 6f 72 61      /* Behaviora
1890: 6c 20 62 69 74 73 2e 20 20 55 4e 49 58 46 49 4c  l bits.  UNIXFIL
18a0: 45 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a 20 20 69  E_* flags */.  i
18b0: 6e 74 20 6c 61 73 74 45 72 72 6e 6f 3b 20 20 20  nt lastErrno;   
18c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18d0: 20 20 20 2f 2a 20 54 68 65 20 75 6e 69 78 20 65     /* The unix e
18e0: 72 72 6e 6f 20 66 72 6f 6d 20 6c 61 73 74 20 49  rrno from last I
18f0: 2f 4f 20 65 72 72 6f 72 20 2a 2f 0a 20 20 76 6f  /O error */.  vo
1900: 69 64 20 2a 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  id *lockingConte
1910: 78 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  xt;             
1920: 20 20 2f 2a 20 4c 6f 63 6b 69 6e 67 20 73 74 79    /* Locking sty
1930: 6c 65 20 73 70 65 63 69 66 69 63 20 73 74 61 74  le specific stat
1940: 65 20 2a 2f 0a 20 20 55 6e 69 78 55 6e 75 73 65  e */.  UnixUnuse
1950: 64 46 64 20 2a 70 55 6e 75 73 65 64 3b 20 20 20  dFd *pUnused;   
1960: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72             /* Pr
1970: 65 2d 61 6c 6c 6f 63 61 74 65 64 20 55 6e 69 78  e-allocated Unix
1980: 55 6e 75 73 65 64 46 64 20 2a 2f 0a 20 20 63 6f  UnusedFd */.  co
1990: 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 3b  nst char *zPath;
19a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19b0: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
19c0: 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 53   file */.  unixS
19d0: 68 6d 20 2a 70 53 68 6d 3b 20 20 20 20 20 20 20  hm *pShm;       
19e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
19f0: 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  * Shared memory 
1a00: 73 65 67 6d 65 6e 74 20 69 6e 66 6f 72 6d 61 74  segment informat
1a10: 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 43  ion */.  int szC
1a20: 68 75 6e 6b 3b 20 20 20 20 20 20 20 20 20 20 20  hunk;           
1a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a40: 43 6f 6e 66 69 67 75 72 65 64 20 62 79 20 46 43  Configured by FC
1a50: 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a 45 20 2a  NTL_CHUNK_SIZE *
1a60: 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  /.#if SQLITE_MAX
1a70: 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 69  _MMAP_SIZE>0.  i
1a80: 6e 74 20 6e 46 65 74 63 68 4f 75 74 3b 20 20 20  nt nFetchOut;   
1a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aa0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1ab0: 6f 75 74 73 74 61 6e 64 69 6e 67 20 78 46 65 74  outstanding xFet
1ac0: 63 68 20 72 65 66 73 20 2a 2f 0a 20 20 73 71 6c  ch refs */.  sql
1ad0: 69 74 65 33 5f 69 6e 74 36 34 20 6d 6d 61 70 53  ite3_int64 mmapS
1ae0: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
1af0: 20 2f 2a 20 55 73 61 62 6c 65 20 73 69 7a 65 20   /* Usable size 
1b00: 6f 66 20 6d 61 70 70 69 6e 67 20 61 74 20 70 4d  of mapping at pM
1b10: 61 70 52 65 67 69 6f 6e 20 2a 2f 0a 20 20 73 71  apRegion */.  sq
1b20: 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d 6d 61 70  lite3_int64 mmap
1b30: 53 69 7a 65 41 63 74 75 61 6c 3b 20 20 20 20 20  SizeActual;     
1b40: 20 20 2f 2a 20 41 63 74 75 61 6c 20 73 69 7a 65    /* Actual size
1b50: 20 6f 66 20 6d 61 70 70 69 6e 67 20 61 74 20 70   of mapping at p
1b60: 4d 61 70 52 65 67 69 6f 6e 20 2a 2f 0a 20 20 73  MapRegion */.  s
1b70: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d 6d 61  qlite3_int64 mma
1b80: 70 53 69 7a 65 4d 61 78 3b 20 20 20 20 20 20 20  pSizeMax;       
1b90: 20 20 20 2f 2a 20 43 6f 6e 66 69 67 75 72 65 64     /* Configured
1ba0: 20 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45   FCNTL_MMAP_SIZE
1bb0: 20 76 61 6c 75 65 20 2a 2f 0a 20 20 76 6f 69 64   value */.  void
1bc0: 20 2a 70 4d 61 70 52 65 67 69 6f 6e 3b 20 20 20   *pMapRegion;   
1bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1be0: 2f 2a 20 4d 65 6d 6f 72 79 20 6d 61 70 70 65 64  /* Memory mapped
1bf0: 20 72 65 67 69 6f 6e 20 2a 2f 0a 23 65 6e 64 69   region */.#endi
1c00: 66 0a 23 69 66 64 65 66 20 5f 5f 51 4e 58 4e 54  f.#ifdef __QNXNT
1c10: 4f 5f 5f 0a 20 20 69 6e 74 20 73 65 63 74 6f 72  O__.  int sector
1c20: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
1c30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 76            /* Dev
1c40: 69 63 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20  ice sector size 
1c50: 2a 2f 0a 20 20 69 6e 74 20 64 65 76 69 63 65 43  */.  int deviceC
1c60: 68 61 72 61 63 74 65 72 69 73 74 69 63 73 3b 20  haracteristics; 
1c70: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 63           /* Prec
1c80: 6f 6d 70 75 74 65 64 20 64 65 76 69 63 65 20 63  omputed device c
1c90: 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20 2a  haracteristics *
1ca0: 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  /.#endif.#if SQL
1cb0: 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
1cc0: 4e 47 5f 53 54 59 4c 45 20 7c 7c 20 64 65 66 69  NG_STYLE || defi
1cd0: 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20  ned(__APPLE__). 
1ce0: 20 69 6e 74 20 6f 70 65 6e 46 6c 61 67 73 3b 20   int openFlags; 
1cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d00: 20 20 20 20 20 2f 2a 20 54 68 65 20 66 6c 61 67       /* The flag
1d10: 73 20 73 70 65 63 69 66 69 65 64 20 61 74 20 6f  s specified at o
1d20: 70 65 6e 28 29 20 2a 2f 0a 23 65 6e 64 69 66 0a  pen() */.#endif.
1d30: 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  #if SQLITE_ENABL
1d40: 45 5f 44 41 54 41 5f 50 52 4f 54 45 43 54 49 4f  E_DATA_PROTECTIO
1d50: 4e 0a 20 20 69 6e 74 20 70 72 6f 74 46 6c 61 67  N.  int protFlag
1d60: 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
1d70: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 20          /* Data 
1d80: 70 72 6f 74 65 63 74 69 6f 6e 20 66 6c 61 67 73  protection flags
1d90: 20 66 72 6f 6d 20 75 6e 69 78 4f 70 65 6e 20 2a   from unixOpen *
1da0: 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  /.#endif.#if SQL
1db0: 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
1dc0: 4e 47 5f 53 54 59 4c 45 20 7c 7c 20 64 65 66 69  NG_STYLE || defi
1dd0: 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20  ned(__APPLE__). 
1de0: 20 75 6e 73 69 67 6e 65 64 20 66 73 46 6c 61 67   unsigned fsFlag
1df0: 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
1e00: 20 20 20 20 20 2f 2a 20 63 61 63 68 65 64 20 64       /* cached d
1e10: 65 74 61 69 6c 73 20 66 72 6f 6d 20 73 74 61 74  etails from stat
1e20: 66 73 28 29 20 2a 2f 0a 23 65 6e 64 69 66 0a 23  fs() */.#endif.#
1e30: 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  if OS_VXWORKS.  
1e40: 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69  struct vxworksFi
1e50: 6c 65 49 64 20 2a 70 49 64 3b 20 20 20 20 20 20  leId *pId;      
1e60: 20 20 20 20 2f 2a 20 55 6e 69 71 75 65 20 66 69      /* Unique fi
1e70: 6c 65 20 49 44 20 2a 2f 0a 23 65 6e 64 69 66 0a  le ID */.#endif.
1e80: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
1e90: 42 55 47 0a 20 20 2f 2a 20 54 68 65 20 6e 65 78  BUG.  /* The nex
1ea0: 74 20 67 72 6f 75 70 20 6f 66 20 76 61 72 69 61  t group of varia
1eb0: 62 6c 65 73 20 61 72 65 20 75 73 65 64 20 74 6f  bles are used to
1ec0: 20 74 72 61 63 6b 20 77 68 65 74 68 65 72 20 6f   track whether o
1ed0: 72 20 6e 6f 74 20 74 68 65 0a 20 20 2a 2a 20 74  r not the.  ** t
1ee0: 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74  ransaction count
1ef0: 65 72 20 69 6e 20 62 79 74 65 73 20 32 34 2d 32  er in bytes 24-2
1f00: 37 20 6f 66 20 64 61 74 61 62 61 73 65 20 66 69  7 of database fi
1f10: 6c 65 73 20 61 72 65 20 75 70 64 61 74 65 64 0a  les are updated.
1f20: 20 20 2a 2a 20 77 68 65 6e 65 76 65 72 20 61 6e    ** whenever an
1f30: 79 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 61  y part of the da
1f40: 74 61 62 61 73 65 20 63 68 61 6e 67 65 73 2e 20  tabase changes. 
1f50: 20 41 6e 20 61 73 73 65 72 74 69 6f 6e 20 66 61   An assertion fa
1f60: 75 6c 74 20 77 69 6c 6c 0a 20 20 2a 2a 20 6f 63  ult will.  ** oc
1f70: 63 75 72 20 69 66 20 61 20 66 69 6c 65 20 69 73  cur if a file is
1f80: 20 75 70 64 61 74 65 64 20 77 69 74 68 6f 75 74   updated without
1f90: 20 61 6c 73 6f 20 75 70 64 61 74 69 6e 67 20 74   also updating t
1fa0: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20  he transaction. 
1fb0: 20 2a 2a 20 63 6f 75 6e 74 65 72 2e 20 20 54 68   ** counter.  Th
1fc0: 69 73 20 74 65 73 74 20 69 73 20 6d 61 64 65 20  is test is made 
1fd0: 74 6f 20 61 76 6f 69 64 20 6e 65 77 20 70 72 6f  to avoid new pro
1fe0: 62 6c 65 6d 73 20 73 69 6d 69 6c 61 72 20 74 6f  blems similar to
1ff0: 20 74 68 65 0a 20 20 2a 2a 20 6f 6e 65 20 64 65   the.  ** one de
2000: 73 63 72 69 62 65 64 20 62 79 20 74 69 63 6b 65  scribed by ticke
2010: 74 20 23 33 35 38 34 2e 20 0a 20 20 2a 2f 0a 20  t #3584. .  */. 
2020: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 74   unsigned char t
2030: 72 61 6e 73 43 6e 74 72 43 68 6e 67 3b 20 20 20  ransCntrChng;   
2040: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 74  /* True if the t
2050: 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74  ransaction count
2060: 65 72 20 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20  er changed */.  
2070: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 64 62  unsigned char db
2080: 55 70 64 61 74 65 3b 20 20 20 20 20 20 20 20 2f  Update;        /
2090: 2a 20 54 72 75 65 20 69 66 20 61 6e 79 20 70 61  * True if any pa
20a0: 72 74 20 6f 66 20 64 61 74 61 62 61 73 65 20 66  rt of database f
20b0: 69 6c 65 20 63 68 61 6e 67 65 64 20 2a 2f 0a 20  ile changed */. 
20c0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 69   unsigned char i
20d0: 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 3b 20 20 20  nNormalWrite;   
20e0: 2f 2a 20 54 72 75 65 20 69 66 20 69 6e 20 61 20  /* True if in a 
20f0: 6e 6f 72 6d 61 6c 20 77 72 69 74 65 20 6f 70 65  normal write ope
2100: 72 61 74 69 6f 6e 20 2a 2f 0a 0a 23 65 6e 64 69  ration */..#endi
2110: 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  f..#ifdef SQLITE
2120: 5f 54 45 53 54 0a 20 20 2f 2a 20 49 6e 20 74 65  _TEST.  /* In te
2130: 73 74 20 6d 6f 64 65 2c 20 69 6e 63 72 65 61 73  st mode, increas
2140: 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  e the size of th
2150: 69 73 20 73 74 72 75 63 74 75 72 65 20 61 20 62  is structure a b
2160: 69 74 20 73 6f 20 74 68 61 74 20 0a 20 20 2a 2a  it so that .  **
2170: 20 69 74 20 69 73 20 6c 61 72 67 65 72 20 74 68   it is larger th
2180: 61 6e 20 74 68 65 20 73 74 72 75 63 74 20 43 72  an the struct Cr
2190: 61 73 68 46 69 6c 65 20 64 65 66 69 6e 65 64 20  ashFile defined 
21a0: 69 6e 20 74 65 73 74 36 2e 63 2e 0a 20 20 2a 2f  in test6.c..  */
21b0: 0a 20 20 63 68 61 72 20 61 50 61 64 64 69 6e 67  .  char aPadding
21c0: 5b 33 32 5d 3b 0a 23 65 6e 64 69 66 0a 7d 3b 0a  [32];.#endif.};.
21d0: 0a 2f 2a 20 54 68 69 73 20 76 61 72 69 61 62 6c  ./* This variabl
21e0: 65 20 68 6f 6c 64 73 20 74 68 65 20 70 72 6f 63  e holds the proc
21f0: 65 73 73 20 69 64 20 28 70 69 64 29 20 66 72 6f  ess id (pid) fro
2200: 6d 20 77 68 65 6e 20 74 68 65 20 78 52 61 6e 64  m when the xRand
2210: 6f 6d 6e 65 73 73 28 29 0a 2a 2a 20 6d 65 74 68  omness().** meth
2220: 6f 64 20 77 61 73 20 63 61 6c 6c 65 64 2e 20 20  od was called.  
2230: 49 66 20 78 4f 70 65 6e 28 29 20 69 73 20 63 61  If xOpen() is ca
2240: 6c 6c 65 64 20 66 72 6f 6d 20 61 20 64 69 66 66  lled from a diff
2250: 65 72 65 6e 74 20 70 72 6f 63 65 73 73 20 69 64  erent process id
2260: 2c 0a 2a 2a 20 69 6e 64 69 63 61 74 69 6e 67 20  ,.** indicating 
2270: 74 68 61 74 20 61 20 66 6f 72 6b 28 29 20 68 61  that a fork() ha
2280: 73 20 6f 63 63 75 72 72 65 64 2c 20 74 68 65 20  s occurred, the 
2290: 50 52 4e 47 20 77 69 6c 6c 20 62 65 20 72 65 73  PRNG will be res
22a0: 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  et..*/.static in
22b0: 74 20 72 61 6e 64 6f 6d 6e 65 73 73 50 69 64 20  t randomnessPid 
22c0: 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  = 0;../*.** Allo
22d0: 77 65 64 20 76 61 6c 75 65 73 20 66 6f 72 20 74  wed values for t
22e0: 68 65 20 75 6e 69 78 46 69 6c 65 2e 63 74 72 6c  he unixFile.ctrl
22f0: 46 6c 61 67 73 20 62 69 74 6d 61 73 6b 3a 0a 2a  Flags bitmask:.*
2300: 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 46 49  /.#define UNIXFI
2310: 4c 45 5f 45 58 43 4c 20 20 20 20 20 20 20 20 30  LE_EXCL        0
2320: 78 30 31 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65  x01     /* Conne
2330: 63 74 69 6f 6e 73 20 66 72 6f 6d 20 6f 6e 65 20  ctions from one 
2340: 70 72 6f 63 65 73 73 20 6f 6e 6c 79 20 2a 2f 0a  process only */.
2350: 23 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c 45  #define UNIXFILE
2360: 5f 52 44 4f 4e 4c 59 20 20 20 20 20 20 30 78 30  _RDONLY      0x0
2370: 32 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74  2     /* Connect
2380: 69 6f 6e 20 69 73 20 72 65 61 64 20 6f 6e 6c 79  ion is read only
2390: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49 58   */.#define UNIX
23a0: 46 49 4c 45 5f 50 45 52 53 49 53 54 5f 57 41 4c  FILE_PERSIST_WAL
23b0: 20 30 78 30 34 20 20 20 20 20 2f 2a 20 50 65 72   0x04     /* Per
23c0: 73 69 73 74 65 6e 74 20 57 41 4c 20 6d 6f 64 65  sistent WAL mode
23d0: 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
23e0: 54 45 5f 44 49 53 41 42 4c 45 5f 44 49 52 53 59  TE_DISABLE_DIRSY
23f0: 4e 43 0a 23 20 64 65 66 69 6e 65 20 55 4e 49 58  NC.# define UNIX
2400: 46 49 4c 45 5f 44 49 52 53 59 4e 43 20 20 20 20  FILE_DIRSYNC    
2410: 30 78 30 38 20 20 20 20 20 2f 2a 20 44 69 72 65  0x08     /* Dire
2420: 63 74 6f 72 79 20 73 79 6e 63 20 6e 65 65 64 65  ctory sync neede
2430: 64 20 2a 2f 0a 23 65 6c 73 65 0a 23 20 64 65 66  d */.#else.# def
2440: 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f 44 49 52  ine UNIXFILE_DIR
2450: 53 59 4e 43 20 20 20 20 30 78 30 30 0a 23 65 6e  SYNC    0x00.#en
2460: 64 69 66 0a 23 64 65 66 69 6e 65 20 55 4e 49 58  dif.#define UNIX
2470: 46 49 4c 45 5f 50 53 4f 57 20 20 20 20 20 20 20  FILE_PSOW       
2480: 20 30 78 31 30 20 20 20 20 20 2f 2a 20 53 51 4c   0x10     /* SQL
2490: 49 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53  ITE_IOCAP_POWERS
24a0: 41 46 45 5f 4f 56 45 52 57 52 49 54 45 20 2a 2f  AFE_OVERWRITE */
24b0: 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c  .#define UNIXFIL
24c0: 45 5f 44 45 4c 45 54 45 20 20 20 20 20 20 30 78  E_DELETE      0x
24d0: 32 30 20 20 20 20 20 2f 2a 20 44 65 6c 65 74 65  20     /* Delete
24e0: 20 6f 6e 20 63 6c 6f 73 65 20 2a 2f 0a 23 64 65   on close */.#de
24f0: 66 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f 55 52  fine UNIXFILE_UR
2500: 49 20 20 20 20 20 20 20 20 20 30 78 34 30 20 20  I         0x40  
2510: 20 20 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 6d     /* Filename m
2520: 69 67 68 74 20 68 61 76 65 20 71 75 65 72 79 20  ight have query 
2530: 70 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a 23 64  parameters */.#d
2540: 65 66 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f 4e  efine UNIXFILE_N
2550: 4f 4c 4f 43 4b 20 20 20 20 20 20 30 78 38 30 20  OLOCK      0x80 
2560: 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 20 66 69 6c      /* Do no fil
2570: 65 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 23 64 65  e locking */.#de
2580: 66 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f 57 41  fine UNIXFILE_WA
2590: 52 4e 45 44 20 20 20 20 30 78 30 31 30 30 20 20  RNED    0x0100  
25a0: 20 20 20 2f 2a 20 76 65 72 69 66 79 44 62 46 69     /* verifyDbFi
25b0: 6c 65 28 29 20 77 61 72 6e 69 6e 67 73 20 68 61  le() warnings ha
25c0: 76 65 20 62 65 65 6e 20 69 73 73 75 65 64 20 2a  ve been issued *
25d0: 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 6c 75 64 65  /../*.** Include
25e0: 20 63 6f 64 65 20 74 68 61 74 20 69 73 20 63 6f   code that is co
25f0: 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6f 73 5f 2a  mmon to all os_*
2600: 2e 63 20 66 69 6c 65 73 0a 2a 2f 0a 23 69 6e 63  .c files.*/.#inc
2610: 6c 75 64 65 20 22 6f 73 5f 63 6f 6d 6d 6f 6e 2e  lude "os_common.
2620: 68 22 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65  h"../*.** Define
2630: 20 76 61 72 69 6f 75 73 20 6d 61 63 72 6f 73 20   various macros 
2640: 74 68 61 74 20 61 72 65 20 6d 69 73 73 69 6e 67  that are missing
2650: 20 66 72 6f 6d 20 73 6f 6d 65 20 73 79 73 74 65   from some syste
2660: 6d 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4f  ms..*/.#ifndef O
2670: 5f 4c 41 52 47 45 46 49 4c 45 0a 23 20 64 65 66  _LARGEFILE.# def
2680: 69 6e 65 20 4f 5f 4c 41 52 47 45 46 49 4c 45 20  ine O_LARGEFILE 
2690: 30 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  0.#endif.#ifdef 
26a0: 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 4c  SQLITE_DISABLE_L
26b0: 46 53 0a 23 20 75 6e 64 65 66 20 4f 5f 4c 41 52  FS.# undef O_LAR
26c0: 47 45 46 49 4c 45 0a 23 20 64 65 66 69 6e 65 20  GEFILE.# define 
26d0: 4f 5f 4c 41 52 47 45 46 49 4c 45 20 30 0a 23 65  O_LARGEFILE 0.#e
26e0: 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 4f 5f 4e  ndif.#ifndef O_N
26f0: 4f 46 4f 4c 4c 4f 57 0a 23 20 64 65 66 69 6e 65  OFOLLOW.# define
2700: 20 4f 5f 4e 4f 46 4f 4c 4c 4f 57 20 30 0a 23 65   O_NOFOLLOW 0.#e
2710: 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 4f 5f 42  ndif.#ifndef O_B
2720: 49 4e 41 52 59 0a 23 20 64 65 66 69 6e 65 20 4f  INARY.# define O
2730: 5f 42 49 4e 41 52 59 20 30 0a 23 65 6e 64 69 66  _BINARY 0.#endif
2740: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 68 72 65  ../*.** The thre
2750: 61 64 69 64 20 6d 61 63 72 6f 20 72 65 73 6f 6c  adid macro resol
2760: 76 65 73 20 74 6f 20 74 68 65 20 74 68 72 65 61  ves to the threa
2770: 64 2d 69 64 20 6f 72 20 74 6f 20 30 2e 20 20 55  d-id or to 0.  U
2780: 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69  sed for.** testi
2790: 6e 67 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67  ng and debugging
27a0: 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 20 53 51   only..*/.#if SQ
27b0: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a  LITE_THREADSAFE.
27c0: 23 64 65 66 69 6e 65 20 74 68 72 65 61 64 69 64  #define threadid
27d0: 20 70 74 68 72 65 61 64 5f 73 65 6c 66 28 29 0a   pthread_self().
27e0: 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 74 68  #else.#define th
27f0: 72 65 61 64 69 64 20 30 0a 23 65 6e 64 69 66 0a  readid 0.#endif.
2800: 0a 23 69 66 64 65 66 20 5f 5f 41 50 50 4c 45 5f  .#ifdef __APPLE_
2810: 5f 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45  _.#define SQLITE
2820: 5f 45 4e 41 42 4c 45 5f 53 55 50 45 52 4c 4f 43  _ENABLE_SUPERLOC
2830: 4b 20 31 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  K 1.#endif..#if 
2840: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 55  SQLITE_ENABLE_SU
2850: 50 45 52 4c 4f 43 4b 0a 23 69 6e 63 6c 75 64 65  PERLOCK.#include
2860: 20 22 73 71 6c 69 74 65 33 2e 68 22 0a 23 69 6e   "sqlite3.h".#in
2870: 63 6c 75 64 65 20 3c 73 74 72 69 6e 67 2e 68 3e  clude <string.h>
2880: 0a 23 69 6e 63 6c 75 64 65 20 3c 61 73 73 65 72  .#include <asser
2890: 74 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20 41 20 73 74  t.h>../*.** A st
28a0: 72 75 63 74 75 72 65 20 74 6f 20 63 6f 6c 6c 65  ructure to colle
28b0: 63 74 20 61 20 62 75 73 79 2d 68 61 6e 64 6c 65  ct a busy-handle
28c0: 72 20 63 61 6c 6c 62 61 63 6b 20 61 6e 64 20 61  r callback and a
28d0: 72 67 75 6d 65 6e 74 20 61 6e 64 20 61 20 63 6f  rgument and a co
28e0: 75 6e 74 0a 2a 2a 20 6f 66 20 74 68 65 20 6e 75  unt.** of the nu
28f0: 6d 62 65 72 20 6f 66 20 74 69 6d 65 73 20 69 74  mber of times it
2900: 20 68 61 73 20 62 65 65 6e 20 69 6e 76 6f 6b 65   has been invoke
2910: 64 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 53 75 70  d..*/.struct Sup
2920: 65 72 6c 6f 63 6b 42 75 73 79 20 7b 0a 20 20 69  erlockBusy {.  i
2930: 6e 74 20 28 2a 78 42 75 73 79 29 28 76 6f 69 64  nt (*xBusy)(void
2940: 2a 2c 69 6e 74 29 3b 20 20 20 20 20 20 20 20 2f  *,int);        /
2950: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 73  * Pointer to bus
2960: 79 2d 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69  y-handler functi
2970: 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42  on */.  void *pB
2980: 75 73 79 41 72 67 3b 20 20 20 20 20 20 20 20 20  usyArg;         
2990: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
29a0: 20 61 72 67 20 74 6f 20 70 61 73 73 20 74 6f 20   arg to pass to 
29b0: 78 42 75 73 79 20 2a 2f 0a 20 20 69 6e 74 20 6e  xBusy */.  int n
29c0: 42 75 73 79 3b 20 20 20 20 20 20 20 20 20 20 20  Busy;           
29d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
29e0: 6d 62 65 72 20 6f 66 20 74 69 6d 65 73 20 78 42  mber of times xB
29f0: 75 73 79 20 68 61 73 20 62 65 65 6e 20 69 6e 76  usy has been inv
2a00: 6f 6b 65 64 20 2a 2f 0a 7d 3b 0a 74 79 70 65 64  oked */.};.typed
2a10: 65 66 20 73 74 72 75 63 74 20 53 75 70 65 72 6c  ef struct Superl
2a20: 6f 63 6b 42 75 73 79 20 53 75 70 65 72 6c 6f 63  ockBusy Superloc
2a30: 6b 42 75 73 79 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e  kBusy;../*.** An
2a40: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
2a50: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
2a60: 74 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74 65  ture is allocate
2a70: 64 20 66 6f 72 20 65 61 63 68 20 61 63 74 69 76  d for each activ
2a80: 65 0a 2a 2a 20 73 75 70 65 72 6c 6f 63 6b 2e 20  e.** superlock. 
2a90: 54 68 65 20 6f 70 61 71 75 65 20 68 61 6e 64 6c  The opaque handl
2aa0: 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 73 71  e returned by sq
2ab0: 6c 69 74 65 33 64 65 6d 6f 5f 73 75 70 65 72 6c  lite3demo_superl
2ac0: 6f 63 6b 28 29 20 69 73 0a 2a 2a 20 61 63 74 75  ock() is.** actu
2ad0: 61 6c 6c 79 20 61 20 70 6f 69 6e 74 65 72 20 74  ally a pointer t
2ae0: 6f 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  o an instance of
2af0: 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65 2e   this structure.
2b00: 0a 2a 2f 0a 73 74 72 75 63 74 20 53 75 70 65 72  .*/.struct Super
2b10: 6c 6f 63 6b 20 7b 0a 20 20 73 71 6c 69 74 65 33  lock {.  sqlite3
2b20: 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20   *db;           
2b30: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
2b40: 62 61 73 65 20 68 61 6e 64 6c 65 20 75 73 65 64  base handle used
2b50: 20 74 6f 20 6c 6f 63 6b 20 64 62 20 2a 2f 0a 20   to lock db */. 
2b60: 20 69 6e 74 20 62 57 61 6c 3b 20 20 20 20 20 20   int bWal;      
2b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b80: 20 2f 2a 20 54 72 75 65 20 69 66 20 64 62 20 69   /* True if db i
2b90: 73 20 61 20 57 41 4c 20 64 61 74 61 62 61 73 65  s a WAL database
2ba0: 20 2a 2f 0a 7d 3b 0a 74 79 70 65 64 65 66 20 73   */.};.typedef s
2bb0: 74 72 75 63 74 20 53 75 70 65 72 6c 6f 63 6b 20  truct Superlock 
2bc0: 53 75 70 65 72 6c 6f 63 6b 3b 0a 0a 2f 2a 0a 2a  Superlock;../*.*
2bd0: 2a 20 54 68 65 20 70 43 74 78 20 70 6f 69 6e 74  * The pCtx point
2be0: 65 72 20 70 61 73 73 65 64 20 74 6f 20 74 68 69  er passed to thi
2bf0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 63  s function is ac
2c00: 74 75 61 6c 6c 79 20 61 20 70 6f 69 6e 74 65 72  tually a pointer
2c10: 20 74 6f 20 61 0a 2a 2a 20 53 75 70 65 72 6c 6f   to a.** Superlo
2c20: 63 6b 42 75 73 79 20 73 74 72 75 63 74 75 72 65  ckBusy structure
2c30: 2e 20 49 6e 76 6f 6b 65 20 74 68 65 20 62 75 73  . Invoke the bus
2c40: 79 2d 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69  y-handler functi
2c50: 6f 6e 20 65 6e 63 61 70 73 75 6c 61 74 65 64 0a  on encapsulated.
2c60: 2a 2a 20 62 79 20 74 68 65 20 73 74 72 75 63 74  ** by the struct
2c70: 75 72 65 20 61 6e 64 20 72 65 74 75 72 6e 20 74  ure and return t
2c80: 68 65 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a 73 74  he result..*/.st
2c90: 61 74 69 63 20 69 6e 74 20 73 75 70 65 72 6c 6f  atic int superlo
2ca0: 63 6b 42 75 73 79 48 61 6e 64 6c 65 72 28 76 6f  ckBusyHandler(vo
2cb0: 69 64 20 2a 70 43 74 78 2c 20 69 6e 74 20 55 4e  id *pCtx, int UN
2cc0: 55 53 45 44 29 7b 0a 20 20 53 75 70 65 72 6c 6f  USED){.  Superlo
2cd0: 63 6b 42 75 73 79 20 2a 70 42 75 73 79 20 3d 20  ckBusy *pBusy = 
2ce0: 28 53 75 70 65 72 6c 6f 63 6b 42 75 73 79 20 2a  (SuperlockBusy *
2cf0: 29 70 43 74 78 3b 0a 20 20 69 66 28 20 70 42 75  )pCtx;.  if( pBu
2d00: 73 79 2d 3e 78 42 75 73 79 3d 3d 30 20 29 20 72  sy->xBusy==0 ) r
2d10: 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75 72  eturn 0;.  retur
2d20: 6e 20 70 42 75 73 79 2d 3e 78 42 75 73 79 28 70  n pBusy->xBusy(p
2d30: 42 75 73 79 2d 3e 70 42 75 73 79 41 72 67 2c 20  Busy->pBusyArg, 
2d40: 70 42 75 73 79 2d 3e 6e 42 75 73 79 2b 2b 29 3b  pBusy->nBusy++);
2d50: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
2d60: 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
2d70: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20  to determine if 
2d80: 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
2d90: 65 20 66 69 6c 65 20 66 6f 72 20 0a 2a 2a 20 63  e file for .** c
2da0: 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 20 69 73 20  onnection db is 
2db0: 6f 70 65 6e 20 69 6e 20 57 41 4c 20 6d 6f 64 65  open in WAL mode
2dc0: 20 6f 72 20 6e 6f 74 2e 20 49 66 20 6e 6f 20 65   or not. If no e
2dd0: 72 72 6f 72 20 6f 63 63 75 72 73 20 61 6e 64 20  rror occurs and 
2de0: 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
2df0: 66 69 6c 65 20 69 73 20 69 6e 20 57 41 4c 20 6d  file is in WAL m
2e00: 6f 64 65 2c 20 73 65 74 20 2a 70 62 57 61 6c 20  ode, set *pbWal 
2e10: 74 6f 20 74 72 75 65 20 61 6e 64 20 72 65 74 75  to true and retu
2e20: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a  rn SQLITE_OK..**
2e30: 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 69 6e   If it is not in
2e40: 20 57 41 4c 20 6d 6f 64 65 2c 20 73 65 74 20 2a   WAL mode, set *
2e50: 70 62 57 61 6c 20 74 6f 20 66 61 6c 73 65 2e 0a  pbWal to false..
2e60: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
2e70: 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e  r occurs, return
2e80: 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
2e90: 20 63 6f 64 65 2e 20 54 68 65 20 76 61 6c 75 65   code. The value
2ea0: 20 6f 66 20 2a 70 62 57 61 6c 0a 2a 2a 20 69 73   of *pbWal.** is
2eb0: 20 75 6e 64 65 66 69 6e 65 64 20 69 6e 20 74 68   undefined in th
2ec0: 69 73 20 63 61 73 65 2e 0a 2a 2f 0a 73 74 61 74  is case..*/.stat
2ed0: 69 63 20 69 6e 74 20 73 75 70 65 72 6c 6f 63 6b  ic int superlock
2ee0: 49 73 57 61 6c 28 53 75 70 65 72 6c 6f 63 6b 20  IsWal(Superlock 
2ef0: 2a 70 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72  *pLock){.  int r
2f00: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
2f10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
2f20: 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 73  turn Code */.  s
2f30: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
2f40: 6d 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  mt;            /
2f50: 2a 20 43 6f 6d 70 69 6c 65 64 20 50 52 41 47 4d  * Compiled PRAGM
2f60: 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 73  A journal_mode s
2f70: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 0a 20 20 72  tatement */..  r
2f80: 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
2f90: 61 72 65 28 70 4c 6f 63 6b 2d 3e 64 62 2c 20 22  are(pLock->db, "
2fa0: 50 52 41 47 4d 41 20 6d 61 69 6e 2e 6a 6f 75 72  PRAGMA main.jour
2fb0: 6e 61 6c 5f 6d 6f 64 65 22 2c 20 2d 31 2c 20 26  nal_mode", -1, &
2fc0: 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 69 66 28  pStmt, 0);.  if(
2fd0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2fe0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 70   return rc;..  p
2ff0: 4c 6f 63 6b 2d 3e 62 57 61 6c 20 3d 20 30 3b 0a  Lock->bWal = 0;.
3000: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 52 4f 57    if( SQLITE_ROW
3010: 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  ==sqlite3_step(p
3020: 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 63 6f 6e  Stmt) ){.    con
3030: 73 74 20 63 68 61 72 20 2a 7a 4d 6f 64 65 20 3d  st char *zMode =
3040: 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 73   (const char *)s
3050: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
3060: 78 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  xt(pStmt, 0);.  
3070: 20 20 69 66 28 20 7a 4d 6f 64 65 20 26 26 20 73    if( zMode && s
3080: 74 72 6c 65 6e 28 7a 4d 6f 64 65 29 3d 3d 33 20  trlen(zMode)==3 
3090: 26 26 20 73 71 6c 69 74 65 33 5f 73 74 72 6e 69  && sqlite3_strni
30a0: 63 6d 70 28 22 77 61 6c 22 2c 20 7a 4d 6f 64 65  cmp("wal", zMode
30b0: 2c 20 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  , 3)==0 ){.     
30c0: 20 70 4c 6f 63 6b 2d 3e 62 57 61 6c 20 3d 20 31   pLock->bWal = 1
30d0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
30e0: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 66 69  eturn sqlite3_fi
30f0: 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 7d  nalize(pStmt);.}
3100: 0a 0a 2f 2a 0a 2a 2a 20 4f 62 74 61 69 6e 20 61  ../*.** Obtain a
3110: 6e 20 65 78 63 6c 75 73 69 76 65 20 73 68 6d 2d  n exclusive shm-
3120: 6c 6f 63 6b 20 6f 6e 20 6e 42 79 74 65 20 62 79  lock on nByte by
3130: 74 65 73 20 73 74 61 72 74 69 6e 67 20 61 74 20  tes starting at 
3140: 6f 66 66 73 65 74 20 69 64 78 0a 2a 2a 20 6f 66  offset idx.** of
3150: 20 74 68 65 20 66 69 6c 65 20 66 64 2e 20 49 66   the file fd. If
3160: 20 74 68 65 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74   the lock cannot
3170: 20 62 65 20 6f 62 74 61 69 6e 65 64 20 69 6d 6d   be obtained imm
3180: 65 64 69 61 74 65 6c 79 2c 20 69 6e 76 6f 6b 65  ediately, invoke
3190: 0a 2a 2a 20 74 68 65 20 62 75 73 79 2d 68 61 6e  .** the busy-han
31a0: 64 6c 65 72 20 75 6e 74 69 6c 20 65 69 74 68 65  dler until eithe
31b0: 72 20 69 74 20 69 73 20 6f 62 74 61 69 6e 65 64  r it is obtained
31c0: 20 6f 72 20 74 68 65 20 62 75 73 79 2d 68 61 6e   or the busy-han
31d0: 64 6c 65 72 0a 2a 2a 20 63 61 6c 6c 62 61 63 6b  dler.** callback
31e0: 20 72 65 74 75 72 6e 73 20 30 2e 0a 2a 2f 0a 73   returns 0..*/.s
31f0: 74 61 74 69 63 20 69 6e 74 20 73 75 70 65 72 6c  tatic int superl
3200: 6f 63 6b 53 68 6d 4c 6f 63 6b 28 0a 20 20 73 71  ockShmLock(.  sq
3210: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20  lite3_file *fd, 
3220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3230: 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   Database file h
3240: 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69  andle */.  int i
3250: 64 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  dx,             
3260: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
3270: 66 73 65 74 20 6f 66 20 73 68 6d 2d 6c 6f 63 6b  fset of shm-lock
3280: 20 74 6f 20 6f 62 74 61 69 6e 20 2a 2f 0a 20 20   to obtain */.  
3290: 69 6e 74 20 6e 42 79 74 65 2c 20 20 20 20 20 20  int nByte,      
32a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32b0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6e  /* Number of con
32c0: 73 65 63 74 69 76 65 20 62 79 74 65 73 20 74 6f  sective bytes to
32d0: 20 6c 6f 63 6b 20 2a 2f 0a 20 20 53 75 70 65 72   lock */.  Super
32e0: 6c 6f 63 6b 42 75 73 79 20 2a 70 42 75 73 79 20  lockBusy *pBusy 
32f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75             /* Bu
3300: 73 79 2d 68 61 6e 64 6c 65 72 20 77 72 61 70 70  sy-handler wrapp
3310: 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a  er object */.){.
3320: 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
3330: 28 2a 78 53 68 6d 4c 6f 63 6b 29 28 73 71 6c 69  (*xShmLock)(sqli
3340: 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 2c 20  te3_file*, int, 
3350: 69 6e 74 2c 20 69 6e 74 29 20 3d 20 66 64 2d 3e  int, int) = fd->
3360: 70 4d 65 74 68 6f 64 73 2d 3e 78 53 68 6d 4c 6f  pMethods->xShmLo
3370: 63 6b 3b 0a 20 20 64 6f 20 7b 0a 20 20 20 20 72  ck;.  do {.    r
3380: 63 20 3d 20 78 53 68 6d 4c 6f 63 6b 28 66 64 2c  c = xShmLock(fd,
3390: 20 69 64 78 2c 20 6e 42 79 74 65 2c 20 53 51 4c   idx, nByte, SQL
33a0: 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b 7c 53 51 4c  ITE_SHM_LOCK|SQL
33b0: 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56  ITE_SHM_EXCLUSIV
33c0: 45 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20 72 63  E);.  }while( rc
33d0: 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26  ==SQLITE_BUSY &&
33e0: 20 73 75 70 65 72 6c 6f 63 6b 42 75 73 79 48 61   superlockBusyHa
33f0: 6e 64 6c 65 72 28 28 76 6f 69 64 20 2a 29 70 42  ndler((void *)pB
3400: 75 73 79 2c 20 30 29 20 29 3b 0a 20 20 72 65 74  usy, 0) );.  ret
3410: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
3420: 20 4f 62 74 61 69 6e 20 74 68 65 20 65 78 74 72   Obtain the extr
3430: 61 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 20 64  a locks on the d
3440: 61 74 61 62 61 73 65 20 66 69 6c 65 20 72 65 71  atabase file req
3450: 75 69 72 65 64 20 66 6f 72 20 57 41 4c 20 64 61  uired for WAL da
3460: 74 61 62 61 73 65 73 2e 0a 2a 2a 20 49 6e 76 6f  tabases..** Invo
3470: 6b 65 20 74 68 65 20 73 75 70 70 6c 69 65 64 20  ke the supplied 
3480: 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 61 73 20  busy-handler as 
3490: 72 65 71 75 69 72 65 64 2e 0a 2a 2f 0a 73 74 61  required..*/.sta
34a0: 74 69 63 20 69 6e 74 20 73 75 70 65 72 6c 6f 63  tic int superloc
34b0: 6b 57 61 6c 4c 6f 63 6b 28 0a 20 20 73 71 6c 69  kWalLock(.  sqli
34c0: 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
34d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
34e0: 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 6f  atabase handle o
34f0: 70 65 6e 20 6f 6e 20 57 41 4c 20 64 61 74 61 62  pen on WAL datab
3500: 61 73 65 20 2a 2f 0a 20 20 53 75 70 65 72 6c 6f  ase */.  Superlo
3510: 63 6b 42 75 73 79 20 2a 70 42 75 73 79 20 20 20  ckBusy *pBusy   
3520: 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75 73 79           /* Busy
3530: 20 68 61 6e 64 6c 65 72 20 77 72 61 70 70 65 72   handler wrapper
3540: 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20   object */.){.  
3550: 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
3560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3570: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
3580: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  /.  sqlite3_file
3590: 20 2a 66 64 20 3d 20 30 3b 20 20 20 20 20 20 20   *fd = 0;       
35a0: 20 20 20 20 2f 2a 20 4d 61 69 6e 20 64 61 74 61      /* Main data
35b0: 62 61 73 65 20 66 69 6c 65 20 68 61 6e 64 6c 65  base file handle
35c0: 20 2a 2f 0a 20 20 76 6f 69 64 20 76 6f 6c 61 74   */.  void volat
35d0: 69 6c 65 20 2a 70 20 3d 20 30 3b 20 20 20 20 20  ile *p = 0;     
35e0: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
35f0: 20 74 6f 20 66 69 72 73 74 20 70 61 67 65 20 6f   to first page o
3600: 66 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  f shared memory 
3610: 2a 2f 0a 0a 20 20 2f 2a 20 4f 62 74 61 69 6e 20  */..  /* Obtain 
3620: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
3630: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 6f 62   sqlite3_file ob
3640: 6a 65 63 74 20 6f 70 65 6e 20 6f 6e 20 74 68 65  ject open on the
3650: 20 6d 61 69 6e 20 64 62 20 66 69 6c 65 2e 20 2a   main db file. *
3660: 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  /.  rc = sqlite3
3670: 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62  _file_control(db
3680: 2c 20 22 6d 61 69 6e 22 2c 20 53 51 4c 49 54 45  , "main", SQLITE
3690: 5f 46 43 4e 54 4c 5f 46 49 4c 45 5f 50 4f 49 4e  _FCNTL_FILE_POIN
36a0: 54 45 52 2c 20 28 76 6f 69 64 20 2a 29 26 66 64  TER, (void *)&fd
36b0: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
36c0: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
36d0: 72 63 3b 0a 0a 20 20 2f 2a 20 4f 62 74 61 69 6e  rc;..  /* Obtain
36e0: 20 74 68 65 20 22 72 65 63 6f 76 65 72 79 22 20   the "recovery" 
36f0: 6c 6f 63 6b 2e 20 4e 6f 72 6d 61 6c 6c 79 2c 20  lock. Normally, 
3700: 74 68 69 73 20 6c 6f 63 6b 20 69 73 20 6f 6e 6c  this lock is onl
3710: 79 20 6f 62 74 61 69 6e 65 64 20 62 79 0a 20 20  y obtained by.  
3720: 2a 2a 20 63 6c 69 65 6e 74 73 20 72 75 6e 6e 69  ** clients runni
3730: 6e 67 20 64 61 74 61 62 61 73 65 20 72 65 63 6f  ng database reco
3740: 76 65 72 79 2e 20 20 0a 20 20 2a 2f 0a 20 20 72  very.  .  */.  r
3750: 63 20 3d 20 73 75 70 65 72 6c 6f 63 6b 53 68 6d  c = superlockShm
3760: 4c 6f 63 6b 28 66 64 2c 20 32 2c 20 31 2c 20 70  Lock(fd, 2, 1, p
3770: 42 75 73 79 29 3b 0a 20 20 69 66 28 20 72 63 21  Busy);.  if( rc!
3780: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
3790: 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 5a 65  urn rc;..  /* Ze
37a0: 72 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  ro the start of 
37b0: 74 68 65 20 66 69 72 73 74 20 73 68 61 72 65 64  the first shared
37c0: 2d 6d 65 6d 6f 72 79 20 70 61 67 65 2e 20 54 68  -memory page. Th
37d0: 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 61 6e  is means that an
37e0: 79 0a 20 20 2a 2a 20 63 6c 69 65 6e 74 73 20 74  y.  ** clients t
37f0: 68 61 74 20 6f 70 65 6e 20 72 65 61 64 20 6f 72  hat open read or
3800: 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
3810: 6f 6e 73 20 66 72 6f 6d 20 74 68 69 73 20 70 6f  ons from this po
3820: 69 6e 74 20 6f 6e 20 77 69 6c 6c 0a 20 20 2a 2a  int on will.  **
3830: 20 68 61 76 65 20 74 6f 20 72 75 6e 20 72 65 63   have to run rec
3840: 6f 76 65 72 79 20 62 65 66 6f 72 65 20 70 72 6f  overy before pro
3850: 63 65 65 64 69 6e 67 2e 20 53 69 6e 63 65 20 74  ceeding. Since t
3860: 68 65 79 20 6e 65 65 64 20 74 68 65 20 22 72 65  hey need the "re
3870: 63 6f 76 65 72 79 22 0a 20 20 2a 2a 20 6c 6f 63  covery".  ** loc
3880: 6b 20 74 68 61 74 20 74 68 69 73 20 70 72 6f 63  k that this proc
3890: 65 73 73 20 69 73 20 68 6f 6c 64 69 6e 67 20 74  ess is holding t
38a0: 6f 20 64 6f 20 74 68 61 74 2c 20 6e 6f 20 6e 65  o do that, no ne
38b0: 77 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 0a  w read or write.
38c0: 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
38d0: 73 20 6d 61 79 20 6e 6f 77 20 62 65 20 6f 70 65  s may now be ope
38e0: 6e 65 64 2e 20 4e 6f 72 20 63 61 6e 20 61 20 63  ned. Nor can a c
38f0: 68 65 63 6b 70 6f 69 6e 74 20 62 65 20 72 75 6e  heckpoint be run
3900: 2c 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 73  , for the.  ** s
3910: 61 6d 65 20 72 65 61 73 6f 6e 2e 0a 20 20 2a 2f  ame reason..  */
3920: 0a 20 20 72 63 20 3d 20 66 64 2d 3e 70 4d 65 74  .  rc = fd->pMet
3930: 68 6f 64 73 2d 3e 78 53 68 6d 4d 61 70 28 66 64  hods->xShmMap(fd
3940: 2c 20 30 2c 20 33 32 2a 31 30 32 34 2c 20 31 2c  , 0, 32*1024, 1,
3950: 20 26 70 29 3b 0a 20 20 69 66 28 20 72 63 21 3d   &p);.  if( rc!=
3960: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
3970: 72 6e 20 72 63 3b 0a 20 20 6d 65 6d 73 65 74 28  rn rc;.  memset(
3980: 28 76 6f 69 64 20 2a 29 70 2c 20 30 2c 20 33 32  (void *)p, 0, 32
3990: 29 3b 0a 0a 20 20 2f 2a 20 4f 62 74 61 69 6e 20  );..  /* Obtain 
39a0: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20  exclusive locks 
39b0: 6f 6e 20 61 6c 6c 20 74 68 65 20 22 72 65 61 64  on all the "read
39c0: 2d 6c 6f 63 6b 22 20 73 6c 6f 74 73 2e 20 4f 6e  -lock" slots. On
39d0: 63 65 20 74 68 65 73 65 20 6c 6f 63 6b 73 0a 20  ce these locks. 
39e0: 20 2a 2a 20 61 72 65 20 68 65 6c 64 2c 20 69 74   ** are held, it
39f0: 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
3a00: 68 61 74 20 74 68 65 72 65 20 61 72 65 20 6e 6f  hat there are no
3a10: 20 61 63 74 69 76 65 20 72 65 61 64 65 72 2c 20   active reader, 
3a20: 77 72 69 74 65 72 20 6f 72 20 0a 20 20 2a 2a 20  writer or .  ** 
3a30: 63 68 65 63 6b 70 6f 69 6e 74 65 72 20 63 6c 69  checkpointer cli
3a40: 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  ents..  */.  rc 
3a50: 3d 20 73 75 70 65 72 6c 6f 63 6b 53 68 6d 4c 6f  = superlockShmLo
3a60: 63 6b 28 66 64 2c 20 33 2c 20 53 51 4c 49 54 45  ck(fd, 3, SQLITE
3a70: 5f 53 48 4d 5f 4e 4c 4f 43 4b 2d 33 2c 20 70 42  _SHM_NLOCK-3, pB
3a80: 75 73 79 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  usy);.  return r
3a90: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65  c;.}../*.** Rele
3aa0: 61 73 65 20 61 20 73 75 70 65 72 6c 6f 63 6b 20  ase a superlock 
3ab0: 68 65 6c 64 20 6f 6e 20 61 20 64 61 74 61 62 61  held on a databa
3ac0: 73 65 20 66 69 6c 65 2e 20 54 68 65 20 61 72 67  se file. The arg
3ad0: 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20  ument passed to 
3ae0: 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f  .** this functio
3af0: 6e 20 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e  n must have been
3b00: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 61   obtained from a
3b10: 20 73 75 63 63 65 73 73 66 75 6c 20 63 61 6c 6c   successful call
3b20: 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 64 65   to.** sqlite3de
3b30: 6d 6f 5f 73 75 70 65 72 6c 6f 63 6b 28 29 2e 0a  mo_superlock()..
3b40: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
3b50: 71 6c 69 74 65 33 64 65 6d 6f 5f 73 75 70 65 72  qlite3demo_super
3b60: 75 6e 6c 6f 63 6b 28 76 6f 69 64 20 2a 70 4c 6f  unlock(void *pLo
3b70: 63 6b 29 7b 0a 20 20 53 75 70 65 72 6c 6f 63 6b  ck){.  Superlock
3b80: 20 2a 70 20 3d 20 28 53 75 70 65 72 6c 6f 63 6b   *p = (Superlock
3b90: 20 2a 29 70 4c 6f 63 6b 3b 0a 20 20 69 66 28 20   *)pLock;.  if( 
3ba0: 70 2d 3e 62 57 61 6c 20 29 7b 0a 20 20 20 20 69  p->bWal ){.    i
3bb0: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
3bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3bd0: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
3be0: 0a 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d  .    int flags =
3bf0: 20 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f   SQLITE_SHM_UNLO
3c00: 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f  CK | SQLITE_SHM_
3c10: 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20 73  EXCLUSIVE;.    s
3c20: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 20  qlite3_file *fd 
3c30: 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  = 0;.    rc = sq
3c40: 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72  lite3_file_contr
3c50: 6f 6c 28 70 2d 3e 64 62 2c 20 22 6d 61 69 6e 22  ol(p->db, "main"
3c60: 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 46  , SQLITE_FCNTL_F
3c70: 49 4c 45 5f 50 4f 49 4e 54 45 52 2c 0a 20 20 20  ILE_POINTER,.   
3c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c90: 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 20            (void 
3ca0: 2a 29 26 66 64 29 3b 0a 20 20 20 20 69 66 28 20  *)&fd);.    if( 
3cb0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
3cc0: 0a 20 20 20 20 20 20 66 64 2d 3e 70 4d 65 74 68  .      fd->pMeth
3cd0: 6f 64 73 2d 3e 78 53 68 6d 4c 6f 63 6b 28 66 64  ods->xShmLock(fd
3ce0: 2c 20 32 2c 20 31 2c 20 66 6c 61 67 73 29 3b 0a  , 2, 1, flags);.
3cf0: 20 20 20 20 20 20 66 64 2d 3e 70 4d 65 74 68 6f        fd->pMetho
3d00: 64 73 2d 3e 78 53 68 6d 4c 6f 63 6b 28 66 64 2c  ds->xShmLock(fd,
3d10: 20 33 2c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 4e   3, SQLITE_SHM_N
3d20: 4c 4f 43 4b 2d 33 2c 20 66 6c 61 67 73 29 3b 0a  LOCK-3, flags);.
3d30: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
3d40: 74 65 33 5f 63 6c 6f 73 65 28 70 2d 3e 64 62 29  te3_close(p->db)
3d50: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
3d60: 28 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 62  (p);.}../*.** Ob
3d70: 74 61 69 6e 20 61 20 73 75 70 65 72 6c 6f 63 6b  tain a superlock
3d80: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
3d90: 20 66 69 6c 65 20 69 64 65 6e 74 69 66 69 65 64   file identified
3da0: 20 62 79 20 7a 50 61 74 68 2c 20 75 73 69 6e 67   by zPath, using
3db0: 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20   the.** locking 
3dc0: 70 72 69 6d 69 74 69 76 65 73 20 70 72 6f 76 69  primitives provi
3dd0: 64 65 64 20 62 79 20 56 46 53 20 7a 56 66 73 2e  ded by VFS zVfs.
3de0: 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
3df0: 53 51 4c 49 54 45 5f 4f 4b 20 69 73 0a 2a 2a 20  SQLITE_OK is.** 
3e00: 72 65 74 75 72 6e 65 64 20 61 6e 64 20 6f 75 74  returned and out
3e10: 70 75 74 20 76 61 72 69 61 62 6c 65 20 2a 70 70  put variable *pp
3e20: 4c 6f 63 6b 20 69 73 20 70 6f 70 75 6c 61 74 65  Lock is populate
3e30: 64 20 77 69 74 68 20 61 6e 20 6f 70 61 71 75 65  d with an opaque
3e40: 20 68 61 6e 64 6c 65 0a 2a 2a 20 74 68 61 74 20   handle.** that 
3e50: 6d 61 79 20 62 65 20 75 73 65 64 20 77 69 74 68  may be used with
3e60: 20 73 71 6c 69 74 65 33 64 65 6d 6f 5f 73 75 70   sqlite3demo_sup
3e70: 65 72 75 6e 6c 6f 63 6b 28 29 20 74 6f 20 72 65  erunlock() to re
3e80: 6c 65 61 73 65 20 74 68 65 20 6c 6f 63 6b 2e 0a  lease the lock..
3e90: 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
3ea0: 72 20 6f 63 63 75 72 73 2c 20 2a 70 70 4c 6f 63  r occurs, *ppLoc
3eb0: 6b 20 69 73 20 73 65 74 20 74 6f 20 30 20 61 6e  k is set to 0 an
3ec0: 64 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  d an SQLite erro
3ed0: 72 20 63 6f 64 65 20 0a 2a 2a 20 28 65 2e 67 2e  r code .** (e.g.
3ee0: 20 53 51 4c 49 54 45 5f 42 55 53 59 29 20 69 73   SQLITE_BUSY) is
3ef0: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
3f00: 20 49 66 20 61 20 72 65 71 75 69 72 65 64 20 6c   If a required l
3f10: 6f 63 6b 20 63 61 6e 6e 6f 74 20 62 65 20 6f 62  ock cannot be ob
3f20: 74 61 69 6e 65 64 20 69 6d 6d 65 64 69 61 74 65  tained immediate
3f30: 6c 79 20 61 6e 64 20 74 68 65 20 78 42 75 73 79  ly and the xBusy
3f40: 20 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20 74 6f   parameter.** to
3f50: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
3f60: 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e  s not NULL, then
3f70: 20 78 42 75 73 79 20 69 73 20 69 6e 76 6f 6b 65   xBusy is invoke
3f80: 64 20 69 6e 20 74 68 65 20 73 61 6d 65 20 77 61  d in the same wa
3f90: 79 0a 2a 2a 20 61 73 20 61 20 62 75 73 79 2d 68  y.** as a busy-h
3fa0: 61 6e 64 6c 65 72 20 72 65 67 69 73 74 65 72 65  andler registere
3fb0: 64 20 77 69 74 68 20 53 51 4c 69 74 65 20 28 75  d with SQLite (u
3fc0: 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 62 75 73  sing sqlite3_bus
3fd0: 79 5f 68 61 6e 64 6c 65 72 28 29 29 0a 2a 2a 20  y_handler()).** 
3fe0: 75 6e 74 69 6c 20 65 69 74 68 65 72 20 74 68 65  until either the
3ff0: 20 6c 6f 63 6b 20 63 61 6e 20 62 65 20 6f 62 74   lock can be obt
4000: 61 69 6e 65 64 20 6f 72 20 74 68 65 20 62 75 73  ained or the bus
4010: 79 2d 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69  y-handler functi
4020: 6f 6e 20 72 65 74 75 72 6e 73 0a 2a 2a 20 30 20  on returns.** 0 
4030: 28 69 6e 64 69 63 61 74 69 6e 67 20 22 67 69 76  (indicating "giv
4040: 65 20 75 70 22 29 2e 0a 2a 2f 0a 73 74 61 74 69  e up")..*/.stati
4050: 63 20 69 6e 74 20 73 71 6c 69 74 65 33 64 65 6d  c int sqlite3dem
4060: 6f 5f 73 75 70 65 72 6c 6f 63 6b 28 0a 20 20 63  o_superlock(.  c
4070: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68  onst char *zPath
4080: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
4090: 2a 20 50 61 74 68 20 74 6f 20 64 61 74 61 62 61  * Path to databa
40a0: 73 65 20 66 69 6c 65 20 74 6f 20 6c 6f 63 6b 20  se file to lock 
40b0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
40c0: 2a 7a 56 66 73 2c 20 20 20 20 20 20 20 20 20 20  *zVfs,          
40d0: 20 20 20 20 20 2f 2a 20 56 46 53 20 74 6f 20 75       /* VFS to u
40e0: 73 65 20 74 6f 20 61 63 63 65 73 73 20 64 61 74  se to access dat
40f0: 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
4100: 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20  int flags,      
4110: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4120: 41 64 64 69 74 69 6f 6e 61 6c 20 66 6c 61 67 73  Additional flags
4130: 20 74 6f 20 70 61 73 73 20 74 6f 20 73 71 6c 69   to pass to sqli
4140: 74 65 33 5f 6f 70 65 6e 5f 76 32 20 2a 2f 0a 20  te3_open_v2 */. 
4150: 20 69 6e 74 20 28 2a 78 42 75 73 79 29 28 76 6f   int (*xBusy)(vo
4160: 69 64 2a 2c 69 6e 74 29 2c 20 20 20 20 20 20 20  id*,int),       
4170: 20 2f 2a 20 42 75 73 79 20 68 61 6e 64 6c 65 72   /* Busy handler
4180: 20 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 76   callback */.  v
4190: 6f 69 64 20 2a 70 42 75 73 79 41 72 67 2c 20 20  oid *pBusyArg,  
41a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
41b0: 2a 20 43 6f 6e 74 65 78 74 20 61 72 67 20 66 6f  * Context arg fo
41c0: 72 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 2a  r busy handler *
41d0: 2f 0a 20 20 76 6f 69 64 20 2a 2a 70 70 4c 6f 63  /.  void **ppLoc
41e0: 6b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k               
41f0: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 43 6f 6e 74      /* OUT: Cont
4200: 65 78 74 20 74 6f 20 70 61 73 73 20 74 6f 20 73  ext to pass to s
4210: 75 70 65 72 75 6e 6c 6f 63 6b 28 29 20 2a 2f 0a  uperunlock() */.
4220: 29 7b 0a 20 20 53 75 70 65 72 6c 6f 63 6b 42 75  ){.  SuperlockBu
4230: 73 79 20 62 75 73 79 20 3d 20 7b 30 2c 20 30 2c  sy busy = {0, 0,
4240: 20 30 7d 3b 20 2f 2a 20 42 75 73 79 20 68 61 6e   0}; /* Busy han
4250: 64 6c 65 72 20 77 72 61 70 70 65 72 20 6f 62 6a  dler wrapper obj
4260: 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  ect */.  int rc;
4270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4280: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
4290: 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 53 75 70  rn code */.  Sup
42a0: 65 72 6c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a 0a  erlock *pLock;..
42b0: 20 20 70 4c 6f 63 6b 20 3d 20 73 71 6c 69 74 65    pLock = sqlite
42c0: 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28  3_malloc(sizeof(
42d0: 53 75 70 65 72 6c 6f 63 6b 29 29 3b 0a 20 20 69  Superlock));.  i
42e0: 66 28 20 21 70 4c 6f 63 6b 20 29 20 72 65 74 75  f( !pLock ) retu
42f0: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
4300: 0a 20 20 6d 65 6d 73 65 74 28 70 4c 6f 63 6b 2c  .  memset(pLock,
4310: 20 30 2c 20 73 69 7a 65 6f 66 28 53 75 70 65 72   0, sizeof(Super
4320: 6c 6f 63 6b 29 29 3b 0a 0a 20 20 2f 2a 20 4f 70  lock));..  /* Op
4330: 65 6e 20 61 20 64 61 74 61 62 61 73 65 20 68 61  en a database ha
4340: 6e 64 6c 65 20 6f 6e 20 74 68 65 20 66 69 6c 65  ndle on the file
4350: 20 74 6f 20 73 75 70 65 72 6c 6f 63 6b 2e 20 2a   to superlock. *
4360: 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  /.  rc = sqlite3
4370: 5f 6f 70 65 6e 5f 76 32 28 0a 20 20 20 20 20 20  _open_v2(.      
4380: 7a 50 61 74 68 2c 20 26 70 4c 6f 63 6b 2d 3e 64  zPath, &pLock->d
4390: 62 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  b, SQLITE_OPEN_R
43a0: 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f  EADWRITE|SQLITE_
43b0: 4f 50 45 4e 5f 43 52 45 41 54 45 7c 66 6c 61 67  OPEN_CREATE|flag
43c0: 73 2c 20 7a 56 66 73 0a 20 20 29 3b 0a 0a 20 20  s, zVfs.  );..  
43d0: 2f 2a 20 49 6e 73 74 61 6c 6c 20 61 20 62 75 73  /* Install a bus
43e0: 79 2d 68 61 6e 64 6c 65 72 20 61 6e 64 20 65 78  y-handler and ex
43f0: 65 63 75 74 65 20 61 20 42 45 47 49 4e 20 45 58  ecute a BEGIN EX
4400: 43 4c 55 53 49 56 45 2e 20 49 66 20 74 68 69 73  CLUSIVE. If this
4410: 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 61 20 57   is not.  ** a W
4420: 41 4c 20 64 61 74 61 62 61 73 65 2c 20 74 68 69  AL database, thi
4430: 73 20 69 73 20 61 6c 6c 20 77 65 20 6e 65 65 64  s is all we need
4440: 20 74 6f 20 64 6f 2e 20 20 0a 20 20 2a 2a 0a 20   to do.  .  **. 
4450: 20 2a 2a 20 41 20 77 72 61 70 70 65 72 20 66 75   ** A wrapper fu
4460: 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  nction is used t
4470: 6f 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73  o invoke the bus
4480: 79 2d 68 61 6e 64 6c 65 72 20 69 6e 73 74 65 61  y-handler instea
4490: 64 20 6f 66 0a 20 20 2a 2a 20 72 65 67 69 73 74  d of.  ** regist
44a0: 65 72 69 6e 67 20 74 68 65 20 62 75 73 79 2d 68  ering the busy-h
44b0: 61 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e 20  andler function 
44c0: 73 75 70 70 6c 69 65 64 20 62 79 20 74 68 65 20  supplied by the 
44d0: 75 73 65 72 20 64 69 72 65 63 74 6c 79 0a 20 20  user directly.  
44e0: 2a 2a 20 77 69 74 68 20 53 51 4c 69 74 65 2e 20  ** with SQLite. 
44f0: 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65 20  This is because 
4500: 74 68 65 20 73 61 6d 65 20 62 75 73 79 2d 68 61  the same busy-ha
4510: 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e 20 6d  ndler function m
4520: 61 79 20 62 65 0a 20 20 2a 2a 20 69 6e 76 6f 6b  ay be.  ** invok
4530: 65 64 20 64 69 72 65 63 74 6c 79 20 6c 61 74 65  ed directly late
4540: 72 20 6f 6e 20 77 68 65 6e 20 61 74 74 65 6d 70  r on when attemp
4550: 74 69 6e 67 20 74 6f 20 6f 62 74 61 69 6e 20 74  ting to obtain t
4560: 68 65 20 65 78 74 72 61 20 6c 6f 63 6b 73 0a 20  he extra locks. 
4570: 20 2a 2a 20 72 65 71 75 69 72 65 64 20 69 6e 20   ** required in 
4580: 57 41 4c 20 6d 6f 64 65 2e 20 42 79 20 75 73 69  WAL mode. By usi
4590: 6e 67 20 74 68 65 20 77 72 61 70 70 65 72 2c 20  ng the wrapper, 
45a0: 77 65 20 61 72 65 20 61 62 6c 65 20 74 6f 20 67  we are able to g
45b0: 75 61 72 61 6e 74 65 65 0a 20 20 2a 2a 20 74 68  uarantee.  ** th
45c0: 61 74 20 74 68 65 20 22 6e 42 75 73 79 22 20 69  at the "nBusy" i
45d0: 6e 74 65 67 65 72 20 70 61 72 61 6d 65 74 65 72  nteger parameter
45e0: 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 75   passed to the u
45f0: 73 65 72 73 20 62 75 73 79 2d 68 61 6e 64 6c 65  sers busy-handle
4600: 72 0a 20 20 2a 2a 20 72 65 70 72 65 73 65 6e 74  r.  ** represent
4610: 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  s the total numb
4620: 65 72 20 6f 66 20 62 75 73 79 2d 68 61 6e 64 6c  er of busy-handl
4630: 65 72 20 69 6e 76 6f 63 61 74 69 6f 6e 73 20 6d  er invocations m
4640: 61 64 65 20 77 69 74 68 69 6e 0a 20 20 2a 2a 20  ade within.  ** 
4650: 74 68 69 73 20 63 61 6c 6c 20 74 6f 20 73 71 6c  this call to sql
4660: 69 74 65 33 64 65 6d 6f 5f 73 75 70 65 72 6c 6f  ite3demo_superlo
4670: 63 6b 28 29 2c 20 69 6e 63 6c 75 64 69 6e 67 20  ck(), including 
4680: 61 6e 79 20 6d 61 64 65 20 64 75 72 69 6e 67 20  any made during 
4690: 74 68 65 0a 20 20 2a 2a 20 22 42 45 47 49 4e 20  the.  ** "BEGIN 
46a0: 45 58 43 4c 55 53 49 56 45 22 2e 0a 20 20 2a 2f  EXCLUSIVE"..  */
46b0: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
46c0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 62 75 73 79  E_OK ){.    busy
46d0: 2e 78 42 75 73 79 20 3d 20 78 42 75 73 79 3b 0a  .xBusy = xBusy;.
46e0: 20 20 20 20 62 75 73 79 2e 70 42 75 73 79 41 72      busy.pBusyAr
46f0: 67 20 3d 20 70 42 75 73 79 41 72 67 3b 0a 20 20  g = pBusyArg;.  
4700: 20 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 68    sqlite3_busy_h
4710: 61 6e 64 6c 65 72 28 70 4c 6f 63 6b 2d 3e 64 62  andler(pLock->db
4720: 2c 20 73 75 70 65 72 6c 6f 63 6b 42 75 73 79 48  , superlockBusyH
4730: 61 6e 64 6c 65 72 2c 20 28 76 6f 69 64 20 2a 29  andler, (void *)
4740: 26 62 75 73 79 29 3b 0a 20 20 20 20 72 63 20 3d  &busy);.    rc =
4750: 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 4c   sqlite3_exec(pL
4760: 6f 63 6b 2d 3e 64 62 2c 20 22 42 45 47 49 4e 20  ock->db, "BEGIN 
4770: 45 58 43 4c 55 53 49 56 45 22 2c 20 30 2c 20 30  EXCLUSIVE", 0, 0
4780: 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  , 0);.  }..  /* 
4790: 49 66 20 74 68 65 20 42 45 47 49 4e 20 45 58 43  If the BEGIN EXC
47a0: 4c 55 53 49 56 45 20 77 61 73 20 65 78 65 63 75  LUSIVE was execu
47b0: 74 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ted successfully
47c0: 20 61 6e 64 20 74 68 69 73 20 69 73 20 61 20 57   and this is a W
47d0: 41 4c 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  AL.  ** database
47e0: 2c 20 63 61 6c 6c 20 73 75 70 65 72 6c 6f 63 6b  , call superlock
47f0: 57 61 6c 4c 6f 63 6b 28 29 20 74 6f 20 6f 62 74  WalLock() to obt
4800: 61 69 6e 20 74 68 65 20 65 78 74 72 61 20 6c 6f  ain the extra lo
4810: 63 6b 73 20 72 65 71 75 69 72 65 64 0a 20 20 2a  cks required.  *
4820: 2a 20 74 6f 20 70 72 65 76 65 6e 74 20 72 65 61  * to prevent rea
4830: 64 65 72 73 2c 20 77 72 69 74 65 72 73 20 61 6e  ders, writers an
4840: 64 2f 6f 72 20 63 68 65 63 6b 70 6f 69 6e 74 65  d/or checkpointe
4850: 72 73 20 66 72 6f 6d 20 61 63 63 65 73 73 69 6e  rs from accessin
4860: 67 20 74 68 65 0a 20 20 2a 2a 20 64 62 20 77 68  g the.  ** db wh
4870: 69 6c 65 20 74 68 69 73 20 70 72 6f 63 65 73 73  ile this process
4880: 20 69 73 20 68 6f 6c 64 69 6e 67 20 74 68 65 20   is holding the 
4890: 73 75 70 65 72 6c 6f 63 6b 2e 0a 20 20 2a 2a 0a  superlock..  **.
48a0: 20 20 2a 2a 20 42 65 66 6f 72 65 20 61 74 74 65    ** Before atte
48b0: 6d 70 74 69 6e 67 20 61 6e 79 20 57 41 4c 20 6c  mpting any WAL l
48c0: 6f 63 6b 73 2c 20 63 6f 6d 6d 69 74 20 74 68 65  ocks, commit the
48d0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 74 61   transaction sta
48e0: 72 74 65 64 20 61 62 6f 76 65 0a 20 20 2a 2a 20  rted above.  ** 
48f0: 74 6f 20 64 72 6f 70 20 74 68 65 20 57 41 4c 20  to drop the WAL 
4900: 72 65 61 64 20 61 6e 64 20 77 72 69 74 65 20 6c  read and write l
4910: 6f 63 6b 73 20 63 75 72 72 65 6e 74 6c 79 20 68  ocks currently h
4920: 65 6c 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  eld. Otherwise, 
4930: 74 68 65 0a 20 20 2a 2a 20 6e 65 77 20 57 41 4c  the.  ** new WAL
4940: 20 6c 6f 63 6b 73 20 6d 61 79 20 63 6f 6e 66 6c   locks may confl
4950: 69 63 74 20 77 69 74 68 20 74 68 65 20 6f 6c 64  ict with the old
4960: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d  ..  */.  if( rc=
4970: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
4980: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d    if( SQLITE_OK=
4990: 3d 28 72 63 20 3d 20 73 75 70 65 72 6c 6f 63 6b  =(rc = superlock
49a0: 49 73 57 61 6c 28 70 4c 6f 63 6b 29 29 20 26 26  IsWal(pLock)) &&
49b0: 20 70 4c 6f 63 6b 2d 3e 62 57 61 6c 20 29 7b 0a   pLock->bWal ){.
49c0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
49d0: 65 33 5f 65 78 65 63 28 70 4c 6f 63 6b 2d 3e 64  e3_exec(pLock->d
49e0: 62 2c 20 22 43 4f 4d 4d 49 54 22 2c 20 30 2c 20  b, "COMMIT", 0, 
49f0: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  0, 0);.      if(
4a00: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
4a10: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
4a20: 75 70 65 72 6c 6f 63 6b 57 61 6c 4c 6f 63 6b 28  uperlockWalLock(
4a30: 70 4c 6f 63 6b 2d 3e 64 62 2c 20 26 62 75 73 79  pLock->db, &busy
4a40: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
4a50: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d  .  }..  if( rc!=
4a60: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
4a70: 20 73 71 6c 69 74 65 33 64 65 6d 6f 5f 73 75 70   sqlite3demo_sup
4a80: 65 72 75 6e 6c 6f 63 6b 28 70 4c 6f 63 6b 29 3b  erunlock(pLock);
4a90: 0a 20 20 20 20 2a 70 70 4c 6f 63 6b 20 3d 20 30  .    *ppLock = 0
4aa0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a  ;.  }else{.    *
4ab0: 70 70 4c 6f 63 6b 20 3d 20 70 4c 6f 63 6b 3b 0a  ppLock = pLock;.
4ac0: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
4ad0: 3b 0a 7d 0a 0a 2f 2a 20 41 20 63 6f 72 72 75 70  ;.}../* A corrup
4ae0: 74 20 44 42 20 77 6f 6e 27 74 20 77 6f 72 6b 20  t DB won't work 
4af0: 77 69 74 68 20 74 68 65 20 73 71 6c 2d 62 61 73  with the sql-bas
4b00: 65 64 20 6c 6f 63 6b 69 6e 67 20 61 74 74 65 6d  ed locking attem
4b10: 70 74 2c 20 67 72 61 62 20 61 6e 20 0a 2a 2a 20  pt, grab an .** 
4b20: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 61  exclusive lock a
4b30: 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  nd return SQLITE
4b40: 5f 4f 4b 20 6f 72 20 53 51 4c 49 54 45 5f 42 55  _OK or SQLITE_BU
4b50: 53 59 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 66  SY if the lock f
4b60: 61 69 6c 73 20 0a 2a 2a 20 72 65 74 75 72 6e 73  ails .** returns
4b70: 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63   the current loc
4b80: 6b 20 6c 65 76 65 6c 20 68 65 6c 64 20 6f 6e 20  k level held on 
4b90: 73 71 6c 69 74 65 33 5f 66 69 6c 65 0a 2a 2f 0a  sqlite3_file.*/.
4ba0: 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74  static int sqlit
4bb0: 65 33 64 65 6d 6f 5f 73 75 70 65 72 6c 6f 63 6b  e3demo_superlock
4bc0: 5f 63 6f 72 72 75 70 74 28 0a 20 20 73 71 6c 69  _corrupt(.  sqli
4bd0: 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 0a 20 20  te3_file *id,.  
4be0: 69 6e 74 20 65 54 61 72 67 65 74 46 69 6c 65 4c  int eTargetFileL
4bf0: 6f 63 6b 2c 0a 20 20 69 6e 74 20 2a 70 46 69 6c  ock,.  int *pFil
4c00: 65 4c 6f 63 6b 0a 29 7b 0a 20 20 75 6e 69 78 46  eLock.){.  unixF
4c10: 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
4c20: 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e  ixFile*)id;.  in
4c30: 74 20 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 70 46  t eFileLock = pF
4c40: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3b 0a  ile->eFileLock;.
4c50: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
4c60: 45 5f 4f 4b 3b 0a 20 20 0a 20 20 69 66 28 20 65  E_OK;.  .  if( e
4c70: 46 69 6c 65 4c 6f 63 6b 3c 65 54 61 72 67 65 74  FileLock<eTarget
4c80: 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  FileLock ){.    
4c90: 72 63 20 3d 20 70 46 69 6c 65 2d 3e 70 4d 65 74  rc = pFile->pMet
4ca0: 68 6f 64 2d 3e 78 4c 6f 63 6b 28 69 64 2c 20 53  hod->xLock(id, S
4cb0: 51 4c 49 54 45 5f 4c 4f 43 4b 5f 53 48 41 52 45  QLITE_LOCK_SHARE
4cc0: 44 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 72  D);.  }.  if( !r
4cd0: 63 20 26 26 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  c && SQLITE_LOCK
4ce0: 5f 53 48 41 52 45 44 3c 65 54 61 72 67 65 74 46  _SHARED<eTargetF
4cf0: 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72  ileLock ){.    r
4d00: 63 20 3d 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68  c = pFile->pMeth
4d10: 6f 64 2d 3e 78 4c 6f 63 6b 28 69 64 2c 20 53 51  od->xLock(id, SQ
4d20: 4c 49 54 45 5f 4c 4f 43 4b 5f 45 58 43 4c 55 53  LITE_LOCK_EXCLUS
4d30: 49 56 45 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  IVE);.  }.  if( 
4d40: 72 63 20 29 7b 0a 20 20 20 20 69 66 28 20 70 46  rc ){.    if( pF
4d50: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3e  ile->eFileLock >
4d60: 20 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20   eFileLock ){.  
4d70: 20 20 20 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68      pFile->pMeth
4d80: 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28 69 64 2c 20  od->xUnlock(id, 
4d90: 65 46 69 6c 65 4c 6f 63 6b 29 3b 0a 20 20 20 20  eFileLock);.    
4da0: 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  }.    return rc;
4db0: 0a 20 20 7d 0a 20 20 69 66 20 28 70 46 69 6c 65  .  }.  if (pFile
4dc0: 4c 6f 63 6b 29 20 7b 0a 20 20 20 20 2a 70 46 69  Lock) {.    *pFi
4dd0: 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f  leLock = eFileLo
4de0: 63 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ck;.  }.  return
4df0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 73   SQLITE_OK;.}..s
4e00: 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65  tatic int sqlite
4e10: 33 64 65 6d 6f 5f 73 75 70 65 72 75 6e 6c 6f 63  3demo_superunloc
4e20: 6b 5f 63 6f 72 72 75 70 74 28 73 71 6c 69 74 65  k_corrupt(sqlite
4e30: 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
4e40: 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75  eFileLock) {.  u
4e50: 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
4e60: 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
4e70: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
4e80: 45 5f 4f 4b 3b 0a 20 20 0a 20 20 69 66 28 20 70  E_OK;.  .  if( p
4e90: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
4ea0: 3e 20 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20  > eFileLock ){. 
4eb0: 20 20 20 72 63 20 3d 20 70 46 69 6c 65 2d 3e 70     rc = pFile->p
4ec0: 4d 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28  Method->xUnlock(
4ed0: 69 64 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f  id, SQLITE_LOCK_
4ee0: 53 48 41 52 45 44 29 3b 0a 20 20 7d 0a 20 20 69  SHARED);.  }.  i
4ef0: 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  f( pFile->eFileL
4f00: 6f 63 6b 20 3e 20 65 46 69 6c 65 4c 6f 63 6b 20  ock > eFileLock 
4f10: 29 7b 0a 20 20 20 20 69 6e 74 20 75 6e 6c 6f 63  ){.    int unloc
4f20: 6b 52 43 20 3d 20 70 46 69 6c 65 2d 3e 70 4d 65  kRC = pFile->pMe
4f30: 74 68 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28 69 64  thod->xUnlock(id
4f40: 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 4e 4f  , SQLITE_LOCK_NO
4f50: 4e 45 29 3b 0a 20 20 20 20 69 66 20 28 21 72 63  NE);.    if (!rc
4f60: 29 20 72 63 20 3d 20 75 6e 6c 6f 63 6b 52 43 3b  ) rc = unlockRC;
4f70: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
4f80: 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53  ;.}..#endif /* S
4f90: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 55 50  QLITE_ENABLE_SUP
4fa0: 45 52 4c 4f 43 4b 20 2a 2f 0a 0a 0a 2f 2a 0a 2a  ERLOCK */.../*.*
4fb0: 2a 20 48 41 56 45 5f 4d 52 45 4d 41 50 20 64 65  * HAVE_MREMAP de
4fc0: 66 61 75 6c 74 73 20 74 6f 20 74 72 75 65 20 6f  faults to true o
4fd0: 6e 20 4c 69 6e 75 78 20 61 6e 64 20 66 61 6c 73  n Linux and fals
4fe0: 65 20 65 76 65 72 79 77 68 65 72 65 20 65 6c 73  e everywhere els
4ff0: 65 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e  e..*/.#if !defin
5000: 65 64 28 48 41 56 45 5f 4d 52 45 4d 41 50 29 0a  ed(HAVE_MREMAP).
5010: 23 20 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 6c  # if defined(__l
5020: 69 6e 75 78 5f 5f 29 20 26 26 20 64 65 66 69 6e  inux__) && defin
5030: 65 64 28 5f 47 4e 55 5f 53 4f 55 52 43 45 29 0a  ed(_GNU_SOURCE).
5040: 23 20 20 64 65 66 69 6e 65 20 48 41 56 45 5f 4d  #  define HAVE_M
5050: 52 45 4d 41 50 20 31 0a 23 20 65 6c 73 65 0a 23  REMAP 1.# else.#
5060: 20 20 64 65 66 69 6e 65 20 48 41 56 45 5f 4d 52    define HAVE_MR
5070: 45 4d 41 50 20 30 0a 23 20 65 6e 64 69 66 0a 23  EMAP 0.# endif.#
5080: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 69 66  endif../*.** Dif
5090: 66 65 72 65 6e 74 20 55 6e 69 78 20 73 79 73 74  ferent Unix syst
50a0: 65 6d 73 20 64 65 63 6c 61 72 65 20 6f 70 65 6e  ems declare open
50b0: 28 29 20 69 6e 20 64 69 66 66 65 72 65 6e 74 20  () in different 
50c0: 77 61 79 73 2e 20 20 53 61 6d 65 20 75 73 65 0a  ways.  Same use.
50d0: 2a 2a 20 6f 70 65 6e 28 63 6f 6e 73 74 20 63 68  ** open(const ch
50e0: 61 72 2a 2c 69 6e 74 2c 6d 6f 64 65 5f 74 29 2e  ar*,int,mode_t).
50f0: 20 20 4f 74 68 65 72 73 20 75 73 65 20 6f 70 65    Others use ope
5100: 6e 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e  n(const char*,in
5110: 74 2c 2e 2e 2e 29 2e 0a 2a 2a 20 54 68 65 20 64  t,...)..** The d
5120: 69 66 66 65 72 65 6e 63 65 20 69 73 20 69 6d 70  ifference is imp
5130: 6f 72 74 61 6e 74 20 77 68 65 6e 20 75 73 69 6e  ortant when usin
5140: 67 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  g a pointer to t
5150: 68 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a  he function..**.
5160: 2a 2a 20 54 68 65 20 73 61 66 65 73 74 20 77 61  ** The safest wa
5170: 79 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 74  y to deal with t
5180: 68 65 20 70 72 6f 62 6c 65 6d 20 69 73 20 74 6f  he problem is to
5190: 20 61 6c 77 61 79 73 20 75 73 65 20 74 68 69 73   always use this
51a0: 20 77 72 61 70 70 65 72 0a 2a 2a 20 77 68 69 63   wrapper.** whic
51b0: 68 20 61 6c 77 61 79 73 20 68 61 73 20 74 68 65  h always has the
51c0: 20 73 61 6d 65 20 77 65 6c 6c 2d 64 65 66 69 6e   same well-defin
51d0: 65 64 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f  ed interface..*/
51e0: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 6f 73 69  .static int posi
51f0: 78 4f 70 65 6e 28 63 6f 6e 73 74 20 63 68 61 72  xOpen(const char
5200: 20 2a 7a 46 69 6c 65 2c 20 69 6e 74 20 66 6c 61   *zFile, int fla
5210: 67 73 2c 20 69 6e 74 20 6d 6f 64 65 29 7b 0a 20  gs, int mode){. 
5220: 20 72 65 74 75 72 6e 20 6f 70 65 6e 28 7a 46 69   return open(zFi
5230: 6c 65 2c 20 66 6c 61 67 73 2c 20 6d 6f 64 65 29  le, flags, mode)
5240: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 6e 20 73 6f  ;.}../*.** On so
5250: 6d 65 20 73 79 73 74 65 6d 73 2c 20 63 61 6c 6c  me systems, call
5260: 73 20 74 6f 20 66 63 68 6f 77 6e 28 29 20 77 69  s to fchown() wi
5270: 6c 6c 20 74 72 69 67 67 65 72 20 61 20 6d 65 73  ll trigger a mes
5280: 73 61 67 65 20 69 6e 20 61 20 73 65 63 75 72 69  sage in a securi
5290: 74 79 0a 2a 2a 20 6c 6f 67 20 69 66 20 74 68 65  ty.** log if the
52a0: 79 20 63 6f 6d 65 20 66 72 6f 6d 20 6e 6f 6e 2d  y come from non-
52b0: 72 6f 6f 74 20 70 72 6f 63 65 73 73 65 73 2e 20  root processes. 
52c0: 20 53 6f 20 61 76 6f 69 64 20 63 61 6c 6c 69 6e   So avoid callin
52d0: 67 20 66 63 68 6f 77 6e 28 29 20 69 66 0a 2a 2a  g fchown() if.**
52e0: 20 77 65 20 61 72 65 20 6e 6f 74 20 72 75 6e 6e   we are not runn
52f0: 69 6e 67 20 61 73 20 72 6f 6f 74 2e 0a 2a 2f 0a  ing as root..*/.
5300: 73 74 61 74 69 63 20 69 6e 74 20 70 6f 73 69 78  static int posix
5310: 46 63 68 6f 77 6e 28 69 6e 74 20 66 64 2c 20 75  Fchown(int fd, u
5320: 69 64 5f 74 20 75 69 64 2c 20 67 69 64 5f 74 20  id_t uid, gid_t 
5330: 67 69 64 29 7b 0a 23 69 66 20 4f 53 5f 56 58 57  gid){.#if OS_VXW
5340: 4f 52 4b 53 0a 20 20 72 65 74 75 72 6e 20 30 3b  ORKS.  return 0;
5350: 0a 23 65 6c 73 65 0a 20 20 72 65 74 75 72 6e 20  .#else.  return 
5360: 67 65 74 65 75 69 64 28 29 20 3f 20 30 20 3a 20  geteuid() ? 0 : 
5370: 66 63 68 6f 77 6e 28 66 64 2c 75 69 64 2c 67 69  fchown(fd,uid,gi
5380: 64 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a  d);.#endif.}../*
5390: 20 46 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e   Forward referen
53a0: 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ce */.static int
53b0: 20 6f 70 65 6e 44 69 72 65 63 74 6f 72 79 28 63   openDirectory(c
53c0: 6f 6e 73 74 20 63 68 61 72 2a 2c 20 69 6e 74 2a  onst char*, int*
53d0: 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  );.static int un
53e0: 69 78 47 65 74 70 61 67 65 73 69 7a 65 28 76 6f  ixGetpagesize(vo
53f0: 69 64 29 3b 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6e 79  id);../*.** Many
5400: 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 61 72   system calls ar
5410: 65 20 61 63 63 65 73 73 65 64 20 74 68 72 6f 75  e accessed throu
5420: 67 68 20 70 6f 69 6e 74 65 72 2d 74 6f 2d 66 75  gh pointer-to-fu
5430: 6e 63 74 69 6f 6e 73 20 73 6f 20 74 68 61 74 0a  nctions so that.
5440: 2a 2a 20 74 68 65 79 20 6d 61 79 20 62 65 20 6f  ** they may be o
5450: 76 65 72 72 69 64 64 65 6e 20 61 74 20 72 75 6e  verridden at run
5460: 74 69 6d 65 20 74 6f 20 66 61 63 69 6c 69 74 61  time to facilita
5470: 74 65 20 66 61 75 6c 74 20 69 6e 6a 65 63 74 69  te fault injecti
5480: 6f 6e 20 64 75 72 69 6e 67 0a 2a 2a 20 74 65 73  on during.** tes
5490: 74 69 6e 67 20 61 6e 64 20 73 61 6e 64 62 6f 78  ting and sandbox
54a0: 69 6e 67 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  ing.  The follow
54b0: 69 6e 67 20 61 72 72 61 79 20 68 6f 6c 64 73 20  ing array holds 
54c0: 74 68 65 20 6e 61 6d 65 73 20 61 6e 64 20 70 6f  the names and po
54d0: 69 6e 74 65 72 73 0a 2a 2a 20 74 6f 20 61 6c 6c  inters.** to all
54e0: 20 6f 76 65 72 72 69 64 65 61 62 6c 65 20 73 79   overrideable sy
54f0: 73 74 65 6d 20 63 61 6c 6c 73 2e 0a 2a 2f 0a 73  stem calls..*/.s
5500: 74 61 74 69 63 20 73 74 72 75 63 74 20 75 6e 69  tatic struct uni
5510: 78 5f 73 79 73 63 61 6c 6c 20 7b 0a 20 20 63 6f  x_syscall {.  co
5520: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  nst char *zName;
5530: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
5540: 61 6d 65 20 6f 66 20 74 68 65 20 73 79 73 74 65  ame of the syste
5550: 6d 20 63 61 6c 6c 20 2a 2f 0a 20 20 73 71 6c 69  m call */.  sqli
5560: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20  te3_syscall_ptr 
5570: 70 43 75 72 72 65 6e 74 3b 20 2f 2a 20 43 75 72  pCurrent; /* Cur
5580: 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 74 68  rent value of th
5590: 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 2a 2f  e system call */
55a0: 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61  .  sqlite3_sysca
55b0: 6c 6c 5f 70 74 72 20 70 44 65 66 61 75 6c 74 3b  ll_ptr pDefault;
55c0: 20 2f 2a 20 44 65 66 61 75 6c 74 20 76 61 6c 75   /* Default valu
55d0: 65 20 2a 2f 0a 7d 20 61 53 79 73 63 61 6c 6c 5b  e */.} aSyscall[
55e0: 5d 20 3d 20 7b 0a 20 20 7b 20 22 6f 70 65 6e 22  ] = {.  { "open"
55f0: 2c 20 20 20 20 20 20 20 20 20 28 73 71 6c 69 74  ,         (sqlit
5600: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 70  e3_syscall_ptr)p
5610: 6f 73 69 78 4f 70 65 6e 2c 20 20 30 20 20 7d 2c  osixOpen,  0  },
5620: 0a 23 64 65 66 69 6e 65 20 6f 73 4f 70 65 6e 20  .#define osOpen 
5630: 20 20 20 20 20 28 28 69 6e 74 28 2a 29 28 63 6f       ((int(*)(co
5640: 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74 2c 69 6e  nst char*,int,in
5650: 74 29 29 61 53 79 73 63 61 6c 6c 5b 30 5d 2e 70  t))aSyscall[0].p
5660: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 63  Current)..  { "c
5670: 6c 6f 73 65 22 2c 20 20 20 20 20 20 20 20 28 73  lose",        (s
5680: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
5690: 74 72 29 63 6c 6f 73 65 2c 20 20 20 20 20 20 30  tr)close,      0
56a0: 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 43    },.#define osC
56b0: 6c 6f 73 65 20 20 20 20 20 28 28 69 6e 74 28 2a  lose     ((int(*
56c0: 29 28 69 6e 74 29 29 61 53 79 73 63 61 6c 6c 5b  )(int))aSyscall[
56d0: 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  1].pCurrent)..  
56e0: 7b 20 22 61 63 63 65 73 73 22 2c 20 20 20 20 20  { "access",     
56f0: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
5700: 6c 6c 5f 70 74 72 29 61 63 63 65 73 73 2c 20 20  ll_ptr)access,  
5710: 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65     0  },.#define
5720: 20 6f 73 41 63 63 65 73 73 20 20 20 20 28 28 69   osAccess    ((i
5730: 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72  nt(*)(const char
5740: 2a 2c 69 6e 74 29 29 61 53 79 73 63 61 6c 6c 5b  *,int))aSyscall[
5750: 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  2].pCurrent)..  
5760: 7b 20 22 67 65 74 63 77 64 22 2c 20 20 20 20 20  { "getcwd",     
5770: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
5780: 6c 6c 5f 70 74 72 29 67 65 74 63 77 64 2c 20 20  ll_ptr)getcwd,  
5790: 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65     0  },.#define
57a0: 20 6f 73 47 65 74 63 77 64 20 20 20 20 28 28 63   osGetcwd    ((c
57b0: 68 61 72 2a 28 2a 29 28 63 68 61 72 2a 2c 73 69  har*(*)(char*,si
57c0: 7a 65 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 33  ze_t))aSyscall[3
57d0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
57e0: 20 22 73 74 61 74 22 2c 20 20 20 20 20 20 20 20   "stat",        
57f0: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
5800: 6c 5f 70 74 72 29 73 74 61 74 2c 20 20 20 20 20  l_ptr)stat,     
5810: 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20    0  },.#define 
5820: 6f 73 53 74 61 74 20 20 20 20 20 20 28 28 69 6e  osStat      ((in
5830: 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a  t(*)(const char*
5840: 2c 73 74 72 75 63 74 20 73 74 61 74 2a 29 29 61  ,struct stat*))a
5850: 53 79 73 63 61 6c 6c 5b 34 5d 2e 70 43 75 72 72  Syscall[4].pCurr
5860: 65 6e 74 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ent)../*.** The 
5870: 44 4a 47 50 50 20 63 6f 6d 70 69 6c 65 72 20 65  DJGPP compiler e
5880: 6e 76 69 72 6f 6e 6d 65 6e 74 20 6c 6f 6f 6b 73  nvironment looks
5890: 20 6d 6f 73 74 6c 79 20 6c 69 6b 65 20 55 6e 69   mostly like Uni
58a0: 78 2c 20 62 75 74 20 69 74 0a 2a 2a 20 6c 61 63  x, but it.** lac
58b0: 6b 73 20 74 68 65 20 66 63 6e 74 6c 28 29 20 73  ks the fcntl() s
58c0: 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20 53 6f 20  ystem call.  So 
58d0: 72 65 64 65 66 69 6e 65 20 66 63 6e 74 6c 28 29  redefine fcntl()
58e0: 20 74 6f 20 62 65 20 73 6f 6d 65 74 68 69 6e 67   to be something
58f0: 0a 2a 2a 20 74 68 61 74 20 61 6c 77 61 79 73 20  .** that always 
5900: 73 75 63 63 65 65 64 73 2e 20 20 54 68 69 73 20  succeeds.  This 
5910: 6d 65 61 6e 73 20 74 68 61 74 20 6c 6f 63 6b 69  means that locki
5920: 6e 67 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75  ng does not occu
5930: 72 20 75 6e 64 65 72 0a 2a 2a 20 44 4a 47 50 50  r under.** DJGPP
5940: 2e 20 20 42 75 74 20 69 74 20 69 73 20 44 4f 53  .  But it is DOS
5950: 20 2d 20 77 68 61 74 20 64 69 64 20 79 6f 75 20   - what did you 
5960: 65 78 70 65 63 74 3f 0a 2a 2f 0a 23 69 66 64 65  expect?.*/.#ifde
5970: 66 20 5f 5f 44 4a 47 50 50 5f 5f 0a 20 20 7b 20  f __DJGPP__.  { 
5980: 22 66 73 74 61 74 22 2c 20 20 20 20 20 20 20 20  "fstat",        
5990: 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0,              
59a0: 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65     0  },.#define
59b0: 20 6f 73 46 73 74 61 74 28 61 2c 62 2c 63 29 20   osFstat(a,b,c) 
59c0: 20 20 20 30 0a 23 65 6c 73 65 20 20 20 20 20 0a     0.#else     .
59d0: 20 20 7b 20 22 66 73 74 61 74 22 2c 20 20 20 20    { "fstat",    
59e0: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
59f0: 63 61 6c 6c 5f 70 74 72 29 66 73 74 61 74 2c 20  call_ptr)fstat, 
5a00: 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69       0  },.#defi
5a10: 6e 65 20 6f 73 46 73 74 61 74 20 20 20 20 20 28  ne osFstat     (
5a20: 28 69 6e 74 28 2a 29 28 69 6e 74 2c 73 74 72 75  (int(*)(int,stru
5a30: 63 74 20 73 74 61 74 2a 29 29 61 53 79 73 63 61  ct stat*))aSysca
5a40: 6c 6c 5b 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a  ll[5].pCurrent).
5a50: 23 65 6e 64 69 66 0a 0a 20 20 7b 20 22 66 74 72  #endif..  { "ftr
5a60: 75 6e 63 61 74 65 22 2c 20 20 20 20 28 73 71 6c  uncate",    (sql
5a70: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
5a80: 29 66 74 72 75 6e 63 61 74 65 2c 20 20 30 20 20  )ftruncate,  0  
5a90: 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 46 74 72  },.#define osFtr
5aa0: 75 6e 63 61 74 65 20 28 28 69 6e 74 28 2a 29 28  uncate ((int(*)(
5ab0: 69 6e 74 2c 6f 66 66 5f 74 29 29 61 53 79 73 63  int,off_t))aSysc
5ac0: 61 6c 6c 5b 36 5d 2e 70 43 75 72 72 65 6e 74 29  all[6].pCurrent)
5ad0: 0a 0a 20 20 7b 20 22 66 63 6e 74 6c 22 2c 20 20  ..  { "fcntl",  
5ae0: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73        (sqlite3_s
5af0: 79 73 63 61 6c 6c 5f 70 74 72 29 66 63 6e 74 6c  yscall_ptr)fcntl
5b00: 2c 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65  ,      0  },.#de
5b10: 66 69 6e 65 20 6f 73 46 63 6e 74 6c 20 20 20 20  fine osFcntl    
5b20: 20 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c 69 6e   ((int(*)(int,in
5b30: 74 2c 2e 2e 2e 29 29 61 53 79 73 63 61 6c 6c 5b  t,...))aSyscall[
5b40: 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20  7].pCurrent)..  
5b50: 7b 20 22 72 65 61 64 22 2c 20 20 20 20 20 20 20  { "read",       
5b60: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
5b70: 6c 6c 5f 70 74 72 29 72 65 61 64 2c 20 20 20 20  ll_ptr)read,    
5b80: 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65     0  },.#define
5b90: 20 6f 73 52 65 61 64 20 20 20 20 20 20 28 28 73   osRead      ((s
5ba0: 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 76 6f  size_t(*)(int,vo
5bb0: 69 64 2a 2c 73 69 7a 65 5f 74 29 29 61 53 79 73  id*,size_t))aSys
5bc0: 63 61 6c 6c 5b 38 5d 2e 70 43 75 72 72 65 6e 74  call[8].pCurrent
5bd0: 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 55  )..#if defined(U
5be0: 53 45 5f 50 52 45 41 44 29 20 7c 7c 20 28 53 51  SE_PREAD) || (SQ
5bf0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
5c00: 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 21 4f 53  ING_STYLE && !OS
5c10: 5f 56 58 57 4f 52 4b 53 29 0a 20 20 7b 20 22 70  _VXWORKS).  { "p
5c20: 72 65 61 64 22 2c 20 20 20 20 20 20 20 20 28 73  read",        (s
5c30: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
5c40: 74 72 29 70 72 65 61 64 2c 20 20 20 20 20 20 30  tr)pread,      0
5c50: 20 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22    },.#else.  { "
5c60: 70 72 65 61 64 22 2c 20 20 20 20 20 20 20 20 28  pread",        (
5c70: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
5c80: 70 74 72 29 30 2c 20 20 20 20 20 20 20 20 20 20  ptr)0,          
5c90: 30 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65  0  },.#endif.#de
5ca0: 66 69 6e 65 20 6f 73 50 72 65 61 64 20 20 20 20  fine osPread    
5cb0: 20 28 28 73 73 69 7a 65 5f 74 28 2a 29 28 69 6e   ((ssize_t(*)(in
5cc0: 74 2c 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c 6f  t,void*,size_t,o
5cd0: 66 66 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 39  ff_t))aSyscall[9
5ce0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
5cf0: 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45   defined(USE_PRE
5d00: 41 44 36 34 29 0a 20 20 7b 20 22 70 72 65 61 64  AD64).  { "pread
5d10: 36 34 22 2c 20 20 20 20 20 20 28 73 71 6c 69 74  64",      (sqlit
5d20: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 70  e3_syscall_ptr)p
5d30: 72 65 61 64 36 34 2c 20 20 20 20 30 20 20 7d 2c  read64,    0  },
5d40: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 70 72 65 61  .#else.  { "prea
5d50: 64 36 34 22 2c 20 20 20 20 20 20 28 73 71 6c 69  d64",      (sqli
5d60: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
5d70: 30 2c 20 20 20 20 20 20 20 20 20 20 30 20 20 7d  0,          0  }
5d80: 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65  ,.#endif.#define
5d90: 20 6f 73 50 72 65 61 64 36 34 20 20 20 28 28 73   osPread64   ((s
5da0: 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 76 6f  size_t(*)(int,vo
5db0: 69 64 2a 2c 73 69 7a 65 5f 74 2c 6f 66 66 5f 74  id*,size_t,off_t
5dc0: 29 29 61 53 79 73 63 61 6c 6c 5b 31 30 5d 2e 70  ))aSyscall[10].p
5dd0: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 77  Current)..  { "w
5de0: 72 69 74 65 22 2c 20 20 20 20 20 20 20 20 28 73  rite",        (s
5df0: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
5e00: 74 72 29 77 72 69 74 65 2c 20 20 20 20 20 20 30  tr)write,      0
5e10: 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 57    },.#define osW
5e20: 72 69 74 65 20 20 20 20 20 28 28 73 73 69 7a 65  rite     ((ssize
5e30: 5f 74 28 2a 29 28 69 6e 74 2c 63 6f 6e 73 74 20  _t(*)(int,const 
5e40: 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 29 29 61 53  void*,size_t))aS
5e50: 79 73 63 61 6c 6c 5b 31 31 5d 2e 70 43 75 72 72  yscall[11].pCurr
5e60: 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65  ent)..#if define
5e70: 64 28 55 53 45 5f 50 52 45 41 44 29 20 7c 7c 20  d(USE_PREAD) || 
5e80: 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c  (SQLITE_ENABLE_L
5e90: 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20  OCKING_STYLE && 
5ea0: 21 4f 53 5f 56 58 57 4f 52 4b 53 29 0a 20 20 7b  !OS_VXWORKS).  {
5eb0: 20 22 70 77 72 69 74 65 22 2c 20 20 20 20 20 20   "pwrite",      
5ec0: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
5ed0: 6c 5f 70 74 72 29 70 77 72 69 74 65 2c 20 20 20  l_ptr)pwrite,   
5ee0: 20 20 30 20 20 7d 2c 0a 23 65 6c 73 65 0a 20 20    0  },.#else.  
5ef0: 7b 20 22 70 77 72 69 74 65 22 2c 20 20 20 20 20  { "pwrite",     
5f00: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
5f10: 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20  ll_ptr)0,       
5f20: 20 20 20 30 20 20 7d 2c 0a 23 65 6e 64 69 66 0a     0  },.#endif.
5f30: 23 64 65 66 69 6e 65 20 6f 73 50 77 72 69 74 65  #define osPwrite
5f40: 20 20 20 20 28 28 73 73 69 7a 65 5f 74 28 2a 29      ((ssize_t(*)
5f50: 28 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a  (int,const void*
5f60: 2c 73 69 7a 65 5f 74 2c 6f 66 66 5f 74 29 29 5c  ,size_t,off_t))\
5f70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
5f80: 20 20 20 20 20 61 53 79 73 63 61 6c 6c 5b 31 32       aSyscall[12
5f90: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
5fa0: 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45   defined(USE_PRE
5fb0: 41 44 36 34 29 0a 20 20 7b 20 22 70 77 72 69 74  AD64).  { "pwrit
5fc0: 65 36 34 22 2c 20 20 20 20 20 28 73 71 6c 69 74  e64",     (sqlit
5fd0: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 70  e3_syscall_ptr)p
5fe0: 77 72 69 74 65 36 34 2c 20 20 20 30 20 20 7d 2c  write64,   0  },
5ff0: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 70 77 72 69  .#else.  { "pwri
6000: 74 65 36 34 22 2c 20 20 20 20 20 28 73 71 6c 69  te64",     (sqli
6010: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
6020: 30 2c 20 20 20 20 20 20 20 20 20 20 30 20 20 7d  0,          0  }
6030: 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65  ,.#endif.#define
6040: 20 6f 73 50 77 72 69 74 65 36 34 20 20 28 28 73   osPwrite64  ((s
6050: 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 63 6f  size_t(*)(int,co
6060: 6e 73 74 20 76 6f 69 64 2a 2c 73 69 7a 65 5f 74  nst void*,size_t
6070: 2c 6f 66 66 5f 74 29 29 5c 0a 20 20 20 20 20 20  ,off_t))\.      
6080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 53                aS
6090: 79 73 63 61 6c 6c 5b 31 33 5d 2e 70 43 75 72 72  yscall[13].pCurr
60a0: 65 6e 74 29 0a 0a 20 20 7b 20 22 66 63 68 6d 6f  ent)..  { "fchmo
60b0: 64 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74  d",       (sqlit
60c0: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 66  e3_syscall_ptr)f
60d0: 63 68 6d 6f 64 2c 20 20 20 20 20 30 20 20 7d 2c  chmod,     0  },
60e0: 0a 23 64 65 66 69 6e 65 20 6f 73 46 63 68 6d 6f  .#define osFchmo
60f0: 64 20 20 20 20 28 28 69 6e 74 28 2a 29 28 69 6e  d    ((int(*)(in
6100: 74 2c 6d 6f 64 65 5f 74 29 29 61 53 79 73 63 61  t,mode_t))aSysca
6110: 6c 6c 5b 31 34 5d 2e 70 43 75 72 72 65 6e 74 29  ll[14].pCurrent)
6120: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 48 41  ..#if defined(HA
6130: 56 45 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f 43 41  VE_POSIX_FALLOCA
6140: 54 45 29 20 26 26 20 48 41 56 45 5f 50 4f 53 49  TE) && HAVE_POSI
6150: 58 5f 46 41 4c 4c 4f 43 41 54 45 0a 20 20 7b 20  X_FALLOCATE.  { 
6160: 22 66 61 6c 6c 6f 63 61 74 65 22 2c 20 20 20 20  "fallocate",    
6170: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
6180: 5f 70 74 72 29 70 6f 73 69 78 5f 66 61 6c 6c 6f  _ptr)posix_fallo
6190: 63 61 74 65 2c 20 20 30 20 7d 2c 0a 23 65 6c 73  cate,  0 },.#els
61a0: 65 0a 20 20 7b 20 22 66 61 6c 6c 6f 63 61 74 65  e.  { "fallocate
61b0: 22 2c 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73  ",    (sqlite3_s
61c0: 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20  yscall_ptr)0,   
61d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
61e0: 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65  ,.#endif.#define
61f0: 20 6f 73 46 61 6c 6c 6f 63 61 74 65 20 28 28 69   osFallocate ((i
6200: 6e 74 28 2a 29 28 69 6e 74 2c 6f 66 66 5f 74 2c  nt(*)(int,off_t,
6210: 6f 66 66 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b  off_t))aSyscall[
6220: 31 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  15].pCurrent).. 
6230: 20 7b 20 22 75 6e 6c 69 6e 6b 22 2c 20 20 20 20   { "unlink",    
6240: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
6250: 61 6c 6c 5f 70 74 72 29 75 6e 6c 69 6e 6b 2c 20  all_ptr)unlink, 
6260: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
6270: 64 65 66 69 6e 65 20 6f 73 55 6e 6c 69 6e 6b 20  define osUnlink 
6280: 20 20 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73     ((int(*)(cons
6290: 74 20 63 68 61 72 2a 29 29 61 53 79 73 63 61 6c  t char*))aSyscal
62a0: 6c 5b 31 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[16].pCurrent).
62b0: 0a 20 20 7b 20 22 6f 70 65 6e 44 69 72 65 63 74  .  { "openDirect
62c0: 6f 72 79 22 2c 20 20 20 20 28 73 71 6c 69 74 65  ory",    (sqlite
62d0: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 6f 70  3_syscall_ptr)op
62e0: 65 6e 44 69 72 65 63 74 6f 72 79 2c 20 20 20 20  enDirectory,    
62f0: 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f    0 },.#define o
6300: 73 4f 70 65 6e 44 69 72 65 63 74 6f 72 79 20 28  sOpenDirectory (
6310: 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68  (int(*)(const ch
6320: 61 72 2a 2c 69 6e 74 2a 29 29 61 53 79 73 63 61  ar*,int*))aSysca
6330: 6c 6c 5b 31 37 5d 2e 70 43 75 72 72 65 6e 74 29  ll[17].pCurrent)
6340: 0a 0a 20 20 7b 20 22 6d 6b 64 69 72 22 2c 20 20  ..  { "mkdir",  
6350: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73        (sqlite3_s
6360: 79 73 63 61 6c 6c 5f 70 74 72 29 6d 6b 64 69 72  yscall_ptr)mkdir
6370: 2c 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c  ,           0 },
6380: 0a 23 64 65 66 69 6e 65 20 6f 73 4d 6b 64 69 72  .#define osMkdir
6390: 20 20 20 20 20 28 28 69 6e 74 28 2a 29 28 63 6f       ((int(*)(co
63a0: 6e 73 74 20 63 68 61 72 2a 2c 6d 6f 64 65 5f 74  nst char*,mode_t
63b0: 29 29 61 53 79 73 63 61 6c 6c 5b 31 38 5d 2e 70  ))aSyscall[18].p
63c0: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 72  Current)..  { "r
63d0: 6d 64 69 72 22 2c 20 20 20 20 20 20 20 20 28 73  mdir",        (s
63e0: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
63f0: 74 72 29 72 6d 64 69 72 2c 20 20 20 20 20 20 20  tr)rmdir,       
6400: 20 20 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65      0 },.#define
6410: 20 6f 73 52 6d 64 69 72 20 20 20 20 20 28 28 69   osRmdir     ((i
6420: 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72  nt(*)(const char
6430: 2a 29 29 61 53 79 73 63 61 6c 6c 5b 31 39 5d 2e  *))aSyscall[19].
6440: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
6450: 66 63 68 6f 77 6e 22 2c 20 20 20 20 20 20 20 28  fchown",       (
6460: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
6470: 70 74 72 29 70 6f 73 69 78 46 63 68 6f 77 6e 2c  ptr)posixFchown,
6480: 20 20 20 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e       0 },.#defin
6490: 65 20 6f 73 46 63 68 6f 77 6e 20 20 20 20 28 28  e osFchown    ((
64a0: 69 6e 74 28 2a 29 28 69 6e 74 2c 75 69 64 5f 74  int(*)(int,uid_t
64b0: 2c 67 69 64 5f 74 29 29 61 53 79 73 63 61 6c 6c  ,gid_t))aSyscall
64c0: 5b 32 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [20].pCurrent)..
64d0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
64e0: 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 20 7c 7c  ITE_OMIT_WAL) ||
64f0: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
6500: 5f 53 49 5a 45 3e 30 0a 20 20 7b 20 22 6d 6d 61  _SIZE>0.  { "mma
6510: 70 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74  p",       (sqlit
6520: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 6d  e3_syscall_ptr)m
6530: 6d 61 70 2c 20 20 20 20 20 30 20 7d 2c 0a 23 64  map,     0 },.#d
6540: 65 66 69 6e 65 20 6f 73 4d 6d 61 70 20 28 28 76  efine osMmap ((v
6550: 6f 69 64 2a 28 2a 29 28 76 6f 69 64 2a 2c 73 69  oid*(*)(void*,si
6560: 7a 65 5f 74 2c 69 6e 74 2c 69 6e 74 2c 69 6e 74  ze_t,int,int,int
6570: 2c 6f 66 66 5f 74 29 29 61 53 79 73 63 61 6c 6c  ,off_t))aSyscall
6580: 5b 32 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [21].pCurrent)..
6590: 20 20 7b 20 22 6d 75 6e 6d 61 70 22 2c 20 20 20    { "munmap",   
65a0: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
65b0: 63 61 6c 6c 5f 70 74 72 29 6d 75 6e 6d 61 70 2c  call_ptr)munmap,
65c0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
65d0: 64 65 66 69 6e 65 20 6f 73 4d 75 6e 6d 61 70 20  define osMunmap 
65e0: 28 28 76 6f 69 64 2a 28 2a 29 28 76 6f 69 64 2a  ((void*(*)(void*
65f0: 2c 73 69 7a 65 5f 74 29 29 61 53 79 73 63 61 6c  ,size_t))aSyscal
6600: 6c 5b 32 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[22].pCurrent).
6610: 0a 23 69 66 20 48 41 56 45 5f 4d 52 45 4d 41 50  .#if HAVE_MREMAP
6620: 0a 20 20 7b 20 22 6d 72 65 6d 61 70 22 2c 20 20  .  { "mremap",  
6630: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
6640: 73 63 61 6c 6c 5f 70 74 72 29 6d 72 65 6d 61 70  scall_ptr)mremap
6650: 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a  ,          0 },.
6660: 23 65 6c 73 65 0a 20 20 7b 20 22 6d 72 65 6d 61  #else.  { "mrema
6670: 70 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74  p",       (sqlit
6680: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 30  e3_syscall_ptr)0
6690: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
66a0: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66  0 },.#endif.#def
66b0: 69 6e 65 20 6f 73 4d 72 65 6d 61 70 20 28 28 76  ine osMremap ((v
66c0: 6f 69 64 2a 28 2a 29 28 76 6f 69 64 2a 2c 73 69  oid*(*)(void*,si
66d0: 7a 65 5f 74 2c 73 69 7a 65 5f 74 2c 69 6e 74 2c  ze_t,size_t,int,
66e0: 2e 2e 2e 29 29 61 53 79 73 63 61 6c 6c 5b 32 33  ...))aSyscall[23
66f0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 20 20 7b 20  ].pCurrent).  { 
6700: 22 67 65 74 70 61 67 65 73 69 7a 65 22 2c 20 20  "getpagesize",  
6710: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
6720: 5f 70 74 72 29 75 6e 69 78 47 65 74 70 61 67 65  _ptr)unixGetpage
6730: 73 69 7a 65 2c 20 30 20 7d 2c 0a 23 64 65 66 69  size, 0 },.#defi
6740: 6e 65 20 6f 73 47 65 74 70 61 67 65 73 69 7a 65  ne osGetpagesize
6750: 20 28 28 69 6e 74 28 2a 29 28 76 6f 69 64 29 29   ((int(*)(void))
6760: 61 53 79 73 63 61 6c 6c 5b 32 34 5d 2e 70 43 75  aSyscall[24].pCu
6770: 72 72 65 6e 74 29 0a 0a 23 65 6e 64 69 66 0a 0a  rrent)..#endif..
6780: 7d 3b 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65  }; /* End of the
6790: 20 6f 76 65 72 72 69 64 65 61 62 6c 65 20 73 79   overrideable sy
67a0: 73 74 65 6d 20 63 61 6c 6c 73 20 2a 2f 0a 0a 2f  stem calls */../
67b0: 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65  *.** This is the
67c0: 20 78 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 28   xSetSystemCall(
67d0: 29 20 6d 65 74 68 6f 64 20 6f 66 20 73 71 6c 69  ) method of sqli
67e0: 74 65 33 5f 76 66 73 20 66 6f 72 20 61 6c 6c 20  te3_vfs for all 
67f0: 6f 66 20 74 68 65 0a 2a 2a 20 22 75 6e 69 78 22  of the.** "unix"
6800: 20 56 46 53 65 73 2e 20 20 52 65 74 75 72 6e 20   VFSes.  Return 
6810: 53 51 4c 49 54 45 5f 4f 4b 20 6f 70 6f 6e 20 73  SQLITE_OK opon s
6820: 75 63 63 65 73 73 66 75 6c 6c 79 20 75 70 64 61  uccessfully upda
6830: 74 69 6e 67 20 74 68 65 0a 2a 2a 20 73 79 73 74  ting the.** syst
6840: 65 6d 20 63 61 6c 6c 20 70 6f 69 6e 74 65 72 2c  em call pointer,
6850: 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f   or SQLITE_NOTFO
6860: 55 4e 44 20 69 66 20 74 68 65 72 65 20 69 73 20  UND if there is 
6870: 6e 6f 20 63 6f 6e 66 69 67 75 72 61 62 6c 65 0a  no configurable.
6880: 2a 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 6e  ** system call n
6890: 61 6d 65 64 20 7a 4e 61 6d 65 2e 0a 2a 2f 0a 73  amed zName..*/.s
68a0: 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 65  tatic int unixSe
68b0: 74 53 79 73 74 65 6d 43 61 6c 6c 28 0a 20 20 73  tSystemCall(.  s
68c0: 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 4e 6f 74  qlite3_vfs *pNot
68d0: 55 73 65 64 2c 20 20 20 20 20 20 20 20 2f 2a 20  Used,        /* 
68e0: 54 68 65 20 56 46 53 20 70 6f 69 6e 74 65 72 2e  The VFS pointer.
68f0: 20 20 4e 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20    Not used */.  
6900: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
6910: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e,            /*
6920: 20 4e 61 6d 65 20 6f 66 20 73 79 73 74 65 6d 20   Name of system 
6930: 63 61 6c 6c 20 74 6f 20 6f 76 65 72 72 69 64 65  call to override
6940: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 79   */.  sqlite3_sy
6950: 73 63 61 6c 6c 5f 70 74 72 20 70 4e 65 77 46 75  scall_ptr pNewFu
6960: 6e 63 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74  nc  /* Pointer t
6970: 6f 20 6e 65 77 20 73 79 73 74 65 6d 20 63 61 6c  o new system cal
6980: 6c 20 76 61 6c 75 65 20 2a 2f 0a 29 7b 0a 20 20  l value */.){.  
6990: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a  unsigned int i;.
69a0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
69b0: 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 0a 20 20 55  E_NOTFOUND;..  U
69c0: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
69d0: 70 4e 6f 74 55 73 65 64 29 3b 0a 20 20 69 66 28  pNotUsed);.  if(
69e0: 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20   zName==0 ){.   
69f0: 20 2f 2a 20 49 66 20 6e 6f 20 7a 4e 61 6d 65 20   /* If no zName 
6a00: 69 73 20 67 69 76 65 6e 2c 20 72 65 73 74 6f 72  is given, restor
6a10: 65 20 61 6c 6c 20 73 79 73 74 65 6d 20 63 61 6c  e all system cal
6a20: 6c 73 20 74 6f 20 74 68 65 69 72 20 64 65 66 61  ls to their defa
6a30: 75 6c 74 0a 20 20 20 20 2a 2a 20 73 65 74 74 69  ult.    ** setti
6a40: 6e 67 73 20 61 6e 64 20 72 65 74 75 72 6e 20 4e  ngs and return N
6a50: 55 4c 4c 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  ULL.    */.    r
6a60: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
6a70: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69     for(i=0; i<si
6a80: 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f 73  zeof(aSyscall)/s
6a90: 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30  izeof(aSyscall[0
6aa0: 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ]); i++){.      
6ab0: 69 66 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e  if( aSyscall[i].
6ac0: 70 44 65 66 61 75 6c 74 20 29 7b 0a 20 20 20 20  pDefault ){.    
6ad0: 20 20 20 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e      aSyscall[i].
6ae0: 70 43 75 72 72 65 6e 74 20 3d 20 61 53 79 73 63  pCurrent = aSysc
6af0: 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3b  all[i].pDefault;
6b00: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
6b10: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49   }else{.    /* I
6b20: 66 20 7a 4e 61 6d 65 20 69 73 20 73 70 65 63 69  f zName is speci
6b30: 66 69 65 64 2c 20 6f 70 65 72 61 74 65 20 6f 6e  fied, operate on
6b40: 20 6f 6e 6c 79 20 74 68 65 20 6f 6e 65 20 73 79   only the one sy
6b50: 73 74 65 6d 20 63 61 6c 6c 0a 20 20 20 20 2a 2a  stem call.    **
6b60: 20 73 70 65 63 69 66 69 65 64 2e 0a 20 20 20 20   specified..    
6b70: 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  */.    for(i=0; 
6b80: 69 3c 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c  i<sizeof(aSyscal
6b90: 6c 29 2f 73 69 7a 65 6f 66 28 61 53 79 73 63 61  l)/sizeof(aSysca
6ba0: 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20  ll[0]); i++){.  
6bb0: 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
6bc0: 4e 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69  Name, aSyscall[i
6bd0: 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20  ].zName)==0 ){. 
6be0: 20 20 20 20 20 20 20 69 66 28 20 61 53 79 73 63         if( aSysc
6bf0: 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3d  all[i].pDefault=
6c00: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
6c10: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66  aSyscall[i].pDef
6c20: 61 75 6c 74 20 3d 20 61 53 79 73 63 61 6c 6c 5b  ault = aSyscall[
6c30: 69 5d 2e 70 43 75 72 72 65 6e 74 3b 0a 20 20 20  i].pCurrent;.   
6c40: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
6c50: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
6c60: 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 46         if( pNewF
6c70: 75 6e 63 3d 3d 30 20 29 20 70 4e 65 77 46 75 6e  unc==0 ) pNewFun
6c80: 63 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e  c = aSyscall[i].
6c90: 70 44 65 66 61 75 6c 74 3b 0a 20 20 20 20 20 20  pDefault;.      
6ca0: 20 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43    aSyscall[i].pC
6cb0: 75 72 72 65 6e 74 20 3d 20 70 4e 65 77 46 75 6e  urrent = pNewFun
6cc0: 63 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  c;.        break
6cd0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
6ce0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
6cf0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
6d00: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 61 20   the value of a 
6d10: 73 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20 52 65  system call.  Re
6d20: 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 7a 4e 61  turn NULL if zNa
6d30: 6d 65 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 72  me is not a.** r
6d40: 65 63 6f 67 6e 69 7a 65 64 20 73 79 73 74 65 6d  ecognized system
6d50: 20 63 61 6c 6c 20 6e 61 6d 65 2e 20 20 4e 55 4c   call name.  NUL
6d60: 4c 20 69 73 20 61 6c 73 6f 20 72 65 74 75 72 6e  L is also return
6d70: 65 64 20 69 66 20 74 68 65 20 73 79 73 74 65 6d  ed if the system
6d80: 20 63 61 6c 6c 0a 2a 2a 20 69 73 20 63 75 72 72   call.** is curr
6d90: 65 6e 74 6c 79 20 75 6e 64 65 66 69 6e 65 64 2e  ently undefined.
6da0: 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74  .*/.static sqlit
6db0: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20 75  e3_syscall_ptr u
6dc0: 6e 69 78 47 65 74 53 79 73 74 65 6d 43 61 6c 6c  nixGetSystemCall
6dd0: 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  (.  sqlite3_vfs 
6de0: 2a 70 4e 6f 74 55 73 65 64 2c 0a 20 20 63 6f 6e  *pNotUsed,.  con
6df0: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 0a 29  st char *zName.)
6e00: 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  {.  unsigned int
6e10: 20 69 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41   i;..  UNUSED_PA
6e20: 52 41 4d 45 54 45 52 28 70 4e 6f 74 55 73 65 64  RAMETER(pNotUsed
6e30: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
6e40: 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 29  sizeof(aSyscall)
6e50: 2f 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c  /sizeof(aSyscall
6e60: 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  [0]); i++){.    
6e70: 69 66 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65  if( strcmp(zName
6e80: 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e  , aSyscall[i].zN
6e90: 61 6d 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  ame)==0 ) return
6ea0: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75   aSyscall[i].pCu
6eb0: 72 72 65 6e 74 3b 0a 20 20 7d 0a 20 20 72 65 74  rrent;.  }.  ret
6ec0: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
6ed0: 52 65 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 20  Return the name 
6ee0: 6f 66 20 74 68 65 20 66 69 72 73 74 20 73 79 73  of the first sys
6ef0: 74 65 6d 20 63 61 6c 6c 20 61 66 74 65 72 20 7a  tem call after z
6f00: 4e 61 6d 65 2e 20 20 49 66 20 7a 4e 61 6d 65 3d  Name.  If zName=
6f10: 3d 4e 55 4c 4c 0a 2a 2a 20 74 68 65 6e 20 72 65  =NULL.** then re
6f20: 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66  turn the name of
6f30: 20 74 68 65 20 66 69 72 73 74 20 73 79 73 74 65   the first syste
6f40: 6d 20 63 61 6c 6c 2e 20 20 52 65 74 75 72 6e 20  m call.  Return 
6f50: 4e 55 4c 4c 20 69 66 20 7a 4e 61 6d 65 0a 2a 2a  NULL if zName.**
6f60: 20 69 73 20 74 68 65 20 6c 61 73 74 20 73 79 73   is the last sys
6f70: 74 65 6d 20 63 61 6c 6c 20 6f 72 20 69 66 20 7a  tem call or if z
6f80: 4e 61 6d 65 20 69 73 20 6e 6f 74 20 74 68 65 20  Name is not the 
6f90: 6e 61 6d 65 20 6f 66 20 61 20 76 61 6c 69 64 0a  name of a valid.
6fa0: 2a 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 0a  ** system call..
6fb0: 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
6fc0: 63 68 61 72 20 2a 75 6e 69 78 4e 65 78 74 53 79  char *unixNextSy
6fd0: 73 74 65 6d 43 61 6c 6c 28 73 71 6c 69 74 65 33  stemCall(sqlite3
6fe0: 5f 76 66 73 20 2a 70 2c 20 63 6f 6e 73 74 20 63  _vfs *p, const c
6ff0: 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69  har *zName){.  i
7000: 6e 74 20 69 20 3d 20 2d 31 3b 0a 0a 20 20 55 4e  nt i = -1;..  UN
7010: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
7020: 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 20 29  );.  if( zName )
7030: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
7040: 3c 41 72 72 61 79 53 69 7a 65 28 61 53 79 73 63  <ArraySize(aSysc
7050: 61 6c 6c 29 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20  all)-1; i++){.  
7060: 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
7070: 4e 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69  Name, aSyscall[i
7080: 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 62 72  ].zName)==0 ) br
7090: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
70a0: 20 66 6f 72 28 69 2b 2b 3b 20 69 3c 41 72 72 61   for(i++; i<Arra
70b0: 79 53 69 7a 65 28 61 53 79 73 63 61 6c 6c 29 3b  ySize(aSyscall);
70c0: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 61   i++){.    if( a
70d0: 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72  Syscall[i].pCurr
70e0: 65 6e 74 21 3d 30 20 29 20 72 65 74 75 72 6e 20  ent!=0 ) return 
70f0: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d  aSyscall[i].zNam
7100: 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  e;.  }.  return 
7110: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 6e  0;.}../*.** Do n
7120: 6f 74 20 61 63 63 65 70 74 20 61 6e 79 20 66 69  ot accept any fi
7130: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6c 65  le descriptor le
7140: 73 73 20 74 68 61 6e 20 74 68 69 73 20 76 61 6c  ss than this val
7150: 75 65 2c 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ue, in order to 
7160: 61 76 6f 69 64 0a 2a 2a 20 6f 70 65 6e 69 6e 67  avoid.** opening
7170: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 75   database file u
7180: 73 69 6e 67 20 66 69 6c 65 20 64 65 73 63 72 69  sing file descri
7190: 70 74 6f 72 73 20 74 68 61 74 20 61 72 65 20 63  ptors that are c
71a0: 6f 6d 6d 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72  ommonly used for
71b0: 20 0a 2a 2a 20 73 74 61 6e 64 61 72 64 20 69 6e   .** standard in
71c0: 70 75 74 2c 20 6f 75 74 70 75 74 2c 20 61 6e 64  put, output, and
71d0: 20 65 72 72 6f 72 2e 0a 2a 2f 0a 23 69 66 6e 64   error..*/.#ifnd
71e0: 65 66 20 53 51 4c 49 54 45 5f 4d 49 4e 49 4d 55  ef SQLITE_MINIMU
71f0: 4d 5f 46 49 4c 45 5f 44 45 53 43 52 49 50 54 4f  M_FILE_DESCRIPTO
7200: 52 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54  R.# define SQLIT
7210: 45 5f 4d 49 4e 49 4d 55 4d 5f 46 49 4c 45 5f 44  E_MINIMUM_FILE_D
7220: 45 53 43 52 49 50 54 4f 52 20 33 0a 23 65 6e 64  ESCRIPTOR 3.#end
7230: 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65  if../*.** Invoke
7240: 20 6f 70 65 6e 28 29 2e 20 20 44 6f 20 73 6f 20   open().  Do so 
7250: 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 2c 20  multiple times, 
7260: 75 6e 74 69 6c 20 69 74 20 65 69 74 68 65 72 20  until it either 
7270: 73 75 63 63 65 65 64 73 20 6f 72 0a 2a 2a 20 66  succeeds or.** f
7280: 61 69 6c 73 20 66 6f 72 20 73 6f 6d 65 20 72 65  ails for some re
7290: 61 73 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20  ason other than 
72a0: 45 49 4e 54 52 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  EINTR..**.** If 
72b0: 74 68 65 20 66 69 6c 65 20 63 72 65 61 74 69 6f  the file creatio
72c0: 6e 20 6d 6f 64 65 20 22 6d 22 20 69 73 20 30 20  n mode "m" is 0 
72d0: 74 68 65 6e 20 73 65 74 20 69 74 20 74 6f 20 74  then set it to t
72e0: 68 65 20 64 65 66 61 75 6c 74 20 66 6f 72 0a 2a  he default for.*
72f0: 2a 20 53 51 4c 69 74 65 2e 20 20 54 68 65 20 64  * SQLite.  The d
7300: 65 66 61 75 6c 74 20 69 73 20 53 51 4c 49 54 45  efault is SQLITE
7310: 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45  _DEFAULT_FILE_PE
7320: 52 4d 49 53 53 49 4f 4e 53 20 28 6e 6f 72 6d 61  RMISSIONS (norma
7330: 6c 6c 79 0a 2a 2a 20 30 36 34 34 29 20 61 73 20  lly.** 0644) as 
7340: 6d 6f 64 69 66 69 65 64 20 62 79 20 74 68 65 20  modified by the 
7350: 73 79 73 74 65 6d 20 75 6d 61 73 6b 2e 20 20 49  system umask.  I
7360: 66 20 6d 20 69 73 20 6e 6f 74 20 30 2c 20 74 68  f m is not 0, th
7370: 65 6e 0a 2a 2a 20 6d 61 6b 65 20 74 68 65 20 66  en.** make the f
7380: 69 6c 65 20 63 72 65 61 74 69 6f 6e 20 6d 6f 64  ile creation mod
7390: 65 20 62 65 20 65 78 61 63 74 6c 79 20 6d 20 69  e be exactly m i
73a0: 67 6e 6f 72 69 6e 67 20 74 68 65 20 75 6d 61 73  gnoring the umas
73b0: 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 20 70  k..**.** The m p
73c0: 61 72 61 6d 65 74 65 72 20 77 69 6c 6c 20 62 65  arameter will be
73d0: 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 6e 6c 79 20 77   non-zero only w
73e0: 68 65 6e 20 63 72 65 61 74 69 6e 67 20 2d 77 61  hen creating -wa
73f0: 6c 2c 20 2d 6a 6f 75 72 6e 61 6c 2c 0a 2a 2a 20  l, -journal,.** 
7400: 61 6e 64 20 2d 73 68 6d 20 66 69 6c 65 73 2e 20  and -shm files. 
7410: 20 57 65 20 77 61 6e 74 20 74 68 6f 73 65 20 66   We want those f
7420: 69 6c 65 73 20 74 6f 20 68 61 76 65 20 2a 65 78  iles to have *ex
7430: 61 63 74 6c 79 2a 20 74 68 65 20 73 61 6d 65 0a  actly* the same.
7440: 2a 2a 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 61  ** permissions a
7450: 73 20 74 68 65 69 72 20 6f 72 69 67 69 6e 61 6c  s their original
7460: 20 64 61 74 61 62 61 73 65 2c 20 75 6e 61 64 75   database, unadu
7470: 6c 74 65 72 61 74 65 64 20 62 79 20 74 68 65 20  lterated by the 
7480: 75 6d 61 73 6b 2e 0a 2a 2a 20 49 6e 20 74 68 61  umask..** In tha
7490: 74 20 77 61 79 2c 20 69 66 20 61 20 64 61 74 61  t way, if a data
74a0: 62 61 73 65 20 66 69 6c 65 20 69 73 20 2d 72 77  base file is -rw
74b0: 2d 72 77 2d 72 77 20 6f 72 20 2d 72 77 2d 72 77  -rw-rw or -rw-rw
74c0: 2d 72 2d 2c 20 61 6e 64 20 61 0a 2a 2a 20 74 72  -r-, and a.** tr
74d0: 61 6e 73 61 63 74 69 6f 6e 20 63 72 61 73 68 65  ansaction crashe
74e0: 73 20 61 6e 64 20 6c 65 61 76 65 73 20 62 65 68  s and leaves beh
74f0: 69 6e 64 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 73  ind hot journals
7500: 2c 20 74 68 65 6e 20 61 6e 79 0a 2a 2a 20 70 72  , then any.** pr
7510: 6f 63 65 73 73 20 74 68 61 74 20 69 73 20 61 62  ocess that is ab
7520: 6c 65 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74  le to write to t
7530: 68 65 20 64 61 74 61 62 61 73 65 20 77 69 6c 6c  he database will
7540: 20 61 6c 73 6f 20 62 65 20 61 62 6c 65 20 74 6f   also be able to
7550: 0a 2a 2a 20 72 65 63 6f 76 65 72 20 74 68 65 20  .** recover the 
7560: 68 6f 74 20 6a 6f 75 72 6e 61 6c 73 2e 0a 2a 2f  hot journals..*/
7570: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 6f 62 75  .static int robu
7580: 73 74 5f 6f 70 65 6e 28 63 6f 6e 73 74 20 63 68  st_open(const ch
7590: 61 72 20 2a 7a 2c 20 69 6e 74 20 66 2c 20 6d 6f  ar *z, int f, mo
75a0: 64 65 5f 74 20 6d 29 7b 0a 20 20 69 6e 74 20 66  de_t m){.  int f
75b0: 64 3b 0a 20 20 6d 6f 64 65 5f 74 20 6d 32 20 3d  d;.  mode_t m2 =
75c0: 20 6d 20 3f 20 6d 20 3a 20 53 51 4c 49 54 45 5f   m ? m : SQLITE_
75d0: 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52  DEFAULT_FILE_PER
75e0: 4d 49 53 53 49 4f 4e 53 3b 0a 20 20 77 68 69 6c  MISSIONS;.  whil
75f0: 65 28 31 29 7b 0a 23 69 66 20 64 65 66 69 6e 65  e(1){.#if define
7600: 64 28 4f 5f 43 4c 4f 45 58 45 43 29 0a 20 20 20  d(O_CLOEXEC).   
7610: 20 66 64 20 3d 20 6f 73 4f 70 65 6e 28 7a 2c 66   fd = osOpen(z,f
7620: 7c 4f 5f 43 4c 4f 45 58 45 43 2c 6d 32 29 3b 0a  |O_CLOEXEC,m2);.
7630: 23 65 6c 73 65 0a 20 20 20 20 66 64 20 3d 20 6f  #else.    fd = o
7640: 73 4f 70 65 6e 28 7a 2c 66 2c 6d 32 29 3b 0a 23  sOpen(z,f,m2);.#
7650: 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 66 64  endif.    if( fd
7660: 3c 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  <0 ){.      if( 
7670: 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 20 63  errno==EINTR ) c
7680: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 62  ontinue;.      b
7690: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
76a0: 69 66 28 20 66 64 3e 3d 53 51 4c 49 54 45 5f 4d  if( fd>=SQLITE_M
76b0: 49 4e 49 4d 55 4d 5f 46 49 4c 45 5f 44 45 53 43  INIMUM_FILE_DESC
76c0: 52 49 50 54 4f 52 20 29 20 62 72 65 61 6b 3b 0a  RIPTOR ) break;.
76d0: 20 20 20 20 6f 73 43 6c 6f 73 65 28 66 64 29 3b      osClose(fd);
76e0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67  .    sqlite3_log
76f0: 28 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 2c  (SQLITE_WARNING,
7700: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
7710: 20 20 22 61 74 74 65 6d 70 74 20 74 6f 20 6f 70    "attempt to op
7720: 65 6e 20 5c 22 25 73 5c 22 20 61 73 20 66 69 6c  en \"%s\" as fil
7730: 65 20 64 65 73 63 72 69 70 74 6f 72 20 25 64 22  e descriptor %d"
7740: 2c 20 7a 2c 20 66 64 29 3b 0a 20 20 20 20 66 64  , z, fd);.    fd
7750: 20 3d 20 2d 31 3b 0a 20 20 20 20 69 66 28 20 6f   = -1;.    if( o
7760: 73 4f 70 65 6e 28 22 2f 64 65 76 2f 6e 75 6c 6c  sOpen("/dev/null
7770: 22 2c 20 66 2c 20 6d 29 3c 30 20 29 20 62 72 65  ", f, m)<0 ) bre
7780: 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 64  ak;.  }.  if( fd
7790: 3e 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6d  >=0 ){.    if( m
77a0: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 74 72  !=0 ){.      str
77b0: 75 63 74 20 73 74 61 74 20 73 74 61 74 62 75 66  uct stat statbuf
77c0: 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 73 46 73  ;.      if( osFs
77d0: 74 61 74 28 66 64 2c 20 26 73 74 61 74 62 75 66  tat(fd, &statbuf
77e0: 29 3d 3d 30 20 0a 20 20 20 20 20 20 20 26 26 20  )==0 .       && 
77f0: 73 74 61 74 62 75 66 2e 73 74 5f 73 69 7a 65 3d  statbuf.st_size=
7800: 3d 30 0a 20 20 20 20 20 20 20 26 26 20 28 73 74  =0.       && (st
7810: 61 74 62 75 66 2e 73 74 5f 6d 6f 64 65 26 30 37  atbuf.st_mode&07
7820: 37 37 29 21 3d 6d 20 0a 20 20 20 20 20 20 29 7b  77)!=m .      ){
7830: 0a 20 20 20 20 20 20 20 20 6f 73 46 63 68 6d 6f  .        osFchmo
7840: 64 28 66 64 2c 20 6d 29 3b 0a 20 20 20 20 20 20  d(fd, m);.      
7850: 7d 0a 20 20 20 20 7d 0a 23 69 66 20 64 65 66 69  }.    }.#if defi
7860: 6e 65 64 28 46 44 5f 43 4c 4f 45 58 45 43 29 20  ned(FD_CLOEXEC) 
7870: 26 26 20 28 21 64 65 66 69 6e 65 64 28 4f 5f 43  && (!defined(O_C
7880: 4c 4f 45 58 45 43 29 20 7c 7c 20 4f 5f 43 4c 4f  LOEXEC) || O_CLO
7890: 45 58 45 43 3d 3d 30 29 0a 20 20 20 20 6f 73 46  EXEC==0).    osF
78a0: 63 6e 74 6c 28 66 64 2c 20 46 5f 53 45 54 46 44  cntl(fd, F_SETFD
78b0: 2c 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20 46 5f  , osFcntl(fd, F_
78c0: 47 45 54 46 44 2c 20 30 29 20 7c 20 46 44 5f 43  GETFD, 0) | FD_C
78d0: 4c 4f 45 58 45 43 29 3b 0a 23 65 6e 64 69 66 0a  LOEXEC);.#endif.
78e0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 66 64 3b    }.  return fd;
78f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72  .}../*.** Helper
7900: 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20 6f 62   functions to ob
7910: 74 61 69 6e 20 61 6e 64 20 72 65 6c 69 6e 71 75  tain and relinqu
7920: 69 73 68 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d  ish the global m
7930: 75 74 65 78 2e 20 54 68 65 0a 2a 2a 20 67 6c 6f  utex. The.** glo
7940: 62 61 6c 20 6d 75 74 65 78 20 69 73 20 75 73 65  bal mutex is use
7950: 64 20 74 6f 20 70 72 6f 74 65 63 74 20 74 68 65  d to protect the
7960: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 61   unixInodeInfo a
7970: 6e 64 0a 2a 2a 20 76 78 77 6f 72 6b 73 46 69 6c  nd.** vxworksFil
7980: 65 49 64 20 6f 62 6a 65 63 74 73 20 75 73 65 64  eId objects used
7990: 20 62 79 20 74 68 69 73 20 66 69 6c 65 2c 20 61   by this file, a
79a0: 6c 6c 20 6f 66 20 77 68 69 63 68 20 6d 61 79 20  ll of which may 
79b0: 62 65 20 0a 2a 2a 20 73 68 61 72 65 64 20 62 79  be .** shared by
79c0: 20 6d 75 6c 74 69 70 6c 65 20 74 68 72 65 61 64   multiple thread
79d0: 73 2e 0a 2a 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f  s..**.** Functio
79e0: 6e 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28  n unixMutexHeld(
79f0: 29 20 69 73 20 75 73 65 64 20 74 6f 20 61 73 73  ) is used to ass
7a00: 65 72 74 28 29 20 74 68 61 74 20 74 68 65 20 67  ert() that the g
7a10: 6c 6f 62 61 6c 20 6d 75 74 65 78 20 0a 2a 2a 20  lobal mutex .** 
7a20: 69 73 20 68 65 6c 64 20 77 68 65 6e 20 72 65 71  is held when req
7a30: 75 69 72 65 64 2e 20 54 68 69 73 20 66 75 6e 63  uired. This func
7a40: 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65  tion is only use
7a50: 64 20 61 73 20 70 61 72 74 20 6f 66 20 61 73 73  d as part of ass
7a60: 65 72 74 28 29 20 0a 2a 2a 20 73 74 61 74 65 6d  ert() .** statem
7a70: 65 6e 74 73 2e 20 65 2e 67 2e 0a 2a 2a 0a 2a 2a  ents. e.g..**.**
7a80: 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65     unixEnterMute
7a90: 78 28 29 0a 2a 2a 20 20 20 20 20 61 73 73 65 72  x().**     asser
7aa0: 74 28 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64  t( unixMutexHeld
7ab0: 28 29 20 29 3b 0a 2a 2a 20 20 20 75 6e 69 78 45  () );.**   unixE
7ac0: 6e 74 65 72 4c 65 61 76 65 28 29 0a 2a 2f 0a 73  nterLeave().*/.s
7ad0: 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 45  tatic void unixE
7ae0: 6e 74 65 72 4d 75 74 65 78 28 76 6f 69 64 29 7b  nterMutex(void){
7af0: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
7b00: 5f 65 6e 74 65 72 28 73 71 6c 69 74 65 33 4d 75  _enter(sqlite3Mu
7b10: 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  texAlloc(SQLITE_
7b20: 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53  MUTEX_STATIC_MAS
7b30: 54 45 52 29 29 3b 0a 7d 0a 73 74 61 74 69 63 20  TER));.}.static 
7b40: 76 6f 69 64 20 75 6e 69 78 4c 65 61 76 65 4d 75  void unixLeaveMu
7b50: 74 65 78 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c  tex(void){.  sql
7b60: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
7b70: 28 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c  (sqlite3MutexAll
7b80: 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
7b90: 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 29 3b  STATIC_MASTER));
7ba0: 0a 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  .}.#ifdef SQLITE
7bb0: 5f 44 45 42 55 47 0a 73 74 61 74 69 63 20 69 6e  _DEBUG.static in
7bc0: 74 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28  t unixMutexHeld(
7bd0: 76 6f 69 64 29 20 7b 0a 20 20 72 65 74 75 72 6e  void) {.  return
7be0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
7bf0: 65 6c 64 28 73 71 6c 69 74 65 33 4d 75 74 65 78  eld(sqlite3Mutex
7c00: 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  Alloc(SQLITE_MUT
7c10: 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52  EX_STATIC_MASTER
7c20: 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23  ));.}.#endif...#
7c30: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
7c40: 45 5f 54 45 53 54 29 20 26 26 20 64 65 66 69 6e  E_TEST) && defin
7c50: 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29  ed(SQLITE_DEBUG)
7c60: 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75  ./*.** Helper fu
7c70: 6e 63 74 69 6f 6e 20 66 6f 72 20 70 72 69 6e 74  nction for print
7c80: 69 6e 67 20 6f 75 74 20 74 72 61 63 65 20 69 6e  ing out trace in
7c90: 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 64  formation from d
7ca0: 65 62 75 67 67 69 6e 67 0a 2a 2a 20 62 69 6e 61  ebugging.** bina
7cb0: 72 69 65 73 2e 20 54 68 69 73 20 72 65 74 75 72  ries. This retur
7cc0: 6e 73 20 74 68 65 20 73 74 72 69 6e 67 20 72 65  ns the string re
7cd0: 70 72 65 73 65 74 61 74 69 6f 6e 20 6f 66 20 74  presetation of t
7ce0: 68 65 20 73 75 70 70 6c 69 65 64 0a 2a 2a 20 69  he supplied.** i
7cf0: 6e 74 65 67 65 72 20 6c 6f 63 6b 2d 74 79 70 65  nteger lock-type
7d00: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
7d10: 74 20 63 68 61 72 20 2a 61 7a 46 69 6c 65 4c 6f  t char *azFileLo
7d20: 63 6b 28 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b  ck(int eFileLock
7d30: 29 7b 0a 20 20 73 77 69 74 63 68 28 20 65 46 69  ){.  switch( eFi
7d40: 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 63 61  leLock ){.    ca
7d50: 73 65 20 4e 4f 5f 4c 4f 43 4b 3a 20 72 65 74 75  se NO_LOCK: retu
7d60: 72 6e 20 22 4e 4f 4e 45 22 3b 0a 20 20 20 20 63  rn "NONE";.    c
7d70: 61 73 65 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3a  ase SHARED_LOCK:
7d80: 20 72 65 74 75 72 6e 20 22 53 48 41 52 45 44 22   return "SHARED"
7d90: 3b 0a 20 20 20 20 63 61 73 65 20 52 45 53 45 52  ;.    case RESER
7da0: 56 45 44 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e  VED_LOCK: return
7db0: 20 22 52 45 53 45 52 56 45 44 22 3b 0a 20 20 20   "RESERVED";.   
7dc0: 20 63 61 73 65 20 50 45 4e 44 49 4e 47 5f 4c 4f   case PENDING_LO
7dd0: 43 4b 3a 20 72 65 74 75 72 6e 20 22 50 45 4e 44  CK: return "PEND
7de0: 49 4e 47 22 3b 0a 20 20 20 20 63 61 73 65 20 45  ING";.    case E
7df0: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3a 20 72  XCLUSIVE_LOCK: r
7e00: 65 74 75 72 6e 20 22 45 58 43 4c 55 53 49 56 45  eturn "EXCLUSIVE
7e10: 22 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  ";.  }.  return 
7e20: 22 45 52 52 4f 52 22 3b 0a 7d 0a 23 65 6e 64 69  "ERROR";.}.#endi
7e30: 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  f..#ifdef SQLITE
7e40: 5f 4c 4f 43 4b 5f 54 52 41 43 45 0a 2f 2a 0a 2a  _LOCK_TRACE./*.*
7e50: 2a 20 50 72 69 6e 74 20 6f 75 74 20 69 6e 66 6f  * Print out info
7e60: 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 61 6c  rmation about al
7e70: 6c 20 6c 6f 63 6b 69 6e 67 20 6f 70 65 72 61 74  l locking operat
7e80: 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ions..**.** This
7e90: 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64   routine is used
7ea0: 20 66 6f 72 20 74 72 6f 75 62 6c 65 73 68 6f 6f   for troubleshoo
7eb0: 74 69 6e 67 20 6c 6f 63 6b 73 20 6f 6e 20 6d 75  ting locks on mu
7ec0: 6c 74 69 74 68 72 65 61 64 65 64 0a 2a 2a 20 70  ltithreaded.** p
7ed0: 6c 61 74 66 6f 72 6d 73 2e 20 20 45 6e 61 62 6c  latforms.  Enabl
7ee0: 65 20 62 79 20 63 6f 6d 70 69 6c 69 6e 67 20 77  e by compiling w
7ef0: 69 74 68 20 74 68 65 20 2d 44 53 51 4c 49 54 45  ith the -DSQLITE
7f00: 5f 4c 4f 43 4b 5f 54 52 41 43 45 0a 2a 2a 20 63  _LOCK_TRACE.** c
7f10: 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 6f 70 74 69  ommand-line opti
7f20: 6f 6e 20 6f 6e 20 74 68 65 20 63 6f 6d 70 69 6c  on on the compil
7f30: 65 72 2e 20 20 54 68 69 73 20 63 6f 64 65 20 69  er.  This code i
7f40: 73 20 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a 20 74 75  s normally.** tu
7f50: 72 6e 65 64 20 6f 66 66 2e 0a 2a 2f 0a 73 74 61  rned off..*/.sta
7f60: 74 69 63 20 69 6e 74 20 6c 6f 63 6b 54 72 61 63  tic int lockTrac
7f70: 65 28 69 6e 74 20 66 64 2c 20 69 6e 74 20 6f 70  e(int fd, int op
7f80: 2c 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 2a  , struct flock *
7f90: 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4f 70 4e  p){.  char *zOpN
7fa0: 61 6d 65 2c 20 2a 7a 54 79 70 65 3b 0a 20 20 69  ame, *zType;.  i
7fb0: 6e 74 20 73 3b 0a 20 20 69 6e 74 20 73 61 76 65  nt s;.  int save
7fc0: 64 45 72 72 6e 6f 3b 0a 20 20 69 66 28 20 6f 70  dErrno;.  if( op
7fd0: 3d 3d 46 5f 47 45 54 4c 4b 20 29 7b 0a 20 20 20  ==F_GETLK ){.   
7fe0: 20 7a 4f 70 4e 61 6d 65 20 3d 20 22 47 45 54 4c   zOpName = "GETL
7ff0: 4b 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  K";.  }else if( 
8000: 6f 70 3d 3d 46 5f 53 45 54 4c 4b 20 29 7b 0a 20  op==F_SETLK ){. 
8010: 20 20 20 7a 4f 70 4e 61 6d 65 20 3d 20 22 53 45     zOpName = "SE
8020: 54 4c 4b 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  TLK";.  }else{. 
8030: 20 20 20 73 20 3d 20 6f 73 46 63 6e 74 6c 28 66     s = osFcntl(f
8040: 64 2c 20 6f 70 2c 20 70 29 3b 0a 20 20 20 20 73  d, op, p);.    s
8050: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
8060: 66 28 22 66 63 6e 74 6c 20 75 6e 6b 6e 6f 77 6e  f("fcntl unknown
8070: 20 25 64 20 25 64 20 25 64 5c 6e 22 2c 20 66 64   %d %d %d\n", fd
8080: 2c 20 6f 70 2c 20 73 29 3b 0a 20 20 20 20 72 65  , op, s);.    re
8090: 74 75 72 6e 20 73 3b 0a 20 20 7d 0a 20 20 69 66  turn s;.  }.  if
80a0: 28 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 52  ( p->l_type==F_R
80b0: 44 4c 43 4b 20 29 7b 0a 20 20 20 20 7a 54 79 70  DLCK ){.    zTyp
80c0: 65 20 3d 20 22 52 44 4c 43 4b 22 3b 0a 20 20 7d  e = "RDLCK";.  }
80d0: 65 6c 73 65 20 69 66 28 20 70 2d 3e 6c 5f 74 79  else if( p->l_ty
80e0: 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 7b 0a 20  pe==F_WRLCK ){. 
80f0: 20 20 20 7a 54 79 70 65 20 3d 20 22 57 52 4c 43     zType = "WRLC
8100: 4b 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  K";.  }else if( 
8110: 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 55 4e 4c  p->l_type==F_UNL
8120: 43 4b 20 29 7b 0a 20 20 20 20 7a 54 79 70 65 20  CK ){.    zType 
8130: 3d 20 22 55 4e 4c 43 4b 22 3b 0a 20 20 7d 65 6c  = "UNLCK";.  }el
8140: 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
8150: 30 20 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  0 );.  }.  asser
8160: 74 28 20 70 2d 3e 6c 5f 77 68 65 6e 63 65 3d 3d  t( p->l_whence==
8170: 53 45 45 4b 5f 53 45 54 20 29 3b 0a 20 20 73 20  SEEK_SET );.  s 
8180: 3d 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20 6f 70  = osFcntl(fd, op
8190: 2c 20 70 29 3b 0a 20 20 73 61 76 65 64 45 72 72  , p);.  savedErr
81a0: 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 73 71  no = errno;.  sq
81b0: 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
81c0: 28 22 66 63 6e 74 6c 20 25 64 20 25 64 20 25 73  ("fcntl %d %d %s
81d0: 20 25 73 20 25 64 20 25 64 20 25 64 20 25 64 5c   %s %d %d %d %d\
81e0: 6e 22 2c 0a 20 20 20 20 20 74 68 72 65 61 64 69  n",.     threadi
81f0: 64 2c 20 66 64 2c 20 7a 4f 70 4e 61 6d 65 2c 20  d, fd, zOpName, 
8200: 7a 54 79 70 65 2c 20 28 69 6e 74 29 70 2d 3e 6c  zType, (int)p->l
8210: 5f 73 74 61 72 74 2c 20 28 69 6e 74 29 70 2d 3e  _start, (int)p->
8220: 6c 5f 6c 65 6e 2c 0a 20 20 20 20 20 28 69 6e 74  l_len,.     (int
8230: 29 70 2d 3e 6c 5f 70 69 64 2c 20 73 29 3b 0a 20  )p->l_pid, s);. 
8240: 20 69 66 28 20 73 3d 3d 28 2d 31 29 20 26 26 20   if( s==(-1) && 
8250: 6f 70 3d 3d 46 5f 53 45 54 4c 4b 20 26 26 20 28  op==F_SETLK && (
8260: 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44 4c  p->l_type==F_RDL
8270: 43 4b 20 7c 7c 20 70 2d 3e 6c 5f 74 79 70 65 3d  CK || p->l_type=
8280: 3d 46 5f 57 52 4c 43 4b 29 20 29 7b 0a 20 20 20  =F_WRLCK) ){.   
8290: 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 32   struct flock l2
82a0: 3b 0a 20 20 20 20 6c 32 20 3d 20 2a 70 3b 0a 20  ;.    l2 = *p;. 
82b0: 20 20 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20 46     osFcntl(fd, F
82c0: 5f 47 45 54 4c 4b 2c 20 26 6c 32 29 3b 0a 20 20  _GETLK, &l2);.  
82d0: 20 20 69 66 28 20 6c 32 2e 6c 5f 74 79 70 65 3d    if( l2.l_type=
82e0: 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20  =F_RDLCK ){.    
82f0: 20 20 7a 54 79 70 65 20 3d 20 22 52 44 4c 43 4b    zType = "RDLCK
8300: 22 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  ";.    }else if(
8310: 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f 57 52   l2.l_type==F_WR
8320: 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 7a 54 79  LCK ){.      zTy
8330: 70 65 20 3d 20 22 57 52 4c 43 4b 22 3b 0a 20 20  pe = "WRLCK";.  
8340: 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 32 2e 6c    }else if( l2.l
8350: 5f 74 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29  _type==F_UNLCK )
8360: 7b 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20  {.      zType = 
8370: 22 55 4e 4c 43 4b 22 3b 0a 20 20 20 20 7d 65 6c  "UNLCK";.    }el
8380: 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
8390: 28 20 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ( 0 );.    }.   
83a0: 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
83b0: 6e 74 66 28 22 66 63 6e 74 6c 2d 66 61 69 6c 75  ntf("fcntl-failu
83c0: 72 65 2d 72 65 61 73 6f 6e 3a 20 25 73 20 25 64  re-reason: %s %d
83d0: 20 25 64 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20   %d %d\n",.     
83e0: 20 20 7a 54 79 70 65 2c 20 28 69 6e 74 29 6c 32    zType, (int)l2
83f0: 2e 6c 5f 73 74 61 72 74 2c 20 28 69 6e 74 29 6c  .l_start, (int)l
8400: 32 2e 6c 5f 6c 65 6e 2c 20 28 69 6e 74 29 6c 32  2.l_len, (int)l2
8410: 2e 6c 5f 70 69 64 29 3b 0a 20 20 7d 0a 20 20 65  .l_pid);.  }.  e
8420: 72 72 6e 6f 20 3d 20 73 61 76 65 64 45 72 72 6e  rrno = savedErrn
8430: 6f 3b 0a 20 20 72 65 74 75 72 6e 20 73 3b 0a 7d  o;.  return s;.}
8440: 0a 23 75 6e 64 65 66 20 6f 73 46 63 6e 74 6c 0a  .#undef osFcntl.
8450: 23 64 65 66 69 6e 65 20 6f 73 46 63 6e 74 6c 20  #define osFcntl 
8460: 6c 6f 63 6b 54 72 61 63 65 0a 23 65 6e 64 69 66  lockTrace.#endif
8470: 20 2f 2a 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f   /* SQLITE_LOCK_
8480: 54 52 41 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  TRACE */../*.** 
8490: 52 65 74 72 79 20 66 74 72 75 6e 63 61 74 65 28  Retry ftruncate(
84a0: 29 20 63 61 6c 6c 73 20 74 68 61 74 20 66 61 69  ) calls that fai
84b0: 6c 20 64 75 65 20 74 6f 20 45 49 4e 54 52 0a 2a  l due to EINTR.*
84c0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 6f 62  /.static int rob
84d0: 75 73 74 5f 66 74 72 75 6e 63 61 74 65 28 69 6e  ust_ftruncate(in
84e0: 74 20 68 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74  t h, sqlite3_int
84f0: 36 34 20 73 7a 29 7b 0a 20 20 69 6e 74 20 72 63  64 sz){.  int rc
8500: 3b 0a 20 20 64 6f 7b 20 72 63 20 3d 20 6f 73 46  ;.  do{ rc = osF
8510: 74 72 75 6e 63 61 74 65 28 68 2c 73 7a 29 3b 20  truncate(h,sz); 
8520: 7d 77 68 69 6c 65 28 20 72 63 3c 30 20 26 26 20  }while( rc<0 && 
8530: 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a  errno==EINTR );.
8540: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
8550: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
8560: 6e 65 20 74 72 61 6e 73 6c 61 74 65 73 20 61 20  ne translates a 
8570: 73 74 61 6e 64 61 72 64 20 50 4f 53 49 58 20 65  standard POSIX e
8580: 72 72 6e 6f 20 63 6f 64 65 20 69 6e 74 6f 20 73  rrno code into s
8590: 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 75 73 65 66  omething.** usef
85a0: 75 6c 20 74 6f 20 74 68 65 20 63 6c 69 65 6e 74  ul to the client
85b0: 73 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33  s of the sqlite3
85c0: 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20 53 70 65   functions.  Spe
85d0: 63 69 66 69 63 61 6c 6c 79 2c 20 69 74 20 69 73  cifically, it is
85e0: 0a 2a 2a 20 69 6e 74 65 6e 64 65 64 20 74 6f 20  .** intended to 
85f0: 74 72 61 6e 73 6c 61 74 65 20 61 20 76 61 72 69  translate a vari
8600: 65 74 79 20 6f 66 20 22 74 72 79 20 61 67 61 69  ety of "try agai
8610: 6e 22 20 65 72 72 6f 72 73 20 69 6e 74 6f 20 53  n" errors into S
8620: 51 4c 49 54 45 5f 42 55 53 59 0a 2a 2a 20 61 6e  QLITE_BUSY.** an
8630: 64 20 61 20 76 61 72 69 65 74 79 20 6f 66 20 22  d a variety of "
8640: 70 6c 65 61 73 65 20 63 6c 6f 73 65 20 74 68 65  please close the
8650: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
8660: 20 4e 4f 57 22 20 65 72 72 6f 72 73 20 69 6e 74   NOW" errors int
8670: 6f 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 49 4f 45  o .** SQLITE_IOE
8680: 52 52 0a 2a 2a 20 0a 2a 2a 20 45 72 72 6f 72 73  RR.** .** Errors
8690: 20 64 75 72 69 6e 67 20 69 6e 69 74 69 61 6c 69   during initiali
86a0: 7a 61 74 69 6f 6e 20 6f 66 20 6c 6f 63 6b 73 2c  zation of locks,
86b0: 20 6f 72 20 66 69 6c 65 20 73 79 73 74 65 6d 20   or file system 
86c0: 73 75 70 70 6f 72 74 20 66 6f 72 20 6c 6f 63 6b  support for lock
86d0: 73 2c 0a 2a 2a 20 73 68 6f 75 6c 64 20 68 61 6e  s,.** should han
86e0: 64 6c 65 20 45 4e 4f 4c 43 4b 2c 20 45 4e 4f 54  dle ENOLCK, ENOT
86f0: 53 55 50 2c 20 45 4f 50 4e 4f 54 53 55 50 50 20  SUP, EOPNOTSUPP 
8700: 73 65 70 61 72 61 74 65 6c 79 2e 0a 2a 2f 0a 73  separately..*/.s
8710: 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65  tatic int sqlite
8720: 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
8730: 72 6f 72 28 69 6e 74 20 70 6f 73 69 78 45 72 72  ror(int posixErr
8740: 6f 72 2c 20 69 6e 74 20 73 71 6c 69 74 65 49 4f  or, int sqliteIO
8750: 45 72 72 29 20 7b 0a 20 20 73 77 69 74 63 68 20  Err) {.  switch 
8760: 28 70 6f 73 69 78 45 72 72 6f 72 29 20 7b 0a 23  (posixError) {.#
8770: 69 66 20 30 0a 20 20 2f 2a 20 41 74 20 6f 6e 65  if 0.  /* At one
8780: 20 70 6f 69 6e 74 20 74 68 69 73 20 63 6f 64 65   point this code
8790: 20 77 61 73 20 6e 6f 74 20 63 6f 6d 6d 65 6e 74   was not comment
87a0: 65 64 20 6f 75 74 2e 20 49 6e 20 74 68 65 6f 72  ed out. In theor
87b0: 79 2c 20 74 68 69 73 20 62 72 61 6e 63 68 0a 20  y, this branch. 
87c0: 20 2a 2a 20 73 68 6f 75 6c 64 20 6e 65 76 65 72   ** should never
87d0: 20 62 65 20 68 69 74 2c 20 61 73 20 74 68 69 73   be hit, as this
87e0: 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64   function should
87f0: 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20   only be called 
8800: 61 66 74 65 72 0a 20 20 2a 2a 20 61 20 6c 6f 63  after.  ** a loc
8810: 6b 69 6e 67 2d 72 65 6c 61 74 65 64 20 66 75 6e  king-related fun
8820: 63 74 69 6f 6e 20 28 69 2e 65 2e 20 66 63 6e 74  ction (i.e. fcnt
8830: 6c 28 29 29 20 68 61 73 20 72 65 74 75 72 6e 65  l()) has returne
8840: 64 20 6e 6f 6e 2d 7a 65 72 6f 20 77 69 74 68 0a  d non-zero with.
8850: 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f    ** the value o
8860: 66 20 65 72 72 6e 6f 20 61 73 20 74 68 65 20 66  f errno as the f
8870: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 53  irst argument. S
8880: 69 6e 63 65 20 61 20 73 79 73 74 65 6d 20 63 61  ince a system ca
8890: 6c 6c 20 68 61 73 20 66 61 69 6c 65 64 2c 0a 20  ll has failed,. 
88a0: 20 2a 2a 20 65 72 72 6e 6f 20 73 68 6f 75 6c 64   ** errno should
88b0: 20 62 65 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 20 20   be non-zero..  
88c0: 2a 2a 0a 20 20 2a 2a 20 44 65 73 70 69 74 65 20  **.  ** Despite 
88d0: 74 68 69 73 2c 20 69 66 20 65 72 72 6e 6f 20 72  this, if errno r
88e0: 65 61 6c 6c 79 20 69 73 20 7a 65 72 6f 2c 20 77  eally is zero, w
88f0: 65 20 73 74 69 6c 6c 20 64 6f 6e 27 74 20 77 61  e still don't wa
8900: 6e 74 20 74 6f 20 72 65 74 75 72 6e 0a 20 20 2a  nt to return.  *
8910: 2a 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 54 68 65  * SQLITE_OK. The
8920: 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 66 61 69   system call fai
8930: 6c 65 64 2c 20 61 6e 64 20 2a 73 6f 6d 65 2a 20  led, and *some* 
8940: 53 51 4c 69 74 65 20 65 72 72 6f 72 20 73 68 6f  SQLite error sho
8950: 75 6c 64 20 62 65 0a 20 20 2a 2a 20 70 72 6f 70  uld be.  ** prop
8960: 61 67 61 74 65 64 20 62 61 63 6b 20 74 6f 20 74  agated back to t
8970: 68 65 20 63 61 6c 6c 65 72 2e 20 43 6f 6d 6d 65  he caller. Comme
8980: 6e 74 69 6e 67 20 74 68 69 73 20 62 72 61 6e 63  nting this branc
8990: 68 20 6f 75 74 20 6d 65 61 6e 73 20 65 72 72 6e  h out means errn
89a0: 6f 3d 3d 30 0a 20 20 2a 2a 20 77 69 6c 6c 20 62  o==0.  ** will b
89b0: 65 20 68 61 6e 64 6c 65 64 20 62 79 20 74 68 65  e handled by the
89c0: 20 22 64 65 66 61 75 6c 74 3a 22 20 63 61 73 65   "default:" case
89d0: 20 62 65 6c 6f 77 2e 0a 20 20 2a 2f 0a 20 20 63   below..  */.  c
89e0: 61 73 65 20 30 3a 20 0a 20 20 20 20 72 65 74 75  ase 0: .    retu
89f0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65  rn SQLITE_OK;.#e
8a00: 6e 64 69 66 0a 0a 20 20 63 61 73 65 20 45 41 47  ndif..  case EAG
8a10: 41 49 4e 3a 0a 20 20 63 61 73 65 20 45 54 49 4d  AIN:.  case ETIM
8a20: 45 44 4f 55 54 3a 0a 20 20 63 61 73 65 20 45 42  EDOUT:.  case EB
8a30: 55 53 59 3a 0a 20 20 63 61 73 65 20 45 49 4e 54  USY:.  case EINT
8a40: 52 3a 0a 20 20 63 61 73 65 20 45 4e 4f 4c 43 4b  R:.  case ENOLCK
8a50: 3a 20 20 0a 20 20 20 20 2f 2a 20 72 61 6e 64 6f  :  .    /* rando
8a60: 6d 20 4e 46 53 20 72 65 74 72 79 20 65 72 72 6f  m NFS retry erro
8a70: 72 2c 20 75 6e 6c 65 73 73 20 64 75 72 69 6e 67  r, unless during
8a80: 20 66 69 6c 65 20 73 79 73 74 65 6d 20 73 75 70   file system sup
8a90: 70 6f 72 74 20 0a 20 20 20 20 20 2a 20 69 6e 74  port .     * int
8aa0: 72 6f 73 70 65 63 74 69 6f 6e 2c 20 69 6e 20 77  rospection, in w
8ab0: 68 69 63 68 20 69 74 20 61 63 74 75 61 6c 6c 79  hich it actually
8ac0: 20 6d 65 61 6e 73 20 77 68 61 74 20 69 74 20 73   means what it s
8ad0: 61 79 73 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  ays */.    retur
8ae0: 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  n SQLITE_BUSY;. 
8af0: 20 20 20 0a 20 20 63 61 73 65 20 45 41 43 43 45     .  case EACCE
8b00: 53 3a 20 0a 20 20 20 20 2f 2a 20 45 41 43 43 45  S: .    /* EACCE
8b10: 53 20 69 73 20 6c 69 6b 65 20 45 41 47 41 49 4e  S is like EAGAIN
8b20: 20 64 75 72 69 6e 67 20 6c 6f 63 6b 69 6e 67 20   during locking 
8b30: 6f 70 65 72 61 74 69 6f 6e 73 2c 20 62 75 74 20  operations, but 
8b40: 6e 6f 74 20 61 6e 79 20 6f 74 68 65 72 20 74 69  not any other ti
8b50: 6d 65 2a 2f 0a 20 20 20 20 69 66 28 20 28 73 71  me*/.    if( (sq
8b60: 6c 69 74 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c  liteIOErr == SQL
8b70: 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 20  ITE_IOERR_LOCK) 
8b80: 7c 7c 20 0a 20 20 20 20 20 20 20 20 28 73 71 6c  || .        (sql
8b90: 69 74 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49  iteIOErr == SQLI
8ba0: 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29  TE_IOERR_UNLOCK)
8bb0: 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 28 73 71   || .        (sq
8bc0: 6c 69 74 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c  liteIOErr == SQL
8bd0: 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b  ITE_IOERR_RDLOCK
8be0: 29 20 7c 7c 0a 20 20 20 20 20 20 20 20 28 73 71  ) ||.        (sq
8bf0: 6c 69 74 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c  liteIOErr == SQL
8c00: 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52  ITE_IOERR_CHECKR
8c10: 45 53 45 52 56 45 44 4c 4f 43 4b 29 20 29 7b 0a  ESERVEDLOCK) ){.
8c20: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
8c30: 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a  ITE_BUSY;.    }.
8c40: 20 20 20 20 2f 2a 20 65 6c 73 65 20 66 61 6c 6c      /* else fall
8c50: 20 74 68 72 6f 75 67 68 20 2a 2f 0a 20 20 63 61   through */.  ca
8c60: 73 65 20 45 50 45 52 4d 3a 20 0a 20 20 20 20 72  se EPERM: .    r
8c70: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52  eturn SQLITE_PER
8c80: 4d 3b 0a 20 20 20 20 0a 23 69 66 20 45 4f 50 4e  M;.    .#if EOPN
8c90: 4f 54 53 55 50 50 21 3d 45 4e 4f 54 53 55 50 0a  OTSUPP!=ENOTSUP.
8ca0: 20 20 63 61 73 65 20 45 4f 50 4e 4f 54 53 55 50    case EOPNOTSUP
8cb0: 50 3a 20 0a 20 20 20 20 2f 2a 20 73 6f 6d 65 74  P: .    /* somet
8cc0: 68 69 6e 67 20 77 65 6e 74 20 74 65 72 72 69 62  hing went terrib
8cd0: 6c 79 20 61 77 72 79 2c 20 75 6e 6c 65 73 73 20  ly awry, unless 
8ce0: 64 75 72 69 6e 67 20 66 69 6c 65 20 73 79 73 74  during file syst
8cf0: 65 6d 20 73 75 70 70 6f 72 74 20 0a 20 20 20 20  em support .    
8d00: 20 2a 20 69 6e 74 72 6f 73 70 65 63 74 69 6f 6e   * introspection
8d10: 2c 20 69 6e 20 77 68 69 63 68 20 69 74 20 61 63  , in which it ac
8d20: 74 75 61 6c 6c 79 20 6d 65 61 6e 73 20 77 68 61  tually means wha
8d30: 74 20 69 74 20 73 61 79 73 20 2a 2f 0a 23 65 6e  t it says */.#en
8d40: 64 69 66 0a 23 69 66 64 65 66 20 45 4e 4f 54 53  dif.#ifdef ENOTS
8d50: 55 50 0a 20 20 63 61 73 65 20 45 4e 4f 54 53 55  UP.  case ENOTSU
8d60: 50 3a 20 0a 20 20 20 20 2f 2a 20 69 6e 76 61 6c  P: .    /* inval
8d70: 69 64 20 66 64 2c 20 75 6e 6c 65 73 73 20 64 75  id fd, unless du
8d80: 72 69 6e 67 20 66 69 6c 65 20 73 79 73 74 65 6d  ring file system
8d90: 20 73 75 70 70 6f 72 74 20 69 6e 74 72 6f 73 70   support introsp
8da0: 65 63 74 69 6f 6e 2c 20 69 6e 20 77 68 69 63 68  ection, in which
8db0: 20 0a 20 20 20 20 20 2a 20 69 74 20 61 63 74 75   .     * it actu
8dc0: 61 6c 6c 79 20 6d 65 61 6e 73 20 77 68 61 74 20  ally means what 
8dd0: 69 74 20 73 61 79 73 20 2a 2f 0a 23 65 6e 64 69  it says */.#endi
8de0: 66 0a 20 20 63 61 73 65 20 45 49 4f 3a 0a 20 20  f.  case EIO:.  
8df0: 63 61 73 65 20 45 42 41 44 46 3a 0a 20 20 63 61  case EBADF:.  ca
8e00: 73 65 20 45 49 4e 56 41 4c 3a 0a 20 20 63 61 73  se EINVAL:.  cas
8e10: 65 20 45 4e 4f 54 43 4f 4e 4e 3a 0a 20 20 63 61  e ENOTCONN:.  ca
8e20: 73 65 20 45 4e 4f 44 45 56 3a 0a 20 20 63 61 73  se ENODEV:.  cas
8e30: 65 20 45 4e 58 49 4f 3a 0a 20 20 63 61 73 65 20  e ENXIO:.  case 
8e40: 45 4e 4f 45 4e 54 3a 0a 23 69 66 64 65 66 20 45  ENOENT:.#ifdef E
8e50: 53 54 41 4c 45 20 20 20 20 20 20 20 20 20 20 20  STALE           
8e60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 53 54            /* EST
8e70: 41 4c 45 20 69 73 20 6e 6f 74 20 64 65 66 69 6e  ALE is not defin
8e80: 65 64 20 6f 6e 20 49 6e 74 65 72 69 78 20 73 79  ed on Interix sy
8e90: 73 74 65 6d 73 20 2a 2f 0a 20 20 63 61 73 65 20  stems */.  case 
8ea0: 45 53 54 41 4c 45 3a 0a 23 65 6e 64 69 66 0a 20  ESTALE:.#endif. 
8eb0: 20 63 61 73 65 20 45 4e 4f 53 59 53 3a 0a 20 20   case ENOSYS:.  
8ec0: 20 20 2f 2a 20 74 68 65 73 65 20 73 68 6f 75 6c    /* these shoul
8ed0: 64 20 66 6f 72 63 65 20 74 68 65 20 63 6c 69 65  d force the clie
8ee0: 6e 74 20 74 6f 20 63 6c 6f 73 65 20 74 68 65 20  nt to close the 
8ef0: 66 69 6c 65 20 61 6e 64 20 72 65 63 6f 6e 6e 65  file and reconne
8f00: 63 74 20 2a 2f 0a 20 20 20 20 0a 20 20 64 65 66  ct */.    .  def
8f10: 61 75 6c 74 3a 20 0a 20 20 20 20 72 65 74 75 72  ault: .    retur
8f20: 6e 20 73 71 6c 69 74 65 49 4f 45 72 72 3b 0a 20  n sqliteIOErr;. 
8f30: 20 7d 0a 7d 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a   }.}.../********
8f40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8f50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8f60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8f70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
8f80: 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
8f90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20  ********* Begin 
8fa0: 55 6e 69 71 75 65 20 46 69 6c 65 20 49 44 20 55  Unique File ID U
8fb0: 74 69 6c 69 74 79 20 55 73 65 64 20 42 79 20 56  tility Used By V
8fc0: 78 57 6f 72 6b 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  xWorks *********
8fd0: 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4f 6e 20  ******.**.** On 
8fe0: 6d 6f 73 74 20 76 65 72 73 69 6f 6e 73 20 6f 66  most versions of
8ff0: 20 75 6e 69 78 2c 20 77 65 20 63 61 6e 20 67 65   unix, we can ge
9000: 74 20 61 20 75 6e 69 71 75 65 20 49 44 20 66 6f  t a unique ID fo
9010: 72 20 61 20 66 69 6c 65 20 62 79 20 63 6f 6e 63  r a file by conc
9020: 61 74 65 6e 61 74 69 6e 67 0a 2a 2a 20 74 68 65  atenating.** the
9030: 20 64 65 76 69 63 65 20 6e 75 6d 62 65 72 20 61   device number a
9040: 6e 64 20 74 68 65 20 69 6e 6f 64 65 20 6e 75 6d  nd the inode num
9050: 62 65 72 2e 20 20 42 75 74 20 74 68 69 73 20 64  ber.  But this d
9060: 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20  oes not work on 
9070: 56 78 57 6f 72 6b 73 2e 0a 2a 2a 20 4f 6e 20 56  VxWorks..** On V
9080: 78 57 6f 72 6b 73 2c 20 61 20 75 6e 69 71 75 65  xWorks, a unique
9090: 20 66 69 6c 65 20 69 64 20 6d 75 73 74 20 62 65   file id must be
90a0: 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 63 61   based on the ca
90b0: 6e 6f 6e 69 63 61 6c 20 66 69 6c 65 6e 61 6d 65  nonical filename
90c0: 2e 0a 2a 2a 0a 2a 2a 20 41 20 70 6f 69 6e 74 65  ..**.** A pointe
90d0: 72 20 74 6f 20 61 6e 20 69 6e 73 74 61 6e 63 65  r to an instance
90e0: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
90f0: 67 20 73 74 72 75 63 74 75 72 65 20 63 61 6e 20  g structure can 
9100: 62 65 20 75 73 65 64 20 61 73 20 61 0a 2a 2a 20  be used as a.** 
9110: 75 6e 69 71 75 65 20 66 69 6c 65 20 49 44 20 69  unique file ID i
9120: 6e 20 56 78 57 6f 72 6b 73 2e 20 20 45 61 63 68  n VxWorks.  Each
9130: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69   instance of thi
9140: 73 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74  s structure cont
9150: 61 69 6e 73 0a 2a 2a 20 61 20 63 6f 70 79 20 6f  ains.** a copy o
9160: 66 20 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c 20  f the canonical 
9170: 66 69 6c 65 6e 61 6d 65 2e 20 20 54 68 65 72 65  filename.  There
9180: 20 69 73 20 61 6c 73 6f 20 61 20 72 65 66 65 72   is also a refer
9190: 65 6e 63 65 20 63 6f 75 6e 74 2e 20 20 0a 2a 2a  ence count.  .**
91a0: 20 54 68 65 20 73 74 72 75 63 74 75 72 65 20 69   The structure i
91b0: 73 20 72 65 63 6c 61 69 6d 65 64 20 77 68 65 6e  s reclaimed when
91c0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
91d0: 6f 69 6e 74 65 72 73 20 74 6f 20 69 74 20 64 72  ointers to it dr
91e0: 6f 70 73 20 74 6f 0a 2a 2a 20 7a 65 72 6f 2e 0a  ops to.** zero..
91f0: 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20  **.** There are 
9200: 6e 65 76 65 72 20 76 65 72 79 20 6d 61 6e 79 20  never very many 
9210: 66 69 6c 65 73 20 6f 70 65 6e 20 61 74 20 6f 6e  files open at on
9220: 65 20 74 69 6d 65 20 61 6e 64 20 6c 6f 6f 6b 75  e time and looku
9230: 70 73 20 61 72 65 20 6e 6f 74 0a 2a 2a 20 61 20  ps are not.** a 
9240: 70 65 72 66 6f 72 6d 61 6e 63 65 2d 63 72 69 74  performance-crit
9250: 69 63 61 6c 20 70 61 74 68 2c 20 73 6f 20 69 74  ical path, so it
9260: 20 69 73 20 73 75 66 66 69 63 69 65 6e 74 20 74   is sufficient t
9270: 6f 20 70 75 74 20 74 68 65 73 65 0a 2a 2a 20 73  o put these.** s
9280: 74 72 75 63 74 75 72 65 73 20 6f 6e 20 61 20 6c  tructures on a l
9290: 69 6e 6b 65 64 20 6c 69 73 74 2e 0a 2a 2f 0a 73  inked list..*/.s
92a0: 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c  truct vxworksFil
92b0: 65 49 64 20 7b 0a 20 20 73 74 72 75 63 74 20 76  eId {.  struct v
92c0: 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 4e  xworksFileId *pN
92d0: 65 78 74 3b 20 20 2f 2a 20 4e 65 78 74 20 69 6e  ext;  /* Next in
92e0: 20 61 20 6c 69 73 74 20 6f 66 20 74 68 65 6d 20   a list of them 
92f0: 61 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65  all */.  int nRe
9300: 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
9310: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
9320: 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74   of references t
9330: 6f 20 74 68 69 73 20 6f 6e 65 20 2a 2f 0a 20 20  o this one */.  
9340: 69 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20  int nName;      
9350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9360: 20 4c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 7a   Length of the z
9370: 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 5b 5d 20  CanonicalName[] 
9380: 73 74 72 69 6e 67 20 2a 2f 0a 20 20 63 68 61 72  string */.  char
9390: 20 2a 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65   *zCanonicalName
93a0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61 6e  ;         /* Can
93b0: 6f 6e 69 63 61 6c 20 66 69 6c 65 6e 61 6d 65 20  onical filename 
93c0: 2a 2f 0a 7d 3b 0a 0a 23 69 66 20 4f 53 5f 56 58  */.};..#if OS_VX
93d0: 57 4f 52 4b 53 0a 2f 2a 20 0a 2a 2a 20 41 6c 6c  WORKS./* .** All
93e0: 20 75 6e 69 71 75 65 20 66 69 6c 65 6e 61 6d 65   unique filename
93f0: 73 20 61 72 65 20 68 65 6c 64 20 6f 6e 20 61 20  s are held on a 
9400: 6c 69 6e 6b 65 64 20 6c 69 73 74 20 68 65 61 64  linked list head
9410: 65 64 20 62 79 20 74 68 69 73 0a 2a 2a 20 76 61  ed by this.** va
9420: 72 69 61 62 6c 65 3a 0a 2a 2f 0a 73 74 61 74 69  riable:.*/.stati
9430: 63 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73  c struct vxworks
9440: 46 69 6c 65 49 64 20 2a 76 78 77 6f 72 6b 73 46  FileId *vxworksF
9450: 69 6c 65 4c 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a  ileList = 0;../*
9460: 0a 2a 2a 20 53 69 6d 70 6c 69 66 79 20 61 20 66  .** Simplify a f
9470: 69 6c 65 6e 61 6d 65 20 69 6e 74 6f 20 69 74 73  ilename into its
9480: 20 63 61 6e 6f 6e 69 63 61 6c 20 66 6f 72 6d 0a   canonical form.
9490: 2a 2a 20 62 79 20 6d 61 6b 69 6e 67 20 74 68 65  ** by making the
94a0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 6e 67   following chang
94b0: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 2a 20 72 65 6d  es:.**.**  * rem
94c0: 6f 76 69 6e 67 20 61 6e 79 20 74 72 61 69 6c 69  oving any traili
94d0: 6e 67 20 61 6e 64 20 64 75 70 6c 69 63 61 74 65  ng and duplicate
94e0: 20 2f 0a 2a 2a 20 20 2a 20 63 6f 6e 76 65 72 74   /.**  * convert
94f0: 20 2f 2e 2f 20 69 6e 74 6f 20 6a 75 73 74 20 2f   /./ into just /
9500: 0a 2a 2a 20 20 2a 20 63 6f 6e 76 65 72 74 20 2f  .**  * convert /
9510: 41 2f 2e 2e 2f 20 77 68 65 72 65 20 41 20 69 73  A/../ where A is
9520: 20 61 6e 79 20 73 69 6d 70 6c 65 20 6e 61 6d 65   any simple name
9530: 20 69 6e 74 6f 20 6a 75 73 74 20 2f 0a 2a 2a 0a   into just /.**.
9540: 2a 2a 20 43 68 61 6e 67 65 73 20 61 72 65 20 6d  ** Changes are m
9550: 61 64 65 20 69 6e 2d 70 6c 61 63 65 2e 20 20 52  ade in-place.  R
9560: 65 74 75 72 6e 20 74 68 65 20 6e 65 77 20 6e 61  eturn the new na
9570: 6d 65 20 6c 65 6e 67 74 68 2e 0a 2a 2a 0a 2a 2a  me length..**.**
9580: 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 66 69   The original fi
9590: 6c 65 6e 61 6d 65 20 69 73 20 69 6e 20 7a 5b 30  lename is in z[0
95a0: 2e 2e 6e 2d 31 5d 2e 20 20 52 65 74 75 72 6e 20  ..n-1].  Return 
95b0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a  the number of.**
95c0: 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 74   characters in t
95d0: 68 65 20 73 69 6d 70 6c 69 66 69 65 64 20 6e 61  he simplified na
95e0: 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  me..*/.static in
95f0: 74 20 76 78 77 6f 72 6b 73 53 69 6d 70 6c 69 66  t vxworksSimplif
9600: 79 4e 61 6d 65 28 63 68 61 72 20 2a 7a 2c 20 69  yName(char *z, i
9610: 6e 74 20 6e 29 7b 0a 20 20 69 6e 74 20 69 2c 20  nt n){.  int i, 
9620: 6a 3b 0a 20 20 77 68 69 6c 65 28 20 6e 3e 31 20  j;.  while( n>1 
9630: 26 26 20 7a 5b 6e 2d 31 5d 3d 3d 27 2f 27 20 29  && z[n-1]=='/' )
9640: 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 66 6f 72 28 69  { n--; }.  for(i
9650: 3d 6a 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b  =j=0; i<n; i++){
9660: 0a 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 27  .    if( z[i]=='
9670: 2f 27 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  /' ){.      if( 
9680: 7a 5b 69 2b 31 5d 3d 3d 27 2f 27 20 29 20 63 6f  z[i+1]=='/' ) co
9690: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66  ntinue;.      if
96a0: 28 20 7a 5b 69 2b 31 5d 3d 3d 27 2e 27 20 26 26  ( z[i+1]=='.' &&
96b0: 20 69 2b 32 3c 6e 20 26 26 20 7a 5b 69 2b 32 5d   i+2<n && z[i+2]
96c0: 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 20  =='/' ){.       
96d0: 20 69 20 2b 3d 20 31 3b 0a 20 20 20 20 20 20 20   i += 1;.       
96e0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
96f0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 69   }.      if( z[i
9700: 2b 31 5d 3d 3d 27 2e 27 20 26 26 20 69 2b 33 3c  +1]=='.' && i+3<
9710: 6e 20 26 26 20 7a 5b 69 2b 32 5d 3d 3d 27 2e 27  n && z[i+2]=='.'
9720: 20 26 26 20 7a 5b 69 2b 33 5d 3d 3d 27 2f 27 20   && z[i+3]=='/' 
9730: 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  ){.        while
9740: 28 20 6a 3e 30 20 26 26 20 7a 5b 6a 2d 31 5d 21  ( j>0 && z[j-1]!
9750: 3d 27 2f 27 20 29 7b 20 6a 2d 2d 3b 20 7d 0a 20  ='/' ){ j--; }. 
9760: 20 20 20 20 20 20 20 69 66 28 20 6a 3e 30 20 29         if( j>0 )
9770: 7b 20 6a 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 20  { j--; }.       
9780: 20 69 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 20   i += 2;.       
9790: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
97a0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 5b 6a   }.    }.    z[j
97b0: 2b 2b 5d 20 3d 20 7a 5b 69 5d 3b 0a 20 20 7d 0a  ++] = z[i];.  }.
97c0: 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20 72 65    z[j] = 0;.  re
97d0: 74 75 72 6e 20 6a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn j;.}../*.**
97e0: 20 46 69 6e 64 20 61 20 75 6e 69 71 75 65 20 66   Find a unique f
97f0: 69 6c 65 20 49 44 20 66 6f 72 20 74 68 65 20 67  ile ID for the g
9800: 69 76 65 6e 20 61 62 73 6f 6c 75 74 65 20 70 61  iven absolute pa
9810: 74 68 6e 61 6d 65 2e 20 20 52 65 74 75 72 6e 0a  thname.  Return.
9820: 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ** a pointer to 
9830: 74 68 65 20 76 78 77 6f 72 6b 73 46 69 6c 65 49  the vxworksFileI
9840: 64 20 6f 62 6a 65 63 74 2e 20 20 54 68 69 73 20  d object.  This 
9850: 70 6f 69 6e 74 65 72 20 69 73 20 74 68 65 20 75  pointer is the u
9860: 6e 69 71 75 65 0a 2a 2a 20 66 69 6c 65 20 49 44  nique.** file ID
9870: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 52 65 66  ..**.** The nRef
9880: 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 76 78   field of the vx
9890: 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65  worksFileId obje
98a0: 63 74 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65  ct is incremente
98b0: 64 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20  d before.** the 
98c0: 6f 62 6a 65 63 74 20 69 73 20 72 65 74 75 72 6e  object is return
98d0: 65 64 2e 20 20 41 20 6e 65 77 20 76 78 77 6f 72  ed.  A new vxwor
98e0: 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65 63 74 20  ksFileId object 
98f0: 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e  is created.** an
9900: 64 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 67  d added to the g
9910: 6c 6f 62 61 6c 20 6c 69 73 74 20 69 66 20 6e 65  lobal list if ne
9920: 63 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 49  cessary..**.** I
9930: 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  f a memory alloc
9940: 61 74 69 6f 6e 20 65 72 72 6f 72 20 6f 63 63 75  ation error occu
9950: 72 73 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e  rs, return NULL.
9960: 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63  .*/.static struc
9970: 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  t vxworksFileId 
9980: 2a 76 78 77 6f 72 6b 73 46 69 6e 64 46 69 6c 65  *vxworksFindFile
9990: 49 64 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  Id(const char *z
99a0: 41 62 73 6f 6c 75 74 65 4e 61 6d 65 29 7b 0a 20  AbsoluteName){. 
99b0: 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46   struct vxworksF
99c0: 69 6c 65 49 64 20 2a 70 4e 65 77 3b 20 20 20 20  ileId *pNew;    
99d0: 20 20 20 20 20 2f 2a 20 73 65 61 72 63 68 20 6b       /* search k
99e0: 65 79 20 61 6e 64 20 6e 65 77 20 66 69 6c 65 20  ey and new file 
99f0: 49 44 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 76  ID */.  struct v
9a00: 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 43  xworksFileId *pC
9a10: 61 6e 64 69 64 61 74 65 3b 20 20 20 2f 2a 20 46  andidate;   /* F
9a20: 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20  or looping over 
9a30: 65 78 69 73 74 69 6e 67 20 66 69 6c 65 20 49 44  existing file ID
9a40: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20  s */.  int n;   
9a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65             /* Le
9a70: 6e 67 74 68 20 6f 66 20 7a 41 62 73 6f 6c 75 74  ngth of zAbsolut
9a80: 65 4e 61 6d 65 20 73 74 72 69 6e 67 20 2a 2f 0a  eName string */.
9a90: 0a 20 20 61 73 73 65 72 74 28 20 7a 41 62 73 6f  .  assert( zAbso
9aa0: 6c 75 74 65 4e 61 6d 65 5b 30 5d 3d 3d 27 2f 27  luteName[0]=='/'
9ab0: 20 29 3b 0a 20 20 6e 20 3d 20 28 69 6e 74 29 73   );.  n = (int)s
9ac0: 74 72 6c 65 6e 28 7a 41 62 73 6f 6c 75 74 65 4e  trlen(zAbsoluteN
9ad0: 61 6d 65 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73  ame);.  pNew = s
9ae0: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73  qlite3_malloc( s
9af0: 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 2b 20 28  izeof(*pNew) + (
9b00: 6e 2b 31 29 20 29 3b 0a 20 20 69 66 28 20 70 4e  n+1) );.  if( pN
9b10: 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ew==0 ) return 0
9b20: 3b 0a 20 20 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e  ;.  pNew->zCanon
9b30: 69 63 61 6c 4e 61 6d 65 20 3d 20 28 63 68 61 72  icalName = (char
9b40: 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a 20 20 6d 65  *)&pNew[1];.  me
9b50: 6d 63 70 79 28 70 4e 65 77 2d 3e 7a 43 61 6e 6f  mcpy(pNew->zCano
9b60: 6e 69 63 61 6c 4e 61 6d 65 2c 20 7a 41 62 73 6f  nicalName, zAbso
9b70: 6c 75 74 65 4e 61 6d 65 2c 20 6e 2b 31 29 3b 0a  luteName, n+1);.
9b80: 20 20 6e 20 3d 20 76 78 77 6f 72 6b 73 53 69 6d    n = vxworksSim
9b90: 70 6c 69 66 79 4e 61 6d 65 28 70 4e 65 77 2d 3e  plifyName(pNew->
9ba0: 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20  zCanonicalName, 
9bb0: 6e 29 3b 0a 0a 20 20 2f 2a 20 53 65 61 72 63 68  n);..  /* Search
9bc0: 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69 6e 67   for an existing
9bd0: 20 65 6e 74 72 79 20 74 68 61 74 20 6d 61 74 63   entry that matc
9be0: 68 69 6e 67 20 74 68 65 20 63 61 6e 6f 6e 69 63  hing the canonic
9bf0: 61 6c 20 6e 61 6d 65 2e 0a 20 20 2a 2a 20 49 66  al name..  ** If
9c00: 20 66 6f 75 6e 64 2c 20 69 6e 63 72 65 6d 65 6e   found, incremen
9c10: 74 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  t the reference 
9c20: 63 6f 75 6e 74 20 61 6e 64 20 72 65 74 75 72 6e  count and return
9c30: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 0a 20 20   a pointer to.  
9c40: 2a 2a 20 74 68 65 20 65 78 69 73 74 69 6e 67 20  ** the existing 
9c50: 66 69 6c 65 20 49 44 2e 0a 20 20 2a 2f 0a 20 20  file ID..  */.  
9c60: 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
9c70: 3b 0a 20 20 66 6f 72 28 70 43 61 6e 64 69 64 61  ;.  for(pCandida
9c80: 74 65 3d 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69  te=vxworksFileLi
9c90: 73 74 3b 20 70 43 61 6e 64 69 64 61 74 65 3b 20  st; pCandidate; 
9ca0: 70 43 61 6e 64 69 64 61 74 65 3d 70 43 61 6e 64  pCandidate=pCand
9cb0: 69 64 61 74 65 2d 3e 70 4e 65 78 74 29 7b 0a 20  idate->pNext){. 
9cc0: 20 20 20 69 66 28 20 70 43 61 6e 64 69 64 61 74     if( pCandidat
9cd0: 65 2d 3e 6e 4e 61 6d 65 3d 3d 6e 20 0a 20 20 20  e->nName==n .   
9ce0: 20 20 26 26 20 6d 65 6d 63 6d 70 28 70 43 61 6e    && memcmp(pCan
9cf0: 64 69 64 61 74 65 2d 3e 7a 43 61 6e 6f 6e 69 63  didate->zCanonic
9d00: 61 6c 4e 61 6d 65 2c 20 70 4e 65 77 2d 3e 7a 43  alName, pNew->zC
9d10: 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20 6e 29  anonicalName, n)
9d20: 3d 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  ==0.    ){.     
9d30: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
9d40: 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 70 43 61  New);.       pCa
9d50: 6e 64 69 64 61 74 65 2d 3e 6e 52 65 66 2b 2b 3b  ndidate->nRef++;
9d60: 0a 20 20 20 20 20 20 20 75 6e 69 78 4c 65 61 76  .       unixLeav
9d70: 65 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 20 20  eMutex();.      
9d80: 20 72 65 74 75 72 6e 20 70 43 61 6e 64 69 64 61   return pCandida
9d90: 74 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  te;.    }.  }.. 
9da0: 20 2f 2a 20 4e 6f 20 6d 61 74 63 68 20 77 61 73   /* No match was
9db0: 20 66 6f 75 6e 64 2e 20 20 57 65 20 77 69 6c 6c   found.  We will
9dc0: 20 6d 61 6b 65 20 61 20 6e 65 77 20 66 69 6c 65   make a new file
9dd0: 20 49 44 20 2a 2f 0a 20 20 70 4e 65 77 2d 3e 6e   ID */.  pNew->n
9de0: 52 65 66 20 3d 20 31 3b 0a 20 20 70 4e 65 77 2d  Ref = 1;.  pNew-
9df0: 3e 6e 4e 61 6d 65 20 3d 20 6e 3b 0a 20 20 70 4e  >nName = n;.  pN
9e00: 65 77 2d 3e 70 4e 65 78 74 20 3d 20 76 78 77 6f  ew->pNext = vxwo
9e10: 72 6b 73 46 69 6c 65 4c 69 73 74 3b 0a 20 20 76  rksFileList;.  v
9e20: 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74 20 3d  xworksFileList =
9e30: 20 70 4e 65 77 3b 0a 20 20 75 6e 69 78 4c 65 61   pNew;.  unixLea
9e40: 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 72 65 74  veMutex();.  ret
9e50: 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a  urn pNew;.}../*.
9e60: 2a 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65  ** Decrement the
9e70: 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
9e80: 20 6f 6e 20 61 20 76 78 77 6f 72 6b 73 46 69 6c   on a vxworksFil
9e90: 65 49 64 20 6f 62 6a 65 63 74 2e 20 20 46 72 65  eId object.  Fre
9ea0: 65 0a 2a 2a 20 74 68 65 20 6f 62 6a 65 63 74 20  e.** the object 
9eb0: 77 68 65 6e 20 74 68 65 20 72 65 66 65 72 65 6e  when the referen
9ec0: 63 65 20 63 6f 75 6e 74 20 72 65 61 63 68 65 73  ce count reaches
9ed0: 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63   zero..*/.static
9ee0: 20 76 6f 69 64 20 76 78 77 6f 72 6b 73 52 65 6c   void vxworksRel
9ef0: 65 61 73 65 46 69 6c 65 49 64 28 73 74 72 75 63  easeFileId(struc
9f00: 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  t vxworksFileId 
9f10: 2a 70 49 64 29 7b 0a 20 20 75 6e 69 78 45 6e 74  *pId){.  unixEnt
9f20: 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 61 73 73  erMutex();.  ass
9f30: 65 72 74 28 20 70 49 64 2d 3e 6e 52 65 66 3e 30  ert( pId->nRef>0
9f40: 20 29 3b 0a 20 20 70 49 64 2d 3e 6e 52 65 66 2d   );.  pId->nRef-
9f50: 2d 3b 0a 20 20 69 66 28 20 70 49 64 2d 3e 6e 52  -;.  if( pId->nR
9f60: 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74 72  ef==0 ){.    str
9f70: 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49  uct vxworksFileI
9f80: 64 20 2a 2a 70 70 3b 0a 20 20 20 20 66 6f 72 28  d **pp;.    for(
9f90: 70 70 3d 26 76 78 77 6f 72 6b 73 46 69 6c 65 4c  pp=&vxworksFileL
9fa0: 69 73 74 3b 20 2a 70 70 20 26 26 20 2a 70 70 21  ist; *pp && *pp!
9fb0: 3d 70 49 64 3b 20 70 70 20 3d 20 26 28 28 2a 70  =pId; pp = &((*p
9fc0: 70 29 2d 3e 70 4e 65 78 74 29 29 7b 7d 0a 20 20  p)->pNext)){}.  
9fd0: 20 20 61 73 73 65 72 74 28 20 2a 70 70 3d 3d 70    assert( *pp==p
9fe0: 49 64 20 29 3b 0a 20 20 20 20 2a 70 70 20 3d 20  Id );.    *pp = 
9ff0: 70 49 64 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  pId->pNext;.    
a000: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49 64  sqlite3_free(pId
a010: 29 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 4c 65 61  );.  }.  unixLea
a020: 76 65 4d 75 74 65 78 28 29 3b 0a 7d 0a 23 65 6e  veMutex();.}.#en
a030: 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b  dif /* OS_VXWORK
a040: 53 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  S */./**********
a050: 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 55 6e 69  ***** End of Uni
a060: 71 75 65 20 46 69 6c 65 20 49 44 20 55 74 69 6c  que File ID Util
a070: 69 74 79 20 55 73 65 64 20 42 79 20 56 78 57 6f  ity Used By VxWo
a080: 72 6b 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  rks ************
a090: 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
a0a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a0b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a0c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a0d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a0e0: 2a 2a 2a 2f 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  ***/.../********
a0f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a100: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a110: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a120: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a130: 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
a140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a150: 2a 2a 20 50 6f 73 69 78 20 41 64 76 69 73 6f 72  ** Posix Advisor
a160: 79 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a  y Locking ******
a170: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a180: 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 50 4f 53  ******.**.** POS
a190: 49 58 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b  IX advisory lock
a1a0: 73 20 61 72 65 20 62 72 6f 6b 65 6e 20 62 79 20  s are broken by 
a1b0: 64 65 73 69 67 6e 2e 20 20 41 4e 53 49 20 53 54  design.  ANSI ST
a1c0: 44 20 31 30 30 33 2e 31 20 28 31 39 39 36 29 0a  D 1003.1 (1996).
a1d0: 2a 2a 20 73 65 63 74 69 6f 6e 20 36 2e 35 2e 32  ** section 6.5.2
a1e0: 2e 32 20 6c 69 6e 65 73 20 34 38 33 20 74 68 72  .2 lines 483 thr
a1f0: 6f 75 67 68 20 34 39 30 20 73 70 65 63 69 66 79  ough 490 specify
a200: 20 74 68 61 74 20 77 68 65 6e 20 61 20 70 72 6f   that when a pro
a210: 63 65 73 73 0a 2a 2a 20 73 65 74 73 20 6f 72 20  cess.** sets or 
a220: 63 6c 65 61 72 73 20 61 20 6c 6f 63 6b 2c 20 74  clears a lock, t
a230: 68 61 74 20 6f 70 65 72 61 74 69 6f 6e 20 6f 76  hat operation ov
a240: 65 72 72 69 64 65 73 20 61 6e 79 20 70 72 69 6f  errides any prio
a250: 72 20 6c 6f 63 6b 73 20 73 65 74 0a 2a 2a 20 62  r locks set.** b
a260: 79 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65  y the same proce
a270: 73 73 2e 20 20 49 74 20 64 6f 65 73 20 6e 6f 74  ss.  It does not
a280: 20 65 78 70 6c 69 63 69 74 6c 79 20 73 61 79 20   explicitly say 
a290: 73 6f 2c 20 62 75 74 20 74 68 69 73 20 69 6d 70  so, but this imp
a2a0: 6c 69 65 73 0a 2a 2a 20 74 68 61 74 20 69 74 20  lies.** that it 
a2b0: 6f 76 65 72 72 69 64 65 73 20 6c 6f 63 6b 73 20  overrides locks 
a2c0: 73 65 74 20 62 79 20 74 68 65 20 73 61 6d 65 20  set by the same 
a2d0: 70 72 6f 63 65 73 73 20 75 73 69 6e 67 20 61 20  process using a 
a2e0: 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66 69 6c  different.** fil
a2f0: 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 43  e descriptor.  C
a300: 6f 6e 73 69 64 65 72 20 74 68 69 73 20 74 65 73  onsider this tes
a310: 74 20 63 61 73 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  t case:.**.**   
a320: 20 20 20 20 69 6e 74 20 66 64 31 20 3d 20 6f 70      int fd1 = op
a330: 65 6e 28 22 2e 2f 66 69 6c 65 31 22 2c 20 4f 5f  en("./file1", O_
a340: 52 44 57 52 7c 4f 5f 43 52 45 41 54 2c 20 30 36  RDWR|O_CREAT, 06
a350: 34 34 29 3b 0a 2a 2a 20 20 20 20 20 20 20 69 6e  44);.**       in
a360: 74 20 66 64 32 20 3d 20 6f 70 65 6e 28 22 2e 2f  t fd2 = open("./
a370: 66 69 6c 65 32 22 2c 20 4f 5f 52 44 57 52 7c 4f  file2", O_RDWR|O
a380: 5f 43 52 45 41 54 2c 20 30 36 34 34 29 3b 0a 2a  _CREAT, 0644);.*
a390: 2a 0a 2a 2a 20 53 75 70 70 6f 73 65 20 2e 2f 66  *.** Suppose ./f
a3a0: 69 6c 65 31 20 61 6e 64 20 2e 2f 66 69 6c 65 32  ile1 and ./file2
a3b0: 20 61 72 65 20 72 65 61 6c 6c 79 20 74 68 65 20   are really the 
a3c0: 73 61 6d 65 20 66 69 6c 65 20 28 62 65 63 61 75  same file (becau
a3d0: 73 65 0a 2a 2a 20 6f 6e 65 20 69 73 20 61 20 68  se.** one is a h
a3e0: 61 72 64 20 6f 72 20 73 79 6d 62 6f 6c 69 63 20  ard or symbolic 
a3f0: 6c 69 6e 6b 20 74 6f 20 74 68 65 20 6f 74 68 65  link to the othe
a400: 72 29 20 74 68 65 6e 20 69 66 20 79 6f 75 20 73  r) then if you s
a410: 65 74 0a 2a 2a 20 61 6e 20 65 78 63 6c 75 73 69  et.** an exclusi
a420: 76 65 20 6c 6f 63 6b 20 6f 6e 20 66 64 31 2c 20  ve lock on fd1, 
a430: 74 68 65 6e 20 74 72 79 20 74 6f 20 67 65 74 20  then try to get 
a440: 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
a450: 6b 0a 2a 2a 20 6f 6e 20 66 64 32 2c 20 69 74 20  k.** on fd2, it 
a460: 77 6f 72 6b 73 2e 20 20 49 20 77 6f 75 6c 64 20  works.  I would 
a470: 68 61 76 65 20 65 78 70 65 63 74 65 64 20 74 68  have expected th
a480: 65 20 73 65 63 6f 6e 64 20 6c 6f 63 6b 20 74 6f  e second lock to
a490: 0a 2a 2a 20 66 61 69 6c 20 73 69 6e 63 65 20 74  .** fail since t
a4a0: 68 65 72 65 20 77 61 73 20 61 6c 72 65 61 64 79  here was already
a4b0: 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66   a lock on the f
a4c0: 69 6c 65 20 64 75 65 20 74 6f 20 66 64 31 2e 0a  ile due to fd1..
a4d0: 2a 2a 20 42 75 74 20 6e 6f 74 20 73 6f 2e 20 20  ** But not so.  
a4e0: 53 69 6e 63 65 20 62 6f 74 68 20 6c 6f 63 6b 73  Since both locks
a4f0: 20 63 61 6d 65 20 66 72 6f 6d 20 74 68 65 20 73   came from the s
a500: 61 6d 65 20 70 72 6f 63 65 73 73 2c 20 74 68 65  ame process, the
a510: 0a 2a 2a 20 73 65 63 6f 6e 64 20 6f 76 65 72 72  .** second overr
a520: 69 64 65 73 20 74 68 65 20 66 69 72 73 74 2c 20  ides the first, 
a530: 65 76 65 6e 20 74 68 6f 75 67 68 20 74 68 65 79  even though they
a540: 20 77 65 72 65 20 6f 6e 20 64 69 66 66 65 72 65   were on differe
a550: 6e 74 0a 2a 2a 20 66 69 6c 65 20 64 65 73 63 72  nt.** file descr
a560: 69 70 74 6f 72 73 20 6f 70 65 6e 65 64 20 6f 6e  iptors opened on
a570: 20 64 69 66 66 65 72 65 6e 74 20 66 69 6c 65 20   different file 
a580: 6e 61 6d 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  names..**.** Thi
a590: 73 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20  s means that we 
a5a0: 63 61 6e 6e 6f 74 20 75 73 65 20 50 4f 53 49 58  cannot use POSIX
a5b0: 20 6c 6f 63 6b 73 20 74 6f 20 73 79 6e 63 68 72   locks to synchr
a5c0: 6f 6e 69 7a 65 20 66 69 6c 65 20 61 63 63 65 73  onize file acces
a5d0: 73 0a 2a 2a 20 61 6d 6f 6e 67 20 63 6f 6d 70 65  s.** among compe
a5e0: 74 69 6e 67 20 74 68 72 65 61 64 73 20 6f 66 20  ting threads of 
a5f0: 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73  the same process
a600: 2e 20 20 50 4f 53 49 58 20 6c 6f 63 6b 73 20 77  .  POSIX locks w
a610: 69 6c 6c 20 77 6f 72 6b 20 66 69 6e 65 0a 2a 2a  ill work fine.**
a620: 20 74 6f 20 73 79 6e 63 68 72 6f 6e 69 7a 65 20   to synchronize 
a630: 61 63 63 65 73 73 20 66 6f 72 20 74 68 72 65 61  access for threa
a640: 64 73 20 69 6e 20 73 65 70 61 72 61 74 65 20 70  ds in separate p
a650: 72 6f 63 65 73 73 65 73 2c 20 62 75 74 20 6e 6f  rocesses, but no
a660: 74 0a 2a 2a 20 74 68 72 65 61 64 73 20 77 69 74  t.** threads wit
a670: 68 69 6e 20 74 68 65 20 73 61 6d 65 20 70 72 6f  hin the same pro
a680: 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 77  cess..**.** To w
a690: 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 65 20 70  ork around the p
a6a0: 72 6f 62 6c 65 6d 2c 20 53 51 4c 69 74 65 20 68  roblem, SQLite h
a6b0: 61 73 20 74 6f 20 6d 61 6e 61 67 65 20 66 69 6c  as to manage fil
a6c0: 65 20 6c 6f 63 6b 73 20 69 6e 74 65 72 6e 61 6c  e locks internal
a6d0: 6c 79 0a 2a 2a 20 6f 6e 20 69 74 73 20 6f 77 6e  ly.** on its own
a6e0: 2e 20 20 57 68 65 6e 65 76 65 72 20 61 20 6e 65  .  Whenever a ne
a6f0: 77 20 64 61 74 61 62 61 73 65 20 69 73 20 6f 70  w database is op
a700: 65 6e 65 64 2c 20 77 65 20 68 61 76 65 20 74 6f  ened, we have to
a710: 20 66 69 6e 64 20 74 68 65 0a 2a 2a 20 73 70 65   find the.** spe
a720: 63 69 66 69 63 20 69 6e 6f 64 65 20 6f 66 20 74  cific inode of t
a730: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
a740: 20 28 74 68 65 20 69 6e 6f 64 65 20 69 73 20 64   (the inode is d
a750: 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65  etermined by the
a760: 0a 2a 2a 20 73 74 5f 64 65 76 20 61 6e 64 20 73  .** st_dev and s
a770: 74 5f 69 6e 6f 20 66 69 65 6c 64 73 20 6f 66 20  t_ino fields of 
a780: 74 68 65 20 73 74 61 74 20 73 74 72 75 63 74 75  the stat structu
a790: 72 65 20 74 68 61 74 20 66 73 74 61 74 28 29 20  re that fstat() 
a7a0: 66 69 6c 6c 73 20 69 6e 29 0a 2a 2a 20 61 6e 64  fills in).** and
a7b0: 20 63 68 65 63 6b 20 66 6f 72 20 6c 6f 63 6b 73   check for locks
a7c0: 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 69 6e   already existin
a7d0: 67 20 6f 6e 20 74 68 61 74 20 69 6e 6f 64 65 2e  g on that inode.
a7e0: 20 20 57 68 65 6e 20 6c 6f 63 6b 73 20 61 72 65    When locks are
a7f0: 0a 2a 2a 20 63 72 65 61 74 65 64 20 6f 72 20 72  .** created or r
a800: 65 6d 6f 76 65 64 2c 20 77 65 20 68 61 76 65 20  emoved, we have 
a810: 74 6f 20 6c 6f 6f 6b 20 61 74 20 6f 75 72 20 6f  to look at our o
a820: 77 6e 20 69 6e 74 65 72 6e 61 6c 20 72 65 63 6f  wn internal reco
a830: 72 64 20 6f 66 20 74 68 65 0a 2a 2a 20 6c 6f 63  rd of the.** loc
a840: 6b 73 20 74 6f 20 73 65 65 20 69 66 20 61 6e 6f  ks to see if ano
a850: 74 68 65 72 20 74 68 72 65 61 64 20 68 61 73 20  ther thread has 
a860: 70 72 65 76 69 6f 75 73 6c 79 20 73 65 74 20 61  previously set a
a870: 20 6c 6f 63 6b 20 6f 6e 20 74 68 61 74 20 73 61   lock on that sa
a880: 6d 65 0a 2a 2a 20 69 6e 6f 64 65 2e 0a 2a 2a 0a  me.** inode..**.
a890: 2a 2a 20 28 41 73 69 64 65 3a 20 54 68 65 20 75  ** (Aside: The u
a8a0: 73 65 20 6f 66 20 69 6e 6f 64 65 20 6e 75 6d 62  se of inode numb
a8b0: 65 72 73 20 61 73 20 75 6e 69 71 75 65 20 49 44  ers as unique ID
a8c0: 73 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20  s does not work 
a8d0: 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a 20 46  on VxWorks..** F
a8e0: 6f 72 20 56 78 57 6f 72 6b 73 2c 20 77 65 20 68  or VxWorks, we h
a8f0: 61 76 65 20 74 6f 20 75 73 65 20 74 68 65 20 61  ave to use the a
a900: 6c 74 65 72 6e 61 74 69 76 65 20 75 6e 69 71 75  lternative uniqu
a910: 65 20 49 44 20 73 79 73 74 65 6d 20 62 61 73 65  e ID system base
a920: 64 20 6f 6e 0a 2a 2a 20 63 61 6e 6f 6e 69 63 61  d on.** canonica
a930: 6c 20 66 69 6c 65 6e 61 6d 65 20 61 6e 64 20 69  l filename and i
a940: 6d 70 6c 65 6d 65 6e 74 65 64 20 69 6e 20 74 68  mplemented in th
a950: 65 20 70 72 65 76 69 6f 75 73 20 64 69 76 69 73  e previous divis
a960: 69 6f 6e 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ion.).**.** The 
a970: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 73 74 72  sqlite3_file str
a980: 75 63 74 75 72 65 20 66 6f 72 20 50 4f 53 49 58  ucture for POSIX
a990: 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6a 75   is no longer ju
a9a0: 73 74 20 61 6e 20 69 6e 74 65 67 65 72 20 66 69  st an integer fi
a9b0: 6c 65 0a 2a 2a 20 64 65 73 63 72 69 70 74 6f 72  le.** descriptor
a9c0: 2e 20 20 49 74 20 69 73 20 6e 6f 77 20 61 20 73  .  It is now a s
a9d0: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 68 6f  tructure that ho
a9e0: 6c 64 73 20 74 68 65 20 69 6e 74 65 67 65 72 20  lds the integer 
a9f0: 66 69 6c 65 0a 2a 2a 20 64 65 73 63 72 69 70 74  file.** descript
aa00: 6f 72 20 61 6e 64 20 61 20 70 6f 69 6e 74 65 72  or and a pointer
aa10: 20 74 6f 20 61 20 73 74 72 75 63 74 75 72 65 20   to a structure 
aa20: 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20 74  that describes t
aa30: 68 65 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a 20 6c  he internal.** l
aa40: 6f 63 6b 73 20 6f 6e 20 74 68 65 20 63 6f 72 72  ocks on the corr
aa50: 65 73 70 6f 6e 64 69 6e 67 20 69 6e 6f 64 65 2e  esponding inode.
aa60: 20 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20 6c    There is one l
aa70: 6f 63 6b 69 6e 67 20 73 74 72 75 63 74 75 72 65  ocking structure
aa80: 0a 2a 2a 20 70 65 72 20 69 6e 6f 64 65 2c 20 73  .** per inode, s
aa90: 6f 20 69 66 20 74 68 65 20 73 61 6d 65 20 69 6e  o if the same in
aaa0: 6f 64 65 20 69 73 20 6f 70 65 6e 65 64 20 74 77  ode is opened tw
aab0: 69 63 65 2c 20 62 6f 74 68 20 75 6e 69 78 46 69  ice, both unixFi
aac0: 6c 65 20 73 74 72 75 63 74 75 72 65 73 0a 2a 2a  le structures.**
aad0: 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 73 61   point to the sa
aae0: 6d 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63  me locking struc
aaf0: 74 75 72 65 2e 20 20 54 68 65 20 6c 6f 63 6b 69  ture.  The locki
ab00: 6e 67 20 73 74 72 75 63 74 75 72 65 20 6b 65 65  ng structure kee
ab10: 70 73 0a 2a 2a 20 61 20 72 65 66 65 72 65 6e 63  ps.** a referenc
ab20: 65 20 63 6f 75 6e 74 20 28 73 6f 20 77 65 20 77  e count (so we w
ab30: 69 6c 6c 20 6b 6e 6f 77 20 77 68 65 6e 20 74 6f  ill know when to
ab40: 20 64 65 6c 65 74 65 20 69 74 29 20 61 6e 64 20   delete it) and 
ab50: 61 20 22 63 6e 74 22 0a 2a 2a 20 66 69 65 6c 64  a "cnt".** field
ab60: 20 74 68 61 74 20 74 65 6c 6c 73 20 75 73 20 69   that tells us i
ab70: 74 73 20 69 6e 74 65 72 6e 61 6c 20 6c 6f 63 6b  ts internal lock
ab80: 20 73 74 61 74 75 73 2e 20 20 63 6e 74 3d 3d 30   status.  cnt==0
ab90: 20 6d 65 61 6e 73 20 74 68 65 0a 2a 2a 20 66 69   means the.** fi
aba0: 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64 2e 20  le is unlocked. 
abb0: 20 63 6e 74 3d 3d 2d 31 20 6d 65 61 6e 73 20 74   cnt==-1 means t
abc0: 68 65 20 66 69 6c 65 20 68 61 73 20 61 6e 20 65  he file has an e
abd0: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e 0a 2a  xclusive lock..*
abe0: 2a 20 63 6e 74 3e 30 20 6d 65 61 6e 73 20 74 68  * cnt>0 means th
abf0: 65 72 65 20 61 72 65 20 63 6e 74 20 73 68 61 72  ere are cnt shar
ac00: 65 64 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 20  ed locks on the 
ac10: 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20  file..**.** Any 
ac20: 61 74 74 65 6d 70 74 20 74 6f 20 6c 6f 63 6b 20  attempt to lock 
ac30: 6f 72 20 75 6e 6c 6f 63 6b 20 61 20 66 69 6c 65  or unlock a file
ac40: 20 66 69 72 73 74 20 63 68 65 63 6b 73 20 74 68   first checks th
ac50: 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 73 74 72  e locking.** str
ac60: 75 63 74 75 72 65 2e 20 20 54 68 65 20 66 63 6e  ucture.  The fcn
ac70: 74 6c 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c  tl() system call
ac80: 20 69 73 20 6f 6e 6c 79 20 69 6e 76 6f 6b 65 64   is only invoked
ac90: 20 74 6f 20 73 65 74 20 61 20 0a 2a 2a 20 50 4f   to set a .** PO
aca0: 53 49 58 20 6c 6f 63 6b 20 69 66 20 74 68 65 20  SIX lock if the 
acb0: 69 6e 74 65 72 6e 61 6c 20 6c 6f 63 6b 20 73 74  internal lock st
acc0: 72 75 63 74 75 72 65 20 74 72 61 6e 73 69 74 69  ructure transiti
acd0: 6f 6e 73 20 62 65 74 77 65 65 6e 0a 2a 2a 20 61  ons between.** a
ace0: 20 6c 6f 63 6b 65 64 20 61 6e 64 20 61 6e 20 75   locked and an u
acf0: 6e 6c 6f 63 6b 65 64 20 73 74 61 74 65 2e 0a 2a  nlocked state..*
ad00: 2a 0a 2a 2a 20 42 75 74 20 77 61 69 74 3a 20 20  *.** But wait:  
ad10: 74 68 65 72 65 20 61 72 65 20 79 65 74 20 6d 6f  there are yet mo
ad20: 72 65 20 70 72 6f 62 6c 65 6d 73 20 77 69 74 68  re problems with
ad30: 20 50 4f 53 49 58 20 61 64 76 69 73 6f 72 79 20   POSIX advisory 
ad40: 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  locks..**.** If 
ad50: 79 6f 75 20 63 6c 6f 73 65 20 61 20 66 69 6c 65  you close a file
ad60: 20 64 65 73 63 72 69 70 74 6f 72 20 74 68 61 74   descriptor that
ad70: 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 66 69 6c   points to a fil
ad80: 65 20 74 68 61 74 20 68 61 73 20 6c 6f 63 6b 73  e that has locks
ad90: 2c 0a 2a 2a 20 61 6c 6c 20 6c 6f 63 6b 73 20 6f  ,.** all locks o
ada0: 6e 20 74 68 61 74 20 66 69 6c 65 20 74 68 61 74  n that file that
adb0: 20 61 72 65 20 6f 77 6e 65 64 20 62 79 20 74 68   are owned by th
adc0: 65 20 63 75 72 72 65 6e 74 20 70 72 6f 63 65 73  e current proces
add0: 73 20 61 72 65 0a 2a 2a 20 72 65 6c 65 61 73 65  s are.** release
ade0: 64 2e 20 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75  d.  To work arou
adf0: 6e 64 20 74 68 69 73 20 70 72 6f 62 6c 65 6d 2c  nd this problem,
ae00: 20 65 61 63 68 20 75 6e 69 78 49 6e 6f 64 65 49   each unixInodeI
ae10: 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a 2a 20 6d 61  nfo object.** ma
ae20: 69 6e 74 61 69 6e 73 20 61 20 63 6f 75 6e 74 20  intains a count 
ae30: 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  of the number of
ae40: 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 73 20 6f   pending locks o
ae50: 6e 20 74 68 61 20 69 6e 6f 64 65 2e 0a 2a 2a 20  n tha inode..** 
ae60: 57 68 65 6e 20 61 6e 20 61 74 74 65 6d 70 74 20  When an attempt 
ae70: 69 73 20 6d 61 64 65 20 74 6f 20 63 6c 6f 73 65  is made to close
ae80: 20 61 6e 20 75 6e 69 78 46 69 6c 65 2c 20 69 66   an unixFile, if
ae90: 20 74 68 65 72 65 20 61 72 65 0a 2a 2a 20 6f 74   there are.** ot
aea0: 68 65 72 20 75 6e 69 78 46 69 6c 65 20 6f 70 65  her unixFile ope
aeb0: 6e 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 69 6e  n on the same in
aec0: 6f 64 65 20 74 68 61 74 20 61 72 65 20 68 6f 6c  ode that are hol
aed0: 64 69 6e 67 20 6c 6f 63 6b 73 2c 20 74 68 65 20  ding locks, the 
aee0: 63 61 6c 6c 0a 2a 2a 20 74 6f 20 63 6c 6f 73 65  call.** to close
aef0: 28 29 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  () the file desc
af00: 72 69 70 74 6f 72 20 69 73 20 64 65 66 65 72 72  riptor is deferr
af10: 65 64 20 75 6e 74 69 6c 20 61 6c 6c 20 6f 66 20  ed until all of 
af20: 74 68 65 20 6c 6f 63 6b 73 20 63 6c 65 61 72 2e  the locks clear.
af30: 0a 2a 2a 20 54 68 65 20 75 6e 69 78 49 6e 6f 64  .** The unixInod
af40: 65 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  eInfo structure 
af50: 6b 65 65 70 73 20 61 20 6c 69 73 74 20 6f 66 20  keeps a list of 
af60: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73  file descriptors
af70: 20 74 68 61 74 20 6e 65 65 64 20 74 6f 0a 2a 2a   that need to.**
af80: 20 62 65 20 63 6c 6f 73 65 64 20 61 6e 64 20 74   be closed and t
af90: 68 61 74 20 6c 69 73 74 20 69 73 20 77 61 6c 6b  hat list is walk
afa0: 65 64 20 28 61 6e 64 20 63 6c 65 61 72 65 64 29  ed (and cleared)
afb0: 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20 6c   when the last l
afc0: 6f 63 6b 0a 2a 2a 20 63 6c 65 61 72 73 2e 0a 2a  ock.** clears..*
afd0: 2a 0a 2a 2a 20 59 65 74 20 61 6e 6f 74 68 65 72  *.** Yet another
afe0: 20 70 72 6f 62 6c 65 6d 3a 20 20 4c 69 6e 75 78   problem:  Linux
aff0: 54 68 72 65 61 64 73 20 64 6f 20 6e 6f 74 20 70  Threads do not p
b000: 6c 61 79 20 77 65 6c 6c 20 77 69 74 68 20 70 6f  lay well with po
b010: 73 69 78 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a  six locks..**.**
b020: 20 4d 61 6e 79 20 6f 6c 64 65 72 20 76 65 72 73   Many older vers
b030: 69 6f 6e 73 20 6f 66 20 6c 69 6e 75 78 20 75 73  ions of linux us
b040: 65 20 74 68 65 20 4c 69 6e 75 78 54 68 72 65 61  e the LinuxThrea
b050: 64 73 20 6c 69 62 72 61 72 79 20 77 68 69 63 68  ds library which
b060: 20 69 73 0a 2a 2a 20 6e 6f 74 20 70 6f 73 69 78   is.** not posix
b070: 20 63 6f 6d 70 6c 69 61 6e 74 2e 20 20 55 6e 64   compliant.  Und
b080: 65 72 20 4c 69 6e 75 78 54 68 72 65 61 64 73 2c  er LinuxThreads,
b090: 20 61 20 6c 6f 63 6b 20 63 72 65 61 74 65 64 20   a lock created 
b0a0: 62 79 20 74 68 72 65 61 64 0a 2a 2a 20 41 20 63  by thread.** A c
b0b0: 61 6e 6e 6f 74 20 62 65 20 6d 6f 64 69 66 69 65  annot be modifie
b0c0: 64 20 6f 72 20 6f 76 65 72 72 69 64 64 65 6e 20  d or overridden 
b0d0: 62 79 20 61 20 64 69 66 66 65 72 65 6e 74 20 74  by a different t
b0e0: 68 72 65 61 64 20 42 2e 0a 2a 2a 20 4f 6e 6c 79  hread B..** Only
b0f0: 20 74 68 72 65 61 64 20 41 20 63 61 6e 20 6d 6f   thread A can mo
b100: 64 69 66 79 20 74 68 65 20 6c 6f 63 6b 2e 20 20  dify the lock.  
b110: 4c 6f 63 6b 69 6e 67 20 62 65 68 61 76 69 6f 72  Locking behavior
b120: 20 69 73 20 63 6f 72 72 65 63 74 0a 2a 2a 20 69   is correct.** i
b130: 66 20 74 68 65 20 61 70 70 6c 69 61 74 69 6f 6e  f the appliation
b140: 20 75 73 65 73 20 74 68 65 20 6e 65 77 65 72 20   uses the newer 
b150: 4e 61 74 69 76 65 20 50 6f 73 69 78 20 54 68 72  Native Posix Thr
b160: 65 61 64 20 4c 69 62 72 61 72 79 20 28 4e 50 54  ead Library (NPT
b170: 4c 29 0a 2a 2a 20 6f 6e 20 6c 69 6e 75 78 20 2d  L).** on linux -
b180: 20 77 69 74 68 20 4e 50 54 4c 20 61 20 6c 6f 63   with NPTL a loc
b190: 6b 20 63 72 65 61 74 65 64 20 62 79 20 74 68 72  k created by thr
b1a0: 65 61 64 20 41 20 63 61 6e 20 6f 76 65 72 72 69  ead A can overri
b1b0: 64 65 20 6c 6f 63 6b 73 0a 2a 2a 20 69 6e 20 74  de locks.** in t
b1c0: 68 72 65 61 64 20 42 2e 20 20 42 75 74 20 74 68  hread B.  But th
b1d0: 65 72 65 20 69 73 20 6e 6f 20 77 61 79 20 74 6f  ere is no way to
b1e0: 20 6b 6e 6f 77 20 61 74 20 63 6f 6d 70 69 6c 65   know at compile
b1f0: 2d 74 69 6d 65 20 77 68 69 63 68 0a 2a 2a 20 74  -time which.** t
b200: 68 72 65 61 64 69 6e 67 20 6c 69 62 72 61 72 79  hreading library
b210: 20 69 73 20 62 65 69 6e 67 20 75 73 65 64 2e 20   is being used. 
b220: 20 53 6f 20 74 68 65 72 65 20 69 73 20 6e 6f 20   So there is no 
b230: 77 61 79 20 74 6f 20 6b 6e 6f 77 20 61 74 0a 2a  way to know at.*
b240: 2a 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 77  * compile-time w
b250: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
b260: 72 65 61 64 20 41 20 63 61 6e 20 6f 76 65 72 72  read A can overr
b270: 69 64 65 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 72  ide locks on thr
b280: 65 61 64 20 42 2e 0a 2a 2a 20 4f 6e 65 20 68 61  ead B..** One ha
b290: 73 20 74 6f 20 64 6f 20 61 20 72 75 6e 2d 74 69  s to do a run-ti
b2a0: 6d 65 20 63 68 65 63 6b 20 74 6f 20 64 69 73 63  me check to disc
b2b0: 6f 76 65 72 20 74 68 65 20 62 65 68 61 76 69 6f  over the behavio
b2c0: 72 20 6f 66 20 74 68 65 0a 2a 2a 20 63 75 72 72  r of the.** curr
b2d0: 65 6e 74 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a  ent process..**.
b2e0: 2a 2a 20 53 51 4c 69 74 65 20 75 73 65 64 20 74  ** SQLite used t
b2f0: 6f 20 73 75 70 70 6f 72 74 20 4c 69 6e 75 78 54  o support LinuxT
b300: 68 72 65 61 64 73 2e 20 20 42 75 74 20 73 75 70  hreads.  But sup
b310: 70 6f 72 74 20 66 6f 72 20 4c 69 6e 75 78 54 68  port for LinuxTh
b320: 72 65 61 64 73 0a 2a 2a 20 77 61 73 20 64 72 6f  reads.** was dro
b330: 70 70 65 64 20 62 65 67 69 6e 6e 69 6e 67 20 77  pped beginning w
b340: 69 74 68 20 76 65 72 73 69 6f 6e 20 33 2e 37 2e  ith version 3.7.
b350: 30 2e 20 20 53 51 4c 69 74 65 20 77 69 6c 6c 20  0.  SQLite will 
b360: 73 74 69 6c 6c 20 77 6f 72 6b 20 77 69 74 68 0a  still work with.
b370: 2a 2a 20 4c 69 6e 75 78 54 68 72 65 61 64 73 20  ** LinuxThreads 
b380: 70 72 6f 76 69 64 65 64 20 74 68 61 74 20 28 31  provided that (1
b390: 29 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 6f  ) there is no mo
b3a0: 72 65 20 74 68 61 6e 20 6f 6e 65 20 63 6f 6e 6e  re than one conn
b3b0: 65 63 74 69 6f 6e 20 0a 2a 2a 20 70 65 72 20 64  ection .** per d
b3c0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20  atabase file in 
b3d0: 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73  the same process
b3e0: 20 61 6e 64 20 28 32 29 20 64 61 74 61 62 61 73   and (2) databas
b3f0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 0a 2a 2a  e connections.**
b400: 20 64 6f 20 6e 6f 74 20 6d 6f 76 65 20 61 63 72   do not move acr
b410: 6f 73 73 20 74 68 72 65 61 64 73 2e 0a 2a 2f 0a  oss threads..*/.
b420: 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e  ./*.** An instan
b430: 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ce of the follow
b440: 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 73 65  ing structure se
b450: 72 76 65 73 20 61 73 20 74 68 65 20 6b 65 79 20  rves as the key 
b460: 75 73 65 64 0a 2a 2a 20 74 6f 20 6c 6f 63 61 74  used.** to locat
b470: 65 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 75  e a particular u
b480: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a  nixInodeInfo obj
b490: 65 63 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 75  ect..*/.struct u
b4a0: 6e 69 78 46 69 6c 65 49 64 20 7b 0a 20 20 64 65  nixFileId {.  de
b4b0: 76 5f 74 20 64 65 76 3b 20 20 20 20 20 20 20 20  v_t dev;        
b4c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 76            /* Dev
b4d0: 69 63 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 23 69  ice number */.#i
b4e0: 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73  f OS_VXWORKS.  s
b4f0: 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c  truct vxworksFil
b500: 65 49 64 20 2a 70 49 64 3b 20 20 2f 2a 20 55 6e  eId *pId;  /* Un
b510: 69 71 75 65 20 66 69 6c 65 20 49 44 20 66 6f 72  ique file ID for
b520: 20 76 78 77 6f 72 6b 73 2e 20 2a 2f 0a 23 65 6c   vxworks. */.#el
b530: 73 65 0a 20 20 69 6e 6f 5f 74 20 69 6e 6f 3b 20  se.  ino_t ino; 
b540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b550: 20 2f 2a 20 49 6e 6f 64 65 20 6e 75 6d 62 65 72   /* Inode number
b560: 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f   */.#endif.};../
b570: 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65  *.** An instance
b580: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
b590: 67 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61  g structure is a
b5a0: 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 65 61 63  llocated for eac
b5b0: 68 20 6f 70 65 6e 0a 2a 2a 20 69 6e 6f 64 65 2e  h open.** inode.
b5c0: 20 20 4f 72 2c 20 6f 6e 20 4c 69 6e 75 78 54 68    Or, on LinuxTh
b5d0: 72 65 61 64 73 2c 20 74 68 65 72 65 20 69 73 20  reads, there is 
b5e0: 6f 6e 65 20 6f 66 20 74 68 65 73 65 20 73 74 72  one of these str
b5f0: 75 63 74 75 72 65 73 20 66 6f 72 0a 2a 2a 20 65  uctures for.** e
b600: 61 63 68 20 69 6e 6f 64 65 20 6f 70 65 6e 65 64  ach inode opened
b610: 20 62 79 20 65 61 63 68 20 74 68 72 65 61 64 2e   by each thread.
b620: 0a 2a 2a 0a 2a 2a 20 41 20 73 69 6e 67 6c 65 20  .**.** A single 
b630: 69 6e 6f 64 65 20 63 61 6e 20 68 61 76 65 20 6d  inode can have m
b640: 75 6c 74 69 70 6c 65 20 66 69 6c 65 20 64 65 73  ultiple file des
b650: 63 72 69 70 74 6f 72 73 2c 20 73 6f 20 65 61 63  criptors, so eac
b660: 68 20 75 6e 69 78 46 69 6c 65 0a 2a 2a 20 73 74  h unixFile.** st
b670: 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73  ructure contains
b680: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
b690: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69   instance of thi
b6a0: 73 20 6f 62 6a 65 63 74 20 61 6e 64 20 74 68 69  s object and thi
b6b0: 73 0a 2a 2a 20 6f 62 6a 65 63 74 20 6b 65 65 70  s.** object keep
b6c0: 73 20 61 20 63 6f 75 6e 74 20 6f 66 20 74 68 65  s a count of the
b6d0: 20 6e 75 6d 62 65 72 20 6f 66 20 75 6e 69 78 46   number of unixF
b6e0: 69 6c 65 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  ile pointing to 
b6f0: 69 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 75 6e  it..*/.struct un
b700: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 7b 0a 20 20  ixInodeInfo {.  
b710: 73 74 72 75 63 74 20 75 6e 69 78 46 69 6c 65 49  struct unixFileI
b720: 64 20 66 69 6c 65 49 64 3b 20 20 20 20 20 20 20  d fileId;       
b730: 2f 2a 20 54 68 65 20 6c 6f 6f 6b 75 70 20 6b 65  /* The lookup ke
b740: 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 68 61 72  y */.  int nShar
b750: 65 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ed;             
b760: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
b770: 20 6f 66 20 53 48 41 52 45 44 20 6c 6f 63 6b 73   of SHARED locks
b780: 20 68 65 6c 64 20 2a 2f 0a 20 20 75 6e 73 69 67   held */.  unsig
b790: 6e 65 64 20 63 68 61 72 20 65 46 69 6c 65 4c 6f  ned char eFileLo
b7a0: 63 6b 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e  ck;        /* On
b7b0: 65 20 6f 66 20 53 48 41 52 45 44 5f 4c 4f 43 4b  e of SHARED_LOCK
b7c0: 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  , RESERVED_LOCK 
b7d0: 65 74 63 2e 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  etc. */.  unsign
b7e0: 65 64 20 63 68 61 72 20 62 50 72 6f 63 65 73 73  ed char bProcess
b7f0: 4c 6f 63 6b 3b 20 20 20 20 20 2f 2a 20 41 6e 20  Lock;     /* An 
b800: 65 78 63 6c 75 73 69 76 65 20 70 72 6f 63 65 73  exclusive proces
b810: 73 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 2a  s lock is held *
b820: 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20  /.  int nRef;   
b830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b840: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
b850: 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 74 68 69   pointers to thi
b860: 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  s structure */. 
b870: 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53   unixShmNode *pS
b880: 68 6d 4e 6f 64 65 3b 20 20 20 20 20 20 20 20 20  hmNode;         
b890: 20 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f 72   /* Shared memor
b8a0: 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  y associated wit
b8b0: 68 20 74 68 69 73 20 69 6e 6f 64 65 20 2a 2f 0a  h this inode */.
b8c0: 20 20 69 6e 74 20 6e 4c 6f 63 6b 3b 20 20 20 20    int nLock;    
b8d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b8e0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6f    /* Number of o
b8f0: 75 74 73 74 61 6e 64 69 6e 67 20 66 69 6c 65 20  utstanding file 
b900: 6c 6f 63 6b 73 20 2a 2f 0a 20 20 55 6e 69 78 55  locks */.  UnixU
b910: 6e 75 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64  nusedFd *pUnused
b920: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e  ;          /* Un
b930: 75 73 65 64 20 66 69 6c 65 20 64 65 73 63 72 69  used file descri
b940: 70 74 6f 72 73 20 74 6f 20 63 6c 6f 73 65 20 2a  ptors to close *
b950: 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  /.  unixInodeInf
b960: 6f 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 20  o *pNext;       
b970: 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 61      /* List of a
b980: 6c 6c 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  ll unixInodeInfo
b990: 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20 75 6e   objects */.  un
b9a0: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 50 72  ixInodeInfo *pPr
b9b0: 65 76 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ev;           /*
b9c0: 20 20 20 20 2e 2e 2e 2e 20 64 6f 75 62 6c 79 20      .... doubly 
b9d0: 6c 69 6e 6b 65 64 20 2a 2f 0a 23 69 66 20 53 51  linked */.#if SQ
b9e0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
b9f0: 49 4e 47 5f 53 54 59 4c 45 0a 20 20 75 6e 73 69  ING_STYLE.  unsi
ba00: 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 73  gned long long s
ba10: 68 61 72 65 64 42 79 74 65 3b 20 20 2f 2a 20 66  haredByte;  /* f
ba20: 6f 72 20 41 46 50 20 73 69 6d 75 6c 61 74 65 64  or AFP simulated
ba30: 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 2a 2f 0a   shared lock */.
ba40: 23 65 6e 64 69 66 0a 23 69 66 20 4f 53 5f 56 58  #endif.#if OS_VX
ba50: 57 4f 52 4b 53 0a 20 20 73 65 6d 5f 74 20 2a 70  WORKS.  sem_t *p
ba60: 53 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  Sem;            
ba70: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 64          /* Named
ba80: 20 50 4f 53 49 58 20 73 65 6d 61 70 68 6f 72 65   POSIX semaphore
ba90: 20 2a 2f 0a 20 20 63 68 61 72 20 61 53 65 6d 4e   */.  char aSemN
baa0: 61 6d 65 5b 4d 41 58 5f 50 41 54 48 4e 41 4d 45  ame[MAX_PATHNAME
bab0: 2b 32 5d 3b 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  +2];  /* Name of
bac0: 20 74 68 61 74 20 73 65 6d 61 70 68 6f 72 65 20   that semaphore 
bad0: 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a  */.#endif.};../*
bae0: 0a 2a 2a 20 41 20 6c 69 73 74 73 20 6f 66 20 61  .** A lists of a
baf0: 6c 6c 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  ll unixInodeInfo
bb00: 20 6f 62 6a 65 63 74 73 2e 0a 2a 2f 0a 73 74 61   objects..*/.sta
bb10: 74 69 63 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  tic unixInodeInf
bb20: 6f 20 2a 69 6e 6f 64 65 4c 69 73 74 20 3d 20 30  o *inodeList = 0
bb30: 3b 0a 0a 2f 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ;../*.**.** This
bb40: 20 66 75 6e 63 74 69 6f 6e 20 2d 20 75 6e 69 78   function - unix
bb50: 4c 6f 67 45 72 72 6f 72 5f 78 28 29 2c 20 69 73  LogError_x(), is
bb60: 20 6f 6e 6c 79 20 65 76 65 72 20 63 61 6c 6c 65   only ever calle
bb70: 64 20 76 69 61 20 74 68 65 20 6d 61 63 72 6f 0a  d via the macro.
bb80: 2a 2a 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28  ** unixLogError(
bb90: 29 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 69  )..**.** It is i
bba0: 6e 76 6f 6b 65 64 20 61 66 74 65 72 20 61 6e 20  nvoked after an 
bbb0: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 69 6e 20  error occurs in 
bbc0: 61 6e 20 4f 53 20 66 75 6e 63 74 69 6f 6e 20 61  an OS function a
bbd0: 6e 64 20 65 72 72 6e 6f 20 68 61 73 20 62 65 65  nd errno has bee
bbe0: 6e 0a 2a 2a 20 73 65 74 2e 20 49 74 20 6c 6f 67  n.** set. It log
bbf0: 73 20 61 20 6d 65 73 73 61 67 65 20 75 73 69 6e  s a message usin
bc00: 67 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 29 20  g sqlite3_log() 
bc10: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63  containing the c
bc20: 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 0a  urrent value of.
bc30: 2a 2a 20 65 72 72 6e 6f 20 61 6e 64 2c 20 69 66  ** errno and, if
bc40: 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 65 20 68   possible, the h
bc50: 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 65 71  uman-readable eq
bc60: 75 69 76 61 6c 65 6e 74 20 66 72 6f 6d 20 73 74  uivalent from st
bc70: 72 65 72 72 6f 72 28 29 20 6f 72 0a 2a 2a 20 73  rerror() or.** s
bc80: 74 72 65 72 72 6f 72 5f 72 28 29 2e 0a 2a 2a 0a  trerror_r()..**.
bc90: 2a 2a 20 54 68 65 20 66 69 72 73 74 20 61 72 67  ** The first arg
bca0: 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20  ument passed to 
bcb0: 74 68 65 20 6d 61 63 72 6f 20 73 68 6f 75 6c 64  the macro should
bcc0: 20 62 65 20 74 68 65 20 65 72 72 6f 72 20 63 6f   be the error co
bcd0: 64 65 20 74 68 61 74 0a 2a 2a 20 77 69 6c 6c 20  de that.** will 
bce0: 62 65 20 72 65 74 75 72 6e 65 64 20 74 6f 20 53  be returned to S
bcf0: 51 4c 69 74 65 20 28 65 2e 67 2e 20 53 51 4c 49  QLite (e.g. SQLI
bd00: 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 2c  TE_IOERR_DELETE,
bd10: 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
bd20: 29 2e 20 0a 2a 2a 20 54 68 65 20 74 77 6f 20 73  ). .** The two s
bd30: 75 62 73 65 71 75 65 6e 74 20 61 72 67 75 6d 65  ubsequent argume
bd40: 6e 74 73 20 73 68 6f 75 6c 64 20 62 65 20 74 68  nts should be th
bd50: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 4f 53  e name of the OS
bd60: 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 0a 2a   function that.*
bd70: 2a 20 66 61 69 6c 65 64 20 28 65 2e 67 2e 20 22  * failed (e.g. "
bd80: 75 6e 6c 69 6e 6b 22 2c 20 22 6f 70 65 6e 22 29  unlink", "open")
bd90: 20 61 6e 64 20 74 68 65 20 61 73 73 6f 63 69 61   and the associa
bda0: 74 65 64 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  ted file-system 
bdb0: 70 61 74 68 2c 0a 2a 2a 20 69 66 20 61 6e 79 2e  path,.** if any.
bdc0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 75 6e 69 78  .*/.#define unix
bdd0: 4c 6f 67 45 72 72 6f 72 28 61 2c 62 2c 63 29 20  LogError(a,b,c) 
bde0: 20 20 20 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72      unixLogError
bdf0: 41 74 4c 69 6e 65 28 61 2c 62 2c 63 2c 5f 5f 4c  AtLine(a,b,c,__L
be00: 49 4e 45 5f 5f 29 0a 73 74 61 74 69 63 20 69 6e  INE__).static in
be10: 74 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 41 74  t unixLogErrorAt
be20: 4c 69 6e 65 28 0a 20 20 69 6e 74 20 65 72 72 63  Line(.  int errc
be30: 6f 64 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ode,            
be40: 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 69 74          /* SQLit
be50: 65 20 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f 0a  e error code */.
be60: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
be70: 75 6e 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  unc,            
be80: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 4f 53 20    /* Name of OS 
be90: 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 66 61  function that fa
bea0: 69 6c 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  iled */.  const 
beb0: 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20  char *zPath,    
bec0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
bed0: 65 20 70 61 74 68 20 61 73 73 6f 63 69 61 74 65  e path associate
bee0: 64 20 77 69 74 68 20 65 72 72 6f 72 20 2a 2f 0a  d with error */.
bef0: 20 20 69 6e 74 20 69 4c 69 6e 65 20 20 20 20 20    int iLine     
bf00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bf10: 20 20 2f 2a 20 53 6f 75 72 63 65 20 6c 69 6e 65    /* Source line
bf20: 20 6e 75 6d 62 65 72 20 77 68 65 72 65 20 65 72   number where er
bf30: 72 6f 72 20 6f 63 63 75 72 72 65 64 20 2a 2f 0a  ror occurred */.
bf40: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 3b  ){.  char *zErr;
bf50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bf60: 20 20 20 20 20 2f 2a 20 4d 65 73 73 61 67 65 20       /* Message 
bf70: 66 72 6f 6d 20 73 74 72 65 72 72 6f 72 28 29 20  from strerror() 
bf80: 6f 72 20 65 71 75 69 76 61 6c 65 6e 74 20 2a 2f  or equivalent */
bf90: 0a 20 20 69 6e 74 20 69 45 72 72 6e 6f 20 3d 20  .  int iErrno = 
bfa0: 65 72 72 6e 6f 3b 20 20 20 20 20 20 20 20 20 20  errno;          
bfb0: 20 20 20 2f 2a 20 53 61 76 65 64 20 73 79 73 63     /* Saved sysc
bfc0: 61 6c 6c 20 65 72 72 6f 72 20 6e 75 6d 62 65 72  all error number
bfd0: 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69   */..  /* If thi
bfe0: 73 20 69 73 20 6e 6f 74 20 61 20 74 68 72 65 61  s is not a threa
bff0: 64 73 61 66 65 20 62 75 69 6c 64 20 28 53 51 4c  dsafe build (SQL
c000: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 3d 3d  ITE_THREADSAFE==
c010: 30 29 2c 20 74 68 65 6e 20 75 73 65 0a 20 20 2a  0), then use.  *
c020: 2a 20 74 68 65 20 73 74 72 65 72 72 6f 72 28 29  * the strerror()
c030: 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 6f 62 74   function to obt
c040: 61 69 6e 20 74 68 65 20 68 75 6d 61 6e 2d 72 65  ain the human-re
c050: 61 64 61 62 6c 65 20 65 72 72 6f 72 20 6d 65 73  adable error mes
c060: 73 61 67 65 0a 20 20 2a 2a 20 65 71 75 69 76 61  sage.  ** equiva
c070: 6c 65 6e 74 20 74 6f 20 65 72 72 6e 6f 2e 20 4f  lent to errno. O
c080: 74 68 65 72 77 69 73 65 2c 20 75 73 65 20 73 74  therwise, use st
c090: 72 65 72 72 6f 72 5f 72 28 29 2e 0a 20 20 2a 2f  rerror_r()..  */
c0a0: 20 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52   .#if SQLITE_THR
c0b0: 45 41 44 53 41 46 45 20 26 26 20 64 65 66 69 6e  EADSAFE && defin
c0c0: 65 64 28 48 41 56 45 5f 53 54 52 45 52 52 4f 52  ed(HAVE_STRERROR
c0d0: 5f 52 29 0a 20 20 63 68 61 72 20 61 45 72 72 5b  _R).  char aErr[
c0e0: 38 30 5d 3b 0a 20 20 6d 65 6d 73 65 74 28 61 45  80];.  memset(aE
c0f0: 72 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61 45  rr, 0, sizeof(aE
c100: 72 72 29 29 3b 0a 20 20 7a 45 72 72 20 3d 20 61  rr));.  zErr = a
c110: 45 72 72 3b 0a 0a 20 20 2f 2a 20 49 66 20 53 54  Err;..  /* If ST
c120: 52 45 52 52 4f 52 5f 52 5f 43 48 41 52 5f 50 20  RERROR_R_CHAR_P 
c130: 28 73 65 74 20 62 79 20 61 75 74 6f 63 6f 6e 66  (set by autoconf
c140: 20 73 63 72 69 70 74 73 29 20 6f 72 20 5f 5f 55   scripts) or __U
c150: 53 45 5f 47 4e 55 20 69 73 20 64 65 66 69 6e 65  SE_GNU is define
c160: 64 2c 0a 20 20 2a 2a 20 61 73 73 75 6d 65 20 74  d,.  ** assume t
c170: 68 61 74 20 74 68 65 20 73 79 73 74 65 6d 20 70  hat the system p
c180: 72 6f 76 69 64 65 73 20 74 68 65 20 47 4e 55 20  rovides the GNU 
c190: 76 65 72 73 69 6f 6e 20 6f 66 20 73 74 72 65 72  version of strer
c1a0: 72 6f 72 5f 72 28 29 20 74 68 61 74 0a 20 20 2a  ror_r() that.  *
c1b0: 2a 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e  * returns a poin
c1c0: 74 65 72 20 74 6f 20 61 20 62 75 66 66 65 72 20  ter to a buffer 
c1d0: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 65  containing the e
c1e0: 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 20 54 68  rror message. Th
c1f0: 61 74 20 70 6f 69 6e 74 65 72 20 0a 20 20 2a 2a  at pointer .  **
c200: 20 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20 61 45   may point to aE
c210: 72 72 5b 5d 2c 20 6f 72 20 69 74 20 6d 61 79 20  rr[], or it may 
c220: 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65 20 73 74  point to some st
c230: 61 74 69 63 20 73 74 6f 72 61 67 65 20 73 6f 6d  atic storage som
c240: 65 77 68 65 72 65 2e 20 0a 20 20 2a 2a 20 4f 74  ewhere. .  ** Ot
c250: 68 65 72 77 69 73 65 2c 20 61 73 73 75 6d 65 20  herwise, assume 
c260: 74 68 61 74 20 74 68 65 20 73 79 73 74 65 6d 20  that the system 
c270: 70 72 6f 76 69 64 65 73 20 74 68 65 20 50 4f 53  provides the POS
c280: 49 58 20 76 65 72 73 69 6f 6e 20 6f 66 20 0a 20  IX version of . 
c290: 20 2a 2a 20 73 74 72 65 72 72 6f 72 5f 72 28 29   ** strerror_r()
c2a0: 2c 20 77 68 69 63 68 20 61 6c 77 61 79 73 20 77  , which always w
c2b0: 72 69 74 65 73 20 61 6e 20 65 72 72 6f 72 20 6d  rites an error m
c2c0: 65 73 73 61 67 65 20 69 6e 74 6f 20 61 45 72 72  essage into aErr
c2d0: 5b 5d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  []..  **.  ** If
c2e0: 20 74 68 65 20 63 6f 64 65 20 69 6e 63 6f 72 72   the code incorr
c2f0: 65 63 74 6c 79 20 61 73 73 75 6d 65 73 20 74 68  ectly assumes th
c300: 61 74 20 69 74 20 69 73 20 74 68 65 20 50 4f 53  at it is the POS
c310: 49 58 20 76 65 72 73 69 6f 6e 20 74 68 61 74 20  IX version that 
c320: 69 73 0a 20 20 2a 2a 20 61 76 61 69 6c 61 62 6c  is.  ** availabl
c330: 65 2c 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73  e, the error mes
c340: 73 61 67 65 20 77 69 6c 6c 20 6f 66 74 65 6e 20  sage will often 
c350: 62 65 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69  be an empty stri
c360: 6e 67 2e 20 4e 6f 74 20 61 0a 20 20 2a 2a 20 68  ng. Not a.  ** h
c370: 75 67 65 20 70 72 6f 62 6c 65 6d 2e 20 49 6e 63  uge problem. Inc
c380: 6f 72 72 65 63 74 6c 79 20 63 6f 6e 63 6c 75 64  orrectly conclud
c390: 69 6e 67 20 74 68 61 74 20 74 68 65 20 47 4e 55  ing that the GNU
c3a0: 20 76 65 72 73 69 6f 6e 20 69 73 20 61 76 61 69   version is avai
c3b0: 6c 61 62 6c 65 20 0a 20 20 2a 2a 20 63 6f 75 6c  lable .  ** coul
c3c0: 64 20 6c 65 61 64 20 74 6f 20 61 20 73 65 67 66  d lead to a segf
c3d0: 61 75 6c 74 20 74 68 6f 75 67 68 2e 0a 20 20 2a  ault though..  *
c3e0: 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 54  /.#if defined(ST
c3f0: 52 45 52 52 4f 52 5f 52 5f 43 48 41 52 5f 50 29  RERROR_R_CHAR_P)
c400: 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f 55 53   || defined(__US
c410: 45 5f 47 4e 55 29 0a 20 20 7a 45 72 72 20 3d 20  E_GNU).  zErr = 
c420: 0a 23 20 65 6e 64 69 66 0a 20 20 73 74 72 65 72  .# endif.  strer
c430: 72 6f 72 5f 72 28 69 45 72 72 6e 6f 2c 20 61 45  ror_r(iErrno, aE
c440: 72 72 2c 20 73 69 7a 65 6f 66 28 61 45 72 72 29  rr, sizeof(aErr)
c450: 2d 31 29 3b 0a 0a 23 65 6c 69 66 20 53 51 4c 49  -1);..#elif SQLI
c460: 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a 20 20  TE_THREADSAFE.  
c470: 2f 2a 20 54 68 69 73 20 69 73 20 61 20 74 68 72  /* This is a thr
c480: 65 61 64 73 61 66 65 20 62 75 69 6c 64 2c 20 62  eadsafe build, b
c490: 75 74 20 73 74 72 65 72 72 6f 72 5f 72 28 29 20  ut strerror_r() 
c4a0: 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  is not available
c4b0: 2e 20 2a 2f 0a 20 20 7a 45 72 72 20 3d 20 22 22  . */.  zErr = ""
c4c0: 3b 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 4e 6f 6e  ;.#else.  /* Non
c4d0: 2d 74 68 72 65 61 64 73 61 66 65 20 62 75 69 6c  -threadsafe buil
c4e0: 64 2c 20 75 73 65 20 73 74 72 65 72 72 6f 72 28  d, use strerror(
c4f0: 29 2e 20 2a 2f 0a 20 20 7a 45 72 72 20 3d 20 73  ). */.  zErr = s
c500: 74 72 65 72 72 6f 72 28 69 45 72 72 6e 6f 29 3b  trerror(iErrno);
c510: 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 7a  .#endif..  if( z
c520: 50 61 74 68 3d 3d 30 20 29 20 7a 50 61 74 68 20  Path==0 ) zPath 
c530: 3d 20 22 22 3b 0a 20 20 73 71 6c 69 74 65 33 5f  = "";.  sqlite3_
c540: 6c 6f 67 28 65 72 72 63 6f 64 65 2c 0a 20 20 20  log(errcode,.   
c550: 20 20 20 22 6f 73 5f 75 6e 69 78 2e 63 3a 25 64     "os_unix.c:%d
c560: 3a 20 28 25 64 29 20 25 73 28 25 73 29 20 2d 20  : (%d) %s(%s) - 
c570: 25 73 22 2c 0a 20 20 20 20 20 20 69 4c 69 6e 65  %s",.      iLine
c580: 2c 20 69 45 72 72 6e 6f 2c 20 7a 46 75 6e 63 2c  , iErrno, zFunc,
c590: 20 7a 50 61 74 68 2c 20 7a 45 72 72 0a 20 20 29   zPath, zErr.  )
c5a0: 3b 0a 0a 20 20 72 65 74 75 72 6e 20 65 72 72 63  ;..  return errc
c5b0: 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  ode;.}../*.** Cl
c5c0: 6f 73 65 20 61 20 66 69 6c 65 20 64 65 73 63 72  ose a file descr
c5d0: 69 70 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 57 65 20  iptor..**.** We 
c5e0: 61 73 73 75 6d 65 20 74 68 61 74 20 63 6c 6f 73  assume that clos
c5f0: 65 28 29 20 61 6c 6d 6f 73 74 20 61 6c 77 61 79  e() almost alway
c600: 73 20 77 6f 72 6b 73 2c 20 73 69 6e 63 65 20 69  s works, since i
c610: 74 20 69 73 20 6f 6e 6c 79 20 69 6e 20 61 0a 2a  t is only in a.*
c620: 2a 20 76 65 72 79 20 73 69 63 6b 20 61 70 70 6c  * very sick appl
c630: 69 63 61 74 69 6f 6e 20 6f 72 20 6f 6e 20 61 20  ication or on a 
c640: 76 65 72 79 20 73 69 63 6b 20 70 6c 61 74 66 6f  very sick platfo
c650: 72 6d 20 74 68 61 74 20 69 74 20 6d 69 67 68 74  rm that it might
c660: 20 66 61 69 6c 2e 0a 2a 2a 20 49 66 20 69 74 20   fail..** If it 
c670: 64 6f 65 73 20 66 61 69 6c 2c 20 73 69 6d 70 6c  does fail, simpl
c680: 79 20 6c 65 61 6b 20 74 68 65 20 66 69 6c 65 20  y leak the file 
c690: 64 65 73 63 72 69 70 74 6f 72 2c 20 62 75 74 20  descriptor, but 
c6a0: 64 6f 20 6c 6f 67 20 74 68 65 0a 2a 2a 20 65 72  do log the.** er
c6b0: 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20  ror..**.** Note 
c6c0: 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20 73  that it is not s
c6d0: 61 66 65 20 74 6f 20 72 65 74 72 79 20 63 6c 6f  afe to retry clo
c6e0: 73 65 28 29 20 61 66 74 65 72 20 45 49 4e 54 52  se() after EINTR
c6f0: 20 73 69 6e 63 65 20 74 68 65 0a 2a 2a 20 66 69   since the.** fi
c700: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6d 69  le descriptor mi
c710: 67 68 74 20 68 61 76 65 20 61 6c 72 65 61 64 79  ght have already
c720: 20 62 65 65 6e 20 72 65 75 73 65 64 20 62 79 20   been reused by 
c730: 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64 2e 0a  another thread..
c740: 2a 2a 20 53 6f 20 77 65 20 64 6f 6e 27 74 20 65  ** So we don't e
c750: 76 65 6e 20 74 72 79 20 74 6f 20 72 65 63 6f 76  ven try to recov
c760: 65 72 20 66 72 6f 6d 20 61 6e 20 45 49 4e 54 52  er from an EINTR
c770: 2e 20 20 4a 75 73 74 20 6c 6f 67 20 74 68 65 20  .  Just log the 
c780: 65 72 72 6f 72 0a 2a 2a 20 61 6e 64 20 6d 6f 76  error.** and mov
c790: 65 20 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  e on..*/.static 
c7a0: 76 6f 69 64 20 72 6f 62 75 73 74 5f 63 6c 6f 73  void robust_clos
c7b0: 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c  e(unixFile *pFil
c7c0: 65 2c 20 69 6e 74 20 68 2c 20 69 6e 74 20 6c 69  e, int h, int li
c7d0: 6e 65 6e 6f 29 7b 0a 20 20 69 66 28 20 6f 73 43  neno){.  if( osC
c7e0: 6c 6f 73 65 28 68 29 20 29 7b 0a 20 20 20 20 75  lose(h) ){.    u
c7f0: 6e 69 78 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e  nixLogErrorAtLin
c800: 65 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43  e(SQLITE_IOERR_C
c810: 4c 4f 53 45 2c 20 22 63 6c 6f 73 65 22 2c 0a 20  LOSE, "close",. 
c820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c830: 20 20 20 20 20 20 70 46 69 6c 65 20 3f 20 70 46        pFile ? pF
c840: 69 6c 65 2d 3e 7a 50 61 74 68 20 3a 20 30 2c 20  ile->zPath : 0, 
c850: 6c 69 6e 65 6e 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a  lineno);.  }.}..
c860: 73 74 61 74 69 63 20 76 6f 69 64 20 73 74 6f 72  static void stor
c870: 65 4c 61 73 74 45 72 72 6e 6f 28 75 6e 69 78 46  eLastErrno(unixF
c880: 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69 6e 74 20  ile *pFile, int 
c890: 65 72 72 6f 72 29 7b 0a 20 20 70 46 69 6c 65 2d  error){.  pFile-
c8a0: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72  >lastErrno = err
c8b0: 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  or;.}../*.** Clo
c8c0: 73 65 20 61 6c 6c 20 66 69 6c 65 20 64 65 73 63  se all file desc
c8d0: 72 69 70 74 6f 72 73 20 61 63 63 75 6d 75 61 74  riptors accumuat
c8e0: 65 64 20 69 6e 20 74 68 65 20 75 6e 69 78 49 6e  ed in the unixIn
c8f0: 6f 64 65 49 6e 66 6f 2d 3e 70 55 6e 75 73 65 64  odeInfo->pUnused
c900: 20 6c 69 73 74 2e 0a 2a 2f 20 0a 73 74 61 74 69   list..*/ .stati
c910: 63 20 76 6f 69 64 20 63 6c 6f 73 65 50 65 6e 64  c void closePend
c920: 69 6e 67 46 64 73 28 75 6e 69 78 46 69 6c 65 20  ingFds(unixFile 
c930: 2a 70 46 69 6c 65 29 7b 0a 20 20 75 6e 69 78 49  *pFile){.  unixI
c940: 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65  nodeInfo *pInode
c950: 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65   = pFile->pInode
c960: 3b 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64  ;.  UnixUnusedFd
c970: 20 2a 70 3b 0a 20 20 55 6e 69 78 55 6e 75 73 65   *p;.  UnixUnuse
c980: 64 46 64 20 2a 70 4e 65 78 74 3b 0a 20 20 66 6f  dFd *pNext;.  fo
c990: 72 28 70 3d 70 49 6e 6f 64 65 2d 3e 70 55 6e 75  r(p=pInode->pUnu
c9a0: 73 65 64 3b 20 70 3b 20 70 3d 70 4e 65 78 74 29  sed; p; p=pNext)
c9b0: 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 2d  {.    pNext = p-
c9c0: 3e 70 4e 65 78 74 3b 0a 23 69 66 20 4f 53 43 4c  >pNext;.#if OSCL
c9d0: 4f 53 45 5f 43 48 45 43 4b 5f 43 4c 4f 53 45 5f  OSE_CHECK_CLOSE_
c9e0: 49 4f 45 52 52 0a 20 20 20 20 69 66 28 20 63 6c  IOERR.    if( cl
c9f0: 6f 73 65 28 70 2d 3e 66 64 29 20 29 7b 0a 20 20  ose(p->fd) ){.  
ca00: 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72      storeLastErr
ca10: 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29  no(pFile, errno)
ca20: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  ;.      rc = SQL
ca30: 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53 45 3b  ITE_IOERR_CLOSE;
ca40: 0a 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20  .      p->pNext 
ca50: 3d 20 70 45 72 72 6f 72 3b 0a 20 20 20 20 20 20  = pError;.      
ca60: 70 45 72 72 6f 72 20 3d 20 70 3b 0a 20 20 20 20  pError = p;.    
ca70: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
ca80: 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
ca90: 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 72 6f    }.#else.    ro
caa0: 62 75 73 74 5f 63 6c 6f 73 65 28 70 46 69 6c 65  bust_close(pFile
cab0: 2c 20 70 2d 3e 66 64 2c 20 5f 5f 4c 49 4e 45 5f  , p->fd, __LINE_
cac0: 5f 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  _);.    sqlite3_
cad0: 66 72 65 65 28 70 29 3b 0a 23 65 6e 64 69 66 0a  free(p);.#endif.
cae0: 20 20 7d 0a 20 20 70 49 6e 6f 64 65 2d 3e 70 55    }.  pInode->pU
caf0: 6e 75 73 65 64 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  nused = 0;.}../*
cb00: 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 75 6e  .** Release a un
cb10: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 73 74 72 75  ixInodeInfo stru
cb20: 63 74 75 72 65 20 70 72 65 76 69 6f 75 73 6c 79  cture previously
cb30: 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 66 69   allocated by fi
cb40: 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29 2e 0a 2a  ndInodeInfo()..*
cb50: 2a 0a 2a 2a 20 54 68 65 20 6d 75 74 65 78 20 65  *.** The mutex e
cb60: 6e 74 65 72 65 64 20 75 73 69 6e 67 20 74 68 65  ntered using the
cb70: 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
cb80: 29 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20  ) function must 
cb90: 62 65 20 68 65 6c 64 0a 2a 2a 20 77 68 65 6e 20  be held.** when 
cba0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
cbb0: 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74   called..*/.stat
cbc0: 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 49  ic void releaseI
cbd0: 6e 6f 64 65 49 6e 66 6f 28 75 6e 69 78 46 69 6c  nodeInfo(unixFil
cbe0: 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 75 6e 69  e *pFile){.  uni
cbf0: 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f  xInodeInfo *pIno
cc00: 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  de = pFile->pIno
cc10: 64 65 3b 0a 20 20 61 73 73 65 72 74 28 20 75 6e  de;.  assert( un
cc20: 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b  ixMutexHeld() );
cc30: 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 49  .  if( ALWAYS(pI
cc40: 6e 6f 64 65 29 20 29 7b 0a 20 20 20 20 70 49 6e  node) ){.    pIn
cc50: 6f 64 65 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20  ode->nRef--;.   
cc60: 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 52 65   if( pInode->nRe
cc70: 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73  f==0 ){.      as
cc80: 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 70 53  sert( pInode->pS
cc90: 68 6d 4e 6f 64 65 3d 3d 30 20 29 3b 0a 20 20 20  hmNode==0 );.   
cca0: 20 20 20 63 6c 6f 73 65 50 65 6e 64 69 6e 67 46     closePendingF
ccb0: 64 73 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 20  ds(pFile);.     
ccc0: 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 70 50 72   if( pInode->pPr
ccd0: 65 76 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  ev ){.        as
cce0: 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 70 50  sert( pInode->pP
ccf0: 72 65 76 2d 3e 70 4e 65 78 74 3d 3d 70 49 6e 6f  rev->pNext==pIno
cd00: 64 65 20 29 3b 0a 20 20 20 20 20 20 20 20 70 49  de );.        pI
cd10: 6e 6f 64 65 2d 3e 70 50 72 65 76 2d 3e 70 4e 65  node->pPrev->pNe
cd20: 78 74 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 4e 65  xt = pInode->pNe
cd30: 78 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  xt;.      }else{
cd40: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
cd50: 20 69 6e 6f 64 65 4c 69 73 74 3d 3d 70 49 6e 6f   inodeList==pIno
cd60: 64 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69 6e  de );.        in
cd70: 6f 64 65 4c 69 73 74 20 3d 20 70 49 6e 6f 64 65  odeList = pInode
cd80: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  ->pNext;.      }
cd90: 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e 6f 64  .      if( pInod
cda0: 65 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20  e->pNext ){.    
cdb0: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f      assert( pIno
cdc0: 64 65 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76  de->pNext->pPrev
cdd0: 3d 3d 70 49 6e 6f 64 65 20 29 3b 0a 20 20 20 20  ==pInode );.    
cde0: 20 20 20 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78      pInode->pNex
cdf0: 74 2d 3e 70 50 72 65 76 20 3d 20 70 49 6e 6f 64  t->pPrev = pInod
ce00: 65 2d 3e 70 50 72 65 76 3b 0a 20 20 20 20 20 20  e->pPrev;.      
ce10: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  }.      sqlite3_
ce20: 66 72 65 65 28 70 49 6e 6f 64 65 29 3b 0a 20 20  free(pInode);.  
ce30: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
ce40: 20 47 69 76 65 6e 20 61 20 66 69 6c 65 20 64 65   Given a file de
ce50: 73 63 72 69 70 74 6f 72 2c 20 6c 6f 63 61 74 65  scriptor, locate
ce60: 20 74 68 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e   the unixInodeIn
ce70: 66 6f 20 6f 62 6a 65 63 74 20 74 68 61 74 0a 2a  fo object that.*
ce80: 2a 20 64 65 73 63 72 69 62 65 73 20 74 68 61 74  * describes that
ce90: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
cea0: 2e 20 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  .  Create a new 
ceb0: 6f 6e 65 20 69 66 20 6e 65 63 65 73 73 61 72 79  one if necessary
cec0: 2e 20 20 54 68 65 0a 2a 2a 20 72 65 74 75 72 6e  .  The.** return
ced0: 20 76 61 6c 75 65 20 6d 69 67 68 74 20 62 65 20   value might be 
cee0: 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 69 66  uninitialized if
cef0: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
cf00: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 75 74 65  ..**.** The mute
cf10: 78 20 65 6e 74 65 72 65 64 20 75 73 69 6e 67 20  x entered using 
cf20: 74 68 65 20 75 6e 69 78 45 6e 74 65 72 4d 75 74  the unixEnterMut
cf30: 65 78 28 29 20 66 75 6e 63 74 69 6f 6e 20 6d 75  ex() function mu
cf40: 73 74 20 62 65 20 68 65 6c 64 0a 2a 2a 20 77 68  st be held.** wh
cf50: 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
cf60: 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a   is called..**.*
cf70: 2a 20 52 65 74 75 72 6e 20 61 6e 20 61 70 70 72  * Return an appr
cf80: 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f  opriate error co
cf90: 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  de..*/.static in
cfa0: 74 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28  t findInodeInfo(
cfb0: 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
cfc0: 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  le,             
cfd0: 20 20 2f 2a 20 55 6e 69 78 20 66 69 6c 65 20 77    /* Unix file w
cfe0: 69 74 68 20 66 69 6c 65 20 64 65 73 63 20 75 73  ith file desc us
cff0: 65 64 20 69 6e 20 74 68 65 20 6b 65 79 20 2a 2f  ed in the key */
d000: 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  .  unixInodeInfo
d010: 20 2a 2a 70 70 49 6e 6f 64 65 20 20 20 20 20 20   **ppInode      
d020: 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20    /* Return the 
d030: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62  unixInodeInfo ob
d040: 6a 65 63 74 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  ject here */.){.
d050: 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
d060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d070: 20 2f 2a 20 53 79 73 74 65 6d 20 63 61 6c 6c 20   /* System call 
d080: 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  return code */. 
d090: 20 69 6e 74 20 66 64 3b 20 20 20 20 20 20 20 20   int fd;        
d0a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d0b0: 2f 2a 20 54 68 65 20 66 69 6c 65 20 64 65 73 63  /* The file desc
d0c0: 72 69 70 74 6f 72 20 66 6f 72 20 70 46 69 6c 65  riptor for pFile
d0d0: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 75 6e 69   */.  struct uni
d0e0: 78 46 69 6c 65 49 64 20 66 69 6c 65 49 64 3b 20  xFileId fileId; 
d0f0: 20 20 20 20 20 2f 2a 20 4c 6f 6f 6b 75 70 20 6b       /* Lookup k
d100: 65 79 20 66 6f 72 20 74 68 65 20 75 6e 69 78 49  ey for the unixI
d110: 6e 6f 64 65 49 6e 66 6f 20 2a 2f 0a 20 20 73 74  nodeInfo */.  st
d120: 72 75 63 74 20 73 74 61 74 20 73 74 61 74 62 75  ruct stat statbu
d130: 66 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  f;           /* 
d140: 4c 6f 77 2d 6c 65 76 65 6c 20 66 69 6c 65 20 69  Low-level file i
d150: 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20  nformation */.  
d160: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70  unixInodeInfo *p
d170: 49 6e 6f 64 65 20 3d 20 30 3b 20 20 20 20 20 2f  Inode = 0;     /
d180: 2a 20 43 61 6e 64 69 64 61 74 65 20 75 6e 69 78  * Candidate unix
d190: 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74  InodeInfo object
d1a0: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 75   */..  assert( u
d1b0: 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20 29  nixMutexHeld() )
d1c0: 3b 0a 0a 20 20 2f 2a 20 47 65 74 20 6c 6f 77 2d  ;..  /* Get low-
d1d0: 6c 65 76 65 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  level informatio
d1e0: 6e 20 61 62 6f 75 74 20 74 68 65 20 66 69 6c 65  n about the file
d1f0: 20 74 68 61 74 20 77 65 20 63 61 6e 20 75 73 65   that we can use
d200: 64 20 74 6f 0a 20 20 2a 2a 20 63 72 65 61 74 65  d to.  ** create
d210: 20 61 20 75 6e 69 71 75 65 20 6e 61 6d 65 20 66   a unique name f
d220: 6f 72 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 2a  or the file..  *
d230: 2f 0a 20 20 66 64 20 3d 20 70 46 69 6c 65 2d 3e  /.  fd = pFile->
d240: 68 3b 0a 20 20 72 63 20 3d 20 6f 73 46 73 74 61  h;.  rc = osFsta
d250: 74 28 66 64 2c 20 26 73 74 61 74 62 75 66 29 3b  t(fd, &statbuf);
d260: 0a 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a  .  if( rc!=0 ){.
d270: 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72      storeLastErr
d280: 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29  no(pFile, errno)
d290: 3b 0a 23 69 66 64 65 66 20 45 4f 56 45 52 46 4c  ;.#ifdef EOVERFL
d2a0: 4f 57 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65  OW.    if( pFile
d2b0: 2d 3e 6c 61 73 74 45 72 72 6e 6f 3d 3d 45 4f 56  ->lastErrno==EOV
d2c0: 45 52 46 4c 4f 57 20 29 20 72 65 74 75 72 6e 20  ERFLOW ) return 
d2d0: 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 3b 0a 23 65  SQLITE_NOLFS;.#e
d2e0: 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20  ndif.    return 
d2f0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20  SQLITE_IOERR;.  
d300: 7d 0a 0a 23 69 66 64 65 66 20 5f 5f 41 50 50 4c  }..#ifdef __APPL
d310: 45 5f 5f 0a 20 20 2f 2a 20 4f 6e 20 4f 53 20 58  E__.  /* On OS X
d320: 20 6f 6e 20 61 6e 20 6d 73 64 6f 73 20 66 69 6c   on an msdos fil
d330: 65 73 79 73 74 65 6d 2c 20 74 68 65 20 69 6e 6f  esystem, the ino
d340: 64 65 20 6e 75 6d 62 65 72 20 69 73 20 72 65 70  de number is rep
d350: 6f 72 74 65 64 0a 20 20 2a 2a 20 69 6e 63 6f 72  orted.  ** incor
d360: 72 65 63 74 6c 79 20 66 6f 72 20 7a 65 72 6f 2d  rectly for zero-
d370: 73 69 7a 65 20 66 69 6c 65 73 2e 20 20 53 65 65  size files.  See
d380: 20 74 69 63 6b 65 74 20 23 33 32 36 30 2e 20 20   ticket #3260.  
d390: 54 6f 20 77 6f 72 6b 0a 20 20 2a 2a 20 61 72 6f  To work.  ** aro
d3a0: 75 6e 64 20 74 68 69 73 20 70 72 6f 62 6c 65 6d  und this problem
d3b0: 20 28 77 65 20 63 6f 6e 73 69 64 65 72 20 69 74   (we consider it
d3c0: 20 61 20 62 75 67 20 69 6e 20 4f 53 20 58 2c 20   a bug in OS X, 
d3d0: 6e 6f 74 20 53 51 4c 69 74 65 29 0a 20 20 2a 2a  not SQLite).  **
d3e0: 20 77 65 20 61 6c 77 61 79 73 20 69 6e 63 72 65   we always incre
d3f0: 61 73 65 20 74 68 65 20 66 69 6c 65 20 73 69 7a  ase the file siz
d400: 65 20 74 6f 20 31 20 62 79 20 77 72 69 74 69 6e  e to 1 by writin
d410: 67 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 0a  g a single byte.
d420: 20 20 2a 2a 20 70 72 69 6f 72 20 74 6f 20 61 63    ** prior to ac
d430: 63 65 73 73 69 6e 67 20 74 68 65 20 69 6e 6f 64  cessing the inod
d440: 65 20 6e 75 6d 62 65 72 2e 20 20 54 68 65 20 6f  e number.  The o
d450: 6e 65 20 62 79 74 65 20 77 72 69 74 74 65 6e 20  ne byte written 
d460: 69 73 0a 20 20 2a 2a 20 61 6e 20 41 53 43 49 49  is.  ** an ASCII
d470: 20 27 53 27 20 63 68 61 72 61 63 74 65 72 20 77   'S' character w
d480: 68 69 63 68 20 61 6c 73 6f 20 68 61 70 70 65 6e  hich also happen
d490: 73 20 74 6f 20 62 65 20 74 68 65 20 66 69 72 73  s to be the firs
d4a0: 74 20 62 79 74 65 0a 20 20 2a 2a 20 69 6e 20 74  t byte.  ** in t
d4b0: 68 65 20 68 65 61 64 65 72 20 6f 66 20 65 76 65  he header of eve
d4c0: 72 79 20 53 51 4c 69 74 65 20 64 61 74 61 62 61  ry SQLite databa
d4d0: 73 65 2e 20 20 49 6e 20 74 68 69 73 20 77 61 79  se.  In this way
d4e0: 2c 20 69 66 20 74 68 65 72 65 0a 20 20 2a 2a 20  , if there.  ** 
d4f0: 69 73 20 61 20 72 61 63 65 20 63 6f 6e 64 69 74  is a race condit
d500: 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20 61 6e  ion such that an
d510: 6f 74 68 65 72 20 74 68 72 65 61 64 20 68 61 73  other thread has
d520: 20 61 6c 72 65 61 64 79 20 70 6f 70 75 6c 61 74   already populat
d530: 65 64 0a 20 20 2a 2a 20 74 68 65 20 66 69 72 73  ed.  ** the firs
d540: 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61  t page of the da
d550: 74 61 62 61 73 65 2c 20 6e 6f 20 64 61 6d 61 67  tabase, no damag
d560: 65 20 69 73 20 64 6f 6e 65 2e 0a 20 20 2a 2f 0a  e is done..  */.
d570: 20 20 69 66 28 20 73 74 61 74 62 75 66 2e 73 74    if( statbuf.st
d580: 5f 73 69 7a 65 3d 3d 30 20 26 26 20 28 70 46 69  _size==0 && (pFi
d590: 6c 65 2d 3e 66 73 46 6c 61 67 73 20 26 20 53 51  le->fsFlags & SQ
d5a0: 4c 49 54 45 5f 46 53 46 4c 41 47 53 5f 49 53 5f  LITE_FSFLAGS_IS_
d5b0: 4d 53 44 4f 53 29 21 3d 30 20 29 7b 0a 20 20 20  MSDOS)!=0 ){.   
d5c0: 20 64 6f 7b 20 72 63 20 3d 20 6f 73 57 72 69 74   do{ rc = osWrit
d5d0: 65 28 66 64 2c 20 22 53 22 2c 20 31 29 3b 20 7d  e(fd, "S", 1); }
d5e0: 77 68 69 6c 65 28 20 72 63 3c 30 20 26 26 20 65  while( rc<0 && e
d5f0: 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20  rrno==EINTR );. 
d600: 20 20 20 69 66 28 20 72 63 21 3d 31 20 29 7b 0a     if( rc!=1 ){.
d610: 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45        storeLastE
d620: 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e  rrno(pFile, errn
d630: 6f 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  o);.      return
d640: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20   SQLITE_IOERR;. 
d650: 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 6f 73     }.    rc = os
d660: 46 73 74 61 74 28 66 64 2c 20 26 73 74 61 74 62  Fstat(fd, &statb
d670: 75 66 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  uf);.    if( rc!
d680: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 74 6f 72  =0 ){.      stor
d690: 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65  eLastErrno(pFile
d6a0: 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20  , errno);.      
d6b0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
d6c0: 45 52 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  ERR;.    }.  }.#
d6d0: 65 6e 64 69 66 0a 0a 20 20 6d 65 6d 73 65 74 28  endif..  memset(
d6e0: 26 66 69 6c 65 49 64 2c 20 30 2c 20 73 69 7a 65  &fileId, 0, size
d6f0: 6f 66 28 66 69 6c 65 49 64 29 29 3b 0a 20 20 66  of(fileId));.  f
d700: 69 6c 65 49 64 2e 64 65 76 20 3d 20 73 74 61 74  ileId.dev = stat
d710: 62 75 66 2e 73 74 5f 64 65 76 3b 0a 23 69 66 20  buf.st_dev;.#if 
d720: 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 66 69 6c  OS_VXWORKS.  fil
d730: 65 49 64 2e 70 49 64 20 3d 20 70 46 69 6c 65 2d  eId.pId = pFile-
d740: 3e 70 49 64 3b 0a 23 65 6c 73 65 0a 20 20 66 69  >pId;.#else.  fi
d750: 6c 65 49 64 2e 69 6e 6f 20 3d 20 73 74 61 74 62  leId.ino = statb
d760: 75 66 2e 73 74 5f 69 6e 6f 3b 0a 23 65 6e 64 69  uf.st_ino;.#endi
d770: 66 0a 20 20 70 49 6e 6f 64 65 20 3d 20 69 6e 6f  f.  pInode = ino
d780: 64 65 4c 69 73 74 3b 0a 20 20 77 68 69 6c 65 28  deList;.  while(
d790: 20 70 49 6e 6f 64 65 20 26 26 20 6d 65 6d 63 6d   pInode && memcm
d7a0: 70 28 26 66 69 6c 65 49 64 2c 20 26 70 49 6e 6f  p(&fileId, &pIno
d7b0: 64 65 2d 3e 66 69 6c 65 49 64 2c 20 73 69 7a 65  de->fileId, size
d7c0: 6f 66 28 66 69 6c 65 49 64 29 29 20 29 7b 0a 20  of(fileId)) ){. 
d7d0: 20 20 20 70 49 6e 6f 64 65 20 3d 20 70 49 6e 6f     pInode = pIno
d7e0: 64 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20  de->pNext;.  }. 
d7f0: 20 69 66 28 20 70 49 6e 6f 64 65 3d 3d 30 20 29   if( pInode==0 )
d800: 7b 0a 20 20 20 20 70 49 6e 6f 64 65 20 3d 20 73  {.    pInode = s
d810: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73  qlite3_malloc( s
d820: 69 7a 65 6f 66 28 2a 70 49 6e 6f 64 65 29 20 29  izeof(*pInode) )
d830: 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65  ;.    if( pInode
d840: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ==0 ){.      ret
d850: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
d860: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73  ;.    }.    mems
d870: 65 74 28 70 49 6e 6f 64 65 2c 20 30 2c 20 73 69  et(pInode, 0, si
d880: 7a 65 6f 66 28 2a 70 49 6e 6f 64 65 29 29 3b 0a  zeof(*pInode));.
d890: 20 20 20 20 6d 65 6d 63 70 79 28 26 70 49 6e 6f      memcpy(&pIno
d8a0: 64 65 2d 3e 66 69 6c 65 49 64 2c 20 26 66 69 6c  de->fileId, &fil
d8b0: 65 49 64 2c 20 73 69 7a 65 6f 66 28 66 69 6c 65  eId, sizeof(file
d8c0: 49 64 29 29 3b 0a 20 20 20 20 70 49 6e 6f 64 65  Id));.    pInode
d8d0: 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20  ->nRef = 1;.    
d8e0: 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 20 3d 20  pInode->pNext = 
d8f0: 69 6e 6f 64 65 4c 69 73 74 3b 0a 20 20 20 20 70  inodeList;.    p
d900: 49 6e 6f 64 65 2d 3e 70 50 72 65 76 20 3d 20 30  Inode->pPrev = 0
d910: 3b 0a 20 20 20 20 69 66 28 20 69 6e 6f 64 65 4c  ;.    if( inodeL
d920: 69 73 74 20 29 20 69 6e 6f 64 65 4c 69 73 74 2d  ist ) inodeList-
d930: 3e 70 50 72 65 76 20 3d 20 70 49 6e 6f 64 65 3b  >pPrev = pInode;
d940: 0a 20 20 20 20 69 6e 6f 64 65 4c 69 73 74 20 3d  .    inodeList =
d950: 20 70 49 6e 6f 64 65 3b 0a 20 20 7d 65 6c 73 65   pInode;.  }else
d960: 7b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 52  {.    pInode->nR
d970: 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 2a 70 70 49  ef++;.  }.  *ppI
d980: 6e 6f 64 65 20 3d 20 70 49 6e 6f 64 65 3b 0a 20  node = pInode;. 
d990: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
d9a0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  K;.}../*.** Retu
d9b0: 72 6e 20 54 52 55 45 20 69 66 20 70 46 69 6c 65  rn TRUE if pFile
d9c0: 20 68 61 73 20 62 65 65 6e 20 72 65 6e 61 6d 65   has been rename
d9d0: 64 20 6f 72 20 75 6e 6c 69 6e 6b 65 64 20 73 69  d or unlinked si
d9e0: 6e 63 65 20 69 74 20 77 61 73 20 66 69 72 73 74  nce it was first
d9f0: 20 6f 70 65 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74   opened..*/.stat
da00: 69 63 20 69 6e 74 20 66 69 6c 65 48 61 73 4d 6f  ic int fileHasMo
da10: 76 65 64 28 75 6e 69 78 46 69 6c 65 20 2a 70 46  ved(unixFile *pF
da20: 69 6c 65 29 7b 0a 23 69 66 20 4f 53 5f 56 58 57  ile){.#if OS_VXW
da30: 4f 52 4b 53 0a 20 20 72 65 74 75 72 6e 20 70 46  ORKS.  return pF
da40: 69 6c 65 2d 3e 70 49 6e 6f 64 65 21 3d 30 20 26  ile->pInode!=0 &
da50: 26 20 70 46 69 6c 65 2d 3e 70 49 64 21 3d 70 46  & pFile->pId!=pF
da60: 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 66 69 6c  ile->pInode->fil
da70: 65 49 64 2e 70 49 64 3b 0a 23 65 6c 73 65 0a 20  eId.pId;.#else. 
da80: 20 73 74 72 75 63 74 20 73 74 61 74 20 62 75 66   struct stat buf
da90: 3b 0a 20 20 72 65 74 75 72 6e 20 70 46 69 6c 65  ;.  return pFile
daa0: 2d 3e 70 49 6e 6f 64 65 21 3d 30 20 26 26 0a 20  ->pInode!=0 &&. 
dab0: 20 20 20 20 20 28 6f 73 53 74 61 74 28 70 46 69       (osStat(pFi
dac0: 6c 65 2d 3e 7a 50 61 74 68 2c 20 26 62 75 66 29  le->zPath, &buf)
dad0: 21 3d 30 20 7c 7c 20 62 75 66 2e 73 74 5f 69 6e  !=0 || buf.st_in
dae0: 6f 21 3d 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  o!=pFile->pInode
daf0: 2d 3e 66 69 6c 65 49 64 2e 69 6e 6f 29 3b 0a 23  ->fileId.ino);.#
db00: 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  endif.}.../*.** 
db10: 43 68 65 63 6b 20 61 20 75 6e 69 78 46 69 6c 65  Check a unixFile
db20: 20 74 68 61 74 20 69 73 20 61 20 64 61 74 61 62   that is a datab
db30: 61 73 65 2e 20 20 56 65 72 69 66 79 20 74 68 65  ase.  Verify the
db40: 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
db50: 2a 20 28 31 29 20 54 68 65 72 65 20 69 73 20 65  * (1) There is e
db60: 78 61 63 74 6c 79 20 6f 6e 65 20 68 61 72 64 20  xactly one hard 
db70: 6c 69 6e 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65  link on the file
db80: 0a 2a 2a 20 28 32 29 20 54 68 65 20 66 69 6c 65  .** (2) The file
db90: 20 69 73 20 6e 6f 74 20 61 20 73 79 6d 62 6f 6c   is not a symbol
dba0: 69 63 20 6c 69 6e 6b 0a 2a 2a 20 28 33 29 20 54  ic link.** (3) T
dbb0: 68 65 20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20  he file has not 
dbc0: 62 65 65 6e 20 72 65 6e 61 6d 65 64 20 6f 72 20  been renamed or 
dbd0: 75 6e 6c 69 6e 6b 65 64 0a 2a 2a 0a 2a 2a 20 49  unlinked.**.** I
dbe0: 73 73 75 65 20 73 71 6c 69 74 65 33 5f 6c 6f 67  ssue sqlite3_log
dbf0: 28 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 2c  (SQLITE_WARNING,
dc00: 2e 2e 2e 29 20 6d 65 73 73 61 67 65 73 20 69 66  ...) messages if
dc10: 20 61 6e 79 74 68 69 6e 67 20 69 73 20 6e 6f 74   anything is not
dc20: 20 72 69 67 68 74 2e 0a 2a 2f 0a 73 74 61 74 69   right..*/.stati
dc30: 63 20 76 6f 69 64 20 76 65 72 69 66 79 44 62 46  c void verifyDbF
dc40: 69 6c 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46  ile(unixFile *pF
dc50: 69 6c 65 29 7b 0a 20 20 73 74 72 75 63 74 20 73  ile){.  struct s
dc60: 74 61 74 20 62 75 66 3b 0a 20 20 69 6e 74 20 72  tat buf;.  int r
dc70: 63 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  c;.  if( pFile->
dc80: 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58  ctrlFlags & UNIX
dc90: 46 49 4c 45 5f 57 41 52 4e 45 44 20 29 7b 0a 20  FILE_WARNED ){. 
dca0: 20 20 20 2f 2a 20 4f 6e 65 20 6f 72 20 6d 6f 72     /* One or mor
dcb0: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
dcc0: 6e 67 20 77 61 72 6e 69 6e 67 73 20 68 61 76 65  ng warnings have
dcd0: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 69 73   already been is
dce0: 73 75 65 64 2e 20 20 44 6f 20 6e 6f 74 0a 20 20  sued.  Do not.  
dcf0: 20 20 2a 2a 20 72 65 70 65 61 74 20 74 68 65 6d    ** repeat them
dd00: 20 73 6f 20 61 73 20 6e 6f 74 20 74 6f 20 63 6c   so as not to cl
dd10: 75 74 74 65 72 20 74 68 65 20 65 72 72 6f 72 20  utter the error 
dd20: 6c 6f 67 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  log */.    retur
dd30: 6e 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 6f 73  n;.  }.  rc = os
dd40: 46 73 74 61 74 28 70 46 69 6c 65 2d 3e 68 2c 20  Fstat(pFile->h, 
dd50: 26 62 75 66 29 3b 0a 20 20 69 66 28 20 72 63 21  &buf);.  if( rc!
dd60: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
dd70: 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 57 41 52  3_log(SQLITE_WAR
dd80: 4e 49 4e 47 2c 20 22 63 61 6e 6e 6f 74 20 66 73  NING, "cannot fs
dd90: 74 61 74 20 64 62 20 66 69 6c 65 20 25 73 22 2c  tat db file %s",
dda0: 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a   pFile->zPath);.
ddb0: 20 20 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46      pFile->ctrlF
ddc0: 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45  lags |= UNIXFILE
ddd0: 5f 57 41 52 4e 45 44 3b 0a 20 20 20 20 72 65 74  _WARNED;.    ret
dde0: 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 62  urn;.  }.  if( b
ddf0: 75 66 2e 73 74 5f 6e 6c 69 6e 6b 3d 3d 30 20 26  uf.st_nlink==0 &
de00: 26 20 28 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c  & (pFile->ctrlFl
de10: 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 44  ags & UNIXFILE_D
de20: 45 4c 45 54 45 29 3d 3d 30 20 29 7b 0a 20 20 20  ELETE)==0 ){.   
de30: 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c   sqlite3_log(SQL
de40: 49 54 45 5f 57 41 52 4e 49 4e 47 2c 20 22 66 69  ITE_WARNING, "fi
de50: 6c 65 20 75 6e 6c 69 6e 6b 65 64 20 77 68 69 6c  le unlinked whil
de60: 65 20 6f 70 65 6e 3a 20 25 73 22 2c 20 70 46 69  e open: %s", pFi
de70: 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20  le->zPath);.    
de80: 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73  pFile->ctrlFlags
de90: 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 57 41 52   |= UNIXFILE_WAR
dea0: 4e 45 44 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  NED;.    return;
deb0: 0a 20 20 7d 0a 20 20 69 66 28 20 62 75 66 2e 73  .  }.  if( buf.s
dec0: 74 5f 6e 6c 69 6e 6b 3e 31 20 29 7b 0a 20 20 20  t_nlink>1 ){.   
ded0: 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c   sqlite3_log(SQL
dee0: 49 54 45 5f 57 41 52 4e 49 4e 47 2c 20 22 6d 75  ITE_WARNING, "mu
def0: 6c 74 69 70 6c 65 20 6c 69 6e 6b 73 20 74 6f 20  ltiple links to 
df00: 66 69 6c 65 3a 20 25 73 22 2c 20 70 46 69 6c 65  file: %s", pFile
df10: 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 70 46  ->zPath);.    pF
df20: 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c  ile->ctrlFlags |
df30: 3d 20 55 4e 49 58 46 49 4c 45 5f 57 41 52 4e 45  = UNIXFILE_WARNE
df40: 44 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  D;.    return;. 
df50: 20 7d 0a 20 20 69 66 28 20 66 69 6c 65 48 61 73   }.  if( fileHas
df60: 4d 6f 76 65 64 28 70 46 69 6c 65 29 20 29 7b 0a  Moved(pFile) ){.
df70: 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28      sqlite3_log(
df80: 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 2c 20  SQLITE_WARNING, 
df90: 22 66 69 6c 65 20 72 65 6e 61 6d 65 64 20 77 68  "file renamed wh
dfa0: 69 6c 65 20 6f 70 65 6e 3a 20 25 73 22 2c 20 70  ile open: %s", p
dfb0: 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  File->zPath);.  
dfc0: 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61    pFile->ctrlFla
dfd0: 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 57  gs |= UNIXFILE_W
dfe0: 41 52 4e 45 44 3b 0a 20 20 20 20 72 65 74 75 72  ARNED;.    retur
dff0: 6e 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  n;.  }.}.../*.**
e000: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68   This routine ch
e010: 65 63 6b 73 20 69 66 20 74 68 65 72 65 20 69 73  ecks if there is
e020: 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
e030: 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65   held on the spe
e040: 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62  cified.** file b
e050: 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74  y this or any ot
e060: 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20  her process. If 
e070: 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68  such a lock is h
e080: 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f 75  eld, set *pResOu
e090: 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65  t.** to a non-ze
e0a0: 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77 69  ro value otherwi
e0b0: 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73  se *pResOut is s
e0c0: 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65  et to zero.  The
e0d0: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a   return value.**
e0e0: 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54   is set to SQLIT
e0f0: 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49  E_OK unless an I
e100: 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  /O error occurs 
e110: 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63  during lock chec
e120: 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  king..*/.static 
e130: 69 6e 74 20 75 6e 69 78 43 68 65 63 6b 52 65 73  int unixCheckRes
e140: 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65  ervedLock(sqlite
e150: 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
e160: 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e 74  *pResOut){.  int
e170: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
e180: 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65 64 20  .  int reserved 
e190: 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20  = 0;.  unixFile 
e1a0: 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
e1b0: 6c 65 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75 6c  le*)id;..  Simul
e1c0: 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75  ateIOError( retu
e1d0: 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
e1e0: 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43  CHECKRESERVEDLOC
e1f0: 4b 3b 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  K; );..  assert(
e200: 20 70 46 69 6c 65 20 29 3b 0a 20 20 75 6e 69 78   pFile );.  unix
e210: 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 20 2f 2a  EnterMutex(); /*
e220: 20 42 65 63 61 75 73 65 20 70 46 69 6c 65 2d 3e   Because pFile->
e230: 70 49 6e 6f 64 65 20 69 73 20 73 68 61 72 65 64  pInode is shared
e240: 20 61 63 72 6f 73 73 20 74 68 72 65 61 64 73 20   across threads 
e250: 2a 2f 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69  */..  /* Check i
e260: 66 20 61 20 74 68 72 65 61 64 20 69 6e 20 74 68  f a thread in th
e270: 69 73 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73  is process holds
e280: 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a   such a lock */.
e290: 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 49 6e    if( pFile->pIn
e2a0: 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53  ode->eFileLock>S
e2b0: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  HARED_LOCK ){.  
e2c0: 20 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a    reserved = 1;.
e2d0: 20 20 7d 0a 0a 20 20 2f 2a 20 4f 74 68 65 72 77    }..  /* Otherw
e2e0: 69 73 65 20 73 65 65 20 69 66 20 73 6f 6d 65 20  ise see if some 
e2f0: 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 68 6f  other process ho
e300: 6c 64 73 20 69 74 2e 0a 20 20 2a 2f 0a 23 69 66  lds it..  */.#if
e310: 6e 64 65 66 20 5f 5f 44 4a 47 50 50 5f 5f 0a 20  ndef __DJGPP__. 
e320: 20 69 66 28 20 21 72 65 73 65 72 76 65 64 20 26   if( !reserved &
e330: 26 20 21 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  & !pFile->pInode
e340: 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 20 29  ->bProcessLock )
e350: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 66 6c 6f  {.    struct flo
e360: 63 6b 20 6c 6f 63 6b 3b 0a 20 20 20 20 6c 6f 63  ck lock;.    loc
e370: 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45  k.l_whence = SEE
e380: 4b 5f 53 45 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e  K_SET;.    lock.
e390: 6c 5f 73 74 61 72 74 20 3d 20 52 45 53 45 52 56  l_start = RESERV
e3a0: 45 44 5f 42 59 54 45 3b 0a 20 20 20 20 6c 6f 63  ED_BYTE;.    loc
e3b0: 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20 20  k.l_len = 1;.   
e3c0: 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46   lock.l_type = F
e3d0: 5f 57 52 4c 43 4b 3b 0a 20 20 20 20 69 66 28 20  _WRLCK;.    if( 
e3e0: 6f 73 46 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68  osFcntl(pFile->h
e3f0: 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63 6b  , F_GETLK, &lock
e400: 29 20 29 7b 0a 23 69 66 20 4f 53 4c 4f 43 4b 49  ) ){.#if OSLOCKI
e410: 4e 47 5f 43 48 45 43 4b 5f 42 55 53 59 5f 49 4f  NG_CHECK_BUSY_IO
e420: 45 52 52 0a 20 20 20 20 20 20 69 6e 74 20 74 45  ERR.      int tE
e430: 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
e440: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45      rc = sqliteE
e450: 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
e460: 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54  or(tErrno, SQLIT
e470: 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53  E_IOERR_CHECKRES
e480: 45 52 56 45 44 4c 4f 43 4b 29 3b 0a 20 20 20 20  ERVEDLOCK);.    
e490: 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f    storeLastErrno
e4a0: 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b  (pFile, tErrno);
e4b0: 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 72 63 20  .#else.      rc 
e4c0: 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43  = SQLITE_IOERR_C
e4d0: 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b  HECKRESERVEDLOCK
e4e0: 3b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73  ;.      storeLas
e4f0: 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72  tErrno(pFile, er
e500: 72 6e 6f 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  rno);.#endif.   
e510: 20 7d 20 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b   } else if( lock
e520: 2e 6c 5f 74 79 70 65 21 3d 46 5f 55 4e 4c 43 4b  .l_type!=F_UNLCK
e530: 20 29 7b 0a 20 20 20 20 20 20 72 65 73 65 72 76   ){.      reserv
e540: 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ed = 1;.    }.  
e550: 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 75 6e  }.#endif.  .  un
e560: 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
e570: 20 20 4f 53 54 52 41 43 45 28 28 22 54 45 53 54    OSTRACE(("TEST
e580: 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25   WR-LOCK %d %d %
e590: 64 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69  d (unix)\n", pFi
e5a0: 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65 72  le->h, rc, reser
e5b0: 76 65 64 29 29 3b 0a 0a 20 20 2a 70 52 65 73 4f  ved));..  *pResO
e5c0: 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20  ut = reserved;. 
e5d0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
e5e0: 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20  *.** Attempt to 
e5f0: 73 65 74 20 61 20 73 79 73 74 65 6d 2d 6c 6f 63  set a system-loc
e600: 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 70 46  k on the file pF
e610: 69 6c 65 2e 20 20 54 68 65 20 6c 6f 63 6b 20 69  ile.  The lock i
e620: 73 20 0a 2a 2a 20 64 65 73 63 72 69 62 65 64 20  s .** described 
e630: 62 79 20 70 4c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20  by pLock..**.** 
e640: 49 66 20 74 68 65 20 70 46 69 6c 65 20 77 61 73  If the pFile was
e650: 20 6f 70 65 6e 65 64 20 72 65 61 64 2f 77 72 69   opened read/wri
e660: 74 65 20 66 72 6f 6d 20 75 6e 69 78 2d 65 78 63  te from unix-exc
e670: 6c 2c 20 74 68 65 6e 20 74 68 65 20 6f 6e 6c 79  l, then the only
e680: 20 6c 6f 63 6b 0a 2a 2a 20 65 76 65 72 20 6f 62   lock.** ever ob
e690: 74 61 69 6e 65 64 20 69 73 20 61 6e 20 65 78 63  tained is an exc
e6a0: 6c 75 73 69 76 65 20 6c 6f 63 6b 2c 20 61 6e 64  lusive lock, and
e6b0: 20 69 74 20 69 73 20 6f 62 74 61 69 6e 65 64 20   it is obtained 
e6c0: 65 78 61 63 74 6c 79 20 6f 6e 63 65 0a 2a 2a 20  exactly once.** 
e6d0: 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 61  the first time a
e6e0: 6e 79 20 6c 6f 63 6b 20 69 73 20 61 74 74 65 6d  ny lock is attem
e6f0: 70 74 65 64 2e 20 20 41 6c 6c 20 73 75 62 73 65  pted.  All subse
e700: 71 75 65 6e 74 20 73 79 73 74 65 6d 20 6c 6f 63  quent system loc
e710: 6b 69 6e 67 0a 2a 2a 20 6f 70 65 72 61 74 69 6f  king.** operatio
e720: 6e 73 20 62 65 63 6f 6d 65 20 6e 6f 2d 6f 70 73  ns become no-ops
e730: 2e 20 20 4c 6f 63 6b 69 6e 67 20 6f 70 65 72 61  .  Locking opera
e740: 74 69 6f 6e 73 20 73 74 69 6c 6c 20 68 61 70 70  tions still happ
e750: 65 6e 20 69 6e 74 65 72 6e 61 6c 6c 79 2c 0a 2a  en internally,.*
e760: 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f  * in order to co
e770: 6f 72 64 69 6e 61 74 65 20 61 63 63 65 73 73 20  ordinate access 
e780: 62 65 74 77 65 65 6e 20 73 65 70 61 72 61 74 65  between separate
e790: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
e7a0: 74 69 6f 6e 73 0a 2a 2a 20 77 69 74 68 69 6e 20  tions.** within 
e7b0: 74 68 69 73 20 70 72 6f 63 65 73 73 2c 20 62 75  this process, bu
e7c0: 74 20 61 6c 6c 20 6f 66 20 74 68 61 74 20 69 73  t all of that is
e7d0: 20 68 61 6e 64 6c 65 64 20 69 6e 20 6d 65 6d 6f   handled in memo
e7e0: 72 79 20 61 6e 64 20 74 68 65 0a 2a 2a 20 6f 70  ry and the.** op
e7f0: 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 64  erating system d
e800: 6f 65 73 20 6e 6f 74 20 70 61 72 74 69 63 69 70  oes not particip
e810: 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ate..**.** This 
e820: 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 70 61  function is a pa
e830: 73 73 2d 74 68 72 6f 75 67 68 20 74 6f 20 66 63  ss-through to fc
e840: 6e 74 6c 28 46 5f 53 45 54 4c 4b 29 20 69 66 20  ntl(F_SETLK) if 
e850: 70 46 69 6c 65 20 69 73 20 75 73 69 6e 67 0a 2a  pFile is using.*
e860: 2a 20 61 6e 79 20 56 46 53 20 6f 74 68 65 72 20  * any VFS other 
e870: 74 68 61 6e 20 22 75 6e 69 78 2d 65 78 63 6c 22  than "unix-excl"
e880: 20 6f 72 20 69 66 20 70 46 69 6c 65 20 69 73 20   or if pFile is 
e890: 6f 70 65 6e 65 64 20 6f 6e 20 22 75 6e 69 78 2d  opened on "unix-
e8a0: 65 78 63 6c 22 0a 2a 2a 20 61 6e 64 20 69 73 20  excl".** and is 
e8b0: 72 65 61 64 2d 6f 6e 6c 79 2e 0a 2a 2a 0a 2a 2a  read-only..**.**
e8c0: 20 5a 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65   Zero is returne
e8d0: 64 20 69 66 20 74 68 65 20 63 61 6c 6c 20 63 6f  d if the call co
e8e0: 6d 70 6c 65 74 65 73 20 73 75 63 63 65 73 73 66  mpletes successf
e8f0: 75 6c 6c 79 2c 20 6f 72 20 2d 31 20 69 66 20 61  ully, or -1 if a
e900: 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 66 63 6e 74   call.** to fcnt
e910: 6c 28 29 20 66 61 69 6c 73 2e 20 49 6e 20 74 68  l() fails. In th
e920: 69 73 20 63 61 73 65 2c 20 65 72 72 6e 6f 20 69  is case, errno i
e930: 73 20 73 65 74 20 61 70 70 72 6f 70 72 69 61 74  s set appropriat
e940: 65 6c 79 20 28 62 79 20 66 63 6e 74 6c 28 29 29  ely (by fcntl())
e950: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
e960: 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 75 6e 69  unixFileLock(uni
e970: 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 73 74  xFile *pFile, st
e980: 72 75 63 74 20 66 6c 6f 63 6b 20 2a 70 4c 6f 63  ruct flock *pLoc
e990: 6b 2c 20 69 6e 74 20 6e 52 65 74 72 79 29 7b 0a  k, int nRetry){.
e9a0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e 69 78    int rc;.  unix
e9b0: 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64  InodeInfo *pInod
e9c0: 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  e = pFile->pInod
e9d0: 65 3b 0a 20 20 61 73 73 65 72 74 28 20 75 6e 69  e;.  assert( uni
e9e0: 78 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a  xMutexHeld() );.
e9f0: 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65    assert( pInode
ea00: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 28 28 70  !=0 );.  if( ((p
ea10: 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20  File->ctrlFlags 
ea20: 26 20 55 4e 49 58 46 49 4c 45 5f 45 58 43 4c 29  & UNIXFILE_EXCL)
ea30: 21 3d 30 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 62  !=0 || pInode->b
ea40: 50 72 6f 63 65 73 73 4c 6f 63 6b 29 0a 20 20 20  ProcessLock).   
ea50: 26 26 20 28 28 70 46 69 6c 65 2d 3e 63 74 72 6c  && ((pFile->ctrl
ea60: 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45  Flags & UNIXFILE
ea70: 5f 52 44 4f 4e 4c 59 29 3d 3d 30 29 0a 20 20 29  _RDONLY)==0).  )
ea80: 7b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65  {.    if( pInode
ea90: 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d  ->bProcessLock==
eaa0: 30 20 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63  0 ){.      struc
eab0: 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20  t flock lock;.  
eac0: 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f      assert( pIno
ead0: 64 65 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20 29 3b 0a  de->nLock==0 );.
eae0: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65        lock.l_whe
eaf0: 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a  nce = SEEK_SET;.
eb00: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61        lock.l_sta
eb10: 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53  rt = SHARED_FIRS
eb20: 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  T;.      lock.l_
eb30: 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a  len = SHARED_SIZ
eb40: 45 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  E;.      lock.l_
eb50: 74 79 70 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a  type = F_WRLCK;.
eb60: 20 20 20 20 20 20 72 63 20 3d 20 6f 73 46 63 6e        rc = osFcn
eb70: 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 53  tl(pFile->h, F_S
eb80: 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3b 0a 20 20  ETLK, &lock);.  
eb90: 20 20 20 20 69 66 28 20 72 63 3c 30 20 29 20 72      if( rc<0 ) r
eba0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
ebb0: 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73  pInode->bProcess
ebc0: 4c 6f 63 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20  Lock = 1;.      
ebd0: 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b  pInode->nLock++;
ebe0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
ebf0: 20 20 72 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a    rc = 0;.    }.
ec00: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
ec10: 20 69 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20   i = 0;         
ec20: 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 20 20               .  
ec30: 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 72 63 20    do {.      rc 
ec40: 3d 20 6f 73 46 63 6e 74 6c 28 70 46 69 6c 65 2d  = osFcntl(pFile-
ec50: 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 70 4c 6f  >h, F_SETLK, pLo
ec60: 63 6b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ck);.      if( r
ec70: 63 20 26 26 20 6e 52 65 74 72 79 20 29 7b 0a 20  c && nRetry ){. 
ec80: 20 20 20 20 20 20 20 20 75 73 6c 65 65 70 28 31          usleep(1
ec90: 30 30 20 2a 20 28 2b 2b 69 29 29 3b 0a 20 20 20  00 * (++i));.   
eca0: 20 20 20 7d 0a 20 20 20 20 7d 77 68 69 6c 65 28     }.    }while(
ecb0: 20 21 72 63 20 26 26 20 6e 52 65 74 72 79 2d 2d   !rc && nRetry--
ecc0: 20 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   );.  }.  return
ecd0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f   rc;.}../*.** Lo
ece0: 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74 68  ck the file with
ecf0: 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66   the lock specif
ed00: 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72  ied by parameter
ed10: 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65   eFileLock - one
ed20: 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  .** of the follo
ed30: 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  wing:.**.**     
ed40: 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a  (1) SHARED_LOCK.
ed50: 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53 45 52  **     (2) RESER
ed60: 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  VED_LOCK.**     
ed70: 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  (3) PENDING_LOCK
ed80: 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c  .**     (4) EXCL
ed90: 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a  USIVE_LOCK.**.**
eda0: 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20   Sometimes when 
edb0: 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c  requesting one l
edc0: 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74  ock state, addit
edd0: 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65  ional lock state
ede0: 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65  s.** are inserte
edf0: 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54  d in between.  T
ee00: 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74  he locking might
ee10: 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20   fail on one of 
ee20: 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61  the later.** tra
ee30: 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67  nsitions leaving
ee40: 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20   the lock state 
ee50: 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77  different from w
ee60: 68 61 74 20 69 74 20 73 74 61 72 74 65 64 20 62  hat it started b
ee70: 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72  ut.** still shor
ee80: 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20  t of its goal.  
ee90: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68  The following ch
eea0: 61 72 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c  art shows the al
eeb0: 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74  lowed.** transit
eec0: 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73  ions and the ins
eed0: 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61  erted intermedia
eee0: 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a  te states:.**.**
eef0: 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20      UNLOCKED -> 
ef00: 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41  SHARED.**    SHA
ef10: 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a  RED -> RESERVED.
ef20: 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20  **    SHARED -> 
ef30: 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43  (PENDING) -> EXC
ef40: 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53  LUSIVE.**    RES
ef50: 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e  ERVED -> (PENDIN
ef60: 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  G) -> EXCLUSIVE.
ef70: 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e  **    PENDING ->
ef80: 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a   EXCLUSIVE.**.**
ef90: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   This routine wi
efa0: 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65  ll only increase
efb0: 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68   a lock.  Use th
efc0: 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63  e sqlite3OsUnloc
efd0: 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74  k().** routine t
efe0: 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e  o lower a lockin
eff0: 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74  g level..*/.stat
f000: 69 63 20 69 6e 74 20 75 6e 69 78 4c 6f 63 6b 28  ic int unixLock(
f010: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
f020: 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29  , int eFileLock)
f030: 7b 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f  {.  /* The follo
f040: 77 69 6e 67 20 64 65 73 63 72 69 62 65 73 20 74  wing describes t
f050: 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
f060: 6e 20 6f 66 20 74 68 65 20 76 61 72 69 6f 75 73  n of the various
f070: 20 6c 6f 63 6b 73 20 61 6e 64 0a 20 20 2a 2a 20   locks and.  ** 
f080: 6c 6f 63 6b 20 74 72 61 6e 73 69 74 69 6f 6e 73  lock transitions
f090: 20 69 6e 20 74 65 72 6d 73 20 6f 66 20 74 68 65   in terms of the
f0a0: 20 50 4f 53 49 58 20 61 64 76 69 73 6f 72 79 20   POSIX advisory 
f0b0: 73 68 61 72 65 64 20 61 6e 64 20 65 78 63 6c 75  shared and exclu
f0c0: 73 69 76 65 0a 20 20 2a 2a 20 6c 6f 63 6b 20 70  sive.  ** lock p
f0d0: 72 69 6d 69 74 69 76 65 73 20 28 63 61 6c 6c 65  rimitives (calle
f0e0: 64 20 72 65 61 64 2d 6c 6f 63 6b 73 20 61 6e 64  d read-locks and
f0f0: 20 77 72 69 74 65 2d 6c 6f 63 6b 73 20 62 65 6c   write-locks bel
f100: 6f 77 2c 20 74 6f 20 61 76 6f 69 64 0a 20 20 2a  ow, to avoid.  *
f110: 2a 20 63 6f 6e 66 75 73 69 6f 6e 20 77 69 74 68  * confusion with
f120: 20 53 51 4c 69 74 65 20 6c 6f 63 6b 20 6e 61 6d   SQLite lock nam
f130: 65 73 29 2e 20 54 68 65 20 61 6c 67 6f 72 69 74  es). The algorit
f140: 68 6d 73 20 61 72 65 20 63 6f 6d 70 6c 69 63 61  hms are complica
f150: 74 65 64 0a 20 20 2a 2a 20 73 6c 69 67 68 74 6c  ted.  ** slightl
f160: 79 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 62 65  y in order to be
f170: 20 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68   compatible with
f180: 20 77 69 6e 64 6f 77 73 20 73 79 73 74 65 6d 73   windows systems
f190: 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73 6c 79 0a   simultaneously.
f1a0: 20 20 2a 2a 20 61 63 63 65 73 73 69 6e 67 20 74    ** accessing t
f1b0: 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65  he same database
f1c0: 20 66 69 6c 65 2c 20 69 6e 20 63 61 73 65 20 74   file, in case t
f1d0: 68 61 74 20 69 73 20 65 76 65 72 20 72 65 71 75  hat is ever requ
f1e0: 69 72 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ired..  **.  ** 
f1f0: 53 79 6d 62 6f 6c 73 20 64 65 66 69 6e 65 64 20  Symbols defined 
f200: 69 6e 20 6f 73 2e 68 20 69 6e 64 65 6e 74 69 66  in os.h indentif
f210: 79 20 74 68 65 20 27 70 65 6e 64 69 6e 67 20 62  y the 'pending b
f220: 79 74 65 27 20 61 6e 64 20 74 68 65 20 27 72 65  yte' and the 're
f230: 73 65 72 76 65 64 0a 20 20 2a 2a 20 62 79 74 65  served.  ** byte
f240: 27 2c 20 65 61 63 68 20 73 69 6e 67 6c 65 20 62  ', each single b
f250: 79 74 65 73 20 61 74 20 77 65 6c 6c 20 6b 6e 6f  ytes at well kno
f260: 77 6e 20 6f 66 66 73 65 74 73 2c 20 61 6e 64 20  wn offsets, and 
f270: 74 68 65 20 27 73 68 61 72 65 64 20 62 79 74 65  the 'shared byte
f280: 0a 20 20 2a 2a 20 72 61 6e 67 65 27 2c 20 61 20  .  ** range', a 
f290: 72 61 6e 67 65 20 6f 66 20 35 31 30 20 62 79 74  range of 510 byt
f2a0: 65 73 20 61 74 20 61 20 77 65 6c 6c 20 6b 6e 6f  es at a well kno
f2b0: 77 6e 20 6f 66 66 73 65 74 2e 0a 20 20 2a 2a 0a  wn offset..  **.
f2c0: 20 20 2a 2a 20 54 6f 20 6f 62 74 61 69 6e 20 61    ** To obtain a
f2d0: 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 61 20   SHARED lock, a 
f2e0: 72 65 61 64 2d 6c 6f 63 6b 20 69 73 20 6f 62 74  read-lock is obt
f2f0: 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 27 70 65  ained on the 'pe
f300: 6e 64 69 6e 67 0a 20 20 2a 2a 20 62 79 74 65 27  nding.  ** byte'
f310: 2e 20 20 49 66 20 74 68 69 73 20 69 73 20 73 75  .  If this is su
f320: 63 63 65 73 73 66 75 6c 2c 20 61 20 72 61 6e 64  ccessful, a rand
f330: 6f 6d 20 62 79 74 65 20 66 72 6f 6d 20 74 68 65  om byte from the
f340: 20 27 73 68 61 72 65 64 20 62 79 74 65 0a 20 20   'shared byte.  
f350: 2a 2a 20 72 61 6e 67 65 27 20 69 73 20 72 65 61  ** range' is rea
f360: 64 2d 6c 6f 63 6b 65 64 20 61 6e 64 20 74 68 65  d-locked and the
f370: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 27 70 65   lock on the 'pe
f380: 6e 64 69 6e 67 20 62 79 74 65 27 20 72 65 6c 65  nding byte' rele
f390: 61 73 65 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ased..  **.  ** 
f3a0: 41 20 70 72 6f 63 65 73 73 20 6d 61 79 20 6f 6e  A process may on
f3b0: 6c 79 20 6f 62 74 61 69 6e 20 61 20 52 45 53 45  ly obtain a RESE
f3c0: 52 56 45 44 20 6c 6f 63 6b 20 61 66 74 65 72 20  RVED lock after 
f3d0: 69 74 20 68 61 73 20 61 20 53 48 41 52 45 44 20  it has a SHARED 
f3e0: 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 41 20 52 45 53  lock..  ** A RES
f3f0: 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 69 6d  ERVED lock is im
f400: 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 67 72 61  plemented by gra
f410: 62 62 69 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f  bbing a write-lo
f420: 63 6b 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 27  ck on the.  ** '
f430: 72 65 73 65 72 76 65 64 20 62 79 74 65 27 2e 20  reserved byte'. 
f440: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 70 72 6f  .  **.  ** A pro
f450: 63 65 73 73 20 6d 61 79 20 6f 6e 6c 79 20 6f 62  cess may only ob
f460: 74 61 69 6e 20 61 20 50 45 4e 44 49 4e 47 20 6c  tain a PENDING l
f470: 6f 63 6b 20 61 66 74 65 72 20 69 74 20 68 61 73  ock after it has
f480: 20 6f 62 74 61 69 6e 65 64 20 61 0a 20 20 2a 2a   obtained a.  **
f490: 20 53 48 41 52 45 44 20 6c 6f 63 6b 2e 20 41 20   SHARED lock. A 
f4a0: 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20  PENDING lock is 
f4b0: 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 6f  implemented by o
f4c0: 62 74 61 69 6e 69 6e 67 20 61 20 77 72 69 74 65  btaining a write
f4d0: 2d 6c 6f 63 6b 0a 20 20 2a 2a 20 6f 6e 20 74 68  -lock.  ** on th
f4e0: 65 20 27 70 65 6e 64 69 6e 67 20 62 79 74 65 27  e 'pending byte'
f4f0: 2e 20 54 68 69 73 20 65 6e 73 75 72 65 73 20 74  . This ensures t
f500: 68 61 74 20 6e 6f 20 6e 65 77 20 53 48 41 52 45  hat no new SHARE
f510: 44 20 6c 6f 63 6b 73 20 63 61 6e 20 62 65 0a 20  D locks can be. 
f520: 20 2a 2a 20 6f 62 74 61 69 6e 65 64 2c 20 62 75   ** obtained, bu
f530: 74 20 65 78 69 73 74 69 6e 67 20 53 48 41 52 45  t existing SHARE
f540: 44 20 6c 6f 63 6b 73 20 61 72 65 20 61 6c 6c 6f  D locks are allo
f550: 77 65 64 20 74 6f 20 70 65 72 73 69 73 74 2e 20  wed to persist. 
f560: 41 20 70 72 6f 63 65 73 73 0a 20 20 2a 2a 20 64  A process.  ** d
f570: 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 74 6f 20  oes not have to 
f580: 6f 62 74 61 69 6e 20 61 20 52 45 53 45 52 56 45  obtain a RESERVE
f590: 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 77 61  D lock on the wa
f5a0: 79 20 74 6f 20 61 20 50 45 4e 44 49 4e 47 20 6c  y to a PENDING l
f5b0: 6f 63 6b 2e 0a 20 20 2a 2a 20 54 68 69 73 20 70  ock..  ** This p
f5c0: 72 6f 70 65 72 74 79 20 69 73 20 75 73 65 64 20  roperty is used 
f5d0: 62 79 20 74 68 65 20 61 6c 67 6f 72 69 74 68 6d  by the algorithm
f5e0: 20 66 6f 72 20 72 6f 6c 6c 69 6e 67 20 62 61 63   for rolling bac
f5f0: 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  k a journal file
f600: 0a 20 20 2a 2a 20 61 66 74 65 72 20 61 20 63 72  .  ** after a cr
f610: 61 73 68 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41  ash..  **.  ** A
f620: 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
f630: 2c 20 6f 62 74 61 69 6e 65 64 20 61 66 74 65 72  , obtained after
f640: 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20   a PENDING lock 
f650: 69 73 20 68 65 6c 64 2c 20 69 73 0a 20 20 2a 2a  is held, is.  **
f660: 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20   implemented by 
f670: 6f 62 74 61 69 6e 69 6e 67 20 61 20 77 72 69 74  obtaining a writ
f680: 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 65 6e  e-lock on the en
f690: 74 69 72 65 20 27 73 68 61 72 65 64 20 62 79 74  tire 'shared byt
f6a0: 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27 2e 20 53  e.  ** range'. S
f6b0: 69 6e 63 65 20 61 6c 6c 20 6f 74 68 65 72 20 6c  ince all other l
f6c0: 6f 63 6b 73 20 72 65 71 75 69 72 65 20 61 20 72  ocks require a r
f6d0: 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 6f 6e 65 20  ead-lock on one 
f6e0: 6f 66 20 74 68 65 20 62 79 74 65 73 0a 20 20 2a  of the bytes.  *
f6f0: 2a 20 77 69 74 68 69 6e 20 74 68 69 73 20 72 61  * within this ra
f700: 6e 67 65 2c 20 74 68 69 73 20 65 6e 73 75 72 65  nge, this ensure
f710: 73 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20  s that no other 
f720: 6c 6f 63 6b 73 20 61 72 65 20 68 65 6c 64 20 6f  locks are held o
f730: 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62  n the.  ** datab
f740: 61 73 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ase. .  **.  ** 
f750: 54 68 65 20 72 65 61 73 6f 6e 20 61 20 73 69 6e  The reason a sin
f760: 67 6c 65 20 62 79 74 65 20 63 61 6e 6e 6f 74 20  gle byte cannot 
f770: 62 65 20 75 73 65 64 20 69 6e 73 74 65 61 64 20  be used instead 
f780: 6f 66 20 74 68 65 20 27 73 68 61 72 65 64 20 62  of the 'shared b
f790: 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27 20  yte.  ** range' 
f7a0: 69 73 20 74 68 61 74 20 73 6f 6d 65 20 76 65 72  is that some ver
f7b0: 73 69 6f 6e 73 20 6f 66 20 77 69 6e 64 6f 77 73  sions of windows
f7c0: 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72 74 20   do not support 
f7d0: 72 65 61 64 2d 6c 6f 63 6b 73 2e 20 42 79 0a 20  read-locks. By. 
f7e0: 20 2a 2a 20 6c 6f 63 6b 69 6e 67 20 61 20 72 61   ** locking a ra
f7f0: 6e 64 6f 6d 20 62 79 74 65 20 66 72 6f 6d 20 61  ndom byte from a
f800: 20 72 61 6e 67 65 2c 20 63 6f 6e 63 75 72 72 65   range, concurre
f810: 6e 74 20 53 48 41 52 45 44 20 6c 6f 63 6b 73 20  nt SHARED locks 
f820: 6d 61 79 20 65 78 69 73 74 0a 20 20 2a 2a 20 65  may exist.  ** e
f830: 76 65 6e 20 69 66 20 74 68 65 20 6c 6f 63 6b 69  ven if the locki
f840: 6e 67 20 70 72 69 6d 69 74 69 76 65 20 75 73 65  ng primitive use
f850: 64 20 69 73 20 61 6c 77 61 79 73 20 61 20 77 72  d is always a wr
f860: 69 74 65 2d 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20  ite-lock..  */. 
f870: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
f880: 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20  _OK;.  unixFile 
f890: 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
f8a0: 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69 78 49 6e  le*)id;.  unixIn
f8b0: 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b  odeInfo *pInode;
f8c0: 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20  .  struct flock 
f8d0: 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20 74 45 72 72  lock;.  int tErr
f8e0: 6e 6f 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72  no = 0;..  asser
f8f0: 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53  t( pFile );.  OS
f900: 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20  TRACE(("LOCK    
f910: 25 64 20 25 73 20 77 61 73 20 25 73 28 25 73 2c  %d %s was %s(%s,
f920: 25 64 29 20 70 69 64 3d 25 64 20 28 75 6e 69 78  %d) pid=%d (unix
f930: 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a  )\n", pFile->h,.
f940: 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b        azFileLock
f950: 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 61 7a 46  (eFileLock), azF
f960: 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2d 3e 65  ileLock(pFile->e
f970: 46 69 6c 65 4c 6f 63 6b 29 2c 0a 20 20 20 20 20  FileLock),.     
f980: 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c   azFileLock(pFil
f990: 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65  e->pInode->eFile
f9a0: 4c 6f 63 6b 29 2c 20 70 46 69 6c 65 2d 3e 70 49  Lock), pFile->pI
f9b0: 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 20 2c 20  node->nShared , 
f9c0: 67 65 74 70 69 64 28 29 29 29 3b 0a 0a 20 20 2f  getpid()));..  /
f9d0: 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6c  * If there is al
f9e0: 72 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f 66 20  ready a lock of 
f9f0: 74 68 69 73 20 74 79 70 65 20 6f 72 20 6d 6f 72  this type or mor
fa00: 65 20 72 65 73 74 72 69 63 74 69 76 65 20 6f 6e  e restrictive on
fa10: 20 74 68 65 0a 20 20 2a 2a 20 75 6e 69 78 46 69   the.  ** unixFi
fa20: 6c 65 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20  le, do nothing. 
fa30: 44 6f 6e 27 74 20 75 73 65 20 74 68 65 20 65 6e  Don't use the en
fa40: 64 5f 6c 6f 63 6b 3a 20 65 78 69 74 20 70 61 74  d_lock: exit pat
fa50: 68 2c 20 61 73 0a 20 20 2a 2a 20 75 6e 69 78 45  h, as.  ** unixE
fa60: 6e 74 65 72 4d 75 74 65 78 28 29 20 68 61 73 6e  nterMutex() hasn
fa70: 27 74 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 79  't been called y
fa80: 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  et..  */.  if( p
fa90: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e  File->eFileLock>
faa0: 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20  =eFileLock ){.  
fab0: 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b    OSTRACE(("LOCK
fac0: 20 20 20 20 25 64 20 25 73 20 6f 6b 20 28 61 6c      %d %s ok (al
fad0: 72 65 61 64 79 20 68 65 6c 64 29 20 28 75 6e 69  ready held) (uni
fae0: 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  x)\n", pFile->h,
faf0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 7a 46  .            azF
fb00: 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63  ileLock(eFileLoc
fb10: 6b 29 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  k)));.    return
fb20: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
fb30: 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
fb40: 74 68 65 20 6c 6f 63 6b 69 6e 67 20 73 65 71 75  the locking sequ
fb50: 65 6e 63 65 20 69 73 20 63 6f 72 72 65 63 74 2e  ence is correct.
fb60: 0a 20 20 2a 2a 20 20 28 31 29 20 57 65 20 6e 65  .  **  (1) We ne
fb70: 76 65 72 20 6d 6f 76 65 20 66 72 6f 6d 20 75 6e  ver move from un
fb80: 6c 6f 63 6b 65 64 20 74 6f 20 61 6e 79 74 68 69  locked to anythi
fb90: 6e 67 20 68 69 67 68 65 72 20 74 68 61 6e 20 73  ng higher than s
fba0: 68 61 72 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2a  hared lock..  **
fbb0: 20 20 28 32 29 20 53 51 4c 69 74 65 20 6e 65 76    (2) SQLite nev
fbc0: 65 72 20 65 78 70 6c 69 63 69 74 6c 79 20 72 65  er explicitly re
fbd0: 71 75 65 73 74 73 20 61 20 70 65 6e 64 69 67 20  quests a pendig 
fbe0: 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28 33 29 20  lock..  **  (3) 
fbf0: 41 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 69 73  A shared lock is
fc00: 20 61 6c 77 61 79 73 20 68 65 6c 64 20 77 68 65   always held whe
fc10: 6e 20 61 20 72 65 73 65 72 76 65 20 6c 6f 63 6b  n a reserve lock
fc20: 20 69 73 20 72 65 71 75 65 73 74 65 64 2e 0a 20   is requested.. 
fc30: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 46   */.  assert( pF
fc40: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d  ile->eFileLock!=
fc50: 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65  NO_LOCK || eFile
fc60: 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
fc70: 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65  K );.  assert( e
fc80: 46 69 6c 65 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e  FileLock!=PENDIN
fc90: 47 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65  G_LOCK );.  asse
fca0: 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 21 3d 52  rt( eFileLock!=R
fcb0: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20  ESERVED_LOCK || 
fcc0: 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
fcd0: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  ==SHARED_LOCK );
fce0: 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6d 75 74 65  ..  /* This mute
fcf0: 78 20 69 73 20 6e 65 65 64 65 64 20 62 65 63 61  x is needed beca
fd00: 75 73 65 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  use pFile->pInod
fd10: 65 20 69 73 20 73 68 61 72 65 64 20 61 63 72 6f  e is shared acro
fd20: 73 73 20 74 68 72 65 61 64 73 0a 20 20 2a 2f 0a  ss threads.  */.
fd30: 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
fd40: 28 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70  ();.  pInode = p
fd50: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 0a 20  File->pInode;.. 
fd60: 20 2f 2a 20 49 66 20 73 6f 6d 65 20 74 68 72 65   /* If some thre
fd70: 61 64 20 75 73 69 6e 67 20 74 68 69 73 20 50 49  ad using this PI
fd80: 44 20 68 61 73 20 61 20 6c 6f 63 6b 20 76 69 61  D has a lock via
fd90: 20 61 20 64 69 66 66 65 72 65 6e 74 20 75 6e 69   a different uni
fda0: 78 46 69 6c 65 2a 0a 20 20 2a 2a 20 68 61 6e 64  xFile*.  ** hand
fdb0: 6c 65 20 74 68 61 74 20 70 72 65 63 6c 75 64 65  le that preclude
fdc0: 73 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  s the requested 
fdd0: 6c 6f 63 6b 2c 20 72 65 74 75 72 6e 20 42 55 53  lock, return BUS
fde0: 59 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70  Y..  */.  if( (p
fdf0: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21  File->eFileLock!
fe00: 3d 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f  =pInode->eFileLo
fe10: 63 6b 20 26 26 20 0a 20 20 20 20 20 20 20 20 20  ck && .         
fe20: 20 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c   (pInode->eFileL
fe30: 6f 63 6b 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43  ock>=PENDING_LOC
fe40: 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3e 53  K || eFileLock>S
fe50: 48 41 52 45 44 5f 4c 4f 43 4b 29 29 0a 20 20 29  HARED_LOCK)).  )
fe60: 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
fe70: 45 5f 42 55 53 59 3b 0a 20 20 20 20 67 6f 74 6f  E_BUSY;.    goto
fe80: 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a   end_lock;.  }..
fe90: 20 20 2f 2a 20 49 66 20 61 20 53 48 41 52 45 44    /* If a SHARED
fea0: 20 6c 6f 63 6b 20 69 73 20 72 65 71 75 65 73 74   lock is request
feb0: 65 64 2c 20 61 6e 64 20 73 6f 6d 65 20 74 68 72  ed, and some thr
fec0: 65 61 64 20 75 73 69 6e 67 20 74 68 69 73 20 50  ead using this P
fed0: 49 44 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20  ID already.  ** 
fee0: 68 61 73 20 61 20 53 48 41 52 45 44 20 6f 72 20  has a SHARED or 
fef0: 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 74  RESERVED lock, t
ff00: 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 72 65  hen increment re
ff10: 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 73 20 61  ference counts a
ff20: 6e 64 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 53  nd.  ** return S
ff30: 51 4c 49 54 45 5f 4f 4b 2e 0a 20 20 2a 2f 0a 20  QLITE_OK..  */. 
ff40: 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d   if( eFileLock==
ff50: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20 0a  SHARED_LOCK && .
ff60: 20 20 20 20 20 20 28 70 49 6e 6f 64 65 2d 3e 65        (pInode->e
ff70: 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
ff80: 5f 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d  _LOCK || pInode-
ff90: 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45  >eFileLock==RESE
ffa0: 52 56 45 44 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20  RVED_LOCK) ){.  
ffb0: 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c    assert( eFileL
ffc0: 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
ffd0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
ffe0: 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
fff0: 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
10000 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72  t( pInode->nShar
10010 65 64 3e 30 20 29 3b 0a 20 20 20 20 70 46 69 6c  ed>0 );.    pFil
10020 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53  e->eFileLock = S
10030 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20  HARED_LOCK;.    
10040 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2b  pInode->nShared+
10050 2b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e  +;.    pInode->n
10060 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f  Lock++;.    goto
10070 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a   end_lock;.  }..
10080 0a 20 20 2f 2a 20 41 20 50 45 4e 44 49 4e 47 20  .  /* A PENDING 
10090 6c 6f 63 6b 20 69 73 20 6e 65 65 64 65 64 20 62  lock is needed b
100a0 65 66 6f 72 65 20 61 63 71 75 69 72 69 6e 67 20  efore acquiring 
100b0 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 61 6e  a SHARED lock an
100c0 64 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20 61 63  d before.  ** ac
100d0 71 75 69 72 69 6e 67 20 61 6e 20 45 58 43 4c 55  quiring an EXCLU
100e0 53 49 56 45 20 6c 6f 63 6b 2e 20 20 46 6f 72 20  SIVE lock.  For 
100f0 74 68 65 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c  the SHARED lock,
10100 20 74 68 65 20 50 45 4e 44 49 4e 47 20 77 69 6c   the PENDING wil
10110 6c 0a 20 20 2a 2a 20 62 65 20 72 65 6c 65 61 73  l.  ** be releas
10120 65 64 2e 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b 2e  ed..  */.  lock.
10130 6c 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 20 20 6c 6f  l_len = 1L;.  lo
10140 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45  ck.l_whence = SE
10150 45 4b 5f 53 45 54 3b 0a 20 20 69 66 28 20 65 46  EK_SET;.  if( eF
10160 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
10170 4c 4f 43 4b 20 0a 20 20 20 20 20 20 7c 7c 20 28  LOCK .      || (
10180 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55  eFileLock==EXCLU
10190 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70 46 69  SIVE_LOCK && pFi
101a0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 50 45  le->eFileLock<PE
101b0 4e 44 49 4e 47 5f 4c 4f 43 4b 29 0a 20 20 29 7b  NDING_LOCK).  ){
101c0 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65  .    lock.l_type
101d0 20 3d 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53   = (eFileLock==S
101e0 48 41 52 45 44 5f 4c 4f 43 4b 3f 46 5f 52 44 4c  HARED_LOCK?F_RDL
101f0 43 4b 3a 46 5f 57 52 4c 43 4b 29 3b 0a 20 20 20  CK:F_WRLCK);.   
10200 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20   lock.l_start = 
10210 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20  PENDING_BYTE;.  
10220 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f    if( unixFileLo
10230 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 2c  ck(pFile, &lock,
10240 20 30 29 20 29 7b 0a 20 20 20 20 20 20 74 45 72   0) ){.      tEr
10250 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
10260 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72     rc = sqliteEr
10270 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f  rorFromPosixErro
10280 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45  r(tErrno, SQLITE
10290 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20  _IOERR_LOCK);.  
102a0 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f      if( IS_LOCK_
102b0 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20  ERROR(rc) ){.   
102c0 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72       storeLastEr
102d0 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e  rno(pFile, tErrn
102e0 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  o);.      }.    
102f0 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b    goto end_lock;
10300 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20 2f  .    }.  }...  /
10310 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20 67 65 74  * If control get
10320 73 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c  s to this point,
10330 20 74 68 65 6e 20 61 63 74 75 61 6c 6c 79 20 67   then actually g
10340 6f 20 61 68 65 61 64 20 61 6e 64 20 6d 61 6b 65  o ahead and make
10350 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20  .  ** operating 
10360 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 66 6f 72  system calls for
10370 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 6c   the specified l
10380 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ock..  */.  if( 
10390 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
103a0 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73  D_LOCK ){.    as
103b0 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53  sert( pInode->nS
103c0 68 61 72 65 64 3d 3d 30 20 29 3b 0a 20 20 20 20  hared==0 );.    
103d0 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e  assert( pInode->
103e0 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a  eFileLock==0 );.
103f0 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
10400 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20  SQLITE_OK );..  
10410 20 20 2f 2a 20 4e 6f 77 20 67 65 74 20 74 68 65    /* Now get the
10420 20 72 65 61 64 2d 6c 6f 63 6b 20 2a 2f 0a 20 20   read-lock */.  
10430 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
10440 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20   SHARED_FIRST;. 
10450 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20     lock.l_len = 
10460 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20  SHARED_SIZE;.   
10470 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63   if( unixFileLoc
10480 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 2c 20  k(pFile, &lock, 
10490 30 29 20 29 7b 0a 20 20 20 20 20 20 74 45 72 72  0) ){.      tErr
104a0 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
104b0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72    rc = sqliteErr
104c0 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72  orFromPosixError
104d0 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f  (tErrno, SQLITE_
104e0 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20  IOERR_LOCK);.   
104f0 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20   }..    /* Drop 
10500 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 50 45  the temporary PE
10510 4e 44 49 4e 47 20 6c 6f 63 6b 20 2a 2f 0a 20 20  NDING lock */.  
10520 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
10530 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20   PENDING_BYTE;. 
10540 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20     lock.l_len = 
10550 31 4c 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74  1L;.    lock.l_t
10560 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20  ype = F_UNLCK;. 
10570 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c     if( unixFileL
10580 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b  ock(pFile, &lock
10590 2c 20 31 30 29 20 26 26 20 72 63 3d 3d 53 51 4c  , 10) && rc==SQL
105a0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
105b0 2f 2a 20 54 68 69 73 20 63 6f 75 6c 64 20 68 61  /* This could ha
105c0 70 70 65 6e 20 77 69 74 68 20 61 20 6e 65 74 77  ppen with a netw
105d0 6f 72 6b 20 6d 6f 75 6e 74 20 2a 2f 0a 20 20 20  ork mount */.   
105e0 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e     tErrno = errn
105f0 6f 3b 0a 23 69 66 20 4f 53 4c 4f 43 4b 49 4e 47  o;.#if OSLOCKING
10600 5f 43 48 45 43 4b 5f 42 55 53 59 5f 49 4f 45 52  _CHECK_BUSY_IOER
10610 52 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  R.      rc = sql
10620 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69  iteErrorFromPosi
10630 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53  xError(tErrno, S
10640 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
10650 43 4b 29 3b 20 0a 23 65 6c 73 65 0a 20 20 20 20  CK); .#else.    
10660 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
10670 45 52 52 5f 55 4e 4c 4f 43 4b 3b 20 0a 23 65 6e  ERR_UNLOCK; .#en
10680 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  dif.    }..    i
10690 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 69  f( rc ){.      i
106a0 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
106b0 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20  (rc) ){.        
106c0 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70  storeLastErrno(p
106d0 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20  File, tErrno);. 
106e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74       }.      got
106f0 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20  o end_lock;.    
10700 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 46 69  }else{.      pFi
10710 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
10720 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20  SHARED_LOCK;.   
10730 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b     pInode->nLock
10740 2b 2b 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65  ++;.      pInode
10750 2d 3e 6e 53 68 61 72 65 64 20 3d 20 31 3b 0a 20  ->nShared = 1;. 
10760 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
10770 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c   eFileLock==EXCL
10780 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70 49  USIVE_LOCK && pI
10790 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 31 20  node->nShared>1 
107a0 29 7b 0a 20 20 20 20 2f 2a 20 57 65 20 61 72 65  ){.    /* We are
107b0 20 74 72 79 69 6e 67 20 66 6f 72 20 61 6e 20 65   trying for an e
107c0 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 62 75  xclusive lock bu
107d0 74 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64  t another thread
107e0 20 69 6e 20 74 68 69 73 0a 20 20 20 20 2a 2a 20   in this.    ** 
107f0 73 61 6d 65 20 70 72 6f 63 65 73 73 20 69 73 20  same process is 
10800 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 20  still holding a 
10810 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a  shared lock. */.
10820 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
10830 42 55 53 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  BUSY;.  }else{. 
10840 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73     /* The reques
10850 74 20 77 61 73 20 66 6f 72 20 61 20 52 45 53 45  t was for a RESE
10860 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56  RVED or EXCLUSIV
10870 45 20 6c 6f 63 6b 2e 20 20 49 74 20 69 73 0a 20  E lock.  It is. 
10880 20 20 20 2a 2a 20 61 73 73 75 6d 65 64 20 74 68     ** assumed th
10890 61 74 20 74 68 65 72 65 20 69 73 20 61 20 53 48  at there is a SH
108a0 41 52 45 44 20 6f 72 20 67 72 65 61 74 65 72 20  ARED or greater 
108b0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65  lock on the file
108c0 0a 20 20 20 20 2a 2a 20 61 6c 72 65 61 64 79 2e  .    ** already.
108d0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
108e0 72 74 28 20 30 21 3d 70 46 69 6c 65 2d 3e 65 46  rt( 0!=pFile->eF
108f0 69 6c 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 6c  ileLock );.    l
10900 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57  ock.l_type = F_W
10910 52 4c 43 4b 3b 0a 0a 20 20 20 20 61 73 73 65 72  RLCK;..    asser
10920 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45  t( eFileLock==RE
10930 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 65  SERVED_LOCK || e
10940 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  FileLock==EXCLUS
10950 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  IVE_LOCK );.    
10960 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52  if( eFileLock==R
10970 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a  ESERVED_LOCK ){.
10980 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61        lock.l_sta
10990 72 74 20 3d 20 52 45 53 45 52 56 45 44 5f 42 59  rt = RESERVED_BY
109a0 54 45 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  TE;.      lock.l
109b0 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 20 20 20 20 7d  _len = 1L;.    }
109c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 6c 6f 63 6b  else{.      lock
109d0 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45  .l_start = SHARE
109e0 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20 6c  D_FIRST;.      l
109f0 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52  ock.l_len = SHAR
10a00 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20 7d 0a 0a  ED_SIZE;.    }..
10a10 20 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65      if( unixFile
10a20 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63  Lock(pFile, &loc
10a30 6b 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 74  k, 0) ){.      t
10a40 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
10a50 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
10a60 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
10a70 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49  ror(tErrno, SQLI
10a80 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a  TE_IOERR_LOCK);.
10a90 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
10aa0 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20  LITE_BUSY ){.   
10ab0 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72       storeLastEr
10ac0 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e  rno(pFile, tErrn
10ad0 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  o);.      }.    
10ae0 7d 0a 20 20 7d 0a 20 20 0a 0a 23 69 66 64 65 66  }.  }.  ..#ifdef
10af0 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
10b00 2f 2a 20 53 65 74 20 75 70 20 74 68 65 20 74 72  /* Set up the tr
10b10 61 6e 73 61 63 74 69 6f 6e 2d 63 6f 75 6e 74 65  ansaction-counte
10b20 72 20 63 68 61 6e 67 65 20 63 68 65 63 6b 69 6e  r change checkin
10b30 67 20 66 6c 61 67 73 20 77 68 65 6e 0a 20 20 2a  g flags when.  *
10b40 2a 20 74 72 61 6e 73 69 74 69 6f 6e 69 6e 67 20  * transitioning 
10b50 66 72 6f 6d 20 61 20 53 48 41 52 45 44 20 74 6f  from a SHARED to
10b60 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
10b70 2e 20 20 54 68 65 20 63 68 61 6e 67 65 0a 20 20  .  The change.  
10b80 2a 2a 20 66 72 6f 6d 20 53 48 41 52 45 44 20 74  ** from SHARED t
10b90 6f 20 52 45 53 45 52 56 45 44 20 6d 61 72 6b 73  o RESERVED marks
10ba0 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
10bb0 66 20 61 20 6e 6f 72 6d 61 6c 0a 20 20 2a 2a 20  f a normal.  ** 
10bc0 77 72 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 20  write operation 
10bd0 28 6e 6f 74 20 61 20 68 6f 74 20 6a 6f 75 72 6e  (not a hot journ
10be0 61 6c 20 72 6f 6c 6c 62 61 63 6b 29 2e 0a 20 20  al rollback)..  
10bf0 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  */.  if( rc==SQL
10c00 49 54 45 5f 4f 4b 0a 20 20 20 26 26 20 70 46 69  ITE_OK.   && pFi
10c10 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53  le->eFileLock<=S
10c20 48 41 52 45 44 5f 4c 4f 43 4b 0a 20 20 20 26 26  HARED_LOCK.   &&
10c30 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45   eFileLock==RESE
10c40 52 56 45 44 5f 4c 4f 43 4b 0a 20 20 29 7b 0a 20  RVED_LOCK.  ){. 
10c50 20 20 20 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43     pFile->transC
10c60 6e 74 72 43 68 6e 67 20 3d 20 30 3b 0a 20 20 20  ntrChng = 0;.   
10c70 20 70 46 69 6c 65 2d 3e 64 62 55 70 64 61 74 65   pFile->dbUpdate
10c80 20 3d 20 30 3b 0a 20 20 20 20 70 46 69 6c 65 2d   = 0;.    pFile-
10c90 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 3d  >inNormalWrite =
10ca0 20 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a   1;.  }.#endif..
10cb0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
10cc0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c  E_OK ){.    pFil
10cd0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65  e->eFileLock = e
10ce0 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 70 49  FileLock;.    pI
10cf0 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  node->eFileLock 
10d00 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 7d  = eFileLock;.  }
10d10 65 6c 73 65 20 69 66 28 20 65 46 69 6c 65 4c 6f  else if( eFileLo
10d20 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ck==EXCLUSIVE_LO
10d30 43 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  CK ){.    pFile-
10d40 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e  >eFileLock = PEN
10d50 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70  DING_LOCK;.    p
10d60 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
10d70 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b   = PENDING_LOCK;
10d80 0a 20 20 7d 0a 0a 65 6e 64 5f 6c 6f 63 6b 3a 0a  .  }..end_lock:.
10d90 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
10da0 28 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  ();.  OSTRACE(("
10db0 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 25 73  LOCK    %d %s %s
10dc0 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c   (unix)\n", pFil
10dd0 65 2d 3e 68 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b  e->h, azFileLock
10de0 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 0a 20 20  (eFileLock), .  
10df0 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f      rc==SQLITE_O
10e00 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c  K ? "ok" : "fail
10e10 65 64 22 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  ed"));.  return 
10e20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  rc;.}../*.** Add
10e30 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
10e40 70 74 6f 72 20 75 73 65 64 20 62 79 20 66 69 6c  ptor used by fil
10e50 65 20 68 61 6e 64 6c 65 20 70 46 69 6c 65 20 74  e handle pFile t
10e60 6f 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  o the correspond
10e70 69 6e 67 0a 2a 2a 20 70 55 6e 75 73 65 64 20 6c  ing.** pUnused l
10e80 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ist..*/.static v
10e90 6f 69 64 20 73 65 74 50 65 6e 64 69 6e 67 46 64  oid setPendingFd
10ea0 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65  (unixFile *pFile
10eb0 29 7b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e  ){.  unixInodeIn
10ec0 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69  fo *pInode = pFi
10ed0 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 55 6e  le->pInode;.  Un
10ee0 69 78 55 6e 75 73 65 64 46 64 20 2a 70 20 3d 20  ixUnusedFd *p = 
10ef0 70 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64 3b 0a  pFile->pUnused;.
10f00 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e    p->pNext = pIn
10f10 6f 64 65 2d 3e 70 55 6e 75 73 65 64 3b 0a 20 20  ode->pUnused;.  
10f20 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 20  pInode->pUnused 
10f30 3d 20 70 3b 0a 20 20 70 46 69 6c 65 2d 3e 68 20  = p;.  pFile->h 
10f40 3d 20 2d 31 3b 0a 20 20 70 46 69 6c 65 2d 3e 70  = -1;.  pFile->p
10f50 55 6e 75 73 65 64 20 3d 20 30 3b 0a 7d 0a 0a 2f  Unused = 0;.}../
10f60 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c  *.** Lower the l
10f70 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20  ocking level on 
10f80 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
10f90 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f  pFile to eFileLo
10fa0 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a  ck.  eFileLock.*
10fb0 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  * must be either
10fc0 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52   NO_LOCK or SHAR
10fd0 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49  ED_LOCK..**.** I
10fe0 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  f the locking le
10ff0 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20  vel of the file 
11000 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c  descriptor is al
11010 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f  ready at or belo
11020 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74  w.** the request
11030 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  ed locking level
11040 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
11050 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 0a 2a  s a no-op..** .*
11060 2a 20 49 66 20 68 61 6e 64 6c 65 4e 46 53 55 6e  * If handleNFSUn
11070 6c 6f 63 6b 20 69 73 20 74 72 75 65 2c 20 74 68  lock is true, th
11080 65 6e 20 6f 6e 20 64 6f 77 6e 67 72 61 64 69 6e  en on downgradin
11090 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45 5f 4c  g an EXCLUSIVE_L
110a0 4f 43 4b 20 74 6f 20 53 48 41 52 45 44 0a 2a 2a  OCK to SHARED.**
110b0 20 74 68 65 20 62 79 74 65 20 72 61 6e 67 65 20   the byte range 
110c0 69 73 20 64 69 76 69 64 65 64 20 69 6e 74 6f 20  is divided into 
110d0 32 20 70 61 72 74 73 20 61 6e 64 20 74 68 65 20  2 parts and the 
110e0 66 69 72 73 74 20 70 61 72 74 20 69 73 20 75 6e  first part is un
110f0 6c 6f 63 6b 65 64 20 74 68 65 6e 0a 2a 2a 20 73  locked then.** s
11100 65 74 20 74 6f 20 61 20 72 65 61 64 20 6c 6f 63  et to a read loc
11110 6b 2c 20 74 68 65 6e 20 74 68 65 20 6f 74 68 65  k, then the othe
11120 72 20 70 61 72 74 20 69 73 20 73 69 6d 70 6c 79  r part is simply
11130 20 75 6e 6c 6f 63 6b 65 64 2e 20 20 54 68 69 73   unlocked.  This
11140 20 77 6f 72 6b 73 20 0a 2a 2a 20 61 72 6f 75 6e   works .** aroun
11150 64 20 61 20 62 75 67 20 69 6e 20 42 53 44 20 4e  d a bug in BSD N
11160 46 53 20 6c 6f 63 6b 64 20 28 61 6c 73 6f 20 73  FS lockd (also s
11170 65 65 6e 20 6f 6e 20 4d 61 63 4f 53 58 20 31 30  een on MacOSX 10
11180 2e 33 2b 29 20 74 68 61 74 20 66 61 69 6c 73 20  .3+) that fails 
11190 74 6f 20 0a 2a 2a 20 72 65 6d 6f 76 65 20 74 68  to .** remove th
111a0 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20  e write lock on 
111b0 61 20 72 65 67 69 6f 6e 20 77 68 65 6e 20 61 20  a region when a 
111c0 72 65 61 64 20 6c 6f 63 6b 20 69 73 20 73 65 74  read lock is set
111d0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
111e0 70 6f 73 69 78 55 6e 6c 6f 63 6b 28 73 71 6c 69  posixUnlock(sqli
111f0 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
11200 74 20 65 46 69 6c 65 4c 6f 63 6b 2c 20 69 6e 74  t eFileLock, int
11210 20 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b   handleNFSUnlock
11220 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  ){.  unixFile *p
11230 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
11240 2a 29 69 64 3b 0a 20 20 75 6e 69 78 49 6e 6f 64  *)id;.  unixInod
11250 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a 20  eInfo *pInode;. 
11260 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f   struct flock lo
11270 63 6b 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  ck;.  int rc = S
11280 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73  QLITE_OK;..  ass
11290 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
112a0 4f 53 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b  OSTRACE(("UNLOCK
112b0 20 20 25 64 20 25 64 20 77 61 73 20 25 64 28 25    %d %d was %d(%
112c0 64 2c 25 64 29 20 70 69 64 3d 25 64 20 28 75 6e  d,%d) pid=%d (un
112d0 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  ix)\n", pFile->h
112e0 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20  , eFileLock,.   
112f0 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
11300 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  ock, pFile->pIno
11310 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 70  de->eFileLock, p
11320 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 53  File->pInode->nS
11330 68 61 72 65 64 2c 0a 20 20 20 20 20 20 67 65 74  hared,.      get
11340 70 69 64 28 29 29 29 3b 0a 0a 20 20 61 73 73 65  pid()));..  asse
11350 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53  rt( eFileLock<=S
11360 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
11370 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  if( pFile->eFile
11380 4c 6f 63 6b 3c 3d 65 46 69 6c 65 4c 6f 63 6b 20  Lock<=eFileLock 
11390 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
113a0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 75  LITE_OK;.  }.  u
113b0 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
113c0 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c  .  pInode = pFil
113d0 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 73 73  e->pInode;.  ass
113e0 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68  ert( pInode->nSh
113f0 61 72 65 64 21 3d 30 20 29 3b 0a 20 20 69 66 28  ared!=0 );.  if(
11400 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
11410 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b  k>SHARED_LOCK ){
11420 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e  .    assert( pIn
11430 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d  ode->eFileLock==
11440 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
11450 20 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   );..#ifdef SQLI
11460 54 45 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a 20  TE_DEBUG.    /* 
11470 57 68 65 6e 20 72 65 64 75 63 69 6e 67 20 61 20  When reducing a 
11480 6c 6f 63 6b 20 73 75 63 68 20 74 68 61 74 20 6f  lock such that o
11490 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 63  ther processes c
114a0 61 6e 20 73 74 61 72 74 0a 20 20 20 20 2a 2a 20  an start.    ** 
114b0 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
114c0 62 61 73 65 20 66 69 6c 65 20 61 67 61 69 6e 2c  base file again,
114d0 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
114e0 74 68 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73  the.    ** trans
114f0 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 77  action counter w
11500 61 73 20 75 70 64 61 74 65 64 20 69 66 20 61 6e  as updated if an
11510 79 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 61  y part of the da
11520 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66 69  tabase.    ** fi
11530 6c 65 20 63 68 61 6e 67 65 64 2e 20 20 49 66 20  le changed.  If 
11540 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
11550 63 6f 75 6e 74 65 72 20 69 73 20 6e 6f 74 20 75  counter is not u
11560 70 64 61 74 65 64 2c 0a 20 20 20 20 2a 2a 20 6f  pdated,.    ** o
11570 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  ther connections
11580 20 74 6f 20 74 68 65 20 73 61 6d 65 20 66 69 6c   to the same fil
11590 65 20 6d 69 67 68 74 20 6e 6f 74 20 72 65 61 6c  e might not real
115a0 69 7a 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20  ize that.    ** 
115b0 74 68 65 20 66 69 6c 65 20 68 61 73 20 63 68 61  the file has cha
115c0 6e 67 65 64 20 61 6e 64 20 68 65 6e 63 65 20 6d  nged and hence m
115d0 69 67 68 74 20 6e 6f 74 20 6b 6e 6f 77 20 74 6f  ight not know to
115e0 20 66 6c 75 73 68 20 74 68 65 69 72 0a 20 20 20   flush their.   
115f0 20 2a 2a 20 63 61 63 68 65 2e 20 20 54 68 65 20   ** cache.  The 
11600 75 73 65 20 6f 66 20 61 20 73 74 61 6c 65 20 63  use of a stale c
11610 61 63 68 65 20 63 61 6e 20 6c 65 61 64 20 74 6f  ache can lead to
11620 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   database corrup
11630 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tion..    */.   
11640 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c   pFile->inNormal
11650 57 72 69 74 65 20 3d 20 30 3b 0a 23 65 6e 64 69  Write = 0;.#endi
11660 66 0a 0a 20 20 20 20 2f 2a 20 64 6f 77 6e 67 72  f..    /* downgr
11670 61 64 69 6e 67 20 74 6f 20 61 20 73 68 61 72 65  ading to a share
11680 64 20 6c 6f 63 6b 20 6f 6e 20 4e 46 53 20 69 6e  d lock on NFS in
11690 76 6f 6c 76 65 73 20 63 6c 65 61 72 69 6e 67 20  volves clearing 
116a0 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 0a 20  the write lock. 
116b0 20 20 20 2a 2a 20 62 65 66 6f 72 65 20 65 73 74     ** before est
116c0 61 62 6c 69 73 68 69 6e 67 20 74 68 65 20 72 65  ablishing the re
116d0 61 64 6c 6f 63 6b 20 2d 20 74 6f 20 61 76 6f 69  adlock - to avoi
116e0 64 20 61 20 72 61 63 65 20 63 6f 6e 64 69 74 69  d a race conditi
116f0 6f 6e 20 77 65 20 64 6f 77 6e 67 72 61 64 65 0a  on we downgrade.
11700 20 20 20 20 2a 2a 20 74 68 65 20 6c 6f 63 6b 20      ** the lock 
11710 69 6e 20 32 20 62 6c 6f 63 6b 73 2c 20 73 6f 20  in 2 blocks, so 
11720 74 68 61 74 20 70 61 72 74 20 6f 66 20 74 68 65  that part of the
11730 20 72 61 6e 67 65 20 77 69 6c 6c 20 62 65 20 63   range will be c
11740 6f 76 65 72 65 64 20 62 79 20 61 20 0a 20 20 20  overed by a .   
11750 20 2a 2a 20 77 72 69 74 65 20 6c 6f 63 6b 20 75   ** write lock u
11760 6e 74 69 6c 20 74 68 65 20 72 65 73 74 20 69 73  ntil the rest is
11770 20 63 6f 76 65 72 65 64 20 62 79 20 61 20 72 65   covered by a re
11780 61 64 20 6c 6f 63 6b 3a 0a 20 20 20 20 2a 2a 20  ad lock:.    ** 
11790 20 31 3a 20 20 20 5b 57 57 57 57 57 5d 0a 20 20   1:   [WWWWW].  
117a0 20 20 2a 2a 20 20 32 3a 20 20 20 5b 2e 2e 2e 2e    **  2:   [....
117b0 57 5d 0a 20 20 20 20 2a 2a 20 20 33 3a 20 20 20  W].    **  3:   
117c0 5b 52 52 52 52 57 5d 0a 20 20 20 20 2a 2a 20 20  [RRRRW].    **  
117d0 34 3a 20 20 20 5b 52 52 52 52 2e 5d 0a 20 20 20  4:   [RRRR.].   
117e0 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 46 69 6c   */.    if( eFil
117f0 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
11800 43 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  CK ){.      int 
11810 74 45 72 72 6e 6f 3b 20 20 20 20 20 20 20 20 20  tErrno;         
11820 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63        /* Error c
11830 6f 64 65 20 66 72 6f 6d 20 73 79 73 74 65 6d 20  ode from system 
11840 63 61 6c 6c 20 65 72 72 6f 72 73 20 2a 2f 0a 0a  call errors */..
11850 23 69 66 20 21 64 65 66 69 6e 65 64 28 5f 5f 41  #if !defined(__A
11860 50 50 4c 45 5f 5f 29 20 7c 7c 20 21 53 51 4c 49  PPLE__) || !SQLI
11870 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
11880 47 5f 53 54 59 4c 45 0a 20 20 20 20 20 20 28 76  G_STYLE.      (v
11890 6f 69 64 29 68 61 6e 64 6c 65 4e 46 53 55 6e 6c  oid)handleNFSUnl
118a0 6f 63 6b 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ock;.      asser
118b0 74 28 20 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f  t( handleNFSUnlo
118c0 63 6b 3d 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a  ck==0 );.#endif.
118d0 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50  #if defined(__AP
118e0 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45  PLE__) && SQLITE
118f0 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
11900 53 54 59 4c 45 0a 20 20 20 20 20 20 69 66 28 20  STYLE.      if( 
11910 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b 20  handleNFSUnlock 
11920 29 7b 0a 20 20 20 20 20 20 20 20 6f 66 66 5f 74  ){.        off_t
11930 20 64 69 76 53 69 7a 65 20 3d 20 53 48 41 52 45   divSize = SHARE
11940 44 5f 53 49 5a 45 20 2d 20 31 3b 0a 20 20 20 20  D_SIZE - 1;.    
11950 20 20 20 20 0a 20 20 20 20 20 20 20 20 6c 6f 63      .        loc
11960 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c  k.l_type = F_UNL
11970 43 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b  CK;.        lock
11980 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b  .l_whence = SEEK
11990 5f 53 45 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f  _SET;.        lo
119a0 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41  ck.l_start = SHA
119b0 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20  RED_FIRST;.     
119c0 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20     lock.l_len = 
119d0 64 69 76 53 69 7a 65 3b 0a 20 20 20 20 20 20 20  divSize;.       
119e0 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63   if( unixFileLoc
119f0 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 2c 20  k(pFile, &lock, 
11a00 31 30 29 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20  10)==(-1) ){.   
11a10 20 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20         tErrno = 
11a20 65 72 72 6e 6f 3b 0a 23 69 66 20 4f 53 4c 4f 43  errno;.#if OSLOC
11a30 4b 49 4e 47 5f 43 48 45 43 4b 5f 42 55 53 59 5f  KING_CHECK_BUSY_
11a40 49 4f 45 52 52 0a 20 20 20 20 20 20 20 20 20 20  IOERR.          
11a50 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72  rc = sqliteError
11a60 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74  FromPosixError(t
11a70 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f  Errno, SQLITE_IO
11a80 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 23 65 6c  ERR_UNLOCK);.#el
11a90 73 65 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  se.          rc 
11aa0 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  = SQLITE_IOERR_U
11ab0 4e 4c 4f 43 4b 3b 0a 23 65 6e 64 69 66 0a 20 20  NLOCK;.#endif.  
11ac0 20 20 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c          if( IS_L
11ad0 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b  OCK_ERROR(rc) ){
11ae0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 74 6f  .            sto
11af0 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c  reLastErrno(pFil
11b00 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20  e, tErrno);.    
11b10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
11b20 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63    goto end_unloc
11b30 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
11b40 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65       lock.l_type
11b50 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 20 20   = F_RDLCK;.    
11b60 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63      lock.l_whenc
11b70 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20  e = SEEK_SET;.  
11b80 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61        lock.l_sta
11b90 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53  rt = SHARED_FIRS
11ba0 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e  T;.        lock.
11bb0 6c 5f 6c 65 6e 20 3d 20 64 69 76 53 69 7a 65 3b  l_len = divSize;
11bc0 0a 20 20 20 20 20 20 20 20 69 66 28 20 75 6e 69  .        if( uni
11bd0 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c  xFileLock(pFile,
11be0 20 26 6c 6f 63 6b 2c 20 31 30 29 3d 3d 28 2d 31   &lock, 10)==(-1
11bf0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74  ) ){.          t
11c00 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 23  Errno = errno;.#
11c10 69 66 20 4f 53 4c 4f 43 4b 49 4e 47 5f 43 48 45  if OSLOCKING_CHE
11c20 43 4b 5f 42 55 53 59 5f 49 4f 45 52 52 0a 20 20  CK_BUSY_IOERR.  
11c30 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
11c40 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69  iteErrorFromPosi
11c50 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53  xError(tErrno, S
11c60 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f  QLITE_IOERR_RDLO
11c70 43 4b 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20  CK);.#else.     
11c80 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
11c90 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 23  _IOERR_UNLOCK;.#
11ca0 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20 20  endif.          
11cb0 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f  if( IS_LOCK_ERRO
11cc0 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20  R(rc) ){.       
11cd0 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72       storeLastEr
11ce0 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e  rno(pFile, tErrn
11cf0 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  o);.          }.
11d00 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
11d10 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20  nd_unlock;.     
11d20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6c 6f 63     }.        loc
11d30 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c  k.l_type = F_UNL
11d40 43 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b  CK;.        lock
11d50 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b  .l_whence = SEEK
11d60 5f 53 45 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f  _SET;.        lo
11d70 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41  ck.l_start = SHA
11d80 52 45 44 5f 46 49 52 53 54 2b 64 69 76 53 69 7a  RED_FIRST+divSiz
11d90 65 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e  e;.        lock.
11da0 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53  l_len = SHARED_S
11db0 49 5a 45 2d 64 69 76 53 69 7a 65 3b 0a 20 20 20  IZE-divSize;.   
11dc0 20 20 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c       if( unixFil
11dd0 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f  eLock(pFile, &lo
11de0 63 6b 2c 20 31 30 29 3d 3d 28 2d 31 29 20 29 7b  ck, 10)==(-1) ){
11df0 0a 20 20 20 20 20 20 20 20 20 20 74 45 72 72 6e  .          tErrn
11e00 6f 20 3d 20 65 72 72 6e 6f 3b 0a 23 69 66 20 4f  o = errno;.#if O
11e10 53 4c 4f 43 4b 49 4e 47 5f 43 48 45 43 4b 5f 42  SLOCKING_CHECK_B
11e20 55 53 59 5f 49 4f 45 52 52 0a 20 20 20 20 20 20  USY_IOERR.      
11e30 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45      rc = sqliteE
11e40 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
11e50 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54  or(tErrno, SQLIT
11e60 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b  E_IOERR_UNLOCK);
11e70 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 20 20 20  .#else.         
11e80 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
11e90 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 23 65 6e 64 69  RR_UNLOCK;.#endi
11ea0 66 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  f.          if( 
11eb0 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63  IS_LOCK_ERROR(rc
11ec0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
11ed0 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28   storeLastErrno(
11ee0 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a  pFile, tErrno);.
11ef0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
11f00 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75        goto end_u
11f10 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d  nlock;.        }
11f20 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e  .      }else.#en
11f30 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f  dif /* defined(_
11f40 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c  _APPLE__) && SQL
11f50 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
11f60 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 20 20 20 20  NG_STYLE */.    
11f70 20 20 7b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b    {.        lock
11f80 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c 43  .l_type = F_RDLC
11f90 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e  K;.        lock.
11fa0 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f  l_whence = SEEK_
11fb0 53 45 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63  SET;.        loc
11fc0 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52  k.l_start = SHAR
11fd0 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20  ED_FIRST;.      
11fe0 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53    lock.l_len = S
11ff0 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20  HARED_SIZE;.    
12000 20 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65      if( unixFile
12010 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63  Lock(pFile, &loc
12020 6b 2c 20 31 30 29 20 29 7b 0a 20 20 20 20 20 20  k, 10) ){.      
12030 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72      tErrno = err
12040 6e 6f 3b 0a 23 69 66 20 4f 53 4c 4f 43 4b 49 4e  no;.#if OSLOCKIN
12050 47 5f 43 48 45 43 4b 5f 42 55 53 59 5f 49 4f 45  G_CHECK_BUSY_IOE
12060 52 52 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  RR.          rc 
12070 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  = sqliteErrorFro
12080 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72  mPosixError(tErr
12090 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  no, SQLITE_IOERR
120a0 5f 52 44 4c 4f 43 4b 29 3b 0a 23 65 6c 73 65 0a  _RDLOCK);.#else.
120b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20            /* In 
120c0 74 68 65 6f 72 79 2c 20 74 68 65 20 63 61 6c 6c  theory, the call
120d0 20 74 6f 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b   to unixFileLock
120e0 28 29 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 62  () cannot fail b
120f0 65 63 61 75 73 65 20 61 6e 6f 74 68 65 72 0a 20  ecause another. 
12100 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63           ** proc
12110 65 73 73 20 69 73 20 68 6f 6c 64 69 6e 67 20 61  ess is holding a
12120 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20 6c  n incompatible l
12130 6f 63 6b 2e 20 49 66 20 69 74 20 64 6f 65 73 2c  ock. If it does,
12140 20 74 68 69 73 20 0a 20 20 20 20 20 20 20 20 20   this .         
12150 20 2a 2a 20 69 6e 64 69 63 61 74 65 73 20 74 68   ** indicates th
12160 61 74 20 74 68 65 20 6f 74 68 65 72 20 70 72 6f  at the other pro
12170 63 65 73 73 20 69 73 20 6e 6f 74 20 66 6f 6c 6c  cess is not foll
12180 6f 77 69 6e 67 20 74 68 65 20 6c 6f 63 6b 69 6e  owing the lockin
12190 67 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70  g.          ** p
121a0 72 6f 74 6f 63 6f 6c 2e 20 49 66 20 74 68 69 73  rotocol. If this
121b0 20 68 61 70 70 65 6e 73 2c 20 72 65 74 75 72 6e   happens, return
121c0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44   SQLITE_IOERR_RD
121d0 4c 4f 43 4b 2e 20 52 65 74 75 72 6e 69 6e 67 0a  LOCK. Returning.
121e0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 53 51 4c            ** SQL
121f0 49 54 45 5f 42 55 53 59 20 77 6f 75 6c 64 20 63  ITE_BUSY would c
12200 6f 6e 66 75 73 65 20 74 68 65 20 75 70 70 65 72  onfuse the upper
12210 20 6c 61 79 65 72 20 28 69 6e 20 70 72 61 63 74   layer (in pract
12220 69 63 65 20 69 74 20 63 61 75 73 65 73 20 0a 20  ice it causes . 
12230 20 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 20 61           ** an a
12240 73 73 65 72 74 20 74 6f 20 66 61 69 6c 29 2e 20  ssert to fail). 
12250 2a 2f 20 0a 20 20 20 20 20 20 20 20 20 20 72 63  */ .          rc
12260 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
12270 52 44 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20  RDLOCK;.        
12280 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f    storeLastErrno
12290 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b  (pFile, tErrno);
122a0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
122b0 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52    if( IS_LOCK_ER
122c0 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20  ROR(rc) ){.     
122d0 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74         storeLast
122e0 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72  Errno(pFile, tEr
122f0 72 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20  rno);.          
12300 7d 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  }.          goto
12310 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20   end_unlock;.   
12320 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
12330 20 20 20 7d 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f     }.    lock.l_
12340 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a  type = F_UNLCK;.
12350 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63      lock.l_whenc
12360 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20  e = SEEK_SET;.  
12370 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
12380 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20   PENDING_BYTE;. 
12390 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20     lock.l_len = 
123a0 32 4c 3b 20 20 61 73 73 65 72 74 28 20 50 45 4e  2L;  assert( PEN
123b0 44 49 4e 47 5f 42 59 54 45 2b 31 3d 3d 52 45 53  DING_BYTE+1==RES
123c0 45 52 56 45 44 5f 42 59 54 45 20 29 3b 0a 20 20  ERVED_BYTE );.  
123d0 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f    if( unixFileLo
123e0 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 2c  ck(pFile, &lock,
123f0 20 31 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20   10)==0 ){.     
12400 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f   pInode->eFileLo
12410 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b  ck = SHARED_LOCK
12420 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 23 69 66  ;.    }else{.#if
12430 20 4f 53 4c 4f 43 4b 49 4e 47 5f 43 48 45 43 4b   OSLOCKING_CHECK
12440 5f 42 55 53 59 5f 49 4f 45 52 52 0a 20 20 20 20  _BUSY_IOERR.    
12450 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f    tErrno = errno
12460 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
12470 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69  iteErrorFromPosi
12480 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53  xError(tErrno, S
12490 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
124a0 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 49  CK);.      if( I
124b0 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29  S_LOCK_ERROR(rc)
124c0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74 6f 72   ){.        stor
124d0 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65  eLastErrno(pFile
124e0 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20  , tErrno);.     
124f0 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 72   }.#else.      r
12500 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
12510 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 73  _UNLOCK;.      s
12520 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46  toreLastErrno(pF
12530 69 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 23 65 6e  ile, errno);.#en
12540 64 69 66 0a 20 20 20 20 20 20 67 6f 74 6f 20 65  dif.      goto e
12550 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 7d  nd_unlock;.    }
12560 0a 20 20 7d 0a 20 20 69 66 28 20 65 46 69 6c 65  .  }.  if( eFile
12570 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b  Lock==NO_LOCK ){
12580 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e  .    /* Decremen
12590 74 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63  t the shared loc
125a0 6b 20 63 6f 75 6e 74 65 72 2e 20 20 52 65 6c 65  k counter.  Rele
125b0 61 73 65 20 74 68 65 20 6c 6f 63 6b 20 75 73 69  ase the lock usi
125c0 6e 67 20 61 6e 0a 20 20 20 20 2a 2a 20 4f 53 20  ng an.    ** OS 
125d0 63 61 6c 6c 20 6f 6e 6c 79 20 77 68 65 6e 20 61  call only when a
125e0 6c 6c 20 74 68 72 65 61 64 73 20 69 6e 20 74 68  ll threads in th
125f0 69 73 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20  is same process 
12600 68 61 76 65 20 72 65 6c 65 61 73 65 64 0a 20 20  have released.  
12610 20 20 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 0a 20    ** the lock.. 
12620 20 20 20 2a 2f 0a 20 20 20 20 70 49 6e 6f 64 65     */.    pInode
12630 2d 3e 6e 53 68 61 72 65 64 2d 2d 3b 0a 20 20 20  ->nShared--;.   
12640 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68   if( pInode->nSh
12650 61 72 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ared==0 ){.     
12660 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46   lock.l_type = F
12670 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 20 20 6c 6f  _UNLCK;.      lo
12680 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45  ck.l_whence = SE
12690 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20 6c 6f  EK_SET;.      lo
126a0 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 6c 6f 63  ck.l_start = loc
126b0 6b 2e 6c 5f 6c 65 6e 20 3d 20 30 4c 3b 0a 20 20  k.l_len = 0L;.  
126c0 20 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65      if( unixFile
126d0 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63  Lock(pFile, &loc
126e0 6b 2c 20 31 30 29 3d 3d 30 20 29 7b 0a 20 20 20  k, 10)==0 ){.   
126f0 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69       pInode->eFi
12700 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b  leLock = NO_LOCK
12710 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 23  ;.      }else{.#
12720 69 66 20 4f 53 4c 4f 43 4b 49 4e 47 5f 43 48 45  if OSLOCKING_CHE
12730 43 4b 5f 42 55 53 59 5f 49 4f 45 52 52 0a 20 20  CK_BUSY_IOERR.  
12740 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65        tErrno = e
12750 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 72 63  rrno;.        rc
12760 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
12770 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
12780 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
12790 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  R_UNLOCK);.     
127a0 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
127b0 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20  RROR(rc) ){.    
127c0 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45        storeLastE
127d0 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72 72  rrno(pFile, tErr
127e0 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23  no);.        }.#
127f0 65 6c 73 65 0a 20 20 20 20 20 20 20 20 72 63 20  else.        rc 
12800 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  = SQLITE_IOERR_U
12810 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 73  NLOCK;.        s
12820 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46  toreLastErrno(pF
12830 69 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 23 65 6e  ile, errno);.#en
12840 64 69 66 0a 20 20 20 20 20 20 20 20 70 49 6e 6f  dif.        pIno
12850 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  de->eFileLock = 
12860 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20  NO_LOCK;.       
12870 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
12880 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20  k = NO_LOCK;.   
12890 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
128a0 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65  /* Decrement the
128b0 20 63 6f 75 6e 74 20 6f 66 20 6c 6f 63 6b 73 20   count of locks 
128c0 61 67 61 69 6e 73 74 20 74 68 69 73 20 73 61 6d  against this sam
128d0 65 20 66 69 6c 65 2e 20 20 57 68 65 6e 20 74 68  e file.  When th
128e0 65 0a 20 20 20 20 2a 2a 20 63 6f 75 6e 74 20 72  e.    ** count r
128f0 65 61 63 68 65 73 20 7a 65 72 6f 2c 20 63 6c 6f  eaches zero, clo
12900 73 65 20 61 6e 79 20 6f 74 68 65 72 20 66 69 6c  se any other fil
12910 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 77 68  e descriptors wh
12920 6f 73 65 20 63 6c 6f 73 65 0a 20 20 20 20 2a 2a  ose close.    **
12930 20 77 61 73 20 64 65 66 65 72 72 65 64 20 62 65   was deferred be
12940 63 61 75 73 65 20 6f 66 20 6f 75 74 73 74 61 6e  cause of outstan
12950 64 69 6e 67 20 6c 6f 63 6b 73 2e 0a 20 20 20 20  ding locks..    
12960 2a 2f 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e  */.    pInode->n
12970 4c 6f 63 6b 2d 2d 3b 0a 20 20 20 20 61 73 73 65  Lock--;.    asse
12980 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63  rt( pInode->nLoc
12990 6b 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  k>=0 );.    if( 
129a0 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3d 3d 30  pInode->nLock==0
129b0 20 29 7b 0a 20 20 20 20 20 20 63 6c 6f 73 65 50   ){.      closeP
129c0 65 6e 64 69 6e 67 46 64 73 28 70 46 69 6c 65 29  endingFds(pFile)
129d0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 65 6e 64  ;.    }.  }..end
129e0 5f 75 6e 6c 6f 63 6b 3a 0a 20 20 75 6e 69 78 4c  _unlock:.  unixL
129f0 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 69  eaveMutex();.  i
12a00 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
12a10 20 29 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c   ) pFile->eFileL
12a20 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b  ock = eFileLock;
12a30 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
12a40 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65  ./*.** Lower the
12a50 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
12a60 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
12a70 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65  r pFile to eFile
12a80 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b  Lock.  eFileLock
12a90 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68  .** must be eith
12aa0 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48  er NO_LOCK or SH
12ab0 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a  ARED_LOCK..**.**
12ac0 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   If the locking 
12ad0 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c  level of the fil
12ae0 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
12af0 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65  already at or be
12b00 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65  low.** the reque
12b10 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  sted locking lev
12b20 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  el, this routine
12b30 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
12b40 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 55  static int unixU
12b50 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  nlock(sqlite3_fi
12b60 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c  le *id, int eFil
12b70 65 4c 6f 63 6b 29 7b 0a 23 69 66 20 53 51 4c 49  eLock){.#if SQLI
12b80 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
12b90 3e 30 0a 20 20 61 73 73 65 72 74 28 20 65 46 69  >0.  assert( eFi
12ba0 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
12bb0 4f 43 4b 20 7c 7c 20 28 28 75 6e 69 78 46 69 6c  OCK || ((unixFil
12bc0 65 20 2a 29 69 64 29 2d 3e 6e 46 65 74 63 68 4f  e *)id)->nFetchO
12bd0 75 74 3d 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a  ut==0 );.#endif.
12be0 20 20 72 65 74 75 72 6e 20 70 6f 73 69 78 55 6e    return posixUn
12bf0 6c 6f 63 6b 28 69 64 2c 20 65 46 69 6c 65 4c 6f  lock(id, eFileLo
12c00 63 6b 2c 20 30 29 3b 0a 7d 0a 0a 23 69 66 20 53  ck, 0);.}..#if S
12c10 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
12c20 49 5a 45 3e 30 0a 73 74 61 74 69 63 20 69 6e 74  IZE>0.static int
12c30 20 75 6e 69 78 4d 61 70 66 69 6c 65 28 75 6e 69   unixMapfile(uni
12c40 78 46 69 6c 65 20 2a 70 46 64 2c 20 69 36 34 20  xFile *pFd, i64 
12c50 6e 42 79 74 65 29 3b 0a 73 74 61 74 69 63 20 76  nByte);.static v
12c60 6f 69 64 20 75 6e 69 78 55 6e 6d 61 70 66 69 6c  oid unixUnmapfil
12c70 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 64 29  e(unixFile *pFd)
12c80 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ;.#endif../*.** 
12c90 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 70 65  This function pe
12ca0 72 66 6f 72 6d 73 20 74 68 65 20 70 61 72 74 73  rforms the parts
12cb0 20 6f 66 20 74 68 65 20 22 63 6c 6f 73 65 20 66   of the "close f
12cc0 69 6c 65 22 20 6f 70 65 72 61 74 69 6f 6e 20 0a  ile" operation .
12cd0 2a 2a 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c  ** common to all
12ce0 20 6c 6f 63 6b 69 6e 67 20 73 63 68 65 6d 65 73   locking schemes
12cf0 2e 20 49 74 20 63 6c 6f 73 65 73 20 74 68 65 20  . It closes the 
12d00 64 69 72 65 63 74 6f 72 79 20 61 6e 64 20 66 69  directory and fi
12d10 6c 65 0a 2a 2a 20 68 61 6e 64 6c 65 73 2c 20 69  le.** handles, i
12d20 66 20 74 68 65 79 20 61 72 65 20 76 61 6c 69 64  f they are valid
12d30 2c 20 61 6e 64 20 73 65 74 73 20 61 6c 6c 20 66  , and sets all f
12d40 69 65 6c 64 73 20 6f 66 20 74 68 65 20 75 6e 69  ields of the uni
12d50 78 46 69 6c 65 0a 2a 2a 20 73 74 72 75 63 74 75  xFile.** structu
12d60 72 65 20 74 6f 20 30 2e 0a 2a 2a 0a 2a 2a 20 49  re to 0..**.** I
12d70 74 20 69 73 20 2a 6e 6f 74 2a 20 6e 65 63 65 73  t is *not* neces
12d80 73 61 72 79 20 74 6f 20 68 6f 6c 64 20 74 68 65  sary to hold the
12d90 20 6d 75 74 65 78 20 77 68 65 6e 20 74 68 69 73   mutex when this
12da0 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
12db0 65 64 2c 0a 2a 2a 20 65 76 65 6e 20 6f 6e 20 56  ed,.** even on V
12dc0 78 57 6f 72 6b 73 2e 20 20 41 20 6d 75 74 65 78  xWorks.  A mutex
12dd0 20 77 69 6c 6c 20 62 65 20 61 63 71 75 69 72 65   will be acquire
12de0 64 20 6f 6e 20 56 78 57 6f 72 6b 73 20 62 79 20  d on VxWorks by 
12df0 74 68 65 0a 2a 2a 20 76 78 77 6f 72 6b 73 52 65  the.** vxworksRe
12e00 6c 65 61 73 65 46 69 6c 65 49 64 28 29 20 72 6f  leaseFileId() ro
12e10 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  utine..*/.static
12e20 20 69 6e 74 20 63 6c 6f 73 65 55 6e 69 78 46 69   int closeUnixFi
12e30 6c 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  le(sqlite3_file 
12e40 2a 69 64 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65  *id){.  unixFile
12e50 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
12e60 69 6c 65 2a 29 69 64 3b 0a 23 69 66 20 53 51 4c  ile*)id;.#if SQL
12e70 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
12e80 45 3e 30 0a 20 20 75 6e 69 78 55 6e 6d 61 70 66  E>0.  unixUnmapf
12e90 69 6c 65 28 70 46 69 6c 65 29 3b 0a 23 65 6e 64  ile(pFile);.#end
12ea0 69 66 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  if.  if( pFile->
12eb0 68 3e 3d 30 20 29 7b 0a 20 20 20 20 72 6f 62 75  h>=0 ){.    robu
12ec0 73 74 5f 63 6c 6f 73 65 28 70 46 69 6c 65 2c 20  st_close(pFile, 
12ed0 70 46 69 6c 65 2d 3e 68 2c 20 5f 5f 4c 49 4e 45  pFile->h, __LINE
12ee0 5f 5f 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  __);.    pFile->
12ef0 68 20 3d 20 2d 31 3b 0a 20 20 7d 0a 23 69 66 20  h = -1;.  }.#if 
12f00 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 69 66 28  OS_VXWORKS.  if(
12f10 20 70 46 69 6c 65 2d 3e 70 49 64 20 29 7b 0a 20   pFile->pId ){. 
12f20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 63 74     if( pFile->ct
12f30 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49  rlFlags & UNIXFI
12f40 4c 45 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20 20  LE_DELETE ){.   
12f50 20 20 20 6f 73 55 6e 6c 69 6e 6b 28 70 46 69 6c     osUnlink(pFil
12f60 65 2d 3e 70 49 64 2d 3e 7a 43 61 6e 6f 6e 69 63  e->pId->zCanonic
12f70 61 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20  alName);.    }. 
12f80 20 20 20 76 78 77 6f 72 6b 73 52 65 6c 65 61 73     vxworksReleas
12f90 65 46 69 6c 65 49 64 28 70 46 69 6c 65 2d 3e 70  eFileId(pFile->p
12fa0 49 64 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  Id);.    pFile->
12fb0 70 49 64 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e  pId = 0;.  }.#en
12fc0 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
12fd0 45 5f 55 4e 4c 49 4e 4b 5f 41 46 54 45 52 5f 43  E_UNLINK_AFTER_C
12fe0 4c 4f 53 45 0a 20 20 69 66 28 20 70 46 69 6c 65  LOSE.  if( pFile
12ff0 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e  ->ctrlFlags & UN
13000 49 58 46 49 4c 45 5f 44 45 4c 45 54 45 20 29 7b  IXFILE_DELETE ){
13010 0a 20 20 20 20 6f 73 55 6e 6c 69 6e 6b 28 70 46  .    osUnlink(pF
13020 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20  ile->zPath);.   
13030 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 2a 28   sqlite3_free(*(
13040 63 68 61 72 2a 2a 29 26 70 46 69 6c 65 2d 3e 7a  char**)&pFile->z
13050 50 61 74 68 29 3b 0a 20 20 20 20 70 46 69 6c 65  Path);.    pFile
13060 2d 3e 7a 50 61 74 68 20 3d 20 30 3b 0a 20 20 7d  ->zPath = 0;.  }
13070 0a 23 65 6e 64 69 66 0a 20 20 4f 53 54 52 41 43  .#endif.  OSTRAC
13080 45 28 28 22 43 4c 4f 53 45 20 20 20 25 2d 33 64  E(("CLOSE   %-3d
13090 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b  \n", pFile->h));
130a0 0a 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2d  .  OpenCounter(-
130b0 31 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  1);.  sqlite3_fr
130c0 65 65 28 70 46 69 6c 65 2d 3e 70 55 6e 75 73 65  ee(pFile->pUnuse
130d0 64 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70 46 69  d);.  memset(pFi
130e0 6c 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 75 6e  le, 0, sizeof(un
130f0 69 78 46 69 6c 65 29 29 3b 0a 20 20 72 65 74 75  ixFile));.  retu
13100 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
13110 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66  ./*.** Close a f
13120 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
13130 6e 74 20 75 6e 69 78 43 6c 6f 73 65 28 73 71 6c  nt unixClose(sql
13140 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a  ite3_file *id){.
13150 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
13160 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65  E_OK;.  unixFile
13170 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
13180 69 6c 65 20 2a 29 69 64 3b 0a 20 20 76 65 72 69  ile *)id;.  veri
13190 66 79 44 62 46 69 6c 65 28 70 46 69 6c 65 29 3b  fyDbFile(pFile);
131a0 0a 20 20 75 6e 69 78 55 6e 6c 6f 63 6b 28 69 64  .  unixUnlock(id
131b0 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 75 6e  , NO_LOCK);.  un
131c0 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
131d0 0a 20 20 2f 2a 20 75 6e 69 78 46 69 6c 65 2e 70  .  /* unixFile.p
131e0 49 6e 6f 64 65 20 69 73 20 61 6c 77 61 79 73 20  Inode is always 
131f0 76 61 6c 69 64 20 68 65 72 65 2e 20 4f 74 68 65  valid here. Othe
13200 72 77 69 73 65 2c 20 61 20 64 69 66 66 65 72 65  rwise, a differe
13210 6e 74 20 63 6c 6f 73 65 0a 20 20 2a 2a 20 72 6f  nt close.  ** ro
13220 75 74 69 6e 65 20 28 65 2e 67 2e 20 6e 6f 6c 6f  utine (e.g. nolo
13230 63 6b 43 6c 6f 73 65 28 29 29 20 77 6f 75 6c 64  ckClose()) would
13240 20 62 65 20 63 61 6c 6c 65 64 20 69 6e 73 74 65   be called inste
13250 61 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ad..  */.  asser
13260 74 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  t( pFile->pInode
13270 2d 3e 6e 4c 6f 63 6b 3e 30 20 7c 7c 20 70 46 69  ->nLock>0 || pFi
13280 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f  le->pInode->bPro
13290 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20  cessLock==0 );. 
132a0 20 69 66 28 20 41 4c 57 41 59 53 28 70 46 69 6c   if( ALWAYS(pFil
132b0 65 2d 3e 70 49 6e 6f 64 65 29 20 26 26 20 70 46  e->pInode) && pF
132c0 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 4c 6f  ile->pInode->nLo
132d0 63 6b 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  ck ){.    /* If 
132e0 74 68 65 72 65 20 61 72 65 20 6f 75 74 73 74 61  there are outsta
132f0 6e 64 69 6e 67 20 6c 6f 63 6b 73 2c 20 64 6f 20  nding locks, do 
13300 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 63 6c 6f  not actually clo
13310 73 65 20 74 68 65 20 66 69 6c 65 20 6a 75 73 74  se the file just
13320 0a 20 20 20 20 2a 2a 20 79 65 74 20 62 65 63 61  .    ** yet beca
13330 75 73 65 20 74 68 61 74 20 77 6f 75 6c 64 20 63  use that would c
13340 6c 65 61 72 20 74 68 6f 73 65 20 6c 6f 63 6b 73  lear those locks
13350 2e 20 20 49 6e 73 74 65 61 64 2c 20 61 64 64 20  .  Instead, add 
13360 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20  the file.    ** 
13370 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20 70 49  descriptor to pI
13380 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 20 6c 69  node->pUnused li
13390 73 74 2e 20 20 49 74 20 77 69 6c 6c 20 62 65 20  st.  It will be 
133a0 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6c  automatically cl
133b0 6f 73 65 64 20 0a 20 20 20 20 2a 2a 20 77 68 65  osed .    ** whe
133c0 6e 20 74 68 65 20 6c 61 73 74 20 6c 6f 63 6b 20  n the last lock 
133d0 69 73 20 63 6c 65 61 72 65 64 2e 0a 20 20 20 20  is cleared..    
133e0 2a 2f 0a 20 20 20 20 73 65 74 50 65 6e 64 69 6e  */.    setPendin
133f0 67 46 64 28 70 46 69 6c 65 29 3b 0a 20 20 7d 0a  gFd(pFile);.  }.
13400 20 20 72 65 6c 65 61 73 65 49 6e 6f 64 65 49 6e    releaseInodeIn
13410 66 6f 28 70 46 69 6c 65 29 3b 0a 20 20 72 63 20  fo(pFile);.  rc 
13420 3d 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28  = closeUnixFile(
13430 69 64 29 3b 0a 20 20 75 6e 69 78 4c 65 61 76 65  id);.  unixLeave
13440 4d 75 74 65 78 28 29 3b 0a 20 20 72 65 74 75 72  Mutex();.  retur
13450 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a  n rc;.}../******
13460 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20  ******** End of 
13470 74 68 65 20 70 6f 73 69 78 20 61 64 76 69 73 6f  the posix adviso
13480 72 79 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e  ry lock implemen
13490 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  tation *********
134a0 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
134b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
134c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
134d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
134e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
134f0 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a  *******/../*****
13500 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13510 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13520 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13530 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13540 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
13550 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13560 2a 2a 2a 2a 2a 2a 2a 2a 20 4e 6f 2d 6f 70 20 4c  ******** No-op L
13570 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ocking *********
13580 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13590 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20  *********.**.** 
135a0 4f 66 20 74 68 65 20 76 61 72 69 6f 75 73 20 6c  Of the various l
135b0 6f 63 6b 69 6e 67 20 69 6d 70 6c 65 6d 65 6e 74  ocking implement
135c0 61 74 69 6f 6e 73 20 61 76 61 69 6c 61 62 6c 65  ations available
135d0 2c 20 74 68 69 73 20 69 73 20 62 79 20 66 61 72  , this is by far
135e0 20 74 68 65 0a 2a 2a 20 73 69 6d 70 6c 65 73 74   the.** simplest
135f0 3a 20 20 6c 6f 63 6b 69 6e 67 20 69 73 20 69 67  :  locking is ig
13600 6e 6f 72 65 64 2e 20 20 4e 6f 20 61 74 74 65 6d  nored.  No attem
13610 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 6c 6f  pt is made to lo
13620 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  ck the database.
13630 2a 2a 20 66 69 6c 65 20 66 6f 72 20 72 65 61 64  ** file for read
13640 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 2e 0a  ing or writing..
13650 2a 2a 0a 2a 2a 20 54 68 69 73 20 6c 6f 63 6b 69  **.** This locki
13660 6e 67 20 6d 6f 64 65 20 69 73 20 61 70 70 72 6f  ng mode is appro
13670 70 72 69 61 74 65 20 66 6f 72 20 75 73 65 20 6f  priate for use o
13680 6e 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61  n read-only data
13690 62 61 73 65 73 0a 2a 2a 20 28 65 78 3a 20 64 61  bases.** (ex: da
136a0 74 61 62 61 73 65 73 20 74 68 61 74 20 61 72 65  tabases that are
136b0 20 62 75 72 6e 65 64 20 69 6e 74 6f 20 43 44 2d   burned into CD-
136c0 52 4f 4d 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65  ROM, for example
136d0 2e 29 20 20 49 74 20 63 61 6e 0a 2a 2a 20 61 6c  .)  It can.** al
136e0 73 6f 20 62 65 20 75 73 65 64 20 69 66 20 74 68  so be used if th
136f0 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 65 6d  e application em
13700 70 6c 6f 79 73 20 73 6f 6d 65 20 65 78 74 65 72  ploys some exter
13710 6e 61 6c 20 6d 65 63 68 61 6e 69 73 6d 20 74 6f  nal mechanism to
13720 0a 2a 2a 20 70 72 65 76 65 6e 74 20 73 69 6d 75  .** prevent simu
13730 6c 74 61 6e 65 6f 75 73 20 61 63 63 65 73 73 20  ltaneous access 
13740 6f 66 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  of the same data
13750 62 61 73 65 20 62 79 20 74 77 6f 20 6f 72 20 6d  base by two or m
13760 6f 72 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  ore.** database 
13770 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 20 20 42 75  connections.  Bu
13780 74 20 74 68 65 72 65 20 69 73 20 61 20 73 65 72  t there is a ser
13790 69 6f 75 73 20 72 69 73 6b 20 6f 66 20 64 61 74  ious risk of dat
137a0 61 62 61 73 65 0a 2a 2a 20 63 6f 72 72 75 70 74  abase.** corrupt
137b0 69 6f 6e 20 69 66 20 74 68 69 73 20 6c 6f 63 6b  ion if this lock
137c0 69 6e 67 20 6d 6f 64 65 20 69 73 20 75 73 65 64  ing mode is used
137d0 20 69 6e 20 73 69 74 75 61 74 69 6f 6e 73 20 77   in situations w
137e0 68 65 72 65 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a  here multiple.**
137f0 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
13800 74 69 6f 6e 73 20 61 72 65 20 61 63 63 65 73 73  tions are access
13810 69 6e 67 20 74 68 65 20 73 61 6d 65 20 64 61 74  ing the same dat
13820 61 62 61 73 65 20 66 69 6c 65 20 61 74 20 74 68  abase file at th
13830 65 20 73 61 6d 65 0a 2a 2a 20 74 69 6d 65 20 61  e same.** time a
13840 6e 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f  nd one or more o
13850 66 20 74 68 6f 73 65 20 63 6f 6e 6e 65 63 74 69  f those connecti
13860 6f 6e 73 20 61 72 65 20 77 72 69 74 69 6e 67 2e  ons are writing.
13870 0a 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  .*/..static int 
13880 6e 6f 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72  nolockCheckReser
13890 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  vedLock(sqlite3_
138a0 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64 2c 20 69  file *NotUsed, i
138b0 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20  nt *pResOut){.  
138c0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
138d0 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 2a 70 52  (NotUsed);.  *pR
138e0 65 73 4f 75 74 20 3d 20 30 3b 0a 20 20 72 65 74  esOut = 0;.  ret
138f0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
13900 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f  .static int nolo
13910 63 6b 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  ckLock(sqlite3_f
13920 69 6c 65 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e  ile *NotUsed, in
13930 74 20 4e 6f 74 55 73 65 64 32 29 7b 0a 20 20 55  t NotUsed2){.  U
13940 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 32  NUSED_PARAMETER2
13950 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73 65  (NotUsed, NotUse
13960 64 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  d2);.  return SQ
13970 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 73 74 61 74 69  LITE_OK;.}.stati
13980 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 55 6e 6c 6f  c int nolockUnlo
13990 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
139a0 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 4e 6f  *NotUsed, int No
139b0 74 55 73 65 64 32 29 7b 0a 20 20 55 4e 55 53 45  tUsed2){.  UNUSE
139c0 44 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74  D_PARAMETER2(Not
139d0 55 73 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b  Used, NotUsed2);
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 0a 2f 2a 0a 2a 2a 20 43 6c  _OK;.}../*.** Cl
13a00 6f 73 65 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2f  ose the file..*/
13a10 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f  .static int nolo
13a20 63 6b 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f  ckClose(sqlite3_
13a30 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69 6e  file *id) {.  in
13a40 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
13a50 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  ;.  unixFile *pF
13a60 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 20  ile = (unixFile 
13a70 2a 29 69 64 3b 0a 20 20 75 6e 69 78 45 6e 74 65  *)id;.  unixEnte
13a80 72 4d 75 74 65 78 28 29 3b 0a 20 20 0a 20 20 2f  rMutex();.  .  /
13a90 2a 20 75 6e 69 78 46 69 6c 65 2e 70 49 6e 6f 64  * unixFile.pInod
13aa0 65 20 69 73 20 61 6c 77 61 79 73 20 76 61 6c 69  e is always vali
13ab0 64 20 68 65 72 65 2e 20 4f 74 68 65 72 77 69 73  d here. Otherwis
13ac0 65 2c 20 61 20 64 69 66 66 65 72 65 6e 74 20 63  e, a different c
13ad0 6c 6f 73 65 0a 20 20 20 2a 2a 20 72 6f 75 74 69  lose.   ** routi
13ae0 6e 65 20 28 65 2e 67 2e 20 6e 6f 6c 6f 63 6b 43  ne (e.g. nolockC
13af0 6c 6f 73 65 28 29 29 20 77 6f 75 6c 64 20 62 65  lose()) would be
13b00 20 63 61 6c 6c 65 64 20 69 6e 73 74 65 61 64 2e   called instead.
13b10 0a 20 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  .   */.  assert(
13b20 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e   pFile->pInode->
13b30 6e 4c 6f 63 6b 3e 30 20 7c 7c 20 70 46 69 6c 65  nLock>0 || pFile
13b40 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65  ->pInode->bProce
13b50 73 73 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 69  ssLock==0 );.  i
13b60 66 28 20 41 4c 57 41 59 53 28 70 46 69 6c 65 2d  f( ALWAYS(pFile-
13b70 3e 70 49 6e 6f 64 65 29 20 26 26 20 70 46 69 6c  >pInode) && pFil
13b80 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b  e->pInode->nLock
13b90 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   ){.    /* If th
13ba0 65 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64  ere are outstand
13bb0 69 6e 67 20 6c 6f 63 6b 73 2c 20 64 6f 20 6e 6f  ing locks, do no
13bc0 74 20 61 63 74 75 61 6c 6c 79 20 63 6c 6f 73 65  t actually close
13bd0 20 74 68 65 20 66 69 6c 65 20 6a 75 73 74 0a 20   the file just. 
13be0 20 20 20 20 2a 2a 20 79 65 74 20 62 65 63 61 75      ** yet becau
13bf0 73 65 20 74 68 61 74 20 77 6f 75 6c 64 20 63 6c  se that would cl
13c00 65 61 72 20 74 68 6f 73 65 20 6c 6f 63 6b 73 2e  ear those locks.
13c10 20 20 49 6e 73 74 65 61 64 2c 20 61 64 64 20 74    Instead, add t
13c20 68 65 20 66 69 6c 65 0a 20 20 20 20 20 2a 2a 20  he file.     ** 
13c30 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20 70 49  descriptor to pI
13c40 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 20 6c 69  node->pUnused li
13c50 73 74 2e 20 20 49 74 20 77 69 6c 6c 20 62 65 20  st.  It will be 
13c60 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6c  automatically cl
13c70 6f 73 65 64 20 0a 20 20 20 20 20 2a 2a 20 77 68  osed .     ** wh
13c80 65 6e 20 74 68 65 20 6c 61 73 74 20 6c 6f 63 6b  en the last lock
13c90 20 69 73 20 63 6c 65 61 72 65 64 2e 0a 20 20 20   is cleared..   
13ca0 20 20 2a 2f 0a 20 20 20 20 73 65 74 50 65 6e 64    */.    setPend
13cb0 69 6e 67 46 64 28 70 46 69 6c 65 29 3b 0a 20 20  ingFd(pFile);.  
13cc0 7d 0a 20 20 72 65 6c 65 61 73 65 49 6e 6f 64 65  }.  releaseInode
13cd0 49 6e 66 6f 28 70 46 69 6c 65 29 3b 0a 20 20 72  Info(pFile);.  r
13ce0 63 20 3d 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c  c = closeUnixFil
13cf0 65 28 69 64 29 3b 0a 20 20 75 6e 69 78 4c 65 61  e(id);.  unixLea
13d00 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 72 65 74  veMutex();.  ret
13d10 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a  urn rc;.}../****
13d20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
13d30 45 6e 64 20 6f 66 20 74 68 65 20 6e 6f 2d 6f 70  End of the no-op
13d40 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61   lock implementa
13d50 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  tion ***********
13d60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
13d70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13d80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13d90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13da0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13db0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a  *********/../***
13dc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13dd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13de0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13df0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13e00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
13e10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13e20 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 64 6f 74 2d  ***** Begin dot-
13e30 66 69 6c 65 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a  file Locking ***
13e40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13e50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a  ***********.**.*
13e60 2a 20 54 68 65 20 64 6f 74 66 69 6c 65 20 6c 6f  * The dotfile lo
13e70 63 6b 69 6e 67 20 69 6d 70 6c 65 6d 65 6e 74 61  cking implementa
13e80 74 69 6f 6e 20 75 73 65 73 20 74 68 65 20 65 78  tion uses the ex
13e90 69 73 74 65 6e 63 65 20 6f 66 20 73 65 70 61 72  istence of separ
13ea0 61 74 65 20 6c 6f 63 6b 0a 2a 2a 20 66 69 6c 65  ate lock.** file
13eb0 73 20 28 72 65 61 6c 6c 79 20 61 20 64 69 72 65  s (really a dire
13ec0 63 74 6f 72 79 29 20 74 6f 20 63 6f 6e 74 72 6f  ctory) to contro
13ed0 6c 20 61 63 63 65 73 73 20 74 6f 20 74 68 65 20  l access to the 
13ee0 64 61 74 61 62 61 73 65 2e 20 20 54 68 69 73 20  database.  This 
13ef0 77 6f 72 6b 73 0a 2a 2a 20 6f 6e 20 6a 75 73 74  works.** on just
13f00 20 61 62 6f 75 74 20 65 76 65 72 79 20 66 69 6c   about every fil
13f10 65 73 79 73 74 65 6d 20 69 6d 61 67 69 6e 61 62  esystem imaginab
13f20 6c 65 2e 20 20 42 75 74 20 74 68 65 72 65 20 61  le.  But there a
13f30 72 65 20 73 65 72 69 6f 75 73 20 64 6f 77 6e 73  re serious downs
13f40 69 64 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28  ides:.**.**    (
13f50 31 29 20 20 54 68 65 72 65 20 69 73 20 7a 65 72  1)  There is zer
13f60 6f 20 63 6f 6e 63 75 72 72 65 6e 63 79 2e 20 20  o concurrency.  
13f70 41 20 73 69 6e 67 6c 65 20 72 65 61 64 65 72 20  A single reader 
13f80 62 6c 6f 63 6b 73 20 61 6c 6c 20 6f 74 68 65 72  blocks all other
13f90 0a 2a 2a 20 20 20 20 20 20 20 20 20 63 6f 6e 6e  .**         conn
13fa0 65 63 74 69 6f 6e 73 20 66 72 6f 6d 20 72 65 61  ections from rea
13fb0 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20  ding or writing 
13fc0 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  the database..**
13fd0 0a 2a 2a 20 20 20 20 28 32 29 20 20 41 6e 20 61  .**    (2)  An a
13fe0 70 70 6c 69 63 61 74 69 6f 6e 20 63 72 61 73 68  pplication crash
13ff0 20 6f 72 20 70 6f 77 65 72 20 6c 6f 73 73 20 63   or power loss c
14000 61 6e 20 6c 65 61 76 65 20 73 74 61 6c 65 20 6c  an leave stale l
14010 6f 63 6b 20 66 69 6c 65 73 0a 2a 2a 20 20 20 20  ock files.**    
14020 20 20 20 20 20 73 69 74 74 69 6e 67 20 61 72 6f       sitting aro
14030 75 6e 64 20 74 68 61 74 20 6e 65 65 64 20 74 6f  und that need to
14040 20 62 65 20 63 6c 65 61 72 65 64 20 6d 61 6e 75   be cleared manu
14050 61 6c 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4e 65 76 65  ally..**.** Neve
14060 72 74 68 65 6c 65 73 73 2c 20 61 20 64 6f 74 6c  rtheless, a dotl
14070 6f 63 6b 20 69 73 20 61 6e 20 61 70 70 72 6f 70  ock is an approp
14080 72 69 61 74 65 20 6c 6f 63 6b 69 6e 67 20 6d 6f  riate locking mo
14090 64 65 20 66 6f 72 20 75 73 65 20 69 66 20 6e 6f  de for use if no
140a0 0a 2a 2a 20 6f 74 68 65 72 20 6c 6f 63 6b 69 6e  .** other lockin
140b0 67 20 73 74 72 61 74 65 67 79 20 69 73 20 61 76  g strategy is av
140c0 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 44  ailable..**.** D
140d0 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 77  otfile locking w
140e0 6f 72 6b 73 20 62 79 20 63 72 65 61 74 69 6e 67  orks by creating
140f0 20 61 20 73 75 62 64 69 72 65 63 74 6f 72 79 20   a subdirectory 
14100 69 6e 20 74 68 65 20 73 61 6d 65 20 64 69 72 65  in the same dire
14110 63 74 6f 72 79 20 61 73 0a 2a 2a 20 74 68 65 20  ctory as.** the 
14120 64 61 74 61 62 61 73 65 20 61 6e 64 20 77 69 74  database and wit
14130 68 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20  h the same name 
14140 62 75 74 20 77 69 74 68 20 61 20 22 2e 6c 6f 63  but with a ".loc
14150 6b 22 20 65 78 74 65 6e 73 69 6f 6e 20 61 64 64  k" extension add
14160 65 64 2e 0a 2a 2a 20 54 68 65 20 65 78 69 73 74  ed..** The exist
14170 65 6e 63 65 20 6f 66 20 61 20 6c 6f 63 6b 20 64  ence of a lock d
14180 69 72 65 63 74 6f 72 79 20 69 6d 70 6c 69 65 73  irectory implies
14190 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
141a0 63 6b 2e 20 20 41 6c 6c 20 6f 74 68 65 72 0a 2a  ck.  All other.*
141b0 2a 20 6c 6f 63 6b 20 74 79 70 65 73 20 28 53 48  * lock types (SH
141c0 41 52 45 44 2c 20 52 45 53 45 52 56 45 44 2c 20  ARED, RESERVED, 
141d0 50 45 4e 44 49 4e 47 29 20 61 72 65 20 6d 61 70  PENDING) are map
141e0 70 65 64 20 69 6e 74 6f 20 45 58 43 4c 55 53 49  ped into EXCLUSI
141f0 56 45 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68  VE..*/../*.** Th
14200 65 20 66 69 6c 65 20 73 75 66 66 69 78 20 61 64  e file suffix ad
14210 64 65 64 20 74 6f 20 74 68 65 20 64 61 74 61 20  ded to the data 
14220 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 20 69 6e  base filename in
14230 20 6f 72 64 65 72 20 74 6f 20 63 72 65 61 74 65   order to create
14240 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b 20 64 69 72   the.** lock dir
14250 65 63 74 6f 72 79 2e 0a 2a 2f 0a 23 64 65 66 69  ectory..*/.#defi
14260 6e 65 20 44 4f 54 4c 4f 43 4b 5f 53 55 46 46 49  ne DOTLOCK_SUFFI
14270 58 20 22 2e 6c 6f 63 6b 22 0a 0a 2f 2a 0a 2a 2a  X ".lock"../*.**
14280 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68   This routine ch
14290 65 63 6b 73 20 69 66 20 74 68 65 72 65 20 69 73  ecks if there is
142a0 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
142b0 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65   held on the spe
142c0 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62  cified.** file b
142d0 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74  y this or any ot
142e0 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20  her process. If 
142f0 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68  such a lock is h
14300 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f 75  eld, set *pResOu
14310 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65  t.** to a non-ze
14320 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77 69  ro value otherwi
14330 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73  se *pResOut is s
14340 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65  et to zero.  The
14350 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a   return value.**
14360 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54   is set to SQLIT
14370 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49  E_OK unless an I
14380 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  /O error occurs 
14390 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63  during lock chec
143a0 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 64  king..**.** In d
143b0 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2c 20  otfile locking, 
143c0 65 69 74 68 65 72 20 61 20 6c 6f 63 6b 20 65 78  either a lock ex
143d0 69 73 74 73 20 6f 72 20 69 74 20 64 6f 65 73 20  ists or it does 
143e0 6e 6f 74 2e 20 20 53 6f 20 69 6e 20 74 68 69 73  not.  So in this
143f0 0a 2a 2a 20 76 61 72 69 61 74 69 6f 6e 20 6f 66  .** variation of
14400 20 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f   CheckReservedLo
14410 63 6b 28 29 2c 20 2a 70 52 65 73 4f 75 74 20 69  ck(), *pResOut i
14420 73 20 73 65 74 20 74 6f 20 74 72 75 65 20 69 66  s set to true if
14430 20 61 6e 79 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20   any lock.** is 
14440 68 65 6c 64 20 6f 6e 20 74 68 65 20 66 69 6c 65  held on the file
14450 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20 74 68   and false if th
14460 65 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b  e file is unlock
14470 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
14480 74 20 64 6f 74 6c 6f 63 6b 43 68 65 63 6b 52 65  t dotlockCheckRe
14490 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74  servedLock(sqlit
144a0 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
144b0 20 2a 70 52 65 73 4f 75 74 29 20 7b 0a 20 20 69   *pResOut) {.  i
144c0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
144d0 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65  K;.  int reserve
144e0 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c  d = 0;.  unixFil
144f0 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
14500 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53 69 6d  File*)id;..  Sim
14510 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65  ulateIOError( re
14520 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
14530 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c  R_CHECKRESERVEDL
14540 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73  OCK; );.  .  ass
14550 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 0a 20  ert( pFile );.. 
14560 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 20 74   /* Check if a t
14570 68 72 65 61 64 20 69 6e 20 74 68 69 73 20 70 72  hread in this pr
14580 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75 63 68  ocess holds such
14590 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28   a lock */.  if(
145a0 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
145b0 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b  k>SHARED_LOCK ){
145c0 0a 20 20 20 20 2f 2a 20 45 69 74 68 65 72 20 74  .    /* Either t
145d0 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f  his connection o
145e0 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 63 6f 6e  r some other con
145f0 6e 65 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 73  nection in the s
14600 61 6d 65 20 70 72 6f 63 65 73 73 0a 20 20 20 20  ame process.    
14610 2a 2a 20 68 6f 6c 64 73 20 61 20 6c 6f 63 6b 20  ** holds a lock 
14620 6f 6e 20 74 68 65 20 66 69 6c 65 2e 20 20 4e 6f  on the file.  No
14630 20 6e 65 65 64 20 74 6f 20 63 68 65 63 6b 20 66   need to check f
14640 75 72 74 68 65 72 2e 20 2a 2f 0a 20 20 20 20 72  urther. */.    r
14650 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d  eserved = 1;.  }
14660 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65  else{.    /* The
14670 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 69 66   lock is held if
14680 20 61 6e 64 20 6f 6e 6c 79 20 69 66 20 74 68 65   and only if the
14690 20 6c 6f 63 6b 66 69 6c 65 20 65 78 69 73 74 73   lockfile exists
146a0 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   */.    const ch
146b0 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20  ar *zLockFile = 
146c0 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 70 46 69  (const char*)pFi
146d0 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
146e0 78 74 3b 0a 20 20 20 20 72 65 73 65 72 76 65 64  xt;.    reserved
146f0 20 3d 20 6f 73 41 63 63 65 73 73 28 7a 4c 6f 63   = osAccess(zLoc
14700 6b 46 69 6c 65 2c 20 30 29 3d 3d 30 3b 0a 20 20  kFile, 0)==0;.  
14710 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54 45  }.  OSTRACE(("TE
14720 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64  ST WR-LOCK %d %d
14730 20 25 64 20 28 64 6f 74 6c 6f 63 6b 29 5c 6e 22   %d (dotlock)\n"
14740 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20  , pFile->h, rc, 
14750 72 65 73 65 72 76 65 64 29 29 3b 0a 20 20 2a 70  reserved));.  *p
14760 52 65 73 4f 75 74 20 3d 20 72 65 73 65 72 76 65  ResOut = reserve
14770 64 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  d;.  return rc;.
14780 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68  }../*.** Lock th
14790 65 20 66 69 6c 65 20 77 69 74 68 20 74 68 65 20  e file with the 
147a0 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20 62  lock specified b
147b0 79 20 70 61 72 61 6d 65 74 65 72 20 65 46 69 6c  y parameter eFil
147c0 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f  eLock - one.** o
147d0 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  f the following:
147e0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53  .**.**     (1) S
147f0 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  HARED_LOCK.**   
14800 20 20 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c    (2) RESERVED_L
14810 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50  OCK.**     (3) P
14820 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20  ENDING_LOCK.**  
14830 20 20 20 28 34 29 20 45 58 43 4c 55 53 49 56 45     (4) EXCLUSIVE
14840 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65  _LOCK.**.** Some
14850 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65  times when reque
14860 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73  sting one lock s
14870 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c  tate, additional
14880 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20   lock states.** 
14890 61 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20  are inserted in 
148a0 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f  between.  The lo
148b0 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c  cking might fail
148c0 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c   on one of the l
148d0 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69  ater.** transiti
148e0 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20  ons leaving the 
148f0 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66 65  lock state diffe
14900 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69  rent from what i
14910 74 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a  t started but.**
14920 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20   still short of 
14930 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66  its goal.  The f
14940 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73  ollowing chart s
14950 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64  hows the allowed
14960 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  .** transitions 
14970 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65 64  and the inserted
14980 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74   intermediate st
14990 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55  ates:.**.**    U
149a0 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45  NLOCKED -> SHARE
149b0 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d  D.**    SHARED -
149c0 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20  > RESERVED.**   
149d0 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44   SHARED -> (PEND
149e0 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56  ING) -> EXCLUSIV
149f0 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44  E.**    RESERVED
14a00 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e   -> (PENDING) ->
14a10 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20   EXCLUSIVE.**   
14a20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c   PENDING -> EXCL
14a30 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73  USIVE.**.** This
14a40 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e   routine will on
14a50 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f  ly increase a lo
14a60 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c  ck.  Use the sql
14a70 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a  ite3OsUnlock().*
14a80 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77  * routine to low
14a90 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  er a locking lev
14aa0 65 6c 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 20 64  el..**.** With d
14ab0 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2c 20  otfile locking, 
14ac0 77 65 20 72 65 61 6c 6c 79 20 6f 6e 6c 79 20 73  we really only s
14ad0 75 70 70 6f 72 74 20 73 74 61 74 65 20 28 34 29  upport state (4)
14ae0 3a 20 45 58 43 4c 55 53 49 56 45 2e 0a 2a 2a 20  : EXCLUSIVE..** 
14af0 42 75 74 20 77 65 20 74 72 61 63 6b 20 74 68 65  But we track the
14b00 20 6f 74 68 65 72 20 6c 6f 63 6b 69 6e 67 20 6c   other locking l
14b10 65 76 65 6c 73 20 69 6e 74 65 72 6e 61 6c 6c 79  evels internally
14b20 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
14b30 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69  dotlockLock(sqli
14b40 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
14b50 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20  t eFileLock) {. 
14b60 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
14b70 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
14b80 3b 0a 20 20 63 68 61 72 20 2a 7a 4c 6f 63 6b 46  ;.  char *zLockF
14b90 69 6c 65 20 3d 20 28 63 68 61 72 20 2a 29 70 46  ile = (char *)pF
14ba0 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
14bb0 65 78 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ext;.  int rc = 
14bc0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 0a 20 20 2f  SQLITE_OK;...  /
14bd0 2a 20 49 66 20 77 65 20 68 61 76 65 20 61 6e 79  * If we have any
14be0 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 74 68 65 20   lock, then the 
14bf0 6c 6f 63 6b 20 66 69 6c 65 20 61 6c 72 65 61 64  lock file alread
14c00 79 20 65 78 69 73 74 73 2e 20 20 41 6c 6c 20 77  y exists.  All w
14c10 65 20 68 61 76 65 0a 20 20 2a 2a 20 74 6f 20 64  e have.  ** to d
14c20 6f 20 69 73 20 61 64 6a 75 73 74 20 6f 75 72 20  o is adjust our 
14c30 69 6e 74 65 72 6e 61 6c 20 72 65 63 6f 72 64 20  internal record 
14c40 6f 66 20 74 68 65 20 6c 6f 63 6b 20 6c 65 76 65  of the lock leve
14c50 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46  l..  */.  if( pF
14c60 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3e  ile->eFileLock >
14c70 20 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20   NO_LOCK ){.    
14c80 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
14c90 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20   = eFileLock;.  
14ca0 20 20 2f 2a 20 41 6c 77 61 79 73 20 75 70 64 61    /* Always upda
14cb0 74 65 20 74 68 65 20 74 69 6d 65 73 74 61 6d 70  te the timestamp
14cc0 20 6f 6e 20 74 68 65 20 6f 6c 64 20 66 69 6c 65   on the old file
14cd0 20 2a 2f 0a 23 69 66 64 65 66 20 48 41 56 45 5f   */.#ifdef HAVE_
14ce0 55 54 49 4d 45 0a 20 20 20 20 75 74 69 6d 65 28  UTIME.    utime(
14cf0 7a 4c 6f 63 6b 46 69 6c 65 2c 20 4e 55 4c 4c 29  zLockFile, NULL)
14d00 3b 0a 23 65 6c 73 65 0a 20 20 20 20 75 74 69 6d  ;.#else.    utim
14d10 65 73 28 7a 4c 6f 63 6b 46 69 6c 65 2c 20 4e 55  es(zLockFile, NU
14d20 4c 4c 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  LL);.#endif.    
14d30 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
14d40 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 67 72  ;.  }.  .  /* gr
14d50 61 62 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  ab an exclusive 
14d60 6c 6f 63 6b 20 2a 2f 0a 20 20 72 63 20 3d 20 6f  lock */.  rc = o
14d70 73 4d 6b 64 69 72 28 7a 4c 6f 63 6b 46 69 6c 65  sMkdir(zLockFile
14d80 2c 20 30 37 37 37 29 3b 0a 20 20 69 66 28 20 72  , 0777);.  if( r
14d90 63 3c 30 20 29 7b 0a 20 20 20 20 2f 2a 20 66 61  c<0 ){.    /* fa
14da0 69 6c 65 64 20 74 6f 20 6f 70 65 6e 2f 63 72 65  iled to open/cre
14db0 61 74 65 20 74 68 65 20 6c 6f 63 6b 20 64 69 72  ate the lock dir
14dc0 65 63 74 6f 72 79 20 2a 2f 0a 20 20 20 20 69 6e  ectory */.    in
14dd0 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  t tErrno = errno
14de0 3b 0a 20 20 20 20 69 66 28 20 45 45 58 49 53 54  ;.    if( EEXIST
14df0 20 3d 3d 20 74 45 72 72 6e 6f 20 29 7b 0a 20 20   == tErrno ){.  
14e00 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
14e10 42 55 53 59 3b 0a 20 20 20 20 7d 20 65 6c 73 65  BUSY;.    } else
14e20 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71   {.      rc = sq
14e30 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73  liteErrorFromPos
14e40 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20  ixError(tErrno, 
14e50 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43  SQLITE_IOERR_LOC
14e60 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 49 53  K);.      if( IS
14e70 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20  _LOCK_ERROR(rc) 
14e80 29 7b 0a 20 20 20 20 20 20 20 20 73 74 6f 72 65  ){.        store
14e90 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c  LastErrno(pFile,
14ea0 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20   tErrno);.      
14eb0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  }.    }.    retu
14ec0 72 6e 20 72 63 3b 0a 20 20 7d 20 0a 20 20 0a 20  rn rc;.  } .  . 
14ed0 20 2f 2a 20 67 6f 74 20 69 74 2c 20 73 65 74 20   /* got it, set 
14ee0 74 68 65 20 74 79 70 65 20 61 6e 64 20 72 65 74  the type and ret
14ef0 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20 70 46 69 6c  urn ok */.  pFil
14f00 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65  e->eFileLock = e
14f10 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 72 65 74 75  FileLock;.  retu
14f20 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
14f30 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e  Lower the lockin
14f40 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20  g level on file 
14f50 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65  descriptor pFile
14f60 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20   to eFileLock.  
14f70 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73  eFileLock.** mus
14f80 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c  t be either NO_L
14f90 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f  OCK or SHARED_LO
14fa0 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  CK..**.** If the
14fb0 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
14fc0 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  f the file descr
14fd0 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79  iptor is already
14fe0 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20   at or below.** 
14ff0 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
15000 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69  cking level, thi
15010 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
15020 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  o-op..**.** When
15030 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
15040 65 6c 20 72 65 61 63 68 65 73 20 4e 4f 5f 4c 4f  el reaches NO_LO
15050 43 4b 2c 20 64 65 6c 65 74 65 20 74 68 65 20 6c  CK, delete the l
15060 6f 63 6b 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  ock file..*/.sta
15070 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 55  tic int dotlockU
15080 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  nlock(sqlite3_fi
15090 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c  le *id, int eFil
150a0 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46  eLock) {.  unixF
150b0 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
150c0 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 63 68  ixFile*)id;.  ch
150d0 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20  ar *zLockFile = 
150e0 28 63 68 61 72 20 2a 29 70 46 69 6c 65 2d 3e 6c  (char *)pFile->l
150f0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20  ockingContext;. 
15100 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
15110 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f  rt( pFile );.  O
15120 53 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20  STRACE(("UNLOCK 
15130 20 25 64 20 25 64 20 77 61 73 20 25 64 20 70 69   %d %d was %d pi
15140 64 3d 25 64 20 28 64 6f 74 6c 6f 63 6b 29 5c 6e  d=%d (dotlock)\n
15150 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69  ", pFile->h, eFi
15160 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20  leLock,.        
15170 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
15180 6f 63 6b 2c 20 67 65 74 70 69 64 28 29 29 29 3b  ock, getpid()));
15190 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65  .  assert( eFile
151a0 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock<=SHARED_LOC
151b0 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d  K );.  .  /* no-
151c0 6f 70 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a  op if possible *
151d0 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65  /.  if( pFile->e
151e0 46 69 6c 65 4c 6f 63 6b 3d 3d 65 46 69 6c 65 4c  FileLock==eFileL
151f0 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ock ){.    retur
15200 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
15210 0a 0a 20 20 2f 2a 20 54 6f 20 64 6f 77 6e 67 72  ..  /* To downgr
15220 61 64 65 20 74 6f 20 73 68 61 72 65 64 2c 20 73  ade to shared, s
15230 69 6d 70 6c 79 20 75 70 64 61 74 65 20 6f 75 72  imply update our
15240 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 74 69 6f 6e   internal notion
15250 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 6c 6f 63   of the.  ** loc
15260 6b 20 73 74 61 74 65 2e 20 20 4e 6f 20 6e 65 65  k state.  No nee
15270 64 20 74 6f 20 6d 65 73 73 20 77 69 74 68 20 74  d to mess with t
15280 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e  he file on disk.
15290 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c  .  */.  if( eFil
152a0 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
152b0 43 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  CK ){.    pFile-
152c0 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41  >eFileLock = SHA
152d0 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 72 65  RED_LOCK;.    re
152e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
152f0 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 54 6f 20 66    }.  .  /* To f
15300 75 6c 6c 79 20 75 6e 6c 6f 63 6b 20 74 68 65 20  ully unlock the 
15310 64 61 74 61 62 61 73 65 2c 20 64 65 6c 65 74 65  database, delete
15320 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65 20 2a   the lock file *
15330 2f 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c  /.  assert( eFil
15340 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29  eLock==NO_LOCK )
15350 3b 0a 20 20 72 63 20 3d 20 6f 73 52 6d 64 69 72  ;.  rc = osRmdir
15360 28 7a 4c 6f 63 6b 46 69 6c 65 29 3b 0a 20 20 69  (zLockFile);.  i
15370 66 28 20 72 63 3c 30 20 26 26 20 65 72 72 6e 6f  f( rc<0 && errno
15380 3d 3d 45 4e 4f 54 44 49 52 20 29 20 72 63 20 3d  ==ENOTDIR ) rc =
15390 20 6f 73 55 6e 6c 69 6e 6b 28 7a 4c 6f 63 6b 46   osUnlink(zLockF
153a0 69 6c 65 29 3b 0a 20 20 69 66 28 20 72 63 3c 30  ile);.  if( rc<0
153b0 20 29 7b 0a 20 20 20 20 69 6e 74 20 74 45 72 72   ){.    int tErr
153c0 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
153d0 72 63 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  rc = 0;.    if( 
153e0 45 4e 4f 45 4e 54 20 21 3d 20 74 45 72 72 6e 6f  ENOENT != tErrno
153f0 20 29 7b 0a 23 69 66 20 4f 53 4c 4f 43 4b 49 4e   ){.#if OSLOCKIN
15400 47 5f 43 48 45 43 4b 5f 42 55 53 59 5f 49 4f 45  G_CHECK_BUSY_IOE
15410 52 52 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  RR.      rc = sq
15420 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73  liteErrorFromPos
15430 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20  ixError(tErrno, 
15440 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c  SQLITE_IOERR_UNL
15450 4f 43 4b 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20  OCK);.#else.    
15460 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
15470 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 23 65 6e 64  ERR_UNLOCK;.#end
15480 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  if.    }.    if(
15490 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72   IS_LOCK_ERROR(r
154a0 63 29 20 29 7b 0a 20 20 20 20 20 20 73 74 6f 72  c) ){.      stor
154b0 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65  eLastErrno(pFile
154c0 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 7d  , tErrno);.    }
154d0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 20  .    return rc; 
154e0 0a 20 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 65 46  .  }.  pFile->eF
154f0 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43  ileLock = NO_LOC
15500 4b 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  K;.  return SQLI
15510 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
15520 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 20 20 4d  Close a file.  M
15530 61 6b 65 20 73 75 72 65 20 74 68 65 20 6c 6f 63  ake sure the loc
15540 6b 20 68 61 73 20 62 65 65 6e 20 72 65 6c 65 61  k has been relea
15550 73 65 64 20 62 65 66 6f 72 65 20 63 6c 6f 73 69  sed before closi
15560 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
15570 74 20 64 6f 74 6c 6f 63 6b 43 6c 6f 73 65 28 73  t dotlockClose(s
15580 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29  qlite3_file *id)
15590 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51   {.  int rc = SQ
155a0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 69  LITE_OK;.  if( i
155b0 64 20 29 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c  d ){.    unixFil
155c0 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
155d0 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20 64 6f  File*)id;.    do
155e0 74 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 69 64 2c 20  tlockUnlock(id, 
155f0 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 73 71  NO_LOCK);.    sq
15600 6c 69 74 65 33 5f 66 72 65 65 28 70 46 69 6c 65  lite3_free(pFile
15610 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
15620 29 3b 0a 20 20 20 20 72 63 20 3d 20 63 6c 6f 73  );.    rc = clos
15630 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 20  eUnixFile(id);. 
15640 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
15650 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  }./*************
15660 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65  ***** End of the
15670 20 64 6f 74 2d 66 69 6c 65 20 6c 6f 63 6b 20 69   dot-file lock i
15680 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a  mplementation **
15690 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
156a0 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
156b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
156c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
156d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
156e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
156f0 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /../************
15700 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15710 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15720 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15730 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15740 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
15750 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65  ************* Be
15760 67 69 6e 20 66 6c 6f 63 6b 20 4c 6f 63 6b 69 6e  gin flock Lockin
15770 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  g **************
15780 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15790 2a 2a 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65  **.**.** Use the
157a0 20 66 6c 6f 63 6b 28 29 20 73 79 73 74 65 6d 20   flock() system 
157b0 63 61 6c 6c 20 74 6f 20 64 6f 20 66 69 6c 65 20  call to do file 
157c0 6c 6f 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 66  locking..**.** f
157d0 6c 6f 63 6b 28 29 20 6c 6f 63 6b 69 6e 67 20 69  lock() locking i
157e0 73 20 6c 69 6b 65 20 64 6f 74 2d 66 69 6c 65 20  s like dot-file 
157f0 6c 6f 63 6b 69 6e 67 20 69 6e 20 74 68 61 74 20  locking in that 
15800 74 68 65 20 76 61 72 69 6f 75 73 0a 2a 2a 20 66  the various.** f
15810 69 6e 65 2d 67 72 61 69 6e 20 6c 6f 63 6b 69 6e  ine-grain lockin
15820 67 20 6c 65 76 65 6c 73 20 73 75 70 70 6f 72 74  g levels support
15830 65 64 20 62 79 20 53 51 4c 69 74 65 20 61 72 65  ed by SQLite are
15840 20 63 6f 6c 6c 61 70 73 65 64 20 69 6e 74 6f 0a   collapsed into.
15850 2a 2a 20 61 20 73 69 6e 67 6c 65 20 65 78 63 6c  ** a single excl
15860 75 73 69 76 65 20 6c 6f 63 6b 2e 20 20 49 6e 20  usive lock.  In 
15870 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 53 48 41  other words, SHA
15880 52 45 44 2c 20 52 45 53 45 52 56 45 44 2c 20 61  RED, RESERVED, a
15890 6e 64 0a 2a 2a 20 50 45 4e 44 49 4e 47 20 6c 6f  nd.** PENDING lo
158a0 63 6b 73 20 61 72 65 20 74 68 65 20 73 61 6d 65  cks are the same
158b0 20 74 68 69 6e 67 20 61 73 20 61 6e 20 45 58 43   thing as an EXC
158c0 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 53 51  LUSIVE lock.  SQ
158d0 4c 69 74 65 0a 2a 2a 20 73 74 69 6c 6c 20 77 6f  Lite.** still wo
158e0 72 6b 73 20 77 68 65 6e 20 79 6f 75 20 64 6f 20  rks when you do 
158f0 74 68 69 73 2c 20 62 75 74 20 63 6f 6e 63 75 72  this, but concur
15900 72 65 6e 63 79 20 69 73 20 72 65 64 75 63 65 64  rency is reduced
15910 20 73 69 6e 63 65 0a 2a 2a 20 6f 6e 6c 79 20 61   since.** only a
15920 20 73 69 6e 67 6c 65 20 70 72 6f 63 65 73 73 20   single process 
15930 63 61 6e 20 62 65 20 72 65 61 64 69 6e 67 20 74  can be reading t
15940 68 65 20 64 61 74 61 62 61 73 65 20 61 74 20 61  he database at a
15950 20 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 4f 6d 69   time..**.** Omi
15960 74 20 74 68 69 73 20 73 65 63 74 69 6f 6e 20 69  t this section i
15970 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
15980 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 69 73  LOCKING_STYLE is
15990 20 74 75 72 6e 65 64 20 6f 66 66 20 6f 72 20 69   turned off or i
159a0 66 0a 2a 2a 20 63 6f 6d 70 69 6c 69 6e 67 20 66  f.** compiling f
159b0 6f 72 20 56 58 57 4f 52 4b 53 2e 0a 2a 2f 0a 23  or VXWORKS..*/.#
159c0 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
159d0 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26  _LOCKING_STYLE &
159e0 26 20 21 4f 53 5f 56 58 57 4f 52 4b 53 0a 0a 2f  & !OS_VXWORKS../
159f0 2a 0a 2a 2a 20 52 65 74 72 79 20 66 6c 6f 63 6b  *.** Retry flock
15a00 28 29 20 63 61 6c 6c 73 20 74 68 61 74 20 66 61  () calls that fa
15a10 69 6c 20 77 69 74 68 20 45 49 4e 54 52 0a 2a 2f  il with EINTR.*/
15a20 0a 23 69 66 64 65 66 20 45 49 4e 54 52 0a 73 74  .#ifdef EINTR.st
15a30 61 74 69 63 20 69 6e 74 20 72 6f 62 75 73 74 5f  atic int robust_
15a40 66 6c 6f 63 6b 28 69 6e 74 20 66 64 2c 20 69 6e  flock(int fd, in
15a50 74 20 6f 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b  t op){.  int rc;
15a60 0a 20 20 64 6f 7b 20 72 63 20 3d 20 66 6c 6f 63  .  do{ rc = floc
15a70 6b 28 66 64 2c 6f 70 29 3b 20 7d 77 68 69 6c 65  k(fd,op); }while
15a80 28 20 72 63 3c 30 20 26 26 20 65 72 72 6e 6f 3d  ( rc<0 && errno=
15a90 3d 45 49 4e 54 52 20 29 3b 0a 20 20 72 65 74 75  =EINTR );.  retu
15aa0 72 6e 20 72 63 3b 0a 7d 0a 23 65 6c 73 65 0a 23  rn rc;.}.#else.#
15ab0 20 64 65 66 69 6e 65 20 72 6f 62 75 73 74 5f 66   define robust_f
15ac0 6c 6f 63 6b 28 61 2c 62 29 20 66 6c 6f 63 6b 28  lock(a,b) flock(
15ad0 61 2c 62 29 0a 23 65 6e 64 69 66 0a 20 20 20 20  a,b).#endif.    
15ae0 20 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f   ../*.** This ro
15af0 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20  utine checks if 
15b00 74 68 65 72 65 20 69 73 20 61 20 52 45 53 45 52  there is a RESER
15b10 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e  VED lock held on
15b20 20 74 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a   the specified.*
15b30 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f  * file by this o
15b40 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63  r any other proc
15b50 65 73 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c  ess. If such a l
15b60 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 73 65 74  ock is held, set
15b70 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20   *pResOut.** to 
15b80 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65  a non-zero value
15b90 20 6f 74 68 65 72 77 69 73 65 20 2a 70 52 65 73   otherwise *pRes
15ba0 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65  Out is set to ze
15bb0 72 6f 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20  ro.  The return 
15bc0 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20  value.** is set 
15bd0 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c  to SQLITE_OK unl
15be0 65 73 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72  ess an I/O error
15bf0 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 6c   occurs during l
15c00 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f  ock checking..*/
15c10 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c 6f 63  .static int floc
15c20 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  kCheckReservedLo
15c30 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
15c40 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75  *id, int *pResOu
15c50 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
15c60 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
15c70 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20  reserved = 0;.  
15c80 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
15c90 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
15ca0 0a 20 20 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f  .  .  SimulateIO
15cb0 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51  Error( return SQ
15cc0 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b  LITE_IOERR_CHECK
15cd0 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b  RESERVEDLOCK; );
15ce0 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 70 46  .  .  assert( pF
15cf0 69 6c 65 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 43  ile );.  .  /* C
15d00 68 65 63 6b 20 69 66 20 61 20 74 68 72 65 61 64  heck if a thread
15d10 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73   in this process
15d20 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c 6f   holds such a lo
15d30 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  ck */.  if( pFil
15d40 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41  e->eFileLock>SHA
15d50 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RED_LOCK ){.    
15d60 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20  reserved = 1;.  
15d70 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74 68 65 72 77  }.  .  /* Otherw
15d80 69 73 65 20 73 65 65 20 69 66 20 73 6f 6d 65 20  ise see if some 
15d90 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 68 6f  other process ho
15da0 6c 64 73 20 69 74 2e 20 2a 2f 0a 20 20 69 66 28  lds it. */.  if(
15db0 20 21 72 65 73 65 72 76 65 64 20 29 7b 0a 20 20   !reserved ){.  
15dc0 20 20 2f 2a 20 61 74 74 65 6d 70 74 20 74 6f 20    /* attempt to 
15dd0 67 65 74 20 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a  get the lock */.
15de0 20 20 20 20 69 6e 74 20 6c 72 63 20 3d 20 72 6f      int lrc = ro
15df0 62 75 73 74 5f 66 6c 6f 63 6b 28 70 46 69 6c 65  bust_flock(pFile
15e00 2d 3e 68 2c 20 4c 4f 43 4b 5f 45 58 20 7c 20 4c  ->h, LOCK_EX | L
15e10 4f 43 4b 5f 4e 42 29 3b 0a 20 20 20 20 69 66 28  OCK_NB);.    if(
15e20 20 21 6c 72 63 20 29 7b 0a 20 20 20 20 20 20 2f   !lrc ){.      /
15e30 2a 20 67 6f 74 20 74 68 65 20 6c 6f 63 6b 2c 20  * got the lock, 
15e40 75 6e 6c 6f 63 6b 20 69 74 20 2a 2f 0a 20 20 20  unlock it */.   
15e50 20 20 20 6c 72 63 20 3d 20 72 6f 62 75 73 74 5f     lrc = robust_
15e60 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20  flock(pFile->h, 
15e70 4c 4f 43 4b 5f 55 4e 29 3b 0a 20 20 20 20 20 20  LOCK_UN);.      
15e80 69 66 20 28 20 6c 72 63 20 29 20 7b 0a 20 20 20  if ( lrc ) {.   
15e90 20 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20       int tErrno 
15ea0 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20  = errno;.       
15eb0 20 2f 2a 20 75 6e 6c 6f 63 6b 20 66 61 69 6c 65   /* unlock faile
15ec0 64 20 77 69 74 68 20 61 6e 20 65 72 72 6f 72 20  d with an error 
15ed0 2a 2f 0a 23 69 66 20 4f 53 4c 4f 43 4b 49 4e 47  */.#if OSLOCKING
15ee0 5f 43 48 45 43 4b 5f 42 55 53 59 5f 49 4f 45 52  _CHECK_BUSY_IOER
15ef0 52 0a 20 20 20 20 20 20 20 20 6c 72 63 20 3d 20  R.        lrc = 
15f00 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
15f10 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
15f20 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  , SQLITE_IOERR_U
15f30 4e 4c 4f 43 4b 29 3b 0a 23 65 6c 73 65 20 0a 20  NLOCK);.#else . 
15f40 20 20 20 20 20 20 20 6c 72 63 20 3d 20 53 51 4c         lrc = SQL
15f50 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
15f60 3b 20 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  ; .#endif.      
15f70 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52    if( IS_LOCK_ER
15f80 52 4f 52 28 6c 72 63 29 20 29 7b 0a 20 20 20 20  ROR(lrc) ){.    
15f90 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45        storeLastE
15fa0 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72 72  rrno(pFile, tErr
15fb0 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  no);.          r
15fc0 63 20 3d 20 6c 72 63 3b 0a 20 20 20 20 20 20 20  c = lrc;.       
15fd0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
15fe0 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 69 6e   else {.      in
15ff0 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  t tErrno = errno
16000 3b 0a 20 20 20 20 20 20 72 65 73 65 72 76 65 64  ;.      reserved
16010 20 3d 20 31 3b 0a 20 20 20 20 20 20 2f 2a 20 73   = 1;.      /* s
16020 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 6d 69 67 68  omeone else migh
16030 74 20 68 61 76 65 20 69 74 20 72 65 73 65 72 76  t have it reserv
16040 65 64 20 2a 2f 0a 20 20 20 20 20 20 6c 72 63 20  ed */.      lrc 
16050 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  = sqliteErrorFro
16060 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72  mPosixError(tErr
16070 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  no, SQLITE_IOERR
16080 5f 4c 4f 43 4b 29 3b 20 0a 20 20 20 20 20 20 69  _LOCK); .      i
16090 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
160a0 28 6c 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20  (lrc) ){.       
160b0 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28   storeLastErrno(
160c0 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a  pFile, tErrno);.
160d0 20 20 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63          rc = lrc
160e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
160f0 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22    }.  OSTRACE(("
16100 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20  TEST WR-LOCK %d 
16110 25 64 20 25 64 20 28 66 6c 6f 63 6b 29 5c 6e 22  %d %d (flock)\n"
16120 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20  , pFile->h, rc, 
16130 72 65 73 65 72 76 65 64 29 29 3b 0a 0a 23 69 66  reserved));..#if
16140 64 65 66 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52  def SQLITE_IGNOR
16150 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52  E_FLOCK_LOCK_ERR
16160 4f 52 53 0a 20 20 69 66 28 20 28 72 63 20 26 20  ORS.  if( (rc & 
16170 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 20 3d 3d  SQLITE_IOERR) ==
16180 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b   SQLITE_IOERR ){
16190 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
161a0 5f 4f 4b 3b 0a 20 20 20 20 72 65 73 65 72 76 65  _OK;.    reserve
161b0 64 3d 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20  d=1;.  }.#endif 
161c0 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45  /* SQLITE_IGNORE
161d0 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f  _FLOCK_LOCK_ERRO
161e0 52 53 20 2a 2f 0a 20 20 2a 70 52 65 73 4f 75 74  RS */.  *pResOut
161f0 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20 20 72   = reserved;.  r
16200 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
16210 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65  ** Lock the file
16220 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73   with the lock s
16230 70 65 63 69 66 69 65 64 20 62 79 20 70 61 72 61  pecified by para
16240 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20  meter eFileLock 
16250 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20  - one.** of the 
16260 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
16270 20 20 20 20 20 28 31 29 20 53 48 41 52 45 44 5f       (1) SHARED_
16280 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20  LOCK.**     (2) 
16290 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a  RESERVED_LOCK.**
162a0 20 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47       (3) PENDING
162b0 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29  _LOCK.**     (4)
162c0 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a   EXCLUSIVE_LOCK.
162d0 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20  **.** Sometimes 
162e0 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20  when requesting 
162f0 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20  one lock state, 
16300 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20  additional lock 
16310 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e  states.** are in
16320 73 65 72 74 65 64 20 69 6e 20 62 65 74 77 65 65  serted in betwee
16330 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20  n.  The locking 
16340 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e  might fail on on
16350 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a  e of the later.*
16360 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65  * transitions le
16370 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73  aving the lock s
16380 74 61 74 65 20 64 69 66 66 65 72 65 6e 74 20 66  tate different f
16390 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61 72  rom what it star
163a0 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c  ted but.** still
163b0 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f   short of its go
163c0 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  al.  The followi
163d0 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73 20 74  ng chart shows t
163e0 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72  he allowed.** tr
163f0 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68  ansitions and th
16400 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72  e inserted inter
16410 6d 65 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a  mediate states:.
16420 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45  **.**    UNLOCKE
16430 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20  D -> SHARED.**  
16440 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45    SHARED -> RESE
16450 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45  RVED.**    SHARE
16460 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d  D -> (PENDING) -
16470 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  > EXCLUSIVE.**  
16480 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50    RESERVED -> (P
16490 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55  ENDING) -> EXCLU
164a0 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49  SIVE.**    PENDI
164b0 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  NG -> EXCLUSIVE.
164c0 2a 2a 0a 2a 2a 20 66 6c 6f 63 6b 28 29 20 6f 6e  **.** flock() on
164d0 6c 79 20 72 65 61 6c 6c 79 20 73 75 70 70 6f 72  ly really suppor
164e0 74 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  t EXCLUSIVE lock
164f0 73 2e 20 20 57 65 20 74 72 61 63 6b 20 69 6e 74  s.  We track int
16500 65 72 6d 65 64 69 61 74 65 0a 2a 2a 20 6c 6f 63  ermediate.** loc
16510 6b 20 73 74 61 74 65 73 20 69 6e 20 74 68 65 20  k states in the 
16520 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 73 74 72  sqlite3_file str
16530 75 63 74 75 72 65 2c 20 62 75 74 20 61 6c 6c 20  ucture, but all 
16540 6c 6f 63 6b 73 20 53 48 41 52 45 44 20 6f 72 0a  locks SHARED or.
16550 2a 2a 20 61 62 6f 76 65 20 61 72 65 20 72 65 61  ** above are rea
16560 6c 6c 79 20 45 58 43 4c 55 53 49 56 45 20 6c 6f  lly EXCLUSIVE lo
16570 63 6b 73 20 61 6e 64 20 65 78 63 6c 75 64 65 20  cks and exclude 
16580 61 6c 6c 20 6f 74 68 65 72 20 70 72 6f 63 65 73  all other proces
16590 73 65 73 20 66 72 6f 6d 0a 2a 2a 20 61 63 63 65  ses from.** acce
165a0 73 73 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a  ss the file..**.
165b0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
165c0 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61  will only increa
165d0 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20  se a lock.  Use 
165e0 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c  the sqlite3OsUnl
165f0 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65  ock().** routine
16600 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b   to lower a lock
16610 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74  ing level..*/.st
16620 61 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b 4c 6f  atic int flockLo
16630 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
16640 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f  *id, int eFileLo
16650 63 6b 29 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ck) {.  int rc =
16660 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e   SQLITE_OK;.  un
16670 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
16680 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a  (unixFile*)id;..
16690 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
166a0 29 3b 0a 0a 20 20 2f 2a 20 69 66 20 77 65 20 61  );..  /* if we a
166b0 6c 72 65 61 64 79 20 68 61 76 65 20 61 20 6c 6f  lready have a lo
166c0 63 6b 2c 20 69 74 20 69 73 20 65 78 63 6c 75 73  ck, it is exclus
166d0 69 76 65 2e 20 20 0a 20 20 2a 2a 20 4a 75 73 74  ive.  .  ** Just
166e0 20 61 64 6a 75 73 74 20 6c 65 76 65 6c 20 61 6e   adjust level an
166f0 64 20 70 75 6e 74 20 6f 6e 20 6f 75 74 74 61 20  d punt on outta 
16700 68 65 72 65 2e 20 2a 2f 0a 20 20 69 66 20 28 70  here. */.  if (p
16710 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
16720 3e 20 4e 4f 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20  > NO_LOCK) {.   
16730 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
16740 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20  k = eFileLock;. 
16750 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
16760 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  _OK;.  }.  .  /*
16770 20 67 72 61 62 20 61 6e 20 65 78 63 6c 75 73 69   grab an exclusi
16780 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 0a 20 20  ve lock */.  .  
16790 69 66 20 28 72 6f 62 75 73 74 5f 66 6c 6f 63 6b  if (robust_flock
167a0 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f  (pFile->h, LOCK_
167b0 45 58 20 7c 20 4c 4f 43 4b 5f 4e 42 29 29 20 7b  EX | LOCK_NB)) {
167c0 0a 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20  .    int tErrno 
167d0 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 2f 2a 20  = errno;.    /* 
167e0 64 69 64 6e 27 74 20 67 65 74 2c 20 6d 75 73 74  didn't get, must
167f0 20 62 65 20 62 75 73 79 20 2a 2f 0a 20 20 20 20   be busy */.    
16800 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72  rc = sqliteError
16810 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74  FromPosixError(t
16820 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f  Errno, SQLITE_IO
16830 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69  ERR_LOCK);.    i
16840 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
16850 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 73 74  (rc) ){.      st
16860 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69  oreLastErrno(pFi
16870 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20  le, tErrno);.   
16880 20 7d 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20   }.  } else {.  
16890 20 20 2f 2a 20 67 6f 74 20 69 74 2c 20 73 65 74    /* got it, set
168a0 20 74 68 65 20 74 79 70 65 20 61 6e 64 20 72 65   the type and re
168b0 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20 20 20 70  turn ok */.    p
168c0 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
168d0 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 7d  = eFileLock;.  }
168e0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43  .  OSTRACE(("LOC
168f0 4b 20 20 20 20 25 64 20 25 73 20 25 73 20 28 66  K    %d %s %s (f
16900 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  lock)\n", pFile-
16910 3e 68 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65  >h, azFileLock(e
16920 46 69 6c 65 4c 6f 63 6b 29 2c 20 0a 20 20 20 20  FileLock), .    
16930 20 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54         rc==SQLIT
16940 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66  E_OK ? "ok" : "f
16950 61 69 6c 65 64 22 29 29 3b 0a 23 69 66 64 65 66  ailed"));.#ifdef
16960 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46   SQLITE_IGNORE_F
16970 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53  LOCK_LOCK_ERRORS
16980 0a 20 20 69 66 28 20 28 72 63 20 26 20 53 51 4c  .  if( (rc & SQL
16990 49 54 45 5f 49 4f 45 52 52 29 20 3d 3d 20 53 51  ITE_IOERR) == SQ
169a0 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20  LITE_IOERR ){.  
169b0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
169c0 53 59 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f  SY;.  }.#endif /
169d0 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f  * SQLITE_IGNORE_
169e0 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52  FLOCK_LOCK_ERROR
169f0 53 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72 63  S */.  return rc
16a00 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65  ;.}.../*.** Lowe
16a10 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  r the locking le
16a20 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63  vel on file desc
16a30 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20  riptor pFile to 
16a40 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c  eFileLock.  eFil
16a50 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65  eLock.** must be
16a60 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20   either NO_LOCK 
16a70 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a  or SHARED_LOCK..
16a80 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63  **.** If the loc
16a90 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68  king level of th
16aa0 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
16ab0 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20  r is already at 
16ac0 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20  or below.** the 
16ad0 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e  requested lockin
16ae0 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f  g level, this ro
16af0 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
16b00 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
16b10 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 73 71 6c 69  flockUnlock(sqli
16b20 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
16b30 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20  t eFileLock) {. 
16b40 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
16b50 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
16b60 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 70  ;.  .  assert( p
16b70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43  File );.  OSTRAC
16b80 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25  E(("UNLOCK  %d %
16b90 64 20 77 61 73 20 25 64 20 70 69 64 3d 25 64 20  d was %d pid=%d 
16ba0 28 66 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c  (flock)\n", pFil
16bb0 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c  e->h, eFileLock,
16bc0 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c  .           pFil
16bd0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 67 65  e->eFileLock, ge
16be0 74 70 69 64 28 29 29 29 3b 0a 20 20 61 73 73 65  tpid()));.  asse
16bf0 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53  rt( eFileLock<=S
16c00 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
16c10 0a 20 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20 70  .  /* no-op if p
16c20 6f 73 73 69 62 6c 65 20 2a 2f 0a 20 20 69 66 28  ossible */.  if(
16c30 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
16c40 6b 3d 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a  k==eFileLock ){.
16c50 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
16c60 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  E_OK;.  }.  .  /
16c70 2a 20 73 68 61 72 65 64 20 63 61 6e 20 6a 75 73  * shared can jus
16c80 74 20 62 65 20 73 65 74 20 62 65 63 61 75 73 65  t be set because
16c90 20 77 65 20 61 6c 77 61 79 73 20 68 61 76 65 20   we always have 
16ca0 61 6e 20 65 78 63 6c 75 73 69 76 65 20 2a 2f 0a  an exclusive */.
16cb0 20 20 69 66 20 28 65 46 69 6c 65 4c 6f 63 6b 3d    if (eFileLock=
16cc0 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 29 20 7b 0a  =SHARED_LOCK) {.
16cd0 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
16ce0 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b  Lock = eFileLock
16cf0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
16d00 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20  ITE_OK;.  }.  . 
16d10 20 2f 2a 20 6e 6f 2c 20 72 65 61 6c 6c 79 2c 20   /* no, really, 
16d20 75 6e 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 69 66 28  unlock. */.  if(
16d30 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 70 46   robust_flock(pF
16d40 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 55 4e 29  ile->h, LOCK_UN)
16d50 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   ){.#ifdef SQLIT
16d60 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c  E_IGNORE_FLOCK_L
16d70 4f 43 4b 5f 45 52 52 4f 52 53 0a 20 20 20 20 72  OCK_ERRORS.    r
16d80 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
16d90 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
16da0 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c  E_IGNORE_FLOCK_L
16db0 4f 43 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a 20 20  OCK_ERRORS */.  
16dc0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
16dd0 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20  IOERR_UNLOCK;.  
16de0 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46 69 6c 65  }else{.    pFile
16df0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f  ->eFileLock = NO
16e00 5f 4c 4f 43 4b 3b 0a 20 20 20 20 72 65 74 75 72  _LOCK;.    retur
16e10 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
16e20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
16e30 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  a file..*/.stati
16e40 63 20 69 6e 74 20 66 6c 6f 63 6b 43 6c 6f 73 65  c int flockClose
16e50 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
16e60 64 29 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  d) {.  int rc = 
16e70 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
16e80 20 69 64 20 29 7b 0a 20 20 20 20 66 6c 6f 63 6b   id ){.    flock
16e90 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f  Unlock(id, NO_LO
16ea0 43 4b 29 3b 0a 20 20 20 20 72 63 20 3d 20 63 6c  CK);.    rc = cl
16eb0 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b  oseUnixFile(id);
16ec0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
16ed0 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53  ;.}..#endif /* S
16ee0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
16ef0 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 21 4f  KING_STYLE && !O
16f00 53 5f 56 58 57 4f 52 4b 20 2a 2f 0a 0a 2f 2a 2a  S_VXWORK */../**
16f10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16f20 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 66 6c 6f  * End of the flo
16f30 63 6b 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e  ck lock implemen
16f40 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  tation *********
16f50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
16f60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16f70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16f80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16f90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16fa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a  ***********/../*
16fb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16fc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16fd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16fe0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
16ff0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
17000 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17010 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 4e 61 6d  ****** Begin Nam
17020 65 64 20 53 65 6d 61 70 68 6f 72 65 20 4c 6f 63  ed Semaphore Loc
17030 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  king ***********
17040 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
17050 0a 2a 2a 20 4e 61 6d 65 64 20 73 65 6d 61 70 68  .** Named semaph
17060 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6f  ore locking is o
17070 6e 6c 79 20 73 75 70 70 6f 72 74 65 64 20 6f 6e  nly supported on
17080 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a 0a 2a 2a 20   VxWorks..**.** 
17090 53 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e  Semaphore lockin
170a0 67 20 69 73 20 6c 69 6b 65 20 64 6f 74 2d 6c 6f  g is like dot-lo
170b0 63 6b 20 61 6e 64 20 66 6c 6f 63 6b 20 69 6e 20  ck and flock in 
170c0 74 68 61 74 20 69 74 20 72 65 61 6c 6c 79 20 6f  that it really o
170d0 6e 6c 79 0a 2a 2a 20 73 75 70 70 6f 72 74 73 20  nly.** supports 
170e0 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 69 6e  EXCLUSIVE lockin
170f0 67 2e 20 20 4f 6e 6c 79 20 61 20 73 69 6e 67 6c  g.  Only a singl
17100 65 20 70 72 6f 63 65 73 73 20 63 61 6e 20 72 65  e process can re
17110 61 64 20 6f 72 20 77 72 69 74 65 0a 2a 2a 20 74  ad or write.** t
17120 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
17130 20 61 74 20 61 20 74 69 6d 65 2e 20 20 54 68 69   at a time.  Thi
17140 73 20 72 65 64 75 63 65 73 20 70 6f 74 65 6e 74  s reduces potent
17150 69 61 6c 20 63 6f 6e 63 75 72 72 65 6e 63 79 2c  ial concurrency,
17160 20 62 75 74 0a 2a 2a 20 6d 61 6b 65 73 20 74 68   but.** makes th
17170 65 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74  e lock implement
17180 61 74 69 6f 6e 20 6d 75 63 68 20 65 61 73 69 65  ation much easie
17190 72 2e 0a 2a 2f 0a 23 69 66 20 4f 53 5f 56 58 57  r..*/.#if OS_VXW
171a0 4f 52 4b 53 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ORKS../*.** This
171b0 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20   routine checks 
171c0 69 66 20 74 68 65 72 65 20 69 73 20 61 20 52 45  if there is a RE
171d0 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64  SERVED lock held
171e0 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65   on the specifie
171f0 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69  d.** file by thi
17200 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70  s or any other p
17210 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68 20  rocess. If such 
17220 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20  a lock is held, 
17230 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20  set *pResOut.** 
17240 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61  to a non-zero va
17250 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a 70  lue otherwise *p
17260 52 65 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f  ResOut is set to
17270 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74 75   zero.  The retu
17280 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73  rn value.** is s
17290 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20  et to SQLITE_OK 
172a0 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65 72  unless an I/O er
172b0 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ror occurs durin
172c0 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e  g lock checking.
172d0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
172e0 65 6d 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  emCheckReservedL
172f0 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
17300 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f   *id, int *pResO
17310 75 74 29 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ut) {.  int rc =
17320 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
17330 74 20 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a  t reserved = 0;.
17340 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
17350 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
17360 64 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f  d;..  SimulateIO
17370 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51  Error( return SQ
17380 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b  LITE_IOERR_CHECK
17390 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b  RESERVEDLOCK; );
173a0 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 70 46  .  .  assert( pF
173b0 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65  ile );..  /* Che
173c0 63 6b 20 69 66 20 61 20 74 68 72 65 61 64 20 69  ck if a thread i
173d0 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 68  n this process h
173e0 6f 6c 64 73 20 73 75 63 68 20 61 20 6c 6f 63 6b  olds such a lock
173f0 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   */.  if( pFile-
17400 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45  >eFileLock>SHARE
17410 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65  D_LOCK ){.    re
17420 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a  served = 1;.  }.
17430 20 20 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69 73    .  /* Otherwis
17440 65 20 73 65 65 20 69 66 20 73 6f 6d 65 20 6f 74  e see if some ot
17450 68 65 72 20 70 72 6f 63 65 73 73 20 68 6f 6c 64  her process hold
17460 73 20 69 74 2e 20 2a 2f 0a 20 20 69 66 28 20 21  s it. */.  if( !
17470 72 65 73 65 72 76 65 64 20 29 7b 0a 20 20 20 20  reserved ){.    
17480 73 65 6d 5f 74 20 2a 70 53 65 6d 20 3d 20 70 46  sem_t *pSem = pF
17490 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65  ile->pInode->pSe
174a0 6d 3b 0a 0a 20 20 20 20 69 66 28 20 73 65 6d 5f  m;..    if( sem_
174b0 74 72 79 77 61 69 74 28 70 53 65 6d 29 3d 3d 2d  trywait(pSem)==-
174c0 31 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 74  1 ){.      int t
174d0 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
174e0 20 20 20 20 20 69 66 28 20 45 41 47 41 49 4e 20       if( EAGAIN 
174f0 21 3d 20 74 45 72 72 6e 6f 20 29 7b 0a 20 20 20  != tErrno ){.   
17500 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
17510 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
17520 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49  ror(tErrno, SQLI
17530 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45  TE_IOERR_CHECKRE
17540 53 45 52 56 45 44 4c 4f 43 4b 29 3b 0a 20 20 20  SERVEDLOCK);.   
17550 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72       storeLastEr
17560 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e  rno(pFile, tErrn
17570 6f 29 3b 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  o);.      } else
17580 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 73 6f   {.        /* so
17590 6d 65 6f 6e 65 20 65 6c 73 65 20 68 61 73 20 74  meone else has t
175a0 68 65 20 6c 6f 63 6b 20 77 68 65 6e 20 77 65 20  he lock when we 
175b0 61 72 65 20 69 6e 20 4e 4f 5f 4c 4f 43 4b 20 2a  are in NO_LOCK *
175c0 2f 0a 20 20 20 20 20 20 20 20 72 65 73 65 72 76  /.        reserv
175d0 65 64 20 3d 20 28 70 46 69 6c 65 2d 3e 65 46 69  ed = (pFile->eFi
175e0 6c 65 4c 6f 63 6b 20 3c 20 53 48 41 52 45 44 5f  leLock < SHARED_
175f0 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20  LOCK);.      }. 
17600 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
17610 2f 2a 20 77 65 20 63 6f 75 6c 64 20 68 61 76 65  /* we could have
17620 20 69 74 20 69 66 20 77 65 20 77 61 6e 74 20 69   it if we want i
17630 74 20 2a 2f 0a 20 20 20 20 20 20 73 65 6d 5f 70  t */.      sem_p
17640 6f 73 74 28 70 53 65 6d 29 3b 0a 20 20 20 20 7d  ost(pSem);.    }
17650 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28  .  }.  OSTRACE((
17660 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64  "TEST WR-LOCK %d
17670 20 25 64 20 25 64 20 28 73 65 6d 29 5c 6e 22 2c   %d %d (sem)\n",
17680 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72   pFile->h, rc, r
17690 65 73 65 72 76 65 64 29 29 3b 0a 0a 20 20 2a 70  eserved));..  *p
176a0 52 65 73 4f 75 74 20 3d 20 72 65 73 65 72 76 65  ResOut = reserve
176b0 64 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  d;.  return rc;.
176c0 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68  }../*.** Lock th
176d0 65 20 66 69 6c 65 20 77 69 74 68 20 74 68 65 20  e file with the 
176e0 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20 62  lock specified b
176f0 79 20 70 61 72 61 6d 65 74 65 72 20 65 46 69 6c  y parameter eFil
17700 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f  eLock - one.** o
17710 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  f the following:
17720 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53  .**.**     (1) S
17730 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  HARED_LOCK.**   
17740 20 20 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c    (2) RESERVED_L
17750 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50  OCK.**     (3) P
17760 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20  ENDING_LOCK.**  
17770 20 20 20 28 34 29 20 45 58 43 4c 55 53 49 56 45     (4) EXCLUSIVE
17780 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65  _LOCK.**.** Some
17790 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65  times when reque
177a0 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73  sting one lock s
177b0 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c  tate, additional
177c0 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20   lock states.** 
177d0 61 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20  are inserted in 
177e0 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f  between.  The lo
177f0 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c  cking might fail
17800 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c   on one of the l
17810 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69  ater.** transiti
17820 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20  ons leaving the 
17830 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66 65  lock state diffe
17840 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69  rent from what i
17850 74 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a  t started but.**
17860 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20   still short of 
17870 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66  its goal.  The f
17880 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73  ollowing chart s
17890 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64  hows the allowed
178a0 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  .** transitions 
178b0 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65 64  and the inserted
178c0 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74   intermediate st
178d0 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55  ates:.**.**    U
178e0 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45  NLOCKED -> SHARE
178f0 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d  D.**    SHARED -
17900 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20  > RESERVED.**   
17910 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44   SHARED -> (PEND
17920 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56  ING) -> EXCLUSIV
17930 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44  E.**    RESERVED
17940 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e   -> (PENDING) ->
17950 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20   EXCLUSIVE.**   
17960 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c   PENDING -> EXCL
17970 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 53 65 6d 61  USIVE.**.** Sema
17980 70 68 6f 72 65 20 6c 6f 63 6b 73 20 6f 6e 6c 79  phore locks only
17990 20 72 65 61 6c 6c 79 20 73 75 70 70 6f 72 74 20   really support 
179a0 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73 2e  EXCLUSIVE locks.
179b0 20 20 57 65 20 74 72 61 63 6b 20 69 6e 74 65 72    We track inter
179c0 6d 65 64 69 61 74 65 0a 2a 2a 20 6c 6f 63 6b 20  mediate.** lock 
179d0 73 74 61 74 65 73 20 69 6e 20 74 68 65 20 73 71  states in the sq
179e0 6c 69 74 65 33 5f 66 69 6c 65 20 73 74 72 75 63  lite3_file struc
179f0 74 75 72 65 2c 20 62 75 74 20 61 6c 6c 20 6c 6f  ture, but all lo
17a00 63 6b 73 20 53 48 41 52 45 44 20 6f 72 0a 2a 2a  cks SHARED or.**
17a10 20 61 62 6f 76 65 20 61 72 65 20 72 65 61 6c 6c   above are reall
17a20 79 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  y EXCLUSIVE lock
17a30 73 20 61 6e 64 20 65 78 63 6c 75 64 65 20 61 6c  s and exclude al
17a40 6c 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65  l other processe
17a50 73 20 66 72 6f 6d 0a 2a 2a 20 61 63 63 65 73 73  s from.** access
17a60 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a   the file..**.**
17a70 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   This routine wi
17a80 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65  ll only increase
17a90 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68   a lock.  Use th
17aa0 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63  e sqlite3OsUnloc
17ab0 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74  k().** routine t
17ac0 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e  o lower a lockin
17ad0 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74  g level..*/.stat
17ae0 69 63 20 69 6e 74 20 73 65 6d 4c 6f 63 6b 28 73  ic int semLock(s
17af0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
17b00 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20   int eFileLock) 
17b10 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  {.  unixFile *pF
17b20 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
17b30 29 69 64 3b 0a 20 20 73 65 6d 5f 74 20 2a 70 53  )id;.  sem_t *pS
17b40 65 6d 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  em = pFile->pIno
17b50 64 65 2d 3e 70 53 65 6d 3b 0a 20 20 69 6e 74 20  de->pSem;.  int 
17b60 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
17b70 0a 20 20 2f 2a 20 69 66 20 77 65 20 61 6c 72 65  .  /* if we alre
17b80 61 64 79 20 68 61 76 65 20 61 20 6c 6f 63 6b 2c  ady have a lock,
17b90 20 69 74 20 69 73 20 65 78 63 6c 75 73 69 76 65   it is exclusive
17ba0 2e 20 20 0a 20 20 2a 2a 20 4a 75 73 74 20 61 64  .  .  ** Just ad
17bb0 6a 75 73 74 20 6c 65 76 65 6c 20 61 6e 64 20 70  just level and p
17bc0 75 6e 74 20 6f 6e 20 6f 75 74 74 61 20 68 65 72  unt on outta her
17bd0 65 2e 20 2a 2f 0a 20 20 69 66 20 28 70 46 69 6c  e. */.  if (pFil
17be0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3e 20 4e  e->eFileLock > N
17bf0 4f 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46  O_LOCK) {.    pF
17c00 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
17c10 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20   eFileLock;.    
17c20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
17c30 20 20 20 20 67 6f 74 6f 20 73 65 6d 5f 65 6e 64      goto sem_end
17c40 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 0a 20 20  _lock;.  }.  .  
17c50 2f 2a 20 6c 6f 63 6b 20 73 65 6d 61 70 68 6f 72  /* lock semaphor
17c60 65 20 6e 6f 77 20 62 75 74 20 62 61 69 6c 20 6f  e now but bail o
17c70 75 74 20 77 68 65 6e 20 61 6c 72 65 61 64 79 20  ut when already 
17c80 6c 6f 63 6b 65 64 2e 20 2a 2f 0a 20 20 69 66 28  locked. */.  if(
17c90 20 73 65 6d 5f 74 72 79 77 61 69 74 28 70 53 65   sem_trywait(pSe
17ca0 6d 29 3d 3d 2d 31 20 29 7b 0a 20 20 20 20 72 63  m)==-1 ){.    rc
17cb0 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
17cc0 20 20 20 20 67 6f 74 6f 20 73 65 6d 5f 65 6e 64      goto sem_end
17cd0 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  _lock;.  }..  /*
17ce0 20 67 6f 74 20 69 74 2c 20 73 65 74 20 74 68 65   got it, set the
17cf0 20 74 79 70 65 20 61 6e 64 20 72 65 74 75 72 6e   type and return
17d00 20 6f 6b 20 2a 2f 0a 20 20 70 46 69 6c 65 2d 3e   ok */.  pFile->
17d10 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c  eFileLock = eFil
17d20 65 4c 6f 63 6b 3b 0a 0a 20 73 65 6d 5f 65 6e 64  eLock;.. sem_end
17d30 5f 6c 6f 63 6b 3a 0a 20 20 72 65 74 75 72 6e 20  _lock:.  return 
17d40 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77  rc;.}../*.** Low
17d50 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  er the locking l
17d60 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73  evel on file des
17d70 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f  criptor pFile to
17d80 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69   eFileLock.  eFi
17d90 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62  leLock.** must b
17da0 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b  e either NO_LOCK
17db0 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e   or SHARED_LOCK.
17dc0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f  .**.** If the lo
17dd0 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74  cking level of t
17de0 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
17df0 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74  or is already at
17e00 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65   or below.** the
17e10 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69   requested locki
17e20 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72  ng level, this r
17e30 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
17e40 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  p..*/.static int
17e50 20 73 65 6d 55 6e 6c 6f 63 6b 28 73 71 6c 69 74   semUnlock(sqlit
17e60 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
17e70 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20   eFileLock) {.  
17e80 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
17e90 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
17ea0 0a 20 20 73 65 6d 5f 74 20 2a 70 53 65 6d 20 3d  .  sem_t *pSem =
17eb0 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e   pFile->pInode->
17ec0 70 53 65 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28  pSem;..  assert(
17ed0 20 70 46 69 6c 65 20 29 3b 0a 20 20 61 73 73 65   pFile );.  asse
17ee0 72 74 28 20 70 53 65 6d 20 29 3b 0a 20 20 4f 53  rt( pSem );.  OS
17ef0 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 20  TRACE(("UNLOCK  
17f00 25 64 20 25 64 20 77 61 73 20 25 64 20 70 69 64  %d %d was %d pid
17f10 3d 25 64 20 28 73 65 6d 29 5c 6e 22 2c 20 70 46  =%d (sem)\n", pF
17f20 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f 63  ile->h, eFileLoc
17f30 6b 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46  k,.           pF
17f40 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20  ile->eFileLock, 
17f50 67 65 74 70 69 64 28 29 29 29 3b 0a 20 20 61 73  getpid()));.  as
17f60 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3c  sert( eFileLock<
17f70 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
17f80 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66    .  /* no-op if
17f90 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 20 20 69   possible */.  i
17fa0 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  f( pFile->eFileL
17fb0 6f 63 6b 3d 3d 65 46 69 6c 65 4c 6f 63 6b 20 29  ock==eFileLock )
17fc0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
17fd0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20  ITE_OK;.  }.  . 
17fe0 20 2f 2a 20 73 68 61 72 65 64 20 63 61 6e 20 6a   /* shared can j
17ff0 75 73 74 20 62 65 20 73 65 74 20 62 65 63 61 75  ust be set becau
18000 73 65 20 77 65 20 61 6c 77 61 79 73 20 68 61 76  se we always hav
18010 65 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 2a  e an exclusive *
18020 2f 0a 20 20 69 66 20 28 65 46 69 6c 65 4c 6f 63  /.  if (eFileLoc
18030 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 29 20  k==SHARED_LOCK) 
18040 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69  {.    pFile->eFi
18050 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f  leLock = eFileLo
18060 63 6b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ck;.    return S
18070 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
18080 0a 20 20 2f 2a 20 6e 6f 2c 20 72 65 61 6c 6c 79  .  /* no, really
18090 20 75 6e 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 69 66   unlock. */.  if
180a0 20 28 20 73 65 6d 5f 70 6f 73 74 28 70 53 65 6d   ( sem_post(pSem
180b0 29 3d 3d 2d 31 20 29 20 7b 0a 20 20 20 20 69 6e  )==-1 ) {.    in
180c0 74 20 72 63 2c 20 74 45 72 72 6e 6f 20 3d 20 65  t rc, tErrno = e
180d0 72 72 6e 6f 3b 0a 20 20 20 20 72 63 20 3d 20 73  rrno;.    rc = s
180e0 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
180f0 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c  sixError(tErrno,
18100 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e   SQLITE_IOERR_UN
18110 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 49  LOCK);.    if( I
18120 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29  S_LOCK_ERROR(rc)
18130 20 29 7b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c   ){.      storeL
18140 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20  astErrno(pFile, 
18150 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 7d 0a 20  tErrno);.    }. 
18160 20 20 20 72 65 74 75 72 6e 20 72 63 3b 20 0a 20     return rc; . 
18170 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c   }.  pFile->eFil
18180 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b  eLock = NO_LOCK;
18190 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
181a0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2a 20 43  _OK;.}../*. ** C
181b0 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 20 2a 2f  lose a file.. */
181c0 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6d 43  .static int semC
181d0 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  lose(sqlite3_fil
181e0 65 20 2a 69 64 29 20 7b 0a 20 20 69 66 28 20 69  e *id) {.  if( i
181f0 64 20 29 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c  d ){.    unixFil
18200 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
18210 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20 73 65  File*)id;.    se
18220 6d 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c  mUnlock(id, NO_L
18230 4f 43 4b 29 3b 0a 20 20 20 20 61 73 73 65 72 74  OCK);.    assert
18240 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 75  ( pFile );.    u
18250 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
18260 0a 20 20 20 20 72 65 6c 65 61 73 65 49 6e 6f 64  .    releaseInod
18270 65 49 6e 66 6f 28 70 46 69 6c 65 29 3b 0a 20 20  eInfo(pFile);.  
18280 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
18290 28 29 3b 0a 20 20 20 20 63 6c 6f 73 65 55 6e 69  ();.    closeUni
182a0 78 46 69 6c 65 28 69 64 29 3b 0a 20 20 7d 0a 20  xFile(id);.  }. 
182b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
182c0 4b 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20  K;.}..#endif /* 
182d0 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 2f 2a  OS_VXWORKS */./*
182e0 0a 2a 2a 20 4e 61 6d 65 64 20 73 65 6d 61 70 68  .** Named semaph
182f0 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6f  ore locking is o
18300 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e  nly available on
18310 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a 0a 2a 2a 2a   VxWorks..**.***
18320 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64  ************ End
18330 20 6f 66 20 74 68 65 20 6e 61 6d 65 64 20 73 65   of the named se
18340 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 20 69 6d 70  maphore lock imp
18350 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a  lementation ****
18360 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
18370 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18380 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18390 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
183a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
183b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f  ***********/.../
183c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
183d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
183e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
183f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18400 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
18410 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18420 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e  ********** Begin
18430 20 41 46 50 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a   AFP Locking ***
18440 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18450 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
18460 2a 0a 2a 2a 20 41 46 50 20 69 73 20 74 68 65 20  *.** AFP is the 
18470 41 70 70 6c 65 20 46 69 6c 69 6e 67 20 50 72 6f  Apple Filing Pro
18480 74 6f 63 6f 6c 2e 20 20 41 46 50 20 69 73 20 61  tocol.  AFP is a
18490 20 6e 65 74 77 6f 72 6b 20 66 69 6c 65 73 79 73   network filesys
184a0 74 65 6d 20 66 6f 75 6e 64 0a 2a 2a 20 6f 6e 20  tem found.** on 
184b0 41 70 70 6c 65 20 4d 61 63 69 6e 74 6f 73 68 20  Apple Macintosh 
184c0 63 6f 6d 70 75 74 65 72 73 20 2d 20 62 6f 74 68  computers - both
184d0 20 4f 53 39 20 61 6e 64 20 4f 53 58 2e 0a 2a 2a   OS9 and OSX..**
184e0 0a 2a 2a 20 54 68 69 72 64 2d 70 61 72 74 79 20  .** Third-party 
184f0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20  implementations 
18500 6f 66 20 41 46 50 20 61 72 65 20 61 76 61 69 6c  of AFP are avail
18510 61 62 6c 65 2e 20 20 42 75 74 20 74 68 69 73 20  able.  But this 
18520 63 6f 64 65 20 68 65 72 65 0a 2a 2a 20 6f 6e 6c  code here.** onl
18530 79 20 77 6f 72 6b 73 20 6f 6e 20 4f 53 58 2e 0a  y works on OSX..
18540 2a 2f 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  */..#if defined(
18550 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51  __APPLE__) && SQ
18560 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
18570 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 0a 2a 2a 20  ING_STYLE./*.** 
18580 54 68 65 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f  The afpLockingCo
18590 6e 74 65 78 74 20 73 74 72 75 63 74 75 72 65 20  ntext structure 
185a0 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 20 61 66 70  contains all afp
185b0 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 63 20 73   lock specific s
185c0 74 61 74 65 0a 2a 2f 0a 74 79 70 65 64 65 66 20  tate.*/.typedef 
185d0 73 74 72 75 63 74 20 61 66 70 4c 6f 63 6b 69 6e  struct afpLockin
185e0 67 43 6f 6e 74 65 78 74 20 61 66 70 4c 6f 63 6b  gContext afpLock
185f0 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 73 74 72 75  ingContext;.stru
18600 63 74 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e  ct afpLockingCon
18610 74 65 78 74 20 7b 0a 20 20 69 6e 74 20 72 65 73  text {.  int res
18620 65 72 76 65 64 3b 0a 20 20 63 6f 6e 73 74 20 63  erved;.  const c
18630 68 61 72 20 2a 64 62 50 61 74 68 3b 20 20 20 20  har *dbPath;    
18640 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
18650 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 66 69 6c   of the open fil
18660 65 20 2a 2f 0a 7d 3b 0a 0a 73 74 72 75 63 74 20  e */.};..struct 
18670 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32  ByteRangeLockPB2
18680 0a 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f  .{.  unsigned lo
18690 6e 67 20 6c 6f 6e 67 20 6f 66 66 73 65 74 3b 20  ng long offset; 
186a0 20 20 20 20 20 20 20 2f 2a 20 6f 66 66 73 65 74         /* offset
186b0 20 74 6f 20 66 69 72 73 74 20 62 79 74 65 20 74   to first byte t
186c0 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73 69  o lock */.  unsi
186d0 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6c  gned long long l
186e0 65 6e 67 74 68 3b 20 20 20 20 20 20 20 20 2f 2a  ength;        /*
186f0 20 6e 62 72 20 6f 66 20 62 79 74 65 73 20 74 6f   nbr of bytes to
18700 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73 69 67   lock */.  unsig
18710 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 72 65  ned long long re
18720 74 52 61 6e 67 65 53 74 61 72 74 3b 20 2f 2a 20  tRangeStart; /* 
18730 6e 62 72 20 6f 66 20 31 73 74 20 62 79 74 65 20  nbr of 1st byte 
18740 6c 6f 63 6b 65 64 20 69 66 20 73 75 63 63 65 73  locked if succes
18750 73 66 75 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  sful */.  unsign
18760 65 64 20 63 68 61 72 20 75 6e 4c 6f 63 6b 46 6c  ed char unLockFl
18770 61 67 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 31  ag;         /* 1
18780 20 3d 20 75 6e 6c 6f 63 6b 2c 20 30 20 3d 20 6c   = unlock, 0 = l
18790 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ock */.  unsigne
187a0 64 20 63 68 61 72 20 73 74 61 72 74 45 6e 64 46  d char startEndF
187b0 6c 61 67 3b 20 20 20 20 20 20 20 2f 2a 20 31 3d  lag;       /* 1=
187c0 72 65 6c 20 74 6f 20 65 6e 64 20 6f 66 20 66 6f  rel to end of fo
187d0 72 6b 2c 20 30 3d 72 65 6c 20 74 6f 20 73 74 61  rk, 0=rel to sta
187e0 72 74 20 2a 2f 0a 20 20 69 6e 74 20 66 64 3b 20  rt */.  int fd; 
187f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18800 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 69 6c            /* fil
18810 65 20 64 65 73 63 20 74 6f 20 61 73 73 6f 63 20  e desc to assoc 
18820 74 68 69 73 20 6c 6f 63 6b 20 77 69 74 68 20 2a  this lock with *
18830 2f 0a 7d 3b 0a 0a 23 64 65 66 69 6e 65 20 61 66  /.};..#define af
18840 70 66 73 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b  pfsByteRangeLock
18850 32 46 53 43 54 4c 20 20 20 20 20 20 20 20 5f 49  2FSCTL        _I
18860 4f 57 52 28 27 7a 27 2c 20 32 33 2c 20 73 74 72  OWR('z', 23, str
18870 75 63 74 20 42 79 74 65 52 61 6e 67 65 4c 6f 63  uct ByteRangeLoc
18880 6b 50 42 32 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  kPB2)../*.** Thi
18890 73 20 69 73 20 61 20 75 74 69 6c 69 74 79 20 66  s is a utility f
188a0 6f 72 20 73 65 74 74 69 6e 67 20 6f 72 20 63 6c  or setting or cl
188b0 65 61 72 69 6e 67 20 61 20 62 69 74 2d 72 61 6e  earing a bit-ran
188c0 67 65 20 6c 6f 63 6b 20 6f 6e 20 61 6e 0a 2a 2a  ge lock on an.**
188d0 20 41 46 50 20 66 69 6c 65 73 79 73 74 65 6d 2e   AFP filesystem.
188e0 0a 2a 2a 20 0a 2a 2a 20 52 65 74 75 72 6e 20 53  .** .** Return S
188f0 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
18900 65 73 73 2c 20 53 51 4c 49 54 45 5f 42 55 53 59  ess, SQLITE_BUSY
18910 20 6f 6e 20 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a   on failure..*/.
18920 73 74 61 74 69 63 20 69 6e 74 20 61 66 70 53 65  static int afpSe
18930 74 4c 6f 63 6b 28 0a 20 20 63 6f 6e 73 74 20 63  tLock(.  const c
18940 68 61 72 20 2a 70 61 74 68 2c 20 20 20 20 20 20  har *path,      
18950 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
18960 6f 66 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62  of the file to b
18970 65 20 6c 6f 63 6b 65 64 20 6f 72 20 75 6e 6c 6f  e locked or unlo
18980 63 6b 65 64 20 2a 2f 0a 20 20 75 6e 69 78 46 69  cked */.  unixFi
18990 6c 65 20 2a 70 46 69 6c 65 2c 20 20 20 20 20 20  le *pFile,      
189a0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e           /* Open
189b0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
189c0 20 6f 6e 20 70 61 74 68 20 2a 2f 0a 20 20 75 6e   on path */.  un
189d0 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67  signed long long
189e0 20 6f 66 66 73 65 74 2c 20 20 20 20 20 2f 2a 20   offset,     /* 
189f0 46 69 72 73 74 20 62 79 74 65 20 74 6f 20 62 65  First byte to be
18a00 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 6e 73   locked */.  uns
18a10 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20  igned long long 
18a20 6c 65 6e 67 74 68 2c 20 20 20 20 20 2f 2a 20 4e  length,     /* N
18a30 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74  umber of bytes t
18a40 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 6e 74 20  o lock */.  int 
18a50 73 65 74 4c 6f 63 6b 46 6c 61 67 20 20 20 20 20  setLockFlag     
18a60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
18a70 75 65 20 74 6f 20 73 65 74 20 6c 6f 63 6b 2e 20  ue to set lock. 
18a80 20 46 61 6c 73 65 20 74 6f 20 63 6c 65 61 72 20   False to clear 
18a90 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 73 74 72  lock */.){.  str
18aa0 75 63 74 20 42 79 74 65 52 61 6e 67 65 4c 6f 63  uct ByteRangeLoc
18ab0 6b 50 42 32 20 70 62 3b 0a 20 20 69 6e 74 20 65  kPB2 pb;.  int e
18ac0 72 72 3b 0a 20 20 0a 20 20 70 62 2e 75 6e 4c 6f  rr;.  .  pb.unLo
18ad0 63 6b 46 6c 61 67 20 3d 20 73 65 74 4c 6f 63 6b  ckFlag = setLock
18ae0 46 6c 61 67 20 3f 20 30 20 3a 20 31 3b 0a 20 20  Flag ? 0 : 1;.  
18af0 70 62 2e 73 74 61 72 74 45 6e 64 46 6c 61 67 20  pb.startEndFlag 
18b00 3d 20 30 3b 0a 20 20 70 62 2e 6f 66 66 73 65 74  = 0;.  pb.offset
18b10 20 3d 20 6f 66 66 73 65 74 3b 0a 20 20 70 62 2e   = offset;.  pb.
18b20 6c 65 6e 67 74 68 20 3d 20 6c 65 6e 67 74 68 3b  length = length;
18b30 20 0a 20 20 70 62 2e 66 64 20 3d 20 70 46 69 6c   .  pb.fd = pFil
18b40 65 2d 3e 68 3b 0a 20 20 0a 20 20 4f 53 54 52 41  e->h;.  .  OSTRA
18b50 43 45 28 28 22 41 46 50 53 45 54 4c 4f 43 4b 20  CE(("AFPSETLOCK 
18b60 5b 25 73 5d 20 66 6f 72 20 25 64 25 73 20 69 6e  [%s] for %d%s in
18b70 20 72 61 6e 67 65 20 25 6c 6c 78 3a 25 6c 6c 78   range %llx:%llx
18b80 5c 6e 22 2c 20 0a 20 20 20 20 28 73 65 74 4c 6f  \n", .    (setLo
18b90 63 6b 46 6c 61 67 3f 22 4f 4e 22 3a 22 4f 46 46  ckFlag?"ON":"OFF
18ba0 22 29 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 28 70  "), pFile->h, (p
18bb0 62 2e 66 64 3d 3d 2d 31 3f 22 5b 74 65 73 74 76  b.fd==-1?"[testv
18bc0 61 6c 2d 31 5d 22 3a 22 22 29 2c 0a 20 20 20 20  al-1]":""),.    
18bd0 6f 66 66 73 65 74 2c 20 6c 65 6e 67 74 68 29 29  offset, length))
18be0 3b 0a 20 20 65 72 72 20 3d 20 66 73 63 74 6c 28  ;.  err = fsctl(
18bf0 70 61 74 68 2c 20 61 66 70 66 73 42 79 74 65 52  path, afpfsByteR
18c00 61 6e 67 65 4c 6f 63 6b 32 46 53 43 54 4c 2c 20  angeLock2FSCTL, 
18c10 26 70 62 2c 20 30 29 3b 0a 20 20 69 66 20 28 20  &pb, 0);.  if ( 
18c20 65 72 72 3d 3d 2d 31 20 29 20 7b 0a 20 20 20 20  err==-1 ) {.    
18c30 69 6e 74 20 72 63 3b 0a 20 20 20 20 69 6e 74 20  int rc;.    int 
18c40 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
18c50 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 41 46      OSTRACE(("AF
18c60 50 53 45 54 4c 4f 43 4b 20 66 61 69 6c 65 64 20  PSETLOCK failed 
18c70 74 6f 20 66 73 63 74 6c 28 29 20 27 25 73 27 20  to fsctl() '%s' 
18c80 25 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20  %d %s\n",.      
18c90 20 20 20 20 20 20 20 70 61 74 68 2c 20 74 45 72         path, tEr
18ca0 72 6e 6f 2c 20 73 74 72 65 72 72 6f 72 28 74 45  rno, strerror(tE
18cb0 72 72 6e 6f 29 29 29 3b 0a 23 69 66 64 65 66 20  rrno)));.#ifdef 
18cc0 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 41 46  SQLITE_IGNORE_AF
18cd0 50 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20 20  P_LOCK_ERRORS.  
18ce0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
18cf0 53 59 3b 0a 23 65 6c 73 65 0a 20 20 20 20 72 63  SY;.#else.    rc
18d00 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
18d10 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
18d20 72 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rno,.           
18d30 20 20 20 20 20 20 20 20 20 73 65 74 4c 6f 63 6b           setLock
18d40 46 6c 61 67 20 3f 20 53 51 4c 49 54 45 5f 49 4f  Flag ? SQLITE_IO
18d50 45 52 52 5f 4c 4f 43 4b 20 3a 20 53 51 4c 49 54  ERR_LOCK : SQLIT
18d60 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b  E_IOERR_UNLOCK);
18d70 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
18d80 45 5f 49 47 4e 4f 52 45 5f 41 46 50 5f 4c 4f 43  E_IGNORE_AFP_LOC
18d90 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a 20 20 20 20  K_ERRORS */.    
18da0 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f  if( IS_LOCK_ERRO
18db0 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 73  R(rc) ){.      s
18dc0 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46  toreLastErrno(pF
18dd0 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20  ile, tErrno);.  
18de0 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72    }.    return r
18df0 63 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  c;.  } else {.  
18e00 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
18e10 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  OK;.  }.}../*.**
18e20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68   This routine ch
18e30 65 63 6b 73 20 69 66 20 74 68 65 72 65 20 69 73  ecks if there is
18e40 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
18e50 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65   held on the spe
18e60 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62  cified.** file b
18e70 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74  y this or any ot
18e80 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20  her process. If 
18e90 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68  such a lock is h
18ea0 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f 75  eld, set *pResOu
18eb0 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65  t.** to a non-ze
18ec0 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77 69  ro value otherwi
18ed0 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73  se *pResOut is s
18ee0 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65  et to zero.  The
18ef0 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a   return value.**
18f00 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54   is set to SQLIT
18f10 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49  E_OK unless an I
18f20 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  /O error occurs 
18f30 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63  during lock chec
18f40 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  king..*/.static 
18f50 69 6e 74 20 61 66 70 43 68 65 63 6b 52 65 73 65  int afpCheckRese
18f60 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33  rvedLock(sqlite3
18f70 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a  _file *id, int *
18f80 70 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e 74 20  pResOut){.  int 
18f90 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
18fa0 20 20 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d    int reserved =
18fb0 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a   0;.  unixFile *
18fc0 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
18fd0 65 2a 29 69 64 3b 0a 20 20 61 66 70 4c 6f 63 6b  e*)id;.  afpLock
18fe0 69 6e 67 43 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  ingContext *cont
18ff0 65 78 74 3b 0a 20 20 0a 20 20 53 69 6d 75 6c 61  ext;.  .  Simula
19000 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72  teIOError( retur
19010 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43  n SQLITE_IOERR_C
19020 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b  HECKRESERVEDLOCK
19030 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73 65 72 74  ; );.  .  assert
19040 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 63 6f 6e  ( pFile );.  con
19050 74 65 78 74 20 3d 20 28 61 66 70 4c 6f 63 6b 69  text = (afpLocki
19060 6e 67 43 6f 6e 74 65 78 74 20 2a 29 20 70 46 69  ngContext *) pFi
19070 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
19080 78 74 3b 0a 20 20 69 66 28 20 63 6f 6e 74 65 78  xt;.  if( contex
19090 74 2d 3e 72 65 73 65 72 76 65 64 20 29 7b 0a 20  t->reserved ){. 
190a0 20 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 31 3b     *pResOut = 1;
190b0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
190c0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 75 6e 69  TE_OK;.  }.  uni
190d0 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 20 2f  xEnterMutex(); /
190e0 2a 20 42 65 63 61 75 73 65 20 70 46 69 6c 65 2d  * Because pFile-
190f0 3e 70 49 6e 6f 64 65 20 69 73 20 73 68 61 72 65  >pInode is share
19100 64 20 61 63 72 6f 73 73 20 74 68 72 65 61 64 73  d across threads
19110 20 2a 2f 0a 20 20 0a 20 20 2f 2a 20 43 68 65 63   */.  .  /* Chec
19120 6b 20 69 66 20 61 20 74 68 72 65 61 64 20 69 6e  k if a thread in
19130 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 68 6f   this process ho
19140 6c 64 73 20 73 75 63 68 20 61 20 6c 6f 63 6b 20  lds such a lock 
19150 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
19160 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
19170 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b  k>SHARED_LOCK ){
19180 0a 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20  .    reserved = 
19190 31 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f  1;.  }.  .  /* O
191a0 74 68 65 72 77 69 73 65 20 73 65 65 20 69 66 20  therwise see if 
191b0 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65  some other proce
191c0 73 73 20 68 6f 6c 64 73 20 69 74 2e 0a 20 20 20  ss holds it..   
191d0 2a 2f 0a 20 20 69 66 28 20 21 72 65 73 65 72 76  */.  if( !reserv
191e0 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20 6c 6f 63  ed ){.    /* loc
191f0 6b 20 74 68 65 20 52 45 53 45 52 56 45 44 20 62  k the RESERVED b
19200 79 74 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6c  yte */.    int l
19210 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28  rc = afpSetLock(
19220 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c  context->dbPath,
19230 20 70 46 69 6c 65 2c 20 52 45 53 45 52 56 45 44   pFile, RESERVED
19240 5f 42 59 54 45 2c 20 31 2c 31 29 3b 20 20 0a 20  _BYTE, 1,1);  . 
19250 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b     if( SQLITE_OK
19260 3d 3d 6c 72 63 20 29 7b 0a 20 20 20 20 20 20 2f  ==lrc ){.      /
19270 2a 20 69 66 20 77 65 20 73 75 63 63 65 65 64 65  * if we succeede
19280 64 20 69 6e 20 74 61 6b 69 6e 67 20 74 68 65 20  d in taking the 
19290 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 2c 20 75  reserved lock, u
192a0 6e 6c 6f 63 6b 20 69 74 20 74 6f 20 72 65 73 74  nlock it to rest
192b0 6f 72 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  ore.      ** the
192c0 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65 20   original state 
192d0 2a 2f 0a 20 20 20 20 20 20 6c 72 63 20 3d 20 61  */.      lrc = a
192e0 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78  fpSetLock(contex
192f0 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65  t->dbPath, pFile
19300 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c  , RESERVED_BYTE,
19310 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d 20 65 6c   1, 0);.    } el
19320 73 65 20 7b 0a 20 20 20 20 20 20 2f 2a 20 69 66  se {.      /* if
19330 20 77 65 20 66 61 69 6c 65 64 20 74 6f 20 67 65   we failed to ge
19340 74 20 74 68 65 20 6c 6f 63 6b 20 74 68 65 6e 20  t the lock then 
19350 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 6d 75 73  someone else mus
19360 74 20 68 61 76 65 20 69 74 20 2a 2f 0a 20 20 20  t have it */.   
19370 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b     reserved = 1;
19380 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 49  .    }.    if( I
19390 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63  S_LOCK_ERROR(lrc
193a0 29 20 29 7b 0a 20 20 20 20 20 20 72 63 3d 6c 72  ) ){.      rc=lr
193b0 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a  c;.    }.  }.  .
193c0 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
193d0 28 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  ();.  OSTRACE(("
193e0 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20  TEST WR-LOCK %d 
193f0 25 64 20 25 64 20 28 61 66 70 29 5c 6e 22 2c 20  %d %d (afp)\n", 
19400 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65  pFile->h, rc, re
19410 73 65 72 76 65 64 29 29 3b 0a 20 20 0a 20 20 2a  served));.  .  *
19420 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65 72 76  pResOut = reserv
19430 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ed;.  return rc;
19440 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74  .}../*.** Lock t
19450 68 65 20 66 69 6c 65 20 77 69 74 68 20 74 68 65  he file with the
19460 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20   lock specified 
19470 62 79 20 70 61 72 61 6d 65 74 65 72 20 65 46 69  by parameter eFi
19480 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20  leLock - one.** 
19490 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
194a0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20  :.**.**     (1) 
194b0 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20  SHARED_LOCK.**  
194c0 20 20 20 28 32 29 20 52 45 53 45 52 56 45 44 5f     (2) RESERVED_
194d0 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20  LOCK.**     (3) 
194e0 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20  PENDING_LOCK.** 
194f0 20 20 20 20 28 34 29 20 45 58 43 4c 55 53 49 56      (4) EXCLUSIV
19500 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d  E_LOCK.**.** Som
19510 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75  etimes when requ
19520 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20  esting one lock 
19530 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61  state, additiona
19540 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a  l lock states.**
19550 20 61 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e   are inserted in
19560 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c   between.  The l
19570 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69  ocking might fai
19580 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20  l on one of the 
19590 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74  later.** transit
195a0 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65  ions leaving the
195b0 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66   lock state diff
195c0 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20  erent from what 
195d0 69 74 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a  it started but.*
195e0 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66  * still short of
195f0 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20   its goal.  The 
19600 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20  following chart 
19610 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65  shows the allowe
19620 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73  d.** transitions
19630 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65   and the inserte
19640 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73  d intermediate s
19650 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  tates:.**.**    
19660 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52  UNLOCKED -> SHAR
19670 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20  ED.**    SHARED 
19680 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20  -> RESERVED.**  
19690 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e    SHARED -> (PEN
196a0 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49  DING) -> EXCLUSI
196b0 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45  VE.**    RESERVE
196c0 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d  D -> (PENDING) -
196d0 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  > EXCLUSIVE.**  
196e0 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43    PENDING -> EXC
196f0 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69  LUSIVE.**.** Thi
19700 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f  s routine will o
19710 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c  nly increase a l
19720 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71  ock.  Use the sq
19730 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a  lite3OsUnlock().
19740 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f  ** routine to lo
19750 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65  wer a locking le
19760 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  vel..*/.static i
19770 6e 74 20 61 66 70 4c 6f 63 6b 28 73 71 6c 69 74  nt afpLock(sqlit
19780 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
19790 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20 69   eFileLock){.  i
197a0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
197b0 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  K;.  unixFile *p
197c0 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
197d0 2a 29 69 64 3b 0a 20 20 75 6e 69 78 49 6e 6f 64  *)id;.  unixInod
197e0 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20  eInfo *pInode = 
197f0 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20  pFile->pInode;. 
19800 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65   afpLockingConte
19810 78 74 20 2a 63 6f 6e 74 65 78 74 20 3d 20 28 61  xt *context = (a
19820 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
19830 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69   *) pFile->locki
19840 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 0a 20 20  ngContext;.  .  
19850 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
19860 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43  .  OSTRACE(("LOC
19870 4b 20 20 20 20 25 64 20 25 73 20 77 61 73 20 25  K    %d %s was %
19880 73 28 25 73 2c 25 64 29 20 70 69 64 3d 25 64 20  s(%s,%d) pid=%d 
19890 28 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  (afp)\n", pFile-
198a0 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 61  >h,.           a
198b0 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c  zFileLock(eFileL
198c0 6f 63 6b 29 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b  ock), azFileLock
198d0 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63  (pFile->eFileLoc
198e0 6b 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 61  k),.           a
198f0 7a 46 69 6c 65 4c 6f 63 6b 28 70 49 6e 6f 64 65  zFileLock(pInode
19900 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 70 49  ->eFileLock), pI
19910 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 20 2c 20  node->nShared , 
19920 67 65 74 70 69 64 28 29 29 29 3b 0a 0a 20 20 2f  getpid()));..  /
19930 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6c  * If there is al
19940 72 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f 66 20  ready a lock of 
19950 74 68 69 73 20 74 79 70 65 20 6f 72 20 6d 6f 72  this type or mor
19960 65 20 72 65 73 74 72 69 63 74 69 76 65 20 6f 6e  e restrictive on
19970 20 74 68 65 0a 20 20 2a 2a 20 75 6e 69 78 46 69   the.  ** unixFi
19980 6c 65 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20  le, do nothing. 
19990 44 6f 6e 27 74 20 75 73 65 20 74 68 65 20 61 66  Don't use the af
199a0 70 5f 65 6e 64 5f 6c 6f 63 6b 3a 20 65 78 69 74  p_end_lock: exit
199b0 20 70 61 74 68 2c 20 61 73 0a 20 20 2a 2a 20 75   path, as.  ** u
199c0 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 20  nixEnterMutex() 
199d0 68 61 73 6e 27 74 20 62 65 65 6e 20 63 61 6c 6c  hasn't been call
199e0 65 64 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 69  ed yet..  */.  i
199f0 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  f( pFile->eFileL
19a00 6f 63 6b 3e 3d 65 46 69 6c 65 4c 6f 63 6b 20 29  ock>=eFileLock )
19a10 7b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22  {.    OSTRACE(("
19a20 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 6f 6b  LOCK    %d %s ok
19a30 20 28 61 6c 72 65 61 64 79 20 68 65 6c 64 29 20   (already held) 
19a40 28 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  (afp)\n", pFile-
19a50 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 61  >h,.           a
19a60 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c  zFileLock(eFileL
19a70 6f 63 6b 29 29 29 3b 0a 20 20 20 20 72 65 74 75  ock)));.    retu
19a80 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
19a90 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  }..  /* Make sur
19aa0 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 73 65  e the locking se
19ab0 71 75 65 6e 63 65 20 69 73 20 63 6f 72 72 65 63  quence is correc
19ac0 74 0a 20 20 2a 2a 20 20 28 31 29 20 57 65 20 6e  t.  **  (1) We n
19ad0 65 76 65 72 20 6d 6f 76 65 20 66 72 6f 6d 20 75  ever move from u
19ae0 6e 6c 6f 63 6b 65 64 20 74 6f 20 61 6e 79 74 68  nlocked to anyth
19af0 69 6e 67 20 68 69 67 68 65 72 20 74 68 61 6e 20  ing higher than 
19b00 73 68 61 72 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a  shared lock..  *
19b10 2a 20 20 28 32 29 20 53 51 4c 69 74 65 20 6e 65  *  (2) SQLite ne
19b20 76 65 72 20 65 78 70 6c 69 63 69 74 6c 79 20 72  ver explicitly r
19b30 65 71 75 65 73 74 73 20 61 20 70 65 6e 64 69 67  equests a pendig
19b40 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28 33 29   lock..  **  (3)
19b50 20 41 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 69   A shared lock i
19b60 73 20 61 6c 77 61 79 73 20 68 65 6c 64 20 77 68  s always held wh
19b70 65 6e 20 61 20 72 65 73 65 72 76 65 20 6c 6f 63  en a reserve loc
19b80 6b 20 69 73 20 72 65 71 75 65 73 74 65 64 2e 0a  k is requested..
19b90 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
19ba0 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21  File->eFileLock!
19bb0 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c  =NO_LOCK || eFil
19bc0 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
19bd0 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
19be0 65 46 69 6c 65 4c 6f 63 6b 21 3d 50 45 4e 44 49  eFileLock!=PENDI
19bf0 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  NG_LOCK );.  ass
19c00 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 21 3d  ert( eFileLock!=
19c10 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c  RESERVED_LOCK ||
19c20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
19c30 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k==SHARED_LOCK )
19c40 3b 0a 20 20 0a 20 20 2f 2a 20 54 68 69 73 20 6d  ;.  .  /* This m
19c50 75 74 65 78 20 69 73 20 6e 65 65 64 65 64 20 62  utex is needed b
19c60 65 63 61 75 73 65 20 70 46 69 6c 65 2d 3e 70 49  ecause pFile->pI
19c70 6e 6f 64 65 20 69 73 20 73 68 61 72 65 64 20 61  node is shared a
19c80 63 72 6f 73 73 20 74 68 72 65 61 64 73 0a 20 20  cross threads.  
19c90 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75  */.  unixEnterMu
19ca0 74 65 78 28 29 3b 0a 20 20 70 49 6e 6f 64 65 20  tex();.  pInode 
19cb0 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b  = pFile->pInode;
19cc0 0a 0a 20 20 2f 2a 20 49 66 20 73 6f 6d 65 20 74  ..  /* If some t
19cd0 68 72 65 61 64 20 75 73 69 6e 67 20 74 68 69 73  hread using this
19ce0 20 50 49 44 20 68 61 73 20 61 20 6c 6f 63 6b 20   PID has a lock 
19cf0 76 69 61 20 61 20 64 69 66 66 65 72 65 6e 74 20  via a different 
19d00 75 6e 69 78 46 69 6c 65 2a 0a 20 20 2a 2a 20 68  unixFile*.  ** h
19d10 61 6e 64 6c 65 20 74 68 61 74 20 70 72 65 63 6c  andle that precl
19d20 75 64 65 73 20 74 68 65 20 72 65 71 75 65 73 74  udes the request
19d30 65 64 20 6c 6f 63 6b 2c 20 72 65 74 75 72 6e 20  ed lock, return 
19d40 42 55 53 59 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  BUSY..  */.  if(
19d50 20 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f   (pFile->eFileLo
19d60 63 6b 21 3d 70 49 6e 6f 64 65 2d 3e 65 46 69 6c  ck!=pInode->eFil
19d70 65 4c 6f 63 6b 20 26 26 20 0a 20 20 20 20 20 20  eLock && .      
19d80 20 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c   (pInode->eFileL
19d90 6f 63 6b 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43  ock>=PENDING_LOC
19da0 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3e 53  K || eFileLock>S
19db0 48 41 52 45 44 5f 4c 4f 43 4b 29 29 0a 20 20 20  HARED_LOCK)).   
19dc0 20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51    ){.    rc = SQ
19dd0 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 67  LITE_BUSY;.    g
19de0 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b  oto afp_end_lock
19df0 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 49 66  ;.  }.  .  /* If
19e00 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69   a SHARED lock i
19e10 73 20 72 65 71 75 65 73 74 65 64 2c 20 61 6e 64  s requested, and
19e20 20 73 6f 6d 65 20 74 68 72 65 61 64 20 75 73 69   some thread usi
19e30 6e 67 20 74 68 69 73 20 50 49 44 20 61 6c 72 65  ng this PID alre
19e40 61 64 79 0a 20 20 2a 2a 20 68 61 73 20 61 20 53  ady.  ** has a S
19e50 48 41 52 45 44 20 6f 72 20 52 45 53 45 52 56 45  HARED or RESERVE
19e60 44 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 69 6e 63  D lock, then inc
19e70 72 65 6d 65 6e 74 20 72 65 66 65 72 65 6e 63 65  rement reference
19e80 20 63 6f 75 6e 74 73 20 61 6e 64 0a 20 20 2a 2a   counts and.  **
19e90 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
19ea0 4b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 46  K..  */.  if( eF
19eb0 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
19ec0 4c 4f 43 4b 20 26 26 20 0a 20 20 20 20 20 28 70  LOCK && .     (p
19ed0 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
19ee0 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c  ==SHARED_LOCK ||
19ef0 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f   pInode->eFileLo
19f00 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43  ck==RESERVED_LOC
19f10 4b 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  K) ){.    assert
19f20 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41  ( eFileLock==SHA
19f30 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  RED_LOCK );.    
19f40 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 65  assert( pFile->e
19f50 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20  FileLock==0 );. 
19f60 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64     assert( pInod
19f70 65 2d 3e 6e 53 68 61 72 65 64 3e 30 20 29 3b 0a  e->nShared>0 );.
19f80 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
19f90 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f  Lock = SHARED_LO
19fa0 43 4b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e  CK;.    pInode->
19fb0 6e 53 68 61 72 65 64 2b 2b 3b 0a 20 20 20 20 70  nShared++;.    p
19fc0 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a  Inode->nLock++;.
19fd0 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64      goto afp_end
19fe0 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 20 20 0a  _lock;.  }.    .
19ff0 20 20 2f 2a 20 41 20 50 45 4e 44 49 4e 47 20 6c    /* A PENDING l
1a000 6f 63 6b 20 69 73 20 6e 65 65 64 65 64 20 62 65  ock is needed be
1a010 66 6f 72 65 20 61 63 71 75 69 72 69 6e 67 20 61  fore acquiring a
1a020 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 61 6e 64   SHARED lock and
1a030 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20 61 63 71   before.  ** acq
1a040 75 69 72 69 6e 67 20 61 6e 20 45 58 43 4c 55 53  uiring an EXCLUS
1a050 49 56 45 20 6c 6f 63 6b 2e 20 20 46 6f 72 20 74  IVE lock.  For t
1a060 68 65 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20  he SHARED lock, 
1a070 74 68 65 20 50 45 4e 44 49 4e 47 20 77 69 6c 6c  the PENDING will
1a080 0a 20 20 2a 2a 20 62 65 20 72 65 6c 65 61 73 65  .  ** be release
1a090 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 46  d..  */.  if( eF
1a0a0 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
1a0b0 4c 4f 43 4b 20 0a 20 20 20 20 20 20 7c 7c 20 28  LOCK .      || (
1a0c0 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55  eFileLock==EXCLU
1a0d0 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70 46 69  SIVE_LOCK && pFi
1a0e0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 50 45  le->eFileLock<PE
1a0f0 4e 44 49 4e 47 5f 4c 4f 43 4b 29 0a 20 20 29 7b  NDING_LOCK).  ){
1a100 0a 20 20 20 20 69 6e 74 20 66 61 69 6c 65 64 3b  .    int failed;
1a110 0a 20 20 20 20 66 61 69 6c 65 64 20 3d 20 61 66  .    failed = af
1a120 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  pSetLock(context
1a130 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c  ->dbPath, pFile,
1a140 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 31   PENDING_BYTE, 1
1a150 2c 20 31 29 3b 0a 20 20 20 20 69 66 20 28 66 61  , 1);.    if (fa
1a160 69 6c 65 64 29 20 7b 0a 20 20 20 20 20 20 72 63  iled) {.      rc
1a170 20 3d 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20   = failed;.     
1a180 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f   goto afp_end_lo
1a190 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ck;.    }.  }.  
1a1a0 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c  .  /* If control
1a1b0 20 67 65 74 73 20 74 6f 20 74 68 69 73 20 70 6f   gets to this po
1a1c0 69 6e 74 2c 20 74 68 65 6e 20 61 63 74 75 61 6c  int, then actual
1a1d0 6c 79 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20  ly go ahead and 
1a1e0 6d 61 6b 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74  make.  ** operat
1a1f0 69 6e 67 20 73 79 73 74 65 6d 20 63 61 6c 6c 73  ing system calls
1a200 20 66 6f 72 20 74 68 65 20 73 70 65 63 69 66 69   for the specifi
1a210 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20  ed lock..  */.  
1a220 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  if( eFileLock==S
1a230 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  HARED_LOCK ){.  
1a240 20 20 69 6e 74 20 6c 72 63 31 2c 20 6c 72 63 32    int lrc1, lrc2
1a250 2c 20 6c 72 63 31 45 72 72 6e 6f 20 3d 20 30 3b  , lrc1Errno = 0;
1a260 0a 20 20 20 20 6c 6f 6e 67 20 6c 6b 2c 20 6d 61  .    long lk, ma
1a270 73 6b 3b 0a 20 20 20 20 0a 20 20 20 20 61 73 73  sk;.    .    ass
1a280 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68  ert( pInode->nSh
1a290 61 72 65 64 3d 3d 30 20 29 3b 0a 20 20 20 20 61  ared==0 );.    a
1a2a0 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 65  ssert( pInode->e
1a2b0 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20  FileLock==0 );. 
1a2c0 20 20 20 20 20 20 20 0a 20 20 20 20 6d 61 73 6b         .    mask
1a2d0 20 3d 20 28 73 69 7a 65 6f 66 28 6c 6f 6e 67 29   = (sizeof(long)
1a2e0 3d 3d 38 29 20 3f 20 4c 41 52 47 45 53 54 5f 49  ==8) ? LARGEST_I
1a2f0 4e 54 36 34 20 3a 20 30 78 37 66 66 66 66 66 66  NT64 : 0x7ffffff
1a300 66 3b 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 67 65  f;.    /* Now ge
1a310 74 20 74 68 65 20 72 65 61 64 2d 6c 6f 63 6b 20  t the read-lock 
1a320 53 48 41 52 45 44 5f 4c 4f 43 4b 20 2a 2f 0a 20  SHARED_LOCK */. 
1a330 20 20 20 2f 2a 20 6e 6f 74 65 20 74 68 61 74 20     /* note that 
1a340 74 68 65 20 71 75 61 6c 69 74 79 20 6f 66 20 74  the quality of t
1a350 68 65 20 72 61 6e 64 6f 6d 6e 65 73 73 20 64 6f  he randomness do
1a360 65 73 6e 27 74 20 6d 61 74 74 65 72 20 74 68 61  esn't matter tha
1a370 74 20 6d 75 63 68 20 2a 2f 0a 20 20 20 20 6c 6b  t much */.    lk
1a380 20 3d 20 72 61 6e 64 6f 6d 28 29 3b 20 0a 20 20   = random(); .  
1a390 20 20 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64    pInode->shared
1a3a0 42 79 74 65 20 3d 20 28 6c 6b 20 26 20 6d 61 73  Byte = (lk & mas
1a3b0 6b 29 25 28 53 48 41 52 45 44 5f 53 49 5a 45 20  k)%(SHARED_SIZE 
1a3c0 2d 20 31 29 3b 0a 20 20 20 20 6c 72 63 31 20 3d  - 1);.    lrc1 =
1a3d0 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74   afpSetLock(cont
1a3e0 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69  ext->dbPath, pFi
1a3f0 6c 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 53  le, .          S
1a400 48 41 52 45 44 5f 46 49 52 53 54 2b 70 49 6e 6f  HARED_FIRST+pIno
1a410 64 65 2d 3e 73 68 61 72 65 64 42 79 74 65 2c 20  de->sharedByte, 
1a420 31 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20 49  1, 1);.    if( I
1a430 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63  S_LOCK_ERROR(lrc
1a440 31 29 20 29 7b 0a 20 20 20 20 20 20 6c 72 63 31  1) ){.      lrc1
1a450 45 72 72 6e 6f 20 3d 20 70 46 69 6c 65 2d 3e 6c  Errno = pFile->l
1a460 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a  astErrno;.    }.
1a470 20 20 20 20 2f 2a 20 44 72 6f 70 20 74 68 65 20      /* Drop the 
1a480 74 65 6d 70 6f 72 61 72 79 20 50 45 4e 44 49 4e  temporary PENDIN
1a490 47 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c 72  G lock */.    lr
1a4a0 63 32 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28  c2 = afpSetLock(
1a4b0 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c  context->dbPath,
1a4c0 20 70 46 69 6c 65 2c 20 50 45 4e 44 49 4e 47 5f   pFile, PENDING_
1a4d0 42 59 54 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20  BYTE, 1, 0);.   
1a4e0 20 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43   .    if( IS_LOC
1a4f0 4b 5f 45 52 52 4f 52 28 6c 72 63 31 29 20 29 20  K_ERROR(lrc1) ) 
1a500 7b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73  {.      storeLas
1a510 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 6c 72  tErrno(pFile, lr
1a520 63 31 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20  c1Errno);.      
1a530 72 63 20 3d 20 6c 72 63 31 3b 0a 20 20 20 20 20  rc = lrc1;.     
1a540 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f   goto afp_end_lo
1a550 63 6b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69  ck;.    } else i
1a560 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
1a570 28 6c 72 63 32 29 20 29 7b 0a 20 20 20 20 20 20  (lrc2) ){.      
1a580 72 63 20 3d 20 6c 72 63 32 3b 0a 20 20 20 20 20  rc = lrc2;.     
1a590 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f   goto afp_end_lo
1a5a0 63 6b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69  ck;.    } else i
1a5b0 66 28 20 6c 72 63 31 20 21 3d 20 53 51 4c 49 54  f( lrc1 != SQLIT
1a5c0 45 5f 4f 4b 20 29 20 7b 0a 20 20 20 20 20 20 72  E_OK ) {.      r
1a5d0 63 20 3d 20 6c 72 63 31 3b 0a 20 20 20 20 7d 20  c = lrc1;.    } 
1a5e0 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 70 46 69  else {.      pFi
1a5f0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
1a600 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20  SHARED_LOCK;.   
1a610 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b     pInode->nLock
1a620 2b 2b 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65  ++;.      pInode
1a630 2d 3e 6e 53 68 61 72 65 64 20 3d 20 31 3b 0a 20  ->nShared = 1;. 
1a640 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
1a650 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c   eFileLock==EXCL
1a660 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70 49  USIVE_LOCK && pI
1a670 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 31 20  node->nShared>1 
1a680 29 7b 0a 20 20 20 20 2f 2a 20 57 65 20 61 72 65  ){.    /* We are
1a690 20 74 72 79 69 6e 67 20 66 6f 72 20 61 6e 20 65   trying for an e
1a6a0 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 62 75  xclusive lock bu
1a6b0 74 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64  t another thread
1a6c0 20 69 6e 20 74 68 69 73 0a 20 20 20 20 20 2a 2a   in this.     **
1a6d0 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20 69 73   same process is
1a6e0 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61   still holding a
1a6f0 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f   shared lock. */
1a700 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
1a710 5f 42 55 53 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a  _BUSY;.  }else{.
1a720 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65      /* The reque
1a730 73 74 20 77 61 73 20 66 6f 72 20 61 20 52 45 53  st was for a RES
1a740 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49  ERVED or EXCLUSI
1a750 56 45 20 6c 6f 63 6b 2e 20 20 49 74 20 69 73 0a  VE lock.  It is.
1a760 20 20 20 20 2a 2a 20 61 73 73 75 6d 65 64 20 74      ** assumed t
1a770 68 61 74 20 74 68 65 72 65 20 69 73 20 61 20 53  hat there is a S
1a780 48 41 52 45 44 20 6f 72 20 67 72 65 61 74 65 72  HARED or greater
1a790 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c   lock on the fil
1a7a0 65 0a 20 20 20 20 2a 2a 20 61 6c 72 65 61 64 79  e.    ** already
1a7b0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74  ..    */.    int
1a7c0 20 66 61 69 6c 65 64 20 3d 20 30 3b 0a 20 20 20   failed = 0;.   
1a7d0 20 61 73 73 65 72 74 28 20 30 21 3d 70 46 69 6c   assert( 0!=pFil
1a7e0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a  e->eFileLock );.
1a7f0 20 20 20 20 69 66 20 28 65 46 69 6c 65 4c 6f 63      if (eFileLoc
1a800 6b 20 3e 3d 20 52 45 53 45 52 56 45 44 5f 4c 4f  k >= RESERVED_LO
1a810 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69  CK && pFile->eFi
1a820 6c 65 4c 6f 63 6b 20 3c 20 52 45 53 45 52 56 45  leLock < RESERVE
1a830 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 20 20  D_LOCK) {.      
1a840 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61 20 52    /* Acquire a R
1a850 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 2a 2f 0a  ESERVED lock */.
1a860 20 20 20 20 20 20 20 20 66 61 69 6c 65 64 20 3d          failed =
1a870 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74   afpSetLock(cont
1a880 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69  ext->dbPath, pFi
1a890 6c 65 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54  le, RESERVED_BYT
1a8a0 45 2c 20 31 2c 31 29 3b 0a 20 20 20 20 20 20 69  E, 1,1);.      i
1a8b0 66 28 20 21 66 61 69 6c 65 64 20 29 7b 0a 20 20  f( !failed ){.  
1a8c0 20 20 20 20 20 20 63 6f 6e 74 65 78 74 2d 3e 72        context->r
1a8d0 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 20  eserved = 1;.   
1a8e0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
1a8f0 66 20 28 21 66 61 69 6c 65 64 20 26 26 20 65 46  f (!failed && eF
1a900 69 6c 65 4c 6f 63 6b 20 3d 3d 20 45 58 43 4c 55  ileLock == EXCLU
1a910 53 49 56 45 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20  SIVE_LOCK) {.   
1a920 20 20 20 2f 2a 20 41 63 71 75 69 72 65 20 61 6e     /* Acquire an
1a930 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
1a940 2a 2f 0a 20 20 20 20 20 20 20 20 0a 20 20 20 20  */.        .    
1a950 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20    /* Remove the 
1a960 73 68 61 72 65 64 20 6c 6f 63 6b 20 62 65 66 6f  shared lock befo
1a970 72 65 20 74 72 79 69 6e 67 20 74 68 65 20 72 61  re trying the ra
1a980 6e 67 65 2e 20 20 77 65 27 6c 6c 20 6e 65 65 64  nge.  we'll need
1a990 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a 20 72 65   to .      ** re
1a9a0 65 73 74 61 62 6c 69 73 68 20 74 68 65 20 73 68  establish the sh
1a9b0 61 72 65 64 20 6c 6f 63 6b 20 69 66 20 77 65 20  ared lock if we 
1a9c0 63 61 6e 27 74 20 67 65 74 20 74 68 65 20 20 61  can't get the  a
1a9d0 66 70 55 6e 6c 6f 63 6b 0a 20 20 20 20 20 20 2a  fpUnlock.      *
1a9e0 2f 0a 20 20 20 20 20 20 69 66 28 20 21 28 66 61  /.      if( !(fa
1a9f0 69 6c 65 64 20 3d 20 61 66 70 53 65 74 4c 6f 63  iled = afpSetLoc
1aa00 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74  k(context->dbPat
1aa10 68 2c 20 70 46 69 6c 65 2c 20 53 48 41 52 45 44  h, pFile, SHARED
1aa20 5f 46 49 52 53 54 20 2b 0a 20 20 20 20 20 20 20  _FIRST +.       
1aa30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aa40 20 20 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64    pInode->shared
1aa50 42 79 74 65 2c 20 31 2c 20 30 29 29 20 29 7b 0a  Byte, 1, 0)) ){.
1aa60 20 20 20 20 20 20 20 20 69 6e 74 20 66 61 69 6c          int fail
1aa70 65 64 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  ed2 = SQLITE_OK;
1aa80 0a 20 20 20 20 20 20 20 20 2f 2a 20 6e 6f 77 20  .        /* now 
1aa90 61 74 74 65 6d 6d 70 74 20 74 6f 20 67 65 74 20  attemmpt to get 
1aaa0 74 68 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f  the exclusive lo
1aab0 63 6b 20 72 61 6e 67 65 20 2a 2f 0a 20 20 20 20  ck range */.    
1aac0 20 20 20 20 66 61 69 6c 65 64 20 3d 20 61 66 70      failed = afp
1aad0 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d  SetLock(context-
1aae0 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20  >dbPath, pFile, 
1aaf0 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20 0a 20  SHARED_FIRST, . 
1ab00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ab10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 48                SH
1ab20 41 52 45 44 5f 53 49 5a 45 2c 20 31 29 3b 0a 20  ARED_SIZE, 1);. 
1ab30 20 20 20 20 20 20 20 69 66 28 20 66 61 69 6c 65         if( faile
1ab40 64 20 26 26 20 28 66 61 69 6c 65 64 32 20 3d 20  d && (failed2 = 
1ab50 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  afpSetLock(conte
1ab60 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  xt->dbPath, pFil
1ab70 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  e, .            
1ab80 20 20 20 20 20 20 20 20 20 20 20 53 48 41 52 45             SHARE
1ab90 44 5f 46 49 52 53 54 20 2b 20 70 49 6e 6f 64 65  D_FIRST + pInode
1aba0 2d 3e 73 68 61 72 65 64 42 79 74 65 2c 20 31 2c  ->sharedByte, 1,
1abb0 20 31 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20   1)) ){.        
1abc0 20 20 2f 2a 20 43 61 6e 27 74 20 72 65 65 73 74    /* Can't reest
1abd0 61 62 6c 69 73 68 20 74 68 65 20 73 68 61 72 65  ablish the share
1abe0 64 20 6c 6f 63 6b 2e 20 20 53 71 6c 69 74 65 20  d lock.  Sqlite 
1abf0 63 61 6e 27 74 20 64 65 61 6c 2c 20 74 68 69 73  can't deal, this
1ac00 20 69 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   is.          **
1ac10 20 61 20 63 72 69 74 69 63 61 6c 20 49 2f 4f 20   a critical I/O 
1ac20 65 72 72 6f 72 0a 20 20 20 20 20 20 20 20 20 20  error.          
1ac30 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  */.          rc 
1ac40 3d 20 28 28 66 61 69 6c 65 64 20 26 20 53 51 4c  = ((failed & SQL
1ac50 49 54 45 5f 49 4f 45 52 52 29 20 3d 3d 20 53 51  ITE_IOERR) == SQ
1ac60 4c 49 54 45 5f 49 4f 45 52 52 29 20 3f 20 66 61  LITE_IOERR) ? fa
1ac70 69 6c 65 64 32 20 3a 20 0a 20 20 20 20 20 20 20  iled2 : .       
1ac80 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49          SQLITE_I
1ac90 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20  OERR_LOCK;.     
1aca0 20 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e       goto afp_en
1acb0 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20  d_lock;.        
1acc0 7d 20 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  } .      }else{.
1acd0 20 20 20 20 20 20 20 20 72 63 20 3d 20 66 61 69          rc = fai
1ace0 6c 65 64 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20  led; .      }.  
1acf0 20 20 7d 0a 20 20 20 20 69 66 28 20 66 61 69 6c    }.    if( fail
1ad00 65 64 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ed ){.      rc =
1ad10 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20   failed;.    }. 
1ad20 20 7d 0a 20 20 0a 20 20 69 66 28 20 72 63 3d 3d   }.  .  if( rc==
1ad30 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1ad40 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
1ad50 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20  k = eFileLock;. 
1ad60 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65     pInode->eFile
1ad70 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b  Lock = eFileLock
1ad80 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65 46  ;.  }else if( eF
1ad90 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ileLock==EXCLUSI
1ada0 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70  VE_LOCK ){.    p
1adb0 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
1adc0 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a  = PENDING_LOCK;.
1add0 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c      pInode->eFil
1ade0 65 4c 6f 63 6b 20 3d 20 50 45 4e 44 49 4e 47 5f  eLock = PENDING_
1adf0 4c 4f 43 4b 3b 0a 20 20 7d 0a 20 20 0a 61 66 70  LOCK;.  }.  .afp
1ae00 5f 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 75 6e 69  _end_lock:.  uni
1ae10 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20  xLeaveMutex();. 
1ae20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20   OSTRACE(("LOCK 
1ae30 20 20 20 25 64 20 25 73 20 25 73 20 28 61 66 70     %d %s %s (afp
1ae40 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
1ae50 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65  azFileLock(eFile
1ae60 4c 6f 63 6b 29 2c 20 0a 20 20 20 20 20 20 20 20  Lock), .        
1ae70 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f   rc==SQLITE_OK ?
1ae80 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22   "ok" : "failed"
1ae90 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ));.  return rc;
1aea0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20  .}../*.** Lower 
1aeb0 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
1aec0 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69  l on file descri
1aed0 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46  ptor pFile to eF
1aee0 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c  ileLock.  eFileL
1aef0 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65  ock.** must be e
1af00 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72  ither NO_LOCK or
1af10 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a   SHARED_LOCK..**
1af20 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69  .** If the locki
1af30 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20  ng level of the 
1af40 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
1af50 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72  is already at or
1af60 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65   below.** the re
1af70 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20  quested locking 
1af80 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74  level, this rout
1af90 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
1afa0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66  */.static int af
1afb0 70 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  pUnlock(sqlite3_
1afc0 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46  file *id, int eF
1afd0 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 69 6e 74  ileLock) {.  int
1afe0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1aff0 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
1b000 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
1b010 69 64 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49  id;.  unixInodeI
1b020 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a 20 20 61  nfo *pInode;.  a
1b030 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
1b040 20 2a 63 6f 6e 74 65 78 74 20 3d 20 28 61 66 70   *context = (afp
1b050 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
1b060 29 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  ) pFile->locking
1b070 43 6f 6e 74 65 78 74 3b 0a 20 20 69 6e 74 20 73  Context;.  int s
1b080 6b 69 70 53 68 61 72 65 64 20 3d 20 30 3b 0a 23  kipShared = 0;.#
1b090 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
1b0a0 54 0a 20 20 69 6e 74 20 68 20 3d 20 70 46 69 6c  T.  int h = pFil
1b0b0 65 2d 3e 68 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  e->h;.#endif..  
1b0c0 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
1b0d0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4c  .  OSTRACE(("UNL
1b0e0 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73 20 25  OCK  %d %d was %
1b0f0 64 28 25 64 2c 25 64 29 20 70 69 64 3d 25 64 20  d(%d,%d) pid=%d 
1b100 28 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  (afp)\n", pFile-
1b110 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20  >h, eFileLock,. 
1b120 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
1b130 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c  >eFileLock, pFil
1b140 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65  e->pInode->eFile
1b150 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e 70 49 6e  Lock, pFile->pIn
1b160 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2c 0a 20 20  ode->nShared,.  
1b170 20 20 20 20 20 20 20 20 20 67 65 74 70 69 64 28           getpid(
1b180 29 29 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  )));..  assert( 
1b190 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45  eFileLock<=SHARE
1b1a0 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20  D_LOCK );.  if( 
1b1b0 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
1b1c0 3c 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20  <=eFileLock ){. 
1b1d0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1b1e0 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 45  _OK;.  }.  unixE
1b1f0 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 70  nterMutex();.  p
1b200 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70  Inode = pFile->p
1b210 49 6e 6f 64 65 3b 0a 20 20 61 73 73 65 72 74 28  Inode;.  assert(
1b220 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
1b230 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 46 69  !=0 );.  if( pFi
1b240 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48  le->eFileLock>SH
1b250 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
1b260 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d   assert( pInode-
1b270 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 70 46 69 6c  >eFileLock==pFil
1b280 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a  e->eFileLock );.
1b290 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72      SimulateIOEr
1b2a0 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20  rorBenign(1);.  
1b2b0 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
1b2c0 72 28 20 68 3d 28 2d 31 29 20 29 0a 20 20 20 20  r( h=(-1) ).    
1b2d0 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42  SimulateIOErrorB
1b2e0 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 0a 23  enign(0);.    .#
1b2f0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
1b300 55 47 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 72  UG.    /* When r
1b310 65 64 75 63 69 6e 67 20 61 20 6c 6f 63 6b 20 73  educing a lock s
1b320 75 63 68 20 74 68 61 74 20 6f 74 68 65 72 20 70  uch that other p
1b330 72 6f 63 65 73 73 65 73 20 63 61 6e 20 73 74 61  rocesses can sta
1b340 72 74 0a 20 20 20 20 2a 2a 20 72 65 61 64 69 6e  rt.    ** readin
1b350 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  g the database f
1b360 69 6c 65 20 61 67 61 69 6e 2c 20 6d 61 6b 65 20  ile again, make 
1b370 73 75 72 65 20 74 68 61 74 20 74 68 65 0a 20 20  sure that the.  
1b380 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
1b390 20 63 6f 75 6e 74 65 72 20 77 61 73 20 75 70 64   counter was upd
1b3a0 61 74 65 64 20 69 66 20 61 6e 79 20 70 61 72 74  ated if any part
1b3b0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1b3c0 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 63 68 61  .    ** file cha
1b3d0 6e 67 65 64 2e 20 20 49 66 20 74 68 65 20 74 72  nged.  If the tr
1b3e0 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65  ansaction counte
1b3f0 72 20 69 73 20 6e 6f 74 20 75 70 64 61 74 65 64  r is not updated
1b400 2c 0a 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 63  ,.    ** other c
1b410 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 6f 20 74 68  onnections to th
1b420 65 20 73 61 6d 65 20 66 69 6c 65 20 6d 69 67 68  e same file migh
1b430 74 20 6e 6f 74 20 72 65 61 6c 69 7a 65 20 74 68  t not realize th
1b440 61 74 0a 20 20 20 20 2a 2a 20 74 68 65 20 66 69  at.    ** the fi
1b450 6c 65 20 68 61 73 20 63 68 61 6e 67 65 64 20 61  le has changed a
1b460 6e 64 20 68 65 6e 63 65 20 6d 69 67 68 74 20 6e  nd hence might n
1b470 6f 74 20 6b 6e 6f 77 20 74 6f 20 66 6c 75 73 68  ot know to flush
1b480 20 74 68 65 69 72 0a 20 20 20 20 2a 2a 20 63 61   their.    ** ca
1b490 63 68 65 2e 20 20 54 68 65 20 75 73 65 20 6f 66  che.  The use of
1b4a0 20 61 20 73 74 61 6c 65 20 63 61 63 68 65 20 63   a stale cache c
1b4b0 61 6e 20 6c 65 61 64 20 74 6f 20 64 61 74 61 62  an lead to datab
1b4c0 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a  ase corruption..
1b4d0 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
1b4e0 74 28 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d  t( pFile->inNorm
1b4f0 61 6c 57 72 69 74 65 3d 3d 30 0a 20 20 20 20 20  alWrite==0.     
1b500 20 20 20 20 20 20 7c 7c 20 70 46 69 6c 65 2d 3e        || pFile->
1b510 64 62 55 70 64 61 74 65 3d 3d 30 0a 20 20 20 20  dbUpdate==0.    
1b520 20 20 20 20 20 20 20 7c 7c 20 70 46 69 6c 65 2d         || pFile-
1b530 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 3d 3d  >transCntrChng==
1b540 31 20 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  1 );.    pFile->
1b550 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 3d 20  inNormalWrite = 
1b560 30 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 0a 20  0;.#endif.    . 
1b570 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46     if( pFile->eF
1b580 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ileLock==EXCLUSI
1b590 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20  VE_LOCK ){.     
1b5a0 20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b   rc = afpSetLock
1b5b0 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68  (context->dbPath
1b5c0 2c 20 70 46 69 6c 65 2c 20 53 48 41 52 45 44 5f  , pFile, SHARED_
1b5d0 46 49 52 53 54 2c 20 53 48 41 52 45 44 5f 53 49  FIRST, SHARED_SI
1b5e0 5a 45 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  ZE, 0);.      if
1b5f0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1b600 26 26 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  && (eFileLock==S
1b610 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49  HARED_LOCK || pI
1b620 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 31 29  node->nShared>1)
1b630 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 6f   ){.        /* o
1b640 6e 6c 79 20 72 65 2d 65 73 74 61 62 6c 69 73 68  nly re-establish
1b650 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b   the shared lock
1b660 20 69 66 20 6e 65 63 65 73 73 61 72 79 20 2a 2f   if necessary */
1b670 0a 20 20 20 20 20 20 20 20 69 6e 74 20 73 68 61  .        int sha
1b680 72 65 64 4c 6f 63 6b 42 79 74 65 20 3d 20 53 48  redLockByte = SH
1b690 41 52 45 44 5f 46 49 52 53 54 2b 70 49 6e 6f 64  ARED_FIRST+pInod
1b6a0 65 2d 3e 73 68 61 72 65 64 42 79 74 65 3b 0a 20  e->sharedByte;. 
1b6b0 20 20 20 20 20 20 20 72 63 20 3d 20 61 66 70 53         rc = afpS
1b6c0 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
1b6d0 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 73  dbPath, pFile, s
1b6e0 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 31  haredLockByte, 1
1b6f0 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 20 65 6c  , 1);.      } el
1b700 73 65 20 7b 0a 20 20 20 20 20 20 20 20 73 6b 69  se {.        ski
1b710 70 53 68 61 72 65 64 20 3d 20 31 3b 0a 20 20 20  pShared = 1;.   
1b720 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
1b730 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1b740 20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65   && pFile->eFile
1b750 4c 6f 63 6b 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f  Lock>=PENDING_LO
1b760 43 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  CK ){.      rc =
1b770 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74   afpSetLock(cont
1b780 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69  ext->dbPath, pFi
1b790 6c 65 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  le, PENDING_BYTE
1b7a0 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d 20 0a  , 1, 0);.    } .
1b7b0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1b7c0 54 45 5f 4f 4b 20 26 26 20 70 46 69 6c 65 2d 3e  TE_OK && pFile->
1b7d0 65 46 69 6c 65 4c 6f 63 6b 3e 3d 52 45 53 45 52  eFileLock>=RESER
1b7e0 56 45 44 5f 4c 4f 43 4b 20 26 26 20 63 6f 6e 74  VED_LOCK && cont
1b7f0 65 78 74 2d 3e 72 65 73 65 72 76 65 64 20 29 7b  ext->reserved ){
1b800 0a 20 20 20 20 20 20 72 63 20 3d 20 61 66 70 53  .      rc = afpS
1b810 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
1b820 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 52  dbPath, pFile, R
1b830 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 31 2c  ESERVED_BYTE, 1,
1b840 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21   0);.      if( !
1b850 72 63 20 29 7b 20 0a 20 20 20 20 20 20 20 20 63  rc ){ .        c
1b860 6f 6e 74 65 78 74 2d 3e 72 65 73 65 72 76 65 64  ontext->reserved
1b870 20 3d 20 30 3b 20 0a 20 20 20 20 20 20 7d 0a 20   = 0; .      }. 
1b880 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
1b890 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 65  =SQLITE_OK && (e
1b8a0 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
1b8b0 5f 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d  _LOCK || pInode-
1b8c0 3e 6e 53 68 61 72 65 64 3e 31 29 29 7b 0a 20 20  >nShared>1)){.  
1b8d0 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c      pInode->eFil
1b8e0 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c  eLock = SHARED_L
1b8f0 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  OCK;.    }.  }. 
1b900 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1b910 4f 4b 20 26 26 20 65 46 69 6c 65 4c 6f 63 6b 3d  OK && eFileLock=
1b920 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 0a 20 20 20  =NO_LOCK ){..   
1b930 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68   /* Decrement th
1b940 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 63 6f  e shared lock co
1b950 75 6e 74 65 72 2e 20 20 52 65 6c 65 61 73 65 20  unter.  Release 
1b960 74 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20 61  the lock using a
1b970 6e 0a 20 20 20 20 2a 2a 20 4f 53 20 63 61 6c 6c  n.    ** OS call
1b980 20 6f 6e 6c 79 20 77 68 65 6e 20 61 6c 6c 20 74   only when all t
1b990 68 72 65 61 64 73 20 69 6e 20 74 68 69 73 20 73  hreads in this s
1b9a0 61 6d 65 20 70 72 6f 63 65 73 73 20 68 61 76 65  ame process have
1b9b0 20 72 65 6c 65 61 73 65 64 0a 20 20 20 20 2a 2a   released.    **
1b9c0 20 74 68 65 20 6c 6f 63 6b 2e 0a 20 20 20 20 2a   the lock..    *
1b9d0 2f 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 6c  /.    unsigned l
1b9e0 6f 6e 67 20 6c 6f 6e 67 20 73 68 61 72 65 64 4c  ong long sharedL
1b9f0 6f 63 6b 42 79 74 65 20 3d 20 53 48 41 52 45 44  ockByte = SHARED
1ba00 5f 46 49 52 53 54 2b 70 49 6e 6f 64 65 2d 3e 73  _FIRST+pInode->s
1ba10 68 61 72 65 64 42 79 74 65 3b 0a 20 20 20 20 70  haredByte;.    p
1ba20 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2d 2d  Inode->nShared--
1ba30 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65  ;.    if( pInode
1ba40 2d 3e 6e 53 68 61 72 65 64 3d 3d 30 20 29 7b 0a  ->nShared==0 ){.
1ba50 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f        SimulateIO
1ba60 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a  ErrorBenign(1);.
1ba70 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f        SimulateIO
1ba80 45 72 72 6f 72 28 20 68 3d 28 2d 31 29 20 29 0a  Error( h=(-1) ).
1ba90 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f        SimulateIO
1baa0 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a  ErrorBenign(0);.
1bab0 20 20 20 20 20 20 69 66 28 20 21 73 6b 69 70 53        if( !skipS
1bac0 68 61 72 65 64 20 29 7b 0a 20 20 20 20 20 20 20  hared ){.       
1bad0 20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b   rc = afpSetLock
1bae0 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68  (context->dbPath
1baf0 2c 20 70 46 69 6c 65 2c 20 73 68 61 72 65 64 4c  , pFile, sharedL
1bb00 6f 63 6b 42 79 74 65 2c 20 31 2c 20 30 29 3b 0a  ockByte, 1, 0);.
1bb10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
1bb20 28 20 21 72 63 20 29 7b 0a 20 20 20 20 20 20 20  ( !rc ){.       
1bb30 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f   pInode->eFileLo
1bb40 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20  ck = NO_LOCK;.  
1bb50 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69        pFile->eFi
1bb60 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b  leLock = NO_LOCK
1bb70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1bb80 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1bb90 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
1bba0 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2d 2d 3b 0a  Inode->nLock--;.
1bbb0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
1bbc0 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e 3d 30 20 29  node->nLock>=0 )
1bbd0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e 6f  ;.      if( pIno
1bbe0 64 65 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20 29 7b 0a  de->nLock==0 ){.
1bbf0 20 20 20 20 20 20 20 20 63 6c 6f 73 65 50 65 6e          closePen
1bc00 64 69 6e 67 46 64 73 28 70 46 69 6c 65 29 3b 0a  dingFds(pFile);.
1bc10 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1bc20 7d 0a 20 20 0a 20 20 75 6e 69 78 4c 65 61 76 65  }.  .  unixLeave
1bc30 4d 75 74 65 78 28 29 3b 0a 20 20 69 66 28 20 72  Mutex();.  if( r
1bc40 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70  c==SQLITE_OK ) p
1bc50 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
1bc60 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 72  = eFileLock;.  r
1bc70 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1bc80 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 20  ** Close a file 
1bc90 26 20 63 6c 65 61 6e 75 70 20 41 46 50 20 73 70  & cleanup AFP sp
1bca0 65 63 69 66 69 63 20 6c 6f 63 6b 69 6e 67 20 63  ecific locking c
1bcb0 6f 6e 74 65 78 74 20 0a 2a 2f 0a 73 74 61 74 69  ontext .*/.stati
1bcc0 63 20 69 6e 74 20 61 66 70 43 6c 6f 73 65 28 73  c int afpClose(s
1bcd0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29  qlite3_file *id)
1bce0 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51   {.  int rc = SQ
1bcf0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 69  LITE_OK;.  if( i
1bd00 64 20 29 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c  d ){.    unixFil
1bd10 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
1bd20 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20 61 66  File*)id;.    af
1bd30 70 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c  pUnlock(id, NO_L
1bd40 4f 43 4b 29 3b 0a 20 20 20 20 75 6e 69 78 45 6e  OCK);.    unixEn
1bd50 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20  terMutex();.    
1bd60 69 66 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  if( pFile->pInod
1bd70 65 20 26 26 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  e && pFile->pIno
1bd80 64 65 2d 3e 6e 4c 6f 63 6b 20 29 7b 0a 20 20 20  de->nLock ){.   
1bd90 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61     /* If there a
1bda0 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c  re outstanding l
1bdb0 6f 63 6b 73 2c 20 64 6f 20 6e 6f 74 20 61 63 74  ocks, do not act
1bdc0 75 61 6c 6c 79 20 63 6c 6f 73 65 20 74 68 65 20  ually close the 
1bdd0 66 69 6c 65 20 6a 75 73 74 0a 20 20 20 20 20 20  file just.      
1bde0 2a 2a 20 79 65 74 20 62 65 63 61 75 73 65 20 74  ** yet because t
1bdf0 68 61 74 20 77 6f 75 6c 64 20 63 6c 65 61 72 20  hat would clear 
1be00 74 68 6f 73 65 20 6c 6f 63 6b 73 2e 20 20 49 6e  those locks.  In
1be10 73 74 65 61 64 2c 20 61 64 64 20 74 68 65 20 66  stead, add the f
1be20 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 64 65 73  ile.      ** des
1be30 63 72 69 70 74 6f 72 20 74 6f 20 70 49 6e 6f 64  criptor to pInod
1be40 65 2d 3e 61 50 65 6e 64 69 6e 67 2e 20 20 49 74  e->aPending.  It
1be50 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74   will be automat
1be60 69 63 61 6c 6c 79 20 63 6c 6f 73 65 64 20 77 68  ically closed wh
1be70 65 6e 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  en.      ** the 
1be80 6c 61 73 74 20 6c 6f 63 6b 20 69 73 20 63 6c 65  last lock is cle
1be90 61 72 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ared..      */. 
1bea0 20 20 20 20 20 73 65 74 50 65 6e 64 69 6e 67 46       setPendingF
1beb0 64 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a  d(pFile);.    }.
1bec0 20 20 20 20 72 65 6c 65 61 73 65 49 6e 6f 64 65      releaseInode
1bed0 49 6e 66 6f 28 70 46 69 6c 65 29 3b 0a 20 20 20  Info(pFile);.   
1bee0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 46   sqlite3_free(pF
1bef0 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
1bf00 65 78 74 29 3b 0a 20 20 20 20 72 63 20 3d 20 63  ext);.    rc = c
1bf10 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29  loseUnixFile(id)
1bf20 3b 0a 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d  ;.    unixLeaveM
1bf30 75 74 65 78 28 29 3b 0a 20 20 7d 0a 20 20 72 65  utex();.  }.  re
1bf40 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6e 64  turn rc;.}..#end
1bf50 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f  if /* defined(__
1bf60 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49  APPLE__) && SQLI
1bf70 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
1bf80 47 5f 53 54 59 4c 45 20 2a 2f 0a 2f 2a 0a 2a 2a  G_STYLE */./*.**
1bf90 20 54 68 65 20 63 6f 64 65 20 61 62 6f 76 65 20   The code above 
1bfa0 69 73 20 74 68 65 20 41 46 50 20 6c 6f 63 6b 20  is the AFP lock 
1bfb0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 20  implementation. 
1bfc0 20 54 68 65 20 63 6f 64 65 20 69 73 20 73 70 65   The code is spe
1bfd0 63 69 66 69 63 0a 2a 2a 20 74 6f 20 4d 61 63 4f  cific.** to MacO
1bfe0 53 58 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20  SX and does not 
1bff0 77 6f 72 6b 20 6f 6e 20 6f 74 68 65 72 20 75 6e  work on other un
1c000 69 78 20 70 6c 61 74 66 6f 72 6d 73 2e 20 20 4e  ix platforms.  N
1c010 6f 20 61 6c 74 65 72 6e 61 74 69 76 65 0a 2a 2a  o alternative.**
1c020 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 20 20   is available.  
1c030 49 66 20 79 6f 75 20 64 6f 6e 27 74 20 63 6f 6d  If you don't com
1c040 70 69 6c 65 20 66 6f 72 20 61 20 6d 61 63 2c 20  pile for a mac, 
1c050 74 68 65 6e 20 74 68 65 20 22 75 6e 69 78 2d 61  then the "unix-a
1c060 66 70 22 0a 2a 2a 20 56 46 53 20 69 73 20 6e 6f  fp".** VFS is no
1c070 74 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a  t available..**.
1c080 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c090 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65  ***** End of the
1c0a0 20 41 46 50 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d   AFP lock implem
1c0b0 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a  entation *******
1c0c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
1c0d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c0e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c0f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c100 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c110 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
1c120 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
1c130 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c140 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c150 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c160 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c170 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
1c180 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67  ************ Beg
1c190 69 6e 20 4e 46 53 20 4c 6f 63 6b 69 6e 67 20 2a  in NFS Locking *
1c1a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c1b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
1c1c0 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  ..#if defined(__
1c1d0 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49  APPLE__) && SQLI
1c1e0 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
1c1f0 47 5f 53 54 59 4c 45 0a 2f 2a 0a 20 2a 2a 20 4c  G_STYLE./*. ** L
1c200 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67  ower the locking
1c210 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64   level on file d
1c220 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20  escriptor pFile 
1c230 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65  to eFileLock.  e
1c240 46 69 6c 65 4c 6f 63 6b 0a 20 2a 2a 20 6d 75 73  FileLock. ** mus
1c250 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c  t be either NO_L
1c260 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f  OCK or SHARED_LO
1c270 43 4b 2e 0a 20 2a 2a 0a 20 2a 2a 20 49 66 20 74  CK.. **. ** If t
1c280 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
1c290 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73   of the file des
1c2a0 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61  criptor is alrea
1c2b0 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 20  dy at or below. 
1c2c0 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ** the requested
1c2d0 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20   locking level, 
1c2e0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
1c2f0 61 20 6e 6f 2d 6f 70 2e 0a 20 2a 2f 0a 73 74 61  a no-op.. */.sta
1c300 74 69 63 20 69 6e 74 20 6e 66 73 55 6e 6c 6f 63  tic int nfsUnloc
1c310 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
1c320 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63  id, int eFileLoc
1c330 6b 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 6f 73  k){.  return pos
1c340 69 78 55 6e 6c 6f 63 6b 28 69 64 2c 20 65 46 69  ixUnlock(id, eFi
1c350 6c 65 4c 6f 63 6b 2c 20 31 29 3b 0a 7d 0a 0a 23  leLock, 1);.}..#
1c360 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64  endif /* defined
1c370 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53  (__APPLE__) && S
1c380 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
1c390 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 2f 2a  KING_STYLE */./*
1c3a0 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 61 62 6f  .** The code abo
1c3b0 76 65 20 69 73 20 74 68 65 20 4e 46 53 20 6c 6f  ve is the NFS lo
1c3c0 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ck implementatio
1c3d0 6e 2e 20 20 54 68 65 20 63 6f 64 65 20 69 73 20  n.  The code is 
1c3e0 73 70 65 63 69 66 69 63 0a 2a 2a 20 74 6f 20 4d  specific.** to M
1c3f0 61 63 4f 53 58 20 61 6e 64 20 64 6f 65 73 20 6e  acOSX and does n
1c400 6f 74 20 77 6f 72 6b 20 6f 6e 20 6f 74 68 65 72  ot work on other
1c410 20 75 6e 69 78 20 70 6c 61 74 66 6f 72 6d 73 2e   unix platforms.
1c420 20 20 4e 6f 20 61 6c 74 65 72 6e 61 74 69 76 65    No alternative
1c430 0a 2a 2a 20 69 73 20 61 76 61 69 6c 61 62 6c 65  .** is available
1c440 2e 20 20 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .  .**.*********
1c450 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64  ************ End
1c460 20 6f 66 20 74 68 65 20 4e 46 53 20 6c 6f 63 6b   of the NFS lock
1c470 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
1c480 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c490 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
1c4a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c4b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c4c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c4d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c4e0 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  *****/../*******
1c4f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c500 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c510 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c520 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c530 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
1c540 2a 2a 2a 2a 2a 2a 2a 2a 20 4e 6f 6e 2d 6c 6f 63  ******** Non-loc
1c550 6b 69 6e 67 20 73 71 6c 69 74 65 33 5f 66 69 6c  king sqlite3_fil
1c560 65 20 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a  e methods ******
1c570 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c580 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68  *******.**.** Th
1c590 65 20 6e 65 78 74 20 64 69 76 69 73 69 6f 6e 20  e next division 
1c5a0 63 6f 6e 74 61 69 6e 73 20 69 6d 70 6c 65 6d 65  contains impleme
1c5b0 6e 74 61 74 69 6f 6e 73 20 66 6f 72 20 61 6c 6c  ntations for all
1c5c0 20 6d 65 74 68 6f 64 73 20 6f 66 20 74 68 65 20   methods of the 
1c5d0 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  .** sqlite3_file
1c5e0 20 6f 62 6a 65 63 74 20 6f 74 68 65 72 20 74 68   object other th
1c5f0 61 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6d  an the locking m
1c600 65 74 68 6f 64 73 2e 20 20 54 68 65 20 6c 6f 63  ethods.  The loc
1c610 6b 69 6e 67 0a 2a 2a 20 6d 65 74 68 6f 64 73 20  king.** methods 
1c620 77 65 72 65 20 64 65 66 69 6e 65 64 20 69 6e 20  were defined in 
1c630 64 69 76 69 73 69 6f 6e 73 20 61 62 6f 76 65 20  divisions above 
1c640 28 6f 6e 65 20 6c 6f 63 6b 69 6e 67 20 6d 65 74  (one locking met
1c650 68 6f 64 20 70 65 72 0a 2a 2a 20 64 69 76 69 73  hod per.** divis
1c660 69 6f 6e 29 2e 20 20 54 68 6f 73 65 20 6d 65 74  ion).  Those met
1c670 68 6f 64 73 20 74 68 61 74 20 61 72 65 20 63 6f  hods that are co
1c680 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6c 6f 63 6b  mmon to all lock
1c690 69 6e 67 20 6d 6f 64 65 73 0a 2a 2a 20 61 72 65  ing modes.** are
1c6a0 20 67 61 74 68 65 72 20 74 6f 67 65 74 68 65 72   gather together
1c6b0 20 69 6e 74 6f 20 74 68 69 73 20 64 69 76 69 73   into this divis
1c6c0 69 6f 6e 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53  ion..*/../*.** S
1c6d0 65 65 6b 20 74 6f 20 74 68 65 20 6f 66 66 73 65  eek to the offse
1c6e0 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  t passed as the 
1c6f0 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c  second argument,
1c700 20 74 68 65 6e 20 72 65 61 64 20 63 6e 74 20 0a   then read cnt .
1c710 2a 2a 20 62 79 74 65 73 20 69 6e 74 6f 20 70 42  ** bytes into pB
1c720 75 66 2e 20 52 65 74 75 72 6e 20 74 68 65 20 6e  uf. Return the n
1c730 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 61  umber of bytes a
1c740 63 74 75 61 6c 6c 79 20 72 65 61 64 2e 0a 2a 2a  ctually read..**
1c750 0a 2a 2a 20 4e 42 3a 20 20 49 66 20 79 6f 75 20  .** NB:  If you 
1c760 64 65 66 69 6e 65 20 55 53 45 5f 50 52 45 41 44  define USE_PREAD
1c770 20 6f 72 20 55 53 45 5f 50 52 45 41 44 36 34 2c   or USE_PREAD64,
1c780 20 74 68 65 6e 20 69 74 20 6d 69 67 68 74 20 61   then it might a
1c790 6c 73 6f 0a 2a 2a 20 62 65 20 6e 65 63 65 73 73  lso.** be necess
1c7a0 61 72 79 20 74 6f 20 64 65 66 69 6e 65 20 5f 58  ary to define _X
1c7b0 4f 50 45 4e 5f 53 4f 55 52 43 45 20 74 6f 20 62  OPEN_SOURCE to b
1c7c0 65 20 35 30 30 2e 20 20 54 68 69 73 20 76 61 72  e 500.  This var
1c7d0 69 65 73 20 66 72 6f 6d 0a 2a 2a 20 6f 6e 65 20  ies from.** one 
1c7e0 73 79 73 74 65 6d 20 74 6f 20 61 6e 6f 74 68 65  system to anothe
1c7f0 72 2e 20 20 53 69 6e 63 65 20 53 51 4c 69 74 65  r.  Since SQLite
1c800 20 64 6f 65 73 20 6e 6f 74 20 64 65 66 69 6e 65   does not define
1c810 20 55 53 45 5f 50 52 45 41 44 0a 2a 2a 20 61 6e   USE_PREAD.** an
1c820 79 20 61 6e 79 20 66 6f 72 6d 20 62 79 20 64 65  y any form by de
1c830 66 61 75 6c 74 2c 20 77 65 20 77 69 6c 6c 20 6e  fault, we will n
1c840 6f 74 20 61 74 74 65 6d 70 74 20 74 6f 20 64 65  ot attempt to de
1c850 66 69 6e 65 20 5f 58 4f 50 45 4e 5f 53 4f 55 52  fine _XOPEN_SOUR
1c860 43 45 2e 0a 2a 2a 20 53 65 65 20 74 69 63 6b 65  CE..** See ticke
1c870 74 73 20 23 32 37 34 31 20 61 6e 64 20 23 32 36  ts #2741 and #26
1c880 38 31 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 76 6f  81..**.** To avo
1c890 69 64 20 73 74 6f 6d 70 69 6e 67 20 74 68 65 20  id stomping the 
1c8a0 65 72 72 6e 6f 20 76 61 6c 75 65 20 6f 6e 20 61  errno value on a
1c8b0 20 66 61 69 6c 65 64 20 72 65 61 64 20 74 68 65   failed read the
1c8c0 20 6c 61 73 74 45 72 72 6e 6f 20 76 61 6c 75 65   lastErrno value
1c8d0 0a 2a 2a 20 69 73 20 73 65 74 20 62 65 66 6f 72  .** is set befor
1c8e0 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a  e returning..*/.
1c8f0 73 74 61 74 69 63 20 69 6e 74 20 73 65 65 6b 41  static int seekA
1c900 6e 64 52 65 61 64 28 75 6e 69 78 46 69 6c 65 20  ndRead(unixFile 
1c910 2a 69 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74  *id, sqlite3_int
1c920 36 34 20 6f 66 66 73 65 74 2c 20 76 6f 69 64 20  64 offset, void 
1c930 2a 70 42 75 66 2c 20 69 6e 74 20 63 6e 74 29 7b  *pBuf, int cnt){
1c940 0a 20 20 69 6e 74 20 67 6f 74 3b 0a 20 20 69 6e  .  int got;.  in
1c950 74 20 70 72 69 6f 72 20 3d 20 30 3b 0a 23 69 66  t prior = 0;.#if
1c960 20 28 21 64 65 66 69 6e 65 64 28 55 53 45 5f 50   (!defined(USE_P
1c970 52 45 41 44 29 20 26 26 20 21 64 65 66 69 6e 65  READ) && !define
1c980 64 28 55 53 45 5f 50 52 45 41 44 36 34 29 29 0a  d(USE_PREAD64)).
1c990 20 20 69 36 34 20 6e 65 77 4f 66 66 73 65 74 3b    i64 newOffset;
1c9a0 0a 23 65 6e 64 69 66 0a 20 20 54 49 4d 45 52 5f  .#endif.  TIMER_
1c9b0 53 54 41 52 54 3b 0a 20 20 61 73 73 65 72 74 28  START;.  assert(
1c9c0 20 63 6e 74 3d 3d 28 63 6e 74 26 30 78 31 66 66   cnt==(cnt&0x1ff
1c9d0 66 66 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ff) );.  assert(
1c9e0 20 69 64 2d 3e 68 3e 32 20 29 3b 0a 20 20 63 6e   id->h>2 );.  cn
1c9f0 74 20 26 3d 20 30 78 31 66 66 66 66 3b 0a 20 20  t &= 0x1ffff;.  
1ca00 64 6f 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28  do{.#if defined(
1ca10 55 53 45 5f 50 52 45 41 44 29 0a 20 20 20 20 67  USE_PREAD).    g
1ca20 6f 74 20 3d 20 6f 73 50 72 65 61 64 28 69 64 2d  ot = osPread(id-
1ca30 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 2c 20 6f  >h, pBuf, cnt, o
1ca40 66 66 73 65 74 29 3b 0a 20 20 20 20 53 69 6d 75  ffset);.    Simu
1ca50 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 67 6f 74  lateIOError( got
1ca60 20 3d 20 2d 31 20 29 3b 0a 23 65 6c 69 66 20 64   = -1 );.#elif d
1ca70 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44  efined(USE_PREAD
1ca80 36 34 29 0a 20 20 20 20 67 6f 74 20 3d 20 6f 73  64).    got = os
1ca90 50 72 65 61 64 36 34 28 69 64 2d 3e 68 2c 20 70  Pread64(id->h, p
1caa0 42 75 66 2c 20 63 6e 74 2c 20 6f 66 66 73 65 74  Buf, cnt, offset
1cab0 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49  );.    SimulateI
1cac0 4f 45 72 72 6f 72 28 20 67 6f 74 20 3d 20 2d 31  OError( got = -1
1cad0 20 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 6e 65   );.#else.    ne
1cae0 77 4f 66 66 73 65 74 20 3d 20 6c 73 65 65 6b 28  wOffset = lseek(
1caf0 69 64 2d 3e 68 2c 20 6f 66 66 73 65 74 2c 20 53  id->h, offset, S
1cb00 45 45 4b 5f 53 45 54 29 3b 0a 20 20 20 20 53 69  EEK_SET);.    Si
1cb10 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 6e  mulateIOError( n
1cb20 65 77 4f 66 66 73 65 74 2d 2d 20 29 3b 0a 20 20  ewOffset-- );.  
1cb30 20 20 69 66 28 20 6e 65 77 4f 66 66 73 65 74 21    if( newOffset!
1cb40 3d 6f 66 66 73 65 74 20 29 7b 0a 20 20 20 20 20  =offset ){.     
1cb50 20 69 66 28 20 6e 65 77 4f 66 66 73 65 74 20 3d   if( newOffset =
1cb60 3d 20 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  = -1 ){.        
1cb70 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 28  storeLastErrno((
1cb80 75 6e 69 78 46 69 6c 65 2a 29 69 64 2c 20 65 72  unixFile*)id, er
1cb90 72 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  rno);.      }els
1cba0 65 7b 0a 20 20 20 20 20 20 20 20 73 74 6f 72 65  e{.        store
1cbb0 4c 61 73 74 45 72 72 6e 6f 28 28 75 6e 69 78 46  LastErrno((unixF
1cbc0 69 6c 65 2a 29 69 64 2c 20 30 29 3b 0a 20 20 20  ile*)id, 0);.   
1cbd0 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72     }.      retur
1cbe0 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n -1;.    }.    
1cbf0 67 6f 74 20 3d 20 6f 73 52 65 61 64 28 69 64 2d  got = osRead(id-
1cc00 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 29 3b 0a  >h, pBuf, cnt);.
1cc10 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 67  #endif.    if( g
1cc20 6f 74 3d 3d 63 6e 74 20 29 20 62 72 65 61 6b 3b  ot==cnt ) break;
1cc30 0a 20 20 20 20 69 66 28 20 67 6f 74 3c 30 20 29  .    if( got<0 )
1cc40 7b 0a 20 20 20 20 20 20 69 66 28 20 65 72 72 6e  {.      if( errn
1cc50 6f 3d 3d 45 49 4e 54 52 20 29 7b 20 67 6f 74 20  o==EINTR ){ got 
1cc60 3d 20 31 3b 20 63 6f 6e 74 69 6e 75 65 3b 20 7d  = 1; continue; }
1cc70 0a 20 20 20 20 20 20 70 72 69 6f 72 20 3d 20 30  .      prior = 0
1cc80 3b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73  ;.      storeLas
1cc90 74 45 72 72 6e 6f 28 28 75 6e 69 78 46 69 6c 65  tErrno((unixFile
1cca0 2a 29 69 64 2c 20 65 72 72 6e 6f 29 3b 0a 20 20  *)id, errno);.  
1ccb0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1ccc0 65 6c 73 65 20 69 66 28 20 67 6f 74 3e 30 20 29  else if( got>0 )
1ccd0 7b 0a 20 20 20 20 20 20 63 6e 74 20 2d 3d 20 67  {.      cnt -= g
1cce0 6f 74 3b 0a 20 20 20 20 20 20 6f 66 66 73 65 74  ot;.      offset
1ccf0 20 2b 3d 20 67 6f 74 3b 0a 20 20 20 20 20 20 70   += got;.      p
1cd00 72 69 6f 72 20 2b 3d 20 67 6f 74 3b 0a 20 20 20  rior += got;.   
1cd10 20 20 20 70 42 75 66 20 3d 20 28 76 6f 69 64 2a     pBuf = (void*
1cd20 29 28 67 6f 74 20 2b 20 28 63 68 61 72 2a 29 70  )(got + (char*)p
1cd30 42 75 66 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 77  Buf);.    }.  }w
1cd40 68 69 6c 65 28 20 67 6f 74 3e 30 20 29 3b 0a 20  hile( got>0 );. 
1cd50 20 54 49 4d 45 52 5f 45 4e 44 3b 0a 20 20 4f 53   TIMER_END;.  OS
1cd60 54 52 41 43 45 28 28 22 52 45 41 44 20 20 20 20  TRACE(("READ    
1cd70 25 2d 33 64 20 25 35 64 20 25 37 6c 6c 64 20 25  %-3d %5d %7lld %
1cd80 6c 6c 75 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  llu\n",.        
1cd90 20 20 20 20 69 64 2d 3e 68 2c 20 67 6f 74 2b 70      id->h, got+p
1cda0 72 69 6f 72 2c 20 6f 66 66 73 65 74 2d 70 72 69  rior, offset-pri
1cdb0 6f 72 2c 20 54 49 4d 45 52 5f 45 4c 41 50 53 45  or, TIMER_ELAPSE
1cdc0 44 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 67 6f  D));.  return go
1cdd0 74 2b 70 72 69 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  t+prior;.}../*.*
1cde0 2a 20 52 65 61 64 20 64 61 74 61 20 66 72 6f 6d  * Read data from
1cdf0 20 61 20 66 69 6c 65 20 69 6e 74 6f 20 61 20 62   a file into a b
1ce00 75 66 66 65 72 2e 20 20 52 65 74 75 72 6e 20 53  uffer.  Return S
1ce10 51 4c 49 54 45 5f 4f 4b 20 69 66 20 61 6c 6c 0a  QLITE_OK if all.
1ce20 2a 2a 20 62 79 74 65 73 20 77 65 72 65 20 72 65  ** bytes were re
1ce30 61 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  ad successfully 
1ce40 61 6e 64 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  and SQLITE_IOERR
1ce50 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65   if anything goe
1ce60 73 0a 2a 2a 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73  s.** wrong..*/.s
1ce70 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 52 65  tatic int unixRe
1ce80 61 64 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  ad(.  sqlite3_fi
1ce90 6c 65 20 2a 69 64 2c 20 0a 20 20 76 6f 69 64 20  le *id, .  void 
1cea0 2a 70 42 75 66 2c 20 0a 20 20 69 6e 74 20 61 6d  *pBuf, .  int am
1ceb0 74 2c 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  t,.  sqlite3_int
1cec0 36 34 20 6f 66 66 73 65 74 0a 29 7b 0a 20 20 75  64 offset.){.  u
1ced0 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
1cee0 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 69 64 3b   (unixFile *)id;
1cef0 0a 20 20 69 6e 74 20 67 6f 74 3b 0a 20 20 61 73  .  int got;.  as
1cf00 73 65 72 74 28 20 69 64 20 29 3b 0a 20 20 61 73  sert( id );.  as
1cf10 73 65 72 74 28 20 6f 66 66 73 65 74 3e 3d 30 20  sert( offset>=0 
1cf20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 6d 74  );.  assert( amt
1cf30 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  >0 );..  /* If t
1cf40 68 69 73 20 69 73 20 61 20 64 61 74 61 62 61 73  his is a databas
1cf50 65 20 66 69 6c 65 20 28 6e 6f 74 20 61 20 6a 6f  e file (not a jo
1cf60 75 72 6e 61 6c 2c 20 6d 61 73 74 65 72 2d 6a 6f  urnal, master-jo
1cf70 75 72 6e 61 6c 20 6f 72 20 74 65 6d 70 0a 20 20  urnal or temp.  
1cf80 2a 2a 20 66 69 6c 65 29 2c 20 74 68 65 20 62 79  ** file), the by
1cf90 74 65 73 20 69 6e 20 74 68 65 20 6c 6f 63 6b 69  tes in the locki
1cfa0 6e 67 20 72 61 6e 67 65 20 73 68 6f 75 6c 64 20  ng range should 
1cfb0 6e 65 76 65 72 20 62 65 20 72 65 61 64 20 6f 72  never be read or
1cfc0 20 77 72 69 74 74 65 6e 2e 20 2a 2f 0a 23 69 66   written. */.#if
1cfd0 20 30 0a 20 20 61 73 73 65 72 74 28 20 70 46 69   0.  assert( pFi
1cfe0 6c 65 2d 3e 70 55 6e 75 73 65 64 3d 3d 30 0a 20  le->pUnused==0. 
1cff0 20 20 20 20 20 20 7c 7c 20 6f 66 66 73 65 74 3e        || offset>
1d000 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 2b 35 31  =PENDING_BYTE+51
1d010 32 0a 20 20 20 20 20 20 20 7c 7c 20 6f 66 66 73  2.       || offs
1d020 65 74 2b 61 6d 74 3c 3d 50 45 4e 44 49 4e 47 5f  et+amt<=PENDING_
1d030 42 59 54 45 20 0a 20 20 29 3b 0a 23 65 6e 64 69  BYTE .  );.#endi
1d040 66 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  f..#if SQLITE_MA
1d050 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20  X_MMAP_SIZE>0.  
1d060 2f 2a 20 44 65 61 6c 20 77 69 74 68 20 61 73 20  /* Deal with as 
1d070 6d 75 63 68 20 6f 66 20 74 68 69 73 20 72 65 61  much of this rea
1d080 64 20 72 65 71 75 65 73 74 20 61 73 20 70 6f 73  d request as pos
1d090 73 69 62 6c 65 20 62 79 20 74 72 61 6e 73 66 65  sible by transfe
1d0a0 72 69 6e 67 0a 20 20 2a 2a 20 64 61 74 61 20 66  ring.  ** data f
1d0b0 72 6f 6d 20 74 68 65 20 6d 65 6d 6f 72 79 20 6d  rom the memory m
1d0c0 61 70 70 69 6e 67 20 75 73 69 6e 67 20 6d 65 6d  apping using mem
1d0d0 63 70 79 28 29 2e 20 20 2a 2f 0a 20 20 69 66 28  cpy().  */.  if(
1d0e0 20 6f 66 66 73 65 74 3c 70 46 69 6c 65 2d 3e 6d   offset<pFile->m
1d0f0 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 69  mapSize ){.    i
1d100 66 28 20 6f 66 66 73 65 74 2b 61 6d 74 20 3c 3d  f( offset+amt <=
1d110 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65   pFile->mmapSize
1d120 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   ){.      memcpy
1d130 28 70 42 75 66 2c 20 26 28 28 75 38 20 2a 29 28  (pBuf, &((u8 *)(
1d140 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f  pFile->pMapRegio
1d150 6e 29 29 5b 6f 66 66 73 65 74 5d 2c 20 61 6d 74  n))[offset], amt
1d160 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1d170 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
1d180 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20  else{.      int 
1d190 6e 43 6f 70 79 20 3d 20 70 46 69 6c 65 2d 3e 6d  nCopy = pFile->m
1d1a0 6d 61 70 53 69 7a 65 20 2d 20 6f 66 66 73 65 74  mapSize - offset
1d1b0 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70  ;.      memcpy(p
1d1c0 42 75 66 2c 20 26 28 28 75 38 20 2a 29 28 70 46  Buf, &((u8 *)(pF
1d1d0 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29  ile->pMapRegion)
1d1e0 29 5b 6f 66 66 73 65 74 5d 2c 20 6e 43 6f 70 79  )[offset], nCopy
1d1f0 29 3b 0a 20 20 20 20 20 20 70 42 75 66 20 3d 20  );.      pBuf = 
1d200 26 28 28 75 38 20 2a 29 70 42 75 66 29 5b 6e 43  &((u8 *)pBuf)[nC
1d210 6f 70 79 5d 3b 0a 20 20 20 20 20 20 61 6d 74 20  opy];.      amt 
1d220 2d 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20 20 20  -= nCopy;.      
1d230 6f 66 66 73 65 74 20 2b 3d 20 6e 43 6f 70 79 3b  offset += nCopy;
1d240 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
1d250 66 0a 0a 20 20 67 6f 74 20 3d 20 73 65 65 6b 41  f..  got = seekA
1d260 6e 64 52 65 61 64 28 70 46 69 6c 65 2c 20 6f 66  ndRead(pFile, of
1d270 66 73 65 74 2c 20 70 42 75 66 2c 20 61 6d 74 29  fset, pBuf, amt)
1d280 3b 0a 20 20 69 66 28 20 67 6f 74 3d 3d 61 6d 74  ;.  if( got==amt
1d290 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
1d2a0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73  QLITE_OK;.  }els
1d2b0 65 20 69 66 28 20 67 6f 74 3c 30 20 29 7b 0a 20  e if( got<0 ){. 
1d2c0 20 20 20 2f 2a 20 6c 61 73 74 45 72 72 6e 6f 20     /* lastErrno 
1d2d0 73 65 74 20 62 79 20 73 65 65 6b 41 6e 64 52 65  set by seekAndRe
1d2e0 61 64 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  ad */.    return
1d2f0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45   SQLITE_IOERR_RE
1d300 41 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  AD;.  }else{.   
1d310 20 2f 2a 20 55 6e 72 65 61 64 20 70 61 72 74 73   /* Unread parts
1d320 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 6d   of the buffer m
1d330 75 73 74 20 62 65 20 7a 65 72 6f 2d 66 69 6c 6c  ust be zero-fill
1d340 65 64 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74  ed */.    memset
1d350 28 26 28 28 63 68 61 72 2a 29 70 42 75 66 29 5b  (&((char*)pBuf)[
1d360 67 6f 74 5d 2c 20 30 2c 20 61 6d 74 2d 67 6f 74  got], 0, amt-got
1d370 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
1d380 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
1d390 5f 52 45 41 44 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  _READ;.  }.}../*
1d3a0 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73  .** Attempt to s
1d3b0 65 65 6b 20 74 68 65 20 66 69 6c 65 2d 64 65 73  eek the file-des
1d3c0 63 72 69 70 74 6f 72 20 70 61 73 73 65 64 20 61  criptor passed a
1d3d0 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75  s the first argu
1d3e0 6d 65 6e 74 20 74 6f 0a 2a 2a 20 61 62 73 6f 6c  ment to.** absol
1d3f0 75 74 65 20 6f 66 66 73 65 74 20 69 4f 66 66 2c  ute offset iOff,
1d400 20 74 68 65 6e 20 61 74 74 65 6d 70 74 20 74 6f   then attempt to
1d410 20 77 72 69 74 65 20 6e 42 75 66 20 62 79 74 65   write nBuf byte
1d420 73 20 6f 66 20 64 61 74 61 20 66 72 6f 6d 0a 2a  s of data from.*
1d430 2a 20 70 42 75 66 20 74 6f 20 69 74 2e 20 49 66  * pBuf to it. If
1d440 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
1d450 2c 20 72 65 74 75 72 6e 20 2d 31 20 61 6e 64 20  , return -1 and 
1d460 73 65 74 20 2a 70 69 45 72 72 6e 6f 2e 20 4f 74  set *piErrno. Ot
1d470 68 65 72 77 69 73 65 2c 20 0a 2a 2a 20 72 65 74  herwise, .** ret
1d480 75 72 6e 20 74 68 65 20 61 63 74 75 61 6c 20 6e  urn the actual n
1d490 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 77  umber of bytes w
1d4a0 72 69 74 74 65 6e 20 28 77 68 69 63 68 20 6d 61  ritten (which ma
1d4b0 79 20 62 65 20 6c 65 73 73 20 74 68 61 6e 0a 2a  y be less than.*
1d4c0 2a 20 6e 42 75 66 29 2e 0a 2a 2f 0a 73 74 61 74  * nBuf)..*/.stat
1d4d0 69 63 20 69 6e 74 20 73 65 65 6b 41 6e 64 57 72  ic int seekAndWr
1d4e0 69 74 65 46 64 28 0a 20 20 69 6e 74 20 66 64 2c  iteFd(.  int fd,
1d4f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d500 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
1d510 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20 77   descriptor to w
1d520 72 69 74 65 20 74 6f 20 2a 2f 0a 20 20 69 36 34  rite to */.  i64
1d530 20 69 4f 66 66 2c 20 20 20 20 20 20 20 20 20 20   iOff,          
1d540 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d550 46 69 6c 65 20 6f 66 66 73 65 74 20 74 6f 20 62  File offset to b
1d560 65 67 69 6e 20 77 72 69 74 69 6e 67 20 61 74 20  egin writing at 
1d570 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  */.  const void 
1d580 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20 20 20  *pBuf,          
1d590 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 64 61 74       /* Copy dat
1d5a0 61 20 66 72 6f 6d 20 74 68 69 73 20 62 75 66 66  a from this buff
1d5b0 65 72 20 74 6f 20 74 68 65 20 66 69 6c 65 20 2a  er to the file *
1d5c0 2f 0a 20 20 69 6e 74 20 6e 42 75 66 2c 20 20 20  /.  int nBuf,   
1d5d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d5e0 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 62      /* Size of b
1d5f0 75 66 66 65 72 20 70 42 75 66 20 69 6e 20 62 79  uffer pBuf in by
1d600 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69  tes */.  int *pi
1d610 45 72 72 6e 6f 20 20 20 20 20 20 20 20 20 20 20  Errno           
1d620 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
1d630 20 45 72 72 6f 72 20 6e 75 6d 62 65 72 20 69 66   Error number if
1d640 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 2a 2f   error occurs */
1d650 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30  .){.  int rc = 0
1d660 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1d670 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 72        /* Value r
1d680 65 74 75 72 6e 65 64 20 62 79 20 73 79 73 74 65  eturned by syste
1d690 6d 20 63 61 6c 6c 20 2a 2f 0a 0a 20 20 61 73 73  m call */..  ass
1d6a0 65 72 74 28 20 6e 42 75 66 3d 3d 28 6e 42 75 66  ert( nBuf==(nBuf
1d6b0 26 30 78 31 66 66 66 66 29 20 29 3b 0a 20 20 61  &0x1ffff) );.  a
1d6c0 73 73 65 72 74 28 20 66 64 3e 32 20 29 3b 0a 20  ssert( fd>2 );. 
1d6d0 20 6e 42 75 66 20 26 3d 20 30 78 31 66 66 66 66   nBuf &= 0x1ffff
1d6e0 3b 0a 20 20 54 49 4d 45 52 5f 53 54 41 52 54 3b  ;.  TIMER_START;
1d6f0 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 55 53  ..#if defined(US
1d700 45 5f 50 52 45 41 44 29 0a 20 20 64 6f 7b 20 72  E_PREAD).  do{ r
1d710 63 20 3d 20 6f 73 50 77 72 69 74 65 28 66 64 2c  c = osPwrite(fd,
1d720 20 70 42 75 66 2c 20 6e 42 75 66 2c 20 69 4f 66   pBuf, nBuf, iOf
1d730 66 29 3b 20 7d 77 68 69 6c 65 28 20 72 63 3c 30  f); }while( rc<0
1d740 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52   && errno==EINTR
1d750 20 29 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65   );.#elif define
1d760 64 28 55 53 45 5f 50 52 45 41 44 36 34 29 0a 20  d(USE_PREAD64). 
1d770 20 64 6f 7b 20 72 63 20 3d 20 6f 73 50 77 72 69   do{ rc = osPwri
1d780 74 65 36 34 28 66 64 2c 20 70 42 75 66 2c 20 6e  te64(fd, pBuf, n
1d790 42 75 66 2c 20 69 4f 66 66 29 3b 7d 77 68 69 6c  Buf, iOff);}whil
1d7a0 65 28 20 72 63 3c 30 20 26 26 20 65 72 72 6e 6f  e( rc<0 && errno
1d7b0 3d 3d 45 49 4e 54 52 29 3b 0a 23 65 6c 73 65 0a  ==EINTR);.#else.
1d7c0 20 20 64 6f 7b 0a 20 20 20 20 69 36 34 20 69 53    do{.    i64 iS
1d7d0 65 65 6b 20 3d 20 6c 73 65 65 6b 28 66 64 2c 20  eek = lseek(fd, 
1d7e0 69 4f 66 66 2c 20 53 45 45 4b 5f 53 45 54 29 3b  iOff, SEEK_SET);
1d7f0 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  .    SimulateIOE
1d800 72 72 6f 72 28 20 69 53 65 65 6b 2d 2d 20 29 3b  rror( iSeek-- );
1d810 0a 0a 20 20 20 20 69 66 28 20 69 53 65 65 6b 21  ..    if( iSeek!
1d820 3d 69 4f 66 66 20 29 7b 0a 20 20 20 20 20 20 69  =iOff ){.      i
1d830 66 28 20 70 69 45 72 72 6e 6f 20 29 20 2a 70 69  f( piErrno ) *pi
1d840 45 72 72 6e 6f 20 3d 20 28 69 53 65 65 6b 3d 3d  Errno = (iSeek==
1d850 2d 31 20 3f 20 65 72 72 6e 6f 20 3a 20 30 29 3b  -1 ? errno : 0);
1d860 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d 31  .      return -1
1d870 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
1d880 20 6f 73 57 72 69 74 65 28 66 64 2c 20 70 42 75   osWrite(fd, pBu
1d890 66 2c 20 6e 42 75 66 29 3b 0a 20 20 7d 77 68 69  f, nBuf);.  }whi
1d8a0 6c 65 28 20 72 63 3c 30 20 26 26 20 65 72 72 6e  le( rc<0 && errn
1d8b0 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 23 65 6e 64  o==EINTR );.#end
1d8c0 69 66 0a 0a 20 20 54 49 4d 45 52 5f 45 4e 44 3b  if..  TIMER_END;
1d8d0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 57 52 49  .  OSTRACE(("WRI
1d8e0 54 45 20 20 20 25 2d 33 64 20 25 35 64 20 25 37  TE   %-3d %5d %7
1d8f0 6c 6c 64 20 25 6c 6c 75 5c 6e 22 2c 20 66 64 2c  lld %llu\n", fd,
1d900 20 72 63 2c 20 69 4f 66 66 2c 20 54 49 4d 45 52   rc, iOff, TIMER
1d910 5f 45 4c 41 50 53 45 44 29 29 3b 0a 0a 20 20 69  _ELAPSED));..  i
1d920 66 28 20 72 63 3c 30 20 26 26 20 70 69 45 72 72  f( rc<0 && piErr
1d930 6e 6f 20 29 20 2a 70 69 45 72 72 6e 6f 20 3d 20  no ) *piErrno = 
1d940 65 72 72 6e 6f 3b 0a 20 20 72 65 74 75 72 6e 20  errno;.  return 
1d950 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 65  rc;.}.../*.** Se
1d960 65 6b 20 74 6f 20 74 68 65 20 6f 66 66 73 65 74  ek to the offset
1d970 20 69 6e 20 69 64 2d 3e 6f 66 66 73 65 74 20 74   in id->offset t
1d980 68 65 6e 20 72 65 61 64 20 63 6e 74 20 62 79 74  hen read cnt byt
1d990 65 73 20 69 6e 74 6f 20 70 42 75 66 2e 0a 2a 2a  es into pBuf..**
1d9a0 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
1d9b0 65 72 20 6f 66 20 62 79 74 65 73 20 61 63 74 75  er of bytes actu
1d9c0 61 6c 6c 79 20 72 65 61 64 2e 20 20 55 70 64 61  ally read.  Upda
1d9d0 74 65 20 74 68 65 20 6f 66 66 73 65 74 2e 0a 2a  te the offset..*
1d9e0 2a 0a 2a 2a 20 54 6f 20 61 76 6f 69 64 20 73 74  *.** To avoid st
1d9f0 6f 6d 70 69 6e 67 20 74 68 65 20 65 72 72 6e 6f  omping the errno
1da00 20 76 61 6c 75 65 20 6f 6e 20 61 20 66 61 69 6c   value on a fail
1da10 65 64 20 77 72 69 74 65 20 74 68 65 20 6c 61 73  ed write the las
1da20 74 45 72 72 6e 6f 20 76 61 6c 75 65 0a 2a 2a 20  tErrno value.** 
1da30 69 73 20 73 65 74 20 62 65 66 6f 72 65 20 72 65  is set before re
1da40 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  turning..*/.stat
1da50 69 63 20 69 6e 74 20 73 65 65 6b 41 6e 64 57 72  ic int seekAndWr
1da60 69 74 65 28 75 6e 69 78 46 69 6c 65 20 2a 69 64  ite(unixFile *id
1da70 2c 20 69 36 34 20 6f 66 66 73 65 74 2c 20 63 6f  , i64 offset, co
1da80 6e 73 74 20 76 6f 69 64 20 2a 70 42 75 66 2c 20  nst void *pBuf, 
1da90 69 6e 74 20 63 6e 74 29 7b 0a 20 20 72 65 74 75  int cnt){.  retu
1daa0 72 6e 20 73 65 65 6b 41 6e 64 57 72 69 74 65 46  rn seekAndWriteF
1dab0 64 28 69 64 2d 3e 68 2c 20 6f 66 66 73 65 74 2c  d(id->h, offset,
1dac0 20 70 42 75 66 2c 20 63 6e 74 2c 20 26 69 64 2d   pBuf, cnt, &id-
1dad0 3e 6c 61 73 74 45 72 72 6e 6f 29 3b 0a 7d 0a 0a  >lastErrno);.}..
1dae0 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 64 61 74  ./*.** Write dat
1daf0 61 20 66 72 6f 6d 20 61 20 62 75 66 66 65 72 20  a from a buffer 
1db00 69 6e 74 6f 20 61 20 66 69 6c 65 2e 20 20 52 65  into a file.  Re
1db10 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
1db20 6e 20 73 75 63 63 65 73 73 0a 2a 2a 20 6f 72 20  n success.** or 
1db30 73 6f 6d 65 20 6f 74 68 65 72 20 65 72 72 6f 72  some other error
1db40 20 63 6f 64 65 20 6f 6e 20 66 61 69 6c 75 72 65   code on failure
1db50 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1db60 75 6e 69 78 57 72 69 74 65 28 0a 20 20 73 71 6c  unixWrite(.  sql
1db70 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 0a  ite3_file *id, .
1db80 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42    const void *pB
1db90 75 66 2c 20 0a 20 20 69 6e 74 20 61 6d 74 2c 0a  uf, .  int amt,.
1dba0 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
1dbb0 6f 66 66 73 65 74 20 0a 29 7b 0a 20 20 75 6e 69  offset .){.  uni
1dbc0 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
1dbd0 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
1dbe0 69 6e 74 20 77 72 6f 74 65 20 3d 20 30 3b 0a 20  int wrote = 0;. 
1dbf0 20 61 73 73 65 72 74 28 20 69 64 20 29 3b 0a 20   assert( id );. 
1dc00 20 61 73 73 65 72 74 28 20 61 6d 74 3e 30 20 29   assert( amt>0 )
1dc10 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  ;..  /* If this 
1dc20 69 73 20 61 20 64 61 74 61 62 61 73 65 20 66 69  is a database fi
1dc30 6c 65 20 28 6e 6f 74 20 61 20 6a 6f 75 72 6e 61  le (not a journa
1dc40 6c 2c 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61  l, master-journa
1dc50 6c 20 6f 72 20 74 65 6d 70 0a 20 20 2a 2a 20 66  l or temp.  ** f
1dc60 69 6c 65 29 2c 20 74 68 65 20 62 79 74 65 73 20  ile), the bytes 
1dc70 69 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 72  in the locking r
1dc80 61 6e 67 65 20 73 68 6f 75 6c 64 20 6e 65 76 65  ange should neve
1dc90 72 20 62 65 20 72 65 61 64 20 6f 72 20 77 72 69  r be read or wri
1dca0 74 74 65 6e 2e 20 2a 2f 0a 23 69 66 20 30 0a 20  tten. */.#if 0. 
1dcb0 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e   assert( pFile->
1dcc0 70 55 6e 75 73 65 64 3d 3d 30 0a 20 20 20 20 20  pUnused==0.     
1dcd0 20 20 7c 7c 20 6f 66 66 73 65 74 3e 3d 50 45 4e    || offset>=PEN
1dce0 44 49 4e 47 5f 42 59 54 45 2b 35 31 32 0a 20 20  DING_BYTE+512.  
1dcf0 20 20 20 20 20 7c 7c 20 6f 66 66 73 65 74 2b 61       || offset+a
1dd00 6d 74 3c 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  mt<=PENDING_BYTE
1dd10 20 0a 20 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 23   .  );.#endif..#
1dd20 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
1dd30 55 47 0a 20 20 2f 2a 20 49 66 20 77 65 20 61 72  UG.  /* If we ar
1dd40 65 20 64 6f 69 6e 67 20 61 20 6e 6f 72 6d 61 6c  e doing a normal
1dd50 20 77 72 69 74 65 20 74 6f 20 61 20 64 61 74 61   write to a data
1dd60 62 61 73 65 20 66 69 6c 65 20 28 61 73 20 6f 70  base file (as op
1dd70 70 6f 73 65 64 20 74 6f 0a 20 20 2a 2a 20 64 6f  posed to.  ** do
1dd80 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  ing a hot-journa
1dd90 6c 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 61 20  l rollback or a 
1dda0 77 72 69 74 65 20 74 6f 20 73 6f 6d 65 20 66 69  write to some fi
1ddb0 6c 65 20 6f 74 68 65 72 20 74 68 61 6e 20 61 0a  le other than a.
1ddc0 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20 64 61 74 61    ** normal data
1ddd0 62 61 73 65 20 66 69 6c 65 29 20 74 68 65 6e 20  base file) then 
1dde0 72 65 63 6f 72 64 20 74 68 65 20 66 61 63 74 20  record the fact 
1ddf0 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73  that the databas
1de00 65 0a 20 20 2a 2a 20 68 61 73 20 63 68 61 6e 67  e.  ** has chang
1de10 65 64 2e 20 20 49 66 20 74 68 65 20 74 72 61 6e  ed.  If the tran
1de20 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20  saction counter 
1de30 69 73 20 6d 6f 64 69 66 69 65 64 2c 20 72 65 63  is modified, rec
1de40 6f 72 64 20 74 68 61 74 0a 20 20 2a 2a 20 66 61  ord that.  ** fa
1de50 63 74 20 74 6f 6f 2e 0a 20 20 2a 2f 0a 20 20 69  ct too..  */.  i
1de60 66 28 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d  f( pFile->inNorm
1de70 61 6c 57 72 69 74 65 20 29 7b 0a 20 20 20 20 70  alWrite ){.    p
1de80 46 69 6c 65 2d 3e 64 62 55 70 64 61 74 65 20 3d  File->dbUpdate =
1de90 20 31 3b 20 20 2f 2a 20 54 68 65 20 64 61 74 61   1;  /* The data
1dea0 62 61 73 65 20 68 61 73 20 62 65 65 6e 20 6d 6f  base has been mo
1deb0 64 69 66 69 65 64 20 2a 2f 0a 20 20 20 20 69 66  dified */.    if
1dec0 28 20 6f 66 66 73 65 74 3c 3d 32 34 20 26 26 20  ( offset<=24 && 
1ded0 6f 66 66 73 65 74 2b 61 6d 74 3e 3d 32 37 20 29  offset+amt>=27 )
1dee0 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 3b 0a  {.      int rc;.
1def0 20 20 20 20 20 20 63 68 61 72 20 6f 6c 64 43 6e        char oldCn
1df00 74 72 5b 34 5d 3b 0a 20 20 20 20 20 20 53 69 6d  tr[4];.      Sim
1df10 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69  ulateIOErrorBeni
1df20 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 72 63 20  gn(1);.      rc 
1df30 3d 20 73 65 65 6b 41 6e 64 52 65 61 64 28 70 46  = seekAndRead(pF
1df40 69 6c 65 2c 20 32 34 2c 20 6f 6c 64 43 6e 74 72  ile, 24, oldCntr
1df50 2c 20 34 29 3b 0a 20 20 20 20 20 20 53 69 6d 75  , 4);.      Simu
1df60 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67  lateIOErrorBenig
1df70 6e 28 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  n(0);.      if( 
1df80 72 63 21 3d 34 20 7c 7c 20 6d 65 6d 63 6d 70 28  rc!=4 || memcmp(
1df90 6f 6c 64 43 6e 74 72 2c 20 26 28 28 63 68 61 72  oldCntr, &((char
1dfa0 2a 29 70 42 75 66 29 5b 32 34 2d 6f 66 66 73 65  *)pBuf)[24-offse
1dfb0 74 5d 2c 20 34 29 21 3d 30 20 29 7b 0a 20 20 20  t], 4)!=0 ){.   
1dfc0 20 20 20 20 20 70 46 69 6c 65 2d 3e 74 72 61 6e       pFile->tran
1dfd0 73 43 6e 74 72 43 68 6e 67 20 3d 20 31 3b 20 20  sCntrChng = 1;  
1dfe0 2f 2a 20 54 68 65 20 74 72 61 6e 73 61 63 74 69  /* The transacti
1dff0 6f 6e 20 63 6f 75 6e 74 65 72 20 68 61 73 20 63  on counter has c
1e000 68 61 6e 67 65 64 20 2a 2f 0a 20 20 20 20 20 20  hanged */.      
1e010 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  }.    }.  }.#end
1e020 69 66 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  if..#if SQLITE_M
1e030 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20  AX_MMAP_SIZE>0. 
1e040 20 2f 2a 20 44 65 61 6c 20 77 69 74 68 20 61 73   /* Deal with as
1e050 20 6d 75 63 68 20 6f 66 20 74 68 69 73 20 77 72   much of this wr
1e060 69 74 65 20 72 65 71 75 65 73 74 20 61 73 20 70  ite request as p
1e070 6f 73 73 69 62 6c 65 20 62 79 20 74 72 61 6e 73  ossible by trans
1e080 66 65 72 69 6e 67 0a 20 20 2a 2a 20 64 61 74 61  fering.  ** data
1e090 20 66 72 6f 6d 20 74 68 65 20 6d 65 6d 6f 72 79   from the memory
1e0a0 20 6d 61 70 70 69 6e 67 20 75 73 69 6e 67 20 6d   mapping using m
1e0b0 65 6d 63 70 79 28 29 2e 20 20 2a 2f 0a 20 20 69  emcpy().  */.  i
1e0c0 66 28 20 6f 66 66 73 65 74 3c 70 46 69 6c 65 2d  f( offset<pFile-
1e0d0 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20  >mmapSize ){.   
1e0e0 20 69 66 28 20 6f 66 66 73 65 74 2b 61 6d 74 20   if( offset+amt 
1e0f0 3c 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69  <= pFile->mmapSi
1e100 7a 65 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63  ze ){.      memc
1e110 70 79 28 26 28 28 75 38 20 2a 29 28 70 46 69 6c  py(&((u8 *)(pFil
1e120 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 29 5b  e->pMapRegion))[
1e130 6f 66 66 73 65 74 5d 2c 20 70 42 75 66 2c 20 61  offset], pBuf, a
1e140 6d 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  mt);.      retur
1e150 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
1e160 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
1e170 74 20 6e 43 6f 70 79 20 3d 20 70 46 69 6c 65 2d  t nCopy = pFile-
1e180 3e 6d 6d 61 70 53 69 7a 65 20 2d 20 6f 66 66 73  >mmapSize - offs
1e190 65 74 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79  et;.      memcpy
1e1a0 28 26 28 28 75 38 20 2a 29 28 70 46 69 6c 65 2d  (&((u8 *)(pFile-
1e1b0 3e 70 4d 61 70 52 65 67 69 6f 6e 29 29 5b 6f 66  >pMapRegion))[of
1e1c0 66 73 65 74 5d 2c 20 70 42 75 66 2c 20 6e 43 6f  fset], pBuf, nCo
1e1d0 70 79 29 3b 0a 20 20 20 20 20 20 70 42 75 66 20  py);.      pBuf 
1e1e0 3d 20 26 28 28 75 38 20 2a 29 70 42 75 66 29 5b  = &((u8 *)pBuf)[
1e1f0 6e 43 6f 70 79 5d 3b 0a 20 20 20 20 20 20 61 6d  nCopy];.      am
1e200 74 20 2d 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20  t -= nCopy;.    
1e210 20 20 6f 66 66 73 65 74 20 2b 3d 20 6e 43 6f 70    offset += nCop
1e220 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  y;.    }.  }.#en
1e230 64 69 66 0a 0a 20 20 77 68 69 6c 65 28 20 61 6d  dif..  while( am
1e240 74 3e 30 20 26 26 20 28 77 72 6f 74 65 20 3d 20  t>0 && (wrote = 
1e250 73 65 65 6b 41 6e 64 57 72 69 74 65 28 70 46 69  seekAndWrite(pFi
1e260 6c 65 2c 20 6f 66 66 73 65 74 2c 20 70 42 75 66  le, offset, pBuf
1e270 2c 20 61 6d 74 29 29 3e 30 20 29 7b 0a 20 20 20  , amt))>0 ){.   
1e280 20 61 6d 74 20 2d 3d 20 77 72 6f 74 65 3b 0a 20   amt -= wrote;. 
1e290 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 77 72 6f     offset += wro
1e2a0 74 65 3b 0a 20 20 20 20 70 42 75 66 20 3d 20 26  te;.    pBuf = &
1e2b0 28 28 63 68 61 72 2a 29 70 42 75 66 29 5b 77 72  ((char*)pBuf)[wr
1e2c0 6f 74 65 5d 3b 0a 20 20 7d 0a 20 20 53 69 6d 75  ote];.  }.  Simu
1e2d0 6c 61 74 65 49 4f 45 72 72 6f 72 28 28 20 77 72  lateIOError(( wr
1e2e0 6f 74 65 3d 28 2d 31 29 2c 20 61 6d 74 3d 31 20  ote=(-1), amt=1 
1e2f0 29 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 44 69  ));.  SimulateDi
1e300 73 6b 66 75 6c 6c 45 72 72 6f 72 28 28 20 77 72  skfullError(( wr
1e310 6f 74 65 3d 30 2c 20 61 6d 74 3d 31 20 29 29 3b  ote=0, amt=1 ));
1e320 0a 0a 20 20 69 66 28 20 61 6d 74 3e 30 20 29 7b  ..  if( amt>0 ){
1e330 0a 20 20 20 20 69 66 28 20 77 72 6f 74 65 3c 30  .    if( wrote<0
1e340 20 26 26 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45   && pFile->lastE
1e350 72 72 6e 6f 21 3d 45 4e 4f 53 50 43 20 29 7b 0a  rrno!=ENOSPC ){.
1e360 20 20 20 20 20 20 2f 2a 20 6c 61 73 74 45 72 72        /* lastErr
1e370 6e 6f 20 73 65 74 20 62 79 20 73 65 65 6b 41 6e  no set by seekAn
1e380 64 57 72 69 74 65 20 2a 2f 0a 20 20 20 20 20 20  dWrite */.      
1e390 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
1e3a0 45 52 52 5f 57 52 49 54 45 3b 0a 20 20 20 20 7d  ERR_WRITE;.    }
1e3b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75  else{.      retu
1e3c0 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a  rn SQLITE_FULL;.
1e3d0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
1e3e0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1e3f0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
1e400 54 45 53 54 0a 2f 2a 0a 2a 2a 20 43 6f 75 6e 74  TEST./*.** Count
1e410 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66   the number of f
1e420 75 6c 6c 73 79 6e 63 73 20 61 6e 64 20 6e 6f 72  ullsyncs and nor
1e430 6d 61 6c 20 73 79 6e 63 73 2e 20 20 54 68 69 73  mal syncs.  This
1e440 20 69 73 20 75 73 65 64 20 74 6f 20 74 65 73 74   is used to test
1e450 0a 2a 2a 20 74 68 61 74 20 73 79 6e 63 73 20 61  .** that syncs a
1e460 6e 64 20 66 75 6c 6c 73 79 6e 63 73 20 61 72 65  nd fullsyncs are
1e470 20 6f 63 63 75 72 72 69 6e 67 20 61 74 20 74 68   occurring at th
1e480 65 20 72 69 67 68 74 20 74 69 6d 65 73 2e 0a 2a  e right times..*
1e490 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 79  /.int sqlite3_sy
1e4a0 6e 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 69 6e  nc_count = 0;.in
1e4b0 74 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79  t sqlite3_fullsy
1e4c0 6e 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65  nc_count = 0;.#e
1e4d0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 65 20 64  ndif../*.** We d
1e4e0 6f 20 6e 6f 74 20 74 72 75 73 74 20 73 79 73 74  o not trust syst
1e4f0 65 6d 73 20 74 6f 20 70 72 6f 76 69 64 65 20 61  ems to provide a
1e500 20 77 6f 72 6b 69 6e 67 20 66 64 61 74 61 73 79   working fdatasy
1e510 6e 63 28 29 2e 20 20 53 6f 6d 65 20 64 6f 2e 0a  nc().  Some do..
1e520 2a 2a 20 4f 74 68 65 72 73 20 64 6f 20 6e 6f 2e  ** Others do no.
1e530 20 20 54 6f 20 62 65 20 73 61 66 65 2c 20 77 65    To be safe, we
1e540 20 77 69 6c 6c 20 73 74 69 63 6b 20 77 69 74 68   will stick with
1e550 20 74 68 65 20 28 73 6c 69 67 68 74 6c 79 20 73   the (slightly s
1e560 6c 6f 77 65 72 29 0a 2a 2a 20 66 73 79 6e 63 28  lower).** fsync(
1e570 29 2e 20 49 66 20 79 6f 75 20 6b 6e 6f 77 20 74  ). If you know t
1e580 68 61 74 20 79 6f 75 72 20 73 79 73 74 65 6d 20  hat your system 
1e590 64 6f 65 73 20 73 75 70 70 6f 72 74 20 66 64 61  does support fda
1e5a0 74 61 73 79 6e 63 28 29 20 63 6f 72 72 65 63 74  tasync() correct
1e5b0 6c 79 2c 0a 2a 2a 20 74 68 65 6e 20 73 69 6d 70  ly,.** then simp
1e5c0 6c 79 20 63 6f 6d 70 69 6c 65 20 77 69 74 68 20  ly compile with 
1e5d0 2d 44 66 64 61 74 61 73 79 6e 63 3d 66 64 61 74  -Dfdatasync=fdat
1e5e0 61 73 79 6e 63 0a 2a 2f 0a 23 69 66 20 21 64 65  async.*/.#if !de
1e5f0 66 69 6e 65 64 28 66 64 61 74 61 73 79 6e 63 29  fined(fdatasync)
1e600 0a 23 20 64 65 66 69 6e 65 20 66 64 61 74 61 73  .# define fdatas
1e610 79 6e 63 20 66 73 79 6e 63 0a 23 65 6e 64 69 66  ync fsync.#endif
1e620 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65 20 48  ../*.** Define H
1e630 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 74 6f  AVE_FULLFSYNC to
1e640 20 30 20 6f 72 20 31 20 64 65 70 65 6e 64 69 6e   0 or 1 dependin
1e650 67 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20  g on whether or 
1e660 6e 6f 74 0a 2a 2a 20 74 68 65 20 46 5f 46 55 4c  not.** the F_FUL
1e670 4c 46 53 59 4e 43 20 6d 61 63 72 6f 20 69 73 20  LFSYNC macro is 
1e680 64 65 66 69 6e 65 64 2e 20 20 46 5f 46 55 4c 4c  defined.  F_FULL
1e690 46 53 59 4e 43 20 69 73 20 63 75 72 72 65 6e 74  FSYNC is current
1e6a0 6c 79 0a 2a 2a 20 6f 6e 6c 79 20 61 76 61 69 6c  ly.** only avail
1e6b0 61 62 6c 65 20 6f 6e 20 4d 61 63 20 4f 53 20 58  able on Mac OS X
1e6c0 2e 20 20 42 75 74 20 74 68 61 74 20 63 6f 75 6c  .  But that coul
1e6d0 64 20 63 68 61 6e 67 65 2e 0a 2a 2f 0a 23 69 66  d change..*/.#if
1e6e0 64 65 66 20 46 5f 46 55 4c 4c 46 53 59 4e 43 0a  def F_FULLFSYNC.
1e6f0 23 20 64 65 66 69 6e 65 20 48 41 56 45 5f 46 55  # define HAVE_FU
1e700 4c 4c 46 53 59 4e 43 20 31 0a 23 65 6c 73 65 0a  LLFSYNC 1.#else.
1e710 23 20 64 65 66 69 6e 65 20 48 41 56 45 5f 46 55  # define HAVE_FU
1e720 4c 4c 46 53 59 4e 43 20 30 0a 23 65 6e 64 69 66  LLFSYNC 0.#endif
1e730 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
1e740 55 53 45 5f 52 45 51 55 45 53 54 5f 46 55 4c 4c  USE_REQUEST_FULL
1e750 46 53 59 4e 43 0a 23 69 6d 70 6f 72 74 20 3c 6e  FSYNC.#import <n
1e760 6f 74 69 66 79 2e 68 3e 0a 23 69 6d 70 6f 72 74  otify.h>.#import
1e770 20 3c 6c 69 62 6b 65 72 6e 2f 4f 53 41 74 6f 6d   <libkern/OSAtom
1e780 69 63 2e 68 3e 0a 73 74 61 74 69 63 20 4f 53 53  ic.h>.static OSS
1e790 70 69 6e 4c 6f 63 6b 20 6e 6f 74 69 66 79 5f 6c  pinLock notify_l
1e7a0 6f 63 6b 20 3d 20 30 3b 0a 23 64 65 66 69 6e 65  ock = 0;.#define
1e7b0 20 52 45 51 55 45 53 54 5f 46 55 4c 4c 53 59 4e   REQUEST_FULLSYN
1e7c0 43 5f 4e 4f 54 49 46 49 43 41 54 49 4f 4e 20 20  C_NOTIFICATION  
1e7d0 20 20 22 63 6f 6d 2e 61 70 70 6c 65 2e 72 65 71    "com.apple.req
1e7e0 73 79 6e 63 22 0a 23 65 6e 64 69 66 0a 0a 2f 2a  sync".#endif../*
1e7f0 0a 2a 2a 20 54 68 65 20 66 73 79 6e 63 28 29 20  .** The fsync() 
1e800 73 79 73 74 65 6d 20 63 61 6c 6c 20 64 6f 65 73  system call does
1e810 20 6e 6f 74 20 77 6f 72 6b 20 61 73 20 61 64 76   not work as adv
1e820 65 72 74 69 73 65 64 20 6f 6e 20 6d 61 6e 79 0a  ertised on many.
1e830 2a 2a 20 75 6e 69 78 20 73 79 73 74 65 6d 73 2e  ** unix systems.
1e840 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
1e850 70 72 6f 63 65 64 75 72 65 20 69 73 20 61 6e 20  procedure is an 
1e860 61 74 74 65 6d 70 74 20 74 6f 20 6d 61 6b 65 0a  attempt to make.
1e870 2a 2a 20 69 74 20 77 6f 72 6b 20 62 65 74 74 65  ** it work bette
1e880 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c  r..**.** The SQL
1e890 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 6d 61 63 72  ITE_NO_SYNC macr
1e8a0 6f 20 64 69 73 61 62 6c 65 73 20 61 6c 6c 20 66  o disables all f
1e8b0 73 79 6e 63 28 29 73 2e 20 20 54 68 69 73 20 69  sync()s.  This i
1e8c0 73 20 75 73 65 66 75 6c 0a 2a 2a 20 66 6f 72 20  s useful.** for 
1e8d0 74 65 73 74 69 6e 67 20 77 68 65 6e 20 77 65 20  testing when we 
1e8e0 77 61 6e 74 20 74 6f 20 72 75 6e 20 74 68 72 6f  want to run thro
1e8f0 75 67 68 20 74 68 65 20 74 65 73 74 20 73 75 69  ugh the test sui
1e900 74 65 20 71 75 69 63 6b 6c 79 2e 0a 2a 2a 20 59  te quickly..** Y
1e910 6f 75 20 61 72 65 20 73 74 72 6f 6e 67 6c 79 20  ou are strongly 
1e920 61 64 76 69 73 65 64 20 2a 6e 6f 74 2a 20 74 6f  advised *not* to
1e930 20 64 65 70 6c 6f 79 20 77 69 74 68 20 53 51 4c   deploy with SQL
1e940 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 2a 2a 20 65  ITE_NO_SYNC.** e
1e950 6e 61 62 6c 65 64 2c 20 68 6f 77 65 76 65 72 2c  nabled, however,
1e960 20 73 69 6e 63 65 20 77 69 74 68 20 53 51 4c 49   since with SQLI
1e970 54 45 5f 4e 4f 5f 53 59 4e 43 20 65 6e 61 62 6c  TE_NO_SYNC enabl
1e980 65 64 2c 20 61 6e 20 4f 53 20 63 72 61 73 68 0a  ed, an OS crash.
1e990 2a 2a 20 6f 72 20 70 6f 77 65 72 20 66 61 69 6c  ** or power fail
1e9a0 75 72 65 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20  ure will likely 
1e9b0 63 6f 72 72 75 70 74 20 74 68 65 20 64 61 74 61  corrupt the data
1e9c0 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  base file..**.**
1e9d0 20 53 51 4c 69 74 65 20 73 65 74 73 20 74 68 65   SQLite sets the
1e9e0 20 64 61 74 61 4f 6e 6c 79 20 66 6c 61 67 20 69   dataOnly flag i
1e9f0 66 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  f the size of th
1ea00 65 20 66 69 6c 65 20 69 73 20 75 6e 63 68 61 6e  e file is unchan
1ea10 67 65 64 2e 0a 2a 2a 20 54 68 65 20 69 64 65 61  ged..** The idea
1ea20 20 62 65 68 69 6e 64 20 64 61 74 61 4f 6e 6c 79   behind dataOnly
1ea30 20 69 73 20 74 68 61 74 20 69 74 20 73 68 6f 75   is that it shou
1ea40 6c 64 20 6f 6e 6c 79 20 77 72 69 74 65 20 74 68  ld only write th
1ea50 65 20 66 69 6c 65 20 63 6f 6e 74 65 6e 74 0a 2a  e file content.*
1ea60 2a 20 74 6f 20 64 69 73 6b 2c 20 6e 6f 74 20 74  * to disk, not t
1ea70 68 65 20 69 6e 6f 64 65 2e 20 20 57 65 20 6f 6e  he inode.  We on
1ea80 6c 79 20 73 65 74 20 64 61 74 61 4f 6e 6c 79 20  ly set dataOnly 
1ea90 69 66 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65  if the file size
1eaa0 20 69 73 20 0a 2a 2a 20 75 6e 63 68 61 6e 67 65   is .** unchange
1eab0 64 20 73 69 6e 63 65 20 74 68 65 20 66 69 6c 65  d since the file
1eac0 20 73 69 7a 65 20 69 73 20 70 61 72 74 20 6f 66   size is part of
1ead0 20 74 68 65 20 69 6e 6f 64 65 2e 20 20 48 6f 77   the inode.  How
1eae0 65 76 65 72 2c 20 0a 2a 2a 20 54 65 64 20 54 73  ever, .** Ted Ts
1eaf0 27 6f 20 74 65 6c 6c 73 20 75 73 20 74 68 61 74  'o tells us that
1eb00 20 66 64 61 74 61 73 79 6e 63 28 29 20 77 69 6c   fdatasync() wil
1eb10 6c 20 61 6c 73 6f 20 77 72 69 74 65 20 74 68 65  l also write the
1eb20 20 69 6e 6f 64 65 20 69 66 20 74 68 65 0a 2a 2a   inode if the.**
1eb30 20 66 69 6c 65 20 73 69 7a 65 20 68 61 73 20 63   file size has c
1eb40 68 61 6e 67 65 64 2e 20 20 54 68 65 20 6f 6e 6c  hanged.  The onl
1eb50 79 20 72 65 61 6c 20 64 69 66 66 65 72 65 6e 63  y real differenc
1eb60 65 20 62 65 74 77 65 65 6e 20 66 64 61 74 61 73  e between fdatas
1eb70 79 6e 63 28 29 0a 2a 2a 20 61 6e 64 20 66 73 79  ync().** and fsy
1eb80 6e 63 28 29 2c 20 54 65 64 20 74 65 6c 6c 73 20  nc(), Ted tells 
1eb90 75 73 2c 20 69 73 20 74 68 61 74 20 66 64 61 74  us, is that fdat
1eba0 61 73 79 6e 63 28 29 20 77 69 6c 6c 20 6e 6f 74  async() will not
1ebb0 20 66 6c 75 73 68 20 74 68 65 0a 2a 2a 20 69 6e   flush the.** in
1ebc0 6f 64 65 20 69 66 20 74 68 65 20 6d 74 69 6d 65  ode if the mtime
1ebd0 20 6f 72 20 6f 77 6e 65 72 20 6f 72 20 6f 74 68   or owner or oth
1ebe0 65 72 20 69 6e 6f 64 65 20 61 74 74 72 69 62 75  er inode attribu
1ebf0 74 65 73 20 68 61 76 65 20 63 68 61 6e 67 65 64  tes have changed
1ec00 2e 0a 2a 2a 20 57 65 20 6f 6e 6c 79 20 63 61 72  ..** We only car
1ec10 65 20 61 62 6f 75 74 20 74 68 65 20 66 69 6c 65  e about the file
1ec20 20 73 69 7a 65 2c 20 6e 6f 74 20 74 68 65 20 6f   size, not the o
1ec30 74 68 65 72 20 66 69 6c 65 20 61 74 74 72 69 62  ther file attrib
1ec40 75 74 65 73 2c 20 73 6f 0a 2a 2a 20 61 73 20 66  utes, so.** as f
1ec50 61 72 20 61 73 20 53 51 4c 69 74 65 20 69 73 20  ar as SQLite is 
1ec60 63 6f 6e 63 65 72 6e 65 64 2c 20 61 6e 20 66 64  concerned, an fd
1ec70 61 74 61 73 79 6e 63 28 29 20 69 73 20 61 6c 77  atasync() is alw
1ec80 61 79 73 20 61 64 65 71 75 61 74 65 2e 0a 2a 2a  ays adequate..**
1ec90 20 53 6f 2c 20 77 65 20 61 6c 77 61 79 73 20 75   So, we always u
1eca0 73 65 20 66 64 61 74 61 73 79 6e 63 28 29 20 69  se fdatasync() i
1ecb0 66 20 69 74 20 69 73 20 61 76 61 69 6c 61 62 6c  f it is availabl
1ecc0 65 2c 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66  e, regardless of
1ecd0 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66  .** the value of
1ece0 20 74 68 65 20 64 61 74 61 4f 6e 6c 79 20 66 6c   the dataOnly fl
1ecf0 61 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ag..*/.static in
1ed00 74 20 66 75 6c 6c 5f 66 73 79 6e 63 28 69 6e 74  t full_fsync(int
1ed10 20 66 64 2c 20 69 6e 74 20 66 75 6c 6c 53 79 6e   fd, int fullSyn
1ed20 63 2c 20 69 6e 74 20 64 61 74 61 4f 6e 6c 79 29  c, int dataOnly)
1ed30 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f  {.  int rc;..  /
1ed40 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
1ed50 22 69 66 64 65 66 2f 65 6c 69 66 2f 65 6c 73 65  "ifdef/elif/else
1ed60 2f 22 20 62 6c 6f 63 6b 20 68 61 73 20 74 68 65  /" block has the
1ed70 20 73 61 6d 65 20 73 74 72 75 63 74 75 72 65 20   same structure 
1ed80 61 73 0a 20 20 2a 2a 20 74 68 65 20 6f 6e 65 20  as.  ** the one 
1ed90 62 65 6c 6f 77 2e 20 49 74 20 69 73 20 72 65 70  below. It is rep
1eda0 6c 69 63 61 74 65 64 20 68 65 72 65 20 73 6f 6c  licated here sol
1edb0 65 6c 79 20 74 6f 20 61 76 6f 69 64 20 63 6c 75  ely to avoid clu
1edc0 74 74 65 72 69 6e 67 20 0a 20 20 2a 2a 20 75 70  ttering .  ** up
1edd0 20 74 68 65 20 72 65 61 6c 20 63 6f 64 65 20 77   the real code w
1ede0 69 74 68 20 74 68 65 20 55 4e 55 53 45 44 5f 50  ith the UNUSED_P
1edf0 41 52 41 4d 45 54 45 52 28 29 20 6d 61 63 72 6f  ARAMETER() macro
1ee00 73 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53  s..  */.#ifdef S
1ee10 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20  QLITE_NO_SYNC.  
1ee20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
1ee30 28 66 64 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  (fd);.  UNUSED_P
1ee40 41 52 41 4d 45 54 45 52 28 66 75 6c 6c 53 79 6e  ARAMETER(fullSyn
1ee50 63 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  c);.  UNUSED_PAR
1ee60 41 4d 45 54 45 52 28 64 61 74 61 4f 6e 6c 79 29  AMETER(dataOnly)
1ee70 3b 0a 23 65 6c 69 66 20 48 41 56 45 5f 46 55 4c  ;.#elif HAVE_FUL
1ee80 4c 46 53 59 4e 43 0a 20 20 55 4e 55 53 45 44 5f  LFSYNC.  UNUSED_
1ee90 50 41 52 41 4d 45 54 45 52 28 64 61 74 61 4f 6e  PARAMETER(dataOn
1eea0 6c 79 29 3b 0a 23 65 6c 73 65 0a 20 20 55 4e 55  ly);.#else.  UNU
1eeb0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66 75  SED_PARAMETER(fu
1eec0 6c 6c 53 79 6e 63 29 3b 0a 20 20 55 4e 55 53 45  llSync);.  UNUSE
1eed0 44 5f 50 41 52 41 4d 45 54 45 52 28 64 61 74 61  D_PARAMETER(data
1eee0 4f 6e 6c 79 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  Only);.#endif.. 
1eef0 20 2f 2a 20 52 65 63 6f 72 64 20 74 68 65 20 6e   /* Record the n
1ef00 75 6d 62 65 72 20 6f 66 20 74 69 6d 65 73 20 74  umber of times t
1ef10 68 61 74 20 77 65 20 64 6f 20 61 20 6e 6f 72 6d  hat we do a norm
1ef20 61 6c 20 66 73 79 6e 63 28 29 20 61 6e 64 20 0a  al fsync() and .
1ef30 20 20 2a 2a 20 46 55 4c 4c 53 59 4e 43 2e 20 20    ** FULLSYNC.  
1ef40 54 68 69 73 20 69 73 20 75 73 65 64 20 64 75 72  This is used dur
1ef50 69 6e 67 20 74 65 73 74 69 6e 67 20 74 6f 20 76  ing testing to v
1ef60 65 72 69 66 79 20 74 68 61 74 20 74 68 69 73 20  erify that this 
1ef70 70 72 6f 63 65 64 75 72 65 0a 20 20 2a 2a 20 67  procedure.  ** g
1ef80 65 74 73 20 63 61 6c 6c 65 64 20 77 69 74 68 20  ets called with 
1ef90 74 68 65 20 63 6f 72 72 65 63 74 20 61 72 67 75  the correct argu
1efa0 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 23 69 66 64  ments..  */.#ifd
1efb0 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
1efc0 20 69 66 28 20 66 75 6c 6c 53 79 6e 63 20 29 20   if( fullSync ) 
1efd0 73 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63  sqlite3_fullsync
1efe0 5f 63 6f 75 6e 74 2b 2b 3b 0a 20 20 73 71 6c 69  _count++;.  sqli
1eff0 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b  te3_sync_count++
1f000 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49  ;.#endif..  /* I
1f010 66 20 77 65 20 63 6f 6d 70 69 6c 65 64 20 77 69  f we compiled wi
1f020 74 68 20 74 68 65 20 53 51 4c 49 54 45 5f 4e 4f  th the SQLITE_NO
1f030 5f 53 59 4e 43 20 66 6c 61 67 2c 20 74 68 65 6e  _SYNC flag, then
1f040 20 73 79 6e 63 69 6e 67 20 69 73 20 61 0a 20 20   syncing is a.  
1f050 2a 2a 20 6e 6f 2d 6f 70 0a 20 20 2a 2f 0a 23 69  ** no-op.  */.#i
1f060 66 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53  fdef SQLITE_NO_S
1f070 59 4e 43 0a 20 20 72 63 20 3d 20 53 51 4c 49 54  YNC.  rc = SQLIT
1f080 45 5f 4f 4b 3b 0a 23 65 6c 69 66 20 48 41 56 45  E_OK;.#elif HAVE
1f090 5f 46 55 4c 4c 46 53 59 4e 43 0a 20 20 69 66 28  _FULLFSYNC.  if(
1f0a0 20 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 23 69 66   fullSync ){.#if
1f0b0 64 65 66 20 53 51 4c 49 54 45 5f 55 53 45 5f 52  def SQLITE_USE_R
1f0c0 45 51 55 45 53 54 5f 46 55 4c 4c 46 53 59 4e 43  EQUEST_FULLFSYNC
1f0d0 0a 20 20 20 20 72 63 20 3d 20 6f 73 46 73 79 6e  .    rc = osFsyn
1f0e0 63 28 66 64 29 3b 0a 20 20 20 20 69 66 20 28 21  c(fd);.    if (!
1f0f0 72 63 29 20 7b 0a 20 20 20 20 20 20 4f 53 53 70  rc) {.      OSSp
1f100 69 6e 4c 6f 63 6b 4c 6f 63 6b 28 26 6e 6f 74 69  inLockLock(&noti
1f110 66 79 5f 6c 6f 63 6b 29 3b 0a 20 20 20 20 20 20  fy_lock);.      
1f120 72 63 20 3d 20 6e 6f 74 69 66 79 5f 70 6f 73 74  rc = notify_post
1f130 28 52 45 51 55 45 53 54 5f 46 55 4c 4c 53 59 4e  (REQUEST_FULLSYN
1f140 43 5f 4e 4f 54 49 46 49 43 41 54 49 4f 4e 29 3b  C_NOTIFICATION);
1f150 0a 20 20 20 20 20 20 4f 53 53 70 69 6e 4c 6f 63  .      OSSpinLoc
1f160 6b 55 6e 6c 6f 63 6b 28 26 6e 6f 74 69 66 79 5f  kUnlock(&notify_
1f170 6c 6f 63 6b 29 3b 0a 20 20 20 20 7d 0a 23 65 6c  lock);.    }.#el
1f180 73 65 0a 20 20 20 20 72 63 20 3d 20 6f 73 46 63  se.    rc = osFc
1f190 6e 74 6c 28 66 64 2c 20 46 5f 46 55 4c 4c 46 53  ntl(fd, F_FULLFS
1f1a0 59 4e 43 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a  YNC, 0);.#endif.
1f1b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
1f1c0 3d 20 31 3b 0a 20 20 7d 0a 20 20 2f 2a 20 49 66  = 1;.  }.  /* If
1f1d0 20 74 68 65 20 46 55 4c 4c 46 53 59 4e 43 20 66   the FULLFSYNC f
1f1e0 61 69 6c 65 64 2c 20 66 61 6c 6c 20 62 61 63 6b  ailed, fall back
1f1f0 20 74 6f 20 61 74 74 65 6d 70 74 69 6e 67 20 61   to attempting a
1f200 6e 20 66 73 79 6e 63 28 29 2e 0a 20 20 2a 2a 20  n fsync()..  ** 
1f210 49 74 20 73 68 6f 75 6c 64 6e 27 74 20 62 65 20  It shouldn't be 
1f220 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 66 75 6c  possible for ful
1f230 6c 66 73 79 6e 63 20 74 6f 20 66 61 69 6c 20 6f  lfsync to fail o
1f240 6e 20 74 68 65 20 6c 6f 63 61 6c 20 0a 20 20 2a  n the local .  *
1f250 2a 20 66 69 6c 65 20 73 79 73 74 65 6d 20 28 6f  * file system (o
1f260 6e 20 4f 53 58 29 2c 20 73 6f 20 66 61 69 6c 75  n OSX), so failu
1f270 72 65 20 69 6e 64 69 63 61 74 65 73 20 74 68 61  re indicates tha
1f280 74 20 46 55 4c 4c 46 53 59 4e 43 0a 20 20 2a 2a  t FULLFSYNC.  **
1f290 20 69 73 6e 27 74 20 73 75 70 70 6f 72 74 65 64   isn't supported
1f2a0 20 66 6f 72 20 74 68 69 73 20 66 69 6c 65 20 73   for this file s
1f2b0 79 73 74 65 6d 2e 20 53 6f 2c 20 61 74 74 65 6d  ystem. So, attem
1f2c0 70 74 20 61 6e 20 66 73 79 6e 63 20 0a 20 20 2a  pt an fsync .  *
1f2d0 2a 20 61 6e 64 20 28 66 6f 72 20 6e 6f 77 29 20  * and (for now) 
1f2e0 69 67 6e 6f 72 65 20 74 68 65 20 6f 76 65 72 68  ignore the overh
1f2f0 65 61 64 20 6f 66 20 61 20 73 75 70 65 72 66 6c  ead of a superfl
1f300 75 6f 75 73 20 66 63 6e 74 6c 20 63 61 6c 6c 2e  uous fcntl call.
1f310 20 20 0a 20 20 2a 2a 20 49 74 27 64 20 62 65 20    .  ** It'd be 
1f320 62 65 74 74 65 72 20 74 6f 20 64 65 74 65 63 74  better to detect
1f330 20 66 75 6c 6c 66 73 79 6e 63 20 73 75 70 70 6f   fullfsync suppo
1f340 72 74 20 6f 6e 63 65 20 61 6e 64 20 61 76 6f 69  rt once and avoi
1f350 64 20 0a 20 20 2a 2a 20 74 68 65 20 66 63 6e 74  d .  ** the fcnt
1f360 6c 20 63 61 6c 6c 20 65 76 65 72 79 20 74 69 6d  l call every tim
1f370 65 20 73 79 6e 63 20 69 73 20 63 61 6c 6c 65 64  e sync is called
1f380 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 20  ..  */.  if( rc 
1f390 29 20 72 63 20 3d 20 66 73 79 6e 63 28 66 64 29  ) rc = fsync(fd)
1f3a0 3b 0a 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64  ;..#elif defined
1f3b0 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 2f 2a  (__APPLE__).  /*
1f3c0 20 66 64 61 74 61 73 79 6e 63 28 29 20 6f 6e 20   fdatasync() on 
1f3d0 48 46 53 2b 20 64 6f 65 73 6e 27 74 20 79 65 74  HFS+ doesn't yet
1f3e0 20 66 6c 75 73 68 20 74 68 65 20 66 69 6c 65 20   flush the file 
1f3f0 73 69 7a 65 20 69 66 20 69 74 20 63 68 61 6e 67  size if it chang
1f400 65 64 20 63 6f 72 72 65 63 74 6c 79 0a 20 20 2a  ed correctly.  *
1f410 2a 20 73 6f 20 63 75 72 72 65 6e 74 6c 79 20 77  * so currently w
1f420 65 20 64 65 66 61 75 6c 74 20 74 6f 20 74 68 65  e default to the
1f430 20 6d 61 63 72 6f 20 74 68 61 74 20 72 65 64 65   macro that rede
1f440 66 69 6e 65 73 20 66 64 61 74 61 73 79 6e 63 20  fines fdatasync 
1f450 74 6f 20 66 73 79 6e 63 0a 20 20 2a 2f 0a 20 20  to fsync.  */.  
1f460 72 63 20 3d 20 66 73 79 6e 63 28 66 64 29 3b 0a  rc = fsync(fd);.
1f470 23 65 6c 73 65 20 0a 20 20 72 63 20 3d 20 66 64  #else .  rc = fd
1f480 61 74 61 73 79 6e 63 28 66 64 29 3b 0a 23 69 66  atasync(fd);.#if
1f490 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 69 66   OS_VXWORKS.  if
1f4a0 28 20 72 63 3d 3d 2d 31 20 26 26 20 65 72 72 6e  ( rc==-1 && errn
1f4b0 6f 3d 3d 45 4e 4f 54 53 55 50 20 29 7b 0a 20 20  o==ENOTSUP ){.  
1f4c0 20 20 72 63 20 3d 20 66 73 79 6e 63 28 66 64 29    rc = fsync(fd)
1f4d0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ;.  }.#endif /* 
1f4e0 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 23 65  OS_VXWORKS */.#e
1f4f0 6e 64 69 66 20 2f 2a 20 69 66 64 65 66 20 53 51  ndif /* ifdef SQ
1f500 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 65 6c 69  LITE_NO_SYNC eli
1f510 66 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43  f HAVE_FULLFSYNC
1f520 20 2a 2f 0a 0a 20 20 69 66 28 20 4f 53 5f 56 58   */..  if( OS_VX
1f530 57 4f 52 4b 53 20 26 26 20 72 63 21 3d 20 2d 31  WORKS && rc!= -1
1f540 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 30 3b 0a   ){.    rc = 0;.
1f550 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
1f560 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61  .}../*.** Open a
1f570 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
1f580 20 74 6f 20 74 68 65 20 64 69 72 65 63 74 6f 72   to the director
1f590 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20 66 69 6c  y containing fil
1f5a0 65 20 7a 46 69 6c 65 6e 61 6d 65 2e 0a 2a 2a 20  e zFilename..** 
1f5b0 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 2a  If successful, *
1f5c0 70 46 64 20 69 73 20 73 65 74 20 74 6f 20 74 68  pFd is set to th
1f5d0 65 20 6f 70 65 6e 65 64 20 66 69 6c 65 20 64 65  e opened file de
1f5e0 73 63 72 69 70 74 6f 72 20 61 6e 64 0a 2a 2a 20  scriptor and.** 
1f5f0 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
1f600 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 65 72 72  urned. If an err
1f610 6f 72 20 6f 63 63 75 72 73 2c 20 65 69 74 68 65  or occurs, eithe
1f620 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a  r SQLITE_NOMEM.*
1f630 2a 20 6f 72 20 53 51 4c 49 54 45 5f 43 41 4e 54  * or SQLITE_CANT
1f640 4f 50 45 4e 20 69 73 20 72 65 74 75 72 6e 65 64  OPEN is returned
1f650 20 61 6e 64 20 2a 70 46 64 20 69 73 20 73 65 74   and *pFd is set
1f660 20 74 6f 20 61 6e 20 75 6e 64 65 66 69 6e 65 64   to an undefined
1f670 0a 2a 2a 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a  .** value..**.**
1f680 20 54 68 65 20 64 69 72 65 63 74 6f 72 79 20 66   The directory f
1f690 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
1f6a0 73 20 75 73 65 64 20 66 6f 72 20 6f 6e 6c 79 20  s used for only 
1f6b0 6f 6e 65 20 74 68 69 6e 67 20 2d 20 74 6f 0a 2a  one thing - to.*
1f6c0 2a 20 66 73 79 6e 63 28 29 20 61 20 64 69 72 65  * fsync() a dire
1f6d0 63 74 6f 72 79 20 74 6f 20 6d 61 6b 65 20 73 75  ctory to make su
1f6e0 72 65 20 66 69 6c 65 20 63 72 65 61 74 69 6f 6e  re file creation
1f6f0 20 61 6e 64 20 64 65 6c 65 74 69 6f 6e 20 65 76   and deletion ev
1f700 65 6e 74 73 0a 2a 2a 20 61 72 65 20 66 6c 75 73  ents.** are flus
1f710 68 65 64 20 74 6f 20 64 69 73 6b 2e 20 20 53 75  hed to disk.  Su
1f720 63 68 20 66 73 79 6e 63 73 20 61 72 65 20 6e 6f  ch fsyncs are no
1f730 74 20 6e 65 65 64 65 64 20 6f 6e 20 6e 65 77 65  t needed on newe
1f740 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 69 6e 67 20  r.** journaling 
1f750 66 69 6c 65 73 79 73 74 65 6d 73 2c 20 62 75 74  filesystems, but
1f760 20 61 72 65 20 72 65 71 75 69 72 65 64 20 6f 6e   are required on
1f770 20 6f 6c 64 65 72 20 66 69 6c 65 73 79 73 74 65   older filesyste
1f780 6d 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ms..**.** This r
1f790 6f 75 74 69 6e 65 20 63 61 6e 20 62 65 20 6f 76  outine can be ov
1f7a0 65 72 72 69 64 64 65 6e 20 75 73 69 6e 67 20 74  erridden using t
1f7b0 68 65 20 78 53 65 74 53 79 73 43 61 6c 6c 20 69  he xSetSysCall i
1f7c0 6e 74 65 72 66 61 63 65 2e 0a 2a 2a 20 54 68 65  nterface..** The
1f7d0 20 61 62 69 6c 69 74 79 20 74 6f 20 6f 76 65 72   ability to over
1f7e0 72 69 64 65 20 74 68 69 73 20 72 6f 75 74 69 6e  ride this routin
1f7f0 65 20 77 61 73 20 61 64 64 65 64 20 69 6e 20 73  e was added in s
1f800 75 70 70 6f 72 74 20 6f 66 20 74 68 65 0a 2a 2a  upport of the.**
1f810 20 63 68 72 6f 6d 69 75 6d 20 73 61 6e 64 62 6f   chromium sandbo
1f820 78 2e 20 20 4f 70 65 6e 69 6e 67 20 61 20 64 69  x.  Opening a di
1f830 72 65 63 74 6f 72 79 20 69 73 20 61 20 73 65 63  rectory is a sec
1f840 75 72 69 74 79 20 72 69 73 6b 20 28 77 65 20 61  urity risk (we a
1f850 72 65 0a 2a 2a 20 74 6f 6c 64 29 20 73 6f 20 6d  re.** told) so m
1f860 61 6b 69 6e 67 20 69 74 20 6f 76 65 72 72 69 64  aking it overrid
1f870 65 61 62 6c 65 20 61 6c 6c 6f 77 73 20 74 68 65  eable allows the
1f880 20 63 68 72 6f 6d 69 75 6d 20 73 61 6e 64 62 6f   chromium sandbo
1f890 78 20 74 6f 0a 2a 2a 20 72 65 70 6c 61 63 65 20  x to.** replace 
1f8a0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 74  this routine wit
1f8b0 68 20 61 20 68 61 72 6d 6c 65 73 73 20 6e 6f 2d  h a harmless no-
1f8c0 6f 70 2e 20 20 54 6f 20 6d 61 6b 65 20 74 68 69  op.  To make thi
1f8d0 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 20 6e  s routine.** a n
1f8e0 6f 2d 6f 70 2c 20 72 65 70 6c 61 63 65 20 69 74  o-op, replace it
1f8f0 20 77 69 74 68 20 61 20 73 74 75 62 20 74 68 61   with a stub tha
1f900 74 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  t returns SQLITE
1f910 5f 4f 4b 20 62 75 74 20 6c 65 61 76 65 73 0a 2a  _OK but leaves.*
1f920 2a 20 2a 70 46 64 20 73 65 74 20 74 6f 20 61 20  * *pFd set to a 
1f930 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72 2e  negative number.
1f940 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45  .**.** If SQLITE
1f950 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2c  _OK is returned,
1f960 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20 72   the caller is r
1f970 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 63  esponsible for c
1f980 6c 6f 73 69 6e 67 0a 2a 2a 20 74 68 65 20 66 69  losing.** the fi
1f990 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a 70  le descriptor *p
1f9a0 46 64 20 75 73 69 6e 67 20 63 6c 6f 73 65 28 29  Fd using close()
1f9b0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1f9c0 6f 70 65 6e 44 69 72 65 63 74 6f 72 79 28 63 6f  openDirectory(co
1f9d0 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
1f9e0 61 6d 65 2c 20 69 6e 74 20 2a 70 46 64 29 7b 0a  ame, int *pFd){.
1f9f0 20 20 69 6e 74 20 69 69 3b 0a 20 20 69 6e 74 20    int ii;.  int 
1fa00 66 64 20 3d 20 2d 31 3b 0a 20 20 63 68 61 72 20  fd = -1;.  char 
1fa10 7a 44 69 72 6e 61 6d 65 5b 4d 41 58 5f 50 41 54  zDirname[MAX_PAT
1fa20 48 4e 41 4d 45 2b 31 5d 3b 0a 0a 20 20 73 71 6c  HNAME+1];..  sql
1fa30 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 41  ite3_snprintf(MA
1fa40 58 5f 50 41 54 48 4e 41 4d 45 2c 20 7a 44 69 72  X_PATHNAME, zDir
1fa50 6e 61 6d 65 2c 20 22 25 73 22 2c 20 7a 46 69 6c  name, "%s", zFil
1fa60 65 6e 61 6d 65 29 3b 0a 20 20 66 6f 72 28 69 69  ename);.  for(ii
1fa70 3d 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 44 69  =(int)strlen(zDi
1fa80 72 6e 61 6d 65 29 3b 20 69 69 3e 31 20 26 26 20  rname); ii>1 && 
1fa90 7a 44 69 72 6e 61 6d 65 5b 69 69 5d 21 3d 27 2f  zDirname[ii]!='/
1faa0 27 3b 20 69 69 2d 2d 29 3b 0a 20 20 69 66 28 20  '; ii--);.  if( 
1fab0 69 69 3e 30 20 29 7b 0a 20 20 20 20 7a 44 69 72  ii>0 ){.    zDir
1fac0 6e 61 6d 65 5b 69 69 5d 20 3d 20 27 5c 30 27 3b  name[ii] = '\0';
1fad0 0a 20 20 20 20 66 64 20 3d 20 72 6f 62 75 73 74  .    fd = robust
1fae0 5f 6f 70 65 6e 28 7a 44 69 72 6e 61 6d 65 2c 20  _open(zDirname, 
1faf0 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f 42 49 4e 41 52  O_RDONLY|O_BINAR
1fb00 59 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 66  Y, 0);.    if( f
1fb10 64 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 4f 53  d>=0 ){.      OS
1fb20 54 52 41 43 45 28 28 22 4f 50 45 4e 44 49 52 20  TRACE(("OPENDIR 
1fb30 25 2d 33 64 20 25 73 5c 6e 22 2c 20 66 64 2c 20  %-3d %s\n", fd, 
1fb40 7a 44 69 72 6e 61 6d 65 29 29 3b 0a 20 20 20 20  zDirname));.    
1fb50 7d 0a 20 20 7d 0a 20 20 2a 70 46 64 20 3d 20 66  }.  }.  *pFd = f
1fb60 64 3b 0a 20 20 72 65 74 75 72 6e 20 28 66 64 3e  d;.  return (fd>
1fb70 3d 30 3f 53 51 4c 49 54 45 5f 4f 4b 3a 75 6e 69  =0?SQLITE_OK:uni
1fb80 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  xLogError(SQLITE
1fb90 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c 20  _CANTOPEN_BKPT, 
1fba0 22 6f 70 65 6e 22 2c 20 7a 44 69 72 6e 61 6d 65  "open", zDirname
1fbb0 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b  ));.}../*.** Mak
1fbc0 65 20 73 75 72 65 20 61 6c 6c 20 77 72 69 74 65  e sure all write
1fbd0 73 20 74 6f 20 61 20 70 61 72 74 69 63 75 6c 61  s to a particula
1fbe0 72 20 66 69 6c 65 20 61 72 65 20 63 6f 6d 6d 69  r file are commi
1fbf0 74 74 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a  tted to disk..**
1fc00 0a 2a 2a 20 49 66 20 64 61 74 61 4f 6e 6c 79 3d  .** If dataOnly=
1fc10 3d 30 20 74 68 65 6e 20 62 6f 74 68 20 74 68 65  =0 then both the
1fc20 20 66 69 6c 65 20 69 74 73 65 6c 66 20 61 6e 64   file itself and
1fc30 20 69 74 73 20 6d 65 74 61 64 61 74 61 20 28 66   its metadata (f
1fc40 69 6c 65 0a 2a 2a 20 73 69 7a 65 2c 20 61 63 63  ile.** size, acc
1fc50 65 73 73 20 74 69 6d 65 2c 20 65 74 63 29 20 61  ess time, etc) a
1fc60 72 65 20 73 79 6e 63 65 64 2e 20 20 49 66 20 64  re synced.  If d
1fc70 61 74 61 4f 6e 6c 79 21 3d 30 20 74 68 65 6e 20  ataOnly!=0 then 
1fc80 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 66 69 6c 65  only the.** file
1fc90 20 64 61 74 61 20 69 73 20 73 79 6e 63 65 64 2e   data is synced.
1fca0 0a 2a 2a 0a 2a 2a 20 55 6e 64 65 72 20 55 6e 69  .**.** Under Uni
1fcb0 78 2c 20 61 6c 73 6f 20 6d 61 6b 65 20 73 75 72  x, also make sur
1fcc0 65 20 74 68 61 74 20 74 68 65 20 64 69 72 65 63  e that the direc
1fcd0 74 6f 72 79 20 65 6e 74 72 79 20 66 6f 72 20 74  tory entry for t
1fce0 68 65 20 66 69 6c 65 0a 2a 2a 20 68 61 73 20 62  he file.** has b
1fcf0 65 65 6e 20 63 72 65 61 74 65 64 20 62 79 20 66  een created by f
1fd00 73 79 6e 63 2d 69 6e 67 20 74 68 65 20 64 69 72  sync-ing the dir
1fd10 65 63 74 6f 72 79 20 74 68 61 74 20 63 6f 6e 74  ectory that cont
1fd20 61 69 6e 73 20 74 68 65 20 66 69 6c 65 2e 0a 2a  ains the file..*
1fd30 2a 20 49 66 20 77 65 20 64 6f 20 6e 6f 74 20 64  * If we do not d
1fd40 6f 20 74 68 69 73 20 61 6e 64 20 77 65 20 65 6e  o this and we en
1fd50 63 6f 75 6e 74 65 72 20 61 20 70 6f 77 65 72 20  counter a power 
1fd60 66 61 69 6c 75 72 65 2c 20 74 68 65 20 64 69 72  failure, the dir
1fd70 65 63 74 6f 72 79 0a 2a 2a 20 65 6e 74 72 79 20  ectory.** entry 
1fd80 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  for the journal 
1fd90 6d 69 67 68 74 20 6e 6f 74 20 65 78 69 73 74 20  might not exist 
1fda0 61 66 74 65 72 20 77 65 20 72 65 62 6f 6f 74 2e  after we reboot.
1fdb0 20 20 54 68 65 20 6e 65 78 74 0a 2a 2a 20 53 51    The next.** SQ
1fdc0 4c 69 74 65 20 74 6f 20 61 63 63 65 73 73 20 74  Lite to access t
1fdd0 68 65 20 66 69 6c 65 20 77 69 6c 6c 20 6e 6f 74  he file will not
1fde0 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20 6a   know that the j
1fdf0 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 20 28 62  ournal exists (b
1fe00 65 63 61 75 73 65 0a 2a 2a 20 74 68 65 20 64 69  ecause.** the di
1fe10 72 65 63 74 6f 72 79 20 65 6e 74 72 79 20 66 6f  rectory entry fo
1fe20 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61  r the journal wa
1fe30 73 20 6e 65 76 65 72 20 63 72 65 61 74 65 64 29  s never created)
1fe40 20 61 6e 64 20 74 68 65 20 74 72 61 6e 73 61 63   and the transac
1fe50 74 69 6f 6e 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74  tion.** will not
1fe60 20 72 6f 6c 6c 20 62 61 63 6b 20 2d 20 70 6f 73   roll back - pos
1fe70 73 69 62 6c 79 20 6c 65 61 64 69 6e 67 20 74 6f  sibly leading to
1fe80 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   database corrup
1fe90 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
1fea0 69 6e 74 20 75 6e 69 78 53 79 6e 63 28 73 71 6c  int unixSync(sql
1feb0 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
1fec0 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 69 6e 74  nt flags){.  int
1fed0 20 72 63 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20   rc;.  unixFile 
1fee0 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
1fef0 6c 65 2a 29 69 64 3b 0a 0a 20 20 69 6e 74 20 69  le*)id;..  int i
1ff00 73 44 61 74 61 4f 6e 6c 79 20 3d 20 28 66 6c 61  sDataOnly = (fla
1ff10 67 73 26 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44  gs&SQLITE_SYNC_D
1ff20 41 54 41 4f 4e 4c 59 29 3b 0a 20 20 69 6e 74 20  ATAONLY);.  int 
1ff30 69 73 46 75 6c 6c 73 79 6e 63 20 3d 20 28 66 6c  isFullsync = (fl
1ff40 61 67 73 26 30 78 30 46 29 3d 3d 53 51 4c 49 54  ags&0x0F)==SQLIT
1ff50 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a 0a 20 20  E_SYNC_FULL;..  
1ff60 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 6f 6e  /* Check that on
1ff70 65 20 6f 66 20 53 51 4c 49 54 45 5f 53 59 4e 43  e of SQLITE_SYNC
1ff80 5f 4e 4f 52 4d 41 4c 20 6f 72 20 46 55 4c 4c 20  _NORMAL or FULL 
1ff90 77 61 73 20 70 61 73 73 65 64 20 2a 2f 0a 20 20  was passed */.  
1ffa0 61 73 73 65 72 74 28 28 66 6c 61 67 73 26 30 78  assert((flags&0x
1ffb0 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43  0F)==SQLITE_SYNC
1ffc0 5f 4e 4f 52 4d 41 4c 0a 20 20 20 20 20 20 7c 7c  _NORMAL.      ||
1ffd0 20 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53   (flags&0x0F)==S
1ffe0 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 0a  QLITE_SYNC_FULL.
1fff0 20 20 29 3b 0a 0a 20 20 2f 2a 20 55 6e 69 78 20    );..  /* Unix 
20000 63 61 6e 6e 6f 74 2c 20 62 75 74 20 73 6f 6d 65  cannot, but some
20010 20 73 79 73 74 65 6d 73 20 6d 61 79 20 72 65 74   systems may ret
20020 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20  urn SQLITE_FULL 
20030 66 72 6f 6d 20 68 65 72 65 2e 20 54 68 69 73 0a  from here. This.
20040 20 20 2a 2a 20 6c 69 6e 65 20 69 73 20 74 6f 20    ** line is to 
20050 74 65 73 74 20 74 68 61 74 20 64 6f 69 6e 67 20  test that doing 
20060 73 6f 20 64 6f 65 73 20 6e 6f 74 20 63 61 75 73  so does not caus
20070 65 20 61 6e 79 20 70 72 6f 62 6c 65 6d 73 2e 0a  e any problems..
20080 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65 44    */.  SimulateD
20090 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28 20 72 65  iskfullError( re
200a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c  turn SQLITE_FULL
200b0 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   );..  assert( p
200c0 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43  File );.  OSTRAC
200d0 45 28 28 22 53 59 4e 43 20 20 20 20 25 2d 33 64  E(("SYNC    %-3d
200e0 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b  \n", pFile->h));
200f0 0a 20 20 72 63 20 3d 20 66 75 6c 6c 5f 66 73 79  .  rc = full_fsy
20100 6e 63 28 70 46 69 6c 65 2d 3e 68 2c 20 69 73 46  nc(pFile->h, isF
20110 75 6c 6c 73 79 6e 63 2c 20 69 73 44 61 74 61 4f  ullsync, isDataO
20120 6e 6c 79 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65  nly);.  Simulate
20130 49 4f 45 72 72 6f 72 28 20 72 63 3d 31 20 29 3b  IOError( rc=1 );
20140 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
20150 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28   storeLastErrno(
20160 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 20  pFile, errno);. 
20170 20 20 20 72 65 74 75 72 6e 20 75 6e 69 78 4c 6f     return unixLo
20180 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
20190 45 52 52 5f 46 53 59 4e 43 2c 20 22 66 75 6c 6c  ERR_FSYNC, "full
201a0 5f 66 73 79 6e 63 22 2c 20 70 46 69 6c 65 2d 3e  _fsync", pFile->
201b0 7a 50 61 74 68 29 3b 0a 20 20 7d 0a 0a 20 20 2f  zPath);.  }..  /
201c0 2a 20 41 6c 73 6f 20 66 73 79 6e 63 20 74 68 65  * Also fsync the
201d0 20 64 69 72 65 63 74 6f 72 79 20 63 6f 6e 74 61   directory conta
201e0 69 6e 69 6e 67 20 74 68 65 20 66 69 6c 65 20 69  ining the file i
201f0 66 20 74 68 65 20 44 49 52 53 59 4e 43 20 66 6c  f the DIRSYNC fl
20200 61 67 0a 20 20 2a 2a 20 69 73 20 73 65 74 2e 20  ag.  ** is set. 
20210 20 54 68 69 73 20 69 73 20 61 20 6f 6e 65 2d 74   This is a one-t
20220 69 6d 65 20 6f 63 63 75 72 72 65 6e 63 65 2e 20  ime occurrence. 
20230 20 4d 61 6e 79 20 73 79 73 74 65 6d 73 20 28 65   Many systems (e
20240 78 61 6d 70 6c 65 73 3a 20 41 49 58 29 0a 20 20  xamples: AIX).  
20250 2a 2a 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f  ** are unable to
20260 20 66 73 79 6e 63 20 61 20 64 69 72 65 63 74 6f   fsync a directo
20270 72 79 2c 20 73 6f 20 69 67 6e 6f 72 65 20 65 72  ry, so ignore er
20280 72 6f 72 73 20 6f 6e 20 74 68 65 20 66 73 79 6e  rors on the fsyn
20290 63 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46  c..  */.  if( pF
202a0 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26  ile->ctrlFlags &
202b0 20 55 4e 49 58 46 49 4c 45 5f 44 49 52 53 59 4e   UNIXFILE_DIRSYN
202c0 43 20 29 7b 0a 20 20 20 20 69 6e 74 20 64 69 72  C ){.    int dir
202d0 66 64 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28  fd;.    OSTRACE(
202e0 28 22 44 49 52 53 59 4e 43 20 25 73 20 28 68 61  ("DIRSYNC %s (ha
202f0 76 65 5f 66 75 6c 6c 66 73 79 6e 63 3d 25 64 20  ve_fullfsync=%d 
20300 66 75 6c 6c 73 79 6e 63 3d 25 64 29 5c 6e 22 2c  fullsync=%d)\n",
20310 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 2c 0a 20   pFile->zPath,. 
20320 20 20 20 20 20 20 20 20 20 20 20 48 41 56 45 5f             HAVE_
20330 46 55 4c 4c 46 53 59 4e 43 2c 20 69 73 46 75 6c  FULLFSYNC, isFul
20340 6c 73 79 6e 63 29 29 3b 0a 20 20 20 20 72 63 20  lsync));.    rc 
20350 3d 20 6f 73 4f 70 65 6e 44 69 72 65 63 74 6f 72  = osOpenDirector
20360 79 28 70 46 69 6c 65 2d 3e 7a 50 61 74 68 2c 20  y(pFile->zPath, 
20370 26 64 69 72 66 64 29 3b 0a 20 20 20 20 69 66 28  &dirfd);.    if(
20380 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
20390 26 20 64 69 72 66 64 3e 3d 30 20 29 7b 0a 20 20  & dirfd>=0 ){.  
203a0 20 20 20 20 66 75 6c 6c 5f 66 73 79 6e 63 28 64      full_fsync(d
203b0 69 72 66 64 2c 20 30 2c 20 30 29 3b 0a 23 69 66  irfd, 0, 0);.#if
203c0 20 4f 53 43 4c 4f 53 45 5f 43 48 45 43 4b 5f 43   OSCLOSE_CHECK_C
203d0 4c 4f 53 45 5f 49 4f 45 52 52 0a 20 20 20 20 20  LOSE_IOERR.     
203e0 20 69 66 28 20 63 6c 6f 73 65 28 70 46 69 6c 65   if( close(pFile
203f0 2d 3e 64 69 72 66 64 29 20 29 7b 0a 20 20 20 20  ->dirfd) ){.    
20400 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72      storeLastErr
20410 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29  no(pFile, errno)
20420 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  ;.        rc = S
20430 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f  QLITE_IOERR_DIR_
20440 43 4c 4f 53 45 3b 0a 20 20 20 20 20 20 7d 0a 23  CLOSE;.      }.#
20450 65 6c 73 65 0a 20 20 20 20 20 20 72 6f 62 75 73  else.      robus
20460 74 5f 63 6c 6f 73 65 28 70 46 69 6c 65 2c 20 64  t_close(pFile, d
20470 69 72 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b  irfd, __LINE__);
20480 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73  .#endif.    }els
20490 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45  e if( rc==SQLITE
204a0 5f 43 41 4e 54 4f 50 45 4e 20 29 7b 0a 20 20 20  _CANTOPEN ){.   
204b0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
204c0 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 46 69  K;.    }.    pFi
204d0 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 3d  le->ctrlFlags &=
204e0 20 7e 55 4e 49 58 46 49 4c 45 5f 44 49 52 53 59   ~UNIXFILE_DIRSY
204f0 4e 43 3b 0a 0a 20 20 7d 0a 20 20 72 65 74 75 72  NC;..  }.  retur
20500 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
20510 72 75 6e 63 61 74 65 20 61 6e 20 6f 70 65 6e 20  runcate an open 
20520 66 69 6c 65 20 74 6f 20 61 20 73 70 65 63 69 66  file to a specif
20530 69 65 64 20 73 69 7a 65 0a 2a 2f 0a 73 74 61 74  ied size.*/.stat
20540 69 63 20 69 6e 74 20 75 6e 69 78 54 72 75 6e 63  ic int unixTrunc
20550 61 74 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ate(sqlite3_file
20560 20 2a 69 64 2c 20 69 36 34 20 6e 42 79 74 65 29   *id, i64 nByte)
20570 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  {.  unixFile *pF
20580 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 20  ile = (unixFile 
20590 2a 29 69 64 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  *)id;.  int rc;.
205a0 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
205b0 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  );.  SimulateIOE
205c0 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c  rror( return SQL
205d0 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41  ITE_IOERR_TRUNCA
205e0 54 45 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  TE );..  /* If t
205f0 68 65 20 75 73 65 72 20 68 61 73 20 63 6f 6e 66  he user has conf
20600 69 67 75 72 65 64 20 61 20 63 68 75 6e 6b 2d 73  igured a chunk-s
20610 69 7a 65 20 66 6f 72 20 74 68 69 73 20 66 69 6c  ize for this fil
20620 65 2c 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a  e, truncate the.
20630 20 20 2a 2a 20 66 69 6c 65 20 73 6f 20 74 68 61    ** file so tha
20640 74 20 69 74 20 63 6f 6e 73 69 73 74 73 20 6f 66  t it consists of
20650 20 61 6e 20 69 6e 74 65 67 65 72 20 6e 75 6d 62   an integer numb
20660 65 72 20 6f 66 20 63 68 75 6e 6b 73 20 28 69 2e  er of chunks (i.
20670 65 2e 20 74 68 65 0a 20 20 2a 2a 20 61 63 74 75  e. the.  ** actu
20680 61 6c 20 66 69 6c 65 20 73 69 7a 65 20 61 66 74  al file size aft
20690 65 72 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e  er the operation
206a0 20 6d 61 79 20 62 65 20 6c 61 72 67 65 72 20 74   may be larger t
206b0 68 61 6e 20 74 68 65 20 72 65 71 75 65 73 74 65  han the requeste
206c0 64 0a 20 20 2a 2a 20 73 69 7a 65 29 2e 0a 20 20  d.  ** size)..  
206d0 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
206e0 73 7a 43 68 75 6e 6b 3e 30 20 29 7b 0a 20 20 20  szChunk>0 ){.   
206f0 20 6e 42 79 74 65 20 3d 20 28 28 6e 42 79 74 65   nByte = ((nByte
20700 20 2b 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e   + pFile->szChun
20710 6b 20 2d 20 31 29 2f 70 46 69 6c 65 2d 3e 73 7a  k - 1)/pFile->sz
20720 43 68 75 6e 6b 29 20 2a 20 70 46 69 6c 65 2d 3e  Chunk) * pFile->
20730 73 7a 43 68 75 6e 6b 3b 0a 20 20 7d 0a 0a 20 20  szChunk;.  }..  
20740 72 63 20 3d 20 72 6f 62 75 73 74 5f 66 74 72 75  rc = robust_ftru
20750 6e 63 61 74 65 28 70 46 69 6c 65 2d 3e 68 2c 20  ncate(pFile->h, 
20760 28 6f 66 66 5f 74 29 6e 42 79 74 65 29 3b 0a 20  (off_t)nByte);. 
20770 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 73   if( rc ){.    s
20780 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46  toreLastErrno(pF
20790 69 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20  ile, errno);.   
207a0 20 72 65 74 75 72 6e 20 75 6e 69 78 4c 6f 67 45   return unixLogE
207b0 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
207c0 52 5f 54 52 55 4e 43 41 54 45 2c 20 22 66 74 72  R_TRUNCATE, "ftr
207d0 75 6e 63 61 74 65 22 2c 20 70 46 69 6c 65 2d 3e  uncate", pFile->
207e0 7a 50 61 74 68 29 3b 0a 20 20 7d 65 6c 73 65 7b  zPath);.  }else{
207f0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
20800 45 42 55 47 0a 20 20 20 20 2f 2a 20 49 66 20 77  EBUG.    /* If w
20810 65 20 61 72 65 20 64 6f 69 6e 67 20 61 20 6e 6f  e are doing a no
20820 72 6d 61 6c 20 77 72 69 74 65 20 74 6f 20 61 20  rmal write to a 
20830 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 61  database file (a
20840 73 20 6f 70 70 6f 73 65 64 20 74 6f 0a 20 20 20  s opposed to.   
20850 20 2a 2a 20 64 6f 69 6e 67 20 61 20 68 6f 74 2d   ** doing a hot-
20860 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b  journal rollback
20870 20 6f 72 20 61 20 77 72 69 74 65 20 74 6f 20 73   or a write to s
20880 6f 6d 65 20 66 69 6c 65 20 6f 74 68 65 72 20 74  ome file other t
20890 68 61 6e 20 61 0a 20 20 20 20 2a 2a 20 6e 6f 72  han a.    ** nor
208a0 6d 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c  mal database fil
208b0 65 29 20 61 6e 64 20 77 65 20 74 72 75 6e 63 61  e) and we trunca
208c0 74 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20 7a  te the file to z
208d0 65 72 6f 20 6c 65 6e 67 74 68 2c 0a 20 20 20 20  ero length,.    
208e0 2a 2a 20 74 68 61 74 20 65 66 66 65 63 74 69 76  ** that effectiv
208f0 65 6c 79 20 75 70 64 61 74 65 73 20 74 68 65 20  ely updates the 
20900 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 2e 20  change counter. 
20910 20 54 68 69 73 20 6d 69 67 68 74 20 68 61 70 70   This might happ
20920 65 6e 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 72  en.    ** when r
20930 65 73 74 6f 72 69 6e 67 20 61 20 64 61 74 61 62  estoring a datab
20940 61 73 65 20 75 73 69 6e 67 20 74 68 65 20 62 61  ase using the ba
20950 63 6b 75 70 20 41 50 49 20 66 72 6f 6d 20 61 20  ckup API from a 
20960 7a 65 72 6f 2d 6c 65 6e 67 74 68 0a 20 20 20 20  zero-length.    
20970 2a 2a 20 73 6f 75 72 63 65 2e 0a 20 20 20 20 2a  ** source..    *
20980 2f 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d  /.    if( pFile-
20990 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 26  >inNormalWrite &
209a0 26 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20  & nByte==0 ){.  
209b0 20 20 20 20 70 46 69 6c 65 2d 3e 74 72 61 6e 73      pFile->trans
209c0 43 6e 74 72 43 68 6e 67 20 3d 20 31 3b 0a 20 20  CntrChng = 1;.  
209d0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20    }.#endif..#if 
209e0 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
209f0 53 49 5a 45 3e 30 0a 20 20 20 20 2f 2a 20 49 66  SIZE>0.    /* If
20a00 20 74 68 65 20 66 69 6c 65 20 77 61 73 20 6a 75   the file was ju
20a10 73 74 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20  st truncated to 
20a20 61 20 73 69 7a 65 20 73 6d 61 6c 6c 65 72 20 74  a size smaller t
20a30 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74 6c  han the currentl
20a40 79 0a 20 20 20 20 2a 2a 20 6d 61 70 70 65 64 20  y.    ** mapped 
20a50 72 65 67 69 6f 6e 2c 20 72 65 64 75 63 65 20 74  region, reduce t
20a60 68 65 20 65 66 66 65 63 74 69 76 65 20 6d 61 70  he effective map
20a70 70 69 6e 67 20 73 69 7a 65 20 61 73 20 77 65 6c  ping size as wel
20a80 6c 2e 20 53 51 4c 69 74 65 20 77 69 6c 6c 0a 20  l. SQLite will. 
20a90 20 20 20 2a 2a 20 75 73 65 20 72 65 61 64 28 29     ** use read()
20aa0 20 61 6e 64 20 77 72 69 74 65 28 29 20 74 6f 20   and write() to 
20ab0 61 63 63 65 73 73 20 64 61 74 61 20 62 65 79 6f  access data beyo
20ac0 6e 64 20 74 68 69 73 20 70 6f 69 6e 74 20 66 72  nd this point fr
20ad0 6f 6d 20 6e 6f 77 20 6f 6e 2e 20 20 0a 20 20 20  om now on.  .   
20ae0 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 42 79 74   */.    if( nByt
20af0 65 3c 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a  e<pFile->mmapSiz
20b00 65 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  e ){.      pFile
20b10 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d 20 6e 42 79  ->mmapSize = nBy
20b20 74 65 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  te;.    }.#endif
20b30 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ..    return SQL
20b40 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ITE_OK;.  }.}../
20b50 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 74  *.** Determine t
20b60 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20  he current size 
20b70 6f 66 20 61 20 66 69 6c 65 20 69 6e 20 62 79 74  of a file in byt
20b80 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  es.*/.static int
20b90 20 75 6e 69 78 46 69 6c 65 53 69 7a 65 28 73 71   unixFileSize(sq
20ba0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
20bb0 69 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20 69  i64 *pSize){.  i
20bc0 6e 74 20 72 63 3b 0a 20 20 73 74 72 75 63 74 20  nt rc;.  struct 
20bd0 73 74 61 74 20 62 75 66 3b 0a 20 20 61 73 73 65  stat buf;.  asse
20be0 72 74 28 20 69 64 20 29 3b 0a 20 20 72 63 20 3d  rt( id );.  rc =
20bf0 20 6f 73 46 73 74 61 74 28 28 28 75 6e 69 78 46   osFstat(((unixF
20c00 69 6c 65 2a 29 69 64 29 2d 3e 68 2c 20 26 62 75  ile*)id)->h, &bu
20c10 66 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f  f);.  SimulateIO
20c20 45 72 72 6f 72 28 20 72 63 3d 31 20 29 3b 0a 20  Error( rc=1 );. 
20c30 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20   if( rc!=0 ){.  
20c40 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f    storeLastErrno
20c50 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 2c 20  ((unixFile*)id, 
20c60 65 72 72 6e 6f 29 3b 0a 20 20 20 20 72 65 74 75  errno);.    retu
20c70 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
20c80 46 53 54 41 54 3b 0a 20 20 7d 0a 20 20 2a 70 53  FSTAT;.  }.  *pS
20c90 69 7a 65 20 3d 20 62 75 66 2e 73 74 5f 73 69 7a  ize = buf.st_siz
20ca0 65 3b 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 6f 70  e;..  /* When op
20cb0 65 6e 69 6e 67 20 61 20 7a 65 72 6f 2d 73 69 7a  ening a zero-siz
20cc0 65 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20  e database, the 
20cd0 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29 20  findInodeInfo() 
20ce0 70 72 6f 63 65 64 75 72 65 0a 20 20 2a 2a 20 77  procedure.  ** w
20cf0 72 69 74 65 73 20 61 20 73 69 6e 67 6c 65 20 62  rites a single b
20d00 79 74 65 20 69 6e 74 6f 20 74 68 61 74 20 66 69  yte into that fi
20d10 6c 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 77  le in order to w
20d20 6f 72 6b 20 61 72 6f 75 6e 64 20 61 20 62 75 67  ork around a bug
20d30 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 4f 53 2d  .  ** in the OS-
20d40 58 20 6d 73 64 6f 73 20 66 69 6c 65 73 79 73 74  X msdos filesyst
20d50 65 6d 2e 20 20 49 6e 20 6f 72 64 65 72 20 74 6f  em.  In order to
20d60 20 61 76 6f 69 64 20 70 72 6f 62 6c 65 6d 73 20   avoid problems 
20d70 77 69 74 68 20 75 70 70 65 72 0a 20 20 2a 2a 20  with upper.  ** 
20d80 6c 61 79 65 72 73 2c 20 77 65 20 6e 65 65 64 20  layers, we need 
20d90 74 6f 20 72 65 70 6f 72 74 20 74 68 69 73 20 66  to report this f
20da0 69 6c 65 20 73 69 7a 65 20 61 73 20 7a 65 72 6f  ile size as zero
20db0 20 65 76 65 6e 20 74 68 6f 75 67 68 20 69 74 20   even though it 
20dc0 69 73 0a 20 20 2a 2a 20 72 65 61 6c 6c 79 20 31  is.  ** really 1
20dd0 2e 20 20 20 54 69 63 6b 65 74 20 23 33 32 36 30  .   Ticket #3260
20de0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 2a 70 53  ..  */.  if( *pS
20df0 69 7a 65 3d 3d 31 20 29 20 2a 70 53 69 7a 65 20  ize==1 ) *pSize 
20e00 3d 20 30 3b 0a 0a 0a 20 20 72 65 74 75 72 6e 20  = 0;...  return 
20e10 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69  SQLITE_OK;.}..#i
20e20 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
20e30 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26  LOCKING_STYLE &&
20e40 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
20e50 5f 5f 29 0a 2f 2a 0a 2a 2a 20 48 61 6e 64 6c 65  __)./*.** Handle
20e60 72 20 66 6f 72 20 70 72 6f 78 79 2d 6c 6f 63 6b  r for proxy-lock
20e70 69 6e 67 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c  ing file-control
20e80 20 76 65 72 62 73 2e 20 20 44 65 66 69 6e 65 64   verbs.  Defined
20e90 20 62 65 6c 6f 77 20 69 6e 20 74 68 65 0a 2a 2a   below in the.**
20ea0 20 70 72 6f 78 79 69 6e 67 20 6c 6f 63 6b 69 6e   proxying lockin
20eb0 67 20 64 69 76 69 73 69 6f 6e 2e 0a 2a 2f 0a 73  g division..*/.s
20ec0 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 46  tatic int proxyF
20ed0 69 6c 65 43 6f 6e 74 72 6f 6c 28 73 71 6c 69 74  ileControl(sqlit
20ee0 65 33 5f 66 69 6c 65 2a 2c 69 6e 74 2c 76 6f 69  e3_file*,int,voi
20ef0 64 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20  d*);.#endif../* 
20f00 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
20f10 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 68  n is called to h
20f20 61 6e 64 6c 65 20 74 68 65 20 53 51 4c 49 54 45  andle the SQLITE
20f30 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54  _FCNTL_SIZE_HINT
20f40 20 0a 2a 2a 20 66 69 6c 65 2d 63 6f 6e 74 72 6f   .** file-contro
20f50 6c 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 45 6e  l operation.  En
20f60 6c 61 72 67 65 20 74 68 65 20 64 61 74 61 62 61  large the databa
20f70 73 65 20 74 6f 20 6e 42 79 74 65 73 20 69 6e 20  se to nBytes in 
20f80 73 69 7a 65 0a 2a 2a 20 28 72 6f 75 6e 64 65 64  size.** (rounded
20f90 20 75 70 20 74 6f 20 74 68 65 20 6e 65 78 74 20   up to the next 
20fa0 63 68 75 6e 6b 2d 73 69 7a 65 29 2e 20 20 49 66  chunk-size).  If
20fb0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
20fc0 20 61 6c 72 65 61 64 79 0a 2a 2a 20 6e 42 79 74   already.** nByt
20fd0 65 73 20 6f 72 20 6c 61 72 67 65 72 2c 20 74 68  es or larger, th
20fe0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
20ff0 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
21000 20 69 6e 74 20 66 63 6e 74 6c 53 69 7a 65 48 69   int fcntlSizeHi
21010 6e 74 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  nt(unixFile *pFi
21020 6c 65 2c 20 69 36 34 20 6e 42 79 74 65 29 7b 0a  le, i64 nByte){.
21030 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 73 7a 43    if( pFile->szC
21040 68 75 6e 6b 3e 30 20 29 7b 0a 20 20 20 20 69 36  hunk>0 ){.    i6
21050 34 20 6e 53 69 7a 65 3b 20 20 20 20 20 20 20 20  4 nSize;        
21060 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
21070 65 71 75 69 72 65 64 20 66 69 6c 65 20 73 69 7a  equired file siz
21080 65 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20  e */.    struct 
21090 73 74 61 74 20 62 75 66 3b 20 20 20 20 20 20 20  stat buf;       
210a0 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74         /* Used t
210b0 6f 20 68 6f 6c 64 20 72 65 74 75 72 6e 20 76 61  o hold return va
210c0 6c 75 65 73 20 6f 66 20 66 73 74 61 74 28 29 20  lues of fstat() 
210d0 2a 2f 0a 20 20 20 0a 20 20 20 20 69 66 28 20 6f  */.   .    if( o
210e0 73 46 73 74 61 74 28 70 46 69 6c 65 2d 3e 68 2c  sFstat(pFile->h,
210f0 20 26 62 75 66 29 20 29 20 72 65 74 75 72 6e 20   &buf) ) return 
21100 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54  SQLITE_IOERR_FST
21110 41 54 3b 0a 0a 20 20 20 20 6e 53 69 7a 65 20 3d  AT;..    nSize =
21120 20 28 28 6e 42 79 74 65 2b 70 46 69 6c 65 2d 3e   ((nByte+pFile->
21130 73 7a 43 68 75 6e 6b 2d 31 29 20 2f 20 70 46 69  szChunk-1) / pFi
21140 6c 65 2d 3e 73 7a 43 68 75 6e 6b 29 20 2a 20 70  le->szChunk) * p
21150 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3b 0a 20  File->szChunk;. 
21160 20 20 20 69 66 28 20 6e 53 69 7a 65 3e 28 69 36     if( nSize>(i6
21170 34 29 62 75 66 2e 73 74 5f 73 69 7a 65 20 29 7b  4)buf.st_size ){
21180 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 48 41  ..#if defined(HA
21190 56 45 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f 43 41  VE_POSIX_FALLOCA
211a0 54 45 29 20 26 26 20 48 41 56 45 5f 50 4f 53 49  TE) && HAVE_POSI
211b0 58 5f 46 41 4c 4c 4f 43 41 54 45 0a 20 20 20 20  X_FALLOCATE.    
211c0 20 20 2f 2a 20 54 68 65 20 63 6f 64 65 20 62 65    /* The code be
211d0 6c 6f 77 20 69 73 20 68 61 6e 64 6c 69 6e 67 20  low is handling 
211e0 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
211f0 20 6f 66 20 6f 73 46 61 6c 6c 6f 63 61 74 65 28   of osFallocate(
21200 29 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 72 72  ) .      ** corr
21210 65 63 74 6c 79 2e 20 70 6f 73 69 78 5f 66 61 6c  ectly. posix_fal
21220 6c 6f 63 61 74 65 28 29 20 69 73 20 64 65 66 69  locate() is defi
21230 6e 65 64 20 74 6f 20 22 72 65 74 75 72 6e 73 20  ned to "returns 
21240 7a 65 72 6f 20 6f 6e 20 73 75 63 63 65 73 73 2c  zero on success,
21250 20 0a 20 20 20 20 20 20 2a 2a 20 6f 72 20 61 6e   .      ** or an
21260 20 65 72 72 6f 72 20 6e 75 6d 62 65 72 20 6f 6e   error number on
21270 20 20 66 61 69 6c 75 72 65 22 2e 20 53 65 65 20    failure". See 
21280 74 68 65 20 6d 61 6e 70 61 67 65 20 66 6f 72 20  the manpage for 
21290 64 65 74 61 69 6c 73 2e 20 2a 2f 0a 20 20 20 20  details. */.    
212a0 20 20 69 6e 74 20 65 72 72 3b 0a 20 20 20 20 20    int err;.     
212b0 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 65 72 72   do{.        err
212c0 20 3d 20 6f 73 46 61 6c 6c 6f 63 61 74 65 28 70   = osFallocate(p
212d0 46 69 6c 65 2d 3e 68 2c 20 62 75 66 2e 73 74 5f  File->h, buf.st_
212e0 73 69 7a 65 2c 20 6e 53 69 7a 65 2d 62 75 66 2e  size, nSize-buf.
212f0 73 74 5f 73 69 7a 65 29 3b 0a 20 20 20 20 20 20  st_size);.      
21300 7d 77 68 69 6c 65 28 20 65 72 72 3d 3d 45 49 4e  }while( err==EIN
21310 54 52 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  TR );.      if( 
21320 65 72 72 20 29 20 72 65 74 75 72 6e 20 53 51 4c  err ) return SQL
21330 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 3b  ITE_IOERR_WRITE;
21340 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 2f 2a 20  .#else.      /* 
21350 49 66 20 74 68 65 20 4f 53 20 64 6f 65 73 20 6e  If the OS does n
21360 6f 74 20 68 61 76 65 20 70 6f 73 69 78 5f 66 61  ot have posix_fa
21370 6c 6c 6f 63 61 74 65 28 29 2c 20 66 61 6b 65 20  llocate(), fake 
21380 69 74 2e 20 46 69 72 73 74 20 75 73 65 0a 20 20  it. First use.  
21390 20 20 20 20 2a 2a 20 66 74 72 75 6e 63 61 74 65      ** ftruncate
213a0 28 29 20 74 6f 20 73 65 74 20 74 68 65 20 66 69  () to set the fi
213b0 6c 65 20 73 69 7a 65 2c 20 74 68 65 6e 20 77 72  le size, then wr
213c0 69 74 65 20 61 20 73 69 6e 67 6c 65 20 62 79 74  ite a single byt
213d0 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68  e to.      ** th
213e0 65 20 6c 61 73 74 20 62 79 74 65 20 69 6e 20 65  e last byte in e
213f0 61 63 68 20 62 6c 6f 63 6b 20 77 69 74 68 69 6e  ach block within
21400 20 74 68 65 20 65 78 74 65 6e 64 65 64 20 72 65   the extended re
21410 67 69 6f 6e 2e 20 54 68 69 73 0a 20 20 20 20 20  gion. This.     
21420 20 2a 2a 20 69 73 20 74 68 65 20 73 61 6d 65 20   ** is the same 
21430 74 65 63 68 6e 69 71 75 65 20 75 73 65 64 20 62  technique used b
21440 79 20 67 6c 69 62 63 20 74 6f 20 69 6d 70 6c 65  y glibc to imple
21450 6d 65 6e 74 20 70 6f 73 69 78 5f 66 61 6c 6c 6f  ment posix_fallo
21460 63 61 74 65 28 29 0a 20 20 20 20 20 20 2a 2a 20  cate().      ** 
21470 6f 6e 20 73 79 73 74 65 6d 73 20 74 68 61 74 20  on systems that 
21480 64 6f 20 6e 6f 74 20 68 61 76 65 20 61 20 72 65  do not have a re
21490 61 6c 20 66 61 6c 6c 6f 63 61 74 65 28 29 20 73  al fallocate() s
214a0 79 73 74 65 6d 20 63 61 6c 6c 2e 0a 20 20 20 20  ystem call..    
214b0 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e    */.      int n
214c0 42 6c 6b 20 3d 20 62 75 66 2e 73 74 5f 62 6c 6b  Blk = buf.st_blk
214d0 73 69 7a 65 3b 20 20 2f 2a 20 46 69 6c 65 2d 73  size;  /* File-s
214e0 79 73 74 65 6d 20 62 6c 6f 63 6b 20 73 69 7a 65  ystem block size
214f0 20 2a 2f 0a 20 20 20 20 20 20 69 36 34 20 69 57   */.      i64 iW
21500 72 69 74 65 3b 20 20 20 20 20 20 20 20 20 20 20  rite;           
21510 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 6f 66        /* Next of
21520 66 73 65 74 20 74 6f 20 77 72 69 74 65 20 74 6f  fset to write to
21530 20 2a 2f 0a 0a 20 20 20 20 20 20 69 66 28 20 72   */..      if( r
21540 6f 62 75 73 74 5f 66 74 72 75 6e 63 61 74 65 28  obust_ftruncate(
21550 70 46 69 6c 65 2d 3e 68 2c 20 6e 53 69 7a 65 29  pFile->h, nSize)
21560 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74 6f 72   ){.        stor
21570 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65  eLastErrno(pFile
21580 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20  , errno);.      
21590 20 20 72 65 74 75 72 6e 20 75 6e 69 78 4c 6f 67    return unixLog
215a0 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
215b0 52 52 5f 54 52 55 4e 43 41 54 45 2c 20 22 66 74  RR_TRUNCATE, "ft
215c0 72 75 6e 63 61 74 65 22 2c 20 70 46 69 6c 65 2d  runcate", pFile-
215d0 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 20 20 7d  >zPath);.      }
215e0 0a 20 20 20 20 20 20 69 57 72 69 74 65 20 3d 20  .      iWrite = 
215f0 28 28 62 75 66 2e 73 74 5f 73 69 7a 65 20 2b 20  ((buf.st_size + 
21600 32 2a 6e 42 6c 6b 20 2d 20 31 29 2f 6e 42 6c 6b  2*nBlk - 1)/nBlk
21610 29 2a 6e 42 6c 6b 2d 31 3b 0a 20 20 20 20 20 20  )*nBlk-1;.      
21620 77 68 69 6c 65 28 20 69 57 72 69 74 65 3c 6e 53  while( iWrite<nS
21630 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ize ){.        i
21640 6e 74 20 6e 57 72 69 74 65 20 3d 20 73 65 65 6b  nt nWrite = seek
21650 41 6e 64 57 72 69 74 65 28 70 46 69 6c 65 2c 20  AndWrite(pFile, 
21660 69 57 72 69 74 65 2c 20 22 22 2c 20 31 29 3b 0a  iWrite, "", 1);.
21670 20 20 20 20 20 20 20 20 69 66 28 20 6e 57 72 69          if( nWri
21680 74 65 21 3d 31 20 29 20 72 65 74 75 72 6e 20 53  te!=1 ) return S
21690 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54  QLITE_IOERR_WRIT
216a0 45 3b 0a 20 20 20 20 20 20 20 20 69 57 72 69 74  E;.        iWrit
216b0 65 20 2b 3d 20 6e 42 6c 6b 3b 0a 20 20 20 20 20  e += nBlk;.     
216c0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a   }.#endif.    }.
216d0 20 20 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f    }..#if SQLITE_
216e0 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
216f0 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6d 6d 61    if( pFile->mma
21700 70 53 69 7a 65 4d 61 78 3e 30 20 26 26 20 6e 42  pSizeMax>0 && nB
21710 79 74 65 3e 70 46 69 6c 65 2d 3e 6d 6d 61 70 53  yte>pFile->mmapS
21720 69 7a 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  ize ){.    int r
21730 63 3b 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65  c;.    if( pFile
21740 2d 3e 73 7a 43 68 75 6e 6b 3c 3d 30 20 29 7b 0a  ->szChunk<=0 ){.
21750 20 20 20 20 20 20 69 66 28 20 72 6f 62 75 73 74        if( robust
21760 5f 66 74 72 75 6e 63 61 74 65 28 70 46 69 6c 65  _ftruncate(pFile
21770 2d 3e 68 2c 20 6e 42 79 74 65 29 20 29 7b 0a 20  ->h, nByte) ){. 
21780 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61         pFile->la
21790 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b  stErrno = errno;
217a0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
217b0 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c  unixLogError(SQL
217c0 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41  ITE_IOERR_TRUNCA
217d0 54 45 2c 20 22 66 74 72 75 6e 63 61 74 65 22 2c  TE, "ftruncate",
217e0 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a   pFile->zPath);.
217f0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
21800 20 20 20 72 63 20 3d 20 75 6e 69 78 4d 61 70 66     rc = unixMapf
21810 69 6c 65 28 70 46 69 6c 65 2c 20 6e 42 79 74 65  ile(pFile, nByte
21820 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  );.    return rc
21830 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
21840 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
21850 3b 0a 7d 0a 0a 0a 23 69 66 20 28 53 51 4c 49 54  ;.}...#if (SQLIT
21860 45 5f 45 4e 41 42 4c 45 5f 41 50 50 4c 45 5f 53  E_ENABLE_APPLE_S
21870 50 49 3e 30 29 20 26 26 20 64 65 66 69 6e 65 64  PI>0) && defined
21880 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 23 69 6e 63  (__APPLE__).#inc
21890 6c 75 64 65 20 22 73 71 6c 69 74 65 33 5f 70 72  lude "sqlite3_pr
218a0 69 76 61 74 65 2e 68 22 0a 23 69 6e 63 6c 75 64  ivate.h".#includ
218b0 65 20 3c 63 6f 70 79 66 69 6c 65 2e 68 3e 0a 73  e <copyfile.h>.s
218c0 74 61 74 69 63 20 69 6e 74 20 67 65 74 44 62 50  tatic int getDbP
218d0 61 74 68 46 6f 72 55 6e 69 78 46 69 6c 65 28 75  athForUnixFile(u
218e0 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20  nixFile *pFile, 
218f0 63 68 61 72 20 2a 64 62 50 61 74 68 29 3b 0a 23  char *dbPath);.#
21900 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c 49 54  endif..#if SQLIT
21910 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
21920 5f 53 54 59 4c 45 0a 73 74 61 74 69 63 20 69 6e  _STYLE.static in
21930 74 20 69 73 50 72 6f 78 79 4c 6f 63 6b 69 6e 67  t isProxyLocking
21940 4d 6f 64 65 28 75 6e 69 78 46 69 6c 65 20 2a 29  Mode(unixFile *)
21950 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 28 53  ;.#endif..#if (S
21960 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 50  QLITE_ENABLE_APP
21970 4c 45 5f 53 50 49 3e 30 29 20 26 26 20 64 65 66  LE_SPI>0) && def
21980 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a  ined(__APPLE__).
21990 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 54  static int unixT
219a0 72 75 6e 63 61 74 65 44 61 74 61 62 61 73 65 28  runcateDatabase(
219b0 75 6e 69 78 46 69 6c 65 20 2a 2c 20 69 6e 74 29  unixFile *, int)
219c0 3b 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  ;..static int un
219d0 69 78 49 6e 76 61 6c 69 64 61 74 65 53 75 70 70  ixInvalidateSupp
219e0 6f 72 74 46 69 6c 65 73 28 75 6e 69 78 46 69 6c  ortFiles(unixFil
219f0 65 20 2a 2c 20 69 6e 74 29 3b 0a 0a 73 74 61 74  e *, int);..stat
21a00 69 63 20 69 6e 74 20 66 69 6e 64 43 72 65 61 74  ic int findCreat
21a10 65 46 69 6c 65 4d 6f 64 65 28 63 6f 6e 73 74 20  eFileMode(const 
21a20 63 68 61 72 20 2a 2c 20 69 6e 74 2c 20 6d 6f 64  char *, int, mod
21a30 65 5f 74 2a 2c 20 75 69 64 5f 74 20 2a 2c 67 69  e_t*, uid_t *,gi
21a40 64 5f 74 20 2a 29 3b 0a 0a 2f 2a 20 6f 70 65 6e  d_t *);../* open
21a50 73 20 61 20 72 65 61 64 2f 77 72 69 74 65 20 63  s a read/write c
21a60 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 61 20 66  onnection to a f
21a70 69 6c 65 20 7a 4e 61 6d 65 20 69 6e 68 65 72 69  ile zName inheri
21a80 74 69 6e 67 20 74 68 65 20 61 70 70 72 6f 70 72  ting the appropr
21a90 69 61 74 65 0a 2a 2a 20 75 73 65 72 2f 70 65 72  iate.** user/per
21aa0 6d 73 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ms from the data
21ab0 62 61 73 65 20 66 69 6c 65 20 69 66 20 72 75 6e  base file if run
21ac0 6e 69 6e 67 20 61 73 20 72 6f 6f 74 2e 20 20 52  ning as root.  R
21ad0 65 74 75 72 6e 73 20 74 68 65 20 66 69 6c 65 20  eturns the file 
21ae0 0a 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20 62  .** descriptor b
21af0 79 20 72 65 66 65 72 65 6e 63 65 0a 2a 2f 0a 73  y reference.*/.s
21b00 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4f 70  tatic int unixOp
21b10 65 6e 43 68 69 6c 64 46 69 6c 65 28 0a 20 20 63  enChildFile(.  c
21b20 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
21b30 2c 0a 20 20 69 6e 74 20 6f 70 65 6e 46 6c 61 67  ,.  int openFlag
21b40 73 2c 0a 20 20 69 6e 74 20 64 62 4f 70 65 6e 46  s,.  int dbOpenF
21b50 6c 61 67 73 2c 0a 20 20 69 6e 74 20 70 72 6f 74  lags,.  int prot
21b60 46 6c 61 67 73 2c 0a 20 20 69 6e 74 20 2a 70 46  Flags,.  int *pF
21b70 64 0a 29 7b 0a 20 20 69 6e 74 20 66 64 20 3d 20  d.){.  int fd = 
21b80 2d 31 3b 0a 20 20 6d 6f 64 65 5f 74 20 6f 70 65  -1;.  mode_t ope
21b90 6e 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20  nMode;          
21ba0 20 20 20 20 2f 2a 20 50 65 72 6d 69 73 73 69 6f      /* Permissio
21bb0 6e 73 20 74 6f 20 63 72 65 61 74 65 20 66 69 6c  ns to create fil
21bc0 65 20 77 69 74 68 20 2a 2f 0a 20 20 75 69 64 5f  e with */.  uid_
21bd0 74 20 75 69 64 3b 20 20 20 20 20 20 20 20 20 20  t uid;          
21be0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
21bf0 72 69 64 20 66 6f 72 20 74 68 65 20 66 69 6c 65  rid for the file
21c00 20 2a 2f 0a 20 20 67 69 64 5f 74 20 67 69 64 3b   */.  gid_t gid;
21c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21c20 20 20 20 20 2f 2a 20 47 72 6f 75 70 69 64 20 66      /* Groupid f
21c30 6f 72 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20  or the file */. 
21c40 20 69 6e 74 20 72 63 3b 0a 20 20 0a 20 20 61 73   int rc;.  .  as
21c50 73 65 72 74 28 70 46 64 21 3d 4e 55 4c 4c 29 3b  sert(pFd!=NULL);
21c60 0a 20 20 72 63 20 3d 20 66 69 6e 64 43 72 65 61  .  rc = findCrea
21c70 74 65 46 69 6c 65 4d 6f 64 65 28 7a 4e 61 6d 65  teFileMode(zName
21c80 2c 20 64 62 4f 70 65 6e 46 6c 61 67 73 2c 20 26  , dbOpenFlags, &
21c90 6f 70 65 6e 4d 6f 64 65 2c 20 26 75 69 64 2c 20  openMode, &uid, 
21ca0 26 67 69 64 29 3b 0a 20 20 69 66 28 20 72 63 21  &gid);.  if( rc!
21cb0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
21cc0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
21cd0 0a 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f  .  fd = robust_o
21ce0 70 65 6e 28 7a 4e 61 6d 65 2c 20 6f 70 65 6e 46  pen(zName, openF
21cf0 6c 61 67 73 2c 20 6f 70 65 6e 4d 6f 64 65 29 3b  lags, openMode);
21d00 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45  .  OSTRACE(("OPE
21d10 4e 58 20 20 20 25 2d 33 64 20 25 73 20 30 25 6f  NX   %-3d %s 0%o
21d20 5c 6e 22 2c 20 66 64 2c 20 7a 4e 61 6d 65 2c 20  \n", fd, zName, 
21d30 6f 70 65 6e 46 6c 61 67 73 29 29 3b 0a 20 20 69  openFlags));.  i
21d40 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 72  f( fd<0 ){.    r
21d50 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72  c = unixLogError
21d60 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e  (SQLITE_CANTOPEN
21d70 5f 42 4b 50 54 2c 20 22 6f 70 65 6e 22 2c 20 7a  _BKPT, "open", z
21d80 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72  Name);.    retur
21d90 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 2f 2a 20 69  n rc;.  }.  /* i
21da0 66 20 77 65 27 72 65 20 6f 70 65 6e 69 6e 67 20  f we're opening 
21db0 74 68 65 20 77 61 6c 20 6f 72 20 6a 6f 75 72 6e  the wal or journ
21dc0 61 6c 20 61 6e 64 20 72 75 6e 6e 69 6e 67 20 61  al and running a
21dd0 73 20 72 6f 6f 74 2c 20 73 65 74 0a 20 20 2a 2a  s root, set.  **
21de0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 75 69 64   the journal uid
21df0 2f 67 69 64 20 2a 2f 0a 20 20 69 66 28 20 64 62  /gid */.  if( db
21e00 4f 70 65 6e 46 6c 61 67 73 20 26 20 28 53 51 4c  OpenFlags & (SQL
21e10 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 7c 53 51 4c  ITE_OPEN_WAL|SQL
21e20 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f  ITE_OPEN_MAIN_JO
21e30 55 52 4e 41 4c 29 20 29 7b 0a 20 20 20 20 75 69  URNAL) ){.    ui
21e40 64 5f 74 20 65 75 69 64 20 3d 20 67 65 74 65 75  d_t euid = geteu
21e50 69 64 28 29 3b 0a 20 20 20 20 69 66 28 20 65 75  id();.    if( eu
21e60 69 64 3d 3d 30 20 26 26 20 28 65 75 69 64 21 3d  id==0 && (euid!=
21e70 75 69 64 20 7c 7c 20 67 65 74 65 67 69 64 28 29  uid || getegid()
21e80 21 3d 67 69 64 29 20 29 7b 0a 20 20 20 20 20 20  !=gid) ){.      
21e90 69 66 28 20 66 63 68 6f 77 6e 28 66 64 2c 20 75  if( fchown(fd, u
21ea0 69 64 2c 20 67 69 64 29 20 29 7b 0a 20 20 20 20  id, gid) ){.    
21eb0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
21ec0 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20  CANTOPEN_BKPT;. 
21ed0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
21ee0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
21ef0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 46 64  E_OK ){.    *pFd
21f00 20 3d 20 66 64 3b 0a 20 20 7d 20 65 6c 73 65 20   = fd;.  } else 
21f10 7b 0a 20 20 20 20 2a 70 46 64 20 3d 20 2d 31 3b  {.    *pFd = -1;
21f20 0a 20 20 20 20 63 6c 6f 73 65 28 66 64 29 3b 0a  .    close(fd);.
21f30 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
21f40 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .}..static int u
21f50 6e 69 78 52 65 70 6c 61 63 65 44 61 74 61 62 61  nixReplaceDataba
21f60 73 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  se(unixFile *pFi
21f70 6c 65 2c 20 73 71 6c 69 74 65 33 20 2a 73 72 63  le, sqlite3 *src
21f80 64 62 29 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f  db) {.  sqlite3_
21f90 66 69 6c 65 20 2a 69 64 20 3d 20 28 73 71 6c 69  file *id = (sqli
21fa0 74 65 33 5f 66 69 6c 65 20 2a 29 70 46 69 6c 65  te3_file *)pFile
21fb0 3b 0a 20 20 42 74 72 65 65 20 2a 70 53 72 63 42  ;.  Btree *pSrcB
21fc0 74 72 65 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20 73  tree = NULL;.  s
21fd0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 73 72 63  qlite3_file *src
21fe0 5f 66 69 6c 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20  _file = NULL;.  
21ff0 75 6e 69 78 46 69 6c 65 20 2a 70 53 72 63 46 69  unixFile *pSrcFi
22000 6c 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20 63 68 61  le = NULL;.  cha
22010 72 20 73 72 63 57 61 6c 50 61 74 68 5b 4d 41 58  r srcWalPath[MAX
22020 50 41 54 48 4c 45 4e 2b 35 5d 3b 0a 20 20 69 6e  PATHLEN+5];.  in
22030 74 20 73 72 63 57 61 6c 46 44 20 3d 20 2d 31 3b  t srcWalFD = -1;
22040 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
22050 54 45 5f 4f 4b 3b 0a 20 20 76 6f 69 64 20 2a 70  TE_OK;.  void *p
22060 4c 6f 63 6b 20 3d 20 4e 55 4c 4c 3b 0a 20 20 69  Lock = NULL;.  i
22070 6e 74 20 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20  nt flags = 0;.  
22080 73 71 6c 69 74 65 33 20 2a 73 72 63 64 62 32 20  sqlite3 *srcdb2 
22090 3d 20 4e 55 4c 4c 3b 0a 20 20 63 6f 70 79 66 69  = NULL;.  copyfi
220a0 6c 65 5f 73 74 61 74 65 5f 74 20 73 3b 0a 20 20  le_state_t s;.  
220b0 69 6e 74 20 63 6f 72 72 75 70 74 53 72 63 46 69  int corruptSrcFi
220c0 6c 65 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 69 6e  leLock = 0;.  in
220d0 74 20 63 6f 72 72 75 70 74 44 73 74 46 69 6c 65  t corruptDstFile
220e0 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Lock = 0;.  int 
220f0 69 73 53 72 63 43 6f 72 72 75 70 74 20 3d 20 30  isSrcCorrupt = 0
22100 3b 0a 20 20 69 6e 74 20 69 73 44 73 74 43 6f 72  ;.  int isDstCor
22110 72 75 70 74 20 3d 20 30 3b 0a 20 20 0a 20 20 69  rupt = 0;.  .  i
22120 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
22130 79 43 68 65 63 6b 4f 6b 28 73 72 63 64 62 29 20  yCheckOk(srcdb) 
22140 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
22150 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20 7d  LITE_MISUSE;.  }
22160 0a 20 20 20 20 0a 23 69 66 20 53 51 4c 49 54 45  .    .#if SQLITE
22170 5f 45 4e 41 42 4c 45 5f 44 41 54 41 5f 50 52 4f  _ENABLE_DATA_PRO
22180 54 45 43 54 49 4f 4e 0a 20 20 66 6c 61 67 73 20  TECTION.  flags 
22190 7c 3d 20 70 46 69 6c 65 2d 3e 70 72 6f 74 46 6c  |= pFile->protFl
221a0 61 67 73 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  ags;.#endif.#if 
221b0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
221c0 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 69 66  CKING_STYLE.  if
221d0 28 20 69 73 50 72 6f 78 79 4c 6f 63 6b 69 6e 67  ( isProxyLocking
221e0 4d 6f 64 65 28 70 46 69 6c 65 29 20 29 7b 0a 20  Mode(pFile) ){. 
221f0 20 20 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49     flags |= SQLI
22200 54 45 5f 4f 50 45 4e 5f 41 55 54 4f 50 52 4f 58  TE_OPEN_AUTOPROX
22210 59 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  Y;.  }.#endif.  
22220 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 64  .  rc = sqlite3d
22230 65 6d 6f 5f 73 75 70 65 72 6c 6f 63 6b 28 70 46  emo_superlock(pF
22240 69 6c 65 2d 3e 7a 50 61 74 68 2c 20 30 2c 20 66  ile->zPath, 0, f
22250 6c 61 67 73 2c 20 30 2c 20 30 2c 20 26 70 4c 6f  lags, 0, 0, &pLo
22260 63 6b 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  ck);.  if( rc ){
22270 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
22280 49 54 45 5f 43 4f 52 52 55 50 54 20 7c 7c 20 72  ITE_CORRUPT || r
22290 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42  c==SQLITE_NOTADB
222a0 20 29 7b 0a 20 20 20 20 20 20 69 73 44 73 74 43   ){.      isDstC
222b0 6f 72 72 75 70 74 20 3d 20 31 3b 0a 20 20 20 20  orrupt = 1;.    
222c0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 64 65    rc = sqlite3de
222d0 6d 6f 5f 73 75 70 65 72 6c 6f 63 6b 5f 63 6f 72  mo_superlock_cor
222e0 72 75 70 74 28 69 64 2c 20 53 51 4c 49 54 45 5f  rupt(id, SQLITE_
222f0 4c 4f 43 4b 5f 45 58 43 4c 55 53 49 56 45 2c 0a  LOCK_EXCLUSIVE,.
22300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22320 20 20 20 20 20 20 20 20 20 26 63 6f 72 72 75 70           &corrup
22330 74 44 73 74 46 69 6c 65 4c 6f 63 6b 29 3b 0a 20  tDstFileLock);. 
22340 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 20     }.    if( rc 
22350 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
22360 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  rc;.    }.  }.  
22370 2f 2a 20 67 65 74 20 74 68 65 20 73 72 63 20 66  /* get the src f
22380 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 61  ile descriptor a
22390 64 68 65 72 69 6e 67 20 74 6f 20 74 68 65 20 64  dhering to the d
223a0 62 20 73 74 72 75 63 74 20 61 63 63 65 73 73 20  b struct access 
223b0 72 75 6c 65 73 20 0a 20 20 20 2a 2a 20 74 68 69  rules .   ** thi
223c0 73 20 63 6f 64 65 20 69 73 20 6d 6f 64 65 6c 65  s code is modele
223d0 64 20 61 66 74 65 72 20 73 71 6c 69 74 65 33 5f  d after sqlite3_
223e0 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 29 20 69  file_control() i
223f0 6e 20 6d 61 69 6e 2e 63 0a 20 20 20 2a 2f 20 0a  n main.c.   */ .
22400 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
22410 65 6e 74 65 72 28 73 72 63 64 62 2d 3e 6d 75 74  enter(srcdb->mut
22420 65 78 29 3b 0a 20 20 69 66 28 20 73 72 63 64 62  ex);.  if( srcdb
22430 2d 3e 6e 44 62 3e 30 20 29 7b 0a 20 20 20 20 70  ->nDb>0 ){.    p
22440 53 72 63 42 74 72 65 65 20 3d 20 73 72 63 64 62  SrcBtree = srcdb
22450 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 3b 0a 20 20  ->aDb[0].pBt;.  
22460 7d 0a 20 20 69 66 28 20 70 53 72 63 42 74 72 65  }.  if( pSrcBtre
22470 65 20 29 7b 0a 20 20 20 20 50 61 67 65 72 20 2a  e ){.    Pager *
22480 70 53 72 63 50 61 67 65 72 3b 0a 20 20 20 20 73  pSrcPager;.    s
22490 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
224a0 28 70 53 72 63 42 74 72 65 65 29 3b 0a 20 20 20  (pSrcBtree);.   
224b0 20 70 53 72 63 50 61 67 65 72 20 3d 20 73 71 6c   pSrcPager = sql
224c0 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28 70  ite3BtreePager(p
224d0 53 72 63 42 74 72 65 65 29 3b 0a 20 20 20 20 61  SrcBtree);.    a
224e0 73 73 65 72 74 28 20 70 53 72 63 50 61 67 65 72  ssert( pSrcPager
224f0 21 3d 30 20 29 3b 0a 20 20 20 20 73 72 63 5f 66  !=0 );.    src_f
22500 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67  ile = sqlite3Pag
22510 65 72 46 69 6c 65 28 70 53 72 63 50 61 67 65 72  erFile(pSrcPager
22520 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
22530 72 63 5f 66 69 6c 65 21 3d 30 20 29 3b 0a 20 20  rc_file!=0 );.  
22540 20 20 69 66 28 20 73 72 63 5f 66 69 6c 65 2d 3e    if( src_file->
22550 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20  pMethods ){.    
22560 20 20 69 6e 74 20 73 72 63 46 6c 61 67 73 20 3d    int srcFlags =
22570 20 30 3b 0a 20 20 20 20 20 20 70 53 72 63 46 69   0;.      pSrcFi
22580 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a  le = (unixFile *
22590 29 73 72 63 5f 66 69 6c 65 3b 0a 23 69 66 20 53  )src_file;.#if S
225a0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
225b0 4b 49 4e 47 5f 53 54 59 4c 45 20 7c 7c 20 64 65  KING_STYLE || de
225c0 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
225d0 0a 20 20 20 20 20 20 69 66 20 28 28 70 53 72 63  .      if ((pSrc
225e0 46 69 6c 65 2d 3e 6f 70 65 6e 46 6c 61 67 73 20  File->openFlags 
225f0 26 20 4f 5f 52 44 57 52 29 20 3d 3d 20 4f 5f 52  & O_RDWR) == O_R
22600 44 57 52 29 20 7b 0a 20 20 20 20 20 20 20 20 73  DWR) {.        s
22610 72 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45  rcFlags = SQLITE
22620 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 3b  _OPEN_READWRITE;
22630 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  .      } else {.
22640 20 20 20 20 20 20 20 20 73 72 63 46 6c 61 67 73          srcFlags
22650 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   = SQLITE_OPEN_R
22660 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d  EADONLY;.      }
22670 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 73 72 63  .#else.      src
22680 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f  Flags = SQLITE_O
22690 50 45 4e 5f 52 45 41 44 57 52 49 54 45 3b 0a 23  PEN_READWRITE;.#
226a0 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
226b0 5f 45 4e 41 42 4c 45 5f 44 41 54 41 5f 50 52 4f  _ENABLE_DATA_PRO
226c0 54 45 43 54 49 4f 4e 0a 20 20 20 20 20 20 73 72  TECTION.      sr
226d0 63 46 6c 61 67 73 20 7c 3d 20 70 53 72 63 46 69  cFlags |= pSrcFi
226e0 6c 65 2d 3e 70 72 6f 74 46 6c 61 67 73 3b 0a 23  le->protFlags;.#
226f0 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
22700 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
22710 53 54 59 4c 45 0a 20 20 20 20 20 20 69 66 28 20  STYLE.      if( 
22720 69 73 50 72 6f 78 79 4c 6f 63 6b 69 6e 67 4d 6f  isProxyLockingMo
22730 64 65 28 70 53 72 63 46 69 6c 65 29 20 29 7b 0a  de(pSrcFile) ){.
22740 20 20 20 20 20 20 20 20 73 72 63 46 6c 61 67 73          srcFlags
22750 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   |= SQLITE_OPEN_
22760 41 55 54 4f 50 52 4f 58 59 3b 0a 20 20 20 20 20  AUTOPROXY;.     
22770 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
22780 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f 70 65  rc = sqlite3_ope
22790 6e 5f 76 32 28 70 53 72 63 46 69 6c 65 2d 3e 7a  n_v2(pSrcFile->z
227a0 50 61 74 68 2c 20 26 73 72 63 64 62 32 2c 20 73  Path, &srcdb2, s
227b0 72 63 46 6c 61 67 73 2c 20 30 29 3b 0a 20 20 20  rcFlags, 0);.   
227c0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
227d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
227e0 2f 2a 20 73 74 61 72 74 20 61 20 64 65 66 65 72  /* start a defer
227f0 72 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  red transaction 
22800 61 6e 64 20 72 65 61 64 20 74 6f 20 65 73 74 61  and read to esta
22810 62 6c 69 73 68 20 61 20 72 65 61 64 20 6c 6f 63  blish a read loc
22820 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20  k */.        rc 
22830 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 73  = sqlite3_exec(s
22840 72 63 64 62 32 2c 20 22 42 45 47 49 4e 20 44 45  rcdb2, "BEGIN DE
22850 46 45 52 52 45 44 3b 20 50 52 41 47 4d 41 20 73  FERRED; PRAGMA s
22860 63 68 65 6d 61 5f 76 65 72 73 69 6f 6e 22 2c 0a  chema_version",.
22870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22880 20 20 20 20 20 20 20 20 20 20 30 2c 20 30 2c 20            0, 0, 
22890 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
228a0 72 63 3d 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55  rc==SQLITE_CORRU
228b0 50 54 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45  PT || rc==SQLITE
228c0 5f 4e 4f 54 41 44 42 20 29 7b 0a 20 20 20 20 20  _NOTADB ){.     
228d0 20 20 20 20 20 69 73 53 72 63 43 6f 72 72 75 70       isSrcCorrup
228e0 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  t = 1;.         
228f0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 64 65 6d   rc = sqlite3dem
22900 6f 5f 73 75 70 65 72 6c 6f 63 6b 5f 63 6f 72 72  o_superlock_corr
22910 75 70 74 28 73 72 63 5f 66 69 6c 65 2c 20 53 51  upt(src_file, SQ
22920 4c 49 54 45 5f 4c 4f 43 4b 5f 53 48 41 52 45 44  LITE_LOCK_SHARED
22930 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
22940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
22960 63 6f 72 72 75 70 74 53 72 63 46 69 6c 65 4c 6f  corruptSrcFileLo
22970 63 6b 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ck);.        }. 
22980 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
22990 0a 20 20 69 66 28 20 21 73 72 63 64 62 32 20 7c  .  if( !srcdb2 |
229a0 7c 20 70 53 72 63 46 69 6c 65 3d 3d 4e 55 4c 4c  | pSrcFile==NULL
229b0 20 7c 7c 20 70 53 72 63 46 69 6c 65 2d 3e 68 3c   || pSrcFile->h<
229c0 30 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  0){.    rc = SQL
229d0 49 54 45 5f 49 4e 54 45 52 4e 41 4c 3b 0a 20 20  ITE_INTERNAL;.  
229e0 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  }.  if( rc!=SQLI
229f0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74  TE_OK ){.    got
22a00 6f 20 65 6e 64 5f 72 65 70 6c 61 63 65 5f 64 61  o end_replace_da
22a10 74 61 62 61 73 65 3b 0a 20 20 7d 0a 20 20 2f 2a  tabase;.  }.  /*
22a20 20 62 6f 74 68 20 64 61 74 61 62 61 73 65 73 20   both databases 
22a30 61 72 65 20 6c 6f 63 6b 65 64 20 61 70 70 72 6f  are locked appro
22a40 70 72 69 61 74 65 6c 79 2c 20 63 6f 70 79 20 74  priately, copy t
22a50 68 65 20 73 72 63 20 77 61 6c 20 6a 6f 75 72 6e  he src wal journ
22a60 61 6c 20 69 66 20 0a 20 20 20 2a 2a 20 6f 6e 65  al if .   ** one
22a70 20 65 78 69 73 74 73 20 61 6e 64 20 74 68 65 6e   exists and then
22a80 20 74 68 65 20 61 63 74 75 61 6c 20 64 61 74 61   the actual data
22a90 62 61 73 65 20 66 69 6c 65 0a 20 20 20 2a 2f 0a  base file.   */.
22aa0 20 20 73 74 72 6c 63 70 79 28 73 72 63 57 61 6c    strlcpy(srcWal
22ab0 50 61 74 68 2c 20 70 53 72 63 46 69 6c 65 2d 3e  Path, pSrcFile->
22ac0 7a 50 61 74 68 2c 20 4d 41 58 50 41 54 48 4c 45  zPath, MAXPATHLE
22ad0 4e 2b 35 29 3b 0a 20 20 73 74 72 6c 63 61 74 28  N+5);.  strlcat(
22ae0 73 72 63 57 61 6c 50 61 74 68 2c 20 22 2d 77 61  srcWalPath, "-wa
22af0 6c 22 2c 20 4d 41 58 50 41 54 48 4c 45 4e 2b 35  l", MAXPATHLEN+5
22b00 29 3b 0a 20 20 73 72 63 57 61 6c 46 44 20 3d 20  );.  srcWalFD = 
22b10 6f 70 65 6e 28 73 72 63 57 61 6c 50 61 74 68 2c  open(srcWalPath,
22b20 20 4f 5f 52 44 4f 4e 4c 59 29 3b 0a 20 20 69 66   O_RDONLY);.  if
22b30 28 20 21 28 73 72 63 57 61 6c 46 44 3c 30 29 20  ( !(srcWalFD<0) 
22b40 29 7b 0a 20 20 20 20 63 68 61 72 20 64 73 74 57  ){.    char dstW
22b50 61 6c 50 61 74 68 5b 4d 41 58 50 41 54 48 4c 45  alPath[MAXPATHLE
22b60 4e 2b 35 5d 3b 0a 20 20 20 20 69 6e 74 20 64 73  N+5];.    int ds
22b70 74 57 61 6c 46 44 20 3d 20 2d 31 3b 0a 20 20 20  tWalFD = -1;.   
22b80 20 69 6e 74 20 70 72 6f 74 46 6c 61 67 73 20 3d   int protFlags =
22b90 20 30 3b 0a 20 20 20 20 73 74 72 6c 63 70 79 28   0;.    strlcpy(
22ba0 64 73 74 57 61 6c 50 61 74 68 2c 20 70 46 69 6c  dstWalPath, pFil
22bb0 65 2d 3e 7a 50 61 74 68 2c 20 4d 41 58 50 41 54  e->zPath, MAXPAT
22bc0 48 4c 45 4e 2b 35 29 3b 0a 20 20 20 20 73 74 72  HLEN+5);.    str
22bd0 6c 63 61 74 28 64 73 74 57 61 6c 50 61 74 68 2c  lcat(dstWalPath,
22be0 20 22 2d 77 61 6c 22 2c 20 4d 41 58 50 41 54 48   "-wal", MAXPATH
22bf0 4c 45 4e 2b 35 29 3b 0a 0a 20 20 20 20 72 63 20  LEN+5);..    rc 
22c00 3d 20 75 6e 69 78 4f 70 65 6e 43 68 69 6c 64 46  = unixOpenChildF
22c10 69 6c 65 28 64 73 74 57 61 6c 50 61 74 68 2c 20  ile(dstWalPath, 
22c20 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54 2c 20  O_RDWR|O_CREAT, 
22c30 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 2c  SQLITE_OPEN_WAL,
22c40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
22c50 20 20 20 20 20 20 20 20 20 20 20 20 70 72 6f 74              prot
22c60 46 6c 61 67 73 2c 20 26 64 73 74 57 61 6c 46 44  Flags, &dstWalFD
22c70 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
22c80 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
22c90 20 20 73 20 3d 20 63 6f 70 79 66 69 6c 65 5f 73    s = copyfile_s
22ca0 74 61 74 65 5f 61 6c 6c 6f 63 28 29 3b 0a 20 20  tate_alloc();.  
22cb0 20 20 20 20 6c 73 65 65 6b 28 73 72 63 57 61 6c      lseek(srcWal
22cc0 46 44 2c 20 30 2c 20 53 45 45 4b 5f 53 45 54 29  FD, 0, SEEK_SET)
22cd0 3b 0a 20 20 20 20 20 20 6c 73 65 65 6b 28 64 73  ;.      lseek(ds
22ce0 74 57 61 6c 46 44 2c 20 30 2c 20 53 45 45 4b 5f  tWalFD, 0, SEEK_
22cf0 53 45 54 29 3b 0a 20 20 20 20 20 20 69 66 28 20  SET);.      if( 
22d00 66 63 6f 70 79 66 69 6c 65 28 73 72 63 57 61 6c  fcopyfile(srcWal
22d10 46 44 2c 20 64 73 74 57 61 6c 46 44 2c 20 73 2c  FD, dstWalFD, s,
22d20 20 43 4f 50 59 46 49 4c 45 5f 44 41 54 41 29 20   COPYFILE_DATA) 
22d30 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 65  ){.        int e
22d40 72 72 3d 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20  rr=errno;.      
22d50 20 20 73 77 69 74 63 68 28 65 72 72 29 20 7b 0a    switch(err) {.
22d60 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20 45            case E
22d70 4e 4f 4d 45 4d 3a 0a 20 20 20 20 20 20 20 20 20  NOMEM:.         
22d80 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
22d90 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20  OMEM;.          
22da0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
22db0 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20     default:.    
22dc0 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73          storeLas
22dd0 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72  tErrno(pFile, er
22de0 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  r);.            
22df0 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
22e00 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  R;.        }.   
22e10 20 20 20 7d 0a 20 20 20 20 20 20 63 6f 70 79 66     }.      copyf
22e20 69 6c 65 5f 73 74 61 74 65 5f 66 72 65 65 28 73  ile_state_free(s
22e30 29 3b 0a 20 20 20 20 20 20 63 6c 6f 73 65 28 64  );.      close(d
22e40 73 74 57 61 6c 46 44 29 3b 0a 20 20 20 20 7d 0a  stWalFD);.    }.
22e50 20 20 20 20 63 6c 6f 73 65 28 73 72 63 57 61 6c      close(srcWal
22e60 46 44 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  FD);.  }.  if( r
22e70 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
22e80 20 20 20 20 2f 2a 20 62 65 66 6f 72 65 20 77 65      /* before we
22e90 20 63 6f 70 79 2c 20 65 6e 73 75 72 65 20 74 68   copy, ensure th
22ea0 61 74 20 74 68 65 20 66 69 6c 65 20 63 68 61 6e  at the file chan
22eb0 67 65 20 63 6f 75 6e 74 65 72 20 77 69 6c 6c 20  ge counter will 
22ec0 62 65 20 6d 6f 64 69 66 69 65 64 20 2a 2f 0a 20  be modified */. 
22ed0 20 20 20 75 69 6e 74 33 32 5f 74 20 73 72 63 43     uint32_t srcC
22ee0 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 75  hange = 0;.    u
22ef0 69 6e 74 33 32 5f 74 20 64 73 74 43 68 61 6e 67  int32_t dstChang
22f00 65 20 3d 20 30 3b 0a 20 20 20 20 70 72 65 61 64  e = 0;.    pread
22f10 28 70 53 72 63 46 69 6c 65 2d 3e 68 2c 20 26 73  (pSrcFile->h, &s
22f20 72 63 43 68 61 6e 67 65 2c 20 34 2c 20 32 34 29  rcChange, 4, 24)
22f30 3b 0a 20 20 20 20 70 72 65 61 64 28 70 46 69 6c  ;.    pread(pFil
22f40 65 2d 3e 68 2c 20 26 64 73 74 43 68 61 6e 67 65  e->h, &dstChange
22f50 2c 20 34 2c 20 32 34 29 3b 0a 20 20 20 20 0a 20  , 4, 24);.    . 
22f60 20 20 20 2f 2a 20 63 6f 70 79 20 74 68 65 20 61     /* copy the a
22f70 63 74 75 61 6c 20 64 61 74 61 62 61 73 65 20 2a  ctual database *
22f80 2f 0a 20 20 20 20 73 20 3d 20 63 6f 70 79 66 69  /.    s = copyfi
22f90 6c 65 5f 73 74 61 74 65 5f 61 6c 6c 6f 63 28 29  le_state_alloc()
22fa0 3b 0a 20 20 20 20 6c 73 65 65 6b 28 70 53 72 63  ;.    lseek(pSrc
22fb0 46 69 6c 65 2d 3e 68 2c 20 30 2c 20 53 45 45 4b  File->h, 0, SEEK
22fc0 5f 53 45 54 29 3b 0a 20 20 20 20 6c 73 65 65 6b  _SET);.    lseek
22fd0 28 70 46 69 6c 65 2d 3e 68 2c 20 30 2c 20 53 45  (pFile->h, 0, SE
22fe0 45 4b 5f 53 45 54 29 3b 0a 20 20 20 20 69 66 28  EK_SET);.    if(
22ff0 20 66 63 6f 70 79 66 69 6c 65 28 70 53 72 63 46   fcopyfile(pSrcF
23000 69 6c 65 2d 3e 68 2c 20 70 46 69 6c 65 2d 3e 68  ile->h, pFile->h
23010 2c 20 73 2c 20 43 4f 50 59 46 49 4c 45 5f 44 41  , s, COPYFILE_DA
23020 54 41 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  TA) ){.      int
23030 20 65 72 72 3d 65 72 72 6e 6f 3b 0a 20 20 20 20   err=errno;.    
23040 20 20 73 77 69 74 63 68 28 65 72 72 29 20 7b 0a    switch(err) {.
23050 20 20 20 20 20 20 20 20 63 61 73 65 20 45 4e 4f          case ENO
23060 4d 45 4d 3a 0a 20 20 20 20 20 20 20 20 20 20 72  MEM:.          r
23070 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
23080 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
23090 6b 3b 0a 20 20 20 20 20 20 20 20 64 65 66 61 75  k;.        defau
230a0 6c 74 3a 0a 20 20 20 20 20 20 20 20 20 20 73 74  lt:.          st
230b0 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69  oreLastErrno(pFi
230c0 6c 65 2c 20 65 72 72 29 3b 0a 20 20 20 20 20 20  le, err);.      
230d0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
230e0 49 4f 45 52 52 3b 0a 20 20 20 20 20 20 7d 0a 20  IOERR;.      }. 
230f0 20 20 20 7d 0a 20 20 20 20 63 6f 70 79 66 69 6c     }.    copyfil
23100 65 5f 73 74 61 74 65 5f 66 72 65 65 28 73 29 3b  e_state_free(s);
23110 0a 20 20 20 20 0a 20 20 20 20 69 66 20 28 73 72  .    .    if (sr
23120 63 43 68 61 6e 67 65 20 3d 3d 20 64 73 74 43 68  cChange == dstCh
23130 61 6e 67 65 29 20 7b 0a 20 20 20 20 20 20 2f 2a  ange) {.      /*
23140 20 6d 6f 64 69 66 79 20 74 68 65 20 63 68 61 6e   modify the chan
23150 67 65 20 63 6f 75 6e 74 65 72 20 74 6f 20 66 6f  ge counter to fo
23160 72 63 65 20 70 61 67 65 20 7a 65 72 6f 20 74 6f  rce page zero to
23170 20 62 65 20 72 65 6c 6f 61 64 65 64 20 2a 2f 0a   be reloaded */.
23180 20 20 20 20 20 20 64 73 74 43 68 61 6e 67 65 20        dstChange 
23190 2b 2b 3b 0a 20 20 20 20 20 20 70 77 72 69 74 65  ++;.      pwrite
231a0 28 70 46 69 6c 65 2d 3e 68 2c 20 26 64 73 74 43  (pFile->h, &dstC
231b0 68 61 6e 67 65 2c 20 34 2c 20 32 34 29 3b 0a 20  hange, 4, 24);. 
231c0 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 69     }.  }.  if( i
231d0 73 53 72 63 43 6f 72 72 75 70 74 20 29 7b 0a 20  sSrcCorrupt ){. 
231e0 20 20 20 73 71 6c 69 74 65 33 64 65 6d 6f 5f 73     sqlite3demo_s
231f0 75 70 65 72 75 6e 6c 6f 63 6b 5f 63 6f 72 72 75  uperunlock_corru
23200 70 74 28 73 72 63 5f 66 69 6c 65 2c 20 63 6f 72  pt(src_file, cor
23210 72 75 70 74 53 72 63 46 69 6c 65 4c 6f 63 6b 29  ruptSrcFileLock)
23220 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
23230 2a 20 64 6f 6e 65 20 77 69 74 68 20 74 68 65 20  * done with the 
23240 73 6f 75 72 63 65 20 64 62 20 73 6f 20 65 6e 64  source db so end
23250 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
23260 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   */.    sqlite3_
23270 65 78 65 63 28 73 72 63 64 62 32 2c 20 22 43 4f  exec(srcdb2, "CO
23280 4d 4d 49 54 22 2c 20 30 2c 20 30 2c 20 30 29 3b  MMIT", 0, 0, 0);
23290 0a 20 20 7d 0a 20 20 2f 2a 20 7a 65 72 6f 20 6f  .  }.  /* zero o
232a0 75 74 20 61 6e 79 20 6f 6c 64 20 6a 6f 75 72 6e  ut any old journ
232b0 61 6c 20 63 6c 75 74 74 65 72 20 2a 2f 0a 20 20  al clutter */.  
232c0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
232d0 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 73 6b 69  K ){.    int ski
232e0 70 57 41 4c 20 3d 20 28 73 72 63 57 61 6c 46 44  pWAL = (srcWalFD
232f0 3c 30 29 3f 30 3a 31 3b 0a 20 20 20 20 75 6e 69  <0)?0:1;.    uni
23300 78 49 6e 76 61 6c 69 64 61 74 65 53 75 70 70 6f  xInvalidateSuppo
23310 72 74 46 69 6c 65 73 28 70 46 69 6c 65 2c 20 73  rtFiles(pFile, s
23320 6b 69 70 57 41 4c 29 3b 0a 20 20 7d 0a 20 20 0a  kipWAL);.  }.  .
23330 65 6e 64 5f 72 65 70 6c 61 63 65 5f 64 61 74 61  end_replace_data
23340 62 61 73 65 3a 0a 20 20 69 66 28 20 70 53 72 63  base:.  if( pSrc
23350 42 74 72 65 65 20 29 7b 0a 20 20 20 20 73 71 6c  Btree ){.    sql
23360 69 74 65 33 5f 63 6c 6f 73 65 28 73 72 63 64 62  ite3_close(srcdb
23370 32 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  2);.    sqlite3B
23380 74 72 65 65 4c 65 61 76 65 28 70 53 72 63 42 74  treeLeave(pSrcBt
23390 72 65 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ree);.  }.  sqli
233a0 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
233b0 73 72 63 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  srcdb->mutex);. 
233c0 20 69 66 28 20 69 73 44 73 74 43 6f 72 72 75 70   if( isDstCorrup
233d0 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
233e0 64 65 6d 6f 5f 73 75 70 65 72 75 6e 6c 6f 63 6b  demo_superunlock
233f0 5f 63 6f 72 72 75 70 74 28 69 64 2c 20 63 6f 72  _corrupt(id, cor
23400 72 75 70 74 44 73 74 46 69 6c 65 4c 6f 63 6b 29  ruptDstFileLock)
23410 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
23420 71 6c 69 74 65 33 64 65 6d 6f 5f 73 75 70 65 72  qlite3demo_super
23430 75 6e 6c 6f 63 6b 28 70 4c 6f 63 6b 29 3b 0a 20  unlock(pLock);. 
23440 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
23450 7d 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45  }.#define SQLITE
23460 5f 46 49 4c 45 5f 48 45 41 44 45 52 5f 4c 45 4e  _FILE_HEADER_LEN
23470 20 31 36 0a 2f 2a 20 43 68 65 63 6b 20 66 6f 72   16./* Check for
23480 20 61 20 63 6f 6e 66 6c 69 63 74 69 6e 67 20 6c   a conflicting l
23490 6f 63 6b 2e 20 20 49 66 20 6f 6e 65 20 69 73 20  ock.  If one is 
234a0 66 6f 75 6e 64 2c 20 70 72 69 6e 74 20 61 6e 20  found, print an 
234b0 74 68 69 73 0a 20 2a 2a 20 6f 6e 20 73 74 61 6e  this. ** on stan
234c0 64 61 72 64 20 6f 75 74 70 75 74 20 75 73 69 6e  dard output usin
234d0 67 20 74 68 65 20 66 6f 72 6d 61 74 20 73 74 72  g the format str
234e0 69 6e 67 20 67 69 76 65 6e 20 61 6e 64 20 72 65  ing given and re
234f0 74 75 72 6e 20 31 2e 0a 20 2a 2a 20 49 66 20 74  turn 1.. ** If t
23500 68 65 72 65 20 61 72 65 20 6e 6f 20 63 6f 6e 66  here are no conf
23510 6c 69 63 74 69 6e 67 20 6c 6f 63 6b 73 2c 20 72  licting locks, r
23520 65 74 75 72 6e 20 30 2e 0a 20 2a 2f 0a 73 74 61  eturn 0.. */.sta
23530 74 69 63 20 69 6e 74 20 75 6e 69 78 49 73 4c 6f  tic int unixIsLo
23540 63 6b 65 64 28 0a 20 20 70 69 64 5f 74 20 70 69  cked(.  pid_t pi
23550 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  d,            /*
23560 20 50 49 44 20 74 6f 20 74 65 73 74 20 66 6f 72   PID to test for
23570 20 6c 6f 63 6b 20 6f 77 6e 65 72 20 2a 2f 0a 20   lock owner */. 
23580 20 69 6e 74 20 68 2c 20 20 20 20 20 20 20 20 20   int h,         
23590 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64         /* File d
235a0 65 73 63 72 69 70 74 6f 72 20 74 6f 20 63 68 65  escriptor to che
235b0 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 74 79 70 65  ck */.  int type
235c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
235d0 20 46 5f 52 44 4c 43 4b 20 6f 72 20 46 5f 57 52   F_RDLCK or F_WR
235e0 4c 43 4b 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  LCK */.  unsigne
235f0 64 20 69 6e 74 20 69 4f 66 73 74 2c 20 20 20 2f  d int iOfst,   /
23600 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66 20  * First byte of 
23610 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e  the lock */.  un
23620 73 69 67 6e 65 64 20 69 6e 74 20 69 43 6e 74 2c  signed int iCnt,
23630 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
23640 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6c 6f   bytes in the lo
23650 63 6b 20 72 61 6e 67 65 20 2a 2f 0a 20 20 63 6f  ck range */.  co
23660 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 20  nst char *zType 
23670 20 20 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 6c      /* Type of l
23680 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75  ock */.){.  stru
23690 63 74 20 66 6c 6f 63 6b 20 6c 6b 3b 0a 20 20 69  ct flock lk;.  i
236a0 6e 74 20 65 72 72 3b 0a 20 20 0a 20 20 6d 65 6d  nt err;.  .  mem
236b0 73 65 74 28 26 6c 6b 2c 20 30 2c 20 73 69 7a 65  set(&lk, 0, size
236c0 6f 66 28 6c 6b 29 29 3b 0a 20 20 6c 6b 2e 6c 5f  of(lk));.  lk.l_
236d0 74 79 70 65 20 3d 20 74 79 70 65 3b 0a 20 20 6c  type = type;.  l
236e0 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45  k.l_whence = SEE
236f0 4b 5f 53 45 54 3b 0a 20 20 6c 6b 2e 6c 5f 73 74  K_SET;.  lk.l_st
23700 61 72 74 20 3d 20 69 4f 66 73 74 3b 0a 20 20 6c  art = iOfst;.  l
23710 6b 2e 6c 5f 6c 65 6e 20 3d 20 69 43 6e 74 3b 0a  k.l_len = iCnt;.
23720 20 20 0a 20 20 69 66 28 20 70 69 64 21 3d 53 51    .  if( pid!=SQ
23730 4c 49 54 45 5f 4c 4f 43 4b 53 54 41 54 45 5f 41  LITE_LOCKSTATE_A
23740 4e 59 50 49 44 20 29 7b 0a 23 69 66 6e 64 65 66  NYPID ){.#ifndef
23750 20 46 5f 47 45 54 4c 4b 50 49 44 0a 23 20 77 61   F_GETLKPID.# wa
23760 72 6e 69 6e 67 20 46 5f 47 45 54 4c 4b 50 49 44  rning F_GETLKPID
23770 20 75 6e 64 65 66 69 6e 65 64 2c 20 5f 73 71 6c   undefined, _sql
23780 69 74 65 33 5f 6c 6f 63 6b 73 74 61 74 65 20 66  ite3_lockstate f
23790 61 6c 6c 69 6e 67 20 62 61 63 6b 20 74 6f 20 46  alling back to F
237a0 5f 47 45 54 4c 4b 0a 20 20 20 20 65 72 72 20 3d  _GETLK.    err =
237b0 20 66 63 6e 74 6c 28 68 2c 20 46 5f 47 45 54 4c   fcntl(h, F_GETL
237c0 4b 2c 20 26 6c 6b 29 3b 0a 23 65 6c 73 65 0a 20  K, &lk);.#else. 
237d0 20 20 20 6c 6b 2e 6c 5f 70 69 64 20 3d 20 70 69     lk.l_pid = pi
237e0 64 3b 0a 20 20 20 20 65 72 72 20 3d 20 66 63 6e  d;.    err = fcn
237f0 74 6c 28 68 2c 20 46 5f 47 45 54 4c 4b 50 49 44  tl(h, F_GETLKPID
23800 2c 20 26 6c 6b 29 3b 0a 23 65 6e 64 69 66 0a 20  , &lk);.#endif. 
23810 20 7d 65 6c 73 65 7b 0a 20 20 20 20 65 72 72 20   }else{.    err 
23820 3d 20 66 63 6e 74 6c 28 68 2c 20 46 5f 47 45 54  = fcntl(h, F_GET
23830 4c 4b 2c 20 26 6c 6b 29 3b 0a 20 20 7d 0a 20 20  LK, &lk);.  }.  
23840 0a 20 20 69 66 28 20 65 72 72 3d 3d 28 2d 31 29  .  if( err==(-1)
23850 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28   ){.    fprintf(
23860 73 74 64 65 72 72 2c 20 22 66 63 6e 74 6c 28 25  stderr, "fcntl(%
23870 64 29 20 66 61 69 6c 65 64 3a 20 65 72 72 6e 6f  d) failed: errno
23880 3d 25 64 5c 6e 22 2c 20 68 2c 20 65 72 72 6e 6f  =%d\n", h, errno
23890 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 31  );.    return -1
238a0 3b 0a 20 20 7d 0a 20 20 0a 20 20 69 66 28 20 6c  ;.  }.  .  if( l
238b0 6b 2e 6c 5f 74 79 70 65 21 3d 46 5f 55 4e 4c 43  k.l_type!=F_UNLC
238c0 4b 20 26 26 20 28 70 69 64 3d 3d 53 51 4c 49 54  K && (pid==SQLIT
238d0 45 5f 4c 4f 43 4b 53 54 41 54 45 5f 41 4e 59 50  E_LOCKSTATE_ANYP
238e0 49 44 20 7c 7c 20 6c 6b 2e 6c 5f 70 69 64 3d 3d  ID || lk.l_pid==
238f0 70 69 64 29 20 29 7b 0a 23 69 66 64 65 66 20 53  pid) ){.#ifdef S
23900 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20  QLITE_DEBUG.    
23910 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  fprintf(stderr, 
23920 22 25 73 20 6c 6f 63 6b 20 68 65 6c 64 20 62 79  "%s lock held by
23930 20 25 64 5c 6e 22 2c 20 7a 54 79 70 65 2c 20 28   %d\n", zType, (
23940 69 6e 74 29 6c 6b 2e 6c 5f 70 69 64 29 3b 0a 23  int)lk.l_pid);.#
23950 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72 6e  endif.    return
23960 20 31 3b 0a 20 20 7d 20 0a 20 20 72 65 74 75 72   1;.  } .  retur
23970 6e 20 30 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69  n 0;.}..static i
23980 6e 74 20 75 6e 69 78 4c 6f 63 6b 73 74 61 74 65  nt unixLockstate
23990 50 69 64 28 75 6e 69 78 46 69 6c 65 20 2a 2c 20  Pid(unixFile *, 
239a0 70 69 64 5f 74 2c 20 69 6e 74 20 2a 29 3b 0a 0a  pid_t, int *);..
239b0 23 65 6e 64 69 66 20 2f 2a 20 28 53 51 4c 49 54  #endif /* (SQLIT
239c0 45 5f 45 4e 41 42 4c 45 5f 41 50 50 4c 45 5f 53  E_ENABLE_APPLE_S
239d0 50 49 3e 30 29 20 26 26 20 64 65 66 69 6e 65 64  PI>0) && defined
239e0 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 2a 2f 0a 0a  (__APPLE__) */..
239f0 0a 2f 2a 0a 2a 2a 20 49 66 20 2a 70 41 72 67 20  ./*.** If *pArg 
23a00 69 73 20 69 6e 69 74 69 74 69 61 6c 6c 79 20 6e  is inititially n
23a10 65 67 61 74 69 76 65 20 74 68 65 6e 20 74 68 69  egative then thi
23a20 73 20 69 73 20 61 20 71 75 65 72 79 2e 20 20 53  s is a query.  S
23a30 65 74 20 2a 70 41 72 67 20 74 6f 0a 2a 2a 20 31  et *pArg to.** 1
23a40 20 6f 72 20 30 20 64 65 70 65 6e 64 69 6e 67 20   or 0 depending 
23a50 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  on whether or no
23a60 74 20 62 69 74 20 6d 61 73 6b 20 6f 66 20 70 46  t bit mask of pF
23a70 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 69  ile->ctrlFlags i
23a80 73 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  s set..**.** If 
23a90 2a 70 41 72 67 20 69 73 20 30 20 6f 72 20 31 2c  *pArg is 0 or 1,
23aa0 20 74 68 65 6e 20 63 6c 65 61 72 20 6f 72 20 73   then clear or s
23ab0 65 74 20 74 68 65 20 6d 61 73 6b 20 62 69 74 20  et the mask bit 
23ac0 6f 66 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c  of pFile->ctrlFl
23ad0 61 67 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ags..*/.static v
23ae0 6f 69 64 20 75 6e 69 78 4d 6f 64 65 42 69 74 28  oid unixModeBit(
23af0 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c  unixFile *pFile,
23b00 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6d   unsigned char m
23b10 61 73 6b 2c 20 69 6e 74 20 2a 70 41 72 67 29 7b  ask, int *pArg){
23b20 0a 20 20 69 66 28 20 2a 70 41 72 67 3c 30 20 29  .  if( *pArg<0 )
23b30 7b 0a 20 20 20 20 2a 70 41 72 67 20 3d 20 28 70  {.    *pArg = (p
23b40 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20  File->ctrlFlags 
23b50 26 20 6d 61 73 6b 29 21 3d 30 3b 0a 20 20 7d 65  & mask)!=0;.  }e
23b60 6c 73 65 20 69 66 28 20 28 2a 70 41 72 67 29 3d  lse if( (*pArg)=
23b70 3d 30 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  =0 ){.    pFile-
23b80 3e 63 74 72 6c 46 6c 61 67 73 20 26 3d 20 7e 6d  >ctrlFlags &= ~m
23b90 61 73 6b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ask;.  }else{.  
23ba0 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61    pFile->ctrlFla
23bb0 67 73 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 7d 0a  gs |= mask;.  }.
23bc0 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64 65  }../* Forward de
23bd0 63 6c 61 72 61 74 69 6f 6e 20 2a 2f 0a 73 74 61  claration */.sta
23be0 74 69 63 20 69 6e 74 20 75 6e 69 78 47 65 74 54  tic int unixGetT
23bf0 65 6d 70 6e 61 6d 65 28 69 6e 74 20 6e 42 75 66  empname(int nBuf
23c00 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 3b 0a 0a  , char *zBuf);..
23c10 2f 2a 0a 2a 2a 20 49 6e 66 6f 72 6d 61 74 69 6f  /*.** Informatio
23c20 6e 20 61 6e 64 20 63 6f 6e 74 72 6f 6c 20 6f 66  n and control of
23c30 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20 68 61   an open file ha
23c40 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ndle..*/.static 
23c50 69 6e 74 20 75 6e 69 78 46 69 6c 65 43 6f 6e 74  int unixFileCont
23c60 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  rol(sqlite3_file
23c70 20 2a 69 64 2c 20 69 6e 74 20 6f 70 2c 20 76 6f   *id, int op, vo
23c80 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 75 6e 69  id *pArg){.  uni
23c90 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
23ca0 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
23cb0 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20  switch( op ){.  
23cc0 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
23cd0 4e 54 4c 5f 4c 4f 43 4b 53 54 41 54 45 3a 20 7b  NTL_LOCKSTATE: {
23ce0 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a 29 70 41  .      *(int*)pA
23cf0 72 67 20 3d 20 70 46 69 6c 65 2d 3e 65 46 69 6c  rg = pFile->eFil
23d00 65 4c 6f 63 6b 3b 0a 20 20 20 20 20 20 72 65 74  eLock;.      ret
23d10 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
23d20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
23d30 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c 41 53 54 5f  LITE_FCNTL_LAST_
23d40 45 52 52 4e 4f 3a 20 7b 0a 20 20 20 20 20 20 2a  ERRNO: {.      *
23d50 28 69 6e 74 2a 29 70 41 72 67 20 3d 20 70 46 69  (int*)pArg = pFi
23d60 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b 0a 20  le->lastErrno;. 
23d70 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
23d80 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
23d90 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
23da0 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a 45 3a 20 7b  TL_CHUNK_SIZE: {
23db0 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 7a  .      pFile->sz
23dc0 43 68 75 6e 6b 20 3d 20 2a 28 69 6e 74 20 2a 29  Chunk = *(int *)
23dd0 70 41 72 67 3b 0a 20 20 20 20 20 20 72 65 74 75  pArg;.      retu
23de0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
23df0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
23e00 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f 48  ITE_FCNTL_SIZE_H
23e10 49 4e 54 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  INT: {.      int
23e20 20 72 63 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c   rc;.      Simul
23e30 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e  ateIOErrorBenign
23e40 28 31 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  (1);.      rc = 
23e50 66 63 6e 74 6c 53 69 7a 65 48 69 6e 74 28 70 46  fcntlSizeHint(pF
23e60 69 6c 65 2c 20 2a 28 69 36 34 20 2a 29 70 41 72  ile, *(i64 *)pAr
23e70 67 29 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61  g);.      Simula
23e80 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28  teIOErrorBenign(
23e90 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  0);.      return
23ea0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63   rc;.    }.    c
23eb0 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ase SQLITE_FCNTL
23ec0 5f 50 45 52 53 49 53 54 5f 57 41 4c 3a 20 7b 0a  _PERSIST_WAL: {.
23ed0 20 20 20 20 20 20 75 6e 69 78 4d 6f 64 65 42 69        unixModeBi
23ee0 74 28 70 46 69 6c 65 2c 20 55 4e 49 58 46 49 4c  t(pFile, UNIXFIL
23ef0 45 5f 50 45 52 53 49 53 54 5f 57 41 4c 2c 20 28  E_PERSIST_WAL, (
23f00 69 6e 74 2a 29 70 41 72 67 29 3b 0a 20 20 20 20  int*)pArg);.    
23f10 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
23f20 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  OK;.    }.    ca
23f30 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
23f40 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52  POWERSAFE_OVERWR
23f50 49 54 45 3a 20 7b 0a 20 20 20 20 20 20 75 6e 69  ITE: {.      uni
23f60 78 4d 6f 64 65 42 69 74 28 70 46 69 6c 65 2c 20  xModeBit(pFile, 
23f70 55 4e 49 58 46 49 4c 45 5f 50 53 4f 57 2c 20 28  UNIXFILE_PSOW, (
23f80 69 6e 74 2a 29 70 41 72 67 29 3b 0a 20 20 20 20  int*)pArg);.    
23f90 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
23fa0 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  OK;.    }.    ca
23fb0 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
23fc0 56 46 53 4e 41 4d 45 3a 20 7b 0a 20 20 20 20 20  VFSNAME: {.     
23fd0 20 2a 28 63 68 61 72 2a 2a 29 70 41 72 67 20 3d   *(char**)pArg =
23fe0 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
23ff0 28 22 25 73 22 2c 20 70 46 69 6c 65 2d 3e 70 56  ("%s", pFile->pV
24000 66 73 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  fs->zName);.    
24010 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
24020 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  OK;.    }.    ca
24030 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
24040 54 45 4d 50 46 49 4c 45 4e 41 4d 45 3a 20 7b 0a  TEMPFILENAME: {.
24050 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 46 69        char *zTFi
24060 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  le = sqlite3_mal
24070 6c 6f 63 28 20 70 46 69 6c 65 2d 3e 70 56 66 73  loc( pFile->pVfs
24080 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20 29 3b 0a  ->mxPathname );.
24090 20 20 20 20 20 20 69 66 28 20 7a 54 46 69 6c 65        if( zTFile
240a0 20 29 7b 0a 20 20 20 20 20 20 20 20 75 6e 69 78   ){.        unix
240b0 47 65 74 54 65 6d 70 6e 61 6d 65 28 70 46 69 6c  GetTempname(pFil
240c0 65 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  e->pVfs->mxPathn
240d0 61 6d 65 2c 20 7a 54 46 69 6c 65 29 3b 0a 20 20  ame, zTFile);.  
240e0 20 20 20 20 20 20 2a 28 63 68 61 72 2a 2a 29 70        *(char**)p
240f0 41 72 67 20 3d 20 7a 54 46 69 6c 65 3b 0a 20 20  Arg = zTFile;.  
24100 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
24110 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
24120 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
24130 49 54 45 5f 46 43 4e 54 4c 5f 48 41 53 5f 4d 4f  ITE_FCNTL_HAS_MO
24140 56 45 44 3a 20 7b 0a 20 20 20 20 20 20 2a 28 69  VED: {.      *(i
24150 6e 74 2a 29 70 41 72 67 20 3d 20 66 69 6c 65 48  nt*)pArg = fileH
24160 61 73 4d 6f 76 65 64 28 70 46 69 6c 65 29 3b 0a  asMoved(pFile);.
24170 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
24180 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 23 69  ITE_OK;.    }.#i
24190 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  f SQLITE_MAX_MMA
241a0 50 5f 53 49 5a 45 3e 30 0a 20 20 20 20 63 61 73  P_SIZE>0.    cas
241b0 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d  e SQLITE_FCNTL_M
241c0 4d 41 50 5f 53 49 5a 45 3a 20 7b 0a 20 20 20 20  MAP_SIZE: {.    
241d0 20 20 69 36 34 20 6e 65 77 4c 69 6d 69 74 20 3d    i64 newLimit =
241e0 20 2a 28 69 36 34 2a 29 70 41 72 67 3b 0a 20 20   *(i64*)pArg;.  
241f0 20 20 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c      int rc = SQL
24200 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 69 66  ITE_OK;.      if
24210 28 20 6e 65 77 4c 69 6d 69 74 3e 73 71 6c 69 74  ( newLimit>sqlit
24220 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d  e3GlobalConfig.m
24230 78 4d 6d 61 70 20 29 7b 0a 20 20 20 20 20 20 20  xMmap ){.       
24240 20 6e 65 77 4c 69 6d 69 74 20 3d 20 73 71 6c 69   newLimit = sqli
24250 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
24260 6d 78 4d 6d 61 70 3b 0a 20 20 20 20 20 20 7d 0a  mxMmap;.      }.
24270 20 20 20 20 20 20 2a 28 69 36 34 2a 29 70 41 72        *(i64*)pAr
24280 67 20 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53  g = pFile->mmapS
24290 69 7a 65 4d 61 78 3b 0a 20 20 20 20 20 20 69 66  izeMax;.      if
242a0 28 20 6e 65 77 4c 69 6d 69 74 3e 3d 30 20 26 26  ( newLimit>=0 &&
242b0 20 6e 65 77 4c 69 6d 69 74 21 3d 70 46 69 6c 65   newLimit!=pFile
242c0 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20 26 26  ->mmapSizeMax &&
242d0 20 70 46 69 6c 65 2d 3e 6e 46 65 74 63 68 4f 75   pFile->nFetchOu
242e0 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t==0 ){.        
242f0 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d  pFile->mmapSizeM
24300 61 78 20 3d 20 6e 65 77 4c 69 6d 69 74 3b 0a 20  ax = newLimit;. 
24310 20 20 20 20 20 20 20 69 66 28 20 70 46 69 6c 65         if( pFile
24320 2d 3e 6d 6d 61 70 53 69 7a 65 3e 30 20 29 7b 0a  ->mmapSize>0 ){.
24330 20 20 20 20 20 20 20 20 20 20 75 6e 69 78 55 6e            unixUn
24340 6d 61 70 66 69 6c 65 28 70 46 69 6c 65 29 3b 0a  mapfile(pFile);.
24350 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 75            rc = u
24360 6e 69 78 4d 61 70 66 69 6c 65 28 70 46 69 6c 65  nixMapfile(pFile
24370 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 7d  , -1);.        }
24380 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
24390 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
243a0 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51  #endif.#ifdef SQ
243b0 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 2f  LITE_DEBUG.    /
243c0 2a 20 54 68 65 20 70 61 67 65 72 20 63 61 6c 6c  * The pager call
243d0 73 20 74 68 69 73 20 6d 65 74 68 6f 64 20 74 6f  s this method to
243e0 20 73 69 67 6e 61 6c 20 74 68 61 74 20 69 74 20   signal that it 
243f0 68 61 73 20 64 6f 6e 65 0a 20 20 20 20 2a 2a 20  has done.    ** 
24400 61 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 74  a rollback and t
24410 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65  hat the database
24420 20 69 73 20 74 68 65 72 65 66 6f 72 65 20 75 6e   is therefore un
24430 63 68 61 6e 67 65 64 20 61 6e 64 0a 20 20 20 20  changed and.    
24440 2a 2a 20 69 74 20 68 65 6e 63 65 20 69 74 20 69  ** it hence it i
24450 73 20 4f 4b 20 66 6f 72 20 74 68 65 20 74 72 61  s OK for the tra
24460 6e 73 61 63 74 69 6f 6e 20 63 68 61 6e 67 65 20  nsaction change 
24470 63 6f 75 6e 74 65 72 20 74 6f 20 62 65 0a 20 20  counter to be.  
24480 20 20 2a 2a 20 75 6e 63 68 61 6e 67 65 64 2e 0a    ** unchanged..
24490 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
244a0 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42 5f  SQLITE_FCNTL_DB_
244b0 55 4e 43 48 41 4e 47 45 44 3a 20 7b 0a 20 20 20  UNCHANGED: {.   
244c0 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69     ((unixFile*)i
244d0 64 29 2d 3e 64 62 55 70 64 61 74 65 20 3d 20 30  d)->dbUpdate = 0
244e0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
244f0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
24500 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54  #endif.#if SQLIT
24510 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
24520 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e 65  _STYLE && define
24530 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 20  d(__APPLE__).   
24540 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
24550 54 4c 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59  TL_SET_LOCKPROXY
24560 46 49 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 53  FILE:.    case S
24570 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 47 45 54 5f  QLITE_FCNTL_GET_
24580 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 3a 20 7b  LOCKPROXYFILE: {
24590 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 72  .      return pr
245a0 6f 78 79 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 69  oxyFileControl(i
245b0 64 2c 6f 70 2c 70 41 72 67 29 3b 0a 20 20 20 20  d,op,pArg);.    
245c0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
245d0 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
245e0 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e  G_STYLE && defin
245f0 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 2a 2f  ed(__APPLE__) */
24600 0a 23 69 66 20 28 53 51 4c 49 54 45 5f 45 4e 41  .#if (SQLITE_ENA
24610 42 4c 45 5f 41 50 50 4c 45 5f 53 50 49 3e 30 29  BLE_APPLE_SPI>0)
24620 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50   && defined(__AP
24630 50 4c 45 5f 5f 29 0a 20 20 20 20 63 61 73 65 20  PLE__).    case 
24640 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 54 52 55  SQLITE_FCNTL_TRU
24650 4e 43 41 54 45 5f 44 41 54 41 42 41 53 45 3a 20  NCATE_DATABASE: 
24660 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 75  {.      return u
24670 6e 69 78 54 72 75 6e 63 61 74 65 44 61 74 61 62  nixTruncateDatab
24680 61 73 65 28 70 46 69 6c 65 2c 20 28 70 41 72 67  ase(pFile, (pArg
24690 20 3f 20 28 2a 28 69 6e 74 20 2a 29 70 41 72 67   ? (*(int *)pArg
246a0 29 20 3a 20 30 29 29 3b 0a 20 20 20 20 7d 0a 20  ) : 0));.    }. 
246b0 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
246c0 43 4e 54 4c 5f 52 45 50 4c 41 43 45 5f 44 41 54  CNTL_REPLACE_DAT
246d0 41 42 41 53 45 3a 20 7b 0a 20 20 20 20 20 20 72  ABASE: {.      r
246e0 65 74 75 72 6e 20 75 6e 69 78 52 65 70 6c 61 63  eturn unixReplac
246f0 65 44 61 74 61 62 61 73 65 28 70 46 69 6c 65 2c  eDatabase(pFile,
24700 20 28 73 71 6c 69 74 65 33 20 2a 29 70 41 72 67   (sqlite3 *)pArg
24710 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  );.    }.    cas
24720 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c  e SQLITE_FCNTL_L
24730 4f 43 4b 53 54 41 54 45 5f 50 49 44 3a 20 7b 0a  OCKSTATE_PID: {.
24740 20 20 20 20 20 20 4c 6f 63 6b 73 74 61 74 65 50        LockstateP
24750 49 44 20 2a 70 4c 6f 63 6b 73 74 61 74 65 3b 0a  ID *pLockstate;.
24760 20 20 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20        int rc;.  
24770 20 20 20 20 0a 20 20 20 20 20 20 69 66 28 20 70      .      if( p
24780 41 72 67 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20  Arg==NULL ){.   
24790 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
247a0 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20 20 20 20  TE_MISUSE;.     
247b0 20 7d 0a 20 20 20 20 20 20 70 4c 6f 63 6b 73 74   }.      pLockst
247c0 61 74 65 20 3d 20 28 4c 6f 63 6b 73 74 61 74 65  ate = (Lockstate
247d0 50 49 44 20 2a 29 70 41 72 67 3b 0a 20 20 20 20  PID *)pArg;.    
247e0 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 63 6b 73    rc = unixLocks
247f0 74 61 74 65 50 69 64 28 70 46 69 6c 65 2c 20 70  tatePid(pFile, p
24800 4c 6f 63 6b 73 74 61 74 65 2d 3e 70 69 64 2c 20  Lockstate->pid, 
24810 26 28 70 4c 6f 63 6b 73 74 61 74 65 2d 3e 73 74  &(pLockstate->st
24820 61 74 65 29 29 3b 0a 20 20 20 20 20 20 72 65 74  ate));.      ret
24830 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
24840 20 20 20 20 0a 23 65 6e 64 69 66 20 2f 2a 20 28      .#endif /* (
24850 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
24860 50 4c 45 5f 53 50 49 3e 30 29 20 26 26 20 64 65  PLE_SPI>0) && de
24870 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
24880 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   */.  }.  return
24890 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44   SQLITE_NOTFOUND
248a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
248b0 6e 20 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a  n the sector siz
248c0 65 20 69 6e 20 62 79 74 65 73 20 6f 66 20 74 68  e in bytes of th
248d0 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 62 6c 6f  e underlying blo
248e0 63 6b 20 64 65 76 69 63 65 20 66 6f 72 0a 2a 2a  ck device for.**
248f0 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 66   the specified f
24900 69 6c 65 2e 20 54 68 69 73 20 69 73 20 61 6c 6d  ile. This is alm
24910 6f 73 74 20 61 6c 77 61 79 73 20 35 31 32 20 62  ost always 512 b
24920 79 74 65 73 2c 20 62 75 74 20 6d 61 79 20 62 65  ytes, but may be
24930 0a 2a 2a 20 6c 61 72 67 65 72 20 66 6f 72 20 73  .** larger for s
24940 6f 6d 65 20 64 65 76 69 63 65 73 2e 0a 2a 2a 0a  ome devices..**.
24950 2a 2a 20 53 51 4c 69 74 65 20 63 6f 64 65 20 61  ** SQLite code a
24960 73 73 75 6d 65 73 20 74 68 69 73 20 66 75 6e 63  ssumes this func
24970 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 66 61 69 6c  tion cannot fail
24980 2e 20 49 74 20 61 6c 73 6f 20 61 73 73 75 6d 65  . It also assume
24990 73 20 74 68 61 74 0a 2a 2a 20 69 66 20 74 77 6f  s that.** if two
249a0 20 66 69 6c 65 73 20 61 72 65 20 63 72 65 61 74   files are creat
249b0 65 64 20 69 6e 20 74 68 65 20 73 61 6d 65 20 66  ed in the same f
249c0 69 6c 65 2d 73 79 73 74 65 6d 20 64 69 72 65 63  ile-system direc
249d0 74 6f 72 79 20 28 69 2e 65 2e 0a 2a 2a 20 61 20  tory (i.e..** a 
249e0 64 61 74 61 62 61 73 65 20 61 6e 64 20 69 74 73  database and its
249f0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 74   journal file) t
24a00 68 61 74 20 74 68 65 20 73 65 63 74 6f 72 20 73  hat the sector s
24a10 69 7a 65 20 77 69 6c 6c 20 62 65 20 74 68 65 0a  ize will be the.
24a20 2a 2a 20 73 61 6d 65 20 66 6f 72 20 62 6f 74 68  ** same for both
24a30 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 5f 5f 51  ..*/.#ifndef __Q
24a40 4e 58 4e 54 4f 5f 5f 20 0a 73 74 61 74 69 63 20  NXNTO__ .static 
24a50 69 6e 74 20 75 6e 69 78 53 65 63 74 6f 72 53 69  int unixSectorSi
24a60 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ze(sqlite3_file 
24a70 2a 4e 6f 74 55 73 65 64 29 7b 0a 20 20 55 4e 55  *NotUsed){.  UNU
24a80 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
24a90 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e  tUsed);.  return
24aa0 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
24ab0 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 7d 0a 23  SECTOR_SIZE;.}.#
24ac0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
24ad0 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 65 72 73 69   following versi
24ae0 6f 6e 20 6f 66 20 75 6e 69 78 53 65 63 74 6f 72  on of unixSector
24af0 53 69 7a 65 28 29 20 69 73 20 6f 70 74 69 6d 69  Size() is optimi
24b00 7a 65 64 20 66 6f 72 20 51 4e 58 2e 0a 2a 2f 0a  zed for QNX..*/.
24b10 23 69 66 64 65 66 20 5f 5f 51 4e 58 4e 54 4f 5f  #ifdef __QNXNTO_
24b20 5f 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f  _.#include <sys/
24b30 64 63 6d 64 5f 62 6c 6b 2e 68 3e 0a 23 69 6e 63  dcmd_blk.h>.#inc
24b40 6c 75 64 65 20 3c 73 79 73 2f 73 74 61 74 76 66  lude <sys/statvf
24b50 73 2e 68 3e 0a 73 74 61 74 69 63 20 69 6e 74 20  s.h>.static int 
24b60 75 6e 69 78 53 65 63 74 6f 72 53 69 7a 65 28 73  unixSectorSize(s
24b70 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29  qlite3_file *id)
24b80 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  {.  unixFile *pF
24b90 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
24ba0 29 69 64 3b 0a 20 20 69 66 28 20 70 46 69 6c 65  )id;.  if( pFile
24bb0 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 3d 20  ->sectorSize == 
24bc0 30 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  0 ){.    struct 
24bd0 73 74 61 74 76 66 73 20 66 73 49 6e 66 6f 3b 0a  statvfs fsInfo;.
24be0 20 20 20 20 20 20 20 0a 20 20 20 20 2f 2a 20 53         .    /* S
24bf0 65 74 20 64 65 66 61 75 6c 74 73 20 66 6f 72 20  et defaults for 
24c00 6e 6f 6e 2d 73 75 70 70 6f 72 74 65 64 20 66 69  non-supported fi
24c10 6c 65 73 79 73 74 65 6d 73 20 2a 2f 0a 20 20 20  lesystems */.   
24c20 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69   pFile->sectorSi
24c30 7a 65 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41  ze = SQLITE_DEFA
24c40 55 4c 54 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b  ULT_SECTOR_SIZE;
24c50 0a 20 20 20 20 70 46 69 6c 65 2d 3e 64 65 76 69  .    pFile->devi
24c60 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
24c70 73 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 66  s = 0;.    if( f
24c80 73 74 61 74 76 66 73 28 70 46 69 6c 65 2d 3e 68  statvfs(pFile->h
24c90 2c 20 26 66 73 49 6e 66 6f 29 20 3d 3d 20 2d 31  , &fsInfo) == -1
24ca0 20 29 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72   ) {.      retur
24cb0 6e 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53  n pFile->sectorS
24cc0 69 7a 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ize;.    }..    
24cd0 69 66 28 20 21 73 74 72 63 6d 70 28 66 73 49 6e  if( !strcmp(fsIn
24ce0 66 6f 2e 66 5f 62 61 73 65 74 79 70 65 2c 20 22  fo.f_basetype, "
24cf0 74 6d 70 22 29 20 29 20 7b 0a 20 20 20 20 20 20  tmp") ) {.      
24d00 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a  pFile->sectorSiz
24d10 65 20 3d 20 66 73 49 6e 66 6f 2e 66 5f 62 73 69  e = fsInfo.f_bsi
24d20 7a 65 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  ze;.      pFile-
24d30 3e 64 65 76 69 63 65 43 68 61 72 61 63 74 65 72  >deviceCharacter
24d40 69 73 74 69 63 73 20 3d 0a 20 20 20 20 20 20 20  istics =.       
24d50 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54   SQLITE_IOCAP_AT
24d60 4f 4d 49 43 34 4b 20 7c 20 20 20 20 20 20 20 2f  OMIC4K |       /
24d70 2a 20 41 6c 6c 20 72 61 6d 20 66 69 6c 65 73 79  * All ram filesy
24d80 73 74 65 6d 20 77 72 69 74 65 73 20 61 72 65 20  stem writes are 
24d90 61 74 6f 6d 69 63 20 2a 2f 0a 20 20 20 20 20 20  atomic */.      
24da0 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53    SQLITE_IOCAP_S
24db0 41 46 45 5f 41 50 50 45 4e 44 20 7c 20 20 20 20  AFE_APPEND |    
24dc0 2f 2a 20 67 72 6f 77 69 6e 67 20 74 68 65 20 66  /* growing the f
24dd0 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63  ile does not occ
24de0 75 72 20 75 6e 74 69 6c 0a 20 20 20 20 20 20 20  ur until.       
24df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
24e10 2a 20 74 68 65 20 77 72 69 74 65 20 73 75 63 63  * the write succ
24e20 65 65 64 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  eeds */.        
24e30 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51  SQLITE_IOCAP_SEQ
24e40 55 45 4e 54 49 41 4c 20 7c 20 20 20 20 20 2f 2a  UENTIAL |     /*
24e50 20 54 68 65 20 72 61 6d 20 66 69 6c 65 73 79 73   The ram filesys
24e60 74 65 6d 20 68 61 73 20 6e 6f 20 77 72 69 74 65  tem has no write
24e70 20 62 65 68 69 6e 64 0a 20 20 20 20 20 20 20 20   behind.        
24e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
24ea0 20 73 6f 20 69 74 20 69 73 20 6f 72 64 65 72 65   so it is ordere
24eb0 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 30 3b 0a  d */.        0;.
24ec0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
24ed0 72 73 74 72 28 66 73 49 6e 66 6f 2e 66 5f 62 61  rstr(fsInfo.f_ba
24ee0 73 65 74 79 70 65 2c 20 22 65 74 66 73 22 29 20  setype, "etfs") 
24ef0 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  ){.      pFile->
24f00 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 66 73 49  sectorSize = fsI
24f10 6e 66 6f 2e 66 5f 62 73 69 7a 65 3b 0a 20 20 20  nfo.f_bsize;.   
24f20 20 20 20 70 46 69 6c 65 2d 3e 64 65 76 69 63 65     pFile->device
24f30 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20  Characteristics 
24f40 3d 0a 20 20 20 20 20 20 20 20 2f 2a 20 65 74 66  =.        /* etf
24f50 73 20 63 6c 75 73 74 65 72 20 73 69 7a 65 20 77  s cluster size w
24f60 72 69 74 65 73 20 61 72 65 20 61 74 6f 6d 69 63  rites are atomic
24f70 20 2a 2f 0a 20 20 20 20 20 20 20 20 28 70 46 69   */.        (pFi
24f80 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 2f  le->sectorSize /
24f90 20 35 31 32 20 2a 20 53 51 4c 49 54 45 5f 49 4f   512 * SQLITE_IO
24fa0 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 29 20 7c  CAP_ATOMIC512) |
24fb0 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f  .        SQLITE_
24fc0 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e  IOCAP_SAFE_APPEN
24fd0 44 20 7c 20 20 20 20 2f 2a 20 67 72 6f 77 69 6e  D |    /* growin
24fe0 67 20 74 68 65 20 66 69 6c 65 20 64 6f 65 73 20  g the file does 
24ff0 6e 6f 74 20 6f 63 63 75 72 20 75 6e 74 69 6c 0a  not occur until.
25000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25020 20 20 20 20 20 20 2a 2a 20 74 68 65 20 77 72 69        ** the wri
25030 74 65 20 73 75 63 63 65 65 64 73 20 2a 2f 0a 20  te succeeds */. 
25040 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f         SQLITE_IO
25050 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 20 7c  CAP_SEQUENTIAL |
25060 20 20 20 20 20 2f 2a 20 54 68 65 20 72 61 6d 20       /* The ram 
25070 66 69 6c 65 73 79 73 74 65 6d 20 68 61 73 20 6e  filesystem has n
25080 6f 20 77 72 69 74 65 20 62 65 68 69 6e 64 0a 20  o write behind. 
25090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
250a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
250b0 20 20 20 20 20 2a 2a 20 73 6f 20 69 74 20 69 73       ** so it is
250c0 20 6f 72 64 65 72 65 64 20 2a 2f 0a 20 20 20 20   ordered */.    
250d0 20 20 20 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65      0;.    }else
250e0 20 69 66 28 20 21 73 74 72 63 6d 70 28 66 73 49   if( !strcmp(fsI
250f0 6e 66 6f 2e 66 5f 62 61 73 65 74 79 70 65 2c 20  nfo.f_basetype, 
25100 22 71 6e 78 36 22 29 20 29 7b 0a 20 20 20 20 20  "qnx6") ){.     
25110 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69   pFile->sectorSi
25120 7a 65 20 3d 20 66 73 49 6e 66 6f 2e 66 5f 62 73  ze = fsInfo.f_bs
25130 69 7a 65 3b 0a 20 20 20 20 20 20 70 46 69 6c 65  ize;.      pFile
25140 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63 74 65  ->deviceCharacte
25150 72 69 73 74 69 63 73 20 3d 0a 20 20 20 20 20 20  ristics =.      
25160 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41    SQLITE_IOCAP_A
25170 54 4f 4d 49 43 20 7c 20 20 20 20 20 20 20 20 20  TOMIC |         
25180 2f 2a 20 41 6c 6c 20 66 69 6c 65 73 79 73 74 65  /* All filesyste
25190 6d 20 77 72 69 74 65 73 20 61 72 65 20 61 74 6f  m writes are ato
251a0 6d 69 63 20 2a 2f 0a 20 20 20 20 20 20 20 20 53  mic */.        S
251b0 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45  QLITE_IOCAP_SAFE
251c0 5f 41 50 50 45 4e 44 20 7c 20 20 20 20 2f 2a 20  _APPEND |    /* 
251d0 67 72 6f 77 69 6e 67 20 74 68 65 20 66 69 6c 65  growing the file
251e0 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75 72 20   does not occur 
251f0 75 6e 74 69 6c 0a 20 20 20 20 20 20 20 20 20 20  until.          
25200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25210 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74              ** t
25220 68 65 20 77 72 69 74 65 20 73 75 63 63 65 65 64  he write succeed
25230 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 51 4c  s */.        SQL
25240 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e  ITE_IOCAP_SEQUEN
25250 54 49 41 4c 20 7c 20 20 20 20 20 2f 2a 20 54 68  TIAL |     /* Th
25260 65 20 72 61 6d 20 66 69 6c 65 73 79 73 74 65 6d  e ram filesystem
25270 20 68 61 73 20 6e 6f 20 77 72 69 74 65 20 62 65   has no write be
25280 68 69 6e 64 0a 20 20 20 20 20 20 20 20 20 20 20  hind.           
25290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
252a0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f             ** so
252b0 20 69 74 20 69 73 20 6f 72 64 65 72 65 64 20 2a   it is ordered *
252c0 2f 0a 20 20 20 20 20 20 20 20 30 3b 0a 20 20 20  /.        0;.   
252d0 20 7d 65 6c 73 65 20 69 66 28 20 21 73 74 72 63   }else if( !strc
252e0 6d 70 28 66 73 49 6e 66 6f 2e 66 5f 62 61 73 65  mp(fsInfo.f_base
252f0 74 79 70 65 2c 20 22 71 6e 78 34 22 29 20 29 7b  type, "qnx4") ){
25300 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 65  .      pFile->se
25310 63 74 6f 72 53 69 7a 65 20 3d 20 66 73 49 6e 66  ctorSize = fsInf
25320 6f 2e 66 5f 62 73 69 7a 65 3b 0a 20 20 20 20 20  o.f_bsize;.     
25330 20 70 46 69 6c 65 2d 3e 64 65 76 69 63 65 43 68   pFile->deviceCh
25340 61 72 61 63 74 65 72 69 73 74 69 63 73 20 3d 0a  aracteristics =.
25350 20 20 20 20 20 20 20 20 2f 2a 20 66 75 6c 6c 20          /* full 
25360 62 69 74 73 65 74 20 6f 66 20 61 74 6f 6d 69 63  bitset of atomic
25370 73 20 66 72 6f 6d 20 6d 61 78 20 73 65 63 74 6f  s from max secto
25380 72 20 73 69 7a 65 20 61 6e 64 20 73 6d 61 6c 6c  r size and small
25390 65 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 28 28  er */.        ((
253a0 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a  pFile->sectorSiz
253b0 65 20 2f 20 35 31 32 20 2a 20 53 51 4c 49 54 45  e / 512 * SQLITE
253c0 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32  _IOCAP_ATOMIC512
253d0 29 20 3c 3c 20 31 29 20 2d 20 32 20 7c 0a 20 20  ) << 1) - 2 |.  
253e0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43        SQLITE_IOC
253f0 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 20 7c 20  AP_SEQUENTIAL | 
25400 20 20 20 20 2f 2a 20 54 68 65 20 72 61 6d 20 66      /* The ram f
25410 69 6c 65 73 79 73 74 65 6d 20 68 61 73 20 6e 6f  ilesystem has no
25420 20 77 72 69 74 65 20 62 65 68 69 6e 64 0a 20 20   write behind.  
25430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25450 20 20 20 20 2a 2a 20 73 6f 20 69 74 20 69 73 20      ** so it is 
25460 6f 72 64 65 72 65 64 20 2a 2f 0a 20 20 20 20 20  ordered */.     
25470 20 20 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20     0;.    }else 
25480 69 66 28 20 73 74 72 73 74 72 28 66 73 49 6e 66  if( strstr(fsInf
25490 6f 2e 66 5f 62 61 73 65 74 79 70 65 2c 20 22 64  o.f_basetype, "d
254a0 6f 73 22 29 20 29 7b 0a 20 20 20 20 20 20 70 46  os") ){.      pF
254b0 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ile->sectorSize 
254c0 3d 20 66 73 49 6e 66 6f 2e 66 5f 62 73 69 7a 65  = fsInfo.f_bsize
254d0 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 64  ;.      pFile->d
254e0 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
254f0 74 69 63 73 20 3d 0a 20 20 20 20 20 20 20 20 2f  tics =.        /
25500 2a 20 66 75 6c 6c 20 62 69 74 73 65 74 20 6f 66  * full bitset of
25510 20 61 74 6f 6d 69 63 73 20 66 72 6f 6d 20 6d 61   atomics from ma
25520 78 20 73 65 63 74 6f 72 20 73 69 7a 65 20 61 6e  x sector size an
25530 64 20 73 6d 61 6c 6c 65 72 20 2a 2f 0a 20 20 20  d smaller */.   
25540 20 20 20 20 20 28 28 70 46 69 6c 65 2d 3e 73 65       ((pFile->se
25550 63 74 6f 72 53 69 7a 65 20 2f 20 35 31 32 20 2a  ctorSize / 512 *
25560 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54   SQLITE_IOCAP_AT
25570 4f 4d 49 43 35 31 32 29 20 3c 3c 20 31 29 20 2d  OMIC512) << 1) -
25580 20 32 20 7c 0a 20 20 20 20 20 20 20 20 53 51 4c   2 |.        SQL
25590 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e  ITE_IOCAP_SEQUEN
255a0 54 49 41 4c 20 7c 20 20 20 20 20 2f 2a 20 54 68  TIAL |     /* Th
255b0 65 20 72 61 6d 20 66 69 6c 65 73 79 73 74 65 6d  e ram filesystem
255c0 20 68 61 73 20 6e 6f 20 77 72 69 74 65 20 62 65   has no write be
255d0 68 69 6e 64 0a 20 20 20 20 20 20 20 20 20 20 20  hind.           
255e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
255f0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f             ** so
25600 20 69 74 20 69 73 20 6f 72 64 65 72 65 64 20 2a   it is ordered *
25610 2f 0a 20 20 20 20 20 20 20 20 30 3b 0a 20 20 20  /.        0;.   
25620 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 46   }else{.      pF
25630 69 6c 65 2d 3e 64 65 76 69 63 65 43 68 61 72 61  ile->deviceChara
25640 63 74 65 72 69 73 74 69 63 73 20 3d 0a 20 20 20  cteristics =.   
25650 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41       SQLITE_IOCA
25660 50 5f 41 54 4f 4d 49 43 35 31 32 20 7c 20 20 20  P_ATOMIC512 |   
25670 20 20 20 2f 2a 20 62 6c 6f 63 6b 73 20 61 72 65     /* blocks are
25680 20 61 74 6f 6d 69 63 20 2a 2f 0a 20 20 20 20 20   atomic */.     
25690 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f     SQLITE_IOCAP_
256a0 53 41 46 45 5f 41 50 50 45 4e 44 20 7c 20 20 20  SAFE_APPEND |   
256b0 20 2f 2a 20 67 72 6f 77 69 6e 67 20 74 68 65 20   /* growing the 
256c0 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 6f 63  file does not oc
256d0 63 75 72 20 75 6e 74 69 6c 0a 20 20 20 20 20 20  cur until.      
256e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
256f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25700 2a 2a 20 74 68 65 20 77 72 69 74 65 20 73 75 63  ** the write suc
25710 63 65 65 64 73 20 2a 2f 0a 20 20 20 20 20 20 20  ceeds */.       
25720 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   0;.    }.  }.  
25730 2f 2a 20 4c 61 73 74 20 63 68 61 6e 63 65 20 76  /* Last chance v
25740 65 72 69 66 69 63 61 74 69 6f 6e 2e 20 20 49 66  erification.  If
25750 20 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65   the sector size
25760 20 69 73 6e 27 74 20 61 20 6d 75 6c 74 69 70 6c   isn't a multipl
25770 65 20 6f 66 20 35 31 32 0a 20 20 2a 2a 20 74 68  e of 512.  ** th
25780 65 6e 20 69 74 20 69 73 6e 27 74 20 76 61 6c 69  en it isn't vali
25790 64 2e 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65  d.*/.  if( pFile
257a0 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 25 20 35  ->sectorSize % 5
257b0 31 32 20 21 3d 20 30 20 29 7b 0a 20 20 20 20 70  12 != 0 ){.    p
257c0 46 69 6c 65 2d 3e 64 65 76 69 63 65 43 68 61 72  File->deviceChar
257d0 61 63 74 65 72 69 73 74 69 63 73 20 3d 20 30 3b  acteristics = 0;
257e0 0a 20 20 20 20 70 46 69 6c 65 2d 3e 73 65 63 74  .    pFile->sect
257f0 6f 72 53 69 7a 65 20 3d 20 53 51 4c 49 54 45 5f  orSize = SQLITE_
25800 44 45 46 41 55 4c 54 5f 53 45 43 54 4f 52 5f 53  DEFAULT_SECTOR_S
25810 49 5a 45 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  IZE;.  }.  retur
25820 6e 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53  n pFile->sectorS
25830 69 7a 65 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  ize;.}.#endif /*
25840 20 5f 5f 51 4e 58 4e 54 4f 5f 5f 20 2a 2f 0a 0a   __QNXNTO__ */..
25850 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
25860 20 64 65 76 69 63 65 20 63 68 61 72 61 63 74 65   device characte
25870 72 69 73 74 69 63 73 20 66 6f 72 20 74 68 65 20  ristics for the 
25880 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  file..**.** This
25890 20 56 46 53 20 69 73 20 73 65 74 20 75 70 20 74   VFS is set up t
258a0 6f 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  o return SQLITE_
258b0 49 4f 43 41 50 5f 50 4f 57 45 52 53 41 46 45 5f  IOCAP_POWERSAFE_
258c0 4f 56 45 52 57 52 49 54 45 20 62 79 20 64 65 66  OVERWRITE by def
258d0 61 75 6c 74 2e 0a 2a 2a 20 48 6f 77 65 76 65 72  ault..** However
258e0 2c 20 74 68 61 74 20 63 68 6f 69 63 65 20 69 73  , that choice is
258f0 20 63 6f 6e 74 72 61 76 65 72 73 69 61 6c 20 73   contraversial s
25900 69 6e 63 65 20 74 65 63 68 6e 69 63 61 6c 6c 79  ince technically
25910 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 0a   the underlying.
25920 2a 2a 20 66 69 6c 65 20 73 79 73 74 65 6d 20 64  ** file system d
25930 6f 65 73 20 6e 6f 74 20 61 6c 77 61 79 73 20 70  oes not always p
25940 72 6f 76 69 64 65 20 70 6f 77 65 72 73 61 66 65  rovide powersafe
25950 20 6f 76 65 72 77 72 69 74 65 73 2e 20 20 28 49   overwrites.  (I
25960 6e 20 6f 74 68 65 72 0a 2a 2a 20 77 6f 72 64 73  n other.** words
25970 2c 20 61 66 74 65 72 20 61 20 70 6f 77 65 72 2d  , after a power-
25980 6c 6f 73 73 20 65 76 65 6e 74 2c 20 70 61 72 74  loss event, part
25990 73 20 6f 66 20 74 68 65 20 66 69 6c 65 20 74 68  s of the file th
259a0 61 74 20 77 65 72 65 20 6e 65 76 65 72 0a 2a 2a  at were never.**
259b0 20 77 72 69 74 74 65 6e 20 6d 69 67 68 74 20 65   written might e
259c0 6e 64 20 75 70 20 62 65 69 6e 67 20 61 6c 74 65  nd up being alte
259d0 72 65 64 2e 29 20 20 48 6f 77 65 76 65 72 2c 20  red.)  However, 
259e0 6e 6f 6e 2d 50 53 4f 57 20 62 65 68 61 76 69 6f  non-PSOW behavio
259f0 72 20 69 73 20 76 65 72 79 2c 0a 2a 2a 20 76 65  r is very,.** ve
25a00 72 79 20 72 61 72 65 2e 20 20 41 6e 64 20 61 73  ry rare.  And as
25a10 73 65 72 74 69 6e 67 20 50 53 4f 57 20 6d 61 6b  serting PSOW mak
25a20 65 73 20 61 20 6c 61 72 67 65 20 72 65 64 75 63  es a large reduc
25a30 74 69 6f 6e 20 69 6e 20 74 68 65 20 61 6d 6f 75  tion in the amou
25a40 6e 74 0a 2a 2a 20 6f 66 20 72 65 71 75 69 72 65  nt.** of require
25a50 64 20 49 2f 4f 20 66 6f 72 20 6a 6f 75 72 6e 61  d I/O for journa
25a60 6c 69 6e 67 2c 20 73 69 6e 63 65 20 61 20 6c 6f  ling, since a lo
25a70 74 20 6f 66 20 70 61 64 64 69 6e 67 20 69 73 20  t of padding is 
25a80 65 6c 69 6d 69 6e 61 74 65 64 2e 0a 2a 2a 20 20  eliminated..**  
25a90 48 65 6e 63 65 2c 20 77 68 69 6c 65 20 50 4f 57  Hence, while POW
25aa0 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45  ERSAFE_OVERWRITE
25ab0 20 69 73 20 6f 6e 20 62 79 20 64 65 66 61 75 6c   is on by defaul
25ac0 74 2c 20 74 68 65 72 65 20 69 73 20 61 20 66 69  t, there is a fi
25ad0 6c 65 2d 63 6f 6e 74 72 6f 6c 0a 2a 2a 20 61 76  le-control.** av
25ae0 61 69 6c 61 62 6c 65 20 74 6f 20 74 75 72 6e 20  ailable to turn 
25af0 69 74 20 6f 66 66 20 61 6e 64 20 55 52 49 20 71  it off and URI q
25b00 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 20 61  uery parameter a
25b10 76 61 69 6c 61 62 6c 65 20 74 6f 20 74 75 72 6e  vailable to turn
25b20 20 69 74 20 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74   it off..*/.stat
25b30 69 63 20 69 6e 74 20 75 6e 69 78 44 65 76 69 63  ic int unixDevic
25b40 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
25b50 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
25b60 64 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  d){.  unixFile *
25b70 70 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  p = (unixFile*)i
25b80 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b  d;.  int rc = 0;
25b90 0a 23 69 66 64 65 66 20 5f 5f 51 4e 58 4e 54 4f  .#ifdef __QNXNTO
25ba0 5f 5f 0a 20 20 69 66 28 20 70 2d 3e 73 65 63 74  __.  if( p->sect
25bb0 6f 72 53 69 7a 65 3d 3d 30 20 29 20 75 6e 69 78  orSize==0 ) unix
25bc0 53 65 63 74 6f 72 53 69 7a 65 28 69 64 29 3b 0a  SectorSize(id);.
25bd0 20 20 72 63 20 3d 20 70 2d 3e 64 65 76 69 63 65    rc = p->device
25be0 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 3b  Characteristics;
25bf0 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 2d  .#endif.  if( p-
25c00 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49  >ctrlFlags & UNI
25c10 58 46 49 4c 45 5f 50 53 4f 57 20 29 7b 0a 20 20  XFILE_PSOW ){.  
25c20 20 20 72 63 20 7c 3d 20 53 51 4c 49 54 45 5f 49    rc |= SQLITE_I
25c30 4f 43 41 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f  OCAP_POWERSAFE_O
25c40 56 45 52 57 52 49 54 45 3b 0a 20 20 7d 0a 20 20  VERWRITE;.  }.  
25c50 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
25c60 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
25c70 45 5f 4f 4d 49 54 5f 57 41 4c 29 20 7c 7c 20 53  E_OMIT_WAL) || S
25c80 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
25c90 49 5a 45 3e 30 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  IZE>0../*.** Ret
25ca0 75 72 6e 20 74 68 65 20 73 79 73 74 65 6d 20 70  urn the system p
25cb0 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20  age size..**.** 
25cc0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68  This function sh
25cd0 6f 75 6c 64 20 6e 6f 74 20 62 65 20 63 61 6c 6c  ould not be call
25ce0 65 64 20 64 69 72 65 63 74 6c 79 20 62 79 20 6f  ed directly by o
25cf0 74 68 65 72 20 63 6f 64 65 20 69 6e 20 74 68 69  ther code in thi
25d00 73 20 66 69 6c 65 2e 20 0a 2a 2a 20 49 6e 73 74  s file. .** Inst
25d10 65 61 64 2c 20 69 74 20 73 68 6f 75 6c 64 20 62  ead, it should b
25d20 65 20 63 61 6c 6c 65 64 20 76 69 61 20 6d 61 63  e called via mac
25d30 72 6f 20 6f 73 47 65 74 70 61 67 65 73 69 7a 65  ro osGetpagesize
25d40 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ()..*/.static in
25d50 74 20 75 6e 69 78 47 65 74 70 61 67 65 73 69 7a  t unixGetpagesiz
25d60 65 28 76 6f 69 64 29 7b 0a 23 69 66 20 64 65 66  e(void){.#if def
25d70 69 6e 65 64 28 5f 42 53 44 5f 53 4f 55 52 43 45  ined(_BSD_SOURCE
25d80 29 0a 20 20 72 65 74 75 72 6e 20 67 65 74 70 61  ).  return getpa
25d90 67 65 73 69 7a 65 28 29 3b 0a 23 65 6c 73 65 0a  gesize();.#else.
25da0 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29 73 79    return (int)sy
25db0 73 63 6f 6e 66 28 5f 53 43 5f 50 41 47 45 53 49  sconf(_SC_PAGESI
25dc0 5a 45 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 23  ZE);.#endif.}..#
25dd0 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
25de0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  d(SQLITE_OMIT_WA
25df0 4c 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58  L) || SQLITE_MAX
25e00 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 20 2a 2f 0a  _MMAP_SIZE>0 */.
25e10 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
25e20 4f 4d 49 54 5f 57 41 4c 0a 0a 2f 2a 0a 2a 2a 20  OMIT_WAL../*.** 
25e30 4f 62 6a 65 63 74 20 75 73 65 64 20 74 6f 20 72  Object used to r
25e40 65 70 72 65 73 65 6e 74 20 61 6e 20 73 68 61 72  epresent an shar
25e50 65 64 20 6d 65 6d 6f 72 79 20 62 75 66 66 65 72  ed memory buffer
25e60 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 6d  .  .**.** When m
25e70 75 6c 74 69 70 6c 65 20 74 68 72 65 61 64 73 20  ultiple threads 
25e80 61 6c 6c 20 72 65 66 65 72 65 6e 63 65 20 74 68  all reference th
25e90 65 20 73 61 6d 65 20 77 61 6c 2d 69 6e 64 65 78  e same wal-index
25ea0 2c 20 65 61 63 68 20 74 68 72 65 61 64 0a 2a 2a  , each thread.**
25eb0 20 68 61 73 20 69 74 73 20 6f 77 6e 20 75 6e 69   has its own uni
25ec0 78 53 68 6d 20 6f 62 6a 65 63 74 2c 20 62 75 74  xShm object, but
25ed0 20 74 68 65 79 20 61 6c 6c 20 70 6f 69 6e 74 20   they all point 
25ee0 74 6f 20 61 20 73 69 6e 67 6c 65 20 69 6e 73 74  to a single inst
25ef0 61 6e 63 65 0a 2a 2a 20 6f 66 20 74 68 69 73 20  ance.** of this 
25f00 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65  unixShmNode obje
25f10 63 74 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  ct.  In other wo
25f20 72 64 73 2c 20 65 61 63 68 20 77 61 6c 2d 69 6e  rds, each wal-in
25f30 64 65 78 20 69 73 20 6f 70 65 6e 65 64 0a 2a 2a  dex is opened.**
25f40 20 6f 6e 6c 79 20 6f 6e 63 65 20 70 65 72 20 70   only once per p
25f50 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 45 61  rocess..**.** Ea
25f60 63 68 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f  ch unixShmNode o
25f70 62 6a 65 63 74 20 69 73 20 63 6f 6e 6e 65 63 74  bject is connect
25f80 65 64 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 75  ed to a single u
25f90 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a  nixInodeInfo obj
25fa0 65 63 74 2e 0a 2a 2a 20 57 65 20 63 6f 75 6c 64  ect..** We could
25fb0 20 63 6f 61 6c 65 73 63 65 20 74 68 69 73 20 6f   coalesce this o
25fc0 62 6a 65 63 74 20 69 6e 74 6f 20 75 6e 69 78 49  bject into unixI
25fd0 6e 6f 64 65 49 6e 66 6f 2c 20 62 75 74 20 74 68  nodeInfo, but th
25fe0 61 74 20 77 6f 75 6c 64 20 6d 65 61 6e 0a 2a 2a  at would mean.**
25ff0 20 65 76 65 72 79 20 6f 70 65 6e 20 66 69 6c 65   every open file
26000 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 75   that does not u
26010 73 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  se shared memory
26020 20 28 69 6e 20 6f 74 68 65 72 20 77 6f 72 64 73   (in other words
26030 2c 20 6d 6f 73 74 0a 2a 2a 20 6f 70 65 6e 20 66  , most.** open f
26040 69 6c 65 73 29 20 77 6f 75 6c 64 20 68 61 76 65  iles) would have
26050 20 74 6f 20 63 61 72 72 79 20 61 72 6f 75 6e 64   to carry around
26060 20 74 68 69 73 20 65 78 74 72 61 20 69 6e 66 6f   this extra info
26070 72 6d 61 74 69 6f 6e 2e 20 20 53 6f 0a 2a 2a 20  rmation.  So.** 
26080 74 68 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  the unixInodeInf
26090 6f 20 6f 62 6a 65 63 74 20 63 6f 6e 74 61 69 6e  o object contain
260a0 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  s a pointer to t
260b0 68 69 73 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  his unixShmNode 
260c0 6f 62 6a 65 63 74 0a 2a 2a 20 61 6e 64 20 74 68  object.** and th
260d0 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62  e unixShmNode ob
260e0 6a 65 63 74 20 69 73 20 63 72 65 61 74 65 64 20  ject is created 
260f0 6f 6e 6c 79 20 77 68 65 6e 20 6e 65 65 64 65 64  only when needed
26100 2e 0a 2a 2a 0a 2a 2a 20 75 6e 69 78 4d 75 74 65  ..**.** unixMute
26110 78 48 65 6c 64 28 29 20 6d 75 73 74 20 62 65 20  xHeld() must be 
26120 74 72 75 65 20 77 68 65 6e 20 63 72 65 61 74 69  true when creati
26130 6e 67 20 6f 72 20 64 65 73 74 72 6f 79 69 6e 67  ng or destroying
26140 0a 2a 2a 20 74 68 69 73 20 6f 62 6a 65 63 74 20  .** this object 
26150 6f 72 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67  or while reading
26160 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68 65 20   or writing the 
26170 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73  following fields
26180 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 6e 52 65  :.**.**      nRe
26190 66 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  f.**.** The foll
261a0 6f 77 69 6e 67 20 66 69 65 6c 64 73 20 61 72 65  owing fields are
261b0 20 72 65 61 64 2d 6f 6e 6c 79 20 61 66 74 65 72   read-only after
261c0 20 74 68 65 20 6f 62 6a 65 63 74 20 69 73 20 63   the object is c
261d0 72 65 61 74 65 64 3a 0a 2a 2a 20 0a 2a 2a 20 20  reated:.** .**  
261e0 20 20 20 20 66 69 64 0a 2a 2a 20 20 20 20 20 20      fid.**      
261f0 7a 46 69 6c 65 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20  zFilename.**.** 
26200 45 69 74 68 65 72 20 75 6e 69 78 53 68 6d 4e 6f  Either unixShmNo
26210 64 65 2e 6d 75 74 65 78 20 6d 75 73 74 20 62 65  de.mutex must be
26220 20 68 65 6c 64 20 6f 72 20 75 6e 69 78 53 68 6d   held or unixShm
26230 4e 6f 64 65 2e 6e 52 65 66 3d 3d 30 20 61 6e 64  Node.nRef==0 and
26240 0a 2a 2a 20 75 6e 69 78 4d 75 74 65 78 48 65 6c  .** unixMutexHel
26250 64 28 29 20 69 73 20 74 72 75 65 20 77 68 65 6e  d() is true when
26260 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74   reading or writ
26270 69 6e 67 20 61 6e 79 20 6f 74 68 65 72 20 66 69  ing any other fi
26280 65 6c 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20 73  eld.** in this s
26290 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 72  tructure..*/.str
262a0 75 63 74 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  uct unixShmNode 
262b0 7b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  {.  unixInodeInf
262c0 6f 20 2a 70 49 6e 6f 64 65 3b 20 20 20 20 20 2f  o *pInode;     /
262d0 2a 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20  * unixInodeInfo 
262e0 74 68 61 74 20 6f 77 6e 73 20 74 68 69 73 20 53  that owns this S
262f0 48 4d 20 6e 6f 64 65 20 2a 2f 0a 20 20 73 71 6c  HM node */.  sql
26300 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65  ite3_mutex *mute
26310 78 3b 20 20 20 20 20 20 2f 2a 20 4d 75 74 65 78  x;      /* Mutex
26320 20 74 6f 20 61 63 63 65 73 73 20 74 68 69 73 20   to access this 
26330 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 68 61 72  object */.  char
26340 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20   *zFilename;    
26350 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
26360 66 20 74 68 65 20 6d 6d 61 70 70 65 64 20 66 69  f the mmapped fi
26370 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 68 3b 20 20  le */.  int h;  
26380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26390 20 20 20 2f 2a 20 4f 70 65 6e 20 66 69 6c 65 20     /* Open file 
263a0 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20  descriptor */.  
263b0 69 6e 74 20 73 7a 52 65 67 69 6f 6e 3b 20 20 20  int szRegion;   
263c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
263d0 7a 65 20 6f 66 20 73 68 61 72 65 64 2d 6d 65 6d  ze of shared-mem
263e0 6f 72 79 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20  ory regions */. 
263f0 20 75 31 36 20 6e 52 65 67 69 6f 6e 3b 20 20 20   u16 nRegion;   
26400 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
26410 69 7a 65 20 6f 66 20 61 72 72 61 79 20 61 70 52  ize of array apR
26420 65 67 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 69 73  egion */.  u8 is
26430 52 65 61 64 6f 6e 6c 79 3b 20 20 20 20 20 20 20  Readonly;       
26440 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
26450 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20   read-only */.  
26460 63 68 61 72 20 2a 2a 61 70 52 65 67 69 6f 6e 3b  char **apRegion;
26470 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
26480 72 61 79 20 6f 66 20 6d 61 70 70 65 64 20 73 68  ray of mapped sh
26490 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69  ared-memory regi
264a0 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65  ons */.  int nRe
264b0 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
264c0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
264d0 20 75 6e 69 78 53 68 6d 20 6f 62 6a 65 63 74 73   unixShm objects
264e0 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 69   pointing to thi
264f0 73 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a  s */.  unixShm *
26500 70 46 69 72 73 74 3b 20 20 20 20 20 20 20 20 20  pFirst;         
26510 20 20 2f 2a 20 41 6c 6c 20 75 6e 69 78 53 68 6d    /* All unixShm
26520 20 6f 62 6a 65 63 74 73 20 70 6f 69 6e 74 69 6e   objects pointin
26530 67 20 74 6f 20 74 68 69 73 20 2a 2f 0a 23 69 66  g to this */.#if
26540 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
26550 0a 20 20 75 38 20 65 78 63 6c 4d 61 73 6b 3b 20  .  u8 exclMask; 
26560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26570 20 4d 61 73 6b 20 6f 66 20 65 78 63 6c 75 73 69   Mask of exclusi
26580 76 65 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f  ve locks held */
26590 0a 20 20 75 38 20 73 68 61 72 65 64 4d 61 73 6b  .  u8 sharedMask
265a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
265b0 20 4d 61 73 6b 20 6f 66 20 73 68 61 72 65 64 20   Mask of shared 
265c0 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20  locks held */.  
265d0 75 38 20 6e 65 78 74 53 68 6d 49 64 3b 20 20 20  u8 nextShmId;   
265e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
265f0 78 74 20 61 76 61 69 6c 61 62 6c 65 20 75 6e 69  xt available uni
26600 78 53 68 6d 2e 69 64 20 76 61 6c 75 65 20 2a 2f  xShm.id value */
26610 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a  .#endif.};../*.*
26620 2a 20 53 74 72 75 63 74 75 72 65 20 75 73 65 64  * Structure used
26630 20 69 6e 74 65 72 6e 61 6c 6c 79 20 62 79 20 74   internally by t
26640 68 69 73 20 56 46 53 20 74 6f 20 72 65 63 6f 72  his VFS to recor
26650 64 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 61  d the state of a
26660 6e 0a 2a 2a 20 6f 70 65 6e 20 73 68 61 72 65 64  n.** open shared
26670 20 6d 65 6d 6f 72 79 20 63 6f 6e 6e 65 63 74 69   memory connecti
26680 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f  on..**.** The fo
26690 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73 20 61  llowing fields a
266a0 72 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 77  re initialized w
266b0 68 65 6e 20 74 68 69 73 20 6f 62 6a 65 63 74 20  hen this object 
266c0 69 73 20 63 72 65 61 74 65 64 20 61 6e 64 0a 2a  is created and.*
266d0 2a 20 61 72 65 20 72 65 61 64 2d 6f 6e 6c 79 20  * are read-only 
266e0 74 68 65 72 65 61 66 74 65 72 3a 0a 2a 2a 0a 2a  thereafter:.**.*
266f0 2a 20 20 20 20 75 6e 69 78 53 68 6d 2e 70 46 69  *    unixShm.pFi
26700 6c 65 0a 2a 2a 20 20 20 20 75 6e 69 78 53 68 6d  le.**    unixShm
26710 2e 69 64 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 74  .id.**.** All ot
26720 68 65 72 20 66 69 65 6c 64 73 20 61 72 65 20 72  her fields are r
26730 65 61 64 2f 77 72 69 74 65 2e 20 20 54 68 65 20  ead/write.  The 
26740 75 6e 69 78 53 68 6d 2e 70 46 69 6c 65 2d 3e 6d  unixShm.pFile->m
26750 75 74 65 78 20 6d 75 73 74 20 62 65 20 68 65 6c  utex must be hel
26760 64 0a 2a 2a 20 77 68 69 6c 65 20 61 63 63 65 73  d.** while acces
26770 73 69 6e 67 20 61 6e 79 20 72 65 61 64 2f 77 72  sing any read/wr
26780 69 74 65 20 66 69 65 6c 64 73 2e 0a 2a 2f 0a 73  ite fields..*/.s
26790 74 72 75 63 74 20 75 6e 69 78 53 68 6d 20 7b 0a  truct unixShm {.
267a0 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70    unixShmNode *p
267b0 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20 2f 2a 20  ShmNode;     /* 
267c0 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 75  The underlying u
267d0 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63  nixShmNode objec
267e0 74 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a  t */.  unixShm *
267f0 70 4e 65 78 74 3b 20 20 20 20 20 20 20 20 20 20  pNext;          
26800 20 20 2f 2a 20 4e 65 78 74 20 75 6e 69 78 53 68    /* Next unixSh
26810 6d 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  m with the same 
26820 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20  unixShmNode */. 
26830 20 75 38 20 68 61 73 4d 75 74 65 78 3b 20 20 20   u8 hasMutex;   
26840 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
26850 72 75 65 20 69 66 20 68 6f 6c 64 69 6e 67 20 74  rue if holding t
26860 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6d  he unixShmNode m
26870 75 74 65 78 20 2a 2f 0a 20 20 75 38 20 69 64 3b  utex */.  u8 id;
26880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26890 20 20 20 20 20 2f 2a 20 49 64 20 6f 66 20 74 68       /* Id of th
268a0 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69  is connection wi
268b0 74 68 69 6e 20 69 74 73 20 75 6e 69 78 53 68 6d  thin its unixShm
268c0 4e 6f 64 65 20 2a 2f 0a 20 20 75 31 36 20 73 68  Node */.  u16 sh
268d0 61 72 65 64 4d 61 73 6b 3b 20 20 20 20 20 20 20  aredMask;       
268e0 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20       /* Mask of 
268f0 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 68 65 6c  shared locks hel
26900 64 20 2a 2f 0a 20 20 75 31 36 20 65 78 63 6c 4d  d */.  u16 exclM
26910 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ask;            
26920 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 65 78 63    /* Mask of exc
26930 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20 68 65 6c  lusive locks hel
26940 64 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43  d */.};../*.** C
26950 6f 6e 73 74 61 6e 74 73 20 75 73 65 64 20 66 6f  onstants used fo
26960 72 20 6c 6f 63 6b 69 6e 67 0a 2a 2f 0a 23 64 65  r locking.*/.#de
26970 66 69 6e 65 20 55 4e 49 58 5f 53 48 4d 5f 42 41  fine UNIX_SHM_BA
26980 53 45 20 20 20 28 28 32 32 2b 53 51 4c 49 54 45  SE   ((22+SQLITE
26990 5f 53 48 4d 5f 4e 4c 4f 43 4b 29 2a 34 29 20 20  _SHM_NLOCK)*4)  
269a0 20 20 20 20 20 20 20 2f 2a 20 66 69 72 73 74 20         /* first 
269b0 6c 6f 63 6b 20 62 79 74 65 20 2a 2f 0a 23 64 65  lock byte */.#de
269c0 66 69 6e 65 20 55 4e 49 58 5f 53 48 4d 5f 44 4d  fine UNIX_SHM_DM
269d0 53 20 20 20 20 28 55 4e 49 58 5f 53 48 4d 5f 42  S    (UNIX_SHM_B
269e0 41 53 45 2b 53 51 4c 49 54 45 5f 53 48 4d 5f 4e  ASE+SQLITE_SHM_N
269f0 4c 4f 43 4b 29 20 20 2f 2a 20 64 65 61 64 6d 61  LOCK)  /* deadma
26a00 6e 20 73 77 69 74 63 68 20 2a 2f 0a 0a 2f 2a 0a  n switch */../*.
26a10 2a 2a 20 41 70 70 6c 79 20 70 6f 73 69 78 20 61  ** Apply posix a
26a20 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20 66 6f  dvisory locks fo
26a30 72 20 61 6c 6c 20 62 79 74 65 73 20 66 72 6f 6d  r all bytes from
26a40 20 6f 66 73 74 20 74 68 72 6f 75 67 68 20 6f 66   ofst through of
26a50 73 74 2b 6e 2d 31 2e 0a 2a 2a 0a 2a 2a 20 4c 6f  st+n-1..**.** Lo
26a60 63 6b 73 20 62 6c 6f 63 6b 20 69 66 20 74 68 65  cks block if the
26a70 20 6d 61 73 6b 20 69 73 20 65 78 61 63 74 6c 79   mask is exactly
26a80 20 55 4e 49 58 5f 53 48 4d 5f 43 20 61 6e 64 20   UNIX_SHM_C and 
26a90 61 72 65 20 6e 6f 6e 2d 62 6c 6f 63 6b 69 6e 67  are non-blocking
26aa0 0a 2a 2a 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a  .** otherwise..*
26ab0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
26ac0 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 0a  xShmSystemLock(.
26ad0 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70    unixShmNode *p
26ae0 53 68 6d 4e 6f 64 65 2c 20 2f 2a 20 41 70 70 6c  ShmNode, /* Appl
26af0 79 20 6c 6f 63 6b 73 20 74 6f 20 74 68 69 73 20  y locks to this 
26b00 6f 70 65 6e 20 73 68 61 72 65 64 2d 6d 65 6d 6f  open shared-memo
26b10 72 79 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20  ry segment */.  
26b20 69 6e 74 20 6c 6f 63 6b 54 79 70 65 2c 20 20 20  int lockType,   
26b30 20 20 20 20 20 20 20 2f 2a 20 46 5f 55 4e 4c 43         /* F_UNLC
26b40 4b 2c 20 46 5f 52 44 4c 43 4b 2c 20 6f 72 20 46  K, F_RDLCK, or F
26b50 5f 57 52 4c 43 4b 20 2a 2f 0a 20 20 69 6e 74 20  _WRLCK */.  int 
26b60 6f 66 73 74 2c 20 20 20 20 20 20 20 20 20 20 20  ofst,           
26b70 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65     /* First byte
26b80 20 6f 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   of the locking 
26b90 72 61 6e 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  range */.  int n
26ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26bb0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
26bc0 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a  ytes to lock */.
26bd0 29 7b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63  ){.  struct floc
26be0 6b 20 66 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  k f;       /* Th
26bf0 65 20 70 6f 73 69 78 20 61 64 76 69 73 6f 72 79  e posix advisory
26c00 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63 74 75   locking structu
26c10 72 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  re */.  int rc =
26c20 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 2f 2a   SQLITE_OK;   /*
26c30 20 52 65 73 75 6c 74 20 63 6f 64 65 20 66 6f 72   Result code for
26c40 6d 20 66 63 6e 74 6c 28 29 20 2a 2f 0a 0a 20 20  m fcntl() */..  
26c50 2f 2a 20 41 63 63 65 73 73 20 74 6f 20 74 68 65  /* Access to the
26c60 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a   unixShmNode obj
26c70 65 63 74 20 69 73 20 73 65 72 69 61 6c 69 7a 65  ect is serialize
26c80 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20  d by the caller 
26c90 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  */.  assert( sql
26ca0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
26cb0 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29  pShmNode->mutex)
26cc0 20 7c 7c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52   || pShmNode->nR
26cd0 65 66 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 53  ef==0 );..  /* S
26ce0 68 61 72 65 64 20 6c 6f 63 6b 73 20 6e 65 76 65  hared locks neve
26cf0 72 20 73 70 61 6e 20 6d 6f 72 65 20 74 68 61 6e  r span more than
26d00 20 6f 6e 65 20 62 79 74 65 20 2a 2f 0a 20 20 61   one byte */.  a
26d10 73 73 65 72 74 28 20 6e 3d 3d 31 20 7c 7c 20 6c  ssert( n==1 || l
26d20 6f 63 6b 54 79 70 65 21 3d 46 5f 52 44 4c 43 4b  ockType!=F_RDLCK
26d30 20 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 6b 73 20   );..  /* Locks 
26d40 61 72 65 20 77 69 74 68 69 6e 20 72 61 6e 67 65  are within range
26d50 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6e 3e   */.  assert( n>
26d60 3d 31 20 26 26 20 6e 3c 53 51 4c 49 54 45 5f 53  =1 && n<SQLITE_S
26d70 48 4d 5f 4e 4c 4f 43 4b 20 29 3b 0a 0a 20 20 69  HM_NLOCK );..  i
26d80 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d  f( pShmNode->h>=
26d90 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 69 74  0 ){.    /* Init
26da0 69 61 6c 69 7a 65 20 74 68 65 20 6c 6f 63 6b 69  ialize the locki
26db0 6e 67 20 70 61 72 61 6d 65 74 65 72 73 20 2a 2f  ng parameters */
26dc0 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 66 2c 20  .    memset(&f, 
26dd0 30 2c 20 73 69 7a 65 6f 66 28 66 29 29 3b 0a 20  0, sizeof(f));. 
26de0 20 20 20 66 2e 6c 5f 74 79 70 65 20 3d 20 6c 6f     f.l_type = lo
26df0 63 6b 54 79 70 65 3b 0a 20 20 20 20 66 2e 6c 5f  ckType;.    f.l_
26e00 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45  whence = SEEK_SE
26e10 54 3b 0a 20 20 20 20 66 2e 6c 5f 73 74 61 72 74  T;.    f.l_start
26e20 20 3d 20 6f 66 73 74 3b 0a 20 20 20 20 66 2e 6c   = ofst;.    f.l
26e30 5f 6c 65 6e 20 3d 20 6e 3b 0a 0a 20 20 20 20 72  _len = n;..    r
26e40 63 20 3d 20 6f 73 46 63 6e 74 6c 28 70 53 68 6d  c = osFcntl(pShm
26e50 4e 6f 64 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b  Node->h, F_SETLK
26e60 2c 20 26 66 29 3b 0a 20 20 20 20 72 63 20 3d 20  , &f);.    rc = 
26e70 28 72 63 21 3d 28 2d 31 29 29 20 3f 20 53 51 4c  (rc!=(-1)) ? SQL
26e80 49 54 45 5f 4f 4b 20 3a 20 53 51 4c 49 54 45 5f  ITE_OK : SQLITE_
26e90 42 55 53 59 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  BUSY;.  }..  /* 
26ea0 55 70 64 61 74 65 20 74 68 65 20 67 6c 6f 62 61  Update the globa
26eb0 6c 20 6c 6f 63 6b 20 73 74 61 74 65 20 61 6e 64  l lock state and
26ec0 20 64 6f 20 64 65 62 75 67 20 74 72 61 63 69 6e   do debug tracin
26ed0 67 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  g */.#ifdef SQLI
26ee0 54 45 5f 44 45 42 55 47 0a 20 20 7b 20 75 31 36  TE_DEBUG.  { u16
26ef0 20 6d 61 73 6b 3b 0a 20 20 4f 53 54 52 41 43 45   mask;.  OSTRACE
26f00 28 28 22 53 48 4d 2d 4c 4f 43 4b 20 22 29 29 3b  (("SHM-LOCK "));
26f10 0a 20 20 6d 61 73 6b 20 3d 20 6f 66 73 74 3e 33  .  mask = ofst>3
26f20 31 20 3f 20 30 78 66 66 66 66 20 3a 20 28 31 3c  1 ? 0xffff : (1<
26f30 3c 28 6f 66 73 74 2b 6e 29 29 20 2d 20 28 31 3c  <(ofst+n)) - (1<
26f40 3c 6f 66 73 74 29 3b 0a 20 20 69 66 28 20 72 63  <ofst);.  if( rc
26f50 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
26f60 20 20 20 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d     if( lockType=
26f70 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20  =F_UNLCK ){.    
26f80 20 20 4f 53 54 52 41 43 45 28 28 22 75 6e 6c 6f    OSTRACE(("unlo
26f90 63 6b 20 25 64 20 6f 6b 22 2c 20 6f 66 73 74 29  ck %d ok", ofst)
26fa0 29 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64  );.      pShmNod
26fb0 65 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 3d 20 7e  e->exclMask &= ~
26fc0 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70 53 68 6d  mask;.      pShm
26fd0 4e 6f 64 65 2d 3e 73 68 61 72 65 64 4d 61 73 6b  Node->sharedMask
26fe0 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 7d   &= ~mask;.    }
26ff0 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b 54 79 70  else if( lockTyp
27000 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20  e==F_RDLCK ){.  
27010 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 72 65      OSTRACE(("re
27020 61 64 2d 6c 6f 63 6b 20 25 64 20 6f 6b 22 2c 20  ad-lock %d ok", 
27030 6f 66 73 74 29 29 3b 0a 20 20 20 20 20 20 70 53  ofst));.      pS
27040 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61 73 6b  hmNode->exclMask
27050 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 20   &= ~mask;.     
27060 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 68 61 72 65   pShmNode->share
27070 64 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20  dMask |= mask;. 
27080 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
27090 61 73 73 65 72 74 28 20 6c 6f 63 6b 54 79 70 65  assert( lockType
270a0 3d 3d 46 5f 57 52 4c 43 4b 20 29 3b 0a 20 20 20  ==F_WRLCK );.   
270b0 20 20 20 4f 53 54 52 41 43 45 28 28 22 77 72 69     OSTRACE(("wri
270c0 74 65 2d 6c 6f 63 6b 20 25 64 20 6f 6b 22 2c 20  te-lock %d ok", 
270d0 6f 66 73 74 29 29 3b 0a 20 20 20 20 20 20 70 53  ofst));.      pS
270e0 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61 73 6b  hmNode->exclMask
270f0 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20   |= mask;.      
27100 70 53 68 6d 4e 6f 64 65 2d 3e 73 68 61 72 65 64  pShmNode->shared
27110 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20  Mask &= ~mask;. 
27120 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
27130 20 20 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d    if( lockType==
27140 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 20  F_UNLCK ){.     
27150 20 4f 53 54 52 41 43 45 28 28 22 75 6e 6c 6f 63   OSTRACE(("unloc
27160 6b 20 25 64 20 66 61 69 6c 65 64 22 2c 20 6f 66  k %d failed", of
27170 73 74 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  st));.    }else 
27180 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f  if( lockType==F_
27190 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 4f  RDLCK ){.      O
271a0 53 54 52 41 43 45 28 28 22 72 65 61 64 2d 6c 6f  STRACE(("read-lo
271b0 63 6b 20 66 61 69 6c 65 64 22 29 29 3b 0a 20 20  ck failed"));.  
271c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
271d0 73 73 65 72 74 28 20 6c 6f 63 6b 54 79 70 65 3d  ssert( lockType=
271e0 3d 46 5f 57 52 4c 43 4b 20 29 3b 0a 20 20 20 20  =F_WRLCK );.    
271f0 20 20 4f 53 54 52 41 43 45 28 28 22 77 72 69 74    OSTRACE(("writ
27200 65 2d 6c 6f 63 6b 20 25 64 20 66 61 69 6c 65 64  e-lock %d failed
27210 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20 20 7d  ", ofst));.    }
27220 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28  .  }.  OSTRACE((
27230 22 20 2d 20 61 66 74 65 72 77 61 72 64 73 20 25  " - afterwards %
27240 30 33 78 2c 25 30 33 78 5c 6e 22 2c 0a 20 20 20  03x,%03x\n",.   
27250 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65          pShmNode
27260 2d 3e 73 68 61 72 65 64 4d 61 73 6b 2c 20 70 53  ->sharedMask, pS
27270 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61 73 6b  hmNode->exclMask
27280 29 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ));.  }.#endif..
27290 20 20 72 65 74 75 72 6e 20 72 63 3b 20 20 20 20    return rc;    
272a0 20 20 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65      .}../*.** Re
272b0 74 75 72 6e 20 74 68 65 20 6d 69 6e 69 6d 75 6d  turn the minimum
272c0 20 6e 75 6d 62 65 72 20 6f 66 20 33 32 4b 42 20   number of 32KB 
272d0 73 68 6d 20 72 65 67 69 6f 6e 73 20 74 68 61 74  shm regions that
272e0 20 73 68 6f 75 6c 64 20 62 65 20 6d 61 70 70 65   should be mappe
272f0 64 20 61 74 0a 2a 2a 20 61 20 74 69 6d 65 2c 20  d at.** a time, 
27300 61 73 73 75 6d 69 6e 67 20 74 68 61 74 20 65 61  assuming that ea
27310 63 68 20 6d 61 70 70 69 6e 67 20 6d 75 73 74 20  ch mapping must 
27320 62 65 20 61 6e 20 69 6e 74 65 67 65 72 20 6d 75  be an integer mu
27330 6c 74 69 70 6c 65 20 6f 66 20 74 68 65 0a 2a 2a  ltiple of the.**
27340 20 63 75 72 72 65 6e 74 20 73 79 73 74 65 6d 20   current system 
27350 70 61 67 65 2d 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a  page-size..**.**
27360 20 55 73 75 61 6c 6c 79 2c 20 74 68 69 73 20 69   Usually, this i
27370 73 20 31 2e 20 54 68 65 20 65 78 63 65 70 74 69  s 1. The excepti
27380 6f 6e 20 73 65 65 6d 73 20 74 6f 20 62 65 20 73  on seems to be s
27390 79 73 74 65 6d 73 20 74 68 61 74 20 61 72 65 20  ystems that are 
273a0 63 6f 6e 66 69 67 75 72 65 64 0a 2a 2a 20 74 6f  configured.** to
273b0 20 75 73 65 20 36 34 4b 42 20 70 61 67 65 73 20   use 64KB pages 
273c0 2d 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 65  - in this case e
273d0 61 63 68 20 6d 61 70 70 69 6e 67 20 6d 75 73 74  ach mapping must
273e0 20 63 6f 76 65 72 20 61 74 20 6c 65 61 73 74 20   cover at least 
273f0 74 77 6f 0a 2a 2a 20 73 68 6d 20 72 65 67 69 6f  two.** shm regio
27400 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ns..*/.static in
27410 74 20 75 6e 69 78 53 68 6d 52 65 67 69 6f 6e 50  t unixShmRegionP
27420 65 72 4d 61 70 28 76 6f 69 64 29 7b 0a 20 20 69  erMap(void){.  i
27430 6e 74 20 73 68 6d 73 7a 20 3d 20 33 32 2a 31 30  nt shmsz = 32*10
27440 32 34 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  24;            /
27450 2a 20 53 48 4d 20 72 65 67 69 6f 6e 20 73 69 7a  * SHM region siz
27460 65 20 2a 2f 0a 20 20 69 6e 74 20 70 67 73 7a 20  e */.  int pgsz 
27470 3d 20 6f 73 47 65 74 70 61 67 65 73 69 7a 65 28  = osGetpagesize(
27480 29 3b 20 20 20 2f 2a 20 53 79 73 74 65 6d 20 70  );   /* System p
27490 61 67 65 20 73 69 7a 65 20 2a 2f 0a 20 20 61 73  age size */.  as
274a0 73 65 72 74 28 20 28 28 70 67 73 7a 2d 31 29 26  sert( ((pgsz-1)&
274b0 70 67 73 7a 29 3d 3d 30 20 29 3b 20 20 20 2f 2a  pgsz)==0 );   /*
274c0 20 50 61 67 65 20 73 69 7a 65 20 6d 75 73 74 20   Page size must 
274d0 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20 32 20  be a power of 2 
274e0 2a 2f 0a 20 20 69 66 28 20 70 67 73 7a 3c 73 68  */.  if( pgsz<sh
274f0 6d 73 7a 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  msz ) return 1;.
27500 20 20 72 65 74 75 72 6e 20 70 67 73 7a 2f 73 68    return pgsz/sh
27510 6d 73 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 75  msz;.}../*.** Pu
27520 72 67 65 20 74 68 65 20 75 6e 69 78 53 68 6d 4e  rge the unixShmN
27530 6f 64 65 4c 69 73 74 20 6c 69 73 74 20 6f 66 20  odeList list of 
27540 61 6c 6c 20 65 6e 74 72 69 65 73 20 77 69 74 68  all entries with
27550 20 75 6e 69 78 53 68 6d 4e 6f 64 65 2e 6e 52 65   unixShmNode.nRe
27560 66 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  f==0..**.** This
27570 20 69 73 20 6e 6f 74 20 61 20 56 46 53 20 73 68   is not a VFS sh
27580 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6d 65 74 68  ared-memory meth
27590 6f 64 3b 20 69 74 20 69 73 20 61 20 75 74 69 6c  od; it is a util
275a0 69 74 79 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c  ity function cal
275b0 6c 65 64 0a 2a 2a 20 62 79 20 56 46 53 20 73 68  led.** by VFS sh
275c0 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6d 65 74 68  ared-memory meth
275d0 6f 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ods..*/.static v
275e0 6f 69 64 20 75 6e 69 78 53 68 6d 50 75 72 67 65  oid unixShmPurge
275f0 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 64 29 7b  (unixFile *pFd){
27600 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a  .  unixShmNode *
27610 70 20 3d 20 70 46 64 2d 3e 70 49 6e 6f 64 65 2d  p = pFd->pInode-
27620 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 61 73 73  >pShmNode;.  ass
27630 65 72 74 28 20 75 6e 69 78 4d 75 74 65 78 48 65  ert( unixMutexHe
27640 6c 64 28 29 20 29 3b 0a 20 20 69 66 28 20 70 20  ld() );.  if( p 
27650 26 26 20 70 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b  && p->nRef==0 ){
27660 0a 20 20 20 20 69 6e 74 20 6e 53 68 6d 50 65 72  .    int nShmPer
27670 4d 61 70 20 3d 20 75 6e 69 78 53 68 6d 52 65 67  Map = unixShmReg
27680 69 6f 6e 50 65 72 4d 61 70 28 29 3b 0a 20 20 20  ionPerMap();.   
27690 20 69 6e 74 20 69 3b 0a 20 20 20 20 61 73 73 65   int i;.    asse
276a0 72 74 28 20 70 2d 3e 70 49 6e 6f 64 65 3d 3d 70  rt( p->pInode==p
276b0 46 64 2d 3e 70 49 6e 6f 64 65 20 29 3b 0a 20 20  Fd->pInode );.  
276c0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
276d0 66 72 65 65 28 70 2d 3e 6d 75 74 65 78 29 3b 0a  free(p->mutex);.
276e0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
276f0 2d 3e 6e 52 65 67 69 6f 6e 3b 20 69 2b 3d 6e 53  ->nRegion; i+=nS
27700 68 6d 50 65 72 4d 61 70 29 7b 0a 20 20 20 20 20  hmPerMap){.     
27710 20 69 66 28 20 70 2d 3e 68 3e 3d 30 20 29 7b 0a   if( p->h>=0 ){.
27720 20 20 20 20 20 20 20 20 6f 73 4d 75 6e 6d 61 70          osMunmap
27730 28 70 2d 3e 61 70 52 65 67 69 6f 6e 5b 69 5d 2c  (p->apRegion[i],
27740 20 70 2d 3e 73 7a 52 65 67 69 6f 6e 29 3b 0a 20   p->szRegion);. 
27750 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
27760 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
27770 28 70 2d 3e 61 70 52 65 67 69 6f 6e 5b 69 5d 29  (p->apRegion[i])
27780 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
27790 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
277a0 28 70 2d 3e 61 70 52 65 67 69 6f 6e 29 3b 0a 20  (p->apRegion);. 
277b0 20 20 20 69 66 28 20 70 2d 3e 68 3e 3d 30 20 29     if( p->h>=0 )
277c0 7b 0a 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63  {.      robust_c
277d0 6c 6f 73 65 28 70 46 64 2c 20 70 2d 3e 68 2c 20  lose(pFd, p->h, 
277e0 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20  __LINE__);.     
277f0 20 70 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20 20 20   p->h = -1;.    
27800 7d 0a 20 20 20 20 70 2d 3e 70 49 6e 6f 64 65 2d  }.    p->pInode-
27810 3e 70 53 68 6d 4e 6f 64 65 20 3d 20 30 3b 0a 20  >pShmNode = 0;. 
27820 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
27830 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 64  p);.  }.}..#if d
27840 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
27850 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42  ) && SQLITE_ENAB
27860 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
27870 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
27880 61 72 20 2a 70 72 6f 78 79 53 68 61 72 65 64 4d  ar *proxySharedM
27890 65 6d 6f 72 79 42 61 73 65 50 61 74 68 28 75 6e  emoryBasePath(un
278a0 69 78 46 69 6c 65 20 2a 29 3b 0a 23 65 6e 64 69  ixFile *);.#endi
278b0 66 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20  f../*.** Open a 
278c0 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 61 72  shared-memory ar
278d0 65 61 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ea associated wi
278e0 74 68 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65  th open database
278f0 20 66 69 6c 65 20 70 44 62 46 64 2e 20 20 0a 2a   file pDbFd.  .*
27900 2a 20 54 68 69 73 20 70 61 72 74 69 63 75 6c 61  * This particula
27910 72 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  r implementation
27920 20 75 73 65 73 20 6d 6d 61 70 70 65 64 20 66 69   uses mmapped fi
27930 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  les..**.** The f
27940 69 6c 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c  ile used to impl
27950 65 6d 65 6e 74 20 73 68 61 72 65 64 2d 6d 65 6d  ement shared-mem
27960 6f 72 79 20 69 73 20 69 6e 20 74 68 65 20 73 61  ory is in the sa
27970 6d 65 20 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20  me directory.** 
27980 61 73 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61  as the open data
27990 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 68 61  base file and ha
279a0 73 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 20  s the same name 
279b0 61 73 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61  as the open data
279c0 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 77 69 74  base.** file wit
279d0 68 20 74 68 65 20 22 2d 73 68 6d 22 20 73 75 66  h the "-shm" suf
279e0 66 69 78 20 61 64 64 65 64 2e 20 20 46 6f 72 20  fix added.  For 
279f0 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65 20  example, if the 
27a00 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a  database file.**
27a10 20 69 73 20 22 2f 68 6f 6d 65 2f 75 73 65 72 31   is "/home/user1
27a20 2f 63 6f 6e 66 69 67 2e 64 62 22 20 74 68 65 6e  /config.db" then
27a30 20 74 68 65 20 66 69 6c 65 20 74 68 61 74 20 69   the file that i
27a40 73 20 63 72 65 61 74 65 64 20 61 6e 64 20 6d 6d  s created and mm
27a50 61 70 70 65 64 0a 2a 2a 20 66 6f 72 20 73 68 61  apped.** for sha
27a60 72 65 64 20 6d 65 6d 6f 72 79 20 77 69 6c 6c 20  red memory will 
27a70 62 65 20 63 61 6c 6c 65 64 20 22 2f 68 6f 6d 65  be called "/home
27a80 2f 75 73 65 72 31 2f 63 6f 6e 66 69 67 2e 64 62  /user1/config.db
27a90 2d 73 68 6d 22 2e 20 20 0a 2a 2a 0a 2a 2a 20 41  -shm".  .**.** A
27aa0 6e 6f 74 68 65 72 20 61 70 70 72 6f 61 63 68 20  nother approach 
27ab0 74 6f 20 69 73 20 74 6f 20 75 73 65 20 66 69 6c  to is to use fil
27ac0 65 73 20 69 6e 20 2f 64 65 76 2f 73 68 6d 20 6f  es in /dev/shm o
27ad0 72 20 2f 64 65 76 2f 74 6d 70 20 6f 72 20 61 6e  r /dev/tmp or an
27ae0 0a 2a 2a 20 73 6f 6d 65 20 6f 74 68 65 72 20 74  .** some other t
27af0 6d 70 66 73 20 6d 6f 75 6e 74 2e 20 42 75 74 20  mpfs mount. But 
27b00 69 66 20 61 20 66 69 6c 65 20 69 6e 20 61 20 64  if a file in a d
27b10 69 66 66 65 72 65 6e 74 20 64 69 72 65 63 74 6f  ifferent directo
27b20 72 79 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 64  ry.** from the d
27b30 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
27b40 75 73 65 64 2c 20 74 68 65 6e 20 64 69 66 66 65  used, then diffe
27b50 72 69 6e 67 20 61 63 63 65 73 73 20 70 65 72 6d  ring access perm
27b60 69 73 73 69 6f 6e 73 0a 2a 2a 20 6f 72 20 61 20  issions.** or a 
27b70 63 68 72 6f 6f 74 28 29 20 6d 69 67 68 74 20 63  chroot() might c
27b80 61 75 73 65 20 74 77 6f 20 64 69 66 66 65 72 65  ause two differe
27b90 6e 74 20 70 72 6f 63 65 73 73 65 73 20 6f 6e 20  nt processes on 
27ba0 74 68 65 20 73 61 6d 65 0a 2a 2a 20 64 61 74 61  the same.** data
27bb0 62 61 73 65 20 74 6f 20 65 6e 64 20 75 70 20 75  base to end up u
27bc0 73 69 6e 67 20 64 69 66 66 65 72 65 6e 74 20 66  sing different f
27bd0 69 6c 65 73 20 66 6f 72 20 73 68 61 72 65 64 20  iles for shared 
27be0 6d 65 6d 6f 72 79 20 2d 20 0a 2a 2a 20 6d 65 61  memory - .** mea
27bf0 6e 69 6e 67 20 74 68 61 74 20 74 68 65 69 72 20  ning that their 
27c00 6d 65 6d 6f 72 79 20 77 6f 75 6c 64 20 6e 6f 74  memory would not
27c10 20 72 65 61 6c 6c 79 20 62 65 20 73 68 61 72 65   really be share
27c20 64 20 2d 20 72 65 73 75 6c 74 69 6e 67 0a 2a 2a  d - resulting.**
27c30 20 69 6e 20 64 61 74 61 62 61 73 65 20 63 6f 72   in database cor
27c40 72 75 70 74 69 6f 6e 2e 20 20 4e 65 76 65 72 74  ruption.  Nevert
27c50 68 65 6c 65 73 73 2c 20 74 68 69 73 20 74 6d 70  heless, this tmp
27c60 66 73 20 66 69 6c 65 20 75 73 61 67 65 0a 2a 2a  fs file usage.**
27c70 20 63 61 6e 20 62 65 20 65 6e 61 62 6c 65 64 20   can be enabled 
27c80 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  at compile-time 
27c90 75 73 69 6e 67 20 2d 44 53 51 4c 49 54 45 5f 53  using -DSQLITE_S
27ca0 48 4d 5f 44 49 52 45 43 54 4f 52 59 3d 22 2f 64  HM_DIRECTORY="/d
27cb0 65 76 2f 73 68 6d 22 0a 2a 2a 20 6f 72 20 74 68  ev/shm".** or th
27cc0 65 20 65 71 75 69 76 61 6c 65 6e 74 2e 20 20 54  e equivalent.  T
27cd0 68 65 20 75 73 65 20 6f 66 20 74 68 65 20 53 51  he use of the SQ
27ce0 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f  LITE_SHM_DIRECTO
27cf0 52 59 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 0a  RY compile-time.
27d00 2a 2a 20 6f 70 74 69 6f 6e 20 72 65 73 75 6c 74  ** option result
27d10 73 20 69 6e 20 61 6e 20 69 6e 63 6f 6d 70 61 74  s in an incompat
27d20 69 62 6c 65 20 62 75 69 6c 64 20 6f 66 20 53 51  ible build of SQ
27d30 4c 69 74 65 3b 20 20 62 75 69 6c 64 73 20 6f 66  Lite;  builds of
27d40 20 53 51 4c 69 74 65 0a 2a 2a 20 74 68 61 74 20   SQLite.** that 
27d50 77 69 74 68 20 64 69 66 66 65 72 69 6e 67 20 53  with differing S
27d60 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54  QLITE_SHM_DIRECT
27d70 4f 52 59 20 73 65 74 74 69 6e 67 73 20 61 74 74  ORY settings att
27d80 65 6d 70 74 20 74 6f 20 75 73 65 20 74 68 65 0a  empt to use the.
27d90 2a 2a 20 73 61 6d 65 20 64 61 74 61 62 61 73 65  ** same database
27da0 20 66 69 6c 65 20 61 74 20 74 68 65 20 73 61 6d   file at the sam
27db0 65 20 74 69 6d 65 2c 20 64 61 74 61 62 61 73 65  e time, database
27dc0 20 63 6f 72 72 75 70 74 69 6f 6e 20 77 69 6c 6c   corruption will
27dd0 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65 73 75 6c   likely.** resul
27de0 74 2e 20 54 68 65 20 53 51 4c 49 54 45 5f 53 48  t. The SQLITE_SH
27df0 4d 5f 44 49 52 45 43 54 4f 52 59 20 63 6f 6d 70  M_DIRECTORY comp
27e00 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20  ile-time option 
27e10 69 73 20 63 6f 6e 73 69 64 65 72 65 64 0a 2a 2a  is considered.**
27e20 20 22 75 6e 73 75 70 70 6f 72 74 65 64 22 20 61   "unsupported" a
27e30 6e 64 20 6d 61 79 20 67 6f 20 61 77 61 79 20 69  nd may go away i
27e40 6e 20 61 20 66 75 74 75 72 65 20 53 51 4c 69 74  n a future SQLit
27e50 65 20 72 65 6c 65 61 73 65 2e 0a 2a 2a 0a 2a 2a  e release..**.**
27e60 20 57 68 65 6e 20 6f 70 65 6e 69 6e 67 20 61 20   When opening a 
27e70 6e 65 77 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  new shared-memor
27e80 79 20 66 69 6c 65 2c 20 69 66 20 6e 6f 20 6f 74  y file, if no ot
27e90 68 65 72 20 69 6e 73 74 61 6e 63 65 73 20 6f 66  her instances of
27ea0 20 74 68 61 74 0a 2a 2a 20 66 69 6c 65 20 61 72   that.** file ar
27eb0 65 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e  e currently open
27ec0 2c 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73  , in this proces
27ed0 73 20 6f 72 20 69 6e 20 6f 74 68 65 72 20 70 72  s or in other pr
27ee0 6f 63 65 73 73 65 73 2c 20 74 68 65 6e 0a 2a 2a  ocesses, then.**
27ef0 20 74 68 65 20 66 69 6c 65 20 6d 75 73 74 20 62   the file must b
27f00 65 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 7a  e truncated to z
27f10 65 72 6f 20 6c 65 6e 67 74 68 20 6f 72 20 68 61  ero length or ha
27f20 76 65 20 69 74 73 20 68 65 61 64 65 72 20 63 6c  ve its header cl
27f30 65 61 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  eared..**.** If 
27f40 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74  the original dat
27f50 61 62 61 73 65 20 66 69 6c 65 20 28 70 44 62 46  abase file (pDbF
27f60 64 29 20 69 73 20 75 73 69 6e 67 20 74 68 65 20  d) is using the 
27f70 22 75 6e 69 78 2d 65 78 63 6c 22 20 56 46 53 0a  "unix-excl" VFS.
27f80 2a 2a 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68  ** that means th
27f90 61 74 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  at an exclusive 
27fa0 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e 20  lock is held on 
27fb0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
27fc0 65 20 61 6e 64 0a 2a 2a 20 74 68 61 74 20 6e 6f  e and.** that no
27fd0 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73   other processes
27fe0 20 61 72 65 20 61 62 6c 65 20 74 6f 20 72 65 61   are able to rea
27ff0 64 20 6f 72 20 77 72 69 74 65 20 74 68 65 20 64  d or write the d
28000 61 74 61 62 61 73 65 2e 20 20 49 6e 0a 2a 2a 20  atabase.  In.** 
28010 74 68 61 74 20 63 61 73 65 2c 20 77 65 20 64 6f  that case, we do
28020 20 6e 6f 74 20 72 65 61 6c 6c 79 20 6e 65 65 64   not really need
28030 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 2e 20   shared memory. 
28040 20 4e 6f 20 73 68 61 72 65 64 20 6d 65 6d 6f 72   No shared memor
28050 79 0a 2a 2a 20 66 69 6c 65 20 69 73 20 63 72 65  y.** file is cre
28060 61 74 65 64 2e 20 20 54 68 65 20 73 68 61 72 65  ated.  The share
28070 64 20 6d 65 6d 6f 72 79 20 77 69 6c 6c 20 62 65  d memory will be
28080 20 73 69 6d 75 6c 61 74 65 64 20 77 69 74 68 20   simulated with 
28090 68 65 61 70 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a  heap memory..*/.
280a0 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4f  static int unixO
280b0 70 65 6e 53 68 61 72 65 64 4d 65 6d 6f 72 79 28  penSharedMemory(
280c0 75 6e 69 78 46 69 6c 65 20 2a 70 44 62 46 64 29  unixFile *pDbFd)
280d0 7b 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78 53  {.  struct unixS
280e0 68 6d 20 2a 70 20 3d 20 30 3b 20 20 20 20 20 20  hm *p = 0;      
280f0 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 6e 65      /* The conne
28100 63 74 69 6f 6e 20 74 6f 20 62 65 20 6f 70 65 6e  ction to be open
28110 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 75  ed */.  struct u
28120 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d  nixShmNode *pShm
28130 4e 6f 64 65 3b 20 20 20 2f 2a 20 54 68 65 20 75  Node;   /* The u
28140 6e 64 65 72 6c 79 69 6e 67 20 6d 6d 61 70 70 65  nderlying mmappe
28150 64 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  d file */.  int 
28160 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
28170 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
28180 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20  esult code */.  
28190 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70  unixInodeInfo *p
281a0 49 6e 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20  Inode;          
281b0 2f 2a 20 54 68 65 20 69 6e 6f 64 65 20 6f 66 20  /* The inode of 
281c0 66 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 53  fd */.  char *zS
281d0 68 6d 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20  hmFilename;     
281e0 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
281f0 6f 66 20 74 68 65 20 66 69 6c 65 20 75 73 65 64  of the file used
28200 20 66 6f 72 20 53 48 4d 20 2a 2f 0a 20 20 69 6e   for SHM */.  in
28210 74 20 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 3b 20  t nShmFilename; 
28220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28230 20 53 69 7a 65 20 6f 66 20 74 68 65 20 53 48 4d   Size of the SHM
28240 20 66 69 6c 65 6e 61 6d 65 20 69 6e 20 62 79 74   filename in byt
28250 65 73 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  es */..  /* Allo
28260 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 74  cate space for t
28270 68 65 20 6e 65 77 20 75 6e 69 78 53 68 6d 20 6f  he new unixShm o
28280 62 6a 65 63 74 2e 20 2a 2f 0a 20 20 70 20 3d 20  bject. */.  p = 
28290 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20  sqlite3_malloc( 
282a0 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20  sizeof(*p) );.  
282b0 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
282c0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
282d0 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73    memset(p, 0, s
282e0 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 61 73  izeof(*p));.  as
282f0 73 65 72 74 28 20 70 44 62 46 64 2d 3e 70 53 68  sert( pDbFd->pSh
28300 6d 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 43 68  m==0 );..  /* Ch
28310 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 61 20  eck to see if a 
28320 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65  unixShmNode obje
28330 63 74 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  ct already exist
28340 73 2e 20 52 65 75 73 65 20 61 6e 20 65 78 69 73  s. Reuse an exis
28350 74 69 6e 67 0a 20 20 2a 2a 20 6f 6e 65 20 69 66  ting.  ** one if
28360 20 70 72 65 73 65 6e 74 2e 20 43 72 65 61 74 65   present. Create
28370 20 61 20 6e 65 77 20 6f 6e 65 20 69 66 20 6e 65   a new one if ne
28380 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20  cessary..  */.  
28390 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
283a0 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70 44 62  ;.  pInode = pDb
283b0 46 64 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 70 53  Fd->pInode;.  pS
283c0 68 6d 4e 6f 64 65 20 3d 20 70 49 6e 6f 64 65 2d  hmNode = pInode-
283d0 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 69 66 28  >pShmNode;.  if(
283e0 20 70 53 68 6d 4e 6f 64 65 3d 3d 30 20 29 7b 0a   pShmNode==0 ){.
283f0 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74 20      struct stat 
28400 73 53 74 61 74 3b 20 20 20 20 20 20 20 20 20 20  sStat;          
28410 20 20 20 20 20 20 20 2f 2a 20 66 73 74 61 74 28         /* fstat(
28420 29 20 69 6e 66 6f 20 66 6f 72 20 64 61 74 61 62  ) info for datab
28430 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20  ase file */.    
28440 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 42 61 73  const char *zBas
28450 65 50 61 74 68 20 3d 20 70 44 62 46 64 2d 3e 7a  ePath = pDbFd->z
28460 50 61 74 68 3b 0a 0a 20 20 20 20 2f 2a 20 43 61  Path;..    /* Ca
28470 6c 6c 20 66 73 74 61 74 28 29 20 74 6f 20 66 69  ll fstat() to fi
28480 67 75 72 65 20 6f 75 74 20 74 68 65 20 70 65 72  gure out the per
28490 6d 69 73 73 69 6f 6e 73 20 6f 6e 20 74 68 65 20  missions on the 
284a0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
284b0 66 0a 20 20 20 20 2a 2a 20 61 20 6e 65 77 20 2a  f.    ** a new *
284c0 2d 73 68 6d 20 66 69 6c 65 20 69 73 20 63 72 65  -shm file is cre
284d0 61 74 65 64 2c 20 61 6e 20 61 74 74 65 6d 70 74  ated, an attempt
284e0 20 77 69 6c 6c 20 62 65 20 6d 61 64 65 20 74 6f   will be made to
284f0 20 63 72 65 61 74 65 20 69 74 0a 20 20 20 20 2a   create it.    *
28500 2a 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  * with the same 
28510 70 65 72 6d 69 73 73 69 6f 6e 73 2e 0a 20 20 20  permissions..   
28520 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f 73 46 73   */.    if( osFs
28530 74 61 74 28 70 44 62 46 64 2d 3e 68 2c 20 26 73  tat(pDbFd->h, &s
28540 53 74 61 74 29 20 26 26 20 70 49 6e 6f 64 65 2d  Stat) && pInode-
28550 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30  >bProcessLock==0
28560 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
28570 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41  QLITE_IOERR_FSTA
28580 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68  T;.      goto sh
28590 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20  m_open_err;.    
285a0 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  }..#if defined(_
285b0 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c  _APPLE__) && SQL
285c0 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
285d0 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20 2f 2a 20  NG_STYLE.    /* 
285e0 49 66 20 70 44 62 46 64 20 69 73 20 63 6f 6e 66  If pDbFd is conf
285f0 69 67 75 72 65 64 20 77 69 74 68 20 70 72 6f 78  igured with prox
28600 79 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 2c 20  y locking mode, 
28610 75 73 65 20 74 68 65 20 6c 6f 63 61 6c 20 0a 20  use the local . 
28620 20 20 20 20 2a 2a 20 6c 6f 63 6b 20 66 69 6c 65      ** lock file
28630 20 70 61 74 68 20 74 6f 20 64 65 74 65 72 6d 69   path to determi
28640 6e 65 20 74 68 65 20 2d 73 68 6d 20 66 69 6c 65  ne the -shm file
28650 20 70 61 74 68 0a 20 20 20 20 20 2a 2f 0a 20 20   path.     */.  
28660 20 20 69 66 28 20 69 73 50 72 6f 78 79 4c 6f 63    if( isProxyLoc
28670 6b 69 6e 67 4d 6f 64 65 28 70 44 62 46 64 29 20  kingMode(pDbFd) 
28680 29 7b 0a 20 20 20 20 20 20 7a 42 61 73 65 50 61  ){.      zBasePa
28690 74 68 20 3d 20 70 72 6f 78 79 53 68 61 72 65 64  th = proxyShared
286a0 4d 65 6d 6f 72 79 42 61 73 65 50 61 74 68 28 70  MemoryBasePath(p
286b0 44 62 46 64 29 3b 0a 20 20 20 20 20 20 69 66 28  DbFd);.      if(
286c0 20 21 7a 42 61 73 65 50 61 74 68 20 29 7b 0a 20   !zBasePath ){. 
286d0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
286e0 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54  TE_CANTOPEN_BKPT
286f0 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73  ;.        goto s
28700 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20  hm_open_err;.   
28710 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69     }.    }.#endi
28720 66 0a 20 20 20 20 0a 23 69 66 64 65 66 20 53 51  f.    .#ifdef SQ
28730 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f  LITE_SHM_DIRECTO
28740 52 59 0a 20 20 20 20 6e 53 68 6d 46 69 6c 65 6e  RY.    nShmFilen
28750 61 6d 65 20 3d 20 73 69 7a 65 6f 66 28 53 51 4c  ame = sizeof(SQL
28760 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52  ITE_SHM_DIRECTOR
28770 59 29 20 2b 20 33 31 3b 0a 23 65 6c 73 65 0a 20  Y) + 31;.#else. 
28780 20 20 20 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 20     nShmFilename 
28790 3d 20 36 20 2b 20 28 69 6e 74 29 73 74 72 6c 65  = 6 + (int)strle
287a0 6e 28 7a 42 61 73 65 50 61 74 68 29 3b 0a 23 65  n(zBasePath);.#e
287b0 6e 64 69 66 0a 20 20 20 20 70 53 68 6d 4e 6f 64  ndif.    pShmNod
287c0 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  e = sqlite3_mall
287d0 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 53 68 6d  oc( sizeof(*pShm
287e0 4e 6f 64 65 29 20 2b 20 6e 53 68 6d 46 69 6c 65  Node) + nShmFile
287f0 6e 61 6d 65 20 29 3b 0a 20 20 20 20 69 66 28 20  name );.    if( 
28800 70 53 68 6d 4e 6f 64 65 3d 3d 30 20 29 7b 0a 20  pShmNode==0 ){. 
28810 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
28820 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f  _NOMEM;.      go
28830 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b  to shm_open_err;
28840 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65  .    }.    memse
28850 74 28 70 53 68 6d 4e 6f 64 65 2c 20 30 2c 20 73  t(pShmNode, 0, s
28860 69 7a 65 6f 66 28 2a 70 53 68 6d 4e 6f 64 65 29  izeof(*pShmNode)
28870 2b 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 29 3b 0a  +nShmFilename);.
28880 20 20 20 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65      zShmFilename
28890 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69   = pShmNode->zFi
288a0 6c 65 6e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29  lename = (char*)
288b0 26 70 53 68 6d 4e 6f 64 65 5b 31 5d 3b 0a 23 69  &pShmNode[1];.#i
288c0 66 64 65 66 20 53 51 4c 49 54 45 5f 53 48 4d 5f  fdef SQLITE_SHM_
288d0 44 49 52 45 43 54 4f 52 59 0a 20 20 20 20 73 71  DIRECTORY.    sq
288e0 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
288f0 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 7a 53 68  ShmFilename, zSh
28900 6d 46 69 6c 65 6e 61 6d 65 2c 20 0a 20 20 20 20  mFilename, .    
28910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28920 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45   SQLITE_SHM_DIRE
28930 43 54 4f 52 59 20 22 2f 73 71 6c 69 74 65 2d 73  CTORY "/sqlite-s
28940 68 6d 2d 25 78 2d 25 78 22 2c 0a 20 20 20 20 20  hm-%x-%x",.     
28950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28960 28 75 33 32 29 73 53 74 61 74 2e 73 74 5f 69 6e  (u32)sStat.st_in
28970 6f 2c 20 28 75 33 32 29 73 53 74 61 74 2e 73 74  o, (u32)sStat.st
28980 5f 64 65 76 29 3b 0a 23 65 6c 73 65 0a 20 20 20  _dev);.#else.   
28990 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
289a0 66 28 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20  f(nShmFilename, 
289b0 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 22 25  zShmFilename, "%
289c0 73 2d 73 68 6d 22 2c 20 7a 42 61 73 65 50 61 74  s-shm", zBasePat
289d0 68 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46  h);.    sqlite3F
289e0 69 6c 65 53 75 66 66 69 78 33 28 70 44 62 46 64  ileSuffix3(pDbFd
289f0 2d 3e 7a 50 61 74 68 2c 20 7a 53 68 6d 46 69 6c  ->zPath, zShmFil
28a00 65 6e 61 6d 65 29 3b 0a 23 65 6e 64 69 66 0a 20  ename);.#endif. 
28a10 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 20 3d     pShmNode->h =
28a20 20 2d 31 3b 0a 20 20 20 20 70 44 62 46 64 2d 3e   -1;.    pDbFd->
28a30 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65  pInode->pShmNode
28a40 20 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 20   = pShmNode;.   
28a50 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64   pShmNode->pInod
28a60 65 20 3d 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64  e = pDbFd->pInod
28a70 65 3b 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  e;.    pShmNode-
28a80 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33  >mutex = sqlite3
28a90 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c  _mutex_alloc(SQL
28aa0 49 54 45 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b  ITE_MUTEX_FAST);
28ab0 0a 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64  .    if( pShmNod
28ac0 65 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20  e->mutex==0 ){. 
28ad0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
28ae0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f  _NOMEM;.      go
28af0 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b  to shm_open_err;
28b00 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
28b10 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73  pInode->bProcess
28b20 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Lock==0 ){.     
28b30 20 69 6e 74 20 6f 70 65 6e 46 6c 61 67 73 20 3d   int openFlags =
28b40 20 4f 5f 52 44 57 52 20 7c 20 4f 5f 43 52 45 41   O_RDWR | O_CREA
28b50 54 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  T;.      if( sql
28b60 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e  ite3_uri_boolean
28b70 28 70 44 62 46 64 2d 3e 7a 50 61 74 68 2c 20 22  (pDbFd->zPath, "
28b80 72 65 61 64 6f 6e 6c 79 5f 73 68 6d 22 2c 20 30  readonly_shm", 0
28b90 29 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ).#if defined(SQ
28ba0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50 45 52 53  LITE_ENABLE_PERS
28bb0 49 53 54 5f 57 41 4c 29 26 26 28 53 51 4c 49 54  IST_WAL)&&(SQLIT
28bc0 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
28bd0 5f 53 54 59 4c 45 20 5c 0a 20 20 20 20 7c 7c 20  _STYLE \.    || 
28be0 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
28bf0 5f 29 29 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  _)).         || 
28c00 28 70 44 62 46 64 2d 3e 6f 70 65 6e 46 6c 61 67  (pDbFd->openFlag
28c10 73 20 26 20 4f 5f 52 44 57 52 29 20 21 3d 20 4f  s & O_RDWR) != O
28c20 5f 52 44 57 52 0a 23 65 6e 64 69 66 0a 20 20 20  _RDWR.#endif.   
28c30 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
28c40 20 6f 70 65 6e 46 6c 61 67 73 20 3d 20 4f 5f 52   openFlags = O_R
28c50 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 20 20 70  DONLY;.        p
28c60 53 68 6d 4e 6f 64 65 2d 3e 69 73 52 65 61 64 6f  ShmNode->isReado
28c70 6e 6c 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  nly = 1;.      }
28c80 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d  .      pShmNode-
28c90 3e 68 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e  >h = robust_open
28ca0 28 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 6f  (zShmFilename, o
28cb0 70 65 6e 46 6c 61 67 73 2c 20 28 73 53 74 61 74  penFlags, (sStat
28cc0 2e 73 74 5f 6d 6f 64 65 26 30 37 37 37 29 29 3b  .st_mode&0777));
28cd0 0a 20 20 20 20 20 20 69 66 28 20 70 53 68 6d 4e  .      if( pShmN
28ce0 6f 64 65 2d 3e 68 3c 30 20 29 7b 0a 20 20 20 20  ode->h<0 ){.    
28cf0 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67      rc = unixLog
28d00 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e  Error(SQLITE_CAN
28d10 54 4f 50 45 4e 5f 42 4b 50 54 2c 20 22 6f 70 65  TOPEN_BKPT, "ope
28d20 6e 22 2c 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65  n", zShmFilename
28d30 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  );.        goto 
28d40 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20  shm_open_err;.  
28d50 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
28d60 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
28d70 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  another process 
28d80 69 73 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 64  is holding the d
28d90 65 61 64 2d 6d 61 6e 20 73 77 69 74 63 68 2e 0a  ead-man switch..
28da0 20 20 20 20 20 20 2a 2a 20 49 66 20 6e 6f 74 2c        ** If not,
28db0 20 74 72 75 6e 63 61 74 65 20 74 68 65 20 66 69   truncate the fi
28dc0 6c 65 20 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74  le to zero lengt
28dd0 68 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  h. .      */.   
28de0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
28df0 4b 3b 0a 20 20 20 20 20 20 69 66 28 20 75 6e 69  K;.      if( uni
28e00 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70  xShmSystemLock(p
28e10 53 68 6d 4e 6f 64 65 2c 20 46 5f 57 52 4c 43 4b  ShmNode, F_WRLCK
28e20 2c 20 55 4e 49 58 5f 53 48 4d 5f 44 4d 53 2c 20  , UNIX_SHM_DMS, 
28e30 31 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  1)==SQLITE_OK ){
28e40 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 6f 62  .        if( rob
28e50 75 73 74 5f 66 74 72 75 6e 63 61 74 65 28 70 53  ust_ftruncate(pS
28e60 68 6d 4e 6f 64 65 2d 3e 68 2c 20 30 29 20 29 7b  hmNode->h, 0) ){
28e70 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
28e80 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c  unixLogError(SQL
28e90 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4f 50 45  ITE_IOERR_SHMOPE
28ea0 4e 2c 20 22 66 74 72 75 6e 63 61 74 65 22 2c 20  N, "ftruncate", 
28eb0 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  zShmFilename);. 
28ec0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
28ed0 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 72 75          /* If ru
28ee0 6e 6e 69 6e 67 20 61 73 20 72 6f 6f 74 20 73 65  nning as root se
28ef0 74 20 74 68 65 20 75 69 64 2f 67 69 64 20 6f 66  t the uid/gid of
28f00 20 74 68 65 20 73 68 6d 20 66 69 6c 65 20 74 6f   the shm file to
28f10 20 6d 61 74 63 68 0a 20 20 20 20 20 20 20 20 20   match.         
28f20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65   ** the database
28f30 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 75 69   */.          ui
28f40 64 5f 74 20 65 75 69 64 20 3d 20 67 65 74 65 75  d_t euid = geteu
28f50 69 64 28 29 3b 0a 20 20 20 20 20 20 20 20 20 20  id();.          
28f60 69 66 28 20 28 21 70 53 68 6d 4e 6f 64 65 2d 3e  if( (!pShmNode->
28f70 69 73 52 65 61 64 6f 6e 6c 79 29 20 26 26 20 65  isReadonly) && e
28f80 75 69 64 3d 3d 30 20 26 26 20 28 65 75 69 64 21  uid==0 && (euid!
28f90 3d 73 53 74 61 74 2e 73 74 5f 75 69 64 20 7c 7c  =sStat.st_uid ||
28fa0 20 67 65 74 65 67 69 64 28 29 21 3d 73 53 74 61   getegid()!=sSta
28fb0 74 2e 73 74 5f 67 69 64 29 20 29 7b 0a 20 20 20  t.st_gid) ){.   
28fc0 20 20 20 20 20 20 20 20 20 69 66 28 20 6f 73 46           if( osF
28fd0 63 68 6f 77 6e 28 70 53 68 6d 4e 6f 64 65 2d 3e  chown(pShmNode->
28fe0 68 2c 20 73 53 74 61 74 2e 73 74 5f 75 69 64 2c  h, sStat.st_uid,
28ff0 20 73 53 74 61 74 2e 73 74 5f 67 69 64 29 20 29   sStat.st_gid) )
29000 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
29010 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
29020 52 5f 53 48 4d 4f 50 45 4e 3b 0a 20 20 20 20 20  R_SHMOPEN;.     
29030 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
29040 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
29050 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
29060 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
29070 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 75  {.        rc = u
29080 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b  nixShmSystemLock
29090 28 70 53 68 6d 4e 6f 64 65 2c 20 46 5f 52 44 4c  (pShmNode, F_RDL
290a0 43 4b 2c 20 55 4e 49 58 5f 53 48 4d 5f 44 4d 53  CK, UNIX_SHM_DMS
290b0 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 1);.      }.  
290c0 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
290d0 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a  o shm_open_err;.
290e0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
290f0 4d 61 6b 65 20 74 68 65 20 6e 65 77 20 63 6f 6e  Make the new con
29100 6e 65 63 74 69 6f 6e 20 61 20 63 68 69 6c 64 20  nection a child 
29110 6f 66 20 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f  of the unixShmNo
29120 64 65 20 2a 2f 0a 20 20 70 2d 3e 70 53 68 6d 4e  de */.  p->pShmN
29130 6f 64 65 20 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a  ode = pShmNode;.
29140 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
29150 42 55 47 0a 20 20 70 2d 3e 69 64 20 3d 20 70 53  BUG.  p->id = pS
29160 68 6d 4e 6f 64 65 2d 3e 6e 65 78 74 53 68 6d 49  hmNode->nextShmI
29170 64 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 70 53  d++;.#endif.  pS
29180 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 2b 2b 3b 0a  hmNode->nRef++;.
29190 20 20 70 44 62 46 64 2d 3e 70 53 68 6d 20 3d 20    pDbFd->pShm = 
291a0 70 3b 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75  p;.  unixLeaveMu
291b0 74 65 78 28 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  tex();..  /* The
291c0 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
291d0 20 6f 6e 20 70 53 68 6d 4e 6f 64 65 20 68 61 73   on pShmNode has
291e0 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 69 6e   already been in
291f0 63 72 65 6d 65 6e 74 65 64 20 75 6e 64 65 72 0a  cremented under.
29200 20 20 2a 2a 20 74 68 65 20 63 6f 76 65 72 20 6f    ** the cover o
29210 66 20 74 68 65 20 75 6e 69 78 45 6e 74 65 72 4d  f the unixEnterM
29220 75 74 65 78 28 29 20 6d 75 74 65 78 20 61 6e 64  utex() mutex and
29230 20 74 68 65 20 70 6f 69 6e 74 65 72 20 66 72 6f   the pointer fro
29240 6d 20 74 68 65 0a 20 20 2a 2a 20 6e 65 77 20 28  m the.  ** new (
29250 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d 29 20  struct unixShm) 
29260 6f 62 6a 65 63 74 20 74 6f 20 74 68 65 20 70 53  object to the pS
29270 68 6d 4e 6f 64 65 20 68 61 73 20 62 65 65 6e 20  hmNode has been 
29280 73 65 74 2e 20 41 6c 6c 20 74 68 61 74 20 69 73  set. All that is
29290 0a 20 20 2a 2a 20 6c 65 66 74 20 74 6f 20 64 6f  .  ** left to do
292a0 20 69 73 20 74 6f 20 6c 69 6e 6b 20 74 68 65 20   is to link the 
292b0 6e 65 77 20 6f 62 6a 65 63 74 20 69 6e 74 6f 20  new object into 
292c0 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  the linked list 
292d0 73 74 61 72 74 69 6e 67 0a 20 20 2a 2a 20 61 74  starting.  ** at
292e0 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73   pShmNode->pFirs
292f0 74 2e 20 54 68 69 73 20 6d 75 73 74 20 62 65 20  t. This must be 
29300 64 6f 6e 65 20 77 68 69 6c 65 20 68 6f 6c 64 69  done while holdi
29310 6e 67 20 74 68 65 20 70 53 68 6d 4e 6f 64 65 2d  ng the pShmNode-
29320 3e 6d 75 74 65 78 20 0a 20 20 2a 2a 20 6d 75 74  >mutex .  ** mut
29330 65 78 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ex..  */.  sqlit
29340 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70  e3_mutex_enter(p
29350 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b  ShmNode->mutex);
29360 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53  .  p->pNext = pS
29370 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 0a  hmNode->pFirst;.
29380 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72    pShmNode->pFir
29390 73 74 20 3d 20 70 3b 0a 20 20 73 71 6c 69 74 65  st = p;.  sqlite
293a0 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53  3_mutex_leave(pS
293b0 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a  hmNode->mutex);.
293c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
293d0 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68  OK;..  /* Jump h
293e0 65 72 65 20 6f 6e 20 61 6e 79 20 65 72 72 6f 72  ere on any error
293f0 20 2a 2f 0a 73 68 6d 5f 6f 70 65 6e 5f 65 72 72   */.shm_open_err
29400 3a 0a 20 20 75 6e 69 78 53 68 6d 50 75 72 67 65  :.  unixShmPurge
29410 28 70 44 62 46 64 29 3b 20 20 20 20 20 20 20 2f  (pDbFd);       /
29420 2a 20 54 68 69 73 20 63 61 6c 6c 20 66 72 65 65  * This call free
29430 73 20 70 53 68 6d 4e 6f 64 65 20 69 66 20 72 65  s pShmNode if re
29440 71 75 69 72 65 64 20 2a 2f 0a 20 20 73 71 6c 69  quired */.  sqli
29450 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 75  te3_free(p);.  u
29460 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
29470 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
29480 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
29490 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74  tion is called t
294a0 6f 20 6f 62 74 61 69 6e 20 61 20 70 6f 69 6e 74  o obtain a point
294b0 65 72 20 74 6f 20 72 65 67 69 6f 6e 20 69 52 65  er to region iRe
294c0 67 69 6f 6e 20 6f 66 20 74 68 65 20 0a 2a 2a 20  gion of the .** 
294d0 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 61 73  shared-memory as
294e0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
294f0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
29500 66 64 2e 20 53 68 61 72 65 64 2d 6d 65 6d 6f 72  fd. Shared-memor
29510 79 20 72 65 67 69 6f 6e 73 20 0a 2a 2a 20 61 72  y regions .** ar
29520 65 20 6e 75 6d 62 65 72 65 64 20 73 74 61 72 74  e numbered start
29530 69 6e 67 20 66 72 6f 6d 20 7a 65 72 6f 2e 20 45  ing from zero. E
29540 61 63 68 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  ach shared-memor
29550 79 20 72 65 67 69 6f 6e 20 69 73 20 73 7a 52 65  y region is szRe
29560 67 69 6f 6e 20 0a 2a 2a 20 62 79 74 65 73 20 69  gion .** bytes i
29570 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  n size..**.** If
29580 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
29590 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  , an error code 
295a0 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
295b0 2a 70 70 20 69 73 20 73 65 74 20 74 6f 20 4e 55  *pp is set to NU
295c0 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77  LL..**.** Otherw
295d0 69 73 65 2c 20 69 66 20 74 68 65 20 62 45 78 74  ise, if the bExt
295e0 65 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 73  end parameter is
295f0 20 30 20 61 6e 64 20 74 68 65 20 72 65 71 75 65   0 and the reque
29600 73 74 65 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f  sted shared-memo
29610 72 79 0a 2a 2a 20 72 65 67 69 6f 6e 20 68 61 73  ry.** region has
29620 20 6e 6f 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61   not been alloca
29630 74 65 64 20 28 62 79 20 61 6e 79 20 63 6c 69 65  ted (by any clie
29640 6e 74 2c 20 69 6e 63 6c 75 64 69 6e 67 20 6f 6e  nt, including on
29650 65 20 72 75 6e 6e 69 6e 67 20 69 6e 20 61 0a 2a  e running in a.*
29660 2a 20 73 65 70 61 72 61 74 65 20 70 72 6f 63 65  * separate proce
29670 73 73 29 2c 20 74 68 65 6e 20 2a 70 70 20 69 73  ss), then *pp is
29680 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64   set to NULL and
29690 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
296a0 6e 65 64 2e 20 49 66 20 0a 2a 2a 20 62 45 78 74  ned. If .** bExt
296b0 65 6e 64 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20  end is non-zero 
296c0 61 6e 64 20 74 68 65 20 72 65 71 75 65 73 74 65  and the requeste
296d0 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  d shared-memory 
296e0 72 65 67 69 6f 6e 20 68 61 73 20 6e 6f 74 20 79  region has not y
296f0 65 74 20 0a 2a 2a 20 62 65 65 6e 20 61 6c 6c 6f  et .** been allo
29700 63 61 74 65 64 2c 20 69 74 20 69 73 20 61 6c 6c  cated, it is all
29710 6f 63 61 74 65 64 20 62 79 20 74 68 69 73 20 66  ocated by this f
29720 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49  unction..**.** I
29730 66 20 74 68 65 20 73 68 61 72 65 64 2d 6d 65 6d  f the shared-mem
29740 6f 72 79 20 72 65 67 69 6f 6e 20 68 61 73 20 61  ory region has a
29750 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f  lready been allo
29760 63 61 74 65 64 20 6f 72 20 69 73 20 61 6c 6c 6f  cated or is allo
29770 63 61 74 65 64 20 62 79 0a 2a 2a 20 74 68 69 73  cated by.** this
29780 20 63 61 6c 6c 20 61 73 20 64 65 73 63 72 69 62   call as describ
29790 65 64 20 61 62 6f 76 65 2c 20 74 68 65 6e 20 69  ed above, then i
297a0 74 20 69 73 20 6d 61 70 70 65 64 20 69 6e 74 6f  t is mapped into
297b0 20 74 68 69 73 20 70 72 6f 63 65 73 73 65 73 20   this processes 
297c0 0a 2a 2a 20 61 64 64 72 65 73 73 20 73 70 61 63  .** address spac
297d0 65 20 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20  e (if it is not 
297e0 61 6c 72 65 61 64 79 29 2c 20 2a 70 70 20 69 73  already), *pp is
297f0 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f   set to point to
29800 20 74 68 65 20 6d 61 70 70 65 64 20 0a 2a 2a 20   the mapped .** 
29810 6d 65 6d 6f 72 79 20 61 6e 64 20 53 51 4c 49 54  memory and SQLIT
29820 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a  E_OK returned..*
29830 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
29840 78 53 68 6d 4d 61 70 28 0a 20 20 73 71 6c 69 74  xShmMap(.  sqlit
29850 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20 20  e3_file *fd,    
29860 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61             /* Ha
29870 6e 64 6c 65 20 6f 70 65 6e 20 6f 6e 20 64 61 74  ndle open on dat
29880 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
29890 69 6e 74 20 69 52 65 67 69 6f 6e 2c 20 20 20 20  int iRegion,    
298a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
298b0 2f 2a 20 52 65 67 69 6f 6e 20 74 6f 20 72 65 74  /* Region to ret
298c0 72 69 65 76 65 20 2a 2f 0a 20 20 69 6e 74 20 73  rieve */.  int s
298d0 7a 52 65 67 69 6f 6e 2c 20 20 20 20 20 20 20 20  zRegion,        
298e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
298f0 7a 65 20 6f 66 20 72 65 67 69 6f 6e 73 20 2a 2f  ze of regions */
29900 0a 20 20 69 6e 74 20 62 45 78 74 65 6e 64 2c 20  .  int bExtend, 
29910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29920 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 78     /* True to ex
29930 74 65 6e 64 20 66 69 6c 65 20 69 66 20 6e 65 63  tend file if nec
29940 65 73 73 61 72 79 20 2a 2f 0a 20 20 76 6f 69 64  essary */.  void
29950 20 76 6f 6c 61 74 69 6c 65 20 2a 2a 70 70 20 20   volatile **pp  
29960 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
29970 55 54 3a 20 4d 61 70 70 65 64 20 6d 65 6d 6f 72  UT: Mapped memor
29980 79 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 46 69  y */.){.  unixFi
29990 6c 65 20 2a 70 44 62 46 64 20 3d 20 28 75 6e 69  le *pDbFd = (uni
299a0 78 46 69 6c 65 2a 29 66 64 3b 0a 20 20 75 6e 69  xFile*)fd;.  uni
299b0 78 53 68 6d 20 2a 70 3b 0a 20 20 75 6e 69 78 53  xShm *p;.  unixS
299c0 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65  hmNode *pShmNode
299d0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
299e0 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 53  ITE_OK;.  int nS
299f0 68 6d 50 65 72 4d 61 70 20 3d 20 75 6e 69 78 53  hmPerMap = unixS
29a00 68 6d 52 65 67 69 6f 6e 50 65 72 4d 61 70 28 29  hmRegionPerMap()
29a10 3b 0a 20 20 69 6e 74 20 6e 52 65 71 52 65 67 69  ;.  int nReqRegi
29a20 6f 6e 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  on;..  /* If the
29a30 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66   shared-memory f
29a40 69 6c 65 20 68 61 73 20 6e 6f 74 20 79 65 74 20  ile has not yet 
29a50 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20 6f 70 65  been opened, ope
29a60 6e 20 69 74 20 6e 6f 77 2e 20 2a 2f 0a 20 20 69  n it now. */.  i
29a70 66 28 20 70 44 62 46 64 2d 3e 70 53 68 6d 3d 3d  f( pDbFd->pShm==
29a80 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 75 6e  0 ){.    rc = un
29a90 69 78 4f 70 65 6e 53 68 61 72 65 64 4d 65 6d 6f  ixOpenSharedMemo
29aa0 72 79 28 70 44 62 46 64 29 3b 0a 20 20 20 20 69  ry(pDbFd);.    i
29ab0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
29ac0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
29ad0 7d 0a 0a 20 20 70 20 3d 20 70 44 62 46 64 2d 3e  }..  p = pDbFd->
29ae0 70 53 68 6d 3b 0a 20 20 70 53 68 6d 4e 6f 64 65  pShm;.  pShmNode
29af0 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a   = p->pShmNode;.
29b00 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
29b10 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e  enter(pShmNode->
29b20 6d 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74  mutex);.  assert
29b30 28 20 73 7a 52 65 67 69 6f 6e 3d 3d 70 53 68 6d  ( szRegion==pShm
29b40 4e 6f 64 65 2d 3e 73 7a 52 65 67 69 6f 6e 20 7c  Node->szRegion |
29b50 7c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67  | pShmNode->nReg
29b60 69 6f 6e 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  ion==0 );.  asse
29b70 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49  rt( pShmNode->pI
29b80 6e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e  node==pDbFd->pIn
29b90 6f 64 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ode );.  assert(
29ba0 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20   pShmNode->h>=0 
29bb0 7c 7c 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65  || pDbFd->pInode
29bc0 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d  ->bProcessLock==
29bd0 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  1 );.  assert( p
29be0 53 68 6d 4e 6f 64 65 2d 3e 68 3c 30 20 7c 7c 20  ShmNode->h<0 || 
29bf0 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62  pDbFd->pInode->b
29c00 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29  ProcessLock==0 )
29c10 3b 0a 0a 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20  ;..  /* Minimum 
29c20 6e 75 6d 62 65 72 20 6f 66 20 72 65 67 69 6f 6e  number of region
29c30 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 62 65  s required to be
29c40 20 6d 61 70 70 65 64 2e 20 2a 2f 0a 20 20 6e 52   mapped. */.  nR
29c50 65 71 52 65 67 69 6f 6e 20 3d 20 28 28 69 52 65  eqRegion = ((iRe
29c60 67 69 6f 6e 2b 6e 53 68 6d 50 65 72 4d 61 70 29  gion+nShmPerMap)
29c70 20 2f 20 6e 53 68 6d 50 65 72 4d 61 70 29 20 2a   / nShmPerMap) *
29c80 20 6e 53 68 6d 50 65 72 4d 61 70 3b 0a 0a 20 20   nShmPerMap;..  
29c90 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  if( pShmNode->nR
29ca0 65 67 69 6f 6e 3c 6e 52 65 71 52 65 67 69 6f 6e  egion<nReqRegion
29cb0 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 2a 61   ){.    char **a
29cc0 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20  pNew;           
29cd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
29ce0 77 20 61 70 52 65 67 69 6f 6e 5b 5d 20 61 72 72  w apRegion[] arr
29cf0 61 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42  ay */.    int nB
29d00 79 74 65 20 3d 20 6e 52 65 71 52 65 67 69 6f 6e  yte = nReqRegion
29d10 2a 73 7a 52 65 67 69 6f 6e 3b 20 20 20 2f 2a 20  *szRegion;   /* 
29d20 4d 69 6e 69 6d 75 6d 20 72 65 71 75 69 72 65 64  Minimum required
29d30 20 66 69 6c 65 20 73 69 7a 65 20 2a 2f 0a 20 20   file size */.  
29d40 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73 53    struct stat sS
29d50 74 61 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  tat;            
29d60 20 20 20 20 20 2f 2a 20 55 73 65 64 20 62 79 20       /* Used by 
29d70 66 73 74 61 74 28 29 20 2a 2f 0a 0a 20 20 20 20  fstat() */..    
29d80 70 53 68 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67 69  pShmNode->szRegi
29d90 6f 6e 20 3d 20 73 7a 52 65 67 69 6f 6e 3b 0a 0a  on = szRegion;..
29da0 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65      if( pShmNode
29db0 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  ->h>=0 ){.      
29dc0 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 65 64  /* The requested
29dd0 20 72 65 67 69 6f 6e 20 69 73 20 6e 6f 74 20 6d   region is not m
29de0 61 70 70 65 64 20 69 6e 74 6f 20 74 68 69 73 20  apped into this 
29df0 70 72 6f 63 65 73 73 65 73 20 61 64 64 72 65 73  processes addres
29e00 73 20 73 70 61 63 65 2e 0a 20 20 20 20 20 20 2a  s space..      *
29e10 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
29e20 66 20 69 74 20 68 61 73 20 62 65 65 6e 20 61 6c  f it has been al
29e30 6c 6f 63 61 74 65 64 20 28 69 2e 65 2e 20 69 66  located (i.e. if
29e40 20 74 68 65 20 77 61 6c 2d 69 6e 64 65 78 20 66   the wal-index f
29e50 69 6c 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20  ile is.      ** 
29e60 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 74 6f 20  large enough to 
29e70 63 6f 6e 74 61 69 6e 20 74 68 65 20 72 65 71 75  contain the requ
29e80 65 73 74 65 64 20 72 65 67 69 6f 6e 29 2e 0a 20  ested region).. 
29e90 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
29ea0 28 20 6f 73 46 73 74 61 74 28 70 53 68 6d 4e 6f  ( osFstat(pShmNo
29eb0 64 65 2d 3e 68 2c 20 26 73 53 74 61 74 29 20 29  de->h, &sStat) )
29ec0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
29ed0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53  QLITE_IOERR_SHMS
29ee0 49 5a 45 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  IZE;.        got
29ef0 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20  o shmpage_out;. 
29f00 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20       }.  .      
29f10 69 66 28 20 73 53 74 61 74 2e 73 74 5f 73 69 7a  if( sStat.st_siz
29f20 65 3c 6e 42 79 74 65 20 29 7b 0a 20 20 20 20 20  e<nByte ){.     
29f30 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73     /* The reques
29f40 74 65 64 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f  ted memory regio
29f50 6e 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  n does not exist
29f60 2e 20 49 66 20 62 45 78 74 65 6e 64 20 69 73 20  . If bExtend is 
29f70 73 65 74 20 74 6f 0a 20 20 20 20 20 20 20 20 2a  set to.        *
29f80 2a 20 66 61 6c 73 65 2c 20 65 78 69 74 20 65 61  * false, exit ea
29f90 72 6c 79 2e 20 2a 70 70 20 77 69 6c 6c 20 62 65  rly. *pp will be
29fa0 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64   set to NULL and
29fb0 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
29fc0 6e 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ned..        */.
29fd0 20 20 20 20 20 20 20 20 69 66 28 20 21 62 45 78          if( !bEx
29fe0 74 65 6e 64 20 29 7b 0a 20 20 20 20 20 20 20 20  tend ){.        
29ff0 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f    goto shmpage_o
2a000 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  ut;.        }.. 
2a010 20 20 20 20 20 20 20 2f 2a 20 41 6c 74 65 72 6e         /* Altern
2a020 61 74 69 76 65 6c 79 2c 20 69 66 20 62 45 78 74  atively, if bExt
2a030 65 6e 64 20 69 73 20 74 72 75 65 2c 20 65 78 74  end is true, ext
2a040 65 6e 64 20 74 68 65 20 66 69 6c 65 2e 20 44 6f  end the file. Do
2a050 20 74 68 69 73 20 62 79 0a 20 20 20 20 20 20 20   this by.       
2a060 20 2a 2a 20 77 72 69 74 69 6e 67 20 61 20 73 69   ** writing a si
2a070 6e 67 6c 65 20 62 79 74 65 20 74 6f 20 74 68 65  ngle byte to the
2a080 20 65 6e 64 20 6f 66 20 65 61 63 68 20 28 4f 53   end of each (OS
2a090 29 20 70 61 67 65 20 62 65 69 6e 67 0a 20 20 20  ) page being.   
2a0a0 20 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65       ** allocate
2a0b0 64 20 6f 72 20 65 78 74 65 6e 64 65 64 2e 20 54  d or extended. T
2a0c0 65 63 68 6e 69 63 61 6c 6c 79 2c 20 77 65 20 6e  echnically, we n
2a0d0 65 65 64 20 6f 6e 6c 79 20 77 72 69 74 65 20 74  eed only write t
2a0e0 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  o the.        **
2a0f0 20 6c 61 73 74 20 70 61 67 65 20 69 6e 20 6f 72   last page in or
2a100 64 65 72 20 74 6f 20 65 78 74 65 6e 64 20 74 68  der to extend th
2a110 65 20 66 69 6c 65 2e 20 42 75 74 20 77 72 69 74  e file. But writ
2a120 69 6e 67 20 74 6f 20 61 6c 6c 20 6e 65 77 0a 20  ing to all new. 
2a130 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 73 20         ** pages 
2a140 66 6f 72 63 65 73 20 74 68 65 20 4f 53 20 74 6f  forces the OS to
2a150 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 6d 20 69   allocate them i
2a160 6d 6d 65 64 69 61 74 65 6c 79 2c 20 77 68 69 63  mmediately, whic
2a170 68 20 72 65 64 75 63 65 73 0a 20 20 20 20 20 20  h reduces.      
2a180 20 20 2a 2a 20 74 68 65 20 63 68 61 6e 63 65 73    ** the chances
2a190 20 6f 66 20 53 49 47 42 55 53 20 77 68 69 6c 65   of SIGBUS while
2a1a0 20 61 63 63 65 73 73 69 6e 67 20 74 68 65 20 6d   accessing the m
2a1b0 61 70 70 65 64 20 72 65 67 69 6f 6e 20 6c 61 74  apped region lat
2a1c0 65 72 20 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a  er on..        *
2a1d0 2f 0a 20 20 20 20 20 20 20 20 65 6c 73 65 7b 0a  /.        else{.
2a1e0 20 20 20 20 20 20 20 20 20 20 73 74 61 74 69 63            static
2a1f0 20 63 6f 6e 73 74 20 69 6e 74 20 70 67 73 7a 20   const int pgsz 
2a200 3d 20 34 30 39 36 3b 0a 20 20 20 20 20 20 20 20  = 4096;.        
2a210 20 20 69 6e 74 20 69 50 67 3b 0a 0a 20 20 20 20    int iPg;..    
2a220 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
2a230 6f 20 74 68 65 20 6c 61 73 74 20 62 79 74 65 20  o the last byte 
2a240 6f 66 20 65 61 63 68 20 6e 65 77 6c 79 20 61 6c  of each newly al
2a250 6c 6f 63 61 74 65 64 20 6f 72 20 65 78 74 65 6e  located or exten
2a260 64 65 64 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  ded page */.    
2a270 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 6e        assert( (n
2a280 42 79 74 65 20 25 20 70 67 73 7a 29 3d 3d 30 20  Byte % pgsz)==0 
2a290 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  );.          for
2a2a0 28 69 50 67 3d 28 73 53 74 61 74 2e 73 74 5f 73  (iPg=(sStat.st_s
2a2b0 69 7a 65 2f 70 67 73 7a 29 3b 20 69 50 67 3c 28  ize/pgsz); iPg<(
2a2c0 6e 42 79 74 65 2f 70 67 73 7a 29 3b 20 69 50 67  nByte/pgsz); iPg
2a2d0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
2a2e0 20 69 66 28 20 73 65 65 6b 41 6e 64 57 72 69 74   if( seekAndWrit
2a2f0 65 46 64 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c  eFd(pShmNode->h,
2a300 20 69 50 67 2a 70 67 73 7a 20 2b 20 70 67 73 7a   iPg*pgsz + pgsz
2a310 2d 31 2c 20 22 22 2c 20 31 2c 20 30 29 21 3d 31  -1, "", 1, 0)!=1
2a320 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2a330 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
2a340 69 6c 65 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e  ile = pShmNode->
2a350 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 20  zFilename;.     
2a360 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e           rc = un
2a370 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  ixLogError(SQLIT
2a380 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45 2c  E_IOERR_SHMSIZE,
2a390 20 22 77 72 69 74 65 22 2c 20 7a 46 69 6c 65 29   "write", zFile)
2a3a0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2a3b0 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74  goto shmpage_out
2a3c0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
2a3d0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2a3e0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
2a3f0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 70 20    }..    /* Map 
2a400 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6d 65  the requested me
2a410 6d 6f 72 79 20 72 65 67 69 6f 6e 20 69 6e 74 6f  mory region into
2a420 20 74 68 69 73 20 70 72 6f 63 65 73 73 65 73 20   this processes 
2a430 61 64 64 72 65 73 73 20 73 70 61 63 65 2e 20 2a  address space. *
2a440 2f 0a 20 20 20 20 61 70 4e 65 77 20 3d 20 28 63  /.    apNew = (c
2a450 68 61 72 20 2a 2a 29 73 71 6c 69 74 65 33 5f 72  har **)sqlite3_r
2a460 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20 20  ealloc(.        
2a470 70 53 68 6d 4e 6f 64 65 2d 3e 61 70 52 65 67 69  pShmNode->apRegi
2a480 6f 6e 2c 20 6e 52 65 71 52 65 67 69 6f 6e 2a 73  on, nReqRegion*s
2a490 69 7a 65 6f 66 28 63 68 61 72 20 2a 29 0a 20 20  izeof(char *).  
2a4a0 20 20 29 3b 0a 20 20 20 20 69 66 28 20 21 61 70    );.    if( !ap
2a4b0 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 72 63 20  New ){.      rc 
2a4c0 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  = SQLITE_IOERR_N
2a4d0 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f  OMEM;.      goto
2a4e0 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20   shmpage_out;.  
2a4f0 20 20 7d 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65    }.    pShmNode
2a500 2d 3e 61 70 52 65 67 69 6f 6e 20 3d 20 61 70 4e  ->apRegion = apN
2a510 65 77 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70  ew;.    while( p
2a520 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e  ShmNode->nRegion
2a530 3c 6e 52 65 71 52 65 67 69 6f 6e 20 29 7b 0a 20  <nReqRegion ){. 
2a540 20 20 20 20 20 69 6e 74 20 6e 4d 61 70 20 3d 20       int nMap = 
2a550 73 7a 52 65 67 69 6f 6e 2a 6e 53 68 6d 50 65 72  szRegion*nShmPer
2a560 4d 61 70 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  Map;.      int i
2a570 3b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70 4d  ;.      void *pM
2a580 65 6d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53  em;.      if( pS
2a590 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 29 7b 0a  hmNode->h>=0 ){.
2a5a0 20 20 20 20 20 20 20 20 70 4d 65 6d 20 3d 20 6f          pMem = o
2a5b0 73 4d 6d 61 70 28 30 2c 20 6e 4d 61 70 2c 0a 20  sMmap(0, nMap,. 
2a5c0 20 20 20 20 20 20 20 20 20 20 20 70 53 68 6d 4e             pShmN
2a5d0 6f 64 65 2d 3e 69 73 52 65 61 64 6f 6e 6c 79 20  ode->isReadonly 
2a5e0 3f 20 50 52 4f 54 5f 52 45 41 44 20 3a 20 50 52  ? PROT_READ : PR
2a5f0 4f 54 5f 52 45 41 44 7c 50 52 4f 54 5f 57 52 49  OT_READ|PROT_WRI
2a600 54 45 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  TE, .           
2a610 20 4d 41 50 5f 53 48 41 52 45 44 2c 20 70 53 68   MAP_SHARED, pSh
2a620 6d 4e 6f 64 65 2d 3e 68 2c 20 73 7a 52 65 67 69  mNode->h, szRegi
2a630 6f 6e 2a 28 69 36 34 29 70 53 68 6d 4e 6f 64 65  on*(i64)pShmNode
2a640 2d 3e 6e 52 65 67 69 6f 6e 0a 20 20 20 20 20 20  ->nRegion.      
2a650 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28    );.        if(
2a660 20 70 4d 65 6d 3d 3d 4d 41 50 5f 46 41 49 4c 45   pMem==MAP_FAILE
2a670 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  D ){.          r
2a680 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72  c = unixLogError
2a690 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48  (SQLITE_IOERR_SH
2a6a0 4d 4d 41 50 2c 20 22 6d 6d 61 70 22 2c 20 70 53  MMAP, "mmap", pS
2a6b0 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d  hmNode->zFilenam
2a6c0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  e);.          go
2a6d0 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a  to shmpage_out;.
2a6e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2a6f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
2a700 4d 65 6d 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  Mem = sqlite3_ma
2a710 6c 6c 6f 63 28 73 7a 52 65 67 69 6f 6e 29 3b 0a  lloc(szRegion);.
2a720 20 20 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d          if( pMem
2a730 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
2a740 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
2a750 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  EM;.          go
2a760 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a  to shmpage_out;.
2a770 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2a780 20 20 6d 65 6d 73 65 74 28 70 4d 65 6d 2c 20 30    memset(pMem, 0
2a790 2c 20 73 7a 52 65 67 69 6f 6e 29 3b 0a 20 20 20  , szRegion);.   
2a7a0 20 20 20 7d 0a 0a 20 20 20 20 20 20 66 6f 72 28     }..      for(
2a7b0 69 3d 30 3b 20 69 3c 6e 53 68 6d 50 65 72 4d 61  i=0; i<nShmPerMa
2a7c0 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  p; i++){.       
2a7d0 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 70 52 65 67   pShmNode->apReg
2a7e0 69 6f 6e 5b 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  ion[pShmNode->nR
2a7f0 65 67 69 6f 6e 2b 69 5d 20 3d 20 26 28 28 63 68  egion+i] = &((ch
2a800 61 72 2a 29 70 4d 65 6d 29 5b 73 7a 52 65 67 69  ar*)pMem)[szRegi
2a810 6f 6e 2a 69 5d 3b 0a 20 20 20 20 20 20 7d 0a 20  on*i];.      }. 
2a820 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e       pShmNode->n
2a830 52 65 67 69 6f 6e 20 2b 3d 20 6e 53 68 6d 50 65  Region += nShmPe
2a840 72 4d 61 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rMap;.    }.  }.
2a850 0a 73 68 6d 70 61 67 65 5f 6f 75 74 3a 0a 20 20  .shmpage_out:.  
2a860 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  if( pShmNode->nR
2a870 65 67 69 6f 6e 3e 69 52 65 67 69 6f 6e 20 29 7b  egion>iRegion ){
2a880 0a 20 20 20 20 2a 70 70 20 3d 20 70 53 68 6d 4e  .    *pp = pShmN
2a890 6f 64 65 2d 3e 61 70 52 65 67 69 6f 6e 5b 69 52  ode->apRegion[iR
2a8a0 65 67 69 6f 6e 5d 3b 0a 20 20 7d 65 6c 73 65 7b  egion];.  }else{
2a8b0 0a 20 20 20 20 2a 70 70 20 3d 20 30 3b 0a 20 20  .    *pp = 0;.  
2a8c0 7d 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65  }.  if( pShmNode
2a8d0 2d 3e 69 73 52 65 61 64 6f 6e 6c 79 20 26 26 20  ->isReadonly && 
2a8e0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc==SQLITE_OK ) 
2a8f0 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44  rc = SQLITE_READ
2a900 4f 4e 4c 59 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ONLY;.  sqlite3_
2a910 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d  mutex_leave(pShm
2a920 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  Node->mutex);.  
2a930 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2a940 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6c  .** Change the l
2a950 6f 63 6b 20 73 74 61 74 65 20 66 6f 72 20 61 20  ock state for a 
2a960 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 73 65  shared-memory se
2a970 67 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74  gment..**.** Not
2a980 65 20 74 68 61 74 20 74 68 65 20 72 65 6c 61 74  e that the relat
2a990 69 6f 6e 73 68 69 70 20 62 65 74 77 65 65 6e 20  ionship between 
2a9a0 53 48 41 52 45 64 20 61 6e 64 20 45 58 43 4c 55  SHAREd and EXCLU
2a9b0 53 49 56 45 20 6c 6f 63 6b 73 20 69 73 20 61 20  SIVE locks is a 
2a9c0 6c 69 74 74 6c 65 0a 2a 2a 20 64 69 66 66 65 72  little.** differ
2a9d0 65 6e 74 20 68 65 72 65 20 74 68 61 6e 20 69 6e  ent here than in
2a9e0 20 70 6f 73 69 78 2e 20 20 49 6e 20 78 53 68 6d   posix.  In xShm
2a9f0 4c 6f 63 6b 28 29 2c 20 6f 6e 65 20 63 61 6e 20  Lock(), one can 
2aa00 67 6f 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64  go from unlocked
2aa10 0a 2a 2a 20 74 6f 20 73 68 61 72 65 64 20 61 6e  .** to shared an
2aa20 64 20 62 61 63 6b 20 6f 72 20 66 72 6f 6d 20 75  d back or from u
2aa30 6e 6c 6f 63 6b 65 64 20 74 6f 20 65 78 63 6c 75  nlocked to exclu
2aa40 73 69 76 65 20 61 6e 64 20 62 61 63 6b 2e 20 20  sive and back.  
2aa50 42 75 74 20 6f 6e 65 20 6d 61 79 0a 2a 2a 20 6e  But one may.** n
2aa60 6f 74 20 67 6f 20 66 72 6f 6d 20 73 68 61 72 65  ot go from share
2aa70 64 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20 6f  d to exclusive o
2aa80 72 20 66 72 6f 6d 20 65 78 63 6c 75 73 69 76 65  r from exclusive
2aa90 20 74 6f 20 73 68 61 72 65 64 2e 0a 2a 2f 0a 73   to shared..*/.s
2aaa0 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 68  tatic int unixSh
2aab0 6d 4c 6f 63 6b 28 0a 20 20 73 71 6c 69 74 65 33  mLock(.  sqlite3
2aac0 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20 20 20 20  _file *fd,      
2aad0 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
2aae0 66 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68 65  file holding the
2aaf0 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a   shared memory *
2ab00 2f 0a 20 20 69 6e 74 20 6f 66 73 74 2c 20 20 20  /.  int ofst,   
2ab10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2ab20 2a 20 46 69 72 73 74 20 6c 6f 63 6b 20 74 6f 20  * First lock to 
2ab30 61 63 71 75 69 72 65 20 6f 72 20 72 65 6c 65 61  acquire or relea
2ab40 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 2c 20 20  se */.  int n,  
2ab50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ab60 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2ab70 6c 6f 63 6b 73 20 74 6f 20 61 63 71 75 69 72 65  locks to acquire
2ab80 20 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a 20   or release */. 
2ab90 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20   int flags      
2aba0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
2abb0 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20 74  hat to do with t
2abc0 68 65 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20  he lock */.){.  
2abd0 75 6e 69 78 46 69 6c 65 20 2a 70 44 62 46 64 20  unixFile *pDbFd 
2abe0 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 66 64 3b  = (unixFile*)fd;
2abf0 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74        /* Connect
2ac00 69 6f 6e 20 68 6f 6c 64 69 6e 67 20 73 68 61 72  ion holding shar
2ac10 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 75  ed memory */.  u
2ac20 6e 69 78 53 68 6d 20 2a 70 20 3d 20 70 44 62 46  nixShm *p = pDbF
2ac30 64 2d 3e 70 53 68 6d 3b 20 20 20 20 20 20 20 20  d->pShm;        
2ac40 20 20 20 20 20 2f 2a 20 54 68 65 20 73 68 61 72       /* The shar
2ac50 65 64 20 6d 65 6d 6f 72 79 20 62 65 69 6e 67 20  ed memory being 
2ac60 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 6e 69 78  locked */.  unix
2ac70 53 68 6d 20 2a 70 58 3b 20 20 20 20 20 20 20 20  Shm *pX;        
2ac80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ac90 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67    /* For looping
2aca0 20 6f 76 65 72 20 61 6c 6c 20 73 69 62 6c 69 6e   over all siblin
2acb0 67 73 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 4e  gs */.  unixShmN
2acc0 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 20 3d 20  ode *pShmNode = 
2acd0 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 20 20 2f 2a  p->pShmNode;  /*
2ace0 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   The underlying 
2acf0 66 69 6c 65 20 69 4e 6f 64 65 20 2a 2f 0a 20 20  file iNode */.  
2ad00 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
2ad10 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
2ad20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
2ad30 63 6f 64 65 20 2a 2f 0a 20 20 75 31 36 20 6d 61  code */.  u16 ma
2ad40 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  sk;             
2ad50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ad60 2f 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b 73  /* Mask of locks
2ad70 20 74 6f 20 74 61 6b 65 20 6f 72 20 72 65 6c 65   to take or rele
2ad80 61 73 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ase */..  assert
2ad90 28 20 70 53 68 6d 4e 6f 64 65 3d 3d 70 44 62 46  ( pShmNode==pDbF
2ada0 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e  d->pInode->pShmN
2adb0 6f 64 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ode );.  assert(
2adc0 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64   pShmNode->pInod
2add0 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65  e==pDbFd->pInode
2ade0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66   );.  assert( of
2adf0 73 74 3e 3d 30 20 26 26 20 6f 66 73 74 2b 6e 3c  st>=0 && ofst+n<
2ae00 3d 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43  =SQLITE_SHM_NLOC
2ae10 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  K );.  assert( n
2ae20 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  >=1 );.  assert(
2ae30 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f   flags==(SQLITE_
2ae40 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49 54  SHM_LOCK | SQLIT
2ae50 45 5f 53 48 4d 5f 53 48 41 52 45 44 29 0a 20 20  E_SHM_SHARED).  
2ae60 20 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28       || flags==(
2ae70 53 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20  SQLITE_SHM_LOCK 
2ae80 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43  | SQLITE_SHM_EXC
2ae90 4c 55 53 49 56 45 29 0a 20 20 20 20 20 20 20 7c  LUSIVE).       |
2aea0 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45  | flags==(SQLITE
2aeb0 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51  _SHM_UNLOCK | SQ
2aec0 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 29  LITE_SHM_SHARED)
2aed0 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c 61 67 73  .       || flags
2aee0 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e  ==(SQLITE_SHM_UN
2aef0 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48  LOCK | SQLITE_SH
2af00 4d 5f 45 58 43 4c 55 53 49 56 45 29 20 29 3b 0a  M_EXCLUSIVE) );.
2af10 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 31 20 7c    assert( n==1 |
2af20 7c 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  | (flags & SQLIT
2af30 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29  E_SHM_EXCLUSIVE)
2af40 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
2af50 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20   pShmNode->h>=0 
2af60 7c 7c 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65  || pDbFd->pInode
2af70 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d  ->bProcessLock==
2af80 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  1 );.  assert( p
2af90 53 68 6d 4e 6f 64 65 2d 3e 68 3c 30 20 7c 7c 20  ShmNode->h<0 || 
2afa0 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62  pDbFd->pInode->b
2afb0 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29  ProcessLock==0 )
2afc0 3b 0a 0a 20 20 6d 61 73 6b 20 3d 20 28 31 3c 3c  ;..  mask = (1<<
2afd0 28 6f 66 73 74 2b 6e 29 29 20 2d 20 28 31 3c 3c  (ofst+n)) - (1<<
2afe0 6f 66 73 74 29 3b 0a 20 20 61 73 73 65 72 74 28  ofst);.  assert(
2aff0 20 6e 3e 31 20 7c 7c 20 6d 61 73 6b 3d 3d 28 31   n>1 || mask==(1
2b000 3c 3c 6f 66 73 74 29 20 29 3b 0a 20 20 73 71 6c  <<ofst) );.  sql
2b010 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
2b020 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78  (pShmNode->mutex
2b030 29 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 20 26  );.  if( flags &
2b040 20 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f   SQLITE_SHM_UNLO
2b050 43 4b 20 29 7b 0a 20 20 20 20 75 31 36 20 61 6c  CK ){.    u16 al
2b060 6c 4d 61 73 6b 20 3d 20 30 3b 20 2f 2a 20 4d 61  lMask = 0; /* Ma
2b070 73 6b 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64  sk of locks held
2b080 20 62 79 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a   by siblings */.
2b090 0a 20 20 20 20 2f 2a 20 53 65 65 20 69 66 20 61  .    /* See if a
2b0a0 6e 79 20 73 69 62 6c 69 6e 67 73 20 68 6f 6c 64  ny siblings hold
2b0b0 20 74 68 69 73 20 73 61 6d 65 20 6c 6f 63 6b 20   this same lock 
2b0c0 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53  */.    for(pX=pS
2b0d0 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20  hmNode->pFirst; 
2b0e0 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74  pX; pX=pX->pNext
2b0f0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 58 3d  ){.      if( pX=
2b100 3d 70 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =p ) continue;. 
2b110 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 58       assert( (pX
2b120 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20 28 70 2d  ->exclMask & (p-
2b130 3e 65 78 63 6c 4d 61 73 6b 7c 70 2d 3e 73 68 61  >exclMask|p->sha
2b140 72 65 64 4d 61 73 6b 29 29 3d 3d 30 20 29 3b 0a  redMask))==0 );.
2b150 20 20 20 20 20 20 61 6c 6c 4d 61 73 6b 20 7c 3d        allMask |=
2b160 20 70 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b 3b   pX->sharedMask;
2b170 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55  .    }..    /* U
2b180 6e 6c 6f 63 6b 20 74 68 65 20 73 79 73 74 65 6d  nlock the system
2b190 2d 6c 65 76 65 6c 20 6c 6f 63 6b 73 20 2a 2f 0a  -level locks */.
2b1a0 20 20 20 20 69 66 28 20 28 6d 61 73 6b 20 26 20      if( (mask & 
2b1b0 61 6c 6c 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20  allMask)==0 ){. 
2b1c0 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 53 68       rc = unixSh
2b1d0 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d  mSystemLock(pShm
2b1e0 4e 6f 64 65 2c 20 46 5f 55 4e 4c 43 4b 2c 20 6f  Node, F_UNLCK, o
2b1f0 66 73 74 2b 55 4e 49 58 5f 53 48 4d 5f 42 41 53  fst+UNIX_SHM_BAS
2b200 45 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65  E, n);.    }else
2b210 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
2b220 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20  ITE_OK;.    }.. 
2b230 20 20 20 2f 2a 20 55 6e 64 6f 20 74 68 65 20 6c     /* Undo the l
2b240 6f 63 61 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20  ocal locks */.  
2b250 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2b260 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  _OK ){.      p->
2b270 65 78 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61 73  exclMask &= ~mas
2b280 6b 3b 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72  k;.      p->shar
2b290 65 64 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b  edMask &= ~mask;
2b2a0 0a 20 20 20 20 7d 20 0a 20 20 7d 65 6c 73 65 20  .    } .  }else 
2b2b0 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49  if( flags & SQLI
2b2c0 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 20 29 7b  TE_SHM_SHARED ){
2b2d0 0a 20 20 20 20 75 31 36 20 61 6c 6c 53 68 61 72  .    u16 allShar
2b2e0 65 64 20 3d 20 30 3b 20 20 2f 2a 20 55 6e 69 6f  ed = 0;  /* Unio
2b2f0 6e 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20  n of locks held 
2b300 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f  by connections o
2b310 74 68 65 72 20 74 68 61 6e 20 22 70 22 20 2a 2f  ther than "p" */
2b320 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20 6f 75  ..    /* Find ou
2b330 74 20 77 68 69 63 68 20 73 68 61 72 65 64 20 6c  t which shared l
2b340 6f 63 6b 73 20 61 72 65 20 61 6c 72 65 61 64 79  ocks are already
2b350 20 68 65 6c 64 20 62 79 20 73 69 62 6c 69 6e 67   held by sibling
2b360 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0a 20 20   connections..  
2b370 20 20 2a 2a 20 49 66 20 61 6e 79 20 73 69 62 6c    ** If any sibl
2b380 69 6e 67 20 61 6c 72 65 61 64 79 20 68 6f 6c 64  ing already hold
2b390 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  s an exclusive l
2b3a0 6f 63 6b 2c 20 67 6f 20 61 68 65 61 64 20 61 6e  ock, go ahead an
2b3b0 64 20 72 65 74 75 72 6e 0a 20 20 20 20 2a 2a 20  d return.    ** 
2b3c0 53 51 4c 49 54 45 5f 42 55 53 59 2e 0a 20 20 20  SQLITE_BUSY..   
2b3d0 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d 70   */.    for(pX=p
2b3e0 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b  ShmNode->pFirst;
2b3f0 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78   pX; pX=pX->pNex
2b400 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70  t){.      if( (p
2b410 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20 6d 61  X->exclMask & ma
2b420 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  sk)!=0 ){.      
2b430 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
2b440 53 59 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  SY;.        brea
2b450 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
2b460 20 61 6c 6c 53 68 61 72 65 64 20 7c 3d 20 70 58   allShared |= pX
2b470 2d 3e 73 68 61 72 65 64 4d 61 73 6b 3b 0a 20 20  ->sharedMask;.  
2b480 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20    }..    /* Get 
2b490 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 61 74 20  shared locks at 
2b4a0 74 68 65 20 73 79 73 74 65 6d 20 6c 65 76 65 6c  the system level
2b4b0 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79 20 2a  , if necessary *
2b4c0 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
2b4d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2b4e0 20 69 66 28 20 28 61 6c 6c 53 68 61 72 65 64 20   if( (allShared 
2b4f0 26 20 6d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20  & mask)==0 ){.  
2b500 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 53        rc = unixS
2b510 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 53 68  hmSystemLock(pSh
2b520 6d 4e 6f 64 65 2c 20 46 5f 52 44 4c 43 4b 2c 20  mNode, F_RDLCK, 
2b530 6f 66 73 74 2b 55 4e 49 58 5f 53 48 4d 5f 42 41  ofst+UNIX_SHM_BA
2b540 53 45 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d 65  SE, n);.      }e
2b550 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20  lse{.        rc 
2b560 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
2b570 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
2b580 2f 2a 20 47 65 74 20 74 68 65 20 6c 6f 63 61 6c  /* Get the local
2b590 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 2a 2f   shared locks */
2b5a0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
2b5b0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2b5c0 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 7c 3d  p->sharedMask |=
2b5d0 20 6d 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d   mask;.    }.  }
2b5e0 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4d 61 6b  else{.    /* Mak
2b5f0 65 20 73 75 72 65 20 6e 6f 20 73 69 62 6c 69 6e  e sure no siblin
2b600 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 68 6f  g connections ho
2b610 6c 64 20 6c 6f 63 6b 73 20 74 68 61 74 20 77 69  ld locks that wi
2b620 6c 6c 20 62 6c 6f 63 6b 20 74 68 69 73 0a 20 20  ll block this.  
2b630 20 20 2a 2a 20 6c 6f 63 6b 2e 20 20 49 66 20 61    ** lock.  If a
2b640 6e 79 20 64 6f 2c 20 72 65 74 75 72 6e 20 53 51  ny do, return SQ
2b650 4c 49 54 45 5f 42 55 53 59 20 72 69 67 68 74 20  LITE_BUSY right 
2b660 61 77 61 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  away..    */.   
2b670 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65   for(pX=pShmNode
2b680 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20 70 58  ->pFirst; pX; pX
2b690 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  =pX->pNext){.   
2b6a0 20 20 20 69 66 28 20 28 70 58 2d 3e 65 78 63 6c     if( (pX->excl
2b6b0 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20  Mask & mask)!=0 
2b6c0 7c 7c 20 28 70 58 2d 3e 73 68 61 72 65 64 4d 61  || (pX->sharedMa
2b6d0 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20 29 7b  sk & mask)!=0 ){
2b6e0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
2b6f0 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20  LITE_BUSY;.     
2b700 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
2b710 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  }.    }.  .    /
2b720 2a 20 47 65 74 20 74 68 65 20 65 78 63 6c 75 73  * Get the exclus
2b730 69 76 65 20 6c 6f 63 6b 73 20 61 74 20 74 68 65  ive locks at the
2b740 20 73 79 73 74 65 6d 20 6c 65 76 65 6c 2e 20 20   system level.  
2b750 54 68 65 6e 20 69 66 20 73 75 63 63 65 73 73 66  Then if successf
2b760 75 6c 0a 20 20 20 20 2a 2a 20 61 6c 73 6f 20 6d  ul.    ** also m
2b770 61 72 6b 20 74 68 65 20 6c 6f 63 61 6c 20 63 6f  ark the local co
2b780 6e 6e 65 63 74 69 6f 6e 20 61 73 20 62 65 69 6e  nnection as bein
2b790 67 20 6c 6f 63 6b 65 64 2e 0a 20 20 20 20 2a 2f  g locked..    */
2b7a0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
2b7b0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2b7c0 72 63 20 3d 20 75 6e 69 78 53 68 6d 53 79 73 74  rc = unixShmSyst
2b7d0 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c  emLock(pShmNode,
2b7e0 20 46 5f 57 52 4c 43 4b 2c 20 6f 66 73 74 2b 55   F_WRLCK, ofst+U
2b7f0 4e 49 58 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29  NIX_SHM_BASE, n)
2b800 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
2b810 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2b820 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70 2d       assert( (p-
2b830 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 20 6d 61  >sharedMask & ma
2b840 73 6b 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  sk)==0 );.      
2b850 20 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 20 7c 3d    p->exclMask |=
2b860 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20 7d 0a 20   mask;.      }. 
2b870 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
2b880 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70  e3_mutex_leave(p
2b890 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b  ShmNode->mutex);
2b8a0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d  .  OSTRACE(("SHM
2b8b0 2d 4c 4f 43 4b 20 73 68 6d 69 64 2d 25 64 2c 20  -LOCK shmid-%d, 
2b8c0 70 69 64 2d 25 64 20 67 6f 74 20 25 30 33 78 2c  pid-%d got %03x,
2b8d0 25 30 33 78 5c 6e 22 2c 0a 20 20 20 20 20 20 20  %03x\n",.       
2b8e0 20 20 20 20 70 2d 3e 69 64 2c 20 67 65 74 70 69      p->id, getpi
2b8f0 64 28 29 2c 20 70 2d 3e 73 68 61 72 65 64 4d 61  d(), p->sharedMa
2b900 73 6b 2c 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 29  sk, p->exclMask)
2b910 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
2b920 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  }../*.** Impleme
2b930 6e 74 20 61 20 6d 65 6d 6f 72 79 20 62 61 72 72  nt a memory barr
2b940 69 65 72 20 6f 72 20 6d 65 6d 6f 72 79 20 66 65  ier or memory fe
2b950 6e 63 65 20 6f 6e 20 73 68 61 72 65 64 20 6d 65  nce on shared me
2b960 6d 6f 72 79 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 6c  mory.  .**.** Al
2b970 6c 20 6c 6f 61 64 73 20 61 6e 64 20 73 74 6f 72  l loads and stor
2b980 65 73 20 62 65 67 75 6e 20 62 65 66 6f 72 65 20  es begun before 
2b990 74 68 65 20 62 61 72 72 69 65 72 20 6d 75 73 74  the barrier must
2b9a0 20 63 6f 6d 70 6c 65 74 65 20 62 65 66 6f 72 65   complete before
2b9b0 0a 2a 2a 20 61 6e 79 20 6c 6f 61 64 20 6f 72 20  .** any load or 
2b9c0 73 74 6f 72 65 20 62 65 67 75 6e 20 61 66 74 65  store begun afte
2b9d0 72 20 74 68 65 20 62 61 72 72 69 65 72 2e 0a 2a  r the barrier..*
2b9e0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e  /.static void un
2b9f0 69 78 53 68 6d 42 61 72 72 69 65 72 28 0a 20 20  ixShmBarrier(.  
2ba00 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
2ba10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ba20 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c 65  /* Database file
2ba30 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 68 61   holding the sha
2ba40 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 29 7b  red memory */.){
2ba50 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
2ba60 54 45 52 28 66 64 29 3b 0a 20 20 75 6e 69 78 45  TER(fd);.  unixE
2ba70 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 75  nterMutex();.  u
2ba80 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
2ba90 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
2baa0 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  a connection to 
2bab0 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 2e 20 20  shared-memory.  
2bac0 44 65 6c 65 74 65 20 74 68 65 20 75 6e 64 65 72  Delete the under
2bad0 6c 79 69 6e 67 20 0a 2a 2a 20 73 74 6f 72 61 67  lying .** storag
2bae0 65 20 69 66 20 64 65 6c 65 74 65 46 6c 61 67 20  e if deleteFlag 
2baf0 69 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 49  is true..**.** I
2bb00 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 73 68  f there is no sh
2bb10 61 72 65 64 20 6d 65 6d 6f 72 79 20 61 73 73 6f  ared memory asso
2bb20 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
2bb30 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 68 65 6e 20  connection then 
2bb40 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  this.** routine 
2bb50 69 73 20 61 20 68 61 72 6d 6c 65 73 73 20 6e 6f  is a harmless no
2bb60 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  -op..*/.static i
2bb70 6e 74 20 75 6e 69 78 53 68 6d 55 6e 6d 61 70 28  nt unixShmUnmap(
2bb80 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
2bb90 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  *fd,            
2bba0 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c     /* The underl
2bbb0 79 69 6e 67 20 64 61 74 61 62 61 73 65 20 66 69  ying database fi
2bbc0 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 64 65 6c 65  le */.  int dele
2bbd0 74 65 46 6c 61 67 20 20 20 20 20 20 20 20 20 20  teFlag          
2bbe0 20 20 20 20 20 20 20 20 2f 2a 20 44 65 6c 65 74          /* Delet
2bbf0 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  e shared-memory 
2bc00 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20  if true */.){.  
2bc10 75 6e 69 78 53 68 6d 20 2a 70 3b 20 20 20 20 20  unixShm *p;     
2bc20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bc30 2f 2a 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f  /* The connectio
2bc40 6e 20 74 6f 20 62 65 20 63 6c 6f 73 65 64 20 2a  n to be closed *
2bc50 2f 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  /.  unixShmNode 
2bc60 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20 20  *pShmNode;      
2bc70 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72      /* The under
2bc80 6c 79 69 6e 67 20 73 68 61 72 65 64 2d 6d 65 6d  lying shared-mem
2bc90 6f 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e  ory file */.  un
2bca0 69 78 53 68 6d 20 2a 2a 70 70 3b 20 20 20 20 20  ixShm **pp;     
2bcb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2bcc0 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65   For looping ove
2bcd0 72 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63  r sibling connec
2bce0 74 69 6f 6e 73 20 2a 2f 0a 20 20 75 6e 69 78 46  tions */.  unixF
2bcf0 69 6c 65 20 2a 70 44 62 46 64 3b 20 20 20 20 20  ile *pDbFd;     
2bd00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
2bd10 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61 74  e underlying dat
2bd20 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20  abase file */.. 
2bd30 20 70 44 62 46 64 20 3d 20 28 75 6e 69 78 46 69   pDbFd = (unixFi
2bd40 6c 65 2a 29 66 64 3b 0a 20 20 70 20 3d 20 70 44  le*)fd;.  p = pD
2bd50 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 69 66 28  bFd->pShm;.  if(
2bd60 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53   p==0 ) return S
2bd70 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 53 68 6d  QLITE_OK;.  pShm
2bd80 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f  Node = p->pShmNo
2bd90 64 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  de;..  assert( p
2bda0 53 68 6d 4e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e  ShmNode==pDbFd->
2bdb0 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65  pInode->pShmNode
2bdc0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53   );.  assert( pS
2bdd0 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64 65 3d 3d  hmNode->pInode==
2bde0 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 20 29 3b  pDbFd->pInode );
2bdf0 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 63 6f  ..  /* Remove co
2be00 6e 6e 65 63 74 69 6f 6e 20 70 20 66 72 6f 6d 20  nnection p from 
2be10 74 68 65 20 73 65 74 20 6f 66 20 63 6f 6e 6e 65  the set of conne
2be20 63 74 69 6f 6e 73 20 61 73 73 6f 63 69 61 74 65  ctions associate
2be30 64 0a 20 20 2a 2a 20 77 69 74 68 20 70 53 68 6d  d.  ** with pShm
2be40 4e 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  Node */.  sqlite
2be50 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53  3_mutex_enter(pS
2be60 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a  hmNode->mutex);.
2be70 20 20 66 6f 72 28 70 70 3d 26 70 53 68 6d 4e 6f    for(pp=&pShmNo
2be80 64 65 2d 3e 70 46 69 72 73 74 3b 20 28 2a 70 70  de->pFirst; (*pp
2be90 29 21 3d 70 3b 20 70 70 20 3d 20 26 28 2a 70 70  )!=p; pp = &(*pp
2bea0 29 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20 20 2a 70  )->pNext){}.  *p
2beb0 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 0a 20  p = p->pNext;.. 
2bec0 20 2f 2a 20 46 72 65 65 20 74 68 65 20 63 6f 6e   /* Free the con
2bed0 6e 65 63 74 69 6f 6e 20 70 20 2a 2f 0a 20 20 73  nection p */.  s
2bee0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
2bef0 20 20 70 44 62 46 64 2d 3e 70 53 68 6d 20 3d 20    pDbFd->pShm = 
2bf00 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  0;.  sqlite3_mut
2bf10 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64  ex_leave(pShmNod
2bf20 65 2d 3e 6d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a  e->mutex);..  /*
2bf30 20 49 66 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52   If pShmNode->nR
2bf40 65 66 20 68 61 73 20 72 65 61 63 68 65 64 20 30  ef has reached 0
2bf50 2c 20 74 68 65 6e 20 63 6c 6f 73 65 20 74 68 65  , then close the
2bf60 20 75 6e 64 65 72 6c 79 69 6e 67 0a 20 20 2a 2a   underlying.  **
2bf70 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66   shared-memory f
2bf80 69 6c 65 2c 20 74 6f 6f 20 2a 2f 0a 20 20 75 6e  ile, too */.  un
2bf90 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
2bfa0 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f    assert( pShmNo
2bfb0 64 65 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20  de->nRef>0 );.  
2bfc0 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 2d 2d  pShmNode->nRef--
2bfd0 3b 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65  ;.  if( pShmNode
2bfe0 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20  ->nRef==0 ){.   
2bff0 20 69 66 28 20 64 65 6c 65 74 65 46 6c 61 67 20   if( deleteFlag 
2c000 26 26 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d  && pShmNode->h>=
2c010 30 20 29 20 7b 0a 20 20 20 20 20 20 69 66 20 28  0 ) {.      if (
2c020 64 65 6c 65 74 65 46 6c 61 67 20 3d 3d 20 31 29  deleteFlag == 1)
2c030 20 7b 20 0a 20 20 20 20 20 20 20 20 75 6e 6c 69   { .        unli
2c040 6e 6b 28 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69  nk(pShmNode->zFi
2c050 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d  lename);.      }
2c060 20 65 6c 73 65 20 69 66 20 28 64 65 6c 65 74 65   else if (delete
2c070 46 6c 61 67 20 3d 3d 20 32 29 20 7b 0a 20 20 20  Flag == 2) {.   
2c080 20 20 20 20 20 2f 2a 20 66 74 72 75 6e 63 61 74       /* ftruncat
2c090 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 33  e(pShmNode->h, 3
2c0a0 32 20 2a 20 31 30 32 34 29 3b 20 2a 2f 0a 20 20  2 * 1024); */.  
2c0b0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
2c0c0 0a 20 20 20 20 75 6e 69 78 53 68 6d 50 75 72 67  .    unixShmPurg
2c0d0 65 28 70 44 62 46 64 29 3b 0a 20 20 7d 0a 20 20  e(pDbFd);.  }.  
2c0e0 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
2c0f0 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  ;..  return SQLI
2c100 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 23 65 6c 73 65  TE_OK;.}...#else
2c110 0a 23 20 64 65 66 69 6e 65 20 75 6e 69 78 53 68  .# define unixSh
2c120 6d 4d 61 70 20 20 20 20 20 30 0a 23 20 64 65 66  mMap     0.# def
2c130 69 6e 65 20 75 6e 69 78 53 68 6d 4c 6f 63 6b 20  ine unixShmLock 
2c140 20 20 20 30 0a 23 20 64 65 66 69 6e 65 20 75 6e     0.# define un
2c150 69 78 53 68 6d 42 61 72 72 69 65 72 20 30 0a 23  ixShmBarrier 0.#
2c160 20 64 65 66 69 6e 65 20 75 6e 69 78 53 68 6d 55   define unixShmU
2c170 6e 6d 61 70 20 20 20 30 0a 23 65 6e 64 69 66 20  nmap   0.#endif 
2c180 2f 2a 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /* #ifndef SQLIT
2c190 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a 23  E_OMIT_WAL */..#
2c1a0 69 66 20 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  if (SQLITE_ENABL
2c1b0 45 5f 41 50 50 4c 45 5f 53 50 49 3e 30 29 20 26  E_APPLE_SPI>0) &
2c1c0 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  & defined(__APPL
2c1d0 45 5f 5f 29 0a 73 74 61 74 69 63 20 63 6f 6e 73  E__).static cons
2c1e0 74 20 63 68 61 72 20 2a 75 6e 69 78 54 65 6d 70  t char *unixTemp
2c1f0 46 69 6c 65 44 69 72 28 76 6f 69 64 29 3b 0a 0a  FileDir(void);..
2c200 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 49  static int unixI
2c210 6e 76 61 6c 69 64 61 74 65 53 75 70 70 6f 72 74  nvalidateSupport
2c220 46 69 6c 65 73 28 75 6e 69 78 46 69 6c 65 20 2a  Files(unixFile *
2c230 70 46 69 6c 65 2c 20 69 6e 74 20 73 6b 69 70 57  pFile, int skipW
2c240 41 4c 29 20 7b 0a 20 20 63 68 61 72 20 6a 50 61  AL) {.  char jPa
2c250 74 68 5b 4d 41 58 50 41 54 48 4c 45 4e 2b 39 5d  th[MAXPATHLEN+9]
2c260 3b 0a 20 20 69 6e 74 20 7a 4c 65 6e 20 3d 20 73  ;.  int zLen = s
2c270 74 72 6c 63 70 79 28 6a 50 61 74 68 2c 20 70 46  trlcpy(jPath, pF
2c280 69 6c 65 2d 3e 7a 50 61 74 68 2c 20 4d 41 58 50  ile->zPath, MAXP
2c290 41 54 48 4c 45 4e 2b 39 29 3b 0a 20 20 69 66 28  ATHLEN+9);.  if(
2c2a0 20 7a 4c 65 6e 3c 4d 41 58 50 41 54 48 4c 45 4e   zLen<MAXPATHLEN
2c2b0 20 29 7b 0a 20 20 20 20 73 69 7a 65 5f 74 20 6a   ){.    size_t j
2c2c0 4c 65 6e 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  Len;.    const c
2c2d0 68 61 72 20 65 78 74 65 6e 73 69 6f 6e 73 5b 33  har extensions[3
2c2e0 5d 5b 39 5d 20 3d 20 7b 20 22 2d 77 61 6c 22 2c  ][9] = { "-wal",
2c2f0 20 22 2d 6a 6f 75 72 6e 61 6c 22 2c 20 22 2d 73   "-journal", "-s
2c300 68 6d 22 20 7d 3b 0a 20 20 20 20 69 6e 74 20 6a  hm" };.    int j
2c310 20 3d 20 28 73 6b 69 70 57 41 4c 20 3f 20 31 20   = (skipWAL ? 1 
2c320 3a 20 30 29 3b 0a 20 20 20 20 66 6f 72 28 20 3b  : 0);.    for( ;
2c330 20 6a 3c 33 3b 20 6a 2b 2b 20 29 7b 0a 20 20 20   j<3; j++ ){.   
2c340 20 20 20 0a 20 20 20 20 20 20 2f 2a 20 43 68 65     .      /* Che
2c350 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ck to see if the
2c360 20 73 68 6d 20 66 69 6c 65 20 69 73 20 61 6c 72   shm file is alr
2c370 65 61 64 79 20 6f 70 65 6e 65 64 20 66 6f 72 20  eady opened for 
2c380 74 68 69 73 20 70 46 69 6c 65 20 2a 2f 0a 20 20  this pFile */.  
2c390 20 20 20 20 69 66 28 20 6a 3d 3d 32 20 29 7b 0a      if( j==2 ){.
2c3a0 20 20 20 20 20 20 20 20 75 6e 69 78 45 6e 74 65          unixEnte
2c3b0 72 4d 75 74 65 78 28 29 3b 20 2f 2a 20 42 65 63  rMutex(); /* Bec
2c3c0 61 75 73 65 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  ause pFile->pIno
2c3d0 64 65 20 69 73 20 73 68 61 72 65 64 20 61 63 72  de is shared acr
2c3e0 6f 73 73 20 74 68 72 65 61 64 73 20 2a 2f 0a 20  oss threads */. 
2c3f0 20 20 20 20 20 20 20 75 6e 69 78 53 68 6d 4e 6f         unixShmNo
2c400 64 65 20 2a 70 53 68 6d 4e 6f 64 65 20 3d 20 70  de *pShmNode = p
2c410 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53  File->pInode->pS
2c420 68 6d 4e 6f 64 65 3b 0a 20 20 20 20 20 20 20 20  hmNode;.        
2c430 69 66 28 20 70 53 68 6d 4e 6f 64 65 20 26 26 20  if( pShmNode && 
2c440 21 70 53 68 6d 4e 6f 64 65 2d 3e 69 73 52 65 61  !pShmNode->isRea
2c450 64 6f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 20  donly ){.       
2c460 20 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73     struct stat s
2c470 53 74 61 74 3b 0a 20 20 20 20 20 20 20 20 20 20  Stat;.          
2c480 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
2c490 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  ter(pShmNode->mu
2c4a0 74 65 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20  tex);.          
2c4b0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
2c4c0 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 26 26  ShmNode->h>=0 &&
2c4d0 20 21 6f 73 46 73 74 61 74 28 70 53 68 6d 4e 6f   !osFstat(pShmNo
2c4e0 64 65 2d 3e 68 2c 20 26 73 53 74 61 74 29 20 29  de->h, &sStat) )
2c4f0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 75 6e  {.            un
2c500 73 69 67 6e 65 64 20 6c 6f 6e 67 20 73 69 7a 65  signed long size
2c510 20 3d 20 28 73 53 74 61 74 2e 73 74 5f 73 69 7a   = (sStat.st_siz
2c520 65 3c 34 29 20 3f 20 73 53 74 61 74 2e 73 74 5f  e<4) ? sStat.st_
2c530 73 69 7a 65 20 3a 20 34 3b 0a 20 20 20 20 20 20  size : 4;.      
2c540 20 20 20 20 20 20 69 66 28 20 73 69 7a 65 3e 30        if( size>0
2c550 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2c560 20 20 62 7a 65 72 6f 28 70 53 68 6d 4e 6f 64 65    bzero(pShmNode
2c570 2d 3e 61 70 52 65 67 69 6f 6e 5b 30 5d 2c 20 73  ->apRegion[0], s
2c580 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ize);.          
2c590 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
2c5a0 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65  x_leave(pShmNode
2c5b0 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20  ->mutex);.      
2c5c0 20 20 20 20 20 20 20 20 75 6e 69 78 4c 65 61 76          unixLeav
2c5d0 65 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 20 20  eMutex();.      
2c5e0 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
2c5f0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
2c600 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2c610 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
2c620 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f  tex_leave(pShmNo
2c630 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20  de->mutex);.    
2c640 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 75 6e      }.        un
2c650 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
2c660 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6a 4c        }.      jL
2c670 65 6e 20 3d 20 73 74 72 6c 63 70 79 28 26 6a 50  en = strlcpy(&jP
2c680 61 74 68 5b 7a 4c 65 6e 5d 2c 20 65 78 74 65 6e  ath[zLen], exten
2c690 73 69 6f 6e 73 5b 6a 5d 2c 20 39 29 3b 0a 20 20  sions[j], 9);.  
2c6a0 20 20 20 20 69 66 28 20 6a 4c 65 6e 20 3c 20 39      if( jLen < 9
2c6b0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
2c6c0 6a 66 6c 61 67 73 20 3d 20 28 6a 3c 32 29 20 3f  jflags = (j<2) ?
2c6d0 20 4f 5f 54 52 55 4e 43 20 3a 20 4f 5f 52 44 57   O_TRUNC : O_RDW
2c6e0 52 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a  R;.        int j
2c6f0 66 64 20 3d 20 6f 70 65 6e 28 6a 50 61 74 68 2c  fd = open(jPath,
2c700 20 6a 66 6c 61 67 73 29 3b 0a 20 20 20 20 20 20   jflags);.      
2c710 20 20 69 66 28 20 6a 66 64 3d 3d 28 2d 31 29 20    if( jfd==(-1) 
2c720 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
2c730 20 65 72 72 6e 6f 21 3d 45 4e 4f 45 4e 54 20 29   errno!=ENOENT )
2c740 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 65  {.            pe
2c750 72 72 6f 72 28 6a 50 61 74 68 29 3b 0a 20 20 20  rror(jPath);.   
2c760 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2c770 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
2c780 20 20 20 20 69 66 28 20 6a 3d 3d 32 20 29 7b 0a      if( j==2 ){.
2c790 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72 75              stru
2c7a0 63 74 20 73 74 61 74 20 73 53 74 61 74 3b 0a 20  ct stat sStat;. 
2c7b0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21             if( !
2c7c0 6f 73 46 73 74 61 74 28 6a 66 64 2c 20 26 73 53  osFstat(jfd, &sS
2c7d0 74 61 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  tat) ){.        
2c7e0 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 6c        unsigned l
2c7f0 6f 6e 67 20 73 69 7a 65 20 3d 20 28 73 53 74 61  ong size = (sSta
2c800 74 2e 73 74 5f 73 69 7a 65 3c 34 29 20 3f 20 73  t.st_size<4) ? s
2c810 53 74 61 74 2e 73 74 5f 73 69 7a 65 20 3a 20 34  Stat.st_size : 4
2c820 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2c830 69 66 28 20 73 69 7a 65 3e 30 20 29 7b 0a 20 20  if( size>0 ){.  
2c840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 75 69                ui
2c850 6e 74 33 32 5f 74 20 7a 65 72 6f 20 3d 20 30 3b  nt32_t zero = 0;
2c860 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2c870 20 70 77 72 69 74 65 28 6a 66 64 2c 20 26 7a 65   pwrite(jfd, &ze
2c880 72 6f 2c 20 28 73 69 7a 65 5f 74 29 73 69 7a 65  ro, (size_t)size
2c890 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
2c8a0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2c8b0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
2c8c0 20 20 20 20 20 20 20 20 20 20 66 73 79 6e 63 28            fsync(
2c8d0 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  jfd);.          
2c8e0 63 6c 6f 73 65 28 6a 66 64 29 3b 0a 20 20 20 20  close(jfd);.    
2c8f0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
2c900 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
2c910 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 73   SQLITE_OK;.}..s
2c920 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 55 6e  tatic int unixUn
2c930 73 61 66 65 54 72 75 6e 63 61 74 65 44 61 74 61  safeTruncateData
2c940 62 61 73 65 28 75 6e 69 78 46 69 6c 65 20 2a 70  base(unixFile *p
2c950 46 69 6c 65 29 7b 0a 20 20 2f 2a 20 74 68 69 73  File){.  /* this
2c960 20 69 73 20 6e 61 73 74 79 20 26 20 62 61 64 2e   is nasty & bad.
2c970 20 20 64 65 73 74 72 75 63 74 69 6f 6e 20 77 69    destruction wi
2c980 74 68 20 70 72 65 6a 75 64 69 63 65 2e 20 20 77  th prejudice.  w
2c990 65 27 6c 6c 20 6c 6f 73 65 20 61 6c 6c 20 74 68  e'll lose all th
2c9a0 65 0a 20 20 2a 2a 20 66 69 6c 65 20 6c 6f 63 6b  e.  ** file lock
2c9b0 73 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73  s in this proces
2c9c0 73 2c 20 68 6f 77 65 76 65 72 2e 20 73 71 6c 69  s, however. sqli
2c9d0 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  te3_file_control
2c9e0 20 77 6f 72 6b 73 20 70 72 6f 70 65 72 6c 79 2e   works properly.
2c9f0 0a 20 20 2a 2a 20 42 75 74 20 69 66 20 69 74 20  .  ** But if it 
2ca00 66 61 69 6c 73 2c 20 74 68 69 73 20 77 6f 72 6b  fails, this work
2ca10 73 20 61 70 70 72 6f 78 69 6d 61 74 65 6c 79 0a  s approximately.
2ca20 20 20 2a 2f 0a 20 20 63 68 61 72 20 6a 6f 75 72    */.  char jour
2ca30 6e 61 6c 50 61 74 68 5b 4d 41 58 50 41 54 48 4c  nalPath[MAXPATHL
2ca40 45 4e 5d 3b 0a 20 20 63 68 61 72 20 77 61 6c 50  EN];.  char walP
2ca50 61 74 68 5b 4d 41 58 50 41 54 48 4c 45 4e 5d 3b  ath[MAXPATHLEN];
2ca60 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
2ca70 54 45 5f 4f 4b 3b 0a 20 20 0a 23 69 66 64 65 66  TE_OK;.  .#ifdef
2ca80 20 44 45 42 55 47 0a 20 20 66 70 72 69 6e 74 66   DEBUG.  fprintf
2ca90 28 73 74 64 65 72 72 2c 20 22 46 6f 72 63 65 20  (stderr, "Force 
2caa0 74 72 75 6e 63 61 74 69 6e 67 20 64 61 74 61 62  truncating datab
2cab0 61 73 65 20 25 73 5c 6e 22 2c 20 70 46 69 6c 65  ase %s\n", pFile
2cac0 2d 3e 7a 50 61 74 68 29 3b 0a 23 65 6e 64 69 66  ->zPath);.#endif
2cad0 0a 20 20 73 74 72 6c 63 70 79 28 6a 6f 75 72 6e  .  strlcpy(journ
2cae0 61 6c 50 61 74 68 2c 20 70 46 69 6c 65 2d 3e 7a  alPath, pFile->z
2caf0 50 61 74 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e  Path, MAXPATHLEN
2cb00 29 3b 0a 20 20 73 74 72 6c 63 61 74 28 6a 6f 75  );.  strlcat(jou
2cb10 72 6e 61 6c 50 61 74 68 2c 20 22 2d 6a 6f 75 72  rnalPath, "-jour
2cb20 6e 61 6c 22 2c 20 4d 41 58 50 41 54 48 4c 45 4e  nal", MAXPATHLEN
2cb30 29 3b 0a 20 20 73 74 72 6c 63 70 79 28 77 61 6c  );.  strlcpy(wal
2cb40 50 61 74 68 2c 20 70 46 69 6c 65 2d 3e 7a 50 61  Path, pFile->zPa
2cb50 74 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b  th, MAXPATHLEN);
2cb60 0a 20 20 73 74 72 6c 63 61 74 28 77 61 6c 50 61  .  strlcat(walPa
2cb70 74 68 2c 20 22 2d 77 61 6c 22 2c 20 4d 41 58 50  th, "-wal", MAXP
2cb80 41 54 48 4c 45 4e 29 3b 0a 20 20 69 6e 74 20 66  ATHLEN);.  int f
2cb90 64 31 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 20  d1 = pFile->h;. 
2cba0 20 69 6e 74 20 72 65 73 75 6c 74 20 3d 20 30 3b   int result = 0;
2cbb0 0a 20 20 72 65 73 75 6c 74 20 3d 20 66 74 72 75  .  result = ftru
2cbc0 6e 63 61 74 65 28 66 64 31 2c 20 30 6c 6c 29 3b  ncate(fd1, 0ll);
2cbd0 0a 20 20 69 66 20 28 72 65 73 75 6c 74 29 20 7b  .  if (result) {
2cbe0 0a 20 20 20 20 72 65 73 75 6c 74 20 3d 20 65 72  .    result = er
2cbf0 72 6e 6f 3b 0a 20 20 7d 0a 20 20 69 66 20 28 72  rno;.  }.  if (r
2cc00 65 73 75 6c 74 29 20 7b 0a 20 20 20 20 72 63 20  esult) {.    rc 
2cc10 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a  = SQLITE_IOERR;.
2cc20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72      storeLastErr
2cc30 6e 6f 28 70 46 69 6c 65 2c 20 72 65 73 75 6c 74  no(pFile, result
2cc40 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 69 6e 74 20  );.  }.  .  int 
2cc50 66 64 32 20 3d 20 6f 70 65 6e 28 6a 6f 75 72 6e  fd2 = open(journ
2cc60 61 6c 50 61 74 68 2c 20 4f 5f 52 44 57 52 29 3b  alPath, O_RDWR);
2cc70 0a 20 20 69 6e 74 20 72 65 73 75 6c 74 32 20 3d  .  int result2 =
2cc80 20 30 3b 0a 20 20 69 66 20 28 66 64 32 20 3c 20   0;.  if (fd2 < 
2cc90 30 29 20 7b 0a 20 20 20 20 69 66 20 28 65 72 72  0) {.    if (err
2cca0 6e 6f 20 21 3d 20 45 4e 4f 45 4e 54 29 20 7b 0a  no != ENOENT) {.
2ccb0 20 20 20 20 20 20 72 65 73 75 6c 74 32 20 3d 20        result2 = 
2ccc0 65 72 72 6e 6f 3b 0a 20 20 20 20 7d 20 65 6c 73  errno;.    } els
2ccd0 65 20 7b 0a 20 20 20 20 20 20 72 65 73 75 6c 74  e {.      result
2cce0 32 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  2 = 0;.    }.  }
2ccf0 20 65 6c 73 65 20 7b 0a 20 20 20 20 72 65 73 75   else {.    resu
2cd00 6c 74 32 20 3d 20 66 74 72 75 6e 63 61 74 65 28  lt2 = ftruncate(
2cd10 66 64 32 2c 20 30 6c 6c 29 3b 0a 20 20 20 20 69  fd2, 0ll);.    i
2cd20 66 20 28 72 65 73 75 6c 74 32 29 20 7b 0a 20 20  f (result2) {.  
2cd30 20 20 20 20 72 65 73 75 6c 74 32 20 3d 20 65 72      result2 = er
2cd40 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  rno;.    }.  }. 
2cd50 20 69 66 20 28 72 65 73 75 6c 74 32 20 26 26 20   if (result2 && 
2cd60 21 72 65 73 75 6c 74 29 20 7b 0a 20 20 20 20 72  !result) {.    r
2cd70 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
2cd80 3b 0a 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45  ;.    storeLastE
2cd90 72 72 6e 6f 28 70 46 69 6c 65 2c 20 72 65 73 75  rrno(pFile, resu
2cda0 6c 74 32 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 69  lt2);.  }.  .  i
2cdb0 6e 74 20 66 64 33 20 3d 20 6f 70 65 6e 28 77 61  nt fd3 = open(wa
2cdc0 6c 50 61 74 68 2c 20 4f 5f 52 44 57 52 29 3b 0a  lPath, O_RDWR);.
2cdd0 20 20 69 6e 74 20 72 65 73 75 6c 74 33 20 3d 20    int result3 = 
2cde0 30 3b 0a 20 20 69 66 20 28 66 64 33 20 3c 20 30  0;.  if (fd3 < 0
2cdf0 29 20 7b 0a 20 20 20 20 69 66 20 28 65 72 72 6e  ) {.    if (errn
2ce00 6f 20 21 3d 20 45 4e 4f 45 4e 54 29 20 7b 0a 20  o != ENOENT) {. 
2ce10 20 20 20 20 20 72 65 73 75 6c 74 33 20 3d 20 65       result3 = e
2ce20 72 72 6e 6f 3b 0a 20 20 20 20 7d 20 65 6c 73 65  rrno;.    } else
2ce30 20 7b 0a 20 20 20 20 20 20 72 65 73 75 6c 74 33   {.      result3
2ce40 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 20   = 0;.    }.  } 
2ce50 65 6c 73 65 20 7b 0a 20 20 20 20 72 65 73 75 6c  else {.    resul
2ce60 74 33 20 3d 20 66 74 72 75 6e 63 61 74 65 28 66  t3 = ftruncate(f
2ce70 64 33 2c 20 30 6c 6c 29 3b 0a 20 20 20 20 69 66  d3, 0ll);.    if
2ce80 20 28 72 65 73 75 6c 74 33 29 20 7b 0a 20 20 20   (result3) {.   
2ce90 20 20 20 72 65 73 75 6c 74 33 20 3d 20 65 72 72     result3 = err
2cea0 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  no;.    }.  }.  
2ceb0 69 66 20 28 72 65 73 75 6c 74 33 20 26 26 20 21  if (result3 && !
2cec0 28 72 65 73 75 6c 74 20 7c 7c 20 72 65 73 75 6c  (result || resul
2ced0 74 32 29 29 20 7b 0a 20 20 20 20 72 63 20 3d 20  t2)) {.    rc = 
2cee0 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20  SQLITE_IOERR;.  
2cef0 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f    storeLastErrno
2cf00 28 70 46 69 6c 65 2c 20 72 65 73 75 6c 74 32 29  (pFile, result2)
2cf10 3b 0a 20 20 7d 0a 20 20 0a 20 20 69 66 20 28 66  ;.  }.  .  if (f
2cf20 64 33 20 3e 3d 20 30 29 20 7b 0a 20 20 20 20 66  d3 >= 0) {.    f
2cf30 73 79 6e 63 28 66 64 33 29 3b 0a 20 20 20 20 63  sync(fd3);.    c
2cf40 6c 6f 73 65 28 66 64 33 29 3b 0a 20 20 7d 0a 20  lose(fd3);.  }. 
2cf50 20 69 66 20 28 66 64 32 20 3e 3d 20 30 29 20 7b   if (fd2 >= 0) {
2cf60 0a 20 20 20 20 66 73 79 6e 63 28 66 64 32 29 3b  .    fsync(fd2);
2cf70 0a 20 20 20 20 63 6c 6f 73 65 28 66 64 32 29 3b  .    close(fd2);
2cf80 0a 20 20 7d 0a 20 20 66 73 79 6e 63 28 66 64 31  .  }.  fsync(fd1
2cf90 29 3b 0a 09 0a 20 20 72 65 74 75 72 6e 20 72 63  );...  return rc
2cfa0 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.}..static int 
2cfb0 75 6e 69 78 54 72 75 6e 63 61 74 65 44 61 74 61  unixTruncateData
2cfc0 62 61 73 65 28 75 6e 69 78 46 69 6c 65 20 2a 70  base(unixFile *p
2cfd0 46 69 6c 65 2c 20 69 6e 74 20 62 46 6c 61 67 73  File, int bFlags
2cfe0 29 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  ) {.  sqlite3_fi
2cff0 6c 65 20 2a 69 64 20 3d 20 28 73 71 6c 69 74 65  le *id = (sqlite
2d000 33 5f 66 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a  3_file *)pFile;.
2d010 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
2d020 45 5f 4f 4b 3b 0a 20 20 76 6f 69 64 20 2a 70 4c  E_OK;.  void *pL
2d030 6f 63 6b 20 3d 20 4e 55 4c 4c 3b 0a 20 20 69 6e  ock = NULL;.  in
2d040 74 20 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20 69  t flags = 0;.  i
2d050 6e 74 20 63 6f 72 72 75 70 74 46 69 6c 65 4c 6f  nt corruptFileLo
2d060 63 6b 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 73  ck = 0;.  int is
2d070 43 6f 72 72 75 70 74 20 3d 20 30 3b 0a 20 20 69  Corrupt = 0;.  i
2d080 6e 74 20 66 6f 72 63 65 20 3d 20 28 62 46 6c 61  nt force = (bFla
2d090 67 73 20 26 20 53 51 4c 49 54 45 5f 54 52 55 4e  gs & SQLITE_TRUN
2d0a0 43 41 54 45 5f 46 4f 52 43 45 29 3b 0a 20 20 69  CATE_FORCE);.  i
2d0b0 6e 74 20 73 61 66 65 46 61 69 6c 65 64 20 3d 20  nt safeFailed = 
2d0c0 30 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 45  0;..#if SQLITE_E
2d0d0 4e 41 42 4c 45 5f 44 41 54 41 5f 50 52 4f 54 45  NABLE_DATA_PROTE
2d0e0 43 54 49 4f 4e 0a 20 20 66 6c 61 67 73 20 7c 3d  CTION.  flags |=
2d0f0 20 70 46 69 6c 65 2d 3e 70 72 6f 74 46 6c 61 67   pFile->protFlag
2d100 73 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51  s;.#endif.#if SQ
2d110 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
2d120 49 4e 47 5f 53 54 59 4c 45 0a 20 20 69 66 28 20  ING_STYLE.  if( 
2d130 69 73 50 72 6f 78 79 4c 6f 63 6b 69 6e 67 4d 6f  isProxyLockingMo
2d140 64 65 28 70 46 69 6c 65 29 20 29 7b 0a 20 20 20  de(pFile) ){.   
2d150 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45   flags |= SQLITE
2d160 5f 4f 50 45 4e 5f 41 55 54 4f 50 52 4f 58 59 3b  _OPEN_AUTOPROXY;
2d170 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20  .  }.#endif.  . 
2d180 20 72 63 20 3d 20 73 71 6c 69 74 65 33 64 65 6d   rc = sqlite3dem
2d190 6f 5f 73 75 70 65 72 6c 6f 63 6b 28 70 46 69 6c  o_superlock(pFil
2d1a0 65 2d 3e 7a 50 61 74 68 2c 20 30 2c 20 66 6c 61  e->zPath, 0, fla
2d1b0 67 73 2c 20 30 2c 20 30 2c 20 26 70 4c 6f 63 6b  gs, 0, 0, &pLock
2d1c0 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
2d1d0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2d1e0 45 5f 43 4f 52 52 55 50 54 20 7c 7c 20 72 63 3d  E_CORRUPT || rc=
2d1f0 3d 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 20 29  =SQLITE_NOTADB )
2d200 7b 0a 20 20 20 20 20 20 69 73 43 6f 72 72 75 70  {.      isCorrup
2d210 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 63 20  t = 1;.      rc 
2d220 3d 20 73 71 6c 69 74 65 33 64 65 6d 6f 5f 73 75  = sqlite3demo_su
2d230 70 65 72 6c 6f 63 6b 5f 63 6f 72 72 75 70 74 28  perlock_corrupt(
2d240 69 64 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f  id, SQLITE_LOCK_
2d250 45 58 43 4c 55 53 49 56 45 2c 0a 20 20 20 20 20  EXCLUSIVE,.     
2d260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d280 20 20 20 20 26 63 6f 72 72 75 70 74 46 69 6c 65      &corruptFile
2d290 4c 6f 63 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Lock);.    }.   
2d2a0 20 69 66 28 20 72 63 20 26 26 20 21 66 6f 72 63   if( rc && !forc
2d2b0 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  e ){.      retur
2d2c0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
2d2d0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
2d2e0 2f 2a 20 49 67 6e 6f 72 65 20 74 68 65 20 6c 6f  /* Ignore the lo
2d2f0 63 6b 69 6e 67 20 66 61 69 6c 75 72 65 20 69 66  cking failure if
2d300 20 66 6f 72 63 65 20 69 73 20 74 72 75 65 20 2a   force is true *
2d310 2f 0a 20 20 7d 0a 20 20 69 66 28 20 28 62 46 6c  /.  }.  if( (bFl
2d320 61 67 73 26 53 51 4c 49 54 45 5f 54 52 55 4e 43  ags&SQLITE_TRUNC
2d330 41 54 45 5f 49 4e 49 54 49 41 4c 49 5a 45 5f 48  ATE_INITIALIZE_H
2d340 45 41 44 45 52 5f 4d 41 53 4b 29 21 3d 30 20 29  EADER_MASK)!=0 )
2d350 7b 0a 20 20 20 20 2f 2a 20 69 6e 69 74 69 61 6c  {.    /* initial
2d360 69 7a 65 20 61 20 6e 65 77 20 64 61 74 61 62 61  ize a new databa
2d370 73 65 20 69 6e 20 54 4d 50 44 49 52 20 61 6e 64  se in TMPDIR and
2d380 20 63 6f 70 79 20 74 68 65 20 63 6f 6e 74 65 6e   copy the conten
2d390 74 73 20 6f 76 65 72 20 2a 2f 0a 20 20 20 20 63  ts over */.    c
2d3a0 6f 6e 73 74 20 63 68 61 72 20 2a 74 44 69 72 20  onst char *tDir 
2d3b0 3d 20 75 6e 69 78 54 65 6d 70 46 69 6c 65 44 69  = unixTempFileDi
2d3c0 72 28 29 3b 0a 20 20 20 20 69 6e 74 20 74 44 69  r();.    int tDi
2d3d0 72 4c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 74 44  rLen = strlen(tD
2d3e0 69 72 29 3b 0a 20 20 20 20 69 6e 74 20 74 4c 65  ir);.    int tLe
2d3f0 6e 20 3d 20 73 69 7a 65 6f 66 28 63 68 61 72 29  n = sizeof(char)
2d400 20 2a 20 28 74 44 69 72 4c 65 6e 20 2b 20 31 32   * (tDirLen + 12
2d410 29 3b 0a 20 20 20 20 63 68 61 72 20 2a 74 44 62  );.    char *tDb
2d420 50 61 74 68 20 3d 20 28 63 68 61 72 20 2a 29 6d  Path = (char *)m
2d430 61 6c 6c 6f 63 28 74 4c 65 6e 29 3b 0a 20 20 20  alloc(tLen);.   
2d440 20 69 6e 74 20 74 46 64 20 3d 20 2d 31 3b 0a 20   int tFd = -1;. 
2d450 20 20 20 0a 20 20 20 20 73 74 72 6c 63 70 79 28     .    strlcpy(
2d460 74 44 62 50 61 74 68 2c 20 74 44 69 72 2c 20 74  tDbPath, tDir, t
2d470 4c 65 6e 29 3b 0a 20 20 20 20 69 66 28 20 74 44  Len);.    if( tD
2d480 62 50 61 74 68 5b 28 74 44 69 72 4c 65 6e 2d 31  bPath[(tDirLen-1
2d490 29 5d 20 21 3d 20 27 2f 27 20 29 7b 0a 20 20 20  )] != '/' ){.   
2d4a0 20 20 20 73 74 72 6c 63 61 74 28 74 44 62 50 61     strlcat(tDbPa
2d4b0 74 68 2c 20 22 2f 74 6d 70 64 62 58 58 58 58 58  th, "/tmpdbXXXXX
2d4c0 22 2c 20 74 4c 65 6e 29 3b 0a 20 20 20 20 7d 20  ", tLen);.    } 
2d4d0 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 73 74 72  else {.      str
2d4e0 6c 63 61 74 28 74 44 62 50 61 74 68 2c 20 22 74  lcat(tDbPath, "t
2d4f0 6d 70 64 62 58 58 58 58 58 22 2c 20 74 4c 65 6e  mpdbXXXXX", tLen
2d500 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 74 46 64  );.    }.    tFd
2d510 20 3d 20 6d 6b 73 74 65 6d 70 28 74 44 62 50 61   = mkstemp(tDbPa
2d520 74 68 29 3b 0a 20 20 20 20 69 66 28 20 74 46 64  th);.    if( tFd
2d530 3d 3d 2d 31 20 29 7b 0a 20 20 20 20 20 20 73 74  ==-1 ){.      st
2d540 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69  oreLastErrno(pFi
2d550 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20  le, errno);.    
2d560 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
2d570 45 52 52 3b 0a 20 20 20 20 20 20 73 61 66 65 46  ERR;.      safeF
2d580 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d  ailed = 1;.    }
2d590 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
2d5a0 74 65 33 20 2a 74 44 62 20 3d 20 4e 55 4c 4c 3b  te3 *tDb = NULL;
2d5b0 0a 20 20 20 20 20 20 63 6f 70 79 66 69 6c 65 5f  .      copyfile_
2d5c0 73 74 61 74 65 5f 74 20 73 3b 0a 20 20 20 20 20  state_t s;.     
2d5d0 20 69 6e 74 20 74 72 63 20 3d 20 73 71 6c 69 74   int trc = sqlit
2d5e0 65 33 5f 6f 70 65 6e 5f 76 32 28 74 44 62 50 61  e3_open_v2(tDbPa
2d5f0 74 68 2c 20 26 74 44 62 2c 0a 20 20 20 20 20 20  th, &tDb,.      
2d600 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53 51               (SQ
2d610 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
2d620 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   | SQLITE_OPEN_R
2d630 45 41 44 57 52 49 54 45 0a 20 20 20 20 20 20 20  EADWRITE.       
2d640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
2d650 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 41 55 54   SQLITE_OPEN_AUT
2d660 4f 50 52 4f 58 59 29 2c 20 4e 55 4c 4c 29 3b 0a  OPROXY), NULL);.
2d670 20 20 20 20 20 20 63 68 61 72 20 2a 65 72 72 6d        char *errm
2d680 73 67 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 20  sg = NULL;.     
2d690 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c   const char *sql
2d6a0 20 3d 20 22 22 3b 0a 20 20 20 20 20 20 69 66 28   = "";.      if(
2d6b0 20 21 74 72 63 20 26 26 20 28 62 46 6c 61 67 73   !trc && (bFlags
2d6c0 26 53 51 4c 49 54 45 5f 54 52 55 4e 43 41 54 45  &SQLITE_TRUNCATE
2d6d0 5f 50 41 47 45 53 49 5a 45 5f 4d 41 53 4b 29 20  _PAGESIZE_MASK) 
2d6e0 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  ){.        const
2d6f0 20 63 68 61 72 20 70 61 67 65 73 69 7a 65 5f 73   char pagesize_s
2d700 71 6c 5b 34 5d 5b 32 32 5d 20 3d 20 7b 0a 20 20  ql[4][22] = {.  
2d710 20 20 20 20 20 20 20 20 22 70 72 61 67 6d 61 20          "pragma 
2d720 70 61 67 65 5f 73 69 7a 65 3d 31 30 32 34 22 2c  page_size=1024",
2d730 0a 20 20 20 20 20 20 20 20 20 20 22 70 72 61 67  .          "prag
2d740 6d 61 20 70 61 67 65 5f 73 69 7a 65 3d 32 30 34  ma page_size=204
2d750 38 22 2c 0a 20 20 20 20 20 20 20 20 20 20 22 70  8",.          "p
2d760 72 61 67 6d 61 20 70 61 67 65 5f 73 69 7a 65 3d  ragma page_size=
2d770 34 30 39 36 22 2c 0a 20 20 20 20 20 20 20 20 20  4096",.         
2d780 20 22 70 72 61 67 6d 61 20 70 61 67 65 5f 73 69   "pragma page_si
2d790 7a 65 3d 38 31 39 32 22 20 0a 20 20 20 20 20 20  ze=8192" .      
2d7a0 20 20 7d 3b 0a 20 20 20 20 20 20 20 20 69 6e 74    };.        int
2d7b0 20 69 50 61 67 65 73 69 7a 65 20 3d 20 28 28 28   iPagesize = (((
2d7c0 62 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 54 52  bFlags&SQLITE_TR
2d7d0 55 4e 43 41 54 45 5f 50 41 47 45 53 49 5a 45 5f  UNCATE_PAGESIZE_
2d7e0 4d 41 53 4b 29 20 3e 3e 20 34 29 20 2d 20 31 29  MASK) >> 4) - 1)
2d7f0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
2d800 28 20 69 50 61 67 65 73 69 7a 65 3e 3d 30 20 26  ( iPagesize>=0 &
2d810 26 20 69 50 61 67 65 73 69 7a 65 3c 3d 34 20 29  & iPagesize<=4 )
2d820 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 20 3d 20  ;.        sql = 
2d830 70 61 67 65 73 69 7a 65 5f 73 71 6c 5b 69 50 61  pagesize_sql[iPa
2d840 67 65 73 69 7a 65 5d 3b 0a 20 20 20 20 20 20 20  gesize];.       
2d850 20 74 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65   trc = sqlite3_e
2d860 78 65 63 28 74 44 62 2c 20 73 71 6c 2c 20 30 2c  xec(tDb, sql, 0,
2d870 20 30 2c 20 26 65 72 72 6d 73 67 29 3b 0a 20 20   0, &errmsg);.  
2d880 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
2d890 21 74 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  !trc ){.        
2d8a0 63 6f 6e 73 74 20 63 68 61 72 20 61 75 74 6f 76  const char autov
2d8b0 61 63 75 75 6d 5f 73 71 6c 5b 33 5d 5b 32 31 5d  acuum_sql[3][21]
2d8c0 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 22   = {.          "
2d8d0 70 72 61 67 6d 61 20 61 75 74 6f 5f 76 61 63 75  pragma auto_vacu
2d8e0 75 6d 3d 30 22 2c 0a 20 20 20 20 20 20 20 20 20  um=0",.         
2d8f0 20 22 70 72 61 67 6d 61 20 61 75 74 6f 5f 76 61   "pragma auto_va
2d900 63 75 75 6d 3d 31 22 2c 0a 20 20 20 20 20 20 20  cuum=1",.       
2d910 20 20 20 22 70 72 61 67 6d 61 20 61 75 74 6f 5f     "pragma auto_
2d920 76 61 63 75 75 6d 3d 32 22 0a 20 20 20 20 20 20  vacuum=2".      
2d930 20 20 7d 3b 0a 20 20 20 20 20 20 20 20 69 6e 74    };.        int
2d940 20 69 41 75 74 6f 76 61 63 75 75 6d 20 3d 20 32   iAutovacuum = 2
2d950 3b 20 2f 2a 20 64 65 66 61 75 6c 74 20 74 6f 20  ; /* default to 
2d960 69 6e 63 72 65 6d 65 6e 74 61 6c 20 2a 2f 0a 20  incremental */. 
2d970 20 20 20 20 20 20 20 69 66 28 20 28 62 46 6c 61         if( (bFla
2d980 67 73 26 53 51 4c 49 54 45 5f 54 52 55 4e 43 41  gs&SQLITE_TRUNCA
2d990 54 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4d 41  TE_AUTOVACUUM_MA
2d9a0 53 4b 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  SK) ){.         
2d9b0 20 69 41 75 74 6f 76 61 63 75 75 6d 20 3d 20 28   iAutovacuum = (
2d9c0 28 28 62 46 6c 61 67 73 26 53 51 4c 49 54 45 5f  ((bFlags&SQLITE_
2d9d0 54 52 55 4e 43 41 54 45 5f 41 55 54 4f 56 41 43  TRUNCATE_AUTOVAC
2d9e0 55 55 4d 5f 4d 41 53 4b 29 20 3e 3e 20 32 29 20  UUM_MASK) >> 2) 
2d9f0 2d 20 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  - 1);.        }.
2da00 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2da10 69 41 75 74 6f 76 61 63 75 75 6d 3e 3d 30 20 26  iAutovacuum>=0 &
2da20 26 20 69 41 75 74 6f 76 61 63 75 75 6d 3c 3d 32  & iAutovacuum<=2
2da30 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 20   );.        sql 
2da40 3d 20 61 75 74 6f 76 61 63 75 75 6d 5f 73 71 6c  = autovacuum_sql
2da50 5b 69 41 75 74 6f 76 61 63 75 75 6d 5d 3b 0a 20  [iAutovacuum];. 
2da60 20 20 20 20 20 20 20 74 72 63 20 3d 20 73 71 6c         trc = sql
2da70 69 74 65 33 5f 65 78 65 63 28 74 44 62 2c 20 73  ite3_exec(tDb, s
2da80 71 6c 2c 20 30 2c 20 30 2c 20 26 65 72 72 6d 73  ql, 0, 0, &errms
2da90 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  g);.      }.    
2daa0 20 20 69 66 28 20 21 74 72 63 20 26 26 20 28 62    if( !trc && (b
2dab0 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 54 52 55  Flags&SQLITE_TRU
2dac0 4e 43 41 54 45 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  NCATE_JOURNALMOD
2dad0 45 5f 57 41 4c 29 20 29 7b 0a 20 20 20 20 20 20  E_WAL) ){.      
2dae0 20 20 73 71 6c 20 3d 20 22 70 72 61 67 6d 61 20    sql = "pragma 
2daf0 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c  journal_mode=wal
2db00 22 3b 0a 20 20 20 20 20 20 20 20 74 72 63 20 3d  ";.        trc =
2db10 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 74 44   sqlite3_exec(tD
2db20 62 2c 20 73 71 6c 2c 20 30 2c 20 30 2c 20 26 65  b, sql, 0, 0, &e
2db30 72 72 6d 73 67 29 3b 0a 20 20 20 20 20 20 7d 0a  rrmsg);.      }.
2db40 20 20 20 20 20 20 69 66 28 20 74 72 63 20 29 7b        if( trc ){
2db50 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 74 44  .        if( !tD
2db60 62 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66  b ){.          f
2db70 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
2db80 66 61 69 6c 65 64 20 74 6f 20 6f 70 65 6e 20 74  failed to open t
2db90 65 6d 70 20 64 61 74 61 62 61 73 65 20 27 25 73  emp database '%s
2dba0 27 20 74 6f 20 72 65 73 65 74 20 22 0a 20 20 20  ' to reset ".   
2dbb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dbc0 20 20 20 20 20 20 20 22 74 72 75 6e 63 61 74 65         "truncate
2dbd0 64 20 64 61 74 61 62 61 73 65 20 25 73 20 77 69  d database %s wi
2dbe0 74 68 20 66 6c 61 67 73 20 25 78 3a 20 25 64 5c  th flags %x: %d\
2dbf0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
2dc00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
2dc10 44 62 50 61 74 68 2c 20 70 46 69 6c 65 2d 3e 7a  DbPath, pFile->z
2dc20 50 61 74 68 2c 20 62 46 6c 61 67 73 2c 20 74 72  Path, bFlags, tr
2dc30 63 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  c);.        }els
2dc40 65 7b 0a 20 20 20 20 20 20 20 20 20 20 66 70 72  e{.          fpr
2dc50 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 66 61  intf(stderr, "fa
2dc60 69 6c 65 64 20 74 6f 20 73 65 74 20 27 25 73 27  iled to set '%s'
2dc70 20 6f 6e 20 74 72 75 6e 63 61 74 65 64 20 64 61   on truncated da
2dc80 74 61 62 61 73 65 20 25 73 2c 20 25 64 3a 20 22  tabase %s, %d: "
2dc90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2dca0 20 20 20 20 20 20 20 20 20 20 20 22 25 73 5c 6e             "%s\n
2dcb0 22 2c 20 73 71 6c 2c 20 70 46 69 6c 65 2d 3e 7a  ", sql, pFile->z
2dcc0 50 61 74 68 2c 20 74 72 63 2c 20 65 72 72 6d 73  Path, trc, errms
2dcd0 67 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  g);.        }.  
2dce0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
2dcf0 74 44 62 20 29 7b 0a 20 20 20 20 20 20 20 20 69  tDb ){.        i
2dd00 6e 74 20 6f 66 66 20 3d 20 30 3b 0a 20 20 20 20  nt off = 0;.    
2dd10 20 20 20 20 2f 2a 20 6d 65 72 67 65 20 74 68 65      /* merge the
2dd20 20 77 61 6c 20 69 6e 74 6f 20 74 68 65 20 64 62   wal into the db
2dd30 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69   */.        sqli
2dd40 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  te3_file_control
2dd50 28 74 44 62 2c 20 4e 55 4c 4c 2c 20 53 51 4c 49  (tDb, NULL, SQLI
2dd60 54 45 5f 46 43 4e 54 4c 5f 50 45 52 53 49 53 54  TE_FCNTL_PERSIST
2dd70 5f 57 41 4c 2c 20 26 6f 66 66 29 3b 0a 20 20 20  _WAL, &off);.   
2dd80 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f       sqlite3_clo
2dd90 73 65 28 74 44 62 29 3b 0a 20 20 20 20 20 20 7d  se(tDb);.      }
2dda0 0a 20 20 20 20 20 20 73 20 3d 20 63 6f 70 79 66  .      s = copyf
2ddb0 69 6c 65 5f 73 74 61 74 65 5f 61 6c 6c 6f 63 28  ile_state_alloc(
2ddc0 29 3b 0a 20 20 20 20 20 20 6c 73 65 65 6b 28 74  );.      lseek(t
2ddd0 46 64 2c 20 30 2c 20 53 45 45 4b 5f 53 45 54 29  Fd, 0, SEEK_SET)
2dde0 3b 0a 20 20 20 20 20 20 6c 73 65 65 6b 28 70 46  ;.      lseek(pF
2ddf0 69 6c 65 2d 3e 68 2c 20 30 2c 20 53 45 45 4b 5f  ile->h, 0, SEEK_
2de00 53 45 54 29 3b 0a 20 20 20 20 20 20 69 66 28 20  SET);.      if( 
2de10 66 63 6f 70 79 66 69 6c 65 28 74 46 64 2c 20 70  fcopyfile(tFd, p
2de20 46 69 6c 65 2d 3e 68 2c 20 73 2c 20 43 4f 50 59  File->h, s, COPY
2de30 46 49 4c 45 5f 44 41 54 41 29 20 29 7b 0a 20 20  FILE_DATA) ){.  
2de40 20 20 20 20 20 20 69 6e 74 20 65 72 72 3d 65 72        int err=er
2de50 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 73 77 69  rno;.        swi
2de60 74 63 68 28 65 72 72 29 20 7b 0a 20 20 20 20 20  tch(err) {.     
2de70 20 20 20 20 20 63 61 73 65 20 45 4e 4f 4d 45 4d       case ENOMEM
2de80 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 72  :.            tr
2de90 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
2dea0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;.            br
2deb0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 64  eak;.          d
2dec0 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 20 20  efault:.        
2ded0 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72      storeLastErr
2dee0 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72 29 3b 0a  no(pFile, err);.
2def0 20 20 20 20 20 20 20 20 20 20 20 20 74 72 63 20              trc 
2df00 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a  = SQLITE_IOERR;.
2df10 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2df20 7d 0a 20 20 20 20 20 20 63 6f 70 79 66 69 6c 65  }.      copyfile
2df30 5f 73 74 61 74 65 5f 66 72 65 65 28 73 29 3b 0a  _state_free(s);.
2df40 20 20 20 20 20 20 66 73 79 6e 63 28 70 46 69 6c        fsync(pFil
2df50 65 2d 3e 68 29 3b 0a 20 20 20 20 20 20 63 6c 6f  e->h);.      clo
2df60 73 65 28 74 46 64 29 3b 0a 20 20 20 20 20 20 75  se(tFd);.      u
2df70 6e 6c 69 6e 6b 28 74 44 62 50 61 74 68 29 3b 0a  nlink(tDbPath);.
2df80 20 20 20 20 20 20 69 66 28 20 74 72 63 21 3d 53        if( trc!=S
2df90 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2dfa0 20 20 20 20 73 61 66 65 46 61 69 6c 65 64 20 3d      safeFailed =
2dfb0 20 31 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   1;.        rc =
2dfc0 20 74 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20   trc;.      }.  
2dfd0 20 20 7d 0a 20 20 20 20 66 72 65 65 28 74 44 62    }.    free(tDb
2dfe0 50 61 74 68 29 3b 0a 20 20 7d 20 65 6c 73 65 20  Path);.  } else 
2dff0 7b 0a 20 20 20 20 72 63 20 3d 20 70 46 69 6c 65  {.    rc = pFile
2e000 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 54 72 75 6e  ->pMethod->xTrun
2e010 63 61 74 65 28 69 64 2c 20 0a 20 20 20 20 20 20  cate(id, .      
2e020 20 20 20 20 20 28 28 70 46 69 6c 65 2d 3e 66 73       ((pFile->fs
2e030 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  Flags & SQLITE_F
2e040 53 46 4c 41 47 53 5f 49 53 5f 4d 53 44 4f 53 29  SFLAGS_IS_MSDOS)
2e050 20 21 3d 20 30 29 20 3f 20 31 4c 20 3a 20 30 4c   != 0) ? 1L : 0L
2e060 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  );.    if( rc ){
2e070 0a 20 20 20 20 20 20 73 61 66 65 46 61 69 6c 65  .      safeFaile
2e080 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  d = 1;.    }.  }
2e090 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
2e0a0 45 5f 4f 4b 20 7c 7c 20 66 6f 72 63 65 20 29 7b  E_OK || force ){
2e0b0 0a 20 20 20 20 72 63 20 3d 20 75 6e 69 78 49 6e  .    rc = unixIn
2e0c0 76 61 6c 69 64 61 74 65 53 75 70 70 6f 72 74 46  validateSupportF
2e0d0 69 6c 65 73 28 70 46 69 6c 65 2c 20 30 29 3b 0a  iles(pFile, 0);.
2e0e0 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
2e0f0 20 20 20 20 73 61 66 65 46 61 69 6c 65 64 20 3d      safeFailed =
2e100 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   1;.    }.  }.  
2e110 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e  pFile->pMethod->
2e120 78 53 79 6e 63 28 69 64 2c 20 53 51 4c 49 54 45  xSync(id, SQLITE
2e130 5f 53 59 4e 43 5f 46 55 4c 4c 29 3b 0a 0a 0a 20  _SYNC_FULL);... 
2e140 20 69 66 28 20 69 73 43 6f 72 72 75 70 74 20 29   if( isCorrupt )
2e150 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 64 65 6d  {.    sqlite3dem
2e160 6f 5f 73 75 70 65 72 75 6e 6c 6f 63 6b 5f 63 6f  o_superunlock_co
2e170 72 72 75 70 74 28 69 64 2c 20 63 6f 72 72 75 70  rrupt(id, corrup
2e180 74 46 69 6c 65 4c 6f 63 6b 29 3b 0a 20 20 7d 65  tFileLock);.  }e
2e190 6c 73 65 20 69 66 28 20 70 4c 6f 63 6b 20 29 7b  lse if( pLock ){
2e1a0 0a 20 20 20 20 73 71 6c 69 74 65 33 64 65 6d 6f  .    sqlite3demo
2e1b0 5f 73 75 70 65 72 75 6e 6c 6f 63 6b 28 70 4c 6f  _superunlock(pLo
2e1c0 63 6b 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ck);.  }else{.  
2e1d0 20 20 61 73 73 65 72 74 28 66 6f 72 63 65 29 3b    assert(force);
2e1e0 0a 20 20 7d 0a 20 20 0a 20 20 69 66 28 20 66 6f  .  }.  .  if( fo
2e1f0 72 63 65 20 26 26 20 73 61 66 65 46 61 69 6c 65  rce && safeFaile
2e200 64 29 7b 0a 20 20 20 20 72 63 20 3d 20 75 6e 69  d){.    rc = uni
2e210 78 55 6e 73 61 66 65 54 72 75 6e 63 61 74 65 44  xUnsafeTruncateD
2e220 61 74 61 62 61 73 65 28 70 46 69 6c 65 29 3b 0a  atabase(pFile);.
2e230 20 20 7d 0a 20 20 0a 20 20 72 65 74 75 72 6e 20    }.  .  return 
2e240 72 63 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2a 20 4c 6f  rc;.}../*. ** Lo
2e250 63 6b 20 6c 6f 63 61 74 69 6f 6e 73 20 66 6f 72  ck locations for
2e260 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6c   shared-memory l
2e270 6f 63 6b 73 20 75 73 65 64 20 62 79 20 57 41 4c  ocks used by WAL
2e280 20 6d 6f 64 65 2e 0a 20 2a 2f 0a 23 69 66 6e 64   mode.. */.#ifnd
2e290 65 66 20 53 48 4d 5f 42 41 53 45 0a 23 20 64 65  ef SHM_BASE.# de
2e2a0 66 69 6e 65 20 53 48 4d 5f 42 41 53 45 20 20 20  fine SHM_BASE   
2e2b0 20 20 20 20 20 20 20 31 32 30 0a 23 20 64 65 66         120.# def
2e2c0 69 6e 65 20 53 48 4d 5f 57 52 49 54 45 20 20 20  ine SHM_WRITE   
2e2d0 20 20 20 20 20 20 53 48 4d 5f 42 41 53 45 0a 23        SHM_BASE.#
2e2e0 20 64 65 66 69 6e 65 20 53 48 4d 5f 43 48 45 43   define SHM_CHEC
2e2f0 4b 50 4f 49 4e 54 20 20 20 20 28 53 48 4d 5f 42  KPOINT    (SHM_B
2e300 41 53 45 2b 31 29 0a 23 20 64 65 66 69 6e 65 20  ASE+1).# define 
2e310 53 48 4d 5f 52 45 43 4f 56 45 52 20 20 20 20 20  SHM_RECOVER     
2e320 20 20 28 53 48 4d 5f 42 41 53 45 2b 32 29 0a 23    (SHM_BASE+2).#
2e330 20 64 65 66 69 6e 65 20 53 48 4d 5f 52 45 41 44   define SHM_READ
2e340 5f 46 49 52 53 54 20 20 20 20 28 53 48 4d 5f 42  _FIRST    (SHM_B
2e350 41 53 45 2b 33 29 0a 23 20 64 65 66 69 6e 65 20  ASE+3).# define 
2e360 53 48 4d 5f 52 45 41 44 5f 53 49 5a 45 20 20 20  SHM_READ_SIZE   
2e370 20 20 35 0a 23 65 6e 64 69 66 20 2f 2a 20 53 48    5.#endif /* SH
2e380 4d 5f 42 41 53 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  M_BASE */../*.**
2e390 20 54 68 69 73 20 74 65 73 74 20 6f 6e 6c 79 20   This test only 
2e3a0 77 6f 72 6b 73 20 66 6f 72 20 6c 6f 63 6b 20 74  works for lock t
2e3b0 65 73 74 69 6e 67 20 6f 6e 20 75 6e 69 78 2f 70  esting on unix/p
2e3c0 6f 73 69 78 20 56 46 53 2e 0a 2a 2a 20 41 64 61  osix VFS..** Ada
2e3d0 70 74 65 64 20 66 72 6f 6d 20 74 6f 6f 6c 2f 67  pted from tool/g
2e3e0 65 74 6c 6f 63 6b 2e 63 20 66 34 63 33 39 62 36  etlock.c f4c39b6
2e3f0 35 31 33 37 30 31 35 36 63 61 65 39 37 39 35 30  51370156cae97950
2e400 31 61 37 62 31 35 36 62 64 62 61 35 30 65 37 63  1a7b156bdba50e7c
2e410 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  e.*/.static int 
2e420 75 6e 69 78 4c 6f 63 6b 73 74 61 74 65 50 69 64  unixLockstatePid
2e430 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65  (unixFile *pFile
2e440 2c 20 70 69 64 5f 74 20 70 69 64 2c 20 69 6e 74  , pid_t pid, int
2e450 20 2a 70 4c 6f 63 6b 73 74 61 74 65 29 7b 0a 20   *pLockstate){. 
2e460 20 69 6e 74 20 68 44 62 3b 20 20 20 20 20 20 20   int hDb;       
2e470 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70   /* File descrip
2e480 74 6f 72 20 66 6f 72 20 74 68 65 20 6f 70 65 6e  tor for the open
2e490 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
2e4a0 2f 0a 20 20 69 6e 74 20 68 53 68 6d 20 3d 20 2d  /.  int hShm = -
2e4b0 31 3b 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63  1;  /* File desc
2e4c0 72 69 70 74 6f 72 20 66 6f 72 20 57 41 4c 20 73  riptor for WAL s
2e4d0 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c  hared-memory fil
2e4e0 65 20 2a 2f 0a 20 20 73 73 69 7a 65 5f 74 20 67  e */.  ssize_t g
2e4f0 6f 74 3b 20 20 20 20 2f 2a 20 42 79 74 65 73 20  ot;    /* Bytes 
2e500 72 65 61 64 20 66 72 6f 6d 20 68 65 61 64 65 72  read from header
2e510 20 2a 2f 0a 20 20 69 6e 74 20 69 73 57 61 6c 20   */.  int isWal 
2e520 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
2e530 20 2f 2a 20 54 72 75 65 20 69 66 20 69 6e 20 57   /* True if in W
2e540 41 4c 20 6d 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  AL mode */.  int
2e550 20 6e 4c 6f 63 6b 20 3d 20 30 3b 20 20 20 20 20   nLock = 0;     
2e560 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2e570 72 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20  r of locks held 
2e580 2a 2f 0a 20 20 69 6e 74 20 6e 6f 48 64 72 20 3d  */.  int noHdr =
2e590 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
2e5a0 2f 2a 20 5a 65 72 6f 20 62 79 74 65 20 44 42 20  /* Zero byte DB 
2e5b0 68 61 73 20 6e 6f 20 68 65 61 64 65 72 20 2a 2f  has no header */
2e5c0 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
2e5d0 20 61 48 64 72 5b 31 30 30 5d 3b 20 20 20 2f 2a   aHdr[100];   /*
2e5e0 20 44 61 74 61 62 61 73 65 20 68 65 61 64 65 72   Database header
2e5f0 20 2a 2f 0a 20 20 0a 20 20 61 73 73 65 72 74 28   */.  .  assert(
2e600 70 4c 6f 63 6b 73 74 61 74 65 29 3b 0a 20 20 0a  pLockstate);.  .
2e610 20 20 2f 2a 20 6d 61 6b 65 20 73 75 72 65 20 77    /* make sure w
2e620 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69  e are dealing wi
2e630 74 68 20 61 20 64 61 74 61 62 61 73 65 20 66 69  th a database fi
2e640 6c 65 20 2a 2f 0a 20 20 68 44 62 20 3d 20 70 46  le */.  hDb = pF
2e650 69 6c 65 2d 3e 68 3b 0a 20 20 69 66 28 20 68 44  ile->h;.  if( hD
2e660 62 3c 30 20 29 7b 0a 20 20 20 20 2a 70 4c 6f 63  b<0 ){.    *pLoc
2e670 6b 73 74 61 74 65 20 3d 20 53 51 4c 49 54 45 5f  kstate = SQLITE_
2e680 4c 4f 43 4b 53 54 41 54 45 5f 45 52 52 4f 52 3b  LOCKSTATE_ERROR;
2e690 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2e6a0 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  TE_ERROR;.  }.  
2e6b0 61 73 73 65 72 74 28 20 28 73 74 72 6c 65 6e 28  assert( (strlen(
2e6c0 53 51 4c 49 54 45 5f 46 49 4c 45 5f 48 45 41 44  SQLITE_FILE_HEAD
2e6d0 45 52 29 2b 31 29 3d 3d 53 51 4c 49 54 45 5f 46  ER)+1)==SQLITE_F
2e6e0 49 4c 45 5f 48 45 41 44 45 52 5f 4c 45 4e 20 29  ILE_HEADER_LEN )
2e6f0 3b 0a 20 20 67 6f 74 20 3d 20 70 72 65 61 64 28  ;.  got = pread(
2e700 68 44 62 2c 20 61 48 64 72 2c 20 31 30 30 2c 20  hDb, aHdr, 100, 
2e710 30 29 3b 0a 20 20 69 66 28 20 67 6f 74 3c 30 20  0);.  if( got<0 
2e720 29 7b 0a 20 20 20 20 2a 70 4c 6f 63 6b 73 74 61  ){.    *pLocksta
2e730 74 65 20 3d 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  te = SQLITE_LOCK
2e740 53 54 41 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  STATE_ERROR;.   
2e750 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
2e760 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
2e770 67 6f 74 3d 3d 30 20 29 7b 0a 20 20 20 20 6e 6f  got==0 ){.    no
2e780 48 64 72 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  Hdr = 1;.  }else
2e790 20 69 66 28 20 67 6f 74 21 3d 31 30 30 0a 20 20   if( got!=100.  
2e7a0 20 20 20 20 20 20 20 7c 7c 20 6d 65 6d 63 6d 70         || memcmp
2e7b0 28 61 48 64 72 2c 20 53 51 4c 49 54 45 5f 46 49  (aHdr, SQLITE_FI
2e7c0 4c 45 5f 48 45 41 44 45 52 2c 20 53 51 4c 49 54  LE_HEADER, SQLIT
2e7d0 45 5f 46 49 4c 45 5f 48 45 41 44 45 52 5f 4c 45  E_FILE_HEADER_LE
2e7e0 4e 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 2a  N)!=0.  ){.    *
2e7f0 70 4c 6f 63 6b 73 74 61 74 65 20 3d 20 53 51 4c  pLockstate = SQL
2e800 49 54 45 5f 4c 4f 43 4b 53 54 41 54 45 5f 4e 4f  ITE_LOCKSTATE_NO
2e810 54 41 44 42 3b 0a 20 20 20 20 72 65 74 75 72 6e  TADB;.    return
2e820 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a   SQLITE_NOTADB;.
2e830 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 46 69 72 73    }.  .  /* Firs
2e840 74 20 63 68 65 63 6b 20 66 6f 72 20 61 6e 20 65  t check for an e
2e850 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 2a 2f  xclusive lock */
2e860 0a 20 20 6e 4c 6f 63 6b 20 2b 3d 20 75 6e 69 78  .  nLock += unix
2e870 49 73 4c 6f 63 6b 65 64 28 70 69 64 2c 20 68 44  IsLocked(pid, hD
2e880 62 2c 20 46 5f 52 44 4c 43 4b 2c 20 53 48 41 52  b, F_RDLCK, SHAR
2e890 45 44 5f 46 49 52 53 54 2c 20 53 48 41 52 45 44  ED_FIRST, SHARED
2e8a0 5f 53 49 5a 45 2c 0a 20 20 20 20 20 20 20 20 20  _SIZE,.         
2e8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
2e8c0 45 58 43 4c 55 53 49 56 45 22 29 3b 0a 20 20 69  EXCLUSIVE");.  i
2e8d0 66 20 28 21 6e 6f 48 64 72 29 20 7b 0a 20 20 20  f (!noHdr) {.   
2e8e0 20 69 73 57 61 6c 20 3d 20 61 48 64 72 5b 31 38   isWal = aHdr[18
2e8f0 5d 3d 3d 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ]==2;.  }.  if( 
2e900 6e 4c 6f 63 6b 3d 3d 30 20 26 26 20 69 73 57 61  nLock==0 && isWa
2e910 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 52  l==0 ){.    /* R
2e920 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 20 2a 2f 0a  ollback mode */.
2e930 20 20 20 20 6e 4c 6f 63 6b 20 2b 3d 20 75 6e 69      nLock += uni
2e940 78 49 73 4c 6f 63 6b 65 64 28 70 69 64 2c 20 68  xIsLocked(pid, h
2e950 44 62 2c 20 46 5f 57 52 4c 43 4b 2c 20 50 45 4e  Db, F_WRLCK, PEN
2e960 44 49 4e 47 5f 42 59 54 45 2c 20 53 48 41 52 45  DING_BYTE, SHARE
2e970 44 5f 53 49 5a 45 2b 32 2c 0a 20 20 20 20 20 20  D_SIZE+2,.      
2e980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e990 20 20 20 20 22 50 45 4e 44 49 4e 47 7c 52 45 53      "PENDING|RES
2e9a0 45 52 56 45 44 7c 53 48 41 52 45 44 22 29 3b 0a  ERVED|SHARED");.
2e9b0 20 20 7d 0a 20 20 69 66 28 20 6e 4c 6f 63 6b 3d    }.  if( nLock=
2e9c0 3d 30 20 26 26 20 69 73 57 61 6c 21 3d 30 20 29  =0 && isWal!=0 )
2e9d0 7b 0a 20 20 20 20 2f 2a 20 6c 6f 6f 6b 75 70 20  {.    /* lookup 
2e9e0 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
2e9f0 74 6f 72 20 66 6f 72 20 74 68 65 20 73 68 61 72  tor for the shar
2ea00 65 64 20 6d 65 6d 6f 72 79 20 66 69 6c 65 20 69  ed memory file i
2ea10 66 20 77 65 20 68 61 76 65 20 69 74 20 6f 70 65  f we have it ope
2ea20 6e 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 69 73  n.    ** in this
2ea30 20 70 72 6f 63 65 73 73 20 2a 2f 0a 20 20 20 20   process */.    
2ea40 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
2ea50 3b 20 2f 2a 20 42 65 63 61 75 73 65 20 70 46 69  ; /* Because pFi
2ea60 6c 65 2d 3e 70 49 6e 6f 64 65 20 69 73 20 73 68  le->pInode is sh
2ea70 61 72 65 64 20 61 63 72 6f 73 73 20 74 68 72 65  ared across thre
2ea80 61 64 73 20 2a 2f 0a 20 20 20 20 75 6e 69 78 53  ads */.    unixS
2ea90 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65  hmNode *pShmNode
2eaa0 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65   = pFile->pInode
2eab0 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 20 20  ->pShmNode;.    
2eac0 69 66 28 20 70 53 68 6d 4e 6f 64 65 20 29 7b 0a  if( pShmNode ){.
2ead0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
2eae0 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f  tex_enter(pShmNo
2eaf0 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20  de->mutex);.    
2eb00 20 20 0a 20 20 20 20 20 20 68 53 68 6d 20 3d 20    .      hShm = 
2eb10 70 53 68 6d 4e 6f 64 65 2d 3e 68 3b 0a 20 20 20  pShmNode->h;.   
2eb20 20 20 20 69 66 28 20 68 53 68 6d 20 3e 3d 20 30     if( hShm >= 0
2eb30 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 75  ){.        if( u
2eb40 6e 69 78 49 73 4c 6f 63 6b 65 64 28 70 69 64 2c  nixIsLocked(pid,
2eb50 20 68 53 68 6d 2c 20 46 5f 52 44 4c 43 4b 2c 20   hShm, F_RDLCK, 
2eb60 53 48 4d 5f 52 45 43 4f 56 45 52 2c 20 31 2c 20  SHM_RECOVER, 1, 
2eb70 22 57 41 4c 2d 52 45 43 4f 56 45 52 59 22 29 20  "WAL-RECOVERY") 
2eb80 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20 75 6e  ||.           un
2eb90 69 78 49 73 4c 6f 63 6b 65 64 28 70 69 64 2c 20  ixIsLocked(pid, 
2eba0 68 53 68 6d 2c 20 46 5f 52 44 4c 43 4b 2c 20 53  hShm, F_RDLCK, S
2ebb0 48 4d 5f 57 52 49 54 45 2c 20 31 2c 20 22 57 41  HM_WRITE, 1, "WA
2ebc0 4c 2d 57 52 49 54 45 22 29 20 29 7b 0a 20 20 20  L-WRITE") ){.   
2ebd0 20 20 20 20 20 20 20 6e 4c 6f 63 6b 20 3d 20 31         nLock = 1
2ebe0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2ebf0 20 20 7d 0a 20 20 20 20 20 20 0a 20 20 20 20 20    }.      .     
2ec00 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
2ec10 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d  eave(pShmNode->m
2ec20 75 74 65 78 29 3b 0a 20 20 20 20 7d 20 0a 20 20  utex);.    } .  
2ec30 20 20 0a 20 20 20 20 69 66 28 20 68 53 68 6d 3c    .    if( hShm<
2ec40 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 74 68  0 ){.      /* th
2ec50 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  e shared memory 
2ec60 66 69 6c 65 20 69 73 6e 27 74 20 6f 70 65 6e 20  file isn't open 
2ec70 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 20  in this process 
2ec80 73 70 61 63 65 2c 20 6f 70 65 6e 20 6f 75 72 0a  space, open our.
2ec90 20 20 20 20 20 20 2a 2a 20 6f 77 6e 20 46 44 20        ** own FD 
2eca0 2a 2f 0a 20 20 20 20 20 20 63 68 61 72 20 7a 53  */.      char zS
2ecb0 68 6d 5b 4d 41 58 50 41 54 48 4c 45 4e 5d 3b 0a  hm[MAXPATHLEN];.
2ecc0 20 20 20 20 20 20 0a 20 20 20 20 20 20 2f 2a 20        .      /* 
2ecd0 57 41 4c 20 6d 6f 64 65 20 2a 2f 0a 20 20 20 20  WAL mode */.    
2ece0 20 20 73 74 72 6c 63 70 79 28 7a 53 68 6d 2c 20    strlcpy(zShm, 
2ecf0 70 46 69 6c 65 2d 3e 7a 50 61 74 68 2c 20 4d 41  pFile->zPath, MA
2ed00 58 50 41 54 48 4c 45 4e 29 3b 0a 20 20 20 20 20  XPATHLEN);.     
2ed10 20 73 74 72 6c 63 61 74 28 7a 53 68 6d 2c 20 22   strlcat(zShm, "
2ed20 2d 73 68 6d 22 2c 20 4d 41 58 50 41 54 48 4c 45  -shm", MAXPATHLE
2ed30 4e 29 3b 0a 20 20 20 20 20 20 68 53 68 6d 20 3d  N);.      hShm =
2ed40 20 6f 70 65 6e 28 7a 53 68 6d 2c 20 4f 5f 52 44   open(zShm, O_RD
2ed50 4f 4e 4c 59 2c 20 30 29 3b 0a 20 20 20 20 20 20  ONLY, 0);.      
2ed60 69 66 28 20 68 53 68 6d 3c 30 20 29 7b 0a 20 20  if( hShm<0 ){.  
2ed70 20 20 20 20 20 20 2a 70 4c 6f 63 6b 73 74 61 74        *pLockstat
2ed80 65 20 3d 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 53  e = SQLITE_LOCKS
2ed90 54 41 54 45 5f 4f 46 46 3b 0a 20 20 20 20 20 20  TATE_OFF;.      
2eda0 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
2edb0 28 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  ();.        retu
2edc0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
2edd0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
2ede0 75 6e 69 78 49 73 4c 6f 63 6b 65 64 28 70 69 64  unixIsLocked(pid
2edf0 2c 20 68 53 68 6d 2c 20 46 5f 52 44 4c 43 4b 2c  , hShm, F_RDLCK,
2ee00 20 53 48 4d 5f 52 45 43 4f 56 45 52 2c 20 31 2c   SHM_RECOVER, 1,
2ee10 20 22 57 41 4c 2d 52 45 43 4f 56 45 52 59 22 29   "WAL-RECOVERY")
2ee20 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 75 6e 69   ||.         uni
2ee30 78 49 73 4c 6f 63 6b 65 64 28 70 69 64 2c 20 68  xIsLocked(pid, h
2ee40 53 68 6d 2c 20 46 5f 52 44 4c 43 4b 2c 20 53 48  Shm, F_RDLCK, SH
2ee50 4d 5f 57 52 49 54 45 2c 20 31 2c 20 22 57 41 4c  M_WRITE, 1, "WAL
2ee60 2d 57 52 49 54 45 22 29 20 29 7b 0a 20 20 20 20  -WRITE") ){.    
2ee70 20 20 20 20 6e 4c 6f 63 6b 20 3d 20 31 3b 0a 20      nLock = 1;. 
2ee80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 6c 6f       }.      clo
2ee90 73 65 28 68 53 68 6d 29 3b 0a 20 20 20 20 7d 0a  se(hShm);.    }.
2eea0 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74      unixLeaveMut
2eeb0 65 78 28 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ex();.  }.  if( 
2eec0 6e 4c 6f 63 6b 3e 30 20 29 7b 0a 20 20 20 20 2a  nLock>0 ){.    *
2eed0 70 4c 6f 63 6b 73 74 61 74 65 20 3d 20 53 51 4c  pLockstate = SQL
2eee0 49 54 45 5f 4c 4f 43 4b 53 54 41 54 45 5f 4f 4e  ITE_LOCKSTATE_ON
2eef0 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20  ;.  } else {.   
2ef00 20 2a 70 4c 6f 63 6b 73 74 61 74 65 20 3d 20 53   *pLockstate = S
2ef10 51 4c 49 54 45 5f 4c 4f 43 4b 53 54 41 54 45 5f  QLITE_LOCKSTATE_
2ef20 4f 46 46 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  OFF;.  }.  retur
2ef30 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
2ef40 23 65 6e 64 69 66 20 2f 2a 20 28 53 51 4c 49 54  #endif /* (SQLIT
2ef50 45 5f 45 4e 41 42 4c 45 5f 41 50 50 4c 45 5f 53  E_ENABLE_APPLE_S
2ef60 50 49 3e 30 29 20 26 26 20 64 65 66 69 6e 65 64  PI>0) && defined
2ef70 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 2a 2f 0a 0a  (__APPLE__) */..
2ef80 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d  #if SQLITE_MAX_M
2ef90 4d 41 50 5f 53 49 5a 45 3e 30 0a 2f 2a 0a 2a 2a  MAP_SIZE>0./*.**
2efa0 20 49 66 20 69 74 20 69 73 20 63 75 72 72 65 6e   If it is curren
2efb0 74 6c 79 20 6d 65 6d 6f 72 79 20 6d 61 70 70 65  tly memory mappe
2efc0 64 2c 20 75 6e 6d 61 70 20 66 69 6c 65 20 70 46  d, unmap file pF
2efd0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
2efe0 64 20 75 6e 69 78 55 6e 6d 61 70 66 69 6c 65 28  d unixUnmapfile(
2eff0 75 6e 69 78 46 69 6c 65 20 2a 70 46 64 29 7b 0a  unixFile *pFd){.
2f000 20 20 61 73 73 65 72 74 28 20 70 46 64 2d 3e 6e    assert( pFd->n
2f010 46 65 74 63 68 4f 75 74 3d 3d 30 20 29 3b 0a 20  FetchOut==0 );. 
2f020 20 69 66 28 20 70 46 64 2d 3e 70 4d 61 70 52 65   if( pFd->pMapRe
2f030 67 69 6f 6e 20 29 7b 0a 20 20 20 20 6f 73 4d 75  gion ){.    osMu
2f040 6e 6d 61 70 28 70 46 64 2d 3e 70 4d 61 70 52 65  nmap(pFd->pMapRe
2f050 67 69 6f 6e 2c 20 70 46 64 2d 3e 6d 6d 61 70 53  gion, pFd->mmapS
2f060 69 7a 65 41 63 74 75 61 6c 29 3b 0a 20 20 20 20  izeActual);.    
2f070 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20  pFd->pMapRegion 
2f080 3d 20 30 3b 0a 20 20 20 20 70 46 64 2d 3e 6d 6d  = 0;.    pFd->mm
2f090 61 70 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20  apSize = 0;.    
2f0a0 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74  pFd->mmapSizeAct
2f0b0 75 61 6c 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a  ual = 0;.  }.}..
2f0c0 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f  /*.** Attempt to
2f0d0 20 73 65 74 20 74 68 65 20 73 69 7a 65 20 6f 66   set the size of
2f0e0 20 74 68 65 20 6d 65 6d 6f 72 79 20 6d 61 70 70   the memory mapp
2f0f0 69 6e 67 20 6d 61 69 6e 74 61 69 6e 65 64 20 62  ing maintained b
2f100 79 20 66 69 6c 65 20 0a 2a 2a 20 64 65 73 63 72  y file .** descr
2f110 69 70 74 6f 72 20 70 46 64 20 74 6f 20 6e 4e 65  iptor pFd to nNe
2f120 77 20 62 79 74 65 73 2e 20 41 6e 79 20 65 78 69  w bytes. Any exi
2f130 73 74 69 6e 67 20 6d 61 70 70 69 6e 67 20 69 73  sting mapping is
2f140 20 64 69 73 63 61 72 64 65 64 2e 0a 2a 2a 0a 2a   discarded..**.*
2f150 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
2f160 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73   this function s
2f170 65 74 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ets the followin
2f180 67 20 76 61 72 69 61 62 6c 65 73 3a 0a 2a 2a 0a  g variables:.**.
2f190 2a 2a 20 20 20 20 20 20 20 75 6e 69 78 46 69 6c  **       unixFil
2f1a0 65 2e 70 4d 61 70 52 65 67 69 6f 6e 0a 2a 2a 20  e.pMapRegion.** 
2f1b0 20 20 20 20 20 20 75 6e 69 78 46 69 6c 65 2e 6d        unixFile.m
2f1c0 6d 61 70 53 69 7a 65 0a 2a 2a 20 20 20 20 20 20  mapSize.**      
2f1d0 20 75 6e 69 78 46 69 6c 65 2e 6d 6d 61 70 53 69   unixFile.mmapSi
2f1e0 7a 65 41 63 74 75 61 6c 0a 2a 2a 0a 2a 2a 20 49  zeActual.**.** I
2f1f0 66 20 75 6e 73 75 63 63 65 73 73 66 75 6c 2c 20  f unsuccessful, 
2f200 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
2f210 20 69 73 20 6c 6f 67 67 65 64 20 76 69 61 20 73   is logged via s
2f220 71 6c 69 74 65 33 5f 6c 6f 67 28 29 20 61 6e 64  qlite3_log() and
2f230 0a 2a 2a 20 74 68 65 20 74 68 72 65 65 20 76 61  .** the three va
2f240 72 69 61 62 6c 65 73 20 61 62 6f 76 65 20 61 72  riables above ar
2f250 65 20 7a 65 72 6f 65 64 2e 20 49 6e 20 74 68 69  e zeroed. In thi
2f260 73 20 63 61 73 65 20 53 51 4c 69 74 65 20 73 68  s case SQLite sh
2f270 6f 75 6c 64 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65  ould.** continue
2f280 20 61 63 63 65 73 73 69 6e 67 20 74 68 65 20 64   accessing the d
2f290 61 74 61 62 61 73 65 20 75 73 69 6e 67 20 74 68  atabase using th
2f2a0 65 20 78 52 65 61 64 28 29 20 61 6e 64 20 78 57  e xRead() and xW
2f2b0 72 69 74 65 28 29 0a 2a 2a 20 6d 65 74 68 6f 64  rite().** method
2f2c0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
2f2d0 64 20 75 6e 69 78 52 65 6d 61 70 66 69 6c 65 28  d unixRemapfile(
2f2e0 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 64  .  unixFile *pFd
2f2f0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2f300 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72     /* File descr
2f310 69 70 74 6f 72 20 6f 62 6a 65 63 74 20 2a 2f 0a  iptor object */.
2f320 20 20 69 36 34 20 6e 4e 65 77 20 20 20 20 20 20    i64 nNew      
2f330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f340 20 20 2f 2a 20 52 65 71 75 69 72 65 64 20 6d 61    /* Required ma
2f350 70 70 69 6e 67 20 73 69 7a 65 20 2a 2f 0a 29 7b  pping size */.){
2f360 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
2f370 45 72 72 20 3d 20 22 6d 6d 61 70 22 3b 0a 20 20  Err = "mmap";.  
2f380 69 6e 74 20 68 20 3d 20 70 46 64 2d 3e 68 3b 20  int h = pFd->h; 
2f390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f3a0 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73       /* File des
2f3b0 63 72 69 70 74 6f 72 20 6f 70 65 6e 20 6f 6e 20  criptor open on 
2f3c0 64 62 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20  db file */.  u8 
2f3d0 2a 70 4f 72 69 67 20 3d 20 28 75 38 20 2a 29 70  *pOrig = (u8 *)p
2f3e0 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 3b 20  Fd->pMapRegion; 
2f3f0 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
2f400 63 75 72 72 65 6e 74 20 66 69 6c 65 20 6d 61 70  current file map
2f410 70 69 6e 67 20 2a 2f 0a 20 20 69 36 34 20 6e 4f  ping */.  i64 nO
2f420 72 69 67 20 3d 20 70 46 64 2d 3e 6d 6d 61 70 53  rig = pFd->mmapS
2f430 69 7a 65 41 63 74 75 61 6c 3b 20 20 20 20 20 2f  izeActual;     /
2f440 2a 20 53 69 7a 65 20 6f 66 20 70 4f 72 69 67 20  * Size of pOrig 
2f450 72 65 67 69 6f 6e 20 69 6e 20 62 79 74 65 73 20  region in bytes 
2f460 2a 2f 0a 20 20 75 38 20 2a 70 4e 65 77 20 3d 20  */.  u8 *pNew = 
2f470 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
2f480 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63            /* Loc
2f490 61 74 69 6f 6e 20 6f 66 20 6e 65 77 20 6d 61 70  ation of new map
2f4a0 70 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  ping */.  int fl
2f4b0 61 67 73 20 3d 20 50 52 4f 54 5f 52 45 41 44 3b  ags = PROT_READ;
2f4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2f4d0 2a 20 46 6c 61 67 73 20 74 6f 20 70 61 73 73 20  * Flags to pass 
2f4e0 74 6f 20 6d 6d 61 70 28 29 20 2a 2f 0a 0a 20 20  to mmap() */..  
2f4f0 61 73 73 65 72 74 28 20 70 46 64 2d 3e 6e 46 65  assert( pFd->nFe
2f500 74 63 68 4f 75 74 3d 3d 30 20 29 3b 0a 20 20 61  tchOut==0 );.  a
2f510 73 73 65 72 74 28 20 6e 4e 65 77 3e 70 46 64 2d  ssert( nNew>pFd-
2f520 3e 6d 6d 61 70 53 69 7a 65 20 29 3b 0a 20 20 61  >mmapSize );.  a
2f530 73 73 65 72 74 28 20 6e 4e 65 77 3c 3d 70 46 64  ssert( nNew<=pFd
2f540 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20 29 3b  ->mmapSizeMax );
2f550 0a 20 20 61 73 73 65 72 74 28 20 6e 4e 65 77 3e  .  assert( nNew>
2f560 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
2f570 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75  Fd->mmapSizeActu
2f580 61 6c 3e 3d 70 46 64 2d 3e 6d 6d 61 70 53 69 7a  al>=pFd->mmapSiz
2f590 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 4d  e );.  assert( M
2f5a0 41 50 5f 46 41 49 4c 45 44 21 3d 30 20 29 3b 0a  AP_FAILED!=0 );.
2f5b0 0a 20 20 69 66 28 20 28 70 46 64 2d 3e 63 74 72  .  if( (pFd->ctr
2f5c0 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c  lFlags & UNIXFIL
2f5d0 45 5f 52 44 4f 4e 4c 59 29 3d 3d 30 20 29 20 66  E_RDONLY)==0 ) f
2f5e0 6c 61 67 73 20 7c 3d 20 50 52 4f 54 5f 57 52 49  lags |= PROT_WRI
2f5f0 54 45 3b 0a 0a 20 20 69 66 28 20 70 4f 72 69 67  TE;..  if( pOrig
2f600 20 29 7b 0a 23 69 66 20 48 41 56 45 5f 4d 52 45   ){.#if HAVE_MRE
2f610 4d 41 50 0a 20 20 20 20 69 36 34 20 6e 52 65 75  MAP.    i64 nReu
2f620 73 65 20 3d 20 70 46 64 2d 3e 6d 6d 61 70 53 69  se = pFd->mmapSi
2f630 7a 65 3b 0a 23 65 6c 73 65 0a 20 20 20 20 63 6f  ze;.#else.    co
2f640 6e 73 74 20 69 6e 74 20 73 7a 53 79 73 70 61 67  nst int szSyspag
2f650 65 20 3d 20 6f 73 47 65 74 70 61 67 65 73 69 7a  e = osGetpagesiz
2f660 65 28 29 3b 0a 20 20 20 20 69 36 34 20 6e 52 65  e();.    i64 nRe
2f670 75 73 65 20 3d 20 28 70 46 64 2d 3e 6d 6d 61 70  use = (pFd->mmap
2f680 53 69 7a 65 20 26 20 7e 28 73 7a 53 79 73 70 61  Size & ~(szSyspa
2f690 67 65 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 20  ge-1));.#endif. 
2f6a0 20 20 20 75 38 20 2a 70 52 65 71 20 3d 20 26 70     u8 *pReq = &p
2f6b0 4f 72 69 67 5b 6e 52 65 75 73 65 5d 3b 0a 0a 20  Orig[nReuse];.. 
2f6c0 20 20 20 2f 2a 20 55 6e 6d 61 70 20 61 6e 79 20     /* Unmap any 
2f6d0 70 61 67 65 73 20 6f 66 20 74 68 65 20 65 78 69  pages of the exi
2f6e0 73 74 69 6e 67 20 6d 61 70 70 69 6e 67 20 74 68  sting mapping th
2f6f0 61 74 20 63 61 6e 6e 6f 74 20 62 65 20 72 65 75  at cannot be reu
2f700 73 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  sed. */.    if( 
2f710 6e 52 65 75 73 65 21 3d 6e 4f 72 69 67 20 29 7b  nReuse!=nOrig ){
2f720 0a 20 20 20 20 20 20 6f 73 4d 75 6e 6d 61 70 28  .      osMunmap(
2f730 70 52 65 71 2c 20 6e 4f 72 69 67 2d 6e 52 65 75  pReq, nOrig-nReu
2f740 73 65 29 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20  se);.    }..#if 
2f750 48 41 56 45 5f 4d 52 45 4d 41 50 0a 20 20 20 20  HAVE_MREMAP.    
2f760 70 4e 65 77 20 3d 20 6f 73 4d 72 65 6d 61 70 28  pNew = osMremap(
2f770 70 4f 72 69 67 2c 20 6e 52 65 75 73 65 2c 20 6e  pOrig, nReuse, n
2f780 4e 65 77 2c 20 4d 52 45 4d 41 50 5f 4d 41 59 4d  New, MREMAP_MAYM
2f790 4f 56 45 29 3b 0a 20 20 20 20 7a 45 72 72 20 3d  OVE);.    zErr =
2f7a0 20 22 6d 72 65 6d 61 70 22 3b 0a 23 65 6c 73 65   "mremap";.#else
2f7b0 0a 20 20 20 20 70 4e 65 77 20 3d 20 6f 73 4d 6d  .    pNew = osMm
2f7c0 61 70 28 70 52 65 71 2c 20 6e 4e 65 77 2d 6e 52  ap(pReq, nNew-nR
2f7d0 65 75 73 65 2c 20 66 6c 61 67 73 2c 20 4d 41 50  euse, flags, MAP
2f7e0 5f 53 48 41 52 45 44 2c 20 68 2c 20 6e 52 65 75  _SHARED, h, nReu
2f7f0 73 65 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65  se);.    if( pNe
2f800 77 21 3d 4d 41 50 5f 46 41 49 4c 45 44 20 29 7b  w!=MAP_FAILED ){
2f810 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 21  .      if( pNew!
2f820 3d 70 52 65 71 20 29 7b 0a 20 20 20 20 20 20 20  =pReq ){.       
2f830 20 6f 73 4d 75 6e 6d 61 70 28 70 4e 65 77 2c 20   osMunmap(pNew, 
2f840 6e 4e 65 77 20 2d 20 6e 52 65 75 73 65 29 3b 0a  nNew - nReuse);.
2f850 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 30          pNew = 0
2f860 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
2f870 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 70 4f         pNew = pO
2f880 72 69 67 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  rig;.      }.   
2f890 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f   }.#endif..    /
2f8a0 2a 20 54 68 65 20 61 74 74 65 6d 70 74 20 74 6f  * The attempt to
2f8b0 20 65 78 74 65 6e 64 20 74 68 65 20 65 78 69 73   extend the exis
2f8c0 74 69 6e 67 20 6d 61 70 70 69 6e 67 20 66 61 69  ting mapping fai
2f8d0 6c 65 64 2e 20 46 72 65 65 20 69 74 2e 20 2a 2f  led. Free it. */
2f8e0 0a 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 4d  .    if( pNew==M
2f8f0 41 50 5f 46 41 49 4c 45 44 20 7c 7c 20 70 4e 65  AP_FAILED || pNe
2f900 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6f 73  w==0 ){.      os
2f910 4d 75 6e 6d 61 70 28 70 4f 72 69 67 2c 20 6e 52  Munmap(pOrig, nR
2f920 65 75 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  euse);.    }.  }
2f930 0a 0a 20 20 2f 2a 20 49 66 20 70 4e 65 77 20 69  ..  /* If pNew i
2f940 73 20 73 74 69 6c 6c 20 4e 55 4c 4c 2c 20 74 72  s still NULL, tr
2f950 79 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20 65  y to create an e
2f960 6e 74 69 72 65 6c 79 20 6e 65 77 20 6d 61 70 70  ntirely new mapp
2f970 69 6e 67 2e 20 2a 2f 0a 20 20 69 66 28 20 70 4e  ing. */.  if( pN
2f980 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4e 65  ew==0 ){.    pNe
2f990 77 20 3d 20 6f 73 4d 6d 61 70 28 30 2c 20 6e 4e  w = osMmap(0, nN
2f9a0 65 77 2c 20 66 6c 61 67 73 2c 20 4d 41 50 5f 53  ew, flags, MAP_S
2f9b0 48 41 52 45 44 2c 20 68 2c 20 30 29 3b 0a 20 20  HARED, h, 0);.  
2f9c0 7d 0a 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 4d  }..  if( pNew==M
2f9d0 41 50 5f 46 41 49 4c 45 44 20 29 7b 0a 20 20 20  AP_FAILED ){.   
2f9e0 20 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 6e   pNew = 0;.    n
2f9f0 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 75 6e 69  New = 0;.    uni
2fa00 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  xLogError(SQLITE
2fa10 5f 4f 4b 2c 20 7a 45 72 72 2c 20 70 46 64 2d 3e  _OK, zErr, pFd->
2fa20 7a 50 61 74 68 29 3b 0a 0a 20 20 20 20 2f 2a 20  zPath);..    /* 
2fa30 49 66 20 74 68 65 20 6d 6d 61 70 28 29 20 61 62  If the mmap() ab
2fa40 6f 76 65 20 66 61 69 6c 65 64 2c 20 61 73 73 75  ove failed, assu
2fa50 6d 65 20 74 68 61 74 20 61 6c 6c 20 73 75 62 73  me that all subs
2fa60 65 71 75 65 6e 74 20 6d 6d 61 70 28 29 20 63 61  equent mmap() ca
2fa70 6c 6c 73 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20  lls.    ** will 
2fa80 70 72 6f 62 61 62 6c 79 20 66 61 69 6c 20 74 6f  probably fail to
2fa90 6f 2e 20 46 61 6c 6c 20 62 61 63 6b 20 74 6f 20  o. Fall back to 
2faa0 75 73 69 6e 67 20 78 52 65 61 64 2f 78 57 72 69  using xRead/xWri
2fab0 74 65 20 65 78 63 6c 75 73 69 76 65 6c 79 0a 20  te exclusively. 
2fac0 20 20 20 2a 2a 20 69 6e 20 74 68 69 73 20 63 61     ** in this ca
2fad0 73 65 2e 20 20 2a 2f 0a 20 20 20 20 70 46 64 2d  se.  */.    pFd-
2fae0 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20 3d 20 30  >mmapSizeMax = 0
2faf0 3b 0a 20 20 7d 0a 20 20 70 46 64 2d 3e 70 4d 61  ;.  }.  pFd->pMa
2fb00 70 52 65 67 69 6f 6e 20 3d 20 28 76 6f 69 64 20  pRegion = (void 
2fb10 2a 29 70 4e 65 77 3b 0a 20 20 70 46 64 2d 3e 6d  *)pNew;.  pFd->m
2fb20 6d 61 70 53 69 7a 65 20 3d 20 70 46 64 2d 3e 6d  mapSize = pFd->m
2fb30 6d 61 70 53 69 7a 65 41 63 74 75 61 6c 20 3d 20  mapSizeActual = 
2fb40 6e 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  nNew;.}../*.** M
2fb50 65 6d 6f 72 79 20 6d 61 70 20 6f 72 20 72 65 6d  emory map or rem
2fb60 61 70 20 74 68 65 20 66 69 6c 65 20 6f 70 65 6e  ap the file open
2fb70 65 64 20 62 79 20 66 69 6c 65 2d 64 65 73 63 72  ed by file-descr
2fb80 69 70 74 6f 72 20 70 46 64 20 28 69 66 20 74 68  iptor pFd (if th
2fb90 65 20 66 69 6c 65 0a 2a 2a 20 69 73 20 61 6c 72  e file.** is alr
2fba0 65 61 64 79 20 6d 61 70 70 65 64 2c 20 74 68 65  eady mapped, the
2fbb0 20 65 78 69 73 74 69 6e 67 20 6d 61 70 70 69 6e   existing mappin
2fbc0 67 20 69 73 20 72 65 70 6c 61 63 65 64 20 62 79  g is replaced by
2fbd0 20 74 68 65 20 6e 65 77 29 2e 20 4f 72 2c 20 69   the new). Or, i
2fbe0 66 20 0a 2a 2a 20 74 68 65 72 65 20 61 6c 72 65  f .** there alre
2fbf0 61 64 79 20 65 78 69 73 74 73 20 61 20 6d 61 70  ady exists a map
2fc00 70 69 6e 67 20 66 6f 72 20 74 68 69 73 20 66 69  ping for this fi
2fc10 6c 65 2c 20 61 6e 64 20 74 68 65 72 65 20 61 72  le, and there ar
2fc20 65 20 73 74 69 6c 6c 20 0a 2a 2a 20 6f 75 74 73  e still .** outs
2fc30 74 61 6e 64 69 6e 67 20 78 46 65 74 63 68 28 29  tanding xFetch()
2fc40 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 69   references to i
2fc50 74 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  t, this function
2fc60 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a   is a no-op..**.
2fc70 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72 20  ** If parameter 
2fc80 6e 42 79 74 65 20 69 73 20 6e 6f 6e 2d 6e 65 67  nByte is non-neg
2fc90 61 74 69 76 65 2c 20 74 68 65 6e 20 69 74 20 69  ative, then it i
2fca0 73 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  s the requested 
2fcb0 73 69 7a 65 20 6f 66 20 0a 2a 2a 20 74 68 65 20  size of .** the 
2fcc0 6d 61 70 70 69 6e 67 20 74 6f 20 63 72 65 61 74  mapping to creat
2fcd0 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  e. Otherwise, if
2fce0 20 6e 42 79 74 65 20 69 73 20 6c 65 73 73 20 74   nByte is less t
2fcf0 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74  han zero, then t
2fd00 68 65 20 0a 2a 2a 20 72 65 71 75 65 73 74 65 64  he .** requested
2fd10 20 73 69 7a 65 20 69 73 20 74 68 65 20 73 69 7a   size is the siz
2fd20 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 6f 6e  e of the file on
2fd30 20 64 69 73 6b 2e 20 54 68 65 20 61 63 74 75 61   disk. The actua
2fd40 6c 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a  l size of the.**
2fd50 20 63 72 65 61 74 65 64 20 6d 61 70 70 69 6e 67   created mapping
2fd60 20 69 73 20 65 69 74 68 65 72 20 74 68 65 20 72   is either the r
2fd70 65 71 75 65 73 74 65 64 20 73 69 7a 65 20 6f 72  equested size or
2fd80 20 74 68 65 20 76 61 6c 75 65 20 63 6f 6e 66 69   the value confi
2fd90 67 75 72 65 64 20 0a 2a 2a 20 75 73 69 6e 67 20  gured .** using 
2fda0 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41  SQLITE_FCNTL_MMA
2fdb0 50 5f 4c 49 4d 49 54 2c 20 77 68 69 63 68 65 76  P_LIMIT, whichev
2fdc0 65 72 20 69 73 20 73 6d 61 6c 6c 65 72 2e 0a 2a  er is smaller..*
2fdd0 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  *.** SQLITE_OK i
2fde0 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 6e 6f  s returned if no
2fdf0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 28 65   error occurs (e
2fe00 76 65 6e 20 69 66 20 74 68 65 20 6d 61 70 70 69  ven if the mappi
2fe10 6e 67 20 69 73 20 6e 6f 74 0a 2a 2a 20 72 65 63  ng is not.** rec
2fe20 72 65 61 74 65 64 20 61 73 20 61 20 72 65 73 75  reated as a resu
2fe30 6c 74 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e  lt of outstandin
2fe40 67 20 72 65 66 65 72 65 6e 63 65 73 29 20 6f 72  g references) or
2fe50 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
2fe60 0a 2a 2a 20 63 6f 64 65 20 6f 74 68 65 72 77 69  .** code otherwi
2fe70 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
2fe80 74 20 75 6e 69 78 4d 61 70 66 69 6c 65 28 75 6e  t unixMapfile(un
2fe90 69 78 46 69 6c 65 20 2a 70 46 64 2c 20 69 36 34  ixFile *pFd, i64
2fea0 20 6e 42 79 74 65 29 7b 0a 20 20 69 36 34 20 6e   nByte){.  i64 n
2feb0 4d 61 70 20 3d 20 6e 42 79 74 65 3b 0a 20 20 69  Map = nByte;.  i
2fec0 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
2fed0 28 20 6e 4d 61 70 3e 3d 30 20 7c 7c 20 70 46 64  ( nMap>=0 || pFd
2fee0 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30 20 29  ->nFetchOut==0 )
2fef0 3b 0a 20 20 69 66 28 20 70 46 64 2d 3e 6e 46 65  ;.  if( pFd->nFe
2ff00 74 63 68 4f 75 74 3e 30 20 29 20 72 65 74 75 72  tchOut>0 ) retur
2ff10 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  n SQLITE_OK;..  
2ff20 69 66 28 20 6e 4d 61 70 3c 30 20 29 7b 0a 20 20  if( nMap<0 ){.  
2ff30 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73 74    struct stat st
2ff40 61 74 62 75 66 3b 20 20 20 20 20 20 20 20 20 20  atbuf;          
2ff50 2f 2a 20 4c 6f 77 2d 6c 65 76 65 6c 20 66 69 6c  /* Low-level fil
2ff60 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f  e information */
2ff70 0a 20 20 20 20 72 63 20 3d 20 6f 73 46 73 74 61  .    rc = osFsta
2ff80 74 28 70 46 64 2d 3e 68 2c 20 26 73 74 61 74 62  t(pFd->h, &statb
2ff90 75 66 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  uf);.    if( rc!
2ffa0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2ffb0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2ffc0 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a 20  E_IOERR_FSTAT;. 
2ffd0 20 20 20 7d 0a 20 20 20 20 6e 4d 61 70 20 3d 20     }.    nMap = 
2ffe0 73 74 61 74 62 75 66 2e 73 74 5f 73 69 7a 65 3b  statbuf.st_size;
2fff0 0a 20 20 7d 0a 20 20 69 66 28 20 6e 4d 61 70 3e  .  }.  if( nMap>
30000 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78  pFd->mmapSizeMax
30010 20 29 7b 0a 20 20 20 20 6e 4d 61 70 20 3d 20 70   ){.    nMap = p
30020 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 3b  Fd->mmapSizeMax;
30030 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6e 4d 61 70  .  }..  if( nMap
30040 21 3d 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20  !=pFd->mmapSize 
30050 29 7b 0a 20 20 20 20 69 66 28 20 6e 4d 61 70 3e  ){.    if( nMap>
30060 30 20 29 7b 0a 20 20 20 20 20 20 75 6e 69 78 52  0 ){.      unixR
30070 65 6d 61 70 66 69 6c 65 28 70 46 64 2c 20 6e 4d  emapfile(pFd, nM
30080 61 70 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ap);.    }else{.
30090 20 20 20 20 20 20 75 6e 69 78 55 6e 6d 61 70 66        unixUnmapf
300a0 69 6c 65 28 70 46 64 29 3b 0a 20 20 20 20 7d 0a  ile(pFd);.    }.
300b0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51    }..  return SQ
300c0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
300d0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 41 58 5f  f /* SQLITE_MAX_
300e0 4d 4d 41 50 5f 53 49 5a 45 3e 30 20 2a 2f 0a 0a  MMAP_SIZE>0 */..
300f0 2f 2a 0a 2a 2a 20 49 66 20 70 6f 73 73 69 62 6c  /*.** If possibl
30100 65 2c 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  e, return a poin
30110 74 65 72 20 74 6f 20 61 20 6d 61 70 70 69 6e 67  ter to a mapping
30120 20 6f 66 20 66 69 6c 65 20 66 64 20 73 74 61 72   of file fd star
30130 74 69 6e 67 20 61 74 20 6f 66 66 73 65 74 0a 2a  ting at offset.*
30140 2a 20 69 4f 66 66 2e 20 54 68 65 20 6d 61 70 70  * iOff. The mapp
30150 69 6e 67 20 6d 75 73 74 20 62 65 20 76 61 6c 69  ing must be vali
30160 64 20 66 6f 72 20 61 74 20 6c 65 61 73 74 20 6e  d for at least n
30170 41 6d 74 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a  Amt bytes..**.**
30180 20 49 66 20 73 75 63 68 20 61 20 70 6f 69 6e 74   If such a point
30190 65 72 20 63 61 6e 20 62 65 20 6f 62 74 61 69 6e  er can be obtain
301a0 65 64 2c 20 73 74 6f 72 65 20 69 74 20 69 6e 20  ed, store it in 
301b0 2a 70 70 20 61 6e 64 20 72 65 74 75 72 6e 20 53  *pp and return S
301c0 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 4f 72 2c  QLITE_OK..** Or,
301d0 20 69 66 20 6f 6e 65 20 63 61 6e 6e 6f 74 20 62   if one cannot b
301e0 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75  ut no error occu
301f0 72 73 2c 20 73 65 74 20 2a 70 70 20 74 6f 20 30  rs, set *pp to 0
30200 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49   and return SQLI
30210 54 45 5f 4f 4b 2e 0a 2a 2a 20 46 69 6e 61 6c 6c  TE_OK..** Finall
30220 79 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20 64  y, if an error d
30230 6f 65 73 20 6f 63 63 75 72 2c 20 72 65 74 75 72  oes occur, retur
30240 6e 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  n an SQLite erro
30250 72 20 63 6f 64 65 2e 20 54 68 65 20 66 69 6e 61  r code. The fina
30260 6c 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 2a 70  l.** value of *p
30270 70 20 69 73 20 75 6e 64 65 66 69 6e 65 64 20 69  p is undefined i
30280 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a  n this case..**.
30290 2a 2a 20 49 66 20 74 68 69 73 20 66 75 6e 63 74  ** If this funct
302a0 69 6f 6e 20 64 6f 65 73 20 72 65 74 75 72 6e 20  ion does return 
302b0 61 20 70 6f 69 6e 74 65 72 2c 20 74 68 65 20 63  a pointer, the c
302c0 61 6c 6c 65 72 20 6d 75 73 74 20 65 76 65 6e 74  aller must event
302d0 75 61 6c 6c 79 20 0a 2a 2a 20 72 65 6c 65 61 73  ually .** releas
302e0 65 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  e the reference 
302f0 62 79 20 63 61 6c 6c 69 6e 67 20 75 6e 69 78 55  by calling unixU
30300 6e 66 65 74 63 68 28 29 2e 0a 2a 2f 0a 73 74 61  nfetch()..*/.sta
30310 74 69 63 20 69 6e 74 20 75 6e 69 78 46 65 74 63  tic int unixFetc
30320 68 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  h(sqlite3_file *
30330 66 64 2c 20 69 36 34 20 69 4f 66 66 2c 20 69 6e  fd, i64 iOff, in
30340 74 20 6e 41 6d 74 2c 20 76 6f 69 64 20 2a 2a 70  t nAmt, void **p
30350 70 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  p){.#if SQLITE_M
30360 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20  AX_MMAP_SIZE>0. 
30370 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 64 20 3d   unixFile *pFd =
30380 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 66 64 3b   (unixFile *)fd;
30390 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c     /* The underl
303a0 79 69 6e 67 20 64 61 74 61 62 61 73 65 20 66 69  ying database fi
303b0 6c 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 2a  le */.#endif.  *
303c0 70 70 20 3d 20 30 3b 0a 0a 23 69 66 20 53 51 4c  pp = 0;..#if SQL
303d0 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
303e0 45 3e 30 0a 20 20 69 66 28 20 70 46 64 2d 3e 6d  E>0.  if( pFd->m
303f0 6d 61 70 53 69 7a 65 4d 61 78 3e 30 20 29 7b 0a  mapSizeMax>0 ){.
30400 20 20 20 20 69 66 28 20 70 46 64 2d 3e 70 4d 61      if( pFd->pMa
30410 70 52 65 67 69 6f 6e 3d 3d 30 20 29 7b 0a 20 20  pRegion==0 ){.  
30420 20 20 20 20 69 6e 74 20 72 63 20 3d 20 75 6e 69      int rc = uni
30430 78 4d 61 70 66 69 6c 65 28 70 46 64 2c 20 2d 31  xMapfile(pFd, -1
30440 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
30450 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
30460 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
30470 20 20 69 66 28 20 70 46 64 2d 3e 6d 6d 61 70 53    if( pFd->mmapS
30480 69 7a 65 20 3e 3d 20 69 4f 66 66 2b 6e 41 6d 74  ize >= iOff+nAmt
30490 20 29 7b 0a 20 20 20 20 20 20 2a 70 70 20 3d 20   ){.      *pp = 
304a0 26 28 28 75 38 20 2a 29 70 46 64 2d 3e 70 4d 61  &((u8 *)pFd->pMa
304b0 70 52 65 67 69 6f 6e 29 5b 69 4f 66 66 5d 3b 0a  pRegion)[iOff];.
304c0 20 20 20 20 20 20 70 46 64 2d 3e 6e 46 65 74 63        pFd->nFetc
304d0 68 4f 75 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  hOut++;.    }.  
304e0 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  }.#endif.  retur
304f0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
30500 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 74 68 69  /*.** If the thi
30510 72 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e  rd argument is n
30520 6f 6e 2d 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68  on-NULL, then th
30530 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 6c 65  is function rele
30540 61 73 65 73 20 61 20 0a 2a 2a 20 72 65 66 65 72  ases a .** refer
30550 65 6e 63 65 20 6f 62 74 61 69 6e 65 64 20 62 79  ence obtained by
30560 20 61 6e 20 65 61 72 6c 69 65 72 20 63 61 6c 6c   an earlier call
30570 20 74 6f 20 75 6e 69 78 46 65 74 63 68 28 29 2e   to unixFetch().
30580 20 54 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 61   The second.** a
30590 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74  rgument passed t
305a0 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  o this function 
305b0 6d 75 73 74 20 62 65 20 74 68 65 20 73 61 6d 65  must be the same
305c0 20 61 73 20 74 68 65 20 63 6f 72 72 65 73 70 6f   as the correspo
305d0 6e 64 69 6e 67 0a 2a 2a 20 61 72 67 75 6d 65 6e  nding.** argumen
305e0 74 20 74 68 61 74 20 77 61 73 20 70 61 73 73 65  t that was passe
305f0 64 20 74 6f 20 74 68 65 20 75 6e 69 78 46 65 74  d to the unixFet
30600 63 68 28 29 20 69 6e 76 6f 63 61 74 69 6f 6e 2e  ch() invocation.
30610 20 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 74   .**.** Or, if t
30620 68 65 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e  he third argumen
30630 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20  t is NULL, then 
30640 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
30650 20 62 65 69 6e 67 20 63 61 6c 6c 65 64 20 0a 2a   being called .*
30660 2a 20 74 6f 20 69 6e 66 6f 72 6d 20 74 68 65 20  * to inform the 
30670 56 46 53 20 6c 61 79 65 72 20 74 68 61 74 2c 20  VFS layer that, 
30680 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 50 4f 53  according to POS
30690 49 58 2c 20 61 6e 79 20 65 78 69 73 74 69 6e 67  IX, any existing
306a0 20 6d 61 70 70 69 6e 67 20 0a 2a 2a 20 6d 61 79   mapping .** may
306b0 20 6e 6f 77 20 62 65 20 69 6e 76 61 6c 69 64 20   now be invalid 
306c0 61 6e 64 20 73 68 6f 75 6c 64 20 62 65 20 75 6e  and should be un
306d0 6d 61 70 70 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  mapped..*/.stati
306e0 63 20 69 6e 74 20 75 6e 69 78 55 6e 66 65 74 63  c int unixUnfetc
306f0 68 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  h(sqlite3_file *
30700 66 64 2c 20 69 36 34 20 69 4f 66 66 2c 20 76 6f  fd, i64 iOff, vo
30710 69 64 20 2a 70 29 7b 0a 23 69 66 20 53 51 4c 49  id *p){.#if SQLI
30720 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
30730 3e 30 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  >0.  unixFile *p
30740 46 64 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a  Fd = (unixFile *
30750 29 66 64 3b 20 20 20 2f 2a 20 54 68 65 20 75 6e  )fd;   /* The un
30760 64 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73  derlying databas
30770 65 20 66 69 6c 65 20 2a 2f 0a 20 20 55 4e 55 53  e file */.  UNUS
30780 45 44 5f 50 41 52 41 4d 45 54 45 52 28 69 4f 66  ED_PARAMETER(iOf
30790 66 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 3d 3d  f);..  /* If p==
307a0 30 20 28 75 6e 6d 61 70 20 74 68 65 20 65 6e 74  0 (unmap the ent
307b0 69 72 65 20 66 69 6c 65 29 20 74 68 65 6e 20 74  ire file) then t
307c0 68 65 72 65 20 6d 75 73 74 20 62 65 20 6e 6f 20  here must be no 
307d0 6f 75 74 73 74 61 6e 64 69 6e 67 20 0a 20 20 2a  outstanding .  *
307e0 2a 20 78 46 65 74 63 68 20 72 65 66 65 72 65 6e  * xFetch referen
307f0 63 65 73 2e 20 4f 72 2c 20 69 66 20 70 21 3d 30  ces. Or, if p!=0
30800 20 28 6d 65 61 6e 69 6e 67 20 69 74 20 69 73 20   (meaning it is 
30810 61 6e 20 78 46 65 74 63 68 20 72 65 66 65 72 65  an xFetch refere
30820 6e 63 65 29 2c 0a 20 20 2a 2a 20 74 68 65 6e 20  nce),.  ** then 
30830 74 68 65 72 65 20 6d 75 73 74 20 62 65 20 61 74  there must be at
30840 20 6c 65 61 73 74 20 6f 6e 65 20 6f 75 74 73 74   least one outst
30850 61 6e 64 69 6e 67 2e 20 20 2a 2f 0a 20 20 61 73  anding.  */.  as
30860 73 65 72 74 28 20 28 70 3d 3d 30 29 3d 3d 28 70  sert( (p==0)==(p
30870 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30  Fd->nFetchOut==0
30880 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 21  ) );..  /* If p!
30890 3d 30 2c 20 69 74 20 6d 75 73 74 20 6d 61 74 63  =0, it must matc
308a0 68 20 74 68 65 20 69 4f 66 66 20 76 61 6c 75 65  h the iOff value
308b0 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  . */.  assert( p
308c0 3d 3d 30 20 7c 7c 20 70 3d 3d 26 28 28 75 38 20  ==0 || p==&((u8 
308d0 2a 29 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f  *)pFd->pMapRegio
308e0 6e 29 5b 69 4f 66 66 5d 20 29 3b 0a 0a 20 20 69  n)[iOff] );..  i
308f0 66 28 20 70 20 29 7b 0a 20 20 20 20 70 46 64 2d  f( p ){.    pFd-
30900 3e 6e 46 65 74 63 68 4f 75 74 2d 2d 3b 0a 20 20  >nFetchOut--;.  
30910 7d 65 6c 73 65 7b 0a 20 20 20 20 75 6e 69 78 55  }else{.    unixU
30920 6e 6d 61 70 66 69 6c 65 28 70 46 64 29 3b 0a 20  nmapfile(pFd);. 
30930 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46   }..  assert( pF
30940 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3e 3d 30 20  d->nFetchOut>=0 
30950 29 3b 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45  );.#else.  UNUSE
30960 44 5f 50 41 52 41 4d 45 54 45 52 28 66 64 29 3b  D_PARAMETER(fd);
30970 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
30980 54 45 52 28 70 29 3b 0a 20 20 55 4e 55 53 45 44  TER(p);.  UNUSED
30990 5f 50 41 52 41 4d 45 54 45 52 28 69 4f 66 66 29  _PARAMETER(iOff)
309a0 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  ;.#endif.  retur
309b0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
309c0 2f 2a 0a 2a 2a 20 48 65 72 65 20 65 6e 64 73 20  /*.** Here ends 
309d0 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  the implementati
309e0 6f 6e 20 6f 66 20 61 6c 6c 20 73 71 6c 69 74 65  on of all sqlite
309f0 33 5f 66 69 6c 65 20 6d 65 74 68 6f 64 73 2e 0a  3_file methods..
30a00 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
30a10 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 73 71  ********* End sq
30a20 6c 69 74 65 33 5f 66 69 6c 65 20 4d 65 74 68 6f  lite3_file Metho
30a30 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ds *************
30a40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30a50 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
30a60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30a70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30a80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30a90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30aa0 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 64  */../*.** This d
30ab0 69 76 69 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73  ivision contains
30ac0 20 64 65 66 69 6e 69 74 69 6f 6e 73 20 6f 66 20   definitions of 
30ad0 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
30ae0 64 73 20 6f 62 6a 65 63 74 73 20 74 68 61 74 0a  ds objects that.
30af0 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 76 61 72  ** implement var
30b00 69 6f 75 73 20 66 69 6c 65 20 6c 6f 63 6b 69 6e  ious file lockin
30b10 67 20 73 74 72 61 74 65 67 69 65 73 2e 20 20 49  g strategies.  I
30b20 74 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e 73 20  t also contains 
30b30 64 65 66 69 6e 69 74 69 6f 6e 73 0a 2a 2a 20 6f  definitions.** o
30b40 66 20 22 66 69 6e 64 65 72 22 20 66 75 6e 63 74  f "finder" funct
30b50 69 6f 6e 73 2e 20 20 41 20 66 69 6e 64 65 72 2d  ions.  A finder-
30b60 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
30b70 20 74 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 61   to locate the a
30b80 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a 20 73 71  ppropriate.** sq
30b90 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
30ba0 20 6f 62 6a 65 63 74 20 66 6f 72 20 61 20 70 61   object for a pa
30bb0 72 74 69 63 75 6c 61 72 20 64 61 74 61 62 61 73  rticular databas
30bc0 65 20 66 69 6c 65 2e 20 20 54 68 65 20 70 41 70  e file.  The pAp
30bd0 70 44 61 74 61 0a 2a 2a 20 66 69 65 6c 64 20 6f  pData.** field o
30be0 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f 76 66  f the sqlite3_vf
30bf0 73 20 56 46 53 20 6f 62 6a 65 63 74 73 20 61 72  s VFS objects ar
30c00 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f  e initialized to
30c10 20 62 65 20 70 6f 69 6e 74 65 72 73 20 74 6f 0a   be pointers to.
30c20 2a 2a 20 74 68 65 20 63 6f 72 72 65 63 74 20 66  ** the correct f
30c30 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 66  inder-function f
30c40 6f 72 20 74 68 61 74 20 56 46 53 2e 0a 2a 2a 0a  or that VFS..**.
30c50 2a 2a 20 4d 6f 73 74 20 66 69 6e 64 65 72 20 66  ** Most finder f
30c60 75 6e 63 74 69 6f 6e 73 20 72 65 74 75 72 6e 20  unctions return 
30c70 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66  a pointer to a f
30c80 69 78 65 64 20 73 71 6c 69 74 65 33 5f 69 6f 5f  ixed sqlite3_io_
30c90 6d 65 74 68 6f 64 73 0a 2a 2a 20 6f 62 6a 65 63  methods.** objec
30ca0 74 2e 20 20 54 68 65 20 6f 6e 6c 79 20 69 6e 74  t.  The only int
30cb0 65 72 65 73 74 69 6e 67 20 66 69 6e 64 65 72 2d  eresting finder-
30cc0 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 75 74 6f  function is auto
30cd0 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20 77 68  lockIoFinder, wh
30ce0 69 63 68 0a 2a 2a 20 6c 6f 6f 6b 73 20 61 74 20  ich.** looks at 
30cf0 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d 20 74  the filesystem t
30d00 79 70 65 20 61 6e 64 20 74 72 69 65 73 20 74 6f  ype and tries to
30d10 20 67 75 65 73 73 20 74 68 65 20 62 65 73 74 20   guess the best 
30d20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 73 74 72 61 74  locking.** strat
30d30 65 67 79 20 66 72 6f 6d 20 74 68 61 74 2e 0a 2a  egy from that..*
30d40 2a 0a 2a 2a 20 46 6f 72 20 66 69 6e 64 65 72 2d  *.** For finder-
30d50 66 75 6e 74 69 6f 6e 20 46 2c 20 74 77 6f 20 6f  funtion F, two o
30d60 62 6a 65 63 74 73 20 61 72 65 20 63 72 65 61 74  bjects are creat
30d70 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29  ed:.**.**    (1)
30d80 20 54 68 65 20 72 65 61 6c 20 66 69 6e 64 65 72   The real finder
30d90 2d 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 64 20  -function named 
30da0 22 46 49 6d 70 74 28 29 22 2e 0a 2a 2a 0a 2a 2a  "FImpt()"..**.**
30db0 20 20 20 20 28 32 29 20 41 20 63 6f 6e 73 74 61      (2) A consta
30dc0 6e 74 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68  nt pointer to th
30dd0 69 73 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  is function name
30de0 64 20 6a 75 73 74 20 22 46 22 2e 0a 2a 2a 0a 2a  d just "F"..**.*
30df0 2a 0a 2a 2a 20 41 20 70 6f 69 6e 74 65 72 20 74  *.** A pointer t
30e00 6f 20 74 68 65 20 46 20 70 6f 69 6e 74 65 72 20  o the F pointer 
30e10 69 73 20 75 73 65 64 20 61 73 20 74 68 65 20 70  is used as the p
30e20 41 70 70 44 61 74 61 20 76 61 6c 75 65 20 66 6f  AppData value fo
30e30 72 20 56 46 53 0a 2a 2a 20 6f 62 6a 65 63 74 73  r VFS.** objects
30e40 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20 64 6f  .  We have to do
30e50 20 74 68 69 73 20 69 6e 73 74 65 61 64 20 6f 66   this instead of
30e60 20 6c 65 74 74 69 6e 67 20 70 41 70 70 44 61 74   letting pAppDat
30e70 61 20 70 6f 69 6e 74 0a 2a 2a 20 64 69 72 65 63  a point.** direc
30e80 74 6c 79 20 61 74 20 74 68 65 20 66 69 6e 64 65  tly at the finde
30e90 72 2d 66 75 6e 63 74 69 6f 6e 20 73 69 6e 63 65  r-function since
30ea0 20 43 39 30 20 72 75 6c 65 73 20 70 72 65 76 65   C90 rules preve
30eb0 6e 74 20 61 20 76 6f 69 64 2a 0a 2a 2a 20 66 72  nt a void*.** fr
30ec0 6f 6d 20 62 65 20 63 61 73 74 20 69 6e 74 6f 20  om be cast into 
30ed0 61 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74  a function point
30ee0 65 72 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 45 61 63  er..**.**.** Eac
30ef0 68 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  h instance of th
30f00 69 73 20 6d 61 63 72 6f 20 67 65 6e 65 72 61 74  is macro generat
30f10 65 73 20 74 77 6f 20 6f 62 6a 65 63 74 73 3a 0a  es two objects:.
30f20 2a 2a 0a 2a 2a 20 20 20 2a 20 20 41 20 63 6f 6e  **.**   *  A con
30f30 73 74 61 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f  stant sqlite3_io
30f40 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20  _methods object 
30f50 63 61 6c 6c 20 4d 45 54 48 4f 44 20 74 68 61 74  call METHOD that
30f60 20 68 61 73 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20   has locking.** 
30f70 20 20 20 20 20 6d 65 74 68 6f 64 73 20 43 4c 4f       methods CLO
30f80 53 45 2c 20 4c 4f 43 4b 2c 20 55 4e 4c 4f 43 4b  SE, LOCK, UNLOCK
30f90 2c 20 43 4b 52 45 53 4c 4f 43 4b 2e 0a 2a 2a 0a  , CKRESLOCK..**.
30fa0 2a 2a 20 20 20 2a 20 20 41 6e 20 49 2f 4f 20 6d  **   *  An I/O m
30fb0 65 74 68 6f 64 20 66 69 6e 64 65 72 20 66 75 6e  ethod finder fun
30fc0 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20 46 49 4e  ction called FIN
30fd0 44 45 52 20 74 68 61 74 20 72 65 74 75 72 6e 73  DER that returns
30fe0 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 20 20   a pointer.**   
30ff0 20 20 20 74 6f 20 74 68 65 20 4d 45 54 48 4f 44     to the METHOD
31000 20 6f 62 6a 65 63 74 20 69 6e 20 74 68 65 20 70   object in the p
31010 72 65 76 69 6f 75 73 20 62 75 6c 6c 65 74 2e 0a  revious bullet..
31020 2a 2f 0a 23 64 65 66 69 6e 65 20 49 4f 4d 45 54  */.#define IOMET
31030 48 4f 44 53 28 46 49 4e 44 45 52 2c 20 4d 45 54  HODS(FINDER, MET
31040 48 4f 44 2c 20 56 45 52 53 49 4f 4e 2c 20 43 4c  HOD, VERSION, CL
31050 4f 53 45 2c 20 4c 4f 43 4b 2c 20 55 4e 4c 4f 43  OSE, LOCK, UNLOC
31060 4b 2c 20 43 4b 4c 4f 43 4b 29 20 20 20 20 20 20  K, CKLOCK)      
31070 5c 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73  \.static const s
31080 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
31090 73 20 4d 45 54 48 4f 44 20 3d 20 7b 20 20 20 20  s METHOD = {    
310a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
310b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
310c0 0a 20 20 20 56 45 52 53 49 4f 4e 2c 20 20 20 20  .   VERSION,    
310d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
310e0 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 20 20  /* iVersion */  
310f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
31110 20 20 20 43 4c 4f 53 45 2c 20 20 20 20 20 20 20     CLOSE,       
31120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
31130 2a 20 78 43 6c 6f 73 65 20 2a 2f 20 20 20 20 20  * xClose */     
31140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31150 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
31160 20 20 75 6e 69 78 52 65 61 64 2c 20 20 20 20 20    unixRead,     
31170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
31180 20 78 52 65 61 64 20 2a 2f 20 20 20 20 20 20 20   xRead */       
31190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
311a0 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
311b0 20 75 6e 69 78 57 72 69 74 65 2c 20 20 20 20 20   unixWrite,     
311c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
311d0 78 57 72 69 74 65 20 2a 2f 20 20 20 20 20 20 20  xWrite */       
311e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
311f0 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
31200 75 6e 69 78 54 72 75 6e 63 61 74 65 2c 20 20 20  unixTruncate,   
31210 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
31220 54 72 75 6e 63 61 74 65 20 2a 2f 20 20 20 20 20  Truncate */     
31230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31240 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75            \.   u
31250 6e 69 78 53 79 6e 63 2c 20 20 20 20 20 20 20 20  nixSync,        
31260 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
31270 79 6e 63 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ync */          
31280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31290 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e           \.   un
312a0 69 78 46 69 6c 65 53 69 7a 65 2c 20 20 20 20 20  ixFileSize,     
312b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69            /* xFi
312c0 6c 65 53 69 7a 65 20 2a 2f 20 20 20 20 20 20 20  leSize */       
312d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
312e0 20 20 20 20 20 20 20 20 5c 0a 20 20 20 4c 4f 43          \.   LOC
312f0 4b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K,              
31300 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63           /* xLoc
31310 6b 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  k */            
31320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31330 20 20 20 20 20 20 20 5c 0a 20 20 20 55 4e 4c 4f         \.   UNLO
31340 43 4b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  CK,             
31350 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f          /* xUnlo
31360 63 6b 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  ck */           
31370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31380 20 20 20 20 20 20 5c 0a 20 20 20 43 4b 4c 4f 43        \.   CKLOC
31390 4b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K,              
313a0 20 20 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b         /* xCheck
313b0 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 2a 2f 20  ReservedLock */ 
313c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
313d0 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 46 69       \.   unixFi
313e0 6c 65 43 6f 6e 74 72 6f 6c 2c 20 20 20 20 20 20  leControl,      
313f0 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 65 43 6f        /* xFileCo
31400 6e 74 72 6f 6c 20 2a 2f 20 20 20 20 20 20 20 20  ntrol */        
31410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31420 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 65 63      \.   unixSec
31430 74 6f 72 53 69 7a 65 2c 20 20 20 20 20 20 20 20  torSize,        
31440 20 20 20 20 20 2f 2a 20 78 53 65 63 74 6f 72 53       /* xSectorS
31450 69 7a 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ize */          
31460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31470 20 20 20 5c 0a 20 20 20 75 6e 69 78 44 65 76 69     \.   unixDevi
31480 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
31490 73 2c 20 20 2f 2a 20 78 44 65 76 69 63 65 43 61  s,  /* xDeviceCa
314a0 70 61 62 69 6c 69 74 69 65 73 20 2a 2f 20 20 20  pabilities */   
314b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
314c0 20 20 5c 0a 20 20 20 75 6e 69 78 53 68 6d 4d 61    \.   unixShmMa
314d0 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
314e0 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20 2a 2f     /* xShmMap */
314f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31510 20 5c 0a 20 20 20 75 6e 69 78 53 68 6d 4c 6f 63   \.   unixShmLoc
31520 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
31530 20 20 2f 2a 20 78 53 68 6d 4c 6f 63 6b 20 2a 2f    /* xShmLock */
31540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31560 5c 0a 20 20 20 75 6e 69 78 53 68 6d 42 61 72 72  \.   unixShmBarr
31570 69 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ier,            
31580 20 2f 2a 20 78 53 68 6d 42 61 72 72 69 65 72 20   /* xShmBarrier 
31590 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
315a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
315b0 0a 20 20 20 75 6e 69 78 53 68 6d 55 6e 6d 61 70  .   unixShmUnmap
315c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
315d0 2f 2a 20 78 53 68 6d 55 6e 6d 61 70 20 2a 2f 20  /* xShmUnmap */ 
315e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
315f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
31600 20 20 20 75 6e 69 78 46 65 74 63 68 2c 20 20 20     unixFetch,   
31610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
31620 2a 20 78 46 65 74 63 68 20 2a 2f 20 20 20 20 20  * xFetch */     
31630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31640 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
31650 20 20 75 6e 69 78 55 6e 66 65 74 63 68 2c 20 20    unixUnfetch,  
31660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
31670 20 78 55 6e 66 65 74 63 68 20 2a 2f 20 20 20 20   xUnfetch */    
31680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31690 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 7d 3b              \.};
316a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
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 20 20 20 20 20 20 20 20                  
316d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
316e0 20 20 20 20 20 20 20 20 20 20 20 5c 0a 73 74 61             \.sta
316f0 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  tic const sqlite
31700 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 46 49  3_io_methods *FI
31710 4e 44 45 52 23 23 49 6d 70 6c 28 63 6f 6e 73 74  NDER##Impl(const
31720 20 63 68 61 72 20 2a 7a 2c 20 75 6e 69 78 46 69   char *z, unixFi
31730 6c 65 20 2a 70 29 7b 20 20 20 5c 0a 20 20 55 4e  le *p){   \.  UN
31740 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 7a  USED_PARAMETER(z
31750 29 3b 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  ); UNUSED_PARAME
31760 54 45 52 28 70 29 3b 20 20 20 20 20 20 20 20 20  TER(p);         
31770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31780 20 20 20 20 20 20 20 20 20 5c 0a 20 20 72 65 74           \.  ret
31790 75 72 6e 20 26 4d 45 54 48 4f 44 3b 20 20 20 20  urn &METHOD;    
317a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
317b0 20 20 20 20 20 20 20 20 20 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 5c 0a 7d 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 20 20 20 20 20 20 20 20 20 20 20 20                  
31810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31820 20 20 20 20 20 20 20 5c 0a 73 74 61 74 69 63 20         \.static 
31830 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f  const sqlite3_io
31840 5f 6d 65 74 68 6f 64 73 20 2a 28 2a 63 6f 6e 73  _methods *(*cons
31850 74 20 46 49 4e 44 45 52 29 28 63 6f 6e 73 74 20  t FINDER)(const 
31860 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65 20 2a  char*,unixFile *
31870 70 29 20 20 20 20 5c 0a 20 20 20 20 3d 20 46 49  p)    \.    = FI
31880 4e 44 45 52 23 23 49 6d 70 6c 3b 0a 0a 2f 2a 0a  NDER##Impl;../*.
31890 2a 2a 20 48 65 72 65 20 61 72 65 20 61 6c 6c 20  ** Here are all 
318a0 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69  of the sqlite3_i
318b0 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74  o_methods object
318c0 73 20 66 6f 72 20 65 61 63 68 20 6f 66 20 74 68  s for each of th
318d0 65 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 73 74 72  e.** locking str
318e0 61 74 65 67 69 65 73 2e 20 20 46 75 6e 63 74 69  ategies.  Functi
318f0 6f 6e 73 20 74 68 61 74 20 72 65 74 75 72 6e 20  ons that return 
31900 70 6f 69 6e 74 65 72 73 20 74 6f 20 74 68 65 73  pointers to thes
31910 65 20 6d 65 74 68 6f 64 73 0a 2a 2a 20 61 72 65  e methods.** are
31920 20 61 6c 73 6f 20 63 72 65 61 74 65 64 2e 0a 2a   also created..*
31930 2f 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 70  /.IOMETHODS(.  p
31940 6f 73 69 78 49 6f 46 69 6e 64 65 72 2c 20 20 20  osixIoFinder,   
31950 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64           /* Find
31960 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  er function name
31970 20 2a 2f 0a 20 20 70 6f 73 69 78 49 6f 4d 65 74   */.  posixIoMet
31980 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20 20  hods,           
31990 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  /* sqlite3_io_me
319a0 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d  thods object nam
319b0 65 20 2a 2f 0a 20 20 33 2c 20 20 20 20 20 20 20  e */.  3,       
319c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
319d0 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72   /* shared memor
319e0 79 20 61 6e 64 20 6d 6d 61 70 20 61 72 65 20 65  y and mmap are e
319f0 6e 61 62 6c 65 64 20 2a 2f 0a 20 20 75 6e 69 78  nabled */.  unix
31a00 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20  Close,          
31a10 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20        /* xClose 
31a20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78  method */.  unix
31a30 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  Lock,           
31a40 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d        /* xLock m
31a50 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 55  ethod */.  unixU
31a60 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  nlock,          
31a70 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20       /* xUnlock 
31a80 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78  method */.  unix
31a90 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
31aa0 6b 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52  k     /* xCheckR
31ab0 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68  eservedLock meth
31ac0 6f 64 20 2a 2f 0a 29 0a 49 4f 4d 45 54 48 4f 44  od */.).IOMETHOD
31ad0 53 28 0a 20 20 6e 6f 6c 6f 63 6b 49 6f 46 69 6e  S(.  nolockIoFin
31ae0 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 2f  der,           /
31af0 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f  * Finder functio
31b00 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 6e 6f 6c 6f  n name */.  nolo
31b10 63 6b 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20  ckIoMethods,    
31b20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33        /* sqlite3
31b30 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65  _io_methods obje
31b40 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 32 2c 20  ct name */.  2, 
31b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31b60 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64         /* shared
31b70 20 6d 65 6d 6f 72 79 20 69 73 20 65 6e 61 62 6c   memory is enabl
31b80 65 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 43 6c  ed */.  nolockCl
31b90 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ose,            
31ba0 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68    /* xClose meth
31bb0 6f 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 4c 6f  od */.  nolockLo
31bc0 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
31bd0 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f    /* xLock metho
31be0 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 55 6e 6c  d */.  nolockUnl
31bf0 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
31c00 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68   /* xUnlock meth
31c10 6f 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 43 68  od */.  nolockCh
31c20 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20  eckReservedLock 
31c30 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72    /* xCheckReser
31c40 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  vedLock method *
31c50 2f 0a 29 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20  /.).IOMETHODS(. 
31c60 20 64 6f 74 6c 6f 63 6b 49 6f 46 69 6e 64 65 72   dotlockIoFinder
31c70 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  ,          /* Fi
31c80 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61  nder function na
31c90 6d 65 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 49  me */.  dotlockI
31ca0 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20  oMethods,       
31cb0 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f    /* sqlite3_io_
31cc0 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e  methods object n
31cd0 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20  ame */.  1,     
31ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31cf0 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d     /* shared mem
31d00 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65 64 20  ory is disabled 
31d10 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 43 6c 6f 73  */.  dotlockClos
31d20 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e,             /
31d30 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20  * xClose method 
31d40 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b  */.  dotlockLock
31d50 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
31d60 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  * xLock method *
31d70 2f 0a 20 20 64 6f 74 6c 6f 63 6b 55 6e 6c 6f 63  /.  dotlockUnloc
31d80 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  k,            /*
31d90 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20   xUnlock method 
31da0 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 43 68 65 63  */.  dotlockChec
31db0 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 20 2f  kReservedLock  /
31dc0 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  * xCheckReserved
31dd0 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29  Lock method */.)
31de0 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  ..#if SQLITE_ENA
31df0 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
31e00 45 20 26 26 20 21 4f 53 5f 56 58 57 4f 52 4b 53  E && !OS_VXWORKS
31e10 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 66 6c  .IOMETHODS(.  fl
31e20 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20 20 20 20  ockIoFinder,    
31e30 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65          /* Finde
31e40 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20  r function name 
31e50 2a 2f 0a 20 20 66 6c 6f 63 6b 49 6f 4d 65 74 68  */.  flockIoMeth
31e60 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ods,           /
31e70 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  * sqlite3_io_met
31e80 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65  hods object name
31e90 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20   */.  1,        
31ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31eb0 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  /* shared memory
31ec0 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a   is disabled */.
31ed0 20 20 66 6c 6f 63 6b 43 6c 6f 73 65 2c 20 20 20    flockClose,   
31ee0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
31ef0 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a  Close method */.
31f00 20 20 66 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20    flockLock,    
31f10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
31f20 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  Lock method */. 
31f30 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20   flockUnlock,   
31f40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55             /* xU
31f50 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  nlock method */.
31f60 20 20 66 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65    flockCheckRese
31f70 72 76 65 64 4c 6f 63 6b 20 20 20 20 2f 2a 20 78  rvedLock    /* x
31f80 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
31f90 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65  k method */.).#e
31fa0 6e 64 69 66 0a 0a 23 69 66 20 4f 53 5f 56 58 57  ndif..#if OS_VXW
31fb0 4f 52 4b 53 0a 49 4f 4d 45 54 48 4f 44 53 28 0a  ORKS.IOMETHODS(.
31fc0 20 20 73 65 6d 49 6f 46 69 6e 64 65 72 2c 20 20    semIoFinder,  
31fd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
31fe0 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e  inder function n
31ff0 61 6d 65 20 2a 2f 0a 20 20 73 65 6d 49 6f 4d 65  ame */.  semIoMe
32000 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20  thods,          
32010 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f     /* sqlite3_io
32020 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20  _methods object 
32030 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20  name */.  1,    
32040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32050 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65      /* shared me
32060 6d 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65 64  mory is disabled
32070 20 2a 2f 0a 20 20 73 65 6d 43 6c 6f 73 65 2c 20   */.  semClose, 
32080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32090 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64  /* xClose method
320a0 20 2a 2f 0a 20 20 73 65 6d 4c 6f 63 6b 2c 20 20   */.  semLock,  
320b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
320c0 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  /* xLock method 
320d0 2a 2f 0a 20 20 73 65 6d 55 6e 6c 6f 63 6b 2c 20  */.  semUnlock, 
320e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
320f0 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64  * xUnlock method
32100 20 2a 2f 0a 20 20 73 65 6d 43 68 65 63 6b 52 65   */.  semCheckRe
32110 73 65 72 76 65 64 4c 6f 63 6b 20 20 20 20 20 20  servedLock      
32120 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65  /* xCheckReserve
32130 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  dLock method */.
32140 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65  ).#endif..#if de
32150 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
32160 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
32170 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
32180 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 61 66 70  IOMETHODS(.  afp
32190 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20  IoFinder,       
321a0 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72         /* Finder
321b0 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a   function name *
321c0 2f 0a 20 20 61 66 70 49 6f 4d 65 74 68 6f 64 73  /.  afpIoMethods
321d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
321e0 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
321f0 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20  ods object name 
32200 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20  */.  1,         
32210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
32220 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  * shared memory 
32230 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20  is disabled */. 
32240 20 61 66 70 43 6c 6f 73 65 2c 20 20 20 20 20 20   afpClose,      
32250 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
32260 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lose method */. 
32270 20 61 66 70 4c 6f 63 6b 2c 20 20 20 20 20 20 20   afpLock,       
32280 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c             /* xL
32290 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
322a0 61 66 70 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20  afpUnlock,      
322b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e            /* xUn
322c0 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lock method */. 
322d0 20 61 66 70 43 68 65 63 6b 52 65 73 65 72 76 65   afpCheckReserve
322e0 64 4c 6f 63 6b 20 20 20 20 20 20 2f 2a 20 78 43  dLock      /* xC
322f0 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
32300 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e   method */.).#en
32310 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70  dif../*.** The p
32320 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 6d 65 74  roxy locking met
32330 68 6f 64 20 69 73 20 61 20 22 73 75 70 65 72 2d  hod is a "super-
32340 6d 65 74 68 6f 64 22 20 69 6e 20 74 68 65 20 73  method" in the s
32350 65 6e 73 65 20 74 68 61 74 20 69 74 0a 2a 2a 20  ense that it.** 
32360 6f 70 65 6e 73 20 73 65 63 6f 6e 64 61 72 79 20  opens secondary 
32370 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73  file descriptors
32380 20 66 6f 72 20 74 68 65 20 63 6f 6e 63 68 20 61   for the conch a
32390 6e 64 20 6c 6f 63 6b 20 66 69 6c 65 73 20 61 6e  nd lock files an
323a0 64 0a 2a 2a 20 69 74 20 75 73 65 73 20 70 72 6f  d.** it uses pro
323b0 78 79 2c 20 64 6f 74 2d 66 69 6c 65 2c 20 41 46  xy, dot-file, AF
323c0 50 2c 20 61 6e 64 20 66 6c 6f 63 6b 28 29 20 6c  P, and flock() l
323d0 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 73 20 6f  ocking methods o
323e0 6e 20 74 68 6f 73 65 0a 2a 2a 20 73 65 63 6f 6e  n those.** secon
323f0 64 61 72 79 20 66 69 6c 65 73 2e 20 20 46 6f 72  dary files.  For
32400 20 74 68 69 73 20 72 65 61 73 6f 6e 2c 20 74 68   this reason, th
32410 65 20 64 69 76 69 73 69 6f 6e 20 74 68 61 74 20  e division that 
32420 69 6d 70 6c 65 6d 65 6e 74 73 0a 2a 2a 20 70 72  implements.** pr
32430 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6c  oxy locking is l
32440 6f 63 61 74 65 64 20 6d 75 63 68 20 66 75 72 74  ocated much furt
32450 68 65 72 20 64 6f 77 6e 20 69 6e 20 74 68 65 20  her down in the 
32460 66 69 6c 65 2e 20 20 42 75 74 20 77 65 20 6e 65  file.  But we ne
32470 65 64 0a 2a 2a 20 74 6f 20 67 6f 20 61 68 65 61  ed.** to go ahea
32480 64 20 61 6e 64 20 64 65 66 69 6e 65 20 74 68 65  d and define the
32490 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
324a0 6f 64 73 20 61 6e 64 20 66 69 6e 64 65 72 20 66  ods and finder f
324b0 75 6e 63 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 70  unction.** for p
324c0 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 68 65 72  roxy locking her
324d0 65 2e 20 20 53 6f 20 77 65 20 66 6f 72 77 61 72  e.  So we forwar
324e0 64 20 64 65 63 6c 61 72 65 20 74 68 65 20 49 2f  d declare the I/
324f0 4f 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a 23 69  O methods..*/.#i
32500 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
32510 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45  E__) && SQLITE_E
32520 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
32530 59 4c 45 0a 73 74 61 74 69 63 20 69 6e 74 20 70  YLE.static int p
32540 72 6f 78 79 43 6c 6f 73 65 28 73 71 6c 69 74 65  roxyClose(sqlite
32550 33 5f 66 69 6c 65 2a 29 3b 0a 73 74 61 74 69 63  3_file*);.static
32560 20 69 6e 74 20 70 72 6f 78 79 4c 6f 63 6b 28 73   int proxyLock(s
32570 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e  qlite3_file*, in
32580 74 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 70  t);.static int p
32590 72 6f 78 79 55 6e 6c 6f 63 6b 28 73 71 6c 69 74  roxyUnlock(sqlit
325a0 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 29 3b 0a  e3_file*, int);.
325b0 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
325c0 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
325d0 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c  k(sqlite3_file*,
325e0 20 69 6e 74 2a 29 3b 0a 49 4f 4d 45 54 48 4f 44   int*);.IOMETHOD
325f0 53 28 0a 20 20 70 72 6f 78 79 49 6f 46 69 6e 64  S(.  proxyIoFind
32600 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  er,            /
32610 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f  * Finder functio
32620 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 70 72 6f 78  n name */.  prox
32630 79 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20  yIoMethods,     
32640 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33        /* sqlite3
32650 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65  _io_methods obje
32660 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 32 2c 20  ct name */.  2, 
32670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32680 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64         /* shared
32690 20 6d 65 6d 6f 72 79 20 69 73 20 65 6e 61 62 6c   memory is enabl
326a0 65 64 20 2a 2f 0a 20 20 70 72 6f 78 79 43 6c 6f  ed */.  proxyClo
326b0 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
326c0 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68    /* xClose meth
326d0 6f 64 20 2a 2f 0a 20 20 70 72 6f 78 79 4c 6f 63  od */.  proxyLoc
326e0 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
326f0 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f    /* xLock metho
32700 64 20 2a 2f 0a 20 20 70 72 6f 78 79 55 6e 6c 6f  d */.  proxyUnlo
32710 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
32720 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68   /* xUnlock meth
32730 6f 64 20 2a 2f 0a 20 20 70 72 6f 78 79 43 68 65  od */.  proxyChe
32740 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 20  ckReservedLock  
32750 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72    /* xCheckReser
32760 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  vedLock method *
32770 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 6e  /.).#endif../* n
32780 66 73 20 6c 6f 63 6b 64 20 6f 6e 20 4f 53 58 20  fs lockd on OSX 
32790 31 30 2e 33 2b 20 64 6f 65 73 6e 27 74 20 63 6c  10.3+ doesn't cl
327a0 65 61 72 20 77 72 69 74 65 20 6c 6f 63 6b 73 20  ear write locks 
327b0 77 68 65 6e 20 61 20 72 65 61 64 20 6c 6f 63 6b  when a read lock
327c0 20 69 73 20 73 65 74 20 2a 2f 0a 23 69 66 20 64   is set */.#if d
327d0 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
327e0 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42  ) && SQLITE_ENAB
327f0 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
32800 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 6e 66  .IOMETHODS(.  nf
32810 73 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20  sIoFinder,      
32820 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64           /* Find
32830 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  er function name
32840 20 2a 2f 0a 20 20 6e 66 73 49 6f 4d 65 74 68 6f   */.  nfsIoMetho
32850 64 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ds,             
32860 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d   /* sqlite3_io_m
32870 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61  ethods object na
32880 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20  me */.  1,      
32890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
328a0 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d     /* shared mem
328b0 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65 64 20  ory is disabled 
328c0 2a 2f 0a 20 20 75 6e 69 78 43 6c 6f 73 65 2c 20  */.  unixClose, 
328d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
328e0 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64  /* xClose method
328f0 20 2a 2f 0a 20 20 75 6e 69 78 4c 6f 63 6b 2c 20   */.  unixLock, 
32900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32910 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64   /* xLock method
32920 20 2a 2f 0a 20 20 6e 66 73 55 6e 6c 6f 63 6b 2c   */.  nfsUnlock,
32930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32940 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68   /* xUnlock meth
32950 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 43 68 65 63  od */.  unixChec
32960 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 20 20  kReservedLock   
32970 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65     /* xCheckRese
32980 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  rvedLock method 
32990 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66  */.).#endif..#if
329a0 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
329b0 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  __) && SQLITE_EN
329c0 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
329d0 4c 45 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 22  LE./* .** This "
329e0 66 69 6e 64 65 72 22 20 66 75 6e 63 74 69 6f 6e  finder" function
329f0 20 61 74 74 65 6d 70 74 73 20 74 6f 20 64 65 74   attempts to det
32a00 65 72 6d 69 6e 65 20 74 68 65 20 62 65 73 74 20  ermine the best 
32a10 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74 65 67 79  locking strategy
32a20 20 0a 2a 2a 20 66 6f 72 20 74 68 65 20 64 61 74   .** for the dat
32a30 61 62 61 73 65 20 66 69 6c 65 20 22 66 69 6c 65  abase file "file
32a40 50 61 74 68 22 2e 20 20 49 74 20 74 68 65 6e 20  Path".  It then 
32a50 72 65 74 75 72 6e 73 20 74 68 65 20 73 71 6c 69  returns the sqli
32a60 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 0a 2a  te3_io_methods.*
32a70 2a 20 6f 62 6a 65 63 74 20 74 68 61 74 20 69 6d  * object that im
32a80 70 6c 65 6d 65 6e 74 73 20 74 68 61 74 20 73 74  plements that st
32a90 72 61 74 65 67 79 2e 0a 2a 2a 0a 2a 2a 20 54 68  rategy..**.** Th
32aa0 69 73 20 69 73 20 66 6f 72 20 4d 61 63 4f 53 58  is is for MacOSX
32ab0 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63   only..*/.static
32ac0 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69   const sqlite3_i
32ad0 6f 5f 6d 65 74 68 6f 64 73 20 2a 61 75 74 6f 6c  o_methods *autol
32ae0 6f 63 6b 49 6f 46 69 6e 64 65 72 49 6d 70 6c 28  ockIoFinderImpl(
32af0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 66  .  const char *f
32b00 69 6c 65 50 61 74 68 2c 20 20 20 20 2f 2a 20 6e  ilePath,    /* n
32b10 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
32b20 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e  ase file */.  un
32b30 69 78 46 69 6c 65 20 2a 70 4e 65 77 20 20 20 20  ixFile *pNew    
32b40 20 20 20 20 20 20 20 2f 2a 20 6f 70 65 6e 20 66         /* open f
32b50 69 6c 65 20 6f 62 6a 65 63 74 20 66 6f 72 20 74  ile object for t
32b60 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
32b70 20 2a 2f 0a 29 7b 0a 20 20 73 74 61 74 69 63 20   */.){.  static 
32b80 63 6f 6e 73 74 20 73 74 72 75 63 74 20 4d 61 70  const struct Map
32b90 70 69 6e 67 20 7b 0a 20 20 20 20 63 6f 6e 73 74  ping {.    const
32ba0 20 63 68 61 72 20 2a 7a 46 69 6c 65 73 79 73 74   char *zFilesyst
32bb0 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  em;             
32bc0 20 2f 2a 20 46 69 6c 65 73 79 73 74 65 6d 20 74   /* Filesystem t
32bd0 79 70 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  ype name */.    
32be0 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f  const sqlite3_io
32bf0 5f 6d 65 74 68 6f 64 73 20 2a 70 4d 65 74 68 6f  _methods *pMetho
32c00 64 73 3b 20 20 20 2f 2a 20 41 70 70 72 6f 70 72  ds;   /* Appropr
32c10 69 61 74 65 20 6c 6f 63 6b 69 6e 67 20 6d 65 74  iate locking met
32c20 68 6f 64 20 2a 2f 0a 20 20 7d 20 61 4d 61 70 5b  hod */.  } aMap[
32c30 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22 68 66 73  ] = {.    { "hfs
32c40 22 2c 20 20 20 20 26 70 6f 73 69 78 49 6f 4d 65  ",    &posixIoMe
32c50 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20 22  thods },.    { "
32c60 75 66 73 22 2c 20 20 20 20 26 70 6f 73 69 78 49  ufs",    &posixI
32c70 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20  oMethods },.    
32c80 7b 20 22 61 66 70 66 73 22 2c 20 20 26 61 66 70  { "afpfs",  &afp
32c90 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20  IoMethods },.   
32ca0 20 7b 20 22 73 6d 62 66 73 22 2c 20 20 26 61 66   { "smbfs",  &af
32cb0 70 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20  pIoMethods },.  
32cc0 20 20 7b 20 22 77 65 62 64 61 76 22 2c 20 26 6e    { "webdav", &n
32cd0 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 20 7d  olockIoMethods }
32ce0 2c 0a 20 20 20 20 7b 20 30 2c 20 30 20 7d 0a 20  ,.    { 0, 0 }. 
32cf0 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73   };.  int i;.  s
32d00 74 72 75 63 74 20 73 74 61 74 66 73 20 66 73 49  truct statfs fsI
32d10 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74 20 66 6c  nfo;.  struct fl
32d20 6f 63 6b 20 6c 6f 63 6b 49 6e 66 6f 3b 0a 0a 20  ock lockInfo;.. 
32d30 20 69 66 28 20 21 66 69 6c 65 50 61 74 68 20 29   if( !filePath )
32d40 7b 0a 20 20 20 20 2f 2a 20 49 66 20 66 69 6c 65  {.    /* If file
32d50 50 61 74 68 3d 3d 4e 55 4c 4c 20 74 68 61 74 20  Path==NULL that 
32d60 6d 65 61 6e 73 20 77 65 20 61 72 65 20 64 65 61  means we are dea
32d70 6c 69 6e 67 20 77 69 74 68 20 61 20 74 72 61 6e  ling with a tran
32d80 73 69 65 6e 74 20 66 69 6c 65 0a 20 20 20 20 2a  sient file.    *
32d90 2a 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20  * that does not 
32da0 6e 65 65 64 20 74 6f 20 62 65 20 6c 6f 63 6b 65  need to be locke
32db0 64 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  d. */.    return
32dc0 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64   &nolockIoMethod
32dd0 73 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 74 61  s;.  }.  if( sta
32de0 74 66 73 28 66 69 6c 65 50 61 74 68 2c 20 26 66  tfs(filePath, &f
32df0 73 49 6e 66 6f 29 20 21 3d 20 2d 31 20 29 7b 0a  sInfo) != -1 ){.
32e00 20 20 20 20 69 66 28 20 66 73 49 6e 66 6f 2e 66      if( fsInfo.f
32e10 5f 66 6c 61 67 73 20 26 20 4d 4e 54 5f 52 44 4f  _flags & MNT_RDO
32e20 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20 72 65 74  NLY ){.      ret
32e30 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74  urn &nolockIoMet
32e40 68 6f 64 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20  hods;.    }.    
32e50 66 6f 72 28 69 3d 30 3b 20 61 4d 61 70 5b 69 5d  for(i=0; aMap[i]
32e60 2e 7a 46 69 6c 65 73 79 73 74 65 6d 3b 20 69 2b  .zFilesystem; i+
32e70 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74  +){.      if( st
32e80 72 63 6d 70 28 66 73 49 6e 66 6f 2e 66 5f 66 73  rcmp(fsInfo.f_fs
32e90 74 79 70 65 6e 61 6d 65 2c 20 61 4d 61 70 5b 69  typename, aMap[i
32ea0 5d 2e 7a 46 69 6c 65 73 79 73 74 65 6d 29 3d 3d  ].zFilesystem)==
32eb0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  0 ){.        ret
32ec0 75 72 6e 20 61 4d 61 70 5b 69 5d 2e 70 4d 65 74  urn aMap[i].pMet
32ed0 68 6f 64 73 3b 0a 20 20 20 20 20 20 7d 0a 20 20  hods;.      }.  
32ee0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65    }.  }..  /* De
32ef0 66 61 75 6c 74 20 63 61 73 65 2e 20 48 61 6e 64  fault case. Hand
32f00 6c 65 73 2c 20 61 6d 6f 6e 67 73 74 20 6f 74 68  les, amongst oth
32f10 65 72 73 2c 20 22 6e 66 73 22 2e 0a 20 20 2a 2a  ers, "nfs"..  **
32f20 20 54 65 73 74 20 62 79 74 65 2d 72 61 6e 67 65   Test byte-range
32f30 20 6c 6f 63 6b 20 75 73 69 6e 67 20 66 63 6e 74   lock using fcnt
32f40 6c 28 29 2e 20 49 66 20 74 68 65 20 63 61 6c 6c  l(). If the call
32f50 20 73 75 63 63 65 65 64 73 2c 20 0a 20 20 2a 2a   succeeds, .  **
32f60 20 61 73 73 75 6d 65 20 74 68 61 74 20 74 68 65   assume that the
32f70 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 73 75 70   file-system sup
32f80 70 6f 72 74 73 20 50 4f 53 49 58 20 73 74 79 6c  ports POSIX styl
32f90 65 20 6c 6f 63 6b 73 2e 20 0a 20 20 2a 2f 0a 20  e locks. .  */. 
32fa0 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 6c 65 6e 20   lockInfo.l_len 
32fb0 3d 20 31 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e  = 1;.  lockInfo.
32fc0 6c 5f 73 74 61 72 74 20 3d 20 30 3b 0a 20 20 6c  l_start = 0;.  l
32fd0 6f 63 6b 49 6e 66 6f 2e 6c 5f 77 68 65 6e 63 65  ockInfo.l_whence
32fe0 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 6c   = SEEK_SET;.  l
32ff0 6f 63 6b 49 6e 66 6f 2e 6c 5f 74 79 70 65 20 3d  ockInfo.l_type =
33000 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 69 66 28 20   F_RDLCK;.  if( 
33010 6f 73 46 63 6e 74 6c 28 70 4e 65 77 2d 3e 68 2c  osFcntl(pNew->h,
33020 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63 6b 49   F_GETLK, &lockI
33030 6e 66 6f 29 21 3d 2d 31 20 29 20 7b 0a 20 20 20  nfo)!=-1 ) {.   
33040 20 69 66 28 20 73 74 72 63 6d 70 28 66 73 49 6e   if( strcmp(fsIn
33050 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c  fo.f_fstypename,
33060 20 22 6e 66 73 22 29 3d 3d 30 20 29 7b 0a 20 20   "nfs")==0 ){.  
33070 20 20 20 20 72 65 74 75 72 6e 20 26 6e 66 73 49      return &nfsI
33080 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20 7d 20  oMethods;.    } 
33090 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 72 65 74  else {.      ret
330a0 75 72 6e 20 26 70 6f 73 69 78 49 6f 4d 65 74 68  urn &posixIoMeth
330b0 6f 64 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  ods;.    }.  }el
330c0 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 26  se{.    return &
330d0 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73  dotlockIoMethods
330e0 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 63  ;.  }.}.static c
330f0 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f  onst sqlite3_io_
33100 6d 65 74 68 6f 64 73 20 0a 20 20 2a 28 2a 63 6f  methods .  *(*co
33110 6e 73 74 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69  nst autolockIoFi
33120 6e 64 65 72 29 28 63 6f 6e 73 74 20 63 68 61 72  nder)(const char
33130 2a 2c 75 6e 69 78 46 69 6c 65 2a 29 20 3d 20 61  *,unixFile*) = a
33140 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 49  utolockIoFinderI
33150 6d 70 6c 3b 0a 0a 23 65 6e 64 69 66 20 2f 2a 20  mpl;..#endif /* 
33160 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
33170 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41  _) && SQLITE_ENA
33180 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
33190 45 20 2a 2f 0a 0a 23 69 66 20 4f 53 5f 56 58 57  E */..#if OS_VXW
331a0 4f 52 4b 53 20 26 26 20 53 51 4c 49 54 45 5f 45  ORKS && SQLITE_E
331b0 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
331c0 59 4c 45 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20  YLE./* .** This 
331d0 22 66 69 6e 64 65 72 22 20 66 75 6e 63 74 69 6f  "finder" functio
331e0 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20 64 65  n attempts to de
331f0 74 65 72 6d 69 6e 65 20 74 68 65 20 62 65 73 74  termine the best
33200 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74 65 67   locking strateg
33210 79 20 0a 2a 2a 20 66 6f 72 20 74 68 65 20 64 61  y .** for the da
33220 74 61 62 61 73 65 20 66 69 6c 65 20 22 66 69 6c  tabase file "fil
33230 65 50 61 74 68 22 2e 20 20 49 74 20 74 68 65 6e  ePath".  It then
33240 20 72 65 74 75 72 6e 73 20 74 68 65 20 73 71 6c   returns the sql
33250 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 0a  ite3_io_methods.
33260 2a 2a 20 6f 62 6a 65 63 74 20 74 68 61 74 20 69  ** object that i
33270 6d 70 6c 65 6d 65 6e 74 73 20 74 68 61 74 20 73  mplements that s
33280 74 72 61 74 65 67 79 2e 0a 2a 2a 0a 2a 2a 20 54  trategy..**.** T
33290 68 69 73 20 69 73 20 66 6f 72 20 56 58 57 6f 72  his is for VXWor
332a0 6b 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73 74 61 74  ks only..*/.stat
332b0 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ic const sqlite3
332c0 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 61 75 74  _io_methods *aut
332d0 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 49 6d 70  olockIoFinderImp
332e0 6c 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  l(.  const char 
332f0 2a 66 69 6c 65 50 61 74 68 2c 20 20 20 20 2f 2a  *filePath,    /*
33300 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   name of the dat
33310 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
33320 75 6e 69 78 46 69 6c 65 20 2a 70 4e 65 77 20 20  unixFile *pNew  
33330 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20           /* the 
33340 6f 70 65 6e 20 66 69 6c 65 20 6f 62 6a 65 63 74  open file object
33350 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20   */.){.  struct 
33360 66 6c 6f 63 6b 20 6c 6f 63 6b 49 6e 66 6f 3b 0a  flock lockInfo;.
33370 0a 20 20 69 66 28 20 21 66 69 6c 65 50 61 74 68  .  if( !filePath
33380 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 66 69   ){.    /* If fi
33390 6c 65 50 61 74 68 3d 3d 4e 55 4c 4c 20 74 68 61  lePath==NULL tha
333a0 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20 64  t means we are d
333b0 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20 74 72  ealing with a tr
333c0 61 6e 73 69 65 6e 74 20 66 69 6c 65 0a 20 20 20  ansient file.   
333d0 20 2a 2a 20 74 68 61 74 20 64 6f 65 73 20 6e 6f   ** that does no
333e0 74 20 6e 65 65 64 20 74 6f 20 62 65 20 6c 6f 63  t need to be loc
333f0 6b 65 64 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75  ked. */.    retu
33400 72 6e 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68  rn &nolockIoMeth
33410 6f 64 73 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  ods;.  }..  /* T
33420 65 73 74 20 69 66 20 66 63 6e 74 6c 28 29 20 69  est if fcntl() i
33430 73 20 73 75 70 70 6f 72 74 65 64 20 61 6e 64 20  s supported and 
33440 75 73 65 20 50 4f 53 49 58 20 73 74 79 6c 65 20  use POSIX style 
33450 6c 6f 63 6b 73 2e 0a 20 20 2a 2a 20 4f 74 68 65  locks..  ** Othe
33460 72 77 69 73 65 20 66 61 6c 6c 20 62 61 63 6b 20  rwise fall back 
33470 74 6f 20 74 68 65 20 6e 61 6d 65 64 20 73 65 6d  to the named sem
33480 61 70 68 6f 72 65 20 6d 65 74 68 6f 64 2e 0a 20  aphore method.. 
33490 20 2a 2f 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c   */.  lockInfo.l
334a0 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20 6c 6f 63 6b  _len = 1;.  lock
334b0 49 6e 66 6f 2e 6c 5f 73 74 61 72 74 20 3d 20 30  Info.l_start = 0
334c0 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 77  ;.  lockInfo.l_w
334d0 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54  hence = SEEK_SET
334e0 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 74  ;.  lockInfo.l_t
334f0 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20  ype = F_RDLCK;. 
33500 20 69 66 28 20 6f 73 46 63 6e 74 6c 28 70 4e 65   if( osFcntl(pNe
33510 77 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b 2c 20 26  w->h, F_GETLK, &
33520 6c 6f 63 6b 49 6e 66 6f 29 21 3d 2d 31 20 29 20  lockInfo)!=-1 ) 
33530 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 26 70 6f  {.    return &po
33540 73 69 78 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20  sixIoMethods;.  
33550 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
33560 6e 20 26 73 65 6d 49 6f 4d 65 74 68 6f 64 73 3b  n &semIoMethods;
33570 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 63 6f  .  }.}.static co
33580 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  nst sqlite3_io_m
33590 65 74 68 6f 64 73 20 0a 20 20 2a 28 2a 63 6f 6e  ethods .  *(*con
335a0 73 74 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e  st autolockIoFin
335b0 64 65 72 29 28 63 6f 6e 73 74 20 63 68 61 72 2a  der)(const char*
335c0 2c 75 6e 69 78 46 69 6c 65 2a 29 20 3d 20 61 75  ,unixFile*) = au
335d0 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 49 6d  tolockIoFinderIm
335e0 70 6c 3b 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 4f  pl;..#endif /* O
335f0 53 5f 56 58 57 4f 52 4b 53 20 26 26 20 53 51 4c  S_VXWORKS && SQL
33600 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
33610 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a 2f 2a 0a  NG_STYLE */../*.
33620 2a 2a 20 41 6e 20 61 62 73 74 72 61 63 74 20 74  ** An abstract t
33630 79 70 65 20 66 6f 72 20 61 20 70 6f 69 6e 74 65  ype for a pointe
33640 72 20 74 6f 20 61 20 49 4f 20 6d 65 74 68 6f 64  r to a IO method
33650 20 66 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e   finder function
33660 3a 0a 2a 2f 0a 74 79 70 65 64 65 66 20 63 6f 6e  :.*/.typedef con
33670 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  st sqlite3_io_me
33680 74 68 6f 64 73 20 2a 28 2a 66 69 6e 64 65 72 5f  thods *(*finder_
33690 74 79 70 65 29 28 63 6f 6e 73 74 20 63 68 61 72  type)(const char
336a0 2a 2c 75 6e 69 78 46 69 6c 65 2a 29 3b 0a 0a 0a  *,unixFile*);...
336b0 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
336c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
336d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
336e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
336f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
33700 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33710 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 73 71 6c 69 74  ********** sqlit
33720 65 33 5f 76 66 73 20 6d 65 74 68 6f 64 73 20 2a  e3_vfs methods *
33730 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33740 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a  ***********.**.*
33750 2a 20 54 68 69 73 20 64 69 76 69 73 69 6f 6e 20  * This division 
33760 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 69 6d 70  contains the imp
33770 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 6d  lementation of m
33780 65 74 68 6f 64 73 20 6f 6e 20 74 68 65 0a 2a 2a  ethods on the.**
33790 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6f 62 6a   sqlite3_vfs obj
337a0 65 63 74 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49  ect..*/../*.** I
337b0 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 63 6f  nitialize the co
337c0 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 75 6e  ntents of the un
337d0 69 78 46 69 6c 65 20 73 74 72 75 63 74 75 72 65  ixFile structure
337e0 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 70   pointed to by p
337f0 49 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  Id..*/.static in
33800 74 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65  t fillInUnixFile
33810 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  (.  sqlite3_vfs 
33820 2a 70 56 66 73 2c 20 20 20 20 20 20 2f 2a 20 50  *pVfs,      /* P
33830 6f 69 6e 74 65 72 20 74 6f 20 76 66 73 20 6f 62  ointer to vfs ob
33840 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 68 2c  ject */.  int h,
33850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33860 20 20 2f 2a 20 4f 70 65 6e 20 66 69 6c 65 20 64    /* Open file d
33870 65 73 63 72 69 70 74 6f 72 20 6f 66 20 66 69 6c  escriptor of fil
33880 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20 2a  e being opened *
33890 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  /.  sqlite3_file
338a0 20 2a 70 49 64 2c 20 20 20 20 20 20 2f 2a 20 57   *pId,      /* W
338b0 72 69 74 65 20 74 6f 20 74 68 65 20 75 6e 69 78  rite to the unix
338c0 46 69 6c 65 20 73 74 72 75 63 74 75 72 65 20 68  File structure h
338d0 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ere */.  const c
338e0 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  har *zFilename, 
338f0 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
33900 66 69 6c 65 20 62 65 69 6e 67 20 6f 70 65 6e 65  file being opene
33910 64 20 2a 2f 0a 20 20 69 6e 74 20 63 74 72 6c 46  d */.  int ctrlF
33920 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20 2f  lags           /
33930 2a 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 55  * Zero or more U
33940 4e 49 58 46 49 4c 45 5f 2a 20 76 61 6c 75 65 73  NIXFILE_* values
33950 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 73   */.){.  const s
33960 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
33970 73 20 2a 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65  s *pLockingStyle
33980 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e  ;.  unixFile *pN
33990 65 77 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a  ew = (unixFile *
339a0 29 70 49 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d  )pId;.  int rc =
339b0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61   SQLITE_OK;..  a
339c0 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 70 49 6e  ssert( pNew->pIn
339d0 6f 64 65 3d 3d 4e 55 4c 4c 20 29 3b 0a 0a 20 20  ode==NULL );..  
339e0 2f 2a 20 55 73 75 61 6c 6c 79 20 74 68 65 20 70  /* Usually the p
339f0 61 74 68 20 7a 46 69 6c 65 6e 61 6d 65 20 73 68  ath zFilename sh
33a00 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61 20 72 65  ould not be a re
33a10 6c 61 74 69 76 65 20 70 61 74 68 6e 61 6d 65 2e  lative pathname.
33a20 20 54 68 65 0a 20 20 2a 2a 20 65 78 63 65 70 74   The.  ** except
33a30 69 6f 6e 20 69 73 20 77 68 65 6e 20 6f 70 65 6e  ion is when open
33a40 69 6e 67 20 74 68 65 20 70 72 6f 78 79 20 22 63  ing the proxy "c
33a50 6f 6e 63 68 22 20 66 69 6c 65 20 69 6e 20 62 75  onch" file in bu
33a60 69 6c 64 73 20 74 68 61 74 0a 20 20 2a 2a 20 69  ilds that.  ** i
33a70 6e 63 6c 75 64 65 20 74 68 65 20 73 70 65 63 69  nclude the speci
33a80 61 6c 20 41 70 70 6c 65 20 6c 6f 63 6b 69 6e 67  al Apple locking
33a90 20 73 74 79 6c 65 73 2e 0a 20 20 2a 2f 0a 23 69   styles..  */.#i
33aa0 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
33ab0 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45  E__) && SQLITE_E
33ac0 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
33ad0 59 4c 45 0a 20 20 61 73 73 65 72 74 28 20 7a 46  YLE.  assert( zF
33ae0 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 46  ilename==0 || zF
33af0 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 27 2f 27 20  ilename[0]=='/' 
33b00 0a 20 20 20 20 7c 7c 20 70 56 66 73 2d 3e 70 41  .    || pVfs->pA
33b10 70 70 44 61 74 61 3d 3d 28 76 6f 69 64 2a 29 26  ppData==(void*)&
33b20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72  autolockIoFinder
33b30 20 29 3b 0a 23 65 6c 73 65 0a 20 20 61 73 73 65   );.#else.  asse
33b40 72 74 28 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30  rt( zFilename==0
33b50 20 7c 7c 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d   || zFilename[0]
33b60 3d 3d 27 2f 27 20 29 3b 0a 23 65 6e 64 69 66 0a  =='/' );.#endif.
33b70 0a 20 20 2f 2a 20 4e 6f 20 6c 6f 63 6b 69 6e 67  .  /* No locking
33b80 20 6f 63 63 75 72 73 20 69 6e 20 74 65 6d 70 6f   occurs in tempo
33b90 72 61 72 79 20 66 69 6c 65 73 20 2a 2f 0a 20 20  rary files */.  
33ba0 61 73 73 65 72 74 28 20 7a 46 69 6c 65 6e 61 6d  assert( zFilenam
33bb0 65 21 3d 30 20 7c 7c 20 28 63 74 72 6c 46 6c 61  e!=0 || (ctrlFla
33bc0 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 4e 4f  gs & UNIXFILE_NO
33bd0 4c 4f 43 4b 29 21 3d 30 20 29 3b 0a 0a 20 20 4f  LOCK)!=0 );..  O
33be0 53 54 52 41 43 45 28 28 22 4f 50 45 4e 20 20 20  STRACE(("OPEN   
33bf0 20 25 2d 33 64 20 25 73 5c 6e 22 2c 20 68 2c 20   %-3d %s\n", h, 
33c00 7a 46 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 70  zFilename));.  p
33c10 4e 65 77 2d 3e 68 20 3d 20 68 3b 0a 20 20 70 4e  New->h = h;.  pN
33c20 65 77 2d 3e 70 56 66 73 20 3d 20 70 56 66 73 3b  ew->pVfs = pVfs;
33c30 0a 20 20 70 4e 65 77 2d 3e 7a 50 61 74 68 20 3d  .  pNew->zPath =
33c40 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 70 4e   zFilename;.  pN
33c50 65 77 2d 3e 63 74 72 6c 46 6c 61 67 73 20 3d 20  ew->ctrlFlags = 
33c60 28 75 38 29 63 74 72 6c 46 6c 61 67 73 3b 0a 23  (u8)ctrlFlags;.#
33c70 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  if SQLITE_MAX_MM
33c80 41 50 5f 53 49 5a 45 3e 30 0a 20 20 70 4e 65 77  AP_SIZE>0.  pNew
33c90 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20 3d 20  ->mmapSizeMax = 
33ca0 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
33cb0 66 69 67 2e 73 7a 4d 6d 61 70 3b 0a 23 65 6e 64  fig.szMmap;.#end
33cc0 69 66 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  if.  if( sqlite3
33cd0 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e 28 28 28 63  _uri_boolean(((c
33ce0 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46  trlFlags & UNIXF
33cf0 49 4c 45 5f 55 52 49 29 20 3f 20 7a 46 69 6c 65  ILE_URI) ? zFile
33d00 6e 61 6d 65 20 3a 20 30 29 2c 0a 20 20 20 20 20  name : 0),.     
33d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33d20 20 20 20 20 20 20 22 70 73 6f 77 22 2c 20 53 51        "psow", SQ
33d30 4c 49 54 45 5f 50 4f 57 45 52 53 41 46 45 5f 4f  LITE_POWERSAFE_O
33d40 56 45 52 57 52 49 54 45 29 20 29 7b 0a 20 20 20  VERWRITE) ){.   
33d50 20 70 4e 65 77 2d 3e 63 74 72 6c 46 6c 61 67 73   pNew->ctrlFlags
33d60 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 50 53 4f   |= UNIXFILE_PSO
33d70 57 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 74 72  W;.  }.  if( str
33d80 63 6d 70 28 70 56 66 73 2d 3e 7a 4e 61 6d 65 2c  cmp(pVfs->zName,
33d90 22 75 6e 69 78 2d 65 78 63 6c 22 29 3d 3d 30 20  "unix-excl")==0 
33da0 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 63 74 72  ){.    pNew->ctr
33db0 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49  lFlags |= UNIXFI
33dc0 4c 45 5f 45 58 43 4c 3b 0a 20 20 7d 0a 0a 23 69  LE_EXCL;.  }..#i
33dd0 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 70  f OS_VXWORKS.  p
33de0 4e 65 77 2d 3e 70 49 64 20 3d 20 76 78 77 6f 72  New->pId = vxwor
33df0 6b 73 46 69 6e 64 46 69 6c 65 49 64 28 7a 46 69  ksFindFileId(zFi
33e00 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 70  lename);.  if( p
33e10 4e 65 77 2d 3e 70 49 64 3d 3d 30 20 29 7b 0a 20  New->pId==0 ){. 
33e20 20 20 20 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20     ctrlFlags |= 
33e30 55 4e 49 58 46 49 4c 45 5f 4e 4f 4c 4f 43 4b 3b  UNIXFILE_NOLOCK;
33e40 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
33e50 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 23 65 6e 64  _NOMEM;.  }.#end
33e60 69 66 0a 0a 20 20 69 66 28 20 63 74 72 6c 46 6c  if..  if( ctrlFl
33e70 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 4e  ags & UNIXFILE_N
33e80 4f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 4c 6f  OLOCK ){.    pLo
33e90 63 6b 69 6e 67 53 74 79 6c 65 20 3d 20 26 6e 6f  ckingStyle = &no
33ea0 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20  lockIoMethods;. 
33eb0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4c 6f 63   }else{.    pLoc
33ec0 6b 69 6e 67 53 74 79 6c 65 20 3d 20 28 2a 2a 28  kingStyle = (**(
33ed0 66 69 6e 64 65 72 5f 74 79 70 65 2a 29 70 56 66  finder_type*)pVf
33ee0 73 2d 3e 70 41 70 70 44 61 74 61 29 28 7a 46 69  s->pAppData)(zFi
33ef0 6c 65 6e 61 6d 65 2c 20 70 4e 65 77 29 3b 0a 23  lename, pNew);.#
33f00 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
33f10 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20  _LOCKING_STYLE. 
33f20 20 20 20 2f 2a 20 43 61 63 68 65 20 7a 46 69 6c     /* Cache zFil
33f30 65 6e 61 6d 65 20 69 6e 20 74 68 65 20 6c 6f 63  ename in the loc
33f40 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 28 41 46  king context (AF
33f50 50 20 61 6e 64 20 64 6f 74 6c 6f 63 6b 20 6f 76  P and dotlock ov
33f60 65 72 72 69 64 65 29 20 66 6f 72 0a 20 20 20 20  erride) for.    
33f70 2a 2a 20 70 72 6f 78 79 4c 6f 63 6b 20 61 63 74  ** proxyLock act
33f80 69 76 61 74 69 6f 6e 20 69 73 20 70 6f 73 73 69  ivation is possi
33f90 62 6c 65 20 28 72 65 6d 6f 74 65 20 70 72 6f 78  ble (remote prox
33fa0 79 20 69 73 20 62 61 73 65 64 20 6f 6e 20 64 62  y is based on db
33fb0 20 6e 61 6d 65 29 0a 20 20 20 20 2a 2a 20 7a 46   name).    ** zF
33fc0 69 6c 65 6e 61 6d 65 20 72 65 6d 61 69 6e 73 20  ilename remains 
33fd0 76 61 6c 69 64 20 75 6e 74 69 6c 20 66 69 6c 65  valid until file
33fe0 20 69 73 20 63 6c 6f 73 65 64 2c 20 74 6f 20 73   is closed, to s
33ff0 75 70 70 6f 72 74 20 2a 2f 0a 20 20 20 20 70 4e  upport */.    pN
34000 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  ew->lockingConte
34010 78 74 20 3d 20 28 76 6f 69 64 2a 29 7a 46 69 6c  xt = (void*)zFil
34020 65 6e 61 6d 65 3b 0a 23 65 6e 64 69 66 0a 20 20  ename;.#endif.  
34030 7d 0a 0a 20 20 69 66 28 20 70 4c 6f 63 6b 69 6e  }..  if( pLockin
34040 67 53 74 79 6c 65 20 3d 3d 20 26 70 6f 73 69 78  gStyle == &posix
34050 49 6f 4d 65 74 68 6f 64 73 0a 23 69 66 20 64 65  IoMethods.#if de
34060 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
34070 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
34080 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
34090 20 20 20 20 7c 7c 20 70 4c 6f 63 6b 69 6e 67 53      || pLockingS
340a0 74 79 6c 65 20 3d 3d 20 26 6e 66 73 49 6f 4d 65  tyle == &nfsIoMe
340b0 74 68 6f 64 73 0a 23 65 6e 64 69 66 0a 20 20 20  thods.#endif.   
340c0 20 20 2f 2a 20 73 75 70 70 6f 72 74 20 57 41 4c    /* support WAL
340d0 20 6d 6f 64 65 20 6f 6e 20 72 65 61 64 20 6f 6e   mode on read on
340e0 6c 79 20 6d 6f 75 6e 74 65 64 20 66 69 6c 65 73  ly mounted files
340f0 79 73 74 65 6d 20 2a 2f 0a 20 20 20 20 7c 7c 20  ystem */.    || 
34100 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d  pLockingStyle ==
34110 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64   &nolockIoMethod
34120 73 20 0a 20 20 29 7b 0a 20 20 20 20 75 6e 69 78  s .  ){.    unix
34130 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
34140 20 20 72 63 20 3d 20 66 69 6e 64 49 6e 6f 64 65    rc = findInode
34150 49 6e 66 6f 28 70 4e 65 77 2c 20 26 70 4e 65 77  Info(pNew, &pNew
34160 2d 3e 70 49 6e 6f 64 65 29 3b 0a 20 20 20 20 69  ->pInode);.    i
34170 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
34180 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
34190 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65  an error occurre
341a0 64 20 69 6e 20 66 69 6e 64 49 6e 6f 64 65 49 6e  d in findInodeIn
341b0 66 6f 28 29 2c 20 63 6c 6f 73 65 20 74 68 65 20  fo(), close the 
341c0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 0a  file descriptor.
341d0 20 20 20 20 20 20 2a 2a 20 69 6d 6d 65 64 69 61        ** immedia
341e0 74 65 6c 79 2c 20 62 65 66 6f 72 65 20 72 65 6c  tely, before rel
341f0 65 61 73 69 6e 67 20 74 68 65 20 6d 75 74 65 78  easing the mutex
34200 2e 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28  . findInodeInfo(
34210 29 20 6d 61 79 20 66 61 69 6c 0a 20 20 20 20 20  ) may fail.     
34220 20 2a 2a 20 69 6e 20 74 77 6f 20 73 63 65 6e 61   ** in two scena
34230 72 69 6f 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20  rios:.      **. 
34240 20 20 20 20 20 2a 2a 20 20 20 28 61 29 20 41 20       **   (a) A 
34250 63 61 6c 6c 20 74 6f 20 66 73 74 61 74 28 29 20  call to fstat() 
34260 66 61 69 6c 65 64 2e 0a 20 20 20 20 20 20 2a 2a  failed..      **
34270 20 20 20 28 62 29 20 41 20 6d 61 6c 6c 6f 63 20     (b) A malloc 
34280 66 61 69 6c 65 64 2e 0a 20 20 20 20 20 20 2a 2a  failed..      **
34290 0a 20 20 20 20 20 20 2a 2a 20 53 63 65 6e 61 72  .      ** Scenar
342a0 69 6f 20 28 62 29 20 6d 61 79 20 6f 6e 6c 79 20  io (b) may only 
342b0 6f 63 63 75 72 20 69 66 20 74 68 65 20 70 72 6f  occur if the pro
342c0 63 65 73 73 20 69 73 20 68 6f 6c 64 69 6e 67 20  cess is holding 
342d0 6e 6f 20 6f 74 68 65 72 0a 20 20 20 20 20 20 2a  no other.      *
342e0 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * file descripto
342f0 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73  rs open on the s
34300 61 6d 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65  ame file. If the
34310 72 65 20 77 65 72 65 20 6f 74 68 65 72 20 66 69  re were other fi
34320 6c 65 0a 20 20 20 20 20 20 2a 2a 20 64 65 73 63  le.      ** desc
34330 72 69 70 74 6f 72 73 20 6f 6e 20 74 68 69 73 20  riptors on this 
34340 66 69 6c 65 2c 20 74 68 65 6e 20 6e 6f 20 6d 61  file, then no ma
34350 6c 6c 6f 63 20 77 6f 75 6c 64 20 62 65 20 72 65  lloc would be re
34360 71 75 69 72 65 64 20 62 79 0a 20 20 20 20 20 20  quired by.      
34370 2a 2a 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f  ** findInodeInfo
34380 28 29 2e 20 49 66 20 74 68 69 73 20 69 73 20 74  (). If this is t
34390 68 65 20 63 61 73 65 2c 20 69 74 20 69 73 20 71  he case, it is q
343a0 75 69 74 65 20 73 61 66 65 20 74 6f 20 63 6c 6f  uite safe to clo
343b0 73 65 0a 20 20 20 20 20 20 2a 2a 20 68 61 6e 64  se.      ** hand
343c0 6c 65 20 68 20 2d 20 61 73 20 69 74 20 69 73 20  le h - as it is 
343d0 67 75 61 72 61 6e 74 65 65 64 20 74 68 61 74 20  guaranteed that 
343e0 6e 6f 20 70 6f 73 69 78 20 6c 6f 63 6b 73 20 77  no posix locks w
343f0 69 6c 6c 20 62 65 20 72 65 6c 65 61 73 65 64 0a  ill be released.
34400 20 20 20 20 20 20 2a 2a 20 62 79 20 64 6f 69 6e        ** by doin
34410 67 20 73 6f 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  g so..      **. 
34420 20 20 20 20 20 2a 2a 20 49 66 20 73 63 65 6e 61       ** If scena
34430 72 69 6f 20 28 61 29 20 63 61 75 73 65 64 20 74  rio (a) caused t
34440 68 65 20 65 72 72 6f 72 20 74 68 65 6e 20 74 68  he error then th
34450 69 6e 67 73 20 61 72 65 20 6e 6f 74 20 73 6f 20  ings are not so 
34460 73 61 66 65 2e 20 54 68 65 0a 20 20 20 20 20 20  safe. The.      
34470 2a 2a 20 69 6d 70 6c 69 63 69 74 20 61 73 73 75  ** implicit assu
34480 6d 70 74 69 6f 6e 20 68 65 72 65 20 69 73 20 74  mption here is t
34490 68 61 74 20 69 66 20 66 73 74 61 74 28 29 20 66  hat if fstat() f
344a0 61 69 6c 73 2c 20 74 68 69 6e 67 73 20 61 72 65  ails, things are
344b0 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20 73 75 63   in.      ** suc
344c0 68 20 62 61 64 20 73 68 61 70 65 20 74 68 61 74  h bad shape that
344d0 20 64 72 6f 70 70 69 6e 67 20 61 20 6c 6f 63 6b   dropping a lock
344e0 20 6f 72 20 74 77 6f 20 64 6f 65 73 6e 27 74 20   or two doesn't 
344f0 6d 61 74 74 65 72 20 6d 75 63 68 2e 0a 20 20 20  matter much..   
34500 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 6f 62 75     */.      robu
34510 73 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c 20 68  st_close(pNew, h
34520 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20  , __LINE__);.   
34530 20 20 20 68 20 3d 20 2d 31 3b 0a 20 20 20 20 7d     h = -1;.    }
34540 0a 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75  .    unixLeaveMu
34550 74 65 78 28 29 3b 0a 20 20 7d 0a 0a 23 69 66 20  tex();.  }..#if 
34560 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
34570 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64  CKING_STYLE && d
34580 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
34590 29 0a 20 20 65 6c 73 65 20 69 66 28 20 70 4c 6f  ).  else if( pLo
345a0 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26 61  ckingStyle == &a
345b0 66 70 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20  fpIoMethods ){. 
345c0 20 20 20 2f 2a 20 41 46 50 20 6c 6f 63 6b 69 6e     /* AFP lockin
345d0 67 20 75 73 65 73 20 74 68 65 20 66 69 6c 65 20  g uses the file 
345e0 70 61 74 68 20 73 6f 20 69 74 20 6e 65 65 64 73  path so it needs
345f0 20 74 6f 20 62 65 20 69 6e 63 6c 75 64 65 64 20   to be included 
34600 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 61 66  in.    ** the af
34610 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2e  pLockingContext.
34620 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 66 70 4c  .    */.    afpL
34630 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70  ockingContext *p
34640 43 74 78 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6c  Ctx;.    pNew->l
34650 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20  ockingContext = 
34660 70 43 74 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d  pCtx = sqlite3_m
34670 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70  alloc( sizeof(*p
34680 43 74 78 29 20 29 3b 0a 20 20 20 20 69 66 28 20  Ctx) );.    if( 
34690 70 43 74 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pCtx==0 ){.     
346a0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
346b0 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  EM;.    }else{. 
346c0 20 20 20 20 20 2f 2a 20 4e 42 3a 20 7a 46 69 6c       /* NB: zFil
346d0 65 6e 61 6d 65 20 65 78 69 73 74 73 20 61 6e 64  ename exists and
346e0 20 72 65 6d 61 69 6e 73 20 76 61 6c 69 64 20 75   remains valid u
346f0 6e 74 69 6c 20 74 68 65 20 66 69 6c 65 20 69 73  ntil the file is
34700 20 63 6c 6f 73 65 64 0a 20 20 20 20 20 20 2a 2a   closed.      **
34710 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 72 65   according to re
34720 71 75 69 72 65 6d 65 6e 74 20 46 31 31 31 34 31  quirement F11141
34730 2e 20 20 53 6f 20 77 65 20 64 6f 20 6e 6f 74 20  .  So we do not 
34740 6e 65 65 64 20 74 6f 20 6d 61 6b 65 20 61 0a 20  need to make a. 
34750 20 20 20 20 20 2a 2a 20 63 6f 70 79 20 6f 66 20       ** copy of 
34760 74 68 65 20 66 69 6c 65 6e 61 6d 65 2e 20 2a 2f  the filename. */
34770 0a 20 20 20 20 20 20 70 43 74 78 2d 3e 64 62 50  .      pCtx->dbP
34780 61 74 68 20 3d 20 7a 46 69 6c 65 6e 61 6d 65 3b  ath = zFilename;
34790 0a 20 20 20 20 20 20 70 43 74 78 2d 3e 72 65 73  .      pCtx->res
347a0 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 20 20 20  erved = 0;.     
347b0 20 73 72 61 6e 64 6f 6d 64 65 76 28 29 3b 0a 20   srandomdev();. 
347c0 20 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75       unixEnterMu
347d0 74 65 78 28 29 3b 0a 20 20 20 20 20 20 72 63 20  tex();.      rc 
347e0 3d 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28  = findInodeInfo(
347f0 70 4e 65 77 2c 20 26 70 4e 65 77 2d 3e 70 49 6e  pNew, &pNew->pIn
34800 6f 64 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ode);.      if( 
34810 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
34820 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
34830 5f 66 72 65 65 28 70 4e 65 77 2d 3e 6c 6f 63 6b  _free(pNew->lock
34840 69 6e 67 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20  ingContext);.   
34850 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73       robust_clos
34860 65 28 70 4e 65 77 2c 20 68 2c 20 5f 5f 4c 49 4e  e(pNew, h, __LIN
34870 45 5f 5f 29 3b 0a 20 20 20 20 20 20 20 20 68 20  E__);.        h 
34880 3d 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  = -1;.      }.  
34890 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74      unixLeaveMut
348a0 65 78 28 29 3b 20 20 20 20 20 20 20 20 0a 20 20  ex();        .  
348b0 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
348c0 20 20 65 6c 73 65 20 69 66 28 20 70 4c 6f 63 6b    else if( pLock
348d0 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26 64 6f 74  ingStyle == &dot
348e0 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 20 29 7b  lockIoMethods ){
348f0 0a 20 20 20 20 2f 2a 20 44 6f 74 66 69 6c 65 20  .    /* Dotfile 
34900 6c 6f 63 6b 69 6e 67 20 75 73 65 73 20 74 68 65  locking uses the
34910 20 66 69 6c 65 20 70 61 74 68 20 73 6f 20 69 74   file path so it
34920 20 6e 65 65 64 73 20 74 6f 20 62 65 20 69 6e 63   needs to be inc
34930 6c 75 64 65 64 20 69 6e 0a 20 20 20 20 2a 2a 20  luded in.    ** 
34940 74 68 65 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69  the dotlockLocki
34950 6e 67 43 6f 6e 74 65 78 74 20 0a 20 20 20 20 2a  ngContext .    *
34960 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 4c 6f 63  /.    char *zLoc
34970 6b 46 69 6c 65 3b 0a 20 20 20 20 69 6e 74 20 6e  kFile;.    int n
34980 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 61 73  Filename;.    as
34990 73 65 72 74 28 20 7a 46 69 6c 65 6e 61 6d 65 21  sert( zFilename!
349a0 3d 30 20 29 3b 0a 20 20 20 20 6e 46 69 6c 65 6e  =0 );.    nFilen
349b0 61 6d 65 20 3d 20 28 69 6e 74 29 73 74 72 6c 65  ame = (int)strle
349c0 6e 28 7a 46 69 6c 65 6e 61 6d 65 29 20 2b 20 36  n(zFilename) + 6
349d0 3b 0a 20 20 20 20 7a 4c 6f 63 6b 46 69 6c 65 20  ;.    zLockFile 
349e0 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  = (char *)sqlite
349f0 33 5f 6d 61 6c 6c 6f 63 28 6e 46 69 6c 65 6e 61  3_malloc(nFilena
34a00 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 7a 4c 6f  me);.    if( zLo
34a10 63 6b 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20  ckFile==0 ){.   
34a20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
34a30 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  OMEM;.    }else{
34a40 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
34a50 6e 70 72 69 6e 74 66 28 6e 46 69 6c 65 6e 61 6d  nprintf(nFilenam
34a60 65 2c 20 7a 4c 6f 63 6b 46 69 6c 65 2c 20 22 25  e, zLockFile, "%
34a70 73 22 20 44 4f 54 4c 4f 43 4b 5f 53 55 46 46 49  s" DOTLOCK_SUFFI
34a80 58 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  X, zFilename);. 
34a90 20 20 20 7d 0a 20 20 20 20 70 4e 65 77 2d 3e 6c     }.    pNew->l
34aa0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20  ockingContext = 
34ab0 7a 4c 6f 63 6b 46 69 6c 65 3b 0a 20 20 7d 0a 0a  zLockFile;.  }..
34ac0 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20  #if OS_VXWORKS. 
34ad0 20 65 6c 73 65 20 69 66 28 20 70 4c 6f 63 6b 69   else if( pLocki
34ae0 6e 67 53 74 79 6c 65 20 3d 3d 20 26 73 65 6d 49  ngStyle == &semI
34af0 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20  oMethods ){.    
34b00 2f 2a 20 4e 61 6d 65 64 20 73 65 6d 61 70 68 6f  /* Named semapho
34b10 72 65 20 6c 6f 63 6b 69 6e 67 20 75 73 65 73 20  re locking uses 
34b20 74 68 65 20 66 69 6c 65 20 70 61 74 68 20 73 6f  the file path so
34b30 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 0a   it needs to be.
34b40 20 20 20 20 2a 2a 20 69 6e 63 6c 75 64 65 64 20      ** included 
34b50 69 6e 20 74 68 65 20 73 65 6d 4c 6f 63 6b 69 6e  in the semLockin
34b60 67 43 6f 6e 74 65 78 74 0a 20 20 20 20 2a 2f 0a  gContext.    */.
34b70 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74      unixEnterMut
34b80 65 78 28 29 3b 0a 20 20 20 20 72 63 20 3d 20 66  ex();.    rc = f
34b90 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 70 4e 65  indInodeInfo(pNe
34ba0 77 2c 20 26 70 4e 65 77 2d 3e 70 49 6e 6f 64 65  w, &pNew->pInode
34bb0 29 3b 0a 20 20 20 20 69 66 28 20 28 72 63 3d 3d  );.    if( (rc==
34bc0 53 51 4c 49 54 45 5f 4f 4b 29 20 26 26 20 28 70  SQLITE_OK) && (p
34bd0 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65  New->pInode->pSe
34be0 6d 3d 3d 4e 55 4c 4c 29 20 29 7b 0a 20 20 20 20  m==NULL) ){.    
34bf0 20 20 63 68 61 72 20 2a 7a 53 65 6d 4e 61 6d 65    char *zSemName
34c00 20 3d 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d   = pNew->pInode-
34c10 3e 61 53 65 6d 4e 61 6d 65 3b 0a 20 20 20 20 20  >aSemName;.     
34c20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 73 71   int n;.      sq
34c30 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d  lite3_snprintf(M
34c40 41 58 5f 50 41 54 48 4e 41 4d 45 2c 20 7a 53 65  AX_PATHNAME, zSe
34c50 6d 4e 61 6d 65 2c 20 22 2f 25 73 2e 73 65 6d 22  mName, "/%s.sem"
34c60 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
34c70 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70           pNew->p
34c80 49 64 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61  Id->zCanonicalNa
34c90 6d 65 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 20  me);.      for( 
34ca0 6e 3d 31 3b 20 7a 53 65 6d 4e 61 6d 65 5b 6e 5d  n=1; zSemName[n]
34cb0 3b 20 6e 2b 2b 20 29 0a 20 20 20 20 20 20 20 20  ; n++ ).        
34cc0 69 66 28 20 7a 53 65 6d 4e 61 6d 65 5b 6e 5d 3d  if( zSemName[n]=
34cd0 3d 27 2f 27 20 29 20 7a 53 65 6d 4e 61 6d 65 5b  ='/' ) zSemName[
34ce0 6e 5d 20 3d 20 27 5f 27 3b 0a 20 20 20 20 20 20  n] = '_';.      
34cf0 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53  pNew->pInode->pS
34d00 65 6d 20 3d 20 73 65 6d 5f 6f 70 65 6e 28 7a 53  em = sem_open(zS
34d10 65 6d 4e 61 6d 65 2c 20 4f 5f 43 52 45 41 54 2c  emName, O_CREAT,
34d20 20 30 36 36 36 2c 20 31 29 3b 0a 20 20 20 20 20   0666, 1);.     
34d30 20 69 66 28 20 70 4e 65 77 2d 3e 70 49 6e 6f 64   if( pNew->pInod
34d40 65 2d 3e 70 53 65 6d 20 3d 3d 20 53 45 4d 5f 46  e->pSem == SEM_F
34d50 41 49 4c 45 44 20 29 7b 0a 20 20 20 20 20 20 20  AILED ){.       
34d60 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
34d70 45 4d 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  EM;.        pNew
34d80 2d 3e 70 49 6e 6f 64 65 2d 3e 61 53 65 6d 4e 61  ->pInode->aSemNa
34d90 6d 65 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 20 20  me[0] = '\0';.  
34da0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
34db0 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
34dc0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a  ;.  }.#endif.  .
34dd0 20 20 70 4e 65 77 2d 3e 6c 61 73 74 45 72 72 6e    pNew->lastErrn
34de0 6f 20 3d 20 30 3b 0a 23 69 66 20 4f 53 5f 56 58  o = 0;.#if OS_VX
34df0 57 4f 52 4b 53 0a 20 20 69 66 28 20 72 63 21 3d  WORKS.  if( rc!=
34e00 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
34e10 20 69 66 28 20 68 3e 3d 30 20 29 20 72 6f 62 75   if( h>=0 ) robu
34e20 73 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c 20 68  st_close(pNew, h
34e30 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20  , __LINE__);.   
34e40 20 68 20 3d 20 2d 31 3b 0a 20 20 20 20 6f 73 55   h = -1;.    osU
34e50 6e 6c 69 6e 6b 28 7a 46 69 6c 65 6e 61 6d 65 29  nlink(zFilename)
34e60 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 63 74 72 6c  ;.    pNew->ctrl
34e70 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c  Flags |= UNIXFIL
34e80 45 5f 44 45 4c 45 54 45 3b 0a 20 20 7d 0a 23 65  E_DELETE;.  }.#e
34e90 6e 64 69 66 0a 20 20 69 66 28 20 72 63 21 3d 53  ndif.  if( rc!=S
34ea0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
34eb0 69 66 28 20 68 3e 3d 30 20 29 20 72 6f 62 75 73  if( h>=0 ) robus
34ec0 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c 20 68 2c  t_close(pNew, h,
34ed0 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 7d 65   __LINE__);.  }e
34ee0 6c 73 65 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 70  lse{.    pNew->p
34ef0 4d 65 74 68 6f 64 20 3d 20 70 4c 6f 63 6b 69 6e  Method = pLockin
34f00 67 53 74 79 6c 65 3b 0a 20 20 20 20 4f 70 65 6e  gStyle;.    Open
34f10 43 6f 75 6e 74 65 72 28 2b 31 29 3b 0a 20 20 20  Counter(+1);.   
34f20 20 76 65 72 69 66 79 44 62 46 69 6c 65 28 70 4e   verifyDbFile(pN
34f30 65 77 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ew);.  }.  retur
34f40 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
34f50 65 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f  eturn the name o
34f60 66 20 61 20 64 69 72 65 63 74 6f 72 79 20 69 6e  f a directory in
34f70 20 77 68 69 63 68 20 74 6f 20 70 75 74 20 74 65   which to put te
34f80 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 0a 2a  mporary files..*
34f90 2a 20 49 66 20 6e 6f 20 73 75 69 74 61 62 6c 65  * If no suitable
34fa0 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
34fb0 64 69 72 65 63 74 6f 72 79 20 63 61 6e 20 62 65  directory can be
34fc0 20 66 6f 75 6e 64 2c 20 72 65 74 75 72 6e 20 4e   found, return N
34fd0 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ULL..*/.static c
34fe0 6f 6e 73 74 20 63 68 61 72 20 2a 75 6e 69 78 54  onst char *unixT
34ff0 65 6d 70 46 69 6c 65 44 69 72 28 76 6f 69 64 29  empFileDir(void)
35000 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  {.  static const
35010 20 63 68 61 72 20 2a 61 7a 44 69 72 73 5b 5d 20   char *azDirs[] 
35020 3d 20 7b 0a 20 20 20 20 20 30 2c 0a 20 20 20 20  = {.     0,.    
35030 20 30 2c 0a 20 20 20 20 20 30 2c 0a 20 20 20 20   0,.     0,.    
35040 20 22 2f 76 61 72 2f 74 6d 70 22 2c 0a 20 20 20   "/var/tmp",.   
35050 20 20 22 2f 75 73 72 2f 74 6d 70 22 2c 0a 20 20    "/usr/tmp",.  
35060 20 20 20 22 2f 74 6d 70 22 2c 0a 20 20 20 20 20     "/tmp",.     
35070 30 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74  0        /* List
35080 20 74 65 72 6d 69 6e 61 74 6f 72 20 2a 2f 0a 20   terminator */. 
35090 20 7d 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69   };.  unsigned i
350a0 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 73  nt i;.  struct s
350b0 74 61 74 20 62 75 66 3b 0a 20 20 63 6f 6e 73 74  tat buf;.  const
350c0 20 63 68 61 72 20 2a 7a 44 69 72 20 3d 20 30 3b   char *zDir = 0;
350d0 0a 0a 20 20 61 7a 44 69 72 73 5b 30 5d 20 3d 20  ..  azDirs[0] = 
350e0 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72  sqlite3_temp_dir
350f0 65 63 74 6f 72 79 3b 0a 20 20 69 66 28 20 21 61  ectory;.  if( !a
35100 7a 44 69 72 73 5b 31 5d 20 29 20 61 7a 44 69 72  zDirs[1] ) azDir
35110 73 5b 31 5d 20 3d 20 67 65 74 65 6e 76 28 22 53  s[1] = getenv("S
35120 51 4c 49 54 45 5f 54 4d 50 44 49 52 22 29 3b 0a  QLITE_TMPDIR");.
35130 20 20 69 66 28 20 21 61 7a 44 69 72 73 5b 32 5d    if( !azDirs[2]
35140 20 29 20 61 7a 44 69 72 73 5b 32 5d 20 3d 20 67   ) azDirs[2] = g
35150 65 74 65 6e 76 28 22 54 4d 50 44 49 52 22 29 3b  etenv("TMPDIR");
35160 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69  .  for(i=0; i<si
35170 7a 65 6f 66 28 61 7a 44 69 72 73 29 2f 73 69 7a  zeof(azDirs)/siz
35180 65 6f 66 28 61 7a 44 69 72 73 5b 30 5d 29 3b 20  eof(azDirs[0]); 
35190 7a 44 69 72 3d 61 7a 44 69 72 73 5b 69 2b 2b 5d  zDir=azDirs[i++]
351a0 29 7b 0a 20 20 20 20 69 66 28 20 7a 44 69 72 3d  ){.    if( zDir=
351b0 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
351c0 20 20 20 69 66 28 20 6f 73 53 74 61 74 28 7a 44     if( osStat(zD
351d0 69 72 2c 20 26 62 75 66 29 20 29 20 63 6f 6e 74  ir, &buf) ) cont
351e0 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 21 53  inue;.    if( !S
351f0 5f 49 53 44 49 52 28 62 75 66 2e 73 74 5f 6d 6f  _ISDIR(buf.st_mo
35200 64 65 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  de) ) continue;.
35210 20 20 20 20 69 66 28 20 6f 73 41 63 63 65 73 73      if( osAccess
35220 28 7a 44 69 72 2c 20 30 37 29 20 29 20 63 6f 6e  (zDir, 07) ) con
35230 74 69 6e 75 65 3b 0a 20 20 20 20 62 72 65 61 6b  tinue;.    break
35240 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a  ;.  }.  return z
35250 44 69 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72  Dir;.}../*.** Cr
35260 65 61 74 65 20 61 20 74 65 6d 70 6f 72 61 72 79  eate a temporary
35270 20 66 69 6c 65 20 6e 61 6d 65 20 69 6e 20 7a 42   file name in zB
35280 75 66 2e 20 20 7a 42 75 66 20 6d 75 73 74 20 62  uf.  zBuf must b
35290 65 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 62  e allocated.** b
352a0 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 70 72  y the calling pr
352b0 6f 63 65 73 73 20 61 6e 64 20 6d 75 73 74 20 62  ocess and must b
352c0 65 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20  e big enough to 
352d0 68 6f 6c 64 20 61 74 20 6c 65 61 73 74 0a 2a 2a  hold at least.**
352e0 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d   pVfs->mxPathnam
352f0 65 20 62 79 74 65 73 2e 0a 2a 2f 0a 73 74 61 74  e bytes..*/.stat
35300 69 63 20 69 6e 74 20 75 6e 69 78 47 65 74 54 65  ic int unixGetTe
35310 6d 70 6e 61 6d 65 28 69 6e 74 20 6e 42 75 66 2c  mpname(int nBuf,
35320 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20   char *zBuf){.  
35330 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73  static const uns
35340 69 67 6e 65 64 20 63 68 61 72 20 7a 43 68 61 72  igned char zChar
35350 73 5b 5d 20 3d 0a 20 20 20 20 22 61 62 63 64 65  s[] =.    "abcde
35360 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75  fghijklmnopqrstu
35370 76 77 78 79 7a 22 0a 20 20 20 20 22 41 42 43 44  vwxyz".    "ABCD
35380 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54  EFGHIJKLMNOPQRST
35390 55 56 57 58 59 5a 22 0a 20 20 20 20 22 30 31 32  UVWXYZ".    "012
353a0 33 34 35 36 37 38 39 22 3b 0a 20 20 75 6e 73 69  3456789";.  unsi
353b0 67 6e 65 64 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  gned int i, j;. 
353c0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 69   const char *zDi
353d0 72 3b 0a 0a 20 20 2f 2a 20 49 74 27 73 20 6f 64  r;..  /* It's od
353e0 64 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 61 6e  d to simulate an
353f0 20 69 6f 2d 65 72 72 6f 72 20 68 65 72 65 2c 20   io-error here, 
35400 62 75 74 20 72 65 61 6c 6c 79 20 74 68 69 73 20  but really this 
35410 69 73 20 6a 75 73 74 0a 20 20 2a 2a 20 75 73 69  is just.  ** usi
35420 6e 67 20 74 68 65 20 69 6f 2d 65 72 72 6f 72 20  ng the io-error 
35430 69 6e 66 72 61 73 74 72 75 63 74 75 72 65 20 74  infrastructure t
35440 6f 20 74 65 73 74 20 74 68 61 74 20 53 51 4c 69  o test that SQLi
35450 74 65 20 68 61 6e 64 6c 65 73 20 74 68 69 73 0a  te handles this.
35460 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66 61    ** function fa
35470 69 6c 69 6e 67 2e 20 0a 20 20 2a 2f 0a 20 20 53  iling. .  */.  S
35480 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
35490 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
354a0 45 52 52 20 29 3b 0a 0a 20 20 7a 44 69 72 20 3d  ERR );..  zDir =
354b0 20 75 6e 69 78 54 65 6d 70 46 69 6c 65 44 69 72   unixTempFileDir
354c0 28 29 3b 0a 20 20 69 66 28 20 7a 44 69 72 3d 3d  ();.  if( zDir==
354d0 30 20 29 20 7a 44 69 72 20 3d 20 22 2e 22 3b 0a  0 ) zDir = ".";.
354e0 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74  .  /* Check that
354f0 20 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66   the output buff
35500 65 72 20 69 73 20 6c 61 72 67 65 20 65 6e 6f 75  er is large enou
35510 67 68 20 66 6f 72 20 74 68 65 20 74 65 6d 70 6f  gh for the tempo
35520 72 61 72 79 20 66 69 6c 65 20 0a 20 20 2a 2a 20  rary file .  ** 
35530 6e 61 6d 65 2e 20 49 66 20 69 74 20 69 73 20 6e  name. If it is n
35540 6f 74 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ot, return SQLIT
35550 45 5f 45 52 52 4f 52 2e 0a 20 20 2a 2f 0a 20 20  E_ERROR..  */.  
35560 69 66 28 20 28 73 74 72 6c 65 6e 28 7a 44 69 72  if( (strlen(zDir
35570 29 20 2b 20 73 74 72 6c 65 6e 28 53 51 4c 49 54  ) + strlen(SQLIT
35580 45 5f 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46  E_TEMP_FILE_PREF
35590 49 58 29 20 2b 20 31 38 29 20 3e 3d 20 28 73 69  IX) + 18) >= (si
355a0 7a 65 5f 74 29 6e 42 75 66 20 29 7b 0a 20 20 20  ze_t)nBuf ){.   
355b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
355c0 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 64 6f 7b  RROR;.  }..  do{
355d0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
355e0 72 69 6e 74 66 28 6e 42 75 66 2d 31 38 2c 20 7a  rintf(nBuf-18, z
355f0 42 75 66 2c 20 22 25 73 2f 22 53 51 4c 49 54 45  Buf, "%s/"SQLITE
35600 5f 54 45 4d 50 5f 46 49 4c 45 5f 50 52 45 46 49  _TEMP_FILE_PREFI
35610 58 2c 20 7a 44 69 72 29 3b 0a 20 20 20 20 6a 20  X, zDir);.    j 
35620 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 42  = (int)strlen(zB
35630 75 66 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  uf);.    sqlite3
35640 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 31 35 2c 20  _randomness(15, 
35650 26 7a 42 75 66 5b 6a 5d 29 3b 0a 20 20 20 20 66  &zBuf[j]);.    f
35660 6f 72 28 69 3d 30 3b 20 69 3c 31 35 3b 20 69 2b  or(i=0; i<15; i+
35670 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 7a  +, j++){.      z
35680 42 75 66 5b 6a 5d 20 3d 20 28 63 68 61 72 29 7a  Buf[j] = (char)z
35690 43 68 61 72 73 5b 20 28 28 75 6e 73 69 67 6e 65  Chars[ ((unsigne
356a0 64 20 63 68 61 72 29 7a 42 75 66 5b 6a 5d 29 25  d char)zBuf[j])%
356b0 28 73 69 7a 65 6f 66 28 7a 43 68 61 72 73 29 2d  (sizeof(zChars)-
356c0 31 29 20 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  1) ];.    }.    
356d0 7a 42 75 66 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20  zBuf[j] = 0;.   
356e0 20 7a 42 75 66 5b 6a 2b 31 5d 20 3d 20 30 3b 0a   zBuf[j+1] = 0;.
356f0 20 20 7d 77 68 69 6c 65 28 20 6f 73 41 63 63 65    }while( osAcce
35700 73 73 28 7a 42 75 66 2c 30 29 3d 3d 30 20 29 3b  ss(zBuf,0)==0 );
35710 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
35720 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49  _OK;.}..#if SQLI
35730 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
35740 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e  G_STYLE && defin
35750 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 2f 2a  ed(__APPLE__)./*
35760 0a 2a 2a 20 52 6f 75 74 69 6e 65 20 74 6f 20 74  .** Routine to t
35770 72 61 6e 73 66 6f 72 6d 20 61 20 75 6e 69 78 46  ransform a unixF
35780 69 6c 65 20 69 6e 74 6f 20 61 20 70 72 6f 78 79  ile into a proxy
35790 2d 6c 6f 63 6b 69 6e 67 20 75 6e 69 78 46 69 6c  -locking unixFil
357a0 65 2e 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61  e..** Implementa
357b0 74 69 6f 6e 20 69 6e 20 74 68 65 20 70 72 6f 78  tion in the prox
357c0 79 2d 6c 6f 63 6b 20 64 69 76 69 73 69 6f 6e 2c  y-lock division,
357d0 20 62 75 74 20 75 73 65 64 20 62 79 20 75 6e 69   but used by uni
357e0 78 4f 70 65 6e 28 29 0a 2a 2a 20 69 66 20 53 51  xOpen().** if SQ
357f0 4c 49 54 45 5f 50 52 45 46 45 52 5f 50 52 4f 58  LITE_PREFER_PROX
35800 59 5f 4c 4f 43 4b 49 4e 47 20 69 73 20 64 65 66  Y_LOCKING is def
35810 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ined..*/.static 
35820 69 6e 74 20 70 72 6f 78 79 54 72 61 6e 73 66 6f  int proxyTransfo
35830 72 6d 55 6e 69 78 46 69 6c 65 28 75 6e 69 78 46  rmUnixFile(unixF
35840 69 6c 65 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72  ile*, const char
35850 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  *);.#endif../*.*
35860 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61 6e 20  * Search for an 
35870 75 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73 63  unused file desc
35880 72 69 70 74 6f 72 20 74 68 61 74 20 77 61 73 20  riptor that was 
35890 6f 70 65 6e 65 64 20 6f 6e 20 74 68 65 20 64 61  opened on the da
358a0 74 61 62 61 73 65 20 0a 2a 2a 20 66 69 6c 65 20  tabase .** file 
358b0 28 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 20 6f  (not a journal o
358c0 72 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  r master-journal
358d0 20 66 69 6c 65 29 20 69 64 65 6e 74 69 66 69 65   file) identifie
358e0 64 20 62 79 20 70 61 74 68 6e 61 6d 65 0a 2a 2a  d by pathname.**
358f0 20 7a 50 61 74 68 20 77 69 74 68 20 53 51 4c 49   zPath with SQLI
35900 54 45 5f 4f 50 45 4e 5f 58 58 58 20 66 6c 61 67  TE_OPEN_XXX flag
35910 73 20 6d 61 74 63 68 69 6e 67 20 74 68 6f 73 65  s matching those
35920 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
35930 65 63 6f 6e 64 0a 2a 2a 20 61 72 67 75 6d 65 6e  econd.** argumen
35940 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  t to this functi
35950 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 53 75 63 68 20 61  on..**.** Such a
35960 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
35970 20 6d 61 79 20 65 78 69 73 74 20 69 66 20 61 20   may exist if a 
35980 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
35990 69 6f 6e 20 77 61 73 20 63 6c 6f 73 65 64 0a 2a  ion was closed.*
359a0 2a 20 62 75 74 20 74 68 65 20 61 73 73 6f 63 69  * but the associ
359b0 61 74 65 64 20 66 69 6c 65 20 64 65 73 63 72 69  ated file descri
359c0 70 74 6f 72 20 63 6f 75 6c 64 20 6e 6f 74 20 62  ptor could not b
359d0 65 20 63 6c 6f 73 65 64 20 62 65 63 61 75 73 65  e closed because
359e0 20 73 6f 6d 65 0a 2a 2a 20 6f 74 68 65 72 20 66   some.** other f
359f0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f  ile descriptor o
35a00 70 65 6e 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  pen on the same 
35a10 66 69 6c 65 20 69 73 20 68 6f 6c 64 69 6e 67 20  file is holding 
35a20 61 20 66 69 6c 65 2d 6c 6f 63 6b 2e 0a 2a 2a 20  a file-lock..** 
35a30 52 65 66 65 72 20 74 6f 20 63 6f 6d 6d 65 6e 74  Refer to comment
35a40 73 20 69 6e 20 74 68 65 20 75 6e 69 78 43 6c 6f  s in the unixClo
35a50 73 65 28 29 20 66 75 6e 63 74 69 6f 6e 20 61 6e  se() function an
35a60 64 20 74 68 65 20 6c 65 6e 67 74 68 79 20 63 6f  d the lengthy co
35a70 6d 6d 65 6e 74 0a 2a 2a 20 64 65 73 63 72 69 62  mment.** describ
35a80 69 6e 67 20 22 50 6f 73 69 78 20 41 64 76 69 73  ing "Posix Advis
35a90 6f 72 79 20 4c 6f 63 6b 69 6e 67 22 20 61 74 20  ory Locking" at 
35aa0 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 69  the start of thi
35ab0 73 20 66 69 6c 65 20 66 6f 72 20 0a 2a 2a 20 66  s file for .** f
35ac0 75 72 74 68 65 72 20 64 65 74 61 69 6c 73 2e 20  urther details. 
35ad0 41 6c 73 6f 2c 20 74 69 63 6b 65 74 20 23 34 30  Also, ticket #40
35ae0 31 38 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 73  18..**.** If a s
35af0 75 69 74 61 62 6c 65 20 66 69 6c 65 20 64 65 73  uitable file des
35b00 63 72 69 70 74 6f 72 20 69 73 20 66 6f 75 6e 64  criptor is found
35b10 2c 20 74 68 65 6e 20 69 74 20 69 73 20 72 65 74  , then it is ret
35b20 75 72 6e 65 64 2e 20 49 66 20 6e 6f 0a 2a 2a 20  urned. If no.** 
35b30 73 75 63 68 20 66 69 6c 65 20 64 65 73 63 72 69  such file descri
35b40 70 74 6f 72 20 69 73 20 6c 6f 63 61 74 65 64 2c  ptor is located,
35b50 20 2d 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e   -1 is returned.
35b60 0a 2a 2f 0a 73 74 61 74 69 63 20 55 6e 69 78 55  .*/.static UnixU
35b70 6e 75 73 65 64 46 64 20 2a 66 69 6e 64 52 65 75  nusedFd *findReu
35b80 73 61 62 6c 65 46 64 28 63 6f 6e 73 74 20 63 68  sableFd(const ch
35b90 61 72 20 2a 7a 50 61 74 68 2c 20 69 6e 74 20 66  ar *zPath, int f
35ba0 6c 61 67 73 29 7b 0a 20 20 55 6e 69 78 55 6e 75  lags){.  UnixUnu
35bb0 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64 20 3d  sedFd *pUnused =
35bc0 20 30 3b 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74   0;..  /* Do not
35bd0 20 73 65 61 72 63 68 20 66 6f 72 20 61 6e 20 75   search for an u
35be0 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73 63 72  nused file descr
35bf0 69 70 74 6f 72 20 6f 6e 20 76 78 77 6f 72 6b 73  iptor on vxworks
35c00 2e 20 4e 6f 74 20 62 65 63 61 75 73 65 0a 20 20  . Not because.  
35c10 2a 2a 20 76 78 77 6f 72 6b 73 20 77 6f 75 6c 64  ** vxworks would
35c20 20 6e 6f 74 20 62 65 6e 65 66 69 74 20 66 72 6f   not benefit fro
35c30 6d 20 74 68 65 20 63 68 61 6e 67 65 20 28 69 74  m the change (it
35c40 20 6d 69 67 68 74 2c 20 77 65 27 72 65 20 6e 6f   might, we're no
35c50 74 20 73 75 72 65 29 2c 0a 20 20 2a 2a 20 62 75  t sure),.  ** bu
35c60 74 20 62 65 63 61 75 73 65 20 6e 6f 20 77 61 79  t because no way
35c70 20 74 6f 20 74 65 73 74 20 69 74 20 69 73 20 63   to test it is c
35c80 75 72 72 65 6e 74 6c 79 20 61 76 61 69 6c 61 62  urrently availab
35c90 6c 65 2e 20 49 74 20 69 73 20 62 65 74 74 65 72  le. It is better
35ca0 20 0a 20 20 2a 2a 20 6e 6f 74 20 74 6f 20 72 69   .  ** not to ri
35cb0 73 6b 20 62 72 65 61 6b 69 6e 67 20 76 78 77 6f  sk breaking vxwo
35cc0 72 6b 73 20 73 75 70 70 6f 72 74 20 66 6f 72 20  rks support for 
35cd0 74 68 65 20 73 61 6b 65 20 6f 66 20 73 75 63 68  the sake of such
35ce0 20 61 6e 20 6f 62 73 63 75 72 65 20 0a 20 20 2a   an obscure .  *
35cf0 2a 20 66 65 61 74 75 72 65 2e 20 20 2a 2f 0a 23  * feature.  */.#
35d00 69 66 20 21 4f 53 5f 56 58 57 4f 52 4b 53 0a 20  if !OS_VXWORKS. 
35d10 20 73 74 72 75 63 74 20 73 74 61 74 20 73 53 74   struct stat sSt
35d20 61 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  at;             
35d30 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 73        /* Results
35d40 20 6f 66 20 73 74 61 74 28 29 20 63 61 6c 6c 20   of stat() call 
35d50 2a 2f 0a 0a 20 20 2f 2a 20 41 20 73 74 61 74 28  */..  /* A stat(
35d60 29 20 63 61 6c 6c 20 6d 61 79 20 66 61 69 6c 20  ) call may fail 
35d70 66 6f 72 20 76 61 72 69 6f 75 73 20 72 65 61 73  for various reas
35d80 6f 6e 73 2e 20 49 66 20 74 68 69 73 20 68 61 70  ons. If this hap
35d90 70 65 6e 73 2c 20 69 74 20 69 73 0a 20 20 2a 2a  pens, it is.  **
35da0 20 61 6c 6d 6f 73 74 20 63 65 72 74 61 69 6e 20   almost certain 
35db0 74 68 61 74 20 61 6e 20 6f 70 65 6e 28 29 20 63  that an open() c
35dc0 61 6c 6c 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  all on the same 
35dd0 70 61 74 68 20 77 69 6c 6c 20 61 6c 73 6f 20 66  path will also f
35de0 61 69 6c 2e 0a 20 20 2a 2a 20 46 6f 72 20 74 68  ail..  ** For th
35df0 69 73 20 72 65 61 73 6f 6e 2c 20 69 66 20 61 6e  is reason, if an
35e00 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 69 6e   error occurs in
35e10 20 74 68 65 20 73 74 61 74 28 29 20 63 61 6c 6c   the stat() call
35e20 20 68 65 72 65 2c 20 69 74 20 69 73 0a 20 20 2a   here, it is.  *
35e30 2a 20 69 67 6e 6f 72 65 64 20 61 6e 64 20 2d 31  * ignored and -1
35e40 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 54 68   is returned. Th
35e50 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 74 72  e caller will tr
35e60 79 20 74 6f 20 6f 70 65 6e 20 61 20 6e 65 77 20  y to open a new 
35e70 66 69 6c 65 0a 20 20 2a 2a 20 64 65 73 63 72 69  file.  ** descri
35e80 70 74 6f 72 20 6f 6e 20 74 68 65 20 73 61 6d 65  ptor on the same
35e90 20 70 61 74 68 2c 20 66 61 69 6c 2c 20 61 6e 64   path, fail, and
35ea0 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   return an error
35eb0 20 74 6f 20 53 51 4c 69 74 65 2e 0a 20 20 2a 2a   to SQLite..  **
35ec0 0a 20 20 2a 2a 20 45 76 65 6e 20 69 66 20 61 20  .  ** Even if a 
35ed0 73 75 62 73 65 71 75 65 6e 74 20 6f 70 65 6e 28  subsequent open(
35ee0 29 20 63 61 6c 6c 20 64 6f 65 73 20 73 75 63 63  ) call does succ
35ef0 65 65 64 2c 20 74 68 65 20 63 6f 6e 73 65 71 75  eed, the consequ
35f00 65 6e 63 65 73 20 6f 66 0a 20 20 2a 2a 20 6e 6f  ences of.  ** no
35f10 74 20 73 65 61 72 63 68 69 6e 67 20 66 6f 72 20  t searching for 
35f20 61 20 72 65 73 75 73 61 62 6c 65 20 66 69 6c 65  a resusable file
35f30 20 64 65 73 63 72 69 70 74 6f 72 20 61 72 65 20   descriptor are 
35f40 6e 6f 74 20 64 69 72 65 2e 20 20 2a 2f 0a 20 20  not dire.  */.  
35f50 69 66 28 20 30 3d 3d 6f 73 53 74 61 74 28 7a 50  if( 0==osStat(zP
35f60 61 74 68 2c 20 26 73 53 74 61 74 29 20 29 7b 0a  ath, &sStat) ){.
35f70 20 20 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66      unixInodeInf
35f80 6f 20 2a 70 49 6e 6f 64 65 3b 0a 0a 20 20 20 20  o *pInode;..    
35f90 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
35fa0 3b 0a 20 20 20 20 70 49 6e 6f 64 65 20 3d 20 69  ;.    pInode = i
35fb0 6e 6f 64 65 4c 69 73 74 3b 0a 20 20 20 20 77 68  nodeList;.    wh
35fc0 69 6c 65 28 20 70 49 6e 6f 64 65 20 26 26 20 28  ile( pInode && (
35fd0 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2e 64  pInode->fileId.d
35fe0 65 76 21 3d 73 53 74 61 74 2e 73 74 5f 64 65 76  ev!=sStat.st_dev
35ff0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
36000 20 20 20 20 20 20 7c 7c 20 70 49 6e 6f 64 65 2d        || pInode-
36010 3e 66 69 6c 65 49 64 2e 69 6e 6f 21 3d 73 53 74  >fileId.ino!=sSt
36020 61 74 2e 73 74 5f 69 6e 6f 29 20 29 7b 0a 20 20  at.st_ino) ){.  
36030 20 20 20 20 20 70 49 6e 6f 64 65 20 3d 20 70 49       pInode = pI
36040 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  node->pNext;.   
36050 20 7d 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64   }.    if( pInod
36060 65 20 29 7b 0a 20 20 20 20 20 20 55 6e 69 78 55  e ){.      UnixU
36070 6e 75 73 65 64 46 64 20 2a 2a 70 70 3b 0a 20 20  nusedFd **pp;.  
36080 20 20 20 20 66 6f 72 28 70 70 3d 26 70 49 6e 6f      for(pp=&pIno
36090 64 65 2d 3e 70 55 6e 75 73 65 64 3b 20 2a 70 70  de->pUnused; *pp
360a0 20 26 26 20 28 2a 70 70 29 2d 3e 66 6c 61 67 73   && (*pp)->flags
360b0 21 3d 66 6c 61 67 73 3b 20 70 70 3d 26 28 28 2a  !=flags; pp=&((*
360c0 70 70 29 2d 3e 70 4e 65 78 74 29 29 3b 0a 20 20  pp)->pNext));.  
360d0 20 20 20 20 70 55 6e 75 73 65 64 20 3d 20 2a 70      pUnused = *p
360e0 70 3b 0a 20 20 20 20 20 20 69 66 28 20 70 55 6e  p;.      if( pUn
360f0 75 73 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20  used ){.        
36100 2a 70 70 20 3d 20 70 55 6e 75 73 65 64 2d 3e 70  *pp = pUnused->p
36110 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Next;.      }.  
36120 20 20 7d 0a 20 20 20 20 75 6e 69 78 4c 65 61 76    }.    unixLeav
36130 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a 23 65  eMutex();.  }.#e
36140 6e 64 69 66 20 20 20 20 2f 2a 20 69 66 20 21 4f  ndif    /* if !O
36150 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 20 20 72  S_VXWORKS */.  r
36160 65 74 75 72 6e 20 70 55 6e 75 73 65 64 3b 0a 7d  eturn pUnused;.}
36170 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
36180 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
36190 62 79 20 75 6e 69 78 4f 70 65 6e 28 29 20 74 6f  by unixOpen() to
361a0 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 75   determine the u
361b0 6e 69 78 20 70 65 72 6d 69 73 73 69 6f 6e 73 0a  nix permissions.
361c0 2a 2a 20 74 6f 20 63 72 65 61 74 65 20 6e 65 77  ** to create new
361d0 20 66 69 6c 65 73 20 77 69 74 68 2e 20 49 66 20   files with. If 
361e0 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  no error occurs,
361f0 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 20   then SQLITE_OK 
36200 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61  is returned.** a
36210 6e 64 20 61 20 76 61 6c 75 65 20 73 75 69 74 61  nd a value suita
36220 62 6c 65 20 66 6f 72 20 70 61 73 73 69 6e 67 20  ble for passing 
36230 61 73 20 74 68 65 20 74 68 69 72 64 20 61 72 67  as the third arg
36240 75 6d 65 6e 74 20 74 6f 20 6f 70 65 6e 28 32 29  ument to open(2)
36250 20 69 73 0a 2a 2a 20 77 72 69 74 74 65 6e 20 74   is.** written t
36260 6f 20 2a 70 4d 6f 64 65 2e 20 49 66 20 61 6e 20  o *pMode. If an 
36270 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  IO error occurs,
36280 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
36290 20 63 6f 64 65 20 69 73 20 0a 2a 2a 20 72 65 74   code is .** ret
362a0 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 76 61  urned and the va
362b0 6c 75 65 20 6f 66 20 2a 70 4d 6f 64 65 20 69 73  lue of *pMode is
362c0 20 6e 6f 74 20 6d 6f 64 69 66 69 65 64 2e 0a 2a   not modified..*
362d0 2a 0a 2a 2a 20 49 6e 20 6d 6f 73 74 20 63 61 73  *.** In most cas
362e0 65 73 20 63 61 73 65 73 2c 20 74 68 69 73 20 72  es cases, this r
362f0 6f 75 74 69 6e 65 20 73 65 74 73 20 2a 70 4d 6f  outine sets *pMo
36300 64 65 20 74 6f 20 30 2c 20 77 68 69 63 68 20 77  de to 0, which w
36310 69 6c 6c 20 62 65 63 6f 6d 65 0a 2a 2a 20 61 6e  ill become.** an
36320 20 69 6e 64 69 63 61 74 69 6f 6e 20 74 6f 20 72   indication to r
36330 6f 62 75 73 74 5f 6f 70 65 6e 28 29 20 74 6f 20  obust_open() to 
36340 63 72 65 61 74 65 20 74 68 65 20 66 69 6c 65 20  create the file 
36350 75 73 69 6e 67 0a 2a 2a 20 53 51 4c 49 54 45 5f  using.** SQLITE_
36360 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52  DEFAULT_FILE_PER
36370 4d 49 53 53 49 4f 4e 53 20 61 64 6a 75 73 74 65  MISSIONS adjuste
36380 64 20 62 79 20 74 68 65 20 75 6d 61 73 6b 2e 0a  d by the umask..
36390 2a 2a 20 42 75 74 20 69 66 20 74 68 65 20 66 69  ** But if the fi
363a0 6c 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20  le being opened 
363b0 69 73 20 61 20 57 41 4c 20 6f 72 20 72 65 67 75  is a WAL or regu
363c0 6c 61 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  lar journal file
363d0 2c 20 74 68 65 6e 20 0a 2a 2a 20 74 68 69 73 20  , then .** this 
363e0 66 75 6e 63 74 69 6f 6e 20 71 75 65 72 69 65 73  function queries
363f0 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
36400 20 66 6f 72 20 74 68 65 20 70 65 72 6d 69 73 73   for the permiss
36410 69 6f 6e 73 20 6f 6e 20 74 68 65 20 0a 2a 2a 20  ions on the .** 
36420 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 64 61  corresponding da
36430 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20  tabase file and 
36440 73 65 74 73 20 2a 70 4d 6f 64 65 20 74 6f 20 74  sets *pMode to t
36450 68 69 73 20 76 61 6c 75 65 2e 20 57 68 65 6e 65  his value. Whene
36460 76 65 72 20 0a 2a 2a 20 70 6f 73 73 69 62 6c 65  ver .** possible
36470 2c 20 57 41 4c 20 61 6e 64 20 6a 6f 75 72 6e 61  , WAL and journa
36480 6c 20 66 69 6c 65 73 20 61 72 65 20 63 72 65 61  l files are crea
36490 74 65 64 20 75 73 69 6e 67 20 74 68 65 20 73 61  ted using the sa
364a0 6d 65 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 0a  me permissions .
364b0 2a 2a 20 61 73 20 74 68 65 20 61 73 73 6f 63 69  ** as the associ
364c0 61 74 65 64 20 64 61 74 61 62 61 73 65 20 66 69  ated database fi
364d0 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  le..**.** If the
364e0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 38   SQLITE_ENABLE_8
364f0 5f 33 5f 4e 41 4d 45 53 20 6f 70 74 69 6f 6e 20  _3_NAMES option 
36500 69 73 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e  is enabled, then
36510 20 74 68 65 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c   the.** original
36520 20 66 69 6c 65 6e 61 6d 65 20 69 73 20 75 6e 61   filename is una
36530 76 61 69 6c 61 62 6c 65 2e 20 20 42 75 74 20 38  vailable.  But 8
36540 5f 33 5f 4e 41 4d 45 53 20 69 73 20 6f 6e 6c 79  _3_NAMES is only
36550 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 46 41 54   used for.** FAT
36560 20 66 69 6c 65 73 79 73 74 65 6d 73 20 61 6e 64   filesystems and
36570 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 64 6f 20   permissions do 
36580 6e 6f 74 20 6d 61 74 74 65 72 20 74 68 65 72 65  not matter there
36590 2c 20 73 6f 20 6a 75 73 74 20 75 73 65 0a 2a 2a  , so just use.**
365a0 20 74 68 65 20 64 65 66 61 75 6c 74 20 70 65 72   the default per
365b0 6d 69 73 73 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 61  missions..*/.sta
365c0 74 69 63 20 69 6e 74 20 66 69 6e 64 43 72 65 61  tic int findCrea
365d0 74 65 46 69 6c 65 4d 6f 64 65 28 0a 20 20 63 6f  teFileMode(.  co
365e0 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c  nst char *zPath,
365f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
36600 20 50 61 74 68 20 6f 66 20 66 69 6c 65 20 28 70   Path of file (p
36610 6f 73 73 69 62 6c 79 29 20 62 65 69 6e 67 20 63  ossibly) being c
36620 72 65 61 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20  reated */.  int 
36630 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  flags,          
36640 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
36650 6c 61 67 73 20 70 61 73 73 65 64 20 61 73 20 34  lags passed as 4
36660 74 68 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 78  th argument to x
36670 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 6d 6f 64 65  Open() */.  mode
36680 5f 74 20 2a 70 4d 6f 64 65 2c 20 20 20 20 20 20  _t *pMode,      
36690 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
366a0 55 54 3a 20 50 65 72 6d 69 73 73 69 6f 6e 73 20  UT: Permissions 
366b0 74 6f 20 6f 70 65 6e 20 66 69 6c 65 20 77 69 74  to open file wit
366c0 68 20 2a 2f 0a 20 20 75 69 64 5f 74 20 2a 70 55  h */.  uid_t *pU
366d0 69 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  id,             
366e0 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 75         /* OUT: u
366f0 69 64 20 74 6f 20 73 65 74 20 6f 6e 20 74 68 65  id to set on the
36700 20 66 69 6c 65 20 2a 2f 0a 20 20 67 69 64 5f 74   file */.  gid_t
36710 20 2a 70 47 69 64 20 20 20 20 20 20 20 20 20 20   *pGid          
36720 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
36730 54 3a 20 67 69 64 20 74 6f 20 73 65 74 20 6f 6e  T: gid to set on
36740 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a   the file */.){.
36750 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
36760 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
36770 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65    /* Return Code
36780 20 2a 2f 0a 20 20 2a 70 4d 6f 64 65 20 3d 20 30   */.  *pMode = 0
36790 3b 0a 20 20 2a 70 55 69 64 20 3d 20 30 3b 0a 20  ;.  *pUid = 0;. 
367a0 20 2a 70 47 69 64 20 3d 20 30 3b 0a 20 20 69 66   *pGid = 0;.  if
367b0 28 20 66 6c 61 67 73 20 26 20 28 53 51 4c 49 54  ( flags & (SQLIT
367c0 45 5f 4f 50 45 4e 5f 57 41 4c 7c 53 51 4c 49 54  E_OPEN_WAL|SQLIT
367d0 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52  E_OPEN_MAIN_JOUR
367e0 4e 41 4c 29 20 29 7b 0a 20 20 20 20 63 68 61 72  NAL) ){.    char
367f0 20 7a 44 62 5b 4d 41 58 5f 50 41 54 48 4e 41 4d   zDb[MAX_PATHNAM
36800 45 2b 31 5d 3b 20 20 20 20 20 2f 2a 20 44 61 74  E+1];     /* Dat
36810 61 62 61 73 65 20 66 69 6c 65 20 70 61 74 68 20  abase file path 
36820 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 44 62 3b 20  */.    int nDb; 
36830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36840 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
36850 66 20 76 61 6c 69 64 20 62 79 74 65 73 20 69 6e  f valid bytes in
36860 20 7a 44 62 20 2a 2f 0a 20 20 20 20 73 74 72 75   zDb */.    stru
36870 63 74 20 73 74 61 74 20 73 53 74 61 74 3b 20 20  ct stat sStat;  
36880 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74            /* Out
36890 70 75 74 20 6f 66 20 73 74 61 74 28 29 20 6f 6e  put of stat() on
368a0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
368b0 2f 0a 0a 20 20 20 20 2f 2a 20 7a 50 61 74 68 20  /..    /* zPath 
368c0 69 73 20 61 20 70 61 74 68 20 74 6f 20 61 20 57  is a path to a W
368d0 41 4c 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66 69  AL or journal fi
368e0 6c 65 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  le. The followin
368f0 67 20 62 6c 6f 63 6b 20 64 65 72 69 76 65 73 0a  g block derives.
36900 20 20 20 20 2a 2a 20 74 68 65 20 70 61 74 68 20      ** the path 
36910 74 6f 20 74 68 65 20 61 73 73 6f 63 69 61 74 65  to the associate
36920 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  d database file 
36930 66 72 6f 6d 20 7a 50 61 74 68 2e 20 54 68 69 73  from zPath. This
36940 20 62 6c 6f 63 6b 20 68 61 6e 64 6c 65 73 0a 20   block handles. 
36950 20 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77     ** the follow
36960 69 6e 67 20 6e 61 6d 69 6e 67 20 63 6f 6e 76 65  ing naming conve
36970 6e 74 69 6f 6e 73 3a 0a 20 20 20 20 2a 2a 0a 20  ntions:.    **. 
36980 20 20 20 2a 2a 20 20 20 22 3c 70 61 74 68 20 74     **   "<path t
36990 6f 20 64 62 3e 2d 6a 6f 75 72 6e 61 6c 22 0a 20  o db>-journal". 
369a0 20 20 20 2a 2a 20 20 20 22 3c 70 61 74 68 20 74     **   "<path t
369b0 6f 20 64 62 3e 2d 77 61 6c 22 0a 20 20 20 20 2a  o db>-wal".    *
369c0 2a 20 20 20 22 3c 70 61 74 68 20 74 6f 20 64 62  *   "<path to db
369d0 3e 2d 6a 6f 75 72 6e 61 6c 4e 4e 22 0a 20 20 20  >-journalNN".   
369e0 20 2a 2a 20 20 20 22 3c 70 61 74 68 20 74 6f 20   **   "<path to 
369f0 64 62 3e 2d 77 61 6c 4e 4e 22 0a 20 20 20 20 2a  db>-walNN".    *
36a00 2a 0a 20 20 20 20 2a 2a 20 77 68 65 72 65 20 4e  *.    ** where N
36a10 4e 20 69 73 20 61 20 64 65 63 69 6d 61 6c 20 6e  N is a decimal n
36a20 75 6d 62 65 72 2e 20 54 68 65 20 4e 4e 20 6e 61  umber. The NN na
36a30 6d 69 6e 67 20 73 63 68 65 6d 65 73 20 61 72 65  ming schemes are
36a40 20 0a 20 20 20 20 2a 2a 20 75 73 65 64 20 62 79   .    ** used by
36a50 20 74 68 65 20 74 65 73 74 5f 6d 75 6c 74 69 70   the test_multip
36a60 6c 65 78 2e 63 20 6d 6f 64 75 6c 65 2e 0a 20 20  lex.c module..  
36a70 20 20 2a 2f 0a 20 20 20 20 6e 44 62 20 3d 20 73    */.    nDb = s
36a80 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
36a90 50 61 74 68 29 20 2d 20 31 3b 20 0a 23 69 66 64  Path) - 1; .#ifd
36aa0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
36ab0 5f 38 5f 33 5f 4e 41 4d 45 53 0a 20 20 20 20 77  _8_3_NAMES.    w
36ac0 68 69 6c 65 28 20 6e 44 62 3e 30 20 26 26 20 73  hile( nDb>0 && s
36ad0 71 6c 69 74 65 33 49 73 61 6c 6e 75 6d 28 7a 50  qlite3Isalnum(zP
36ae0 61 74 68 5b 6e 44 62 5d 29 20 29 20 6e 44 62 2d  ath[nDb]) ) nDb-
36af0 2d 3b 0a 20 20 20 20 69 66 28 20 6e 44 62 3d 3d  -;.    if( nDb==
36b00 30 20 7c 7c 20 7a 50 61 74 68 5b 6e 44 62 5d 21  0 || zPath[nDb]!
36b10 3d 27 2d 27 20 29 20 72 65 74 75 72 6e 20 53 51  ='-' ) return SQ
36b20 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6c 73 65 0a 20  LITE_OK;.#else. 
36b30 20 20 20 77 68 69 6c 65 28 20 7a 50 61 74 68 5b     while( zPath[
36b40 6e 44 62 5d 21 3d 27 2d 27 20 29 7b 0a 20 20 20  nDb]!='-' ){.   
36b50 20 20 20 61 73 73 65 72 74 28 20 6e 44 62 3e 30     assert( nDb>0
36b60 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
36b70 28 20 7a 50 61 74 68 5b 6e 44 62 5d 21 3d 27 5c  ( zPath[nDb]!='\
36b80 6e 27 20 29 3b 0a 20 20 20 20 20 20 6e 44 62 2d  n' );.      nDb-
36b90 2d 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  -;.    }.#endif.
36ba0 20 20 20 20 6d 65 6d 63 70 79 28 7a 44 62 2c 20      memcpy(zDb, 
36bb0 7a 50 61 74 68 2c 20 6e 44 62 29 3b 0a 20 20 20  zPath, nDb);.   
36bc0 20 7a 44 62 5b 6e 44 62 5d 20 3d 20 27 5c 30 27   zDb[nDb] = '\0'
36bd0 3b 0a 0a 20 20 20 20 69 66 28 20 30 3d 3d 6f 73  ;..    if( 0==os
36be0 53 74 61 74 28 7a 44 62 2c 20 26 73 53 74 61 74  Stat(zDb, &sStat
36bf0 29 20 29 7b 0a 20 20 20 20 20 20 2a 70 4d 6f 64  ) ){.      *pMod
36c00 65 20 3d 20 73 53 74 61 74 2e 73 74 5f 6d 6f 64  e = sStat.st_mod
36c10 65 20 26 20 30 37 37 37 3b 0a 20 20 20 20 20 20  e & 0777;.      
36c20 2a 70 55 69 64 20 3d 20 73 53 74 61 74 2e 73 74  *pUid = sStat.st
36c30 5f 75 69 64 3b 0a 20 20 20 20 20 20 2a 70 47 69  _uid;.      *pGi
36c40 64 20 3d 20 73 53 74 61 74 2e 73 74 5f 67 69 64  d = sStat.st_gid
36c50 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
36c60 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
36c70 4f 45 52 52 5f 46 53 54 41 54 3b 0a 20 20 20 20  OERR_FSTAT;.    
36c80 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c  }.  }else if( fl
36c90 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
36ca0 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20  N_DELETEONCLOSE 
36cb0 29 7b 0a 20 20 20 20 2a 70 4d 6f 64 65 20 3d 20  ){.    *pMode = 
36cc0 30 36 30 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75  0600;.  }.  retu
36cd0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
36ce0 4f 70 65 6e 20 74 68 65 20 66 69 6c 65 20 7a 50  Open the file zP
36cf0 61 74 68 2e 0a 2a 2a 20 0a 2a 2a 20 50 72 65 76  ath..** .** Prev
36d00 69 6f 75 73 6c 79 2c 20 74 68 65 20 53 51 4c 69  iously, the SQLi
36d10 74 65 20 4f 53 20 6c 61 79 65 72 20 75 73 65 64  te OS layer used
36d20 20 74 68 72 65 65 20 66 75 6e 63 74 69 6f 6e 73   three functions
36d30 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 74 68 69   in place of thi
36d40 73 0a 2a 2a 20 6f 6e 65 3a 0a 2a 2a 0a 2a 2a 20  s.** one:.**.** 
36d50 20 20 20 20 73 71 6c 69 74 65 33 4f 73 4f 70 65      sqlite3OsOpe
36d60 6e 52 65 61 64 57 72 69 74 65 28 29 3b 0a 2a 2a  nReadWrite();.**
36d70 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 4f 70       sqlite3OsOp
36d80 65 6e 52 65 61 64 4f 6e 6c 79 28 29 3b 0a 2a 2a  enReadOnly();.**
36d90 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 4f 70       sqlite3OsOp
36da0 65 6e 45 78 63 6c 75 73 69 76 65 28 29 3b 0a 2a  enExclusive();.*
36db0 2a 0a 2a 2a 20 54 68 65 73 65 20 63 61 6c 6c 73  *.** These calls
36dc0 20 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20 74   correspond to t
36dd0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d  he following com
36de0 62 69 6e 61 74 69 6f 6e 73 20 6f 66 20 66 6c 61  binations of fla
36df0 67 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 52 65  gs:.**.**     Re
36e00 61 64 57 72 69 74 65 28 29 20 2d 3e 20 20 20 20  adWrite() ->    
36e10 20 28 52 45 41 44 57 52 49 54 45 20 7c 20 43 52   (READWRITE | CR
36e20 45 41 54 45 29 0a 2a 2a 20 20 20 20 20 52 65 61  EATE).**     Rea
36e30 64 4f 6e 6c 79 28 29 20 20 2d 3e 20 20 20 20 20  dOnly()  ->     
36e40 28 52 45 41 44 4f 4e 4c 59 29 20 0a 2a 2a 20 20  (READONLY) .**  
36e50 20 20 20 4f 70 65 6e 45 78 63 6c 75 73 69 76 65     OpenExclusive
36e60 28 29 20 2d 3e 20 28 52 45 41 44 57 52 49 54 45  () -> (READWRITE
36e70 20 7c 20 43 52 45 41 54 45 20 7c 20 45 58 43 4c   | CREATE | EXCL
36e80 55 53 49 56 45 29 0a 2a 2a 0a 2a 2a 20 54 68 65  USIVE).**.** The
36e90 20 6f 6c 64 20 4f 70 65 6e 45 78 63 6c 75 73 69   old OpenExclusi
36ea0 76 65 28 29 20 61 63 63 65 70 74 65 64 20 61 20  ve() accepted a 
36eb0 62 6f 6f 6c 65 61 6e 20 61 72 67 75 6d 65 6e 74  boolean argument
36ec0 20 2d 20 22 64 65 6c 46 6c 61 67 22 2e 20 49 66   - "delFlag". If
36ed0 0a 2a 2a 20 74 72 75 65 2c 20 74 68 65 20 66 69  .** true, the fi
36ee0 6c 65 20 77 61 73 20 63 6f 6e 66 69 67 75 72 65  le was configure
36ef0 64 20 74 6f 20 62 65 20 61 75 74 6f 6d 61 74 69  d to be automati
36f00 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 20 77 68  cally deleted wh
36f10 65 6e 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 68  en the.** file h
36f20 61 6e 64 6c 65 20 63 6c 6f 73 65 64 2e 20 54 6f  andle closed. To
36f30 20 61 63 68 69 65 76 65 20 74 68 65 20 73 61 6d   achieve the sam
36f40 65 20 65 66 66 65 63 74 20 75 73 69 6e 67 20 74  e effect using t
36f50 68 69 73 20 6e 65 77 20 0a 2a 2a 20 69 6e 74 65  his new .** inte
36f60 72 66 61 63 65 2c 20 61 64 64 20 74 68 65 20 44  rface, add the D
36f70 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 66 6c 61  ELETEONCLOSE fla
36f80 67 20 74 6f 20 74 68 6f 73 65 20 73 70 65 63 69  g to those speci
36f90 66 69 65 64 20 61 62 6f 76 65 20 66 6f 72 20 0a  fied above for .
36fa0 2a 2a 20 4f 70 65 6e 45 78 63 6c 75 73 69 76 65  ** OpenExclusive
36fb0 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ()..*/.static in
36fc0 74 20 75 6e 69 78 4f 70 65 6e 28 0a 20 20 73 71  t unixOpen(.  sq
36fd0 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
36fe0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
36ff0 65 20 56 46 53 20 66 6f 72 20 77 68 69 63 68 20  e VFS for which 
37000 74 68 69 73 20 69 73 20 74 68 65 20 78 4f 70 65  this is the xOpe
37010 6e 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 63 6f  n method */.  co
37020 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c  nst char *zPath,
37030 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
37040 74 68 6e 61 6d 65 20 6f 66 20 66 69 6c 65 20 74  thname of file t
37050 6f 20 62 65 20 6f 70 65 6e 65 64 20 2a 2f 0a 20  o be opened */. 
37060 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70   sqlite3_file *p
37070 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  File,         /*
37080 20 54 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   The file descri
37090 70 74 6f 72 20 74 6f 20 62 65 20 66 69 6c 6c 65  ptor to be fille
370a0 64 20 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  d in */.  int fl
370b0 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ags,            
370c0 20 20 20 20 20 20 20 2f 2a 20 49 6e 70 75 74 20         /* Input 
370d0 66 6c 61 67 73 20 74 6f 20 63 6f 6e 74 72 6f 6c  flags to control
370e0 20 74 68 65 20 6f 70 65 6e 69 6e 67 20 2a 2f 0a   the opening */.
370f0 20 20 69 6e 74 20 2a 70 4f 75 74 46 6c 61 67 73    int *pOutFlags
37100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
37110 2a 20 4f 75 74 70 75 74 20 66 6c 61 67 73 20 72  * Output flags r
37120 65 74 75 72 6e 65 64 20 74 6f 20 53 51 4c 69 74  eturned to SQLit
37130 65 20 63 6f 72 65 20 2a 2f 0a 29 7b 0a 20 20 75  e core */.){.  u
37140 6e 69 78 46 69 6c 65 20 2a 70 20 3d 20 28 75 6e  nixFile *p = (un
37150 69 78 46 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a  ixFile *)pFile;.
37160 20 20 69 6e 74 20 66 64 20 3d 20 2d 31 3b 20 20    int fd = -1;  
37170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37180 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70   /* File descrip
37190 74 6f 72 20 72 65 74 75 72 6e 65 64 20 62 79 20  tor returned by 
371a0 6f 70 65 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20  open() */.  int 
371b0 6f 70 65 6e 46 6c 61 67 73 20 3d 20 30 3b 20 20  openFlags = 0;  
371c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c             /* Fl
371d0 61 67 73 20 74 6f 20 70 61 73 73 20 74 6f 20 6f  ags to pass to o
371e0 70 65 6e 28 29 20 2a 2f 0a 23 69 66 20 53 51 4c  pen() */.#if SQL
371f0 49 54 45 5f 45 4e 41 42 4c 45 5f 44 41 54 41 5f  ITE_ENABLE_DATA_
37200 50 52 4f 54 45 43 54 49 4f 4e 0a 20 20 69 6e 74  PROTECTION.  int
37210 20 65 54 79 70 65 20 3d 20 66 6c 61 67 73 26 30   eType = flags&0
37220 78 46 46 30 46 46 46 30 30 3b 20 20 2f 2a 20 54  xFF0FFF00;  /* T
37230 79 70 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 6f  ype of file to o
37240 70 65 6e 20 2a 2f 0a 23 65 6c 73 65 0a 20 20 69  pen */.#else.  i
37250 6e 74 20 65 54 79 70 65 20 3d 20 66 6c 61 67 73  nt eType = flags
37260 26 30 78 46 46 46 46 46 46 30 30 3b 20 20 2f 2a  &0xFFFFFF00;  /*
37270 20 54 79 70 65 20 6f 66 20 66 69 6c 65 20 74 6f   Type of file to
37280 20 6f 70 65 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a   open */.#endif.
37290 20 20 69 6e 74 20 6e 6f 4c 6f 63 6b 3b 20 20 20    int noLock;   
372a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
372b0 20 2f 2a 20 54 72 75 65 20 74 6f 20 6f 6d 69 74   /* True to omit
372c0 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69 74 69   locking primiti
372d0 76 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ves */.  int rc 
372e0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
372f0 20 20 20 20 20 20 20 20 2f 2a 20 46 75 6e 63 74          /* Funct
37300 69 6f 6e 20 52 65 74 75 72 6e 20 43 6f 64 65 20  ion Return Code 
37310 2a 2f 0a 20 20 69 6e 74 20 63 74 72 6c 46 6c 61  */.  int ctrlFla
37320 67 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  gs = 0;         
37330 20 20 20 20 2f 2a 20 55 4e 49 58 46 49 4c 45 5f      /* UNIXFILE_
37340 2a 20 66 6c 61 67 73 20 2a 2f 0a 0a 20 20 69 6e  * flags */..  in
37350 74 20 69 73 45 78 63 6c 75 73 69 76 65 20 20 3d  t isExclusive  =
37360 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
37370 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 29  _OPEN_EXCLUSIVE)
37380 3b 0a 20 20 69 6e 74 20 69 73 44 65 6c 65 74 65  ;.  int isDelete
37390 20 20 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20       = (flags & 
373a0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45  SQLITE_OPEN_DELE
373b0 54 45 4f 4e 43 4c 4f 53 45 29 3b 0a 20 20 69 6e  TEONCLOSE);.  in
373c0 74 20 69 73 43 72 65 61 74 65 20 20 20 20 20 3d  t isCreate     =
373d0 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
373e0 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29 3b 0a 20  _OPEN_CREATE);. 
373f0 20 69 6e 74 20 69 73 52 65 61 64 6f 6e 6c 79 20   int isReadonly 
37400 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c    = (flags & SQL
37410 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
37420 59 29 3b 0a 20 20 69 6e 74 20 69 73 52 65 61 64  Y);.  int isRead
37430 57 72 69 74 65 20 20 3d 20 28 66 6c 61 67 73 20  Write  = (flags 
37440 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  & SQLITE_OPEN_RE
37450 41 44 57 52 49 54 45 29 3b 0a 23 69 66 20 53 51  ADWRITE);.#if SQ
37460 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
37470 49 4e 47 5f 53 54 59 4c 45 0a 20 20 69 6e 74 20  ING_STYLE.  int 
37480 69 73 41 75 74 6f 50 72 6f 78 79 20 20 3d 20 28  isAutoProxy  = (
37490 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
374a0 50 45 4e 5f 41 55 54 4f 50 52 4f 58 59 29 3b 0a  PEN_AUTOPROXY);.
374b0 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e  #endif.#if defin
374c0 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 7c 7c  ed(__APPLE__) ||
374d0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
374e0 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 73  OCKING_STYLE.  s
374f0 74 72 75 63 74 20 73 74 61 74 66 73 20 66 73 49  truct statfs fsI
37500 6e 66 6f 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  nfo;.#endif..  /
37510 2a 20 49 66 20 63 72 65 61 74 69 6e 67 20 61 20  * If creating a 
37520 6d 61 73 74 65 72 20 6f 72 20 6d 61 69 6e 2d 66  master or main-f
37530 69 6c 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 69  ile journal, thi
37540 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20  s function will 
37550 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 66 69 6c 65  open.  ** a file
37560 2d 64 65 73 63 72 69 70 74 6f 72 20 6f 6e 20 74  -descriptor on t
37570 68 65 20 64 69 72 65 63 74 6f 72 79 20 74 6f 6f  he directory too
37580 2e 20 54 68 65 20 66 69 72 73 74 20 74 69 6d 65  . The first time
37590 20 75 6e 69 78 53 79 6e 63 28 29 0a 20 20 2a 2a   unixSync().  **
375a0 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20 64   is called the d
375b0 69 72 65 63 74 6f 72 79 20 66 69 6c 65 20 64 65  irectory file de
375c0 73 63 72 69 70 74 6f 72 20 77 69 6c 6c 20 62 65  scriptor will be
375d0 20 66 73 79 6e 63 28 29 65 64 20 61 6e 64 20 63   fsync()ed and c
375e0 6c 6f 73 65 28 29 64 2e 0a 20 20 2a 2f 0a 20 20  lose()d..  */.  
375f0 69 6e 74 20 73 79 6e 63 44 69 72 20 3d 20 28 69  int syncDir = (i
37600 73 43 72 65 61 74 65 20 26 26 20 28 0a 20 20 20  sCreate && (.   
37610 20 20 20 20 20 65 54 79 70 65 3d 3d 53 51 4c 49       eType==SQLI
37620 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a  TE_OPEN_MASTER_J
37630 4f 55 52 4e 41 4c 20 0a 20 20 20 20 20 7c 7c 20  OURNAL .     || 
37640 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
37650 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20  EN_MAIN_JOURNAL 
37660 0a 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d  .     || eType==
37670 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a  SQLITE_OPEN_WAL.
37680 20 20 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 61    ));..  /* If a
37690 72 67 75 6d 65 6e 74 20 7a 50 61 74 68 20 69 73  rgument zPath is
376a0 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2c   a NULL pointer,
376b0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
376c0 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 6f 70  s required to op
376d0 65 6e 0a 20 20 2a 2a 20 61 20 74 65 6d 70 6f 72  en.  ** a tempor
376e0 61 72 79 20 66 69 6c 65 2e 20 55 73 65 20 74 68  ary file. Use th
376f0 69 73 20 62 75 66 66 65 72 20 74 6f 20 73 74 6f  is buffer to sto
37700 72 65 20 74 68 65 20 66 69 6c 65 20 6e 61 6d 65  re the file name
37710 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20 63 68 61 72   in..  */.  char
37720 20 7a 54 6d 70 6e 61 6d 65 5b 4d 41 58 5f 50 41   zTmpname[MAX_PA
37730 54 48 4e 41 4d 45 2b 32 5d 3b 0a 20 20 63 6f 6e  THNAME+2];.  con
37740 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d  st char *zName =
37750 20 7a 50 61 74 68 3b 0a 0a 20 20 2f 2a 20 43 68   zPath;..  /* Ch
37760 65 63 6b 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  eck the followin
37770 67 20 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65  g statements are
37780 20 74 72 75 65 3a 20 0a 20 20 2a 2a 0a 20 20 2a   true: .  **.  *
37790 2a 20 20 20 28 61 29 20 45 78 61 63 74 6c 79 20  *   (a) Exactly 
377a0 6f 6e 65 20 6f 66 20 74 68 65 20 52 45 41 44 57  one of the READW
377b0 52 49 54 45 20 61 6e 64 20 52 45 41 44 4f 4e 4c  RITE and READONL
377c0 59 20 66 6c 61 67 73 20 6d 75 73 74 20 62 65 20  Y flags must be 
377d0 73 65 74 2c 20 61 6e 64 20 0a 20 20 2a 2a 20 20  set, and .  **  
377e0 20 28 62 29 20 69 66 20 43 52 45 41 54 45 20 69   (b) if CREATE i
377f0 73 20 73 65 74 2c 20 74 68 65 6e 20 52 45 41 44  s set, then READ
37800 57 52 49 54 45 20 6d 75 73 74 20 61 6c 73 6f 20  WRITE must also 
37810 62 65 20 73 65 74 2c 20 61 6e 64 0a 20 20 2a 2a  be set, and.  **
37820 20 20 20 28 63 29 20 69 66 20 45 58 43 4c 55 53     (c) if EXCLUS
37830 49 56 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e  IVE is set, then
37840 20 43 52 45 41 54 45 20 6d 75 73 74 20 61 6c 73   CREATE must als
37850 6f 20 62 65 20 73 65 74 2e 0a 20 20 2a 2a 20 20  o be set..  **  
37860 20 28 64 29 20 69 66 20 44 45 4c 45 54 45 4f 4e   (d) if DELETEON
37870 43 4c 4f 53 45 20 69 73 20 73 65 74 2c 20 74 68  CLOSE is set, th
37880 65 6e 20 43 52 45 41 54 45 20 6d 75 73 74 20 61  en CREATE must a
37890 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20 20 2a 2f  lso be set..  */
378a0 0a 20 20 61 73 73 65 72 74 28 28 69 73 52 65 61  .  assert((isRea
378b0 64 6f 6e 6c 79 3d 3d 30 20 7c 7c 20 69 73 52 65  donly==0 || isRe
378c0 61 64 57 72 69 74 65 3d 3d 30 29 20 26 26 20 28  adWrite==0) && (
378d0 69 73 52 65 61 64 57 72 69 74 65 20 7c 7c 20 69  isReadWrite || i
378e0 73 52 65 61 64 6f 6e 6c 79 29 29 3b 0a 20 20 61  sReadonly));.  a
378f0 73 73 65 72 74 28 69 73 43 72 65 61 74 65 3d 3d  ssert(isCreate==
37900 30 20 7c 7c 20 69 73 52 65 61 64 57 72 69 74 65  0 || isReadWrite
37910 29 3b 0a 20 20 61 73 73 65 72 74 28 69 73 45 78  );.  assert(isEx
37920 63 6c 75 73 69 76 65 3d 3d 30 20 7c 7c 20 69 73  clusive==0 || is
37930 43 72 65 61 74 65 29 3b 0a 20 20 61 73 73 65 72  Create);.  asser
37940 74 28 69 73 44 65 6c 65 74 65 3d 3d 30 20 7c 7c  t(isDelete==0 ||
37950 20 69 73 43 72 65 61 74 65 29 3b 0a 0a 20 20 2f   isCreate);..  /
37960 2a 20 54 68 65 20 6d 61 69 6e 20 44 42 2c 20 6d  * The main DB, m
37970 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 57 41 4c  ain journal, WAL
37980 20 66 69 6c 65 20 61 6e 64 20 6d 61 73 74 65 72   file and master
37990 20 6a 6f 75 72 6e 61 6c 20 61 72 65 20 6e 65 76   journal are nev
379a0 65 72 20 0a 20 20 2a 2a 20 61 75 74 6f 6d 61 74  er .  ** automat
379b0 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 2e 20  ically deleted. 
379c0 4e 6f 72 20 61 72 65 20 74 68 65 79 20 65 76 65  Nor are they eve
379d0 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  r temporary file
379e0 73 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  s.  */.  assert(
379f0 20 28 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a   (!isDelete && z
37a00 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d  Name) || eType!=
37a10 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
37a20 5f 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _DB );.  assert(
37a30 20 28 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a   (!isDelete && z
37a40 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d  Name) || eType!=
37a50 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
37a60 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20 20 61 73  _JOURNAL );.  as
37a70 73 65 72 74 28 20 28 21 69 73 44 65 6c 65 74 65  sert( (!isDelete
37a80 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54   && zName) || eT
37a90 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype!=SQLITE_OPEN
37aa0 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20  _MASTER_JOURNAL 
37ab0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 21 69  );.  assert( (!i
37ac0 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65  sDelete && zName
37ad0 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49  ) || eType!=SQLI
37ae0 54 45 5f 4f 50 45 4e 5f 57 41 4c 20 29 3b 0a 0a  TE_OPEN_WAL );..
37af0 20 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61 74    /* Assert that
37b00 20 74 68 65 20 75 70 70 65 72 20 6c 61 79 65 72   the upper layer
37b10 20 68 61 73 20 73 65 74 20 6f 6e 65 20 6f 66 20   has set one of 
37b20 74 68 65 20 22 66 69 6c 65 2d 74 79 70 65 22 20  the "file-type" 
37b30 66 6c 61 67 73 2e 20 2a 2f 0a 20 20 61 73 73 65  flags. */.  asse
37b40 72 74 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54  rt( eType==SQLIT
37b50 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 20  E_OPEN_MAIN_DB  
37b60 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51      || eType==SQ
37b70 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44  LITE_OPEN_TEMP_D
37b80 42 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79  B .       || eTy
37b90 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
37ba0 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 7c 7c 20  MAIN_JOURNAL || 
37bb0 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
37bc0 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 20  EN_TEMP_JOURNAL 
37bd0 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65  .       || eType
37be0 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55  ==SQLITE_OPEN_SU
37bf0 42 4a 4f 55 52 4e 41 4c 20 20 20 7c 7c 20 65 54  BJOURNAL   || eT
37c00 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
37c10 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20  _MASTER_JOURNAL 
37c20 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65  .       || eType
37c30 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 52  ==SQLITE_OPEN_TR
37c40 41 4e 53 49 45 4e 54 5f 44 42 20 7c 7c 20 65 54  ANSIENT_DB || eT
37c50 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e  ype==SQLITE_OPEN
37c60 5f 57 41 4c 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20  _WAL.  );..  /* 
37c70 44 65 74 65 63 74 20 61 20 70 69 64 20 63 68 61  Detect a pid cha
37c80 6e 67 65 20 61 6e 64 20 72 65 73 65 74 20 74 68  nge and reset th
37c90 65 20 50 52 4e 47 2e 20 20 54 68 65 72 65 20 69  e PRNG.  There i
37ca0 73 20 61 20 72 61 63 65 20 63 6f 6e 64 69 74 69  s a race conditi
37cb0 6f 6e 0a 20 20 2a 2a 20 68 65 72 65 20 73 75 63  on.  ** here suc
37cc0 68 20 74 68 61 74 20 74 77 6f 20 6f 72 20 6d 6f  h that two or mo
37cd0 72 65 20 74 68 72 65 61 64 73 20 61 6c 6c 20 74  re threads all t
37ce0 72 79 69 6e 67 20 74 6f 20 6f 70 65 6e 20 64 61  rying to open da
37cf0 74 61 62 61 73 65 73 20 61 74 0a 20 20 2a 2a 20  tabases at.  ** 
37d00 74 68 65 20 73 61 6d 65 20 69 6e 73 74 61 6e 74  the same instant
37d10 20 6d 69 67 68 74 20 61 6c 6c 20 72 65 73 65 74   might all reset
37d20 20 74 68 65 20 50 52 4e 47 2e 20 20 42 75 74 20   the PRNG.  But 
37d30 6d 75 6c 74 69 70 6c 65 20 72 65 73 65 74 73 0a  multiple resets.
37d40 20 20 2a 2a 20 61 72 65 20 68 61 72 6d 6c 65 73    ** are harmles
37d50 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 61  s..  */.  if( ra
37d60 6e 64 6f 6d 6e 65 73 73 50 69 64 21 3d 67 65 74  ndomnessPid!=get
37d70 70 69 64 28 29 20 29 7b 0a 20 20 20 20 72 61 6e  pid() ){.    ran
37d80 64 6f 6d 6e 65 73 73 50 69 64 20 3d 20 67 65 74  domnessPid = get
37d90 70 69 64 28 29 3b 0a 20 20 20 20 73 71 6c 69 74  pid();.    sqlit
37da0 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 30 2c  e3_randomness(0,
37db0 30 29 3b 0a 20 20 7d 0a 0a 20 20 6d 65 6d 73 65  0);.  }..  memse
37dc0 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 75  t(p, 0, sizeof(u
37dd0 6e 69 78 46 69 6c 65 29 29 3b 0a 0a 20 20 69 66  nixFile));..  if
37de0 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f  ( eType==SQLITE_
37df0 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 29 7b 0a  OPEN_MAIN_DB ){.
37e00 20 20 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64      UnixUnusedFd
37e10 20 2a 70 55 6e 75 73 65 64 3b 0a 20 20 20 20 70   *pUnused;.    p
37e20 55 6e 75 73 65 64 20 3d 20 66 69 6e 64 52 65 75  Unused = findReu
37e30 73 61 62 6c 65 46 64 28 7a 4e 61 6d 65 2c 20 66  sableFd(zName, f
37e40 6c 61 67 73 29 3b 0a 20 20 20 20 69 66 28 20 70  lags);.    if( p
37e50 55 6e 75 73 65 64 20 29 7b 0a 20 20 20 20 20 20  Unused ){.      
37e60 66 64 20 3d 20 70 55 6e 75 73 65 64 2d 3e 66 64  fd = pUnused->fd
37e70 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
37e80 20 20 20 70 55 6e 75 73 65 64 20 3d 20 73 71 6c     pUnused = sql
37e90 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65  ite3_malloc(size
37ea0 6f 66 28 2a 70 55 6e 75 73 65 64 29 29 3b 0a 20  of(*pUnused));. 
37eb0 20 20 20 20 20 69 66 28 20 21 70 55 6e 75 73 65       if( !pUnuse
37ec0 64 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  d ){.        ret
37ed0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
37ee0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
37ef0 20 20 20 20 70 2d 3e 70 55 6e 75 73 65 64 20 3d      p->pUnused =
37f00 20 70 55 6e 75 73 65 64 3b 0a 0a 20 20 20 20 2f   pUnused;..    /
37f10 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 6e  * Database filen
37f20 61 6d 65 73 20 61 72 65 20 64 6f 75 62 6c 65 2d  ames are double-
37f30 7a 65 72 6f 20 74 65 72 6d 69 6e 61 74 65 64 20  zero terminated 
37f40 69 66 20 74 68 65 79 20 61 72 65 20 6e 6f 74 0a  if they are not.
37f50 20 20 20 20 2a 2a 20 55 52 49 73 20 77 69 74 68      ** URIs with
37f60 20 70 61 72 61 6d 65 74 65 72 73 2e 20 20 48 65   parameters.  He
37f70 6e 63 65 2c 20 74 68 65 79 20 63 61 6e 20 61 6c  nce, they can al
37f80 77 61 79 73 20 62 65 20 70 61 73 73 65 64 20 69  ways be passed i
37f90 6e 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74  nto.    ** sqlit
37fa0 65 33 5f 75 72 69 5f 70 61 72 61 6d 65 74 65 72  e3_uri_parameter
37fb0 28 29 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  (). */.    asser
37fc0 74 28 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49  t( (flags & SQLI
37fd0 54 45 5f 4f 50 45 4e 5f 55 52 49 29 20 7c 7c 20  TE_OPEN_URI) || 
37fe0 7a 4e 61 6d 65 5b 73 74 72 6c 65 6e 28 7a 4e 61  zName[strlen(zNa
37ff0 6d 65 29 2b 31 5d 3d 3d 30 20 29 3b 0a 0a 20 20  me)+1]==0 );..  
38000 7d 65 6c 73 65 20 69 66 28 20 21 7a 4e 61 6d 65  }else if( !zName
38010 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 7a 4e   ){.    /* If zN
38020 61 6d 65 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65  ame is NULL, the
38030 20 75 70 70 65 72 20 6c 61 79 65 72 20 69 73 20   upper layer is 
38040 72 65 71 75 65 73 74 69 6e 67 20 61 20 74 65 6d  requesting a tem
38050 70 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 61  p file. */.    a
38060 73 73 65 72 74 28 69 73 44 65 6c 65 74 65 20 26  ssert(isDelete &
38070 26 20 21 73 79 6e 63 44 69 72 29 3b 0a 20 20 20  & !syncDir);.   
38080 20 72 63 20 3d 20 75 6e 69 78 47 65 74 54 65 6d   rc = unixGetTem
38090 70 6e 61 6d 65 28 4d 41 58 5f 50 41 54 48 4e 41  pname(MAX_PATHNA
380a0 4d 45 2b 32 2c 20 7a 54 6d 70 6e 61 6d 65 29 3b  ME+2, zTmpname);
380b0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
380c0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
380d0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
380e0 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 7a 54 6d  .    zName = zTm
380f0 70 6e 61 6d 65 3b 0a 0a 20 20 20 20 2f 2a 20 47  pname;..    /* G
38100 65 6e 65 72 61 74 65 64 20 74 65 6d 70 6f 72 61  enerated tempora
38110 72 79 20 66 69 6c 65 6e 61 6d 65 73 20 61 72 65  ry filenames are
38120 20 61 6c 77 61 79 73 20 64 6f 75 62 6c 65 2d 7a   always double-z
38130 65 72 6f 20 74 65 72 6d 69 6e 61 74 65 64 0a 20  ero terminated. 
38140 20 20 20 2a 2a 20 66 6f 72 20 75 73 65 20 62 79     ** for use by
38150 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 70 61 72   sqlite3_uri_par
38160 61 6d 65 74 65 72 28 29 2e 20 2a 2f 0a 20 20 20  ameter(). */.   
38170 20 61 73 73 65 72 74 28 20 7a 4e 61 6d 65 5b 73   assert( zName[s
38180 74 72 6c 65 6e 28 7a 4e 61 6d 65 29 2b 31 5d 3d  trlen(zName)+1]=
38190 3d 30 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  =0 );.  }..  /* 
381a0 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20 76 61  Determine the va
381b0 6c 75 65 20 6f 66 20 74 68 65 20 66 6c 61 67 73  lue of the flags
381c0 20 70 61 72 61 6d 65 74 65 72 20 70 61 73 73 65   parameter passe
381d0 64 20 74 6f 20 50 4f 53 49 58 20 66 75 6e 63 74  d to POSIX funct
381e0 69 6f 6e 0a 20 20 2a 2a 20 6f 70 65 6e 28 29 2e  ion.  ** open().
381f0 20 54 68 65 73 65 20 6d 75 73 74 20 62 65 20 63   These must be c
38200 61 6c 63 75 6c 61 74 65 64 20 65 76 65 6e 20 69  alculated even i
38210 66 20 6f 70 65 6e 28 29 20 69 73 20 6e 6f 74 20  f open() is not 
38220 63 61 6c 6c 65 64 2c 20 61 73 0a 20 20 2a 2a 20  called, as.  ** 
38230 74 68 65 79 20 6d 61 79 20 62 65 20 73 74 6f 72  they may be stor
38240 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 74 68  ed as part of th
38250 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 61 6e  e file handle an
38260 64 20 75 73 65 64 20 62 79 20 74 68 65 20 0a 20  d used by the . 
38270 20 2a 2a 20 27 63 6f 6e 63 68 20 66 69 6c 65 27   ** 'conch file'
38280 20 6c 6f 63 6b 69 6e 67 20 66 75 6e 63 74 69 6f   locking functio
38290 6e 73 20 6c 61 74 65 72 20 6f 6e 2e 20 20 2a 2f  ns later on.  */
382a0 0a 20 20 69 66 28 20 69 73 52 65 61 64 6f 6e 6c  .  if( isReadonl
382b0 79 20 29 20 20 6f 70 65 6e 46 6c 61 67 73 20 7c  y )  openFlags |
382c0 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20 20 69 66  = O_RDONLY;.  if
382d0 28 20 69 73 52 65 61 64 57 72 69 74 65 20 29 20  ( isReadWrite ) 
382e0 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f 52  openFlags |= O_R
382f0 44 57 52 3b 0a 20 20 69 66 28 20 69 73 43 72 65  DWR;.  if( isCre
38300 61 74 65 20 29 20 20 20 20 6f 70 65 6e 46 6c 61  ate )    openFla
38310 67 73 20 7c 3d 20 4f 5f 43 52 45 41 54 3b 0a 20  gs |= O_CREAT;. 
38320 20 69 66 28 20 69 73 45 78 63 6c 75 73 69 76 65   if( isExclusive
38330 20 29 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20   ) openFlags |= 
38340 28 4f 5f 45 58 43 4c 7c 4f 5f 4e 4f 46 4f 4c 4c  (O_EXCL|O_NOFOLL
38350 4f 57 29 3b 0a 20 20 6f 70 65 6e 46 6c 61 67 73  OW);.  openFlags
38360 20 7c 3d 20 28 4f 5f 4c 41 52 47 45 46 49 4c 45   |= (O_LARGEFILE
38370 7c 4f 5f 42 49 4e 41 52 59 29 3b 0a 0a 23 69 66  |O_BINARY);..#if
38380 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44   SQLITE_ENABLE_D
38390 41 54 41 5f 50 52 4f 54 45 43 54 49 4f 4e 0a 20  ATA_PROTECTION. 
383a0 20 70 2d 3e 70 72 6f 74 46 6c 61 67 73 20 3d 20   p->protFlags = 
383b0 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
383c0 4f 50 45 4e 5f 46 49 4c 45 50 52 4f 54 45 43 54  OPEN_FILEPROTECT
383d0 49 4f 4e 5f 4d 41 53 4b 29 3b 0a 23 65 6e 64 69  ION_MASK);.#endi
383e0 66 0a 20 20 20 20 0a 20 20 69 66 28 20 66 64 3c  f.    .  if( fd<
383f0 30 20 29 7b 0a 20 20 20 20 6d 6f 64 65 5f 74 20  0 ){.    mode_t 
38400 6f 70 65 6e 4d 6f 64 65 3b 20 20 20 20 20 20 20  openMode;       
38410 20 20 20 20 20 20 20 2f 2a 20 50 65 72 6d 69 73         /* Permis
38420 73 69 6f 6e 73 20 74 6f 20 63 72 65 61 74 65 20  sions to create 
38430 66 69 6c 65 20 77 69 74 68 20 2a 2f 0a 20 20 20  file with */.   
38440 20 75 69 64 5f 74 20 75 69 64 3b 20 20 20 20 20   uid_t uid;     
38450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
38460 2a 20 55 73 65 72 69 64 20 66 6f 72 20 74 68 65  * Userid for the
38470 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 67 69 64   file */.    gid
38480 5f 74 20 67 69 64 3b 20 20 20 20 20 20 20 20 20  _t gid;         
38490 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 72             /* Gr
384a0 6f 75 70 69 64 20 66 6f 72 20 74 68 65 20 66 69  oupid for the fi
384b0 6c 65 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 66  le */.    rc = f
384c0 69 6e 64 43 72 65 61 74 65 46 69 6c 65 4d 6f 64  indCreateFileMod
384d0 65 28 7a 4e 61 6d 65 2c 20 66 6c 61 67 73 2c 20  e(zName, flags, 
384e0 26 6f 70 65 6e 4d 6f 64 65 2c 20 26 75 69 64 2c  &openMode, &uid,
384f0 20 26 67 69 64 29 3b 0a 20 20 20 20 69 66 28 20   &gid);.    if( 
38500 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
38510 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
38520 70 2d 3e 70 55 6e 75 73 65 64 20 29 3b 0a 20 20  p->pUnused );.  
38530 20 20 20 20 61 73 73 65 72 74 28 20 65 54 79 70      assert( eTyp
38540 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57  e==SQLITE_OPEN_W
38550 41 4c 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c  AL || eType==SQL
38560 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f  ITE_OPEN_MAIN_JO
38570 55 52 4e 41 4c 20 29 3b 0a 20 20 20 20 20 20 72  URNAL );.      r
38580 65 74 75 72 6e 2