/ Hex Artifact Content
Login

Artifact 56858043a9603c7d724d77c992afa8e64c2f0a0d:


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 45 78 70  endif../*.** Exp
5090: 6c 69 63 69 74 6c 79 20 63 61 6c 6c 20 74 68 65  licitly call the
50a0: 20 36 34 2d 62 69 74 20 76 65 72 73 69 6f 6e 20   64-bit version 
50b0: 6f 66 20 6c 73 65 65 6b 28 29 20 6f 6e 20 41 6e  of lseek() on An
50c0: 64 72 6f 69 64 2e 20 4f 74 68 65 72 77 69 73 65  droid. Otherwise
50d0: 2c 20 6c 73 65 65 6b 28 29 0a 2a 2a 20 69 73 20  , lseek().** is 
50e0: 74 68 65 20 33 32 2d 62 69 74 20 76 65 72 73 69  the 32-bit versi
50f0: 6f 6e 2c 20 65 76 65 6e 20 69 66 20 5f 46 49 4c  on, even if _FIL
5100: 45 5f 4f 46 46 53 45 54 5f 42 49 54 53 3d 36 34  E_OFFSET_BITS=64
5110: 20 69 73 20 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a   is defined..*/.
5120: 23 69 66 64 65 66 20 5f 5f 41 4e 44 52 4f 49 44  #ifdef __ANDROID
5130: 5f 5f 0a 23 20 64 65 66 69 6e 65 20 6c 73 65 65  __.# define lsee
5140: 6b 20 6c 73 65 65 6b 36 34 0a 23 65 6e 64 69 66  k lseek64.#endif
5150: 0a 0a 2f 2a 0a 2a 2a 20 44 69 66 66 65 72 65 6e  ../*.** Differen
5160: 74 20 55 6e 69 78 20 73 79 73 74 65 6d 73 20 64  t Unix systems d
5170: 65 63 6c 61 72 65 20 6f 70 65 6e 28 29 20 69 6e  eclare open() in
5180: 20 64 69 66 66 65 72 65 6e 74 20 77 61 79 73 2e   different ways.
5190: 20 20 53 61 6d 65 20 75 73 65 0a 2a 2a 20 6f 70    Same use.** op
51a0: 65 6e 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69  en(const char*,i
51b0: 6e 74 2c 6d 6f 64 65 5f 74 29 2e 20 20 4f 74 68  nt,mode_t).  Oth
51c0: 65 72 73 20 75 73 65 20 6f 70 65 6e 28 63 6f 6e  ers use open(con
51d0: 73 74 20 63 68 61 72 2a 2c 69 6e 74 2c 2e 2e 2e  st char*,int,...
51e0: 29 2e 0a 2a 2a 20 54 68 65 20 64 69 66 66 65 72  )..** The differ
51f0: 65 6e 63 65 20 69 73 20 69 6d 70 6f 72 74 61 6e  ence is importan
5200: 74 20 77 68 65 6e 20 75 73 69 6e 67 20 61 20 70  t when using a p
5210: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 66 75  ointer to the fu
5220: 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  nction..**.** Th
5230: 65 20 73 61 66 65 73 74 20 77 61 79 20 74 6f 20  e safest way to 
5240: 64 65 61 6c 20 77 69 74 68 20 74 68 65 20 70 72  deal with the pr
5250: 6f 62 6c 65 6d 20 69 73 20 74 6f 20 61 6c 77 61  oblem is to alwa
5260: 79 73 20 75 73 65 20 74 68 69 73 20 77 72 61 70  ys use this wrap
5270: 70 65 72 0a 2a 2a 20 77 68 69 63 68 20 61 6c 77  per.** which alw
5280: 61 79 73 20 68 61 73 20 74 68 65 20 73 61 6d 65  ays has the same
5290: 20 77 65 6c 6c 2d 64 65 66 69 6e 65 64 20 69 6e   well-defined in
52a0: 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 73 74 61 74  terface..*/.stat
52b0: 69 63 20 69 6e 74 20 70 6f 73 69 78 4f 70 65 6e  ic int posixOpen
52c0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69  (const char *zFi
52d0: 6c 65 2c 20 69 6e 74 20 66 6c 61 67 73 2c 20 69  le, int flags, i
52e0: 6e 74 20 6d 6f 64 65 29 7b 0a 20 20 72 65 74 75  nt mode){.  retu
52f0: 72 6e 20 6f 70 65 6e 28 7a 46 69 6c 65 2c 20 66  rn open(zFile, f
5300: 6c 61 67 73 2c 20 6d 6f 64 65 29 3b 0a 7d 0a 0a  lags, mode);.}..
5310: 2f 2a 0a 2a 2a 20 4f 6e 20 73 6f 6d 65 20 73 79  /*.** On some sy
5320: 73 74 65 6d 73 2c 20 63 61 6c 6c 73 20 74 6f 20  stems, calls to 
5330: 66 63 68 6f 77 6e 28 29 20 77 69 6c 6c 20 74 72  fchown() will tr
5340: 69 67 67 65 72 20 61 20 6d 65 73 73 61 67 65 20  igger a message 
5350: 69 6e 20 61 20 73 65 63 75 72 69 74 79 0a 2a 2a  in a security.**
5360: 20 6c 6f 67 20 69 66 20 74 68 65 79 20 63 6f 6d   log if they com
5370: 65 20 66 72 6f 6d 20 6e 6f 6e 2d 72 6f 6f 74 20  e from non-root 
5380: 70 72 6f 63 65 73 73 65 73 2e 20 20 53 6f 20 61  processes.  So a
5390: 76 6f 69 64 20 63 61 6c 6c 69 6e 67 20 66 63 68  void calling fch
53a0: 6f 77 6e 28 29 20 69 66 0a 2a 2a 20 77 65 20 61  own() if.** we a
53b0: 72 65 20 6e 6f 74 20 72 75 6e 6e 69 6e 67 20 61  re not running a
53c0: 73 20 72 6f 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69  s root..*/.stati
53d0: 63 20 69 6e 74 20 70 6f 73 69 78 46 63 68 6f 77  c int posixFchow
53e0: 6e 28 69 6e 74 20 66 64 2c 20 75 69 64 5f 74 20  n(int fd, uid_t 
53f0: 75 69 64 2c 20 67 69 64 5f 74 20 67 69 64 29 7b  uid, gid_t gid){
5400: 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
5410: 20 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6c 73    return 0;.#els
5420: 65 0a 20 20 72 65 74 75 72 6e 20 67 65 74 65 75  e.  return geteu
5430: 69 64 28 29 20 3f 20 30 20 3a 20 66 63 68 6f 77  id() ? 0 : fchow
5440: 6e 28 66 64 2c 75 69 64 2c 67 69 64 29 3b 0a 23  n(fd,uid,gid);.#
5450: 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 20 46 6f 72 77  endif.}../* Forw
5460: 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f  ard reference */
5470: 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 70 65 6e  .static int open
5480: 44 69 72 65 63 74 6f 72 79 28 63 6f 6e 73 74 20  Directory(const 
5490: 63 68 61 72 2a 2c 20 69 6e 74 2a 29 3b 0a 73 74  char*, int*);.st
54a0: 61 74 69 63 20 69 6e 74 20 75 6e 69 78 47 65 74  atic int unixGet
54b0: 70 61 67 65 73 69 7a 65 28 76 6f 69 64 29 3b 0a  pagesize(void);.
54c0: 0a 2f 2a 0a 2a 2a 20 4d 61 6e 79 20 73 79 73 74  ./*.** Many syst
54d0: 65 6d 20 63 61 6c 6c 73 20 61 72 65 20 61 63 63  em calls are acc
54e0: 65 73 73 65 64 20 74 68 72 6f 75 67 68 20 70 6f  essed through po
54f0: 69 6e 74 65 72 2d 74 6f 2d 66 75 6e 63 74 69 6f  inter-to-functio
5500: 6e 73 20 73 6f 20 74 68 61 74 0a 2a 2a 20 74 68  ns so that.** th
5510: 65 79 20 6d 61 79 20 62 65 20 6f 76 65 72 72 69  ey may be overri
5520: 64 64 65 6e 20 61 74 20 72 75 6e 74 69 6d 65 20  dden at runtime 
5530: 74 6f 20 66 61 63 69 6c 69 74 61 74 65 20 66 61  to facilitate fa
5540: 75 6c 74 20 69 6e 6a 65 63 74 69 6f 6e 20 64 75  ult injection du
5550: 72 69 6e 67 0a 2a 2a 20 74 65 73 74 69 6e 67 20  ring.** testing 
5560: 61 6e 64 20 73 61 6e 64 62 6f 78 69 6e 67 2e 20  and sandboxing. 
5570: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   The following a
5580: 72 72 61 79 20 68 6f 6c 64 73 20 74 68 65 20 6e  rray holds the n
5590: 61 6d 65 73 20 61 6e 64 20 70 6f 69 6e 74 65 72  ames and pointer
55a0: 73 0a 2a 2a 20 74 6f 20 61 6c 6c 20 6f 76 65 72  s.** to all over
55b0: 72 69 64 65 61 62 6c 65 20 73 79 73 74 65 6d 20  rideable system 
55c0: 63 61 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  calls..*/.static
55d0: 20 73 74 72 75 63 74 20 75 6e 69 78 5f 73 79 73   struct unix_sys
55e0: 63 61 6c 6c 20 7b 0a 20 20 63 6f 6e 73 74 20 63  call {.  const c
55f0: 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20  har *zName;     
5600: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
5610: 66 20 74 68 65 20 73 79 73 74 65 6d 20 63 61 6c  f the system cal
5620: 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73  l */.  sqlite3_s
5630: 79 73 63 61 6c 6c 5f 70 74 72 20 70 43 75 72 72  yscall_ptr pCurr
5640: 65 6e 74 3b 20 2f 2a 20 43 75 72 72 65 6e 74 20  ent; /* Current 
5650: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 73 79 73  value of the sys
5660: 74 65 6d 20 63 61 6c 6c 20 2a 2f 0a 20 20 73 71  tem call */.  sq
5670: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
5680: 72 20 70 44 65 66 61 75 6c 74 3b 20 2f 2a 20 44  r pDefault; /* D
5690: 65 66 61 75 6c 74 20 76 61 6c 75 65 20 2a 2f 0a  efault value */.
56a0: 7d 20 61 53 79 73 63 61 6c 6c 5b 5d 20 3d 20 7b  } aSyscall[] = {
56b0: 0a 20 20 7b 20 22 6f 70 65 6e 22 2c 20 20 20 20  .  { "open",    
56c0: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
56d0: 73 63 61 6c 6c 5f 70 74 72 29 70 6f 73 69 78 4f  scall_ptr)posixO
56e0: 70 65 6e 2c 20 20 30 20 20 7d 2c 0a 23 64 65 66  pen,  0  },.#def
56f0: 69 6e 65 20 6f 73 4f 70 65 6e 20 20 20 20 20 20  ine osOpen      
5700: 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63  ((int(*)(const c
5710: 68 61 72 2a 2c 69 6e 74 2c 69 6e 74 29 29 61 53  har*,int,int))aS
5720: 79 73 63 61 6c 6c 5b 30 5d 2e 70 43 75 72 72 65  yscall[0].pCurre
5730: 6e 74 29 0a 0a 20 20 7b 20 22 63 6c 6f 73 65 22  nt)..  { "close"
5740: 2c 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65  ,        (sqlite
5750: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 63 6c  3_syscall_ptr)cl
5760: 6f 73 65 2c 20 20 20 20 20 20 30 20 20 7d 2c 0a  ose,      0  },.
5770: 23 64 65 66 69 6e 65 20 6f 73 43 6c 6f 73 65 20  #define osClose 
5780: 20 20 20 20 28 28 69 6e 74 28 2a 29 28 69 6e 74      ((int(*)(int
5790: 29 29 61 53 79 73 63 61 6c 6c 5b 31 5d 2e 70 43  ))aSyscall[1].pC
57a0: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 61 63  urrent)..  { "ac
57b0: 63 65 73 73 22 2c 20 20 20 20 20 20 20 28 73 71  cess",       (sq
57c0: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
57d0: 72 29 61 63 63 65 73 73 2c 20 20 20 20 20 30 20  r)access,     0 
57e0: 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 41 63   },.#define osAc
57f0: 63 65 73 73 20 20 20 20 28 28 69 6e 74 28 2a 29  cess    ((int(*)
5800: 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74  (const char*,int
5810: 29 29 61 53 79 73 63 61 6c 6c 5b 32 5d 2e 70 43  ))aSyscall[2].pC
5820: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 67 65  urrent)..  { "ge
5830: 74 63 77 64 22 2c 20 20 20 20 20 20 20 28 73 71  tcwd",       (sq
5840: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
5850: 72 29 67 65 74 63 77 64 2c 20 20 20 20 20 30 20  r)getcwd,     0 
5860: 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 47 65   },.#define osGe
5870: 74 63 77 64 20 20 20 20 28 28 63 68 61 72 2a 28  tcwd    ((char*(
5880: 2a 29 28 63 68 61 72 2a 2c 73 69 7a 65 5f 74 29  *)(char*,size_t)
5890: 29 61 53 79 73 63 61 6c 6c 5b 33 5d 2e 70 43 75  )aSyscall[3].pCu
58a0: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 73 74 61  rrent)..  { "sta
58b0: 74 22 2c 20 20 20 20 20 20 20 20 20 28 73 71 6c  t",         (sql
58c0: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
58d0: 29 73 74 61 74 2c 20 20 20 20 20 20 20 30 20 20  )stat,       0  
58e0: 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 53 74 61  },.#define osSta
58f0: 74 20 20 20 20 20 20 28 28 69 6e 74 28 2a 29 28  t      ((int(*)(
5900: 63 6f 6e 73 74 20 63 68 61 72 2a 2c 73 74 72 75  const char*,stru
5910: 63 74 20 73 74 61 74 2a 29 29 61 53 79 73 63 61  ct stat*))aSysca
5920: 6c 6c 5b 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a  ll[4].pCurrent).
5930: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 44 4a 47 50 50  ./*.** The DJGPP
5940: 20 63 6f 6d 70 69 6c 65 72 20 65 6e 76 69 72 6f   compiler enviro
5950: 6e 6d 65 6e 74 20 6c 6f 6f 6b 73 20 6d 6f 73 74  nment looks most
5960: 6c 79 20 6c 69 6b 65 20 55 6e 69 78 2c 20 62 75  ly like Unix, bu
5970: 74 20 69 74 0a 2a 2a 20 6c 61 63 6b 73 20 74 68  t it.** lacks th
5980: 65 20 66 63 6e 74 6c 28 29 20 73 79 73 74 65 6d  e fcntl() system
5990: 20 63 61 6c 6c 2e 20 20 53 6f 20 72 65 64 65 66   call.  So redef
59a0: 69 6e 65 20 66 63 6e 74 6c 28 29 20 74 6f 20 62  ine fcntl() to b
59b0: 65 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 74  e something.** t
59c0: 68 61 74 20 61 6c 77 61 79 73 20 73 75 63 63 65  hat always succe
59d0: 65 64 73 2e 20 20 54 68 69 73 20 6d 65 61 6e 73  eds.  This means
59e0: 20 74 68 61 74 20 6c 6f 63 6b 69 6e 67 20 64 6f   that locking do
59f0: 65 73 20 6e 6f 74 20 6f 63 63 75 72 20 75 6e 64  es not occur und
5a00: 65 72 0a 2a 2a 20 44 4a 47 50 50 2e 20 20 42 75  er.** DJGPP.  Bu
5a10: 74 20 69 74 20 69 73 20 44 4f 53 20 2d 20 77 68  t it is DOS - wh
5a20: 61 74 20 64 69 64 20 79 6f 75 20 65 78 70 65 63  at did you expec
5a30: 74 3f 0a 2a 2f 0a 23 69 66 64 65 66 20 5f 5f 44  t?.*/.#ifdef __D
5a40: 4a 47 50 50 5f 5f 0a 20 20 7b 20 22 66 73 74 61  JGPP__.  { "fsta
5a50: 74 22 2c 20 20 20 20 20 20 20 20 30 2c 20 20 20  t",        0,   
5a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
5a70: 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 46 73   },.#define osFs
5a80: 74 61 74 28 61 2c 62 2c 63 29 20 20 20 20 30 0a  tat(a,b,c)    0.
5a90: 23 65 6c 73 65 20 20 20 20 20 0a 20 20 7b 20 22  #else     .  { "
5aa0: 66 73 74 61 74 22 2c 20 20 20 20 20 20 20 20 28  fstat",        (
5ab0: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
5ac0: 70 74 72 29 66 73 74 61 74 2c 20 20 20 20 20 20  ptr)fstat,      
5ad0: 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73  0  },.#define os
5ae0: 46 73 74 61 74 20 20 20 20 20 28 28 69 6e 74 28  Fstat     ((int(
5af0: 2a 29 28 69 6e 74 2c 73 74 72 75 63 74 20 73 74  *)(int,struct st
5b00: 61 74 2a 29 29 61 53 79 73 63 61 6c 6c 5b 35 5d  at*))aSyscall[5]
5b10: 2e 70 43 75 72 72 65 6e 74 29 0a 23 65 6e 64 69  .pCurrent).#endi
5b20: 66 0a 0a 20 20 7b 20 22 66 74 72 75 6e 63 61 74  f..  { "ftruncat
5b30: 65 22 2c 20 20 20 20 28 73 71 6c 69 74 65 33 5f  e",    (sqlite3_
5b40: 73 79 73 63 61 6c 6c 5f 70 74 72 29 66 74 72 75  syscall_ptr)ftru
5b50: 6e 63 61 74 65 2c 20 20 30 20 20 7d 2c 0a 23 64  ncate,  0  },.#d
5b60: 65 66 69 6e 65 20 6f 73 46 74 72 75 6e 63 61 74  efine osFtruncat
5b70: 65 20 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c 6f  e ((int(*)(int,o
5b80: 66 66 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 36  ff_t))aSyscall[6
5b90: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
5ba0: 20 22 66 63 6e 74 6c 22 2c 20 20 20 20 20 20 20   "fcntl",       
5bb0: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
5bc0: 6c 5f 70 74 72 29 66 63 6e 74 6c 2c 20 20 20 20  l_ptr)fcntl,    
5bd0: 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20    0  },.#define 
5be0: 6f 73 46 63 6e 74 6c 20 20 20 20 20 28 28 69 6e  osFcntl     ((in
5bf0: 74 28 2a 29 28 69 6e 74 2c 69 6e 74 2c 2e 2e 2e  t(*)(int,int,...
5c00: 29 29 61 53 79 73 63 61 6c 6c 5b 37 5d 2e 70 43  ))aSyscall[7].pC
5c10: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 72 65  urrent)..  { "re
5c20: 61 64 22 2c 20 20 20 20 20 20 20 20 20 28 73 71  ad",         (sq
5c30: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
5c40: 72 29 72 65 61 64 2c 20 20 20 20 20 20 20 30 20  r)read,       0 
5c50: 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 52 65   },.#define osRe
5c60: 61 64 20 20 20 20 20 20 28 28 73 73 69 7a 65 5f  ad      ((ssize_
5c70: 74 28 2a 29 28 69 6e 74 2c 76 6f 69 64 2a 2c 73  t(*)(int,void*,s
5c80: 69 7a 65 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b  ize_t))aSyscall[
5c90: 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  8].pCurrent)..#i
5ca0: 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52  f defined(USE_PR
5cb0: 45 41 44 29 20 7c 7c 20 28 53 51 4c 49 54 45 5f  EAD) || (SQLITE_
5cc0: 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
5cd0: 54 59 4c 45 20 26 26 20 21 4f 53 5f 56 58 57 4f  TYLE && !OS_VXWO
5ce0: 52 4b 53 29 0a 20 20 7b 20 22 70 72 65 61 64 22  RKS).  { "pread"
5cf0: 2c 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65  ,        (sqlite
5d00: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 70 72  3_syscall_ptr)pr
5d10: 65 61 64 2c 20 20 20 20 20 20 30 20 20 7d 2c 0a  ead,      0  },.
5d20: 23 65 6c 73 65 0a 20 20 7b 20 22 70 72 65 61 64  #else.  { "pread
5d30: 22 2c 20 20 20 20 20 20 20 20 28 73 71 6c 69 74  ",        (sqlit
5d40: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 30  e3_syscall_ptr)0
5d50: 2c 20 20 20 20 20 20 20 20 20 20 30 20 20 7d 2c  ,          0  },
5d60: 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20  .#endif.#define 
5d70: 6f 73 50 72 65 61 64 20 20 20 20 20 28 28 73 73  osPread     ((ss
5d80: 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 76 6f 69  ize_t(*)(int,voi
5d90: 64 2a 2c 73 69 7a 65 5f 74 2c 6f 66 66 5f 74 29  d*,size_t,off_t)
5da0: 29 61 53 79 73 63 61 6c 6c 5b 39 5d 2e 70 43 75  )aSyscall[9].pCu
5db0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69  rrent)..#if defi
5dc0: 6e 65 64 28 55 53 45 5f 50 52 45 41 44 36 34 29  ned(USE_PREAD64)
5dd0: 0a 20 20 7b 20 22 70 72 65 61 64 36 34 22 2c 20  .  { "pread64", 
5de0: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
5df0: 73 63 61 6c 6c 5f 70 74 72 29 70 72 65 61 64 36  scall_ptr)pread6
5e00: 34 2c 20 20 20 20 30 20 20 7d 2c 0a 23 65 6c 73  4,    0  },.#els
5e10: 65 0a 20 20 7b 20 22 70 72 65 61 64 36 34 22 2c  e.  { "pread64",
5e20: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73        (sqlite3_s
5e30: 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20  yscall_ptr)0,   
5e40: 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 65 6e         0  },.#en
5e50: 64 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 50 72  dif.#define osPr
5e60: 65 61 64 36 34 20 20 20 28 28 73 73 69 7a 65 5f  ead64   ((ssize_
5e70: 74 28 2a 29 28 69 6e 74 2c 76 6f 69 64 2a 2c 73  t(*)(int,void*,s
5e80: 69 7a 65 5f 74 2c 6f 66 66 5f 74 29 29 61 53 79  ize_t,off_t))aSy
5e90: 73 63 61 6c 6c 5b 31 30 5d 2e 70 43 75 72 72 65  scall[10].pCurre
5ea0: 6e 74 29 0a 0a 20 20 7b 20 22 77 72 69 74 65 22  nt)..  { "write"
5eb0: 2c 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65  ,        (sqlite
5ec0: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 77 72  3_syscall_ptr)wr
5ed0: 69 74 65 2c 20 20 20 20 20 20 30 20 20 7d 2c 0a  ite,      0  },.
5ee0: 23 64 65 66 69 6e 65 20 6f 73 57 72 69 74 65 20  #define osWrite 
5ef0: 20 20 20 20 28 28 73 73 69 7a 65 5f 74 28 2a 29      ((ssize_t(*)
5f00: 28 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a  (int,const void*
5f10: 2c 73 69 7a 65 5f 74 29 29 61 53 79 73 63 61 6c  ,size_t))aSyscal
5f20: 6c 5b 31 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[11].pCurrent).
5f30: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 55 53 45  .#if defined(USE
5f40: 5f 50 52 45 41 44 29 20 7c 7c 20 28 53 51 4c 49  _PREAD) || (SQLI
5f50: 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
5f60: 47 5f 53 54 59 4c 45 20 26 26 20 21 4f 53 5f 56  G_STYLE && !OS_V
5f70: 58 57 4f 52 4b 53 29 0a 20 20 7b 20 22 70 77 72  XWORKS).  { "pwr
5f80: 69 74 65 22 2c 20 20 20 20 20 20 20 28 73 71 6c  ite",       (sql
5f90: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
5fa0: 29 70 77 72 69 74 65 2c 20 20 20 20 20 30 20 20  )pwrite,     0  
5fb0: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 70 77  },.#else.  { "pw
5fc0: 72 69 74 65 22 2c 20 20 20 20 20 20 20 28 73 71  rite",       (sq
5fd0: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
5fe0: 72 29 30 2c 20 20 20 20 20 20 20 20 20 20 30 20  r)0,          0 
5ff0: 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66 69   },.#endif.#defi
6000: 6e 65 20 6f 73 50 77 72 69 74 65 20 20 20 20 28  ne osPwrite    (
6010: 28 73 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c  (ssize_t(*)(int,
6020: 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 73 69 7a 65  const void*,size
6030: 5f 74 2c 6f 66 66 5f 74 29 29 5c 0a 20 20 20 20  _t,off_t))\.    
6040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6050: 61 53 79 73 63 61 6c 6c 5b 31 32 5d 2e 70 43 75  aSyscall[12].pCu
6060: 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69  rrent)..#if defi
6070: 6e 65 64 28 55 53 45 5f 50 52 45 41 44 36 34 29  ned(USE_PREAD64)
6080: 0a 20 20 7b 20 22 70 77 72 69 74 65 36 34 22 2c  .  { "pwrite64",
6090: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
60a0: 73 63 61 6c 6c 5f 70 74 72 29 70 77 72 69 74 65  scall_ptr)pwrite
60b0: 36 34 2c 20 20 20 30 20 20 7d 2c 0a 23 65 6c 73  64,   0  },.#els
60c0: 65 0a 20 20 7b 20 22 70 77 72 69 74 65 36 34 22  e.  { "pwrite64"
60d0: 2c 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73  ,     (sqlite3_s
60e0: 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20  yscall_ptr)0,   
60f0: 20 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 65 6e         0  },.#en
6100: 64 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 50 77  dif.#define osPw
6110: 72 69 74 65 36 34 20 20 28 28 73 73 69 7a 65 5f  rite64  ((ssize_
6120: 74 28 2a 29 28 69 6e 74 2c 63 6f 6e 73 74 20 76  t(*)(int,const v
6130: 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c 6f 66 66 5f  oid*,size_t,off_
6140: 74 29 29 5c 0a 20 20 20 20 20 20 20 20 20 20 20  t))\.           
6150: 20 20 20 20 20 20 20 20 20 61 53 79 73 63 61 6c           aSyscal
6160: 6c 5b 31 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[13].pCurrent).
6170: 0a 20 20 7b 20 22 66 63 68 6d 6f 64 22 2c 20 20  .  { "fchmod",  
6180: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
6190: 73 63 61 6c 6c 5f 70 74 72 29 66 63 68 6d 6f 64  scall_ptr)fchmod
61a0: 2c 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66  ,     0  },.#def
61b0: 69 6e 65 20 6f 73 46 63 68 6d 6f 64 20 20 20 20  ine osFchmod    
61c0: 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c 6d 6f 64  ((int(*)(int,mod
61d0: 65 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 31 34  e_t))aSyscall[14
61e0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
61f0: 20 64 65 66 69 6e 65 64 28 48 41 56 45 5f 50 4f   defined(HAVE_PO
6200: 53 49 58 5f 46 41 4c 4c 4f 43 41 54 45 29 20 26  SIX_FALLOCATE) &
6210: 26 20 48 41 56 45 5f 50 4f 53 49 58 5f 46 41 4c  & HAVE_POSIX_FAL
6220: 4c 4f 43 41 54 45 0a 20 20 7b 20 22 66 61 6c 6c  LOCATE.  { "fall
6230: 6f 63 61 74 65 22 2c 20 20 20 20 28 73 71 6c 69  ocate",    (sqli
6240: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
6250: 70 6f 73 69 78 5f 66 61 6c 6c 6f 63 61 74 65 2c  posix_fallocate,
6260: 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b    0 },.#else.  {
6270: 20 22 66 61 6c 6c 6f 63 61 74 65 22 2c 20 20 20   "fallocate",   
6280: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
6290: 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20 20  l_ptr)0,        
62a0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
62b0: 64 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 46 61  dif.#define osFa
62c0: 6c 6c 6f 63 61 74 65 20 28 28 69 6e 74 28 2a 29  llocate ((int(*)
62d0: 28 69 6e 74 2c 6f 66 66 5f 74 2c 6f 66 66 5f 74  (int,off_t,off_t
62e0: 29 29 61 53 79 73 63 61 6c 6c 5b 31 35 5d 2e 70  ))aSyscall[15].p
62f0: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 75  Current)..  { "u
6300: 6e 6c 69 6e 6b 22 2c 20 20 20 20 20 20 20 28 73  nlink",       (s
6310: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
6320: 74 72 29 75 6e 6c 69 6e 6b 2c 20 20 20 20 20 20  tr)unlink,      
6330: 20 20 20 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e       0 },.#defin
6340: 65 20 6f 73 55 6e 6c 69 6e 6b 20 20 20 20 28 28  e osUnlink    ((
6350: 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61  int(*)(const cha
6360: 72 2a 29 29 61 53 79 73 63 61 6c 6c 5b 31 36 5d  r*))aSyscall[16]
6370: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
6380: 22 6f 70 65 6e 44 69 72 65 63 74 6f 72 79 22 2c  "openDirectory",
6390: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
63a0: 63 61 6c 6c 5f 70 74 72 29 6f 70 65 6e 44 69 72  call_ptr)openDir
63b0: 65 63 74 6f 72 79 2c 20 20 20 20 20 20 30 20 7d  ectory,      0 }
63c0: 2c 0a 23 64 65 66 69 6e 65 20 6f 73 4f 70 65 6e  ,.#define osOpen
63d0: 44 69 72 65 63 74 6f 72 79 20 28 28 69 6e 74 28  Directory ((int(
63e0: 2a 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69  *)(const char*,i
63f0: 6e 74 2a 29 29 61 53 79 73 63 61 6c 6c 5b 31 37  nt*))aSyscall[17
6400: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
6410: 20 22 6d 6b 64 69 72 22 2c 20 20 20 20 20 20 20   "mkdir",       
6420: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
6430: 6c 5f 70 74 72 29 6d 6b 64 69 72 2c 20 20 20 20  l_ptr)mkdir,    
6440: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 64 65 66         0 },.#def
6450: 69 6e 65 20 6f 73 4d 6b 64 69 72 20 20 20 20 20  ine osMkdir     
6460: 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63  ((int(*)(const c
6470: 68 61 72 2a 2c 6d 6f 64 65 5f 74 29 29 61 53 79  har*,mode_t))aSy
6480: 73 63 61 6c 6c 5b 31 38 5d 2e 70 43 75 72 72 65  scall[18].pCurre
6490: 6e 74 29 0a 0a 20 20 7b 20 22 72 6d 64 69 72 22  nt)..  { "rmdir"
64a0: 2c 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65  ,        (sqlite
64b0: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 72 6d  3_syscall_ptr)rm
64c0: 64 69 72 2c 20 20 20 20 20 20 20 20 20 20 20 30  dir,           0
64d0: 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 52 6d   },.#define osRm
64e0: 64 69 72 20 20 20 20 20 28 28 69 6e 74 28 2a 29  dir     ((int(*)
64f0: 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 29 61 53  (const char*))aS
6500: 79 73 63 61 6c 6c 5b 31 39 5d 2e 70 43 75 72 72  yscall[19].pCurr
6510: 65 6e 74 29 0a 0a 20 20 7b 20 22 66 63 68 6f 77  ent)..  { "fchow
6520: 6e 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74  n",       (sqlit
6530: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 70  e3_syscall_ptr)p
6540: 6f 73 69 78 46 63 68 6f 77 6e 2c 20 20 20 20 20  osixFchown,     
6550: 30 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 46  0 },.#define osF
6560: 63 68 6f 77 6e 20 20 20 20 28 28 69 6e 74 28 2a  chown    ((int(*
6570: 29 28 69 6e 74 2c 75 69 64 5f 74 2c 67 69 64 5f  )(int,uid_t,gid_
6580: 74 29 29 61 53 79 73 63 61 6c 6c 5b 32 30 5d 2e  t))aSyscall[20].
6590: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 21  pCurrent)..#if !
65a0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
65b0: 4d 49 54 5f 57 41 4c 29 20 7c 7c 20 53 51 4c 49  MIT_WAL) || SQLI
65c0: 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
65d0: 3e 30 0a 20 20 7b 20 22 6d 6d 61 70 22 2c 20 20  >0.  { "mmap",  
65e0: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
65f0: 73 63 61 6c 6c 5f 70 74 72 29 6d 6d 61 70 2c 20  scall_ptr)mmap, 
6600: 20 20 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65      0 },.#define
6610: 20 6f 73 4d 6d 61 70 20 28 28 76 6f 69 64 2a 28   osMmap ((void*(
6620: 2a 29 28 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c  *)(void*,size_t,
6630: 69 6e 74 2c 69 6e 74 2c 69 6e 74 2c 6f 66 66 5f  int,int,int,off_
6640: 74 29 29 61 53 79 73 63 61 6c 6c 5b 32 31 5d 2e  t))aSyscall[21].
6650: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
6660: 6d 75 6e 6d 61 70 22 2c 20 20 20 20 20 20 20 28  munmap",       (
6670: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
6680: 70 74 72 29 6d 75 6e 6d 61 70 2c 20 20 20 20 20  ptr)munmap,     
6690: 20 20 20 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e       0 },.#defin
66a0: 65 20 6f 73 4d 75 6e 6d 61 70 20 28 28 76 6f 69  e osMunmap ((voi
66b0: 64 2a 28 2a 29 28 76 6f 69 64 2a 2c 73 69 7a 65  d*(*)(void*,size
66c0: 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 32 32 5d  _t))aSyscall[22]
66d0: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20  .pCurrent)..#if 
66e0: 48 41 56 45 5f 4d 52 45 4d 41 50 0a 20 20 7b 20  HAVE_MREMAP.  { 
66f0: 22 6d 72 65 6d 61 70 22 2c 20 20 20 20 20 20 20  "mremap",       
6700: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
6710: 5f 70 74 72 29 6d 72 65 6d 61 70 2c 20 20 20 20  _ptr)mremap,    
6720: 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65        0 },.#else
6730: 0a 20 20 7b 20 22 6d 72 65 6d 61 70 22 2c 20 20  .  { "mremap",  
6740: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
6750: 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20  scall_ptr)0,    
6760: 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a             0 },.
6770: 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 6f  #endif.#define o
6780: 73 4d 72 65 6d 61 70 20 28 28 76 6f 69 64 2a 28  sMremap ((void*(
6790: 2a 29 28 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c  *)(void*,size_t,
67a0: 73 69 7a 65 5f 74 2c 69 6e 74 2c 2e 2e 2e 29 29  size_t,int,...))
67b0: 61 53 79 73 63 61 6c 6c 5b 32 33 5d 2e 70 43 75  aSyscall[23].pCu
67c0: 72 72 65 6e 74 29 0a 20 20 7b 20 22 67 65 74 70  rrent).  { "getp
67d0: 61 67 65 73 69 7a 65 22 2c 20 20 28 73 71 6c 69  agesize",  (sqli
67e0: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
67f0: 75 6e 69 78 47 65 74 70 61 67 65 73 69 7a 65 2c  unixGetpagesize,
6800: 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73   0 },.#define os
6810: 47 65 74 70 61 67 65 73 69 7a 65 20 28 28 69 6e  Getpagesize ((in
6820: 74 28 2a 29 28 76 6f 69 64 29 29 61 53 79 73 63  t(*)(void))aSysc
6830: 61 6c 6c 5b 32 34 5d 2e 70 43 75 72 72 65 6e 74  all[24].pCurrent
6840: 29 0a 0a 23 65 6e 64 69 66 0a 0a 7d 3b 20 2f 2a  )..#endif..}; /*
6850: 20 45 6e 64 20 6f 66 20 74 68 65 20 6f 76 65 72   End of the over
6860: 72 69 64 65 61 62 6c 65 20 73 79 73 74 65 6d 20  rideable system 
6870: 63 61 6c 6c 73 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  calls */../*.** 
6880: 54 68 69 73 20 69 73 20 74 68 65 20 78 53 65 74  This is the xSet
6890: 53 79 73 74 65 6d 43 61 6c 6c 28 29 20 6d 65 74  SystemCall() met
68a0: 68 6f 64 20 6f 66 20 73 71 6c 69 74 65 33 5f 76  hod of sqlite3_v
68b0: 66 73 20 66 6f 72 20 61 6c 6c 20 6f 66 20 74 68  fs for all of th
68c0: 65 0a 2a 2a 20 22 75 6e 69 78 22 20 56 46 53 65  e.** "unix" VFSe
68d0: 73 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  s.  Return SQLIT
68e0: 45 5f 4f 4b 20 6f 70 6f 6e 20 73 75 63 63 65 73  E_OK opon succes
68f0: 73 66 75 6c 6c 79 20 75 70 64 61 74 69 6e 67 20  sfully updating 
6900: 74 68 65 0a 2a 2a 20 73 79 73 74 65 6d 20 63 61  the.** system ca
6910: 6c 6c 20 70 6f 69 6e 74 65 72 2c 20 6f 72 20 53  ll pointer, or S
6920: 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 69  QLITE_NOTFOUND i
6930: 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 63 6f  f there is no co
6940: 6e 66 69 67 75 72 61 62 6c 65 0a 2a 2a 20 73 79  nfigurable.** sy
6950: 73 74 65 6d 20 63 61 6c 6c 20 6e 61 6d 65 64 20  stem call named 
6960: 7a 4e 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  zName..*/.static
6970: 20 69 6e 74 20 75 6e 69 78 53 65 74 53 79 73 74   int unixSetSyst
6980: 65 6d 43 61 6c 6c 28 0a 20 20 73 71 6c 69 74 65  emCall(.  sqlite
6990: 33 5f 76 66 73 20 2a 70 4e 6f 74 55 73 65 64 2c  3_vfs *pNotUsed,
69a0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56          /* The V
69b0: 46 53 20 70 6f 69 6e 74 65 72 2e 20 20 4e 6f 74  FS pointer.  Not
69c0: 20 75 73 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74   used */.  const
69d0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 20 20   char *zName,   
69e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
69f0: 20 6f 66 20 73 79 73 74 65 6d 20 63 61 6c 6c 20   of system call 
6a00: 74 6f 20 6f 76 65 72 72 69 64 65 20 2a 2f 0a 20  to override */. 
6a10: 20 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c   sqlite3_syscall
6a20: 5f 70 74 72 20 70 4e 65 77 46 75 6e 63 20 20 2f  _ptr pNewFunc  /
6a30: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65 77  * Pointer to new
6a40: 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 76 61 6c   system call val
6a50: 75 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67  ue */.){.  unsig
6a60: 6e 65 64 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ned int i;.  int
6a70: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54   rc = SQLITE_NOT
6a80: 46 4f 55 4e 44 3b 0a 0a 20 20 55 4e 55 53 45 44  FOUND;..  UNUSED
6a90: 5f 50 41 52 41 4d 45 54 45 52 28 70 4e 6f 74 55  _PARAMETER(pNotU
6aa0: 73 65 64 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d  sed);.  if( zNam
6ab0: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 49  e==0 ){.    /* I
6ac0: 66 20 6e 6f 20 7a 4e 61 6d 65 20 69 73 20 67 69  f no zName is gi
6ad0: 76 65 6e 2c 20 72 65 73 74 6f 72 65 20 61 6c 6c  ven, restore all
6ae0: 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 74 6f   system calls to
6af0: 20 74 68 65 69 72 20 64 65 66 61 75 6c 74 0a 20   their default. 
6b00: 20 20 20 2a 2a 20 73 65 74 74 69 6e 67 73 20 61     ** settings a
6b10: 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c 0a 20  nd return NULL. 
6b20: 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53     */.    rc = S
6b30: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 66 6f  QLITE_OK;.    fo
6b40: 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28  r(i=0; i<sizeof(
6b50: 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65 6f 66  aSyscall)/sizeof
6b60: 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b 20 69  (aSyscall[0]); i
6b70: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61  ++){.      if( a
6b80: 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61  Syscall[i].pDefa
6b90: 75 6c 74 20 29 7b 0a 20 20 20 20 20 20 20 20 61  ult ){.        a
6ba0: 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72  Syscall[i].pCurr
6bb0: 65 6e 74 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69  ent = aSyscall[i
6bc0: 5d 2e 70 44 65 66 61 75 6c 74 3b 0a 20 20 20 20  ].pDefault;.    
6bd0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73    }.    }.  }els
6be0: 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 7a 4e 61  e{.    /* If zNa
6bf0: 6d 65 20 69 73 20 73 70 65 63 69 66 69 65 64 2c  me is specified,
6c00: 20 6f 70 65 72 61 74 65 20 6f 6e 20 6f 6e 6c 79   operate on only
6c10: 20 74 68 65 20 6f 6e 65 20 73 79 73 74 65 6d 20   the one system 
6c20: 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 73 70 65 63  call.    ** spec
6c30: 69 66 69 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  ified..    */.  
6c40: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a    for(i=0; i<siz
6c50: 65 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f 73 69  eof(aSyscall)/si
6c60: 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d  zeof(aSyscall[0]
6c70: 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  ); i++){.      i
6c80: 66 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c  f( strcmp(zName,
6c90: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61   aSyscall[i].zNa
6ca0: 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)==0 ){.      
6cb0: 20 20 69 66 28 20 61 53 79 73 63 61 6c 6c 5b 69    if( aSyscall[i
6cc0: 5d 2e 70 44 65 66 61 75 6c 74 3d 3d 30 20 29 7b  ].pDefault==0 ){
6cd0: 0a 20 20 20 20 20 20 20 20 20 20 61 53 79 73 63  .          aSysc
6ce0: 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 20  all[i].pDefault 
6cf0: 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43  = aSyscall[i].pC
6d00: 75 72 72 65 6e 74 3b 0a 20 20 20 20 20 20 20 20  urrent;.        
6d10: 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  }.        rc = S
6d20: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
6d30: 20 20 69 66 28 20 70 4e 65 77 46 75 6e 63 3d 3d    if( pNewFunc==
6d40: 30 20 29 20 70 4e 65 77 46 75 6e 63 20 3d 20 61  0 ) pNewFunc = a
6d50: 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61  Syscall[i].pDefa
6d60: 75 6c 74 3b 0a 20 20 20 20 20 20 20 20 61 53 79  ult;.        aSy
6d70: 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e  scall[i].pCurren
6d80: 74 20 3d 20 70 4e 65 77 46 75 6e 63 3b 0a 20 20  t = pNewFunc;.  
6d90: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
6da0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
6db0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
6dc0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
6dd0: 76 61 6c 75 65 20 6f 66 20 61 20 73 79 73 74 65  value of a syste
6de0: 6d 20 63 61 6c 6c 2e 20 20 52 65 74 75 72 6e 20  m call.  Return 
6df0: 4e 55 4c 4c 20 69 66 20 7a 4e 61 6d 65 20 69 73  NULL if zName is
6e00: 20 6e 6f 74 20 61 0a 2a 2a 20 72 65 63 6f 67 6e   not a.** recogn
6e10: 69 7a 65 64 20 73 79 73 74 65 6d 20 63 61 6c 6c  ized system call
6e20: 20 6e 61 6d 65 2e 20 20 4e 55 4c 4c 20 69 73 20   name.  NULL is 
6e30: 61 6c 73 6f 20 72 65 74 75 72 6e 65 64 20 69 66  also returned if
6e40: 20 74 68 65 20 73 79 73 74 65 6d 20 63 61 6c 6c   the system call
6e50: 0a 2a 2a 20 69 73 20 63 75 72 72 65 6e 74 6c 79  .** is currently
6e60: 20 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73   undefined..*/.s
6e70: 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f 73 79  tatic sqlite3_sy
6e80: 73 63 61 6c 6c 5f 70 74 72 20 75 6e 69 78 47 65  scall_ptr unixGe
6e90: 74 53 79 73 74 65 6d 43 61 6c 6c 28 0a 20 20 73  tSystemCall(.  s
6ea0: 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 4e 6f 74  qlite3_vfs *pNot
6eb0: 55 73 65 64 2c 0a 20 20 63 6f 6e 73 74 20 63 68  Used,.  const ch
6ec0: 61 72 20 2a 7a 4e 61 6d 65 0a 29 7b 0a 20 20 75  ar *zName.){.  u
6ed0: 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a 0a  nsigned int i;..
6ee0: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
6ef0: 45 52 28 70 4e 6f 74 55 73 65 64 29 3b 0a 20 20  ER(pNotUsed);.  
6f00: 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f  for(i=0; i<sizeo
6f10: 66 28 61 53 79 73 63 61 6c 6c 29 2f 73 69 7a 65  f(aSyscall)/size
6f20: 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30 5d 29 3b  of(aSyscall[0]);
6f30: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73   i++){.    if( s
6f40: 74 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 53 79  trcmp(zName, aSy
6f50: 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 29 3d  scall[i].zName)=
6f60: 3d 30 20 29 20 72 65 74 75 72 6e 20 61 53 79 73  =0 ) return aSys
6f70: 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74  call[i].pCurrent
6f80: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
6f90: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
6fa0: 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  n the name of th
6fb0: 65 20 66 69 72 73 74 20 73 79 73 74 65 6d 20 63  e first system c
6fc0: 61 6c 6c 20 61 66 74 65 72 20 7a 4e 61 6d 65 2e  all after zName.
6fd0: 20 20 49 66 20 7a 4e 61 6d 65 3d 3d 4e 55 4c 4c    If zName==NULL
6fe0: 0a 2a 2a 20 74 68 65 6e 20 72 65 74 75 72 6e 20  .** then return 
6ff0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
7000: 66 69 72 73 74 20 73 79 73 74 65 6d 20 63 61 6c  first system cal
7010: 6c 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20  l.  Return NULL 
7020: 69 66 20 7a 4e 61 6d 65 0a 2a 2a 20 69 73 20 74  if zName.** is t
7030: 68 65 20 6c 61 73 74 20 73 79 73 74 65 6d 20 63  he last system c
7040: 61 6c 6c 20 6f 72 20 69 66 20 7a 4e 61 6d 65 20  all or if zName 
7050: 69 73 20 6e 6f 74 20 74 68 65 20 6e 61 6d 65 20  is not the name 
7060: 6f 66 20 61 20 76 61 6c 69 64 0a 2a 2a 20 73 79  of a valid.** sy
7070: 73 74 65 6d 20 63 61 6c 6c 2e 0a 2a 2f 0a 73 74  stem call..*/.st
7080: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
7090: 2a 75 6e 69 78 4e 65 78 74 53 79 73 74 65 6d 43  *unixNextSystemC
70a0: 61 6c 6c 28 73 71 6c 69 74 65 33 5f 76 66 73 20  all(sqlite3_vfs 
70b0: 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  *p, const char *
70c0: 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 20  zName){.  int i 
70d0: 3d 20 2d 31 3b 0a 0a 20 20 55 4e 55 53 45 44 5f  = -1;..  UNUSED_
70e0: 50 41 52 41 4d 45 54 45 52 28 70 29 3b 0a 20 20  PARAMETER(p);.  
70f0: 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20  if( zName ){.   
7100: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61   for(i=0; i<Arra
7110: 79 53 69 7a 65 28 61 53 79 73 63 61 6c 6c 29 2d  ySize(aSyscall)-
7120: 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  1; i++){.      i
7130: 66 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65 2c  f( strcmp(zName,
7140: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61   aSyscall[i].zNa
7150: 6d 65 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  me)==0 ) break;.
7160: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28      }.  }.  for(
7170: 69 2b 2b 3b 20 69 3c 41 72 72 61 79 53 69 7a 65  i++; i<ArraySize
7180: 28 61 53 79 73 63 61 6c 6c 29 3b 20 69 2b 2b 29  (aSyscall); i++)
7190: 7b 0a 20 20 20 20 69 66 28 20 61 53 79 73 63 61  {.    if( aSysca
71a0: 6c 6c 5b 69 5d 2e 70 43 75 72 72 65 6e 74 21 3d  ll[i].pCurrent!=
71b0: 30 20 29 20 72 65 74 75 72 6e 20 61 53 79 73 63  0 ) return aSysc
71c0: 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  all[i].zName;.  
71d0: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
71e0: 0a 2f 2a 0a 2a 2a 20 44 6f 20 6e 6f 74 20 61 63  ./*.** Do not ac
71f0: 63 65 70 74 20 61 6e 79 20 66 69 6c 65 20 64 65  cept any file de
7200: 73 63 72 69 70 74 6f 72 20 6c 65 73 73 20 74 68  scriptor less th
7210: 61 6e 20 74 68 69 73 20 76 61 6c 75 65 2c 20 69  an this value, i
7220: 6e 20 6f 72 64 65 72 20 74 6f 20 61 76 6f 69 64  n order to avoid
7230: 0a 2a 2a 20 6f 70 65 6e 69 6e 67 20 64 61 74 61  .** opening data
7240: 62 61 73 65 20 66 69 6c 65 20 75 73 69 6e 67 20  base file using 
7250: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73  file descriptors
7260: 20 74 68 61 74 20 61 72 65 20 63 6f 6d 6d 6f 6e   that are common
7270: 6c 79 20 75 73 65 64 20 66 6f 72 20 0a 2a 2a 20  ly used for .** 
7280: 73 74 61 6e 64 61 72 64 20 69 6e 70 75 74 2c 20  standard input, 
7290: 6f 75 74 70 75 74 2c 20 61 6e 64 20 65 72 72 6f  output, and erro
72a0: 72 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  r..*/.#ifndef SQ
72b0: 4c 49 54 45 5f 4d 49 4e 49 4d 55 4d 5f 46 49 4c  LITE_MINIMUM_FIL
72c0: 45 5f 44 45 53 43 52 49 50 54 4f 52 0a 23 20 64  E_DESCRIPTOR.# d
72d0: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 4d 49 4e  efine SQLITE_MIN
72e0: 49 4d 55 4d 5f 46 49 4c 45 5f 44 45 53 43 52 49  IMUM_FILE_DESCRI
72f0: 50 54 4f 52 20 33 0a 23 65 6e 64 69 66 0a 0a 2f  PTOR 3.#endif../
7300: 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 6f 70 65 6e  *.** Invoke open
7310: 28 29 2e 20 20 44 6f 20 73 6f 20 6d 75 6c 74 69  ().  Do so multi
7320: 70 6c 65 20 74 69 6d 65 73 2c 20 75 6e 74 69 6c  ple times, until
7330: 20 69 74 20 65 69 74 68 65 72 20 73 75 63 63 65   it either succe
7340: 65 64 73 20 6f 72 0a 2a 2a 20 66 61 69 6c 73 20  eds or.** fails 
7350: 66 6f 72 20 73 6f 6d 65 20 72 65 61 73 6f 6e 20  for some reason 
7360: 6f 74 68 65 72 20 74 68 61 6e 20 45 49 4e 54 52  other than EINTR
7370: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66  ..**.** If 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 22 6d 22 20 69 73 20 30 20 74 68 65 6e 20  e "m" is 0 then 
73a0: 73 65 74 20 69 74 20 74 6f 20 74 68 65 20 64 65  set it to the de
73b0: 66 61 75 6c 74 20 66 6f 72 0a 2a 2a 20 53 51 4c  fault for.** SQL
73c0: 69 74 65 2e 20 20 54 68 65 20 64 65 66 61 75 6c  ite.  The defaul
73d0: 74 20 69 73 20 53 51 4c 49 54 45 5f 44 45 46 41  t is SQLITE_DEFA
73e0: 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53  ULT_FILE_PERMISS
73f0: 49 4f 4e 53 20 28 6e 6f 72 6d 61 6c 6c 79 0a 2a  IONS (normally.*
7400: 2a 20 30 36 34 34 29 20 61 73 20 6d 6f 64 69 66  * 0644) as modif
7410: 69 65 64 20 62 79 20 74 68 65 20 73 79 73 74 65  ied by the syste
7420: 6d 20 75 6d 61 73 6b 2e 20 20 49 66 20 6d 20 69  m umask.  If m i
7430: 73 20 6e 6f 74 20 30 2c 20 74 68 65 6e 0a 2a 2a  s not 0, then.**
7440: 20 6d 61 6b 65 20 74 68 65 20 66 69 6c 65 20 63   make the file c
7450: 72 65 61 74 69 6f 6e 20 6d 6f 64 65 20 62 65 20  reation mode be 
7460: 65 78 61 63 74 6c 79 20 6d 20 69 67 6e 6f 72 69  exactly m ignori
7470: 6e 67 20 74 68 65 20 75 6d 61 73 6b 2e 0a 2a 2a  ng the umask..**
7480: 0a 2a 2a 20 54 68 65 20 6d 20 70 61 72 61 6d 65  .** The m parame
7490: 74 65 72 20 77 69 6c 6c 20 62 65 20 6e 6f 6e 2d  ter will be non-
74a0: 7a 65 72 6f 20 6f 6e 6c 79 20 77 68 65 6e 20 63  zero only when c
74b0: 72 65 61 74 69 6e 67 20 2d 77 61 6c 2c 20 2d 6a  reating -wal, -j
74c0: 6f 75 72 6e 61 6c 2c 0a 2a 2a 20 61 6e 64 20 2d  ournal,.** and -
74d0: 73 68 6d 20 66 69 6c 65 73 2e 20 20 57 65 20 77  shm files.  We w
74e0: 61 6e 74 20 74 68 6f 73 65 20 66 69 6c 65 73 20  ant those files 
74f0: 74 6f 20 68 61 76 65 20 2a 65 78 61 63 74 6c 79  to have *exactly
7500: 2a 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 70 65  * the same.** pe
7510: 72 6d 69 73 73 69 6f 6e 73 20 61 73 20 74 68 65  rmissions as the
7520: 69 72 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61  ir original data
7530: 62 61 73 65 2c 20 75 6e 61 64 75 6c 74 65 72 61  base, unadultera
7540: 74 65 64 20 62 79 20 74 68 65 20 75 6d 61 73 6b  ted by the umask
7550: 2e 0a 2a 2a 20 49 6e 20 74 68 61 74 20 77 61 79  ..** In that way
7560: 2c 20 69 66 20 61 20 64 61 74 61 62 61 73 65 20  , if a database 
7570: 66 69 6c 65 20 69 73 20 2d 72 77 2d 72 77 2d 72  file is -rw-rw-r
7580: 77 20 6f 72 20 2d 72 77 2d 72 77 2d 72 2d 2c 20  w or -rw-rw-r-, 
7590: 61 6e 64 20 61 0a 2a 2a 20 74 72 61 6e 73 61 63  and a.** transac
75a0: 74 69 6f 6e 20 63 72 61 73 68 65 73 20 61 6e 64  tion crashes and
75b0: 20 6c 65 61 76 65 73 20 62 65 68 69 6e 64 20 68   leaves behind h
75c0: 6f 74 20 6a 6f 75 72 6e 61 6c 73 2c 20 74 68 65  ot journals, the
75d0: 6e 20 61 6e 79 0a 2a 2a 20 70 72 6f 63 65 73 73  n any.** process
75e0: 20 74 68 61 74 20 69 73 20 61 62 6c 65 20 74 6f   that is able to
75f0: 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 64 61   write to the da
7600: 74 61 62 61 73 65 20 77 69 6c 6c 20 61 6c 73 6f  tabase will also
7610: 20 62 65 20 61 62 6c 65 20 74 6f 0a 2a 2a 20 72   be able to.** r
7620: 65 63 6f 76 65 72 20 74 68 65 20 68 6f 74 20 6a  ecover the hot j
7630: 6f 75 72 6e 61 6c 73 2e 0a 2a 2f 0a 73 74 61 74  ournals..*/.stat
7640: 69 63 20 69 6e 74 20 72 6f 62 75 73 74 5f 6f 70  ic int robust_op
7650: 65 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  en(const char *z
7660: 2c 20 69 6e 74 20 66 2c 20 6d 6f 64 65 5f 74 20  , int f, mode_t 
7670: 6d 29 7b 0a 20 20 69 6e 74 20 66 64 3b 0a 20 20  m){.  int fd;.  
7680: 6d 6f 64 65 5f 74 20 6d 32 20 3d 20 6d 20 3f 20  mode_t m2 = m ? 
7690: 6d 20 3a 20 53 51 4c 49 54 45 5f 44 45 46 41 55  m : SQLITE_DEFAU
76a0: 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49  LT_FILE_PERMISSI
76b0: 4f 4e 53 3b 0a 20 20 77 68 69 6c 65 28 31 29 7b  ONS;.  while(1){
76c0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 4f 5f 43  .#if defined(O_C
76d0: 4c 4f 45 58 45 43 29 0a 20 20 20 20 66 64 20 3d  LOEXEC).    fd =
76e0: 20 6f 73 4f 70 65 6e 28 7a 2c 66 7c 4f 5f 43 4c   osOpen(z,f|O_CL
76f0: 4f 45 58 45 43 2c 6d 32 29 3b 0a 23 65 6c 73 65  OEXEC,m2);.#else
7700: 0a 20 20 20 20 66 64 20 3d 20 6f 73 4f 70 65 6e  .    fd = osOpen
7710: 28 7a 2c 66 2c 6d 32 29 3b 0a 23 65 6e 64 69 66  (z,f,m2);.#endif
7720: 0a 20 20 20 20 69 66 28 20 66 64 3c 30 20 29 7b  .    if( fd<0 ){
7730: 0a 20 20 20 20 20 20 69 66 28 20 65 72 72 6e 6f  .      if( errno
7740: 3d 3d 45 49 4e 54 52 20 29 20 63 6f 6e 74 69 6e  ==EINTR ) contin
7750: 75 65 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ue;.      break;
7760: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 66  .    }.    if( f
7770: 64 3e 3d 53 51 4c 49 54 45 5f 4d 49 4e 49 4d 55  d>=SQLITE_MINIMU
7780: 4d 5f 46 49 4c 45 5f 44 45 53 43 52 49 50 54 4f  M_FILE_DESCRIPTO
7790: 52 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 6f  R ) break;.    o
77a0: 73 43 6c 6f 73 65 28 66 64 29 3b 0a 20 20 20 20  sClose(fd);.    
77b0: 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49  sqlite3_log(SQLI
77c0: 54 45 5f 57 41 52 4e 49 4e 47 2c 20 0a 20 20 20  TE_WARNING, .   
77d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 61 74               "at
77e0: 74 65 6d 70 74 20 74 6f 20 6f 70 65 6e 20 5c 22  tempt to open \"
77f0: 25 73 5c 22 20 61 73 20 66 69 6c 65 20 64 65 73  %s\" as file des
7800: 63 72 69 70 74 6f 72 20 25 64 22 2c 20 7a 2c 20  criptor %d", z, 
7810: 66 64 29 3b 0a 20 20 20 20 66 64 20 3d 20 2d 31  fd);.    fd = -1
7820: 3b 0a 20 20 20 20 69 66 28 20 6f 73 4f 70 65 6e  ;.    if( osOpen
7830: 28 22 2f 64 65 76 2f 6e 75 6c 6c 22 2c 20 66 2c  ("/dev/null", f,
7840: 20 6d 29 3c 30 20 29 20 62 72 65 61 6b 3b 0a 20   m)<0 ) break;. 
7850: 20 7d 0a 20 20 69 66 28 20 66 64 3e 3d 30 20 29   }.  if( fd>=0 )
7860: 7b 0a 20 20 20 20 69 66 28 20 6d 21 3d 30 20 29  {.    if( m!=0 )
7870: 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 73  {.      struct s
7880: 74 61 74 20 73 74 61 74 62 75 66 3b 0a 20 20 20  tat statbuf;.   
7890: 20 20 20 69 66 28 20 6f 73 46 73 74 61 74 28 66     if( osFstat(f
78a0: 64 2c 20 26 73 74 61 74 62 75 66 29 3d 3d 30 20  d, &statbuf)==0 
78b0: 0a 20 20 20 20 20 20 20 26 26 20 73 74 61 74 62  .       && statb
78c0: 75 66 2e 73 74 5f 73 69 7a 65 3d 3d 30 0a 20 20  uf.st_size==0.  
78d0: 20 20 20 20 20 26 26 20 28 73 74 61 74 62 75 66       && (statbuf
78e0: 2e 73 74 5f 6d 6f 64 65 26 30 37 37 37 29 21 3d  .st_mode&0777)!=
78f0: 6d 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  m .      ){.    
7900: 20 20 20 20 6f 73 46 63 68 6d 6f 64 28 66 64 2c      osFchmod(fd,
7910: 20 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   m);.      }.   
7920: 20 7d 0a 23 69 66 20 64 65 66 69 6e 65 64 28 46   }.#if defined(F
7930: 44 5f 43 4c 4f 45 58 45 43 29 20 26 26 20 28 21  D_CLOEXEC) && (!
7940: 64 65 66 69 6e 65 64 28 4f 5f 43 4c 4f 45 58 45  defined(O_CLOEXE
7950: 43 29 20 7c 7c 20 4f 5f 43 4c 4f 45 58 45 43 3d  C) || O_CLOEXEC=
7960: 3d 30 29 0a 20 20 20 20 6f 73 46 63 6e 74 6c 28  =0).    osFcntl(
7970: 66 64 2c 20 46 5f 53 45 54 46 44 2c 20 6f 73 46  fd, F_SETFD, osF
7980: 63 6e 74 6c 28 66 64 2c 20 46 5f 47 45 54 46 44  cntl(fd, F_GETFD
7990: 2c 20 30 29 20 7c 20 46 44 5f 43 4c 4f 45 58 45  , 0) | FD_CLOEXE
79a0: 43 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20  C);.#endif.  }. 
79b0: 20 72 65 74 75 72 6e 20 66 64 3b 0a 7d 0a 0a 2f   return fd;.}../
79c0: 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e 63  *.** Helper func
79d0: 74 69 6f 6e 73 20 74 6f 20 6f 62 74 61 69 6e 20  tions to obtain 
79e0: 61 6e 64 20 72 65 6c 69 6e 71 75 69 73 68 20 74  and relinquish t
79f0: 68 65 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 2e  he global mutex.
7a00: 20 54 68 65 0a 2a 2a 20 67 6c 6f 62 61 6c 20 6d   The.** global m
7a10: 75 74 65 78 20 69 73 20 75 73 65 64 20 74 6f 20  utex is used to 
7a20: 70 72 6f 74 65 63 74 20 74 68 65 20 75 6e 69 78  protect the unix
7a30: 49 6e 6f 64 65 49 6e 66 6f 20 61 6e 64 0a 2a 2a  InodeInfo and.**
7a40: 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f   vxworksFileId o
7a50: 62 6a 65 63 74 73 20 75 73 65 64 20 62 79 20 74  bjects used by t
7a60: 68 69 73 20 66 69 6c 65 2c 20 61 6c 6c 20 6f 66  his file, all of
7a70: 20 77 68 69 63 68 20 6d 61 79 20 62 65 20 0a 2a   which may be .*
7a80: 2a 20 73 68 61 72 65 64 20 62 79 20 6d 75 6c 74  * shared by mult
7a90: 69 70 6c 65 20 74 68 72 65 61 64 73 2e 0a 2a 2a  iple threads..**
7aa0: 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 20 75 6e 69  .** Function uni
7ab0: 78 4d 75 74 65 78 48 65 6c 64 28 29 20 69 73 20  xMutexHeld() is 
7ac0: 75 73 65 64 20 74 6f 20 61 73 73 65 72 74 28 29  used to assert()
7ad0: 20 74 68 61 74 20 74 68 65 20 67 6c 6f 62 61 6c   that the global
7ae0: 20 6d 75 74 65 78 20 0a 2a 2a 20 69 73 20 68 65   mutex .** is he
7af0: 6c 64 20 77 68 65 6e 20 72 65 71 75 69 72 65 64  ld when required
7b00: 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
7b10: 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 61 73 20  is only used as 
7b20: 70 61 72 74 20 6f 66 20 61 73 73 65 72 74 28 29  part of assert()
7b30: 20 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 2e   .** statements.
7b40: 20 65 2e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 75 6e   e.g..**.**   un
7b50: 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 0a 2a  ixEnterMutex().*
7b60: 2a 20 20 20 20 20 61 73 73 65 72 74 28 20 75 6e  *     assert( un
7b70: 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b  ixMutexHeld() );
7b80: 0a 2a 2a 20 20 20 75 6e 69 78 45 6e 74 65 72 4c  .**   unixEnterL
7b90: 65 61 76 65 28 29 0a 2a 2f 0a 73 74 61 74 69 63  eave().*/.static
7ba0: 20 76 6f 69 64 20 75 6e 69 78 45 6e 74 65 72 4d   void unixEnterM
7bb0: 75 74 65 78 28 76 6f 69 64 29 7b 0a 20 20 73 71  utex(void){.  sq
7bc0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
7bd0: 72 28 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  r(sqlite3MutexAl
7be0: 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
7bf0: 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 29  _STATIC_MASTER))
7c00: 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
7c10: 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 76  unixLeaveMutex(v
7c20: 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  oid){.  sqlite3_
7c30: 6d 75 74 65 78 5f 6c 65 61 76 65 28 73 71 6c 69  mutex_leave(sqli
7c40: 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51  te3MutexAlloc(SQ
7c50: 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
7c60: 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 23 69  C_MASTER));.}.#i
7c70: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
7c80: 47 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  G.static int uni
7c90: 78 4d 75 74 65 78 48 65 6c 64 28 76 6f 69 64 29  xMutexHeld(void)
7ca0: 20 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69   {.  return sqli
7cb0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 73  te3_mutex_held(s
7cc0: 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
7cd0: 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
7ce0: 41 54 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d  ATIC_MASTER));.}
7cf0: 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66 20 64 65  .#endif...#if de
7d00: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53  fined(SQLITE_TES
7d10: 54 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  T) && defined(SQ
7d20: 4c 49 54 45 5f 44 45 42 55 47 29 0a 2f 2a 0a 2a  LITE_DEBUG)./*.*
7d30: 2a 20 48 65 6c 70 65 72 20 66 75 6e 63 74 69 6f  * Helper functio
7d40: 6e 20 66 6f 72 20 70 72 69 6e 74 69 6e 67 20 6f  n for printing o
7d50: 75 74 20 74 72 61 63 65 20 69 6e 66 6f 72 6d 61  ut trace informa
7d60: 74 69 6f 6e 20 66 72 6f 6d 20 64 65 62 75 67 67  tion from debugg
7d70: 69 6e 67 0a 2a 2a 20 62 69 6e 61 72 69 65 73 2e  ing.** binaries.
7d80: 20 54 68 69 73 20 72 65 74 75 72 6e 73 20 74 68   This returns th
7d90: 65 20 73 74 72 69 6e 67 20 72 65 70 72 65 73 65  e string represe
7da0: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73  ntation of the s
7db0: 75 70 70 6c 69 65 64 0a 2a 2a 20 69 6e 74 65 67  upplied.** integ
7dc0: 65 72 20 6c 6f 63 6b 2d 74 79 70 65 2e 0a 2a 2f  er lock-type..*/
7dd0: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
7de0: 61 72 20 2a 61 7a 46 69 6c 65 4c 6f 63 6b 28 69  ar *azFileLock(i
7df0: 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20  nt eFileLock){. 
7e00: 20 73 77 69 74 63 68 28 20 65 46 69 6c 65 4c 6f   switch( eFileLo
7e10: 63 6b 20 29 7b 0a 20 20 20 20 63 61 73 65 20 4e  ck ){.    case N
7e20: 4f 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22  O_LOCK: return "
7e30: 4e 4f 4e 45 22 3b 0a 20 20 20 20 63 61 73 65 20  NONE";.    case 
7e40: 53 48 41 52 45 44 5f 4c 4f 43 4b 3a 20 72 65 74  SHARED_LOCK: ret
7e50: 75 72 6e 20 22 53 48 41 52 45 44 22 3b 0a 20 20  urn "SHARED";.  
7e60: 20 20 63 61 73 65 20 52 45 53 45 52 56 45 44 5f    case RESERVED_
7e70: 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 52 45  LOCK: return "RE
7e80: 53 45 52 56 45 44 22 3b 0a 20 20 20 20 63 61 73  SERVED";.    cas
7e90: 65 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3a 20  e PENDING_LOCK: 
7ea0: 72 65 74 75 72 6e 20 22 50 45 4e 44 49 4e 47 22  return "PENDING"
7eb0: 3b 0a 20 20 20 20 63 61 73 65 20 45 58 43 4c 55  ;.    case EXCLU
7ec0: 53 49 56 45 5f 4c 4f 43 4b 3a 20 72 65 74 75 72  SIVE_LOCK: retur
7ed0: 6e 20 22 45 58 43 4c 55 53 49 56 45 22 3b 0a 20  n "EXCLUSIVE";. 
7ee0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 22 45 52 52   }.  return "ERR
7ef0: 4f 52 22 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  OR";.}.#endif..#
7f00: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4c 4f 43  ifdef SQLITE_LOC
7f10: 4b 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20 50 72  K_TRACE./*.** Pr
7f20: 69 6e 74 20 6f 75 74 20 69 6e 66 6f 72 6d 61 74  int out informat
7f30: 69 6f 6e 20 61 62 6f 75 74 20 61 6c 6c 20 6c 6f  ion about all lo
7f40: 63 6b 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73  cking operations
7f50: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
7f60: 74 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72  tine is used for
7f70: 20 74 72 6f 75 62 6c 65 73 68 6f 6f 74 69 6e 67   troubleshooting
7f80: 20 6c 6f 63 6b 73 20 6f 6e 20 6d 75 6c 74 69 74   locks on multit
7f90: 68 72 65 61 64 65 64 0a 2a 2a 20 70 6c 61 74 66  hreaded.** platf
7fa0: 6f 72 6d 73 2e 20 20 45 6e 61 62 6c 65 20 62 79  orms.  Enable by
7fb0: 20 63 6f 6d 70 69 6c 69 6e 67 20 77 69 74 68 20   compiling with 
7fc0: 74 68 65 20 2d 44 53 51 4c 49 54 45 5f 4c 4f 43  the -DSQLITE_LOC
7fd0: 4b 5f 54 52 41 43 45 0a 2a 2a 20 63 6f 6d 6d 61  K_TRACE.** comma
7fe0: 6e 64 2d 6c 69 6e 65 20 6f 70 74 69 6f 6e 20 6f  nd-line option o
7ff0: 6e 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 2e 20  n the compiler. 
8000: 20 54 68 69 73 20 63 6f 64 65 20 69 73 20 6e 6f   This code is no
8010: 72 6d 61 6c 6c 79 0a 2a 2a 20 74 75 72 6e 65 64  rmally.** turned
8020: 20 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   off..*/.static 
8030: 69 6e 74 20 6c 6f 63 6b 54 72 61 63 65 28 69 6e  int lockTrace(in
8040: 74 20 66 64 2c 20 69 6e 74 20 6f 70 2c 20 73 74  t fd, int op, st
8050: 72 75 63 74 20 66 6c 6f 63 6b 20 2a 70 29 7b 0a  ruct flock *p){.
8060: 20 20 63 68 61 72 20 2a 7a 4f 70 4e 61 6d 65 2c    char *zOpName,
8070: 20 2a 7a 54 79 70 65 3b 0a 20 20 69 6e 74 20 73   *zType;.  int s
8080: 3b 0a 20 20 69 6e 74 20 73 61 76 65 64 45 72 72  ;.  int savedErr
8090: 6e 6f 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 46 5f  no;.  if( op==F_
80a0: 47 45 54 4c 4b 20 29 7b 0a 20 20 20 20 7a 4f 70  GETLK ){.    zOp
80b0: 4e 61 6d 65 20 3d 20 22 47 45 54 4c 4b 22 3b 0a  Name = "GETLK";.
80c0: 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d    }else if( op==
80d0: 46 5f 53 45 54 4c 4b 20 29 7b 0a 20 20 20 20 7a  F_SETLK ){.    z
80e0: 4f 70 4e 61 6d 65 20 3d 20 22 53 45 54 4c 4b 22  OpName = "SETLK"
80f0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
8100: 20 3d 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20 6f   = osFcntl(fd, o
8110: 70 2c 20 70 29 3b 0a 20 20 20 20 73 71 6c 69 74  p, p);.    sqlit
8120: 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 66  e3DebugPrintf("f
8130: 63 6e 74 6c 20 75 6e 6b 6e 6f 77 6e 20 25 64 20  cntl unknown %d 
8140: 25 64 20 25 64 5c 6e 22 2c 20 66 64 2c 20 6f 70  %d %d\n", fd, op
8150: 2c 20 73 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , s);.    return
8160: 20 73 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d   s;.  }.  if( p-
8170: 3e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44 4c 43 4b  >l_type==F_RDLCK
8180: 20 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20   ){.    zType = 
8190: 22 52 44 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73 65  "RDLCK";.  }else
81a0: 20 69 66 28 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d   if( p->l_type==
81b0: 46 5f 57 52 4c 43 4b 20 29 7b 0a 20 20 20 20 7a  F_WRLCK ){.    z
81c0: 54 79 70 65 20 3d 20 22 57 52 4c 43 4b 22 3b 0a  Type = "WRLCK";.
81d0: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6c    }else if( p->l
81e0: 5f 74 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29  _type==F_UNLCK )
81f0: 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 22 55  {.    zType = "U
8200: 4e 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a  NLCK";.  }else{.
8210: 20 20 20 20 61 73 73 65 72 74 28 20 30 20 29 3b      assert( 0 );
8220: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
8230: 2d 3e 6c 5f 77 68 65 6e 63 65 3d 3d 53 45 45 4b  ->l_whence==SEEK
8240: 5f 53 45 54 20 29 3b 0a 20 20 73 20 3d 20 6f 73  _SET );.  s = os
8250: 46 63 6e 74 6c 28 66 64 2c 20 6f 70 2c 20 70 29  Fcntl(fd, op, p)
8260: 3b 0a 20 20 73 61 76 65 64 45 72 72 6e 6f 20 3d  ;.  savedErrno =
8270: 20 65 72 72 6e 6f 3b 0a 20 20 73 71 6c 69 74 65   errno;.  sqlite
8280: 33 44 65 62 75 67 50 72 69 6e 74 66 28 22 66 63  3DebugPrintf("fc
8290: 6e 74 6c 20 25 64 20 25 64 20 25 73 20 25 73 20  ntl %d %d %s %s 
82a0: 25 64 20 25 64 20 25 64 20 25 64 5c 6e 22 2c 0a  %d %d %d %d\n",.
82b0: 20 20 20 20 20 74 68 72 65 61 64 69 64 2c 20 66       threadid, f
82c0: 64 2c 20 7a 4f 70 4e 61 6d 65 2c 20 7a 54 79 70  d, zOpName, zTyp
82d0: 65 2c 20 28 69 6e 74 29 70 2d 3e 6c 5f 73 74 61  e, (int)p->l_sta
82e0: 72 74 2c 20 28 69 6e 74 29 70 2d 3e 6c 5f 6c 65  rt, (int)p->l_le
82f0: 6e 2c 0a 20 20 20 20 20 28 69 6e 74 29 70 2d 3e  n,.     (int)p->
8300: 6c 5f 70 69 64 2c 20 73 29 3b 0a 20 20 69 66 28  l_pid, s);.  if(
8310: 20 73 3d 3d 28 2d 31 29 20 26 26 20 6f 70 3d 3d   s==(-1) && op==
8320: 46 5f 53 45 54 4c 4b 20 26 26 20 28 70 2d 3e 6c  F_SETLK && (p->l
8330: 5f 74 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 7c  _type==F_RDLCK |
8340: 7c 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 57  | p->l_type==F_W
8350: 52 4c 43 4b 29 20 29 7b 0a 20 20 20 20 73 74 72  RLCK) ){.    str
8360: 75 63 74 20 66 6c 6f 63 6b 20 6c 32 3b 0a 20 20  uct flock l2;.  
8370: 20 20 6c 32 20 3d 20 2a 70 3b 0a 20 20 20 20 6f    l2 = *p;.    o
8380: 73 46 63 6e 74 6c 28 66 64 2c 20 46 5f 47 45 54  sFcntl(fd, F_GET
8390: 4c 4b 2c 20 26 6c 32 29 3b 0a 20 20 20 20 69 66  LK, &l2);.    if
83a0: 28 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f 52  ( l2.l_type==F_R
83b0: 44 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 7a 54  DLCK ){.      zT
83c0: 79 70 65 20 3d 20 22 52 44 4c 43 4b 22 3b 0a 20  ype = "RDLCK";. 
83d0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 32 2e     }else if( l2.
83e0: 6c 5f 74 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20  l_type==F_WRLCK 
83f0: 29 7b 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d  ){.      zType =
8400: 20 22 57 52 4c 43 4b 22 3b 0a 20 20 20 20 7d 65   "WRLCK";.    }e
8410: 6c 73 65 20 69 66 28 20 6c 32 2e 6c 5f 74 79 70  lse if( l2.l_typ
8420: 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20  e==F_UNLCK ){.  
8430: 20 20 20 20 7a 54 79 70 65 20 3d 20 22 55 4e 4c      zType = "UNL
8440: 43 4b 22 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  CK";.    }else{.
8450: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 30 20        assert( 0 
8460: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
8470: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
8480: 22 66 63 6e 74 6c 2d 66 61 69 6c 75 72 65 2d 72  "fcntl-failure-r
8490: 65 61 73 6f 6e 3a 20 25 73 20 25 64 20 25 64 20  eason: %s %d %d 
84a0: 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 7a 54  %d\n",.       zT
84b0: 79 70 65 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f 73  ype, (int)l2.l_s
84c0: 74 61 72 74 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f  tart, (int)l2.l_
84d0: 6c 65 6e 2c 20 28 69 6e 74 29 6c 32 2e 6c 5f 70  len, (int)l2.l_p
84e0: 69 64 29 3b 0a 20 20 7d 0a 20 20 65 72 72 6e 6f  id);.  }.  errno
84f0: 20 3d 20 73 61 76 65 64 45 72 72 6e 6f 3b 0a 20   = savedErrno;. 
8500: 20 72 65 74 75 72 6e 20 73 3b 0a 7d 0a 23 75 6e   return s;.}.#un
8510: 64 65 66 20 6f 73 46 63 6e 74 6c 0a 23 64 65 66  def osFcntl.#def
8520: 69 6e 65 20 6f 73 46 63 6e 74 6c 20 6c 6f 63 6b  ine osFcntl lock
8530: 54 72 61 63 65 0a 23 65 6e 64 69 66 20 2f 2a 20  Trace.#endif /* 
8540: 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52 41 43  SQLITE_LOCK_TRAC
8550: 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72  E */../*.** Retr
8560: 79 20 66 74 72 75 6e 63 61 74 65 28 29 20 63 61  y ftruncate() ca
8570: 6c 6c 73 20 74 68 61 74 20 66 61 69 6c 20 64 75  lls that fail du
8580: 65 20 74 6f 20 45 49 4e 54 52 0a 2a 2a 0a 2a 2a  e to EINTR.**.**
8590: 20 41 6c 6c 20 63 61 6c 6c 73 20 74 6f 20 66 74   All calls to ft
85a0: 72 75 6e 63 61 74 65 28 29 20 77 69 74 68 69 6e  runcate() within
85b0: 20 74 68 69 73 20 66 69 6c 65 20 73 68 6f 75 6c   this file shoul
85c0: 64 20 62 65 20 6d 61 64 65 20 74 68 72 6f 75 67  d be made throug
85d0: 68 20 74 68 69 73 20 77 72 61 70 70 65 72 2e 0a  h this wrapper..
85e0: 2a 2a 20 4f 6e 20 74 68 65 20 41 6e 64 72 6f 69  ** On the Androi
85f0: 64 20 70 6c 61 74 66 6f 72 6d 2c 20 62 79 70 61  d platform, bypa
8600: 73 73 69 6e 67 20 74 68 65 20 6c 6f 67 69 63 20  ssing the logic 
8610: 62 65 6c 6f 77 20 63 6f 75 6c 64 20 6c 65 61 64  below could lead
8620: 20 74 6f 20 61 20 63 6f 72 72 75 70 74 0a 2a 2a   to a corrupt.**
8630: 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74   database..*/.st
8640: 61 74 69 63 20 69 6e 74 20 72 6f 62 75 73 74 5f  atic int robust_
8650: 66 74 72 75 6e 63 61 74 65 28 69 6e 74 20 68 2c  ftruncate(int h,
8660: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73   sqlite3_int64 s
8670: 7a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 23 69  z){.  int rc;.#i
8680: 66 64 65 66 20 5f 5f 41 4e 44 52 4f 49 44 5f 5f  fdef __ANDROID__
8690: 0a 20 20 2f 2a 20 4f 6e 20 41 6e 64 72 6f 69 64  .  /* On Android
86a0: 2c 20 66 74 72 75 6e 63 61 74 65 28 29 20 61 6c  , ftruncate() al
86b0: 77 61 79 73 20 75 73 65 73 20 33 32 2d 62 69 74  ways uses 32-bit
86c0: 20 6f 66 66 73 65 74 73 2c 20 65 76 65 6e 20 69   offsets, even i
86d0: 66 20 0a 20 20 2a 2a 20 5f 46 49 4c 45 5f 4f 46  f .  ** _FILE_OF
86e0: 46 53 45 54 5f 42 49 54 53 3d 36 34 20 69 73 20  FSET_BITS=64 is 
86f0: 64 65 66 69 6e 65 64 2e 20 54 68 69 73 20 6d 65  defined. This me
8700: 61 6e 73 20 69 74 20 69 73 20 75 6e 73 61 66 65  ans it is unsafe
8710: 20 74 6f 20 61 74 74 65 6d 70 74 20 74 6f 0a 20   to attempt to. 
8720: 20 2a 2a 20 74 72 75 6e 63 61 74 65 20 61 20 66   ** truncate a f
8730: 69 6c 65 20 74 6f 20 61 6e 79 20 73 69 7a 65 20  ile to any size 
8740: 6c 61 72 67 65 72 20 74 68 61 6e 20 32 47 69 42  larger than 2GiB
8750: 2e 20 53 69 6c 65 6e 74 6c 79 20 69 67 6e 6f 72  . Silently ignor
8760: 65 20 61 6e 79 0a 20 20 2a 2a 20 73 75 63 68 20  e any.  ** such 
8770: 61 74 74 65 6d 70 74 73 2e 20 20 2a 2f 0a 20 20  attempts.  */.  
8780: 69 66 28 20 73 7a 3e 28 73 71 6c 69 74 65 33 5f  if( sz>(sqlite3_
8790: 69 6e 74 36 34 29 30 78 37 46 46 46 46 46 46 46  int64)0x7FFFFFFF
87a0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
87b0: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 0a  ITE_OK;.  }else.
87c0: 23 65 6e 64 69 66 0a 20 20 64 6f 7b 20 72 63 20  #endif.  do{ rc 
87d0: 3d 20 6f 73 46 74 72 75 6e 63 61 74 65 28 68 2c  = osFtruncate(h,
87e0: 73 7a 29 3b 20 7d 77 68 69 6c 65 28 20 72 63 3c  sz); }while( rc<
87f0: 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54  0 && errno==EINT
8800: 52 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  R );.  return rc
8810: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
8820: 72 6f 75 74 69 6e 65 20 74 72 61 6e 73 6c 61 74  routine translat
8830: 65 73 20 61 20 73 74 61 6e 64 61 72 64 20 50 4f  es a standard PO
8840: 53 49 58 20 65 72 72 6e 6f 20 63 6f 64 65 20 69  SIX errno code i
8850: 6e 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a  nto something.**
8860: 20 75 73 65 66 75 6c 20 74 6f 20 74 68 65 20 63   useful to the c
8870: 6c 69 65 6e 74 73 20 6f 66 20 74 68 65 20 73 71  lients of the sq
8880: 6c 69 74 65 33 20 66 75 6e 63 74 69 6f 6e 73 2e  lite3 functions.
8890: 20 20 53 70 65 63 69 66 69 63 61 6c 6c 79 2c 20    Specifically, 
88a0: 69 74 20 69 73 0a 2a 2a 20 69 6e 74 65 6e 64 65  it is.** intende
88b0: 64 20 74 6f 20 74 72 61 6e 73 6c 61 74 65 20 61  d to translate a
88c0: 20 76 61 72 69 65 74 79 20 6f 66 20 22 74 72 79   variety of "try
88d0: 20 61 67 61 69 6e 22 20 65 72 72 6f 72 73 20 69   again" errors i
88e0: 6e 74 6f 20 53 51 4c 49 54 45 5f 42 55 53 59 0a  nto SQLITE_BUSY.
88f0: 2a 2a 20 61 6e 64 20 61 20 76 61 72 69 65 74 79  ** and a variety
8900: 20 6f 66 20 22 70 6c 65 61 73 65 20 63 6c 6f 73   of "please clos
8910: 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  e the file descr
8920: 69 70 74 6f 72 20 4e 4f 57 22 20 65 72 72 6f 72  iptor NOW" error
8930: 73 20 69 6e 74 6f 20 0a 2a 2a 20 53 51 4c 49 54  s into .** SQLIT
8940: 45 5f 49 4f 45 52 52 0a 2a 2a 20 0a 2a 2a 20 45  E_IOERR.** .** E
8950: 72 72 6f 72 73 20 64 75 72 69 6e 67 20 69 6e 69  rrors during ini
8960: 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 6c  tialization of l
8970: 6f 63 6b 73 2c 20 6f 72 20 66 69 6c 65 20 73 79  ocks, or file sy
8980: 73 74 65 6d 20 73 75 70 70 6f 72 74 20 66 6f 72  stem support for
8990: 20 6c 6f 63 6b 73 2c 0a 2a 2a 20 73 68 6f 75 6c   locks,.** shoul
89a0: 64 20 68 61 6e 64 6c 65 20 45 4e 4f 4c 43 4b 2c  d handle ENOLCK,
89b0: 20 45 4e 4f 54 53 55 50 2c 20 45 4f 50 4e 4f 54   ENOTSUP, EOPNOT
89c0: 53 55 50 50 20 73 65 70 61 72 61 74 65 6c 79 2e  SUPP separately.
89d0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
89e0: 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
89f0: 73 69 78 45 72 72 6f 72 28 69 6e 74 20 70 6f 73  sixError(int pos
8a00: 69 78 45 72 72 6f 72 2c 20 69 6e 74 20 73 71 6c  ixError, int sql
8a10: 69 74 65 49 4f 45 72 72 29 20 7b 0a 20 20 73 77  iteIOErr) {.  sw
8a20: 69 74 63 68 20 28 70 6f 73 69 78 45 72 72 6f 72  itch (posixError
8a30: 29 20 7b 0a 23 69 66 20 30 0a 20 20 2f 2a 20 41  ) {.#if 0.  /* A
8a40: 74 20 6f 6e 65 20 70 6f 69 6e 74 20 74 68 69 73  t one point this
8a50: 20 63 6f 64 65 20 77 61 73 20 6e 6f 74 20 63 6f   code was not co
8a60: 6d 6d 65 6e 74 65 64 20 6f 75 74 2e 20 49 6e 20  mmented out. In 
8a70: 74 68 65 6f 72 79 2c 20 74 68 69 73 20 62 72 61  theory, this bra
8a80: 6e 63 68 0a 20 20 2a 2a 20 73 68 6f 75 6c 64 20  nch.  ** should 
8a90: 6e 65 76 65 72 20 62 65 20 68 69 74 2c 20 61 73  never be hit, as
8aa0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73   this function s
8ab0: 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61  hould only be ca
8ac0: 6c 6c 65 64 20 61 66 74 65 72 0a 20 20 2a 2a 20  lled after.  ** 
8ad0: 61 20 6c 6f 63 6b 69 6e 67 2d 72 65 6c 61 74 65  a locking-relate
8ae0: 64 20 66 75 6e 63 74 69 6f 6e 20 28 69 2e 65 2e  d function (i.e.
8af0: 20 66 63 6e 74 6c 28 29 29 20 68 61 73 20 72 65   fcntl()) has re
8b00: 74 75 72 6e 65 64 20 6e 6f 6e 2d 7a 65 72 6f 20  turned non-zero 
8b10: 77 69 74 68 0a 20 20 2a 2a 20 74 68 65 20 76 61  with.  ** the va
8b20: 6c 75 65 20 6f 66 20 65 72 72 6e 6f 20 61 73 20  lue of errno as 
8b30: 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
8b40: 6e 74 2e 20 53 69 6e 63 65 20 61 20 73 79 73 74  nt. Since a syst
8b50: 65 6d 20 63 61 6c 6c 20 68 61 73 20 66 61 69 6c  em call has fail
8b60: 65 64 2c 0a 20 20 2a 2a 20 65 72 72 6e 6f 20 73  ed,.  ** errno s
8b70: 68 6f 75 6c 64 20 62 65 20 6e 6f 6e 2d 7a 65 72  hould be non-zer
8b80: 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 44 65 73  o..  **.  ** Des
8b90: 70 69 74 65 20 74 68 69 73 2c 20 69 66 20 65 72  pite this, if er
8ba0: 72 6e 6f 20 72 65 61 6c 6c 79 20 69 73 20 7a 65  rno really is ze
8bb0: 72 6f 2c 20 77 65 20 73 74 69 6c 6c 20 64 6f 6e  ro, we still don
8bc0: 27 74 20 77 61 6e 74 20 74 6f 20 72 65 74 75 72  't want to retur
8bd0: 6e 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  n.  ** SQLITE_OK
8be0: 2e 20 54 68 65 20 73 79 73 74 65 6d 20 63 61 6c  . The system cal
8bf0: 6c 20 66 61 69 6c 65 64 2c 20 61 6e 64 20 2a 73  l failed, and *s
8c00: 6f 6d 65 2a 20 53 51 4c 69 74 65 20 65 72 72 6f  ome* SQLite erro
8c10: 72 20 73 68 6f 75 6c 64 20 62 65 0a 20 20 2a 2a  r should be.  **
8c20: 20 70 72 6f 70 61 67 61 74 65 64 20 62 61 63 6b   propagated back
8c30: 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 20   to the caller. 
8c40: 43 6f 6d 6d 65 6e 74 69 6e 67 20 74 68 69 73 20  Commenting this 
8c50: 62 72 61 6e 63 68 20 6f 75 74 20 6d 65 61 6e 73  branch out means
8c60: 20 65 72 72 6e 6f 3d 3d 30 0a 20 20 2a 2a 20 77   errno==0.  ** w
8c70: 69 6c 6c 20 62 65 20 68 61 6e 64 6c 65 64 20 62  ill be handled b
8c80: 79 20 74 68 65 20 22 64 65 66 61 75 6c 74 3a 22  y the "default:"
8c90: 20 63 61 73 65 20 62 65 6c 6f 77 2e 0a 20 20 2a   case below..  *
8ca0: 2f 0a 20 20 63 61 73 65 20 30 3a 20 0a 20 20 20  /.  case 0: .   
8cb0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
8cc0: 4b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 63 61 73  K;.#endif..  cas
8cd0: 65 20 45 41 47 41 49 4e 3a 0a 20 20 63 61 73 65  e EAGAIN:.  case
8ce0: 20 45 54 49 4d 45 44 4f 55 54 3a 0a 20 20 63 61   ETIMEDOUT:.  ca
8cf0: 73 65 20 45 42 55 53 59 3a 0a 20 20 63 61 73 65  se EBUSY:.  case
8d00: 20 45 49 4e 54 52 3a 0a 20 20 63 61 73 65 20 45   EINTR:.  case E
8d10: 4e 4f 4c 43 4b 3a 20 20 0a 20 20 20 20 2f 2a 20  NOLCK:  .    /* 
8d20: 72 61 6e 64 6f 6d 20 4e 46 53 20 72 65 74 72 79  random NFS retry
8d30: 20 65 72 72 6f 72 2c 20 75 6e 6c 65 73 73 20 64   error, unless d
8d40: 75 72 69 6e 67 20 66 69 6c 65 20 73 79 73 74 65  uring file syste
8d50: 6d 20 73 75 70 70 6f 72 74 20 0a 20 20 20 20 20  m support .     
8d60: 2a 20 69 6e 74 72 6f 73 70 65 63 74 69 6f 6e 2c  * introspection,
8d70: 20 69 6e 20 77 68 69 63 68 20 69 74 20 61 63 74   in which it act
8d80: 75 61 6c 6c 79 20 6d 65 61 6e 73 20 77 68 61 74  ually means what
8d90: 20 69 74 20 73 61 79 73 20 2a 2f 0a 20 20 20 20   it says */.    
8da0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
8db0: 53 59 3b 0a 20 20 20 20 0a 20 20 63 61 73 65 20  SY;.    .  case 
8dc0: 45 41 43 43 45 53 3a 20 0a 20 20 20 20 2f 2a 20  EACCES: .    /* 
8dd0: 45 41 43 43 45 53 20 69 73 20 6c 69 6b 65 20 45  EACCES is like E
8de0: 41 47 41 49 4e 20 64 75 72 69 6e 67 20 6c 6f 63  AGAIN during loc
8df0: 6b 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73 2c  king operations,
8e00: 20 62 75 74 20 6e 6f 74 20 61 6e 79 20 6f 74 68   but not any oth
8e10: 65 72 20 74 69 6d 65 2a 2f 0a 20 20 20 20 69 66  er time*/.    if
8e20: 28 20 28 73 71 6c 69 74 65 49 4f 45 72 72 20 3d  ( (sqliteIOErr =
8e30: 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c  = SQLITE_IOERR_L
8e40: 4f 43 4b 29 20 7c 7c 20 0a 20 20 20 20 20 20 20  OCK) || .       
8e50: 20 28 73 71 6c 69 74 65 49 4f 45 72 72 20 3d 3d   (sqliteIOErr ==
8e60: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e   SQLITE_IOERR_UN
8e70: 4c 4f 43 4b 29 20 7c 7c 20 0a 20 20 20 20 20 20  LOCK) || .      
8e80: 20 20 28 73 71 6c 69 74 65 49 4f 45 72 72 20 3d    (sqliteIOErr =
8e90: 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52  = SQLITE_IOERR_R
8ea0: 44 4c 4f 43 4b 29 20 7c 7c 0a 20 20 20 20 20 20  DLOCK) ||.      
8eb0: 20 20 28 73 71 6c 69 74 65 49 4f 45 72 72 20 3d    (sqliteIOErr =
8ec0: 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43  = SQLITE_IOERR_C
8ed0: 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b  HECKRESERVEDLOCK
8ee0: 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
8ef0: 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  n SQLITE_BUSY;. 
8f00: 20 20 20 7d 0a 20 20 20 20 2f 2a 20 65 6c 73 65     }.    /* else
8f10: 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 2a 2f   fall through */
8f20: 0a 20 20 63 61 73 65 20 45 50 45 52 4d 3a 20 0a  .  case EPERM: .
8f30: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
8f40: 45 5f 50 45 52 4d 3b 0a 20 20 20 20 0a 23 69 66  E_PERM;.    .#if
8f50: 20 45 4f 50 4e 4f 54 53 55 50 50 21 3d 45 4e 4f   EOPNOTSUPP!=ENO
8f60: 54 53 55 50 0a 20 20 63 61 73 65 20 45 4f 50 4e  TSUP.  case EOPN
8f70: 4f 54 53 55 50 50 3a 20 0a 20 20 20 20 2f 2a 20  OTSUPP: .    /* 
8f80: 73 6f 6d 65 74 68 69 6e 67 20 77 65 6e 74 20 74  something went t
8f90: 65 72 72 69 62 6c 79 20 61 77 72 79 2c 20 75 6e  erribly awry, un
8fa0: 6c 65 73 73 20 64 75 72 69 6e 67 20 66 69 6c 65  less during file
8fb0: 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20   system support 
8fc0: 0a 20 20 20 20 20 2a 20 69 6e 74 72 6f 73 70 65  .     * introspe
8fd0: 63 74 69 6f 6e 2c 20 69 6e 20 77 68 69 63 68 20  ction, in which 
8fe0: 69 74 20 61 63 74 75 61 6c 6c 79 20 6d 65 61 6e  it actually mean
8ff0: 73 20 77 68 61 74 20 69 74 20 73 61 79 73 20 2a  s what it says *
9000: 2f 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  /.#endif.#ifdef 
9010: 45 4e 4f 54 53 55 50 0a 20 20 63 61 73 65 20 45  ENOTSUP.  case E
9020: 4e 4f 54 53 55 50 3a 20 0a 20 20 20 20 2f 2a 20  NOTSUP: .    /* 
9030: 69 6e 76 61 6c 69 64 20 66 64 2c 20 75 6e 6c 65  invalid fd, unle
9040: 73 73 20 64 75 72 69 6e 67 20 66 69 6c 65 20 73  ss during file s
9050: 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20 69 6e  ystem support in
9060: 74 72 6f 73 70 65 63 74 69 6f 6e 2c 20 69 6e 20  trospection, in 
9070: 77 68 69 63 68 20 0a 20 20 20 20 20 2a 20 69 74  which .     * it
9080: 20 61 63 74 75 61 6c 6c 79 20 6d 65 61 6e 73 20   actually means 
9090: 77 68 61 74 20 69 74 20 73 61 79 73 20 2a 2f 0a  what it says */.
90a0: 23 65 6e 64 69 66 0a 20 20 63 61 73 65 20 45 49  #endif.  case EI
90b0: 4f 3a 0a 20 20 63 61 73 65 20 45 42 41 44 46 3a  O:.  case EBADF:
90c0: 0a 20 20 63 61 73 65 20 45 49 4e 56 41 4c 3a 0a  .  case EINVAL:.
90d0: 20 20 63 61 73 65 20 45 4e 4f 54 43 4f 4e 4e 3a    case ENOTCONN:
90e0: 0a 20 20 63 61 73 65 20 45 4e 4f 44 45 56 3a 0a  .  case ENODEV:.
90f0: 20 20 63 61 73 65 20 45 4e 58 49 4f 3a 0a 20 20    case ENXIO:.  
9100: 63 61 73 65 20 45 4e 4f 45 4e 54 3a 0a 23 69 66  case ENOENT:.#if
9110: 64 65 66 20 45 53 54 41 4c 45 20 20 20 20 20 20  def ESTALE      
9120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9130: 2a 20 45 53 54 41 4c 45 20 69 73 20 6e 6f 74 20  * ESTALE is not 
9140: 64 65 66 69 6e 65 64 20 6f 6e 20 49 6e 74 65 72  defined on Inter
9150: 69 78 20 73 79 73 74 65 6d 73 20 2a 2f 0a 20 20  ix systems */.  
9160: 63 61 73 65 20 45 53 54 41 4c 45 3a 0a 23 65 6e  case ESTALE:.#en
9170: 64 69 66 0a 20 20 63 61 73 65 20 45 4e 4f 53 59  dif.  case ENOSY
9180: 53 3a 0a 20 20 20 20 2f 2a 20 74 68 65 73 65 20  S:.    /* these 
9190: 73 68 6f 75 6c 64 20 66 6f 72 63 65 20 74 68 65  should force the
91a0: 20 63 6c 69 65 6e 74 20 74 6f 20 63 6c 6f 73 65   client to close
91b0: 20 74 68 65 20 66 69 6c 65 20 61 6e 64 20 72 65   the file and re
91c0: 63 6f 6e 6e 65 63 74 20 2a 2f 0a 20 20 20 20 0a  connect */.    .
91d0: 20 20 64 65 66 61 75 6c 74 3a 20 0a 20 20 20 20    default: .    
91e0: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 49 4f 45  return sqliteIOE
91f0: 72 72 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 2a 2a  rr;.  }.}.../***
9200: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9210: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9220: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9230: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9240: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
9250: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42  ************** B
9260: 65 67 69 6e 20 55 6e 69 71 75 65 20 46 69 6c 65  egin Unique File
9270: 20 49 44 20 55 74 69 6c 69 74 79 20 55 73 65 64   ID Utility Used
9280: 20 42 79 20 56 78 57 6f 72 6b 73 20 2a 2a 2a 2a   By VxWorks ****
9290: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a  ***********.**.*
92a0: 2a 20 4f 6e 20 6d 6f 73 74 20 76 65 72 73 69 6f  * On most versio
92b0: 6e 73 20 6f 66 20 75 6e 69 78 2c 20 77 65 20 63  ns of unix, we c
92c0: 61 6e 20 67 65 74 20 61 20 75 6e 69 71 75 65 20  an get a unique 
92d0: 49 44 20 66 6f 72 20 61 20 66 69 6c 65 20 62 79  ID for a file by
92e0: 20 63 6f 6e 63 61 74 65 6e 61 74 69 6e 67 0a 2a   concatenating.*
92f0: 2a 20 74 68 65 20 64 65 76 69 63 65 20 6e 75 6d  * the device num
9300: 62 65 72 20 61 6e 64 20 74 68 65 20 69 6e 6f 64  ber and the inod
9310: 65 20 6e 75 6d 62 65 72 2e 20 20 42 75 74 20 74  e number.  But t
9320: 68 69 73 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72  his does not wor
9330: 6b 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a  k on VxWorks..**
9340: 20 4f 6e 20 56 78 57 6f 72 6b 73 2c 20 61 20 75   On VxWorks, a u
9350: 6e 69 71 75 65 20 66 69 6c 65 20 69 64 20 6d 75  nique file id mu
9360: 73 74 20 62 65 20 62 61 73 65 64 20 6f 6e 20 74  st be based on t
9370: 68 65 20 63 61 6e 6f 6e 69 63 61 6c 20 66 69 6c  he canonical fil
9380: 65 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 70  ename..**.** A p
9390: 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e 73  ointer to an ins
93a0: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
93b0: 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
93c0: 20 63 61 6e 20 62 65 20 75 73 65 64 20 61 73 20   can be used as 
93d0: 61 0a 2a 2a 20 75 6e 69 71 75 65 20 66 69 6c 65  a.** unique file
93e0: 20 49 44 20 69 6e 20 56 78 57 6f 72 6b 73 2e 20   ID in VxWorks. 
93f0: 20 45 61 63 68 20 69 6e 73 74 61 6e 63 65 20 6f   Each instance o
9400: 66 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  f this structure
9410: 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 61 20 63   contains.** a c
9420: 6f 70 79 20 6f 66 20 74 68 65 20 63 61 6e 6f 6e  opy of the canon
9430: 69 63 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 20 20  ical filename.  
9440: 54 68 65 72 65 20 69 73 20 61 6c 73 6f 20 61 20  There is also a 
9450: 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 2e  reference count.
9460: 20 20 0a 2a 2a 20 54 68 65 20 73 74 72 75 63 74    .** The struct
9470: 75 72 65 20 69 73 20 72 65 63 6c 61 69 6d 65 64  ure is reclaimed
9480: 20 77 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72   when the number
9490: 20 6f 66 20 70 6f 69 6e 74 65 72 73 20 74 6f 20   of pointers to 
94a0: 69 74 20 64 72 6f 70 73 20 74 6f 0a 2a 2a 20 7a  it drops to.** z
94b0: 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65  ero..**.** There
94c0: 20 61 72 65 20 6e 65 76 65 72 20 76 65 72 79 20   are never very 
94d0: 6d 61 6e 79 20 66 69 6c 65 73 20 6f 70 65 6e 20  many files open 
94e0: 61 74 20 6f 6e 65 20 74 69 6d 65 20 61 6e 64 20  at one time and 
94f0: 6c 6f 6f 6b 75 70 73 20 61 72 65 20 6e 6f 74 0a  lookups are not.
9500: 2a 2a 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65  ** a performance
9510: 2d 63 72 69 74 69 63 61 6c 20 70 61 74 68 2c 20  -critical path, 
9520: 73 6f 20 69 74 20 69 73 20 73 75 66 66 69 63 69  so it is suffici
9530: 65 6e 74 20 74 6f 20 70 75 74 20 74 68 65 73 65  ent to put these
9540: 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 73 20 6f  .** structures o
9550: 6e 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74 2e  n a linked list.
9560: 0a 2a 2f 0a 73 74 72 75 63 74 20 76 78 77 6f 72  .*/.struct vxwor
9570: 6b 73 46 69 6c 65 49 64 20 7b 0a 20 20 73 74 72  ksFileId {.  str
9580: 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49  uct vxworksFileI
9590: 64 20 2a 70 4e 65 78 74 3b 20 20 2f 2a 20 4e 65  d *pNext;  /* Ne
95a0: 78 74 20 69 6e 20 61 20 6c 69 73 74 20 6f 66 20  xt in a list of 
95b0: 74 68 65 6d 20 61 6c 6c 20 2a 2f 0a 20 20 69 6e  them all */.  in
95c0: 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20  t nRef;         
95d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
95e0: 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e  umber of referen
95f0: 63 65 73 20 74 6f 20 74 68 69 73 20 6f 6e 65 20  ces to this one 
9600: 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 20  */.  int nName; 
9610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9620: 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20     /* Length of 
9630: 74 68 65 20 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61  the zCanonicalNa
9640: 6d 65 5b 5d 20 73 74 72 69 6e 67 20 2a 2f 0a 20  me[] string */. 
9650: 20 63 68 61 72 20 2a 7a 43 61 6e 6f 6e 69 63 61   char *zCanonica
9660: 6c 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 2f  lName;         /
9670: 2a 20 43 61 6e 6f 6e 69 63 61 6c 20 66 69 6c 65  * Canonical file
9680: 6e 61 6d 65 20 2a 2f 0a 7d 3b 0a 0a 23 69 66 20  name */.};..#if 
9690: 4f 53 5f 56 58 57 4f 52 4b 53 0a 2f 2a 20 0a 2a  OS_VXWORKS./* .*
96a0: 2a 20 41 6c 6c 20 75 6e 69 71 75 65 20 66 69 6c  * All unique fil
96b0: 65 6e 61 6d 65 73 20 61 72 65 20 68 65 6c 64 20  enames are held 
96c0: 6f 6e 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74  on a linked list
96d0: 20 68 65 61 64 65 64 20 62 79 20 74 68 69 73 0a   headed by this.
96e0: 2a 2a 20 76 61 72 69 61 62 6c 65 3a 0a 2a 2f 0a  ** variable:.*/.
96f0: 73 74 61 74 69 63 20 73 74 72 75 63 74 20 76 78  static struct vx
9700: 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 76 78 77  worksFileId *vxw
9710: 6f 72 6b 73 46 69 6c 65 4c 69 73 74 20 3d 20 30  orksFileList = 0
9720: 3b 0a 0a 2f 2a 0a 2a 2a 20 53 69 6d 70 6c 69 66  ;../*.** Simplif
9730: 79 20 61 20 66 69 6c 65 6e 61 6d 65 20 69 6e 74  y a filename int
9740: 6f 20 69 74 73 20 63 61 6e 6f 6e 69 63 61 6c 20  o its canonical 
9750: 66 6f 72 6d 0a 2a 2a 20 62 79 20 6d 61 6b 69 6e  form.** by makin
9760: 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  g the following 
9770: 63 68 61 6e 67 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  changes:.**.**  
9780: 2a 20 72 65 6d 6f 76 69 6e 67 20 61 6e 79 20 74  * removing any t
9790: 72 61 69 6c 69 6e 67 20 61 6e 64 20 64 75 70 6c  railing and dupl
97a0: 69 63 61 74 65 20 2f 0a 2a 2a 20 20 2a 20 63 6f  icate /.**  * co
97b0: 6e 76 65 72 74 20 2f 2e 2f 20 69 6e 74 6f 20 6a  nvert /./ into j
97c0: 75 73 74 20 2f 0a 2a 2a 20 20 2a 20 63 6f 6e 76  ust /.**  * conv
97d0: 65 72 74 20 2f 41 2f 2e 2e 2f 20 77 68 65 72 65  ert /A/../ where
97e0: 20 41 20 69 73 20 61 6e 79 20 73 69 6d 70 6c 65   A is any simple
97f0: 20 6e 61 6d 65 20 69 6e 74 6f 20 6a 75 73 74 20   name into just 
9800: 2f 0a 2a 2a 0a 2a 2a 20 43 68 61 6e 67 65 73 20  /.**.** Changes 
9810: 61 72 65 20 6d 61 64 65 20 69 6e 2d 70 6c 61 63  are made in-plac
9820: 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e  e.  Return the n
9830: 65 77 20 6e 61 6d 65 20 6c 65 6e 67 74 68 2e 0a  ew name length..
9840: 2a 2a 0a 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e  **.** The origin
9850: 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73 20 69  al filename is i
9860: 6e 20 7a 5b 30 2e 2e 6e 2d 31 5d 2e 20 20 52 65  n z[0..n-1].  Re
9870: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
9880: 6f 66 0a 2a 2a 20 63 68 61 72 61 63 74 65 72 73  of.** characters
9890: 20 69 6e 20 74 68 65 20 73 69 6d 70 6c 69 66 69   in the simplifi
98a0: 65 64 20 6e 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74  ed name..*/.stat
98b0: 69 63 20 69 6e 74 20 76 78 77 6f 72 6b 73 53 69  ic int vxworksSi
98c0: 6d 70 6c 69 66 79 4e 61 6d 65 28 63 68 61 72 20  mplifyName(char 
98d0: 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 69 6e  *z, int n){.  in
98e0: 74 20 69 2c 20 6a 3b 0a 20 20 77 68 69 6c 65 28  t i, j;.  while(
98f0: 20 6e 3e 31 20 26 26 20 7a 5b 6e 2d 31 5d 3d 3d   n>1 && z[n-1]==
9900: 27 2f 27 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20  '/' ){ n--; }.  
9910: 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e 3b 20  for(i=j=0; i<n; 
9920: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a 5b  i++){.    if( z[
9930: 69 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20  i]=='/' ){.     
9940: 20 69 66 28 20 7a 5b 69 2b 31 5d 3d 3d 27 2f 27   if( z[i+1]=='/'
9950: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
9960: 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3d 3d 27     if( z[i+1]=='
9970: 2e 27 20 26 26 20 69 2b 32 3c 6e 20 26 26 20 7a  .' && i+2<n && z
9980: 5b 69 2b 32 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20  [i+2]=='/' ){.  
9990: 20 20 20 20 20 20 69 20 2b 3d 20 31 3b 0a 20 20        i += 1;.  
99a0: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
99b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
99c0: 28 20 7a 5b 69 2b 31 5d 3d 3d 27 2e 27 20 26 26  ( z[i+1]=='.' &&
99d0: 20 69 2b 33 3c 6e 20 26 26 20 7a 5b 69 2b 32 5d   i+3<n && z[i+2]
99e0: 3d 3d 27 2e 27 20 26 26 20 7a 5b 69 2b 33 5d 3d  =='.' && z[i+3]=
99f0: 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='/' ){.        
9a00: 77 68 69 6c 65 28 20 6a 3e 30 20 26 26 20 7a 5b  while( j>0 && z[
9a10: 6a 2d 31 5d 21 3d 27 2f 27 20 29 7b 20 6a 2d 2d  j-1]!='/' ){ j--
9a20: 3b 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20  ; }.        if( 
9a30: 6a 3e 30 20 29 7b 20 6a 2d 2d 3b 20 7d 0a 20 20  j>0 ){ j--; }.  
9a40: 20 20 20 20 20 20 69 20 2b 3d 20 32 3b 0a 20 20        i += 2;.  
9a50: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
9a60: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
9a70: 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a 5b 69 5d 3b    z[j++] = z[i];
9a80: 0a 20 20 7d 0a 20 20 7a 5b 6a 5d 20 3d 20 30 3b  .  }.  z[j] = 0;
9a90: 0a 20 20 72 65 74 75 72 6e 20 6a 3b 0a 7d 0a 0a  .  return j;.}..
9aa0: 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61 20 75 6e 69  /*.** Find a uni
9ab0: 71 75 65 20 66 69 6c 65 20 49 44 20 66 6f 72 20  que file ID for 
9ac0: 74 68 65 20 67 69 76 65 6e 20 61 62 73 6f 6c 75  the given absolu
9ad0: 74 65 20 70 61 74 68 6e 61 6d 65 2e 20 20 52 65  te pathname.  Re
9ae0: 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65  turn.** a pointe
9af0: 72 20 74 6f 20 74 68 65 20 76 78 77 6f 72 6b 73  r to the vxworks
9b00: 46 69 6c 65 49 64 20 6f 62 6a 65 63 74 2e 20 20  FileId object.  
9b10: 54 68 69 73 20 70 6f 69 6e 74 65 72 20 69 73 20  This pointer is 
9b20: 74 68 65 20 75 6e 69 71 75 65 0a 2a 2a 20 66 69  the unique.** fi
9b30: 6c 65 20 49 44 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  le ID..**.** The
9b40: 20 6e 52 65 66 20 66 69 65 6c 64 20 6f 66 20 74   nRef field of t
9b50: 68 65 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64  he vxworksFileId
9b60: 20 6f 62 6a 65 63 74 20 69 73 20 69 6e 63 72 65   object is incre
9b70: 6d 65 6e 74 65 64 20 62 65 66 6f 72 65 0a 2a 2a  mented before.**
9b80: 20 74 68 65 20 6f 62 6a 65 63 74 20 69 73 20 72   the object is r
9b90: 65 74 75 72 6e 65 64 2e 20 20 41 20 6e 65 77 20  eturned.  A new 
9ba0: 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62  vxworksFileId ob
9bb0: 6a 65 63 74 20 69 73 20 63 72 65 61 74 65 64 0a  ject is created.
9bc0: 2a 2a 20 61 6e 64 20 61 64 64 65 64 20 74 6f 20  ** and added to 
9bd0: 74 68 65 20 67 6c 6f 62 61 6c 20 6c 69 73 74 20  the global list 
9be0: 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a  if necessary..**
9bf0: 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79 20  .** If a memory 
9c00: 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72  allocation error
9c10: 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20   occurs, return 
9c20: 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  NULL..*/.static 
9c30: 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69  struct vxworksFi
9c40: 6c 65 49 64 20 2a 76 78 77 6f 72 6b 73 46 69 6e  leId *vxworksFin
9c50: 64 46 69 6c 65 49 64 28 63 6f 6e 73 74 20 63 68  dFileId(const ch
9c60: 61 72 20 2a 7a 41 62 73 6f 6c 75 74 65 4e 61 6d  ar *zAbsoluteNam
9c70: 65 29 7b 0a 20 20 73 74 72 75 63 74 20 76 78 77  e){.  struct vxw
9c80: 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 4e 65 77  orksFileId *pNew
9c90: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 73 65 61  ;         /* sea
9ca0: 72 63 68 20 6b 65 79 20 61 6e 64 20 6e 65 77 20  rch key and new 
9cb0: 66 69 6c 65 20 49 44 20 2a 2f 0a 20 20 73 74 72  file ID */.  str
9cc0: 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49  uct vxworksFileI
9cd0: 64 20 2a 70 43 61 6e 64 69 64 61 74 65 3b 20 20  d *pCandidate;  
9ce0: 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
9cf0: 6f 76 65 72 20 65 78 69 73 74 69 6e 67 20 66 69  over existing fi
9d00: 6c 65 20 49 44 73 20 2a 2f 0a 20 20 69 6e 74 20  le IDs */.  int 
9d10: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
9d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d30: 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 7a 41 62  /* Length of zAb
9d40: 73 6f 6c 75 74 65 4e 61 6d 65 20 73 74 72 69 6e  soluteName strin
9d50: 67 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  g */..  assert( 
9d60: 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65 5b 30 5d  zAbsoluteName[0]
9d70: 3d 3d 27 2f 27 20 29 3b 0a 20 20 6e 20 3d 20 28  =='/' );.  n = (
9d80: 69 6e 74 29 73 74 72 6c 65 6e 28 7a 41 62 73 6f  int)strlen(zAbso
9d90: 6c 75 74 65 4e 61 6d 65 29 3b 0a 20 20 70 4e 65  luteName);.  pNe
9da0: 77 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  w = sqlite3_mall
9db0: 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77  oc( sizeof(*pNew
9dc0: 29 20 2b 20 28 6e 2b 31 29 20 29 3b 0a 20 20 69  ) + (n+1) );.  i
9dd0: 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74  f( pNew==0 ) ret
9de0: 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 7a  urn 0;.  pNew->z
9df0: 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 20 3d 20  CanonicalName = 
9e00: 28 63 68 61 72 2a 29 26 70 4e 65 77 5b 31 5d 3b  (char*)&pNew[1];
9e10: 0a 20 20 6d 65 6d 63 70 79 28 70 4e 65 77 2d 3e  .  memcpy(pNew->
9e20: 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20  zCanonicalName, 
9e30: 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65 2c 20 6e  zAbsoluteName, n
9e40: 2b 31 29 3b 0a 20 20 6e 20 3d 20 76 78 77 6f 72  +1);.  n = vxwor
9e50: 6b 73 53 69 6d 70 6c 69 66 79 4e 61 6d 65 28 70  ksSimplifyName(p
9e60: 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e  New->zCanonicalN
9e70: 61 6d 65 2c 20 6e 29 3b 0a 0a 20 20 2f 2a 20 53  ame, n);..  /* S
9e80: 65 61 72 63 68 20 66 6f 72 20 61 6e 20 65 78 69  earch for an exi
9e90: 73 74 69 6e 67 20 65 6e 74 72 79 20 74 68 61 74  sting entry that
9ea0: 20 6d 61 74 63 68 69 6e 67 20 74 68 65 20 63 61   matching the ca
9eb0: 6e 6f 6e 69 63 61 6c 20 6e 61 6d 65 2e 0a 20 20  nonical name..  
9ec0: 2a 2a 20 49 66 20 66 6f 75 6e 64 2c 20 69 6e 63  ** If found, inc
9ed0: 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72  rement the refer
9ee0: 65 6e 63 65 20 63 6f 75 6e 74 20 61 6e 64 20 72  ence count and r
9ef0: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
9f00: 74 6f 0a 20 20 2a 2a 20 74 68 65 20 65 78 69 73  to.  ** the exis
9f10: 74 69 6e 67 20 66 69 6c 65 20 49 44 2e 0a 20 20  ting file ID..  
9f20: 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75  */.  unixEnterMu
9f30: 74 65 78 28 29 3b 0a 20 20 66 6f 72 28 70 43 61  tex();.  for(pCa
9f40: 6e 64 69 64 61 74 65 3d 76 78 77 6f 72 6b 73 46  ndidate=vxworksF
9f50: 69 6c 65 4c 69 73 74 3b 20 70 43 61 6e 64 69 64  ileList; pCandid
9f60: 61 74 65 3b 20 70 43 61 6e 64 69 64 61 74 65 3d  ate; pCandidate=
9f70: 70 43 61 6e 64 69 64 61 74 65 2d 3e 70 4e 65 78  pCandidate->pNex
9f80: 74 29 7b 0a 20 20 20 20 69 66 28 20 70 43 61 6e  t){.    if( pCan
9f90: 64 69 64 61 74 65 2d 3e 6e 4e 61 6d 65 3d 3d 6e  didate->nName==n
9fa0: 20 0a 20 20 20 20 20 26 26 20 6d 65 6d 63 6d 70   .     && memcmp
9fb0: 28 70 43 61 6e 64 69 64 61 74 65 2d 3e 7a 43 61  (pCandidate->zCa
9fc0: 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20 70 4e 65  nonicalName, pNe
9fd0: 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d  w->zCanonicalNam
9fe0: 65 2c 20 6e 29 3d 3d 30 0a 20 20 20 20 29 7b 0a  e, n)==0.    ){.
9ff0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
a000: 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 20 20 20  ree(pNew);.     
a010: 20 20 70 43 61 6e 64 69 64 61 74 65 2d 3e 6e 52    pCandidate->nR
a020: 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20 75 6e 69  ef++;.       uni
a030: 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20  xLeaveMutex();. 
a040: 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 43 61        return pCa
a050: 6e 64 69 64 61 74 65 3b 0a 20 20 20 20 7d 0a 20  ndidate;.    }. 
a060: 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 20 6d 61 74 63   }..  /* No matc
a070: 68 20 77 61 73 20 66 6f 75 6e 64 2e 20 20 57 65  h was found.  We
a080: 20 77 69 6c 6c 20 6d 61 6b 65 20 61 20 6e 65 77   will make a new
a090: 20 66 69 6c 65 20 49 44 20 2a 2f 0a 20 20 70 4e   file ID */.  pN
a0a0: 65 77 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20  ew->nRef = 1;.  
a0b0: 70 4e 65 77 2d 3e 6e 4e 61 6d 65 20 3d 20 6e 3b  pNew->nName = n;
a0c0: 0a 20 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d  .  pNew->pNext =
a0d0: 20 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74   vxworksFileList
a0e0: 3b 0a 20 20 76 78 77 6f 72 6b 73 46 69 6c 65 4c  ;.  vxworksFileL
a0f0: 69 73 74 20 3d 20 70 4e 65 77 3b 0a 20 20 75 6e  ist = pNew;.  un
a100: 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
a110: 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d    return pNew;.}
a120: 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 72 65 6d 65 6e  ../*.** Decremen
a130: 74 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  t the reference 
a140: 63 6f 75 6e 74 20 6f 6e 20 61 20 76 78 77 6f 72  count on a vxwor
a150: 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65 63 74 2e  ksFileId object.
a160: 20 20 46 72 65 65 0a 2a 2a 20 74 68 65 20 6f 62    Free.** the ob
a170: 6a 65 63 74 20 77 68 65 6e 20 74 68 65 20 72 65  ject when the re
a180: 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 72 65  ference count re
a190: 61 63 68 65 73 20 7a 65 72 6f 2e 0a 2a 2f 0a 73  aches zero..*/.s
a1a0: 74 61 74 69 63 20 76 6f 69 64 20 76 78 77 6f 72  tatic void vxwor
a1b0: 6b 73 52 65 6c 65 61 73 65 46 69 6c 65 49 64 28  ksReleaseFileId(
a1c0: 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69  struct vxworksFi
a1d0: 6c 65 49 64 20 2a 70 49 64 29 7b 0a 20 20 75 6e  leId *pId){.  un
a1e0: 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
a1f0: 20 20 61 73 73 65 72 74 28 20 70 49 64 2d 3e 6e    assert( pId->n
a200: 52 65 66 3e 30 20 29 3b 0a 20 20 70 49 64 2d 3e  Ref>0 );.  pId->
a210: 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 49  nRef--;.  if( pI
a220: 64 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20  d->nRef==0 ){.  
a230: 20 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73    struct vxworks
a240: 46 69 6c 65 49 64 20 2a 2a 70 70 3b 0a 20 20 20  FileId **pp;.   
a250: 20 66 6f 72 28 70 70 3d 26 76 78 77 6f 72 6b 73   for(pp=&vxworks
a260: 46 69 6c 65 4c 69 73 74 3b 20 2a 70 70 20 26 26  FileList; *pp &&
a270: 20 2a 70 70 21 3d 70 49 64 3b 20 70 70 20 3d 20   *pp!=pId; pp = 
a280: 26 28 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29 29  &((*pp)->pNext))
a290: 7b 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a  {}.    assert( *
a2a0: 70 70 3d 3d 70 49 64 20 29 3b 0a 20 20 20 20 2a  pp==pId );.    *
a2b0: 70 70 20 3d 20 70 49 64 2d 3e 70 4e 65 78 74 3b  pp = pId->pNext;
a2c0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
a2d0: 65 28 70 49 64 29 3b 0a 20 20 7d 0a 20 20 75 6e  e(pId);.  }.  un
a2e0: 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
a2f0: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56  }.#endif /* OS_V
a300: 58 57 4f 52 4b 53 20 2a 2f 0a 2f 2a 2a 2a 2a 2a  XWORKS */./*****
a310: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f  ********** End o
a320: 66 20 55 6e 69 71 75 65 20 46 69 6c 65 20 49 44  f Unique File ID
a330: 20 55 74 69 6c 69 74 79 20 55 73 65 64 20 42 79   Utility Used By
a340: 20 56 78 57 6f 72 6b 73 20 2a 2a 2a 2a 2a 2a 2a   VxWorks *******
a350: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
a360: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a370: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a390: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a3a0: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a 2a 2a  ********/.../***
a3b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a3c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a3d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a3e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a3f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
a400: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a410: 2a 2a 2a 2a 2a 2a 2a 20 50 6f 73 69 78 20 41 64  ******* Posix Ad
a420: 76 69 73 6f 72 79 20 4c 6f 63 6b 69 6e 67 20 2a  visory Locking *
a430: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a440: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a  ***********.**.*
a450: 2a 20 50 4f 53 49 58 20 61 64 76 69 73 6f 72 79  * POSIX advisory
a460: 20 6c 6f 63 6b 73 20 61 72 65 20 62 72 6f 6b 65   locks are broke
a470: 6e 20 62 79 20 64 65 73 69 67 6e 2e 20 20 41 4e  n by design.  AN
a480: 53 49 20 53 54 44 20 31 30 30 33 2e 31 20 28 31  SI STD 1003.1 (1
a490: 39 39 36 29 0a 2a 2a 20 73 65 63 74 69 6f 6e 20  996).** section 
a4a0: 36 2e 35 2e 32 2e 32 20 6c 69 6e 65 73 20 34 38  6.5.2.2 lines 48
a4b0: 33 20 74 68 72 6f 75 67 68 20 34 39 30 20 73 70  3 through 490 sp
a4c0: 65 63 69 66 79 20 74 68 61 74 20 77 68 65 6e 20  ecify that when 
a4d0: 61 20 70 72 6f 63 65 73 73 0a 2a 2a 20 73 65 74  a process.** set
a4e0: 73 20 6f 72 20 63 6c 65 61 72 73 20 61 20 6c 6f  s or clears a lo
a4f0: 63 6b 2c 20 74 68 61 74 20 6f 70 65 72 61 74 69  ck, that operati
a500: 6f 6e 20 6f 76 65 72 72 69 64 65 73 20 61 6e 79  on overrides any
a510: 20 70 72 69 6f 72 20 6c 6f 63 6b 73 20 73 65 74   prior locks set
a520: 0a 2a 2a 20 62 79 20 74 68 65 20 73 61 6d 65 20  .** by the same 
a530: 70 72 6f 63 65 73 73 2e 20 20 49 74 20 64 6f 65  process.  It doe
a540: 73 20 6e 6f 74 20 65 78 70 6c 69 63 69 74 6c 79  s not explicitly
a550: 20 73 61 79 20 73 6f 2c 20 62 75 74 20 74 68 69   say so, but thi
a560: 73 20 69 6d 70 6c 69 65 73 0a 2a 2a 20 74 68 61  s implies.** tha
a570: 74 20 69 74 20 6f 76 65 72 72 69 64 65 73 20 6c  t it overrides l
a580: 6f 63 6b 73 20 73 65 74 20 62 79 20 74 68 65 20  ocks set by the 
a590: 73 61 6d 65 20 70 72 6f 63 65 73 73 20 75 73 69  same process usi
a5a0: 6e 67 20 61 20 64 69 66 66 65 72 65 6e 74 0a 2a  ng a different.*
a5b0: 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * file descripto
a5c0: 72 2e 20 20 43 6f 6e 73 69 64 65 72 20 74 68 69  r.  Consider thi
a5d0: 73 20 74 65 73 74 20 63 61 73 65 3a 0a 2a 2a 0a  s test case:.**.
a5e0: 2a 2a 20 20 20 20 20 20 20 69 6e 74 20 66 64 31  **       int fd1
a5f0: 20 3d 20 6f 70 65 6e 28 22 2e 2f 66 69 6c 65 31   = open("./file1
a600: 22 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41  ", O_RDWR|O_CREA
a610: 54 2c 20 30 36 34 34 29 3b 0a 2a 2a 20 20 20 20  T, 0644);.**    
a620: 20 20 20 69 6e 74 20 66 64 32 20 3d 20 6f 70 65     int fd2 = ope
a630: 6e 28 22 2e 2f 66 69 6c 65 32 22 2c 20 4f 5f 52  n("./file2", O_R
a640: 44 57 52 7c 4f 5f 43 52 45 41 54 2c 20 30 36 34  DWR|O_CREAT, 064
a650: 34 29 3b 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73  4);.**.** Suppos
a660: 65 20 2e 2f 66 69 6c 65 31 20 61 6e 64 20 2e 2f  e ./file1 and ./
a670: 66 69 6c 65 32 20 61 72 65 20 72 65 61 6c 6c 79  file2 are really
a680: 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 20 28   the same file (
a690: 62 65 63 61 75 73 65 0a 2a 2a 20 6f 6e 65 20 69  because.** one i
a6a0: 73 20 61 20 68 61 72 64 20 6f 72 20 73 79 6d 62  s a hard or symb
a6b0: 6f 6c 69 63 20 6c 69 6e 6b 20 74 6f 20 74 68 65  olic link to the
a6c0: 20 6f 74 68 65 72 29 20 74 68 65 6e 20 69 66 20   other) then if 
a6d0: 79 6f 75 20 73 65 74 0a 2a 2a 20 61 6e 20 65 78  you set.** an ex
a6e0: 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20  clusive lock on 
a6f0: 66 64 31 2c 20 74 68 65 6e 20 74 72 79 20 74 6f  fd1, then try to
a700: 20 67 65 74 20 61 6e 20 65 78 63 6c 75 73 69 76   get an exclusiv
a710: 65 20 6c 6f 63 6b 0a 2a 2a 20 6f 6e 20 66 64 32  e lock.** on fd2
a720: 2c 20 69 74 20 77 6f 72 6b 73 2e 20 20 49 20 77  , it works.  I w
a730: 6f 75 6c 64 20 68 61 76 65 20 65 78 70 65 63 74  ould have expect
a740: 65 64 20 74 68 65 20 73 65 63 6f 6e 64 20 6c 6f  ed the second lo
a750: 63 6b 20 74 6f 0a 2a 2a 20 66 61 69 6c 20 73 69  ck to.** fail si
a760: 6e 63 65 20 74 68 65 72 65 20 77 61 73 20 61 6c  nce there was al
a770: 72 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f 6e 20  ready a lock on 
a780: 74 68 65 20 66 69 6c 65 20 64 75 65 20 74 6f 20  the file due to 
a790: 66 64 31 2e 0a 2a 2a 20 42 75 74 20 6e 6f 74 20  fd1..** But not 
a7a0: 73 6f 2e 20 20 53 69 6e 63 65 20 62 6f 74 68 20  so.  Since both 
a7b0: 6c 6f 63 6b 73 20 63 61 6d 65 20 66 72 6f 6d 20  locks came from 
a7c0: 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73  the same process
a7d0: 2c 20 74 68 65 0a 2a 2a 20 73 65 63 6f 6e 64 20  , the.** second 
a7e0: 6f 76 65 72 72 69 64 65 73 20 74 68 65 20 66 69  overrides the fi
a7f0: 72 73 74 2c 20 65 76 65 6e 20 74 68 6f 75 67 68  rst, even though
a800: 20 74 68 65 79 20 77 65 72 65 20 6f 6e 20 64 69   they were on di
a810: 66 66 65 72 65 6e 74 0a 2a 2a 20 66 69 6c 65 20  fferent.** file 
a820: 64 65 73 63 72 69 70 74 6f 72 73 20 6f 70 65 6e  descriptors open
a830: 65 64 20 6f 6e 20 64 69 66 66 65 72 65 6e 74 20  ed on different 
a840: 66 69 6c 65 20 6e 61 6d 65 73 2e 0a 2a 2a 0a 2a  file names..**.*
a850: 2a 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61  * This means tha
a860: 74 20 77 65 20 63 61 6e 6e 6f 74 20 75 73 65 20  t we cannot use 
a870: 50 4f 53 49 58 20 6c 6f 63 6b 73 20 74 6f 20 73  POSIX locks to s
a880: 79 6e 63 68 72 6f 6e 69 7a 65 20 66 69 6c 65 20  ynchronize file 
a890: 61 63 63 65 73 73 0a 2a 2a 20 61 6d 6f 6e 67 20  access.** among 
a8a0: 63 6f 6d 70 65 74 69 6e 67 20 74 68 72 65 61 64  competing thread
a8b0: 73 20 6f 66 20 74 68 65 20 73 61 6d 65 20 70 72  s of the same pr
a8c0: 6f 63 65 73 73 2e 20 20 50 4f 53 49 58 20 6c 6f  ocess.  POSIX lo
a8d0: 63 6b 73 20 77 69 6c 6c 20 77 6f 72 6b 20 66 69  cks will work fi
a8e0: 6e 65 0a 2a 2a 20 74 6f 20 73 79 6e 63 68 72 6f  ne.** to synchro
a8f0: 6e 69 7a 65 20 61 63 63 65 73 73 20 66 6f 72 20  nize access for 
a900: 74 68 72 65 61 64 73 20 69 6e 20 73 65 70 61 72  threads in separ
a910: 61 74 65 20 70 72 6f 63 65 73 73 65 73 2c 20 62  ate processes, b
a920: 75 74 20 6e 6f 74 0a 2a 2a 20 74 68 72 65 61 64  ut not.** thread
a930: 73 20 77 69 74 68 69 6e 20 74 68 65 20 73 61 6d  s within the sam
a940: 65 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a  e process..**.**
a950: 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20   To work around 
a960: 74 68 65 20 70 72 6f 62 6c 65 6d 2c 20 53 51 4c  the problem, SQL
a970: 69 74 65 20 68 61 73 20 74 6f 20 6d 61 6e 61 67  ite has to manag
a980: 65 20 66 69 6c 65 20 6c 6f 63 6b 73 20 69 6e 74  e file locks int
a990: 65 72 6e 61 6c 6c 79 0a 2a 2a 20 6f 6e 20 69 74  ernally.** on it
a9a0: 73 20 6f 77 6e 2e 20 20 57 68 65 6e 65 76 65 72  s own.  Whenever
a9b0: 20 61 20 6e 65 77 20 64 61 74 61 62 61 73 65 20   a new database 
a9c0: 69 73 20 6f 70 65 6e 65 64 2c 20 77 65 20 68 61  is opened, we ha
a9d0: 76 65 20 74 6f 20 66 69 6e 64 20 74 68 65 0a 2a  ve to find the.*
a9e0: 2a 20 73 70 65 63 69 66 69 63 20 69 6e 6f 64 65  * specific inode
a9f0: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
aa00: 20 66 69 6c 65 20 28 74 68 65 20 69 6e 6f 64 65   file (the inode
aa10: 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62   is determined b
aa20: 79 20 74 68 65 0a 2a 2a 20 73 74 5f 64 65 76 20  y the.** st_dev 
aa30: 61 6e 64 20 73 74 5f 69 6e 6f 20 66 69 65 6c 64  and st_ino field
aa40: 73 20 6f 66 20 74 68 65 20 73 74 61 74 20 73 74  s of the stat st
aa50: 72 75 63 74 75 72 65 20 74 68 61 74 20 66 73 74  ructure that fst
aa60: 61 74 28 29 20 66 69 6c 6c 73 20 69 6e 29 0a 2a  at() fills in).*
aa70: 2a 20 61 6e 64 20 63 68 65 63 6b 20 66 6f 72 20  * and check for 
aa80: 6c 6f 63 6b 73 20 61 6c 72 65 61 64 79 20 65 78  locks already ex
aa90: 69 73 74 69 6e 67 20 6f 6e 20 74 68 61 74 20 69  isting on that i
aaa0: 6e 6f 64 65 2e 20 20 57 68 65 6e 20 6c 6f 63 6b  node.  When lock
aab0: 73 20 61 72 65 0a 2a 2a 20 63 72 65 61 74 65 64  s are.** created
aac0: 20 6f 72 20 72 65 6d 6f 76 65 64 2c 20 77 65 20   or removed, we 
aad0: 68 61 76 65 20 74 6f 20 6c 6f 6f 6b 20 61 74 20  have to look at 
aae0: 6f 75 72 20 6f 77 6e 20 69 6e 74 65 72 6e 61 6c  our own internal
aaf0: 20 72 65 63 6f 72 64 20 6f 66 20 74 68 65 0a 2a   record of the.*
ab00: 2a 20 6c 6f 63 6b 73 20 74 6f 20 73 65 65 20 69  * locks to see i
ab10: 66 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64  f another thread
ab20: 20 68 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20   has previously 
ab30: 73 65 74 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68  set a lock on th
ab40: 61 74 20 73 61 6d 65 0a 2a 2a 20 69 6e 6f 64 65  at same.** inode
ab50: 2e 0a 2a 2a 0a 2a 2a 20 28 41 73 69 64 65 3a 20  ..**.** (Aside: 
ab60: 54 68 65 20 75 73 65 20 6f 66 20 69 6e 6f 64 65  The use of inode
ab70: 20 6e 75 6d 62 65 72 73 20 61 73 20 75 6e 69 71   numbers as uniq
ab80: 75 65 20 49 44 73 20 64 6f 65 73 20 6e 6f 74 20  ue IDs does not 
ab90: 77 6f 72 6b 20 6f 6e 20 56 78 57 6f 72 6b 73 2e  work on VxWorks.
aba0: 0a 2a 2a 20 46 6f 72 20 56 78 57 6f 72 6b 73 2c  .** For VxWorks,
abb0: 20 77 65 20 68 61 76 65 20 74 6f 20 75 73 65 20   we have to use 
abc0: 74 68 65 20 61 6c 74 65 72 6e 61 74 69 76 65 20  the alternative 
abd0: 75 6e 69 71 75 65 20 49 44 20 73 79 73 74 65 6d  unique ID system
abe0: 20 62 61 73 65 64 20 6f 6e 0a 2a 2a 20 63 61 6e   based on.** can
abf0: 6f 6e 69 63 61 6c 20 66 69 6c 65 6e 61 6d 65 20  onical filename 
ac00: 61 6e 64 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20  and implemented 
ac10: 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  in the previous 
ac20: 64 69 76 69 73 69 6f 6e 2e 29 0a 2a 2a 0a 2a 2a  division.).**.**
ac30: 20 54 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c   The sqlite3_fil
ac40: 65 20 73 74 72 75 63 74 75 72 65 20 66 6f 72 20  e structure for 
ac50: 50 4f 53 49 58 20 69 73 20 6e 6f 20 6c 6f 6e 67  POSIX is no long
ac60: 65 72 20 6a 75 73 74 20 61 6e 20 69 6e 74 65 67  er just an integ
ac70: 65 72 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63 72  er file.** descr
ac80: 69 70 74 6f 72 2e 20 20 49 74 20 69 73 20 6e 6f  iptor.  It is no
ac90: 77 20 61 20 73 74 72 75 63 74 75 72 65 20 74 68  w a structure th
aca0: 61 74 20 68 6f 6c 64 73 20 74 68 65 20 69 6e 74  at holds the int
acb0: 65 67 65 72 20 66 69 6c 65 0a 2a 2a 20 64 65 73  eger file.** des
acc0: 63 72 69 70 74 6f 72 20 61 6e 64 20 61 20 70 6f  criptor and a po
acd0: 69 6e 74 65 72 20 74 6f 20 61 20 73 74 72 75 63  inter to a struc
ace0: 74 75 72 65 20 74 68 61 74 20 64 65 73 63 72 69  ture that descri
acf0: 62 65 73 20 74 68 65 20 69 6e 74 65 72 6e 61 6c  bes the internal
ad00: 0a 2a 2a 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 65  .** locks on the
ad10: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 69   corresponding i
ad20: 6e 6f 64 65 2e 20 20 54 68 65 72 65 20 69 73 20  node.  There is 
ad30: 6f 6e 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75  one locking stru
ad40: 63 74 75 72 65 0a 2a 2a 20 70 65 72 20 69 6e 6f  cture.** per ino
ad50: 64 65 2c 20 73 6f 20 69 66 20 74 68 65 20 73 61  de, so if the sa
ad60: 6d 65 20 69 6e 6f 64 65 20 69 73 20 6f 70 65 6e  me inode is open
ad70: 65 64 20 74 77 69 63 65 2c 20 62 6f 74 68 20 75  ed twice, both u
ad80: 6e 69 78 46 69 6c 65 20 73 74 72 75 63 74 75 72  nixFile structur
ad90: 65 73 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20 74  es.** point to t
ada0: 68 65 20 73 61 6d 65 20 6c 6f 63 6b 69 6e 67 20  he same locking 
adb0: 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65 20  structure.  The 
adc0: 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63 74 75 72  locking structur
add0: 65 20 6b 65 65 70 73 0a 2a 2a 20 61 20 72 65 66  e keeps.** a ref
ade0: 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 28 73 6f  erence count (so
adf0: 20 77 65 20 77 69 6c 6c 20 6b 6e 6f 77 20 77 68   we will know wh
ae00: 65 6e 20 74 6f 20 64 65 6c 65 74 65 20 69 74 29  en to delete it)
ae10: 20 61 6e 64 20 61 20 22 63 6e 74 22 0a 2a 2a 20   and a "cnt".** 
ae20: 66 69 65 6c 64 20 74 68 61 74 20 74 65 6c 6c 73  field that tells
ae30: 20 75 73 20 69 74 73 20 69 6e 74 65 72 6e 61 6c   us its internal
ae40: 20 6c 6f 63 6b 20 73 74 61 74 75 73 2e 20 20 63   lock status.  c
ae50: 6e 74 3d 3d 30 20 6d 65 61 6e 73 20 74 68 65 0a  nt==0 means the.
ae60: 2a 2a 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63  ** file is unloc
ae70: 6b 65 64 2e 20 20 63 6e 74 3d 3d 2d 31 20 6d 65  ked.  cnt==-1 me
ae80: 61 6e 73 20 74 68 65 20 66 69 6c 65 20 68 61 73  ans the file has
ae90: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
aea0: 63 6b 2e 0a 2a 2a 20 63 6e 74 3e 30 20 6d 65 61  ck..** cnt>0 mea
aeb0: 6e 73 20 74 68 65 72 65 20 61 72 65 20 63 6e 74  ns there are cnt
aec0: 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 6f 6e   shared locks on
aed0: 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a   the file..**.**
aee0: 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20   Any attempt to 
aef0: 6c 6f 63 6b 20 6f 72 20 75 6e 6c 6f 63 6b 20 61  lock or unlock a
af00: 20 66 69 6c 65 20 66 69 72 73 74 20 63 68 65 63   file first chec
af10: 6b 73 20 74 68 65 20 6c 6f 63 6b 69 6e 67 0a 2a  ks the locking.*
af20: 2a 20 73 74 72 75 63 74 75 72 65 2e 20 20 54 68  * structure.  Th
af30: 65 20 66 63 6e 74 6c 28 29 20 73 79 73 74 65 6d  e fcntl() system
af40: 20 63 61 6c 6c 20 69 73 20 6f 6e 6c 79 20 69 6e   call is only in
af50: 76 6f 6b 65 64 20 74 6f 20 73 65 74 20 61 20 0a  voked to set a .
af60: 2a 2a 20 50 4f 53 49 58 20 6c 6f 63 6b 20 69 66  ** POSIX lock if
af70: 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 6c 6f   the internal lo
af80: 63 6b 20 73 74 72 75 63 74 75 72 65 20 74 72 61  ck structure tra
af90: 6e 73 69 74 69 6f 6e 73 20 62 65 74 77 65 65 6e  nsitions between
afa0: 0a 2a 2a 20 61 20 6c 6f 63 6b 65 64 20 61 6e 64  .** a locked and
afb0: 20 61 6e 20 75 6e 6c 6f 63 6b 65 64 20 73 74 61   an unlocked sta
afc0: 74 65 2e 0a 2a 2a 0a 2a 2a 20 42 75 74 20 77 61  te..**.** But wa
afd0: 69 74 3a 20 20 74 68 65 72 65 20 61 72 65 20 79  it:  there are y
afe0: 65 74 20 6d 6f 72 65 20 70 72 6f 62 6c 65 6d 73  et more problems
aff0: 20 77 69 74 68 20 50 4f 53 49 58 20 61 64 76 69   with POSIX advi
b000: 73 6f 72 79 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a  sory locks..**.*
b010: 2a 20 49 66 20 79 6f 75 20 63 6c 6f 73 65 20 61  * If you close a
b020: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
b030: 20 74 68 61 74 20 70 6f 69 6e 74 73 20 74 6f 20   that points to 
b040: 61 20 66 69 6c 65 20 74 68 61 74 20 68 61 73 20  a file that has 
b050: 6c 6f 63 6b 73 2c 0a 2a 2a 20 61 6c 6c 20 6c 6f  locks,.** all lo
b060: 63 6b 73 20 6f 6e 20 74 68 61 74 20 66 69 6c 65  cks on that file
b070: 20 74 68 61 74 20 61 72 65 20 6f 77 6e 65 64 20   that are owned 
b080: 62 79 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  by the current p
b090: 72 6f 63 65 73 73 20 61 72 65 0a 2a 2a 20 72 65  rocess are.** re
b0a0: 6c 65 61 73 65 64 2e 20 20 54 6f 20 77 6f 72 6b  leased.  To work
b0b0: 20 61 72 6f 75 6e 64 20 74 68 69 73 20 70 72 6f   around this pro
b0c0: 62 6c 65 6d 2c 20 65 61 63 68 20 75 6e 69 78 49  blem, each unixI
b0d0: 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 0a  nodeInfo object.
b0e0: 2a 2a 20 6d 61 69 6e 74 61 69 6e 73 20 61 20 63  ** maintains a c
b0f0: 6f 75 6e 74 20 6f 66 20 74 68 65 20 6e 75 6d 62  ount of the numb
b100: 65 72 20 6f 66 20 70 65 6e 64 69 6e 67 20 6c 6f  er of pending lo
b110: 63 6b 73 20 6f 6e 20 74 68 61 20 69 6e 6f 64 65  cks on tha inode
b120: 2e 0a 2a 2a 20 57 68 65 6e 20 61 6e 20 61 74 74  ..** When an att
b130: 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20  empt is made to 
b140: 63 6c 6f 73 65 20 61 6e 20 75 6e 69 78 46 69 6c  close an unixFil
b150: 65 2c 20 69 66 20 74 68 65 72 65 20 61 72 65 0a  e, if there are.
b160: 2a 2a 20 6f 74 68 65 72 20 75 6e 69 78 46 69 6c  ** other unixFil
b170: 65 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73 61  e open on the sa
b180: 6d 65 20 69 6e 6f 64 65 20 74 68 61 74 20 61 72  me inode that ar
b190: 65 20 68 6f 6c 64 69 6e 67 20 6c 6f 63 6b 73 2c  e holding locks,
b1a0: 20 74 68 65 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20   the call.** to 
b1b0: 63 6c 6f 73 65 28 29 20 74 68 65 20 66 69 6c 65  close() the file
b1c0: 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 64   descriptor is d
b1d0: 65 66 65 72 72 65 64 20 75 6e 74 69 6c 20 61 6c  eferred until al
b1e0: 6c 20 6f 66 20 74 68 65 20 6c 6f 63 6b 73 20 63  l of the locks c
b1f0: 6c 65 61 72 2e 0a 2a 2a 20 54 68 65 20 75 6e 69  lear..** The uni
b200: 78 49 6e 6f 64 65 49 6e 66 6f 20 73 74 72 75 63  xInodeInfo struc
b210: 74 75 72 65 20 6b 65 65 70 73 20 61 20 6c 69 73  ture keeps a lis
b220: 74 20 6f 66 20 66 69 6c 65 20 64 65 73 63 72 69  t of file descri
b230: 70 74 6f 72 73 20 74 68 61 74 20 6e 65 65 64 20  ptors that need 
b240: 74 6f 0a 2a 2a 20 62 65 20 63 6c 6f 73 65 64 20  to.** be closed 
b250: 61 6e 64 20 74 68 61 74 20 6c 69 73 74 20 69 73  and that list is
b260: 20 77 61 6c 6b 65 64 20 28 61 6e 64 20 63 6c 65   walked (and cle
b270: 61 72 65 64 29 20 77 68 65 6e 20 74 68 65 20 6c  ared) when the l
b280: 61 73 74 20 6c 6f 63 6b 0a 2a 2a 20 63 6c 65 61  ast lock.** clea
b290: 72 73 2e 0a 2a 2a 0a 2a 2a 20 59 65 74 20 61 6e  rs..**.** Yet an
b2a0: 6f 74 68 65 72 20 70 72 6f 62 6c 65 6d 3a 20 20  other problem:  
b2b0: 4c 69 6e 75 78 54 68 72 65 61 64 73 20 64 6f 20  LinuxThreads do 
b2c0: 6e 6f 74 20 70 6c 61 79 20 77 65 6c 6c 20 77 69  not play well wi
b2d0: 74 68 20 70 6f 73 69 78 20 6c 6f 63 6b 73 2e 0a  th posix locks..
b2e0: 2a 2a 0a 2a 2a 20 4d 61 6e 79 20 6f 6c 64 65 72  **.** Many older
b2f0: 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 6c 69 6e   versions of lin
b300: 75 78 20 75 73 65 20 74 68 65 20 4c 69 6e 75 78  ux use the Linux
b310: 54 68 72 65 61 64 73 20 6c 69 62 72 61 72 79 20  Threads library 
b320: 77 68 69 63 68 20 69 73 0a 2a 2a 20 6e 6f 74 20  which is.** not 
b330: 70 6f 73 69 78 20 63 6f 6d 70 6c 69 61 6e 74 2e  posix compliant.
b340: 20 20 55 6e 64 65 72 20 4c 69 6e 75 78 54 68 72    Under LinuxThr
b350: 65 61 64 73 2c 20 61 20 6c 6f 63 6b 20 63 72 65  eads, a lock cre
b360: 61 74 65 64 20 62 79 20 74 68 72 65 61 64 0a 2a  ated by thread.*
b370: 2a 20 41 20 63 61 6e 6e 6f 74 20 62 65 20 6d 6f  * A cannot be mo
b380: 64 69 66 69 65 64 20 6f 72 20 6f 76 65 72 72 69  dified or overri
b390: 64 64 65 6e 20 62 79 20 61 20 64 69 66 66 65 72  dden by a differ
b3a0: 65 6e 74 20 74 68 72 65 61 64 20 42 2e 0a 2a 2a  ent thread B..**
b3b0: 20 4f 6e 6c 79 20 74 68 72 65 61 64 20 41 20 63   Only thread A c
b3c0: 61 6e 20 6d 6f 64 69 66 79 20 74 68 65 20 6c 6f  an modify the lo
b3d0: 63 6b 2e 20 20 4c 6f 63 6b 69 6e 67 20 62 65 68  ck.  Locking beh
b3e0: 61 76 69 6f 72 20 69 73 20 63 6f 72 72 65 63 74  avior is correct
b3f0: 0a 2a 2a 20 69 66 20 74 68 65 20 61 70 70 6c 69  .** if the appli
b400: 61 74 69 6f 6e 20 75 73 65 73 20 74 68 65 20 6e  ation uses the n
b410: 65 77 65 72 20 4e 61 74 69 76 65 20 50 6f 73 69  ewer Native Posi
b420: 78 20 54 68 72 65 61 64 20 4c 69 62 72 61 72 79  x Thread Library
b430: 20 28 4e 50 54 4c 29 0a 2a 2a 20 6f 6e 20 6c 69   (NPTL).** on li
b440: 6e 75 78 20 2d 20 77 69 74 68 20 4e 50 54 4c 20  nux - with NPTL 
b450: 61 20 6c 6f 63 6b 20 63 72 65 61 74 65 64 20 62  a lock created b
b460: 79 20 74 68 72 65 61 64 20 41 20 63 61 6e 20 6f  y thread A can o
b470: 76 65 72 72 69 64 65 20 6c 6f 63 6b 73 0a 2a 2a  verride locks.**
b480: 20 69 6e 20 74 68 72 65 61 64 20 42 2e 20 20 42   in thread B.  B
b490: 75 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77  ut there is no w
b4a0: 61 79 20 74 6f 20 6b 6e 6f 77 20 61 74 20 63 6f  ay to know at co
b4b0: 6d 70 69 6c 65 2d 74 69 6d 65 20 77 68 69 63 68  mpile-time which
b4c0: 0a 2a 2a 20 74 68 72 65 61 64 69 6e 67 20 6c 69  .** threading li
b4d0: 62 72 61 72 79 20 69 73 20 62 65 69 6e 67 20 75  brary is being u
b4e0: 73 65 64 2e 20 20 53 6f 20 74 68 65 72 65 20 69  sed.  So there i
b4f0: 73 20 6e 6f 20 77 61 79 20 74 6f 20 6b 6e 6f 77  s no way to know
b500: 20 61 74 0a 2a 2a 20 63 6f 6d 70 69 6c 65 2d 74   at.** compile-t
b510: 69 6d 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e  ime whether or n
b520: 6f 74 20 74 68 72 65 61 64 20 41 20 63 61 6e 20  ot thread A can 
b530: 6f 76 65 72 72 69 64 65 20 6c 6f 63 6b 73 20 6f  override locks o
b540: 6e 20 74 68 72 65 61 64 20 42 2e 0a 2a 2a 20 4f  n thread B..** O
b550: 6e 65 20 68 61 73 20 74 6f 20 64 6f 20 61 20 72  ne has to do a r
b560: 75 6e 2d 74 69 6d 65 20 63 68 65 63 6b 20 74 6f  un-time check to
b570: 20 64 69 73 63 6f 76 65 72 20 74 68 65 20 62 65   discover the be
b580: 68 61 76 69 6f 72 20 6f 66 20 74 68 65 0a 2a 2a  havior of the.**
b590: 20 63 75 72 72 65 6e 74 20 70 72 6f 63 65 73 73   current process
b5a0: 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 75  ..**.** SQLite u
b5b0: 73 65 64 20 74 6f 20 73 75 70 70 6f 72 74 20 4c  sed to support L
b5c0: 69 6e 75 78 54 68 72 65 61 64 73 2e 20 20 42 75  inuxThreads.  Bu
b5d0: 74 20 73 75 70 70 6f 72 74 20 66 6f 72 20 4c 69  t support for Li
b5e0: 6e 75 78 54 68 72 65 61 64 73 0a 2a 2a 20 77 61  nuxThreads.** wa
b5f0: 73 20 64 72 6f 70 70 65 64 20 62 65 67 69 6e 6e  s dropped beginn
b600: 69 6e 67 20 77 69 74 68 20 76 65 72 73 69 6f 6e  ing with version
b610: 20 33 2e 37 2e 30 2e 20 20 53 51 4c 69 74 65 20   3.7.0.  SQLite 
b620: 77 69 6c 6c 20 73 74 69 6c 6c 20 77 6f 72 6b 20  will still work 
b630: 77 69 74 68 0a 2a 2a 20 4c 69 6e 75 78 54 68 72  with.** LinuxThr
b640: 65 61 64 73 20 70 72 6f 76 69 64 65 64 20 74 68  eads provided th
b650: 61 74 20 28 31 29 20 74 68 65 72 65 20 69 73 20  at (1) there is 
b660: 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65  no more than one
b670: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20   connection .** 
b680: 70 65 72 20 64 61 74 61 62 61 73 65 20 66 69 6c  per database fil
b690: 65 20 69 6e 20 74 68 65 20 73 61 6d 65 20 70 72  e in the same pr
b6a0: 6f 63 65 73 73 20 61 6e 64 20 28 32 29 20 64 61  ocess and (2) da
b6b0: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
b6c0: 6e 73 0a 2a 2a 20 64 6f 20 6e 6f 74 20 6d 6f 76  ns.** do not mov
b6d0: 65 20 61 63 72 6f 73 73 20 74 68 72 65 61 64 73  e across threads
b6e0: 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69  ..*/../*.** An i
b6f0: 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66  nstance of the f
b700: 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75  ollowing structu
b710: 72 65 20 73 65 72 76 65 73 20 61 73 20 74 68 65  re serves as the
b720: 20 6b 65 79 20 75 73 65 64 0a 2a 2a 20 74 6f 20   key used.** to 
b730: 6c 6f 63 61 74 65 20 61 20 70 61 72 74 69 63 75  locate a particu
b740: 6c 61 72 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  lar unixInodeInf
b750: 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 72  o object..*/.str
b760: 75 63 74 20 75 6e 69 78 46 69 6c 65 49 64 20 7b  uct unixFileId {
b770: 0a 20 20 64 65 76 5f 74 20 64 65 76 3b 20 20 20  .  dev_t dev;   
b780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
b790: 2a 20 44 65 76 69 63 65 20 6e 75 6d 62 65 72 20  * Device number 
b7a0: 2a 2f 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b  */.#if OS_VXWORK
b7b0: 53 0a 20 20 73 74 72 75 63 74 20 76 78 77 6f 72  S.  struct vxwor
b7c0: 6b 73 46 69 6c 65 49 64 20 2a 70 49 64 3b 20 20  ksFileId *pId;  
b7d0: 2f 2a 20 55 6e 69 71 75 65 20 66 69 6c 65 20 49  /* Unique file I
b7e0: 44 20 66 6f 72 20 76 78 77 6f 72 6b 73 2e 20 2a  D for vxworks. *
b7f0: 2f 0a 23 65 6c 73 65 0a 20 20 69 6e 6f 5f 74 20  /.#else.  ino_t 
b800: 69 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20  ino;            
b810: 20 20 20 20 20 20 2f 2a 20 49 6e 6f 64 65 20 6e        /* Inode n
b820: 75 6d 62 65 72 20 2a 2f 0a 23 65 6e 64 69 66 0a  umber */.#endif.
b830: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73  };../*.** An ins
b840: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
b850: 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
b860: 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f   is allocated fo
b870: 72 20 65 61 63 68 20 6f 70 65 6e 0a 2a 2a 20 69  r each open.** i
b880: 6e 6f 64 65 2e 20 20 4f 72 2c 20 6f 6e 20 4c 69  node.  Or, on Li
b890: 6e 75 78 54 68 72 65 61 64 73 2c 20 74 68 65 72  nuxThreads, ther
b8a0: 65 20 69 73 20 6f 6e 65 20 6f 66 20 74 68 65 73  e is one of thes
b8b0: 65 20 73 74 72 75 63 74 75 72 65 73 20 66 6f 72  e structures for
b8c0: 0a 2a 2a 20 65 61 63 68 20 69 6e 6f 64 65 20 6f  .** each inode o
b8d0: 70 65 6e 65 64 20 62 79 20 65 61 63 68 20 74 68  pened by each th
b8e0: 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 41 20 73 69  read..**.** A si
b8f0: 6e 67 6c 65 20 69 6e 6f 64 65 20 63 61 6e 20 68  ngle inode can h
b900: 61 76 65 20 6d 75 6c 74 69 70 6c 65 20 66 69 6c  ave multiple fil
b910: 65 20 64 65 73 63 72 69 70 74 6f 72 73 2c 20 73  e descriptors, s
b920: 6f 20 65 61 63 68 20 75 6e 69 78 46 69 6c 65 0a  o each unixFile.
b930: 2a 2a 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e  ** structure con
b940: 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 20  tains a pointer 
b950: 74 6f 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f  to an instance o
b960: 66 20 74 68 69 73 20 6f 62 6a 65 63 74 20 61 6e  f this object an
b970: 64 20 74 68 69 73 0a 2a 2a 20 6f 62 6a 65 63 74  d this.** object
b980: 20 6b 65 65 70 73 20 61 20 63 6f 75 6e 74 20 6f   keeps a count o
b990: 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
b9a0: 75 6e 69 78 46 69 6c 65 20 70 6f 69 6e 74 69 6e  unixFile pointin
b9b0: 67 20 74 6f 20 69 74 2e 0a 2a 2f 0a 73 74 72 75  g to it..*/.stru
b9c0: 63 74 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  ct unixInodeInfo
b9d0: 20 7b 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78   {.  struct unix
b9e0: 46 69 6c 65 49 64 20 66 69 6c 65 49 64 3b 20 20  FileId fileId;  
b9f0: 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 6f 6b       /* The look
ba00: 75 70 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20  up key */.  int 
ba10: 6e 53 68 61 72 65 64 3b 20 20 20 20 20 20 20 20  nShared;        
ba20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
ba30: 75 6d 62 65 72 20 6f 66 20 53 48 41 52 45 44 20  umber of SHARED 
ba40: 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20  locks held */.  
ba50: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 65 46  unsigned char eF
ba60: 69 6c 65 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20  ileLock;        
ba70: 2f 2a 20 4f 6e 65 20 6f 66 20 53 48 41 52 45 44  /* One of SHARED
ba80: 5f 4c 4f 43 4b 2c 20 52 45 53 45 52 56 45 44 5f  _LOCK, RESERVED_
ba90: 4c 4f 43 4b 20 65 74 63 2e 20 2a 2f 0a 20 20 75  LOCK etc. */.  u
baa0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 62 50 72  nsigned char bPr
bab0: 6f 63 65 73 73 4c 6f 63 6b 3b 20 20 20 20 20 2f  ocessLock;     /
bac0: 2a 20 41 6e 20 65 78 63 6c 75 73 69 76 65 20 70  * An exclusive p
bad0: 72 6f 63 65 73 73 20 6c 6f 63 6b 20 69 73 20 68  rocess lock is h
bae0: 65 6c 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65  eld */.  int nRe
baf0: 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
bb00: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
bb10: 65 72 20 6f 66 20 70 6f 69 6e 74 65 72 73 20 74  er of pointers t
bb20: 6f 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  o this structure
bb30: 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64   */.  unixShmNod
bb40: 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20 20  e *pShmNode;    
bb50: 20 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64 20        /* Shared 
bb60: 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65  memory associate
bb70: 64 20 77 69 74 68 20 74 68 69 73 20 69 6e 6f 64  d with this inod
bb80: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f 63 6b  e */.  int nLock
bb90: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
bba0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
bbb0: 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   of outstanding 
bbc0: 66 69 6c 65 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20  file locks */.  
bbd0: 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70 55  UnixUnusedFd *pU
bbe0: 6e 75 73 65 64 3b 20 20 20 20 20 20 20 20 20 20  nused;          
bbf0: 2f 2a 20 55 6e 75 73 65 64 20 66 69 6c 65 20 64  /* Unused file d
bc00: 65 73 63 72 69 70 74 6f 72 73 20 74 6f 20 63 6c  escriptors to cl
bc10: 6f 73 65 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f  ose */.  unixIno
bc20: 64 65 49 6e 66 6f 20 2a 70 4e 65 78 74 3b 20 20  deInfo *pNext;  
bc30: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74           /* List
bc40: 20 6f 66 20 61 6c 6c 20 75 6e 69 78 49 6e 6f 64   of all unixInod
bc50: 65 49 6e 66 6f 20 6f 62 6a 65 63 74 73 20 2a 2f  eInfo objects */
bc60: 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  .  unixInodeInfo
bc70: 20 2a 70 50 72 65 76 3b 20 20 20 20 20 20 20 20   *pPrev;        
bc80: 20 20 20 2f 2a 20 20 20 20 2e 2e 2e 2e 20 64 6f     /*    .... do
bc90: 75 62 6c 79 20 6c 69 6e 6b 65 64 20 2a 2f 0a 23  ubly linked */.#
bca0: 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
bcb0: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20  _LOCKING_STYLE. 
bcc0: 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c   unsigned long l
bcd0: 6f 6e 67 20 73 68 61 72 65 64 42 79 74 65 3b 20  ong sharedByte; 
bce0: 20 2f 2a 20 66 6f 72 20 41 46 50 20 73 69 6d 75   /* for AFP simu
bcf0: 6c 61 74 65 64 20 73 68 61 72 65 64 20 6c 6f 63  lated shared loc
bd00: 6b 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20  k */.#endif.#if 
bd10: 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73 65 6d  OS_VXWORKS.  sem
bd20: 5f 74 20 2a 70 53 65 6d 3b 20 20 20 20 20 20 20  _t *pSem;       
bd30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
bd40: 4e 61 6d 65 64 20 50 4f 53 49 58 20 73 65 6d 61  Named POSIX sema
bd50: 70 68 6f 72 65 20 2a 2f 0a 20 20 63 68 61 72 20  phore */.  char 
bd60: 61 53 65 6d 4e 61 6d 65 5b 4d 41 58 5f 50 41 54  aSemName[MAX_PAT
bd70: 48 4e 41 4d 45 2b 32 5d 3b 20 20 2f 2a 20 4e 61  HNAME+2];  /* Na
bd80: 6d 65 20 6f 66 20 74 68 61 74 20 73 65 6d 61 70  me of that semap
bd90: 68 6f 72 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d  hore */.#endif.}
bda0: 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 73 74 73  ;../*.** A lists
bdb0: 20 6f 66 20 61 6c 6c 20 75 6e 69 78 49 6e 6f 64   of all unixInod
bdc0: 65 49 6e 66 6f 20 6f 62 6a 65 63 74 73 2e 0a 2a  eInfo objects..*
bdd0: 2f 0a 73 74 61 74 69 63 20 75 6e 69 78 49 6e 6f  /.static unixIno
bde0: 64 65 49 6e 66 6f 20 2a 69 6e 6f 64 65 4c 69 73  deInfo *inodeLis
bdf0: 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 0a 2a 2a  t = 0;../*.**.**
be00: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 2d   This function -
be10: 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 5f 78 28   unixLogError_x(
be20: 29 2c 20 69 73 20 6f 6e 6c 79 20 65 76 65 72 20  ), is only ever 
be30: 63 61 6c 6c 65 64 20 76 69 61 20 74 68 65 20 6d  called via the m
be40: 61 63 72 6f 0a 2a 2a 20 75 6e 69 78 4c 6f 67 45  acro.** unixLogE
be50: 72 72 6f 72 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 74  rror()..**.** It
be60: 20 69 73 20 69 6e 76 6f 6b 65 64 20 61 66 74 65   is invoked afte
be70: 72 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  r an error occur
be80: 73 20 69 6e 20 61 6e 20 4f 53 20 66 75 6e 63 74  s in an OS funct
be90: 69 6f 6e 20 61 6e 64 20 65 72 72 6e 6f 20 68 61  ion and errno ha
bea0: 73 20 62 65 65 6e 0a 2a 2a 20 73 65 74 2e 20 49  s been.** set. I
beb0: 74 20 6c 6f 67 73 20 61 20 6d 65 73 73 61 67 65  t logs a message
bec0: 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 6c   using sqlite3_l
bed0: 6f 67 28 29 20 63 6f 6e 74 61 69 6e 69 6e 67 20  og() containing 
bee0: 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75  the current valu
bef0: 65 20 6f 66 0a 2a 2a 20 65 72 72 6e 6f 20 61 6e  e of.** errno an
bf00: 64 2c 20 69 66 20 70 6f 73 73 69 62 6c 65 2c 20  d, if possible, 
bf10: 74 68 65 20 68 75 6d 61 6e 2d 72 65 61 64 61 62  the human-readab
bf20: 6c 65 20 65 71 75 69 76 61 6c 65 6e 74 20 66 72  le equivalent fr
bf30: 6f 6d 20 73 74 72 65 72 72 6f 72 28 29 20 6f 72  om strerror() or
bf40: 0a 2a 2a 20 73 74 72 65 72 72 6f 72 5f 72 28 29  .** strerror_r()
bf50: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73  ..**.** The firs
bf60: 74 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65  t argument passe
bf70: 64 20 74 6f 20 74 68 65 20 6d 61 63 72 6f 20 73  d to the macro s
bf80: 68 6f 75 6c 64 20 62 65 20 74 68 65 20 65 72 72  hould be the err
bf90: 6f 72 20 63 6f 64 65 20 74 68 61 74 0a 2a 2a 20  or code that.** 
bfa0: 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64  will be returned
bfb0: 20 74 6f 20 53 51 4c 69 74 65 20 28 65 2e 67 2e   to SQLite (e.g.
bfc0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45   SQLITE_IOERR_DE
bfd0: 4c 45 54 45 2c 20 53 51 4c 49 54 45 5f 43 41 4e  LETE, SQLITE_CAN
bfe0: 54 4f 50 45 4e 29 2e 20 0a 2a 2a 20 54 68 65 20  TOPEN). .** The 
bff0: 74 77 6f 20 73 75 62 73 65 71 75 65 6e 74 20 61  two subsequent a
c000: 72 67 75 6d 65 6e 74 73 20 73 68 6f 75 6c 64 20  rguments should 
c010: 62 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  be the name of t
c020: 68 65 20 4f 53 20 66 75 6e 63 74 69 6f 6e 20 74  he OS function t
c030: 68 61 74 0a 2a 2a 20 66 61 69 6c 65 64 20 28 65  hat.** failed (e
c040: 2e 67 2e 20 22 75 6e 6c 69 6e 6b 22 2c 20 22 6f  .g. "unlink", "o
c050: 70 65 6e 22 29 20 61 6e 64 20 74 68 65 20 61 73  pen") and the as
c060: 73 6f 63 69 61 74 65 64 20 66 69 6c 65 2d 73 79  sociated file-sy
c070: 73 74 65 6d 20 70 61 74 68 2c 0a 2a 2a 20 69 66  stem path,.** if
c080: 20 61 6e 79 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65   any..*/.#define
c090: 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 61 2c   unixLogError(a,
c0a0: 62 2c 63 29 20 20 20 20 20 75 6e 69 78 4c 6f 67  b,c)     unixLog
c0b0: 45 72 72 6f 72 41 74 4c 69 6e 65 28 61 2c 62 2c  ErrorAtLine(a,b,
c0c0: 63 2c 5f 5f 4c 49 4e 45 5f 5f 29 0a 73 74 61 74  c,__LINE__).stat
c0d0: 69 63 20 69 6e 74 20 75 6e 69 78 4c 6f 67 45 72  ic int unixLogEr
c0e0: 72 6f 72 41 74 4c 69 6e 65 28 0a 20 20 69 6e 74  rorAtLine(.  int
c0f0: 20 65 72 72 63 6f 64 65 2c 20 20 20 20 20 20 20   errcode,       
c100: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c110: 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
c120: 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
c130: 72 20 2a 7a 46 75 6e 63 2c 20 20 20 20 20 20 20  r *zFunc,       
c140: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
c150: 66 20 4f 53 20 66 75 6e 63 74 69 6f 6e 20 74 68  f OS function th
c160: 61 74 20 66 61 69 6c 65 64 20 2a 2f 0a 20 20 63  at failed */.  c
c170: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68  onst char *zPath
c180: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
c190: 2a 20 46 69 6c 65 20 70 61 74 68 20 61 73 73 6f  * File path asso
c1a0: 63 69 61 74 65 64 20 77 69 74 68 20 65 72 72 6f  ciated with erro
c1b0: 72 20 2a 2f 0a 20 20 69 6e 74 20 69 4c 69 6e 65  r */.  int iLine
c1c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c1d0: 20 20 20 20 20 20 20 2f 2a 20 53 6f 75 72 63 65         /* Source
c1e0: 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 77 68 65   line number whe
c1f0: 72 65 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65  re error occurre
c200: 64 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a  d */.){.  char *
c210: 7a 45 72 72 3b 20 20 20 20 20 20 20 20 20 20 20  zErr;           
c220: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 73            /* Mes
c230: 73 61 67 65 20 66 72 6f 6d 20 73 74 72 65 72 72  sage from strerr
c240: 6f 72 28 29 20 6f 72 20 65 71 75 69 76 61 6c 65  or() or equivale
c250: 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 45 72 72  nt */.  int iErr
c260: 6e 6f 20 3d 20 65 72 72 6e 6f 3b 20 20 20 20 20  no = errno;     
c270: 20 20 20 20 20 20 20 20 2f 2a 20 53 61 76 65 64          /* Saved
c280: 20 73 79 73 63 61 6c 6c 20 65 72 72 6f 72 20 6e   syscall error n
c290: 75 6d 62 65 72 20 2a 2f 0a 0a 20 20 2f 2a 20 49  umber */..  /* I
c2a0: 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61 20  f this is not a 
c2b0: 74 68 72 65 61 64 73 61 66 65 20 62 75 69 6c 64  threadsafe build
c2c0: 20 28 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53   (SQLITE_THREADS
c2d0: 41 46 45 3d 3d 30 29 2c 20 74 68 65 6e 20 75 73  AFE==0), then us
c2e0: 65 0a 20 20 2a 2a 20 74 68 65 20 73 74 72 65 72  e.  ** the strer
c2f0: 72 6f 72 28 29 20 66 75 6e 63 74 69 6f 6e 20 74  ror() function t
c300: 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 68 75 6d  o obtain the hum
c310: 61 6e 2d 72 65 61 64 61 62 6c 65 20 65 72 72 6f  an-readable erro
c320: 72 20 6d 65 73 73 61 67 65 0a 20 20 2a 2a 20 65  r message.  ** e
c330: 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 65 72 72  quivalent to err
c340: 6e 6f 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 75  no. Otherwise, u
c350: 73 65 20 73 74 72 65 72 72 6f 72 5f 72 28 29 2e  se strerror_r().
c360: 0a 20 20 2a 2f 20 0a 23 69 66 20 53 51 4c 49 54  .  */ .#if SQLIT
c370: 45 5f 54 48 52 45 41 44 53 41 46 45 20 26 26 20  E_THREADSAFE && 
c380: 64 65 66 69 6e 65 64 28 48 41 56 45 5f 53 54 52  defined(HAVE_STR
c390: 45 52 52 4f 52 5f 52 29 0a 20 20 63 68 61 72 20  ERROR_R).  char 
c3a0: 61 45 72 72 5b 38 30 5d 3b 0a 20 20 6d 65 6d 73  aErr[80];.  mems
c3b0: 65 74 28 61 45 72 72 2c 20 30 2c 20 73 69 7a 65  et(aErr, 0, size
c3c0: 6f 66 28 61 45 72 72 29 29 3b 0a 20 20 7a 45 72  of(aErr));.  zEr
c3d0: 72 20 3d 20 61 45 72 72 3b 0a 0a 20 20 2f 2a 20  r = aErr;..  /* 
c3e0: 49 66 20 53 54 52 45 52 52 4f 52 5f 52 5f 43 48  If STRERROR_R_CH
c3f0: 41 52 5f 50 20 28 73 65 74 20 62 79 20 61 75 74  AR_P (set by aut
c400: 6f 63 6f 6e 66 20 73 63 72 69 70 74 73 29 20 6f  oconf scripts) o
c410: 72 20 5f 5f 55 53 45 5f 47 4e 55 20 69 73 20 64  r __USE_GNU is d
c420: 65 66 69 6e 65 64 2c 0a 20 20 2a 2a 20 61 73 73  efined,.  ** ass
c430: 75 6d 65 20 74 68 61 74 20 74 68 65 20 73 79 73  ume that the sys
c440: 74 65 6d 20 70 72 6f 76 69 64 65 73 20 74 68 65  tem provides the
c450: 20 47 4e 55 20 76 65 72 73 69 6f 6e 20 6f 66 20   GNU version of 
c460: 73 74 72 65 72 72 6f 72 5f 72 28 29 20 74 68 61  strerror_r() tha
c470: 74 0a 20 20 2a 2a 20 72 65 74 75 72 6e 73 20 61  t.  ** returns a
c480: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 62 75   pointer to a bu
c490: 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
c4a0: 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67  the error messag
c4b0: 65 2e 20 54 68 61 74 20 70 6f 69 6e 74 65 72 20  e. That pointer 
c4c0: 0a 20 20 2a 2a 20 6d 61 79 20 70 6f 69 6e 74 20  .  ** may point 
c4d0: 74 6f 20 61 45 72 72 5b 5d 2c 20 6f 72 20 69 74  to aErr[], or it
c4e0: 20 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20 73 6f   may point to so
c4f0: 6d 65 20 73 74 61 74 69 63 20 73 74 6f 72 61 67  me static storag
c500: 65 20 73 6f 6d 65 77 68 65 72 65 2e 20 0a 20 20  e somewhere. .  
c510: 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61 73  ** Otherwise, as
c520: 73 75 6d 65 20 74 68 61 74 20 74 68 65 20 73 79  sume that the sy
c530: 73 74 65 6d 20 70 72 6f 76 69 64 65 73 20 74 68  stem provides th
c540: 65 20 50 4f 53 49 58 20 76 65 72 73 69 6f 6e 20  e POSIX version 
c550: 6f 66 20 0a 20 20 2a 2a 20 73 74 72 65 72 72 6f  of .  ** strerro
c560: 72 5f 72 28 29 2c 20 77 68 69 63 68 20 61 6c 77  r_r(), which alw
c570: 61 79 73 20 77 72 69 74 65 73 20 61 6e 20 65 72  ays writes an er
c580: 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 74 6f  ror message into
c590: 20 61 45 72 72 5b 5d 2e 0a 20 20 2a 2a 0a 20 20   aErr[]..  **.  
c5a0: 2a 2a 20 49 66 20 74 68 65 20 63 6f 64 65 20 69  ** If the code i
c5b0: 6e 63 6f 72 72 65 63 74 6c 79 20 61 73 73 75 6d  ncorrectly assum
c5c0: 65 73 20 74 68 61 74 20 69 74 20 69 73 20 74 68  es that it is th
c5d0: 65 20 50 4f 53 49 58 20 76 65 72 73 69 6f 6e 20  e POSIX version 
c5e0: 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 61 76 61  that is.  ** ava
c5f0: 69 6c 61 62 6c 65 2c 20 74 68 65 20 65 72 72 6f  ilable, the erro
c600: 72 20 6d 65 73 73 61 67 65 20 77 69 6c 6c 20 6f  r message will o
c610: 66 74 65 6e 20 62 65 20 61 6e 20 65 6d 70 74 79  ften be an empty
c620: 20 73 74 72 69 6e 67 2e 20 4e 6f 74 20 61 0a 20   string. Not a. 
c630: 20 2a 2a 20 68 75 67 65 20 70 72 6f 62 6c 65 6d   ** huge problem
c640: 2e 20 49 6e 63 6f 72 72 65 63 74 6c 79 20 63 6f  . Incorrectly co
c650: 6e 63 6c 75 64 69 6e 67 20 74 68 61 74 20 74 68  ncluding that th
c660: 65 20 47 4e 55 20 76 65 72 73 69 6f 6e 20 69 73  e GNU version is
c670: 20 61 76 61 69 6c 61 62 6c 65 20 0a 20 20 2a 2a   available .  **
c680: 20 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20 61   could lead to a
c690: 20 73 65 67 66 61 75 6c 74 20 74 68 6f 75 67 68   segfault though
c6a0: 2e 0a 20 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e  ..  */.#if defin
c6b0: 65 64 28 53 54 52 45 52 52 4f 52 5f 52 5f 43 48  ed(STRERROR_R_CH
c6c0: 41 52 5f 50 29 20 7c 7c 20 64 65 66 69 6e 65 64  AR_P) || defined
c6d0: 28 5f 5f 55 53 45 5f 47 4e 55 29 0a 20 20 7a 45  (__USE_GNU).  zE
c6e0: 72 72 20 3d 20 0a 23 20 65 6e 64 69 66 0a 20 20  rr = .# endif.  
c6f0: 73 74 72 65 72 72 6f 72 5f 72 28 69 45 72 72 6e  strerror_r(iErrn
c700: 6f 2c 20 61 45 72 72 2c 20 73 69 7a 65 6f 66 28  o, aErr, sizeof(
c710: 61 45 72 72 29 2d 31 29 3b 0a 0a 23 65 6c 69 66  aErr)-1);..#elif
c720: 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
c730: 46 45 0a 20 20 2f 2a 20 54 68 69 73 20 69 73 20  FE.  /* This is 
c740: 61 20 74 68 72 65 61 64 73 61 66 65 20 62 75 69  a threadsafe bui
c750: 6c 64 2c 20 62 75 74 20 73 74 72 65 72 72 6f 72  ld, but strerror
c760: 5f 72 28 29 20 69 73 20 6e 6f 74 20 61 76 61 69  _r() is not avai
c770: 6c 61 62 6c 65 2e 20 2a 2f 0a 20 20 7a 45 72 72  lable. */.  zErr
c780: 20 3d 20 22 22 3b 0a 23 65 6c 73 65 0a 20 20 2f   = "";.#else.  /
c790: 2a 20 4e 6f 6e 2d 74 68 72 65 61 64 73 61 66 65  * Non-threadsafe
c7a0: 20 62 75 69 6c 64 2c 20 75 73 65 20 73 74 72 65   build, use stre
c7b0: 72 72 6f 72 28 29 2e 20 2a 2f 0a 20 20 7a 45 72  rror(). */.  zEr
c7c0: 72 20 3d 20 73 74 72 65 72 72 6f 72 28 69 45 72  r = strerror(iEr
c7d0: 72 6e 6f 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  rno);.#endif..  
c7e0: 69 66 28 20 7a 50 61 74 68 3d 3d 30 20 29 20 7a  if( zPath==0 ) z
c7f0: 50 61 74 68 20 3d 20 22 22 3b 0a 20 20 73 71 6c  Path = "";.  sql
c800: 69 74 65 33 5f 6c 6f 67 28 65 72 72 63 6f 64 65  ite3_log(errcode
c810: 2c 0a 20 20 20 20 20 20 22 6f 73 5f 75 6e 69 78  ,.      "os_unix
c820: 2e 63 3a 25 64 3a 20 28 25 64 29 20 25 73 28 25  .c:%d: (%d) %s(%
c830: 73 29 20 2d 20 25 73 22 2c 0a 20 20 20 20 20 20  s) - %s",.      
c840: 69 4c 69 6e 65 2c 20 69 45 72 72 6e 6f 2c 20 7a  iLine, iErrno, z
c850: 46 75 6e 63 2c 20 7a 50 61 74 68 2c 20 7a 45 72  Func, zPath, zEr
c860: 72 0a 20 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e  r.  );..  return
c870: 20 65 72 72 63 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a   errcode;.}../*.
c880: 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 20  ** Close a file 
c890: 64 65 73 63 72 69 70 74 6f 72 2e 0a 2a 2a 0a 2a  descriptor..**.*
c8a0: 2a 20 57 65 20 61 73 73 75 6d 65 20 74 68 61 74  * We assume that
c8b0: 20 63 6c 6f 73 65 28 29 20 61 6c 6d 6f 73 74 20   close() almost 
c8c0: 61 6c 77 61 79 73 20 77 6f 72 6b 73 2c 20 73 69  always works, si
c8d0: 6e 63 65 20 69 74 20 69 73 20 6f 6e 6c 79 20 69  nce it is only i
c8e0: 6e 20 61 0a 2a 2a 20 76 65 72 79 20 73 69 63 6b  n a.** very sick
c8f0: 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 6f 72 20   application or 
c900: 6f 6e 20 61 20 76 65 72 79 20 73 69 63 6b 20 70  on a very sick p
c910: 6c 61 74 66 6f 72 6d 20 74 68 61 74 20 69 74 20  latform that it 
c920: 6d 69 67 68 74 20 66 61 69 6c 2e 0a 2a 2a 20 49  might fail..** I
c930: 66 20 69 74 20 64 6f 65 73 20 66 61 69 6c 2c 20  f it does fail, 
c940: 73 69 6d 70 6c 79 20 6c 65 61 6b 20 74 68 65 20  simply leak the 
c950: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2c  file descriptor,
c960: 20 62 75 74 20 64 6f 20 6c 6f 67 20 74 68 65 0a   but do log the.
c970: 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20  ** error..**.** 
c980: 4e 6f 74 65 20 74 68 61 74 20 69 74 20 69 73 20  Note that it is 
c990: 6e 6f 74 20 73 61 66 65 20 74 6f 20 72 65 74 72  not safe to retr
c9a0: 79 20 63 6c 6f 73 65 28 29 20 61 66 74 65 72 20  y close() after 
c9b0: 45 49 4e 54 52 20 73 69 6e 63 65 20 74 68 65 0a  EINTR since the.
c9c0: 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ** file descript
c9d0: 6f 72 20 6d 69 67 68 74 20 68 61 76 65 20 61 6c  or might have al
c9e0: 72 65 61 64 79 20 62 65 65 6e 20 72 65 75 73 65  ready been reuse
c9f0: 64 20 62 79 20 61 6e 6f 74 68 65 72 20 74 68 72  d by another thr
ca00: 65 61 64 2e 0a 2a 2a 20 53 6f 20 77 65 20 64 6f  ead..** So we do
ca10: 6e 27 74 20 65 76 65 6e 20 74 72 79 20 74 6f 20  n't even try to 
ca20: 72 65 63 6f 76 65 72 20 66 72 6f 6d 20 61 6e 20  recover from an 
ca30: 45 49 4e 54 52 2e 20 20 4a 75 73 74 20 6c 6f 67  EINTR.  Just log
ca40: 20 74 68 65 20 65 72 72 6f 72 0a 2a 2a 20 61 6e   the error.** an
ca50: 64 20 6d 6f 76 65 20 6f 6e 2e 0a 2a 2f 0a 73 74  d move on..*/.st
ca60: 61 74 69 63 20 76 6f 69 64 20 72 6f 62 75 73 74  atic void robust
ca70: 5f 63 6c 6f 73 65 28 75 6e 69 78 46 69 6c 65 20  _close(unixFile 
ca80: 2a 70 46 69 6c 65 2c 20 69 6e 74 20 68 2c 20 69  *pFile, int h, i
ca90: 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 69 66  nt lineno){.  if
caa0: 28 20 6f 73 43 6c 6f 73 65 28 68 29 20 29 7b 0a  ( osClose(h) ){.
cab0: 20 20 20 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72      unixLogError
cac0: 41 74 4c 69 6e 65 28 53 51 4c 49 54 45 5f 49 4f  AtLine(SQLITE_IO
cad0: 45 52 52 5f 43 4c 4f 53 45 2c 20 22 63 6c 6f 73  ERR_CLOSE, "clos
cae0: 65 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  e",.            
caf0: 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65             pFile
cb00: 20 3f 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 20   ? pFile->zPath 
cb10: 3a 20 30 2c 20 6c 69 6e 65 6e 6f 29 3b 0a 20 20  : 0, lineno);.  
cb20: 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  }.}..static void
cb30: 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28   storeLastErrno(
cb40: 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c  unixFile *pFile,
cb50: 20 69 6e 74 20 65 72 72 6f 72 29 7b 0a 20 20 70   int error){.  p
cb60: 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
cb70: 3d 20 65 72 72 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  = error;.}../*.*
cb80: 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 66 69 6c 65  * Close all file
cb90: 20 64 65 73 63 72 69 70 74 6f 72 73 20 61 63 63   descriptors acc
cba0: 75 6d 75 61 74 65 64 20 69 6e 20 74 68 65 20 75  umuated in the u
cbb0: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 2d 3e 70 55  nixInodeInfo->pU
cbc0: 6e 75 73 65 64 20 6c 69 73 74 2e 0a 2a 2f 20 0a  nused list..*/ .
cbd0: 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c 6f 73  static void clos
cbe0: 65 50 65 6e 64 69 6e 67 46 64 73 28 75 6e 69 78  ePendingFds(unix
cbf0: 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20  File *pFile){.  
cc00: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70  unixInodeInfo *p
cc10: 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70  Inode = pFile->p
cc20: 49 6e 6f 64 65 3b 0a 20 20 55 6e 69 78 55 6e 75  Inode;.  UnixUnu
cc30: 73 65 64 46 64 20 2a 70 3b 0a 20 20 55 6e 69 78  sedFd *p;.  Unix
cc40: 55 6e 75 73 65 64 46 64 20 2a 70 4e 65 78 74 3b  UnusedFd *pNext;
cc50: 0a 20 20 66 6f 72 28 70 3d 70 49 6e 6f 64 65 2d  .  for(p=pInode-
cc60: 3e 70 55 6e 75 73 65 64 3b 20 70 3b 20 70 3d 70  >pUnused; p; p=p
cc70: 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74  Next){.    pNext
cc80: 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 23 69 66   = p->pNext;.#if
cc90: 20 4f 53 43 4c 4f 53 45 5f 43 48 45 43 4b 5f 43   OSCLOSE_CHECK_C
cca0: 4c 4f 53 45 5f 49 4f 45 52 52 0a 20 20 20 20 69  LOSE_IOERR.    i
ccb0: 66 28 20 63 6c 6f 73 65 28 70 2d 3e 66 64 29 20  f( close(p->fd) 
ccc0: 29 7b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61  ){.      storeLa
ccd0: 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65  stErrno(pFile, e
cce0: 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 72 63 20  rrno);.      rc 
ccf0: 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43  = SQLITE_IOERR_C
cd00: 4c 4f 53 45 3b 0a 20 20 20 20 20 20 70 2d 3e 70  LOSE;.      p->p
cd10: 4e 65 78 74 20 3d 20 70 45 72 72 6f 72 3b 0a 20  Next = pError;. 
cd20: 20 20 20 20 20 70 45 72 72 6f 72 20 3d 20 70 3b       pError = p;
cd30: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
cd40: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
cd50: 29 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20  );.    }.#else. 
cd60: 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28     robust_close(
cd70: 70 46 69 6c 65 2c 20 70 2d 3e 66 64 2c 20 5f 5f  pFile, p->fd, __
cd80: 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 73 71 6c  LINE__);.    sql
cd90: 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 23 65  ite3_free(p);.#e
cda0: 6e 64 69 66 0a 20 20 7d 0a 20 20 70 49 6e 6f 64  ndif.  }.  pInod
cdb0: 65 2d 3e 70 55 6e 75 73 65 64 20 3d 20 30 3b 0a  e->pUnused = 0;.
cdc0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65  }../*.** Release
cdd0: 20 61 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f   a unixInodeInfo
cde0: 20 73 74 72 75 63 74 75 72 65 20 70 72 65 76 69   structure previ
cdf0: 6f 75 73 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20  ously allocated 
ce00: 62 79 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f  by findInodeInfo
ce10: 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 75  ()..**.** The mu
ce20: 74 65 78 20 65 6e 74 65 72 65 64 20 75 73 69 6e  tex entered usin
ce30: 67 20 74 68 65 20 75 6e 69 78 45 6e 74 65 72 4d  g the unixEnterM
ce40: 75 74 65 78 28 29 20 66 75 6e 63 74 69 6f 6e 20  utex() function 
ce50: 6d 75 73 74 20 62 65 20 68 65 6c 64 0a 2a 2a 20  must be held.** 
ce60: 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
ce70: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f  on is called..*/
ce80: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c  .static void rel
ce90: 65 61 73 65 49 6e 6f 64 65 49 6e 66 6f 28 75 6e  easeInodeInfo(un
cea0: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a  ixFile *pFile){.
ceb0: 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20    unixInodeInfo 
cec0: 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d  *pInode = pFile-
ced0: 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 73 73 65 72  >pInode;.  asser
cee0: 74 28 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64  t( unixMutexHeld
cef0: 28 29 20 29 3b 0a 20 20 69 66 28 20 41 4c 57 41  () );.  if( ALWA
cf00: 59 53 28 70 49 6e 6f 64 65 29 20 29 7b 0a 20 20  YS(pInode) ){.  
cf10: 20 20 70 49 6e 6f 64 65 2d 3e 6e 52 65 66 2d 2d    pInode->nRef--
cf20: 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65  ;.    if( pInode
cf30: 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20  ->nRef==0 ){.   
cf40: 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64     assert( pInod
cf50: 65 2d 3e 70 53 68 6d 4e 6f 64 65 3d 3d 30 20 29  e->pShmNode==0 )
cf60: 3b 0a 20 20 20 20 20 20 63 6c 6f 73 65 50 65 6e  ;.      closePen
cf70: 64 69 6e 67 46 64 73 28 70 46 69 6c 65 29 3b 0a  dingFds(pFile);.
cf80: 20 20 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65        if( pInode
cf90: 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20 20  ->pPrev ){.     
cfa0: 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64     assert( pInod
cfb0: 65 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 3d  e->pPrev->pNext=
cfc0: 3d 70 49 6e 6f 64 65 20 29 3b 0a 20 20 20 20 20  =pInode );.     
cfd0: 20 20 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76     pInode->pPrev
cfe0: 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 6f 64 65  ->pNext = pInode
cff0: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  ->pNext;.      }
d000: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73  else{.        as
d010: 73 65 72 74 28 20 69 6e 6f 64 65 4c 69 73 74 3d  sert( inodeList=
d020: 3d 70 49 6e 6f 64 65 20 29 3b 0a 20 20 20 20 20  =pInode );.     
d030: 20 20 20 69 6e 6f 64 65 4c 69 73 74 20 3d 20 70     inodeList = p
d040: 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a 20 20  Inode->pNext;.  
d050: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
d060: 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 20 29 7b  pInode->pNext ){
d070: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
d080: 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 2d 3e   pInode->pNext->
d090: 70 50 72 65 76 3d 3d 70 49 6e 6f 64 65 20 29 3b  pPrev==pInode );
d0a0: 0a 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d  .        pInode-
d0b0: 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20  >pNext->pPrev = 
d0c0: 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76 3b 0a 20  pInode->pPrev;. 
d0d0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
d0e0: 69 74 65 33 5f 66 72 65 65 28 70 49 6e 6f 64 65  ite3_free(pInode
d0f0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
d100: 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 66 69  /*.** Given a fi
d110: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2c 20 6c  le descriptor, l
d120: 6f 63 61 74 65 20 74 68 65 20 75 6e 69 78 49 6e  ocate the unixIn
d130: 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 20 74  odeInfo object t
d140: 68 61 74 0a 2a 2a 20 64 65 73 63 72 69 62 65 73  hat.** describes
d150: 20 74 68 61 74 20 66 69 6c 65 20 64 65 73 63 72   that file descr
d160: 69 70 74 6f 72 2e 20 20 43 72 65 61 74 65 20 61  iptor.  Create a
d170: 20 6e 65 77 20 6f 6e 65 20 69 66 20 6e 65 63 65   new one if nece
d180: 73 73 61 72 79 2e 20 20 54 68 65 0a 2a 2a 20 72  ssary.  The.** r
d190: 65 74 75 72 6e 20 76 61 6c 75 65 20 6d 69 67 68  eturn value migh
d1a0: 74 20 62 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a  t be uninitializ
d1b0: 65 64 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f  ed if an error o
d1c0: 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ccurs..**.** The
d1d0: 20 6d 75 74 65 78 20 65 6e 74 65 72 65 64 20 75   mutex entered u
d1e0: 73 69 6e 67 20 74 68 65 20 75 6e 69 78 45 6e 74  sing the unixEnt
d1f0: 65 72 4d 75 74 65 78 28 29 20 66 75 6e 63 74 69  erMutex() functi
d200: 6f 6e 20 6d 75 73 74 20 62 65 20 68 65 6c 64 0a  on must be held.
d210: 2a 2a 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  ** when this fun
d220: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e  ction is called.
d230: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e  .**.** Return an
d240: 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72   appropriate err
d250: 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74  or code..*/.stat
d260: 69 63 20 69 6e 74 20 66 69 6e 64 49 6e 6f 64 65  ic int findInode
d270: 49 6e 66 6f 28 0a 20 20 75 6e 69 78 46 69 6c 65  Info(.  unixFile
d280: 20 2a 70 46 69 6c 65 2c 20 20 20 20 20 20 20 20   *pFile,        
d290: 20 20 20 20 20 20 20 2f 2a 20 55 6e 69 78 20 66         /* Unix f
d2a0: 69 6c 65 20 77 69 74 68 20 66 69 6c 65 20 64 65  ile with file de
d2b0: 73 63 20 75 73 65 64 20 69 6e 20 74 68 65 20 6b  sc used in the k
d2c0: 65 79 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64  ey */.  unixInod
d2d0: 65 49 6e 66 6f 20 2a 2a 70 70 49 6e 6f 64 65 20  eInfo **ppInode 
d2e0: 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
d2f0: 20 74 68 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e   the unixInodeIn
d300: 66 6f 20 6f 62 6a 65 63 74 20 68 65 72 65 20 2a  fo object here *
d310: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  /.){.  int rc;  
d320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d330: 20 20 20 20 20 20 2f 2a 20 53 79 73 74 65 6d 20        /* System 
d340: 63 61 6c 6c 20 72 65 74 75 72 6e 20 63 6f 64 65  call return code
d350: 20 2a 2f 0a 20 20 69 6e 74 20 66 64 3b 20 20 20   */.  int fd;   
d360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d370: 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65       /* The file
d380: 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20   descriptor for 
d390: 70 46 69 6c 65 20 2a 2f 0a 20 20 73 74 72 75 63  pFile */.  struc
d3a0: 74 20 75 6e 69 78 46 69 6c 65 49 64 20 66 69 6c  t unixFileId fil
d3b0: 65 49 64 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 6f  eId;      /* Loo
d3c0: 6b 75 70 20 6b 65 79 20 66 6f 72 20 74 68 65 20  kup key for the 
d3d0: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 2f  unixInodeInfo */
d3e0: 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73  .  struct stat s
d3f0: 74 61 74 62 75 66 3b 20 20 20 20 20 20 20 20 20  tatbuf;         
d400: 20 20 2f 2a 20 4c 6f 77 2d 6c 65 76 65 6c 20 66    /* Low-level f
d410: 69 6c 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ile information 
d420: 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e  */.  unixInodeIn
d430: 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 30 3b 20  fo *pInode = 0; 
d440: 20 20 20 20 2f 2a 20 43 61 6e 64 69 64 61 74 65      /* Candidate
d450: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f   unixInodeInfo o
d460: 62 6a 65 63 74 20 2a 2f 0a 0a 20 20 61 73 73 65  bject */..  asse
d470: 72 74 28 20 75 6e 69 78 4d 75 74 65 78 48 65 6c  rt( unixMutexHel
d480: 64 28 29 20 29 3b 0a 0a 20 20 2f 2a 20 47 65 74  d() );..  /* Get
d490: 20 6c 6f 77 2d 6c 65 76 65 6c 20 69 6e 66 6f 72   low-level infor
d4a0: 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65  mation about the
d4b0: 20 66 69 6c 65 20 74 68 61 74 20 77 65 20 63 61   file that we ca
d4c0: 6e 20 75 73 65 64 20 74 6f 0a 20 20 2a 2a 20 63  n used to.  ** c
d4d0: 72 65 61 74 65 20 61 20 75 6e 69 71 75 65 20 6e  reate a unique n
d4e0: 61 6d 65 20 66 6f 72 20 74 68 65 20 66 69 6c 65  ame for the file
d4f0: 2e 0a 20 20 2a 2f 0a 20 20 66 64 20 3d 20 70 46  ..  */.  fd = pF
d500: 69 6c 65 2d 3e 68 3b 0a 20 20 72 63 20 3d 20 6f  ile->h;.  rc = o
d510: 73 46 73 74 61 74 28 66 64 2c 20 26 73 74 61 74  sFstat(fd, &stat
d520: 62 75 66 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  buf);.  if( rc!=
d530: 30 20 29 7b 0a 20 20 20 20 73 74 6f 72 65 4c 61  0 ){.    storeLa
d540: 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65  stErrno(pFile, e
d550: 72 72 6e 6f 29 3b 0a 23 69 66 64 65 66 20 45 4f  rrno);.#ifdef EO
d560: 56 45 52 46 4c 4f 57 0a 20 20 20 20 69 66 28 20  VERFLOW.    if( 
d570: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
d580: 3d 3d 45 4f 56 45 52 46 4c 4f 57 20 29 20 72 65  ==EOVERFLOW ) re
d590: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4c 46  turn SQLITE_NOLF
d5a0: 53 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65  S;.#endif.    re
d5b0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
d5c0: 52 3b 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 5f  R;.  }..#ifdef _
d5d0: 5f 41 50 50 4c 45 5f 5f 0a 20 20 2f 2a 20 4f 6e  _APPLE__.  /* On
d5e0: 20 4f 53 20 58 20 6f 6e 20 61 6e 20 6d 73 64 6f   OS X on an msdo
d5f0: 73 20 66 69 6c 65 73 79 73 74 65 6d 2c 20 74 68  s filesystem, th
d600: 65 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72 20 69  e inode number i
d610: 73 20 72 65 70 6f 72 74 65 64 0a 20 20 2a 2a 20  s reported.  ** 
d620: 69 6e 63 6f 72 72 65 63 74 6c 79 20 66 6f 72 20  incorrectly for 
d630: 7a 65 72 6f 2d 73 69 7a 65 20 66 69 6c 65 73 2e  zero-size files.
d640: 20 20 53 65 65 20 74 69 63 6b 65 74 20 23 33 32    See ticket #32
d650: 36 30 2e 20 20 54 6f 20 77 6f 72 6b 0a 20 20 2a  60.  To work.  *
d660: 2a 20 61 72 6f 75 6e 64 20 74 68 69 73 20 70 72  * around this pr
d670: 6f 62 6c 65 6d 20 28 77 65 20 63 6f 6e 73 69 64  oblem (we consid
d680: 65 72 20 69 74 20 61 20 62 75 67 20 69 6e 20 4f  er it a bug in O
d690: 53 20 58 2c 20 6e 6f 74 20 53 51 4c 69 74 65 29  S X, not SQLite)
d6a0: 0a 20 20 2a 2a 20 77 65 20 61 6c 77 61 79 73 20  .  ** we always 
d6b0: 69 6e 63 72 65 61 73 65 20 74 68 65 20 66 69 6c  increase the fil
d6c0: 65 20 73 69 7a 65 20 74 6f 20 31 20 62 79 20 77  e size to 1 by w
d6d0: 72 69 74 69 6e 67 20 61 20 73 69 6e 67 6c 65 20  riting a single 
d6e0: 62 79 74 65 0a 20 20 2a 2a 20 70 72 69 6f 72 20  byte.  ** prior 
d6f0: 74 6f 20 61 63 63 65 73 73 69 6e 67 20 74 68 65  to accessing the
d700: 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72 2e 20 20   inode number.  
d710: 54 68 65 20 6f 6e 65 20 62 79 74 65 20 77 72 69  The one byte wri
d720: 74 74 65 6e 20 69 73 0a 20 20 2a 2a 20 61 6e 20  tten is.  ** an 
d730: 41 53 43 49 49 20 27 53 27 20 63 68 61 72 61 63  ASCII 'S' charac
d740: 74 65 72 20 77 68 69 63 68 20 61 6c 73 6f 20 68  ter which also h
d750: 61 70 70 65 6e 73 20 74 6f 20 62 65 20 74 68 65  appens to be the
d760: 20 66 69 72 73 74 20 62 79 74 65 0a 20 20 2a 2a   first byte.  **
d770: 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 20 6f   in the header o
d780: 66 20 65 76 65 72 79 20 53 51 4c 69 74 65 20 64  f every SQLite d
d790: 61 74 61 62 61 73 65 2e 20 20 49 6e 20 74 68 69  atabase.  In thi
d7a0: 73 20 77 61 79 2c 20 69 66 20 74 68 65 72 65 0a  s way, if there.
d7b0: 20 20 2a 2a 20 69 73 20 61 20 72 61 63 65 20 63    ** is a race c
d7c0: 6f 6e 64 69 74 69 6f 6e 20 73 75 63 68 20 74 68  ondition such th
d7d0: 61 74 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61  at another threa
d7e0: 64 20 68 61 73 20 61 6c 72 65 61 64 79 20 70 6f  d has already po
d7f0: 70 75 6c 61 74 65 64 0a 20 20 2a 2a 20 74 68 65  pulated.  ** the
d800: 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20 74   first page of t
d810: 68 65 20 64 61 74 61 62 61 73 65 2c 20 6e 6f 20  he database, no 
d820: 64 61 6d 61 67 65 20 69 73 20 64 6f 6e 65 2e 0a  damage is done..
d830: 20 20 2a 2f 0a 20 20 69 66 28 20 73 74 61 74 62    */.  if( statb
d840: 75 66 2e 73 74 5f 73 69 7a 65 3d 3d 30 20 26 26  uf.st_size==0 &&
d850: 20 28 70 46 69 6c 65 2d 3e 66 73 46 6c 61 67 73   (pFile->fsFlags
d860: 20 26 20 53 51 4c 49 54 45 5f 46 53 46 4c 41 47   & SQLITE_FSFLAG
d870: 53 5f 49 53 5f 4d 53 44 4f 53 29 21 3d 30 20 29  S_IS_MSDOS)!=0 )
d880: 7b 0a 20 20 20 20 64 6f 7b 20 72 63 20 3d 20 6f  {.    do{ rc = o
d890: 73 57 72 69 74 65 28 66 64 2c 20 22 53 22 2c 20  sWrite(fd, "S", 
d8a0: 31 29 3b 20 7d 77 68 69 6c 65 28 20 72 63 3c 30  1); }while( rc<0
d8b0: 20 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52   && errno==EINTR
d8c0: 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d   );.    if( rc!=
d8d0: 31 20 29 7b 0a 20 20 20 20 20 20 73 74 6f 72 65  1 ){.      store
d8e0: 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c  LastErrno(pFile,
d8f0: 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 72   errno);.      r
d900: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
d910: 52 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  RR;.    }.    rc
d920: 20 3d 20 6f 73 46 73 74 61 74 28 66 64 2c 20 26   = osFstat(fd, &
d930: 73 74 61 74 62 75 66 29 3b 0a 20 20 20 20 69 66  statbuf);.    if
d940: 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20  ( rc!=0 ){.     
d950: 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28   storeLastErrno(
d960: 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 20  pFile, errno);. 
d970: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
d980: 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20 7d 0a  TE_IOERR;.    }.
d990: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 6d 65    }.#endif..  me
d9a0: 6d 73 65 74 28 26 66 69 6c 65 49 64 2c 20 30 2c  mset(&fileId, 0,
d9b0: 20 73 69 7a 65 6f 66 28 66 69 6c 65 49 64 29 29   sizeof(fileId))
d9c0: 3b 0a 20 20 66 69 6c 65 49 64 2e 64 65 76 20 3d  ;.  fileId.dev =
d9d0: 20 73 74 61 74 62 75 66 2e 73 74 5f 64 65 76 3b   statbuf.st_dev;
d9e0: 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
d9f0: 20 20 66 69 6c 65 49 64 2e 70 49 64 20 3d 20 70    fileId.pId = p
da00: 46 69 6c 65 2d 3e 70 49 64 3b 0a 23 65 6c 73 65  File->pId;.#else
da10: 0a 20 20 66 69 6c 65 49 64 2e 69 6e 6f 20 3d 20  .  fileId.ino = 
da20: 73 74 61 74 62 75 66 2e 73 74 5f 69 6e 6f 3b 0a  statbuf.st_ino;.
da30: 23 65 6e 64 69 66 0a 20 20 70 49 6e 6f 64 65 20  #endif.  pInode 
da40: 3d 20 69 6e 6f 64 65 4c 69 73 74 3b 0a 20 20 77  = inodeList;.  w
da50: 68 69 6c 65 28 20 70 49 6e 6f 64 65 20 26 26 20  hile( pInode && 
da60: 6d 65 6d 63 6d 70 28 26 66 69 6c 65 49 64 2c 20  memcmp(&fileId, 
da70: 26 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2c  &pInode->fileId,
da80: 20 73 69 7a 65 6f 66 28 66 69 6c 65 49 64 29 29   sizeof(fileId))
da90: 20 29 7b 0a 20 20 20 20 70 49 6e 6f 64 65 20 3d   ){.    pInode =
daa0: 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a   pInode->pNext;.
dab0: 20 20 7d 0a 20 20 69 66 28 20 70 49 6e 6f 64 65    }.  if( pInode
dac0: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 49 6e 6f 64  ==0 ){.    pInod
dad0: 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  e = sqlite3_mall
dae0: 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 49 6e 6f  oc( sizeof(*pIno
daf0: 64 65 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  de) );.    if( p
db00: 49 6e 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20  Inode==0 ){.    
db10: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
db20: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20  NOMEM;.    }.   
db30: 20 6d 65 6d 73 65 74 28 70 49 6e 6f 64 65 2c 20   memset(pInode, 
db40: 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49 6e 6f 64  0, sizeof(*pInod
db50: 65 29 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  e));.    memcpy(
db60: 26 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2c  &pInode->fileId,
db70: 20 26 66 69 6c 65 49 64 2c 20 73 69 7a 65 6f 66   &fileId, sizeof
db80: 28 66 69 6c 65 49 64 29 29 3b 0a 20 20 20 20 70  (fileId));.    p
db90: 49 6e 6f 64 65 2d 3e 6e 52 65 66 20 3d 20 31 3b  Inode->nRef = 1;
dba0: 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 70 4e 65  .    pInode->pNe
dbb0: 78 74 20 3d 20 69 6e 6f 64 65 4c 69 73 74 3b 0a  xt = inodeList;.
dbc0: 20 20 20 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65      pInode->pPre
dbd0: 76 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 69  v = 0;.    if( i
dbe0: 6e 6f 64 65 4c 69 73 74 20 29 20 69 6e 6f 64 65  nodeList ) inode
dbf0: 4c 69 73 74 2d 3e 70 50 72 65 76 20 3d 20 70 49  List->pPrev = pI
dc00: 6e 6f 64 65 3b 0a 20 20 20 20 69 6e 6f 64 65 4c  node;.    inodeL
dc10: 69 73 74 20 3d 20 70 49 6e 6f 64 65 3b 0a 20 20  ist = pInode;.  
dc20: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 6e 6f 64  }else{.    pInod
dc30: 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20  e->nRef++;.  }. 
dc40: 20 2a 70 70 49 6e 6f 64 65 20 3d 20 70 49 6e 6f   *ppInode = pIno
dc50: 64 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  de;.  return SQL
dc60: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
dc70: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
dc80: 70 46 69 6c 65 20 68 61 73 20 62 65 65 6e 20 72  pFile has been r
dc90: 65 6e 61 6d 65 64 20 6f 72 20 75 6e 6c 69 6e 6b  enamed or unlink
dca0: 65 64 20 73 69 6e 63 65 20 69 74 20 77 61 73 20  ed since it was 
dcb0: 66 69 72 73 74 20 6f 70 65 6e 65 64 2e 0a 2a 2f  first opened..*/
dcc0: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c 65  .static int file
dcd0: 48 61 73 4d 6f 76 65 64 28 75 6e 69 78 46 69 6c  HasMoved(unixFil
dce0: 65 20 2a 70 46 69 6c 65 29 7b 0a 23 69 66 20 4f  e *pFile){.#if O
dcf0: 53 5f 56 58 57 4f 52 4b 53 0a 20 20 72 65 74 75  S_VXWORKS.  retu
dd00: 72 6e 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  rn pFile->pInode
dd10: 21 3d 30 20 26 26 20 70 46 69 6c 65 2d 3e 70 49  !=0 && pFile->pI
dd20: 64 21 3d 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  d!=pFile->pInode
dd30: 2d 3e 66 69 6c 65 49 64 2e 70 49 64 3b 0a 23 65  ->fileId.pId;.#e
dd40: 6c 73 65 0a 20 20 73 74 72 75 63 74 20 73 74 61  lse.  struct sta
dd50: 74 20 62 75 66 3b 0a 20 20 72 65 74 75 72 6e 20  t buf;.  return 
dd60: 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 21 3d 30  pFile->pInode!=0
dd70: 20 26 26 0a 20 20 20 20 20 20 28 6f 73 53 74 61   &&.      (osSta
dd80: 74 28 70 46 69 6c 65 2d 3e 7a 50 61 74 68 2c 20  t(pFile->zPath, 
dd90: 26 62 75 66 29 21 3d 30 20 7c 7c 20 62 75 66 2e  &buf)!=0 || buf.
dda0: 73 74 5f 69 6e 6f 21 3d 70 46 69 6c 65 2d 3e 70  st_ino!=pFile->p
ddb0: 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2e 69 6e  Inode->fileId.in
ddc0: 6f 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f  o);.#endif.}.../
ddd0: 2a 0a 2a 2a 20 43 68 65 63 6b 20 61 20 75 6e 69  *.** Check a uni
dde0: 78 46 69 6c 65 20 74 68 61 74 20 69 73 20 61 20  xFile that is a 
ddf0: 64 61 74 61 62 61 73 65 2e 20 20 56 65 72 69 66  database.  Verif
de00: 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  y the following:
de10: 0a 2a 2a 0a 2a 2a 20 28 31 29 20 54 68 65 72 65  .**.** (1) There
de20: 20 69 73 20 65 78 61 63 74 6c 79 20 6f 6e 65 20   is exactly one 
de30: 68 61 72 64 20 6c 69 6e 6b 20 6f 6e 20 74 68 65  hard link on the
de40: 20 66 69 6c 65 0a 2a 2a 20 28 32 29 20 54 68 65   file.** (2) The
de50: 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 20 73   file is not a s
de60: 79 6d 62 6f 6c 69 63 20 6c 69 6e 6b 0a 2a 2a 20  ymbolic link.** 
de70: 28 33 29 20 54 68 65 20 66 69 6c 65 20 68 61 73  (3) The file has
de80: 20 6e 6f 74 20 62 65 65 6e 20 72 65 6e 61 6d 65   not been rename
de90: 64 20 6f 72 20 75 6e 6c 69 6e 6b 65 64 0a 2a 2a  d or unlinked.**
dea0: 0a 2a 2a 20 49 73 73 75 65 20 73 71 6c 69 74 65  .** Issue sqlite
deb0: 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 57 41 52  3_log(SQLITE_WAR
dec0: 4e 49 4e 47 2c 2e 2e 2e 29 20 6d 65 73 73 61 67  NING,...) messag
ded0: 65 73 20 69 66 20 61 6e 79 74 68 69 6e 67 20 69  es if anything i
dee0: 73 20 6e 6f 74 20 72 69 67 68 74 2e 0a 2a 2f 0a  s not right..*/.
def0: 73 74 61 74 69 63 20 76 6f 69 64 20 76 65 72 69  static void veri
df00: 66 79 44 62 46 69 6c 65 28 75 6e 69 78 46 69 6c  fyDbFile(unixFil
df10: 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 73 74 72  e *pFile){.  str
df20: 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20  uct stat buf;.  
df30: 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 70 46  int rc;.  if( pF
df40: 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26  ile->ctrlFlags &
df50: 20 55 4e 49 58 46 49 4c 45 5f 57 41 52 4e 45 44   UNIXFILE_WARNED
df60: 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 6e 65 20 6f   ){.    /* One o
df70: 72 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 66 6f  r more of the fo
df80: 6c 6c 6f 77 69 6e 67 20 77 61 72 6e 69 6e 67 73  llowing warnings
df90: 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
dfa0: 65 6e 20 69 73 73 75 65 64 2e 20 20 44 6f 20 6e  en issued.  Do n
dfb0: 6f 74 0a 20 20 20 20 2a 2a 20 72 65 70 65 61 74  ot.    ** repeat
dfc0: 20 74 68 65 6d 20 73 6f 20 61 73 20 6e 6f 74 20   them so as not 
dfd0: 74 6f 20 63 6c 75 74 74 65 72 20 74 68 65 20 65  to clutter the e
dfe0: 72 72 6f 72 20 6c 6f 67 20 2a 2f 0a 20 20 20 20  rror log */.    
dff0: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 72 63  return;.  }.  rc
e000: 20 3d 20 6f 73 46 73 74 61 74 28 70 46 69 6c 65   = osFstat(pFile
e010: 2d 3e 68 2c 20 26 62 75 66 29 3b 0a 20 20 69 66  ->h, &buf);.  if
e020: 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 73  ( rc!=0 ){.    s
e030: 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54  qlite3_log(SQLIT
e040: 45 5f 57 41 52 4e 49 4e 47 2c 20 22 63 61 6e 6e  E_WARNING, "cann
e050: 6f 74 20 66 73 74 61 74 20 64 62 20 66 69 6c 65  ot fstat db file
e060: 20 25 73 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61   %s", pFile->zPa
e070: 74 68 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  th);.    pFile->
e080: 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49  ctrlFlags |= UNI
e090: 58 46 49 4c 45 5f 57 41 52 4e 45 44 3b 0a 20 20  XFILE_WARNED;.  
e0a0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
e0b0: 69 66 28 20 62 75 66 2e 73 74 5f 6e 6c 69 6e 6b  if( buf.st_nlink
e0c0: 3d 3d 30 20 26 26 20 28 70 46 69 6c 65 2d 3e 63  ==0 && (pFile->c
e0d0: 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46  trlFlags & UNIXF
e0e0: 49 4c 45 5f 44 45 4c 45 54 45 29 3d 3d 30 20 29  ILE_DELETE)==0 )
e0f0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f  {.    sqlite3_lo
e100: 67 28 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47  g(SQLITE_WARNING
e110: 2c 20 22 66 69 6c 65 20 75 6e 6c 69 6e 6b 65 64  , "file unlinked
e120: 20 77 68 69 6c 65 20 6f 70 65 6e 3a 20 25 73 22   while open: %s"
e130: 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b  , pFile->zPath);
e140: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c  .    pFile->ctrl
e150: 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c  Flags |= UNIXFIL
e160: 45 5f 57 41 52 4e 45 44 3b 0a 20 20 20 20 72 65  E_WARNED;.    re
e170: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20  turn;.  }.  if( 
e180: 62 75 66 2e 73 74 5f 6e 6c 69 6e 6b 3e 31 20 29  buf.st_nlink>1 )
e190: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f  {.    sqlite3_lo
e1a0: 67 28 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47  g(SQLITE_WARNING
e1b0: 2c 20 22 6d 75 6c 74 69 70 6c 65 20 6c 69 6e 6b  , "multiple link
e1c0: 73 20 74 6f 20 66 69 6c 65 3a 20 25 73 22 2c 20  s to file: %s", 
e1d0: 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20  pFile->zPath);. 
e1e0: 20 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c     pFile->ctrlFl
e1f0: 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f  ags |= UNIXFILE_
e200: 57 41 52 4e 45 44 3b 0a 20 20 20 20 72 65 74 75  WARNED;.    retu
e210: 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 69  rn;.  }.  if( fi
e220: 6c 65 48 61 73 4d 6f 76 65 64 28 70 46 69 6c 65  leHasMoved(pFile
e230: 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
e240: 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 57 41 52 4e  _log(SQLITE_WARN
e250: 49 4e 47 2c 20 22 66 69 6c 65 20 72 65 6e 61 6d  ING, "file renam
e260: 65 64 20 77 68 69 6c 65 20 6f 70 65 6e 3a 20 5b  ed while open: [
e270: 25 73 5d 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61  %s]", pFile->zPa
e280: 74 68 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  th);.    pFile->
e290: 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49  ctrlFlags |= UNI
e2a0: 58 46 49 4c 45 5f 57 41 52 4e 45 44 3b 0a 20 20  XFILE_WARNED;.  
e2b0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 7d 0a    return;.  }.}.
e2c0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
e2d0: 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74  tine checks if t
e2e0: 68 65 72 65 20 69 73 20 61 20 52 45 53 45 52 56  here is a RESERV
e2f0: 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20  ED lock held on 
e300: 74 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a  the specified.**
e310: 20 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72   file by this or
e320: 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65   any other proce
e330: 73 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f  ss. If such a lo
e340: 63 6b 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20  ck is held, set 
e350: 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61  *pResOut.** to a
e360: 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20   non-zero value 
e370: 6f 74 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f  otherwise *pResO
e380: 75 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72  ut is set to zer
e390: 6f 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 76  o.  The return v
e3a0: 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74  alue.** is set t
e3b0: 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65  o SQLITE_OK unle
e3c0: 73 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20  ss an I/O error 
e3d0: 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f  occurs during lo
e3e0: 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a  ck checking..*/.
e3f0: 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 43  static int unixC
e400: 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
e410: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
e420: 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29  d, int *pResOut)
e430: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
e440: 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65  ITE_OK;.  int re
e450: 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e  served = 0;.  un
e460: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
e470: 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a  (unixFile*)id;..
e480: 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
e490: 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r( return SQLITE
e4a0: 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45  _IOERR_CHECKRESE
e4b0: 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 0a 20 20  RVEDLOCK; );..  
e4c0: 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
e4d0: 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  .  unixEnterMute
e4e0: 78 28 29 3b 20 2f 2a 20 42 65 63 61 75 73 65 20  x(); /* Because 
e4f0: 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 69 73  pFile->pInode is
e500: 20 73 68 61 72 65 64 20 61 63 72 6f 73 73 20 74   shared across t
e510: 68 72 65 61 64 73 20 2a 2f 0a 0a 20 20 2f 2a 20  hreads */..  /* 
e520: 43 68 65 63 6b 20 69 66 20 61 20 74 68 72 65 61  Check if a threa
e530: 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73  d in this proces
e540: 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c  s holds such a l
e550: 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ock */.  if( pFi
e560: 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c  le->pInode->eFil
e570: 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43  eLock>SHARED_LOC
e580: 4b 20 29 7b 0a 20 20 20 20 72 65 73 65 72 76 65  K ){.    reserve
e590: 64 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  d = 1;.  }..  /*
e5a0: 20 4f 74 68 65 72 77 69 73 65 20 73 65 65 20 69   Otherwise see i
e5b0: 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f  f some other pro
e5c0: 63 65 73 73 20 68 6f 6c 64 73 20 69 74 2e 0a 20  cess holds it.. 
e5d0: 20 2a 2f 0a 23 69 66 6e 64 65 66 20 5f 5f 44 4a   */.#ifndef __DJ
e5e0: 47 50 50 5f 5f 0a 20 20 69 66 28 20 21 72 65 73  GPP__.  if( !res
e5f0: 65 72 76 65 64 20 26 26 20 21 70 46 69 6c 65 2d  erved && !pFile-
e600: 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73  >pInode->bProces
e610: 73 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 73 74 72  sLock ){.    str
e620: 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a  uct flock lock;.
e630: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63      lock.l_whenc
e640: 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20  e = SEEK_SET;.  
e650: 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
e660: 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 3b 0a   RESERVED_BYTE;.
e670: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d      lock.l_len =
e680: 20 31 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74   1;.    lock.l_t
e690: 79 70 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20  ype = F_WRLCK;. 
e6a0: 20 20 20 69 66 28 20 6f 73 46 63 6e 74 6c 28 70     if( osFcntl(p
e6b0: 46 69 6c 65 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b  File->h, F_GETLK
e6c0: 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a 23 69 66 20  , &lock) ){.#if 
e6d0: 4f 53 4c 4f 43 4b 49 4e 47 5f 43 48 45 43 4b 5f  OSLOCKING_CHECK_
e6e0: 42 55 53 59 5f 49 4f 45 52 52 0a 20 20 20 20 20  BUSY_IOERR.     
e6f0: 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72   int tErrno = er
e700: 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  rno;.      rc = 
e710: 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
e720: 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
e730: 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43  , SQLITE_IOERR_C
e740: 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b  HECKRESERVEDLOCK
e750: 29 3b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61  );.      storeLa
e760: 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74  stErrno(pFile, t
e770: 45 72 72 6e 6f 29 3b 0a 23 65 6c 73 65 0a 20 20  Errno);.#else.  
e780: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
e790: 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52  IOERR_CHECKRESER
e7a0: 56 45 44 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 73  VEDLOCK;.      s
e7b0: 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46  toreLastErrno(pF
e7c0: 69 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 23 65 6e  ile, errno);.#en
e7d0: 64 69 66 0a 20 20 20 20 7d 20 65 6c 73 65 20 69  dif.    } else i
e7e0: 66 28 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 21 3d  f( lock.l_type!=
e7f0: 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 20  F_UNLCK ){.     
e800: 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20   reserved = 1;. 
e810: 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
e820: 20 20 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75    .  unixLeaveMu
e830: 74 65 78 28 29 3b 0a 20 20 4f 53 54 52 41 43 45  tex();.  OSTRACE
e840: 28 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20  (("TEST WR-LOCK 
e850: 25 64 20 25 64 20 25 64 20 28 75 6e 69 78 29 5c  %d %d %d (unix)\
e860: 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63  n", pFile->h, rc
e870: 2c 20 72 65 73 65 72 76 65 64 29 29 3b 0a 0a 20  , reserved));.. 
e880: 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65   *pResOut = rese
e890: 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72  rved;.  return r
e8a0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65  c;.}../*.** Atte
e8b0: 6d 70 74 20 74 6f 20 73 65 74 20 61 20 73 79 73  mpt to set a sys
e8c0: 74 65 6d 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  tem-lock on the 
e8d0: 66 69 6c 65 20 70 46 69 6c 65 2e 20 20 54 68 65  file pFile.  The
e8e0: 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20 64 65 73   lock is .** des
e8f0: 63 72 69 62 65 64 20 62 79 20 70 4c 6f 63 6b 2e  cribed by pLock.
e900: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 46  .**.** If the pF
e910: 69 6c 65 20 77 61 73 20 6f 70 65 6e 65 64 20 72  ile was opened r
e920: 65 61 64 2f 77 72 69 74 65 20 66 72 6f 6d 20 75  ead/write from u
e930: 6e 69 78 2d 65 78 63 6c 2c 20 74 68 65 6e 20 74  nix-excl, then t
e940: 68 65 20 6f 6e 6c 79 20 6c 6f 63 6b 0a 2a 2a 20  he only lock.** 
e950: 65 76 65 72 20 6f 62 74 61 69 6e 65 64 20 69 73  ever obtained is
e960: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
e970: 63 6b 2c 20 61 6e 64 20 69 74 20 69 73 20 6f 62  ck, and it is ob
e980: 74 61 69 6e 65 64 20 65 78 61 63 74 6c 79 20 6f  tained exactly o
e990: 6e 63 65 0a 2a 2a 20 74 68 65 20 66 69 72 73 74  nce.** the first
e9a0: 20 74 69 6d 65 20 61 6e 79 20 6c 6f 63 6b 20 69   time any lock i
e9b0: 73 20 61 74 74 65 6d 70 74 65 64 2e 20 20 41 6c  s attempted.  Al
e9c0: 6c 20 73 75 62 73 65 71 75 65 6e 74 20 73 79 73  l subsequent sys
e9d0: 74 65 6d 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 6f  tem locking.** o
e9e0: 70 65 72 61 74 69 6f 6e 73 20 62 65 63 6f 6d 65  perations become
e9f0: 20 6e 6f 2d 6f 70 73 2e 20 20 4c 6f 63 6b 69 6e   no-ops.  Lockin
ea00: 67 20 6f 70 65 72 61 74 69 6f 6e 73 20 73 74 69  g operations sti
ea10: 6c 6c 20 68 61 70 70 65 6e 20 69 6e 74 65 72 6e  ll happen intern
ea20: 61 6c 6c 79 2c 0a 2a 2a 20 69 6e 20 6f 72 64 65  ally,.** in orde
ea30: 72 20 74 6f 20 63 6f 6f 72 64 69 6e 61 74 65 20  r to coordinate 
ea40: 61 63 63 65 73 73 20 62 65 74 77 65 65 6e 20 73  access between s
ea50: 65 70 61 72 61 74 65 20 64 61 74 61 62 61 73 65  eparate database
ea60: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 0a 2a 2a 20   connections.** 
ea70: 77 69 74 68 69 6e 20 74 68 69 73 20 70 72 6f 63  within this proc
ea80: 65 73 73 2c 20 62 75 74 20 61 6c 6c 20 6f 66 20  ess, but all of 
ea90: 74 68 61 74 20 69 73 20 68 61 6e 64 6c 65 64 20  that is handled 
eaa0: 69 6e 20 6d 65 6d 6f 72 79 20 61 6e 64 20 74 68  in memory and th
eab0: 65 0a 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 73  e.** operating s
eac0: 79 73 74 65 6d 20 64 6f 65 73 20 6e 6f 74 20 70  ystem does not p
ead0: 61 72 74 69 63 69 70 61 74 65 2e 0a 2a 2a 0a 2a  articipate..**.*
eae0: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
eaf0: 69 73 20 61 20 70 61 73 73 2d 74 68 72 6f 75 67  is a pass-throug
eb00: 68 20 74 6f 20 66 63 6e 74 6c 28 46 5f 53 45 54  h to fcntl(F_SET
eb10: 4c 4b 29 20 69 66 20 70 46 69 6c 65 20 69 73 20  LK) if pFile is 
eb20: 75 73 69 6e 67 0a 2a 2a 20 61 6e 79 20 56 46 53  using.** any VFS
eb30: 20 6f 74 68 65 72 20 74 68 61 6e 20 22 75 6e 69   other than "uni
eb40: 78 2d 65 78 63 6c 22 20 6f 72 20 69 66 20 70 46  x-excl" or if pF
eb50: 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e  ile is opened on
eb60: 20 22 75 6e 69 78 2d 65 78 63 6c 22 0a 2a 2a 20   "unix-excl".** 
eb70: 61 6e 64 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79  and is read-only
eb80: 2e 0a 2a 2a 0a 2a 2a 20 5a 65 72 6f 20 69 73 20  ..**.** Zero is 
eb90: 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20  returned if the 
eba0: 63 61 6c 6c 20 63 6f 6d 70 6c 65 74 65 73 20 73  call completes s
ebb0: 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 6f 72 20  uccessfully, or 
ebc0: 2d 31 20 69 66 20 61 20 63 61 6c 6c 0a 2a 2a 20  -1 if a call.** 
ebd0: 74 6f 20 66 63 6e 74 6c 28 29 20 66 61 69 6c 73  to fcntl() fails
ebe0: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20  . In this case, 
ebf0: 65 72 72 6e 6f 20 69 73 20 73 65 74 20 61 70 70  errno is set app
ec00: 72 6f 70 72 69 61 74 65 6c 79 20 28 62 79 20 66  ropriately (by f
ec10: 63 6e 74 6c 28 29 29 2e 0a 2a 2f 0a 73 74 61 74  cntl())..*/.stat
ec20: 69 63 20 69 6e 74 20 75 6e 69 78 46 69 6c 65 4c  ic int unixFileL
ec30: 6f 63 6b 28 75 6e 69 78 46 69 6c 65 20 2a 70 46  ock(unixFile *pF
ec40: 69 6c 65 2c 20 73 74 72 75 63 74 20 66 6c 6f 63  ile, struct floc
ec50: 6b 20 2a 70 4c 6f 63 6b 2c 20 69 6e 74 20 6e 52  k *pLock, int nR
ec60: 65 74 72 79 29 7b 0a 20 20 69 6e 74 20 72 63 3b  etry){.  int rc;
ec70: 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  .  unixInodeInfo
ec80: 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65   *pInode = pFile
ec90: 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 73 73 65  ->pInode;.  asse
eca0: 72 74 28 20 75 6e 69 78 4d 75 74 65 78 48 65 6c  rt( unixMutexHel
ecb0: 64 28 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  d() );.  assert(
ecc0: 20 70 49 6e 6f 64 65 21 3d 30 20 29 3b 0a 20 20   pInode!=0 );.  
ecd0: 69 66 28 20 28 28 70 46 69 6c 65 2d 3e 63 74 72  if( ((pFile->ctr
ece0: 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c  lFlags & UNIXFIL
ecf0: 45 5f 45 58 43 4c 29 21 3d 30 20 7c 7c 20 70 49  E_EXCL)!=0 || pI
ed00: 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f  node->bProcessLo
ed10: 63 6b 29 0a 20 20 20 26 26 20 28 28 70 46 69 6c  ck).   && ((pFil
ed20: 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 55  e->ctrlFlags & U
ed30: 4e 49 58 46 49 4c 45 5f 52 44 4f 4e 4c 59 29 3d  NIXFILE_RDONLY)=
ed40: 3d 30 29 0a 20 20 29 7b 0a 20 20 20 20 69 66 28  =0).  ){.    if(
ed50: 20 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73   pInode->bProces
ed60: 73 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20  sLock==0 ){.    
ed70: 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c    struct flock l
ed80: 6f 63 6b 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ock;.      asser
ed90: 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b  t( pInode->nLock
eda0: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 6c 6f 63  ==0 );.      loc
edb0: 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45  k.l_whence = SEE
edc0: 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20 6c 6f 63  K_SET;.      loc
edd0: 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52  k.l_start = SHAR
ede0: 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20  ED_FIRST;.      
edf0: 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41  lock.l_len = SHA
ee00: 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20  RED_SIZE;.      
ee10: 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f  lock.l_type = F_
ee20: 57 52 4c 43 4b 3b 0a 20 20 20 20 20 20 72 63 20  WRLCK;.      rc 
ee30: 3d 20 6f 73 46 63 6e 74 6c 28 70 46 69 6c 65 2d  = osFcntl(pFile-
ee40: 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f  >h, F_SETLK, &lo
ee50: 63 6b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ck);.      if( r
ee60: 63 3c 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b  c<0 ) return rc;
ee70: 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 62  .      pInode->b
ee80: 50 72 6f 63 65 73 73 4c 6f 63 6b 20 3d 20 31 3b  ProcessLock = 1;
ee90: 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e  .      pInode->n
eea0: 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73  Lock++;.    }els
eeb0: 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 30 3b  e{.      rc = 0;
eec0: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
eed0: 20 20 20 20 69 6e 74 20 69 20 3d 20 30 3b 20 20      int i = 0;  
eee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eef0: 20 20 20 20 0a 20 20 20 20 64 6f 20 7b 0a 20 20      .    do {.  
ef00: 20 20 20 20 72 63 20 3d 20 6f 73 46 63 6e 74 6c      rc = osFcntl
ef10: 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 53 45 54  (pFile->h, F_SET
ef20: 4c 4b 2c 20 70 4c 6f 63 6b 29 3b 0a 20 20 20 20  LK, pLock);.    
ef30: 20 20 69 66 28 20 72 63 20 26 26 20 6e 52 65 74    if( rc && nRet
ef40: 72 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 75  ry ){.         u
ef50: 73 6c 65 65 70 28 31 30 30 20 2a 20 28 2b 2b 69  sleep(100 * (++i
ef60: 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
ef70: 7d 77 68 69 6c 65 28 20 21 72 63 20 26 26 20 6e  }while( !rc && n
ef80: 52 65 74 72 79 2d 2d 20 29 3b 0a 20 20 7d 0a 20  Retry-- );.  }. 
ef90: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
efa0: 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69  *.** Lock the fi
efb0: 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b  le with the lock
efc0: 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70 61   specified by pa
efd0: 72 61 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63  rameter eFileLoc
efe0: 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68  k - one.** of th
eff0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
f000: 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 45  **     (1) SHARE
f010: 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32  D_LOCK.**     (2
f020: 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a  ) RESERVED_LOCK.
f030: 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49  **     (3) PENDI
f040: 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  NG_LOCK.**     (
f050: 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  4) EXCLUSIVE_LOC
f060: 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65  K.**.** Sometime
f070: 73 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e  s when requestin
f080: 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65  g one lock state
f090: 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63  , additional loc
f0a0: 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20  k states.** are 
f0b0: 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 77  inserted in betw
f0c0: 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e  een.  The lockin
f0d0: 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20  g might fail on 
f0e0: 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72  one of the later
f0f0: 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  .** transitions 
f100: 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b  leaving the lock
f110: 20 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74   state different
f120: 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74   from what it st
f130: 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69  arted but.** sti
f140: 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20  ll short of its 
f150: 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  goal.  The follo
f160: 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73  wing chart shows
f170: 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20   the allowed.** 
f180: 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20  transitions and 
f190: 74 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74  the inserted int
f1a0: 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 73  ermediate states
f1b0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43  :.**.**    UNLOC
f1c0: 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a  KED -> SHARED.**
f1d0: 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45      SHARED -> RE
f1e0: 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41  SERVED.**    SHA
f1f0: 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  RED -> (PENDING)
f200: 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
f210: 20 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20      RESERVED -> 
f220: 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43  (PENDING) -> EXC
f230: 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e  LUSIVE.**    PEN
f240: 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56  DING -> EXCLUSIV
f250: 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  E.**.** This rou
f260: 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69  tine will only i
f270: 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20  ncrease a lock. 
f280: 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33   Use the sqlite3
f290: 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f  OsUnlock().** ro
f2a0: 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61  utine to lower a
f2b0: 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a   locking level..
f2c0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
f2d0: 69 78 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  ixLock(sqlite3_f
f2e0: 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69  ile *id, int eFi
f2f0: 6c 65 4c 6f 63 6b 29 7b 0a 20 20 2f 2a 20 54 68  leLock){.  /* Th
f300: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 64 65 73 63  e following desc
f310: 72 69 62 65 73 20 74 68 65 20 69 6d 70 6c 65 6d  ribes the implem
f320: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
f330: 76 61 72 69 6f 75 73 20 6c 6f 63 6b 73 20 61 6e  various locks an
f340: 64 0a 20 20 2a 2a 20 6c 6f 63 6b 20 74 72 61 6e  d.  ** lock tran
f350: 73 69 74 69 6f 6e 73 20 69 6e 20 74 65 72 6d 73  sitions in terms
f360: 20 6f 66 20 74 68 65 20 50 4f 53 49 58 20 61 64   of the POSIX ad
f370: 76 69 73 6f 72 79 20 73 68 61 72 65 64 20 61 6e  visory shared an
f380: 64 20 65 78 63 6c 75 73 69 76 65 0a 20 20 2a 2a  d exclusive.  **
f390: 20 6c 6f 63 6b 20 70 72 69 6d 69 74 69 76 65 73   lock primitives
f3a0: 20 28 63 61 6c 6c 65 64 20 72 65 61 64 2d 6c 6f   (called read-lo
f3b0: 63 6b 73 20 61 6e 64 20 77 72 69 74 65 2d 6c 6f  cks and write-lo
f3c0: 63 6b 73 20 62 65 6c 6f 77 2c 20 74 6f 20 61 76  cks below, to av
f3d0: 6f 69 64 0a 20 20 2a 2a 20 63 6f 6e 66 75 73 69  oid.  ** confusi
f3e0: 6f 6e 20 77 69 74 68 20 53 51 4c 69 74 65 20 6c  on with SQLite l
f3f0: 6f 63 6b 20 6e 61 6d 65 73 29 2e 20 54 68 65 20  ock names). The 
f400: 61 6c 67 6f 72 69 74 68 6d 73 20 61 72 65 20 63  algorithms are c
f410: 6f 6d 70 6c 69 63 61 74 65 64 0a 20 20 2a 2a 20  omplicated.  ** 
f420: 73 6c 69 67 68 74 6c 79 20 69 6e 20 6f 72 64 65  slightly in orde
f430: 72 20 74 6f 20 62 65 20 63 6f 6d 70 61 74 69 62  r to be compatib
f440: 6c 65 20 77 69 74 68 20 77 69 6e 64 6f 77 73 20  le with windows 
f450: 73 79 73 74 65 6d 73 20 73 69 6d 75 6c 74 61 6e  systems simultan
f460: 65 6f 75 73 6c 79 0a 20 20 2a 2a 20 61 63 63 65  eously.  ** acce
f470: 73 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20 64  ssing the same d
f480: 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69 6e  atabase file, in
f490: 20 63 61 73 65 20 74 68 61 74 20 69 73 20 65 76   case that is ev
f4a0: 65 72 20 72 65 71 75 69 72 65 64 2e 0a 20 20 2a  er required..  *
f4b0: 2a 0a 20 20 2a 2a 20 53 79 6d 62 6f 6c 73 20 64  *.  ** Symbols d
f4c0: 65 66 69 6e 65 64 20 69 6e 20 6f 73 2e 68 20 69  efined in os.h i
f4d0: 6e 64 65 6e 74 69 66 79 20 74 68 65 20 27 70 65  ndentify the 'pe
f4e0: 6e 64 69 6e 67 20 62 79 74 65 27 20 61 6e 64 20  nding byte' and 
f4f0: 74 68 65 20 27 72 65 73 65 72 76 65 64 0a 20 20  the 'reserved.  
f500: 2a 2a 20 62 79 74 65 27 2c 20 65 61 63 68 20 73  ** byte', each s
f510: 69 6e 67 6c 65 20 62 79 74 65 73 20 61 74 20 77  ingle bytes at w
f520: 65 6c 6c 20 6b 6e 6f 77 6e 20 6f 66 66 73 65 74  ell known offset
f530: 73 2c 20 61 6e 64 20 74 68 65 20 27 73 68 61 72  s, and the 'shar
f540: 65 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e  ed byte.  ** ran
f550: 67 65 27 2c 20 61 20 72 61 6e 67 65 20 6f 66 20  ge', a range of 
f560: 35 31 30 20 62 79 74 65 73 20 61 74 20 61 20 77  510 bytes at a w
f570: 65 6c 6c 20 6b 6e 6f 77 6e 20 6f 66 66 73 65 74  ell known offset
f580: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 6f 20 6f  ..  **.  ** To o
f590: 62 74 61 69 6e 20 61 20 53 48 41 52 45 44 20 6c  btain a SHARED l
f5a0: 6f 63 6b 2c 20 61 20 72 65 61 64 2d 6c 6f 63 6b  ock, a read-lock
f5b0: 20 69 73 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20   is obtained on 
f5c0: 74 68 65 20 27 70 65 6e 64 69 6e 67 0a 20 20 2a  the 'pending.  *
f5d0: 2a 20 62 79 74 65 27 2e 20 20 49 66 20 74 68 69  * byte'.  If thi
f5e0: 73 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c  s is successful,
f5f0: 20 61 20 72 61 6e 64 6f 6d 20 62 79 74 65 20 66   a random byte f
f600: 72 6f 6d 20 74 68 65 20 27 73 68 61 72 65 64 20  rom the 'shared 
f610: 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27  byte.  ** range'
f620: 20 69 73 20 72 65 61 64 2d 6c 6f 63 6b 65 64 20   is read-locked 
f630: 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20  and the lock on 
f640: 74 68 65 20 27 70 65 6e 64 69 6e 67 20 62 79 74  the 'pending byt
f650: 65 27 20 72 65 6c 65 61 73 65 64 2e 0a 20 20 2a  e' released..  *
f660: 2a 0a 20 20 2a 2a 20 41 20 70 72 6f 63 65 73 73  *.  ** A process
f670: 20 6d 61 79 20 6f 6e 6c 79 20 6f 62 74 61 69 6e   may only obtain
f680: 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
f690: 20 61 66 74 65 72 20 69 74 20 68 61 73 20 61 20   after it has a 
f6a0: 53 48 41 52 45 44 20 6c 6f 63 6b 2e 0a 20 20 2a  SHARED lock..  *
f6b0: 2a 20 41 20 52 45 53 45 52 56 45 44 20 6c 6f 63  * A RESERVED loc
f6c0: 6b 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64  k is implemented
f6d0: 20 62 79 20 67 72 61 62 62 69 6e 67 20 61 20 77   by grabbing a w
f6e0: 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65  rite-lock on the
f6f0: 0a 20 20 2a 2a 20 27 72 65 73 65 72 76 65 64 20  .  ** 'reserved 
f700: 62 79 74 65 27 2e 20 0a 20 20 2a 2a 0a 20 20 2a  byte'. .  **.  *
f710: 2a 20 41 20 70 72 6f 63 65 73 73 20 6d 61 79 20  * A process may 
f720: 6f 6e 6c 79 20 6f 62 74 61 69 6e 20 61 20 50 45  only obtain a PE
f730: 4e 44 49 4e 47 20 6c 6f 63 6b 20 61 66 74 65 72  NDING lock after
f740: 20 69 74 20 68 61 73 20 6f 62 74 61 69 6e 65 64   it has obtained
f750: 20 61 0a 20 20 2a 2a 20 53 48 41 52 45 44 20 6c   a.  ** SHARED l
f760: 6f 63 6b 2e 20 41 20 50 45 4e 44 49 4e 47 20 6c  ock. A PENDING l
f770: 6f 63 6b 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74  ock is implement
f780: 65 64 20 62 79 20 6f 62 74 61 69 6e 69 6e 67 20  ed by obtaining 
f790: 61 20 77 72 69 74 65 2d 6c 6f 63 6b 0a 20 20 2a  a write-lock.  *
f7a0: 2a 20 6f 6e 20 74 68 65 20 27 70 65 6e 64 69 6e  * on the 'pendin
f7b0: 67 20 62 79 74 65 27 2e 20 54 68 69 73 20 65 6e  g byte'. This en
f7c0: 73 75 72 65 73 20 74 68 61 74 20 6e 6f 20 6e 65  sures that no ne
f7d0: 77 20 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 63  w SHARED locks c
f7e0: 61 6e 20 62 65 0a 20 20 2a 2a 20 6f 62 74 61 69  an be.  ** obtai
f7f0: 6e 65 64 2c 20 62 75 74 20 65 78 69 73 74 69 6e  ned, but existin
f800: 67 20 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 61  g SHARED locks a
f810: 72 65 20 61 6c 6c 6f 77 65 64 20 74 6f 20 70 65  re allowed to pe
f820: 72 73 69 73 74 2e 20 41 20 70 72 6f 63 65 73 73  rsist. A process
f830: 0a 20 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 68  .  ** does not h
f840: 61 76 65 20 74 6f 20 6f 62 74 61 69 6e 20 61 20  ave to obtain a 
f850: 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e  RESERVED lock on
f860: 20 74 68 65 20 77 61 79 20 74 6f 20 61 20 50 45   the way to a PE
f870: 4e 44 49 4e 47 20 6c 6f 63 6b 2e 0a 20 20 2a 2a  NDING lock..  **
f880: 20 54 68 69 73 20 70 72 6f 70 65 72 74 79 20 69   This property i
f890: 73 20 75 73 65 64 20 62 79 20 74 68 65 20 61 6c  s used by the al
f8a0: 67 6f 72 69 74 68 6d 20 66 6f 72 20 72 6f 6c 6c  gorithm for roll
f8b0: 69 6e 67 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e  ing back a journ
f8c0: 61 6c 20 66 69 6c 65 0a 20 20 2a 2a 20 61 66 74  al file.  ** aft
f8d0: 65 72 20 61 20 63 72 61 73 68 2e 0a 20 20 2a 2a  er a crash..  **
f8e0: 0a 20 20 2a 2a 20 41 6e 20 45 58 43 4c 55 53 49  .  ** An EXCLUSI
f8f0: 56 45 20 6c 6f 63 6b 2c 20 6f 62 74 61 69 6e 65  VE lock, obtaine
f900: 64 20 61 66 74 65 72 20 61 20 50 45 4e 44 49 4e  d after a PENDIN
f910: 47 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20  G lock is held, 
f920: 69 73 0a 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e  is.  ** implemen
f930: 74 65 64 20 62 79 20 6f 62 74 61 69 6e 69 6e 67  ted by obtaining
f940: 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e   a write-lock on
f950: 20 74 68 65 20 65 6e 74 69 72 65 20 27 73 68 61   the entire 'sha
f960: 72 65 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61  red byte.  ** ra
f970: 6e 67 65 27 2e 20 53 69 6e 63 65 20 61 6c 6c 20  nge'. Since all 
f980: 6f 74 68 65 72 20 6c 6f 63 6b 73 20 72 65 71 75  other locks requ
f990: 69 72 65 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  ire a read-lock 
f9a0: 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 62 79  on one of the by
f9b0: 74 65 73 0a 20 20 2a 2a 20 77 69 74 68 69 6e 20  tes.  ** within 
f9c0: 74 68 69 73 20 72 61 6e 67 65 2c 20 74 68 69 73  this range, this
f9d0: 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 6e 6f   ensures that no
f9e0: 20 6f 74 68 65 72 20 6c 6f 63 6b 73 20 61 72 65   other locks are
f9f0: 20 68 65 6c 64 20 6f 6e 20 74 68 65 0a 20 20 2a   held on the.  *
fa00: 2a 20 64 61 74 61 62 61 73 65 2e 20 0a 20 20 2a  * database. .  *
fa10: 2a 0a 20 20 2a 2a 20 54 68 65 20 72 65 61 73 6f  *.  ** The reaso
fa20: 6e 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20  n a single byte 
fa30: 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 20 69  cannot be used i
fa40: 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20 27 73  nstead of the 's
fa50: 68 61 72 65 64 20 62 79 74 65 0a 20 20 2a 2a 20  hared byte.  ** 
fa60: 72 61 6e 67 65 27 20 69 73 20 74 68 61 74 20 73  range' is that s
fa70: 6f 6d 65 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  ome versions of 
fa80: 77 69 6e 64 6f 77 73 20 64 6f 20 6e 6f 74 20 73  windows do not s
fa90: 75 70 70 6f 72 74 20 72 65 61 64 2d 6c 6f 63 6b  upport read-lock
faa0: 73 2e 20 42 79 0a 20 20 2a 2a 20 6c 6f 63 6b 69  s. By.  ** locki
fab0: 6e 67 20 61 20 72 61 6e 64 6f 6d 20 62 79 74 65  ng a random byte
fac0: 20 66 72 6f 6d 20 61 20 72 61 6e 67 65 2c 20 63   from a range, c
fad0: 6f 6e 63 75 72 72 65 6e 74 20 53 48 41 52 45 44  oncurrent SHARED
fae0: 20 6c 6f 63 6b 73 20 6d 61 79 20 65 78 69 73 74   locks may exist
faf0: 0a 20 20 2a 2a 20 65 76 65 6e 20 69 66 20 74 68  .  ** even if th
fb00: 65 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69 74  e locking primit
fb10: 69 76 65 20 75 73 65 64 20 69 73 20 61 6c 77 61  ive used is alwa
fb20: 79 73 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 2e  ys a write-lock.
fb30: 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  .  */.  int rc =
fb40: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e   SQLITE_OK;.  un
fb50: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
fb60: 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
fb70: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
fb80: 70 49 6e 6f 64 65 3b 0a 20 20 73 74 72 75 63 74  pInode;.  struct
fb90: 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 69   flock lock;.  i
fba0: 6e 74 20 74 45 72 72 6e 6f 20 3d 20 30 3b 0a 0a  nt tErrno = 0;..
fbb0: 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
fbc0: 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c  );.  OSTRACE(("L
fbd0: 4f 43 4b 20 20 20 20 25 64 20 25 73 20 77 61 73  OCK    %d %s was
fbe0: 20 25 73 28 25 73 2c 25 64 29 20 70 69 64 3d 25   %s(%s,%d) pid=%
fbf0: 64 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69  d (unix)\n", pFi
fc00: 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 61 7a 46  le->h,.      azF
fc10: 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63  ileLock(eFileLoc
fc20: 6b 29 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 70  k), azFileLock(p
fc30: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29  File->eFileLock)
fc40: 2c 0a 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f  ,.      azFileLo
fc50: 63 6b 28 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  ck(pFile->pInode
fc60: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 70 46  ->eFileLock), pF
fc70: 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 53 68  ile->pInode->nSh
fc80: 61 72 65 64 20 2c 20 67 65 74 70 69 64 28 29 29  ared , getpid())
fc90: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72  );..  /* If ther
fca0: 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 6c  e is already a l
fcb0: 6f 63 6b 20 6f 66 20 74 68 69 73 20 74 79 70 65  ock of this type
fcc0: 20 6f 72 20 6d 6f 72 65 20 72 65 73 74 72 69 63   or more restric
fcd0: 74 69 76 65 20 6f 6e 20 74 68 65 0a 20 20 2a 2a  tive on the.  **
fce0: 20 75 6e 69 78 46 69 6c 65 2c 20 64 6f 20 6e 6f   unixFile, do no
fcf0: 74 68 69 6e 67 2e 20 44 6f 6e 27 74 20 75 73 65  thing. Don't use
fd00: 20 74 68 65 20 65 6e 64 5f 6c 6f 63 6b 3a 20 65   the end_lock: e
fd10: 78 69 74 20 70 61 74 68 2c 20 61 73 0a 20 20 2a  xit path, as.  *
fd20: 2a 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78  * unixEnterMutex
fd30: 28 29 20 68 61 73 6e 27 74 20 62 65 65 6e 20 63  () hasn't been c
fd40: 61 6c 6c 65 64 20 79 65 74 2e 0a 20 20 2a 2f 0a  alled yet..  */.
fd50: 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69    if( pFile->eFi
fd60: 6c 65 4c 6f 63 6b 3e 3d 65 46 69 6c 65 4c 6f 63  leLock>=eFileLoc
fd70: 6b 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45  k ){.    OSTRACE
fd80: 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73  (("LOCK    %d %s
fd90: 20 6f 6b 20 28 61 6c 72 65 61 64 79 20 68 65 6c   ok (already hel
fda0: 64 29 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46  d) (unix)\n", pF
fdb0: 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20  ile->h,.        
fdc0: 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65      azFileLock(e
fdd0: 46 69 6c 65 4c 6f 63 6b 29 29 29 3b 0a 20 20 20  FileLock)));.   
fde0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
fdf0: 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b  K;.  }..  /* Mak
fe00: 65 20 73 75 72 65 20 74 68 65 20 6c 6f 63 6b 69  e sure the locki
fe10: 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73 20 63  ng sequence is c
fe20: 6f 72 72 65 63 74 2e 0a 20 20 2a 2a 20 20 28 31  orrect..  **  (1
fe30: 29 20 57 65 20 6e 65 76 65 72 20 6d 6f 76 65 20  ) We never move 
fe40: 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64 20 74 6f  from unlocked to
fe50: 20 61 6e 79 74 68 69 6e 67 20 68 69 67 68 65 72   anything higher
fe60: 20 74 68 61 6e 20 73 68 61 72 65 64 20 6c 6f 63   than shared loc
fe70: 6b 2e 0a 20 20 2a 2a 20 20 28 32 29 20 53 51 4c  k..  **  (2) SQL
fe80: 69 74 65 20 6e 65 76 65 72 20 65 78 70 6c 69 63  ite never explic
fe90: 69 74 6c 79 20 72 65 71 75 65 73 74 73 20 61 20  itly requests a 
fea0: 70 65 6e 64 69 67 20 6c 6f 63 6b 2e 0a 20 20 2a  pendig lock..  *
feb0: 2a 20 20 28 33 29 20 41 20 73 68 61 72 65 64 20  *  (3) A shared 
fec0: 6c 6f 63 6b 20 69 73 20 61 6c 77 61 79 73 20 68  lock is always h
fed0: 65 6c 64 20 77 68 65 6e 20 61 20 72 65 73 65 72  eld when a reser
fee0: 76 65 20 6c 6f 63 6b 20 69 73 20 72 65 71 75 65  ve lock is reque
fef0: 73 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  sted..  */.  ass
ff00: 65 72 74 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c  ert( pFile->eFil
ff10: 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c  eLock!=NO_LOCK |
ff20: 7c 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41  | eFileLock==SHA
ff30: 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73  RED_LOCK );.  as
ff40: 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 21  sert( eFileLock!
ff50: 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b  =PENDING_LOCK );
ff60: 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65  .  assert( eFile
ff70: 4c 6f 63 6b 21 3d 52 45 53 45 52 56 45 44 5f 4c  Lock!=RESERVED_L
ff80: 4f 43 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 65 46  OCK || pFile->eF
ff90: 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
ffa0: 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 54 68  LOCK );..  /* Th
ffb0: 69 73 20 6d 75 74 65 78 20 69 73 20 6e 65 65 64  is mutex is need
ffc0: 65 64 20 62 65 63 61 75 73 65 20 70 46 69 6c 65  ed because pFile
ffd0: 2d 3e 70 49 6e 6f 64 65 20 69 73 20 73 68 61 72  ->pInode is shar
ffe0: 65 64 20 61 63 72 6f 73 73 20 74 68 72 65 61 64  ed across thread
fff0: 73 0a 20 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74  s.  */.  unixEnt
10000 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 70 49 6e  erMutex();.  pIn
10010 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e  ode = pFile->pIn
10020 6f 64 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 73 6f  ode;..  /* If so
10030 6d 65 20 74 68 72 65 61 64 20 75 73 69 6e 67 20  me thread using 
10040 74 68 69 73 20 50 49 44 20 68 61 73 20 61 20 6c  this PID has a l
10050 6f 63 6b 20 76 69 61 20 61 20 64 69 66 66 65 72  ock via a differ
10060 65 6e 74 20 75 6e 69 78 46 69 6c 65 2a 0a 20 20  ent unixFile*.  
10070 2a 2a 20 68 61 6e 64 6c 65 20 74 68 61 74 20 70  ** handle that p
10080 72 65 63 6c 75 64 65 73 20 74 68 65 20 72 65 71  recludes the req
10090 75 65 73 74 65 64 20 6c 6f 63 6b 2c 20 72 65 74  uested lock, ret
100a0 75 72 6e 20 42 55 53 59 2e 0a 20 20 2a 2f 0a 20  urn BUSY..  */. 
100b0 20 69 66 28 20 28 70 46 69 6c 65 2d 3e 65 46 69   if( (pFile->eFi
100c0 6c 65 4c 6f 63 6b 21 3d 70 49 6e 6f 64 65 2d 3e  leLock!=pInode->
100d0 65 46 69 6c 65 4c 6f 63 6b 20 26 26 20 0a 20 20  eFileLock && .  
100e0 20 20 20 20 20 20 20 20 28 70 49 6e 6f 64 65 2d          (pInode-
100f0 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 50 45 4e 44  >eFileLock>=PEND
10100 49 4e 47 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c  ING_LOCK || eFil
10110 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43  eLock>SHARED_LOC
10120 4b 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 63 20  K)).  ){.    rc 
10130 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
10140 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b     goto end_lock
10150 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61  ;.  }..  /* If a
10160 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 73 20   SHARED lock is 
10170 72 65 71 75 65 73 74 65 64 2c 20 61 6e 64 20 73  requested, and s
10180 6f 6d 65 20 74 68 72 65 61 64 20 75 73 69 6e 67  ome thread using
10190 20 74 68 69 73 20 50 49 44 20 61 6c 72 65 61 64   this PID alread
101a0 79 0a 20 20 2a 2a 20 68 61 73 20 61 20 53 48 41  y.  ** has a SHA
101b0 52 45 44 20 6f 72 20 52 45 53 45 52 56 45 44 20  RED or RESERVED 
101c0 6c 6f 63 6b 2c 20 74 68 65 6e 20 69 6e 63 72 65  lock, then incre
101d0 6d 65 6e 74 20 72 65 66 65 72 65 6e 63 65 20 63  ment reference c
101e0 6f 75 6e 74 73 20 61 6e 64 0a 20 20 2a 2a 20 72  ounts and.  ** r
101f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
10200 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c  .  */.  if( eFil
10210 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
10220 43 4b 20 26 26 20 0a 20 20 20 20 20 20 28 70 49  CK && .      (pI
10230 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  node->eFileLock=
10240 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20  =SHARED_LOCK || 
10250 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
10260 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  k==RESERVED_LOCK
10270 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ) ){.    assert(
10280 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52   eFileLock==SHAR
10290 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 61  ED_LOCK );.    a
102a0 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 65 46  ssert( pFile->eF
102b0 69 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20  ileLock==0 );.  
102c0 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65    assert( pInode
102d0 2d 3e 6e 53 68 61 72 65 64 3e 30 20 29 3b 0a 20  ->nShared>0 );. 
102e0 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
102f0 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43  ock = SHARED_LOC
10300 4b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e  K;.    pInode->n
10310 53 68 61 72 65 64 2b 2b 3b 0a 20 20 20 20 70 49  Shared++;.    pI
10320 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20  node->nLock++;. 
10330 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b     goto end_lock
10340 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 41 20 50  ;.  }...  /* A P
10350 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 6e  ENDING lock is n
10360 65 65 64 65 64 20 62 65 66 6f 72 65 20 61 63 71  eeded before acq
10370 75 69 72 69 6e 67 20 61 20 53 48 41 52 45 44 20  uiring a SHARED 
10380 6c 6f 63 6b 20 61 6e 64 20 62 65 66 6f 72 65 0a  lock and before.
10390 20 20 2a 2a 20 61 63 71 75 69 72 69 6e 67 20 61    ** acquiring a
103a0 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
103b0 2e 20 20 46 6f 72 20 74 68 65 20 53 48 41 52 45  .  For the SHARE
103c0 44 20 6c 6f 63 6b 2c 20 74 68 65 20 50 45 4e 44  D lock, the PEND
103d0 49 4e 47 20 77 69 6c 6c 0a 20 20 2a 2a 20 62 65  ING will.  ** be
103e0 20 72 65 6c 65 61 73 65 64 2e 0a 20 20 2a 2f 0a   released..  */.
103f0 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31    lock.l_len = 1
10400 4c 3b 0a 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e  L;.  lock.l_when
10410 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20  ce = SEEK_SET;. 
10420 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d   if( eFileLock==
10430 53 48 41 52 45 44 5f 4c 4f 43 4b 20 0a 20 20 20  SHARED_LOCK .   
10440 20 20 20 7c 7c 20 28 65 46 69 6c 65 4c 6f 63 6b     || (eFileLock
10450 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
10460 20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65   && pFile->eFile
10470 4c 6f 63 6b 3c 50 45 4e 44 49 4e 47 5f 4c 4f 43  Lock<PENDING_LOC
10480 4b 29 0a 20 20 29 7b 0a 20 20 20 20 6c 6f 63 6b  K).  ){.    lock
10490 2e 6c 5f 74 79 70 65 20 3d 20 28 65 46 69 6c 65  .l_type = (eFile
104a0 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
104b0 4b 3f 46 5f 52 44 4c 43 4b 3a 46 5f 57 52 4c 43  K?F_RDLCK:F_WRLC
104c0 4b 29 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73  K);.    lock.l_s
104d0 74 61 72 74 20 3d 20 50 45 4e 44 49 4e 47 5f 42  tart = PENDING_B
104e0 59 54 45 3b 0a 20 20 20 20 69 66 28 20 75 6e 69  YTE;.    if( uni
104f0 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c  xFileLock(pFile,
10500 20 26 6c 6f 63 6b 2c 20 30 29 20 29 7b 0a 20 20   &lock, 0) ){.  
10510 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72      tErrno = err
10520 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  no;.      rc = s
10530 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
10540 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c  sixError(tErrno,
10550 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f   SQLITE_IOERR_LO
10560 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 49  CK);.      if( I
10570 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29  S_LOCK_ERROR(rc)
10580 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74 6f 72   ){.        stor
10590 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65  eLastErrno(pFile
105a0 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20  , tErrno);.     
105b0 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e   }.      goto en
105c0 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20  d_lock;.    }.  
105d0 7d 0a 0a 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74  }...  /* If cont
105e0 72 6f 6c 20 67 65 74 73 20 74 6f 20 74 68 69 73  rol gets to this
105f0 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 61 63 74   point, then act
10600 75 61 6c 6c 79 20 67 6f 20 61 68 65 61 64 20 61  ually go ahead a
10610 6e 64 20 6d 61 6b 65 0a 20 20 2a 2a 20 6f 70 65  nd make.  ** ope
10620 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 63 61  rating system ca
10630 6c 6c 73 20 66 6f 72 20 74 68 65 20 73 70 65 63  lls for the spec
10640 69 66 69 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2f  ified lock..  */
10650 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b  .  if( eFileLock
10660 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b  ==SHARED_LOCK ){
10670 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e  .    assert( pIn
10680 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3d 3d 30 20  ode->nShared==0 
10690 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
106a0 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
106b0 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
106c0 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
106d0 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 4e 6f 77 20   );..    /* Now 
106e0 67 65 74 20 74 68 65 20 72 65 61 64 2d 6c 6f 63  get the read-loc
106f0 6b 20 2a 2f 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f  k */.    lock.l_
10700 73 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46  start = SHARED_F
10710 49 52 53 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c  IRST;.    lock.l
10720 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49  _len = SHARED_SI
10730 5a 45 3b 0a 20 20 20 20 69 66 28 20 75 6e 69 78  ZE;.    if( unix
10740 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20  FileLock(pFile, 
10750 26 6c 6f 63 6b 2c 20 30 29 20 29 7b 0a 20 20 20  &lock, 0) ){.   
10760 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e     tErrno = errn
10770 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  o;.      rc = sq
10780 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73  liteErrorFromPos
10790 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20  ixError(tErrno, 
107a0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43  SQLITE_IOERR_LOC
107b0 4b 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  K);.    }..    /
107c0 2a 20 44 72 6f 70 20 74 68 65 20 74 65 6d 70 6f  * Drop the tempo
107d0 72 61 72 79 20 50 45 4e 44 49 4e 47 20 6c 6f 63  rary PENDING loc
107e0 6b 20 2a 2f 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f  k */.    lock.l_
107f0 73 74 61 72 74 20 3d 20 50 45 4e 44 49 4e 47 5f  start = PENDING_
10800 42 59 54 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c  BYTE;.    lock.l
10810 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 20 20 20 20 6c  _len = 1L;.    l
10820 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55  ock.l_type = F_U
10830 4e 4c 43 4b 3b 0a 20 20 20 20 69 66 28 20 75 6e  NLCK;.    if( un
10840 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65  ixFileLock(pFile
10850 2c 20 26 6c 6f 63 6b 2c 20 31 30 29 20 26 26 20  , &lock, 10) && 
10860 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
10870 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63  .      /* This c
10880 6f 75 6c 64 20 68 61 70 70 65 6e 20 77 69 74 68  ould happen with
10890 20 61 20 6e 65 74 77 6f 72 6b 20 6d 6f 75 6e 74   a network mount
108a0 20 2a 2f 0a 20 20 20 20 20 20 74 45 72 72 6e 6f   */.      tErrno
108b0 20 3d 20 65 72 72 6e 6f 3b 0a 23 69 66 20 4f 53   = errno;.#if OS
108c0 4c 4f 43 4b 49 4e 47 5f 43 48 45 43 4b 5f 42 55  LOCKING_CHECK_BU
108d0 53 59 5f 49 4f 45 52 52 0a 20 20 20 20 20 20 72  SY_IOERR.      r
108e0 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46  c = sqliteErrorF
108f0 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45  romPosixError(tE
10900 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45  rrno, SQLITE_IOE
10910 52 52 5f 55 4e 4c 4f 43 4b 29 3b 20 0a 23 65 6c  RR_UNLOCK); .#el
10920 73 65 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  se.      rc = SQ
10930 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43  LITE_IOERR_UNLOC
10940 4b 3b 20 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d  K; .#endif.    }
10950 0a 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ..    if( rc ){.
10960 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43        if( IS_LOC
10970 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20  K_ERROR(rc) ){. 
10980 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74         storeLast
10990 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72  Errno(pFile, tEr
109a0 72 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rno);.      }.  
109b0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63      goto end_loc
109c0 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  k;.    }else{.  
109d0 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
109e0 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f  Lock = SHARED_LO
109f0 43 4b 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65  CK;.      pInode
10a00 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 20  ->nLock++;.     
10a10 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
10a20 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65   = 1;.    }.  }e
10a30 6c 73 65 20 69 66 28 20 65 46 69 6c 65 4c 6f 63  lse if( eFileLoc
10a40 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
10a50 4b 20 26 26 20 70 49 6e 6f 64 65 2d 3e 6e 53 68  K && pInode->nSh
10a60 61 72 65 64 3e 31 20 29 7b 0a 20 20 20 20 2f 2a  ared>1 ){.    /*
10a70 20 57 65 20 61 72 65 20 74 72 79 69 6e 67 20 66   We are trying f
10a80 6f 72 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  or an exclusive 
10a90 6c 6f 63 6b 20 62 75 74 20 61 6e 6f 74 68 65 72  lock but another
10aa0 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 0a   thread in this.
10ab0 20 20 20 20 2a 2a 20 73 61 6d 65 20 70 72 6f 63      ** same proc
10ac0 65 73 73 20 69 73 20 73 74 69 6c 6c 20 68 6f 6c  ess is still hol
10ad0 64 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c 6f  ding a shared lo
10ae0 63 6b 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  ck. */.    rc = 
10af0 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d  SQLITE_BUSY;.  }
10b00 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65  else{.    /* The
10b10 20 72 65 71 75 65 73 74 20 77 61 73 20 66 6f 72   request was for
10b20 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 45   a RESERVED or E
10b30 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20  XCLUSIVE lock.  
10b40 49 74 20 69 73 0a 20 20 20 20 2a 2a 20 61 73 73  It is.    ** ass
10b50 75 6d 65 64 20 74 68 61 74 20 74 68 65 72 65 20  umed that there 
10b60 69 73 20 61 20 53 48 41 52 45 44 20 6f 72 20 67  is a SHARED or g
10b70 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74  reater lock on t
10b80 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 61  he file.    ** a
10b90 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20  lready..    */. 
10ba0 20 20 20 61 73 73 65 72 74 28 20 30 21 3d 70 46     assert( 0!=pF
10bb0 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 29  ile->eFileLock )
10bc0 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70  ;.    lock.l_typ
10bd0 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 0a 20 20  e = F_WRLCK;..  
10be0 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c    assert( eFileL
10bf0 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ock==RESERVED_LO
10c00 43 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3d  CK || eFileLock=
10c10 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
10c20 29 3b 0a 20 20 20 20 69 66 28 20 65 46 69 6c 65  );.    if( eFile
10c30 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c  Lock==RESERVED_L
10c40 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 6c 6f 63  OCK ){.      loc
10c50 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 52 45 53 45  k.l_start = RESE
10c60 52 56 45 44 5f 42 59 54 45 3b 0a 20 20 20 20 20  RVED_BYTE;.     
10c70 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 4c   lock.l_len = 1L
10c80 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
10c90 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20     lock.l_start 
10ca0 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a  = SHARED_FIRST;.
10cb0 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e        lock.l_len
10cc0 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a   = SHARED_SIZE;.
10cd0 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 75      }..    if( u
10ce0 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c  nixFileLock(pFil
10cf0 65 2c 20 26 6c 6f 63 6b 2c 20 30 29 20 29 7b 0a  e, &lock, 0) ){.
10d00 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65        tErrno = e
10d10 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d  rrno;.      rc =
10d20 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d   sqliteErrorFrom
10d30 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e  PosixError(tErrn
10d40 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  o, SQLITE_IOERR_
10d50 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28  LOCK);.      if(
10d60 20 72 63 21 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc!=SQLITE_BUSY
10d70 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74 6f 72   ){.        stor
10d80 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65  eLastErrno(pFile
10d90 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20  , tErrno);.     
10da0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a   }.    }.  }.  .
10db0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
10dc0 45 42 55 47 0a 20 20 2f 2a 20 53 65 74 20 75 70  EBUG.  /* Set up
10dd0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
10de0 2d 63 6f 75 6e 74 65 72 20 63 68 61 6e 67 65 20  -counter change 
10df0 63 68 65 63 6b 69 6e 67 20 66 6c 61 67 73 20 77  checking flags w
10e00 68 65 6e 0a 20 20 2a 2a 20 74 72 61 6e 73 69 74  hen.  ** transit
10e10 69 6f 6e 69 6e 67 20 66 72 6f 6d 20 61 20 53 48  ioning from a SH
10e20 41 52 45 44 20 74 6f 20 61 20 52 45 53 45 52 56  ARED to a RESERV
10e30 45 44 20 6c 6f 63 6b 2e 20 20 54 68 65 20 63 68  ED lock.  The ch
10e40 61 6e 67 65 0a 20 20 2a 2a 20 66 72 6f 6d 20 53  ange.  ** from S
10e50 48 41 52 45 44 20 74 6f 20 52 45 53 45 52 56 45  HARED to RESERVE
10e60 44 20 6d 61 72 6b 73 20 74 68 65 20 62 65 67 69  D marks the begi
10e70 6e 6e 69 6e 67 20 6f 66 20 61 20 6e 6f 72 6d 61  nning of a norma
10e80 6c 0a 20 20 2a 2a 20 77 72 69 74 65 20 6f 70 65  l.  ** write ope
10e90 72 61 74 69 6f 6e 20 28 6e 6f 74 20 61 20 68 6f  ration (not a ho
10ea0 74 20 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61  t journal rollba
10eb0 63 6b 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ck)..  */.  if( 
10ec0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20  rc==SQLITE_OK.  
10ed0 20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65   && pFile->eFile
10ee0 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock<=SHARED_LOC
10ef0 4b 0a 20 20 20 26 26 20 65 46 69 6c 65 4c 6f 63  K.   && eFileLoc
10f00 6b 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  k==RESERVED_LOCK
10f10 0a 20 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  .  ){.    pFile-
10f20 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 20 3d  >transCntrChng =
10f30 20 30 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 64   0;.    pFile->d
10f40 62 55 70 64 61 74 65 20 3d 20 30 3b 0a 20 20 20  bUpdate = 0;.   
10f50 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c   pFile->inNormal
10f60 57 72 69 74 65 20 3d 20 31 3b 0a 20 20 7d 0a 23  Write = 1;.  }.#
10f70 65 6e 64 69 66 0a 0a 0a 20 20 69 66 28 20 72 63  endif...  if( rc
10f80 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
10f90 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
10fa0 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b  ock = eFileLock;
10fb0 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69  .    pInode->eFi
10fc0 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f  leLock = eFileLo
10fd0 63 6b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ck;.  }else if( 
10fe0 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55  eFileLock==EXCLU
10ff0 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  SIVE_LOCK ){.   
11000 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
11010 6b 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  k = PENDING_LOCK
11020 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46  ;.    pInode->eF
11030 69 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e 44 49 4e  ileLock = PENDIN
11040 47 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a 0a 65 6e 64  G_LOCK;.  }..end
11050 5f 6c 6f 63 6b 3a 0a 20 20 75 6e 69 78 4c 65 61  _lock:.  unixLea
11060 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53 54  veMutex();.  OST
11070 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25  RACE(("LOCK    %
11080 64 20 25 73 20 25 73 20 28 75 6e 69 78 29 5c 6e  d %s %s (unix)\n
11090 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 61 7a 46  ", pFile->h, azF
110a0 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63  ileLock(eFileLoc
110b0 6b 29 2c 20 0a 20 20 20 20 20 20 72 63 3d 3d 53  k), .      rc==S
110c0 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20  QLITE_OK ? "ok" 
110d0 3a 20 22 66 61 69 6c 65 64 22 29 29 3b 0a 20 20  : "failed"));.  
110e0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
110f0 0a 2a 2a 20 41 64 64 20 74 68 65 20 66 69 6c 65  .** Add the file
11100 20 64 65 73 63 72 69 70 74 6f 72 20 75 73 65 64   descriptor used
11110 20 62 79 20 66 69 6c 65 20 68 61 6e 64 6c 65 20   by file handle 
11120 70 46 69 6c 65 20 74 6f 20 74 68 65 20 63 6f 72  pFile to the cor
11130 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 70 55  responding.** pU
11140 6e 75 73 65 64 20 6c 69 73 74 2e 0a 2a 2f 0a 73  nused list..*/.s
11150 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 50 65  tatic void setPe
11160 6e 64 69 6e 67 46 64 28 75 6e 69 78 46 69 6c 65  ndingFd(unixFile
11170 20 2a 70 46 69 6c 65 29 7b 0a 20 20 75 6e 69 78   *pFile){.  unix
11180 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64  InodeInfo *pInod
11190 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  e = pFile->pInod
111a0 65 3b 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46  e;.  UnixUnusedF
111b0 64 20 2a 70 20 3d 20 70 46 69 6c 65 2d 3e 70 55  d *p = pFile->pU
111c0 6e 75 73 65 64 3b 0a 20 20 70 2d 3e 70 4e 65 78  nused;.  p->pNex
111d0 74 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 55 6e 75  t = pInode->pUnu
111e0 73 65 64 3b 0a 20 20 70 49 6e 6f 64 65 2d 3e 70  sed;.  pInode->p
111f0 55 6e 75 73 65 64 20 3d 20 70 3b 0a 20 20 70 46  Unused = p;.  pF
11200 69 6c 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20 70  ile->h = -1;.  p
11210 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64 20 3d 20  File->pUnused = 
11220 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65  0;.}../*.** Lowe
11230 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  r the locking le
11240 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63  vel on file desc
11250 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20  riptor pFile to 
11260 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c  eFileLock.  eFil
11270 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65  eLock.** must be
11280 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20   either NO_LOCK 
11290 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a  or SHARED_LOCK..
112a0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63  **.** If the loc
112b0 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68  king level of th
112c0 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
112d0 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20  r is already at 
112e0 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20  or below.** the 
112f0 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e  requested lockin
11300 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f  g level, this ro
11310 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
11320 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 68 61 6e 64  ..** .** If hand
11330 6c 65 4e 46 53 55 6e 6c 6f 63 6b 20 69 73 20 74  leNFSUnlock is t
11340 72 75 65 2c 20 74 68 65 6e 20 6f 6e 20 64 6f 77  rue, then on dow
11350 6e 67 72 61 64 69 6e 67 20 61 6e 20 45 58 43 4c  ngrading an EXCL
11360 55 53 49 56 45 5f 4c 4f 43 4b 20 74 6f 20 53 48  USIVE_LOCK to SH
11370 41 52 45 44 0a 2a 2a 20 74 68 65 20 62 79 74 65  ARED.** the byte
11380 20 72 61 6e 67 65 20 69 73 20 64 69 76 69 64 65   range is divide
11390 64 20 69 6e 74 6f 20 32 20 70 61 72 74 73 20 61  d into 2 parts a
113a0 6e 64 20 74 68 65 20 66 69 72 73 74 20 70 61 72  nd the first par
113b0 74 20 69 73 20 75 6e 6c 6f 63 6b 65 64 20 74 68  t is unlocked th
113c0 65 6e 0a 2a 2a 20 73 65 74 20 74 6f 20 61 20 72  en.** set to a r
113d0 65 61 64 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 74  ead lock, then t
113e0 68 65 20 6f 74 68 65 72 20 70 61 72 74 20 69 73  he other part is
113f0 20 73 69 6d 70 6c 79 20 75 6e 6c 6f 63 6b 65 64   simply unlocked
11400 2e 20 20 54 68 69 73 20 77 6f 72 6b 73 20 0a 2a  .  This works .*
11410 2a 20 61 72 6f 75 6e 64 20 61 20 62 75 67 20 69  * around a bug i
11420 6e 20 42 53 44 20 4e 46 53 20 6c 6f 63 6b 64 20  n BSD NFS lockd 
11430 28 61 6c 73 6f 20 73 65 65 6e 20 6f 6e 20 4d 61  (also seen on Ma
11440 63 4f 53 58 20 31 30 2e 33 2b 29 20 74 68 61 74  cOSX 10.3+) that
11450 20 66 61 69 6c 73 20 74 6f 20 0a 2a 2a 20 72 65   fails to .** re
11460 6d 6f 76 65 20 74 68 65 20 77 72 69 74 65 20 6c  move the write l
11470 6f 63 6b 20 6f 6e 20 61 20 72 65 67 69 6f 6e 20  ock on a region 
11480 77 68 65 6e 20 61 20 72 65 61 64 20 6c 6f 63 6b  when a read lock
11490 20 69 73 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74   is set..*/.stat
114a0 69 63 20 69 6e 74 20 70 6f 73 69 78 55 6e 6c 6f  ic int posixUnlo
114b0 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
114c0 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f  *id, int eFileLo
114d0 63 6b 2c 20 69 6e 74 20 68 61 6e 64 6c 65 4e 46  ck, int handleNF
114e0 53 55 6e 6c 6f 63 6b 29 7b 0a 20 20 75 6e 69 78  SUnlock){.  unix
114f0 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
11500 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 75  nixFile*)id;.  u
11510 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49  nixInodeInfo *pI
11520 6e 6f 64 65 3b 0a 20 20 73 74 72 75 63 74 20 66  node;.  struct f
11530 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 69 6e 74  lock lock;.  int
11540 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
11550 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  ..  assert( pFil
11560 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  e );.  OSTRACE((
11570 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77  "UNLOCK  %d %d w
11580 61 73 20 25 64 28 25 64 2c 25 64 29 20 70 69 64  as %d(%d,%d) pid
11590 3d 25 64 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70  =%d (unix)\n", p
115a0 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f  File->h, eFileLo
115b0 63 6b 2c 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  ck,.      pFile-
115c0 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c  >eFileLock, pFil
115d0 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65  e->pInode->eFile
115e0 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e 70 49 6e  Lock, pFile->pIn
115f0 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2c 0a 20 20  ode->nShared,.  
11600 20 20 20 20 67 65 74 70 69 64 28 29 29 29 3b 0a      getpid()));.
11610 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65  .  assert( eFile
11620 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock<=SHARED_LOC
11630 4b 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65  K );.  if( pFile
11640 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 3d 65 46 69  ->eFileLock<=eFi
11650 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65  leLock ){.    re
11660 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
11670 20 20 7d 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d    }.  unixEnterM
11680 75 74 65 78 28 29 3b 0a 20 20 70 49 6e 6f 64 65  utex();.  pInode
11690 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65   = pFile->pInode
116a0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f  ;.  assert( pIno
116b0 64 65 2d 3e 6e 53 68 61 72 65 64 21 3d 30 20 29  de->nShared!=0 )
116c0 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65  ;.  if( pFile->e
116d0 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f  FileLock>SHARED_
116e0 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73 73 65  LOCK ){.    asse
116f0 72 74 28 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c  rt( pInode->eFil
11700 65 4c 6f 63 6b 3d 3d 70 46 69 6c 65 2d 3e 65 46  eLock==pFile->eF
11710 69 6c 65 4c 6f 63 6b 20 29 3b 0a 0a 23 69 66 64  ileLock );..#ifd
11720 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
11730 20 20 20 20 2f 2a 20 57 68 65 6e 20 72 65 64 75      /* When redu
11740 63 69 6e 67 20 61 20 6c 6f 63 6b 20 73 75 63 68  cing a lock such
11750 20 74 68 61 74 20 6f 74 68 65 72 20 70 72 6f 63   that other proc
11760 65 73 73 65 73 20 63 61 6e 20 73 74 61 72 74 0a  esses can start.
11770 20 20 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 74      ** reading t
11780 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
11790 20 61 67 61 69 6e 2c 20 6d 61 6b 65 20 73 75 72   again, make sur
117a0 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 2a  e that the.    *
117b0 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f  * transaction co
117c0 75 6e 74 65 72 20 77 61 73 20 75 70 64 61 74 65  unter was update
117d0 64 20 69 66 20 61 6e 79 20 70 61 72 74 20 6f 66  d if any part of
117e0 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20   the database.  
117f0 20 20 2a 2a 20 66 69 6c 65 20 63 68 61 6e 67 65    ** file change
11800 64 2e 20 20 49 66 20 74 68 65 20 74 72 61 6e 73  d.  If the trans
11810 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 69  action counter i
11820 73 20 6e 6f 74 20 75 70 64 61 74 65 64 2c 0a 20  s not updated,. 
11830 20 20 20 2a 2a 20 6f 74 68 65 72 20 63 6f 6e 6e     ** other conn
11840 65 63 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 73  ections to the s
11850 61 6d 65 20 66 69 6c 65 20 6d 69 67 68 74 20 6e  ame file might n
11860 6f 74 20 72 65 61 6c 69 7a 65 20 74 68 61 74 0a  ot realize that.
11870 20 20 20 20 2a 2a 20 74 68 65 20 66 69 6c 65 20      ** the file 
11880 68 61 73 20 63 68 61 6e 67 65 64 20 61 6e 64 20  has changed and 
11890 68 65 6e 63 65 20 6d 69 67 68 74 20 6e 6f 74 20  hence might not 
118a0 6b 6e 6f 77 20 74 6f 20 66 6c 75 73 68 20 74 68  know to flush th
118b0 65 69 72 0a 20 20 20 20 2a 2a 20 63 61 63 68 65  eir.    ** cache
118c0 2e 20 20 54 68 65 20 75 73 65 20 6f 66 20 61 20  .  The use of a 
118d0 73 74 61 6c 65 20 63 61 63 68 65 20 63 61 6e 20  stale cache can 
118e0 6c 65 61 64 20 74 6f 20 64 61 74 61 62 61 73 65  lead to database
118f0 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20   corruption..   
11900 20 2a 2f 0a 20 20 20 20 70 46 69 6c 65 2d 3e 69   */.    pFile->i
11910 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 3d 20 30  nNormalWrite = 0
11920 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  ;.#endif..    /*
11930 20 64 6f 77 6e 67 72 61 64 69 6e 67 20 74 6f 20   downgrading to 
11940 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e  a shared lock on
11950 20 4e 46 53 20 69 6e 76 6f 6c 76 65 73 20 63 6c   NFS involves cl
11960 65 61 72 69 6e 67 20 74 68 65 20 77 72 69 74 65  earing the write
11970 20 6c 6f 63 6b 0a 20 20 20 20 2a 2a 20 62 65 66   lock.    ** bef
11980 6f 72 65 20 65 73 74 61 62 6c 69 73 68 69 6e 67  ore establishing
11990 20 74 68 65 20 72 65 61 64 6c 6f 63 6b 20 2d 20   the readlock - 
119a0 74 6f 20 61 76 6f 69 64 20 61 20 72 61 63 65 20  to avoid a race 
119b0 63 6f 6e 64 69 74 69 6f 6e 20 77 65 20 64 6f 77  condition we dow
119c0 6e 67 72 61 64 65 0a 20 20 20 20 2a 2a 20 74 68  ngrade.    ** th
119d0 65 20 6c 6f 63 6b 20 69 6e 20 32 20 62 6c 6f 63  e lock in 2 bloc
119e0 6b 73 2c 20 73 6f 20 74 68 61 74 20 70 61 72 74  ks, so that part
119f0 20 6f 66 20 74 68 65 20 72 61 6e 67 65 20 77 69   of the range wi
11a00 6c 6c 20 62 65 20 63 6f 76 65 72 65 64 20 62 79  ll be covered by
11a10 20 61 20 0a 20 20 20 20 2a 2a 20 77 72 69 74 65   a .    ** write
11a20 20 6c 6f 63 6b 20 75 6e 74 69 6c 20 74 68 65 20   lock until the 
11a30 72 65 73 74 20 69 73 20 63 6f 76 65 72 65 64 20  rest is covered 
11a40 62 79 20 61 20 72 65 61 64 20 6c 6f 63 6b 3a 0a  by a read lock:.
11a50 20 20 20 20 2a 2a 20 20 31 3a 20 20 20 5b 57 57      **  1:   [WW
11a60 57 57 57 5d 0a 20 20 20 20 2a 2a 20 20 32 3a 20  WWW].    **  2: 
11a70 20 20 5b 2e 2e 2e 2e 57 5d 0a 20 20 20 20 2a 2a    [....W].    **
11a80 20 20 33 3a 20 20 20 5b 52 52 52 52 57 5d 0a 20    3:   [RRRRW]. 
11a90 20 20 20 2a 2a 20 20 34 3a 20 20 20 5b 52 52 52     **  4:   [RRR
11aa0 52 2e 5d 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  R.].    */.    i
11ab0 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  f( eFileLock==SH
11ac0 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
11ad0 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 3b 20 20     int tErrno;  
11ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11af0 45 72 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20  Error code from 
11b00 73 79 73 74 65 6d 20 63 61 6c 6c 20 65 72 72 6f  system call erro
11b10 72 73 20 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69  rs */..#if !defi
11b20 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 7c  ned(__APPLE__) |
11b30 7c 20 21 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  | !SQLITE_ENABLE
11b40 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20  _LOCKING_STYLE. 
11b50 20 20 20 20 20 28 76 6f 69 64 29 68 61 6e 64 6c       (void)handl
11b60 65 4e 46 53 55 6e 6c 6f 63 6b 3b 0a 20 20 20 20  eNFSUnlock;.    
11b70 20 20 61 73 73 65 72 74 28 20 68 61 6e 64 6c 65    assert( handle
11b80 4e 46 53 55 6e 6c 6f 63 6b 3d 3d 30 20 29 3b 0a  NFSUnlock==0 );.
11b90 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e  #endif.#if defin
11ba0 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26  ed(__APPLE__) &&
11bb0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
11bc0 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20  OCKING_STYLE.   
11bd0 20 20 20 69 66 28 20 68 61 6e 64 6c 65 4e 46 53     if( handleNFS
11be0 55 6e 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20  Unlock ){.      
11bf0 20 20 6f 66 66 5f 74 20 64 69 76 53 69 7a 65 20    off_t divSize 
11c00 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 20 2d 20  = SHARED_SIZE - 
11c10 31 3b 0a 20 20 20 20 20 20 20 20 0a 20 20 20 20  1;.        .    
11c20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20      lock.l_type 
11c30 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 20  = F_UNLCK;.     
11c40 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65     lock.l_whence
11c50 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20   = SEEK_SET;.   
11c60 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72       lock.l_star
11c70 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54  t = SHARED_FIRST
11c80 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  ;.        lock.l
11c90 5f 6c 65 6e 20 3d 20 64 69 76 53 69 7a 65 3b 0a  _len = divSize;.
11ca0 20 20 20 20 20 20 20 20 69 66 28 20 75 6e 69 78          if( unix
11cb0 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20  FileLock(pFile, 
11cc0 26 6c 6f 63 6b 2c 20 31 30 29 3d 3d 28 2d 31 29  &lock, 10)==(-1)
11cd0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74 45   ){.          tE
11ce0 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 23 69  rrno = errno;.#i
11cf0 66 20 4f 53 4c 4f 43 4b 49 4e 47 5f 43 48 45 43  f OSLOCKING_CHEC
11d00 4b 5f 42 55 53 59 5f 49 4f 45 52 52 0a 20 20 20  K_BUSY_IOERR.   
11d10 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
11d20 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78  teErrorFromPosix
11d30 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51  Error(tErrno, SQ
11d40 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43  LITE_IOERR_UNLOC
11d50 4b 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20  K);.#else.      
11d60 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
11d70 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 23 65  IOERR_UNLOCK;.#e
11d80 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20 20 69  ndif.          i
11d90 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
11da0 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20  (rc) ){.        
11db0 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72      storeLastErr
11dc0 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f  no(pFile, tErrno
11dd0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
11de0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
11df0 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20  d_unlock;.      
11e00 20 20 7d 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b    }.        lock
11e10 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c 43  .l_type = F_RDLC
11e20 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e  K;.        lock.
11e30 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f  l_whence = SEEK_
11e40 53 45 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63  SET;.        loc
11e50 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52  k.l_start = SHAR
11e60 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20  ED_FIRST;.      
11e70 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 64    lock.l_len = d
11e80 69 76 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20  ivSize;.        
11e90 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b  if( unixFileLock
11ea0 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 2c 20 31  (pFile, &lock, 1
11eb0 30 29 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20  0)==(-1) ){.    
11ec0 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65        tErrno = e
11ed0 72 72 6e 6f 3b 0a 23 69 66 20 4f 53 4c 4f 43 4b  rrno;.#if OSLOCK
11ee0 49 4e 47 5f 43 48 45 43 4b 5f 42 55 53 59 5f 49  ING_CHECK_BUSY_I
11ef0 4f 45 52 52 0a 20 20 20 20 20 20 20 20 20 20 72  OERR.          r
11f00 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46  c = sqliteErrorF
11f10 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45  romPosixError(tE
11f20 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45  rrno, SQLITE_IOE
11f30 52 52 5f 52 44 4c 4f 43 4b 29 3b 0a 23 65 6c 73  RR_RDLOCK);.#els
11f40 65 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  e.          rc =
11f50 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e   SQLITE_IOERR_UN
11f60 4c 4f 43 4b 3b 0a 23 65 6e 64 69 66 0a 20 20 20  LOCK;.#endif.   
11f70 20 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f         if( IS_LO
11f80 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a  CK_ERROR(rc) ){.
11f90 20 20 20 20 20 20 20 20 20 20 20 20 73 74 6f 72              stor
11fa0 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65  eLastErrno(pFile
11fb0 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20  , tErrno);.     
11fc0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
11fd0 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b   goto end_unlock
11fe0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
11ff0 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20      lock.l_type 
12000 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 20  = F_UNLCK;.     
12010 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65     lock.l_whence
12020 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20   = SEEK_SET;.   
12030 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72       lock.l_star
12040 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54  t = SHARED_FIRST
12050 2b 64 69 76 53 69 7a 65 3b 0a 20 20 20 20 20 20  +divSize;.      
12060 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53    lock.l_len = S
12070 48 41 52 45 44 5f 53 49 5a 45 2d 64 69 76 53 69  HARED_SIZE-divSi
12080 7a 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ze;.        if( 
12090 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69  unixFileLock(pFi
120a0 6c 65 2c 20 26 6c 6f 63 6b 2c 20 31 30 29 3d 3d  le, &lock, 10)==
120b0 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20  (-1) ){.        
120c0 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f    tErrno = errno
120d0 3b 0a 23 69 66 20 4f 53 4c 4f 43 4b 49 4e 47 5f  ;.#if OSLOCKING_
120e0 43 48 45 43 4b 5f 42 55 53 59 5f 49 4f 45 52 52  CHECK_BUSY_IOERR
120f0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
12100 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
12110 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
12120 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  , SQLITE_IOERR_U
12130 4e 4c 4f 43 4b 29 3b 0a 23 65 6c 73 65 0a 20 20  NLOCK);.#else.  
12140 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
12150 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
12160 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20  ;.#endif.       
12170 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
12180 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20  RROR(rc) ){.    
12190 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73          storeLas
121a0 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45  tErrno(pFile, tE
121b0 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20  rrno);.         
121c0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74   }.          got
121d0 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20  o end_unlock;.  
121e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
121f0 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65  lse.#endif /* de
12200 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
12210 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
12220 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
12230 2a 2f 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20  */.      {.     
12240 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d     lock.l_type =
12250 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 20 20 20 20   F_RDLCK;.      
12260 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20    lock.l_whence 
12270 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20  = SEEK_SET;.    
12280 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74      lock.l_start
12290 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b   = SHARED_FIRST;
122a0 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  .        lock.l_
122b0 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a  len = SHARED_SIZ
122c0 45 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 75  E;.        if( u
122d0 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c  nixFileLock(pFil
122e0 65 2c 20 26 6c 6f 63 6b 2c 20 31 30 29 20 29 7b  e, &lock, 10) ){
122f0 0a 20 20 20 20 20 20 20 20 20 20 74 45 72 72 6e  .          tErrn
12300 6f 20 3d 20 65 72 72 6e 6f 3b 0a 23 69 66 20 4f  o = errno;.#if O
12310 53 4c 4f 43 4b 49 4e 47 5f 43 48 45 43 4b 5f 42  SLOCKING_CHECK_B
12320 55 53 59 5f 49 4f 45 52 52 0a 20 20 20 20 20 20  USY_IOERR.      
12330 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45      rc = sqliteE
12340 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
12350 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54  or(tErrno, SQLIT
12360 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 29 3b  E_IOERR_RDLOCK);
12370 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 20 20 20  .#else.         
12380 20 2f 2a 20 49 6e 20 74 68 65 6f 72 79 2c 20 74   /* In theory, t
12390 68 65 20 63 61 6c 6c 20 74 6f 20 75 6e 69 78 46  he call to unixF
123a0 69 6c 65 4c 6f 63 6b 28 29 20 63 61 6e 6e 6f 74  ileLock() cannot
123b0 20 66 61 69 6c 20 62 65 63 61 75 73 65 20 61 6e   fail because an
123c0 6f 74 68 65 72 0a 20 20 20 20 20 20 20 20 20 20  other.          
123d0 2a 2a 20 70 72 6f 63 65 73 73 20 69 73 20 68 6f  ** process is ho
123e0 6c 64 69 6e 67 20 61 6e 20 69 6e 63 6f 6d 70 61  lding an incompa
123f0 74 69 62 6c 65 20 6c 6f 63 6b 2e 20 49 66 20 69  tible lock. If i
12400 74 20 64 6f 65 73 2c 20 74 68 69 73 20 0a 20 20  t does, this .  
12410 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 64 69 63          ** indic
12420 61 74 65 73 20 74 68 61 74 20 74 68 65 20 6f 74  ates that the ot
12430 68 65 72 20 70 72 6f 63 65 73 73 20 69 73 20 6e  her process is n
12440 6f 74 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  ot following the
12450 20 6c 6f 63 6b 69 6e 67 0a 20 20 20 20 20 20 20   locking.       
12460 20 20 20 2a 2a 20 70 72 6f 74 6f 63 6f 6c 2e 20     ** protocol. 
12470 49 66 20 74 68 69 73 20 68 61 70 70 65 6e 73 2c  If this happens,
12480 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
12490 4f 45 52 52 5f 52 44 4c 4f 43 4b 2e 20 52 65 74  OERR_RDLOCK. Ret
124a0 75 72 6e 69 6e 67 0a 20 20 20 20 20 20 20 20 20  urning.         
124b0 20 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20   ** SQLITE_BUSY 
124c0 77 6f 75 6c 64 20 63 6f 6e 66 75 73 65 20 74 68  would confuse th
124d0 65 20 75 70 70 65 72 20 6c 61 79 65 72 20 28 69  e upper layer (i
124e0 6e 20 70 72 61 63 74 69 63 65 20 69 74 20 63 61  n practice it ca
124f0 75 73 65 73 20 0a 20 20 20 20 20 20 20 20 20 20  uses .          
12500 2a 2a 20 61 6e 20 61 73 73 65 72 74 20 74 6f 20  ** an assert to 
12510 66 61 69 6c 29 2e 20 2a 2f 20 0a 20 20 20 20 20  fail). */ .     
12520 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
12530 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 3b 0a 20  _IOERR_RDLOCK;. 
12540 20 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61           storeLa
12550 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74  stErrno(pFile, t
12560 45 72 72 6e 6f 29 3b 0a 23 65 6e 64 69 66 0a 20  Errno);.#endif. 
12570 20 20 20 20 20 20 20 20 20 69 66 28 20 49 53 5f           if( IS_
12580 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29  LOCK_ERROR(rc) )
12590 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 74  {.            st
125a0 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69  oreLastErrno(pFi
125b0 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20  le, tErrno);.   
125c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
125d0 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f     goto end_unlo
125e0 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ck;.        }.  
125f0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
12600 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f  lock.l_type = F_
12610 55 4e 4c 43 4b 3b 0a 20 20 20 20 6c 6f 63 6b 2e  UNLCK;.    lock.
12620 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f  l_whence = SEEK_
12630 53 45 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f  SET;.    lock.l_
12640 73 74 61 72 74 20 3d 20 50 45 4e 44 49 4e 47 5f  start = PENDING_
12650 42 59 54 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c  BYTE;.    lock.l
12660 5f 6c 65 6e 20 3d 20 32 4c 3b 20 20 61 73 73 65  _len = 2L;  asse
12670 72 74 28 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  rt( PENDING_BYTE
12680 2b 31 3d 3d 52 45 53 45 52 56 45 44 5f 42 59 54  +1==RESERVED_BYT
12690 45 20 29 3b 0a 20 20 20 20 69 66 28 20 75 6e 69  E );.    if( uni
126a0 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c  xFileLock(pFile,
126b0 20 26 6c 6f 63 6b 2c 20 31 30 29 3d 3d 30 20 29   &lock, 10)==0 )
126c0 7b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e  {.      pInode->
126d0 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52  eFileLock = SHAR
126e0 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c  ED_LOCK;.    }el
126f0 73 65 7b 0a 23 69 66 20 4f 53 4c 4f 43 4b 49 4e  se{.#if OSLOCKIN
12700 47 5f 43 48 45 43 4b 5f 42 55 53 59 5f 49 4f 45  G_CHECK_BUSY_IOE
12710 52 52 0a 20 20 20 20 20 20 74 45 72 72 6e 6f 20  RR.      tErrno 
12720 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72  = errno;.      r
12730 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46  c = sqliteErrorF
12740 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45  romPosixError(tE
12750 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45  rrno, SQLITE_IOE
12760 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20  RR_UNLOCK);.    
12770 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52    if( IS_LOCK_ER
12780 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20  ROR(rc) ){.     
12790 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e     storeLastErrn
127a0 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29  o(pFile, tErrno)
127b0 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6c 73 65 0a  ;.      }.#else.
127c0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
127d0 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a  E_IOERR_UNLOCK;.
127e0 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45        storeLastE
127f0 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e  rrno(pFile, errn
12800 6f 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  o);.#endif.     
12810 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b   goto end_unlock
12820 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
12830 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f  ( eFileLock==NO_
12840 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 44  LOCK ){.    /* D
12850 65 63 72 65 6d 65 6e 74 20 74 68 65 20 73 68 61  ecrement the sha
12860 72 65 64 20 6c 6f 63 6b 20 63 6f 75 6e 74 65 72  red lock counter
12870 2e 20 20 52 65 6c 65 61 73 65 20 74 68 65 20 6c  .  Release the l
12880 6f 63 6b 20 75 73 69 6e 67 20 61 6e 0a 20 20 20  ock using an.   
12890 20 2a 2a 20 4f 53 20 63 61 6c 6c 20 6f 6e 6c 79   ** OS call only
128a0 20 77 68 65 6e 20 61 6c 6c 20 74 68 72 65 61 64   when all thread
128b0 73 20 69 6e 20 74 68 69 73 20 73 61 6d 65 20 70  s in this same p
128c0 72 6f 63 65 73 73 20 68 61 76 65 20 72 65 6c 65  rocess have rele
128d0 61 73 65 64 0a 20 20 20 20 2a 2a 20 74 68 65 20  ased.    ** the 
128e0 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  lock..    */.   
128f0 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
12900 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f  --;.    if( pIno
12910 64 65 2d 3e 6e 53 68 61 72 65 64 3d 3d 30 20 29  de->nShared==0 )
12920 7b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74  {.      lock.l_t
12930 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20  ype = F_UNLCK;. 
12940 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e       lock.l_when
12950 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20  ce = SEEK_SET;. 
12960 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72       lock.l_star
12970 74 20 3d 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d  t = lock.l_len =
12980 20 30 4c 3b 0a 20 20 20 20 20 20 69 66 28 20 75   0L;.      if( u
12990 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c  nixFileLock(pFil
129a0 65 2c 20 26 6c 6f 63 6b 2c 20 31 30 29 3d 3d 30  e, &lock, 10)==0
129b0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 6f   ){.        pIno
129c0 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  de->eFileLock = 
129d0 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d  NO_LOCK;.      }
129e0 65 6c 73 65 7b 0a 23 69 66 20 4f 53 4c 4f 43 4b  else{.#if OSLOCK
129f0 49 4e 47 5f 43 48 45 43 4b 5f 42 55 53 59 5f 49  ING_CHECK_BUSY_I
12a00 4f 45 52 52 0a 20 20 20 20 20 20 20 20 74 45 72  OERR.        tEr
12a10 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
12a20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
12a30 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
12a40 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49  ror(tErrno, SQLI
12a50 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29  TE_IOERR_UNLOCK)
12a60 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 49 53  ;.        if( IS
12a70 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20  _LOCK_ERROR(rc) 
12a80 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 6f  ){.          sto
12a90 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c  reLastErrno(pFil
12aa0 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20  e, tErrno);.    
12ab0 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20      }.#else.    
12ac0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
12ad0 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20  IOERR_UNLOCK;.  
12ae0 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45        storeLastE
12af0 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e  rrno(pFile, errn
12b00 6f 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  o);.#endif.     
12b10 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65     pInode->eFile
12b20 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a  Lock = NO_LOCK;.
12b30 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65          pFile->e
12b40 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f  FileLock = NO_LO
12b50 43 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  CK;.      }.    
12b60 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d  }..    /* Decrem
12b70 65 6e 74 20 74 68 65 20 63 6f 75 6e 74 20 6f 66  ent the count of
12b80 20 6c 6f 63 6b 73 20 61 67 61 69 6e 73 74 20 74   locks against t
12b90 68 69 73 20 73 61 6d 65 20 66 69 6c 65 2e 20 20  his same file.  
12ba0 57 68 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20  When the.    ** 
12bb0 63 6f 75 6e 74 20 72 65 61 63 68 65 73 20 7a 65  count reaches ze
12bc0 72 6f 2c 20 63 6c 6f 73 65 20 61 6e 79 20 6f 74  ro, close any ot
12bd0 68 65 72 20 66 69 6c 65 20 64 65 73 63 72 69 70  her file descrip
12be0 74 6f 72 73 20 77 68 6f 73 65 20 63 6c 6f 73 65  tors whose close
12bf0 0a 20 20 20 20 2a 2a 20 77 61 73 20 64 65 66 65  .    ** was defe
12c00 72 72 65 64 20 62 65 63 61 75 73 65 20 6f 66 20  rred because of 
12c10 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b  outstanding lock
12c20 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49  s..    */.    pI
12c30 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2d 2d 3b 0a 20  node->nLock--;. 
12c40 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64     assert( pInod
12c50 65 2d 3e 6e 4c 6f 63 6b 3e 3d 30 20 29 3b 0a 20  e->nLock>=0 );. 
12c60 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e     if( pInode->n
12c70 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Lock==0 ){.     
12c80 20 63 6c 6f 73 65 50 65 6e 64 69 6e 67 46 64 73   closePendingFds
12c90 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20  (pFile);.    }. 
12ca0 20 7d 0a 0a 65 6e 64 5f 75 6e 6c 6f 63 6b 3a 0a   }..end_unlock:.
12cb0 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
12cc0 28 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  ();.  if( rc==SQ
12cd0 4c 49 54 45 5f 4f 4b 20 29 20 70 46 69 6c 65 2d  LITE_OK ) pFile-
12ce0 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69  >eFileLock = eFi
12cf0 6c 65 4c 6f 63 6b 3b 0a 20 20 72 65 74 75 72 6e  leLock;.  return
12d00 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f   rc;.}../*.** Lo
12d10 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  wer the locking 
12d20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65  level on file de
12d30 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74  scriptor pFile t
12d40 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46  o eFileLock.  eF
12d50 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20  ileLock.** must 
12d60 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43  be either NO_LOC
12d70 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b  K or SHARED_LOCK
12d80 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c  ..**.** If the l
12d90 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20  ocking level of 
12da0 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
12db0 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61  tor is already a
12dc0 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68  t or below.** th
12dd0 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
12de0 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20  ing level, this 
12df0 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
12e00 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  op..*/.static in
12e10 74 20 75 6e 69 78 55 6e 6c 6f 63 6b 28 73 71 6c  t unixUnlock(sql
12e20 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
12e30 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 23  nt eFileLock){.#
12e40 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  if SQLITE_MAX_MM
12e50 41 50 5f 53 49 5a 45 3e 30 0a 20 20 61 73 73 65  AP_SIZE>0.  asse
12e60 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  rt( eFileLock==S
12e70 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 28 28  HARED_LOCK || ((
12e80 75 6e 69 78 46 69 6c 65 20 2a 29 69 64 29 2d 3e  unixFile *)id)->
12e90 6e 46 65 74 63 68 4f 75 74 3d 3d 30 20 29 3b 0a  nFetchOut==0 );.
12ea0 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
12eb0 70 6f 73 69 78 55 6e 6c 6f 63 6b 28 69 64 2c 20  posixUnlock(id, 
12ec0 65 46 69 6c 65 4c 6f 63 6b 2c 20 30 29 3b 0a 7d  eFileLock, 0);.}
12ed0 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  ..#if SQLITE_MAX
12ee0 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 73 74 61  _MMAP_SIZE>0.sta
12ef0 74 69 63 20 69 6e 74 20 75 6e 69 78 4d 61 70 66  tic int unixMapf
12f00 69 6c 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46  ile(unixFile *pF
12f10 64 2c 20 69 36 34 20 6e 42 79 74 65 29 3b 0a 73  d, i64 nByte);.s
12f20 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 55  tatic void unixU
12f30 6e 6d 61 70 66 69 6c 65 28 75 6e 69 78 46 69 6c  nmapfile(unixFil
12f40 65 20 2a 70 46 64 29 3b 0a 23 65 6e 64 69 66 0a  e *pFd);.#endif.
12f50 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
12f60 74 69 6f 6e 20 70 65 72 66 6f 72 6d 73 20 74 68  tion performs th
12f70 65 20 70 61 72 74 73 20 6f 66 20 74 68 65 20 22  e parts of the "
12f80 63 6c 6f 73 65 20 66 69 6c 65 22 20 6f 70 65 72  close file" oper
12f90 61 74 69 6f 6e 20 0a 2a 2a 20 63 6f 6d 6d 6f 6e  ation .** common
12fa0 20 74 6f 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20   to all locking 
12fb0 73 63 68 65 6d 65 73 2e 20 49 74 20 63 6c 6f 73  schemes. It clos
12fc0 65 73 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  es the directory
12fd0 20 61 6e 64 20 66 69 6c 65 0a 2a 2a 20 68 61 6e   and file.** han
12fe0 64 6c 65 73 2c 20 69 66 20 74 68 65 79 20 61 72  dles, if they ar
12ff0 65 20 76 61 6c 69 64 2c 20 61 6e 64 20 73 65 74  e valid, and set
13000 73 20 61 6c 6c 20 66 69 65 6c 64 73 20 6f 66 20  s all fields of 
13010 74 68 65 20 75 6e 69 78 46 69 6c 65 0a 2a 2a 20  the unixFile.** 
13020 73 74 72 75 63 74 75 72 65 20 74 6f 20 30 2e 0a  structure to 0..
13030 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 2a 6e 6f 74  **.** It is *not
13040 2a 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 68  * necessary to h
13050 6f 6c 64 20 74 68 65 20 6d 75 74 65 78 20 77 68  old the mutex wh
13060 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
13070 69 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 65 76  is called,.** ev
13080 65 6e 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 20 20  en on VxWorks.  
13090 41 20 6d 75 74 65 78 20 77 69 6c 6c 20 62 65 20  A mutex will be 
130a0 61 63 71 75 69 72 65 64 20 6f 6e 20 56 78 57 6f  acquired on VxWo
130b0 72 6b 73 20 62 79 20 74 68 65 0a 2a 2a 20 76 78  rks by the.** vx
130c0 77 6f 72 6b 73 52 65 6c 65 61 73 65 46 69 6c 65  worksReleaseFile
130d0 49 64 28 29 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f  Id() routine..*/
130e0 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6c 6f 73  .static int clos
130f0 65 55 6e 69 78 46 69 6c 65 28 73 71 6c 69 74 65  eUnixFile(sqlite
13100 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 75  3_file *id){.  u
13110 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
13120 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
13130 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d  #if SQLITE_MAX_M
13140 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 75 6e 69  MAP_SIZE>0.  uni
13150 78 55 6e 6d 61 70 66 69 6c 65 28 70 46 69 6c 65  xUnmapfile(pFile
13160 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20  );.#endif.  if( 
13170 70 46 69 6c 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20  pFile->h>=0 ){. 
13180 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28     robust_close(
13190 70 46 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 2c  pFile, pFile->h,
131a0 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20   __LINE__);.    
131b0 70 46 69 6c 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20  pFile->h = -1;. 
131c0 20 7d 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b   }.#if OS_VXWORK
131d0 53 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70  S.  if( pFile->p
131e0 49 64 20 29 7b 0a 20 20 20 20 69 66 28 20 70 46  Id ){.    if( pF
131f0 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26  ile->ctrlFlags &
13200 20 55 4e 49 58 46 49 4c 45 5f 44 45 4c 45 54 45   UNIXFILE_DELETE
13210 20 29 7b 0a 20 20 20 20 20 20 6f 73 55 6e 6c 69   ){.      osUnli
13220 6e 6b 28 70 46 69 6c 65 2d 3e 70 49 64 2d 3e 7a  nk(pFile->pId->z
13230 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 29 3b 0a  CanonicalName);.
13240 20 20 20 20 7d 0a 20 20 20 20 76 78 77 6f 72 6b      }.    vxwork
13250 73 52 65 6c 65 61 73 65 46 69 6c 65 49 64 28 70  sReleaseFileId(p
13260 46 69 6c 65 2d 3e 70 49 64 29 3b 0a 20 20 20 20  File->pId);.    
13270 70 46 69 6c 65 2d 3e 70 49 64 20 3d 20 30 3b 0a  pFile->pId = 0;.
13280 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 64 65    }.#endif.#ifde
13290 66 20 53 51 4c 49 54 45 5f 55 4e 4c 49 4e 4b 5f  f SQLITE_UNLINK_
132a0 41 46 54 45 52 5f 43 4c 4f 53 45 0a 20 20 69 66  AFTER_CLOSE.  if
132b0 28 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61  ( pFile->ctrlFla
132c0 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 44 45  gs & UNIXFILE_DE
132d0 4c 45 54 45 20 29 7b 0a 20 20 20 20 6f 73 55 6e  LETE ){.    osUn
132e0 6c 69 6e 6b 28 70 46 69 6c 65 2d 3e 7a 50 61 74  link(pFile->zPat
132f0 68 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  h);.    sqlite3_
13300 66 72 65 65 28 2a 28 63 68 61 72 2a 2a 29 26 70  free(*(char**)&p
13310 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  File->zPath);.  
13320 20 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 20 3d    pFile->zPath =
13330 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20   0;.  }.#endif. 
13340 20 4f 53 54 52 41 43 45 28 28 22 43 4c 4f 53 45   OSTRACE(("CLOSE
13350 20 20 20 25 2d 33 64 5c 6e 22 2c 20 70 46 69 6c     %-3d\n", pFil
13360 65 2d 3e 68 29 29 3b 0a 20 20 4f 70 65 6e 43 6f  e->h));.  OpenCo
13370 75 6e 74 65 72 28 2d 31 29 3b 0a 20 20 73 71 6c  unter(-1);.  sql
13380 69 74 65 33 5f 66 72 65 65 28 70 46 69 6c 65 2d  ite3_free(pFile-
13390 3e 70 55 6e 75 73 65 64 29 3b 0a 20 20 6d 65 6d  >pUnused);.  mem
133a0 73 65 74 28 70 46 69 6c 65 2c 20 30 2c 20 73 69  set(pFile, 0, si
133b0 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65 29 29 3b  zeof(unixFile));
133c0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
133d0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  _OK;.}../*.** Cl
133e0 6f 73 65 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73  ose a file..*/.s
133f0 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 43 6c  tatic int unixCl
13400 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ose(sqlite3_file
13410 20 2a 69 64 29 7b 0a 20 20 69 6e 74 20 72 63 20   *id){.  int rc 
13420 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75  = SQLITE_OK;.  u
13430 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
13440 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 69 64 3b   (unixFile *)id;
13450 0a 20 20 76 65 72 69 66 79 44 62 46 69 6c 65 28  .  verifyDbFile(
13460 70 46 69 6c 65 29 3b 0a 20 20 75 6e 69 78 55 6e  pFile);.  unixUn
13470 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b  lock(id, NO_LOCK
13480 29 3b 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75  );.  unixEnterMu
13490 74 65 78 28 29 3b 0a 0a 20 20 2f 2a 20 75 6e 69  tex();..  /* uni
134a0 78 46 69 6c 65 2e 70 49 6e 6f 64 65 20 69 73 20  xFile.pInode is 
134b0 61 6c 77 61 79 73 20 76 61 6c 69 64 20 68 65 72  always valid her
134c0 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61 20  e. Otherwise, a 
134d0 64 69 66 66 65 72 65 6e 74 20 63 6c 6f 73 65 0a  different close.
134e0 20 20 2a 2a 20 72 6f 75 74 69 6e 65 20 28 65 2e    ** routine (e.
134f0 67 2e 20 6e 6f 6c 6f 63 6b 43 6c 6f 73 65 28 29  g. nolockClose()
13500 29 20 77 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65  ) would be calle
13510 64 20 69 6e 73 74 65 61 64 2e 0a 20 20 2a 2f 0a  d instead..  */.
13520 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d    assert( pFile-
13530 3e 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e 30  >pInode->nLock>0
13540 20 7c 7c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64   || pFile->pInod
13550 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d  e->bProcessLock=
13560 3d 30 20 29 3b 0a 20 20 69 66 28 20 41 4c 57 41  =0 );.  if( ALWA
13570 59 53 28 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  YS(pFile->pInode
13580 29 20 26 26 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  ) && pFile->pIno
13590 64 65 2d 3e 6e 4c 6f 63 6b 20 29 7b 0a 20 20 20  de->nLock ){.   
135a0 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
135b0 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63   outstanding loc
135c0 6b 73 2c 20 64 6f 20 6e 6f 74 20 61 63 74 75 61  ks, do not actua
135d0 6c 6c 79 20 63 6c 6f 73 65 20 74 68 65 20 66 69  lly close the fi
135e0 6c 65 20 6a 75 73 74 0a 20 20 20 20 2a 2a 20 79  le just.    ** y
135f0 65 74 20 62 65 63 61 75 73 65 20 74 68 61 74 20  et because that 
13600 77 6f 75 6c 64 20 63 6c 65 61 72 20 74 68 6f 73  would clear thos
13610 65 20 6c 6f 63 6b 73 2e 20 20 49 6e 73 74 65 61  e locks.  Instea
13620 64 2c 20 61 64 64 20 74 68 65 20 66 69 6c 65 0a  d, add the file.
13630 20 20 20 20 2a 2a 20 64 65 73 63 72 69 70 74 6f      ** descripto
13640 72 20 74 6f 20 70 49 6e 6f 64 65 2d 3e 70 55 6e  r to pInode->pUn
13650 75 73 65 64 20 6c 69 73 74 2e 20 20 49 74 20 77  used list.  It w
13660 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74 69 63  ill be automatic
13670 61 6c 6c 79 20 63 6c 6f 73 65 64 20 0a 20 20 20  ally closed .   
13680 20 2a 2a 20 77 68 65 6e 20 74 68 65 20 6c 61 73   ** when the las
13690 74 20 6c 6f 63 6b 20 69 73 20 63 6c 65 61 72 65  t lock is cleare
136a0 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 65  d..    */.    se
136b0 74 50 65 6e 64 69 6e 67 46 64 28 70 46 69 6c 65  tPendingFd(pFile
136c0 29 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65  );.  }.  release
136d0 49 6e 6f 64 65 49 6e 66 6f 28 70 46 69 6c 65 29  InodeInfo(pFile)
136e0 3b 0a 20 20 72 63 20 3d 20 63 6c 6f 73 65 55 6e  ;.  rc = closeUn
136f0 69 78 46 69 6c 65 28 69 64 29 3b 0a 20 20 75 6e  ixFile(id);.  un
13700 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
13710 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
13720 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  /************** 
13730 45 6e 64 20 6f 66 20 74 68 65 20 70 6f 73 69 78  End of the posix
13740 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 20 69   advisory lock i
13750 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a  mplementation **
13760 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
13770 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13780 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13790 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
137a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
137b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
137c0 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
137d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
137e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
137f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13800 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13810 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
13820 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
13830 4e 6f 2d 6f 70 20 4c 6f 63 6b 69 6e 67 20 2a 2a  No-op Locking **
13840 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13850 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13860 0a 2a 2a 0a 2a 2a 20 4f 66 20 74 68 65 20 76 61  .**.** Of the va
13870 72 69 6f 75 73 20 6c 6f 63 6b 69 6e 67 20 69 6d  rious locking im
13880 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 61 76  plementations av
13890 61 69 6c 61 62 6c 65 2c 20 74 68 69 73 20 69 73  ailable, this is
138a0 20 62 79 20 66 61 72 20 74 68 65 0a 2a 2a 20 73   by far the.** s
138b0 69 6d 70 6c 65 73 74 3a 20 20 6c 6f 63 6b 69 6e  implest:  lockin
138c0 67 20 69 73 20 69 67 6e 6f 72 65 64 2e 20 20 4e  g is ignored.  N
138d0 6f 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64  o attempt is mad
138e0 65 20 74 6f 20 6c 6f 63 6b 20 74 68 65 20 64 61  e to lock the da
138f0 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 66  tabase.** file f
13900 6f 72 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72  or reading or wr
13910 69 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  iting..**.** Thi
13920 73 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 69  s locking mode i
13930 73 20 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f  s appropriate fo
13940 72 20 75 73 65 20 6f 6e 20 72 65 61 64 2d 6f 6e  r use on read-on
13950 6c 79 20 64 61 74 61 62 61 73 65 73 0a 2a 2a 20  ly databases.** 
13960 28 65 78 3a 20 64 61 74 61 62 61 73 65 73 20 74  (ex: databases t
13970 68 61 74 20 61 72 65 20 62 75 72 6e 65 64 20 69  hat are burned i
13980 6e 74 6f 20 43 44 2d 52 4f 4d 2c 20 66 6f 72 20  nto CD-ROM, for 
13990 65 78 61 6d 70 6c 65 2e 29 20 20 49 74 20 63 61  example.)  It ca
139a0 6e 0a 2a 2a 20 61 6c 73 6f 20 62 65 20 75 73 65  n.** also be use
139b0 64 20 69 66 20 74 68 65 20 61 70 70 6c 69 63 61  d if the applica
139c0 74 69 6f 6e 20 65 6d 70 6c 6f 79 73 20 73 6f 6d  tion employs som
139d0 65 20 65 78 74 65 72 6e 61 6c 20 6d 65 63 68 61  e external mecha
139e0 6e 69 73 6d 20 74 6f 0a 2a 2a 20 70 72 65 76 65  nism to.** preve
139f0 6e 74 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73 20  nt simultaneous 
13a00 61 63 63 65 73 73 20 6f 66 20 74 68 65 20 73 61  access of the sa
13a10 6d 65 20 64 61 74 61 62 61 73 65 20 62 79 20 74  me database by t
13a20 77 6f 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 64 61  wo or more.** da
13a30 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
13a40 6e 73 2e 20 20 42 75 74 20 74 68 65 72 65 20 69  ns.  But there i
13a50 73 20 61 20 73 65 72 69 6f 75 73 20 72 69 73 6b  s a serious risk
13a60 20 6f 66 20 64 61 74 61 62 61 73 65 0a 2a 2a 20   of database.** 
13a70 63 6f 72 72 75 70 74 69 6f 6e 20 69 66 20 74 68  corruption if th
13a80 69 73 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20  is locking mode 
13a90 69 73 20 75 73 65 64 20 69 6e 20 73 69 74 75 61  is used in situa
13aa0 74 69 6f 6e 73 20 77 68 65 72 65 20 6d 75 6c 74  tions where mult
13ab0 69 70 6c 65 0a 2a 2a 20 64 61 74 61 62 61 73 65  iple.** database
13ac0 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72 65   connections are
13ad0 20 61 63 63 65 73 73 69 6e 67 20 74 68 65 20 73   accessing the s
13ae0 61 6d 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  ame database fil
13af0 65 20 61 74 20 74 68 65 20 73 61 6d 65 0a 2a 2a  e at the same.**
13b00 20 74 69 6d 65 20 61 6e 64 20 6f 6e 65 20 6f 72   time and one or
13b10 20 6d 6f 72 65 20 6f 66 20 74 68 6f 73 65 20 63   more of those c
13b20 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72 65 20 77  onnections are w
13b30 72 69 74 69 6e 67 2e 0a 2a 2f 0a 0a 73 74 61 74  riting..*/..stat
13b40 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 43 68 65  ic int nolockChe
13b50 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73  ckReservedLock(s
13b60 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74  qlite3_file *Not
13b70 55 73 65 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f  Used, int *pResO
13b80 75 74 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  ut){.  UNUSED_PA
13b90 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
13ba0 3b 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 30  ;.  *pResOut = 0
13bb0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
13bc0 45 5f 4f 4b 3b 0a 7d 0a 73 74 61 74 69 63 20 69  E_OK;.}.static i
13bd0 6e 74 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b 28 73 71  nt nolockLock(sq
13be0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55  lite3_file *NotU
13bf0 73 65 64 2c 20 69 6e 74 20 4e 6f 74 55 73 65 64  sed, int NotUsed
13c00 32 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  2){.  UNUSED_PAR
13c10 41 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c  AMETER2(NotUsed,
13c20 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 72 65   NotUsed2);.  re
13c30 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
13c40 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c  }.static int nol
13c50 6f 63 6b 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65  ockUnlock(sqlite
13c60 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64 2c  3_file *NotUsed,
13c70 20 69 6e 74 20 4e 6f 74 55 73 65 64 32 29 7b 0a   int NotUsed2){.
13c80 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
13c90 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74  ER2(NotUsed, Not
13ca0 55 73 65 64 32 29 3b 0a 20 20 72 65 74 75 72 6e  Used2);.  return
13cb0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
13cc0 2a 0a 2a 2a 20 43 6c 6f 73 65 20 74 68 65 20 66  *.** Close the f
13cd0 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
13ce0 6e 74 20 6e 6f 6c 6f 63 6b 43 6c 6f 73 65 28 73  nt nolockClose(s
13cf0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29  qlite3_file *id)
13d00 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51   {.  int rc = SQ
13d10 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46  LITE_OK;.  unixF
13d20 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
13d30 69 78 46 69 6c 65 20 2a 29 69 64 3b 0a 20 20 75  ixFile *)id;.  u
13d40 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
13d50 0a 20 20 0a 20 20 2f 2a 20 75 6e 69 78 46 69 6c  .  .  /* unixFil
13d60 65 2e 70 49 6e 6f 64 65 20 69 73 20 61 6c 77 61  e.pInode is alwa
13d70 79 73 20 76 61 6c 69 64 20 68 65 72 65 2e 20 4f  ys valid here. O
13d80 74 68 65 72 77 69 73 65 2c 20 61 20 64 69 66 66  therwise, a diff
13d90 65 72 65 6e 74 20 63 6c 6f 73 65 0a 20 20 20 2a  erent close.   *
13da0 2a 20 72 6f 75 74 69 6e 65 20 28 65 2e 67 2e 20  * routine (e.g. 
13db0 6e 6f 6c 6f 63 6b 43 6c 6f 73 65 28 29 29 20 77  nolockClose()) w
13dc0 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 69  ould be called i
13dd0 6e 73 74 65 61 64 2e 0a 20 20 20 2a 2f 0a 20 20  nstead..   */.  
13de0 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 70  assert( pFile->p
13df0 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e 30 20 7c  Inode->nLock>0 |
13e00 7c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d  | pFile->pInode-
13e10 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30  >bProcessLock==0
13e20 20 29 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53   );.  if( ALWAYS
13e30 28 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 29 20  (pFile->pInode) 
13e40 26 26 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  && pFile->pInode
13e50 2d 3e 6e 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 2f  ->nLock ){.    /
13e60 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6f  * If there are o
13e70 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73  utstanding locks
13e80 2c 20 64 6f 20 6e 6f 74 20 61 63 74 75 61 6c 6c  , do not actuall
13e90 79 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65  y close the file
13ea0 20 6a 75 73 74 0a 20 20 20 20 20 2a 2a 20 79 65   just.     ** ye
13eb0 74 20 62 65 63 61 75 73 65 20 74 68 61 74 20 77  t because that w
13ec0 6f 75 6c 64 20 63 6c 65 61 72 20 74 68 6f 73 65  ould clear those
13ed0 20 6c 6f 63 6b 73 2e 20 20 49 6e 73 74 65 61 64   locks.  Instead
13ee0 2c 20 61 64 64 20 74 68 65 20 66 69 6c 65 0a 20  , add the file. 
13ef0 20 20 20 20 2a 2a 20 64 65 73 63 72 69 70 74 6f      ** descripto
13f00 72 20 74 6f 20 70 49 6e 6f 64 65 2d 3e 70 55 6e  r to pInode->pUn
13f10 75 73 65 64 20 6c 69 73 74 2e 20 20 49 74 20 77  used list.  It w
13f20 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74 69 63  ill be automatic
13f30 61 6c 6c 79 20 63 6c 6f 73 65 64 20 0a 20 20 20  ally closed .   
13f40 20 20 2a 2a 20 77 68 65 6e 20 74 68 65 20 6c 61    ** when the la
13f50 73 74 20 6c 6f 63 6b 20 69 73 20 63 6c 65 61 72  st lock is clear
13f60 65 64 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20  ed..     */.    
13f70 73 65 74 50 65 6e 64 69 6e 67 46 64 28 70 46 69  setPendingFd(pFi
13f80 6c 65 29 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61  le);.  }.  relea
13f90 73 65 49 6e 6f 64 65 49 6e 66 6f 28 70 46 69 6c  seInodeInfo(pFil
13fa0 65 29 3b 0a 20 20 72 63 20 3d 20 63 6c 6f 73 65  e);.  rc = close
13fb0 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 20 20  UnixFile(id);.  
13fc0 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
13fd0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
13fe0 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
13ff0 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68  ****** End of th
14000 65 20 6e 6f 2d 6f 70 20 6c 6f 63 6b 20 69 6d 70  e no-op lock imp
14010 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a  lementation ****
14020 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14030 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
14040 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14050 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14060 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14070 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14080 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /../************
14090 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
140a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
140b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
140c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
140d0 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
140e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67  ************ Beg
140f0 69 6e 20 64 6f 74 2d 66 69 6c 65 20 4c 6f 63 6b  in dot-file Lock
14100 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ing ************
14110 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14120 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 6f 74  **.**.** The dot
14130 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 6d 70  file locking imp
14140 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 75 73 65 73  lementation uses
14150 20 74 68 65 20 65 78 69 73 74 65 6e 63 65 20 6f   the existence o
14160 66 20 73 65 70 61 72 61 74 65 20 6c 6f 63 6b 0a  f separate lock.
14170 2a 2a 20 66 69 6c 65 73 20 28 72 65 61 6c 6c 79  ** files (really
14180 20 61 20 64 69 72 65 63 74 6f 72 79 29 20 74 6f   a directory) to
14190 20 63 6f 6e 74 72 6f 6c 20 61 63 63 65 73 73 20   control access 
141a0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  to the database.
141b0 20 20 54 68 69 73 20 77 6f 72 6b 73 0a 2a 2a 20    This works.** 
141c0 6f 6e 20 6a 75 73 74 20 61 62 6f 75 74 20 65 76  on just about ev
141d0 65 72 79 20 66 69 6c 65 73 79 73 74 65 6d 20 69  ery filesystem i
141e0 6d 61 67 69 6e 61 62 6c 65 2e 20 20 42 75 74 20  maginable.  But 
141f0 74 68 65 72 65 20 61 72 65 20 73 65 72 69 6f 75  there are seriou
14200 73 20 64 6f 77 6e 73 69 64 65 73 3a 0a 2a 2a 0a  s downsides:.**.
14210 2a 2a 20 20 20 20 28 31 29 20 20 54 68 65 72 65  **    (1)  There
14220 20 69 73 20 7a 65 72 6f 20 63 6f 6e 63 75 72 72   is zero concurr
14230 65 6e 63 79 2e 20 20 41 20 73 69 6e 67 6c 65 20  ency.  A single 
14240 72 65 61 64 65 72 20 62 6c 6f 63 6b 73 20 61 6c  reader blocks al
14250 6c 20 6f 74 68 65 72 0a 2a 2a 20 20 20 20 20 20  l other.**      
14260 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 66     connections f
14270 72 6f 6d 20 72 65 61 64 69 6e 67 20 6f 72 20 77  rom reading or w
14280 72 69 74 69 6e 67 20 74 68 65 20 64 61 74 61 62  riting the datab
14290 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32  ase..**.**    (2
142a0 29 20 20 41 6e 20 61 70 70 6c 69 63 61 74 69 6f  )  An applicatio
142b0 6e 20 63 72 61 73 68 20 6f 72 20 70 6f 77 65 72  n crash or power
142c0 20 6c 6f 73 73 20 63 61 6e 20 6c 65 61 76 65 20   loss can leave 
142d0 73 74 61 6c 65 20 6c 6f 63 6b 20 66 69 6c 65 73  stale lock files
142e0 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 69 74 74  .**         sitt
142f0 69 6e 67 20 61 72 6f 75 6e 64 20 74 68 61 74 20  ing around that 
14300 6e 65 65 64 20 74 6f 20 62 65 20 63 6c 65 61 72  need to be clear
14310 65 64 20 6d 61 6e 75 61 6c 6c 79 2e 0a 2a 2a 0a  ed manually..**.
14320 2a 2a 20 4e 65 76 65 72 74 68 65 6c 65 73 73 2c  ** Nevertheless,
14330 20 61 20 64 6f 74 6c 6f 63 6b 20 69 73 20 61 6e   a dotlock is an
14340 20 61 70 70 72 6f 70 72 69 61 74 65 20 6c 6f 63   appropriate loc
14350 6b 69 6e 67 20 6d 6f 64 65 20 66 6f 72 20 75 73  king mode for us
14360 65 20 69 66 20 6e 6f 0a 2a 2a 20 6f 74 68 65 72  e if no.** other
14370 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74 65 67   locking strateg
14380 79 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 0a  y is available..
14390 2a 2a 0a 2a 2a 20 44 6f 74 66 69 6c 65 20 6c 6f  **.** Dotfile lo
143a0 63 6b 69 6e 67 20 77 6f 72 6b 73 20 62 79 20 63  cking works by c
143b0 72 65 61 74 69 6e 67 20 61 20 73 75 62 64 69 72  reating a subdir
143c0 65 63 74 6f 72 79 20 69 6e 20 74 68 65 20 73 61  ectory in the sa
143d0 6d 65 20 64 69 72 65 63 74 6f 72 79 20 61 73 0a  me directory as.
143e0 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
143f0 61 6e 64 20 77 69 74 68 20 74 68 65 20 73 61 6d  and with the sam
14400 65 20 6e 61 6d 65 20 62 75 74 20 77 69 74 68 20  e name but with 
14410 61 20 22 2e 6c 6f 63 6b 22 20 65 78 74 65 6e 73  a ".lock" extens
14420 69 6f 6e 20 61 64 64 65 64 2e 0a 2a 2a 20 54 68  ion added..** Th
14430 65 20 65 78 69 73 74 65 6e 63 65 20 6f 66 20 61  e existence of a
14440 20 6c 6f 63 6b 20 64 69 72 65 63 74 6f 72 79 20   lock directory 
14450 69 6d 70 6c 69 65 73 20 61 6e 20 45 58 43 4c 55  implies an EXCLU
14460 53 49 56 45 20 6c 6f 63 6b 2e 20 20 41 6c 6c 20  SIVE lock.  All 
14470 6f 74 68 65 72 0a 2a 2a 20 6c 6f 63 6b 20 74 79  other.** lock ty
14480 70 65 73 20 28 53 48 41 52 45 44 2c 20 52 45 53  pes (SHARED, RES
14490 45 52 56 45 44 2c 20 50 45 4e 44 49 4e 47 29 20  ERVED, PENDING) 
144a0 61 72 65 20 6d 61 70 70 65 64 20 69 6e 74 6f 20  are mapped into 
144b0 45 58 43 4c 55 53 49 56 45 2e 0a 2a 2f 0a 0a 2f  EXCLUSIVE..*/../
144c0 2a 0a 2a 2a 20 54 68 65 20 66 69 6c 65 20 73 75  *.** The file su
144d0 66 66 69 78 20 61 64 64 65 64 20 74 6f 20 74 68  ffix added to th
144e0 65 20 64 61 74 61 20 62 61 73 65 20 66 69 6c 65  e data base file
144f0 6e 61 6d 65 20 69 6e 20 6f 72 64 65 72 20 74 6f  name in order to
14500 20 63 72 65 61 74 65 20 74 68 65 0a 2a 2a 20 6c   create the.** l
14510 6f 63 6b 20 64 69 72 65 63 74 6f 72 79 2e 0a 2a  ock directory..*
14520 2f 0a 23 64 65 66 69 6e 65 20 44 4f 54 4c 4f 43  /.#define DOTLOC
14530 4b 5f 53 55 46 46 49 58 20 22 2e 6c 6f 63 6b 22  K_SUFFIX ".lock"
14540 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
14550 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74  tine checks if t
14560 68 65 72 65 20 69 73 20 61 20 52 45 53 45 52 56  here is a RESERV
14570 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20  ED lock held on 
14580 74 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a  the specified.**
14590 20 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72   file by this or
145a0 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65   any other proce
145b0 73 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f  ss. If such a lo
145c0 63 6b 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20  ck is held, set 
145d0 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61  *pResOut.** to a
145e0 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20   non-zero value 
145f0 6f 74 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f  otherwise *pResO
14600 75 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72  ut is set to zer
14610 6f 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 76  o.  The return v
14620 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74  alue.** is set t
14630 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65  o SQLITE_OK unle
14640 73 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20  ss an I/O error 
14650 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f  occurs during lo
14660 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2a 0a  ck checking..**.
14670 2a 2a 20 49 6e 20 64 6f 74 66 69 6c 65 20 6c 6f  ** In dotfile lo
14680 63 6b 69 6e 67 2c 20 65 69 74 68 65 72 20 61 20  cking, either a 
14690 6c 6f 63 6b 20 65 78 69 73 74 73 20 6f 72 20 69  lock exists or i
146a0 74 20 64 6f 65 73 20 6e 6f 74 2e 20 20 53 6f 20  t does not.  So 
146b0 69 6e 20 74 68 69 73 0a 2a 2a 20 76 61 72 69 61  in this.** varia
146c0 74 69 6f 6e 20 6f 66 20 43 68 65 63 6b 52 65 73  tion of CheckRes
146d0 65 72 76 65 64 4c 6f 63 6b 28 29 2c 20 2a 70 52  ervedLock(), *pR
146e0 65 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20  esOut is set to 
146f0 74 72 75 65 20 69 66 20 61 6e 79 20 6c 6f 63 6b  true if any lock
14700 0a 2a 2a 20 69 73 20 68 65 6c 64 20 6f 6e 20 74  .** is held on t
14710 68 65 20 66 69 6c 65 20 61 6e 64 20 66 61 6c 73  he file and fals
14720 65 20 69 66 20 74 68 65 20 66 69 6c 65 20 69 73  e if the file is
14730 20 75 6e 6c 6f 63 6b 65 64 2e 0a 2a 2f 0a 73 74   unlocked..*/.st
14740 61 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b  atic int dotlock
14750 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
14760 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
14770 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74  id, int *pResOut
14780 29 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  ) {.  int rc = S
14790 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
147a0 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20  reserved = 0;.  
147b0 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
147c0 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
147d0 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ..  SimulateIOEr
147e0 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
147f0 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45  TE_IOERR_CHECKRE
14800 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20  SERVEDLOCK; );. 
14810 20 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c   .  assert( pFil
14820 65 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  e );..  /* Check
14830 20 69 66 20 61 20 74 68 72 65 61 64 20 69 6e 20   if a thread in 
14840 74 68 69 73 20 70 72 6f 63 65 73 73 20 68 6f 6c  this process hol
14850 64 73 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a  ds such a lock *
14860 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65  /.  if( pFile->e
14870 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f  FileLock>SHARED_
14880 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 45  LOCK ){.    /* E
14890 69 74 68 65 72 20 74 68 69 73 20 63 6f 6e 6e 65  ither this conne
148a0 63 74 69 6f 6e 20 6f 72 20 73 6f 6d 65 20 6f 74  ction or some ot
148b0 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  her connection i
148c0 6e 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65  n the same proce
148d0 73 73 0a 20 20 20 20 2a 2a 20 68 6f 6c 64 73 20  ss.    ** holds 
148e0 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69  a lock on the fi
148f0 6c 65 2e 20 20 4e 6f 20 6e 65 65 64 20 74 6f 20  le.  No need to 
14900 63 68 65 63 6b 20 66 75 72 74 68 65 72 2e 20 2a  check further. *
14910 2f 0a 20 20 20 20 72 65 73 65 72 76 65 64 20 3d  /.    reserved =
14920 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   1;.  }else{.   
14930 20 2f 2a 20 54 68 65 20 6c 6f 63 6b 20 69 73 20   /* The lock is 
14940 68 65 6c 64 20 69 66 20 61 6e 64 20 6f 6e 6c 79  held if and only
14950 20 69 66 20 74 68 65 20 6c 6f 63 6b 66 69 6c 65   if the lockfile
14960 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 20 20 63   exists */.    c
14970 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c 6f 63 6b  onst char *zLock
14980 46 69 6c 65 20 3d 20 28 63 6f 6e 73 74 20 63 68  File = (const ch
14990 61 72 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69  ar*)pFile->locki
149a0 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 72  ngContext;.    r
149b0 65 73 65 72 76 65 64 20 3d 20 6f 73 41 63 63 65  eserved = osAcce
149c0 73 73 28 7a 4c 6f 63 6b 46 69 6c 65 2c 20 30 29  ss(zLockFile, 0)
149d0 3d 3d 30 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41  ==0;.  }.  OSTRA
149e0 43 45 28 28 22 54 45 53 54 20 57 52 2d 4c 4f 43  CE(("TEST WR-LOC
149f0 4b 20 25 64 20 25 64 20 25 64 20 28 64 6f 74 6c  K %d %d %d (dotl
14a00 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  ock)\n", pFile->
14a10 68 2c 20 72 63 2c 20 72 65 73 65 72 76 65 64 29  h, rc, reserved)
14a20 29 3b 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20  );.  *pResOut = 
14a30 72 65 73 65 72 76 65 64 3b 0a 20 20 72 65 74 75  reserved;.  retu
14a40 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
14a50 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69  Lock the file wi
14a60 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63  th the lock spec
14a70 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74  ified by paramet
14a80 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f  er eFileLock - o
14a90 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c  ne.** of the fol
14aa0 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20  lowing:.**.**   
14ab0 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43    (1) SHARED_LOC
14ac0 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53  K.**     (2) RES
14ad0 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  ERVED_LOCK.**   
14ae0 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f    (3) PENDING_LO
14af0 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58  CK.**     (4) EX
14b00 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a  CLUSIVE_LOCK.**.
14b10 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65  ** Sometimes whe
14b20 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65  n requesting one
14b30 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64   lock state, add
14b40 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61  itional lock sta
14b50 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72  tes.** are inser
14b60 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20  ted in between. 
14b70 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67   The locking mig
14b80 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f  ht fail on one o
14b90 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74  f the later.** t
14ba0 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69  ransitions leavi
14bb0 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74  ng the lock stat
14bc0 65 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d  e different from
14bd0 20 77 68 61 74 20 69 74 20 73 74 61 72 74 65 64   what it started
14be0 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68   but.** still sh
14bf0 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e  ort of its goal.
14c00 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
14c10 63 68 61 72 74 20 73 68 6f 77 73 20 74 68 65 20  chart shows the 
14c20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73  allowed.** trans
14c30 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69  itions and the i
14c40 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64  nserted intermed
14c50 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a  iate states:.**.
14c60 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d  **    UNLOCKED -
14c70 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53  > SHARED.**    S
14c80 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45  HARED -> RESERVE
14c90 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d  D.**    SHARED -
14ca0 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45  > (PENDING) -> E
14cb0 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52  XCLUSIVE.**    R
14cc0 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44  ESERVED -> (PEND
14cd0 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56  ING) -> EXCLUSIV
14ce0 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20  E.**    PENDING 
14cf0 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a  -> EXCLUSIVE.**.
14d00 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
14d10 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61  will only increa
14d20 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20  se a lock.  Use 
14d30 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c  the sqlite3OsUnl
14d40 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65  ock().** routine
14d50 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b   to lower a lock
14d60 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2a 0a 2a 2a  ing level..**.**
14d70 20 57 69 74 68 20 64 6f 74 66 69 6c 65 20 6c 6f   With dotfile lo
14d80 63 6b 69 6e 67 2c 20 77 65 20 72 65 61 6c 6c 79  cking, we really
14d90 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 20 73 74   only support st
14da0 61 74 65 20 28 34 29 3a 20 45 58 43 4c 55 53 49  ate (4): EXCLUSI
14db0 56 45 2e 0a 2a 2a 20 42 75 74 20 77 65 20 74 72  VE..** But we tr
14dc0 61 63 6b 20 74 68 65 20 6f 74 68 65 72 20 6c 6f  ack the other lo
14dd0 63 6b 69 6e 67 20 6c 65 76 65 6c 73 20 69 6e 74  cking levels int
14de0 65 72 6e 61 6c 6c 79 2e 0a 2a 2f 0a 73 74 61 74  ernally..*/.stat
14df0 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 4c 6f  ic int dotlockLo
14e00 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
14e10 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f  *id, int eFileLo
14e20 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65  ck) {.  unixFile
14e30 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
14e40 69 6c 65 2a 29 69 64 3b 0a 20 20 63 68 61 72 20  ile*)id;.  char 
14e50 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63 68  *zLockFile = (ch
14e60 61 72 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ar *)pFile->lock
14e70 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 69 6e  ingContext;.  in
14e80 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
14e90 3b 0a 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 68  ;...  /* If we h
14ea0 61 76 65 20 61 6e 79 20 6c 6f 63 6b 2c 20 74 68  ave any lock, th
14eb0 65 6e 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65  en the lock file
14ec0 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 2e   already exists.
14ed0 20 20 41 6c 6c 20 77 65 20 68 61 76 65 0a 20 20    All we have.  
14ee0 2a 2a 20 74 6f 20 64 6f 20 69 73 20 61 64 6a 75  ** to do is adju
14ef0 73 74 20 6f 75 72 20 69 6e 74 65 72 6e 61 6c 20  st our internal 
14f00 72 65 63 6f 72 64 20 6f 66 20 74 68 65 20 6c 6f  record of the lo
14f10 63 6b 20 6c 65 76 65 6c 2e 0a 20 20 2a 2f 0a 20  ck level..  */. 
14f20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c   if( pFile->eFil
14f30 65 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c 4f 43 4b 20  eLock > NO_LOCK 
14f40 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46  ){.    pFile->eF
14f50 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c  ileLock = eFileL
14f60 6f 63 6b 3b 0a 20 20 20 20 2f 2a 20 41 6c 77 61  ock;.    /* Alwa
14f70 79 73 20 75 70 64 61 74 65 20 74 68 65 20 74 69  ys update the ti
14f80 6d 65 73 74 61 6d 70 20 6f 6e 20 74 68 65 20 6f  mestamp on the o
14f90 6c 64 20 66 69 6c 65 20 2a 2f 0a 23 69 66 64 65  ld file */.#ifde
14fa0 66 20 48 41 56 45 5f 55 54 49 4d 45 0a 20 20 20  f HAVE_UTIME.   
14fb0 20 75 74 69 6d 65 28 7a 4c 6f 63 6b 46 69 6c 65   utime(zLockFile
14fc0 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6c 73 65 0a 20  , NULL);.#else. 
14fd0 20 20 20 75 74 69 6d 65 73 28 7a 4c 6f 63 6b 46     utimes(zLockF
14fe0 69 6c 65 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6e 64  ile, NULL);.#end
14ff0 69 66 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  if.    return SQ
15000 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a  LITE_OK;.  }.  .
15010 20 20 2f 2a 20 67 72 61 62 20 61 6e 20 65 78 63    /* grab an exc
15020 6c 75 73 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20  lusive lock */. 
15030 20 72 63 20 3d 20 6f 73 4d 6b 64 69 72 28 7a 4c   rc = osMkdir(zL
15040 6f 63 6b 46 69 6c 65 2c 20 30 37 37 37 29 3b 0a  ockFile, 0777);.
15050 20 20 69 66 28 20 72 63 3c 30 20 29 7b 0a 20 20    if( rc<0 ){.  
15060 20 20 2f 2a 20 66 61 69 6c 65 64 20 74 6f 20 6f    /* failed to o
15070 70 65 6e 2f 63 72 65 61 74 65 20 74 68 65 20 6c  pen/create the l
15080 6f 63 6b 20 64 69 72 65 63 74 6f 72 79 20 2a 2f  ock directory */
15090 0a 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20  .    int tErrno 
150a0 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 69 66 28  = errno;.    if(
150b0 20 45 45 58 49 53 54 20 3d 3d 20 74 45 72 72 6e   EEXIST == tErrn
150c0 6f 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  o ){.      rc = 
150d0 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
150e0 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
150f0 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72  rc = sqliteError
15100 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74  FromPosixError(t
15110 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f  Errno, SQLITE_IO
15120 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  ERR_LOCK);.     
15130 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52   if( IS_LOCK_ERR
15140 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20  OR(rc) ){.      
15150 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f    storeLastErrno
15160 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b  (pFile, tErrno);
15170 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
15180 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
15190 7d 20 0a 20 20 0a 20 20 2f 2a 20 67 6f 74 20 69  } .  .  /* got i
151a0 74 2c 20 73 65 74 20 74 68 65 20 74 79 70 65 20  t, set the type 
151b0 61 6e 64 20 72 65 74 75 72 6e 20 6f 6b 20 2a 2f  and return ok */
151c0 0a 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  .  pFile->eFileL
151d0 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b  ock = eFileLock;
151e0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
151f0 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65  ./*.** Lower the
15200 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
15210 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
15220 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65  r pFile to eFile
15230 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b  Lock.  eFileLock
15240 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68  .** must be eith
15250 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48  er NO_LOCK or SH
15260 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a  ARED_LOCK..**.**
15270 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   If the locking 
15280 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c  level of the fil
15290 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
152a0 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65  already at or be
152b0 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65  low.** the reque
152c0 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  sted locking lev
152d0 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  el, this routine
152e0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a   is a no-op..**.
152f0 2a 2a 20 57 68 65 6e 20 74 68 65 20 6c 6f 63 6b  ** When the lock
15300 69 6e 67 20 6c 65 76 65 6c 20 72 65 61 63 68 65  ing level reache
15310 73 20 4e 4f 5f 4c 4f 43 4b 2c 20 64 65 6c 65 74  s NO_LOCK, delet
15320 65 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65 2e  e the lock file.
15330 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
15340 6f 74 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 73 71 6c  otlockUnlock(sql
15350 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
15360 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a  nt eFileLock) {.
15370 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
15380 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
15390 64 3b 0a 20 20 63 68 61 72 20 2a 7a 4c 6f 63 6b  d;.  char *zLock
153a0 46 69 6c 65 20 3d 20 28 63 68 61 72 20 2a 29 70  File = (char *)p
153b0 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
153c0 74 65 78 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  text;.  int rc;.
153d0 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
153e0 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22   );.  OSTRACE(("
153f0 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61  UNLOCK  %d %d wa
15400 73 20 25 64 20 70 69 64 3d 25 64 20 28 64 6f 74  s %d pid=%d (dot
15410 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  lock)\n", pFile-
15420 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20  >h, eFileLock,. 
15430 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
15440 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 67 65 74 70  >eFileLock, getp
15450 69 64 28 29 29 29 3b 0a 20 20 61 73 73 65 72 74  id()));.  assert
15460 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41  ( eFileLock<=SHA
15470 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20  RED_LOCK );.  . 
15480 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20 70 6f 73   /* no-op if pos
15490 73 69 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70  sible */.  if( p
154a0 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  File->eFileLock=
154b0 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20  =eFileLock ){.  
154c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
154d0 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 6f  OK;.  }..  /* To
154e0 20 64 6f 77 6e 67 72 61 64 65 20 74 6f 20 73 68   downgrade to sh
154f0 61 72 65 64 2c 20 73 69 6d 70 6c 79 20 75 70 64  ared, simply upd
15500 61 74 65 20 6f 75 72 20 69 6e 74 65 72 6e 61 6c  ate our internal
15510 20 6e 6f 74 69 6f 6e 20 6f 66 20 74 68 65 0a 20   notion of the. 
15520 20 2a 2a 20 6c 6f 63 6b 20 73 74 61 74 65 2e 20   ** lock state. 
15530 20 4e 6f 20 6e 65 65 64 20 74 6f 20 6d 65 73 73   No need to mess
15540 20 77 69 74 68 20 74 68 65 20 66 69 6c 65 20 6f   with the file o
15550 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 69  n disk..  */.  i
15560 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  f( eFileLock==SH
15570 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
15580 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
15590 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b  k = SHARED_LOCK;
155a0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
155b0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20  TE_OK;.  }.  .  
155c0 2f 2a 20 54 6f 20 66 75 6c 6c 79 20 75 6e 6c 6f  /* To fully unlo
155d0 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  ck the database,
155e0 20 64 65 6c 65 74 65 20 74 68 65 20 6c 6f 63 6b   delete the lock
155f0 20 66 69 6c 65 20 2a 2f 0a 20 20 61 73 73 65 72   file */.  asser
15600 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f  t( eFileLock==NO
15610 5f 4c 4f 43 4b 20 29 3b 0a 20 20 72 63 20 3d 20  _LOCK );.  rc = 
15620 6f 73 52 6d 64 69 72 28 7a 4c 6f 63 6b 46 69 6c  osRmdir(zLockFil
15630 65 29 3b 0a 20 20 69 66 28 20 72 63 3c 30 20 26  e);.  if( rc<0 &
15640 26 20 65 72 72 6e 6f 3d 3d 45 4e 4f 54 44 49 52  & errno==ENOTDIR
15650 20 29 20 72 63 20 3d 20 6f 73 55 6e 6c 69 6e 6b   ) rc = osUnlink
15660 28 7a 4c 6f 63 6b 46 69 6c 65 29 3b 0a 20 20 69  (zLockFile);.  i
15670 66 28 20 72 63 3c 30 20 29 7b 0a 20 20 20 20 69  f( rc<0 ){.    i
15680 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  nt tErrno = errn
15690 6f 3b 0a 20 20 20 20 72 63 20 3d 20 30 3b 0a 20  o;.    rc = 0;. 
156a0 20 20 20 69 66 28 20 45 4e 4f 45 4e 54 20 21 3d     if( ENOENT !=
156b0 20 74 45 72 72 6e 6f 20 29 7b 0a 23 69 66 20 4f   tErrno ){.#if O
156c0 53 4c 4f 43 4b 49 4e 47 5f 43 48 45 43 4b 5f 42  SLOCKING_CHECK_B
156d0 55 53 59 5f 49 4f 45 52 52 0a 20 20 20 20 20 20  USY_IOERR.      
156e0 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72  rc = sqliteError
156f0 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74  FromPosixError(t
15700 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f  Errno, SQLITE_IO
15710 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 23 65 6c  ERR_UNLOCK);.#el
15720 73 65 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  se.      rc = SQ
15730 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43  LITE_IOERR_UNLOC
15740 4b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a  K;.#endif.    }.
15750 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f      if( IS_LOCK_
15760 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20  ERROR(rc) ){.   
15770 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e     storeLastErrn
15780 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29  o(pFile, tErrno)
15790 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
157a0 72 6e 20 72 63 3b 20 0a 20 20 7d 0a 20 20 70 46  rn rc; .  }.  pF
157b0 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
157c0 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 72 65 74 75   NO_LOCK;.  retu
157d0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
157e0 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66  ./*.** Close a f
157f0 69 6c 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 20  ile.  Make sure 
15800 74 68 65 20 6c 6f 63 6b 20 68 61 73 20 62 65 65  the lock has bee
15810 6e 20 72 65 6c 65 61 73 65 64 20 62 65 66 6f 72  n released befor
15820 65 20 63 6c 6f 73 69 6e 67 2e 0a 2a 2f 0a 73 74  e closing..*/.st
15830 61 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b  atic int dotlock
15840 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69  Close(sqlite3_fi
15850 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69 6e 74 20  le *id) {.  int 
15860 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
15870 20 20 69 66 28 20 69 64 20 29 7b 0a 20 20 20 20    if( id ){.    
15880 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
15890 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
158a0 0a 20 20 20 20 64 6f 74 6c 6f 63 6b 55 6e 6c 6f  .    dotlockUnlo
158b0 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b  ck(id, NO_LOCK);
158c0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
158d0 65 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  e(pFile->locking
158e0 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 72 63  Context);.    rc
158f0 20 3d 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65   = closeUnixFile
15900 28 69 64 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  (id);.  }.  retu
15910 72 6e 20 72 63 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a  rn rc;.}./******
15920 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64  ************ End
15930 20 6f 66 20 74 68 65 20 64 6f 74 2d 66 69 6c 65   of the dot-file
15940 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61   lock implementa
15950 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  tion ***********
15960 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
15970 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15980 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15990 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
159a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
159b0 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a  *******/../*****
159c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
159d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
159e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
159f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15a00 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
15a10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15a20 2a 2a 2a 2a 20 42 65 67 69 6e 20 66 6c 6f 63 6b  **** Begin flock
15a30 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a   Locking *******
15a40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15a50 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20  *********.**.** 
15a60 55 73 65 20 74 68 65 20 66 6c 6f 63 6b 28 29 20  Use the flock() 
15a70 73 79 73 74 65 6d 20 63 61 6c 6c 20 74 6f 20 64  system call to d
15a80 6f 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2e 0a  o file locking..
15a90 2a 2a 0a 2a 2a 20 66 6c 6f 63 6b 28 29 20 6c 6f  **.** flock() lo
15aa0 63 6b 69 6e 67 20 69 73 20 6c 69 6b 65 20 64 6f  cking is like do
15ab0 74 2d 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 69  t-file locking i
15ac0 6e 20 74 68 61 74 20 74 68 65 20 76 61 72 69 6f  n that the vario
15ad0 75 73 0a 2a 2a 20 66 69 6e 65 2d 67 72 61 69 6e  us.** fine-grain
15ae0 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 73 20   locking levels 
15af0 73 75 70 70 6f 72 74 65 64 20 62 79 20 53 51 4c  supported by SQL
15b00 69 74 65 20 61 72 65 20 63 6f 6c 6c 61 70 73 65  ite are collapse
15b10 64 20 69 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e 67  d into.** a sing
15b20 6c 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  le exclusive loc
15b30 6b 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  k.  In other wor
15b40 64 73 2c 20 53 48 41 52 45 44 2c 20 52 45 53 45  ds, SHARED, RESE
15b50 52 56 45 44 2c 20 61 6e 64 0a 2a 2a 20 50 45 4e  RVED, and.** PEN
15b60 44 49 4e 47 20 6c 6f 63 6b 73 20 61 72 65 20 74  DING locks are t
15b70 68 65 20 73 61 6d 65 20 74 68 69 6e 67 20 61 73  he same thing as
15b80 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
15b90 63 6b 2e 20 20 53 51 4c 69 74 65 0a 2a 2a 20 73  ck.  SQLite.** s
15ba0 74 69 6c 6c 20 77 6f 72 6b 73 20 77 68 65 6e 20  till works when 
15bb0 79 6f 75 20 64 6f 20 74 68 69 73 2c 20 62 75 74  you do this, but
15bc0 20 63 6f 6e 63 75 72 72 65 6e 63 79 20 69 73 20   concurrency is 
15bd0 72 65 64 75 63 65 64 20 73 69 6e 63 65 0a 2a 2a  reduced since.**
15be0 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 70   only a single p
15bf0 72 6f 63 65 73 73 20 63 61 6e 20 62 65 20 72 65  rocess can be re
15c00 61 64 69 6e 67 20 74 68 65 20 64 61 74 61 62 61  ading the databa
15c10 73 65 20 61 74 20 61 20 74 69 6d 65 2e 0a 2a 2a  se at a time..**
15c20 0a 2a 2a 20 4f 6d 69 74 20 74 68 69 73 20 73 65  .** Omit this se
15c30 63 74 69 6f 6e 20 69 66 20 53 51 4c 49 54 45 5f  ction if SQLITE_
15c40 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
15c50 54 59 4c 45 20 69 73 20 74 75 72 6e 65 64 20 6f  TYLE is turned o
15c60 66 66 20 6f 72 20 69 66 0a 2a 2a 20 63 6f 6d 70  ff or if.** comp
15c70 69 6c 69 6e 67 20 66 6f 72 20 56 58 57 4f 52 4b  iling for VXWORK
15c80 53 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45  S..*/.#if SQLITE
15c90 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
15ca0 53 54 59 4c 45 20 26 26 20 21 4f 53 5f 56 58 57  STYLE && !OS_VXW
15cb0 4f 52 4b 53 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 72  ORKS../*.** Retr
15cc0 79 20 66 6c 6f 63 6b 28 29 20 63 61 6c 6c 73 20  y flock() calls 
15cd0 74 68 61 74 20 66 61 69 6c 20 77 69 74 68 20 45  that fail with E
15ce0 49 4e 54 52 0a 2a 2f 0a 23 69 66 64 65 66 20 45  INTR.*/.#ifdef E
15cf0 49 4e 54 52 0a 73 74 61 74 69 63 20 69 6e 74 20  INTR.static int 
15d00 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 69 6e 74  robust_flock(int
15d10 20 66 64 2c 20 69 6e 74 20 6f 70 29 7b 0a 20 20   fd, int op){.  
15d20 69 6e 74 20 72 63 3b 0a 20 20 64 6f 7b 20 72 63  int rc;.  do{ rc
15d30 20 3d 20 66 6c 6f 63 6b 28 66 64 2c 6f 70 29 3b   = flock(fd,op);
15d40 20 7d 77 68 69 6c 65 28 20 72 63 3c 30 20 26 26   }while( rc<0 &&
15d50 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b   errno==EINTR );
15d60 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
15d70 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 72  #else.# define r
15d80 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 61 2c 62 29  obust_flock(a,b)
15d90 20 66 6c 6f 63 6b 28 61 2c 62 29 0a 23 65 6e 64   flock(a,b).#end
15da0 69 66 0a 20 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20  if.     ../*.** 
15db0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65  This routine che
15dc0 63 6b 73 20 69 66 20 74 68 65 72 65 20 69 73 20  cks if there is 
15dd0 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
15de0 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63  held on the spec
15df0 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79  ified.** file by
15e00 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68   this or any oth
15e10 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73  er process. If s
15e20 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65  uch a lock is he
15e30 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f 75 74  ld, set *pResOut
15e40 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72  .** to a non-zer
15e50 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77 69 73  o value otherwis
15e60 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65  e *pResOut is se
15e70 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20  t to zero.  The 
15e80 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20  return value.** 
15e90 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45  is set to SQLITE
15ea0 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f  _OK unless an I/
15eb0 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64  O error occurs d
15ec0 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b  uring lock check
15ed0 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ing..*/.static i
15ee0 6e 74 20 66 6c 6f 63 6b 43 68 65 63 6b 52 65 73  nt flockCheckRes
15ef0 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65  ervedLock(sqlite
15f00 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
15f10 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e 74  *pResOut){.  int
15f20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
15f30 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65 64 20  .  int reserved 
15f40 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20  = 0;.  unixFile 
15f50 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
15f60 6c 65 2a 29 69 64 3b 0a 20 20 0a 20 20 53 69 6d  le*)id;.  .  Sim
15f70 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65  ulateIOError( re
15f80 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
15f90 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c  R_CHECKRESERVEDL
15fa0 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73  OCK; );.  .  ass
15fb0 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
15fc0 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61  .  /* Check if a
15fd0 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 20   thread in this 
15fe0 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75  process holds su
15ff0 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69  ch a lock */.  i
16000 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  f( pFile->eFileL
16010 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ock>SHARED_LOCK 
16020 29 7b 0a 20 20 20 20 72 65 73 65 72 76 65 64 20  ){.    reserved 
16030 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  = 1;.  }.  .  /*
16040 20 4f 74 68 65 72 77 69 73 65 20 73 65 65 20 69   Otherwise see i
16050 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f  f some other pro
16060 63 65 73 73 20 68 6f 6c 64 73 20 69 74 2e 20 2a  cess holds it. *
16070 2f 0a 20 20 69 66 28 20 21 72 65 73 65 72 76 65  /.  if( !reserve
16080 64 20 29 7b 0a 20 20 20 20 2f 2a 20 61 74 74 65  d ){.    /* atte
16090 6d 70 74 20 74 6f 20 67 65 74 20 74 68 65 20 6c  mpt to get the l
160a0 6f 63 6b 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6c  ock */.    int l
160b0 72 63 20 3d 20 72 6f 62 75 73 74 5f 66 6c 6f 63  rc = robust_floc
160c0 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b  k(pFile->h, LOCK
160d0 5f 45 58 20 7c 20 4c 4f 43 4b 5f 4e 42 29 3b 0a  _EX | LOCK_NB);.
160e0 20 20 20 20 69 66 28 20 21 6c 72 63 20 29 7b 0a      if( !lrc ){.
160f0 20 20 20 20 20 20 2f 2a 20 67 6f 74 20 74 68 65        /* got the
16100 20 6c 6f 63 6b 2c 20 75 6e 6c 6f 63 6b 20 69 74   lock, unlock it
16110 20 2a 2f 0a 20 20 20 20 20 20 6c 72 63 20 3d 20   */.      lrc = 
16120 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 70 46 69  robust_flock(pFi
16130 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 55 4e 29 3b  le->h, LOCK_UN);
16140 0a 20 20 20 20 20 20 69 66 20 28 20 6c 72 63 20  .      if ( lrc 
16150 29 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  ) {.        int 
16160 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
16170 20 20 20 20 20 20 20 20 2f 2a 20 75 6e 6c 6f 63          /* unloc
16180 6b 20 66 61 69 6c 65 64 20 77 69 74 68 20 61 6e  k failed with an
16190 20 65 72 72 6f 72 20 2a 2f 0a 23 69 66 20 4f 53   error */.#if OS
161a0 4c 4f 43 4b 49 4e 47 5f 43 48 45 43 4b 5f 42 55  LOCKING_CHECK_BU
161b0 53 59 5f 49 4f 45 52 52 0a 20 20 20 20 20 20 20  SY_IOERR.       
161c0 20 6c 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72   lrc = sqliteErr
161d0 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72  orFromPosixError
161e0 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f  (tErrno, SQLITE_
161f0 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 23  IOERR_UNLOCK);.#
16200 65 6c 73 65 20 0a 20 20 20 20 20 20 20 20 6c 72  else .        lr
16210 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
16220 5f 55 4e 4c 4f 43 4b 3b 20 0a 23 65 6e 64 69 66  _UNLOCK; .#endif
16230 0a 20 20 20 20 20 20 20 20 69 66 28 20 49 53 5f  .        if( IS_
16240 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 29 20  LOCK_ERROR(lrc) 
16250 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 6f  ){.          sto
16260 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c  reLastErrno(pFil
16270 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20  e, tErrno);.    
16280 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63 3b 0a        rc = lrc;.
16290 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
162a0 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20  }.    } else {. 
162b0 20 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20       int tErrno 
162c0 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72  = errno;.      r
162d0 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 20  eserved = 1;.   
162e0 20 20 20 2f 2a 20 73 6f 6d 65 6f 6e 65 20 65 6c     /* someone el
162f0 73 65 20 6d 69 67 68 74 20 68 61 76 65 20 69 74  se might have it
16300 20 72 65 73 65 72 76 65 64 20 2a 2f 0a 20 20 20   reserved */.   
16310 20 20 20 6c 72 63 20 3d 20 73 71 6c 69 74 65 45     lrc = sqliteE
16320 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
16330 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54  or(tErrno, SQLIT
16340 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 20 0a  E_IOERR_LOCK); .
16350 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43        if( IS_LOC
16360 4b 5f 45 52 52 4f 52 28 6c 72 63 29 20 29 7b 0a  K_ERROR(lrc) ){.
16370 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73          storeLas
16380 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45  tErrno(pFile, tE
16390 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 72  rrno);.        r
163a0 63 20 3d 20 6c 72 63 3b 0a 20 20 20 20 20 20 7d  c = lrc;.      }
163b0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 4f 53 54  .    }.  }.  OST
163c0 52 41 43 45 28 28 22 54 45 53 54 20 57 52 2d 4c  RACE(("TEST WR-L
163d0 4f 43 4b 20 25 64 20 25 64 20 25 64 20 28 66 6c  OCK %d %d %d (fl
163e0 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  ock)\n", pFile->
163f0 68 2c 20 72 63 2c 20 72 65 73 65 72 76 65 64 29  h, rc, reserved)
16400 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  );..#ifdef SQLIT
16410 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c  E_IGNORE_FLOCK_L
16420 4f 43 4b 5f 45 52 52 4f 52 53 0a 20 20 69 66 28  OCK_ERRORS.  if(
16430 20 28 72 63 20 26 20 53 51 4c 49 54 45 5f 49 4f   (rc & SQLITE_IO
16440 45 52 52 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49  ERR) == SQLITE_I
16450 4f 45 52 52 20 29 7b 0a 20 20 20 20 72 63 20 3d  OERR ){.    rc =
16460 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
16470 72 65 73 65 72 76 65 64 3d 31 3b 0a 20 20 7d 0a  reserved=1;.  }.
16480 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
16490 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f  _IGNORE_FLOCK_LO
164a0 43 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a 20 20 2a  CK_ERRORS */.  *
164b0 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65 72 76  pResOut = reserv
164c0 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ed;.  return rc;
164d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74  .}../*.** Lock t
164e0 68 65 20 66 69 6c 65 20 77 69 74 68 20 74 68 65  he file with the
164f0 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20   lock specified 
16500 62 79 20 70 61 72 61 6d 65 74 65 72 20 65 46 69  by parameter eFi
16510 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20  leLock - one.** 
16520 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
16530 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20  :.**.**     (1) 
16540 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20  SHARED_LOCK.**  
16550 20 20 20 28 32 29 20 52 45 53 45 52 56 45 44 5f     (2) RESERVED_
16560 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20  LOCK.**     (3) 
16570 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20  PENDING_LOCK.** 
16580 20 20 20 20 28 34 29 20 45 58 43 4c 55 53 49 56      (4) EXCLUSIV
16590 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d  E_LOCK.**.** Som
165a0 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75  etimes when requ
165b0 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20  esting one lock 
165c0 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61  state, additiona
165d0 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a  l lock states.**
165e0 20 61 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e   are inserted in
165f0 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c   between.  The l
16600 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69  ocking might fai
16610 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20  l on one of the 
16620 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74  later.** transit
16630 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65  ions leaving the
16640 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66   lock state diff
16650 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20  erent from what 
16660 69 74 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a  it started but.*
16670 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66  * still short of
16680 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20   its goal.  The 
16690 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20  following chart 
166a0 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65  shows the allowe
166b0 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73  d.** transitions
166c0 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65   and the inserte
166d0 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73  d intermediate s
166e0 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  tates:.**.**    
166f0 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52  UNLOCKED -> SHAR
16700 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20  ED.**    SHARED 
16710 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20  -> RESERVED.**  
16720 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e    SHARED -> (PEN
16730 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49  DING) -> EXCLUSI
16740 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45  VE.**    RESERVE
16750 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d  D -> (PENDING) -
16760 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  > EXCLUSIVE.**  
16770 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43    PENDING -> EXC
16780 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 66 6c 6f  LUSIVE.**.** flo
16790 63 6b 28 29 20 6f 6e 6c 79 20 72 65 61 6c 6c 79  ck() only really
167a0 20 73 75 70 70 6f 72 74 20 45 58 43 4c 55 53 49   support EXCLUSI
167b0 56 45 20 6c 6f 63 6b 73 2e 20 20 57 65 20 74 72  VE locks.  We tr
167c0 61 63 6b 20 69 6e 74 65 72 6d 65 64 69 61 74 65  ack intermediate
167d0 0a 2a 2a 20 6c 6f 63 6b 20 73 74 61 74 65 73 20  .** lock states 
167e0 69 6e 20 74 68 65 20 73 71 6c 69 74 65 33 5f 66  in the sqlite3_f
167f0 69 6c 65 20 73 74 72 75 63 74 75 72 65 2c 20 62  ile structure, b
16800 75 74 20 61 6c 6c 20 6c 6f 63 6b 73 20 53 48 41  ut all locks SHA
16810 52 45 44 20 6f 72 0a 2a 2a 20 61 62 6f 76 65 20  RED or.** above 
16820 61 72 65 20 72 65 61 6c 6c 79 20 45 58 43 4c 55  are really EXCLU
16830 53 49 56 45 20 6c 6f 63 6b 73 20 61 6e 64 20 65  SIVE locks and e
16840 78 63 6c 75 64 65 20 61 6c 6c 20 6f 74 68 65 72  xclude all other
16850 20 70 72 6f 63 65 73 73 65 73 20 66 72 6f 6d 0a   processes from.
16860 2a 2a 20 61 63 63 65 73 73 20 74 68 65 20 66 69  ** access the fi
16870 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  le..**.** This r
16880 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79  outine will only
16890 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b   increase a lock
168a0 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c 69 74  .  Use the sqlit
168b0 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20  e3OsUnlock().** 
168c0 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72  routine to lower
168d0 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c   a locking level
168e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
168f0 66 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69 74 65  flockLock(sqlite
16900 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
16910 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 69  eFileLock) {.  i
16920 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
16930 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  K;.  unixFile *p
16940 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
16950 2a 29 69 64 3b 0a 0a 20 20 61 73 73 65 72 74 28  *)id;..  assert(
16960 20 70 46 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20   pFile );..  /* 
16970 69 66 20 77 65 20 61 6c 72 65 61 64 79 20 68 61  if we already ha
16980 76 65 20 61 20 6c 6f 63 6b 2c 20 69 74 20 69 73  ve a lock, it is
16990 20 65 78 63 6c 75 73 69 76 65 2e 20 20 0a 20 20   exclusive.  .  
169a0 2a 2a 20 4a 75 73 74 20 61 64 6a 75 73 74 20 6c  ** Just adjust l
169b0 65 76 65 6c 20 61 6e 64 20 70 75 6e 74 20 6f 6e  evel and punt on
169c0 20 6f 75 74 74 61 20 68 65 72 65 2e 20 2a 2f 0a   outta here. */.
169d0 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 65 46 69    if (pFile->eFi
169e0 6c 65 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c 4f 43 4b  leLock > NO_LOCK
169f0 29 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65  ) {.    pFile->e
16a00 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65  FileLock = eFile
16a10 4c 6f 63 6b 3b 0a 20 20 20 20 72 65 74 75 72 6e  Lock;.    return
16a20 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
16a30 20 20 0a 20 20 2f 2a 20 67 72 61 62 20 61 6e 20    .  /* grab an 
16a40 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 2a  exclusive lock *
16a50 2f 0a 20 20 0a 20 20 69 66 20 28 72 6f 62 75 73  /.  .  if (robus
16a60 74 5f 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68  t_flock(pFile->h
16a70 2c 20 4c 4f 43 4b 5f 45 58 20 7c 20 4c 4f 43 4b  , LOCK_EX | LOCK
16a80 5f 4e 42 29 29 20 7b 0a 20 20 20 20 69 6e 74 20  _NB)) {.    int 
16a90 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
16aa0 20 20 20 20 2f 2a 20 64 69 64 6e 27 74 20 67 65      /* didn't ge
16ab0 74 2c 20 6d 75 73 74 20 62 65 20 62 75 73 79 20  t, must be busy 
16ac0 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
16ad0 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78  teErrorFromPosix
16ae0 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51  Error(tErrno, SQ
16af0 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29  LITE_IOERR_LOCK)
16b00 3b 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43  ;.    if( IS_LOC
16b10 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20  K_ERROR(rc) ){. 
16b20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72       storeLastEr
16b30 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e  rno(pFile, tErrn
16b40 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 65 6c  o);.    }.  } el
16b50 73 65 20 7b 0a 20 20 20 20 2f 2a 20 67 6f 74 20  se {.    /* got 
16b60 69 74 2c 20 73 65 74 20 74 68 65 20 74 79 70 65  it, set the type
16b70 20 61 6e 64 20 72 65 74 75 72 6e 20 6f 6b 20 2a   and return ok *
16b80 2f 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69  /.    pFile->eFi
16b90 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f  leLock = eFileLo
16ba0 63 6b 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43  ck;.  }.  OSTRAC
16bb0 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25  E(("LOCK    %d %
16bc0 73 20 25 73 20 28 66 6c 6f 63 6b 29 5c 6e 22 2c  s %s (flock)\n",
16bd0 20 70 46 69 6c 65 2d 3e 68 2c 20 61 7a 46 69 6c   pFile->h, azFil
16be0 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29  eLock(eFileLock)
16bf0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 72 63  , .           rc
16c00 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f  ==SQLITE_OK ? "o
16c10 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b  k" : "failed"));
16c20 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 49  .#ifdef SQLITE_I
16c30 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b  GNORE_FLOCK_LOCK
16c40 5f 45 52 52 4f 52 53 0a 20 20 69 66 28 20 28 72  _ERRORS.  if( (r
16c50 63 20 26 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c & SQLITE_IOERR
16c60 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  ) == SQLITE_IOER
16c70 52 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  R ){.    rc = SQ
16c80 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 23  LITE_BUSY;.  }.#
16c90 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
16ca0 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43  IGNORE_FLOCK_LOC
16cb0 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a 20 20 72 65  K_ERRORS */.  re
16cc0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
16cd0 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63  ** Lower the loc
16ce0 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69  king level on fi
16cf0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46  le descriptor pF
16d00 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b  ile to eFileLock
16d10 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20  .  eFileLock.** 
16d20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e  must be either N
16d30 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44  O_LOCK or SHARED
16d40 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  _LOCK..**.** If 
16d50 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
16d60 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65  l of the file de
16d70 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65  scriptor is alre
16d80 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a  ady at or below.
16d90 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ** the requested
16da0 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20   locking level, 
16db0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
16dc0 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74  a no-op..*/.stat
16dd0 69 63 20 69 6e 74 20 66 6c 6f 63 6b 55 6e 6c 6f  ic int flockUnlo
16de0 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
16df0 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f  *id, int eFileLo
16e00 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65  ck) {.  unixFile
16e10 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
16e20 69 6c 65 2a 29 69 64 3b 0a 20 20 0a 20 20 61 73  ile*)id;.  .  as
16e30 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20  sert( pFile );. 
16e40 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4c 4f 43   OSTRACE(("UNLOC
16e50 4b 20 20 25 64 20 25 64 20 77 61 73 20 25 64 20  K  %d %d was %d 
16e60 70 69 64 3d 25 64 20 28 66 6c 6f 63 6b 29 5c 6e  pid=%d (flock)\n
16e70 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69  ", pFile->h, eFi
16e80 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20  leLock,.        
16e90 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
16ea0 6f 63 6b 2c 20 67 65 74 70 69 64 28 29 29 29 3b  ock, getpid()));
16eb0 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65  .  assert( eFile
16ec0 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock<=SHARED_LOC
16ed0 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d  K );.  .  /* no-
16ee0 6f 70 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a  op if possible *
16ef0 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65  /.  if( pFile->e
16f00 46 69 6c 65 4c 6f 63 6b 3d 3d 65 46 69 6c 65 4c  FileLock==eFileL
16f10 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ock ){.    retur
16f20 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
16f30 0a 20 20 0a 20 20 2f 2a 20 73 68 61 72 65 64 20  .  .  /* shared 
16f40 63 61 6e 20 6a 75 73 74 20 62 65 20 73 65 74 20  can just be set 
16f50 62 65 63 61 75 73 65 20 77 65 20 61 6c 77 61 79  because we alway
16f60 73 20 68 61 76 65 20 61 6e 20 65 78 63 6c 75 73  s have an exclus
16f70 69 76 65 20 2a 2f 0a 20 20 69 66 20 28 65 46 69  ive */.  if (eFi
16f80 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
16f90 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65  OCK) {.    pFile
16fa0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46  ->eFileLock = eF
16fb0 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 72 65 74  ileLock;.    ret
16fc0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
16fd0 20 7d 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2c 20 72   }.  .  /* no, r
16fe0 65 61 6c 6c 79 2c 20 75 6e 6c 6f 63 6b 2e 20 2a  eally, unlock. *
16ff0 2f 0a 20 20 69 66 28 20 72 6f 62 75 73 74 5f 66  /.  if( robust_f
17000 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c  lock(pFile->h, L
17010 4f 43 4b 5f 55 4e 29 20 29 7b 0a 23 69 66 64 65  OCK_UN) ){.#ifde
17020 66 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f  f SQLITE_IGNORE_
17030 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52  FLOCK_LOCK_ERROR
17040 53 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  S.    return SQL
17050 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 20 2f  ITE_OK;.#endif /
17060 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f  * SQLITE_IGNORE_
17070 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52  FLOCK_LOCK_ERROR
17080 53 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  S */.    return 
17090 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c  SQLITE_IOERR_UNL
170a0 4f 43 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  OCK;.  }else{.  
170b0 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
170c0 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20  ck = NO_LOCK;.  
170d0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
170e0 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  OK;.  }.}../*.**
170f0 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 2a   Close a file..*
17100 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c 6f  /.static int flo
17110 63 6b 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f  ckClose(sqlite3_
17120 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69 6e  file *id) {.  in
17130 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
17140 3b 0a 20 20 69 66 28 20 69 64 20 29 7b 0a 20 20  ;.  if( id ){.  
17150 20 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 69 64    flockUnlock(id
17160 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  , NO_LOCK);.    
17170 72 63 20 3d 20 63 6c 6f 73 65 55 6e 69 78 46 69  rc = closeUnixFi
17180 6c 65 28 69 64 29 3b 0a 20 20 7d 0a 20 20 72 65  le(id);.  }.  re
17190 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6e 64  turn rc;.}..#end
171a0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41  if /* SQLITE_ENA
171b0 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
171c0 45 20 26 26 20 21 4f 53 5f 56 58 57 4f 52 4b 20  E && !OS_VXWORK 
171d0 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  */../***********
171e0 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20  ******** End of 
171f0 74 68 65 20 66 6c 6f 63 6b 20 6c 6f 63 6b 20 69  the flock lock i
17200 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a  mplementation **
17210 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17220 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
17230 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17240 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17250 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17260 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17270 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **/../**********
17280 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17290 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
172a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
172b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
172c0 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
172d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65  ************* Be
172e0 67 69 6e 20 4e 61 6d 65 64 20 53 65 6d 61 70 68  gin Named Semaph
172f0 6f 72 65 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a  ore Locking ****
17300 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17310 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4e 61 6d 65 64  ****.**.** Named
17320 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69   semaphore locki
17330 6e 67 20 69 73 20 6f 6e 6c 79 20 73 75 70 70 6f  ng is only suppo
17340 72 74 65 64 20 6f 6e 20 56 78 57 6f 72 6b 73 2e  rted on VxWorks.
17350 0a 2a 2a 0a 2a 2a 20 53 65 6d 61 70 68 6f 72 65  .**.** Semaphore
17360 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6c 69 6b 65   locking is like
17370 20 64 6f 74 2d 6c 6f 63 6b 20 61 6e 64 20 66 6c   dot-lock and fl
17380 6f 63 6b 20 69 6e 20 74 68 61 74 20 69 74 20 72  ock in that it r
17390 65 61 6c 6c 79 20 6f 6e 6c 79 0a 2a 2a 20 73 75  eally only.** su
173a0 70 70 6f 72 74 73 20 45 58 43 4c 55 53 49 56 45  pports EXCLUSIVE
173b0 20 6c 6f 63 6b 69 6e 67 2e 20 20 4f 6e 6c 79 20   locking.  Only 
173c0 61 20 73 69 6e 67 6c 65 20 70 72 6f 63 65 73 73  a single process
173d0 20 63 61 6e 20 72 65 61 64 20 6f 72 20 77 72 69   can read or wri
173e0 74 65 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  te.** the databa
173f0 73 65 20 66 69 6c 65 20 61 74 20 61 20 74 69 6d  se file at a tim
17400 65 2e 20 20 54 68 69 73 20 72 65 64 75 63 65 73  e.  This reduces
17410 20 70 6f 74 65 6e 74 69 61 6c 20 63 6f 6e 63 75   potential concu
17420 72 72 65 6e 63 79 2c 20 62 75 74 0a 2a 2a 20 6d  rrency, but.** m
17430 61 6b 65 73 20 74 68 65 20 6c 6f 63 6b 20 69 6d  akes the lock im
17440 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6d 75 63  plementation muc
17450 68 20 65 61 73 69 65 72 2e 0a 2a 2f 0a 23 69 66  h easier..*/.#if
17460 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 0a 2f 2a 0a   OS_VXWORKS../*.
17470 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
17480 63 68 65 63 6b 73 20 69 66 20 74 68 65 72 65 20  checks if there 
17490 69 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  is a RESERVED lo
174a0 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73  ck held on the s
174b0 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65  pecified.** file
174c0 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20   by this or any 
174d0 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49  other process. I
174e0 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73  f such a lock is
174f0 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73   held, set *pRes
17500 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d  Out.** to a non-
17510 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72  zero value other
17520 77 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73  wise *pResOut is
17530 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54   set to zero.  T
17540 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a  he return value.
17550 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c  ** is set to SQL
17560 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e  ITE_OK unless an
17570 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72   I/O error occur
17580 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68  s during lock ch
17590 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  ecking..*/.stati
175a0 63 20 69 6e 74 20 73 65 6d 43 68 65 63 6b 52 65  c int semCheckRe
175b0 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74  servedLock(sqlit
175c0 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
175d0 20 2a 70 52 65 73 4f 75 74 29 20 7b 0a 20 20 69   *pResOut) {.  i
175e0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
175f0 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65  K;.  int reserve
17600 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c  d = 0;.  unixFil
17610 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
17620 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53 69 6d  File*)id;..  Sim
17630 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65  ulateIOError( re
17640 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
17650 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c  R_CHECKRESERVEDL
17660 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73  OCK; );.  .  ass
17670 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 0a 20  ert( pFile );.. 
17680 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 20 74   /* Check if a t
17690 68 72 65 61 64 20 69 6e 20 74 68 69 73 20 70 72  hread in this pr
176a0 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75 63 68  ocess holds such
176b0 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28   a lock */.  if(
176c0 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
176d0 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b  k>SHARED_LOCK ){
176e0 0a 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20  .    reserved = 
176f0 31 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f  1;.  }.  .  /* O
17700 74 68 65 72 77 69 73 65 20 73 65 65 20 69 66 20  therwise see if 
17710 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65  some other proce
17720 73 73 20 68 6f 6c 64 73 20 69 74 2e 20 2a 2f 0a  ss holds it. */.
17730 20 20 69 66 28 20 21 72 65 73 65 72 76 65 64 20    if( !reserved 
17740 29 7b 0a 20 20 20 20 73 65 6d 5f 74 20 2a 70 53  ){.    sem_t *pS
17750 65 6d 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  em = pFile->pIno
17760 64 65 2d 3e 70 53 65 6d 3b 0a 0a 20 20 20 20 69  de->pSem;..    i
17770 66 28 20 73 65 6d 5f 74 72 79 77 61 69 74 28 70  f( sem_trywait(p
17780 53 65 6d 29 3d 3d 2d 31 20 29 7b 0a 20 20 20 20  Sem)==-1 ){.    
17790 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65    int tErrno = e
177a0 72 72 6e 6f 3b 0a 20 20 20 20 20 20 69 66 28 20  rrno;.      if( 
177b0 45 41 47 41 49 4e 20 21 3d 20 74 45 72 72 6e 6f  EAGAIN != tErrno
177c0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
177d0 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d   sqliteErrorFrom
177e0 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e  PosixError(tErrn
177f0 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  o, SQLITE_IOERR_
17800 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43  CHECKRESERVEDLOC
17810 4b 29 3b 0a 20 20 20 20 20 20 20 20 73 74 6f 72  K);.        stor
17820 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65  eLastErrno(pFile
17830 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20  , tErrno);.     
17840 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
17850 20 20 2f 2a 20 73 6f 6d 65 6f 6e 65 20 65 6c 73    /* someone els
17860 65 20 68 61 73 20 74 68 65 20 6c 6f 63 6b 20 77  e has the lock w
17870 68 65 6e 20 77 65 20 61 72 65 20 69 6e 20 4e 4f  hen we are in NO
17880 5f 4c 4f 43 4b 20 2a 2f 0a 20 20 20 20 20 20 20  _LOCK */.       
17890 20 72 65 73 65 72 76 65 64 20 3d 20 28 70 46 69   reserved = (pFi
178a0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3c 20  le->eFileLock < 
178b0 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20  SHARED_LOCK);.  
178c0 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
178d0 0a 20 20 20 20 20 20 2f 2a 20 77 65 20 63 6f 75  .      /* we cou
178e0 6c 64 20 68 61 76 65 20 69 74 20 69 66 20 77 65  ld have it if we
178f0 20 77 61 6e 74 20 69 74 20 2a 2f 0a 20 20 20 20   want it */.    
17900 20 20 73 65 6d 5f 70 6f 73 74 28 70 53 65 6d 29    sem_post(pSem)
17910 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 4f 53  ;.    }.  }.  OS
17920 54 52 41 43 45 28 28 22 54 45 53 54 20 57 52 2d  TRACE(("TEST WR-
17930 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 20 28 73  LOCK %d %d %d (s
17940 65 6d 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  em)\n", pFile->h
17950 2c 20 72 63 2c 20 72 65 73 65 72 76 65 64 29 29  , rc, reserved))
17960 3b 0a 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20  ;..  *pResOut = 
17970 72 65 73 65 72 76 65 64 3b 0a 20 20 72 65 74 75  reserved;.  retu
17980 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
17990 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69  Lock the file wi
179a0 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63  th the lock spec
179b0 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74  ified by paramet
179c0 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f  er eFileLock - o
179d0 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c  ne.** of the fol
179e0 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20  lowing:.**.**   
179f0 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43    (1) SHARED_LOC
17a00 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53  K.**     (2) RES
17a10 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  ERVED_LOCK.**   
17a20 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f    (3) PENDING_LO
17a30 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58  CK.**     (4) EX
17a40 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a  CLUSIVE_LOCK.**.
17a50 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65  ** Sometimes whe
17a60 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65  n requesting one
17a70 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64   lock state, add
17a80 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61  itional lock sta
17a90 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72  tes.** are inser
17aa0 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20  ted in between. 
17ab0 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67   The locking mig
17ac0 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f  ht fail on one o
17ad0 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74  f the later.** t
17ae0 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69  ransitions leavi
17af0 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74  ng the lock stat
17b00 65 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d  e different from
17b10 20 77 68 61 74 20 69 74 20 73 74 61 72 74 65 64   what it started
17b20 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68   but.** still sh
17b30 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e  ort of its goal.
17b40 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
17b50 63 68 61 72 74 20 73 68 6f 77 73 20 74 68 65 20  chart shows the 
17b60 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73  allowed.** trans
17b70 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69  itions and the i
17b80 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64  nserted intermed
17b90 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a  iate states:.**.
17ba0 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d  **    UNLOCKED -
17bb0 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53  > SHARED.**    S
17bc0 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45  HARED -> RESERVE
17bd0 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d  D.**    SHARED -
17be0 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45  > (PENDING) -> E
17bf0 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52  XCLUSIVE.**    R
17c00 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44  ESERVED -> (PEND
17c10 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56  ING) -> EXCLUSIV
17c20 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20  E.**    PENDING 
17c30 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a  -> EXCLUSIVE.**.
17c40 2a 2a 20 53 65 6d 61 70 68 6f 72 65 20 6c 6f 63  ** Semaphore loc
17c50 6b 73 20 6f 6e 6c 79 20 72 65 61 6c 6c 79 20 73  ks only really s
17c60 75 70 70 6f 72 74 20 45 58 43 4c 55 53 49 56 45  upport EXCLUSIVE
17c70 20 6c 6f 63 6b 73 2e 20 20 57 65 20 74 72 61 63   locks.  We trac
17c80 6b 20 69 6e 74 65 72 6d 65 64 69 61 74 65 0a 2a  k intermediate.*
17c90 2a 20 6c 6f 63 6b 20 73 74 61 74 65 73 20 69 6e  * lock states in
17ca0 20 74 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c   the sqlite3_fil
17cb0 65 20 73 74 72 75 63 74 75 72 65 2c 20 62 75 74  e structure, but
17cc0 20 61 6c 6c 20 6c 6f 63 6b 73 20 53 48 41 52 45   all locks SHARE
17cd0 44 20 6f 72 0a 2a 2a 20 61 62 6f 76 65 20 61 72  D or.** above ar
17ce0 65 20 72 65 61 6c 6c 79 20 45 58 43 4c 55 53 49  e really EXCLUSI
17cf0 56 45 20 6c 6f 63 6b 73 20 61 6e 64 20 65 78 63  VE locks and exc
17d00 6c 75 64 65 20 61 6c 6c 20 6f 74 68 65 72 20 70  lude all other p
17d10 72 6f 63 65 73 73 65 73 20 66 72 6f 6d 0a 2a 2a  rocesses from.**
17d20 20 61 63 63 65 73 73 20 74 68 65 20 66 69 6c 65   access the file
17d30 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
17d40 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69  tine will only i
17d50 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20  ncrease a lock. 
17d60 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33   Use the sqlite3
17d70 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f  OsUnlock().** ro
17d80 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61  utine to lower a
17d90 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a   locking level..
17da0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
17db0 6d 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  mLock(sqlite3_fi
17dc0 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c  le *id, int eFil
17dd0 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46  eLock) {.  unixF
17de0 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
17df0 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 73 65  ixFile*)id;.  se
17e00 6d 5f 74 20 2a 70 53 65 6d 20 3d 20 70 46 69 6c  m_t *pSem = pFil
17e10 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 3b  e->pInode->pSem;
17e20 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
17e30 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 69 66 20  TE_OK;..  /* if 
17e40 77 65 20 61 6c 72 65 61 64 79 20 68 61 76 65 20  we already have 
17e50 61 20 6c 6f 63 6b 2c 20 69 74 20 69 73 20 65 78  a lock, it is ex
17e60 63 6c 75 73 69 76 65 2e 20 20 0a 20 20 2a 2a 20  clusive.  .  ** 
17e70 4a 75 73 74 20 61 64 6a 75 73 74 20 6c 65 76 65  Just adjust leve
17e80 6c 20 61 6e 64 20 70 75 6e 74 20 6f 6e 20 6f 75  l and punt on ou
17e90 74 74 61 20 68 65 72 65 2e 20 2a 2f 0a 20 20 69  tta here. */.  i
17ea0 66 20 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  f (pFile->eFileL
17eb0 6f 63 6b 20 3e 20 4e 4f 5f 4c 4f 43 4b 29 20 7b  ock > NO_LOCK) {
17ec0 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c  .    pFile->eFil
17ed0 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63  eLock = eFileLoc
17ee0 6b 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  k;.    rc = SQLI
17ef0 54 45 5f 4f 4b 3b 0a 20 20 20 20 67 6f 74 6f 20  TE_OK;.    goto 
17f00 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20  sem_end_lock;.  
17f10 7d 0a 20 20 0a 20 20 2f 2a 20 6c 6f 63 6b 20 73  }.  .  /* lock s
17f20 65 6d 61 70 68 6f 72 65 20 6e 6f 77 20 62 75 74  emaphore now but
17f30 20 62 61 69 6c 20 6f 75 74 20 77 68 65 6e 20 61   bail out when a
17f40 6c 72 65 61 64 79 20 6c 6f 63 6b 65 64 2e 20 2a  lready locked. *
17f50 2f 0a 20 20 69 66 28 20 73 65 6d 5f 74 72 79 77  /.  if( sem_tryw
17f60 61 69 74 28 70 53 65 6d 29 3d 3d 2d 31 20 29 7b  ait(pSem)==-1 ){
17f70 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
17f80 5f 42 55 53 59 3b 0a 20 20 20 20 67 6f 74 6f 20  _BUSY;.    goto 
17f90 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20  sem_end_lock;.  
17fa0 7d 0a 0a 20 20 2f 2a 20 67 6f 74 20 69 74 2c 20  }..  /* got it, 
17fb0 73 65 74 20 74 68 65 20 74 79 70 65 20 61 6e 64  set the type and
17fc0 20 72 65 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20   return ok */.  
17fd0 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
17fe0 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 0a 20   = eFileLock;.. 
17ff0 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20  sem_end_lock:.  
18000 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
18010 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f  .** Lower the lo
18020 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66  cking level on f
18030 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 70  ile descriptor p
18040 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63  File to eFileLoc
18050 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a  k.  eFileLock.**
18060 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20   must be either 
18070 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45  NO_LOCK or SHARE
18080 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66  D_LOCK..**.** If
18090 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
180a0 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64  el of the file d
180b0 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72  escriptor is alr
180c0 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77  eady at or below
180d0 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65  .** the requeste
180e0 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c  d locking level,
180f0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
18100 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61   a no-op..*/.sta
18110 74 69 63 20 69 6e 74 20 73 65 6d 55 6e 6c 6f 63  tic int semUnloc
18120 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
18130 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63  id, int eFileLoc
18140 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  k) {.  unixFile 
18150 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
18160 6c 65 2a 29 69 64 3b 0a 20 20 73 65 6d 5f 74 20  le*)id;.  sem_t 
18170 2a 70 53 65 6d 20 3d 20 70 46 69 6c 65 2d 3e 70  *pSem = pFile->p
18180 49 6e 6f 64 65 2d 3e 70 53 65 6d 3b 0a 0a 20 20  Inode->pSem;..  
18190 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
181a0 0a 20 20 61 73 73 65 72 74 28 20 70 53 65 6d 20  .  assert( pSem 
181b0 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55  );.  OSTRACE(("U
181c0 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73  NLOCK  %d %d was
181d0 20 25 64 20 70 69 64 3d 25 64 20 28 73 65 6d 29   %d pid=%d (sem)
181e0 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65  \n", pFile->h, e
181f0 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20  FileLock,.      
18200 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c       pFile->eFil
18210 65 4c 6f 63 6b 2c 20 67 65 74 70 69 64 28 29 29  eLock, getpid())
18220 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46 69  );.  assert( eFi
18230 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c  leLock<=SHARED_L
18240 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e  OCK );.  .  /* n
18250 6f 2d 6f 70 20 69 66 20 70 6f 73 73 69 62 6c 65  o-op if possible
18260 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   */.  if( pFile-
18270 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 65 46 69 6c  >eFileLock==eFil
18280 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65 74  eLock ){.    ret
18290 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
182a0 20 7d 0a 20 20 0a 20 20 2f 2a 20 73 68 61 72 65   }.  .  /* share
182b0 64 20 63 61 6e 20 6a 75 73 74 20 62 65 20 73 65  d can just be se
182c0 74 20 62 65 63 61 75 73 65 20 77 65 20 61 6c 77  t because we alw
182d0 61 79 73 20 68 61 76 65 20 61 6e 20 65 78 63 6c  ays have an excl
182e0 75 73 69 76 65 20 2a 2f 0a 20 20 69 66 20 28 65  usive */.  if (e
182f0 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
18300 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46 69  _LOCK) {.    pFi
18310 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
18320 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 72  eFileLock;.    r
18330 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
18340 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2c  .  }.  .  /* no,
18350 20 72 65 61 6c 6c 79 20 75 6e 6c 6f 63 6b 2e 20   really unlock. 
18360 2a 2f 0a 20 20 69 66 20 28 20 73 65 6d 5f 70 6f  */.  if ( sem_po
18370 73 74 28 70 53 65 6d 29 3d 3d 2d 31 20 29 20 7b  st(pSem)==-1 ) {
18380 0a 20 20 20 20 69 6e 74 20 72 63 2c 20 74 45 72  .    int rc, tEr
18390 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
183a0 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f   rc = sqliteErro
183b0 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28  rFromPosixError(
183c0 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49  tErrno, SQLITE_I
183d0 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 20 20  OERR_UNLOCK);.  
183e0 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52    if( IS_LOCK_ER
183f0 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20  ROR(rc) ){.     
18400 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28   storeLastErrno(
18410 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a  pFile, tErrno);.
18420 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
18430 20 72 63 3b 20 0a 20 20 7d 0a 20 20 70 46 69 6c   rc; .  }.  pFil
18440 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e  e->eFileLock = N
18450 4f 5f 4c 4f 43 4b 3b 0a 20 20 72 65 74 75 72 6e  O_LOCK;.  return
18460 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
18470 2a 0a 20 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69  *. ** Close a fi
18480 6c 65 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69  le.. */.static i
18490 6e 74 20 73 65 6d 43 6c 6f 73 65 28 73 71 6c 69  nt semClose(sqli
184a0 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a  te3_file *id) {.
184b0 20 20 69 66 28 20 69 64 20 29 7b 0a 20 20 20 20    if( id ){.    
184c0 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
184d0 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
184e0 0a 20 20 20 20 73 65 6d 55 6e 6c 6f 63 6b 28 69  .    semUnlock(i
184f0 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20  d, NO_LOCK);.   
18500 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
18510 3b 0a 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d  ;.    unixEnterM
18520 75 74 65 78 28 29 3b 0a 20 20 20 20 72 65 6c 65  utex();.    rele
18530 61 73 65 49 6e 6f 64 65 49 6e 66 6f 28 70 46 69  aseInodeInfo(pFi
18540 6c 65 29 3b 0a 20 20 20 20 75 6e 69 78 4c 65 61  le);.    unixLea
18550 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 63  veMutex();.    c
18560 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29  loseUnixFile(id)
18570 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
18580 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6e  QLITE_OK;.}..#en
18590 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b  dif /* OS_VXWORK
185a0 53 20 2a 2f 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65 64  S */./*.** Named
185b0 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69   semaphore locki
185c0 6e 67 20 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c  ng is only avail
185d0 61 62 6c 65 20 6f 6e 20 56 78 57 6f 72 6b 73 2e  able on VxWorks.
185e0 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .**.************
185f0 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 6e  *** End of the n
18600 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6c  amed semaphore l
18610 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ock implementati
18620 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  on *************
18630 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
18640 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18650 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18660 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18670 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18680 2a 2a 2f 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  **/.../*********
18690 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
186a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
186b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
186c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
186d0 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
186e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
186f0 2a 20 42 65 67 69 6e 20 41 46 50 20 4c 6f 63 6b  * Begin AFP Lock
18700 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ing ************
18710 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18720 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 41 46 50 20  *****.**.** AFP 
18730 69 73 20 74 68 65 20 41 70 70 6c 65 20 46 69 6c  is the Apple Fil
18740 69 6e 67 20 50 72 6f 74 6f 63 6f 6c 2e 20 20 41  ing Protocol.  A
18750 46 50 20 69 73 20 61 20 6e 65 74 77 6f 72 6b 20  FP is a network 
18760 66 69 6c 65 73 79 73 74 65 6d 20 66 6f 75 6e 64  filesystem found
18770 0a 2a 2a 20 6f 6e 20 41 70 70 6c 65 20 4d 61 63  .** on Apple Mac
18780 69 6e 74 6f 73 68 20 63 6f 6d 70 75 74 65 72 73  intosh computers
18790 20 2d 20 62 6f 74 68 20 4f 53 39 20 61 6e 64 20   - both OS9 and 
187a0 4f 53 58 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 72 64  OSX..**.** Third
187b0 2d 70 61 72 74 79 20 69 6d 70 6c 65 6d 65 6e 74  -party implement
187c0 61 74 69 6f 6e 73 20 6f 66 20 41 46 50 20 61 72  ations of AFP ar
187d0 65 20 61 76 61 69 6c 61 62 6c 65 2e 20 20 42 75  e available.  Bu
187e0 74 20 74 68 69 73 20 63 6f 64 65 20 68 65 72 65  t this code here
187f0 0a 2a 2a 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 6f  .** only works o
18800 6e 20 4f 53 58 2e 0a 2a 2f 0a 0a 23 69 66 20 64  n OSX..*/..#if d
18810 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
18820 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42  ) && SQLITE_ENAB
18830 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
18840 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 66 70 4c 6f  ./*.** The afpLo
18850 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 73 74 72  ckingContext str
18860 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 20  ucture contains 
18870 61 6c 6c 20 61 66 70 20 6c 6f 63 6b 20 73 70 65  all afp lock spe
18880 63 69 66 69 63 20 73 74 61 74 65 0a 2a 2f 0a 74  cific state.*/.t
18890 79 70 65 64 65 66 20 73 74 72 75 63 74 20 61 66  ypedef struct af
188a0 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  pLockingContext 
188b0 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  afpLockingContex
188c0 74 3b 0a 73 74 72 75 63 74 20 61 66 70 4c 6f 63  t;.struct afpLoc
188d0 6b 69 6e 67 43 6f 6e 74 65 78 74 20 7b 0a 20 20  kingContext {.  
188e0 69 6e 74 20 72 65 73 65 72 76 65 64 3b 0a 20 20  int reserved;.  
188f0 63 6f 6e 73 74 20 63 68 61 72 20 2a 64 62 50 61  const char *dbPa
18900 74 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  th;             
18910 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f  /* Name of the o
18920 70 65 6e 20 66 69 6c 65 20 2a 2f 0a 7d 3b 0a 0a  pen file */.};..
18930 73 74 72 75 63 74 20 42 79 74 65 52 61 6e 67 65  struct ByteRange
18940 4c 6f 63 6b 50 42 32 0a 7b 0a 20 20 75 6e 73 69  LockPB2.{.  unsi
18950 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6f  gned long long o
18960 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 2f 2a  ffset;        /*
18970 20 6f 66 66 73 65 74 20 74 6f 20 66 69 72 73 74   offset to first
18980 20 62 79 74 65 20 74 6f 20 6c 6f 63 6b 20 2a 2f   byte to lock */
18990 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  .  unsigned long
189a0 20 6c 6f 6e 67 20 6c 65 6e 67 74 68 3b 20 20 20   long length;   
189b0 20 20 20 20 20 2f 2a 20 6e 62 72 20 6f 66 20 62       /* nbr of b
189c0 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a  ytes to lock */.
189d0 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20    unsigned long 
189e0 6c 6f 6e 67 20 72 65 74 52 61 6e 67 65 53 74 61  long retRangeSta
189f0 72 74 3b 20 2f 2a 20 6e 62 72 20 6f 66 20 31 73  rt; /* nbr of 1s
18a00 74 20 62 79 74 65 20 6c 6f 63 6b 65 64 20 69 66  t byte locked if
18a10 20 73 75 63 63 65 73 73 66 75 6c 20 2a 2f 0a 20   successful */. 
18a20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 75   unsigned char u
18a30 6e 4c 6f 63 6b 46 6c 61 67 3b 20 20 20 20 20 20  nLockFlag;      
18a40 20 20 20 2f 2a 20 31 20 3d 20 75 6e 6c 6f 63 6b     /* 1 = unlock
18a50 2c 20 30 20 3d 20 6c 6f 63 6b 20 2a 2f 0a 20 20  , 0 = lock */.  
18a60 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 73 74  unsigned char st
18a70 61 72 74 45 6e 64 46 6c 61 67 3b 20 20 20 20 20  artEndFlag;     
18a80 20 20 2f 2a 20 31 3d 72 65 6c 20 74 6f 20 65 6e    /* 1=rel to en
18a90 64 20 6f 66 20 66 6f 72 6b 2c 20 30 3d 72 65 6c  d of fork, 0=rel
18aa0 20 74 6f 20 73 74 61 72 74 20 2a 2f 0a 20 20 69   to start */.  i
18ab0 6e 74 20 66 64 3b 20 20 20 20 20 20 20 20 20 20  nt fd;          
18ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18ad0 20 2f 2a 20 66 69 6c 65 20 64 65 73 63 20 74 6f   /* file desc to
18ae0 20 61 73 73 6f 63 20 74 68 69 73 20 6c 6f 63 6b   assoc this lock
18af0 20 77 69 74 68 20 2a 2f 0a 7d 3b 0a 0a 23 64 65   with */.};..#de
18b00 66 69 6e 65 20 61 66 70 66 73 42 79 74 65 52 61  fine afpfsByteRa
18b10 6e 67 65 4c 6f 63 6b 32 46 53 43 54 4c 20 20 20  ngeLock2FSCTL   
18b20 20 20 20 20 20 5f 49 4f 57 52 28 27 7a 27 2c 20       _IOWR('z', 
18b30 32 33 2c 20 73 74 72 75 63 74 20 42 79 74 65 52  23, struct ByteR
18b40 61 6e 67 65 4c 6f 63 6b 50 42 32 29 0a 0a 2f 2a  angeLockPB2)../*
18b50 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 75 74  .** This is a ut
18b60 69 6c 69 74 79 20 66 6f 72 20 73 65 74 74 69 6e  ility for settin
18b70 67 20 6f 72 20 63 6c 65 61 72 69 6e 67 20 61 20  g or clearing a 
18b80 62 69 74 2d 72 61 6e 67 65 20 6c 6f 63 6b 20 6f  bit-range lock o
18b90 6e 20 61 6e 0a 2a 2a 20 41 46 50 20 66 69 6c 65  n an.** AFP file
18ba0 73 79 73 74 65 6d 2e 0a 2a 2a 20 0a 2a 2a 20 52  system..** .** R
18bb0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
18bc0 6f 6e 20 73 75 63 63 65 73 73 2c 20 53 51 4c 49  on success, SQLI
18bd0 54 45 5f 42 55 53 59 20 6f 6e 20 66 61 69 6c 75  TE_BUSY on failu
18be0 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  re..*/.static in
18bf0 74 20 61 66 70 53 65 74 4c 6f 63 6b 28 0a 20 20  t afpSetLock(.  
18c00 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 61 74 68  const char *path
18c10 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
18c20 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69  * Name of the fi
18c30 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20  le to be locked 
18c40 6f 72 20 75 6e 6c 6f 63 6b 65 64 20 2a 2f 0a 20  or unlocked */. 
18c50 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
18c60 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
18c70 2f 2a 20 4f 70 65 6e 20 66 69 6c 65 20 64 65 73  /* Open file des
18c80 63 72 69 70 74 6f 72 20 6f 6e 20 70 61 74 68 20  criptor on path 
18c90 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f  */.  unsigned lo
18ca0 6e 67 20 6c 6f 6e 67 20 6f 66 66 73 65 74 2c 20  ng long offset, 
18cb0 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74      /* First byt
18cc0 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20 2a  e to be locked *
18cd0 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  /.  unsigned lon
18ce0 67 20 6c 6f 6e 67 20 6c 65 6e 67 74 68 2c 20 20  g long length,  
18cf0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
18d00 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f  bytes to lock */
18d10 0a 20 20 69 6e 74 20 73 65 74 4c 6f 63 6b 46 6c  .  int setLockFl
18d20 61 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ag              
18d30 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 73 65 74    /* True to set
18d40 20 6c 6f 63 6b 2e 20 20 46 61 6c 73 65 20 74 6f   lock.  False to
18d50 20 63 6c 65 61 72 20 6c 6f 63 6b 20 2a 2f 0a 29   clear lock */.)
18d60 7b 0a 20 20 73 74 72 75 63 74 20 42 79 74 65 52  {.  struct ByteR
18d70 61 6e 67 65 4c 6f 63 6b 50 42 32 20 70 62 3b 0a  angeLockPB2 pb;.
18d80 20 20 69 6e 74 20 65 72 72 3b 0a 20 20 0a 20 20    int err;.  .  
18d90 70 62 2e 75 6e 4c 6f 63 6b 46 6c 61 67 20 3d 20  pb.unLockFlag = 
18da0 73 65 74 4c 6f 63 6b 46 6c 61 67 20 3f 20 30 20  setLockFlag ? 0 
18db0 3a 20 31 3b 0a 20 20 70 62 2e 73 74 61 72 74 45  : 1;.  pb.startE
18dc0 6e 64 46 6c 61 67 20 3d 20 30 3b 0a 20 20 70 62  ndFlag = 0;.  pb
18dd0 2e 6f 66 66 73 65 74 20 3d 20 6f 66 66 73 65 74  .offset = offset
18de0 3b 0a 20 20 70 62 2e 6c 65 6e 67 74 68 20 3d 20  ;.  pb.length = 
18df0 6c 65 6e 67 74 68 3b 20 0a 20 20 70 62 2e 66 64  length; .  pb.fd
18e00 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 20 20 0a   = pFile->h;.  .
18e10 20 20 4f 53 54 52 41 43 45 28 28 22 41 46 50 53    OSTRACE(("AFPS
18e20 45 54 4c 4f 43 4b 20 5b 25 73 5d 20 66 6f 72 20  ETLOCK [%s] for 
18e30 25 64 25 73 20 69 6e 20 72 61 6e 67 65 20 25 6c  %d%s in range %l
18e40 6c 78 3a 25 6c 6c 78 5c 6e 22 2c 20 0a 20 20 20  lx:%llx\n", .   
18e50 20 28 73 65 74 4c 6f 63 6b 46 6c 61 67 3f 22 4f   (setLockFlag?"O
18e60 4e 22 3a 22 4f 46 46 22 29 2c 20 70 46 69 6c 65  N":"OFF"), pFile
18e70 2d 3e 68 2c 20 28 70 62 2e 66 64 3d 3d 2d 31 3f  ->h, (pb.fd==-1?
18e80 22 5b 74 65 73 74 76 61 6c 2d 31 5d 22 3a 22 22  "[testval-1]":""
18e90 29 2c 0a 20 20 20 20 6f 66 66 73 65 74 2c 20 6c  ),.    offset, l
18ea0 65 6e 67 74 68 29 29 3b 0a 20 20 65 72 72 20 3d  ength));.  err =
18eb0 20 66 73 63 74 6c 28 70 61 74 68 2c 20 61 66 70   fsctl(path, afp
18ec0 66 73 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 32  fsByteRangeLock2
18ed0 46 53 43 54 4c 2c 20 26 70 62 2c 20 30 29 3b 0a  FSCTL, &pb, 0);.
18ee0 20 20 69 66 20 28 20 65 72 72 3d 3d 2d 31 20 29    if ( err==-1 )
18ef0 20 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20   {.    int rc;. 
18f00 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20     int tErrno = 
18f10 65 72 72 6e 6f 3b 0a 20 20 20 20 4f 53 54 52 41  errno;.    OSTRA
18f20 43 45 28 28 22 41 46 50 53 45 54 4c 4f 43 4b 20  CE(("AFPSETLOCK 
18f30 66 61 69 6c 65 64 20 74 6f 20 66 73 63 74 6c 28  failed to fsctl(
18f40 29 20 27 25 73 27 20 25 64 20 25 73 5c 6e 22 2c  ) '%s' %d %s\n",
18f50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61  .             pa
18f60 74 68 2c 20 74 45 72 72 6e 6f 2c 20 73 74 72 65  th, tErrno, stre
18f70 72 72 6f 72 28 74 45 72 72 6e 6f 29 29 29 3b 0a  rror(tErrno)));.
18f80 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 49 47  #ifdef SQLITE_IG
18f90 4e 4f 52 45 5f 41 46 50 5f 4c 4f 43 4b 5f 45 52  NORE_AFP_LOCK_ER
18fa0 52 4f 52 53 0a 20 20 20 20 72 63 20 3d 20 53 51  RORS.    rc = SQ
18fb0 4c 49 54 45 5f 42 55 53 59 3b 0a 23 65 6c 73 65  LITE_BUSY;.#else
18fc0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
18fd0 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
18fe0 72 6f 72 28 74 45 72 72 6e 6f 2c 0a 20 20 20 20  ror(tErrno,.    
18ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19000 73 65 74 4c 6f 63 6b 46 6c 61 67 20 3f 20 53 51  setLockFlag ? SQ
19010 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 20  LITE_IOERR_LOCK 
19020 3a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  : SQLITE_IOERR_U
19030 4e 4c 4f 43 4b 29 3b 0a 23 65 6e 64 69 66 20 2f  NLOCK);.#endif /
19040 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f  * SQLITE_IGNORE_
19050 41 46 50 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 20  AFP_LOCK_ERRORS 
19060 2a 2f 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f  */.    if( IS_LO
19070 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a  CK_ERROR(rc) ){.
19080 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45        storeLastE
19090 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72 72  rrno(pFile, tErr
190a0 6e 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  no);.    }.    r
190b0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 20 65 6c  eturn rc;.  } el
190c0 73 65 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  se {.    return 
190d0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d  SQLITE_OK;.  }.}
190e0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
190f0 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74  tine checks if t
19100 68 65 72 65 20 69 73 20 61 20 52 45 53 45 52 56  here is a RESERV
19110 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20  ED lock held on 
19120 74 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a  the specified.**
19130 20 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72   file by this or
19140 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65   any other proce
19150 73 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f  ss. If such a lo
19160 63 6b 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20  ck is held, set 
19170 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61  *pResOut.** to a
19180 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20   non-zero value 
19190 6f 74 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f  otherwise *pResO
191a0 75 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72  ut is set to zer
191b0 6f 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 76  o.  The return v
191c0 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74  alue.** is set t
191d0 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65  o SQLITE_OK unle
191e0 73 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20  ss an I/O error 
191f0 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f  occurs during lo
19200 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a  ck checking..*/.
19210 73 74 61 74 69 63 20 69 6e 74 20 61 66 70 43 68  static int afpCh
19220 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28  eckReservedLock(
19230 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
19240 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b  , int *pResOut){
19250 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
19260 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73  TE_OK;.  int res
19270 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69  erved = 0;.  uni
19280 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
19290 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
192a0 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  afpLockingContex
192b0 74 20 2a 63 6f 6e 74 65 78 74 3b 0a 20 20 0a 20  t *context;.  . 
192c0 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
192d0 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ( return SQLITE_
192e0 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52  IOERR_CHECKRESER
192f0 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20  VEDLOCK; );.  . 
19300 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
19310 3b 0a 20 20 63 6f 6e 74 65 78 74 20 3d 20 28 61  ;.  context = (a
19320 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
19330 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69   *) pFile->locki
19340 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 69 66 28  ngContext;.  if(
19350 20 63 6f 6e 74 65 78 74 2d 3e 72 65 73 65 72 76   context->reserv
19360 65 64 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 4f  ed ){.    *pResO
19370 75 74 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75  ut = 1;.    retu
19380 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
19390 7d 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74  }.  unixEnterMut
193a0 65 78 28 29 3b 20 2f 2a 20 42 65 63 61 75 73 65  ex(); /* Because
193b0 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 69   pFile->pInode i
193c0 73 20 73 68 61 72 65 64 20 61 63 72 6f 73 73 20  s shared across 
193d0 74 68 72 65 61 64 73 20 2a 2f 0a 20 20 0a 20 20  threads */.  .  
193e0 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 20 74 68  /* Check if a th
193f0 72 65 61 64 20 69 6e 20 74 68 69 73 20 70 72 6f  read in this pro
19400 63 65 73 73 20 68 6f 6c 64 73 20 73 75 63 68 20  cess holds such 
19410 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20  a lock */.  if( 
19420 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65  pFile->pInode->e
19430 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f  FileLock>SHARED_
19440 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 73 65  LOCK ){.    rese
19450 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  rved = 1;.  }.  
19460 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 20  .  /* Otherwise 
19470 73 65 65 20 69 66 20 73 6f 6d 65 20 6f 74 68 65  see if some othe
19480 72 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20  r process holds 
19490 69 74 2e 0a 20 20 20 2a 2f 0a 20 20 69 66 28 20  it..   */.  if( 
194a0 21 72 65 73 65 72 76 65 64 20 29 7b 0a 20 20 20  !reserved ){.   
194b0 20 2f 2a 20 6c 6f 63 6b 20 74 68 65 20 52 45 53   /* lock the RES
194c0 45 52 56 45 44 20 62 79 74 65 20 2a 2f 0a 20 20  ERVED byte */.  
194d0 20 20 69 6e 74 20 6c 72 63 20 3d 20 61 66 70 53    int lrc = afpS
194e0 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
194f0 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 52  dbPath, pFile, R
19500 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 31 2c  ESERVED_BYTE, 1,
19510 31 29 3b 20 20 0a 20 20 20 20 69 66 28 20 53 51  1);  .    if( SQ
19520 4c 49 54 45 5f 4f 4b 3d 3d 6c 72 63 20 29 7b 0a  LITE_OK==lrc ){.
19530 20 20 20 20 20 20 2f 2a 20 69 66 20 77 65 20 73        /* if we s
19540 75 63 63 65 65 64 65 64 20 69 6e 20 74 61 6b 69  ucceeded in taki
19550 6e 67 20 74 68 65 20 72 65 73 65 72 76 65 64 20  ng the reserved 
19560 6c 6f 63 6b 2c 20 75 6e 6c 6f 63 6b 20 69 74 20  lock, unlock it 
19570 74 6f 20 72 65 73 74 6f 72 65 0a 20 20 20 20 20  to restore.     
19580 20 2a 2a 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   ** the original
19590 20 73 74 61 74 65 20 2a 2f 0a 20 20 20 20 20 20   state */.      
195a0 6c 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b  lrc = afpSetLock
195b0 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68  (context->dbPath
195c0 2c 20 70 46 69 6c 65 2c 20 52 45 53 45 52 56 45  , pFile, RESERVE
195d0 44 5f 42 59 54 45 2c 20 31 2c 20 30 29 3b 0a 20  D_BYTE, 1, 0);. 
195e0 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
195f0 20 20 2f 2a 20 69 66 20 77 65 20 66 61 69 6c 65    /* if we faile
19600 64 20 74 6f 20 67 65 74 20 74 68 65 20 6c 6f 63  d to get the loc
19610 6b 20 74 68 65 6e 20 73 6f 6d 65 6f 6e 65 20 65  k then someone e
19620 6c 73 65 20 6d 75 73 74 20 68 61 76 65 20 69 74  lse must have it
19630 20 2a 2f 0a 20 20 20 20 20 20 72 65 73 65 72 76   */.      reserv
19640 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ed = 1;.    }.  
19650 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52    if( IS_LOCK_ER
19660 52 4f 52 28 6c 72 63 29 20 29 7b 0a 20 20 20 20  ROR(lrc) ){.    
19670 20 20 72 63 3d 6c 72 63 3b 0a 20 20 20 20 7d 0a    rc=lrc;.    }.
19680 20 20 7d 0a 20 20 0a 20 20 75 6e 69 78 4c 65 61    }.  .  unixLea
19690 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53 54  veMutex();.  OST
196a0 52 41 43 45 28 28 22 54 45 53 54 20 57 52 2d 4c  RACE(("TEST WR-L
196b0 4f 43 4b 20 25 64 20 25 64 20 25 64 20 28 61 66  OCK %d %d %d (af
196c0 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  p)\n", pFile->h,
196d0 20 72 63 2c 20 72 65 73 65 72 76 65 64 29 29 3b   rc, reserved));
196e0 0a 20 20 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d  .  .  *pResOut =
196f0 20 72 65 73 65 72 76 65 64 3b 0a 20 20 72 65 74   reserved;.  ret
19700 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
19710 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77   Lock the file w
19720 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65  ith the lock spe
19730 63 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65  cified by parame
19740 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20  ter eFileLock - 
19750 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f  one.** of the fo
19760 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
19770 20 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f     (1) SHARED_LO
19780 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45  CK.**     (2) RE
19790 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20  SERVED_LOCK.**  
197a0 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c     (3) PENDING_L
197b0 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45  OCK.**     (4) E
197c0 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a  XCLUSIVE_LOCK.**
197d0 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68  .** Sometimes wh
197e0 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e  en requesting on
197f0 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64  e lock state, ad
19800 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74  ditional lock st
19810 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65  ates.** are inse
19820 72 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e  rted in between.
19830 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69    The locking mi
19840 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20  ght fail on one 
19850 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20  of the later.** 
19860 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76  transitions leav
19870 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61  ing the lock sta
19880 74 65 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f  te different fro
19890 6d 20 77 68 61 74 20 69 74 20 73 74 61 72 74 65  m what it starte
198a0 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73  d but.** still s
198b0 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c  hort of its goal
198c0 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .  The following
198d0 20 63 68 61 72 74 20 73 68 6f 77 73 20 74 68 65   chart shows the
198e0 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e   allowed.** tran
198f0 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20  sitions and the 
19900 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65  inserted interme
19910 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a  diate states:.**
19920 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20  .**    UNLOCKED 
19930 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20  -> SHARED.**    
19940 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56  SHARED -> RESERV
19950 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20  ED.**    SHARED 
19960 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20  -> (PENDING) -> 
19970 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20  EXCLUSIVE.**    
19980 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e  RESERVED -> (PEN
19990 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49  DING) -> EXCLUSI
199a0 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47  VE.**    PENDING
199b0 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
199c0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
199d0 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65   will only incre
199e0 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65  ase a lock.  Use
199f0 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e   the sqlite3OsUn
19a00 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e  lock().** routin
19a10 65 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63  e to lower a loc
19a20 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73  king level..*/.s
19a30 74 61 74 69 63 20 69 6e 74 20 61 66 70 4c 6f 63  tatic int afpLoc
19a40 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
19a50 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63  id, int eFileLoc
19a60 6b 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  k){.  int rc = S
19a70 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78  QLITE_OK;.  unix
19a80 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
19a90 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 75  nixFile*)id;.  u
19aa0 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49  nixInodeInfo *pI
19ab0 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49  node = pFile->pI
19ac0 6e 6f 64 65 3b 0a 20 20 61 66 70 4c 6f 63 6b 69  node;.  afpLocki
19ad0 6e 67 43 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  ngContext *conte
19ae0 78 74 20 3d 20 28 61 66 70 4c 6f 63 6b 69 6e 67  xt = (afpLocking
19af0 43 6f 6e 74 65 78 74 20 2a 29 20 70 46 69 6c 65  Context *) pFile
19b00 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
19b10 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 70  ;.  .  assert( p
19b20 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43  File );.  OSTRAC
19b30 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25  E(("LOCK    %d %
19b40 73 20 77 61 73 20 25 73 28 25 73 2c 25 64 29 20  s was %s(%s,%d) 
19b50 70 69 64 3d 25 64 20 28 61 66 70 29 5c 6e 22 2c  pid=%d (afp)\n",
19b60 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20   pFile->h,.     
19b70 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b        azFileLock
19b80 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 61 7a 46  (eFileLock), azF
19b90 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2d 3e 65  ileLock(pFile->e
19ba0 46 69 6c 65 4c 6f 63 6b 29 2c 0a 20 20 20 20 20  FileLock),.     
19bb0 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b        azFileLock
19bc0 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f  (pInode->eFileLo
19bd0 63 6b 29 2c 20 70 49 6e 6f 64 65 2d 3e 6e 53 68  ck), pInode->nSh
19be0 61 72 65 64 20 2c 20 67 65 74 70 69 64 28 29 29  ared , getpid())
19bf0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72  );..  /* If ther
19c00 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 6c  e is already a l
19c10 6f 63 6b 20 6f 66 20 74 68 69 73 20 74 79 70 65  ock of this type
19c20 20 6f 72 20 6d 6f 72 65 20 72 65 73 74 72 69 63   or more restric
19c30 74 69 76 65 20 6f 6e 20 74 68 65 0a 20 20 2a 2a  tive on the.  **
19c40 20 75 6e 69 78 46 69 6c 65 2c 20 64 6f 20 6e 6f   unixFile, do no
19c50 74 68 69 6e 67 2e 20 44 6f 6e 27 74 20 75 73 65  thing. Don't use
19c60 20 74 68 65 20 61 66 70 5f 65 6e 64 5f 6c 6f 63   the afp_end_loc
19c70 6b 3a 20 65 78 69 74 20 70 61 74 68 2c 20 61 73  k: exit path, as
19c80 0a 20 20 2a 2a 20 75 6e 69 78 45 6e 74 65 72 4d  .  ** unixEnterM
19c90 75 74 65 78 28 29 20 68 61 73 6e 27 74 20 62 65  utex() hasn't be
19ca0 65 6e 20 63 61 6c 6c 65 64 20 79 65 74 2e 0a 20  en called yet.. 
19cb0 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   */.  if( pFile-
19cc0 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 65 46 69 6c  >eFileLock>=eFil
19cd0 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 4f 53 54  eLock ){.    OST
19ce0 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25  RACE(("LOCK    %
19cf0 64 20 25 73 20 6f 6b 20 28 61 6c 72 65 61 64 79  d %s ok (already
19d00 20 68 65 6c 64 29 20 28 61 66 70 29 5c 6e 22 2c   held) (afp)\n",
19d10 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20   pFile->h,.     
19d20 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b        azFileLock
19d30 28 65 46 69 6c 65 4c 6f 63 6b 29 29 29 3b 0a 20  (eFileLock)));. 
19d40 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
19d50 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d  _OK;.  }..  /* M
19d60 61 6b 65 20 73 75 72 65 20 74 68 65 20 6c 6f 63  ake sure the loc
19d70 6b 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73  king sequence is
19d80 20 63 6f 72 72 65 63 74 0a 20 20 2a 2a 20 20 28   correct.  **  (
19d90 31 29 20 57 65 20 6e 65 76 65 72 20 6d 6f 76 65  1) We never move
19da0 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64 20 74   from unlocked t
19db0 6f 20 61 6e 79 74 68 69 6e 67 20 68 69 67 68 65  o anything highe
19dc0 72 20 74 68 61 6e 20 73 68 61 72 65 64 20 6c 6f  r than shared lo
19dd0 63 6b 2e 0a 20 20 2a 2a 20 20 28 32 29 20 53 51  ck..  **  (2) SQ
19de0 4c 69 74 65 20 6e 65 76 65 72 20 65 78 70 6c 69  Lite never expli
19df0 63 69 74 6c 79 20 72 65 71 75 65 73 74 73 20 61  citly requests a
19e00 20 70 65 6e 64 69 67 20 6c 6f 63 6b 2e 0a 20 20   pendig lock..  
19e10 2a 2a 20 20 28 33 29 20 41 20 73 68 61 72 65 64  **  (3) A shared
19e20 20 6c 6f 63 6b 20 69 73 20 61 6c 77 61 79 73 20   lock is always 
19e30 68 65 6c 64 20 77 68 65 6e 20 61 20 72 65 73 65  held when a rese
19e40 72 76 65 20 6c 6f 63 6b 20 69 73 20 72 65 71 75  rve lock is requ
19e50 65 73 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73  ested..  */.  as
19e60 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 65 46 69  sert( pFile->eFi
19e70 6c 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20  leLock!=NO_LOCK 
19e80 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  || eFileLock==SH
19e90 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61  ARED_LOCK );.  a
19ea0 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b  ssert( eFileLock
19eb0 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29  !=PENDING_LOCK )
19ec0 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c  ;.  assert( eFil
19ed0 65 4c 6f 63 6b 21 3d 52 45 53 45 52 56 45 44 5f  eLock!=RESERVED_
19ee0 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 65  LOCK || pFile->e
19ef0 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
19f00 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a  _LOCK );.  .  /*
19f10 20 54 68 69 73 20 6d 75 74 65 78 20 69 73 20 6e   This mutex is n
19f20 65 65 64 65 64 20 62 65 63 61 75 73 65 20 70 46  eeded because pF
19f30 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 69 73 20 73  ile->pInode is s
19f40 68 61 72 65 64 20 61 63 72 6f 73 73 20 74 68 72  hared across thr
19f50 65 61 64 73 0a 20 20 2a 2f 0a 20 20 75 6e 69 78  eads.  */.  unix
19f60 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
19f70 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e  pInode = pFile->
19f80 70 49 6e 6f 64 65 3b 0a 0a 20 20 2f 2a 20 49 66  pInode;..  /* If
19f90 20 73 6f 6d 65 20 74 68 72 65 61 64 20 75 73 69   some thread usi
19fa0 6e 67 20 74 68 69 73 20 50 49 44 20 68 61 73 20  ng this PID has 
19fb0 61 20 6c 6f 63 6b 20 76 69 61 20 61 20 64 69 66  a lock via a dif
19fc0 66 65 72 65 6e 74 20 75 6e 69 78 46 69 6c 65 2a  ferent unixFile*
19fd0 0a 20 20 2a 2a 20 68 61 6e 64 6c 65 20 74 68 61  .  ** handle tha
19fe0 74 20 70 72 65 63 6c 75 64 65 73 20 74 68 65 20  t precludes the 
19ff0 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 2c 20  requested lock, 
1a000 72 65 74 75 72 6e 20 42 55 53 59 2e 0a 20 20 2a  return BUSY..  *
1a010 2f 0a 20 20 69 66 28 20 28 70 46 69 6c 65 2d 3e  /.  if( (pFile->
1a020 65 46 69 6c 65 4c 6f 63 6b 21 3d 70 49 6e 6f 64  eFileLock!=pInod
1a030 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 26 26 20  e->eFileLock && 
1a040 0a 20 20 20 20 20 20 20 28 70 49 6e 6f 64 65 2d  .       (pInode-
1a050 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 50 45 4e 44  >eFileLock>=PEND
1a060 49 4e 47 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c  ING_LOCK || eFil
1a070 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43  eLock>SHARED_LOC
1a080 4b 29 29 0a 20 20 20 20 20 29 7b 0a 20 20 20 20  K)).     ){.    
1a090 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
1a0a0 3b 0a 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65  ;.    goto afp_e
1a0b0 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 0a  nd_lock;.  }.  .
1a0c0 20 20 2f 2a 20 49 66 20 61 20 53 48 41 52 45 44    /* If a SHARED
1a0d0 20 6c 6f 63 6b 20 69 73 20 72 65 71 75 65 73 74   lock is request
1a0e0 65 64 2c 20 61 6e 64 20 73 6f 6d 65 20 74 68 72  ed, and some thr
1a0f0 65 61 64 20 75 73 69 6e 67 20 74 68 69 73 20 50  ead using this P
1a100 49 44 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20  ID already.  ** 
1a110 68 61 73 20 61 20 53 48 41 52 45 44 20 6f 72 20  has a SHARED or 
1a120 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 74  RESERVED lock, t
1a130 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 72 65  hen increment re
1a140 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 73 20 61  ference counts a
1a150 6e 64 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 53  nd.  ** return S
1a160 51 4c 49 54 45 5f 4f 4b 2e 0a 20 20 2a 2f 0a 20  QLITE_OK..  */. 
1a170 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d   if( eFileLock==
1a180 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20 0a  SHARED_LOCK && .
1a190 20 20 20 20 20 28 70 49 6e 6f 64 65 2d 3e 65 46       (pInode->eF
1a1a0 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
1a1b0 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e  LOCK || pInode->
1a1c0 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52  eFileLock==RESER
1a1d0 56 45 44 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20  VED_LOCK) ){.   
1a1e0 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f   assert( eFileLo
1a1f0 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
1a200 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
1a210 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  File->eFileLock=
1a220 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
1a230 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  ( pInode->nShare
1a240 64 3e 30 20 29 3b 0a 20 20 20 20 70 46 69 6c 65  d>0 );.    pFile
1a250 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48  ->eFileLock = SH
1a260 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70  ARED_LOCK;.    p
1a270 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2b 2b  Inode->nShared++
1a280 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c  ;.    pInode->nL
1a290 6f 63 6b 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20  ock++;.    goto 
1a2a0 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20  afp_end_lock;.  
1a2b0 7d 0a 20 20 20 20 0a 20 20 2f 2a 20 41 20 50 45  }.    .  /* A PE
1a2c0 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 6e 65  NDING lock is ne
1a2d0 65 64 65 64 20 62 65 66 6f 72 65 20 61 63 71 75  eded before acqu
1a2e0 69 72 69 6e 67 20 61 20 53 48 41 52 45 44 20 6c  iring a SHARED l
1a2f0 6f 63 6b 20 61 6e 64 20 62 65 66 6f 72 65 0a 20  ock and before. 
1a300 20 2a 2a 20 61 63 71 75 69 72 69 6e 67 20 61 6e   ** acquiring an
1a310 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
1a320 20 20 46 6f 72 20 74 68 65 20 53 48 41 52 45 44    For the SHARED
1a330 20 6c 6f 63 6b 2c 20 74 68 65 20 50 45 4e 44 49   lock, the PENDI
1a340 4e 47 20 77 69 6c 6c 0a 20 20 2a 2a 20 62 65 20  NG will.  ** be 
1a350 72 65 6c 65 61 73 65 64 2e 0a 20 20 2a 2f 0a 20  released..  */. 
1a360 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d   if( eFileLock==
1a370 53 48 41 52 45 44 5f 4c 4f 43 4b 20 0a 20 20 20  SHARED_LOCK .   
1a380 20 20 20 7c 7c 20 28 65 46 69 6c 65 4c 6f 63 6b     || (eFileLock
1a390 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
1a3a0 20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65   && pFile->eFile
1a3b0 4c 6f 63 6b 3c 50 45 4e 44 49 4e 47 5f 4c 4f 43  Lock<PENDING_LOC
1a3c0 4b 29 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74 20  K).  ){.    int 
1a3d0 66 61 69 6c 65 64 3b 0a 20 20 20 20 66 61 69 6c  failed;.    fail
1a3e0 65 64 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28  ed = afpSetLock(
1a3f0 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c  context->dbPath,
1a400 20 70 46 69 6c 65 2c 20 50 45 4e 44 49 4e 47 5f   pFile, PENDING_
1a410 42 59 54 45 2c 20 31 2c 20 31 29 3b 0a 20 20 20  BYTE, 1, 1);.   
1a420 20 69 66 20 28 66 61 69 6c 65 64 29 20 7b 0a 20   if (failed) {. 
1a430 20 20 20 20 20 72 63 20 3d 20 66 61 69 6c 65 64       rc = failed
1a440 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 66 70  ;.      goto afp
1a450 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d  _end_lock;.    }
1a460 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 49 66 20  .  }.  .  /* If 
1a470 63 6f 6e 74 72 6f 6c 20 67 65 74 73 20 74 6f 20  control gets to 
1a480 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e  this point, then
1a490 20 61 63 74 75 61 6c 6c 79 20 67 6f 20 61 68 65   actually go ahe
1a4a0 61 64 20 61 6e 64 20 6d 61 6b 65 0a 20 20 2a 2a  ad and make.  **
1a4b0 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
1a4c0 6d 20 63 61 6c 6c 73 20 66 6f 72 20 74 68 65 20  m calls for the 
1a4d0 73 70 65 63 69 66 69 65 64 20 6c 6f 63 6b 2e 0a  specified lock..
1a4e0 20 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65    */.  if( eFile
1a4f0 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
1a500 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 6c 72 63  K ){.    int lrc
1a510 31 2c 20 6c 72 63 32 2c 20 6c 72 63 31 45 72 72  1, lrc2, lrc1Err
1a520 6e 6f 20 3d 20 30 3b 0a 20 20 20 20 6c 6f 6e 67  no = 0;.    long
1a530 20 6c 6b 2c 20 6d 61 73 6b 3b 0a 20 20 20 20 0a   lk, mask;.    .
1a540 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f      assert( pIno
1a550 64 65 2d 3e 6e 53 68 61 72 65 64 3d 3d 30 20 29  de->nShared==0 )
1a560 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  ;.    assert( pI
1a570 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  node->eFileLock=
1a580 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 0a 20  =0 );.        . 
1a590 20 20 20 6d 61 73 6b 20 3d 20 28 73 69 7a 65 6f     mask = (sizeo
1a5a0 66 28 6c 6f 6e 67 29 3d 3d 38 29 20 3f 20 4c 41  f(long)==8) ? LA
1a5b0 52 47 45 53 54 5f 49 4e 54 36 34 20 3a 20 30 78  RGEST_INT64 : 0x
1a5c0 37 66 66 66 66 66 66 66 3b 0a 20 20 20 20 2f 2a  7fffffff;.    /*
1a5d0 20 4e 6f 77 20 67 65 74 20 74 68 65 20 72 65 61   Now get the rea
1a5e0 64 2d 6c 6f 63 6b 20 53 48 41 52 45 44 5f 4c 4f  d-lock SHARED_LO
1a5f0 43 4b 20 2a 2f 0a 20 20 20 20 2f 2a 20 6e 6f 74  CK */.    /* not
1a600 65 20 74 68 61 74 20 74 68 65 20 71 75 61 6c 69  e that the quali
1a610 74 79 20 6f 66 20 74 68 65 20 72 61 6e 64 6f 6d  ty of the random
1a620 6e 65 73 73 20 64 6f 65 73 6e 27 74 20 6d 61 74  ness doesn't mat
1a630 74 65 72 20 74 68 61 74 20 6d 75 63 68 20 2a 2f  ter that much */
1a640 0a 20 20 20 20 6c 6b 20 3d 20 72 61 6e 64 6f 6d  .    lk = random
1a650 28 29 3b 20 0a 20 20 20 20 70 49 6e 6f 64 65 2d  (); .    pInode-
1a660 3e 73 68 61 72 65 64 42 79 74 65 20 3d 20 28 6c  >sharedByte = (l
1a670 6b 20 26 20 6d 61 73 6b 29 25 28 53 48 41 52 45  k & mask)%(SHARE
1a680 44 5f 53 49 5a 45 20 2d 20 31 29 3b 0a 20 20 20  D_SIZE - 1);.   
1a690 20 6c 72 63 31 20 3d 20 61 66 70 53 65 74 4c 6f   lrc1 = afpSetLo
1a6a0 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61  ck(context->dbPa
1a6b0 74 68 2c 20 70 46 69 6c 65 2c 20 0a 20 20 20 20  th, pFile, .    
1a6c0 20 20 20 20 20 20 53 48 41 52 45 44 5f 46 49 52        SHARED_FIR
1a6d0 53 54 2b 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65  ST+pInode->share
1a6e0 64 42 79 74 65 2c 20 31 2c 20 31 29 3b 0a 20 20  dByte, 1, 1);.  
1a6f0 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52    if( IS_LOCK_ER
1a700 52 4f 52 28 6c 72 63 31 29 20 29 7b 0a 20 20 20  ROR(lrc1) ){.   
1a710 20 20 20 6c 72 63 31 45 72 72 6e 6f 20 3d 20 70     lrc1Errno = p
1a720 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b  File->lastErrno;
1a730 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 44 72  .    }.    /* Dr
1a740 6f 70 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  op the temporary
1a750 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 2a 2f   PENDING lock */
1a760 0a 20 20 20 20 6c 72 63 32 20 3d 20 61 66 70 53  .    lrc2 = afpS
1a770 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
1a780 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 50  dbPath, pFile, P
1a790 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 31 2c 20  ENDING_BYTE, 1, 
1a7a0 30 29 3b 0a 20 20 20 20 0a 20 20 20 20 69 66 28  0);.    .    if(
1a7b0 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c   IS_LOCK_ERROR(l
1a7c0 72 63 31 29 20 29 20 7b 0a 20 20 20 20 20 20 73  rc1) ) {.      s
1a7d0 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46  toreLastErrno(pF
1a7e0 69 6c 65 2c 20 6c 72 63 31 45 72 72 6e 6f 29 3b  ile, lrc1Errno);
1a7f0 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63 31  .      rc = lrc1
1a800 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 66 70  ;.      goto afp
1a810 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d  _end_lock;.    }
1a820 20 65 6c 73 65 20 69 66 28 20 49 53 5f 4c 4f 43   else if( IS_LOC
1a830 4b 5f 45 52 52 4f 52 28 6c 72 63 32 29 20 29 7b  K_ERROR(lrc2) ){
1a840 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63 32  .      rc = lrc2
1a850 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 66 70  ;.      goto afp
1a860 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d  _end_lock;.    }
1a870 20 65 6c 73 65 20 69 66 28 20 6c 72 63 31 20 21   else if( lrc1 !
1a880 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 29 20 7b 0a  = SQLITE_OK ) {.
1a890 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63 31 3b        rc = lrc1;
1a8a0 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  .    } else {.  
1a8b0 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
1a8c0 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f  Lock = SHARED_LO
1a8d0 43 4b 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65  CK;.      pInode
1a8e0 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 20  ->nLock++;.     
1a8f0 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
1a900 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65   = 1;.    }.  }e
1a910 6c 73 65 20 69 66 28 20 65 46 69 6c 65 4c 6f 63  lse if( eFileLoc
1a920 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
1a930 4b 20 26 26 20 70 49 6e 6f 64 65 2d 3e 6e 53 68  K && pInode->nSh
1a940 61 72 65 64 3e 31 20 29 7b 0a 20 20 20 20 2f 2a  ared>1 ){.    /*
1a950 20 57 65 20 61 72 65 20 74 72 79 69 6e 67 20 66   We are trying f
1a960 6f 72 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  or an exclusive 
1a970 6c 6f 63 6b 20 62 75 74 20 61 6e 6f 74 68 65 72  lock but another
1a980 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 0a   thread in this.
1a990 20 20 20 20 20 2a 2a 20 73 61 6d 65 20 70 72 6f       ** same pro
1a9a0 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20 68 6f  cess is still ho
1a9b0 6c 64 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c  lding a shared l
1a9c0 6f 63 6b 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d  ock. */.    rc =
1a9d0 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
1a9e0 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68  }else{.    /* Th
1a9f0 65 20 72 65 71 75 65 73 74 20 77 61 73 20 66 6f  e request was fo
1aa00 72 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20  r a RESERVED or 
1aa10 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20  EXCLUSIVE lock. 
1aa20 20 49 74 20 69 73 0a 20 20 20 20 2a 2a 20 61 73   It is.    ** as
1aa30 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 72 65  sumed that there
1aa40 20 69 73 20 61 20 53 48 41 52 45 44 20 6f 72 20   is a SHARED or 
1aa50 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20  greater lock on 
1aa60 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20  the file.    ** 
1aa70 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a  already..    */.
1aa80 20 20 20 20 69 6e 74 20 66 61 69 6c 65 64 20 3d      int failed =
1aa90 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   0;.    assert( 
1aaa0 30 21 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  0!=pFile->eFileL
1aab0 6f 63 6b 20 29 3b 0a 20 20 20 20 69 66 20 28 65  ock );.    if (e
1aac0 46 69 6c 65 4c 6f 63 6b 20 3e 3d 20 52 45 53 45  FileLock >= RESE
1aad0 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20 70 46 69  RVED_LOCK && pFi
1aae0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3c 20  le->eFileLock < 
1aaf0 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 20 7b  RESERVED_LOCK) {
1ab00 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 63 71 75  .        /* Acqu
1ab10 69 72 65 20 61 20 52 45 53 45 52 56 45 44 20 6c  ire a RESERVED l
1ab20 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 66  ock */.        f
1ab30 61 69 6c 65 64 20 3d 20 61 66 70 53 65 74 4c 6f  ailed = afpSetLo
1ab40 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61  ck(context->dbPa
1ab50 74 68 2c 20 70 46 69 6c 65 2c 20 52 45 53 45 52  th, pFile, RESER
1ab60 56 45 44 5f 42 59 54 45 2c 20 31 2c 31 29 3b 0a  VED_BYTE, 1,1);.
1ab70 20 20 20 20 20 20 69 66 28 20 21 66 61 69 6c 65        if( !faile
1ab80 64 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e  d ){.        con
1ab90 74 65 78 74 2d 3e 72 65 73 65 72 76 65 64 20 3d  text->reserved =
1aba0 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
1abb0 7d 0a 20 20 20 20 69 66 20 28 21 66 61 69 6c 65  }.    if (!faile
1abc0 64 20 26 26 20 65 46 69 6c 65 4c 6f 63 6b 20 3d  d && eFileLock =
1abd0 3d 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  = EXCLUSIVE_LOCK
1abe0 29 20 7b 0a 20 20 20 20 20 20 2f 2a 20 41 63 71  ) {.      /* Acq
1abf0 75 69 72 65 20 61 6e 20 45 58 43 4c 55 53 49 56  uire an EXCLUSIV
1ac00 45 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20  E lock */.      
1ac10 20 20 0a 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f    .      /* Remo
1ac20 76 65 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f  ve the shared lo
1ac30 63 6b 20 62 65 66 6f 72 65 20 74 72 79 69 6e 67  ck before trying
1ac40 20 74 68 65 20 72 61 6e 67 65 2e 20 20 77 65 27   the range.  we'
1ac50 6c 6c 20 6e 65 65 64 20 74 6f 20 0a 20 20 20 20  ll need to .    
1ac60 20 20 2a 2a 20 72 65 65 73 74 61 62 6c 69 73 68    ** reestablish
1ac70 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b   the shared lock
1ac80 20 69 66 20 77 65 20 63 61 6e 27 74 20 67 65 74   if we can't get
1ac90 20 74 68 65 20 20 61 66 70 55 6e 6c 6f 63 6b 0a   the  afpUnlock.
1aca0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
1acb0 66 28 20 21 28 66 61 69 6c 65 64 20 3d 20 61 66  f( !(failed = af
1acc0 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  pSetLock(context
1acd0 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c  ->dbPath, pFile,
1ace0 20 53 48 41 52 45 44 5f 46 49 52 53 54 20 2b 0a   SHARED_FIRST +.
1acf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ad00 20 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d           pInode-
1ad10 3e 73 68 61 72 65 64 42 79 74 65 2c 20 31 2c 20  >sharedByte, 1, 
1ad20 30 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  0)) ){.        i
1ad30 6e 74 20 66 61 69 6c 65 64 32 20 3d 20 53 51 4c  nt failed2 = SQL
1ad40 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
1ad50 2f 2a 20 6e 6f 77 20 61 74 74 65 6d 6d 70 74 20  /* now attemmpt 
1ad60 74 6f 20 67 65 74 20 74 68 65 20 65 78 63 6c 75  to get the exclu
1ad70 73 69 76 65 20 6c 6f 63 6b 20 72 61 6e 67 65 20  sive lock range 
1ad80 2a 2f 0a 20 20 20 20 20 20 20 20 66 61 69 6c 65  */.        faile
1ad90 64 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63  d = afpSetLock(c
1ada0 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20  ontext->dbPath, 
1adb0 70 46 69 6c 65 2c 20 53 48 41 52 45 44 5f 46 49  pFile, SHARED_FI
1adc0 52 53 54 2c 20 0a 20 20 20 20 20 20 20 20 20 20  RST, .          
1add0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ade0 20 20 20 20 20 53 48 41 52 45 44 5f 53 49 5a 45       SHARED_SIZE
1adf0 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 1);.        if
1ae00 28 20 66 61 69 6c 65 64 20 26 26 20 28 66 61 69  ( failed && (fai
1ae10 6c 65 64 32 20 3d 20 61 66 70 53 65 74 4c 6f 63  led2 = afpSetLoc
1ae20 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74  k(context->dbPat
1ae30 68 2c 20 70 46 69 6c 65 2c 20 0a 20 20 20 20 20  h, pFile, .     
1ae40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ae50 20 20 53 48 41 52 45 44 5f 46 49 52 53 54 20 2b    SHARED_FIRST +
1ae60 20 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42   pInode->sharedB
1ae70 79 74 65 2c 20 31 2c 20 31 29 29 20 29 7b 0a 20  yte, 1, 1)) ){. 
1ae80 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61 6e 27           /* Can'
1ae90 74 20 72 65 65 73 74 61 62 6c 69 73 68 20 74 68  t reestablish th
1aea0 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20 20  e shared lock.  
1aeb0 53 71 6c 69 74 65 20 63 61 6e 27 74 20 64 65 61  Sqlite can't dea
1aec0 6c 2c 20 74 68 69 73 20 69 73 0a 20 20 20 20 20  l, this is.     
1aed0 20 20 20 20 20 2a 2a 20 61 20 63 72 69 74 69 63       ** a critic
1aee0 61 6c 20 49 2f 4f 20 65 72 72 6f 72 0a 20 20 20  al I/O error.   
1aef0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
1af00 20 20 20 20 72 63 20 3d 20 28 28 66 61 69 6c 65      rc = ((faile
1af10 64 20 26 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  d & SQLITE_IOERR
1af20 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  ) == SQLITE_IOER
1af30 52 29 20 3f 20 66 61 69 6c 65 64 32 20 3a 20 0a  R) ? failed2 : .
1af40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
1af50 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b  QLITE_IOERR_LOCK
1af60 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
1af70 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20   afp_end_lock;. 
1af80 20 20 20 20 20 20 20 7d 20 0a 20 20 20 20 20 20         } .      
1af90 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
1afa0 63 20 3d 20 66 61 69 6c 65 64 3b 20 0a 20 20 20  c = failed; .   
1afb0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
1afc0 66 28 20 66 61 69 6c 65 64 20 29 7b 0a 20 20 20  f( failed ){.   
1afd0 20 20 20 72 63 20 3d 20 66 61 69 6c 65 64 3b 0a     rc = failed;.
1afe0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 69      }.  }.  .  i
1aff0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1b000 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65   ){.    pFile->e
1b010 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65  FileLock = eFile
1b020 4c 6f 63 6b 3b 0a 20 20 20 20 70 49 6e 6f 64 65  Lock;.    pInode
1b030 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46  ->eFileLock = eF
1b040 69 6c 65 4c 6f 63 6b 3b 0a 20 20 7d 65 6c 73 65  ileLock;.  }else
1b050 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d   if( eFileLock==
1b060 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
1b070 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69  {.    pFile->eFi
1b080 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e 44 49 4e 47  leLock = PENDING
1b090 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 49 6e 6f 64  _LOCK;.    pInod
1b0a0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 50  e->eFileLock = P
1b0b0 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 7d  ENDING_LOCK;.  }
1b0c0 0a 20 20 0a 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b  .  .afp_end_lock
1b0d0 3a 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74  :.  unixLeaveMut
1b0e0 65 78 28 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  ex();.  OSTRACE(
1b0f0 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20  ("LOCK    %d %s 
1b100 25 73 20 28 61 66 70 29 5c 6e 22 2c 20 70 46 69  %s (afp)\n", pFi
1b110 6c 65 2d 3e 68 2c 20 61 7a 46 69 6c 65 4c 6f 63  le->h, azFileLoc
1b120 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 0a 20  k(eFileLock), . 
1b130 20 20 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49          rc==SQLI
1b140 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22  TE_OK ? "ok" : "
1b150 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 72 65 74  failed"));.  ret
1b160 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1b170 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69   Lower the locki
1b180 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65  ng level on file
1b190 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c   descriptor pFil
1b1a0 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20  e to eFileLock. 
1b1b0 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75   eFileLock.** mu
1b1c0 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f  st be either NO_
1b1d0 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c  LOCK or SHARED_L
1b1e0 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  OCK..**.** If th
1b1f0 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
1b200 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  of the file desc
1b210 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64  riptor is alread
1b220 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a  y at or below.**
1b230 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
1b240 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68  ocking level, th
1b250 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
1b260 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
1b270 20 69 6e 74 20 61 66 70 55 6e 6c 6f 63 6b 28 73   int afpUnlock(s
1b280 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
1b290 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20   int eFileLock) 
1b2a0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
1b2b0 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69  ITE_OK;.  unixFi
1b2c0 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
1b2d0 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69  xFile*)id;.  uni
1b2e0 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f  xInodeInfo *pIno
1b2f0 64 65 3b 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67  de;.  afpLocking
1b300 43 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  Context *context
1b310 20 3d 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f   = (afpLockingCo
1b320 6e 74 65 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e  ntext *) pFile->
1b330 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  lockingContext;.
1b340 20 20 69 6e 74 20 73 6b 69 70 53 68 61 72 65 64    int skipShared
1b350 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c   = 0;.#ifdef SQL
1b360 49 54 45 5f 54 45 53 54 0a 20 20 69 6e 74 20 68  ITE_TEST.  int h
1b370 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 23 65 6e   = pFile->h;.#en
1b380 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70  dif..  assert( p
1b390 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43  File );.  OSTRAC
1b3a0 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25  E(("UNLOCK  %d %
1b3b0 64 20 77 61 73 20 25 64 28 25 64 2c 25 64 29 20  d was %d(%d,%d) 
1b3c0 70 69 64 3d 25 64 20 28 61 66 70 29 5c 6e 22 2c  pid=%d (afp)\n",
1b3d0 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65   pFile->h, eFile
1b3e0 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20 20 20  Lock,.          
1b3f0 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
1b400 6b 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  k, pFile->pInode
1b410 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 70 46 69  ->eFileLock, pFi
1b420 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 53 68 61  le->pInode->nSha
1b430 72 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20  red,.           
1b440 67 65 74 70 69 64 28 29 29 29 3b 0a 0a 20 20 61  getpid()));..  a
1b450 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b  ssert( eFileLock
1b460 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  <=SHARED_LOCK );
1b470 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46  .  if( pFile->eF
1b480 69 6c 65 4c 6f 63 6b 3c 3d 65 46 69 6c 65 4c 6f  ileLock<=eFileLo
1b490 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ck ){.    return
1b4a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
1b4b0 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
1b4c0 28 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70  ();.  pInode = p
1b4d0 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20  File->pInode;.  
1b4e0 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e  assert( pInode->
1b4f0 6e 53 68 61 72 65 64 21 3d 30 20 29 3b 0a 20 20  nShared!=0 );.  
1b500 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  if( pFile->eFile
1b510 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b  Lock>SHARED_LOCK
1b520 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
1b530 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
1b540 6b 3d 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  k==pFile->eFileL
1b550 6f 63 6b 20 29 3b 0a 20 20 20 20 53 69 6d 75 6c  ock );.    Simul
1b560 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e  ateIOErrorBenign
1b570 28 31 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74  (1);.    Simulat
1b580 65 49 4f 45 72 72 6f 72 28 20 68 3d 28 2d 31 29  eIOError( h=(-1)
1b590 20 29 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49   ).    SimulateI
1b5a0 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b  OErrorBenign(0);
1b5b0 0a 20 20 20 20 0a 23 69 66 64 65 66 20 53 51 4c  .    .#ifdef SQL
1b5c0 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a  ITE_DEBUG.    /*
1b5d0 20 57 68 65 6e 20 72 65 64 75 63 69 6e 67 20 61   When reducing a
1b5e0 20 6c 6f 63 6b 20 73 75 63 68 20 74 68 61 74 20   lock such that 
1b5f0 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 20  other processes 
1b600 63 61 6e 20 73 74 61 72 74 0a 20 20 20 20 2a 2a  can start.    **
1b610 20 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74   reading the dat
1b620 61 62 61 73 65 20 66 69 6c 65 20 61 67 61 69 6e  abase file again
1b630 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  , make sure that
1b640 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e   the.    ** tran
1b650 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20  saction counter 
1b660 77 61 73 20 75 70 64 61 74 65 64 20 69 66 20 61  was updated if a
1b670 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65 20 64  ny part of the d
1b680 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66  atabase.    ** f
1b690 69 6c 65 20 63 68 61 6e 67 65 64 2e 20 20 49 66  ile changed.  If
1b6a0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
1b6b0 20 63 6f 75 6e 74 65 72 20 69 73 20 6e 6f 74 20   counter is not 
1b6c0 75 70 64 61 74 65 64 2c 0a 20 20 20 20 2a 2a 20  updated,.    ** 
1b6d0 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
1b6e0 73 20 74 6f 20 74 68 65 20 73 61 6d 65 20 66 69  s to the same fi
1b6f0 6c 65 20 6d 69 67 68 74 20 6e 6f 74 20 72 65 61  le might not rea
1b700 6c 69 7a 65 20 74 68 61 74 0a 20 20 20 20 2a 2a  lize that.    **
1b710 20 74 68 65 20 66 69 6c 65 20 68 61 73 20 63 68   the file has ch
1b720 61 6e 67 65 64 20 61 6e 64 20 68 65 6e 63 65 20  anged and hence 
1b730 6d 69 67 68 74 20 6e 6f 74 20 6b 6e 6f 77 20 74  might not know t
1b740 6f 20 66 6c 75 73 68 20 74 68 65 69 72 0a 20 20  o flush their.  
1b750 20 20 2a 2a 20 63 61 63 68 65 2e 20 20 54 68 65    ** cache.  The
1b760 20 75 73 65 20 6f 66 20 61 20 73 74 61 6c 65 20   use of a stale 
1b770 63 61 63 68 65 20 63 61 6e 20 6c 65 61 64 20 74  cache can lead t
1b780 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75  o database corru
1b790 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  ption..    */.  
1b7a0 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d    assert( pFile-
1b7b0 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 3d 3d  >inNormalWrite==
1b7c0 30 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  0.           || 
1b7d0 70 46 69 6c 65 2d 3e 64 62 55 70 64 61 74 65 3d  pFile->dbUpdate=
1b7e0 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  =0.           ||
1b7f0 20 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e 74   pFile->transCnt
1b800 72 43 68 6e 67 3d 3d 31 20 29 3b 0a 20 20 20 20  rChng==1 );.    
1b810 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57  pFile->inNormalW
1b820 72 69 74 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66  rite = 0;.#endif
1b830 0a 20 20 20 20 0a 20 20 20 20 69 66 28 20 70 46  .    .    if( pF
1b840 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d  ile->eFileLock==
1b850 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
1b860 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61 66 70  {.      rc = afp
1b870 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d  SetLock(context-
1b880 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20  >dbPath, pFile, 
1b890 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20 53 48  SHARED_FIRST, SH
1b8a0 41 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a 20  ARED_SIZE, 0);. 
1b8b0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
1b8c0 49 54 45 5f 4f 4b 20 26 26 20 28 65 46 69 6c 65  ITE_OK && (eFile
1b8d0 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
1b8e0 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 6e 53 68  K || pInode->nSh
1b8f0 61 72 65 64 3e 31 29 20 29 7b 0a 20 20 20 20 20  ared>1) ){.     
1b900 20 20 20 2f 2a 20 6f 6e 6c 79 20 72 65 2d 65 73     /* only re-es
1b910 74 61 62 6c 69 73 68 20 74 68 65 20 73 68 61 72  tablish the shar
1b920 65 64 20 6c 6f 63 6b 20 69 66 20 6e 65 63 65 73  ed lock if neces
1b930 73 61 72 79 20 2a 2f 0a 20 20 20 20 20 20 20 20  sary */.        
1b940 69 6e 74 20 73 68 61 72 65 64 4c 6f 63 6b 42 79  int sharedLockBy
1b950 74 65 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53  te = SHARED_FIRS
1b960 54 2b 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64  T+pInode->shared
1b970 42 79 74 65 3b 0a 20 20 20 20 20 20 20 20 72 63  Byte;.        rc
1b980 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f   = afpSetLock(co
1b990 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70  ntext->dbPath, p
1b9a0 46 69 6c 65 2c 20 73 68 61 72 65 64 4c 6f 63 6b  File, sharedLock
1b9b0 42 79 74 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20  Byte, 1, 1);.   
1b9c0 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
1b9d0 20 20 20 20 73 6b 69 70 53 68 61 72 65 64 20 3d      skipShared =
1b9e0 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
1b9f0 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  }.    if( rc==SQ
1ba00 4c 49 54 45 5f 4f 4b 20 26 26 20 70 46 69 6c 65  LITE_OK && pFile
1ba10 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 50 45 4e  ->eFileLock>=PEN
1ba20 44 49 4e 47 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  DING_LOCK ){.   
1ba30 20 20 20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f     rc = afpSetLo
1ba40 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61  ck(context->dbPa
1ba50 74 68 2c 20 70 46 69 6c 65 2c 20 50 45 4e 44 49  th, pFile, PENDI
1ba60 4e 47 5f 42 59 54 45 2c 20 31 2c 20 30 29 3b 0a  NG_BYTE, 1, 0);.
1ba70 20 20 20 20 7d 20 0a 20 20 20 20 69 66 28 20 72      } .    if( r
1ba80 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1ba90 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
1baa0 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  >=RESERVED_LOCK 
1bab0 26 26 20 63 6f 6e 74 65 78 74 2d 3e 72 65 73 65  && context->rese
1bac0 72 76 65 64 20 29 7b 0a 20 20 20 20 20 20 72 63  rved ){.      rc
1bad0 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f   = afpSetLock(co
1bae0 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70  ntext->dbPath, p
1baf0 46 69 6c 65 2c 20 52 45 53 45 52 56 45 44 5f 42  File, RESERVED_B
1bb00 59 54 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  YTE, 1, 0);.    
1bb10 20 20 69 66 28 20 21 72 63 20 29 7b 20 0a 20 20    if( !rc ){ .  
1bb20 20 20 20 20 20 20 63 6f 6e 74 65 78 74 2d 3e 72        context->r
1bb30 65 73 65 72 76 65 64 20 3d 20 30 3b 20 0a 20 20  eserved = 0; .  
1bb40 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1bb50 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1bb60 4b 20 26 26 20 28 65 46 69 6c 65 4c 6f 63 6b 3d  K && (eFileLock=
1bb70 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20  =SHARED_LOCK || 
1bb80 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e  pInode->nShared>
1bb90 31 29 29 7b 0a 20 20 20 20 20 20 70 49 6e 6f 64  1)){.      pInod
1bba0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53  e->eFileLock = S
1bbb0 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20  HARED_LOCK;.    
1bbc0 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  }.  }.  if( rc==
1bbd0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65 46 69  SQLITE_OK && eFi
1bbe0 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20  leLock==NO_LOCK 
1bbf0 29 7b 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72 65  ){..    /* Decre
1bc00 6d 65 6e 74 20 74 68 65 20 73 68 61 72 65 64 20  ment the shared 
1bc10 6c 6f 63 6b 20 63 6f 75 6e 74 65 72 2e 20 20 52  lock counter.  R
1bc20 65 6c 65 61 73 65 20 74 68 65 20 6c 6f 63 6b 20  elease the lock 
1bc30 75 73 69 6e 67 20 61 6e 0a 20 20 20 20 2a 2a 20  using an.    ** 
1bc40 4f 53 20 63 61 6c 6c 20 6f 6e 6c 79 20 77 68 65  OS call only whe
1bc50 6e 20 61 6c 6c 20 74 68 72 65 61 64 73 20 69 6e  n all threads in
1bc60 20 74 68 69 73 20 73 61 6d 65 20 70 72 6f 63 65   this same proce
1bc70 73 73 20 68 61 76 65 20 72 65 6c 65 61 73 65 64  ss have released
1bc80 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c 6f 63 6b  .    ** the lock
1bc90 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 75 6e 73  ..    */.    uns
1bca0 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20  igned long long 
1bcb0 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 20 3d  sharedLockByte =
1bcc0 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b 70 49   SHARED_FIRST+pI
1bcd0 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79 74 65  node->sharedByte
1bce0 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53  ;.    pInode->nS
1bcf0 68 61 72 65 64 2d 2d 3b 0a 20 20 20 20 69 66 28  hared--;.    if(
1bd00 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
1bd10 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 53 69 6d  ==0 ){.      Sim
1bd20 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69  ulateIOErrorBeni
1bd30 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 53 69 6d  gn(1);.      Sim
1bd40 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 68 3d  ulateIOError( h=
1bd50 28 2d 31 29 20 29 0a 20 20 20 20 20 20 53 69 6d  (-1) ).      Sim
1bd60 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69  ulateIOErrorBeni
1bd70 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 69 66 28  gn(0);.      if(
1bd80 20 21 73 6b 69 70 53 68 61 72 65 64 20 29 7b 0a   !skipShared ){.
1bd90 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 66 70          rc = afp
1bda0 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d  SetLock(context-
1bdb0 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20  >dbPath, pFile, 
1bdc0 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20  sharedLockByte, 
1bdd0 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  1, 0);.      }. 
1bde0 20 20 20 20 20 69 66 28 20 21 72 63 20 29 7b 0a       if( !rc ){.
1bdf0 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e          pInode->
1be00 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c  eFileLock = NO_L
1be10 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 70 46 69  OCK;.        pFi
1be20 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
1be30 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d  NO_LOCK;.      }
1be40 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
1be50 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1be60 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c        pInode->nL
1be70 6f 63 6b 2d 2d 3b 0a 20 20 20 20 20 20 61 73 73  ock--;.      ass
1be80 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f  ert( pInode->nLo
1be90 63 6b 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  ck>=0 );.      i
1bea0 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b  f( pInode->nLock
1beb0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ==0 ){.        c
1bec0 6c 6f 73 65 50 65 6e 64 69 6e 67 46 64 73 28 70  losePendingFds(p
1bed0 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  File);.      }. 
1bee0 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 75 6e     }.  }.  .  un
1bef0 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
1bf00 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1bf10 5f 4f 4b 20 29 20 70 46 69 6c 65 2d 3e 65 46 69  _OK ) pFile->eFi
1bf20 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f  leLock = eFileLo
1bf30 63 6b 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ck;.  return rc;
1bf40 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
1bf50 61 20 66 69 6c 65 20 26 20 63 6c 65 61 6e 75 70  a file & cleanup
1bf60 20 41 46 50 20 73 70 65 63 69 66 69 63 20 6c 6f   AFP specific lo
1bf70 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 0a 2a  cking context .*
1bf80 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66 70  /.static int afp
1bf90 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69  Close(sqlite3_fi
1bfa0 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69 6e 74 20  le *id) {.  int 
1bfb0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1bfc0 20 20 69 66 28 20 69 64 20 29 7b 0a 20 20 20 20    if( id ){.    
1bfd0 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
1bfe0 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
1bff0 0a 20 20 20 20 61 66 70 55 6e 6c 6f 63 6b 28 69  .    afpUnlock(i
1c000 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20  d, NO_LOCK);.   
1c010 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
1c020 29 3b 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65  );.    if( pFile
1c030 2d 3e 70 49 6e 6f 64 65 20 26 26 20 70 46 69 6c  ->pInode && pFil
1c040 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b  e->pInode->nLock
1c050 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
1c060 74 68 65 72 65 20 61 72 65 20 6f 75 74 73 74 61  there are outsta
1c070 6e 64 69 6e 67 20 6c 6f 63 6b 73 2c 20 64 6f 20  nding locks, do 
1c080 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 63 6c 6f  not actually clo
1c090 73 65 20 74 68 65 20 66 69 6c 65 20 6a 75 73 74  se the file just
1c0a0 0a 20 20 20 20 20 20 2a 2a 20 79 65 74 20 62 65  .      ** yet be
1c0b0 63 61 75 73 65 20 74 68 61 74 20 77 6f 75 6c 64  cause that would
1c0c0 20 63 6c 65 61 72 20 74 68 6f 73 65 20 6c 6f 63   clear those loc
1c0d0 6b 73 2e 20 20 49 6e 73 74 65 61 64 2c 20 61 64  ks.  Instead, ad
1c0e0 64 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 20  d the file.     
1c0f0 20 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20 74   ** descriptor t
1c100 6f 20 70 49 6e 6f 64 65 2d 3e 61 50 65 6e 64 69  o pInode->aPendi
1c110 6e 67 2e 20 20 49 74 20 77 69 6c 6c 20 62 65 20  ng.  It will be 
1c120 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6c  automatically cl
1c130 6f 73 65 64 20 77 68 65 6e 0a 20 20 20 20 20 20  osed when.      
1c140 2a 2a 20 74 68 65 20 6c 61 73 74 20 6c 6f 63 6b  ** the last lock
1c150 20 69 73 20 63 6c 65 61 72 65 64 2e 0a 20 20 20   is cleared..   
1c160 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 65 74 50     */.      setP
1c170 65 6e 64 69 6e 67 46 64 28 70 46 69 6c 65 29 3b  endingFd(pFile);
1c180 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6c 65 61  .    }.    relea
1c190 73 65 49 6e 6f 64 65 49 6e 66 6f 28 70 46 69 6c  seInodeInfo(pFil
1c1a0 65 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  e);.    sqlite3_
1c1b0 66 72 65 65 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b  free(pFile->lock
1c1c0 69 6e 67 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20  ingContext);.   
1c1d0 20 72 63 20 3d 20 63 6c 6f 73 65 55 6e 69 78 46   rc = closeUnixF
1c1e0 69 6c 65 28 69 64 29 3b 0a 20 20 20 20 75 6e 69  ile(id);.    uni
1c1f0 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20  xLeaveMutex();. 
1c200 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
1c210 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66  }..#endif /* def
1c220 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
1c230 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
1c240 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a  _LOCKING_STYLE *
1c250 2f 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65  /./*.** The code
1c260 20 61 62 6f 76 65 20 69 73 20 74 68 65 20 41 46   above is the AF
1c270 50 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74  P lock implement
1c280 61 74 69 6f 6e 2e 20 20 54 68 65 20 63 6f 64 65  ation.  The code
1c290 20 69 73 20 73 70 65 63 69 66 69 63 0a 2a 2a 20   is specific.** 
1c2a0 74 6f 20 4d 61 63 4f 53 58 20 61 6e 64 20 64 6f  to MacOSX and do
1c2b0 65 73 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 6f  es not work on o
1c2c0 74 68 65 72 20 75 6e 69 78 20 70 6c 61 74 66 6f  ther unix platfo
1c2d0 72 6d 73 2e 20 20 4e 6f 20 61 6c 74 65 72 6e 61  rms.  No alterna
1c2e0 74 69 76 65 0a 2a 2a 20 69 73 20 61 76 61 69 6c  tive.** is avail
1c2f0 61 62 6c 65 2e 20 20 49 66 20 79 6f 75 20 64 6f  able.  If you do
1c300 6e 27 74 20 63 6f 6d 70 69 6c 65 20 66 6f 72 20  n't compile for 
1c310 61 20 6d 61 63 2c 20 74 68 65 6e 20 74 68 65 20  a mac, then the 
1c320 22 75 6e 69 78 2d 61 66 70 22 0a 2a 2a 20 56 46  "unix-afp".** VF
1c330 53 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62  S is not availab
1c340 6c 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  le..**.*********
1c350 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64  ************ End
1c360 20 6f 66 20 74 68 65 20 41 46 50 20 6c 6f 63 6b   of the AFP lock
1c370 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
1c380 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c390 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
1c3a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c3b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c3c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c3d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c3e0 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  *****/../*******
1c3f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c400 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c410 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c420 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c430 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
1c440 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c450 2a 2a 2a 20 42 65 67 69 6e 20 4e 46 53 20 4c 6f  *** Begin NFS Lo
1c460 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  cking **********
1c470 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c480 2a 2a 2a 2a 2a 2a 2f 0a 0a 23 69 66 20 64 65 66  ******/..#if def
1c490 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
1c4a0 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
1c4b0 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f  _LOCKING_STYLE./
1c4c0 2a 0a 20 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20  *. ** Lower the 
1c4d0 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e  locking level on
1c4e0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
1c4f0 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c   pFile to eFileL
1c500 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a  ock.  eFileLock.
1c510 20 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68   ** must be eith
1c520 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48  er NO_LOCK or SH
1c530 41 52 45 44 5f 4c 4f 43 4b 2e 0a 20 2a 2a 0a 20  ARED_LOCK.. **. 
1c540 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e  ** If the lockin
1c550 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66  g level of the f
1c560 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
1c570 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20  s already at or 
1c580 62 65 6c 6f 77 0a 20 2a 2a 20 74 68 65 20 72 65  below. ** the re
1c590 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20  quested locking 
1c5a0 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74  level, this rout
1c5b0 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
1c5c0 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e   */.static int n
1c5d0 66 73 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33  fsUnlock(sqlite3
1c5e0 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65  _file *id, int e
1c5f0 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20 72 65 74  FileLock){.  ret
1c600 75 72 6e 20 70 6f 73 69 78 55 6e 6c 6f 63 6b 28  urn posixUnlock(
1c610 69 64 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 20 31  id, eFileLock, 1
1c620 29 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20  );.}..#endif /* 
1c630 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
1c640 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41  _) && SQLITE_ENA
1c650 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
1c660 45 20 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63  E */./*.** The c
1c670 6f 64 65 20 61 62 6f 76 65 20 69 73 20 74 68 65  ode above is the
1c680 20 4e 46 53 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d   NFS lock implem
1c690 65 6e 74 61 74 69 6f 6e 2e 20 20 54 68 65 20 63  entation.  The c
1c6a0 6f 64 65 20 69 73 20 73 70 65 63 69 66 69 63 0a  ode is specific.
1c6b0 2a 2a 20 74 6f 20 4d 61 63 4f 53 58 20 61 6e 64  ** to MacOSX and
1c6c0 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 6f   does not work o
1c6d0 6e 20 6f 74 68 65 72 20 75 6e 69 78 20 70 6c 61  n other unix pla
1c6e0 74 66 6f 72 6d 73 2e 20 20 4e 6f 20 61 6c 74 65  tforms.  No alte
1c6f0 72 6e 61 74 69 76 65 0a 2a 2a 20 69 73 20 61 76  rnative.** is av
1c700 61 69 6c 61 62 6c 65 2e 20 20 0a 2a 2a 0a 2a 2a  ailable.  .**.**
1c710 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c720 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 4e  *** End of the N
1c730 46 53 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e  FS lock implemen
1c740 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  tation *********
1c750 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
1c760 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c770 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c780 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c790 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c7a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f  ************/../
1c7b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c7c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c7d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c7e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c7f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
1c800 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
1c810 4e 6f 6e 2d 6c 6f 63 6b 69 6e 67 20 73 71 6c 69  Non-locking sqli
1c820 74 65 33 5f 66 69 6c 65 20 6d 65 74 68 6f 64 73  te3_file methods
1c830 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
1c840 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
1c850 2a 0a 2a 2a 20 54 68 65 20 6e 65 78 74 20 64 69  *.** The next di
1c860 76 69 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20  vision contains 
1c870 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20  implementations 
1c880 66 6f 72 20 61 6c 6c 20 6d 65 74 68 6f 64 73 20  for all methods 
1c890 6f 66 20 74 68 65 20 0a 2a 2a 20 73 71 6c 69 74  of the .** sqlit
1c8a0 65 33 5f 66 69 6c 65 20 6f 62 6a 65 63 74 20 6f  e3_file object o
1c8b0 74 68 65 72 20 74 68 61 6e 20 74 68 65 20 6c 6f  ther than the lo
1c8c0 63 6b 69 6e 67 20 6d 65 74 68 6f 64 73 2e 20 20  cking methods.  
1c8d0 54 68 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 6d  The locking.** m
1c8e0 65 74 68 6f 64 73 20 77 65 72 65 20 64 65 66 69  ethods were defi
1c8f0 6e 65 64 20 69 6e 20 64 69 76 69 73 69 6f 6e 73  ned in divisions
1c900 20 61 62 6f 76 65 20 28 6f 6e 65 20 6c 6f 63 6b   above (one lock
1c910 69 6e 67 20 6d 65 74 68 6f 64 20 70 65 72 0a 2a  ing method per.*
1c920 2a 20 64 69 76 69 73 69 6f 6e 29 2e 20 20 54 68  * division).  Th
1c930 6f 73 65 20 6d 65 74 68 6f 64 73 20 74 68 61 74  ose methods that
1c940 20 61 72 65 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61   are common to a
1c950 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 73  ll locking modes
1c960 0a 2a 2a 20 61 72 65 20 67 61 74 68 65 72 20 74  .** are gather t
1c970 6f 67 65 74 68 65 72 20 69 6e 74 6f 20 74 68 69  ogether into thi
1c980 73 20 64 69 76 69 73 69 6f 6e 2e 0a 2a 2f 0a 0a  s division..*/..
1c990 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74 6f 20 74 68  /*.** Seek to th
1c9a0 65 20 6f 66 66 73 65 74 20 70 61 73 73 65 64 20  e offset passed 
1c9b0 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
1c9c0 67 75 6d 65 6e 74 2c 20 74 68 65 6e 20 72 65 61  gument, then rea
1c9d0 64 20 63 6e 74 20 0a 2a 2a 20 62 79 74 65 73 20  d cnt .** bytes 
1c9e0 69 6e 74 6f 20 70 42 75 66 2e 20 52 65 74 75 72  into pBuf. Retur
1c9f0 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
1ca00 62 79 74 65 73 20 61 63 74 75 61 6c 6c 79 20 72  bytes actually r
1ca10 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 4e 42 3a 20 20  ead..**.** NB:  
1ca20 49 66 20 79 6f 75 20 64 65 66 69 6e 65 20 55 53  If you define US
1ca30 45 5f 50 52 45 41 44 20 6f 72 20 55 53 45 5f 50  E_PREAD or USE_P
1ca40 52 45 41 44 36 34 2c 20 74 68 65 6e 20 69 74 20  READ64, then it 
1ca50 6d 69 67 68 74 20 61 6c 73 6f 0a 2a 2a 20 62 65  might also.** be
1ca60 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 64 65   necessary to de
1ca70 66 69 6e 65 20 5f 58 4f 50 45 4e 5f 53 4f 55 52  fine _XOPEN_SOUR
1ca80 43 45 20 74 6f 20 62 65 20 35 30 30 2e 20 20 54  CE to be 500.  T
1ca90 68 69 73 20 76 61 72 69 65 73 20 66 72 6f 6d 0a  his varies from.
1caa0 2a 2a 20 6f 6e 65 20 73 79 73 74 65 6d 20 74 6f  ** one system to
1cab0 20 61 6e 6f 74 68 65 72 2e 20 20 53 69 6e 63 65   another.  Since
1cac0 20 53 51 4c 69 74 65 20 64 6f 65 73 20 6e 6f 74   SQLite does not
1cad0 20 64 65 66 69 6e 65 20 55 53 45 5f 50 52 45 41   define USE_PREA
1cae0 44 0a 2a 2a 20 69 6e 20 61 6e 79 20 66 6f 72 6d  D.** in any form
1caf0 20 62 79 20 64 65 66 61 75 6c 74 2c 20 77 65 20   by default, we 
1cb00 77 69 6c 6c 20 6e 6f 74 20 61 74 74 65 6d 70 74  will not attempt
1cb10 20 74 6f 20 64 65 66 69 6e 65 20 5f 58 4f 50 45   to define _XOPE
1cb20 4e 5f 53 4f 55 52 43 45 2e 0a 2a 2a 20 53 65 65  N_SOURCE..** See
1cb30 20 74 69 63 6b 65 74 73 20 23 32 37 34 31 20 61   tickets #2741 a
1cb40 6e 64 20 23 32 36 38 31 2e 0a 2a 2a 0a 2a 2a 20  nd #2681..**.** 
1cb50 54 6f 20 61 76 6f 69 64 20 73 74 6f 6d 70 69 6e  To avoid stompin
1cb60 67 20 74 68 65 20 65 72 72 6e 6f 20 76 61 6c 75  g the errno valu
1cb70 65 20 6f 6e 20 61 20 66 61 69 6c 65 64 20 72 65  e on a failed re
1cb80 61 64 20 74 68 65 20 6c 61 73 74 45 72 72 6e 6f  ad the lastErrno
1cb90 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74   value.** is set
1cba0 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
1cbb0 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
1cbc0 20 73 65 65 6b 41 6e 64 52 65 61 64 28 75 6e 69   seekAndRead(uni
1cbd0 78 46 69 6c 65 20 2a 69 64 2c 20 73 71 6c 69 74  xFile *id, sqlit
1cbe0 65 33 5f 69 6e 74 36 34 20 6f 66 66 73 65 74 2c  e3_int64 offset,
1cbf0 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 69 6e 74   void *pBuf, int
1cc00 20 63 6e 74 29 7b 0a 20 20 69 6e 74 20 67 6f 74   cnt){.  int got
1cc10 3b 0a 20 20 69 6e 74 20 70 72 69 6f 72 20 3d 20  ;.  int prior = 
1cc20 30 3b 0a 23 69 66 20 28 21 64 65 66 69 6e 65 64  0;.#if (!defined
1cc30 28 55 53 45 5f 50 52 45 41 44 29 20 26 26 20 21  (USE_PREAD) && !
1cc40 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41  defined(USE_PREA
1cc50 44 36 34 29 29 0a 20 20 69 36 34 20 6e 65 77 4f  D64)).  i64 newO
1cc60 66 66 73 65 74 3b 0a 23 65 6e 64 69 66 0a 20 20  ffset;.#endif.  
1cc70 54 49 4d 45 52 5f 53 54 41 52 54 3b 0a 20 20 61  TIMER_START;.  a
1cc80 73 73 65 72 74 28 20 63 6e 74 3d 3d 28 63 6e 74  ssert( cnt==(cnt
1cc90 26 30 78 31 66 66 66 66 29 20 29 3b 0a 20 20 61  &0x1ffff) );.  a
1cca0 73 73 65 72 74 28 20 69 64 2d 3e 68 3e 32 20 29  ssert( id->h>2 )
1ccb0 3b 0a 20 20 63 6e 74 20 26 3d 20 30 78 31 66 66  ;.  cnt &= 0x1ff
1ccc0 66 66 3b 0a 20 20 64 6f 7b 0a 23 69 66 20 64 65  ff;.  do{.#if de
1ccd0 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29  fined(USE_PREAD)
1cce0 0a 20 20 20 20 67 6f 74 20 3d 20 6f 73 50 72 65  .    got = osPre
1ccf0 61 64 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20  ad(id->h, pBuf, 
1cd00 63 6e 74 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20  cnt, offset);.  
1cd10 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
1cd20 72 28 20 67 6f 74 20 3d 20 2d 31 20 29 3b 0a 23  r( got = -1 );.#
1cd30 65 6c 69 66 20 64 65 66 69 6e 65 64 28 55 53 45  elif defined(USE
1cd40 5f 50 52 45 41 44 36 34 29 0a 20 20 20 20 67 6f  _PREAD64).    go
1cd50 74 20 3d 20 6f 73 50 72 65 61 64 36 34 28 69 64  t = osPread64(id
1cd60 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 2c 20  ->h, pBuf, cnt, 
1cd70 6f 66 66 73 65 74 29 3b 0a 20 20 20 20 53 69 6d  offset);.    Sim
1cd80 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 67 6f  ulateIOError( go
1cd90 74 20 3d 20 2d 31 20 29 3b 0a 23 65 6c 73 65 0a  t = -1 );.#else.
1cda0 20 20 20 20 6e 65 77 4f 66 66 73 65 74 20 3d 20      newOffset = 
1cdb0 6c 73 65 65 6b 28 69 64 2d 3e 68 2c 20 6f 66 66  lseek(id->h, off
1cdc0 73 65 74 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a  set, SEEK_SET);.
1cdd0 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72      SimulateIOEr
1cde0 72 6f 72 28 20 6e 65 77 4f 66 66 73 65 74 2d 2d  ror( newOffset--
1cdf0 20 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 77 4f   );.    if( newO
1ce00 66 66 73 65 74 21 3d 6f 66 66 73 65 74 20 29 7b  ffset!=offset ){
1ce10 0a 20 20 20 20 20 20 69 66 28 20 6e 65 77 4f 66  .      if( newOf
1ce20 66 73 65 74 20 3d 3d 20 2d 31 20 29 7b 0a 20 20  fset == -1 ){.  
1ce30 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45        storeLastE
1ce40 72 72 6e 6f 28 28 75 6e 69 78 46 69 6c 65 2a 29  rrno((unixFile*)
1ce50 69 64 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20  id, errno);.    
1ce60 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1ce70 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28   storeLastErrno(
1ce80 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 2c 20 30  (unixFile*)id, 0
1ce90 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1cea0 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20   return -1;.    
1ceb0 7d 0a 20 20 20 20 67 6f 74 20 3d 20 6f 73 52 65  }.    got = osRe
1cec0 61 64 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20  ad(id->h, pBuf, 
1ced0 63 6e 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  cnt);.#endif.   
1cee0 20 69 66 28 20 67 6f 74 3d 3d 63 6e 74 20 29 20   if( got==cnt ) 
1cef0 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 67  break;.    if( g
1cf00 6f 74 3c 30 20 29 7b 0a 20 20 20 20 20 20 69 66  ot<0 ){.      if
1cf10 28 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29  ( errno==EINTR )
1cf20 7b 20 67 6f 74 20 3d 20 31 3b 20 63 6f 6e 74 69  { got = 1; conti
1cf30 6e 75 65 3b 20 7d 0a 20 20 20 20 20 20 70 72 69  nue; }.      pri
1cf40 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 74  or = 0;.      st
1cf50 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 28 75 6e  oreLastErrno((un
1cf60 69 78 46 69 6c 65 2a 29 69 64 2c 20 65 72 72 6e  ixFile*)id, errn
1cf70 6f 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  o);.      break;
1cf80 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 67  .    }else if( g
1cf90 6f 74 3e 30 20 29 7b 0a 20 20 20 20 20 20 63 6e  ot>0 ){.      cn
1cfa0 74 20 2d 3d 20 67 6f 74 3b 0a 20 20 20 20 20 20  t -= got;.      
1cfb0 6f 66 66 73 65 74 20 2b 3d 20 67 6f 74 3b 0a 20  offset += got;. 
1cfc0 20 20 20 20 20 70 72 69 6f 72 20 2b 3d 20 67 6f       prior += go
1cfd0 74 3b 0a 20 20 20 20 20 20 70 42 75 66 20 3d 20  t;.      pBuf = 
1cfe0 28 76 6f 69 64 2a 29 28 67 6f 74 20 2b 20 28 63  (void*)(got + (c
1cff0 68 61 72 2a 29 70 42 75 66 29 3b 0a 20 20 20 20  har*)pBuf);.    
1d000 7d 0a 20 20 7d 77 68 69 6c 65 28 20 67 6f 74 3e  }.  }while( got>
1d010 30 20 29 3b 0a 20 20 54 49 4d 45 52 5f 45 4e 44  0 );.  TIMER_END
1d020 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 52 45  ;.  OSTRACE(("RE
1d030 41 44 20 20 20 20 25 2d 33 64 20 25 35 64 20 25  AD    %-3d %5d %
1d040 37 6c 6c 64 20 25 6c 6c 75 5c 6e 22 2c 0a 20 20  7lld %llu\n",.  
1d050 20 20 20 20 20 20 20 20 20 20 69 64 2d 3e 68 2c            id->h,
1d060 20 67 6f 74 2b 70 72 69 6f 72 2c 20 6f 66 66 73   got+prior, offs
1d070 65 74 2d 70 72 69 6f 72 2c 20 54 49 4d 45 52 5f  et-prior, TIMER_
1d080 45 4c 41 50 53 45 44 29 29 3b 0a 20 20 72 65 74  ELAPSED));.  ret
1d090 75 72 6e 20 67 6f 74 2b 70 72 69 6f 72 3b 0a 7d  urn got+prior;.}
1d0a0 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 64 61 74  ../*.** Read dat
1d0b0 61 20 66 72 6f 6d 20 61 20 66 69 6c 65 20 69 6e  a from a file in
1d0c0 74 6f 20 61 20 62 75 66 66 65 72 2e 20 20 52 65  to a buffer.  Re
1d0d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  turn SQLITE_OK i
1d0e0 66 20 61 6c 6c 0a 2a 2a 20 62 79 74 65 73 20 77  f all.** bytes w
1d0f0 65 72 65 20 72 65 61 64 20 73 75 63 63 65 73 73  ere read success
1d100 66 75 6c 6c 79 20 61 6e 64 20 53 51 4c 49 54 45  fully and SQLITE
1d110 5f 49 4f 45 52 52 20 69 66 20 61 6e 79 74 68 69  _IOERR if anythi
1d120 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67  ng goes.** wrong
1d130 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1d140 75 6e 69 78 52 65 61 64 28 0a 20 20 73 71 6c 69  unixRead(.  sqli
1d150 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 0a 20  te3_file *id, . 
1d160 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 0a 20 20   void *pBuf, .  
1d170 69 6e 74 20 61 6d 74 2c 0a 20 20 73 71 6c 69 74  int amt,.  sqlit
1d180 65 33 5f 69 6e 74 36 34 20 6f 66 66 73 65 74 0a  e3_int64 offset.
1d190 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  ){.  unixFile *p
1d1a0 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
1d1b0 20 2a 29 69 64 3b 0a 20 20 69 6e 74 20 67 6f 74   *)id;.  int got
1d1c0 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 20 29  ;.  assert( id )
1d1d0 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73  ;.  assert( offs
1d1e0 65 74 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  et>=0 );.  asser
1d1f0 74 28 20 61 6d 74 3e 30 20 29 3b 0a 0a 20 20 2f  t( amt>0 );..  /
1d200 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20 64  * If this is a d
1d210 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 6e 6f  atabase file (no
1d220 74 20 61 20 6a 6f 75 72 6e 61 6c 2c 20 6d 61 73  t a journal, mas
1d230 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6f 72 20 74  ter-journal or t
1d240 65 6d 70 0a 20 20 2a 2a 20 66 69 6c 65 29 2c 20  emp.  ** file), 
1d250 74 68 65 20 62 79 74 65 73 20 69 6e 20 74 68 65  the bytes in the
1d260 20 6c 6f 63 6b 69 6e 67 20 72 61 6e 67 65 20 73   locking range s
1d270 68 6f 75 6c 64 20 6e 65 76 65 72 20 62 65 20 72  hould never be r
1d280 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e 2e 20  ead or written. 
1d290 2a 2f 0a 23 69 66 20 30 0a 20 20 61 73 73 65 72  */.#if 0.  asser
1d2a0 74 28 20 70 46 69 6c 65 2d 3e 70 55 6e 75 73 65  t( pFile->pUnuse
1d2b0 64 3d 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 6f  d==0.       || o
1d2c0 66 66 73 65 74 3e 3d 50 45 4e 44 49 4e 47 5f 42  ffset>=PENDING_B
1d2d0 59 54 45 2b 35 31 32 0a 20 20 20 20 20 20 20 7c  YTE+512.       |
1d2e0 7c 20 6f 66 66 73 65 74 2b 61 6d 74 3c 3d 50 45  | offset+amt<=PE
1d2f0 4e 44 49 4e 47 5f 42 59 54 45 20 0a 20 20 29 3b  NDING_BYTE .  );
1d300 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c  .#endif..#if SQL
1d310 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
1d320 45 3e 30 0a 20 20 2f 2a 20 44 65 61 6c 20 77 69  E>0.  /* Deal wi
1d330 74 68 20 61 73 20 6d 75 63 68 20 6f 66 20 74 68  th as much of th
1d340 69 73 20 72 65 61 64 20 72 65 71 75 65 73 74 20  is read request 
1d350 61 73 20 70 6f 73 73 69 62 6c 65 20 62 79 20 74  as possible by t
1d360 72 61 6e 73 66 65 72 69 6e 67 0a 20 20 2a 2a 20  ransfering.  ** 
1d370 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 6d 65  data from the me
1d380 6d 6f 72 79 20 6d 61 70 70 69 6e 67 20 75 73 69  mory mapping usi
1d390 6e 67 20 6d 65 6d 63 70 79 28 29 2e 20 20 2a 2f  ng memcpy().  */
1d3a0 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c 70 46  .  if( offset<pF
1d3b0 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b  ile->mmapSize ){
1d3c0 0a 20 20 20 20 69 66 28 20 6f 66 66 73 65 74 2b  .    if( offset+
1d3d0 61 6d 74 20 3c 3d 20 70 46 69 6c 65 2d 3e 6d 6d  amt <= pFile->mm
1d3e0 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  apSize ){.      
1d3f0 6d 65 6d 63 70 79 28 70 42 75 66 2c 20 26 28 28  memcpy(pBuf, &((
1d400 75 38 20 2a 29 28 70 46 69 6c 65 2d 3e 70 4d 61  u8 *)(pFile->pMa
1d410 70 52 65 67 69 6f 6e 29 29 5b 6f 66 66 73 65 74  pRegion))[offset
1d420 5d 2c 20 61 6d 74 29 3b 0a 20 20 20 20 20 20 72  ], amt);.      r
1d430 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1d440 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1d450 20 20 69 6e 74 20 6e 43 6f 70 79 20 3d 20 70 46    int nCopy = pF
1d460 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 2d 20  ile->mmapSize - 
1d470 6f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 6d 65  offset;.      me
1d480 6d 63 70 79 28 70 42 75 66 2c 20 26 28 28 75 38  mcpy(pBuf, &((u8
1d490 20 2a 29 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52   *)(pFile->pMapR
1d4a0 65 67 69 6f 6e 29 29 5b 6f 66 66 73 65 74 5d 2c  egion))[offset],
1d4b0 20 6e 43 6f 70 79 29 3b 0a 20 20 20 20 20 20 70   nCopy);.      p
1d4c0 42 75 66 20 3d 20 26 28 28 75 38 20 2a 29 70 42  Buf = &((u8 *)pB
1d4d0 75 66 29 5b 6e 43 6f 70 79 5d 3b 0a 20 20 20 20  uf)[nCopy];.    
1d4e0 20 20 61 6d 74 20 2d 3d 20 6e 43 6f 70 79 3b 0a    amt -= nCopy;.
1d4f0 20 20 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20        offset += 
1d500 6e 43 6f 70 79 3b 0a 20 20 20 20 7d 0a 20 20 7d  nCopy;.    }.  }
1d510 0a 23 65 6e 64 69 66 0a 0a 20 20 67 6f 74 20 3d  .#endif..  got =
1d520 20 73 65 65 6b 41 6e 64 52 65 61 64 28 70 46 69   seekAndRead(pFi
1d530 6c 65 2c 20 6f 66 66 73 65 74 2c 20 70 42 75 66  le, offset, pBuf
1d540 2c 20 61 6d 74 29 3b 0a 20 20 69 66 28 20 67 6f  , amt);.  if( go
1d550 74 3d 3d 61 6d 74 20 29 7b 0a 20 20 20 20 72 65  t==amt ){.    re
1d560 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1d570 20 20 7d 65 6c 73 65 20 69 66 28 20 67 6f 74 3c    }else if( got<
1d580 30 20 29 7b 0a 20 20 20 20 2f 2a 20 6c 61 73 74  0 ){.    /* last
1d590 45 72 72 6e 6f 20 73 65 74 20 62 79 20 73 65 65  Errno set by see
1d5a0 6b 41 6e 64 52 65 61 64 20 2a 2f 0a 20 20 20 20  kAndRead */.    
1d5b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
1d5c0 45 52 52 5f 52 45 41 44 3b 0a 20 20 7d 65 6c 73  ERR_READ;.  }els
1d5d0 65 7b 0a 20 20 20 20 2f 2a 20 55 6e 72 65 61 64  e{.    /* Unread
1d5e0 20 70 61 72 74 73 20 6f 66 20 74 68 65 20 62 75   parts of the bu
1d5f0 66 66 65 72 20 6d 75 73 74 20 62 65 20 7a 65 72  ffer must be zer
1d600 6f 2d 66 69 6c 6c 65 64 20 2a 2f 0a 20 20 20 20  o-filled */.    
1d610 6d 65 6d 73 65 74 28 26 28 28 63 68 61 72 2a 29  memset(&((char*)
1d620 70 42 75 66 29 5b 67 6f 74 5d 2c 20 30 2c 20 61  pBuf)[got], 0, a
1d630 6d 74 2d 67 6f 74 29 3b 0a 20 20 20 20 72 65 74  mt-got);.    ret
1d640 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
1d650 5f 53 48 4f 52 54 5f 52 45 41 44 3b 0a 20 20 7d  _SHORT_READ;.  }
1d660 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70  .}../*.** Attemp
1d670 74 20 74 6f 20 73 65 65 6b 20 74 68 65 20 66 69  t to seek the fi
1d680 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 20 70 61  le-descriptor pa
1d690 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72 73  ssed as the firs
1d6a0 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 0a 2a 2a  t argument to.**
1d6b0 20 61 62 73 6f 6c 75 74 65 20 6f 66 66 73 65 74   absolute offset
1d6c0 20 69 4f 66 66 2c 20 74 68 65 6e 20 61 74 74 65   iOff, then atte
1d6d0 6d 70 74 20 74 6f 20 77 72 69 74 65 20 6e 42 75  mpt to write nBu
1d6e0 66 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20  f bytes of data 
1d6f0 66 72 6f 6d 0a 2a 2a 20 70 42 75 66 20 74 6f 20  from.** pBuf to 
1d700 69 74 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  it. If an error 
1d710 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 2d  occurs, return -
1d720 31 20 61 6e 64 20 73 65 74 20 2a 70 69 45 72 72  1 and set *piErr
1d730 6e 6f 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 0a  no. Otherwise, .
1d740 2a 2a 20 72 65 74 75 72 6e 20 74 68 65 20 61 63  ** return the ac
1d750 74 75 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 62  tual number of b
1d760 79 74 65 73 20 77 72 69 74 74 65 6e 20 28 77 68  ytes written (wh
1d770 69 63 68 20 6d 61 79 20 62 65 20 6c 65 73 73 20  ich may be less 
1d780 74 68 61 6e 0a 2a 2a 20 6e 42 75 66 29 2e 0a 2a  than.** nBuf)..*
1d790 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 65  /.static int see
1d7a0 6b 41 6e 64 57 72 69 74 65 46 64 28 0a 20 20 69  kAndWriteFd(.  i
1d7b0 6e 74 20 66 64 2c 20 20 20 20 20 20 20 20 20 20  nt fd,          
1d7c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1d7d0 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f  * File descripto
1d7e0 72 20 74 6f 20 77 72 69 74 65 20 74 6f 20 2a 2f  r to write to */
1d7f0 0a 20 20 69 36 34 20 69 4f 66 66 2c 20 20 20 20  .  i64 iOff,    
1d800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d810 20 20 20 2f 2a 20 46 69 6c 65 20 6f 66 66 73 65     /* File offse
1d820 74 20 74 6f 20 62 65 67 69 6e 20 77 72 69 74 69  t to begin writi
1d830 6e 67 20 61 74 20 2a 2f 0a 20 20 63 6f 6e 73 74  ng at */.  const
1d840 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20   void *pBuf,    
1d850 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
1d860 70 79 20 64 61 74 61 20 66 72 6f 6d 20 74 68 69  py data from thi
1d870 73 20 62 75 66 66 65 72 20 74 6f 20 74 68 65 20  s buffer to the 
1d880 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 42  file */.  int nB
1d890 75 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  uf,             
1d8a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
1d8b0 65 20 6f 66 20 62 75 66 66 65 72 20 70 42 75 66  e of buffer pBuf
1d8c0 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 69   in bytes */.  i
1d8d0 6e 74 20 2a 70 69 45 72 72 6e 6f 20 20 20 20 20  nt *piErrno     
1d8e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1d8f0 2a 20 4f 55 54 3a 20 45 72 72 6f 72 20 6e 75 6d  * OUT: Error num
1d900 62 65 72 20 69 66 20 65 72 72 6f 72 20 6f 63 63  ber if error occ
1d910 75 72 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  urs */.){.  int 
1d920 72 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  rc = 0;         
1d930 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
1d940 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
1d950 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 2a 2f 0a   system call */.
1d960 0a 20 20 61 73 73 65 72 74 28 20 6e 42 75 66 3d  .  assert( nBuf=
1d970 3d 28 6e 42 75 66 26 30 78 31 66 66 66 66 29 20  =(nBuf&0x1ffff) 
1d980 29 3b 0a 20 20 61 73 73 65 72 74 28 20 66 64 3e  );.  assert( fd>
1d990 32 20 29 3b 0a 20 20 6e 42 75 66 20 26 3d 20 30  2 );.  nBuf &= 0
1d9a0 78 31 66 66 66 66 3b 0a 20 20 54 49 4d 45 52 5f  x1ffff;.  TIMER_
1d9b0 53 54 41 52 54 3b 0a 0a 23 69 66 20 64 65 66 69  START;..#if defi
1d9c0 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29 0a 20  ned(USE_PREAD). 
1d9d0 20 64 6f 7b 20 72 63 20 3d 20 6f 73 50 77 72 69   do{ rc = osPwri
1d9e0 74 65 28 66 64 2c 20 70 42 75 66 2c 20 6e 42 75  te(fd, pBuf, nBu
1d9f0 66 2c 20 69 4f 66 66 29 3b 20 7d 77 68 69 6c 65  f, iOff); }while
1da00 28 20 72 63 3c 30 20 26 26 20 65 72 72 6e 6f 3d  ( rc<0 && errno=
1da10 3d 45 49 4e 54 52 20 29 3b 0a 23 65 6c 69 66 20  =EINTR );.#elif 
1da20 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41  defined(USE_PREA
1da30 44 36 34 29 0a 20 20 64 6f 7b 20 72 63 20 3d 20  D64).  do{ rc = 
1da40 6f 73 50 77 72 69 74 65 36 34 28 66 64 2c 20 70  osPwrite64(fd, p
1da50 42 75 66 2c 20 6e 42 75 66 2c 20 69 4f 66 66 29  Buf, nBuf, iOff)
1da60 3b 7d 77 68 69 6c 65 28 20 72 63 3c 30 20 26 26  ;}while( rc<0 &&
1da70 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 29 3b 0a   errno==EINTR);.
1da80 23 65 6c 73 65 0a 20 20 64 6f 7b 0a 20 20 20 20  #else.  do{.    
1da90 69 36 34 20 69 53 65 65 6b 20 3d 20 6c 73 65 65  i64 iSeek = lsee
1daa0 6b 28 66 64 2c 20 69 4f 66 66 2c 20 53 45 45 4b  k(fd, iOff, SEEK
1dab0 5f 53 45 54 29 3b 0a 20 20 20 20 53 69 6d 75 6c  _SET);.    Simul
1dac0 61 74 65 49 4f 45 72 72 6f 72 28 20 69 53 65 65  ateIOError( iSee
1dad0 6b 2d 2d 20 29 3b 0a 0a 20 20 20 20 69 66 28 20  k-- );..    if( 
1dae0 69 53 65 65 6b 21 3d 69 4f 66 66 20 29 7b 0a 20  iSeek!=iOff ){. 
1daf0 20 20 20 20 20 69 66 28 20 70 69 45 72 72 6e 6f       if( piErrno
1db00 20 29 20 2a 70 69 45 72 72 6e 6f 20 3d 20 28 69   ) *piErrno = (i
1db10 53 65 65 6b 3d 3d 2d 31 20 3f 20 65 72 72 6e 6f  Seek==-1 ? errno
1db20 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74   : 0);.      ret
1db30 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20  urn -1;.    }.  
1db40 20 20 72 63 20 3d 20 6f 73 57 72 69 74 65 28 66    rc = osWrite(f
1db50 64 2c 20 70 42 75 66 2c 20 6e 42 75 66 29 3b 0a  d, pBuf, nBuf);.
1db60 20 20 7d 77 68 69 6c 65 28 20 72 63 3c 30 20 26    }while( rc<0 &
1db70 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29  & errno==EINTR )
1db80 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 54 49 4d 45  ;.#endif..  TIME
1db90 52 5f 45 4e 44 3b 0a 20 20 4f 53 54 52 41 43 45  R_END;.  OSTRACE
1dba0 28 28 22 57 52 49 54 45 20 20 20 25 2d 33 64 20  (("WRITE   %-3d 
1dbb0 25 35 64 20 25 37 6c 6c 64 20 25 6c 6c 75 5c 6e  %5d %7lld %llu\n
1dbc0 22 2c 20 66 64 2c 20 72 63 2c 20 69 4f 66 66 2c  ", fd, rc, iOff,
1dbd0 20 54 49 4d 45 52 5f 45 4c 41 50 53 45 44 29 29   TIMER_ELAPSED))
1dbe0 3b 0a 0a 20 20 69 66 28 20 72 63 3c 30 20 26 26  ;..  if( rc<0 &&
1dbf0 20 70 69 45 72 72 6e 6f 20 29 20 2a 70 69 45 72   piErrno ) *piEr
1dc00 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 72  rno = errno;.  r
1dc10 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
1dc20 0a 2a 2a 20 53 65 65 6b 20 74 6f 20 74 68 65 20  .** Seek to the 
1dc30 6f 66 66 73 65 74 20 69 6e 20 69 64 2d 3e 6f 66  offset in id->of
1dc40 66 73 65 74 20 74 68 65 6e 20 72 65 61 64 20 63  fset then read c
1dc50 6e 74 20 62 79 74 65 73 20 69 6e 74 6f 20 70 42  nt bytes into pB
1dc60 75 66 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  uf..** Return th
1dc70 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
1dc80 73 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64 2e  s actually read.
1dc90 20 20 55 70 64 61 74 65 20 74 68 65 20 6f 66 66    Update the off
1dca0 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 76  set..**.** To av
1dcb0 6f 69 64 20 73 74 6f 6d 70 69 6e 67 20 74 68 65  oid stomping the
1dcc0 20 65 72 72 6e 6f 20 76 61 6c 75 65 20 6f 6e 20   errno value on 
1dcd0 61 20 66 61 69 6c 65 64 20 77 72 69 74 65 20 74  a failed write t
1dce0 68 65 20 6c 61 73 74 45 72 72 6e 6f 20 76 61 6c  he lastErrno val
1dcf0 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 62 65 66  ue.** is set bef
1dd00 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a  ore returning..*
1dd10 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 65  /.static int see
1dd20 6b 41 6e 64 57 72 69 74 65 28 75 6e 69 78 46 69  kAndWrite(unixFi
1dd30 6c 65 20 2a 69 64 2c 20 69 36 34 20 6f 66 66 73  le *id, i64 offs
1dd40 65 74 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  et, const void *
1dd50 70 42 75 66 2c 20 69 6e 74 20 63 6e 74 29 7b 0a  pBuf, int cnt){.
1dd60 20 20 72 65 74 75 72 6e 20 73 65 65 6b 41 6e 64    return seekAnd
1dd70 57 72 69 74 65 46 64 28 69 64 2d 3e 68 2c 20 6f  WriteFd(id->h, o
1dd80 66 66 73 65 74 2c 20 70 42 75 66 2c 20 63 6e 74  ffset, pBuf, cnt
1dd90 2c 20 26 69 64 2d 3e 6c 61 73 74 45 72 72 6e 6f  , &id->lastErrno
1dda0 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  );.}.../*.** Wri
1ddb0 74 65 20 64 61 74 61 20 66 72 6f 6d 20 61 20 62  te data from a b
1ddc0 75 66 66 65 72 20 69 6e 74 6f 20 61 20 66 69 6c  uffer into a fil
1ddd0 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  e.  Return SQLIT
1dde0 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 0a  E_OK on success.
1ddf0 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72  ** or some other
1de00 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 6e 20 66   error code on f
1de10 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69  ailure..*/.stati
1de20 63 20 69 6e 74 20 75 6e 69 78 57 72 69 74 65 28  c int unixWrite(
1de30 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
1de40 2a 69 64 2c 20 0a 20 20 63 6f 6e 73 74 20 76 6f  *id, .  const vo
1de50 69 64 20 2a 70 42 75 66 2c 20 0a 20 20 69 6e 74  id *pBuf, .  int
1de60 20 61 6d 74 2c 0a 20 20 73 71 6c 69 74 65 33 5f   amt,.  sqlite3_
1de70 69 6e 74 36 34 20 6f 66 66 73 65 74 20 0a 29 7b  int64 offset .){
1de80 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
1de90 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
1dea0 69 64 3b 0a 20 20 69 6e 74 20 77 72 6f 74 65 20  id;.  int wrote 
1deb0 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 69  = 0;.  assert( i
1dec0 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  d );.  assert( a
1ded0 6d 74 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  mt>0 );..  /* If
1dee0 20 74 68 69 73 20 69 73 20 61 20 64 61 74 61 62   this is a datab
1def0 61 73 65 20 66 69 6c 65 20 28 6e 6f 74 20 61 20  ase file (not a 
1df00 6a 6f 75 72 6e 61 6c 2c 20 6d 61 73 74 65 72 2d  journal, master-
1df10 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 65 6d 70 0a  journal or temp.
1df20 20 20 2a 2a 20 66 69 6c 65 29 2c 20 74 68 65 20    ** file), the 
1df30 62 79 74 65 73 20 69 6e 20 74 68 65 20 6c 6f 63  bytes in the loc
1df40 6b 69 6e 67 20 72 61 6e 67 65 20 73 68 6f 75 6c  king range shoul
1df50 64 20 6e 65 76 65 72 20 62 65 20 72 65 61 64 20  d never be read 
1df60 6f 72 20 77 72 69 74 74 65 6e 2e 20 2a 2f 0a 23  or written. */.#
1df70 69 66 20 30 0a 20 20 61 73 73 65 72 74 28 20 70  if 0.  assert( p
1df80 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64 3d 3d 30  File->pUnused==0
1df90 0a 20 20 20 20 20 20 20 7c 7c 20 6f 66 66 73 65  .       || offse
1dfa0 74 3e 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 2b  t>=PENDING_BYTE+
1dfb0 35 31 32 0a 20 20 20 20 20 20 20 7c 7c 20 6f 66  512.       || of
1dfc0 66 73 65 74 2b 61 6d 74 3c 3d 50 45 4e 44 49 4e  fset+amt<=PENDIN
1dfd0 47 5f 42 59 54 45 20 0a 20 20 29 3b 0a 23 65 6e  G_BYTE .  );.#en
1dfe0 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
1dff0 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 49 66  TE_DEBUG.  /* If
1e000 20 77 65 20 61 72 65 20 64 6f 69 6e 67 20 61 20   we are doing a 
1e010 6e 6f 72 6d 61 6c 20 77 72 69 74 65 20 74 6f 20  normal write to 
1e020 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  a database file 
1e030 28 61 73 20 6f 70 70 6f 73 65 64 20 74 6f 0a 20  (as opposed to. 
1e040 20 2a 2a 20 64 6f 69 6e 67 20 61 20 68 6f 74 2d   ** doing a hot-
1e050 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b  journal rollback
1e060 20 6f 72 20 61 20 77 72 69 74 65 20 74 6f 20 73   or a write to s
1e070 6f 6d 65 20 66 69 6c 65 20 6f 74 68 65 72 20 74  ome file other t
1e080 68 61 6e 20 61 0a 20 20 2a 2a 20 6e 6f 72 6d 61  han a.  ** norma
1e090 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 29  l database file)
1e0a0 20 74 68 65 6e 20 72 65 63 6f 72 64 20 74 68 65   then record the
1e0b0 20 66 61 63 74 20 74 68 61 74 20 74 68 65 20 64   fact that the d
1e0c0 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 68 61 73  atabase.  ** has
1e0d0 20 63 68 61 6e 67 65 64 2e 20 20 49 66 20 74 68   changed.  If th
1e0e0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f  e transaction co
1e0f0 75 6e 74 65 72 20 69 73 20 6d 6f 64 69 66 69 65  unter is modifie
1e100 64 2c 20 72 65 63 6f 72 64 20 74 68 61 74 0a 20  d, record that. 
1e110 20 2a 2a 20 66 61 63 74 20 74 6f 6f 2e 0a 20 20   ** fact too..  
1e120 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
1e130 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 29 7b  inNormalWrite ){
1e140 0a 20 20 20 20 70 46 69 6c 65 2d 3e 64 62 55 70  .    pFile->dbUp
1e150 64 61 74 65 20 3d 20 31 3b 20 20 2f 2a 20 54 68  date = 1;  /* Th
1e160 65 20 64 61 74 61 62 61 73 65 20 68 61 73 20 62  e database has b
1e170 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 2a 2f 0a  een modified */.
1e180 20 20 20 20 69 66 28 20 6f 66 66 73 65 74 3c 3d      if( offset<=
1e190 32 34 20 26 26 20 6f 66 66 73 65 74 2b 61 6d 74  24 && offset+amt
1e1a0 3e 3d 32 37 20 29 7b 0a 20 20 20 20 20 20 69 6e  >=27 ){.      in
1e1b0 74 20 72 63 3b 0a 20 20 20 20 20 20 63 68 61 72  t rc;.      char
1e1c0 20 6f 6c 64 43 6e 74 72 5b 34 5d 3b 0a 20 20 20   oldCntr[4];.   
1e1d0 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
1e1e0 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20  orBenign(1);.   
1e1f0 20 20 20 72 63 20 3d 20 73 65 65 6b 41 6e 64 52     rc = seekAndR
1e200 65 61 64 28 70 46 69 6c 65 2c 20 32 34 2c 20 6f  ead(pFile, 24, o
1e210 6c 64 43 6e 74 72 2c 20 34 29 3b 0a 20 20 20 20  ldCntr, 4);.    
1e220 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
1e230 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20  rBenign(0);.    
1e240 20 20 69 66 28 20 72 63 21 3d 34 20 7c 7c 20 6d    if( rc!=4 || m
1e250 65 6d 63 6d 70 28 6f 6c 64 43 6e 74 72 2c 20 26  emcmp(oldCntr, &
1e260 28 28 63 68 61 72 2a 29 70 42 75 66 29 5b 32 34  ((char*)pBuf)[24
1e270 2d 6f 66 66 73 65 74 5d 2c 20 34 29 21 3d 30 20  -offset], 4)!=0 
1e280 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65  ){.        pFile
1e290 2d 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 20  ->transCntrChng 
1e2a0 3d 20 31 3b 20 20 2f 2a 20 54 68 65 20 74 72 61  = 1;  /* The tra
1e2b0 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72  nsaction counter
1e2c0 20 68 61 73 20 63 68 61 6e 67 65 64 20 2a 2f 0a   has changed */.
1e2d0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1e2e0 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51  }.#endif..#if SQ
1e2f0 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
1e300 5a 45 3e 30 0a 20 20 2f 2a 20 44 65 61 6c 20 77  ZE>0.  /* Deal w
1e310 69 74 68 20 61 73 20 6d 75 63 68 20 6f 66 20 74  ith as much of t
1e320 68 69 73 20 77 72 69 74 65 20 72 65 71 75 65 73  his write reques
1e330 74 20 61 73 20 70 6f 73 73 69 62 6c 65 20 62 79  t as possible by
1e340 20 74 72 61 6e 73 66 65 72 69 6e 67 0a 20 20 2a   transfering.  *
1e350 2a 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20  * data from the 
1e360 6d 65 6d 6f 72 79 20 6d 61 70 70 69 6e 67 20 75  memory mapping u
1e370 73 69 6e 67 20 6d 65 6d 63 70 79 28 29 2e 20 20  sing memcpy().  
1e380 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c  */.  if( offset<
1e390 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20  pFile->mmapSize 
1e3a0 29 7b 0a 20 20 20 20 69 66 28 20 6f 66 66 73 65  ){.    if( offse
1e3b0 74 2b 61 6d 74 20 3c 3d 20 70 46 69 6c 65 2d 3e  t+amt <= pFile->
1e3c0 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20  mmapSize ){.    
1e3d0 20 20 6d 65 6d 63 70 79 28 26 28 28 75 38 20 2a    memcpy(&((u8 *
1e3e0 29 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67  )(pFile->pMapReg
1e3f0 69 6f 6e 29 29 5b 6f 66 66 73 65 74 5d 2c 20 70  ion))[offset], p
1e400 42 75 66 2c 20 61 6d 74 29 3b 0a 20 20 20 20 20  Buf, amt);.     
1e410 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1e420 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  K;.    }else{.  
1e430 20 20 20 20 69 6e 74 20 6e 43 6f 70 79 20 3d 20      int nCopy = 
1e440 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20  pFile->mmapSize 
1e450 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  - offset;.      
1e460 6d 65 6d 63 70 79 28 26 28 28 75 38 20 2a 29 28  memcpy(&((u8 *)(
1e470 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f  pFile->pMapRegio
1e480 6e 29 29 5b 6f 66 66 73 65 74 5d 2c 20 70 42 75  n))[offset], pBu
1e490 66 2c 20 6e 43 6f 70 79 29 3b 0a 20 20 20 20 20  f, nCopy);.     
1e4a0 20 70 42 75 66 20 3d 20 26 28 28 75 38 20 2a 29   pBuf = &((u8 *)
1e4b0 70 42 75 66 29 5b 6e 43 6f 70 79 5d 3b 0a 20 20  pBuf)[nCopy];.  
1e4c0 20 20 20 20 61 6d 74 20 2d 3d 20 6e 43 6f 70 79      amt -= nCopy
1e4d0 3b 0a 20 20 20 20 20 20 6f 66 66 73 65 74 20 2b  ;.      offset +
1e4e0 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20 7d 0a 20  = nCopy;.    }. 
1e4f0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 77 68 69   }.#endif..  whi
1e500 6c 65 28 20 61 6d 74 3e 30 20 26 26 20 28 77 72  le( amt>0 && (wr
1e510 6f 74 65 20 3d 20 73 65 65 6b 41 6e 64 57 72 69  ote = seekAndWri
1e520 74 65 28 70 46 69 6c 65 2c 20 6f 66 66 73 65 74  te(pFile, offset
1e530 2c 20 70 42 75 66 2c 20 61 6d 74 29 29 3e 30 20  , pBuf, amt))>0 
1e540 29 7b 0a 20 20 20 20 61 6d 74 20 2d 3d 20 77 72  ){.    amt -= wr
1e550 6f 74 65 3b 0a 20 20 20 20 6f 66 66 73 65 74 20  ote;.    offset 
1e560 2b 3d 20 77 72 6f 74 65 3b 0a 20 20 20 20 70 42  += wrote;.    pB
1e570 75 66 20 3d 20 26 28 28 63 68 61 72 2a 29 70 42  uf = &((char*)pB
1e580 75 66 29 5b 77 72 6f 74 65 5d 3b 0a 20 20 7d 0a  uf)[wrote];.  }.
1e590 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
1e5a0 72 28 28 20 77 72 6f 74 65 3d 28 2d 31 29 2c 20  r(( wrote=(-1), 
1e5b0 61 6d 74 3d 31 20 29 29 3b 0a 20 20 53 69 6d 75  amt=1 ));.  Simu
1e5c0 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f  lateDiskfullErro
1e5d0 72 28 28 20 77 72 6f 74 65 3d 30 2c 20 61 6d 74  r(( wrote=0, amt
1e5e0 3d 31 20 29 29 3b 0a 0a 20 20 69 66 28 20 61 6d  =1 ));..  if( am
1e5f0 74 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20 77  t>0 ){.    if( w
1e600 72 6f 74 65 3c 30 20 26 26 20 70 46 69 6c 65 2d  rote<0 && pFile-
1e610 3e 6c 61 73 74 45 72 72 6e 6f 21 3d 45 4e 4f 53  >lastErrno!=ENOS
1e620 50 43 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 6c  PC ){.      /* l
1e630 61 73 74 45 72 72 6e 6f 20 73 65 74 20 62 79 20  astErrno set by 
1e640 73 65 65 6b 41 6e 64 57 72 69 74 65 20 2a 2f 0a  seekAndWrite */.
1e650 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1e660 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 3b  ITE_IOERR_WRITE;
1e670 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1e680 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1e690 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  FULL;.    }.  }.
1e6a0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1e6b0 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  _OK;.}..#ifdef S
1e6c0 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a  QLITE_TEST./*.**
1e6d0 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65   Count the numbe
1e6e0 72 20 6f 66 20 66 75 6c 6c 73 79 6e 63 73 20 61  r of fullsyncs a
1e6f0 6e 64 20 6e 6f 72 6d 61 6c 20 73 79 6e 63 73 2e  nd normal syncs.
1e700 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20 74    This is used t
1e710 6f 20 74 65 73 74 0a 2a 2a 20 74 68 61 74 20 73  o test.** that s
1e720 79 6e 63 73 20 61 6e 64 20 66 75 6c 6c 73 79 6e  yncs and fullsyn
1e730 63 73 20 61 72 65 20 6f 63 63 75 72 72 69 6e 67  cs are occurring
1e740 20 61 74 20 74 68 65 20 72 69 67 68 74 20 74 69   at the right ti
1e750 6d 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  mes..*/.int sqli
1e760 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 20 3d  te3_sync_count =
1e770 20 30 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f   0;.int sqlite3_
1e780 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 20 3d  fullsync_count =
1e790 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a   0;.#endif../*.*
1e7a0 2a 20 57 65 20 64 6f 20 6e 6f 74 20 74 72 75 73  * We do not trus
1e7b0 74 20 73 79 73 74 65 6d 73 20 74 6f 20 70 72 6f  t systems to pro
1e7c0 76 69 64 65 20 61 20 77 6f 72 6b 69 6e 67 20 66  vide a working f
1e7d0 64 61 74 61 73 79 6e 63 28 29 2e 20 20 53 6f 6d  datasync().  Som
1e7e0 65 20 64 6f 2e 0a 2a 2a 20 4f 74 68 65 72 73 20  e do..** Others 
1e7f0 64 6f 20 6e 6f 2e 20 20 54 6f 20 62 65 20 73 61  do no.  To be sa
1e800 66 65 2c 20 77 65 20 77 69 6c 6c 20 73 74 69 63  fe, we will stic
1e810 6b 20 77 69 74 68 20 74 68 65 20 28 73 6c 69 67  k with the (slig
1e820 68 74 6c 79 20 73 6c 6f 77 65 72 29 0a 2a 2a 20  htly slower).** 
1e830 66 73 79 6e 63 28 29 2e 20 49 66 20 79 6f 75 20  fsync(). If you 
1e840 6b 6e 6f 77 20 74 68 61 74 20 79 6f 75 72 20 73  know that your s
1e850 79 73 74 65 6d 20 64 6f 65 73 20 73 75 70 70 6f  ystem does suppo
1e860 72 74 20 66 64 61 74 61 73 79 6e 63 28 29 20 63  rt fdatasync() c
1e870 6f 72 72 65 63 74 6c 79 2c 0a 2a 2a 20 74 68 65  orrectly,.** the
1e880 6e 20 73 69 6d 70 6c 79 20 63 6f 6d 70 69 6c 65  n simply compile
1e890 20 77 69 74 68 20 2d 44 66 64 61 74 61 73 79 6e   with -Dfdatasyn
1e8a0 63 3d 66 64 61 74 61 73 79 6e 63 0a 2a 2f 0a 23  c=fdatasync.*/.#
1e8b0 69 66 20 21 64 65 66 69 6e 65 64 28 66 64 61 74  if !defined(fdat
1e8c0 61 73 79 6e 63 29 0a 23 20 64 65 66 69 6e 65 20  async).# define 
1e8d0 66 64 61 74 61 73 79 6e 63 20 66 73 79 6e 63 0a  fdatasync fsync.
1e8e0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65  #endif../*.** De
1e8f0 66 69 6e 65 20 48 41 56 45 5f 46 55 4c 4c 46 53  fine HAVE_FULLFS
1e900 59 4e 43 20 74 6f 20 30 20 6f 72 20 31 20 64 65  YNC to 0 or 1 de
1e910 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74 68  pending on wheth
1e920 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a 20 74 68 65  er or not.** the
1e930 20 46 5f 46 55 4c 4c 46 53 59 4e 43 20 6d 61 63   F_FULLFSYNC mac
1e940 72 6f 20 69 73 20 64 65 66 69 6e 65 64 2e 20 20  ro is defined.  
1e950 46 5f 46 55 4c 4c 46 53 59 4e 43 20 69 73 20 63  F_FULLFSYNC is c
1e960 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 6f 6e 6c 79  urrently.** only
1e970 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 4d 61   available on Ma
1e980 63 20 4f 53 20 58 2e 20 20 42 75 74 20 74 68 61  c OS X.  But tha
1e990 74 20 63 6f 75 6c 64 20 63 68 61 6e 67 65 2e 0a  t could change..
1e9a0 2a 2f 0a 23 69 66 64 65 66 20 46 5f 46 55 4c 4c  */.#ifdef F_FULL
1e9b0 46 53 59 4e 43 0a 23 20 64 65 66 69 6e 65 20 48  FSYNC.# define H
1e9c0 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 31 0a  AVE_FULLFSYNC 1.
1e9d0 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 48  #else.# define H
1e9e0 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 30 0a  AVE_FULLFSYNC 0.
1e9f0 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53  #endif..#ifdef S
1ea00 51 4c 49 54 45 5f 55 53 45 5f 52 45 51 55 45 53  QLITE_USE_REQUES
1ea10 54 5f 46 55 4c 4c 46 53 59 4e 43 0a 23 69 6d 70  T_FULLFSYNC.#imp
1ea20 6f 72 74 20 3c 6e 6f 74 69 66 79 2e 68 3e 0a 23  ort <notify.h>.#
1ea30 69 6d 70 6f 72 74 20 3c 6c 69 62 6b 65 72 6e 2f  import <libkern/
1ea40 4f 53 41 74 6f 6d 69 63 2e 68 3e 0a 73 74 61 74  OSAtomic.h>.stat
1ea50 69 63 20 4f 53 53 70 69 6e 4c 6f 63 6b 20 6e 6f  ic OSSpinLock no
1ea60 74 69 66 79 5f 6c 6f 63 6b 20 3d 20 30 3b 0a 23  tify_lock = 0;.#
1ea70 64 65 66 69 6e 65 20 52 45 51 55 45 53 54 5f 46  define REQUEST_F
1ea80 55 4c 4c 53 59 4e 43 5f 4e 4f 54 49 46 49 43 41  ULLSYNC_NOTIFICA
1ea90 54 49 4f 4e 20 20 20 20 22 63 6f 6d 2e 61 70 70  TION    "com.app
1eaa0 6c 65 2e 72 65 71 73 79 6e 63 22 0a 23 65 6e 64  le.reqsync".#end
1eab0 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 73  if../*.** The fs
1eac0 79 6e 63 28 29 20 73 79 73 74 65 6d 20 63 61 6c  ync() system cal
1ead0 6c 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20  l does not work 
1eae0 61 73 20 61 64 76 65 72 74 69 73 65 64 20 6f 6e  as advertised on
1eaf0 20 6d 61 6e 79 0a 2a 2a 20 75 6e 69 78 20 73 79   many.** unix sy
1eb00 73 74 65 6d 73 2e 20 20 54 68 65 20 66 6f 6c 6c  stems.  The foll
1eb10 6f 77 69 6e 67 20 70 72 6f 63 65 64 75 72 65 20  owing procedure 
1eb20 69 73 20 61 6e 20 61 74 74 65 6d 70 74 20 74 6f  is an attempt to
1eb30 20 6d 61 6b 65 0a 2a 2a 20 69 74 20 77 6f 72 6b   make.** it work
1eb40 20 62 65 74 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54   better..**.** T
1eb50 68 65 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e  he SQLITE_NO_SYN
1eb60 43 20 6d 61 63 72 6f 20 64 69 73 61 62 6c 65 73  C macro disables
1eb70 20 61 6c 6c 20 66 73 79 6e 63 28 29 73 2e 20 20   all fsync()s.  
1eb80 54 68 69 73 20 69 73 20 75 73 65 66 75 6c 0a 2a  This is useful.*
1eb90 2a 20 66 6f 72 20 74 65 73 74 69 6e 67 20 77 68  * for testing wh
1eba0 65 6e 20 77 65 20 77 61 6e 74 20 74 6f 20 72 75  en we want to ru
1ebb0 6e 20 74 68 72 6f 75 67 68 20 74 68 65 20 74 65  n through the te
1ebc0 73 74 20 73 75 69 74 65 20 71 75 69 63 6b 6c 79  st suite quickly
1ebd0 2e 0a 2a 2a 20 59 6f 75 20 61 72 65 20 73 74 72  ..** You are str
1ebe0 6f 6e 67 6c 79 20 61 64 76 69 73 65 64 20 2a 6e  ongly advised *n
1ebf0 6f 74 2a 20 74 6f 20 64 65 70 6c 6f 79 20 77 69  ot* to deploy wi
1ec00 74 68 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e  th SQLITE_NO_SYN
1ec10 43 0a 2a 2a 20 65 6e 61 62 6c 65 64 2c 20 68 6f  C.** enabled, ho
1ec20 77 65 76 65 72 2c 20 73 69 6e 63 65 20 77 69 74  wever, since wit
1ec30 68 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43  h SQLITE_NO_SYNC
1ec40 20 65 6e 61 62 6c 65 64 2c 20 61 6e 20 4f 53 20   enabled, an OS 
1ec50 63 72 61 73 68 0a 2a 2a 20 6f 72 20 70 6f 77 65  crash.** or powe
1ec60 72 20 66 61 69 6c 75 72 65 20 77 69 6c 6c 20 6c  r failure will l
1ec70 69 6b 65 6c 79 20 63 6f 72 72 75 70 74 20 74 68  ikely corrupt th
1ec80 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
1ec90 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 73 65  .**.** SQLite se
1eca0 74 73 20 74 68 65 20 64 61 74 61 4f 6e 6c 79 20  ts the dataOnly 
1ecb0 66 6c 61 67 20 69 66 20 74 68 65 20 73 69 7a 65  flag if the size
1ecc0 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   of the file is 
1ecd0 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 20 54 68  unchanged..** Th
1ece0 65 20 69 64 65 61 20 62 65 68 69 6e 64 20 64 61  e idea behind da
1ecf0 74 61 4f 6e 6c 79 20 69 73 20 74 68 61 74 20 69  taOnly is that i
1ed00 74 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 77 72  t should only wr
1ed10 69 74 65 20 74 68 65 20 66 69 6c 65 20 63 6f 6e  ite the file con
1ed20 74 65 6e 74 0a 2a 2a 20 74 6f 20 64 69 73 6b 2c  tent.** to disk,
1ed30 20 6e 6f 74 20 74 68 65 20 69 6e 6f 64 65 2e 20   not the inode. 
1ed40 20 57 65 20 6f 6e 6c 79 20 73 65 74 20 64 61 74   We only set dat
1ed50 61 4f 6e 6c 79 20 69 66 20 74 68 65 20 66 69 6c  aOnly if the fil
1ed60 65 20 73 69 7a 65 20 69 73 20 0a 2a 2a 20 75 6e  e size is .** un
1ed70 63 68 61 6e 67 65 64 20 73 69 6e 63 65 20 74 68  changed since th
1ed80 65 20 66 69 6c 65 20 73 69 7a 65 20 69 73 20 70  e file size is p
1ed90 61 72 74 20 6f 66 20 74 68 65 20 69 6e 6f 64 65  art of the inode
1eda0 2e 20 20 48 6f 77 65 76 65 72 2c 20 0a 2a 2a 20  .  However, .** 
1edb0 54 65 64 20 54 73 27 6f 20 74 65 6c 6c 73 20 75  Ted Ts'o tells u
1edc0 73 20 74 68 61 74 20 66 64 61 74 61 73 79 6e 63  s that fdatasync
1edd0 28 29 20 77 69 6c 6c 20 61 6c 73 6f 20 77 72 69  () will also wri
1ede0 74 65 20 74 68 65 20 69 6e 6f 64 65 20 69 66 20  te the inode if 
1edf0 74 68 65 0a 2a 2a 20 66 69 6c 65 20 73 69 7a 65  the.** file size
1ee00 20 68 61 73 20 63 68 61 6e 67 65 64 2e 20 20 54   has changed.  T
1ee10 68 65 20 6f 6e 6c 79 20 72 65 61 6c 20 64 69 66  he only real dif
1ee20 66 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20  ference between 
1ee30 66 64 61 74 61 73 79 6e 63 28 29 0a 2a 2a 20 61  fdatasync().** a
1ee40 6e 64 20 66 73 79 6e 63 28 29 2c 20 54 65 64 20  nd fsync(), Ted 
1ee50 74 65 6c 6c 73 20 75 73 2c 20 69 73 20 74 68 61  tells us, is tha
1ee60 74 20 66 64 61 74 61 73 79 6e 63 28 29 20 77 69  t fdatasync() wi
1ee70 6c 6c 20 6e 6f 74 20 66 6c 75 73 68 20 74 68 65  ll not flush the
1ee80 0a 2a 2a 20 69 6e 6f 64 65 20 69 66 20 74 68 65  .** inode if the
1ee90 20 6d 74 69 6d 65 20 6f 72 20 6f 77 6e 65 72 20   mtime or owner 
1eea0 6f 72 20 6f 74 68 65 72 20 69 6e 6f 64 65 20 61  or other inode a
1eeb0 74 74 72 69 62 75 74 65 73 20 68 61 76 65 20 63  ttributes have c
1eec0 68 61 6e 67 65 64 2e 0a 2a 2a 20 57 65 20 6f 6e  hanged..** We on
1eed0 6c 79 20 63 61 72 65 20 61 62 6f 75 74 20 74 68  ly care about th
1eee0 65 20 66 69 6c 65 20 73 69 7a 65 2c 20 6e 6f 74  e file size, not
1eef0 20 74 68 65 20 6f 74 68 65 72 20 66 69 6c 65 20   the other file 
1ef00 61 74 74 72 69 62 75 74 65 73 2c 20 73 6f 0a 2a  attributes, so.*
1ef10 2a 20 61 73 20 66 61 72 20 61 73 20 53 51 4c 69  * as far as SQLi
1ef20 74 65 20 69 73 20 63 6f 6e 63 65 72 6e 65 64 2c  te is concerned,
1ef30 20 61 6e 20 66 64 61 74 61 73 79 6e 63 28 29 20   an fdatasync() 
1ef40 69 73 20 61 6c 77 61 79 73 20 61 64 65 71 75 61  is always adequa
1ef50 74 65 2e 0a 2a 2a 20 53 6f 2c 20 77 65 20 61 6c  te..** So, we al
1ef60 77 61 79 73 20 75 73 65 20 66 64 61 74 61 73 79  ways use fdatasy
1ef70 6e 63 28 29 20 69 66 20 69 74 20 69 73 20 61 76  nc() if it is av
1ef80 61 69 6c 61 62 6c 65 2c 20 72 65 67 61 72 64 6c  ailable, regardl
1ef90 65 73 73 20 6f 66 0a 2a 2a 20 74 68 65 20 76 61  ess of.** the va
1efa0 6c 75 65 20 6f 66 20 74 68 65 20 64 61 74 61 4f  lue of the dataO
1efb0 6e 6c 79 20 66 6c 61 67 2e 0a 2a 2f 0a 73 74 61  nly flag..*/.sta
1efc0 74 69 63 20 69 6e 74 20 66 75 6c 6c 5f 66 73 79  tic int full_fsy
1efd0 6e 63 28 69 6e 74 20 66 64 2c 20 69 6e 74 20 66  nc(int fd, int f
1efe0 75 6c 6c 53 79 6e 63 2c 20 69 6e 74 20 64 61 74  ullSync, int dat
1eff0 61 4f 6e 6c 79 29 7b 0a 20 20 69 6e 74 20 72 63  aOnly){.  int rc
1f000 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  ;..  /* The foll
1f010 6f 77 69 6e 67 20 22 69 66 64 65 66 2f 65 6c 69  owing "ifdef/eli
1f020 66 2f 65 6c 73 65 2f 22 20 62 6c 6f 63 6b 20 68  f/else/" block h
1f030 61 73 20 74 68 65 20 73 61 6d 65 20 73 74 72 75  as the same stru
1f040 63 74 75 72 65 20 61 73 0a 20 20 2a 2a 20 74 68  cture as.  ** th
1f050 65 20 6f 6e 65 20 62 65 6c 6f 77 2e 20 49 74 20  e one below. It 
1f060 69 73 20 72 65 70 6c 69 63 61 74 65 64 20 68 65  is replicated he
1f070 72 65 20 73 6f 6c 65 6c 79 20 74 6f 20 61 76 6f  re solely to avo
1f080 69 64 20 63 6c 75 74 74 65 72 69 6e 67 20 0a 20  id cluttering . 
1f090 20 2a 2a 20 75 70 20 74 68 65 20 72 65 61 6c 20   ** up the real 
1f0a0 63 6f 64 65 20 77 69 74 68 20 74 68 65 20 55 4e  code with the UN
1f0b0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 29  USED_PARAMETER()
1f0c0 20 6d 61 63 72 6f 73 2e 0a 20 20 2a 2f 0a 23 69   macros..  */.#i
1f0d0 66 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53  fdef SQLITE_NO_S
1f0e0 59 4e 43 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  YNC.  UNUSED_PAR
1f0f0 41 4d 45 54 45 52 28 66 64 29 3b 0a 20 20 55 4e  AMETER(fd);.  UN
1f100 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66  USED_PARAMETER(f
1f110 75 6c 6c 53 79 6e 63 29 3b 0a 20 20 55 4e 55 53  ullSync);.  UNUS
1f120 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64 61 74  ED_PARAMETER(dat
1f130 61 4f 6e 6c 79 29 3b 0a 23 65 6c 69 66 20 48 41  aOnly);.#elif HA
1f140 56 45 5f 46 55 4c 4c 46 53 59 4e 43 0a 20 20 55  VE_FULLFSYNC.  U
1f150 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
1f160 64 61 74 61 4f 6e 6c 79 29 3b 0a 23 65 6c 73 65  dataOnly);.#else
1f170 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
1f180 54 45 52 28 66 75 6c 6c 53 79 6e 63 29 3b 0a 20  TER(fullSync);. 
1f190 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
1f1a0 52 28 64 61 74 61 4f 6e 6c 79 29 3b 0a 23 65 6e  R(dataOnly);.#en
1f1b0 64 69 66 0a 0a 20 20 2f 2a 20 52 65 63 6f 72 64  dif..  /* Record
1f1c0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74   the number of t
1f1d0 69 6d 65 73 20 74 68 61 74 20 77 65 20 64 6f 20  imes that we do 
1f1e0 61 20 6e 6f 72 6d 61 6c 20 66 73 79 6e 63 28 29  a normal fsync()
1f1f0 20 61 6e 64 20 0a 20 20 2a 2a 20 46 55 4c 4c 53   and .  ** FULLS
1f200 59 4e 43 2e 20 20 54 68 69 73 20 69 73 20 75 73  YNC.  This is us
1f210 65 64 20 64 75 72 69 6e 67 20 74 65 73 74 69 6e  ed during testin
1f220 67 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74  g to verify that
1f230 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 0a   this procedure.
1f240 20 20 2a 2a 20 67 65 74 73 20 63 61 6c 6c 65 64    ** gets called
1f250 20 77 69 74 68 20 74 68 65 20 63 6f 72 72 65 63   with the correc
1f260 74 20 61 72 67 75 6d 65 6e 74 73 2e 0a 20 20 2a  t arguments..  *
1f270 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
1f280 54 45 53 54 0a 20 20 69 66 28 20 66 75 6c 6c 53  TEST.  if( fullS
1f290 79 6e 63 20 29 20 73 71 6c 69 74 65 33 5f 66 75  ync ) sqlite3_fu
1f2a0 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a  llsync_count++;.
1f2b0 20 20 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63    sqlite3_sync_c
1f2c0 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a  ount++;.#endif..
1f2d0 20 20 2f 2a 20 49 66 20 77 65 20 63 6f 6d 70 69    /* If we compi
1f2e0 6c 65 64 20 77 69 74 68 20 74 68 65 20 53 51 4c  led with the SQL
1f2f0 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 66 6c 61 67  ITE_NO_SYNC flag
1f300 2c 20 74 68 65 6e 20 73 79 6e 63 69 6e 67 20 69  , then syncing i
1f310 73 20 61 0a 20 20 2a 2a 20 6e 6f 2d 6f 70 0a 20  s a.  ** no-op. 
1f320 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
1f330 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20 72 63 20 3d  E_NO_SYNC.  rc =
1f340 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6c 69   SQLITE_OK;.#eli
1f350 66 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43  f HAVE_FULLFSYNC
1f360 0a 20 20 69 66 28 20 66 75 6c 6c 53 79 6e 63 20  .  if( fullSync 
1f370 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
1f380 5f 55 53 45 5f 52 45 51 55 45 53 54 5f 46 55 4c  _USE_REQUEST_FUL
1f390 4c 46 53 59 4e 43 0a 20 20 20 20 72 63 20 3d 20  LFSYNC.    rc = 
1f3a0 6f 73 46 73 79 6e 63 28 66 64 29 3b 0a 20 20 20  osFsync(fd);.   
1f3b0 20 69 66 20 28 21 72 63 29 20 7b 0a 20 20 20 20   if (!rc) {.    
1f3c0 20 20 4f 53 53 70 69 6e 4c 6f 63 6b 4c 6f 63 6b    OSSpinLockLock
1f3d0 28 26 6e 6f 74 69 66 79 5f 6c 6f 63 6b 29 3b 0a  (&notify_lock);.
1f3e0 20 20 20 20 20 20 72 63 20 3d 20 6e 6f 74 69 66        rc = notif
1f3f0 79 5f 70 6f 73 74 28 52 45 51 55 45 53 54 5f 46  y_post(REQUEST_F
1f400 55 4c 4c 53 59 4e 43 5f 4e 4f 54 49 46 49 43 41  ULLSYNC_NOTIFICA
1f410 54 49 4f 4e 29 3b 0a 20 20 20 20 20 20 4f 53 53  TION);.      OSS
1f420 70 69 6e 4c 6f 63 6b 55 6e 6c 6f 63 6b 28 26 6e  pinLockUnlock(&n
1f430 6f 74 69 66 79 5f 6c 6f 63 6b 29 3b 0a 20 20 20  otify_lock);.   
1f440 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 72 63 20   }.#else.    rc 
1f450 3d 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20 46 5f  = osFcntl(fd, F_
1f460 46 55 4c 4c 46 53 59 4e 43 2c 20 30 29 3b 0a 23  FULLFSYNC, 0);.#
1f470 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20  endif.  }else{. 
1f480 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 7d 0a 20     rc = 1;.  }. 
1f490 20 2f 2a 20 49 66 20 74 68 65 20 46 55 4c 4c 46   /* If the FULLF
1f4a0 53 59 4e 43 20 66 61 69 6c 65 64 2c 20 66 61 6c  SYNC failed, fal
1f4b0 6c 20 62 61 63 6b 20 74 6f 20 61 74 74 65 6d 70  l back to attemp
1f4c0 74 69 6e 67 20 61 6e 20 66 73 79 6e 63 28 29 2e  ting an fsync().
1f4d0 0a 20 20 2a 2a 20 49 74 20 73 68 6f 75 6c 64 6e  .  ** It shouldn
1f4e0 27 74 20 62 65 20 70 6f 73 73 69 62 6c 65 20 66  't be possible f
1f4f0 6f 72 20 66 75 6c 6c 66 73 79 6e 63 20 74 6f 20  or fullfsync to 
1f500 66 61 69 6c 20 6f 6e 20 74 68 65 20 6c 6f 63 61  fail on the loca
1f510 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20 73 79 73  l .  ** file sys
1f520 74 65 6d 20 28 6f 6e 20 4f 53 58 29 2c 20 73 6f  tem (on OSX), so
1f530 20 66 61 69 6c 75 72 65 20 69 6e 64 69 63 61 74   failure indicat
1f540 65 73 20 74 68 61 74 20 46 55 4c 4c 46 53 59 4e  es that FULLFSYN
1f550 43 0a 20 20 2a 2a 20 69 73 6e 27 74 20 73 75 70  C.  ** isn't sup
1f560 70 6f 72 74 65 64 20 66 6f 72 20 74 68 69 73 20  ported for this 
1f570 66 69 6c 65 20 73 79 73 74 65 6d 2e 20 53 6f 2c  file system. So,
1f580 20 61 74 74 65 6d 70 74 20 61 6e 20 66 73 79 6e   attempt an fsyn
1f590 63 20 0a 20 20 2a 2a 20 61 6e 64 20 28 66 6f 72  c .  ** and (for
1f5a0 20 6e 6f 77 29 20 69 67 6e 6f 72 65 20 74 68 65   now) ignore the
1f5b0 20 6f 76 65 72 68 65 61 64 20 6f 66 20 61 20 73   overhead of a s
1f5c0 75 70 65 72 66 6c 75 6f 75 73 20 66 63 6e 74 6c  uperfluous fcntl
1f5d0 20 63 61 6c 6c 2e 20 20 0a 20 20 2a 2a 20 49 74   call.  .  ** It
1f5e0 27 64 20 62 65 20 62 65 74 74 65 72 20 74 6f 20  'd be better to 
1f5f0 64 65 74 65 63 74 20 66 75 6c 6c 66 73 79 6e 63  detect fullfsync
1f600 20 73 75 70 70 6f 72 74 20 6f 6e 63 65 20 61 6e   support once an
1f610 64 20 61 76 6f 69 64 20 0a 20 20 2a 2a 20 74 68  d avoid .  ** th
1f620 65 20 66 63 6e 74 6c 20 63 61 6c 6c 20 65 76 65  e fcntl call eve
1f630 72 79 20 74 69 6d 65 20 73 79 6e 63 20 69 73 20  ry time sync is 
1f640 63 61 6c 6c 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  called..  */.  i
1f650 66 28 20 72 63 20 29 20 72 63 20 3d 20 66 73 79  f( rc ) rc = fsy
1f660 6e 63 28 66 64 29 3b 0a 0a 23 65 6c 69 66 20 64  nc(fd);..#elif d
1f670 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
1f680 29 0a 20 20 2f 2a 20 66 64 61 74 61 73 79 6e 63  ).  /* fdatasync
1f690 28 29 20 6f 6e 20 48 46 53 2b 20 64 6f 65 73 6e  () on HFS+ doesn
1f6a0 27 74 20 79 65 74 20 66 6c 75 73 68 20 74 68 65  't yet flush the
1f6b0 20 66 69 6c 65 20 73 69 7a 65 20 69 66 20 69 74   file size if it
1f6c0 20 63 68 61 6e 67 65 64 20 63 6f 72 72 65 63 74   changed correct
1f6d0 6c 79 0a 20 20 2a 2a 20 73 6f 20 63 75 72 72 65  ly.  ** so curre
1f6e0 6e 74 6c 79 20 77 65 20 64 65 66 61 75 6c 74 20  ntly we default 
1f6f0 74 6f 20 74 68 65 20 6d 61 63 72 6f 20 74 68 61  to the macro tha
1f700 74 20 72 65 64 65 66 69 6e 65 73 20 66 64 61 74  t redefines fdat
1f710 61 73 79 6e 63 20 74 6f 20 66 73 79 6e 63 0a 20  async to fsync. 
1f720 20 2a 2f 0a 20 20 72 63 20 3d 20 66 73 79 6e 63   */.  rc = fsync
1f730 28 66 64 29 3b 0a 23 65 6c 73 65 20 0a 20 20 72  (fd);.#else .  r
1f740 63 20 3d 20 66 64 61 74 61 73 79 6e 63 28 66 64  c = fdatasync(fd
1f750 29 3b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b  );.#if OS_VXWORK
1f760 53 0a 20 20 69 66 28 20 72 63 3d 3d 2d 31 20 26  S.  if( rc==-1 &
1f770 26 20 65 72 72 6e 6f 3d 3d 45 4e 4f 54 53 55 50  & errno==ENOTSUP
1f780 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 73 79   ){.    rc = fsy
1f790 6e 63 28 66 64 29 3b 0a 20 20 7d 0a 23 65 6e 64  nc(fd);.  }.#end
1f7a0 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53  if /* OS_VXWORKS
1f7b0 20 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 69 66   */.#endif /* if
1f7c0 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59  def SQLITE_NO_SY
1f7d0 4e 43 20 65 6c 69 66 20 48 41 56 45 5f 46 55 4c  NC elif HAVE_FUL
1f7e0 4c 46 53 59 4e 43 20 2a 2f 0a 0a 20 20 69 66 28  LFSYNC */..  if(
1f7f0 20 4f 53 5f 56 58 57 4f 52 4b 53 20 26 26 20 72   OS_VXWORKS && r
1f800 63 21 3d 20 2d 31 20 29 7b 0a 20 20 20 20 72 63  c!= -1 ){.    rc
1f810 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
1f820 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1f830 4f 70 65 6e 20 61 20 66 69 6c 65 20 64 65 73 63  Open a file desc
1f840 72 69 70 74 6f 72 20 74 6f 20 74 68 65 20 64 69  riptor to the di
1f850 72 65 63 74 6f 72 79 20 63 6f 6e 74 61 69 6e 69  rectory containi
1f860 6e 67 20 66 69 6c 65 20 7a 46 69 6c 65 6e 61 6d  ng file zFilenam
1f870 65 2e 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73  e..** If success
1f880 66 75 6c 2c 20 2a 70 46 64 20 69 73 20 73 65 74  ful, *pFd is set
1f890 20 74 6f 20 74 68 65 20 6f 70 65 6e 65 64 20 66   to the opened f
1f8a0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 61  ile descriptor a
1f8b0 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  nd.** SQLITE_OK 
1f8c0 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  is returned. If 
1f8d0 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
1f8e0 20 65 69 74 68 65 72 20 53 51 4c 49 54 45 5f 4e   either SQLITE_N
1f8f0 4f 4d 45 4d 0a 2a 2a 20 6f 72 20 53 51 4c 49 54  OMEM.** or SQLIT
1f900 45 5f 43 41 4e 54 4f 50 45 4e 20 69 73 20 72 65  E_CANTOPEN is re
1f910 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 46 64 20  turned and *pFd 
1f920 69 73 20 73 65 74 20 74 6f 20 61 6e 20 75 6e 64  is set to an und
1f930 65 66 69 6e 65 64 0a 2a 2a 20 76 61 6c 75 65 2e  efined.** value.
1f940 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 72 65 63  .**.** The direc
1f950 74 6f 72 79 20 66 69 6c 65 20 64 65 73 63 72 69  tory file descri
1f960 70 74 6f 72 20 69 73 20 75 73 65 64 20 66 6f 72  ptor is used for
1f970 20 6f 6e 6c 79 20 6f 6e 65 20 74 68 69 6e 67 20   only one thing 
1f980 2d 20 74 6f 0a 2a 2a 20 66 73 79 6e 63 28 29 20  - to.** fsync() 
1f990 61 20 64 69 72 65 63 74 6f 72 79 20 74 6f 20 6d  a directory to m
1f9a0 61 6b 65 20 73 75 72 65 20 66 69 6c 65 20 63 72  ake sure file cr
1f9b0 65 61 74 69 6f 6e 20 61 6e 64 20 64 65 6c 65 74  eation and delet
1f9c0 69 6f 6e 20 65 76 65 6e 74 73 0a 2a 2a 20 61 72  ion events.** ar
1f9d0 65 20 66 6c 75 73 68 65 64 20 74 6f 20 64 69 73  e flushed to dis
1f9e0 6b 2e 20 20 53 75 63 68 20 66 73 79 6e 63 73 20  k.  Such fsyncs 
1f9f0 61 72 65 20 6e 6f 74 20 6e 65 65 64 65 64 20 6f  are not needed o
1fa00 6e 20 6e 65 77 65 72 0a 2a 2a 20 6a 6f 75 72 6e  n newer.** journ
1fa10 61 6c 69 6e 67 20 66 69 6c 65 73 79 73 74 65 6d  aling filesystem
1fa20 73 2c 20 62 75 74 20 61 72 65 20 72 65 71 75 69  s, but are requi
1fa30 72 65 64 20 6f 6e 20 6f 6c 64 65 72 20 66 69 6c  red on older fil
1fa40 65 73 79 73 74 65 6d 73 2e 0a 2a 2a 0a 2a 2a 20  esystems..**.** 
1fa50 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e  This routine can
1fa60 20 62 65 20 6f 76 65 72 72 69 64 64 65 6e 20 75   be overridden u
1fa70 73 69 6e 67 20 74 68 65 20 78 53 65 74 53 79 73  sing the xSetSys
1fa80 43 61 6c 6c 20 69 6e 74 65 72 66 61 63 65 2e 0a  Call interface..
1fa90 2a 2a 20 54 68 65 20 61 62 69 6c 69 74 79 20 74  ** The ability t
1faa0 6f 20 6f 76 65 72 72 69 64 65 20 74 68 69 73 20  o override this 
1fab0 72 6f 75 74 69 6e 65 20 77 61 73 20 61 64 64 65  routine was adde
1fac0 64 20 69 6e 20 73 75 70 70 6f 72 74 20 6f 66 20  d in support of 
1fad0 74 68 65 0a 2a 2a 20 63 68 72 6f 6d 69 75 6d 20  the.** chromium 
1fae0 73 61 6e 64 62 6f 78 2e 20 20 4f 70 65 6e 69 6e  sandbox.  Openin
1faf0 67 20 61 20 64 69 72 65 63 74 6f 72 79 20 69 73  g a directory is
1fb00 20 61 20 73 65 63 75 72 69 74 79 20 72 69 73 6b   a security risk
1fb10 20 28 77 65 20 61 72 65 0a 2a 2a 20 74 6f 6c 64   (we are.** told
1fb20 29 20 73 6f 20 6d 61 6b 69 6e 67 20 69 74 20 6f  ) so making it o
1fb30 76 65 72 72 69 64 65 61 62 6c 65 20 61 6c 6c 6f  verrideable allo
1fb40 77 73 20 74 68 65 20 63 68 72 6f 6d 69 75 6d 20  ws the chromium 
1fb50 73 61 6e 64 62 6f 78 20 74 6f 0a 2a 2a 20 72 65  sandbox to.** re
1fb60 70 6c 61 63 65 20 74 68 69 73 20 72 6f 75 74 69  place this routi
1fb70 6e 65 20 77 69 74 68 20 61 20 68 61 72 6d 6c 65  ne with a harmle
1fb80 73 73 20 6e 6f 2d 6f 70 2e 20 20 54 6f 20 6d 61  ss no-op.  To ma
1fb90 6b 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  ke this routine.
1fba0 2a 2a 20 61 20 6e 6f 2d 6f 70 2c 20 72 65 70 6c  ** a no-op, repl
1fbb0 61 63 65 20 69 74 20 77 69 74 68 20 61 20 73 74  ace it with a st
1fbc0 75 62 20 74 68 61 74 20 72 65 74 75 72 6e 73 20  ub that returns 
1fbd0 53 51 4c 49 54 45 5f 4f 4b 20 62 75 74 20 6c 65  SQLITE_OK but le
1fbe0 61 76 65 73 0a 2a 2a 20 2a 70 46 64 20 73 65 74  aves.** *pFd set
1fbf0 20 74 6f 20 61 20 6e 65 67 61 74 69 76 65 20 6e   to a negative n
1fc00 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  umber..**.** If 
1fc10 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
1fc20 75 72 6e 65 64 2c 20 74 68 65 20 63 61 6c 6c 65  urned, the calle
1fc30 72 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65  r is responsible
1fc40 20 66 6f 72 20 63 6c 6f 73 69 6e 67 0a 2a 2a 20   for closing.** 
1fc50 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
1fc60 74 6f 72 20 2a 70 46 64 20 75 73 69 6e 67 20 63  tor *pFd using c
1fc70 6c 6f 73 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  lose()..*/.stati
1fc80 63 20 69 6e 74 20 6f 70 65 6e 44 69 72 65 63 74  c int openDirect
1fc90 6f 72 79 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ory(const char *
1fca0 7a 46 69 6c 65 6e 61 6d 65 2c 20 69 6e 74 20 2a  zFilename, int *
1fcb0 70 46 64 29 7b 0a 20 20 69 6e 74 20 69 69 3b 0a  pFd){.  int ii;.
1fcc0 20 20 69 6e 74 20 66 64 20 3d 20 2d 31 3b 0a 20    int fd = -1;. 
1fcd0 20 63 68 61 72 20 7a 44 69 72 6e 61 6d 65 5b 4d   char zDirname[M
1fce0 41 58 5f 50 41 54 48 4e 41 4d 45 2b 31 5d 3b 0a  AX_PATHNAME+1];.
1fcf0 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69  .  sqlite3_snpri
1fd00 6e 74 66 28 4d 41 58 5f 50 41 54 48 4e 41 4d 45  ntf(MAX_PATHNAME
1fd10 2c 20 7a 44 69 72 6e 61 6d 65 2c 20 22 25 73 22  , zDirname, "%s"
1fd20 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  , zFilename);.  
1fd30 66 6f 72 28 69 69 3d 28 69 6e 74 29 73 74 72 6c  for(ii=(int)strl
1fd40 65 6e 28 7a 44 69 72 6e 61 6d 65 29 3b 20 69 69  en(zDirname); ii
1fd50 3e 31 20 26 26 20 7a 44 69 72 6e 61 6d 65 5b 69  >1 && zDirname[i
1fd60 69 5d 21 3d 27 2f 27 3b 20 69 69 2d 2d 29 3b 0a  i]!='/'; ii--);.
1fd70 20 20 69 66 28 20 69 69 3e 30 20 29 7b 0a 20 20    if( ii>0 ){.  
1fd80 20 20 7a 44 69 72 6e 61 6d 65 5b 69 69 5d 20 3d    zDirname[ii] =
1fd90 20 27 5c 30 27 3b 0a 20 20 20 20 66 64 20 3d 20   '\0';.    fd = 
1fda0 72 6f 62 75 73 74 5f 6f 70 65 6e 28 7a 44 69 72  robust_open(zDir
1fdb0 6e 61 6d 65 2c 20 4f 5f 52 44 4f 4e 4c 59 7c 4f  name, O_RDONLY|O
1fdc0 5f 42 49 4e 41 52 59 2c 20 30 29 3b 0a 20 20 20  _BINARY, 0);.   
1fdd0 20 69 66 28 20 66 64 3e 3d 30 20 29 7b 0a 20 20   if( fd>=0 ){.  
1fde0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4f 50      OSTRACE(("OP
1fdf0 45 4e 44 49 52 20 25 2d 33 64 20 25 73 5c 6e 22  ENDIR %-3d %s\n"
1fe00 2c 20 66 64 2c 20 7a 44 69 72 6e 61 6d 65 29 29  , fd, zDirname))
1fe10 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70  ;.    }.  }.  *p
1fe20 46 64 20 3d 20 66 64 3b 0a 20 20 72 65 74 75 72  Fd = fd;.  retur
1fe30 6e 20 28 66 64 3e 3d 30 3f 53 51 4c 49 54 45 5f  n (fd>=0?SQLITE_
1fe40 4f 4b 3a 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28  OK:unixLogError(
1fe50 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
1fe60 42 4b 50 54 2c 20 22 6f 70 65 6e 22 2c 20 7a 44  BKPT, "open", zD
1fe70 69 72 6e 61 6d 65 29 29 3b 0a 7d 0a 0a 2f 2a 0a  irname));.}../*.
1fe80 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c  ** Make sure all
1fe90 20 77 72 69 74 65 73 20 74 6f 20 61 20 70 61 72   writes to a par
1fea0 74 69 63 75 6c 61 72 20 66 69 6c 65 20 61 72 65  ticular file are
1feb0 20 63 6f 6d 6d 69 74 74 65 64 20 74 6f 20 64 69   committed to di
1fec0 73 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 64 61 74  sk..**.** If dat
1fed0 61 4f 6e 6c 79 3d 3d 30 20 74 68 65 6e 20 62 6f  aOnly==0 then bo
1fee0 74 68 20 74 68 65 20 66 69 6c 65 20 69 74 73 65  th the file itse
1fef0 6c 66 20 61 6e 64 20 69 74 73 20 6d 65 74 61 64  lf and its metad
1ff00 61 74 61 20 28 66 69 6c 65 0a 2a 2a 20 73 69 7a  ata (file.** siz
1ff10 65 2c 20 61 63 63 65 73 73 20 74 69 6d 65 2c 20  e, access time, 
1ff20 65 74 63 29 20 61 72 65 20 73 79 6e 63 65 64 2e  etc) are synced.
1ff30 20 20 49 66 20 64 61 74 61 4f 6e 6c 79 21 3d 30    If dataOnly!=0
1ff40 20 74 68 65 6e 20 6f 6e 6c 79 20 74 68 65 0a 2a   then only the.*
1ff50 2a 20 66 69 6c 65 20 64 61 74 61 20 69 73 20 73  * file data is s
1ff60 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 55 6e 64  ynced..**.** Und
1ff70 65 72 20 55 6e 69 78 2c 20 61 6c 73 6f 20 6d 61  er Unix, also ma
1ff80 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65  ke sure that the
1ff90 20 64 69 72 65 63 74 6f 72 79 20 65 6e 74 72 79   directory entry
1ffa0 20 66 6f 72 20 74 68 65 20 66 69 6c 65 0a 2a 2a   for the file.**
1ffb0 20 68 61 73 20 62 65 65 6e 20 63 72 65 61 74 65   has been create
1ffc0 64 20 62 79 20 66 73 79 6e 63 2d 69 6e 67 20 74  d by fsync-ing t
1ffd0 68 65 20 64 69 72 65 63 74 6f 72 79 20 74 68 61  he directory tha
1ffe0 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 66  t contains the f
1fff0 69 6c 65 2e 0a 2a 2a 20 49 66 20 77 65 20 64 6f  ile..** If we do
20000 20 6e 6f 74 20 64 6f 20 74 68 69 73 20 61 6e 64   not do this and
20010 20 77 65 20 65 6e 63 6f 75 6e 74 65 72 20 61 20   we encounter a 
20020 70 6f 77 65 72 20 66 61 69 6c 75 72 65 2c 20 74  power failure, t
20030 68 65 20 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20  he directory.** 
20040 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 6a 6f  entry for the jo
20050 75 72 6e 61 6c 20 6d 69 67 68 74 20 6e 6f 74 20  urnal might not 
20060 65 78 69 73 74 20 61 66 74 65 72 20 77 65 20 72  exist after we r
20070 65 62 6f 6f 74 2e 20 20 54 68 65 20 6e 65 78 74  eboot.  The next
20080 0a 2a 2a 20 53 51 4c 69 74 65 20 74 6f 20 61 63  .** SQLite to ac
20090 63 65 73 73 20 74 68 65 20 66 69 6c 65 20 77 69  cess the file wi
200a0 6c 6c 20 6e 6f 74 20 6b 6e 6f 77 20 74 68 61 74  ll not know that
200b0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 65 78 69   the journal exi
200c0 73 74 73 20 28 62 65 63 61 75 73 65 0a 2a 2a 20  sts (because.** 
200d0 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 65 6e  the directory en
200e0 74 72 79 20 66 6f 72 20 74 68 65 20 6a 6f 75 72  try for the jour
200f0 6e 61 6c 20 77 61 73 20 6e 65 76 65 72 20 63 72  nal was never cr
20100 65 61 74 65 64 29 20 61 6e 64 20 74 68 65 20 74  eated) and the t
20110 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 77 69  ransaction.** wi
20120 6c 6c 20 6e 6f 74 20 72 6f 6c 6c 20 62 61 63 6b  ll not roll back
20130 20 2d 20 70 6f 73 73 69 62 6c 79 20 6c 65 61 64   - possibly lead
20140 69 6e 67 20 74 6f 20 64 61 74 61 62 61 73 65 20  ing to database 
20150 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73  corruption..*/.s
20160 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 79  tatic int unixSy
20170 6e 63 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  nc(sqlite3_file 
20180 2a 69 64 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b  *id, int flags){
20190 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e 69  .  int rc;.  uni
201a0 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
201b0 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20  unixFile*)id;.. 
201c0 20 69 6e 74 20 69 73 44 61 74 61 4f 6e 6c 79 20   int isDataOnly 
201d0 3d 20 28 66 6c 61 67 73 26 53 51 4c 49 54 45 5f  = (flags&SQLITE_
201e0 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 29 3b 0a  SYNC_DATAONLY);.
201f0 20 20 69 6e 74 20 69 73 46 75 6c 6c 73 79 6e 63    int isFullsync
20200 20 3d 20 28 66 6c 61 67 73 26 30 78 30 46 29 3d   = (flags&0x0F)=
20210 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c  =SQLITE_SYNC_FUL
20220 4c 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  L;..  /* Check t
20230 68 61 74 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54  hat one of SQLIT
20240 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72  E_SYNC_NORMAL or
20250 20 46 55 4c 4c 20 77 61 73 20 70 61 73 73 65 64   FULL was passed
20260 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 28 66 6c   */.  assert((fl
20270 61 67 73 26 30 78 30 46 29 3d 3d 53 51 4c 49 54  ags&0x0F)==SQLIT
20280 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 0a 20 20  E_SYNC_NORMAL.  
20290 20 20 20 20 7c 7c 20 28 66 6c 61 67 73 26 30 78      || (flags&0x
202a0 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43  0F)==SQLITE_SYNC
202b0 5f 46 55 4c 4c 0a 20 20 29 3b 0a 0a 20 20 2f 2a  _FULL.  );..  /*
202c0 20 55 6e 69 78 20 63 61 6e 6e 6f 74 2c 20 62 75   Unix cannot, bu
202d0 74 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 20 6d  t some systems m
202e0 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ay return SQLITE
202f0 5f 46 55 4c 4c 20 66 72 6f 6d 20 68 65 72 65 2e  _FULL from here.
20300 20 54 68 69 73 0a 20 20 2a 2a 20 6c 69 6e 65 20   This.  ** line 
20310 69 73 20 74 6f 20 74 65 73 74 20 74 68 61 74 20  is to test that 
20320 64 6f 69 6e 67 20 73 6f 20 64 6f 65 73 20 6e 6f  doing so does no
20330 74 20 63 61 75 73 65 20 61 6e 79 20 70 72 6f 62  t cause any prob
20340 6c 65 6d 73 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d  lems..  */.  Sim
20350 75 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45 72 72  ulateDiskfullErr
20360 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54  or( return SQLIT
20370 45 5f 46 55 4c 4c 20 29 3b 0a 0a 20 20 61 73 73  E_FULL );..  ass
20380 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
20390 4f 53 54 52 41 43 45 28 28 22 53 59 4e 43 20 20  OSTRACE(("SYNC  
203a0 20 20 25 2d 33 64 5c 6e 22 2c 20 70 46 69 6c 65    %-3d\n", pFile
203b0 2d 3e 68 29 29 3b 0a 20 20 72 63 20 3d 20 66 75  ->h));.  rc = fu
203c0 6c 6c 5f 66 73 79 6e 63 28 70 46 69 6c 65 2d 3e  ll_fsync(pFile->
203d0 68 2c 20 69 73 46 75 6c 6c 73 79 6e 63 2c 20 69  h, isFullsync, i
203e0 73 44 61 74 61 4f 6e 6c 79 29 3b 0a 20 20 53 69  sDataOnly);.  Si
203f0 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
20400 63 3d 31 20 29 3b 0a 20 20 69 66 28 20 72 63 20  c=1 );.  if( rc 
20410 29 7b 0a 20 20 20 20 73 74 6f 72 65 4c 61 73 74  ){.    storeLast
20420 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72  Errno(pFile, err
20430 6e 6f 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  no);.    return 
20440 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c  unixLogError(SQL
20450 49 54 45 5f 49 4f 45 52 52 5f 46 53 59 4e 43 2c  ITE_IOERR_FSYNC,
20460 20 22 66 75 6c 6c 5f 66 73 79 6e 63 22 2c 20 70   "full_fsync", p
20470 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  File->zPath);.  
20480 7d 0a 0a 20 20 2f 2a 20 41 6c 73 6f 20 66 73 79  }..  /* Also fsy
20490 6e 63 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  nc the directory
204a0 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
204b0 66 69 6c 65 20 69 66 20 74 68 65 20 44 49 52 53  file if the DIRS
204c0 59 4e 43 20 66 6c 61 67 0a 20 20 2a 2a 20 69 73  YNC flag.  ** is
204d0 20 73 65 74 2e 20 20 54 68 69 73 20 69 73 20 61   set.  This is a
204e0 20 6f 6e 65 2d 74 69 6d 65 20 6f 63 63 75 72 72   one-time occurr
204f0 65 6e 63 65 2e 20 20 4d 61 6e 79 20 73 79 73 74  ence.  Many syst
20500 65 6d 73 20 28 65 78 61 6d 70 6c 65 73 3a 20 41  ems (examples: A
20510 49 58 29 0a 20 20 2a 2a 20 61 72 65 20 75 6e 61  IX).  ** are una
20520 62 6c 65 20 74 6f 20 66 73 79 6e 63 20 61 20 64  ble to fsync a d
20530 69 72 65 63 74 6f 72 79 2c 20 73 6f 20 69 67 6e  irectory, so ign
20540 6f 72 65 20 65 72 72 6f 72 73 20 6f 6e 20 74 68  ore errors on th
20550 65 20 66 73 79 6e 63 2e 0a 20 20 2a 2f 0a 20 20  e fsync..  */.  
20560 69 66 28 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46  if( pFile->ctrlF
20570 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f  lags & UNIXFILE_
20580 44 49 52 53 59 4e 43 20 29 7b 0a 20 20 20 20 69  DIRSYNC ){.    i
20590 6e 74 20 64 69 72 66 64 3b 0a 20 20 20 20 4f 53  nt dirfd;.    OS
205a0 54 52 41 43 45 28 28 22 44 49 52 53 59 4e 43 20  TRACE(("DIRSYNC 
205b0 25 73 20 28 68 61 76 65 5f 66 75 6c 6c 66 73 79  %s (have_fullfsy
205c0 6e 63 3d 25 64 20 66 75 6c 6c 73 79 6e 63 3d 25  nc=%d fullsync=%
205d0 64 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 7a 50  d)\n", pFile->zP
205e0 61 74 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ath,.           
205f0 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 2c   HAVE_FULLFSYNC,
20600 20 69 73 46 75 6c 6c 73 79 6e 63 29 29 3b 0a 20   isFullsync));. 
20610 20 20 20 72 63 20 3d 20 6f 73 4f 70 65 6e 44 69     rc = osOpenDi
20620 72 65 63 74 6f 72 79 28 70 46 69 6c 65 2d 3e 7a  rectory(pFile->z
20630 50 61 74 68 2c 20 26 64 69 72 66 64 29 3b 0a 20  Path, &dirfd);. 
20640 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
20650 45 5f 4f 4b 20 26 26 20 64 69 72 66 64 3e 3d 30  E_OK && dirfd>=0
20660 20 29 7b 0a 20 20 20 20 20 20 66 75 6c 6c 5f 66   ){.      full_f
20670 73 79 6e 63 28 64 69 72 66 64 2c 20 30 2c 20 30  sync(dirfd, 0, 0
20680 29 3b 0a 23 69 66 20 4f 53 43 4c 4f 53 45 5f 43  );.#if OSCLOSE_C
20690 48 45 43 4b 5f 43 4c 4f 53 45 5f 49 4f 45 52 52  HECK_CLOSE_IOERR
206a0 0a 20 20 20 20 20 20 69 66 28 20 63 6c 6f 73 65  .      if( close
206b0 28 70 46 69 6c 65 2d 3e 64 69 72 66 64 29 20 29  (pFile->dirfd) )
206c0 7b 0a 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c  {.        storeL
206d0 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20  astErrno(pFile, 
206e0 65 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20  errno);.        
206f0 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
20700 52 5f 44 49 52 5f 43 4c 4f 53 45 3b 0a 20 20 20  R_DIR_CLOSE;.   
20710 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 20     }.#else.     
20720 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 46   robust_close(pF
20730 69 6c 65 2c 20 64 69 72 66 64 2c 20 5f 5f 4c 49  ile, dirfd, __LI
20740 4e 45 5f 5f 29 3b 0a 23 65 6e 64 69 66 0a 20 20  NE__);.#endif.  
20750 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d    }else if( rc==
20760 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20  SQLITE_CANTOPEN 
20770 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
20780 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
20790 20 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c     pFile->ctrlFl
207a0 61 67 73 20 26 3d 20 7e 55 4e 49 58 46 49 4c 45  ags &= ~UNIXFILE
207b0 5f 44 49 52 53 59 4e 43 3b 0a 0a 20 20 7d 0a 20  _DIRSYNC;..  }. 
207c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
207d0 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 61 6e  *.** Truncate an
207e0 20 6f 70 65 6e 20 66 69 6c 65 20 74 6f 20 61 20   open file to a 
207f0 73 70 65 63 69 66 69 65 64 20 73 69 7a 65 0a 2a  specified size.*
20800 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
20810 78 54 72 75 6e 63 61 74 65 28 73 71 6c 69 74 65  xTruncate(sqlite
20820 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 36 34 20  3_file *id, i64 
20830 6e 42 79 74 65 29 7b 0a 20 20 75 6e 69 78 46 69  nByte){.  unixFi
20840 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
20850 78 46 69 6c 65 20 2a 29 69 64 3b 0a 20 20 69 6e  xFile *)id;.  in
20860 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  t rc;.  assert( 
20870 70 46 69 6c 65 20 29 3b 0a 20 20 53 69 6d 75 6c  pFile );.  Simul
20880 61 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75  ateIOError( retu
20890 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
208a0 54 52 55 4e 43 41 54 45 20 29 3b 0a 0a 20 20 2f  TRUNCATE );..  /
208b0 2a 20 49 66 20 74 68 65 20 75 73 65 72 20 68 61  * If the user ha
208c0 73 20 63 6f 6e 66 69 67 75 72 65 64 20 61 20 63  s configured a c
208d0 68 75 6e 6b 2d 73 69 7a 65 20 66 6f 72 20 74 68  hunk-size for th
208e0 69 73 20 66 69 6c 65 2c 20 74 72 75 6e 63 61 74  is file, truncat
208f0 65 20 74 68 65 0a 20 20 2a 2a 20 66 69 6c 65 20  e the.  ** file 
20900 73 6f 20 74 68 61 74 20 69 74 20 63 6f 6e 73 69  so that it consi
20910 73 74 73 20 6f 66 20 61 6e 20 69 6e 74 65 67 65  sts of an intege
20920 72 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 75 6e  r number of chun
20930 6b 73 20 28 69 2e 65 2e 20 74 68 65 0a 20 20 2a  ks (i.e. the.  *
20940 2a 20 61 63 74 75 61 6c 20 66 69 6c 65 20 73 69  * actual file si
20950 7a 65 20 61 66 74 65 72 20 74 68 65 20 6f 70 65  ze after the ope
20960 72 61 74 69 6f 6e 20 6d 61 79 20 62 65 20 6c 61  ration may be la
20970 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 72 65  rger than the re
20980 71 75 65 73 74 65 64 0a 20 20 2a 2a 20 73 69 7a  quested.  ** siz
20990 65 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  e)..  */.  if( p
209a0 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3e 30 20  File->szChunk>0 
209b0 29 7b 0a 20 20 20 20 6e 42 79 74 65 20 3d 20 28  ){.    nByte = (
209c0 28 6e 42 79 74 65 20 2b 20 70 46 69 6c 65 2d 3e  (nByte + pFile->
209d0 73 7a 43 68 75 6e 6b 20 2d 20 31 29 2f 70 46 69  szChunk - 1)/pFi
209e0 6c 65 2d 3e 73 7a 43 68 75 6e 6b 29 20 2a 20 70  le->szChunk) * p
209f0 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3b 0a 20  File->szChunk;. 
20a00 20 7d 0a 0a 20 20 72 63 20 3d 20 72 6f 62 75 73   }..  rc = robus
20a10 74 5f 66 74 72 75 6e 63 61 74 65 28 70 46 69 6c  t_ftruncate(pFil
20a20 65 2d 3e 68 2c 20 6e 42 79 74 65 29 3b 0a 20 20  e->h, nByte);.  
20a30 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 73 74  if( rc ){.    st
20a40 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69  oreLastErrno(pFi
20a50 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20  le, errno);.    
20a60 72 65 74 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72  return unixLogEr
20a70 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
20a80 5f 54 52 55 4e 43 41 54 45 2c 20 22 66 74 72 75  _TRUNCATE, "ftru
20a90 6e 63 61 74 65 22 2c 20 70 46 69 6c 65 2d 3e 7a  ncate", pFile->z
20aa0 50 61 74 68 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Path);.  }else{.
20ab0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
20ac0 42 55 47 0a 20 20 20 20 2f 2a 20 49 66 20 77 65  BUG.    /* If we
20ad0 20 61 72 65 20 64 6f 69 6e 67 20 61 20 6e 6f 72   are doing a nor
20ae0 6d 61 6c 20 77 72 69 74 65 20 74 6f 20 61 20 64  mal write to a d
20af0 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 61 73  atabase file (as
20b00 20 6f 70 70 6f 73 65 64 20 74 6f 0a 20 20 20 20   opposed to.    
20b10 2a 2a 20 64 6f 69 6e 67 20 61 20 68 6f 74 2d 6a  ** doing a hot-j
20b20 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20  ournal rollback 
20b30 6f 72 20 61 20 77 72 69 74 65 20 74 6f 20 73 6f  or a write to so
20b40 6d 65 20 66 69 6c 65 20 6f 74 68 65 72 20 74 68  me file other th
20b50 61 6e 20 61 0a 20 20 20 20 2a 2a 20 6e 6f 72 6d  an a.    ** norm
20b60 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  al database file
20b70 29 20 61 6e 64 20 77 65 20 74 72 75 6e 63 61 74  ) and we truncat
20b80 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20 7a 65  e the file to ze
20b90 72 6f 20 6c 65 6e 67 74 68 2c 0a 20 20 20 20 2a  ro length,.    *
20ba0 2a 20 74 68 61 74 20 65 66 66 65 63 74 69 76 65  * that effective
20bb0 6c 79 20 75 70 64 61 74 65 73 20 74 68 65 20 63  ly updates the c
20bc0 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 2e 20 20  hange counter.  
20bd0 54 68 69 73 20 6d 69 67 68 74 20 68 61 70 70 65  This might happe
20be0 6e 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 72 65  n.    ** when re
20bf0 73 74 6f 72 69 6e 67 20 61 20 64 61 74 61 62 61  storing a databa
20c00 73 65 20 75 73 69 6e 67 20 74 68 65 20 62 61 63  se using the bac
20c10 6b 75 70 20 41 50 49 20 66 72 6f 6d 20 61 20 7a  kup API from a z
20c20 65 72 6f 2d 6c 65 6e 67 74 68 0a 20 20 20 20 2a  ero-length.    *
20c30 2a 20 73 6f 75 72 63 65 2e 0a 20 20 20 20 2a 2f  * source..    */
20c40 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  .    if( pFile->
20c50 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 26 26  inNormalWrite &&
20c60 20 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20   nByte==0 ){.   
20c70 20 20 20 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43     pFile->transC
20c80 6e 74 72 43 68 6e 67 20 3d 20 31 3b 0a 20 20 20  ntrChng = 1;.   
20c90 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53   }.#endif..#if S
20ca0 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
20cb0 49 5a 45 3e 30 0a 20 20 20 20 2f 2a 20 49 66 20  IZE>0.    /* If 
20cc0 74 68 65 20 66 69 6c 65 20 77 61 73 20 6a 75 73  the file was jus
20cd0 74 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 61  t truncated to a
20ce0 20 73 69 7a 65 20 73 6d 61 6c 6c 65 72 20 74 68   size smaller th
20cf0 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79  an the currently
20d00 0a 20 20 20 20 2a 2a 20 6d 61 70 70 65 64 20 72  .    ** mapped r
20d10 65 67 69 6f 6e 2c 20 72 65 64 75 63 65 20 74 68  egion, reduce th
20d20 65 20 65 66 66 65 63 74 69 76 65 20 6d 61 70 70  e effective mapp
20d30 69 6e 67 20 73 69 7a 65 20 61 73 20 77 65 6c 6c  ing size as well
20d40 2e 20 53 51 4c 69 74 65 20 77 69 6c 6c 0a 20 20  . SQLite will.  
20d50 20 20 2a 2a 20 75 73 65 20 72 65 61 64 28 29 20    ** use read() 
20d60 61 6e 64 20 77 72 69 74 65 28 29 20 74 6f 20 61  and write() to a
20d70 63 63 65 73 73 20 64 61 74 61 20 62 65 79 6f 6e  ccess data beyon
20d80 64 20 74 68 69 73 20 70 6f 69 6e 74 20 66 72 6f  d this point fro
20d90 6d 20 6e 6f 77 20 6f 6e 2e 20 20 0a 20 20 20 20  m now on.  .    
20da0 2a 2f 0a 20 20 20 20 69 66 28 20 6e 42 79 74 65  */.    if( nByte
20db0 3c 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65  <pFile->mmapSize
20dc0 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d   ){.      pFile-
20dd0 3e 6d 6d 61 70 53 69 7a 65 20 3d 20 6e 42 79 74  >mmapSize = nByt
20de0 65 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  e;.    }.#endif.
20df0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
20e00 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  TE_OK;.  }.}../*
20e10 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 68  .** Determine th
20e20 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f  e current size o
20e30 66 20 61 20 66 69 6c 65 20 69 6e 20 62 79 74 65  f a file in byte
20e40 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  s.*/.static int 
20e50 75 6e 69 78 46 69 6c 65 53 69 7a 65 28 73 71 6c  unixFileSize(sql
20e60 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
20e70 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20 69 6e  64 *pSize){.  in
20e80 74 20 72 63 3b 0a 20 20 73 74 72 75 63 74 20 73  t rc;.  struct s
20e90 74 61 74 20 62 75 66 3b 0a 20 20 61 73 73 65 72  tat buf;.  asser
20ea0 74 28 20 69 64 20 29 3b 0a 20 20 72 63 20 3d 20  t( id );.  rc = 
20eb0 6f 73 46 73 74 61 74 28 28 28 75 6e 69 78 46 69  osFstat(((unixFi
20ec0 6c 65 2a 29 69 64 29 2d 3e 68 2c 20 26 62 75 66  le*)id)->h, &buf
20ed0 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  );.  SimulateIOE
20ee0 72 72 6f 72 28 20 72 63 3d 31 20 29 3b 0a 20 20  rror( rc=1 );.  
20ef0 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20  if( rc!=0 ){.   
20f00 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28   storeLastErrno(
20f10 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 2c 20 65  (unixFile*)id, e
20f20 72 72 6e 6f 29 3b 0a 20 20 20 20 72 65 74 75 72  rrno);.    retur
20f30 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46  n SQLITE_IOERR_F
20f40 53 54 41 54 3b 0a 20 20 7d 0a 20 20 2a 70 53 69  STAT;.  }.  *pSi
20f50 7a 65 20 3d 20 62 75 66 2e 73 74 5f 73 69 7a 65  ze = buf.st_size
20f60 3b 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 6f 70 65  ;..  /* When ope
20f70 6e 69 6e 67 20 61 20 7a 65 72 6f 2d 73 69 7a 65  ning a zero-size
20f80 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20 66   database, the f
20f90 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29 20 70  indInodeInfo() p
20fa0 72 6f 63 65 64 75 72 65 0a 20 20 2a 2a 20 77 72  rocedure.  ** wr
20fb0 69 74 65 73 20 61 20 73 69 6e 67 6c 65 20 62 79  ites a single by
20fc0 74 65 20 69 6e 74 6f 20 74 68 61 74 20 66 69 6c  te into that fil
20fd0 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 77 6f  e in order to wo
20fe0 72 6b 20 61 72 6f 75 6e 64 20 61 20 62 75 67 0a  rk around a bug.
20ff0 20 20 2a 2a 20 69 6e 20 74 68 65 20 4f 53 2d 58    ** in the OS-X
21000 20 6d 73 64 6f 73 20 66 69 6c 65 73 79 73 74 65   msdos filesyste
21010 6d 2e 20 20 49 6e 20 6f 72 64 65 72 20 74 6f 20  m.  In order to 
21020 61 76 6f 69 64 20 70 72 6f 62 6c 65 6d 73 20 77  avoid problems w
21030 69 74 68 20 75 70 70 65 72 0a 20 20 2a 2a 20 6c  ith upper.  ** l
21040 61 79 65 72 73 2c 20 77 65 20 6e 65 65 64 20 74  ayers, we need t
21050 6f 20 72 65 70 6f 72 74 20 74 68 69 73 20 66 69  o report this fi
21060 6c 65 20 73 69 7a 65 20 61 73 20 7a 65 72 6f 20  le size as zero 
21070 65 76 65 6e 20 74 68 6f 75 67 68 20 69 74 20 69  even though it i
21080 73 0a 20 20 2a 2a 20 72 65 61 6c 6c 79 20 31 2e  s.  ** really 1.
21090 20 20 20 54 69 63 6b 65 74 20 23 33 32 36 30 2e     Ticket #3260.
210a0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 2a 70 53 69  .  */.  if( *pSi
210b0 7a 65 3d 3d 31 20 29 20 2a 70 53 69 7a 65 20 3d  ze==1 ) *pSize =
210c0 20 30 3b 0a 0a 0a 20 20 72 65 74 75 72 6e 20 53   0;...  return S
210d0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66  QLITE_OK;.}..#if
210e0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
210f0 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20  OCKING_STYLE && 
21100 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
21110 5f 29 0a 2f 2a 0a 2a 2a 20 48 61 6e 64 6c 65 72  _)./*.** Handler
21120 20 66 6f 72 20 70 72 6f 78 79 2d 6c 6f 63 6b 69   for proxy-locki
21130 6e 67 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20  ng file-control 
21140 76 65 72 62 73 2e 20 20 44 65 66 69 6e 65 64 20  verbs.  Defined 
21150 62 65 6c 6f 77 20 69 6e 20 74 68 65 0a 2a 2a 20  below in the.** 
21160 70 72 6f 78 79 69 6e 67 20 6c 6f 63 6b 69 6e 67  proxying locking
21170 20 64 69 76 69 73 69 6f 6e 2e 0a 2a 2f 0a 73 74   division..*/.st
21180 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 46 69  atic int proxyFi
21190 6c 65 43 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65  leControl(sqlite
211a0 33 5f 66 69 6c 65 2a 2c 69 6e 74 2c 76 6f 69 64  3_file*,int,void
211b0 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 0a  *);.#endif../* .
211c0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
211d0 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 68 61   is called to ha
211e0 6e 64 6c 65 20 74 68 65 20 53 51 4c 49 54 45 5f  ndle the SQLITE_
211f0 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 20  FCNTL_SIZE_HINT 
21200 0a 2a 2a 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c  .** file-control
21210 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 45 6e 6c   operation.  Enl
21220 61 72 67 65 20 74 68 65 20 64 61 74 61 62 61 73  arge the databas
21230 65 20 74 6f 20 6e 42 79 74 65 73 20 69 6e 20 73  e to nBytes in s
21240 69 7a 65 0a 2a 2a 20 28 72 6f 75 6e 64 65 64 20  ize.** (rounded 
21250 75 70 20 74 6f 20 74 68 65 20 6e 65 78 74 20 63  up to the next c
21260 68 75 6e 6b 2d 73 69 7a 65 29 2e 20 20 49 66 20  hunk-size).  If 
21270 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
21280 61 6c 72 65 61 64 79 0a 2a 2a 20 6e 42 79 74 65  already.** nByte
21290 73 20 6f 72 20 6c 61 72 67 65 72 2c 20 74 68 69  s or larger, thi
212a0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
212b0 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
212c0 69 6e 74 20 66 63 6e 74 6c 53 69 7a 65 48 69 6e  int fcntlSizeHin
212d0 74 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c  t(unixFile *pFil
212e0 65 2c 20 69 36 34 20 6e 42 79 74 65 29 7b 0a 20  e, i64 nByte){. 
212f0 20 69 66 28 20 70 46 69 6c 65 2d 3e 73 7a 43 68   if( pFile->szCh
21300 75 6e 6b 3e 30 20 29 7b 0a 20 20 20 20 69 36 34  unk>0 ){.    i64
21310 20 6e 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20   nSize;         
21320 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
21330 71 75 69 72 65 64 20 66 69 6c 65 20 73 69 7a 65  quired file size
21340 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20 73   */.    struct s
21350 74 61 74 20 62 75 66 3b 20 20 20 20 20 20 20 20  tat buf;        
21360 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f        /* Used to
21370 20 68 6f 6c 64 20 72 65 74 75 72 6e 20 76 61 6c   hold return val
21380 75 65 73 20 6f 66 20 66 73 74 61 74 28 29 20 2a  ues of fstat() *
21390 2f 0a 20 20 20 0a 20 20 20 20 69 66 28 20 6f 73  /.   .    if( os
213a0 46 73 74 61 74 28 70 46 69 6c 65 2d 3e 68 2c 20  Fstat(pFile->h, 
213b0 26 62 75 66 29 20 29 7b 0a 20 20 20 20 20 20 73  &buf) ){.      s
213c0 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46  toreLastErrno(pF
213d0 69 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20  ile, errno);.   
213e0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
213f0 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a 20 20  _IOERR_FSTAT;.  
21400 20 20 7d 0a 0a 20 20 20 20 6e 53 69 7a 65 20 3d    }..    nSize =
21410 20 28 28 6e 42 79 74 65 2b 70 46 69 6c 65 2d 3e   ((nByte+pFile->
21420 73 7a 43 68 75 6e 6b 2d 31 29 20 2f 20 70 46 69  szChunk-1) / pFi
21430 6c 65 2d 3e 73 7a 43 68 75 6e 6b 29 20 2a 20 70  le->szChunk) * p
21440 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3b 0a 20  File->szChunk;. 
21450 20 20 20 69 66 28 20 6e 53 69 7a 65 3e 28 69 36     if( nSize>(i6
21460 34 29 62 75 66 2e 73 74 5f 73 69 7a 65 20 29 7b  4)buf.st_size ){
21470 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 48 41  ..#if defined(HA
21480 56 45 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f 43 41  VE_POSIX_FALLOCA
21490 54 45 29 20 26 26 20 48 41 56 45 5f 50 4f 53 49  TE) && HAVE_POSI
214a0 58 5f 46 41 4c 4c 4f 43 41 54 45 0a 20 20 20 20  X_FALLOCATE.    
214b0 20 20 2f 2a 20 54 68 65 20 63 6f 64 65 20 62 65    /* The code be
214c0 6c 6f 77 20 69 73 20 68 61 6e 64 6c 69 6e 67 20  low is handling 
214d0 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
214e0 20 6f 66 20 6f 73 46 61 6c 6c 6f 63 61 74 65 28   of osFallocate(
214f0 29 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 72 72  ) .      ** corr
21500 65 63 74 6c 79 2e 20 70 6f 73 69 78 5f 66 61 6c  ectly. posix_fal
21510 6c 6f 63 61 74 65 28 29 20 69 73 20 64 65 66 69  locate() is defi
21520 6e 65 64 20 74 6f 20 22 72 65 74 75 72 6e 73 20  ned to "returns 
21530 7a 65 72 6f 20 6f 6e 20 73 75 63 63 65 73 73 2c  zero on success,
21540 20 0a 20 20 20 20 20 20 2a 2a 20 6f 72 20 61 6e   .      ** or an
21550 20 65 72 72 6f 72 20 6e 75 6d 62 65 72 20 6f 6e   error number on
21560 20 20 66 61 69 6c 75 72 65 22 2e 20 53 65 65 20    failure". See 
21570 74 68 65 20 6d 61 6e 70 61 67 65 20 66 6f 72 20  the manpage for 
21580 64 65 74 61 69 6c 73 2e 20 2a 2f 0a 20 20 20 20  details. */.    
21590 20 20 69 6e 74 20 65 72 72 3b 0a 20 20 20 20 20    int err;.     
215a0 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 65 72 72   do{.        err
215b0 20 3d 20 6f 73 46 61 6c 6c 6f 63 61 74 65 28 70   = osFallocate(p
215c0 46 69 6c 65 2d 3e 68 2c 20 62 75 66 2e 73 74 5f  File->h, buf.st_
215d0 73 69 7a 65 2c 20 6e 53 69 7a 65 2d 62 75 66 2e  size, nSize-buf.
215e0 73 74 5f 73 69 7a 65 29 3b 0a 20 20 20 20 20 20  st_size);.      
215f0 7d 77 68 69 6c 65 28 20 65 72 72 3d 3d 45 49 4e  }while( err==EIN
21600 54 52 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  TR );.      if( 
21610 65 72 72 20 29 20 72 65 74 75 72 6e 20 53 51 4c  err ) return SQL
21620 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 3b  ITE_IOERR_WRITE;
21630 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 2f 2a 20  .#else.      /* 
21640 49 66 20 74 68 65 20 4f 53 20 64 6f 65 73 20 6e  If the OS does n
21650 6f 74 20 68 61 76 65 20 70 6f 73 69 78 5f 66 61  ot have posix_fa
21660 6c 6c 6f 63 61 74 65 28 29 2c 20 66 61 6b 65 20  llocate(), fake 
21670 69 74 2e 20 57 72 69 74 65 20 61 20 0a 20 20 20  it. Write a .   
21680 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20 62 79 74     ** single byt
21690 65 20 74 6f 20 74 68 65 20 6c 61 73 74 20 62 79  e to the last by
216a0 74 65 20 69 6e 20 65 61 63 68 20 62 6c 6f 63 6b  te in each block
216b0 20 74 68 61 74 20 66 61 6c 6c 73 20 65 6e 74 69   that falls enti
216c0 72 65 6c 79 0a 20 20 20 20 20 20 2a 2a 20 77 69  rely.      ** wi
216d0 74 68 69 6e 20 74 68 65 20 65 78 74 65 6e 64 65  thin the extende
216e0 64 20 72 65 67 69 6f 6e 2e 20 54 68 65 6e 2c 20  d region. Then, 
216f0 69 66 20 72 65 71 75 69 72 65 64 2c 20 61 20 73  if required, a s
21700 69 6e 67 6c 65 20 62 79 74 65 0a 20 20 20 20 20  ingle byte.     
21710 20 2a 2a 20 61 74 20 6f 66 66 73 65 74 20 28 6e   ** at offset (n
21720 53 69 7a 65 2d 31 29 2c 20 74 6f 20 73 65 74 20  Size-1), to set 
21730 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
21740 66 69 6c 65 20 63 6f 72 72 65 63 74 6c 79 2e 0a  file correctly..
21750 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73        ** This is
21760 20 61 20 73 69 6d 69 6c 61 72 20 74 65 63 68 6e   a similar techn
21770 69 71 75 65 20 74 6f 20 74 68 61 74 20 75 73 65  ique to that use
21780 64 20 62 79 20 67 6c 69 62 63 20 6f 6e 20 73 79  d by glibc on sy
21790 73 74 65 6d 73 0a 20 20 20 20 20 20 2a 2a 20 74  stems.      ** t
217a0 68 61 74 20 64 6f 20 6e 6f 74 20 68 61 76 65 20  hat do not have 
217b0 61 20 72 65 61 6c 20 66 61 6c 6c 6f 63 61 74 65  a real fallocate
217c0 28 29 20 63 61 6c 6c 2e 0a 20 20 20 20 20 20 2a  () call..      *
217d0 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 42 6c 6b  /.      int nBlk
217e0 20 3d 20 62 75 66 2e 73 74 5f 62 6c 6b 73 69 7a   = buf.st_blksiz
217f0 65 3b 20 20 2f 2a 20 46 69 6c 65 2d 73 79 73 74  e;  /* File-syst
21800 65 6d 20 62 6c 6f 63 6b 20 73 69 7a 65 20 2a 2f  em block size */
21810 0a 20 20 20 20 20 20 69 6e 74 20 6e 57 72 69 74  .      int nWrit
21820 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  e = 0;          
21830 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
21840 62 79 74 65 73 20 77 72 69 74 74 65 6e 20 62 79  bytes written by
21850 20 73 65 65 6b 41 6e 64 57 72 69 74 65 20 2a 2f   seekAndWrite */
21860 0a 20 20 20 20 20 20 69 36 34 20 69 57 72 69 74  .      i64 iWrit
21870 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
21880 20 20 20 2f 2a 20 4e 65 78 74 20 6f 66 66 73 65     /* Next offse
21890 74 20 74 6f 20 77 72 69 74 65 20 74 6f 20 2a 2f  t to write to */
218a0 0a 0a 20 20 20 20 20 20 69 66 28 20 72 6f 62 75  ..      if( robu
218b0 73 74 5f 66 74 72 75 6e 63 61 74 65 28 70 46 69  st_ftruncate(pFi
218c0 6c 65 2d 3e 68 2c 20 6e 53 69 7a 65 29 20 29 7b  le->h, nSize) ){
218d0 0a 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61  .        storeLa
218e0 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65  stErrno(pFile, e
218f0 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 72  rrno);.        r
21900 65 74 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72  eturn unixLogErr
21910 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
21920 54 52 55 4e 43 41 54 45 2c 20 22 66 74 72 75 6e  TRUNCATE, "ftrun
21930 63 61 74 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50  cate", pFile->zP
21940 61 74 68 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ath);.      }.  
21950 20 20 20 20 69 57 72 69 74 65 20 3d 20 28 28 62      iWrite = ((b
21960 75 66 2e 73 74 5f 73 69 7a 65 20 2b 20 32 2a 6e  uf.st_size + 2*n
21970 42 6c 6b 20 2d 20 31 29 2f 6e 42 6c 6b 29 2a 6e  Blk - 1)/nBlk)*n
21980 42 6c 6b 2d 31 3b 0a 20 20 20 20 20 20 61 73 73  Blk-1;.      ass
21990 65 72 74 28 20 69 57 72 69 74 65 3e 3d 62 75 66  ert( iWrite>=buf
219a0 2e 73 74 5f 73 69 7a 65 20 29 3b 0a 20 20 20 20  .st_size );.    
219b0 20 20 61 73 73 65 72 74 28 20 28 69 57 72 69 74    assert( (iWrit
219c0 65 2f 6e 42 6c 6b 29 3d 3d 28 28 62 75 66 2e 73  e/nBlk)==((buf.s
219d0 74 5f 73 69 7a 65 2b 6e 42 6c 6b 2d 31 29 2f 6e  t_size+nBlk-1)/n
219e0 42 6c 6b 29 20 29 3b 0a 20 20 20 20 20 20 61 73  Blk) );.      as
219f0 73 65 72 74 28 20 28 28 69 57 72 69 74 65 2b 31  sert( ((iWrite+1
21a00 29 25 6e 42 6c 6b 29 3d 3d 30 20 29 3b 0a 20 20  )%nBlk)==0 );.  
21a10 20 20 20 20 66 6f 72 28 2f 2a 6e 6f 2d 6f 70 2a      for(/*no-op*
21a20 2f 3b 20 69 57 72 69 74 65 3c 6e 53 69 7a 65 3b  /; iWrite<nSize;
21a30 20 69 57 72 69 74 65 2b 3d 6e 42 6c 6b 20 29 7b   iWrite+=nBlk ){
21a40 0a 20 20 20 20 20 20 20 20 6e 57 72 69 74 65 20  .        nWrite 
21a50 3d 20 73 65 65 6b 41 6e 64 57 72 69 74 65 28 70  = seekAndWrite(p
21a60 46 69 6c 65 2c 20 69 57 72 69 74 65 2c 20 22 22  File, iWrite, ""
21a70 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 1);.        if
21a80 28 20 6e 57 72 69 74 65 21 3d 31 20 29 20 72 65  ( nWrite!=1 ) re
21a90 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
21aa0 52 5f 57 52 49 54 45 3b 0a 20 20 20 20 20 20 7d  R_WRITE;.      }
21ab0 0a 20 20 20 20 20 20 69 66 28 20 6e 57 72 69 74  .      if( nWrit
21ac0 65 3d 3d 30 20 7c 7c 20 28 6e 53 69 7a 65 25 6e  e==0 || (nSize%n
21ad0 42 6c 6b 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Blk) ){.        
21ae0 6e 57 72 69 74 65 20 3d 20 73 65 65 6b 41 6e 64  nWrite = seekAnd
21af0 57 72 69 74 65 28 70 46 69 6c 65 2c 20 6e 53 69  Write(pFile, nSi
21b00 7a 65 2d 31 2c 20 22 22 2c 20 31 29 3b 0a 20 20  ze-1, "", 1);.  
21b10 20 20 20 20 20 20 69 66 28 20 6e 57 72 69 74 65        if( nWrite
21b20 21 3d 31 20 29 20 72 65 74 75 72 6e 20 53 51 4c  !=1 ) return SQL
21b30 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 3b  ITE_IOERR_WRITE;
21b40 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
21b50 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 20 53      }.  }..#if S
21b60 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
21b70 49 5a 45 3e 30 0a 20 20 69 66 28 20 70 46 69 6c  IZE>0.  if( pFil
21b80 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 3e 30  e->mmapSizeMax>0
21b90 20 26 26 20 6e 42 79 74 65 3e 70 46 69 6c 65 2d   && nByte>pFile-
21ba0 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20  >mmapSize ){.   
21bb0 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 69 66 28   int rc;.    if(
21bc0 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 3c   pFile->szChunk<
21bd0 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
21be0 72 6f 62 75 73 74 5f 66 74 72 75 6e 63 61 74 65  robust_ftruncate
21bf0 28 70 46 69 6c 65 2d 3e 68 2c 20 6e 42 79 74 65  (pFile->h, nByte
21c00 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69  ) ){.        pFi
21c10 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
21c20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 72  errno;.        r
21c30 65 74 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72  eturn unixLogErr
21c40 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
21c50 54 52 55 4e 43 41 54 45 2c 20 22 66 74 72 75 6e  TRUNCATE, "ftrun
21c60 63 61 74 65 22 2c 20 70 46 69 6c 65 2d 3e 7a 50  cate", pFile->zP
21c70 61 74 68 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ath);.      }.  
21c80 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 75 6e    }..    rc = un
21c90 69 78 4d 61 70 66 69 6c 65 28 70 46 69 6c 65 2c  ixMapfile(pFile,
21ca0 20 6e 42 79 74 65 29 3b 0a 20 20 20 20 72 65 74   nByte);.    ret
21cb0 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64  urn rc;.  }.#end
21cc0 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  if..  return SQL
21cd0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 23 69 66 20  ITE_OK;.}...#if 
21ce0 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41  (SQLITE_ENABLE_A
21cf0 50 50 4c 45 5f 53 50 49 3e 30 29 20 26 26 20 64  PPLE_SPI>0) && d
21d00 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
21d10 29 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69  ).#include "sqli
21d20 74 65 33 5f 70 72 69 76 61 74 65 2e 68 22 0a 23  te3_private.h".#
21d30 69 6e 63 6c 75 64 65 20 3c 63 6f 70 79 66 69 6c  include <copyfil
21d40 65 2e 68 3e 0a 73 74 61 74 69 63 20 69 6e 74 20  e.h>.static int 
21d50 67 65 74 44 62 50 61 74 68 46 6f 72 55 6e 69 78  getDbPathForUnix
21d60 46 69 6c 65 28 75 6e 69 78 46 69 6c 65 20 2a 70  File(unixFile *p
21d70 46 69 6c 65 2c 20 63 68 61 72 20 2a 64 62 50 61  File, char *dbPa
21d80 74 68 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66  th);.#endif..#if
21d90 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
21da0 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 73 74 61  OCKING_STYLE.sta
21db0 74 69 63 20 69 6e 74 20 69 73 50 72 6f 78 79 4c  tic int isProxyL
21dc0 6f 63 6b 69 6e 67 4d 6f 64 65 28 75 6e 69 78 46  ockingMode(unixF
21dd0 69 6c 65 20 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a  ile *);.#endif..
21de0 23 69 66 20 28 53 51 4c 49 54 45 5f 45 4e 41 42  #if (SQLITE_ENAB
21df0 4c 45 5f 41 50 50 4c 45 5f 53 50 49 3e 30 29 20  LE_APPLE_SPI>0) 
21e00 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  && defined(__APP
21e10 4c 45 5f 5f 29 0a 73 74 61 74 69 63 20 69 6e 74  LE__).static int
21e20 20 75 6e 69 78 54 72 75 6e 63 61 74 65 44 61 74   unixTruncateDat
21e30 61 62 61 73 65 28 75 6e 69 78 46 69 6c 65 20 2a  abase(unixFile *
21e40 2c 20 69 6e 74 29 3b 0a 0a 73 74 61 74 69 63 20  , int);..static 
21e50 69 6e 74 20 75 6e 69 78 49 6e 76 61 6c 69 64 61  int unixInvalida
21e60 74 65 53 75 70 70 6f 72 74 46 69 6c 65 73 28 75  teSupportFiles(u
21e70 6e 69 78 46 69 6c 65 20 2a 2c 20 69 6e 74 29 3b  nixFile *, int);
21e80 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6e  ..static int fin
21e90 64 43 72 65 61 74 65 46 69 6c 65 4d 6f 64 65 28  dCreateFileMode(
21ea0 63 6f 6e 73 74 20 63 68 61 72 20 2a 2c 20 69 6e  const char *, in
21eb0 74 2c 20 6d 6f 64 65 5f 74 2a 2c 20 75 69 64 5f  t, mode_t*, uid_
21ec0 74 20 2a 2c 67 69 64 5f 74 20 2a 29 3b 0a 0a 2f  t *,gid_t *);../
21ed0 2a 20 6f 70 65 6e 73 20 61 20 72 65 61 64 2f 77  * opens a read/w
21ee0 72 69 74 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  rite connection 
21ef0 74 6f 20 61 20 66 69 6c 65 20 7a 4e 61 6d 65 20  to a file zName 
21f00 69 6e 68 65 72 69 74 69 6e 67 20 74 68 65 20 61  inheriting the a
21f10 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a 20 75 73  ppropriate.** us
21f20 65 72 2f 70 65 72 6d 73 20 66 72 6f 6d 20 74 68  er/perms from th
21f30 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
21f40 69 66 20 72 75 6e 6e 69 6e 67 20 61 73 20 72 6f  if running as ro
21f50 6f 74 2e 20 20 52 65 74 75 72 6e 73 20 74 68 65  ot.  Returns the
21f60 20 66 69 6c 65 20 0a 2a 2a 20 64 65 73 63 72 69   file .** descri
21f70 70 74 6f 72 20 62 79 20 72 65 66 65 72 65 6e 63  ptor by referenc
21f80 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  e.*/.static int 
21f90 75 6e 69 78 4f 70 65 6e 43 68 69 6c 64 46 69 6c  unixOpenChildFil
21fa0 65 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  e(.  const char 
21fb0 2a 7a 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 6f 70  *zName,.  int op
21fc0 65 6e 46 6c 61 67 73 2c 0a 20 20 69 6e 74 20 64  enFlags,.  int d
21fd0 62 4f 70 65 6e 46 6c 61 67 73 2c 0a 20 20 69 6e  bOpenFlags,.  in
21fe0 74 20 70 72 6f 74 46 6c 61 67 73 2c 0a 20 20 69  t protFlags,.  i
21ff0 6e 74 20 2a 70 46 64 0a 29 7b 0a 20 20 69 6e 74  nt *pFd.){.  int
22000 20 66 64 20 3d 20 2d 31 3b 0a 20 20 6d 6f 64 65   fd = -1;.  mode
22010 5f 74 20 6f 70 65 6e 4d 6f 64 65 3b 20 20 20 20  _t openMode;    
22020 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 65 72            /* Per
22030 6d 69 73 73 69 6f 6e 73 20 74 6f 20 63 72 65 61  missions to crea
22040 74 65 20 66 69 6c 65 20 77 69 74 68 20 2a 2f 0a  te file with */.
22050 20 20 75 69 64 5f 74 20 75 69 64 3b 20 20 20 20    uid_t uid;    
22060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22070 2f 2a 20 55 73 65 72 69 64 20 66 6f 72 20 74 68  /* Userid for th
22080 65 20 66 69 6c 65 20 2a 2f 0a 20 20 67 69 64 5f  e file */.  gid_
22090 74 20 67 69 64 3b 20 20 20 20 20 20 20 20 20 20  t gid;          
220a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 72 6f            /* Gro
220b0 75 70 69 64 20 66 6f 72 20 74 68 65 20 66 69 6c  upid for the fil
220c0 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 20  e */.  int rc;. 
220d0 20 0a 20 20 61 73 73 65 72 74 28 70 46 64 21 3d   .  assert(pFd!=
220e0 4e 55 4c 4c 29 3b 0a 20 20 72 63 20 3d 20 66 69  NULL);.  rc = fi
220f0 6e 64 43 72 65 61 74 65 46 69 6c 65 4d 6f 64 65  ndCreateFileMode
22100 28 7a 4e 61 6d 65 2c 20 64 62 4f 70 65 6e 46 6c  (zName, dbOpenFl
22110 61 67 73 2c 20 26 6f 70 65 6e 4d 6f 64 65 2c 20  ags, &openMode, 
22120 26 75 69 64 2c 20 26 67 69 64 29 3b 0a 20 20 69  &uid, &gid);.  i
22130 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
22140 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
22150 63 3b 0a 20 20 7d 0a 20 20 66 64 20 3d 20 72 6f  c;.  }.  fd = ro
22160 62 75 73 74 5f 6f 70 65 6e 28 7a 4e 61 6d 65 2c  bust_open(zName,
22170 20 6f 70 65 6e 46 6c 61 67 73 2c 20 6f 70 65 6e   openFlags, open
22180 4d 6f 64 65 29 3b 0a 20 20 4f 53 54 52 41 43 45  Mode);.  OSTRACE
22190 28 28 22 4f 50 45 4e 58 20 20 20 25 2d 33 64 20  (("OPENX   %-3d 
221a0 25 73 20 30 25 6f 5c 6e 22 2c 20 66 64 2c 20 7a  %s 0%o\n", fd, z
221b0 4e 61 6d 65 2c 20 6f 70 65 6e 46 6c 61 67 73 29  Name, openFlags)
221c0 29 3b 0a 20 20 69 66 28 20 66 64 3c 30 20 29 7b  );.  if( fd<0 ){
221d0 0a 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f  .    rc = unixLo
221e0 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41  gError(SQLITE_CA
221f0 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c 20 22 6f 70  NTOPEN_BKPT, "op
22200 65 6e 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  en", zName);.   
22210 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
22220 20 20 2f 2a 20 69 66 20 77 65 27 72 65 20 6f 70    /* if we're op
22230 65 6e 69 6e 67 20 74 68 65 20 77 61 6c 20 6f 72  ening the wal or
22240 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 72 75 6e   journal and run
22250 6e 69 6e 67 20 61 73 20 72 6f 6f 74 2c 20 73 65  ning as root, se
22260 74 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  t.  ** the journ
22270 61 6c 20 75 69 64 2f 67 69 64 20 2a 2f 0a 20 20  al uid/gid */.  
22280 69 66 28 20 64 62 4f 70 65 6e 46 6c 61 67 73 20  if( dbOpenFlags 
22290 26 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57  & (SQLITE_OPEN_W
222a0 41 4c 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  AL|SQLITE_OPEN_M
222b0 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 20 29 7b 0a  AIN_JOURNAL) ){.
222c0 20 20 20 20 75 69 64 5f 74 20 65 75 69 64 20 3d      uid_t euid =
222d0 20 67 65 74 65 75 69 64 28 29 3b 0a 20 20 20 20   geteuid();.    
222e0 69 66 28 20 65 75 69 64 3d 3d 30 20 26 26 20 28  if( euid==0 && (
222f0 65 75 69 64 21 3d 75 69 64 20 7c 7c 20 67 65 74  euid!=uid || get
22300 65 67 69 64 28 29 21 3d 67 69 64 29 20 29 7b 0a  egid()!=gid) ){.
22310 20 20 20 20 20 20 69 66 28 20 66 63 68 6f 77 6e        if( fchown
22320 28 66 64 2c 20 75 69 64 2c 20 67 69 64 29 20 29  (fd, uid, gid) )
22330 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
22340 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42  QLITE_CANTOPEN_B
22350 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  KPT;.      }.   
22360 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d   }.  }.  if( rc=
22370 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
22380 20 20 2a 70 46 64 20 3d 20 66 64 3b 0a 20 20 7d    *pFd = fd;.  }
22390 20 65 6c 73 65 20 7b 0a 20 20 20 20 2a 70 46 64   else {.    *pFd
223a0 20 3d 20 2d 31 3b 0a 20 20 20 20 63 6c 6f 73 65   = -1;.    close
223b0 28 66 64 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  (fd);.  }.  retu
223c0 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63  rn rc;.}..static
223d0 20 69 6e 74 20 75 6e 69 78 52 65 70 6c 61 63 65   int unixReplace
223e0 44 61 74 61 62 61 73 65 28 75 6e 69 78 46 69 6c  Database(unixFil
223f0 65 20 2a 70 46 69 6c 65 2c 20 73 71 6c 69 74 65  e *pFile, sqlite
22400 33 20 2a 73 72 63 64 62 29 20 7b 0a 20 20 73 71  3 *srcdb) {.  sq
22410 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 20 3d  lite3_file *id =
22420 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a   (sqlite3_file *
22430 29 70 46 69 6c 65 3b 0a 20 20 42 74 72 65 65 20  )pFile;.  Btree 
22440 2a 70 53 72 63 42 74 72 65 65 20 3d 20 4e 55 4c  *pSrcBtree = NUL
22450 4c 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  L;.  sqlite3_fil
22460 65 20 2a 73 72 63 5f 66 69 6c 65 20 3d 20 4e 55  e *src_file = NU
22470 4c 4c 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  LL;.  unixFile *
22480 70 53 72 63 46 69 6c 65 20 3d 20 4e 55 4c 4c 3b  pSrcFile = NULL;
22490 0a 20 20 63 68 61 72 20 73 72 63 57 61 6c 50 61  .  char srcWalPa
224a0 74 68 5b 4d 41 58 50 41 54 48 4c 45 4e 2b 35 5d  th[MAXPATHLEN+5]
224b0 3b 0a 20 20 69 6e 74 20 73 72 63 57 61 6c 46 44  ;.  int srcWalFD
224c0 20 3d 20 2d 31 3b 0a 20 20 69 6e 74 20 72 63 20   = -1;.  int rc 
224d0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 76  = SQLITE_OK;.  v
224e0 6f 69 64 20 2a 70 4c 6f 63 6b 20 3d 20 4e 55 4c  oid *pLock = NUL
224f0 4c 3b 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 3d  L;.  int flags =
22500 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 73   0;.  sqlite3 *s
22510 72 63 64 62 32 20 3d 20 4e 55 4c 4c 3b 0a 20 20  rcdb2 = NULL;.  
22520 63 6f 70 79 66 69 6c 65 5f 73 74 61 74 65 5f 74  copyfile_state_t
22530 20 73 3b 0a 20 20 69 6e 74 20 63 6f 72 72 75 70   s;.  int corrup
22540 74 53 72 63 46 69 6c 65 4c 6f 63 6b 20 3d 20 30  tSrcFileLock = 0
22550 3b 0a 20 20 69 6e 74 20 63 6f 72 72 75 70 74 44  ;.  int corruptD
22560 73 74 46 69 6c 65 4c 6f 63 6b 20 3d 20 30 3b 0a  stFileLock = 0;.
22570 20 20 69 6e 74 20 69 73 53 72 63 43 6f 72 72 75    int isSrcCorru
22580 70 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 73  pt = 0;.  int is
22590 44 73 74 43 6f 72 72 75 70 74 20 3d 20 30 3b 0a  DstCorrupt = 0;.
225a0 20 20 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65    .  if( !sqlite
225b0 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 73  3SafetyCheckOk(s
225c0 72 63 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74  rcdb) ){.    ret
225d0 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
225e0 45 3b 0a 20 20 7d 0a 20 20 20 20 0a 23 69 66 20  E;.  }.    .#if 
225f0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44 41  SQLITE_ENABLE_DA
22600 54 41 5f 50 52 4f 54 45 43 54 49 4f 4e 0a 20 20  TA_PROTECTION.  
22610 66 6c 61 67 73 20 7c 3d 20 70 46 69 6c 65 2d 3e  flags |= pFile->
22620 70 72 6f 74 46 6c 61 67 73 3b 0a 23 65 6e 64 69  protFlags;.#endi
22630 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  f.#if SQLITE_ENA
22640 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
22650 45 0a 20 20 69 66 28 20 69 73 50 72 6f 78 79 4c  E.  if( isProxyL
22660 6f 63 6b 69 6e 67 4d 6f 64 65 28 70 46 69 6c 65  ockingMode(pFile
22670 29 20 29 7b 0a 20 20 20 20 66 6c 61 67 73 20 7c  ) ){.    flags |
22680 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 41 55  = SQLITE_OPEN_AU
22690 54 4f 50 52 4f 58 59 3b 0a 20 20 7d 0a 23 65 6e  TOPROXY;.  }.#en
226a0 64 69 66 0a 20 20 0a 20 20 72 63 20 3d 20 73 71  dif.  .  rc = sq
226b0 6c 69 74 65 33 64 65 6d 6f 5f 73 75 70 65 72 6c  lite3demo_superl
226c0 6f 63 6b 28 70 46 69 6c 65 2d 3e 7a 50 61 74 68  ock(pFile->zPath
226d0 2c 20 30 2c 20 66 6c 61 67 73 2c 20 30 2c 20 30  , 0, flags, 0, 0
226e0 2c 20 26 70 4c 6f 63 6b 29 3b 0a 20 20 69 66 28  , &pLock);.  if(
226f0 20 72 63 20 29 7b 0a 20 20 20 20 69 66 28 20 72   rc ){.    if( r
22700 63 3d 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  c==SQLITE_CORRUP
22710 54 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f  T || rc==SQLITE_
22720 4e 4f 54 41 44 42 20 29 7b 0a 20 20 20 20 20 20  NOTADB ){.      
22730 69 73 44 73 74 43 6f 72 72 75 70 74 20 3d 20 31  isDstCorrupt = 1
22740 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
22750 69 74 65 33 64 65 6d 6f 5f 73 75 70 65 72 6c 6f  ite3demo_superlo
22760 63 6b 5f 63 6f 72 72 75 70 74 28 69 64 2c 20 53  ck_corrupt(id, S
22770 51 4c 49 54 45 5f 4c 4f 43 4b 5f 45 58 43 4c 55  QLITE_LOCK_EXCLU
22780 53 49 56 45 2c 0a 20 20 20 20 20 20 20 20 20 20  SIVE,.          
22790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
227a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
227b0 63 6f 72 72 75 70 74 44 73 74 46 69 6c 65 4c 6f  corruptDstFileLo
227c0 63 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ck);.    }.    i
227d0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72  f( rc ){.      r
227e0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
227f0 20 20 7d 0a 20 20 2f 2a 20 67 65 74 20 74 68 65    }.  /* get the
22800 20 73 72 63 20 66 69 6c 65 20 64 65 73 63 72 69   src file descri
22810 70 74 6f 72 20 61 64 68 65 72 69 6e 67 20 74 6f  ptor adhering to
22820 20 74 68 65 20 64 62 20 73 74 72 75 63 74 20 61   the db struct a
22830 63 63 65 73 73 20 72 75 6c 65 73 20 0a 20 20 20  ccess rules .   
22840 2a 2a 20 74 68 69 73 20 63 6f 64 65 20 69 73 20  ** this code is 
22850 6d 6f 64 65 6c 65 64 20 61 66 74 65 72 20 73 71  modeled after sq
22860 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72  lite3_file_contr
22870 6f 6c 28 29 20 69 6e 20 6d 61 69 6e 2e 63 0a 20  ol() in main.c. 
22880 20 20 2a 2f 20 0a 20 20 73 71 6c 69 74 65 33 5f    */ .  sqlite3_
22890 6d 75 74 65 78 5f 65 6e 74 65 72 28 73 72 63 64  mutex_enter(srcd
228a0 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28  b->mutex);.  if(
228b0 20 73 72 63 64 62 2d 3e 6e 44 62 3e 30 20 29 7b   srcdb->nDb>0 ){
228c0 0a 20 20 20 20 70 53 72 63 42 74 72 65 65 20 3d  .    pSrcBtree =
228d0 20 73 72 63 64 62 2d 3e 61 44 62 5b 30 5d 2e 70   srcdb->aDb[0].p
228e0 42 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53  Bt;.  }.  if( pS
228f0 72 63 42 74 72 65 65 20 29 7b 0a 20 20 20 20 50  rcBtree ){.    P
22900 61 67 65 72 20 2a 70 53 72 63 50 61 67 65 72 3b  ager *pSrcPager;
22910 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
22920 65 45 6e 74 65 72 28 70 53 72 63 42 74 72 65 65  eEnter(pSrcBtree
22930 29 3b 0a 20 20 20 20 70 53 72 63 50 61 67 65 72  );.    pSrcPager
22940 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50   = sqlite3BtreeP
22950 61 67 65 72 28 70 53 72 63 42 74 72 65 65 29 3b  ager(pSrcBtree);
22960 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 53 72  .    assert( pSr
22970 63 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 20  cPager!=0 );.   
22980 20 73 72 63 5f 66 69 6c 65 20 3d 20 73 71 6c 69   src_file = sqli
22990 74 65 33 50 61 67 65 72 46 69 6c 65 28 70 53 72  te3PagerFile(pSr
229a0 63 50 61 67 65 72 29 3b 0a 20 20 20 20 61 73 73  cPager);.    ass
229b0 65 72 74 28 20 73 72 63 5f 66 69 6c 65 21 3d 30  ert( src_file!=0
229c0 20 29 3b 0a 20 20 20 20 69 66 28 20 73 72 63 5f   );.    if( src_
229d0 66 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 73 20 29  file->pMethods )
229e0 7b 0a 20 20 20 20 20 20 69 6e 74 20 73 72 63 46  {.      int srcF
229f0 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  lags = 0;.      
22a00 70 53 72 63 46 69 6c 65 20 3d 20 28 75 6e 69 78  pSrcFile = (unix
22a10 46 69 6c 65 20 2a 29 73 72 63 5f 66 69 6c 65 3b  File *)src_file;
22a20 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
22a30 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
22a40 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f 41 50   || defined(__AP
22a50 50 4c 45 5f 5f 29 0a 20 20 20 20 20 20 69 66 20  PLE__).      if 
22a60 28 28 70 53 72 63 46 69 6c 65 2d 3e 6f 70 65 6e  ((pSrcFile->open
22a70 46 6c 61 67 73 20 26 20 4f 5f 52 44 57 52 29 20  Flags & O_RDWR) 
22a80 3d 3d 20 4f 5f 52 44 57 52 29 20 7b 0a 20 20 20  == O_RDWR) {.   
22a90 20 20 20 20 20 73 72 63 46 6c 61 67 73 20 3d 20       srcFlags = 
22aa0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
22ab0 57 52 49 54 45 3b 0a 20 20 20 20 20 20 7d 20 65  WRITE;.      } e
22ac0 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 73 72  lse {.        sr
22ad0 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f  cFlags = SQLITE_
22ae0 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  OPEN_READONLY;. 
22af0 20 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20       }.#else.   
22b00 20 20 20 73 72 63 46 6c 61 67 73 20 3d 20 53 51     srcFlags = SQ
22b10 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
22b20 49 54 45 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  ITE;.#endif.#if 
22b30 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44 41  SQLITE_ENABLE_DA
22b40 54 41 5f 50 52 4f 54 45 43 54 49 4f 4e 0a 20 20  TA_PROTECTION.  
22b50 20 20 20 20 73 72 63 46 6c 61 67 73 20 7c 3d 20      srcFlags |= 
22b60 70 53 72 63 46 69 6c 65 2d 3e 70 72 6f 74 46 6c  pSrcFile->protFl
22b70 61 67 73 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  ags;.#endif.#if 
22b80 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
22b90 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20  CKING_STYLE.    
22ba0 20 20 69 66 28 20 69 73 50 72 6f 78 79 4c 6f 63    if( isProxyLoc
22bb0 6b 69 6e 67 4d 6f 64 65 28 70 53 72 63 46 69 6c  kingMode(pSrcFil
22bc0 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 72  e) ){.        sr
22bd0 63 46 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45  cFlags |= SQLITE
22be0 5f 4f 50 45 4e 5f 41 55 54 4f 50 52 4f 58 59 3b  _OPEN_AUTOPROXY;
22bf0 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
22c00 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
22c10 65 33 5f 6f 70 65 6e 5f 76 32 28 70 53 72 63 46  e3_open_v2(pSrcF
22c20 69 6c 65 2d 3e 7a 50 61 74 68 2c 20 26 73 72 63  ile->zPath, &src
22c30 64 62 32 2c 20 73 72 63 46 6c 61 67 73 2c 20 30  db2, srcFlags, 0
22c40 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
22c50 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
22c60 20 20 20 20 20 20 2f 2a 20 73 74 61 72 74 20 61        /* start a
22c70 20 64 65 66 65 72 72 65 64 20 74 72 61 6e 73 61   deferred transa
22c80 63 74 69 6f 6e 20 61 6e 64 20 72 65 61 64 20 74  ction and read t
22c90 6f 20 65 73 74 61 62 6c 69 73 68 20 61 20 72 65  o establish a re
22ca0 61 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20  ad lock */.     
22cb0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
22cc0 65 78 65 63 28 73 72 63 64 62 32 2c 20 22 42 45  exec(srcdb2, "BE
22cd0 47 49 4e 20 44 45 46 45 52 52 45 44 3b 20 50 52  GIN DEFERRED; PR
22ce0 41 47 4d 41 20 73 63 68 65 6d 61 5f 76 65 72 73  AGMA schema_vers
22cf0 69 6f 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  ion",.          
22d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22d10 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  0, 0, 0);.      
22d20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
22d30 5f 43 4f 52 52 55 50 54 20 7c 7c 20 72 63 3d 3d  _CORRUPT || rc==
22d40 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 20 29 7b  SQLITE_NOTADB ){
22d50 0a 20 20 20 20 20 20 20 20 20 20 69 73 53 72 63  .          isSrc
22d60 43 6f 72 72 75 70 74 20 3d 20 31 3b 0a 20 20 20  Corrupt = 1;.   
22d70 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
22d80 74 65 33 64 65 6d 6f 5f 73 75 70 65 72 6c 6f 63  te3demo_superloc
22d90 6b 5f 63 6f 72 72 75 70 74 28 73 72 63 5f 66 69  k_corrupt(src_fi
22da0 6c 65 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f  le, SQLITE_LOCK_
22db0 53 48 41 52 45 44 2c 0a 20 20 20 20 20 20 20 20  SHARED,.        
22dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22de0 20 20 20 20 20 26 63 6f 72 72 75 70 74 53 72 63       &corruptSrc
22df0 46 69 6c 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 20  FileLock);.     
22e00 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
22e10 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 21 73 72   }.  }.  if( !sr
22e20 63 64 62 32 20 7c 7c 20 70 53 72 63 46 69 6c 65  cdb2 || pSrcFile
22e30 3d 3d 4e 55 4c 4c 20 7c 7c 20 70 53 72 63 46 69  ==NULL || pSrcFi
22e40 6c 65 2d 3e 68 3c 30 29 7b 0a 20 20 20 20 72 63  le->h<0){.    rc
22e50 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e   = SQLITE_INTERN
22e60 41 4c 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  AL;.  }.  if( rc
22e70 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
22e80 20 20 20 67 6f 74 6f 20 65 6e 64 5f 72 65 70 6c     goto end_repl
22e90 61 63 65 5f 64 61 74 61 62 61 73 65 3b 0a 20 20  ace_database;.  
22ea0 7d 0a 20 20 2f 2a 20 62 6f 74 68 20 64 61 74 61  }.  /* both data
22eb0 62 61 73 65 73 20 61 72 65 20 6c 6f 63 6b 65 64  bases are locked
22ec0 20 61 70 70 72 6f 70 72 69 61 74 65 6c 79 2c 20   appropriately, 
22ed0 63 6f 70 79 20 74 68 65 20 73 72 63 20 77 61 6c  copy the src wal
22ee0 20 6a 6f 75 72 6e 61 6c 20 69 66 20 0a 20 20 20   journal if .   
22ef0 2a 2a 20 6f 6e 65 20 65 78 69 73 74 73 20 61 6e  ** one exists an
22f00 64 20 74 68 65 6e 20 74 68 65 20 61 63 74 75 61  d then the actua
22f10 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a  l database file.
22f20 20 20 20 2a 2f 0a 20 20 73 74 72 6c 63 70 79 28     */.  strlcpy(
22f30 73 72 63 57 61 6c 50 61 74 68 2c 20 70 53 72 63  srcWalPath, pSrc
22f40 46 69 6c 65 2d 3e 7a 50 61 74 68 2c 20 4d 41 58  File->zPath, MAX
22f50 50 41 54 48 4c 45 4e 2b 35 29 3b 0a 20 20 73 74  PATHLEN+5);.  st
22f60 72 6c 63 61 74 28 73 72 63 57 61 6c 50 61 74 68  rlcat(srcWalPath
22f70 2c 20 22 2d 77 61 6c 22 2c 20 4d 41 58 50 41 54  , "-wal", MAXPAT
22f80 48 4c 45 4e 2b 35 29 3b 0a 20 20 73 72 63 57 61  HLEN+5);.  srcWa
22f90 6c 46 44 20 3d 20 6f 70 65 6e 28 73 72 63 57 61  lFD = open(srcWa
22fa0 6c 50 61 74 68 2c 20 4f 5f 52 44 4f 4e 4c 59 29  lPath, O_RDONLY)
22fb0 3b 0a 20 20 69 66 28 20 21 28 73 72 63 57 61 6c  ;.  if( !(srcWal
22fc0 46 44 3c 30 29 20 29 7b 0a 20 20 20 20 63 68 61  FD<0) ){.    cha
22fd0 72 20 64 73 74 57 61 6c 50 61 74 68 5b 4d 41 58  r dstWalPath[MAX
22fe0 50 41 54 48 4c 45 4e 2b 35 5d 3b 0a 20 20 20 20  PATHLEN+5];.    
22ff0 69 6e 74 20 64 73 74 57 61 6c 46 44 20 3d 20 2d  int dstWalFD = -
23000 31 3b 0a 20 20 20 20 69 6e 74 20 70 72 6f 74 46  1;.    int protF
23010 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20 20 73 74  lags = 0;.    st
23020 72 6c 63 70 79 28 64 73 74 57 61 6c 50 61 74 68  rlcpy(dstWalPath
23030 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 2c 20  , pFile->zPath, 
23040 4d 41 58 50 41 54 48 4c 45 4e 2b 35 29 3b 0a 20  MAXPATHLEN+5);. 
23050 20 20 20 73 74 72 6c 63 61 74 28 64 73 74 57 61     strlcat(dstWa
23060 6c 50 61 74 68 2c 20 22 2d 77 61 6c 22 2c 20 4d  lPath, "-wal", M
23070 41 58 50 41 54 48 4c 45 4e 2b 35 29 3b 0a 0a 20  AXPATHLEN+5);.. 
23080 20 20 20 72 63 20 3d 20 75 6e 69 78 4f 70 65 6e     rc = unixOpen
23090 43 68 69 6c 64 46 69 6c 65 28 64 73 74 57 61 6c  ChildFile(dstWal
230a0 50 61 74 68 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43  Path, O_RDWR|O_C
230b0 52 45 41 54 2c 20 53 51 4c 49 54 45 5f 4f 50 45  REAT, SQLITE_OPE
230c0 4e 5f 57 41 4c 2c 0a 20 20 20 20 20 20 20 20 20  N_WAL,.         
230d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
230e0 20 20 70 72 6f 74 46 6c 61 67 73 2c 20 26 64 73    protFlags, &ds
230f0 74 57 61 6c 46 44 29 3b 0a 20 20 20 20 69 66 28  tWalFD);.    if(
23100 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
23110 7b 0a 20 20 20 20 20 20 73 20 3d 20 63 6f 70 79  {.      s = copy
23120 66 69 6c 65 5f 73 74 61 74 65 5f 61 6c 6c 6f 63  file_state_alloc
23130 28 29 3b 0a 20 20 20 20 20 20 6c 73 65 65 6b 28  ();.      lseek(
23140 73 72 63 57 61 6c 46 44 2c 20 30 2c 20 53 45 45  srcWalFD, 0, SEE
23150 4b 5f 53 45 54 29 3b 0a 20 20 20 20 20 20 6c 73  K_SET);.      ls
23160 65 65 6b 28 64 73 74 57 61 6c 46 44 2c 20 30 2c  eek(dstWalFD, 0,
23170 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20 20 20 20   SEEK_SET);.    
23180 20 20 69 66 28 20 66 63 6f 70 79 66 69 6c 65 28    if( fcopyfile(
23190 73 72 63 57 61 6c 46 44 2c 20 64 73 74 57 61 6c  srcWalFD, dstWal
231a0 46 44 2c 20 73 2c 20 43 4f 50 59 46 49 4c 45 5f  FD, s, COPYFILE_
231b0 44 41 54 41 29 20 29 7b 0a 20 20 20 20 20 20 20  DATA) ){.       
231c0 20 69 6e 74 20 65 72 72 3d 65 72 72 6e 6f 3b 0a   int err=errno;.
231d0 20 20 20 20 20 20 20 20 73 77 69 74 63 68 28 65          switch(e
231e0 72 72 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  rr) {.          
231f0 63 61 73 65 20 45 4e 4f 4d 45 4d 3a 0a 20 20 20  case ENOMEM:.   
23200 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
23210 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
23220 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
23230 20 20 20 20 20 20 20 20 20 64 65 66 61 75 6c 74           default
23240 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 74  :.            st
23250 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69  oreLastErrno(pFi
23260 6c 65 2c 20 65 72 72 29 3b 0a 20 20 20 20 20 20  le, err);.      
23270 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
23280 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20 20 20 20  E_IOERR;.       
23290 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
232a0 20 63 6f 70 79 66 69 6c 65 5f 73 74 61 74 65 5f   copyfile_state_
232b0 66 72 65 65 28 73 29 3b 0a 20 20 20 20 20 20 63  free(s);.      c
232c0 6c 6f 73 65 28 64 73 74 57 61 6c 46 44 29 3b 0a  lose(dstWalFD);.
232d0 20 20 20 20 7d 0a 20 20 20 20 63 6c 6f 73 65 28      }.    close(
232e0 73 72 63 57 61 6c 46 44 29 3b 0a 20 20 7d 0a 20  srcWalFD);.  }. 
232f0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
23300 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 62 65 66  OK ){.    /* bef
23310 6f 72 65 20 77 65 20 63 6f 70 79 2c 20 65 6e 73  ore we copy, ens
23320 75 72 65 20 74 68 61 74 20 74 68 65 20 66 69 6c  ure that the fil
23330 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72  e change counter
23340 20 77 69 6c 6c 20 62 65 20 6d 6f 64 69 66 69 65   will be modifie
23350 64 20 2a 2f 0a 20 20 20 20 75 69 6e 74 33 32 5f  d */.    uint32_
23360 74 20 73 72 63 43 68 61 6e 67 65 20 3d 20 30 3b  t srcChange = 0;
23370 0a 20 20 20 20 75 69 6e 74 33 32 5f 74 20 64 73  .    uint32_t ds
23380 74 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20  tChange = 0;.   
23390 20 70 72 65 61 64 28 70 53 72 63 46 69 6c 65 2d   pread(pSrcFile-
233a0 3e 68 2c 20 26 73 72 63 43 68 61 6e 67 65 2c 20  >h, &srcChange, 
233b0 34 2c 20 32 34 29 3b 0a 20 20 20 20 70 72 65 61  4, 24);.    prea
233c0 64 28 70 46 69 6c 65 2d 3e 68 2c 20 26 64 73 74  d(pFile->h, &dst
233d0 43 68 61 6e 67 65 2c 20 34 2c 20 32 34 29 3b 0a  Change, 4, 24);.
233e0 20 20 20 20 0a 20 20 20 20 2f 2a 20 63 6f 70 79      .    /* copy
233f0 20 74 68 65 20 61 63 74 75 61 6c 20 64 61 74 61   the actual data
23400 62 61 73 65 20 2a 2f 0a 20 20 20 20 73 20 3d 20  base */.    s = 
23410 63 6f 70 79 66 69 6c 65 5f 73 74 61 74 65 5f 61  copyfile_state_a
23420 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 6c 73 65 65  lloc();.    lsee
23430 6b 28 70 53 72 63 46 69 6c 65 2d 3e 68 2c 20 30  k(pSrcFile->h, 0
23440 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20 20 20  , SEEK_SET);.   
23450 20 6c 73 65 65 6b 28 70 46 69 6c 65 2d 3e 68 2c   lseek(pFile->h,
23460 20 30 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20   0, SEEK_SET);. 
23470 20 20 20 69 66 28 20 66 63 6f 70 79 66 69 6c 65     if( fcopyfile
23480 28 70 53 72 63 46 69 6c 65 2d 3e 68 2c 20 70 46  (pSrcFile->h, pF
23490 69 6c 65 2d 3e 68 2c 20 73 2c 20 43 4f 50 59 46  ile->h, s, COPYF
234a0 49 4c 45 5f 44 41 54 41 29 20 29 7b 0a 20 20 20  ILE_DATA) ){.   
234b0 20 20 20 69 6e 74 20 65 72 72 3d 65 72 72 6e 6f     int err=errno
234c0 3b 0a 20 20 20 20 20 20 73 77 69 74 63 68 28 65  ;.      switch(e
234d0 72 72 29 20 7b 0a 20 20 20 20 20 20 20 20 63 61  rr) {.        ca
234e0 73 65 20 45 4e 4f 4d 45 4d 3a 0a 20 20 20 20 20  se ENOMEM:.     
234f0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
23500 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20  _NOMEM;.        
23510 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
23520 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20   default:.      
23530 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72      storeLastErr
23540 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72 29 3b 0a  no(pFile, err);.
23550 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
23560 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20  QLITE_IOERR;.   
23570 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 63     }.    }.    c
23580 6f 70 79 66 69 6c 65 5f 73 74 61 74 65 5f 66 72  opyfile_state_fr
23590 65 65 28 73 29 3b 0a 20 20 20 20 0a 20 20 20 20  ee(s);.    .    
235a0 69 66 20 28 73 72 63 43 68 61 6e 67 65 20 3d 3d  if (srcChange ==
235b0 20 64 73 74 43 68 61 6e 67 65 29 20 7b 0a 20 20   dstChange) {.  
235c0 20 20 20 20 2f 2a 20 6d 6f 64 69 66 79 20 74 68      /* modify th
235d0 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72  e change counter
235e0 20 74 6f 20 66 6f 72 63 65 20 70 61 67 65 20 7a   to force page z
235f0 65 72 6f 20 74 6f 20 62 65 20 72 65 6c 6f 61 64  ero to be reload
23600 65 64 20 2a 2f 0a 20 20 20 20 20 20 64 73 74 43  ed */.      dstC
23610 68 61 6e 67 65 20 2b 2b 3b 0a 20 20 20 20 20 20  hange ++;.      
23620 70 77 72 69 74 65 28 70 46 69 6c 65 2d 3e 68 2c  pwrite(pFile->h,
23630 20 26 64 73 74 43 68 61 6e 67 65 2c 20 34 2c 20   &dstChange, 4, 
23640 32 34 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  24);.    }.  }. 
23650 20 69 66 28 20 69 73 53 72 63 43 6f 72 72 75 70   if( isSrcCorrup
23660 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
23670 64 65 6d 6f 5f 73 75 70 65 72 75 6e 6c 6f 63 6b  demo_superunlock
23680 5f 63 6f 72 72 75 70 74 28 73 72 63 5f 66 69 6c  _corrupt(src_fil
23690 65 2c 20 63 6f 72 72 75 70 74 53 72 63 46 69 6c  e, corruptSrcFil
236a0 65 4c 6f 63 6b 29 3b 0a 20 20 7d 65 6c 73 65 7b  eLock);.  }else{
236b0 0a 20 20 20 20 2f 2a 20 64 6f 6e 65 20 77 69 74  .    /* done wit
236c0 68 20 74 68 65 20 73 6f 75 72 63 65 20 64 62 20  h the source db 
236d0 73 6f 20 65 6e 64 20 74 68 65 20 74 72 61 6e 73  so end the trans
236e0 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 73 71  action */.    sq
236f0 6c 69 74 65 33 5f 65 78 65 63 28 73 72 63 64 62  lite3_exec(srcdb
23700 32 2c 20 22 43 4f 4d 4d 49 54 22 2c 20 30 2c 20  2, "COMMIT", 0, 
23710 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20  0, 0);.  }.  /* 
23720 7a 65 72 6f 20 6f 75 74 20 61 6e 79 20 6f 6c 64  zero out any old
23730 20 6a 6f 75 72 6e 61 6c 20 63 6c 75 74 74 65 72   journal clutter
23740 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   */.  if( rc==SQ
23750 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
23760 6e 74 20 73 6b 69 70 57 41 4c 20 3d 20 28 73 72  nt skipWAL = (sr
23770 63 57 61 6c 46 44 3c 30 29 3f 30 3a 31 3b 0a 20  cWalFD<0)?0:1;. 
23780 20 20 20 75 6e 69 78 49 6e 76 61 6c 69 64 61 74     unixInvalidat
23790 65 53 75 70 70 6f 72 74 46 69 6c 65 73 28 70 46  eSupportFiles(pF
237a0 69 6c 65 2c 20 73 6b 69 70 57 41 4c 29 3b 0a 20  ile, skipWAL);. 
237b0 20 7d 0a 20 20 0a 65 6e 64 5f 72 65 70 6c 61 63   }.  .end_replac
237c0 65 5f 64 61 74 61 62 61 73 65 3a 0a 20 20 69 66  e_database:.  if
237d0 28 20 70 53 72 63 42 74 72 65 65 20 29 7b 0a 20  ( pSrcBtree ){. 
237e0 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65     sqlite3_close
237f0 28 73 72 63 64 62 32 29 3b 0a 20 20 20 20 73 71  (srcdb2);.    sq
23800 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
23810 70 53 72 63 42 74 72 65 65 29 3b 0a 20 20 7d 0a  pSrcBtree);.  }.
23820 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
23830 6c 65 61 76 65 28 73 72 63 64 62 2d 3e 6d 75 74  leave(srcdb->mut
23840 65 78 29 3b 0a 20 20 69 66 28 20 69 73 44 73 74  ex);.  if( isDst
23850 43 6f 72 72 75 70 74 20 29 7b 0a 20 20 20 20 73  Corrupt ){.    s
23860 71 6c 69 74 65 33 64 65 6d 6f 5f 73 75 70 65 72  qlite3demo_super
23870 75 6e 6c 6f 63 6b 5f 63 6f 72 72 75 70 74 28 69  unlock_corrupt(i
23880 64 2c 20 63 6f 72 72 75 70 74 44 73 74 46 69 6c  d, corruptDstFil
23890 65 4c 6f 63 6b 29 3b 0a 20 20 7d 65 6c 73 65 7b  eLock);.  }else{
238a0 0a 20 20 20 20 73 71 6c 69 74 65 33 64 65 6d 6f  .    sqlite3demo
238b0 5f 73 75 70 65 72 75 6e 6c 6f 63 6b 28 70 4c 6f  _superunlock(pLo
238c0 63 6b 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ck);.  }.  retur
238d0 6e 20 72 63 3b 0a 7d 0a 23 64 65 66 69 6e 65 20  n rc;.}.#define 
238e0 53 51 4c 49 54 45 5f 46 49 4c 45 5f 48 45 41 44  SQLITE_FILE_HEAD
238f0 45 52 5f 4c 45 4e 20 31 36 0a 2f 2a 20 43 68 65  ER_LEN 16./* Che
23900 63 6b 20 66 6f 72 20 61 20 63 6f 6e 66 6c 69 63  ck for a conflic
23910 74 69 6e 67 20 6c 6f 63 6b 2e 20 20 49 66 20 6f  ting lock.  If o
23920 6e 65 20 69 73 20 66 6f 75 6e 64 2c 20 70 72 69  ne is found, pri
23930 6e 74 20 61 6e 20 74 68 69 73 0a 20 2a 2a 20 6f  nt an this. ** o
23940 6e 20 73 74 61 6e 64 61 72 64 20 6f 75 74 70 75  n standard outpu
23950 74 20 75 73 69 6e 67 20 74 68 65 20 66 6f 72 6d  t using the form
23960 61 74 20 73 74 72 69 6e 67 20 67 69 76 65 6e 20  at string given 
23970 61 6e 64 20 72 65 74 75 72 6e 20 31 2e 0a 20 2a  and return 1.. *
23980 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6e  * If there are n
23990 6f 20 63 6f 6e 66 6c 69 63 74 69 6e 67 20 6c 6f  o conflicting lo
239a0 63 6b 73 2c 20 72 65 74 75 72 6e 20 30 2e 0a 20  cks, return 0.. 
239b0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
239c0 69 78 49 73 4c 6f 63 6b 65 64 28 0a 20 20 70 69  ixIsLocked(.  pi
239d0 64 5f 74 20 70 69 64 2c 20 20 20 20 20 20 20 20  d_t pid,        
239e0 20 20 20 20 2f 2a 20 50 49 44 20 74 6f 20 74 65      /* PID to te
239f0 73 74 20 66 6f 72 20 6c 6f 63 6b 20 6f 77 6e 65  st for lock owne
23a00 72 20 2a 2f 0a 20 20 69 6e 74 20 68 2c 20 20 20  r */.  int h,   
23a10 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23a20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  File descriptor 
23a30 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 69 6e  to check */.  in
23a40 74 20 74 79 70 65 2c 20 20 20 20 20 20 20 20 20  t type,         
23a50 20 20 20 20 2f 2a 20 46 5f 52 44 4c 43 4b 20 6f      /* F_RDLCK o
23a60 72 20 46 5f 57 52 4c 43 4b 20 2a 2f 0a 20 20 75  r F_WRLCK */.  u
23a70 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 4f 66 73  nsigned int iOfs
23a80 74 2c 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79  t,   /* First by
23a90 74 65 20 6f 66 20 74 68 65 20 6c 6f 63 6b 20 2a  te of the lock *
23aa0 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  /.  unsigned int
23ab0 20 69 43 6e 74 2c 20 20 20 20 2f 2a 20 4e 75 6d   iCnt,    /* Num
23ac0 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
23ad0 74 68 65 20 6c 6f 63 6b 20 72 61 6e 67 65 20 2a  the lock range *
23ae0 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
23af0 7a 54 79 70 65 20 20 20 20 20 2f 2a 20 54 79 70  zType     /* Typ
23b00 65 20 6f 66 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a  e of lock */.){.
23b10 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c    struct flock l
23b20 6b 3b 0a 20 20 69 6e 74 20 65 72 72 3b 0a 20 20  k;.  int err;.  
23b30 0a 20 20 6d 65 6d 73 65 74 28 26 6c 6b 2c 20 30  .  memset(&lk, 0
23b40 2c 20 73 69 7a 65 6f 66 28 6c 6b 29 29 3b 0a 20  , sizeof(lk));. 
23b50 20 6c 6b 2e 6c 5f 74 79 70 65 20 3d 20 74 79 70   lk.l_type = typ
23b60 65 3b 0a 20 20 6c 6b 2e 6c 5f 77 68 65 6e 63 65  e;.  lk.l_whence
23b70 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 6c   = SEEK_SET;.  l
23b80 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 69 4f 66 73  k.l_start = iOfs
23b90 74 3b 0a 20 20 6c 6b 2e 6c 5f 6c 65 6e 20 3d 20  t;.  lk.l_len = 
23ba0 69 43 6e 74 3b 0a 20 20 0a 20 20 69 66 28 20 70  iCnt;.  .  if( p
23bb0 69 64 21 3d 53 51 4c 49 54 45 5f 4c 4f 43 4b 53  id!=SQLITE_LOCKS
23bc0 54 41 54 45 5f 41 4e 59 50 49 44 20 29 7b 0a 23  TATE_ANYPID ){.#
23bd0 69 66 6e 64 65 66 20 46 5f 47 45 54 4c 4b 50 49  ifndef F_GETLKPI
23be0 44 0a 23 20 77 61 72 6e 69 6e 67 20 46 5f 47 45  D.# warning F_GE
23bf0 54 4c 4b 50 49 44 20 75 6e 64 65 66 69 6e 65 64  TLKPID undefined
23c00 2c 20 5f 73 71 6c 69 74 65 33 5f 6c 6f 63 6b 73  , _sqlite3_locks
23c10 74 61 74 65 20 66 61 6c 6c 69 6e 67 20 62 61 63  tate falling bac
23c20 6b 20 74 6f 20 46 5f 47 45 54 4c 4b 0a 20 20 20  k to F_GETLK.   
23c30 20 65 72 72 20 3d 20 66 63 6e 74 6c 28 68 2c 20   err = fcntl(h, 
23c40 46 5f 47 45 54 4c 4b 2c 20 26 6c 6b 29 3b 0a 23  F_GETLK, &lk);.#
23c50 65 6c 73 65 0a 20 20 20 20 6c 6b 2e 6c 5f 70 69  else.    lk.l_pi
23c60 64 20 3d 20 70 69 64 3b 0a 20 20 20 20 65 72 72  d = pid;.    err
23c70 20 3d 20 66 63 6e 74 6c 28 68 2c 20 46 5f 47 45   = fcntl(h, F_GE
23c80 54 4c 4b 50 49 44 2c 20 26 6c 6b 29 3b 0a 23 65  TLKPID, &lk);.#e
23c90 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ndif.  }else{.  
23ca0 20 20 65 72 72 20 3d 20 66 63 6e 74 6c 28 68 2c    err = fcntl(h,
23cb0 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 6b 29 3b 0a   F_GETLK, &lk);.
23cc0 20 20 7d 0a 20 20 0a 20 20 69 66 28 20 65 72 72    }.  .  if( err
23cd0 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 66 70  ==(-1) ){.    fp
23ce0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 66  rintf(stderr, "f
23cf0 63 6e 74 6c 28 25 64 29 20 66 61 69 6c 65 64 3a  cntl(%d) failed:
23d00 20 65 72 72 6e 6f 3d 25 64 5c 6e 22 2c 20 68 2c   errno=%d\n", h,
23d10 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 72 65 74   errno);.    ret
23d20 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 20 20 0a 20  urn -1;.  }.  . 
23d30 20 69 66 28 20 6c 6b 2e 6c 5f 74 79 70 65 21 3d   if( lk.l_type!=
23d40 46 5f 55 4e 4c 43 4b 20 26 26 20 28 70 69 64 3d  F_UNLCK && (pid=
23d50 3d 53 51 4c 49 54 45 5f 4c 4f 43 4b 53 54 41 54  =SQLITE_LOCKSTAT
23d60 45 5f 41 4e 59 50 49 44 20 7c 7c 20 6c 6b 2e 6c  E_ANYPID || lk.l
23d70 5f 70 69 64 3d 3d 70 69 64 29 20 29 7b 0a 23 69  _pid==pid) ){.#i
23d80 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
23d90 47 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74  G.    fprintf(st
23da0 64 65 72 72 2c 20 22 25 73 20 6c 6f 63 6b 20 68  derr, "%s lock h
23db0 65 6c 64 20 62 79 20 25 64 5c 6e 22 2c 20 7a 54  eld by %d\n", zT
23dc0 79 70 65 2c 20 28 69 6e 74 29 6c 6b 2e 6c 5f 70  ype, (int)lk.l_p
23dd0 69 64 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  id);.#endif.    
23de0 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 20 0a 20  return 1;.  } . 
23df0 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 73 74   return 0;.}..st
23e00 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4c 6f 63  atic int unixLoc
23e10 6b 73 74 61 74 65 50 69 64 28 75 6e 69 78 46 69  kstatePid(unixFi
23e20 6c 65 20 2a 2c 20 70 69 64 5f 74 2c 20 69 6e 74  le *, pid_t, int
23e30 20 2a 29 3b 0a 0a 23 65 6e 64 69 66 20 2f 2a 20   *);..#endif /* 
23e40 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41  (SQLITE_ENABLE_A
23e50 50 50 4c 45 5f 53 50 49 3e 30 29 20 26 26 20 64  PPLE_SPI>0) && d
23e60 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
23e70 29 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  ) */.../*.** If 
23e80 2a 70 41 72 67 20 69 73 20 69 6e 69 74 69 61 6c  *pArg is initial
23e90 6c 79 20 6e 65 67 61 74 69 76 65 20 74 68 65 6e  ly negative then
23ea0 20 74 68 69 73 20 69 73 20 61 20 71 75 65 72 79   this is a query
23eb0 2e 20 20 53 65 74 20 2a 70 41 72 67 20 74 6f 0a  .  Set *pArg to.
23ec0 2a 2a 20 31 20 6f 72 20 30 20 64 65 70 65 6e 64  ** 1 or 0 depend
23ed0 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72 20 6f  ing on whether o
23ee0 72 20 6e 6f 74 20 62 69 74 20 6d 61 73 6b 20 6f  r not bit mask o
23ef0 66 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61  f pFile->ctrlFla
23f00 67 73 20 69 73 20 73 65 74 2e 0a 2a 2a 0a 2a 2a  gs is set..**.**
23f10 20 49 66 20 2a 70 41 72 67 20 69 73 20 30 20 6f   If *pArg is 0 o
23f20 72 20 31 2c 20 74 68 65 6e 20 63 6c 65 61 72 20  r 1, then clear 
23f30 6f 72 20 73 65 74 20 74 68 65 20 6d 61 73 6b 20  or set the mask 
23f40 62 69 74 20 6f 66 20 70 46 69 6c 65 2d 3e 63 74  bit of pFile->ct
23f50 72 6c 46 6c 61 67 73 2e 0a 2a 2f 0a 73 74 61 74  rlFlags..*/.stat
23f60 69 63 20 76 6f 69 64 20 75 6e 69 78 4d 6f 64 65  ic void unixMode
23f70 42 69 74 28 75 6e 69 78 46 69 6c 65 20 2a 70 46  Bit(unixFile *pF
23f80 69 6c 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  ile, unsigned ch
23f90 61 72 20 6d 61 73 6b 2c 20 69 6e 74 20 2a 70 41  ar mask, int *pA
23fa0 72 67 29 7b 0a 20 20 69 66 28 20 2a 70 41 72 67  rg){.  if( *pArg
23fb0 3c 30 20 29 7b 0a 20 20 20 20 2a 70 41 72 67 20  <0 ){.    *pArg 
23fc0 3d 20 28 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c  = (pFile->ctrlFl
23fd0 61 67 73 20 26 20 6d 61 73 6b 29 21 3d 30 3b 0a  ags & mask)!=0;.
23fe0 20 20 7d 65 6c 73 65 20 69 66 28 20 28 2a 70 41    }else if( (*pA
23ff0 72 67 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 46  rg)==0 ){.    pF
24000 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26  ile->ctrlFlags &
24010 3d 20 7e 6d 61 73 6b 3b 0a 20 20 7d 65 6c 73 65  = ~mask;.  }else
24020 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63 74 72  {.    pFile->ctr
24030 6c 46 6c 61 67 73 20 7c 3d 20 6d 61 73 6b 3b 0a  lFlags |= mask;.
24040 20 20 7d 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72    }.}../* Forwar
24050 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 2a 2f  d declaration */
24060 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
24070 47 65 74 54 65 6d 70 6e 61 6d 65 28 69 6e 74 20  GetTempname(int 
24080 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66  nBuf, char *zBuf
24090 29 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6e 66 6f 72 6d  );../*.** Inform
240a0 61 74 69 6f 6e 20 61 6e 64 20 63 6f 6e 74 72 6f  ation and contro
240b0 6c 20 6f 66 20 61 6e 20 6f 70 65 6e 20 66 69 6c  l of an open fil
240c0 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61  e handle..*/.sta
240d0 74 69 63 20 69 6e 74 20 75 6e 69 78 46 69 6c 65  tic int unixFile
240e0 43 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f  Control(sqlite3_
240f0 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6f 70  file *id, int op
24100 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20  , void *pArg){. 
24110 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
24120 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
24130 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29  ;.  switch( op )
24140 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  {.    case SQLIT
24150 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b 53 54 41 54  E_FCNTL_LOCKSTAT
24160 45 3a 20 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74  E: {.      *(int
24170 2a 29 70 41 72 67 20 3d 20 70 46 69 6c 65 2d 3e  *)pArg = pFile->
24180 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 20  eFileLock;.     
24190 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
241a0 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  K;.    }.    cas
241b0 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c  e SQLITE_FCNTL_L
241c0 41 53 54 5f 45 52 52 4e 4f 3a 20 7b 0a 20 20 20  AST_ERRNO: {.   
241d0 20 20 20 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d     *(int*)pArg =
241e0 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
241f0 6f 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  o;.      return 
24200 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
24210 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
24220 5f 46 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53 49 5a  _FCNTL_CHUNK_SIZ
24230 45 3a 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  E: {.      pFile
24240 2d 3e 73 7a 43 68 75 6e 6b 20 3d 20 2a 28 69 6e  ->szChunk = *(in
24250 74 20 2a 29 70 41 72 67 3b 0a 20 20 20 20 20 20  t *)pArg;.      
24260 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
24270 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
24280 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49   SQLITE_FCNTL_SI
24290 5a 45 5f 48 49 4e 54 3a 20 7b 0a 20 20 20 20 20  ZE_HINT: {.     
242a0 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 20 20 53   int rc;.      S
242b0 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65  imulateIOErrorBe
242c0 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 72  nign(1);.      r
242d0 63 20 3d 20 66 63 6e 74 6c 53 69 7a 65 48 69 6e  c = fcntlSizeHin
242e0 74 28 70 46 69 6c 65 2c 20 2a 28 69 36 34 20 2a  t(pFile, *(i64 *
242f0 29 70 41 72 67 29 3b 0a 20 20 20 20 20 20 53 69  )pArg);.      Si
24300 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e  mulateIOErrorBen
24310 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 72 65  ign(0);.      re
24320 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
24330 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
24340 43 4e 54 4c 5f 50 45 52 53 49 53 54 5f 57 41 4c  CNTL_PERSIST_WAL
24350 3a 20 7b 0a 20 20 20 20 20 20 75 6e 69 78 4d 6f  : {.      unixMo
24360 64 65 42 69 74 28 70 46 69 6c 65 2c 20 55 4e 49  deBit(pFile, UNI
24370 58 46 49 4c 45 5f 50 45 52 53 49 53 54 5f 57 41  XFILE_PERSIST_WA
24380 4c 2c 20 28 69 6e 74 2a 29 70 41 72 67 29 3b 0a  L, (int*)pArg);.
24390 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
243a0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
243b0 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
243c0 4e 54 4c 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56  NTL_POWERSAFE_OV
243d0 45 52 57 52 49 54 45 3a 20 7b 0a 20 20 20 20 20  ERWRITE: {.     
243e0 20 75 6e 69 78 4d 6f 64 65 42 69 74 28 70 46 69   unixModeBit(pFi
243f0 6c 65 2c 20 55 4e 49 58 46 49 4c 45 5f 50 53 4f  le, UNIXFILE_PSO
24400 57 2c 20 28 69 6e 74 2a 29 70 41 72 67 29 3b 0a  W, (int*)pArg);.
24410 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
24420 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
24430 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
24440 4e 54 4c 5f 56 46 53 4e 41 4d 45 3a 20 7b 0a 20  NTL_VFSNAME: {. 
24450 20 20 20 20 20 2a 28 63 68 61 72 2a 2a 29 70 41       *(char**)pA
24460 72 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  rg = sqlite3_mpr
24470 69 6e 74 66 28 22 25 73 22 2c 20 70 46 69 6c 65  intf("%s", pFile
24480 2d 3e 70 56 66 73 2d 3e 7a 4e 61 6d 65 29 3b 0a  ->pVfs->zName);.
24490 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
244a0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
244b0 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
244c0 4e 54 4c 5f 54 45 4d 50 46 49 4c 45 4e 41 4d 45  NTL_TEMPFILENAME
244d0 3a 20 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  : {.      char *
244e0 7a 54 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33  zTFile = sqlite3
244f0 5f 6d 61 6c 6c 6f 63 28 20 70 46 69 6c 65 2d 3e  _malloc( pFile->
24500 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
24510 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 54   );.      if( zT
24520 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20  File ){.        
24530 75 6e 69 78 47 65 74 54 65 6d 70 6e 61 6d 65 28  unixGetTempname(
24540 70 46 69 6c 65 2d 3e 70 56 66 73 2d 3e 6d 78 50  pFile->pVfs->mxP
24550 61 74 68 6e 61 6d 65 2c 20 7a 54 46 69 6c 65 29  athname, zTFile)
24560 3b 0a 20 20 20 20 20 20 20 20 2a 28 63 68 61 72  ;.        *(char
24570 2a 2a 29 70 41 72 67 20 3d 20 7a 54 46 69 6c 65  **)pArg = zTFile
24580 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
24590 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
245a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
245b0 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 48 41   SQLITE_FCNTL_HA
245c0 53 5f 4d 4f 56 45 44 3a 20 7b 0a 20 20 20 20 20  S_MOVED: {.     
245d0 20 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d 20 66   *(int*)pArg = f
245e0 69 6c 65 48 61 73 4d 6f 76 65 64 28 70 46 69 6c  ileHasMoved(pFil
245f0 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  e);.      return
24600 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
24610 7d 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  }.#if SQLITE_MAX
24620 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 20  _MMAP_SIZE>0.   
24630 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
24640 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45 3a 20 7b 0a  TL_MMAP_SIZE: {.
24650 20 20 20 20 20 20 69 36 34 20 6e 65 77 4c 69 6d        i64 newLim
24660 69 74 20 3d 20 2a 28 69 36 34 2a 29 70 41 72 67  it = *(i64*)pArg
24670 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d  ;.      int rc =
24680 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
24690 20 20 69 66 28 20 6e 65 77 4c 69 6d 69 74 3e 73    if( newLimit>s
246a0 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
246b0 69 67 2e 6d 78 4d 6d 61 70 20 29 7b 0a 20 20 20  ig.mxMmap ){.   
246c0 20 20 20 20 20 6e 65 77 4c 69 6d 69 74 20 3d 20       newLimit = 
246d0 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
246e0 66 69 67 2e 6d 78 4d 6d 61 70 3b 0a 20 20 20 20  fig.mxMmap;.    
246f0 20 20 7d 0a 20 20 20 20 20 20 2a 28 69 36 34 2a    }.      *(i64*
24700 29 70 41 72 67 20 3d 20 70 46 69 6c 65 2d 3e 6d  )pArg = pFile->m
24710 6d 61 70 53 69 7a 65 4d 61 78 3b 0a 20 20 20 20  mapSizeMax;.    
24720 20 20 69 66 28 20 6e 65 77 4c 69 6d 69 74 3e 3d    if( newLimit>=
24730 30 20 26 26 20 6e 65 77 4c 69 6d 69 74 21 3d 70  0 && newLimit!=p
24740 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61  File->mmapSizeMa
24750 78 20 26 26 20 70 46 69 6c 65 2d 3e 6e 46 65 74  x && pFile->nFet
24760 63 68 4f 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20  chOut==0 ){.    
24770 20 20 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53      pFile->mmapS
24780 69 7a 65 4d 61 78 20 3d 20 6e 65 77 4c 69 6d 69  izeMax = newLimi
24790 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  t;.        if( p
247a0 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 3e 30  File->mmapSize>0
247b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 6e   ){.          un
247c0 69 78 55 6e 6d 61 70 66 69 6c 65 28 70 46 69 6c  ixUnmapfile(pFil
247d0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  e);.          rc
247e0 20 3d 20 75 6e 69 78 4d 61 70 66 69 6c 65 28 70   = unixMapfile(p
247f0 46 69 6c 65 2c 20 2d 31 29 3b 0a 20 20 20 20 20  File, -1);.     
24800 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
24810 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
24820 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 64 65    }.#endif.#ifde
24830 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
24840 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20     /* The pager 
24850 63 61 6c 6c 73 20 74 68 69 73 20 6d 65 74 68 6f  calls this metho
24860 64 20 74 6f 20 73 69 67 6e 61 6c 20 74 68 61 74  d to signal that
24870 20 69 74 20 68 61 73 20 64 6f 6e 65 0a 20 20 20   it has done.   
24880 20 2a 2a 20 61 20 72 6f 6c 6c 62 61 63 6b 20 61   ** a rollback a
24890 6e 64 20 74 68 61 74 20 74 68 65 20 64 61 74 61  nd that the data
248a0 62 61 73 65 20 69 73 20 74 68 65 72 65 66 6f 72  base is therefor
248b0 65 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 0a  e unchanged and.
248c0 20 20 20 20 2a 2a 20 69 74 20 68 65 6e 63 65 20      ** it hence 
248d0 69 74 20 69 73 20 4f 4b 20 66 6f 72 20 74 68 65  it is OK for the
248e0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 68 61   transaction cha
248f0 6e 67 65 20 63 6f 75 6e 74 65 72 20 74 6f 20 62  nge counter to b
24900 65 0a 20 20 20 20 2a 2a 20 75 6e 63 68 61 6e 67  e.    ** unchang
24910 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ed..    */.    c
24920 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ase SQLITE_FCNTL
24930 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44 3a 20 7b  _DB_UNCHANGED: {
24940 0a 20 20 20 20 20 20 28 28 75 6e 69 78 46 69 6c  .      ((unixFil
24950 65 2a 29 69 64 29 2d 3e 64 62 55 70 64 61 74 65  e*)id)->dbUpdate
24960 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75   = 0;.      retu
24970 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
24980 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 53    }.#endif.#if S
24990 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
249a0 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65  KING_STYLE && de
249b0 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
249c0 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
249d0 5f 46 43 4e 54 4c 5f 53 45 54 5f 4c 4f 43 4b 50  _FCNTL_SET_LOCKP
249e0 52 4f 58 59 46 49 4c 45 3a 0a 20 20 20 20 63 61  ROXYFILE:.    ca
249f0 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
24a00 47 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c  GET_LOCKPROXYFIL
24a10 45 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72  E: {.      retur
24a20 6e 20 70 72 6f 78 79 46 69 6c 65 43 6f 6e 74 72  n proxyFileContr
24a30 6f 6c 28 69 64 2c 6f 70 2c 70 41 72 67 29 3b 0a  ol(id,op,pArg);.
24a40 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20      }.#endif /* 
24a50 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
24a60 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64  CKING_STYLE && d
24a70 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
24a80 29 20 2a 2f 0a 23 69 66 20 28 53 51 4c 49 54 45  ) */.#if (SQLITE
24a90 5f 45 4e 41 42 4c 45 5f 41 50 50 4c 45 5f 53 50  _ENABLE_APPLE_SP
24aa0 49 3e 30 29 20 26 26 20 64 65 66 69 6e 65 64 28  I>0) && defined(
24ab0 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 20 20 63  __APPLE__).    c
24ac0 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ase SQLITE_FCNTL
24ad0 5f 54 52 55 4e 43 41 54 45 5f 44 41 54 41 42 41  _TRUNCATE_DATABA
24ae0 53 45 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75  SE: {.      retu
24af0 72 6e 20 75 6e 69 78 54 72 75 6e 63 61 74 65 44  rn unixTruncateD
24b00 61 74 61 62 61 73 65 28 70 46 69 6c 65 2c 20 28  atabase(pFile, (
24b10 70 41 72 67 20 3f 20 28 2a 28 69 6e 74 20 2a 29  pArg ? (*(int *)
24b20 70 41 72 67 29 20 3a 20 30 29 29 3b 0a 20 20 20  pArg) : 0));.   
24b30 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
24b40 54 45 5f 46 43 4e 54 4c 5f 52 45 50 4c 41 43 45  TE_FCNTL_REPLACE
24b50 5f 44 41 54 41 42 41 53 45 3a 20 7b 0a 20 20 20  _DATABASE: {.   
24b60 20 20 20 72 65 74 75 72 6e 20 75 6e 69 78 52 65     return unixRe
24b70 70 6c 61 63 65 44 61 74 61 62 61 73 65 28 70 46  placeDatabase(pF
24b80 69 6c 65 2c 20 28 73 71 6c 69 74 65 33 20 2a 29  ile, (sqlite3 *)
24b90 70 41 72 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20  pArg);.    }.   
24ba0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
24bb0 54 4c 5f 4c 4f 43 4b 53 54 41 54 45 5f 50 49 44  TL_LOCKSTATE_PID
24bc0 3a 20 7b 0a 20 20 20 20 20 20 4c 6f 63 6b 73 74  : {.      Lockst
24bd0 61 74 65 50 49 44 20 2a 70 4c 6f 63 6b 73 74 61  atePID *pLocksta
24be0 74 65 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 63  te;.      int rc
24bf0 3b 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20 69  ;.      .      i
24c00 66 28 20 70 41 72 67 3d 3d 4e 55 4c 4c 20 29 7b  f( pArg==NULL ){
24c10 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
24c20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20  SQLITE_MISUSE;. 
24c30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 4c 6f       }.      pLo
24c40 63 6b 73 74 61 74 65 20 3d 20 28 4c 6f 63 6b 73  ckstate = (Locks
24c50 74 61 74 65 50 49 44 20 2a 29 70 41 72 67 3b 0a  tatePID *)pArg;.
24c60 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c        rc = unixL
24c70 6f 63 6b 73 74 61 74 65 50 69 64 28 70 46 69 6c  ockstatePid(pFil
24c80 65 2c 20 70 4c 6f 63 6b 73 74 61 74 65 2d 3e 70  e, pLockstate->p
24c90 69 64 2c 20 26 28 70 4c 6f 63 6b 73 74 61 74 65  id, &(pLockstate
24ca0 2d 3e 73 74 61 74 65 29 29 3b 0a 20 20 20 20 20  ->state));.     
24cb0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
24cc0 7d 0a 20 20 20 20 20 20 0a 23 65 6e 64 69 66 20  }.      .#endif 
24cd0 2f 2a 20 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  /* (SQLITE_ENABL
24ce0 45 5f 41 50 50 4c 45 5f 53 50 49 3e 30 29 20 26  E_APPLE_SPI>0) &
24cf0 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  & defined(__APPL
24d00 45 5f 5f 29 20 2a 2f 0a 20 20 7d 0a 20 20 72 65  E__) */.  }.  re
24d10 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46  turn SQLITE_NOTF
24d20 4f 55 4e 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  OUND;.}../*.** R
24d30 65 74 75 72 6e 20 74 68 65 20 73 65 63 74 6f 72  eturn the sector
24d40 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20 6f   size in bytes o
24d50 66 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  f the underlying
24d60 20 62 6c 6f 63 6b 20 64 65 76 69 63 65 20 66 6f   block device fo
24d70 72 0a 2a 2a 20 74 68 65 20 73 70 65 63 69 66 69  r.** the specifi
24d80 65 64 20 66 69 6c 65 2e 20 54 68 69 73 20 69 73  ed file. This is
24d90 20 61 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20 35   almost always 5
24da0 31 32 20 62 79 74 65 73 2c 20 62 75 74 20 6d 61  12 bytes, but ma
24db0 79 20 62 65 0a 2a 2a 20 6c 61 72 67 65 72 20 66  y be.** larger f
24dc0 6f 72 20 73 6f 6d 65 20 64 65 76 69 63 65 73 2e  or some devices.
24dd0 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 63 6f  .**.** SQLite co
24de0 64 65 20 61 73 73 75 6d 65 73 20 74 68 69 73 20  de assumes this 
24df0 66 75 6e 63 74 69 6f 6e 20 63 61 6e 6e 6f 74 20  function cannot 
24e00 66 61 69 6c 2e 20 49 74 20 61 6c 73 6f 20 61 73  fail. It also as
24e10 73 75 6d 65 73 20 74 68 61 74 0a 2a 2a 20 69 66  sumes that.** if
24e20 20 74 77 6f 20 66 69 6c 65 73 20 61 72 65 20 63   two files are c
24e30 72 65 61 74 65 64 20 69 6e 20 74 68 65 20 73 61  reated in the sa
24e40 6d 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 64  me file-system d
24e50 69 72 65 63 74 6f 72 79 20 28 69 2e 65 2e 0a 2a  irectory (i.e..*
24e60 2a 20 61 20 64 61 74 61 62 61 73 65 20 61 6e 64  * a database and
24e70 20 69 74 73 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   its journal fil
24e80 65 29 20 74 68 61 74 20 74 68 65 20 73 65 63 74  e) that the sect
24e90 6f 72 20 73 69 7a 65 20 77 69 6c 6c 20 62 65 20  or size will be 
24ea0 74 68 65 0a 2a 2a 20 73 61 6d 65 20 66 6f 72 20  the.** same for 
24eb0 62 6f 74 68 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  both..*/.#ifndef
24ec0 20 5f 5f 51 4e 58 4e 54 4f 5f 5f 20 0a 73 74 61   __QNXNTO__ .sta
24ed0 74 69 63 20 69 6e 74 20 75 6e 69 78 53 65 63 74  tic int unixSect
24ee0 6f 72 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66  orSize(sqlite3_f
24ef0 69 6c 65 20 2a 4e 6f 74 55 73 65 64 29 7b 0a 20  ile *NotUsed){. 
24f00 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
24f10 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65  R(NotUsed);.  re
24f20 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 45 46 41  turn SQLITE_DEFA
24f30 55 4c 54 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b  ULT_SECTOR_SIZE;
24f40 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
24f50 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76   The following v
24f60 65 72 73 69 6f 6e 20 6f 66 20 75 6e 69 78 53 65  ersion of unixSe
24f70 63 74 6f 72 53 69 7a 65 28 29 20 69 73 20 6f 70  ctorSize() is op
24f80 74 69 6d 69 7a 65 64 20 66 6f 72 20 51 4e 58 2e  timized for QNX.
24f90 0a 2a 2f 0a 23 69 66 64 65 66 20 5f 5f 51 4e 58  .*/.#ifdef __QNX
24fa0 4e 54 4f 5f 5f 0a 23 69 6e 63 6c 75 64 65 20 3c  NTO__.#include <
24fb0 73 79 73 2f 64 63 6d 64 5f 62 6c 6b 2e 68 3e 0a  sys/dcmd_blk.h>.
24fc0 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 73 74  #include <sys/st
24fd0 61 74 76 66 73 2e 68 3e 0a 73 74 61 74 69 63 20  atvfs.h>.static 
24fe0 69 6e 74 20 75 6e 69 78 53 65 63 74 6f 72 53 69  int unixSectorSi
24ff0 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ze(sqlite3_file 
25000 2a 69 64 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65  *id){.  unixFile
25010 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
25020 69 6c 65 2a 29 69 64 3b 0a 20 20 69 66 28 20 70  ile*)id;.  if( p
25030 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65  File->sectorSize
25040 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20 73 74 72   == 0 ){.    str
25050 75 63 74 20 73 74 61 74 76 66 73 20 66 73 49 6e  uct statvfs fsIn
25060 66 6f 3b 0a 20 20 20 20 20 20 20 0a 20 20 20 20  fo;.       .    
25070 2f 2a 20 53 65 74 20 64 65 66 61 75 6c 74 73 20  /* Set defaults 
25080 66 6f 72 20 6e 6f 6e 2d 73 75 70 70 6f 72 74 65  for non-supporte
25090 64 20 66 69 6c 65 73 79 73 74 65 6d 73 20 2a 2f  d filesystems */
250a0 0a 20 20 20 20 70 46 69 6c 65 2d 3e 73 65 63 74  .    pFile->sect
250b0 6f 72 53 69 7a 65 20 3d 20 53 51 4c 49 54 45 5f  orSize = SQLITE_
250c0 44 45 46 41 55 4c 54 5f 53 45 43 54 4f 52 5f 53  DEFAULT_SECTOR_S
250d0 49 5a 45 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  IZE;.    pFile->
250e0 64 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  deviceCharacteri
250f0 73 74 69 63 73 20 3d 20 30 3b 0a 20 20 20 20 69  stics = 0;.    i
25100 66 28 20 66 73 74 61 74 76 66 73 28 70 46 69 6c  f( fstatvfs(pFil
25110 65 2d 3e 68 2c 20 26 66 73 49 6e 66 6f 29 20 3d  e->h, &fsInfo) =
25120 3d 20 2d 31 20 29 20 7b 0a 20 20 20 20 20 20 72  = -1 ) {.      r
25130 65 74 75 72 6e 20 70 46 69 6c 65 2d 3e 73 65 63  eturn pFile->sec
25140 74 6f 72 53 69 7a 65 3b 0a 20 20 20 20 7d 0a 0a  torSize;.    }..
25150 20 20 20 20 69 66 28 20 21 73 74 72 63 6d 70 28      if( !strcmp(
25160 66 73 49 6e 66 6f 2e 66 5f 62 61 73 65 74 79 70  fsInfo.f_basetyp
25170 65 2c 20 22 74 6d 70 22 29 20 29 20 7b 0a 20 20  e, "tmp") ) {.  
25180 20 20 20 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f      pFile->secto
25190 72 53 69 7a 65 20 3d 20 66 73 49 6e 66 6f 2e 66  rSize = fsInfo.f
251a0 5f 62 73 69 7a 65 3b 0a 20 20 20 20 20 20 70 46  _bsize;.      pF
251b0 69 6c 65 2d 3e 64 65 76 69 63 65 43 68 61 72 61  ile->deviceChara
251c0 63 74 65 72 69 73 74 69 63 73 20 3d 0a 20 20 20  cteristics =.   
251d0 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41       SQLITE_IOCA
251e0 50 5f 41 54 4f 4d 49 43 34 4b 20 7c 20 20 20 20  P_ATOMIC4K |    
251f0 20 20 20 2f 2a 20 41 6c 6c 20 72 61 6d 20 66 69     /* All ram fi
25200 6c 65 73 79 73 74 65 6d 20 77 72 69 74 65 73 20  lesystem writes 
25210 61 72 65 20 61 74 6f 6d 69 63 20 2a 2f 0a 20 20  are atomic */.  
25220 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43        SQLITE_IOC
25230 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 20 7c  AP_SAFE_APPEND |
25240 20 20 20 20 2f 2a 20 67 72 6f 77 69 6e 67 20 74      /* growing t
25250 68 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74  he file does not
25260 20 6f 63 63 75 72 20 75 6e 74 69 6c 0a 20 20 20   occur until.   
25270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25290 20 20 20 2a 2a 20 74 68 65 20 77 72 69 74 65 20     ** the write 
252a0 73 75 63 63 65 65 64 73 20 2a 2f 0a 20 20 20 20  succeeds */.    
252b0 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50      SQLITE_IOCAP
252c0 5f 53 45 51 55 45 4e 54 49 41 4c 20 7c 20 20 20  _SEQUENTIAL |   
252d0 20 20 2f 2a 20 54 68 65 20 72 61 6d 20 66 69 6c    /* The ram fil
252e0 65 73 79 73 74 65 6d 20 68 61 73 20 6e 6f 20 77  esystem has no w
252f0 72 69 74 65 20 62 65 68 69 6e 64 0a 20 20 20 20  rite behind.    
25300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25320 20 20 2a 2a 20 73 6f 20 69 74 20 69 73 20 6f 72    ** so it is or
25330 64 65 72 65 64 20 2a 2f 0a 20 20 20 20 20 20 20  dered */.       
25340 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   0;.    }else if
25350 28 20 73 74 72 73 74 72 28 66 73 49 6e 66 6f 2e  ( strstr(fsInfo.
25360 66 5f 62 61 73 65 74 79 70 65 2c 20 22 65 74 66  f_basetype, "etf
25370 73 22 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69  s") ){.      pFi
25380 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d  le->sectorSize =
25390 20 66 73 49 6e 66 6f 2e 66 5f 62 73 69 7a 65 3b   fsInfo.f_bsize;
253a0 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 64 65  .      pFile->de
253b0 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
253c0 69 63 73 20 3d 0a 20 20 20 20 20 20 20 20 2f 2a  ics =.        /*
253d0 20 65 74 66 73 20 63 6c 75 73 74 65 72 20 73 69   etfs cluster si
253e0 7a 65 20 77 72 69 74 65 73 20 61 72 65 20 61 74  ze writes are at
253f0 6f 6d 69 63 20 2a 2f 0a 20 20 20 20 20 20 20 20  omic */.        
25400 28 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69  (pFile->sectorSi
25410 7a 65 20 2f 20 35 31 32 20 2a 20 53 51 4c 49 54  ze / 512 * SQLIT
25420 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31  E_IOCAP_ATOMIC51
25430 32 29 20 7c 0a 20 20 20 20 20 20 20 20 53 51 4c  2) |.        SQL
25440 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41  ITE_IOCAP_SAFE_A
25450 50 50 45 4e 44 20 7c 20 20 20 20 2f 2a 20 67 72  PPEND |    /* gr
25460 6f 77 69 6e 67 20 74 68 65 20 66 69 6c 65 20 64  owing the file d
25470 6f 65 73 20 6e 6f 74 20 6f 63 63 75 72 20 75 6e  oes not occur un
25480 74 69 6c 0a 20 20 20 20 20 20 20 20 20 20 20 20  til.            
25490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
254a0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65            ** the
254b0 20 77 72 69 74 65 20 73 75 63 63 65 65 64 73 20   write succeeds 
254c0 2a 2f 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54  */.        SQLIT
254d0 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49  E_IOCAP_SEQUENTI
254e0 41 4c 20 7c 20 20 20 20 20 2f 2a 20 54 68 65 20  AL |     /* The 
254f0 72 61 6d 20 66 69 6c 65 73 79 73 74 65 6d 20 68  ram filesystem h
25500 61 73 20 6e 6f 20 77 72 69 74 65 20 62 65 68 69  as no write behi
25510 6e 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  nd.             
25520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25530 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20 69           ** so i
25540 74 20 69 73 20 6f 72 64 65 72 65 64 20 2a 2f 0a  t is ordered */.
25550 20 20 20 20 20 20 20 20 30 3b 0a 20 20 20 20 7d          0;.    }
25560 65 6c 73 65 20 69 66 28 20 21 73 74 72 63 6d 70  else if( !strcmp
25570 28 66 73 49 6e 66 6f 2e 66 5f 62 61 73 65 74 79  (fsInfo.f_basety
25580 70 65 2c 20 22 71 6e 78 36 22 29 20 29 7b 0a 20  pe, "qnx6") ){. 
25590 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 65 63 74       pFile->sect
255a0 6f 72 53 69 7a 65 20 3d 20 66 73 49 6e 66 6f 2e  orSize = fsInfo.
255b0 66 5f 62 73 69 7a 65 3b 0a 20 20 20 20 20 20 70  f_bsize;.      p
255c0 46 69 6c 65 2d 3e 64 65 76 69 63 65 43 68 61 72  File->deviceChar
255d0 61 63 74 65 72 69 73 74 69 63 73 20 3d 0a 20 20  acteristics =.  
255e0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43        SQLITE_IOC
255f0 41 50 5f 41 54 4f 4d 49 43 20 7c 20 20 20 20 20  AP_ATOMIC |     
25600 20 20 20 20 2f 2a 20 41 6c 6c 20 66 69 6c 65 73      /* All files
25610 79 73 74 65 6d 20 77 72 69 74 65 73 20 61 72 65  ystem writes are
25620 20 61 74 6f 6d 69 63 20 2a 2f 0a 20 20 20 20 20   atomic */.     
25630 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f     SQLITE_IOCAP_
25640 53 41 46 45 5f 41 50 50 45 4e 44 20 7c 20 20 20  SAFE_APPEND |   
25650 20 2f 2a 20 67 72 6f 77 69 6e 67 20 74 68 65 20   /* growing the 
25660 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 6f 63  file does not oc
25670 63 75 72 20 75 6e 74 69 6c 0a 20 20 20 20 20 20  cur until.      
25680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
256a0 2a 2a 20 74 68 65 20 77 72 69 74 65 20 73 75 63  ** the write suc
256b0 63 65 65 64 73 20 2a 2f 0a 20 20 20 20 20 20 20  ceeds */.       
256c0 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45   SQLITE_IOCAP_SE
256d0 51 55 45 4e 54 49 41 4c 20 7c 20 20 20 20 20 2f  QUENTIAL |     /
256e0 2a 20 54 68 65 20 72 61 6d 20 66 69 6c 65 73 79  * The ram filesy
256f0 73 74 65 6d 20 68 61 73 20 6e 6f 20 77 72 69 74  stem has no writ
25700 65 20 62 65 68 69 6e 64 0a 20 20 20 20 20 20 20  e behind.       
25710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
25730 2a 20 73 6f 20 69 74 20 69 73 20 6f 72 64 65 72  * so it is order
25740 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 30 3b  ed */.        0;
25750 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21  .    }else if( !
25760 73 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e 66 5f  strcmp(fsInfo.f_
25770 62 61 73 65 74 79 70 65 2c 20 22 71 6e 78 34 22  basetype, "qnx4"
25780 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  ) ){.      pFile
25790 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 66  ->sectorSize = f
257a0 73 49 6e 66 6f 2e 66 5f 62 73 69 7a 65 3b 0a 20  sInfo.f_bsize;. 
257b0 20 20 20 20 20 70 46 69 6c 65 2d 3e 64 65 76 69       pFile->devi
257c0 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
257d0 73 20 3d 0a 20 20 20 20 20 20 20 20 2f 2a 20 66  s =.        /* f
257e0 75 6c 6c 20 62 69 74 73 65 74 20 6f 66 20 61 74  ull bitset of at
257f0 6f 6d 69 63 73 20 66 72 6f 6d 20 6d 61 78 20 73  omics from max s
25800 65 63 74 6f 72 20 73 69 7a 65 20 61 6e 64 20 73  ector size and s
25810 6d 61 6c 6c 65 72 20 2a 2f 0a 20 20 20 20 20 20  maller */.      
25820 20 20 28 28 70 46 69 6c 65 2d 3e 73 65 63 74 6f    ((pFile->secto
25830 72 53 69 7a 65 20 2f 20 35 31 32 20 2a 20 53 51  rSize / 512 * SQ
25840 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49  LITE_IOCAP_ATOMI
25850 43 35 31 32 29 20 3c 3c 20 31 29 20 2d 20 32 20  C512) << 1) - 2 
25860 7c 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45  |.        SQLITE
25870 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41  _IOCAP_SEQUENTIA
25880 4c 20 7c 20 20 20 20 20 2f 2a 20 54 68 65 20 72  L |     /* The r
25890 61 6d 20 66 69 6c 65 73 79 73 74 65 6d 20 68 61  am filesystem ha
258a0 73 20 6e 6f 20 77 72 69 74 65 20 62 65 68 69 6e  s no write behin
258b0 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d.              
258c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
258d0 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20 69 74          ** so it
258e0 20 69 73 20 6f 72 64 65 72 65 64 20 2a 2f 0a 20   is ordered */. 
258f0 20 20 20 20 20 20 20 30 3b 0a 20 20 20 20 7d 65         0;.    }e
25900 6c 73 65 20 69 66 28 20 73 74 72 73 74 72 28 66  lse if( strstr(f
25910 73 49 6e 66 6f 2e 66 5f 62 61 73 65 74 79 70 65  sInfo.f_basetype
25920 2c 20 22 64 6f 73 22 29 20 29 7b 0a 20 20 20 20  , "dos") ){.    
25930 20 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53    pFile->sectorS
25940 69 7a 65 20 3d 20 66 73 49 6e 66 6f 2e 66 5f 62  ize = fsInfo.f_b
25950 73 69 7a 65 3b 0a 20 20 20 20 20 20 70 46 69 6c  size;.      pFil
25960 65 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63 74  e->deviceCharact
25970 65 72 69 73 74 69 63 73 20 3d 0a 20 20 20 20 20  eristics =.     
25980 20 20 20 2f 2a 20 66 75 6c 6c 20 62 69 74 73 65     /* full bitse
25990 74 20 6f 66 20 61 74 6f 6d 69 63 73 20 66 72 6f  t of atomics fro
259a0 6d 20 6d 61 78 20 73 65 63 74 6f 72 20 73 69 7a  m max sector siz
259b0 65 20 61 6e 64 20 73 6d 61 6c 6c 65 72 20 2a 2f  e and smaller */
259c0 0a 20 20 20 20 20 20 20 20 28 28 70 46 69 6c 65  .        ((pFile
259d0 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 2f 20 35  ->sectorSize / 5
259e0 31 32 20 2a 20 53 51 4c 49 54 45 5f 49 4f 43 41  12 * SQLITE_IOCA
259f0 50 5f 41 54 4f 4d 49 43 35 31 32 29 20 3c 3c 20  P_ATOMIC512) << 
25a00 31 29 20 2d 20 32 20 7c 0a 20 20 20 20 20 20 20  1) - 2 |.       
25a10 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45   SQLITE_IOCAP_SE
25a20 51 55 45 4e 54 49 41 4c 20 7c 20 20 20 20 20 2f  QUENTIAL |     /
25a30 2a 20 54 68 65 20 72 61 6d 20 66 69 6c 65 73 79  * The ram filesy
25a40 73 74 65 6d 20 68 61 73 20 6e 6f 20 77 72 69 74  stem has no writ
25a50 65 20 62 65 68 69 6e 64 0a 20 20 20 20 20 20 20  e behind.       
25a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
25a80 2a 20 73 6f 20 69 74 20 69 73 20 6f 72 64 65 72  * so it is order
25a90 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 30 3b  ed */.        0;
25aa0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
25ab0 20 20 70 46 69 6c 65 2d 3e 64 65 76 69 63 65 43    pFile->deviceC
25ac0 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20 3d  haracteristics =
25ad0 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f  .        SQLITE_
25ae0 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 20  IOCAP_ATOMIC512 
25af0 7c 20 20 20 20 20 20 2f 2a 20 62 6c 6f 63 6b 73  |      /* blocks
25b00 20 61 72 65 20 61 74 6f 6d 69 63 20 2a 2f 0a 20   are atomic */. 
25b10 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f         SQLITE_IO
25b20 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 20  CAP_SAFE_APPEND 
25b30 7c 20 20 20 20 2f 2a 20 67 72 6f 77 69 6e 67 20  |    /* growing 
25b40 74 68 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f  the file does no
25b50 74 20 6f 63 63 75 72 20 75 6e 74 69 6c 0a 20 20  t occur until.  
25b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25b80 20 20 20 20 2a 2a 20 74 68 65 20 77 72 69 74 65      ** the write
25b90 20 73 75 63 63 65 65 64 73 20 2a 2f 0a 20 20 20   succeeds */.   
25ba0 20 20 20 20 20 30 3b 0a 20 20 20 20 7d 0a 20 20       0;.    }.  
25bb0 7d 0a 20 20 2f 2a 20 4c 61 73 74 20 63 68 61 6e  }.  /* Last chan
25bc0 63 65 20 76 65 72 69 66 69 63 61 74 69 6f 6e 2e  ce verification.
25bd0 20 20 49 66 20 74 68 65 20 73 65 63 74 6f 72 20    If the sector 
25be0 73 69 7a 65 20 69 73 6e 27 74 20 61 20 6d 75 6c  size isn't a mul
25bf0 74 69 70 6c 65 20 6f 66 20 35 31 32 0a 20 20 2a  tiple of 512.  *
25c00 2a 20 74 68 65 6e 20 69 74 20 69 73 6e 27 74 20  * then it isn't 
25c10 76 61 6c 69 64 2e 2a 2f 0a 20 20 69 66 28 20 70  valid.*/.  if( p
25c20 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65  File->sectorSize
25c30 20 25 20 35 31 32 20 21 3d 20 30 20 29 7b 0a 20   % 512 != 0 ){. 
25c40 20 20 20 70 46 69 6c 65 2d 3e 64 65 76 69 63 65     pFile->device
25c50 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20  Characteristics 
25c60 3d 20 30 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  = 0;.    pFile->
25c70 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 53 51 4c  sectorSize = SQL
25c80 49 54 45 5f 44 45 46 41 55 4c 54 5f 53 45 43 54  ITE_DEFAULT_SECT
25c90 4f 52 5f 53 49 5a 45 3b 0a 20 20 7d 0a 20 20 72  OR_SIZE;.  }.  r
25ca0 65 74 75 72 6e 20 70 46 69 6c 65 2d 3e 73 65 63  eturn pFile->sec
25cb0 74 6f 72 53 69 7a 65 3b 0a 7d 0a 23 65 6e 64 69  torSize;.}.#endi
25cc0 66 20 2f 2a 20 5f 5f 51 4e 58 4e 54 4f 5f 5f 20  f /* __QNXNTO__ 
25cd0 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  */../*.** Return
25ce0 20 74 68 65 20 64 65 76 69 63 65 20 63 68 61 72   the device char
25cf0 61 63 74 65 72 69 73 74 69 63 73 20 66 6f 72 20  acteristics for 
25d00 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  the file..**.** 
25d10 54 68 69 73 20 56 46 53 20 69 73 20 73 65 74 20  This VFS is set 
25d20 75 70 20 74 6f 20 72 65 74 75 72 6e 20 53 51 4c  up to return SQL
25d30 49 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53  ITE_IOCAP_POWERS
25d40 41 46 45 5f 4f 56 45 52 57 52 49 54 45 20 62 79  AFE_OVERWRITE by
25d50 20 64 65 66 61 75 6c 74 2e 0a 2a 2a 20 48 6f 77   default..** How
25d60 65 76 65 72 2c 20 74 68 61 74 20 63 68 6f 69 63  ever, that choic
25d70 65 20 69 73 20 63 6f 6e 74 72 6f 76 65 72 73 69  e is controversi
25d80 61 6c 20 73 69 6e 63 65 20 74 65 63 68 6e 69 63  al since technic
25d90 61 6c 6c 79 20 74 68 65 20 75 6e 64 65 72 6c 79  ally the underly
25da0 69 6e 67 0a 2a 2a 20 66 69 6c 65 20 73 79 73 74  ing.** file syst
25db0 65 6d 20 64 6f 65 73 20 6e 6f 74 20 61 6c 77 61  em does not alwa
25dc0 79 73 20 70 72 6f 76 69 64 65 20 70 6f 77 65 72  ys provide power
25dd0 73 61 66 65 20 6f 76 65 72 77 72 69 74 65 73 2e  safe overwrites.
25de0 20 20 28 49 6e 20 6f 74 68 65 72 0a 2a 2a 20 77    (In other.** w
25df0 6f 72 64 73 2c 20 61 66 74 65 72 20 61 20 70 6f  ords, after a po
25e00 77 65 72 2d 6c 6f 73 73 20 65 76 65 6e 74 2c 20  wer-loss event, 
25e10 70 61 72 74 73 20 6f 66 20 74 68 65 20 66 69 6c  parts of the fil
25e20 65 20 74 68 61 74 20 77 65 72 65 20 6e 65 76 65  e that were neve
25e30 72 0a 2a 2a 20 77 72 69 74 74 65 6e 20 6d 69 67  r.** written mig
25e40 68 74 20 65 6e 64 20 75 70 20 62 65 69 6e 67 20  ht end up being 
25e50 61 6c 74 65 72 65 64 2e 29 20 20 48 6f 77 65 76  altered.)  Howev
25e60 65 72 2c 20 6e 6f 6e 2d 50 53 4f 57 20 62 65 68  er, non-PSOW beh
25e70 61 76 69 6f 72 20 69 73 20 76 65 72 79 2c 0a 2a  avior is very,.*
25e80 2a 20 76 65 72 79 20 72 61 72 65 2e 20 20 41 6e  * very rare.  An
25e90 64 20 61 73 73 65 72 74 69 6e 67 20 50 53 4f 57  d asserting PSOW
25ea0 20 6d 61 6b 65 73 20 61 20 6c 61 72 67 65 20 72   makes a large r
25eb0 65 64 75 63 74 69 6f 6e 20 69 6e 20 74 68 65 20  eduction in the 
25ec0 61 6d 6f 75 6e 74 0a 2a 2a 20 6f 66 20 72 65 71  amount.** of req
25ed0 75 69 72 65 64 20 49 2f 4f 20 66 6f 72 20 6a 6f  uired I/O for jo
25ee0 75 72 6e 61 6c 69 6e 67 2c 20 73 69 6e 63 65 20  urnaling, since 
25ef0 61 20 6c 6f 74 20 6f 66 20 70 61 64 64 69 6e 67  a lot of padding
25f00 20 69 73 20 65 6c 69 6d 69 6e 61 74 65 64 2e 0a   is eliminated..
25f10 2a 2a 20 20 48 65 6e 63 65 2c 20 77 68 69 6c 65  **  Hence, while
25f20 20 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57   POWERSAFE_OVERW
25f30 52 49 54 45 20 69 73 20 6f 6e 20 62 79 20 64 65  RITE is on by de
25f40 66 61 75 6c 74 2c 20 74 68 65 72 65 20 69 73 20  fault, there is 
25f50 61 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 0a 2a  a file-control.*
25f60 2a 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 74  * available to t
25f70 75 72 6e 20 69 74 20 6f 66 66 20 61 6e 64 20 55  urn it off and U
25f80 52 49 20 71 75 65 72 79 20 70 61 72 61 6d 65 74  RI query paramet
25f90 65 72 20 61 76 61 69 6c 61 62 6c 65 20 74 6f 20  er available to 
25fa0 74 75 72 6e 20 69 74 20 6f 66 66 2e 0a 2a 2f 0a  turn it off..*/.
25fb0 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 44  static int unixD
25fc0 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
25fd0 74 69 63 73 28 73 71 6c 69 74 65 33 5f 66 69 6c  tics(sqlite3_fil
25fe0 65 20 2a 69 64 29 7b 0a 20 20 75 6e 69 78 46 69  e *id){.  unixFi
25ff0 6c 65 20 2a 70 20 3d 20 28 75 6e 69 78 46 69 6c  le *p = (unixFil
26000 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20 72 63 20  e*)id;.  int rc 
26010 3d 20 30 3b 0a 23 69 66 64 65 66 20 5f 5f 51 4e  = 0;.#ifdef __QN
26020 58 4e 54 4f 5f 5f 0a 20 20 69 66 28 20 70 2d 3e  XNTO__.  if( p->
26030 73 65 63 74 6f 72 53 69 7a 65 3d 3d 30 20 29 20  sectorSize==0 ) 
26040 75 6e 69 78 53 65 63 74 6f 72 53 69 7a 65 28 69  unixSectorSize(i
26050 64 29 3b 0a 20 20 72 63 20 3d 20 70 2d 3e 64 65  d);.  rc = p->de
26060 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
26070 69 63 73 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66  ics;.#endif.  if
26080 28 20 70 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26  ( p->ctrlFlags &
26090 20 55 4e 49 58 46 49 4c 45 5f 50 53 4f 57 20 29   UNIXFILE_PSOW )
260a0 7b 0a 20 20 20 20 72 63 20 7c 3d 20 53 51 4c 49  {.    rc |= SQLI
260b0 54 45 5f 49 4f 43 41 50 5f 50 4f 57 45 52 53 41  TE_IOCAP_POWERSA
260c0 46 45 5f 4f 56 45 52 57 52 49 54 45 3b 0a 20 20  FE_OVERWRITE;.  
260d0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
260e0 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
260f0 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 20  QLITE_OMIT_WAL) 
26100 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  || SQLITE_MAX_MM
26110 41 50 5f 53 49 5a 45 3e 30 0a 0a 2f 2a 0a 2a 2a  AP_SIZE>0../*.**
26120 20 52 65 74 75 72 6e 20 74 68 65 20 73 79 73 74   Return the syst
26130 65 6d 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a  em page size..**
26140 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
26150 6e 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20  n should not be 
26160 63 61 6c 6c 65 64 20 64 69 72 65 63 74 6c 79 20  called directly 
26170 62 79 20 6f 74 68 65 72 20 63 6f 64 65 20 69 6e  by other code in
26180 20 74 68 69 73 20 66 69 6c 65 2e 20 0a 2a 2a 20   this file. .** 
26190 49 6e 73 74 65 61 64 2c 20 69 74 20 73 68 6f 75  Instead, it shou
261a0 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 76 69 61  ld be called via
261b0 20 6d 61 63 72 6f 20 6f 73 47 65 74 70 61 67 65   macro osGetpage
261c0 73 69 7a 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  size()..*/.stati
261d0 63 20 69 6e 74 20 75 6e 69 78 47 65 74 70 61 67  c int unixGetpag
261e0 65 73 69 7a 65 28 76 6f 69 64 29 7b 0a 23 69 66  esize(void){.#if
261f0 20 64 65 66 69 6e 65 64 28 5f 42 53 44 5f 53 4f   defined(_BSD_SO
26200 55 52 43 45 29 0a 20 20 72 65 74 75 72 6e 20 67  URCE).  return g
26210 65 74 70 61 67 65 73 69 7a 65 28 29 3b 0a 23 65  etpagesize();.#e
26220 6c 73 65 0a 20 20 72 65 74 75 72 6e 20 28 69 6e  lse.  return (in
26230 74 29 73 79 73 63 6f 6e 66 28 5f 53 43 5f 50 41  t)sysconf(_SC_PA
26240 47 45 53 49 5a 45 29 3b 0a 23 65 6e 64 69 66 0a  GESIZE);.#endif.
26250 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65  }..#endif /* !de
26260 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
26270 54 5f 57 41 4c 29 20 7c 7c 20 53 51 4c 49 54 45  T_WAL) || SQLITE
26280 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
26290 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
262a0 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 0a 2f 2a  ITE_OMIT_WAL../*
262b0 0a 2a 2a 20 4f 62 6a 65 63 74 20 75 73 65 64 20  .** Object used 
262c0 74 6f 20 72 65 70 72 65 73 65 6e 74 20 61 6e 20  to represent an 
262d0 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 62 75  shared memory bu
262e0 66 66 65 72 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 68  ffer.  .**.** Wh
262f0 65 6e 20 6d 75 6c 74 69 70 6c 65 20 74 68 72 65  en multiple thre
26300 61 64 73 20 61 6c 6c 20 72 65 66 65 72 65 6e 63  ads all referenc
26310 65 20 74 68 65 20 73 61 6d 65 20 77 61 6c 2d 69  e the same wal-i
26320 6e 64 65 78 2c 20 65 61 63 68 20 74 68 72 65 61  ndex, each threa
26330 64 0a 2a 2a 20 68 61 73 20 69 74 73 20 6f 77 6e  d.** has its own
26340 20 75 6e 69 78 53 68 6d 20 6f 62 6a 65 63 74 2c   unixShm object,
26350 20 62 75 74 20 74 68 65 79 20 61 6c 6c 20 70 6f   but they all po
26360 69 6e 74 20 74 6f 20 61 20 73 69 6e 67 6c 65 20  int to a single 
26370 69 6e 73 74 61 6e 63 65 0a 2a 2a 20 6f 66 20 74  instance.** of t
26380 68 69 73 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  his unixShmNode 
26390 6f 62 6a 65 63 74 2e 20 20 49 6e 20 6f 74 68 65  object.  In othe
263a0 72 20 77 6f 72 64 73 2c 20 65 61 63 68 20 77 61  r words, each wa
263b0 6c 2d 69 6e 64 65 78 20 69 73 20 6f 70 65 6e 65  l-index is opene
263c0 64 0a 2a 2a 20 6f 6e 6c 79 20 6f 6e 63 65 20 70  d.** only once p
263d0 65 72 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a  er process..**.*
263e0 2a 20 45 61 63 68 20 75 6e 69 78 53 68 6d 4e 6f  * Each unixShmNo
263f0 64 65 20 6f 62 6a 65 63 74 20 69 73 20 63 6f 6e  de object is con
26400 6e 65 63 74 65 64 20 74 6f 20 61 20 73 69 6e 67  nected to a sing
26410 6c 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  le unixInodeInfo
26420 20 6f 62 6a 65 63 74 2e 0a 2a 2a 20 57 65 20 63   object..** We c
26430 6f 75 6c 64 20 63 6f 61 6c 65 73 63 65 20 74 68  ould coalesce th
26440 69 73 20 6f 62 6a 65 63 74 20 69 6e 74 6f 20 75  is object into u
26450 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 2c 20 62 75  nixInodeInfo, bu
26460 74 20 74 68 61 74 20 77 6f 75 6c 64 20 6d 65 61  t that would mea
26470 6e 0a 2a 2a 20 65 76 65 72 79 20 6f 70 65 6e 20  n.** every open 
26480 66 69 6c 65 20 74 68 61 74 20 64 6f 65 73 20 6e  file that does n
26490 6f 74 20 75 73 65 20 73 68 61 72 65 64 20 6d 65  ot use shared me
264a0 6d 6f 72 79 20 28 69 6e 20 6f 74 68 65 72 20 77  mory (in other w
264b0 6f 72 64 73 2c 20 6d 6f 73 74 0a 2a 2a 20 6f 70  ords, most.** op
264c0 65 6e 20 66 69 6c 65 73 29 20 77 6f 75 6c 64 20  en files) would 
264d0 68 61 76 65 20 74 6f 20 63 61 72 72 79 20 61 72  have to carry ar
264e0 6f 75 6e 64 20 74 68 69 73 20 65 78 74 72 61 20  ound this extra 
264f0 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 53 6f  information.  So
26500 0a 2a 2a 20 74 68 65 20 75 6e 69 78 49 6e 6f 64  .** the unixInod
26510 65 49 6e 66 6f 20 6f 62 6a 65 63 74 20 63 6f 6e  eInfo object con
26520 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 20  tains a pointer 
26530 74 6f 20 74 68 69 73 20 75 6e 69 78 53 68 6d 4e  to this unixShmN
26540 6f 64 65 20 6f 62 6a 65 63 74 0a 2a 2a 20 61 6e  ode object.** an
26550 64 20 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64  d the unixShmNod
26560 65 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61  e object is crea
26570 74 65 64 20 6f 6e 6c 79 20 77 68 65 6e 20 6e 65  ted only when ne
26580 65 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 75 6e 69 78  eded..**.** unix
26590 4d 75 74 65 78 48 65 6c 64 28 29 20 6d 75 73 74  MutexHeld() must
265a0 20 62 65 20 74 72 75 65 20 77 68 65 6e 20 63 72   be true when cr
265b0 65 61 74 69 6e 67 20 6f 72 20 64 65 73 74 72 6f  eating or destro
265c0 79 69 6e 67 0a 2a 2a 20 74 68 69 73 20 6f 62 6a  ying.** this obj
265d0 65 63 74 20 6f 72 20 77 68 69 6c 65 20 72 65 61  ect or while rea
265e0 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20  ding or writing 
265f0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69  the following fi
26600 65 6c 64 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  elds:.**.**     
26610 20 6e 52 65 66 0a 2a 2a 0a 2a 2a 20 54 68 65 20   nRef.**.** The 
26620 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73  following fields
26630 20 61 72 65 20 72 65 61 64 2d 6f 6e 6c 79 20 61   are read-only a
26640 66 74 65 72 20 74 68 65 20 6f 62 6a 65 63 74 20  fter the object 
26650 69 73 20 63 72 65 61 74 65 64 3a 0a 2a 2a 20 0a  is created:.** .
26660 2a 2a 20 20 20 20 20 20 66 69 64 0a 2a 2a 20 20  **      fid.**  
26670 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 0a 2a 2a      zFilename.**
26680 0a 2a 2a 20 45 69 74 68 65 72 20 75 6e 69 78 53  .** Either unixS
26690 68 6d 4e 6f 64 65 2e 6d 75 74 65 78 20 6d 75 73  hmNode.mutex mus
266a0 74 20 62 65 20 68 65 6c 64 20 6f 72 20 75 6e 69  t be held or uni
266b0 78 53 68 6d 4e 6f 64 65 2e 6e 52 65 66 3d 3d 30  xShmNode.nRef==0
266c0 20 61 6e 64 0a 2a 2a 20 75 6e 69 78 4d 75 74 65   and.** unixMute
266d0 78 48 65 6c 64 28 29 20 69 73 20 74 72 75 65 20  xHeld() is true 
266e0 77 68 65 6e 20 72 65 61 64 69 6e 67 20 6f 72 20  when reading or 
266f0 77 72 69 74 69 6e 67 20 61 6e 79 20 6f 74 68 65  writing any othe
26700 72 20 66 69 65 6c 64 0a 2a 2a 20 69 6e 20 74 68  r field.** in th
26710 69 73 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f  is structure..*/
26720 0a 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d 4e  .struct unixShmN
26730 6f 64 65 20 7b 0a 20 20 75 6e 69 78 49 6e 6f 64  ode {.  unixInod
26740 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 20 20  eInfo *pInode;  
26750 20 20 20 2f 2a 20 75 6e 69 78 49 6e 6f 64 65 49     /* unixInodeI
26760 6e 66 6f 20 74 68 61 74 20 6f 77 6e 73 20 74 68  nfo that owns th
26770 69 73 20 53 48 4d 20 6e 6f 64 65 20 2a 2f 0a 20  is SHM node */. 
26780 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a   sqlite3_mutex *
26790 6d 75 74 65 78 3b 20 20 20 20 20 20 2f 2a 20 4d  mutex;      /* M
267a0 75 74 65 78 20 74 6f 20 61 63 63 65 73 73 20 74  utex to access t
267b0 68 69 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  his object */.  
267c0 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b  char *zFilename;
267d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
267e0 6d 65 20 6f 66 20 74 68 65 20 6d 6d 61 70 70 65  me of the mmappe
267f0 64 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  d file */.  int 
26800 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h;              
26810 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 66         /* Open f
26820 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a  ile descriptor *
26830 2f 0a 20 20 69 6e 74 20 73 7a 52 65 67 69 6f 6e  /.  int szRegion
26840 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
26850 2a 20 53 69 7a 65 20 6f 66 20 73 68 61 72 65 64  * Size of shared
26860 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 73 20  -memory regions 
26870 2a 2f 0a 20 20 75 31 36 20 6e 52 65 67 69 6f 6e  */.  u16 nRegion
26880 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
26890 2f 2a 20 53 69 7a 65 20 6f 66 20 61 72 72 61 79  /* Size of array
268a0 20 61 70 52 65 67 69 6f 6e 20 2a 2f 0a 20 20 75   apRegion */.  u
268b0 38 20 69 73 52 65 61 64 6f 6e 6c 79 3b 20 20 20  8 isReadonly;   
268c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
268d0 65 20 69 66 20 72 65 61 64 2d 6f 6e 6c 79 20 2a  e if read-only *
268e0 2f 0a 20 20 63 68 61 72 20 2a 2a 61 70 52 65 67  /.  char **apReg
268f0 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ion;           /
26900 2a 20 41 72 72 61 79 20 6f 66 20 6d 61 70 70 65  * Array of mappe
26910 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  d shared-memory 
26920 72 65 67 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74  regions */.  int
26930 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20 20 20   nRef;          
26940 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
26950 72 20 6f 66 20 75 6e 69 78 53 68 6d 20 6f 62 6a  r of unixShm obj
26960 65 63 74 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f  ects pointing to
26970 20 74 68 69 73 20 2a 2f 0a 20 20 75 6e 69 78 53   this */.  unixS
26980 68 6d 20 2a 70 46 69 72 73 74 3b 20 20 20 20 20  hm *pFirst;     
26990 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 75 6e 69        /* All uni
269a0 78 53 68 6d 20 6f 62 6a 65 63 74 73 20 70 6f 69  xShm objects poi
269b0 6e 74 69 6e 67 20 74 6f 20 74 68 69 73 20 2a 2f  nting to this */
269c0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
269d0 45 42 55 47 0a 20 20 75 38 20 65 78 63 6c 4d 61  EBUG.  u8 exclMa
269e0 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  sk;             
269f0 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 65 78 63    /* Mask of exc
26a00 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20 68 65 6c  lusive locks hel
26a10 64 20 2a 2f 0a 20 20 75 38 20 73 68 61 72 65 64  d */.  u8 shared
26a20 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20  Mask;           
26a30 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 73 68 61    /* Mask of sha
26a40 72 65 64 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a  red locks held *
26a50 2f 0a 20 20 75 38 20 6e 65 78 74 53 68 6d 49 64  /.  u8 nextShmId
26a60 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
26a70 2a 20 4e 65 78 74 20 61 76 61 69 6c 61 62 6c 65  * Next available
26a80 20 75 6e 69 78 53 68 6d 2e 69 64 20 76 61 6c 75   unixShm.id valu
26a90 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a  e */.#endif.};..
26aa0 2f 2a 0a 2a 2a 20 53 74 72 75 63 74 75 72 65 20  /*.** Structure 
26ab0 75 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 20  used internally 
26ac0 62 79 20 74 68 69 73 20 56 46 53 20 74 6f 20 72  by this VFS to r
26ad0 65 63 6f 72 64 20 74 68 65 20 73 74 61 74 65 20  ecord the state 
26ae0 6f 66 20 61 6e 0a 2a 2a 20 6f 70 65 6e 20 73 68  of an.** open sh
26af0 61 72 65 64 20 6d 65 6d 6f 72 79 20 63 6f 6e 6e  ared memory conn
26b00 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  ection..**.** Th
26b10 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c  e following fiel
26b20 64 73 20 61 72 65 20 69 6e 69 74 69 61 6c 69 7a  ds are initializ
26b30 65 64 20 77 68 65 6e 20 74 68 69 73 20 6f 62 6a  ed when this obj
26b40 65 63 74 20 69 73 20 63 72 65 61 74 65 64 20 61  ect is created a
26b50 6e 64 0a 2a 2a 20 61 72 65 20 72 65 61 64 2d 6f  nd.** are read-o
26b60 6e 6c 79 20 74 68 65 72 65 61 66 74 65 72 3a 0a  nly thereafter:.
26b70 2a 2a 0a 2a 2a 20 20 20 20 75 6e 69 78 53 68 6d  **.**    unixShm
26b80 2e 70 46 69 6c 65 0a 2a 2a 20 20 20 20 75 6e 69  .pFile.**    uni
26b90 78 53 68 6d 2e 69 64 0a 2a 2a 0a 2a 2a 20 41 6c  xShm.id.**.** Al
26ba0 6c 20 6f 74 68 65 72 20 66 69 65 6c 64 73 20 61  l other fields a
26bb0 72 65 20 72 65 61 64 2f 77 72 69 74 65 2e 20 20  re read/write.  
26bc0 54 68 65 20 75 6e 69 78 53 68 6d 2e 70 46 69 6c  The unixShm.pFil
26bd0 65 2d 3e 6d 75 74 65 78 20 6d 75 73 74 20 62 65  e->mutex must be
26be0 20 68 65 6c 64 0a 2a 2a 20 77 68 69 6c 65 20 61   held.** while a
26bf0 63 63 65 73 73 69 6e 67 20 61 6e 79 20 72 65 61  ccessing any rea
26c00 64 2f 77 72 69 74 65 20 66 69 65 6c 64 73 2e 0a  d/write fields..
26c10 2a 2f 0a 73 74 72 75 63 74 20 75 6e 69 78 53 68  */.struct unixSh
26c20 6d 20 7b 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64  m {.  unixShmNod
26c30 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20 20  e *pShmNode;    
26c40 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69   /* The underlyi
26c50 6e 67 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f  ng unixShmNode o
26c60 62 6a 65 63 74 20 2a 2f 0a 20 20 75 6e 69 78 53  bject */.  unixS
26c70 68 6d 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20  hm *pNext;      
26c80 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 75 6e        /* Next un
26c90 69 78 53 68 6d 20 77 69 74 68 20 74 68 65 20 73  ixShm with the s
26ca0 61 6d 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  ame unixShmNode 
26cb0 2a 2f 0a 20 20 75 38 20 68 61 73 4d 75 74 65 78  */.  u8 hasMutex
26cc0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
26cd0 2f 2a 20 54 72 75 65 20 69 66 20 68 6f 6c 64 69  /* True if holdi
26ce0 6e 67 20 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f  ng the unixShmNo
26cf0 64 65 20 6d 75 74 65 78 20 2a 2f 0a 20 20 75 38  de mutex */.  u8
26d00 20 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20   id;            
26d10 20 20 20 20 20 20 20 20 20 2f 2a 20 49 64 20 6f           /* Id o
26d20 66 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f  f this connectio
26d30 6e 20 77 69 74 68 69 6e 20 69 74 73 20 75 6e 69  n within its uni
26d40 78 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 75 31  xShmNode */.  u1
26d50 36 20 73 68 61 72 65 64 4d 61 73 6b 3b 20 20 20  6 sharedMask;   
26d60 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b           /* Mask
26d70 20 6f 66 20 73 68 61 72 65 64 20 6c 6f 63 6b 73   of shared locks
26d80 20 68 65 6c 64 20 2a 2f 0a 20 20 75 31 36 20 65   held */.  u16 e
26d90 78 63 6c 4d 61 73 6b 3b 20 20 20 20 20 20 20 20  xclMask;        
26da0 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
26db0 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73   exclusive locks
26dc0 20 68 65 6c 64 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a   held */.};../*.
26dd0 2a 2a 20 43 6f 6e 73 74 61 6e 74 73 20 75 73 65  ** Constants use
26de0 64 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 0a 2a 2f  d for locking.*/
26df0 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 5f 53 48  .#define UNIX_SH
26e00 4d 5f 42 41 53 45 20 20 20 28 28 32 32 2b 53 51  M_BASE   ((22+SQ
26e10 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 29 2a  LITE_SHM_NLOCK)*
26e20 34 29 20 20 20 20 20 20 20 20 20 2f 2a 20 66 69  4)         /* fi
26e30 72 73 74 20 6c 6f 63 6b 20 62 79 74 65 20 2a 2f  rst lock byte */
26e40 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 5f 53 48  .#define UNIX_SH
26e50 4d 5f 44 4d 53 20 20 20 20 28 55 4e 49 58 5f 53  M_DMS    (UNIX_S
26e60 48 4d 5f 42 41 53 45 2b 53 51 4c 49 54 45 5f 53  HM_BASE+SQLITE_S
26e70 48 4d 5f 4e 4c 4f 43 4b 29 20 20 2f 2a 20 64 65  HM_NLOCK)  /* de
26e80 61 64 6d 61 6e 20 73 77 69 74 63 68 20 2a 2f 0a  adman switch */.
26e90 0a 2f 2a 0a 2a 2a 20 41 70 70 6c 79 20 70 6f 73  ./*.** Apply pos
26ea0 69 78 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b  ix advisory lock
26eb0 73 20 66 6f 72 20 61 6c 6c 20 62 79 74 65 73 20  s for all bytes 
26ec0 66 72 6f 6d 20 6f 66 73 74 20 74 68 72 6f 75 67  from ofst throug
26ed0 68 20 6f 66 73 74 2b 6e 2d 31 2e 0a 2a 2a 0a 2a  h ofst+n-1..**.*
26ee0 2a 20 4c 6f 63 6b 73 20 62 6c 6f 63 6b 20 69 66  * Locks block if
26ef0 20 74 68 65 20 6d 61 73 6b 20 69 73 20 65 78 61   the mask is exa
26f00 63 74 6c 79 20 55 4e 49 58 5f 53 48 4d 5f 43 20  ctly UNIX_SHM_C 
26f10 61 6e 64 20 61 72 65 20 6e 6f 6e 2d 62 6c 6f 63  and are non-bloc
26f20 6b 69 6e 67 0a 2a 2a 20 6f 74 68 65 72 77 69 73  king.** otherwis
26f30 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
26f40 20 75 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f   unixShmSystemLo
26f50 63 6b 28 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64  ck(.  unixShmNod
26f60 65 20 2a 70 53 68 6d 4e 6f 64 65 2c 20 2f 2a 20  e *pShmNode, /* 
26f70 41 70 70 6c 79 20 6c 6f 63 6b 73 20 74 6f 20 74  Apply locks to t
26f80 68 69 73 20 6f 70 65 6e 20 73 68 61 72 65 64 2d  his open shared-
26f90 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74 20 2a  memory segment *
26fa0 2f 0a 20 20 69 6e 74 20 6c 6f 63 6b 54 79 70 65  /.  int lockType
26fb0 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 5f  ,          /* F_
26fc0 55 4e 4c 43 4b 2c 20 46 5f 52 44 4c 43 4b 2c 20  UNLCK, F_RDLCK, 
26fd0 6f 72 20 46 5f 57 52 4c 43 4b 20 2a 2f 0a 20 20  or F_WRLCK */.  
26fe0 69 6e 74 20 6f 66 73 74 2c 20 20 20 20 20 20 20  int ofst,       
26ff0 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
27000 62 79 74 65 20 6f 66 20 74 68 65 20 6c 6f 63 6b  byte of the lock
27010 69 6e 67 20 72 61 6e 67 65 20 2a 2f 0a 20 20 69  ing range */.  i
27020 6e 74 20 6e 20 20 20 20 20 20 20 20 20 20 20 20  nt n            
27030 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
27040 6f 66 20 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b  of bytes to lock
27050 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20   */.){.  struct 
27060 66 6c 6f 63 6b 20 66 3b 20 20 20 20 20 20 20 2f  flock f;       /
27070 2a 20 54 68 65 20 70 6f 73 69 78 20 61 64 76 69  * The posix advi
27080 73 6f 72 79 20 6c 6f 63 6b 69 6e 67 20 73 74 72  sory locking str
27090 75 63 74 75 72 65 20 2a 2f 0a 20 20 69 6e 74 20  ucture */.  int 
270a0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
270b0 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
270c0 20 66 6f 72 6d 20 66 63 6e 74 6c 28 29 20 2a 2f   form fcntl() */
270d0 0a 0a 20 20 2f 2a 20 41 63 63 65 73 73 20 74 6f  ..  /* Access to
270e0 20 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65   the unixShmNode
270f0 20 6f 62 6a 65 63 74 20 69 73 20 73 65 72 69 61   object is seria
27100 6c 69 7a 65 64 20 62 79 20 74 68 65 20 63 61 6c  lized by the cal
27110 6c 65 72 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ler */.  assert(
27120 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
27130 65 6c 64 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  eld(pShmNode->mu
27140 74 65 78 29 20 7c 7c 20 70 53 68 6d 4e 6f 64 65  tex) || pShmNode
27150 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 0a 20 20  ->nRef==0 );..  
27160 2f 2a 20 53 68 61 72 65 64 20 6c 6f 63 6b 73 20  /* Shared locks 
27170 6e 65 76 65 72 20 73 70 61 6e 20 6d 6f 72 65 20  never span more 
27180 74 68 61 6e 20 6f 6e 65 20 62 79 74 65 20 2a 2f  than one byte */
27190 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 31 20  .  assert( n==1 
271a0 7c 7c 20 6c 6f 63 6b 54 79 70 65 21 3d 46 5f 52  || lockType!=F_R
271b0 44 4c 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 4c 6f  DLCK );..  /* Lo
271c0 63 6b 73 20 61 72 65 20 77 69 74 68 69 6e 20 72  cks are within r
271d0 61 6e 67 65 20 2a 2f 0a 20 20 61 73 73 65 72 74  ange */.  assert
271e0 28 20 6e 3e 3d 31 20 26 26 20 6e 3c 53 51 4c 49  ( n>=1 && n<SQLI
271f0 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 20 29 3b 0a  TE_SHM_NLOCK );.
27200 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d  .  if( pShmNode-
27210 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  >h>=0 ){.    /* 
27220 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6c  Initialize the l
27230 6f 63 6b 69 6e 67 20 70 61 72 61 6d 65 74 65 72  ocking parameter
27240 73 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28  s */.    memset(
27250 26 66 2c 20 30 2c 20 73 69 7a 65 6f 66 28 66 29  &f, 0, sizeof(f)
27260 29 3b 0a 20 20 20 20 66 2e 6c 5f 74 79 70 65 20  );.    f.l_type 
27270 3d 20 6c 6f 63 6b 54 79 70 65 3b 0a 20 20 20 20  = lockType;.    
27280 66 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45  f.l_whence = SEE
27290 4b 5f 53 45 54 3b 0a 20 20 20 20 66 2e 6c 5f 73  K_SET;.    f.l_s
272a0 74 61 72 74 20 3d 20 6f 66 73 74 3b 0a 20 20 20  tart = ofst;.   
272b0 20 66 2e 6c 5f 6c 65 6e 20 3d 20 6e 3b 0a 0a 20   f.l_len = n;.. 
272c0 20 20 20 72 63 20 3d 20 6f 73 46 63 6e 74 6c 28     rc = osFcntl(
272d0 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 46 5f 53  pShmNode->h, F_S
272e0 45 54 4c 4b 2c 20 26 66 29 3b 0a 20 20 20 20 72  ETLK, &f);.    r
272f0 63 20 3d 20 28 72 63 21 3d 28 2d 31 29 29 20 3f  c = (rc!=(-1)) ?
27300 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 53 51 4c   SQLITE_OK : SQL
27310 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 0a 20  ITE_BUSY;.  }.. 
27320 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 67   /* Update the g
27330 6c 6f 62 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65  lobal lock state
27340 20 61 6e 64 20 64 6f 20 64 65 62 75 67 20 74 72   and do debug tr
27350 61 63 69 6e 67 20 2a 2f 0a 23 69 66 64 65 66 20  acing */.#ifdef 
27360 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 7b  SQLITE_DEBUG.  {
27370 20 75 31 36 20 6d 61 73 6b 3b 0a 20 20 4f 53 54   u16 mask;.  OST
27380 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b 20  RACE(("SHM-LOCK 
27390 22 29 29 3b 0a 20 20 6d 61 73 6b 20 3d 20 6f 66  "));.  mask = of
273a0 73 74 3e 33 31 20 3f 20 30 78 66 66 66 66 20 3a  st>31 ? 0xffff :
273b0 20 28 31 3c 3c 28 6f 66 73 74 2b 6e 29 29 20 2d   (1<<(ofst+n)) -
273c0 20 28 31 3c 3c 6f 66 73 74 29 3b 0a 20 20 69 66   (1<<ofst);.  if
273d0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
273e0 29 7b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 54  ){.    if( lockT
273f0 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a  ype==F_UNLCK ){.
27400 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
27410 75 6e 6c 6f 63 6b 20 25 64 20 6f 6b 22 2c 20 6f  unlock %d ok", o
27420 66 73 74 29 29 3b 0a 20 20 20 20 20 20 70 53 68  fst));.      pSh
27430 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61 73 6b 20  mNode->exclMask 
27440 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 20 20  &= ~mask;.      
27450 70 53 68 6d 4e 6f 64 65 2d 3e 73 68 61 72 65 64  pShmNode->shared
27460 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20  Mask &= ~mask;. 
27470 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63     }else if( loc
27480 6b 54 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29  kType==F_RDLCK )
27490 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  {.      OSTRACE(
274a0 28 22 72 65 61 64 2d 6c 6f 63 6b 20 25 64 20 6f  ("read-lock %d o
274b0 6b 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20 20  k", ofst));.    
274c0 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c    pShmNode->excl
274d0 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20  Mask &= ~mask;. 
274e0 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73       pShmNode->s
274f0 68 61 72 65 64 4d 61 73 6b 20 7c 3d 20 6d 61 73  haredMask |= mas
27500 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  k;.    }else{.  
27510 20 20 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b      assert( lock
27520 54 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 3b  Type==F_WRLCK );
27530 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
27540 22 77 72 69 74 65 2d 6c 6f 63 6b 20 25 64 20 6f  "write-lock %d o
27550 6b 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20 20  k", ofst));.    
27560 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c    pShmNode->excl
27570 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20  Mask |= mask;.  
27580 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 68      pShmNode->sh
27590 61 72 65 64 4d 61 73 6b 20 26 3d 20 7e 6d 61 73  aredMask &= ~mas
275a0 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  k;.    }.  }else
275b0 7b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 54 79  {.    if( lockTy
275c0 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20  pe==F_UNLCK ){. 
275d0 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 75       OSTRACE(("u
275e0 6e 6c 6f 63 6b 20 25 64 20 66 61 69 6c 65 64 22  nlock %d failed"
275f0 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20 20 7d 65  , ofst));.    }e
27600 6c 73 65 20 69 66 28 20 6c 6f 63 6b 54 79 70 65  lse if( lockType
27610 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20 20  ==F_RDLCK ){.   
27620 20 20 20 4f 53 54 52 41 43 45 28 28 22 72 65 61     OSTRACE(("rea
27630 64 2d 6c 6f 63 6b 20 66 61 69 6c 65 64 22 29 29  d-lock failed"))
27640 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
27650 20 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 54     assert( lockT
27660 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 3b 0a  ype==F_WRLCK );.
27670 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
27680 77 72 69 74 65 2d 6c 6f 63 6b 20 25 64 20 66 61  write-lock %d fa
27690 69 6c 65 64 22 2c 20 6f 66 73 74 29 29 3b 0a 20  iled", ofst));. 
276a0 20 20 20 7d 0a 20 20 7d 0a 20 20 4f 53 54 52 41     }.  }.  OSTRA
276b0 43 45 28 28 22 20 2d 20 61 66 74 65 72 77 61 72  CE((" - afterwar
276c0 64 73 20 25 30 33 78 2c 25 30 33 78 5c 6e 22 2c  ds %03x,%03x\n",
276d0 0a 20 20 20 20 20 20 20 20 20 20 20 70 53 68 6d  .           pShm
276e0 4e 6f 64 65 2d 3e 73 68 61 72 65 64 4d 61 73 6b  Node->sharedMask
276f0 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c  , pShmNode->excl
27700 4d 61 73 6b 29 29 3b 0a 20 20 7d 0a 23 65 6e 64  Mask));.  }.#end
27710 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  if..  return rc;
27720 20 20 20 20 20 20 20 20 0a 7d 0a 0a 2f 2a 0a 2a          .}../*.*
27730 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6d 69 6e  * Return the min
27740 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 33  imum number of 3
27750 32 4b 42 20 73 68 6d 20 72 65 67 69 6f 6e 73 20  2KB shm regions 
27760 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 6d  that should be m
27770 61 70 70 65 64 20 61 74 0a 2a 2a 20 61 20 74 69  apped at.** a ti
27780 6d 65 2c 20 61 73 73 75 6d 69 6e 67 20 74 68 61  me, assuming tha
27790 74 20 65 61 63 68 20 6d 61 70 70 69 6e 67 20 6d  t each mapping m
277a0 75 73 74 20 62 65 20 61 6e 20 69 6e 74 65 67 65  ust be an intege
277b0 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 74 68  r multiple of th
277c0 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 73 79 73  e.** current sys
277d0 74 65 6d 20 70 61 67 65 2d 73 69 7a 65 2e 0a 2a  tem page-size..*
277e0 2a 0a 2a 2a 20 55 73 75 61 6c 6c 79 2c 20 74 68  *.** Usually, th
277f0 69 73 20 69 73 20 31 2e 20 54 68 65 20 65 78 63  is is 1. The exc
27800 65 70 74 69 6f 6e 20 73 65 65 6d 73 20 74 6f 20  eption seems to 
27810 62 65 20 73 79 73 74 65 6d 73 20 74 68 61 74 20  be systems that 
27820 61 72 65 20 63 6f 6e 66 69 67 75 72 65 64 0a 2a  are configured.*
27830 2a 20 74 6f 20 75 73 65 20 36 34 4b 42 20 70 61  * to use 64KB pa
27840 67 65 73 20 2d 20 69 6e 20 74 68 69 73 20 63 61  ges - in this ca
27850 73 65 20 65 61 63 68 20 6d 61 70 70 69 6e 67 20  se each mapping 
27860 6d 75 73 74 20 63 6f 76 65 72 20 61 74 20 6c 65  must cover at le
27870 61 73 74 20 74 77 6f 0a 2a 2a 20 73 68 6d 20 72  ast two.** shm r
27880 65 67 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69  egions..*/.stati
27890 63 20 69 6e 74 20 75 6e 69 78 53 68 6d 52 65 67  c int unixShmReg
278a0 69 6f 6e 50 65 72 4d 61 70 28 76 6f 69 64 29 7b  ionPerMap(void){
278b0 0a 20 20 69 6e 74 20 73 68 6d 73 7a 20 3d 20 33  .  int shmsz = 3
278c0 32 2a 31 30 32 34 3b 20 20 20 20 20 20 20 20 20  2*1024;         
278d0 20 20 20 2f 2a 20 53 48 4d 20 72 65 67 69 6f 6e     /* SHM region
278e0 20 73 69 7a 65 20 2a 2f 0a 20 20 69 6e 74 20 70   size */.  int p
278f0 67 73 7a 20 3d 20 6f 73 47 65 74 70 61 67 65 73  gsz = osGetpages
27900 69 7a 65 28 29 3b 20 20 20 2f 2a 20 53 79 73 74  ize();   /* Syst
27910 65 6d 20 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a  em page size */.
27920 20 20 61 73 73 65 72 74 28 20 28 28 70 67 73 7a    assert( ((pgsz
27930 2d 31 29 26 70 67 73 7a 29 3d 3d 30 20 29 3b 20  -1)&pgsz)==0 ); 
27940 20 20 2f 2a 20 50 61 67 65 20 73 69 7a 65 20 6d    /* Page size m
27950 75 73 74 20 62 65 20 61 20 70 6f 77 65 72 20 6f  ust be a power o
27960 66 20 32 20 2a 2f 0a 20 20 69 66 28 20 70 67 73  f 2 */.  if( pgs
27970 7a 3c 73 68 6d 73 7a 20 29 20 72 65 74 75 72 6e  z<shmsz ) return
27980 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 70 67 73   1;.  return pgs
27990 7a 2f 73 68 6d 73 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a  z/shmsz;.}../*.*
279a0 2a 20 50 75 72 67 65 20 74 68 65 20 75 6e 69 78  * Purge the unix
279b0 53 68 6d 4e 6f 64 65 4c 69 73 74 20 6c 69 73 74  ShmNodeList list
279c0 20 6f 66 20 61 6c 6c 20 65 6e 74 72 69 65 73 20   of all entries 
279d0 77 69 74 68 20 75 6e 69 78 53 68 6d 4e 6f 64 65  with unixShmNode
279e0 2e 6e 52 65 66 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20  .nRef==0..**.** 
279f0 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20 56 46  This is not a VF
27a00 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  S shared-memory 
27a10 6d 65 74 68 6f 64 3b 20 69 74 20 69 73 20 61 20  method; it is a 
27a20 75 74 69 6c 69 74 79 20 66 75 6e 63 74 69 6f 6e  utility function
27a30 20 63 61 6c 6c 65 64 0a 2a 2a 20 62 79 20 56 46   called.** by VF
27a40 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  S shared-memory 
27a50 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a 73 74 61 74  methods..*/.stat
27a60 69 63 20 76 6f 69 64 20 75 6e 69 78 53 68 6d 50  ic void unixShmP
27a70 75 72 67 65 28 75 6e 69 78 46 69 6c 65 20 2a 70  urge(unixFile *p
27a80 46 64 29 7b 0a 20 20 75 6e 69 78 53 68 6d 4e 6f  Fd){.  unixShmNo
27a90 64 65 20 2a 70 20 3d 20 70 46 64 2d 3e 70 49 6e  de *p = pFd->pIn
27aa0 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20  ode->pShmNode;. 
27ab0 20 61 73 73 65 72 74 28 20 75 6e 69 78 4d 75 74   assert( unixMut
27ac0 65 78 48 65 6c 64 28 29 20 29 3b 0a 20 20 69 66  exHeld() );.  if
27ad0 28 20 70 20 26 26 20 70 2d 3e 6e 52 65 66 3d 3d  ( p && p->nRef==
27ae0 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 53 68  0 ){.    int nSh
27af0 6d 50 65 72 4d 61 70 20 3d 20 75 6e 69 78 53 68  mPerMap = unixSh
27b00 6d 52 65 67 69 6f 6e 50 65 72 4d 61 70 28 29 3b  mRegionPerMap();
27b10 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
27b20 61 73 73 65 72 74 28 20 70 2d 3e 70 49 6e 6f 64  assert( p->pInod
27b30 65 3d 3d 70 46 64 2d 3e 70 49 6e 6f 64 65 20 29  e==pFd->pInode )
27b40 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75  ;.    sqlite3_mu
27b50 74 65 78 5f 66 72 65 65 28 70 2d 3e 6d 75 74 65  tex_free(p->mute
27b60 78 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  x);.    for(i=0;
27b70 20 69 3c 70 2d 3e 6e 52 65 67 69 6f 6e 3b 20 69   i<p->nRegion; i
27b80 2b 3d 6e 53 68 6d 50 65 72 4d 61 70 29 7b 0a 20  +=nShmPerMap){. 
27b90 20 20 20 20 20 69 66 28 20 70 2d 3e 68 3e 3d 30       if( p->h>=0
27ba0 20 29 7b 0a 20 20 20 20 20 20 20 20 6f 73 4d 75   ){.        osMu
27bb0 6e 6d 61 70 28 70 2d 3e 61 70 52 65 67 69 6f 6e  nmap(p->apRegion
27bc0 5b 69 5d 2c 20 70 2d 3e 73 7a 52 65 67 69 6f 6e  [i], p->szRegion
27bd0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
27be0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
27bf0 66 72 65 65 28 70 2d 3e 61 70 52 65 67 69 6f 6e  free(p->apRegion
27c00 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  [i]);.      }.  
27c10 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
27c20 66 72 65 65 28 70 2d 3e 61 70 52 65 67 69 6f 6e  free(p->apRegion
27c30 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 68 3e  );.    if( p->h>
27c40 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 6f 62 75  =0 ){.      robu
27c50 73 74 5f 63 6c 6f 73 65 28 70 46 64 2c 20 70 2d  st_close(pFd, p-
27c60 3e 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20  >h, __LINE__);. 
27c70 20 20 20 20 20 70 2d 3e 68 20 3d 20 2d 31 3b 0a       p->h = -1;.
27c80 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 70 49 6e      }.    p->pIn
27c90 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d 20  ode->pShmNode = 
27ca0 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  0;.    sqlite3_f
27cb0 72 65 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 23  ree(p);.  }.}..#
27cc0 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
27cd0 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f  LE__) && SQLITE_
27ce0 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
27cf0 54 59 4c 45 0a 73 74 61 74 69 63 20 63 6f 6e 73  TYLE.static cons
27d00 74 20 63 68 61 72 20 2a 70 72 6f 78 79 53 68 61  t char *proxySha
27d10 72 65 64 4d 65 6d 6f 72 79 42 61 73 65 50 61 74  redMemoryBasePat
27d20 68 28 75 6e 69 78 46 69 6c 65 20 2a 29 3b 0a 23  h(unixFile *);.#
27d30 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65  endif../*.** Ope
27d40 6e 20 61 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  n a shared-memor
27d50 79 20 61 72 65 61 20 61 73 73 6f 63 69 61 74 65  y area associate
27d60 64 20 77 69 74 68 20 6f 70 65 6e 20 64 61 74 61  d with open data
27d70 62 61 73 65 20 66 69 6c 65 20 70 44 62 46 64 2e  base file pDbFd.
27d80 20 20 0a 2a 2a 20 54 68 69 73 20 70 61 72 74 69    .** This parti
27d90 63 75 6c 61 72 20 69 6d 70 6c 65 6d 65 6e 74 61  cular implementa
27da0 74 69 6f 6e 20 75 73 65 73 20 6d 6d 61 70 70 65  tion uses mmappe
27db0 64 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54  d files..**.** T
27dc0 68 65 20 66 69 6c 65 20 75 73 65 64 20 74 6f 20  he file used to 
27dd0 69 6d 70 6c 65 6d 65 6e 74 20 73 68 61 72 65 64  implement shared
27de0 2d 6d 65 6d 6f 72 79 20 69 73 20 69 6e 20 74 68  -memory is in th
27df0 65 20 73 61 6d 65 20 64 69 72 65 63 74 6f 72 79  e same directory
27e00 0a 2a 2a 20 61 73 20 74 68 65 20 6f 70 65 6e 20  .** as the open 
27e10 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e  database file an
27e20 64 20 68 61 73 20 74 68 65 20 73 61 6d 65 20 6e  d has the same n
27e30 61 6d 65 20 61 73 20 74 68 65 20 6f 70 65 6e 20  ame as the open 
27e40 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65  database.** file
27e50 20 77 69 74 68 20 74 68 65 20 22 2d 73 68 6d 22   with the "-shm"
27e60 20 73 75 66 66 69 78 20 61 64 64 65 64 2e 20 20   suffix added.  
27e70 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20  For example, if 
27e80 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
27e90 65 0a 2a 2a 20 69 73 20 22 2f 68 6f 6d 65 2f 75  e.** is "/home/u
27ea0 73 65 72 31 2f 63 6f 6e 66 69 67 2e 64 62 22 20  ser1/config.db" 
27eb0 74 68 65 6e 20 74 68 65 20 66 69 6c 65 20 74 68  then the file th
27ec0 61 74 20 69 73 20 63 72 65 61 74 65 64 20 61 6e  at is created an
27ed0 64 20 6d 6d 61 70 70 65 64 0a 2a 2a 20 66 6f 72  d mmapped.** for
27ee0 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 77   shared memory w
27ef0 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 22 2f  ill be called "/
27f00 68 6f 6d 65 2f 75 73 65 72 31 2f 63 6f 6e 66 69  home/user1/confi
27f10 67 2e 64 62 2d 73 68 6d 22 2e 20 20 0a 2a 2a 0a  g.db-shm".  .**.
27f20 2a 2a 20 41 6e 6f 74 68 65 72 20 61 70 70 72 6f  ** Another appro
27f30 61 63 68 20 74 6f 20 69 73 20 74 6f 20 75 73 65  ach to is to use
27f40 20 66 69 6c 65 73 20 69 6e 20 2f 64 65 76 2f 73   files in /dev/s
27f50 68 6d 20 6f 72 20 2f 64 65 76 2f 74 6d 70 20 6f  hm or /dev/tmp o
27f60 72 20 61 6e 0a 2a 2a 20 73 6f 6d 65 20 6f 74 68  r an.** some oth
27f70 65 72 20 74 6d 70 66 73 20 6d 6f 75 6e 74 2e 20  er tmpfs mount. 
27f80 42 75 74 20 69 66 20 61 20 66 69 6c 65 20 69 6e  But if a file in
27f90 20 61 20 64 69 66 66 65 72 65 6e 74 20 64 69 72   a different dir
27fa0 65 63 74 6f 72 79 0a 2a 2a 20 66 72 6f 6d 20 74  ectory.** from t
27fb0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
27fc0 20 69 73 20 75 73 65 64 2c 20 74 68 65 6e 20 64   is used, then d
27fd0 69 66 66 65 72 69 6e 67 20 61 63 63 65 73 73 20  iffering access 
27fe0 70 65 72 6d 69 73 73 69 6f 6e 73 0a 2a 2a 20 6f  permissions.** o
27ff0 72 20 61 20 63 68 72 6f 6f 74 28 29 20 6d 69 67  r a chroot() mig
28000 68 74 20 63 61 75 73 65 20 74 77 6f 20 64 69 66  ht cause two dif
28010 66 65 72 65 6e 74 20 70 72 6f 63 65 73 73 65 73  ferent processes
28020 20 6f 6e 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20   on the same.** 
28030 64 61 74 61 62 61 73 65 20 74 6f 20 65 6e 64 20  database to end 
28040 75 70 20 75 73 69 6e 67 20 64 69 66 66 65 72 65  up using differe
28050 6e 74 20 66 69 6c 65 73 20 66 6f 72 20 73 68 61  nt files for sha
28060 72 65 64 20 6d 65 6d 6f 72 79 20 2d 20 0a 2a 2a  red memory - .**
28070 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 74 68   meaning that th
28080 65 69 72 20 6d 65 6d 6f 72 79 20 77 6f 75 6c 64  eir memory would
28090 20 6e 6f 74 20 72 65 61 6c 6c 79 20 62 65 20 73   not really be s
280a0 68 61 72 65 64 20 2d 20 72 65 73 75 6c 74 69 6e  hared - resultin
280b0 67 0a 2a 2a 20 69 6e 20 64 61 74 61 62 61 73 65  g.** in database
280c0 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20 4e 65   corruption.  Ne
280d0 76 65 72 74 68 65 6c 65 73 73 2c 20 74 68 69 73  vertheless, this
280e0 20 74 6d 70 66 73 20 66 69 6c 65 20 75 73 61 67   tmpfs file usag
280f0 65 0a 2a 2a 20 63 61 6e 20 62 65 20 65 6e 61 62  e.** can be enab
28100 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74  led at compile-t
28110 69 6d 65 20 75 73 69 6e 67 20 2d 44 53 51 4c 49  ime using -DSQLI
28120 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59  TE_SHM_DIRECTORY
28130 3d 22 2f 64 65 76 2f 73 68 6d 22 0a 2a 2a 20 6f  ="/dev/shm".** o
28140 72 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74  r the equivalent
28150 2e 20 20 54 68 65 20 75 73 65 20 6f 66 20 74 68  .  The use of th
28160 65 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52  e SQLITE_SHM_DIR
28170 45 43 54 4f 52 59 20 63 6f 6d 70 69 6c 65 2d 74  ECTORY compile-t
28180 69 6d 65 0a 2a 2a 20 6f 70 74 69 6f 6e 20 72 65  ime.** option re
28190 73 75 6c 74 73 20 69 6e 20 61 6e 20 69 6e 63 6f  sults in an inco
281a0 6d 70 61 74 69 62 6c 65 20 62 75 69 6c 64 20 6f  mpatible build o
281b0 66 20 53 51 4c 69 74 65 3b 20 20 62 75 69 6c 64  f SQLite;  build
281c0 73 20 6f 66 20 53 51 4c 69 74 65 0a 2a 2a 20 74  s of SQLite.** t
281d0 68 61 74 20 77 69 74 68 20 64 69 66 66 65 72 69  hat with differi
281e0 6e 67 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49  ng SQLITE_SHM_DI
281f0 52 45 43 54 4f 52 59 20 73 65 74 74 69 6e 67 73  RECTORY settings
28200 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20   attempt to use 
28210 74 68 65 0a 2a 2a 20 73 61 6d 65 20 64 61 74 61  the.** same data
28220 62 61 73 65 20 66 69 6c 65 20 61 74 20 74 68 65  base file at the
28230 20 73 61 6d 65 20 74 69 6d 65 2c 20 64 61 74 61   same time, data
28240 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20  base corruption 
28250 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72  will likely.** r
28260 65 73 75 6c 74 2e 20 54 68 65 20 53 51 4c 49 54  esult. The SQLIT
28270 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 20  E_SHM_DIRECTORY 
28280 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74  compile-time opt
28290 69 6f 6e 20 69 73 20 63 6f 6e 73 69 64 65 72 65  ion is considere
282a0 64 0a 2a 2a 20 22 75 6e 73 75 70 70 6f 72 74 65  d.** "unsupporte
282b0 64 22 20 61 6e 64 20 6d 61 79 20 67 6f 20 61 77  d" and may go aw
282c0 61 79 20 69 6e 20 61 20 66 75 74 75 72 65 20 53  ay in a future S
282d0 51 4c 69 74 65 20 72 65 6c 65 61 73 65 2e 0a 2a  QLite release..*
282e0 2a 0a 2a 2a 20 57 68 65 6e 20 6f 70 65 6e 69 6e  *.** When openin
282f0 67 20 61 20 6e 65 77 20 73 68 61 72 65 64 2d 6d  g a new shared-m
28300 65 6d 6f 72 79 20 66 69 6c 65 2c 20 69 66 20 6e  emory file, if n
28310 6f 20 6f 74 68 65 72 20 69 6e 73 74 61 6e 63 65  o other instance
28320 73 20 6f 66 20 74 68 61 74 0a 2a 2a 20 66 69 6c  s of that.** fil
28330 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20  e are currently 
28340 6f 70 65 6e 2c 20 69 6e 20 74 68 69 73 20 70 72  open, in this pr
28350 6f 63 65 73 73 20 6f 72 20 69 6e 20 6f 74 68 65  ocess or in othe
28360 72 20 70 72 6f 63 65 73 73 65 73 2c 20 74 68 65  r processes, the
28370 6e 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20 6d 75  n.** the file mu
28380 73 74 20 62 65 20 74 72 75 6e 63 61 74 65 64 20  st be truncated 
28390 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68 20 6f  to zero length o
283a0 72 20 68 61 76 65 20 69 74 73 20 68 65 61 64 65  r have its heade
283b0 72 20 63 6c 65 61 72 65 64 2e 0a 2a 2a 0a 2a 2a  r cleared..**.**
283c0 20 49 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   If the original
283d0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28   database file (
283e0 70 44 62 46 64 29 20 69 73 20 75 73 69 6e 67 20  pDbFd) is using 
283f0 74 68 65 20 22 75 6e 69 78 2d 65 78 63 6c 22 20  the "unix-excl" 
28400 56 46 53 0a 2a 2a 20 74 68 61 74 20 6d 65 61 6e  VFS.** that mean
28410 73 20 74 68 61 74 20 61 6e 20 65 78 63 6c 75 73  s that an exclus
28420 69 76 65 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  ive lock is held
28430 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
28440 20 66 69 6c 65 20 61 6e 64 0a 2a 2a 20 74 68 61   file and.** tha
28450 74 20 6e 6f 20 6f 74 68 65 72 20 70 72 6f 63 65  t no other proce
28460 73 73 65 73 20 61 72 65 20 61 62 6c 65 20 74 6f  sses are able to
28470 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 74   read or write t
28480 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 6e  he database.  In
28490 0a 2a 2a 20 74 68 61 74 20 63 61 73 65 2c 20 77  .** that case, w
284a0 65 20 64 6f 20 6e 6f 74 20 72 65 61 6c 6c 79 20  e do not really 
284b0 6e 65 65 64 20 73 68 61 72 65 64 20 6d 65 6d 6f  need shared memo
284c0 72 79 2e 20 20 4e 6f 20 73 68 61 72 65 64 20 6d  ry.  No shared m
284d0 65 6d 6f 72 79 0a 2a 2a 20 66 69 6c 65 20 69 73  emory.** file is
284e0 20 63 72 65 61 74 65 64 2e 20 20 54 68 65 20 73   created.  The s
284f0 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 77 69 6c  hared memory wil
28500 6c 20 62 65 20 73 69 6d 75 6c 61 74 65 64 20 77  l be simulated w
28510 69 74 68 20 68 65 61 70 20 6d 65 6d 6f 72 79 2e  ith heap memory.
28520 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
28530 6e 69 78 4f 70 65 6e 53 68 61 72 65 64 4d 65 6d  nixOpenSharedMem
28540 6f 72 79 28 75 6e 69 78 46 69 6c 65 20 2a 70 44  ory(unixFile *pD
28550 62 46 64 29 7b 0a 20 20 73 74 72 75 63 74 20 75  bFd){.  struct u
28560 6e 69 78 53 68 6d 20 2a 70 20 3d 20 30 3b 20 20  nixShm *p = 0;  
28570 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
28580 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65 20  onnection to be 
28590 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 73 74 72 75  opened */.  stru
285a0 63 74 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a  ct unixShmNode *
285b0 70 53 68 6d 4e 6f 64 65 3b 20 20 20 2f 2a 20 54  pShmNode;   /* T
285c0 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 6d 6d  he underlying mm
285d0 61 70 70 65 64 20 66 69 6c 65 20 2a 2f 0a 20 20  apped file */.  
285e0 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
285f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28600 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a  /* Result code *
28610 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  /.  unixInodeInf
28620 6f 20 2a 70 49 6e 6f 64 65 3b 20 20 20 20 20 20  o *pInode;      
28630 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 6f 64 65      /* The inode
28640 20 6f 66 20 66 64 20 2a 2f 0a 20 20 63 68 61 72   of fd */.  char
28650 20 2a 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 3b 20   *zShmFilename; 
28660 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
28670 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ame of the file 
28680 75 73 65 64 20 66 6f 72 20 53 48 4d 20 2a 2f 0a  used for SHM */.
28690 20 20 69 6e 74 20 6e 53 68 6d 46 69 6c 65 6e 61    int nShmFilena
286a0 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  me;             
286b0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
286c0 20 53 48 4d 20 66 69 6c 65 6e 61 6d 65 20 69 6e   SHM filename in
286d0 20 62 79 74 65 73 20 2a 2f 0a 0a 20 20 2f 2a 20   bytes */..  /* 
286e0 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  Allocate space f
286f0 6f 72 20 74 68 65 20 6e 65 77 20 75 6e 69 78 53  or the new unixS
28700 68 6d 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20 20  hm object. */.  
28710 70 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  p = sqlite3_mall
28720 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 29 20 29  oc( sizeof(*p) )
28730 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
28740 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
28750 45 4d 3b 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20  EM;.  memset(p, 
28760 30 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a  0, sizeof(*p));.
28770 20 20 61 73 73 65 72 74 28 20 70 44 62 46 64 2d    assert( pDbFd-
28780 3e 70 53 68 6d 3d 3d 30 20 29 3b 0a 0a 20 20 2f  >pShm==0 );..  /
28790 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
287a0 66 20 61 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  f a unixShmNode 
287b0 6f 62 6a 65 63 74 20 61 6c 72 65 61 64 79 20 65  object already e
287c0 78 69 73 74 73 2e 20 52 65 75 73 65 20 61 6e 20  xists. Reuse an 
287d0 65 78 69 73 74 69 6e 67 0a 20 20 2a 2a 20 6f 6e  existing.  ** on
287e0 65 20 69 66 20 70 72 65 73 65 6e 74 2e 20 43 72  e if present. Cr
287f0 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 69  eate a new one i
28800 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 2a  f necessary..  *
28810 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74  /.  unixEnterMut
28820 65 78 28 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d  ex();.  pInode =
28830 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 3b 0a   pDbFd->pInode;.
28840 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 49 6e    pShmNode = pIn
28850 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20  ode->pShmNode;. 
28860 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 3d 3d 30   if( pShmNode==0
28870 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73   ){.    struct s
28880 74 61 74 20 73 53 74 61 74 3b 20 20 20 20 20 20  tat sStat;      
28890 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 73             /* fs
288a0 74 61 74 28 29 20 69 6e 66 6f 20 66 6f 72 20 64  tat() info for d
288b0 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
288c0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
288d0 7a 42 61 73 65 50 61 74 68 20 3d 20 70 44 62 46  zBasePath = pDbF
288e0 64 2d 3e 7a 50 61 74 68 3b 0a 0a 20 20 20 20 2f  d->zPath;..    /
288f0 2a 20 43 61 6c 6c 20 66 73 74 61 74 28 29 20 74  * Call fstat() t
28900 6f 20 66 69 67 75 72 65 20 6f 75 74 20 74 68 65  o figure out the
28910 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 6f 6e 20   permissions on 
28920 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
28930 65 2e 20 49 66 0a 20 20 20 20 2a 2a 20 61 20 6e  e. If.    ** a n
28940 65 77 20 2a 2d 73 68 6d 20 66 69 6c 65 20 69 73  ew *-shm file is
28950 20 63 72 65 61 74 65 64 2c 20 61 6e 20 61 74 74   created, an att
28960 65 6d 70 74 20 77 69 6c 6c 20 62 65 20 6d 61 64  empt will be mad
28970 65 20 74 6f 20 63 72 65 61 74 65 20 69 74 0a 20  e to create it. 
28980 20 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20 73     ** with the s
28990 61 6d 65 20 70 65 72 6d 69 73 73 69 6f 6e 73 2e  ame permissions.
289a0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
289b0 6f 73 46 73 74 61 74 28 70 44 62 46 64 2d 3e 68  osFstat(pDbFd->h
289c0 2c 20 26 73 53 74 61 74 29 20 26 26 20 70 49 6e  , &sStat) && pIn
289d0 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63  ode->bProcessLoc
289e0 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 74  k==0 ){.      st
289f0 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 44 62  oreLastErrno(pDb
28a00 46 64 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20  Fd, errno);.    
28a10 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
28a20 45 52 52 5f 46 53 54 41 54 3b 0a 20 20 20 20 20  ERR_FSTAT;.     
28a30 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65   goto shm_open_e
28a40 72 72 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20 64  rr;.    }..#if d
28a50 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
28a60 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42  ) && SQLITE_ENAB
28a70 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
28a80 0a 20 20 20 20 2f 2a 20 49 66 20 70 44 62 46 64  .    /* If pDbFd
28a90 20 69 73 20 63 6f 6e 66 69 67 75 72 65 64 20 77   is configured w
28aa0 69 74 68 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e  ith proxy lockin
28ab0 67 20 6d 6f 64 65 2c 20 75 73 65 20 74 68 65 20  g mode, use the 
28ac0 6c 6f 63 61 6c 20 0a 20 20 20 20 20 2a 2a 20 6c  local .     ** l
28ad0 6f 63 6b 20 66 69 6c 65 20 70 61 74 68 20 74 6f  ock file path to
28ae0 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 2d   determine the -
28af0 73 68 6d 20 66 69 6c 65 20 70 61 74 68 0a 20 20  shm file path.  
28b00 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 73     */.    if( is
28b10 50 72 6f 78 79 4c 6f 63 6b 69 6e 67 4d 6f 64 65  ProxyLockingMode
28b20 28 70 44 62 46 64 29 20 29 7b 0a 20 20 20 20 20  (pDbFd) ){.     
28b30 20 7a 42 61 73 65 50 61 74 68 20 3d 20 70 72 6f   zBasePath = pro
28b40 78 79 53 68 61 72 65 64 4d 65 6d 6f 72 79 42 61  xySharedMemoryBa
28b50 73 65 50 61 74 68 28 70 44 62 46 64 29 3b 0a 20  sePath(pDbFd);. 
28b60 20 20 20 20 20 69 66 28 20 21 7a 42 61 73 65 50       if( !zBaseP
28b70 61 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ath ){.        r
28b80 63 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  c = SQLITE_CANTO
28b90 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  PEN_BKPT;.      
28ba0 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f    goto shm_open_
28bb0 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  err;.      }.   
28bc0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 0a 23   }.#endif.    .#
28bd0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53 48 4d  ifdef SQLITE_SHM
28be0 5f 44 49 52 45 43 54 4f 52 59 0a 20 20 20 20 6e  _DIRECTORY.    n
28bf0 53 68 6d 46 69 6c 65 6e 61 6d 65 20 3d 20 73 69  ShmFilename = si
28c00 7a 65 6f 66 28 53 51 4c 49 54 45 5f 53 48 4d 5f  zeof(SQLITE_SHM_
28c10 44 49 52 45 43 54 4f 52 59 29 20 2b 20 33 31 3b  DIRECTORY) + 31;
28c20 0a 23 65 6c 73 65 0a 20 20 20 20 6e 53 68 6d 46  .#else.    nShmF
28c30 69 6c 65 6e 61 6d 65 20 3d 20 36 20 2b 20 28 69  ilename = 6 + (i
28c40 6e 74 29 73 74 72 6c 65 6e 28 7a 42 61 73 65 50  nt)strlen(zBaseP
28c50 61 74 68 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  ath);.#endif.   
28c60 20 70 53 68 6d 4e 6f 64 65 20 3d 20 73 71 6c 69   pShmNode = sqli
28c70 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65  te3_malloc( size
28c80 6f 66 28 2a 70 53 68 6d 4e 6f 64 65 29 20 2b 20  of(*pShmNode) + 
28c90 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 20 29 3b 0a  nShmFilename );.
28ca0 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65      if( pShmNode
28cb0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
28cc0 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
28cd0 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f        goto shm_o
28ce0 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 20  pen_err;.    }. 
28cf0 20 20 20 6d 65 6d 73 65 74 28 70 53 68 6d 4e 6f     memset(pShmNo
28d00 64 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70  de, 0, sizeof(*p
28d10 53 68 6d 4e 6f 64 65 29 2b 6e 53 68 6d 46 69 6c  ShmNode)+nShmFil
28d20 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7a 53 68 6d  ename);.    zShm
28d30 46 69 6c 65 6e 61 6d 65 20 3d 20 70 53 68 6d 4e  Filename = pShmN
28d40 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d  ode->zFilename =
28d50 20 28 63 68 61 72 2a 29 26 70 53 68 6d 4e 6f 64   (char*)&pShmNod
28d60 65 5b 31 5d 3b 0a 23 69 66 64 65 66 20 53 51 4c  e[1];.#ifdef SQL
28d70 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52  ITE_SHM_DIRECTOR
28d80 59 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  Y.    sqlite3_sn
28d90 70 72 69 6e 74 66 28 6e 53 68 6d 46 69 6c 65 6e  printf(nShmFilen
28da0 61 6d 65 2c 20 7a 53 68 6d 46 69 6c 65 6e 61 6d  ame, zShmFilenam
28db0 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  e, .            
28dc0 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
28dd0 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 20 22 2f  SHM_DIRECTORY "/
28de0 73 71 6c 69 74 65 2d 73 68 6d 2d 25 78 2d 25 78  sqlite-shm-%x-%x
28df0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
28e00 20 20 20 20 20 20 20 20 28 75 33 32 29 73 53 74          (u32)sSt
28e10 61 74 2e 73 74 5f 69 6e 6f 2c 20 28 75 33 32 29  at.st_ino, (u32)
28e20 73 53 74 61 74 2e 73 74 5f 64 65 76 29 3b 0a 23  sStat.st_dev);.#
28e30 65 6c 73 65 0a 20 20 20 20 73 71 6c 69 74 65 33  else.    sqlite3
28e40 5f 73 6e 70 72 69 6e 74 66 28 6e 53 68 6d 46 69  _snprintf(nShmFi
28e50 6c 65 6e 61 6d 65 2c 20 7a 53 68 6d 46 69 6c 65  lename, zShmFile
28e60 6e 61 6d 65 2c 20 22 25 73 2d 73 68 6d 22 2c 20  name, "%s-shm", 
28e70 7a 42 61 73 65 50 61 74 68 29 3b 0a 20 20 20 20  zBasePath);.    
28e80 73 71 6c 69 74 65 33 46 69 6c 65 53 75 66 66 69  sqlite3FileSuffi
28e90 78 33 28 70 44 62 46 64 2d 3e 7a 50 61 74 68 2c  x3(pDbFd->zPath,
28ea0 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 29 3b 0a   zShmFilename);.
28eb0 23 65 6e 64 69 66 0a 20 20 20 20 70 53 68 6d 4e  #endif.    pShmN
28ec0 6f 64 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20 20  ode->h = -1;.   
28ed0 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e   pDbFd->pInode->
28ee0 70 53 68 6d 4e 6f 64 65 20 3d 20 70 53 68 6d 4e  pShmNode = pShmN
28ef0 6f 64 65 3b 0a 20 20 20 20 70 53 68 6d 4e 6f 64  ode;.    pShmNod
28f00 65 2d 3e 70 49 6e 6f 64 65 20 3d 20 70 44 62 46  e->pInode = pDbF
28f10 64 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 20 20 70  d->pInode;.    p
28f20 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 20 3d  ShmNode->mutex =
28f30 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61   sqlite3_mutex_a
28f40 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
28f50 58 5f 46 41 53 54 29 3b 0a 20 20 20 20 69 66 28  X_FAST);.    if(
28f60 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78   pShmNode->mutex
28f70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
28f80 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
28f90 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f        goto shm_o
28fa0 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a  pen_err;.    }..
28fb0 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e      if( pInode->
28fc0 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20  bProcessLock==0 
28fd0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6f 70 65  ){.      int ope
28fe0 6e 46 6c 61 67 73 20 3d 20 4f 5f 52 44 57 52 20  nFlags = O_RDWR 
28ff0 7c 20 4f 5f 43 52 45 41 54 3b 0a 20 20 20 20 20  | O_CREAT;.     
29000 20 69 66 28 20 73 71 6c 69 74 65 33 5f 75 72 69   if( sqlite3_uri
29010 5f 62 6f 6f 6c 65 61 6e 28 70 44 62 46 64 2d 3e  _boolean(pDbFd->
29020 7a 50 61 74 68 2c 20 22 72 65 61 64 6f 6e 6c 79  zPath, "readonly
29030 5f 73 68 6d 22 2c 20 30 29 0a 23 69 66 20 64 65  _shm", 0).#if de
29040 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
29050 42 4c 45 5f 50 45 52 53 49 53 54 5f 57 41 4c 29  BLE_PERSIST_WAL)
29060 26 26 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  &&(SQLITE_ENABLE
29070 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 5c  _LOCKING_STYLE \
29080 0a 20 20 20 20 7c 7c 20 64 65 66 69 6e 65 64 28  .    || defined(
29090 5f 5f 41 50 50 4c 45 5f 5f 29 29 0a 20 20 20 20  __APPLE__)).    
290a0 20 20 20 20 20 7c 7c 20 28 70 44 62 46 64 2d 3e       || (pDbFd->
290b0 6f 70 65 6e 46 6c 61 67 73 20 26 20 4f 5f 52 44  openFlags & O_RD
290c0 57 52 29 20 21 3d 20 4f 5f 52 44 57 52 0a 23 65  WR) != O_RDWR.#e
290d0 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20 29 7b  ndif.         ){
290e0 0a 20 20 20 20 20 20 20 20 6f 70 65 6e 46 6c 61  .        openFla
290f0 67 73 20 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20  gs = O_RDONLY;. 
29100 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d         pShmNode-
29110 3e 69 73 52 65 61 64 6f 6e 6c 79 20 3d 20 31 3b  >isReadonly = 1;
29120 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
29130 53 68 6d 4e 6f 64 65 2d 3e 68 20 3d 20 72 6f 62  ShmNode->h = rob
29140 75 73 74 5f 6f 70 65 6e 28 7a 53 68 6d 46 69 6c  ust_open(zShmFil
29150 65 6e 61 6d 65 2c 20 6f 70 65 6e 46 6c 61 67 73  ename, openFlags
29160 2c 20 28 73 53 74 61 74 2e 73 74 5f 6d 6f 64 65  , (sStat.st_mode
29170 26 30 37 37 37 29 29 3b 0a 20 20 20 20 20 20 69  &0777));.      i
29180 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3c 30  f( pShmNode->h<0
29190 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
291a0 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51   unixLogError(SQ
291b0 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b  LITE_CANTOPEN_BK
291c0 50 54 2c 20 22 6f 70 65 6e 22 2c 20 7a 53 68 6d  PT, "open", zShm
291d0 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Filename);.     
291e0 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e     goto shm_open
291f0 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  _err;.      }.. 
29200 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f       /* Check to
29210 20 73 65 65 20 69 66 20 61 6e 6f 74 68 65 72 20   see if another 
29220 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64 69  process is holdi
29230 6e 67 20 74 68 65 20 64 65 61 64 2d 6d 61 6e 20  ng the dead-man 
29240 73 77 69 74 63 68 2e 0a 20 20 20 20 20 20 2a 2a  switch..      **
29250 20 49 66 20 6e 6f 74 2c 20 74 72 75 6e 63 61 74   If not, truncat
29260 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20 7a 65  e the file to ze
29270 72 6f 20 6c 65 6e 67 74 68 2e 20 0a 20 20 20 20  ro length. .    
29280 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20    */.      rc = 
29290 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
292a0 20 69 66 28 20 75 6e 69 78 53 68 6d 53 79 73 74   if( unixShmSyst
292b0 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c  emLock(pShmNode,
292c0 20 46 5f 57 52 4c 43 4b 2c 20 55 4e 49 58 5f 53   F_WRLCK, UNIX_S
292d0 48 4d 5f 44 4d 53 2c 20 31 29 3d 3d 53 51 4c 49  HM_DMS, 1)==SQLI
292e0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
292f0 20 69 66 28 20 72 6f 62 75 73 74 5f 66 74 72 75   if( robust_ftru
29300 6e 63 61 74 65 28 70 53 68 6d 4e 6f 64 65 2d 3e  ncate(pShmNode->
29310 68 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20  h, 0) ){.       
29320 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45     rc = unixLogE
29330 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52  rror(SQLITE_IOER
29340 52 5f 53 48 4d 4f 50 45 4e 2c 20 22 66 74 72 75  R_SHMOPEN, "ftru
29350 6e 63 61 74 65 22 2c 20 7a 53 68 6d 46 69 6c 65  ncate", zShmFile
29360 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  name);.        }
29370 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
29380 2f 2a 20 49 66 20 72 75 6e 6e 69 6e 67 20 61 73  /* If running as
29390 20 72 6f 6f 74 20 73 65 74 20 74 68 65 20 75 69   root set the ui
293a0 64 2f 67 69 64 20 6f 66 20 74 68 65 20 73 68 6d  d/gid of the shm
293b0 20 66 69 6c 65 20 74 6f 20 6d 61 74 63 68 0a 20   file to match. 
293c0 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20           ** the 
293d0 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 20 20  database */.    
293e0 20 20 20 20 20 20 75 69 64 5f 74 20 65 75 69 64        uid_t euid
293f0 20 3d 20 67 65 74 65 75 69 64 28 29 3b 0a 20 20   = geteuid();.  
29400 20 20 20 20 20 20 20 20 69 66 28 20 28 21 70 53          if( (!pS
29410 68 6d 4e 6f 64 65 2d 3e 69 73 52 65 61 64 6f 6e  hmNode->isReadon
29420 6c 79 29 20 26 26 20 65 75 69 64 3d 3d 30 20 26  ly) && euid==0 &
29430 26 20 28 65 75 69 64 21 3d 73 53 74 61 74 2e 73  & (euid!=sStat.s
29440 74 5f 75 69 64 20 7c 7c 20 67 65 74 65 67 69 64  t_uid || getegid
29450 28 29 21 3d 73 53 74 61 74 2e 73 74 5f 67 69 64  ()!=sStat.st_gid
29460 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
29470 20 69 66 28 20 6f 73 46 63 68 6f 77 6e 28 70 53   if( osFchown(pS
29480 68 6d 4e 6f 64 65 2d 3e 68 2c 20 73 53 74 61 74  hmNode->h, sStat
29490 2e 73 74 5f 75 69 64 2c 20 73 53 74 61 74 2e 73  .st_uid, sStat.s
294a0 74 5f 67 69 64 29 20 29 7b 0a 20 20 20 20 20 20  t_gid) ){.      
294b0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
294c0 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4f 50 45  ITE_IOERR_SHMOPE
294d0 4e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  N;.            }
294e0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
294f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
29500 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
29510 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
29520 20 20 72 63 20 3d 20 75 6e 69 78 53 68 6d 53 79    rc = unixShmSy
29530 73 74 65 6d 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64  stemLock(pShmNod
29540 65 2c 20 46 5f 52 44 4c 43 4b 2c 20 55 4e 49 58  e, F_RDLCK, UNIX
29550 5f 53 48 4d 5f 44 4d 53 2c 20 31 29 3b 0a 20 20  _SHM_DMS, 1);.  
29560 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
29570 72 63 20 29 20 67 6f 74 6f 20 73 68 6d 5f 6f 70  rc ) goto shm_op
29580 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 20 20  en_err;.    }.  
29590 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 74 68 65  }..  /* Make the
295a0 20 6e 65 77 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   new connection 
295b0 61 20 63 68 69 6c 64 20 6f 66 20 74 68 65 20 75  a child of the u
295c0 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20  nixShmNode */.  
295d0 70 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d 20 70 53  p->pShmNode = pS
295e0 68 6d 4e 6f 64 65 3b 0a 23 69 66 64 65 66 20 53  hmNode;.#ifdef S
295f0 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 70 2d  QLITE_DEBUG.  p-
29600 3e 69 64 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e  >id = pShmNode->
29610 6e 65 78 74 53 68 6d 49 64 2b 2b 3b 0a 23 65 6e  nextShmId++;.#en
29620 64 69 66 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e  dif.  pShmNode->
29630 6e 52 65 66 2b 2b 3b 0a 20 20 70 44 62 46 64 2d  nRef++;.  pDbFd-
29640 3e 70 53 68 6d 20 3d 20 70 3b 0a 20 20 75 6e 69  >pShm = p;.  uni
29650 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 0a  xLeaveMutex();..
29660 20 20 2f 2a 20 54 68 65 20 72 65 66 65 72 65 6e    /* The referen
29670 63 65 20 63 6f 75 6e 74 20 6f 6e 20 70 53 68 6d  ce count on pShm
29680 4e 6f 64 65 20 68 61 73 20 61 6c 72 65 61 64 79  Node has already
29690 20 62 65 65 6e 20 69 6e 63 72 65 6d 65 6e 74 65   been incremente
296a0 64 20 75 6e 64 65 72 0a 20 20 2a 2a 20 74 68 65  d under.  ** the
296b0 20 63 6f 76 65 72 20 6f 66 20 74 68 65 20 75 6e   cover of the un
296c0 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 20 6d  ixEnterMutex() m
296d0 75 74 65 78 20 61 6e 64 20 74 68 65 20 70 6f 69  utex and the poi
296e0 6e 74 65 72 20 66 72 6f 6d 20 74 68 65 0a 20 20  nter from the.  
296f0 2a 2a 20 6e 65 77 20 28 73 74 72 75 63 74 20 75  ** new (struct u
29700 6e 69 78 53 68 6d 29 20 6f 62 6a 65 63 74 20 74  nixShm) object t
29710 6f 20 74 68 65 20 70 53 68 6d 4e 6f 64 65 20 68  o the pShmNode h
29720 61 73 20 62 65 65 6e 20 73 65 74 2e 20 41 6c 6c  as been set. All
29730 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20 6c 65   that is.  ** le
29740 66 74 20 74 6f 20 64 6f 20 69 73 20 74 6f 20 6c  ft to do is to l
29750 69 6e 6b 20 74 68 65 20 6e 65 77 20 6f 62 6a 65  ink the new obje
29760 63 74 20 69 6e 74 6f 20 74 68 65 20 6c 69 6e 6b  ct into the link
29770 65 64 20 6c 69 73 74 20 73 74 61 72 74 69 6e 67  ed list starting
29780 0a 20 20 2a 2a 20 61 74 20 70 53 68 6d 4e 6f 64  .  ** at pShmNod
29790 65 2d 3e 70 46 69 72 73 74 2e 20 54 68 69 73 20  e->pFirst. This 
297a0 6d 75 73 74 20 62 65 20 64 6f 6e 65 20 77 68 69  must be done whi
297b0 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 70  le holding the p
297c0 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 20 0a  ShmNode->mutex .
297d0 20 20 2a 2a 20 6d 75 74 65 78 2e 0a 20 20 2a 2f    ** mutex..  */
297e0 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
297f0 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d  _enter(pShmNode-
29800 3e 6d 75 74 65 78 29 3b 0a 20 20 70 2d 3e 70 4e  >mutex);.  p->pN
29810 65 78 74 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e  ext = pShmNode->
29820 70 46 69 72 73 74 3b 0a 20 20 70 53 68 6d 4e 6f  pFirst;.  pShmNo
29830 64 65 2d 3e 70 46 69 72 73 74 20 3d 20 70 3b 0a  de->pFirst = p;.
29840 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
29850 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e  leave(pShmNode->
29860 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
29870 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f   SQLITE_OK;..  /
29880 2a 20 4a 75 6d 70 20 68 65 72 65 20 6f 6e 20 61  * Jump here on a
29890 6e 79 20 65 72 72 6f 72 20 2a 2f 0a 73 68 6d 5f  ny error */.shm_
298a0 6f 70 65 6e 5f 65 72 72 3a 0a 20 20 75 6e 69 78  open_err:.  unix
298b0 53 68 6d 50 75 72 67 65 28 70 44 62 46 64 29 3b  ShmPurge(pDbFd);
298c0 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 63         /* This c
298d0 61 6c 6c 20 66 72 65 65 73 20 70 53 68 6d 4e 6f  all frees pShmNo
298e0 64 65 20 69 66 20 72 65 71 75 69 72 65 64 20 2a  de if required *
298f0 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  /.  sqlite3_free
29900 28 70 29 3b 0a 20 20 75 6e 69 78 4c 65 61 76 65  (p);.  unixLeave
29910 4d 75 74 65 78 28 29 3b 0a 20 20 72 65 74 75 72  Mutex();.  retur
29920 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
29930 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
29940 63 61 6c 6c 65 64 20 74 6f 20 6f 62 74 61 69 6e  called to obtain
29950 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 72 65   a pointer to re
29960 67 69 6f 6e 20 69 52 65 67 69 6f 6e 20 6f 66 20  gion iRegion of 
29970 74 68 65 20 0a 2a 2a 20 73 68 61 72 65 64 2d 6d  the .** shared-m
29980 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64  emory associated
29990 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61   with the databa
299a0 73 65 20 66 69 6c 65 20 66 64 2e 20 53 68 61 72  se file fd. Shar
299b0 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e  ed-memory region
299c0 73 20 0a 2a 2a 20 61 72 65 20 6e 75 6d 62 65 72  s .** are number
299d0 65 64 20 73 74 61 72 74 69 6e 67 20 66 72 6f 6d  ed starting from
299e0 20 7a 65 72 6f 2e 20 45 61 63 68 20 73 68 61 72   zero. Each shar
299f0 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e  ed-memory region
29a00 20 69 73 20 73 7a 52 65 67 69 6f 6e 20 0a 2a 2a   is szRegion .**
29a10 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a   bytes in size..
29a20 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
29a30 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 65 72 72  r occurs, an err
29a40 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
29a50 6e 65 64 20 61 6e 64 20 2a 70 70 20 69 73 20 73  ned and *pp is s
29a60 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  et to NULL..**.*
29a70 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  * Otherwise, if 
29a80 74 68 65 20 62 45 78 74 65 6e 64 20 70 61 72 61  the bExtend para
29a90 6d 65 74 65 72 20 69 73 20 30 20 61 6e 64 20 74  meter is 0 and t
29aa0 68 65 20 72 65 71 75 65 73 74 65 64 20 73 68 61  he requested sha
29ab0 72 65 64 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 72 65  red-memory.** re
29ac0 67 69 6f 6e 20 68 61 73 20 6e 6f 74 20 62 65 65  gion has not bee
29ad0 6e 20 61 6c 6c 6f 63 61 74 65 64 20 28 62 79 20  n allocated (by 
29ae0 61 6e 79 20 63 6c 69 65 6e 74 2c 20 69 6e 63 6c  any client, incl
29af0 75 64 69 6e 67 20 6f 6e 65 20 72 75 6e 6e 69 6e  uding one runnin
29b00 67 20 69 6e 20 61 0a 2a 2a 20 73 65 70 61 72 61  g in a.** separa
29b10 74 65 20 70 72 6f 63 65 73 73 29 2c 20 74 68 65  te process), the
29b20 6e 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f 20  n *pp is set to 
29b30 4e 55 4c 4c 20 61 6e 64 20 53 51 4c 49 54 45 5f  NULL and SQLITE_
29b40 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  OK returned. If 
29b50 0a 2a 2a 20 62 45 78 74 65 6e 64 20 69 73 20 6e  .** bExtend is n
29b60 6f 6e 2d 7a 65 72 6f 20 61 6e 64 20 74 68 65 20  on-zero and the 
29b70 72 65 71 75 65 73 74 65 64 20 73 68 61 72 65 64  requested shared
29b80 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 68  -memory region h
29b90 61 73 20 6e 6f 74 20 79 65 74 20 0a 2a 2a 20 62  as not yet .** b
29ba0 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 69  een allocated, i
29bb0 74 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 62  t is allocated b
29bc0 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  y this function.
29bd0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 68  .**.** If the sh
29be0 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69  ared-memory regi
29bf0 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  on has already b
29c00 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 6f 72  een allocated or
29c10 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79   is allocated by
29c20 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20 61 73  .** this call as
29c30 20 64 65 73 63 72 69 62 65 64 20 61 62 6f 76 65   described above
29c40 2c 20 74 68 65 6e 20 69 74 20 69 73 20 6d 61 70  , then it is map
29c50 70 65 64 20 69 6e 74 6f 20 74 68 69 73 20 70 72  ped into this pr
29c60 6f 63 65 73 73 65 73 20 0a 2a 2a 20 61 64 64 72  ocesses .** addr
29c70 65 73 73 20 73 70 61 63 65 20 28 69 66 20 69 74  ess space (if it
29c80 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 29   is not already)
29c90 2c 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f 20  , *pp is set to 
29ca0 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6d 61 70  point to the map
29cb0 70 65 64 20 0a 2a 2a 20 6d 65 6d 6f 72 79 20 61  ped .** memory a
29cc0 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  nd SQLITE_OK ret
29cd0 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
29ce0 20 69 6e 74 20 75 6e 69 78 53 68 6d 4d 61 70 28   int unixShmMap(
29cf0 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
29d00 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  *fd,            
29d10 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 6f 70 65     /* Handle ope
29d20 6e 20 6f 6e 20 64 61 74 61 62 61 73 65 20 66 69  n on database fi
29d30 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65 67  le */.  int iReg
29d40 69 6f 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  ion,            
29d50 20 20 20 20 20 20 20 20 2f 2a 20 52 65 67 69 6f          /* Regio
29d60 6e 20 74 6f 20 72 65 74 72 69 65 76 65 20 2a 2f  n to retrieve */
29d70 0a 20 20 69 6e 74 20 73 7a 52 65 67 69 6f 6e 2c  .  int szRegion,
29d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29d90 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 72 65     /* Size of re
29da0 67 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 62  gions */.  int b
29db0 45 78 74 65 6e 64 2c 20 20 20 20 20 20 20 20 20  Extend,         
29dc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
29dd0 75 65 20 74 6f 20 65 78 74 65 6e 64 20 66 69 6c  ue to extend fil
29de0 65 20 69 66 20 6e 65 63 65 73 73 61 72 79 20 2a  e if necessary *
29df0 2f 0a 20 20 76 6f 69 64 20 76 6f 6c 61 74 69 6c  /.  void volatil
29e00 65 20 2a 2a 70 70 20 20 20 20 20 20 20 20 20 20  e **pp          
29e10 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 61 70 70      /* OUT: Mapp
29e20 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 29 7b 0a  ed memory */.){.
29e30 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 44 62 46    unixFile *pDbF
29e40 64 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 66  d = (unixFile*)f
29e50 64 3b 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 3b  d;.  unixShm *p;
29e60 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a  .  unixShmNode *
29e70 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 69 6e 74 20  pShmNode;.  int 
29e80 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
29e90 20 20 69 6e 74 20 6e 53 68 6d 50 65 72 4d 61 70    int nShmPerMap
29ea0 20 3d 20 75 6e 69 78 53 68 6d 52 65 67 69 6f 6e   = unixShmRegion
29eb0 50 65 72 4d 61 70 28 29 3b 0a 20 20 69 6e 74 20  PerMap();.  int 
29ec0 6e 52 65 71 52 65 67 69 6f 6e 3b 0a 0a 20 20 2f  nReqRegion;..  /
29ed0 2a 20 49 66 20 74 68 65 20 73 68 61 72 65 64 2d  * If the shared-
29ee0 6d 65 6d 6f 72 79 20 66 69 6c 65 20 68 61 73 20  memory file has 
29ef0 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 6f 70 65  not yet been ope
29f00 6e 65 64 2c 20 6f 70 65 6e 20 69 74 20 6e 6f 77  ned, open it now
29f10 2e 20 2a 2f 0a 20 20 69 66 28 20 70 44 62 46 64  . */.  if( pDbFd
29f20 2d 3e 70 53 68 6d 3d 3d 30 20 29 7b 0a 20 20 20  ->pShm==0 ){.   
29f30 20 72 63 20 3d 20 75 6e 69 78 4f 70 65 6e 53 68   rc = unixOpenSh
29f40 61 72 65 64 4d 65 6d 6f 72 79 28 70 44 62 46 64  aredMemory(pDbFd
29f50 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
29f60 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
29f70 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 70 20 3d  n rc;.  }..  p =
29f80 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20   pDbFd->pShm;.  
29f90 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53  pShmNode = p->pS
29fa0 68 6d 4e 6f 64 65 3b 0a 20 20 73 71 6c 69 74 65  hmNode;.  sqlite
29fb0 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53  3_mutex_enter(pS
29fc0 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a  hmNode->mutex);.
29fd0 20 20 61 73 73 65 72 74 28 20 73 7a 52 65 67 69    assert( szRegi
29fe0 6f 6e 3d 3d 70 53 68 6d 4e 6f 64 65 2d 3e 73 7a  on==pShmNode->sz
29ff0 52 65 67 69 6f 6e 20 7c 7c 20 70 53 68 6d 4e 6f  Region || pShmNo
2a000 64 65 2d 3e 6e 52 65 67 69 6f 6e 3d 3d 30 20 29  de->nRegion==0 )
2a010 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d  ;.  assert( pShm
2a020 4e 6f 64 65 2d 3e 70 49 6e 6f 64 65 3d 3d 70 44  Node->pInode==pD
2a030 62 46 64 2d 3e 70 49 6e 6f 64 65 20 29 3b 0a 20  bFd->pInode );. 
2a040 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64   assert( pShmNod
2a050 65 2d 3e 68 3e 3d 30 20 7c 7c 20 70 44 62 46 64  e->h>=0 || pDbFd
2a060 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65  ->pInode->bProce
2a070 73 73 4c 6f 63 6b 3d 3d 31 20 29 3b 0a 20 20 61  ssLock==1 );.  a
2a080 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d  ssert( pShmNode-
2a090 3e 68 3c 30 20 7c 7c 20 70 44 62 46 64 2d 3e 70  >h<0 || pDbFd->p
2a0a0 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c  Inode->bProcessL
2a0b0 6f 63 6b 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  ock==0 );..  /* 
2a0c0 4d 69 6e 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f  Minimum number o
2a0d0 66 20 72 65 67 69 6f 6e 73 20 72 65 71 75 69 72  f regions requir
2a0e0 65 64 20 74 6f 20 62 65 20 6d 61 70 70 65 64 2e  ed to be mapped.
2a0f0 20 2a 2f 0a 20 20 6e 52 65 71 52 65 67 69 6f 6e   */.  nReqRegion
2a100 20 3d 20 28 28 69 52 65 67 69 6f 6e 2b 6e 53 68   = ((iRegion+nSh
2a110 6d 50 65 72 4d 61 70 29 20 2f 20 6e 53 68 6d 50  mPerMap) / nShmP
2a120 65 72 4d 61 70 29 20 2a 20 6e 53 68 6d 50 65 72  erMap) * nShmPer
2a130 4d 61 70 3b 0a 0a 20 20 69 66 28 20 70 53 68 6d  Map;..  if( pShm
2a140 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c 6e 52  Node->nRegion<nR
2a150 65 71 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20  eqRegion ){.    
2a160 63 68 61 72 20 2a 2a 61 70 4e 65 77 3b 20 20 20  char **apNew;   
2a170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a180 20 20 20 2f 2a 20 4e 65 77 20 61 70 52 65 67 69     /* New apRegi
2a190 6f 6e 5b 5d 20 61 72 72 61 79 20 2a 2f 0a 20 20  on[] array */.  
2a1a0 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 6e 52    int nByte = nR
2a1b0 65 71 52 65 67 69 6f 6e 2a 73 7a 52 65 67 69 6f  eqRegion*szRegio
2a1c0 6e 3b 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20  n;   /* Minimum 
2a1d0 72 65 71 75 69 72 65 64 20 66 69 6c 65 20 73 69  required file si
2a1e0 7a 65 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74  ze */.    struct
2a1f0 20 73 74 61 74 20 73 53 74 61 74 3b 20 20 20 20   stat sStat;    
2a200 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a210 55 73 65 64 20 62 79 20 66 73 74 61 74 28 29 20  Used by fstat() 
2a220 2a 2f 0a 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65  */..    pShmNode
2a230 2d 3e 73 7a 52 65 67 69 6f 6e 20 3d 20 73 7a 52  ->szRegion = szR
2a240 65 67 69 6f 6e 3b 0a 0a 20 20 20 20 69 66 28 20  egion;..    if( 
2a250 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 29  pShmNode->h>=0 )
2a260 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72  {.      /* The r
2a270 65 71 75 65 73 74 65 64 20 72 65 67 69 6f 6e 20  equested region 
2a280 69 73 20 6e 6f 74 20 6d 61 70 70 65 64 20 69 6e  is not mapped in
2a290 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73 65  to this processe
2a2a0 73 20 61 64 64 72 65 73 73 20 73 70 61 63 65 2e  s address space.
2a2b0 0a 20 20 20 20 20 20 2a 2a 20 43 68 65 63 6b 20  .      ** Check 
2a2c0 74 6f 20 73 65 65 20 69 66 20 69 74 20 68 61 73  to see if it has
2a2d0 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20   been allocated 
2a2e0 28 69 2e 65 2e 20 69 66 20 74 68 65 20 77 61 6c  (i.e. if the wal
2a2f0 2d 69 6e 64 65 78 20 66 69 6c 65 20 69 73 0a 20  -index file is. 
2a300 20 20 20 20 20 2a 2a 20 6c 61 72 67 65 20 65 6e       ** large en
2a310 6f 75 67 68 20 74 6f 20 63 6f 6e 74 61 69 6e 20  ough to contain 
2a320 74 68 65 20 72 65 71 75 65 73 74 65 64 20 72 65  the requested re
2a330 67 69 6f 6e 29 2e 0a 20 20 20 20 20 20 2a 2f 0a  gion)..      */.
2a340 20 20 20 20 20 20 69 66 28 20 6f 73 46 73 74 61        if( osFsta
2a350 74 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 26  t(pShmNode->h, &
2a360 73 53 74 61 74 29 20 29 7b 0a 20 20 20 20 20 20  sStat) ){.      
2a370 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
2a380 45 52 52 5f 53 48 4d 53 49 5a 45 3b 0a 20 20 20  ERR_SHMSIZE;.   
2a390 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67       goto shmpag
2a3a0 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20  e_out;.      }. 
2a3b0 20 0a 20 20 20 20 20 20 69 66 28 20 73 53 74 61   .      if( sSta
2a3c0 74 2e 73 74 5f 73 69 7a 65 3c 6e 42 79 74 65 20  t.st_size<nByte 
2a3d0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
2a3e0 65 20 72 65 71 75 65 73 74 65 64 20 6d 65 6d 6f  e requested memo
2a3f0 72 79 20 72 65 67 69 6f 6e 20 64 6f 65 73 20 6e  ry region does n
2a400 6f 74 20 65 78 69 73 74 2e 20 49 66 20 62 45 78  ot exist. If bEx
2a410 74 65 6e 64 20 69 73 20 73 65 74 20 74 6f 0a 20  tend is set to. 
2a420 20 20 20 20 20 20 20 2a 2a 20 66 61 6c 73 65 2c         ** false,
2a430 20 65 78 69 74 20 65 61 72 6c 79 2e 20 2a 70 70   exit early. *pp
2a440 20 77 69 6c 6c 20 62 65 20 73 65 74 20 74 6f 20   will be set to 
2a450 4e 55 4c 4c 20 61 6e 64 20 53 51 4c 49 54 45 5f  NULL and SQLITE_
2a460 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 20 20 20  OK returned..   
2a470 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
2a480 69 66 28 20 21 62 45 78 74 65 6e 64 20 29 7b 0a  if( !bExtend ){.
2a490 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73            goto s
2a4a0 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  hmpage_out;.    
2a4b0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f      }..        /
2a4c0 2a 20 41 6c 74 65 72 6e 61 74 69 76 65 6c 79 2c  * Alternatively,
2a4d0 20 69 66 20 62 45 78 74 65 6e 64 20 69 73 20 74   if bExtend is t
2a4e0 72 75 65 2c 20 65 78 74 65 6e 64 20 74 68 65 20  rue, extend the 
2a4f0 66 69 6c 65 2e 20 44 6f 20 74 68 69 73 20 62 79  file. Do this by
2a500 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 72 69 74  .        ** writ
2a510 69 6e 67 20 61 20 73 69 6e 67 6c 65 20 62 79 74  ing a single byt
2a520 65 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  e to the end of 
2a530 65 61 63 68 20 28 4f 53 29 20 70 61 67 65 20 62  each (OS) page b
2a540 65 69 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a 20  eing.        ** 
2a550 61 6c 6c 6f 63 61 74 65 64 20 6f 72 20 65 78 74  allocated or ext
2a560 65 6e 64 65 64 2e 20 54 65 63 68 6e 69 63 61 6c  ended. Technical
2a570 6c 79 2c 20 77 65 20 6e 65 65 64 20 6f 6e 6c 79  ly, we need only
2a580 20 77 72 69 74 65 20 74 6f 20 74 68 65 0a 20 20   write to the.  
2a590 20 20 20 20 20 20 2a 2a 20 6c 61 73 74 20 70 61        ** last pa
2a5a0 67 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 65  ge in order to e
2a5b0 78 74 65 6e 64 20 74 68 65 20 66 69 6c 65 2e 20  xtend the file. 
2a5c0 42 75 74 20 77 72 69 74 69 6e 67 20 74 6f 20 61  But writing to a
2a5d0 6c 6c 20 6e 65 77 0a 20 20 20 20 20 20 20 20 2a  ll new.        *
2a5e0 2a 20 70 61 67 65 73 20 66 6f 72 63 65 73 20 74  * pages forces t
2a5f0 68 65 20 4f 53 20 74 6f 20 61 6c 6c 6f 63 61 74  he OS to allocat
2a600 65 20 74 68 65 6d 20 69 6d 6d 65 64 69 61 74 65  e them immediate
2a610 6c 79 2c 20 77 68 69 63 68 20 72 65 64 75 63 65  ly, which reduce
2a620 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  s.        ** the
2a630 20 63 68 61 6e 63 65 73 20 6f 66 20 53 49 47 42   chances of SIGB
2a640 55 53 20 77 68 69 6c 65 20 61 63 63 65 73 73 69  US while accessi
2a650 6e 67 20 74 68 65 20 6d 61 70 70 65 64 20 72 65  ng the mapped re
2a660 67 69 6f 6e 20 6c 61 74 65 72 20 6f 6e 2e 0a 20  gion later on.. 
2a670 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
2a680 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20    else{.        
2a690 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 69    static const i
2a6a0 6e 74 20 70 67 73 7a 20 3d 20 34 30 39 36 3b 0a  nt pgsz = 4096;.
2a6b0 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 50            int iP
2a6c0 67 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  g;..          /*
2a6d0 20 57 72 69 74 65 20 74 6f 20 74 68 65 20 6c 61   Write to the la
2a6e0 73 74 20 62 79 74 65 20 6f 66 20 65 61 63 68 20  st byte of each 
2a6f0 6e 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20  newly allocated 
2a700 6f 72 20 65 78 74 65 6e 64 65 64 20 70 61 67 65  or extended page
2a710 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73   */.          as
2a720 73 65 72 74 28 20 28 6e 42 79 74 65 20 25 20 70  sert( (nByte % p
2a730 67 73 7a 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  gsz)==0 );.     
2a740 20 20 20 20 20 66 6f 72 28 69 50 67 3d 28 73 53       for(iPg=(sS
2a750 74 61 74 2e 73 74 5f 73 69 7a 65 2f 70 67 73 7a  tat.st_size/pgsz
2a760 29 3b 20 69 50 67 3c 28 6e 42 79 74 65 2f 70 67  ); iPg<(nByte/pg
2a770 73 7a 29 3b 20 69 50 67 2b 2b 29 7b 0a 20 20 20  sz); iPg++){.   
2a780 20 20 20 20 20 20 20 20 20 69 66 28 20 73 65 65           if( see
2a790 6b 41 6e 64 57 72 69 74 65 46 64 28 70 53 68 6d  kAndWriteFd(pShm
2a7a0 4e 6f 64 65 2d 3e 68 2c 20 69 50 67 2a 70 67 73  Node->h, iPg*pgs
2a7b0 7a 20 2b 20 70 67 73 7a 2d 31 2c 20 22 22 2c 20  z + pgsz-1, "", 
2a7c0 31 2c 20 30 29 21 3d 31 20 29 7b 0a 20 20 20 20  1, 0)!=1 ){.    
2a7d0 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20            const 
2a7e0 63 68 61 72 20 2a 7a 46 69 6c 65 20 3d 20 70 53  char *zFile = pS
2a7f0 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d  hmNode->zFilenam
2a800 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e;.             
2a810 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72   rc = unixLogErr
2a820 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
2a830 53 48 4d 53 49 5a 45 2c 20 22 77 72 69 74 65 22  SHMSIZE, "write"
2a840 2c 20 7a 46 69 6c 65 29 3b 0a 20 20 20 20 20 20  , zFile);.      
2a850 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d          goto shm
2a860 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20  page_out;.      
2a870 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2a880 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
2a890 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
2a8a0 20 2f 2a 20 4d 61 70 20 74 68 65 20 72 65 71 75   /* Map the requ
2a8b0 65 73 74 65 64 20 6d 65 6d 6f 72 79 20 72 65 67  ested memory reg
2a8c0 69 6f 6e 20 69 6e 74 6f 20 74 68 69 73 20 70 72  ion into this pr
2a8d0 6f 63 65 73 73 65 73 20 61 64 64 72 65 73 73 20  ocesses address 
2a8e0 73 70 61 63 65 2e 20 2a 2f 0a 20 20 20 20 61 70  space. */.    ap
2a8f0 4e 65 77 20 3d 20 28 63 68 61 72 20 2a 2a 29 73  New = (char **)s
2a900 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 0a  qlite3_realloc(.
2a910 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65          pShmNode
2a920 2d 3e 61 70 52 65 67 69 6f 6e 2c 20 6e 52 65 71  ->apRegion, nReq
2a930 52 65 67 69 6f 6e 2a 73 69 7a 65 6f 66 28 63 68  Region*sizeof(ch
2a940 61 72 20 2a 29 0a 20 20 20 20 29 3b 0a 20 20 20  ar *).    );.   
2a950 20 69 66 28 20 21 61 70 4e 65 77 20 29 7b 0a 20   if( !apNew ){. 
2a960 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
2a970 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20  _IOERR_NOMEM;.  
2a980 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65      goto shmpage
2a990 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _out;.    }.    
2a9a0 70 53 68 6d 4e 6f 64 65 2d 3e 61 70 52 65 67 69  pShmNode->apRegi
2a9b0 6f 6e 20 3d 20 61 70 4e 65 77 3b 0a 20 20 20 20  on = apNew;.    
2a9c0 77 68 69 6c 65 28 20 70 53 68 6d 4e 6f 64 65 2d  while( pShmNode-
2a9d0 3e 6e 52 65 67 69 6f 6e 3c 6e 52 65 71 52 65 67  >nRegion<nReqReg
2a9e0 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ion ){.      int
2a9f0 20 6e 4d 61 70 20 3d 20 73 7a 52 65 67 69 6f 6e   nMap = szRegion
2aa00 2a 6e 53 68 6d 50 65 72 4d 61 70 3b 0a 20 20 20  *nShmPerMap;.   
2aa10 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
2aa20 76 6f 69 64 20 2a 70 4d 65 6d 3b 0a 20 20 20 20  void *pMem;.    
2aa30 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e    if( pShmNode->
2aa40 68 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  h>=0 ){.        
2aa50 70 4d 65 6d 20 3d 20 6f 73 4d 6d 61 70 28 30 2c  pMem = osMmap(0,
2aa60 20 6e 4d 61 70 2c 0a 20 20 20 20 20 20 20 20 20   nMap,.         
2aa70 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 69 73 52     pShmNode->isR
2aa80 65 61 64 6f 6e 6c 79 20 3f 20 50 52 4f 54 5f 52  eadonly ? PROT_R
2aa90 45 41 44 20 3a 20 50 52 4f 54 5f 52 45 41 44 7c  EAD : PROT_READ|
2aaa0 50 52 4f 54 5f 57 52 49 54 45 2c 20 0a 20 20 20  PROT_WRITE, .   
2aab0 20 20 20 20 20 20 20 20 20 4d 41 50 5f 53 48 41           MAP_SHA
2aac0 52 45 44 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 68  RED, pShmNode->h
2aad0 2c 20 73 7a 52 65 67 69 6f 6e 2a 28 69 36 34 29  , szRegion*(i64)
2aae0 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f  pShmNode->nRegio
2aaf0 6e 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  n.        );.   
2ab00 20 20 20 20 20 69 66 28 20 70 4d 65 6d 3d 3d 4d       if( pMem==M
2ab10 41 50 5f 46 41 49 4c 45 44 20 29 7b 0a 20 20 20  AP_FAILED ){.   
2ab20 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78         rc = unix
2ab30 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
2ab40 49 4f 45 52 52 5f 53 48 4d 4d 41 50 2c 20 22 6d  IOERR_SHMMAP, "m
2ab50 6d 61 70 22 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e  map", pShmNode->
2ab60 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  zFilename);.    
2ab70 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61        goto shmpa
2ab80 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20  ge_out;.        
2ab90 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
2aba0 20 20 20 20 20 20 20 70 4d 65 6d 20 3d 20 73 71         pMem = sq
2abb0 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 7a 52  lite3_malloc(szR
2abc0 65 67 69 6f 6e 29 3b 0a 20 20 20 20 20 20 20 20  egion);.        
2abd0 69 66 28 20 70 4d 65 6d 3d 3d 30 20 29 7b 0a 20  if( pMem==0 ){. 
2abe0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
2abf0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
2ac00 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61        goto shmpa
2ac10 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20  ge_out;.        
2ac20 7d 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74  }.        memset
2ac30 28 70 4d 65 6d 2c 20 30 2c 20 73 7a 52 65 67 69  (pMem, 0, szRegi
2ac40 6f 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  on);.      }..  
2ac50 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
2ac60 53 68 6d 50 65 72 4d 61 70 3b 20 69 2b 2b 29 7b  ShmPerMap; i++){
2ac70 0a 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64  .        pShmNod
2ac80 65 2d 3e 61 70 52 65 67 69 6f 6e 5b 70 53 68 6d  e->apRegion[pShm
2ac90 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 2b 69 5d  Node->nRegion+i]
2aca0 20 3d 20 26 28 28 63 68 61 72 2a 29 70 4d 65 6d   = &((char*)pMem
2acb0 29 5b 73 7a 52 65 67 69 6f 6e 2a 69 5d 3b 0a 20  )[szRegion*i];. 
2acc0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 53 68       }.      pSh
2acd0 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 20 2b  mNode->nRegion +
2ace0 3d 20 6e 53 68 6d 50 65 72 4d 61 70 3b 0a 20 20  = nShmPerMap;.  
2acf0 20 20 7d 0a 20 20 7d 0a 0a 73 68 6d 70 61 67 65    }.  }..shmpage
2ad00 5f 6f 75 74 3a 0a 20 20 69 66 28 20 70 53 68 6d  _out:.  if( pShm
2ad10 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3e 69 52  Node->nRegion>iR
2ad20 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 2a 70 70  egion ){.    *pp
2ad30 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 70 52   = pShmNode->apR
2ad40 65 67 69 6f 6e 5b 69 52 65 67 69 6f 6e 5d 3b 0a  egion[iRegion];.
2ad50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70 70    }else{.    *pp
2ad60 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = 0;.  }.  if( 
2ad70 70 53 68 6d 4e 6f 64 65 2d 3e 69 73 52 65 61 64  pShmNode->isRead
2ad80 6f 6e 6c 79 20 26 26 20 72 63 3d 3d 53 51 4c 49  only && rc==SQLI
2ad90 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 53 51 4c  TE_OK ) rc = SQL
2ada0 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  ITE_READONLY;.  
2adb0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
2adc0 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  ave(pShmNode->mu
2add0 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  tex);.  return r
2ade0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  c;.}../*.** Chan
2adf0 67 65 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74  ge the lock stat
2ae00 65 20 66 6f 72 20 61 20 73 68 61 72 65 64 2d 6d  e for a shared-m
2ae10 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74 2e 0a 2a  emory segment..*
2ae20 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74  *.** Note that t
2ae30 68 65 20 72 65 6c 61 74 69 6f 6e 73 68 69 70 20  he relationship 
2ae40 62 65 74 77 65 65 6e 20 53 48 41 52 45 64 20 61  between SHAREd a
2ae50 6e 64 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  nd EXCLUSIVE loc
2ae60 6b 73 20 69 73 20 61 20 6c 69 74 74 6c 65 0a 2a  ks is a little.*
2ae70 2a 20 64 69 66 66 65 72 65 6e 74 20 68 65 72 65  * different here
2ae80 20 74 68 61 6e 20 69 6e 20 70 6f 73 69 78 2e 20   than in posix. 
2ae90 20 49 6e 20 78 53 68 6d 4c 6f 63 6b 28 29 2c 20   In xShmLock(), 
2aea0 6f 6e 65 20 63 61 6e 20 67 6f 20 66 72 6f 6d 20  one can go from 
2aeb0 75 6e 6c 6f 63 6b 65 64 0a 2a 2a 20 74 6f 20 73  unlocked.** to s
2aec0 68 61 72 65 64 20 61 6e 64 20 62 61 63 6b 20 6f  hared and back o
2aed0 72 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64 20  r from unlocked 
2aee0 74 6f 20 65 78 63 6c 75 73 69 76 65 20 61 6e 64  to exclusive and
2aef0 20 62 61 63 6b 2e 20 20 42 75 74 20 6f 6e 65 20   back.  But one 
2af00 6d 61 79 0a 2a 2a 20 6e 6f 74 20 67 6f 20 66 72  may.** not go fr
2af10 6f 6d 20 73 68 61 72 65 64 20 74 6f 20 65 78 63  om shared to exc
2af20 6c 75 73 69 76 65 20 6f 72 20 66 72 6f 6d 20 65  lusive or from e
2af30 78 63 6c 75 73 69 76 65 20 74 6f 20 73 68 61 72  xclusive to shar
2af40 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
2af50 74 20 75 6e 69 78 53 68 6d 4c 6f 63 6b 28 0a 20  t unixShmLock(. 
2af60 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66   sqlite3_file *f
2af70 64 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  d,          /* D
2af80 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 6f 6c  atabase file hol
2af90 64 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20  ding the shared 
2afa0 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20 69 6e 74 20  memory */.  int 
2afb0 6f 66 73 74 2c 20 20 20 20 20 20 20 20 20 20 20  ofst,           
2afc0 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
2afd0 6c 6f 63 6b 20 74 6f 20 61 63 71 75 69 72 65 20  lock to acquire 
2afe0 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20  or release */.  
2aff0 69 6e 74 20 6e 2c 20 20 20 20 20 20 20 20 20 20  int n,          
2b000 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
2b010 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73 20 74 6f  mber of locks to
2b020 20 61 63 71 75 69 72 65 20 6f 72 20 72 65 6c 65   acquire or rele
2b030 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  ase */.  int fla
2b040 67 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20  gs              
2b050 20 20 20 20 2f 2a 20 57 68 61 74 20 74 6f 20 64      /* What to d
2b060 6f 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20  o with the lock 
2b070 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65  */.){.  unixFile
2b080 20 2a 70 44 62 46 64 20 3d 20 28 75 6e 69 78 46   *pDbFd = (unixF
2b090 69 6c 65 2a 29 66 64 3b 20 20 20 20 20 20 2f 2a  ile*)fd;      /*
2b0a0 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 68 6f 6c 64   Connection hold
2b0b0 69 6e 67 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  ing shared memor
2b0c0 79 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a  y */.  unixShm *
2b0d0 70 20 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b  p = pDbFd->pShm;
2b0e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2b0f0 54 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  The shared memor
2b100 79 20 62 65 69 6e 67 20 6c 6f 63 6b 65 64 20 2a  y being locked *
2b110 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 58 3b  /.  unixShm *pX;
2b120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b130 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72            /* For
2b140 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 61 6c   looping over al
2b150 6c 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 20 20  l siblings */.  
2b160 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68  unixShmNode *pSh
2b170 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e  mNode = p->pShmN
2b180 6f 64 65 3b 20 20 2f 2a 20 54 68 65 20 75 6e 64  ode;  /* The und
2b190 65 72 6c 79 69 6e 67 20 66 69 6c 65 20 69 4e 6f  erlying file iNo
2b1a0 64 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  de */.  int rc =
2b1b0 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
2b1c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2b1d0 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a   Result code */.
2b1e0 20 20 75 31 36 20 6d 61 73 6b 3b 20 20 20 20 20    u16 mask;     
2b1f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b200 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20          /* Mask 
2b210 6f 66 20 6c 6f 63 6b 73 20 74 6f 20 74 61 6b 65  of locks to take
2b220 20 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a 0a   or release */..
2b230 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f    assert( pShmNo
2b240 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64  de==pDbFd->pInod
2b250 65 2d 3e 70 53 68 6d 4e 6f 64 65 20 29 3b 0a 20  e->pShmNode );. 
2b260 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64   assert( pShmNod
2b270 65 2d 3e 70 49 6e 6f 64 65 3d 3d 70 44 62 46 64  e->pInode==pDbFd
2b280 2d 3e 70 49 6e 6f 64 65 20 29 3b 0a 20 20 61 73  ->pInode );.  as
2b290 73 65 72 74 28 20 6f 66 73 74 3e 3d 30 20 26 26  sert( ofst>=0 &&
2b2a0 20 6f 66 73 74 2b 6e 3c 3d 53 51 4c 49 54 45 5f   ofst+n<=SQLITE_
2b2b0 53 48 4d 5f 4e 4c 4f 43 4b 20 29 3b 0a 20 20 61  SHM_NLOCK );.  a
2b2c0 73 73 65 72 74 28 20 6e 3e 3d 31 20 29 3b 0a 20  ssert( n>=1 );. 
2b2d0 20 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d 3d   assert( flags==
2b2e0 28 53 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b  (SQLITE_SHM_LOCK
2b2f0 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48   | SQLITE_SHM_SH
2b300 41 52 45 44 29 0a 20 20 20 20 20 20 20 7c 7c 20  ARED).       || 
2b310 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53  flags==(SQLITE_S
2b320 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45  HM_LOCK | SQLITE
2b330 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 0a  _SHM_EXCLUSIVE).
2b340 20 20 20 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d         || flags=
2b350 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c  =(SQLITE_SHM_UNL
2b360 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d  OCK | SQLITE_SHM
2b370 5f 53 48 41 52 45 44 29 0a 20 20 20 20 20 20 20  _SHARED).       
2b380 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54  || flags==(SQLIT
2b390 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53  E_SHM_UNLOCK | S
2b3a0 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53  QLITE_SHM_EXCLUS
2b3b0 49 56 45 29 20 29 3b 0a 20 20 61 73 73 65 72 74  IVE) );.  assert
2b3c0 28 20 6e 3d 3d 31 20 7c 7c 20 28 66 6c 61 67 73  ( n==1 || (flags
2b3d0 20 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58   & SQLITE_SHM_EX
2b3e0 43 4c 55 53 49 56 45 29 21 3d 30 20 29 3b 0a 20  CLUSIVE)!=0 );. 
2b3f0 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64   assert( pShmNod
2b400 65 2d 3e 68 3e 3d 30 20 7c 7c 20 70 44 62 46 64  e->h>=0 || pDbFd
2b410 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65  ->pInode->bProce
2b420 73 73 4c 6f 63 6b 3d 3d 31 20 29 3b 0a 20 20 61  ssLock==1 );.  a
2b430 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d  ssert( pShmNode-
2b440 3e 68 3c 30 20 7c 7c 20 70 44 62 46 64 2d 3e 70  >h<0 || pDbFd->p
2b450 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c  Inode->bProcessL
2b460 6f 63 6b 3d 3d 30 20 29 3b 0a 0a 20 20 6d 61 73  ock==0 );..  mas
2b470 6b 20 3d 20 28 31 3c 3c 28 6f 66 73 74 2b 6e 29  k = (1<<(ofst+n)
2b480 29 20 2d 20 28 31 3c 3c 6f 66 73 74 29 3b 0a 20  ) - (1<<ofst);. 
2b490 20 61 73 73 65 72 74 28 20 6e 3e 31 20 7c 7c 20   assert( n>1 || 
2b4a0 6d 61 73 6b 3d 3d 28 31 3c 3c 6f 66 73 74 29 20  mask==(1<<ofst) 
2b4b0 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  );.  sqlite3_mut
2b4c0 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64  ex_enter(pShmNod
2b4d0 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28  e->mutex);.  if(
2b4e0 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f   flags & SQLITE_
2b4f0 53 48 4d 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20  SHM_UNLOCK ){.  
2b500 20 20 75 31 36 20 61 6c 6c 4d 61 73 6b 20 3d 20    u16 allMask = 
2b510 30 3b 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f  0; /* Mask of lo
2b520 63 6b 73 20 68 65 6c 64 20 62 79 20 73 69 62 6c  cks held by sibl
2b530 69 6e 67 73 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  ings */..    /* 
2b540 53 65 65 20 69 66 20 61 6e 79 20 73 69 62 6c 69  See if any sibli
2b550 6e 67 73 20 68 6f 6c 64 20 74 68 69 73 20 73 61  ngs hold this sa
2b560 6d 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 66  me lock */.    f
2b570 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e  or(pX=pShmNode->
2b580 70 46 69 72 73 74 3b 20 70 58 3b 20 70 58 3d 70  pFirst; pX; pX=p
2b590 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  X->pNext){.     
2b5a0 20 69 66 28 20 70 58 3d 3d 70 20 29 20 63 6f 6e   if( pX==p ) con
2b5b0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 61 73 73  tinue;.      ass
2b5c0 65 72 74 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61  ert( (pX->exclMa
2b5d0 73 6b 20 26 20 28 70 2d 3e 65 78 63 6c 4d 61 73  sk & (p->exclMas
2b5e0 6b 7c 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 29  k|p->sharedMask)
2b5f0 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 6c  )==0 );.      al
2b600 6c 4d 61 73 6b 20 7c 3d 20 70 58 2d 3e 73 68 61  lMask |= pX->sha
2b610 72 65 64 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a 0a  redMask;.    }..
2b620 20 20 20 20 2f 2a 20 55 6e 6c 6f 63 6b 20 74 68      /* Unlock th
2b630 65 20 73 79 73 74 65 6d 2d 6c 65 76 65 6c 20 6c  e system-level l
2b640 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28 20  ocks */.    if( 
2b650 28 6d 61 73 6b 20 26 20 61 6c 6c 4d 61 73 6b 29  (mask & allMask)
2b660 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
2b670 3d 20 75 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c  = unixShmSystemL
2b680 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 46 5f  ock(pShmNode, F_
2b690 55 4e 4c 43 4b 2c 20 6f 66 73 74 2b 55 4e 49 58  UNLCK, ofst+UNIX
2b6a0 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20  _SHM_BASE, n);. 
2b6b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2b6c0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
2b6d0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e      }..    /* Un
2b6e0 64 6f 20 74 68 65 20 6c 6f 63 61 6c 20 6c 6f 63  do the local loc
2b6f0 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63  ks */.    if( rc
2b700 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2b710 20 20 20 20 20 70 2d 3e 65 78 63 6c 4d 61 73 6b       p->exclMask
2b720 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 20   &= ~mask;.     
2b730 20 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26   p->sharedMask &
2b740 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 7d 20 0a  = ~mask;.    } .
2b750 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67    }else if( flag
2b760 73 20 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53  s & SQLITE_SHM_S
2b770 48 41 52 45 44 20 29 7b 0a 20 20 20 20 75 31 36  HARED ){.    u16
2b780 20 61 6c 6c 53 68 61 72 65 64 20 3d 20 30 3b 20   allShared = 0; 
2b790 20 2f 2a 20 55 6e 69 6f 6e 20 6f 66 20 6c 6f 63   /* Union of loc
2b7a0 6b 73 20 68 65 6c 64 20 62 79 20 63 6f 6e 6e 65  ks held by conne
2b7b0 63 74 69 6f 6e 73 20 6f 74 68 65 72 20 74 68 61  ctions other tha
2b7c0 6e 20 22 70 22 20 2a 2f 0a 0a 20 20 20 20 2f 2a  n "p" */..    /*
2b7d0 20 46 69 6e 64 20 6f 75 74 20 77 68 69 63 68 20   Find out which 
2b7e0 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 61 72 65  shared locks are
2b7f0 20 61 6c 72 65 61 64 79 20 68 65 6c 64 20 62 79   already held by
2b800 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74   sibling connect
2b810 69 6f 6e 73 2e 0a 20 20 20 20 2a 2a 20 49 66 20  ions..    ** If 
2b820 61 6e 79 20 73 69 62 6c 69 6e 67 20 61 6c 72 65  any sibling alre
2b830 61 64 79 20 68 6f 6c 64 73 20 61 6e 20 65 78 63  ady holds an exc
2b840 6c 75 73 69 76 65 20 6c 6f 63 6b 2c 20 67 6f 20  lusive lock, go 
2b850 61 68 65 61 64 20 61 6e 64 20 72 65 74 75 72 6e  ahead and return
2b860 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 42  .    ** SQLITE_B
2b870 55 53 59 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  USY..    */.    
2b880 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d  for(pX=pShmNode-
2b890 3e 70 46 69 72 73 74 3b 20 70 58 3b 20 70 58 3d  >pFirst; pX; pX=
2b8a0 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  pX->pNext){.    
2b8b0 20 20 69 66 28 20 28 70 58 2d 3e 65 78 63 6c 4d    if( (pX->exclM
2b8c0 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20 29  ask & mask)!=0 )
2b8d0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
2b8e0 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
2b8f0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
2b900 20 7d 0a 20 20 20 20 20 20 61 6c 6c 53 68 61 72   }.      allShar
2b910 65 64 20 7c 3d 20 70 58 2d 3e 73 68 61 72 65 64  ed |= pX->shared
2b920 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  Mask;.    }..   
2b930 20 2f 2a 20 47 65 74 20 73 68 61 72 65 64 20 6c   /* Get shared l
2b940 6f 63 6b 73 20 61 74 20 74 68 65 20 73 79 73 74  ocks at the syst
2b950 65 6d 20 6c 65 76 65 6c 2c 20 69 66 20 6e 65 63  em level, if nec
2b960 65 73 73 61 72 79 20 2a 2f 0a 20 20 20 20 69 66  essary */.    if
2b970 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2b980 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 61 6c  ){.      if( (al
2b990 6c 53 68 61 72 65 64 20 26 20 6d 61 73 6b 29 3d  lShared & mask)=
2b9a0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  =0 ){.        rc
2b9b0 20 3d 20 75 6e 69 78 53 68 6d 53 79 73 74 65 6d   = unixShmSystem
2b9c0 4c 6f 63 6b 28 70 53 68 6d 4e 6f 64 65 2c 20 46  Lock(pShmNode, F
2b9d0 5f 52 44 4c 43 4b 2c 20 6f 66 73 74 2b 55 4e 49  _RDLCK, ofst+UNI
2b9e0 58 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a  X_SHM_BASE, n);.
2b9f0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2ba00 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
2ba10 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _OK;.      }.   
2ba20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 74   }..    /* Get t
2ba30 68 65 20 6c 6f 63 61 6c 20 73 68 61 72 65 64 20  he local shared 
2ba40 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28  locks */.    if(
2ba50 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2ba60 7b 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72 65  {.      p->share
2ba70 64 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20  dMask |= mask;. 
2ba80 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
2ba90 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 6e    /* Make sure n
2baa0 6f 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63  o sibling connec
2bab0 74 69 6f 6e 73 20 68 6f 6c 64 20 6c 6f 63 6b 73  tions hold locks
2bac0 20 74 68 61 74 20 77 69 6c 6c 20 62 6c 6f 63 6b   that will block
2bad0 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 6c 6f 63   this.    ** loc
2bae0 6b 2e 20 20 49 66 20 61 6e 79 20 64 6f 2c 20 72  k.  If any do, r
2baf0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
2bb00 59 20 72 69 67 68 74 20 61 77 61 79 2e 0a 20 20  Y right away..  
2bb10 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d    */.    for(pX=
2bb20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74  pShmNode->pFirst
2bb30 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65  ; pX; pX=pX->pNe
2bb40 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  xt){.      if( (
2bb50 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20 6d  pX->exclMask & m
2bb60 61 73 6b 29 21 3d 30 20 7c 7c 20 28 70 58 2d 3e  ask)!=0 || (pX->
2bb70 73 68 61 72 65 64 4d 61 73 6b 20 26 20 6d 61 73  sharedMask & mas
2bb80 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  k)!=0 ){.       
2bb90 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
2bba0 59 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  Y;.        break
2bbb0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2bbc0 20 20 0a 20 20 20 20 2f 2a 20 47 65 74 20 74 68    .    /* Get th
2bbd0 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  e exclusive lock
2bbe0 73 20 61 74 20 74 68 65 20 73 79 73 74 65 6d 20  s at the system 
2bbf0 6c 65 76 65 6c 2e 20 20 54 68 65 6e 20 69 66 20  level.  Then if 
2bc00 73 75 63 63 65 73 73 66 75 6c 0a 20 20 20 20 2a  successful.    *
2bc10 2a 20 61 6c 73 6f 20 6d 61 72 6b 20 74 68 65 20  * also mark the 
2bc20 6c 6f 63 61 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e  local connection
2bc30 20 61 73 20 62 65 69 6e 67 20 6c 6f 63 6b 65 64   as being locked
2bc40 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
2bc50 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2bc60 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69  {.      rc = uni
2bc70 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70  xShmSystemLock(p
2bc80 53 68 6d 4e 6f 64 65 2c 20 46 5f 57 52 4c 43 4b  ShmNode, F_WRLCK
2bc90 2c 20 6f 66 73 74 2b 55 4e 49 58 5f 53 48 4d 5f  , ofst+UNIX_SHM_
2bca0 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20 20 20  BASE, n);.      
2bcb0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2bcc0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  K ){.        ass
2bcd0 65 72 74 28 20 28 70 2d 3e 73 68 61 72 65 64 4d  ert( (p->sharedM
2bce0 61 73 6b 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29  ask & mask)==0 )
2bcf0 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 78 63  ;.        p->exc
2bd00 6c 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20  lMask |= mask;. 
2bd10 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
2bd20 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
2bd30 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d  _leave(pShmNode-
2bd40 3e 6d 75 74 65 78 29 3b 0a 20 20 4f 53 54 52 41  >mutex);.  OSTRA
2bd50 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b 20 73 68  CE(("SHM-LOCK sh
2bd60 6d 69 64 2d 25 64 2c 20 70 69 64 2d 25 64 20 67  mid-%d, pid-%d g
2bd70 6f 74 20 25 30 33 78 2c 25 30 33 78 5c 6e 22 2c  ot %03x,%03x\n",
2bd80 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 69  .           p->i
2bd90 64 2c 20 67 65 74 70 69 64 28 29 2c 20 70 2d 3e  d, getpid(), p->
2bda0 73 68 61 72 65 64 4d 61 73 6b 2c 20 70 2d 3e 65  sharedMask, p->e
2bdb0 78 63 6c 4d 61 73 6b 29 29 3b 0a 20 20 72 65 74  xclMask));.  ret
2bdc0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2bdd0 20 49 6d 70 6c 65 6d 65 6e 74 20 61 20 6d 65 6d   Implement a mem
2bde0 6f 72 79 20 62 61 72 72 69 65 72 20 6f 72 20 6d  ory barrier or m
2bdf0 65 6d 6f 72 79 20 66 65 6e 63 65 20 6f 6e 20 73  emory fence on s
2be00 68 61 72 65 64 20 6d 65 6d 6f 72 79 2e 20 20 0a  hared memory.  .
2be10 2a 2a 0a 2a 2a 20 41 6c 6c 20 6c 6f 61 64 73 20  **.** All loads 
2be20 61 6e 64 20 73 74 6f 72 65 73 20 62 65 67 75 6e  and stores begun
2be30 20 62 65 66 6f 72 65 20 74 68 65 20 62 61 72 72   before the barr
2be40 69 65 72 20 6d 75 73 74 20 63 6f 6d 70 6c 65 74  ier must complet
2be50 65 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 20  e before.** any 
2be60 6c 6f 61 64 20 6f 72 20 73 74 6f 72 65 20 62 65  load or store be
2be70 67 75 6e 20 61 66 74 65 72 20 74 68 65 20 62 61  gun after the ba
2be80 72 72 69 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  rrier..*/.static
2be90 20 76 6f 69 64 20 75 6e 69 78 53 68 6d 42 61 72   void unixShmBar
2bea0 72 69 65 72 28 0a 20 20 73 71 6c 69 74 65 33 5f  rier(.  sqlite3_
2beb0 66 69 6c 65 20 2a 66 64 20 20 20 20 20 20 20 20  file *fd        
2bec0 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
2bed0 61 73 65 20 66 69 6c 65 20 68 6f 6c 64 69 6e 67  ase file holding
2bee0 20 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f   the shared memo
2bef0 72 79 20 2a 2f 0a 29 7b 0a 20 20 55 4e 55 53 45  ry */.){.  UNUSE
2bf00 44 5f 50 41 52 41 4d 45 54 45 52 28 66 64 29 3b  D_PARAMETER(fd);
2bf10 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  .  unixEnterMute
2bf20 78 28 29 3b 0a 20 20 75 6e 69 78 4c 65 61 76 65  x();.  unixLeave
2bf30 4d 75 74 65 78 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Mutex();.}../*.*
2bf40 2a 20 43 6c 6f 73 65 20 61 20 63 6f 6e 6e 65 63  * Close a connec
2bf50 74 69 6f 6e 20 74 6f 20 73 68 61 72 65 64 2d 6d  tion to shared-m
2bf60 65 6d 6f 72 79 2e 20 20 44 65 6c 65 74 65 20 74  emory.  Delete t
2bf70 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 0a 2a  he underlying .*
2bf80 2a 20 73 74 6f 72 61 67 65 20 69 66 20 64 65 6c  * storage if del
2bf90 65 74 65 46 6c 61 67 20 69 73 20 74 72 75 65 2e  eteFlag is true.
2bfa0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20  .**.** If there 
2bfb0 69 73 20 6e 6f 20 73 68 61 72 65 64 20 6d 65 6d  is no shared mem
2bfc0 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77  ory associated w
2bfd0 69 74 68 20 74 68 65 20 63 6f 6e 6e 65 63 74 69  ith the connecti
2bfe0 6f 6e 20 74 68 65 6e 20 74 68 69 73 0a 2a 2a 20  on then this.** 
2bff0 72 6f 75 74 69 6e 65 20 69 73 20 61 20 68 61 72  routine is a har
2c000 6d 6c 65 73 73 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a  mless no-op..*/.
2c010 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53  static int unixS
2c020 68 6d 55 6e 6d 61 70 28 0a 20 20 73 71 6c 69 74  hmUnmap(.  sqlit
2c030 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20 20  e3_file *fd,    
2c040 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
2c050 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61 74  e underlying dat
2c060 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
2c070 69 6e 74 20 64 65 6c 65 74 65 46 6c 61 67 20 20  int deleteFlag  
2c080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c090 2f 2a 20 44 65 6c 65 74 65 20 73 68 61 72 65 64  /* Delete shared
2c0a0 2d 6d 65 6d 6f 72 79 20 69 66 20 74 72 75 65 20  -memory if true 
2c0b0 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 53 68 6d 20  */.){.  unixShm 
2c0c0 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *p;             
2c0d0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
2c0e0 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65 20  onnection to be 
2c0f0 63 6c 6f 73 65 64 20 2a 2f 0a 20 20 75 6e 69 78  closed */.  unix
2c100 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64  ShmNode *pShmNod
2c110 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  e;          /* T
2c120 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 73 68  he underlying sh
2c130 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65  ared-memory file
2c140 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 2a   */.  unixShm **
2c150 70 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  pp;             
2c160 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f        /* For loo
2c170 70 69 6e 67 20 6f 76 65 72 20 73 69 62 6c 69 6e  ping over siblin
2c180 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f  g connections */
2c190 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 44 62  .  unixFile *pDb
2c1a0 46 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Fd;             
2c1b0 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c     /* The underl
2c1c0 79 69 6e 67 20 64 61 74 61 62 61 73 65 20 66 69  ying database fi
2c1d0 6c 65 20 2a 2f 0a 0a 20 20 70 44 62 46 64 20 3d  le */..  pDbFd =
2c1e0 20 28 75 6e 69 78 46 69 6c 65 2a 29 66 64 3b 0a   (unixFile*)fd;.
2c1f0 20 20 70 20 3d 20 70 44 62 46 64 2d 3e 70 53 68    p = pDbFd->pSh
2c200 6d 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  m;.  if( p==0 ) 
2c210 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2c220 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70  ;.  pShmNode = p
2c230 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 0a 20 20 61  ->pShmNode;..  a
2c240 73 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 3d  ssert( pShmNode=
2c250 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e  =pDbFd->pInode->
2c260 70 53 68 6d 4e 6f 64 65 20 29 3b 0a 20 20 61 73  pShmNode );.  as
2c270 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e  sert( pShmNode->
2c280 70 49 6e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70  pInode==pDbFd->p
2c290 49 6e 6f 64 65 20 29 3b 0a 0a 20 20 2f 2a 20 52  Inode );..  /* R
2c2a0 65 6d 6f 76 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  emove connection
2c2b0 20 70 20 66 72 6f 6d 20 74 68 65 20 73 65 74 20   p from the set 
2c2c0 6f 66 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61  of connections a
2c2d0 73 73 6f 63 69 61 74 65 64 0a 20 20 2a 2a 20 77  ssociated.  ** w
2c2e0 69 74 68 20 70 53 68 6d 4e 6f 64 65 20 2a 2f 0a  ith pShmNode */.
2c2f0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
2c300 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e  enter(pShmNode->
2c310 6d 75 74 65 78 29 3b 0a 20 20 66 6f 72 28 70 70  mutex);.  for(pp
2c320 3d 26 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72  =&pShmNode->pFir
2c330 73 74 3b 20 28 2a 70 70 29 21 3d 70 3b 20 70 70  st; (*pp)!=p; pp
2c340 20 3d 20 26 28 2a 70 70 29 2d 3e 70 4e 65 78 74   = &(*pp)->pNext
2c350 29 7b 7d 0a 20 20 2a 70 70 20 3d 20 70 2d 3e 70  ){}.  *pp = p->p
2c360 4e 65 78 74 3b 0a 0a 20 20 2f 2a 20 46 72 65 65  Next;..  /* Free
2c370 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
2c380 70 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  p */.  sqlite3_f
2c390 72 65 65 28 70 29 3b 0a 20 20 70 44 62 46 64 2d  ree(p);.  pDbFd-
2c3a0 3e 70 53 68 6d 20 3d 20 30 3b 0a 20 20 73 71 6c  >pShm = 0;.  sql
2c3b0 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
2c3c0 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78  (pShmNode->mutex
2c3d0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 53 68 6d  );..  /* If pShm
2c3e0 4e 6f 64 65 2d 3e 6e 52 65 66 20 68 61 73 20 72  Node->nRef has r
2c3f0 65 61 63 68 65 64 20 30 2c 20 74 68 65 6e 20 63  eached 0, then c
2c400 6c 6f 73 65 20 74 68 65 20 75 6e 64 65 72 6c 79  lose the underly
2c410 69 6e 67 0a 20 20 2a 2a 20 73 68 61 72 65 64 2d  ing.  ** shared-
2c420 6d 65 6d 6f 72 79 20 66 69 6c 65 2c 20 74 6f 6f  memory file, too
2c430 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d   */.  unixEnterM
2c440 75 74 65 78 28 29 3b 0a 20 20 61 73 73 65 72 74  utex();.  assert
2c450 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66  ( pShmNode->nRef
2c460 3e 30 20 29 3b 0a 20 20 70 53 68 6d 4e 6f 64 65  >0 );.  pShmNode
2c470 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20  ->nRef--;.  if( 
2c480 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3d 3d  pShmNode->nRef==
2c490 30 20 29 7b 0a 20 20 20 20 69 66 28 20 64 65 6c  0 ){.    if( del
2c4a0 65 74 65 46 6c 61 67 20 26 26 20 70 53 68 6d 4e  eteFlag && pShmN
2c4b0 6f 64 65 2d 3e 68 3e 3d 30 20 29 20 7b 0a 20 20  ode->h>=0 ) {.  
2c4c0 20 20 20 20 69 66 20 28 64 65 6c 65 74 65 46 6c      if (deleteFl
2c4d0 61 67 20 3d 3d 20 31 29 20 7b 20 0a 20 20 20 20  ag == 1) { .    
2c4e0 20 20 20 20 75 6e 6c 69 6e 6b 28 70 53 68 6d 4e      unlink(pShmN
2c4f0 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b  ode->zFilename);
2c500 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 69 66  .      } else if
2c510 20 28 64 65 6c 65 74 65 46 6c 61 67 20 3d 3d 20   (deleteFlag == 
2c520 32 29 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  2) {.        /* 
2c530 66 74 72 75 6e 63 61 74 65 28 70 53 68 6d 4e 6f  ftruncate(pShmNo
2c540 64 65 2d 3e 68 2c 20 33 32 20 2a 20 31 30 32 34  de->h, 32 * 1024
2c550 29 3b 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20  ); */.      }.  
2c560 20 20 7d 0a 20 20 20 20 0a 20 20 20 20 75 6e 69    }.    .    uni
2c570 78 53 68 6d 50 75 72 67 65 28 70 44 62 46 64 29  xShmPurge(pDbFd)
2c580 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 4c 65 61 76  ;.  }.  unixLeav
2c590 65 4d 75 74 65 78 28 29 3b 0a 0a 20 20 72 65 74  eMutex();..  ret
2c5a0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
2c5b0 0a 0a 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  ...#else.# defin
2c5c0 65 20 75 6e 69 78 53 68 6d 4d 61 70 20 20 20 20  e unixShmMap    
2c5d0 20 30 0a 23 20 64 65 66 69 6e 65 20 75 6e 69 78   0.# define unix
2c5e0 53 68 6d 4c 6f 63 6b 20 20 20 20 30 0a 23 20 64  ShmLock    0.# d
2c5f0 65 66 69 6e 65 20 75 6e 69 78 53 68 6d 42 61 72  efine unixShmBar
2c600 72 69 65 72 20 30 0a 23 20 64 65 66 69 6e 65 20  rier 0.# define 
2c610 75 6e 69 78 53 68 6d 55 6e 6d 61 70 20 20 20 30  unixShmUnmap   0
2c620 0a 23 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64  .#endif /* #ifnd
2c630 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
2c640 41 4c 20 2a 2f 0a 0a 23 69 66 20 28 53 51 4c 49  AL */..#if (SQLI
2c650 54 45 5f 45 4e 41 42 4c 45 5f 41 50 50 4c 45 5f  TE_ENABLE_APPLE_
2c660 53 50 49 3e 30 29 20 26 26 20 64 65 66 69 6e 65  SPI>0) && define
2c670 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 73 74 61  d(__APPLE__).sta
2c680 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
2c690 75 6e 69 78 54 65 6d 70 46 69 6c 65 44 69 72 28  unixTempFileDir(
2c6a0 76 6f 69 64 29 3b 0a 0a 73 74 61 74 69 63 20 69  void);..static i
2c6b0 6e 74 20 75 6e 69 78 49 6e 76 61 6c 69 64 61 74  nt unixInvalidat
2c6c0 65 53 75 70 70 6f 72 74 46 69 6c 65 73 28 75 6e  eSupportFiles(un
2c6d0 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69  ixFile *pFile, i
2c6e0 6e 74 20 73 6b 69 70 57 41 4c 29 20 7b 0a 20 20  nt skipWAL) {.  
2c6f0 63 68 61 72 20 6a 50 61 74 68 5b 4d 41 58 50 41  char jPath[MAXPA
2c700 54 48 4c 45 4e 2b 39 5d 3b 0a 20 20 69 6e 74 20  THLEN+9];.  int 
2c710 7a 4c 65 6e 20 3d 20 73 74 72 6c 63 70 79 28 6a  zLen = strlcpy(j
2c720 50 61 74 68 2c 20 70 46 69 6c 65 2d 3e 7a 50 61  Path, pFile->zPa
2c730 74 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e 2b 39  th, MAXPATHLEN+9
2c740 29 3b 0a 20 20 69 66 28 20 7a 4c 65 6e 3c 4d 41  );.  if( zLen<MA
2c750 58 50 41 54 48 4c 45 4e 20 29 7b 0a 20 20 20 20  XPATHLEN ){.    
2c760 73 69 7a 65 5f 74 20 6a 4c 65 6e 3b 0a 20 20 20  size_t jLen;.   
2c770 20 63 6f 6e 73 74 20 63 68 61 72 20 65 78 74 65   const char exte
2c780 6e 73 69 6f 6e 73 5b 33 5d 5b 39 5d 20 3d 20 7b  nsions[3][9] = {
2c790 20 22 2d 77 61 6c 22 2c 20 22 2d 6a 6f 75 72 6e   "-wal", "-journ
2c7a0 61 6c 22 2c 20 22 2d 73 68 6d 22 20 7d 3b 0a 20  al", "-shm" };. 
2c7b0 20 20 20 69 6e 74 20 6a 20 3d 20 28 73 6b 69 70     int j = (skip
2c7c0 57 41 4c 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20  WAL ? 1 : 0);.  
2c7d0 20 20 66 6f 72 28 20 3b 20 6a 3c 33 3b 20 6a 2b    for( ; j<3; j+
2c7e0 2b 20 29 7b 0a 20 20 20 20 20 20 0a 20 20 20 20  + ){.      .    
2c7f0 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65    /* Check to se
2c800 65 20 69 66 20 74 68 65 20 73 68 6d 20 66 69 6c  e if the shm fil
2c810 65 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65  e is already ope
2c820 6e 65 64 20 66 6f 72 20 74 68 69 73 20 70 46 69  ned for this pFi
2c830 6c 65 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  le */.      if( 
2c840 6a 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 20 20  j==2 ){.        
2c850 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
2c860 3b 20 2f 2a 20 42 65 63 61 75 73 65 20 70 46 69  ; /* Because pFi
2c870 6c 65 2d 3e 70 49 6e 6f 64 65 20 69 73 20 73 68  le->pInode is sh
2c880 61 72 65 64 20 61 63 72 6f 73 73 20 74 68 72 65  ared across thre
2c890 61 64 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 75  ads */.        u
2c8a0 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d  nixShmNode *pShm
2c8b0 4e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49  Node = pFile->pI
2c8c0 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a  node->pShmNode;.
2c8d0 20 20 20 20 20 20 20 20 69 66 28 20 70 53 68 6d          if( pShm
2c8e0 4e 6f 64 65 20 26 26 20 21 70 53 68 6d 4e 6f 64  Node && !pShmNod
2c8f0 65 2d 3e 69 73 52 65 61 64 6f 6e 6c 79 20 29 7b  e->isReadonly ){
2c900 0a 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63  .          struc
2c910 74 20 73 74 61 74 20 73 53 74 61 74 3b 0a 20 20  t stat sStat;.  
2c920 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
2c930 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d  mutex_enter(pShm
2c940 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  Node->mutex);.  
2c950 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20          .       
2c960 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d     if( pShmNode-
2c970 3e 68 3e 3d 30 20 26 26 20 21 6f 73 46 73 74 61  >h>=0 && !osFsta
2c980 74 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 26  t(pShmNode->h, &
2c990 73 53 74 61 74 29 20 29 7b 0a 20 20 20 20 20 20  sStat) ){.      
2c9a0 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 6c        unsigned l
2c9b0 6f 6e 67 20 73 69 7a 65 20 3d 20 28 73 53 74 61  ong size = (sSta
2c9c0 74 2e 73 74 5f 73 69 7a 65 3c 34 29 20 3f 20 73  t.st_size<4) ? s
2c9d0 53 74 61 74 2e 73 74 5f 73 69 7a 65 20 3a 20 34  Stat.st_size : 4
2c9e0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
2c9f0 28 20 73 69 7a 65 3e 30 20 29 7b 0a 20 20 20 20  ( size>0 ){.    
2ca00 20 20 20 20 20 20 20 20 20 20 62 7a 65 72 6f 28            bzero(
2ca10 70 53 68 6d 4e 6f 64 65 2d 3e 61 70 52 65 67 69  pShmNode->apRegi
2ca20 6f 6e 5b 30 5d 2c 20 73 69 7a 65 29 3b 0a 20 20  on[0], size);.  
2ca30 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
2ca40 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
2ca50 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29  pShmNode->mutex)
2ca60 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2ca70 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
2ca80 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2ca90 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
2caa0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2cab0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71    }.          sq
2cac0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
2cad0 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  e(pShmNode->mute
2cae0 78 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  x);.        }.  
2caf0 20 20 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d        unixLeaveM
2cb00 75 74 65 78 28 29 3b 0a 20 20 20 20 20 20 7d 0a  utex();.      }.
2cb10 20 20 20 20 20 20 6a 4c 65 6e 20 3d 20 73 74 72        jLen = str
2cb20 6c 63 70 79 28 26 6a 50 61 74 68 5b 7a 4c 65 6e  lcpy(&jPath[zLen
2cb30 5d 2c 20 65 78 74 65 6e 73 69 6f 6e 73 5b 6a 5d  ], extensions[j]
2cb40 2c 20 39 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 9);.      if( 
2cb50 6a 4c 65 6e 20 3c 20 39 20 29 7b 0a 20 20 20 20  jLen < 9 ){.    
2cb60 20 20 20 20 69 6e 74 20 6a 66 6c 61 67 73 20 3d      int jflags =
2cb70 20 28 6a 3c 32 29 20 3f 20 4f 5f 54 52 55 4e 43   (j<2) ? O_TRUNC
2cb80 20 3a 20 4f 5f 52 44 57 52 3b 0a 20 20 20 20 20   : O_RDWR;.     
2cb90 20 20 20 69 6e 74 20 6a 66 64 20 3d 20 6f 70 65     int jfd = ope
2cba0 6e 28 6a 50 61 74 68 2c 20 6a 66 6c 61 67 73 29  n(jPath, jflags)
2cbb0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6a 66  ;.        if( jf
2cbc0 64 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20  d==(-1) ){.     
2cbd0 20 20 20 20 20 69 66 28 20 65 72 72 6e 6f 21 3d       if( errno!=
2cbe0 45 4e 4f 45 4e 54 20 29 7b 0a 20 20 20 20 20 20  ENOENT ){.      
2cbf0 20 20 20 20 20 20 70 65 72 72 6f 72 28 6a 50 61        perror(jPa
2cc00 74 68 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  th);.          }
2cc10 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20  .        } else 
2cc20 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
2cc30 6a 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 20 20  j==2 ){.        
2cc40 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74 20      struct stat 
2cc50 73 53 74 61 74 3b 0a 20 20 20 20 20 20 20 20 20  sStat;.         
2cc60 20 20 20 69 66 28 20 21 6f 73 46 73 74 61 74 28     if( !osFstat(
2cc70 6a 66 64 2c 20 26 73 53 74 61 74 29 20 29 7b 0a  jfd, &sStat) ){.
2cc80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 75 6e                un
2cc90 73 69 67 6e 65 64 20 6c 6f 6e 67 20 73 69 7a 65  signed long size
2cca0 20 3d 20 28 73 53 74 61 74 2e 73 74 5f 73 69 7a   = (sStat.st_siz
2ccb0 65 3c 34 29 20 3f 20 73 53 74 61 74 2e 73 74 5f  e<4) ? sStat.st_
2ccc0 73 69 7a 65 20 3a 20 34 3b 0a 20 20 20 20 20 20  size : 4;.      
2ccd0 20 20 20 20 20 20 20 20 69 66 28 20 73 69 7a 65          if( size
2cce0 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >0 ){.          
2ccf0 20 20 20 20 20 20 75 69 6e 74 33 32 5f 74 20 7a        uint32_t z
2cd00 65 72 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ero = 0;.       
2cd10 20 20 20 20 20 20 20 20 20 70 77 72 69 74 65 28           pwrite(
2cd20 6a 66 64 2c 20 26 7a 65 72 6f 2c 20 28 73 69 7a  jfd, &zero, (siz
2cd30 65 5f 74 29 73 69 7a 65 2c 20 30 29 3b 0a 20 20  e_t)size, 0);.  
2cd40 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
2cd50 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2cd60 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2cd70 20 20 66 73 79 6e 63 28 6a 66 64 29 3b 0a 20 20    fsync(jfd);.  
2cd80 20 20 20 20 20 20 20 20 63 6c 6f 73 65 28 6a 66          close(jf
2cd90 64 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  d);.        }.  
2cda0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
2cdb0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2cdc0 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e  OK;.}..static in
2cdd0 74 20 75 6e 69 78 55 6e 73 61 66 65 54 72 75 6e  t unixUnsafeTrun
2cde0 63 61 74 65 44 61 74 61 62 61 73 65 28 75 6e 69  cateDatabase(uni
2cdf0 78 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20  xFile *pFile){. 
2ce00 20 2f 2a 20 74 68 69 73 20 69 73 20 6e 61 73 74   /* this is nast
2ce10 79 20 26 20 62 61 64 2e 20 20 64 65 73 74 72 75  y & bad.  destru
2ce20 63 74 69 6f 6e 20 77 69 74 68 20 70 72 65 6a 75  ction with preju
2ce30 64 69 63 65 2e 20 20 77 65 27 6c 6c 20 6c 6f 73  dice.  we'll los
2ce40 65 20 61 6c 6c 20 74 68 65 0a 20 20 2a 2a 20 66  e all the.  ** f
2ce50 69 6c 65 20 6c 6f 63 6b 73 20 69 6e 20 74 68 69  ile locks in thi
2ce60 73 20 70 72 6f 63 65 73 73 2c 20 68 6f 77 65 76  s process, howev
2ce70 65 72 2e 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  er. sqlite3_file
2ce80 5f 63 6f 6e 74 72 6f 6c 20 77 6f 72 6b 73 20 70  _control works p
2ce90 72 6f 70 65 72 6c 79 2e 0a 20 20 2a 2a 20 42 75  roperly..  ** Bu
2cea0 74 20 69 66 20 69 74 20 66 61 69 6c 73 2c 20 74  t if it fails, t
2ceb0 68 69 73 20 77 6f 72 6b 73 20 61 70 70 72 6f 78  his works approx
2cec0 69 6d 61 74 65 6c 79 0a 20 20 2a 2f 0a 20 20 63  imately.  */.  c
2ced0 68 61 72 20 6a 6f 75 72 6e 61 6c 50 61 74 68 5b  har journalPath[
2cee0 4d 41 58 50 41 54 48 4c 45 4e 5d 3b 0a 20 20 63  MAXPATHLEN];.  c
2cef0 68 61 72 20 77 61 6c 50 61 74 68 5b 4d 41 58 50  har walPath[MAXP
2cf00 41 54 48 4c 45 4e 5d 3b 0a 20 20 69 6e 74 20 72  ATHLEN];.  int r
2cf10 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
2cf20 20 0a 23 69 66 64 65 66 20 44 45 42 55 47 0a 20   .#ifdef DEBUG. 
2cf30 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
2cf40 20 22 46 6f 72 63 65 20 74 72 75 6e 63 61 74 69   "Force truncati
2cf50 6e 67 20 64 61 74 61 62 61 73 65 20 25 73 5c 6e  ng database %s\n
2cf60 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29  ", pFile->zPath)
2cf70 3b 0a 23 65 6e 64 69 66 0a 20 20 73 74 72 6c 63  ;.#endif.  strlc
2cf80 70 79 28 6a 6f 75 72 6e 61 6c 50 61 74 68 2c 20  py(journalPath, 
2cf90 70 46 69 6c 65 2d 3e 7a 50 61 74 68 2c 20 4d 41  pFile->zPath, MA
2cfa0 58 50 41 54 48 4c 45 4e 29 3b 0a 20 20 73 74 72  XPATHLEN);.  str
2cfb0 6c 63 61 74 28 6a 6f 75 72 6e 61 6c 50 61 74 68  lcat(journalPath
2cfc0 2c 20 22 2d 6a 6f 75 72 6e 61 6c 22 2c 20 4d 41  , "-journal", MA
2cfd0 58 50 41 54 48 4c 45 4e 29 3b 0a 20 20 73 74 72  XPATHLEN);.  str
2cfe0 6c 63 70 79 28 77 61 6c 50 61 74 68 2c 20 70 46  lcpy(walPath, pF
2cff0 69 6c 65 2d 3e 7a 50 61 74 68 2c 20 4d 41 58 50  ile->zPath, MAXP
2d000 41 54 48 4c 45 4e 29 3b 0a 20 20 73 74 72 6c 63  ATHLEN);.  strlc
2d010 61 74 28 77 61 6c 50 61 74 68 2c 20 22 2d 77 61  at(walPath, "-wa
2d020 6c 22 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b  l", MAXPATHLEN);
2d030 0a 20 20 69 6e 74 20 66 64 31 20 3d 20 70 46 69  .  int fd1 = pFi
2d040 6c 65 2d 3e 68 3b 0a 20 20 69 6e 74 20 72 65 73  le->h;.  int res
2d050 75 6c 74 20 3d 20 30 3b 0a 20 20 72 65 73 75 6c  ult = 0;.  resul
2d060 74 20 3d 20 66 74 72 75 6e 63 61 74 65 28 66 64  t = ftruncate(fd
2d070 31 2c 20 30 6c 6c 29 3b 0a 20 20 69 66 20 28 72  1, 0ll);.  if (r
2d080 65 73 75 6c 74 29 20 7b 0a 20 20 20 20 72 65 73  esult) {.    res
2d090 75 6c 74 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 7d  ult = errno;.  }
2d0a0 0a 20 20 69 66 20 28 72 65 73 75 6c 74 29 20 7b  .  if (result) {
2d0b0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
2d0c0 5f 49 4f 45 52 52 3b 0a 20 20 20 20 73 74 6f 72  _IOERR;.    stor
2d0d0 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65  eLastErrno(pFile
2d0e0 2c 20 72 65 73 75 6c 74 29 3b 0a 20 20 7d 0a 20  , result);.  }. 
2d0f0 20 0a 20 20 69 6e 74 20 66 64 32 20 3d 20 6f 70   .  int fd2 = op
2d100 65 6e 28 6a 6f 75 72 6e 61 6c 50 61 74 68 2c 20  en(journalPath, 
2d110 4f 5f 52 44 57 52 29 3b 0a 20 20 69 6e 74 20 72  O_RDWR);.  int r
2d120 65 73 75 6c 74 32 20 3d 20 30 3b 0a 20 20 69 66  esult2 = 0;.  if
2d130 20 28 66 64 32 20 3c 20 30 29 20 7b 0a 20 20 20   (fd2 < 0) {.   
2d140 20 69 66 20 28 65 72 72 6e 6f 20 21 3d 20 45 4e   if (errno != EN
2d150 4f 45 4e 54 29 20 7b 0a 20 20 20 20 20 20 72 65  OENT) {.      re
2d160 73 75 6c 74 32 20 3d 20 65 72 72 6e 6f 3b 0a 20  sult2 = errno;. 
2d170 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
2d180 20 20 72 65 73 75 6c 74 32 20 3d 20 30 3b 0a 20    result2 = 0;. 
2d190 20 20 20 7d 0a 20 20 7d 20 65 6c 73 65 20 7b 0a     }.  } else {.
2d1a0 20 20 20 20 72 65 73 75 6c 74 32 20 3d 20 66 74      result2 = ft
2d1b0 72 75 6e 63 61 74 65 28 66 64 32 2c 20 30 6c 6c  runcate(fd2, 0ll
2d1c0 29 3b 0a 20 20 20 20 69 66 20 28 72 65 73 75 6c  );.    if (resul
2d1d0 74 32 29 20 7b 0a 20 20 20 20 20 20 72 65 73 75  t2) {.      resu
2d1e0 6c 74 32 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  lt2 = errno;.   
2d1f0 20 7d 0a 20 20 7d 0a 20 20 69 66 20 28 72 65 73   }.  }.  if (res
2d200 75 6c 74 32 20 26 26 20 21 72 65 73 75 6c 74 29  ult2 && !result)
2d210 20 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49   {.    rc = SQLI
2d220 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20 73 74  TE_IOERR;.    st
2d230 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69  oreLastErrno(pFi
2d240 6c 65 2c 20 72 65 73 75 6c 74 32 29 3b 0a 20 20  le, result2);.  
2d250 7d 0a 20 20 0a 20 20 69 6e 74 20 66 64 33 20 3d  }.  .  int fd3 =
2d260 20 6f 70 65 6e 28 77 61 6c 50 61 74 68 2c 20 4f   open(walPath, O
2d270 5f 52 44 57 52 29 3b 0a 20 20 69 6e 74 20 72 65  _RDWR);.  int re
2d280 73 75 6c 74 33 20 3d 20 30 3b 0a 20 20 69 66 20  sult3 = 0;.  if 
2d290 28 66 64 33 20 3c 20 30 29 20 7b 0a 20 20 20 20  (fd3 < 0) {.    
2d2a0 69 66 20 28 65 72 72 6e 6f 20 21 3d 20 45 4e 4f  if (errno != ENO
2d2b0 45 4e 54 29 20 7b 0a 20 20 20 20 20 20 72 65 73  ENT) {.      res
2d2c0 75 6c 74 33 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  ult3 = errno;.  
2d2d0 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
2d2e0 20 72 65 73 75 6c 74 33 20 3d 20 30 3b 0a 20 20   result3 = 0;.  
2d2f0 20 20 7d 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20    }.  } else {. 
2d300 20 20 20 72 65 73 75 6c 74 33 20 3d 20 66 74 72     result3 = ftr
2d310 75 6e 63 61 74 65 28 66 64 33 2c 20 30 6c 6c 29  uncate(fd3, 0ll)
2d320 3b 0a 20 20 20 20 69 66 20 28 72 65 73 75 6c 74  ;.    if (result
2d330 33 29 20 7b 0a 20 20 20 20 20 20 72 65 73 75 6c  3) {.      resul
2d340 74 33 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  t3 = errno;.    
2d350 7d 0a 20 20 7d 0a 20 20 69 66 20 28 72 65 73 75  }.  }.  if (resu
2d360 6c 74 33 20 26 26 20 21 28 72 65 73 75 6c 74 20  lt3 && !(result 
2d370 7c 7c 20 72 65 73 75 6c 74 32 29 29 20 7b 0a 20  || result2)) {. 
2d380 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
2d390 4f 45 52 52 3b 0a 20 20 20 20 73 74 6f 72 65 4c  OERR;.    storeL
2d3a0 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20  astErrno(pFile, 
2d3b0 72 65 73 75 6c 74 32 29 3b 0a 20 20 7d 0a 20 20  result2);.  }.  
2d3c0 0a 20 20 69 66 20 28 66 64 33 20 3e 3d 20 30 29  .  if (fd3 >= 0)
2d3d0 20 7b 0a 20 20 20 20 66 73 79 6e 63 28 66 64 33   {.    fsync(fd3
2d3e0 29 3b 0a 20 20 20 20 63 6c 6f 73 65 28 66 64 33  );.    close(fd3
2d3f0 29 3b 0a 20 20 7d 0a 20 20 69 66 20 28 66 64 32  );.  }.  if (fd2
2d400 20 3e 3d 20 30 29 20 7b 0a 20 20 20 20 66 73 79   >= 0) {.    fsy
2d410 6e 63 28 66 64 32 29 3b 0a 20 20 20 20 63 6c 6f  nc(fd2);.    clo
2d420 73 65 28 66 64 32 29 3b 0a 20 20 7d 0a 20 20 66  se(fd2);.  }.  f
2d430 73 79 6e 63 28 66 64 31 29 3b 0a 09 0a 20 20 72  sync(fd1);...  r
2d440 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61  eturn rc;.}..sta
2d450 74 69 63 20 69 6e 74 20 75 6e 69 78 54 72 75 6e  tic int unixTrun
2d460 63 61 74 65 44 61 74 61 62 61 73 65 28 75 6e 69  cateDatabase(uni
2d470 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69 6e  xFile *pFile, in
2d480 74 20 62 46 6c 61 67 73 29 20 7b 0a 20 20 73 71  t bFlags) {.  sq
2d490 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 20 3d  lite3_file *id =
2d4a0 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a   (sqlite3_file *
2d4b0 29 70 46 69 6c 65 3b 0a 20 20 69 6e 74 20 72 63  )pFile;.  int rc
2d4c0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
2d4d0 76 6f 69 64 20 2a 70 4c 6f 63 6b 20 3d 20 4e 55  void *pLock = NU
2d4e0 4c 4c 3b 0a 20 20 69 6e 74 20 66 6c 61 67 73 20  LL;.  int flags 
2d4f0 3d 20 30 3b 0a 20 20 69 6e 74 20 63 6f 72 72 75  = 0;.  int corru
2d500 70 74 46 69 6c 65 4c 6f 63 6b 20 3d 20 30 3b 0a  ptFileLock = 0;.
2d510 20 20 69 6e 74 20 69 73 43 6f 72 72 75 70 74 20    int isCorrupt 
2d520 3d 20 30 3b 0a 20 20 69 6e 74 20 66 6f 72 63 65  = 0;.  int force
2d530 20 3d 20 28 62 46 6c 61 67 73 20 26 20 53 51 4c   = (bFlags & SQL
2d540 49 54 45 5f 54 52 55 4e 43 41 54 45 5f 46 4f 52  ITE_TRUNCATE_FOR
2d550 43 45 29 3b 0a 20 20 69 6e 74 20 73 61 66 65 46  CE);.  int safeF
2d560 61 69 6c 65 64 20 3d 20 30 3b 0a 0a 23 69 66 20  ailed = 0;..#if 
2d570 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44 41  SQLITE_ENABLE_DA
2d580 54 41 5f 50 52 4f 54 45 43 54 49 4f 4e 0a 20 20  TA_PROTECTION.  
2d590 66 6c 61 67 73 20 7c 3d 20 70 46 69 6c 65 2d 3e  flags |= pFile->
2d5a0 70 72 6f 74 46 6c 61 67 73 3b 0a 23 65 6e 64 69  protFlags;.#endi
2d5b0 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  f.#if SQLITE_ENA
2d5c0 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
2d5d0 45 0a 20 20 69 66 28 20 69 73 50 72 6f 78 79 4c  E.  if( isProxyL
2d5e0 6f 63 6b 69 6e 67 4d 6f 64 65 28 70 46 69 6c 65  ockingMode(pFile
2d5f0 29 20 29 7b 0a 20 20 20 20 66 6c 61 67 73 20 7c  ) ){.    flags |
2d600 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 41 55  = SQLITE_OPEN_AU
2d610 54 4f 50 52 4f 58 59 3b 0a 20 20 7d 0a 23 65 6e  TOPROXY;.  }.#en
2d620 64 69 66 0a 20 20 0a 20 20 72 63 20 3d 20 73 71  dif.  .  rc = sq
2d630 6c 69 74 65 33 64 65 6d 6f 5f 73 75 70 65 72 6c  lite3demo_superl
2d640 6f 63 6b 28 70 46 69 6c 65 2d 3e 7a 50 61 74 68  ock(pFile->zPath
2d650 2c 20 30 2c 20 66 6c 61 67 73 2c 20 30 2c 20 30  , 0, flags, 0, 0
2d660 2c 20 26 70 4c 6f 63 6b 29 3b 0a 20 20 69 66 28  , &pLock);.  if(
2d670 20 72 63 20 29 7b 0a 20 20 20 20 69 66 28 20 72   rc ){.    if( r
2d680 63 3d 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  c==SQLITE_CORRUP
2d690 54 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f  T || rc==SQLITE_
2d6a0 4e 4f 54 41 44 42 20 29 7b 0a 20 20 20 20 20 20  NOTADB ){.      
2d6b0 69 73 43 6f 72 72 75 70 74 20 3d 20 31 3b 0a 20  isCorrupt = 1;. 
2d6c0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2d6d0 33 64 65 6d 6f 5f 73 75 70 65 72 6c 6f 63 6b 5f  3demo_superlock_
2d6e0 63 6f 72 72 75 70 74 28 69 64 2c 20 53 51 4c 49  corrupt(id, SQLI
2d6f0 54 45 5f 4c 4f 43 4b 5f 45 58 43 4c 55 53 49 56  TE_LOCK_EXCLUSIV
2d700 45 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  E,.             
2d710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d720 20 20 20 20 20 20 20 20 20 20 20 20 26 63 6f 72              &cor
2d730 72 75 70 74 46 69 6c 65 4c 6f 63 6b 29 3b 0a 20  ruptFileLock);. 
2d740 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 20     }.    if( rc 
2d750 26 26 20 21 66 6f 72 63 65 20 29 7b 0a 20 20 20  && !force ){.   
2d760 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
2d770 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 53 51 4c    }.    rc = SQL
2d780 49 54 45 5f 4f 4b 3b 20 2f 2a 20 49 67 6e 6f 72  ITE_OK; /* Ignor
2d790 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 66 61  e the locking fa
2d7a0 69 6c 75 72 65 20 69 66 20 66 6f 72 63 65 20 69  ilure if force i
2d7b0 73 20 74 72 75 65 20 2a 2f 0a 20 20 7d 0a 20 20  s true */.  }.  
2d7c0 69 66 28 20 28 62 46 6c 61 67 73 26 53 51 4c 49  if( (bFlags&SQLI
2d7d0 54 45 5f 54 52 55 4e 43 41 54 45 5f 49 4e 49 54  TE_TRUNCATE_INIT
2d7e0 49 41 4c 49 5a 45 5f 48 45 41 44 45 52 5f 4d 41  IALIZE_HEADER_MA
2d7f0 53 4b 29 21 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  SK)!=0 ){.    /*
2d800 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 20 6e 65   initialize a ne
2d810 77 20 64 61 74 61 62 61 73 65 20 69 6e 20 54 4d  w database in TM
2d820 50 44 49 52 20 61 6e 64 20 63 6f 70 79 20 74 68  PDIR and copy th
2d830 65 20 63 6f 6e 74 65 6e 74 73 20 6f 76 65 72 20  e contents over 
2d840 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  */.    const cha
2d850 72 20 2a 74 44 69 72 20 3d 20 75 6e 69 78 54 65  r *tDir = unixTe
2d860 6d 70 46 69 6c 65 44 69 72 28 29 3b 0a 20 20 20  mpFileDir();.   
2d870 20 69 6e 74 20 74 44 69 72 4c 65 6e 20 3d 20 73   int tDirLen = s
2d880 74 72 6c 65 6e 28 74 44 69 72 29 3b 0a 20 20 20  trlen(tDir);.   
2d890 20 69 6e 74 20 74 4c 65 6e 20 3d 20 73 69 7a 65   int tLen = size
2d8a0 6f 66 28 63 68 61 72 29 20 2a 20 28 74 44 69 72  of(char) * (tDir
2d8b0 4c 65 6e 20 2b 20 31 32 29 3b 0a 20 20 20 20 63  Len + 12);.    c
2d8c0 68 61 72 20 2a 74 44 62 50 61 74 68 20 3d 20 28  har *tDbPath = (
2d8d0 63 68 61 72 20 2a 29 6d 61 6c 6c 6f 63 28 74 4c  char *)malloc(tL
2d8e0 65 6e 29 3b 0a 20 20 20 20 69 6e 74 20 74 46 64  en);.    int tFd
2d8f0 20 3d 20 2d 31 3b 0a 20 20 20 20 0a 20 20 20 20   = -1;.    .    
2d900 73 74 72 6c 63 70 79 28 74 44 62 50 61 74 68 2c  strlcpy(tDbPath,
2d910 20 74 44 69 72 2c 20 74 4c 65 6e 29 3b 0a 20 20   tDir, tLen);.  
2d920 20 20 69 66 28 20 74 44 62 50 61 74 68 5b 28 74    if( tDbPath[(t
2d930 44 69 72 4c 65 6e 2d 31 29 5d 20 21 3d 20 27 2f  DirLen-1)] != '/
2d940 27 20 29 7b 0a 20 20 20 20 20 20 73 74 72 6c 63  ' ){.      strlc
2d950 61 74 28 74 44 62 50 61 74 68 2c 20 22 2f 74 6d  at(tDbPath, "/tm
2d960 70 64 62 58 58 58 58 58 22 2c 20 74 4c 65 6e 29  pdbXXXXX", tLen)
2d970 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20  ;.    } else {. 
2d980 20 20 20 20 20 73 74 72 6c 63 61 74 28 74 44 62       strlcat(tDb
2d990 50 61 74 68 2c 20 22 74 6d 70 64 62 58 58 58 58  Path, "tmpdbXXXX
2d9a0 58 22 2c 20 74 4c 65 6e 29 3b 0a 20 20 20 20 7d  X", tLen);.    }
2d9b0 0a 20 20 20 20 74 46 64 20 3d 20 6d 6b 73 74 65  .    tFd = mkste
2d9c0 6d 70 28 74 44 62 50 61 74 68 29 3b 0a 20 20 20  mp(tDbPath);.   
2d9d0 20 69 66 28 20 74 46 64 3d 3d 2d 31 20 29 7b 0a   if( tFd==-1 ){.
2d9e0 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45        storeLastE
2d9f0 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e  rrno(pFile, errn
2da00 6f 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  o);.      rc = S
2da10 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20  QLITE_IOERR;.   
2da20 20 20 20 73 61 66 65 46 61 69 6c 65 64 20 3d 20     safeFailed = 
2da30 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
2da40 20 20 20 20 73 71 6c 69 74 65 33 20 2a 74 44 62      sqlite3 *tDb
2da50 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 63   = NULL;.      c
2da60 6f 70 79 66 69 6c 65 5f 73 74 61 74 65 5f 74 20  opyfile_state_t 
2da70 73 3b 0a 20 20 20 20 20 20 69 6e 74 20 74 72 63  s;.      int trc
2da80 20 3d 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f   = sqlite3_open_
2da90 76 32 28 74 44 62 50 61 74 68 2c 20 26 74 44 62  v2(tDbPath, &tDb
2daa0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2dab0 20 20 20 20 20 28 53 51 4c 49 54 45 5f 4f 50 45       (SQLITE_OPE
2dac0 4e 5f 43 52 45 41 54 45 20 7c 20 53 51 4c 49 54  N_CREATE | SQLIT
2dad0 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
2dae0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2daf0 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f         | SQLITE_
2db00 4f 50 45 4e 5f 41 55 54 4f 50 52 4f 58 59 29 2c  OPEN_AUTOPROXY),
2db10 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 63 68   NULL);.      ch
2db20 61 72 20 2a 65 72 72 6d 73 67 20 3d 20 4e 55 4c  ar *errmsg = NUL
2db30 4c 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  L;.      const c
2db40 68 61 72 20 2a 73 71 6c 20 3d 20 22 22 3b 0a 20  har *sql = "";. 
2db50 20 20 20 20 20 69 66 28 20 21 74 72 63 20 26 26       if( !trc &&
2db60 20 28 62 46 6c 61 67 73 26 53 51 4c 49 54 45 5f   (bFlags&SQLITE_
2db70 54 52 55 4e 43 41 54 45 5f 50 41 47 45 53 49 5a  TRUNCATE_PAGESIZ
2db80 45 5f 4d 41 53 4b 29 20 29 7b 0a 20 20 20 20 20  E_MASK) ){.     
2db90 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 70 61     const char pa
2dba0 67 65 73 69 7a 65 5f 73 71 6c 5b 34 5d 5b 32 32  gesize_sql[4][22
2dbb0 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 20 20  ] = {.          
2dbc0 22 70 72 61 67 6d 61 20 70 61 67 65 5f 73 69 7a  "pragma page_siz
2dbd0 65 3d 31 30 32 34 22 2c 0a 20 20 20 20 20 20 20  e=1024",.       
2dbe0 20 20 20 22 70 72 61 67 6d 61 20 70 61 67 65 5f     "pragma page_
2dbf0 73 69 7a 65 3d 32 30 34 38 22 2c 0a 20 20 20 20  size=2048",.    
2dc00 20 20 20 20 20 20 22 70 72 61 67 6d 61 20 70 61        "pragma pa
2dc10 67 65 5f 73 69 7a 65 3d 34 30 39 36 22 2c 0a 20  ge_size=4096",. 
2dc20 20 20 20 20 20 20 20 20 20 22 70 72 61 67 6d 61           "pragma
2dc30 20 70 61 67 65 5f 73 69 7a 65 3d 38 31 39 32 22   page_size=8192"
2dc40 20 0a 20 20 20 20 20 20 20 20 7d 3b 0a 20 20 20   .        };.   
2dc50 20 20 20 20 20 69 6e 74 20 69 50 61 67 65 73 69       int iPagesi
2dc60 7a 65 20 3d 20 28 28 28 62 46 6c 61 67 73 26 53  ze = (((bFlags&S
2dc70 51 4c 49 54 45 5f 54 52 55 4e 43 41 54 45 5f 50  QLITE_TRUNCATE_P
2dc80 41 47 45 53 49 5a 45 5f 4d 41 53 4b 29 20 3e 3e  AGESIZE_MASK) >>
2dc90 20 34 29 20 2d 20 31 29 3b 0a 20 20 20 20 20 20   4) - 1);.      
2dca0 20 20 61 73 73 65 72 74 28 20 69 50 61 67 65 73    assert( iPages
2dcb0 69 7a 65 3e 3d 30 20 26 26 20 69 50 61 67 65 73  ize>=0 && iPages
2dcc0 69 7a 65 3c 3d 34 20 29 3b 0a 20 20 20 20 20 20  ize<=4 );.      
2dcd0 20 20 73 71 6c 20 3d 20 70 61 67 65 73 69 7a 65    sql = pagesize
2dce0 5f 73 71 6c 5b 69 50 61 67 65 73 69 7a 65 5d 3b  _sql[iPagesize];
2dcf0 0a 20 20 20 20 20 20 20 20 74 72 63 20 3d 20 73  .        trc = s
2dd00 71 6c 69 74 65 33 5f 65 78 65 63 28 74 44 62 2c  qlite3_exec(tDb,
2dd10 20 73 71 6c 2c 20 30 2c 20 30 2c 20 26 65 72 72   sql, 0, 0, &err
2dd20 6d 73 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  msg);.      }.  
2dd30 20 20 20 20 69 66 28 20 21 74 72 63 20 29 7b 0a      if( !trc ){.
2dd40 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
2dd50 61 72 20 61 75 74 6f 76 61 63 75 75 6d 5f 73 71  ar autovacuum_sq
2dd60 6c 5b 33 5d 5b 32 31 5d 20 3d 20 7b 0a 20 20 20  l[3][21] = {.   
2dd70 20 20 20 20 20 20 20 22 70 72 61 67 6d 61 20 61         "pragma a
2dd80 75 74 6f 5f 76 61 63 75 75 6d 3d 30 22 2c 0a 20  uto_vacuum=0",. 
2dd90 20 20 20 20 20 20 20 20 20 22 70 72 61 67 6d 61           "pragma
2dda0 20 61 75 74 6f 5f 76 61 63 75 75 6d 3d 31 22 2c   auto_vacuum=1",
2ddb0 0a 20 20 20 20 20 20 20 20 20 20 22 70 72 61 67  .          "prag
2ddc0 6d 61 20 61 75 74 6f 5f 76 61 63 75 75 6d 3d 32  ma auto_vacuum=2
2ddd0 22 0a 20 20 20 20 20 20 20 20 7d 3b 0a 20 20 20  ".        };.   
2dde0 20 20 20 20 20 69 6e 74 20 69 41 75 74 6f 76 61       int iAutova
2ddf0 63 75 75 6d 20 3d 20 32 3b 20 2f 2a 20 64 65 66  cuum = 2; /* def
2de00 61 75 6c 74 20 74 6f 20 69 6e 63 72 65 6d 65 6e  ault to incremen
2de10 74 61 6c 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  tal */.        i
2de20 66 28 20 28 62 46 6c 61 67 73 26 53 51 4c 49 54  f( (bFlags&SQLIT
2de30 45 5f 54 52 55 4e 43 41 54 45 5f 41 55 54 4f 56  E_TRUNCATE_AUTOV
2de40 41 43 55 55 4d 5f 4d 41 53 4b 29 20 29 7b 0a 20  ACUUM_MASK) ){. 
2de50 20 20 20 20 20 20 20 20 20 69 41 75 74 6f 76 61           iAutova
2de60 63 75 75 6d 20 3d 20 28 28 28 62 46 6c 61 67 73  cuum = (((bFlags
2de70 26 53 51 4c 49 54 45 5f 54 52 55 4e 43 41 54 45  &SQLITE_TRUNCATE
2de80 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4d 41 53 4b  _AUTOVACUUM_MASK
2de90 29 20 3e 3e 20 32 29 20 2d 20 31 29 3b 0a 20 20  ) >> 2) - 1);.  
2dea0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2deb0 61 73 73 65 72 74 28 20 69 41 75 74 6f 76 61 63  assert( iAutovac
2dec0 75 75 6d 3e 3d 30 20 26 26 20 69 41 75 74 6f 76  uum>=0 && iAutov
2ded0 61 63 75 75 6d 3c 3d 32 20 29 3b 0a 20 20 20 20  acuum<=2 );.    
2dee0 20 20 20 20 73 71 6c 20 3d 20 61 75 74 6f 76 61      sql = autova
2def0 63 75 75 6d 5f 73 71 6c 5b 69 41 75 74 6f 76 61  cuum_sql[iAutova
2df00 63 75 75 6d 5d 3b 0a 20 20 20 20 20 20 20 20 74  cuum];.        t
2df10 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65  rc = sqlite3_exe
2df20 63 28 74 44 62 2c 20 73 71 6c 2c 20 30 2c 20 30  c(tDb, sql, 0, 0
2df30 2c 20 26 65 72 72 6d 73 67 29 3b 0a 20 20 20 20  , &errmsg);.    
2df40 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 74    }.      if( !t
2df50 72 63 20 26 26 20 28 62 46 6c 61 67 73 26 53 51  rc && (bFlags&SQ
2df60 4c 49 54 45 5f 54 52 55 4e 43 41 54 45 5f 4a 4f  LITE_TRUNCATE_JO
2df70 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 29 20 29  URNALMODE_WAL) )
2df80 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 20 3d 20  {.        sql = 
2df90 22 70 72 61 67 6d 61 20 6a 6f 75 72 6e 61 6c 5f  "pragma journal_
2dfa0 6d 6f 64 65 3d 77 61 6c 22 3b 0a 20 20 20 20 20  mode=wal";.     
2dfb0 20 20 20 74 72 63 20 3d 20 73 71 6c 69 74 65 33     trc = sqlite3
2dfc0 5f 65 78 65 63 28 74 44 62 2c 20 73 71 6c 2c 20  _exec(tDb, sql, 
2dfd0 30 2c 20 30 2c 20 26 65 72 72 6d 73 67 29 3b 0a  0, 0, &errmsg);.
2dfe0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
2dff0 28 20 74 72 63 20 29 7b 0a 20 20 20 20 20 20 20  ( trc ){.       
2e000 20 69 66 28 20 21 74 44 62 20 29 7b 0a 20 20 20   if( !tDb ){.   
2e010 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 73         fprintf(s
2e020 74 64 65 72 72 2c 20 22 66 61 69 6c 65 64 20 74  tderr, "failed t
2e030 6f 20 6f 70 65 6e 20 74 65 6d 70 20 64 61 74 61  o open temp data
2e040 62 61 73 65 20 27 25 73 27 20 74 6f 20 72 65 73  base '%s' to res
2e050 65 74 20 22 0a 20 20 20 20 20 20 20 20 20 20 20  et ".           
2e060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
2e070 74 72 75 6e 63 61 74 65 64 20 64 61 74 61 62 61  truncated databa
2e080 73 65 20 25 73 20 77 69 74 68 20 66 6c 61 67 73  se %s with flags
2e090 20 25 78 3a 20 25 64 5c 6e 22 2c 0a 20 20 20 20   %x: %d\n",.    
2e0a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e0b0 20 20 20 20 20 20 20 74 44 62 50 61 74 68 2c 20         tDbPath, 
2e0c0 70 46 69 6c 65 2d 3e 7a 50 61 74 68 2c 20 62 46  pFile->zPath, bF
2e0d0 6c 61 67 73 2c 20 74 72 63 29 3b 0a 20 20 20 20  lags, trc);.    
2e0e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2e0f0 20 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64       fprintf(std
2e100 65 72 72 2c 20 22 66 61 69 6c 65 64 20 74 6f 20  err, "failed to 
2e110 73 65 74 20 27 25 73 27 20 6f 6e 20 74 72 75 6e  set '%s' on trun
2e120 63 61 74 65 64 20 64 61 74 61 62 61 73 65 20 25  cated database %
2e130 73 2c 20 25 64 3a 20 22 0a 20 20 20 20 20 20 20  s, %d: ".       
2e140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e150 20 20 20 22 25 73 5c 6e 22 2c 20 73 71 6c 2c 20     "%s\n", sql, 
2e160 70 46 69 6c 65 2d 3e 7a 50 61 74 68 2c 20 74 72  pFile->zPath, tr
2e170 63 2c 20 65 72 72 6d 73 67 29 3b 0a 20 20 20 20  c, errmsg);.    
2e180 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
2e190 20 20 20 20 69 66 28 20 74 44 62 20 29 7b 0a 20      if( tDb ){. 
2e1a0 20 20 20 20 20 20 20 69 6e 74 20 6f 66 66 20 3d         int off =
2e1b0 20 30 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 6d   0;.        /* m
2e1c0 65 72 67 65 20 74 68 65 20 77 61 6c 20 69 6e 74  erge the wal int
2e1d0 6f 20 74 68 65 20 64 62 20 2a 2f 0a 20 20 20 20  o the db */.    
2e1e0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65      sqlite3_file
2e1f0 5f 63 6f 6e 74 72 6f 6c 28 74 44 62 2c 20 4e 55  _control(tDb, NU
2e200 4c 4c 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  LL, SQLITE_FCNTL
2e210 5f 50 45 52 53 49 53 54 5f 57 41 4c 2c 20 26 6f  _PERSIST_WAL, &o
2e220 66 66 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  ff);.        sql
2e230 69 74 65 33 5f 63 6c 6f 73 65 28 74 44 62 29 3b  ite3_close(tDb);
2e240 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
2e250 20 3d 20 63 6f 70 79 66 69 6c 65 5f 73 74 61 74   = copyfile_stat
2e260 65 5f 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20  e_alloc();.     
2e270 20 6c 73 65 65 6b 28 74 46 64 2c 20 30 2c 20 53   lseek(tFd, 0, S
2e280 45 45 4b 5f 53 45 54 29 3b 0a 20 20 20 20 20 20  EEK_SET);.      
2e290 6c 73 65 65 6b 28 70 46 69 6c 65 2d 3e 68 2c 20  lseek(pFile->h, 
2e2a0 30 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20 20  0, SEEK_SET);.  
2e2b0 20 20 20 20 69 66 28 20 66 63 6f 70 79 66 69 6c      if( fcopyfil
2e2c0 65 28 74 46 64 2c 20 70 46 69 6c 65 2d 3e 68 2c  e(tFd, pFile->h,
2e2d0 20 73 2c 20 43 4f 50 59 46 49 4c 45 5f 44 41 54   s, COPYFILE_DAT
2e2e0 41 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  A) ){.        in
2e2f0 74 20 65 72 72 3d 65 72 72 6e 6f 3b 0a 20 20 20  t err=errno;.   
2e300 20 20 20 20 20 73 77 69 74 63 68 28 65 72 72 29       switch(err)
2e310 20 7b 0a 20 20 20 20 20 20 20 20 20 20 63 61 73   {.          cas
2e320 65 20 45 4e 4f 4d 45 4d 3a 0a 20 20 20 20 20 20  e ENOMEM:.      
2e330 20 20 20 20 20 20 74 72 63 20 3d 20 53 51 4c 49        trc = SQLI
2e340 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
2e350 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2e360 20 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 0a         default:.
2e370 20 20 20 20 20 20 20 20 20 20 20 20 73 74 6f 72              stor
2e380 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65  eLastErrno(pFile
2e390 2c 20 65 72 72 29 3b 0a 20 20 20 20 20 20 20 20  , err);.        
2e3a0 20 20 20 20 74 72 63 20 3d 20 53 51 4c 49 54 45      trc = SQLITE
2e3b0 5f 49 4f 45 52 52 3b 0a 20 20 20 20 20 20 20 20  _IOERR;.        
2e3c0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
2e3d0 63 6f 70 79 66 69 6c 65 5f 73 74 61 74 65 5f 66  copyfile_state_f
2e3e0 72 65 65 28 73 29 3b 0a 20 20 20 20 20 20 66 73  ree(s);.      fs
2e3f0 79 6e 63 28 70 46 69 6c 65 2d 3e 68 29 3b 0a 20  ync(pFile->h);. 
2e400 20 20 20 20 20 63 6c 6f 73 65 28 74 46 64 29 3b       close(tFd);
2e410 0a 20 20 20 20 20 20 75 6e 6c 69 6e 6b 28 74 44  .      unlink(tD
2e420 62 50 61 74 68 29 3b 0a 20 20 20 20 20 20 69 66  bPath);.      if
2e430 28 20 74 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  ( trc!=SQLITE_OK
2e440 20 29 7b 0a 20 20 20 20 20 20 20 20 73 61 66 65   ){.        safe
2e450 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20  Failed = 1;.    
2e460 20 20 20 20 72 63 20 3d 20 74 72 63 3b 0a 20 20      rc = trc;.  
2e470 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
2e480 66 72 65 65 28 74 44 62 50 61 74 68 29 3b 0a 20  free(tDbPath);. 
2e490 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 72 63   } else {.    rc
2e4a0 20 3d 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f   = pFile->pMetho
2e4b0 64 2d 3e 78 54 72 75 6e 63 61 74 65 28 69 64 2c  d->xTruncate(id,
2e4c0 20 0a 20 20 20 20 20 20 20 20 20 20 20 28 28 70   .           ((p
2e4d0 46 69 6c 65 2d 3e 66 73 46 6c 61 67 73 20 26 20  File->fsFlags & 
2e4e0 53 51 4c 49 54 45 5f 46 53 46 4c 41 47 53 5f 49  SQLITE_FSFLAGS_I
2e4f0 53 5f 4d 53 44 4f 53 29 20 21 3d 20 30 29 20 3f  S_MSDOS) != 0) ?
2e500 20 31 4c 20 3a 20 30 4c 29 3b 0a 20 20 20 20 69   1L : 0L);.    i
2e510 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 73  f( rc ){.      s
2e520 61 66 65 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20  afeFailed = 1;. 
2e530 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72     }.  }.  if( r
2e540 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
2e550 66 6f 72 63 65 20 29 7b 0a 20 20 20 20 72 63 20  force ){.    rc 
2e560 3d 20 75 6e 69 78 49 6e 76 61 6c 69 64 61 74 65  = unixInvalidate
2e570 53 75 70 70 6f 72 74 46 69 6c 65 73 28 70 46 69  SupportFiles(pFi
2e580 6c 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  le, 0);.    if( 
2e590 72 63 20 29 7b 0a 20 20 20 20 20 20 73 61 66 65  rc ){.      safe
2e5a0 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20  Failed = 1;.    
2e5b0 7d 0a 20 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 70  }.  }.  pFile->p
2e5c0 4d 65 74 68 6f 64 2d 3e 78 53 79 6e 63 28 69 64  Method->xSync(id
2e5d0 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55  , SQLITE_SYNC_FU
2e5e0 4c 4c 29 3b 0a 0a 0a 20 20 69 66 28 20 69 73 43  LL);...  if( isC
2e5f0 6f 72 72 75 70 74 20 29 7b 0a 20 20 20 20 73 71  orrupt ){.    sq
2e600 6c 69 74 65 33 64 65 6d 6f 5f 73 75 70 65 72 75  lite3demo_superu
2e610 6e 6c 6f 63 6b 5f 63 6f 72 72 75 70 74 28 69 64  nlock_corrupt(id
2e620 2c 20 63 6f 72 72 75 70 74 46 69 6c 65 4c 6f 63  , corruptFileLoc
2e630 6b 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  k);.  }else if( 
2e640 70 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 73 71 6c  pLock ){.    sql
2e650 69 74 65 33 64 65 6d 6f 5f 73 75 70 65 72 75 6e  ite3demo_superun
2e660 6c 6f 63 6b 28 70 4c 6f 63 6b 29 3b 0a 20 20 7d  lock(pLock);.  }
2e670 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
2e680 28 66 6f 72 63 65 29 3b 0a 20 20 7d 0a 20 20 0a  (force);.  }.  .
2e690 20 20 69 66 28 20 66 6f 72 63 65 20 26 26 20 73    if( force && s
2e6a0 61 66 65 46 61 69 6c 65 64 29 7b 0a 20 20 20 20  afeFailed){.    
2e6b0 72 63 20 3d 20 75 6e 69 78 55 6e 73 61 66 65 54  rc = unixUnsafeT
2e6c0 72 75 6e 63 61 74 65 44 61 74 61 62 61 73 65 28  runcateDatabase(
2e6d0 70 46 69 6c 65 29 3b 0a 20 20 7d 0a 20 20 0a 20  pFile);.  }.  . 
2e6e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2e6f0 2a 0a 20 2a 2a 20 4c 6f 63 6b 20 6c 6f 63 61 74  *. ** Lock locat
2e700 69 6f 6e 73 20 66 6f 72 20 73 68 61 72 65 64 2d  ions for shared-
2e710 6d 65 6d 6f 72 79 20 6c 6f 63 6b 73 20 75 73 65  memory locks use
2e720 64 20 62 79 20 57 41 4c 20 6d 6f 64 65 2e 0a 20  d by WAL mode.. 
2e730 2a 2f 0a 23 69 66 6e 64 65 66 20 53 48 4d 5f 42  */.#ifndef SHM_B
2e740 41 53 45 0a 23 20 64 65 66 69 6e 65 20 53 48 4d  ASE.# define SHM
2e750 5f 42 41 53 45 20 20 20 20 20 20 20 20 20 20 31  _BASE          1
2e760 32 30 0a 23 20 64 65 66 69 6e 65 20 53 48 4d 5f  20.# define SHM_
2e770 57 52 49 54 45 20 20 20 20 20 20 20 20 20 53 48  WRITE         SH
2e780 4d 5f 42 41 53 45 0a 23 20 64 65 66 69 6e 65 20  M_BASE.# define 
2e790 53 48 4d 5f 43 48 45 43 4b 50 4f 49 4e 54 20 20  SHM_CHECKPOINT  
2e7a0 20 20 28 53 48 4d 5f 42 41 53 45 2b 31 29 0a 23    (SHM_BASE+1).#
2e7b0 20 64 65 66 69 6e 65 20 53 48 4d 5f 52 45 43 4f   define SHM_RECO
2e7c0 56 45 52 20 20 20 20 20 20 20 28 53 48 4d 5f 42  VER       (SHM_B
2e7d0 41 53 45 2b 32 29 0a 23 20 64 65 66 69 6e 65 20  ASE+2).# define 
2e7e0 53 48 4d 5f 52 45 41 44 5f 46 49 52 53 54 20 20  SHM_READ_FIRST  
2e7f0 20 20 28 53 48 4d 5f 42 41 53 45 2b 33 29 0a 23    (SHM_BASE+3).#
2e800 20 64 65 66 69 6e 65 20 53 48 4d 5f 52 45 41 44   define SHM_READ
2e810 5f 53 49 5a 45 20 20 20 20 20 35 0a 23 65 6e 64  _SIZE     5.#end
2e820 69 66 20 2f 2a 20 53 48 4d 5f 42 41 53 45 20 2a  if /* SHM_BASE *
2e830 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 74 65  /../*.** This te
2e840 73 74 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 66 6f  st only works fo
2e850 72 20 6c 6f 63 6b 20 74 65 73 74 69 6e 67 20 6f  r lock testing o
2e860 6e 20 75 6e 69 78 2f 70 6f 73 69 78 20 56 46 53  n unix/posix VFS
2e870 2e 0a 2a 2a 20 41 64 61 70 74 65 64 20 66 72 6f  ..** Adapted fro
2e880 6d 20 74 6f 6f 6c 2f 67 65 74 6c 6f 63 6b 2e 63  m tool/getlock.c
2e890 20 66 34 63 33 39 62 36 35 31 33 37 30 31 35 36   f4c39b651370156
2e8a0 63 61 65 39 37 39 35 30 31 61 37 62 31 35 36 62  cae979501a7b156b
2e8b0 64 62 61 35 30 65 37 63 65 0a 2a 2f 0a 73 74 61  dba50e7ce.*/.sta
2e8c0 74 69 63 20 69 6e 74 20 75 6e 69 78 4c 6f 63 6b  tic int unixLock
2e8d0 73 74 61 74 65 50 69 64 28 75 6e 69 78 46 69 6c  statePid(unixFil
2e8e0 65 20 2a 70 46 69 6c 65 2c 20 70 69 64 5f 74 20  e *pFile, pid_t 
2e8f0 70 69 64 2c 20 69 6e 74 20 2a 70 4c 6f 63 6b 73  pid, int *pLocks
2e900 74 61 74 65 29 7b 0a 20 20 69 6e 74 20 68 44 62  tate){.  int hDb
2e910 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65  ;        /* File
2e920 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20   descriptor for 
2e930 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73  the open databas
2e940 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  e file */.  int 
2e950 68 53 68 6d 20 3d 20 2d 31 3b 20 20 2f 2a 20 46  hShm = -1;  /* F
2e960 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66  ile descriptor f
2e970 6f 72 20 57 41 4c 20 73 68 61 72 65 64 2d 6d 65  or WAL shared-me
2e980 6d 6f 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 73  mory file */.  s
2e990 73 69 7a 65 5f 74 20 67 6f 74 3b 20 20 20 20 2f  size_t got;    /
2e9a0 2a 20 42 79 74 65 73 20 72 65 61 64 20 66 72 6f  * Bytes read fro
2e9b0 6d 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e  m header */.  in
2e9c0 74 20 69 73 57 61 6c 20 3d 20 30 3b 20 20 20 20  t isWal = 0;    
2e9d0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
2e9e0 20 69 66 20 69 6e 20 57 41 4c 20 6d 6f 64 65 20   if in WAL mode 
2e9f0 2a 2f 0a 20 20 69 6e 74 20 6e 4c 6f 63 6b 20 3d  */.  int nLock =
2ea00 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
2ea10 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 6f 63  /* Number of loc
2ea20 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20 69 6e 74  ks held */.  int
2ea30 20 6e 6f 48 64 72 20 3d 20 30 3b 20 20 20 20 20   noHdr = 0;     
2ea40 20 20 20 20 20 20 20 20 2f 2a 20 5a 65 72 6f 20          /* Zero 
2ea50 62 79 74 65 20 44 42 20 68 61 73 20 6e 6f 20 68  byte DB has no h
2ea60 65 61 64 65 72 20 2a 2f 0a 20 20 75 6e 73 69 67  eader */.  unsig
2ea70 6e 65 64 20 63 68 61 72 20 61 48 64 72 5b 31 30  ned char aHdr[10
2ea80 30 5d 3b 20 20 20 2f 2a 20 44 61 74 61 62 61 73  0];   /* Databas
2ea90 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 0a 20  e header */.  . 
2eaa0 20 61 73 73 65 72 74 28 70 4c 6f 63 6b 73 74 61   assert(pLocksta
2eab0 74 65 29 3b 0a 20 20 0a 20 20 2f 2a 20 6d 61 6b  te);.  .  /* mak
2eac0 65 20 73 75 72 65 20 77 65 20 61 72 65 20 64 65  e sure we are de
2ead0 61 6c 69 6e 67 20 77 69 74 68 20 61 20 64 61 74  aling with a dat
2eae0 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
2eaf0 68 44 62 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a  hDb = pFile->h;.
2eb00 20 20 69 66 28 20 68 44 62 3c 30 20 29 7b 0a 20    if( hDb<0 ){. 
2eb10 20 20 20 2a 70 4c 6f 63 6b 73 74 61 74 65 20 3d     *pLockstate =
2eb20 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 53 54 41 54   SQLITE_LOCKSTAT
2eb30 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 72 65 74  E_ERROR;.    ret
2eb40 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
2eb50 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
2eb60 28 73 74 72 6c 65 6e 28 53 51 4c 49 54 45 5f 46  (strlen(SQLITE_F
2eb70 49 4c 45 5f 48 45 41 44 45 52 29 2b 31 29 3d 3d  ILE_HEADER)+1)==
2eb80 53 51 4c 49 54 45 5f 46 49 4c 45 5f 48 45 41 44  SQLITE_FILE_HEAD
2eb90 45 52 5f 4c 45 4e 20 29 3b 0a 20 20 67 6f 74 20  ER_LEN );.  got 
2eba0 3d 20 70 72 65 61 64 28 68 44 62 2c 20 61 48 64  = pread(hDb, aHd
2ebb0 72 2c 20 31 30 30 2c 20 30 29 3b 0a 20 20 69 66  r, 100, 0);.  if
2ebc0 28 20 67 6f 74 3c 30 20 29 7b 0a 20 20 20 20 2a  ( got<0 ){.    *
2ebd0 70 4c 6f 63 6b 73 74 61 74 65 20 3d 20 53 51 4c  pLockstate = SQL
2ebe0 49 54 45 5f 4c 4f 43 4b 53 54 41 54 45 5f 45 52  ITE_LOCKSTATE_ER
2ebf0 52 4f 52 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ROR;.    return 
2ec00 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
2ec10 7d 0a 20 20 69 66 28 20 67 6f 74 3d 3d 30 20 29  }.  if( got==0 )
2ec20 7b 0a 20 20 20 20 6e 6f 48 64 72 20 3d 20 31 3b  {.    noHdr = 1;
2ec30 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 67 6f 74  .  }else if( got
2ec40 21 3d 31 30 30 0a 20 20 20 20 20 20 20 20 20 7c  !=100.         |
2ec50 7c 20 6d 65 6d 63 6d 70 28 61 48 64 72 2c 20 53  | memcmp(aHdr, S
2ec60 51 4c 49 54 45 5f 46 49 4c 45 5f 48 45 41 44 45  QLITE_FILE_HEADE
2ec70 52 2c 20 53 51 4c 49 54 45 5f 46 49 4c 45 5f 48  R, SQLITE_FILE_H
2ec80 45 41 44 45 52 5f 4c 45 4e 29 21 3d 30 0a 20 20  EADER_LEN)!=0.  
2ec90 29 7b 0a 20 20 20 20 2a 70 4c 6f 63 6b 73 74 61  ){.    *pLocksta
2eca0 74 65 20 3d 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  te = SQLITE_LOCK
2ecb0 53 54 41 54 45 5f 4e 4f 54 41 44 42 3b 0a 20 20  STATE_NOTADB;.  
2ecc0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2ecd0 4e 4f 54 41 44 42 3b 0a 20 20 7d 0a 20 20 0a 20  NOTADB;.  }.  . 
2ece0 20 2f 2a 20 46 69 72 73 74 20 63 68 65 63 6b 20   /* First check 
2ecf0 66 6f 72 20 61 6e 20 65 78 63 6c 75 73 69 76 65  for an exclusive
2ed00 20 6c 6f 63 6b 20 2a 2f 0a 20 20 6e 4c 6f 63 6b   lock */.  nLock
2ed10 20 2b 3d 20 75 6e 69 78 49 73 4c 6f 63 6b 65 64   += unixIsLocked
2ed20 28 70 69 64 2c 20 68 44 62 2c 20 46 5f 52 44 4c  (pid, hDb, F_RDL
2ed30 43 4b 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54  CK, SHARED_FIRST
2ed40 2c 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 0a 20  , SHARED_SIZE,. 
2ed50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ed60 20 20 20 20 20 20 20 22 45 58 43 4c 55 53 49 56         "EXCLUSIV
2ed70 45 22 29 3b 0a 20 20 69 66 20 28 21 6e 6f 48 64  E");.  if (!noHd
2ed80 72 29 20 7b 0a 20 20 20 20 69 73 57 61 6c 20 3d  r) {.    isWal =
2ed90 20 61 48 64 72 5b 31 38 5d 3d 3d 32 3b 0a 20 20   aHdr[18]==2;.  
2eda0 7d 0a 20 20 69 66 28 20 6e 4c 6f 63 6b 3d 3d 30  }.  if( nLock==0
2edb0 20 26 26 20 69 73 57 61 6c 3d 3d 30 20 29 7b 0a   && isWal==0 ){.
2edc0 20 20 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20      /* Rollback 
2edd0 6d 6f 64 65 20 2a 2f 0a 20 20 20 20 6e 4c 6f 63  mode */.    nLoc
2ede0 6b 20 2b 3d 20 75 6e 69 78 49 73 4c 6f 63 6b 65  k += unixIsLocke
2edf0 64 28 70 69 64 2c 20 68 44 62 2c 20 46 5f 57 52  d(pid, hDb, F_WR
2ee00 4c 43 4b 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54  LCK, PENDING_BYT
2ee10 45 2c 20 53 48 41 52 45 44 5f 53 49 5a 45 2b 32  E, SHARED_SIZE+2
2ee20 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2ee30 20 20 20 20 20 20 20 20 20 20 20 20 22 50 45 4e              "PEN
2ee40 44 49 4e 47 7c 52 45 53 45 52 56 45 44 7c 53 48  DING|RESERVED|SH
2ee50 41 52 45 44 22 29 3b 0a 20 20 7d 0a 20 20 69 66  ARED");.  }.  if
2ee60 28 20 6e 4c 6f 63 6b 3d 3d 30 20 26 26 20 69 73  ( nLock==0 && is
2ee70 57 61 6c 21 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  Wal!=0 ){.    /*
2ee80 20 6c 6f 6f 6b 75 70 20 74 68 65 20 66 69 6c 65   lookup the file
2ee90 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20   descriptor for 
2eea0 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  the shared memor
2eeb0 79 20 66 69 6c 65 20 69 66 20 77 65 20 68 61 76  y file if we hav
2eec0 65 20 69 74 20 6f 70 65 6e 0a 20 20 20 20 2a 2a  e it open.    **
2eed0 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73   in this process
2eee0 20 2a 2f 0a 20 20 20 20 75 6e 69 78 45 6e 74 65   */.    unixEnte
2eef0 72 4d 75 74 65 78 28 29 3b 20 2f 2a 20 42 65 63  rMutex(); /* Bec
2ef00 61 75 73 65 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  ause pFile->pIno
2ef10 64 65 20 69 73 20 73 68 61 72 65 64 20 61 63 72  de is shared acr
2ef20 6f 73 73 20 74 68 72 65 61 64 73 20 2a 2f 0a 20  oss threads */. 
2ef30 20 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a     unixShmNode *
2ef40 70 53 68 6d 4e 6f 64 65 20 3d 20 70 46 69 6c 65  pShmNode = pFile
2ef50 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f  ->pInode->pShmNo
2ef60 64 65 3b 0a 20 20 20 20 69 66 28 20 70 53 68 6d  de;.    if( pShm
2ef70 4e 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 73 71  Node ){.      sq
2ef80 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
2ef90 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  r(pShmNode->mute
2efa0 78 29 3b 0a 20 20 20 20 20 20 0a 20 20 20 20 20  x);.      .     
2efb0 20 68 53 68 6d 20 3d 20 70 53 68 6d 4e 6f 64 65   hShm = pShmNode
2efc0 2d 3e 68 3b 0a 20 20 20 20 20 20 69 66 28 20 68  ->h;.      if( h
2efd0 53 68 6d 20 3e 3d 20 30 29 7b 0a 20 20 20 20 20  Shm >= 0){.     
2efe0 20 20 20 69 66 28 20 75 6e 69 78 49 73 4c 6f 63     if( unixIsLoc
2eff0 6b 65 64 28 70 69 64 2c 20 68 53 68 6d 2c 20 46  ked(pid, hShm, F
2f000 5f 52 44 4c 43 4b 2c 20 53 48 4d 5f 52 45 43 4f  _RDLCK, SHM_RECO
2f010 56 45 52 2c 20 31 2c 20 22 57 41 4c 2d 52 45 43  VER, 1, "WAL-REC
2f020 4f 56 45 52 59 22 29 20 7c 7c 0a 20 20 20 20 20  OVERY") ||.     
2f030 20 20 20 20 20 20 75 6e 69 78 49 73 4c 6f 63 6b        unixIsLock
2f040 65 64 28 70 69 64 2c 20 68 53 68 6d 2c 20 46 5f  ed(pid, hShm, F_
2f050 52 44 4c 43 4b 2c 20 53 48 4d 5f 57 52 49 54 45  RDLCK, SHM_WRITE
2f060 2c 20 31 2c 20 22 57 41 4c 2d 57 52 49 54 45 22  , 1, "WAL-WRITE"
2f070 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e  ) ){.          n
2f080 4c 6f 63 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20  Lock = 1;.      
2f090 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
2f0a0 20 20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33    .      sqlite3
2f0b0 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68  _mutex_leave(pSh
2f0c0 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20  mNode->mutex);. 
2f0d0 20 20 20 7d 20 0a 20 20 20 20 0a 20 20 20 20 69     } .    .    i
2f0e0 66 28 20 68 53 68 6d 3c 30 20 29 7b 0a 20 20 20  f( hShm<0 ){.   
2f0f0 20 20 20 2f 2a 20 74 68 65 20 73 68 61 72 65 64     /* the shared
2f100 20 6d 65 6d 6f 72 79 20 66 69 6c 65 20 69 73 6e   memory file isn
2f110 27 74 20 6f 70 65 6e 20 69 6e 20 74 68 69 73 20  't open in this 
2f120 70 72 6f 63 65 73 73 20 73 70 61 63 65 2c 20 6f  process space, o
2f130 70 65 6e 20 6f 75 72 0a 20 20 20 20 20 20 2a 2a  pen our.      **
2f140 20 6f 77 6e 20 46 44 20 2a 2f 0a 20 20 20 20 20   own FD */.     
2f150 20 63 68 61 72 20 7a 53 68 6d 5b 4d 41 58 50 41   char zShm[MAXPA
2f160 54 48 4c 45 4e 5d 3b 0a 20 20 20 20 20 20 0a 20  THLEN];.      . 
2f170 20 20 20 20 20 2f 2a 20 57 41 4c 20 6d 6f 64 65       /* WAL mode
2f180 20 2a 2f 0a 20 20 20 20 20 20 73 74 72 6c 63 70   */.      strlcp
2f190 79 28 7a 53 68 6d 2c 20 70 46 69 6c 65 2d 3e 7a  y(zShm, pFile->z
2f1a0 50 61 74 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e  Path, MAXPATHLEN
2f1b0 29 3b 0a 20 20 20 20 20 20 73 74 72 6c 63 61 74  );.      strlcat
2f1c0 28 7a 53 68 6d 2c 20 22 2d 73 68 6d 22 2c 20 4d  (zShm, "-shm", M
2f1d0 41 58 50 41 54 48 4c 45 4e 29 3b 0a 20 20 20 20  AXPATHLEN);.    
2f1e0 20 20 68 53 68 6d 20 3d 20 6f 70 65 6e 28 7a 53    hShm = open(zS
2f1f0 68 6d 2c 20 4f 5f 52 44 4f 4e 4c 59 2c 20 30 29  hm, O_RDONLY, 0)
2f200 3b 0a 20 20 20 20 20 20 69 66 28 20 68 53 68 6d  ;.      if( hShm
2f210 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70  <0 ){.        *p
2f220 4c 6f 63 6b 73 74 61 74 65 20 3d 20 53 51 4c 49  Lockstate = SQLI
2f230 54 45 5f 4c 4f 43 4b 53 54 41 54 45 5f 4f 46 46  TE_LOCKSTATE_OFF
2f240 3b 0a 20 20 20 20 20 20 20 20 75 6e 69 78 4c 65  ;.        unixLe
2f250 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 20 20  aveMutex();.    
2f260 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2f270 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  E_OK;.      }.  
2f280 20 20 20 20 69 66 28 20 75 6e 69 78 49 73 4c 6f      if( unixIsLo
2f290 63 6b 65 64 28 70 69 64 2c 20 68 53 68 6d 2c 20  cked(pid, hShm, 
2f2a0 46 5f 52 44 4c 43 4b 2c 20 53 48 4d 5f 52 45 43  F_RDLCK, SHM_REC
2f2b0 4f 56 45 52 2c 20 31 2c 20 22 57 41 4c 2d 52 45  OVER, 1, "WAL-RE
2f2c0 43 4f 56 45 52 59 22 29 20 7c 7c 0a 20 20 20 20  COVERY") ||.    
2f2d0 20 20 20 20 20 75 6e 69 78 49 73 4c 6f 63 6b 65       unixIsLocke
2f2e0 64 28 70 69 64 2c 20 68 53 68 6d 2c 20 46 5f 52  d(pid, hShm, F_R
2f2f0 44 4c 43 4b 2c 20 53 48 4d 5f 57 52 49 54 45 2c  DLCK, SHM_WRITE,
2f300 20 31 2c 20 22 57 41 4c 2d 57 52 49 54 45 22 29   1, "WAL-WRITE")
2f310 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 4c 6f 63   ){.        nLoc
2f320 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  k = 1;.      }. 
2f330 20 20 20 20 20 63 6c 6f 73 65 28 68 53 68 6d 29       close(hShm)
2f340 3b 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e 69 78  ;.    }.    unix
2f350 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
2f360 7d 0a 20 20 69 66 28 20 6e 4c 6f 63 6b 3e 30 20  }.  if( nLock>0 
2f370 29 7b 0a 20 20 20 20 2a 70 4c 6f 63 6b 73 74 61  ){.    *pLocksta
2f380 74 65 20 3d 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  te = SQLITE_LOCK
2f390 53 54 41 54 45 5f 4f 4e 3b 0a 20 20 7d 20 65 6c  STATE_ON;.  } el
2f3a0 73 65 20 7b 0a 20 20 20 20 2a 70 4c 6f 63 6b 73  se {.    *pLocks
2f3b0 74 61 74 65 20 3d 20 53 51 4c 49 54 45 5f 4c 4f  tate = SQLITE_LO
2f3c0 43 4b 53 54 41 54 45 5f 4f 46 46 3b 0a 20 20 7d  CKSTATE_OFF;.  }
2f3d0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
2f3e0 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f  _OK;.}..#endif /
2f3f0 2a 20 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  * (SQLITE_ENABLE
2f400 5f 41 50 50 4c 45 5f 53 50 49 3e 30 29 20 26 26  _APPLE_SPI>0) &&
2f410 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
2f420 5f 5f 29 20 2a 2f 0a 0a 23 69 66 20 53 51 4c 49  __) */..#if SQLI
2f430 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
2f440 3e 30 0a 2f 2a 0a 2a 2a 20 49 66 20 69 74 20 69  >0./*.** If it i
2f450 73 20 63 75 72 72 65 6e 74 6c 79 20 6d 65 6d 6f  s currently memo
2f460 72 79 20 6d 61 70 70 65 64 2c 20 75 6e 6d 61 70  ry mapped, unmap
2f470 20 66 69 6c 65 20 70 46 64 2e 0a 2a 2f 0a 73 74   file pFd..*/.st
2f480 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 55 6e  atic void unixUn
2f490 6d 61 70 66 69 6c 65 28 75 6e 69 78 46 69 6c 65  mapfile(unixFile
2f4a0 20 2a 70 46 64 29 7b 0a 20 20 61 73 73 65 72 74   *pFd){.  assert
2f4b0 28 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74  ( pFd->nFetchOut
2f4c0 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 46 64  ==0 );.  if( pFd
2f4d0 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20 29 7b 0a  ->pMapRegion ){.
2f4e0 20 20 20 20 6f 73 4d 75 6e 6d 61 70 28 70 46 64      osMunmap(pFd
2f4f0 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 2c 20 70 46  ->pMapRegion, pF
2f500 64 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75 61  d->mmapSizeActua
2f510 6c 29 3b 0a 20 20 20 20 70 46 64 2d 3e 70 4d 61  l);.    pFd->pMa
2f520 70 52 65 67 69 6f 6e 20 3d 20 30 3b 0a 20 20 20  pRegion = 0;.   
2f530 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d   pFd->mmapSize =
2f540 20 30 3b 0a 20 20 20 20 70 46 64 2d 3e 6d 6d 61   0;.    pFd->mma
2f550 70 53 69 7a 65 41 63 74 75 61 6c 20 3d 20 30 3b  pSizeActual = 0;
2f560 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74  .  }.}../*.** At
2f570 74 65 6d 70 74 20 74 6f 20 73 65 74 20 74 68 65  tempt to set the
2f580 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6d 65 6d   size of the mem
2f590 6f 72 79 20 6d 61 70 70 69 6e 67 20 6d 61 69 6e  ory mapping main
2f5a0 74 61 69 6e 65 64 20 62 79 20 66 69 6c 65 20 0a  tained by file .
2f5b0 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20 70 46  ** descriptor pF
2f5c0 64 20 74 6f 20 6e 4e 65 77 20 62 79 74 65 73 2e  d to nNew bytes.
2f5d0 20 41 6e 79 20 65 78 69 73 74 69 6e 67 20 6d 61   Any existing ma
2f5e0 70 70 69 6e 67 20 69 73 20 64 69 73 63 61 72 64  pping is discard
2f5f0 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63  ed..**.** If suc
2f600 63 65 73 73 66 75 6c 2c 20 74 68 69 73 20 66 75  cessful, this fu
2f610 6e 63 74 69 6f 6e 20 73 65 74 73 20 74 68 65 20  nction sets the 
2f620 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 62  following variab
2f630 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  les:.**.**      
2f640 20 75 6e 69 78 46 69 6c 65 2e 70 4d 61 70 52 65   unixFile.pMapRe
2f650 67 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20 75 6e  gion.**       un
2f660 69 78 46 69 6c 65 2e 6d 6d 61 70 53 69 7a 65 0a  ixFile.mmapSize.
2f670 2a 2a 20 20 20 20 20 20 20 75 6e 69 78 46 69 6c  **       unixFil
2f680 65 2e 6d 6d 61 70 53 69 7a 65 41 63 74 75 61 6c  e.mmapSizeActual
2f690 0a 2a 2a 0a 2a 2a 20 49 66 20 75 6e 73 75 63 63  .**.** If unsucc
2f6a0 65 73 73 66 75 6c 2c 20 61 6e 20 65 72 72 6f 72  essful, an error
2f6b0 20 6d 65 73 73 61 67 65 20 69 73 20 6c 6f 67 67   message is logg
2f6c0 65 64 20 76 69 61 20 73 71 6c 69 74 65 33 5f 6c  ed via sqlite3_l
2f6d0 6f 67 28 29 20 61 6e 64 0a 2a 2a 20 74 68 65 20  og() and.** the 
2f6e0 74 68 72 65 65 20 76 61 72 69 61 62 6c 65 73 20  three variables 
2f6f0 61 62 6f 76 65 20 61 72 65 20 7a 65 72 6f 65 64  above are zeroed
2f700 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 53  . In this case S
2f710 51 4c 69 74 65 20 73 68 6f 75 6c 64 0a 2a 2a 20  QLite should.** 
2f720 63 6f 6e 74 69 6e 75 65 20 61 63 63 65 73 73 69  continue accessi
2f730 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ng the database 
2f740 75 73 69 6e 67 20 74 68 65 20 78 52 65 61 64 28  using the xRead(
2f750 29 20 61 6e 64 20 78 57 72 69 74 65 28 29 0a 2a  ) and xWrite().*
2f760 2a 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a 73 74  * methods..*/.st
2f770 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 52 65  atic void unixRe
2f780 6d 61 70 66 69 6c 65 28 0a 20 20 75 6e 69 78 46  mapfile(.  unixF
2f790 69 6c 65 20 2a 70 46 64 2c 20 20 20 20 20 20 20  ile *pFd,       
2f7a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
2f7b0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f 62  le descriptor ob
2f7c0 6a 65 63 74 20 2a 2f 0a 20 20 69 36 34 20 6e 4e  ject */.  i64 nN
2f7d0 65 77 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ew              
2f7e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 71            /* Req
2f7f0 75 69 72 65 64 20 6d 61 70 70 69 6e 67 20 73 69  uired mapping si
2f800 7a 65 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74  ze */.){.  const
2f810 20 63 68 61 72 20 2a 7a 45 72 72 20 3d 20 22 6d   char *zErr = "m
2f820 6d 61 70 22 3b 0a 20 20 69 6e 74 20 68 20 3d 20  map";.  int h = 
2f830 70 46 64 2d 3e 68 3b 20 20 20 20 20 20 20 20 20  pFd->h;         
2f840 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2f850 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  File descriptor 
2f860 6f 70 65 6e 20 6f 6e 20 64 62 20 66 69 6c 65 20  open on db file 
2f870 2a 2f 0a 20 20 75 38 20 2a 70 4f 72 69 67 20 3d  */.  u8 *pOrig =
2f880 20 28 75 38 20 2a 29 70 46 64 2d 3e 70 4d 61 70   (u8 *)pFd->pMap
2f890 52 65 67 69 6f 6e 3b 20 20 20 2f 2a 20 50 6f 69  Region;   /* Poi
2f8a0 6e 74 65 72 20 74 6f 20 63 75 72 72 65 6e 74 20  nter to current 
2f8b0 66 69 6c 65 20 6d 61 70 70 69 6e 67 20 2a 2f 0a  file mapping */.
2f8c0 20 20 69 36 34 20 6e 4f 72 69 67 20 3d 20 70 46    i64 nOrig = pF
2f8d0 64 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75 61  d->mmapSizeActua
2f8e0 6c 3b 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f  l;     /* Size o
2f8f0 66 20 70 4f 72 69 67 20 72 65 67 69 6f 6e 20 69  f pOrig region i
2f900 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 38 20  n bytes */.  u8 
2f910 2a 70 4e 65 77 20 3d 20 30 3b 20 20 20 20 20 20  *pNew = 0;      
2f920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f930 20 20 2f 2a 20 4c 6f 63 61 74 69 6f 6e 20 6f 66    /* Location of
2f940 20 6e 65 77 20 6d 61 70 70 69 6e 67 20 2a 2f 0a   new mapping */.
2f950 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 50 52    int flags = PR
2f960 4f 54 5f 52 45 41 44 3b 20 20 20 20 20 20 20 20  OT_READ;        
2f970 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20         /* Flags 
2f980 74 6f 20 70 61 73 73 20 74 6f 20 6d 6d 61 70 28  to pass to mmap(
2f990 29 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  ) */..  assert( 
2f9a0 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d  pFd->nFetchOut==
2f9b0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  0 );.  assert( n
2f9c0 4e 65 77 3e 70 46 64 2d 3e 6d 6d 61 70 53 69 7a  New>pFd->mmapSiz
2f9d0 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  e );.  assert( n
2f9e0 4e 65 77 3c 3d 70 46 64 2d 3e 6d 6d 61 70 53 69  New<=pFd->mmapSi
2f9f0 7a 65 4d 61 78 20 29 3b 0a 20 20 61 73 73 65 72  zeMax );.  asser
2fa00 74 28 20 6e 4e 65 77 3e 30 20 29 3b 0a 20 20 61  t( nNew>0 );.  a
2fa10 73 73 65 72 74 28 20 70 46 64 2d 3e 6d 6d 61 70  ssert( pFd->mmap
2fa20 53 69 7a 65 41 63 74 75 61 6c 3e 3d 70 46 64 2d  SizeActual>=pFd-
2fa30 3e 6d 6d 61 70 53 69 7a 65 20 29 3b 0a 20 20 61  >mmapSize );.  a
2fa40 73 73 65 72 74 28 20 4d 41 50 5f 46 41 49 4c 45  ssert( MAP_FAILE
2fa50 44 21 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 28  D!=0 );..  if( (
2fa60 70 46 64 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26  pFd->ctrlFlags &
2fa70 20 55 4e 49 58 46 49 4c 45 5f 52 44 4f 4e 4c 59   UNIXFILE_RDONLY
2fa80 29 3d 3d 30 20 29 20 66 6c 61 67 73 20 7c 3d 20  )==0 ) flags |= 
2fa90 50 52 4f 54 5f 57 52 49 54 45 3b 0a 0a 20 20 69  PROT_WRITE;..  i
2faa0 66 28 20 70 4f 72 69 67 20 29 7b 0a 23 69 66 20  f( pOrig ){.#if 
2fab0 48 41 56 45 5f 4d 52 45 4d 41 50 0a 20 20 20 20  HAVE_MREMAP.    
2fac0 69 36 34 20 6e 52 65 75 73 65 20 3d 20 70 46 64  i64 nReuse = pFd
2fad0 2d 3e 6d 6d 61 70 53 69 7a 65 3b 0a 23 65 6c 73  ->mmapSize;.#els
2fae0 65 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20  e.    const int 
2faf0 73 7a 53 79 73 70 61 67 65 20 3d 20 6f 73 47 65  szSyspage = osGe
2fb00 74 70 61 67 65 73 69 7a 65 28 29 3b 0a 20 20 20  tpagesize();.   
2fb10 20 69 36 34 20 6e 52 65 75 73 65 20 3d 20 28 70   i64 nReuse = (p
2fb20 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 26 20 7e  Fd->mmapSize & ~
2fb30 28 73 7a 53 79 73 70 61 67 65 2d 31 29 29 3b 0a  (szSyspage-1));.
2fb40 23 65 6e 64 69 66 0a 20 20 20 20 75 38 20 2a 70  #endif.    u8 *p
2fb50 52 65 71 20 3d 20 26 70 4f 72 69 67 5b 6e 52 65  Req = &pOrig[nRe
2fb60 75 73 65 5d 3b 0a 0a 20 20 20 20 2f 2a 20 55 6e  use];..    /* Un
2fb70 6d 61 70 20 61 6e 79 20 70 61 67 65 73 20 6f 66  map any pages of
2fb80 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 6d 61   the existing ma
2fb90 70 70 69 6e 67 20 74 68 61 74 20 63 61 6e 6e 6f  pping that canno
2fba0 74 20 62 65 20 72 65 75 73 65 64 2e 20 2a 2f 0a  t be reused. */.
2fbb0 20 20 20 20 69 66 28 20 6e 52 65 75 73 65 21 3d      if( nReuse!=
2fbc0 6e 4f 72 69 67 20 29 7b 0a 20 20 20 20 20 20 6f  nOrig ){.      o
2fbd0 73 4d 75 6e 6d 61 70 28 70 52 65 71 2c 20 6e 4f  sMunmap(pReq, nO
2fbe0 72 69 67 2d 6e 52 65 75 73 65 29 3b 0a 20 20 20  rig-nReuse);.   
2fbf0 20 7d 0a 0a 23 69 66 20 48 41 56 45 5f 4d 52 45   }..#if HAVE_MRE
2fc00 4d 41 50 0a 20 20 20 20 70 4e 65 77 20 3d 20 6f  MAP.    pNew = o
2fc10 73 4d 72 65 6d 61 70 28 70 4f 72 69 67 2c 20 6e  sMremap(pOrig, n
2fc20 52 65 75 73 65 2c 20 6e 4e 65 77 2c 20 4d 52 45  Reuse, nNew, MRE
2fc30 4d 41 50 5f 4d 41 59 4d 4f 56 45 29 3b 0a 20 20  MAP_MAYMOVE);.  
2fc40 20 20 7a 45 72 72 20 3d 20 22 6d 72 65 6d 61 70    zErr = "mremap
2fc50 22 3b 0a 23 65 6c 73 65 0a 20 20 20 20 70 4e 65  ";.#else.    pNe
2fc60 77 20 3d 20 6f 73 4d 6d 61 70 28 70 52 65 71 2c  w = osMmap(pReq,
2fc70 20 6e 4e 65 77 2d 6e 52 65 75 73 65 2c 20 66 6c   nNew-nReuse, fl
2fc80 61 67 73 2c 20 4d 41 50 5f 53 48 41 52 45 44 2c  ags, MAP_SHARED,
2fc90 20 68 2c 20 6e 52 65 75 73 65 29 3b 0a 20 20 20   h, nReuse);.   
2fca0 20 69 66 28 20 70 4e 65 77 21 3d 4d 41 50 5f 46   if( pNew!=MAP_F
2fcb0 41 49 4c 45 44 20 29 7b 0a 20 20 20 20 20 20 69  AILED ){.      i
2fcc0 66 28 20 70 4e 65 77 21 3d 70 52 65 71 20 29 7b  f( pNew!=pReq ){
2fcd0 0a 20 20 20 20 20 20 20 20 6f 73 4d 75 6e 6d 61  .        osMunma
2fce0 70 28 70 4e 65 77 2c 20 6e 4e 65 77 20 2d 20 6e  p(pNew, nNew - n
2fcf0 52 65 75 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Reuse);.        
2fd00 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 20 20  pNew = 0;.      
2fd10 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
2fd20 4e 65 77 20 3d 20 70 4f 72 69 67 3b 0a 20 20 20  New = pOrig;.   
2fd30 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69     }.    }.#endi
2fd40 66 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 61 74  f..    /* The at
2fd50 74 65 6d 70 74 20 74 6f 20 65 78 74 65 6e 64 20  tempt to extend 
2fd60 74 68 65 20 65 78 69 73 74 69 6e 67 20 6d 61 70  the existing map
2fd70 70 69 6e 67 20 66 61 69 6c 65 64 2e 20 46 72 65  ping failed. Fre
2fd80 65 20 69 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28  e it. */.    if(
2fd90 20 70 4e 65 77 3d 3d 4d 41 50 5f 46 41 49 4c 45   pNew==MAP_FAILE
2fda0 44 20 7c 7c 20 70 4e 65 77 3d 3d 30 20 29 7b 0a  D || pNew==0 ){.
2fdb0 20 20 20 20 20 20 6f 73 4d 75 6e 6d 61 70 28 70        osMunmap(p
2fdc0 4f 72 69 67 2c 20 6e 52 65 75 73 65 29 3b 0a 20  Orig, nReuse);. 
2fdd0 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49     }.  }..  /* I
2fde0 66 20 70 4e 65 77 20 69 73 20 73 74 69 6c 6c 20  f pNew is still 
2fdf0 4e 55 4c 4c 2c 20 74 72 79 20 74 6f 20 63 72 65  NULL, try to cre
2fe00 61 74 65 20 61 6e 20 65 6e 74 69 72 65 6c 79 20  ate an entirely 
2fe10 6e 65 77 20 6d 61 70 70 69 6e 67 2e 20 2a 2f 0a  new mapping. */.
2fe20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b    if( pNew==0 ){
2fe30 0a 20 20 20 20 70 4e 65 77 20 3d 20 6f 73 4d 6d  .    pNew = osMm
2fe40 61 70 28 30 2c 20 6e 4e 65 77 2c 20 66 6c 61 67  ap(0, nNew, flag
2fe50 73 2c 20 4d 41 50 5f 53 48 41 52 45 44 2c 20 68  s, MAP_SHARED, h
2fe60 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  , 0);.  }..  if(
2fe70 20 70 4e 65 77 3d 3d 4d 41 50 5f 46 41 49 4c 45   pNew==MAP_FAILE
2fe80 44 20 29 7b 0a 20 20 20 20 70 4e 65 77 20 3d 20  D ){.    pNew = 
2fe90 30 3b 0a 20 20 20 20 6e 4e 65 77 20 3d 20 30 3b  0;.    nNew = 0;
2fea0 0a 20 20 20 20 75 6e 69 78 4c 6f 67 45 72 72 6f  .    unixLogErro
2feb0 72 28 53 51 4c 49 54 45 5f 4f 4b 2c 20 7a 45 72  r(SQLITE_OK, zEr
2fec0 72 2c 20 70 46 64 2d 3e 7a 50 61 74 68 29 3b 0a  r, pFd->zPath);.
2fed0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6d  .    /* If the m
2fee0 6d 61 70 28 29 20 61 62 6f 76 65 20 66 61 69 6c  map() above fail
2fef0 65 64 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20  ed, assume that 
2ff00 61 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 20 6d  all subsequent m
2ff10 6d 61 70 28 29 20 63 61 6c 6c 73 0a 20 20 20 20  map() calls.    
2ff20 2a 2a 20 77 69 6c 6c 20 70 72 6f 62 61 62 6c 79  ** will probably
2ff30 20 66 61 69 6c 20 74 6f 6f 2e 20 46 61 6c 6c 20   fail too. Fall 
2ff40 62 61 63 6b 20 74 6f 20 75 73 69 6e 67 20 78 52  back to using xR
2ff50 65 61 64 2f 78 57 72 69 74 65 20 65 78 63 6c 75  ead/xWrite exclu
2ff60 73 69 76 65 6c 79 0a 20 20 20 20 2a 2a 20 69 6e  sively.    ** in
2ff70 20 74 68 69 73 20 63 61 73 65 2e 20 20 2a 2f 0a   this case.  */.
2ff80 20 20 20 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a      pFd->mmapSiz
2ff90 65 4d 61 78 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  eMax = 0;.  }.  
2ffa0 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20  pFd->pMapRegion 
2ffb0 3d 20 28 76 6f 69 64 20 2a 29 70 4e 65 77 3b 0a  = (void *)pNew;.
2ffc0 20 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20    pFd->mmapSize 
2ffd0 3d 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 41  = pFd->mmapSizeA
2ffe0 63 74 75 61 6c 20 3d 20 6e 4e 65 77 3b 0a 7d 0a  ctual = nNew;.}.
2fff0 0a 2f 2a 0a 2a 2a 20 4d 65 6d 6f 72 79 20 6d 61  ./*.** Memory ma
30000 70 20 6f 72 20 72 65 6d 61 70 20 74 68 65 20 66  p or remap the f
30010 69 6c 65 20 6f 70 65 6e 65 64 20 62 79 20 66 69  ile opened by fi
30020 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 20 70 46  le-descriptor pF
30030 64 20 28 69 66 20 74 68 65 20 66 69 6c 65 0a 2a  d (if the file.*
30040 2a 20 69 73 20 61 6c 72 65 61 64 79 20 6d 61 70  * is already map
30050 70 65 64 2c 20 74 68 65 20 65 78 69 73 74 69 6e  ped, the existin
30060 67 20 6d 61 70 70 69 6e 67 20 69 73 20 72 65 70  g mapping is rep
30070 6c 61 63 65 64 20 62 79 20 74 68 65 20 6e 65 77  laced by the new
30080 29 2e 20 4f 72 2c 20 69 66 20 0a 2a 2a 20 74 68  ). Or, if .** th
30090 65 72 65 20 61 6c 72 65 61 64 79 20 65 78 69 73  ere already exis
300a0 74 73 20 61 20 6d 61 70 70 69 6e 67 20 66 6f 72  ts a mapping for
300b0 20 74 68 69 73 20 66 69 6c 65 2c 20 61 6e 64 20   this file, and 
300c0 74 68 65 72 65 20 61 72 65 20 73 74 69 6c 6c 20  there are still 
300d0 0a 2a 2a 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  .** outstanding 
300e0 78 46 65 74 63 68 28 29 20 72 65 66 65 72 65 6e  xFetch() referen
300f0 63 65 73 20 74 6f 20 69 74 2c 20 74 68 69 73 20  ces to it, this 
30100 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
30110 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61  -op..**.** If pa
30120 72 61 6d 65 74 65 72 20 6e 42 79 74 65 20 69 73  rameter nByte is
30130 20 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 2c 20 74   non-negative, t
30140 68 65 6e 20 69 74 20 69 73 20 74 68 65 20 72 65  hen it is the re
30150 71 75 65 73 74 65 64 20 73 69 7a 65 20 6f 66 20  quested size of 
30160 0a 2a 2a 20 74 68 65 20 6d 61 70 70 69 6e 67 20  .** the mapping 
30170 74 6f 20 63 72 65 61 74 65 2e 20 4f 74 68 65 72  to create. Other
30180 77 69 73 65 2c 20 69 66 20 6e 42 79 74 65 20 69  wise, if nByte i
30190 73 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f  s less than zero
301a0 2c 20 74 68 65 6e 20 74 68 65 20 0a 2a 2a 20 72  , then the .** r
301b0 65 71 75 65 73 74 65 64 20 73 69 7a 65 20 69 73  equested size is
301c0 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
301d0 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 54   file on disk. T
301e0 68 65 20 61 63 74 75 61 6c 20 73 69 7a 65 20 6f  he actual size o
301f0 66 20 74 68 65 0a 2a 2a 20 63 72 65 61 74 65 64  f the.** created
30200 20 6d 61 70 70 69 6e 67 20 69 73 20 65 69 74 68   mapping is eith
30210 65 72 20 74 68 65 20 72 65 71 75 65 73 74 65 64  er the requested
30220 20 73 69 7a 65 20 6f 72 20 74 68 65 20 76 61 6c   size or the val
30230 75 65 20 63 6f 6e 66 69 67 75 72 65 64 20 0a 2a  ue configured .*
30240 2a 20 75 73 69 6e 67 20 53 51 4c 49 54 45 5f 46  * using SQLITE_F
30250 43 4e 54 4c 5f 4d 4d 41 50 5f 4c 49 4d 49 54 2c  CNTL_MMAP_LIMIT,
30260 20 77 68 69 63 68 65 76 65 72 20 69 73 20 73 6d   whichever is sm
30270 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c  aller..**.** SQL
30280 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
30290 65 64 20 69 66 20 6e 6f 20 65 72 72 6f 72 20 6f  ed if no error o
302a0 63 63 75 72 73 20 28 65 76 65 6e 20 69 66 20 74  ccurs (even if t
302b0 68 65 20 6d 61 70 70 69 6e 67 20 69 73 20 6e 6f  he mapping is no
302c0 74 0a 2a 2a 20 72 65 63 72 65 61 74 65 64 20 61  t.** recreated a
302d0 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 6f 75  s a result of ou
302e0 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65  tstanding refere
302f0 6e 63 65 73 29 20 6f 72 20 61 6e 20 53 51 4c 69  nces) or an SQLi
30300 74 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65  te error.** code
30310 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73   otherwise..*/.s
30320 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4d 61  tatic int unixMa
30330 70 66 69 6c 65 28 75 6e 69 78 46 69 6c 65 20 2a  pfile(unixFile *
30340 70 46 64 2c 20 69 36 34 20 6e 42 79 74 65 29 7b  pFd, i64 nByte){
30350 0a 20 20 69 36 34 20 6e 4d 61 70 20 3d 20 6e 42  .  i64 nMap = nB
30360 79 74 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  yte;.  int rc;..
30370 20 20 61 73 73 65 72 74 28 20 6e 4d 61 70 3e 3d    assert( nMap>=
30380 30 20 7c 7c 20 70 46 64 2d 3e 6e 46 65 74 63 68  0 || pFd->nFetch
30390 4f 75 74 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  Out==0 );.  if( 
303a0 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3e 30  pFd->nFetchOut>0
303b0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
303c0 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 6e 4d 61 70  _OK;..  if( nMap
303d0 3c 30 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  <0 ){.    struct
303e0 20 73 74 61 74 20 73 74 61 74 62 75 66 3b 20 20   stat statbuf;  
303f0 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 77 2d 6c          /* Low-l
30400 65 76 65 6c 20 66 69 6c 65 20 69 6e 66 6f 72 6d  evel file inform
30410 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 72 63 20  ation */.    rc 
30420 3d 20 6f 73 46 73 74 61 74 28 70 46 64 2d 3e 68  = osFstat(pFd->h
30430 2c 20 26 73 74 61 74 62 75 66 29 3b 0a 20 20 20  , &statbuf);.   
30440 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
30450 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
30460 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
30470 46 53 54 41 54 3b 0a 20 20 20 20 7d 0a 20 20 20  FSTAT;.    }.   
30480 20 6e 4d 61 70 20 3d 20 73 74 61 74 62 75 66 2e   nMap = statbuf.
30490 73 74 5f 73 69 7a 65 3b 0a 20 20 7d 0a 20 20 69  st_size;.  }.  i
304a0 66 28 20 6e 4d 61 70 3e 70 46 64 2d 3e 6d 6d 61  f( nMap>pFd->mma
304b0 70 53 69 7a 65 4d 61 78 20 29 7b 0a 20 20 20 20  pSizeMax ){.    
304c0 6e 4d 61 70 20 3d 20 70 46 64 2d 3e 6d 6d 61 70  nMap = pFd->mmap
304d0 53 69 7a 65 4d 61 78 3b 0a 20 20 7d 0a 0a 20 20  SizeMax;.  }..  
304e0 69 66 28 20 6e 4d 61 70 21 3d 70 46 64 2d 3e 6d  if( nMap!=pFd->m
304f0 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 69  mapSize ){.    i
30500 66 28 20 6e 4d 61 70 3e 30 20 29 7b 0a 20 20 20  f( nMap>0 ){.   
30510 20 20 20 75 6e 69 78 52 65 6d 61 70 66 69 6c 65     unixRemapfile
30520 28 70 46 64 2c 20 6e 4d 61 70 29 3b 0a 20 20 20  (pFd, nMap);.   
30530 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 6e   }else{.      un
30540 69 78 55 6e 6d 61 70 66 69 6c 65 28 70 46 64 29  ixUnmapfile(pFd)
30550 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
30560 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
30570 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
30580 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
30590 45 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66  E>0 */../*.** If
305a0 20 70 6f 73 73 69 62 6c 65 2c 20 72 65 74 75 72   possible, retur
305b0 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  n a pointer to a
305c0 20 6d 61 70 70 69 6e 67 20 6f 66 20 66 69 6c 65   mapping of file
305d0 20 66 64 20 73 74 61 72 74 69 6e 67 20 61 74 20   fd starting at 
305e0 6f 66 66 73 65 74 0a 2a 2a 20 69 4f 66 66 2e 20  offset.** iOff. 
305f0 54 68 65 20 6d 61 70 70 69 6e 67 20 6d 75 73 74  The mapping must
30600 20 62 65 20 76 61 6c 69 64 20 66 6f 72 20 61 74   be valid for at
30610 20 6c 65 61 73 74 20 6e 41 6d 74 20 62 79 74 65   least nAmt byte
30620 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 68  s..**.** If such
30630 20 61 20 70 6f 69 6e 74 65 72 20 63 61 6e 20 62   a pointer can b
30640 65 20 6f 62 74 61 69 6e 65 64 2c 20 73 74 6f 72  e obtained, stor
30650 65 20 69 74 20 69 6e 20 2a 70 70 20 61 6e 64 20  e it in *pp and 
30660 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
30670 2e 0a 2a 2a 20 4f 72 2c 20 69 66 20 6f 6e 65 20  ..** Or, if one 
30680 63 61 6e 6e 6f 74 20 62 75 74 20 6e 6f 20 65 72  cannot but no er
30690 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65 74 20  ror occurs, set 
306a0 2a 70 70 20 74 6f 20 30 20 61 6e 64 20 72 65 74  *pp to 0 and ret
306b0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  urn SQLITE_OK..*
306c0 2a 20 46 69 6e 61 6c 6c 79 2c 20 69 66 20 61 6e  * Finally, if an
306d0 20 65 72 72 6f 72 20 64 6f 65 73 20 6f 63 63 75   error does occu
306e0 72 2c 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c  r, return an SQL
306f0 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20  ite error code. 
30700 54 68 65 20 66 69 6e 61 6c 0a 2a 2a 20 76 61 6c  The final.** val
30710 75 65 20 6f 66 20 2a 70 70 20 69 73 20 75 6e 64  ue of *pp is und
30720 65 66 69 6e 65 64 20 69 6e 20 74 68 69 73 20 63  efined in this c
30730 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ase..**.** If th
30740 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73  is function does
30750 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   return a pointe
30760 72 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 6d 75  r, the caller mu
30770 73 74 20 65 76 65 6e 74 75 61 6c 6c 79 20 0a 2a  st eventually .*
30780 2a 20 72 65 6c 65 61 73 65 20 74 68 65 20 72 65  * release the re
30790 66 65 72 65 6e 63 65 20 62 79 20 63 61 6c 6c 69  ference by calli
307a0 6e 67 20 75 6e 69 78 55 6e 66 65 74 63 68 28 29  ng unixUnfetch()
307b0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
307c0 75 6e 69 78 46 65 74 63 68 28 73 71 6c 69 74 65  unixFetch(sqlite
307d0 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34 20  3_file *fd, i64 
307e0 69 4f 66 66 2c 20 69 6e 74 20 6e 41 6d 74 2c 20  iOff, int nAmt, 
307f0 76 6f 69 64 20 2a 2a 70 70 29 7b 0a 23 69 66 20  void **pp){.#if 
30800 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
30810 53 49 5a 45 3e 30 0a 20 20 75 6e 69 78 46 69 6c  SIZE>0.  unixFil
30820 65 20 2a 70 46 64 20 3d 20 28 75 6e 69 78 46 69  e *pFd = (unixFi
30830 6c 65 20 2a 29 66 64 3b 20 20 20 2f 2a 20 54 68  le *)fd;   /* Th
30840 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61 74  e underlying dat
30850 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 23 65  abase file */.#e
30860 6e 64 69 66 0a 20 20 2a 70 70 20 3d 20 30 3b 0a  ndif.  *pp = 0;.
30870 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
30880 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 69 66  MMAP_SIZE>0.  if
30890 28 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d  ( pFd->mmapSizeM
308a0 61 78 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20  ax>0 ){.    if( 
308b0 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 3d  pFd->pMapRegion=
308c0 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
308d0 72 63 20 3d 20 75 6e 69 78 4d 61 70 66 69 6c 65  rc = unixMapfile
308e0 28 70 46 64 2c 20 2d 31 29 3b 0a 20 20 20 20 20  (pFd, -1);.     
308f0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
30900 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
30910 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 46      }.    if( pF
30920 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 3e 3d 20 69  d->mmapSize >= i
30930 4f 66 66 2b 6e 41 6d 74 20 29 7b 0a 20 20 20 20  Off+nAmt ){.    
30940 20 20 2a 70 70 20 3d 20 26 28 28 75 38 20 2a 29    *pp = &((u8 *)
30950 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29  pFd->pMapRegion)
30960 5b 69 4f 66 66 5d 3b 0a 20 20 20 20 20 20 70 46  [iOff];.      pF
30970 64 2d 3e 6e 46 65 74 63 68 4f 75 74 2b 2b 3b 0a  d->nFetchOut++;.
30980 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
30990 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
309a0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  _OK;.}../*.** If
309b0 20 74 68 65 20 74 68 69 72 64 20 61 72 67 75 6d   the third argum
309c0 65 6e 74 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 2c  ent is non-NULL,
309d0 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   then this funct
309e0 69 6f 6e 20 72 65 6c 65 61 73 65 73 20 61 20 0a  ion releases a .
309f0 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 6f 62 74  ** reference obt
30a00 61 69 6e 65 64 20 62 79 20 61 6e 20 65 61 72 6c  ained by an earl
30a10 69 65 72 20 63 61 6c 6c 20 74 6f 20 75 6e 69 78  ier call to unix
30a20 46 65 74 63 68 28 29 2e 20 54 68 65 20 73 65 63  Fetch(). The sec
30a30 6f 6e 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20  ond.** argument 
30a40 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 66  passed to this f
30a50 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  unction must be 
30a60 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20  the same as the 
30a70 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a  corresponding.**
30a80 20 61 72 67 75 6d 65 6e 74 20 74 68 61 74 20 77   argument that w
30a90 61 73 20 70 61 73 73 65 64 20 74 6f 20 74 68 65  as passed to the
30aa0 20 75 6e 69 78 46 65 74 63 68 28 29 20 69 6e 76   unixFetch() inv
30ab0 6f 63 61 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20  ocation. .**.** 
30ac0 4f 72 2c 20 69 66 20 74 68 65 20 74 68 69 72 64  Or, if the third
30ad0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 4e 55 4c   argument is NUL
30ae0 4c 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e  L, then this fun
30af0 63 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 63  ction is being c
30b00 61 6c 6c 65 64 20 0a 2a 2a 20 74 6f 20 69 6e 66  alled .** to inf
30b10 6f 72 6d 20 74 68 65 20 56 46 53 20 6c 61 79 65  orm the VFS laye
30b20 72 20 74 68 61 74 2c 20 61 63 63 6f 72 64 69 6e  r that, accordin
30b30 67 20 74 6f 20 50 4f 53 49 58 2c 20 61 6e 79 20  g to POSIX, any 
30b40 65 78 69 73 74 69 6e 67 20 6d 61 70 70 69 6e 67  existing mapping
30b50 20 0a 2a 2a 20 6d 61 79 20 6e 6f 77 20 62 65 20   .** may now be 
30b60 69 6e 76 61 6c 69 64 20 61 6e 64 20 73 68 6f 75  invalid and shou
30b70 6c 64 20 62 65 20 75 6e 6d 61 70 70 65 64 2e 0a  ld be unmapped..
30b80 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
30b90 69 78 55 6e 66 65 74 63 68 28 73 71 6c 69 74 65  ixUnfetch(sqlite
30ba0 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34 20  3_file *fd, i64 
30bb0 69 4f 66 66 2c 20 76 6f 69 64 20 2a 70 29 7b 0a  iOff, void *p){.
30bc0 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d  #if SQLITE_MAX_M
30bd0 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 75 6e 69  MAP_SIZE>0.  uni
30be0 78 46 69 6c 65 20 2a 70 46 64 20 3d 20 28 75 6e  xFile *pFd = (un
30bf0 69 78 46 69 6c 65 20 2a 29 66 64 3b 20 20 20 2f  ixFile *)fd;   /
30c00 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  * The underlying
30c10 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
30c20 2f 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  /.  UNUSED_PARAM
30c30 45 54 45 52 28 69 4f 66 66 29 3b 0a 0a 20 20 2f  ETER(iOff);..  /
30c40 2a 20 49 66 20 70 3d 3d 30 20 28 75 6e 6d 61 70  * If p==0 (unmap
30c50 20 74 68 65 20 65 6e 74 69 72 65 20 66 69 6c 65   the entire file
30c60 29 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75 73  ) then there mus
30c70 74 20 62 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64  t be no outstand
30c80 69 6e 67 20 0a 20 20 2a 2a 20 78 46 65 74 63 68  ing .  ** xFetch
30c90 20 72 65 66 65 72 65 6e 63 65 73 2e 20 4f 72 2c   references. Or,
30ca0 20 69 66 20 70 21 3d 30 20 28 6d 65 61 6e 69 6e   if p!=0 (meanin
30cb0 67 20 69 74 20 69 73 20 61 6e 20 78 46 65 74 63  g it is an xFetc
30cc0 68 20 72 65 66 65 72 65 6e 63 65 29 2c 0a 20 20  h reference),.  
30cd0 2a 2a 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75  ** then there mu
30ce0 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 6f  st be at least o
30cf0 6e 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 2e 20  ne outstanding. 
30d00 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 70   */.  assert( (p
30d10 3d 3d 30 29 3d 3d 28 70 46 64 2d 3e 6e 46 65 74  ==0)==(pFd->nFet
30d20 63 68 4f 75 74 3d 3d 30 29 20 29 3b 0a 0a 20 20  chOut==0) );..  
30d30 2f 2a 20 49 66 20 70 21 3d 30 2c 20 69 74 20 6d  /* If p!=0, it m
30d40 75 73 74 20 6d 61 74 63 68 20 74 68 65 20 69 4f  ust match the iO
30d50 66 66 20 76 61 6c 75 65 2e 20 2a 2f 0a 20 20 61  ff value. */.  a
30d60 73 73 65 72 74 28 20 70 3d 3d 30 20 7c 7c 20 70  ssert( p==0 || p
30d70 3d 3d 26 28 28 75 38 20 2a 29 70 46 64 2d 3e 70  ==&((u8 *)pFd->p
30d80 4d 61 70 52 65 67 69 6f 6e 29 5b 69 4f 66 66 5d  MapRegion)[iOff]
30d90 20 29 3b 0a 0a 20 20 69 66 28 20 70 20 29 7b 0a   );..  if( p ){.
30da0 20 20 20 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f      pFd->nFetchO
30db0 75 74 2d 2d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ut--;.  }else{. 
30dc0 20 20 20 75 6e 69 78 55 6e 6d 61 70 66 69 6c 65     unixUnmapfile
30dd0 28 70 46 64 29 3b 0a 20 20 7d 0a 0a 20 20 61 73  (pFd);.  }..  as
30de0 73 65 72 74 28 20 70 46 64 2d 3e 6e 46 65 74 63  sert( pFd->nFetc
30df0 68 4f 75 74 3e 3d 30 20 29 3b 0a 23 65 6c 73 65  hOut>=0 );.#else
30e00 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
30e10 54 45 52 28 66 64 29 3b 0a 20 20 55 4e 55 53 45  TER(fd);.  UNUSE
30e20 44 5f 50 41 52 41 4d 45 54 45 52 28 70 29 3b 0a  D_PARAMETER(p);.
30e30 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
30e40 45 52 28 69 4f 66 66 29 3b 0a 23 65 6e 64 69 66  ER(iOff);.#endif
30e50 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
30e60 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48 65  _OK;.}../*.** He
30e70 72 65 20 65 6e 64 73 20 74 68 65 20 69 6d 70 6c  re ends the impl
30e80 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 6c  ementation of al
30e90 6c 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 6d  l sqlite3_file m
30ea0 65 74 68 6f 64 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a  ethods..**.*****
30eb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30ec0 2a 20 45 6e 64 20 73 71 6c 69 74 65 33 5f 66 69  * End sqlite3_fi
30ed0 6c 65 20 4d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a  le Methods *****
30ee0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30ef0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
30f00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30f10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30f20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30f30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
30f40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a  *********/../*.*
30f50 2a 20 54 68 69 73 20 64 69 76 69 73 69 6f 6e 20  * This division 
30f60 63 6f 6e 74 61 69 6e 73 20 64 65 66 69 6e 69 74  contains definit
30f70 69 6f 6e 73 20 6f 66 20 73 71 6c 69 74 65 33 5f  ions of sqlite3_
30f80 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63  io_methods objec
30f90 74 73 20 74 68 61 74 0a 2a 2a 20 69 6d 70 6c 65  ts that.** imple
30fa0 6d 65 6e 74 20 76 61 72 69 6f 75 73 20 66 69 6c  ment various fil
30fb0 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74 65  e locking strate
30fc0 67 69 65 73 2e 20 20 49 74 20 61 6c 73 6f 20 63  gies.  It also c
30fd0 6f 6e 74 61 69 6e 73 20 64 65 66 69 6e 69 74 69  ontains definiti
30fe0 6f 6e 73 0a 2a 2a 20 6f 66 20 22 66 69 6e 64 65  ons.** of "finde
30ff0 72 22 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20 41  r" functions.  A
31000 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e   finder-function
31010 20 69 73 20 75 73 65 64 20 74 6f 20 6c 6f 63 61   is used to loca
31020 74 65 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  te the appropria
31030 74 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 69 6f  te.** sqlite3_io
31040 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20  _methods object 
31050 66 6f 72 20 61 20 70 61 72 74 69 63 75 6c 61 72  for a particular
31060 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
31070 20 54 68 65 20 70 41 70 70 44 61 74 61 0a 2a 2a   The pAppData.**
31080 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 73 71   field of the sq
31090 6c 69 74 65 33 5f 76 66 73 20 56 46 53 20 6f 62  lite3_vfs VFS ob
310a0 6a 65 63 74 73 20 61 72 65 20 69 6e 69 74 69 61  jects are initia
310b0 6c 69 7a 65 64 20 74 6f 20 62 65 20 70 6f 69 6e  lized to be poin
310c0 74 65 72 73 20 74 6f 0a 2a 2a 20 74 68 65 20 63  ters to.** the c
310d0 6f 72 72 65 63 74 20 66 69 6e 64 65 72 2d 66 75  orrect finder-fu
310e0 6e 63 74 69 6f 6e 20 66 6f 72 20 74 68 61 74 20  nction for that 
310f0 56 46 53 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 73 74 20  VFS..**.** Most 
31100 66 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 73  finder functions
31110 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   return a pointe
31120 72 20 74 6f 20 61 20 66 69 78 65 64 20 73 71 6c  r to a fixed sql
31130 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 0a  ite3_io_methods.
31140 2a 2a 20 6f 62 6a 65 63 74 2e 20 20 54 68 65 20  ** object.  The 
31150 6f 6e 6c 79 20 69 6e 74 65 72 65 73 74 69 6e 67  only interesting
31160 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e   finder-function
31170 20 69 73 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69   is autolockIoFi
31180 6e 64 65 72 2c 20 77 68 69 63 68 0a 2a 2a 20 6c  nder, which.** l
31190 6f 6f 6b 73 20 61 74 20 74 68 65 20 66 69 6c 65  ooks at the file
311a0 73 79 73 74 65 6d 20 74 79 70 65 20 61 6e 64 20  system type and 
311b0 74 72 69 65 73 20 74 6f 20 67 75 65 73 73 20 74  tries to guess t
311c0 68 65 20 62 65 73 74 20 6c 6f 63 6b 69 6e 67 0a  he best locking.
311d0 2a 2a 20 73 74 72 61 74 65 67 79 20 66 72 6f 6d  ** strategy from
311e0 20 74 68 61 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72   that..**.** For
311f0 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e   finder-function
31200 20 46 2c 20 74 77 6f 20 6f 62 6a 65 63 74 73 20   F, two objects 
31210 61 72 65 20 63 72 65 61 74 65 64 3a 0a 2a 2a 0a  are created:.**.
31220 2a 2a 20 20 20 20 28 31 29 20 54 68 65 20 72 65  **    (1) The re
31230 61 6c 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69  al finder-functi
31240 6f 6e 20 6e 61 6d 65 64 20 22 46 49 6d 70 74 28  on named "FImpt(
31250 29 22 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29  )"..**.**    (2)
31260 20 41 20 63 6f 6e 73 74 61 6e 74 20 70 6f 69 6e   A constant poin
31270 74 65 72 20 74 6f 20 74 68 69 73 20 66 75 6e 63  ter to this func
31280 74 69 6f 6e 20 6e 61 6d 65 64 20 6a 75 73 74 20  tion named just 
31290 22 46 22 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 41 20  "F"..**.**.** A 
312a0 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 46  pointer to the F
312b0 20 70 6f 69 6e 74 65 72 20 69 73 20 75 73 65 64   pointer is used
312c0 20 61 73 20 74 68 65 20 70 41 70 70 44 61 74 61   as the pAppData
312d0 20 76 61 6c 75 65 20 66 6f 72 20 56 46 53 0a 2a   value for VFS.*
312e0 2a 20 6f 62 6a 65 63 74 73 2e 20 20 57 65 20 68  * objects.  We h
312f0 61 76 65 20 74 6f 20 64 6f 20 74 68 69 73 20 69  ave to do this i
31300 6e 73 74 65 61 64 20 6f 66 20 6c 65 74 74 69 6e  nstead of lettin
31310 67 20 70 41 70 70 44 61 74 61 20 70 6f 69 6e 74  g pAppData point
31320 0a 2a 2a 20 64 69 72 65 63 74 6c 79 20 61 74 20  .** directly at 
31330 74 68 65 20 66 69 6e 64 65 72 2d 66 75 6e 63 74  the finder-funct
31340 69 6f 6e 20 73 69 6e 63 65 20 43 39 30 20 72 75  ion since C90 ru
31350 6c 65 73 20 70 72 65 76 65 6e 74 20 61 20 76 6f  les prevent a vo
31360 69 64 2a 0a 2a 2a 20 66 72 6f 6d 20 62 65 20 63  id*.** from be c
31370 61 73 74 20 69 6e 74 6f 20 61 20 66 75 6e 63 74  ast into a funct
31380 69 6f 6e 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a  ion pointer..**.
31390 2a 2a 0a 2a 2a 20 45 61 63 68 20 69 6e 73 74 61  **.** Each insta
313a0 6e 63 65 20 6f 66 20 74 68 69 73 20 6d 61 63 72  nce of this macr
313b0 6f 20 67 65 6e 65 72 61 74 65 73 20 74 77 6f 20  o generates two 
313c0 6f 62 6a 65 63 74 73 3a 0a 2a 2a 0a 2a 2a 20 20  objects:.**.**  
313d0 20 2a 20 20 41 20 63 6f 6e 73 74 61 6e 74 20 73   *  A constant s
313e0 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
313f0 73 20 6f 62 6a 65 63 74 20 63 61 6c 6c 20 4d 45  s object call ME
31400 54 48 4f 44 20 74 68 61 74 20 68 61 73 20 6c 6f  THOD that has lo
31410 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20 6d 65  cking.**      me
31420 74 68 6f 64 73 20 43 4c 4f 53 45 2c 20 4c 4f 43  thods CLOSE, LOC
31430 4b 2c 20 55 4e 4c 4f 43 4b 2c 20 43 4b 52 45 53  K, UNLOCK, CKRES
31440 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  LOCK..**.**   * 
31450 20 41 6e 20 49 2f 4f 20 6d 65 74 68 6f 64 20 66   An I/O method f
31460 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 63  inder function c
31470 61 6c 6c 65 64 20 46 49 4e 44 45 52 20 74 68 61  alled FINDER tha
31480 74 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e  t returns a poin
31490 74 65 72 0a 2a 2a 20 20 20 20 20 20 74 6f 20 74  ter.**      to t
314a0 68 65 20 4d 45 54 48 4f 44 20 6f 62 6a 65 63 74  he METHOD object
314b0 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73   in the previous
314c0 20 62 75 6c 6c 65 74 2e 0a 2a 2f 0a 23 64 65 66   bullet..*/.#def
314d0 69 6e 65 20 49 4f 4d 45 54 48 4f 44 53 28 46 49  ine IOMETHODS(FI
314e0 4e 44 45 52 2c 20 4d 45 54 48 4f 44 2c 20 56 45  NDER, METHOD, VE
314f0 52 53 49 4f 4e 2c 20 43 4c 4f 53 45 2c 20 4c 4f  RSION, CLOSE, LO
31500 43 4b 2c 20 55 4e 4c 4f 43 4b 2c 20 43 4b 4c 4f  CK, UNLOCK, CKLO
31510 43 4b 2c 20 53 48 4d 4d 41 50 29 20 5c 0a 73 74  CK, SHMMAP) \.st
31520 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74  atic const sqlit
31530 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 4d 45  e3_io_methods ME
31540 54 48 4f 44 20 3d 20 7b 20 20 20 20 20 20 20 20  THOD = {        
31550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31560 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
31570 56 45 52 53 49 4f 4e 2c 20 20 20 20 20 20 20 20  VERSION,        
31580 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69              /* i
31590 56 65 72 73 69 6f 6e 20 2a 2f 20 20 20 20 20 20  Version */      
315a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
315b0 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 43            \.   C
315c0 4c 4f 53 45 2c 20 20 20 20 20 20 20 20 20 20 20  LOSE,           
315d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
315e0 6c 6f 73 65 20 2a 2f 20 20 20 20 20 20 20 20 20  lose */         
315f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31600 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e           \.   un
31610 69 78 52 65 61 64 2c 20 20 20 20 20 20 20 20 20  ixRead,         
31620 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52 65            /* xRe
31630 61 64 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  ad */           
31640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31650 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69          \.   uni
31660 78 57 72 69 74 65 2c 20 20 20 20 20 20 20 20 20  xWrite,         
31670 20 20 20 20 20 20 20 20 20 2f 2a 20 78 57 72 69           /* xWri
31680 74 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  te */           
31690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
316a0 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78         \.   unix
316b0 54 72 75 6e 63 61 74 65 2c 20 20 20 20 20 20 20  Truncate,       
316c0 20 20 20 20 20 20 20 20 2f 2a 20 78 54 72 75 6e          /* xTrun
316d0 63 61 74 65 20 2a 2f 20 20 20 20 20 20 20 20 20  cate */         
316e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
316f0 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53        \.   unixS
31700 79 6e 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  ync,            
31710 20 20 20 20 20 20 20 2f 2a 20 78 53 79 6e 63 20         /* xSync 
31720 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
31730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31740 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 46 69       \.   unixFi
31750 6c 65 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20  leSize,         
31760 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 65 53 69        /* xFileSi
31770 7a 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  ze */           
31780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31790 20 20 20 20 5c 0a 20 20 20 4c 4f 43 4b 2c 20 20      \.   LOCK,  
317a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
317b0 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 2a 2f       /* xLock */
317c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
317d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
317e0 20 20 20 5c 0a 20 20 20 55 4e 4c 4f 43 4b 2c 20     \.   UNLOCK, 
317f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31800 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 2a      /* xUnlock *
31810 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
31820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31830 20 20 5c 0a 20 20 20 43 4b 4c 4f 43 4b 2c 20 20    \.   CKLOCK,  
31840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31850 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65     /* xCheckRese
31860 72 76 65 64 4c 6f 63 6b 20 2a 2f 20 20 20 20 20  rvedLock */     
31870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31880 20 5c 0a 20 20 20 75 6e 69 78 46 69 6c 65 43 6f   \.   unixFileCo
31890 6e 74 72 6f 6c 2c 20 20 20 20 20 20 20 20 20 20  ntrol,          
318a0 20 20 2f 2a 20 78 46 69 6c 65 43 6f 6e 74 72 6f    /* xFileContro
318b0 6c 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  l */            
318c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
318d0 5c 0a 20 20 20 75 6e 69 78 53 65 63 74 6f 72 53  \.   unixSectorS
318e0 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ize,            
318f0 20 2f 2a 20 78 53 65 63 74 6f 72 53 69 7a 65 20   /* xSectorSize 
31900 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
31910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
31920 0a 20 20 20 75 6e 69 78 44 65 76 69 63 65 43 68  .   unixDeviceCh
31930 61 72 61 63 74 65 72 69 73 74 69 63 73 2c 20 20  aracteristics,  
31940 2f 2a 20 78 44 65 76 69 63 65 43 61 70 61 62 69  /* xDeviceCapabi
31950 6c 69 74 69 65 73 20 2a 2f 20 20 20 20 20 20 20  lities */       
31960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
31970 20 20 20 53 48 4d 4d 41 50 2c 20 20 20 20 20 20     SHMMAP,      
31980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
31990 2a 20 78 53 68 6d 4d 61 70 20 2a 2f 20 20 20 20  * xShmMap */    
319a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
319b0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
319c0 20 20 75 6e 69 78 53 68 6d 4c 6f 63 6b 2c 20 20    unixShmLock,  
319d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
319e0 20 78 53 68 6d 4c 6f 63 6b 20 2a 2f 20 20 20 20   xShmLock */    
319f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31a00 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
31a10 20 75 6e 69 78 53 68 6d 42 61 72 72 69 65 72 2c   unixShmBarrier,
31a20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
31a30 78 53 68 6d 42 61 72 72 69 65 72 20 2a 2f 20 20  xShmBarrier */  
31a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31a50 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
31a60 75 6e 69 78 53 68 6d 55 6e 6d 61 70 2c 20 20 20  unixShmUnmap,   
31a70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
31a80 53 68 6d 55 6e 6d 61 70 20 2a 2f 20 20 20 20 20  ShmUnmap */     
31a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31aa0 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75            \.   u
31ab0 6e 69 78 46 65 74 63 68 2c 20 20 20 20 20 20 20  nixFetch,       
31ac0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46             /* xF
31ad0 65 74 63 68 20 2a 2f 20 20 20 20 20 20 20 20 20  etch */         
31ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31af0 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e           \.   un
31b00 69 78 55 6e 66 65 74 63 68 2c 20 20 20 20 20 20  ixUnfetch,      
31b10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e            /* xUn
31b20 66 65 74 63 68 20 2a 2f 20 20 20 20 20 20 20 20  fetch */        
31b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31b40 20 20 20 20 20 20 20 20 5c 0a 7d 3b 20 20 20 20          \.};    
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 20 20 20 20 20 20 20 20 20                  
31b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31b90 20 20 20 20 20 20 20 5c 0a 73 74 61 74 69 63 20         \.static 
31ba0 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f  const sqlite3_io
31bb0 5f 6d 65 74 68 6f 64 73 20 2a 46 49 4e 44 45 52  _methods *FINDER
31bc0 23 23 49 6d 70 6c 28 63 6f 6e 73 74 20 63 68 61  ##Impl(const cha
31bd0 72 20 2a 7a 2c 20 75 6e 69 78 46 69 6c 65 20 2a  r *z, unixFile *
31be0 70 29 7b 20 20 20 5c 0a 20 20 55 4e 55 53 45 44  p){   \.  UNUSED
31bf0 5f 50 41 52 41 4d 45 54 45 52 28 7a 29 3b 20 55  _PARAMETER(z); U
31c00 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
31c10 70 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  p);             
31c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31c30 20 20 20 20 20 5c 0a 20 20 72 65 74 75 72 6e 20       \.  return 
31c40 26 4d 45 54 48 4f 44 3b 20 20 20 20 20 20 20 20  &METHOD;        
31c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31c80 20 20 20 20 5c 0a 7d 20 20 20 20 20 20 20 20 20      \.}         
31c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31cd0 20 20 20 5c 0a 73 74 61 74 69 63 20 63 6f 6e 73     \.static cons
31ce0 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  t sqlite3_io_met
31cf0 68 6f 64 73 20 2a 28 2a 63 6f 6e 73 74 20 46 49  hods *(*const FI
31d00 4e 44 45 52 29 28 63 6f 6e 73 74 20 63 68 61 72  NDER)(const char
31d10 2a 2c 75 6e 69 78 46 69 6c 65 20 2a 70 29 20 20  *,unixFile *p)  
31d20 20 20 5c 0a 20 20 20 20 3d 20 46 49 4e 44 45 52    \.    = FINDER
31d30 23 23 49 6d 70 6c 3b 0a 0a 2f 2a 0a 2a 2a 20 48  ##Impl;../*.** H
31d40 65 72 65 20 61 72 65 20 61 6c 6c 20 6f 66 20 74  ere are all of t
31d50 68 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  he sqlite3_io_me
31d60 74 68 6f 64 73 20 6f 62 6a 65 63 74 73 20 66 6f  thods objects fo
31d70 72 20 65 61 63 68 20 6f 66 20 74 68 65 0a 2a 2a  r each of the.**
31d80 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74 65 67   locking strateg
31d90 69 65 73 2e 20 20 46 75 6e 63 74 69 6f 6e 73 20  ies.  Functions 
31da0 74 68 61 74 20 72 65 74 75 72 6e 20 70 6f 69 6e  that return poin
31db0 74 65 72 73 20 74 6f 20 74 68 65 73 65 20 6d 65  ters to these me
31dc0 74 68 6f 64 73 0a 2a 2a 20 61 72 65 20 61 6c 73  thods.** are als
31dd0 6f 20 63 72 65 61 74 65 64 2e 0a 2a 2f 0a 49 4f  o created..*/.IO
31de0 4d 45 54 48 4f 44 53 28 0a 20 20 70 6f 73 69 78  METHODS(.  posix
31df0 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20  IoFinder,       
31e00 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66       /* Finder f
31e10 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a  unction name */.
31e20 20 20 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73    posixIoMethods
31e30 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73  ,           /* s
31e40 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
31e50 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f  s object name */
31e60 0a 20 20 33 2c 20 20 20 20 20 20 20 20 20 20 20  .  3,           
31e70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
31e80 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 61 6e  shared memory an
31e90 64 20 6d 6d 61 70 20 61 72 65 20 65 6e 61 62 6c  d mmap are enabl
31ea0 65 64 20 2a 2f 0a 20 20 75 6e 69 78 43 6c 6f 73  ed */.  unixClos
31eb0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
31ec0 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68    /* xClose meth
31ed0 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 4c 6f 63 6b  od */.  unixLock
31ee0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
31ef0 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f    /* xLock metho
31f00 64 20 2a 2f 0a 20 20 75 6e 69 78 55 6e 6c 6f 63  d */.  unixUnloc
31f10 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
31f20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68   /* xUnlock meth
31f30 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 43 68 65 63  od */.  unixChec
31f40 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20  kReservedLock,  
31f50 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72    /* xCheckReser
31f60 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  vedLock method *
31f70 2f 0a 20 20 75 6e 69 78 53 68 6d 4d 61 70 20 20  /.  unixShmMap  
31f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
31f90 20 78 53 68 6d 4d 61 70 20 6d 65 74 68 6f 64 20   xShmMap method 
31fa0 2a 2f 0a 29 0a 49 4f 4d 45 54 48 4f 44 53 28 0a  */.).IOMETHODS(.
31fb0 20 20 6e 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72    nolockIoFinder
31fc0 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  ,           /* F
31fd0 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e  inder function n
31fe0 61 6d 65 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 49  ame */.  nolockI
31ff0 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20  oMethods,       
32000 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f     /* sqlite3_io
32010 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20  _methods object 
32020 6e 61 6d 65 20 2a 2f 0a 20 20 32 2c 20 20 20 20  name */.  2,    
32030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32040 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65      /* shared me
32050 6d 6f 72 79 20 69 73 20 65 6e 61 62 6c 65 64 20  mory is enabled 
32060 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 43 6c 6f 73 65  */.  nolockClose
32070 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
32080 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20  * xClose method 
32090 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b 2c  */.  nolockLock,
320a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
320b0 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  * xLock method *
320c0 2f 0a 20 20 6e 6f 6c 6f 63 6b 55 6e 6c 6f 63 6b  /.  nolockUnlock
320d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
320e0 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20   xUnlock method 
320f0 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 43 68 65 63 6b  */.  nolockCheck
32100 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20 2f  ReservedLock,  /
32110 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  * xCheckReserved
32120 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  Lock method */. 
32130 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20   0              
32140 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
32150 68 6d 4d 61 70 20 6d 65 74 68 6f 64 20 2a 2f 0a  hmMap method */.
32160 29 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 64  ).IOMETHODS(.  d
32170 6f 74 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20  otlockIoFinder, 
32180 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64           /* Find
32190 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  er function name
321a0 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 49 6f 4d   */.  dotlockIoM
321b0 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20  ethods,         
321c0 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  /* sqlite3_io_me
321d0 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d  thods object nam
321e0 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20  e */.  1,       
321f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32200 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72   /* shared memor
32210 79 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f  y is disabled */
32220 0a 20 20 64 6f 74 6c 6f 63 6b 43 6c 6f 73 65 2c  .  dotlockClose,
32230 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
32240 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f  xClose method */
32250 0a 20 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 2c 20  .  dotlockLock, 
32260 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
32270 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  xLock method */.
32280 20 20 64 6f 74 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c    dotlockUnlock,
32290 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
322a0 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f  Unlock method */
322b0 0a 20 20 64 6f 74 6c 6f 63 6b 43 68 65 63 6b 52  .  dotlockCheckR
322c0 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20 2f 2a 20  eservedLock, /* 
322d0 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  xCheckReservedLo
322e0 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 30  ck method */.  0
322f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32300 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d           /* xShm
32310 4d 61 70 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a  Map method */.).
32320 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
32330 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
32340 20 26 26 20 21 4f 53 5f 56 58 57 4f 52 4b 53 0a   && !OS_VXWORKS.
32350 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 66 6c 6f  IOMETHODS(.  flo
32360 63 6b 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20  ckIoFinder,     
32370 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72         /* Finder
32380 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a   function name *
32390 2f 0a 20 20 66 6c 6f 63 6b 49 6f 4d 65 74 68 6f  /.  flockIoMetho
323a0 64 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ds,           /*
323b0 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
323c0 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20  ods object name 
323d0 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20  */.  1,         
323e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
323f0 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  * shared memory 
32400 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20  is disabled */. 
32410 20 66 6c 6f 63 6b 43 6c 6f 73 65 2c 20 20 20 20   flockClose,    
32420 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
32430 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lose method */. 
32440 20 66 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20 20   flockLock,     
32450 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c             /* xL
32460 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
32470 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20  flockUnlock,    
32480 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e            /* xUn
32490 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  lock method */. 
324a0 20 66 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72   flockCheckReser
324b0 76 65 64 4c 6f 63 6b 2c 20 20 20 2f 2a 20 78 43  vedLock,   /* xC
324c0 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
324d0 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 30 20 20   method */.  0  
324e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
324f0 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61         /* xShmMa
32500 70 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65  p method */.).#e
32510 6e 64 69 66 0a 0a 23 69 66 20 4f 53 5f 56 58 57  ndif..#if OS_VXW
32520 4f 52 4b 53 0a 49 4f 4d 45 54 48 4f 44 53 28 0a  ORKS.IOMETHODS(.
32530 20 20 73 65 6d 49 6f 46 69 6e 64 65 72 2c 20 20    semIoFinder,  
32540 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
32550 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e  inder function n
32560 61 6d 65 20 2a 2f 0a 20 20 73 65 6d 49 6f 4d 65  ame */.  semIoMe
32570 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20  thods,          
32580 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f     /* sqlite3_io
32590 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20  _methods object 
325a0 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20  name */.  1,    
325b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
325c0 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65      /* shared me
325d0 6d 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65 64  mory is disabled
325e0 20 2a 2f 0a 20 20 73 65 6d 43 6c 6f 73 65 2c 20   */.  semClose, 
325f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32600 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64  /* xClose method
32610 20 2a 2f 0a 20 20 73 65 6d 4c 6f 63 6b 2c 20 20   */.  semLock,  
32620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32630 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  /* xLock method 
32640 2a 2f 0a 20 20 73 65 6d 55 6e 6c 6f 63 6b 2c 20  */.  semUnlock, 
32650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
32660 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64  * xUnlock method
32670 20 2a 2f 0a 20 20 73 65 6d 43 68 65 63 6b 52 65   */.  semCheckRe
32680 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20 20 20 20  servedLock,     
32690 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65  /* xCheckReserve
326a0 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  dLock method */.
326b0 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20    0             
326c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
326d0 53 68 6d 4d 61 70 20 6d 65 74 68 6f 64 20 2a 2f  ShmMap method */
326e0 0a 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64  .).#endif..#if d
326f0 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
32700 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42  ) && SQLITE_ENAB
32710 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
32720 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 61 66  .IOMETHODS(.  af
32730 70 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20  pIoFinder,      
32740 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65          /* Finde
32750 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20  r function name 
32760 2a 2f 0a 20 20 61 66 70 49 6f 4d 65 74 68 6f 64  */.  afpIoMethod
32770 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  s,             /
32780 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  * sqlite3_io_met
32790 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65  hods object name
327a0 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20   */.  1,        
327b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
327c0 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  /* shared memory
327d0 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a   is disabled */.
327e0 20 20 61 66 70 43 6c 6f 73 65 2c 20 20 20 20 20    afpClose,     
327f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
32800 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a  Close method */.
32810 20 20 61 66 70 4c 6f 63 6b 2c 20 20 20 20 20 20    afpLock,      
32820 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
32830 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  Lock method */. 
32840 20 61 66 70 55 6e 6c 6f 63 6b 2c 20 20 20 20 20   afpUnlock,     
32850 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55             /* xU
32860 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  nlock method */.
32870 20 20 61 66 70 43 68 65 63 6b 52 65 73 65 72 76    afpCheckReserv
32880 65 64 4c 6f 63 6b 2c 20 20 20 20 20 2f 2a 20 78  edLock,     /* x
32890 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
328a0 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 30 20  k method */.  0 
328b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
328c0 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d          /* xShmM
328d0 61 70 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23  ap method */.).#
328e0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
328f0 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 6d   proxy locking m
32900 65 74 68 6f 64 20 69 73 20 61 20 22 73 75 70 65  ethod is a "supe
32910 72 2d 6d 65 74 68 6f 64 22 20 69 6e 20 74 68 65  r-method" in the
32920 20 73 65 6e 73 65 20 74 68 61 74 20 69 74 0a 2a   sense that it.*
32930 2a 20 6f 70 65 6e 73 20 73 65 63 6f 6e 64 61 72  * opens secondar
32940 79 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  y file descripto
32950 72 73 20 66 6f 72 20 74 68 65 20 63 6f 6e 63 68  rs for the conch
32960 20 61 6e 64 20 6c 6f 63 6b 20 66 69 6c 65 73 20   and lock files 
32970 61 6e 64 0a 2a 2a 20 69 74 20 75 73 65 73 20 70  and.** it uses p
32980 72 6f 78 79 2c 20 64 6f 74 2d 66 69 6c 65 2c 20  roxy, dot-file, 
32990 41 46 50 2c 20 61 6e 64 20 66 6c 6f 63 6b 28 29  AFP, and flock()
329a0 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 73   locking methods
329b0 20 6f 6e 20 74 68 6f 73 65 0a 2a 2a 20 73 65 63   on those.** sec
329c0 6f 6e 64 61 72 79 20 66 69 6c 65 73 2e 20 20 46  ondary files.  F
329d0 6f 72 20 74 68 69 73 20 72 65 61 73 6f 6e 2c 20  or this reason, 
329e0 74 68 65 20 64 69 76 69 73 69 6f 6e 20 74 68 61  the division tha
329f0 74 20 69 6d 70 6c 65 6d 65 6e 74 73 0a 2a 2a 20  t implements.** 
32a00 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73  proxy locking is
32a10 20 6c 6f 63 61 74 65 64 20 6d 75 63 68 20 66 75   located much fu
32a20 72 74 68 65 72 20 64 6f 77 6e 20 69 6e 20 74 68  rther down in th
32a30 65 20 66 69 6c 65 2e 20 20 42 75 74 20 77 65 20  e file.  But we 
32a40 6e 65 65 64 0a 2a 2a 20 74 6f 20 67 6f 20 61 68  need.** to go ah
32a50 65 61 64 20 61 6e 64 20 64 65 66 69 6e 65 20 74  ead and define t
32a60 68 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  he sqlite3_io_me
32a70 74 68 6f 64 73 20 61 6e 64 20 66 69 6e 64 65 72  thods and finder
32a80 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 66 6f 72   function.** for
32a90 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 68   proxy locking h
32aa0 65 72 65 2e 20 20 53 6f 20 77 65 20 66 6f 72 77  ere.  So we forw
32ab0 61 72 64 20 64 65 63 6c 61 72 65 20 74 68 65 20  ard declare the 
32ac0 49 2f 4f 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a  I/O methods..*/.
32ad0 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50  #if defined(__AP
32ae0 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45  PLE__) && SQLITE
32af0 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
32b00 53 54 59 4c 45 0a 73 74 61 74 69 63 20 69 6e 74  STYLE.static int
32b10 20 70 72 6f 78 79 43 6c 6f 73 65 28 73 71 6c 69   proxyClose(sqli
32b20 74 65 33 5f 66 69 6c 65 2a 29 3b 0a 73 74 61 74  te3_file*);.stat
32b30 69 63 20 69 6e 74 20 70 72 6f 78 79 4c 6f 63 6b  ic int proxyLock
32b40 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20  (sqlite3_file*, 
32b50 69 6e 74 29 3b 0a 73 74 61 74 69 63 20 69 6e 74  int);.static int
32b60 20 70 72 6f 78 79 55 6e 6c 6f 63 6b 28 73 71 6c   proxyUnlock(sql
32b70 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 29  ite3_file*, int)
32b80 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  ;.static int pro
32b90 78 79 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  xyCheckReservedL
32ba0 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
32bb0 2a 2c 20 69 6e 74 2a 29 3b 0a 49 4f 4d 45 54 48  *, int*);.IOMETH
32bc0 4f 44 53 28 0a 20 20 70 72 6f 78 79 49 6f 46 69  ODS(.  proxyIoFi
32bd0 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  nder,           
32be0 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74   /* Finder funct
32bf0 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 70 72  ion name */.  pr
32c00 6f 78 79 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20  oxyIoMethods,   
32c10 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74          /* sqlit
32c20 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62  e3_io_methods ob
32c30 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 32  ject name */.  2
32c40 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
32c50 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72           /* shar
32c60 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 65 6e 61  ed memory is ena
32c70 62 6c 65 64 20 2a 2f 0a 20 20 70 72 6f 78 79 43  bled */.  proxyC
32c80 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  lose,           
32c90 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65      /* xClose me
32ca0 74 68 6f 64 20 2a 2f 0a 20 20 70 72 6f 78 79 4c  thod */.  proxyL
32cb0 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
32cc0 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74      /* xLock met
32cd0 68 6f 64 20 2a 2f 0a 20 20 70 72 6f 78 79 55 6e  hod */.  proxyUn
32ce0 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  lock,           
32cf0 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65     /* xUnlock me
32d00 74 68 6f 64 20 2a 2f 0a 20 20 70 72 6f 78 79 43  thod */.  proxyC
32d10 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
32d20 2c 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73  ,   /* xCheckRes
32d30 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64  ervedLock method
32d40 20 2a 2f 0a 20 20 30 20 20 20 20 20 20 20 20 20   */.  0         
32d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32d60 2f 2a 20 78 53 68 6d 4d 61 70 20 6d 65 74 68 6f  /* xShmMap metho
32d70 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 2f  d */.).#endif../
32d80 2a 20 6e 66 73 20 6c 6f 63 6b 64 20 6f 6e 20 4f  * nfs lockd on O
32d90 53 58 20 31 30 2e 33 2b 20 64 6f 65 73 6e 27 74  SX 10.3+ doesn't
32da0 20 63 6c 65 61 72 20 77 72 69 74 65 20 6c 6f 63   clear write loc
32db0 6b 73 20 77 68 65 6e 20 61 20 72 65 61 64 20 6c  ks when a read l
32dc0 6f 63 6b 20 69 73 20 73 65 74 20 2a 2f 0a 23 69  ock is set */.#i
32dd0 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
32de0 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45  E__) && SQLITE_E
32df0 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
32e00 59 4c 45 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20  YLE.IOMETHODS(. 
32e10 20 6e 66 73 49 6f 46 69 6e 64 65 72 2c 20 20 20   nfsIoFinder,   
32e20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
32e30 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e  inder function n
32e40 61 6d 65 20 2a 2f 0a 20 20 6e 66 73 49 6f 4d 65  ame */.  nfsIoMe
32e50 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20  thods,          
32e60 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69      /* sqlite3_i
32e70 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74  o_methods object
32e80 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20   name */.  1,   
32e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32ea0 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20        /* shared 
32eb0 6d 65 6d 6f 72 79 20 69 73 20 64 69 73 61 62 6c  memory is disabl
32ec0 65 64 20 2a 2f 0a 20 20 75 6e 69 78 43 6c 6f 73  ed */.  unixClos
32ed0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
32ee0 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74     /* xClose met
32ef0 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 4c 6f 63  hod */.  unixLoc
32f00 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
32f10 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74      /* xLock met
32f20 68 6f 64 20 2a 2f 0a 20 20 6e 66 73 55 6e 6c 6f  hod */.  nfsUnlo
32f30 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
32f40 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d      /* xUnlock m
32f50 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 43  ethod */.  unixC
32f60 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
32f70 2c 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52  ,     /* xCheckR
32f80 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68  eservedLock meth
32f90 6f 64 20 2a 2f 0a 20 20 30 20 20 20 20 20 20 20  od */.  0       
32fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32fb0 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20 6d 65     /* xShmMap me
32fc0 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66  thod */.).#endif
32fd0 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  ..#if defined(__
32fe0 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49  APPLE__) && SQLI
32ff0 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
33000 47 5f 53 54 59 4c 45 0a 2f 2a 20 0a 2a 2a 20 54  G_STYLE./* .** T
33010 68 69 73 20 22 66 69 6e 64 65 72 22 20 66 75 6e  his "finder" fun
33020 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74  ction attempts t
33030 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20  o determine the 
33040 62 65 73 74 20 6c 6f 63 6b 69 6e 67 20 73 74 72  best locking str
33050 61 74 65 67 79 20 0a 2a 2a 20 66 6f 72 20 74 68  ategy .** for th
33060 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
33070 22 66 69 6c 65 50 61 74 68 22 2e 20 20 49 74 20  "filePath".  It 
33080 74 68 65 6e 20 72 65 74 75 72 6e 73 20 74 68 65  then returns the
33090 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
330a0 6f 64 73 0a 2a 2a 20 6f 62 6a 65 63 74 20 74 68  ods.** object th
330b0 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68  at implements th
330c0 61 74 20 73 74 72 61 74 65 67 79 2e 0a 2a 2a 0a  at strategy..**.
330d0 2a 2a 20 54 68 69 73 20 69 73 20 66 6f 72 20 4d  ** This is for M
330e0 61 63 4f 53 58 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73  acOSX only..*/.s
330f0 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69  tatic const sqli
33100 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a  te3_io_methods *
33110 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72  autolockIoFinder
33120 49 6d 70 6c 28 0a 20 20 63 6f 6e 73 74 20 63 68  Impl(.  const ch
33130 61 72 20 2a 66 69 6c 65 50 61 74 68 2c 20 20 20  ar *filePath,   
33140 20 2f 2a 20 6e 61 6d 65 20 6f 66 20 74 68 65 20   /* name of the 
33150 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
33160 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e 65  .  unixFile *pNe
33170 77 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 6f  w           /* o
33180 70 65 6e 20 66 69 6c 65 20 6f 62 6a 65 63 74 20  pen file object 
33190 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65  for the database
331a0 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 73 74   file */.){.  st
331b0 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63  atic const struc
331c0 74 20 4d 61 70 70 69 6e 67 20 7b 0a 20 20 20 20  t Mapping {.    
331d0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
331e0 65 73 79 73 74 65 6d 3b 20 20 20 20 20 20 20 20  esystem;        
331f0 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 73 79 73        /* Filesys
33200 74 65 6d 20 74 79 70 65 20 6e 61 6d 65 20 2a 2f  tem type name */
33210 0a 20 20 20 20 63 6f 6e 73 74 20 73 71 6c 69 74  .    const sqlit
33220 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 70  e3_io_methods *p
33230 4d 65 74 68 6f 64 73 3b 20 20 20 2f 2a 20 41 70  Methods;   /* Ap
33240 70 72 6f 70 72 69 61 74 65 20 6c 6f 63 6b 69 6e  propriate lockin
33250 67 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 7d 20  g method */.  } 
33260 61 4d 61 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b  aMap[] = {.    {
33270 20 22 68 66 73 22 2c 20 20 20 20 26 70 6f 73 69   "hfs",    &posi
33280 78 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20  xIoMethods },.  
33290 20 20 7b 20 22 75 66 73 22 2c 20 20 20 20 26 70    { "ufs",    &p
332a0 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 20 7d 2c  osixIoMethods },
332b0 0a 20 20 20 20 7b 20 22 61 66 70 66 73 22 2c 20  .    { "afpfs", 
332c0 20 26 61 66 70 49 6f 4d 65 74 68 6f 64 73 20 7d   &afpIoMethods }
332d0 2c 0a 20 20 20 20 7b 20 22 73 6d 62 66 73 22 2c  ,.    { "smbfs",
332e0 20 20 26 61 66 70 49 6f 4d 65 74 68 6f 64 73 20    &afpIoMethods 
332f0 7d 2c 0a 20 20 20 20 7b 20 22 77 65 62 64 61 76  },.    { "webdav
33300 22 2c 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68  ", &nolockIoMeth
33310 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20 30 2c 20  ods },.    { 0, 
33320 30 20 7d 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69  0 }.  };.  int i
33330 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 66  ;.  struct statf
33340 73 20 66 73 49 6e 66 6f 3b 0a 20 20 73 74 72 75  s fsInfo;.  stru
33350 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 49 6e 66  ct flock lockInf
33360 6f 3b 0a 0a 20 20 69 66 28 20 21 66 69 6c 65 50  o;..  if( !fileP
33370 61 74 68 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  ath ){.    /* If
33380 20 66 69 6c 65 50 61 74 68 3d 3d 4e 55 4c 4c 20   filePath==NULL 
33390 74 68 61 74 20 6d 65 61 6e 73 20 77 65 20 61 72  that means we ar
333a0 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61  e dealing with a
333b0 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 0a   transient file.
333c0 20 20 20 20 2a 2a 20 74 68 61 74 20 64 6f 65 73      ** that does
333d0 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20   not need to be 
333e0 6c 6f 63 6b 65 64 2e 20 2a 2f 0a 20 20 20 20 72  locked. */.    r
333f0 65 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49 6f 4d  eturn &nolockIoM
33400 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 20 20 69 66  ethods;.  }.  if
33410 28 20 73 74 61 74 66 73 28 66 69 6c 65 50 61 74  ( statfs(filePat
33420 68 2c 20 26 66 73 49 6e 66 6f 29 20 21 3d 20 2d  h, &fsInfo) != -
33430 31 20 29 7b 0a 20 20 20 20 69 66 28 20 66 73 49  1 ){.    if( fsI
33440 6e 66 6f 2e 66 5f 66 6c 61 67 73 20 26 20 4d 4e  nfo.f_flags & MN
33450 54 5f 52 44 4f 4e 4c 59 20 29 7b 0a 20 20 20 20  T_RDONLY ){.    
33460 20 20 72 65 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b    return &nolock
33470 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20 7d  IoMethods;.    }
33480 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 61 4d  .    for(i=0; aM
33490 61 70 5b 69 5d 2e 7a 46 69 6c 65 73 79 73 74 65  ap[i].zFilesyste
334a0 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  m; i++){.      i
334b0 66 28 20 73 74 72 63 6d 70 28 66 73 49 6e 66 6f  f( strcmp(fsInfo
334c0 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20 61  .f_fstypename, a
334d0 4d 61 70 5b 69 5d 2e 7a 46 69 6c 65 73 79 73 74  Map[i].zFilesyst
334e0 65 6d 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  em)==0 ){.      
334f0 20 20 72 65 74 75 72 6e 20 61 4d 61 70 5b 69 5d    return aMap[i]
33500 2e 70 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20 20  .pMethods;.     
33510 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
33520 2f 2a 20 44 65 66 61 75 6c 74 20 63 61 73 65 2e  /* Default case.
33530 20 48 61 6e 64 6c 65 73 2c 20 61 6d 6f 6e 67 73   Handles, amongs
33540 74 20 6f 74 68 65 72 73 2c 20 22 6e 66 73 22 2e  t others, "nfs".
33550 0a 20 20 2a 2a 20 54 65 73 74 20 62 79 74 65 2d  .  ** Test byte-
33560 72 61 6e 67 65 20 6c 6f 63 6b 20 75 73 69 6e 67  range lock using
33570 20 66 63 6e 74 6c 28 29 2e 20 49 66 20 74 68 65   fcntl(). If the
33580 20 63 61 6c 6c 20 73 75 63 63 65 65 64 73 2c 20   call succeeds, 
33590 0a 20 20 2a 2a 20 61 73 73 75 6d 65 20 74 68 61  .  ** assume tha
335a0 74 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  t the file-syste
335b0 6d 20 73 75 70 70 6f 72 74 73 20 50 4f 53 49 58  m supports POSIX
335c0 20 73 74 79 6c 65 20 6c 6f 63 6b 73 2e 20 0a 20   style locks. . 
335d0 20 2a 2f 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c   */.  lockInfo.l
335e0 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20 6c 6f 63 6b  _len = 1;.  lock
335f0 49 6e 66 6f 2e 6c 5f 73 74 61 72 74 20 3d 20 30  Info.l_start = 0
33600 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 77  ;.  lockInfo.l_w
33610 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54  hence = SEEK_SET
33620 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 74  ;.  lockInfo.l_t
33630 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20  ype = F_RDLCK;. 
33640 20 69 66 28 20 6f 73 46 63 6e 74 6c 28 70 4e 65   if( osFcntl(pNe
33650 77 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b 2c 20 26  w->h, F_GETLK, &
33660 6c 6f 63 6b 49 6e 66 6f 29 21 3d 2d 31 20 29 20  lockInfo)!=-1 ) 
33670 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  {.    if( strcmp
33680 28 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65  (fsInfo.f_fstype
33690 6e 61 6d 65 2c 20 22 6e 66 73 22 29 3d 3d 30 20  name, "nfs")==0 
336a0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
336b0 26 6e 66 73 49 6f 4d 65 74 68 6f 64 73 3b 0a 20  &nfsIoMethods;. 
336c0 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
336d0 20 20 72 65 74 75 72 6e 20 26 70 6f 73 69 78 49    return &posixI
336e0 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20 7d 0a  oMethods;.    }.
336f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
33700 75 72 6e 20 26 64 6f 74 6c 6f 63 6b 49 6f 4d 65  urn &dotlockIoMe
33710 74 68 6f 64 73 3b 0a 20 20 7d 0a 7d 0a 73 74 61  thods;.  }.}.sta
33720 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  tic const sqlite
33730 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 0a 20 20  3_io_methods .  
33740 2a 28 2a 63 6f 6e 73 74 20 61 75 74 6f 6c 6f 63  *(*const autoloc
33750 6b 49 6f 46 69 6e 64 65 72 29 28 63 6f 6e 73 74  kIoFinder)(const
33760 20 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65 2a   char*,unixFile*
33770 29 20 3d 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69  ) = autolockIoFi
33780 6e 64 65 72 49 6d 70 6c 3b 0a 0a 23 65 6e 64 69  nderImpl;..#endi
33790 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41  f /* defined(__A
337a0 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54  PPLE__) && SQLIT
337b0 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
337c0 5f 53 54 59 4c 45 20 2a 2f 0a 0a 23 69 66 20 4f  _STYLE */..#if O
337d0 53 5f 56 58 57 4f 52 4b 53 20 26 26 20 53 51 4c  S_VXWORKS && SQL
337e0 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
337f0 4e 47 5f 53 54 59 4c 45 0a 2f 2a 20 0a 2a 2a 20  NG_STYLE./* .** 
33800 54 68 69 73 20 22 66 69 6e 64 65 72 22 20 66 75  This "finder" fu
33810 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20  nction attempts 
33820 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  to determine the
33830 20 62 65 73 74 20 6c 6f 63 6b 69 6e 67 20 73 74   best locking st
33840 72 61 74 65 67 79 20 0a 2a 2a 20 66 6f 72 20 74  rategy .** for t
33850 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
33860 20 22 66 69 6c 65 50 61 74 68 22 2e 20 20 49 74   "filePath".  It
33870 20 74 68 65 6e 20 72 65 74 75 72 6e 73 20 74 68   then returns th
33880 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  e sqlite3_io_met
33890 68 6f 64 73 0a 2a 2a 20 6f 62 6a 65 63 74 20 74  hods.** object t
338a0 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74  hat implements t
338b0 68 61 74 20 73 74 72 61 74 65 67 79 2e 0a 2a 2a  hat strategy..**
338c0 0a 2a 2a 20 54 68 69 73 20 69 73 20 66 6f 72 20  .** This is for 
338d0 56 58 57 6f 72 6b 73 20 6f 6e 6c 79 2e 0a 2a 2f  VXWorks only..*/
338e0 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71  .static const sq
338f0 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
33900 20 2a 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64   *autolockIoFind
33910 65 72 49 6d 70 6c 28 0a 20 20 63 6f 6e 73 74 20  erImpl(.  const 
33920 63 68 61 72 20 2a 66 69 6c 65 50 61 74 68 2c 20  char *filePath, 
33930 20 20 20 2f 2a 20 6e 61 6d 65 20 6f 66 20 74 68     /* name of th
33940 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
33950 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  */.  unixFile *p
33960 4e 65 77 20 20 20 20 20 20 20 20 20 20 20 2f 2a  New           /*
33970 20 74 68 65 20 6f 70 65 6e 20 66 69 6c 65 20 6f   the open file o
33980 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 73 74  bject */.){.  st
33990 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 49  ruct flock lockI
339a0 6e 66 6f 3b 0a 0a 20 20 69 66 28 20 21 66 69 6c  nfo;..  if( !fil
339b0 65 50 61 74 68 20 29 7b 0a 20 20 20 20 2f 2a 20  ePath ){.    /* 
339c0 49 66 20 66 69 6c 65 50 61 74 68 3d 3d 4e 55 4c  If filePath==NUL
339d0 4c 20 74 68 61 74 20 6d 65 61 6e 73 20 77 65 20  L that means we 
339e0 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68  are dealing with
339f0 20 61 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c   a transient fil
33a00 65 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 64 6f  e.    ** that do
33a10 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62  es not need to b
33a20 65 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a 20 20 20  e locked. */.   
33a30 20 72 65 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49   return &nolockI
33a40 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 0a 20  oMethods;.  }.. 
33a50 20 2f 2a 20 54 65 73 74 20 69 66 20 66 63 6e 74   /* Test if fcnt
33a60 6c 28 29 20 69 73 20 73 75 70 70 6f 72 74 65 64  l() is supported
33a70 20 61 6e 64 20 75 73 65 20 50 4f 53 49 58 20 73   and use POSIX s
33a80 74 79 6c 65 20 6c 6f 63 6b 73 2e 0a 20 20 2a 2a  tyle locks..  **
33a90 20 4f 74 68 65 72 77 69 73 65 20 66 61 6c 6c 20   Otherwise fall 
33aa0 62 61 63 6b 20 74 6f 20 74 68 65 20 6e 61 6d 65  back to the name
33ab0 64 20 73 65 6d 61 70 68 6f 72 65 20 6d 65 74 68  d semaphore meth
33ac0 6f 64 2e 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b 49  od..  */.  lockI
33ad0 6e 66 6f 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20  nfo.l_len = 1;. 
33ae0 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 73 74 61 72   lockInfo.l_star
33af0 74 20 3d 20 30 3b 0a 20 20 6c 6f 63 6b 49 6e 66  t = 0;.  lockInf
33b00 6f 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45  o.l_whence = SEE
33b10 4b 5f 53 45 54 3b 0a 20 20 6c 6f 63 6b 49 6e 66  K_SET;.  lockInf
33b20 6f 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c  o.l_type = F_RDL
33b30 43 4b 3b 0a 20 20 69 66 28 20 6f 73 46 63 6e 74  CK;.  if( osFcnt
33b40 6c 28 70 4e 65 77 2d 3e 68 2c 20 46 5f 47 45 54  l(pNew->h, F_GET
33b50 4c 4b 2c 20 26 6c 6f 63 6b 49 6e 66 6f 29 21 3d  LK, &lockInfo)!=
33b60 2d 31 20 29 20 7b 0a 20 20 20 20 72 65 74 75 72  -1 ) {.    retur
33b70 6e 20 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64  n &posixIoMethod
33b80 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  s;.  }else{.    
33b90 72 65 74 75 72 6e 20 26 73 65 6d 49 6f 4d 65 74  return &semIoMet
33ba0 68 6f 64 73 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74  hods;.  }.}.stat
33bb0 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ic const sqlite3
33bc0 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 0a 20 20 2a  _io_methods .  *
33bd0 28 2a 63 6f 6e 73 74 20 61 75 74 6f 6c 6f 63 6b  (*const autolock
33be0 49 6f 46 69 6e 64 65 72 29 28 63 6f 6e 73 74 20  IoFinder)(const 
33bf0 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65 2a 29  char*,unixFile*)
33c00 20 3d 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e   = autolockIoFin
33c10 64 65 72 49 6d 70 6c 3b 0a 0a 23 65 6e 64 69 66  derImpl;..#endif
33c20 20 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20 26   /* OS_VXWORKS &
33c30 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  & SQLITE_ENABLE_
33c40 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f  LOCKING_STYLE */
33c50 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 61 62 73 74 72  ../*.** An abstr
33c60 61 63 74 20 74 79 70 65 20 66 6f 72 20 61 20 70  act type for a p
33c70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 49 4f 20  ointer to an IO 
33c80 6d 65 74 68 6f 64 20 66 69 6e 64 65 72 20 66 75  method finder fu
33c90 6e 63 74 69 6f 6e 3a 0a 2a 2f 0a 74 79 70 65 64  nction:.*/.typed
33ca0 65 66 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ef const sqlite3
33cb0 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 28 2a 66  _io_methods *(*f
33cc0 69 6e 64 65 72 5f 74 79 70 65 29 28 63 6f 6e 73  inder_type)(cons
33cd0 74 20 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65  t char*,unixFile
33ce0 2a 29 3b 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  *);.../*********
33cf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33d00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33d10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33d20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33d30 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
33d40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33d50 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65 74   sqlite3_vfs met
33d60 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  hods ***********
33d70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33d80 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 64 69 76  *.**.** This div
33d90 69 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 74  ision contains t
33da0 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
33db0 6e 20 6f 66 20 6d 65 74 68 6f 64 73 20 6f 6e 20  n of methods on 
33dc0 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 76  the.** sqlite3_v
33dd0 66 73 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 0a 2f  fs object..*/../
33de0 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20  *.** Initialize 
33df0 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
33e00 74 68 65 20 75 6e 69 78 46 69 6c 65 20 73 74 72  the unixFile str
33e10 75 63 74 75 72 65 20 70 6f 69 6e 74 65 64 20 74  ucture pointed t
33e20 6f 20 62 79 20 70 49 64 2e 0a 2a 2f 0a 73 74 61  o by pId..*/.sta
33e30 74 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e 55 6e  tic int fillInUn
33e40 69 78 46 69 6c 65 28 0a 20 20 73 71 6c 69 74 65  ixFile(.  sqlite
33e50 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20  3_vfs *pVfs,    
33e60 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
33e70 76 66 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  vfs object */.  
33e80 69 6e 74 20 68 2c 20 20 20 20 20 20 20 20 20 20  int h,          
33e90 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20          /* Open 
33ea0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
33eb0 6f 66 20 66 69 6c 65 20 62 65 69 6e 67 20 6f 70  of file being op
33ec0 65 6e 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ened */.  sqlite
33ed0 33 5f 66 69 6c 65 20 2a 70 49 64 2c 20 20 20 20  3_file *pId,    
33ee0 20 20 2f 2a 20 57 72 69 74 65 20 74 6f 20 74 68    /* Write to th
33ef0 65 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63  e unixFile struc
33f00 74 75 72 65 20 68 65 72 65 20 2a 2f 0a 20 20 63  ture here */.  c
33f10 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
33f20 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f  name,  /* Name o
33f30 66 20 74 68 65 20 66 69 6c 65 20 62 65 69 6e 67  f the file being
33f40 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 69 6e 74   opened */.  int
33f50 20 63 74 72 6c 46 6c 61 67 73 20 20 20 20 20 20   ctrlFlags      
33f60 20 20 20 20 20 2f 2a 20 5a 65 72 6f 20 6f 72 20       /* Zero or 
33f70 6d 6f 72 65 20 55 4e 49 58 46 49 4c 45 5f 2a 20  more UNIXFILE_* 
33f80 76 61 6c 75 65 73 20 2a 2f 0a 29 7b 0a 20 20 63  values */.){.  c
33f90 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f  onst sqlite3_io_
33fa0 6d 65 74 68 6f 64 73 20 2a 70 4c 6f 63 6b 69 6e  methods *pLockin
33fb0 67 53 74 79 6c 65 3b 0a 20 20 75 6e 69 78 46 69  gStyle;.  unixFi
33fc0 6c 65 20 2a 70 4e 65 77 20 3d 20 28 75 6e 69 78  le *pNew = (unix
33fd0 46 69 6c 65 20 2a 29 70 49 64 3b 0a 20 20 69 6e  File *)pId;.  in
33fe0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
33ff0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65  ;..  assert( pNe
34000 77 2d 3e 70 49 6e 6f 64 65 3d 3d 4e 55 4c 4c 20  w->pInode==NULL 
34010 29 3b 0a 0a 20 20 2f 2a 20 55 73 75 61 6c 6c 79  );..  /* Usually
34020 20 74 68 65 20 70 61 74 68 20 7a 46 69 6c 65 6e   the path zFilen
34030 61 6d 65 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62  ame should not b
34040 65 20 61 20 72 65 6c 61 74 69 76 65 20 70 61 74  e a relative pat
34050 68 6e 61 6d 65 2e 20 54 68 65 0a 20 20 2a 2a 20  hname. The.  ** 
34060 65 78 63 65 70 74 69 6f 6e 20 69 73 20 77 68 65  exception is whe
34070 6e 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 70 72  n opening the pr
34080 6f 78 79 20 22 63 6f 6e 63 68 22 20 66 69 6c 65  oxy "conch" file
34090 20 69 6e 20 62 75 69 6c 64 73 20 74 68 61 74 0a   in builds that.
340a0 20 20 2a 2a 20 69 6e 63 6c 75 64 65 20 74 68 65    ** include the
340b0 20 73 70 65 63 69 61 6c 20 41 70 70 6c 65 20 6c   special Apple l
340c0 6f 63 6b 69 6e 67 20 73 74 79 6c 65 73 2e 0a 20  ocking styles.. 
340d0 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28   */.#if defined(
340e0 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51  __APPLE__) && SQ
340f0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
34100 49 4e 47 5f 53 54 59 4c 45 0a 20 20 61 73 73 65  ING_STYLE.  asse
34110 72 74 28 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30  rt( zFilename==0
34120 20 7c 7c 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d   || zFilename[0]
34130 3d 3d 27 2f 27 20 0a 20 20 20 20 7c 7c 20 70 56  =='/' .    || pV
34140 66 73 2d 3e 70 41 70 70 44 61 74 61 3d 3d 28 76  fs->pAppData==(v
34150 6f 69 64 2a 29 26 61 75 74 6f 6c 6f 63 6b 49 6f  oid*)&autolockIo
34160 46 69 6e 64 65 72 20 29 3b 0a 23 65 6c 73 65 0a  Finder );.#else.
34170 20 20 61 73 73 65 72 74 28 20 7a 46 69 6c 65 6e    assert( zFilen
34180 61 6d 65 3d 3d 30 20 7c 7c 20 7a 46 69 6c 65 6e  ame==0 || zFilen
34190 61 6d 65 5b 30 5d 3d 3d 27 2f 27 20 29 3b 0a 23  ame[0]=='/' );.#
341a0 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4e 6f 20 6c  endif..  /* No l
341b0 6f 63 6b 69 6e 67 20 6f 63 63 75 72 73 20 69 6e  ocking occurs in
341c0 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73   temporary files
341d0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 7a 46   */.  assert( zF
341e0 69 6c 65 6e 61 6d 65 21 3d 30 20 7c 7c 20 28 63  ilename!=0 || (c
341f0 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46  trlFlags & UNIXF
34200 49 4c 45 5f 4e 4f 4c 4f 43 4b 29 21 3d 30 20 29  ILE_NOLOCK)!=0 )
34210 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4f  ;..  OSTRACE(("O
34220 50 45 4e 20 20 20 20 25 2d 33 64 20 25 73 5c 6e  PEN    %-3d %s\n
34230 22 2c 20 68 2c 20 7a 46 69 6c 65 6e 61 6d 65 29  ", h, zFilename)
34240 29 3b 0a 20 20 70 4e 65 77 2d 3e 68 20 3d 20 68  );.  pNew->h = h
34250 3b 0a 20 20 70 4e 65 77 2d 3e 70 56 66 73 20 3d  ;.  pNew->pVfs =
34260 20 70 56 66 73 3b 0a 20 20 70 4e 65 77 2d 3e 7a   pVfs;.  pNew->z
34270 50 61 74 68 20 3d 20 7a 46 69 6c 65 6e 61 6d 65  Path = zFilename
34280 3b 0a 20 20 70 4e 65 77 2d 3e 63 74 72 6c 46 6c  ;.  pNew->ctrlFl
34290 61 67 73 20 3d 20 28 75 38 29 63 74 72 6c 46 6c  ags = (u8)ctrlFl
342a0 61 67 73 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f  ags;.#if SQLITE_
342b0 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
342c0 20 20 70 4e 65 77 2d 3e 6d 6d 61 70 53 69 7a 65    pNew->mmapSize
342d0 4d 61 78 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f  Max = sqlite3Glo
342e0 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4d 6d 61 70  balConfig.szMmap
342f0 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 73  ;.#endif.  if( s
34300 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65  qlite3_uri_boole
34310 61 6e 28 28 28 63 74 72 6c 46 6c 61 67 73 20 26  an(((ctrlFlags &
34320 20 55 4e 49 58 46 49 4c 45 5f 55 52 49 29 20 3f   UNIXFILE_URI) ?
34330 20 7a 46 69 6c 65 6e 61 6d 65 20 3a 20 30 29 2c   zFilename : 0),
34340 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
34350 20 20 20 20 20 20 20 20 20 20 20 20 22 70 73 6f              "pso
34360 77 22 2c 20 53 51 4c 49 54 45 5f 50 4f 57 45 52  w", SQLITE_POWER
34370 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 29 20  SAFE_OVERWRITE) 
34380 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 63 74 72  ){.    pNew->ctr
34390 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49  lFlags |= UNIXFI
343a0 4c 45 5f 50 53 4f 57 3b 0a 20 20 7d 0a 20 20 69  LE_PSOW;.  }.  i
343b0 66 28 20 73 74 72 63 6d 70 28 70 56 66 73 2d 3e  f( strcmp(pVfs->
343c0 7a 4e 61 6d 65 2c 22 75 6e 69 78 2d 65 78 63 6c  zName,"unix-excl
343d0 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4e 65  ")==0 ){.    pNe
343e0 77 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20  w->ctrlFlags |= 
343f0 55 4e 49 58 46 49 4c 45 5f 45 58 43 4c 3b 0a 20  UNIXFILE_EXCL;. 
34400 20 7d 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52   }..#if OS_VXWOR
34410 4b 53 0a 20 20 70 4e 65 77 2d 3e 70 49 64 20 3d  KS.  pNew->pId =
34420 20 76 78 77 6f 72 6b 73 46 69 6e 64 46 69 6c 65   vxworksFindFile
34430 49 64 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  Id(zFilename);. 
34440 20 69 66 28 20 70 4e 65 77 2d 3e 70 49 64 3d 3d   if( pNew->pId==
34450 30 20 29 7b 0a 20 20 20 20 63 74 72 6c 46 6c 61  0 ){.    ctrlFla
34460 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 4e  gs |= UNIXFILE_N
34470 4f 4c 4f 43 4b 3b 0a 20 20 20 20 72 63 20 3d 20  OLOCK;.    rc = 
34480 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
34490 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20  }.#endif..  if( 
344a0 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58  ctrlFlags & UNIX
344b0 46 49 4c 45 5f 4e 4f 4c 4f 43 4b 20 29 7b 0a 20  FILE_NOLOCK ){. 
344c0 20 20 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65     pLockingStyle
344d0 20 3d 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68   = &nolockIoMeth
344e0 6f 64 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ods;.  }else{.  
344f0 20 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20    pLockingStyle 
34500 3d 20 28 2a 2a 28 66 69 6e 64 65 72 5f 74 79 70  = (**(finder_typ
34510 65 2a 29 70 56 66 73 2d 3e 70 41 70 70 44 61 74  e*)pVfs->pAppDat
34520 61 29 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 4e  a)(zFilename, pN
34530 65 77 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f  ew);.#if SQLITE_
34540 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
34550 54 59 4c 45 0a 20 20 20 20 2f 2a 20 43 61 63 68  TYLE.    /* Cach
34560 65 20 7a 46 69 6c 65 6e 61 6d 65 20 69 6e 20 74  e zFilename in t
34570 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65  he locking conte
34580 78 74 20 28 41 46 50 20 61 6e 64 20 64 6f 74 6c  xt (AFP and dotl
34590 6f 63 6b 20 6f 76 65 72 72 69 64 65 29 20 66 6f  ock override) fo
345a0 72 0a 20 20 20 20 2a 2a 20 70 72 6f 78 79 4c 6f  r.    ** proxyLo
345b0 63 6b 20 61 63 74 69 76 61 74 69 6f 6e 20 69 73  ck activation is
345c0 20 70 6f 73 73 69 62 6c 65 20 28 72 65 6d 6f 74   possible (remot
345d0 65 20 70 72 6f 78 79 20 69 73 20 62 61 73 65 64  e proxy is based
345e0 20 6f 6e 20 64 62 20 6e 61 6d 65 29 0a 20 20 20   on db name).   
345f0 20 2a 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 72 65   ** zFilename re
34600 6d 61 69 6e 73 20 76 61 6c 69 64 20 75 6e 74 69  mains valid unti
34610 6c 20 66 69 6c 65 20 69 73 20 63 6c 6f 73 65 64  l file is closed
34620 2c 20 74 6f 20 73 75 70 70 6f 72 74 20 2a 2f 0a  , to support */.
34630 20 20 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e      pNew->lockin
34640 67 43 6f 6e 74 65 78 74 20 3d 20 28 76 6f 69 64  gContext = (void
34650 2a 29 7a 46 69 6c 65 6e 61 6d 65 3b 0a 23 65 6e  *)zFilename;.#en
34660 64 69 66 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  dif.  }..  if( p
34670 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20  LockingStyle == 
34680 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 0a  &posixIoMethods.
34690 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50  #if defined(__AP
346a0 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45  PLE__) && SQLITE
346b0 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
346c0 53 54 59 4c 45 0a 20 20 20 20 7c 7c 20 70 4c 6f  STYLE.    || pLo
346d0 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26 6e  ckingStyle == &n
346e0 66 73 49 6f 4d 65 74 68 6f 64 73 0a 23 65 6e 64  fsIoMethods.#end
346f0 69 66 0a 20 20 20 20 20 2f 2a 20 73 75 70 70 6f  if.     /* suppo
34700 72 74 20 57 41 4c 20 6d 6f 64 65 20 6f 6e 20 72  rt WAL mode on r
34710 65 61 64 20 6f 6e 6c 79 20 6d 6f 75 6e 74 65 64  ead only mounted
34720 20 66 69 6c 65 73 79 73 74 65 6d 20 2a 2f 0a 20   filesystem */. 
34730 20 20 20 7c 7c 20 70 4c 6f 63 6b 69 6e 67 53 74     || pLockingSt
34740 79 6c 65 20 3d 3d 20 26 6e 6f 6c 6f 63 6b 49 6f  yle == &nolockIo
34750 4d 65 74 68 6f 64 73 20 0a 20 20 29 7b 0a 20 20  Methods .  ){.  
34760 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
34770 28 29 3b 0a 20 20 20 20 72 63 20 3d 20 66 69 6e  ();.    rc = fin
34780 64 49 6e 6f 64 65 49 6e 66 6f 28 70 4e 65 77 2c  dInodeInfo(pNew,
34790 20 26 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 29 3b   &pNew->pInode);
347a0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
347b0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
347c0 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  /* If an error o
347d0 63 63 75 72 72 65 64 20 69 6e 20 66 69 6e 64 49  ccurred in findI
347e0 6e 6f 64 65 49 6e 66 6f 28 29 2c 20 63 6c 6f 73  nodeInfo(), clos
347f0 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  e the file descr
34800 69 70 74 6f 72 0a 20 20 20 20 20 20 2a 2a 20 69  iptor.      ** i
34810 6d 6d 65 64 69 61 74 65 6c 79 2c 20 62 65 66 6f  mmediately, befo
34820 72 65 20 72 65 6c 65 61 73 69 6e 67 20 74 68 65  re releasing the
34830 20 6d 75 74 65 78 2e 20 66 69 6e 64 49 6e 6f 64   mutex. findInod
34840 65 49 6e 66 6f 28 29 20 6d 61 79 20 66 61 69 6c  eInfo() may fail
34850 0a 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 77 6f  .      ** in two
34860 20 73 63 65 6e 61 72 69 6f 73 3a 0a 20 20 20 20   scenarios:.    
34870 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20    **.      **   
34880 28 61 29 20 41 20 63 61 6c 6c 20 74 6f 20 66 73  (a) A call to fs
34890 74 61 74 28 29 20 66 61 69 6c 65 64 2e 0a 20 20  tat() failed..  
348a0 20 20 20 20 2a 2a 20 20 20 28 62 29 20 41 20 6d      **   (b) A m
348b0 61 6c 6c 6f 63 20 66 61 69 6c 65 64 2e 0a 20 20  alloc failed..  
348c0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
348d0 53 63 65 6e 61 72 69 6f 20 28 62 29 20 6d 61 79  Scenario (b) may
348e0 20 6f 6e 6c 79 20 6f 63 63 75 72 20 69 66 20 74   only occur if t
348f0 68 65 20 70 72 6f 63 65 73 73 20 69 73 20 68 6f  he process is ho
34900 6c 64 69 6e 67 20 6e 6f 20 6f 74 68 65 72 0a 20  lding no other. 
34910 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 64 65 73       ** file des
34920 63 72 69 70 74 6f 72 73 20 6f 70 65 6e 20 6f 6e  criptors open on
34930 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 2e 20   the same file. 
34940 49 66 20 74 68 65 72 65 20 77 65 72 65 20 6f 74  If there were ot
34950 68 65 72 20 66 69 6c 65 0a 20 20 20 20 20 20 2a  her file.      *
34960 2a 20 64 65 73 63 72 69 70 74 6f 72 73 20 6f 6e  * descriptors on
34970 20 74 68 69 73 20 66 69 6c 65 2c 20 74 68 65 6e   this file, then
34980 20 6e 6f 20 6d 61 6c 6c 6f 63 20 77 6f 75 6c 64   no malloc would
34990 20 62 65 20 72 65 71 75 69 72 65 64 20 62 79 0a   be required by.
349a0 20 20 20 20 20 20 2a 2a 20 66 69 6e 64 49 6e 6f        ** findIno
349b0 64 65 49 6e 66 6f 28 29 2e 20 49 66 20 74 68 69  deInfo(). If thi
349c0 73 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 69  s is the case, i
349d0 74 20 69 73 20 71 75 69 74 65 20 73 61 66 65 20  t is quite safe 
349e0 74 6f 20 63 6c 6f 73 65 0a 20 20 20 20 20 20 2a  to close.      *
349f0 2a 20 68 61 6e 64 6c 65 20 68 20 2d 20 61 73 20  * handle h - as 
34a00 69 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  it is guaranteed
34a10 20 74 68 61 74 20 6e 6f 20 70 6f 73 69 78 20 6c   that no posix l
34a20 6f 63 6b 73 20 77 69 6c 6c 20 62 65 20 72 65 6c  ocks will be rel
34a30 65 61 73 65 64 0a 20 20 20 20 20 20 2a 2a 20 62  eased.      ** b
34a40 79 20 64 6f 69 6e 67 20 73 6f 2e 0a 20 20 20 20  y doing so..    
34a50 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66    **.      ** If
34a60 20 73 63 65 6e 61 72 69 6f 20 28 61 29 20 63 61   scenario (a) ca
34a70 75 73 65 64 20 74 68 65 20 65 72 72 6f 72 20 74  used the error t
34a80 68 65 6e 20 74 68 69 6e 67 73 20 61 72 65 20 6e  hen things are n
34a90 6f 74 20 73 6f 20 73 61 66 65 2e 20 54 68 65 0a  ot so safe. The.
34aa0 20 20 20 20 20 20 2a 2a 20 69 6d 70 6c 69 63 69        ** implici
34ab0 74 20 61 73 73 75 6d 70 74 69 6f 6e 20 68 65 72  t assumption her
34ac0 65 20 69 73 20 74 68 61 74 20 69 66 20 66 73 74  e is that if fst
34ad0 61 74 28 29 20 66 61 69 6c 73 2c 20 74 68 69 6e  at() fails, thin
34ae0 67 73 20 61 72 65 20 69 6e 0a 20 20 20 20 20 20  gs are in.      
34af0 2a 2a 20 73 75 63 68 20 62 61 64 20 73 68 61 70  ** such bad shap
34b00 65 20 74 68 61 74 20 64 72 6f 70 70 69 6e 67 20  e that dropping 
34b10 61 20 6c 6f 63 6b 20 6f 72 20 74 77 6f 20 64 6f  a lock or two do
34b20 65 73 6e 27 74 20 6d 61 74 74 65 72 20 6d 75 63  esn't matter muc
34b30 68 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  h..      */.    
34b40 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70    robust_close(p
34b50 4e 65 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f  New, h, __LINE__
34b60 29 3b 0a 20 20 20 20 20 20 68 20 3d 20 2d 31 3b  );.      h = -1;
34b70 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e 69 78 4c  .    }.    unixL
34b80 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d  eaveMutex();.  }
34b90 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  ..#if SQLITE_ENA
34ba0 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
34bb0 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41  E && defined(__A
34bc0 50 50 4c 45 5f 5f 29 0a 20 20 65 6c 73 65 20 69  PPLE__).  else i
34bd0 66 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65  f( pLockingStyle
34be0 20 3d 3d 20 26 61 66 70 49 6f 4d 65 74 68 6f 64   == &afpIoMethod
34bf0 73 20 29 7b 0a 20 20 20 20 2f 2a 20 41 46 50 20  s ){.    /* AFP 
34c00 6c 6f 63 6b 69 6e 67 20 75 73 65 73 20 74 68 65  locking uses the
34c10 20 66 69 6c 65 20 70 61 74 68 20 73 6f 20 69 74   file path so it
34c20 20 6e 65 65 64 73 20 74 6f 20 62 65 20 69 6e 63   needs to be inc
34c30 6c 75 64 65 64 20 69 6e 0a 20 20 20 20 2a 2a 20  luded in.    ** 
34c40 74 68 65 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f  the afpLockingCo
34c50 6e 74 65 78 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  ntext..    */.  
34c60 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74    afpLockingCont
34c70 65 78 74 20 2a 70 43 74 78 3b 0a 20 20 20 20 70  ext *pCtx;.    p
34c80 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  New->lockingCont
34c90 65 78 74 20 3d 20 70 43 74 78 20 3d 20 73 71 6c  ext = pCtx = sql
34ca0 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a  ite3_malloc( siz
34cb0 65 6f 66 28 2a 70 43 74 78 29 20 29 3b 0a 20 20  eof(*pCtx) );.  
34cc0 20 20 69 66 28 20 70 43 74 78 3d 3d 30 20 29 7b    if( pCtx==0 ){
34cd0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
34ce0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65  TE_NOMEM;.    }e
34cf0 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 42  lse{.      /* NB
34d00 3a 20 7a 46 69 6c 65 6e 61 6d 65 20 65 78 69 73  : zFilename exis
34d10 74 73 20 61 6e 64 20 72 65 6d 61 69 6e 73 20 76  ts and remains v
34d20 61 6c 69 64 20 75 6e 74 69 6c 20 74 68 65 20 66  alid until the f
34d30 69 6c 65 20 69 73 20 63 6c 6f 73 65 64 0a 20 20  ile is closed.  
34d40 20 20 20 20 2a 2a 20 61 63 63 6f 72 64 69 6e 67      ** according
34d50 20 74 6f 20 72 65 71 75 69 72 65 6d 65 6e 74 20   to requirement 
34d60 46 31 31 31 34 31 2e 20 20 53 6f 20 77 65 20 64  F11141.  So we d
34d70 6f 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 6d 61  o not need to ma
34d80 6b 65 20 61 0a 20 20 20 20 20 20 2a 2a 20 63 6f  ke a.      ** co
34d90 70 79 20 6f 66 20 74 68 65 20 66 69 6c 65 6e 61  py of the filena
34da0 6d 65 2e 20 2a 2f 0a 20 20 20 20 20 20 70 43 74  me. */.      pCt
34db0 78 2d 3e 64 62 50 61 74 68 20 3d 20 7a 46 69 6c  x->dbPath = zFil
34dc0 65 6e 61 6d 65 3b 0a 20 20 20 20 20 20 70 43 74  ename;.      pCt
34dd0 78 2d 3e 72 65 73 65 72 76 65 64 20 3d 20 30 3b  x->reserved = 0;
34de0 0a 20 20 20 20 20 20 73 72 61 6e 64 6f 6d 64 65  .      srandomde
34df0 76 28 29 3b 0a 20 20 20 20 20 20 75 6e 69 78 45  v();.      unixE
34e00 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20  nterMutex();.   
34e10 20 20 20 72 63 20 3d 20 66 69 6e 64 49 6e 6f 64     rc = findInod
34e20 65 49 6e 66 6f 28 70 4e 65 77 2c 20 26 70 4e 65  eInfo(pNew, &pNe
34e30 77 2d 3e 70 49 6e 6f 64 65 29 3b 0a 20 20 20 20  w->pInode);.    
34e40 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
34e50 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73  _OK ){.        s
34e60 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77  qlite3_free(pNew
34e70 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
34e80 29 3b 0a 20 20 20 20 20 20 20 20 72 6f 62 75 73  );.        robus
34e90 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c 20 68 2c  t_close(pNew, h,
34ea0 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20   __LINE__);.    
34eb0 20 20 20 20 68 20 3d 20 2d 31 3b 0a 20 20 20 20      h = -1;.    
34ec0 20 20 7d 0a 20 20 20 20 20 20 75 6e 69 78 4c 65    }.      unixLe
34ed0 61 76 65 4d 75 74 65 78 28 29 3b 20 20 20 20 20  aveMutex();     
34ee0 20 20 20 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65     .    }.  }.#e
34ef0 6e 64 69 66 0a 0a 20 20 65 6c 73 65 20 69 66 28  ndif..  else if(
34f00 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d   pLockingStyle =
34f10 3d 20 26 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68  = &dotlockIoMeth
34f20 6f 64 73 20 29 7b 0a 20 20 20 20 2f 2a 20 44 6f  ods ){.    /* Do
34f30 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 75 73  tfile locking us
34f40 65 73 20 74 68 65 20 66 69 6c 65 20 70 61 74 68  es the file path
34f50 20 73 6f 20 69 74 20 6e 65 65 64 73 20 74 6f 20   so it needs to 
34f60 62 65 20 69 6e 63 6c 75 64 65 64 20 69 6e 0a 20  be included in. 
34f70 20 20 20 2a 2a 20 74 68 65 20 64 6f 74 6c 6f 63     ** the dotloc
34f80 6b 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  kLockingContext 
34f90 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 68 61 72  .    */.    char
34fa0 20 2a 7a 4c 6f 63 6b 46 69 6c 65 3b 0a 20 20 20   *zLockFile;.   
34fb0 20 69 6e 74 20 6e 46 69 6c 65 6e 61 6d 65 3b 0a   int nFilename;.
34fc0 20 20 20 20 61 73 73 65 72 74 28 20 7a 46 69 6c      assert( zFil
34fd0 65 6e 61 6d 65 21 3d 30 20 29 3b 0a 20 20 20 20  ename!=0 );.    
34fe0 6e 46 69 6c 65 6e 61 6d 65 20 3d 20 28 69 6e 74  nFilename = (int
34ff0 29 73 74 72 6c 65 6e 28 7a 46 69 6c 65 6e 61 6d  )strlen(zFilenam
35000 65 29 20 2b 20 36 3b 0a 20 20 20 20 7a 4c 6f 63  e) + 6;.    zLoc
35010 6b 46 69 6c 65 20 3d 20 28 63 68 61 72 20 2a 29  kFile = (char *)
35020 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e  sqlite3_malloc(n
35030 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 69  Filename);.    i
35040 66 28 20 7a 4c 6f 63 6b 46 69 6c 65 3d 3d 30 20  f( zLockFile==0 
35050 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
35060 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
35070 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
35080 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 46  ite3_snprintf(nF
35090 69 6c 65 6e 61 6d 65 2c 20 7a 4c 6f 63 6b 46 69  ilename, zLockFi
350a0 6c 65 2c 20 22 25 73 22 20 44 4f 54 4c 4f 43 4b  le, "%s" DOTLOCK
350b0 5f 53 55 46 46 49 58 2c 20 7a 46 69 6c 65 6e 61  _SUFFIX, zFilena
350c0 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  me);.    }.    p
350d0 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  New->lockingCont
350e0 65 78 74 20 3d 20 7a 4c 6f 63 6b 46 69 6c 65 3b  ext = zLockFile;
350f0 0a 20 20 7d 0a 0a 23 69 66 20 4f 53 5f 56 58 57  .  }..#if OS_VXW
35100 4f 52 4b 53 0a 20 20 65 6c 73 65 20 69 66 28 20  ORKS.  else if( 
35110 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d  pLockingStyle ==
35120 20 26 73 65 6d 49 6f 4d 65 74 68 6f 64 73 20 29   &semIoMethods )
35130 7b 0a 20 20 20 20 2f 2a 20 4e 61 6d 65 64 20 73  {.    /* Named s
35140 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67  emaphore locking
35150 20 75 73 65 73 20 74 68 65 20 66 69 6c 65 20 70   uses the file p
35160 61 74 68 20 73 6f 20 69 74 20 6e 65 65 64 73 20  ath so it needs 
35170 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20 69 6e 63  to be.    ** inc
35180 6c 75 64 65 64 20 69 6e 20 74 68 65 20 73 65 6d  luded in the sem
35190 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 0a 20  LockingContext. 
351a0 20 20 20 2a 2f 0a 20 20 20 20 75 6e 69 78 45 6e     */.    unixEn
351b0 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20  terMutex();.    
351c0 72 63 20 3d 20 66 69 6e 64 49 6e 6f 64 65 49 6e  rc = findInodeIn
351d0 66 6f 28 70 4e 65 77 2c 20 26 70 4e 65 77 2d 3e  fo(pNew, &pNew->
351e0 70 49 6e 6f 64 65 29 3b 0a 20 20 20 20 69 66 28  pInode);.    if(
351f0 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29   (rc==SQLITE_OK)
35200 20 26 26 20 28 70 4e 65 77 2d 3e 70 49 6e 6f 64   && (pNew->pInod
35210 65 2d 3e 70 53 65 6d 3d 3d 4e 55 4c 4c 29 20 29  e->pSem==NULL) )
35220 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 53  {.      char *zS
35230 65 6d 4e 61 6d 65 20 3d 20 70 4e 65 77 2d 3e 70  emName = pNew->p
35240 49 6e 6f 64 65 2d 3e 61 53 65 6d 4e 61 6d 65 3b  Inode->aSemName;
35250 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20  .      int n;.  
35260 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
35270 69 6e 74 66 28 4d 41 58 5f 50 41 54 48 4e 41 4d  intf(MAX_PATHNAM
35280 45 2c 20 7a 53 65 6d 4e 61 6d 65 2c 20 22 2f 25  E, zSemName, "/%
35290 73 2e 73 65 6d 22 2c 0a 20 20 20 20 20 20 20 20  s.sem",.        
352a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
352b0 4e 65 77 2d 3e 70 49 64 2d 3e 7a 43 61 6e 6f 6e  New->pId->zCanon
352c0 69 63 61 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 20  icalName);.     
352d0 20 66 6f 72 28 20 6e 3d 31 3b 20 7a 53 65 6d 4e   for( n=1; zSemN
352e0 61 6d 65 5b 6e 5d 3b 20 6e 2b 2b 20 29 0a 20 20  ame[n]; n++ ).  
352f0 20 20 20 20 20 20 69 66 28 20 7a 53 65 6d 4e 61        if( zSemNa
35300 6d 65 5b 6e 5d 3d 3d 27 2f 27 20 29 20 7a 53 65  me[n]=='/' ) zSe
35310 6d 4e 61 6d 65 5b 6e 5d 20 3d 20 27 5f 27 3b 0a  mName[n] = '_';.
35320 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 49 6e 6f        pNew->pIno
35330 64 65 2d 3e 70 53 65 6d 20 3d 20 73 65 6d 5f 6f  de->pSem = sem_o
35340 70 65 6e 28 7a 53 65 6d 4e 61 6d 65 2c 20 4f 5f  pen(zSemName, O_
35350 43 52 45 41 54 2c 20 30 36 36 36 2c 20 31 29 3b  CREAT, 0666, 1);
35360 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 2d  .      if( pNew-
35370 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 20 3d 3d  >pInode->pSem ==
35380 20 53 45 4d 5f 46 41 49 4c 45 44 20 29 7b 0a 20   SEM_FAILED ){. 
35390 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
353a0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
353b0 20 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e    pNew->pInode->
353c0 61 53 65 6d 4e 61 6d 65 5b 30 5d 20 3d 20 27 5c  aSemName[0] = '\
353d0 30 27 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0';.      }.    
353e0 7d 0a 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d  }.    unixLeaveM
353f0 75 74 65 78 28 29 3b 0a 20 20 7d 0a 23 65 6e 64  utex();.  }.#end
35400 69 66 0a 20 20 0a 20 20 70 4e 65 77 2d 3e 6c 61  if.  .  pNew->la
35410 73 74 45 72 72 6e 6f 20 3d 20 30 3b 0a 23 69 66  stErrno = 0;.#if
35420 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 69 66   OS_VXWORKS.  if
35430 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
35440 29 7b 0a 20 20 20 20 69 66 28 20 68 3e 3d 30 20  ){.    if( h>=0 
35450 29 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70  ) robust_close(p
35460 4e 65 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f  New, h, __LINE__
35470 29 3b 0a 20 20 20 20 68 20 3d 20 2d 31 3b 0a 20  );.    h = -1;. 
35480 20 20 20 6f 73 55 6e 6c 69 6e 6b 28 7a 46 69 6c     osUnlink(zFil
35490 65 6e 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77  ename);.    pNew
354a0 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55  ->ctrlFlags |= U
354b0 4e 49 58 46 49 4c 45 5f 44 45 4c 45 54 45 3b 0a  NIXFILE_DELETE;.
354c0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28    }.#endif.  if(
354d0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
354e0 7b 0a 20 20 20 20 69 66 28 20 68 3e 3d 30 20 29  {.    if( h>=0 )
354f0 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 4e   robust_close(pN
35500 65 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29  ew, h, __LINE__)
35510 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
35520 4e 65 77 2d 3e 70 4d 65 74 68 6f 64 20 3d 20 70  New->pMethod = p
35530 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 3b 0a 20 20  LockingStyle;.  
35540 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2b 31    OpenCounter(+1
35550 29 3b 0a 20 20 20 20 76 65 72 69 66 79 44 62 46  );.    verifyDbF
35560 69 6c 65 28 70 4e 65 77 29 3b 0a 20 20 7d 0a 20  ile(pNew);.  }. 
35570 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
35580 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
35590 6e 61 6d 65 20 6f 66 20 61 20 64 69 72 65 63 74  name of a direct
355a0 6f 72 79 20 69 6e 20 77 68 69 63 68 20 74 6f 20  ory in which to 
355b0 70 75 74 20 74 65 6d 70 6f 72 61 72 79 20 66 69  put temporary fi
355c0 6c 65 73 2e 0a 2a 2a 20 49 66 20 6e 6f 20 73 75  les..** If no su
355d0 69 74 61 62 6c 65 20 74 65 6d 70 6f 72 61 72 79  itable temporary
355e0 20 66 69 6c 65 20 64 69 72 65 63 74 6f 72 79 20   file directory 
355f0 63 61 6e 20 62 65 20 66 6f 75 6e 64 2c 20 72 65  can be found, re
35600 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74  turn NULL..*/.st
35610 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
35620 2a 75 6e 69 78 54 65 6d 70 46 69 6c 65 44 69 72  *unixTempFileDir
35630 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63  (void){.  static
35640 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 44   const char *azD
35650 69 72 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 30  irs[] = {.     0
35660 2c 0a 20 20 20 20 20 30 2c 0a 20 20 20 20 20 30  ,.     0,.     0
35670 2c 0a 20 20 20 20 20 22 2f 76 61 72 2f 74 6d 70  ,.     "/var/tmp
35680 22 2c 0a 20 20 20 20 20 22 2f 75 73 72 2f 74 6d  ",.     "/usr/tm
35690 70 22 2c 0a 20 20 20 20 20 22 2f 74 6d 70 22 2c  p",.     "/tmp",
356a0 0a 20 20 20 20 20 30 20 20 20 20 20 20 20 20 2f  .     0        /
356b0 2a 20 4c 69 73 74 20 74 65 72 6d 69 6e 61 74 6f  * List terminato
356c0 72 20 2a 2f 0a 20 20 7d 3b 0a 20 20 75 6e 73 69  r */.  };.  unsi
356d0 67 6e 65 64 20 69 6e 74 20 69 3b 0a 20 20 73 74  gned int i;.  st
356e0 72 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20  ruct stat buf;. 
356f0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 69   const char *zDi
35700 72 20 3d 20 30 3b 0a 0a 20 20 61 7a 44 69 72 73  r = 0;..  azDirs
35710 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 5f 74 65  [0] = sqlite3_te
35720 6d 70 5f 64 69 72 65 63 74 6f 72 79 3b 0a 20 20  mp_directory;.  
35730 69 66 28 20 21 61 7a 44 69 72 73 5b 31 5d 20 29  if( !azDirs[1] )
35740 20 61 7a 44 69 72 73 5b 31 5d 20 3d 20 67 65 74   azDirs[1] = get
35750 65 6e 76 28 22 53 51 4c 49 54 45 5f 54 4d 50 44  env("SQLITE_TMPD
35760 49 52 22 29 3b 0a 20 20 69 66 28 20 21 61 7a 44  IR");.  if( !azD
35770 69 72 73 5b 32 5d 20 29 20 61 7a 44 69 72 73 5b  irs[2] ) azDirs[
35780 32 5d 20 3d 20 67 65 74 65 6e 76 28 22 54 4d 50  2] = getenv("TMP
35790 44 49 52 22 29 3b 0a 20 20 66 6f 72 28 69 3d 30  DIR");.  for(i=0
357a0 3b 20 69 3c 73 69 7a 65 6f 66 28 61 7a 44 69 72  ; i<sizeof(azDir
357b0 73 29 2f 73 69 7a 65 6f 66 28 61 7a 44 69 72 73  s)/sizeof(azDirs
357c0 5b 30 5d 29 3b 20 7a 44 69 72 3d 61 7a 44 69 72  [0]); zDir=azDir
357d0 73 5b 69 2b 2b 5d 29 7b 0a 20 20 20 20 69 66 28  s[i++]){.    if(
357e0 20 7a 44 69 72 3d 3d 30 20 29 20 63 6f 6e 74 69   zDir==0 ) conti
357f0 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 6f 73 53  nue;.    if( osS
35800 74 61 74 28 7a 44 69 72 2c 20 26 62 75 66 29 20  tat(zDir, &buf) 
35810 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
35820 69 66 28 20 21 53 5f 49 53 44 49 52 28 62 75 66  if( !S_ISDIR(buf
35830 2e 73 74 5f 6d 6f 64 65 29 20 29 20 63 6f 6e 74  .st_mode) ) cont
35840 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 6f 73  inue;.    if( os
35850 41 63 63 65 73 73 28 7a 44 69 72 2c 20 30 37 29  Access(zDir, 07)
35860 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
35870 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65   break;.  }.  re
35880 74 75 72 6e 20 7a 44 69 72 3b 0a 7d 0a 0a 2f 2a  turn zDir;.}../*
35890 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 74 65 6d  .** Create a tem
358a0 70 6f 72 61 72 79 20 66 69 6c 65 20 6e 61 6d 65  porary file name
358b0 20 69 6e 20 7a 42 75 66 2e 20 20 7a 42 75 66 20   in zBuf.  zBuf 
358c0 6d 75 73 74 20 62 65 20 61 6c 6c 6f 63 61 74 65  must be allocate
358d0 64 0a 2a 2a 20 62 79 20 74 68 65 20 63 61 6c 6c  d.** by the call
358e0 69 6e 67 20 70 72 6f 63 65 73 73 20 61 6e 64 20  ing process and 
358f0 6d 75 73 74 20 62 65 20 62 69 67 20 65 6e 6f 75  must be big enou
35900 67 68 20 74 6f 20 68 6f 6c 64 20 61 74 20 6c 65  gh to hold at le
35910 61 73 74 0a 2a 2a 20 70 56 66 73 2d 3e 6d 78 50  ast.** pVfs->mxP
35920 61 74 68 6e 61 6d 65 20 62 79 74 65 73 2e 0a 2a  athname bytes..*
35930 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
35940 78 47 65 74 54 65 6d 70 6e 61 6d 65 28 69 6e 74  xGetTempname(int
35950 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75   nBuf, char *zBu
35960 66 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  f){.  static con
35970 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
35980 20 7a 43 68 61 72 73 5b 5d 20 3d 0a 20 20 20 20   zChars[] =.    
35990 22 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f  "abcdefghijklmno
359a0 70 71 72 73 74 75 76 77 78 79 7a 22 0a 20 20 20  pqrstuvwxyz".   
359b0 20 22 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e   "ABCDEFGHIJKLMN
359c0 4f 50 51 52 53 54 55 56 57 58 59 5a 22 0a 20 20  OPQRSTUVWXYZ".  
359d0 20 20 22 30 31 32 33 34 35 36 37 38 39 22 3b 0a    "0123456789";.
359e0 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69    unsigned int i
359f0 2c 20 6a 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  , j;.  const cha
35a00 72 20 2a 7a 44 69 72 3b 0a 0a 20 20 2f 2a 20 49  r *zDir;..  /* I
35a10 74 27 73 20 6f 64 64 20 74 6f 20 73 69 6d 75 6c  t's odd to simul
35a20 61 74 65 20 61 6e 20 69 6f 2d 65 72 72 6f 72 20  ate an io-error 
35a30 68 65 72 65 2c 20 62 75 74 20 72 65 61 6c 6c 79  here, but really
35a40 20 74 68 69 73 20 69 73 20 6a 75 73 74 0a 20 20   this is just.  
35a50 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 69 6f 2d  ** using the io-
35a60 65 72 72 6f 72 20 69 6e 66 72 61 73 74 72 75 63  error infrastruc
35a70 74 75 72 65 20 74 6f 20 74 65 73 74 20 74 68 61  ture to test tha
35a80 74 20 53 51 4c 69 74 65 20 68 61 6e 64 6c 65 73  t SQLite handles
35a90 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74   this.  ** funct
35aa0 69 6f 6e 20 66 61 69 6c 69 6e 67 2e 20 0a 20 20  ion failing. .  
35ab0 2a 2f 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  */.  SimulateIOE
35ac0 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c  rror( return SQL
35ad0 49 54 45 5f 49 4f 45 52 52 20 29 3b 0a 0a 20 20  ITE_IOERR );..  
35ae0 7a 44 69 72 20 3d 20 75 6e 69 78 54 65 6d 70 46  zDir = unixTempF
35af0 69 6c 65 44 69 72 28 29 3b 0a 20 20 69 66 28 20  ileDir();.  if( 
35b00 7a 44 69 72 3d 3d 30 20 29 20 7a 44 69 72 20 3d  zDir==0 ) zDir =
35b10 20 22 2e 22 3b 0a 0a 20 20 2f 2a 20 43 68 65 63   ".";..  /* Chec
35b20 6b 20 74 68 61 74 20 74 68 65 20 6f 75 74 70 75  k that the outpu
35b30 74 20 62 75 66 66 65 72 20 69 73 20 6c 61 72 67  t buffer is larg
35b40 65 20 65 6e 6f 75 67 68 20 66 6f 72 20 74 68 65  e enough for the
35b50 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
35b60 0a 20 20 2a 2a 20 6e 61 6d 65 2e 20 49 66 20 69  .  ** name. If i
35b70 74 20 69 73 20 6e 6f 74 2c 20 72 65 74 75 72 6e  t is not, return
35b80 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 20   SQLITE_ERROR.. 
35b90 20 2a 2f 0a 20 20 69 66 28 20 28 73 74 72 6c 65   */.  if( (strle
35ba0 6e 28 7a 44 69 72 29 20 2b 20 73 74 72 6c 65 6e  n(zDir) + strlen
35bb0 28 53 51 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c  (SQLITE_TEMP_FIL
35bc0 45 5f 50 52 45 46 49 58 29 20 2b 20 31 38 29 20  E_PREFIX) + 18) 
35bd0 3e 3d 20 28 73 69 7a 65 5f 74 29 6e 42 75 66 20  >= (size_t)nBuf 
35be0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
35bf0 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
35c00 0a 20 20 64 6f 7b 0a 20 20 20 20 73 71 6c 69 74  .  do{.    sqlit
35c10 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75 66  e3_snprintf(nBuf
35c20 2d 31 38 2c 20 7a 42 75 66 2c 20 22 25 73 2f 22  -18, zBuf, "%s/"
35c30 53 51 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45  SQLITE_TEMP_FILE
35c40 5f 50 52 45 46 49 58 2c 20 7a 44 69 72 29 3b 0a  _PREFIX, zDir);.
35c50 20 20 20 20 6a 20 3d 20 28 69 6e 74 29 73 74 72      j = (int)str
35c60 6c 65 6e 28 7a 42 75 66 29 3b 0a 20 20 20 20 73  len(zBuf);.    s
35c70 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73  qlite3_randomnes
35c80 73 28 31 35 2c 20 26 7a 42 75 66 5b 6a 5d 29 3b  s(15, &zBuf[j]);
35c90 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
35ca0 31 35 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20  15; i++, j++){. 
35cb0 20 20 20 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 28       zBuf[j] = (
35cc0 63 68 61 72 29 7a 43 68 61 72 73 5b 20 28 28 75  char)zChars[ ((u
35cd0 6e 73 69 67 6e 65 64 20 63 68 61 72 29 7a 42 75  nsigned char)zBu
35ce0 66 5b 6a 5d 29 25 28 73 69 7a 65 6f 66 28 7a 43  f[j])%(sizeof(zC
35cf0 68 61 72 73 29 2d 31 29 20 5d 3b 0a 20 20 20 20  hars)-1) ];.    
35d00 7d 0a 20 20 20 20 7a 42 75 66 5b 6a 5d 20 3d 20  }.    zBuf[j] = 
35d10 30 3b 0a 20 20 20 20 7a 42 75 66 5b 6a 2b 31 5d  0;.    zBuf[j+1]
35d20 20 3d 20 30 3b 0a 20 20 7d 77 68 69 6c 65 28 20   = 0;.  }while( 
35d30 6f 73 41 63 63 65 73 73 28 7a 42 75 66 2c 30 29  osAccess(zBuf,0)
35d40 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ==0 );.  return 
35d50 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69  SQLITE_OK;.}..#i
35d60 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
35d70 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26  LOCKING_STYLE &&
35d80 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
35d90 5f 5f 29 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e  __)./*.** Routin
35da0 65 20 74 6f 20 74 72 61 6e 73 66 6f 72 6d 20 61  e to transform a
35db0 20 75 6e 69 78 46 69 6c 65 20 69 6e 74 6f 20 61   unixFile into a
35dc0 20 70 72 6f 78 79 2d 6c 6f 63 6b 69 6e 67 20 75   proxy-locking u
35dd0 6e 69 78 46 69 6c 65 2e 0a 2a 2a 20 49 6d 70 6c  nixFile..** Impl
35de0 65 6d 65 6e 74 61 74 69 6f 6e 20 69 6e 20 74 68  ementation in th
35df0 65 20 70 72 6f 78 79 2d 6c 6f 63 6b 20 64 69 76  e proxy-lock div
35e00 69 73 69 6f 6e 2c 20 62 75 74 20 75 73 65 64 20  ision, but used 
35e10 62 79 20 75 6e 69 78 4f 70 65 6e 28 29 0a 2a 2a  by unixOpen().**
35e20 20 69 66 20 53 51 4c 49 54 45 5f 50 52 45 46 45   if SQLITE_PREFE
35e30 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 20  R_PROXY_LOCKING 
35e40 69 73 20 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73  is defined..*/.s
35e50 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 54  tatic int proxyT
35e60 72 61 6e 73 66 6f 72 6d 55 6e 69 78 46 69 6c 65  ransformUnixFile
35e70 28 75 6e 69 78 46 69 6c 65 2a 2c 20 63 6f 6e 73  (unixFile*, cons
35e80 74 20 63 68 61 72 2a 29 3b 0a 23 65 6e 64 69 66  t char*);.#endif
35e90 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20 66  ../*.** Search f
35ea0 6f 72 20 61 6e 20 75 6e 75 73 65 64 20 66 69 6c  or an unused fil
35eb0 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 68 61  e descriptor tha
35ec0 74 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20  t was opened on 
35ed0 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a  the database .**
35ee0 20 66 69 6c 65 20 28 6e 6f 74 20 61 20 6a 6f 75   file (not a jou
35ef0 72 6e 61 6c 20 6f 72 20 6d 61 73 74 65 72 2d 6a  rnal or master-j
35f00 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 69 64 65  ournal file) ide
35f10 6e 74 69 66 69 65 64 20 62 79 20 70 61 74 68 6e  ntified by pathn
35f20 61 6d 65 0a 2a 2a 20 7a 50 61 74 68 20 77 69 74  ame.** zPath wit
35f30 68 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 58 58  h SQLITE_OPEN_XX
35f40 58 20 66 6c 61 67 73 20 6d 61 74 63 68 69 6e 67  X flags matching
35f50 20 74 68 6f 73 65 20 70 61 73 73 65 64 20 61 73   those passed as
35f60 20 74 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 61   the second.** a
35f70 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20  rgument to this 
35f80 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  function..**.** 
35f90 53 75 63 68 20 61 20 66 69 6c 65 20 64 65 73 63  Such a file desc
35fa0 72 69 70 74 6f 72 20 6d 61 79 20 65 78 69 73 74  riptor may exist
35fb0 20 69 66 20 61 20 64 61 74 61 62 61 73 65 20 63   if a database c
35fc0 6f 6e 6e 65 63 74 69 6f 6e 20 77 61 73 20 63 6c  onnection was cl
35fd0 6f 73 65 64 0a 2a 2a 20 62 75 74 20 74 68 65 20  osed.** but the 
35fe0 61 73 73 6f 63 69 61 74 65 64 20 66 69 6c 65 20  associated file 
35ff0 64 65 73 63 72 69 70 74 6f 72 20 63 6f 75 6c 64  descriptor could
36000 20 6e 6f 74 20 62 65 20 63 6c 6f 73 65 64 20 62   not be closed b
36010 65 63 61 75 73 65 20 73 6f 6d 65 0a 2a 2a 20 6f  ecause some.** o
36020 74 68 65 72 20 66 69 6c 65 20 64 65 73 63 72 69  ther file descri
36030 70 74 6f 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65  ptor open on the
36040 20 73 61 6d 65 20 66 69 6c 65 20 69 73 20 68 6f   same file is ho
36050 6c 64 69 6e 67 20 61 20 66 69 6c 65 2d 6c 6f 63  lding a file-loc
36060 6b 2e 0a 2a 2a 20 52 65 66 65 72 20 74 6f 20 63  k..** Refer to c
36070 6f 6d 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 75  omments in the u
36080 6e 69 78 43 6c 6f 73 65 28 29 20 66 75 6e 63 74  nixClose() funct
36090 69 6f 6e 20 61 6e 64 20 74 68 65 20 6c 65 6e 67  ion and the leng
360a0 74 68 79 20 63 6f 6d 6d 65 6e 74 0a 2a 2a 20 64  thy comment.** d
360b0 65 73 63 72 69 62 69 6e 67 20 22 50 6f 73 69 78  escribing "Posix
360c0 20 41 64 76 69 73 6f 72 79 20 4c 6f 63 6b 69 6e   Advisory Lockin
360d0 67 22 20 61 74 20 74 68 65 20 73 74 61 72 74 20  g" at the start 
360e0 6f 66 20 74 68 69 73 20 66 69 6c 65 20 66 6f 72  of this file for
360f0 20 0a 2a 2a 20 66 75 72 74 68 65 72 20 64 65 74   .** further det
36100 61 69 6c 73 2e 20 41 6c 73 6f 2c 20 74 69 63 6b  ails. Also, tick
36110 65 74 20 23 34 30 31 38 2e 0a 2a 2a 0a 2a 2a 20  et #4018..**.** 
36120 49 66 20 61 20 73 75 69 74 61 62 6c 65 20 66 69  If a suitable fi
36130 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73  le descriptor is
36140 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20 69 74 20   found, then it 
36150 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  is returned. If 
36160 6e 6f 0a 2a 2a 20 73 75 63 68 20 66 69 6c 65 20  no.** such file 
36170 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 6c 6f  descriptor is lo
36180 63 61 74 65 64 2c 20 2d 31 20 69 73 20 72 65 74  cated, -1 is ret
36190 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
361a0 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 66   UnixUnusedFd *f
361b0 69 6e 64 52 65 75 73 61 62 6c 65 46 64 28 63 6f  indReusableFd(co
361c0 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c  nst char *zPath,
361d0 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 55   int flags){.  U
361e0 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70 55 6e  nixUnusedFd *pUn
361f0 75 73 65 64 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  used = 0;..  /* 
36200 44 6f 20 6e 6f 74 20 73 65 61 72 63 68 20 66 6f  Do not search fo
36210 72 20 61 6e 20 75 6e 75 73 65 64 20 66 69 6c 65  r an unused file
36220 20 64 65 73 63 72 69 70 74 6f 72 20 6f 6e 20 76   descriptor on v
36230 78 77 6f 72 6b 73 2e 20 4e 6f 74 20 62 65 63 61  xworks. Not beca
36240 75 73 65 0a 20 20 2a 2a 20 76 78 77 6f 72 6b 73  use.  ** vxworks
36250 20 77 6f 75 6c 64 20 6e 6f 74 20 62 65 6e 65 66   would not benef
36260 69 74 20 66 72 6f 6d 20 74 68 65 20 63 68 61 6e  it from the chan
36270 67 65 20 28 69 74 20 6d 69 67 68 74 2c 20 77 65  ge (it might, we
36280 27 72 65 20 6e 6f 74 20 73 75 72 65 29 2c 0a 20  're not sure),. 
36290 20 2a 2a 20 62 75 74 20 62 65 63 61 75 73 65 20   ** but because 
362a0 6e 6f 20 77 61 79 20 74 6f 20 74 65 73 74 20 69  no way to test i
362b0 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 61  t is currently a
362c0 76 61 69 6c 61 62 6c 65 2e 20 49 74 20 69 73 20  vailable. It is 
362d0 62 65 74 74 65 72 20 0a 20 20 2a 2a 20 6e 6f 74  better .  ** not
362e0 20 74 6f 20 72 69 73 6b 20 62 72 65 61 6b 69 6e   to risk breakin
362f0 67 20 76 78 77 6f 72 6b 73 20 73 75 70 70 6f 72  g vxworks suppor
36300 74 20 66 6f 72 20 74 68 65 20 73 61 6b 65 20 6f  t for the sake o
36310 66 20 73 75 63 68 20 61 6e 20 6f 62 73 63 75 72  f such an obscur
36320 65 20 0a 20 20 2a 2a 20 66 65 61 74 75 72 65 2e  e .  ** feature.
36330 20 20 2a 2f 0a 23 69 66 20 21 4f 53 5f 56 58 57    */.#if !OS_VXW
36340 4f 52 4b 53 0a 20 20 73 74 72 75 63 74 20 73 74  ORKS.  struct st
36350 61 74 20 73 53 74 61 74 3b 20 20 20 20 20 20 20  at sStat;       
36360 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
36370 65 73 75 6c 74 73 20 6f 66 20 73 74 61 74 28 29  esults of stat()
36380 20 63 61 6c 6c 20 2a 2f 0a 0a 20 20 2f 2a 20 41   call */..  /* A
36390 20 73 74 61 74 28 29 20 63 61 6c 6c 20 6d 61 79   stat() call may
363a0 20 66 61 69 6c 20 66 6f 72 20 76 61 72 69 6f 75   fail for variou
363b0 73 20 72 65 61 73 6f 6e 73 2e 20 49 66 20 74 68  s reasons. If th
363c0 69 73 20 68 61 70 70 65 6e 73 2c 20 69 74 20 69  is happens, it i
363d0 73 0a 20 20 2a 2a 20 61 6c 6d 6f 73 74 20 63 65  s.  ** almost ce
363e0 72 74 61 69 6e 20 74 68 61 74 20 61 6e 20 6f 70  rtain that an op
363f0 65 6e 28 29 20 63 61 6c 6c 20 6f 6e 20 74 68 65  en() call on the
36400 20 73 61 6d 65 20 70 61 74 68 20 77 69 6c 6c 20   same path will 
36410 61 6c 73 6f 20 66 61 69 6c 2e 0a 20 20 2a 2a 20  also fail..  ** 
36420 46 6f 72 20 74 68 69 73 20 72 65 61 73 6f 6e 2c  For this reason,
36430 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   if an error occ
36440 75 72 73 20 69 6e 20 74 68 65 20 73 74 61 74 28  urs in the stat(
36450 29 20 63 61 6c 6c 20 68 65 72 65 2c 20 69 74 20  ) call here, it 
36460 69 73 0a 20 20 2a 2a 20 69 67 6e 6f 72 65 64 20  is.  ** ignored 
36470 61 6e 64 20 2d 31 20 69 73 20 72 65 74 75 72 6e  and -1 is return
36480 65 64 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77  ed. The caller w
36490 69 6c 6c 20 74 72 79 20 74 6f 20 6f 70 65 6e 20  ill try to open 
364a0 61 20 6e 65 77 20 66 69 6c 65 0a 20 20 2a 2a 20  a new file.  ** 
364b0 64 65 73 63 72 69 70 74 6f 72 20 6f 6e 20 74 68  descriptor on th
364c0 65 20 73 61 6d 65 20 70 61 74 68 2c 20 66 61 69  e same path, fai
364d0 6c 2c 20 61 6e 64 20 72 65 74 75 72 6e 20 61 6e  l, and return an
364e0 20 65 72 72 6f 72 20 74 6f 20 53 51 4c 69 74 65   error to SQLite
364f0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 76 65 6e  ..  **.  ** Even
36500 20 69 66 20 61 20 73 75 62 73 65 71 75 65 6e 74   if a subsequent
36510 20 6f 70 65 6e 28 29 20 63 61 6c 6c 20 64 6f 65   open() call doe
36520 73 20 73 75 63 63 65 65 64 2c 20 74 68 65 20 63  s succeed, the c
36530 6f 6e 73 65 71 75 65 6e 63 65 73 20 6f 66 0a 20  onsequences of. 
36540 20 2a 2a 20 6e 6f 74 20 73 65 61 72 63 68 69 6e   ** not searchin
36550 67 20 66 6f 72 20 61 20 72 65 75 73 61 62 6c 65  g for a reusable
36560 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
36570 20 61 72 65 20 6e 6f 74 20 64 69 72 65 2e 20 20   are not dire.  
36580 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 6f 73 53 74  */.  if( 0==osSt
36590 61 74 28 7a 50 61 74 68 2c 20 26 73 53 74 61 74  at(zPath, &sStat
365a0 29 20 29 7b 0a 20 20 20 20 75 6e 69 78 49 6e 6f  ) ){.    unixIno
365b0 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a  deInfo *pInode;.
365c0 0a 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75  .    unixEnterMu
365d0 74 65 78 28 29 3b 0a 20 20 20 20 70 49 6e 6f 64  tex();.    pInod
365e0 65 20 3d 20 69 6e 6f 64 65 4c 69 73 74 3b 0a 20  e = inodeList;. 
365f0 20 20 20 77 68 69 6c 65 28 20 70 49 6e 6f 64 65     while( pInode
36600 20 26 26 20 28 70 49 6e 6f 64 65 2d 3e 66 69 6c   && (pInode->fil
36610 65 49 64 2e 64 65 76 21 3d 73 53 74 61 74 2e 73  eId.dev!=sStat.s
36620 74 5f 64 65 76 0a 20 20 20 20 20 20 20 20 20 20  t_dev.          
36630 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 49             || pI
36640 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2e 69 6e 6f  node->fileId.ino
36650 21 3d 73 53 74 61 74 2e 73 74 5f 69 6e 6f 29 20  !=sStat.st_ino) 
36660 29 7b 0a 20 20 20 20 20 20 20 70 49 6e 6f 64 65  ){.       pInode
36670 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74   = pInode->pNext
36680 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
36690 70 49 6e 6f 64 65 20 29 7b 0a 20 20 20 20 20 20  pInode ){.      
366a0 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 2a 70  UnixUnusedFd **p
366b0 70 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 70 3d  p;.      for(pp=
366c0 26 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64  &pInode->pUnused
366d0 3b 20 2a 70 70 20 26 26 20 28 2a 70 70 29 2d 3e  ; *pp && (*pp)->
366e0 66 6c 61 67 73 21 3d 66 6c 61 67 73 3b 20 70 70  flags!=flags; pp
366f0 3d 26 28 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29  =&((*pp)->pNext)
36700 29 3b 0a 20 20 20 20 20 20 70 55 6e 75 73 65 64  );.      pUnused
36710 20 3d 20 2a 70 70 3b 0a 20 20 20 20 20 20 69 66   = *pp;.      if
36720 28 20 70 55 6e 75 73 65 64 20 29 7b 0a 20 20 20  ( pUnused ){.   
36730 20 20 20 20 20 2a 70 70 20 3d 20 70 55 6e 75 73       *pp = pUnus
36740 65 64 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  ed->pNext;.     
36750 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e 69   }.    }.    uni
36760 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20  xLeaveMutex();. 
36770 20 7d 0a 23 65 6e 64 69 66 20 20 20 20 2f 2a 20   }.#endif    /* 
36780 69 66 20 21 4f 53 5f 56 58 57 4f 52 4b 53 20 2a  if !OS_VXWORKS *
36790 2f 0a 20 20 72 65 74 75 72 6e 20 70 55 6e 75 73  /.  return pUnus
367a0 65 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ed;.}../*.** Thi
367b0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
367c0 6c 6c 65 64 20 62 79 20 75 6e 69 78 4f 70 65 6e  lled by unixOpen
367d0 28 29 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  () to determine 
367e0 74 68 65 20 75 6e 69 78 20 70 65 72 6d 69 73 73  the unix permiss
367f0 69 6f 6e 73 0a 2a 2a 20 74 6f 20 63 72 65 61 74  ions.** to creat
36800 65 20 6e 65 77 20 66 69 6c 65 73 20 77 69 74 68  e new files with
36810 2e 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63  . If no error oc
36820 63 75 72 73 2c 20 74 68 65 6e 20 53 51 4c 49 54  curs, then SQLIT
36830 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
36840 0a 2a 2a 20 61 6e 64 20 61 20 76 61 6c 75 65 20  .** and a value 
36850 73 75 69 74 61 62 6c 65 20 66 6f 72 20 70 61 73  suitable for pas
36860 73 69 6e 67 20 61 73 20 74 68 65 20 74 68 69 72  sing as the thir
36870 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 6f 70  d argument to op
36880 65 6e 28 32 29 20 69 73 0a 2a 2a 20 77 72 69 74  en(2) is.** writ
36890 74 65 6e 20 74 6f 20 2a 70 4d 6f 64 65 2e 20 49  ten to *pMode. I
368a0 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63  f an IO error oc
368b0 63 75 72 73 2c 20 61 6e 20 53 51 4c 69 74 65 20  curs, an SQLite 
368c0 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 0a 2a  error code is .*
368d0 2a 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74  * returned and t
368e0 68 65 20 76 61 6c 75 65 20 6f 66 20 2a 70 4d 6f  he value of *pMo
368f0 64 65 20 69 73 20 6e 6f 74 20 6d 6f 64 69 66 69  de is not modifi
36900 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6d 6f 73  ed..**.** In mos
36910 74 20 63 61 73 65 73 2c 20 74 68 69 73 20 72 6f  t cases, this ro
36920 75 74 69 6e 65 20 73 65 74 73 20 2a 70 4d 6f 64  utine sets *pMod
36930 65 20 74 6f 20 30 2c 20 77 68 69 63 68 20 77 69  e to 0, which wi
36940 6c 6c 20 62 65 63 6f 6d 65 0a 2a 2a 20 61 6e 20  ll become.** an 
36950 69 6e 64 69 63 61 74 69 6f 6e 20 74 6f 20 72 6f  indication to ro
36960 62 75 73 74 5f 6f 70 65 6e 28 29 20 74 6f 20 63  bust_open() to c
36970 72 65 61 74 65 20 74 68 65 20 66 69 6c 65 20 75  reate the file u
36980 73 69 6e 67 0a 2a 2a 20 53 51 4c 49 54 45 5f 44  sing.** SQLITE_D
36990 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d  EFAULT_FILE_PERM
369a0 49 53 53 49 4f 4e 53 20 61 64 6a 75 73 74 65 64  ISSIONS adjusted
369b0 20 62 79 20 74 68 65 20 75 6d 61 73 6b 2e 0a 2a   by the umask..*
369c0 2a 20 42 75 74 20 69 66 20 74 68 65 20 66 69 6c  * But if the fil
369d0 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20 69  e being opened i
369e0 73 20 61 20 57 41 4c 20 6f 72 20 72 65 67 75 6c  s a WAL or regul
369f0 61 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  ar journal file,
36a00 20 74 68 65 6e 20 0a 2a 2a 20 74 68 69 73 20 66   then .** this f
36a10 75 6e 63 74 69 6f 6e 20 71 75 65 72 69 65 73 20  unction queries 
36a20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  the file-system 
36a30 66 6f 72 20 74 68 65 20 70 65 72 6d 69 73 73 69  for the permissi
36a40 6f 6e 73 20 6f 6e 20 74 68 65 20 0a 2a 2a 20 63  ons on the .** c
36a50 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 64 61 74  orresponding dat
36a60 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 73  abase file and s
36a70 65 74 73 20 2a 70 4d 6f 64 65 20 74 6f 20 74 68  ets *pMode to th
36a80 69 73 20 76 61 6c 75 65 2e 20 57 68 65 6e 65 76  is value. Whenev
36a90 65 72 20 0a 2a 2a 20 70 6f 73 73 69 62 6c 65 2c  er .** possible,
36aa0 20 57 41 4c 20 61 6e 64 20 6a 6f 75 72 6e 61 6c   WAL and journal
36ab0 20 66 69 6c 65 73 20 61 72 65 20 63 72 65 61 74   files are creat
36ac0 65 64 20 75 73 69 6e 67 20 74 68 65 20 73 61 6d  ed using the sam
36ad0 65 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 0a 2a  e permissions .*
36ae0 2a 20 61 73 20 74 68 65 20 61 73 73 6f 63 69 61  * as the associa
36af0 74 65 64 20 64 61 74 61 62 61 73 65 20 66 69 6c  ted database fil
36b00 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
36b10 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 38 5f  SQLITE_ENABLE_8_
36b20 33 5f 4e 41 4d 45 53 20 6f 70 74 69 6f 6e 20 69  3_NAMES option i
36b30 73 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e 20  s enabled, then 
36b40 74 68 65 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 20  the.** original 
36b50 66 69 6c 65 6e 61 6d 65 20 69 73 20 75 6e 61 76  filename is unav
36b60 61 69 6c 61 62 6c 65 2e 20 20 42 75 74 20 38 5f  ailable.  But 8_
36b70 33 5f 4e 41 4d 45 53 20 69 73 20 6f 6e 6c 79 20  3_NAMES is only 
36b80 75 73 65 64 20 66 6f 72 0a 2a 2a 20 46 41 54 20  used for.** FAT 
36b90 66 69 6c 65 73 79 73 74 65 6d 73 20 61 6e 64 20  filesystems and 
36ba0 70 65 72 6d 69 73 73 69 6f 6e 73 20 64 6f 20 6e  permissions do n
36bb0 6f 74 20 6d 61 74 74 65 72 20 74 68 65 72 65 2c  ot matter there,
36bc0 20 73 6f 20 6a 75 73 74 20 75 73 65 0a 2a 2a 20   so just use.** 
36bd0 74 68 65 20 64 65 66 61 75 6c 74 20 70 65 72 6d  the default perm
36be0 69 73 73 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 61 74  issions..*/.stat
36bf0 69 63 20 69 6e 74 20 66 69 6e 64 43 72 65 61 74  ic int findCreat
36c00 65 46 69 6c 65 4d 6f 64 65 28 0a 20 20 63 6f 6e  eFileMode(.  con
36c10 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20  st char *zPath, 
36c20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
36c30 50 61 74 68 20 6f 66 20 66 69 6c 65 20 28 70 6f  Path of file (po
36c40 73 73 69 62 6c 79 29 20 62 65 69 6e 67 20 63 72  ssibly) being cr
36c50 65 61 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 66  eated */.  int f
36c60 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20  lags,           
36c70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c             /* Fl
36c80 61 67 73 20 70 61 73 73 65 64 20 61 73 20 34 74  ags passed as 4t
36c90 68 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 78 4f  h argument to xO
36ca0 70 65 6e 28 29 20 2a 2f 0a 20 20 6d 6f 64 65 5f  pen() */.  mode_
36cb0 74 20 2a 70 4d 6f 64 65 2c 20 20 20 20 20 20 20  t *pMode,       
36cc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
36cd0 54 3a 20 50 65 72 6d 69 73 73 69 6f 6e 73 20 74  T: Permissions t
36ce0 6f 20 6f 70 65 6e 20 66 69 6c 65 20 77 69 74 68  o open file with
36cf0 20 2a 2f 0a 20 20 75 69 64 5f 74 20 2a 70 55 69   */.  uid_t *pUi
36d00 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
36d10 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 75 69        /* OUT: ui
36d20 64 20 74 6f 20 73 65 74 20 6f 6e 20 74 68 65 20  d to set on the 
36d30 66 69 6c 65 20 2a 2f 0a 20 20 67 69 64 5f 74 20  file */.  gid_t 
36d40 2a 70 47 69 64 20 20 20 20 20 20 20 20 20 20 20  *pGid           
36d50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
36d60 3a 20 67 69 64 20 74 6f 20 73 65 74 20 6f 6e 20  : gid to set on 
36d70 74 68 65 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20  the file */.){. 
36d80 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
36d90 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
36da0 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20   /* Return Code 
36db0 2a 2f 0a 20 20 2a 70 4d 6f 64 65 20 3d 20 30 3b  */.  *pMode = 0;
36dc0 0a 20 20 2a 70 55 69 64 20 3d 20 30 3b 0a 20 20  .  *pUid = 0;.  
36dd0 2a 70 47 69 64 20 3d 20 30 3b 0a 20 20 69 66 28  *pGid = 0;.  if(
36de0 20 66 6c 61 67 73 20 26 20 28 53 51 4c 49 54 45   flags & (SQLITE
36df0 5f 4f 50 45 4e 5f 57 41 4c 7c 53 51 4c 49 54 45  _OPEN_WAL|SQLITE
36e00 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e  _OPEN_MAIN_JOURN
36e10 41 4c 29 20 29 7b 0a 20 20 20 20 63 68 61 72 20  AL) ){.    char 
36e20 7a 44 62 5b 4d 41 58 5f 50 41 54 48 4e 41 4d 45  zDb[MAX_PATHNAME
36e30 2b 31 5d 3b 20 20 20 20 20 2f 2a 20 44 61 74 61  +1];     /* Data
36e40 62 61 73 65 20 66 69 6c 65 20 70 61 74 68 20 2a  base file path *
36e50 2f 0a 20 20 20 20 69 6e 74 20 6e 44 62 3b 20 20  /.    int nDb;  
36e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36e70 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
36e80 20 76 61 6c 69 64 20 62 79 74 65 73 20 69 6e 20   valid bytes in 
36e90 7a 44 62 20 2a 2f 0a 20 20 20 20 73 74 72 75 63  zDb */.    struc
36ea0 74 20 73 74 61 74 20 73 53 74 61 74 3b 20 20 20  t stat sStat;   
36eb0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70           /* Outp
36ec0 75 74 20 6f 66 20 73 74 61 74 28 29 20 6f 6e 20  ut of stat() on 
36ed0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
36ee0 0a 0a 20 20 20 20 2f 2a 20 7a 50 61 74 68 20 69  ..    /* zPath i
36ef0 73 20 61 20 70 61 74 68 20 74 6f 20 61 20 57 41  s a path to a WA
36f00 4c 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  L or journal fil
36f10 65 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  e. The following
36f20 20 62 6c 6f 63 6b 20 64 65 72 69 76 65 73 0a 20   block derives. 
36f30 20 20 20 2a 2a 20 74 68 65 20 70 61 74 68 20 74     ** the path t
36f40 6f 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64  o the associated
36f50 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66   database file f
36f60 72 6f 6d 20 7a 50 61 74 68 2e 20 54 68 69 73 20  rom zPath. This 
36f70 62 6c 6f 63 6b 20 68 61 6e 64 6c 65 73 0a 20 20  block handles.  
36f80 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69    ** the followi
36f90 6e 67 20 6e 61 6d 69 6e 67 20 63 6f 6e 76 65 6e  ng naming conven
36fa0 74 69 6f 6e 73 3a 0a 20 20 20 20 2a 2a 0a 20 20  tions:.    **.  
36fb0 20 20 2a 2a 20 20 20 22 3c 70 61 74 68 20 74 6f    **   "<path to
36fc0 20 64 62 3e 2d 6a 6f 75 72 6e 61 6c 22 0a 20 20   db>-journal".  
36fd0 20 20 2a 2a 20 20 20 22 3c 70 61 74 68 20 74 6f    **   "<path to
36fe0 20 64 62 3e 2d 77 61 6c 22 0a 20 20 20 20 2a 2a   db>-wal".    **
36ff0 20 20 20 22 3c 70 61 74 68 20 74 6f 20 64 62 3e     "<path to db>
37000 2d 6a 6f 75 72 6e 61 6c 4e 4e 22 0a 20 20 20 20  -journalNN".    
37010 2a 2a 20 20 20 22 3c 70 61 74 68 20 74 6f 20 64  **   "<path to d
37020 62 3e 2d 77 61 6c 4e 4e 22 0a 20 20 20 20 2a 2a  b>-walNN".    **
37030 0a 20 20 20 20 2a 2a 20 77 68 65 72 65 20 4e 4e  .    ** where NN
37040 20 69 73 20 61 20 64 65 63 69 6d 61 6c 20 6e 75   is a decimal nu
37050 6d 62 65 72 2e 20 54 68 65 20 4e 4e 20 6e 61 6d  mber. The NN nam
37060 69 6e 67 20 73 63 68 65 6d 65 73 20 61 72 65 20  ing schemes are 
37070 0a 20 20 20 20 2a 2a 20 75 73 65 64 20 62 79 20  .    ** used by 
37080 74 68 65 20 74 65 73 74 5f 6d 75 6c 74 69 70 6c  the test_multipl
37090 65 78 2e 63 20 6d 6f 64 75 6c 65 2e 0a 20 20 20  ex.c module..   
370a0 20 2a 2f 0a 20 20 20 20 6e 44 62 20 3d 20 73 71   */.    nDb = sq
370b0 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 50  lite3Strlen30(zP
370c0 61 74 68 29 20 2d 20 31 3b 20 0a 23 69 66 64 65  ath) - 1; .#ifde
370d0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
370e0 38 5f 33 5f 4e 41 4d 45 53 0a 20 20 20 20 77 68  8_3_NAMES.    wh
370f0 69 6c 65 28 20 6e 44 62 3e 30 20 26 26 20 73 71  ile( nDb>0 && sq
37100 6c 69 74 65 33 49 73 61 6c 6e 75 6d 28 7a 50 61  lite3Isalnum(zPa
37110 74 68 5b 6e 44 62 5d 29 20 29 20 6e 44 62 2d 2d  th[nDb]) ) nDb--
37120 3b 0a 20 20 20 20 69 66 28 20 6e 44 62 3d 3d 30  ;.    if( nDb==0
37130 20 7c 7c 20 7a 50 61 74 68 5b 6e 44 62 5d 21 3d   || zPath[nDb]!=
37140 27 2d 27 20 29 20 72 65 74 75 72 6e 20 53 51 4c  '-' ) return SQL
37150 49 54 45 5f 4f 4b 3b 0a 23 65 6c 73 65 0a 20 20  ITE_OK;.#else.  
37160 20 20 77 68 69 6c 65 28 20 7a 50 61 74 68 5b 6e    while( zPath[n
37170 44 62 5d 21 3d 27 2d 27 20 29 7b 0a 20 20 20 20  Db]!='-' ){.    
37180 20 20 61 73 73 65 72 74 28 20 6e 44 62 3e 30 20    assert( nDb>0 
37190 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
371a0 20 7a 50 61 74 68 5b 6e 44 62 5d 21 3d 27 5c 6e   zPath[nDb]!='\n
371b0 27 20 29 3b 0a 20 20 20 20 20 20 6e 44 62 2d 2d  ' );.      nDb--
371c0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
371d0 20 20 20 6d 65 6d 63 70 79 28 7a 44 62 2c 20 7a     memcpy(zDb, z
371e0 50 61 74 68 2c 20 6e 44 62 29 3b 0a 20 20 20 20  Path, nDb);.    
371f0 7a 44 62 5b 6e 44 62 5d 20 3d 20 27 5c 30 27 3b  zDb[nDb] = '\0';
37200 0a 0a 20 20 20 20 69 66 28 20 30 3d 3d 6f 73 53  ..    if( 0==osS
37210 74 61 74 28 7a 44 62 2c 20 26 73 53 74 61 74 29  tat(zDb, &sStat)
37220 20 29 7b 0a 20 20 20 20 20 20 2a 70 4d 6f 64 65   ){.      *pMode
37230 20 3d 20 73 53 74 61 74 2e 73 74 5f 6d 6f 64 65   = sStat.st_mode
37240 20 26 20 30 37 37 37 3b 0a 20 20 20 20 20 20 2a   & 0777;.      *
37250 70 55 69 64 20 3d 20 73 53 74 61 74 2e 73 74 5f  pUid = sStat.st_
37260 75 69 64 3b 0a 20 20 20 20 20 20 2a 70 47 69 64  uid;.      *pGid
37270 20 3d 20 73 53 74 61 74 2e 73 74 5f 67 69 64 3b   = sStat.st_gid;
37280 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
37290 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
372a0 45 52 52 5f 46 53 54 41 54 3b 0a 20 20 20 20 7d  ERR_FSTAT;.    }
372b0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61  .  }else if( fla
372c0 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
372d0 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 29  _DELETEONCLOSE )
372e0 7b 0a 20 20 20 20 2a 70 4d 6f 64 65 20 3d 20 30  {.    *pMode = 0
372f0 36 30 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  600;.  }.  retur
37300 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f  n rc;.}../*.** O
37310 70 65 6e 20 74 68 65 20 66 69 6c 65 20 7a 50 61  pen the file zPa
37320 74 68 2e 0a 2a 2a 20 0a 2a 2a 20 50 72 65 76 69  th..** .** Previ
37330 6f 75 73 6c 79 2c 20 74 68 65 20 53 51 4c 69 74  ously, the SQLit
37340 65 20 4f 53 20 6c 61 79 65 72 20 75 73 65 64 20  e OS layer used 
37350 74 68 72 65 65 20 66 75 6e 63 74 69 6f 6e 73 20  three functions 
37360 69 6e 20 70 6c 61 63 65 20 6f 66 20 74 68 69 73  in place of this
37370 0a 2a 2a 20 6f 6e 65 3a 0a 2a 2a 0a 2a 2a 20 20  .** one:.**.**  
37380 20 20 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e     sqlite3OsOpen
37390 52 65 61 64 57 72 69 74 65 28 29 3b 0a 2a 2a 20  ReadWrite();.** 
373a0 20 20 20 20 73 71 6c 69 74 65 33 4f 73 4f 70 65      sqlite3OsOpe
373b0 6e 52 65 61 64 4f 6e 6c 79 28 29 3b 0a 2a 2a 20  nReadOnly();.** 
373c0 20 20 20 20 73 71 6c 69 74 65 33 4f 73 4f 70 65      sqlite3OsOpe
373d0 6e 45 78 63 6c 75 73 69 76 65 28 29 3b 0a 2a 2a  nExclusive();.**
373e0 0a 2a 2a 20 54 68 65 73 65 20 63 61 6c 6c 73 20  .** These calls 
373f0 63 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20 74 68  correspond to th
37400 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d 62  e following comb
37410 69 6e 61 74 69 6f 6e 73 20 6f 66 20 66 6c 61 67  inations of flag
37420 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 52 65 61  s:.**.**     Rea
37430 64 57 72 69 74 65 28 29 20 2d 3e 20 20 20 20 20  dWrite() ->     
37440 28 52 45 41 44 57 52 49 54 45 20 7c 20 43 52 45  (READWRITE | CRE
37450 41 54 45 29 0a 2a 2a 20 20 20 20 20 52 65 61 64  ATE).**     Read
37460 4f 6e 6c 79 28 29 20 20 2d 3e 20 20 20 20 20 28  Only()  ->     (
37470 52 45 41 44 4f 4e 4c 59 29 20 0a 2a 2a 20 20 20  READONLY) .**   
37480 20 20 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28    OpenExclusive(
37490 29 20 2d 3e 20 28 52 45 41 44 57 52 49 54 45 20  ) -> (READWRITE 
374a0 7c 20 43 52 45 41 54 45 20 7c 20 45 58 43 4c 55  | CREATE | EXCLU
374b0 53 49 56 45 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20  SIVE).**.** The 
374c0 6f 6c 64 20 4f 70 65 6e 45 78 63 6c 75 73 69 76  old OpenExclusiv
374d0 65 28 29 20 61 63 63 65 70 74 65 64 20 61 20 62  e() accepted a b
374e0 6f 6f 6c 65 61 6e 20 61 72 67 75 6d 65 6e 74 20  oolean argument 
374f0 2d 20 22 64 65 6c 46 6c 61 67 22 2e 20 49 66 0a  - "delFlag". If.
37500 2a 2a 20 74 72 75 65 2c 20 74 68 65 20 66 69 6c  ** true, the fil
37510 65 20 77 61 73 20 63 6f 6e 66 69 67 75 72 65 64  e was configured
37520 20 74 6f 20 62 65 20 61 75 74 6f 6d 61 74 69 63   to be automatic
37530 61 6c 6c 79 20 64 65 6c 65 74 65 64 20 77 68 65  ally deleted whe
37540 6e 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 68 61  n the.** file ha
37550 6e 64 6c 65 20 63 6c 6f 73 65 64 2e 20 54 6f 20  ndle closed. To 
37560 61 63 68 69 65 76 65 20 74 68 65 20 73 61 6d 65  achieve the same
37570 20 65 66 66 65 63 74 20 75 73 69 6e 67 20 74 68   effect using th
37580 69 73 20 6e 65 77 20 0a 2a 2a 20 69 6e 74 65 72  is new .** inter
37590 66 61 63 65 2c 20 61 64 64 20 74 68 65 20 44 45  face, add the DE
375a0 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 66 6c 61 67  LETEONCLOSE flag
375b0 20 74 6f 20 74 68 6f 73 65 20 73 70 65 63 69 66   to those specif
375c0 69 65 64 20 61 62 6f 76 65 20 66 6f 72 20 0a 2a  ied above for .*
375d0 2a 20 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28  * OpenExclusive(
375e0 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
375f0 20 75 6e 69 78 4f 70 65 6e 28 0a 20 20 73 71 6c   unixOpen(.  sql
37600 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
37610 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
37620 20 56 46 53 20 66 6f 72 20 77 68 69 63 68 20 74   VFS for which t
37630 68 69 73 20 69 73 20 74 68 65 20 78 4f 70 65 6e  his is the xOpen
37640 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 63 6f 6e   method */.  con
37650 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20  st char *zPath, 
37660 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 74            /* Pat
37670 68 6e 61 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f  hname of file to
37680 20 62 65 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20   be opened */.  
37690 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46  sqlite3_file *pF
376a0 69 6c 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ile,         /* 
376b0 54 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  The file descrip
376c0 74 6f 72 20 74 6f 20 62 65 20 66 69 6c 6c 65 64  tor to be filled
376d0 20 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61   in */.  int fla
376e0 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gs,             
376f0 20 20 20 20 20 20 2f 2a 20 49 6e 70 75 74 20 66        /* Input f
37700 6c 61 67 73 20 74 6f 20 63 6f 6e 74 72 6f 6c 20  lags to control 
37710 74 68 65 20 6f 70 65 6e 69 6e 67 20 2a 2f 0a 20  the opening */. 
37720 20 69 6e 74 20 2a 70 4f 75 74 46 6c 61 67 73 20   int *pOutFlags 
37730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
37740 20 4f 75 74 70 75 74 20 66 6c 61 67 73 20 72 65   Output flags re
37750 74 75 72 6e 65 64 20 74 6f 20 53 51 4c 69 74 65  turned to SQLite
37760 20 63 6f 72 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e   core */.){.  un
37770 69 78 46 69 6c 65 20 2a 70 20 3d 20 28 75 6e 69  ixFile *p = (uni
37780 78 46 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20  xFile *)pFile;. 
37790 20 69 6e 74 20 66 64 20 3d 20 2d 31 3b 20 20 20   int fd = -1;   
377a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
377b0 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74  /* File descript
377c0 6f 72 20 72 65 74 75 72 6e 65 64 20 62 79 20 6f  or returned by o
377d0 70 65 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 6f  pen() */.  int o
377e0 70 65 6e 46 6c 61 67 73 20 3d 20 30 3b 20 20 20  penFlags = 0;   
377f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
37800 67 73 20 74 6f 20 70 61 73 73 20 74 6f 20 6f 70  gs to pass to op
37810 65 6e 28 29 20 2a 2f 0a 23 69 66 20 53 51 4c 49  en() */.#if SQLI
37820 54 45 5f 45 4e 41 42 4c 45 5f 44 41 54 41 5f 50  TE_ENABLE_DATA_P
37830 52 4f 54 45 43 54 49 4f 4e 0a 20 20 69 6e 74 20  ROTECTION.  int 
37840 65 54 79 70 65 20 3d 20 66 6c 61 67 73 26 30 78  eType = flags&0x
37850 46 46 30 46 46 46 30 30 3b 20 20 2f 2a 20 54 79  FF0FFF00;  /* Ty
37860 70 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 6f 70  pe of file to op
37870 65 6e 20 2a 2f 0a 23 65 6c 73 65 0a 20 20 69 6e  en */.#else.  in
37880 74 20 65 54 79 70 65 20 3d 20 66 6c 61 67 73 26  t eType = flags&
37890 30 78 46 46 46 46 46 46 30 30 3b 20 20 2f 2a 20  0xFFFFFF00;  /* 
378a0 54 79 70 65 20 6f 66 20 66 69 6c 65 20 74 6f 20  Type of file to 
378b0 6f 70 65 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20  open */.#endif. 
378c0 20 69 6e 74 20 6e 6f 4c 6f 63 6b 3b 20 20 20 20   int noLock;    
378d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
378e0 2f 2a 20 54 72 75 65 20 74 6f 20 6f 6d 69 74 20  /* True to omit 
378f0 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69 74 69 76  locking primitiv
37900 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  es */.  int rc =
37910 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
37920 20 20 20 20 20 20 20 2f 2a 20 46 75 6e 63 74 69         /* Functi
37930 6f 6e 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a  on Return Code *
37940 2f 0a 20 20 69 6e 74 20 63 74 72 6c 46 6c 61 67  /.  int ctrlFlag
37950 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  s = 0;          
37960 20 20 20 2f 2a 20 55 4e 49 58 46 49 4c 45 5f 2a     /* UNIXFILE_*
37970 20 66 6c 61 67 73 20 2a 2f 0a 0a 20 20 69 6e 74   flags */..  int
37980 20 69 73 45 78 63 6c 75 73 69 76 65 20 20 3d 20   isExclusive  = 
37990 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
379a0 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 29 3b  OPEN_EXCLUSIVE);
379b0 0a 20 20 69 6e 74 20 69 73 44 65 6c 65 74 65 20  .  int isDelete 
379c0 20 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53      = (flags & S
379d0 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54  QLITE_OPEN_DELET
379e0 45 4f 4e 43 4c 4f 53 45 29 3b 0a 20 20 69 6e 74  EONCLOSE);.  int
379f0 20 69 73 43 72 65 61 74 65 20 20 20 20 20 3d 20   isCreate     = 
37a00 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
37a10 4f 50 45 4e 5f 43 52 45 41 54 45 29 3b 0a 20 20  OPEN_CREATE);.  
37a20 69 6e 74 20 69 73 52 65 61 64 6f 6e 6c 79 20 20  int isReadonly  
37a30 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49   = (flags & SQLI
37a40 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
37a50 29 3b 0a 20 20 69 6e 74 20 69 73 52 65 61 64 57  );.  int isReadW
37a60 72 69 74 65 20 20 3d 20 28 66 6c 61 67 73 20 26  rite  = (flags &
37a70 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
37a80 44 57 52 49 54 45 29 3b 0a 23 69 66 20 53 51 4c  DWRITE);.#if SQL
37a90 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
37aa0 4e 47 5f 53 54 59 4c 45 0a 20 20 69 6e 74 20 69  NG_STYLE.  int i
37ab0 73 41 75 74 6f 50 72 6f 78 79 20 20 3d 20 28 66  sAutoProxy  = (f
37ac0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
37ad0 45 4e 5f 41 55 54 4f 50 52 4f 58 59 29 3b 0a 23  EN_AUTOPROXY);.#
37ae0 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65  endif.#if define
37af0 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 7c 7c 20  d(__APPLE__) || 
37b00 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
37b10 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 73 74  CKING_STYLE.  st
37b20 72 75 63 74 20 73 74 61 74 66 73 20 66 73 49 6e  ruct statfs fsIn
37b30 66 6f 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a  fo;.#endif..  /*
37b40 20 49 66 20 63 72 65 61 74 69 6e 67 20 61 20 6d   If creating a m
37b50 61 73 74 65 72 20 6f 72 20 6d 61 69 6e 2d 66 69  aster or main-fi
37b60 6c 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 69 73  le journal, this
37b70 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 6f   function will o
37b80 70 65 6e 0a 20 20 2a 2a 20 61 20 66 69 6c 65 2d  pen.  ** a file-
37b90 64 65 73 63 72 69 70 74 6f 72 20 6f 6e 20 74 68  descriptor on th
37ba0 65 20 64 69 72 65 63 74 6f 72 79 20 74 6f 6f 2e  e directory too.
37bb0 20 54 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   The first time 
37bc0 75 6e 69 78 53 79 6e 63 28 29 0a 20 20 2a 2a 20  unixSync().  ** 
37bd0 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20 64 69  is called the di
37be0 72 65 63 74 6f 72 79 20 66 69 6c 65 20 64 65 73  rectory file des
37bf0 63 72 69 70 74 6f 72 20 77 69 6c 6c 20 62 65 20  criptor will be 
37c00 66 73 79 6e 63 28 29 65 64 20 61 6e 64 20 63 6c  fsync()ed and cl
37c10 6f 73 65 28 29 64 2e 0a 20 20 2a 2f 0a 20 20 69  ose()d..  */.  i
37c20 6e 74 20 73 79 6e 63 44 69 72 20 3d 20 28 69 73  nt syncDir = (is
37c30 43 72 65 61 74 65 20 26 26 20 28 0a 20 20 20 20  Create && (.    
37c40 20 20 20 20 65 54 79 70 65 3d 3d 53 51 4c 49 54      eType==SQLIT
37c50 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f  E_OPEN_MASTER_JO
37c60 55 52 4e 41 4c 20 0a 20 20 20 20 20 7c 7c 20 65  URNAL .     || e
37c70 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
37c80 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 0a  N_MAIN_JOURNAL .
37c90 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53       || eType==S
37ca0 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20  QLITE_OPEN_WAL. 
37cb0 20 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 72   ));..  /* If ar
37cc0 67 75 6d 65 6e 74 20 7a 50 61 74 68 20 69 73 20  gument zPath is 
37cd0 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2c 20  a NULL pointer, 
37ce0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
37cf0 20 72 65 71 75 69 72 65 64 20 74 6f 20 6f 70 65   required to ope
37d00 6e 0a 20 20 2a 2a 20 61 20 74 65 6d 70 6f 72 61  n.  ** a tempora
37d10 72 79 20 66 69 6c 65 2e 20 55 73 65 20 74 68 69  ry file. Use thi
37d20 73 20 62 75 66 66 65 72 20 74 6f 20 73 74 6f 72  s buffer to stor
37d30 65 20 74 68 65 20 66 69 6c 65 20 6e 61 6d 65 20  e the file name 
37d40 69 6e 2e 0a 20 20 2a 2f 0a 20 20 63 68 61 72 20  in..  */.  char 
37d50 7a 54 6d 70 6e 61 6d 65 5b 4d 41 58 5f 50 41 54  zTmpname[MAX_PAT
37d60 48 4e 41 4d 45 2b 32 5d 3b 0a 20 20 63 6f 6e 73  HNAME+2];.  cons
37d70 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20  t char *zName = 
37d80 7a 50 61 74 68 3b 0a 0a 20 20 2f 2a 20 43 68 65  zPath;..  /* Che
37d90 63 6b 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ck the following
37da0 20 73 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20   statements are 
37db0 74 72 75 65 3a 20 0a 20 20 2a 2a 0a 20 20 2a 2a  true: .  **.  **
37dc0 20 20 20 28 61 29 20 45 78 61 63 74 6c 79 20 6f     (a) Exactly o
37dd0 6e 65 20 6f 66 20 74 68 65 20 52 45 41 44 57 52  ne of the READWR
37de0 49 54 45 20 61 6e 64 20 52 45 41 44 4f 4e 4c 59  ITE and READONLY
37df0 20 66 6c 61 67 73 20 6d 75 73 74 20 62 65 20 73   flags must be s
37e00 65 74 2c 20 61 6e 64 20 0a 20 20 2a 2a 20 20 20  et, and .  **   
37e10 28 62 29 20 69 66 20 43 52 45 41 54 45 20 69 73  (b) if CREATE is
37e20 20 73 65 74 2c 20 74 68 65 6e 20 52 45 41 44 57   set, then READW
37e30 52 49 54 45 20 6d 75 73 74 20 61 6c 73 6f 20 62  RITE must also b
37e40 65 20 73 65 74 2c 20 61 6e 64 0a 20 20 2a 2a 20  e set, and.  ** 
37e50 20 20 28 63 29 20 69 66 20 45 58 43 4c 55 53 49    (c) if EXCLUSI
37e60 56 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20  VE is set, then 
37e70 43 52 45 41 54 45 20 6d 75 73 74 20 61 6c 73 6f  CREATE must also
37e80 20 62 65 20 73 65 74 2e 0a 20 20 2a 2a 20 20 20   be set..  **   
37e90 28 64 29 20 69 66 20 44 45 4c 45 54 45 4f 4e 43  (d) if DELETEONC
37ea0 4c 4f 53 45 20 69 73 20 73 65 74 2c 20 74 68 65  LOSE is set, the
37eb0 6e 20 43 52 45 41 54 45 20 6d 75 73 74 20 61 6c  n CREATE must al
37ec0 73 6f 20 62 65 20 73 65 74 2e 0a 20 20 2a 2f 0a  so be set..  */.
37ed0 20 20 61 73 73 65 72 74 28 28 69 73 52 65 61 64    assert((isRead
37ee0 6f 6e 6c 79 3d 3d 30 20 7c 7c 20 69 73 52 65 61  only==0 || isRea
37ef0 64 57 72 69 74 65 3d 3d 30 29 20 26 26 20 28 69  dWrite==0) && (i
37f00 73 52 65 61 64 57 72 69 74 65 20 7c 7c 20 69 73  sReadWrite || is
37f10 52 65 61 64 6f 6e 6c 79 29 29 3b 0a 20 20 61 73  Readonly));.  as
37f20 73 65 72 74 28 69 73 43 72 65 61 74 65 3d 3d 30  sert(isCreate==0
37f30 20 7c 7c 20 69 73 52 65 61 64 57 72 69 74 65 29   || isReadWrite)
37f40 3b 0a 20 20 61 73 73 65 72 74 28 69 73 45 78 63  ;.  assert(isExc
37f50 6c 75 73 69 76 65 3d 3d 30 20 7c 7c 20 69 73 43  lusive==0 || isC
37f60 72 65 61 74 65 29 3b 0a 20 20 61 73 73 65 72 74  reate);.  assert
37f70 28 69 73 44 65 6c 65 74 65 3d 3d 30 20 7c 7c 20  (isDelete==0 || 
37f80 69 73 43 72 65 61 74 65 29 3b 0a 0a 20 20 2f 2a  isCreate);..  /*
37f90 20 54 68 65 20 6d 61 69 6e 20 44 42 2c 20 6d 61   The main DB, ma
37fa0 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 57 41 4c 20  in journal, WAL 
37fb0 66 69 6c 65 20 61 6e 64 20 6d 61 73 74 65 72 20  file and master 
37fc0 6a 6f 75 72 6e 61 6c 20 61 72 65 20 6e 65 76 65  journal are neve
37fd0 72 20 0a 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69  r .  ** automati
37fe0 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 2e 20 4e  cally deleted. N
37ff0 6f 72 20 61 72 65 20 74 68 65 79 20 65 76 65 72  or are they ever
38000 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73   temporary files
38010 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
38020 28 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e  (!isDelete && zN
38030 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53  ame) || eType!=S
38040 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
38050 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  DB );.  assert( 
38060 28 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e  (!isDelete && zN
38070 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53  ame) || eType!=S
38080 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
38090 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20 20 61 73 73  JOURNAL );.  ass
380a0 65 72 74 28 20 28 21 69 73 44 65 6c 65 74 65 20  ert( (!isDelete 
380b0 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79  && zName) || eTy
380c0 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe!=SQLITE_OPEN_
380d0 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 29  MASTER_JOURNAL )
380e0 3b 0a 20 20 61 73 73 65 72 74 28 20 28 21 69 73  ;.  assert( (!is
380f0 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29  Delete && zName)
38100 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54   || eType!=SQLIT
38110 45 5f 4f 50 45 4e 5f 57 41 4c 20 29 3b 0a 0a 20  E_OPEN_WAL );.. 
38120 20 2f 2a 20 41 73 73 65 72 74 20 74 68 61 74 20   /* Assert that 
38130 74 68 65 20 75 70 70 65 72 20 6c 61 79 65 72 20  the upper layer 
38140 68 61 73 20 73 65 74 20 6f 6e 65 20 6f 66 20 74  has set one of t
38150 68 65 20 22 66 69 6c 65 2d 74 79 70 65 22 20 66  he "file-type" f
38160 6c 61 67 73 2e 20 2a 2f 0a 20 20 61 73 73 65 72  lags. */.  asser
38170 74 28 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  t( eType==SQLITE
38180 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 20 20  _OPEN_MAIN_DB   
38190 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c     || eType==SQL
381a0 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42  ITE_OPEN_TEMP_DB
381b0 20 0a 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70   .       || eTyp
381c0 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e==SQLITE_OPEN_M
381d0 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 7c 7c 20 65  AIN_JOURNAL || e
381e0 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45  Type==SQLITE_OPE
381f0 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 20 0a  N_TEMP_JOURNAL .
38200 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d         || eType=
38210 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42  =SQLITE_OPEN_SUB
38220 4a 4f 55 52 4e 41 4c 20 20 20 7c 7c 20 65 54 79  JOURNAL   || eTy
38230 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
38240 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 0a  MASTER_JOURNAL .
38250 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d         || eType=
38260 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 52 41  =SQLITE_OPEN_TRA
38270 4e 53 49 45 4e 54 5f 44 42 20 7c 7c 20 65 54 79  NSIENT_DB || eTy
38280 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
38290 57 41 4c 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 44  WAL.  );..  /* D
382a0 65 74 65 63 74 20 61 20 70 69 64 20 63 68 61 6e  etect a pid chan
382b0 67 65 20 61 6e 64 20 72 65 73 65 74 20 74 68 65  ge and reset the
382c0 20 50 52 4e 47 2e 20 20 54 68 65 72 65 20 69 73   PRNG.  There is
382d0 20 61 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f   a race conditio
382e0 6e 0a 20 20 2a 2a 20 68 65 72 65 20 73 75 63 68  n.  ** here such
382f0 20 74 68 61 74 20 74 77 6f 20 6f 72 20 6d 6f 72   that two or mor
38300 65 20 74 68 72 65 61 64 73 20 61 6c 6c 20 74 72  e threads all tr
38310 79 69 6e 67 20 74 6f 20 6f 70 65 6e 20 64 61 74  ying to open dat
38320 61 62 61 73 65 73 20 61 74 0a 20 20 2a 2a 20 74  abases at.  ** t
38330 68 65 20 73 61 6d 65 20 69 6e 73 74 61 6e 74 20  he same instant 
38340 6d 69 67 68 74 20 61 6c 6c 20 72 65 73 65 74 20  might all reset 
38350 74 68 65 20 50 52 4e 47 2e 20 20 42 75 74 20 6d  the PRNG.  But m
38360 75 6c 74 69 70 6c 65 20 72 65 73 65 74 73 0a 20  ultiple resets. 
38370 20 2a 2a 20 61 72 65 20 68 61 72 6d 6c 65 73 73   ** are harmless
38380 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 61 6e  ..  */.  if( ran
38390 64 6f 6d 6e 65 73 73 50 69 64 21 3d 67 65 74 70  domnessPid!=getp
383a0 69 64 28 29 20 29 7b 0a 20 20 20 20 72 61 6e 64  id() ){.    rand
383b0 6f 6d 6e 65 73 73 50 69 64 20 3d 20 67 65 74 70  omnessPid = getp
383c0 69 64 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  id();.    sqlite
383d0 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 30 2c 30  3_randomness(0,0
383e0 29 3b 0a 20 20 7d 0a 0a 20 20 6d 65 6d 73 65 74  );.  }..  memset
383f0 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 75 6e  (p, 0, sizeof(un
38400 69 78 46 69 6c 65 29 29 3b 0a 0a 20 20 69 66 28  ixFile));..  if(
38410 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
38420 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 29 7b 0a 20  PEN_MAIN_DB ){. 
38430 20 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20     UnixUnusedFd 
38440 2a 70 55 6e 75 73 65 64 3b 0a 20 20 20 20 70 55  *pUnused;.    pU
38450 6e 75 73 65 64 20 3d 20 66 69 6e 64 52 65 75 73  nused = findReus
38460 61 62 6c 65 46 64 28 7a 4e 61 6d 65 2c 20 66 6c  ableFd(zName, fl
38470 61 67 73 29 3b 0a 20 20 20 20 69 66 28 20 70 55  ags);.    if( pU
38480 6e 75 73 65 64 20 29 7b 0a 20 20 20 20 20 20 66  nused ){.      f
38490 64 20 3d 20 70 55 6e 75 73 65 64 2d 3e 66 64 3b  d = pUnused->fd;
384a0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
384b0 20 20 70 55 6e 75 73 65 64 20 3d 20 73 71 6c 69    pUnused = sqli
384c0 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f  te3_malloc(sizeo
384d0 66 28 2a 70 55 6e 75 73 65 64 29 29 3b 0a 20 20  f(*pUnused));.  
384e0 20 20 20 20 69 66 28 20 21 70 55 6e 75 73 65 64      if( !pUnused
384f0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
38500 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
38510 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
38520 20 20 20 70 2d 3e 70 55 6e 75 73 65 64 20 3d 20     p->pUnused = 
38530 70 55 6e 75 73 65 64 3b 0a 0a 20 20 20 20 2f 2