/ Hex Artifact Content
Login

Artifact f3e7ee04047592105e6408fde79a218cdf85bbe9:


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 2f 2a 0a  nix only */../*.
0850: 2a 2a 20 54 68 65 72 65 20 61 72 65 20 76 61 72  ** There are var
0860: 69 6f 75 73 20 6d 65 74 68 6f 64 73 20 66 6f 72  ious methods for
0870: 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 75 73   file locking us
0880: 65 64 20 66 6f 72 20 63 6f 6e 63 75 72 72 65 6e  ed for concurren
0890: 63 79 0a 2a 2a 20 63 6f 6e 74 72 6f 6c 3a 0a 2a  cy.** control:.*
08a0: 2a 0a 2a 2a 20 20 20 31 2e 20 50 4f 53 49 58 20  *.**   1. POSIX 
08b0: 6c 6f 63 6b 69 6e 67 20 28 74 68 65 20 64 65 66  locking (the def
08c0: 61 75 6c 74 29 2c 0a 2a 2a 20 20 20 32 2e 20 4e  ault),.**   2. N
08d0: 6f 20 6c 6f 63 6b 69 6e 67 2c 0a 2a 2a 20 20 20  o locking,.**   
08e0: 33 2e 20 44 6f 74 2d 66 69 6c 65 20 6c 6f 63 6b  3. Dot-file lock
08f0: 69 6e 67 2c 0a 2a 2a 20 20 20 34 2e 20 66 6c 6f  ing,.**   4. flo
0900: 63 6b 28 29 20 6c 6f 63 6b 69 6e 67 2c 0a 2a 2a  ck() locking,.**
0910: 20 20 20 35 2e 20 41 46 50 20 6c 6f 63 6b 69 6e     5. AFP lockin
0920: 67 20 28 4f 53 58 20 6f 6e 6c 79 29 2c 0a 2a 2a  g (OSX only),.**
0930: 20 20 20 36 2e 20 4e 61 6d 65 64 20 50 4f 53 49     6. Named POSI
0940: 58 20 73 65 6d 61 70 68 6f 72 65 73 20 28 56 58  X semaphores (VX
0950: 57 6f 72 6b 73 20 6f 6e 6c 79 29 2c 0a 2a 2a 20  Works only),.** 
0960: 20 20 37 2e 20 70 72 6f 78 79 20 6c 6f 63 6b 69    7. proxy locki
0970: 6e 67 2e 20 28 4f 53 58 20 6f 6e 6c 79 29 0a 2a  ng. (OSX only).*
0980: 2a 0a 2a 2a 20 53 74 79 6c 65 73 20 34 2c 20 35  *.** Styles 4, 5
0990: 2c 20 61 6e 64 20 37 20 61 72 65 20 6f 6e 6c 79  , and 7 are only
09a0: 20 61 76 61 69 6c 61 62 6c 65 20 6f 66 20 53 51   available of SQ
09b0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
09c0: 49 4e 47 5f 53 54 59 4c 45 0a 2a 2a 20 69 73 20  ING_STYLE.** is 
09d0: 64 65 66 69 6e 65 64 20 74 6f 20 31 2e 20 20 54  defined to 1.  T
09e0: 68 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  he SQLITE_ENABLE
09f0: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 61  _LOCKING_STYLE a
0a00: 6c 73 6f 20 65 6e 61 62 6c 65 73 20 61 75 74 6f  lso enables auto
0a10: 6d 61 74 69 63 0a 2a 2a 20 73 65 6c 65 63 74 69  matic.** selecti
0a20: 6f 6e 20 6f 66 20 74 68 65 20 61 70 70 72 6f 70  on of the approp
0a30: 72 69 61 74 65 20 6c 6f 63 6b 69 6e 67 20 73 74  riate locking st
0a40: 79 6c 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65  yle based on the
0a50: 20 66 69 6c 65 73 79 73 74 65 6d 0a 2a 2a 20 77   filesystem.** w
0a60: 68 65 72 65 20 74 68 65 20 64 61 74 61 62 61 73  here the databas
0a70: 65 20 69 73 20 6c 6f 63 61 74 65 64 2e 20 20 0a  e is located.  .
0a80: 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
0a90: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
0aa0: 43 4b 49 4e 47 5f 53 54 59 4c 45 29 0a 23 20 20  CKING_STYLE).#  
0ab0: 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
0ac0: 4c 45 5f 5f 29 0a 23 20 20 20 20 64 65 66 69 6e  LE__).#    defin
0ad0: 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  e SQLITE_ENABLE_
0ae0: 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 31 0a  LOCKING_STYLE 1.
0af0: 23 20 20 65 6c 73 65 0a 23 20 20 20 20 64 65 66  #  else.#    def
0b00: 69 6e 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ine SQLITE_ENABL
0b10: 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
0b20: 30 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69  0.#  endif.#endi
0b30: 66 0a 0a 2f 2a 0a 2a 2a 20 73 74 61 6e 64 61 72  f../*.** standar
0b40: 64 20 69 6e 63 6c 75 64 65 20 66 69 6c 65 73 2e  d include files.
0b50: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79  .*/.#include <sy
0b60: 73 2f 74 79 70 65 73 2e 68 3e 0a 23 69 6e 63 6c  s/types.h>.#incl
0b70: 75 64 65 20 3c 73 79 73 2f 73 74 61 74 2e 68 3e  ude <sys/stat.h>
0b80: 0a 23 69 6e 63 6c 75 64 65 20 3c 66 63 6e 74 6c  .#include <fcntl
0b90: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 75 6e  .h>.#include <un
0ba0: 69 73 74 64 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  istd.h>.#include
0bb0: 20 3c 74 69 6d 65 2e 68 3e 0a 23 69 6e 63 6c 75   <time.h>.#inclu
0bc0: 64 65 20 3c 73 79 73 2f 74 69 6d 65 2e 68 3e 0a  de <sys/time.h>.
0bd0: 23 69 6e 63 6c 75 64 65 20 3c 65 72 72 6e 6f 2e  #include <errno.
0be0: 68 3e 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  h>.#if !defined(
0bf0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29  SQLITE_OMIT_WAL)
0c00: 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d   || SQLITE_MAX_M
0c10: 4d 41 50 5f 53 49 5a 45 3e 30 0a 23 20 69 6e 63  MAP_SIZE>0.# inc
0c20: 6c 75 64 65 20 3c 73 79 73 2f 6d 6d 61 6e 2e 68  lude <sys/mman.h
0c30: 3e 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51  >.#endif..#if SQ
0c40: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
0c50: 49 4e 47 5f 53 54 59 4c 45 0a 23 20 69 6e 63 6c  ING_STYLE.# incl
0c60: 75 64 65 20 3c 73 79 73 2f 69 6f 63 74 6c 2e 68  ude <sys/ioctl.h
0c70: 3e 0a 23 20 69 6e 63 6c 75 64 65 20 3c 75 75 69  >.# include <uui
0c80: 64 2f 75 75 69 64 2e 68 3e 0a 23 20 69 6e 63 6c  d/uuid.h>.# incl
0c90: 75 64 65 20 3c 73 79 73 2f 66 69 6c 65 2e 68 3e  ude <sys/file.h>
0ca0: 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f  .# include <sys/
0cb0: 70 61 72 61 6d 2e 68 3e 0a 23 65 6e 64 69 66 20  param.h>.#endif 
0cc0: 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
0cd0: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a  _LOCKING_STYLE *
0ce0: 2f 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  /..#if defined(_
0cf0: 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 28 28 5f  _APPLE__) && ((_
0d00: 5f 4d 41 43 5f 4f 53 5f 58 5f 56 45 52 53 49 4f  _MAC_OS_X_VERSIO
0d10: 4e 5f 4d 49 4e 5f 52 45 51 55 49 52 45 44 20 3e  N_MIN_REQUIRED >
0d20: 20 31 30 35 30 29 20 7c 7c 20 5c 0a 20 20 20 20   1050) || \.    
0d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d40: 20 20 20 20 20 20 20 28 5f 5f 49 50 48 4f 4e 45         (__IPHONE
0d50: 5f 4f 53 5f 56 45 52 53 49 4f 4e 5f 4d 49 4e 5f  _OS_VERSION_MIN_
0d60: 52 45 51 55 49 52 45 44 20 3e 20 32 30 30 30 29  REQUIRED > 2000)
0d70: 29 0a 23 20 20 69 66 20 28 21 64 65 66 69 6e 65  ).#  if (!define
0d80: 64 28 54 41 52 47 45 54 5f 4f 53 5f 45 4d 42 45  d(TARGET_OS_EMBE
0d90: 44 44 45 44 29 20 7c 7c 20 28 54 41 52 47 45 54  DDED) || (TARGET
0da0: 5f 4f 53 5f 45 4d 42 45 44 44 45 44 3d 3d 30 29  _OS_EMBEDDED==0)
0db0: 29 20 5c 0a 20 20 20 20 20 20 20 26 26 20 28 21  ) \.       && (!
0dc0: 64 65 66 69 6e 65 64 28 54 41 52 47 45 54 5f 49  defined(TARGET_I
0dd0: 50 48 4f 4e 45 5f 53 49 4d 55 4c 41 54 4f 52 29  PHONE_SIMULATOR)
0de0: 20 7c 7c 20 28 54 41 52 47 45 54 5f 49 50 48 4f   || (TARGET_IPHO
0df0: 4e 45 5f 53 49 4d 55 4c 41 54 4f 52 3d 3d 30 29  NE_SIMULATOR==0)
0e00: 29 0a 23 20 20 20 20 64 65 66 69 6e 65 20 48 41  ).#    define HA
0e10: 56 45 5f 47 45 54 48 4f 53 54 55 55 49 44 20 31  VE_GETHOSTUUID 1
0e20: 0a 23 20 20 65 6c 73 65 0a 23 20 20 20 20 77 61  .#  else.#    wa
0e30: 72 6e 69 6e 67 20 22 67 65 74 68 6f 73 74 75 75  rning "gethostuu
0e40: 69 64 28 29 20 69 73 20 64 69 73 61 62 6c 65 64  id() is disabled
0e50: 2e 22 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64  .".#  endif.#end
0e60: 69 66 0a 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f  if...#if OS_VXWO
0e70: 52 4b 53 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73  RKS.# include <s
0e80: 79 73 2f 69 6f 63 74 6c 2e 68 3e 0a 23 20 69 6e  ys/ioctl.h>.# in
0e90: 63 6c 75 64 65 20 3c 73 65 6d 61 70 68 6f 72 65  clude <semaphore
0ea0: 2e 68 3e 0a 23 20 69 6e 63 6c 75 64 65 20 3c 6c  .h>.# include <l
0eb0: 69 6d 69 74 73 2e 68 3e 0a 23 65 6e 64 69 66 20  imits.h>.#endif 
0ec0: 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f  /* OS_VXWORKS */
0ed0: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  ..#if defined(__
0ee0: 41 50 50 4c 45 5f 5f 29 20 7c 7c 20 53 51 4c 49  APPLE__) || SQLI
0ef0: 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
0f00: 47 5f 53 54 59 4c 45 0a 23 20 69 6e 63 6c 75 64  G_STYLE.# includ
0f10: 65 20 3c 73 79 73 2f 6d 6f 75 6e 74 2e 68 3e 0a  e <sys/mount.h>.
0f20: 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 48  #endif..#ifdef H
0f30: 41 56 45 5f 55 54 49 4d 45 0a 23 20 69 6e 63 6c  AVE_UTIME.# incl
0f40: 75 64 65 20 3c 75 74 69 6d 65 2e 68 3e 0a 23 65  ude <utime.h>.#e
0f50: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  ndif../*.** Allo
0f60: 77 65 64 20 76 61 6c 75 65 73 20 6f 66 20 75 6e  wed values of un
0f70: 69 78 46 69 6c 65 2e 66 73 46 6c 61 67 73 0a 2a  ixFile.fsFlags.*
0f80: 2f 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45  /.#define SQLITE
0f90: 5f 46 53 46 4c 41 47 53 5f 49 53 5f 4d 53 44 4f  _FSFLAGS_IS_MSDO
0fa0: 53 20 20 20 20 20 30 78 31 0a 0a 2f 2a 0a 2a 2a  S     0x1../*.**
0fb0: 20 49 66 20 77 65 20 61 72 65 20 74 6f 20 62 65   If we are to be
0fc0: 20 74 68 72 65 61 64 2d 73 61 66 65 2c 20 69 6e   thread-safe, in
0fd0: 63 6c 75 64 65 20 74 68 65 20 70 74 68 72 65 61  clude the pthrea
0fe0: 64 73 20 68 65 61 64 65 72 20 61 6e 64 20 64 65  ds header and de
0ff0: 66 69 6e 65 0a 2a 2a 20 74 68 65 20 53 51 4c 49  fine.** the SQLI
1000: 54 45 5f 55 4e 49 58 5f 54 48 52 45 41 44 53 20  TE_UNIX_THREADS 
1010: 6d 61 63 72 6f 2e 0a 2a 2f 0a 23 69 66 20 53 51  macro..*/.#if SQ
1020: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a  LITE_THREADSAFE.
1030: 23 20 69 6e 63 6c 75 64 65 20 3c 70 74 68 72 65  # include <pthre
1040: 61 64 2e 68 3e 0a 23 20 64 65 66 69 6e 65 20 53  ad.h>.# define S
1050: 51 4c 49 54 45 5f 55 4e 49 58 5f 54 48 52 45 41  QLITE_UNIX_THREA
1060: 44 53 20 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  DS 1.#endif../*.
1070: 2a 2a 20 44 65 66 61 75 6c 74 20 70 65 72 6d 69  ** Default permi
1080: 73 73 69 6f 6e 73 20 77 68 65 6e 20 63 72 65 61  ssions when crea
1090: 74 69 6e 67 20 61 20 6e 65 77 20 66 69 6c 65 0a  ting a new file.
10a0: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
10b0: 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50  E_DEFAULT_FILE_P
10c0: 45 52 4d 49 53 53 49 4f 4e 53 0a 23 20 64 65 66  ERMISSIONS.# def
10d0: 69 6e 65 20 53 51 4c 49 54 45 5f 44 45 46 41 55  ine SQLITE_DEFAU
10e0: 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49  LT_FILE_PERMISSI
10f0: 4f 4e 53 20 30 36 34 34 0a 23 65 6e 64 69 66 0a  ONS 0644.#endif.
1100: 0a 2f 2a 0a 2a 2a 20 44 65 66 61 75 6c 74 20 70  ./*.** Default p
1110: 65 72 6d 69 73 73 69 6f 6e 73 20 77 68 65 6e 20  ermissions when 
1120: 63 72 65 61 74 69 6e 67 20 61 75 74 6f 20 70 72  creating auto pr
1130: 6f 78 79 20 64 69 72 0a 2a 2f 0a 23 69 66 6e 64  oxy dir.*/.#ifnd
1140: 65 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  ef SQLITE_DEFAUL
1150: 54 5f 50 52 4f 58 59 44 49 52 5f 50 45 52 4d 49  T_PROXYDIR_PERMI
1160: 53 53 49 4f 4e 53 0a 23 20 64 65 66 69 6e 65 20  SSIONS.# define 
1170: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50  SQLITE_DEFAULT_P
1180: 52 4f 58 59 44 49 52 5f 50 45 52 4d 49 53 53 49  ROXYDIR_PERMISSI
1190: 4f 4e 53 20 30 37 35 35 0a 23 65 6e 64 69 66 0a  ONS 0755.#endif.
11a0: 0a 2f 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20 73  ./*.** Maximum s
11b0: 75 70 70 6f 72 74 65 64 20 70 61 74 68 2d 6c 65  upported path-le
11c0: 6e 67 74 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  ngth..*/.#define
11d0: 20 4d 41 58 5f 50 41 54 48 4e 41 4d 45 20 35 31   MAX_PATHNAME 51
11e0: 32 0a 0a 2f 2a 20 41 6c 77 61 79 73 20 63 61 73  2../* Always cas
11f0: 74 20 74 68 65 20 67 65 74 70 69 64 28 29 20 72  t the getpid() r
1200: 65 74 75 72 6e 20 74 79 70 65 20 66 6f 72 20 63  eturn type for c
1210: 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 77 69 74  ompatibility wit
1220: 68 0a 2a 2a 20 6b 65 72 6e 65 6c 20 6d 6f 64 75  h.** kernel modu
1230: 6c 65 73 20 69 6e 20 56 78 57 6f 72 6b 73 2e 20  les in VxWorks. 
1240: 2a 2f 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74  */.#define osGet
1250: 70 69 64 28 58 29 20 28 70 69 64 5f 74 29 67 65  pid(X) (pid_t)ge
1260: 74 70 69 64 28 29 0a 0a 2f 2a 0a 2a 2a 20 4f 6e  tpid()../*.** On
1270: 6c 79 20 73 65 74 20 74 68 65 20 6c 61 73 74 45  ly set the lastE
1280: 72 72 6e 6f 20 69 66 20 74 68 65 20 65 72 72 6f  rrno if the erro
1290: 72 20 63 6f 64 65 20 69 73 20 61 20 72 65 61 6c  r code is a real
12a0: 20 65 72 72 6f 72 20 61 6e 64 20 6e 6f 74 20 0a   error and not .
12b0: 2a 2a 20 61 20 6e 6f 72 6d 61 6c 20 65 78 70 65  ** a normal expe
12c0: 63 74 65 64 20 72 65 74 75 72 6e 20 63 6f 64 65  cted return code
12d0: 20 6f 66 20 53 51 4c 49 54 45 5f 42 55 53 59 20   of SQLITE_BUSY 
12e0: 6f 72 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2f 0a  or SQLITE_OK.*/.
12f0: 23 64 65 66 69 6e 65 20 49 53 5f 4c 4f 43 4b 5f  #define IS_LOCK_
1300: 45 52 52 4f 52 28 78 29 20 20 28 28 78 20 21 3d  ERROR(x)  ((x !=
1310: 20 53 51 4c 49 54 45 5f 4f 4b 29 20 26 26 20 28   SQLITE_OK) && (
1320: 78 20 21 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  x != SQLITE_BUSY
1330: 29 29 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72  ))../* Forward r
1340: 65 66 65 72 65 6e 63 65 73 20 2a 2f 0a 74 79 70  eferences */.typ
1350: 65 64 65 66 20 73 74 72 75 63 74 20 75 6e 69 78  edef struct unix
1360: 53 68 6d 20 75 6e 69 78 53 68 6d 3b 20 20 20 20  Shm unixShm;    
1370: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
1380: 6e 6e 65 63 74 69 6f 6e 20 73 68 61 72 65 64 20  nnection shared 
1390: 6d 65 6d 6f 72 79 20 2a 2f 0a 74 79 70 65 64 65  memory */.typede
13a0: 66 20 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d  f struct unixShm
13b0: 4e 6f 64 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65  Node unixShmNode
13c0: 3b 20 20 20 20 20 20 20 2f 2a 20 53 68 61 72 65  ;       /* Share
13d0: 64 20 6d 65 6d 6f 72 79 20 69 6e 73 74 61 6e 63  d memory instanc
13e0: 65 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  e */.typedef str
13f0: 75 63 74 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  uct unixInodeInf
1400: 6f 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 3b  o unixInodeInfo;
1410: 20 20 20 2f 2a 20 41 6e 20 69 2d 6e 6f 64 65 20     /* An i-node 
1420: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
1430: 74 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 55  t UnixUnusedFd U
1440: 6e 69 78 55 6e 75 73 65 64 46 64 3b 20 20 20 20  nixUnusedFd;    
1450: 20 2f 2a 20 41 6e 20 75 6e 75 73 65 64 20 66 69   /* An unused fi
1460: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f  le descriptor */
1470: 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65  ../*.** Sometime
1480: 73 2c 20 61 66 74 65 72 20 61 20 66 69 6c 65 20  s, after a file 
1490: 68 61 6e 64 6c 65 20 69 73 20 63 6c 6f 73 65 64  handle is closed
14a0: 20 62 79 20 53 51 4c 69 74 65 2c 20 74 68 65 20   by SQLite, the 
14b0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 0a  file descriptor.
14c0: 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 63 6c 6f  ** cannot be clo
14d0: 73 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e  sed immediately.
14e0: 20 49 6e 20 74 68 65 73 65 20 63 61 73 65 73 2c   In these cases,
14f0: 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68   instances of th
1500: 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 73  e following.** s
1510: 74 72 75 63 74 75 72 65 20 61 72 65 20 75 73 65  tructure are use
1520: 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 66  d to store the f
1530: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 77  ile descriptor w
1540: 68 69 6c 65 20 77 61 69 74 69 6e 67 20 66 6f 72  hile waiting for
1550: 20 61 6e 0a 2a 2a 20 6f 70 70 6f 72 74 75 6e 69   an.** opportuni
1560: 74 79 20 74 6f 20 65 69 74 68 65 72 20 63 6c 6f  ty to either clo
1570: 73 65 20 6f 72 20 72 65 75 73 65 20 69 74 2e 0a  se or reuse it..
1580: 2a 2f 0a 73 74 72 75 63 74 20 55 6e 69 78 55 6e  */.struct UnixUn
1590: 75 73 65 64 46 64 20 7b 0a 20 20 69 6e 74 20 66  usedFd {.  int f
15a0: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
15b0: 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73       /* File des
15c0: 63 72 69 70 74 6f 72 20 74 6f 20 63 6c 6f 73 65  criptor to close
15d0: 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 3b   */.  int flags;
15e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15f0: 2f 2a 20 46 6c 61 67 73 20 74 68 69 73 20 66 69  /* Flags this fi
1600: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 77 61  le descriptor wa
1610: 73 20 6f 70 65 6e 65 64 20 77 69 74 68 20 2a 2f  s opened with */
1620: 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20  .  UnixUnusedFd 
1630: 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 2f 2a 20  *pNext;      /* 
1640: 4e 65 78 74 20 75 6e 75 73 65 64 20 66 69 6c 65  Next unused file
1650: 20 64 65 73 63 72 69 70 74 6f 72 20 6f 6e 20 73   descriptor on s
1660: 61 6d 65 20 66 69 6c 65 20 2a 2f 0a 7d 3b 0a 0a  ame file */.};..
1670: 2f 2a 0a 2a 2a 20 54 68 65 20 75 6e 69 78 46 69  /*.** The unixFi
1680: 6c 65 20 73 74 72 75 63 74 75 72 65 20 69 73 20  le structure is 
1690: 73 75 62 63 6c 61 73 73 20 6f 66 20 73 71 6c 69  subclass of sqli
16a0: 74 65 33 5f 66 69 6c 65 20 73 70 65 63 69 66 69  te3_file specifi
16b0: 63 20 74 6f 20 74 68 65 20 75 6e 69 78 0a 2a 2a  c to the unix.**
16c0: 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74 61 74   VFS implementat
16d0: 69 6f 6e 73 2e 0a 2a 2f 0a 74 79 70 65 64 65 66  ions..*/.typedef
16e0: 20 73 74 72 75 63 74 20 75 6e 69 78 46 69 6c 65   struct unixFile
16f0: 20 75 6e 69 78 46 69 6c 65 3b 0a 73 74 72 75 63   unixFile;.struc
1700: 74 20 75 6e 69 78 46 69 6c 65 20 7b 0a 20 20 73  t unixFile {.  s
1710: 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
1720: 73 20 63 6f 6e 73 74 20 2a 70 4d 65 74 68 6f 64  s const *pMethod
1730: 3b 20 20 2f 2a 20 41 6c 77 61 79 73 20 74 68 65  ;  /* Always the
1740: 20 66 69 72 73 74 20 65 6e 74 72 79 20 2a 2f 0a   first entry */.
1750: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
1760: 56 66 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  Vfs;            
1770: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 46 53        /* The VFS
1780: 20 74 68 61 74 20 63 72 65 61 74 65 64 20 74 68   that created th
1790: 69 73 20 75 6e 69 78 46 69 6c 65 20 2a 2f 0a 20  is unixFile */. 
17a0: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
17b0: 70 49 6e 6f 64 65 3b 20 20 20 20 20 20 20 20 20  pInode;         
17c0: 20 20 20 20 20 2f 2a 20 49 6e 66 6f 20 61 62 6f       /* Info abo
17d0: 75 74 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 69 73  ut locks on this
17e0: 20 69 6e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20   inode */.  int 
17f0: 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h;              
1800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1810: 2f 2a 20 54 68 65 20 66 69 6c 65 20 64 65 73 63  /* The file desc
1820: 72 69 70 74 6f 72 20 2a 2f 0a 20 20 75 6e 73 69  riptor */.  unsi
1830: 67 6e 65 64 20 63 68 61 72 20 65 46 69 6c 65 4c  gned char eFileL
1840: 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ock;            
1850: 2f 2a 20 54 68 65 20 74 79 70 65 20 6f 66 20 6c  /* The type of l
1860: 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 69 73  ock held on this
1870: 20 66 64 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65   fd */.  unsigne
1880: 64 20 73 68 6f 72 74 20 69 6e 74 20 63 74 72 6c  d short int ctrl
1890: 46 6c 61 67 73 3b 20 20 20 20 20 20 20 2f 2a 20  Flags;       /* 
18a0: 42 65 68 61 76 69 6f 72 61 6c 20 62 69 74 73 2e  Behavioral bits.
18b0: 20 20 55 4e 49 58 46 49 4c 45 5f 2a 20 66 6c 61    UNIXFILE_* fla
18c0: 67 73 20 2a 2f 0a 20 20 69 6e 74 20 6c 61 73 74  gs */.  int last
18d0: 45 72 72 6e 6f 3b 20 20 20 20 20 20 20 20 20 20  Errno;          
18e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
18f0: 68 65 20 75 6e 69 78 20 65 72 72 6e 6f 20 66 72  he unix errno fr
1900: 6f 6d 20 6c 61 73 74 20 49 2f 4f 20 65 72 72 6f  om last I/O erro
1910: 72 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 6c 6f 63  r */.  void *loc
1920: 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 20 20 20 20  kingContext;    
1930: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
1940: 63 6b 69 6e 67 20 73 74 79 6c 65 20 73 70 65 63  cking style spec
1950: 69 66 69 63 20 73 74 61 74 65 20 2a 2f 0a 20 20  ific state */.  
1960: 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70 55  UnixUnusedFd *pU
1970: 6e 75 73 65 64 3b 20 20 20 20 20 20 20 20 20 20  nused;          
1980: 20 20 20 20 2f 2a 20 50 72 65 2d 61 6c 6c 6f 63      /* Pre-alloc
1990: 61 74 65 64 20 55 6e 69 78 55 6e 75 73 65 64 46  ated UnixUnusedF
19a0: 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  d */.  const cha
19b0: 72 20 2a 7a 50 61 74 68 3b 20 20 20 20 20 20 20  r *zPath;       
19c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
19d0: 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 2a  me of the file *
19e0: 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 53 68  /.  unixShm *pSh
19f0: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
1a00: 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61 72 65          /* Share
1a10: 64 20 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74  d memory segment
1a20: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a   information */.
1a30: 20 20 69 6e 74 20 73 7a 43 68 75 6e 6b 3b 20 20    int szChunk;  
1a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a50: 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66 69 67 75        /* Configu
1a60: 72 65 64 20 62 79 20 46 43 4e 54 4c 5f 43 48 55  red by FCNTL_CHU
1a70: 4e 4b 5f 53 49 5a 45 20 2a 2f 0a 23 69 66 20 53  NK_SIZE */.#if S
1a80: 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
1a90: 49 5a 45 3e 30 0a 20 20 69 6e 74 20 6e 46 65 74  IZE>0.  int nFet
1aa0: 63 68 4f 75 74 3b 20 20 20 20 20 20 20 20 20 20  chOut;          
1ab0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1ac0: 75 6d 62 65 72 20 6f 66 20 6f 75 74 73 74 61 6e  umber of outstan
1ad0: 64 69 6e 67 20 78 46 65 74 63 68 20 72 65 66 73  ding xFetch refs
1ae0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e   */.  sqlite3_in
1af0: 74 36 34 20 6d 6d 61 70 53 69 7a 65 3b 20 20 20  t64 mmapSize;   
1b00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 61            /* Usa
1b10: 62 6c 65 20 73 69 7a 65 20 6f 66 20 6d 61 70 70  ble size of mapp
1b20: 69 6e 67 20 61 74 20 70 4d 61 70 52 65 67 69 6f  ing at pMapRegio
1b30: 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69  n */.  sqlite3_i
1b40: 6e 74 36 34 20 6d 6d 61 70 53 69 7a 65 41 63 74  nt64 mmapSizeAct
1b50: 75 61 6c 3b 20 20 20 20 20 20 20 2f 2a 20 41 63  ual;       /* Ac
1b60: 74 75 61 6c 20 73 69 7a 65 20 6f 66 20 6d 61 70  tual size of map
1b70: 70 69 6e 67 20 61 74 20 70 4d 61 70 52 65 67 69  ping at pMapRegi
1b80: 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  on */.  sqlite3_
1b90: 69 6e 74 36 34 20 6d 6d 61 70 53 69 7a 65 4d 61  int64 mmapSizeMa
1ba0: 78 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  x;          /* C
1bb0: 6f 6e 66 69 67 75 72 65 64 20 46 43 4e 54 4c 5f  onfigured FCNTL_
1bc0: 4d 4d 41 50 5f 53 49 5a 45 20 76 61 6c 75 65 20  MMAP_SIZE value 
1bd0: 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 4d 61 70 52  */.  void *pMapR
1be0: 65 67 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20  egion;          
1bf0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f           /* Memo
1c00: 72 79 20 6d 61 70 70 65 64 20 72 65 67 69 6f 6e  ry mapped region
1c10: 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 64 65   */.#endif.#ifde
1c20: 66 20 5f 5f 51 4e 58 4e 54 4f 5f 5f 0a 20 20 69  f __QNXNTO__.  i
1c30: 6e 74 20 73 65 63 74 6f 72 53 69 7a 65 3b 20 20  nt sectorSize;  
1c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c50: 20 20 20 2f 2a 20 44 65 76 69 63 65 20 73 65 63     /* Device sec
1c60: 74 6f 72 20 73 69 7a 65 20 2a 2f 0a 20 20 69 6e  tor size */.  in
1c70: 74 20 64 65 76 69 63 65 43 68 61 72 61 63 74 65  t deviceCharacte
1c80: 72 69 73 74 69 63 73 3b 20 20 20 20 20 20 20 20  ristics;        
1c90: 20 20 2f 2a 20 50 72 65 63 6f 6d 70 75 74 65 64    /* Precomputed
1ca0: 20 64 65 76 69 63 65 20 63 68 61 72 61 63 74 65   device characte
1cb0: 72 69 73 74 69 63 73 20 2a 2f 0a 23 65 6e 64 69  ristics */.#endi
1cc0: 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  f.#if SQLITE_ENA
1cd0: 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
1ce0: 45 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f 41  E || defined(__A
1cf0: 50 50 4c 45 5f 5f 29 0a 20 20 69 6e 74 20 6f 70  PPLE__).  int op
1d00: 65 6e 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20  enFlags;        
1d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d20: 20 54 68 65 20 66 6c 61 67 73 20 73 70 65 63 69   The flags speci
1d30: 66 69 65 64 20 61 74 20 6f 70 65 6e 28 29 20 2a  fied at open() *
1d40: 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  /.#endif.#if SQL
1d50: 49 54 45 5f 45 4e 41 42 4c 45 5f 44 41 54 41 5f  ITE_ENABLE_DATA_
1d60: 50 52 4f 54 45 43 54 49 4f 4e 0a 20 20 69 6e 74  PROTECTION.  int
1d70: 20 70 72 6f 74 46 6c 61 67 73 3b 20 20 20 20 20   protFlags;     
1d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d90: 20 2f 2a 20 44 61 74 61 20 70 72 6f 74 65 63 74   /* Data protect
1da0: 69 6f 6e 20 66 6c 61 67 73 20 66 72 6f 6d 20 75  ion flags from u
1db0: 6e 69 78 4f 70 65 6e 20 2a 2f 0a 23 65 6e 64 69  nixOpen */.#endi
1dc0: 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  f.#if SQLITE_ENA
1dd0: 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
1de0: 45 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f 41  E || defined(__A
1df0: 50 50 4c 45 5f 5f 29 0a 20 20 75 6e 73 69 67 6e  PPLE__).  unsign
1e00: 65 64 20 66 73 46 6c 61 67 73 3b 20 20 20 20 20  ed fsFlags;     
1e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e20: 20 63 61 63 68 65 64 20 64 65 74 61 69 6c 73 20   cached details 
1e30: 66 72 6f 6d 20 73 74 61 74 66 73 28 29 20 2a 2f  from statfs() */
1e40: 0a 23 65 6e 64 69 66 0a 23 69 66 20 4f 53 5f 56  .#endif.#if OS_V
1e50: 58 57 4f 52 4b 53 0a 20 20 73 74 72 75 63 74 20  XWORKS.  struct 
1e60: 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70  vxworksFileId *p
1e70: 49 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  Id;          /* 
1e80: 55 6e 69 71 75 65 20 66 69 6c 65 20 49 44 20 2a  Unique file ID *
1e90: 2f 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  /.#endif.#ifdef 
1ea0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f  SQLITE_DEBUG.  /
1eb0: 2a 20 54 68 65 20 6e 65 78 74 20 67 72 6f 75 70  * The next group
1ec0: 20 6f 66 20 76 61 72 69 61 62 6c 65 73 20 61 72   of variables ar
1ed0: 65 20 75 73 65 64 20 74 6f 20 74 72 61 63 6b 20  e used to track 
1ee0: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
1ef0: 68 65 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  he.  ** transact
1f00: 69 6f 6e 20 63 6f 75 6e 74 65 72 20 69 6e 20 62  ion counter in b
1f10: 79 74 65 73 20 32 34 2d 32 37 20 6f 66 20 64 61  ytes 24-27 of da
1f20: 74 61 62 61 73 65 20 66 69 6c 65 73 20 61 72 65  tabase files are
1f30: 20 75 70 64 61 74 65 64 0a 20 20 2a 2a 20 77 68   updated.  ** wh
1f40: 65 6e 65 76 65 72 20 61 6e 79 20 70 61 72 74 20  enever any part 
1f50: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
1f60: 63 68 61 6e 67 65 73 2e 20 20 41 6e 20 61 73 73  changes.  An ass
1f70: 65 72 74 69 6f 6e 20 66 61 75 6c 74 20 77 69 6c  ertion fault wil
1f80: 6c 0a 20 20 2a 2a 20 6f 63 63 75 72 20 69 66 20  l.  ** occur if 
1f90: 61 20 66 69 6c 65 20 69 73 20 75 70 64 61 74 65  a file is update
1fa0: 64 20 77 69 74 68 6f 75 74 20 61 6c 73 6f 20 75  d without also u
1fb0: 70 64 61 74 69 6e 67 20 74 68 65 20 74 72 61 6e  pdating the tran
1fc0: 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 63 6f 75  saction.  ** cou
1fd0: 6e 74 65 72 2e 20 20 54 68 69 73 20 74 65 73 74  nter.  This test
1fe0: 20 69 73 20 6d 61 64 65 20 74 6f 20 61 76 6f 69   is made to avoi
1ff0: 64 20 6e 65 77 20 70 72 6f 62 6c 65 6d 73 20 73  d new problems s
2000: 69 6d 69 6c 61 72 20 74 6f 20 74 68 65 0a 20 20  imilar to the.  
2010: 2a 2a 20 6f 6e 65 20 64 65 73 63 72 69 62 65 64  ** one described
2020: 20 62 79 20 74 69 63 6b 65 74 20 23 33 35 38 34   by ticket #3584
2030: 2e 20 0a 20 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  . .  */.  unsign
2040: 65 64 20 63 68 61 72 20 74 72 61 6e 73 43 6e 74  ed char transCnt
2050: 72 43 68 6e 67 3b 20 20 20 2f 2a 20 54 72 75 65  rChng;   /* True
2060: 20 69 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   if the transact
2070: 69 6f 6e 20 63 6f 75 6e 74 65 72 20 63 68 61 6e  ion counter chan
2080: 67 65 64 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ged */.  unsigne
2090: 64 20 63 68 61 72 20 64 62 55 70 64 61 74 65 3b  d char dbUpdate;
20a0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
20b0: 69 66 20 61 6e 79 20 70 61 72 74 20 6f 66 20 64  if any part of d
20c0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 63 68 61  atabase file cha
20d0: 6e 67 65 64 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  nged */.  unsign
20e0: 65 64 20 63 68 61 72 20 69 6e 4e 6f 72 6d 61 6c  ed char inNormal
20f0: 57 72 69 74 65 3b 20 20 20 2f 2a 20 54 72 75 65  Write;   /* True
2100: 20 69 66 20 69 6e 20 61 20 6e 6f 72 6d 61 6c 20   if in a normal 
2110: 77 72 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 20  write operation 
2120: 2a 2f 0a 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64  */..#endif..#ifd
2130: 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
2140: 20 2f 2a 20 49 6e 20 74 65 73 74 20 6d 6f 64 65   /* In test mode
2150: 2c 20 69 6e 63 72 65 61 73 65 20 74 68 65 20 73  , increase the s
2160: 69 7a 65 20 6f 66 20 74 68 69 73 20 73 74 72 75  ize of this stru
2170: 63 74 75 72 65 20 61 20 62 69 74 20 73 6f 20 74  cture a bit so t
2180: 68 61 74 20 0a 20 20 2a 2a 20 69 74 20 69 73 20  hat .  ** it is 
2190: 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20  larger than the 
21a0: 73 74 72 75 63 74 20 43 72 61 73 68 46 69 6c 65  struct CrashFile
21b0: 20 64 65 66 69 6e 65 64 20 69 6e 20 74 65 73 74   defined in test
21c0: 36 2e 63 2e 0a 20 20 2a 2f 0a 20 20 63 68 61 72  6.c..  */.  char
21d0: 20 61 50 61 64 64 69 6e 67 5b 33 32 5d 3b 0a 23   aPadding[32];.#
21e0: 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 20 54 68 69  endif.};../* Thi
21f0: 73 20 76 61 72 69 61 62 6c 65 20 68 6f 6c 64 73  s variable holds
2200: 20 74 68 65 20 70 72 6f 63 65 73 73 20 69 64 20   the process id 
2210: 28 70 69 64 29 20 66 72 6f 6d 20 77 68 65 6e 20  (pid) from when 
2220: 74 68 65 20 78 52 61 6e 64 6f 6d 6e 65 73 73 28  the xRandomness(
2230: 29 0a 2a 2a 20 6d 65 74 68 6f 64 20 77 61 73 20  ).** method was 
2240: 63 61 6c 6c 65 64 2e 20 20 49 66 20 78 4f 70 65  called.  If xOpe
2250: 6e 28 29 20 69 73 20 63 61 6c 6c 65 64 20 66 72  n() is called fr
2260: 6f 6d 20 61 20 64 69 66 66 65 72 65 6e 74 20 70  om a different p
2270: 72 6f 63 65 73 73 20 69 64 2c 0a 2a 2a 20 69 6e  rocess id,.** in
2280: 64 69 63 61 74 69 6e 67 20 74 68 61 74 20 61 20  dicating that a 
2290: 66 6f 72 6b 28 29 20 68 61 73 20 6f 63 63 75 72  fork() has occur
22a0: 72 65 64 2c 20 74 68 65 20 50 52 4e 47 20 77 69  red, the PRNG wi
22b0: 6c 6c 20 62 65 20 72 65 73 65 74 2e 0a 2a 2f 0a  ll be reset..*/.
22c0: 73 74 61 74 69 63 20 70 69 64 5f 74 20 72 61 6e  static pid_t ran
22d0: 64 6f 6d 6e 65 73 73 50 69 64 20 3d 20 30 3b 0a  domnessPid = 0;.
22e0: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77 65 64 20 76  ./*.** Allowed v
22f0: 61 6c 75 65 73 20 66 6f 72 20 74 68 65 20 75 6e  alues for the un
2300: 69 78 46 69 6c 65 2e 63 74 72 6c 46 6c 61 67 73  ixFile.ctrlFlags
2310: 20 62 69 74 6d 61 73 6b 3a 0a 2a 2f 0a 23 64 65   bitmask:.*/.#de
2320: 66 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f 45 58  fine UNIXFILE_EX
2330: 43 4c 20 20 20 20 20 20 20 20 30 78 30 31 20 20  CL        0x01  
2340: 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e     /* Connection
2350: 73 20 66 72 6f 6d 20 6f 6e 65 20 70 72 6f 63 65  s from one proce
2360: 73 73 20 6f 6e 6c 79 20 2a 2f 0a 23 64 65 66 69  ss only */.#defi
2370: 6e 65 20 55 4e 49 58 46 49 4c 45 5f 52 44 4f 4e  ne UNIXFILE_RDON
2380: 4c 59 20 20 20 20 20 20 30 78 30 32 20 20 20 20  LY      0x02    
2390: 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 69   /* Connection i
23a0: 73 20 72 65 61 64 20 6f 6e 6c 79 20 2a 2f 0a 23  s read only */.#
23b0: 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f  define UNIXFILE_
23c0: 50 45 52 53 49 53 54 5f 57 41 4c 20 30 78 30 34  PERSIST_WAL 0x04
23d0: 20 20 20 20 20 2f 2a 20 50 65 72 73 69 73 74 65       /* Persiste
23e0: 6e 74 20 57 41 4c 20 6d 6f 64 65 20 2a 2f 0a 23  nt WAL mode */.#
23f0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 49  ifndef SQLITE_DI
2400: 53 41 42 4c 45 5f 44 49 52 53 59 4e 43 0a 23 20  SABLE_DIRSYNC.# 
2410: 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f  define UNIXFILE_
2420: 44 49 52 53 59 4e 43 20 20 20 20 30 78 30 38 20  DIRSYNC    0x08 
2430: 20 20 20 20 2f 2a 20 44 69 72 65 63 74 6f 72 79      /* Directory
2440: 20 73 79 6e 63 20 6e 65 65 64 65 64 20 2a 2f 0a   sync needed */.
2450: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 55  #else.# define U
2460: 4e 49 58 46 49 4c 45 5f 44 49 52 53 59 4e 43 20  NIXFILE_DIRSYNC 
2470: 20 20 20 30 78 30 30 0a 23 65 6e 64 69 66 0a 23     0x00.#endif.#
2480: 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f  define UNIXFILE_
2490: 50 53 4f 57 20 20 20 20 20 20 20 20 30 78 31 30  PSOW        0x10
24a0: 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 49       /* SQLITE_I
24b0: 4f 43 41 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f  OCAP_POWERSAFE_O
24c0: 56 45 52 57 52 49 54 45 20 2a 2f 0a 23 64 65 66  VERWRITE */.#def
24d0: 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f 44 45 4c  ine UNIXFILE_DEL
24e0: 45 54 45 20 20 20 20 20 20 30 78 32 30 20 20 20  ETE      0x20   
24f0: 20 20 2f 2a 20 44 65 6c 65 74 65 20 6f 6e 20 63    /* Delete on c
2500: 6c 6f 73 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  lose */.#define 
2510: 55 4e 49 58 46 49 4c 45 5f 55 52 49 20 20 20 20  UNIXFILE_URI    
2520: 20 20 20 20 20 30 78 34 30 20 20 20 20 20 2f 2a       0x40     /*
2530: 20 46 69 6c 65 6e 61 6d 65 20 6d 69 67 68 74 20   Filename might 
2540: 68 61 76 65 20 71 75 65 72 79 20 70 61 72 61 6d  have query param
2550: 65 74 65 72 73 20 2a 2f 0a 23 64 65 66 69 6e 65  eters */.#define
2560: 20 55 4e 49 58 46 49 4c 45 5f 4e 4f 4c 4f 43 4b   UNIXFILE_NOLOCK
2570: 20 20 20 20 20 20 30 78 38 30 20 20 20 20 20 2f        0x80     /
2580: 2a 20 44 6f 20 6e 6f 20 66 69 6c 65 20 6c 6f 63  * Do no file loc
2590: 6b 69 6e 67 20 2a 2f 0a 23 64 65 66 69 6e 65 20  king */.#define 
25a0: 55 4e 49 58 46 49 4c 45 5f 57 41 52 4e 45 44 20  UNIXFILE_WARNED 
25b0: 20 20 20 30 78 30 31 30 30 20 20 20 20 20 2f 2a     0x0100     /*
25c0: 20 76 65 72 69 66 79 44 62 46 69 6c 65 28 29 20   verifyDbFile() 
25d0: 77 61 72 6e 69 6e 67 73 20 69 73 73 75 65 64 20  warnings issued 
25e0: 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 46  */.#define UNIXF
25f0: 49 4c 45 5f 42 4c 4f 43 4b 20 20 20 20 20 30 78  ILE_BLOCK     0x
2600: 30 32 30 30 20 20 20 20 20 2f 2a 20 4e 65 78 74  0200     /* Next
2610: 20 53 48 4d 20 6c 6f 63 6b 20 6d 69 67 68 74 20   SHM lock might 
2620: 62 6c 6f 63 6b 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  block */../*.** 
2630: 49 6e 63 6c 75 64 65 20 63 6f 64 65 20 74 68 61  Include code tha
2640: 74 20 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61  t is common to a
2650: 6c 6c 20 6f 73 5f 2a 2e 63 20 66 69 6c 65 73 0a  ll os_*.c files.
2660: 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 6f 73 5f  */.#include "os_
2670: 63 6f 6d 6d 6f 6e 2e 68 22 0a 0a 2f 2a 0a 2a 2a  common.h"../*.**
2680: 20 44 65 66 69 6e 65 20 76 61 72 69 6f 75 73 20   Define various 
2690: 6d 61 63 72 6f 73 20 74 68 61 74 20 61 72 65 20  macros that are 
26a0: 6d 69 73 73 69 6e 67 20 66 72 6f 6d 20 73 6f 6d  missing from som
26b0: 65 20 73 79 73 74 65 6d 73 2e 0a 2a 2f 0a 23 69  e systems..*/.#i
26c0: 66 6e 64 65 66 20 4f 5f 4c 41 52 47 45 46 49 4c  fndef O_LARGEFIL
26d0: 45 0a 23 20 64 65 66 69 6e 65 20 4f 5f 4c 41 52  E.# define O_LAR
26e0: 47 45 46 49 4c 45 20 30 0a 23 65 6e 64 69 66 0a  GEFILE 0.#endif.
26f0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49  #ifdef SQLITE_DI
2700: 53 41 42 4c 45 5f 4c 46 53 0a 23 20 75 6e 64 65  SABLE_LFS.# unde
2710: 66 20 4f 5f 4c 41 52 47 45 46 49 4c 45 0a 23 20  f O_LARGEFILE.# 
2720: 64 65 66 69 6e 65 20 4f 5f 4c 41 52 47 45 46 49  define O_LARGEFI
2730: 4c 45 20 30 0a 23 65 6e 64 69 66 0a 23 69 66 6e  LE 0.#endif.#ifn
2740: 64 65 66 20 4f 5f 4e 4f 46 4f 4c 4c 4f 57 0a 23  def O_NOFOLLOW.#
2750: 20 64 65 66 69 6e 65 20 4f 5f 4e 4f 46 4f 4c 4c   define O_NOFOLL
2760: 4f 57 20 30 0a 23 65 6e 64 69 66 0a 23 69 66 6e  OW 0.#endif.#ifn
2770: 64 65 66 20 4f 5f 42 49 4e 41 52 59 0a 23 20 64  def O_BINARY.# d
2780: 65 66 69 6e 65 20 4f 5f 42 49 4e 41 52 59 20 30  efine O_BINARY 0
2790: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
27a0: 68 65 20 74 68 72 65 61 64 69 64 20 6d 61 63 72  he threadid macr
27b0: 6f 20 72 65 73 6f 6c 76 65 73 20 74 6f 20 74 68  o resolves to th
27c0: 65 20 74 68 72 65 61 64 2d 69 64 20 6f 72 20 74  e thread-id or t
27d0: 6f 20 30 2e 20 20 55 73 65 64 20 66 6f 72 0a 2a  o 0.  Used for.*
27e0: 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20 64 65  * testing and de
27f0: 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f  bugging only..*/
2800: 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45  .#if SQLITE_THRE
2810: 41 44 53 41 46 45 0a 23 64 65 66 69 6e 65 20 74  ADSAFE.#define t
2820: 68 72 65 61 64 69 64 20 70 74 68 72 65 61 64 5f  hreadid pthread_
2830: 73 65 6c 66 28 29 0a 23 65 6c 73 65 0a 23 64 65  self().#else.#de
2840: 66 69 6e 65 20 74 68 72 65 61 64 69 64 20 30 0a  fine threadid 0.
2850: 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 5f  #endif..#ifdef _
2860: 5f 41 50 50 4c 45 5f 5f 0a 23 64 65 66 69 6e 65  _APPLE__.#define
2870: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
2880: 55 50 45 52 4c 4f 43 4b 20 31 0a 23 65 6e 64 69  UPERLOCK 1.#endi
2890: 66 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e  f..#if SQLITE_EN
28a0: 41 42 4c 45 5f 53 55 50 45 52 4c 4f 43 4b 0a 23  ABLE_SUPERLOCK.#
28b0: 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 33  include "sqlite3
28c0: 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74  .h".#include <st
28d0: 72 69 6e 67 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  ring.h>.#include
28e0: 20 3c 61 73 73 65 72 74 2e 68 3e 0a 0a 2f 2a 0a   <assert.h>../*.
28f0: 2a 2a 20 41 20 73 74 72 75 63 74 75 72 65 20 74  ** A structure t
2900: 6f 20 63 6f 6c 6c 65 63 74 20 61 20 62 75 73 79  o collect a busy
2910: 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63  -handler callbac
2920: 6b 20 61 6e 64 20 61 72 67 75 6d 65 6e 74 20 61  k and argument a
2930: 6e 64 20 61 20 63 6f 75 6e 74 0a 2a 2a 20 6f 66  nd a count.** of
2940: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74   the number of t
2950: 69 6d 65 73 20 69 74 20 68 61 73 20 62 65 65 6e  imes it has been
2960: 20 69 6e 76 6f 6b 65 64 2e 0a 2a 2f 0a 73 74 72   invoked..*/.str
2970: 75 63 74 20 53 75 70 65 72 6c 6f 63 6b 42 75 73  uct SuperlockBus
2980: 79 20 7b 0a 20 20 69 6e 74 20 28 2a 78 42 75 73  y {.  int (*xBus
2990: 79 29 28 76 6f 69 64 2a 2c 69 6e 74 29 3b 20 20  y)(void*,int);  
29a0: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
29b0: 20 74 6f 20 62 75 73 79 2d 68 61 6e 64 6c 65 72   to busy-handler
29c0: 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 76   function */.  v
29d0: 6f 69 64 20 2a 70 42 75 73 79 41 72 67 3b 20 20  oid *pBusyArg;  
29e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
29f0: 2a 20 46 69 72 73 74 20 61 72 67 20 74 6f 20 70  * First arg to p
2a00: 61 73 73 20 74 6f 20 78 42 75 73 79 20 2a 2f 0a  ass to xBusy */.
2a10: 20 20 69 6e 74 20 6e 42 75 73 79 3b 20 20 20 20    int nBusy;    
2a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a30: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74    /* Number of t
2a40: 69 6d 65 73 20 78 42 75 73 79 20 68 61 73 20 62  imes xBusy has b
2a50: 65 65 6e 20 69 6e 76 6f 6b 65 64 20 2a 2f 0a 7d  een invoked */.}
2a60: 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  ;.typedef struct
2a70: 20 53 75 70 65 72 6c 6f 63 6b 42 75 73 79 20 53   SuperlockBusy S
2a80: 75 70 65 72 6c 6f 63 6b 42 75 73 79 3b 0a 0a 2f  uperlockBusy;../
2a90: 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65  *.** An instance
2aa0: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
2ab0: 67 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61  g structure is a
2ac0: 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 65 61 63  llocated for eac
2ad0: 68 20 61 63 74 69 76 65 0a 2a 2a 20 73 75 70 65  h active.** supe
2ae0: 72 6c 6f 63 6b 2e 20 54 68 65 20 6f 70 61 71 75  rlock. The opaqu
2af0: 65 20 68 61 6e 64 6c 65 20 72 65 74 75 72 6e 65  e handle returne
2b00: 64 20 62 79 20 73 71 6c 69 74 65 33 64 65 6d 6f  d by sqlite3demo
2b10: 5f 73 75 70 65 72 6c 6f 63 6b 28 29 20 69 73 0a  _superlock() is.
2b20: 2a 2a 20 61 63 74 75 61 6c 6c 79 20 61 20 70 6f  ** actually a po
2b30: 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e 73 74  inter to an inst
2b40: 61 6e 63 65 20 6f 66 20 74 68 69 73 20 73 74 72  ance of this str
2b50: 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 72 75 63  ucture..*/.struc
2b60: 74 20 53 75 70 65 72 6c 6f 63 6b 20 7b 0a 20 20  t Superlock {.  
2b70: 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20  sqlite3 *db;    
2b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b90: 2f 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e 64  /* Database hand
2ba0: 6c 65 20 75 73 65 64 20 74 6f 20 6c 6f 63 6b 20  le used to lock 
2bb0: 64 62 20 2a 2f 0a 20 20 69 6e 74 20 62 57 61 6c  db */.  int bWal
2bc0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2bd0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2be0: 69 66 20 64 62 20 69 73 20 61 20 57 41 4c 20 64  if db is a WAL d
2bf0: 61 74 61 62 61 73 65 20 2a 2f 0a 7d 3b 0a 74 79  atabase */.};.ty
2c00: 70 65 64 65 66 20 73 74 72 75 63 74 20 53 75 70  pedef struct Sup
2c10: 65 72 6c 6f 63 6b 20 53 75 70 65 72 6c 6f 63 6b  erlock Superlock
2c20: 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 43 74  ;../*.** The pCt
2c30: 78 20 70 6f 69 6e 74 65 72 20 70 61 73 73 65 64  x pointer passed
2c40: 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
2c50: 6e 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61 20  n is actually a 
2c60: 70 6f 69 6e 74 65 72 20 74 6f 20 61 0a 2a 2a 20  pointer to a.** 
2c70: 53 75 70 65 72 6c 6f 63 6b 42 75 73 79 20 73 74  SuperlockBusy st
2c80: 72 75 63 74 75 72 65 2e 20 49 6e 76 6f 6b 65 20  ructure. Invoke 
2c90: 74 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72  the busy-handler
2ca0: 20 66 75 6e 63 74 69 6f 6e 20 65 6e 63 61 70 73   function encaps
2cb0: 75 6c 61 74 65 64 0a 2a 2a 20 62 79 20 74 68 65  ulated.** by the
2cc0: 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 72   structure and r
2cd0: 65 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74  eturn the result
2ce0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2cf0: 73 75 70 65 72 6c 6f 63 6b 42 75 73 79 48 61 6e  superlockBusyHan
2d00: 64 6c 65 72 28 76 6f 69 64 20 2a 70 43 74 78 2c  dler(void *pCtx,
2d10: 20 69 6e 74 20 55 4e 55 53 45 44 29 7b 0a 20 20   int UNUSED){.  
2d20: 53 75 70 65 72 6c 6f 63 6b 42 75 73 79 20 2a 70  SuperlockBusy *p
2d30: 42 75 73 79 20 3d 20 28 53 75 70 65 72 6c 6f 63  Busy = (Superloc
2d40: 6b 42 75 73 79 20 2a 29 70 43 74 78 3b 0a 20 20  kBusy *)pCtx;.  
2d50: 69 66 28 20 70 42 75 73 79 2d 3e 78 42 75 73 79  if( pBusy->xBusy
2d60: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
2d70: 20 20 72 65 74 75 72 6e 20 70 42 75 73 79 2d 3e    return pBusy->
2d80: 78 42 75 73 79 28 70 42 75 73 79 2d 3e 70 42 75  xBusy(pBusy->pBu
2d90: 73 79 41 72 67 2c 20 70 42 75 73 79 2d 3e 6e 42  syArg, pBusy->nB
2da0: 75 73 79 2b 2b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  usy++);.}../*.**
2db0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
2dc0: 73 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d  s used to determ
2dd0: 69 6e 65 20 69 66 20 74 68 65 20 6d 61 69 6e 20  ine if the main 
2de0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f  database file fo
2df0: 72 20 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e  r .** connection
2e00: 20 64 62 20 69 73 20 6f 70 65 6e 20 69 6e 20 57   db is open in W
2e10: 41 4c 20 6d 6f 64 65 20 6f 72 20 6e 6f 74 2e 20  AL mode or not. 
2e20: 49 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75  If no error occu
2e30: 72 73 20 61 6e 64 20 74 68 65 0a 2a 2a 20 64 61  rs and the.** da
2e40: 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 69  tabase file is i
2e50: 6e 20 57 41 4c 20 6d 6f 64 65 2c 20 73 65 74 20  n WAL mode, set 
2e60: 2a 70 62 57 61 6c 20 74 6f 20 74 72 75 65 20 61  *pbWal to true a
2e70: 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  nd return SQLITE
2e80: 5f 4f 4b 2e 0a 2a 2a 20 49 66 20 69 74 20 69 73  _OK..** If it is
2e90: 20 6e 6f 74 20 69 6e 20 57 41 4c 20 6d 6f 64 65   not in WAL mode
2ea0: 2c 20 73 65 74 20 2a 70 62 57 61 6c 20 74 6f 20  , set *pbWal to 
2eb0: 66 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  false..**.** If 
2ec0: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
2ed0: 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74   return an SQLit
2ee0: 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 54 68  e error code. Th
2ef0: 65 20 76 61 6c 75 65 20 6f 66 20 2a 70 62 57 61  e value of *pbWa
2f00: 6c 0a 2a 2a 20 69 73 20 75 6e 64 65 66 69 6e 65  l.** is undefine
2f10: 64 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  d in this case..
2f20: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 75  */.static int su
2f30: 70 65 72 6c 6f 63 6b 49 73 57 61 6c 28 53 75 70  perlockIsWal(Sup
2f40: 65 72 6c 6f 63 6b 20 2a 70 4c 6f 63 6b 29 7b 0a  erlock *pLock){.
2f50: 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
2f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f70: 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65    /* Return Code
2f80: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74   */.  sqlite3_st
2f90: 6d 74 20 2a 70 53 74 6d 74 3b 20 20 20 20 20 20  mt *pStmt;      
2fa0: 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 69 6c 65        /* Compile
2fb0: 64 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c  d PRAGMA journal
2fc0: 5f 6d 6f 64 65 20 73 74 61 74 65 6d 65 6e 74 20  _mode statement 
2fd0: 2a 2f 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  */..  rc = sqlit
2fe0: 65 33 5f 70 72 65 70 61 72 65 28 70 4c 6f 63 6b  e3_prepare(pLock
2ff0: 2d 3e 64 62 2c 20 22 50 52 41 47 4d 41 20 6d 61  ->db, "PRAGMA ma
3000: 69 6e 2e 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 22  in.journal_mode"
3010: 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29  , -1, &pStmt, 0)
3020: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
3030: 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
3040: 63 3b 0a 0a 20 20 70 4c 6f 63 6b 2d 3e 62 57 61  c;..  pLock->bWa
3050: 6c 20 3d 20 30 3b 0a 20 20 69 66 28 20 53 51 4c  l = 0;.  if( SQL
3060: 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33  ITE_ROW==sqlite3
3070: 5f 73 74 65 70 28 70 53 74 6d 74 29 20 29 7b 0a  _step(pStmt) ){.
3080: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
3090: 7a 4d 6f 64 65 20 3d 20 28 63 6f 6e 73 74 20 63  zMode = (const c
30a0: 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 63 6f  har *)sqlite3_co
30b0: 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c  lumn_text(pStmt,
30c0: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 7a 4d 6f   0);.    if( zMo
30d0: 64 65 20 26 26 20 73 74 72 6c 65 6e 28 7a 4d 6f  de && strlen(zMo
30e0: 64 65 29 3d 3d 33 20 26 26 20 73 71 6c 69 74 65  de)==3 && sqlite
30f0: 33 5f 73 74 72 6e 69 63 6d 70 28 22 77 61 6c 22  3_strnicmp("wal"
3100: 2c 20 7a 4d 6f 64 65 2c 20 33 29 3d 3d 30 20 29  , zMode, 3)==0 )
3110: 7b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 62  {.      pLock->b
3120: 57 61 6c 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  Wal = 1;.    }. 
3130: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 73 71 6c   }..  return sql
3140: 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
3150: 74 6d 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f  tmt);.}../*.** O
3160: 62 74 61 69 6e 20 61 6e 20 65 78 63 6c 75 73 69  btain an exclusi
3170: 76 65 20 73 68 6d 2d 6c 6f 63 6b 20 6f 6e 20 6e  ve shm-lock on n
3180: 42 79 74 65 20 62 79 74 65 73 20 73 74 61 72 74  Byte bytes start
3190: 69 6e 67 20 61 74 20 6f 66 66 73 65 74 20 69 64  ing at offset id
31a0: 78 0a 2a 2a 20 6f 66 20 74 68 65 20 66 69 6c 65  x.** of the file
31b0: 20 66 64 2e 20 49 66 20 74 68 65 20 6c 6f 63 6b   fd. If the lock
31c0: 20 63 61 6e 6e 6f 74 20 62 65 20 6f 62 74 61 69   cannot be obtai
31d0: 6e 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 2c  ned immediately,
31e0: 20 69 6e 76 6f 6b 65 0a 2a 2a 20 74 68 65 20 62   invoke.** the b
31f0: 75 73 79 2d 68 61 6e 64 6c 65 72 20 75 6e 74 69  usy-handler unti
3200: 6c 20 65 69 74 68 65 72 20 69 74 20 69 73 20 6f  l either it is o
3210: 62 74 61 69 6e 65 64 20 6f 72 20 74 68 65 20 62  btained or the b
3220: 75 73 79 2d 68 61 6e 64 6c 65 72 0a 2a 2a 20 63  usy-handler.** c
3230: 61 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73 20  allback returns 
3240: 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  0..*/.static int
3250: 20 73 75 70 65 72 6c 6f 63 6b 53 68 6d 4c 6f 63   superlockShmLoc
3260: 6b 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  k(.  sqlite3_fil
3270: 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20  e *fd,          
3280: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
3290: 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a   file handle */.
32a0: 20 20 69 6e 74 20 69 64 78 2c 20 20 20 20 20 20    int idx,      
32b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32c0: 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 73    /* Offset of s
32d0: 68 6d 2d 6c 6f 63 6b 20 74 6f 20 6f 62 74 61 69  hm-lock to obtai
32e0: 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65  n */.  int nByte
32f0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
3300: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
3310: 20 6f 66 20 63 6f 6e 73 65 63 74 69 76 65 20 62   of consective b
3320: 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a  ytes to lock */.
3330: 20 20 53 75 70 65 72 6c 6f 63 6b 42 75 73 79 20    SuperlockBusy 
3340: 2a 70 42 75 73 79 20 20 20 20 20 20 20 20 20 20  *pBusy          
3350: 20 20 2f 2a 20 42 75 73 79 2d 68 61 6e 64 6c 65    /* Busy-handle
3360: 72 20 77 72 61 70 70 65 72 20 6f 62 6a 65 63 74  r wrapper object
3370: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
3380: 0a 20 20 69 6e 74 20 28 2a 78 53 68 6d 4c 6f 63  .  int (*xShmLoc
3390: 6b 29 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  k)(sqlite3_file*
33a0: 2c 20 69 6e 74 2c 20 69 6e 74 2c 20 69 6e 74 29  , int, int, int)
33b0: 20 3d 20 66 64 2d 3e 70 4d 65 74 68 6f 64 73 2d   = fd->pMethods-
33c0: 3e 78 53 68 6d 4c 6f 63 6b 3b 0a 20 20 64 6f 20  >xShmLock;.  do 
33d0: 7b 0a 20 20 20 20 72 63 20 3d 20 78 53 68 6d 4c  {.    rc = xShmL
33e0: 6f 63 6b 28 66 64 2c 20 69 64 78 2c 20 6e 42 79  ock(fd, idx, nBy
33f0: 74 65 2c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 4c  te, SQLITE_SHM_L
3400: 4f 43 4b 7c 53 51 4c 49 54 45 5f 53 48 4d 5f 45  OCK|SQLITE_SHM_E
3410: 58 43 4c 55 53 49 56 45 29 3b 0a 20 20 7d 77 68  XCLUSIVE);.  }wh
3420: 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
3430: 42 55 53 59 20 26 26 20 73 75 70 65 72 6c 6f 63  BUSY && superloc
3440: 6b 42 75 73 79 48 61 6e 64 6c 65 72 28 28 76 6f  kBusyHandler((vo
3450: 69 64 20 2a 29 70 42 75 73 79 2c 20 30 29 20 29  id *)pBusy, 0) )
3460: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
3470: 0a 0a 2f 2a 0a 2a 2a 20 4f 62 74 61 69 6e 20 74  ../*.** Obtain t
3480: 68 65 20 65 78 74 72 61 20 6c 6f 63 6b 73 20 6f  he extra locks o
3490: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
34a0: 69 6c 65 20 72 65 71 75 69 72 65 64 20 66 6f 72  ile required for
34b0: 20 57 41 4c 20 64 61 74 61 62 61 73 65 73 2e 0a   WAL databases..
34c0: 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 73 75  ** Invoke the su
34d0: 70 70 6c 69 65 64 20 62 75 73 79 2d 68 61 6e 64  pplied busy-hand
34e0: 6c 65 72 20 61 73 20 72 65 71 75 69 72 65 64 2e  ler as required.
34f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
3500: 75 70 65 72 6c 6f 63 6b 57 61 6c 4c 6f 63 6b 28  uperlockWalLock(
3510: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
3520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3530: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68     /* Database h
3540: 61 6e 64 6c 65 20 6f 70 65 6e 20 6f 6e 20 57 41  andle open on WA
3550: 4c 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  L database */.  
3560: 53 75 70 65 72 6c 6f 63 6b 42 75 73 79 20 2a 70  SuperlockBusy *p
3570: 42 75 73 79 20 20 20 20 20 20 20 20 20 20 20 20  Busy            
3580: 2f 2a 20 42 75 73 79 20 68 61 6e 64 6c 65 72 20  /* Busy handler 
3590: 77 72 61 70 70 65 72 20 6f 62 6a 65 63 74 20 2a  wrapper object *
35a0: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  /.){.  int rc;  
35b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35c0: 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
35d0: 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74   code */.  sqlit
35e0: 65 33 5f 66 69 6c 65 20 2a 66 64 20 3d 20 30 3b  e3_file *fd = 0;
35f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
3600: 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
3610: 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 76 6f 69   handle */.  voi
3620: 64 20 76 6f 6c 61 74 69 6c 65 20 2a 70 20 3d 20  d volatile *p = 
3630: 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0;           /* 
3640: 50 6f 69 6e 74 65 72 20 74 6f 20 66 69 72 73 74  Pointer to first
3650: 20 70 61 67 65 20 6f 66 20 73 68 61 72 65 64 20   page of shared 
3660: 6d 65 6d 6f 72 79 20 2a 2f 0a 0a 20 20 2f 2a 20  memory */..  /* 
3670: 4f 62 74 61 69 6e 20 61 20 70 6f 69 6e 74 65 72  Obtain a pointer
3680: 20 74 6f 20 74 68 65 20 73 71 6c 69 74 65 33 5f   to the sqlite3_
3690: 66 69 6c 65 20 6f 62 6a 65 63 74 20 6f 70 65 6e  file object open
36a0: 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20 64 62 20   on the main db 
36b0: 66 69 6c 65 2e 20 2a 2f 0a 20 20 72 63 20 3d 20  file. */.  rc = 
36c0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e  sqlite3_file_con
36d0: 74 72 6f 6c 28 64 62 2c 20 22 6d 61 69 6e 22 2c  trol(db, "main",
36e0: 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 46 49   SQLITE_FCNTL_FI
36f0: 4c 45 5f 50 4f 49 4e 54 45 52 2c 20 28 76 6f 69  LE_POINTER, (voi
3700: 64 20 2a 29 26 66 64 29 3b 0a 20 20 69 66 28 20  d *)&fd);.  if( 
3710: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
3720: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a  return rc;..  /*
3730: 20 4f 62 74 61 69 6e 20 74 68 65 20 22 72 65 63   Obtain the "rec
3740: 6f 76 65 72 79 22 20 6c 6f 63 6b 2e 20 4e 6f 72  overy" lock. Nor
3750: 6d 61 6c 6c 79 2c 20 74 68 69 73 20 6c 6f 63 6b  mally, this lock
3760: 20 69 73 20 6f 6e 6c 79 20 6f 62 74 61 69 6e 65   is only obtaine
3770: 64 20 62 79 0a 20 20 2a 2a 20 63 6c 69 65 6e 74  d by.  ** client
3780: 73 20 72 75 6e 6e 69 6e 67 20 64 61 74 61 62 61  s running databa
3790: 73 65 20 72 65 63 6f 76 65 72 79 2e 20 20 0a 20  se recovery.  . 
37a0: 20 2a 2f 0a 20 20 72 63 20 3d 20 73 75 70 65 72   */.  rc = super
37b0: 6c 6f 63 6b 53 68 6d 4c 6f 63 6b 28 66 64 2c 20  lockShmLock(fd, 
37c0: 32 2c 20 31 2c 20 70 42 75 73 79 29 3b 0a 20 20  2, 1, pBusy);.  
37d0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
37e0: 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  K ) return rc;..
37f0: 20 20 2f 2a 20 5a 65 72 6f 20 74 68 65 20 73 74    /* Zero the st
3800: 61 72 74 20 6f 66 20 74 68 65 20 66 69 72 73 74  art of the first
3810: 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 70   shared-memory p
3820: 61 67 65 2e 20 54 68 69 73 20 6d 65 61 6e 73 20  age. This means 
3830: 74 68 61 74 20 61 6e 79 0a 20 20 2a 2a 20 63 6c  that any.  ** cl
3840: 69 65 6e 74 73 20 74 68 61 74 20 6f 70 65 6e 20  ients that open 
3850: 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72  read or write tr
3860: 61 6e 73 61 63 74 69 6f 6e 73 20 66 72 6f 6d 20  ansactions from 
3870: 74 68 69 73 20 70 6f 69 6e 74 20 6f 6e 20 77 69  this point on wi
3880: 6c 6c 0a 20 20 2a 2a 20 68 61 76 65 20 74 6f 20  ll.  ** have to 
3890: 72 75 6e 20 72 65 63 6f 76 65 72 79 20 62 65 66  run recovery bef
38a0: 6f 72 65 20 70 72 6f 63 65 65 64 69 6e 67 2e 20  ore proceeding. 
38b0: 53 69 6e 63 65 20 74 68 65 79 20 6e 65 65 64 20  Since they need 
38c0: 74 68 65 20 22 72 65 63 6f 76 65 72 79 22 0a 20  the "recovery". 
38d0: 20 2a 2a 20 6c 6f 63 6b 20 74 68 61 74 20 74 68   ** lock that th
38e0: 69 73 20 70 72 6f 63 65 73 73 20 69 73 20 68 6f  is process is ho
38f0: 6c 64 69 6e 67 20 74 6f 20 64 6f 20 74 68 61 74  lding to do that
3900: 2c 20 6e 6f 20 6e 65 77 20 72 65 61 64 20 6f 72  , no new read or
3910: 20 77 72 69 74 65 0a 20 20 2a 2a 20 74 72 61 6e   write.  ** tran
3920: 73 61 63 74 69 6f 6e 73 20 6d 61 79 20 6e 6f 77  sactions may now
3930: 20 62 65 20 6f 70 65 6e 65 64 2e 20 4e 6f 72 20   be opened. Nor 
3940: 63 61 6e 20 61 20 63 68 65 63 6b 70 6f 69 6e 74  can a checkpoint
3950: 20 62 65 20 72 75 6e 2c 20 66 6f 72 20 74 68 65   be run, for the
3960: 0a 20 20 2a 2a 20 73 61 6d 65 20 72 65 61 73 6f  .  ** same reaso
3970: 6e 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 66  n..  */.  rc = f
3980: 64 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 53 68  d->pMethods->xSh
3990: 6d 4d 61 70 28 66 64 2c 20 30 2c 20 33 32 2a 31  mMap(fd, 0, 32*1
39a0: 30 32 34 2c 20 31 2c 20 26 70 29 3b 0a 20 20 69  024, 1, &p);.  i
39b0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
39c0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
39d0: 6d 65 6d 73 65 74 28 28 76 6f 69 64 20 2a 29 70  memset((void *)p
39e0: 2c 20 30 2c 20 33 32 29 3b 0a 0a 20 20 2f 2a 20  , 0, 32);..  /* 
39f0: 4f 62 74 61 69 6e 20 65 78 63 6c 75 73 69 76 65  Obtain exclusive
3a00: 20 6c 6f 63 6b 73 20 6f 6e 20 61 6c 6c 20 74 68   locks on all th
3a10: 65 20 22 72 65 61 64 2d 6c 6f 63 6b 22 20 73 6c  e "read-lock" sl
3a20: 6f 74 73 2e 20 4f 6e 63 65 20 74 68 65 73 65 20  ots. Once these 
3a30: 6c 6f 63 6b 73 0a 20 20 2a 2a 20 61 72 65 20 68  locks.  ** are h
3a40: 65 6c 64 2c 20 69 74 20 69 73 20 67 75 61 72 61  eld, it is guara
3a50: 6e 74 65 65 64 20 74 68 61 74 20 74 68 65 72 65  nteed that there
3a60: 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 72   are no active r
3a70: 65 61 64 65 72 2c 20 77 72 69 74 65 72 20 6f 72  eader, writer or
3a80: 20 0a 20 20 2a 2a 20 63 68 65 63 6b 70 6f 69 6e   .  ** checkpoin
3a90: 74 65 72 20 63 6c 69 65 6e 74 73 2e 0a 20 20 2a  ter clients..  *
3aa0: 2f 0a 20 20 72 63 20 3d 20 73 75 70 65 72 6c 6f  /.  rc = superlo
3ab0: 63 6b 53 68 6d 4c 6f 63 6b 28 66 64 2c 20 33 2c  ckShmLock(fd, 3,
3ac0: 20 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43   SQLITE_SHM_NLOC
3ad0: 4b 2d 33 2c 20 70 42 75 73 79 29 3b 0a 20 20 72  K-3, pBusy);.  r
3ae0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
3af0: 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 73 75 70  ** Release a sup
3b00: 65 72 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 61  erlock held on a
3b10: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
3b20: 54 68 65 20 61 72 67 75 6d 65 6e 74 20 70 61 73  The argument pas
3b30: 73 65 64 20 74 6f 20 0a 2a 2a 20 74 68 69 73 20  sed to .** this 
3b40: 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 68 61  function must ha
3b50: 76 65 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64  ve been obtained
3b60: 20 66 72 6f 6d 20 61 20 73 75 63 63 65 73 73 66   from a successf
3b70: 75 6c 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20 73 71  ul call to.** sq
3b80: 6c 69 74 65 33 64 65 6d 6f 5f 73 75 70 65 72 6c  lite3demo_superl
3b90: 6f 63 6b 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  ock()..*/.static
3ba0: 20 76 6f 69 64 20 73 71 6c 69 74 65 33 64 65 6d   void sqlite3dem
3bb0: 6f 5f 73 75 70 65 72 75 6e 6c 6f 63 6b 28 76 6f  o_superunlock(vo
3bc0: 69 64 20 2a 70 4c 6f 63 6b 29 7b 0a 20 20 53 75  id *pLock){.  Su
3bd0: 70 65 72 6c 6f 63 6b 20 2a 70 20 3d 20 28 53 75  perlock *p = (Su
3be0: 70 65 72 6c 6f 63 6b 20 2a 29 70 4c 6f 63 6b 3b  perlock *)pLock;
3bf0: 0a 20 20 69 66 28 20 70 2d 3e 62 57 61 6c 20 29  .  if( p->bWal )
3c00: 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 20 20 20  {.    int rc;   
3c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c20: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
3c30: 63 6f 64 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20  code */.    int 
3c40: 66 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53  flags = SQLITE_S
3c50: 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49  HM_UNLOCK | SQLI
3c60: 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45  TE_SHM_EXCLUSIVE
3c70: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69  ;.    sqlite3_fi
3c80: 6c 65 20 2a 66 64 20 3d 20 30 3b 0a 20 20 20 20  le *fd = 0;.    
3c90: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c  rc = sqlite3_fil
3ca0: 65 5f 63 6f 6e 74 72 6f 6c 28 70 2d 3e 64 62 2c  e_control(p->db,
3cb0: 20 22 6d 61 69 6e 22 2c 20 53 51 4c 49 54 45 5f   "main", SQLITE_
3cc0: 46 43 4e 54 4c 5f 46 49 4c 45 5f 50 4f 49 4e 54  FCNTL_FILE_POINT
3cd0: 45 52 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ER,.            
3ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3cf0: 20 28 76 6f 69 64 20 2a 29 26 66 64 29 3b 0a 20   (void *)&fd);. 
3d00: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
3d10: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 66 64  E_OK ){.      fd
3d20: 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 53 68 6d  ->pMethods->xShm
3d30: 4c 6f 63 6b 28 66 64 2c 20 32 2c 20 31 2c 20 66  Lock(fd, 2, 1, f
3d40: 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 66 64 2d  lags);.      fd-
3d50: 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 53 68 6d 4c  >pMethods->xShmL
3d60: 6f 63 6b 28 66 64 2c 20 33 2c 20 53 51 4c 49 54  ock(fd, 3, SQLIT
3d70: 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 2d 33 2c 20 66  E_SHM_NLOCK-3, f
3d80: 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  lags);.    }.  }
3d90: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65  .  sqlite3_close
3da0: 28 70 2d 3e 64 62 29 3b 0a 20 20 73 71 6c 69 74  (p->db);.  sqlit
3db0: 65 33 5f 66 72 65 65 28 70 29 3b 0a 7d 0a 0a 2f  e3_free(p);.}../
3dc0: 2a 0a 2a 2a 20 4f 62 74 61 69 6e 20 61 20 73 75  *.** Obtain a su
3dd0: 70 65 72 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  perlock on the d
3de0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 64 65  atabase file ide
3df0: 6e 74 69 66 69 65 64 20 62 79 20 7a 50 61 74 68  ntified by zPath
3e00: 2c 20 75 73 69 6e 67 20 74 68 65 0a 2a 2a 20 6c  , using the.** l
3e10: 6f 63 6b 69 6e 67 20 70 72 69 6d 69 74 69 76 65  ocking primitive
3e20: 73 20 70 72 6f 76 69 64 65 64 20 62 79 20 56 46  s provided by VF
3e30: 53 20 7a 56 66 73 2e 20 49 66 20 73 75 63 63 65  S zVfs. If succe
3e40: 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b  ssful, SQLITE_OK
3e50: 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20   is.** returned 
3e60: 61 6e 64 20 6f 75 74 70 75 74 20 76 61 72 69 61  and output varia
3e70: 62 6c 65 20 2a 70 70 4c 6f 63 6b 20 69 73 20 70  ble *ppLock is p
3e80: 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 61 6e  opulated with an
3e90: 20 6f 70 61 71 75 65 20 68 61 6e 64 6c 65 0a 2a   opaque handle.*
3ea0: 2a 20 74 68 61 74 20 6d 61 79 20 62 65 20 75 73  * that may be us
3eb0: 65 64 20 77 69 74 68 20 73 71 6c 69 74 65 33 64  ed with sqlite3d
3ec0: 65 6d 6f 5f 73 75 70 65 72 75 6e 6c 6f 63 6b 28  emo_superunlock(
3ed0: 29 20 74 6f 20 72 65 6c 65 61 73 65 20 74 68 65  ) to release the
3ee0: 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   lock..**.** If 
3ef0: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
3f00: 20 2a 70 70 4c 6f 63 6b 20 69 73 20 73 65 74 20   *ppLock is set 
3f10: 74 6f 20 30 20 61 6e 64 20 61 6e 20 53 51 4c 69  to 0 and an SQLi
3f20: 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 0a 2a  te error code .*
3f30: 2a 20 28 65 2e 67 2e 20 53 51 4c 49 54 45 5f 42  * (e.g. SQLITE_B
3f40: 55 53 59 29 20 69 73 20 72 65 74 75 72 6e 65 64  USY) is returned
3f50: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 72 65 71  ..**.** If a req
3f60: 75 69 72 65 64 20 6c 6f 63 6b 20 63 61 6e 6e 6f  uired lock canno
3f70: 74 20 62 65 20 6f 62 74 61 69 6e 65 64 20 69 6d  t be obtained im
3f80: 6d 65 64 69 61 74 65 6c 79 20 61 6e 64 20 74 68  mediately and th
3f90: 65 20 78 42 75 73 79 20 70 61 72 61 6d 65 74 65  e xBusy paramete
3fa0: 72 0a 2a 2a 20 74 6f 20 74 68 69 73 20 66 75 6e  r.** to this fun
3fb0: 63 74 69 6f 6e 20 69 73 20 6e 6f 74 20 4e 55 4c  ction is not NUL
3fc0: 4c 2c 20 74 68 65 6e 20 78 42 75 73 79 20 69 73  L, then xBusy is
3fd0: 20 69 6e 76 6f 6b 65 64 20 69 6e 20 74 68 65 20   invoked in the 
3fe0: 73 61 6d 65 20 77 61 79 0a 2a 2a 20 61 73 20 61  same way.** as a
3ff0: 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 72 65   busy-handler re
4000: 67 69 73 74 65 72 65 64 20 77 69 74 68 20 53 51  gistered with SQ
4010: 4c 69 74 65 20 28 75 73 69 6e 67 20 73 71 6c 69  Lite (using sqli
4020: 74 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65 72  te3_busy_handler
4030: 28 29 29 0a 2a 2a 20 75 6e 74 69 6c 20 65 69 74  ()).** until eit
4040: 68 65 72 20 74 68 65 20 6c 6f 63 6b 20 63 61 6e  her the lock can
4050: 20 62 65 20 6f 62 74 61 69 6e 65 64 20 6f 72 20   be obtained or 
4060: 74 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72  the busy-handler
4070: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
4080: 73 0a 2a 2a 20 30 20 28 69 6e 64 69 63 61 74 69  s.** 0 (indicati
4090: 6e 67 20 22 67 69 76 65 20 75 70 22 29 2e 0a 2a  ng "give up")..*
40a0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c  /.static int sql
40b0: 69 74 65 33 64 65 6d 6f 5f 73 75 70 65 72 6c 6f  ite3demo_superlo
40c0: 63 6b 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  ck(.  const char
40d0: 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20   *zPath,        
40e0: 20 20 20 20 20 20 2f 2a 20 50 61 74 68 20 74 6f        /* Path to
40f0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
4100: 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 63 6f 6e 73  o lock */.  cons
4110: 74 20 63 68 61 72 20 2a 7a 56 66 73 2c 20 20 20  t char *zVfs,   
4120: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
4130: 46 53 20 74 6f 20 75 73 65 20 74 6f 20 61 63 63  FS to use to acc
4140: 65 73 73 20 64 61 74 61 62 61 73 65 20 66 69 6c  ess database fil
4150: 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  e */.  int flags
4160: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
4170: 20 20 20 20 2f 2a 20 41 64 64 69 74 69 6f 6e 61      /* Additiona
4180: 6c 20 66 6c 61 67 73 20 74 6f 20 70 61 73 73 20  l flags to pass 
4190: 74 6f 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f  to sqlite3_open_
41a0: 76 32 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 42  v2 */.  int (*xB
41b0: 75 73 79 29 28 76 6f 69 64 2a 2c 69 6e 74 29 2c  usy)(void*,int),
41c0: 20 20 20 20 20 20 20 20 2f 2a 20 42 75 73 79 20          /* Busy 
41d0: 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b  handler callback
41e0: 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 73   */.  void *pBus
41f0: 79 41 72 67 2c 20 20 20 20 20 20 20 20 20 20 20  yArg,           
4200: 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74        /* Context
4210: 20 61 72 67 20 66 6f 72 20 62 75 73 79 20 68 61   arg for busy ha
4220: 6e 64 6c 65 72 20 2a 2f 0a 20 20 76 6f 69 64 20  ndler */.  void 
4230: 2a 2a 70 70 4c 6f 63 6b 20 20 20 20 20 20 20 20  **ppLock        
4240: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
4250: 54 3a 20 43 6f 6e 74 65 78 74 20 74 6f 20 70 61  T: Context to pa
4260: 73 73 20 74 6f 20 73 75 70 65 72 75 6e 6c 6f 63  ss to superunloc
4270: 6b 28 29 20 2a 2f 0a 29 7b 0a 20 20 53 75 70 65  k() */.){.  Supe
4280: 72 6c 6f 63 6b 42 75 73 79 20 62 75 73 79 20 3d  rlockBusy busy =
4290: 20 7b 30 2c 20 30 2c 20 30 7d 3b 20 2f 2a 20 42   {0, 0, 0}; /* B
42a0: 75 73 79 20 68 61 6e 64 6c 65 72 20 77 72 61 70  usy handler wrap
42b0: 70 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  per object */.  
42c0: 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
42d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
42e0: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
42f0: 2f 0a 20 20 53 75 70 65 72 6c 6f 63 6b 20 2a 70  /.  Superlock *p
4300: 4c 6f 63 6b 3b 0a 0a 20 20 70 4c 6f 63 6b 20 3d  Lock;..  pLock =
4310: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
4320: 73 69 7a 65 6f 66 28 53 75 70 65 72 6c 6f 63 6b  sizeof(Superlock
4330: 29 29 3b 0a 20 20 69 66 28 20 21 70 4c 6f 63 6b  ));.  if( !pLock
4340: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
4350: 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d 65 6d 73 65 74  _NOMEM;.  memset
4360: 28 70 4c 6f 63 6b 2c 20 30 2c 20 73 69 7a 65 6f  (pLock, 0, sizeo
4370: 66 28 53 75 70 65 72 6c 6f 63 6b 29 29 3b 0a 0a  f(Superlock));..
4380: 20 20 2f 2a 20 4f 70 65 6e 20 61 20 64 61 74 61    /* Open a data
4390: 62 61 73 65 20 68 61 6e 64 6c 65 20 6f 6e 20 74  base handle on t
43a0: 68 65 20 66 69 6c 65 20 74 6f 20 73 75 70 65 72  he file to super
43b0: 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 72 63 20 3d 20  lock. */.  rc = 
43c0: 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28  sqlite3_open_v2(
43d0: 0a 20 20 20 20 20 20 7a 50 61 74 68 2c 20 26 70  .      zPath, &p
43e0: 4c 6f 63 6b 2d 3e 64 62 2c 20 53 51 4c 49 54 45  Lock->db, SQLITE
43f0: 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c  _OPEN_READWRITE|
4400: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
4410: 54 45 7c 66 6c 61 67 73 2c 20 7a 56 66 73 0a 20  TE|flags, zVfs. 
4420: 20 29 3b 0a 0a 20 20 2f 2a 20 49 6e 73 74 61 6c   );..  /* Instal
4430: 6c 20 61 20 62 75 73 79 2d 68 61 6e 64 6c 65 72  l a busy-handler
4440: 20 61 6e 64 20 65 78 65 63 75 74 65 20 61 20 42   and execute a B
4450: 45 47 49 4e 20 45 58 43 4c 55 53 49 56 45 2e 20  EGIN EXCLUSIVE. 
4460: 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74 0a 20  If this is not. 
4470: 20 2a 2a 20 61 20 57 41 4c 20 64 61 74 61 62 61   ** a WAL databa
4480: 73 65 2c 20 74 68 69 73 20 69 73 20 61 6c 6c 20  se, this is all 
4490: 77 65 20 6e 65 65 64 20 74 6f 20 64 6f 2e 20 20  we need to do.  
44a0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 77 72 61  .  **.  ** A wra
44b0: 70 70 65 72 20 66 75 6e 63 74 69 6f 6e 20 69 73  pper function is
44c0: 20 75 73 65 64 20 74 6f 20 69 6e 76 6f 6b 65 20   used to invoke 
44d0: 74 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72  the busy-handler
44e0: 20 69 6e 73 74 65 61 64 20 6f 66 0a 20 20 2a 2a   instead of.  **
44f0: 20 72 65 67 69 73 74 65 72 69 6e 67 20 74 68 65   registering the
4500: 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 66 75   busy-handler fu
4510: 6e 63 74 69 6f 6e 20 73 75 70 70 6c 69 65 64 20  nction supplied 
4520: 62 79 20 74 68 65 20 75 73 65 72 20 64 69 72 65  by the user dire
4530: 63 74 6c 79 0a 20 20 2a 2a 20 77 69 74 68 20 53  ctly.  ** with S
4540: 51 4c 69 74 65 2e 20 54 68 69 73 20 69 73 20 62  QLite. This is b
4550: 65 63 61 75 73 65 20 74 68 65 20 73 61 6d 65 20  ecause the same 
4560: 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 66 75 6e  busy-handler fun
4570: 63 74 69 6f 6e 20 6d 61 79 20 62 65 0a 20 20 2a  ction may be.  *
4580: 2a 20 69 6e 76 6f 6b 65 64 20 64 69 72 65 63 74  * invoked direct
4590: 6c 79 20 6c 61 74 65 72 20 6f 6e 20 77 68 65 6e  ly later on when
45a0: 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 6f   attempting to o
45b0: 62 74 61 69 6e 20 74 68 65 20 65 78 74 72 61 20  btain the extra 
45c0: 6c 6f 63 6b 73 0a 20 20 2a 2a 20 72 65 71 75 69  locks.  ** requi
45d0: 72 65 64 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2e  red in WAL mode.
45e0: 20 42 79 20 75 73 69 6e 67 20 74 68 65 20 77 72   By using the wr
45f0: 61 70 70 65 72 2c 20 77 65 20 61 72 65 20 61 62  apper, we are ab
4600: 6c 65 20 74 6f 20 67 75 61 72 61 6e 74 65 65 0a  le to guarantee.
4610: 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20 22 6e    ** that the "n
4620: 42 75 73 79 22 20 69 6e 74 65 67 65 72 20 70 61  Busy" integer pa
4630: 72 61 6d 65 74 65 72 20 70 61 73 73 65 64 20 74  rameter passed t
4640: 6f 20 74 68 65 20 75 73 65 72 73 20 62 75 73 79  o the users busy
4650: 2d 68 61 6e 64 6c 65 72 0a 20 20 2a 2a 20 72 65  -handler.  ** re
4660: 70 72 65 73 65 6e 74 73 20 74 68 65 20 74 6f 74  presents the tot
4670: 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 62 75 73  al number of bus
4680: 79 2d 68 61 6e 64 6c 65 72 20 69 6e 76 6f 63 61  y-handler invoca
4690: 74 69 6f 6e 73 20 6d 61 64 65 20 77 69 74 68 69  tions made withi
46a0: 6e 0a 20 20 2a 2a 20 74 68 69 73 20 63 61 6c 6c  n.  ** this call
46b0: 20 74 6f 20 73 71 6c 69 74 65 33 64 65 6d 6f 5f   to sqlite3demo_
46c0: 73 75 70 65 72 6c 6f 63 6b 28 29 2c 20 69 6e 63  superlock(), inc
46d0: 6c 75 64 69 6e 67 20 61 6e 79 20 6d 61 64 65 20  luding any made 
46e0: 64 75 72 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20  during the.  ** 
46f0: 22 42 45 47 49 4e 20 45 58 43 4c 55 53 49 56 45  "BEGIN EXCLUSIVE
4700: 22 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63  "..  */.  if( rc
4710: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
4720: 20 20 20 62 75 73 79 2e 78 42 75 73 79 20 3d 20     busy.xBusy = 
4730: 78 42 75 73 79 3b 0a 20 20 20 20 62 75 73 79 2e  xBusy;.    busy.
4740: 70 42 75 73 79 41 72 67 20 3d 20 70 42 75 73 79  pBusyArg = pBusy
4750: 41 72 67 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Arg;.    sqlite3
4760: 5f 62 75 73 79 5f 68 61 6e 64 6c 65 72 28 70 4c  _busy_handler(pL
4770: 6f 63 6b 2d 3e 64 62 2c 20 73 75 70 65 72 6c 6f  ock->db, superlo
4780: 63 6b 42 75 73 79 48 61 6e 64 6c 65 72 2c 20 28  ckBusyHandler, (
4790: 76 6f 69 64 20 2a 29 26 62 75 73 79 29 3b 0a 20  void *)&busy);. 
47a0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
47b0: 65 78 65 63 28 70 4c 6f 63 6b 2d 3e 64 62 2c 20  exec(pLock->db, 
47c0: 22 42 45 47 49 4e 20 45 58 43 4c 55 53 49 56 45  "BEGIN EXCLUSIVE
47d0: 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 7d  ", 0, 0, 0);.  }
47e0: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 42 45  ..  /* If the BE
47f0: 47 49 4e 20 45 58 43 4c 55 53 49 56 45 20 77 61  GIN EXCLUSIVE wa
4800: 73 20 65 78 65 63 75 74 65 64 20 73 75 63 63 65  s executed succe
4810: 73 73 66 75 6c 6c 79 20 61 6e 64 20 74 68 69 73  ssfully and this
4820: 20 69 73 20 61 20 57 41 4c 0a 20 20 2a 2a 20 64   is a WAL.  ** d
4830: 61 74 61 62 61 73 65 2c 20 63 61 6c 6c 20 73 75  atabase, call su
4840: 70 65 72 6c 6f 63 6b 57 61 6c 4c 6f 63 6b 28 29  perlockWalLock()
4850: 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 65   to obtain the e
4860: 78 74 72 61 20 6c 6f 63 6b 73 20 72 65 71 75 69  xtra locks requi
4870: 72 65 64 0a 20 20 2a 2a 20 74 6f 20 70 72 65 76  red.  ** to prev
4880: 65 6e 74 20 72 65 61 64 65 72 73 2c 20 77 72 69  ent readers, wri
4890: 74 65 72 73 20 61 6e 64 2f 6f 72 20 63 68 65 63  ters and/or chec
48a0: 6b 70 6f 69 6e 74 65 72 73 20 66 72 6f 6d 20 61  kpointers from a
48b0: 63 63 65 73 73 69 6e 67 20 74 68 65 0a 20 20 2a  ccessing the.  *
48c0: 2a 20 64 62 20 77 68 69 6c 65 20 74 68 69 73 20  * db while this 
48d0: 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64 69  process is holdi
48e0: 6e 67 20 74 68 65 20 73 75 70 65 72 6c 6f 63 6b  ng the superlock
48f0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 42 65 66 6f  ..  **.  ** Befo
4900: 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20 61 6e  re attempting an
4910: 79 20 57 41 4c 20 6c 6f 63 6b 73 2c 20 63 6f 6d  y WAL locks, com
4920: 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61 63 74  mit the transact
4930: 69 6f 6e 20 73 74 61 72 74 65 64 20 61 62 6f 76  ion started abov
4940: 65 0a 20 20 2a 2a 20 74 6f 20 64 72 6f 70 20 74  e.  ** to drop t
4950: 68 65 20 57 41 4c 20 72 65 61 64 20 61 6e 64 20  he WAL read and 
4960: 77 72 69 74 65 20 6c 6f 63 6b 73 20 63 75 72 72  write locks curr
4970: 65 6e 74 6c 79 20 68 65 6c 64 2e 20 4f 74 68 65  ently held. Othe
4980: 72 77 69 73 65 2c 20 74 68 65 0a 20 20 2a 2a 20  rwise, the.  ** 
4990: 6e 65 77 20 57 41 4c 20 6c 6f 63 6b 73 20 6d 61  new WAL locks ma
49a0: 79 20 63 6f 6e 66 6c 69 63 74 20 77 69 74 68 20  y conflict with 
49b0: 74 68 65 20 6f 6c 64 2e 0a 20 20 2a 2f 0a 20 20  the old..  */.  
49c0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
49d0: 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 53 51 4c  K ){.    if( SQL
49e0: 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 73 75  ITE_OK==(rc = su
49f0: 70 65 72 6c 6f 63 6b 49 73 57 61 6c 28 70 4c 6f  perlockIsWal(pLo
4a00: 63 6b 29 29 20 26 26 20 70 4c 6f 63 6b 2d 3e 62  ck)) && pLock->b
4a10: 57 61 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20  Wal ){.      rc 
4a20: 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70  = sqlite3_exec(p
4a30: 4c 6f 63 6b 2d 3e 64 62 2c 20 22 43 4f 4d 4d 49  Lock->db, "COMMI
4a40: 54 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  T", 0, 0, 0);.  
4a50: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
4a60: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
4a70: 20 72 63 20 3d 20 73 75 70 65 72 6c 6f 63 6b 57   rc = superlockW
4a80: 61 6c 4c 6f 63 6b 28 70 4c 6f 63 6b 2d 3e 64 62  alLock(pLock->db
4a90: 2c 20 26 62 75 73 79 29 3b 0a 20 20 20 20 20 20  , &busy);.      
4aa0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  }.    }.  }..  i
4ab0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
4ac0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 64   ){.    sqlite3d
4ad0: 65 6d 6f 5f 73 75 70 65 72 75 6e 6c 6f 63 6b 28  emo_superunlock(
4ae0: 70 4c 6f 63 6b 29 3b 0a 20 20 20 20 2a 70 70 4c  pLock);.    *ppL
4af0: 6f 63 6b 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  ock = 0;.  }else
4b00: 7b 0a 20 20 20 20 2a 70 70 4c 6f 63 6b 20 3d 20  {.    *ppLock = 
4b10: 70 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65  pLock;.  }..  re
4b20: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 41  turn rc;.}../* A
4b30: 20 63 6f 72 72 75 70 74 20 44 42 20 77 6f 6e 27   corrupt DB won'
4b40: 74 20 77 6f 72 6b 20 77 69 74 68 20 74 68 65 20  t work with the 
4b50: 73 71 6c 2d 62 61 73 65 64 20 6c 6f 63 6b 69 6e  sql-based lockin
4b60: 67 20 61 74 74 65 6d 70 74 2c 20 67 72 61 62 20  g attempt, grab 
4b70: 61 6e 20 0a 2a 2a 20 65 78 63 6c 75 73 69 76 65  an .** exclusive
4b80: 20 6c 6f 63 6b 20 61 6e 64 20 72 65 74 75 72 6e   lock and return
4b90: 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72 20 53 51   SQLITE_OK or SQ
4ba0: 4c 49 54 45 5f 42 55 53 59 20 69 66 20 74 68 65  LITE_BUSY if the
4bb0: 20 6c 6f 63 6b 20 66 61 69 6c 73 20 0a 2a 2a 20   lock fails .** 
4bc0: 72 65 74 75 72 6e 73 20 74 68 65 20 63 75 72 72  returns the curr
4bd0: 65 6e 74 20 6c 6f 63 6b 20 6c 65 76 65 6c 20 68  ent lock level h
4be0: 65 6c 64 20 6f 6e 20 73 71 6c 69 74 65 33 5f 66  eld on sqlite3_f
4bf0: 69 6c 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ile.*/.static in
4c00: 74 20 73 71 6c 69 74 65 33 64 65 6d 6f 5f 73 75  t sqlite3demo_su
4c10: 70 65 72 6c 6f 63 6b 5f 63 6f 72 72 75 70 74 28  perlock_corrupt(
4c20: 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
4c30: 2a 69 64 2c 0a 20 20 69 6e 74 20 65 54 61 72 67  *id,.  int eTarg
4c40: 65 74 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20 69 6e  etFileLock,.  in
4c50: 74 20 2a 70 46 69 6c 65 4c 6f 63 6b 0a 29 7b 0a  t *pFileLock.){.
4c60: 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
4c70: 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
4c80: 64 3b 0a 20 20 69 6e 74 20 65 46 69 6c 65 4c 6f  d;.  int eFileLo
4c90: 63 6b 20 3d 20 70 46 69 6c 65 2d 3e 65 46 69 6c  ck = pFile->eFil
4ca0: 65 4c 6f 63 6b 3b 0a 20 20 69 6e 74 20 72 63 20  eLock;.  int rc 
4cb0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 0a  = SQLITE_OK;.  .
4cc0: 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3c    if( eFileLock<
4cd0: 65 54 61 72 67 65 74 46 69 6c 65 4c 6f 63 6b 20  eTargetFileLock 
4ce0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 46 69 6c  ){.    rc = pFil
4cf0: 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63  e->pMethod->xLoc
4d00: 6b 28 69 64 2c 20 53 51 4c 49 54 45 5f 4c 4f 43  k(id, SQLITE_LOC
4d10: 4b 5f 53 48 41 52 45 44 29 3b 0a 20 20 7d 0a 20  K_SHARED);.  }. 
4d20: 20 69 66 28 20 21 72 63 20 26 26 20 53 51 4c 49   if( !rc && SQLI
4d30: 54 45 5f 4c 4f 43 4b 5f 53 48 41 52 45 44 3c 65  TE_LOCK_SHARED<e
4d40: 54 61 72 67 65 74 46 69 6c 65 4c 6f 63 6b 20 29  TargetFileLock )
4d50: 7b 0a 20 20 20 20 72 63 20 3d 20 70 46 69 6c 65  {.    rc = pFile
4d60: 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b  ->pMethod->xLock
4d70: 28 69 64 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  (id, SQLITE_LOCK
4d80: 5f 45 58 43 4c 55 53 49 56 45 29 3b 0a 20 20 7d  _EXCLUSIVE);.  }
4d90: 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
4da0: 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c   if( pFile->eFil
4db0: 65 4c 6f 63 6b 20 3e 20 65 46 69 6c 65 4c 6f 63  eLock > eFileLoc
4dc0: 6b 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  k ){.      pFile
4dd0: 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f  ->pMethod->xUnlo
4de0: 63 6b 28 69 64 2c 20 65 46 69 6c 65 4c 6f 63 6b  ck(id, eFileLock
4df0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  );.    }.    ret
4e00: 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66  urn rc;.  }.  if
4e10: 20 28 70 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20   (pFileLock) {. 
4e20: 20 20 20 2a 70 46 69 6c 65 4c 6f 63 6b 20 3d 20     *pFileLock = 
4e30: 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 7d 0a 20  eFileLock;.  }. 
4e40: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
4e50: 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  K;.}..static int
4e60: 20 73 71 6c 69 74 65 33 64 65 6d 6f 5f 73 75 70   sqlite3demo_sup
4e70: 65 72 75 6e 6c 6f 63 6b 5f 63 6f 72 72 75 70 74  erunlock_corrupt
4e80: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
4e90: 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b  d, int eFileLock
4ea0: 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  ) {.  unixFile *
4eb0: 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
4ec0: 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20 72 63 20  e*)id;.  int rc 
4ed0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 0a  = SQLITE_OK;.  .
4ee0: 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69    if( pFile->eFi
4ef0: 6c 65 4c 6f 63 6b 20 3e 20 65 46 69 6c 65 4c 6f  leLock > eFileLo
4f00: 63 6b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  ck ){.    rc = p
4f10: 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78  File->pMethod->x
4f20: 55 6e 6c 6f 63 6b 28 69 64 2c 20 53 51 4c 49 54  Unlock(id, SQLIT
4f30: 45 5f 4c 4f 43 4b 5f 53 48 41 52 45 44 29 3b 0a  E_LOCK_SHARED);.
4f40: 20 20 7d 0a 20 20 69 66 28 20 70 46 69 6c 65 2d    }.  if( pFile-
4f50: 3e 65 46 69 6c 65 4c 6f 63 6b 20 3e 20 65 46 69  >eFileLock > eFi
4f60: 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 69 6e  leLock ){.    in
4f70: 74 20 75 6e 6c 6f 63 6b 52 43 20 3d 20 70 46 69  t unlockRC = pFi
4f80: 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 55 6e  le->pMethod->xUn
4f90: 6c 6f 63 6b 28 69 64 2c 20 53 51 4c 49 54 45 5f  lock(id, SQLITE_
4fa0: 4c 4f 43 4b 5f 4e 4f 4e 45 29 3b 0a 20 20 20 20  LOCK_NONE);.    
4fb0: 69 66 20 28 21 72 63 29 20 72 63 20 3d 20 75 6e  if (!rc) rc = un
4fc0: 6c 6f 63 6b 52 43 3b 0a 20 20 7d 0a 20 20 72 65  lockRC;.  }.  re
4fd0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6e 64  turn rc;.}..#end
4fe0: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41  if /* SQLITE_ENA
4ff0: 42 4c 45 5f 53 55 50 45 52 4c 4f 43 4b 20 2a 2f  BLE_SUPERLOCK */
5000: 0a 0a 0a 2f 2a 0a 2a 2a 20 48 41 56 45 5f 4d 52  .../*.** HAVE_MR
5010: 45 4d 41 50 20 64 65 66 61 75 6c 74 73 20 74 6f  EMAP defaults to
5020: 20 74 72 75 65 20 6f 6e 20 4c 69 6e 75 78 20 61   true on Linux a
5030: 6e 64 20 66 61 6c 73 65 20 65 76 65 72 79 77 68  nd false everywh
5040: 65 72 65 20 65 6c 73 65 2e 0a 2a 2f 0a 23 69 66  ere else..*/.#if
5050: 20 21 64 65 66 69 6e 65 64 28 48 41 56 45 5f 4d   !defined(HAVE_M
5060: 52 45 4d 41 50 29 0a 23 20 69 66 20 64 65 66 69  REMAP).# if defi
5070: 6e 65 64 28 5f 5f 6c 69 6e 75 78 5f 5f 29 20 26  ned(__linux__) &
5080: 26 20 64 65 66 69 6e 65 64 28 5f 47 4e 55 5f 53  & defined(_GNU_S
5090: 4f 55 52 43 45 29 0a 23 20 20 64 65 66 69 6e 65  OURCE).#  define
50a0: 20 48 41 56 45 5f 4d 52 45 4d 41 50 20 31 0a 23   HAVE_MREMAP 1.#
50b0: 20 65 6c 73 65 0a 23 20 20 64 65 66 69 6e 65 20   else.#  define 
50c0: 48 41 56 45 5f 4d 52 45 4d 41 50 20 30 0a 23 20  HAVE_MREMAP 0.# 
50d0: 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 2f 2a  endif.#endif../*
50e0: 0a 2a 2a 20 45 78 70 6c 69 63 69 74 6c 79 20 63  .** Explicitly c
50f0: 61 6c 6c 20 74 68 65 20 36 34 2d 62 69 74 20 76  all the 64-bit v
5100: 65 72 73 69 6f 6e 20 6f 66 20 6c 73 65 65 6b 28  ersion of lseek(
5110: 29 20 6f 6e 20 41 6e 64 72 6f 69 64 2e 20 4f 74  ) on Android. Ot
5120: 68 65 72 77 69 73 65 2c 20 6c 73 65 65 6b 28 29  herwise, lseek()
5130: 0a 2a 2a 20 69 73 20 74 68 65 20 33 32 2d 62 69  .** is the 32-bi
5140: 74 20 76 65 72 73 69 6f 6e 2c 20 65 76 65 6e 20  t version, even 
5150: 69 66 20 5f 46 49 4c 45 5f 4f 46 46 53 45 54 5f  if _FILE_OFFSET_
5160: 42 49 54 53 3d 36 34 20 69 73 20 64 65 66 69 6e  BITS=64 is defin
5170: 65 64 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 5f 5f  ed..*/.#ifdef __
5180: 41 4e 44 52 4f 49 44 5f 5f 0a 23 20 64 65 66 69  ANDROID__.# defi
5190: 6e 65 20 6c 73 65 65 6b 20 6c 73 65 65 6b 36 34  ne lseek lseek64
51a0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44  .#endif../*.** D
51b0: 69 66 66 65 72 65 6e 74 20 55 6e 69 78 20 73 79  ifferent Unix sy
51c0: 73 74 65 6d 73 20 64 65 63 6c 61 72 65 20 6f 70  stems declare op
51d0: 65 6e 28 29 20 69 6e 20 64 69 66 66 65 72 65 6e  en() in differen
51e0: 74 20 77 61 79 73 2e 20 20 53 61 6d 65 20 75 73  t ways.  Same us
51f0: 65 0a 2a 2a 20 6f 70 65 6e 28 63 6f 6e 73 74 20  e.** open(const 
5200: 63 68 61 72 2a 2c 69 6e 74 2c 6d 6f 64 65 5f 74  char*,int,mode_t
5210: 29 2e 20 20 4f 74 68 65 72 73 20 75 73 65 20 6f  ).  Others use o
5220: 70 65 6e 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c  pen(const char*,
5230: 69 6e 74 2c 2e 2e 2e 29 2e 0a 2a 2a 20 54 68 65  int,...)..** The
5240: 20 64 69 66 66 65 72 65 6e 63 65 20 69 73 20 69   difference is i
5250: 6d 70 6f 72 74 61 6e 74 20 77 68 65 6e 20 75 73  mportant when us
5260: 69 6e 67 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ing a pointer to
5270: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a   the function..*
5280: 2a 0a 2a 2a 20 54 68 65 20 73 61 66 65 73 74 20  *.** The safest 
5290: 77 61 79 20 74 6f 20 64 65 61 6c 20 77 69 74 68  way to deal with
52a0: 20 74 68 65 20 70 72 6f 62 6c 65 6d 20 69 73 20   the problem is 
52b0: 74 6f 20 61 6c 77 61 79 73 20 75 73 65 20 74 68  to always use th
52c0: 69 73 20 77 72 61 70 70 65 72 0a 2a 2a 20 77 68  is wrapper.** wh
52d0: 69 63 68 20 61 6c 77 61 79 73 20 68 61 73 20 74  ich always has t
52e0: 68 65 20 73 61 6d 65 20 77 65 6c 6c 2d 64 65 66  he same well-def
52f0: 69 6e 65 64 20 69 6e 74 65 72 66 61 63 65 2e 0a  ined interface..
5300: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 6f  */.static int po
5310: 73 69 78 4f 70 65 6e 28 63 6f 6e 73 74 20 63 68  sixOpen(const ch
5320: 61 72 20 2a 7a 46 69 6c 65 2c 20 69 6e 74 20 66  ar *zFile, int f
5330: 6c 61 67 73 2c 20 69 6e 74 20 6d 6f 64 65 29 7b  lags, int mode){
5340: 0a 20 20 72 65 74 75 72 6e 20 6f 70 65 6e 28 7a  .  return open(z
5350: 46 69 6c 65 2c 20 66 6c 61 67 73 2c 20 6d 6f 64  File, flags, mod
5360: 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 6e 20  e);.}../*.** On 
5370: 73 6f 6d 65 20 73 79 73 74 65 6d 73 2c 20 63 61  some systems, ca
5380: 6c 6c 73 20 74 6f 20 66 63 68 6f 77 6e 28 29 20  lls to fchown() 
5390: 77 69 6c 6c 20 74 72 69 67 67 65 72 20 61 20 6d  will trigger a m
53a0: 65 73 73 61 67 65 20 69 6e 20 61 20 73 65 63 75  essage in a secu
53b0: 72 69 74 79 0a 2a 2a 20 6c 6f 67 20 69 66 20 74  rity.** log if t
53c0: 68 65 79 20 63 6f 6d 65 20 66 72 6f 6d 20 6e 6f  hey come from no
53d0: 6e 2d 72 6f 6f 74 20 70 72 6f 63 65 73 73 65 73  n-root processes
53e0: 2e 20 20 53 6f 20 61 76 6f 69 64 20 63 61 6c 6c  .  So avoid call
53f0: 69 6e 67 20 66 63 68 6f 77 6e 28 29 20 69 66 0a  ing fchown() if.
5400: 2a 2a 20 77 65 20 61 72 65 20 6e 6f 74 20 72 75  ** we are not ru
5410: 6e 6e 69 6e 67 20 61 73 20 72 6f 6f 74 2e 0a 2a  nning as root..*
5420: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 6f 73  /.static int pos
5430: 69 78 46 63 68 6f 77 6e 28 69 6e 74 20 66 64 2c  ixFchown(int fd,
5440: 20 75 69 64 5f 74 20 75 69 64 2c 20 67 69 64 5f   uid_t uid, gid_
5450: 74 20 67 69 64 29 7b 0a 23 69 66 20 4f 53 5f 56  t gid){.#if OS_V
5460: 58 57 4f 52 4b 53 0a 20 20 72 65 74 75 72 6e 20  XWORKS.  return 
5470: 30 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74 75 72  0;.#else.  retur
5480: 6e 20 67 65 74 65 75 69 64 28 29 20 3f 20 30 20  n geteuid() ? 0 
5490: 3a 20 66 63 68 6f 77 6e 28 66 64 2c 75 69 64 2c  : fchown(fd,uid,
54a0: 67 69 64 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  gid);.#endif.}..
54b0: 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72  /* Forward refer
54c0: 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 69  ence */.static i
54d0: 6e 74 20 6f 70 65 6e 44 69 72 65 63 74 6f 72 79  nt openDirectory
54e0: 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20 69 6e  (const char*, in
54f0: 74 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  t*);.static int 
5500: 75 6e 69 78 47 65 74 70 61 67 65 73 69 7a 65 28  unixGetpagesize(
5510: 76 6f 69 64 29 3b 0a 0a 2f 2a 0a 2a 2a 20 4d 61  void);../*.** Ma
5520: 6e 79 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20  ny system calls 
5530: 61 72 65 20 61 63 63 65 73 73 65 64 20 74 68 72  are accessed thr
5540: 6f 75 67 68 20 70 6f 69 6e 74 65 72 2d 74 6f 2d  ough pointer-to-
5550: 66 75 6e 63 74 69 6f 6e 73 20 73 6f 20 74 68 61  functions so tha
5560: 74 0a 2a 2a 20 74 68 65 79 20 6d 61 79 20 62 65  t.** they may be
5570: 20 6f 76 65 72 72 69 64 64 65 6e 20 61 74 20 72   overridden at r
5580: 75 6e 74 69 6d 65 20 74 6f 20 66 61 63 69 6c 69  untime to facili
5590: 74 61 74 65 20 66 61 75 6c 74 20 69 6e 6a 65 63  tate fault injec
55a0: 74 69 6f 6e 20 64 75 72 69 6e 67 0a 2a 2a 20 74  tion during.** t
55b0: 65 73 74 69 6e 67 20 61 6e 64 20 73 61 6e 64 62  esting and sandb
55c0: 6f 78 69 6e 67 2e 20 20 54 68 65 20 66 6f 6c 6c  oxing.  The foll
55d0: 6f 77 69 6e 67 20 61 72 72 61 79 20 68 6f 6c 64  owing array hold
55e0: 73 20 74 68 65 20 6e 61 6d 65 73 20 61 6e 64 20  s the names and 
55f0: 70 6f 69 6e 74 65 72 73 0a 2a 2a 20 74 6f 20 61  pointers.** to a
5600: 6c 6c 20 6f 76 65 72 72 69 64 65 61 62 6c 65 20  ll overrideable 
5610: 73 79 73 74 65 6d 20 63 61 6c 6c 73 2e 0a 2a 2f  system calls..*/
5620: 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20 75  .static struct u
5630: 6e 69 78 5f 73 79 73 63 61 6c 6c 20 7b 0a 20 20  nix_syscall {.  
5640: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
5650: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
5660: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 73 79 73   Name of the sys
5670: 74 65 6d 20 63 61 6c 6c 20 2a 2f 0a 20 20 73 71  tem call */.  sq
5680: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
5690: 72 20 70 43 75 72 72 65 6e 74 3b 20 2f 2a 20 43  r pCurrent; /* C
56a0: 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20  urrent value of 
56b0: 74 68 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  the system call 
56c0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 73  */.  sqlite3_sys
56d0: 63 61 6c 6c 5f 70 74 72 20 70 44 65 66 61 75 6c  call_ptr pDefaul
56e0: 74 3b 20 2f 2a 20 44 65 66 61 75 6c 74 20 76 61  t; /* Default va
56f0: 6c 75 65 20 2a 2f 0a 7d 20 61 53 79 73 63 61 6c  lue */.} aSyscal
5700: 6c 5b 5d 20 3d 20 7b 0a 20 20 7b 20 22 6f 70 65  l[] = {.  { "ope
5710: 6e 22 2c 20 20 20 20 20 20 20 20 20 28 73 71 6c  n",         (sql
5720: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
5730: 29 70 6f 73 69 78 4f 70 65 6e 2c 20 20 30 20 20  )posixOpen,  0  
5740: 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 4f 70 65  },.#define osOpe
5750: 6e 20 20 20 20 20 20 28 28 69 6e 74 28 2a 29 28  n      ((int(*)(
5760: 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74 2c  const char*,int,
5770: 69 6e 74 29 29 61 53 79 73 63 61 6c 6c 5b 30 5d  int))aSyscall[0]
5780: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
5790: 22 63 6c 6f 73 65 22 2c 20 20 20 20 20 20 20 20  "close",        
57a0: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
57b0: 5f 70 74 72 29 63 6c 6f 73 65 2c 20 20 20 20 20  _ptr)close,     
57c0: 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f   0  },.#define o
57d0: 73 43 6c 6f 73 65 20 20 20 20 20 28 28 69 6e 74  sClose     ((int
57e0: 28 2a 29 28 69 6e 74 29 29 61 53 79 73 63 61 6c  (*)(int))aSyscal
57f0: 6c 5b 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  l[1].pCurrent)..
5800: 20 20 7b 20 22 61 63 63 65 73 73 22 2c 20 20 20    { "access",   
5810: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
5820: 63 61 6c 6c 5f 70 74 72 29 61 63 63 65 73 73 2c  call_ptr)access,
5830: 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69       0  },.#defi
5840: 6e 65 20 6f 73 41 63 63 65 73 73 20 20 20 20 28  ne osAccess    (
5850: 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68  (int(*)(const ch
5860: 61 72 2a 2c 69 6e 74 29 29 61 53 79 73 63 61 6c  ar*,int))aSyscal
5870: 6c 5b 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  l[2].pCurrent)..
5880: 20 20 7b 20 22 67 65 74 63 77 64 22 2c 20 20 20    { "getcwd",   
5890: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
58a0: 63 61 6c 6c 5f 70 74 72 29 67 65 74 63 77 64 2c  call_ptr)getcwd,
58b0: 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69       0  },.#defi
58c0: 6e 65 20 6f 73 47 65 74 63 77 64 20 20 20 20 28  ne osGetcwd    (
58d0: 28 63 68 61 72 2a 28 2a 29 28 63 68 61 72 2a 2c  (char*(*)(char*,
58e0: 73 69 7a 65 5f 74 29 29 61 53 79 73 63 61 6c 6c  size_t))aSyscall
58f0: 5b 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  [3].pCurrent).. 
5900: 20 7b 20 22 73 74 61 74 22 2c 20 20 20 20 20 20   { "stat",      
5910: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
5920: 61 6c 6c 5f 70 74 72 29 73 74 61 74 2c 20 20 20  all_ptr)stat,   
5930: 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e      0  },.#defin
5940: 65 20 6f 73 53 74 61 74 20 20 20 20 20 20 28 28  e osStat      ((
5950: 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61  int(*)(const cha
5960: 72 2a 2c 73 74 72 75 63 74 20 73 74 61 74 2a 29  r*,struct stat*)
5970: 29 61 53 79 73 63 61 6c 6c 5b 34 5d 2e 70 43 75  )aSyscall[4].pCu
5980: 72 72 65 6e 74 29 0a 0a 2f 2a 0a 2a 2a 20 54 68  rrent)../*.** Th
5990: 65 20 44 4a 47 50 50 20 63 6f 6d 70 69 6c 65 72  e DJGPP compiler
59a0: 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 6c 6f 6f   environment loo
59b0: 6b 73 20 6d 6f 73 74 6c 79 20 6c 69 6b 65 20 55  ks mostly like U
59c0: 6e 69 78 2c 20 62 75 74 20 69 74 0a 2a 2a 20 6c  nix, but it.** l
59d0: 61 63 6b 73 20 74 68 65 20 66 63 6e 74 6c 28 29  acks the fcntl()
59e0: 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20 53   system call.  S
59f0: 6f 20 72 65 64 65 66 69 6e 65 20 66 63 6e 74 6c  o redefine fcntl
5a00: 28 29 20 74 6f 20 62 65 20 73 6f 6d 65 74 68 69  () to be somethi
5a10: 6e 67 0a 2a 2a 20 74 68 61 74 20 61 6c 77 61 79  ng.** that alway
5a20: 73 20 73 75 63 63 65 65 64 73 2e 20 20 54 68 69  s succeeds.  Thi
5a30: 73 20 6d 65 61 6e 73 20 74 68 61 74 20 6c 6f 63  s means that loc
5a40: 6b 69 6e 67 20 64 6f 65 73 20 6e 6f 74 20 6f 63  king does not oc
5a50: 63 75 72 20 75 6e 64 65 72 0a 2a 2a 20 44 4a 47  cur under.** DJG
5a60: 50 50 2e 20 20 42 75 74 20 69 74 20 69 73 20 44  PP.  But it is D
5a70: 4f 53 20 2d 20 77 68 61 74 20 64 69 64 20 79 6f  OS - what did yo
5a80: 75 20 65 78 70 65 63 74 3f 0a 2a 2f 0a 23 69 66  u expect?.*/.#if
5a90: 64 65 66 20 5f 5f 44 4a 47 50 50 5f 5f 0a 20 20  def __DJGPP__.  
5aa0: 7b 20 22 66 73 74 61 74 22 2c 20 20 20 20 20 20  { "fstat",      
5ab0: 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
5ac0: 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69       0  },.#defi
5ad0: 6e 65 20 6f 73 46 73 74 61 74 28 61 2c 62 2c 63  ne osFstat(a,b,c
5ae0: 29 20 20 20 20 30 0a 23 65 6c 73 65 20 20 20 20  )    0.#else    
5af0: 20 0a 20 20 7b 20 22 66 73 74 61 74 22 2c 20 20   .  { "fstat",  
5b00: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73        (sqlite3_s
5b10: 79 73 63 61 6c 6c 5f 70 74 72 29 66 73 74 61 74  yscall_ptr)fstat
5b20: 2c 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65  ,      0  },.#de
5b30: 66 69 6e 65 20 6f 73 46 73 74 61 74 20 20 20 20  fine osFstat    
5b40: 20 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c 73 74   ((int(*)(int,st
5b50: 72 75 63 74 20 73 74 61 74 2a 29 29 61 53 79 73  ruct stat*))aSys
5b60: 63 61 6c 6c 5b 35 5d 2e 70 43 75 72 72 65 6e 74  call[5].pCurrent
5b70: 29 0a 23 65 6e 64 69 66 0a 0a 20 20 7b 20 22 66  ).#endif..  { "f
5b80: 74 72 75 6e 63 61 74 65 22 2c 20 20 20 20 28 73  truncate",    (s
5b90: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
5ba0: 74 72 29 66 74 72 75 6e 63 61 74 65 2c 20 20 30  tr)ftruncate,  0
5bb0: 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 46    },.#define osF
5bc0: 74 72 75 6e 63 61 74 65 20 28 28 69 6e 74 28 2a  truncate ((int(*
5bd0: 29 28 69 6e 74 2c 6f 66 66 5f 74 29 29 61 53 79  )(int,off_t))aSy
5be0: 73 63 61 6c 6c 5b 36 5d 2e 70 43 75 72 72 65 6e  scall[6].pCurren
5bf0: 74 29 0a 0a 20 20 7b 20 22 66 63 6e 74 6c 22 2c  t)..  { "fcntl",
5c00: 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33          (sqlite3
5c10: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 66 63 6e  _syscall_ptr)fcn
5c20: 74 6c 2c 20 20 20 20 20 20 30 20 20 7d 2c 0a 23  tl,      0  },.#
5c30: 64 65 66 69 6e 65 20 6f 73 46 63 6e 74 6c 20 20  define osFcntl  
5c40: 20 20 20 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c     ((int(*)(int,
5c50: 69 6e 74 2c 2e 2e 2e 29 29 61 53 79 73 63 61 6c  int,...))aSyscal
5c60: 6c 5b 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  l[7].pCurrent)..
5c70: 20 20 7b 20 22 72 65 61 64 22 2c 20 20 20 20 20    { "read",     
5c80: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
5c90: 63 61 6c 6c 5f 70 74 72 29 72 65 61 64 2c 20 20  call_ptr)read,  
5ca0: 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69       0  },.#defi
5cb0: 6e 65 20 6f 73 52 65 61 64 20 20 20 20 20 20 28  ne osRead      (
5cc0: 28 73 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c  (ssize_t(*)(int,
5cd0: 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 29 29 61 53  void*,size_t))aS
5ce0: 79 73 63 61 6c 6c 5b 38 5d 2e 70 43 75 72 72 65  yscall[8].pCurre
5cf0: 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  nt)..#if defined
5d00: 28 55 53 45 5f 50 52 45 41 44 29 20 7c 7c 20 53  (USE_PREAD) || S
5d10: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
5d20: 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 7b 20 22  KING_STYLE.  { "
5d30: 70 72 65 61 64 22 2c 20 20 20 20 20 20 20 20 28  pread",        (
5d40: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
5d50: 70 74 72 29 70 72 65 61 64 2c 20 20 20 20 20 20  ptr)pread,      
5d60: 30 20 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20  0  },.#else.  { 
5d70: 22 70 72 65 61 64 22 2c 20 20 20 20 20 20 20 20  "pread",        
5d80: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
5d90: 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20 20 20  _ptr)0,         
5da0: 20 30 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64   0  },.#endif.#d
5db0: 65 66 69 6e 65 20 6f 73 50 72 65 61 64 20 20 20  efine osPread   
5dc0: 20 20 28 28 73 73 69 7a 65 5f 74 28 2a 29 28 69    ((ssize_t(*)(i
5dd0: 6e 74 2c 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c  nt,void*,size_t,
5de0: 6f 66 66 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b  off_t))aSyscall[
5df0: 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  9].pCurrent)..#i
5e00: 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52  f defined(USE_PR
5e10: 45 41 44 36 34 29 0a 20 20 7b 20 22 70 72 65 61  EAD64).  { "prea
5e20: 64 36 34 22 2c 20 20 20 20 20 20 28 73 71 6c 69  d64",      (sqli
5e30: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
5e40: 70 72 65 61 64 36 34 2c 20 20 20 20 30 20 20 7d  pread64,    0  }
5e50: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 70 72 65  ,.#else.  { "pre
5e60: 61 64 36 34 22 2c 20 20 20 20 20 20 28 73 71 6c  ad64",      (sql
5e70: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
5e80: 29 30 2c 20 20 20 20 20 20 20 20 20 20 30 20 20  )0,          0  
5e90: 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e  },.#endif.#defin
5ea0: 65 20 6f 73 50 72 65 61 64 36 34 20 20 20 28 28  e osPread64   ((
5eb0: 73 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 76  ssize_t(*)(int,v
5ec0: 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c 6f 66 66 5f  oid*,size_t,off_
5ed0: 74 29 29 61 53 79 73 63 61 6c 6c 5b 31 30 5d 2e  t))aSyscall[10].
5ee0: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
5ef0: 77 72 69 74 65 22 2c 20 20 20 20 20 20 20 20 28  write",        (
5f00: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
5f10: 70 74 72 29 77 72 69 74 65 2c 20 20 20 20 20 20  ptr)write,      
5f20: 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73  0  },.#define os
5f30: 57 72 69 74 65 20 20 20 20 20 28 28 73 73 69 7a  Write     ((ssiz
5f40: 65 5f 74 28 2a 29 28 69 6e 74 2c 63 6f 6e 73 74  e_t(*)(int,const
5f50: 20 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 29 29 61   void*,size_t))a
5f60: 53 79 73 63 61 6c 6c 5b 31 31 5d 2e 70 43 75 72  Syscall[11].pCur
5f70: 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e  rent)..#if defin
5f80: 65 64 28 55 53 45 5f 50 52 45 41 44 29 20 7c 7c  ed(USE_PREAD) ||
5f90: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
5fa0: 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 7b  OCKING_STYLE.  {
5fb0: 20 22 70 77 72 69 74 65 22 2c 20 20 20 20 20 20   "pwrite",      
5fc0: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
5fd0: 6c 5f 70 74 72 29 70 77 72 69 74 65 2c 20 20 20  l_ptr)pwrite,   
5fe0: 20 20 30 20 20 7d 2c 0a 23 65 6c 73 65 0a 20 20    0  },.#else.  
5ff0: 7b 20 22 70 77 72 69 74 65 22 2c 20 20 20 20 20  { "pwrite",     
6000: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
6010: 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20  ll_ptr)0,       
6020: 20 20 20 30 20 20 7d 2c 0a 23 65 6e 64 69 66 0a     0  },.#endif.
6030: 23 64 65 66 69 6e 65 20 6f 73 50 77 72 69 74 65  #define osPwrite
6040: 20 20 20 20 28 28 73 73 69 7a 65 5f 74 28 2a 29      ((ssize_t(*)
6050: 28 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a  (int,const void*
6060: 2c 73 69 7a 65 5f 74 2c 6f 66 66 5f 74 29 29 5c  ,size_t,off_t))\
6070: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
6080: 20 20 20 20 20 61 53 79 73 63 61 6c 6c 5b 31 32       aSyscall[12
6090: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
60a0: 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45   defined(USE_PRE
60b0: 41 44 36 34 29 0a 20 20 7b 20 22 70 77 72 69 74  AD64).  { "pwrit
60c0: 65 36 34 22 2c 20 20 20 20 20 28 73 71 6c 69 74  e64",     (sqlit
60d0: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 70  e3_syscall_ptr)p
60e0: 77 72 69 74 65 36 34 2c 20 20 20 30 20 20 7d 2c  write64,   0  },
60f0: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 70 77 72 69  .#else.  { "pwri
6100: 74 65 36 34 22 2c 20 20 20 20 20 28 73 71 6c 69  te64",     (sqli
6110: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
6120: 30 2c 20 20 20 20 20 20 20 20 20 20 30 20 20 7d  0,          0  }
6130: 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65  ,.#endif.#define
6140: 20 6f 73 50 77 72 69 74 65 36 34 20 20 28 28 73   osPwrite64  ((s
6150: 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 63 6f  size_t(*)(int,co
6160: 6e 73 74 20 76 6f 69 64 2a 2c 73 69 7a 65 5f 74  nst void*,size_t
6170: 2c 6f 66 66 5f 74 29 29 5c 0a 20 20 20 20 20 20  ,off_t))\.      
6180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 53                aS
6190: 79 73 63 61 6c 6c 5b 31 33 5d 2e 70 43 75 72 72  yscall[13].pCurr
61a0: 65 6e 74 29 0a 0a 20 20 7b 20 22 66 63 68 6d 6f  ent)..  { "fchmo
61b0: 64 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74  d",       (sqlit
61c0: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 66  e3_syscall_ptr)f
61d0: 63 68 6d 6f 64 2c 20 20 20 20 20 30 20 20 7d 2c  chmod,     0  },
61e0: 0a 23 64 65 66 69 6e 65 20 6f 73 46 63 68 6d 6f  .#define osFchmo
61f0: 64 20 20 20 20 28 28 69 6e 74 28 2a 29 28 69 6e  d    ((int(*)(in
6200: 74 2c 6d 6f 64 65 5f 74 29 29 61 53 79 73 63 61  t,mode_t))aSysca
6210: 6c 6c 5b 31 34 5d 2e 70 43 75 72 72 65 6e 74 29  ll[14].pCurrent)
6220: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 48 41  ..#if defined(HA
6230: 56 45 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f 43 41  VE_POSIX_FALLOCA
6240: 54 45 29 20 26 26 20 48 41 56 45 5f 50 4f 53 49  TE) && HAVE_POSI
6250: 58 5f 46 41 4c 4c 4f 43 41 54 45 0a 20 20 7b 20  X_FALLOCATE.  { 
6260: 22 66 61 6c 6c 6f 63 61 74 65 22 2c 20 20 20 20  "fallocate",    
6270: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
6280: 5f 70 74 72 29 70 6f 73 69 78 5f 66 61 6c 6c 6f  _ptr)posix_fallo
6290: 63 61 74 65 2c 20 20 30 20 7d 2c 0a 23 65 6c 73  cate,  0 },.#els
62a0: 65 0a 20 20 7b 20 22 66 61 6c 6c 6f 63 61 74 65  e.  { "fallocate
62b0: 22 2c 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73  ",    (sqlite3_s
62c0: 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20  yscall_ptr)0,   
62d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
62e0: 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65  ,.#endif.#define
62f0: 20 6f 73 46 61 6c 6c 6f 63 61 74 65 20 28 28 69   osFallocate ((i
6300: 6e 74 28 2a 29 28 69 6e 74 2c 6f 66 66 5f 74 2c  nt(*)(int,off_t,
6310: 6f 66 66 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b  off_t))aSyscall[
6320: 31 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  15].pCurrent).. 
6330: 20 7b 20 22 75 6e 6c 69 6e 6b 22 2c 20 20 20 20   { "unlink",    
6340: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
6350: 61 6c 6c 5f 70 74 72 29 75 6e 6c 69 6e 6b 2c 20  all_ptr)unlink, 
6360: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
6370: 64 65 66 69 6e 65 20 6f 73 55 6e 6c 69 6e 6b 20  define osUnlink 
6380: 20 20 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73     ((int(*)(cons
6390: 74 20 63 68 61 72 2a 29 29 61 53 79 73 63 61 6c  t char*))aSyscal
63a0: 6c 5b 31 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[16].pCurrent).
63b0: 0a 20 20 7b 20 22 6f 70 65 6e 44 69 72 65 63 74  .  { "openDirect
63c0: 6f 72 79 22 2c 20 20 20 20 28 73 71 6c 69 74 65  ory",    (sqlite
63d0: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 6f 70  3_syscall_ptr)op
63e0: 65 6e 44 69 72 65 63 74 6f 72 79 2c 20 20 20 20  enDirectory,    
63f0: 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f    0 },.#define o
6400: 73 4f 70 65 6e 44 69 72 65 63 74 6f 72 79 20 28  sOpenDirectory (
6410: 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68  (int(*)(const ch
6420: 61 72 2a 2c 69 6e 74 2a 29 29 61 53 79 73 63 61  ar*,int*))aSysca
6430: 6c 6c 5b 31 37 5d 2e 70 43 75 72 72 65 6e 74 29  ll[17].pCurrent)
6440: 0a 0a 20 20 7b 20 22 6d 6b 64 69 72 22 2c 20 20  ..  { "mkdir",  
6450: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73        (sqlite3_s
6460: 79 73 63 61 6c 6c 5f 70 74 72 29 6d 6b 64 69 72  yscall_ptr)mkdir
6470: 2c 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c  ,           0 },
6480: 0a 23 64 65 66 69 6e 65 20 6f 73 4d 6b 64 69 72  .#define osMkdir
6490: 20 20 20 20 20 28 28 69 6e 74 28 2a 29 28 63 6f       ((int(*)(co
64a0: 6e 73 74 20 63 68 61 72 2a 2c 6d 6f 64 65 5f 74  nst char*,mode_t
64b0: 29 29 61 53 79 73 63 61 6c 6c 5b 31 38 5d 2e 70  ))aSyscall[18].p
64c0: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 72  Current)..  { "r
64d0: 6d 64 69 72 22 2c 20 20 20 20 20 20 20 20 28 73  mdir",        (s
64e0: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
64f0: 74 72 29 72 6d 64 69 72 2c 20 20 20 20 20 20 20  tr)rmdir,       
6500: 20 20 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65      0 },.#define
6510: 20 6f 73 52 6d 64 69 72 20 20 20 20 20 28 28 69   osRmdir     ((i
6520: 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72  nt(*)(const char
6530: 2a 29 29 61 53 79 73 63 61 6c 6c 5b 31 39 5d 2e  *))aSyscall[19].
6540: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
6550: 66 63 68 6f 77 6e 22 2c 20 20 20 20 20 20 20 28  fchown",       (
6560: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
6570: 70 74 72 29 70 6f 73 69 78 46 63 68 6f 77 6e 2c  ptr)posixFchown,
6580: 20 20 20 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e       0 },.#defin
6590: 65 20 6f 73 46 63 68 6f 77 6e 20 20 20 20 28 28  e osFchown    ((
65a0: 69 6e 74 28 2a 29 28 69 6e 74 2c 75 69 64 5f 74  int(*)(int,uid_t
65b0: 2c 67 69 64 5f 74 29 29 61 53 79 73 63 61 6c 6c  ,gid_t))aSyscall
65c0: 5b 32 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [20].pCurrent)..
65d0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
65e0: 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 20 7c 7c  ITE_OMIT_WAL) ||
65f0: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
6600: 5f 53 49 5a 45 3e 30 0a 20 20 7b 20 22 6d 6d 61  _SIZE>0.  { "mma
6610: 70 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74  p",       (sqlit
6620: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 6d  e3_syscall_ptr)m
6630: 6d 61 70 2c 20 20 20 20 20 30 20 7d 2c 0a 23 64  map,     0 },.#d
6640: 65 66 69 6e 65 20 6f 73 4d 6d 61 70 20 28 28 76  efine osMmap ((v
6650: 6f 69 64 2a 28 2a 29 28 76 6f 69 64 2a 2c 73 69  oid*(*)(void*,si
6660: 7a 65 5f 74 2c 69 6e 74 2c 69 6e 74 2c 69 6e 74  ze_t,int,int,int
6670: 2c 6f 66 66 5f 74 29 29 61 53 79 73 63 61 6c 6c  ,off_t))aSyscall
6680: 5b 32 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [21].pCurrent)..
6690: 20 20 7b 20 22 6d 75 6e 6d 61 70 22 2c 20 20 20    { "munmap",   
66a0: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
66b0: 63 61 6c 6c 5f 70 74 72 29 6d 75 6e 6d 61 70 2c  call_ptr)munmap,
66c0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
66d0: 64 65 66 69 6e 65 20 6f 73 4d 75 6e 6d 61 70 20  define osMunmap 
66e0: 28 28 76 6f 69 64 2a 28 2a 29 28 76 6f 69 64 2a  ((void*(*)(void*
66f0: 2c 73 69 7a 65 5f 74 29 29 61 53 79 73 63 61 6c  ,size_t))aSyscal
6700: 6c 5b 32 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[22].pCurrent).
6710: 0a 23 69 66 20 48 41 56 45 5f 4d 52 45 4d 41 50  .#if HAVE_MREMAP
6720: 0a 20 20 7b 20 22 6d 72 65 6d 61 70 22 2c 20 20  .  { "mremap",  
6730: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
6740: 73 63 61 6c 6c 5f 70 74 72 29 6d 72 65 6d 61 70  scall_ptr)mremap
6750: 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a  ,          0 },.
6760: 23 65 6c 73 65 0a 20 20 7b 20 22 6d 72 65 6d 61  #else.  { "mrema
6770: 70 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74  p",       (sqlit
6780: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 30  e3_syscall_ptr)0
6790: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
67a0: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66  0 },.#endif.#def
67b0: 69 6e 65 20 6f 73 4d 72 65 6d 61 70 20 28 28 76  ine osMremap ((v
67c0: 6f 69 64 2a 28 2a 29 28 76 6f 69 64 2a 2c 73 69  oid*(*)(void*,si
67d0: 7a 65 5f 74 2c 73 69 7a 65 5f 74 2c 69 6e 74 2c  ze_t,size_t,int,
67e0: 2e 2e 2e 29 29 61 53 79 73 63 61 6c 6c 5b 32 33  ...))aSyscall[23
67f0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 20 20 7b 20  ].pCurrent).  { 
6800: 22 67 65 74 70 61 67 65 73 69 7a 65 22 2c 20 20  "getpagesize",  
6810: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
6820: 5f 70 74 72 29 75 6e 69 78 47 65 74 70 61 67 65  _ptr)unixGetpage
6830: 73 69 7a 65 2c 20 30 20 7d 2c 0a 23 64 65 66 69  size, 0 },.#defi
6840: 6e 65 20 6f 73 47 65 74 70 61 67 65 73 69 7a 65  ne osGetpagesize
6850: 20 28 28 69 6e 74 28 2a 29 28 76 6f 69 64 29 29   ((int(*)(void))
6860: 61 53 79 73 63 61 6c 6c 5b 32 34 5d 2e 70 43 75  aSyscall[24].pCu
6870: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 72 65 61  rrent)..  { "rea
6880: 64 6c 69 6e 6b 22 2c 20 20 20 20 20 28 73 71 6c  dlink",     (sql
6890: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
68a0: 29 72 65 61 64 6c 69 6e 6b 2c 20 20 20 20 20 20  )readlink,      
68b0: 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f    0 },.#define o
68c0: 73 52 65 61 64 6c 69 6e 6b 20 28 28 73 73 69 7a  sReadlink ((ssiz
68d0: 65 5f 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61  e_t(*)(const cha
68e0: 72 2a 2c 63 68 61 72 2a 2c 73 69 7a 65 5f 74 29  r*,char*,size_t)
68f0: 29 61 53 79 73 63 61 6c 6c 5b 32 35 5d 2e 70 43  )aSyscall[25].pC
6900: 75 72 72 65 6e 74 29 0a 0a 23 65 6e 64 69 66 0a  urrent)..#endif.
6910: 0a 7d 3b 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68  .}; /* End of th
6920: 65 20 6f 76 65 72 72 69 64 65 61 62 6c 65 20 73  e overrideable s
6930: 79 73 74 65 6d 20 63 61 6c 6c 73 20 2a 2f 0a 0a  ystem calls */..
6940: 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68  /*.** This is th
6950: 65 20 78 53 65 74 53 79 73 74 65 6d 43 61 6c 6c  e xSetSystemCall
6960: 28 29 20 6d 65 74 68 6f 64 20 6f 66 20 73 71 6c  () method of sql
6970: 69 74 65 33 5f 76 66 73 20 66 6f 72 20 61 6c 6c  ite3_vfs for all
6980: 20 6f 66 20 74 68 65 0a 2a 2a 20 22 75 6e 69 78   of the.** "unix
6990: 22 20 56 46 53 65 73 2e 20 20 52 65 74 75 72 6e  " VFSes.  Return
69a0: 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 70 6f 6e 20   SQLITE_OK opon 
69b0: 73 75 63 63 65 73 73 66 75 6c 6c 79 20 75 70 64  successfully upd
69c0: 61 74 69 6e 67 20 74 68 65 0a 2a 2a 20 73 79 73  ating the.** sys
69d0: 74 65 6d 20 63 61 6c 6c 20 70 6f 69 6e 74 65 72  tem call pointer
69e0: 2c 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 54 46  , or SQLITE_NOTF
69f0: 4f 55 4e 44 20 69 66 20 74 68 65 72 65 20 69 73  OUND if there is
6a00: 20 6e 6f 20 63 6f 6e 66 69 67 75 72 61 62 6c 65   no configurable
6a10: 0a 2a 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  .** system call 
6a20: 6e 61 6d 65 64 20 7a 4e 61 6d 65 2e 0a 2a 2f 0a  named zName..*/.
6a30: 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53  static int unixS
6a40: 65 74 53 79 73 74 65 6d 43 61 6c 6c 28 0a 20 20  etSystemCall(.  
6a50: 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 4e 6f  sqlite3_vfs *pNo
6a60: 74 55 73 65 64 2c 20 20 20 20 20 20 20 20 2f 2a  tUsed,        /*
6a70: 20 54 68 65 20 56 46 53 20 70 6f 69 6e 74 65 72   The VFS pointer
6a80: 2e 20 20 4e 6f 74 20 75 73 65 64 20 2a 2f 0a 20  .  Not used */. 
6a90: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
6aa0: 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  me,            /
6ab0: 2a 20 4e 61 6d 65 20 6f 66 20 73 79 73 74 65 6d  * Name of system
6ac0: 20 63 61 6c 6c 20 74 6f 20 6f 76 65 72 72 69 64   call to overrid
6ad0: 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73  e */.  sqlite3_s
6ae0: 79 73 63 61 6c 6c 5f 70 74 72 20 70 4e 65 77 46  yscall_ptr pNewF
6af0: 75 6e 63 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20  unc  /* Pointer 
6b00: 74 6f 20 6e 65 77 20 73 79 73 74 65 6d 20 63 61  to new system ca
6b10: 6c 6c 20 76 61 6c 75 65 20 2a 2f 0a 29 7b 0a 20  ll value */.){. 
6b20: 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 3b   unsigned int i;
6b30: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
6b40: 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 0a 20 20  TE_NOTFOUND;..  
6b50: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
6b60: 28 70 4e 6f 74 55 73 65 64 29 3b 0a 20 20 69 66  (pNotUsed);.  if
6b70: 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  ( zName==0 ){.  
6b80: 20 20 2f 2a 20 49 66 20 6e 6f 20 7a 4e 61 6d 65    /* If no zName
6b90: 20 69 73 20 67 69 76 65 6e 2c 20 72 65 73 74 6f   is given, resto
6ba0: 72 65 20 61 6c 6c 20 73 79 73 74 65 6d 20 63 61  re all system ca
6bb0: 6c 6c 73 20 74 6f 20 74 68 65 69 72 20 64 65 66  lls to their def
6bc0: 61 75 6c 74 0a 20 20 20 20 2a 2a 20 73 65 74 74  ault.    ** sett
6bd0: 69 6e 67 73 20 61 6e 64 20 72 65 74 75 72 6e 20  ings and return 
6be0: 4e 55 4c 4c 0a 20 20 20 20 2a 2f 0a 20 20 20 20  NULL.    */.    
6bf0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
6c00: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73      for(i=0; i<s
6c10: 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f  izeof(aSyscall)/
6c20: 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b  sizeof(aSyscall[
6c30: 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  0]); i++){.     
6c40: 20 69 66 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d   if( aSyscall[i]
6c50: 2e 70 44 65 66 61 75 6c 74 20 29 7b 0a 20 20 20  .pDefault ){.   
6c60: 20 20 20 20 20 61 53 79 73 63 61 6c 6c 5b 69 5d       aSyscall[i]
6c70: 2e 70 43 75 72 72 65 6e 74 20 3d 20 61 53 79 73  .pCurrent = aSys
6c80: 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74  call[i].pDefault
6c90: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
6ca0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
6cb0: 49 66 20 7a 4e 61 6d 65 20 69 73 20 73 70 65 63  If zName is spec
6cc0: 69 66 69 65 64 2c 20 6f 70 65 72 61 74 65 20 6f  ified, operate o
6cd0: 6e 20 6f 6e 6c 79 20 74 68 65 20 6f 6e 65 20 73  n only the one s
6ce0: 79 73 74 65 6d 20 63 61 6c 6c 0a 20 20 20 20 2a  ystem call.    *
6cf0: 2a 20 73 70 65 63 69 66 69 65 64 2e 0a 20 20 20  * specified..   
6d00: 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   */.    for(i=0;
6d10: 20 69 3c 73 69 7a 65 6f 66 28 61 53 79 73 63 61   i<sizeof(aSysca
6d20: 6c 6c 29 2f 73 69 7a 65 6f 66 28 61 53 79 73 63  ll)/sizeof(aSysc
6d30: 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20  all[0]); i++){. 
6d40: 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28       if( strcmp(
6d50: 7a 4e 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c 5b  zName, aSyscall[
6d60: 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a  i].zName)==0 ){.
6d70: 20 20 20 20 20 20 20 20 69 66 28 20 61 53 79 73          if( aSys
6d80: 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74  call[i].pDefault
6d90: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
6da0: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65   aSyscall[i].pDe
6db0: 66 61 75 6c 74 20 3d 20 61 53 79 73 63 61 6c 6c  fault = aSyscall
6dc0: 5b 69 5d 2e 70 43 75 72 72 65 6e 74 3b 0a 20 20  [i].pCurrent;.  
6dd0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
6de0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
6df0: 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77          if( pNew
6e00: 46 75 6e 63 3d 3d 30 20 29 20 70 4e 65 77 46 75  Func==0 ) pNewFu
6e10: 6e 63 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d  nc = aSyscall[i]
6e20: 2e 70 44 65 66 61 75 6c 74 3b 0a 20 20 20 20 20  .pDefault;.     
6e30: 20 20 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70     aSyscall[i].p
6e40: 43 75 72 72 65 6e 74 20 3d 20 70 4e 65 77 46 75  Current = pNewFu
6e50: 6e 63 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  nc;.        brea
6e60: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
6e70: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
6e80: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
6e90: 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 61  n the value of a
6ea0: 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20 52   system call.  R
6eb0: 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 7a 4e  eturn NULL if zN
6ec0: 61 6d 65 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20  ame is not a.** 
6ed0: 72 65 63 6f 67 6e 69 7a 65 64 20 73 79 73 74 65  recognized syste
6ee0: 6d 20 63 61 6c 6c 20 6e 61 6d 65 2e 20 20 4e 55  m call name.  NU
6ef0: 4c 4c 20 69 73 20 61 6c 73 6f 20 72 65 74 75 72  LL is also retur
6f00: 6e 65 64 20 69 66 20 74 68 65 20 73 79 73 74 65  ned if the syste
6f10: 6d 20 63 61 6c 6c 0a 2a 2a 20 69 73 20 63 75 72  m call.** is cur
6f20: 72 65 6e 74 6c 79 20 75 6e 64 65 66 69 6e 65 64  rently undefined
6f30: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69  ..*/.static sqli
6f40: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20  te3_syscall_ptr 
6f50: 75 6e 69 78 47 65 74 53 79 73 74 65 6d 43 61 6c  unixGetSystemCal
6f60: 6c 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  l(.  sqlite3_vfs
6f70: 20 2a 70 4e 6f 74 55 73 65 64 2c 0a 20 20 63 6f   *pNotUsed,.  co
6f80: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 0a  nst char *zName.
6f90: 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e  ){.  unsigned in
6fa0: 74 20 69 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50  t i;..  UNUSED_P
6fb0: 41 52 41 4d 45 54 45 52 28 70 4e 6f 74 55 73 65  ARAMETER(pNotUse
6fc0: 64 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  d);.  for(i=0; i
6fd0: 3c 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c  <sizeof(aSyscall
6fe0: 29 2f 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c  )/sizeof(aSyscal
6ff0: 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  l[0]); i++){.   
7000: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d   if( strcmp(zNam
7010: 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a  e, aSyscall[i].z
7020: 4e 61 6d 65 29 3d 3d 30 20 29 20 72 65 74 75 72  Name)==0 ) retur
7030: 6e 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43  n aSyscall[i].pC
7040: 75 72 72 65 6e 74 3b 0a 20 20 7d 0a 20 20 72 65  urrent;.  }.  re
7050: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
7060: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 61 6d 65   Return the name
7070: 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 73 79   of the first sy
7080: 73 74 65 6d 20 63 61 6c 6c 20 61 66 74 65 72 20  stem call after 
7090: 7a 4e 61 6d 65 2e 20 20 49 66 20 7a 4e 61 6d 65  zName.  If zName
70a0: 3d 3d 4e 55 4c 4c 0a 2a 2a 20 74 68 65 6e 20 72  ==NULL.** then r
70b0: 65 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f  eturn the name o
70c0: 66 20 74 68 65 20 66 69 72 73 74 20 73 79 73 74  f the first syst
70d0: 65 6d 20 63 61 6c 6c 2e 20 20 52 65 74 75 72 6e  em call.  Return
70e0: 20 4e 55 4c 4c 20 69 66 20 7a 4e 61 6d 65 0a 2a   NULL if zName.*
70f0: 2a 20 69 73 20 74 68 65 20 6c 61 73 74 20 73 79  * is the last sy
7100: 73 74 65 6d 20 63 61 6c 6c 20 6f 72 20 69 66 20  stem call or if 
7110: 7a 4e 61 6d 65 20 69 73 20 6e 6f 74 20 74 68 65  zName is not the
7120: 20 6e 61 6d 65 20 6f 66 20 61 20 76 61 6c 69 64   name of a valid
7130: 0a 2a 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e  .** system call.
7140: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
7150: 20 63 68 61 72 20 2a 75 6e 69 78 4e 65 78 74 53   char *unixNextS
7160: 79 73 74 65 6d 43 61 6c 6c 28 73 71 6c 69 74 65  ystemCall(sqlite
7170: 33 5f 76 66 73 20 2a 70 2c 20 63 6f 6e 73 74 20  3_vfs *p, const 
7180: 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20  char *zName){.  
7190: 69 6e 74 20 69 20 3d 20 2d 31 3b 0a 0a 20 20 55  int i = -1;..  U
71a0: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
71b0: 70 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 20  p);.  if( zName 
71c0: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
71d0: 69 3c 41 72 72 61 79 53 69 7a 65 28 61 53 79 73  i<ArraySize(aSys
71e0: 63 61 6c 6c 29 2d 31 3b 20 69 2b 2b 29 7b 0a 20  call)-1; i++){. 
71f0: 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28       if( strcmp(
7200: 7a 4e 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c 5b  zName, aSyscall[
7210: 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 62  i].zName)==0 ) b
7220: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
7230: 20 20 66 6f 72 28 69 2b 2b 3b 20 69 3c 41 72 72    for(i++; i<Arr
7240: 61 79 53 69 7a 65 28 61 53 79 73 63 61 6c 6c 29  aySize(aSyscall)
7250: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
7260: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72  aSyscall[i].pCur
7270: 72 65 6e 74 21 3d 30 20 29 20 72 65 74 75 72 6e  rent!=0 ) return
7280: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61   aSyscall[i].zNa
7290: 6d 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  me;.  }.  return
72a0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20   0;.}../*.** Do 
72b0: 6e 6f 74 20 61 63 63 65 70 74 20 61 6e 79 20 66  not accept any f
72c0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6c  ile descriptor l
72d0: 65 73 73 20 74 68 61 6e 20 74 68 69 73 20 76 61  ess than this va
72e0: 6c 75 65 2c 20 69 6e 20 6f 72 64 65 72 20 74 6f  lue, in order to
72f0: 20 61 76 6f 69 64 0a 2a 2a 20 6f 70 65 6e 69 6e   avoid.** openin
7300: 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  g database file 
7310: 75 73 69 6e 67 20 66 69 6c 65 20 64 65 73 63 72  using file descr
7320: 69 70 74 6f 72 73 20 74 68 61 74 20 61 72 65 20  iptors that are 
7330: 63 6f 6d 6d 6f 6e 6c 79 20 75 73 65 64 20 66 6f  commonly used fo
7340: 72 20 0a 2a 2a 20 73 74 61 6e 64 61 72 64 20 69  r .** standard i
7350: 6e 70 75 74 2c 20 6f 75 74 70 75 74 2c 20 61 6e  nput, output, an
7360: 64 20 65 72 72 6f 72 2e 0a 2a 2f 0a 23 69 66 6e  d error..*/.#ifn
7370: 64 65 66 20 53 51 4c 49 54 45 5f 4d 49 4e 49 4d  def SQLITE_MINIM
7380: 55 4d 5f 46 49 4c 45 5f 44 45 53 43 52 49 50 54  UM_FILE_DESCRIPT
7390: 4f 52 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49  OR.# define SQLI
73a0: 54 45 5f 4d 49 4e 49 4d 55 4d 5f 46 49 4c 45 5f  TE_MINIMUM_FILE_
73b0: 44 45 53 43 52 49 50 54 4f 52 20 33 0a 23 65 6e  DESCRIPTOR 3.#en
73c0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b  dif../*.** Invok
73d0: 65 20 6f 70 65 6e 28 29 2e 20 20 44 6f 20 73 6f  e open().  Do so
73e0: 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 2c   multiple times,
73f0: 20 75 6e 74 69 6c 20 69 74 20 65 69 74 68 65 72   until it either
7400: 20 73 75 63 63 65 65 64 73 20 6f 72 0a 2a 2a 20   succeeds or.** 
7410: 66 61 69 6c 73 20 66 6f 72 20 73 6f 6d 65 20 72  fails for some r
7420: 65 61 73 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e  eason other than
7430: 20 45 49 4e 54 52 2e 0a 2a 2a 0a 2a 2a 20 49 66   EINTR..**.** If
7440: 20 74 68 65 20 66 69 6c 65 20 63 72 65 61 74 69   the file creati
7450: 6f 6e 20 6d 6f 64 65 20 22 6d 22 20 69 73 20 30  on mode "m" is 0
7460: 20 74 68 65 6e 20 73 65 74 20 69 74 20 74 6f 20   then set it to 
7470: 74 68 65 20 64 65 66 61 75 6c 74 20 66 6f 72 0a  the default for.
7480: 2a 2a 20 53 51 4c 69 74 65 2e 20 20 54 68 65 20  ** SQLite.  The 
7490: 64 65 66 61 75 6c 74 20 69 73 20 53 51 4c 49 54  default is SQLIT
74a0: 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50  E_DEFAULT_FILE_P
74b0: 45 52 4d 49 53 53 49 4f 4e 53 20 28 6e 6f 72 6d  ERMISSIONS (norm
74c0: 61 6c 6c 79 0a 2a 2a 20 30 36 34 34 29 20 61 73  ally.** 0644) as
74d0: 20 6d 6f 64 69 66 69 65 64 20 62 79 20 74 68 65   modified by the
74e0: 20 73 79 73 74 65 6d 20 75 6d 61 73 6b 2e 20 20   system umask.  
74f0: 49 66 20 6d 20 69 73 20 6e 6f 74 20 30 2c 20 74  If m is not 0, t
7500: 68 65 6e 0a 2a 2a 20 6d 61 6b 65 20 74 68 65 20  hen.** make the 
7510: 66 69 6c 65 20 63 72 65 61 74 69 6f 6e 20 6d 6f  file creation mo
7520: 64 65 20 62 65 20 65 78 61 63 74 6c 79 20 6d 20  de be exactly m 
7530: 69 67 6e 6f 72 69 6e 67 20 74 68 65 20 75 6d 61  ignoring the uma
7540: 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 20  sk..**.** The m 
7550: 70 61 72 61 6d 65 74 65 72 20 77 69 6c 6c 20 62  parameter will b
7560: 65 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 6e 6c 79 20  e non-zero only 
7570: 77 68 65 6e 20 63 72 65 61 74 69 6e 67 20 2d 77  when creating -w
7580: 61 6c 2c 20 2d 6a 6f 75 72 6e 61 6c 2c 0a 2a 2a  al, -journal,.**
7590: 20 61 6e 64 20 2d 73 68 6d 20 66 69 6c 65 73 2e   and -shm files.
75a0: 20 20 57 65 20 77 61 6e 74 20 74 68 6f 73 65 20    We want those 
75b0: 66 69 6c 65 73 20 74 6f 20 68 61 76 65 20 2a 65  files to have *e
75c0: 78 61 63 74 6c 79 2a 20 74 68 65 20 73 61 6d 65  xactly* the same
75d0: 0a 2a 2a 20 70 65 72 6d 69 73 73 69 6f 6e 73 20  .** permissions 
75e0: 61 73 20 74 68 65 69 72 20 6f 72 69 67 69 6e 61  as their origina
75f0: 6c 20 64 61 74 61 62 61 73 65 2c 20 75 6e 61 64  l database, unad
7600: 75 6c 74 65 72 61 74 65 64 20 62 79 20 74 68 65  ulterated by the
7610: 20 75 6d 61 73 6b 2e 0a 2a 2a 20 49 6e 20 74 68   umask..** In th
7620: 61 74 20 77 61 79 2c 20 69 66 20 61 20 64 61 74  at way, if a dat
7630: 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 2d 72  abase file is -r
7640: 77 2d 72 77 2d 72 77 20 6f 72 20 2d 72 77 2d 72  w-rw-rw or -rw-r
7650: 77 2d 72 2d 2c 20 61 6e 64 20 61 0a 2a 2a 20 74  w-r-, and a.** t
7660: 72 61 6e 73 61 63 74 69 6f 6e 20 63 72 61 73 68  ransaction crash
7670: 65 73 20 61 6e 64 20 6c 65 61 76 65 73 20 62 65  es and leaves be
7680: 68 69 6e 64 20 68 6f 74 20 6a 6f 75 72 6e 61 6c  hind hot journal
7690: 73 2c 20 74 68 65 6e 20 61 6e 79 0a 2a 2a 20 70  s, then any.** p
76a0: 72 6f 63 65 73 73 20 74 68 61 74 20 69 73 20 61  rocess that is a
76b0: 62 6c 65 20 74 6f 20 77 72 69 74 65 20 74 6f 20  ble to write to 
76c0: 74 68 65 20 64 61 74 61 62 61 73 65 20 77 69 6c  the database wil
76d0: 6c 20 61 6c 73 6f 20 62 65 20 61 62 6c 65 20 74  l also be able t
76e0: 6f 0a 2a 2a 20 72 65 63 6f 76 65 72 20 74 68 65  o.** recover the
76f0: 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 73 2e 0a 2a   hot journals..*
7700: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 6f 62  /.static int rob
7710: 75 73 74 5f 6f 70 65 6e 28 63 6f 6e 73 74 20 63  ust_open(const c
7720: 68 61 72 20 2a 7a 2c 20 69 6e 74 20 66 2c 20 6d  har *z, int f, m
7730: 6f 64 65 5f 74 20 6d 29 7b 0a 20 20 69 6e 74 20  ode_t m){.  int 
7740: 66 64 3b 0a 20 20 6d 6f 64 65 5f 74 20 6d 32 20  fd;.  mode_t m2 
7750: 3d 20 6d 20 3f 20 6d 20 3a 20 53 51 4c 49 54 45  = m ? m : SQLITE
7760: 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45  _DEFAULT_FILE_PE
7770: 52 4d 49 53 53 49 4f 4e 53 3b 0a 20 20 77 68 69  RMISSIONS;.  whi
7780: 6c 65 28 31 29 7b 0a 23 69 66 20 64 65 66 69 6e  le(1){.#if defin
7790: 65 64 28 4f 5f 43 4c 4f 45 58 45 43 29 0a 20 20  ed(O_CLOEXEC).  
77a0: 20 20 66 64 20 3d 20 6f 73 4f 70 65 6e 28 7a 2c    fd = osOpen(z,
77b0: 66 7c 4f 5f 43 4c 4f 45 58 45 43 2c 6d 32 29 3b  f|O_CLOEXEC,m2);
77c0: 0a 23 65 6c 73 65 0a 20 20 20 20 66 64 20 3d 20  .#else.    fd = 
77d0: 6f 73 4f 70 65 6e 28 7a 2c 66 2c 6d 32 29 3b 0a  osOpen(z,f,m2);.
77e0: 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 66  #endif.    if( f
77f0: 64 3c 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  d<0 ){.      if(
7800: 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 20   errno==EINTR ) 
7810: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
7820: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
7830: 20 69 66 28 20 66 64 3e 3d 53 51 4c 49 54 45 5f   if( fd>=SQLITE_
7840: 4d 49 4e 49 4d 55 4d 5f 46 49 4c 45 5f 44 45 53  MINIMUM_FILE_DES
7850: 43 52 49 50 54 4f 52 20 29 20 62 72 65 61 6b 3b  CRIPTOR ) break;
7860: 0a 20 20 20 20 6f 73 43 6c 6f 73 65 28 66 64 29  .    osClose(fd)
7870: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f  ;.    sqlite3_lo
7880: 67 28 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47  g(SQLITE_WARNING
7890: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
78a0: 20 20 20 22 61 74 74 65 6d 70 74 20 74 6f 20 6f     "attempt to o
78b0: 70 65 6e 20 5c 22 25 73 5c 22 20 61 73 20 66 69  pen \"%s\" as fi
78c0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 25 64  le descriptor %d
78d0: 22 2c 20 7a 2c 20 66 64 29 3b 0a 20 20 20 20 66  ", z, fd);.    f
78e0: 64 20 3d 20 2d 31 3b 0a 20 20 20 20 69 66 28 20  d = -1;.    if( 
78f0: 6f 73 4f 70 65 6e 28 22 2f 64 65 76 2f 6e 75 6c  osOpen("/dev/nul
7900: 6c 22 2c 20 66 2c 20 6d 29 3c 30 20 29 20 62 72  l", f, m)<0 ) br
7910: 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66  eak;.  }.  if( f
7920: 64 3e 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  d>=0 ){.    if( 
7930: 6d 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 74  m!=0 ){.      st
7940: 72 75 63 74 20 73 74 61 74 20 73 74 61 74 62 75  ruct stat statbu
7950: 66 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 73 46  f;.      if( osF
7960: 73 74 61 74 28 66 64 2c 20 26 73 74 61 74 62 75  stat(fd, &statbu
7970: 66 29 3d 3d 30 20 0a 20 20 20 20 20 20 20 26 26  f)==0 .       &&
7980: 20 73 74 61 74 62 75 66 2e 73 74 5f 73 69 7a 65   statbuf.st_size
7990: 3d 3d 30 0a 20 20 20 20 20 20 20 26 26 20 28 73  ==0.       && (s
79a0: 74 61 74 62 75 66 2e 73 74 5f 6d 6f 64 65 26 30  tatbuf.st_mode&0
79b0: 37 37 37 29 21 3d 6d 20 0a 20 20 20 20 20 20 29  777)!=m .      )
79c0: 7b 0a 20 20 20 20 20 20 20 20 6f 73 46 63 68 6d  {.        osFchm
79d0: 6f 64 28 66 64 2c 20 6d 29 3b 0a 20 20 20 20 20  od(fd, m);.     
79e0: 20 7d 0a 20 20 20 20 7d 0a 23 69 66 20 64 65 66   }.    }.#if def
79f0: 69 6e 65 64 28 46 44 5f 43 4c 4f 45 58 45 43 29  ined(FD_CLOEXEC)
7a00: 20 26 26 20 28 21 64 65 66 69 6e 65 64 28 4f 5f   && (!defined(O_
7a10: 43 4c 4f 45 58 45 43 29 20 7c 7c 20 4f 5f 43 4c  CLOEXEC) || O_CL
7a20: 4f 45 58 45 43 3d 3d 30 29 0a 20 20 20 20 6f 73  OEXEC==0).    os
7a30: 46 63 6e 74 6c 28 66 64 2c 20 46 5f 53 45 54 46  Fcntl(fd, F_SETF
7a40: 44 2c 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20 46  D, osFcntl(fd, F
7a50: 5f 47 45 54 46 44 2c 20 30 29 20 7c 20 46 44 5f  _GETFD, 0) | FD_
7a60: 43 4c 4f 45 58 45 43 29 3b 0a 23 65 6e 64 69 66  CLOEXEC);.#endif
7a70: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 66 64  .  }.  return fd
7a80: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65  ;.}../*.** Helpe
7a90: 72 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20 6f  r functions to o
7aa0: 62 74 61 69 6e 20 61 6e 64 20 72 65 6c 69 6e 71  btain and relinq
7ab0: 75 69 73 68 20 74 68 65 20 67 6c 6f 62 61 6c 20  uish the global 
7ac0: 6d 75 74 65 78 2e 20 54 68 65 0a 2a 2a 20 67 6c  mutex. The.** gl
7ad0: 6f 62 61 6c 20 6d 75 74 65 78 20 69 73 20 75 73  obal mutex is us
7ae0: 65 64 20 74 6f 20 70 72 6f 74 65 63 74 20 74 68  ed to protect th
7af0: 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20  e unixInodeInfo 
7b00: 61 6e 64 0a 2a 2a 20 76 78 77 6f 72 6b 73 46 69  and.** vxworksFi
7b10: 6c 65 49 64 20 6f 62 6a 65 63 74 73 20 75 73 65  leId objects use
7b20: 64 20 62 79 20 74 68 69 73 20 66 69 6c 65 2c 20  d by this file, 
7b30: 61 6c 6c 20 6f 66 20 77 68 69 63 68 20 6d 61 79  all of which may
7b40: 20 62 65 20 0a 2a 2a 20 73 68 61 72 65 64 20 62   be .** shared b
7b50: 79 20 6d 75 6c 74 69 70 6c 65 20 74 68 72 65 61  y multiple threa
7b60: 64 73 2e 0a 2a 2a 0a 2a 2a 20 46 75 6e 63 74 69  ds..**.** Functi
7b70: 6f 6e 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64  on unixMutexHeld
7b80: 28 29 20 69 73 20 75 73 65 64 20 74 6f 20 61 73  () is used to as
7b90: 73 65 72 74 28 29 20 74 68 61 74 20 74 68 65 20  sert() that the 
7ba0: 67 6c 6f 62 61 6c 20 6d 75 74 65 78 20 0a 2a 2a  global mutex .**
7bb0: 20 69 73 20 68 65 6c 64 20 77 68 65 6e 20 72 65   is held when re
7bc0: 71 75 69 72 65 64 2e 20 54 68 69 73 20 66 75 6e  quired. This fun
7bd0: 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73  ction is only us
7be0: 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 61 73  ed as part of as
7bf0: 73 65 72 74 28 29 20 0a 2a 2a 20 73 74 61 74 65  sert() .** state
7c00: 6d 65 6e 74 73 2e 20 65 2e 67 2e 0a 2a 2a 0a 2a  ments. e.g..**.*
7c10: 2a 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74  *   unixEnterMut
7c20: 65 78 28 29 0a 2a 2a 20 20 20 20 20 61 73 73 65  ex().**     asse
7c30: 72 74 28 20 75 6e 69 78 4d 75 74 65 78 48 65 6c  rt( unixMutexHel
7c40: 64 28 29 20 29 3b 0a 2a 2a 20 20 20 75 6e 69 78  d() );.**   unix
7c50: 45 6e 74 65 72 4c 65 61 76 65 28 29 0a 2a 2f 0a  EnterLeave().*/.
7c60: 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78  static void unix
7c70: 45 6e 74 65 72 4d 75 74 65 78 28 76 6f 69 64 29  EnterMutex(void)
7c80: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  {.  sqlite3_mute
7c90: 78 5f 65 6e 74 65 72 28 73 71 6c 69 74 65 33 4d  x_enter(sqlite3M
7ca0: 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45  utexAlloc(SQLITE
7cb0: 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 56 46  _MUTEX_STATIC_VF
7cc0: 53 31 29 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76  S1));.}.static v
7cd0: 6f 69 64 20 75 6e 69 78 4c 65 61 76 65 4d 75 74  oid unixLeaveMut
7ce0: 65 78 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69  ex(void){.  sqli
7cf0: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
7d00: 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
7d10: 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
7d20: 54 41 54 49 43 5f 56 46 53 31 29 29 3b 0a 7d 0a  TATIC_VFS1));.}.
7d30: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
7d40: 42 55 47 0a 73 74 61 74 69 63 20 69 6e 74 20 75  BUG.static int u
7d50: 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 76 6f 69  nixMutexHeld(voi
7d60: 64 29 20 7b 0a 20 20 72 65 74 75 72 6e 20 73 71  d) {.  return sq
7d70: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
7d80: 28 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c  (sqlite3MutexAll
7d90: 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
7da0: 53 54 41 54 49 43 5f 56 46 53 31 29 29 3b 0a 7d  STATIC_VFS1));.}
7db0: 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66 64 65 66  .#endif...#ifdef
7dc0: 20 53 51 4c 49 54 45 5f 48 41 56 45 5f 4f 53 5f   SQLITE_HAVE_OS_
7dd0: 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20 48 65 6c 70  TRACE./*.** Help
7de0: 65 72 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20  er function for 
7df0: 70 72 69 6e 74 69 6e 67 20 6f 75 74 20 74 72 61  printing out tra
7e00: 63 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ce information f
7e10: 72 6f 6d 20 64 65 62 75 67 67 69 6e 67 0a 2a 2a  rom debugging.**
7e20: 20 62 69 6e 61 72 69 65 73 2e 20 54 68 69 73 20   binaries. This 
7e30: 72 65 74 75 72 6e 73 20 74 68 65 20 73 74 72 69  returns the stri
7e40: 6e 67 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  ng representatio
7e50: 6e 20 6f 66 20 74 68 65 20 73 75 70 70 6c 69 65  n of the supplie
7e60: 64 0a 2a 2a 20 69 6e 74 65 67 65 72 20 6c 6f 63  d.** integer loc
7e70: 6b 2d 74 79 70 65 2e 0a 2a 2f 0a 73 74 61 74 69  k-type..*/.stati
7e80: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a  c const char *az
7e90: 46 69 6c 65 4c 6f 63 6b 28 69 6e 74 20 65 46 69  FileLock(int eFi
7ea0: 6c 65 4c 6f 63 6b 29 7b 0a 20 20 73 77 69 74 63  leLock){.  switc
7eb0: 68 28 20 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a  h( eFileLock ){.
7ec0: 20 20 20 20 63 61 73 65 20 4e 4f 5f 4c 4f 43 4b      case NO_LOCK
7ed0: 3a 20 72 65 74 75 72 6e 20 22 4e 4f 4e 45 22 3b  : return "NONE";
7ee0: 0a 20 20 20 20 63 61 73 65 20 53 48 41 52 45 44  .    case SHARED
7ef0: 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 53  _LOCK: return "S
7f00: 48 41 52 45 44 22 3b 0a 20 20 20 20 63 61 73 65  HARED";.    case
7f10: 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 3a 20   RESERVED_LOCK: 
7f20: 72 65 74 75 72 6e 20 22 52 45 53 45 52 56 45 44  return "RESERVED
7f30: 22 3b 0a 20 20 20 20 63 61 73 65 20 50 45 4e 44  ";.    case PEND
7f40: 49 4e 47 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e  ING_LOCK: return
7f50: 20 22 50 45 4e 44 49 4e 47 22 3b 0a 20 20 20 20   "PENDING";.    
7f60: 63 61 73 65 20 45 58 43 4c 55 53 49 56 45 5f 4c  case EXCLUSIVE_L
7f70: 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 45 58 43  OCK: return "EXC
7f80: 4c 55 53 49 56 45 22 3b 0a 20 20 7d 0a 20 20 72  LUSIVE";.  }.  r
7f90: 65 74 75 72 6e 20 22 45 52 52 4f 52 22 3b 0a 7d  eturn "ERROR";.}
7fa0: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20  .#endif..#ifdef 
7fb0: 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52 41 43  SQLITE_LOCK_TRAC
7fc0: 45 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 6f 75  E./*.** Print ou
7fd0: 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  t information ab
7fe0: 6f 75 74 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20  out all locking 
7ff0: 6f 70 65 72 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a  operations..**.*
8000: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
8010: 73 20 75 73 65 64 20 66 6f 72 20 74 72 6f 75 62  s used for troub
8020: 6c 65 73 68 6f 6f 74 69 6e 67 20 6c 6f 63 6b 73  leshooting locks
8030: 20 6f 6e 20 6d 75 6c 74 69 74 68 72 65 61 64 65   on multithreade
8040: 64 0a 2a 2a 20 70 6c 61 74 66 6f 72 6d 73 2e 20  d.** platforms. 
8050: 20 45 6e 61 62 6c 65 20 62 79 20 63 6f 6d 70 69   Enable by compi
8060: 6c 69 6e 67 20 77 69 74 68 20 74 68 65 20 2d 44  ling with the -D
8070: 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52 41 43  SQLITE_LOCK_TRAC
8080: 45 0a 2a 2a 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e  E.** command-lin
8090: 65 20 6f 70 74 69 6f 6e 20 6f 6e 20 74 68 65 20  e option on the 
80a0: 63 6f 6d 70 69 6c 65 72 2e 20 20 54 68 69 73 20  compiler.  This 
80b0: 63 6f 64 65 20 69 73 20 6e 6f 72 6d 61 6c 6c 79  code is normally
80c0: 0a 2a 2a 20 74 75 72 6e 65 64 20 6f 66 66 2e 0a  .** turned off..
80d0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f  */.static int lo
80e0: 63 6b 54 72 61 63 65 28 69 6e 74 20 66 64 2c 20  ckTrace(int fd, 
80f0: 69 6e 74 20 6f 70 2c 20 73 74 72 75 63 74 20 66  int op, struct f
8100: 6c 6f 63 6b 20 2a 70 29 7b 0a 20 20 63 68 61 72  lock *p){.  char
8110: 20 2a 7a 4f 70 4e 61 6d 65 2c 20 2a 7a 54 79 70   *zOpName, *zTyp
8120: 65 3b 0a 20 20 69 6e 74 20 73 3b 0a 20 20 69 6e  e;.  int s;.  in
8130: 74 20 73 61 76 65 64 45 72 72 6e 6f 3b 0a 20 20  t savedErrno;.  
8140: 69 66 28 20 6f 70 3d 3d 46 5f 47 45 54 4c 4b 20  if( op==F_GETLK 
8150: 29 7b 0a 20 20 20 20 7a 4f 70 4e 61 6d 65 20 3d  ){.    zOpName =
8160: 20 22 47 45 54 4c 4b 22 3b 0a 20 20 7d 65 6c 73   "GETLK";.  }els
8170: 65 20 69 66 28 20 6f 70 3d 3d 46 5f 53 45 54 4c  e if( op==F_SETL
8180: 4b 20 29 7b 0a 20 20 20 20 7a 4f 70 4e 61 6d 65  K ){.    zOpName
8190: 20 3d 20 22 53 45 54 4c 4b 22 3b 0a 20 20 7d 65   = "SETLK";.  }e
81a0: 6c 73 65 7b 0a 20 20 20 20 73 20 3d 20 6f 73 46  lse{.    s = osF
81b0: 63 6e 74 6c 28 66 64 2c 20 6f 70 2c 20 70 29 3b  cntl(fd, op, p);
81c0: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
81d0: 67 50 72 69 6e 74 66 28 22 66 63 6e 74 6c 20 75  gPrintf("fcntl u
81e0: 6e 6b 6e 6f 77 6e 20 25 64 20 25 64 20 25 64 5c  nknown %d %d %d\
81f0: 6e 22 2c 20 66 64 2c 20 6f 70 2c 20 73 29 3b 0a  n", fd, op, s);.
8200: 20 20 20 20 72 65 74 75 72 6e 20 73 3b 0a 20 20      return s;.  
8210: 7d 0a 20 20 69 66 28 20 70 2d 3e 6c 5f 74 79 70  }.  if( p->l_typ
8220: 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20  e==F_RDLCK ){.  
8230: 20 20 7a 54 79 70 65 20 3d 20 22 52 44 4c 43 4b    zType = "RDLCK
8240: 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  ";.  }else if( p
8250: 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 57 52 4c 43  ->l_type==F_WRLC
8260: 4b 20 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d  K ){.    zType =
8270: 20 22 57 52 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73   "WRLCK";.  }els
8280: 65 20 69 66 28 20 70 2d 3e 6c 5f 74 79 70 65 3d  e if( p->l_type=
8290: 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20  =F_UNLCK ){.    
82a0: 7a 54 79 70 65 20 3d 20 22 55 4e 4c 43 4b 22 3b  zType = "UNLCK";
82b0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
82c0: 73 65 72 74 28 20 30 20 29 3b 0a 20 20 7d 0a 20  sert( 0 );.  }. 
82d0: 20 61 73 73 65 72 74 28 20 70 2d 3e 6c 5f 77 68   assert( p->l_wh
82e0: 65 6e 63 65 3d 3d 53 45 45 4b 5f 53 45 54 20 29  ence==SEEK_SET )
82f0: 3b 0a 20 20 73 20 3d 20 6f 73 46 63 6e 74 6c 28  ;.  s = osFcntl(
8300: 66 64 2c 20 6f 70 2c 20 70 29 3b 0a 20 20 73 61  fd, op, p);.  sa
8310: 76 65 64 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  vedErrno = errno
8320: 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67  ;.  sqlite3Debug
8330: 50 72 69 6e 74 66 28 22 66 63 6e 74 6c 20 25 64  Printf("fcntl %d
8340: 20 25 64 20 25 73 20 25 73 20 25 64 20 25 64 20   %d %s %s %d %d 
8350: 25 64 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 74  %d %d\n",.     t
8360: 68 72 65 61 64 69 64 2c 20 66 64 2c 20 7a 4f 70  hreadid, fd, zOp
8370: 4e 61 6d 65 2c 20 7a 54 79 70 65 2c 20 28 69 6e  Name, zType, (in
8380: 74 29 70 2d 3e 6c 5f 73 74 61 72 74 2c 20 28 69  t)p->l_start, (i
8390: 6e 74 29 70 2d 3e 6c 5f 6c 65 6e 2c 0a 20 20 20  nt)p->l_len,.   
83a0: 20 20 28 69 6e 74 29 70 2d 3e 6c 5f 70 69 64 2c    (int)p->l_pid,
83b0: 20 73 29 3b 0a 20 20 69 66 28 20 73 3d 3d 28 2d   s);.  if( s==(-
83c0: 31 29 20 26 26 20 6f 70 3d 3d 46 5f 53 45 54 4c  1) && op==F_SETL
83d0: 4b 20 26 26 20 28 70 2d 3e 6c 5f 74 79 70 65 3d  K && (p->l_type=
83e0: 3d 46 5f 52 44 4c 43 4b 20 7c 7c 20 70 2d 3e 6c  =F_RDLCK || p->l
83f0: 5f 74 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 29 20  _type==F_WRLCK) 
8400: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 66 6c  ){.    struct fl
8410: 6f 63 6b 20 6c 32 3b 0a 20 20 20 20 6c 32 20 3d  ock l2;.    l2 =
8420: 20 2a 70 3b 0a 20 20 20 20 6f 73 46 63 6e 74 6c   *p;.    osFcntl
8430: 28 66 64 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c  (fd, F_GETLK, &l
8440: 32 29 3b 0a 20 20 20 20 69 66 28 20 6c 32 2e 6c  2);.    if( l2.l
8450: 5f 74 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29  _type==F_RDLCK )
8460: 7b 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20  {.      zType = 
8470: 22 52 44 4c 43 4b 22 3b 0a 20 20 20 20 7d 65 6c  "RDLCK";.    }el
8480: 73 65 20 69 66 28 20 6c 32 2e 6c 5f 74 79 70 65  se if( l2.l_type
8490: 3d 3d 46 5f 57 52 4c 43 4b 20 29 7b 0a 20 20 20  ==F_WRLCK ){.   
84a0: 20 20 20 7a 54 79 70 65 20 3d 20 22 57 52 4c 43     zType = "WRLC
84b0: 4b 22 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  K";.    }else if
84c0: 28 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f 55  ( l2.l_type==F_U
84d0: 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 7a 54  NLCK ){.      zT
84e0: 79 70 65 20 3d 20 22 55 4e 4c 43 4b 22 3b 0a 20  ype = "UNLCK";. 
84f0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
8500: 61 73 73 65 72 74 28 20 30 20 29 3b 0a 20 20 20  assert( 0 );.   
8510: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65   }.    sqlite3De
8520: 62 75 67 50 72 69 6e 74 66 28 22 66 63 6e 74 6c  bugPrintf("fcntl
8530: 2d 66 61 69 6c 75 72 65 2d 72 65 61 73 6f 6e 3a  -failure-reason:
8540: 20 25 73 20 25 64 20 25 64 20 25 64 5c 6e 22 2c   %s %d %d %d\n",
8550: 0a 20 20 20 20 20 20 20 7a 54 79 70 65 2c 20 28  .       zType, (
8560: 69 6e 74 29 6c 32 2e 6c 5f 73 74 61 72 74 2c 20  int)l2.l_start, 
8570: 28 69 6e 74 29 6c 32 2e 6c 5f 6c 65 6e 2c 20 28  (int)l2.l_len, (
8580: 69 6e 74 29 6c 32 2e 6c 5f 70 69 64 29 3b 0a 20  int)l2.l_pid);. 
8590: 20 7d 0a 20 20 65 72 72 6e 6f 20 3d 20 73 61 76   }.  errno = sav
85a0: 65 64 45 72 72 6e 6f 3b 0a 20 20 72 65 74 75 72  edErrno;.  retur
85b0: 6e 20 73 3b 0a 7d 0a 23 75 6e 64 65 66 20 6f 73  n s;.}.#undef os
85c0: 46 63 6e 74 6c 0a 23 64 65 66 69 6e 65 20 6f 73  Fcntl.#define os
85d0: 46 63 6e 74 6c 20 6c 6f 63 6b 54 72 61 63 65 0a  Fcntl lockTrace.
85e0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
85f0: 5f 4c 4f 43 4b 5f 54 52 41 43 45 20 2a 2f 0a 0a  _LOCK_TRACE */..
8600: 2f 2a 0a 2a 2a 20 52 65 74 72 79 20 66 74 72 75  /*.** Retry ftru
8610: 6e 63 61 74 65 28 29 20 63 61 6c 6c 73 20 74 68  ncate() calls th
8620: 61 74 20 66 61 69 6c 20 64 75 65 20 74 6f 20 45  at fail due to E
8630: 49 4e 54 52 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 63  INTR.**.** All c
8640: 61 6c 6c 73 20 74 6f 20 66 74 72 75 6e 63 61 74  alls to ftruncat
8650: 65 28 29 20 77 69 74 68 69 6e 20 74 68 69 73 20  e() within this 
8660: 66 69 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 6d  file should be m
8670: 61 64 65 20 74 68 72 6f 75 67 68 0a 2a 2a 20 74  ade through.** t
8680: 68 69 73 20 77 72 61 70 70 65 72 2e 20 20 4f 6e  his wrapper.  On
8690: 20 74 68 65 20 41 6e 64 72 6f 69 64 20 70 6c 61   the Android pla
86a0: 74 66 6f 72 6d 2c 20 62 79 70 61 73 73 69 6e 67  tform, bypassing
86b0: 20 74 68 65 20 6c 6f 67 69 63 20 62 65 6c 6f 77   the logic below
86c0: 0a 2a 2a 20 63 6f 75 6c 64 20 6c 65 61 64 20 74  .** could lead t
86d0: 6f 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61  o a corrupt data
86e0: 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  base..*/.static 
86f0: 69 6e 74 20 72 6f 62 75 73 74 5f 66 74 72 75 6e  int robust_ftrun
8700: 63 61 74 65 28 69 6e 74 20 68 2c 20 73 71 6c 69  cate(int h, sqli
8710: 74 65 33 5f 69 6e 74 36 34 20 73 7a 29 7b 0a 20  te3_int64 sz){. 
8720: 20 69 6e 74 20 72 63 3b 0a 23 69 66 64 65 66 20   int rc;.#ifdef 
8730: 5f 5f 41 4e 44 52 4f 49 44 5f 5f 0a 20 20 2f 2a  __ANDROID__.  /*
8740: 20 4f 6e 20 41 6e 64 72 6f 69 64 2c 20 66 74 72   On Android, ftr
8750: 75 6e 63 61 74 65 28 29 20 61 6c 77 61 79 73 20  uncate() always 
8760: 75 73 65 73 20 33 32 2d 62 69 74 20 6f 66 66 73  uses 32-bit offs
8770: 65 74 73 2c 20 65 76 65 6e 20 69 66 20 0a 20 20  ets, even if .  
8780: 2a 2a 20 5f 46 49 4c 45 5f 4f 46 46 53 45 54 5f  ** _FILE_OFFSET_
8790: 42 49 54 53 3d 36 34 20 69 73 20 64 65 66 69 6e  BITS=64 is defin
87a0: 65 64 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 69  ed. This means i
87b0: 74 20 69 73 20 75 6e 73 61 66 65 20 74 6f 20 61  t is unsafe to a
87c0: 74 74 65 6d 70 74 20 74 6f 0a 20 20 2a 2a 20 74  ttempt to.  ** t
87d0: 72 75 6e 63 61 74 65 20 61 20 66 69 6c 65 20 74  runcate a file t
87e0: 6f 20 61 6e 79 20 73 69 7a 65 20 6c 61 72 67 65  o any size large
87f0: 72 20 74 68 61 6e 20 32 47 69 42 2e 20 53 69 6c  r than 2GiB. Sil
8800: 65 6e 74 6c 79 20 69 67 6e 6f 72 65 20 61 6e 79  ently ignore any
8810: 0a 20 20 2a 2a 20 73 75 63 68 20 61 74 74 65 6d  .  ** such attem
8820: 70 74 73 2e 20 20 2a 2f 0a 20 20 69 66 28 20 73  pts.  */.  if( s
8830: 7a 3e 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  z>(sqlite3_int64
8840: 29 30 78 37 46 46 46 46 46 46 46 20 29 7b 0a 20  )0x7FFFFFFF ){. 
8850: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
8860: 4b 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69  K;.  }else.#endi
8870: 66 0a 20 20 64 6f 7b 20 72 63 20 3d 20 6f 73 46  f.  do{ rc = osF
8880: 74 72 75 6e 63 61 74 65 28 68 2c 73 7a 29 3b 20  truncate(h,sz); 
8890: 7d 77 68 69 6c 65 28 20 72 63 3c 30 20 26 26 20  }while( rc<0 && 
88a0: 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a  errno==EINTR );.
88b0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
88c0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
88d0: 6e 65 20 74 72 61 6e 73 6c 61 74 65 73 20 61 20  ne translates a 
88e0: 73 74 61 6e 64 61 72 64 20 50 4f 53 49 58 20 65  standard POSIX e
88f0: 72 72 6e 6f 20 63 6f 64 65 20 69 6e 74 6f 20 73  rrno code into s
8900: 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 75 73 65 66  omething.** usef
8910: 75 6c 20 74 6f 20 74 68 65 20 63 6c 69 65 6e 74  ul to the client
8920: 73 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33  s of the sqlite3
8930: 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20 53 70 65   functions.  Spe
8940: 63 69 66 69 63 61 6c 6c 79 2c 20 69 74 20 69 73  cifically, it is
8950: 0a 2a 2a 20 69 6e 74 65 6e 64 65 64 20 74 6f 20  .** intended to 
8960: 74 72 61 6e 73 6c 61 74 65 20 61 20 76 61 72 69  translate a vari
8970: 65 74 79 20 6f 66 20 22 74 72 79 20 61 67 61 69  ety of "try agai
8980: 6e 22 20 65 72 72 6f 72 73 20 69 6e 74 6f 20 53  n" errors into S
8990: 51 4c 49 54 45 5f 42 55 53 59 0a 2a 2a 20 61 6e  QLITE_BUSY.** an
89a0: 64 20 61 20 76 61 72 69 65 74 79 20 6f 66 20 22  d a variety of "
89b0: 70 6c 65 61 73 65 20 63 6c 6f 73 65 20 74 68 65  please close the
89c0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
89d0: 20 4e 4f 57 22 20 65 72 72 6f 72 73 20 69 6e 74   NOW" errors int
89e0: 6f 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 49 4f 45  o .** SQLITE_IOE
89f0: 52 52 0a 2a 2a 20 0a 2a 2a 20 45 72 72 6f 72 73  RR.** .** Errors
8a00: 20 64 75 72 69 6e 67 20 69 6e 69 74 69 61 6c 69   during initiali
8a10: 7a 61 74 69 6f 6e 20 6f 66 20 6c 6f 63 6b 73 2c  zation of locks,
8a20: 20 6f 72 20 66 69 6c 65 20 73 79 73 74 65 6d 20   or file system 
8a30: 73 75 70 70 6f 72 74 20 66 6f 72 20 6c 6f 63 6b  support for lock
8a40: 73 2c 0a 2a 2a 20 73 68 6f 75 6c 64 20 68 61 6e  s,.** should han
8a50: 64 6c 65 20 45 4e 4f 4c 43 4b 2c 20 45 4e 4f 54  dle ENOLCK, ENOT
8a60: 53 55 50 2c 20 45 4f 50 4e 4f 54 53 55 50 50 20  SUP, EOPNOTSUPP 
8a70: 73 65 70 61 72 61 74 65 6c 79 2e 0a 2a 2f 0a 73  separately..*/.s
8a80: 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65  tatic int sqlite
8a90: 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
8aa0: 72 6f 72 28 69 6e 74 20 70 6f 73 69 78 45 72 72  ror(int posixErr
8ab0: 6f 72 2c 20 69 6e 74 20 73 71 6c 69 74 65 49 4f  or, int sqliteIO
8ac0: 45 72 72 29 20 7b 0a 20 20 73 77 69 74 63 68 20  Err) {.  switch 
8ad0: 28 70 6f 73 69 78 45 72 72 6f 72 29 20 7b 0a 23  (posixError) {.#
8ae0: 69 66 20 30 0a 20 20 2f 2a 20 41 74 20 6f 6e 65  if 0.  /* At one
8af0: 20 70 6f 69 6e 74 20 74 68 69 73 20 63 6f 64 65   point this code
8b00: 20 77 61 73 20 6e 6f 74 20 63 6f 6d 6d 65 6e 74   was not comment
8b10: 65 64 20 6f 75 74 2e 20 49 6e 20 74 68 65 6f 72  ed out. In theor
8b20: 79 2c 20 74 68 69 73 20 62 72 61 6e 63 68 0a 20  y, this branch. 
8b30: 20 2a 2a 20 73 68 6f 75 6c 64 20 6e 65 76 65 72   ** should never
8b40: 20 62 65 20 68 69 74 2c 20 61 73 20 74 68 69 73   be hit, as this
8b50: 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64   function should
8b60: 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20   only be called 
8b70: 61 66 74 65 72 0a 20 20 2a 2a 20 61 20 6c 6f 63  after.  ** a loc
8b80: 6b 69 6e 67 2d 72 65 6c 61 74 65 64 20 66 75 6e  king-related fun
8b90: 63 74 69 6f 6e 20 28 69 2e 65 2e 20 66 63 6e 74  ction (i.e. fcnt
8ba0: 6c 28 29 29 20 68 61 73 20 72 65 74 75 72 6e 65  l()) has returne
8bb0: 64 20 6e 6f 6e 2d 7a 65 72 6f 20 77 69 74 68 0a  d non-zero with.
8bc0: 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f    ** the value o
8bd0: 66 20 65 72 72 6e 6f 20 61 73 20 74 68 65 20 66  f errno as the f
8be0: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 53  irst argument. S
8bf0: 69 6e 63 65 20 61 20 73 79 73 74 65 6d 20 63 61  ince a system ca
8c00: 6c 6c 20 68 61 73 20 66 61 69 6c 65 64 2c 0a 20  ll has failed,. 
8c10: 20 2a 2a 20 65 72 72 6e 6f 20 73 68 6f 75 6c 64   ** errno should
8c20: 20 62 65 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 20 20   be non-zero..  
8c30: 2a 2a 0a 20 20 2a 2a 20 44 65 73 70 69 74 65 20  **.  ** Despite 
8c40: 74 68 69 73 2c 20 69 66 20 65 72 72 6e 6f 20 72  this, if errno r
8c50: 65 61 6c 6c 79 20 69 73 20 7a 65 72 6f 2c 20 77  eally is zero, w
8c60: 65 20 73 74 69 6c 6c 20 64 6f 6e 27 74 20 77 61  e still don't wa
8c70: 6e 74 20 74 6f 20 72 65 74 75 72 6e 0a 20 20 2a  nt to return.  *
8c80: 2a 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 54 68 65  * SQLITE_OK. The
8c90: 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 66 61 69   system call fai
8ca0: 6c 65 64 2c 20 61 6e 64 20 2a 73 6f 6d 65 2a 20  led, and *some* 
8cb0: 53 51 4c 69 74 65 20 65 72 72 6f 72 20 73 68 6f  SQLite error sho
8cc0: 75 6c 64 20 62 65 0a 20 20 2a 2a 20 70 72 6f 70  uld be.  ** prop
8cd0: 61 67 61 74 65 64 20 62 61 63 6b 20 74 6f 20 74  agated back to t
8ce0: 68 65 20 63 61 6c 6c 65 72 2e 20 43 6f 6d 6d 65  he caller. Comme
8cf0: 6e 74 69 6e 67 20 74 68 69 73 20 62 72 61 6e 63  nting this branc
8d00: 68 20 6f 75 74 20 6d 65 61 6e 73 20 65 72 72 6e  h out means errn
8d10: 6f 3d 3d 30 0a 20 20 2a 2a 20 77 69 6c 6c 20 62  o==0.  ** will b
8d20: 65 20 68 61 6e 64 6c 65 64 20 62 79 20 74 68 65  e handled by the
8d30: 20 22 64 65 66 61 75 6c 74 3a 22 20 63 61 73 65   "default:" case
8d40: 20 62 65 6c 6f 77 2e 0a 20 20 2a 2f 0a 20 20 63   below..  */.  c
8d50: 61 73 65 20 30 3a 20 0a 20 20 20 20 72 65 74 75  ase 0: .    retu
8d60: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65  rn SQLITE_OK;.#e
8d70: 6e 64 69 66 0a 0a 20 20 63 61 73 65 20 45 41 47  ndif..  case EAG
8d80: 41 49 4e 3a 0a 20 20 63 61 73 65 20 45 54 49 4d  AIN:.  case ETIM
8d90: 45 44 4f 55 54 3a 0a 20 20 63 61 73 65 20 45 42  EDOUT:.  case EB
8da0: 55 53 59 3a 0a 20 20 63 61 73 65 20 45 49 4e 54  USY:.  case EINT
8db0: 52 3a 0a 20 20 63 61 73 65 20 45 4e 4f 4c 43 4b  R:.  case ENOLCK
8dc0: 3a 20 20 0a 20 20 20 20 2f 2a 20 72 61 6e 64 6f  :  .    /* rando
8dd0: 6d 20 4e 46 53 20 72 65 74 72 79 20 65 72 72 6f  m NFS retry erro
8de0: 72 2c 20 75 6e 6c 65 73 73 20 64 75 72 69 6e 67  r, unless during
8df0: 20 66 69 6c 65 20 73 79 73 74 65 6d 20 73 75 70   file system sup
8e00: 70 6f 72 74 20 0a 20 20 20 20 20 2a 20 69 6e 74  port .     * int
8e10: 72 6f 73 70 65 63 74 69 6f 6e 2c 20 69 6e 20 77  rospection, in w
8e20: 68 69 63 68 20 69 74 20 61 63 74 75 61 6c 6c 79  hich it actually
8e30: 20 6d 65 61 6e 73 20 77 68 61 74 20 69 74 20 73   means what it s
8e40: 61 79 73 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  ays */.    retur
8e50: 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  n SQLITE_BUSY;. 
8e60: 20 20 20 0a 20 20 63 61 73 65 20 45 41 43 43 45     .  case EACCE
8e70: 53 3a 20 0a 20 20 20 20 2f 2a 20 45 41 43 43 45  S: .    /* EACCE
8e80: 53 20 69 73 20 6c 69 6b 65 20 45 41 47 41 49 4e  S is like EAGAIN
8e90: 20 64 75 72 69 6e 67 20 6c 6f 63 6b 69 6e 67 20   during locking 
8ea0: 6f 70 65 72 61 74 69 6f 6e 73 2c 20 62 75 74 20  operations, but 
8eb0: 6e 6f 74 20 61 6e 79 20 6f 74 68 65 72 20 74 69  not any other ti
8ec0: 6d 65 2a 2f 0a 20 20 20 20 69 66 28 20 28 73 71  me*/.    if( (sq
8ed0: 6c 69 74 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c  liteIOErr == SQL
8ee0: 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 20  ITE_IOERR_LOCK) 
8ef0: 7c 7c 20 0a 20 20 20 20 20 20 20 20 28 73 71 6c  || .        (sql
8f00: 69 74 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49  iteIOErr == SQLI
8f10: 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29  TE_IOERR_UNLOCK)
8f20: 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 28 73 71   || .        (sq
8f30: 6c 69 74 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c  liteIOErr == SQL
8f40: 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b  ITE_IOERR_RDLOCK
8f50: 29 20 7c 7c 0a 20 20 20 20 20 20 20 20 28 73 71  ) ||.        (sq
8f60: 6c 69 74 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c  liteIOErr == SQL
8f70: 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52  ITE_IOERR_CHECKR
8f80: 45 53 45 52 56 45 44 4c 4f 43 4b 29 20 29 7b 0a  ESERVEDLOCK) ){.
8f90: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
8fa0: 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a  ITE_BUSY;.    }.
8fb0: 20 20 20 20 2f 2a 20 65 6c 73 65 20 66 61 6c 6c      /* else fall
8fc0: 20 74 68 72 6f 75 67 68 20 2a 2f 0a 20 20 63 61   through */.  ca
8fd0: 73 65 20 45 50 45 52 4d 3a 20 0a 20 20 20 20 72  se EPERM: .    r
8fe0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52  eturn SQLITE_PER
8ff0: 4d 3b 0a 20 20 20 20 0a 23 69 66 20 45 4f 50 4e  M;.    .#if EOPN
9000: 4f 54 53 55 50 50 21 3d 45 4e 4f 54 53 55 50 0a  OTSUPP!=ENOTSUP.
9010: 20 20 63 61 73 65 20 45 4f 50 4e 4f 54 53 55 50    case EOPNOTSUP
9020: 50 3a 20 0a 20 20 20 20 2f 2a 20 73 6f 6d 65 74  P: .    /* somet
9030: 68 69 6e 67 20 77 65 6e 74 20 74 65 72 72 69 62  hing went terrib
9040: 6c 79 20 61 77 72 79 2c 20 75 6e 6c 65 73 73 20  ly awry, unless 
9050: 64 75 72 69 6e 67 20 66 69 6c 65 20 73 79 73 74  during file syst
9060: 65 6d 20 73 75 70 70 6f 72 74 20 0a 20 20 20 20  em support .    
9070: 20 2a 20 69 6e 74 72 6f 73 70 65 63 74 69 6f 6e   * introspection
9080: 2c 20 69 6e 20 77 68 69 63 68 20 69 74 20 61 63  , in which it ac
9090: 74 75 61 6c 6c 79 20 6d 65 61 6e 73 20 77 68 61  tually means wha
90a0: 74 20 69 74 20 73 61 79 73 20 2a 2f 0a 23 65 6e  t it says */.#en
90b0: 64 69 66 0a 23 69 66 64 65 66 20 45 4e 4f 54 53  dif.#ifdef ENOTS
90c0: 55 50 0a 20 20 63 61 73 65 20 45 4e 4f 54 53 55  UP.  case ENOTSU
90d0: 50 3a 20 0a 20 20 20 20 2f 2a 20 69 6e 76 61 6c  P: .    /* inval
90e0: 69 64 20 66 64 2c 20 75 6e 6c 65 73 73 20 64 75  id fd, unless du
90f0: 72 69 6e 67 20 66 69 6c 65 20 73 79 73 74 65 6d  ring file system
9100: 20 73 75 70 70 6f 72 74 20 69 6e 74 72 6f 73 70   support introsp
9110: 65 63 74 69 6f 6e 2c 20 69 6e 20 77 68 69 63 68  ection, in which
9120: 20 0a 20 20 20 20 20 2a 20 69 74 20 61 63 74 75   .     * it actu
9130: 61 6c 6c 79 20 6d 65 61 6e 73 20 77 68 61 74 20  ally means what 
9140: 69 74 20 73 61 79 73 20 2a 2f 0a 23 65 6e 64 69  it says */.#endi
9150: 66 0a 20 20 63 61 73 65 20 45 49 4f 3a 0a 20 20  f.  case EIO:.  
9160: 63 61 73 65 20 45 42 41 44 46 3a 0a 20 20 63 61  case EBADF:.  ca
9170: 73 65 20 45 49 4e 56 41 4c 3a 0a 20 20 63 61 73  se EINVAL:.  cas
9180: 65 20 45 4e 4f 54 43 4f 4e 4e 3a 0a 20 20 63 61  e ENOTCONN:.  ca
9190: 73 65 20 45 4e 4f 44 45 56 3a 0a 20 20 63 61 73  se ENODEV:.  cas
91a0: 65 20 45 4e 58 49 4f 3a 0a 20 20 63 61 73 65 20  e ENXIO:.  case 
91b0: 45 4e 4f 45 4e 54 3a 0a 23 69 66 64 65 66 20 45  ENOENT:.#ifdef E
91c0: 53 54 41 4c 45 20 20 20 20 20 20 20 20 20 20 20  STALE           
91d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 53 54            /* EST
91e0: 41 4c 45 20 69 73 20 6e 6f 74 20 64 65 66 69 6e  ALE is not defin
91f0: 65 64 20 6f 6e 20 49 6e 74 65 72 69 78 20 73 79  ed on Interix sy
9200: 73 74 65 6d 73 20 2a 2f 0a 20 20 63 61 73 65 20  stems */.  case 
9210: 45 53 54 41 4c 45 3a 0a 23 65 6e 64 69 66 0a 20  ESTALE:.#endif. 
9220: 20 63 61 73 65 20 45 4e 4f 53 59 53 3a 0a 20 20   case ENOSYS:.  
9230: 20 20 2f 2a 20 74 68 65 73 65 20 73 68 6f 75 6c    /* these shoul
9240: 64 20 66 6f 72 63 65 20 74 68 65 20 63 6c 69 65  d force the clie
9250: 6e 74 20 74 6f 20 63 6c 6f 73 65 20 74 68 65 20  nt to close the 
9260: 66 69 6c 65 20 61 6e 64 20 72 65 63 6f 6e 6e 65  file and reconne
9270: 63 74 20 2a 2f 0a 20 20 20 20 0a 20 20 64 65 66  ct */.    .  def
9280: 61 75 6c 74 3a 20 0a 20 20 20 20 72 65 74 75 72  ault: .    retur
9290: 6e 20 73 71 6c 69 74 65 49 4f 45 72 72 3b 0a 20  n sqliteIOErr;. 
92a0: 20 7d 0a 7d 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a   }.}.../********
92b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
92c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
92d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
92e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
92f0: 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
9300: 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20  ********* Begin 
9310: 55 6e 69 71 75 65 20 46 69 6c 65 20 49 44 20 55  Unique File ID U
9320: 74 69 6c 69 74 79 20 55 73 65 64 20 42 79 20 56  tility Used By V
9330: 78 57 6f 72 6b 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  xWorks *********
9340: 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4f 6e 20  ******.**.** On 
9350: 6d 6f 73 74 20 76 65 72 73 69 6f 6e 73 20 6f 66  most versions of
9360: 20 75 6e 69 78 2c 20 77 65 20 63 61 6e 20 67 65   unix, we can ge
9370: 74 20 61 20 75 6e 69 71 75 65 20 49 44 20 66 6f  t a unique ID fo
9380: 72 20 61 20 66 69 6c 65 20 62 79 20 63 6f 6e 63  r a file by conc
9390: 61 74 65 6e 61 74 69 6e 67 0a 2a 2a 20 74 68 65  atenating.** the
93a0: 20 64 65 76 69 63 65 20 6e 75 6d 62 65 72 20 61   device number a
93b0: 6e 64 20 74 68 65 20 69 6e 6f 64 65 20 6e 75 6d  nd the inode num
93c0: 62 65 72 2e 20 20 42 75 74 20 74 68 69 73 20 64  ber.  But this d
93d0: 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20  oes not work on 
93e0: 56 78 57 6f 72 6b 73 2e 0a 2a 2a 20 4f 6e 20 56  VxWorks..** On V
93f0: 78 57 6f 72 6b 73 2c 20 61 20 75 6e 69 71 75 65  xWorks, a unique
9400: 20 66 69 6c 65 20 69 64 20 6d 75 73 74 20 62 65   file id must be
9410: 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 63 61   based on the ca
9420: 6e 6f 6e 69 63 61 6c 20 66 69 6c 65 6e 61 6d 65  nonical filename
9430: 2e 0a 2a 2a 0a 2a 2a 20 41 20 70 6f 69 6e 74 65  ..**.** A pointe
9440: 72 20 74 6f 20 61 6e 20 69 6e 73 74 61 6e 63 65  r to an instance
9450: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
9460: 67 20 73 74 72 75 63 74 75 72 65 20 63 61 6e 20  g structure can 
9470: 62 65 20 75 73 65 64 20 61 73 20 61 0a 2a 2a 20  be used as a.** 
9480: 75 6e 69 71 75 65 20 66 69 6c 65 20 49 44 20 69  unique file ID i
9490: 6e 20 56 78 57 6f 72 6b 73 2e 20 20 45 61 63 68  n VxWorks.  Each
94a0: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69   instance of thi
94b0: 73 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74  s structure cont
94c0: 61 69 6e 73 0a 2a 2a 20 61 20 63 6f 70 79 20 6f  ains.** a copy o
94d0: 66 20 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c 20  f the canonical 
94e0: 66 69 6c 65 6e 61 6d 65 2e 20 20 54 68 65 72 65  filename.  There
94f0: 20 69 73 20 61 6c 73 6f 20 61 20 72 65 66 65 72   is also a refer
9500: 65 6e 63 65 20 63 6f 75 6e 74 2e 20 20 0a 2a 2a  ence count.  .**
9510: 20 54 68 65 20 73 74 72 75 63 74 75 72 65 20 69   The structure i
9520: 73 20 72 65 63 6c 61 69 6d 65 64 20 77 68 65 6e  s reclaimed when
9530: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
9540: 6f 69 6e 74 65 72 73 20 74 6f 20 69 74 20 64 72  ointers to it dr
9550: 6f 70 73 20 74 6f 0a 2a 2a 20 7a 65 72 6f 2e 0a  ops to.** zero..
9560: 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20  **.** There are 
9570: 6e 65 76 65 72 20 76 65 72 79 20 6d 61 6e 79 20  never very many 
9580: 66 69 6c 65 73 20 6f 70 65 6e 20 61 74 20 6f 6e  files open at on
9590: 65 20 74 69 6d 65 20 61 6e 64 20 6c 6f 6f 6b 75  e time and looku
95a0: 70 73 20 61 72 65 20 6e 6f 74 0a 2a 2a 20 61 20  ps are not.** a 
95b0: 70 65 72 66 6f 72 6d 61 6e 63 65 2d 63 72 69 74  performance-crit
95c0: 69 63 61 6c 20 70 61 74 68 2c 20 73 6f 20 69 74  ical path, so it
95d0: 20 69 73 20 73 75 66 66 69 63 69 65 6e 74 20 74   is sufficient t
95e0: 6f 20 70 75 74 20 74 68 65 73 65 0a 2a 2a 20 73  o put these.** s
95f0: 74 72 75 63 74 75 72 65 73 20 6f 6e 20 61 20 6c  tructures on a l
9600: 69 6e 6b 65 64 20 6c 69 73 74 2e 0a 2a 2f 0a 73  inked list..*/.s
9610: 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c  truct vxworksFil
9620: 65 49 64 20 7b 0a 20 20 73 74 72 75 63 74 20 76  eId {.  struct v
9630: 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 4e  xworksFileId *pN
9640: 65 78 74 3b 20 20 2f 2a 20 4e 65 78 74 20 69 6e  ext;  /* Next in
9650: 20 61 20 6c 69 73 74 20 6f 66 20 74 68 65 6d 20   a list of them 
9660: 61 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65  all */.  int nRe
9670: 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
9680: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
9690: 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74   of references t
96a0: 6f 20 74 68 69 73 20 6f 6e 65 20 2a 2f 0a 20 20  o this one */.  
96b0: 69 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20  int nName;      
96c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
96d0: 20 4c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 7a   Length of the z
96e0: 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 5b 5d 20  CanonicalName[] 
96f0: 73 74 72 69 6e 67 20 2a 2f 0a 20 20 63 68 61 72  string */.  char
9700: 20 2a 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65   *zCanonicalName
9710: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61 6e  ;         /* Can
9720: 6f 6e 69 63 61 6c 20 66 69 6c 65 6e 61 6d 65 20  onical filename 
9730: 2a 2f 0a 7d 3b 0a 0a 23 69 66 20 4f 53 5f 56 58  */.};..#if OS_VX
9740: 57 4f 52 4b 53 0a 2f 2a 20 0a 2a 2a 20 41 6c 6c  WORKS./* .** All
9750: 20 75 6e 69 71 75 65 20 66 69 6c 65 6e 61 6d 65   unique filename
9760: 73 20 61 72 65 20 68 65 6c 64 20 6f 6e 20 61 20  s are held on a 
9770: 6c 69 6e 6b 65 64 20 6c 69 73 74 20 68 65 61 64  linked list head
9780: 65 64 20 62 79 20 74 68 69 73 0a 2a 2a 20 76 61  ed by this.** va
9790: 72 69 61 62 6c 65 3a 0a 2a 2f 0a 73 74 61 74 69  riable:.*/.stati
97a0: 63 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73  c struct vxworks
97b0: 46 69 6c 65 49 64 20 2a 76 78 77 6f 72 6b 73 46  FileId *vxworksF
97c0: 69 6c 65 4c 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a  ileList = 0;../*
97d0: 0a 2a 2a 20 53 69 6d 70 6c 69 66 79 20 61 20 66  .** Simplify a f
97e0: 69 6c 65 6e 61 6d 65 20 69 6e 74 6f 20 69 74 73  ilename into its
97f0: 20 63 61 6e 6f 6e 69 63 61 6c 20 66 6f 72 6d 0a   canonical form.
9800: 2a 2a 20 62 79 20 6d 61 6b 69 6e 67 20 74 68 65  ** by making the
9810: 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 6e 67   following chang
9820: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 2a 20 72 65 6d  es:.**.**  * rem
9830: 6f 76 69 6e 67 20 61 6e 79 20 74 72 61 69 6c 69  oving any traili
9840: 6e 67 20 61 6e 64 20 64 75 70 6c 69 63 61 74 65  ng and duplicate
9850: 20 2f 0a 2a 2a 20 20 2a 20 63 6f 6e 76 65 72 74   /.**  * convert
9860: 20 2f 2e 2f 20 69 6e 74 6f 20 6a 75 73 74 20 2f   /./ into just /
9870: 0a 2a 2a 20 20 2a 20 63 6f 6e 76 65 72 74 20 2f  .**  * convert /
9880: 41 2f 2e 2e 2f 20 77 68 65 72 65 20 41 20 69 73  A/../ where A is
9890: 20 61 6e 79 20 73 69 6d 70 6c 65 20 6e 61 6d 65   any simple name
98a0: 20 69 6e 74 6f 20 6a 75 73 74 20 2f 0a 2a 2a 0a   into just /.**.
98b0: 2a 2a 20 43 68 61 6e 67 65 73 20 61 72 65 20 6d  ** Changes are m
98c0: 61 64 65 20 69 6e 2d 70 6c 61 63 65 2e 20 20 52  ade in-place.  R
98d0: 65 74 75 72 6e 20 74 68 65 20 6e 65 77 20 6e 61  eturn the new na
98e0: 6d 65 20 6c 65 6e 67 74 68 2e 0a 2a 2a 0a 2a 2a  me length..**.**
98f0: 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 66 69   The original fi
9900: 6c 65 6e 61 6d 65 20 69 73 20 69 6e 20 7a 5b 30  lename is in z[0
9910: 2e 2e 6e 2d 31 5d 2e 20 20 52 65 74 75 72 6e 20  ..n-1].  Return 
9920: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a  the number of.**
9930: 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 74   characters in t
9940: 68 65 20 73 69 6d 70 6c 69 66 69 65 64 20 6e 61  he simplified na
9950: 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  me..*/.static in
9960: 74 20 76 78 77 6f 72 6b 73 53 69 6d 70 6c 69 66  t vxworksSimplif
9970: 79 4e 61 6d 65 28 63 68 61 72 20 2a 7a 2c 20 69  yName(char *z, i
9980: 6e 74 20 6e 29 7b 0a 20 20 69 6e 74 20 69 2c 20  nt n){.  int i, 
9990: 6a 3b 0a 20 20 77 68 69 6c 65 28 20 6e 3e 31 20  j;.  while( n>1 
99a0: 26 26 20 7a 5b 6e 2d 31 5d 3d 3d 27 2f 27 20 29  && z[n-1]=='/' )
99b0: 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 66 6f 72 28 69  { n--; }.  for(i
99c0: 3d 6a 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b  =j=0; i<n; i++){
99d0: 0a 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 27  .    if( z[i]=='
99e0: 2f 27 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  /' ){.      if( 
99f0: 7a 5b 69 2b 31 5d 3d 3d 27 2f 27 20 29 20 63 6f  z[i+1]=='/' ) co
9a00: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66  ntinue;.      if
9a10: 28 20 7a 5b 69 2b 31 5d 3d 3d 27 2e 27 20 26 26  ( z[i+1]=='.' &&
9a20: 20 69 2b 32 3c 6e 20 26 26 20 7a 5b 69 2b 32 5d   i+2<n && z[i+2]
9a30: 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 20  =='/' ){.       
9a40: 20 69 20 2b 3d 20 31 3b 0a 20 20 20 20 20 20 20   i += 1;.       
9a50: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
9a60: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 69   }.      if( z[i
9a70: 2b 31 5d 3d 3d 27 2e 27 20 26 26 20 69 2b 33 3c  +1]=='.' && i+3<
9a80: 6e 20 26 26 20 7a 5b 69 2b 32 5d 3d 3d 27 2e 27  n && z[i+2]=='.'
9a90: 20 26 26 20 7a 5b 69 2b 33 5d 3d 3d 27 2f 27 20   && z[i+3]=='/' 
9aa0: 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  ){.        while
9ab0: 28 20 6a 3e 30 20 26 26 20 7a 5b 6a 2d 31 5d 21  ( j>0 && z[j-1]!
9ac0: 3d 27 2f 27 20 29 7b 20 6a 2d 2d 3b 20 7d 0a 20  ='/' ){ j--; }. 
9ad0: 20 20 20 20 20 20 20 69 66 28 20 6a 3e 30 20 29         if( j>0 )
9ae0: 7b 20 6a 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 20  { j--; }.       
9af0: 20 69 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 20   i += 2;.       
9b00: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
9b10: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 5b 6a   }.    }.    z[j
9b20: 2b 2b 5d 20 3d 20 7a 5b 69 5d 3b 0a 20 20 7d 0a  ++] = z[i];.  }.
9b30: 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20 72 65    z[j] = 0;.  re
9b40: 74 75 72 6e 20 6a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn j;.}../*.**
9b50: 20 46 69 6e 64 20 61 20 75 6e 69 71 75 65 20 66   Find a unique f
9b60: 69 6c 65 20 49 44 20 66 6f 72 20 74 68 65 20 67  ile ID for the g
9b70: 69 76 65 6e 20 61 62 73 6f 6c 75 74 65 20 70 61  iven absolute pa
9b80: 74 68 6e 61 6d 65 2e 20 20 52 65 74 75 72 6e 0a  thname.  Return.
9b90: 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ** a pointer to 
9ba0: 74 68 65 20 76 78 77 6f 72 6b 73 46 69 6c 65 49  the vxworksFileI
9bb0: 64 20 6f 62 6a 65 63 74 2e 20 20 54 68 69 73 20  d object.  This 
9bc0: 70 6f 69 6e 74 65 72 20 69 73 20 74 68 65 20 75  pointer is the u
9bd0: 6e 69 71 75 65 0a 2a 2a 20 66 69 6c 65 20 49 44  nique.** file ID
9be0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 52 65 66  ..**.** The nRef
9bf0: 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 76 78   field of the vx
9c00: 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65  worksFileId obje
9c10: 63 74 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65  ct is incremente
9c20: 64 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20  d before.** the 
9c30: 6f 62 6a 65 63 74 20 69 73 20 72 65 74 75 72 6e  object is return
9c40: 65 64 2e 20 20 41 20 6e 65 77 20 76 78 77 6f 72  ed.  A new vxwor
9c50: 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65 63 74 20  ksFileId object 
9c60: 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e  is created.** an
9c70: 64 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 67  d added to the g
9c80: 6c 6f 62 61 6c 20 6c 69 73 74 20 69 66 20 6e 65  lobal list if ne
9c90: 63 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 49  cessary..**.** I
9ca0: 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63  f a memory alloc
9cb0: 61 74 69 6f 6e 20 65 72 72 6f 72 20 6f 63 63 75  ation error occu
9cc0: 72 73 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e  rs, return NULL.
9cd0: 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63  .*/.static struc
9ce0: 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  t vxworksFileId 
9cf0: 2a 76 78 77 6f 72 6b 73 46 69 6e 64 46 69 6c 65  *vxworksFindFile
9d00: 49 64 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  Id(const char *z
9d10: 41 62 73 6f 6c 75 74 65 4e 61 6d 65 29 7b 0a 20  AbsoluteName){. 
9d20: 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46   struct vxworksF
9d30: 69 6c 65 49 64 20 2a 70 4e 65 77 3b 20 20 20 20  ileId *pNew;    
9d40: 20 20 20 20 20 2f 2a 20 73 65 61 72 63 68 20 6b       /* search k
9d50: 65 79 20 61 6e 64 20 6e 65 77 20 66 69 6c 65 20  ey and new file 
9d60: 49 44 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 76  ID */.  struct v
9d70: 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 43  xworksFileId *pC
9d80: 61 6e 64 69 64 61 74 65 3b 20 20 20 2f 2a 20 46  andidate;   /* F
9d90: 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20  or looping over 
9da0: 65 78 69 73 74 69 6e 67 20 66 69 6c 65 20 49 44  existing file ID
9db0: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20  s */.  int n;   
9dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9dd0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65             /* Le
9de0: 6e 67 74 68 20 6f 66 20 7a 41 62 73 6f 6c 75 74  ngth of zAbsolut
9df0: 65 4e 61 6d 65 20 73 74 72 69 6e 67 20 2a 2f 0a  eName string */.
9e00: 0a 20 20 61 73 73 65 72 74 28 20 7a 41 62 73 6f  .  assert( zAbso
9e10: 6c 75 74 65 4e 61 6d 65 5b 30 5d 3d 3d 27 2f 27  luteName[0]=='/'
9e20: 20 29 3b 0a 20 20 6e 20 3d 20 28 69 6e 74 29 73   );.  n = (int)s
9e30: 74 72 6c 65 6e 28 7a 41 62 73 6f 6c 75 74 65 4e  trlen(zAbsoluteN
9e40: 61 6d 65 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73  ame);.  pNew = s
9e50: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28  qlite3_malloc64(
9e60: 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 2b   sizeof(*pNew) +
9e70: 20 28 6e 2b 31 29 20 29 3b 0a 20 20 69 66 28 20   (n+1) );.  if( 
9e80: 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e  pNew==0 ) return
9e90: 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 7a 43 61 6e   0;.  pNew->zCan
9ea0: 6f 6e 69 63 61 6c 4e 61 6d 65 20 3d 20 28 63 68  onicalName = (ch
9eb0: 61 72 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a 20 20  ar*)&pNew[1];.  
9ec0: 6d 65 6d 63 70 79 28 70 4e 65 77 2d 3e 7a 43 61  memcpy(pNew->zCa
9ed0: 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20 7a 41 62  nonicalName, zAb
9ee0: 73 6f 6c 75 74 65 4e 61 6d 65 2c 20 6e 2b 31 29  soluteName, n+1)
9ef0: 3b 0a 20 20 6e 20 3d 20 76 78 77 6f 72 6b 73 53  ;.  n = vxworksS
9f00: 69 6d 70 6c 69 66 79 4e 61 6d 65 28 70 4e 65 77  implifyName(pNew
9f10: 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65  ->zCanonicalName
9f20: 2c 20 6e 29 3b 0a 0a 20 20 2f 2a 20 53 65 61 72  , n);..  /* Sear
9f30: 63 68 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69  ch for an existi
9f40: 6e 67 20 65 6e 74 72 79 20 74 68 61 74 20 6d 61  ng entry that ma
9f50: 74 63 68 69 6e 67 20 74 68 65 20 63 61 6e 6f 6e  tching the canon
9f60: 69 63 61 6c 20 6e 61 6d 65 2e 0a 20 20 2a 2a 20  ical name..  ** 
9f70: 49 66 20 66 6f 75 6e 64 2c 20 69 6e 63 72 65 6d  If found, increm
9f80: 65 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e 63  ent the referenc
9f90: 65 20 63 6f 75 6e 74 20 61 6e 64 20 72 65 74 75  e count and retu
9fa0: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 0a  rn a pointer to.
9fb0: 20 20 2a 2a 20 74 68 65 20 65 78 69 73 74 69 6e    ** the existin
9fc0: 67 20 66 69 6c 65 20 49 44 2e 0a 20 20 2a 2f 0a  g file ID..  */.
9fd0: 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
9fe0: 28 29 3b 0a 20 20 66 6f 72 28 70 43 61 6e 64 69  ();.  for(pCandi
9ff0: 64 61 74 65 3d 76 78 77 6f 72 6b 73 46 69 6c 65  date=vxworksFile
a000: 4c 69 73 74 3b 20 70 43 61 6e 64 69 64 61 74 65  List; pCandidate
a010: 3b 20 70 43 61 6e 64 69 64 61 74 65 3d 70 43 61  ; pCandidate=pCa
a020: 6e 64 69 64 61 74 65 2d 3e 70 4e 65 78 74 29 7b  ndidate->pNext){
a030: 0a 20 20 20 20 69 66 28 20 70 43 61 6e 64 69 64  .    if( pCandid
a040: 61 74 65 2d 3e 6e 4e 61 6d 65 3d 3d 6e 20 0a 20  ate->nName==n . 
a050: 20 20 20 20 26 26 20 6d 65 6d 63 6d 70 28 70 43      && memcmp(pC
a060: 61 6e 64 69 64 61 74 65 2d 3e 7a 43 61 6e 6f 6e  andidate->zCanon
a070: 69 63 61 6c 4e 61 6d 65 2c 20 70 4e 65 77 2d 3e  icalName, pNew->
a080: 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20  zCanonicalName, 
a090: 6e 29 3d 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20  n)==0.    ){.   
a0a0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
a0b0: 28 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 70  (pNew);.       p
a0c0: 43 61 6e 64 69 64 61 74 65 2d 3e 6e 52 65 66 2b  Candidate->nRef+
a0d0: 2b 3b 0a 20 20 20 20 20 20 20 75 6e 69 78 4c 65  +;.       unixLe
a0e0: 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 20 20  aveMutex();.    
a0f0: 20 20 20 72 65 74 75 72 6e 20 70 43 61 6e 64 69     return pCandi
a100: 64 61 74 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  date;.    }.  }.
a110: 0a 20 20 2f 2a 20 4e 6f 20 6d 61 74 63 68 20 77  .  /* No match w
a120: 61 73 20 66 6f 75 6e 64 2e 20 20 57 65 20 77 69  as found.  We wi
a130: 6c 6c 20 6d 61 6b 65 20 61 20 6e 65 77 20 66 69  ll make a new fi
a140: 6c 65 20 49 44 20 2a 2f 0a 20 20 70 4e 65 77 2d  le ID */.  pNew-
a150: 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 70 4e 65  >nRef = 1;.  pNe
a160: 77 2d 3e 6e 4e 61 6d 65 20 3d 20 6e 3b 0a 20 20  w->nName = n;.  
a170: 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20 76 78  pNew->pNext = vx
a180: 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74 3b 0a 20  worksFileList;. 
a190: 20 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74   vxworksFileList
a1a0: 20 3d 20 70 4e 65 77 3b 0a 20 20 75 6e 69 78 4c   = pNew;.  unixL
a1b0: 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 72  eaveMutex();.  r
a1c0: 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f  eturn pNew;.}../
a1d0: 2a 0a 2a 2a 20 44 65 63 72 65 6d 65 6e 74 20 74  *.** Decrement t
a1e0: 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  he reference cou
a1f0: 6e 74 20 6f 6e 20 61 20 76 78 77 6f 72 6b 73 46  nt on a vxworksF
a200: 69 6c 65 49 64 20 6f 62 6a 65 63 74 2e 20 20 46  ileId object.  F
a210: 72 65 65 0a 2a 2a 20 74 68 65 20 6f 62 6a 65 63  ree.** the objec
a220: 74 20 77 68 65 6e 20 74 68 65 20 72 65 66 65 72  t when the refer
a230: 65 6e 63 65 20 63 6f 75 6e 74 20 72 65 61 63 68  ence count reach
a240: 65 73 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74  es zero..*/.stat
a250: 69 63 20 76 6f 69 64 20 76 78 77 6f 72 6b 73 52  ic void vxworksR
a260: 65 6c 65 61 73 65 46 69 6c 65 49 64 28 73 74 72  eleaseFileId(str
a270: 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49  uct vxworksFileI
a280: 64 20 2a 70 49 64 29 7b 0a 20 20 75 6e 69 78 45  d *pId){.  unixE
a290: 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 61  nterMutex();.  a
a2a0: 73 73 65 72 74 28 20 70 49 64 2d 3e 6e 52 65 66  ssert( pId->nRef
a2b0: 3e 30 20 29 3b 0a 20 20 70 49 64 2d 3e 6e 52 65  >0 );.  pId->nRe
a2c0: 66 2d 2d 3b 0a 20 20 69 66 28 20 70 49 64 2d 3e  f--;.  if( pId->
a2d0: 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 73  nRef==0 ){.    s
a2e0: 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c  truct vxworksFil
a2f0: 65 49 64 20 2a 2a 70 70 3b 0a 20 20 20 20 66 6f  eId **pp;.    fo
a300: 72 28 70 70 3d 26 76 78 77 6f 72 6b 73 46 69 6c  r(pp=&vxworksFil
a310: 65 4c 69 73 74 3b 20 2a 70 70 20 26 26 20 2a 70  eList; *pp && *p
a320: 70 21 3d 70 49 64 3b 20 70 70 20 3d 20 26 28 28  p!=pId; pp = &((
a330: 2a 70 70 29 2d 3e 70 4e 65 78 74 29 29 7b 7d 0a  *pp)->pNext)){}.
a340: 20 20 20 20 61 73 73 65 72 74 28 20 2a 70 70 3d      assert( *pp=
a350: 3d 70 49 64 20 29 3b 0a 20 20 20 20 2a 70 70 20  =pId );.    *pp 
a360: 3d 20 70 49 64 2d 3e 70 4e 65 78 74 3b 0a 20 20  = pId->pNext;.  
a370: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
a380: 49 64 29 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 4c  Id);.  }.  unixL
a390: 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 7d 0a 23  eaveMutex();.}.#
a3a0: 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f  endif /* OS_VXWO
a3b0: 52 4b 53 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  RKS */./********
a3c0: 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 55  ******* End of U
a3d0: 6e 69 71 75 65 20 46 69 6c 65 20 49 44 20 55 74  nique File ID Ut
a3e0: 69 6c 69 74 79 20 55 73 65 64 20 42 79 20 56 78  ility Used By Vx
a3f0: 57 6f 72 6b 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  Works **********
a400: 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
a410: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a420: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
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 2a 2a 2a 2a 2a  ****************
a450: 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a  *****/.../******
a460: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a470: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a480: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a490: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a4a0: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
a4b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a4c0: 2a 2a 2a 2a 20 50 6f 73 69 78 20 41 64 76 69 73  **** Posix Advis
a4d0: 6f 72 79 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a  ory Locking ****
a4e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a4f0: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 50  ********.**.** P
a500: 4f 53 49 58 20 61 64 76 69 73 6f 72 79 20 6c 6f  OSIX advisory lo
a510: 63 6b 73 20 61 72 65 20 62 72 6f 6b 65 6e 20 62  cks are broken b
a520: 79 20 64 65 73 69 67 6e 2e 20 20 41 4e 53 49 20  y design.  ANSI 
a530: 53 54 44 20 31 30 30 33 2e 31 20 28 31 39 39 36  STD 1003.1 (1996
a540: 29 0a 2a 2a 20 73 65 63 74 69 6f 6e 20 36 2e 35  ).** section 6.5
a550: 2e 32 2e 32 20 6c 69 6e 65 73 20 34 38 33 20 74  .2.2 lines 483 t
a560: 68 72 6f 75 67 68 20 34 39 30 20 73 70 65 63 69  hrough 490 speci
a570: 66 79 20 74 68 61 74 20 77 68 65 6e 20 61 20 70  fy that when a p
a580: 72 6f 63 65 73 73 0a 2a 2a 20 73 65 74 73 20 6f  rocess.** sets o
a590: 72 20 63 6c 65 61 72 73 20 61 20 6c 6f 63 6b 2c  r clears a lock,
a5a0: 20 74 68 61 74 20 6f 70 65 72 61 74 69 6f 6e 20   that operation 
a5b0: 6f 76 65 72 72 69 64 65 73 20 61 6e 79 20 70 72  overrides any pr
a5c0: 69 6f 72 20 6c 6f 63 6b 73 20 73 65 74 0a 2a 2a  ior locks set.**
a5d0: 20 62 79 20 74 68 65 20 73 61 6d 65 20 70 72 6f   by the same pro
a5e0: 63 65 73 73 2e 20 20 49 74 20 64 6f 65 73 20 6e  cess.  It does n
a5f0: 6f 74 20 65 78 70 6c 69 63 69 74 6c 79 20 73 61  ot explicitly sa
a600: 79 20 73 6f 2c 20 62 75 74 20 74 68 69 73 20 69  y so, but this i
a610: 6d 70 6c 69 65 73 0a 2a 2a 20 74 68 61 74 20 69  mplies.** that i
a620: 74 20 6f 76 65 72 72 69 64 65 73 20 6c 6f 63 6b  t overrides lock
a630: 73 20 73 65 74 20 62 79 20 74 68 65 20 73 61 6d  s set by the sam
a640: 65 20 70 72 6f 63 65 73 73 20 75 73 69 6e 67 20  e process using 
a650: 61 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66  a different.** f
a660: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20  ile descriptor. 
a670: 20 43 6f 6e 73 69 64 65 72 20 74 68 69 73 20 74   Consider this t
a680: 65 73 74 20 63 61 73 65 3a 0a 2a 2a 0a 2a 2a 20  est case:.**.** 
a690: 20 20 20 20 20 20 69 6e 74 20 66 64 31 20 3d 20        int fd1 = 
a6a0: 6f 70 65 6e 28 22 2e 2f 66 69 6c 65 31 22 2c 20  open("./file1", 
a6b0: 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54 2c 20  O_RDWR|O_CREAT, 
a6c0: 30 36 34 34 29 3b 0a 2a 2a 20 20 20 20 20 20 20  0644);.**       
a6d0: 69 6e 74 20 66 64 32 20 3d 20 6f 70 65 6e 28 22  int fd2 = open("
a6e0: 2e 2f 66 69 6c 65 32 22 2c 20 4f 5f 52 44 57 52  ./file2", O_RDWR
a6f0: 7c 4f 5f 43 52 45 41 54 2c 20 30 36 34 34 29 3b  |O_CREAT, 0644);
a700: 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73 65 20 2e  .**.** Suppose .
a710: 2f 66 69 6c 65 31 20 61 6e 64 20 2e 2f 66 69 6c  /file1 and ./fil
a720: 65 32 20 61 72 65 20 72 65 61 6c 6c 79 20 74 68  e2 are really th
a730: 65 20 73 61 6d 65 20 66 69 6c 65 20 28 62 65 63  e same file (bec
a740: 61 75 73 65 0a 2a 2a 20 6f 6e 65 20 69 73 20 61  ause.** one is a
a750: 20 68 61 72 64 20 6f 72 20 73 79 6d 62 6f 6c 69   hard or symboli
a760: 63 20 6c 69 6e 6b 20 74 6f 20 74 68 65 20 6f 74  c link to the ot
a770: 68 65 72 29 20 74 68 65 6e 20 69 66 20 79 6f 75  her) then if you
a780: 20 73 65 74 0a 2a 2a 20 61 6e 20 65 78 63 6c 75   set.** an exclu
a790: 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 66 64 31  sive lock on fd1
a7a0: 2c 20 74 68 65 6e 20 74 72 79 20 74 6f 20 67 65  , then try to ge
a7b0: 74 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  t an exclusive l
a7c0: 6f 63 6b 0a 2a 2a 20 6f 6e 20 66 64 32 2c 20 69  ock.** on fd2, i
a7d0: 74 20 77 6f 72 6b 73 2e 20 20 49 20 77 6f 75 6c  t works.  I woul
a7e0: 64 20 68 61 76 65 20 65 78 70 65 63 74 65 64 20  d have expected 
a7f0: 74 68 65 20 73 65 63 6f 6e 64 20 6c 6f 63 6b 20  the second lock 
a800: 74 6f 0a 2a 2a 20 66 61 69 6c 20 73 69 6e 63 65  to.** fail since
a810: 20 74 68 65 72 65 20 77 61 73 20 61 6c 72 65 61   there was alrea
a820: 64 79 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  dy a lock on the
a830: 20 66 69 6c 65 20 64 75 65 20 74 6f 20 66 64 31   file due to fd1
a840: 2e 0a 2a 2a 20 42 75 74 20 6e 6f 74 20 73 6f 2e  ..** But not so.
a850: 20 20 53 69 6e 63 65 20 62 6f 74 68 20 6c 6f 63    Since both loc
a860: 6b 73 20 63 61 6d 65 20 66 72 6f 6d 20 74 68 65  ks came from the
a870: 20 73 61 6d 65 20 70 72 6f 63 65 73 73 2c 20 74   same process, t
a880: 68 65 0a 2a 2a 20 73 65 63 6f 6e 64 20 6f 76 65  he.** second ove
a890: 72 72 69 64 65 73 20 74 68 65 20 66 69 72 73 74  rrides the first
a8a0: 2c 20 65 76 65 6e 20 74 68 6f 75 67 68 20 74 68  , even though th
a8b0: 65 79 20 77 65 72 65 20 6f 6e 20 64 69 66 66 65  ey were on diffe
a8c0: 72 65 6e 74 0a 2a 2a 20 66 69 6c 65 20 64 65 73  rent.** file des
a8d0: 63 72 69 70 74 6f 72 73 20 6f 70 65 6e 65 64 20  criptors opened 
a8e0: 6f 6e 20 64 69 66 66 65 72 65 6e 74 20 66 69 6c  on different fil
a8f0: 65 20 6e 61 6d 65 73 2e 0a 2a 2a 0a 2a 2a 20 54  e names..**.** T
a900: 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 77  his means that w
a910: 65 20 63 61 6e 6e 6f 74 20 75 73 65 20 50 4f 53  e cannot use POS
a920: 49 58 20 6c 6f 63 6b 73 20 74 6f 20 73 79 6e 63  IX locks to sync
a930: 68 72 6f 6e 69 7a 65 20 66 69 6c 65 20 61 63 63  hronize file acc
a940: 65 73 73 0a 2a 2a 20 61 6d 6f 6e 67 20 63 6f 6d  ess.** among com
a950: 70 65 74 69 6e 67 20 74 68 72 65 61 64 73 20 6f  peting threads o
a960: 66 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65  f the same proce
a970: 73 73 2e 20 20 50 4f 53 49 58 20 6c 6f 63 6b 73  ss.  POSIX locks
a980: 20 77 69 6c 6c 20 77 6f 72 6b 20 66 69 6e 65 0a   will work fine.
a990: 2a 2a 20 74 6f 20 73 79 6e 63 68 72 6f 6e 69 7a  ** to synchroniz
a9a0: 65 20 61 63 63 65 73 73 20 66 6f 72 20 74 68 72  e access for thr
a9b0: 65 61 64 73 20 69 6e 20 73 65 70 61 72 61 74 65  eads in separate
a9c0: 20 70 72 6f 63 65 73 73 65 73 2c 20 62 75 74 20   processes, but 
a9d0: 6e 6f 74 0a 2a 2a 20 74 68 72 65 61 64 73 20 77  not.** threads w
a9e0: 69 74 68 69 6e 20 74 68 65 20 73 61 6d 65 20 70  ithin the same p
a9f0: 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f  rocess..**.** To
aa00: 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 65   work around the
aa10: 20 70 72 6f 62 6c 65 6d 2c 20 53 51 4c 69 74 65   problem, SQLite
aa20: 20 68 61 73 20 74 6f 20 6d 61 6e 61 67 65 20 66   has to manage f
aa30: 69 6c 65 20 6c 6f 63 6b 73 20 69 6e 74 65 72 6e  ile locks intern
aa40: 61 6c 6c 79 0a 2a 2a 20 6f 6e 20 69 74 73 20 6f  ally.** on its o
aa50: 77 6e 2e 20 20 57 68 65 6e 65 76 65 72 20 61 20  wn.  Whenever a 
aa60: 6e 65 77 20 64 61 74 61 62 61 73 65 20 69 73 20  new database is 
aa70: 6f 70 65 6e 65 64 2c 20 77 65 20 68 61 76 65 20  opened, we have 
aa80: 74 6f 20 66 69 6e 64 20 74 68 65 0a 2a 2a 20 73  to find the.** s
aa90: 70 65 63 69 66 69 63 20 69 6e 6f 64 65 20 6f 66  pecific inode of
aaa0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
aab0: 6c 65 20 28 74 68 65 20 69 6e 6f 64 65 20 69 73  le (the inode is
aac0: 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74   determined by t
aad0: 68 65 0a 2a 2a 20 73 74 5f 64 65 76 20 61 6e 64  he.** st_dev and
aae0: 20 73 74 5f 69 6e 6f 20 66 69 65 6c 64 73 20 6f   st_ino fields o
aaf0: 66 20 74 68 65 20 73 74 61 74 20 73 74 72 75 63  f the stat struc
ab00: 74 75 72 65 20 74 68 61 74 20 66 73 74 61 74 28  ture that fstat(
ab10: 29 20 66 69 6c 6c 73 20 69 6e 29 0a 2a 2a 20 61  ) fills in).** a
ab20: 6e 64 20 63 68 65 63 6b 20 66 6f 72 20 6c 6f 63  nd check for loc
ab30: 6b 73 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  ks already exist
ab40: 69 6e 67 20 6f 6e 20 74 68 61 74 20 69 6e 6f 64  ing on that inod
ab50: 65 2e 20 20 57 68 65 6e 20 6c 6f 63 6b 73 20 61  e.  When locks a
ab60: 72 65 0a 2a 2a 20 63 72 65 61 74 65 64 20 6f 72  re.** created or
ab70: 20 72 65 6d 6f 76 65 64 2c 20 77 65 20 68 61 76   removed, we hav
ab80: 65 20 74 6f 20 6c 6f 6f 6b 20 61 74 20 6f 75 72  e to look at our
ab90: 20 6f 77 6e 20 69 6e 74 65 72 6e 61 6c 20 72 65   own internal re
aba0: 63 6f 72 64 20 6f 66 20 74 68 65 0a 2a 2a 20 6c  cord of the.** l
abb0: 6f 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20 61  ocks to see if a
abc0: 6e 6f 74 68 65 72 20 74 68 72 65 61 64 20 68 61  nother thread ha
abd0: 73 20 70 72 65 76 69 6f 75 73 6c 79 20 73 65 74  s previously set
abe0: 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 61 74 20   a lock on that 
abf0: 73 61 6d 65 0a 2a 2a 20 69 6e 6f 64 65 2e 0a 2a  same.** inode..*
ac00: 2a 0a 2a 2a 20 28 41 73 69 64 65 3a 20 54 68 65  *.** (Aside: The
ac10: 20 75 73 65 20 6f 66 20 69 6e 6f 64 65 20 6e 75   use of inode nu
ac20: 6d 62 65 72 73 20 61 73 20 75 6e 69 71 75 65 20  mbers as unique 
ac30: 49 44 73 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72  IDs does not wor
ac40: 6b 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a  k on VxWorks..**
ac50: 20 46 6f 72 20 56 78 57 6f 72 6b 73 2c 20 77 65   For VxWorks, we
ac60: 20 68 61 76 65 20 74 6f 20 75 73 65 20 74 68 65   have to use the
ac70: 20 61 6c 74 65 72 6e 61 74 69 76 65 20 75 6e 69   alternative uni
ac80: 71 75 65 20 49 44 20 73 79 73 74 65 6d 20 62 61  que ID system ba
ac90: 73 65 64 20 6f 6e 0a 2a 2a 20 63 61 6e 6f 6e 69  sed on.** canoni
aca0: 63 61 6c 20 66 69 6c 65 6e 61 6d 65 20 61 6e 64  cal filename and
acb0: 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 69 6e 20   implemented in 
acc0: 74 68 65 20 70 72 65 76 69 6f 75 73 20 64 69 76  the previous div
acd0: 69 73 69 6f 6e 2e 29 0a 2a 2a 0a 2a 2a 20 54 68  ision.).**.** Th
ace0: 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 73  e sqlite3_file s
acf0: 74 72 75 63 74 75 72 65 20 66 6f 72 20 50 4f 53  tructure for POS
ad00: 49 58 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20  IX is no longer 
ad10: 6a 75 73 74 20 61 6e 20 69 6e 74 65 67 65 72 20  just an integer 
ad20: 66 69 6c 65 0a 2a 2a 20 64 65 73 63 72 69 70 74  file.** descript
ad30: 6f 72 2e 20 20 49 74 20 69 73 20 6e 6f 77 20 61  or.  It is now a
ad40: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
ad50: 68 6f 6c 64 73 20 74 68 65 20 69 6e 74 65 67 65  holds the intege
ad60: 72 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63 72 69  r file.** descri
ad70: 70 74 6f 72 20 61 6e 64 20 61 20 70 6f 69 6e 74  ptor and a point
ad80: 65 72 20 74 6f 20 61 20 73 74 72 75 63 74 75 72  er to a structur
ad90: 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73  e that describes
ada0: 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a   the internal.**
adb0: 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 20 63 6f   locks on the co
adc0: 72 72 65 73 70 6f 6e 64 69 6e 67 20 69 6e 6f 64  rresponding inod
add0: 65 2e 20 20 54 68 65 72 65 20 69 73 20 6f 6e 65  e.  There is one
ade0: 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63 74 75   locking structu
adf0: 72 65 0a 2a 2a 20 70 65 72 20 69 6e 6f 64 65 2c  re.** per inode,
ae00: 20 73 6f 20 69 66 20 74 68 65 20 73 61 6d 65 20   so if the same 
ae10: 69 6e 6f 64 65 20 69 73 20 6f 70 65 6e 65 64 20  inode is opened 
ae20: 74 77 69 63 65 2c 20 62 6f 74 68 20 75 6e 69 78  twice, both unix
ae30: 46 69 6c 65 20 73 74 72 75 63 74 75 72 65 73 0a  File structures.
ae40: 2a 2a 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  ** point to the 
ae50: 73 61 6d 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72  same locking str
ae60: 75 63 74 75 72 65 2e 20 20 54 68 65 20 6c 6f 63  ucture.  The loc
ae70: 6b 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 6b  king structure k
ae80: 65 65 70 73 0a 2a 2a 20 61 20 72 65 66 65 72 65  eeps.** a refere
ae90: 6e 63 65 20 63 6f 75 6e 74 20 28 73 6f 20 77 65  nce count (so we
aea0: 20 77 69 6c 6c 20 6b 6e 6f 77 20 77 68 65 6e 20   will know when 
aeb0: 74 6f 20 64 65 6c 65 74 65 20 69 74 29 20 61 6e  to delete it) an
aec0: 64 20 61 20 22 63 6e 74 22 0a 2a 2a 20 66 69 65  d a "cnt".** fie
aed0: 6c 64 20 74 68 61 74 20 74 65 6c 6c 73 20 75 73  ld that tells us
aee0: 20 69 74 73 20 69 6e 74 65 72 6e 61 6c 20 6c 6f   its internal lo
aef0: 63 6b 20 73 74 61 74 75 73 2e 20 20 63 6e 74 3d  ck status.  cnt=
af00: 3d 30 20 6d 65 61 6e 73 20 74 68 65 0a 2a 2a 20  =0 means the.** 
af10: 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64  file is unlocked
af20: 2e 20 20 63 6e 74 3d 3d 2d 31 20 6d 65 61 6e 73  .  cnt==-1 means
af30: 20 74 68 65 20 66 69 6c 65 20 68 61 73 20 61 6e   the file has an
af40: 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e   exclusive lock.
af50: 0a 2a 2a 20 63 6e 74 3e 30 20 6d 65 61 6e 73 20  .** cnt>0 means 
af60: 74 68 65 72 65 20 61 72 65 20 63 6e 74 20 73 68  there are cnt sh
af70: 61 72 65 64 20 6c 6f 63 6b 73 20 6f 6e 20 74 68  ared locks on th
af80: 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41 6e  e file..**.** An
af90: 79 20 61 74 74 65 6d 70 74 20 74 6f 20 6c 6f 63  y attempt to loc
afa0: 6b 20 6f 72 20 75 6e 6c 6f 63 6b 20 61 20 66 69  k or unlock a fi
afb0: 6c 65 20 66 69 72 73 74 20 63 68 65 63 6b 73 20  le first checks 
afc0: 74 68 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 73  the locking.** s
afd0: 74 72 75 63 74 75 72 65 2e 20 20 54 68 65 20 66  tructure.  The f
afe0: 63 6e 74 6c 28 29 20 73 79 73 74 65 6d 20 63 61  cntl() system ca
aff0: 6c 6c 20 69 73 20 6f 6e 6c 79 20 69 6e 76 6f 6b  ll is only invok
b000: 65 64 20 74 6f 20 73 65 74 20 61 20 0a 2a 2a 20  ed to set a .** 
b010: 50 4f 53 49 58 20 6c 6f 63 6b 20 69 66 20 74 68  POSIX lock if th
b020: 65 20 69 6e 74 65 72 6e 61 6c 20 6c 6f 63 6b 20  e internal lock 
b030: 73 74 72 75 63 74 75 72 65 20 74 72 61 6e 73 69  structure transi
b040: 74 69 6f 6e 73 20 62 65 74 77 65 65 6e 0a 2a 2a  tions between.**
b050: 20 61 20 6c 6f 63 6b 65 64 20 61 6e 64 20 61 6e   a locked and an
b060: 20 75 6e 6c 6f 63 6b 65 64 20 73 74 61 74 65 2e   unlocked state.
b070: 0a 2a 2a 0a 2a 2a 20 42 75 74 20 77 61 69 74 3a  .**.** But wait:
b080: 20 20 74 68 65 72 65 20 61 72 65 20 79 65 74 20    there are yet 
b090: 6d 6f 72 65 20 70 72 6f 62 6c 65 6d 73 20 77 69  more problems wi
b0a0: 74 68 20 50 4f 53 49 58 20 61 64 76 69 73 6f 72  th POSIX advisor
b0b0: 79 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 49  y locks..**.** I
b0c0: 66 20 79 6f 75 20 63 6c 6f 73 65 20 61 20 66 69  f you close a fi
b0d0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 68  le descriptor th
b0e0: 61 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 66  at points to a f
b0f0: 69 6c 65 20 74 68 61 74 20 68 61 73 20 6c 6f 63  ile that has loc
b100: 6b 73 2c 0a 2a 2a 20 61 6c 6c 20 6c 6f 63 6b 73  ks,.** all locks
b110: 20 6f 6e 20 74 68 61 74 20 66 69 6c 65 20 74 68   on that file th
b120: 61 74 20 61 72 65 20 6f 77 6e 65 64 20 62 79 20  at are owned by 
b130: 74 68 65 20 63 75 72 72 65 6e 74 20 70 72 6f 63  the current proc
b140: 65 73 73 20 61 72 65 0a 2a 2a 20 72 65 6c 65 61  ess are.** relea
b150: 73 65 64 2e 20 20 54 6f 20 77 6f 72 6b 20 61 72  sed.  To work ar
b160: 6f 75 6e 64 20 74 68 69 73 20 70 72 6f 62 6c 65  ound this proble
b170: 6d 2c 20 65 61 63 68 20 75 6e 69 78 49 6e 6f 64  m, each unixInod
b180: 65 49 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a 2a 20  eInfo object.** 
b190: 6d 61 69 6e 74 61 69 6e 73 20 61 20 63 6f 75 6e  maintains a coun
b1a0: 74 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20  t of the number 
b1b0: 6f 66 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 73  of pending locks
b1c0: 20 6f 6e 20 74 68 61 20 69 6e 6f 64 65 2e 0a 2a   on tha inode..*
b1d0: 2a 20 57 68 65 6e 20 61 6e 20 61 74 74 65 6d 70  * When an attemp
b1e0: 74 20 69 73 20 6d 61 64 65 20 74 6f 20 63 6c 6f  t is made to clo
b1f0: 73 65 20 61 6e 20 75 6e 69 78 46 69 6c 65 2c 20  se an unixFile, 
b200: 69 66 20 74 68 65 72 65 20 61 72 65 0a 2a 2a 20  if there are.** 
b210: 6f 74 68 65 72 20 75 6e 69 78 46 69 6c 65 20 6f  other unixFile o
b220: 70 65 6e 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  pen on the same 
b230: 69 6e 6f 64 65 20 74 68 61 74 20 61 72 65 20 68  inode that are h
b240: 6f 6c 64 69 6e 67 20 6c 6f 63 6b 73 2c 20 74 68  olding locks, th
b250: 65 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 63 6c 6f  e call.** to clo
b260: 73 65 28 29 20 74 68 65 20 66 69 6c 65 20 64 65  se() the file de
b270: 73 63 72 69 70 74 6f 72 20 69 73 20 64 65 66 65  scriptor is defe
b280: 72 72 65 64 20 75 6e 74 69 6c 20 61 6c 6c 20 6f  rred until all o
b290: 66 20 74 68 65 20 6c 6f 63 6b 73 20 63 6c 65 61  f the locks clea
b2a0: 72 2e 0a 2a 2a 20 54 68 65 20 75 6e 69 78 49 6e  r..** The unixIn
b2b0: 6f 64 65 49 6e 66 6f 20 73 74 72 75 63 74 75 72  odeInfo structur
b2c0: 65 20 6b 65 65 70 73 20 61 20 6c 69 73 74 20 6f  e keeps a list o
b2d0: 66 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  f file descripto
b2e0: 72 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f 0a  rs that need to.
b2f0: 2a 2a 20 62 65 20 63 6c 6f 73 65 64 20 61 6e 64  ** be closed and
b300: 20 74 68 61 74 20 6c 69 73 74 20 69 73 20 77 61   that list is wa
b310: 6c 6b 65 64 20 28 61 6e 64 20 63 6c 65 61 72 65  lked (and cleare
b320: 64 29 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74  d) when the last
b330: 20 6c 6f 63 6b 0a 2a 2a 20 63 6c 65 61 72 73 2e   lock.** clears.
b340: 0a 2a 2a 0a 2a 2a 20 59 65 74 20 61 6e 6f 74 68  .**.** Yet anoth
b350: 65 72 20 70 72 6f 62 6c 65 6d 3a 20 20 4c 69 6e  er problem:  Lin
b360: 75 78 54 68 72 65 61 64 73 20 64 6f 20 6e 6f 74  uxThreads do not
b370: 20 70 6c 61 79 20 77 65 6c 6c 20 77 69 74 68 20   play well with 
b380: 70 6f 73 69 78 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a  posix locks..**.
b390: 2a 2a 20 4d 61 6e 79 20 6f 6c 64 65 72 20 76 65  ** Many older ve
b3a0: 72 73 69 6f 6e 73 20 6f 66 20 6c 69 6e 75 78 20  rsions of linux 
b3b0: 75 73 65 20 74 68 65 20 4c 69 6e 75 78 54 68 72  use the LinuxThr
b3c0: 65 61 64 73 20 6c 69 62 72 61 72 79 20 77 68 69  eads library whi
b3d0: 63 68 20 69 73 0a 2a 2a 20 6e 6f 74 20 70 6f 73  ch is.** not pos
b3e0: 69 78 20 63 6f 6d 70 6c 69 61 6e 74 2e 20 20 55  ix compliant.  U
b3f0: 6e 64 65 72 20 4c 69 6e 75 78 54 68 72 65 61 64  nder LinuxThread
b400: 73 2c 20 61 20 6c 6f 63 6b 20 63 72 65 61 74 65  s, a lock create
b410: 64 20 62 79 20 74 68 72 65 61 64 0a 2a 2a 20 41  d by thread.** A
b420: 20 63 61 6e 6e 6f 74 20 62 65 20 6d 6f 64 69 66   cannot be modif
b430: 69 65 64 20 6f 72 20 6f 76 65 72 72 69 64 64 65  ied or overridde
b440: 6e 20 62 79 20 61 20 64 69 66 66 65 72 65 6e 74  n by a different
b450: 20 74 68 72 65 61 64 20 42 2e 0a 2a 2a 20 4f 6e   thread B..** On
b460: 6c 79 20 74 68 72 65 61 64 20 41 20 63 61 6e 20  ly thread A can 
b470: 6d 6f 64 69 66 79 20 74 68 65 20 6c 6f 63 6b 2e  modify the lock.
b480: 20 20 4c 6f 63 6b 69 6e 67 20 62 65 68 61 76 69    Locking behavi
b490: 6f 72 20 69 73 20 63 6f 72 72 65 63 74 0a 2a 2a  or is correct.**
b4a0: 20 69 66 20 74 68 65 20 61 70 70 6c 69 61 74 69   if the appliati
b4b0: 6f 6e 20 75 73 65 73 20 74 68 65 20 6e 65 77 65  on uses the newe
b4c0: 72 20 4e 61 74 69 76 65 20 50 6f 73 69 78 20 54  r Native Posix T
b4d0: 68 72 65 61 64 20 4c 69 62 72 61 72 79 20 28 4e  hread Library (N
b4e0: 50 54 4c 29 0a 2a 2a 20 6f 6e 20 6c 69 6e 75 78  PTL).** on linux
b4f0: 20 2d 20 77 69 74 68 20 4e 50 54 4c 20 61 20 6c   - with NPTL a l
b500: 6f 63 6b 20 63 72 65 61 74 65 64 20 62 79 20 74  ock created by t
b510: 68 72 65 61 64 20 41 20 63 61 6e 20 6f 76 65 72  hread A can over
b520: 72 69 64 65 20 6c 6f 63 6b 73 0a 2a 2a 20 69 6e  ride locks.** in
b530: 20 74 68 72 65 61 64 20 42 2e 20 20 42 75 74 20   thread B.  But 
b540: 74 68 65 72 65 20 69 73 20 6e 6f 20 77 61 79 20  there is no way 
b550: 74 6f 20 6b 6e 6f 77 20 61 74 20 63 6f 6d 70 69  to know at compi
b560: 6c 65 2d 74 69 6d 65 20 77 68 69 63 68 0a 2a 2a  le-time which.**
b570: 20 74 68 72 65 61 64 69 6e 67 20 6c 69 62 72 61   threading libra
b580: 72 79 20 69 73 20 62 65 69 6e 67 20 75 73 65 64  ry is being used
b590: 2e 20 20 53 6f 20 74 68 65 72 65 20 69 73 20 6e  .  So there is n
b5a0: 6f 20 77 61 79 20 74 6f 20 6b 6e 6f 77 20 61 74  o way to know at
b5b0: 0a 2a 2a 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65  .** compile-time
b5c0: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
b5d0: 74 68 72 65 61 64 20 41 20 63 61 6e 20 6f 76 65  thread A can ove
b5e0: 72 72 69 64 65 20 6c 6f 63 6b 73 20 6f 6e 20 74  rride locks on t
b5f0: 68 72 65 61 64 20 42 2e 0a 2a 2a 20 4f 6e 65 20  hread B..** One 
b600: 68 61 73 20 74 6f 20 64 6f 20 61 20 72 75 6e 2d  has to do a run-
b610: 74 69 6d 65 20 63 68 65 63 6b 20 74 6f 20 64 69  time check to di
b620: 73 63 6f 76 65 72 20 74 68 65 20 62 65 68 61 76  scover the behav
b630: 69 6f 72 20 6f 66 20 74 68 65 0a 2a 2a 20 63 75  ior of the.** cu
b640: 72 72 65 6e 74 20 70 72 6f 63 65 73 73 2e 0a 2a  rrent process..*
b650: 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 75 73 65 64  *.** SQLite used
b660: 20 74 6f 20 73 75 70 70 6f 72 74 20 4c 69 6e 75   to support Linu
b670: 78 54 68 72 65 61 64 73 2e 20 20 42 75 74 20 73  xThreads.  But s
b680: 75 70 70 6f 72 74 20 66 6f 72 20 4c 69 6e 75 78  upport for Linux
b690: 54 68 72 65 61 64 73 0a 2a 2a 20 77 61 73 20 64  Threads.** was d
b6a0: 72 6f 70 70 65 64 20 62 65 67 69 6e 6e 69 6e 67  ropped beginning
b6b0: 20 77 69 74 68 20 76 65 72 73 69 6f 6e 20 33 2e   with version 3.
b6c0: 37 2e 30 2e 20 20 53 51 4c 69 74 65 20 77 69 6c  7.0.  SQLite wil
b6d0: 6c 20 73 74 69 6c 6c 20 77 6f 72 6b 20 77 69 74  l still work wit
b6e0: 68 0a 2a 2a 20 4c 69 6e 75 78 54 68 72 65 61 64  h.** LinuxThread
b6f0: 73 20 70 72 6f 76 69 64 65 64 20 74 68 61 74 20  s provided that 
b700: 28 31 29 20 74 68 65 72 65 20 69 73 20 6e 6f 20  (1) there is no 
b710: 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 63 6f  more than one co
b720: 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20 70 65 72  nnection .** per
b730: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
b740: 6e 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65  n the same proce
b750: 73 73 20 61 6e 64 20 28 32 29 20 64 61 74 61 62  ss and (2) datab
b760: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 0a  ase connections.
b770: 2a 2a 20 64 6f 20 6e 6f 74 20 6d 6f 76 65 20 61  ** do not move a
b780: 63 72 6f 73 73 20 74 68 72 65 61 64 73 2e 0a 2a  cross threads..*
b790: 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74  /../*.** An inst
b7a0: 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ance of the foll
b7b0: 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20  owing structure 
b7c0: 73 65 72 76 65 73 20 61 73 20 74 68 65 20 6b 65  serves as the ke
b7d0: 79 20 75 73 65 64 0a 2a 2a 20 74 6f 20 6c 6f 63  y used.** to loc
b7e0: 61 74 65 20 61 20 70 61 72 74 69 63 75 6c 61 72  ate a particular
b7f0: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f   unixInodeInfo o
b800: 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 72 75 63 74  bject..*/.struct
b810: 20 75 6e 69 78 46 69 6c 65 49 64 20 7b 0a 20 20   unixFileId {.  
b820: 64 65 76 5f 74 20 64 65 76 3b 20 20 20 20 20 20  dev_t dev;      
b830: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
b840: 65 76 69 63 65 20 6e 75 6d 62 65 72 20 2a 2f 0a  evice number */.
b850: 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20  #if OS_VXWORKS. 
b860: 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46   struct vxworksF
b870: 69 6c 65 49 64 20 2a 70 49 64 3b 20 20 2f 2a 20  ileId *pId;  /* 
b880: 55 6e 69 71 75 65 20 66 69 6c 65 20 49 44 20 66  Unique file ID f
b890: 6f 72 20 76 78 77 6f 72 6b 73 2e 20 2a 2f 0a 23  or vxworks. */.#
b8a0: 65 6c 73 65 0a 20 20 69 6e 6f 5f 74 20 69 6e 6f  else.  ino_t ino
b8b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
b8c0: 20 20 20 2f 2a 20 49 6e 6f 64 65 20 6e 75 6d 62     /* Inode numb
b8d0: 65 72 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a  er */.#endif.};.
b8e0: 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e  ./*.** An instan
b8f0: 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ce of the follow
b900: 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 69 73  ing structure is
b910: 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 65   allocated for e
b920: 61 63 68 20 6f 70 65 6e 0a 2a 2a 20 69 6e 6f 64  ach open.** inod
b930: 65 2e 20 20 4f 72 2c 20 6f 6e 20 4c 69 6e 75 78  e.  Or, on Linux
b940: 54 68 72 65 61 64 73 2c 20 74 68 65 72 65 20 69  Threads, there i
b950: 73 20 6f 6e 65 20 6f 66 20 74 68 65 73 65 20 73  s one of these s
b960: 74 72 75 63 74 75 72 65 73 20 66 6f 72 0a 2a 2a  tructures for.**
b970: 20 65 61 63 68 20 69 6e 6f 64 65 20 6f 70 65 6e   each inode open
b980: 65 64 20 62 79 20 65 61 63 68 20 74 68 72 65 61  ed by each threa
b990: 64 2e 0a 2a 2a 0a 2a 2a 20 41 20 73 69 6e 67 6c  d..**.** A singl
b9a0: 65 20 69 6e 6f 64 65 20 63 61 6e 20 68 61 76 65  e inode can have
b9b0: 20 6d 75 6c 74 69 70 6c 65 20 66 69 6c 65 20 64   multiple file d
b9c0: 65 73 63 72 69 70 74 6f 72 73 2c 20 73 6f 20 65  escriptors, so e
b9d0: 61 63 68 20 75 6e 69 78 46 69 6c 65 0a 2a 2a 20  ach unixFile.** 
b9e0: 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69  structure contai
b9f0: 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ns a pointer to 
ba00: 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  an instance of t
ba10: 68 69 73 20 6f 62 6a 65 63 74 20 61 6e 64 20 74  his object and t
ba20: 68 69 73 0a 2a 2a 20 6f 62 6a 65 63 74 20 6b 65  his.** object ke
ba30: 65 70 73 20 61 20 63 6f 75 6e 74 20 6f 66 20 74  eps a count of t
ba40: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 75 6e 69  he number of uni
ba50: 78 46 69 6c 65 20 70 6f 69 6e 74 69 6e 67 20 74  xFile pointing t
ba60: 6f 20 69 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  o it..*/.struct 
ba70: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 7b 0a  unixInodeInfo {.
ba80: 20 20 73 74 72 75 63 74 20 75 6e 69 78 46 69 6c    struct unixFil
ba90: 65 49 64 20 66 69 6c 65 49 64 3b 20 20 20 20 20  eId fileId;     
baa0: 20 20 2f 2a 20 54 68 65 20 6c 6f 6f 6b 75 70 20    /* The lookup 
bab0: 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 68  key */.  int nSh
bac0: 61 72 65 64 3b 20 20 20 20 20 20 20 20 20 20 20  ared;           
bad0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
bae0: 65 72 20 6f 66 20 53 48 41 52 45 44 20 6c 6f 63  er of SHARED loc
baf0: 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20 75 6e 73  ks held */.  uns
bb00: 69 67 6e 65 64 20 63 68 61 72 20 65 46 69 6c 65  igned char eFile
bb10: 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 2f 2a 20  Lock;        /* 
bb20: 4f 6e 65 20 6f 66 20 53 48 41 52 45 44 5f 4c 4f  One of SHARED_LO
bb30: 43 4b 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  CK, RESERVED_LOC
bb40: 4b 20 65 74 63 2e 20 2a 2f 0a 20 20 75 6e 73 69  K etc. */.  unsi
bb50: 67 6e 65 64 20 63 68 61 72 20 62 50 72 6f 63 65  gned char bProce
bb60: 73 73 4c 6f 63 6b 3b 20 20 20 20 20 2f 2a 20 41  ssLock;     /* A
bb70: 6e 20 65 78 63 6c 75 73 69 76 65 20 70 72 6f 63  n exclusive proc
bb80: 65 73 73 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  ess lock is held
bb90: 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20   */.  int nRef; 
bba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bbb0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
bbc0: 6f 66 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 74  of pointers to t
bbd0: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f  his structure */
bbe0: 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a  .  unixShmNode *
bbf0: 70 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20 20 20  pShmNode;       
bc00: 20 20 20 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d     /* Shared mem
bc10: 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77  ory associated w
bc20: 69 74 68 20 74 68 69 73 20 69 6e 6f 64 65 20 2a  ith this inode *
bc30: 2f 0a 20 20 69 6e 74 20 6e 4c 6f 63 6b 3b 20 20  /.  int nLock;  
bc40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bc50: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
bc60: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 66 69 6c   outstanding fil
bc70: 65 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 55 6e 69  e locks */.  Uni
bc80: 78 55 6e 75 73 65 64 46 64 20 2a 70 55 6e 75 73  xUnusedFd *pUnus
bc90: 65 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ed;          /* 
bca0: 55 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73 63  Unused file desc
bcb0: 72 69 70 74 6f 72 73 20 74 6f 20 63 6c 6f 73 65  riptors to close
bcc0: 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49   */.  unixInodeI
bcd0: 6e 66 6f 20 2a 70 4e 65 78 74 3b 20 20 20 20 20  nfo *pNext;     
bce0: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
bcf0: 20 61 6c 6c 20 75 6e 69 78 49 6e 6f 64 65 49 6e   all unixInodeIn
bd00: 66 6f 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20  fo objects */.  
bd10: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70  unixInodeInfo *p
bd20: 50 72 65 76 3b 20 20 20 20 20 20 20 20 20 20 20  Prev;           
bd30: 2f 2a 20 20 20 20 2e 2e 2e 2e 20 64 6f 75 62 6c  /*    .... doubl
bd40: 79 20 6c 69 6e 6b 65 64 20 2a 2f 0a 23 69 66 20  y linked */.#if 
bd50: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
bd60: 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 75 6e  CKING_STYLE.  un
bd70: 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67  signed long long
bd80: 20 73 68 61 72 65 64 42 79 74 65 3b 20 20 2f 2a   sharedByte;  /*
bd90: 20 66 6f 72 20 41 46 50 20 73 69 6d 75 6c 61 74   for AFP simulat
bda0: 65 64 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 2a  ed shared lock *
bdb0: 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20 4f 53 5f  /.#endif.#if OS_
bdc0: 56 58 57 4f 52 4b 53 0a 20 20 73 65 6d 5f 74 20  VXWORKS.  sem_t 
bdd0: 2a 70 53 65 6d 3b 20 20 20 20 20 20 20 20 20 20  *pSem;          
bde0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
bdf0: 65 64 20 50 4f 53 49 58 20 73 65 6d 61 70 68 6f  ed POSIX semapho
be00: 72 65 20 2a 2f 0a 20 20 63 68 61 72 20 61 53 65  re */.  char aSe
be10: 6d 4e 61 6d 65 5b 4d 41 58 5f 50 41 54 48 4e 41  mName[MAX_PATHNA
be20: 4d 45 2b 32 5d 3b 20 20 2f 2a 20 4e 61 6d 65 20  ME+2];  /* Name 
be30: 6f 66 20 74 68 61 74 20 73 65 6d 61 70 68 6f 72  of that semaphor
be40: 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a  e */.#endif.};..
be50: 2f 2a 0a 2a 2a 20 41 20 6c 69 73 74 73 20 6f 66  /*.** A lists of
be60: 20 61 6c 6c 20 75 6e 69 78 49 6e 6f 64 65 49 6e   all unixInodeIn
be70: 66 6f 20 6f 62 6a 65 63 74 73 2e 0a 2a 2f 0a 73  fo objects..*/.s
be80: 74 61 74 69 63 20 75 6e 69 78 49 6e 6f 64 65 49  tatic unixInodeI
be90: 6e 66 6f 20 2a 69 6e 6f 64 65 4c 69 73 74 20 3d  nfo *inodeList =
bea0: 20 30 3b 0a 0a 2f 2a 0a 2a 2a 0a 2a 2a 20 54 68   0;../*.**.** Th
beb0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 2d 20 75 6e  is function - un
bec0: 69 78 4c 6f 67 45 72 72 6f 72 5f 78 28 29 2c 20  ixLogError_x(), 
bed0: 69 73 20 6f 6e 6c 79 20 65 76 65 72 20 63 61 6c  is only ever cal
bee0: 6c 65 64 20 76 69 61 20 74 68 65 20 6d 61 63 72  led via the macr
bef0: 6f 0a 2a 2a 20 75 6e 69 78 4c 6f 67 45 72 72 6f  o.** unixLogErro
bf00: 72 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73  r()..**.** It is
bf10: 20 69 6e 76 6f 6b 65 64 20 61 66 74 65 72 20 61   invoked after a
bf20: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 69  n error occurs i
bf30: 6e 20 61 6e 20 4f 53 20 66 75 6e 63 74 69 6f 6e  n an OS function
bf40: 20 61 6e 64 20 65 72 72 6e 6f 20 68 61 73 20 62   and errno has b
bf50: 65 65 6e 0a 2a 2a 20 73 65 74 2e 20 49 74 20 6c  een.** set. It l
bf60: 6f 67 73 20 61 20 6d 65 73 73 61 67 65 20 75 73  ogs a message us
bf70: 69 6e 67 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28  ing sqlite3_log(
bf80: 29 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  ) containing the
bf90: 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f   current value o
bfa0: 66 0a 2a 2a 20 65 72 72 6e 6f 20 61 6e 64 2c 20  f.** errno and, 
bfb0: 69 66 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 65  if possible, the
bfc0: 20 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20   human-readable 
bfd0: 65 71 75 69 76 61 6c 65 6e 74 20 66 72 6f 6d 20  equivalent from 
bfe0: 73 74 72 65 72 72 6f 72 28 29 20 6f 72 0a 2a 2a  strerror() or.**
bff0: 20 73 74 72 65 72 72 6f 72 5f 72 28 29 2e 0a 2a   strerror_r()..*
c000: 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 61  *.** The first a
c010: 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74  rgument passed t
c020: 6f 20 74 68 65 20 6d 61 63 72 6f 20 73 68 6f 75  o the macro shou
c030: 6c 64 20 62 65 20 74 68 65 20 65 72 72 6f 72 20  ld be the error 
c040: 63 6f 64 65 20 74 68 61 74 0a 2a 2a 20 77 69 6c  code that.** wil
c050: 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 74 6f  l be returned to
c060: 20 53 51 4c 69 74 65 20 28 65 2e 67 2e 20 53 51   SQLite (e.g. SQ
c070: 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54  LITE_IOERR_DELET
c080: 45 2c 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  E, SQLITE_CANTOP
c090: 45 4e 29 2e 20 0a 2a 2a 20 54 68 65 20 74 77 6f  EN). .** The two
c0a0: 20 73 75 62 73 65 71 75 65 6e 74 20 61 72 67 75   subsequent argu
c0b0: 6d 65 6e 74 73 20 73 68 6f 75 6c 64 20 62 65 20  ments should be 
c0c0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
c0d0: 4f 53 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74  OS function that
c0e0: 0a 2a 2a 20 66 61 69 6c 65 64 20 28 65 2e 67 2e  .** failed (e.g.
c0f0: 20 22 75 6e 6c 69 6e 6b 22 2c 20 22 6f 70 65 6e   "unlink", "open
c100: 22 29 20 61 6e 64 20 74 68 65 20 61 73 73 6f 63  ") and the assoc
c110: 69 61 74 65 64 20 66 69 6c 65 2d 73 79 73 74 65  iated file-syste
c120: 6d 20 70 61 74 68 2c 0a 2a 2a 20 69 66 20 61 6e  m path,.** if an
c130: 79 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 75 6e  y..*/.#define un
c140: 69 78 4c 6f 67 45 72 72 6f 72 28 61 2c 62 2c 63  ixLogError(a,b,c
c150: 29 20 20 20 20 20 75 6e 69 78 4c 6f 67 45 72 72  )     unixLogErr
c160: 6f 72 41 74 4c 69 6e 65 28 61 2c 62 2c 63 2c 5f  orAtLine(a,b,c,_
c170: 5f 4c 49 4e 45 5f 5f 29 0a 73 74 61 74 69 63 20  _LINE__).static 
c180: 69 6e 74 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72  int unixLogError
c190: 41 74 4c 69 6e 65 28 0a 20 20 69 6e 74 20 65 72  AtLine(.  int er
c1a0: 72 63 6f 64 65 2c 20 20 20 20 20 20 20 20 20 20  rcode,          
c1b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c            /* SQL
c1c0: 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 2a  ite error code *
c1d0: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
c1e0: 7a 46 75 6e 63 2c 20 20 20 20 20 20 20 20 20 20  zFunc,          
c1f0: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 4f      /* Name of O
c200: 53 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20  S function that 
c210: 66 61 69 6c 65 64 20 2a 2f 0a 20 20 63 6f 6e 73  failed */.  cons
c220: 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20  t char *zPath,  
c230: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
c240: 69 6c 65 20 70 61 74 68 20 61 73 73 6f 63 69 61  ile path associa
c250: 74 65 64 20 77 69 74 68 20 65 72 72 6f 72 20 2a  ted with error *
c260: 2f 0a 20 20 69 6e 74 20 69 4c 69 6e 65 20 20 20  /.  int iLine   
c270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c280: 20 20 20 20 2f 2a 20 53 6f 75 72 63 65 20 6c 69      /* Source li
c290: 6e 65 20 6e 75 6d 62 65 72 20 77 68 65 72 65 20  ne number where 
c2a0: 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20 2a  error occurred *
c2b0: 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 45 72  /.){.  char *zEr
c2c0: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
c2d0: 20 20 20 20 20 20 20 2f 2a 20 4d 65 73 73 61 67         /* Messag
c2e0: 65 20 66 72 6f 6d 20 73 74 72 65 72 72 6f 72 28  e from strerror(
c2f0: 29 20 6f 72 20 65 71 75 69 76 61 6c 65 6e 74 20  ) or equivalent 
c300: 2a 2f 0a 20 20 69 6e 74 20 69 45 72 72 6e 6f 20  */.  int iErrno 
c310: 3d 20 65 72 72 6e 6f 3b 20 20 20 20 20 20 20 20  = errno;        
c320: 20 20 20 20 20 2f 2a 20 53 61 76 65 64 20 73 79       /* Saved sy
c330: 73 63 61 6c 6c 20 65 72 72 6f 72 20 6e 75 6d 62  scall error numb
c340: 65 72 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 74  er */..  /* If t
c350: 68 69 73 20 69 73 20 6e 6f 74 20 61 20 74 68 72  his is not a thr
c360: 65 61 64 73 61 66 65 20 62 75 69 6c 64 20 28 53  eadsafe build (S
c370: 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
c380: 3d 3d 30 29 2c 20 74 68 65 6e 20 75 73 65 0a 20  ==0), then use. 
c390: 20 2a 2a 20 74 68 65 20 73 74 72 65 72 72 6f 72   ** the strerror
c3a0: 28 29 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 6f  () function to o
c3b0: 62 74 61 69 6e 20 74 68 65 20 68 75 6d 61 6e 2d  btain the human-
c3c0: 72 65 61 64 61 62 6c 65 20 65 72 72 6f 72 20 6d  readable error m
c3d0: 65 73 73 61 67 65 0a 20 20 2a 2a 20 65 71 75 69  essage.  ** equi
c3e0: 76 61 6c 65 6e 74 20 74 6f 20 65 72 72 6e 6f 2e  valent to errno.
c3f0: 20 4f 74 68 65 72 77 69 73 65 2c 20 75 73 65 20   Otherwise, use 
c400: 73 74 72 65 72 72 6f 72 5f 72 28 29 2e 0a 20 20  strerror_r()..  
c410: 2a 2f 20 0a 23 69 66 20 53 51 4c 49 54 45 5f 54  */ .#if SQLITE_T
c420: 48 52 45 41 44 53 41 46 45 20 26 26 20 64 65 66  HREADSAFE && def
c430: 69 6e 65 64 28 48 41 56 45 5f 53 54 52 45 52 52  ined(HAVE_STRERR
c440: 4f 52 5f 52 29 0a 20 20 63 68 61 72 20 61 45 72  OR_R).  char aEr
c450: 72 5b 38 30 5d 3b 0a 20 20 6d 65 6d 73 65 74 28  r[80];.  memset(
c460: 61 45 72 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28  aErr, 0, sizeof(
c470: 61 45 72 72 29 29 3b 0a 20 20 7a 45 72 72 20 3d  aErr));.  zErr =
c480: 20 61 45 72 72 3b 0a 0a 20 20 2f 2a 20 49 66 20   aErr;..  /* If 
c490: 53 54 52 45 52 52 4f 52 5f 52 5f 43 48 41 52 5f  STRERROR_R_CHAR_
c4a0: 50 20 28 73 65 74 20 62 79 20 61 75 74 6f 63 6f  P (set by autoco
c4b0: 6e 66 20 73 63 72 69 70 74 73 29 20 6f 72 20 5f  nf scripts) or _
c4c0: 5f 55 53 45 5f 47 4e 55 20 69 73 20 64 65 66 69  _USE_GNU is defi
c4d0: 6e 65 64 2c 0a 20 20 2a 2a 20 61 73 73 75 6d 65  ned,.  ** assume
c4e0: 20 74 68 61 74 20 74 68 65 20 73 79 73 74 65 6d   that the system
c4f0: 20 70 72 6f 76 69 64 65 73 20 74 68 65 20 47 4e   provides the GN
c500: 55 20 76 65 72 73 69 6f 6e 20 6f 66 20 73 74 72  U version of str
c510: 65 72 72 6f 72 5f 72 28 29 20 74 68 61 74 0a 20  error_r() that. 
c520: 20 2a 2a 20 72 65 74 75 72 6e 73 20 61 20 70 6f   ** returns a po
c530: 69 6e 74 65 72 20 74 6f 20 61 20 62 75 66 66 65  inter to a buffe
c540: 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  r containing the
c550: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 20   error message. 
c560: 54 68 61 74 20 70 6f 69 6e 74 65 72 20 0a 20 20  That pointer .  
c570: 2a 2a 20 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20  ** may point to 
c580: 61 45 72 72 5b 5d 2c 20 6f 72 20 69 74 20 6d 61  aErr[], or it ma
c590: 79 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65 20  y point to some 
c5a0: 73 74 61 74 69 63 20 73 74 6f 72 61 67 65 20 73  static storage s
c5b0: 6f 6d 65 77 68 65 72 65 2e 20 0a 20 20 2a 2a 20  omewhere. .  ** 
c5c0: 4f 74 68 65 72 77 69 73 65 2c 20 61 73 73 75 6d  Otherwise, assum
c5d0: 65 20 74 68 61 74 20 74 68 65 20 73 79 73 74 65  e that the syste
c5e0: 6d 20 70 72 6f 76 69 64 65 73 20 74 68 65 20 50  m provides the P
c5f0: 4f 53 49 58 20 76 65 72 73 69 6f 6e 20 6f 66 20  OSIX version of 
c600: 0a 20 20 2a 2a 20 73 74 72 65 72 72 6f 72 5f 72  .  ** strerror_r
c610: 28 29 2c 20 77 68 69 63 68 20 61 6c 77 61 79 73  (), which always
c620: 20 77 72 69 74 65 73 20 61 6e 20 65 72 72 6f 72   writes an error
c630: 20 6d 65 73 73 61 67 65 20 69 6e 74 6f 20 61 45   message into aE
c640: 72 72 5b 5d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  rr[]..  **.  ** 
c650: 49 66 20 74 68 65 20 63 6f 64 65 20 69 6e 63 6f  If the code inco
c660: 72 72 65 63 74 6c 79 20 61 73 73 75 6d 65 73 20  rrectly assumes 
c670: 74 68 61 74 20 69 74 20 69 73 20 74 68 65 20 50  that it is the P
c680: 4f 53 49 58 20 76 65 72 73 69 6f 6e 20 74 68 61  OSIX version tha
c690: 74 20 69 73 0a 20 20 2a 2a 20 61 76 61 69 6c 61  t is.  ** availa
c6a0: 62 6c 65 2c 20 74 68 65 20 65 72 72 6f 72 20 6d  ble, the error m
c6b0: 65 73 73 61 67 65 20 77 69 6c 6c 20 6f 66 74 65  essage will ofte
c6c0: 6e 20 62 65 20 61 6e 20 65 6d 70 74 79 20 73 74  n be an empty st
c6d0: 72 69 6e 67 2e 20 4e 6f 74 20 61 0a 20 20 2a 2a  ring. Not a.  **
c6e0: 20 68 75 67 65 20 70 72 6f 62 6c 65 6d 2e 20 49   huge problem. I
c6f0: 6e 63 6f 72 72 65 63 74 6c 79 20 63 6f 6e 63 6c  ncorrectly concl
c700: 75 64 69 6e 67 20 74 68 61 74 20 74 68 65 20 47  uding that the G
c710: 4e 55 20 76 65 72 73 69 6f 6e 20 69 73 20 61 76  NU version is av
c720: 61 69 6c 61 62 6c 65 20 0a 20 20 2a 2a 20 63 6f  ailable .  ** co
c730: 75 6c 64 20 6c 65 61 64 20 74 6f 20 61 20 73 65  uld lead to a se
c740: 67 66 61 75 6c 74 20 74 68 6f 75 67 68 2e 0a 20  gfault though.. 
c750: 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28   */.#if defined(
c760: 53 54 52 45 52 52 4f 52 5f 52 5f 43 48 41 52 5f  STRERROR_R_CHAR_
c770: 50 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f  P) || defined(__
c780: 55 53 45 5f 47 4e 55 29 0a 20 20 7a 45 72 72 20  USE_GNU).  zErr 
c790: 3d 20 0a 23 20 65 6e 64 69 66 0a 20 20 73 74 72  = .# endif.  str
c7a0: 65 72 72 6f 72 5f 72 28 69 45 72 72 6e 6f 2c 20  error_r(iErrno, 
c7b0: 61 45 72 72 2c 20 73 69 7a 65 6f 66 28 61 45 72  aErr, sizeof(aEr
c7c0: 72 29 2d 31 29 3b 0a 0a 23 65 6c 69 66 20 53 51  r)-1);..#elif SQ
c7d0: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a  LITE_THREADSAFE.
c7e0: 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61 20 74    /* This is a t
c7f0: 68 72 65 61 64 73 61 66 65 20 62 75 69 6c 64 2c  hreadsafe build,
c800: 20 62 75 74 20 73 74 72 65 72 72 6f 72 5f 72 28   but strerror_r(
c810: 29 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62  ) is not availab
c820: 6c 65 2e 20 2a 2f 0a 20 20 7a 45 72 72 20 3d 20  le. */.  zErr = 
c830: 22 22 3b 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 4e  "";.#else.  /* N
c840: 6f 6e 2d 74 68 72 65 61 64 73 61 66 65 20 62 75  on-threadsafe bu
c850: 69 6c 64 2c 20 75 73 65 20 73 74 72 65 72 72 6f  ild, use strerro
c860: 72 28 29 2e 20 2a 2f 0a 20 20 7a 45 72 72 20 3d  r(). */.  zErr =
c870: 20 73 74 72 65 72 72 6f 72 28 69 45 72 72 6e 6f   strerror(iErrno
c880: 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28  );.#endif..  if(
c890: 20 7a 50 61 74 68 3d 3d 30 20 29 20 7a 50 61 74   zPath==0 ) zPat
c8a0: 68 20 3d 20 22 22 3b 0a 20 20 73 71 6c 69 74 65  h = "";.  sqlite
c8b0: 33 5f 6c 6f 67 28 65 72 72 63 6f 64 65 2c 0a 20  3_log(errcode,. 
c8c0: 20 20 20 20 20 22 6f 73 5f 75 6e 69 78 2e 63 3a       "os_unix.c:
c8d0: 25 64 3a 20 28 25 64 29 20 25 73 28 25 73 29 20  %d: (%d) %s(%s) 
c8e0: 2d 20 25 73 22 2c 0a 20 20 20 20 20 20 69 4c 69  - %s",.      iLi
c8f0: 6e 65 2c 20 69 45 72 72 6e 6f 2c 20 7a 46 75 6e  ne, iErrno, zFun
c900: 63 2c 20 7a 50 61 74 68 2c 20 7a 45 72 72 0a 20  c, zPath, zErr. 
c910: 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 65 72   );..  return er
c920: 72 63 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rcode;.}../*.** 
c930: 43 6c 6f 73 65 20 61 20 66 69 6c 65 20 64 65 73  Close a file des
c940: 63 72 69 70 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 57  criptor..**.** W
c950: 65 20 61 73 73 75 6d 65 20 74 68 61 74 20 63 6c  e assume that cl
c960: 6f 73 65 28 29 20 61 6c 6d 6f 73 74 20 61 6c 77  ose() almost alw
c970: 61 79 73 20 77 6f 72 6b 73 2c 20 73 69 6e 63 65  ays works, since
c980: 20 69 74 20 69 73 20 6f 6e 6c 79 20 69 6e 20 61   it is only in a
c990: 0a 2a 2a 20 76 65 72 79 20 73 69 63 6b 20 61 70  .** very sick ap
c9a0: 70 6c 69 63 61 74 69 6f 6e 20 6f 72 20 6f 6e 20  plication or on 
c9b0: 61 20 76 65 72 79 20 73 69 63 6b 20 70 6c 61 74  a very sick plat
c9c0: 66 6f 72 6d 20 74 68 61 74 20 69 74 20 6d 69 67  form that it mig
c9d0: 68 74 20 66 61 69 6c 2e 0a 2a 2a 20 49 66 20 69  ht fail..** If i
c9e0: 74 20 64 6f 65 73 20 66 61 69 6c 2c 20 73 69 6d  t does fail, sim
c9f0: 70 6c 79 20 6c 65 61 6b 20 74 68 65 20 66 69 6c  ply leak the fil
ca00: 65 20 64 65 73 63 72 69 70 74 6f 72 2c 20 62 75  e descriptor, bu
ca10: 74 20 64 6f 20 6c 6f 67 20 74 68 65 0a 2a 2a 20  t do log the.** 
ca20: 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74  error..**.** Not
ca30: 65 20 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74  e that it is not
ca40: 20 73 61 66 65 20 74 6f 20 72 65 74 72 79 20 63   safe to retry c
ca50: 6c 6f 73 65 28 29 20 61 66 74 65 72 20 45 49 4e  lose() after EIN
ca60: 54 52 20 73 69 6e 63 65 20 74 68 65 0a 2a 2a 20  TR since the.** 
ca70: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
ca80: 6d 69 67 68 74 20 68 61 76 65 20 61 6c 72 65 61  might have alrea
ca90: 64 79 20 62 65 65 6e 20 72 65 75 73 65 64 20 62  dy been reused b
caa0: 79 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64  y another thread
cab0: 2e 0a 2a 2a 20 53 6f 20 77 65 20 64 6f 6e 27 74  ..** So we don't
cac0: 20 65 76 65 6e 20 74 72 79 20 74 6f 20 72 65 63   even try to rec
cad0: 6f 76 65 72 20 66 72 6f 6d 20 61 6e 20 45 49 4e  over from an EIN
cae0: 54 52 2e 20 20 4a 75 73 74 20 6c 6f 67 20 74 68  TR.  Just log th
caf0: 65 20 65 72 72 6f 72 0a 2a 2a 20 61 6e 64 20 6d  e error.** and m
cb00: 6f 76 65 20 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  ove on..*/.stati
cb10: 63 20 76 6f 69 64 20 72 6f 62 75 73 74 5f 63 6c  c void robust_cl
cb20: 6f 73 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46  ose(unixFile *pF
cb30: 69 6c 65 2c 20 69 6e 74 20 68 2c 20 69 6e 74 20  ile, int h, int 
cb40: 6c 69 6e 65 6e 6f 29 7b 0a 20 20 69 66 28 20 6f  lineno){.  if( o
cb50: 73 43 6c 6f 73 65 28 68 29 20 29 7b 0a 20 20 20  sClose(h) ){.   
cb60: 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 41 74 4c   unixLogErrorAtL
cb70: 69 6e 65 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ine(SQLITE_IOERR
cb80: 5f 43 4c 4f 53 45 2c 20 22 63 6c 6f 73 65 22 2c  _CLOSE, "close",
cb90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
cba0: 20 20 20 20 20 20 20 20 70 46 69 6c 65 20 3f 20          pFile ? 
cbb0: 70 46 69 6c 65 2d 3e 7a 50 61 74 68 20 3a 20 30  pFile->zPath : 0
cbc0: 2c 20 6c 69 6e 65 6e 6f 29 3b 0a 20 20 7d 0a 7d  , lineno);.  }.}
cbd0: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
cbe0: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
cbf0: 2e 20 20 44 6f 20 74 68 69 73 20 69 6e 20 61 20  .  Do this in a 
cc00: 73 75 62 72 6f 75 74 69 6e 65 20 61 73 20 74 68  subroutine as th
cc10: 61 74 20 70 72 6f 76 69 64 65 73 0a 2a 2a 20 61  at provides.** a
cc20: 20 63 6f 6e 76 65 6e 69 65 6e 74 20 70 6c 61 63   convenient plac
cc30: 65 20 74 6f 20 73 65 74 20 61 20 62 72 65 61 6b  e to set a break
cc40: 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  point..*/.static
cc50: 20 76 6f 69 64 20 73 74 6f 72 65 4c 61 73 74 45   void storeLastE
cc60: 72 72 6e 6f 28 75 6e 69 78 46 69 6c 65 20 2a 70  rrno(unixFile *p
cc70: 46 69 6c 65 2c 20 69 6e 74 20 65 72 72 6f 72 29  File, int error)
cc80: 7b 0a 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  {.  pFile->lastE
cc90: 72 72 6e 6f 20 3d 20 65 72 72 6f 72 3b 0a 7d 0a  rrno = error;.}.
cca0: 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c  ./*.** Close all
ccb0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
ccc0: 73 20 61 63 63 75 6d 75 61 74 65 64 20 69 6e 20  s accumuated in 
ccd0: 74 68 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  the unixInodeInf
cce0: 6f 2d 3e 70 55 6e 75 73 65 64 20 6c 69 73 74 2e  o->pUnused list.
ccf0: 0a 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f 69 64  .*/ .static void
cd00: 20 63 6c 6f 73 65 50 65 6e 64 69 6e 67 46 64 73   closePendingFds
cd10: 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65  (unixFile *pFile
cd20: 29 7b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e  ){.  unixInodeIn
cd30: 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69  fo *pInode = pFi
cd40: 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 55 6e  le->pInode;.  Un
cd50: 69 78 55 6e 75 73 65 64 46 64 20 2a 70 3b 0a 20  ixUnusedFd *p;. 
cd60: 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70   UnixUnusedFd *p
cd70: 4e 65 78 74 3b 0a 20 20 66 6f 72 28 70 3d 70 49  Next;.  for(p=pI
cd80: 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 3b 20 70  node->pUnused; p
cd90: 3b 20 70 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20  ; p=pNext){.    
cda0: 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74  pNext = p->pNext
cdb0: 3b 0a 23 69 66 20 4f 53 43 4c 4f 53 45 5f 43 48  ;.#if OSCLOSE_CH
cdc0: 45 43 4b 5f 43 4c 4f 53 45 5f 49 4f 45 52 52 0a  ECK_CLOSE_IOERR.
cdd0: 20 20 20 20 69 66 28 20 63 6c 6f 73 65 28 70 2d      if( close(p-
cde0: 3e 66 64 29 20 29 7b 0a 20 20 20 20 20 20 73 74  >fd) ){.      st
cdf0: 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69  oreLastErrno(pFi
ce00: 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20  le, errno);.    
ce10: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
ce20: 45 52 52 5f 43 4c 4f 53 45 3b 0a 20 20 20 20 20  ERR_CLOSE;.     
ce30: 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 45 72 72   p->pNext = pErr
ce40: 6f 72 3b 0a 20 20 20 20 20 20 70 45 72 72 6f 72  or;.      pError
ce50: 20 3d 20 70 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = p;.    }else{
ce60: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
ce70: 72 65 65 28 70 29 3b 0a 20 20 20 20 7d 0a 23 65  ree(p);.    }.#e
ce80: 6c 73 65 0a 20 20 20 20 72 6f 62 75 73 74 5f 63  lse.    robust_c
ce90: 6c 6f 73 65 28 70 46 69 6c 65 2c 20 70 2d 3e 66  lose(pFile, p->f
cea0: 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20  d, __LINE__);.  
ceb0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
cec0: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20  );.#endif.  }.  
ced0: 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 20  pInode->pUnused 
cee0: 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  = 0;.}../*.** Re
cef0: 6c 65 61 73 65 20 61 20 75 6e 69 78 49 6e 6f 64  lease a unixInod
cf00: 65 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  eInfo structure 
cf10: 70 72 65 76 69 6f 75 73 6c 79 20 61 6c 6c 6f 63  previously alloc
cf20: 61 74 65 64 20 62 79 20 66 69 6e 64 49 6e 6f 64  ated by findInod
cf30: 65 49 6e 66 6f 28 29 2e 0a 2a 2a 0a 2a 2a 20 54  eInfo()..**.** T
cf40: 68 65 20 6d 75 74 65 78 20 65 6e 74 65 72 65 64  he mutex entered
cf50: 20 75 73 69 6e 67 20 74 68 65 20 75 6e 69 78 45   using the unixE
cf60: 6e 74 65 72 4d 75 74 65 78 28 29 20 66 75 6e 63  nterMutex() func
cf70: 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 68 65 6c  tion must be hel
cf80: 64 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73 20 66  d.** when this f
cf90: 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
cfa0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
cfb0: 64 20 72 65 6c 65 61 73 65 49 6e 6f 64 65 49 6e  d releaseInodeIn
cfc0: 66 6f 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  fo(unixFile *pFi
cfd0: 6c 65 29 7b 0a 20 20 75 6e 69 78 49 6e 6f 64 65  le){.  unixInode
cfe0: 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70  Info *pInode = p
cff0: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20  File->pInode;.  
d000: 61 73 73 65 72 74 28 20 75 6e 69 78 4d 75 74 65  assert( unixMute
d010: 78 48 65 6c 64 28 29 20 29 3b 0a 20 20 69 66 28  xHeld() );.  if(
d020: 20 41 4c 57 41 59 53 28 70 49 6e 6f 64 65 29 20   ALWAYS(pInode) 
d030: 29 7b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e  ){.    pInode->n
d040: 52 65 66 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70  Ref--;.    if( p
d050: 49 6e 6f 64 65 2d 3e 6e 52 65 66 3d 3d 30 20 29  Inode->nRef==0 )
d060: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
d070: 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65  pInode->pShmNode
d080: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 63 6c 6f  ==0 );.      clo
d090: 73 65 50 65 6e 64 69 6e 67 46 64 73 28 70 46 69  sePendingFds(pFi
d0a0: 6c 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  le);.      if( p
d0b0: 49 6e 6f 64 65 2d 3e 70 50 72 65 76 20 29 7b 0a  Inode->pPrev ){.
d0c0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
d0d0: 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76 2d 3e 70  pInode->pPrev->p
d0e0: 4e 65 78 74 3d 3d 70 49 6e 6f 64 65 20 29 3b 0a  Next==pInode );.
d0f0: 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e          pInode->
d100: 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70  pPrev->pNext = p
d110: 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a 20 20  Inode->pNext;.  
d120: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
d130: 20 20 20 61 73 73 65 72 74 28 20 69 6e 6f 64 65     assert( inode
d140: 4c 69 73 74 3d 3d 70 49 6e 6f 64 65 20 29 3b 0a  List==pInode );.
d150: 20 20 20 20 20 20 20 20 69 6e 6f 64 65 4c 69 73          inodeLis
d160: 74 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78  t = pInode->pNex
d170: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
d180: 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 70 4e 65   if( pInode->pNe
d190: 78 74 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  xt ){.        as
d1a0: 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 70 4e  sert( pInode->pN
d1b0: 65 78 74 2d 3e 70 50 72 65 76 3d 3d 70 49 6e 6f  ext->pPrev==pIno
d1c0: 64 65 20 29 3b 0a 20 20 20 20 20 20 20 20 70 49  de );.        pI
d1d0: 6e 6f 64 65 2d 3e 70 4e 65 78 74 2d 3e 70 50 72  node->pNext->pPr
d1e0: 65 76 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 50 72  ev = pInode->pPr
d1f0: 65 76 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ev;.      }.    
d200: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
d210: 49 6e 6f 64 65 29 3b 0a 20 20 20 20 7d 0a 20 20  Inode);.    }.  
d220: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  }.}../*.** Given
d230: 20 61 20 66 69 6c 65 20 64 65 73 63 72 69 70 74   a file descript
d240: 6f 72 2c 20 6c 6f 63 61 74 65 20 74 68 65 20 75  or, locate the u
d250: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a  nixInodeInfo obj
d260: 65 63 74 20 74 68 61 74 0a 2a 2a 20 64 65 73 63  ect that.** desc
d270: 72 69 62 65 73 20 74 68 61 74 20 66 69 6c 65 20  ribes that file 
d280: 64 65 73 63 72 69 70 74 6f 72 2e 20 20 43 72 65  descriptor.  Cre
d290: 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 69 66  ate a new one if
d2a0: 20 6e 65 63 65 73 73 61 72 79 2e 20 20 54 68 65   necessary.  The
d2b0: 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65  .** return value
d2c0: 20 6d 69 67 68 74 20 62 65 20 75 6e 69 6e 69 74   might be uninit
d2d0: 69 61 6c 69 7a 65 64 20 69 66 20 61 6e 20 65 72  ialized if an er
d2e0: 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a  ror occurs..**.*
d2f0: 2a 20 54 68 65 20 6d 75 74 65 78 20 65 6e 74 65  * The mutex ente
d300: 72 65 64 20 75 73 69 6e 67 20 74 68 65 20 75 6e  red using the un
d310: 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 20 66  ixEnterMutex() f
d320: 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  unction must be 
d330: 68 65 6c 64 0a 2a 2a 20 77 68 65 6e 20 74 68 69  held.** when thi
d340: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
d350: 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  lled..**.** Retu
d360: 72 6e 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74  rn an appropriat
d370: 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f  e error code..*/
d380: 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6e 64  .static int find
d390: 49 6e 6f 64 65 49 6e 66 6f 28 0a 20 20 75 6e 69  InodeInfo(.  uni
d3a0: 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 20  xFile *pFile,   
d3b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
d3c0: 6e 69 78 20 66 69 6c 65 20 77 69 74 68 20 66 69  nix file with fi
d3d0: 6c 65 20 64 65 73 63 20 75 73 65 64 20 69 6e 20  le desc used in 
d3e0: 74 68 65 20 6b 65 79 20 2a 2f 0a 20 20 75 6e 69  the key */.  uni
d3f0: 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 2a 70 70 49  xInodeInfo **ppI
d400: 6e 6f 64 65 20 20 20 20 20 20 20 20 2f 2a 20 52  node        /* R
d410: 65 74 75 72 6e 20 74 68 65 20 75 6e 69 78 49 6e  eturn the unixIn
d420: 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 20 68  odeInfo object h
d430: 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ere */.){.  int 
d440: 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
d450: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 79             /* Sy
d460: 73 74 65 6d 20 63 61 6c 6c 20 72 65 74 75 72 6e  stem call return
d470: 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 66   code */.  int f
d480: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
d490: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
d4a0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
d4b0: 20 66 6f 72 20 70 46 69 6c 65 20 2a 2f 0a 20 20   for pFile */.  
d4c0: 73 74 72 75 63 74 20 75 6e 69 78 46 69 6c 65 49  struct unixFileI
d4d0: 64 20 66 69 6c 65 49 64 3b 20 20 20 20 20 20 2f  d fileId;      /
d4e0: 2a 20 4c 6f 6f 6b 75 70 20 6b 65 79 20 66 6f 72  * Lookup key for
d4f0: 20 74 68 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e   the unixInodeIn
d500: 66 6f 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73  fo */.  struct s
d510: 74 61 74 20 73 74 61 74 62 75 66 3b 20 20 20 20  tat statbuf;    
d520: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 77 2d 6c 65         /* Low-le
d530: 76 65 6c 20 66 69 6c 65 20 69 6e 66 6f 72 6d 61  vel file informa
d540: 74 69 6f 6e 20 2a 2f 0a 20 20 75 6e 69 78 49 6e  tion */.  unixIn
d550: 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20  odeInfo *pInode 
d560: 3d 20 30 3b 20 20 20 20 20 2f 2a 20 43 61 6e 64  = 0;     /* Cand
d570: 69 64 61 74 65 20 75 6e 69 78 49 6e 6f 64 65 49  idate unixInodeI
d580: 6e 66 6f 20 6f 62 6a 65 63 74 20 2a 2f 0a 0a 20  nfo object */.. 
d590: 20 61 73 73 65 72 74 28 20 75 6e 69 78 4d 75 74   assert( unixMut
d5a0: 65 78 48 65 6c 64 28 29 20 29 3b 0a 0a 20 20 2f  exHeld() );..  /
d5b0: 2a 20 47 65 74 20 6c 6f 77 2d 6c 65 76 65 6c 20  * Get low-level 
d5c0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  information abou
d5d0: 74 20 74 68 65 20 66 69 6c 65 20 74 68 61 74 20  t the file that 
d5e0: 77 65 20 63 61 6e 20 75 73 65 64 20 74 6f 0a 20  we can used to. 
d5f0: 20 2a 2a 20 63 72 65 61 74 65 20 61 20 75 6e 69   ** create a uni
d600: 71 75 65 20 6e 61 6d 65 20 66 6f 72 20 74 68 65  que name for the
d610: 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 66 64   file..  */.  fd
d620: 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 20 20 72   = pFile->h;.  r
d630: 63 20 3d 20 6f 73 46 73 74 61 74 28 66 64 2c 20  c = osFstat(fd, 
d640: 26 73 74 61 74 62 75 66 29 3b 0a 20 20 69 66 28  &statbuf);.  if(
d650: 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 73 74   rc!=0 ){.    st
d660: 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69  oreLastErrno(pFi
d670: 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 23 69 66 64  le, errno);.#ifd
d680: 65 66 20 45 4f 56 45 52 46 4c 4f 57 0a 20 20 20  ef EOVERFLOW.   
d690: 20 69 66 28 20 70 46 69 6c 65 2d 3e 6c 61 73 74   if( pFile->last
d6a0: 45 72 72 6e 6f 3d 3d 45 4f 56 45 52 46 4c 4f 57  Errno==EOVERFLOW
d6b0: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
d6c0: 5f 4e 4f 4c 46 53 3b 0a 23 65 6e 64 69 66 0a 20  _NOLFS;.#endif. 
d6d0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
d6e0: 5f 49 4f 45 52 52 3b 0a 20 20 7d 0a 0a 23 69 66  _IOERR;.  }..#if
d6f0: 64 65 66 20 5f 5f 41 50 50 4c 45 5f 5f 0a 20 20  def __APPLE__.  
d700: 2f 2a 20 4f 6e 20 4f 53 20 58 20 6f 6e 20 61 6e  /* On OS X on an
d710: 20 6d 73 64 6f 73 20 66 69 6c 65 73 79 73 74 65   msdos filesyste
d720: 6d 2c 20 74 68 65 20 69 6e 6f 64 65 20 6e 75 6d  m, the inode num
d730: 62 65 72 20 69 73 20 72 65 70 6f 72 74 65 64 0a  ber is reported.
d740: 20 20 2a 2a 20 69 6e 63 6f 72 72 65 63 74 6c 79    ** incorrectly
d750: 20 66 6f 72 20 7a 65 72 6f 2d 73 69 7a 65 20 66   for zero-size f
d760: 69 6c 65 73 2e 20 20 53 65 65 20 74 69 63 6b 65  iles.  See ticke
d770: 74 20 23 33 32 36 30 2e 20 20 54 6f 20 77 6f 72  t #3260.  To wor
d780: 6b 0a 20 20 2a 2a 20 61 72 6f 75 6e 64 20 74 68  k.  ** around th
d790: 69 73 20 70 72 6f 62 6c 65 6d 20 28 77 65 20 63  is problem (we c
d7a0: 6f 6e 73 69 64 65 72 20 69 74 20 61 20 62 75 67  onsider it a bug
d7b0: 20 69 6e 20 4f 53 20 58 2c 20 6e 6f 74 20 53 51   in OS X, not SQ
d7c0: 4c 69 74 65 29 0a 20 20 2a 2a 20 77 65 20 61 6c  Lite).  ** we al
d7d0: 77 61 79 73 20 69 6e 63 72 65 61 73 65 20 74 68  ways increase th
d7e0: 65 20 66 69 6c 65 20 73 69 7a 65 20 74 6f 20 31  e file size to 1
d7f0: 20 62 79 20 77 72 69 74 69 6e 67 20 61 20 73 69   by writing a si
d800: 6e 67 6c 65 20 62 79 74 65 0a 20 20 2a 2a 20 70  ngle byte.  ** p
d810: 72 69 6f 72 20 74 6f 20 61 63 63 65 73 73 69 6e  rior to accessin
d820: 67 20 74 68 65 20 69 6e 6f 64 65 20 6e 75 6d 62  g the inode numb
d830: 65 72 2e 20 20 54 68 65 20 6f 6e 65 20 62 79 74  er.  The one byt
d840: 65 20 77 72 69 74 74 65 6e 20 69 73 0a 20 20 2a  e written is.  *
d850: 2a 20 61 6e 20 41 53 43 49 49 20 27 53 27 20 63  * an ASCII 'S' c
d860: 68 61 72 61 63 74 65 72 20 77 68 69 63 68 20 61  haracter which a
d870: 6c 73 6f 20 68 61 70 70 65 6e 73 20 74 6f 20 62  lso happens to b
d880: 65 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65  e the first byte
d890: 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 68 65 61  .  ** in the hea
d8a0: 64 65 72 20 6f 66 20 65 76 65 72 79 20 53 51 4c  der of every SQL
d8b0: 69 74 65 20 64 61 74 61 62 61 73 65 2e 20 20 49  ite database.  I
d8c0: 6e 20 74 68 69 73 20 77 61 79 2c 20 69 66 20 74  n this way, if t
d8d0: 68 65 72 65 0a 20 20 2a 2a 20 69 73 20 61 20 72  here.  ** is a r
d8e0: 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 73 75  ace condition su
d8f0: 63 68 20 74 68 61 74 20 61 6e 6f 74 68 65 72 20  ch that another 
d900: 74 68 72 65 61 64 20 68 61 73 20 61 6c 72 65 61  thread has alrea
d910: 64 79 20 70 6f 70 75 6c 61 74 65 64 0a 20 20 2a  dy populated.  *
d920: 2a 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65  * the first page
d930: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
d940: 2c 20 6e 6f 20 64 61 6d 61 67 65 20 69 73 20 64  , no damage is d
d950: 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  one..  */.  if( 
d960: 73 74 61 74 62 75 66 2e 73 74 5f 73 69 7a 65 3d  statbuf.st_size=
d970: 3d 30 20 26 26 20 28 70 46 69 6c 65 2d 3e 66 73  =0 && (pFile->fs
d980: 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  Flags & SQLITE_F
d990: 53 46 4c 41 47 53 5f 49 53 5f 4d 53 44 4f 53 29  SFLAGS_IS_MSDOS)
d9a0: 21 3d 30 20 29 7b 0a 20 20 20 20 64 6f 7b 20 72  !=0 ){.    do{ r
d9b0: 63 20 3d 20 6f 73 57 72 69 74 65 28 66 64 2c 20  c = osWrite(fd, 
d9c0: 22 53 22 2c 20 31 29 3b 20 7d 77 68 69 6c 65 28  "S", 1); }while(
d9d0: 20 72 63 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d   rc<0 && errno==
d9e0: 45 49 4e 54 52 20 29 3b 0a 20 20 20 20 69 66 28  EINTR );.    if(
d9f0: 20 72 63 21 3d 31 20 29 7b 0a 20 20 20 20 20 20   rc!=1 ){.      
da00: 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70  storeLastErrno(p
da10: 46 69 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 20 20  File, errno);.  
da20: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
da30: 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20 7d 0a 20  E_IOERR;.    }. 
da40: 20 20 20 72 63 20 3d 20 6f 73 46 73 74 61 74 28     rc = osFstat(
da50: 66 64 2c 20 26 73 74 61 74 62 75 66 29 3b 0a 20  fd, &statbuf);. 
da60: 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a     if( rc!=0 ){.
da70: 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45        storeLastE
da80: 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e  rrno(pFile, errn
da90: 6f 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  o);.      return
daa0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20   SQLITE_IOERR;. 
dab0: 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
dac0: 0a 20 20 6d 65 6d 73 65 74 28 26 66 69 6c 65 49  .  memset(&fileI
dad0: 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28 66 69 6c  d, 0, sizeof(fil
dae0: 65 49 64 29 29 3b 0a 20 20 66 69 6c 65 49 64 2e  eId));.  fileId.
daf0: 64 65 76 20 3d 20 73 74 61 74 62 75 66 2e 73 74  dev = statbuf.st
db00: 5f 64 65 76 3b 0a 23 69 66 20 4f 53 5f 56 58 57  _dev;.#if OS_VXW
db10: 4f 52 4b 53 0a 20 20 66 69 6c 65 49 64 2e 70 49  ORKS.  fileId.pI
db20: 64 20 3d 20 70 46 69 6c 65 2d 3e 70 49 64 3b 0a  d = pFile->pId;.
db30: 23 65 6c 73 65 0a 20 20 66 69 6c 65 49 64 2e 69  #else.  fileId.i
db40: 6e 6f 20 3d 20 73 74 61 74 62 75 66 2e 73 74 5f  no = statbuf.st_
db50: 69 6e 6f 3b 0a 23 65 6e 64 69 66 0a 20 20 70 49  ino;.#endif.  pI
db60: 6e 6f 64 65 20 3d 20 69 6e 6f 64 65 4c 69 73 74  node = inodeList
db70: 3b 0a 20 20 77 68 69 6c 65 28 20 70 49 6e 6f 64  ;.  while( pInod
db80: 65 20 26 26 20 6d 65 6d 63 6d 70 28 26 66 69 6c  e && memcmp(&fil
db90: 65 49 64 2c 20 26 70 49 6e 6f 64 65 2d 3e 66 69  eId, &pInode->fi
dba0: 6c 65 49 64 2c 20 73 69 7a 65 6f 66 28 66 69 6c  leId, sizeof(fil
dbb0: 65 49 64 29 29 20 29 7b 0a 20 20 20 20 70 49 6e  eId)) ){.    pIn
dbc0: 6f 64 65 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 4e  ode = pInode->pN
dbd0: 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ext;.  }.  if( p
dbe0: 49 6e 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20  Inode==0 ){.    
dbf0: 70 49 6e 6f 64 65 20 3d 20 73 71 6c 69 74 65 33  pInode = sqlite3
dc00: 5f 6d 61 6c 6c 6f 63 36 34 28 20 73 69 7a 65 6f  _malloc64( sizeo
dc10: 66 28 2a 70 49 6e 6f 64 65 29 20 29 3b 0a 20 20  f(*pInode) );.  
dc20: 20 20 69 66 28 20 70 49 6e 6f 64 65 3d 3d 30 20    if( pInode==0 
dc30: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
dc40: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
dc50: 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28 70    }.    memset(p
dc60: 49 6e 6f 64 65 2c 20 30 2c 20 73 69 7a 65 6f 66  Inode, 0, sizeof
dc70: 28 2a 70 49 6e 6f 64 65 29 29 3b 0a 20 20 20 20  (*pInode));.    
dc80: 6d 65 6d 63 70 79 28 26 70 49 6e 6f 64 65 2d 3e  memcpy(&pInode->
dc90: 66 69 6c 65 49 64 2c 20 26 66 69 6c 65 49 64 2c  fileId, &fileId,
dca0: 20 73 69 7a 65 6f 66 28 66 69 6c 65 49 64 29 29   sizeof(fileId))
dcb0: 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 52  ;.    pInode->nR
dcc0: 65 66 20 3d 20 31 3b 0a 20 20 20 20 70 49 6e 6f  ef = 1;.    pIno
dcd0: 64 65 2d 3e 70 4e 65 78 74 20 3d 20 69 6e 6f 64  de->pNext = inod
dce0: 65 4c 69 73 74 3b 0a 20 20 20 20 70 49 6e 6f 64  eList;.    pInod
dcf0: 65 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20  e->pPrev = 0;.  
dd00: 20 20 69 66 28 20 69 6e 6f 64 65 4c 69 73 74 20    if( inodeList 
dd10: 29 20 69 6e 6f 64 65 4c 69 73 74 2d 3e 70 50 72  ) inodeList->pPr
dd20: 65 76 20 3d 20 70 49 6e 6f 64 65 3b 0a 20 20 20  ev = pInode;.   
dd30: 20 69 6e 6f 64 65 4c 69 73 74 20 3d 20 70 49 6e   inodeList = pIn
dd40: 6f 64 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ode;.  }else{.  
dd50: 20 20 70 49 6e 6f 64 65 2d 3e 6e 52 65 66 2b 2b    pInode->nRef++
dd60: 3b 0a 20 20 7d 0a 20 20 2a 70 70 49 6e 6f 64 65  ;.  }.  *ppInode
dd70: 20 3d 20 70 49 6e 6f 64 65 3b 0a 20 20 72 65 74   = pInode;.  ret
dd80: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
dd90: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
dda0: 52 55 45 20 69 66 20 70 46 69 6c 65 20 68 61 73  RUE if pFile has
ddb0: 20 62 65 65 6e 20 72 65 6e 61 6d 65 64 20 6f 72   been renamed or
ddc0: 20 75 6e 6c 69 6e 6b 65 64 20 73 69 6e 63 65 20   unlinked since 
ddd0: 69 74 20 77 61 73 20 66 69 72 73 74 20 6f 70 65  it was first ope
dde0: 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
ddf0: 6e 74 20 66 69 6c 65 48 61 73 4d 6f 76 65 64 28  nt fileHasMoved(
de00: 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 29  unixFile *pFile)
de10: 7b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53  {.#if OS_VXWORKS
de20: 0a 20 20 72 65 74 75 72 6e 20 70 46 69 6c 65 2d  .  return pFile-
de30: 3e 70 49 6e 6f 64 65 21 3d 30 20 26 26 20 70 46  >pInode!=0 && pF
de40: 69 6c 65 2d 3e 70 49 64 21 3d 70 46 69 6c 65 2d  ile->pId!=pFile-
de50: 3e 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2e  >pInode->fileId.
de60: 70 49 64 3b 0a 23 65 6c 73 65 0a 20 20 73 74 72  pId;.#else.  str
de70: 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20  uct stat buf;.  
de80: 72 65 74 75 72 6e 20 70 46 69 6c 65 2d 3e 70 49  return pFile->pI
de90: 6e 6f 64 65 21 3d 30 20 26 26 0a 20 20 20 20 20  node!=0 &&.     
dea0: 20 28 6f 73 53 74 61 74 28 70 46 69 6c 65 2d 3e   (osStat(pFile->
deb0: 7a 50 61 74 68 2c 20 26 62 75 66 29 21 3d 30 20  zPath, &buf)!=0 
dec0: 7c 7c 20 62 75 66 2e 73 74 5f 69 6e 6f 21 3d 70  || buf.st_ino!=p
ded0: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 66 69  File->pInode->fi
dee0: 6c 65 49 64 2e 69 6e 6f 29 3b 0a 23 65 6e 64 69  leId.ino);.#endi
def0: 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63  f.}.../*.** Chec
df00: 6b 20 61 20 75 6e 69 78 46 69 6c 65 20 74 68 61  k a unixFile tha
df10: 74 20 69 73 20 61 20 64 61 74 61 62 61 73 65 2e  t is a database.
df20: 20 20 56 65 72 69 66 79 20 74 68 65 20 66 6f 6c    Verify the fol
df30: 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 28 31  lowing:.**.** (1
df40: 29 20 54 68 65 72 65 20 69 73 20 65 78 61 63 74  ) There is exact
df50: 6c 79 20 6f 6e 65 20 68 61 72 64 20 6c 69 6e 6b  ly one hard link
df60: 20 6f 6e 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20   on the file.** 
df70: 28 32 29 20 54 68 65 20 66 69 6c 65 20 69 73 20  (2) The file is 
df80: 6e 6f 74 20 61 20 73 79 6d 62 6f 6c 69 63 20 6c  not a symbolic l
df90: 69 6e 6b 0a 2a 2a 20 28 33 29 20 54 68 65 20 66  ink.** (3) The f
dfa0: 69 6c 65 20 68 61 73 20 6e 6f 74 20 62 65 65 6e  ile has not been
dfb0: 20 72 65 6e 61 6d 65 64 20 6f 72 20 75 6e 6c 69   renamed or unli
dfc0: 6e 6b 65 64 0a 2a 2a 0a 2a 2a 20 49 73 73 75 65  nked.**.** Issue
dfd0: 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c   sqlite3_log(SQL
dfe0: 49 54 45 5f 57 41 52 4e 49 4e 47 2c 2e 2e 2e 29  ITE_WARNING,...)
dff0: 20 6d 65 73 73 61 67 65 73 20 69 66 20 61 6e 79   messages if any
e000: 74 68 69 6e 67 20 69 73 20 6e 6f 74 20 72 69 67  thing is not rig
e010: 68 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ht..*/.static vo
e020: 69 64 20 76 65 72 69 66 79 44 62 46 69 6c 65 28  id verifyDbFile(
e030: 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 29  unixFile *pFile)
e040: 7b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 20  {.  struct stat 
e050: 62 75 66 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  buf;.  int rc;. 
e060: 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e   assert( pFile->
e070: 7a 50 61 74 68 21 3d 30 20 7c 7c 20 70 46 69 6c  zPath!=0 || pFil
e080: 65 2d 3e 70 49 6e 6f 64 65 3d 3d 30 20 29 3b 0a  e->pInode==0 );.
e090: 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 63 74 72    if( pFile->ctr
e0a0: 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c  lFlags & UNIXFIL
e0b0: 45 5f 57 41 52 4e 45 44 20 29 7b 0a 20 20 20 20  E_WARNED ){.    
e0c0: 2f 2a 20 4f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f  /* One or more o
e0d0: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
e0e0: 77 61 72 6e 69 6e 67 73 20 68 61 76 65 20 61 6c  warnings have al
e0f0: 72 65 61 64 79 20 62 65 65 6e 20 69 73 73 75 65  ready been issue
e100: 64 2e 20 20 44 6f 20 6e 6f 74 0a 20 20 20 20 2a  d.  Do not.    *
e110: 2a 20 72 65 70 65 61 74 20 74 68 65 6d 20 73 6f  * repeat them so
e120: 20 61 73 20 6e 6f 74 20 74 6f 20 63 6c 75 74 74   as not to clutt
e130: 65 72 20 74 68 65 20 65 72 72 6f 72 20 6c 6f 67  er the error log
e140: 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   */.    return;.
e150: 20 20 7d 0a 20 20 72 63 20 3d 20 6f 73 46 73 74    }.  rc = osFst
e160: 61 74 28 70 46 69 6c 65 2d 3e 68 2c 20 26 62 75  at(pFile->h, &bu
e170: 66 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 30 20  f);.  if( rc!=0 
e180: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c  ){.    sqlite3_l
e190: 6f 67 28 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e  og(SQLITE_WARNIN
e1a0: 47 2c 20 22 63 61 6e 6e 6f 74 20 66 73 74 61 74  G, "cannot fstat
e1b0: 20 64 62 20 66 69 6c 65 20 25 73 22 2c 20 70 46   db file %s", pF
e1c0: 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20  ile->zPath);.   
e1d0: 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67   pFile->ctrlFlag
e1e0: 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 57 41  s |= UNIXFILE_WA
e1f0: 52 4e 45 44 3b 0a 20 20 20 20 72 65 74 75 72 6e  RNED;.    return
e200: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 62 75 66 2e  ;.  }.  if( buf.
e210: 73 74 5f 6e 6c 69 6e 6b 3d 3d 30 20 26 26 20 28  st_nlink==0 && (
e220: 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73  pFile->ctrlFlags
e230: 20 26 20 55 4e 49 58 46 49 4c 45 5f 44 45 4c 45   & UNIXFILE_DELE
e240: 54 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  TE)==0 ){.    sq
e250: 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45  lite3_log(SQLITE
e260: 5f 57 41 52 4e 49 4e 47 2c 20 22 66 69 6c 65 20  _WARNING, "file 
e270: 75 6e 6c 69 6e 6b 65 64 20 77 68 69 6c 65 20 6f  unlinked while o
e280: 70 65 6e 3a 20 25 73 22 2c 20 70 46 69 6c 65 2d  pen: %s", pFile-
e290: 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 70 46 69  >zPath);.    pFi
e2a0: 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d  le->ctrlFlags |=
e2b0: 20 55 4e 49 58 46 49 4c 45 5f 57 41 52 4e 45 44   UNIXFILE_WARNED
e2c0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
e2d0: 7d 0a 20 20 69 66 28 20 62 75 66 2e 73 74 5f 6e  }.  if( buf.st_n
e2e0: 6c 69 6e 6b 3e 31 20 29 7b 0a 20 20 20 20 73 71  link>1 ){.    sq
e2f0: 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45  lite3_log(SQLITE
e300: 5f 57 41 52 4e 49 4e 47 2c 20 22 6d 75 6c 74 69  _WARNING, "multi
e310: 70 6c 65 20 6c 69 6e 6b 73 20 74 6f 20 66 69 6c  ple links to fil
e320: 65 3a 20 25 73 22 2c 20 70 46 69 6c 65 2d 3e 7a  e: %s", pFile->z
e330: 50 61 74 68 29 3b 0a 20 20 20 20 70 46 69 6c 65  Path);.    pFile
e340: 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55  ->ctrlFlags |= U
e350: 4e 49 58 46 49 4c 45 5f 57 41 52 4e 45 44 3b 0a  NIXFILE_WARNED;.
e360: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
e370: 20 20 69 66 28 20 66 69 6c 65 48 61 73 4d 6f 76    if( fileHasMov
e380: 65 64 28 70 46 69 6c 65 29 20 29 7b 0a 20 20 20  ed(pFile) ){.   
e390: 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c   sqlite3_log(SQL
e3a0: 49 54 45 5f 57 41 52 4e 49 4e 47 2c 20 22 66 69  ITE_WARNING, "fi
e3b0: 6c 65 20 72 65 6e 61 6d 65 64 20 77 68 69 6c 65  le renamed while
e3c0: 20 6f 70 65 6e 3a 20 25 73 22 2c 20 70 46 69 6c   open: %s", pFil
e3d0: 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 70  e->zPath);.    p
e3e0: 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20  File->ctrlFlags 
e3f0: 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 57 41 52 4e  |= UNIXFILE_WARN
e400: 45 44 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  ED;.    return;.
e410: 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68    }.}.../*.** Th
e420: 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b  is routine check
e430: 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20  s if there is a 
e440: 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65  RESERVED lock he
e450: 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66  ld on the specif
e460: 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74  ied.** file by t
e470: 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72  his or any other
e480: 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63   process. If suc
e490: 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  h a lock is held
e4a0: 2c 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a  , set *pResOut.*
e4b0: 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20  * to a non-zero 
e4c0: 76 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20  value otherwise 
e4d0: 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65 74 20  *pResOut is set 
e4e0: 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65  to zero.  The re
e4f0: 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73  turn value.** is
e500: 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f   set to SQLITE_O
e510: 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20  K unless an I/O 
e520: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72  error occurs dur
e530: 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e  ing lock checkin
e540: 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
e550: 20 75 6e 69 78 43 68 65 63 6b 52 65 73 65 72 76   unixCheckReserv
e560: 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  edLock(sqlite3_f
e570: 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52  ile *id, int *pR
e580: 65 73 4f 75 74 29 7b 0a 20 20 69 6e 74 20 72 63  esOut){.  int rc
e590: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
e5a0: 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d 20 30  int reserved = 0
e5b0: 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  ;.  unixFile *pF
e5c0: 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
e5d0: 29 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65  )id;..  Simulate
e5e0: 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  IOError( return 
e5f0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45  SQLITE_IOERR_CHE
e600: 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20  CKRESERVEDLOCK; 
e610: 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46  );..  assert( pF
e620: 69 6c 65 20 29 3b 0a 20 20 75 6e 69 78 45 6e 74  ile );.  unixEnt
e630: 65 72 4d 75 74 65 78 28 29 3b 20 2f 2a 20 42 65  erMutex(); /* Be
e640: 63 61 75 73 65 20 70 46 69 6c 65 2d 3e 70 49 6e  cause pFile->pIn
e650: 6f 64 65 20 69 73 20 73 68 61 72 65 64 20 61 63  ode is shared ac
e660: 72 6f 73 73 20 74 68 72 65 61 64 73 20 2a 2f 0a  ross threads */.
e670: 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61  .  /* Check if a
e680: 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 20   thread in this 
e690: 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75  process holds su
e6a0: 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69  ch a lock */.  i
e6b0: 66 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  f( pFile->pInode
e6c0: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52  ->eFileLock>SHAR
e6d0: 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72  ED_LOCK ){.    r
e6e0: 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d  eserved = 1;.  }
e6f0: 0a 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65  ..  /* Otherwise
e700: 20 73 65 65 20 69 66 20 73 6f 6d 65 20 6f 74 68   see if some oth
e710: 65 72 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73  er process holds
e720: 20 69 74 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65   it..  */.#ifnde
e730: 66 20 5f 5f 44 4a 47 50 50 5f 5f 0a 20 20 69 66  f __DJGPP__.  if
e740: 28 20 21 72 65 73 65 72 76 65 64 20 26 26 20 21  ( !reserved && !
e750: 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 62  pFile->pInode->b
e760: 50 72 6f 63 65 73 73 4c 6f 63 6b 20 29 7b 0a 20  ProcessLock ){. 
e770: 20 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20     struct flock 
e780: 6c 6f 63 6b 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c  lock;.    lock.l
e790: 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53  _whence = SEEK_S
e7a0: 45 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73  ET;.    lock.l_s
e7b0: 74 61 72 74 20 3d 20 52 45 53 45 52 56 45 44 5f  tart = RESERVED_
e7c0: 42 59 54 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c  BYTE;.    lock.l
e7d0: 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20 20 20 6c 6f  _len = 1;.    lo
e7e0: 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57 52  ck.l_type = F_WR
e7f0: 4c 43 4b 3b 0a 20 20 20 20 69 66 28 20 6f 73 46  LCK;.    if( osF
e800: 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46  cntl(pFile->h, F
e810: 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 20 29  _GETLK, &lock) )
e820: 7b 0a 23 69 66 20 4f 53 4c 4f 43 4b 49 4e 47 5f  {.#if OSLOCKING_
e830: 43 48 45 43 4b 5f 42 55 53 59 5f 49 4f 45 52 52  CHECK_BUSY_IOERR
e840: 0a 20 20 20 20 20 20 69 6e 74 20 74 45 72 72 6e  .      int tErrn
e850: 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
e860: 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f   rc = sqliteErro
e870: 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28  rFromPosixError(
e880: 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49  tErrno, SQLITE_I
e890: 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56  OERR_CHECKRESERV
e8a0: 45 44 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 73  EDLOCK);.      s
e8b0: 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46  toreLastErrno(pF
e8c0: 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 23 65  ile, tErrno);.#e
e8d0: 6c 73 65 0a 20 20 20 20 20 20 72 63 20 3d 20 53  lse.      rc = S
e8e0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43  QLITE_IOERR_CHEC
e8f0: 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 0a 20  KRESERVEDLOCK;. 
e900: 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72       storeLastEr
e910: 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f  rno(pFile, errno
e920: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 20  );.#endif.    } 
e930: 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b 2e 6c 5f  else if( lock.l_
e940: 74 79 70 65 21 3d 46 5f 55 4e 4c 43 4b 20 29 7b  type!=F_UNLCK ){
e950: 0a 20 20 20 20 20 20 72 65 73 65 72 76 65 64 20  .      reserved 
e960: 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  = 1;.    }.  }.#
e970: 65 6e 64 69 66 0a 20 20 0a 20 20 75 6e 69 78 4c  endif.  .  unixL
e980: 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f  eaveMutex();.  O
e990: 53 54 52 41 43 45 28 28 22 54 45 53 54 20 57 52  STRACE(("TEST WR
e9a0: 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 20 28  -LOCK %d %d %d (
e9b0: 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  unix)\n", pFile-
e9c0: 3e 68 2c 20 72 63 2c 20 72 65 73 65 72 76 65 64  >h, rc, reserved
e9d0: 29 29 3b 0a 0a 20 20 2a 70 52 65 73 4f 75 74 20  ));..  *pResOut 
e9e0: 3d 20 72 65 73 65 72 76 65 64 3b 0a 20 20 72 65  = reserved;.  re
e9f0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
ea00: 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73 65 74  * Attempt to set
ea10: 20 61 20 73 79 73 74 65 6d 2d 6c 6f 63 6b 20 6f   a system-lock o
ea20: 6e 20 74 68 65 20 66 69 6c 65 20 70 46 69 6c 65  n the file pFile
ea30: 2e 20 20 54 68 65 20 6c 6f 63 6b 20 69 73 20 0a  .  The lock is .
ea40: 2a 2a 20 64 65 73 63 72 69 62 65 64 20 62 79 20  ** described by 
ea50: 70 4c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  pLock..**.** If 
ea60: 74 68 65 20 70 46 69 6c 65 20 77 61 73 20 6f 70  the pFile was op
ea70: 65 6e 65 64 20 72 65 61 64 2f 77 72 69 74 65 20  ened read/write 
ea80: 66 72 6f 6d 20 75 6e 69 78 2d 65 78 63 6c 2c 20  from unix-excl, 
ea90: 74 68 65 6e 20 74 68 65 20 6f 6e 6c 79 20 6c 6f  then the only lo
eaa0: 63 6b 0a 2a 2a 20 65 76 65 72 20 6f 62 74 61 69  ck.** ever obtai
eab0: 6e 65 64 20 69 73 20 61 6e 20 65 78 63 6c 75 73  ned is an exclus
eac0: 69 76 65 20 6c 6f 63 6b 2c 20 61 6e 64 20 69 74  ive lock, and it
ead0: 20 69 73 20 6f 62 74 61 69 6e 65 64 20 65 78 61   is obtained exa
eae0: 63 74 6c 79 20 6f 6e 63 65 0a 2a 2a 20 74 68 65  ctly once.** the
eaf0: 20 66 69 72 73 74 20 74 69 6d 65 20 61 6e 79 20   first time any 
eb00: 6c 6f 63 6b 20 69 73 20 61 74 74 65 6d 70 74 65  lock is attempte
eb10: 64 2e 20 20 41 6c 6c 20 73 75 62 73 65 71 75 65  d.  All subseque
eb20: 6e 74 20 73 79 73 74 65 6d 20 6c 6f 63 6b 69 6e  nt system lockin
eb30: 67 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 73 20  g.** operations 
eb40: 62 65 63 6f 6d 65 20 6e 6f 2d 6f 70 73 2e 20 20  become no-ops.  
eb50: 4c 6f 63 6b 69 6e 67 20 6f 70 65 72 61 74 69 6f  Locking operatio
eb60: 6e 73 20 73 74 69 6c 6c 20 68 61 70 70 65 6e 20  ns still happen 
eb70: 69 6e 74 65 72 6e 61 6c 6c 79 2c 0a 2a 2a 20 69  internally,.** i
eb80: 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f 6f 72 64  n order to coord
eb90: 69 6e 61 74 65 20 61 63 63 65 73 73 20 62 65 74  inate access bet
eba0: 77 65 65 6e 20 73 65 70 61 72 61 74 65 20 64 61  ween separate da
ebb0: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
ebc0: 6e 73 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 69  ns.** within thi
ebd0: 73 20 70 72 6f 63 65 73 73 2c 20 62 75 74 20 61  s process, but a
ebe0: 6c 6c 20 6f 66 20 74 68 61 74 20 69 73 20 68 61  ll of that is ha
ebf0: 6e 64 6c 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20  ndled in memory 
ec00: 61 6e 64 20 74 68 65 0a 2a 2a 20 6f 70 65 72 61  and the.** opera
ec10: 74 69 6e 67 20 73 79 73 74 65 6d 20 64 6f 65 73  ting system does
ec20: 20 6e 6f 74 20 70 61 72 74 69 63 69 70 61 74 65   not participate
ec30: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
ec40: 63 74 69 6f 6e 20 69 73 20 61 20 70 61 73 73 2d  ction is a pass-
ec50: 74 68 72 6f 75 67 68 20 74 6f 20 66 63 6e 74 6c  through to fcntl
ec60: 28 46 5f 53 45 54 4c 4b 29 20 69 66 20 70 46 69  (F_SETLK) if pFi
ec70: 6c 65 20 69 73 20 75 73 69 6e 67 0a 2a 2a 20 61  le is using.** a
ec80: 6e 79 20 56 46 53 20 6f 74 68 65 72 20 74 68 61  ny VFS other tha
ec90: 6e 20 22 75 6e 69 78 2d 65 78 63 6c 22 20 6f 72  n "unix-excl" or
eca0: 20 69 66 20 70 46 69 6c 65 20 69 73 20 6f 70 65   if pFile is ope
ecb0: 6e 65 64 20 6f 6e 20 22 75 6e 69 78 2d 65 78 63  ned on "unix-exc
ecc0: 6c 22 0a 2a 2a 20 61 6e 64 20 69 73 20 72 65 61  l".** and is rea
ecd0: 64 2d 6f 6e 6c 79 2e 0a 2a 2a 0a 2a 2a 20 5a 65  d-only..**.** Ze
ece0: 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  ro is returned i
ecf0: 66 20 74 68 65 20 63 61 6c 6c 20 63 6f 6d 70 6c  f the call compl
ed00: 65 74 65 73 20 73 75 63 63 65 73 73 66 75 6c 6c  etes successfull
ed10: 79 2c 20 6f 72 20 2d 31 20 69 66 20 61 20 63 61  y, or -1 if a ca
ed20: 6c 6c 0a 2a 2a 20 74 6f 20 66 63 6e 74 6c 28 29  ll.** to fcntl()
ed30: 20 66 61 69 6c 73 2e 20 49 6e 20 74 68 69 73 20   fails. In this 
ed40: 63 61 73 65 2c 20 65 72 72 6e 6f 20 69 73 20 73  case, errno is s
ed50: 65 74 20 61 70 70 72 6f 70 72 69 61 74 65 6c 79  et appropriately
ed60: 20 28 62 79 20 66 63 6e 74 6c 28 29 29 2e 0a 2a   (by fcntl())..*
ed70: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
ed80: 78 46 69 6c 65 4c 6f 63 6b 28 75 6e 69 78 46 69  xFileLock(unixFi
ed90: 6c 65 20 2a 70 46 69 6c 65 2c 20 73 74 72 75 63  le *pFile, struc
eda0: 74 20 66 6c 6f 63 6b 20 2a 70 4c 6f 63 6b 2c 20  t flock *pLock, 
edb0: 69 6e 74 20 6e 52 65 74 72 79 29 7b 0a 20 20 69  int nRetry){.  i
edc0: 6e 74 20 72 63 3b 0a 20 20 75 6e 69 78 49 6e 6f  nt rc;.  unixIno
edd0: 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d  deInfo *pInode =
ede0: 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a   pFile->pInode;.
edf0: 20 20 61 73 73 65 72 74 28 20 75 6e 69 78 4d 75    assert( unixMu
ee00: 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 20 20 61  texHeld() );.  a
ee10: 73 73 65 72 74 28 20 70 49 6e 6f 64 65 21 3d 30  ssert( pInode!=0
ee20: 20 29 3b 0a 20 20 69 66 28 20 28 28 70 46 69 6c   );.  if( ((pFil
ee30: 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 55  e->ctrlFlags & U
ee40: 4e 49 58 46 49 4c 45 5f 45 58 43 4c 29 21 3d 30  NIXFILE_EXCL)!=0
ee50: 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 62 50 72 6f   || pInode->bPro
ee60: 63 65 73 73 4c 6f 63 6b 29 0a 20 20 20 26 26 20  cessLock).   && 
ee70: 28 28 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61  ((pFile->ctrlFla
ee80: 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 52 44  gs & UNIXFILE_RD
ee90: 4f 4e 4c 59 29 3d 3d 30 29 0a 20 20 29 7b 0a 20  ONLY)==0).  ){. 
eea0: 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 62     if( pInode->b
eeb0: 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29  ProcessLock==0 )
eec0: 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 66  {.      struct f
eed0: 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 20 20 20  lock lock;.     
eee0: 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d   assert( pInode-
eef0: 3e 6e 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20  >nLock==0 );.   
ef00: 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65     lock.l_whence
ef10: 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20   = SEEK_SET;.   
ef20: 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20     lock.l_start 
ef30: 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a  = SHARED_FIRST;.
ef40: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e        lock.l_len
ef50: 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a   = SHARED_SIZE;.
ef60: 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70        lock.l_typ
ef70: 65 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20 20 20  e = F_WRLCK;.   
ef80: 20 20 20 72 63 20 3d 20 6f 73 46 63 6e 74 6c 28     rc = osFcntl(
ef90: 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 53 45 54 4c  pFile->h, F_SETL
efa0: 4b 2c 20 26 6c 6f 63 6b 29 3b 0a 20 20 20 20 20  K, &lock);.     
efb0: 20 69 66 28 20 72 63 3c 30 20 29 20 72 65 74 75   if( rc<0 ) retu
efc0: 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 70 49 6e  rn rc;.      pIn
efd0: 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63  ode->bProcessLoc
efe0: 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 49 6e  k = 1;.      pIn
eff0: 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20  ode->nLock++;.  
f000: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
f010: 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  c = 0;.    }.  }
f020: 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 69 20  else{.    int i 
f030: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
f040: 20 20 20 20 20 20 20 20 20 20 0a 20 20 20 20 66            .    f
f050: 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20 72 63  or(;;){.      rc
f060: 20 3d 20 6f 73 46 63 6e 74 6c 28 70 46 69 6c 65   = osFcntl(pFile
f070: 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 70 4c  ->h, F_SETLK, pL
f080: 6f 63 6b 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ock);.      if( 
f090: 72 63 20 26 26 20 6e 52 65 74 72 79 2d 2d 20 29  rc && nRetry-- )
f0a0: 7b 0a 20 20 20 20 20 20 20 20 75 73 6c 65 65 70  {.        usleep
f0b0: 28 31 30 30 20 2a 20 28 2b 2b 69 29 29 3b 0a 20  (100 * (++i));. 
f0c0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
f0d0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
f0e0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
f0f0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
f100: 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65  ** Lock the file
f110: 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73   with the lock s
f120: 70 65 63 69 66 69 65 64 20 62 79 20 70 61 72 61  pecified by para
f130: 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20  meter eFileLock 
f140: 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20  - one.** of the 
f150: 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
f160: 20 20 20 20 20 28 31 29 20 53 48 41 52 45 44 5f       (1) SHARED_
f170: 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20  LOCK.**     (2) 
f180: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a  RESERVED_LOCK.**
f190: 20 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47       (3) PENDING
f1a0: 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29  _LOCK.**     (4)
f1b0: 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a   EXCLUSIVE_LOCK.
f1c0: 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20  **.** Sometimes 
f1d0: 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20  when requesting 
f1e0: 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20  one lock state, 
f1f0: 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20  additional lock 
f200: 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e  states.** are in
f210: 73 65 72 74 65 64 20 69 6e 20 62 65 74 77 65 65  serted in betwee
f220: 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20  n.  The locking 
f230: 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e  might fail on on
f240: 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a  e of the later.*
f250: 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65  * transitions le
f260: 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73  aving the lock s
f270: 74 61 74 65 20 64 69 66 66 65 72 65 6e 74 20 66  tate different f
f280: 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61 72  rom what it star
f290: 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c  ted but.** still
f2a0: 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f   short of its go
f2b0: 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  al.  The followi
f2c0: 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73 20 74  ng chart shows t
f2d0: 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72  he allowed.** tr
f2e0: 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68  ansitions and th
f2f0: 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72  e inserted inter
f300: 6d 65 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a  mediate states:.
f310: 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45  **.**    UNLOCKE
f320: 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20  D -> SHARED.**  
f330: 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45    SHARED -> RESE
f340: 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45  RVED.**    SHARE
f350: 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d  D -> (PENDING) -
f360: 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  > EXCLUSIVE.**  
f370: 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50    RESERVED -> (P
f380: 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55  ENDING) -> EXCLU
f390: 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49  SIVE.**    PENDI
f3a0: 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  NG -> EXCLUSIVE.
f3b0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
f3c0: 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63  ne will only inc
f3d0: 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55  rease a lock.  U
f3e0: 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73  se the sqlite3Os
f3f0: 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74  Unlock().** rout
f400: 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c  ine to lower a l
f410: 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f  ocking level..*/
f420: 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
f430: 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
f440: 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65  e *id, int eFile
f450: 4c 6f 63 6b 29 7b 0a 20 20 2f 2a 20 54 68 65 20  Lock){.  /* The 
f460: 66 6f 6c 6c 6f 77 69 6e 67 20 64 65 73 63 72 69  following descri
f470: 62 65 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e  bes the implemen
f480: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 76 61  tation of the va
f490: 72 69 6f 75 73 20 6c 6f 63 6b 73 20 61 6e 64 0a  rious locks and.
f4a0: 20 20 2a 2a 20 6c 6f 63 6b 20 74 72 61 6e 73 69    ** lock transi
f4b0: 74 69 6f 6e 73 20 69 6e 20 74 65 72 6d 73 20 6f  tions in terms o
f4c0: 66 20 74 68 65 20 50 4f 53 49 58 20 61 64 76 69  f the POSIX advi
f4d0: 73 6f 72 79 20 73 68 61 72 65 64 20 61 6e 64 20  sory shared and 
f4e0: 65 78 63 6c 75 73 69 76 65 0a 20 20 2a 2a 20 6c  exclusive.  ** l
f4f0: 6f 63 6b 20 70 72 69 6d 69 74 69 76 65 73 20 28  ock primitives (
f500: 63 61 6c 6c 65 64 20 72 65 61 64 2d 6c 6f 63 6b  called read-lock
f510: 73 20 61 6e 64 20 77 72 69 74 65 2d 6c 6f 63 6b  s and write-lock
f520: 73 20 62 65 6c 6f 77 2c 20 74 6f 20 61 76 6f 69  s below, to avoi
f530: 64 0a 20 20 2a 2a 20 63 6f 6e 66 75 73 69 6f 6e  d.  ** confusion
f540: 20 77 69 74 68 20 53 51 4c 69 74 65 20 6c 6f 63   with SQLite loc
f550: 6b 20 6e 61 6d 65 73 29 2e 20 54 68 65 20 61 6c  k names). The al
f560: 67 6f 72 69 74 68 6d 73 20 61 72 65 20 63 6f 6d  gorithms are com
f570: 70 6c 69 63 61 74 65 64 0a 20 20 2a 2a 20 73 6c  plicated.  ** sl
f580: 69 67 68 74 6c 79 20 69 6e 20 6f 72 64 65 72 20  ightly in order 
f590: 74 6f 20 62 65 20 63 6f 6d 70 61 74 69 62 6c 65  to be compatible
f5a0: 20 77 69 74 68 20 77 69 6e 64 6f 77 73 20 73 79   with windows sy
f5b0: 73 74 65 6d 73 20 73 69 6d 75 6c 74 61 6e 65 6f  stems simultaneo
f5c0: 75 73 6c 79 0a 20 20 2a 2a 20 61 63 63 65 73 73  usly.  ** access
f5d0: 69 6e 67 20 74 68 65 20 73 61 6d 65 20 64 61 74  ing the same dat
f5e0: 61 62 61 73 65 20 66 69 6c 65 2c 20 69 6e 20 63  abase file, in c
f5f0: 61 73 65 20 74 68 61 74 20 69 73 20 65 76 65 72  ase that is ever
f600: 20 72 65 71 75 69 72 65 64 2e 0a 20 20 2a 2a 0a   required..  **.
f610: 20 20 2a 2a 20 53 79 6d 62 6f 6c 73 20 64 65 66    ** Symbols def
f620: 69 6e 65 64 20 69 6e 20 6f 73 2e 68 20 69 6e 64  ined in os.h ind
f630: 65 6e 74 69 66 79 20 74 68 65 20 27 70 65 6e 64  entify the 'pend
f640: 69 6e 67 20 62 79 74 65 27 20 61 6e 64 20 74 68  ing byte' and th
f650: 65 20 27 72 65 73 65 72 76 65 64 0a 20 20 2a 2a  e 'reserved.  **
f660: 20 62 79 74 65 27 2c 20 65 61 63 68 20 73 69 6e   byte', each sin
f670: 67 6c 65 20 62 79 74 65 73 20 61 74 20 77 65 6c  gle bytes at wel
f680: 6c 20 6b 6e 6f 77 6e 20 6f 66 66 73 65 74 73 2c  l known offsets,
f690: 20 61 6e 64 20 74 68 65 20 27 73 68 61 72 65 64   and the 'shared
f6a0: 20 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65   byte.  ** range
f6b0: 27 2c 20 61 20 72 61 6e 67 65 20 6f 66 20 35 31  ', a range of 51
f6c0: 30 20 62 79 74 65 73 20 61 74 20 61 20 77 65 6c  0 bytes at a wel
f6d0: 6c 20 6b 6e 6f 77 6e 20 6f 66 66 73 65 74 2e 0a  l known offset..
f6e0: 20 20 2a 2a 0a 20 20 2a 2a 20 54 6f 20 6f 62 74    **.  ** To obt
f6f0: 61 69 6e 20 61 20 53 48 41 52 45 44 20 6c 6f 63  ain a SHARED loc
f700: 6b 2c 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69  k, a read-lock i
f710: 73 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68  s obtained on th
f720: 65 20 27 70 65 6e 64 69 6e 67 0a 20 20 2a 2a 20  e 'pending.  ** 
f730: 62 79 74 65 27 2e 20 20 49 66 20 74 68 69 73 20  byte'.  If this 
f740: 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 61  is successful, a
f750: 20 72 61 6e 64 6f 6d 20 62 79 74 65 20 66 72 6f   random byte fro
f760: 6d 20 74 68 65 20 27 73 68 61 72 65 64 20 62 79  m the 'shared by
f770: 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27 20 69  te.  ** range' i
f780: 73 20 72 65 61 64 2d 6c 6f 63 6b 65 64 20 61 6e  s read-locked an
f790: 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  d the lock on th
f7a0: 65 20 27 70 65 6e 64 69 6e 67 20 62 79 74 65 27  e 'pending byte'
f7b0: 20 72 65 6c 65 61 73 65 64 2e 0a 20 20 2a 2a 0a   released..  **.
f7c0: 20 20 2a 2a 20 41 20 70 72 6f 63 65 73 73 20 6d    ** A process m
f7d0: 61 79 20 6f 6e 6c 79 20 6f 62 74 61 69 6e 20 61  ay only obtain a
f7e0: 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 61   RESERVED lock a
f7f0: 66 74 65 72 20 69 74 20 68 61 73 20 61 20 53 48  fter it has a SH
f800: 41 52 45 44 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20  ARED lock..  ** 
f810: 41 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  A RESERVED lock 
f820: 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62  is implemented b
f830: 79 20 67 72 61 62 62 69 6e 67 20 61 20 77 72 69  y grabbing a wri
f840: 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20  te-lock on the. 
f850: 20 2a 2a 20 27 72 65 73 65 72 76 65 64 20 62 79   ** 'reserved by
f860: 74 65 27 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  te'. .  **.  ** 
f870: 41 20 70 72 6f 63 65 73 73 20 6d 61 79 20 6f 6e  A process may on
f880: 6c 79 20 6f 62 74 61 69 6e 20 61 20 50 45 4e 44  ly obtain a PEND
f890: 49 4e 47 20 6c 6f 63 6b 20 61 66 74 65 72 20 69  ING lock after i
f8a0: 74 20 68 61 73 20 6f 62 74 61 69 6e 65 64 20 61  t has obtained a
f8b0: 0a 20 20 2a 2a 20 53 48 41 52 45 44 20 6c 6f 63  .  ** SHARED loc
f8c0: 6b 2e 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63  k. A PENDING loc
f8d0: 6b 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64  k is implemented
f8e0: 20 62 79 20 6f 62 74 61 69 6e 69 6e 67 20 61 20   by obtaining a 
f8f0: 77 72 69 74 65 2d 6c 6f 63 6b 0a 20 20 2a 2a 20  write-lock.  ** 
f900: 6f 6e 20 74 68 65 20 27 70 65 6e 64 69 6e 67 20  on the 'pending 
f910: 62 79 74 65 27 2e 20 54 68 69 73 20 65 6e 73 75  byte'. This ensu
f920: 72 65 73 20 74 68 61 74 20 6e 6f 20 6e 65 77 20  res that no new 
f930: 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 63 61 6e  SHARED locks can
f940: 20 62 65 0a 20 20 2a 2a 20 6f 62 74 61 69 6e 65   be.  ** obtaine
f950: 64 2c 20 62 75 74 20 65 78 69 73 74 69 6e 67 20  d, but existing 
f960: 53 48 41 52 45 44 20 6c 6f 63 6b 73 20 61 72 65  SHARED locks are
f970: 20 61 6c 6c 6f 77 65 64 20 74 6f 20 70 65 72 73   allowed to pers
f980: 69 73 74 2e 20 41 20 70 72 6f 63 65 73 73 0a 20  ist. A process. 
f990: 20 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 68 61 76   ** does not hav
f9a0: 65 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 52 45  e to obtain a RE
f9b0: 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74  SERVED lock on t
f9c0: 68 65 20 77 61 79 20 74 6f 20 61 20 50 45 4e 44  he way to a PEND
f9d0: 49 4e 47 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 54  ING lock..  ** T
f9e0: 68 69 73 20 70 72 6f 70 65 72 74 79 20 69 73 20  his property is 
f9f0: 75 73 65 64 20 62 79 20 74 68 65 20 61 6c 67 6f  used by the algo
fa00: 72 69 74 68 6d 20 66 6f 72 20 72 6f 6c 6c 69 6e  rithm for rollin
fa10: 67 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c  g back a journal
fa20: 20 66 69 6c 65 0a 20 20 2a 2a 20 61 66 74 65 72   file.  ** after
fa30: 20 61 20 63 72 61 73 68 2e 0a 20 20 2a 2a 0a 20   a crash..  **. 
fa40: 20 2a 2a 20 41 6e 20 45 58 43 4c 55 53 49 56 45   ** An EXCLUSIVE
fa50: 20 6c 6f 63 6b 2c 20 6f 62 74 61 69 6e 65 64 20   lock, obtained 
fa60: 61 66 74 65 72 20 61 20 50 45 4e 44 49 4e 47 20  after a PENDING 
fa70: 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 69 73  lock is held, is
fa80: 0a 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 65  .  ** implemente
fa90: 64 20 62 79 20 6f 62 74 61 69 6e 69 6e 67 20 61  d by obtaining a
faa0: 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74   write-lock on t
fab0: 68 65 20 65 6e 74 69 72 65 20 27 73 68 61 72 65  he entire 'share
fac0: 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67  d byte.  ** rang
fad0: 65 27 2e 20 53 69 6e 63 65 20 61 6c 6c 20 6f 74  e'. Since all ot
fae0: 68 65 72 20 6c 6f 63 6b 73 20 72 65 71 75 69 72  her locks requir
faf0: 65 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e  e a read-lock on
fb00: 20 6f 6e 65 20 6f 66 20 74 68 65 20 62 79 74 65   one of the byte
fb10: 73 0a 20 20 2a 2a 20 77 69 74 68 69 6e 20 74 68  s.  ** within th
fb20: 69 73 20 72 61 6e 67 65 2c 20 74 68 69 73 20 65  is range, this e
fb30: 6e 73 75 72 65 73 20 74 68 61 74 20 6e 6f 20 6f  nsures that no o
fb40: 74 68 65 72 20 6c 6f 63 6b 73 20 61 72 65 20 68  ther locks are h
fb50: 65 6c 64 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20  eld on the.  ** 
fb60: 64 61 74 61 62 61 73 65 2e 20 0a 20 20 2a 2a 0a  database. .  **.
fb70: 20 20 2a 2a 20 54 68 65 20 72 65 61 73 6f 6e 20    ** The reason 
fb80: 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20 63 61  a single byte ca
fb90: 6e 6e 6f 74 20 62 65 20 75 73 65 64 20 69 6e 73  nnot be used ins
fba0: 74 65 61 64 20 6f 66 20 74 68 65 20 27 73 68 61  tead of the 'sha
fbb0: 72 65 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61  red byte.  ** ra
fbc0: 6e 67 65 27 20 69 73 20 74 68 61 74 20 73 6f 6d  nge' is that som
fbd0: 65 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 77 69  e versions of wi
fbe0: 6e 64 6f 77 73 20 64 6f 20 6e 6f 74 20 73 75 70  ndows do not sup
fbf0: 70 6f 72 74 20 72 65 61 64 2d 6c 6f 63 6b 73 2e  port read-locks.
fc00: 20 42 79 0a 20 20 2a 2a 20 6c 6f 63 6b 69 6e 67   By.  ** locking
fc10: 20 61 20 72 61 6e 64 6f 6d 20 62 79 74 65 20 66   a random byte f
fc20: 72 6f 6d 20 61 20 72 61 6e 67 65 2c 20 63 6f 6e  rom a range, con
fc30: 63 75 72 72 65 6e 74 20 53 48 41 52 45 44 20 6c  current SHARED l
fc40: 6f 63 6b 73 20 6d 61 79 20 65 78 69 73 74 0a 20  ocks may exist. 
fc50: 20 2a 2a 20 65 76 65 6e 20 69 66 20 74 68 65 20   ** even if the 
fc60: 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69 74 69 76  locking primitiv
fc70: 65 20 75 73 65 64 20 69 73 20 61 6c 77 61 79 73  e used is always
fc80: 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 2e 0a 20   a write-lock.. 
fc90: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
fca0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78  QLITE_OK;.  unix
fcb0: 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
fcc0: 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 75  nixFile*)id;.  u
fcd0: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49  nixInodeInfo *pI
fce0: 6e 6f 64 65 3b 0a 20 20 73 74 72 75 63 74 20 66  node;.  struct f
fcf0: 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 69 6e 74  lock lock;.  int
fd00: 20 74 45 72 72 6e 6f 20 3d 20 30 3b 0a 0a 20 20   tErrno = 0;..  
fd10: 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
fd20: 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43  .  OSTRACE(("LOC
fd30: 4b 20 20 20 20 25 64 20 25 73 20 77 61 73 20 25  K    %d %s was %
fd40: 73 28 25 73 2c 25 64 29 20 70 69 64 3d 25 64 20  s(%s,%d) pid=%d 
fd50: 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65  (unix)\n", pFile
fd60: 2d 3e 68 2c 0a 20 20 20 20 20 20 61 7a 46 69 6c  ->h,.      azFil
fd70: 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29  eLock(eFileLock)
fd80: 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 70 46 69  , azFileLock(pFi
fd90: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c 0a  le->eFileLock),.
fda0: 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b        azFileLock
fdb0: 28 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e  (pFile->pInode->
fdc0: 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 70 46 69 6c  eFileLock), pFil
fdd0: 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72  e->pInode->nShar
fde0: 65 64 2c 0a 20 20 20 20 20 20 6f 73 47 65 74 70  ed,.      osGetp
fdf0: 69 64 28 30 29 29 29 3b 0a 0a 20 20 2f 2a 20 49  id(0)));..  /* I
fe00: 66 20 74 68 65 72 65 20 69 73 20 61 6c 72 65 61  f there is alrea
fe10: 64 79 20 61 20 6c 6f 63 6b 20 6f 66 20 74 68 69  dy a lock of thi
fe20: 73 20 74 79 70 65 20 6f 72 20 6d 6f 72 65 20 72  s type or more r
fe30: 65 73 74 72 69 63 74 69 76 65 20 6f 6e 20 74 68  estrictive on th
fe40: 65 0a 20 20 2a 2a 20 75 6e 69 78 46 69 6c 65 2c  e.  ** unixFile,
fe50: 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e   do nothing. Don
fe60: 27 74 20 75 73 65 20 74 68 65 20 65 6e 64 5f 6c  't use the end_l
fe70: 6f 63 6b 3a 20 65 78 69 74 20 70 61 74 68 2c 20  ock: exit path, 
fe80: 61 73 0a 20 20 2a 2a 20 75 6e 69 78 45 6e 74 65  as.  ** unixEnte
fe90: 72 4d 75 74 65 78 28 29 20 68 61 73 6e 27 74 20  rMutex() hasn't 
fea0: 62 65 65 6e 20 63 61 6c 6c 65 64 20 79 65 74 2e  been called yet.
feb0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  .  */.  if( pFil
fec0: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 65 46  e->eFileLock>=eF
fed0: 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 4f  ileLock ){.    O
fee0: 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20  STRACE(("LOCK   
fef0: 20 25 64 20 25 73 20 6f 6b 20 28 61 6c 72 65 61   %d %s ok (alrea
ff00: 64 79 20 68 65 6c 64 29 20 28 75 6e 69 78 29 5c  dy held) (unix)\
ff10: 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20  n", pFile->h,.  
ff20: 20 20 20 20 20 20 20 20 20 20 61 7a 46 69 6c 65            azFile
ff30: 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 29  Lock(eFileLock))
ff40: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
ff50: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20  LITE_OK;.  }..  
ff60: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
ff70: 20 6c 6f 63 6b 69 6e 67 20 73 65 71 75 65 6e 63   locking sequenc
ff80: 65 20 69 73 20 63 6f 72 72 65 63 74 2e 0a 20 20  e is correct..  
ff90: 2a 2a 20 20 28 31 29 20 57 65 20 6e 65 76 65 72  **  (1) We never
ffa0: 20 6d 6f 76 65 20 66 72 6f 6d 20 75 6e 6c 6f 63   move from unloc
ffb0: 6b 65 64 20 74 6f 20 61 6e 79 74 68 69 6e 67 20  ked to anything 
ffc0: 68 69 67 68 65 72 20 74 68 61 6e 20 73 68 61 72  higher than shar
ffd0: 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28  ed lock..  **  (
ffe0: 32 29 20 53 51 4c 69 74 65 20 6e 65 76 65 72 20  2) SQLite never 
fff0: 65 78 70 6c 69 63 69 74 6c 79 20 72 65 71 75 65  explicitly reque
10000 73 74 73 20 61 20 70 65 6e 64 69 67 20 6c 6f 63  sts a pendig loc
10010 6b 2e 0a 20 20 2a 2a 20 20 28 33 29 20 41 20 73  k..  **  (3) A s
10020 68 61 72 65 64 20 6c 6f 63 6b 20 69 73 20 61 6c  hared lock is al
10030 77 61 79 73 20 68 65 6c 64 20 77 68 65 6e 20 61  ways held when a
10040 20 72 65 73 65 72 76 65 20 6c 6f 63 6b 20 69 73   reserve lock is
10050 20 72 65 71 75 65 73 74 65 64 2e 0a 20 20 2a 2f   requested..  */
10060 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
10070 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 4e 4f 5f  ->eFileLock!=NO_
10080 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63  LOCK || eFileLoc
10090 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k==SHARED_LOCK )
100a0 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c  ;.  assert( eFil
100b0 65 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e 47 5f 4c  eLock!=PENDING_L
100c0 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
100d0 20 65 46 69 6c 65 4c 6f 63 6b 21 3d 52 45 53 45   eFileLock!=RESE
100e0 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69  RVED_LOCK || pFi
100f0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  le->eFileLock==S
10100 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 0a 20  HARED_LOCK );.. 
10110 20 2f 2a 20 54 68 69 73 20 6d 75 74 65 78 20 69   /* This mutex i
10120 73 20 6e 65 65 64 65 64 20 62 65 63 61 75 73 65  s needed because
10130 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 69   pFile->pInode i
10140 73 20 73 68 61 72 65 64 20 61 63 72 6f 73 73 20  s shared across 
10150 74 68 72 65 61 64 73 0a 20 20 2a 2f 0a 20 20 75  threads.  */.  u
10160 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
10170 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c  .  pInode = pFil
10180 65 2d 3e 70 49 6e 6f 64 65 3b 0a 0a 20 20 2f 2a  e->pInode;..  /*
10190 20 49 66 20 73 6f 6d 65 20 74 68 72 65 61 64 20   If some thread 
101a0 75 73 69 6e 67 20 74 68 69 73 20 50 49 44 20 68  using this PID h
101b0 61 73 20 61 20 6c 6f 63 6b 20 76 69 61 20 61 20  as a lock via a 
101c0 64 69 66 66 65 72 65 6e 74 20 75 6e 69 78 46 69  different unixFi
101d0 6c 65 2a 0a 20 20 2a 2a 20 68 61 6e 64 6c 65 20  le*.  ** handle 
101e0 74 68 61 74 20 70 72 65 63 6c 75 64 65 73 20 74  that precludes t
101f0 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63  he requested loc
10200 6b 2c 20 72 65 74 75 72 6e 20 42 55 53 59 2e 0a  k, return BUSY..
10210 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 46 69 6c    */.  if( (pFil
10220 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 70 49  e->eFileLock!=pI
10230 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  node->eFileLock 
10240 26 26 20 0a 20 20 20 20 20 20 20 20 20 20 28 70  && .          (p
10250 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
10260 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 7c  >=PENDING_LOCK |
10270 7c 20 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52  | eFileLock>SHAR
10280 45 44 5f 4c 4f 43 4b 29 29 0a 20 20 29 7b 0a 20  ED_LOCK)).  ){. 
10290 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
102a0 55 53 59 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  USY;.    goto en
102b0 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f  d_lock;.  }..  /
102c0 2a 20 49 66 20 61 20 53 48 41 52 45 44 20 6c 6f  * If a SHARED lo
102d0 63 6b 20 69 73 20 72 65 71 75 65 73 74 65 64 2c  ck is requested,
102e0 20 61 6e 64 20 73 6f 6d 65 20 74 68 72 65 61 64   and some thread
102f0 20 75 73 69 6e 67 20 74 68 69 73 20 50 49 44 20   using this PID 
10300 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 68 61 73  already.  ** has
10310 20 61 20 53 48 41 52 45 44 20 6f 72 20 52 45 53   a SHARED or RES
10320 45 52 56 45 44 20 6c 6f 63 6b 2c 20 74 68 65 6e  ERVED lock, then
10330 20 69 6e 63 72 65 6d 65 6e 74 20 72 65 66 65 72   increment refer
10340 65 6e 63 65 20 63 6f 75 6e 74 73 20 61 6e 64 0a  ence counts and.
10350 20 20 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49    ** return SQLI
10360 54 45 5f 4f 4b 2e 0a 20 20 2a 2f 0a 20 20 69 66  TE_OK..  */.  if
10370 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41  ( eFileLock==SHA
10380 52 45 44 5f 4c 4f 43 4b 20 26 26 20 0a 20 20 20  RED_LOCK && .   
10390 20 20 20 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c     (pInode->eFil
103a0 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
103b0 43 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 65 46  CK || pInode->eF
103c0 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45  ileLock==RESERVE
103d0 44 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20 61  D_LOCK) ){.    a
103e0 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b  ssert( eFileLock
103f0 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  ==SHARED_LOCK );
10400 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69  .    assert( pFi
10410 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30  le->eFileLock==0
10420 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
10430 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e  pInode->nShared>
10440 30 20 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  0 );.    pFile->
10450 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52  eFileLock = SHAR
10460 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 49 6e  ED_LOCK;.    pIn
10470 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2b 2b 3b 0a  ode->nShared++;.
10480 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63      pInode->nLoc
10490 6b 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  k++;.    goto en
104a0 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 0a 20 20  d_lock;.  }...  
104b0 2f 2a 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63  /* A PENDING loc
104c0 6b 20 69 73 20 6e 65 65 64 65 64 20 62 65 66 6f  k is needed befo
104d0 72 65 20 61 63 71 75 69 72 69 6e 67 20 61 20 53  re acquiring a S
104e0 48 41 52 45 44 20 6c 6f 63 6b 20 61 6e 64 20 62  HARED lock and b
104f0 65 66 6f 72 65 0a 20 20 2a 2a 20 61 63 71 75 69  efore.  ** acqui
10500 72 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56  ring an EXCLUSIV
10510 45 20 6c 6f 63 6b 2e 20 20 46 6f 72 20 74 68 65  E lock.  For the
10520 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68   SHARED lock, th
10530 65 20 50 45 4e 44 49 4e 47 20 77 69 6c 6c 0a 20  e PENDING will. 
10540 20 2a 2a 20 62 65 20 72 65 6c 65 61 73 65 64 2e   ** be released.
10550 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b 2e 6c 5f 6c  .  */.  lock.l_l
10560 65 6e 20 3d 20 31 4c 3b 0a 20 20 6c 6f 63 6b 2e  en = 1L;.  lock.
10570 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f  l_whence = SEEK_
10580 53 45 54 3b 0a 20 20 69 66 28 20 65 46 69 6c 65  SET;.  if( eFile
10590 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
105a0 4b 20 0a 20 20 20 20 20 20 7c 7c 20 28 65 46 69  K .      || (eFi
105b0 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  leLock==EXCLUSIV
105c0 45 5f 4c 4f 43 4b 20 26 26 20 70 46 69 6c 65 2d  E_LOCK && pFile-
105d0 3e 65 46 69 6c 65 4c 6f 63 6b 3c 50 45 4e 44 49  >eFileLock<PENDI
105e0 4e 47 5f 4c 4f 43 4b 29 0a 20 20 29 7b 0a 20 20  NG_LOCK).  ){.  
105f0 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20    lock.l_type = 
10600 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52  (eFileLock==SHAR
10610 45 44 5f 4c 4f 43 4b 3f 46 5f 52 44 4c 43 4b 3a  ED_LOCK?F_RDLCK:
10620 46 5f 57 52 4c 43 4b 29 3b 0a 20 20 20 20 6c 6f  F_WRLCK);.    lo
10630 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50 45 4e  ck.l_start = PEN
10640 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20 20 69  DING_BYTE;.    i
10650 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28  f( unixFileLock(
10660 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 2c 20 30 29  pFile, &lock, 0)
10670 20 29 7b 0a 20 20 20 20 20 20 74 45 72 72 6e 6f   ){.      tErrno
10680 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
10690 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72  rc = sqliteError
106a0 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74  FromPosixError(t
106b0 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f  Errno, SQLITE_IO
106c0 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  ERR_LOCK);.     
106d0 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52   if( IS_LOCK_ERR
106e0 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20  OR(rc) ){.      
106f0 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f    storeLastErrno
10700 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b  (pFile, tErrno);
10710 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67  .      }.      g
10720 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20  oto end_lock;.  
10730 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 49    }.  }...  /* I
10740 66 20 63 6f 6e 74 72 6f 6c 20 67 65 74 73 20 74  f control gets t
10750 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68  o this point, th
10760 65 6e 20 61 63 74 75 61 6c 6c 79 20 67 6f 20 61  en actually go a
10770 68 65 61 64 20 61 6e 64 20 6d 61 6b 65 0a 20 20  head and make.  
10780 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73  ** operating sys
10790 74 65 6d 20 63 61 6c 6c 73 20 66 6f 72 20 74 68  tem calls for th
107a0 65 20 73 70 65 63 69 66 69 65 64 20 6c 6f 63 6b  e specified lock
107b0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 46 69  ..  */.  if( eFi
107c0 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
107d0 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72  OCK ){.    asser
107e0 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72  t( pInode->nShar
107f0 65 64 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  ed==0 );.    ass
10800 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 65 46 69  ert( pInode->eFi
10810 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20  leLock==0 );.   
10820 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
10830 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 20 20 2f  ITE_OK );..    /
10840 2a 20 4e 6f 77 20 67 65 74 20 74 68 65 20 72 65  * Now get the re
10850 61 64 2d 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c  ad-lock */.    l
10860 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48  ock.l_start = SH
10870 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20  ARED_FIRST;.    
10880 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41  lock.l_len = SHA
10890 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20 69 66  RED_SIZE;.    if
108a0 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70  ( unixFileLock(p
108b0 46 69 6c 65 2c 20 26 6c 6f 63 6b 2c 20 30 29 20  File, &lock, 0) 
108c0 29 7b 0a 20 20 20 20 20 20 74 45 72 72 6e 6f 20  ){.      tErrno 
108d0 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72  = errno;.      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 4c 4f 43 4b 29 3b 0a 20 20 20 20 7d 0a  RR_LOCK);.    }.
10920 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 74 68 65  .    /* Drop the
10930 20 74 65 6d 70 6f 72 61 72 79 20 50 45 4e 44 49   temporary PENDI
10940 4e 47 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c  NG lock */.    l
10950 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50 45  ock.l_start = PE
10960 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20 20  NDING_BYTE;.    
10970 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 4c 3b  lock.l_len = 1L;
10980 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65  .    lock.l_type
10990 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20   = F_UNLCK;.    
109a0 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b  if( unixFileLock
109b0 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 2c 20 31  (pFile, &lock, 1
109c0 30 29 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  0) && rc==SQLITE
109d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  _OK ){.      /* 
109e0 54 68 69 73 20 63 6f 75 6c 64 20 68 61 70 70 65  This could happe
109f0 6e 20 77 69 74 68 20 61 20 6e 65 74 77 6f 72 6b  n with a network
10a00 20 6d 6f 75 6e 74 20 2a 2f 0a 20 20 20 20 20 20   mount */.      
10a10 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
10a20 23 69 66 20 4f 53 4c 4f 43 4b 49 4e 47 5f 43 48  #if OSLOCKING_CH
10a30 45 43 4b 5f 42 55 53 59 5f 49 4f 45 52 52 0a 20  ECK_BUSY_IOERR. 
10a40 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
10a50 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
10a60 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49  ror(tErrno, SQLI
10a70 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29  TE_IOERR_UNLOCK)
10a80 3b 20 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 72  ; .#else.      r
10a90 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
10aa0 5f 55 4e 4c 4f 43 4b 3b 20 0a 23 65 6e 64 69 66  _UNLOCK; .#endif
10ab0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
10ac0 72 63 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  rc ){.      if( 
10ad0 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63  IS_LOCK_ERROR(rc
10ae0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74 6f  ) ){.        sto
10af0 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c  reLastErrno(pFil
10b00 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20  e, tErrno);.    
10b10 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65    }.      goto e
10b20 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 65 6c  nd_lock;.    }el
10b30 73 65 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  se{.      pFile-
10b40 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41  >eFileLock = SHA
10b50 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20  RED_LOCK;.      
10b60 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b  pInode->nLock++;
10b70 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e  .      pInode->n
10b80 53 68 61 72 65 64 20 3d 20 31 3b 0a 20 20 20 20  Shared = 1;.    
10b90 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65 46  }.  }else if( eF
10ba0 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ileLock==EXCLUSI
10bb0 56 45 5f 4c 4f 43 4b 20 26 26 20 70 49 6e 6f 64  VE_LOCK && pInod
10bc0 65 2d 3e 6e 53 68 61 72 65 64 3e 31 20 29 7b 0a  e->nShared>1 ){.
10bd0 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20 74 72      /* We are tr
10be0 79 69 6e 67 20 66 6f 72 20 61 6e 20 65 78 63 6c  ying for an excl
10bf0 75 73 69 76 65 20 6c 6f 63 6b 20 62 75 74 20 61  usive lock but a
10c00 6e 6f 74 68 65 72 20 74 68 72 65 61 64 20 69 6e  nother thread in
10c10 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 73 61 6d   this.    ** sam
10c20 65 20 70 72 6f 63 65 73 73 20 69 73 20 73 74 69  e process is sti
10c30 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 20 73 68 61  ll holding a sha
10c40 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 20  red lock. */.   
10c50 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
10c60 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  Y;.  }else{.    
10c70 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 20 77  /* The request w
10c80 61 73 20 66 6f 72 20 61 20 52 45 53 45 52 56 45  as for a RESERVE
10c90 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c  D or EXCLUSIVE l
10ca0 6f 63 6b 2e 20 20 49 74 20 69 73 0a 20 20 20 20  ock.  It is.    
10cb0 2a 2a 20 61 73 73 75 6d 65 64 20 74 68 61 74 20  ** assumed that 
10cc0 74 68 65 72 65 20 69 73 20 61 20 53 48 41 52 45  there is a SHARE
10cd0 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63  D or greater loc
10ce0 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 0a 20 20  k on the file.  
10cf0 20 20 2a 2a 20 61 6c 72 65 61 64 79 2e 0a 20 20    ** already..  
10d00 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
10d10 20 30 21 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65   0!=pFile->eFile
10d20 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 6c 6f 63 6b  Lock );.    lock
10d30 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57 52 4c 43  .l_type = F_WRLC
10d40 4b 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  K;..    assert( 
10d50 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52  eFileLock==RESER
10d60 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c  VED_LOCK || eFil
10d70 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
10d80 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 69 66 28  _LOCK );.    if(
10d90 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45   eFileLock==RESE
10da0 52 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  RVED_LOCK ){.   
10db0 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20     lock.l_start 
10dc0 3d 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 3b  = RESERVED_BYTE;
10dd0 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65  .      lock.l_le
10de0 6e 20 3d 20 31 4c 3b 0a 20 20 20 20 7d 65 6c 73  n = 1L;.    }els
10df0 65 7b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  e{.      lock.l_
10e00 73 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46  start = SHARED_F
10e10 49 52 53 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b  IRST;.      lock
10e20 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f  .l_len = SHARED_
10e30 53 49 5a 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  SIZE;.    }..   
10e40 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63   if( unixFileLoc
10e50 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 2c 20  k(pFile, &lock, 
10e60 30 29 20 29 7b 0a 20 20 20 20 20 20 74 45 72 72  0) ){.      tErr
10e70 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
10e80 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72    rc = sqliteErr
10e90 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72  orFromPosixError
10ea0 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f  (tErrno, SQLITE_
10eb0 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20  IOERR_LOCK);.   
10ec0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
10ed0 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20  E_BUSY ){.      
10ee0 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f    storeLastErrno
10ef0 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b  (pFile, tErrno);
10f00 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
10f10 20 7d 0a 20 20 0a 0a 23 69 66 64 65 66 20 53 51   }.  ..#ifdef SQ
10f20 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20  LITE_DEBUG.  /* 
10f30 53 65 74 20 75 70 20 74 68 65 20 74 72 61 6e 73  Set up the trans
10f40 61 63 74 69 6f 6e 2d 63 6f 75 6e 74 65 72 20 63  action-counter c
10f50 68 61 6e 67 65 20 63 68 65 63 6b 69 6e 67 20 66  hange checking f
10f60 6c 61 67 73 20 77 68 65 6e 0a 20 20 2a 2a 20 74  lags when.  ** t
10f70 72 61 6e 73 69 74 69 6f 6e 69 6e 67 20 66 72 6f  ransitioning fro
10f80 6d 20 61 20 53 48 41 52 45 44 20 74 6f 20 61 20  m a SHARED to a 
10f90 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2e 20 20  RESERVED lock.  
10fa0 54 68 65 20 63 68 61 6e 67 65 0a 20 20 2a 2a 20  The change.  ** 
10fb0 66 72 6f 6d 20 53 48 41 52 45 44 20 74 6f 20 52  from SHARED to R
10fc0 45 53 45 52 56 45 44 20 6d 61 72 6b 73 20 74 68  ESERVED marks th
10fd0 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61  e beginning of a
10fe0 20 6e 6f 72 6d 61 6c 0a 20 20 2a 2a 20 77 72 69   normal.  ** wri
10ff0 74 65 20 6f 70 65 72 61 74 69 6f 6e 20 28 6e 6f  te operation (no
11000 74 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20  t a hot journal 
11010 72 6f 6c 6c 62 61 63 6b 29 2e 0a 20 20 2a 2f 0a  rollback)..  */.
11020 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
11030 5f 4f 4b 0a 20 20 20 26 26 20 70 46 69 6c 65 2d  _OK.   && pFile-
11040 3e 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52  >eFileLock<=SHAR
11050 45 44 5f 4c 4f 43 4b 0a 20 20 20 26 26 20 65 46  ED_LOCK.   && eF
11060 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45  ileLock==RESERVE
11070 44 5f 4c 4f 43 4b 0a 20 20 29 7b 0a 20 20 20 20  D_LOCK.  ){.    
11080 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72  pFile->transCntr
11090 43 68 6e 67 20 3d 20 30 3b 0a 20 20 20 20 70 46  Chng = 0;.    pF
110a0 69 6c 65 2d 3e 64 62 55 70 64 61 74 65 20 3d 20  ile->dbUpdate = 
110b0 30 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 69 6e  0;.    pFile->in
110c0 4e 6f 72 6d 61 6c 57 72 69 74 65 20 3d 20 31 3b  NormalWrite = 1;
110d0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 0a 20 20  .  }.#endif...  
110e0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
110f0 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  K ){.    pFile->
11100 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c  eFileLock = eFil
11110 65 4c 6f 63 6b 3b 0a 20 20 20 20 70 49 6e 6f 64  eLock;.    pInod
11120 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65  e->eFileLock = e
11130 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 7d 65 6c 73  FileLock;.  }els
11140 65 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d  e if( eFileLock=
11150 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
11160 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46  ){.    pFile->eF
11170 69 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e 44 49 4e  ileLock = PENDIN
11180 47 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 49 6e 6f  G_LOCK;.    pIno
11190 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  de->eFileLock = 
111a0 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20  PENDING_LOCK;.  
111b0 7d 0a 0a 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 75  }..end_lock:.  u
111c0 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
111d0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43  .  OSTRACE(("LOC
111e0 4b 20 20 20 20 25 64 20 25 73 20 25 73 20 28 75  K    %d %s %s (u
111f0 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  nix)\n", pFile->
11200 68 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46  h, azFileLock(eF
11210 69 6c 65 4c 6f 63 6b 29 2c 20 0a 20 20 20 20 20  ileLock), .     
11220 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f   rc==SQLITE_OK ?
11230 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22   "ok" : "failed"
11240 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ));.  return rc;
11250 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74 68  .}../*.** Add th
11260 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
11270 72 20 75 73 65 64 20 62 79 20 66 69 6c 65 20 68  r used by file h
11280 61 6e 64 6c 65 20 70 46 69 6c 65 20 74 6f 20 74  andle pFile to t
11290 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
112a0 0a 2a 2a 20 70 55 6e 75 73 65 64 20 6c 69 73 74  .** pUnused list
112b0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
112c0 20 73 65 74 50 65 6e 64 69 6e 67 46 64 28 75 6e   setPendingFd(un
112d0 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a  ixFile *pFile){.
112e0 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20    unixInodeInfo 
112f0 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d  *pInode = pFile-
11300 3e 70 49 6e 6f 64 65 3b 0a 20 20 55 6e 69 78 55  >pInode;.  UnixU
11310 6e 75 73 65 64 46 64 20 2a 70 20 3d 20 70 46 69  nusedFd *p = pFi
11320 6c 65 2d 3e 70 55 6e 75 73 65 64 3b 0a 20 20 70  le->pUnused;.  p
11330 2d 3e 70 4e 65 78 74 20 3d 20 70 49 6e 6f 64 65  ->pNext = pInode
11340 2d 3e 70 55 6e 75 73 65 64 3b 0a 20 20 70 49 6e  ->pUnused;.  pIn
11350 6f 64 65 2d 3e 70 55 6e 75 73 65 64 20 3d 20 70  ode->pUnused = p
11360 3b 0a 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 2d  ;.  pFile->h = -
11370 31 3b 0a 20 20 70 46 69 6c 65 2d 3e 70 55 6e 75  1;.  pFile->pUnu
11380 73 65 64 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  sed = 0;.}../*.*
11390 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b  * Lower the lock
113a0 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c  ing level on fil
113b0 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69  e descriptor pFi
113c0 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e  le to eFileLock.
113d0 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d    eFileLock.** m
113e0 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f  ust be either NO
113f0 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f  _LOCK or SHARED_
11400 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  LOCK..**.** If t
11410 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
11420 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73   of the file des
11430 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61  criptor is alrea
11440 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a  dy at or below.*
11450 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  * the requested 
11460 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74  locking level, t
11470 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
11480 20 6e 6f 2d 6f 70 2e 0a 2a 2a 20 0a 2a 2a 20 49   no-op..** .** I
11490 66 20 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63  f handleNFSUnloc
114a0 6b 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  k is true, then 
114b0 6f 6e 20 64 6f 77 6e 67 72 61 64 69 6e 67 20 61  on downgrading a
114c0 6e 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  n EXCLUSIVE_LOCK
114d0 20 74 6f 20 53 48 41 52 45 44 0a 2a 2a 20 74 68   to SHARED.** th
114e0 65 20 62 79 74 65 20 72 61 6e 67 65 20 69 73 20  e byte range is 
114f0 64 69 76 69 64 65 64 20 69 6e 74 6f 20 32 20 70  divided into 2 p
11500 61 72 74 73 20 61 6e 64 20 74 68 65 20 66 69 72  arts and the fir
11510 73 74 20 70 61 72 74 20 69 73 20 75 6e 6c 6f 63  st part is unloc
11520 6b 65 64 20 74 68 65 6e 0a 2a 2a 20 73 65 74 20  ked then.** set 
11530 74 6f 20 61 20 72 65 61 64 20 6c 6f 63 6b 2c 20  to a read lock, 
11540 74 68 65 6e 20 74 68 65 20 6f 74 68 65 72 20 70  then the other p
11550 61 72 74 20 69 73 20 73 69 6d 70 6c 79 20 75 6e  art is simply un
11560 6c 6f 63 6b 65 64 2e 20 20 54 68 69 73 20 77 6f  locked.  This wo
11570 72 6b 73 20 0a 2a 2a 20 61 72 6f 75 6e 64 20 61  rks .** around a
11580 20 62 75 67 20 69 6e 20 42 53 44 20 4e 46 53 20   bug in BSD NFS 
11590 6c 6f 63 6b 64 20 28 61 6c 73 6f 20 73 65 65 6e  lockd (also seen
115a0 20 6f 6e 20 4d 61 63 4f 53 58 20 31 30 2e 33 2b   on MacOSX 10.3+
115b0 29 20 74 68 61 74 20 66 61 69 6c 73 20 74 6f 20  ) that fails to 
115c0 0a 2a 2a 20 72 65 6d 6f 76 65 20 74 68 65 20 77  .** remove the w
115d0 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 61 20 72  rite lock on a r
115e0 65 67 69 6f 6e 20 77 68 65 6e 20 61 20 72 65 61  egion when a rea
115f0 64 20 6c 6f 63 6b 20 69 73 20 73 65 74 2e 0a 2a  d lock is set..*
11600 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 6f 73  /.static int pos
11610 69 78 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33  ixUnlock(sqlite3
11620 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65  _file *id, int e
11630 46 69 6c 65 4c 6f 63 6b 2c 20 69 6e 74 20 68 61  FileLock, int ha
11640 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b 29 7b 0a  ndleNFSUnlock){.
11650 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
11660 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
11670 64 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e  d;.  unixInodeIn
11680 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a 20 20 73 74  fo *pInode;.  st
11690 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b  ruct flock lock;
116a0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
116b0 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74  TE_OK;..  assert
116c0 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54  ( pFile );.  OST
116d0 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25  RACE(("UNLOCK  %
116e0 64 20 25 64 20 77 61 73 20 25 64 28 25 64 2c 25  d %d was %d(%d,%
116f0 64 29 20 70 69 64 3d 25 64 20 28 75 6e 69 78 29  d) pid=%d (unix)
11700 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65  \n", pFile->h, e
11710 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20  FileLock,.      
11720 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
11730 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d  , pFile->pInode-
11740 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c  >eFileLock, pFil
11750 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72  e->pInode->nShar
11760 65 64 2c 0a 20 20 20 20 20 20 6f 73 47 65 74 70  ed,.      osGetp
11770 69 64 28 30 29 29 29 3b 0a 0a 20 20 61 73 73 65  id(0)));..  asse
11780 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53  rt( eFileLock<=S
11790 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
117a0 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  if( pFile->eFile
117b0 4c 6f 63 6b 3c 3d 65 46 69 6c 65 4c 6f 63 6b 20  Lock<=eFileLock 
117c0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
117d0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 75  LITE_OK;.  }.  u
117e0 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
117f0 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c  .  pInode = pFil
11800 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 73 73  e->pInode;.  ass
11810 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68  ert( pInode->nSh
11820 61 72 65 64 21 3d 30 20 29 3b 0a 20 20 69 66 28  ared!=0 );.  if(
11830 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
11840 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b  k>SHARED_LOCK ){
11850 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e  .    assert( pIn
11860 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d  ode->eFileLock==
11870 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
11880 20 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   );..#ifdef SQLI
11890 54 45 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a 20  TE_DEBUG.    /* 
118a0 57 68 65 6e 20 72 65 64 75 63 69 6e 67 20 61 20  When reducing a 
118b0 6c 6f 63 6b 20 73 75 63 68 20 74 68 61 74 20 6f  lock such that o
118c0 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 63  ther processes c
118d0 61 6e 20 73 74 61 72 74 0a 20 20 20 20 2a 2a 20  an start.    ** 
118e0 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
118f0 62 61 73 65 20 66 69 6c 65 20 61 67 61 69 6e 2c  base file again,
11900 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
11910 74 68 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73  the.    ** trans
11920 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 77  action counter w
11930 61 73 20 75 70 64 61 74 65 64 20 69 66 20 61 6e  as updated if an
11940 79 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 61  y part of the da
11950 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66 69  tabase.    ** fi
11960 6c 65 20 63 68 61 6e 67 65 64 2e 20 20 49 66 20  le changed.  If 
11970 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
11980 63 6f 75 6e 74 65 72 20 69 73 20 6e 6f 74 20 75  counter is not u
11990 70 64 61 74 65 64 2c 0a 20 20 20 20 2a 2a 20 6f  pdated,.    ** o
119a0 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  ther connections
119b0 20 74 6f 20 74 68 65 20 73 61 6d 65 20 66 69 6c   to the same fil
119c0 65 20 6d 69 67 68 74 20 6e 6f 74 20 72 65 61 6c  e might not real
119d0 69 7a 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20  ize that.    ** 
119e0 74 68 65 20 66 69 6c 65 20 68 61 73 20 63 68 61  the file has cha
119f0 6e 67 65 64 20 61 6e 64 20 68 65 6e 63 65 20 6d  nged and hence m
11a00 69 67 68 74 20 6e 6f 74 20 6b 6e 6f 77 20 74 6f  ight not know to
11a10 20 66 6c 75 73 68 20 74 68 65 69 72 0a 20 20 20   flush their.   
11a20 20 2a 2a 20 63 61 63 68 65 2e 20 20 54 68 65 20   ** cache.  The 
11a30 75 73 65 20 6f 66 20 61 20 73 74 61 6c 65 20 63  use of a stale c
11a40 61 63 68 65 20 63 61 6e 20 6c 65 61 64 20 74 6f  ache can lead to
11a50 20 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   database corrup
11a60 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tion..    */.   
11a70 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c   pFile->inNormal
11a80 57 72 69 74 65 20 3d 20 30 3b 0a 23 65 6e 64 69  Write = 0;.#endi
11a90 66 0a 0a 20 20 20 20 2f 2a 20 64 6f 77 6e 67 72  f..    /* downgr
11aa0 61 64 69 6e 67 20 74 6f 20 61 20 73 68 61 72 65  ading to a share
11ab0 64 20 6c 6f 63 6b 20 6f 6e 20 4e 46 53 20 69 6e  d lock on NFS in
11ac0 76 6f 6c 76 65 73 20 63 6c 65 61 72 69 6e 67 20  volves clearing 
11ad0 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 0a 20  the write lock. 
11ae0 20 20 20 2a 2a 20 62 65 66 6f 72 65 20 65 73 74     ** before est
11af0 61 62 6c 69 73 68 69 6e 67 20 74 68 65 20 72 65  ablishing the re
11b00 61 64 6c 6f 63 6b 20 2d 20 74 6f 20 61 76 6f 69  adlock - to avoi
11b10 64 20 61 20 72 61 63 65 20 63 6f 6e 64 69 74 69  d a race conditi
11b20 6f 6e 20 77 65 20 64 6f 77 6e 67 72 61 64 65 0a  on we downgrade.
11b30 20 20 20 20 2a 2a 20 74 68 65 20 6c 6f 63 6b 20      ** the lock 
11b40 69 6e 20 32 20 62 6c 6f 63 6b 73 2c 20 73 6f 20  in 2 blocks, so 
11b50 74 68 61 74 20 70 61 72 74 20 6f 66 20 74 68 65  that part of the
11b60 20 72 61 6e 67 65 20 77 69 6c 6c 20 62 65 20 63   range will be c
11b70 6f 76 65 72 65 64 20 62 79 20 61 20 0a 20 20 20  overed by a .   
11b80 20 2a 2a 20 77 72 69 74 65 20 6c 6f 63 6b 20 75   ** write lock u
11b90 6e 74 69 6c 20 74 68 65 20 72 65 73 74 20 69 73  ntil the rest is
11ba0 20 63 6f 76 65 72 65 64 20 62 79 20 61 20 72 65   covered by a re
11bb0 61 64 20 6c 6f 63 6b 3a 0a 20 20 20 20 2a 2a 20  ad lock:.    ** 
11bc0 20 31 3a 20 20 20 5b 57 57 57 57 57 5d 0a 20 20   1:   [WWWWW].  
11bd0 20 20 2a 2a 20 20 32 3a 20 20 20 5b 2e 2e 2e 2e    **  2:   [....
11be0 57 5d 0a 20 20 20 20 2a 2a 20 20 33 3a 20 20 20  W].    **  3:   
11bf0 5b 52 52 52 52 57 5d 0a 20 20 20 20 2a 2a 20 20  [RRRRW].    **  
11c00 34 3a 20 20 20 5b 52 52 52 52 2e 5d 0a 20 20 20  4:   [RRRR.].   
11c10 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 46 69 6c   */.    if( eFil
11c20 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
11c30 43 4b 20 29 7b 0a 23 69 66 20 21 64 65 66 69 6e  CK ){.#if !defin
11c40 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 7c 7c  ed(__APPLE__) ||
11c50 20 21 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f   !SQLITE_ENABLE_
11c60 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20  LOCKING_STYLE.  
11c70 20 20 20 20 28 76 6f 69 64 29 68 61 6e 64 6c 65      (void)handle
11c80 4e 46 53 55 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20  NFSUnlock;.     
11c90 20 61 73 73 65 72 74 28 20 68 61 6e 64 6c 65 4e   assert( handleN
11ca0 46 53 55 6e 6c 6f 63 6b 3d 3d 30 20 29 3b 0a 23  FSUnlock==0 );.#
11cb0 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65  endif.#if define
11cc0 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20  d(__APPLE__) && 
11cd0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
11ce0 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20  CKING_STYLE.    
11cf0 20 20 69 66 28 20 68 61 6e 64 6c 65 4e 46 53 55    if( handleNFSU
11d00 6e 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 20  nlock ){.       
11d10 20 69 6e 74 20 74 45 72 72 6e 6f 3b 20 20 20 20   int tErrno;    
11d20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 72             /* Er
11d30 72 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 73 79  ror code from sy
11d40 73 74 65 6d 20 63 61 6c 6c 20 65 72 72 6f 72 73  stem call errors
11d50 20 2a 2f 0a 20 20 20 20 20 20 20 20 6f 66 66 5f   */.        off_
11d60 74 20 64 69 76 53 69 7a 65 20 3d 20 53 48 41 52  t divSize = SHAR
11d70 45 44 5f 53 49 5a 45 20 2d 20 31 3b 0a 20 20 20  ED_SIZE - 1;.   
11d80 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 6c 6f       .        lo
11d90 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e  ck.l_type = F_UN
11da0 4c 43 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63  LCK;.        loc
11db0 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45  k.l_whence = SEE
11dc0 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20 20 20 6c  K_SET;.        l
11dd0 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48  ock.l_start = SH
11de0 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20  ARED_FIRST;.    
11df0 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d      lock.l_len =
11e00 20 64 69 76 53 69 7a 65 3b 0a 20 20 20 20 20 20   divSize;.      
11e10 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f    if( unixFileLo
11e20 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 2c  ck(pFile, &lock,
11e30 20 31 30 29 3d 3d 28 2d 31 29 20 29 7b 0a 20 20   10)==(-1) ){.  
11e40 20 20 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d          tErrno =
11e50 20 65 72 72 6e 6f 3b 0a 23 69 66 20 4f 53 4c 4f   errno;.#if OSLO
11e60 43 4b 49 4e 47 5f 43 48 45 43 4b 5f 42 55 53 59  CKING_CHECK_BUSY
11e70 5f 49 4f 45 52 52 0a 20 20 20 20 20 20 20 20 20  _IOERR.         
11e80 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f   rc = sqliteErro
11e90 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28  rFromPosixError(
11ea0 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49  tErrno, SQLITE_I
11eb0 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 23 65  OERR_UNLOCK);.#e
11ec0 6c 73 65 0a 20 20 20 20 20 20 20 20 20 20 72 63  lse.          rc
11ed0 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
11ee0 55 4e 4c 4f 43 4b 3b 0a 23 65 6e 64 69 66 0a 20  UNLOCK;.#endif. 
11ef0 20 20 20 20 20 20 20 20 20 69 66 28 20 49 53 5f           if( IS_
11f00 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29  LOCK_ERROR(rc) )
11f10 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 74  {.            st
11f20 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69  oreLastErrno(pFi
11f30 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20  le, tErrno);.   
11f40 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
11f50 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f     goto end_unlo
11f60 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ck;.        }.  
11f70 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70        lock.l_typ
11f80 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 20  e = F_RDLCK;.   
11f90 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e       lock.l_when
11fa0 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20  ce = SEEK_SET;. 
11fb0 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74         lock.l_st
11fc0 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52  art = SHARED_FIR
11fd0 53 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b  ST;.        lock
11fe0 2e 6c 5f 6c 65 6e 20 3d 20 64 69 76 53 69 7a 65  .l_len = divSize
11ff0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 75 6e  ;.        if( un
12000 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65  ixFileLock(pFile
12010 2c 20 26 6c 6f 63 6b 2c 20 31 30 29 3d 3d 28 2d  , &lock, 10)==(-
12020 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  1) ){.          
12030 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
12040 23 69 66 20 4f 53 4c 4f 43 4b 49 4e 47 5f 43 48  #if OSLOCKING_CH
12050 45 43 4b 5f 42 55 53 59 5f 49 4f 45 52 52 0a 20  ECK_BUSY_IOERR. 
12060 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
12070 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73  liteErrorFromPos
12080 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20  ixError(tErrno, 
12090 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c  SQLITE_IOERR_RDL
120a0 4f 43 4b 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20  OCK);.#else.    
120b0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
120c0 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a  E_IOERR_UNLOCK;.
120d0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20  #endif.         
120e0 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52   if( IS_LOCK_ERR
120f0 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20  OR(rc) ){.      
12100 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45        storeLastE
12110 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72 72  rrno(pFile, tErr
12120 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  no);.          }
12130 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
12140 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20  end_unlock;.    
12150 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6c 6f      }.        lo
12160 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e  ck.l_type = F_UN
12170 4c 43 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63  LCK;.        loc
12180 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45  k.l_whence = SEE
12190 4b 5f 53 45 54 3b 0a 20 20 20 20 20 20 20 20 6c  K_SET;.        l
121a0 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48  ock.l_start = SH
121b0 41 52 45 44 5f 46 49 52 53 54 2b 64 69 76 53 69  ARED_FIRST+divSi
121c0 7a 65 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b  ze;.        lock
121d0 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f  .l_len = SHARED_
121e0 53 49 5a 45 2d 64 69 76 53 69 7a 65 3b 0a 20 20  SIZE-divSize;.  
121f0 20 20 20 20 20 20 69 66 28 20 75 6e 69 78 46 69        if( unixFi
12200 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c  leLock(pFile, &l
12210 6f 63 6b 2c 20 31 30 29 3d 3d 28 2d 31 29 20 29  ock, 10)==(-1) )
12220 7b 0a 20 20 20 20 20 20 20 20 20 20 74 45 72 72  {.          tErr
12230 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 23 69 66 20  no = errno;.#if 
12240 4f 53 4c 4f 43 4b 49 4e 47 5f 43 48 45 43 4b 5f  OSLOCKING_CHECK_
12250 42 55 53 59 5f 49 4f 45 52 52 0a 20 20 20 20 20  BUSY_IOERR.     
12260 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
12270 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
12280 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49  ror(tErrno, SQLI
12290 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29  TE_IOERR_UNLOCK)
122a0 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 20 20  ;.#else.        
122b0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
122c0 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 23 65 6e 64  ERR_UNLOCK;.#end
122d0 69 66 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  if.          if(
122e0 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72   IS_LOCK_ERROR(r
122f0 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  c) ){.          
12300 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f    storeLastErrno
12310 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b  (pFile, tErrno);
12320 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
12330 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
12340 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20  unlock;.        
12350 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65  }.      }else.#e
12360 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28  ndif /* defined(
12370 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51  __APPLE__) && SQ
12380 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
12390 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 20 20 20  ING_STYLE */.   
123a0 20 20 20 7b 0a 20 20 20 20 20 20 20 20 6c 6f 63     {.        loc
123b0 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c  k.l_type = F_RDL
123c0 43 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b  CK;.        lock
123d0 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b  .l_whence = SEEK
123e0 5f 53 45 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f  _SET;.        lo
123f0 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41  ck.l_start = SHA
12400 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20  RED_FIRST;.     
12410 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20     lock.l_len = 
12420 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20  SHARED_SIZE;.   
12430 20 20 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c       if( unixFil
12440 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f  eLock(pFile, &lo
12450 63 6b 2c 20 31 30 29 20 29 7b 0a 20 20 20 20 20  ck, 10) ){.     
12460 20 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20       int tErrno 
12470 3d 20 65 72 72 6e 6f 3b 0a 23 69 66 20 4f 53 4c  = errno;.#if OSL
12480 4f 43 4b 49 4e 47 5f 43 48 45 43 4b 5f 42 55 53  OCKING_CHECK_BUS
12490 59 5f 49 4f 45 52 52 0a 20 20 20 20 20 20 20 20  Y_IOERR.        
124a0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72    rc = sqliteErr
124b0 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72  orFromPosixError
124c0 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f  (tErrno, SQLITE_
124d0 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 29 3b 0a 23  IOERR_RDLOCK);.#
124e0 65 6c 73 65 0a 20 20 20 20 20 20 20 20 20 20 2f  else.          /
124f0 2a 20 49 6e 20 74 68 65 6f 72 79 2c 20 74 68 65  * In theory, the
12500 20 63 61 6c 6c 20 74 6f 20 75 6e 69 78 46 69 6c   call to unixFil
12510 65 4c 6f 63 6b 28 29 20 63 61 6e 6e 6f 74 20 66  eLock() cannot f
12520 61 69 6c 20 62 65 63 61 75 73 65 20 61 6e 6f 74  ail because anot
12530 68 65 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  her.          **
12540 20 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64   process is hold
12550 69 6e 67 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69  ing an incompati
12560 62 6c 65 20 6c 6f 63 6b 2e 20 49 66 20 69 74 20  ble lock. If it 
12570 64 6f 65 73 2c 20 74 68 69 73 20 0a 20 20 20 20  does, this .    
12580 20 20 20 20 20 20 2a 2a 20 69 6e 64 69 63 61 74        ** indicat
12590 65 73 20 74 68 61 74 20 74 68 65 20 6f 74 68 65  es that the othe
125a0 72 20 70 72 6f 63 65 73 73 20 69 73 20 6e 6f 74  r process is not
125b0 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6c   following the l
125c0 6f 63 6b 69 6e 67 0a 20 20 20 20 20 20 20 20 20  ocking.         
125d0 20 2a 2a 20 70 72 6f 74 6f 63 6f 6c 2e 20 49 66   ** protocol. If
125e0 20 74 68 69 73 20 68 61 70 70 65 6e 73 2c 20 72   this happens, r
125f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
12600 52 52 5f 52 44 4c 4f 43 4b 2e 20 52 65 74 75 72  RR_RDLOCK. Retur
12610 6e 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20 2a  ning.          *
12620 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 77 6f  * SQLITE_BUSY wo
12630 75 6c 64 20 63 6f 6e 66 75 73 65 20 74 68 65 20  uld confuse the 
12640 75 70 70 65 72 20 6c 61 79 65 72 20 28 69 6e 20  upper layer (in 
12650 70 72 61 63 74 69 63 65 20 69 74 20 63 61 75 73  practice it caus
12660 65 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  es .          **
12670 20 61 6e 20 61 73 73 65 72 74 20 74 6f 20 66 61   an assert to fa
12680 69 6c 29 2e 20 2a 2f 20 0a 20 20 20 20 20 20 20  il). */ .       
12690 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
126a0 4f 45 52 52 5f 52 44 4c 4f 43 4b 3b 0a 20 20 20  OERR_RDLOCK;.   
126b0 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74         storeLast
126c0 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72  Errno(pFile, tEr
126d0 72 6e 6f 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  rno);.#endif.   
126e0 20 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f         if( IS_LO
126f0 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a  CK_ERROR(rc) ){.
12700 20 20 20 20 20 20 20 20 20 20 20 20 73 74 6f 72              stor
12710 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65  eLastErrno(pFile
12720 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20  , tErrno);.     
12730 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
12740 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b   goto end_unlock
12750 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
12760 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6c 6f    }.    }.    lo
12770 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e  ck.l_type = F_UN
12780 4c 43 4b 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f  LCK;.    lock.l_
12790 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45  whence = SEEK_SE
127a0 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74  T;.    lock.l_st
127b0 61 72 74 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59  art = PENDING_BY
127c0 54 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c  TE;.    lock.l_l
127d0 65 6e 20 3d 20 32 4c 3b 20 20 61 73 73 65 72 74  en = 2L;  assert
127e0 28 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2b 31  ( PENDING_BYTE+1
127f0 3d 3d 52 45 53 45 52 56 45 44 5f 42 59 54 45 20  ==RESERVED_BYTE 
12800 29 3b 0a 20 20 20 20 69 66 28 20 75 6e 69 78 46  );.    if( unixF
12810 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26  ileLock(pFile, &
12820 6c 6f 63 6b 2c 20 31 30 29 3d 3d 30 20 29 7b 0a  lock, 10)==0 ){.
12830 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46        pInode->eF
12840 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44  ileLock = SHARED
12850 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c 73 65  _LOCK;.    }else
12860 7b 0a 23 69 66 20 4f 53 4c 4f 43 4b 49 4e 47 5f  {.#if OSLOCKING_
12870 43 48 45 43 4b 5f 42 55 53 59 5f 49 4f 45 52 52  CHECK_BUSY_IOERR
12880 0a 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20  .      tErrno = 
12890 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20  errno;.      rc 
128a0 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  = sqliteErrorFro
128b0 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72  mPosixError(tErr
128c0 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  no, SQLITE_IOERR
128d0 5f 55 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  _UNLOCK);.      
128e0 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f  if( IS_LOCK_ERRO
128f0 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20  R(rc) ){.       
12900 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28   storeLastErrno(
12910 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a  pFile, tErrno);.
12920 20 20 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20        }.#else.  
12930 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
12940 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20  IOERR_UNLOCK;.  
12950 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72      storeLastErr
12960 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29  no(pFile, errno)
12970 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 67  ;.#endif.      g
12980 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a  oto end_unlock;.
12990 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
129a0 65 46 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f  eFileLock==NO_LO
129b0 43 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 44 65 63  CK ){.    /* Dec
129c0 72 65 6d 65 6e 74 20 74 68 65 20 73 68 61 72 65  rement the share
129d0 64 20 6c 6f 63 6b 20 63 6f 75 6e 74 65 72 2e 20  d lock counter. 
129e0 20 52 65 6c 65 61 73 65 20 74 68 65 20 6c 6f 63   Release the loc
129f0 6b 20 75 73 69 6e 67 20 61 6e 0a 20 20 20 20 2a  k using an.    *
12a00 2a 20 4f 53 20 63 61 6c 6c 20 6f 6e 6c 79 20 77  * OS call only w
12a10 68 65 6e 20 61 6c 6c 20 74 68 72 65 61 64 73 20  hen all threads 
12a20 69 6e 20 74 68 69 73 20 73 61 6d 65 20 70 72 6f  in this same pro
12a30 63 65 73 73 20 68 61 76 65 20 72 65 6c 65 61 73  cess have releas
12a40 65 64 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c 6f  ed.    ** the lo
12a50 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  ck..    */.    p
12a60 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2d 2d  Inode->nShared--
12a70 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65  ;.    if( pInode
12a80 2d 3e 6e 53 68 61 72 65 64 3d 3d 30 20 29 7b 0a  ->nShared==0 ){.
12a90 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70        lock.l_typ
12aa0 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20  e = F_UNLCK;.   
12ab0 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65     lock.l_whence
12ac0 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20   = SEEK_SET;.   
12ad0 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20     lock.l_start 
12ae0 3d 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 30  = lock.l_len = 0
12af0 4c 3b 0a 20 20 20 20 20 20 69 66 28 20 75 6e 69  L;.      if( uni
12b00 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c  xFileLock(pFile,
12b10 20 26 6c 6f 63 6b 2c 20 31 30 29 3d 3d 30 20 29   &lock, 10)==0 )
12b20 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65  {.        pInode
12b30 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f  ->eFileLock = NO
12b40 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 65 6c  _LOCK;.      }el
12b50 73 65 7b 0a 23 69 66 20 4f 53 4c 4f 43 4b 49 4e  se{.#if OSLOCKIN
12b60 47 5f 43 48 45 43 4b 5f 42 55 53 59 5f 49 4f 45  G_CHECK_BUSY_IOE
12b70 52 52 0a 20 20 20 20 20 20 20 20 74 45 72 72 6e  RR.        tErrn
12b80 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
12b90 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72     rc = sqliteEr
12ba0 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f  rorFromPosixErro
12bb0 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45  r(tErrno, SQLITE
12bc0 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a  _IOERR_UNLOCK);.
12bd0 20 20 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c          if( IS_L
12be0 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b  OCK_ERROR(rc) ){
12bf0 0a 20 20 20 20 20 20 20 20 20 20 73 74 6f 72 65  .          store
12c00 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c  LastErrno(pFile,
12c10 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20   tErrno);.      
12c20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 20 20    }.#else.      
12c30 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
12c40 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20  ERR_UNLOCK;.    
12c50 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72      storeLastErr
12c60 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29  no(pFile, errno)
12c70 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20  ;.#endif.       
12c80 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f   pInode->eFileLo
12c90 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20  ck = NO_LOCK;.  
12ca0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69        pFile->eFi
12cb0 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b  leLock = NO_LOCK
12cc0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
12cd0 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e  .    /* Decremen
12ce0 74 20 74 68 65 20 63 6f 75 6e 74 20 6f 66 20 6c  t the count of l
12cf0 6f 63 6b 73 20 61 67 61 69 6e 73 74 20 74 68 69  ocks against thi
12d00 73 20 73 61 6d 65 20 66 69 6c 65 2e 20 20 57 68  s same file.  Wh
12d10 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f  en the.    ** co
12d20 75 6e 74 20 72 65 61 63 68 65 73 20 7a 65 72 6f  unt reaches zero
12d30 2c 20 63 6c 6f 73 65 20 61 6e 79 20 6f 74 68 65  , close any othe
12d40 72 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  r file descripto
12d50 72 73 20 77 68 6f 73 65 20 63 6c 6f 73 65 0a 20  rs whose close. 
12d60 20 20 20 2a 2a 20 77 61 73 20 64 65 66 65 72 72     ** was deferr
12d70 65 64 20 62 65 63 61 75 73 65 20 6f 66 20 6f 75  ed because of ou
12d80 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 2e  tstanding locks.
12d90 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49 6e 6f  .    */.    pIno
12da0 64 65 2d 3e 6e 4c 6f 63 6b 2d 2d 3b 0a 20 20 20  de->nLock--;.   
12db0 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d   assert( pInode-
12dc0 3e 6e 4c 6f 63 6b 3e 3d 30 20 29 3b 0a 20 20 20  >nLock>=0 );.   
12dd0 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f   if( pInode->nLo
12de0 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 63  ck==0 ){.      c
12df0 6c 6f 73 65 50 65 6e 64 69 6e 67 46 64 73 28 70  losePendingFds(p
12e00 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  File);.    }.  }
12e10 0a 0a 65 6e 64 5f 75 6e 6c 6f 63 6b 3a 0a 20 20  ..end_unlock:.  
12e20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
12e30 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
12e40 54 45 5f 4f 4b 20 29 20 70 46 69 6c 65 2d 3e 65  TE_OK ) pFile->e
12e50 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65  FileLock = eFile
12e60 4c 6f 63 6b 3b 0a 20 20 72 65 74 75 72 6e 20 72  Lock;.  return r
12e70 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65  c;.}../*.** Lowe
12e80 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  r the locking le
12e90 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63  vel on file desc
12ea0 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20  riptor pFile to 
12eb0 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c  eFileLock.  eFil
12ec0 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65  eLock.** must be
12ed0 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20   either NO_LOCK 
12ee0 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a  or SHARED_LOCK..
12ef0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63  **.** If the loc
12f00 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68  king level of th
12f10 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
12f20 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20  r is already at 
12f30 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20  or below.** the 
12f40 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e  requested lockin
12f50 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f  g level, this ro
12f60 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
12f70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
12f80 75 6e 69 78 55 6e 6c 6f 63 6b 28 73 71 6c 69 74  unixUnlock(sqlit
12f90 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
12fa0 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 23 69 66   eFileLock){.#if
12fb0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
12fc0 5f 53 49 5a 45 3e 30 0a 20 20 61 73 73 65 72 74  _SIZE>0.  assert
12fd0 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41  ( eFileLock==SHA
12fe0 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 28 28 75 6e  RED_LOCK || ((un
12ff0 69 78 46 69 6c 65 20 2a 29 69 64 29 2d 3e 6e 46  ixFile *)id)->nF
13000 65 74 63 68 4f 75 74 3d 3d 30 20 29 3b 0a 23 65  etchOut==0 );.#e
13010 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 70 6f  ndif.  return po
13020 73 69 78 55 6e 6c 6f 63 6b 28 69 64 2c 20 65 46  sixUnlock(id, eF
13030 69 6c 65 4c 6f 63 6b 2c 20 30 29 3b 0a 7d 0a 0a  ileLock, 0);.}..
13040 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d  #if SQLITE_MAX_M
13050 4d 41 50 5f 53 49 5a 45 3e 30 0a 73 74 61 74 69  MAP_SIZE>0.stati
13060 63 20 69 6e 74 20 75 6e 69 78 4d 61 70 66 69 6c  c int unixMapfil
13070 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 64 2c  e(unixFile *pFd,
13080 20 69 36 34 20 6e 42 79 74 65 29 3b 0a 73 74 61   i64 nByte);.sta
13090 74 69 63 20 76 6f 69 64 20 75 6e 69 78 55 6e 6d  tic void unixUnm
130a0 61 70 66 69 6c 65 28 75 6e 69 78 46 69 6c 65 20  apfile(unixFile 
130b0 2a 70 46 64 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f  *pFd);.#endif../
130c0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
130d0 6f 6e 20 70 65 72 66 6f 72 6d 73 20 74 68 65 20  on performs the 
130e0 70 61 72 74 73 20 6f 66 20 74 68 65 20 22 63 6c  parts of the "cl
130f0 6f 73 65 20 66 69 6c 65 22 20 6f 70 65 72 61 74  ose file" operat
13100 69 6f 6e 20 0a 2a 2a 20 63 6f 6d 6d 6f 6e 20 74  ion .** common t
13110 6f 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 73 63  o all locking sc
13120 68 65 6d 65 73 2e 20 49 74 20 63 6c 6f 73 65 73  hemes. It closes
13130 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 61   the directory a
13140 6e 64 20 66 69 6c 65 0a 2a 2a 20 68 61 6e 64 6c  nd file.** handl
13150 65 73 2c 20 69 66 20 74 68 65 79 20 61 72 65 20  es, if they are 
13160 76 61 6c 69 64 2c 20 61 6e 64 20 73 65 74 73 20  valid, and sets 
13170 61 6c 6c 20 66 69 65 6c 64 73 20 6f 66 20 74 68  all fields of th
13180 65 20 75 6e 69 78 46 69 6c 65 0a 2a 2a 20 73 74  e unixFile.** st
13190 72 75 63 74 75 72 65 20 74 6f 20 30 2e 0a 2a 2a  ructure to 0..**
131a0 0a 2a 2a 20 49 74 20 69 73 20 2a 6e 6f 74 2a 20  .** It is *not* 
131b0 6e 65 63 65 73 73 61 72 79 20 74 6f 20 68 6f 6c  necessary to hol
131c0 64 20 74 68 65 20 6d 75 74 65 78 20 77 68 65 6e  d the mutex when
131d0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
131e0 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 65 76 65 6e   called,.** even
131f0 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 20 20 41 20   on VxWorks.  A 
13200 6d 75 74 65 78 20 77 69 6c 6c 20 62 65 20 61 63  mutex will be ac
13210 71 75 69 72 65 64 20 6f 6e 20 56 78 57 6f 72 6b  quired on VxWork
13220 73 20 62 79 20 74 68 65 0a 2a 2a 20 76 78 77 6f  s by the.** vxwo
13230 72 6b 73 52 65 6c 65 61 73 65 46 69 6c 65 49 64  rksReleaseFileId
13240 28 29 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73  () routine..*/.s
13250 74 61 74 69 63 20 69 6e 74 20 63 6c 6f 73 65 55  tatic int closeU
13260 6e 69 78 46 69 6c 65 28 73 71 6c 69 74 65 33 5f  nixFile(sqlite3_
13270 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 75 6e 69  file *id){.  uni
13280 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
13290 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 23 69  unixFile*)id;.#i
132a0 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  f SQLITE_MAX_MMA
132b0 50 5f 53 49 5a 45 3e 30 0a 20 20 75 6e 69 78 55  P_SIZE>0.  unixU
132c0 6e 6d 61 70 66 69 6c 65 28 70 46 69 6c 65 29 3b  nmapfile(pFile);
132d0 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 46  .#endif.  if( pF
132e0 69 6c 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20  ile->h>=0 ){.   
132f0 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 46   robust_close(pF
13300 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 5f  ile, pFile->h, _
13310 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 70 46  _LINE__);.    pF
13320 69 6c 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20 7d  ile->h = -1;.  }
13330 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
13340 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 49 64    if( pFile->pId
13350 20 29 7b 0a 20 20 20 20 69 66 28 20 70 46 69 6c   ){.    if( pFil
13360 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 55  e->ctrlFlags & U
13370 4e 49 58 46 49 4c 45 5f 44 45 4c 45 54 45 20 29  NIXFILE_DELETE )
13380 7b 0a 20 20 20 20 20 20 6f 73 55 6e 6c 69 6e 6b  {.      osUnlink
13390 28 70 46 69 6c 65 2d 3e 70 49 64 2d 3e 7a 43 61  (pFile->pId->zCa
133a0 6e 6f 6e 69 63 61 6c 4e 61 6d 65 29 3b 0a 20 20  nonicalName);.  
133b0 20 20 7d 0a 20 20 20 20 76 78 77 6f 72 6b 73 52    }.    vxworksR
133c0 65 6c 65 61 73 65 46 69 6c 65 49 64 28 70 46 69  eleaseFileId(pFi
133d0 6c 65 2d 3e 70 49 64 29 3b 0a 20 20 20 20 70 46  le->pId);.    pF
133e0 69 6c 65 2d 3e 70 49 64 20 3d 20 30 3b 0a 20 20  ile->pId = 0;.  
133f0 7d 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  }.#endif.#ifdef 
13400 53 51 4c 49 54 45 5f 55 4e 4c 49 4e 4b 5f 41 46  SQLITE_UNLINK_AF
13410 54 45 52 5f 43 4c 4f 53 45 0a 20 20 69 66 28 20  TER_CLOSE.  if( 
13420 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73  pFile->ctrlFlags
13430 20 26 20 55 4e 49 58 46 49 4c 45 5f 44 45 4c 45   & UNIXFILE_DELE
13440 54 45 20 29 7b 0a 20 20 20 20 6f 73 55 6e 6c 69  TE ){.    osUnli
13450 6e 6b 28 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29  nk(pFile->zPath)
13460 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
13470 65 65 28 2a 28 63 68 61 72 2a 2a 29 26 70 46 69  ee(*(char**)&pFi
13480 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20  le->zPath);.    
13490 70 46 69 6c 65 2d 3e 7a 50 61 74 68 20 3d 20 30  pFile->zPath = 0
134a0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 4f  ;.  }.#endif.  O
134b0 53 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20 20  STRACE(("CLOSE  
134c0 20 25 2d 33 64 5c 6e 22 2c 20 70 46 69 6c 65 2d   %-3d\n", pFile-
134d0 3e 68 29 29 3b 0a 20 20 4f 70 65 6e 43 6f 75 6e  >h));.  OpenCoun
134e0 74 65 72 28 2d 31 29 3b 0a 20 20 73 71 6c 69 74  ter(-1);.  sqlit
134f0 65 33 5f 66 72 65 65 28 70 46 69 6c 65 2d 3e 70  e3_free(pFile->p
13500 55 6e 75 73 65 64 29 3b 0a 20 20 6d 65 6d 73 65  Unused);.  memse
13510 74 28 70 46 69 6c 65 2c 20 30 2c 20 73 69 7a 65  t(pFile, 0, size
13520 6f 66 28 75 6e 69 78 46 69 6c 65 29 29 3b 0a 20  of(unixFile));. 
13530 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
13540 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  K;.}../*.** Clos
13550 65 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  e a file..*/.sta
13560 74 69 63 20 69 6e 74 20 75 6e 69 78 43 6c 6f 73  tic int unixClos
13570 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
13580 69 64 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  id){.  int rc = 
13590 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69  SQLITE_OK;.  uni
135a0 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
135b0 75 6e 69 78 46 69 6c 65 20 2a 29 69 64 3b 0a 20  unixFile *)id;. 
135c0 20 76 65 72 69 66 79 44 62 46 69 6c 65 28 70 46   verifyDbFile(pF
135d0 69 6c 65 29 3b 0a 20 20 75 6e 69 78 55 6e 6c 6f  ile);.  unixUnlo
135e0 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b  ck(id, NO_LOCK);
135f0 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  .  unixEnterMute
13600 78 28 29 3b 0a 0a 20 20 2f 2a 20 75 6e 69 78 46  x();..  /* unixF
13610 69 6c 65 2e 70 49 6e 6f 64 65 20 69 73 20 61 6c  ile.pInode is al
13620 77 61 79 73 20 76 61 6c 69 64 20 68 65 72 65 2e  ways valid here.
13630 20 4f 74 68 65 72 77 69 73 65 2c 20 61 20 64 69   Otherwise, a di
13640 66 66 65 72 65 6e 74 20 63 6c 6f 73 65 0a 20 20  fferent close.  
13650 2a 2a 20 72 6f 75 74 69 6e 65 20 28 65 2e 67 2e  ** routine (e.g.
13660 20 6e 6f 6c 6f 63 6b 43 6c 6f 73 65 28 29 29 20   nolockClose()) 
13670 77 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20  would be called 
13680 69 6e 73 74 65 61 64 2e 0a 20 20 2a 2f 0a 20 20  instead..  */.  
13690 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 70  assert( pFile->p
136a0 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e 30 20 7c  Inode->nLock>0 |
136b0 7c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d  | pFile->pInode-
136c0 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30  >bProcessLock==0
136d0 20 29 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53   );.  if( ALWAYS
136e0 28 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 29 20  (pFile->pInode) 
136f0 26 26 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  && pFile->pInode
13700 2d 3e 6e 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 2f  ->nLock ){.    /
13710 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6f  * If there are o
13720 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73  utstanding locks
13730 2c 20 64 6f 20 6e 6f 74 20 61 63 74 75 61 6c 6c  , do not actuall
13740 79 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65  y close the file
13750 20 6a 75 73 74 0a 20 20 20 20 2a 2a 20 79 65 74   just.    ** yet
13760 20 62 65 63 61 75 73 65 20 74 68 61 74 20 77 6f   because that wo
13770 75 6c 64 20 63 6c 65 61 72 20 74 68 6f 73 65 20  uld clear those 
13780 6c 6f 63 6b 73 2e 20 20 49 6e 73 74 65 61 64 2c  locks.  Instead,
13790 20 61 64 64 20 74 68 65 20 66 69 6c 65 0a 20 20   add the file.  
137a0 20 20 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20    ** descriptor 
137b0 74 6f 20 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73  to pInode->pUnus
137c0 65 64 20 6c 69 73 74 2e 20 20 49 74 20 77 69 6c  ed list.  It wil
137d0 6c 20 62 65 20 61 75 74 6f 6d 61 74 69 63 61 6c  l be automatical
137e0 6c 79 20 63 6c 6f 73 65 64 20 0a 20 20 20 20 2a  ly closed .    *
137f0 2a 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20  * when the last 
13800 6c 6f 63 6b 20 69 73 20 63 6c 65 61 72 65 64 2e  lock is cleared.
13810 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 65 74 50  .    */.    setP
13820 65 6e 64 69 6e 67 46 64 28 70 46 69 6c 65 29 3b  endingFd(pFile);
13830 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 49 6e  .  }.  releaseIn
13840 6f 64 65 49 6e 66 6f 28 70 46 69 6c 65 29 3b 0a  odeInfo(pFile);.
13850 20 20 72 63 20 3d 20 63 6c 6f 73 65 55 6e 69 78    rc = closeUnix
13860 46 69 6c 65 28 69 64 29 3b 0a 20 20 75 6e 69 78  File(id);.  unix
13870 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
13880 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
13890 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e  ************* En
138a0 64 20 6f 66 20 74 68 65 20 70 6f 73 69 78 20 61  d of the posix a
138b0 64 76 69 73 6f 72 79 20 6c 6f 63 6b 20 69 6d 70  dvisory lock imp
138c0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a  lementation ****
138d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
138e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
138f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13900 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13910 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13920 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f  ************/../
13930 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13940 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13950 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13960 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13970 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
13980 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13990 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e 6f  ************* No
139a0 2d 6f 70 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a  -op Locking ****
139b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
139c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
139d0 2a 0a 2a 2a 20 4f 66 20 74 68 65 20 76 61 72 69  *.** Of the vari
139e0 6f 75 73 20 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c  ous locking impl
139f0 65 6d 65 6e 74 61 74 69 6f 6e 73 20 61 76 61 69  ementations avai
13a00 6c 61 62 6c 65 2c 20 74 68 69 73 20 69 73 20 62  lable, this is b
13a10 79 20 66 61 72 20 74 68 65 0a 2a 2a 20 73 69 6d  y far the.** sim
13a20 70 6c 65 73 74 3a 20 20 6c 6f 63 6b 69 6e 67 20  plest:  locking 
13a30 69 73 20 69 67 6e 6f 72 65 64 2e 20 20 4e 6f 20  is ignored.  No 
13a40 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20  attempt is made 
13a50 74 6f 20 6c 6f 63 6b 20 74 68 65 20 64 61 74 61  to lock the data
13a60 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 66 6f 72  base.** file for
13a70 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74   reading or writ
13a80 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ing..**.** This 
13a90 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 69 73 20  locking mode is 
13aa0 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20  appropriate for 
13ab0 75 73 65 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79  use on read-only
13ac0 20 64 61 74 61 62 61 73 65 73 0a 2a 2a 20 28 65   databases.** (e
13ad0 78 3a 20 64 61 74 61 62 61 73 65 73 20 74 68 61  x: databases tha
13ae0 74 20 61 72 65 20 62 75 72 6e 65 64 20 69 6e 74  t are burned int
13af0 6f 20 43 44 2d 52 4f 4d 2c 20 66 6f 72 20 65 78  o CD-ROM, for ex
13b00 61 6d 70 6c 65 2e 29 20 20 49 74 20 63 61 6e 0a  ample.)  It can.
13b10 2a 2a 20 61 6c 73 6f 20 62 65 20 75 73 65 64 20  ** also be used 
13b20 69 66 20 74 68 65 20 61 70 70 6c 69 63 61 74 69  if the applicati
13b30 6f 6e 20 65 6d 70 6c 6f 79 73 20 73 6f 6d 65 20  on employs some 
13b40 65 78 74 65 72 6e 61 6c 20 6d 65 63 68 61 6e 69  external mechani
13b50 73 6d 20 74 6f 0a 2a 2a 20 70 72 65 76 65 6e 74  sm to.** prevent
13b60 20 73 69 6d 75 6c 74 61 6e 65 6f 75 73 20 61 63   simultaneous ac
13b70 63 65 73 73 20 6f 66 20 74 68 65 20 73 61 6d 65  cess of the same
13b80 20 64 61 74 61 62 61 73 65 20 62 79 20 74 77 6f   database by two
13b90 20 6f 72 20 6d 6f 72 65 0a 2a 2a 20 64 61 74 61   or more.** data
13ba0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  base connections
13bb0 2e 20 20 42 75 74 20 74 68 65 72 65 20 69 73 20  .  But there is 
13bc0 61 20 73 65 72 69 6f 75 73 20 72 69 73 6b 20 6f  a serious risk o
13bd0 66 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f  f database.** co
13be0 72 72 75 70 74 69 6f 6e 20 69 66 20 74 68 69 73  rruption if this
13bf0 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 69 73   locking mode is
13c00 20 75 73 65 64 20 69 6e 20 73 69 74 75 61 74 69   used in situati
13c10 6f 6e 73 20 77 68 65 72 65 20 6d 75 6c 74 69 70  ons where multip
13c20 6c 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63  le.** database c
13c30 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 72 65 20 61  onnections are a
13c40 63 63 65 73 73 69 6e 67 20 74 68 65 20 73 61 6d  ccessing the sam
13c50 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
13c60 61 74 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 74  at the same.** t
13c70 69 6d 65 20 61 6e 64 20 6f 6e 65 20 6f 72 20 6d  ime and one or m
13c80 6f 72 65 20 6f 66 20 74 68 6f 73 65 20 63 6f 6e  ore of those con
13c90 6e 65 63 74 69 6f 6e 73 20 61 72 65 20 77 72 69  nections are wri
13ca0 74 69 6e 67 2e 0a 2a 2f 0a 0a 73 74 61 74 69 63  ting..*/..static
13cb0 20 69 6e 74 20 6e 6f 6c 6f 63 6b 43 68 65 63 6b   int nolockCheck
13cc0 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c  ReservedLock(sql
13cd0 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73  ite3_file *NotUs
13ce0 65 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74  ed, int *pResOut
13cf0 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
13d00 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
13d10 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 30 3b 0a    *pResOut = 0;.
13d20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
13d30 4f 4b 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74  OK;.}.static int
13d40 20 6e 6f 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69   nolockLock(sqli
13d50 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65  te3_file *NotUse
13d60 64 2c 20 69 6e 74 20 4e 6f 74 55 73 65 64 32 29  d, int NotUsed2)
13d70 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
13d80 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e  ETER2(NotUsed, N
13d90 6f 74 55 73 65 64 32 29 3b 0a 20 20 72 65 74 75  otUsed2);.  retu
13da0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
13db0 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63  static int noloc
13dc0 6b 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  kUnlock(sqlite3_
13dd0 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64 2c 20 69  file *NotUsed, i
13de0 6e 74 20 4e 6f 74 55 73 65 64 32 29 7b 0a 20 20  nt NotUsed2){.  
13df0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
13e00 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73  2(NotUsed, NotUs
13e10 65 64 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  ed2);.  return S
13e20 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
13e30 2a 2a 20 43 6c 6f 73 65 20 74 68 65 20 66 69 6c  ** Close the fil
13e40 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
13e50 20 6e 6f 6c 6f 63 6b 43 6c 6f 73 65 28 73 71 6c   nolockClose(sql
13e60 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b  ite3_file *id) {
13e70 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
13e80 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c  TE_OK;.  unixFil
13e90 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
13ea0 46 69 6c 65 20 2a 29 69 64 3b 0a 20 20 75 6e 69  File *)id;.  uni
13eb0 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20  xEnterMutex();. 
13ec0 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f   if( pFile->pIno
13ed0 64 65 20 29 7b 20 20 0a 20 20 20 20 61 73 73 65  de ){  .    asse
13ee0 72 74 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  rt( pFile->pInod
13ef0 65 2d 3e 6e 4c 6f 63 6b 3e 30 20 7c 7c 20 70 46  e->nLock>0 || pF
13f00 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72  ile->pInode->bPr
13f10 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 3b 0a  ocessLock==0 );.
13f20 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70      if( pFile->p
13f30 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 20 29 7b 0a  Inode->nLock ){.
13f40 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72        /* If ther
13f50 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e  e are outstandin
13f60 67 20 6c 6f 63 6b 73 2c 20 64 6f 20 6e 6f 74 20  g locks, do not 
13f70 61 63 74 75 61 6c 6c 79 20 63 6c 6f 73 65 20 74  actually close t
13f80 68 65 20 66 69 6c 65 20 6a 75 73 74 0a 20 20 20  he file just.   
13f90 20 20 20 2a 2a 20 79 65 74 20 62 65 63 61 75 73     ** yet becaus
13fa0 65 20 74 68 61 74 20 77 6f 75 6c 64 20 63 6c 65  e that would cle
13fb0 61 72 20 74 68 6f 73 65 20 6c 6f 63 6b 73 2e 20  ar those locks. 
13fc0 20 49 6e 73 74 65 61 64 2c 20 61 64 64 20 74 68   Instead, add th
13fd0 65 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20  e file.      ** 
13fe0 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20 70 49  descriptor to pI
13ff0 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 20 6c 69  node->pUnused li
14000 73 74 2e 20 20 49 74 20 77 69 6c 6c 20 62 65 20  st.  It will be 
14010 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6c  automatically cl
14020 6f 73 65 64 20 0a 20 20 20 20 20 20 2a 2a 20 77  osed .      ** w
14030 68 65 6e 20 74 68 65 20 6c 61 73 74 20 6c 6f 63  hen the last loc
14040 6b 20 69 73 20 63 6c 65 61 72 65 64 2e 0a 20 20  k is cleared..  
14050 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 65 74      */.      set
14060 50 65 6e 64 69 6e 67 46 64 28 70 46 69 6c 65 29  PendingFd(pFile)
14070 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6c 65  ;.    }.    rele
14080 61 73 65 49 6e 6f 64 65 49 6e 66 6f 28 70 46 69  aseInodeInfo(pFi
14090 6c 65 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  le);.  }.  rc = 
140a0 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64  closeUnixFile(id
140b0 29 3b 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75  );.  unixLeaveMu
140c0 74 65 78 28 29 3b 0a 20 20 72 65 74 75 72 6e 20  tex();.  return 
140d0 72 63 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  rc;.}../********
140e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20  *********** End 
140f0 6f 66 20 74 68 65 20 6e 6f 2d 6f 70 20 6c 6f 63  of the no-op loc
14100 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  k implementation
14110 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
14120 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
14130 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14140 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14150 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14160 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14170 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  *****/../*******
14180 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14190 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
141a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
141b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
141c0 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
141d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
141e0 2a 20 42 65 67 69 6e 20 64 6f 74 2d 66 69 6c 65  * Begin dot-file
141f0 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a   Locking *******
14200 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14210 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68  *******.**.** Th
14220 65 20 64 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e  e dotfile lockin
14230 67 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  g implementation
14240 20 75 73 65 73 20 74 68 65 20 65 78 69 73 74 65   uses the existe
14250 6e 63 65 20 6f 66 20 73 65 70 61 72 61 74 65 20  nce of separate 
14260 6c 6f 63 6b 0a 2a 2a 20 66 69 6c 65 73 20 28 72  lock.** files (r
14270 65 61 6c 6c 79 20 61 20 64 69 72 65 63 74 6f 72  eally a director
14280 79 29 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 61 63  y) to control ac
14290 63 65 73 73 20 74 6f 20 74 68 65 20 64 61 74 61  cess to the data
142a0 62 61 73 65 2e 20 20 54 68 69 73 20 77 6f 72 6b  base.  This work
142b0 73 0a 2a 2a 20 6f 6e 20 6a 75 73 74 20 61 62 6f  s.** on just abo
142c0 75 74 20 65 76 65 72 79 20 66 69 6c 65 73 79 73  ut every filesys
142d0 74 65 6d 20 69 6d 61 67 69 6e 61 62 6c 65 2e 20  tem imaginable. 
142e0 20 42 75 74 20 74 68 65 72 65 20 61 72 65 20 73   But there are s
142f0 65 72 69 6f 75 73 20 64 6f 77 6e 73 69 64 65 73  erious downsides
14300 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20  :.**.**    (1)  
14310 54 68 65 72 65 20 69 73 20 7a 65 72 6f 20 63 6f  There is zero co
14320 6e 63 75 72 72 65 6e 63 79 2e 20 20 41 20 73 69  ncurrency.  A si
14330 6e 67 6c 65 20 72 65 61 64 65 72 20 62 6c 6f 63  ngle reader bloc
14340 6b 73 20 61 6c 6c 20 6f 74 68 65 72 0a 2a 2a 20  ks all other.** 
14350 20 20 20 20 20 20 20 20 63 6f 6e 6e 65 63 74 69          connecti
14360 6f 6e 73 20 66 72 6f 6d 20 72 65 61 64 69 6e 67  ons from reading
14370 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68 65 20   or writing the 
14380 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  database..**.** 
14390 20 20 20 28 32 29 20 20 41 6e 20 61 70 70 6c 69     (2)  An appli
143a0 63 61 74 69 6f 6e 20 63 72 61 73 68 20 6f 72 20  cation crash or 
143b0 70 6f 77 65 72 20 6c 6f 73 73 20 63 61 6e 20 6c  power loss can l
143c0 65 61 76 65 20 73 74 61 6c 65 20 6c 6f 63 6b 20  eave stale lock 
143d0 66 69 6c 65 73 0a 2a 2a 20 20 20 20 20 20 20 20  files.**        
143e0 20 73 69 74 74 69 6e 67 20 61 72 6f 75 6e 64 20   sitting around 
143f0 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20  that need to be 
14400 63 6c 65 61 72 65 64 20 6d 61 6e 75 61 6c 6c 79  cleared manually
14410 2e 0a 2a 2a 0a 2a 2a 20 4e 65 76 65 72 74 68 65  ..**.** Neverthe
14420 6c 65 73 73 2c 20 61 20 64 6f 74 6c 6f 63 6b 20  less, a dotlock 
14430 69 73 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74  is an appropriat
14440 65 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 66  e locking mode f
14450 6f 72 20 75 73 65 20 69 66 20 6e 6f 0a 2a 2a 20  or use if no.** 
14460 6f 74 68 65 72 20 6c 6f 63 6b 69 6e 67 20 73 74  other locking st
14470 72 61 74 65 67 79 20 69 73 20 61 76 61 69 6c 61  rategy is availa
14480 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 44 6f 74 66 69  ble..**.** Dotfi
14490 6c 65 20 6c 6f 63 6b 69 6e 67 20 77 6f 72 6b 73  le locking works
144a0 20 62 79 20 63 72 65 61 74 69 6e 67 20 61 20 73   by creating a s
144b0 75 62 64 69 72 65 63 74 6f 72 79 20 69 6e 20 74  ubdirectory in t
144c0 68 65 20 73 61 6d 65 20 64 69 72 65 63 74 6f 72  he same director
144d0 79 20 61 73 0a 2a 2a 20 74 68 65 20 64 61 74 61  y as.** the data
144e0 62 61 73 65 20 61 6e 64 20 77 69 74 68 20 74 68  base and with th
144f0 65 20 73 61 6d 65 20 6e 61 6d 65 20 62 75 74 20  e same name but 
14500 77 69 74 68 20 61 20 22 2e 6c 6f 63 6b 22 20 65  with a ".lock" e
14510 78 74 65 6e 73 69 6f 6e 20 61 64 64 65 64 2e 0a  xtension added..
14520 2a 2a 20 54 68 65 20 65 78 69 73 74 65 6e 63 65  ** The existence
14530 20 6f 66 20 61 20 6c 6f 63 6b 20 64 69 72 65 63   of a lock direc
14540 74 6f 72 79 20 69 6d 70 6c 69 65 73 20 61 6e 20  tory implies an 
14550 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20  EXCLUSIVE lock. 
14560 20 41 6c 6c 20 6f 74 68 65 72 0a 2a 2a 20 6c 6f   All other.** lo
14570 63 6b 20 74 79 70 65 73 20 28 53 48 41 52 45 44  ck types (SHARED
14580 2c 20 52 45 53 45 52 56 45 44 2c 20 50 45 4e 44  , RESERVED, PEND
14590 49 4e 47 29 20 61 72 65 20 6d 61 70 70 65 64 20  ING) are mapped 
145a0 69 6e 74 6f 20 45 58 43 4c 55 53 49 56 45 2e 0a  into EXCLUSIVE..
145b0 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69  */../*.** The fi
145c0 6c 65 20 73 75 66 66 69 78 20 61 64 64 65 64 20  le suffix added 
145d0 74 6f 20 74 68 65 20 64 61 74 61 20 62 61 73 65  to the data base
145e0 20 66 69 6c 65 6e 61 6d 65 20 69 6e 20 6f 72 64   filename in ord
145f0 65 72 20 74 6f 20 63 72 65 61 74 65 20 74 68 65  er to create the
14600 0a 2a 2a 20 6c 6f 63 6b 20 64 69 72 65 63 74 6f  .** lock directo
14610 72 79 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 44  ry..*/.#define D
14620 4f 54 4c 4f 43 4b 5f 53 55 46 46 49 58 20 22 2e  OTLOCK_SUFFIX ".
14630 6c 6f 63 6b 22 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  lock"../*.** Thi
14640 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73  s routine checks
14650 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 52   if there is a R
14660 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c  ESERVED lock hel
14670 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69  d on the specifi
14680 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68  ed.** file by th
14690 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20  is or any other 
146a0 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68  process. If such
146b0 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c   a lock is held,
146c0 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a   set *pResOut.**
146d0 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76   to a non-zero v
146e0 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a  alue otherwise *
146f0 70 52 65 73 4f 75 74 20 69 73 20 73 65 74 20 74  pResOut is set t
14700 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74  o zero.  The ret
14710 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20  urn value.** is 
14720 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b  set to SQLITE_OK
14730 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65   unless an I/O e
14740 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69  rror occurs duri
14750 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67  ng lock checking
14760 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 64 6f 74 66 69  ..**.** In dotfi
14770 6c 65 20 6c 6f 63 6b 69 6e 67 2c 20 65 69 74 68  le locking, eith
14780 65 72 20 61 20 6c 6f 63 6b 20 65 78 69 73 74 73  er a lock exists
14790 20 6f 72 20 69 74 20 64 6f 65 73 20 6e 6f 74 2e   or it does not.
147a0 20 20 53 6f 20 69 6e 20 74 68 69 73 0a 2a 2a 20    So in this.** 
147b0 76 61 72 69 61 74 69 6f 6e 20 6f 66 20 43 68 65  variation of Che
147c0 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 29  ckReservedLock()
147d0 2c 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65  , *pResOut is se
147e0 74 20 74 6f 20 74 72 75 65 20 69 66 20 61 6e 79  t to true if any
147f0 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20 68 65 6c 64   lock.** is held
14800 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 61 6e 64   on the file and
14810 20 66 61 6c 73 65 20 69 66 20 74 68 65 20 66 69   false if the fi
14820 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64 2e 0a  le is unlocked..
14830 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f  */.static int do
14840 74 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76  tlockCheckReserv
14850 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  edLock(sqlite3_f
14860 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52  ile *id, int *pR
14870 65 73 4f 75 74 29 20 7b 0a 20 20 69 6e 74 20 72  esOut) {.  int r
14880 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
14890 20 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d 20   int reserved = 
148a0 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  0;.  unixFile *p
148b0 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
148c0 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61 74  *)id;..  Simulat
148d0 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e  eIOError( return
148e0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48   SQLITE_IOERR_CH
148f0 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b  ECKRESERVEDLOCK;
14900 20 29 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28   );.  .  assert(
14910 20 70 46 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20   pFile );..  /* 
14920 43 68 65 63 6b 20 69 66 20 61 20 74 68 72 65 61  Check if a threa
14930 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73  d in this proces
14940 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c  s holds such a l
14950 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ock */.  if( pFi
14960 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48  le->eFileLock>SH
14970 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
14980 20 2f 2a 20 45 69 74 68 65 72 20 74 68 69 73 20   /* Either this 
14990 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f 72 20 73 6f  connection or so
149a0 6d 65 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74  me other connect
149b0 69 6f 6e 20 69 6e 20 74 68 65 20 73 61 6d 65 20  ion in the same 
149c0 70 72 6f 63 65 73 73 0a 20 20 20 20 2a 2a 20 68  process.    ** h
149d0 6f 6c 64 73 20 61 20 6c 6f 63 6b 20 6f 6e 20 74  olds a lock on t
149e0 68 65 20 66 69 6c 65 2e 20 20 4e 6f 20 6e 65 65  he file.  No nee
149f0 64 20 74 6f 20 63 68 65 63 6b 20 66 75 72 74 68  d to check furth
14a00 65 72 2e 20 2a 2f 0a 20 20 20 20 72 65 73 65 72  er. */.    reser
14a10 76 65 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  ved = 1;.  }else
14a20 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 63  {.    /* The loc
14a30 6b 20 69 73 20 68 65 6c 64 20 69 66 20 61 6e 64  k is held if and
14a40 20 6f 6e 6c 79 20 69 66 20 74 68 65 20 6c 6f 63   only if the loc
14a50 6b 66 69 6c 65 20 65 78 69 73 74 73 20 2a 2f 0a  kfile exists */.
14a60 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
14a70 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63 6f 6e  zLockFile = (con
14a80 73 74 20 63 68 61 72 2a 29 70 46 69 6c 65 2d 3e  st char*)pFile->
14a90 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  lockingContext;.
14aa0 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 6f      reserved = o
14ab0 73 41 63 63 65 73 73 28 7a 4c 6f 63 6b 46 69 6c  sAccess(zLockFil
14ac0 65 2c 20 30 29 3d 3d 30 3b 0a 20 20 7d 0a 20 20  e, 0)==0;.  }.  
14ad0 4f 53 54 52 41 43 45 28 28 22 54 45 53 54 20 57  OSTRACE(("TEST W
14ae0 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 20  R-LOCK %d %d %d 
14af0 28 64 6f 74 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46  (dotlock)\n", pF
14b00 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65  ile->h, rc, rese
14b10 72 76 65 64 29 29 3b 0a 20 20 2a 70 52 65 73 4f  rved));.  *pResO
14b20 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20  ut = reserved;. 
14b30 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
14b40 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69  *.** Lock the fi
14b50 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b  le with the lock
14b60 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70 61   specified by pa
14b70 72 61 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63  rameter eFileLoc
14b80 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68  k - one.** of th
14b90 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
14ba0 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 45  **     (1) SHARE
14bb0 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32  D_LOCK.**     (2
14bc0 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a  ) RESERVED_LOCK.
14bd0 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49  **     (3) PENDI
14be0 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  NG_LOCK.**     (
14bf0 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  4) EXCLUSIVE_LOC
14c00 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65  K.**.** Sometime
14c10 73 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e  s when requestin
14c20 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65  g one lock state
14c30 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63  , additional loc
14c40 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20  k states.** are 
14c50 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 77  inserted in betw
14c60 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e  een.  The lockin
14c70 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20  g might fail on 
14c80 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72  one of the later
14c90 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  .** transitions 
14ca0 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b  leaving the lock
14cb0 20 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74   state different
14cc0 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74   from what it st
14cd0 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69  arted but.** sti
14ce0 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20  ll short of its 
14cf0 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  goal.  The follo
14d00 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73  wing chart shows
14d10 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20   the allowed.** 
14d20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20  transitions and 
14d30 74 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74  the inserted int
14d40 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 73  ermediate states
14d50 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43  :.**.**    UNLOC
14d60 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a  KED -> SHARED.**
14d70 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45      SHARED -> RE
14d80 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41  SERVED.**    SHA
14d90 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  RED -> (PENDING)
14da0 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
14db0 20 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20      RESERVED -> 
14dc0 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43  (PENDING) -> EXC
14dd0 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e  LUSIVE.**    PEN
14de0 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56  DING -> EXCLUSIV
14df0 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  E.**.** This rou
14e00 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69  tine will only i
14e10 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20  ncrease a lock. 
14e20 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33   Use the sqlite3
14e30 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f  OsUnlock().** ro
14e40 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61  utine to lower a
14e50 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a   locking level..
14e60 2a 2a 0a 2a 2a 20 57 69 74 68 20 64 6f 74 66 69  **.** With dotfi
14e70 6c 65 20 6c 6f 63 6b 69 6e 67 2c 20 77 65 20 72  le locking, we r
14e80 65 61 6c 6c 79 20 6f 6e 6c 79 20 73 75 70 70 6f  eally only suppo
14e90 72 74 20 73 74 61 74 65 20 28 34 29 3a 20 45 58  rt state (4): EX
14ea0 43 4c 55 53 49 56 45 2e 0a 2a 2a 20 42 75 74 20  CLUSIVE..** But 
14eb0 77 65 20 74 72 61 63 6b 20 74 68 65 20 6f 74 68  we track the oth
14ec0 65 72 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  er locking level
14ed0 73 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 2a 2f  s internally..*/
14ee0 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f 74 6c  .static int dotl
14ef0 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  ockLock(sqlite3_
14f00 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46  file *id, int eF
14f10 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69  ileLock) {.  uni
14f20 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
14f30 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
14f40 63 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20  char *zLockFile 
14f50 3d 20 28 63 68 61 72 20 2a 29 70 46 69 6c 65 2d  = (char *)pFile-
14f60 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  >lockingContext;
14f70 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
14f80 54 45 5f 4f 4b 3b 0a 0a 0a 20 20 2f 2a 20 49 66  TE_OK;...  /* If
14f90 20 77 65 20 68 61 76 65 20 61 6e 79 20 6c 6f 63   we have any loc
14fa0 6b 2c 20 74 68 65 6e 20 74 68 65 20 6c 6f 63 6b  k, then the lock
14fb0 20 66 69 6c 65 20 61 6c 72 65 61 64 79 20 65 78   file already ex
14fc0 69 73 74 73 2e 20 20 41 6c 6c 20 77 65 20 68 61  ists.  All we ha
14fd0 76 65 0a 20 20 2a 2a 20 74 6f 20 64 6f 20 69 73  ve.  ** to do is
14fe0 20 61 64 6a 75 73 74 20 6f 75 72 20 69 6e 74 65   adjust our inte
14ff0 72 6e 61 6c 20 72 65 63 6f 72 64 20 6f 66 20 74  rnal record of t
15000 68 65 20 6c 6f 63 6b 20 6c 65 76 65 6c 2e 0a 20  he lock level.. 
15010 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   */.  if( pFile-
15020 3e 65 46 69 6c 65 4c 6f 63 6b 20 3e 20 4e 4f 5f  >eFileLock > NO_
15030 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c  LOCK ){.    pFil
15040 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65  e->eFileLock = e
15050 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 2f 2a  FileLock;.    /*
15060 20 41 6c 77 61 79 73 20 75 70 64 61 74 65 20 74   Always update t
15070 68 65 20 74 69 6d 65 73 74 61 6d 70 20 6f 6e 20  he timestamp on 
15080 74 68 65 20 6f 6c 64 20 66 69 6c 65 20 2a 2f 0a  the old file */.
15090 23 69 66 64 65 66 20 48 41 56 45 5f 55 54 49 4d  #ifdef HAVE_UTIM
150a0 45 0a 20 20 20 20 75 74 69 6d 65 28 7a 4c 6f 63  E.    utime(zLoc
150b0 6b 46 69 6c 65 2c 20 4e 55 4c 4c 29 3b 0a 23 65  kFile, NULL);.#e
150c0 6c 73 65 0a 20 20 20 20 75 74 69 6d 65 73 28 7a  lse.    utimes(z
150d0 4c 6f 63 6b 46 69 6c 65 2c 20 4e 55 4c 4c 29 3b  LockFile, NULL);
150e0 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75  .#endif.    retu
150f0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
15100 7d 0a 20 20 0a 20 20 2f 2a 20 67 72 61 62 20 61  }.  .  /* grab a
15110 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
15120 20 2a 2f 0a 20 20 72 63 20 3d 20 6f 73 4d 6b 64   */.  rc = osMkd
15130 69 72 28 7a 4c 6f 63 6b 46 69 6c 65 2c 20 30 37  ir(zLockFile, 07
15140 37 37 29 3b 0a 20 20 69 66 28 20 72 63 3c 30 20  77);.  if( rc<0 
15150 29 7b 0a 20 20 20 20 2f 2a 20 66 61 69 6c 65 64  ){.    /* failed
15160 20 74 6f 20 6f 70 65 6e 2f 63 72 65 61 74 65 20   to open/create 
15170 74 68 65 20 6c 6f 63 6b 20 64 69 72 65 63 74 6f  the lock directo
15180 72 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 74 45  ry */.    int tE
15190 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
151a0 20 20 69 66 28 20 45 45 58 49 53 54 20 3d 3d 20    if( EEXIST == 
151b0 74 45 72 72 6e 6f 20 29 7b 0a 20 20 20 20 20 20  tErrno ){.      
151c0 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
151d0 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20  ;.    } else {. 
151e0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
151f0 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
15200 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49  ror(tErrno, SQLI
15210 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a  TE_IOERR_LOCK);.
15220 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43        if( IS_LOC
15230 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20  K_ERROR(rc) ){. 
15240 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74         storeLast
15250 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72  Errno(pFile, tEr
15260 72 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rno);.      }.  
15270 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72    }.    return r
15280 63 3b 0a 20 20 7d 20 0a 20 20 0a 20 20 2f 2a 20  c;.  } .  .  /* 
15290 67 6f 74 20 69 74 2c 20 73 65 74 20 74 68 65 20  got it, set the 
152a0 74 79 70 65 20 61 6e 64 20 72 65 74 75 72 6e 20  type and return 
152b0 6f 6b 20 2a 2f 0a 20 20 70 46 69 6c 65 2d 3e 65  ok */.  pFile->e
152c0 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65  FileLock = eFile
152d0 4c 6f 63 6b 3b 0a 20 20 72 65 74 75 72 6e 20 72  Lock;.  return r
152e0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65  c;.}../*.** Lowe
152f0 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  r the locking le
15300 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63  vel on file desc
15310 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20  riptor pFile to 
15320 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c  eFileLock.  eFil
15330 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65  eLock.** must be
15340 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20   either NO_LOCK 
15350 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a  or SHARED_LOCK..
15360 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63  **.** If the loc
15370 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68  king level of th
15380 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
15390 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20  r is already at 
153a0 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20  or below.** the 
153b0 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e  requested lockin
153c0 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f  g level, this ro
153d0 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
153e0 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 65  ..**.** When the
153f0 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 72   locking level r
15400 65 61 63 68 65 73 20 4e 4f 5f 4c 4f 43 4b 2c 20  eaches NO_LOCK, 
15410 64 65 6c 65 74 65 20 74 68 65 20 6c 6f 63 6b 20  delete the lock 
15420 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
15430 69 6e 74 20 64 6f 74 6c 6f 63 6b 55 6e 6c 6f 63  int dotlockUnloc
15440 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
15450 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63  id, int eFileLoc
15460 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  k) {.  unixFile 
15470 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
15480 6c 65 2a 29 69 64 3b 0a 20 20 63 68 61 72 20 2a  le*)id;.  char *
15490 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63 68 61  zLockFile = (cha
154a0 72 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69  r *)pFile->locki
154b0 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 69 6e 74  ngContext;.  int
154c0 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
154d0 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41  pFile );.  OSTRA
154e0 43 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20  CE(("UNLOCK  %d 
154f0 25 64 20 77 61 73 20 25 64 20 70 69 64 3d 25 64  %d was %d pid=%d
15500 20 28 64 6f 74 6c 6f 63 6b 29 5c 6e 22 2c 20 70   (dotlock)\n", p
15510 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f  File->h, eFileLo
15520 63 6b 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  ck,.           p
15530 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c  File->eFileLock,
15540 20 6f 73 47 65 74 70 69 64 28 30 29 29 29 3b 0a   osGetpid(0)));.
15550 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c    assert( eFileL
15560 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock<=SHARED_LOCK
15570 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f   );.  .  /* no-o
15580 70 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f  p if possible */
15590 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46  .  if( pFile->eF
155a0 69 6c 65 4c 6f 63 6b 3d 3d 65 46 69 6c 65 4c 6f  ileLock==eFileLo
155b0 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ck ){.    return
155c0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
155d0 0a 20 20 2f 2a 20 54 6f 20 64 6f 77 6e 67 72 61  .  /* To downgra
155e0 64 65 20 74 6f 20 73 68 61 72 65 64 2c 20 73 69  de to shared, si
155f0 6d 70 6c 79 20 75 70 64 61 74 65 20 6f 75 72 20  mply update our 
15600 69 6e 74 65 72 6e 61 6c 20 6e 6f 74 69 6f 6e 20  internal notion 
15610 6f 66 20 74 68 65 0a 20 20 2a 2a 20 6c 6f 63 6b  of the.  ** lock
15620 20 73 74 61 74 65 2e 20 20 4e 6f 20 6e 65 65 64   state.  No need
15630 20 74 6f 20 6d 65 73 73 20 77 69 74 68 20 74 68   to mess with th
15640 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 0a  e file on disk..
15650 20 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65    */.  if( eFile
15660 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
15670 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  K ){.    pFile->
15680 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52  eFileLock = SHAR
15690 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 72 65 74  ED_LOCK;.    ret
156a0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
156b0 20 7d 0a 20 20 0a 20 20 2f 2a 20 54 6f 20 66 75   }.  .  /* To fu
156c0 6c 6c 79 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64  lly unlock the d
156d0 61 74 61 62 61 73 65 2c 20 64 65 6c 65 74 65 20  atabase, delete 
156e0 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f  the lock file */
156f0 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65  .  assert( eFile
15700 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 3b  Lock==NO_LOCK );
15710 0a 20 20 72 63 20 3d 20 6f 73 52 6d 64 69 72 28  .  rc = osRmdir(
15720 7a 4c 6f 63 6b 46 69 6c 65 29 3b 0a 20 20 69 66  zLockFile);.  if
15730 28 20 72 63 3c 30 20 26 26 20 65 72 72 6e 6f 3d  ( rc<0 && errno=
15740 3d 45 4e 4f 54 44 49 52 20 29 20 72 63 20 3d 20  =ENOTDIR ) rc = 
15750 6f 73 55 6e 6c 69 6e 6b 28 7a 4c 6f 63 6b 46 69  osUnlink(zLockFi
15760 6c 65 29 3b 0a 20 20 69 66 28 20 72 63 3c 30 20  le);.  if( rc<0 
15770 29 7b 0a 20 20 20 20 69 6e 74 20 74 45 72 72 6e  ){.    int tErrn
15780 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 72  o = errno;.    r
15790 63 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 45  c = 0;.    if( E
157a0 4e 4f 45 4e 54 20 21 3d 20 74 45 72 72 6e 6f 20  NOENT != tErrno 
157b0 29 7b 0a 23 69 66 20 4f 53 4c 4f 43 4b 49 4e 47  ){.#if OSLOCKING
157c0 5f 43 48 45 43 4b 5f 42 55 53 59 5f 49 4f 45 52  _CHECK_BUSY_IOER
157d0 52 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  R.      rc = sql
157e0 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69  iteErrorFromPosi
157f0 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53  xError(tErrno, S
15800 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
15810 43 4b 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20  CK);.#else.     
15820 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
15830 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 23 65 6e 64 69  RR_UNLOCK;.#endi
15840 66 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  f.    }.    if( 
15850 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63  IS_LOCK_ERROR(rc
15860 29 20 29 7b 0a 20 20 20 20 20 20 73 74 6f 72 65  ) ){.      store
15870 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c  LastErrno(pFile,
15880 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 7d 0a   tErrno);.    }.
15890 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 20 0a      return rc; .
158a0 20 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 65 46 69    }.  pFile->eFi
158b0 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b  leLock = NO_LOCK
158c0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
158d0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
158e0 6c 6f 73 65 20 61 20 66 69 6c 65 2e 20 20 4d 61  lose a file.  Ma
158f0 6b 65 20 73 75 72 65 20 74 68 65 20 6c 6f 63 6b  ke sure the lock
15900 20 68 61 73 20 62 65 65 6e 20 72 65 6c 65 61 73   has been releas
15910 65 64 20 62 65 66 6f 72 65 20 63 6c 6f 73 69 6e  ed before closin
15920 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
15930 20 64 6f 74 6c 6f 63 6b 43 6c 6f 73 65 28 73 71   dotlockClose(sq
15940 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20  lite3_file *id) 
15950 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
15960 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 69 64  ITE_OK;.  if( id
15970 20 29 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65   ){.    unixFile
15980 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
15990 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20 64 6f 74  ile*)id;.    dot
159a0 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e  lockUnlock(id, N
159b0 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 73 71 6c  O_LOCK);.    sql
159c0 69 74 65 33 5f 66 72 65 65 28 70 46 69 6c 65 2d  ite3_free(pFile-
159d0 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29  >lockingContext)
159e0 3b 0a 20 20 20 20 72 63 20 3d 20 63 6c 6f 73 65  ;.    rc = close
159f0 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 20 20  UnixFile(id);.  
15a00 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
15a10 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
15a20 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20  **** End of the 
15a30 64 6f 74 2d 66 69 6c 65 20 6c 6f 63 6b 20 69 6d  dot-file lock im
15a40 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a  plementation ***
15a50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15a60 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
15a70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15a80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15a90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15aa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
15ab0 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
15ac0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15ad0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15ae0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15af0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15b00 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
15b10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67  ************ Beg
15b20 69 6e 20 66 6c 6f 63 6b 20 4c 6f 63 6b 69 6e 67  in flock Locking
15b30 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
15b40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15b50 2a 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20  *.**.** Use the 
15b60 66 6c 6f 63 6b 28 29 20 73 79 73 74 65 6d 20 63  flock() system c
15b70 61 6c 6c 20 74 6f 20 64 6f 20 66 69 6c 65 20 6c  all to do file l
15b80 6f 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 66 6c  ocking..**.** fl
15b90 6f 63 6b 28 29 20 6c 6f 63 6b 69 6e 67 20 69 73  ock() locking is
15ba0 20 6c 69 6b 65 20 64 6f 74 2d 66 69 6c 65 20 6c   like dot-file l
15bb0 6f 63 6b 69 6e 67 20 69 6e 20 74 68 61 74 20 74  ocking in that t
15bc0 68 65 20 76 61 72 69 6f 75 73 0a 2a 2a 20 66 69  he various.** fi
15bd0 6e 65 2d 67 72 61 69 6e 20 6c 6f 63 6b 69 6e 67  ne-grain locking
15be0 20 6c 65 76 65 6c 73 20 73 75 70 70 6f 72 74 65   levels supporte
15bf0 64 20 62 79 20 53 51 4c 69 74 65 20 61 72 65 20  d by SQLite are 
15c00 63 6f 6c 6c 61 70 73 65 64 20 69 6e 74 6f 0a 2a  collapsed into.*
15c10 2a 20 61 20 73 69 6e 67 6c 65 20 65 78 63 6c 75  * a single exclu
15c20 73 69 76 65 20 6c 6f 63 6b 2e 20 20 49 6e 20 6f  sive lock.  In o
15c30 74 68 65 72 20 77 6f 72 64 73 2c 20 53 48 41 52  ther words, SHAR
15c40 45 44 2c 20 52 45 53 45 52 56 45 44 2c 20 61 6e  ED, RESERVED, an
15c50 64 0a 2a 2a 20 50 45 4e 44 49 4e 47 20 6c 6f 63  d.** PENDING loc
15c60 6b 73 20 61 72 65 20 74 68 65 20 73 61 6d 65 20  ks are the same 
15c70 74 68 69 6e 67 20 61 73 20 61 6e 20 45 58 43 4c  thing as an EXCL
15c80 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 53 51 4c  USIVE lock.  SQL
15c90 69 74 65 0a 2a 2a 20 73 74 69 6c 6c 20 77 6f 72  ite.** still wor
15ca0 6b 73 20 77 68 65 6e 20 79 6f 75 20 64 6f 20 74  ks when you do t
15cb0 68 69 73 2c 20 62 75 74 20 63 6f 6e 63 75 72 72  his, but concurr
15cc0 65 6e 63 79 20 69 73 20 72 65 64 75 63 65 64 20  ency is reduced 
15cd0 73 69 6e 63 65 0a 2a 2a 20 6f 6e 6c 79 20 61 20  since.** only a 
15ce0 73 69 6e 67 6c 65 20 70 72 6f 63 65 73 73 20 63  single process c
15cf0 61 6e 20 62 65 20 72 65 61 64 69 6e 67 20 74 68  an be reading th
15d00 65 20 64 61 74 61 62 61 73 65 20 61 74 20 61 20  e database at a 
15d10 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 4f 6d 69 74  time..**.** Omit
15d20 20 74 68 69 73 20 73 65 63 74 69 6f 6e 20 69 66   this section if
15d30 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
15d40 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 69 73 20  OCKING_STYLE is 
15d50 74 75 72 6e 65 64 20 6f 66 66 0a 2a 2f 0a 23 69  turned off.*/.#i
15d60 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
15d70 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 0a 2f  LOCKING_STYLE../
15d80 2a 0a 2a 2a 20 52 65 74 72 79 20 66 6c 6f 63 6b  *.** Retry flock
15d90 28 29 20 63 61 6c 6c 73 20 74 68 61 74 20 66 61  () calls that fa
15da0 69 6c 20 77 69 74 68 20 45 49 4e 54 52 0a 2a 2f  il with EINTR.*/
15db0 0a 23 69 66 64 65 66 20 45 49 4e 54 52 0a 73 74  .#ifdef EINTR.st
15dc0 61 74 69 63 20 69 6e 74 20 72 6f 62 75 73 74 5f  atic int robust_
15dd0 66 6c 6f 63 6b 28 69 6e 74 20 66 64 2c 20 69 6e  flock(int fd, in
15de0 74 20 6f 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b  t op){.  int rc;
15df0 0a 20 20 64 6f 7b 20 72 63 20 3d 20 66 6c 6f 63  .  do{ rc = floc
15e00 6b 28 66 64 2c 6f 70 29 3b 20 7d 77 68 69 6c 65  k(fd,op); }while
15e10 28 20 72 63 3c 30 20 26 26 20 65 72 72 6e 6f 3d  ( rc<0 && errno=
15e20 3d 45 49 4e 54 52 20 29 3b 0a 20 20 72 65 74 75  =EINTR );.  retu
15e30 72 6e 20 72 63 3b 0a 7d 0a 23 65 6c 73 65 0a 23  rn rc;.}.#else.#
15e40 20 64 65 66 69 6e 65 20 72 6f 62 75 73 74 5f 66   define robust_f
15e50 6c 6f 63 6b 28 61 2c 62 29 20 66 6c 6f 63 6b 28  lock(a,b) flock(
15e60 61 2c 62 29 0a 23 65 6e 64 69 66 0a 20 20 20 20  a,b).#endif.    
15e70 20 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f   ../*.** This ro
15e80 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20  utine checks if 
15e90 74 68 65 72 65 20 69 73 20 61 20 52 45 53 45 52  there is a RESER
15ea0 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e  VED lock held on
15eb0 20 74 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a   the specified.*
15ec0 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f  * file by this o
15ed0 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63  r any other proc
15ee0 65 73 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c  ess. If such a l
15ef0 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 73 65 74  ock is held, set
15f00 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20   *pResOut.** to 
15f10 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65  a non-zero value
15f20 20 6f 74 68 65 72 77 69 73 65 20 2a 70 52 65 73   otherwise *pRes
15f30 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65  Out is set to ze
15f40 72 6f 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20  ro.  The return 
15f50 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20  value.** is set 
15f60 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c  to SQLITE_OK unl
15f70 65 73 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72  ess an I/O error
15f80 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 6c   occurs during l
15f90 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f  ock checking..*/
15fa0 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c 6f 63  .static int floc
15fb0 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  kCheckReservedLo
15fc0 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
15fd0 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75  *id, int *pResOu
15fe0 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
15ff0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
16000 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20  reserved = 0;.  
16010 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
16020 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
16030 0a 20 20 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f  .  .  SimulateIO
16040 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51  Error( return SQ
16050 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b  LITE_IOERR_CHECK
16060 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b  RESERVEDLOCK; );
16070 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 70 46  .  .  assert( pF
16080 69 6c 65 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 43  ile );.  .  /* C
16090 68 65 63 6b 20 69 66 20 61 20 74 68 72 65 61 64  heck if a thread
160a0 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73   in this process
160b0 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c 6f   holds such a lo
160c0 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  ck */.  if( pFil
160d0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41  e->eFileLock>SHA
160e0 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RED_LOCK ){.    
160f0 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20  reserved = 1;.  
16100 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74 68 65 72 77  }.  .  /* Otherw
16110 69 73 65 20 73 65 65 20 69 66 20 73 6f 6d 65 20  ise see if some 
16120 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 68 6f  other process ho
16130 6c 64 73 20 69 74 2e 20 2a 2f 0a 20 20 69 66 28  lds it. */.  if(
16140 20 21 72 65 73 65 72 76 65 64 20 29 7b 0a 20 20   !reserved ){.  
16150 20 20 2f 2a 20 61 74 74 65 6d 70 74 20 74 6f 20    /* attempt to 
16160 67 65 74 20 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a  get the lock */.
16170 20 20 20 20 69 6e 74 20 6c 72 63 20 3d 20 72 6f      int lrc = ro
16180 62 75 73 74 5f 66 6c 6f 63 6b 28 70 46 69 6c 65  bust_flock(pFile
16190 2d 3e 68 2c 20 4c 4f 43 4b 5f 45 58 20 7c 20 4c  ->h, LOCK_EX | L
161a0 4f 43 4b 5f 4e 42 29 3b 0a 20 20 20 20 69 66 28  OCK_NB);.    if(
161b0 20 21 6c 72 63 20 29 7b 0a 20 20 20 20 20 20 2f   !lrc ){.      /
161c0 2a 20 67 6f 74 20 74 68 65 20 6c 6f 63 6b 2c 20  * got the lock, 
161d0 75 6e 6c 6f 63 6b 20 69 74 20 2a 2f 0a 20 20 20  unlock it */.   
161e0 20 20 20 6c 72 63 20 3d 20 72 6f 62 75 73 74 5f     lrc = robust_
161f0 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20  flock(pFile->h, 
16200 4c 4f 43 4b 5f 55 4e 29 3b 0a 20 20 20 20 20 20  LOCK_UN);.      
16210 69 66 20 28 20 6c 72 63 20 29 20 7b 0a 20 20 20  if ( lrc ) {.   
16220 20 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20       int tErrno 
16230 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20  = errno;.       
16240 20 2f 2a 20 75 6e 6c 6f 63 6b 20 66 61 69 6c 65   /* unlock faile
16250 64 20 77 69 74 68 20 61 6e 20 65 72 72 6f 72 20  d with an error 
16260 2a 2f 0a 23 69 66 20 4f 53 4c 4f 43 4b 49 4e 47  */.#if OSLOCKING
16270 5f 43 48 45 43 4b 5f 42 55 53 59 5f 49 4f 45 52  _CHECK_BUSY_IOER
16280 52 0a 20 20 20 20 20 20 20 20 6c 72 63 20 3d 20  R.        lrc = 
16290 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
162a0 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
162b0 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  , SQLITE_IOERR_U
162c0 4e 4c 4f 43 4b 29 3b 0a 23 65 6c 73 65 20 0a 20  NLOCK);.#else . 
162d0 20 20 20 20 20 20 20 6c 72 63 20 3d 20 53 51 4c         lrc = SQL
162e0 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
162f0 3b 20 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  ; .#endif.      
16300 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52    if( IS_LOCK_ER
16310 52 4f 52 28 6c 72 63 29 20 29 7b 0a 20 20 20 20  ROR(lrc) ){.    
16320 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45        storeLastE
16330 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72 72  rrno(pFile, tErr
16340 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  no);.          r
16350 63 20 3d 20 6c 72 63 3b 0a 20 20 20 20 20 20 20  c = lrc;.       
16360 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
16370 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 69 6e   else {.      in
16380 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  t tErrno = errno
16390 3b 0a 20 20 20 20 20 20 72 65 73 65 72 76 65 64  ;.      reserved
163a0 20 3d 20 31 3b 0a 20 20 20 20 20 20 2f 2a 20 73   = 1;.      /* s
163b0 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 6d 69 67 68  omeone else migh
163c0 74 20 68 61 76 65 20 69 74 20 72 65 73 65 72 76  t have it reserv
163d0 65 64 20 2a 2f 0a 20 20 20 20 20 20 6c 72 63 20  ed */.      lrc 
163e0 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  = sqliteErrorFro
163f0 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72  mPosixError(tErr
16400 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  no, SQLITE_IOERR
16410 5f 4c 4f 43 4b 29 3b 20 0a 20 20 20 20 20 20 69  _LOCK); .      i
16420 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
16430 28 6c 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20  (lrc) ){.       
16440 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28   storeLastErrno(
16450 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a  pFile, tErrno);.
16460 20 20 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63          rc = lrc
16470 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
16480 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22    }.  OSTRACE(("
16490 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20  TEST WR-LOCK %d 
164a0 25 64 20 25 64 20 28 66 6c 6f 63 6b 29 5c 6e 22  %d %d (flock)\n"
164b0 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20  , pFile->h, rc, 
164c0 72 65 73 65 72 76 65 64 29 29 3b 0a 0a 23 69 66  reserved));..#if
164d0 64 65 66 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52  def SQLITE_IGNOR
164e0 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52  E_FLOCK_LOCK_ERR
164f0 4f 52 53 0a 20 20 69 66 28 20 28 72 63 20 26 20  ORS.  if( (rc & 
16500 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 20 3d 3d  SQLITE_IOERR) ==
16510 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b   SQLITE_IOERR ){
16520 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
16530 5f 4f 4b 3b 0a 20 20 20 20 72 65 73 65 72 76 65  _OK;.    reserve
16540 64 3d 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20  d=1;.  }.#endif 
16550 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45  /* SQLITE_IGNORE
16560 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f  _FLOCK_LOCK_ERRO
16570 52 53 20 2a 2f 0a 20 20 2a 70 52 65 73 4f 75 74  RS */.  *pResOut
16580 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20 20 72   = reserved;.  r
16590 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
165a0 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65  ** Lock the file
165b0 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73   with the lock s
165c0 70 65 63 69 66 69 65 64 20 62 79 20 70 61 72 61  pecified by para
165d0 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20  meter eFileLock 
165e0 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20  - one.** of the 
165f0 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a  following:.**.**
16600 20 20 20 20 20 28 31 29 20 53 48 41 52 45 44 5f       (1) SHARED_
16610 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20  LOCK.**     (2) 
16620 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a  RESERVED_LOCK.**
16630 20 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47       (3) PENDING
16640 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29  _LOCK.**     (4)
16650 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a   EXCLUSIVE_LOCK.
16660 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20  **.** Sometimes 
16670 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20  when requesting 
16680 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20  one lock state, 
16690 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20  additional lock 
166a0 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e  states.** are in
166b0 73 65 72 74 65 64 20 69 6e 20 62 65 74 77 65 65  serted in betwee
166c0 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20  n.  The locking 
166d0 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e  might fail on on
166e0 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a  e of the later.*
166f0 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65  * transitions le
16700 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73  aving the lock s
16710 74 61 74 65 20 64 69 66 66 65 72 65 6e 74 20 66  tate different f
16720 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61 72  rom what it star
16730 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c  ted but.** still
16740 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f   short of its go
16750 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  al.  The followi
16760 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73 20 74  ng chart shows t
16770 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72  he allowed.** tr
16780 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68  ansitions and th
16790 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72  e inserted inter
167a0 6d 65 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a  mediate states:.
167b0 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45  **.**    UNLOCKE
167c0 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20  D -> SHARED.**  
167d0 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45    SHARED -> RESE
167e0 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45  RVED.**    SHARE
167f0 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d  D -> (PENDING) -
16800 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  > EXCLUSIVE.**  
16810 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50    RESERVED -> (P
16820 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55  ENDING) -> EXCLU
16830 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49  SIVE.**    PENDI
16840 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  NG -> EXCLUSIVE.
16850 2a 2a 0a 2a 2a 20 66 6c 6f 63 6b 28 29 20 6f 6e  **.** flock() on
16860 6c 79 20 72 65 61 6c 6c 79 20 73 75 70 70 6f 72  ly really suppor
16870 74 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  t EXCLUSIVE lock
16880 73 2e 20 20 57 65 20 74 72 61 63 6b 20 69 6e 74  s.  We track int
16890 65 72 6d 65 64 69 61 74 65 0a 2a 2a 20 6c 6f 63  ermediate.** loc
168a0 6b 20 73 74 61 74 65 73 20 69 6e 20 74 68 65 20  k states in the 
168b0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 73 74 72  sqlite3_file str
168c0 75 63 74 75 72 65 2c 20 62 75 74 20 61 6c 6c 20  ucture, but all 
168d0 6c 6f 63 6b 73 20 53 48 41 52 45 44 20 6f 72 0a  locks SHARED or.
168e0 2a 2a 20 61 62 6f 76 65 20 61 72 65 20 72 65 61  ** above are rea
168f0 6c 6c 79 20 45 58 43 4c 55 53 49 56 45 20 6c 6f  lly EXCLUSIVE lo
16900 63 6b 73 20 61 6e 64 20 65 78 63 6c 75 64 65 20  cks and exclude 
16910 61 6c 6c 20 6f 74 68 65 72 20 70 72 6f 63 65 73  all other proces
16920 73 65 73 20 66 72 6f 6d 0a 2a 2a 20 61 63 63 65  ses from.** acce
16930 73 73 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a  ss the file..**.
16940 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
16950 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61  will only increa
16960 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20  se a lock.  Use 
16970 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c  the sqlite3OsUnl
16980 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65  ock().** routine
16990 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b   to lower a lock
169a0 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74  ing level..*/.st
169b0 61 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b 4c 6f  atic int flockLo
169c0 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
169d0 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f  *id, int eFileLo
169e0 63 6b 29 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ck) {.  int rc =
169f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e   SQLITE_OK;.  un
16a00 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
16a10 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a  (unixFile*)id;..
16a20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
16a30 29 3b 0a 0a 20 20 2f 2a 20 69 66 20 77 65 20 61  );..  /* if we a
16a40 6c 72 65 61 64 79 20 68 61 76 65 20 61 20 6c 6f  lready have a lo
16a50 63 6b 2c 20 69 74 20 69 73 20 65 78 63 6c 75 73  ck, it is exclus
16a60 69 76 65 2e 20 20 0a 20 20 2a 2a 20 4a 75 73 74  ive.  .  ** Just
16a70 20 61 64 6a 75 73 74 20 6c 65 76 65 6c 20 61 6e   adjust level an
16a80 64 20 70 75 6e 74 20 6f 6e 20 6f 75 74 74 61 20  d punt on outta 
16a90 68 65 72 65 2e 20 2a 2f 0a 20 20 69 66 20 28 70  here. */.  if (p
16aa0 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
16ab0 3e 20 4e 4f 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20  > NO_LOCK) {.   
16ac0 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
16ad0 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20  k = eFileLock;. 
16ae0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
16af0 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  _OK;.  }.  .  /*
16b00 20 67 72 61 62 20 61 6e 20 65 78 63 6c 75 73 69   grab an exclusi
16b10 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 0a 20 20  ve lock */.  .  
16b20 69 66 20 28 72 6f 62 75 73 74 5f 66 6c 6f 63 6b  if (robust_flock
16b30 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f  (pFile->h, LOCK_
16b40 45 58 20 7c 20 4c 4f 43 4b 5f 4e 42 29 29 20 7b  EX | LOCK_NB)) {
16b50 0a 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20  .    int tErrno 
16b60 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 2f 2a 20  = errno;.    /* 
16b70 64 69 64 6e 27 74 20 67 65 74 2c 20 6d 75 73 74  didn't get, must
16b80 20 62 65 20 62 75 73 79 20 2a 2f 0a 20 20 20 20   be busy */.    
16b90 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72  rc = sqliteError
16ba0 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74  FromPosixError(t
16bb0 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f  Errno, SQLITE_IO
16bc0 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69  ERR_LOCK);.    i
16bd0 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
16be0 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 73 74  (rc) ){.      st
16bf0 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69  oreLastErrno(pFi
16c00 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20  le, tErrno);.   
16c10 20 7d 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20   }.  } else {.  
16c20 20 20 2f 2a 20 67 6f 74 20 69 74 2c 20 73 65 74    /* got it, set
16c30 20 74 68 65 20 74 79 70 65 20 61 6e 64 20 72 65   the type and re
16c40 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20 20 20 70  turn ok */.    p
16c50 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
16c60 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 7d  = eFileLock;.  }
16c70 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43  .  OSTRACE(("LOC
16c80 4b 20 20 20 20 25 64 20 25 73 20 25 73 20 28 66  K    %d %s %s (f
16c90 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  lock)\n", pFile-
16ca0 3e 68 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65  >h, azFileLock(e
16cb0 46 69 6c 65 4c 6f 63 6b 29 2c 20 0a 20 20 20 20  FileLock), .    
16cc0 20 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54         rc==SQLIT
16cd0 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66  E_OK ? "ok" : "f
16ce0 61 69 6c 65 64 22 29 29 3b 0a 23 69 66 64 65 66  ailed"));.#ifdef
16cf0 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46   SQLITE_IGNORE_F
16d00 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53  LOCK_LOCK_ERRORS
16d10 0a 20 20 69 66 28 20 28 72 63 20 26 20 53 51 4c  .  if( (rc & SQL
16d20 49 54 45 5f 49 4f 45 52 52 29 20 3d 3d 20 53 51  ITE_IOERR) == SQ
16d30 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20  LITE_IOERR ){.  
16d40 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
16d50 53 59 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f  SY;.  }.#endif /
16d60 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f  * SQLITE_IGNORE_
16d70 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52  FLOCK_LOCK_ERROR
16d80 53 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72 63  S */.  return rc
16d90 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65  ;.}.../*.** Lowe
16da0 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  r the locking le
16db0 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63  vel on file desc
16dc0 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20  riptor pFile to 
16dd0 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c  eFileLock.  eFil
16de0 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65  eLock.** must be
16df0 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20   either NO_LOCK 
16e00 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a  or SHARED_LOCK..
16e10 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63  **.** If the loc
16e20 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68  king level of th
16e30 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
16e40 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20  r is already at 
16e50 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20  or below.** the 
16e60 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e  requested lockin
16e70 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f  g level, this ro
16e80 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
16e90 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
16ea0 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 73 71 6c 69  flockUnlock(sqli
16eb0 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
16ec0 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20  t eFileLock) {. 
16ed0 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
16ee0 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
16ef0 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 70  ;.  .  assert( p
16f00 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43  File );.  OSTRAC
16f10 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25  E(("UNLOCK  %d %
16f20 64 20 77 61 73 20 25 64 20 70 69 64 3d 25 64 20  d was %d pid=%d 
16f30 28 66 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c  (flock)\n", pFil
16f40 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c  e->h, eFileLock,
16f50 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c  .           pFil
16f60 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 6f 73  e->eFileLock, os
16f70 47 65 74 70 69 64 28 30 29 29 29 3b 0a 20 20 61  Getpid(0)));.  a
16f80 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b  ssert( eFileLock
16f90 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  <=SHARED_LOCK );
16fa0 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f 70 20 69  .  .  /* no-op i
16fb0 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 20 20  f possible */.  
16fc0 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  if( pFile->eFile
16fd0 4c 6f 63 6b 3d 3d 65 46 69 6c 65 4c 6f 63 6b 20  Lock==eFileLock 
16fe0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
16ff0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a  LITE_OK;.  }.  .
17000 20 20 2f 2a 20 73 68 61 72 65 64 20 63 61 6e 20    /* shared can 
17010 6a 75 73 74 20 62 65 20 73 65 74 20 62 65 63 61  just be set beca
17020 75 73 65 20 77 65 20 61 6c 77 61 79 73 20 68 61  use we always ha
17030 76 65 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  ve an exclusive 
17040 2a 2f 0a 20 20 69 66 20 28 65 46 69 6c 65 4c 6f  */.  if (eFileLo
17050 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 29  ck==SHARED_LOCK)
17060 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46   {.    pFile->eF
17070 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c  ileLock = eFileL
17080 6f 63 6b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ock;.    return 
17090 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
170a0 20 0a 20 20 2f 2a 20 6e 6f 2c 20 72 65 61 6c 6c   .  /* no, reall
170b0 79 2c 20 75 6e 6c 6f 63 6b 2e 20 2a 2f 0a 20 20  y, unlock. */.  
170c0 69 66 28 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b  if( robust_flock
170d0 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f  (pFile->h, LOCK_
170e0 55 4e 29 20 29 7b 0a 23 69 66 64 65 66 20 53 51  UN) ){.#ifdef SQ
170f0 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43  LITE_IGNORE_FLOC
17100 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20 20  K_LOCK_ERRORS.  
17110 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
17120 4f 4b 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  OK;.#endif /* SQ
17130 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43  LITE_IGNORE_FLOC
17140 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 20 2a 2f  K_LOCK_ERRORS */
17150 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
17160 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b  TE_IOERR_UNLOCK;
17170 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46  .  }else{.    pF
17180 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
17190 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 72 65   NO_LOCK;.    re
171a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
171b0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f    }.}../*.** Clo
171c0 73 65 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74  se a file..*/.st
171d0 61 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b 43 6c  atic int flockCl
171e0 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ose(sqlite3_file
171f0 20 2a 69 64 29 20 7b 0a 20 20 69 6e 74 20 72 63   *id) {.  int rc
17200 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
17210 69 66 28 20 69 64 20 29 7b 0a 20 20 20 20 66 6c  if( id ){.    fl
17220 6f 63 6b 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f  ockUnlock(id, NO
17230 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 72 63 20 3d  _LOCK);.    rc =
17240 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69   closeUnixFile(i
17250 64 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  d);.  }.  return
17260 20 72 63 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f   rc;.}..#endif /
17270 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  * SQLITE_ENABLE_
17280 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26  LOCKING_STYLE &&
17290 20 21 4f 53 5f 56 58 57 4f 52 4b 20 2a 2f 0a 0a   !OS_VXWORK */..
172a0 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
172b0 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20  **** End of the 
172c0 66 6c 6f 63 6b 20 6c 6f 63 6b 20 69 6d 70 6c 65  flock lock imple
172d0 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a  mentation ******
172e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
172f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17300 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17310 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17320 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17330 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
17340 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
17350 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17360 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17370 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17380 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17390 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
173a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20  ********* Begin 
173b0 4e 61 6d 65 64 20 53 65 6d 61 70 68 6f 72 65 20  Named Semaphore 
173c0 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a  Locking ********
173d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
173e0 0a 2a 2a 0a 2a 2a 20 4e 61 6d 65 64 20 73 65 6d  .**.** Named sem
173f0 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 69  aphore locking i
17400 73 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 65 64  s only supported
17410 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a 0a   on VxWorks..**.
17420 2a 2a 20 53 65 6d 61 70 68 6f 72 65 20 6c 6f 63  ** Semaphore loc
17430 6b 69 6e 67 20 69 73 20 6c 69 6b 65 20 64 6f 74  king is like dot
17440 2d 6c 6f 63 6b 20 61 6e 64 20 66 6c 6f 63 6b 20  -lock and flock 
17450 69 6e 20 74 68 61 74 20 69 74 20 72 65 61 6c 6c  in that it reall
17460 79 20 6f 6e 6c 79 0a 2a 2a 20 73 75 70 70 6f 72  y only.** suppor
17470 74 73 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  ts EXCLUSIVE loc
17480 6b 69 6e 67 2e 20 20 4f 6e 6c 79 20 61 20 73 69  king.  Only a si
17490 6e 67 6c 65 20 70 72 6f 63 65 73 73 20 63 61 6e  ngle process can
174a0 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 0a 2a   read or write.*
174b0 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
174c0 69 6c 65 20 61 74 20 61 20 74 69 6d 65 2e 20 20  ile at a time.  
174d0 54 68 69 73 20 72 65 64 75 63 65 73 20 70 6f 74  This reduces pot
174e0 65 6e 74 69 61 6c 20 63 6f 6e 63 75 72 72 65 6e  ential concurren
174f0 63 79 2c 20 62 75 74 0a 2a 2a 20 6d 61 6b 65 73  cy, but.** makes
17500 20 74 68 65 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d   the lock implem
17510 65 6e 74 61 74 69 6f 6e 20 6d 75 63 68 20 65 61  entation much ea
17520 73 69 65 72 2e 0a 2a 2f 0a 23 69 66 20 4f 53 5f  sier..*/.#if OS_
17530 56 58 57 4f 52 4b 53 0a 0a 2f 2a 0a 2a 2a 20 54  VXWORKS../*.** T
17540 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63  his routine chec
17550 6b 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61  ks if there is a
17560 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68   RESERVED lock h
17570 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69  eld on the speci
17580 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20  fied.** file by 
17590 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65  this or any othe
175a0 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75  r process. If su
175b0 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c  ch a lock is hel
175c0 64 2c 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a  d, set *pResOut.
175d0 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f  ** to a non-zero
175e0 20 76 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65   value otherwise
175f0 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65 74   *pResOut is set
17600 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72   to zero.  The r
17610 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69  eturn value.** i
17620 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f  s set to SQLITE_
17630 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f  OK unless an I/O
17640 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75   error occurs du
17650 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69  ring lock checki
17660 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
17670 74 20 73 65 6d 58 43 68 65 63 6b 52 65 73 65 72  t semXCheckReser
17680 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  vedLock(sqlite3_
17690 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70  file *id, int *p
176a0 52 65 73 4f 75 74 29 20 7b 0a 20 20 69 6e 74 20  ResOut) {.  int 
176b0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
176c0 20 20 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d    int reserved =
176d0 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a   0;.  unixFile *
176e0 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
176f0 65 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61  e*)id;..  Simula
17700 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72  teIOError( retur
17710 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43  n SQLITE_IOERR_C
17720 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b  HECKRESERVEDLOCK
17730 3b 20 29 3b 0a 20 20 0a 20 20 61 73 73 65 72 74  ; );.  .  assert
17740 28 20 70 46 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a  ( pFile );..  /*
17750 20 43 68 65 63 6b 20 69 66 20 61 20 74 68 72 65   Check if a thre
17760 61 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65  ad in this proce
17770 73 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20  ss holds such a 
17780 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46  lock */.  if( pF
17790 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53  ile->eFileLock>S
177a0 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  HARED_LOCK ){.  
177b0 20 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a    reserved = 1;.
177c0 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74 68 65    }.  .  /* Othe
177d0 72 77 69 73 65 20 73 65 65 20 69 66 20 73 6f 6d  rwise see if som
177e0 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  e other process 
177f0 68 6f 6c 64 73 20 69 74 2e 20 2a 2f 0a 20 20 69  holds it. */.  i
17800 66 28 20 21 72 65 73 65 72 76 65 64 20 29 7b 0a  f( !reserved ){.
17810 20 20 20 20 73 65 6d 5f 74 20 2a 70 53 65 6d 20      sem_t *pSem 
17820 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d  = pFile->pInode-
17830 3e 70 53 65 6d 3b 0a 0a 20 20 20 20 69 66 28 20  >pSem;..    if( 
17840 73 65 6d 5f 74 72 79 77 61 69 74 28 70 53 65 6d  sem_trywait(pSem
17850 29 3d 3d 2d 31 20 29 7b 0a 20 20 20 20 20 20 69  )==-1 ){.      i
17860 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  nt tErrno = errn
17870 6f 3b 0a 20 20 20 20 20 20 69 66 28 20 45 41 47  o;.      if( EAG
17880 41 49 4e 20 21 3d 20 74 45 72 72 6e 6f 20 29 7b  AIN != tErrno ){
17890 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
178a0 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73  liteErrorFromPos
178b0 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20  ixError(tErrno, 
178c0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45  SQLITE_IOERR_CHE
178d0 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 29 3b  CKRESERVEDLOCK);
178e0 0a 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61  .        storeLa
178f0 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74  stErrno(pFile, t
17900 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 20  Errno);.      } 
17910 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 2f  else {.        /
17920 2a 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 68  * someone else h
17930 61 73 20 74 68 65 20 6c 6f 63 6b 20 77 68 65 6e  as the lock when
17940 20 77 65 20 61 72 65 20 69 6e 20 4e 4f 5f 4c 4f   we are in NO_LO
17950 43 4b 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65  CK */.        re
17960 73 65 72 76 65 64 20 3d 20 28 70 46 69 6c 65 2d  served = (pFile-
17970 3e 65 46 69 6c 65 4c 6f 63 6b 20 3c 20 53 48 41  >eFileLock < SHA
17980 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  RED_LOCK);.     
17990 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
179a0 20 20 20 20 2f 2a 20 77 65 20 63 6f 75 6c 64 20      /* we could 
179b0 68 61 76 65 20 69 74 20 69 66 20 77 65 20 77 61  have it if we wa
179c0 6e 74 20 69 74 20 2a 2f 0a 20 20 20 20 20 20 73  nt it */.      s
179d0 65 6d 5f 70 6f 73 74 28 70 53 65 6d 29 3b 0a 20  em_post(pSem);. 
179e0 20 20 20 7d 0a 20 20 7d 0a 20 20 4f 53 54 52 41     }.  }.  OSTRA
179f0 43 45 28 28 22 54 45 53 54 20 57 52 2d 4c 4f 43  CE(("TEST WR-LOC
17a00 4b 20 25 64 20 25 64 20 25 64 20 28 73 65 6d 29  K %d %d %d (sem)
17a10 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72  \n", pFile->h, r
17a20 63 2c 20 72 65 73 65 72 76 65 64 29 29 3b 0a 0a  c, reserved));..
17a30 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73    *pResOut = res
17a40 65 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20  erved;.  return 
17a50 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63  rc;.}../*.** Loc
17a60 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74 68 20  k the file with 
17a70 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69  the lock specifi
17a80 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20  ed by parameter 
17a90 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a  eFileLock - one.
17aa0 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ** of the follow
17ab0 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28  ing:.**.**     (
17ac0 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a  1) SHARED_LOCK.*
17ad0 2a 20 20 20 20 20 28 32 29 20 52 45 53 45 52 56  *     (2) RESERV
17ae0 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  ED_LOCK.**     (
17af0 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a  3) PENDING_LOCK.
17b00 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c 55  **     (4) EXCLU
17b10 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20  SIVE_LOCK.**.** 
17b20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72  Sometimes when r
17b30 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f  equesting one lo
17b40 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74 69  ck state, additi
17b50 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73  onal lock states
17b60 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64  .** are inserted
17b70 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68   in between.  Th
17b80 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20  e locking might 
17b90 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74  fail on one of t
17ba0 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e  he later.** tran
17bb0 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20  sitions leaving 
17bc0 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64  the lock state d
17bd0 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68  ifferent from wh
17be0 61 74 20 69 74 20 73 74 61 72 74 65 64 20 62 75  at it started bu
17bf0 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74  t.** still short
17c00 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54   of its goal.  T
17c10 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61  he following cha
17c20 72 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c  rt shows the all
17c30 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69  owed.** transiti
17c40 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65  ons and the inse
17c50 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74  rted intermediat
17c60 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20  e states:.**.** 
17c70 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53     UNLOCKED -> S
17c80 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52  HARED.**    SHAR
17c90 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a  ED -> RESERVED.*
17ca0 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28  *    SHARED -> (
17cb0 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c  PENDING) -> EXCL
17cc0 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45  USIVE.**    RESE
17cd0 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47  RVED -> (PENDING
17ce0 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  ) -> EXCLUSIVE.*
17cf0 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20  *    PENDING -> 
17d00 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20  EXCLUSIVE.**.** 
17d10 53 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 73 20  Semaphore locks 
17d20 6f 6e 6c 79 20 72 65 61 6c 6c 79 20 73 75 70 70  only really supp
17d30 6f 72 74 20 45 58 43 4c 55 53 49 56 45 20 6c 6f  ort EXCLUSIVE lo
17d40 63 6b 73 2e 20 20 57 65 20 74 72 61 63 6b 20 69  cks.  We track i
17d50 6e 74 65 72 6d 65 64 69 61 74 65 0a 2a 2a 20 6c  ntermediate.** l
17d60 6f 63 6b 20 73 74 61 74 65 73 20 69 6e 20 74 68  ock states in th
17d70 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 73  e sqlite3_file s
17d80 74 72 75 63 74 75 72 65 2c 20 62 75 74 20 61 6c  tructure, but al
17d90 6c 20 6c 6f 63 6b 73 20 53 48 41 52 45 44 20 6f  l locks SHARED o
17da0 72 0a 2a 2a 20 61 62 6f 76 65 20 61 72 65 20 72  r.** above are r
17db0 65 61 6c 6c 79 20 45 58 43 4c 55 53 49 56 45 20  eally EXCLUSIVE 
17dc0 6c 6f 63 6b 73 20 61 6e 64 20 65 78 63 6c 75 64  locks and exclud
17dd0 65 20 61 6c 6c 20 6f 74 68 65 72 20 70 72 6f 63  e all other proc
17de0 65 73 73 65 73 20 66 72 6f 6d 0a 2a 2a 20 61 63  esses from.** ac
17df0 63 65 73 73 20 74 68 65 20 66 69 6c 65 2e 0a 2a  cess the file..*
17e00 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
17e10 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72  e will only incr
17e20 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73  ease a lock.  Us
17e30 65 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55  e the sqlite3OsU
17e40 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69  nlock().** routi
17e50 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f  ne to lower a lo
17e60 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a  cking level..*/.
17e70 73 74 61 74 69 63 20 69 6e 74 20 73 65 6d 58 4c  static int semXL
17e80 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
17e90 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c   *id, int eFileL
17ea0 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c  ock) {.  unixFil
17eb0 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
17ec0 46 69 6c 65 2a 29 69 64 3b 0a 20 20 73 65 6d 5f  File*)id;.  sem_
17ed0 74 20 2a 70 53 65 6d 20 3d 20 70 46 69 6c 65 2d  t *pSem = pFile-
17ee0 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 3b 0a 20  >pInode->pSem;. 
17ef0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
17f00 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 69 66 20 77 65  _OK;..  /* if we
17f10 20 61 6c 72 65 61 64 79 20 68 61 76 65 20 61 20   already have a 
17f20 6c 6f 63 6b 2c 20 69 74 20 69 73 20 65 78 63 6c  lock, it is excl
17f30 75 73 69 76 65 2e 20 20 0a 20 20 2a 2a 20 4a 75  usive.  .  ** Ju
17f40 73 74 20 61 64 6a 75 73 74 20 6c 65 76 65 6c 20  st adjust level 
17f50 61 6e 64 20 70 75 6e 74 20 6f 6e 20 6f 75 74 74  and punt on outt
17f60 61 20 68 65 72 65 2e 20 2a 2f 0a 20 20 69 66 20  a here. */.  if 
17f70 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63  (pFile->eFileLoc
17f80 6b 20 3e 20 4e 4f 5f 4c 4f 43 4b 29 20 7b 0a 20  k > NO_LOCK) {. 
17f90 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
17fa0 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b  ock = eFileLock;
17fb0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
17fc0 5f 4f 4b 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65  _OK;.    goto se
17fd0 6d 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a  m_end_lock;.  }.
17fe0 20 20 0a 20 20 2f 2a 20 6c 6f 63 6b 20 73 65 6d    .  /* lock sem
17ff0 61 70 68 6f 72 65 20 6e 6f 77 20 62 75 74 20 62  aphore now but b
18000 61 69 6c 20 6f 75 74 20 77 68 65 6e 20 61 6c 72  ail out when alr
18010 65 61 64 79 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a  eady locked. */.
18020 20 20 69 66 28 20 73 65 6d 5f 74 72 79 77 61 69    if( sem_trywai
18030 74 28 70 53 65 6d 29 3d 3d 2d 31 20 29 7b 0a 20  t(pSem)==-1 ){. 
18040 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
18050 55 53 59 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65  USY;.    goto se
18060 6d 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a  m_end_lock;.  }.
18070 0a 20 20 2f 2a 20 67 6f 74 20 69 74 2c 20 73 65  .  /* got it, se
18080 74 20 74 68 65 20 74 79 70 65 20 61 6e 64 20 72  t the type and r
18090 65 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20 70 46  eturn ok */.  pF
180a0 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
180b0 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 0a 20 73 65   eFileLock;.. se
180c0 6d 5f 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 72 65  m_end_lock:.  re
180d0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
180e0 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b  * Lower the lock
180f0 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c  ing level on fil
18100 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69  e descriptor pFi
18110 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e  le to eFileLock.
18120 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d    eFileLock.** m
18130 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f  ust be either NO
18140 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f  _LOCK or SHARED_
18150 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  LOCK..**.** If t
18160 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
18170 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73   of the file des
18180 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61  criptor is alrea
18190 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a  dy at or below.*
181a0 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  * the requested 
181b0 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74  locking level, t
181c0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
181d0 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
181e0 63 20 69 6e 74 20 73 65 6d 58 55 6e 6c 6f 63 6b  c int semXUnlock
181f0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
18200 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b  d, int eFileLock
18210 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  ) {.  unixFile *
18220 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
18230 65 2a 29 69 64 3b 0a 20 20 73 65 6d 5f 74 20 2a  e*)id;.  sem_t *
18240 70 53 65 6d 20 3d 20 70 46 69 6c 65 2d 3e 70 49  pSem = pFile->pI
18250 6e 6f 64 65 2d 3e 70 53 65 6d 3b 0a 0a 20 20 61  node->pSem;..  a
18260 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
18270 20 20 61 73 73 65 72 74 28 20 70 53 65 6d 20 29    assert( pSem )
18280 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e  ;.  OSTRACE(("UN
18290 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73 20  LOCK  %d %d was 
182a0 25 64 20 70 69 64 3d 25 64 20 28 73 65 6d 29 5c  %d pid=%d (sem)\
182b0 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46  n", pFile->h, eF
182c0 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 20  ileLock,.       
182d0 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
182e0 4c 6f 63 6b 2c 20 6f 73 47 65 74 70 69 64 28 30  Lock, osGetpid(0
182f0 29 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65  )));.  assert( e
18300 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44  FileLock<=SHARED
18310 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a  _LOCK );.  .  /*
18320 20 6e 6f 2d 6f 70 20 69 66 20 70 6f 73 73 69 62   no-op if possib
18330 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  le */.  if( pFil
18340 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 65 46  e->eFileLock==eF
18350 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72  ileLock ){.    r
18360 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
18370 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 73 68 61  .  }.  .  /* sha
18380 72 65 64 20 63 61 6e 20 6a 75 73 74 20 62 65 20  red can just be 
18390 73 65 74 20 62 65 63 61 75 73 65 20 77 65 20 61  set because we a
183a0 6c 77 61 79 73 20 68 61 76 65 20 61 6e 20 65 78  lways have an ex
183b0 63 6c 75 73 69 76 65 20 2a 2f 0a 20 20 69 66 20  clusive */.  if 
183c0 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52  (eFileLock==SHAR
183d0 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70  ED_LOCK) {.    p
183e0 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
183f0 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20  = eFileLock;.   
18400 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
18410 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 6e  K;.  }.  .  /* n
18420 6f 2c 20 72 65 61 6c 6c 79 20 75 6e 6c 6f 63 6b  o, really unlock
18430 2e 20 2a 2f 0a 20 20 69 66 20 28 20 73 65 6d 5f  . */.  if ( sem_
18440 70 6f 73 74 28 70 53 65 6d 29 3d 3d 2d 31 20 29  post(pSem)==-1 )
18450 20 7b 0a 20 20 20 20 69 6e 74 20 72 63 2c 20 74   {.    int rc, t
18460 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
18470 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72     rc = sqliteEr
18480 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f  rorFromPosixErro
18490 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45  r(tErrno, SQLITE
184a0 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a  _IOERR_UNLOCK);.
184b0 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f      if( IS_LOCK_
184c0 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20  ERROR(rc) ){.   
184d0 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e     storeLastErrn
184e0 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29  o(pFile, tErrno)
184f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
18500 72 6e 20 72 63 3b 20 0a 20 20 7d 0a 20 20 70 46  rn rc; .  }.  pF
18510 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
18520 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 72 65 74 75   NO_LOCK;.  retu
18530 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
18540 0a 2f 2a 0a 20 2a 2a 20 43 6c 6f 73 65 20 61 20  ./*. ** Close a 
18550 66 69 6c 65 2e 0a 20 2a 2f 0a 73 74 61 74 69 63  file.. */.static
18560 20 69 6e 74 20 73 65 6d 58 43 6c 6f 73 65 28 73   int semXClose(s
18570 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29  qlite3_file *id)
18580 20 7b 0a 20 20 69 66 28 20 69 64 20 29 7b 0a 20   {.  if( id ){. 
18590 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69     unixFile *pFi
185a0 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
185b0 69 64 3b 0a 20 20 20 20 73 65 6d 58 55 6e 6c 6f  id;.    semXUnlo
185c0 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b  ck(id, NO_LOCK);
185d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69  .    assert( pFi
185e0 6c 65 20 29 3b 0a 20 20 20 20 75 6e 69 78 45 6e  le );.    unixEn
185f0 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20  terMutex();.    
18600 72 65 6c 65 61 73 65 49 6e 6f 64 65 49 6e 66 6f  releaseInodeInfo
18610 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 75 6e 69  (pFile);.    uni
18620 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20  xLeaveMutex();. 
18630 20 20 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65     closeUnixFile
18640 28 69 64 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  (id);.  }.  retu
18650 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
18660 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58  .#endif /* OS_VX
18670 57 4f 52 4b 53 20 2a 2f 0a 2f 2a 0a 2a 2a 20 4e  WORKS */./*.** N
18680 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6c  amed semaphore l
18690 6f 63 6b 69 6e 67 20 69 73 20 6f 6e 6c 79 20 61  ocking is only a
186a0 76 61 69 6c 61 62 6c 65 20 6f 6e 20 56 78 57 6f  vailable on VxWo
186b0 72 6b 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  rks..**.********
186c0 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74  ******* End of t
186d0 68 65 20 6e 61 6d 65 64 20 73 65 6d 61 70 68 6f  he named semapho
186e0 72 65 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e  re lock implemen
186f0 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  tation *********
18700 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
18710 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18720 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18730 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18740 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18750 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a 2a 2a 2a 2a  ******/.../*****
18760 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18770 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18780 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18790 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
187a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
187b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
187c0 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 41 46 50 20  ***** Begin AFP 
187d0 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a  Locking ********
187e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
187f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20  *********.**.** 
18800 41 46 50 20 69 73 20 74 68 65 20 41 70 70 6c 65  AFP is the Apple
18810 20 46 69 6c 69 6e 67 20 50 72 6f 74 6f 63 6f 6c   Filing Protocol
18820 2e 20 20 41 46 50 20 69 73 20 61 20 6e 65 74 77  .  AFP is a netw
18830 6f 72 6b 20 66 69 6c 65 73 79 73 74 65 6d 20 66  ork filesystem f
18840 6f 75 6e 64 0a 2a 2a 20 6f 6e 20 41 70 70 6c 65  ound.** on Apple
18850 20 4d 61 63 69 6e 74 6f 73 68 20 63 6f 6d 70 75   Macintosh compu
18860 74 65 72 73 20 2d 20 62 6f 74 68 20 4f 53 39 20  ters - both OS9 
18870 61 6e 64 20 4f 53 58 2e 0a 2a 2a 0a 2a 2a 20 54  and OSX..**.** T
18880 68 69 72 64 2d 70 61 72 74 79 20 69 6d 70 6c 65  hird-party imple
18890 6d 65 6e 74 61 74 69 6f 6e 73 20 6f 66 20 41 46  mentations of AF
188a0 50 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 2e  P are available.
188b0 20 20 42 75 74 20 74 68 69 73 20 63 6f 64 65 20    But this code 
188c0 68 65 72 65 0a 2a 2a 20 6f 6e 6c 79 20 77 6f 72  here.** only wor
188d0 6b 73 20 6f 6e 20 4f 53 58 2e 0a 2a 2f 0a 0a 23  ks on OSX..*/..#
188e0 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
188f0 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f  LE__) && SQLITE_
18900 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
18910 54 59 4c 45 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61  TYLE./*.** The a
18920 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
18930 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61   structure conta
18940 69 6e 73 20 61 6c 6c 20 61 66 70 20 6c 6f 63 6b  ins all afp lock
18950 20 73 70 65 63 69 66 69 63 20 73 74 61 74 65 0a   specific state.
18960 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
18970 74 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74  t afpLockingCont
18980 65 78 74 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f  ext afpLockingCo
18990 6e 74 65 78 74 3b 0a 73 74 72 75 63 74 20 61 66  ntext;.struct af
189a0 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  pLockingContext 
189b0 7b 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65 64  {.  int reserved
189c0 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
189d0 64 62 50 61 74 68 3b 20 20 20 20 20 20 20 20 20  dbPath;         
189e0 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
189f0 68 65 20 6f 70 65 6e 20 66 69 6c 65 20 2a 2f 0a  he open file */.
18a00 7d 3b 0a 0a 73 74 72 75 63 74 20 42 79 74 65 52  };..struct ByteR
18a10 61 6e 67 65 4c 6f 63 6b 50 42 32 0a 7b 0a 20 20  angeLockPB2.{.  
18a20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f  unsigned long lo
18a30 6e 67 20 6f 66 66 73 65 74 3b 20 20 20 20 20 20  ng offset;      
18a40 20 20 2f 2a 20 6f 66 66 73 65 74 20 74 6f 20 66    /* offset to f
18a50 69 72 73 74 20 62 79 74 65 20 74 6f 20 6c 6f 63  irst byte to loc
18a60 6b 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  k */.  unsigned 
18a70 6c 6f 6e 67 20 6c 6f 6e 67 20 6c 65 6e 67 74 68  long long length
18a80 3b 20 20 20 20 20 20 20 20 2f 2a 20 6e 62 72 20  ;        /* nbr 
18a90 6f 66 20 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b  of bytes to lock
18aa0 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c   */.  unsigned l
18ab0 6f 6e 67 20 6c 6f 6e 67 20 72 65 74 52 61 6e 67  ong long retRang
18ac0 65 53 74 61 72 74 3b 20 2f 2a 20 6e 62 72 20 6f  eStart; /* nbr o
18ad0 66 20 31 73 74 20 62 79 74 65 20 6c 6f 63 6b 65  f 1st byte locke
18ae0 64 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 20  d if successful 
18af0 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
18b00 61 72 20 75 6e 4c 6f 63 6b 46 6c 61 67 3b 20 20  ar unLockFlag;  
18b10 20 20 20 20 20 20 20 2f 2a 20 31 20 3d 20 75 6e         /* 1 = un
18b20 6c 6f 63 6b 2c 20 30 20 3d 20 6c 6f 63 6b 20 2a  lock, 0 = lock *
18b30 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
18b40 72 20 73 74 61 72 74 45 6e 64 46 6c 61 67 3b 20  r startEndFlag; 
18b50 20 20 20 20 20 20 2f 2a 20 31 3d 72 65 6c 20 74        /* 1=rel t
18b60 6f 20 65 6e 64 20 6f 66 20 66 6f 72 6b 2c 20 30  o end of fork, 0
18b70 3d 72 65 6c 20 74 6f 20 73 74 61 72 74 20 2a 2f  =rel to start */
18b80 0a 20 20 69 6e 74 20 66 64 3b 20 20 20 20 20 20  .  int fd;      
18b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18ba0 20 20 20 20 20 2f 2a 20 66 69 6c 65 20 64 65 73       /* file des
18bb0 63 20 74 6f 20 61 73 73 6f 63 20 74 68 69 73 20  c to assoc this 
18bc0 6c 6f 63 6b 20 77 69 74 68 20 2a 2f 0a 7d 3b 0a  lock with */.};.
18bd0 0a 23 64 65 66 69 6e 65 20 61 66 70 66 73 42 79  .#define afpfsBy
18be0 74 65 52 61 6e 67 65 4c 6f 63 6b 32 46 53 43 54  teRangeLock2FSCT
18bf0 4c 20 20 20 20 20 20 20 20 5f 49 4f 57 52 28 27  L        _IOWR('
18c00 7a 27 2c 20 32 33 2c 20 73 74 72 75 63 74 20 42  z', 23, struct B
18c10 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32 29  yteRangeLockPB2)
18c20 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ../*.** This is 
18c30 61 20 75 74 69 6c 69 74 79 20 66 6f 72 20 73 65  a utility for se
18c40 74 74 69 6e 67 20 6f 72 20 63 6c 65 61 72 69 6e  tting or clearin
18c50 67 20 61 20 62 69 74 2d 72 61 6e 67 65 20 6c 6f  g a bit-range lo
18c60 63 6b 20 6f 6e 20 61 6e 0a 2a 2a 20 41 46 50 20  ck on an.** AFP 
18c70 66 69 6c 65 73 79 73 74 65 6d 2e 0a 2a 2a 20 0a  filesystem..** .
18c80 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
18c90 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2c 20  _OK on success, 
18ca0 53 51 4c 49 54 45 5f 42 55 53 59 20 6f 6e 20 66  SQLITE_BUSY on f
18cb0 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69  ailure..*/.stati
18cc0 63 20 69 6e 74 20 61 66 70 53 65 74 4c 6f 63 6b  c int afpSetLock
18cd0 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  (.  const char *
18ce0 70 61 74 68 2c 20 20 20 20 20 20 20 20 20 20 20  path,           
18cf0 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
18d00 65 20 66 69 6c 65 20 74 6f 20 62 65 20 6c 6f 63  e file to be loc
18d10 6b 65 64 20 6f 72 20 75 6e 6c 6f 63 6b 65 64 20  ked or unlocked 
18d20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  */.  unixFile *p
18d30 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20  File,           
18d40 20 20 20 20 2f 2a 20 4f 70 65 6e 20 66 69 6c 65      /* Open file
18d50 20 64 65 73 63 72 69 70 74 6f 72 20 6f 6e 20 70   descriptor on p
18d60 61 74 68 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ath */.  unsigne
18d70 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6f 66 66 73  d long long offs
18d80 65 74 2c 20 20 20 20 20 2f 2a 20 46 69 72 73 74  et,     /* First
18d90 20 62 79 74 65 20 74 6f 20 62 65 20 6c 6f 63 6b   byte to be lock
18da0 65 64 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  ed */.  unsigned
18db0 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6c 65 6e 67 74   long long lengt
18dc0 68 2c 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  h,     /* Number
18dd0 20 6f 66 20 62 79 74 65 73 20 74 6f 20 6c 6f 63   of bytes to loc
18de0 6b 20 2a 2f 0a 20 20 69 6e 74 20 73 65 74 4c 6f  k */.  int setLo
18df0 63 6b 46 6c 61 67 20 20 20 20 20 20 20 20 20 20  ckFlag          
18e00 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
18e10 20 73 65 74 20 6c 6f 63 6b 2e 20 20 46 61 6c 73   set lock.  Fals
18e20 65 20 74 6f 20 63 6c 65 61 72 20 6c 6f 63 6b 20  e to clear lock 
18e30 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 42  */.){.  struct B
18e40 79 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32 20  yteRangeLockPB2 
18e50 70 62 3b 0a 20 20 69 6e 74 20 65 72 72 3b 0a 20  pb;.  int err;. 
18e60 20 0a 20 20 70 62 2e 75 6e 4c 6f 63 6b 46 6c 61   .  pb.unLockFla
18e70 67 20 3d 20 73 65 74 4c 6f 63 6b 46 6c 61 67 20  g = setLockFlag 
18e80 3f 20 30 20 3a 20 31 3b 0a 20 20 70 62 2e 73 74  ? 0 : 1;.  pb.st
18e90 61 72 74 45 6e 64 46 6c 61 67 20 3d 20 30 3b 0a  artEndFlag = 0;.
18ea0 20 20 70 62 2e 6f 66 66 73 65 74 20 3d 20 6f 66    pb.offset = of
18eb0 66 73 65 74 3b 0a 20 20 70 62 2e 6c 65 6e 67 74  fset;.  pb.lengt
18ec0 68 20 3d 20 6c 65 6e 67 74 68 3b 20 0a 20 20 70  h = length; .  p
18ed0 62 2e 66 64 20 3d 20 70 46 69 6c 65 2d 3e 68 3b  b.fd = pFile->h;
18ee0 0a 20 20 0a 20 20 4f 53 54 52 41 43 45 28 28 22  .  .  OSTRACE(("
18ef0 41 46 50 53 45 54 4c 4f 43 4b 20 5b 25 73 5d 20  AFPSETLOCK [%s] 
18f00 66 6f 72 20 25 64 25 73 20 69 6e 20 72 61 6e 67  for %d%s in rang
18f10 65 20 25 6c 6c 78 3a 25 6c 6c 78 5c 6e 22 2c 20  e %llx:%llx\n", 
18f20 0a 20 20 20 20 28 73 65 74 4c 6f 63 6b 46 6c 61  .    (setLockFla
18f30 67 3f 22 4f 4e 22 3a 22 4f 46 46 22 29 2c 20 70  g?"ON":"OFF"), p
18f40 46 69 6c 65 2d 3e 68 2c 20 28 70 62 2e 66 64 3d  File->h, (pb.fd=
18f50 3d 2d 31 3f 22 5b 74 65 73 74 76 61 6c 2d 31 5d  =-1?"[testval-1]
18f60 22 3a 22 22 29 2c 0a 20 20 20 20 6f 66 66 73 65  ":""),.    offse
18f70 74 2c 20 6c 65 6e 67 74 68 29 29 3b 0a 20 20 65  t, length));.  e
18f80 72 72 20 3d 20 66 73 63 74 6c 28 70 61 74 68 2c  rr = fsctl(path,
18f90 20 61 66 70 66 73 42 79 74 65 52 61 6e 67 65 4c   afpfsByteRangeL
18fa0 6f 63 6b 32 46 53 43 54 4c 2c 20 26 70 62 2c 20  ock2FSCTL, &pb, 
18fb0 30 29 3b 0a 20 20 69 66 20 28 20 65 72 72 3d 3d  0);.  if ( err==
18fc0 2d 31 20 29 20 7b 0a 20 20 20 20 69 6e 74 20 72  -1 ) {.    int r
18fd0 63 3b 0a 20 20 20 20 69 6e 74 20 74 45 72 72 6e  c;.    int tErrn
18fe0 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 4f  o = errno;.    O
18ff0 53 54 52 41 43 45 28 28 22 41 46 50 53 45 54 4c  STRACE(("AFPSETL
19000 4f 43 4b 20 66 61 69 6c 65 64 20 74 6f 20 66 73  OCK failed to fs
19010 63 74 6c 28 29 20 27 25 73 27 20 25 64 20 25 73  ctl() '%s' %d %s
19020 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
19030 20 20 70 61 74 68 2c 20 74 45 72 72 6e 6f 2c 20    path, tErrno, 
19040 73 74 72 65 72 72 6f 72 28 74 45 72 72 6e 6f 29  strerror(tErrno)
19050 29 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  ));.#ifdef SQLIT
19060 45 5f 49 47 4e 4f 52 45 5f 41 46 50 5f 4c 4f 43  E_IGNORE_AFP_LOC
19070 4b 5f 45 52 52 4f 52 53 0a 20 20 20 20 72 63 20  K_ERRORS.    rc 
19080 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 23  = SQLITE_BUSY;.#
19090 65 6c 73 65 0a 20 20 20 20 72 63 20 3d 20 73 71  else.    rc = sq
190a0 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73  liteErrorFromPos
190b0 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 0a  ixError(tErrno,.
190c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
190d0 20 20 20 20 73 65 74 4c 6f 63 6b 46 6c 61 67 20      setLockFlag 
190e0 3f 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c  ? SQLITE_IOERR_L
190f0 4f 43 4b 20 3a 20 53 51 4c 49 54 45 5f 49 4f 45  OCK : SQLITE_IOE
19100 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 23 65 6e 64  RR_UNLOCK);.#end
19110 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e  if /* SQLITE_IGN
19120 4f 52 45 5f 41 46 50 5f 4c 4f 43 4b 5f 45 52 52  ORE_AFP_LOCK_ERR
19130 4f 52 53 20 2a 2f 0a 20 20 20 20 69 66 28 20 49  ORS */.    if( I
19140 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29  S_LOCK_ERROR(rc)
19150 20 29 7b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c   ){.      storeL
19160 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20  astErrno(pFile, 
19170 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 7d 0a 20  tErrno);.    }. 
19180 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
19190 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 72 65 74  } else {.    ret
191a0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
191b0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
191c0 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20   routine checks 
191d0 69 66 20 74 68 65 72 65 20 69 73 20 61 20 52 45  if there is a RE
191e0 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64  SERVED lock held
191f0 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65   on the specifie
19200 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69  d.** file by thi
19210 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70  s or any other p
19220 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68 20  rocess. If such 
19230 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20  a lock is held, 
19240 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20  set *pResOut.** 
19250 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61  to a non-zero va
19260 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a 70  lue otherwise *p
19270 52 65 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f  ResOut is set to
19280 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74 75   zero.  The retu
19290 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73  rn value.** is s
192a0 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20  et to SQLITE_OK 
192b0 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65 72  unless an I/O er
192c0 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ror occurs durin
192d0 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e  g lock checking.
192e0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
192f0 66 70 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  fpCheckReservedL
19300 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
19310 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f   *id, int *pResO
19320 75 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ut){.  int rc = 
19330 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
19340 20 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20   reserved = 0;. 
19350 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
19360 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
19370 3b 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f  ;.  afpLockingCo
19380 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 3b 0a  ntext *context;.
19390 20 20 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45    .  SimulateIOE
193a0 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c  rror( return SQL
193b0 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52  ITE_IOERR_CHECKR
193c0 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a  ESERVEDLOCK; );.
193d0 20 20 0a 20 20 61 73 73 65 72 74 28 20 70 46 69    .  assert( pFi
193e0 6c 65 20 29 3b 0a 20 20 63 6f 6e 74 65 78 74 20  le );.  context 
193f0 3d 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e  = (afpLockingCon
19400 74 65 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c  text *) pFile->l
19410 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20  ockingContext;. 
19420 20 69 66 28 20 63 6f 6e 74 65 78 74 2d 3e 72 65   if( context->re
19430 73 65 72 76 65 64 20 29 7b 0a 20 20 20 20 2a 70  served ){.    *p
19440 52 65 73 4f 75 74 20 3d 20 31 3b 0a 20 20 20 20  ResOut = 1;.    
19450 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
19460 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 45 6e 74 65  ;.  }.  unixEnte
19470 72 4d 75 74 65 78 28 29 3b 20 2f 2a 20 42 65 63  rMutex(); /* Bec
19480 61 75 73 65 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  ause pFile->pIno
19490 64 65 20 69 73 20 73 68 61 72 65 64 20 61 63 72  de is shared acr
194a0 6f 73 73 20 74 68 72 65 61 64 73 20 2a 2f 0a 20  oss threads */. 
194b0 20 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20   .  /* Check if 
194c0 61 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73  a thread in this
194d0 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73   process holds s
194e0 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20  uch a lock */.  
194f0 69 66 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  if( pFile->pInod
19500 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41  e->eFileLock>SHA
19510 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RED_LOCK ){.    
19520 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20  reserved = 1;.  
19530 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74 68 65 72 77  }.  .  /* Otherw
19540 69 73 65 20 73 65 65 20 69 66 20 73 6f 6d 65 20  ise see if some 
19550 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 68 6f  other process ho
19560 6c 64 73 20 69 74 2e 0a 20 20 20 2a 2f 0a 20 20  lds it..   */.  
19570 69 66 28 20 21 72 65 73 65 72 76 65 64 20 29 7b  if( !reserved ){
19580 0a 20 20 20 20 2f 2a 20 6c 6f 63 6b 20 74 68 65  .    /* lock the
19590 20 52 45 53 45 52 56 45 44 20 62 79 74 65 20 2a   RESERVED byte *
195a0 2f 0a 20 20 20 20 69 6e 74 20 6c 72 63 20 3d 20  /.    int lrc = 
195b0 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  afpSetLock(conte
195c0 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  xt->dbPath, pFil
195d0 65 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45  e, RESERVED_BYTE
195e0 2c 20 31 2c 31 29 3b 20 20 0a 20 20 20 20 69 66  , 1,1);  .    if
195f0 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 6c 72 63  ( SQLITE_OK==lrc
19600 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 69 66 20   ){.      /* if 
19610 77 65 20 73 75 63 63 65 65 64 65 64 20 69 6e 20  we succeeded in 
19620 74 61 6b 69 6e 67 20 74 68 65 20 72 65 73 65 72  taking the reser
19630 76 65 64 20 6c 6f 63 6b 2c 20 75 6e 6c 6f 63 6b  ved lock, unlock
19640 20 69 74 20 74 6f 20 72 65 73 74 6f 72 65 0a 20   it to restore. 
19650 20 20 20 20 20 2a 2a 20 74 68 65 20 6f 72 69 67       ** the orig
19660 69 6e 61 6c 20 73 74 61 74 65 20 2a 2f 0a 20 20  inal state */.  
19670 20 20 20 20 6c 72 63 20 3d 20 61 66 70 53 65 74      lrc = afpSet
19680 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62  Lock(context->db
19690 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 52 45 53  Path, pFile, RES
196a0 45 52 56 45 44 5f 42 59 54 45 2c 20 31 2c 20 30  ERVED_BYTE, 1, 0
196b0 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  );.    } else {.
196c0 20 20 20 20 20 20 2f 2a 20 69 66 20 77 65 20 66        /* if we f
196d0 61 69 6c 65 64 20 74 6f 20 67 65 74 20 74 68 65  ailed to get the
196e0 20 6c 6f 63 6b 20 74 68 65 6e 20 73 6f 6d 65 6f   lock then someo
196f0 6e 65 20 65 6c 73 65 20 6d 75 73 74 20 68 61 76  ne else must hav
19700 65 20 69 74 20 2a 2f 0a 20 20 20 20 20 20 72 65  e it */.      re
19710 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 20 20  served = 1;.    
19720 7d 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43  }.    if( IS_LOC
19730 4b 5f 45 52 52 4f 52 28 6c 72 63 29 20 29 7b 0a  K_ERROR(lrc) ){.
19740 20 20 20 20 20 20 72 63 3d 6c 72 63 3b 0a 20 20        rc=lrc;.  
19750 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 75 6e 69    }.  }.  .  uni
19760 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20  xLeaveMutex();. 
19770 20 4f 53 54 52 41 43 45 28 28 22 54 45 53 54 20   OSTRACE(("TEST 
19780 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64  WR-LOCK %d %d %d
19790 20 28 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65   (afp)\n", pFile
197a0 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65 72 76 65  ->h, rc, reserve
197b0 64 29 29 3b 0a 20 20 0a 20 20 2a 70 52 65 73 4f  d));.  .  *pResO
197c0 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20  ut = reserved;. 
197d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
197e0 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69  *.** Lock the fi
197f0 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b  le with the lock
19800 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70 61   specified by pa
19810 72 61 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63  rameter eFileLoc
19820 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68  k - one.** of th
19830 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a  e following:.**.
19840 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 45  **     (1) SHARE
19850 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32  D_LOCK.**     (2
19860 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a  ) RESERVED_LOCK.
19870 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49  **     (3) PENDI
19880 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  NG_LOCK.**     (
19890 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  4) EXCLUSIVE_LOC
198a0 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65  K.**.** Sometime
198b0 73 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e  s when requestin
198c0 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65  g one lock state
198d0 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63  , additional loc
198e0 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20  k states.** are 
198f0 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 77  inserted in betw
19900 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e  een.  The lockin
19910 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20  g might fail on 
19920 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72  one of the later
19930 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  .** transitions 
19940 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b  leaving the lock
19950 20 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74   state different
19960 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74   from what it st
19970 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69  arted but.** sti
19980 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20  ll short of its 
19990 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  goal.  The follo
199a0 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73  wing chart shows
199b0 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20   the allowed.** 
199c0 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20  transitions and 
199d0 74 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74  the inserted int
199e0 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 73  ermediate states
199f0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43  :.**.**    UNLOC
19a00 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a  KED -> SHARED.**
19a10 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45      SHARED -> RE
19a20 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41  SERVED.**    SHA
19a30 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  RED -> (PENDING)
19a40 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
19a50 20 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20      RESERVED -> 
19a60 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43  (PENDING) -> EXC
19a70 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e  LUSIVE.**    PEN
19a80 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56  DING -> EXCLUSIV
19a90 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  E.**.** This rou
19aa0 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69  tine will only i
19ab0 6e 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20  ncrease a lock. 
19ac0 20 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33   Use the sqlite3
19ad0 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f  OsUnlock().** ro
19ae0 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61  utine to lower a
19af0 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a   locking level..
19b00 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66  */.static int af
19b10 70 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  pLock(sqlite3_fi
19b20 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c  le *id, int eFil
19b30 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72 63  eLock){.  int rc
19b40 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
19b50 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
19b60 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
19b70 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  .  unixInodeInfo
19b80 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65   *pInode = pFile
19b90 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 66 70 4c  ->pInode;.  afpL
19ba0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 63  ockingContext *c
19bb0 6f 6e 74 65 78 74 20 3d 20 28 61 66 70 4c 6f 63  ontext = (afpLoc
19bc0 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 20 70  kingContext *) p
19bd0 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
19be0 74 65 78 74 3b 0a 20 20 0a 20 20 61 73 73 65 72  text;.  .  asser
19bf0 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53  t( pFile );.  OS
19c00 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20  TRACE(("LOCK    
19c10 25 64 20 25 73 20 77 61 73 20 25 73 28 25 73 2c  %d %s was %s(%s,
19c20 25 64 29 20 70 69 64 3d 25 64 20 28 61 66 70 29  %d) pid=%d (afp)
19c30 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20  \n", pFile->h,. 
19c40 20 20 20 20 20 20 20 20 20 20 61 7a 46 69 6c 65            azFile
19c50 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c  Lock(eFileLock),
19c60 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c   azFileLock(pFil
19c70 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c 0a 20  e->eFileLock),. 
19c80 20 20 20 20 20 20 20 20 20 20 61 7a 46 69 6c 65            azFile
19c90 4c 6f 63 6b 28 70 49 6e 6f 64 65 2d 3e 65 46 69  Lock(pInode->eFi
19ca0 6c 65 4c 6f 63 6b 29 2c 20 70 49 6e 6f 64 65 2d  leLock), pInode-
19cb0 3e 6e 53 68 61 72 65 64 20 2c 20 6f 73 47 65 74  >nShared , osGet
19cc0 70 69 64 28 30 29 29 29 3b 0a 0a 20 20 2f 2a 20  pid(0)));..  /* 
19cd0 49 66 20 74 68 65 72 65 20 69 73 20 61 6c 72 65  If there is alre
19ce0 61 64 79 20 61 20 6c 6f 63 6b 20 6f 66 20 74 68  ady a lock of th
19cf0 69 73 20 74 79 70 65 20 6f 72 20 6d 6f 72 65 20  is type or more 
19d00 72 65 73 74 72 69 63 74 69 76 65 20 6f 6e 20 74  restrictive on t
19d10 68 65 0a 20 20 2a 2a 20 75 6e 69 78 46 69 6c 65  he.  ** unixFile
19d20 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 44 6f  , do nothing. Do
19d30 6e 27 74 20 75 73 65 20 74 68 65 20 61 66 70 5f  n't use the afp_
19d40 65 6e 64 5f 6c 6f 63 6b 3a 20 65 78 69 74 20 70  end_lock: exit p
19d50 61 74 68 2c 20 61 73 0a 20 20 2a 2a 20 75 6e 69  ath, as.  ** uni
19d60 78 45 6e 74 65 72 4d 75 74 65 78 28 29 20 68 61  xEnterMutex() ha
19d70 73 6e 27 74 20 62 65 65 6e 20 63 61 6c 6c 65 64  sn't been called
19d80 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   yet..  */.  if(
19d90 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
19da0 6b 3e 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a  k>=eFileLock ){.
19db0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f      OSTRACE(("LO
19dc0 43 4b 20 20 20 20 25 64 20 25 73 20 6f 6b 20 28  CK    %d %s ok (
19dd0 61 6c 72 65 61 64 79 20 68 65 6c 64 29 20 28 61  already held) (a
19de0 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  fp)\n", pFile->h
19df0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 61 7a 46  ,.           azF
19e00 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63  ileLock(eFileLoc
19e10 6b 29 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  k)));.    return
19e20 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
19e30 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
19e40 74 68 65 20 6c 6f 63 6b 69 6e 67 20 73 65 71 75  the locking sequ
19e50 65 6e 63 65 20 69 73 20 63 6f 72 72 65 63 74 0a  ence is correct.
19e60 20 20 2a 2a 20 20 28 31 29 20 57 65 20 6e 65 76    **  (1) We nev
19e70 65 72 20 6d 6f 76 65 20 66 72 6f 6d 20 75 6e 6c  er move from unl
19e80 6f 63 6b 65 64 20 74 6f 20 61 6e 79 74 68 69 6e  ocked to anythin
19e90 67 20 68 69 67 68 65 72 20 74 68 61 6e 20 73 68  g higher than sh
19ea0 61 72 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20  ared lock..  ** 
19eb0 20 28 32 29 20 53 51 4c 69 74 65 20 6e 65 76 65   (2) SQLite neve
19ec0 72 20 65 78 70 6c 69 63 69 74 6c 79 20 72 65 71  r explicitly req
19ed0 75 65 73 74 73 20 61 20 70 65 6e 64 69 67 20 6c  uests a pendig l
19ee0 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28 33 29 20 41  ock..  **  (3) A
19ef0 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 69 73 20   shared lock is 
19f00 61 6c 77 61 79 73 20 68 65 6c 64 20 77 68 65 6e  always held when
19f10 20 61 20 72 65 73 65 72 76 65 20 6c 6f 63 6b 20   a reserve lock 
19f20 69 73 20 72 65 71 75 65 73 74 65 64 2e 0a 20 20  is requested..  
19f30 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  */.  assert( pFi
19f40 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 4e  le->eFileLock!=N
19f50 4f 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c  O_LOCK || eFileL
19f60 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
19f70 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46   );.  assert( eF
19f80 69 6c 65 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e 47  ileLock!=PENDING
19f90 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
19fa0 74 28 20 65 46 69 6c 65 4c 6f 63 6b 21 3d 52 45  t( eFileLock!=RE
19fb0 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70  SERVED_LOCK || p
19fc0 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  File->eFileLock=
19fd0 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
19fe0 20 20 0a 20 20 2f 2a 20 54 68 69 73 20 6d 75 74    .  /* This mut
19ff0 65 78 20 69 73 20 6e 65 65 64 65 64 20 62 65 63  ex is needed bec
1a000 61 75 73 65 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  ause pFile->pIno
1a010 64 65 20 69 73 20 73 68 61 72 65 64 20 61 63 72  de is shared acr
1a020 6f 73 73 20 74 68 72 65 61 64 73 0a 20 20 2a 2f  oss threads.  */
1a030 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  .  unixEnterMute
1a040 78 28 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20  x();.  pInode = 
1a050 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 0a  pFile->pInode;..
1a060 20 20 2f 2a 20 49 66 20 73 6f 6d 65 20 74 68 72    /* If some thr
1a070 65 61 64 20 75 73 69 6e 67 20 74 68 69 73 20 50  ead using this P
1a080 49 44 20 68 61 73 20 61 20 6c 6f 63 6b 20 76 69  ID has a lock vi
1a090 61 20 61 20 64 69 66 66 65 72 65 6e 74 20 75 6e  a a different un
1a0a0 69 78 46 69 6c 65 2a 0a 20 20 2a 2a 20 68 61 6e  ixFile*.  ** han
1a0b0 64 6c 65 20 74 68 61 74 20 70 72 65 63 6c 75 64  dle that preclud
1a0c0 65 73 20 74 68 65 20 72 65 71 75 65 73 74 65 64  es the requested
1a0d0 20 6c 6f 63 6b 2c 20 72 65 74 75 72 6e 20 42 55   lock, return BU
1a0e0 53 59 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28  SY..  */.  if( (
1a0f0 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
1a100 21 3d 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c  !=pInode->eFileL
1a110 6f 63 6b 20 26 26 20 0a 20 20 20 20 20 20 20 28  ock && .       (
1a120 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
1a130 6b 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20  k>=PENDING_LOCK 
1a140 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41  || eFileLock>SHA
1a150 52 45 44 5f 4c 4f 43 4b 29 29 0a 20 20 20 20 20  RED_LOCK)).     
1a160 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
1a170 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 67 6f 74  TE_BUSY;.    got
1a180 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a  o afp_end_lock;.
1a190 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 49 66 20 61    }.  .  /* If a
1a1a0 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 73 20   SHARED lock is 
1a1b0 72 65 71 75 65 73 74 65 64 2c 20 61 6e 64 20 73  requested, and s
1a1c0 6f 6d 65 20 74 68 72 65 61 64 20 75 73 69 6e 67  ome thread using
1a1d0 20 74 68 69 73 20 50 49 44 20 61 6c 72 65 61 64   this PID alread
1a1e0 79 0a 20 20 2a 2a 20 68 61 73 20 61 20 53 48 41  y.  ** has a SHA
1a1f0 52 45 44 20 6f 72 20 52 45 53 45 52 56 45 44 20  RED or RESERVED 
1a200 6c 6f 63 6b 2c 20 74 68 65 6e 20 69 6e 63 72 65  lock, then incre
1a210 6d 65 6e 74 20 72 65 66 65 72 65 6e 63 65 20 63  ment reference c
1a220 6f 75 6e 74 73 20 61 6e 64 0a 20 20 2a 2a 20 72  ounts and.  ** r
1a230 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
1a240 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c  .  */.  if( eFil
1a250 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
1a260 43 4b 20 26 26 20 0a 20 20 20 20 20 28 70 49 6e  CK && .     (pIn
1a270 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d  ode->eFileLock==
1a280 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70  SHARED_LOCK || p
1a290 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
1a2a0 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29  ==RESERVED_LOCK)
1a2b0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
1a2c0 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
1a2d0 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 61 73  D_LOCK );.    as
1a2e0 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 65 46 69  sert( pFile->eFi
1a2f0 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20  leLock==0 );.   
1a300 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d   assert( pInode-
1a310 3e 6e 53 68 61 72 65 64 3e 30 20 29 3b 0a 20 20  >nShared>0 );.  
1a320 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
1a330 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b  ck = SHARED_LOCK
1a340 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53  ;.    pInode->nS
1a350 68 61 72 65 64 2b 2b 3b 0a 20 20 20 20 70 49 6e  hared++;.    pIn
1a360 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20  ode->nLock++;.  
1a370 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c    goto afp_end_l
1a380 6f 63 6b 3b 0a 20 20 7d 0a 20 20 20 20 0a 20 20  ock;.  }.    .  
1a390 2f 2a 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63  /* A PENDING loc
1a3a0 6b 20 69 73 20 6e 65 65 64 65 64 20 62 65 66 6f  k is needed befo
1a3b0 72 65 20 61 63 71 75 69 72 69 6e 67 20 61 20 53  re acquiring a S
1a3c0 48 41 52 45 44 20 6c 6f 63 6b 20 61 6e 64 20 62  HARED lock and b
1a3d0 65 66 6f 72 65 0a 20 20 2a 2a 20 61 63 71 75 69  efore.  ** acqui
1a3e0 72 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56  ring an EXCLUSIV
1a3f0 45 20 6c 6f 63 6b 2e 20 20 46 6f 72 20 74 68 65  E lock.  For the
1a400 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68   SHARED lock, th
1a410 65 20 50 45 4e 44 49 4e 47 20 77 69 6c 6c 0a 20  e PENDING will. 
1a420 20 2a 2a 20 62 65 20 72 65 6c 65 61 73 65 64 2e   ** be released.
1a430 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c  .  */.  if( eFil
1a440 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
1a450 43 4b 20 0a 20 20 20 20 20 20 7c 7c 20 28 65 46  CK .      || (eF
1a460 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ileLock==EXCLUSI
1a470 56 45 5f 4c 4f 43 4b 20 26 26 20 70 46 69 6c 65  VE_LOCK && pFile
1a480 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 50 45 4e 44  ->eFileLock<PEND
1a490 49 4e 47 5f 4c 4f 43 4b 29 0a 20 20 29 7b 0a 20  ING_LOCK).  ){. 
1a4a0 20 20 20 69 6e 74 20 66 61 69 6c 65 64 3b 0a 20     int failed;. 
1a4b0 20 20 20 66 61 69 6c 65 64 20 3d 20 61 66 70 53     failed = afpS
1a4c0 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
1a4d0 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 50  dbPath, pFile, P
1a4e0 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 31 2c 20  ENDING_BYTE, 1, 
1a4f0 31 29 3b 0a 20 20 20 20 69 66 20 28 66 61 69 6c  1);.    if (fail
1a500 65 64 29 20 7b 0a 20 20 20 20 20 20 72 63 20 3d  ed) {.      rc =
1a510 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 67   failed;.      g
1a520 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b  oto afp_end_lock
1a530 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20  ;.    }.  }.  . 
1a540 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20 67   /* If control g
1a550 65 74 73 20 74 6f 20 74 68 69 73 20 70 6f 69 6e  ets to this poin
1a560 74 2c 20 74 68 65 6e 20 61 63 74 75 61 6c 6c 79  t, then actually
1a570 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 6d 61   go ahead and ma
1a580 6b 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69 6e  ke.  ** operatin
1a590 67 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 66  g system calls f
1a5a0 6f 72 20 74 68 65 20 73 70 65 63 69 66 69 65 64  or the specified
1a5b0 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66   lock..  */.  if
1a5c0 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41  ( eFileLock==SHA
1a5d0 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RED_LOCK ){.    
1a5e0 69 6e 74 20 6c 72 63 31 2c 20 6c 72 63 32 2c 20  int lrc1, lrc2, 
1a5f0 6c 72 63 31 45 72 72 6e 6f 20 3d 20 30 3b 0a 20  lrc1Errno = 0;. 
1a600 20 20 20 6c 6f 6e 67 20 6c 6b 2c 20 6d 61 73 6b     long lk, mask
1a610 3b 0a 20 20 20 20 0a 20 20 20 20 61 73 73 65 72  ;.    .    asser
1a620 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72  t( pInode->nShar
1a630 65 64 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  ed==0 );.    ass
1a640 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 65 46 69  ert( pInode->eFi
1a650 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20  leLock==0 );.   
1a660 20 20 20 20 20 0a 20 20 20 20 6d 61 73 6b 20 3d       .    mask =
1a670 20 28 73 69 7a 65 6f 66 28 6c 6f 6e 67 29 3d 3d   (sizeof(long)==
1a680 38 29 20 3f 20 4c 41 52 47 45 53 54 5f 49 4e 54  8) ? LARGEST_INT
1a690 36 34 20 3a 20 30 78 37 66 66 66 66 66 66 66 3b  64 : 0x7fffffff;
1a6a0 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 67 65 74 20  .    /* Now get 
1a6b0 74 68 65 20 72 65 61 64 2d 6c 6f 63 6b 20 53 48  the read-lock SH
1a6c0 41 52 45 44 5f 4c 4f 43 4b 20 2a 2f 0a 20 20 20  ARED_LOCK */.   
1a6d0 20 2f 2a 20 6e 6f 74 65 20 74 68 61 74 20 74 68   /* note that th
1a6e0 65 20 71 75 61 6c 69 74 79 20 6f 66 20 74 68 65  e quality of the
1a6f0 20 72 61 6e 64 6f 6d 6e 65 73 73 20 64 6f 65 73   randomness does
1a700 6e 27 74 20 6d 61 74 74 65 72 20 74 68 61 74 20  n't matter that 
1a710 6d 75 63 68 20 2a 2f 0a 20 20 20 20 6c 6b 20 3d  much */.    lk =
1a720 20 72 61 6e 64 6f 6d 28 29 3b 20 0a 20 20 20 20   random(); .    
1a730 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79  pInode->sharedBy
1a740 74 65 20 3d 20 28 6c 6b 20 26 20 6d 61 73 6b 29  te = (lk & mask)
1a750 25 28 53 48 41 52 45 44 5f 53 49 5a 45 20 2d 20  %(SHARED_SIZE - 
1a760 31 29 3b 0a 20 20 20 20 6c 72 63 31 20 3d 20 61  1);.    lrc1 = a
1a770 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78  fpSetLock(contex
1a780 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65  t->dbPath, pFile
1a790 2c 20 0a 20 20 20 20 20 20 20 20 20 20 53 48 41  , .          SHA
1a7a0 52 45 44 5f 46 49 52 53 54 2b 70 49 6e 6f 64 65  RED_FIRST+pInode
1a7b0 2d 3e 73 68 61 72 65 64 42 79 74 65 2c 20 31 2c  ->sharedByte, 1,
1a7c0 20 31 29 3b 0a 20 20 20 20 69 66 28 20 49 53 5f   1);.    if( IS_
1a7d0 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 31 29  LOCK_ERROR(lrc1)
1a7e0 20 29 7b 0a 20 20 20 20 20 20 6c 72 63 31 45 72   ){.      lrc1Er
1a7f0 72 6e 6f 20 3d 20 70 46 69 6c 65 2d 3e 6c 61 73  rno = pFile->las
1a800 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20  tErrno;.    }.  
1a810 20 20 2f 2a 20 44 72 6f 70 20 74 68 65 20 74 65    /* Drop the te
1a820 6d 70 6f 72 61 72 79 20 50 45 4e 44 49 4e 47 20  mporary PENDING 
1a830 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c 72 63 32  lock */.    lrc2
1a840 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f   = afpSetLock(co
1a850 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70  ntext->dbPath, p
1a860 46 69 6c 65 2c 20 50 45 4e 44 49 4e 47 5f 42 59  File, PENDING_BY
1a870 54 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 0a  TE, 1, 0);.    .
1a880 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f      if( IS_LOCK_
1a890 45 52 52 4f 52 28 6c 72 63 31 29 20 29 20 7b 0a  ERROR(lrc1) ) {.
1a8a0 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45        storeLastE
1a8b0 72 72 6e 6f 28 70 46 69 6c 65 2c 20 6c 72 63 31  rrno(pFile, lrc1
1a8c0 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 72 63  Errno);.      rc
1a8d0 20 3d 20 6c 72 63 31 3b 0a 20 20 20 20 20 20 67   = lrc1;.      g
1a8e0 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b  oto afp_end_lock
1a8f0 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 28  ;.    } else if(
1a900 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c   IS_LOCK_ERROR(l
1a910 72 63 32 29 20 29 7b 0a 20 20 20 20 20 20 72 63  rc2) ){.      rc
1a920 20 3d 20 6c 72 63 32 3b 0a 20 20 20 20 20 20 67   = lrc2;.      g
1a930 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b  oto afp_end_lock
1a940 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 28  ;.    } else if(
1a950 20 6c 72 63 31 20 21 3d 20 53 51 4c 49 54 45 5f   lrc1 != SQLITE_
1a960 4f 4b 20 29 20 7b 0a 20 20 20 20 20 20 72 63 20  OK ) {.      rc 
1a970 3d 20 6c 72 63 31 3b 0a 20 20 20 20 7d 20 65 6c  = lrc1;.    } el
1a980 73 65 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  se {.      pFile
1a990 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48  ->eFileLock = SH
1a9a0 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20  ARED_LOCK;.     
1a9b0 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b   pInode->nLock++
1a9c0 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e  ;.      pInode->
1a9d0 6e 53 68 61 72 65 64 20 3d 20 31 3b 0a 20 20 20  nShared = 1;.   
1a9e0 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65   }.  }else if( e
1a9f0 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  FileLock==EXCLUS
1aa00 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70 49 6e 6f  IVE_LOCK && pIno
1aa10 64 65 2d 3e 6e 53 68 61 72 65 64 3e 31 20 29 7b  de->nShared>1 ){
1aa20 0a 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20 74  .    /* We are t
1aa30 72 79 69 6e 67 20 66 6f 72 20 61 6e 20 65 78 63  rying for an exc
1aa40 6c 75 73 69 76 65 20 6c 6f 63 6b 20 62 75 74 20  lusive lock but 
1aa50 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64 20 69  another thread i
1aa60 6e 20 74 68 69 73 0a 20 20 20 20 20 2a 2a 20 73  n this.     ** s
1aa70 61 6d 65 20 70 72 6f 63 65 73 73 20 69 73 20 73  ame process is s
1aa80 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 20 73  till holding a s
1aa90 68 61 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20  hared lock. */. 
1aaa0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
1aab0 55 53 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  USY;.  }else{.  
1aac0 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74    /* The request
1aad0 20 77 61 73 20 66 6f 72 20 61 20 52 45 53 45 52   was for a RESER
1aae0 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45  VED or EXCLUSIVE
1aaf0 20 6c 6f 63 6b 2e 20 20 49 74 20 69 73 0a 20 20   lock.  It is.  
1ab00 20 20 2a 2a 20 61 73 73 75 6d 65 64 20 74 68 61    ** assumed tha
1ab10 74 20 74 68 65 72 65 20 69 73 20 61 20 53 48 41  t there is a SHA
1ab20 52 45 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c  RED or greater l
1ab30 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 0a  ock on the file.
1ab40 20 20 20 20 2a 2a 20 61 6c 72 65 61 64 79 2e 0a      ** already..
1ab50 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 66      */.    int f
1ab60 61 69 6c 65 64 20 3d 20 30 3b 0a 20 20 20 20 61  ailed = 0;.    a
1ab70 73 73 65 72 74 28 20 30 21 3d 70 46 69 6c 65 2d  ssert( 0!=pFile-
1ab80 3e 65 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a 20 20  >eFileLock );.  
1ab90 20 20 69 66 20 28 65 46 69 6c 65 4c 6f 63 6b 20    if (eFileLock 
1aba0 3e 3d 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  >= RESERVED_LOCK
1abb0 20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65   && pFile->eFile
1abc0 4c 6f 63 6b 20 3c 20 52 45 53 45 52 56 45 44 5f  Lock < RESERVED_
1abd0 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 20 20 20 20  LOCK) {.        
1abe0 2f 2a 20 41 63 71 75 69 72 65 20 61 20 52 45 53  /* Acquire a RES
1abf0 45 52 56 45 44 20 6c 6f 63 6b 20 2a 2f 0a 20 20  ERVED lock */.  
1ac00 20 20 20 20 20 20 66 61 69 6c 65 64 20 3d 20 61        failed = a
1ac10 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78  fpSetLock(contex
1ac20 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65  t->dbPath, pFile
1ac30 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c  , RESERVED_BYTE,
1ac40 20 31 2c 31 29 3b 0a 20 20 20 20 20 20 69 66 28   1,1);.      if(
1ac50 20 21 66 61 69 6c 65 64 20 29 7b 0a 20 20 20 20   !failed ){.    
1ac60 20 20 20 20 63 6f 6e 74 65 78 74 2d 3e 72 65 73      context->res
1ac70 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 20 20 20  erved = 1;.     
1ac80 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20   }.    }.    if 
1ac90 28 21 66 61 69 6c 65 64 20 26 26 20 65 46 69 6c  (!failed && eFil
1aca0 65 4c 6f 63 6b 20 3d 3d 20 45 58 43 4c 55 53 49  eLock == EXCLUSI
1acb0 56 45 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 20  VE_LOCK) {.     
1acc0 20 2f 2a 20 41 63 71 75 69 72 65 20 61 6e 20 45   /* Acquire an E
1acd0 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 2a 2f  XCLUSIVE lock */
1ace0 0a 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20  .        .      
1acf0 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 73 68  /* Remove the sh
1ad00 61 72 65 64 20 6c 6f 63 6b 20 62 65 66 6f 72 65  ared lock before
1ad10 20 74 72 79 69 6e 67 20 74 68 65 20 72 61 6e 67   trying the rang
1ad20 65 2e 20 20 77 65 27 6c 6c 20 6e 65 65 64 20 74  e.  we'll need t
1ad30 6f 20 0a 20 20 20 20 20 20 2a 2a 20 72 65 65 73  o .      ** rees
1ad40 74 61 62 6c 69 73 68 20 74 68 65 20 73 68 61 72  tablish the shar
1ad50 65 64 20 6c 6f 63 6b 20 69 66 20 77 65 20 63 61  ed lock if we ca
1ad60 6e 27 74 20 67 65 74 20 74 68 65 20 20 61 66 70  n't get the  afp
1ad70 55 6e 6c 6f 63 6b 0a 20 20 20 20 20 20 2a 2f 0a  Unlock.      */.
1ad80 20 20 20 20 20 20 69 66 28 20 21 28 66 61 69 6c        if( !(fail
1ad90 65 64 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28  ed = afpSetLock(
1ada0 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c  context->dbPath,
1adb0 20 70 46 69 6c 65 2c 20 53 48 41 52 45 44 5f 46   pFile, SHARED_F
1adc0 49 52 53 54 20 2b 0a 20 20 20 20 20 20 20 20 20  IRST +.         
1add0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ade0 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79  pInode->sharedBy
1adf0 74 65 2c 20 31 2c 20 30 29 29 20 29 7b 0a 20 20  te, 1, 0)) ){.  
1ae00 20 20 20 20 20 20 69 6e 74 20 66 61 69 6c 65 64        int failed
1ae10 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  2 = SQLITE_OK;. 
1ae20 20 20 20 20 20 20 20 2f 2a 20 6e 6f 77 20 61 74         /* now at
1ae30 74 65 6d 6d 70 74 20 74 6f 20 67 65 74 20 74 68  temmpt to get th
1ae40 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  e exclusive lock
1ae50 20 72 61 6e 67 65 20 2a 2f 0a 20 20 20 20 20 20   range */.      
1ae60 20 20 66 61 69 6c 65 64 20 3d 20 61 66 70 53 65    failed = afpSe
1ae70 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64  tLock(context->d
1ae80 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 53 48  bPath, pFile, SH
1ae90 41 52 45 44 5f 46 49 52 53 54 2c 20 0a 20 20 20  ARED_FIRST, .   
1aea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aeb0 20 20 20 20 20 20 20 20 20 20 20 20 53 48 41 52              SHAR
1aec0 45 44 5f 53 49 5a 45 2c 20 31 29 3b 0a 20 20 20  ED_SIZE, 1);.   
1aed0 20 20 20 20 20 69 66 28 20 66 61 69 6c 65 64 20       if( failed 
1aee0 26 26 20 28 66 61 69 6c 65 64 32 20 3d 20 61 66  && (failed2 = af
1aef0 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  pSetLock(context
1af00 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c  ->dbPath, pFile,
1af10 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
1af20 20 20 20 20 20 20 20 20 20 53 48 41 52 45 44 5f           SHARED_
1af30 46 49 52 53 54 20 2b 20 70 49 6e 6f 64 65 2d 3e  FIRST + pInode->
1af40 73 68 61 72 65 64 42 79 74 65 2c 20 31 2c 20 31  sharedByte, 1, 1
1af50 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  )) ){.          
1af60 2f 2a 20 43 61 6e 27 74 20 72 65 65 73 74 61 62  /* Can't reestab
1af70 6c 69 73 68 20 74 68 65 20 73 68 61 72 65 64 20  lish the shared 
1af80 6c 6f 63 6b 2e 20 20 53 71 6c 69 74 65 20 63 61  lock.  Sqlite ca
1af90 6e 27 74 20 64 65 61 6c 2c 20 74 68 69 73 20 69  n't deal, this i
1afa0 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61  s.          ** a
1afb0 20 63 72 69 74 69 63 61 6c 20 49 2f 4f 20 65 72   critical I/O er
1afc0 72 6f 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2f  ror.          */
1afd0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
1afe0 28 28 66 61 69 6c 65 64 20 26 20 53 51 4c 49 54  ((failed & SQLIT
1aff0 45 5f 49 4f 45 52 52 29 20 3d 3d 20 53 51 4c 49  E_IOERR) == SQLI
1b000 54 45 5f 49 4f 45 52 52 29 20 3f 20 66 61 69 6c  TE_IOERR) ? fail
1b010 65 64 32 20 3a 20 0a 20 20 20 20 20 20 20 20 20  ed2 : .         
1b020 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 45        SQLITE_IOE
1b030 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20  RR_LOCK;.       
1b040 20 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f     goto afp_end_
1b050 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 20  lock;.        } 
1b060 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1b070 20 20 20 20 20 20 72 63 20 3d 20 66 61 69 6c 65        rc = faile
1b080 64 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  d; .      }.    
1b090 7d 0a 20 20 20 20 69 66 28 20 66 61 69 6c 65 64  }.    if( failed
1b0a0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66   ){.      rc = f
1b0b0 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 7d  ailed;.    }.  }
1b0c0 0a 20 20 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  .  .  if( rc==SQ
1b0d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
1b0e0 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
1b0f0 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20  = eFileLock;.   
1b100 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f   pInode->eFileLo
1b110 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a  ck = eFileLock;.
1b120 20 20 7d 65 6c 73 65 20 69 66 28 20 65 46 69 6c    }else if( eFil
1b130 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
1b140 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46 69  _LOCK ){.    pFi
1b150 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
1b160 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20  PENDING_LOCK;.  
1b170 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c    pInode->eFileL
1b180 6f 63 6b 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f  ock = PENDING_LO
1b190 43 4b 3b 0a 20 20 7d 0a 20 20 0a 61 66 70 5f 65  CK;.  }.  .afp_e
1b1a0 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 75 6e 69 78 4c  nd_lock:.  unixL
1b1b0 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f  eaveMutex();.  O
1b1c0 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20  STRACE(("LOCK   
1b1d0 20 25 64 20 25 73 20 25 73 20 28 61 66 70 29 5c   %d %s %s (afp)\
1b1e0 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 61 7a  n", pFile->h, az
1b1f0 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f  FileLock(eFileLo
1b200 63 6b 29 2c 20 0a 20 20 20 20 20 20 20 20 20 72  ck), .         r
1b210 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22  c==SQLITE_OK ? "
1b220 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29  ok" : "failed"))
1b230 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
1b240 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68  ../*.** Lower th
1b250 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
1b260 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  on file descript
1b270 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c  or pFile to eFil
1b280 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63  eLock.  eFileLoc
1b290 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74  k.** must be eit
1b2a0 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53  her NO_LOCK or S
1b2b0 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a  HARED_LOCK..**.*
1b2c0 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67  * If the locking
1b2d0 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69   level of the fi
1b2e0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73  le descriptor is
1b2f0 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62   already at or b
1b300 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75  elow.** the requ
1b310 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65  ested locking le
1b320 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  vel, this routin
1b330 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  e is a no-op..*/
1b340 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66 70 55  .static int afpU
1b350 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  nlock(sqlite3_fi
1b360 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c  le *id, int eFil
1b370 65 4c 6f 63 6b 29 20 7b 0a 20 20 69 6e 74 20 72  eLock) {.  int r
1b380 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1b390 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
1b3a0 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
1b3b0 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  ;.  unixInodeInf
1b3c0 6f 20 2a 70 49 6e 6f 64 65 3b 0a 20 20 61 66 70  o *pInode;.  afp
1b3d0 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
1b3e0 63 6f 6e 74 65 78 74 20 3d 20 28 61 66 70 4c 6f  context = (afpLo
1b3f0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 20  ckingContext *) 
1b400 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
1b410 6e 74 65 78 74 3b 0a 20 20 69 6e 74 20 73 6b 69  ntext;.  int ski
1b420 70 53 68 61 72 65 64 20 3d 20 30 3b 0a 23 69 66  pShared = 0;.#if
1b430 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
1b440 20 20 69 6e 74 20 68 20 3d 20 70 46 69 6c 65 2d    int h = pFile-
1b450 3e 68 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73  >h;.#endif..  as
1b460 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20  sert( pFile );. 
1b470 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4c 4f 43   OSTRACE(("UNLOC
1b480 4b 20 20 25 64 20 25 64 20 77 61 73 20 25 64 28  K  %d %d was %d(
1b490 25 64 2c 25 64 29 20 70 69 64 3d 25 64 20 28 61  %d,%d) pid=%d (a
1b4a0 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  fp)\n", pFile->h
1b4b0 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20  , eFileLock,.   
1b4c0 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65          pFile->e
1b4d0 46 69 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d  FileLock, pFile-
1b4e0 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f  >pInode->eFileLo
1b4f0 63 6b 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  ck, pFile->pInod
1b500 65 2d 3e 6e 53 68 61 72 65 64 2c 0a 20 20 20 20  e->nShared,.    
1b510 20 20 20 20 20 20 20 6f 73 47 65 74 70 69 64 28         osGetpid(
1b520 30 29 29 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  0)));..  assert(
1b530 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52   eFileLock<=SHAR
1b540 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28  ED_LOCK );.  if(
1b550 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
1b560 6b 3c 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a  k<=eFileLock ){.
1b570 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1b580 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 75 6e 69 78  E_OK;.  }.  unix
1b590 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
1b5a0 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e  pInode = pFile->
1b5b0 70 49 6e 6f 64 65 3b 0a 20 20 61 73 73 65 72 74  pInode;.  assert
1b5c0 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  ( pInode->nShare
1b5d0 64 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 46  d!=0 );.  if( pF
1b5e0 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53  ile->eFileLock>S
1b5f0 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  HARED_LOCK ){.  
1b600 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65    assert( pInode
1b610 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 70 46 69  ->eFileLock==pFi
1b620 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 29 3b  le->eFileLock );
1b630 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  .    SimulateIOE
1b640 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20  rrorBenign(1);. 
1b650 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
1b660 6f 72 28 20 68 3d 28 2d 31 29 20 29 0a 20 20 20  or( h=(-1) ).   
1b670 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
1b680 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 0a  Benign(0);.    .
1b690 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
1b6a0 42 55 47 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20  BUG.    /* When 
1b6b0 72 65 64 75 63 69 6e 67 20 61 20 6c 6f 63 6b 20  reducing a lock 
1b6c0 73 75 63 68 20 74 68 61 74 20 6f 74 68 65 72 20  such that other 
1b6d0 70 72 6f 63 65 73 73 65 73 20 63 61 6e 20 73 74  processes can st
1b6e0 61 72 74 0a 20 20 20 20 2a 2a 20 72 65 61 64 69  art.    ** readi
1b6f0 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ng the database 
1b700 66 69 6c 65 20 61 67 61 69 6e 2c 20 6d 61 6b 65  file again, make
1b710 20 73 75 72 65 20 74 68 61 74 20 74 68 65 0a 20   sure that the. 
1b720 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f     ** transactio
1b730 6e 20 63 6f 75 6e 74 65 72 20 77 61 73 20 75 70  n counter was up
1b740 64 61 74 65 64 20 69 66 20 61 6e 79 20 70 61 72  dated if any par
1b750 74 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  t of the databas
1b760 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 63 68  e.    ** file ch
1b770 61 6e 67 65 64 2e 20 20 49 66 20 74 68 65 20 74  anged.  If the t
1b780 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74  ransaction count
1b790 65 72 20 69 73 20 6e 6f 74 20 75 70 64 61 74 65  er is not update
1b7a0 64 2c 0a 20 20 20 20 2a 2a 20 6f 74 68 65 72 20  d,.    ** other 
1b7b0 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 6f 20 74  connections to t
1b7c0 68 65 20 73 61 6d 65 20 66 69 6c 65 20 6d 69 67  he same file mig
1b7d0 68 74 20 6e 6f 74 20 72 65 61 6c 69 7a 65 20 74  ht not realize t
1b7e0 68 61 74 0a 20 20 20 20 2a 2a 20 74 68 65 20 66  hat.    ** the f
1b7f0 69 6c 65 20 68 61 73 20 63 68 61 6e 67 65 64 20  ile has changed 
1b800 61 6e 64 20 68 65 6e 63 65 20 6d 69 67 68 74 20  and hence might 
1b810 6e 6f 74 20 6b 6e 6f 77 20 74 6f 20 66 6c 75 73  not know to flus
1b820 68 20 74 68 65 69 72 0a 20 20 20 20 2a 2a 20 63  h their.    ** c
1b830 61 63 68 65 2e 20 20 54 68 65 20 75 73 65 20 6f  ache.  The use o
1b840 66 20 61 20 73 74 61 6c 65 20 63 61 63 68 65 20  f a stale cache 
1b850 63 61 6e 20 6c 65 61 64 20 74 6f 20 64 61 74 61  can lead to data
1b860 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e  base corruption.
1b870 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
1b880 72 74 28 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72  rt( pFile->inNor
1b890 6d 61 6c 57 72 69 74 65 3d 3d 30 0a 20 20 20 20  malWrite==0.    
1b8a0 20 20 20 20 20 20 20 7c 7c 20 70 46 69 6c 65 2d         || pFile-
1b8b0 3e 64 62 55 70 64 61 74 65 3d 3d 30 0a 20 20 20  >dbUpdate==0.   
1b8c0 20 20 20 20 20 20 20 20 7c 7c 20 70 46 69 6c 65          || pFile
1b8d0 2d 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 3d  ->transCntrChng=
1b8e0 3d 31 20 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d  =1 );.    pFile-
1b8f0 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 3d  >inNormalWrite =
1b900 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 0a   0;.#endif.    .
1b910 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65      if( pFile->e
1b920 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  FileLock==EXCLUS
1b930 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  IVE_LOCK ){.    
1b940 20 20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63    rc = afpSetLoc
1b950 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74  k(context->dbPat
1b960 68 2c 20 70 46 69 6c 65 2c 20 53 48 41 52 45 44  h, pFile, SHARED
1b970 5f 46 49 52 53 54 2c 20 53 48 41 52 45 44 5f 53  _FIRST, SHARED_S
1b980 49 5a 45 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  IZE, 0);.      i
1b990 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1b9a0 20 26 26 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d   && (eFileLock==
1b9b0 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70  SHARED_LOCK || p
1b9c0 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 31  Inode->nShared>1
1b9d0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
1b9e0 6f 6e 6c 79 20 72 65 2d 65 73 74 61 62 6c 69 73  only re-establis
1b9f0 68 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63  h the shared loc
1ba00 6b 20 69 66 20 6e 65 63 65 73 73 61 72 79 20 2a  k if necessary *
1ba10 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 73 68  /.        int sh
1ba20 61 72 65 64 4c 6f 63 6b 42 79 74 65 20 3d 20 53  aredLockByte = S
1ba30 48 41 52 45 44 5f 46 49 52 53 54 2b 70 49 6e 6f  HARED_FIRST+pIno
1ba40 64 65 2d 3e 73 68 61 72 65 64 42 79 74 65 3b 0a  de->sharedByte;.
1ba50 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 66 70          rc = afp
1ba60 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d  SetLock(context-
1ba70 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20  >dbPath, pFile, 
1ba80 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20  sharedLockByte, 
1ba90 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 20 65  1, 1);.      } e
1baa0 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 73 6b  lse {.        sk
1bab0 69 70 53 68 61 72 65 64 20 3d 20 31 3b 0a 20 20  ipShared = 1;.  
1bac0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1bad0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1bae0 4b 20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c  K && pFile->eFil
1baf0 65 4c 6f 63 6b 3e 3d 50 45 4e 44 49 4e 47 5f 4c  eLock>=PENDING_L
1bb00 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  OCK ){.      rc 
1bb10 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e  = afpSetLock(con
1bb20 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46  text->dbPath, pF
1bb30 69 6c 65 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54  ile, PENDING_BYT
1bb40 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d 20  E, 1, 0);.    } 
1bb50 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1bb60 49 54 45 5f 4f 4b 20 26 26 20 70 46 69 6c 65 2d  ITE_OK && pFile-
1bb70 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 52 45 53 45  >eFileLock>=RESE
1bb80 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20 63 6f 6e  RVED_LOCK && con
1bb90 74 65 78 74 2d 3e 72 65 73 65 72 76 65 64 20 29  text->reserved )
1bba0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61 66 70  {.      rc = afp
1bbb0 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d  SetLock(context-
1bbc0 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20  >dbPath, pFile, 
1bbd0 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 31  RESERVED_BYTE, 1
1bbe0 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
1bbf0 21 72 63 20 29 7b 20 0a 20 20 20 20 20 20 20 20  !rc ){ .        
1bc00 63 6f 6e 74 65 78 74 2d 3e 72 65 73 65 72 76 65  context->reserve
1bc10 64 20 3d 20 30 3b 20 0a 20 20 20 20 20 20 7d 0a  d = 0; .      }.
1bc20 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
1bc30 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28  ==SQLITE_OK && (
1bc40 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
1bc50 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64 65  D_LOCK || pInode
1bc60 2d 3e 6e 53 68 61 72 65 64 3e 31 29 29 7b 0a 20  ->nShared>1)){. 
1bc70 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69       pInode->eFi
1bc80 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f  leLock = SHARED_
1bc90 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  LOCK;.    }.  }.
1bca0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1bcb0 5f 4f 4b 20 26 26 20 65 46 69 6c 65 4c 6f 63 6b  _OK && eFileLock
1bcc0 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 0a 20 20  ==NO_LOCK ){..  
1bcd0 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74    /* Decrement t
1bce0 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 63  he shared lock c
1bcf0 6f 75 6e 74 65 72 2e 20 20 52 65 6c 65 61 73 65  ounter.  Release
1bd00 20 74 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20   the lock using 
1bd10 61 6e 0a 20 20 20 20 2a 2a 20 4f 53 20 63 61 6c  an.    ** OS cal
1bd20 6c 20 6f 6e 6c 79 20 77 68 65 6e 20 61 6c 6c 20  l only when all 
1bd30 74 68 72 65 61 64 73 20 69 6e 20 74 68 69 73 20  threads in this 
1bd40 73 61 6d 65 20 70 72 6f 63 65 73 73 20 68 61 76  same process hav
1bd50 65 20 72 65 6c 65 61 73 65 64 0a 20 20 20 20 2a  e released.    *
1bd60 2a 20 74 68 65 20 6c 6f 63 6b 2e 0a 20 20 20 20  * the lock..    
1bd70 2a 2f 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20  */.    unsigned 
1bd80 6c 6f 6e 67 20 6c 6f 6e 67 20 73 68 61 72 65 64  long long shared
1bd90 4c 6f 63 6b 42 79 74 65 20 3d 20 53 48 41 52 45  LockByte = SHARE
1bda0 44 5f 46 49 52 53 54 2b 70 49 6e 6f 64 65 2d 3e  D_FIRST+pInode->
1bdb0 73 68 61 72 65 64 42 79 74 65 3b 0a 20 20 20 20  sharedByte;.    
1bdc0 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2d  pInode->nShared-
1bdd0 2d 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64  -;.    if( pInod
1bde0 65 2d 3e 6e 53 68 61 72 65 64 3d 3d 30 20 29 7b  e->nShared==0 ){
1bdf0 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49  .      SimulateI
1be00 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b  OErrorBenign(1);
1be10 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49  .      SimulateI
1be20 4f 45 72 72 6f 72 28 20 68 3d 28 2d 31 29 20 29  OError( h=(-1) )
1be30 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49  .      SimulateI
1be40 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b  OErrorBenign(0);
1be50 0a 20 20 20 20 20 20 69 66 28 20 21 73 6b 69 70  .      if( !skip
1be60 53 68 61 72 65 64 20 29 7b 0a 20 20 20 20 20 20  Shared ){.      
1be70 20 20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63    rc = afpSetLoc
1be80 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74  k(context->dbPat
1be90 68 2c 20 70 46 69 6c 65 2c 20 73 68 61 72 65 64  h, pFile, shared
1bea0 4c 6f 63 6b 42 79 74 65 2c 20 31 2c 20 30 29 3b  LockByte, 1, 0);
1beb0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1bec0 66 28 20 21 72 63 20 29 7b 0a 20 20 20 20 20 20  f( !rc ){.      
1bed0 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c    pInode->eFileL
1bee0 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20  ock = NO_LOCK;. 
1bef0 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46         pFile->eF
1bf00 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43  ileLock = NO_LOC
1bf10 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  K;.      }.    }
1bf20 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1bf30 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1bf40 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2d 2d 3b  pInode->nLock--;
1bf50 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1bf60 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e 3d 30 20  Inode->nLock>=0 
1bf70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e  );.      if( pIn
1bf80 6f 64 65 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20 29 7b  ode->nLock==0 ){
1bf90 0a 20 20 20 20 20 20 20 20 63 6c 6f 73 65 50 65  .        closePe
1bfa0 6e 64 69 6e 67 46 64 73 28 70 46 69 6c 65 29 3b  ndingFds(pFile);
1bfb0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1bfc0 20 7d 0a 20 20 0a 20 20 75 6e 69 78 4c 65 61 76   }.  .  unixLeav
1bfd0 65 4d 75 74 65 78 28 29 3b 0a 20 20 69 66 28 20  eMutex();.  if( 
1bfe0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc==SQLITE_OK ) 
1bff0 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
1c000 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20   = eFileLock;.  
1c010 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1c020 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65  .** Close a file
1c030 20 26 20 63 6c 65 61 6e 75 70 20 41 46 50 20 73   & cleanup AFP s
1c040 70 65 63 69 66 69 63 20 6c 6f 63 6b 69 6e 67 20  pecific locking 
1c050 63 6f 6e 74 65 78 74 20 0a 2a 2f 0a 73 74 61 74  context .*/.stat
1c060 69 63 20 69 6e 74 20 61 66 70 43 6c 6f 73 65 28  ic int afpClose(
1c070 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
1c080 29 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  ) {.  int rc = S
1c090 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
1c0a0 69 64 20 29 7b 0a 20 20 20 20 75 6e 69 78 46 69  id ){.    unixFi
1c0b0 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
1c0c0 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20 61  xFile*)id;.    a
1c0d0 66 70 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f  fpUnlock(id, NO_
1c0e0 4c 4f 43 4b 29 3b 0a 20 20 20 20 75 6e 69 78 45  LOCK);.    unixE
1c0f0 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20  nterMutex();.   
1c100 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f   if( pFile->pIno
1c110 64 65 20 26 26 20 70 46 69 6c 65 2d 3e 70 49 6e  de && pFile->pIn
1c120 6f 64 65 2d 3e 6e 4c 6f 63 6b 20 29 7b 0a 20 20  ode->nLock ){.  
1c130 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
1c140 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  are outstanding 
1c150 6c 6f 63 6b 73 2c 20 64 6f 20 6e 6f 74 20 61 63  locks, do not ac
1c160 74 75 61 6c 6c 79 20 63 6c 6f 73 65 20 74 68 65  tually close the
1c170 20 66 69 6c 65 20 6a 75 73 74 0a 20 20 20 20 20   file just.     
1c180 20 2a 2a 20 79 65 74 20 62 65 63 61 75 73 65 20   ** yet because 
1c190 74 68 61 74 20 77 6f 75 6c 64 20 63 6c 65 61 72  that would clear
1c1a0 20 74 68 6f 73 65 20 6c 6f 63 6b 73 2e 20 20 49   those locks.  I
1c1b0 6e 73 74 65 61 64 2c 20 61 64 64 20 74 68 65 20  nstead, add the 
1c1c0 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 64 65  file.      ** de
1c1d0 73 63 72 69 70 74 6f 72 20 74 6f 20 70 49 6e 6f  scriptor to pIno
1c1e0 64 65 2d 3e 61 50 65 6e 64 69 6e 67 2e 20 20 49  de->aPending.  I
1c1f0 74 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61  t will be automa
1c200 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65 64 20 77  tically closed w
1c210 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  hen.      ** the
1c220 20 6c 61 73 74 20 6c 6f 63 6b 20 69 73 20 63 6c   last lock is cl
1c230 65 61 72 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a  eared..      */.
1c240 20 20 20 20 20 20 73 65 74 50 65 6e 64 69 6e 67        setPending
1c250 46 64 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 7d  Fd(pFile);.    }
1c260 0a 20 20 20 20 72 65 6c 65 61 73 65 49 6e 6f 64  .    releaseInod
1c270 65 49 6e 66 6f 28 70 46 69 6c 65 29 3b 0a 20 20  eInfo(pFile);.  
1c280 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
1c290 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
1c2a0 74 65 78 74 29 3b 0a 20 20 20 20 72 63 20 3d 20  text);.    rc = 
1c2b0 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64  closeUnixFile(id
1c2c0 29 3b 0a 20 20 20 20 75 6e 69 78 4c 65 61 76 65  );.    unixLeave
1c2d0 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a 20 20 72  Mutex();.  }.  r
1c2e0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6e  eturn rc;.}..#en
1c2f0 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f  dif /* defined(_
1c300 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c  _APPLE__) && SQL
1c310 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
1c320 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 2f 2a 0a 2a  NG_STYLE */./*.*
1c330 2a 20 54 68 65 20 63 6f 64 65 20 61 62 6f 76 65  * The code above
1c340 20 69 73 20 74 68 65 20 41 46 50 20 6c 6f 63 6b   is the AFP lock
1c350 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e   implementation.
1c360 20 20 54 68 65 20 63 6f 64 65 20 69 73 20 73 70    The code is sp
1c370 65 63 69 66 69 63 0a 2a 2a 20 74 6f 20 4d 61 63  ecific.** to Mac
1c380 4f 53 58 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74  OSX and does not
1c390 20 77 6f 72 6b 20 6f 6e 20 6f 74 68 65 72 20 75   work on other u
1c3a0 6e 69 78 20 70 6c 61 74 66 6f 72 6d 73 2e 20 20  nix platforms.  
1c3b0 4e 6f 20 61 6c 74 65 72 6e 61 74 69 76 65 0a 2a  No alternative.*
1c3c0 2a 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 20  * is available. 
1c3d0 20 49 66 20 79 6f 75 20 64 6f 6e 27 74 20 63 6f   If you don't co
1c3e0 6d 70 69 6c 65 20 66 6f 72 20 61 20 6d 61 63 2c  mpile for a mac,
1c3f0 20 74 68 65 6e 20 74 68 65 20 22 75 6e 69 78 2d   then the "unix-
1c400 61 66 70 22 0a 2a 2a 20 56 46 53 20 69 73 20 6e  afp".** VFS is n
1c410 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a  ot available..**
1c420 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
1c430 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68  ****** End of th
1c440 65 20 41 46 50 20 6c 6f 63 6b 20 69 6d 70 6c 65  e AFP lock imple
1c450 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a  mentation ******
1c460 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c470 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
1c480 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c490 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c4a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c4b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
1c4c0 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
1c4d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c4e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c4f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c500 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c510 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
1c520 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65  ************* Be
1c530 67 69 6e 20 4e 46 53 20 4c 6f 63 6b 69 6e 67 20  gin NFS Locking 
1c540 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c550 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c560 2f 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  /..#if defined(_
1c570 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c  _APPLE__) && SQL
1c580 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
1c590 4e 47 5f 53 54 59 4c 45 0a 2f 2a 0a 20 2a 2a 20  NG_STYLE./*. ** 
1c5a0 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e  Lower the lockin
1c5b0 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20  g level on file 
1c5c0 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65  descriptor pFile
1c5d0 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20   to eFileLock.  
1c5e0 65 46 69 6c 65 4c 6f 63 6b 0a 20 2a 2a 20 6d 75  eFileLock. ** mu
1c5f0 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f  st be either NO_
1c600 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c  LOCK or SHARED_L
1c610 4f 43 4b 2e 0a 20 2a 2a 0a 20 2a 2a 20 49 66 20  OCK.. **. ** If 
1c620 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
1c630 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65  l of the file de
1c640 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65  scriptor is alre
1c650 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a  ady at or below.
1c660 20 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65   ** the requeste
1c670 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c  d locking level,
1c680 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
1c690 20 61 20 6e 6f 2d 6f 70 2e 0a 20 2a 2f 0a 73 74   a no-op.. */.st
1c6a0 61 74 69 63 20 69 6e 74 20 6e 66 73 55 6e 6c 6f  atic int nfsUnlo
1c6b0 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
1c6c0 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f  *id, int eFileLo
1c6d0 63 6b 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 6f  ck){.  return po
1c6e0 73 69 78 55 6e 6c 6f 63 6b 28 69 64 2c 20 65 46  sixUnlock(id, eF
1c6f0 69 6c 65 4c 6f 63 6b 2c 20 31 29 3b 0a 7d 0a 0a  ileLock, 1);.}..
1c700 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65  #endif /* define
1c710 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20  d(__APPLE__) && 
1c720 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
1c730 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 2f  CKING_STYLE */./
1c740 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 61 62  *.** The code ab
1c750 6f 76 65 20 69 73 20 74 68 65 20 4e 46 53 20 6c  ove is the NFS l
1c760 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ock implementati
1c770 6f 6e 2e 20 20 54 68 65 20 63 6f 64 65 20 69 73  on.  The code is
1c780 20 73 70 65 63 69 66 69 63 0a 2a 2a 20 74 6f 20   specific.** to 
1c790 4d 61 63 4f 53 58 20 61 6e 64 20 64 6f 65 73 20  MacOSX and does 
1c7a0 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 6f 74 68 65  not work on othe
1c7b0 72 20 75 6e 69 78 20 70 6c 61 74 66 6f 72 6d 73  r unix platforms
1c7c0 2e 20 20 4e 6f 20 61 6c 74 65 72 6e 61 74 69 76  .  No alternativ
1c7d0 65 0a 2a 2a 20 69 73 20 61 76 61 69 6c 61 62 6c  e.** is availabl
1c7e0 65 2e 20 20 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  e.  .**.********
1c7f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e  ************* En
1c800 64 20 6f 66 20 74 68 65 20 4e 46 53 20 6c 6f 63  d of the NFS loc
1c810 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  k implementation
1c820 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
1c830 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
1c840 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c850 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c860 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c870 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c880 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a  ******/../******
1c890 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c8a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c8b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c8c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c8d0 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
1c8e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e 6f 6e 2d 6c 6f  ********* Non-lo
1c8f0 63 6b 69 6e 67 20 73 71 6c 69 74 65 33 5f 66 69  cking sqlite3_fi
1c900 6c 65 20 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a  le methods *****
1c910 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c920 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54  ********.**.** T
1c930 68 65 20 6e 65 78 74 20 64 69 76 69 73 69 6f 6e  he next division
1c940 20 63 6f 6e 74 61 69 6e 73 20 69 6d 70 6c 65 6d   contains implem
1c950 65 6e 74 61 74 69 6f 6e 73 20 66 6f 72 20 61 6c  entations for al
1c960 6c 20 6d 65 74 68 6f 64 73 20 6f 66 20 74 68 65  l methods of the
1c970 20 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 66 69 6c   .** sqlite3_fil
1c980 65 20 6f 62 6a 65 63 74 20 6f 74 68 65 72 20 74  e object other t
1c990 68 61 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  han the locking 
1c9a0 6d 65 74 68 6f 64 73 2e 20 20 54 68 65 20 6c 6f  methods.  The lo
1c9b0 63 6b 69 6e 67 0a 2a 2a 20 6d 65 74 68 6f 64 73  cking.** methods
1c9c0 20 77 65 72 65 20 64 65 66 69 6e 65 64 20 69 6e   were defined in
1c9d0 20 64 69 76 69 73 69 6f 6e 73 20 61 62 6f 76 65   divisions above
1c9e0 20 28 6f 6e 65 20 6c 6f 63 6b 69 6e 67 20 6d 65   (one locking me
1c9f0 74 68 6f 64 20 70 65 72 0a 2a 2a 20 64 69 76 69  thod per.** divi
1ca00 73 69 6f 6e 29 2e 20 20 54 68 6f 73 65 20 6d 65  sion).  Those me
1ca10 74 68 6f 64 73 20 74 68 61 74 20 61 72 65 20 63  thods that are c
1ca20 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6c 6f 63  ommon to all loc
1ca30 6b 69 6e 67 20 6d 6f 64 65 73 0a 2a 2a 20 61 72  king modes.** ar
1ca40 65 20 67 61 74 68 65 72 20 74 6f 67 65 74 68 65  e gather togethe
1ca50 72 20 69 6e 74 6f 20 74 68 69 73 20 64 69 76 69  r into this divi
1ca60 73 69 6f 6e 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  sion..*/../*.** 
1ca70 53 65 65 6b 20 74 6f 20 74 68 65 20 6f 66 66 73  Seek to the offs
1ca80 65 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65  et passed as the
1ca90 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
1caa0 2c 20 74 68 65 6e 20 72 65 61 64 20 63 6e 74 20  , then read cnt 
1cab0 0a 2a 2a 20 62 79 74 65 73 20 69 6e 74 6f 20 70  .** bytes into p
1cac0 42 75 66 2e 20 52 65 74 75 72 6e 20 74 68 65 20  Buf. Return the 
1cad0 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
1cae0 61 63 74 75 61 6c 6c 79 20 72 65 61 64 2e 0a 2a  actually read..*
1caf0 2a 0a 2a 2a 20 4e 42 3a 20 20 49 66 20 79 6f 75  *.** NB:  If you
1cb00 20 64 65 66 69 6e 65 20 55 53 45 5f 50 52 45 41   define USE_PREA
1cb10 44 20 6f 72 20 55 53 45 5f 50 52 45 41 44 36 34  D or USE_PREAD64
1cb20 2c 20 74 68 65 6e 20 69 74 20 6d 69 67 68 74 20  , then it might 
1cb30 61 6c 73 6f 0a 2a 2a 20 62 65 20 6e 65 63 65 73  also.** be neces
1cb40 73 61 72 79 20 74 6f 20 64 65 66 69 6e 65 20 5f  sary to define _
1cb50 58 4f 50 45 4e 5f 53 4f 55 52 43 45 20 74 6f 20  XOPEN_SOURCE to 
1cb60 62 65 20 35 30 30 2e 20 20 54 68 69 73 20 76 61  be 500.  This va
1cb70 72 69 65 73 20 66 72 6f 6d 0a 2a 2a 20 6f 6e 65  ries from.** one
1cb80 20 73 79 73 74 65 6d 20 74 6f 20 61 6e 6f 74 68   system to anoth
1cb90 65 72 2e 20 20 53 69 6e 63 65 20 53 51 4c 69 74  er.  Since SQLit
1cba0 65 20 64 6f 65 73 20 6e 6f 74 20 64 65 66 69 6e  e does not defin
1cbb0 65 20 55 53 45 5f 50 52 45 41 44 0a 2a 2a 20 69  e USE_PREAD.** i
1cbc0 6e 20 61 6e 79 20 66 6f 72 6d 20 62 79 20 64 65  n any form by de
1cbd0 66 61 75 6c 74 2c 20 77 65 20 77 69 6c 6c 20 6e  fault, we will n
1cbe0 6f 74 20 61 74 74 65 6d 70 74 20 74 6f 20 64 65  ot attempt to de
1cbf0 66 69 6e 65 20 5f 58 4f 50 45 4e 5f 53 4f 55 52  fine _XOPEN_SOUR
1cc00 43 45 2e 0a 2a 2a 20 53 65 65 20 74 69 63 6b 65  CE..** See ticke
1cc10 74 73 20 23 32 37 34 31 20 61 6e 64 20 23 32 36  ts #2741 and #26
1cc20 38 31 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 76 6f  81..**.** To avo
1cc30 69 64 20 73 74 6f 6d 70 69 6e 67 20 74 68 65 20  id stomping the 
1cc40 65 72 72 6e 6f 20 76 61 6c 75 65 20 6f 6e 20 61  errno value on a
1cc50 20 66 61 69 6c 65 64 20 72 65 61 64 20 74 68 65   failed read the
1cc60 20 6c 61 73 74 45 72 72 6e 6f 20 76 61 6c 75 65   lastErrno value
1cc70 0a 2a 2a 20 69 73 20 73 65 74 20 62 65 66 6f 72  .** is set befor
1cc80 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a  e returning..*/.
1cc90 73 74 61 74 69 63 20 69 6e 74 20 73 65 65 6b 41  static int seekA
1cca0 6e 64 52 65 61 64 28 75 6e 69 78 46 69 6c 65 20  ndRead(unixFile 
1ccb0 2a 69 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74  *id, sqlite3_int
1ccc0 36 34 20 6f 66 66 73 65 74 2c 20 76 6f 69 64 20  64 offset, void 
1ccd0 2a 70 42 75 66 2c 20 69 6e 74 20 63 6e 74 29 7b  *pBuf, int cnt){
1cce0 0a 20 20 69 6e 74 20 67 6f 74 3b 0a 20 20 69 6e  .  int got;.  in
1ccf0 74 20 70 72 69 6f 72 20 3d 20 30 3b 0a 23 69 66  t prior = 0;.#if
1cd00 20 28 21 64 65 66 69 6e 65 64 28 55 53 45 5f 50   (!defined(USE_P
1cd10 52 45 41 44 29 20 26 26 20 21 64 65 66 69 6e 65  READ) && !define
1cd20 64 28 55 53 45 5f 50 52 45 41 44 36 34 29 29 0a  d(USE_PREAD64)).
1cd30 20 20 69 36 34 20 6e 65 77 4f 66 66 73 65 74 3b    i64 newOffset;
1cd40 0a 23 65 6e 64 69 66 0a 20 20 54 49 4d 45 52 5f  .#endif.  TIMER_
1cd50 53 54 41 52 54 3b 0a 20 20 61 73 73 65 72 74 28  START;.  assert(
1cd60 20 63 6e 74 3d 3d 28 63 6e 74 26 30 78 31 66 66   cnt==(cnt&0x1ff
1cd70 66 66 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ff) );.  assert(
1cd80 20 69 64 2d 3e 68 3e 32 20 29 3b 0a 20 20 64 6f   id->h>2 );.  do
1cd90 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 55 53  {.#if defined(US
1cda0 45 5f 50 52 45 41 44 29 0a 20 20 20 20 67 6f 74  E_PREAD).    got
1cdb0 20 3d 20 6f 73 50 72 65 61 64 28 69 64 2d 3e 68   = osPread(id->h
1cdc0 2c 20 70 42 75 66 2c 20 63 6e 74 2c 20 6f 66 66  , pBuf, cnt, off
1cdd0 73 65 74 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61  set);.    Simula
1cde0 74 65 49 4f 45 72 72 6f 72 28 20 67 6f 74 20 3d  teIOError( got =
1cdf0 20 2d 31 20 29 3b 0a 23 65 6c 69 66 20 64 65 66   -1 );.#elif def
1ce00 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 36 34  ined(USE_PREAD64
1ce10 29 0a 20 20 20 20 67 6f 74 20 3d 20 6f 73 50 72  ).    got = osPr
1ce20 65 61 64 36 34 28 69 64 2d 3e 68 2c 20 70 42 75  ead64(id->h, pBu
1ce30 66 2c 20 63 6e 74 2c 20 6f 66 66 73 65 74 29 3b  f, cnt, offset);
1ce40 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  .    SimulateIOE
1ce50 72 72 6f 72 28 20 67 6f 74 20 3d 20 2d 31 20 29  rror( got = -1 )
1ce60 3b 0a 23 65 6c 73 65 0a 20 20 20 20 6e 65 77 4f  ;.#else.    newO
1ce70 66 66 73 65 74 20 3d 20 6c 73 65 65 6b 28 69 64  ffset = lseek(id
1ce80 2d 3e 68 2c 20 6f 66 66 73 65 74 2c 20 53 45 45  ->h, offset, SEE
1ce90 4b 5f 53 45 54 29 3b 0a 20 20 20 20 53 69 6d 75  K_SET);.    Simu
1cea0 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 6e 65 77  lateIOError( new
1ceb0 4f 66 66 73 65 74 2d 2d 20 29 3b 0a 20 20 20 20  Offset-- );.    
1cec0 69 66 28 20 6e 65 77 4f 66 66 73 65 74 21 3d 6f  if( newOffset!=o
1ced0 66 66 73 65 74 20 29 7b 0a 20 20 20 20 20 20 69  ffset ){.      i
1cee0 66 28 20 6e 65 77 4f 66 66 73 65 74 20 3d 3d 20  f( newOffset == 
1cef0 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74  -1 ){.        st
1cf00 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 28 75 6e  oreLastErrno((un
1cf10 69 78 46 69 6c 65 2a 29 69 64 2c 20 65 72 72 6e  ixFile*)id, errn
1cf20 6f 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  o);.      }else{
1cf30 0a 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61  .        storeLa
1cf40 73 74 45 72 72 6e 6f 28 28 75 6e 69 78 46 69 6c  stErrno((unixFil
1cf50 65 2a 29 69 64 2c 20 30 29 3b 0a 20 20 20 20 20  e*)id, 0);.     
1cf60 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
1cf70 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 67 6f  -1;.    }.    go
1cf80 74 20 3d 20 6f 73 52 65 61 64 28 69 64 2d 3e 68  t = osRead(id->h
1cf90 2c 20 70 42 75 66 2c 20 63 6e 74 29 3b 0a 23 65  , pBuf, cnt);.#e
1cfa0 6e 64 69 66 0a 20 20 20 20 69 66 28 20 67 6f 74  ndif.    if( got
1cfb0 3d 3d 63 6e 74 20 29 20 62 72 65 61 6b 3b 0a 20  ==cnt ) break;. 
1cfc0 20 20 20 69 66 28 20 67 6f 74 3c 30 20 29 7b 0a     if( got<0 ){.
1cfd0 20 20 20 20 20 20 69 66 28 20 65 72 72 6e 6f 3d        if( errno=
1cfe0 3d 45 49 4e 54 52 20 29 7b 20 67 6f 74 20 3d 20  =EINTR ){ got = 
1cff0 31 3b 20 63 6f 6e 74 69 6e 75 65 3b 20 7d 0a 20  1; continue; }. 
1d000 20 20 20 20 20 70 72 69 6f 72 20 3d 20 30 3b 0a       prior = 0;.
1d010 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45        storeLastE
1d020 72 72 6e 6f 28 28 75 6e 69 78 46 69 6c 65 2a 29  rrno((unixFile*)
1d030 69 64 2c 20 20 65 72 72 6e 6f 29 3b 0a 20 20 20  id,  errno);.   
1d040 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 65     break;.    }e
1d050 6c 73 65 20 69 66 28 20 67 6f 74 3e 30 20 29 7b  lse if( got>0 ){
1d060 0a 20 20 20 20 20 20 63 6e 74 20 2d 3d 20 67 6f  .      cnt -= go
1d070 74 3b 0a 20 20 20 20 20 20 6f 66 66 73 65 74 20  t;.      offset 
1d080 2b 3d 20 67 6f 74 3b 0a 20 20 20 20 20 20 70 72  += got;.      pr
1d090 69 6f 72 20 2b 3d 20 67 6f 74 3b 0a 20 20 20 20  ior += got;.    
1d0a0 20 20 70 42 75 66 20 3d 20 28 76 6f 69 64 2a 29    pBuf = (void*)
1d0b0 28 67 6f 74 20 2b 20 28 63 68 61 72 2a 29 70 42  (got + (char*)pB
1d0c0 75 66 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68  uf);.    }.  }wh
1d0d0 69 6c 65 28 20 67 6f 74 3e 30 20 29 3b 0a 20 20  ile( got>0 );.  
1d0e0 54 49 4d 45 52 5f 45 4e 44 3b 0a 20 20 4f 53 54  TIMER_END;.  OST
1d0f0 52 41 43 45 28 28 22 52 45 41 44 20 20 20 20 25  RACE(("READ    %
1d100 2d 33 64 20 25 35 64 20 25 37 6c 6c 64 20 25 6c  -3d %5d %7lld %l
1d110 6c 75 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  lu\n",.         
1d120 20 20 20 69 64 2d 3e 68 2c 20 67 6f 74 2b 70 72     id->h, got+pr
1d130 69 6f 72 2c 20 6f 66 66 73 65 74 2d 70 72 69 6f  ior, offset-prio
1d140 72 2c 20 54 49 4d 45 52 5f 45 4c 41 50 53 45 44  r, TIMER_ELAPSED
1d150 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 67 6f 74  ));.  return got
1d160 2b 70 72 69 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  +prior;.}../*.**
1d170 20 52 65 61 64 20 64 61 74 61 20 66 72 6f 6d 20   Read data from 
1d180 61 20 66 69 6c 65 20 69 6e 74 6f 20 61 20 62 75  a file into a bu
1d190 66 66 65 72 2e 20 20 52 65 74 75 72 6e 20 53 51  ffer.  Return SQ
1d1a0 4c 49 54 45 5f 4f 4b 20 69 66 20 61 6c 6c 0a 2a  LITE_OK if all.*
1d1b0 2a 20 62 79 74 65 73 20 77 65 72 65 20 72 65 61  * bytes were rea
1d1c0 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 61  d successfully a
1d1d0 6e 64 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20  nd SQLITE_IOERR 
1d1e0 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73  if anything goes
1d1f0 0a 2a 2a 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74  .** wrong..*/.st
1d200 61 74 69 63 20 69 6e 74 20 75 6e 69 78 52 65 61  atic int unixRea
1d210 64 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  d(.  sqlite3_fil
1d220 65 20 2a 69 64 2c 20 0a 20 20 76 6f 69 64 20 2a  e *id, .  void *
1d230 70 42 75 66 2c 20 0a 20 20 69 6e 74 20 61 6d 74  pBuf, .  int amt
1d240 2c 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  ,.  sqlite3_int6
1d250 34 20 6f 66 66 73 65 74 0a 29 7b 0a 20 20 75 6e  4 offset.){.  un
1d260 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
1d270 28 75 6e 69 78 46 69 6c 65 20 2a 29 69 64 3b 0a  (unixFile *)id;.
1d280 20 20 69 6e 74 20 67 6f 74 3b 0a 20 20 61 73 73    int got;.  ass
1d290 65 72 74 28 20 69 64 20 29 3b 0a 20 20 61 73 73  ert( id );.  ass
1d2a0 65 72 74 28 20 6f 66 66 73 65 74 3e 3d 30 20 29  ert( offset>=0 )
1d2b0 3b 0a 20 20 61 73 73 65 72 74 28 20 61 6d 74 3e  ;.  assert( amt>
1d2c0 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  0 );..  /* If th
1d2d0 69 73 20 69 73 20 61 20 64 61 74 61 62 61 73 65  is is a database
1d2e0 20 66 69 6c 65 20 28 6e 6f 74 20 61 20 6a 6f 75   file (not a jou
1d2f0 72 6e 61 6c 2c 20 6d 61 73 74 65 72 2d 6a 6f 75  rnal, master-jou
1d300 72 6e 61 6c 20 6f 72 20 74 65 6d 70 0a 20 20 2a  rnal or temp.  *
1d310 2a 20 66 69 6c 65 29 2c 20 74 68 65 20 62 79 74  * file), the byt
1d320 65 73 20 69 6e 20 74 68 65 20 6c 6f 63 6b 69 6e  es in the lockin
1d330 67 20 72 61 6e 67 65 20 73 68 6f 75 6c 64 20 6e  g range should n
1d340 65 76 65 72 20 62 65 20 72 65 61 64 20 6f 72 20  ever be read or 
1d350 77 72 69 74 74 65 6e 2e 20 2a 2f 0a 23 69 66 20  written. */.#if 
1d360 30 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  0.  assert( pFil
1d370 65 2d 3e 70 55 6e 75 73 65 64 3d 3d 30 0a 20 20  e->pUnused==0.  
1d380 20 20 20 20 20 7c 7c 20 6f 66 66 73 65 74 3e 3d       || offset>=
1d390 50 45 4e 44 49 4e 47 5f 42 59 54 45 2b 35 31 32  PENDING_BYTE+512
1d3a0 0a 20 20 20 20 20 20 20 7c 7c 20 6f 66 66 73 65  .       || offse
1d3b0 74 2b 61 6d 74 3c 3d 50 45 4e 44 49 4e 47 5f 42  t+amt<=PENDING_B
1d3c0 59 54 45 20 0a 20 20 29 3b 0a 23 65 6e 64 69 66  YTE .  );.#endif
1d3d0 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  ..#if SQLITE_MAX
1d3e0 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 2f  _MMAP_SIZE>0.  /
1d3f0 2a 20 44 65 61 6c 20 77 69 74 68 20 61 73 20 6d  * Deal with as m
1d400 75 63 68 20 6f 66 20 74 68 69 73 20 72 65 61 64  uch of this read
1d410 20 72 65 71 75 65 73 74 20 61 73 20 70 6f 73 73   request as poss
1d420 69 62 6c 65 20 62 79 20 74 72 61 6e 73 66 65 72  ible by transfer
1d430 69 6e 67 0a 20 20 2a 2a 20 64 61 74 61 20 66 72  ing.  ** data fr
1d440 6f 6d 20 74 68 65 20 6d 65 6d 6f 72 79 20 6d 61  om the memory ma
1d450 70 70 69 6e 67 20 75 73 69 6e 67 20 6d 65 6d 63  pping using memc
1d460 70 79 28 29 2e 20 20 2a 2f 0a 20 20 69 66 28 20  py().  */.  if( 
1d470 6f 66 66 73 65 74 3c 70 46 69 6c 65 2d 3e 6d 6d  offset<pFile->mm
1d480 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 69 66  apSize ){.    if
1d490 28 20 6f 66 66 73 65 74 2b 61 6d 74 20 3c 3d 20  ( offset+amt <= 
1d4a0 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20  pFile->mmapSize 
1d4b0 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  ){.      memcpy(
1d4c0 70 42 75 66 2c 20 26 28 28 75 38 20 2a 29 28 70  pBuf, &((u8 *)(p
1d4d0 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e  File->pMapRegion
1d4e0 29 29 5b 6f 66 66 73 65 74 5d 2c 20 61 6d 74 29  ))[offset], amt)
1d4f0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
1d500 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65  QLITE_OK;.    }e
1d510 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  lse{.      int n
1d520 43 6f 70 79 20 3d 20 70 46 69 6c 65 2d 3e 6d 6d  Copy = pFile->mm
1d530 61 70 53 69 7a 65 20 2d 20 6f 66 66 73 65 74 3b  apSize - offset;
1d540 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 42  .      memcpy(pB
1d550 75 66 2c 20 26 28 28 75 38 20 2a 29 28 70 46 69  uf, &((u8 *)(pFi
1d560 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 29  le->pMapRegion))
1d570 5b 6f 66 66 73 65 74 5d 2c 20 6e 43 6f 70 79 29  [offset], nCopy)
1d580 3b 0a 20 20 20 20 20 20 70 42 75 66 20 3d 20 26  ;.      pBuf = &
1d590 28 28 75 38 20 2a 29 70 42 75 66 29 5b 6e 43 6f  ((u8 *)pBuf)[nCo
1d5a0 70 79 5d 3b 0a 20 20 20 20 20 20 61 6d 74 20 2d  py];.      amt -
1d5b0 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20 20 20 6f  = nCopy;.      o
1d5c0 66 66 73 65 74 20 2b 3d 20 6e 43 6f 70 79 3b 0a  ffset += nCopy;.
1d5d0 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
1d5e0 0a 0a 20 20 67 6f 74 20 3d 20 73 65 65 6b 41 6e  ..  got = seekAn
1d5f0 64 52 65 61 64 28 70 46 69 6c 65 2c 20 6f 66 66  dRead(pFile, off
1d600 73 65 74 2c 20 70 42 75 66 2c 20 61 6d 74 29 3b  set, pBuf, amt);
1d610 0a 20 20 69 66 28 20 67 6f 74 3d 3d 61 6d 74 20  .  if( got==amt 
1d620 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
1d630 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65  LITE_OK;.  }else
1d640 20 69 66 28 20 67 6f 74 3c 30 20 29 7b 0a 20 20   if( got<0 ){.  
1d650 20 20 2f 2a 20 6c 61 73 74 45 72 72 6e 6f 20 73    /* lastErrno s
1d660 65 74 20 62 79 20 73 65 65 6b 41 6e 64 52 65 61  et by seekAndRea
1d670 64 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  d */.    return 
1d680 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45 41  SQLITE_IOERR_REA
1d690 44 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  D;.  }else{.    
1d6a0 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70  storeLastErrno(p
1d6b0 46 69 6c 65 2c 20 30 29 3b 20 20 20 2f 2a 20 6e  File, 0);   /* n
1d6c0 6f 74 20 61 20 73 79 73 74 65 6d 20 65 72 72 6f  ot a system erro
1d6d0 72 20 2a 2f 0a 20 20 20 20 2f 2a 20 55 6e 72 65  r */.    /* Unre
1d6e0 61 64 20 70 61 72 74 73 20 6f 66 20 74 68 65 20  ad parts of the 
1d6f0 62 75 66 66 65 72 20 6d 75 73 74 20 62 65 20 7a  buffer must be z
1d700 65 72 6f 2d 66 69 6c 6c 65 64 20 2a 2f 0a 20 20  ero-filled */.  
1d710 20 20 6d 65 6d 73 65 74 28 26 28 28 63 68 61 72    memset(&((char
1d720 2a 29 70 42 75 66 29 5b 67 6f 74 5d 2c 20 30 2c  *)pBuf)[got], 0,
1d730 20 61 6d 74 2d 67 6f 74 29 3b 0a 20 20 20 20 72   amt-got);.    r
1d740 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
1d750 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 3b 0a 20  RR_SHORT_READ;. 
1d760 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65   }.}../*.** Atte
1d770 6d 70 74 20 74 6f 20 73 65 65 6b 20 74 68 65 20  mpt to seek the 
1d780 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 20  file-descriptor 
1d790 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69  passed as the fi
1d7a0 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 0a  rst argument to.
1d7b0 2a 2a 20 61 62 73 6f 6c 75 74 65 20 6f 66 66 73  ** absolute offs
1d7c0 65 74 20 69 4f 66 66 2c 20 74 68 65 6e 20 61 74  et iOff, then at
1d7d0 74 65 6d 70 74 20 74 6f 20 77 72 69 74 65 20 6e  tempt to write n
1d7e0 42 75 66 20 62 79 74 65 73 20 6f 66 20 64 61 74  Buf bytes of dat
1d7f0 61 20 66 72 6f 6d 0a 2a 2a 20 70 42 75 66 20 74  a from.** pBuf t
1d800 6f 20 69 74 2e 20 49 66 20 61 6e 20 65 72 72 6f  o it. If an erro
1d810 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e  r occurs, return
1d820 20 2d 31 20 61 6e 64 20 73 65 74 20 2a 70 69 45   -1 and set *piE
1d830 72 72 6e 6f 2e 20 4f 74 68 65 72 77 69 73 65 2c  rrno. Otherwise,
1d840 20 0a 2a 2a 20 72 65 74 75 72 6e 20 74 68 65 20   .** return the 
1d850 61 63 74 75 61 6c 20 6e 75 6d 62 65 72 20 6f 66  actual number of
1d860 20 62 79 74 65 73 20 77 72 69 74 74 65 6e 20 28   bytes written (
1d870 77 68 69 63 68 20 6d 61 79 20 62 65 20 6c 65 73  which may be les
1d880 73 20 74 68 61 6e 0a 2a 2a 20 6e 42 75 66 29 2e  s than.** nBuf).
1d890 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
1d8a0 65 65 6b 41 6e 64 57 72 69 74 65 46 64 28 0a 20  eekAndWriteFd(. 
1d8b0 20 69 6e 74 20 66 64 2c 20 20 20 20 20 20 20 20   int fd,        
1d8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d8d0 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70   /* File descrip
1d8e0 74 6f 72 20 74 6f 20 77 72 69 74 65 20 74 6f 20  tor to write to 
1d8f0 2a 2f 0a 20 20 69 36 34 20 69 4f 66 66 2c 20 20  */.  i64 iOff,  
1d900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d910 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 6f 66 66       /* File off
1d920 73 65 74 20 74 6f 20 62 65 67 69 6e 20 77 72 69  set to begin wri
1d930 74 69 6e 67 20 61 74 20 2a 2f 0a 20 20 63 6f 6e  ting at */.  con
1d940 73 74 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20  st void *pBuf,  
1d950 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d960 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20 74  Copy data from t
1d970 68 69 73 20 62 75 66 66 65 72 20 74 6f 20 74 68  his buffer to th
1d980 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  e file */.  int 
1d990 6e 42 75 66 2c 20 20 20 20 20 20 20 20 20 20 20  nBuf,           
1d9a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
1d9b0 69 7a 65 20 6f 66 20 62 75 66 66 65 72 20 70 42  ize of buffer pB
1d9c0 75 66 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  uf in bytes */. 
1d9d0 20 69 6e 74 20 2a 70 69 45 72 72 6e 6f 20 20 20   int *piErrno   
1d9e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d9f0 20 2f 2a 20 4f 55 54 3a 20 45 72 72 6f 72 20 6e   /* OUT: Error n
1da00 75 6d 62 65 72 20 69 66 20 65 72 72 6f 72 20 6f  umber if error o
1da10 63 63 75 72 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  ccurs */.){.  in
1da20 74 20 72 63 20 3d 20 30 3b 20 20 20 20 20 20 20  t rc = 0;       
1da30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1da40 20 56 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   Value returned 
1da50 62 79 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 2a  by system call *
1da60 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 42 75  /..  assert( nBu
1da70 66 3d 3d 28 6e 42 75 66 26 30 78 31 66 66 66 66  f==(nBuf&0x1ffff
1da80 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 66  ) );.  assert( f
1da90 64 3e 32 20 29 3b 0a 20 20 6e 42 75 66 20 26 3d  d>2 );.  nBuf &=
1daa0 20 30 78 31 66 66 66 66 3b 0a 20 20 54 49 4d 45   0x1ffff;.  TIME
1dab0 52 5f 53 54 41 52 54 3b 0a 0a 23 69 66 20 64 65  R_START;..#if de
1dac0 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29  fined(USE_PREAD)
1dad0 0a 20 20 64 6f 7b 20 72 63 20 3d 20 28 69 6e 74  .  do{ rc = (int
1dae0 29 6f 73 50 77 72 69 74 65 28 66 64 2c 20 70 42  )osPwrite(fd, pB
1daf0 75 66 2c 20 6e 42 75 66 2c 20 69 4f 66 66 29 3b  uf, nBuf, iOff);
1db00 20 7d 77 68 69 6c 65 28 20 72 63 3c 30 20 26 26   }while( rc<0 &&
1db10 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b   errno==EINTR );
1db20 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 55  .#elif defined(U
1db30 53 45 5f 50 52 45 41 44 36 34 29 0a 20 20 64 6f  SE_PREAD64).  do
1db40 7b 20 72 63 20 3d 20 28 69 6e 74 29 6f 73 50 77  { rc = (int)osPw
1db50 72 69 74 65 36 34 28 66 64 2c 20 70 42 75 66 2c  rite64(fd, pBuf,
1db60 20 6e 42 75 66 2c 20 69 4f 66 66 29 3b 7d 77 68   nBuf, iOff);}wh
1db70 69 6c 65 28 20 72 63 3c 30 20 26 26 20 65 72 72  ile( rc<0 && err
1db80 6e 6f 3d 3d 45 49 4e 54 52 29 3b 0a 23 65 6c 73  no==EINTR);.#els
1db90 65 0a 20 20 64 6f 7b 0a 20 20 20 20 69 36 34 20  e.  do{.    i64 
1dba0 69 53 65 65 6b 20 3d 20 6c 73 65 65 6b 28 66 64  iSeek = lseek(fd
1dbb0 2c 20 69 4f 66 66 2c 20 53 45 45 4b 5f 53 45 54  , iOff, SEEK_SET
1dbc0 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49  );.    SimulateI
1dbd0 4f 45 72 72 6f 72 28 20 69 53 65 65 6b 2d 2d 20  OError( iSeek-- 
1dbe0 29 3b 0a 0a 20 20 20 20 69 66 28 20 69 53 65 65  );..    if( iSee
1dbf0 6b 21 3d 69 4f 66 66 20 29 7b 0a 20 20 20 20 20  k!=iOff ){.     
1dc00 20 69 66 28 20 70 69 45 72 72 6e 6f 20 29 20 2a   if( piErrno ) *
1dc10 70 69 45 72 72 6e 6f 20 3d 20 28 69 53 65 65 6b  piErrno = (iSeek
1dc20 3d 3d 2d 31 20 3f 20 65 72 72 6e 6f 20 3a 20 30  ==-1 ? errno : 0
1dc30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
1dc40 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  -1;.    }.    rc
1dc50 20 3d 20 6f 73 57 72 69 74 65 28 66 64 2c 20 70   = osWrite(fd, p
1dc60 42 75 66 2c 20 6e 42 75 66 29 3b 0a 20 20 7d 77  Buf, nBuf);.  }w
1dc70 68 69 6c 65 28 20 72 63 3c 30 20 26 26 20 65 72  hile( rc<0 && er
1dc80 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 23 65  rno==EINTR );.#e
1dc90 6e 64 69 66 0a 0a 20 20 54 49 4d 45 52 5f 45 4e  ndif..  TIMER_EN
1dca0 44 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 57  D;.  OSTRACE(("W
1dcb0 52 49 54 45 20 20 20 25 2d 33 64 20 25 35 64 20  RITE   %-3d %5d 
1dcc0 25 37 6c 6c 64 20 25 6c 6c 75 5c 6e 22 2c 20 66  %7lld %llu\n", f
1dcd0 64 2c 20 72 63 2c 20 69 4f 66 66 2c 20 54 49 4d  d, rc, iOff, TIM
1dce0 45 52 5f 45 4c 41 50 53 45 44 29 29 3b 0a 0a 20  ER_ELAPSED));.. 
1dcf0 20 69 66 28 20 72 63 3c 30 20 26 26 20 70 69 45   if( rc<0 && piE
1dd00 72 72 6e 6f 20 29 20 2a 70 69 45 72 72 6e 6f 20  rrno ) *piErrno 
1dd10 3d 20 65 72 72 6e 6f 3b 0a 20 20 72 65 74 75 72  = errno;.  retur
1dd20 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
1dd30 53 65 65 6b 20 74 6f 20 74 68 65 20 6f 66 66 73  Seek to the offs
1dd40 65 74 20 69 6e 20 69 64 2d 3e 6f 66 66 73 65 74  et in id->offset
1dd50 20 74 68 65 6e 20 72 65 61 64 20 63 6e 74 20 62   then read cnt b
1dd60 79 74 65 73 20 69 6e 74 6f 20 70 42 75 66 2e 0a  ytes into pBuf..
1dd70 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
1dd80 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 61 63  mber of bytes ac
1dd90 74 75 61 6c 6c 79 20 72 65 61 64 2e 20 20 55 70  tually read.  Up
1dda0 64 61 74 65 20 74 68 65 20 6f 66 66 73 65 74 2e  date the offset.
1ddb0 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 76 6f 69 64 20  .**.** To avoid 
1ddc0 73 74 6f 6d 70 69 6e 67 20 74 68 65 20 65 72 72  stomping the err
1ddd0 6e 6f 20 76 61 6c 75 65 20 6f 6e 20 61 20 66 61  no value on a fa
1dde0 69 6c 65 64 20 77 72 69 74 65 20 74 68 65 20 6c  iled write the l
1ddf0 61 73 74 45 72 72 6e 6f 20 76 61 6c 75 65 0a 2a  astErrno value.*
1de00 2a 20 69 73 20 73 65 74 20 62 65 66 6f 72 65 20  * is set before 
1de10 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74  returning..*/.st
1de20 61 74 69 63 20 69 6e 74 20 73 65 65 6b 41 6e 64  atic int seekAnd
1de30 57 72 69 74 65 28 75 6e 69 78 46 69 6c 65 20 2a  Write(unixFile *
1de40 69 64 2c 20 69 36 34 20 6f 66 66 73 65 74 2c 20  id, i64 offset, 
1de50 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 75 66  const void *pBuf
1de60 2c 20 69 6e 74 20 63 6e 74 29 7b 0a 20 20 72 65  , int cnt){.  re
1de70 74 75 72 6e 20 73 65 65 6b 41 6e 64 57 72 69 74  turn seekAndWrit
1de80 65 46 64 28 69 64 2d 3e 68 2c 20 6f 66 66 73 65  eFd(id->h, offse
1de90 74 2c 20 70 42 75 66 2c 20 63 6e 74 2c 20 26 69  t, pBuf, cnt, &i
1dea0 64 2d 3e 6c 61 73 74 45 72 72 6e 6f 29 3b 0a 7d  d->lastErrno);.}
1deb0 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 64  .../*.** Write d
1dec0 61 74 61 20 66 72 6f 6d 20 61 20 62 75 66 66 65  ata from a buffe
1ded0 72 20 69 6e 74 6f 20 61 20 66 69 6c 65 2e 20 20  r into a file.  
1dee0 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
1def0 20 6f 6e 20 73 75 63 63 65 73 73 0a 2a 2a 20 6f   on success.** o
1df00 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72 72  r some other err
1df10 6f 72 20 63 6f 64 65 20 6f 6e 20 66 61 69 6c 75  or code on failu
1df20 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  re..*/.static in
1df30 74 20 75 6e 69 78 57 72 69 74 65 28 0a 20 20 73  t unixWrite(.  s
1df40 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
1df50 20 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a   .  const void *
1df60 70 42 75 66 2c 20 0a 20 20 69 6e 74 20 61 6d 74  pBuf, .  int amt
1df70 2c 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  ,.  sqlite3_int6
1df80 34 20 6f 66 66 73 65 74 20 0a 29 7b 0a 20 20 75  4 offset .){.  u
1df90 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
1dfa0 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
1dfb0 20 20 69 6e 74 20 77 72 6f 74 65 20 3d 20 30 3b    int wrote = 0;
1dfc0 0a 20 20 61 73 73 65 72 74 28 20 69 64 20 29 3b  .  assert( id );
1dfd0 0a 20 20 61 73 73 65 72 74 28 20 61 6d 74 3e 30  .  assert( amt>0
1dfe0 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69   );..  /* If thi
1dff0 73 20 69 73 20 61 20 64 61 74 61 62 61 73 65 20  s is a database 
1e000 66 69 6c 65 20 28 6e 6f 74 20 61 20 6a 6f 75 72  file (not a jour
1e010 6e 61 6c 2c 20 6d 61 73 74 65 72 2d 6a 6f 75 72  nal, master-jour
1e020 6e 61 6c 20 6f 72 20 74 65 6d 70 0a 20 20 2a 2a  nal or temp.  **
1e030 20 66 69 6c 65 29 2c 20 74 68 65 20 62 79 74 65   file), the byte
1e040 73 20 69 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67  s in the locking
1e050 20 72 61 6e 67 65 20 73 68 6f 75 6c 64 20 6e 65   range should ne
1e060 76 65 72 20 62 65 20 72 65 61 64 20 6f 72 20 77  ver be read or w
1e070 72 69 74 74 65 6e 2e 20 2a 2f 0a 23 69 66 20 30  ritten. */.#if 0
1e080 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
1e090 2d 3e 70 55 6e 75 73 65 64 3d 3d 30 0a 20 20 20  ->pUnused==0.   
1e0a0 20 20 20 20 7c 7c 20 6f 66 66 73 65 74 3e 3d 50      || offset>=P
1e0b0 45 4e 44 49 4e 47 5f 42 59 54 45 2b 35 31 32 0a  ENDING_BYTE+512.
1e0c0 20 20 20 20 20 20 20 7c 7c 20 6f 66 66 73 65 74         || offset
1e0d0 2b 61 6d 74 3c 3d 50 45 4e 44 49 4e 47 5f 42 59  +amt<=PENDING_BY
1e0e0 54 45 20 0a 20 20 29 3b 0a 23 65 6e 64 69 66 0a  TE .  );.#endif.
1e0f0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
1e100 45 42 55 47 0a 20 20 2f 2a 20 49 66 20 77 65 20  EBUG.  /* If we 
1e110 61 72 65 20 64 6f 69 6e 67 20 61 20 6e 6f 72 6d  are doing a norm
1e120 61 6c 20 77 72 69 74 65 20 74 6f 20 61 20 64 61  al write to a da
1e130 74 61 62 61 73 65 20 66 69 6c 65 20 28 61 73 20  tabase file (as 
1e140 6f 70 70 6f 73 65 64 20 74 6f 0a 20 20 2a 2a 20  opposed to.  ** 
1e150 64 6f 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72  doing a hot-jour
1e160 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20  nal rollback or 
1e170 61 20 77 72 69 74 65 20 74 6f 20 73 6f 6d 65 20  a write to some 
1e180 66 69 6c 65 20 6f 74 68 65 72 20 74 68 61 6e 20  file other than 
1e190 61 0a 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20 64 61  a.  ** normal da
1e1a0 74 61 62 61 73 65 20 66 69 6c 65 29 20 74 68 65  tabase file) the
1e1b0 6e 20 72 65 63 6f 72 64 20 74 68 65 20 66 61 63  n record the fac
1e1c0 74 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62  t that the datab
1e1d0 61 73 65 0a 20 20 2a 2a 20 68 61 73 20 63 68 61  ase.  ** has cha
1e1e0 6e 67 65 64 2e 20 20 49 66 20 74 68 65 20 74 72  nged.  If the tr
1e1f0 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65  ansaction counte
1e200 72 20 69 73 20 6d 6f 64 69 66 69 65 64 2c 20 72  r is modified, r
1e210 65 63 6f 72 64 20 74 68 61 74 0a 20 20 2a 2a 20  ecord that.  ** 
1e220 66 61 63 74 20 74 6f 6f 2e 0a 20 20 2a 2f 0a 20  fact too..  */. 
1e230 20 69 66 28 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f   if( pFile->inNo
1e240 72 6d 61 6c 57 72 69 74 65 20 29 7b 0a 20 20 20  rmalWrite ){.   
1e250 20 70 46 69 6c 65 2d 3e 64 62 55 70 64 61 74 65   pFile->dbUpdate
1e260 20 3d 20 31 3b 20 20 2f 2a 20 54 68 65 20 64 61   = 1;  /* The da
1e270 74 61 62 61 73 65 20 68 61 73 20 62 65 65 6e 20  tabase has been 
1e280 6d 6f 64 69 66 69 65 64 20 2a 2f 0a 20 20 20 20  modified */.    
1e290 69 66 28 20 6f 66 66 73 65 74 3c 3d 32 34 20 26  if( offset<=24 &
1e2a0 26 20 6f 66 66 73 65 74 2b 61 6d 74 3e 3d 32 37  & offset+amt>=27
1e2b0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63   ){.      int rc
1e2c0 3b 0a 20 20 20 20 20 20 63 68 61 72 20 6f 6c 64  ;.      char old
1e2d0 43 6e 74 72 5b 34 5d 3b 0a 20 20 20 20 20 20 53  Cntr[4];.      S
1e2e0 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65  imulateIOErrorBe
1e2f0 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 72  nign(1);.      r
1e300 63 20 3d 20 73 65 65 6b 41 6e 64 52 65 61 64 28  c = seekAndRead(
1e310 70 46 69 6c 65 2c 20 32 34 2c 20 6f 6c 64 43 6e  pFile, 24, oldCn
1e320 74 72 2c 20 34 29 3b 0a 20 20 20 20 20 20 53 69  tr, 4);.      Si
1e330 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e  mulateIOErrorBen
1e340 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 69 66  ign(0);.      if
1e350 28 20 72 63 21 3d 34 20 7c 7c 20 6d 65 6d 63 6d  ( rc!=4 || memcm
1e360 70 28 6f 6c 64 43 6e 74 72 2c 20 26 28 28 63 68  p(oldCntr, &((ch
1e370 61 72 2a 29 70 42 75 66 29 5b 32 34 2d 6f 66 66  ar*)pBuf)[24-off
1e380 73 65 74 5d 2c 20 34 29 21 3d 30 20 29 7b 0a 20  set], 4)!=0 ){. 
1e390 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 74 72         pFile->tr
1e3a0 61 6e 73 43 6e 74 72 43 68 6e 67 20 3d 20 31 3b  ansCntrChng = 1;
1e3b0 20 20 2f 2a 20 54 68 65 20 74 72 61 6e 73 61 63    /* The transac
1e3c0 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 68 61 73  tion counter has
1e3d0 20 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20 20 20   changed */.    
1e3e0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65    }.    }.  }.#e
1e3f0 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e 65  ndif..#if define
1e400 64 28 53 51 4c 49 54 45 5f 4d 4d 41 50 5f 52 45  d(SQLITE_MMAP_RE
1e410 41 44 57 52 49 54 45 29 20 26 26 20 53 51 4c 49  ADWRITE) && SQLI
1e420 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
1e430 3e 30 0a 20 20 2f 2a 20 44 65 61 6c 20 77 69 74  >0.  /* Deal wit
1e440 68 20 61 73 20 6d 75 63 68 20 6f 66 20 74 68 69  h as much of thi
1e450 73 20 77 72 69 74 65 20 72 65 71 75 65 73 74 20  s write request 
1e460 61 73 20 70 6f 73 73 69 62 6c 65 20 62 79 20 74  as possible by t
1e470 72 61 6e 73 66 65 72 69 6e 67 0a 20 20 2a 2a 20  ransfering.  ** 
1e480 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 6d 65  data from the me
1e490 6d 6f 72 79 20 6d 61 70 70 69 6e 67 20 75 73 69  mory mapping usi
1e4a0 6e 67 20 6d 65 6d 63 70 79 28 29 2e 20 20 2a 2f  ng memcpy().  */
1e4b0 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c 70 46  .  if( offset<pF
1e4c0 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b  ile->mmapSize ){
1e4d0 0a 20 20 20 20 69 66 28 20 6f 66 66 73 65 74 2b  .    if( offset+
1e4e0 61 6d 74 20 3c 3d 20 70 46 69 6c 65 2d 3e 6d 6d  amt <= pFile->mm
1e4f0 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  apSize ){.      
1e500 6d 65 6d 63 70 79 28 26 28 28 75 38 20 2a 29 28  memcpy(&((u8 *)(
1e510 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f  pFile->pMapRegio
1e520 6e 29 29 5b 6f 66 66 73 65 74 5d 2c 20 70 42 75  n))[offset], pBu
1e530 66 2c 20 61 6d 74 29 3b 0a 20 20 20 20 20 20 72  f, amt);.      r
1e540 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1e550 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1e560 20 20 69 6e 74 20 6e 43 6f 70 79 20 3d 20 70 46    int nCopy = pF
1e570 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 2d 20  ile->mmapSize - 
1e580 6f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 6d 65  offset;.      me
1e590 6d 63 70 79 28 26 28 28 75 38 20 2a 29 28 70 46  mcpy(&((u8 *)(pF
1e5a0 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29  ile->pMapRegion)
1e5b0 29 5b 6f 66 66 73 65 74 5d 2c 20 70 42 75 66 2c  )[offset], pBuf,
1e5c0 20 6e 43 6f 70 79 29 3b 0a 20 20 20 20 20 20 70   nCopy);.      p
1e5d0 42 75 66 20 3d 20 26 28 28 75 38 20 2a 29 70 42  Buf = &((u8 *)pB
1e5e0 75 66 29 5b 6e 43 6f 70 79 5d 3b 0a 20 20 20 20  uf)[nCopy];.    
1e5f0 20 20 61 6d 74 20 2d 3d 20 6e 43 6f 70 79 3b 0a    amt -= nCopy;.
1e600 20 20 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20        offset += 
1e610 6e 43 6f 70 79 3b 0a 20 20 20 20 7d 0a 20 20 7d  nCopy;.    }.  }
1e620 0a 23 65 6e 64 69 66 0a 20 0a 20 20 77 68 69 6c  .#endif. .  whil
1e630 65 28 20 28 77 72 6f 74 65 20 3d 20 73 65 65 6b  e( (wrote = seek
1e640 41 6e 64 57 72 69 74 65 28 70 46 69 6c 65 2c 20  AndWrite(pFile, 
1e650 6f 66 66 73 65 74 2c 20 70 42 75 66 2c 20 61 6d  offset, pBuf, am
1e660 74 29 29 3c 61 6d 74 20 26 26 20 77 72 6f 74 65  t))<amt && wrote
1e670 3e 30 20 29 7b 0a 20 20 20 20 61 6d 74 20 2d 3d  >0 ){.    amt -=
1e680 20 77 72 6f 74 65 3b 0a 20 20 20 20 6f 66 66 73   wrote;.    offs
1e690 65 74 20 2b 3d 20 77 72 6f 74 65 3b 0a 20 20 20  et += wrote;.   
1e6a0 20 70 42 75 66 20 3d 20 26 28 28 63 68 61 72 2a   pBuf = &((char*
1e6b0 29 70 42 75 66 29 5b 77 72 6f 74 65 5d 3b 0a 20  )pBuf)[wrote];. 
1e6c0 20 7d 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45   }.  SimulateIOE
1e6d0 72 72 6f 72 28 28 20 77 72 6f 74 65 3d 28 2d 31  rror(( wrote=(-1
1e6e0 29 2c 20 61 6d 74 3d 31 20 29 29 3b 0a 20 20 53  ), amt=1 ));.  S
1e6f0 69 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45  imulateDiskfullE
1e700 72 72 6f 72 28 28 20 77 72 6f 74 65 3d 30 2c 20  rror(( wrote=0, 
1e710 61 6d 74 3d 31 20 29 29 3b 0a 0a 20 20 69 66 28  amt=1 ));..  if(
1e720 20 61 6d 74 3e 77 72 6f 74 65 20 29 7b 0a 20 20   amt>wrote ){.  
1e730 20 20 69 66 28 20 77 72 6f 74 65 3c 30 20 26 26    if( wrote<0 &&
1e740 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
1e750 6f 21 3d 45 4e 4f 53 50 43 20 29 7b 0a 20 20 20  o!=ENOSPC ){.   
1e760 20 20 20 2f 2a 20 6c 61 73 74 45 72 72 6e 6f 20     /* lastErrno 
1e770 73 65 74 20 62 79 20 73 65 65 6b 41 6e 64 57 72  set by seekAndWr
1e780 69 74 65 20 2a 2f 0a 20 20 20 20 20 20 72 65 74  ite */.      ret
1e790 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
1e7a0 5f 57 52 49 54 45 3b 0a 20 20 20 20 7d 65 6c 73  _WRITE;.    }els
1e7b0 65 7b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61  e{.      storeLa
1e7c0 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 30  stErrno(pFile, 0
1e7d0 29 3b 20 2f 2a 20 6e 6f 74 20 61 20 73 79 73 74  ); /* not a syst
1e7e0 65 6d 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20  em error */.    
1e7f0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1e800 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  FULL;.    }.  }.
1e810 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1e820 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  _OK;.}..#ifdef S
1e830 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a  QLITE_TEST./*.**
1e840 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65   Count the numbe
1e850 72 20 6f 66 20 66 75 6c 6c 73 79 6e 63 73 20 61  r of fullsyncs a
1e860 6e 64 20 6e 6f 72 6d 61 6c 20 73 79 6e 63 73 2e  nd normal syncs.
1e870 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20 74    This is used t
1e880 6f 20 74 65 73 74 0a 2a 2a 20 74 68 61 74 20 73  o test.** that s
1e890 79 6e 63 73 20 61 6e 64 20 66 75 6c 6c 73 79 6e  yncs and fullsyn
1e8a0 63 73 20 61 72 65 20 6f 63 63 75 72 72 69 6e 67  cs are occurring
1e8b0 20 61 74 20 74 68 65 20 72 69 67 68 74 20 74 69   at the right ti
1e8c0 6d 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  mes..*/.int sqli
1e8d0 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 20 3d  te3_sync_count =
1e8e0 20 30 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f   0;.int sqlite3_
1e8f0 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 20 3d  fullsync_count =
1e900 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a   0;.#endif../*.*
1e910 2a 20 57 65 20 64 6f 20 6e 6f 74 20 74 72 75 73  * We do not trus
1e920 74 20 73 79 73 74 65 6d 73 20 74 6f 20 70 72 6f  t systems to pro
1e930 76 69 64 65 20 61 20 77 6f 72 6b 69 6e 67 20 66  vide a working f
1e940 64 61 74 61 73 79 6e 63 28 29 2e 20 20 53 6f 6d  datasync().  Som
1e950 65 20 64 6f 2e 0a 2a 2a 20 4f 74 68 65 72 73 20  e do..** Others 
1e960 64 6f 20 6e 6f 2e 20 20 54 6f 20 62 65 20 73 61  do no.  To be sa
1e970 66 65 2c 20 77 65 20 77 69 6c 6c 20 73 74 69 63  fe, we will stic
1e980 6b 20 77 69 74 68 20 74 68 65 20 28 73 6c 69 67  k with the (slig
1e990 68 74 6c 79 20 73 6c 6f 77 65 72 29 0a 2a 2a 20  htly slower).** 
1e9a0 66 73 79 6e 63 28 29 2e 20 49 66 20 79 6f 75 20  fsync(). If you 
1e9b0 6b 6e 6f 77 20 74 68 61 74 20 79 6f 75 72 20 73  know that your s
1e9c0 79 73 74 65 6d 20 64 6f 65 73 20 73 75 70 70 6f  ystem does suppo
1e9d0 72 74 20 66 64 61 74 61 73 79 6e 63 28 29 20 63  rt fdatasync() c
1e9e0 6f 72 72 65 63 74 6c 79 2c 0a 2a 2a 20 74 68 65  orrectly,.** the
1e9f0 6e 20 73 69 6d 70 6c 79 20 63 6f 6d 70 69 6c 65  n simply compile
1ea00 20 77 69 74 68 20 2d 44 66 64 61 74 61 73 79 6e   with -Dfdatasyn
1ea10 63 3d 66 64 61 74 61 73 79 6e 63 20 6f 72 20 2d  c=fdatasync or -
1ea20 44 48 41 56 45 5f 46 44 41 54 41 53 59 4e 43 0a  DHAVE_FDATASYNC.
1ea30 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
1ea40 66 64 61 74 61 73 79 6e 63 29 20 26 26 20 21 48  fdatasync) && !H
1ea50 41 56 45 5f 46 44 41 54 41 53 59 4e 43 0a 23 20  AVE_FDATASYNC.# 
1ea60 64 65 66 69 6e 65 20 66 64 61 74 61 73 79 6e 63  define fdatasync
1ea70 20 66 73 79 6e 63 0a 23 65 6e 64 69 66 0a 0a 2f   fsync.#endif../
1ea80 2a 0a 2a 2a 20 44 65 66 69 6e 65 20 48 41 56 45  *.** Define HAVE
1ea90 5f 46 55 4c 4c 46 53 59 4e 43 20 74 6f 20 30 20  _FULLFSYNC to 0 
1eaa0 6f 72 20 31 20 64 65 70 65 6e 64 69 6e 67 20 6f  or 1 depending o
1eab0 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  n whether or not
1eac0 0a 2a 2a 20 74 68 65 20 46 5f 46 55 4c 4c 46 53  .** the F_FULLFS
1ead0 59 4e 43 20 6d 61 63 72 6f 20 69 73 20 64 65 66  YNC macro is def
1eae0 69 6e 65 64 2e 20 20 46 5f 46 55 4c 4c 46 53 59  ined.  F_FULLFSY
1eaf0 4e 43 20 69 73 20 63 75 72 72 65 6e 74 6c 79 0a  NC is currently.
1eb00 2a 2a 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c  ** only availabl
1eb10 65 20 6f 6e 20 4d 61 63 20 4f 53 20 58 2e 20 20  e on Mac OS X.  
1eb20 42 75 74 20 74 68 61 74 20 63 6f 75 6c 64 20 63  But that could c
1eb30 68 61 6e 67 65 2e 0a 2a 2f 0a 23 69 66 64 65 66  hange..*/.#ifdef
1eb40 20 46 5f 46 55 4c 4c 46 53 59 4e 43 0a 23 20 64   F_FULLFSYNC.# d
1eb50 65 66 69 6e 65 20 48 41 56 45 5f 46 55 4c 4c 46  efine HAVE_FULLF
1eb60 53 59 4e 43 20 31 0a 23 65 6c 73 65 0a 23 20 64  SYNC 1.#else.# d
1eb70 65 66 69 6e 65 20 48 41 56 45 5f 46 55 4c 4c 46  efine HAVE_FULLF
1eb80 53 59 4e 43 20 30 0a 23 65 6e 64 69 66 0a 0a 23  SYNC 0.#endif..#
1eb90 69 66 64 65 66 20 53 51 4c 49 54 45 5f 55 53 45  ifdef SQLITE_USE
1eba0 5f 52 45 51 55 45 53 54 5f 46 55 4c 4c 46 53 59  _REQUEST_FULLFSY
1ebb0 4e 43 0a 23 69 6d 70 6f 72 74 20 3c 6e 6f 74 69  NC.#import <noti
1ebc0 66 79 2e 68 3e 0a 23 69 6d 70 6f 72 74 20 3c 6c  fy.h>.#import <l
1ebd0 69 62 6b 65 72 6e 2f 4f 53 41 74 6f 6d 69 63 2e  ibkern/OSAtomic.
1ebe0 68 3e 0a 73 74 61 74 69 63 20 4f 53 53 70 69 6e  h>.static OSSpin
1ebf0 4c 6f 63 6b 20 6e 6f 74 69 66 79 5f 6c 6f 63 6b  Lock notify_lock
1ec00 20 3d 20 30 3b 0a 23 64 65 66 69 6e 65 20 52 45   = 0;.#define RE
1ec10 51 55 45 53 54 5f 46 55 4c 4c 53 59 4e 43 5f 4e  QUEST_FULLSYNC_N
1ec20 4f 54 49 46 49 43 41 54 49 4f 4e 20 20 20 20 22  OTIFICATION    "
1ec30 63 6f 6d 2e 61 70 70 6c 65 2e 72 65 71 73 79 6e  com.apple.reqsyn
1ec40 63 22 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  c".#endif../*.**
1ec50 20 54 68 65 20 66 73 79 6e 63 28 29 20 73 79 73   The fsync() sys
1ec60 74 65 6d 20 63 61 6c 6c 20 64 6f 65 73 20 6e 6f  tem call does no
1ec70 74 20 77 6f 72 6b 20 61 73 20 61 64 76 65 72 74  t work as advert
1ec80 69 73 65 64 20 6f 6e 20 6d 61 6e 79 0a 2a 2a 20  ised on many.** 
1ec90 75 6e 69 78 20 73 79 73 74 65 6d 73 2e 20 20 54  unix systems.  T
1eca0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 72 6f  he following pro
1ecb0 63 65 64 75 72 65 20 69 73 20 61 6e 20 61 74 74  cedure is an att
1ecc0 65 6d 70 74 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20  empt to make.** 
1ecd0 69 74 20 77 6f 72 6b 20 62 65 74 74 65 72 2e 0a  it work better..
1ece0 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 49 54 45  **.** The SQLITE
1ecf0 5f 4e 4f 5f 53 59 4e 43 20 6d 61 63 72 6f 20 64  _NO_SYNC macro d
1ed00 69 73 61 62 6c 65 73 20 61 6c 6c 20 66 73 79 6e  isables all fsyn
1ed10 63 28 29 73 2e 20 20 54 68 69 73 20 69 73 20 75  c()s.  This is u
1ed20 73 65 66 75 6c 0a 2a 2a 20 66 6f 72 20 74 65 73  seful.** for tes
1ed30 74 69 6e 67 20 77 68 65 6e 20 77 65 20 77 61 6e  ting when we wan
1ed40 74 20 74 6f 20 72 75 6e 20 74 68 72 6f 75 67 68  t to run through
1ed50 20 74 68 65 20 74 65 73 74 20 73 75 69 74 65 20   the test suite 
1ed60 71 75 69 63 6b 6c 79 2e 0a 2a 2a 20 59 6f 75 20  quickly..** You 
1ed70 61 72 65 20 73 74 72 6f 6e 67 6c 79 20 61 64 76  are strongly adv
1ed80 69 73 65 64 20 2a 6e 6f 74 2a 20 74 6f 20 64 65  ised *not* to de
1ed90 70 6c 6f 79 20 77 69 74 68 20 53 51 4c 49 54 45  ploy with SQLITE
1eda0 5f 4e 4f 5f 53 59 4e 43 0a 2a 2a 20 65 6e 61 62  _NO_SYNC.** enab
1edb0 6c 65 64 2c 20 68 6f 77 65 76 65 72 2c 20 73 69  led, however, si
1edc0 6e 63 65 20 77 69 74 68 20 53 51 4c 49 54 45 5f  nce with SQLITE_
1edd0 4e 4f 5f 53 59 4e 43 20 65 6e 61 62 6c 65 64 2c  NO_SYNC enabled,
1ede0 20 61 6e 20 4f 53 20 63 72 61 73 68 0a 2a 2a 20   an OS crash.** 
1edf0 6f 72 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65  or power failure
1ee00 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 63 6f 72   will likely cor
1ee10 72 75 70 74 20 74 68 65 20 64 61 74 61 62 61 73  rupt the databas
1ee20 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 51  e file..**.** SQ
1ee30 4c 69 74 65 20 73 65 74 73 20 74 68 65 20 64 61  Lite sets the da
1ee40 74 61 4f 6e 6c 79 20 66 6c 61 67 20 69 66 20 74  taOnly flag if t
1ee50 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66  he size of the f
1ee60 69 6c 65 20 69 73 20 75 6e 63 68 61 6e 67 65 64  ile is unchanged
1ee70 2e 0a 2a 2a 20 54 68 65 20 69 64 65 61 20 62 65  ..** The idea be
1ee80 68 69 6e 64 20 64 61 74 61 4f 6e 6c 79 20 69 73  hind dataOnly is
1ee90 20 74 68 61 74 20 69 74 20 73 68 6f 75 6c 64 20   that it should 
1eea0 6f 6e 6c 79 20 77 72 69 74 65 20 74 68 65 20 66  only write the f
1eeb0 69 6c 65 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20 74  ile content.** t
1eec0 6f 20 64 69 73 6b 2c 20 6e 6f 74 20 74 68 65 20  o disk, not the 
1eed0 69 6e 6f 64 65 2e 20 20 57 65 20 6f 6e 6c 79 20  inode.  We only 
1eee0 73 65 74 20 64 61 74 61 4f 6e 6c 79 20 69 66 20  set dataOnly if 
1eef0 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20 69 73  the file size is
1ef00 20 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20 73   .** unchanged s
1ef10 69 6e 63 65 20 74 68 65 20 66 69 6c 65 20 73 69  ince the file si
1ef20 7a 65 20 69 73 20 70 61 72 74 20 6f 66 20 74 68  ze is part of th
1ef30 65 20 69 6e 6f 64 65 2e 20 20 48 6f 77 65 76 65  e inode.  Howeve
1ef40 72 2c 20 0a 2a 2a 20 54 65 64 20 54 73 27 6f 20  r, .** Ted Ts'o 
1ef50 74 65 6c 6c 73 20 75 73 20 74 68 61 74 20 66 64  tells us that fd
1ef60 61 74 61 73 79 6e 63 28 29 20 77 69 6c 6c 20 61  atasync() will a
1ef70 6c 73 6f 20 77 72 69 74 65 20 74 68 65 20 69 6e  lso write the in
1ef80 6f 64 65 20 69 66 20 74 68 65 0a 2a 2a 20 66 69  ode if the.** fi
1ef90 6c 65 20 73 69 7a 65 20 68 61 73 20 63 68 61 6e  le size has chan
1efa0 67 65 64 2e 20 20 54 68 65 20 6f 6e 6c 79 20 72  ged.  The only r
1efb0 65 61 6c 20 64 69 66 66 65 72 65 6e 63 65 20 62  eal difference b
1efc0 65 74 77 65 65 6e 20 66 64 61 74 61 73 79 6e 63  etween fdatasync
1efd0 28 29 0a 2a 2a 20 61 6e 64 20 66 73 79 6e 63 28  ().** and fsync(
1efe0 29 2c 20 54 65 64 20 74 65 6c 6c 73 20 75 73 2c  ), Ted tells us,
1eff0 20 69 73 20 74 68 61 74 20 66 64 61 74 61 73 79   is that fdatasy
1f000 6e 63 28 29 20 77 69 6c 6c 20 6e 6f 74 20 66 6c  nc() will not fl
1f010 75 73 68 20 74 68 65 0a 2a 2a 20 69 6e 6f 64 65  ush the.** inode
1f020 20 69 66 20 74 68 65 20 6d 74 69 6d 65 20 6f 72   if the mtime or
1f030 20 6f 77 6e 65 72 20 6f 72 20 6f 74 68 65 72 20   owner or other 
1f040 69 6e 6f 64 65 20 61 74 74 72 69 62 75 74 65 73  inode attributes
1f050 20 68 61 76 65 20 63 68 61 6e 67 65 64 2e 0a 2a   have changed..*
1f060 2a 20 57 65 20 6f 6e 6c 79 20 63 61 72 65 20 61  * We only care a
1f070 62 6f 75 74 20 74 68 65 20 66 69 6c 65 20 73 69  bout the file si
1f080 7a 65 2c 20 6e 6f 74 20 74 68 65 20 6f 74 68 65  ze, not the othe
1f090 72 20 66 69 6c 65 20 61 74 74 72 69 62 75 74 65  r file attribute
1f0a0 73 2c 20 73 6f 0a 2a 2a 20 61 73 20 66 61 72 20  s, so.** as far 
1f0b0 61 73 20 53 51 4c 69 74 65 20 69 73 20 63 6f 6e  as SQLite is con
1f0c0 63 65 72 6e 65 64 2c 20 61 6e 20 66 64 61 74 61  cerned, an fdata
1f0d0 73 79 6e 63 28 29 20 69 73 20 61 6c 77 61 79 73  sync() is always
1f0e0 20 61 64 65 71 75 61 74 65 2e 0a 2a 2a 20 53 6f   adequate..** So
1f0f0 2c 20 77 65 20 61 6c 77 61 79 73 20 75 73 65 20  , we always use 
1f100 66 64 61 74 61 73 79 6e 63 28 29 20 69 66 20 69  fdatasync() if i
1f110 74 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20  t is available, 
1f120 72 65 67 61 72 64 6c 65 73 73 20 6f 66 0a 2a 2a  regardless of.**
1f130 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
1f140 65 20 64 61 74 61 4f 6e 6c 79 20 66 6c 61 67 2e  e dataOnly flag.
1f150 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
1f160 75 6c 6c 5f 66 73 79 6e 63 28 69 6e 74 20 66 64  ull_fsync(int fd
1f170 2c 20 69 6e 74 20 66 75 6c 6c 53 79 6e 63 2c 20  , int fullSync, 
1f180 69 6e 74 20 64 61 74 61 4f 6e 6c 79 29 7b 0a 20  int dataOnly){. 
1f190 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 54   int rc;..  /* T
1f1a0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 22 69 66  he following "if
1f1b0 64 65 66 2f 65 6c 69 66 2f 65 6c 73 65 2f 22 20  def/elif/else/" 
1f1c0 62 6c 6f 63 6b 20 68 61 73 20 74 68 65 20 73 61  block has the sa
1f1d0 6d 65 20 73 74 72 75 63 74 75 72 65 20 61 73 0a  me structure as.
1f1e0 20 20 2a 2a 20 74 68 65 20 6f 6e 65 20 62 65 6c    ** the one bel
1f1f0 6f 77 2e 20 49 74 20 69 73 20 72 65 70 6c 69 63  ow. It is replic
1f200 61 74 65 64 20 68 65 72 65 20 73 6f 6c 65 6c 79  ated here solely
1f210 20 74 6f 20 61 76 6f 69 64 20 63 6c 75 74 74 65   to avoid clutte
1f220 72 69 6e 67 20 0a 20 20 2a 2a 20 75 70 20 74 68  ring .  ** up th
1f230 65 20 72 65 61 6c 20 63 6f 64 65 20 77 69 74 68  e real code with
1f240 20 74 68 65 20 55 4e 55 53 45 44 5f 50 41 52 41   the UNUSED_PARA
1f250 4d 45 54 45 52 28 29 20 6d 61 63 72 6f 73 2e 0a  METER() macros..
1f260 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49    */.#ifdef SQLI
1f270 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20 55 4e 55  TE_NO_SYNC.  UNU
1f280 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66 64  SED_PARAMETER(fd
1f290 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
1f2a0 4d 45 54 45 52 28 66 75 6c 6c 53 79 6e 63 29 3b  METER(fullSync);
1f2b0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
1f2c0 54 45 52 28 64 61 74 61 4f 6e 6c 79 29 3b 0a 23  TER(dataOnly);.#
1f2d0 65 6c 69 66 20 48 41 56 45 5f 46 55 4c 4c 46 53  elif HAVE_FULLFS
1f2e0 59 4e 43 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  YNC.  UNUSED_PAR
1f2f0 41 4d 45 54 45 52 28 64 61 74 61 4f 6e 6c 79 29  AMETER(dataOnly)
1f300 3b 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44  ;.#else.  UNUSED
1f310 5f 50 41 52 41 4d 45 54 45 52 28 66 75 6c 6c 53  _PARAMETER(fullS
1f320 79 6e 63 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  ync);.  UNUSED_P
1f330 41 52 41 4d 45 54 45 52 28 64 61 74 61 4f 6e 6c  ARAMETER(dataOnl
1f340 79 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a  y);.#endif..  /*
1f350 20 52 65 63 6f 72 64 20 74 68 65 20 6e 75 6d 62   Record the numb
1f360 65 72 20 6f 66 20 74 69 6d 65 73 20 74 68 61 74  er of times that
1f370 20 77 65 20 64 6f 20 61 20 6e 6f 72 6d 61 6c 20   we do a normal 
1f380 66 73 79 6e 63 28 29 20 61 6e 64 20 0a 20 20 2a  fsync() and .  *
1f390 2a 20 46 55 4c 4c 53 59 4e 43 2e 20 20 54 68 69  * FULLSYNC.  Thi
1f3a0 73 20 69 73 20 75 73 65 64 20 64 75 72 69 6e 67  s is used during
1f3b0 20 74 65 73 74 69 6e 67 20 74 6f 20 76 65 72 69   testing to veri
1f3c0 66 79 20 74 68 61 74 20 74 68 69 73 20 70 72 6f  fy that this pro
1f3d0 63 65 64 75 72 65 0a 20 20 2a 2a 20 67 65 74 73  cedure.  ** gets
1f3e0 20 63 61 6c 6c 65 64 20 77 69 74 68 20 74 68 65   called with the
1f3f0 20 63 6f 72 72 65 63 74 20 61 72 67 75 6d 65 6e   correct argumen
1f400 74 73 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20  ts..  */.#ifdef 
1f410 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 66  SQLITE_TEST.  if
1f420 28 20 66 75 6c 6c 53 79 6e 63 20 29 20 73 71 6c  ( fullSync ) sql
1f430 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f  ite3_fullsync_co
1f440 75 6e 74 2b 2b 3b 0a 20 20 73 71 6c 69 74 65 33  unt++;.  sqlite3
1f450 5f 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 23  _sync_count++;.#
1f460 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 77  endif..  /* If w
1f470 65 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20  e compiled with 
1f480 74 68 65 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59  the SQLITE_NO_SY
1f490 4e 43 20 66 6c 61 67 2c 20 74 68 65 6e 20 73 79  NC flag, then sy
1f4a0 6e 63 69 6e 67 20 69 73 20 61 0a 20 20 2a 2a 20  ncing is a.  ** 
1f4b0 6e 6f 2d 6f 70 0a 20 20 2a 2f 0a 23 69 66 64 65  no-op.  */.#ifde
1f4c0 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43  f SQLITE_NO_SYNC
1f4d0 0a 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  .  rc = SQLITE_O
1f4e0 4b 3b 0a 23 65 6c 69 66 20 48 41 56 45 5f 46 55  K;.#elif HAVE_FU
1f4f0 4c 4c 46 53 59 4e 43 0a 20 20 69 66 28 20 66 75  LLFSYNC.  if( fu
1f500 6c 6c 53 79 6e 63 20 29 7b 0a 23 69 66 64 65 66  llSync ){.#ifdef
1f510 20 53 51 4c 49 54 45 5f 55 53 45 5f 52 45 51 55   SQLITE_USE_REQU
1f520 45 53 54 5f 46 55 4c 4c 46 53 59 4e 43 0a 20 20  EST_FULLFSYNC.  
1f530 20 20 72 63 20 3d 20 6f 73 46 73 79 6e 63 28 66    rc = osFsync(f
1f540 64 29 3b 0a 20 20 20 20 69 66 20 28 21 72 63 29  d);.    if (!rc)
1f550 20 7b 0a 20 20 20 20 20 20 4f 53 53 70 69 6e 4c   {.      OSSpinL
1f560 6f 63 6b 4c 6f 63 6b 28 26 6e 6f 74 69 66 79 5f  ockLock(&notify_
1f570 6c 6f 63 6b 29 3b 0a 20 20 20 20 20 20 72 63 20  lock);.      rc 
1f580 3d 20 6e 6f 74 69 66 79 5f 70 6f 73 74 28 52 45  = notify_post(RE
1f590 51 55 45 53 54 5f 46 55 4c 4c 53 59 4e 43 5f 4e  QUEST_FULLSYNC_N
1f5a0 4f 54 49 46 49 43 41 54 49 4f 4e 29 3b 0a 20 20  OTIFICATION);.  
1f5b0 20 20 20 20 4f 53 53 70 69 6e 4c 6f 63 6b 55 6e      OSSpinLockUn
1f5c0 6c 6f 63 6b 28 26 6e 6f 74 69 66 79 5f 6c 6f 63  lock(&notify_loc
1f5d0 6b 29 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a  k);.    }.#else.
1f5e0 20 20 20 20 72 63 20 3d 20 6f 73 46 63 6e 74 6c      rc = osFcntl
1f5f0 28 66 64 2c 20 46 5f 46 55 4c 4c 46 53 59 4e 43  (fd, F_FULLFSYNC
1f600 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  , 0);.#endif.  }
1f610 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 31  else{.    rc = 1
1f620 3b 0a 20 20 7d 0a 20 20 2f 2a 20 49 66 20 74 68  ;.  }.  /* If th
1f630 65 20 46 55 4c 4c 46 53 59 4e 43 20 66 61 69 6c  e FULLFSYNC fail
1f640 65 64 2c 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f  ed, fall back to
1f650 20 61 74 74 65 6d 70 74 69 6e 67 20 61 6e 20 66   attempting an f
1f660 73 79 6e 63 28 29 2e 0a 20 20 2a 2a 20 49 74 20  sync()..  ** It 
1f670 73 68 6f 75 6c 64 6e 27 74 20 62 65 20 70 6f 73  shouldn't be pos
1f680 73 69 62 6c 65 20 66 6f 72 20 66 75 6c 6c 66 73  sible for fullfs
1f690 79 6e 63 20 74 6f 20 66 61 69 6c 20 6f 6e 20 74  ync to fail on t
1f6a0 68 65 20 6c 6f 63 61 6c 20 0a 20 20 2a 2a 20 66  he local .  ** f
1f6b0 69 6c 65 20 73 79 73 74 65 6d 20 28 6f 6e 20 4f  ile system (on O
1f6c0 53 58 29 2c 20 73 6f 20 66 61 69 6c 75 72 65 20  SX), so failure 
1f6d0 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 46  indicates that F
1f6e0 55 4c 4c 46 53 59 4e 43 0a 20 20 2a 2a 20 69 73  ULLFSYNC.  ** is
1f6f0 6e 27 74 20 73 75 70 70 6f 72 74 65 64 20 66 6f  n't supported fo
1f700 72 20 74 68 69 73 20 66 69 6c 65 20 73 79 73 74  r this file syst
1f710 65 6d 2e 20 53 6f 2c 20 61 74 74 65 6d 70 74 20  em. So, attempt 
1f720 61 6e 20 66 73 79 6e 63 20 0a 20 20 2a 2a 20 61  an fsync .  ** a
1f730 6e 64 20 28 66 6f 72 20 6e 6f 77 29 20 69 67 6e  nd (for now) ign
1f740 6f 72 65 20 74 68 65 20 6f 76 65 72 68 65 61 64  ore the overhead
1f750 20 6f 66 20 61 20 73 75 70 65 72 66 6c 75 6f 75   of a superfluou
1f760 73 20 66 63 6e 74 6c 20 63 61 6c 6c 2e 20 20 0a  s fcntl call.  .
1f770 20 20 2a 2a 20 49 74 27 64 20 62 65 20 62 65 74    ** It'd be bet
1f780 74 65 72 20 74 6f 20 64 65 74 65 63 74 20 66 75  ter to detect fu
1f790 6c 6c 66 73 79 6e 63 20 73 75 70 70 6f 72 74 20  llfsync support 
1f7a0 6f 6e 63 65 20 61 6e 64 20 61 76 6f 69 64 20 0a  once and avoid .
1f7b0 20 20 2a 2a 20 74 68 65 20 66 63 6e 74 6c 20 63    ** the fcntl c
1f7c0 61 6c 6c 20 65 76 65 72 79 20 74 69 6d 65 20 73  all every time s
1f7d0 79 6e 63 20 69 73 20 63 61 6c 6c 65 64 2e 0a 20  ync is called.. 
1f7e0 20 2a 2f 0a 20 20 69 66 28 20 72 63 20 29 20 72   */.  if( rc ) r
1f7f0 63 20 3d 20 66 73 79 6e 63 28 66 64 29 3b 0a 0a  c = fsync(fd);..
1f800 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  #elif defined(__
1f810 41 50 50 4c 45 5f 5f 29 0a 20 20 2f 2a 20 66 64  APPLE__).  /* fd
1f820 61 74 61 73 79 6e 63 28 29 20 6f 6e 20 48 46 53  atasync() on HFS
1f830 2b 20 64 6f 65 73 6e 27 74 20 79 65 74 20 66 6c  + doesn't yet fl
1f840 75 73 68 20 74 68 65 20 66 69 6c 65 20 73 69 7a  ush the file siz
1f850 65 20 69 66 20 69 74 20 63 68 61 6e 67 65 64 20  e if it changed 
1f860 63 6f 72 72 65 63 74 6c 79 0a 20 20 2a 2a 20 73  correctly.  ** s
1f870 6f 20 63 75 72 72 65 6e 74 6c 79 20 77 65 20 64  o currently we d
1f880 65 66 61 75 6c 74 20 74 6f 20 74 68 65 20 6d 61  efault to the ma
1f890 63 72 6f 20 74 68 61 74 20 72 65 64 65 66 69 6e  cro that redefin
1f8a0 65 73 20 66 64 61 74 61 73 79 6e 63 20 74 6f 20  es fdatasync to 
1f8b0 66 73 79 6e 63 0a 20 20 2a 2f 0a 20 20 72 63 20  fsync.  */.  rc 
1f8c0 3d 20 66 73 79 6e 63 28 66 64 29 3b 0a 23 65 6c  = fsync(fd);.#el
1f8d0 73 65 20 0a 20 20 72 63 20 3d 20 66 64 61 74 61  se .  rc = fdata
1f8e0 73 79 6e 63 28 66 64 29 3b 0a 23 69 66 20 4f 53  sync(fd);.#if OS
1f8f0 5f 56 58 57 4f 52 4b 53 0a 20 20 69 66 28 20 72  _VXWORKS.  if( r
1f900 63 3d 3d 2d 31 20 26 26 20 65 72 72 6e 6f 3d 3d  c==-1 && errno==
1f910 45 4e 4f 54 53 55 50 20 29 7b 0a 20 20 20 20 72  ENOTSUP ){.    r
1f920 63 20 3d 20 66 73 79 6e 63 28 66 64 29 3b 0a 20  c = fsync(fd);. 
1f930 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f   }.#endif /* OS_
1f940 56 58 57 4f 52 4b 53 20 2a 2f 0a 23 65 6e 64 69  VXWORKS */.#endi
1f950 66 20 2f 2a 20 69 66 64 65 66 20 53 51 4c 49 54  f /* ifdef SQLIT
1f960 45 5f 4e 4f 5f 53 59 4e 43 20 65 6c 69 66 20 48  E_NO_SYNC elif H
1f970 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 2a 2f  AVE_FULLFSYNC */
1f980 0a 0a 20 20 69 66 28 20 4f 53 5f 56 58 57 4f 52  ..  if( OS_VXWOR
1f990 4b 53 20 26 26 20 72 63 21 3d 20 2d 31 20 29 7b  KS && rc!= -1 ){
1f9a0 0a 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 7d  .    rc = 0;.  }
1f9b0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1f9c0 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 66 69  ./*.** Open a fi
1f9d0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f  le descriptor to
1f9e0 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 63   the directory c
1f9f0 6f 6e 74 61 69 6e 69 6e 67 20 66 69 6c 65 20 7a  ontaining file z
1fa00 46 69 6c 65 6e 61 6d 65 2e 0a 2a 2a 20 49 66 20  Filename..** If 
1fa10 73 75 63 63 65 73 73 66 75 6c 2c 20 2a 70 46 64  successful, *pFd
1fa20 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6f   is set to the o
1fa30 70 65 6e 65 64 20 66 69 6c 65 20 64 65 73 63 72  pened file descr
1fa40 69 70 74 6f 72 20 61 6e 64 0a 2a 2a 20 53 51 4c  iptor and.** SQL
1fa50 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
1fa60 65 64 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  ed. If an error 
1fa70 6f 63 63 75 72 73 2c 20 65 69 74 68 65 72 20 53  occurs, either S
1fa80 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 6f  QLITE_NOMEM.** o
1fa90 72 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  r SQLITE_CANTOPE
1faa0 4e 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  N is returned an
1fab0 64 20 2a 70 46 64 20 69 73 20 73 65 74 20 74 6f  d *pFd is set to
1fac0 20 61 6e 20 75 6e 64 65 66 69 6e 65 64 0a 2a 2a   an undefined.**
1fad0 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54 68   value..**.** Th
1fae0 65 20 64 69 72 65 63 74 6f 72 79 20 66 69 6c 65  e directory file
1faf0 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 75   descriptor is u
1fb00 73 65 64 20 66 6f 72 20 6f 6e 6c 79 20 6f 6e 65  sed for only one
1fb10 20 74 68 69 6e 67 20 2d 20 74 6f 0a 2a 2a 20 66   thing - to.** f
1fb20 73 79 6e 63 28 29 20 61 20 64 69 72 65 63 74 6f  sync() a directo
1fb30 72 79 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ry to make sure 
1fb40 66 69 6c 65 20 63 72 65 61 74 69 6f 6e 20 61 6e  file creation an
1fb50 64 20 64 65 6c 65 74 69 6f 6e 20 65 76 65 6e 74  d deletion event
1fb60 73 0a 2a 2a 20 61 72 65 20 66 6c 75 73 68 65 64  s.** are flushed
1fb70 20 74 6f 20 64 69 73 6b 2e 20 20 53 75 63 68 20   to disk.  Such 
1fb80 66 73 79 6e 63 73 20 61 72 65 20 6e 6f 74 20 6e  fsyncs are not n
1fb90 65 65 64 65 64 20 6f 6e 20 6e 65 77 65 72 0a 2a  eeded on newer.*
1fba0 2a 20 6a 6f 75 72 6e 61 6c 69 6e 67 20 66 69 6c  * journaling fil
1fbb0 65 73 79 73 74 65 6d 73 2c 20 62 75 74 20 61 72  esystems, but ar
1fbc0 65 20 72 65 71 75 69 72 65 64 20 6f 6e 20 6f 6c  e required on ol
1fbd0 64 65 72 20 66 69 6c 65 73 79 73 74 65 6d 73 2e  der filesystems.
1fbe0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
1fbf0 69 6e 65 20 63 61 6e 20 62 65 20 6f 76 65 72 72  ine can be overr
1fc00 69 64 64 65 6e 20 75 73 69 6e 67 20 74 68 65 20  idden using the 
1fc10 78 53 65 74 53 79 73 43 61 6c 6c 20 69 6e 74 65  xSetSysCall inte
1fc20 72 66 61 63 65 2e 0a 2a 2a 20 54 68 65 20 61 62  rface..** The ab
1fc30 69 6c 69 74 79 20 74 6f 20 6f 76 65 72 72 69 64  ility to overrid
1fc40 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  e this routine w
1fc50 61 73 20 61 64 64 65 64 20 69 6e 20 73 75 70 70  as added in supp
1fc60 6f 72 74 20 6f 66 20 74 68 65 0a 2a 2a 20 63 68  ort of the.** ch
1fc70 72 6f 6d 69 75 6d 20 73 61 6e 64 62 6f 78 2e 20  romium sandbox. 
1fc80 20 4f 70 65 6e 69 6e 67 20 61 20 64 69 72 65 63   Opening a direc
1fc90 74 6f 72 79 20 69 73 20 61 20 73 65 63 75 72 69  tory is a securi
1fca0 74 79 20 72 69 73 6b 20 28 77 65 20 61 72 65 0a  ty risk (we are.
1fcb0 2a 2a 20 74 6f 6c 64 29 20 73 6f 20 6d 61 6b 69  ** told) so maki
1fcc0 6e 67 20 69 74 20 6f 76 65 72 72 69 64 65 61 62  ng it overrideab
1fcd0 6c 65 20 61 6c 6c 6f 77 73 20 74 68 65 20 63 68  le allows the ch
1fce0 72 6f 6d 69 75 6d 20 73 61 6e 64 62 6f 78 20 74  romium sandbox t
1fcf0 6f 0a 2a 2a 20 72 65 70 6c 61 63 65 20 74 68 69  o.** replace thi
1fd00 73 20 72 6f 75 74 69 6e 65 20 77 69 74 68 20 61  s routine with a
1fd10 20 68 61 72 6d 6c 65 73 73 20 6e 6f 2d 6f 70 2e   harmless no-op.
1fd20 20 20 54 6f 20 6d 61 6b 65 20 74 68 69 73 20 72    To make this r
1fd30 6f 75 74 69 6e 65 0a 2a 2a 20 61 20 6e 6f 2d 6f  outine.** a no-o
1fd40 70 2c 20 72 65 70 6c 61 63 65 20 69 74 20 77 69  p, replace it wi
1fd50 74 68 20 61 20 73 74 75 62 20 74 68 61 74 20 72  th a stub that r
1fd60 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b  eturns SQLITE_OK
1fd70 20 62 75 74 20 6c 65 61 76 65 73 0a 2a 2a 20 2a   but leaves.** *
1fd80 70 46 64 20 73 65 74 20 74 6f 20 61 20 6e 65 67  pFd set to a neg
1fd90 61 74 69 76 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a  ative number..**
1fda0 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 4f 4b  .** If SQLITE_OK
1fdb0 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68   is returned, th
1fdc0 65 20 63 61 6c 6c 65 72 20 69 73 20 72 65 73 70  e caller is resp
1fdd0 6f 6e 73 69 62 6c 65 20 66 6f 72 20 63 6c 6f 73  onsible for clos
1fde0 69 6e 67 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20  ing.** the file 
1fdf0 64 65 73 63 72 69 70 74 6f 72 20 2a 70 46 64 20  descriptor *pFd 
1fe00 75 73 69 6e 67 20 63 6c 6f 73 65 28 29 2e 0a 2a  using close()..*
1fe10 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 70 65  /.static int ope
1fe20 6e 44 69 72 65 63 74 6f 72 79 28 63 6f 6e 73 74  nDirectory(const
1fe30 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
1fe40 2c 20 69 6e 74 20 2a 70 46 64 29 7b 0a 20 20 69  , int *pFd){.  i
1fe50 6e 74 20 69 69 3b 0a 20 20 69 6e 74 20 66 64 20  nt ii;.  int fd 
1fe60 3d 20 2d 31 3b 0a 20 20 63 68 61 72 20 7a 44 69  = -1;.  char zDi
1fe70 72 6e 61 6d 65 5b 4d 41 58 5f 50 41 54 48 4e 41  rname[MAX_PATHNA
1fe80 4d 45 2b 31 5d 3b 0a 0a 20 20 73 71 6c 69 74 65  ME+1];..  sqlite
1fe90 33 5f 73 6e 70 72 69 6e 74 66 28 4d 41 58 5f 50  3_snprintf(MAX_P
1fea0 41 54 48 4e 41 4d 45 2c 20 7a 44 69 72 6e 61 6d  ATHNAME, zDirnam
1feb0 65 2c 20 22 25 73 22 2c 20 7a 46 69 6c 65 6e 61  e, "%s", zFilena
1fec0 6d 65 29 3b 0a 20 20 66 6f 72 28 69 69 3d 28 69  me);.  for(ii=(i
1fed0 6e 74 29 73 74 72 6c 65 6e 28 7a 44 69 72 6e 61  nt)strlen(zDirna
1fee0 6d 65 29 3b 20 69 69 3e 31 20 26 26 20 7a 44 69  me); ii>1 && zDi
1fef0 72 6e 61 6d 65 5b 69 69 5d 21 3d 27 2f 27 3b 20  rname[ii]!='/'; 
1ff00 69 69 2d 2d 29 3b 0a 20 20 69 66 28 20 69 69 3e  ii--);.  if( ii>
1ff10 30 20 29 7b 0a 20 20 20 20 7a 44 69 72 6e 61 6d  0 ){.    zDirnam
1ff20 65 5b 69 69 5d 20 3d 20 27 5c 30 27 3b 0a 20 20  e[ii] = '\0';.  
1ff30 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70    fd = robust_op
1ff40 65 6e 28 7a 44 69 72 6e 61 6d 65 2c 20 4f 5f 52  en(zDirname, O_R
1ff50 44 4f 4e 4c 59 7c 4f 5f 42 49 4e 41 52 59 2c 20  DONLY|O_BINARY, 
1ff60 30 29 3b 0a 20 20 20 20 69 66 28 20 66 64 3e 3d  0);.    if( fd>=
1ff70 30 20 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41  0 ){.      OSTRA
1ff80 43 45 28 28 22 4f 50 45 4e 44 49 52 20 25 2d 33  CE(("OPENDIR %-3
1ff90 64 20 25 73 5c 6e 22 2c 20 66 64 2c 20 7a 44 69  d %s\n", fd, zDi
1ffa0 72 6e 61 6d 65 29 29 3b 0a 20 20 20 20 7d 0a 20  rname));.    }. 
1ffb0 20 7d 0a 20 20 2a 70 46 64 20 3d 20 66 64 3b 0a   }.  *pFd = fd;.
1ffc0 20 20 72 65 74 75 72 6e 20 28 66 64 3e 3d 30 3f    return (fd>=0?
1ffd0 53 51 4c 49 54 45 5f 4f 4b 3a 75 6e 69 78 4c 6f  SQLITE_OK:unixLo
1ffe0 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41  gError(SQLITE_CA
1fff0 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c 20 22 6f 70  NTOPEN_BKPT, "op
20000 65 6e 22 2c 20 7a 44 69 72 6e 61 6d 65 29 29 3b  en", zDirname));
20010 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73  .}../*.** Make s
20020 75 72 65 20 61 6c 6c 20 77 72 69 74 65 73 20 74  ure all writes t
20030 6f 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 66  o a particular f
20040 69 6c 65 20 61 72 65 20 63 6f 6d 6d 69 74 74 65  ile are committe
20050 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a  d to disk..**.**
20060 20 49 66 20 64 61 74 61 4f 6e 6c 79 3d 3d 30 20   If dataOnly==0 
20070 74 68 65 6e 20 62 6f 74 68 20 74 68 65 20 66 69  then both the fi
20080 6c 65 20 69 74 73 65 6c 66 20 61 6e 64 20 69 74  le itself and it
20090 73 20 6d 65 74 61 64 61 74 61 20 28 66 69 6c 65  s metadata (file
200a0 0a 2a 2a 20 73 69 7a 65 2c 20 61 63 63 65 73 73  .** size, access
200b0 20 74 69 6d 65 2c 20 65 74 63 29 20 61 72 65 20   time, etc) are 
200c0 73 79 6e 63 65 64 2e 20 20 49 66 20 64 61 74 61  synced.  If data
200d0 4f 6e 6c 79 21 3d 30 20 74 68 65 6e 20 6f 6e 6c  Only!=0 then onl
200e0 79 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 64 61  y the.** file da
200f0 74 61 20 69 73 20 73 79 6e 63 65 64 2e 0a 2a 2a  ta is synced..**
20100 0a 2a 2a 20 55 6e 64 65 72 20 55 6e 69 78 2c 20  .** Under Unix, 
20110 61 6c 73 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  also make sure t
20120 68 61 74 20 74 68 65 20 64 69 72 65 63 74 6f 72  hat the director
20130 79 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20  y entry for the 
20140 66 69 6c 65 0a 2a 2a 20 68 61 73 20 62 65 65 6e  file.** has been
20150 20 63 72 65 61 74 65 64 20 62 79 20 66 73 79 6e   created by fsyn
20160 63 2d 69 6e 67 20 74 68 65 20 64 69 72 65 63 74  c-ing the direct
20170 6f 72 79 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  ory that contain
20180 73 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 20 49  s the file..** I
20190 66 20 77 65 20 64 6f 20 6e 6f 74 20 64 6f 20 74  f we do not do t
201a0 68 69 73 20 61 6e 64 20 77 65 20 65 6e 63 6f 75  his and we encou
201b0 6e 74 65 72 20 61 20 70 6f 77 65 72 20 66 61 69  nter a power fai
201c0 6c 75 72 65 2c 20 74 68 65 20 64 69 72 65 63 74  lure, the direct
201d0 6f 72 79 0a 2a 2a 20 65 6e 74 72 79 20 66 6f 72  ory.** entry for
201e0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67   the journal mig
201f0 68 74 20 6e 6f 74 20 65 78 69 73 74 20 61 66 74  ht not exist aft
20200 65 72 20 77 65 20 72 65 62 6f 6f 74 2e 20 20 54  er we reboot.  T
20210 68 65 20 6e 65 78 74 0a 2a 2a 20 53 51 4c 69 74  he next.** SQLit
20220 65 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20  e to access the 
20230 66 69 6c 65 20 77 69 6c 6c 20 6e 6f 74 20 6b 6e  file will not kn
20240 6f 77 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72  ow that the jour
20250 6e 61 6c 20 65 78 69 73 74 73 20 28 62 65 63 61  nal exists (beca
20260 75 73 65 0a 2a 2a 20 74 68 65 20 64 69 72 65 63  use.** the direc
20270 74 6f 72 79 20 65 6e 74 72 79 20 66 6f 72 20 74  tory entry for t
20280 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 6e  he journal was n
20290 65 76 65 72 20 63 72 65 61 74 65 64 29 20 61 6e  ever created) an
202a0 64 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  d the transactio
202b0 6e 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 72 6f  n.** will not ro
202c0 6c 6c 20 62 61 63 6b 20 2d 20 70 6f 73 73 69 62  ll back - possib
202d0 6c 79 20 6c 65 61 64 69 6e 67 20 74 6f 20 64 61  ly leading to da
202e0 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
202f0 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
20300 20 75 6e 69 78 53 79 6e 63 28 73 71 6c 69 74 65   unixSync(sqlite
20310 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
20320 66 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20 72 63  flags){.  int rc
20330 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  ;.  unixFile *pF
20340 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
20350 29 69 64 3b 0a 0a 20 20 69 6e 74 20 69 73 44 61  )id;..  int isDa
20360 74 61 4f 6e 6c 79 20 3d 20 28 66 6c 61 67 73 26  taOnly = (flags&
20370 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54 41  SQLITE_SYNC_DATA
20380 4f 4e 4c 59 29 3b 0a 20 20 69 6e 74 20 69 73 46  ONLY);.  int isF
20390 75 6c 6c 73 79 6e 63 20 3d 20 28 66 6c 61 67 73  ullsync = (flags
203a0 26 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53  &0x0F)==SQLITE_S
203b0 59 4e 43 5f 46 55 4c 4c 3b 0a 0a 20 20 2f 2a 20  YNC_FULL;..  /* 
203c0 43 68 65 63 6b 20 74 68 61 74 20 6f 6e 65 20 6f  Check that one o
203d0 66 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f  f SQLITE_SYNC_NO
203e0 52 4d 41 4c 20 6f 72 20 46 55 4c 4c 20 77 61 73  RMAL or FULL was
203f0 20 70 61 73 73 65 64 20 2a 2f 0a 20 20 61 73 73   passed */.  ass
20400 65 72 74 28 28 66 6c 61 67 73 26 30 78 30 46 29  ert((flags&0x0F)
20410 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f  ==SQLITE_SYNC_NO
20420 52 4d 41 4c 0a 20 20 20 20 20 20 7c 7c 20 28 66  RMAL.      || (f
20430 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51 4c 49  lags&0x0F)==SQLI
20440 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 0a 20 20 29  TE_SYNC_FULL.  )
20450 3b 0a 0a 20 20 2f 2a 20 55 6e 69 78 20 63 61 6e  ;..  /* Unix can
20460 6e 6f 74 2c 20 62 75 74 20 73 6f 6d 65 20 73 79  not, but some sy
20470 73 74 65 6d 73 20 6d 61 79 20 72 65 74 75 72 6e  stems may return
20480 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 66 72 6f   SQLITE_FULL fro
20490 6d 20 68 65 72 65 2e 20 54 68 69 73 0a 20 20 2a  m here. This.  *
204a0 2a 20 6c 69 6e 65 20 69 73 20 74 6f 20 74 65 73  * line is to tes
204b0 74 20 74 68 61 74 20 64 6f 69 6e 67 20 73 6f 20  t that doing so 
204c0 64 6f 65 73 20 6e 6f 74 20 63 61 75 73 65 20 61  does not cause a
204d0 6e 79 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 2a  ny problems..  *
204e0 2f 0a 20 20 53 69 6d 75 6c 61 74 65 44 69 73 6b  /.  SimulateDisk
204f0 66 75 6c 6c 45 72 72 6f 72 28 20 72 65 74 75 72  fullError( retur
20500 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 3b  n SQLITE_FULL );
20510 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  ..  assert( pFil
20520 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  e );.  OSTRACE((
20530 22 53 59 4e 43 20 20 20 20 25 2d 33 64 5c 6e 22  "SYNC    %-3d\n"
20540 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20  , pFile->h));.  
20550 72 63 20 3d 20 66 75 6c 6c 5f 66 73 79 6e 63 28  rc = full_fsync(
20560 70 46 69 6c 65 2d 3e 68 2c 20 69 73 46 75 6c 6c  pFile->h, isFull
20570 73 79 6e 63 2c 20 69 73 44 61 74 61 4f 6e 6c 79  sync, isDataOnly
20580 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  );.  SimulateIOE
20590 72 72 6f 72 28 20 72 63 3d 31 20 29 3b 0a 20 20  rror( rc=1 );.  
205a0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 73 74  if( rc ){.    st
205b0 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69  oreLastErrno(pFi
205c0 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20  le, errno);.    
205d0 72 65 74 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72  return unixLogEr
205e0 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
205f0 5f 46 53 59 4e 43 2c 20 22 66 75 6c 6c 5f 66 73  _FSYNC, "full_fs
20600 79 6e 63 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61  ync", pFile->zPa
20610 74 68 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41  th);.  }..  /* A
20620 6c 73 6f 20 66 73 79 6e 63 20 74 68 65 20 64 69  lso fsync the di
20630 72 65 63 74 6f 72 79 20 63 6f 6e 74 61 69 6e 69  rectory containi
20640 6e 67 20 74 68 65 20 66 69 6c 65 20 69 66 20 74  ng the file if t
20650 68 65 20 44 49 52 53 59 4e 43 20 66 6c 61 67 0a  he DIRSYNC flag.
20660 20 20 2a 2a 20 69 73 20 73 65 74 2e 20 20 54 68    ** is set.  Th
20670 69 73 20 69 73 20 61 20 6f 6e 65 2d 74 69 6d 65  is is a one-time
20680 20 6f 63 63 75 72 72 65 6e 63 65 2e 20 20 4d 61   occurrence.  Ma
20690 6e 79 20 73 79 73 74 65 6d 73 20 28 65 78 61 6d  ny systems (exam
206a0 70 6c 65 73 3a 20 41 49 58 29 0a 20 20 2a 2a 20  ples: AIX).  ** 
206b0 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 66 73  are unable to fs
206c0 79 6e 63 20 61 20 64 69 72 65 63 74 6f 72 79 2c  ync a directory,
206d0 20 73 6f 20 69 67 6e 6f 72 65 20 65 72 72 6f 72   so ignore error
206e0 73 20 6f 6e 20 74 68 65 20 66 73 79 6e 63 2e 0a  s on the fsync..
206f0 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65    */.  if( pFile
20700 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e  ->ctrlFlags & UN
20710 49 58 46 49 4c 45 5f 44 49 52 53 59 4e 43 20 29  IXFILE_DIRSYNC )
20720 7b 0a 20 20 20 20 69 6e 74 20 64 69 72 66 64 3b  {.    int dirfd;
20730 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 44  .    OSTRACE(("D
20740 49 52 53 59 4e 43 20 25 73 20 28 68 61 76 65 5f  IRSYNC %s (have_
20750 66 75 6c 6c 66 73 79 6e 63 3d 25 64 20 66 75 6c  fullfsync=%d ful
20760 6c 73 79 6e 63 3d 25 64 29 5c 6e 22 2c 20 70 46  lsync=%d)\n", pF
20770 69 6c 65 2d 3e 7a 50 61 74 68 2c 0a 20 20 20 20  ile->zPath,.    
20780 20 20 20 20 20 20 20 20 48 41 56 45 5f 46 55 4c          HAVE_FUL
20790 4c 46 53 59 4e 43 2c 20 69 73 46 75 6c 6c 73 79  LFSYNC, isFullsy
207a0 6e 63 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 6f  nc));.    rc = o
207b0 73 4f 70 65 6e 44 69 72 65 63 74 6f 72 79 28 70  sOpenDirectory(p
207c0 46 69 6c 65 2d 3e 7a 50 61 74 68 2c 20 26 64 69  File->zPath, &di
207d0 72 66 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63  rfd);.    if( rc
207e0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 64  ==SQLITE_OK && d
207f0 69 72 66 64 3e 3d 30 20 29 7b 0a 20 20 20 20 20  irfd>=0 ){.     
20800 20 66 75 6c 6c 5f 66 73 79 6e 63 28 64 69 72 66   full_fsync(dirf
20810 64 2c 20 30 2c 20 30 29 3b 0a 23 69 66 20 4f 53  d, 0, 0);.#if OS
20820 43 4c 4f 53 45 5f 43 48 45 43 4b 5f 43 4c 4f 53  CLOSE_CHECK_CLOS
20830 45 5f 49 4f 45 52 52 0a 20 20 20 20 20 20 69 66  E_IOERR.      if
20840 28 20 63 6c 6f 73 65 28 70 46 69 6c 65 2d 3e 64  ( close(pFile->d
20850 69 72 66 64 29 20 29 7b 0a 20 20 20 20 20 20 20  irfd) ){.       
20860 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28   storeLastErrno(
20870 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 20  pFile, errno);. 
20880 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
20890 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f 43 4c 4f  TE_IOERR_DIR_CLO
208a0 53 45 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6c 73  SE;.      }.#els
208b0 65 0a 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63  e.      robust_c
208c0 6c 6f 73 65 28 70 46 69 6c 65 2c 20 64 69 72 66  lose(pFile, dirf
208d0 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 23 65  d, __LINE__);.#e
208e0 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 20 69  ndif.    }else i
208f0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 41  f( rc==SQLITE_CA
20900 4e 54 4f 50 45 4e 20 29 7b 0a 20 20 20 20 20 20  NTOPEN ){.      
20910 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
20920 20 20 20 20 7d 0a 20 20 20 20 70 46 69 6c 65 2d      }.    pFile-
20930 3e 63 74 72 6c 46 6c 61 67 73 20 26 3d 20 7e 55  >ctrlFlags &= ~U
20940 4e 49 58 46 49 4c 45 5f 44 49 52 53 59 4e 43 3b  NIXFILE_DIRSYNC;
20950 0a 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ..  }.  return r
20960 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e  c;.}../*.** Trun
20970 63 61 74 65 20 61 6e 20 6f 70 65 6e 20 66 69 6c  cate an open fil
20980 65 20 74 6f 20 61 20 73 70 65 63 69 66 69 65 64  e to a specified
20990 20 73 69 7a 65 0a 2a 2f 0a 73 74 61 74 69 63 20   size.*/.static 
209a0 69 6e 74 20 75 6e 69 78 54 72 75 6e 63 61 74 65  int unixTruncate
209b0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
209c0 64 2c 20 69 36 34 20 6e 42 79 74 65 29 7b 0a 20  d, i64 nByte){. 
209d0 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
209e0 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 69   = (unixFile *)i
209f0 64 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61  d;.  int rc;.  a
20a00 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
20a10 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
20a20 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r( return SQLITE
20a30 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 20  _IOERR_TRUNCATE 
20a40 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
20a50 75 73 65 72 20 68 61 73 20 63 6f 6e 66 69 67 75  user has configu
20a60 72 65 64 20 61 20 63 68 75 6e 6b 2d 73 69 7a 65  red a chunk-size
20a70 20 66 6f 72 20 74 68 69 73 20 66 69 6c 65 2c 20   for this file, 
20a80 74 72 75 6e 63 61 74 65 20 74 68 65 0a 20 20 2a  truncate the.  *
20a90 2a 20 66 69 6c 65 20 73 6f 20 74 68 61 74 20 69  * file so that i
20aa0 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 6e  t consists of an
20ab0 20 69 6e 74 65 67 65 72 20 6e 75 6d 62 65 72 20   integer number 
20ac0 6f 66 20 63 68 75 6e 6b 73 20 28 69 2e 65 2e 20  of chunks (i.e. 
20ad0 74 68 65 0a 20 20 2a 2a 20 61 63 74 75 61 6c 20  the.  ** actual 
20ae0 66 69 6c 65 20 73 69 7a 65 20 61 66 74 65 72 20  file size after 
20af0 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 6d 61  the operation ma
20b00 79 20 62 65 20 6c 61 72 67 65 72 20 74 68 61 6e  y be larger than
20b10 20 74 68 65 20 72 65 71 75 65 73 74 65 64 0a 20   the requested. 
20b20 20 2a 2a 20 73 69 7a 65 29 2e 0a 20 20 2a 2f 0a   ** size)..  */.
20b30 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 73 7a 43    if( pFile->szC
20b40 68 75 6e 6b 3e 30 20 29 7b 0a 20 20 20 20 6e 42  hunk>0 ){.    nB
20b50 79 74 65 20 3d 20 28 28 6e 42 79 74 65 20 2b 20  yte = ((nByte + 
20b60 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20 2d  pFile->szChunk -
20b70 20 31 29 2f 70 46 69 6c 65 2d 3e 73 7a 43 68 75   1)/pFile->szChu
20b80 6e 6b 29 20 2a 20 70 46 69 6c 65 2d 3e 73 7a 43  nk) * pFile->szC
20b90 68 75 6e 6b 3b 0a 20 20 7d 0a 0a 20 20 72 63 20  hunk;.  }..  rc 
20ba0 3d 20 72 6f 62 75 73 74 5f 66 74 72 75 6e 63 61  = robust_ftrunca
20bb0 74 65 28 70 46 69 6c 65 2d 3e 68 2c 20 6e 42 79  te(pFile->h, nBy
20bc0 74 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  te);.  if( rc ){
20bd0 0a 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72  .    storeLastEr
20be0 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f  rno(pFile, errno
20bf0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 75 6e  );.    return un
20c00 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  ixLogError(SQLIT
20c10 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45  E_IOERR_TRUNCATE
20c20 2c 20 22 66 74 72 75 6e 63 61 74 65 22 2c 20 70  , "ftruncate", p
20c30 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  File->zPath);.  
20c40 7d 65 6c 73 65 7b 0a 23 69 66 64 65 66 20 53 51  }else{.#ifdef SQ
20c50 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 2f  LITE_DEBUG.    /
20c60 2a 20 49 66 20 77 65 20 61 72 65 20 64 6f 69 6e  * If we are doin
20c70 67 20 61 20 6e 6f 72 6d 61 6c 20 77 72 69 74 65  g a normal write
20c80 20 74 6f 20 61 20 64 61 74 61 62 61 73 65 20 66   to a database f
20c90 69 6c 65 20 28 61 73 20 6f 70 70 6f 73 65 64 20  ile (as opposed 
20ca0 74 6f 0a 20 20 20 20 2a 2a 20 64 6f 69 6e 67 20  to.    ** doing 
20cb0 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  a hot-journal ro
20cc0 6c 6c 62 61 63 6b 20 6f 72 20 61 20 77 72 69 74  llback or a writ
20cd0 65 20 74 6f 20 73 6f 6d 65 20 66 69 6c 65 20 6f  e to some file o
20ce0 74 68 65 72 20 74 68 61 6e 20 61 0a 20 20 20 20  ther than a.    
20cf0 2a 2a 20 6e 6f 72 6d 61 6c 20 64 61 74 61 62 61  ** normal databa
20d00 73 65 20 66 69 6c 65 29 20 61 6e 64 20 77 65 20  se file) and we 
20d10 74 72 75 6e 63 61 74 65 20 74 68 65 20 66 69 6c  truncate the fil
20d20 65 20 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68  e to zero length
20d30 2c 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 65 66  ,.    ** that ef
20d40 66 65 63 74 69 76 65 6c 79 20 75 70 64 61 74 65  fectively update
20d50 73 20 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75  s the change cou
20d60 6e 74 65 72 2e 20 20 54 68 69 73 20 6d 69 67 68  nter.  This migh
20d70 74 20 68 61 70 70 65 6e 0a 20 20 20 20 2a 2a 20  t happen.    ** 
20d80 77 68 65 6e 20 72 65 73 74 6f 72 69 6e 67 20 61  when restoring a
20d90 20 64 61 74 61 62 61 73 65 20 75 73 69 6e 67 20   database using 
20da0 74 68 65 20 62 61 63 6b 75 70 20 41 50 49 20 66  the backup API f
20db0 72 6f 6d 20 61 20 7a 65 72 6f 2d 6c 65 6e 67 74  rom a zero-lengt
20dc0 68 0a 20 20 20 20 2a 2a 20 73 6f 75 72 63 65 2e  h.    ** source.
20dd0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
20de0 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57  pFile->inNormalW
20df0 72 69 74 65 20 26 26 20 6e 42 79 74 65 3d 3d 30  rite && nByte==0
20e00 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d   ){.      pFile-
20e10 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 20 3d  >transCntrChng =
20e20 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66   1;.    }.#endif
20e30 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  ..#if SQLITE_MAX
20e40 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 20  _MMAP_SIZE>0.   
20e50 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20   /* If the file 
20e60 77 61 73 20 6a 75 73 74 20 74 72 75 6e 63 61 74  was just truncat
20e70 65 64 20 74 6f 20 61 20 73 69 7a 65 20 73 6d 61  ed to a size sma
20e80 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20 63 75  ller than the cu
20e90 72 72 65 6e 74 6c 79 0a 20 20 20 20 2a 2a 20 6d  rrently.    ** m
20ea0 61 70 70 65 64 20 72 65 67 69 6f 6e 2c 20 72 65  apped region, re
20eb0 64 75 63 65 20 74 68 65 20 65 66 66 65 63 74 69  duce the effecti
20ec0 76 65 20 6d 61 70 70 69 6e 67 20 73 69 7a 65 20  ve mapping size 
20ed0 61 73 20 77 65 6c 6c 2e 20 53 51 4c 69 74 65 20  as well. SQLite 
20ee0 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 75 73 65 20  will.    ** use 
20ef0 72 65 61 64 28 29 20 61 6e 64 20 77 72 69 74 65  read() and write
20f00 28 29 20 74 6f 20 61 63 63 65 73 73 20 64 61 74  () to access dat
20f10 61 20 62 65 79 6f 6e 64 20 74 68 69 73 20 70 6f  a beyond this po
20f20 69 6e 74 20 66 72 6f 6d 20 6e 6f 77 20 6f 6e 2e  int from now on.
20f30 20 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66    .    */.    if
20f40 28 20 6e 42 79 74 65 3c 70 46 69 6c 65 2d 3e 6d  ( nByte<pFile->m
20f50 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  mapSize ){.     
20f60 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65   pFile->mmapSize
20f70 20 3d 20 6e 42 79 74 65 3b 0a 20 20 20 20 7d 0a   = nByte;.    }.
20f80 23 65 6e 64 69 66 0a 0a 20 20 20 20 72 65 74 75  #endif..    retu
20f90 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
20fa0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72  }.}../*.** Deter
20fb0 6d 69 6e 65 20 74 68 65 20 63 75 72 72 65 6e 74  mine the current
20fc0 20 73 69 7a 65 20 6f 66 20 61 20 66 69 6c 65 20   size of a file 
20fd0 69 6e 20 62 79 74 65 73 0a 2a 2f 0a 73 74 61 74  in bytes.*/.stat
20fe0 69 63 20 69 6e 74 20 75 6e 69 78 46 69 6c 65 53  ic int unixFileS
20ff0 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ize(sqlite3_file
21000 20 2a 69 64 2c 20 69 36 34 20 2a 70 53 69 7a 65   *id, i64 *pSize
21010 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  ){.  int rc;.  s
21020 74 72 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a  truct stat buf;.
21030 20 20 61 73 73 65 72 74 28 20 69 64 20 29 3b 0a    assert( id );.
21040 20 20 72 63 20 3d 20 6f 73 46 73 74 61 74 28 28    rc = osFstat((
21050 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e  (unixFile*)id)->
21060 68 2c 20 26 62 75 66 29 3b 0a 20 20 53 69 6d 75  h, &buf);.  Simu
21070 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 63 3d  lateIOError( rc=
21080 31 20 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 30  1 );.  if( rc!=0
21090 20 29 7b 0a 20 20 20 20 73 74 6f 72 65 4c 61 73   ){.    storeLas
210a0 74 45 72 72 6e 6f 28 28 75 6e 69 78 46 69 6c 65  tErrno((unixFile
210b0 2a 29 69 64 2c 20 65 72 72 6e 6f 29 3b 0a 20 20  *)id, errno);.  
210c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
210d0 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a 20 20 7d  IOERR_FSTAT;.  }
210e0 0a 20 20 2a 70 53 69 7a 65 20 3d 20 62 75 66 2e  .  *pSize = buf.
210f0 73 74 5f 73 69 7a 65 3b 0a 0a 20 20 2f 2a 20 57  st_size;..  /* W
21100 68 65 6e 20 6f 70 65 6e 69 6e 67 20 61 20 7a 65  hen opening a ze
21110 72 6f 2d 73 69 7a 65 20 64 61 74 61 62 61 73 65  ro-size database
21120 2c 20 74 68 65 20 66 69 6e 64 49 6e 6f 64 65 49  , the findInodeI
21130 6e 66 6f 28 29 20 70 72 6f 63 65 64 75 72 65 0a  nfo() procedure.
21140 20 20 2a 2a 20 77 72 69 74 65 73 20 61 20 73 69    ** writes a si
21150 6e 67 6c 65 20 62 79 74 65 20 69 6e 74 6f 20 74  ngle byte into t
21160 68 61 74 20 66 69 6c 65 20 69 6e 20 6f 72 64 65  hat file in orde
21170 72 20 74 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64  r to work around
21180 20 61 20 62 75 67 0a 20 20 2a 2a 20 69 6e 20 74   a bug.  ** in t
21190 68 65 20 4f 53 2d 58 20 6d 73 64 6f 73 20 66 69  he OS-X msdos fi
211a0 6c 65 73 79 73 74 65 6d 2e 20 20 49 6e 20 6f 72  lesystem.  In or
211b0 64 65 72 20 74 6f 20 61 76 6f 69 64 20 70 72 6f  der to avoid pro
211c0 62 6c 65 6d 73 20 77 69 74 68 20 75 70 70 65 72  blems with upper
211d0 0a 20 20 2a 2a 20 6c 61 79 65 72 73 2c 20 77 65  .  ** layers, we
211e0 20 6e 65 65 64 20 74 6f 20 72 65 70 6f 72 74 20   need to report 
211f0 74 68 69 73 20 66 69 6c 65 20 73 69 7a 65 20 61  this file size a
21200 73 20 7a 65 72 6f 20 65 76 65 6e 20 74 68 6f 75  s zero even thou
21210 67 68 20 69 74 20 69 73 0a 20 20 2a 2a 20 72 65  gh it is.  ** re
21220 61 6c 6c 79 20 31 2e 20 20 20 54 69 63 6b 65 74  ally 1.   Ticket
21230 20 23 33 32 36 30 2e 0a 20 20 2a 2f 0a 20 20 69   #3260..  */.  i
21240 66 28 20 2a 70 53 69 7a 65 3d 3d 31 20 29 20 2a  f( *pSize==1 ) *
21250 70 53 69 7a 65 20 3d 20 30 3b 0a 0a 0a 20 20 72  pSize = 0;...  r
21260 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
21270 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 45  .}..#if SQLITE_E
21280 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
21290 59 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f  YLE && defined(_
212a0 5f 41 50 50 4c 45 5f 5f 29 0a 2f 2a 0a 2a 2a 20  _APPLE__)./*.** 
212b0 48 61 6e 64 6c 65 72 20 66 6f 72 20 70 72 6f 78  Handler for prox
212c0 79 2d 6c 6f 63 6b 69 6e 67 20 66 69 6c 65 2d 63  y-locking file-c
212d0 6f 6e 74 72 6f 6c 20 76 65 72 62 73 2e 20 20 44  ontrol verbs.  D
212e0 65 66 69 6e 65 64 20 62 65 6c 6f 77 20 69 6e 20  efined below in 
212f0 74 68 65 0a 2a 2a 20 70 72 6f 78 79 69 6e 67 20  the.** proxying 
21300 6c 6f 63 6b 69 6e 67 20 64 69 76 69 73 69 6f 6e  locking division
21310 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
21320 70 72 6f 78 79 46 69 6c 65 43 6f 6e 74 72 6f 6c  proxyFileControl
21330 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 69  (sqlite3_file*,i
21340 6e 74 2c 76 6f 69 64 2a 29 3b 0a 23 65 6e 64 69  nt,void*);.#endi
21350 66 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 66  f../* .** This f
21360 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
21370 64 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20  d to handle the 
21380 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a  SQLITE_FCNTL_SIZ
21390 45 5f 48 49 4e 54 20 0a 2a 2a 20 66 69 6c 65 2d  E_HINT .** file-
213a0 63 6f 6e 74 72 6f 6c 20 6f 70 65 72 61 74 69 6f  control operatio
213b0 6e 2e 20 20 45 6e 6c 61 72 67 65 20 74 68 65 20  n.  Enlarge the 
213c0 64 61 74 61 62 61 73 65 20 74 6f 20 6e 42 79 74  database to nByt
213d0 65 73 20 69 6e 20 73 69 7a 65 0a 2a 2a 20 28 72  es in size.** (r
213e0 6f 75 6e 64 65 64 20 75 70 20 74 6f 20 74 68 65  ounded up to the
213f0 20 6e 65 78 74 20 63 68 75 6e 6b 2d 73 69 7a 65   next chunk-size
21400 29 2e 20 20 49 66 20 74 68 65 20 64 61 74 61 62  ).  If the datab
21410 61 73 65 20 69 73 20 61 6c 72 65 61 64 79 0a 2a  ase is already.*
21420 2a 20 6e 42 79 74 65 73 20 6f 72 20 6c 61 72 67  * nBytes or larg
21430 65 72 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  er, this routine
21440 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
21450 73 74 61 74 69 63 20 69 6e 74 20 66 63 6e 74 6c  static int fcntl
21460 53 69 7a 65 48 69 6e 74 28 75 6e 69 78 46 69 6c  SizeHint(unixFil
21470 65 20 2a 70 46 69 6c 65 2c 20 69 36 34 20 6e 42  e *pFile, i64 nB
21480 79 74 65 29 7b 0a 20 20 69 66 28 20 70 46 69 6c  yte){.  if( pFil
21490 65 2d 3e 73 7a 43 68 75 6e 6b 3e 30 20 29 7b 0a  e->szChunk>0 ){.
214a0 20 20 20 20 69 36 34 20 6e 53 69 7a 65 3b 20 20      i64 nSize;  
214b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
214c0 20 20 2f 2a 20 52 65 71 75 69 72 65 64 20 66 69    /* Required fi
214d0 6c 65 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 73  le size */.    s
214e0 74 72 75 63 74 20 73 74 61 74 20 62 75 66 3b 20  truct stat buf; 
214f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21500 55 73 65 64 20 74 6f 20 68 6f 6c 64 20 72 65 74  Used to hold ret
21510 75 72 6e 20 76 61 6c 75 65 73 20 6f 66 20 66 73  urn values of fs
21520 74 61 74 28 29 20 2a 2f 0a 20 20 20 0a 20 20 20  tat() */.   .   
21530 20 69 66 28 20 6f 73 46 73 74 61 74 28 70 46 69   if( osFstat(pFi
21540 6c 65 2d 3e 68 2c 20 26 62 75 66 29 20 29 7b 0a  le->h, &buf) ){.
21550 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45        storeLastE
21560 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e  rrno(pFile, errn
21570 6f 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  o);.      return
21580 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53   SQLITE_IOERR_FS
21590 54 41 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  TAT;.    }..    
215a0 6e 53 69 7a 65 20 3d 20 28 28 6e 42 79 74 65 2b  nSize = ((nByte+
215b0 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 2d 31  pFile->szChunk-1
215c0 29 20 2f 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75  ) / pFile->szChu
215d0 6e 6b 29 20 2a 20 70 46 69 6c 65 2d 3e 73 7a 43  nk) * pFile->szC
215e0 68 75 6e 6b 3b 0a 20 20 20 20 69 66 28 20 6e 53  hunk;.    if( nS
215f0 69 7a 65 3e 28 69 36 34 29 62 75 66 2e 73 74 5f  ize>(i64)buf.st_
21600 73 69 7a 65 20 29 7b 0a 0a 23 69 66 20 64 65 66  size ){..#if def
21610 69 6e 65 64 28 48 41 56 45 5f 50 4f 53 49 58 5f  ined(HAVE_POSIX_
21620 46 41 4c 4c 4f 43 41 54 45 29 20 26 26 20 48 41  FALLOCATE) && HA
21630 56 45 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f 43 41  VE_POSIX_FALLOCA
21640 54 45 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  TE.      /* The 
21650 63 6f 64 65 20 62 65 6c 6f 77 20 69 73 20 68 61  code below is ha
21660 6e 64 6c 69 6e 67 20 74 68 65 20 72 65 74 75 72  ndling the retur
21670 6e 20 76 61 6c 75 65 20 6f 66 20 6f 73 46 61 6c  n value of osFal
21680 6c 6f 63 61 74 65 28 29 20 0a 20 20 20 20 20 20  locate() .      
21690 2a 2a 20 63 6f 72 72 65 63 74 6c 79 2e 20 70 6f  ** correctly. po
216a0 73 69 78 5f 66 61 6c 6c 6f 63 61 74 65 28 29 20  six_fallocate() 
216b0 69 73 20 64 65 66 69 6e 65 64 20 74 6f 20 22 72  is defined to "r
216c0 65 74 75 72 6e 73 20 7a 65 72 6f 20 6f 6e 20 73  eturns zero on s
216d0 75 63 63 65 73 73 2c 20 0a 20 20 20 20 20 20 2a  uccess, .      *
216e0 2a 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 6e 75  * or an error nu
216f0 6d 62 65 72 20 6f 6e 20 20 66 61 69 6c 75 72 65  mber on  failure
21700 22 2e 20 53 65 65 20 74 68 65 20 6d 61 6e 70 61  ". See the manpa
21710 67 65 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 20  ge for details. 
21720 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 65 72 72  */.      int err
21730 3b 0a 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20  ;.      do{.    
21740 20 20 20 20 65 72 72 20 3d 20 6f 73 46 61 6c 6c      err = osFall
21750 6f 63 61 74 65 28 70 46 69 6c 65 2d 3e 68 2c 20  ocate(pFile->h, 
21760 62 75 66 2e 73 74 5f 73 69 7a 65 2c 20 6e 53 69  buf.st_size, nSi
21770 7a 65 2d 62 75 66 2e 73 74 5f 73 69 7a 65 29 3b  ze-buf.st_size);
21780 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20 65  .      }while( e
21790 72 72 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20 20  rr==EINTR );.   
217a0 20 20 20 69 66 28 20 65 72 72 20 29 20 72 65 74     if( err ) ret
217b0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
217c0 5f 57 52 49 54 45 3b 0a 23 65 6c 73 65 0a 20 20  _WRITE;.#else.  
217d0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 4f 53      /* If the OS
217e0 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 70   does not have p
217f0 6f 73 69 78 5f 66 61 6c 6c 6f 63 61 74 65 28 29  osix_fallocate()
21800 2c 20 66 61 6b 65 20 69 74 2e 20 57 72 69 74 65  , fake it. Write
21810 20 61 20 0a 20 20 20 20 20 20 2a 2a 20 73 69 6e   a .      ** sin
21820 67 6c 65 20 62 79 74 65 20 74 6f 20 74 68 65 20  gle byte to the 
21830 6c 61 73 74 20 62 79 74 65 20 69 6e 20 65 61 63  last byte in eac
21840 68 20 62 6c 6f 63 6b 20 74 68 61 74 20 66 61 6c  h block that fal
21850 6c 73 20 65 6e 74 69 72 65 6c 79 0a 20 20 20 20  ls entirely.    
21860 20 20 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20    ** within the 
21870 65 78 74 65 6e 64 65 64 20 72 65 67 69 6f 6e 2e  extended region.
21880 20 54 68 65 6e 2c 20 69 66 20 72 65 71 75 69 72   Then, if requir
21890 65 64 2c 20 61 20 73 69 6e 67 6c 65 20 62 79 74  ed, a single byt
218a0 65 0a 20 20 20 20 20 20 2a 2a 20 61 74 20 6f 66  e.      ** at of
218b0 66 73 65 74 20 28 6e 53 69 7a 65 2d 31 29 2c 20  fset (nSize-1), 
218c0 74 6f 20 73 65 74 20 74 68 65 20 73 69 7a 65 20  to set the size 
218d0 6f 66 20 74 68 65 20 66 69 6c 65 20 63 6f 72 72  of the file corr
218e0 65 63 74 6c 79 2e 0a 20 20 20 20 20 20 2a 2a 20  ectly..      ** 
218f0 54 68 69 73 20 69 73 20 61 20 73 69 6d 69 6c 61  This is a simila
21900 72 20 74 65 63 68 6e 69 71 75 65 20 74 6f 20 74  r technique to t
21910 68 61 74 20 75 73 65 64 20 62 79 20 67 6c 69 62  hat used by glib
21920 63 20 6f 6e 20 73 79 73 74 65 6d 73 0a 20 20 20  c on systems.   
21930 20 20 20 2a 2a 20 74 68 61 74 20 64 6f 20 6e 6f     ** that do no
21940 74 20 68 61 76 65 20 61 20 72 65 61 6c 20 66 61  t have a real fa
21950 6c 6c 6f 63 61 74 65 28 29 20 63 61 6c 6c 2e 0a  llocate() call..
21960 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
21970 6e 74 20 6e 42 6c 6b 20 3d 20 62 75 66 2e 73 74  nt nBlk = buf.st
21980 5f 62 6c 6b 73 69 7a 65 3b 20 20 2f 2a 20 46 69  _blksize;  /* Fi
21990 6c 65 2d 73 79 73 74 65 6d 20 62 6c 6f 63 6b 20  le-system block 
219a0 73 69 7a 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e  size */.      in
219b0 74 20 6e 57 72 69 74 65 20 3d 20 30 3b 20 20 20  t nWrite = 0;   
219c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
219d0 62 65 72 20 6f 66 20 62 79 74 65 73 20 77 72 69  ber of bytes wri
219e0 74 74 65 6e 20 62 79 20 73 65 65 6b 41 6e 64 57  tten by seekAndW
219f0 72 69 74 65 20 2a 2f 0a 20 20 20 20 20 20 69 36  rite */.      i6
21a00 34 20 69 57 72 69 74 65 3b 20 20 20 20 20 20 20  4 iWrite;       
21a10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78            /* Nex
21a20 74 20 6f 66 66 73 65 74 20 74 6f 20 77 72 69 74  t offset to writ
21a30 65 20 74 6f 20 2a 2f 0a 0a 20 20 20 20 20 20 69  e to */..      i
21a40 66 28 20 72 6f 62 75 73 74 5f 66 74 72 75 6e 63  f( robust_ftrunc
21a50 61 74 65 28 70 46 69 6c 65 2d 3e 68 2c 20 6e 53  ate(pFile->h, nS
21a60 69 7a 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ize) ){.        
21a70 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70  storeLastErrno(p
21a80 46 69 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 20 20  File, errno);.  
21a90 20 20 20 20 20 20 72 65 74 75 72 6e 20 75 6e 69        return uni
21aa0 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  xLogError(SQLITE
21ab0 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 2c  _IOERR_TRUNCATE,
21ac0 20 22 66 74 72 75 6e 63 61 74 65 22 2c 20 70 46   "ftruncate", pF
21ad0 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20  ile->zPath);.   
21ae0 20 20 20 7d 0a 20 20 20 20 20 20 69 57 72 69 74     }.      iWrit
21af0 65 20 3d 20 28 28 62 75 66 2e 73 74 5f 73 69 7a  e = ((buf.st_siz
21b00 65 20 2b 20 32 2a 6e 42 6c 6b 20 2d 20 31 29 2f  e + 2*nBlk - 1)/
21b10 6e 42 6c 6b 29 2a 6e 42 6c 6b 2d 31 3b 0a 20 20  nBlk)*nBlk-1;.  
21b20 20 20 20 20 61 73 73 65 72 74 28 20 69 57 72 69      assert( iWri
21b30 74 65 3e 3d 62 75 66 2e 73 74 5f 73 69 7a 65 20  te>=buf.st_size 
21b40 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
21b50 20 28 69 57 72 69 74 65 2f 6e 42 6c 6b 29 3d 3d   (iWrite/nBlk)==
21b60 28 28 62 75 66 2e 73 74 5f 73 69 7a 65 2b 6e 42  ((buf.st_size+nB
21b70 6c 6b 2d 31 29 2f 6e 42 6c 6b 29 20 29 3b 0a 20  lk-1)/nBlk) );. 
21b80 20 20 20 20 20 61 73 73 65 72 74 28 20 28 28 69       assert( ((i
21b90 57 72 69 74 65 2b 31 29 25 6e 42 6c 6b 29 3d 3d  Write+1)%nBlk)==
21ba0 30 20 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 2f  0 );.      for(/
21bb0 2a 6e 6f 2d 6f 70 2a 2f 3b 20 69 57 72 69 74 65  *no-op*/; iWrite
21bc0 3c 6e 53 69 7a 65 3b 20 69 57 72 69 74 65 2b 3d  <nSize; iWrite+=
21bd0 6e 42 6c 6b 20 29 7b 0a 20 20 20 20 20 20 20 20  nBlk ){.        
21be0 6e 57 72 69 74 65 20 3d 20 73 65 65 6b 41 6e 64  nWrite = seekAnd
21bf0 57 72 69 74 65 28 70 46 69 6c 65 2c 20 69 57 72  Write(pFile, iWr
21c00 69 74 65 2c 20 22 22 2c 20 31 29 3b 0a 20 20 20  ite, "", 1);.   
21c10 20 20 20 20 20 69 66 28 20 6e 57 72 69 74 65 21       if( nWrite!
21c20 3d 31 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =1 ) return SQLI
21c30 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 3b 0a  TE_IOERR_WRITE;.
21c40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
21c50 28 20 6e 57 72 69 74 65 3d 3d 30 20 7c 7c 20 28  ( nWrite==0 || (
21c60 6e 53 69 7a 65 25 6e 42 6c 6b 29 20 29 7b 0a 20  nSize%nBlk) ){. 
21c70 20 20 20 20 20 20 20 6e 57 72 69 74 65 20 3d 20         nWrite = 
21c80 73 65 65 6b 41 6e 64 57 72 69 74 65 28 70 46 69  seekAndWrite(pFi
21c90 6c 65 2c 20 6e 53 69 7a 65 2d 31 2c 20 22 22 2c  le, nSize-1, "",
21ca0 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   1);.        if(
21cb0 20 6e 57 72 69 74 65 21 3d 31 20 29 20 72 65 74   nWrite!=1 ) ret
21cc0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
21cd0 5f 57 52 49 54 45 3b 0a 20 20 20 20 20 20 7d 0a  _WRITE;.      }.
21ce0 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d  #endif.    }.  }
21cf0 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  ..#if SQLITE_MAX
21d00 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 69  _MMAP_SIZE>0.  i
21d10 66 28 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69  f( pFile->mmapSi
21d20 7a 65 4d 61 78 3e 30 20 26 26 20 6e 42 79 74 65  zeMax>0 && nByte
21d30 3e 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65  >pFile->mmapSize
21d40 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a   ){.    int rc;.
21d50 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 73      if( pFile->s
21d60 7a 43 68 75 6e 6b 3c 3d 30 20 29 7b 0a 20 20 20  zChunk<=0 ){.   
21d70 20 20 20 69 66 28 20 72 6f 62 75 73 74 5f 66 74     if( robust_ft
21d80 72 75 6e 63 61 74 65 28 70 46 69 6c 65 2d 3e 68  runcate(pFile->h
21d90 2c 20 6e 42 79 74 65 29 20 29 7b 0a 20 20 20 20  , nByte) ){.    
21da0 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72      storeLastErr
21db0 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29  no(pFile, errno)
21dc0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
21dd0 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51   unixLogError(SQ
21de0 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43  LITE_IOERR_TRUNC
21df0 41 54 45 2c 20 22 66 74 72 75 6e 63 61 74 65 22  ATE, "ftruncate"
21e00 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b  , pFile->zPath);
21e10 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
21e20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4d 61 70      rc = unixMap
21e30 66 69 6c 65 28 70 46 69 6c 65 2c 20 6e 42 79 74  file(pFile, nByt
21e40 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  e);.    return r
21e50 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  c;.  }.#endif.. 
21e60 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
21e70 4b 3b 0a 7d 0a 0a 0a 23 69 66 20 28 53 51 4c 49  K;.}...#if (SQLI
21e80 54 45 5f 45 4e 41 42 4c 45 5f 41 50 50 4c 45 5f  TE_ENABLE_APPLE_
21e90 53 50 49 3e 30 29 20 26 26 20 64 65 66 69 6e 65  SPI>0) && define
21ea0 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 23 69 6e  d(__APPLE__).#in
21eb0 63 6c 75 64 65 20 22 73 71 6c 69 74 65 33 5f 70  clude "sqlite3_p
21ec0 72 69 76 61 74 65 2e 68 22 0a 23 69 6e 63 6c 75  rivate.h".#inclu
21ed0 64 65 20 3c 63 6f 70 79 66 69 6c 65 2e 68 3e 0a  de <copyfile.h>.
21ee0 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
21ef0 47 65 74 44 62 50 61 74 68 46 6f 72 55 6e 69 78  GetDbPathForUnix
21f00 46 69 6c 65 28 75 6e 69 78 46 69 6c 65 20 2a 70  File(unixFile *p
21f10 46 69 6c 65 2c 20 63 68 61 72 20 2a 64 62 50 61  File, char *dbPa
21f20 74 68 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66  th);.#endif..#if
21f30 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
21f40 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 73 74 61  OCKING_STYLE.sta
21f50 74 69 63 20 69 6e 74 20 69 73 50 72 6f 78 79 4c  tic int isProxyL
21f60 6f 63 6b 69 6e 67 4d 6f 64 65 28 75 6e 69 78 46  ockingMode(unixF
21f70 69 6c 65 20 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a  ile *);.#endif..
21f80 23 69 66 20 28 53 51 4c 49 54 45 5f 45 4e 41 42  #if (SQLITE_ENAB
21f90 4c 45 5f 41 50 50 4c 45 5f 53 50 49 3e 30 29 20  LE_APPLE_SPI>0) 
21fa0 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  && defined(__APP
21fb0 4c 45 5f 5f 29 0a 73 74 61 74 69 63 20 69 6e 74  LE__).static int
21fc0 20 75 6e 69 78 54 72 75 6e 63 61 74 65 44 61 74   unixTruncateDat
21fd0 61 62 61 73 65 28 75 6e 69 78 46 69 6c 65 20 2a  abase(unixFile *
21fe0 2c 20 69 6e 74 29 3b 0a 0a 73 74 61 74 69 63 20  , int);..static 
21ff0 69 6e 74 20 75 6e 69 78 49 6e 76 61 6c 69 64 61  int unixInvalida
22000 74 65 53 75 70 70 6f 72 74 46 69 6c 65 73 28 75  teSupportFiles(u
22010 6e 69 78 46 69 6c 65 20 2a 2c 20 69 6e 74 29 3b  nixFile *, int);
22020 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6e  ..static int fin
22030 64 43 72 65 61 74 65 46 69 6c 65 4d 6f 64 65 28  dCreateFileMode(
22040 63 6f 6e 73 74 20 63 68 61 72 20 2a 2c 20 69 6e  const char *, in
22050 74 2c 20 6d 6f 64 65 5f 74 2a 2c 20 75 69 64 5f  t, mode_t*, uid_
22060 74 20 2a 2c 67 69 64 5f 74 20 2a 29 3b 0a 0a 2f  t *,gid_t *);../
22070 2a 20 6f 70 65 6e 73 20 61 20 72 65 61 64 2f 77  * opens a read/w
22080 72 69 74 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  rite connection 
22090 74 6f 20 61 20 66 69 6c 65 20 7a 4e 61 6d 65 20  to a file zName 
220a0 69 6e 68 65 72 69 74 69 6e 67 20 74 68 65 20 61  inheriting the a
220b0 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a 20 75 73  ppropriate.** us
220c0 65 72 2f 70 65 72 6d 73 20 66 72 6f 6d 20 74 68  er/perms from th
220d0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
220e0 69 66 20 72 75 6e 6e 69 6e 67 20 61 73 20 72 6f  if running as ro
220f0 6f 74 2e 20 20 52 65 74 75 72 6e 73 20 74 68 65  ot.  Returns the
22100 20 66 69 6c 65 20 0a 2a 2a 20 64 65 73 63 72 69   file .** descri
22110 70 74 6f 72 20 62 79 20 72 65 66 65 72 65 6e 63  ptor by referenc
22120 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  e.*/.static int 
22130 75 6e 69 78 4f 70 65 6e 43 68 69 6c 64 46 69 6c  unixOpenChildFil
22140 65 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  e(.  const char 
22150 2a 7a 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 6f 70  *zName,.  int op
22160 65 6e 46 6c 61 67 73 2c 0a 20 20 69 6e 74 20 64  enFlags,.  int d
22170 62 4f 70 65 6e 46 6c 61 67 73 2c 0a 20 20 69 6e  bOpenFlags,.  in
22180 74 20 70 72 6f 74 46 6c 61 67 73 2c 0a 20 20 69  t protFlags,.  i
22190 6e 74 20 2a 70 46 64 0a 29 7b 0a 20 20 69 6e 74  nt *pFd.){.  int
221a0 20 66 64 20 3d 20 2d 31 3b 0a 20 20 6d 6f 64 65   fd = -1;.  mode
221b0 5f 74 20 6f 70 65 6e 4d 6f 64 65 3b 20 20 20 20  _t openMode;    
221c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 65 72            /* Per
221d0 6d 69 73 73 69 6f 6e 73 20 74 6f 20 63 72 65 61  missions to crea
221e0 74 65 20 66 69 6c 65 20 77 69 74 68 20 2a 2f 0a  te file with */.
221f0 20 20 75 69 64 5f 74 20 75 69 64 3b 20 20 20 20    uid_t uid;    
22200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22210 2f 2a 20 55 73 65 72 69 64 20 66 6f 72 20 74 68  /* Userid for th
22220 65 20 66 69 6c 65 20 2a 2f 0a 20 20 67 69 64 5f  e file */.  gid_
22230 74 20 67 69 64 3b 20 20 20 20 20 20 20 20 20 20  t gid;          
22240 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 72 6f            /* Gro
22250 75 70 69 64 20 66 6f 72 20 74 68 65 20 66 69 6c  upid for the fil
22260 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 20  e */.  int rc;. 
22270 20 0a 20 20 61 73 73 65 72 74 28 70 46 64 21 3d   .  assert(pFd!=
22280 4e 55 4c 4c 29 3b 0a 20 20 72 63 20 3d 20 66 69  NULL);.  rc = fi
22290 6e 64 43 72 65 61 74 65 46 69 6c 65 4d 6f 64 65  ndCreateFileMode
222a0 28 7a 4e 61 6d 65 2c 20 64 62 4f 70 65 6e 46 6c  (zName, dbOpenFl
222b0 61 67 73 2c 20 26 6f 70 65 6e 4d 6f 64 65 2c 20  ags, &openMode, 
222c0 26 75 69 64 2c 20 26 67 69 64 29 3b 0a 20 20 69  &uid, &gid);.  i
222d0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
222e0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
222f0 63 3b 0a 20 20 7d 0a 20 20 66 64 20 3d 20 72 6f  c;.  }.  fd = ro
22300 62 75 73 74 5f 6f 70 65 6e 28 7a 4e 61 6d 65 2c  bust_open(zName,
22310 20 6f 70 65 6e 46 6c 61 67 73 2c 20 6f 70 65 6e   openFlags, open
22320 4d 6f 64 65 29 3b 0a 20 20 4f 53 54 52 41 43 45  Mode);.  OSTRACE
22330 28 28 22 4f 50 45 4e 58 20 20 20 25 2d 33 64 20  (("OPENX   %-3d 
22340 25 73 20 30 25 6f 5c 6e 22 2c 20 66 64 2c 20 7a  %s 0%o\n", fd, z
22350 4e 61 6d 65 2c 20 6f 70 65 6e 46 6c 61 67 73 29  Name, openFlags)
22360 29 3b 0a 20 20 69 66 28 20 66 64 3c 30 20 29 7b  );.  if( fd<0 ){
22370 0a 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f  .    rc = unixLo
22380 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41  gError(SQLITE_CA
22390 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c 20 22 6f 70  NTOPEN_BKPT, "op
223a0 65 6e 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  en", zName);.   
223b0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
223c0 20 20 2f 2a 20 69 66 20 77 65 27 72 65 20 6f 70    /* if we're op
223d0 65 6e 69 6e 67 20 74 68 65 20 77 61 6c 20 6f 72  ening the wal or
223e0 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 72 75 6e   journal and run
223f0 6e 69 6e 67 20 61 73 20 72 6f 6f 74 2c 20 73 65  ning as root, se
22400 74 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  t.  ** the journ
22410 61 6c 20 75 69 64 2f 67 69 64 20 2a 2f 0a 20 20  al uid/gid */.  
22420 69 66 28 20 64 62 4f 70 65 6e 46 6c 61 67 73 20  if( dbOpenFlags 
22430 26 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57  & (SQLITE_OPEN_W
22440 41 4c 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  AL|SQLITE_OPEN_M
22450 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 20 29 7b 0a  AIN_JOURNAL) ){.
22460 20 20 20 20 75 69 64 5f 74 20 65 75 69 64 20 3d      uid_t euid =
22470 20 67 65 74 65 75 69 64 28 29 3b 0a 20 20 20 20   geteuid();.    
22480 69 66 28 20 65 75 69 64 3d 3d 30 20 26 26 20 28  if( euid==0 && (
22490 65 75 69 64 21 3d 75 69 64 20 7c 7c 20 67 65 74  euid!=uid || get
224a0 65 67 69 64 28 29 21 3d 67 69 64 29 20 29 7b 0a  egid()!=gid) ){.
224b0 20 20 20 20 20 20 69 66 28 20 66 63 68 6f 77 6e        if( fchown
224c0 28 66 64 2c 20 75 69 64 2c 20 67 69 64 29 20 29  (fd, uid, gid) )
224d0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
224e0 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42  QLITE_CANTOPEN_B
224f0 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  KPT;.      }.   
22500 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d   }.  }.  if( rc=
22510 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
22520 20 20 2a 70 46 64 20 3d 20 66 64 3b 0a 20 20 7d    *pFd = fd;.  }
22530 20 65 6c 73 65 20 7b 0a 20 20 20 20 2a 70 46 64   else {.    *pFd
22540 20 3d 20 2d 31 3b 0a 20 20 20 20 63 6c 6f 73 65   = -1;.    close
22550 28 66 64 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  (fd);.  }.  retu
22560 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63  rn rc;.}..static
22570 20 69 6e 74 20 75 6e 69 78 52 65 70 6c 61 63 65   int unixReplace
22580 44 61 74 61 62 61 73 65 28 75 6e 69 78 46 69 6c  Database(unixFil
22590 65 20 2a 70 46 69 6c 65 2c 20 73 71 6c 69 74 65  e *pFile, sqlite
225a0 33 20 2a 73 72 63 64 62 29 20 7b 0a 20 20 73 71  3 *srcdb) {.  sq
225b0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 20 3d  lite3_file *id =
225c0 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a   (sqlite3_file *
225d0 29 70 46 69 6c 65 3b 0a 20 20 42 74 72 65 65 20  )pFile;.  Btree 
225e0 2a 70 53 72 63 42 74 72 65 65 20 3d 20 4e 55 4c  *pSrcBtree = NUL
225f0 4c 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  L;.  sqlite3_fil
22600 65 20 2a 73 72 63 5f 66 69 6c 65 20 3d 20 4e 55  e *src_file = NU
22610 4c 4c 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  LL;.  unixFile *
22620 70 53 72 63 46 69 6c 65 20 3d 20 4e 55 4c 4c 3b  pSrcFile = NULL;
22630 0a 20 20 63 68 61 72 20 73 72 63 57 61 6c 50 61  .  char srcWalPa
22640 74 68 5b 4d 41 58 50 41 54 48 4c 45 4e 2b 35 5d  th[MAXPATHLEN+5]
22650 3b 0a 20 20 69 6e 74 20 73 72 63 57 61 6c 46 44  ;.  int srcWalFD
22660 20 3d 20 2d 31 3b 0a 20 20 69 6e 74 20 72 63 20   = -1;.  int rc 
22670 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 76  = SQLITE_OK;.  v
22680 6f 69 64 20 2a 70 4c 6f 63 6b 20 3d 20 4e 55 4c  oid *pLock = NUL
22690 4c 3b 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 3d  L;.  int flags =
226a0 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 73   0;.  sqlite3 *s
226b0 72 63 64 62 32 20 3d 20 4e 55 4c 4c 3b 0a 20 20  rcdb2 = NULL;.  
226c0 63 6f 70 79 66 69 6c 65 5f 73 74 61 74 65 5f 74  copyfile_state_t
226d0 20 73 3b 0a 20 20 69 6e 74 20 63 6f 72 72 75 70   s;.  int corrup
226e0 74 53 72 63 46 69 6c 65 4c 6f 63 6b 20 3d 20 30  tSrcFileLock = 0
226f0 3b 0a 20 20 69 6e 74 20 63 6f 72 72 75 70 74 44  ;.  int corruptD
22700 73 74 46 69 6c 65 4c 6f 63 6b 20 3d 20 30 3b 0a  stFileLock = 0;.
22710 20 20 69 6e 74 20 69 73 53 72 63 43 6f 72 72 75    int isSrcCorru
22720 70 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 73  pt = 0;.  int is
22730 44 73 74 43 6f 72 72 75 70 74 20 3d 20 30 3b 0a  DstCorrupt = 0;.
22740 20 20 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65    .  if( !sqlite
22750 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 73  3SafetyCheckOk(s
22760 72 63 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74  rcdb) ){.    ret
22770 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
22780 45 3b 0a 20 20 7d 0a 20 20 20 20 0a 23 69 66 20  E;.  }.    .#if 
22790 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44 41  SQLITE_ENABLE_DA
227a0 54 41 5f 50 52 4f 54 45 43 54 49 4f 4e 0a 20 20  TA_PROTECTION.  
227b0 66 6c 61 67 73 20 7c 3d 20 70 46 69 6c 65 2d 3e  flags |= pFile->
227c0 70 72 6f 74 46 6c 61 67 73 3b 0a 23 65 6e 64 69  protFlags;.#endi
227d0 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  f.#if SQLITE_ENA
227e0 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
227f0 45 0a 20 20 69 66 28 20 69 73 50 72 6f 78 79 4c  E.  if( isProxyL
22800 6f 63 6b 69 6e 67 4d 6f 64 65 28 70 46 69 6c 65  ockingMode(pFile
22810 29 20 29 7b 0a 20 20 20 20 66 6c 61 67 73 20 7c  ) ){.    flags |
22820 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 41 55  = SQLITE_OPEN_AU
22830 54 4f 50 52 4f 58 59 3b 0a 20 20 7d 0a 23 65 6e  TOPROXY;.  }.#en
22840 64 69 66 0a 20 20 0a 20 20 72 63 20 3d 20 73 71  dif.  .  rc = sq
22850 6c 69 74 65 33 64 65 6d 6f 5f 73 75 70 65 72 6c  lite3demo_superl
22860 6f 63 6b 28 70 46 69 6c 65 2d 3e 7a 50 61 74 68  ock(pFile->zPath
22870 2c 20 30 2c 20 66 6c 61 67 73 2c 20 30 2c 20 30  , 0, flags, 0, 0
22880 2c 20 26 70 4c 6f 63 6b 29 3b 0a 20 20 69 66 28  , &pLock);.  if(
22890 20 72 63 20 29 7b 0a 20 20 20 20 69 66 28 20 72   rc ){.    if( r
228a0 63 3d 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  c==SQLITE_CORRUP
228b0 54 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f  T || rc==SQLITE_
228c0 4e 4f 54 41 44 42 20 29 7b 0a 20 20 20 20 20 20  NOTADB ){.      
228d0 69 73 44 73 74 43 6f 72 72 75 70 74 20 3d 20 31  isDstCorrupt = 1
228e0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
228f0 69 74 65 33 64 65 6d 6f 5f 73 75 70 65 72 6c 6f  ite3demo_superlo
22900 63 6b 5f 63 6f 72 72 75 70 74 28 69 64 2c 20 53  ck_corrupt(id, S
22910 51 4c 49 54 45 5f 4c 4f 43 4b 5f 45 58 43 4c 55  QLITE_LOCK_EXCLU
22920 53 49 56 45 2c 0a 20 20 20 20 20 20 20 20 20 20  SIVE,.          
22930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
22950 63 6f 72 72 75 70 74 44 73 74 46 69 6c 65 4c 6f  corruptDstFileLo
22960 63 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ck);.    }.    i
22970 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72  f( rc ){.      r
22980 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
22990 20 20 7d 0a 20 20 2f 2a 20 67 65 74 20 74 68 65    }.  /* get the
229a0 20 73 72 63 20 66 69 6c 65 20 64 65 73 63 72 69   src file descri
229b0 70 74 6f 72 20 61 64 68 65 72 69 6e 67 20 74 6f  ptor adhering to
229c0 20 74 68 65 20 64 62 20 73 74 72 75 63 74 20 61   the db struct a
229d0 63 63 65 73 73 20 72 75 6c 65 73 20 0a 20 20 20  ccess rules .   
229e0 2a 2a 20 74 68 69 73 20 63 6f 64 65 20 69 73 20  ** this code is 
229f0 6d 6f 64 65 6c 65 64 20 61 66 74 65 72 20 73 71  modeled after sq
22a00 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72  lite3_file_contr
22a10 6f 6c 28 29 20 69 6e 20 6d 61 69 6e 2e 63 0a 20  ol() in main.c. 
22a20 20 20 2a 2f 20 0a 20 20 73 71 6c 69 74 65 33 5f    */ .  sqlite3_
22a30 6d 75 74 65 78 5f 65 6e 74 65 72 28 73 72 63 64  mutex_enter(srcd
22a40 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28  b->mutex);.  if(
22a50 20 73 72 63 64 62 2d 3e 6e 44 62 3e 30 20 29 7b   srcdb->nDb>0 ){
22a60 0a 20 20 20 20 70 53 72 63 42 74 72 65 65 20 3d  .    pSrcBtree =
22a70 20 73 72 63 64 62 2d 3e 61 44 62 5b 30 5d 2e 70   srcdb->aDb[0].p
22a80 42 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53  Bt;.  }.  if( pS
22a90 72 63 42 74 72 65 65 20 29 7b 0a 20 20 20 20 50  rcBtree ){.    P
22aa0 61 67 65 72 20 2a 70 53 72 63 50 61 67 65 72 3b  ager *pSrcPager;
22ab0 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
22ac0 65 45 6e 74 65 72 28 70 53 72 63 42 74 72 65 65  eEnter(pSrcBtree
22ad0 29 3b 0a 20 20 20 20 70 53 72 63 50 61 67 65 72  );.    pSrcPager
22ae0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50   = sqlite3BtreeP
22af0 61 67 65 72 28 70 53 72 63 42 74 72 65 65 29 3b  ager(pSrcBtree);
22b00 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 53 72  .    assert( pSr
22b10 63 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 20  cPager!=0 );.   
22b20 20 73 72 63 5f 66 69 6c 65 20 3d 20 73 71 6c 69   src_file = sqli
22b30 74 65 33 50 61 67 65 72 46 69 6c 65 28 70 53 72  te3PagerFile(pSr
22b40 63 50 61 67 65 72 29 3b 0a 20 20 20 20 61 73 73  cPager);.    ass
22b50 65 72 74 28 20 73 72 63 5f 66 69 6c 65 21 3d 30  ert( src_file!=0
22b60 20 29 3b 0a 20 20 20 20 69 66 28 20 73 72 63 5f   );.    if( src_
22b70 66 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 73 20 29  file->pMethods )
22b80 7b 0a 20 20 20 20 20 20 69 6e 74 20 73 72 63 46  {.      int srcF
22b90 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  lags = 0;.      
22ba0 70 53 72 63 46 69 6c 65 20 3d 20 28 75 6e 69 78  pSrcFile = (unix
22bb0 46 69 6c 65 20 2a 29 73 72 63 5f 66 69 6c 65 3b  File *)src_file;
22bc0 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
22bd0 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
22be0 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f 41 50   || defined(__AP
22bf0 50 4c 45 5f 5f 29 0a 20 20 20 20 20 20 69 66 20  PLE__).      if 
22c00 28 28 70 53 72 63 46 69 6c 65 2d 3e 6f 70 65 6e  ((pSrcFile->open
22c10 46 6c 61 67 73 20 26 20 4f 5f 52 44 57 52 29 20  Flags & O_RDWR) 
22c20 3d 3d 20 4f 5f 52 44 57 52 29 20 7b 0a 20 20 20  == O_RDWR) {.   
22c30 20 20 20 20 20 73 72 63 46 6c 61 67 73 20 3d 20       srcFlags = 
22c40 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
22c50 57 52 49 54 45 3b 0a 20 20 20 20 20 20 7d 20 65  WRITE;.      } e
22c60 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 73 72  lse {.        sr
22c70 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f  cFlags = SQLITE_
22c80 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  OPEN_READONLY;. 
22c90 20 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20       }.#else.   
22ca0 20 20 20 73 72 63 46 6c 61 67 73 20 3d 20 53 51     srcFlags = SQ
22cb0 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
22cc0 49 54 45 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  ITE;.#endif.#if 
22cd0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44 41  SQLITE_ENABLE_DA
22ce0 54 41 5f 50 52 4f 54 45 43 54 49 4f 4e 0a 20 20  TA_PROTECTION.  
22cf0 20 20 20 20 73 72 63 46 6c 61 67 73 20 7c 3d 20      srcFlags |= 
22d00 70 53 72 63 46 69 6c 65 2d 3e 70 72 6f 74 46 6c  pSrcFile->protFl
22d10 61 67 73 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  ags;.#endif.#if 
22d20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
22d30 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20  CKING_STYLE.    
22d40 20 20 69 66 28 20 69 73 50 72 6f 78 79 4c 6f 63    if( isProxyLoc
22d50 6b 69 6e 67 4d 6f 64 65 28 70 53 72 63 46 69 6c  kingMode(pSrcFil
22d60 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 72  e) ){.        sr
22d70 63 46 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45  cFlags |= SQLITE
22d80 5f 4f 50 45 4e 5f 41 55 54 4f 50 52 4f 58 59 3b  _OPEN_AUTOPROXY;
22d90 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
22da0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
22db0 65 33 5f 6f 70 65 6e 5f 76 32 28 70 53 72 63 46  e3_open_v2(pSrcF
22dc0 69 6c 65 2d 3e 7a 50 61 74 68 2c 20 26 73 72 63  ile->zPath, &src
22dd0 64 62 32 2c 20 73 72 63 46 6c 61 67 73 2c 20 30  db2, srcFlags, 0
22de0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
22df0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
22e00 20 20 20 20 20 20 2f 2a 20 73 74 61 72 74 20 61        /* start a
22e10 20 64 65 66 65 72 72 65 64 20 74 72 61 6e 73 61   deferred transa
22e20 63 74 69 6f 6e 20 61 6e 64 20 72 65 61 64 20 74  ction and read t
22e30 6f 20 65 73 74 61 62 6c 69 73 68 20 61 20 72 65  o establish a re
22e40 61 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20  ad lock */.     
22e50 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
22e60 65 78 65 63 28 73 72 63 64 62 32 2c 20 22 42 45  exec(srcdb2, "BE
22e70 47 49 4e 20 44 45 46 45 52 52 45 44 3b 20 50 52  GIN DEFERRED; PR
22e80 41 47 4d 41 20 73 63 68 65 6d 61 5f 76 65 72 73  AGMA schema_vers
22e90 69 6f 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  ion",.          
22ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22eb0 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  0, 0, 0);.      
22ec0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
22ed0 5f 43 4f 52 52 55 50 54 20 7c 7c 20 72 63 3d 3d  _CORRUPT || rc==
22ee0 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 20 29 7b  SQLITE_NOTADB ){
22ef0 0a 20 20 20 20 20 20 20 20 20 20 69 73 53 72 63  .          isSrc
22f00 43 6f 72 72 75 70 74 20 3d 20 31 3b 0a 20 20 20  Corrupt = 1;.   
22f10 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
22f20 74 65 33 64 65 6d 6f 5f 73 75 70 65 72 6c 6f 63  te3demo_superloc
22f30 6b 5f 63 6f 72 72 75 70 74 28 73 72 63 5f 66 69  k_corrupt(src_fi
22f40 6c 65 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f  le, SQLITE_LOCK_
22f50 53 48 41 52 45 44 2c 0a 20 20 20 20 20 20 20 20  SHARED,.        
22f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f80 20 20 20 20 20 26 63 6f 72 72 75 70 74 53 72 63       &corruptSrc
22f90 46 69 6c 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 20  FileLock);.     
22fa0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
22fb0 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 21 73 72   }.  }.  if( !sr
22fc0 63 64 62 32 20 7c 7c 20 70 53 72 63 46 69 6c 65  cdb2 || pSrcFile
22fd0 3d 3d 4e 55 4c 4c 20 7c 7c 20 70 53 72 63 46 69  ==NULL || pSrcFi
22fe0 6c 65 2d 3e 68 3c 30 29 7b 0a 20 20 20 20 72 63  le->h<0){.    rc
22ff0 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e   = SQLITE_INTERN
23000 41 4c 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  AL;.  }.  if( rc
23010 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
23020 20 20 20 67 6f 74 6f 20 65 6e 64 5f 72 65 70 6c     goto end_repl
23030 61 63 65 5f 64 61 74 61 62 61 73 65 3b 0a 20 20  ace_database;.  
23040 7d 0a 20 20 2f 2a 20 62 6f 74 68 20 64 61 74 61  }.  /* both data
23050 62 61 73 65 73 20 61 72 65 20 6c 6f 63 6b 65 64  bases are locked
23060 20 61 70 70 72 6f 70 72 69 61 74 65 6c 79 2c 20   appropriately, 
23070 63 6f 70 79 20 74 68 65 20 73 72 63 20 77 61 6c  copy the src wal
23080 20 6a 6f 75 72 6e 61 6c 20 69 66 20 0a 20 20 20   journal if .   
23090 2a 2a 20 6f 6e 65 20 65 78 69 73 74 73 20 61 6e  ** one exists an
230a0 64 20 74 68 65 6e 20 74 68 65 20 61 63 74 75 61  d then the actua
230b0 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a  l database file.
230c0 20 20 20 2a 2f 0a 20 20 73 74 72 6c 63 70 79 28     */.  strlcpy(
230d0 73 72 63 57 61 6c 50 61 74 68 2c 20 70 53 72 63  srcWalPath, pSrc
230e0 46 69 6c 65 2d 3e 7a 50 61 74 68 2c 20 4d 41 58  File->zPath, MAX
230f0 50 41 54 48 4c 45 4e 2b 35 29 3b 0a 20 20 73 74  PATHLEN+5);.  st
23100 72 6c 63 61 74 28 73 72 63 57 61 6c 50 61 74 68  rlcat(srcWalPath
23110 2c 20 22 2d 77 61 6c 22 2c 20 4d 41 58 50 41 54  , "-wal", MAXPAT
23120 48 4c 45 4e 2b 35 29 3b 0a 20 20 73 72 63 57 61  HLEN+5);.  srcWa
23130 6c 46 44 20 3d 20 6f 70 65 6e 28 73 72 63 57 61  lFD = open(srcWa
23140 6c 50 61 74 68 2c 20 4f 5f 52 44 4f 4e 4c 59 29  lPath, O_RDONLY)
23150 3b 0a 20 20 69 66 28 20 21 28 73 72 63 57 61 6c  ;.  if( !(srcWal
23160 46 44 3c 30 29 20 29 7b 0a 20 20 20 20 63 68 61  FD<0) ){.    cha
23170 72 20 64 73 74 57 61 6c 50 61 74 68 5b 4d 41 58  r dstWalPath[MAX
23180 50 41 54 48 4c 45 4e 2b 35 5d 3b 0a 20 20 20 20  PATHLEN+5];.    
23190 69 6e 74 20 64 73 74 57 61 6c 46 44 20 3d 20 2d  int dstWalFD = -
231a0 31 3b 0a 20 20 20 20 69 6e 74 20 70 72 6f 74 46  1;.    int protF
231b0 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20 20 73 74  lags = 0;.    st
231c0 72 6c 63 70 79 28 64 73 74 57 61 6c 50 61 74 68  rlcpy(dstWalPath
231d0 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 2c 20  , pFile->zPath, 
231e0 4d 41 58 50 41 54 48 4c 45 4e 2b 35 29 3b 0a 20  MAXPATHLEN+5);. 
231f0 20 20 20 73 74 72 6c 63 61 74 28 64 73 74 57 61     strlcat(dstWa
23200 6c 50 61 74 68 2c 20 22 2d 77 61 6c 22 2c 20 4d  lPath, "-wal", M
23210 41 58 50 41 54 48 4c 45 4e 2b 35 29 3b 0a 0a 20  AXPATHLEN+5);.. 
23220 20 20 20 72 63 20 3d 20 75 6e 69 78 4f 70 65 6e     rc = unixOpen
23230 43 68 69 6c 64 46 69 6c 65 28 64 73 74 57 61 6c  ChildFile(dstWal
23240 50 61 74 68 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43  Path, O_RDWR|O_C
23250 52 45 41 54 2c 20 53 51 4c 49 54 45 5f 4f 50 45  REAT, SQLITE_OPE
23260 4e 5f 57 41 4c 2c 0a 20 20 20 20 20 20 20 20 20  N_WAL,.         
23270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23280 20 20 70 72 6f 74 46 6c 61 67 73 2c 20 26 64 73    protFlags, &ds
23290 74 57 61 6c 46 44 29 3b 0a 20 20 20 20 69 66 28  tWalFD);.    if(
232a0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
232b0 7b 0a 20 20 20 20 20 20 73 20 3d 20 63 6f 70 79  {.      s = copy
232c0 66 69 6c 65 5f 73 74 61 74 65 5f 61 6c 6c 6f 63  file_state_alloc
232d0 28 29 3b 0a 20 20 20 20 20 20 6c 73 65 65 6b 28  ();.      lseek(
232e0 73 72 63 57 61 6c 46 44 2c 20 30 2c 20 53 45 45  srcWalFD, 0, SEE
232f0 4b 5f 53 45 54 29 3b 0a 20 20 20 20 20 20 6c 73  K_SET);.      ls
23300 65 65 6b 28 64 73 74 57 61 6c 46 44 2c 20 30 2c  eek(dstWalFD, 0,
23310 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20 20 20 20   SEEK_SET);.    
23320 20 20 69 66 28 20 66 63 6f 70 79 66 69 6c 65 28    if( fcopyfile(
23330 73 72 63 57 61 6c 46 44 2c 20 64 73 74 57 61 6c  srcWalFD, dstWal
23340 46 44 2c 20 73 2c 20 43 4f 50 59 46 49 4c 45 5f  FD, s, COPYFILE_
23350 44 41 54 41 29 20 29 7b 0a 20 20 20 20 20 20 20  DATA) ){.       
23360 20 69 6e 74 20 65 72 72 3d 65 72 72 6e 6f 3b 0a   int err=errno;.
23370 20 20 20 20 20 20 20 20 73 77 69 74 63 68 28 65          switch(e
23380 72 72 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  rr) {.          
23390 63 61 73 65 20 45 4e 4f 4d 45 4d 3a 0a 20 20 20  case ENOMEM:.   
233a0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
233b0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
233c0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
233d0 20 20 20 20 20 20 20 20 20 64 65 66 61 75 6c 74           default
233e0 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 74  :.            st
233f0 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69  oreLastErrno(pFi
23400 6c 65 2c 20 65 72 72 29 3b 0a 20 20 20 20 20 20  le, err);.      
23410 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
23420 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20 20 20 20  E_IOERR;.       
23430 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
23440 20 63 6f 70 79 66 69 6c 65 5f 73 74 61 74 65 5f   copyfile_state_
23450 66 72 65 65 28 73 29 3b 0a 20 20 20 20 20 20 63  free(s);.      c
23460 6c 6f 73 65 28 64 73 74 57 61 6c 46 44 29 3b 0a  lose(dstWalFD);.
23470 20 20 20 20 7d 0a 20 20 20 20 63 6c 6f 73 65 28      }.    close(
23480 73 72 63 57 61 6c 46 44 29 3b 0a 20 20 7d 0a 20  srcWalFD);.  }. 
23490 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
234a0 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 62 65 66  OK ){.    /* bef
234b0 6f 72 65 20 77 65 20 63 6f 70 79 2c 20 65 6e 73  ore we copy, ens
234c0 75 72 65 20 74 68 61 74 20 74 68 65 20 66 69 6c  ure that the fil
234d0 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72  e change counter
234e0 20 77 69 6c 6c 20 62 65 20 6d 6f 64 69 66 69 65   will be modifie
234f0 64 20 2a 2f 0a 20 20 20 20 75 69 6e 74 33 32 5f  d */.    uint32_
23500 74 20 73 72 63 43 68 61 6e 67 65 20 3d 20 30 3b  t srcChange = 0;
23510 0a 20 20 20 20 75 69 6e 74 33 32 5f 74 20 64 73  .    uint32_t ds
23520 74 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20  tChange = 0;.   
23530 20 70 72 65 61 64 28 70 53 72 63 46 69 6c 65 2d   pread(pSrcFile-
23540 3e 68 2c 20 26 73 72 63 43 68 61 6e 67 65 2c 20  >h, &srcChange, 
23550 34 2c 20 32 34 29 3b 0a 20 20 20 20 70 72 65 61  4, 24);.    prea
23560 64 28 70 46 69 6c 65 2d 3e 68 2c 20 26 64 73 74  d(pFile->h, &dst
23570 43 68 61 6e 67 65 2c 20 34 2c 20 32 34 29 3b 0a  Change, 4, 24);.
23580 20 20 20 20 0a 20 20 20 20 2f 2a 20 63 6f 70 79      .    /* copy
23590 20 74 68 65 20 61 63 74 75 61 6c 20 64 61 74 61   the actual data
235a0 62 61 73 65 20 2a 2f 0a 20 20 20 20 73 20 3d 20  base */.    s = 
235b0 63 6f 70 79 66 69 6c 65 5f 73 74 61 74 65 5f 61  copyfile_state_a
235c0 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 6c 73 65 65  lloc();.    lsee
235d0 6b 28 70 53 72 63 46 69 6c 65 2d 3e 68 2c 20 30  k(pSrcFile->h, 0
235e0 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20 20 20  , SEEK_SET);.   
235f0 20 6c 73 65 65 6b 28 70 46 69 6c 65 2d 3e 68 2c   lseek(pFile->h,
23600 20 30 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20   0, SEEK_SET);. 
23610 20 20 20 69 66 28 20 66 63 6f 70 79 66 69 6c 65     if( fcopyfile
23620 28 70 53 72 63 46 69 6c 65 2d 3e 68 2c 20 70 46  (pSrcFile->h, pF
23630 69 6c 65 2d 3e 68 2c 20 73 2c 20 43 4f 50 59 46  ile->h, s, COPYF
23640 49 4c 45 5f 44 41 54 41 29 20 29 7b 0a 20 20 20  ILE_DATA) ){.   
23650 20 20 20 69 6e 74 20 65 72 72 3d 65 72 72 6e 6f     int err=errno
23660 3b 0a 20 20 20 20 20 20 73 77 69 74 63 68 28 65  ;.      switch(e
23670 72 72 29 20 7b 0a 20 20 20 20 20 20 20 20 63 61  rr) {.        ca
23680 73 65 20 45 4e 4f 4d 45 4d 3a 0a 20 20 20 20 20  se ENOMEM:.     
23690 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
236a0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20  _NOMEM;.        
236b0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
236c0 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20   default:.      
236d0 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72      storeLastErr
236e0 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72 29 3b 0a  no(pFile, err);.
236f0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
23700 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20  QLITE_IOERR;.   
23710 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 63     }.    }.    c
23720 6f 70 79 66 69 6c 65 5f 73 74 61 74 65 5f 66 72  opyfile_state_fr
23730 65 65 28 73 29 3b 0a 20 20 20 20 0a 20 20 20 20  ee(s);.    .    
23740 69 66 20 28 73 72 63 43 68 61 6e 67 65 20 3d 3d  if (srcChange ==
23750 20 64 73 74 43 68 61 6e 67 65 29 20 7b 0a 20 20   dstChange) {.  
23760 20 20 20 20 2f 2a 20 6d 6f 64 69 66 79 20 74 68      /* modify th
23770 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72  e change counter
23780 20 74 6f 20 66 6f 72 63 65 20 70 61 67 65 20 7a   to force page z
23790 65 72 6f 20 74 6f 20 62 65 20 72 65 6c 6f 61 64  ero to be reload
237a0 65 64 20 2a 2f 0a 20 20 20 20 20 20 64 73 74 43  ed */.      dstC
237b0 68 61 6e 67 65 20 2b 2b 3b 0a 20 20 20 20 20 20  hange ++;.      
237c0 70 77 72 69 74 65 28 70 46 69 6c 65 2d 3e 68 2c  pwrite(pFile->h,
237d0 20 26 64 73 74 43 68 61 6e 67 65 2c 20 34 2c 20   &dstChange, 4, 
237e0 32 34 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  24);.    }.  }. 
237f0 20 69 66 28 20 69 73 53 72 63 43 6f 72 72 75 70   if( isSrcCorrup
23800 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
23810 64 65 6d 6f 5f 73 75 70 65 72 75 6e 6c 6f 63 6b  demo_superunlock
23820 5f 63 6f 72 72 75 70 74 28 73 72 63 5f 66 69 6c  _corrupt(src_fil
23830 65 2c 20 63 6f 72 72 75 70 74 53 72 63 46 69 6c  e, corruptSrcFil
23840 65 4c 6f 63 6b 29 3b 0a 20 20 7d 65 6c 73 65 7b  eLock);.  }else{
23850 0a 20 20 20 20 2f 2a 20 64 6f 6e 65 20 77 69 74  .    /* done wit
23860 68 20 74 68 65 20 73 6f 75 72 63 65 20 64 62 20  h the source db 
23870 73 6f 20 65 6e 64 20 74 68 65 20 74 72 61 6e 73  so end the trans
23880 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 73 71  action */.    sq
23890 6c 69 74 65 33 5f 65 78 65 63 28 73 72 63 64 62  lite3_exec(srcdb
238a0 32 2c 20 22 43 4f 4d 4d 49 54 22 2c 20 30 2c 20  2, "COMMIT", 0, 
238b0 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20  0, 0);.  }.  /* 
238c0 7a 65 72 6f 20 6f 75 74 20 61 6e 79 20 6f 6c 64  zero out any old
238d0 20 6a 6f 75 72 6e 61 6c 20 63 6c 75 74 74 65 72   journal clutter
238e0 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   */.  if( rc==SQ
238f0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
23900 6e 74 20 73 6b 69 70 57 41 4c 20 3d 20 28 73 72  nt skipWAL = (sr
23910 63 57 61 6c 46 44 3c 30 29 3f 30 3a 31 3b 0a 20  cWalFD<0)?0:1;. 
23920 20 20 20 75 6e 69 78 49 6e 76 61 6c 69 64 61 74     unixInvalidat
23930 65 53 75 70 70 6f 72 74 46 69 6c 65 73 28 70 46  eSupportFiles(pF
23940 69 6c 65 2c 20 73 6b 69 70 57 41 4c 29 3b 0a 20  ile, skipWAL);. 
23950 20 7d 0a 20 20 0a 65 6e 64 5f 72 65 70 6c 61 63   }.  .end_replac
23960 65 5f 64 61 74 61 62 61 73 65 3a 0a 20 20 69 66  e_database:.  if
23970 28 20 70 53 72 63 42 74 72 65 65 20 29 7b 0a 20  ( pSrcBtree ){. 
23980 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65     sqlite3_close
23990 28 73 72 63 64 62 32 29 3b 0a 20 20 20 20 73 71  (srcdb2);.    sq
239a0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
239b0 70 53 72 63 42 74 72 65 65 29 3b 0a 20 20 7d 0a  pSrcBtree);.  }.
239c0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
239d0 6c 65 61 76 65 28 73 72 63 64 62 2d 3e 6d 75 74  leave(srcdb->mut
239e0 65 78 29 3b 0a 20 20 69 66 28 20 69 73 44 73 74  ex);.  if( isDst
239f0 43 6f 72 72 75 70 74 20 29 7b 0a 20 20 20 20 73  Corrupt ){.    s
23a00 71 6c 69 74 65 33 64 65 6d 6f 5f 73 75 70 65 72  qlite3demo_super
23a10 75 6e 6c 6f 63 6b 5f 63 6f 72 72 75 70 74 28 69  unlock_corrupt(i
23a20 64 2c 20 63 6f 72 72 75 70 74 44 73 74 46 69 6c  d, corruptDstFil
23a30 65 4c 6f 63 6b 29 3b 0a 20 20 7d 65 6c 73 65 7b  eLock);.  }else{
23a40 0a 20 20 20 20 73 71 6c 69 74 65 33 64 65 6d 6f  .    sqlite3demo
23a50 5f 73 75 70 65 72 75 6e 6c 6f 63 6b 28 70 4c 6f  _superunlock(pLo
23a60 63 6b 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ck);.  }.  retur
23a70 6e 20 72 63 3b 0a 7d 0a 23 64 65 66 69 6e 65 20  n rc;.}.#define 
23a80 53 51 4c 49 54 45 5f 46 49 4c 45 5f 48 45 41 44  SQLITE_FILE_HEAD
23a90 45 52 5f 4c 45 4e 20 31 36 0a 2f 2a 20 43 68 65  ER_LEN 16./* Che
23aa0 63 6b 20 66 6f 72 20 61 20 63 6f 6e 66 6c 69 63  ck for a conflic
23ab0 74 69 6e 67 20 6c 6f 63 6b 2e 20 20 49 66 20 6f  ting lock.  If o
23ac0 6e 65 20 69 73 20 66 6f 75 6e 64 2c 20 70 72 69  ne is found, pri
23ad0 6e 74 20 61 6e 20 74 68 69 73 0a 20 2a 2a 20 6f  nt an this. ** o
23ae0 6e 20 73 74 61 6e 64 61 72 64 20 6f 75 74 70 75  n standard outpu
23af0 74 20 75 73 69 6e 67 20 74 68 65 20 66 6f 72 6d  t using the form
23b00 61 74 20 73 74 72 69 6e 67 20 67 69 76 65 6e 20  at string given 
23b10 61 6e 64 20 72 65 74 75 72 6e 20 31 2e 0a 20 2a  and return 1.. *
23b20 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6e  * If there are n
23b30 6f 20 63 6f 6e 66 6c 69 63 74 69 6e 67 20 6c 6f  o conflicting lo
23b40 63 6b 73 2c 20 72 65 74 75 72 6e 20 30 2e 0a 20  cks, return 0.. 
23b50 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
23b60 69 78 49 73 4c 6f 63 6b 65 64 28 0a 20 20 70 69  ixIsLocked(.  pi
23b70 64 5f 74 20 70 69 64 2c 20 20 20 20 20 20 20 20  d_t pid,        
23b80 20 20 20 20 2f 2a 20 50 49 44 20 74 6f 20 74 65      /* PID to te
23b90 73 74 20 66 6f 72 20 6c 6f 63 6b 20 6f 77 6e 65  st for lock owne
23ba0 72 20 2a 2f 0a 20 20 69 6e 74 20 68 2c 20 20 20  r */.  int h,   
23bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23bc0 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  File descriptor 
23bd0 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 69 6e  to check */.  in
23be0 74 20 74 79 70 65 2c 20 20 20 20 20 20 20 20 20  t type,         
23bf0 20 20 20 20 2f 2a 20 46 5f 52 44 4c 43 4b 20 6f      /* F_RDLCK o
23c00 72 20 46 5f 57 52 4c 43 4b 20 2a 2f 0a 20 20 75  r F_WRLCK */.  u
23c10 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 4f 66 73  nsigned int iOfs
23c20 74 2c 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79  t,   /* First by
23c30 74 65 20 6f 66 20 74 68 65 20 6c 6f 63 6b 20 2a  te of the lock *
23c40 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  /.  unsigned int
23c50 20 69 43 6e 74 2c 20 20 20 20 2f 2a 20 4e 75 6d   iCnt,    /* Num
23c60 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
23c70 74 68 65 20 6c 6f 63 6b 20 72 61 6e 67 65 20 2a  the lock range *
23c80 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
23c90 7a 54 79 70 65 20 20 20 20 20 2f 2a 20 54 79 70  zType     /* Typ
23ca0 65 20 6f 66 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a  e of lock */.){.
23cb0 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c    struct flock l
23cc0 6b 3b 0a 20 20 69 6e 74 20 65 72 72 3b 0a 20 20  k;.  int err;.  
23cd0 0a 20 20 6d 65 6d 73 65 74 28 26 6c 6b 2c 20 30  .  memset(&lk, 0
23ce0 2c 20 73 69 7a 65 6f 66 28 6c 6b 29 29 3b 0a 20  , sizeof(lk));. 
23cf0 20 6c 6b 2e 6c 5f 74 79 70 65 20 3d 20 74 79 70   lk.l_type = typ
23d00 65 3b 0a 20 20 6c 6b 2e 6c 5f 77 68 65 6e 63 65  e;.  lk.l_whence
23d10 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 6c   = SEEK_SET;.  l
23d20 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 69 4f 66 73  k.l_start = iOfs
23d30 74 3b 0a 20 20 6c 6b 2e 6c 5f 6c 65 6e 20 3d 20  t;.  lk.l_len = 
23d40 69 43 6e 74 3b 0a 20 20 0a 20 20 69 66 28 20 70  iCnt;.  .  if( p
23d50 69 64 21 3d 53 51 4c 49 54 45 5f 4c 4f 43 4b 53  id!=SQLITE_LOCKS
23d60 54 41 54 45 5f 41 4e 59 50 49 44 20 29 7b 0a 23  TATE_ANYPID ){.#
23d70 69 66 6e 64 65 66 20 46 5f 47 45 54 4c 4b 50 49  ifndef F_GETLKPI
23d80 44 0a 23 20 77 61 72 6e 69 6e 67 20 46 5f 47 45  D.# warning F_GE
23d90 54 4c 4b 50 49 44 20 75 6e 64 65 66 69 6e 65 64  TLKPID undefined
23da0 2c 20 5f 73 71 6c 69 74 65 33 5f 6c 6f 63 6b 73  , _sqlite3_locks
23db0 74 61 74 65 20 66 61 6c 6c 69 6e 67 20 62 61 63  tate falling bac
23dc0 6b 20 74 6f 20 46 5f 47 45 54 4c 4b 0a 20 20 20  k to F_GETLK.   
23dd0 20 65 72 72 20 3d 20 66 63 6e 74 6c 28 68 2c 20   err = fcntl(h, 
23de0 46 5f 47 45 54 4c 4b 2c 20 26 6c 6b 29 3b 0a 23  F_GETLK, &lk);.#
23df0 65 6c 73 65 0a 20 20 20 20 6c 6b 2e 6c 5f 70 69  else.    lk.l_pi
23e00 64 20 3d 20 70 69 64 3b 0a 20 20 20 20 65 72 72  d = pid;.    err
23e10 20 3d 20 66 63 6e 74 6c 28 68 2c 20 46 5f 47 45   = fcntl(h, F_GE
23e20 54 4c 4b 50 49 44 2c 20 26 6c 6b 29 3b 0a 23 65  TLKPID, &lk);.#e
23e30 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ndif.  }else{.  
23e40 20 20 65 72 72 20 3d 20 66 63 6e 74 6c 28 68 2c    err = fcntl(h,
23e50 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 6b 29 3b 0a   F_GETLK, &lk);.
23e60 20 20 7d 0a 20 20 0a 20 20 69 66 28 20 65 72 72    }.  .  if( err
23e70 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 66 70  ==(-1) ){.    fp
23e80 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 66  rintf(stderr, "f
23e90 63 6e 74 6c 28 25 64 29 20 66 61 69 6c 65 64 3a  cntl(%d) failed:
23ea0 20 65 72 72 6e 6f 3d 25 64 5c 6e 22 2c 20 68 2c   errno=%d\n", h,
23eb0 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 72 65 74   errno);.    ret
23ec0 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 20 20 0a 20  urn -1;.  }.  . 
23ed0 20 69 66 28 20 6c 6b 2e 6c 5f 74 79 70 65 21 3d   if( lk.l_type!=
23ee0 46 5f 55 4e 4c 43 4b 20 26 26 20 28 70 69 64 3d  F_UNLCK && (pid=
23ef0 3d 53 51 4c 49 54 45 5f 4c 4f 43 4b 53 54 41 54  =SQLITE_LOCKSTAT
23f00 45 5f 41 4e 59 50 49 44 20 7c 7c 20 6c 6b 2e 6c  E_ANYPID || lk.l
23f10 5f 70 69 64 3d 3d 70 69 64 29 20 29 7b 0a 23 69  _pid==pid) ){.#i
23f20 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
23f30 47 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74  G.    fprintf(st
23f40 64 65 72 72 2c 20 22 25 73 20 6c 6f 63 6b 20 68  derr, "%s lock h
23f50 65 6c 64 20 62 79 20 25 64 5c 6e 22 2c 20 7a 54  eld by %d\n", zT
23f60 79 70 65 2c 20 28 69 6e 74 29 6c 6b 2e 6c 5f 70  ype, (int)lk.l_p
23f70 69 64 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  id);.#endif.    
23f80 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 20 0a 20  return 1;.  } . 
23f90 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 73 74   return 0;.}..st
23fa0 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4c 6f 63  atic int unixLoc
23fb0 6b 73 74 61 74 65 50 69 64 28 75 6e 69 78 46 69  kstatePid(unixFi
23fc0 6c 65 20 2a 2c 20 70 69 64 5f 74 2c 20 69 6e 74  le *, pid_t, int
23fd0 20 2a 29 3b 0a 0a 23 65 6e 64 69 66 20 2f 2a 20   *);..#endif /* 
23fe0 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41  (SQLITE_ENABLE_A
23ff0 50 50 4c 45 5f 53 50 49 3e 30 29 20 26 26 20 64  PPLE_SPI>0) && d
24000 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
24010 29 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  ) */.../*.** If 
24020 2a 70 41 72 67 20 69 73 20 69 6e 69 74 69 61 6c  *pArg is initial
24030 6c 79 20 6e 65 67 61 74 69 76 65 20 74 68 65 6e  ly negative then
24040 20 74 68 69 73 20 69 73 20 61 20 71 75 65 72 79   this is a query
24050 2e 20 20 53 65 74 20 2a 70 41 72 67 20 74 6f 0a  .  Set *pArg to.
24060 2a 2a 20 31 20 6f 72 20 30 20 64 65 70 65 6e 64  ** 1 or 0 depend
24070 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72 20 6f  ing on whether o
24080 72 20 6e 6f 74 20 62 69 74 20 6d 61 73 6b 20 6f  r not bit mask o
24090 66 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61  f pFile->ctrlFla
240a0 67 73 20 69 73 20 73 65 74 2e 0a 2a 2a 0a 2a 2a  gs is set..**.**
240b0 20 49 66 20 2a 70 41 72 67 20 69 73 20 30 20 6f   If *pArg is 0 o
240c0 72 20 31 2c 20 74 68 65 6e 20 63 6c 65 61 72 20  r 1, then clear 
240d0 6f 72 20 73 65 74 20 74 68 65 20 6d 61 73 6b 20  or set the mask 
240e0 62 69 74 20 6f 66 20 70 46 69 6c 65 2d 3e 63 74  bit of pFile->ct
240f0 72 6c 46 6c 61 67 73 2e 0a 2a 2f 0a 73 74 61 74  rlFlags..*/.stat
24100 69 63 20 76 6f 69 64 20 75 6e 69 78 4d 6f 64 65  ic void unixMode
24110 42 69 74 28 75 6e 69 78 46 69 6c 65 20 2a 70 46  Bit(unixFile *pF
24120 69 6c 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  ile, unsigned ch
24130 61 72 20 6d 61 73 6b 2c 20 69 6e 74 20 2a 70 41  ar mask, int *pA
24140 72 67 29 7b 0a 20 20 69 66 28 20 2a 70 41 72 67  rg){.  if( *pArg
24150 3c 30 20 29 7b 0a 20 20 20 20 2a 70 41 72 67 20  <0 ){.    *pArg 
24160 3d 20 28 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c  = (pFile->ctrlFl
24170 61 67 73 20 26 20 6d 61 73 6b 29 21 3d 30 3b 0a  ags & mask)!=0;.
24180 20 20 7d 65 6c 73 65 20 69 66 28 20 28 2a 70 41    }else if( (*pA
24190 72 67 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 46  rg)==0 ){.    pF
241a0 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26  ile->ctrlFlags &
241b0 3d 20 7e 6d 61 73 6b 3b 0a 20 20 7d 65 6c 73 65  = ~mask;.  }else
241c0 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63 74 72  {.    pFile->ctr
241d0 6c 46 6c 61 67 73 20 7c 3d 20 6d 61 73 6b 3b 0a  lFlags |= mask;.
241e0 20 20 7d 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72    }.}../* Forwar
241f0 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 2a 2f  d declaration */
24200 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
24210 47 65 74 54 65 6d 70 6e 61 6d 65 28 69 6e 74 20  GetTempname(int 
24220 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66  nBuf, char *zBuf
24230 29 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6e 66 6f 72 6d  );../*.** Inform
24240 61 74 69 6f 6e 20 61 6e 64 20 63 6f 6e 74 72 6f  ation and contro
24250 6c 20 6f 66 20 61 6e 20 6f 70 65 6e 20 66 69 6c  l of an open fil
24260 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61  e handle..*/.sta
24270 74 69 63 20 69 6e 74 20 75 6e 69 78 46 69 6c 65  tic int unixFile
24280 43 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f  Control(sqlite3_
24290 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6f 70  file *id, int op
242a0 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20  , void *pArg){. 
242b0 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
242c0 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
242d0 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29  ;.  switch( op )
242e0 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  {.    case SQLIT
242f0 45 5f 46 43 4e 54 4c 5f 57 41 4c 5f 42 4c 4f 43  E_FCNTL_WAL_BLOC
24300 4b 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 70 46  K: {.      /* pF
24310 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c  ile->ctrlFlags |
24320 3d 20 55 4e 49 58 46 49 4c 45 5f 42 4c 4f 43 4b  = UNIXFILE_BLOCK
24330 3b 20 2f 2f 20 44 65 66 65 72 72 65 64 20 66 65  ; // Deferred fe
24340 61 74 75 72 65 20 2a 2f 0a 20 20 20 20 20 20 72  ature */.      r
24350 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
24360 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
24370 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43  SQLITE_FCNTL_LOC
24380 4b 53 54 41 54 45 3a 20 7b 0a 20 20 20 20 20 20  KSTATE: {.      
24390 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d 20 70 46  *(int*)pArg = pF
243a0 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3b 0a  ile->eFileLock;.
243b0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
243c0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
243d0 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
243e0 4e 54 4c 5f 4c 41 53 54 5f 45 52 52 4e 4f 3a 20  NTL_LAST_ERRNO: 
243f0 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a 29 70  {.      *(int*)p
24400 41 72 67 20 3d 20 70 46 69 6c 65 2d 3e 6c 61 73  Arg = pFile->las
24410 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 65  tErrno;.      re
24420 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
24430 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
24440 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 43 48 55 4e  QLITE_FCNTL_CHUN
24450 4b 5f 53 49 5a 45 3a 20 7b 0a 20 20 20 20 20 20  K_SIZE: {.      
24460 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20 3d  pFile->szChunk =
24470 20 2a 28 69 6e 74 20 2a 29 70 41 72 67 3b 0a 20   *(int *)pArg;. 
24480 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
24490 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
244a0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
244b0 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 3a 20 7b 0a  TL_SIZE_HINT: {.
244c0 20 20 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20        int rc;.  
244d0 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72      SimulateIOEr
244e0 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20  rorBenign(1);.  
244f0 20 20 20 20 72 63 20 3d 20 66 63 6e 74 6c 53 69      rc = fcntlSi
24500 7a 65 48 69 6e 74 28 70 46 69 6c 65 2c 20 2a 28  zeHint(pFile, *(
24510 69 36 34 20 2a 29 70 41 72 67 29 3b 0a 20 20 20  i64 *)pArg);.   
24520 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
24530 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20  orBenign(0);.   
24540 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
24550 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
24560 49 54 45 5f 46 43 4e 54 4c 5f 50 45 52 53 49 53  ITE_FCNTL_PERSIS
24570 54 5f 57 41 4c 3a 20 7b 0a 20 20 20 20 20 20 75  T_WAL: {.      u
24580 6e 69 78 4d 6f 64 65 42 69 74 28 70 46 69 6c 65  nixModeBit(pFile
24590 2c 20 55 4e 49 58 46 49 4c 45 5f 50 45 52 53 49  , UNIXFILE_PERSI
245a0 53 54 5f 57 41 4c 2c 20 28 69 6e 74 2a 29 70 41  ST_WAL, (int*)pA
245b0 72 67 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  rg);.      retur
245c0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
245d0 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
245e0 54 45 5f 46 43 4e 54 4c 5f 50 4f 57 45 52 53 41  TE_FCNTL_POWERSA
245f0 46 45 5f 4f 56 45 52 57 52 49 54 45 3a 20 7b 0a  FE_OVERWRITE: {.
24600 20 20 20 20 20 20 75 6e 69 78 4d 6f 64 65 42 69        unixModeBi
24610 74 28 70 46 69 6c 65 2c 20 55 4e 49 58 46 49 4c  t(pFile, UNIXFIL
24620 45 5f 50 53 4f 57 2c 20 28 69 6e 74 2a 29 70 41  E_PSOW, (int*)pA
24630 72 67 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  rg);.      retur
24640 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
24650 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
24660 54 45 5f 46 43 4e 54 4c 5f 56 46 53 4e 41 4d 45  TE_FCNTL_VFSNAME
24670 3a 20 7b 0a 20 20 20 20 20 20 2a 28 63 68 61 72  : {.      *(char
24680 2a 2a 29 70 41 72 67 20 3d 20 73 71 6c 69 74 65  **)pArg = sqlite
24690 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20  3_mprintf("%s", 
246a0 70 46 69 6c 65 2d 3e 70 56 66 73 2d 3e 7a 4e 61  pFile->pVfs->zNa
246b0 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  me);.      retur
246c0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
246d0 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
246e0 54 45 5f 46 43 4e 54 4c 5f 54 45 4d 50 46 49 4c  TE_FCNTL_TEMPFIL
246f0 45 4e 41 4d 45 3a 20 7b 0a 20 20 20 20 20 20 63  ENAME: {.      c
24700 68 61 72 20 2a 7a 54 46 69 6c 65 20 3d 20 73 71  har *zTFile = sq
24710 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20  lite3_malloc64( 
24720 70 46 69 6c 65 2d 3e 70 56 66 73 2d 3e 6d 78 50  pFile->pVfs->mxP
24730 61 74 68 6e 61 6d 65 20 29 3b 0a 20 20 20 20 20  athname );.     
24740 20 69 66 28 20 7a 54 46 69 6c 65 20 29 7b 0a 20   if( zTFile ){. 
24750 20 20 20 20 20 20 20 75 6e 69 78 47 65 74 54 65         unixGetTe
24760 6d 70 6e 61 6d 65 28 70 46 69 6c 65 2d 3e 70 56  mpname(pFile->pV
24770 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2c 20  fs->mxPathname, 
24780 7a 54 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20  zTFile);.       
24790 20 2a 28 63 68 61 72 2a 2a 29 70 41 72 67 20 3d   *(char**)pArg =
247a0 20 7a 54 46 69 6c 65 3b 0a 20 20 20 20 20 20 7d   zTFile;.      }
247b0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
247c0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
247d0 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
247e0 43 4e 54 4c 5f 48 41 53 5f 4d 4f 56 45 44 3a 20  CNTL_HAS_MOVED: 
247f0 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a 29 70  {.      *(int*)p
24800 41 72 67 20 3d 20 66 69 6c 65 48 61 73 4d 6f 76  Arg = fileHasMov
24810 65 64 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 20  ed(pFile);.     
24820 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
24830 4b 3b 0a 20 20 20 20 7d 0a 23 69 66 20 53 51 4c  K;.    }.#if SQL
24840 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
24850 45 3e 30 0a 20 20 20 20 63 61 73 65 20 53 51 4c  E>0.    case SQL
24860 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53  ITE_FCNTL_MMAP_S
24870 49 5a 45 3a 20 7b 0a 20 20 20 20 20 20 69 36 34  IZE: {.      i64
24880 20 6e 65 77 4c 69 6d 69 74 20 3d 20 2a 28 69 36   newLimit = *(i6
24890 34 2a 29 70 41 72 67 3b 0a 20 20 20 20 20 20 69  4*)pArg;.      i
248a0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
248b0 4b 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 77  K;.      if( new
248c0 4c 69 6d 69 74 3e 73 71 6c 69 74 65 33 47 6c 6f  Limit>sqlite3Glo
248d0 62 61 6c 43 6f 6e 66 69 67 2e 6d 78 4d 6d 61 70  balConfig.mxMmap
248e0 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 65 77 4c   ){.        newL
248f0 69 6d 69 74 20 3d 20 73 71 6c 69 74 65 33 47 6c  imit = sqlite3Gl
24900 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 78 4d 6d 61  obalConfig.mxMma
24910 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  p;.      }.     
24920 20 2a 28 69 36 34 2a 29 70 41 72 67 20 3d 20 70   *(i64*)pArg = p
24930 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61  File->mmapSizeMa
24940 78 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 77  x;.      if( new
24950 4c 69 6d 69 74 3e 3d 30 20 26 26 20 6e 65 77 4c  Limit>=0 && newL
24960 69 6d 69 74 21 3d 70 46 69 6c 65 2d 3e 6d 6d 61  imit!=pFile->mma
24970 70 53 69 7a 65 4d 61 78 20 26 26 20 70 46 69 6c  pSizeMax && pFil
24980 65 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30 20  e->nFetchOut==0 
24990 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65  ){.        pFile
249a0 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20 3d 20  ->mmapSizeMax = 
249b0 6e 65 77 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20  newLimit;.      
249c0 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 6d 6d 61    if( pFile->mma
249d0 70 53 69 7a 65 3e 30 20 29 7b 0a 20 20 20 20 20  pSize>0 ){.     
249e0 20 20 20 20 20 75 6e 69 78 55 6e 6d 61 70 66 69       unixUnmapfi
249f0 6c 65 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 20  le(pFile);.     
24a00 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4d 61       rc = unixMa
24a10 70 66 69 6c 65 28 70 46 69 6c 65 2c 20 2d 31 29  pfile(pFile, -1)
24a20 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
24a30 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
24a40 20 72 63 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69   rc;.    }.#endi
24a50 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  f.#ifdef SQLITE_
24a60 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 54 68 65  DEBUG.    /* The
24a70 20 70 61 67 65 72 20 63 61 6c 6c 73 20 74 68 69   pager calls thi
24a80 73 20 6d 65 74 68 6f 64 20 74 6f 20 73 69 67 6e  s method to sign
24a90 61 6c 20 74 68 61 74 20 69 74 20 68 61 73 20 64  al that it has d
24aa0 6f 6e 65 0a 20 20 20 20 2a 2a 20 61 20 72 6f 6c  one.    ** a rol
24ab0 6c 62 61 63 6b 20 61 6e 64 20 74 68 61 74 20 74  lback and that t
24ac0 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 74  he database is t
24ad0 68 65 72 65 66 6f 72 65 20 75 6e 63 68 61 6e 67  herefore unchang
24ae0 65 64 20 61 6e 64 0a 20 20 20 20 2a 2a 20 69 74  ed and.    ** it
24af0 20 68 65 6e 63 65 20 69 74 20 69 73 20 4f 4b 20   hence it is OK 
24b00 66 6f 72 20 74 68 65 20 74 72 61 6e 73 61 63 74  for the transact
24b10 69 6f 6e 20 63 68 61 6e 67 65 20 63 6f 75 6e 74  ion change count
24b20 65 72 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20  er to be.    ** 
24b30 75 6e 63 68 61 6e 67 65 64 2e 0a 20 20 20 20 2a  unchanged..    *
24b40 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
24b50 45 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e 43 48 41  E_FCNTL_DB_UNCHA
24b60 4e 47 45 44 3a 20 7b 0a 20 20 20 20 20 20 28 28  NGED: {.      ((
24b70 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 64  unixFile*)id)->d
24b80 62 55 70 64 61 74 65 20 3d 20 30 3b 0a 20 20 20  bUpdate = 0;.   
24b90 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
24ba0 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  _OK;.    }.#endi
24bb0 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  f.#if SQLITE_ENA
24bc0 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
24bd0 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41  E && defined(__A
24be0 50 50 4c 45 5f 5f 29 0a 20 20 20 20 63 61 73 65  PPLE__).    case
24bf0 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 45   SQLITE_FCNTL_SE
24c00 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 3a  T_LOCKPROXYFILE:
24c10 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
24c20 5f 46 43 4e 54 4c 5f 47 45 54 5f 4c 4f 43 4b 50  _FCNTL_GET_LOCKP
24c30 52 4f 58 59 46 49 4c 45 3a 20 7b 0a 20 20 20 20  ROXYFILE: {.    
24c40 20 20 72 65 74 75 72 6e 20 70 72 6f 78 79 46 69    return proxyFi
24c50 6c 65 43 6f 6e 74 72 6f 6c 28 69 64 2c 6f 70 2c  leControl(id,op,
24c60 70 41 72 67 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  pArg);.    }.#en
24c70 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e  dif /* SQLITE_EN
24c80 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
24c90 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f  LE && defined(__
24ca0 41 50 50 4c 45 5f 5f 29 20 2a 2f 0a 23 69 66 20  APPLE__) */.#if 
24cb0 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41  (SQLITE_ENABLE_A
24cc0 50 50 4c 45 5f 53 50 49 3e 30 29 20 26 26 20 64  PPLE_SPI>0) && d
24cd0 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
24ce0 29 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ).    case SQLIT
24cf0 45 5f 46 43 4e 54 4c 5f 54 52 55 4e 43 41 54 45  E_FCNTL_TRUNCATE
24d00 5f 44 41 54 41 42 41 53 45 3a 20 7b 0a 20 20 20  _DATABASE: {.   
24d10 20 20 20 72 65 74 75 72 6e 20 75 6e 69 78 54 72     return unixTr
24d20 75 6e 63 61 74 65 44 61 74 61 62 61 73 65 28 70  uncateDatabase(p
24d30 46 69 6c 65 2c 20 28 70 41 72 67 20 3f 20 28 2a  File, (pArg ? (*
24d40 28 69 6e 74 20 2a 29 70 41 72 67 29 20 3a 20 30  (int *)pArg) : 0
24d50 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ));.    }.    ca
24d60 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
24d70 52 45 50 4c 41 43 45 5f 44 41 54 41 42 41 53 45  REPLACE_DATABASE
24d80 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  : {.      return
24d90 20 75 6e 69 78 52 65 70 6c 61 63 65 44 61 74 61   unixReplaceData
24da0 62 61 73 65 28 70 46 69 6c 65 2c 20 28 73 71 6c  base(pFile, (sql
24db0 69 74 65 33 20 2a 29 70 41 72 67 29 3b 0a 20 20  ite3 *)pArg);.  
24dc0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
24dd0 49 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b 53 54  ITE_FCNTL_LOCKST
24de0 41 54 45 5f 50 49 44 3a 20 7b 0a 20 20 20 20 20  ATE_PID: {.     
24df0 20 4c 6f 63 6b 73 74 61 74 65 50 49 44 20 2a 70   LockstatePID *p
24e00 4c 6f 63 6b 73 74 61 74 65 3b 0a 20 20 20 20 20  Lockstate;.     
24e10 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 20 20 0a   int rc;.      .
24e20 20 20 20 20 20 20 69 66 28 20 70 41 72 67 3d 3d        if( pArg==
24e30 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20  NULL ){.        
24e40 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
24e50 53 55 53 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20  SUSE;.      }.  
24e60 20 20 20 20 70 4c 6f 63 6b 73 74 61 74 65 20 3d      pLockstate =
24e70 20 28 4c 6f 63 6b 73 74 61 74 65 50 49 44 20 2a   (LockstatePID *
24e80 29 70 41 72 67 3b 0a 20 20 20 20 20 20 72 63 20  )pArg;.      rc 
24e90 3d 20 75 6e 69 78 4c 6f 63 6b 73 74 61 74 65 50  = unixLockstateP
24ea0 69 64 28 70 46 69 6c 65 2c 20 70 4c 6f 63 6b 73  id(pFile, pLocks
24eb0 74 61 74 65 2d 3e 70 69 64 2c 20 26 28 70 4c 6f  tate->pid, &(pLo
24ec0 63 6b 73 74 61 74 65 2d 3e 73 74 61 74 65 29 29  ckstate->state))
24ed0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
24ee0 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 20 20 0a  c;.    }.      .
24ef0 23 65 6e 64 69 66 20 2f 2a 20 28 53 51 4c 49 54  #endif /* (SQLIT
24f00 45 5f 45 4e 41 42 4c 45 5f 41 50 50 4c 45 5f 53  E_ENABLE_APPLE_S
24f10 50 49 3e 30 29 20 26 26 20 64 65 66 69 6e 65 64  PI>0) && defined
24f20 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 2a 2f 0a 20  (__APPLE__) */. 
24f30 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
24f40 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 7d 0a 0a  TE_NOTFOUND;.}..
24f50 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
24f60 20 73 65 63 74 6f 72 20 73 69 7a 65 20 69 6e 20   sector size in 
24f70 62 79 74 65 73 20 6f 66 20 74 68 65 20 75 6e 64  bytes of the und
24f80 65 72 6c 79 69 6e 67 20 62 6c 6f 63 6b 20 64 65  erlying block de
24f90 76 69 63 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20  vice for.** the 
24fa0 73 70 65 63 69 66 69 65 64 20 66 69 6c 65 2e 20  specified file. 
24fb0 54 68 69 73 20 69 73 20 61 6c 6d 6f 73 74 20 61  This is almost a
24fc0 6c 77 61 79 73 20 35 31 32 20 62 79 74 65 73 2c  lways 512 bytes,
24fd0 20 62 75 74 20 6d 61 79 20 62 65 0a 2a 2a 20 6c   but may be.** l
24fe0 61 72 67 65 72 20 66 6f 72 20 73 6f 6d 65 20 64  arger for some d
24ff0 65 76 69 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 51  evices..**.** SQ
25000 4c 69 74 65 20 63 6f 64 65 20 61 73 73 75 6d 65  Lite code assume
25010 73 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  s this function 
25020 63 61 6e 6e 6f 74 20 66 61 69 6c 2e 20 49 74 20  cannot fail. It 
25030 61 6c 73 6f 20 61 73 73 75 6d 65 73 20 74 68 61  also assumes tha
25040 74 0a 2a 2a 20 69 66 20 74 77 6f 20 66 69 6c 65  t.** if two file
25050 73 20 61 72 65 20 63 72 65 61 74 65 64 20 69 6e  s are created in
25060 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 2d 73   the same file-s
25070 79 73 74 65 6d 20 64 69 72 65 63 74 6f 72 79 20  ystem directory 
25080 28 69 2e 65 2e 0a 2a 2a 20 61 20 64 61 74 61 62  (i.e..** a datab
25090 61 73 65 20 61 6e 64 20 69 74 73 20 6a 6f 75 72  ase and its jour
250a0 6e 61 6c 20 66 69 6c 65 29 20 74 68 61 74 20 74  nal file) that t
250b0 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 77  he sector size w
250c0 69 6c 6c 20 62 65 20 74 68 65 0a 2a 2a 20 73 61  ill be the.** sa
250d0 6d 65 20 66 6f 72 20 62 6f 74 68 2e 0a 2a 2f 0a  me for both..*/.
250e0 23 69 66 6e 64 65 66 20 5f 5f 51 4e 58 4e 54 4f  #ifndef __QNXNTO
250f0 5f 5f 20 0a 73 74 61 74 69 63 20 69 6e 74 20 75  __ .static int u
25100 6e 69 78 53 65 63 74 6f 72 53 69 7a 65 28 73 71  nixSectorSize(sq
25110 6c 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55  lite3_file *NotU
25120 73 65 64 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  sed){.  UNUSED_P
25130 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
25140 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
25150 54 45 5f 44 45 46 41 55 4c 54 5f 53 45 43 54 4f  TE_DEFAULT_SECTO
25160 52 5f 53 49 5a 45 3b 0a 7d 0a 23 65 6e 64 69 66  R_SIZE;.}.#endif
25170 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
25180 6f 77 69 6e 67 20 76 65 72 73 69 6f 6e 20 6f 66  owing version of
25190 20 75 6e 69 78 53 65 63 74 6f 72 53 69 7a 65 28   unixSectorSize(
251a0 29 20 69 73 20 6f 70 74 69 6d 69 7a 65 64 20 66  ) is optimized f
251b0 6f 72 20 51 4e 58 2e 0a 2a 2f 0a 23 69 66 64 65  or QNX..*/.#ifde
251c0 66 20 5f 5f 51 4e 58 4e 54 4f 5f 5f 0a 23 69 6e  f __QNXNTO__.#in
251d0 63 6c 75 64 65 20 3c 73 79 73 2f 64 63 6d 64 5f  clude <sys/dcmd_
251e0 62 6c 6b 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  blk.h>.#include 
251f0 3c 73 79 73 2f 73 74 61 74 76 66 73 2e 68 3e 0a  <sys/statvfs.h>.
25200 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53  static int unixS
25210 65 63 74 6f 72 53 69 7a 65 28 73 71 6c 69 74 65  ectorSize(sqlite
25220 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 75  3_file *id){.  u
25230 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
25240 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
25250 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 73 65 63    if( pFile->sec
25260 74 6f 72 53 69 7a 65 20 3d 3d 20 30 20 29 7b 0a  torSize == 0 ){.
25270 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74 76      struct statv
25280 66 73 20 66 73 49 6e 66 6f 3b 0a 20 20 20 20 20  fs fsInfo;.     
25290 20 20 0a 20 20 20 20 2f 2a 20 53 65 74 20 64 65    .    /* Set de
252a0 66 61 75 6c 74 73 20 66 6f 72 20 6e 6f 6e 2d 73  faults for non-s
252b0 75 70 70 6f 72 74 65 64 20 66 69 6c 65 73 79 73  upported filesys
252c0 74 65 6d 73 20 2a 2f 0a 20 20 20 20 70 46 69 6c  tems */.    pFil
252d0 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20  e->sectorSize = 
252e0 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 53  SQLITE_DEFAULT_S
252f0 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 20 20 20 20  ECTOR_SIZE;.    
25300 70 46 69 6c 65 2d 3e 64 65 76 69 63 65 43 68 61  pFile->deviceCha
25310 72 61 63 74 65 72 69 73 74 69 63 73 20 3d 20 30  racteristics = 0
25320 3b 0a 20 20 20 20 69 66 28 20 66 73 74 61 74 76  ;.    if( fstatv
25330 66 73 28 70 46 69 6c 65 2d 3e 68 2c 20 26 66 73  fs(pFile->h, &fs
25340 49 6e 66 6f 29 20 3d 3d 20 2d 31 20 29 20 7b 0a  Info) == -1 ) {.
25350 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 46 69        return pFi
25360 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3b 0a  le->sectorSize;.
25370 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 21      }..    if( !
25380 73 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e 66 5f  strcmp(fsInfo.f_
25390 62 61 73 65 74 79 70 65 2c 20 22 74 6d 70 22 29  basetype, "tmp")
253a0 20 29 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65   ) {.      pFile
253b0 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 66  ->sectorSize = f
253c0 73 49 6e 66 6f 2e 66 5f 62 73 69 7a 65 3b 0a 20  sInfo.f_bsize;. 
253d0 20 20 20 20 20 70 46 69 6c 65 2d 3e 64 65 76 69       pFile->devi
253e0 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
253f0 73 20 3d 0a 20 20 20 20 20 20 20 20 53 51 4c 49  s =.        SQLI
25400 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 34  TE_IOCAP_ATOMIC4
25410 4b 20 7c 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c  K |       /* All
25420 20 72 61 6d 20 66 69 6c 65 73 79 73 74 65 6d 20   ram filesystem 
25430 77 72 69 74 65 73 20 61 72 65 20 61 74 6f 6d 69  writes are atomi
25440 63 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 51 4c  c */.        SQL
25450 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41  ITE_IOCAP_SAFE_A
25460 50 50 45 4e 44 20 7c 20 20 20 20 2f 2a 20 67 72  PPEND |    /* gr
25470 6f 77 69 6e 67 20 74 68 65 20 66 69 6c 65 20 64  owing the file d
25480 6f 65 73 20 6e 6f 74 20 6f 63 63 75 72 20 75 6e  oes not occur un
25490 74 69 6c 0a 20 20 20 20 20 20 20 20 20 20 20 20  til.            
254a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
254b0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65            ** the
254c0 20 77 72 69 74 65 20 73 75 63 63 65 65 64 73 20   write succeeds 
254d0 2a 2f 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54  */.        SQLIT
254e0 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49  E_IOCAP_SEQUENTI
254f0 41 4c 20 7c 20 20 20 20 20 2f 2a 20 54 68 65 20  AL |     /* The 
25500 72 61 6d 20 66 69 6c 65 73 79 73 74 65 6d 20 68  ram filesystem h
25510 61 73 20 6e 6f 20 77 72 69 74 65 20 62 65 68 69  as no write behi
25520 6e 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  nd.             
25530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25540 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20 69           ** so i
25550 74 20 69 73 20 6f 72 64 65 72 65 64 20 2a 2f 0a  t is ordered */.
25560 20 20 20 20 20 20 20 20 30 3b 0a 20 20 20 20 7d          0;.    }
25570 65 6c 73 65 20 69 66 28 20 73 74 72 73 74 72 28  else if( strstr(
25580 66 73 49 6e 66 6f 2e 66 5f 62 61 73 65 74 79 70  fsInfo.f_basetyp
25590 65 2c 20 22 65 74 66 73 22 29 20 29 7b 0a 20 20  e, "etfs") ){.  
255a0 20 20 20 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f      pFile->secto
255b0 72 53 69 7a 65 20 3d 20 66 73 49 6e 66 6f 2e 66  rSize = fsInfo.f
255c0 5f 62 73 69 7a 65 3b 0a 20 20 20 20 20 20 70 46  _bsize;.      pF
255d0 69 6c 65 2d 3e 64 65 76 69 63 65 43 68 61 72 61  ile->deviceChara
255e0 63 74 65 72 69 73 74 69 63 73 20 3d 0a 20 20 20  cteristics =.   
255f0 20 20 20 20 20 2f 2a 20 65 74 66 73 20 63 6c 75       /* etfs clu
25600 73 74 65 72 20 73 69 7a 65 20 77 72 69 74 65 73  ster size writes
25610 20 61 72 65 20 61 74 6f 6d 69 63 20 2a 2f 0a 20   are atomic */. 
25620 20 20 20 20 20 20 20 28 70 46 69 6c 65 2d 3e 73         (pFile->s
25630 65 63 74 6f 72 53 69 7a 65 20 2f 20 35 31 32 20  ectorSize / 512 
25640 2a 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41  * SQLITE_IOCAP_A
25650 54 4f 4d 49 43 35 31 32 29 20 7c 0a 20 20 20 20  TOMIC512) |.    
25660 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50      SQLITE_IOCAP
25670 5f 53 41 46 45 5f 41 50 50 45 4e 44 20 7c 20 20  _SAFE_APPEND |  
25680 20 20 2f 2a 20 67 72 6f 77 69 6e 67 20 74 68 65    /* growing the
25690 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 6f   file does not o
256a0 63 63 75 72 20 75 6e 74 69 6c 0a 20 20 20 20 20  ccur until.     
256b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
256c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
256d0 20 2a 2a 20 74 68 65 20 77 72 69 74 65 20 73 75   ** the write su
256e0 63 63 65 65 64 73 20 2a 2f 0a 20 20 20 20 20 20  cceeds */.      
256f0 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53    SQLITE_IOCAP_S
25700 45 51 55 45 4e 54 49 41 4c 20 7c 20 20 20 20 20  EQUENTIAL |     
25710 2f 2a 20 54 68 65 20 72 61 6d 20 66 69 6c 65 73  /* The ram files
25720 79 73 74 65 6d 20 68 61 73 20 6e 6f 20 77 72 69  ystem has no wri
25730 74 65 20 62 65 68 69 6e 64 0a 20 20 20 20 20 20  te behind.      
25740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25760 2a 2a 20 73 6f 20 69 74 20 69 73 20 6f 72 64 65  ** so it is orde
25770 72 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 30  red */.        0
25780 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
25790 21 73 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e 66  !strcmp(fsInfo.f
257a0 5f 62 61 73 65 74 79 70 65 2c 20 22 71 6e 78 36  _basetype, "qnx6
257b0 22 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c  ") ){.      pFil
257c0 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20  e->sectorSize = 
257d0 66 73 49 6e 66 6f 2e 66 5f 62 73 69 7a 65 3b 0a  fsInfo.f_bsize;.
257e0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 64 65 76        pFile->dev
257f0 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
25800 63 73 20 3d 0a 20 20 20 20 20 20 20 20 53 51 4c  cs =.        SQL
25810 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43  ITE_IOCAP_ATOMIC
25820 20 7c 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c   |         /* Al
25830 6c 20 66 69 6c 65 73 79 73 74 65 6d 20 77 72 69  l filesystem wri
25840 74 65 73 20 61 72 65 20 61 74 6f 6d 69 63 20 2a  tes are atomic *
25850 2f 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45  /.        SQLITE
25860 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45  _IOCAP_SAFE_APPE
25870 4e 44 20 7c 20 20 20 20 2f 2a 20 67 72 6f 77 69  ND |    /* growi
25880 6e 67 20 74 68 65 20 66 69 6c 65 20 64 6f 65 73  ng the file does
25890 20 6e 6f 74 20 6f 63 63 75 72 20 75 6e 74 69 6c   not occur until
258a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
258b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
258c0 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 77 72         ** the wr
258d0 69 74 65 20 73 75 63 63 65 65 64 73 20 2a 2f 0a  ite succeeds */.
258e0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49          SQLITE_I
258f0 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 20  OCAP_SEQUENTIAL 
25900 7c 20 20 20 20 20 2f 2a 20 54 68 65 20 72 61 6d  |     /* The ram
25910 20 66 69 6c 65 73 79 73 74 65 6d 20 68 61 73 20   filesystem has 
25920 6e 6f 20 77 72 69 74 65 20 62 65 68 69 6e 64 0a  no write behind.
25930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25950 20 20 20 20 20 20 2a 2a 20 73 6f 20 69 74 20 69        ** so it i
25960 73 20 6f 72 64 65 72 65 64 20 2a 2f 0a 20 20 20  s ordered */.   
25970 20 20 20 20 20 30 3b 0a 20 20 20 20 7d 65 6c 73       0;.    }els
25980 65 20 69 66 28 20 21 73 74 72 63 6d 70 28 66 73  e if( !strcmp(fs
25990 49 6e 66 6f 2e 66 5f 62 61 73 65 74 79 70 65 2c  Info.f_basetype,
259a0 20 22 71 6e 78 34 22 29 20 29 7b 0a 20 20 20 20   "qnx4") ){.    
259b0 20 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53    pFile->sectorS
259c0 69 7a 65 20 3d 20 66 73 49 6e 66 6f 2e 66 5f 62  ize = fsInfo.f_b
259d0 73 69 7a 65 3b 0a 20 20 20 20 20 20 70 46 69 6c  size;.      pFil
259e0 65 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63 74  e->deviceCharact
259f0 65 72 69 73 74 69 63 73 20 3d 0a 20 20 20 20 20  eristics =.     
25a00 20 20 20 2f 2a 20 66 75 6c 6c 20 62 69 74 73 65     /* full bitse
25a10 74 20 6f 66 20 61 74 6f 6d 69 63 73 20 66 72 6f  t of atomics fro
25a20 6d 20 6d 61 78 20 73 65 63 74 6f 72 20 73 69 7a  m max sector siz
25a30 65 20 61 6e 64 20 73 6d 61 6c 6c 65 72 20 2a 2f  e and smaller */
25a40 0a 20 20 20 20 20 20 20 20 28 28 70 46 69 6c 65  .        ((pFile
25a50 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 2f 20 35  ->sectorSize / 5
25a60 31 32 20 2a 20 53 51 4c 49 54 45 5f 49 4f 43 41  12 * SQLITE_IOCA
25a70 50 5f 41 54 4f 4d 49 43 35 31 32 29 20 3c 3c 20  P_ATOMIC512) << 
25a80 31 29 20 2d 20 32 20 7c 0a 20 20 20 20 20 20 20  1) - 2 |.       
25a90 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45   SQLITE_IOCAP_SE
25aa0 51 55 45 4e 54 49 41 4c 20 7c 20 20 20 20 20 2f  QUENTIAL |     /
25ab0 2a 20 54 68 65 20 72 61 6d 20 66 69 6c 65 73 79  * The ram filesy
25ac0 73 74 65 6d 20 68 61 73 20 6e 6f 20 77 72 69 74  stem has no writ
25ad0 65 20 62 65 68 69 6e 64 0a 20 20 20 20 20 20 20  e behind.       
25ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
25b00 2a 20 73 6f 20 69 74 20 69 73 20 6f 72 64 65 72  * so it is order
25b10 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 30 3b  ed */.        0;
25b20 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
25b30 74 72 73 74 72 28 66 73 49 6e 66 6f 2e 66 5f 62  trstr(fsInfo.f_b
25b40 61 73 65 74 79 70 65 2c 20 22 64 6f 73 22 29 20  asetype, "dos") 
25b50 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  ){.      pFile->
25b60 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 66 73 49  sectorSize = fsI
25b70 6e 66 6f 2e 66 5f 62 73 69 7a 65 3b 0a 20 20 20  nfo.f_bsize;.   
25b80 20 20 20 70 46 69 6c 65 2d 3e 64 65 76 69 63 65     pFile->device
25b90 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20  Characteristics 
25ba0 3d 0a 20 20 20 20 20 20 20 20 2f 2a 20 66 75 6c  =.        /* ful
25bb0 6c 20 62 69 74 73 65 74 20 6f 66 20 61 74 6f 6d  l bitset of atom
25bc0 69 63 73 20 66 72 6f 6d 20 6d 61 78 20 73 65 63  ics from max sec
25bd0 74 6f 72 20 73 69 7a 65 20 61 6e 64 20 73 6d 61  tor size and sma
25be0 6c 6c 65 72 20 2a 2f 0a 20 20 20 20 20 20 20 20  ller */.        
25bf0 28 28 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53  ((pFile->sectorS
25c00 69 7a 65 20 2f 20 35 31 32 20 2a 20 53 51 4c 49  ize / 512 * SQLI
25c10 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35  TE_IOCAP_ATOMIC5
25c20 31 32 29 20 3c 3c 20 31 29 20 2d 20 32 20 7c 0a  12) << 1) - 2 |.
25c30 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49          SQLITE_I
25c40 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 20  OCAP_SEQUENTIAL 
25c50 7c 20 20 20 20 20 2f 2a 20 54 68 65 20 72 61 6d  |     /* The ram
25c60 20 66 69 6c 65 73 79 73 74 65 6d 20 68 61 73 20   filesystem has 
25c70 6e 6f 20 77 72 69 74 65 20 62 65 68 69 6e 64 0a  no write behind.
25c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25ca0 20 20 20 20 20 20 2a 2a 20 73 6f 20 69 74 20 69        ** so it i
25cb0 73 20 6f 72 64 65 72 65 64 20 2a 2f 0a 20 20 20  s ordered */.   
25cc0 20 20 20 20 20 30 3b 0a 20 20 20 20 7d 65 6c 73       0;.    }els
25cd0 65 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  e{.      pFile->
25ce0 64 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  deviceCharacteri
25cf0 73 74 69 63 73 20 3d 0a 20 20 20 20 20 20 20 20  stics =.        
25d00 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f  SQLITE_IOCAP_ATO
25d10 4d 49 43 35 31 32 20 7c 20 20 20 20 20 20 2f 2a  MIC512 |      /*
25d20 20 62 6c 6f 63 6b 73 20 61 72 65 20 61 74 6f 6d   blocks are atom
25d30 69 63 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 51  ic */.        SQ
25d40 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f  LITE_IOCAP_SAFE_
25d50 41 50 50 45 4e 44 20 7c 20 20 20 20 2f 2a 20 67  APPEND |    /* g
25d60 72 6f 77 69 6e 67 20 74 68 65 20 66 69 6c 65 20  rowing the file 
25d70 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75 72 20 75  does not occur u
25d80 6e 74 69 6c 0a 20 20 20 20 20 20 20 20 20 20 20  ntil.           
25d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25da0 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68             ** th
25db0 65 20 77 72 69 74 65 20 73 75 63 63 65 65 64 73  e write succeeds
25dc0 20 2a 2f 0a 20 20 20 20 20 20 20 20 30 3b 0a 20   */.        0;. 
25dd0 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20 4c 61     }.  }.  /* La
25de0 73 74 20 63 68 61 6e 63 65 20 76 65 72 69 66 69  st chance verifi
25df0 63 61 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20  cation.  If the 
25e00 73 65 63 74 6f 72 20 73 69 7a 65 20 69 73 6e 27  sector size isn'
25e10 74 20 61 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20  t a multiple of 
25e20 35 31 32 0a 20 20 2a 2a 20 74 68 65 6e 20 69 74  512.  ** then it
25e30 20 69 73 6e 27 74 20 76 61 6c 69 64 2e 2a 2f 0a   isn't valid.*/.
25e40 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 73 65 63    if( pFile->sec
25e50 74 6f 72 53 69 7a 65 20 25 20 35 31 32 20 21 3d  torSize % 512 !=
25e60 20 30 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d   0 ){.    pFile-
25e70 3e 64 65 76 69 63 65 43 68 61 72 61 63 74 65 72  >deviceCharacter
25e80 69 73 74 69 63 73 20 3d 20 30 3b 0a 20 20 20 20  istics = 0;.    
25e90 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a  pFile->sectorSiz
25ea0 65 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55  e = SQLITE_DEFAU
25eb0 4c 54 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a  LT_SECTOR_SIZE;.
25ec0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 46 69    }.  return pFi
25ed0 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3b 0a  le->sectorSize;.
25ee0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 5f 5f 51 4e  }.#endif /* __QN
25ef0 58 4e 54 4f 5f 5f 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  XNTO__ */../*.**
25f00 20 52 65 74 75 72 6e 20 74 68 65 20 64 65 76 69   Return the devi
25f10 63 65 20 63 68 61 72 61 63 74 65 72 69 73 74 69  ce characteristi
25f20 63 73 20 66 6f 72 20 74 68 65 20 66 69 6c 65 2e  cs for the file.
25f30 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 56 46 53 20  .**.** This VFS 
25f40 69 73 20 73 65 74 20 75 70 20 74 6f 20 72 65 74  is set up to ret
25f50 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 43 41 50  urn SQLITE_IOCAP
25f60 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57  _POWERSAFE_OVERW
25f70 52 49 54 45 20 62 79 20 64 65 66 61 75 6c 74 2e  RITE by default.
25f80 0a 2a 2a 20 48 6f 77 65 76 65 72 2c 20 74 68 61  .** However, tha
25f90 74 20 63 68 6f 69 63 65 20 69 73 20 63 6f 6e 74  t choice is cont
25fa0 72 6f 76 65 72 73 69 61 6c 20 73 69 6e 63 65 20  roversial since 
25fb0 74 65 63 68 6e 69 63 61 6c 6c 79 20 74 68 65 20  technically the 
25fc0 75 6e 64 65 72 6c 79 69 6e 67 0a 2a 2a 20 66 69  underlying.** fi
25fd0 6c 65 20 73 79 73 74 65 6d 20 64 6f 65 73 20 6e  le system does n
25fe0 6f 74 20 61 6c 77 61 79 73 20 70 72 6f 76 69 64  ot always provid
25ff0 65 20 70 6f 77 65 72 73 61 66 65 20 6f 76 65 72  e powersafe over
26000 77 72 69 74 65 73 2e 20 20 28 49 6e 20 6f 74 68  writes.  (In oth
26010 65 72 0a 2a 2a 20 77 6f 72 64 73 2c 20 61 66 74  er.** words, aft
26020 65 72 20 61 20 70 6f 77 65 72 2d 6c 6f 73 73 20  er a power-loss 
26030 65 76 65 6e 74 2c 20 70 61 72 74 73 20 6f 66 20  event, parts of 
26040 74 68 65 20 66 69 6c 65 20 74 68 61 74 20 77 65  the file that we
26050 72 65 20 6e 65 76 65 72 0a 2a 2a 20 77 72 69 74  re never.** writ
26060 74 65 6e 20 6d 69 67 68 74 20 65 6e 64 20 75 70  ten might end up
26070 20 62 65 69 6e 67 20 61 6c 74 65 72 65 64 2e 29   being altered.)
26080 20 20 48 6f 77 65 76 65 72 2c 20 6e 6f 6e 2d 50    However, non-P
26090 53 4f 57 20 62 65 68 61 76 69 6f 72 20 69 73 20  SOW behavior is 
260a0 76 65 72 79 2c 0a 2a 2a 20 76 65 72 79 20 72 61  very,.** very ra
260b0 72 65 2e 20 20 41 6e 64 20 61 73 73 65 72 74 69  re.  And asserti
260c0 6e 67 20 50 53 4f 57 20 6d 61 6b 65 73 20 61 20  ng PSOW makes a 
260d0 6c 61 72 67 65 20 72 65 64 75 63 74 69 6f 6e 20  large reduction 
260e0 69 6e 20 74 68 65 20 61 6d 6f 75 6e 74 0a 2a 2a  in the amount.**
260f0 20 6f 66 20 72 65 71 75 69 72 65 64 20 49 2f 4f   of required I/O
26100 20 66 6f 72 20 6a 6f 75 72 6e 61 6c 69 6e 67 2c   for journaling,
26110 20 73 69 6e 63 65 20 61 20 6c 6f 74 20 6f 66 20   since a lot of 
26120 70 61 64 64 69 6e 67 20 69 73 20 65 6c 69 6d 69  padding is elimi
26130 6e 61 74 65 64 2e 0a 2a 2a 20 20 48 65 6e 63 65  nated..**  Hence
26140 2c 20 77 68 69 6c 65 20 50 4f 57 45 52 53 41 46  , while POWERSAF
26150 45 5f 4f 56 45 52 57 52 49 54 45 20 69 73 20 6f  E_OVERWRITE is o
26160 6e 20 62 79 20 64 65 66 61 75 6c 74 2c 20 74 68  n by default, th
26170 65 72 65 20 69 73 20 61 20 66 69 6c 65 2d 63 6f  ere is a file-co
26180 6e 74 72 6f 6c 0a 2a 2a 20 61 76 61 69 6c 61 62  ntrol.** availab
26190 6c 65 20 74 6f 20 74 75 72 6e 20 69 74 20 6f 66  le to turn it of
261a0 66 20 61 6e 64 20 55 52 49 20 71 75 65 72 79 20  f and URI query 
261b0 70 61 72 61 6d 65 74 65 72 20 61 76 61 69 6c 61  parameter availa
261c0 62 6c 65 20 74 6f 20 74 75 72 6e 20 69 74 20 6f  ble to turn it o
261d0 66 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ff..*/.static in
261e0 74 20 75 6e 69 78 44 65 76 69 63 65 43 68 61 72  t unixDeviceChar
261f0 61 63 74 65 72 69 73 74 69 63 73 28 73 71 6c 69  acteristics(sqli
26200 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20  te3_file *id){. 
26210 20 75 6e 69 78 46 69 6c 65 20 2a 70 20 3d 20 28   unixFile *p = (
26220 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
26230 69 6e 74 20 72 63 20 3d 20 30 3b 0a 23 69 66 64  int rc = 0;.#ifd
26240 65 66 20 5f 5f 51 4e 58 4e 54 4f 5f 5f 0a 20 20  ef __QNXNTO__.  
26250 69 66 28 20 70 2d 3e 73 65 63 74 6f 72 53 69 7a  if( p->sectorSiz
26260 65 3d 3d 30 20 29 20 75 6e 69 78 53 65 63 74 6f  e==0 ) unixSecto
26270 72 53 69 7a 65 28 69 64 29 3b 0a 20 20 72 63 20  rSize(id);.  rc 
26280 3d 20 70 2d 3e 64 65 76 69 63 65 43 68 61 72 61  = p->deviceChara
26290 63 74 65 72 69 73 74 69 63 73 3b 0a 23 65 6e 64  cteristics;.#end
262a0 69 66 0a 20 20 69 66 28 20 70 2d 3e 63 74 72 6c  if.  if( p->ctrl
262b0 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45  Flags & UNIXFILE
262c0 5f 50 53 4f 57 20 29 7b 0a 20 20 20 20 72 63 20  _PSOW ){.    rc 
262d0 7c 3d 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  |= SQLITE_IOCAP_
262e0 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52  POWERSAFE_OVERWR
262f0 49 54 45 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ITE;.  }.  retur
26300 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 20 21 64 65  n rc;.}..#if !de
26310 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
26320 54 5f 57 41 4c 29 20 7c 7c 20 53 51 4c 49 54 45  T_WAL) || SQLITE
26330 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
26340 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
26350 68 65 20 73 79 73 74 65 6d 20 70 61 67 65 20 73  he system page s
26360 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ize..**.** This 
26370 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20  function should 
26380 6e 6f 74 20 62 65 20 63 61 6c 6c 65 64 20 64 69  not be called di
26390 72 65 63 74 6c 79 20 62 79 20 6f 74 68 65 72 20  rectly by other 
263a0 63 6f 64 65 20 69 6e 20 74 68 69 73 20 66 69 6c  code in this fil
263b0 65 2e 20 0a 2a 2a 20 49 6e 73 74 65 61 64 2c 20  e. .** Instead, 
263c0 69 74 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c  it should be cal
263d0 6c 65 64 20 76 69 61 20 6d 61 63 72 6f 20 6f 73  led via macro os
263e0 47 65 74 70 61 67 65 73 69 7a 65 28 29 2e 0a 2a  Getpagesize()..*
263f0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
26400 78 47 65 74 70 61 67 65 73 69 7a 65 28 76 6f 69  xGetpagesize(voi
26410 64 29 7b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52  d){.#if OS_VXWOR
26420 4b 53 0a 20 20 72 65 74 75 72 6e 20 31 30 32 34  KS.  return 1024
26430 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28  ;.#elif defined(
26440 5f 42 53 44 5f 53 4f 55 52 43 45 29 0a 20 20 72  _BSD_SOURCE).  r
26450 65 74 75 72 6e 20 67 65 74 70 61 67 65 73 69 7a  eturn getpagesiz
26460 65 28 29 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74  e();.#else.  ret
26470 75 72 6e 20 28 69 6e 74 29 73 79 73 63 6f 6e 66  urn (int)sysconf
26480 28 5f 53 43 5f 50 41 47 45 53 49 5a 45 29 3b 0a  (_SC_PAGESIZE);.
26490 23 65 6e 64 69 66 0a 7d 0a 0a 23 65 6e 64 69 66  #endif.}..#endif
264a0 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c   /* !defined(SQL
264b0 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 20 7c 7c  ITE_OMIT_WAL) ||
264c0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
264d0 5f 53 49 5a 45 3e 30 20 2a 2f 0a 0a 23 69 66 6e  _SIZE>0 */..#ifn
264e0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
264f0 57 41 4c 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a 65 63  WAL../*.** Objec
26500 74 20 75 73 65 64 20 74 6f 20 72 65 70 72 65 73  t used to repres
26510 65 6e 74 20 61 6e 20 73 68 61 72 65 64 20 6d 65  ent an shared me
26520 6d 6f 72 79 20 62 75 66 66 65 72 2e 20 20 0a 2a  mory buffer.  .*
26530 2a 0a 2a 2a 20 57 68 65 6e 20 6d 75 6c 74 69 70  *.** When multip
26540 6c 65 20 74 68 72 65 61 64 73 20 61 6c 6c 20 72  le threads all r
26550 65 66 65 72 65 6e 63 65 20 74 68 65 20 73 61 6d  eference the sam
26560 65 20 77 61 6c 2d 69 6e 64 65 78 2c 20 65 61 63  e wal-index, eac
26570 68 20 74 68 72 65 61 64 0a 2a 2a 20 68 61 73 20  h thread.** has 
26580 69 74 73 20 6f 77 6e 20 75 6e 69 78 53 68 6d 20  its own unixShm 
26590 6f 62 6a 65 63 74 2c 20 62 75 74 20 74 68 65 79  object, but they
265a0 20 61 6c 6c 20 70 6f 69 6e 74 20 74 6f 20 61 20   all point to a 
265b0 73 69 6e 67 6c 65 20 69 6e 73 74 61 6e 63 65 0a  single instance.
265c0 2a 2a 20 6f 66 20 74 68 69 73 20 75 6e 69 78 53  ** of this unixS
265d0 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 2e 20 20  hmNode object.  
265e0 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
265f0 65 61 63 68 20 77 61 6c 2d 69 6e 64 65 78 20 69  each wal-index i
26600 73 20 6f 70 65 6e 65 64 0a 2a 2a 20 6f 6e 6c 79  s opened.** only
26610 20 6f 6e 63 65 20 70 65 72 20 70 72 6f 63 65 73   once per proces
26620 73 2e 0a 2a 2a 0a 2a 2a 20 45 61 63 68 20 75 6e  s..**.** Each un
26630 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74  ixShmNode object
26640 20 69 73 20 63 6f 6e 6e 65 63 74 65 64 20 74 6f   is connected to
26650 20 61 20 73 69 6e 67 6c 65 20 75 6e 69 78 49 6e   a single unixIn
26660 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 2e 0a  odeInfo object..
26670 2a 2a 20 57 65 20 63 6f 75 6c 64 20 63 6f 61 6c  ** We could coal
26680 65 73 63 65 20 74 68 69 73 20 6f 62 6a 65 63 74  esce this object
26690 20 69 6e 74 6f 20 75 6e 69 78 49 6e 6f 64 65 49   into unixInodeI
266a0 6e 66 6f 2c 20 62 75 74 20 74 68 61 74 20 77 6f  nfo, but that wo
266b0 75 6c 64 20 6d 65 61 6e 0a 2a 2a 20 65 76 65 72  uld mean.** ever
266c0 79 20 6f 70 65 6e 20 66 69 6c 65 20 74 68 61 74  y open file that
266d0 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 73 68   does not use sh
266e0 61 72 65 64 20 6d 65 6d 6f 72 79 20 28 69 6e 20  ared memory (in 
266f0 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 6d 6f 73  other words, mos
26700 74 0a 2a 2a 20 6f 70 65 6e 20 66 69 6c 65 73 29  t.** open files)
26710 20 77 6f 75 6c 64 20 68 61 76 65 20 74 6f 20 63   would have to c
26720 61 72 72 79 20 61 72 6f 75 6e 64 20 74 68 69 73  arry around this
26730 20 65 78 74 72 61 20 69 6e 66 6f 72 6d 61 74 69   extra informati
26740 6f 6e 2e 20 20 53 6f 0a 2a 2a 20 74 68 65 20 75  on.  So.** the u
26750 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a  nixInodeInfo obj
26760 65 63 74 20 63 6f 6e 74 61 69 6e 73 20 61 20 70  ect contains a p
26770 6f 69 6e 74 65 72 20 74 6f 20 74 68 69 73 20 75  ointer to this u
26780 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63  nixShmNode objec
26790 74 0a 2a 2a 20 61 6e 64 20 74 68 65 20 75 6e 69  t.** and the uni
267a0 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20  xShmNode object 
267b0 69 73 20 63 72 65 61 74 65 64 20 6f 6e 6c 79 20  is created only 
267c0 77 68 65 6e 20 6e 65 65 64 65 64 2e 0a 2a 2a 0a  when needed..**.
267d0 2a 2a 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64  ** unixMutexHeld
267e0 28 29 20 6d 75 73 74 20 62 65 20 74 72 75 65 20  () must be true 
267f0 77 68 65 6e 20 63 72 65 61 74 69 6e 67 20 6f 72  when creating or
26800 20 64 65 73 74 72 6f 79 69 6e 67 0a 2a 2a 20 74   destroying.** t
26810 68 69 73 20 6f 62 6a 65 63 74 20 6f 72 20 77 68  his object or wh
26820 69 6c 65 20 72 65 61 64 69 6e 67 20 6f 72 20 77  ile reading or w
26830 72 69 74 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f  riting the follo
26840 77 69 6e 67 20 66 69 65 6c 64 73 3a 0a 2a 2a 0a  wing fields:.**.
26850 2a 2a 20 20 20 20 20 20 6e 52 65 66 0a 2a 2a 0a  **      nRef.**.
26860 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
26870 20 66 69 65 6c 64 73 20 61 72 65 20 72 65 61 64   fields are read
26880 2d 6f 6e 6c 79 20 61 66 74 65 72 20 74 68 65 20  -only after the 
26890 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61 74 65  object is create
268a0 64 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 20 20 20 66  d:.** .**      f
268b0 69 64 0a 2a 2a 20 20 20 20 20 20 7a 46 69 6c 65  id.**      zFile
268c0 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 45 69 74 68 65  name.**.** Eithe
268d0 72 20 75 6e 69 78 53 68 6d 4e 6f 64 65 2e 6d 75  r unixShmNode.mu
268e0 74 65 78 20 6d 75 73 74 20 62 65 20 68 65 6c 64  tex must be held
268f0 20 6f 72 20 75 6e 69 78 53 68 6d 4e 6f 64 65 2e   or unixShmNode.
26900 6e 52 65 66 3d 3d 30 20 61 6e 64 0a 2a 2a 20 75  nRef==0 and.** u
26910 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20 69  nixMutexHeld() i
26920 73 20 74 72 75 65 20 77 68 65 6e 20 72 65 61 64  s true when read
26930 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 61  ing or writing a
26940 6e 79 20 6f 74 68 65 72 20 66 69 65 6c 64 0a 2a  ny other field.*
26950 2a 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74  * in this struct
26960 75 72 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 75  ure..*/.struct u
26970 6e 69 78 53 68 6d 4e 6f 64 65 20 7b 0a 20 20 75  nixShmNode {.  u
26980 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49  nixInodeInfo *pI
26990 6e 6f 64 65 3b 20 20 20 20 20 2f 2a 20 75 6e 69  node;     /* uni
269a0 78 49 6e 6f 64 65 49 6e 66 6f 20 74 68 61 74 20  xInodeInfo that 
269b0 6f 77 6e 73 20 74 68 69 73 20 53 48 4d 20 6e 6f  owns this SHM no
269c0 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  de */.  sqlite3_
269d0 6d 75 74 65 78 20 2a 6d 75 74 65 78 3b 20 20 20  mutex *mutex;   
269e0 20 20 20 2f 2a 20 4d 75 74 65 78 20 74 6f 20 61     /* Mutex to a
269f0 63 63 65 73 73 20 74 68 69 73 20 6f 62 6a 65 63  ccess this objec
26a00 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69  t */.  char *zFi
26a10 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20  lename;         
26a20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
26a30 20 6d 6d 61 70 70 65 64 20 66 69 6c 65 20 2a 2f   mmapped file */
26a40 0a 20 20 69 6e 74 20 68 3b 20 20 20 20 20 20 20  .  int h;       
26a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26a60 20 4f 70 65 6e 20 66 69 6c 65 20 64 65 73 63 72   Open file descr
26a70 69 70 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 73  iptor */.  int s
26a80 7a 52 65 67 69 6f 6e 3b 20 20 20 20 20 20 20 20  zRegion;        
26a90 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
26aa0 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72   shared-memory r
26ab0 65 67 69 6f 6e 73 20 2a 2f 0a 20 20 75 31 36 20  egions */.  u16 
26ac0 6e 52 65 67 69 6f 6e 3b 20 20 20 20 20 20 20 20  nRegion;        
26ad0 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
26ae0 66 20 61 72 72 61 79 20 61 70 52 65 67 69 6f 6e  f array apRegion
26af0 20 2a 2f 0a 20 20 75 38 20 69 73 52 65 61 64 6f   */.  u8 isReado
26b00 6e 6c 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  nly;            
26b10 20 2f 2a 20 54 72 75 65 20 69 66 20 72 65 61 64   /* True if read
26b20 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 63 68 61 72 20  -only */.  char 
26b30 2a 2a 61 70 52 65 67 69 6f 6e 3b 20 20 20 20 20  **apRegion;     
26b40 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f        /* Array o
26b50 66 20 6d 61 70 70 65 64 20 73 68 61 72 65 64 2d  f mapped shared-
26b60 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 73 20 2a  memory regions *
26b70 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20  /.  int nRef;   
26b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26b90 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e 69 78  * Number of unix
26ba0 53 68 6d 20 6f 62 6a 65 63 74 73 20 70 6f 69 6e  Shm objects poin
26bb0 74 69 6e 67 20 74 6f 20 74 68 69 73 20 2a 2f 0a  ting to this */.
26bc0 20 20 75 6e 69 78 53 68 6d 20 2a 70 46 69 72 73    unixShm *pFirs
26bd0 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t;           /* 
26be0 41 6c 6c 20 75 6e 69 78 53 68 6d 20 6f 62 6a 65  All unixShm obje
26bf0 63 74 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  cts pointing to 
26c00 74 68 69 73 20 2a 2f 0a 23 69 66 64 65 66 20 53  this */.#ifdef S
26c10 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 75 38  QLITE_DEBUG.  u8
26c20 20 65 78 63 6c 4d 61 73 6b 3b 20 20 20 20 20 20   exclMask;      
26c30 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b           /* Mask
26c40 20 6f 66 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   of exclusive lo
26c50 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20 75 38  cks held */.  u8
26c60 20 73 68 61 72 65 64 4d 61 73 6b 3b 20 20 20 20   sharedMask;    
26c70 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b           /* Mask
26c80 20 6f 66 20 73 68 61 72 65 64 20 6c 6f 63 6b 73   of shared locks
26c90 20 68 65 6c 64 20 2a 2f 0a 20 20 75 38 20 6e 65   held */.  u8 ne
26ca0 78 74 53 68 6d 49 64 3b 20 20 20 20 20 20 20 20  xtShmId;        
26cb0 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 61 76        /* Next av
26cc0 61 69 6c 61 62 6c 65 20 75 6e 69 78 53 68 6d 2e  ailable unixShm.
26cd0 69 64 20 76 61 6c 75 65 20 2a 2f 0a 23 65 6e 64  id value */.#end
26ce0 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 53 74 72  if.};../*.** Str
26cf0 75 63 74 75 72 65 20 75 73 65 64 20 69 6e 74 65  ucture used inte
26d00 72 6e 61 6c 6c 79 20 62 79 20 74 68 69 73 20 56  rnally by this V
26d10 46 53 20 74 6f 20 72 65 63 6f 72 64 20 74 68 65  FS to record the
26d20 20 73 74 61 74 65 20 6f 66 20 61 6e 0a 2a 2a 20   state of an.** 
26d30 6f 70 65 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f  open shared memo
26d40 72 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a  ry connection..*
26d50 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
26d60 6e 67 20 66 69 65 6c 64 73 20 61 72 65 20 69 6e  ng fields are in
26d70 69 74 69 61 6c 69 7a 65 64 20 77 68 65 6e 20 74  itialized when t
26d80 68 69 73 20 6f 62 6a 65 63 74 20 69 73 20 63 72  his object is cr
26d90 65 61 74 65 64 20 61 6e 64 0a 2a 2a 20 61 72 65  eated and.** are
26da0 20 72 65 61 64 2d 6f 6e 6c 79 20 74 68 65 72 65   read-only there
26db0 61 66 74 65 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  after:.**.**    
26dc0 75 6e 69 78 53 68 6d 2e 70 46 69 6c 65 0a 2a 2a  unixShm.pFile.**
26dd0 20 20 20 20 75 6e 69 78 53 68 6d 2e 69 64 0a 2a      unixShm.id.*
26de0 2a 0a 2a 2a 20 41 6c 6c 20 6f 74 68 65 72 20 66  *.** All other f
26df0 69 65 6c 64 73 20 61 72 65 20 72 65 61 64 2f 77  ields are read/w
26e00 72 69 74 65 2e 20 20 54 68 65 20 75 6e 69 78 53  rite.  The unixS
26e10 68 6d 2e 70 46 69 6c 65 2d 3e 6d 75 74 65 78 20  hm.pFile->mutex 
26e20 6d 75 73 74 20 62 65 20 68 65 6c 64 0a 2a 2a 20  must be held.** 
26e30 77 68 69 6c 65 20 61 63 63 65 73 73 69 6e 67 20  while accessing 
26e40 61 6e 79 20 72 65 61 64 2f 77 72 69 74 65 20 66  any read/write f
26e50 69 65 6c 64 73 2e 0a 2a 2f 0a 73 74 72 75 63 74  ields..*/.struct
26e60 20 75 6e 69 78 53 68 6d 20 7b 0a 20 20 75 6e 69   unixShm {.  uni
26e70 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f  xShmNode *pShmNo
26e80 64 65 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 75  de;     /* The u
26e90 6e 64 65 72 6c 79 69 6e 67 20 75 6e 69 78 53 68  nderlying unixSh
26ea0 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 2a 2f 0a  mNode object */.
26eb0 20 20 75 6e 69 78 53 68 6d 20 2a 70 4e 65 78 74    unixShm *pNext
26ec0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
26ed0 4e 65 78 74 20 75 6e 69 78 53 68 6d 20 77 69 74  Next unixShm wit
26ee0 68 20 74 68 65 20 73 61 6d 65 20 75 6e 69 78 53  h the same unixS
26ef0 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 75 38 20 68  hmNode */.  u8 h
26f00 61 73 4d 75 74 65 78 3b 20 20 20 20 20 20 20 20  asMutex;        
26f10 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
26f20 66 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 75 6e  f holding the un
26f30 69 78 53 68 6d 4e 6f 64 65 20 6d 75 74 65 78 20  ixShmNode mutex 
26f40 2a 2f 0a 20 20 75 38 20 69 64 3b 20 20 20 20 20  */.  u8 id;     
26f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26f60 2f 2a 20 49 64 20 6f 66 20 74 68 69 73 20 63 6f  /* Id of this co
26f70 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 69 6e 20  nnection within 
26f80 69 74 73 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  its unixShmNode 
26f90 2a 2f 0a 20 20 75 31 36 20 73 68 61 72 65 64 4d  */.  u16 sharedM
26fa0 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ask;            
26fb0 2f 2a 20 4d 61 73 6b 20 6f 66 20 73 68 61 72 65  /* Mask of share
26fc0 64 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a  d locks held */.
26fd0 20 20 75 31 36 20 65 78 63 6c 4d 61 73 6b 3b 20    u16 exclMask; 
26fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26ff0 4d 61 73 6b 20 6f 66 20 65 78 63 6c 75 73 69 76  Mask of exclusiv
27000 65 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a  e locks held */.
27010 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 61  };../*.** Consta
27020 6e 74 73 20 75 73 65 64 20 66 6f 72 20 6c 6f 63  nts used for loc
27030 6b 69 6e 67 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  king.*/.#define 
27040 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45 20 20 20  UNIX_SHM_BASE   
27050 28 28 32 32 2b 53 51 4c 49 54 45 5f 53 48 4d 5f  ((22+SQLITE_SHM_
27060 4e 4c 4f 43 4b 29 2a 34 29 20 20 20 20 20 20 20  NLOCK)*4)       
27070 20 20 2f 2a 20 66 69 72 73 74 20 6c 6f 63 6b 20    /* first lock 
27080 62 79 74 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  byte */.#define 
27090 55 4e 49 58 5f 53 48 4d 5f 44 4d 53 20 20 20 20  UNIX_SHM_DMS    
270a0 28 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45 2b 53  (UNIX_SHM_BASE+S
270b0 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 29  QLITE_SHM_NLOCK)
270c0 20 20 2f 2a 20 64 65 61 64 6d 61 6e 20 73 77 69    /* deadman swi
270d0 74 63 68 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 70  tch */../*.** Ap
270e0 70 6c 79 20 70 6f 73 69 78 20 61 64 76 69 73 6f  ply posix adviso
270f0 72 79 20 6c 6f 63 6b 73 20 66 6f 72 20 61 6c 6c  ry locks for all
27100 20 62 79 74 65 73 20 66 72 6f 6d 20 6f 66 73 74   bytes from ofst
27110 20 74 68 72 6f 75 67 68 20 6f 66 73 74 2b 6e 2d   through ofst+n-
27120 31 2e 0a 2a 2a 0a 2a 2a 20 4c 6f 63 6b 73 20 62  1..**.** Locks b
27130 6c 6f 63 6b 20 69 66 20 74 68 65 20 6d 61 73 6b  lock if the mask
27140 20 69 73 20 65 78 61 63 74 6c 79 20 55 4e 49 58   is exactly UNIX
27150 5f 53 48 4d 5f 43 20 61 6e 64 20 61 72 65 20 6e  _SHM_C and are n
27160 6f 6e 2d 62 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 6f  on-blocking.** o
27170 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61  therwise..*/.sta
27180 74 69 63 20 69 6e 74 20 75 6e 69 78 53 68 6d 53  tic int unixShmS
27190 79 73 74 65 6d 4c 6f 63 6b 28 0a 20 20 75 6e 69  ystemLock(.  uni
271a0 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 20  xFile *pFile,   
271b0 20 20 20 20 2f 2a 20 4f 70 65 6e 20 63 6f 6e 6e      /* Open conn
271c0 65 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 57 41  ection to the WA
271d0 4c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  L file */.  int 
271e0 6c 6f 63 6b 54 79 70 65 2c 20 20 20 20 20 20 20  lockType,       
271f0 20 20 20 2f 2a 20 46 5f 55 4e 4c 43 4b 2c 20 46     /* F_UNLCK, F
27200 5f 52 44 4c 43 4b 2c 20 6f 72 20 46 5f 57 52 4c  _RDLCK, or F_WRL
27210 43 4b 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 73 74  CK */.  int ofst
27220 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
27230 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66 20  * First byte of 
27240 74 68 65 20 6c 6f 63 6b 69 6e 67 20 72 61 6e 67  the locking rang
27250 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 20 20 20 20  e */.  int n    
27260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
27270 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
27280 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20   to lock */.){. 
27290 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53   unixShmNode *pS
272a0 68 6d 4e 6f 64 65 3b 20 2f 2a 20 41 70 70 6c 79  hmNode; /* Apply
272b0 20 6c 6f 63 6b 73 20 74 6f 20 74 68 69 73 20 6f   locks to this o
272c0 70 65 6e 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  pen shared-memor
272d0 79 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 73  y segment */.  s
272e0 74 72 75 63 74 20 66 6c 6f 63 6b 20 66 3b 20 20  truct flock f;  
272f0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 73        /* The pos
27300 69 78 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b  ix advisory lock
27310 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 2a 2f  ing structure */
27320 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
27330 54 45 5f 4f 4b 3b 20 20 20 20 2f 2a 20 52 65 73  TE_OK;    /* Res
27340 75 6c 74 20 63 6f 64 65 20 66 6f 72 6d 20 66 63  ult code form fc
27350 6e 74 6c 28 29 20 2a 2f 0a 0a 20 20 2f 2a 20 41  ntl() */..  /* A
27360 63 63 65 73 73 20 74 6f 20 74 68 65 20 75 6e 69  ccess to the uni
27370 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20  xShmNode object 
27380 69 73 20 73 65 72 69 61 6c 69 7a 65 64 20 62 79  is serialized by
27390 20 74 68 65 20 63 61 6c 6c 65 72 20 2a 2f 0a 20   the caller */. 
273a0 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 46 69 6c   pShmNode = pFil
273b0 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e  e->pInode->pShmN
273c0 6f 64 65 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ode;.  assert( s
273d0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
273e0 64 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  d(pShmNode->mute
273f0 78 29 20 7c 7c 20 70 53 68 6d 4e 6f 64 65 2d 3e  x) || pShmNode->
27400 6e 52 65 66 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a  nRef==0 );..  /*
27410 20 53 68 61 72 65 64 20 6c 6f 63 6b 73 20 6e 65   Shared locks ne
27420 76 65 72 20 73 70 61 6e 20 6d 6f 72 65 20 74 68  ver span more th
27430 61 6e 20 6f 6e 65 20 62 79 74 65 20 2a 2f 0a 20  an one byte */. 
27440 20 61 73 73 65 72 74 28 20 6e 3d 3d 31 20 7c 7c   assert( n==1 ||
27450 20 6c 6f 63 6b 54 79 70 65 21 3d 46 5f 52 44 4c   lockType!=F_RDL
27460 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 6b  CK );..  /* Lock
27470 73 20 61 72 65 20 77 69 74 68 69 6e 20 72 61 6e  s are within ran
27480 67 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ge */.  assert( 
27490 6e 3e 3d 31 20 26 26 20 6e 3c 53 51 4c 49 54 45  n>=1 && n<SQLITE
274a0 5f 53 48 4d 5f 4e 4c 4f 43 4b 20 29 3b 0a 0a 20  _SHM_NLOCK );.. 
274b0 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68   if( pShmNode->h
274c0 3e 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6c  >=0 ){.    int l
274d0 6b 54 79 70 65 3b 0a 20 20 20 20 2f 2a 20 49 6e  kType;.    /* In
274e0 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6c 6f 63  itialize the loc
274f0 6b 69 6e 67 20 70 61 72 61 6d 65 74 65 72 73 20  king parameters 
27500 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 66  */.    memset(&f
27510 2c 20 30 2c 20 73 69 7a 65 6f 66 28 66 29 29 3b  , 0, sizeof(f));
27520 0a 20 20 20 20 66 2e 6c 5f 74 79 70 65 20 3d 20  .    f.l_type = 
27530 6c 6f 63 6b 54 79 70 65 3b 0a 20 20 20 20 66 2e  lockType;.    f.
27540 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f  l_whence = SEEK_
27550 53 45 54 3b 0a 20 20 20 20 66 2e 6c 5f 73 74 61  SET;.    f.l_sta
27560 72 74 20 3d 20 6f 66 73 74 3b 0a 20 20 20 20 66  rt = ofst;.    f
27570 2e 6c 5f 6c 65 6e 20 3d 20 6e 3b 0a 0a 20 20 20  .l_len = n;..   
27580 20 6c 6b 54 79 70 65 20 3d 20 28 70 46 69 6c 65   lkType = (pFile
27590 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e  ->ctrlFlags & UN
275a0 49 58 46 49 4c 45 5f 42 4c 4f 43 4b 29 21 3d 30  IXFILE_BLOCK)!=0
275b0 20 3f 20 46 5f 53 45 54 4c 4b 57 20 3a 20 46 5f   ? F_SETLKW : F_
275c0 53 45 54 4c 4b 3b 0a 20 20 20 20 72 63 20 3d 20  SETLK;.    rc = 
275d0 6f 73 46 63 6e 74 6c 28 70 53 68 6d 4e 6f 64 65  osFcntl(pShmNode
275e0 2d 3e 68 2c 20 6c 6b 54 79 70 65 2c 20 26 66 29  ->h, lkType, &f)
275f0 3b 0a 20 20 20 20 72 63 20 3d 20 28 72 63 21 3d  ;.    rc = (rc!=
27600 28 2d 31 29 29 20 3f 20 53 51 4c 49 54 45 5f 4f  (-1)) ? SQLITE_O
27610 4b 20 3a 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  K : SQLITE_BUSY;
27620 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c  .    pFile->ctrl
27630 46 6c 61 67 73 20 26 3d 20 7e 55 4e 49 58 46 49  Flags &= ~UNIXFI
27640 4c 45 5f 42 4c 4f 43 4b 3b 0a 20 20 7d 0a 0a 20  LE_BLOCK;.  }.. 
27650 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 67   /* Update the g
27660 6c 6f 62 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65  lobal lock state
27670 20 61 6e 64 20 64 6f 20 64 65 62 75 67 20 74 72   and do debug tr
27680 61 63 69 6e 67 20 2a 2f 0a 23 69 66 64 65 66 20  acing */.#ifdef 
27690 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 7b  SQLITE_DEBUG.  {
276a0 20 75 31 36 20 6d 61 73 6b 3b 0a 20 20 4f 53 54   u16 mask;.  OST
276b0 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b 20  RACE(("SHM-LOCK 
276c0 22 29 29 3b 0a 20 20 6d 61 73 6b 20 3d 20 6f 66  "));.  mask = of
276d0 73 74 3e 33 31 20 3f 20 30 78 66 66 66 66 20 3a  st>31 ? 0xffff :
276e0 20 28 31 3c 3c 28 6f 66 73 74 2b 6e 29 29 20 2d   (1<<(ofst+n)) -
276f0 20 28 31 3c 3c 6f 66 73 74 29 3b 0a 20 20 69 66   (1<<ofst);.  if
27700 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
27710 29 7b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 54  ){.    if( lockT
27720 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a  ype==F_UNLCK ){.
27730 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
27740 75 6e 6c 6f 63 6b 20 25 64 20 6f 6b 22 2c 20 6f  unlock %d ok", o
27750 66 73 74 29 29 3b 0a 20 20 20 20 20 20 70 53 68  fst));.      pSh
27760 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61 73 6b 20  mNode->exclMask 
27770 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 20 20  &= ~mask;.      
27780 70 53 68 6d 4e 6f 64 65 2d 3e 73 68 61 72 65 64  pShmNode->shared
27790 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20  Mask &= ~mask;. 
277a0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63     }else if( loc
277b0 6b 54 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29  kType==F_RDLCK )
277c0 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  {.      OSTRACE(
277d0 28 22 72 65 61 64 2d 6c 6f 63 6b 20 25 64 20 6f  ("read-lock %d o
277e0 6b 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20 20  k", ofst));.    
277f0 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c    pShmNode->excl
27800 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20  Mask &= ~mask;. 
27810 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73       pShmNode->s
27820 68 61 72 65 64 4d 61 73 6b 20 7c 3d 20 6d 61 73  haredMask |= mas
27830 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  k;.    }else{.  
27840 20 20 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b      assert( lock
27850 54 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 3b  Type==F_WRLCK );
27860 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
27870 22 77 72 69 74 65 2d 6c 6f 63 6b 20 25 64 20 6f  "write-lock %d o
27880 6b 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20 20  k", ofst));.    
27890 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c    pShmNode->excl
278a0 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20  Mask |= mask;.  
278b0 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 68      pShmNode->sh
278c0 61 72 65 64 4d 61 73 6b 20 26 3d 20 7e 6d 61 73  aredMask &= ~mas
278d0 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  k;.    }.  }else
278e0 7b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 54 79  {.    if( lockTy
278f0 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20  pe==F_UNLCK ){. 
27900 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 75       OSTRACE(("u
27910 6e 6c 6f 63 6b 20 25 64 20 66 61 69 6c 65 64 22  nlock %d failed"
27920 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20 20 7d 65  , ofst));.    }e
27930 6c 73 65 20 69 66 28 20 6c 6f 63 6b 54 79 70 65  lse if( lockType
27940 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20 20  ==F_RDLCK ){.   
27950 20 20 20 4f 53 54 52 41 43 45 28 28 22 72 65 61     OSTRACE(("rea
27960 64 2d 6c 6f 63 6b 20 66 61 69 6c 65 64 22 29 29  d-lock failed"))
27970 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
27980 20 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 54     assert( lockT
27990 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 3b 0a  ype==F_WRLCK );.
279a0 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
279b0 77 72 69 74 65 2d 6c 6f 63 6b 20 25 64 20 66 61  write-lock %d fa
279c0 69 6c 65 64 22 2c 20 6f 66 73 74 29 29 3b 0a 20  iled", ofst));. 
279d0 20 20 20 7d 0a 20 20 7d 0a 20 20 4f 53 54 52 41     }.  }.  OSTRA
279e0 43 45 28 28 22 20 2d 20 61 66 74 65 72 77 61 72  CE((" - afterwar
279f0 64 73 20 25 30 33 78 2c 25 30 33 78 5c 6e 22 2c  ds %03x,%03x\n",
27a00 0a 20 20 20 20 20 20 20 20 20 20 20 70 53 68 6d  .           pShm
27a10 4e 6f 64 65 2d 3e 73 68 61 72 65 64 4d 61 73 6b  Node->sharedMask
27a20 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c  , pShmNode->excl
27a30 4d 61 73 6b 29 29 3b 0a 20 20 7d 0a 23 65 6e 64  Mask));.  }.#end
27a40 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  if..  return rc;
27a50 20 20 20 20 20 20 20 20 0a 7d 0a 0a 2f 2a 0a 2a          .}../*.*
27a60 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6d 69 6e  * Return the min
27a70 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 33  imum number of 3
27a80 32 4b 42 20 73 68 6d 20 72 65 67 69 6f 6e 73 20  2KB shm regions 
27a90 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 6d  that should be m
27aa0 61 70 70 65 64 20 61 74 0a 2a 2a 20 61 20 74 69  apped at.** a ti
27ab0 6d 65 2c 20 61 73 73 75 6d 69 6e 67 20 74 68 61  me, assuming tha
27ac0 74 20 65 61 63 68 20 6d 61 70 70 69 6e 67 20 6d  t each mapping m
27ad0 75 73 74 20 62 65 20 61 6e 20 69 6e 74 65 67 65  ust be an intege
27ae0 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 74 68  r multiple of th
27af0 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 73 79 73  e.** current sys
27b00 74 65 6d 20 70 61 67 65 2d 73 69 7a 65 2e 0a 2a  tem page-size..*
27b10 2a 0a 2a 2a 20 55 73 75 61 6c 6c 79 2c 20 74 68  *.** Usually, th
27b20 69 73 20 69 73 20 31 2e 20 54 68 65 20 65 78 63  is is 1. The exc
27b30 65 70 74 69 6f 6e 20 73 65 65 6d 73 20 74 6f 20  eption seems to 
27b40 62 65 20 73 79 73 74 65 6d 73 20 74 68 61 74 20  be systems that 
27b50 61 72 65 20 63 6f 6e 66 69 67 75 72 65 64 0a 2a  are configured.*
27b60 2a 20 74 6f 20 75 73 65 20 36 34 4b 42 20 70 61  * to use 64KB pa
27b70 67 65 73 20 2d 20 69 6e 20 74 68 69 73 20 63 61  ges - in this ca
27b80 73 65 20 65 61 63 68 20 6d 61 70 70 69 6e 67 20  se each mapping 
27b90 6d 75 73 74 20 63 6f 76 65 72 20 61 74 20 6c 65  must cover at le
27ba0 61 73 74 20 74 77 6f 0a 2a 2a 20 73 68 6d 20 72  ast two.** shm r
27bb0 65 67 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69  egions..*/.stati
27bc0 63 20 69 6e 74 20 75 6e 69 78 53 68 6d 52 65 67  c int unixShmReg
27bd0 69 6f 6e 50 65 72 4d 61 70 28 76 6f 69 64 29 7b  ionPerMap(void){
27be0 0a 20 20 69 6e 74 20 73 68 6d 73 7a 20 3d 20 33  .  int shmsz = 3
27bf0 32 2a 31 30 32 34 3b 20 20 20 20 20 20 20 20 20  2*1024;         
27c00 20 20 20 2f 2a 20 53 48 4d 20 72 65 67 69 6f 6e     /* SHM region
27c10 20 73 69 7a 65 20 2a 2f 0a 20 20 69 6e 74 20 70   size */.  int p
27c20 67 73 7a 20 3d 20 6f 73 47 65 74 70 61 67 65 73  gsz = osGetpages
27c30 69 7a 65 28 29 3b 20 20 20 2f 2a 20 53 79 73 74  ize();   /* Syst
27c40 65 6d 20 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a  em page size */.
27c50 20 20 61 73 73 65 72 74 28 20 28 28 70 67 73 7a    assert( ((pgsz
27c60 2d 31 29 26 70 67 73 7a 29 3d 3d 30 20 29 3b 20  -1)&pgsz)==0 ); 
27c70 20 20 2f 2a 20 50 61 67 65 20 73 69 7a 65 20 6d    /* Page size m
27c80 75 73 74 20 62 65 20 61 20 70 6f 77 65 72 20 6f  ust be a power o
27c90 66 20 32 20 2a 2f 0a 20 20 69 66 28 20 70 67 73  f 2 */.  if( pgs
27ca0 7a 3c 73 68 6d 73 7a 20 29 20 72 65 74 75 72 6e  z<shmsz ) return
27cb0 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 70 67 73   1;.  return pgs
27cc0 7a 2f 73 68 6d 73 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a  z/shmsz;.}../*.*
27cd0 2a 20 50 75 72 67 65 20 74 68 65 20 75 6e 69 78  * Purge the unix
27ce0 53 68 6d 4e 6f 64 65 4c 69 73 74 20 6c 69 73 74  ShmNodeList list
27cf0 20 6f 66 20 61 6c 6c 20 65 6e 74 72 69 65 73 20   of all entries 
27d00 77 69 74 68 20 75 6e 69 78 53 68 6d 4e 6f 64 65  with unixShmNode
27d10 2e 6e 52 65 66 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20  .nRef==0..**.** 
27d20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20 56 46  This is not a VF
27d30 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  S shared-memory 
27d40 6d 65 74 68 6f 64 3b 20 69 74 20 69 73 20 61 20  method; it is a 
27d50 75 74 69 6c 69 74 79 20 66 75 6e 63 74 69 6f 6e  utility function
27d60 20 63 61 6c 6c 65 64 0a 2a 2a 20 62 79 20 56 46   called.** by VF
27d70 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  S shared-memory 
27d80 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a 73 74 61 74  methods..*/.stat
27d90 69 63 20 76 6f 69 64 20 75 6e 69 78 53 68 6d 50  ic void unixShmP
27da0 75 72 67 65 28 75 6e 69 78 46 69 6c 65 20 2a 70  urge(unixFile *p
27db0 46 64 29 7b 0a 20 20 75 6e 69 78 53 68 6d 4e 6f  Fd){.  unixShmNo
27dc0 64 65 20 2a 70 20 3d 20 70 46 64 2d 3e 70 49 6e  de *p = pFd->pIn
27dd0 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20  ode->pShmNode;. 
27de0 20 61 73 73 65 72 74 28 20 75 6e 69 78 4d 75 74   assert( unixMut
27df0 65 78 48 65 6c 64 28 29 20 29 3b 0a 20 20 69 66  exHeld() );.  if
27e00 28 20 70 20 26 26 20 70 2d 3e 6e 52 65 66 3d 3d  ( p && p->nRef==
27e10 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 53 68  0 ){.    int nSh
27e20 6d 50 65 72 4d 61 70 20 3d 20 75 6e 69 78 53 68  mPerMap = unixSh
27e30 6d 52 65 67 69 6f 6e 50 65 72 4d 61 70 28 29 3b  mRegionPerMap();
27e40 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
27e50 61 73 73 65 72 74 28 20 70 2d 3e 70 49 6e 6f 64  assert( p->pInod
27e60 65 3d 3d 70 46 64 2d 3e 70 49 6e 6f 64 65 20 29  e==pFd->pInode )
27e70 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75  ;.    sqlite3_mu
27e80 74 65 78 5f 66 72 65 65 28 70 2d 3e 6d 75 74 65  tex_free(p->mute
27e90 78 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  x);.    for(i=0;
27ea0 20 69 3c 70 2d 3e 6e 52 65 67 69 6f 6e 3b 20 69   i<p->nRegion; i
27eb0 2b 3d 6e 53 68 6d 50 65 72 4d 61 70 29 7b 0a 20  +=nShmPerMap){. 
27ec0 20 20 20 20 20 69 66 28 20 70 2d 3e 68 3e 3d 30       if( p->h>=0
27ed0 20 29 7b 0a 20 20 20 20 20 20 20 20 6f 73 4d 75   ){.        osMu
27ee0 6e 6d 61 70 28 70 2d 3e 61 70 52 65 67 69 6f 6e  nmap(p->apRegion
27ef0 5b 69 5d 2c 20 70 2d 3e 73 7a 52 65 67 69 6f 6e  [i], p->szRegion
27f00 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
27f10 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
27f20 66 72 65 65 28 70 2d 3e 61 70 52 65 67 69 6f 6e  free(p->apRegion
27f30 5b 69 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  [i]);.      }.  
27f40 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
27f50 66 72 65 65 28 70 2d 3e 61 70 52 65 67 69 6f 6e  free(p->apRegion
27f60 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 68 3e  );.    if( p->h>
27f70 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 6f 62 75  =0 ){.      robu
27f80 73 74 5f 63 6c 6f 73 65 28 70 46 64 2c 20 70 2d  st_close(pFd, p-
27f90 3e 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20  >h, __LINE__);. 
27fa0 20 20 20 20 20 70 2d 3e 68 20 3d 20 2d 31 3b 0a       p->h = -1;.
27fb0 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 70 49 6e      }.    p->pIn
27fc0 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d 20  ode->pShmNode = 
27fd0 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  0;.    sqlite3_f
27fe0 72 65 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 23  ree(p);.  }.}..#
27ff0 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
28000 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f  LE__) && SQLITE_
28010 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
28020 54 59 4c 45 0a 73 74 61 74 69 63 20 63 6f 6e 73  TYLE.static cons
28030 74 20 63 68 61 72 20 2a 70 72 6f 78 79 53 68 61  t char *proxySha
28040 72 65 64 4d 65 6d 6f 72 79 42 61 73 65 50 61 74  redMemoryBasePat
28050 68 28 75 6e 69 78 46 69 6c 65 20 2a 29 3b 0a 23  h(unixFile *);.#
28060 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65  endif../*.** Ope
28070 6e 20 61 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  n a shared-memor
28080 79 20 61 72 65 61 20 61 73 73 6f 63 69 61 74 65  y area associate
28090 64 20 77 69 74 68 20 6f 70 65 6e 20 64 61 74 61  d with open data
280a0 62 61 73 65 20 66 69 6c 65 20 70 44 62 46 64 2e  base file pDbFd.
280b0 20 20 0a 2a 2a 20 54 68 69 73 20 70 61 72 74 69    .** This parti
280c0 63 75 6c 61 72 20 69 6d 70 6c 65 6d 65 6e 74 61  cular implementa
280d0 74 69 6f 6e 20 75 73 65 73 20 6d 6d 61 70 70 65  tion uses mmappe
280e0 64 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54  d files..**.** T
280f0 68 65 20 66 69 6c 65 20 75 73 65 64 20 74 6f 20  he file used to 
28100 69 6d 70 6c 65 6d 65 6e 74 20 73 68 61 72 65 64  implement shared
28110 2d 6d 65 6d 6f 72 79 20 69 73 20 69 6e 20 74 68  -memory is in th
28120 65 20 73 61 6d 65 20 64 69 72 65 63 74 6f 72 79  e same directory
28130 0a 2a 2a 20 61 73 20 74 68 65 20 6f 70 65 6e 20  .** as the open 
28140 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e  database file an
28150 64 20 68 61 73 20 74 68 65 20 73 61 6d 65 20 6e  d has the same n
28160 61 6d 65 20 61 73 20 74 68 65 20 6f 70 65 6e 20  ame as the open 
28170 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65  database.** file
28180 20 77 69 74 68 20 74 68 65 20 22 2d 73 68 6d 22   with the "-shm"
28190 20 73 75 66 66 69 78 20 61 64 64 65 64 2e 20 20   suffix added.  
281a0 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20  For example, if 
281b0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
281c0 65 0a 2a 2a 20 69 73 20 22 2f 68 6f 6d 65 2f 75  e.** is "/home/u
281d0 73 65 72 31 2f 63 6f 6e 66 69 67 2e 64 62 22 20  ser1/config.db" 
281e0 74 68 65 6e 20 74 68 65 20 66 69 6c 65 20 74 68  then the file th
281f0 61 74 20 69 73 20 63 72 65 61 74 65 64 20 61 6e  at is created an
28200 64 20 6d 6d 61 70 70 65 64 0a 2a 2a 20 66 6f 72  d mmapped.** for
28210 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 77   shared memory w
28220 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 22 2f  ill be called "/
28230 68 6f 6d 65 2f 75 73 65 72 31 2f 63 6f 6e 66 69  home/user1/confi
28240 67 2e 64 62 2d 73 68 6d 22 2e 20 20 0a 2a 2a 0a  g.db-shm".  .**.
28250 2a 2a 20 41 6e 6f 74 68 65 72 20 61 70 70 72 6f  ** Another appro
28260 61 63 68 20 74 6f 20 69 73 20 74 6f 20 75 73 65  ach to is to use
28270 20 66 69 6c 65 73 20 69 6e 20 2f 64 65 76 2f 73   files in /dev/s
28280 68 6d 20 6f 72 20 2f 64 65 76 2f 74 6d 70 20 6f  hm or /dev/tmp o
28290 72 20 61 6e 0a 2a 2a 20 73 6f 6d 65 20 6f 74 68  r an.** some oth
282a0 65 72 20 74 6d 70 66 73 20 6d 6f 75 6e 74 2e 20  er tmpfs mount. 
282b0 42 75 74 20 69 66 20 61 20 66 69 6c 65 20 69 6e  But if a file in
282c0 20 61 20 64 69 66 66 65 72 65 6e 74 20 64 69 72   a different dir
282d0 65 63 74 6f 72 79 0a 2a 2a 20 66 72 6f 6d 20 74  ectory.** from t
282e0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
282f0 20 69 73 20 75 73 65 64 2c 20 74 68 65 6e 20 64   is used, then d
28300 69 66 66 65 72 69 6e 67 20 61 63 63 65 73 73 20  iffering access 
28310 70 65 72 6d 69 73 73 69 6f 6e 73 0a 2a 2a 20 6f  permissions.** o
28320 72 20 61 20 63 68 72 6f 6f 74 28 29 20 6d 69 67  r a chroot() mig
28330 68 74 20 63 61 75 73 65 20 74 77 6f 20 64 69 66  ht cause two dif
28340 66 65 72 65 6e 74 20 70 72 6f 63 65 73 73 65 73  ferent processes
28350 20 6f 6e 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20   on the same.** 
28360 64 61 74 61 62 61 73 65 20 74 6f 20 65 6e 64 20  database to end 
28370 75 70 20 75 73 69 6e 67 20 64 69 66 66 65 72 65  up using differe
28380 6e 74 20 66 69 6c 65 73 20 66 6f 72 20 73 68 61  nt files for sha
28390 72 65 64 20 6d 65 6d 6f 72 79 20 2d 20 0a 2a 2a  red memory - .**
283a0 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 74 68   meaning that th
283b0 65 69 72 20 6d 65 6d 6f 72 79 20 77 6f 75 6c 64  eir memory would
283c0 20 6e 6f 74 20 72 65 61 6c 6c 79 20 62 65 20 73   not really be s
283d0 68 61 72 65 64 20 2d 20 72 65 73 75 6c 74 69 6e  hared - resultin
283e0 67 0a 2a 2a 20 69 6e 20 64 61 74 61 62 61 73 65  g.** in database
283f0 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20 4e 65   corruption.  Ne
28400 76 65 72 74 68 65 6c 65 73 73 2c 20 74 68 69 73  vertheless, this
28410 20 74 6d 70 66 73 20 66 69 6c 65 20 75 73 61 67   tmpfs file usag
28420 65 0a 2a 2a 20 63 61 6e 20 62 65 20 65 6e 61 62  e.** can be enab
28430 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74  led at compile-t
28440 69 6d 65 20 75 73 69 6e 67 20 2d 44 53 51 4c 49  ime using -DSQLI
28450 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59  TE_SHM_DIRECTORY
28460 3d 22 2f 64 65 76 2f 73 68 6d 22 0a 2a 2a 20 6f  ="/dev/shm".** o
28470 72 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74  r the equivalent
28480 2e 20 20 54 68 65 20 75 73 65 20 6f 66 20 74 68  .  The use of th
28490 65 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52  e SQLITE_SHM_DIR
284a0 45 43 54 4f 52 59 20 63 6f 6d 70 69 6c 65 2d 74  ECTORY compile-t
284b0 69 6d 65 0a 2a 2a 20 6f 70 74 69 6f 6e 20 72 65  ime.** option re
284c0 73 75 6c 74 73 20 69 6e 20 61 6e 20 69 6e 63 6f  sults in an inco
284d0 6d 70 61 74 69 62 6c 65 20 62 75 69 6c 64 20 6f  mpatible build o
284e0 66 20 53 51 4c 69 74 65 3b 20 20 62 75 69 6c 64  f SQLite;  build
284f0 73 20 6f 66 20 53 51 4c 69 74 65 0a 2a 2a 20 74  s of SQLite.** t
28500 68 61 74 20 77 69 74 68 20 64 69 66 66 65 72 69  hat with differi
28510 6e 67 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49  ng SQLITE_SHM_DI
28520 52 45 43 54 4f 52 59 20 73 65 74 74 69 6e 67 73  RECTORY settings
28530 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20   attempt to use 
28540 74 68 65 0a 2a 2a 20 73 61 6d 65 20 64 61 74 61  the.** same data
28550 62 61 73 65 20 66 69 6c 65 20 61 74 20 74 68 65  base file at the
28560 20 73 61 6d 65 20 74 69 6d 65 2c 20 64 61 74 61   same time, data
28570 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20  base corruption 
28580 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72  will likely.** r
28590 65 73 75 6c 74 2e 20 54 68 65 20 53 51 4c 49 54  esult. The SQLIT
285a0 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 20  E_SHM_DIRECTORY 
285b0 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74  compile-time opt
285c0 69 6f 6e 20 69 73 20 63 6f 6e 73 69 64 65 72 65  ion is considere
285d0 64 0a 2a 2a 20 22 75 6e 73 75 70 70 6f 72 74 65  d.** "unsupporte
285e0 64 22 20 61 6e 64 20 6d 61 79 20 67 6f 20 61 77  d" and may go aw
285f0 61 79 20 69 6e 20 61 20 66 75 74 75 72 65 20 53  ay in a future S
28600 51 4c 69 74 65 20 72 65 6c 65 61 73 65 2e 0a 2a  QLite release..*
28610 2a 0a 2a 2a 20 57 68 65 6e 20 6f 70 65 6e 69 6e  *.** When openin
28620 67 20 61 20 6e 65 77 20 73 68 61 72 65 64 2d 6d  g a new shared-m
28630 65 6d 6f 72 79 20 66 69 6c 65 2c 20 69 66 20 6e  emory file, if n
28640 6f 20 6f 74 68 65 72 20 69 6e 73 74 61 6e 63 65  o other instance
28650 73 20 6f 66 20 74 68 61 74 0a 2a 2a 20 66 69 6c  s of that.** fil
28660 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20  e are currently 
28670 6f 70 65 6e 2c 20 69 6e 20 74 68 69 73 20 70 72  open, in this pr
28680 6f 63 65 73 73 20 6f 72 20 69 6e 20 6f 74 68 65  ocess or in othe
28690 72 20 70 72 6f 63 65 73 73 65 73 2c 20 74 68 65  r processes, the
286a0 6e 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20 6d 75  n.** the file mu
286b0 73 74 20 62 65 20 74 72 75 6e 63 61 74 65 64 20  st be truncated 
286c0 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68 20 6f  to zero length o
286d0 72 20 68 61 76 65 20 69 74 73 20 68 65 61 64 65  r have its heade
286e0 72 20 63 6c 65 61 72 65 64 2e 0a 2a 2a 0a 2a 2a  r cleared..**.**
286f0 20 49 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   If the original
28700 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28   database file (
28710 70 44 62 46 64 29 20 69 73 20 75 73 69 6e 67 20  pDbFd) is using 
28720 74 68 65 20 22 75 6e 69 78 2d 65 78 63 6c 22 20  the "unix-excl" 
28730 56 46 53 0a 2a 2a 20 74 68 61 74 20 6d 65 61 6e  VFS.** that mean
28740 73 20 74 68 61 74 20 61 6e 20 65 78 63 6c 75 73  s that an exclus
28750 69 76 65 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  ive lock is held
28760 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
28770 20 66 69 6c 65 20 61 6e 64 0a 2a 2a 20 74 68 61   file and.** tha
28780 74 20 6e 6f 20 6f 74 68 65 72 20 70 72 6f 63 65  t no other proce
28790 73 73 65 73 20 61 72 65 20 61 62 6c 65 20 74 6f  sses are able to
287a0 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 74   read or write t
287b0 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 6e  he database.  In
287c0 0a 2a 2a 20 74 68 61 74 20 63 61 73 65 2c 20 77  .** that case, w
287d0 65 20 64 6f 20 6e 6f 74 20 72 65 61 6c 6c 79 20  e do not really 
287e0 6e 65 65 64 20 73 68 61 72 65 64 20 6d 65 6d 6f  need shared memo
287f0 72 79 2e 20 20 4e 6f 20 73 68 61 72 65 64 20 6d  ry.  No shared m
28800 65 6d 6f 72 79 0a 2a 2a 20 66 69 6c 65 20 69 73  emory.** file is
28810 20 63 72 65 61 74 65 64 2e 20 20 54 68 65 20 73   created.  The s
28820 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 77 69 6c  hared memory wil
28830 6c 20 62 65 20 73 69 6d 75 6c 61 74 65 64 20 77  l be simulated w
28840 69 74 68 20 68 65 61 70 20 6d 65 6d 6f 72 79 2e  ith heap memory.
28850 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
28860 6e 69 78 4f 70 65 6e 53 68 61 72 65 64 4d 65 6d  nixOpenSharedMem
28870 6f 72 79 28 75 6e 69 78 46 69 6c 65 20 2a 70 44  ory(unixFile *pD
28880 62 46 64 29 7b 0a 20 20 73 74 72 75 63 74 20 75  bFd){.  struct u
28890 6e 69 78 53 68 6d 20 2a 70 20 3d 20 30 3b 20 20  nixShm *p = 0;  
288a0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
288b0 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65 20  onnection to be 
288c0 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 73 74 72 75  opened */.  stru
288d0 63 74 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a  ct unixShmNode *
288e0 70 53 68 6d 4e 6f 64 65 3b 20 20 20 2f 2a 20 54  pShmNode;   /* T
288f0 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 6d 6d  he underlying mm
28900 61 70 70 65 64 20 66 69 6c 65 20 2a 2f 0a 20 20  apped file */.  
28910 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
28920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28930 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a  /* Result code *
28940 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  /.  unixInodeInf
28950 6f 20 2a 70 49 6e 6f 64 65 3b 20 20 20 20 20 20  o *pInode;      
28960 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 6f 64 65      /* The inode
28970 20 6f 66 20 66 64 20 2a 2f 0a 20 20 63 68 61 72   of fd */.  char
28980 20 2a 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 3b 20   *zShmFilename; 
28990 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
289a0 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ame of the file 
289b0 75 73 65 64 20 66 6f 72 20 53 48 4d 20 2a 2f 0a  used for SHM */.
289c0 20 20 69 6e 74 20 6e 53 68 6d 46 69 6c 65 6e 61    int nShmFilena
289d0 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  me;             
289e0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
289f0 20 53 48 4d 20 66 69 6c 65 6e 61 6d 65 20 69 6e   SHM filename in
28a00 20 62 79 74 65 73 20 2a 2f 0a 0a 20 20 2f 2a 20   bytes */..  /* 
28a10 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  Allocate space f
28a20 6f 72 20 74 68 65 20 6e 65 77 20 75 6e 69 78 53  or the new unixS
28a30 68 6d 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20 20  hm object. */.  
28a40 70 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  p = sqlite3_mall
28a50 6f 63 36 34 28 20 73 69 7a 65 6f 66 28 2a 70 29  oc64( sizeof(*p)
28a60 20 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29   );.  if( p==0 )
28a70 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
28a80 4f 4d 45 4d 3b 0a 20 20 6d 65 6d 73 65 74 28 70  OMEM;.  memset(p
28a90 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29  , 0, sizeof(*p))
28aa0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 44 62 46  ;.  assert( pDbF
28ab0 64 2d 3e 70 53 68 6d 3d 3d 30 20 29 3b 0a 0a 20  d->pShm==0 );.. 
28ac0 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   /* Check to see
28ad0 20 69 66 20 61 20 75 6e 69 78 53 68 6d 4e 6f 64   if a unixShmNod
28ae0 65 20 6f 62 6a 65 63 74 20 61 6c 72 65 61 64 79  e object already
28af0 20 65 78 69 73 74 73 2e 20 52 65 75 73 65 20 61   exists. Reuse a
28b00 6e 20 65 78 69 73 74 69 6e 67 0a 20 20 2a 2a 20  n existing.  ** 
28b10 6f 6e 65 20 69 66 20 70 72 65 73 65 6e 74 2e 20  one if present. 
28b20 43 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65  Create a new one
28b30 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 20   if necessary.. 
28b40 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d   */.  unixEnterM
28b50 75 74 65 78 28 29 3b 0a 20 20 70 49 6e 6f 64 65  utex();.  pInode
28b60 20 3d 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65   = pDbFd->pInode
28b70 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70  ;.  pShmNode = p
28b80 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 3b  Inode->pShmNode;
28b90 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 3d  .  if( pShmNode=
28ba0 3d 30 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  =0 ){.    struct
28bb0 20 73 74 61 74 20 73 53 74 61 74 3b 20 20 20 20   stat sStat;    
28bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28bd0 66 73 74 61 74 28 29 20 69 6e 66 6f 20 66 6f 72  fstat() info for
28be0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
28bf0 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
28c00 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 0a 20  _SHM_DIRECTORY. 
28c10 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
28c20 42 61 73 65 50 61 74 68 20 3d 20 70 44 62 46 64  BasePath = pDbFd
28c30 2d 3e 7a 50 61 74 68 3b 0a 23 65 6e 64 69 66 0a  ->zPath;.#endif.
28c40 0a 20 20 20 20 2f 2a 20 43 61 6c 6c 20 66 73 74  .    /* Call fst
28c50 61 74 28 29 20 74 6f 20 66 69 67 75 72 65 20 6f  at() to figure o
28c60 75 74 20 74 68 65 20 70 65 72 6d 69 73 73 69 6f  ut the permissio
28c70 6e 73 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ns on the databa
28c80 73 65 20 66 69 6c 65 2e 20 49 66 0a 20 20 20 20  se file. If.    
28c90 2a 2a 20 61 20 6e 65 77 20 2a 2d 73 68 6d 20 66  ** a new *-shm f
28ca0 69 6c 65 20 69 73 20 63 72 65 61 74 65 64 2c 20  ile is created, 
28cb0 61 6e 20 61 74 74 65 6d 70 74 20 77 69 6c 6c 20  an attempt will 
28cc0 62 65 20 6d 61 64 65 20 74 6f 20 63 72 65 61 74  be made to creat
28cd0 65 20 69 74 0a 20 20 20 20 2a 2a 20 77 69 74 68  e it.    ** with
28ce0 20 74 68 65 20 73 61 6d 65 20 70 65 72 6d 69 73   the same permis
28cf0 73 69 6f 6e 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  sions..    */.  
28d00 20 20 69 66 28 20 6f 73 46 73 74 61 74 28 70 44    if( osFstat(pD
28d10 62 46 64 2d 3e 68 2c 20 26 73 53 74 61 74 29 20  bFd->h, &sStat) 
28d20 26 26 20 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63  && pInode->bProc
28d30 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20  essLock==0 ){.  
28d40 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72      storeLastErr
28d50 6e 6f 28 70 44 62 46 64 2c 20 65 72 72 6e 6f 29  no(pDbFd, errno)
28d60 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  ;.      rc = SQL
28d70 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b  ITE_IOERR_FSTAT;
28d80 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f  .      goto shm_
28d90 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a  open_err;.    }.
28da0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41  .#if defined(__A
28db0 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54  PPLE__) && SQLIT
28dc0 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
28dd0 5f 53 54 59 4c 45 20 5c 0a 20 20 20 20 20 20 26  _STYLE \.      &
28de0 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
28df0 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 29  E_SHM_DIRECTORY)
28e00 0a 20 20 20 20 2f 2a 20 49 66 20 70 44 62 46 64  .    /* If pDbFd
28e10 20 69 73 20 63 6f 6e 66 69 67 75 72 65 64 20 77   is configured w
28e20 69 74 68 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e  ith proxy lockin
28e30 67 20 6d 6f 64 65 2c 20 75 73 65 20 74 68 65 20  g mode, use the 
28e40 6c 6f 63 61 6c 20 0a 20 20 20 20 2a 2a 20 6c 6f  local .    ** lo
28e50 63 6b 20 66 69 6c 65 20 70 61 74 68 20 74 6f 20  ck file path to 
28e60 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 2d 73  determine the -s
28e70 68 6d 20 66 69 6c 65 20 70 61 74 68 0a 20 20 20  hm file path.   
28e80 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 73 50 72   */.    if( isPr
28e90 6f 78 79 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28 70  oxyLockingMode(p
28ea0 44 62 46 64 29 20 29 7b 0a 20 20 20 20 20 20 7a  DbFd) ){.      z
28eb0 42 61 73 65 50 61 74 68 20 3d 20 70 72 6f 78 79  BasePath = proxy
28ec0 53 68 61 72 65 64 4d 65 6d 6f 72 79 42 61 73 65  SharedMemoryBase
28ed0 50 61 74 68 28 70 44 62 46 64 29 3b 0a 20 20 20  Path(pDbFd);.   
28ee0 20 20 20 69 66 28 20 21 7a 42 61 73 65 50 61 74     if( !zBasePat
28ef0 68 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  h ){.        rc 
28f00 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  = SQLITE_CANTOPE
28f10 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  N_BKPT;.        
28f20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72  goto shm_open_er
28f30 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  r;.      }.    }
28f40 0a 23 65 6e 64 69 66 0a 20 20 20 20 0a 23 69 66  .#endif.    .#if
28f50 64 65 66 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44  def SQLITE_SHM_D
28f60 49 52 45 43 54 4f 52 59 0a 20 20 20 20 6e 53 68  IRECTORY.    nSh
28f70 6d 46 69 6c 65 6e 61 6d 65 20 3d 20 73 69 7a 65  mFilename = size
28f80 6f 66 28 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49  of(SQLITE_SHM_DI
28f90 52 45 43 54 4f 52 59 29 20 2b 20 33 31 3b 0a 23  RECTORY) + 31;.#
28fa0 65 6c 73 65 0a 20 20 20 20 6e 53 68 6d 46 69 6c  else.    nShmFil
28fb0 65 6e 61 6d 65 20 3d 20 36 20 2b 20 28 69 6e 74  ename = 6 + (int
28fc0 29 73 74 72 6c 65 6e 28 7a 42 61 73 65 50 61 74  )strlen(zBasePat
28fd0 68 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70  h);.#endif.    p
28fe0 53 68 6d 4e 6f 64 65 20 3d 20 73 71 6c 69 74 65  ShmNode = sqlite
28ff0 33 5f 6d 61 6c 6c 6f 63 36 34 28 20 73 69 7a 65  3_malloc64( size
29000 6f 66 28 2a 70 53 68 6d 4e 6f 64 65 29 20 2b 20  of(*pShmNode) + 
29010 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 20 29 3b 0a  nShmFilename );.
29020 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65      if( pShmNode
29030 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
29040 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
29050 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f        goto shm_o
29060 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 20  pen_err;.    }. 
29070 20 20 20 6d 65 6d 73 65 74 28 70 53 68 6d 4e 6f     memset(pShmNo
29080 64 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70  de, 0, sizeof(*p
29090 53 68 6d 4e 6f 64 65 29 2b 6e 53 68 6d 46 69 6c  ShmNode)+nShmFil
290a0 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7a 53 68 6d  ename);.    zShm
290b0 46 69 6c 65 6e 61 6d 65 20 3d 20 70 53 68 6d 4e  Filename = pShmN
290c0 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d  ode->zFilename =
290d0 20 28 63 68 61 72 2a 29 26 70 53 68 6d 4e 6f 64   (char*)&pShmNod
290e0 65 5b 31 5d 3b 0a 23 69 66 64 65 66 20 53 51 4c  e[1];.#ifdef SQL
290f0 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52  ITE_SHM_DIRECTOR
29100 59 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  Y.    sqlite3_sn
29110 70 72 69 6e 74 66 28 6e 53 68 6d 46 69 6c 65 6e  printf(nShmFilen
29120 61 6d 65 2c 20 7a 53 68 6d 46 69 6c 65 6e 61 6d  ame, zShmFilenam
29130 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  e, .            
29140 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
29150 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 20 22 2f  SHM_DIRECTORY "/
29160 73 71 6c 69 74 65 2d 73 68 6d 2d 25 78 2d 25 78  sqlite-shm-%x-%x
29170 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
29180 20 20 20 20 20 20 20 20 28 75 33 32 29 73 53 74          (u32)sSt
29190 61 74 2e 73 74 5f 69 6e 6f 2c 20 28 75 33 32 29  at.st_ino, (u32)
291a0 73 53 74 61 74 2e 73 74 5f 64 65 76 29 3b 0a 23  sStat.st_dev);.#
291b0 65 6c 73 65 0a 20 20 20 20 73 71 6c 69 74 65 33  else.    sqlite3
291c0 5f 73 6e 70 72 69 6e 74 66 28 6e 53 68 6d 46 69  _snprintf(nShmFi
291d0 6c 65 6e 61 6d 65 2c 20 7a 53 68 6d 46 69 6c 65  lename, zShmFile
291e0 6e 61 6d 65 2c 20 22 25 73 2d 73 68 6d 22 2c 20  name, "%s-shm", 
291f0 7a 42 61 73 65 50 61 74 68 29 3b 0a 20 20 20 20  zBasePath);.    
29200 73 71 6c 69 74 65 33 46 69 6c 65 53 75 66 66 69  sqlite3FileSuffi
29210 78 33 28 70 44 62 46 64 2d 3e 7a 50 61 74 68 2c  x3(pDbFd->zPath,
29220 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 29 3b 0a   zShmFilename);.
29230 23 65 6e 64 69 66 0a 20 20 20 20 70 53 68 6d 4e  #endif.    pShmN
29240 6f 64 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20 20  ode->h = -1;.   
29250 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e   pDbFd->pInode->
29260 70 53 68 6d 4e 6f 64 65 20 3d 20 70 53 68 6d 4e  pShmNode = pShmN
29270 6f 64 65 3b 0a 20 20 20 20 70 53 68 6d 4e 6f 64  ode;.    pShmNod
29280 65 2d 3e 70 49 6e 6f 64 65 20 3d 20 70 44 62 46  e->pInode = pDbF
29290 64 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 20 20 70  d->pInode;.    p
292a0 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 20 3d  ShmNode->mutex =
292b0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61   sqlite3_mutex_a
292c0 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
292d0 58 5f 46 41 53 54 29 3b 0a 20 20 20 20 69 66 28  X_FAST);.    if(
292e0 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78   pShmNode->mutex
292f0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
29300 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
29310 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f        goto shm_o
29320 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a  pen_err;.    }..
29330 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e      if( pInode->
29340 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20  bProcessLock==0 
29350 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6f 70 65  ){.      int ope
29360 6e 46 6c 61 67 73 20 3d 20 4f 5f 52 44 57 52 20  nFlags = O_RDWR 
29370 7c 20 4f 5f 43 52 45 41 54 3b 0a 20 20 20 20 20  | O_CREAT;.     
29380 20 69 66 28 20 73 71 6c 69 74 65 33 5f 75 72 69   if( sqlite3_uri
29390 5f 62 6f 6f 6c 65 61 6e 28 70 44 62 46 64 2d 3e  _boolean(pDbFd->
293a0 7a 50 61 74 68 2c 20 22 72 65 61 64 6f 6e 6c 79  zPath, "readonly
293b0 5f 73 68 6d 22 2c 20 30 29 0a 23 69 66 20 64 65  _shm", 0).#if de
293c0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
293d0 42 4c 45 5f 50 45 52 53 49 53 54 5f 57 41 4c 29  BLE_PERSIST_WAL)
293e0 26 26 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  &&(SQLITE_ENABLE
293f0 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 5c  _LOCKING_STYLE \
29400 0a 20 20 20 20 7c 7c 20 64 65 66 69 6e 65 64 28  .    || defined(
29410 5f 5f 41 50 50 4c 45 5f 5f 29 29 0a 20 20 20 20  __APPLE__)).    
29420 20 20 20 20 20 7c 7c 20 28 70 44 62 46 64 2d 3e       || (pDbFd->
29430 6f 70 65 6e 46 6c 61 67 73 20 26 20 4f 5f 52 44  openFlags & O_RD
29440 57 52 29 20 21 3d 20 4f 5f 52 44 57 52 0a 23 65  WR) != O_RDWR.#e
29450 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20 29 7b  ndif.         ){
29460 0a 20 20 20 20 20 20 20 20 6f 70 65 6e 46 6c 61  .        openFla
29470 67 73 20 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20  gs = O_RDONLY;. 
29480 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d         pShmNode-
29490 3e 69 73 52 65 61 64 6f 6e 6c 79 20 3d 20 31 3b  >isReadonly = 1;
294a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
294b0 53 68 6d 4e 6f 64 65 2d 3e 68 20 3d 20 72 6f 62  ShmNode->h = rob
294c0 75 73 74 5f 6f 70 65 6e 28 7a 53 68 6d 46 69 6c  ust_open(zShmFil
294d0 65 6e 61 6d 65 2c 20 6f 70 65 6e 46 6c 61 67 73  ename, openFlags
294e0 2c 20 28 73 53 74 61 74 2e 73 74 5f 6d 6f 64 65  , (sStat.st_mode
294f0 26 30 37 37 37 29 29 3b 0a 20 20 20 20 20 20 69  &0777));.      i
29500 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3c 30  f( pShmNode->h<0
29510 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
29520 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51   unixLogError(SQ
29530 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b  LITE_CANTOPEN_BK
29540 50 54 2c 20 22 6f 70 65 6e 22 2c 20 7a 53 68 6d  PT, "open", zShm
29550 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Filename);.     
29560 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e     goto shm_open
29570 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  _err;.      }.. 
29580 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f       /* Check to
29590 20 73 65 65 20 69 66 20 61 6e 6f 74 68 65 72 20   see if another 
295a0 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64 69  process is holdi
295b0 6e 67 20 74 68 65 20 64 65 61 64 2d 6d 61 6e 20  ng the dead-man 
295c0 73 77 69 74 63 68 2e 0a 20 20 20 20 20 20 2a 2a  switch..      **
295d0 20 49 66 20 6e 6f 74 2c 20 74 72 75 6e 63 61 74   If not, truncat
295e0 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20 7a 65  e the file to ze
295f0 72 6f 20 6c 65 6e 67 74 68 2e 20 0a 20 20 20 20  ro length. .    
29600 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20    */.      rc = 
29610 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
29620 20 69 66 28 20 75 6e 69 78 53 68 6d 53 79 73 74   if( unixShmSyst
29630 65 6d 4c 6f 63 6b 28 70 44 62 46 64 2c 20 46 5f  emLock(pDbFd, F_
29640 57 52 4c 43 4b 2c 20 55 4e 49 58 5f 53 48 4d 5f  WRLCK, UNIX_SHM_
29650 44 4d 53 2c 20 31 29 3d 3d 53 51 4c 49 54 45 5f  DMS, 1)==SQLITE_
29660 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  OK ){.        if
29670 28 20 72 6f 62 75 73 74 5f 66 74 72 75 6e 63 61  ( robust_ftrunca
29680 74 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20  te(pShmNode->h, 
29690 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  0) ){.          
296a0 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f  rc = unixLogErro
296b0 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  r(SQLITE_IOERR_S
296c0 48 4d 4f 50 45 4e 2c 20 22 66 74 72 75 6e 63 61  HMOPEN, "ftrunca
296d0 74 65 22 2c 20 7a 53 68 6d 46 69 6c 65 6e 61 6d  te", zShmFilenam
296e0 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  e);.        }els
296f0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e{.          /* 
29700 49 66 20 72 75 6e 6e 69 6e 67 20 61 73 20 72 6f  If running as ro
29710 6f 74 20 73 65 74 20 74 68 65 20 75 69 64 2f 67  ot set the uid/g
29720 69 64 20 6f 66 20 74 68 65 20 73 68 6d 20 66 69  id of the shm fi
29730 6c 65 20 74 6f 20 6d 61 74 63 68 0a 20 20 20 20  le to match.    
29740 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74        ** the dat
29750 61 62 61 73 65 20 2a 2f 0a 20 20 20 20 20 20 20  abase */.       
29760 20 20 20 75 69 64 5f 74 20 65 75 69 64 20 3d 20     uid_t euid = 
29770 67 65 74 65 75 69 64 28 29 3b 0a 20 20 20 20 20  geteuid();.     
29780 20 20 20 20 20 69 66 28 20 28 21 70 53 68 6d 4e       if( (!pShmN
29790 6f 64 65 2d 3e 69 73 52 65 61 64 6f 6e 6c 79 29  ode->isReadonly)
297a0 20 26 26 20 65 75 69 64 3d 3d 30 20 26 26 20 28   && euid==0 && (
297b0 65 75 69 64 21 3d 73 53 74 61 74 2e 73 74 5f 75  euid!=sStat.st_u
297c0 69 64 20 7c 7c 20 67 65 74 65 67 69 64 28 29 21  id || getegid()!
297d0 3d 73 53 74 61 74 2e 73 74 5f 67 69 64 29 20 29  =sStat.st_gid) )
297e0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  {.            if
297f0 28 20 6f 73 46 63 68 6f 77 6e 28 70 53 68 6d 4e  ( osFchown(pShmN
29800 6f 64 65 2d 3e 68 2c 20 73 53 74 61 74 2e 73 74  ode->h, sStat.st
29810 5f 75 69 64 2c 20 73 53 74 61 74 2e 73 74 5f 67  _uid, sStat.st_g
29820 69 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  id) ){.         
29830 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
29840 5f 49 4f 45 52 52 5f 53 48 4d 4f 50 45 4e 3b 0a  _IOERR_SHMOPEN;.
29850 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
29860 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
29870 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
29880 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
29890 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
298a0 63 20 3d 20 75 6e 69 78 53 68 6d 53 79 73 74 65  c = unixShmSyste
298b0 6d 4c 6f 63 6b 28 70 44 62 46 64 2c 20 46 5f 52  mLock(pDbFd, F_R
298c0 44 4c 43 4b 2c 20 55 4e 49 58 5f 53 48 4d 5f 44  DLCK, UNIX_SHM_D
298d0 4d 53 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a  MS, 1);.      }.
298e0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 67        if( rc ) g
298f0 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72  oto shm_open_err
29900 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
29910 2a 20 4d 61 6b 65 20 74 68 65 20 6e 65 77 20 63  * Make the new c
29920 6f 6e 6e 65 63 74 69 6f 6e 20 61 20 63 68 69 6c  onnection a chil
29930 64 20 6f 66 20 74 68 65 20 75 6e 69 78 53 68 6d  d of the unixShm
29940 4e 6f 64 65 20 2a 2f 0a 20 20 70 2d 3e 70 53 68  Node */.  p->pSh
29950 6d 4e 6f 64 65 20 3d 20 70 53 68 6d 4e 6f 64 65  mNode = pShmNode
29960 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
29970 44 45 42 55 47 0a 20 20 70 2d 3e 69 64 20 3d 20  DEBUG.  p->id = 
29980 70 53 68 6d 4e 6f 64 65 2d 3e 6e 65 78 74 53 68  pShmNode->nextSh
29990 6d 49 64 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20  mId++;.#endif.  
299a0 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 2b 2b  pShmNode->nRef++
299b0 3b 0a 20 20 70 44 62 46 64 2d 3e 70 53 68 6d 20  ;.  pDbFd->pShm 
299c0 3d 20 70 3b 0a 20 20 75 6e 69 78 4c 65 61 76 65  = p;.  unixLeave
299d0 4d 75 74 65 78 28 29 3b 0a 0a 20 20 2f 2a 20 54  Mutex();..  /* T
299e0 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  he reference cou
299f0 6e 74 20 6f 6e 20 70 53 68 6d 4e 6f 64 65 20 68  nt on pShmNode h
29a00 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
29a10 69 6e 63 72 65 6d 65 6e 74 65 64 20 75 6e 64 65  incremented unde
29a20 72 0a 20 20 2a 2a 20 74 68 65 20 63 6f 76 65 72  r.  ** the cover
29a30 20 6f 66 20 74 68 65 20 75 6e 69 78 45 6e 74 65   of the unixEnte
29a40 72 4d 75 74 65 78 28 29 20 6d 75 74 65 78 20 61  rMutex() mutex a
29a50 6e 64 20 74 68 65 20 70 6f 69 6e 74 65 72 20 66  nd the pointer f
29a60 72 6f 6d 20 74 68 65 0a 20 20 2a 2a 20 6e 65 77  rom the.  ** new
29a70 20 28 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d   (struct unixShm
29a80 29 20 6f 62 6a 65 63 74 20 74 6f 20 74 68 65 20  ) object to the 
29a90 70 53 68 6d 4e 6f 64 65 20 68 61 73 20 62 65 65  pShmNode has bee
29aa0 6e 20 73 65 74 2e 20 41 6c 6c 20 74 68 61 74 20  n set. All that 
29ab0 69 73 0a 20 20 2a 2a 20 6c 65 66 74 20 74 6f 20  is.  ** left to 
29ac0 64 6f 20 69 73 20 74 6f 20 6c 69 6e 6b 20 74 68  do is to link th
29ad0 65 20 6e 65 77 20 6f 62 6a 65 63 74 20 69 6e 74  e new object int
29ae0 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73  o the linked lis
29af0 74 20 73 74 61 72 74 69 6e 67 0a 20 20 2a 2a 20  t starting.  ** 
29b00 61 74 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69  at pShmNode->pFi
29b10 72 73 74 2e 20 54 68 69 73 20 6d 75 73 74 20 62  rst. This must b
29b20 65 20 64 6f 6e 65 20 77 68 69 6c 65 20 68 6f 6c  e done while hol
29b30 64 69 6e 67 20 74 68 65 20 70 53 68 6d 4e 6f 64  ding the pShmNod
29b40 65 2d 3e 6d 75 74 65 78 20 0a 20 20 2a 2a 20 6d  e->mutex .  ** m
29b50 75 74 65 78 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  utex..  */.  sql
29b60 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
29b70 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78  (pShmNode->mutex
29b80 29 3b 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20  );.  p->pNext = 
29b90 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74  pShmNode->pFirst
29ba0 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46  ;.  pShmNode->pF
29bb0 69 72 73 74 20 3d 20 70 3b 0a 20 20 73 71 6c 69  irst = p;.  sqli
29bc0 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
29bd0 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29  pShmNode->mutex)
29be0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
29bf0 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70  E_OK;..  /* Jump
29c00 20 68 65 72 65 20 6f 6e 20 61 6e 79 20 65 72 72   here on any err
29c10 6f 72 20 2a 2f 0a 73 68 6d 5f 6f 70 65 6e 5f 65  or */.shm_open_e
29c20 72 72 3a 0a 20 20 75 6e 69 78 53 68 6d 50 75 72  rr:.  unixShmPur
29c30 67 65 28 70 44 62 46 64 29 3b 20 20 20 20 20 20  ge(pDbFd);      
29c40 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c 20 66 72   /* This call fr
29c50 65 65 73 20 70 53 68 6d 4e 6f 64 65 20 69 66 20  ees pShmNode if 
29c60 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 73 71  required */.  sq
29c70 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
29c80 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
29c90 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
29ca0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
29cb0 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
29cc0 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 70 6f 69   to obtain a poi
29cd0 6e 74 65 72 20 74 6f 20 72 65 67 69 6f 6e 20 69  nter to region i
29ce0 52 65 67 69 6f 6e 20 6f 66 20 74 68 65 20 0a 2a  Region of the .*
29cf0 2a 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  * shared-memory 
29d00 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
29d10 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
29d20 65 20 66 64 2e 20 53 68 61 72 65 64 2d 6d 65 6d  e fd. Shared-mem
29d30 6f 72 79 20 72 65 67 69 6f 6e 73 20 0a 2a 2a 20  ory regions .** 
29d40 61 72 65 20 6e 75 6d 62 65 72 65 64 20 73 74 61  are numbered sta
29d50 72 74 69 6e 67 20 66 72 6f 6d 20 7a 65 72 6f 2e  rting from zero.
29d60 20 45 61 63 68 20 73 68 61 72 65 64 2d 6d 65 6d   Each shared-mem
29d70 6f 72 79 20 72 65 67 69 6f 6e 20 69 73 20 73 7a  ory region is sz
29d80 52 65 67 69 6f 6e 20 0a 2a 2a 20 62 79 74 65 73  Region .** bytes
29d90 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20   in size..**.** 
29da0 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
29db0 72 73 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  rs, an error cod
29dc0 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  e is returned an
29dd0 64 20 2a 70 70 20 69 73 20 73 65 74 20 74 6f 20  d *pp is set to 
29de0 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65  NULL..**.** Othe
29df0 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 62 45  rwise, if the bE
29e00 78 74 65 6e 64 20 70 61 72 61 6d 65 74 65 72 20  xtend parameter 
29e10 69 73 20 30 20 61 6e 64 20 74 68 65 20 72 65 71  is 0 and the req
29e20 75 65 73 74 65 64 20 73 68 61 72 65 64 2d 6d 65  uested shared-me
29e30 6d 6f 72 79 0a 2a 2a 20 72 65 67 69 6f 6e 20 68  mory.** region h
29e40 61 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c 6c 6f  as not been allo
29e50 63 61 74 65 64 20 28 62 79 20 61 6e 79 20 63 6c  cated (by any cl
29e60 69 65 6e 74 2c 20 69 6e 63 6c 75 64 69 6e 67 20  ient, including 
29e70 6f 6e 65 20 72 75 6e 6e 69 6e 67 20 69 6e 20 61  one running in a
29e80 0a 2a 2a 20 73 65 70 61 72 61 74 65 20 70 72 6f  .** separate pro
29e90 63 65 73 73 29 2c 20 74 68 65 6e 20 2a 70 70 20  cess), then *pp 
29ea0 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61  is set to NULL a
29eb0 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  nd SQLITE_OK ret
29ec0 75 72 6e 65 64 2e 20 49 66 20 0a 2a 2a 20 62 45  urned. If .** bE
29ed0 78 74 65 6e 64 20 69 73 20 6e 6f 6e 2d 7a 65 72  xtend is non-zer
29ee0 6f 20 61 6e 64 20 74 68 65 20 72 65 71 75 65 73  o and the reques
29ef0 74 65 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  ted shared-memor
29f00 79 20 72 65 67 69 6f 6e 20 68 61 73 20 6e 6f 74  y region has not
29f10 20 79 65 74 20 0a 2a 2a 20 62 65 65 6e 20 61 6c   yet .** been al
29f20 6c 6f 63 61 74 65 64 2c 20 69 74 20 69 73 20 61  located, it is a
29f30 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68 69 73  llocated by this
29f40 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   function..**.**
29f50 20 49 66 20 74 68 65 20 73 68 61 72 65 64 2d 6d   If the shared-m
29f60 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 68 61 73  emory region has
29f70 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c   already been al
29f80 6c 6f 63 61 74 65 64 20 6f 72 20 69 73 20 61 6c  located or is al
29f90 6c 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20 74 68  located by.** th
29fa0 69 73 20 63 61 6c 6c 20 61 73 20 64 65 73 63 72  is call as descr
29fb0 69 62 65 64 20 61 62 6f 76 65 2c 20 74 68 65 6e  ibed above, then
29fc0 20 69 74 20 69 73 20 6d 61 70 70 65 64 20 69 6e   it is mapped in
29fd0 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73 65  to this processe
29fe0 73 20 0a 2a 2a 20 61 64 64 72 65 73 73 20 73 70  s .** address sp
29ff0 61 63 65 20 28 69 66 20 69 74 20 69 73 20 6e 6f  ace (if it is no
2a000 74 20 61 6c 72 65 61 64 79 29 2c 20 2a 70 70 20  t already), *pp 
2a010 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20  is set to point 
2a020 74 6f 20 74 68 65 20 6d 61 70 70 65 64 20 0a 2a  to the mapped .*
2a030 2a 20 6d 65 6d 6f 72 79 20 61 6e 64 20 53 51 4c  * memory and SQL
2a040 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e  ITE_OK returned.
2a050 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
2a060 6e 69 78 53 68 6d 4d 61 70 28 0a 20 20 73 71 6c  nixShmMap(.  sql
2a070 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20  ite3_file *fd,  
2a080 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a090 48 61 6e 64 6c 65 20 6f 70 65 6e 20 6f 6e 20 64  Handle open on d
2a0a0 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
2a0b0 20 20 69 6e 74 20 69 52 65 67 69 6f 6e 2c 20 20    int iRegion,  
2a0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a0d0 20 20 2f 2a 20 52 65 67 69 6f 6e 20 74 6f 20 72    /* Region to r
2a0e0 65 74 72 69 65 76 65 20 2a 2f 0a 20 20 69 6e 74  etrieve */.  int
2a0f0 20 73 7a 52 65 67 69 6f 6e 2c 20 20 20 20 20 20   szRegion,      
2a100 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a110 53 69 7a 65 20 6f 66 20 72 65 67 69 6f 6e 73 20  Size of regions 
2a120 2a 2f 0a 20 20 69 6e 74 20 62 45 78 74 65 6e 64  */.  int bExtend
2a130 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2a140 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
2a150 65 78 74 65 6e 64 20 66 69 6c 65 20 69 66 20 6e  extend file if n
2a160 65 63 65 73 73 61 72 79 20 2a 2f 0a 20 20 76 6f  ecessary */.  vo
2a170 69 64 20 76 6f 6c 61 74 69 6c 65 20 2a 2a 70 70  id volatile **pp
2a180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2a190 20 4f 55 54 3a 20 4d 61 70 70 65 64 20 6d 65 6d   OUT: Mapped mem
2a1a0 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78  ory */.){.  unix
2a1b0 46 69 6c 65 20 2a 70 44 62 46 64 20 3d 20 28 75  File *pDbFd = (u
2a1c0 6e 69 78 46 69 6c 65 2a 29 66 64 3b 0a 20 20 75  nixFile*)fd;.  u
2a1d0 6e 69 78 53 68 6d 20 2a 70 3b 0a 20 20 75 6e 69  nixShm *p;.  uni
2a1e0 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f  xShmNode *pShmNo
2a1f0 64 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  de;.  int rc = S
2a200 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
2a210 6e 53 68 6d 50 65 72 4d 61 70 20 3d 20 75 6e 69  nShmPerMap = uni
2a220 78 53 68 6d 52 65 67 69 6f 6e 50 65 72 4d 61 70  xShmRegionPerMap
2a230 28 29 3b 0a 20 20 69 6e 74 20 6e 52 65 71 52 65  ();.  int nReqRe
2a240 67 69 6f 6e 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  gion;..  /* If t
2a250 68 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  he shared-memory
2a260 20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 79 65   file has not ye
2a270 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20 6f  t been opened, o
2a280 70 65 6e 20 69 74 20 6e 6f 77 2e 20 2a 2f 0a 20  pen it now. */. 
2a290 20 69 66 28 20 70 44 62 46 64 2d 3e 70 53 68 6d   if( pDbFd->pShm
2a2a0 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
2a2b0 75 6e 69 78 4f 70 65 6e 53 68 61 72 65 64 4d 65  unixOpenSharedMe
2a2c0 6d 6f 72 79 28 70 44 62 46 64 29 3b 0a 20 20 20  mory(pDbFd);.   
2a2d0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2a2e0 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
2a2f0 20 20 7d 0a 0a 20 20 70 20 3d 20 70 44 62 46 64    }..  p = pDbFd
2a300 2d 3e 70 53 68 6d 3b 0a 20 20 70 53 68 6d 4e 6f  ->pShm;.  pShmNo
2a310 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65  de = p->pShmNode
2a320 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
2a330 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65  x_enter(pShmNode
2a340 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73 73 65  ->mutex);.  asse
2a350 72 74 28 20 73 7a 52 65 67 69 6f 6e 3d 3d 70 53  rt( szRegion==pS
2a360 68 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67 69 6f 6e  hmNode->szRegion
2a370 20 7c 7c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52   || pShmNode->nR
2a380 65 67 69 6f 6e 3d 3d 30 20 29 3b 0a 20 20 61 73  egion==0 );.  as
2a390 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e  sert( pShmNode->
2a3a0 70 49 6e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70  pInode==pDbFd->p
2a3b0 49 6e 6f 64 65 20 29 3b 0a 20 20 61 73 73 65 72  Inode );.  asser
2a3c0 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d  t( pShmNode->h>=
2a3d0 30 20 7c 7c 20 70 44 62 46 64 2d 3e 70 49 6e 6f  0 || pDbFd->pIno
2a3e0 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b  de->bProcessLock
2a3f0 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==1 );.  assert(
2a400 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3c 30 20 7c   pShmNode->h<0 |
2a410 7c 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d  | pDbFd->pInode-
2a420 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30  >bProcessLock==0
2a430 20 29 3b 0a 0a 20 20 2f 2a 20 4d 69 6e 69 6d 75   );..  /* Minimu
2a440 6d 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 67 69  m number of regi
2a450 6f 6e 73 20 72 65 71 75 69 72 65 64 20 74 6f 20  ons required to 
2a460 62 65 20 6d 61 70 70 65 64 2e 20 2a 2f 0a 20 20  be mapped. */.  
2a470 6e 52 65 71 52 65 67 69 6f 6e 20 3d 20 28 28 69  nReqRegion = ((i
2a480 52 65 67 69 6f 6e 2b 6e 53 68 6d 50 65 72 4d 61  Region+nShmPerMa
2a490 70 29 20 2f 20 6e 53 68 6d 50 65 72 4d 61 70 29  p) / nShmPerMap)
2a4a0 20 2a 20 6e 53 68 6d 50 65 72 4d 61 70 3b 0a 0a   * nShmPerMap;..
2a4b0 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e    if( pShmNode->
2a4c0 6e 52 65 67 69 6f 6e 3c 6e 52 65 71 52 65 67 69  nRegion<nReqRegi
2a4d0 6f 6e 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  on ){.    char *
2a4e0 2a 61 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20  *apNew;         
2a4f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2a500 4e 65 77 20 61 70 52 65 67 69 6f 6e 5b 5d 20 61  New apRegion[] a
2a510 72 72 61 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20  rray */.    int 
2a520 6e 42 79 74 65 20 3d 20 6e 52 65 71 52 65 67 69  nByte = nReqRegi
2a530 6f 6e 2a 73 7a 52 65 67 69 6f 6e 3b 20 20 20 2f  on*szRegion;   /
2a540 2a 20 4d 69 6e 69 6d 75 6d 20 72 65 71 75 69 72  * Minimum requir
2a550 65 64 20 66 69 6c 65 20 73 69 7a 65 20 2a 2f 0a  ed file size */.
2a560 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74 20      struct stat 
2a570 73 53 74 61 74 3b 20 20 20 20 20 20 20 20 20 20  sStat;          
2a580 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 62         /* Used b
2a590 79 20 66 73 74 61 74 28 29 20 2a 2f 0a 0a 20 20  y fstat() */..  
2a5a0 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 7a 52 65    pShmNode->szRe
2a5b0 67 69 6f 6e 20 3d 20 73 7a 52 65 67 69 6f 6e 3b  gion = szRegion;
2a5c0 0a 0a 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f  ..    if( pShmNo
2a5d0 64 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20  de->h>=0 ){.    
2a5e0 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74    /* The request
2a5f0 65 64 20 72 65 67 69 6f 6e 20 69 73 20 6e 6f 74  ed region is not
2a600 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 74 68 69   mapped into thi
2a610 73 20 70 72 6f 63 65 73 73 65 73 20 61 64 64 72  s processes addr
2a620 65 73 73 20 73 70 61 63 65 2e 0a 20 20 20 20 20  ess space..     
2a630 20 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65   ** Check to see
2a640 20 69 66 20 69 74 20 68 61 73 20 62 65 65 6e 20   if it has been 
2a650 61 6c 6c 6f 63 61 74 65 64 20 28 69 2e 65 2e 20  allocated (i.e. 
2a660 69 66 20 74 68 65 20 77 61 6c 2d 69 6e 64 65 78  if the wal-index
2a670 20 66 69 6c 65 20 69 73 0a 20 20 20 20 20 20 2a   file is.      *
2a680 2a 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 74  * large enough t
2a690 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 72 65  o contain the re
2a6a0 71 75 65 73 74 65 64 20 72 65 67 69 6f 6e 29 2e  quested region).
2a6b0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
2a6c0 69 66 28 20 6f 73 46 73 74 61 74 28 70 53 68 6d  if( osFstat(pShm
2a6d0 4e 6f 64 65 2d 3e 68 2c 20 26 73 53 74 61 74 29  Node->h, &sStat)
2a6e0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
2a6f0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48   SQLITE_IOERR_SH
2a700 4d 53 49 5a 45 3b 0a 20 20 20 20 20 20 20 20 67  MSIZE;.        g
2a710 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b  oto shmpage_out;
2a720 0a 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  .      }.  .    
2a730 20 20 69 66 28 20 73 53 74 61 74 2e 73 74 5f 73    if( sStat.st_s
2a740 69 7a 65 3c 6e 42 79 74 65 20 29 7b 0a 20 20 20  ize<nByte ){.   
2a750 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75       /* The requ
2a760 65 73 74 65 64 20 6d 65 6d 6f 72 79 20 72 65 67  ested memory reg
2a770 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 65 78 69  ion does not exi
2a780 73 74 2e 20 49 66 20 62 45 78 74 65 6e 64 20 69  st. If bExtend i
2a790 73 20 73 65 74 20 74 6f 0a 20 20 20 20 20 20 20  s set to.       
2a7a0 20 2a 2a 20 66 61 6c 73 65 2c 20 65 78 69 74 20   ** false, exit 
2a7b0 65 61 72 6c 79 2e 20 2a 70 70 20 77 69 6c 6c 20  early. *pp will 
2a7c0 62 65 20 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61  be set to NULL a
2a7d0 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  nd SQLITE_OK ret
2a7e0 75 72 6e 65 64 2e 0a 20 20 20 20 20 20 20 20 2a  urned..        *
2a7f0 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 62  /.        if( !b
2a800 45 78 74 65 6e 64 20 29 7b 0a 20 20 20 20 20 20  Extend ){.      
2a810 20 20 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65      goto shmpage
2a820 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _out;.        }.
2a830 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 74 65  .        /* Alte
2a840 72 6e 61 74 69 76 65 6c 79 2c 20 69 66 20 62 45  rnatively, if bE
2a850 78 74 65 6e 64 20 69 73 20 74 72 75 65 2c 20 65  xtend is true, e
2a860 78 74 65 6e 64 20 74 68 65 20 66 69 6c 65 2e 20  xtend the file. 
2a870 44 6f 20 74 68 69 73 20 62 79 0a 20 20 20 20 20  Do this by.     
2a880 20 20 20 2a 2a 20 77 72 69 74 69 6e 67 20 61 20     ** writing a 
2a890 73 69 6e 67 6c 65 20 62 79 74 65 20 74 6f 20 74  single byte to t
2a8a0 68 65 20 65 6e 64 20 6f 66 20 65 61 63 68 20 28  he end of each (
2a8b0 4f 53 29 20 70 61 67 65 20 62 65 69 6e 67 0a 20  OS) page being. 
2a8c0 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61         ** alloca
2a8d0 74 65 64 20 6f 72 20 65 78 74 65 6e 64 65 64 2e  ted or extended.
2a8e0 20 54 65 63 68 6e 69 63 61 6c 6c 79 2c 20 77 65   Technically, we
2a8f0 20 6e 65 65 64 20 6f 6e 6c 79 20 77 72 69 74 65   need only write
2a900 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20   to the.        
2a910 2a 2a 20 6c 61 73 74 20 70 61 67 65 20 69 6e 20  ** last page in 
2a920 6f 72 64 65 72 20 74 6f 20 65 78 74 65 6e 64 20  order to extend 
2a930 74 68 65 20 66 69 6c 65 2e 20 42 75 74 20 77 72  the file. But wr
2a940 69 74 69 6e 67 20 74 6f 20 61 6c 6c 20 6e 65 77  iting to all new
2a950 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65  .        ** page
2a960 73 20 66 6f 72 63 65 73 20 74 68 65 20 4f 53 20  s forces the OS 
2a970 74 6f 20 61 6c 6c 6f 63 61 74 65 20 74 68 65 6d  to allocate them
2a980 20 69 6d 6d 65 64 69 61 74 65 6c 79 2c 20 77 68   immediately, wh
2a990 69 63 68 20 72 65 64 75 63 65 73 0a 20 20 20 20  ich reduces.    
2a9a0 20 20 20 20 2a 2a 20 74 68 65 20 63 68 61 6e 63      ** the chanc
2a9b0 65 73 20 6f 66 20 53 49 47 42 55 53 20 77 68 69  es of SIGBUS whi
2a9c0 6c 65 20 61 63 63 65 73 73 69 6e 67 20 74 68 65  le accessing the
2a9d0 20 6d 61 70 70 65 64 20 72 65 67 69 6f 6e 20 6c   mapped region l
2a9e0 61 74 65 72 20 6f 6e 2e 0a 20 20 20 20 20 20 20  ater on..       
2a9f0 20 2a 2f 0a 20 20 20 20 20 20 20 20 65 6c 73 65   */.        else
2aa00 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 61 74  {.          stat
2aa10 69 63 20 63 6f 6e 73 74 20 69 6e 74 20 70 67 73  ic const int pgs
2aa20 7a 20 3d 20 34 30 39 36 3b 0a 20 20 20 20 20 20  z = 4096;.      
2aa30 20 20 20 20 69 6e 74 20 69 50 67 3b 0a 0a 20 20      int iPg;..  
2aa40 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
2aa50 20 74 6f 20 74 68 65 20 6c 61 73 74 20 62 79 74   to the last byt
2aa60 65 20 6f 66 20 65 61 63 68 20 6e 65 77 6c 79 20  e of each newly 
2aa70 61 6c 6c 6f 63 61 74 65 64 20 6f 72 20 65 78 74  allocated or ext
2aa80 65 6e 64 65 64 20 70 61 67 65 20 2a 2f 0a 20 20  ended page */.  
2aa90 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2aaa0 28 6e 42 79 74 65 20 25 20 70 67 73 7a 29 3d 3d  (nByte % pgsz)==
2aab0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 66  0 );.          f
2aac0 6f 72 28 69 50 67 3d 28 73 53 74 61 74 2e 73 74  or(iPg=(sStat.st
2aad0 5f 73 69 7a 65 2f 70 67 73 7a 29 3b 20 69 50 67  _size/pgsz); iPg
2aae0 3c 28 6e 42 79 74 65 2f 70 67 73 7a 29 3b 20 69  <(nByte/pgsz); i
2aaf0 50 67 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  Pg++){.         
2ab00 20 20 20 69 66 28 20 73 65 65 6b 41 6e 64 57 72     if( seekAndWr
2ab10 69 74 65 46 64 28 70 53 68 6d 4e 6f 64 65 2d 3e  iteFd(pShmNode->
2ab20 68 2c 20 69 50 67 2a 70 67 73 7a 20 2b 20 70 67  h, iPg*pgsz + pg
2ab30 73 7a 2d 31 2c 20 22 22 2c 20 31 2c 20 30 29 21  sz-1, "", 1, 0)!
2ab40 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =1 ){.          
2ab50 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
2ab60 7a 46 69 6c 65 20 3d 20 70 53 68 6d 4e 6f 64 65  zFile = pShmNode
2ab70 2d 3e 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 20  ->zFilename;.   
2ab80 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
2ab90 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c  unixLogError(SQL
2aba0 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a  ITE_IOERR_SHMSIZ
2abb0 45 2c 20 22 77 72 69 74 65 22 2c 20 7a 46 69 6c  E, "write", zFil
2abc0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
2abd0 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f    goto shmpage_o
2abe0 75 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ut;.            
2abf0 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
2ac00 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
2ac10 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61      }..    /* Ma
2ac20 70 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  p the requested 
2ac30 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 69 6e  memory region in
2ac40 74 6f 20 74 68 69 73 20 70 72 6f 63 65 73 73 65  to this processe
2ac50 73 20 61 64 64 72 65 73 73 20 73 70 61 63 65 2e  s address space.
2ac60 20 2a 2f 0a 20 20 20 20 61 70 4e 65 77 20 3d 20   */.    apNew = 
2ac70 28 63 68 61 72 20 2a 2a 29 73 71 6c 69 74 65 33  (char **)sqlite3
2ac80 5f 72 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20  _realloc(.      
2ac90 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 70 52 65    pShmNode->apRe
2aca0 67 69 6f 6e 2c 20 6e 52 65 71 52 65 67 69 6f 6e  gion, nReqRegion
2acb0 2a 73 69 7a 65 6f 66 28 63 68 61 72 20 2a 29 0a  *sizeof(char *).
2acc0 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 21      );.    if( !
2acd0 61 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 72  apNew ){.      r
2ace0 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
2acf0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f  _NOMEM;.      go
2ad00 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a  to shmpage_out;.
2ad10 20 20 20 20 7d 0a 20 20 20 20 70 53 68 6d 4e 6f      }.    pShmNo
2ad20 64 65 2d 3e 61 70 52 65 67 69 6f 6e 20 3d 20 61  de->apRegion = a
2ad30 70 4e 65 77 3b 0a 20 20 20 20 77 68 69 6c 65 28  pNew;.    while(
2ad40 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69   pShmNode->nRegi
2ad50 6f 6e 3c 6e 52 65 71 52 65 67 69 6f 6e 20 29 7b  on<nReqRegion ){
2ad60 0a 20 20 20 20 20 20 69 6e 74 20 6e 4d 61 70 20  .      int nMap 
2ad70 3d 20 73 7a 52 65 67 69 6f 6e 2a 6e 53 68 6d 50  = szRegion*nShmP
2ad80 65 72 4d 61 70 3b 0a 20 20 20 20 20 20 69 6e 74  erMap;.      int
2ad90 20 69 3b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a   i;.      void *
2ada0 70 4d 65 6d 3b 0a 20 20 20 20 20 20 69 66 28 20  pMem;.      if( 
2adb0 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 29  pShmNode->h>=0 )
2adc0 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 20 3d  {.        pMem =
2add0 20 6f 73 4d 6d 61 70 28 30 2c 20 6e 4d 61 70 2c   osMmap(0, nMap,
2ade0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 53 68  .            pSh
2adf0 6d 4e 6f 64 65 2d 3e 69 73 52 65 61 64 6f 6e 6c  mNode->isReadonl
2ae00 79 20 3f 20 50 52 4f 54 5f 52 45 41 44 20 3a 20  y ? PROT_READ : 
2ae10 50 52 4f 54 5f 52 45 41 44 7c 50 52 4f 54 5f 57  PROT_READ|PROT_W
2ae20 52 49 54 45 2c 20 0a 20 20 20 20 20 20 20 20 20  RITE, .         
2ae30 20 20 20 4d 41 50 5f 53 48 41 52 45 44 2c 20 70     MAP_SHARED, p
2ae40 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 73 7a 52 65  ShmNode->h, szRe
2ae50 67 69 6f 6e 2a 28 69 36 34 29 70 53 68 6d 4e 6f  gion*(i64)pShmNo
2ae60 64 65 2d 3e 6e 52 65 67 69 6f 6e 0a 20 20 20 20  de->nRegion.    
2ae70 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69      );.        i
2ae80 66 28 20 70 4d 65 6d 3d 3d 4d 41 50 5f 46 41 49  f( pMem==MAP_FAI
2ae90 4c 45 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20  LED ){.         
2aea0 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72   rc = unixLogErr
2aeb0 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
2aec0 53 48 4d 4d 41 50 2c 20 22 6d 6d 61 70 22 2c 20  SHMMAP, "mmap", 
2aed0 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e  pShmNode->zFilen
2aee0 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
2aef0 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74  goto shmpage_out
2af00 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2af10 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2af20 20 70 4d 65 6d 20 3d 20 73 71 6c 69 74 65 33 5f   pMem = sqlite3_
2af30 6d 61 6c 6c 6f 63 36 34 28 73 7a 52 65 67 69 6f  malloc64(szRegio
2af40 6e 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  n);.        if( 
2af50 70 4d 65 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pMem==0 ){.     
2af60 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
2af70 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20  _NOMEM;.        
2af80 20 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f    goto shmpage_o
2af90 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ut;.        }.  
2afa0 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 4d 65        memset(pMe
2afb0 6d 2c 20 30 2c 20 73 7a 52 65 67 69 6f 6e 29 3b  m, 0, szRegion);
2afc0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
2afd0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 68 6d 50  for(i=0; i<nShmP
2afe0 65 72 4d 61 70 3b 20 69 2b 2b 29 7b 0a 20 20 20  erMap; i++){.   
2aff0 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61       pShmNode->a
2b000 70 52 65 67 69 6f 6e 5b 70 53 68 6d 4e 6f 64 65  pRegion[pShmNode
2b010 2d 3e 6e 52 65 67 69 6f 6e 2b 69 5d 20 3d 20 26  ->nRegion+i] = &
2b020 28 28 63 68 61 72 2a 29 70 4d 65 6d 29 5b 73 7a  ((char*)pMem)[sz
2b030 52 65 67 69 6f 6e 2a 69 5d 3b 0a 20 20 20 20 20  Region*i];.     
2b040 20 7d 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64   }.      pShmNod
2b050 65 2d 3e 6e 52 65 67 69 6f 6e 20 2b 3d 20 6e 53  e->nRegion += nS
2b060 68 6d 50 65 72 4d 61 70 3b 0a 20 20 20 20 7d 0a  hmPerMap;.    }.
2b070 20 20 7d 0a 0a 73 68 6d 70 61 67 65 5f 6f 75 74    }..shmpage_out
2b080 3a 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65  :.  if( pShmNode
2b090 2d 3e 6e 52 65 67 69 6f 6e 3e 69 52 65 67 69 6f  ->nRegion>iRegio
2b0a0 6e 20 29 7b 0a 20 20 20 20 2a 70 70 20 3d 20 70  n ){.    *pp = p
2b0b0 53 68 6d 4e 6f 64 65 2d 3e 61 70 52 65 67 69 6f  ShmNode->apRegio
2b0c0 6e 5b 69 52 65 67 69 6f 6e 5d 3b 0a 20 20 7d 65  n[iRegion];.  }e
2b0d0 6c 73 65 7b 0a 20 20 20 20 2a 70 70 20 3d 20 30  lse{.    *pp = 0
2b0e0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 68 6d  ;.  }.  if( pShm
2b0f0 4e 6f 64 65 2d 3e 69 73 52 65 61 64 6f 6e 6c 79  Node->isReadonly
2b100 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
2b110 4b 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  K ) rc = SQLITE_
2b120 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 73 71 6c 69  READONLY;.  sqli
2b130 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
2b140 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29  pShmNode->mutex)
2b150 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
2b160 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
2b170 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 66 6f  he lock state fo
2b180 72 20 61 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  r a shared-memor
2b190 79 20 73 65 67 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a  y segment..**.**
2b1a0 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 72   Note that the r
2b1b0 65 6c 61 74 69 6f 6e 73 68 69 70 20 62 65 74 77  elationship betw
2b1c0 65 65 6e 20 53 48 41 52 45 64 20 61 6e 64 20 45  een SHAREd and E
2b1d0 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73 20 69  XCLUSIVE locks i
2b1e0 73 20 61 20 6c 69 74 74 6c 65 0a 2a 2a 20 64 69  s a little.** di
2b1f0 66 66 65 72 65 6e 74 20 68 65 72 65 20 74 68 61  fferent here tha
2b200 6e 20 69 6e 20 70 6f 73 69 78 2e 20 20 49 6e 20  n in posix.  In 
2b210 78 53 68 6d 4c 6f 63 6b 28 29 2c 20 6f 6e 65 20  xShmLock(), one 
2b220 63 61 6e 20 67 6f 20 66 72 6f 6d 20 75 6e 6c 6f  can go from unlo
2b230 63 6b 65 64 0a 2a 2a 20 74 6f 20 73 68 61 72 65  cked.** to share
2b240 64 20 61 6e 64 20 62 61 63 6b 20 6f 72 20 66 72  d and back or fr
2b250 6f 6d 20 75 6e 6c 6f 63 6b 65 64 20 74 6f 20 65  om unlocked to e
2b260 78 63 6c 75 73 69 76 65 20 61 6e 64 20 62 61 63  xclusive and bac
2b270 6b 2e 20 20 42 75 74 20 6f 6e 65 20 6d 61 79 0a  k.  But one may.
2b280 2a 2a 20 6e 6f 74 20 67 6f 20 66 72 6f 6d 20 73  ** not go from s
2b290 68 61 72 65 64 20 74 6f 20 65 78 63 6c 75 73 69  hared to exclusi
2b2a0 76 65 20 6f 72 20 66 72 6f 6d 20 65 78 63 6c 75  ve or from exclu
2b2b0 73 69 76 65 20 74 6f 20 73 68 61 72 65 64 2e 0a  sive to shared..
2b2c0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
2b2d0 69 78 53 68 6d 4c 6f 63 6b 28 0a 20 20 73 71 6c  ixShmLock(.  sql
2b2e0 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20  ite3_file *fd,  
2b2f0 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
2b300 61 73 65 20 66 69 6c 65 20 68 6f 6c 64 69 6e 67  ase file holding
2b310 20 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f   the shared memo
2b320 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 73 74  ry */.  int ofst
2b330 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2b340 20 20 20 2f 2a 20 46 69 72 73 74 20 6c 6f 63 6b     /* First lock
2b350 20 74 6f 20 61 63 71 75 69 72 65 20 6f 72 20 72   to acquire or r
2b360 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20  elease */.  int 
2b370 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n,              
2b380 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2b390 20 6f 66 20 6c 6f 63 6b 73 20 74 6f 20 61 63 71   of locks to acq
2b3a0 75 69 72 65 20 6f 72 20 72 65 6c 65 61 73 65 20  uire or release 
2b3b0 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20  */.  int flags  
2b3c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b3d0 2f 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69  /* What to do wi
2b3e0 74 68 20 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a 29  th the lock */.)
2b3f0 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 44  {.  unixFile *pD
2b400 62 46 64 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  bFd = (unixFile*
2b410 29 66 64 3b 20 20 20 20 20 20 2f 2a 20 43 6f 6e  )fd;      /* Con
2b420 6e 65 63 74 69 6f 6e 20 68 6f 6c 64 69 6e 67 20  nection holding 
2b430 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f  shared memory */
2b440 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 20 3d 20  .  unixShm *p = 
2b450 70 44 62 46 64 2d 3e 70 53 68 6d 3b 20 20 20 20  pDbFd->pShm;    
2b460 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2b470 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 62 65  shared memory be
2b480 69 6e 67 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20  ing locked */.  
2b490 75 6e 69 78 53 68 6d 20 2a 70 58 3b 20 20 20 20  unixShm *pX;    
2b4a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b4b0 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f        /* For loo
2b4c0 70 69 6e 67 20 6f 76 65 72 20 61 6c 6c 20 73 69  ping over all si
2b4d0 62 6c 69 6e 67 73 20 2a 2f 0a 20 20 75 6e 69 78  blings */.  unix
2b4e0 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64  ShmNode *pShmNod
2b4f0 65 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b  e = p->pShmNode;
2b500 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79    /* The underly
2b510 69 6e 67 20 66 69 6c 65 20 69 4e 6f 64 65 20 2a  ing file iNode *
2b520 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
2b530 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
2b540 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
2b550 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20 75 31  ult code */.  u1
2b560 36 20 6d 61 73 6b 3b 20 20 20 20 20 20 20 20 20  6 mask;         
2b570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b580 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 6c      /* Mask of l
2b590 6f 63 6b 73 20 74 6f 20 74 61 6b 65 20 6f 72 20  ocks to take or 
2b5a0 72 65 6c 65 61 73 65 20 2a 2f 0a 0a 20 20 61 73  release */..  as
2b5b0 73 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 3d 3d  sert( pShmNode==
2b5c0 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70  pDbFd->pInode->p
2b5d0 53 68 6d 4e 6f 64 65 20 29 3b 0a 20 20 61 73 73  ShmNode );.  ass
2b5e0 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 70  ert( pShmNode->p
2b5f0 49 6e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49  Inode==pDbFd->pI
2b600 6e 6f 64 65 20 29 3b 0a 20 20 61 73 73 65 72 74  node );.  assert
2b610 28 20 6f 66 73 74 3e 3d 30 20 26 26 20 6f 66 73  ( ofst>=0 && ofs
2b620 74 2b 6e 3c 3d 53 51 4c 49 54 45 5f 53 48 4d 5f  t+n<=SQLITE_SHM_
2b630 4e 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  NLOCK );.  asser
2b640 74 28 20 6e 3e 3d 31 20 29 3b 0a 20 20 61 73 73  t( n>=1 );.  ass
2b650 65 72 74 28 20 66 6c 61 67 73 3d 3d 28 53 51 4c  ert( flags==(SQL
2b660 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53  ITE_SHM_LOCK | S
2b670 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52 45 44  QLITE_SHM_SHARED
2b680 29 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c 61 67  ).       || flag
2b690 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 4c  s==(SQLITE_SHM_L
2b6a0 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d  OCK | SQLITE_SHM
2b6b0 5f 45 58 43 4c 55 53 49 56 45 29 0a 20 20 20 20  _EXCLUSIVE).    
2b6c0 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51     || flags==(SQ
2b6d0 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20  LITE_SHM_UNLOCK 
2b6e0 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41  | SQLITE_SHM_SHA
2b6f0 52 45 44 29 0a 20 20 20 20 20 20 20 7c 7c 20 66  RED).       || f
2b700 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48  lags==(SQLITE_SH
2b710 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49 54  M_UNLOCK | SQLIT
2b720 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29  E_SHM_EXCLUSIVE)
2b730 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3d   );.  assert( n=
2b740 3d 31 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 53  =1 || (flags & S
2b750 51 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53  QLITE_SHM_EXCLUS
2b760 49 56 45 29 21 3d 30 20 29 3b 0a 20 20 61 73 73  IVE)!=0 );.  ass
2b770 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68  ert( pShmNode->h
2b780 3e 3d 30 20 7c 7c 20 70 44 62 46 64 2d 3e 70 49  >=0 || pDbFd->pI
2b790 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f  node->bProcessLo
2b7a0 63 6b 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72  ck==1 );.  asser
2b7b0 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3c 30  t( pShmNode->h<0
2b7c0 20 7c 7c 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64   || pDbFd->pInod
2b7d0 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d  e->bProcessLock=
2b7e0 3d 30 20 29 3b 0a 0a 20 20 6d 61 73 6b 20 3d 20  =0 );..  mask = 
2b7f0 28 31 3c 3c 28 6f 66 73 74 2b 6e 29 29 20 2d 20  (1<<(ofst+n)) - 
2b800 28 31 3c 3c 6f 66 73 74 29 3b 0a 20 20 61 73 73  (1<<ofst);.  ass
2b810 65 72 74 28 20 6e 3e 31 20 7c 7c 20 6d 61 73 6b  ert( n>1 || mask
2b820 3d 3d 28 31 3c 3c 6f 66 73 74 29 20 29 3b 0a 20  ==(1<<ofst) );. 
2b830 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
2b840 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d  nter(pShmNode->m
2b850 75 74 65 78 29 3b 0a 20 20 69 66 28 20 66 6c 61  utex);.  if( fla
2b860 67 73 20 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f  gs & SQLITE_SHM_
2b870 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 75 31  UNLOCK ){.    u1
2b880 36 20 61 6c 6c 4d 61 73 6b 20 3d 20 30 3b 20 2f  6 allMask = 0; /
2b890 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b 73 20  * Mask of locks 
2b8a0 68 65 6c 64 20 62 79 20 73 69 62 6c 69 6e 67 73  held by siblings
2b8b0 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 65 20   */..    /* See 
2b8c0 69 66 20 61 6e 79 20 73 69 62 6c 69 6e 67 73 20  if any siblings 
2b8d0 68 6f 6c 64 20 74 68 69 73 20 73 61 6d 65 20 6c  hold this same l
2b8e0 6f 63 6b 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70  ock */.    for(p
2b8f0 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72  X=pShmNode->pFir
2b900 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70  st; pX; pX=pX->p
2b910 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28  Next){.      if(
2b920 20 70 58 3d 3d 70 20 29 20 63 6f 6e 74 69 6e 75   pX==p ) continu
2b930 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e;.      assert(
2b940 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26   (pX->exclMask &
2b950 20 28 70 2d 3e 65 78 63 6c 4d 61 73 6b 7c 70 2d   (p->exclMask|p-
2b960 3e 73 68 61 72 65 64 4d 61 73 6b 29 29 3d 3d 30  >sharedMask))==0
2b970 20 29 3b 0a 20 20 20 20 20 20 61 6c 6c 4d 61 73   );.      allMas
2b980 6b 20 7c 3d 20 70 58 2d 3e 73 68 61 72 65 64 4d  k |= pX->sharedM
2b990 61 73 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ask;.    }..    
2b9a0 2f 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 73 79  /* Unlock the sy
2b9b0 73 74 65 6d 2d 6c 65 76 65 6c 20 6c 6f 63 6b 73  stem-level locks
2b9c0 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 6d 61 73   */.    if( (mas
2b9d0 6b 20 26 20 61 6c 6c 4d 61 73 6b 29 3d 3d 30 20  k & allMask)==0 
2b9e0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 75 6e  ){.      rc = un
2b9f0 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28  ixShmSystemLock(
2ba00 70 44 62 46 64 2c 20 46 5f 55 4e 4c 43 4b 2c 20  pDbFd, F_UNLCK, 
2ba10 6f 66 73 74 2b 55 4e 49 58 5f 53 48 4d 5f 42 41  ofst+UNIX_SHM_BA
2ba20 53 45 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73  SE, n);.    }els
2ba30 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  e{.      rc = SQ
2ba40 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a  LITE_OK;.    }..
2ba50 20 20 20 20 2f 2a 20 55 6e 64 6f 20 74 68 65 20      /* Undo the 
2ba60 6c 6f 63 61 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20  local locks */. 
2ba70 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2ba80 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d  E_OK ){.      p-
2ba90 3e 65 78 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61  >exclMask &= ~ma
2baa0 73 6b 3b 0a 20 20 20 20 20 20 70 2d 3e 73 68 61  sk;.      p->sha
2bab0 72 65 64 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b  redMask &= ~mask
2bac0 3b 0a 20 20 20 20 7d 20 0a 20 20 7d 65 6c 73 65  ;.    } .  }else
2bad0 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c   if( flags & SQL
2bae0 49 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 20 29  ITE_SHM_SHARED )
2baf0 7b 0a 20 20 20 20 75 31 36 20 61 6c 6c 53 68 61  {.    u16 allSha
2bb00 72 65 64 20 3d 20 30 3b 20 20 2f 2a 20 55 6e 69  red = 0;  /* Uni
2bb10 6f 6e 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64  on of locks held
2bb20 20 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20   by connections 
2bb30 6f 74 68 65 72 20 74 68 61 6e 20 22 70 22 20 2a  other than "p" *
2bb40 2f 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20 6f  /..    /* Find o
2bb50 75 74 20 77 68 69 63 68 20 73 68 61 72 65 64 20  ut which shared 
2bb60 6c 6f 63 6b 73 20 61 72 65 20 61 6c 72 65 61 64  locks are alread
2bb70 79 20 68 65 6c 64 20 62 79 20 73 69 62 6c 69 6e  y held by siblin
2bb80 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0a 20  g connections.. 
2bb90 20 20 20 2a 2a 20 49 66 20 61 6e 79 20 73 69 62     ** If any sib
2bba0 6c 69 6e 67 20 61 6c 72 65 61 64 79 20 68 6f 6c  ling already hol
2bbb0 64 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  ds an exclusive 
2bbc0 6c 6f 63 6b 2c 20 67 6f 20 61 68 65 61 64 20 61  lock, go ahead a
2bbd0 6e 64 20 72 65 74 75 72 6e 0a 20 20 20 20 2a 2a  nd return.    **
2bbe0 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 0a 20 20   SQLITE_BUSY..  
2bbf0 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d    */.    for(pX=
2bc00 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74  pShmNode->pFirst
2bc10 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65  ; pX; pX=pX->pNe
2bc20 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28  xt){.      if( (
2bc30 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20 6d  pX->exclMask & m
2bc40 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ask)!=0 ){.     
2bc50 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
2bc60 55 53 59 3b 0a 20 20 20 20 20 20 20 20 62 72 65  USY;.        bre
2bc70 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
2bc80 20 20 61 6c 6c 53 68 61 72 65 64 20 7c 3d 20 70    allShared |= p
2bc90 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b 3b 0a 20  X->sharedMask;. 
2bca0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74     }..    /* Get
2bcb0 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 61 74   shared locks at
2bcc0 20 74 68 65 20 73 79 73 74 65 6d 20 6c 65 76 65   the system leve
2bcd0 6c 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79 20  l, if necessary 
2bce0 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  */.    if( rc==S
2bcf0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2bd00 20 20 69 66 28 20 28 61 6c 6c 53 68 61 72 65 64    if( (allShared
2bd10 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20   & mask)==0 ){. 
2bd20 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78         rc = unix
2bd30 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 44  ShmSystemLock(pD
2bd40 62 46 64 2c 20 46 5f 52 44 4c 43 4b 2c 20 6f 66  bFd, F_RDLCK, of
2bd50 73 74 2b 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45  st+UNIX_SHM_BASE
2bd60 2c 20 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  , n);.      }els
2bd70 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  e{.        rc = 
2bd80 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
2bd90 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
2bda0 20 47 65 74 20 74 68 65 20 6c 6f 63 61 6c 20 73   Get the local s
2bdb0 68 61 72 65 64 20 6c 6f 63 6b 73 20 2a 2f 0a 20  hared locks */. 
2bdc0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2bdd0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d  E_OK ){.      p-
2bde0 3e 73 68 61 72 65 64 4d 61 73 6b 20 7c 3d 20 6d  >sharedMask |= m
2bdf0 61 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  ask;.    }.  }el
2be00 73 65 7b 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20  se{.    /* Make 
2be10 73 75 72 65 20 6e 6f 20 73 69 62 6c 69 6e 67 20  sure no sibling 
2be20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 68 6f 6c 64  connections hold
2be30 20 6c 6f 63 6b 73 20 74 68 61 74 20 77 69 6c 6c   locks that will
2be40 20 62 6c 6f 63 6b 20 74 68 69 73 0a 20 20 20 20   block this.    
2be50 2a 2a 20 6c 6f 63 6b 2e 20 20 49 66 20 61 6e 79  ** lock.  If any
2be60 20 64 6f 2c 20 72 65 74 75 72 6e 20 53 51 4c 49   do, return SQLI
2be70 54 45 5f 42 55 53 59 20 72 69 67 68 74 20 61 77  TE_BUSY right aw
2be80 61 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  ay..    */.    f
2be90 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e  or(pX=pShmNode->
2bea0 70 46 69 72 73 74 3b 20 70 58 3b 20 70 58 3d 70  pFirst; pX; pX=p
2beb0 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  X->pNext){.     
2bec0 20 69 66 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61   if( (pX->exclMa
2bed0 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20 7c 7c  sk & mask)!=0 ||
2bee0 20 28 70 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b   (pX->sharedMask
2bef0 20 26 20 6d 61 73 6b 29 21 3d 30 20 29 7b 0a 20   & mask)!=0 ){. 
2bf00 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
2bf10 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20  TE_BUSY;.       
2bf20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
2bf30 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
2bf40 47 65 74 20 74 68 65 20 65 78 63 6c 75 73 69 76  Get the exclusiv
2bf50 65 20 6c 6f 63 6b 73 20 61 74 20 74 68 65 20 73  e locks at the s
2bf60 79 73 74 65 6d 20 6c 65 76 65 6c 2e 20 20 54 68  ystem level.  Th
2bf70 65 6e 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  en if successful
2bf80 0a 20 20 20 20 2a 2a 20 61 6c 73 6f 20 6d 61 72  .    ** also mar
2bf90 6b 20 74 68 65 20 6c 6f 63 61 6c 20 63 6f 6e 6e  k the local conn
2bfa0 65 63 74 69 6f 6e 20 61 73 20 62 65 69 6e 67 20  ection as being 
2bfb0 6c 6f 63 6b 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  locked..    */. 
2bfc0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2bfd0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
2bfe0 20 3d 20 75 6e 69 78 53 68 6d 53 79 73 74 65 6d   = unixShmSystem
2bff0 4c 6f 63 6b 28 70 44 62 46 64 2c 20 46 5f 57 52  Lock(pDbFd, F_WR
2c000 4c 43 4b 2c 20 6f 66 73 74 2b 55 4e 49 58 5f 53  LCK, ofst+UNIX_S
2c010 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20  HM_BASE, n);.   
2c020 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2c030 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2c040 61 73 73 65 72 74 28 20 28 70 2d 3e 73 68 61 72  assert( (p->shar
2c050 65 64 4d 61 73 6b 20 26 20 6d 61 73 6b 29 3d 3d  edMask & mask)==
2c060 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  0 );.        p->
2c070 65 78 63 6c 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b  exclMask |= mask
2c080 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2c090 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75    }.  sqlite3_mu
2c0a0 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f  tex_leave(pShmNo
2c0b0 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 4f 53  de->mutex);.  OS
2c0c0 54 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b  TRACE(("SHM-LOCK
2c0d0 20 73 68 6d 69 64 2d 25 64 2c 20 70 69 64 2d 25   shmid-%d, pid-%
2c0e0 64 20 67 6f 74 20 25 30 33 78 2c 25 30 33 78 5c  d got %03x,%03x\
2c0f0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  n",.           p
2c100 2d 3e 69 64 2c 20 6f 73 47 65 74 70 69 64 28 30  ->id, osGetpid(0
2c110 29 2c 20 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b  ), p->sharedMask
2c120 2c 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 29 29 3b  , p->exclMask));
2c130 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2c140 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74  ./*.** Implement
2c150 20 61 20 6d 65 6d 6f 72 79 20 62 61 72 72 69 65   a memory barrie
2c160 72 20 6f 72 20 6d 65 6d 6f 72 79 20 66 65 6e 63  r or memory fenc
2c170 65 20 6f 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f  e on shared memo
2c180 72 79 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20  ry.  .**.** All 
2c190 6c 6f 61 64 73 20 61 6e 64 20 73 74 6f 72 65 73  loads and stores
2c1a0 20 62 65 67 75 6e 20 62 65 66 6f 72 65 20 74 68   begun before th
2c1b0 65 20 62 61 72 72 69 65 72 20 6d 75 73 74 20 63  e barrier must c
2c1c0 6f 6d 70 6c 65 74 65 20 62 65 66 6f 72 65 0a 2a  omplete before.*
2c1d0 2a 20 61 6e 79 20 6c 6f 61 64 20 6f 72 20 73 74  * any load or st
2c1e0 6f 72 65 20 62 65 67 75 6e 20 61 66 74 65 72 20  ore begun after 
2c1f0 74 68 65 20 62 61 72 72 69 65 72 2e 0a 2a 2f 0a  the barrier..*/.
2c200 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78  static void unix
2c210 53 68 6d 42 61 72 72 69 65 72 28 0a 20 20 73 71  ShmBarrier(.  sq
2c220 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 20 20  lite3_file *fd  
2c230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2c240 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   Database file h
2c250 6f 6c 64 69 6e 67 20 74 68 65 20 73 68 61 72 65  olding the share
2c260 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 29 7b 0a 20  d memory */.){. 
2c270 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
2c280 52 28 66 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  R(fd);.  sqlite3
2c290 4d 65 6d 6f 72 79 42 61 72 72 69 65 72 28 29 3b  MemoryBarrier();
2c2a0 20 20 20 20 20 20 20 20 20 2f 2a 20 63 6f 6d 70           /* comp
2c2b0 69 6c 65 72 2d 64 65 66 69 6e 65 64 20 6d 65 6d  iler-defined mem
2c2c0 6f 72 79 20 62 61 72 72 69 65 72 20 2a 2f 0a 20  ory barrier */. 
2c2d0 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
2c2e0 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  );              
2c2f0 20 2f 2a 20 41 6c 73 6f 20 6d 75 74 65 78 2c 20   /* Also mutex, 
2c300 66 6f 72 20 72 65 64 75 6e 64 61 6e 63 79 20 2a  for redundancy *
2c310 2f 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74  /.  unixLeaveMut
2c320 65 78 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ex();.}../*.** C
2c330 6c 6f 73 65 20 61 20 63 6f 6e 6e 65 63 74 69 6f  lose a connectio
2c340 6e 20 74 6f 20 73 68 61 72 65 64 2d 6d 65 6d 6f  n to shared-memo
2c350 72 79 2e 20 20 44 65 6c 65 74 65 20 74 68 65 20  ry.  Delete the 
2c360 75 6e 64 65 72 6c 79 69 6e 67 20 0a 2a 2a 20 73  underlying .** s
2c370 74 6f 72 61 67 65 20 69 66 20 64 65 6c 65 74 65  torage if delete
2c380 46 6c 61 67 20 69 73 20 74 72 75 65 2e 0a 2a 2a  Flag is true..**
2c390 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73 20  .** If there is 
2c3a0 6e 6f 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  no shared memory
2c3b0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
2c3c0 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
2c3d0 74 68 65 6e 20 74 68 69 73 0a 2a 2a 20 72 6f 75  then this.** rou
2c3e0 74 69 6e 65 20 69 73 20 61 20 68 61 72 6d 6c 65  tine is a harmle
2c3f0 73 73 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61  ss no-op..*/.sta
2c400 74 69 63 20 69 6e 74 20 75 6e 69 78 53 68 6d 55  tic int unixShmU
2c410 6e 6d 61 70 28 0a 20 20 73 71 6c 69 74 65 33 5f  nmap(.  sqlite3_
2c420 66 69 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20  file *fd,       
2c430 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75          /* The u
2c440 6e 64 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61  nderlying databa
2c450 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  se file */.  int
2c460 20 64 65 6c 65 74 65 46 6c 61 67 20 20 20 20 20   deleteFlag     
2c470 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2c480 44 65 6c 65 74 65 20 73 68 61 72 65 64 2d 6d 65  Delete shared-me
2c490 6d 6f 72 79 20 69 66 20 74 72 75 65 20 2a 2f 0a  mory if true */.
2c4a0 29 7b 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 3b  ){.  unixShm *p;
2c4b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c4c0 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 6e       /* The conn
2c4d0 65 63 74 69 6f 6e 20 74 6f 20 62 65 20 63 6c 6f  ection to be clo
2c4e0 73 65 64 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d  sed */.  unixShm
2c4f0 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20  Node *pShmNode; 
2c500 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2c510 75 6e 64 65 72 6c 79 69 6e 67 20 73 68 61 72 65  underlying share
2c520 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20 2a 2f  d-memory file */
2c530 0a 20 20 75 6e 69 78 53 68 6d 20 2a 2a 70 70 3b  .  unixShm **pp;
2c540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c550 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e     /* For loopin
2c560 67 20 6f 76 65 72 20 73 69 62 6c 69 6e 67 20 63  g over sibling c
2c570 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a 20 20  onnections */.  
2c580 75 6e 69 78 46 69 6c 65 20 2a 70 44 62 46 64 3b  unixFile *pDbFd;
2c590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c5a0 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e  /* The underlyin
2c5b0 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  g database file 
2c5c0 2a 2f 0a 0a 20 20 70 44 62 46 64 20 3d 20 28 75  */..  pDbFd = (u
2c5d0 6e 69 78 46 69 6c 65 2a 29 66 64 3b 0a 20 20 70  nixFile*)fd;.  p
2c5e0 20 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a   = pDbFd->pShm;.
2c5f0 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
2c600 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
2c610 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70   pShmNode = p->p
2c620 53 68 6d 4e 6f 64 65 3b 0a 0a 20 20 61 73 73 65  ShmNode;..  asse
2c630 72 74 28 20 70 53 68 6d 4e 6f 64 65 3d 3d 70 44  rt( pShmNode==pD
2c640 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68  bFd->pInode->pSh
2c650 6d 4e 6f 64 65 20 29 3b 0a 20 20 61 73 73 65 72  mNode );.  asser
2c660 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e  t( pShmNode->pIn
2c670 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f  ode==pDbFd->pIno
2c680 64 65 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 6d 6f  de );..  /* Remo
2c690 76 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20  ve connection p 
2c6a0 66 72 6f 6d 20 74 68 65 20 73 65 74 20 6f 66 20  from the set of 
2c6b0 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 73 73 6f  connections asso
2c6c0 63 69 61 74 65 64 0a 20 20 2a 2a 20 77 69 74 68  ciated.  ** with
2c6d0 20 70 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 73   pShmNode */.  s
2c6e0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
2c6f0 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  er(pShmNode->mut
2c700 65 78 29 3b 0a 20 20 66 6f 72 28 70 70 3d 26 70  ex);.  for(pp=&p
2c710 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b  ShmNode->pFirst;
2c720 20 28 2a 70 70 29 21 3d 70 3b 20 70 70 20 3d 20   (*pp)!=p; pp = 
2c730 26 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29 7b 7d  &(*pp)->pNext){}
2c740 0a 20 20 2a 70 70 20 3d 20 70 2d 3e 70 4e 65 78  .  *pp = p->pNex
2c750 74 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20 74 68  t;..  /* Free th
2c760 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20 2a  e connection p *
2c770 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  /.  sqlite3_free
2c780 28 70 29 3b 0a 20 20 70 44 62 46 64 2d 3e 70 53  (p);.  pDbFd->pS
2c790 68 6d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  hm = 0;.  sqlite
2c7a0 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53  3_mutex_leave(pS
2c7b0 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a  hmNode->mutex);.
2c7c0 0a 20 20 2f 2a 20 49 66 20 70 53 68 6d 4e 6f 64  .  /* If pShmNod
2c7d0 65 2d 3e 6e 52 65 66 20 68 61 73 20 72 65 61 63  e->nRef has reac
2c7e0 68 65 64 20 30 2c 20 74 68 65 6e 20 63 6c 6f 73  hed 0, then clos
2c7f0 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  e the underlying
2c800 0a 20 20 2a 2a 20 73 68 61 72 65 64 2d 6d 65 6d  .  ** shared-mem
2c810 6f 72 79 20 66 69 6c 65 2c 20 74 6f 6f 20 2a 2f  ory file, too */
2c820 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  .  unixEnterMute
2c830 78 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  x();.  assert( p
2c840 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3e 30 20  ShmNode->nRef>0 
2c850 29 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e  );.  pShmNode->n
2c860 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 53 68  Ref--;.  if( pSh
2c870 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3d 3d 30 20 29  mNode->nRef==0 )
2c880 7b 0a 20 20 20 20 69 66 28 20 64 65 6c 65 74 65  {.    if( delete
2c890 46 6c 61 67 20 26 26 20 70 53 68 6d 4e 6f 64 65  Flag && pShmNode
2c8a0 2d 3e 68 3e 3d 30 20 29 20 7b 0a 20 20 20 20 20  ->h>=0 ) {.     
2c8b0 20 69 66 20 28 64 65 6c 65 74 65 46 6c 61 67 20   if (deleteFlag 
2c8c0 3d 3d 20 31 29 20 7b 20 0a 20 20 20 20 20 20 20  == 1) { .       
2c8d0 20 6f 73 55 6e 6c 69 6e 6b 28 70 53 68 6d 4e 6f   osUnlink(pShmNo
2c8e0 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  de->zFilename);.
2c8f0 20 20 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20        } else if 
2c900 28 64 65 6c 65 74 65 46 6c 61 67 20 3d 3d 20 32  (deleteFlag == 2
2c910 29 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 66  ) {.        /* f
2c920 74 72 75 6e 63 61 74 65 28 70 53 68 6d 4e 6f 64  truncate(pShmNod
2c930 65 2d 3e 68 2c 20 33 32 20 2a 20 31 30 32 34 29  e->h, 32 * 1024)
2c940 3b 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20  ; */.      }.   
2c950 20 7d 0a 20 20 20 20 75 6e 69 78 53 68 6d 50 75   }.    unixShmPu
2c960 72 67 65 28 70 44 62 46 64 29 3b 0a 20 20 7d 0a  rge(pDbFd);.  }.
2c970 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
2c980 28 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53 51  ();..  return SQ
2c990 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 23 65 6c  LITE_OK;.}...#el
2c9a0 73 65 0a 23 20 64 65 66 69 6e 65 20 75 6e 69 78  se.# define unix
2c9b0 53 68 6d 4d 61 70 20 20 20 20 20 30 0a 23 20 64  ShmMap     0.# d
2c9c0 65 66 69 6e 65 20 75 6e 69 78 53 68 6d 4c 6f 63  efine unixShmLoc
2c9d0 6b 20 20 20 20 30 0a 23 20 64 65 66 69 6e 65 20  k    0.# define 
2c9e0 75 6e 69 78 53 68 6d 42 61 72 72 69 65 72 20 30  unixShmBarrier 0
2c9f0 0a 23 20 64 65 66 69 6e 65 20 75 6e 69 78 53 68  .# define unixSh
2ca00 6d 55 6e 6d 61 70 20 20 20 30 0a 23 65 6e 64 69  mUnmap   0.#endi
2ca10 66 20 2f 2a 20 23 69 66 6e 64 65 66 20 53 51 4c  f /* #ifndef SQL
2ca20 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a  ITE_OMIT_WAL */.
2ca30 0a 23 69 66 20 28 53 51 4c 49 54 45 5f 45 4e 41  .#if (SQLITE_ENA
2ca40 42 4c 45 5f 41 50 50 4c 45 5f 53 50 49 3e 30 29  BLE_APPLE_SPI>0)
2ca50 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50   && defined(__AP
2ca60 50 4c 45 5f 5f 29 0a 73 74 61 74 69 63 20 63 6f  PLE__).static co
2ca70 6e 73 74 20 63 68 61 72 20 2a 75 6e 69 78 54 65  nst char *unixTe
2ca80 6d 70 46 69 6c 65 44 69 72 28 76 6f 69 64 29 3b  mpFileDir(void);
2ca90 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  ..static int uni
2caa0 78 49 6e 76 61 6c 69 64 61 74 65 53 75 70 70 6f  xInvalidateSuppo
2cab0 72 74 46 69 6c 65 73 28 75 6e 69 78 46 69 6c 65  rtFiles(unixFile
2cac0 20 2a 70 46 69 6c 65 2c 20 69 6e 74 20 73 6b 69   *pFile, int ski
2cad0 70 57 41 4c 29 20 7b 0a 20 20 63 68 61 72 20 6a  pWAL) {.  char j
2cae0 50 61 74 68 5b 4d 41 58 50 41 54 48 4c 45 4e 2b  Path[MAXPATHLEN+
2caf0 39 5d 3b 0a 20 20 69 6e 74 20 7a 4c 65 6e 20 3d  9];.  int zLen =
2cb00 20 73 74 72 6c 63 70 79 28 6a 50 61 74 68 2c 20   strlcpy(jPath, 
2cb10 70 46 69 6c 65 2d 3e 7a 50 61 74 68 2c 20 4d 41  pFile->zPath, MA
2cb20 58 50 41 54 48 4c 45 4e 2b 39 29 3b 0a 20 20 69  XPATHLEN+9);.  i
2cb30 66 28 20 7a 4c 65 6e 3c 4d 41 58 50 41 54 48 4c  f( zLen<MAXPATHL
2cb40 45 4e 20 29 7b 0a 20 20 20 20 73 69 7a 65 5f 74  EN ){.    size_t
2cb50 20 6a 4c 65 6e 3b 0a 20 20 20 20 63 6f 6e 73 74   jLen;.    const
2cb60 20 63 68 61 72 20 65 78 74 65 6e 73 69 6f 6e 73   char extensions
2cb70 5b 33 5d 5b 39 5d 20 3d 20 7b 20 22 2d 77 61 6c  [3][9] = { "-wal
2cb80 22 2c 20 22 2d 6a 6f 75 72 6e 61 6c 22 2c 20 22  ", "-journal", "
2cb90 2d 73 68 6d 22 20 7d 3b 0a 20 20 20 20 69 6e 74  -shm" };.    int
2cba0 20 6a 20 3d 20 28 73 6b 69 70 57 41 4c 20 3f 20   j = (skipWAL ? 
2cbb0 31 20 3a 20 30 29 3b 0a 20 20 20 20 66 6f 72 28  1 : 0);.    for(
2cbc0 20 3b 20 6a 3c 33 3b 20 6a 2b 2b 20 29 7b 0a 20   ; j<3; j++ ){. 
2cbd0 20 20 20 20 20 0a 20 20 20 20 20 20 2f 2a 20 43       .      /* C
2cbe0 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74  heck to see if t
2cbf0 68 65 20 73 68 6d 20 66 69 6c 65 20 69 73 20 61  he shm file is a
2cc00 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20 66 6f  lready opened fo
2cc10 72 20 74 68 69 73 20 70 46 69 6c 65 20 2a 2f 0a  r this pFile */.
2cc20 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 32 20 29        if( j==2 )
2cc30 7b 0a 20 20 20 20 20 20 20 20 75 6e 69 78 45 6e  {.        unixEn
2cc40 74 65 72 4d 75 74 65 78 28 29 3b 20 2f 2a 20 42  terMutex(); /* B
2cc50 65 63 61 75 73 65 20 70 46 69 6c 65 2d 3e 70 49  ecause pFile->pI
2cc60 6e 6f 64 65 20 69 73 20 73 68 61 72 65 64 20 61  node is shared a
2cc70 63 72 6f 73 73 20 74 68 72 65 61 64 73 20 2a 2f  cross threads */
2cc80 0a 20 20 20 20 20 20 20 20 75 6e 69 78 53 68 6d  .        unixShm
2cc90 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 20 3d  Node *pShmNode =
2cca0 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e   pFile->pInode->
2ccb0 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 20 20 20 20  pShmNode;.      
2ccc0 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 20 26    if( pShmNode &
2ccd0 26 20 21 70 53 68 6d 4e 6f 64 65 2d 3e 69 73 52  & !pShmNode->isR
2cce0 65 61 64 6f 6e 6c 79 20 29 7b 0a 20 20 20 20 20  eadonly ){.     
2ccf0 20 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74       struct stat
2cd00 20 73 53 74 61 74 3b 0a 20 20 20 20 20 20 20 20   sStat;.        
2cd10 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
2cd20 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e  enter(pShmNode->
2cd30 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20 20 20  mutex);.        
2cd40 20 20 0a 20 20 20 20 20 20 20 20 20 20 69 66 28    .          if(
2cd50 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20   pShmNode->h>=0 
2cd60 26 26 20 21 6f 73 46 73 74 61 74 28 70 53 68 6d  && !osFstat(pShm
2cd70 4e 6f 64 65 2d 3e 68 2c 20 26 73 53 74 61 74 29  Node->h, &sStat)
2cd80 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2cd90 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 73 69  unsigned long si
2cda0 7a 65 20 3d 20 28 73 53 74 61 74 2e 73 74 5f 73  ze = (sStat.st_s
2cdb0 69 7a 65 3c 34 29 20 3f 20 73 53 74 61 74 2e 73  ize<4) ? sStat.s
2cdc0 74 5f 73 69 7a 65 20 3a 20 34 3b 0a 20 20 20 20  t_size : 4;.    
2cdd0 20 20 20 20 20 20 20 20 69 66 28 20 73 69 7a 65          if( size
2cde0 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >0 ){.          
2cdf0 20 20 20 20 62 7a 65 72 6f 28 70 53 68 6d 4e 6f      bzero(pShmNo
2ce00 64 65 2d 3e 61 70 52 65 67 69 6f 6e 5b 30 5d 2c  de->apRegion[0],
2ce10 20 73 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20   size);.        
2ce20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
2ce30 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f  tex_leave(pShmNo
2ce40 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20  de->mutex);.    
2ce50 20 20 20 20 20 20 20 20 20 20 75 6e 69 78 4c 65            unixLe
2ce60 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 20 20  aveMutex();.    
2ce70 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
2ce80 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue;.            
2ce90 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
2cea0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
2ceb0 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d  mutex_leave(pShm
2cec0 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  Node->mutex);.  
2ced0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2cee0 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
2cef0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2cf00 6a 4c 65 6e 20 3d 20 73 74 72 6c 63 70 79 28 26  jLen = strlcpy(&
2cf10 6a 50 61 74 68 5b 7a 4c 65 6e 5d 2c 20 65 78 74  jPath[zLen], ext
2cf20 65 6e 73 69 6f 6e 73 5b 6a 5d 2c 20 39 29 3b 0a  ensions[j], 9);.
2cf30 20 20 20 20 20 20 69 66 28 20 6a 4c 65 6e 20 3c        if( jLen <
2cf40 20 39 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e   9 ){.        in
2cf50 74 20 6a 66 6c 61 67 73 20 3d 20 28 6a 3c 32 29  t jflags = (j<2)
2cf60 20 3f 20 4f 5f 54 52 55 4e 43 20 3a 20 4f 5f 52   ? O_TRUNC : O_R
2cf70 44 57 52 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  DWR;.        int
2cf80 20 6a 66 64 20 3d 20 6f 70 65 6e 28 6a 50 61 74   jfd = open(jPat
2cf90 68 2c 20 6a 66 6c 61 67 73 29 3b 0a 20 20 20 20  h, jflags);.    
2cfa0 20 20 20 20 69 66 28 20 6a 66 64 3d 3d 28 2d 31      if( jfd==(-1
2cfb0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ) ){.          i
2cfc0 66 28 20 65 72 72 6e 6f 21 3d 45 4e 4f 45 4e 54  f( errno!=ENOENT
2cfd0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2cfe0 70 65 72 72 6f 72 28 6a 50 61 74 68 29 3b 0a 20  perror(jPath);. 
2cff0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2d000 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
2d010 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 32 20 29        if( j==2 )
2d020 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 74  {.            st
2d030 72 75 63 74 20 73 74 61 74 20 73 53 74 61 74 3b  ruct stat sStat;
2d040 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
2d050 20 21 6f 73 46 73 74 61 74 28 6a 66 64 2c 20 26   !osFstat(jfd, &
2d060 73 53 74 61 74 29 20 29 7b 0a 20 20 20 20 20 20  sStat) ){.      
2d070 20 20 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64          unsigned
2d080 20 6c 6f 6e 67 20 73 69 7a 65 20 3d 20 28 73 53   long size = (sS
2d090 74 61 74 2e 73 74 5f 73 69 7a 65 3c 34 29 20 3f  tat.st_size<4) ?
2d0a0 20 73 53 74 61 74 2e 73 74 5f 73 69 7a 65 20 3a   sStat.st_size :
2d0b0 20 34 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   4;.            
2d0c0 20 20 69 66 28 20 73 69 7a 65 3e 30 20 29 7b 0a    if( size>0 ){.
2d0d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d0e0 75 69 6e 74 33 32 5f 74 20 7a 65 72 6f 20 3d 20  uint32_t zero = 
2d0f0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0;.             
2d100 20 20 20 70 77 72 69 74 65 28 6a 66 64 2c 20 26     pwrite(jfd, &
2d110 7a 65 72 6f 2c 20 28 73 69 7a 65 5f 74 29 73 69  zero, (size_t)si
2d120 7a 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ze, 0);.        
2d130 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2d140 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2d150 7d 0a 20 20 20 20 20 20 20 20 20 20 66 73 79 6e  }.          fsyn
2d160 63 28 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 20  c(jfd);.        
2d170 20 20 63 6c 6f 73 65 28 6a 66 64 29 3b 0a 20 20    close(jfd);.  
2d180 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
2d190 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
2d1a0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
2d1b0 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
2d1c0 55 6e 73 61 66 65 54 72 75 6e 63 61 74 65 44 61  UnsafeTruncateDa
2d1d0 74 61 62 61 73 65 28 75 6e 69 78 46 69 6c 65 20  tabase(unixFile 
2d1e0 2a 70 46 69 6c 65 29 7b 0a 20 20 2f 2a 20 74 68  *pFile){.  /* th
2d1f0 69 73 20 69 73 20 6e 61 73 74 79 20 26 20 62 61  is is nasty & ba
2d200 64 2e 20 20 64 65 73 74 72 75 63 74 69 6f 6e 20  d.  destruction 
2d210 77 69 74 68 20 70 72 65 6a 75 64 69 63 65 2e 20  with prejudice. 
2d220 20 77 65 27 6c 6c 20 6c 6f 73 65 20 61 6c 6c 20   we'll lose all 
2d230 74 68 65 0a 20 20 2a 2a 20 66 69 6c 65 20 6c 6f  the.  ** file lo
2d240 63 6b 73 20 69 6e 20 74 68 69 73 20 70 72 6f 63  cks in this proc
2d250 65 73 73 2c 20 68 6f 77 65 76 65 72 2e 20 73 71  ess, however. sq
2d260 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72  lite3_file_contr
2d270 6f 6c 20 77 6f 72 6b 73 20 70 72 6f 70 65 72 6c  ol works properl
2d280 79 2e 0a 20 20 2a 2a 20 42 75 74 20 69 66 20 69  y..  ** But if i
2d290 74 20 66 61 69 6c 73 2c 20 74 68 69 73 20 77 6f  t fails, this wo
2d2a0 72 6b 73 20 61 70 70 72 6f 78 69 6d 61 74 65 6c  rks approximatel
2d2b0 79 0a 20 20 2a 2f 0a 20 20 63 68 61 72 20 6a 6f  y.  */.  char jo
2d2c0 75 72 6e 61 6c 50 61 74 68 5b 4d 41 58 50 41 54  urnalPath[MAXPAT
2d2d0 48 4c 45 4e 5d 3b 0a 20 20 63 68 61 72 20 77 61  HLEN];.  char wa
2d2e0 6c 50 61 74 68 5b 4d 41 58 50 41 54 48 4c 45 4e  lPath[MAXPATHLEN
2d2f0 5d 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ];.  int rc = SQ
2d300 4c 49 54 45 5f 4f 4b 3b 0a 20 20 0a 23 69 66 64  LITE_OK;.  .#ifd
2d310 65 66 20 44 45 42 55 47 0a 20 20 66 70 72 69 6e  ef DEBUG.  fprin
2d320 74 66 28 73 74 64 65 72 72 2c 20 22 46 6f 72 63  tf(stderr, "Forc
2d330 65 20 74 72 75 6e 63 61 74 69 6e 67 20 64 61 74  e truncating dat
2d340 61 62 61 73 65 20 25 73 5c 6e 22 2c 20 70 46 69  abase %s\n", pFi
2d350 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 23 65 6e 64  le->zPath);.#end
2d360 69 66 0a 20 20 73 74 72 6c 63 70 79 28 6a 6f 75  if.  strlcpy(jou
2d370 72 6e 61 6c 50 61 74 68 2c 20 70 46 69 6c 65 2d  rnalPath, pFile-
2d380 3e 7a 50 61 74 68 2c 20 4d 41 58 50 41 54 48 4c  >zPath, MAXPATHL
2d390 45 4e 29 3b 0a 20 20 73 74 72 6c 63 61 74 28 6a  EN);.  strlcat(j
2d3a0 6f 75 72 6e 61 6c 50 61 74 68 2c 20 22 2d 6a 6f  ournalPath, "-jo
2d3b0 75 72 6e 61 6c 22 2c 20 4d 41 58 50 41 54 48 4c  urnal", MAXPATHL
2d3c0 45 4e 29 3b 0a 20 20 73 74 72 6c 63 70 79 28 77  EN);.  strlcpy(w
2d3d0 61 6c 50 61 74 68 2c 20 70 46 69 6c 65 2d 3e 7a  alPath, pFile->z
2d3e0 50 61 74 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e  Path, MAXPATHLEN
2d3f0 29 3b 0a 20 20 73 74 72 6c 63 61 74 28 77 61 6c  );.  strlcat(wal
2d400 50 61 74 68 2c 20 22 2d 77 61 6c 22 2c 20 4d 41  Path, "-wal", MA
2d410 58 50 41 54 48 4c 45 4e 29 3b 0a 20 20 69 6e 74  XPATHLEN);.  int
2d420 20 66 64 31 20 3d 20 70 46 69 6c 65 2d 3e 68 3b   fd1 = pFile->h;
2d430 0a 20 20 69 6e 74 20 72 65 73 75 6c 74 20 3d 20  .  int result = 
2d440 30 3b 0a 20 20 72 65 73 75 6c 74 20 3d 20 66 74  0;.  result = ft
2d450 72 75 6e 63 61 74 65 28 66 64 31 2c 20 30 6c 6c  runcate(fd1, 0ll
2d460 29 3b 0a 20 20 69 66 20 28 72 65 73 75 6c 74 29  );.  if (result)
2d470 20 7b 0a 20 20 20 20 72 65 73 75 6c 74 20 3d 20   {.    result = 
2d480 65 72 72 6e 6f 3b 0a 20 20 7d 0a 20 20 69 66 20  errno;.  }.  if 
2d490 28 72 65 73 75 6c 74 29 20 7b 0a 20 20 20 20 72  (result) {.    r
2d4a0 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
2d4b0 3b 0a 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45  ;.    storeLastE
2d4c0 72 72 6e 6f 28 70 46 69 6c 65 2c 20 72 65 73 75  rrno(pFile, resu
2d4d0 6c 74 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 69 6e  lt);.  }.  .  in
2d4e0 74 20 66 64 32 20 3d 20 6f 70 65 6e 28 6a 6f 75  t fd2 = open(jou
2d4f0 72 6e 61 6c 50 61 74 68 2c 20 4f 5f 52 44 57 52  rnalPath, O_RDWR
2d500 29 3b 0a 20 20 69 6e 74 20 72 65 73 75 6c 74 32  );.  int result2
2d510 20 3d 20 30 3b 0a 20 20 69 66 20 28 66 64 32 20   = 0;.  if (fd2 
2d520 3c 20 30 29 20 7b 0a 20 20 20 20 69 66 20 28 65  < 0) {.    if (e
2d530 72 72 6e 6f 20 21 3d 20 45 4e 4f 45 4e 54 29 20  rrno != ENOENT) 
2d540 7b 0a 20 20 20 20 20 20 72 65 73 75 6c 74 32 20  {.      result2 
2d550 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 7d 20 65  = errno;.    } e
2d560 6c 73 65 20 7b 0a 20 20 20 20 20 20 72 65 73 75  lse {.      resu
2d570 6c 74 32 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  lt2 = 0;.    }. 
2d580 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 72 65   } else {.    re
2d590 73 75 6c 74 32 20 3d 20 66 74 72 75 6e 63 61 74  sult2 = ftruncat
2d5a0 65 28 66 64 32 2c 20 30 6c 6c 29 3b 0a 20 20 20  e(fd2, 0ll);.   
2d5b0 20 69 66 20 28 72 65 73 75 6c 74 32 29 20 7b 0a   if (result2) {.
2d5c0 20 20 20 20 20 20 72 65 73 75 6c 74 32 20 3d 20        result2 = 
2d5d0 65 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d  errno;.    }.  }
2d5e0 0a 20 20 69 66 20 28 72 65 73 75 6c 74 32 20 26  .  if (result2 &
2d5f0 26 20 21 72 65 73 75 6c 74 29 20 7b 0a 20 20 20  & !result) {.   
2d600 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
2d610 52 52 3b 0a 20 20 20 20 73 74 6f 72 65 4c 61 73  RR;.    storeLas
2d620 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 72 65  tErrno(pFile, re
2d630 73 75 6c 74 32 29 3b 0a 20 20 7d 0a 20 20 0a 20  sult2);.  }.  . 
2d640 20 69 6e 74 20 66 64 33 20 3d 20 6f 70 65 6e 28   int fd3 = open(
2d650 77 61 6c 50 61 74 68 2c 20 4f 5f 52 44 57 52 29  walPath, O_RDWR)
2d660 3b 0a 20 20 69 6e 74 20 72 65 73 75 6c 74 33 20  ;.  int result3 
2d670 3d 20 30 3b 0a 20 20 69 66 20 28 66 64 33 20 3c  = 0;.  if (fd3 <
2d680 20 30 29 20 7b 0a 20 20 20 20 69 66 20 28 65 72   0) {.    if (er
2d690 72 6e 6f 20 21 3d 20 45 4e 4f 45 4e 54 29 20 7b  rno != ENOENT) {
2d6a0 0a 20 20 20 20 20 20 72 65 73 75 6c 74 33 20 3d  .      result3 =
2d6b0 20 65 72 72 6e 6f 3b 0a 20 20 20 20 7d 20 65 6c   errno;.    } el
2d6c0 73 65 20 7b 0a 20 20 20 20 20 20 72 65 73 75 6c  se {.      resul
2d6d0 74 33 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  t3 = 0;.    }.  
2d6e0 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 72 65 73  } else {.    res
2d6f0 75 6c 74 33 20 3d 20 66 74 72 75 6e 63 61 74 65  ult3 = ftruncate
2d700 28 66 64 33 2c 20 30 6c 6c 29 3b 0a 20 20 20 20  (fd3, 0ll);.    
2d710 69 66 20 28 72 65 73 75 6c 74 33 29 20 7b 0a 20  if (result3) {. 
2d720 20 20 20 20 20 72 65 73 75 6c 74 33 20 3d 20 65       result3 = e
2d730 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rrno;.    }.  }.
2d740 20 20 69 66 20 28 72 65 73 75 6c 74 33 20 26 26    if (result3 &&
2d750 20 21 28 72 65 73 75 6c 74 20 7c 7c 20 72 65 73   !(result || res
2d760 75 6c 74 32 29 29 20 7b 0a 20 20 20 20 72 63 20  ult2)) {.    rc 
2d770 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a  = SQLITE_IOERR;.
2d780 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72      storeLastErr
2d790 6e 6f 28 70 46 69 6c 65 2c 20 72 65 73 75 6c 74  no(pFile, result
2d7a0 32 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 69 66 20  2);.  }.  .  if 
2d7b0 28 66 64 33 20 3e 3d 20 30 29 20 7b 0a 20 20 20  (fd3 >= 0) {.   
2d7c0 20 66 73 79 6e 63 28 66 64 33 29 3b 0a 20 20 20   fsync(fd3);.   
2d7d0 20 63 6c 6f 73 65 28 66 64 33 29 3b 0a 20 20 7d   close(fd3);.  }
2d7e0 0a 20 20 69 66 20 28 66 64 32 20 3e 3d 20 30 29  .  if (fd2 >= 0)
2d7f0 20 7b 0a 20 20 20 20 66 73 79 6e 63 28 66 64 32   {.    fsync(fd2
2d800 29 3b 0a 20 20 20 20 63 6c 6f 73 65 28 66 64 32  );.    close(fd2
2d810 29 3b 0a 20 20 7d 0a 20 20 66 73 79 6e 63 28 66  );.  }.  fsync(f
2d820 64 31 29 3b 0a 09 0a 20 20 72 65 74 75 72 6e 20  d1);...  return 
2d830 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e  rc;.}..static in
2d840 74 20 75 6e 69 78 54 72 75 6e 63 61 74 65 44 61  t unixTruncateDa
2d850 74 61 62 61 73 65 28 75 6e 69 78 46 69 6c 65 20  tabase(unixFile 
2d860 2a 70 46 69 6c 65 2c 20 69 6e 74 20 62 46 6c 61  *pFile, int bFla
2d870 67 73 29 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f  gs) {.  sqlite3_
2d880 66 69 6c 65 20 2a 69 64 20 3d 20 28 73 71 6c 69  file *id = (sqli
2d890 74 65 33 5f 66 69 6c 65 20 2a 29 70 46 69 6c 65  te3_file *)pFile
2d8a0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
2d8b0 49 54 45 5f 4f 4b 3b 0a 20 20 76 6f 69 64 20 2a  ITE_OK;.  void *
2d8c0 70 4c 6f 63 6b 20 3d 20 4e 55 4c 4c 3b 0a 20 20  pLock = NULL;.  
2d8d0 69 6e 74 20 66 6c 61 67 73 20 3d 20 30 3b 0a 20  int flags = 0;. 
2d8e0 20 69 6e 74 20 63 6f 72 72 75 70 74 46 69 6c 65   int corruptFile
2d8f0 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Lock = 0;.  int 
2d900 69 73 43 6f 72 72 75 70 74 20 3d 20 30 3b 0a 20  isCorrupt = 0;. 
2d910 20 69 6e 74 20 66 6f 72 63 65 20 3d 20 28 62 46   int force = (bF
2d920 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 54 52  lags & SQLITE_TR
2d930 55 4e 43 41 54 45 5f 46 4f 52 43 45 29 3b 0a 20  UNCATE_FORCE);. 
2d940 20 69 6e 74 20 73 61 66 65 46 61 69 6c 65 64 20   int safeFailed 
2d950 3d 20 30 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45  = 0;..#if SQLITE
2d960 5f 45 4e 41 42 4c 45 5f 44 41 54 41 5f 50 52 4f  _ENABLE_DATA_PRO
2d970 54 45 43 54 49 4f 4e 0a 20 20 66 6c 61 67 73 20  TECTION.  flags 
2d980 7c 3d 20 70 46 69 6c 65 2d 3e 70 72 6f 74 46 6c  |= pFile->protFl
2d990 61 67 73 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  ags;.#endif.#if 
2d9a0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
2d9b0 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 69 66  CKING_STYLE.  if
2d9c0 28 20 69 73 50 72 6f 78 79 4c 6f 63 6b 69 6e 67  ( isProxyLocking
2d9d0 4d 6f 64 65 28 70 46 69 6c 65 29 20 29 7b 0a 20  Mode(pFile) ){. 
2d9e0 20 20 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49     flags |= SQLI
2d9f0 54 45 5f 4f 50 45 4e 5f 41 55 54 4f 50 52 4f 58  TE_OPEN_AUTOPROX
2da00 59 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  Y;.  }.#endif.  
2da10 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 64  .  rc = sqlite3d
2da20 65 6d 6f 5f 73 75 70 65 72 6c 6f 63 6b 28 70 46  emo_superlock(pF
2da30 69 6c 65 2d 3e 7a 50 61 74 68 2c 20 30 2c 20 66  ile->zPath, 0, f
2da40 6c 61 67 73 2c 20 30 2c 20 30 2c 20 26 70 4c 6f  lags, 0, 0, &pLo
2da50 63 6b 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  ck);.  if( rc ){
2da60 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
2da70 49 54 45 5f 43 4f 52 52 55 50 54 20 7c 7c 20 72  ITE_CORRUPT || r
2da80 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42  c==SQLITE_NOTADB
2da90 20 29 7b 0a 20 20 20 20 20 20 69 73 43 6f 72 72   ){.      isCorr
2daa0 75 70 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 72  upt = 1;.      r
2dab0 63 20 3d 20 73 71 6c 69 74 65 33 64 65 6d 6f 5f  c = sqlite3demo_
2dac0 73 75 70 65 72 6c 6f 63 6b 5f 63 6f 72 72 75 70  superlock_corrup
2dad0 74 28 69 64 2c 20 53 51 4c 49 54 45 5f 4c 4f 43  t(id, SQLITE_LOC
2dae0 4b 5f 45 58 43 4c 55 53 49 56 45 2c 0a 20 20 20  K_EXCLUSIVE,.   
2daf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2db00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2db10 20 20 20 20 20 20 26 63 6f 72 72 75 70 74 46 69        &corruptFi
2db20 6c 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 7d 0a 20  leLock);.    }. 
2db30 20 20 20 69 66 28 20 72 63 20 26 26 20 21 66 6f     if( rc && !fo
2db40 72 63 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74  rce ){.      ret
2db50 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
2db60 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
2db70 3b 20 2f 2a 20 49 67 6e 6f 72 65 20 74 68 65 20  ; /* Ignore the 
2db80 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 75 72 65 20  locking failure 
2db90 69 66 20 66 6f 72 63 65 20 69 73 20 74 72 75 65  if force is true
2dba0 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 28 62   */.  }.  if( (b
2dbb0 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 54 52 55  Flags&SQLITE_TRU
2dbc0 4e 43 41 54 45 5f 49 4e 49 54 49 41 4c 49 5a 45  NCATE_INITIALIZE
2dbd0 5f 48 45 41 44 45 52 5f 4d 41 53 4b 29 21 3d 30  _HEADER_MASK)!=0
2dbe0 20 29 7b 0a 20 20 20 20 2f 2a 20 69 6e 69 74 69   ){.    /* initi
2dbf0 61 6c 69 7a 65 20 61 20 6e 65 77 20 64 61 74 61  alize a new data
2dc00 62 61 73 65 20 69 6e 20 54 4d 50 44 49 52 20 61  base in TMPDIR a
2dc10 6e 64 20 63 6f 70 79 20 74 68 65 20 63 6f 6e 74  nd copy the cont
2dc20 65 6e 74 73 20 6f 76 65 72 20 2a 2f 0a 20 20 20  ents over */.   
2dc30 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 74 44 69   const char *tDi
2dc40 72 20 3d 20 75 6e 69 78 54 65 6d 70 46 69 6c 65  r = unixTempFile
2dc50 44 69 72 28 29 3b 0a 20 20 20 20 69 6e 74 20 74  Dir();.    int t
2dc60 44 69 72 4c 65 6e 20 3d 20 73 74 72 6c 65 6e 28  DirLen = strlen(
2dc70 74 44 69 72 29 3b 0a 20 20 20 20 69 6e 74 20 74  tDir);.    int t
2dc80 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 68 61  Len = sizeof(cha
2dc90 72 29 20 2a 20 28 74 44 69 72 4c 65 6e 20 2b 20  r) * (tDirLen + 
2dca0 31 32 29 3b 0a 20 20 20 20 63 68 61 72 20 2a 74  12);.    char *t
2dcb0 44 62 50 61 74 68 20 3d 20 28 63 68 61 72 20 2a  DbPath = (char *
2dcc0 29 6d 61 6c 6c 6f 63 28 74 4c 65 6e 29 3b 0a 20  )malloc(tLen);. 
2dcd0 20 20 20 69 6e 74 20 74 46 64 20 3d 20 2d 31 3b     int tFd = -1;
2dce0 0a 20 20 20 20 0a 20 20 20 20 73 74 72 6c 63 70  .    .    strlcp
2dcf0 79 28 74 44 62 50 61 74 68 2c 20 74 44 69 72 2c  y(tDbPath, tDir,
2dd00 20 74 4c 65 6e 29 3b 0a 20 20 20 20 69 66 28 20   tLen);.    if( 
2dd10 74 44 62 50 61 74 68 5b 28 74 44 69 72 4c 65 6e  tDbPath[(tDirLen
2dd20 2d 31 29 5d 20 21 3d 20 27 2f 27 20 29 7b 0a 20  -1)] != '/' ){. 
2dd30 20 20 20 20 20 73 74 72 6c 63 61 74 28 74 44 62       strlcat(tDb
2dd40 50 61 74 68 2c 20 22 2f 74 6d 70 64 62 58 58 58  Path, "/tmpdbXXX
2dd50 58 58 22 2c 20 74 4c 65 6e 29 3b 0a 20 20 20 20  XX", tLen);.    
2dd60 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 73  } else {.      s
2dd70 74 72 6c 63 61 74 28 74 44 62 50 61 74 68 2c 20  trlcat(tDbPath, 
2dd80 22 74 6d 70 64 62 58 58 58 58 58 22 2c 20 74 4c  "tmpdbXXXXX", tL
2dd90 65 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 74  en);.    }.    t
2dda0 46 64 20 3d 20 6d 6b 73 74 65 6d 70 28 74 44 62  Fd = mkstemp(tDb
2ddb0 50 61 74 68 29 3b 0a 20 20 20 20 69 66 28 20 74  Path);.    if( t
2ddc0 46 64 3d 3d 2d 31 20 29 7b 0a 20 20 20 20 20 20  Fd==-1 ){.      
2ddd0 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70  storeLastErrno(p
2dde0 46 69 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 20 20  File, errno);.  
2ddf0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2de00 49 4f 45 52 52 3b 0a 20 20 20 20 20 20 73 61 66  IOERR;.      saf
2de10 65 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20  eFailed = 1;.   
2de20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
2de30 6c 69 74 65 33 20 2a 74 44 62 20 3d 20 4e 55 4c  lite3 *tDb = NUL
2de40 4c 3b 0a 20 20 20 20 20 20 63 6f 70 79 66 69 6c  L;.      copyfil
2de50 65 5f 73 74 61 74 65 5f 74 20 73 3b 0a 20 20 20  e_state_t s;.   
2de60 20 20 20 69 6e 74 20 74 72 63 20 3d 20 73 71 6c     int trc = sql
2de70 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 74 44 62  ite3_open_v2(tDb
2de80 50 61 74 68 2c 20 26 74 44 62 2c 0a 20 20 20 20  Path, &tDb,.    
2de90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
2dea0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
2deb0 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  TE | SQLITE_OPEN
2dec0 5f 52 45 41 44 57 52 49 54 45 0a 20 20 20 20 20  _READWRITE.     
2ded0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dee0 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 41   | SQLITE_OPEN_A
2def0 55 54 4f 50 52 4f 58 59 29 2c 20 4e 55 4c 4c 29  UTOPROXY), NULL)
2df00 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 65 72  ;.      char *er
2df10 72 6d 73 67 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  rmsg = NULL;.   
2df20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73     const char *s
2df30 71 6c 20 3d 20 22 22 3b 0a 20 20 20 20 20 20 69  ql = "";.      i
2df40 66 28 20 21 74 72 63 20 26 26 20 28 62 46 6c 61  f( !trc && (bFla
2df50 67 73 26 53 51 4c 49 54 45 5f 54 52 55 4e 43 41  gs&SQLITE_TRUNCA
2df60 54 45 5f 50 41 47 45 53 49 5a 45 5f 4d 41 53 4b  TE_PAGESIZE_MASK
2df70 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e  ) ){.        con
2df80 73 74 20 63 68 61 72 20 70 61 67 65 73 69 7a 65  st char pagesize
2df90 5f 73 71 6c 5b 34 5d 5b 32 32 5d 20 3d 20 7b 0a  _sql[4][22] = {.
2dfa0 20 20 20 20 20 20 20 20 20 20 22 70 72 61 67 6d            "pragm
2dfb0 61 20 70 61 67 65 5f 73 69 7a 65 3d 31 30 32 34  a page_size=1024
2dfc0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 22 70 72  ",.          "pr
2dfd0 61 67 6d 61 20 70 61 67 65 5f 73 69 7a 65 3d 32  agma page_size=2
2dfe0 30 34 38 22 2c 0a 20 20 20 20 20 20 20 20 20 20  048",.          
2dff0 22 70 72 61 67 6d 61 20 70 61 67 65 5f 73 69 7a  "pragma page_siz
2e000 65 3d 34 30 39 36 22 2c 0a 20 20 20 20 20 20 20  e=4096",.       
2e010 20 20 20 22 70 72 61 67 6d 61 20 70 61 67 65 5f     "pragma page_
2e020 73 69 7a 65 3d 38 31 39 32 22 20 0a 20 20 20 20  size=8192" .    
2e030 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 20 20 69      };.        i
2e040 6e 74 20 69 50 61 67 65 73 69 7a 65 20 3d 20 28  nt iPagesize = (
2e050 28 28 62 46 6c 61 67 73 26 53 51 4c 49 54 45 5f  ((bFlags&SQLITE_
2e060 54 52 55 4e 43 41 54 45 5f 50 41 47 45 53 49 5a  TRUNCATE_PAGESIZ
2e070 45 5f 4d 41 53 4b 29 20 3e 3e 20 34 29 20 2d 20  E_MASK) >> 4) - 
2e080 31 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  1);.        asse
2e090 72 74 28 20 69 50 61 67 65 73 69 7a 65 3e 3d 30  rt( iPagesize>=0
2e0a0 20 26 26 20 69 50 61 67 65 73 69 7a 65 3c 3d 34   && iPagesize<=4
2e0b0 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 20   );.        sql 
2e0c0 3d 20 70 61 67 65 73 69 7a 65 5f 73 71 6c 5b 69  = pagesize_sql[i
2e0d0 50 61 67 65 73 69 7a 65 5d 3b 0a 20 20 20 20 20  Pagesize];.     
2e0e0 20 20 20 74 72 63 20 3d 20 73 71 6c 69 74 65 33     trc = sqlite3
2e0f0 5f 65 78 65 63 28 74 44 62 2c 20 73 71 6c 2c 20  _exec(tDb, sql, 
2e100 30 2c 20 30 2c 20 26 65 72 72 6d 73 67 29 3b 0a  0, 0, &errmsg);.
2e110 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
2e120 28 20 21 74 72 63 20 29 7b 0a 20 20 20 20 20 20  ( !trc ){.      
2e130 20 20 63 6f 6e 73 74 20 63 68 61 72 20 61 75 74    const char aut
2e140 6f 76 61 63 75 75 6d 5f 73 71 6c 5b 33 5d 5b 32  ovacuum_sql[3][2
2e150 31 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 20  1] = {.         
2e160 20 22 70 72 61 67 6d 61 20 61 75 74 6f 5f 76 61   "pragma auto_va
2e170 63 75 75 6d 3d 30 22 2c 0a 20 20 20 20 20 20 20  cuum=0",.       
2e180 20 20 20 22 70 72 61 67 6d 61 20 61 75 74 6f 5f     "pragma auto_
2e190 76 61 63 75 75 6d 3d 31 22 2c 0a 20 20 20 20 20  vacuum=1",.     
2e1a0 20 20 20 20 20 22 70 72 61 67 6d 61 20 61 75 74       "pragma aut
2e1b0 6f 5f 76 61 63 75 75 6d 3d 32 22 0a 20 20 20 20  o_vacuum=2".    
2e1c0 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 20 20 69      };.        i
2e1d0 6e 74 20 69 41 75 74 6f 76 61 63 75 75 6d 20 3d  nt iAutovacuum =
2e1e0 20 32 3b 20 2f 2a 20 64 65 66 61 75 6c 74 20 74   2; /* default t
2e1f0 6f 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 2a 2f  o incremental */
2e200 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 62 46  .        if( (bF
2e210 6c 61 67 73 26 53 51 4c 49 54 45 5f 54 52 55 4e  lags&SQLITE_TRUN
2e220 43 41 54 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f  CATE_AUTOVACUUM_
2e230 4d 41 53 4b 29 20 29 7b 0a 20 20 20 20 20 20 20  MASK) ){.       
2e240 20 20 20 69 41 75 74 6f 76 61 63 75 75 6d 20 3d     iAutovacuum =
2e250 20 28 28 28 62 46 6c 61 67 73 26 53 51 4c 49 54   (((bFlags&SQLIT
2e260 45 5f 54 52 55 4e 43 41 54 45 5f 41 55 54 4f 56  E_TRUNCATE_AUTOV
2e270 41 43 55 55 4d 5f 4d 41 53 4b 29 20 3e 3e 20 32  ACUUM_MASK) >> 2
2e280 29 20 2d 20 31 29 3b 0a 20 20 20 20 20 20 20 20  ) - 1);.        
2e290 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  }.        assert
2e2a0 28 20 69 41 75 74 6f 76 61 63 75 75 6d 3e 3d 30  ( iAutovacuum>=0
2e2b0 20 26 26 20 69 41 75 74 6f 76 61 63 75 75 6d 3c   && iAutovacuum<
2e2c0 3d 32 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  =2 );.        sq
2e2d0 6c 20 3d 20 61 75 74 6f 76 61 63 75 75 6d 5f 73  l = autovacuum_s
2e2e0 71 6c 5b 69 41 75 74 6f 76 61 63 75 75 6d 5d 3b  ql[iAutovacuum];
2e2f0 0a 20 20 20 20 20 20 20 20 74 72 63 20 3d 20 73  .        trc = s
2e300 71 6c 69 74 65 33 5f 65 78 65 63 28 74 44 62 2c  qlite3_exec(tDb,
2e310 20 73 71 6c 2c 20 30 2c 20 30 2c 20 26 65 72 72   sql, 0, 0, &err
2e320 6d 73 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  msg);.      }.  
2e330 20 20 20 20 69 66 28 20 21 74 72 63 20 26 26 20      if( !trc && 
2e340 28 62 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 54  (bFlags&SQLITE_T
2e350 52 55 4e 43 41 54 45 5f 4a 4f 55 52 4e 41 4c 4d  RUNCATE_JOURNALM
2e360 4f 44 45 5f 57 41 4c 29 20 29 7b 0a 20 20 20 20  ODE_WAL) ){.    
2e370 20 20 20 20 73 71 6c 20 3d 20 22 70 72 61 67 6d      sql = "pragm
2e380 61 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77  a journal_mode=w
2e390 61 6c 22 3b 0a 20 20 20 20 20 20 20 20 74 72 63  al";.        trc
2e3a0 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28   = sqlite3_exec(
2e3b0 74 44 62 2c 20 73 71 6c 2c 20 30 2c 20 30 2c 20  tDb, sql, 0, 0, 
2e3c0 26 65 72 72 6d 73 67 29 3b 0a 20 20 20 20 20 20  &errmsg);.      
2e3d0 7d 0a 20 20 20 20 20 20 69 66 28 20 74 72 63 20  }.      if( trc 
2e3e0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  ){.        if( !
2e3f0 74 44 62 20 29 7b 0a 20 20 20 20 20 20 20 20 20  tDb ){.         
2e400 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
2e410 20 22 66 61 69 6c 65 64 20 74 6f 20 6f 70 65 6e   "failed to open
2e420 20 74 65 6d 70 20 64 61 74 61 62 61 73 65 20 27   temp database '
2e430 25 73 27 20 74 6f 20 72 65 73 65 74 20 22 0a 20  %s' to reset ". 
2e440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e450 20 20 20 20 20 20 20 20 20 22 74 72 75 6e 63 61           "trunca
2e460 74 65 64 20 64 61 74 61 62 61 73 65 20 25 73 20  ted database %s 
2e470 77 69 74 68 20 66 6c 61 67 73 20 25 78 3a 20 25  with flags %x: %
2e480 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
2e490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e4a0 20 74 44 62 50 61 74 68 2c 20 70 46 69 6c 65 2d   tDbPath, pFile-
2e4b0 3e 7a 50 61 74 68 2c 20 62 46 6c 61 67 73 2c 20  >zPath, bFlags, 
2e4c0 74 72 63 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  trc);.        }e
2e4d0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 66  lse{.          f
2e4e0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
2e4f0 66 61 69 6c 65 64 20 74 6f 20 73 65 74 20 27 25  failed to set '%
2e500 73 27 20 6f 6e 20 74 72 75 6e 63 61 74 65 64 20  s' on truncated 
2e510 64 61 74 61 62 61 73 65 20 25 73 2c 20 25 64 3a  database %s, %d:
2e520 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   ".             
2e530 20 20 20 20 20 20 20 20 20 20 20 20 20 22 25 73               "%s
2e540 5c 6e 22 2c 20 73 71 6c 2c 20 70 46 69 6c 65 2d  \n", sql, pFile-
2e550 3e 7a 50 61 74 68 2c 20 74 72 63 2c 20 65 72 72  >zPath, trc, err
2e560 6d 73 67 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  msg);.        }.
2e570 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
2e580 28 20 74 44 62 20 29 7b 0a 20 20 20 20 20 20 20  ( tDb ){.       
2e590 20 69 6e 74 20 6f 66 66 20 3d 20 30 3b 0a 20 20   int off = 0;.  
2e5a0 20 20 20 20 20 20 2f 2a 20 6d 65 72 67 65 20 74        /* merge t
2e5b0 68 65 20 77 61 6c 20 69 6e 74 6f 20 74 68 65 20  he wal into the 
2e5c0 64 62 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71  db */.        sq
2e5d0 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72  lite3_file_contr
2e5e0 6f 6c 28 74 44 62 2c 20 4e 55 4c 4c 2c 20 53 51  ol(tDb, NULL, SQ
2e5f0 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 45 52 53 49  LITE_FCNTL_PERSI
2e600 53 54 5f 57 41 4c 2c 20 26 6f 66 66 29 3b 0a 20  ST_WAL, &off);. 
2e610 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63         sqlite3_c
2e620 6c 6f 73 65 28 74 44 62 29 3b 0a 20 20 20 20 20  lose(tDb);.     
2e630 20 7d 0a 20 20 20 20 20 20 73 20 3d 20 63 6f 70   }.      s = cop
2e640 79 66 69 6c 65 5f 73 74 61 74 65 5f 61 6c 6c 6f  yfile_state_allo
2e650 63 28 29 3b 0a 20 20 20 20 20 20 6c 73 65 65 6b  c();.      lseek
2e660 28 74 46 64 2c 20 30 2c 20 53 45 45 4b 5f 53 45  (tFd, 0, SEEK_SE
2e670 54 29 3b 0a 20 20 20 20 20 20 6c 73 65 65 6b 28  T);.      lseek(
2e680 70 46 69 6c 65 2d 3e 68 2c 20 30 2c 20 53 45 45  pFile->h, 0, SEE
2e690 4b 5f 53 45 54 29 3b 0a 20 20 20 20 20 20 69 66  K_SET);.      if
2e6a0 28 20 66 63 6f 70 79 66 69 6c 65 28 74 46 64 2c  ( fcopyfile(tFd,
2e6b0 20 70 46 69 6c 65 2d 3e 68 2c 20 73 2c 20 43 4f   pFile->h, s, CO
2e6c0 50 59 46 49 4c 45 5f 44 41 54 41 29 20 29 7b 0a  PYFILE_DATA) ){.
2e6d0 20 20 20 20 20 20 20 20 69 6e 74 20 65 72 72 3d          int err=
2e6e0 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 73  errno;.        s
2e6f0 77 69 74 63 68 28 65 72 72 29 20 7b 0a 20 20 20  witch(err) {.   
2e700 20 20 20 20 20 20 20 63 61 73 65 20 45 4e 4f 4d         case ENOM
2e710 45 4d 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  EM:.            
2e720 74 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d  trc = SQLITE_NOM
2e730 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  EM;.            
2e740 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
2e750 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20   default:.      
2e760 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45        storeLastE
2e770 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72 29  rrno(pFile, err)
2e780 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 72  ;.            tr
2e790 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
2e7a0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2e7b0 20 20 7d 0a 20 20 20 20 20 20 63 6f 70 79 66 69    }.      copyfi
2e7c0 6c 65 5f 73 74 61 74 65 5f 66 72 65 65 28 73 29  le_state_free(s)
2e7d0 3b 0a 20 20 20 20 20 20 66 73 79 6e 63 28 70 46  ;.      fsync(pF
2e7e0 69 6c 65 2d 3e 68 29 3b 0a 20 20 20 20 20 20 63  ile->h);.      c
2e7f0 6c 6f 73 65 28 74 46 64 29 3b 0a 20 20 20 20 20  lose(tFd);.     
2e800 20 75 6e 6c 69 6e 6b 28 74 44 62 50 61 74 68 29   unlink(tDbPath)
2e810 3b 0a 20 20 20 20 20 20 69 66 28 20 74 72 63 21  ;.      if( trc!
2e820 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2e830 20 20 20 20 20 20 73 61 66 65 46 61 69 6c 65 64        safeFailed
2e840 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72 63   = 1;.        rc
2e850 20 3d 20 74 72 63 3b 0a 20 20 20 20 20 20 7d 0a   = trc;.      }.
2e860 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65 28 74      }.    free(t
2e870 44 62 50 61 74 68 29 3b 0a 20 20 7d 20 65 6c 73  DbPath);.  } els
2e880 65 20 7b 0a 20 20 20 20 72 63 20 3d 20 70 46 69  e {.    rc = pFi
2e890 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 54 72  le->pMethod->xTr
2e8a0 75 6e 63 61 74 65 28 69 64 2c 20 0a 20 20 20 20  uncate(id, .    
2e8b0 20 20 20 20 20 20 20 28 28 70 46 69 6c 65 2d 3e         ((pFile->
2e8c0 66 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  fsFlags & SQLITE
2e8d0 5f 46 53 46 4c 41 47 53 5f 49 53 5f 4d 53 44 4f  _FSFLAGS_IS_MSDO
2e8e0 53 29 20 21 3d 20 30 29 20 3f 20 31 4c 20 3a 20  S) != 0) ? 1L : 
2e8f0 30 4c 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  0L);.    if( rc 
2e900 29 7b 0a 20 20 20 20 20 20 73 61 66 65 46 61 69  ){.      safeFai
2e910 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  led = 1;.    }. 
2e920 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
2e930 49 54 45 5f 4f 4b 20 7c 7c 20 66 6f 72 63 65 20  ITE_OK || force 
2e940 29 7b 0a 20 20 20 20 72 63 20 3d 20 75 6e 69 78  ){.    rc = unix
2e950 49 6e 76 61 6c 69 64 61 74 65 53 75 70 70 6f 72  InvalidateSuppor
2e960 74 46 69 6c 65 73 28 70 46 69 6c 65 2c 20 30 29  tFiles(pFile, 0)
2e970 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ;.    if( rc ){.
2e980 20 20 20 20 20 20 73 61 66 65 46 61 69 6c 65 64        safeFailed
2e990 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 1;.    }.  }.
2e9a0 20 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64    pFile->pMethod
2e9b0 2d 3e 78 53 79 6e 63 28 69 64 2c 20 53 51 4c 49  ->xSync(id, SQLI
2e9c0 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 29 3b 0a 0a  TE_SYNC_FULL);..
2e9d0 0a 20 20 69 66 28 20 69 73 43 6f 72 72 75 70 74  .  if( isCorrupt
2e9e0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 64   ){.    sqlite3d
2e9f0 65 6d 6f 5f 73 75 70 65 72 75 6e 6c 6f 63 6b 5f  emo_superunlock_
2ea00 63 6f 72 72 75 70 74 28 69 64 2c 20 63 6f 72 72  corrupt(id, corr
2ea10 75 70 74 46 69 6c 65 4c 6f 63 6b 29 3b 0a 20 20  uptFileLock);.  
2ea20 7d 65 6c 73 65 20 69 66 28 20 70 4c 6f 63 6b 20  }else if( pLock 
2ea30 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 64 65  ){.    sqlite3de
2ea40 6d 6f 5f 73 75 70 65 72 75 6e 6c 6f 63 6b 28 70  mo_superunlock(p
2ea50 4c 6f 63 6b 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Lock);.  }else{.
2ea60 20 20 20 20 61 73 73 65 72 74 28 66 6f 72 63 65      assert(force
2ea70 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 69 66 28 20  );.  }.  .  if( 
2ea80 66 6f 72 63 65 20 26 26 20 73 61 66 65 46 61 69  force && safeFai
2ea90 6c 65 64 29 7b 0a 20 20 20 20 72 63 20 3d 20 75  led){.    rc = u
2eaa0 6e 69 78 55 6e 73 61 66 65 54 72 75 6e 63 61 74  nixUnsafeTruncat
2eab0 65 44 61 74 61 62 61 73 65 28 70 46 69 6c 65 29  eDatabase(pFile)
2eac0 3b 0a 20 20 7d 0a 20 20 0a 20 20 72 65 74 75 72  ;.  }.  .  retur
2ead0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2a 20  n rc;.}../*. ** 
2eae0 4c 6f 63 6b 20 6c 6f 63 61 74 69 6f 6e 73 20 66  Lock locations f
2eaf0 6f 72 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  or shared-memory
2eb00 20 6c 6f 63 6b 73 20 75 73 65 64 20 62 79 20 57   locks used by W
2eb10 41 4c 20 6d 6f 64 65 2e 0a 20 2a 2f 0a 23 69 66  AL mode.. */.#if
2eb20 6e 64 65 66 20 53 48 4d 5f 42 41 53 45 0a 23 20  ndef SHM_BASE.# 
2eb30 64 65 66 69 6e 65 20 53 48 4d 5f 42 41 53 45 20  define SHM_BASE 
2eb40 20 20 20 20 20 20 20 20 20 31 32 30 0a 23 20 64           120.# d
2eb50 65 66 69 6e 65 20 53 48 4d 5f 57 52 49 54 45 20  efine SHM_WRITE 
2eb60 20 20 20 20 20 20 20 20 53 48 4d 5f 42 41 53 45          SHM_BASE
2eb70 0a 23 20 64 65 66 69 6e 65 20 53 48 4d 5f 43 48  .# define SHM_CH
2eb80 45 43 4b 50 4f 49 4e 54 20 20 20 20 28 53 48 4d  ECKPOINT    (SHM
2eb90 5f 42 41 53 45 2b 31 29 0a 23 20 64 65 66 69 6e  _BASE+1).# defin
2eba0 65 20 53 48 4d 5f 52 45 43 4f 56 45 52 20 20 20  e SHM_RECOVER   
2ebb0 20 20 20 20 28 53 48 4d 5f 42 41 53 45 2b 32 29      (SHM_BASE+2)
2ebc0 0a 23 20 64 65 66 69 6e 65 20 53 48 4d 5f 52 45  .# define SHM_RE
2ebd0 41 44 5f 46 49 52 53 54 20 20 20 20 28 53 48 4d  AD_FIRST    (SHM
2ebe0 5f 42 41 53 45 2b 33 29 0a 23 20 64 65 66 69 6e  _BASE+3).# defin
2ebf0 65 20 53 48 4d 5f 52 45 41 44 5f 53 49 5a 45 20  e SHM_READ_SIZE 
2ec00 20 20 20 20 35 0a 23 65 6e 64 69 66 20 2f 2a 20      5.#endif /* 
2ec10 53 48 4d 5f 42 41 53 45 20 2a 2f 0a 0a 2f 2a 0a  SHM_BASE */../*.
2ec20 2a 2a 20 54 68 69 73 20 74 65 73 74 20 6f 6e 6c  ** This test onl
2ec30 79 20 77 6f 72 6b 73 20 66 6f 72 20 6c 6f 63 6b  y works for lock
2ec40 20 74 65 73 74 69 6e 67 20 6f 6e 20 75 6e 69 78   testing on unix
2ec50 2f 70 6f 73 69 78 20 56 46 53 2e 0a 2a 2a 20 41  /posix VFS..** A
2ec60 64 61 70 74 65 64 20 66 72 6f 6d 20 74 6f 6f 6c  dapted from tool
2ec70 2f 67 65 74 6c 6f 63 6b 2e 63 20 66 34 63 33 39  /getlock.c f4c39
2ec80 62 36 35 31 33 37 30 31 35 36 63 61 65 39 37 39  b651370156cae979
2ec90 35 30 31 61 37 62 31 35 36 62 64 62 61 35 30 65  501a7b156bdba50e
2eca0 37 63 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  7ce.*/.static in
2ecb0 74 20 75 6e 69 78 4c 6f 63 6b 73 74 61 74 65 50  t unixLockstateP
2ecc0 69 64 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  id(unixFile *pFi
2ecd0 6c 65 2c 20 70 69 64 5f 74 20 70 69 64 2c 20 69  le, pid_t pid, i
2ece0 6e 74 20 2a 70 4c 6f 63 6b 73 74 61 74 65 29 7b  nt *pLockstate){
2ecf0 0a 20 20 69 6e 74 20 68 44 62 3b 20 20 20 20 20  .  int hDb;     
2ed00 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72     /* File descr
2ed10 69 70 74 6f 72 20 66 6f 72 20 74 68 65 20 6f 70  iptor for the op
2ed20 65 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  en database file
2ed30 20 2a 2f 0a 20 20 69 6e 74 20 68 53 68 6d 20 3d   */.  int hShm =
2ed40 20 2d 31 3b 20 20 2f 2a 20 46 69 6c 65 20 64 65   -1;  /* File de
2ed50 73 63 72 69 70 74 6f 72 20 66 6f 72 20 57 41 4c  scriptor for WAL
2ed60 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66   shared-memory f
2ed70 69 6c 65 20 2a 2f 0a 20 20 73 73 69 7a 65 5f 74  ile */.  ssize_t
2ed80 20 67 6f 74 3b 20 20 20 20 2f 2a 20 42 79 74 65   got;    /* Byte
2ed90 73 20 72 65 61 64 20 66 72 6f 6d 20 68 65 61 64  s read from head
2eda0 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 73 57 61  er */.  int isWa
2edb0 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  l = 0;          
2edc0 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 69 6e     /* True if in
2edd0 20 57 41 4c 20 6d 6f 64 65 20 2a 2f 0a 20 20 69   WAL mode */.  i
2ede0 6e 74 20 6e 4c 6f 63 6b 20 3d 20 30 3b 20 20 20  nt nLock = 0;   
2edf0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2ee00 62 65 72 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c  ber of locks hel
2ee10 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 48 64 72  d */.  int noHdr
2ee20 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
2ee30 20 20 2f 2a 20 5a 65 72 6f 20 62 79 74 65 20 44    /* Zero byte D
2ee40 42 20 68 61 73 20 6e 6f 20 68 65 61 64 65 72 20  B has no header 
2ee50 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
2ee60 61 72 20 61 48 64 72 5b 31 30 30 5d 3b 20 20 20  ar aHdr[100];   
2ee70 2f 2a 20 44 61 74 61 62 61 73 65 20 68 65 61 64  /* Database head
2ee80 65 72 20 2a 2f 0a 20 20 0a 20 20 61 73 73 65 72  er */.  .  asser
2ee90 74 28 70 4c 6f 63 6b 73 74 61 74 65 29 3b 0a 20  t(pLockstate);. 
2eea0 20 0a 20 20 2f 2a 20 6d 61 6b 65 20 73 75 72 65   .  /* make sure
2eeb0 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20   we are dealing 
2eec0 77 69 74 68 20 61 20 64 61 74 61 62 61 73 65 20  with a database 
2eed0 66 69 6c 65 20 2a 2f 0a 20 20 68 44 62 20 3d 20  file */.  hDb = 
2eee0 70 46 69 6c 65 2d 3e 68 3b 0a 20 20 69 66 28 20  pFile->h;.  if( 
2eef0 68 44 62 3c 30 20 29 7b 0a 20 20 20 20 2a 70 4c  hDb<0 ){.    *pL
2ef00 6f 63 6b 73 74 61 74 65 20 3d 20 53 51 4c 49 54  ockstate = SQLIT
2ef10 45 5f 4c 4f 43 4b 53 54 41 54 45 5f 45 52 52 4f  E_LOCKSTATE_ERRO
2ef20 52 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  R;.    return SQ
2ef30 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
2ef40 20 20 61 73 73 65 72 74 28 20 28 73 74 72 6c 65    assert( (strle
2ef50 6e 28 53 51 4c 49 54 45 5f 46 49 4c 45 5f 48 45  n(SQLITE_FILE_HE
2ef60 41 44 45 52 29 2b 31 29 3d 3d 53 51 4c 49 54 45  ADER)+1)==SQLITE
2ef70 5f 46 49 4c 45 5f 48 45 41 44 45 52 5f 4c 45 4e  _FILE_HEADER_LEN
2ef80 20 29 3b 0a 20 20 67 6f 74 20 3d 20 70 72 65 61   );.  got = prea
2ef90 64 28 68 44 62 2c 20 61 48 64 72 2c 20 31 30 30  d(hDb, aHdr, 100
2efa0 2c 20 30 29 3b 0a 20 20 69 66 28 20 67 6f 74 3c  , 0);.  if( got<
2efb0 30 20 29 7b 0a 20 20 20 20 2a 70 4c 6f 63 6b 73  0 ){.    *pLocks
2efc0 74 61 74 65 20 3d 20 53 51 4c 49 54 45 5f 4c 4f  tate = SQLITE_LO
2efd0 43 4b 53 54 41 54 45 5f 45 52 52 4f 52 3b 0a 20  CKSTATE_ERROR;. 
2efe0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2eff0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
2f000 28 20 67 6f 74 3d 3d 30 20 29 7b 0a 20 20 20 20  ( got==0 ){.    
2f010 6e 6f 48 64 72 20 3d 20 31 3b 0a 20 20 7d 65 6c  noHdr = 1;.  }el
2f020 73 65 20 69 66 28 20 67 6f 74 21 3d 31 30 30 0a  se if( got!=100.
2f030 20 20 20 20 20 20 20 20 20 7c 7c 20 6d 65 6d 63           || memc
2f040 6d 70 28 61 48 64 72 2c 20 53 51 4c 49 54 45 5f  mp(aHdr, SQLITE_
2f050 46 49 4c 45 5f 48 45 41 44 45 52 2c 20 53 51 4c  FILE_HEADER, SQL
2f060 49 54 45 5f 46 49 4c 45 5f 48 45 41 44 45 52 5f  ITE_FILE_HEADER_
2f070 4c 45 4e 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20  LEN)!=0.  ){.   
2f080 20 2a 70 4c 6f 63 6b 73 74 61 74 65 20 3d 20 53   *pLockstate = S
2f090 51 4c 49 54 45 5f 4c 4f 43 4b 53 54 41 54 45 5f  QLITE_LOCKSTATE_
2f0a0 4e 4f 54 41 44 42 3b 0a 20 20 20 20 72 65 74 75  NOTADB;.    retu
2f0b0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42  rn SQLITE_NOTADB
2f0c0 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 46 69  ;.  }.  .  /* Fi
2f0d0 72 73 74 20 63 68 65 63 6b 20 66 6f 72 20 61 6e  rst check for an
2f0e0 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20   exclusive lock 
2f0f0 2a 2f 0a 20 20 6e 4c 6f 63 6b 20 2b 3d 20 75 6e  */.  nLock += un
2f100 69 78 49 73 4c 6f 63 6b 65 64 28 70 69 64 2c 20  ixIsLocked(pid, 
2f110 68 44 62 2c 20 46 5f 52 44 4c 43 4b 2c 20 53 48  hDb, F_RDLCK, SH
2f120 41 52 45 44 5f 46 49 52 53 54 2c 20 53 48 41 52  ARED_FIRST, SHAR
2f130 45 44 5f 53 49 5a 45 2c 0a 20 20 20 20 20 20 20  ED_SIZE,.       
2f140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f150 20 22 45 58 43 4c 55 53 49 56 45 22 29 3b 0a 20   "EXCLUSIVE");. 
2f160 20 69 66 20 28 21 6e 6f 48 64 72 29 20 7b 0a 20   if (!noHdr) {. 
2f170 20 20 20 69 73 57 61 6c 20 3d 20 61 48 64 72 5b     isWal = aHdr[
2f180 31 38 5d 3d 3d 32 3b 0a 20 20 7d 0a 20 20 69 66  18]==2;.  }.  if
2f190 28 20 6e 4c 6f 63 6b 3d 3d 30 20 26 26 20 69 73  ( nLock==0 && is
2f1a0 57 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  Wal==0 ){.    /*
2f1b0 20 52 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 20 2a   Rollback mode *
2f1c0 2f 0a 20 20 20 20 6e 4c 6f 63 6b 20 2b 3d 20 75  /.    nLock += u
2f1d0 6e 69 78 49 73 4c 6f 63 6b 65 64 28 70 69 64 2c  nixIsLocked(pid,
2f1e0 20 68 44 62 2c 20 46 5f 57 52 4c 43 4b 2c 20 50   hDb, F_WRLCK, P
2f1f0 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 53 48 41  ENDING_BYTE, SHA
2f200 52 45 44 5f 53 49 5a 45 2b 32 2c 0a 20 20 20 20  RED_SIZE+2,.    
2f210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f220 20 20 20 20 20 20 22 50 45 4e 44 49 4e 47 7c 52        "PENDING|R
2f230 45 53 45 52 56 45 44 7c 53 48 41 52 45 44 22 29  ESERVED|SHARED")
2f240 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 4c 6f 63  ;.  }.  if( nLoc
2f250 6b 3d 3d 30 20 26 26 20 69 73 57 61 6c 21 3d 30  k==0 && isWal!=0
2f260 20 29 7b 0a 20 20 20 20 2f 2a 20 6c 6f 6f 6b 75   ){.    /* looku
2f270 70 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  p the file descr
2f280 69 70 74 6f 72 20 66 6f 72 20 74 68 65 20 73 68  iptor for the sh
2f290 61 72 65 64 20 6d 65 6d 6f 72 79 20 66 69 6c 65  ared memory file
2f2a0 20 69 66 20 77 65 20 68 61 76 65 20 69 74 20 6f   if we have it o
2f2b0 70 65 6e 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68  pen.    ** in th
2f2c0 69 73 20 70 72 6f 63 65 73 73 20 2a 2f 0a 20 20  is process */.  
2f2d0 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
2f2e0 28 29 3b 20 2f 2a 20 42 65 63 61 75 73 65 20 70  (); /* Because p
2f2f0 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 69 73 20  File->pInode is 
2f300 73 68 61 72 65 64 20 61 63 72 6f 73 73 20 74 68  shared across th
2f310 72 65 61 64 73 20 2a 2f 0a 20 20 20 20 75 6e 69  reads */.    uni
2f320 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f  xShmNode *pShmNo
2f330 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  de = pFile->pIno
2f340 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20 20  de->pShmNode;.  
2f350 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 20 29    if( pShmNode )
2f360 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
2f370 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d  mutex_enter(pShm
2f380 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  Node->mutex);.  
2f390 20 20 20 20 0a 20 20 20 20 20 20 68 53 68 6d 20      .      hShm 
2f3a0 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3b 0a 20  = pShmNode->h;. 
2f3b0 20 20 20 20 20 69 66 28 20 68 53 68 6d 20 3e 3d       if( hShm >=
2f3c0 20 30 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28   0){.        if(
2f3d0 20 75 6e 69 78 49 73 4c 6f 63 6b 65 64 28 70 69   unixIsLocked(pi
2f3e0 64 2c 20 68 53 68 6d 2c 20 46 5f 52 44 4c 43 4b  d, hShm, F_RDLCK
2f3f0 2c 20 53 48 4d 5f 52 45 43 4f 56 45 52 2c 20 31  , SHM_RECOVER, 1
2f400 2c 20 22 57 41 4c 2d 52 45 43 4f 56 45 52 59 22  , "WAL-RECOVERY"
2f410 29 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20  ) ||.           
2f420 75 6e 69 78 49 73 4c 6f 63 6b 65 64 28 70 69 64  unixIsLocked(pid
2f430 2c 20 68 53 68 6d 2c 20 46 5f 52 44 4c 43 4b 2c  , hShm, F_RDLCK,
2f440 20 53 48 4d 5f 57 52 49 54 45 2c 20 31 2c 20 22   SHM_WRITE, 1, "
2f450 57 41 4c 2d 57 52 49 54 45 22 29 20 29 7b 0a 20  WAL-WRITE") ){. 
2f460 20 20 20 20 20 20 20 20 20 6e 4c 6f 63 6b 20 3d           nLock =
2f470 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
2f480 20 20 20 20 7d 0a 20 20 20 20 20 20 0a 20 20 20      }.      .   
2f490 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
2f4a0 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d  _leave(pShmNode-
2f4b0 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 7d 20 0a  >mutex);.    } .
2f4c0 20 20 20 20 0a 20 20 20 20 69 66 28 20 68 53 68      .    if( hSh
2f4d0 6d 3c 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  m<0 ){.      /* 
2f4e0 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  the shared memor
2f4f0 79 20 66 69 6c 65 20 69 73 6e 27 74 20 6f 70 65  y file isn't ope
2f500 6e 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73  n in this proces
2f510 73 20 73 70 61 63 65 2c 20 6f 70 65 6e 20 6f 75  s space, open ou
2f520 72 0a 20 20 20 20 20 20 2a 2a 20 6f 77 6e 20 46  r.      ** own F
2f530 44 20 2a 2f 0a 20 20 20 20 20 20 63 68 61 72 20  D */.      char 
2f540 7a 53 68 6d 5b 4d 41 58 50 41 54 48 4c 45 4e 5d  zShm[MAXPATHLEN]
2f550 3b 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20 2f  ;.      .      /
2f560 2a 20 57 41 4c 20 6d 6f 64 65 20 2a 2f 0a 20 20  * WAL mode */.  
2f570 20 20 20 20 73 74 72 6c 63 70 79 28 7a 53 68 6d      strlcpy(zShm
2f580 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 2c 20  , pFile->zPath, 
2f590 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a 20 20 20  MAXPATHLEN);.   
2f5a0 20 20 20 73 74 72 6c 63 61 74 28 7a 53 68 6d 2c     strlcat(zShm,
2f5b0 20 22 2d 73 68 6d 22 2c 20 4d 41 58 50 41 54 48   "-shm", MAXPATH
2f5c0 4c 45 4e 29 3b 0a 20 20 20 20 20 20 68 53 68 6d  LEN);.      hShm
2f5d0 20 3d 20 6f 70 65 6e 28 7a 53 68 6d 2c 20 4f 5f   = open(zShm, O_
2f5e0 52 44 4f 4e 4c 59 2c 20 30 29 3b 0a 20 20 20 20  RDONLY, 0);.    
2f5f0 20 20 69 66 28 20 68 53 68 6d 3c 30 20 29 7b 0a    if( hShm<0 ){.
2f600 20 20 20 20 20 20 20 20 2a 70 4c 6f 63 6b 73 74          *pLockst
2f610 61 74 65 20 3d 20 53 51 4c 49 54 45 5f 4c 4f 43  ate = SQLITE_LOC
2f620 4b 53 54 41 54 45 5f 4f 46 46 3b 0a 20 20 20 20  KSTATE_OFF;.    
2f630 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74      unixLeaveMut
2f640 65 78 28 29 3b 0a 20 20 20 20 20 20 20 20 72 65  ex();.        re
2f650 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2f660 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
2f670 28 20 75 6e 69 78 49 73 4c 6f 63 6b 65 64 28 70  ( unixIsLocked(p
2f680 69 64 2c 20 68 53 68 6d 2c 20 46 5f 52 44 4c 43  id, hShm, F_RDLC
2f690 4b 2c 20 53 48 4d 5f 52 45 43 4f 56 45 52 2c 20  K, SHM_RECOVER, 
2f6a0 31 2c 20 22 57 41 4c 2d 52 45 43 4f 56 45 52 59  1, "WAL-RECOVERY
2f6b0 22 29 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 75  ") ||.         u
2f6c0 6e 69 78 49 73 4c 6f 63 6b 65 64 28 70 69 64 2c  nixIsLocked(pid,
2f6d0 20 68 53 68 6d 2c 20 46 5f 52 44 4c 43 4b 2c 20   hShm, F_RDLCK, 
2f6e0 53 48 4d 5f 57 52 49 54 45 2c 20 31 2c 20 22 57  SHM_WRITE, 1, "W
2f6f0 41 4c 2d 57 52 49 54 45 22 29 20 29 7b 0a 20 20  AL-WRITE") ){.  
2f700 20 20 20 20 20 20 6e 4c 6f 63 6b 20 3d 20 31 3b        nLock = 1;
2f710 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63  .      }.      c
2f720 6c 6f 73 65 28 68 53 68 6d 29 3b 0a 20 20 20 20  lose(hShm);.    
2f730 7d 0a 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d  }.    unixLeaveM
2f740 75 74 65 78 28 29 3b 0a 20 20 7d 0a 20 20 69 66  utex();.  }.  if
2f750 28 20 6e 4c 6f 63 6b 3e 30 20 29 7b 0a 20 20 20  ( nLock>0 ){.   
2f760 20 2a 70 4c 6f 63 6b 73 74 61 74 65 20 3d 20 53   *pLockstate = S
2f770 51 4c 49 54 45 5f 4c 4f 43 4b 53 54 41 54 45 5f  QLITE_LOCKSTATE_
2f780 4f 4e 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20  ON;.  } else {. 
2f790 20 20 20 2a 70 4c 6f 63 6b 73 74 61 74 65 20 3d     *pLockstate =
2f7a0 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 53 54 41 54   SQLITE_LOCKSTAT
2f7b0 45 5f 4f 46 46 3b 0a 20 20 7d 0a 20 20 72 65 74  E_OFF;.  }.  ret
2f7c0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
2f7d0 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 28 53 51 4c  ..#endif /* (SQL
2f7e0 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 50 4c 45  ITE_ENABLE_APPLE
2f7f0 5f 53 50 49 3e 30 29 20 26 26 20 64 65 66 69 6e  _SPI>0) && defin
2f800 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 2a 2f  ed(__APPLE__) */
2f810 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  ..#if SQLITE_MAX
2f820 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 2f 2a 0a  _MMAP_SIZE>0./*.
2f830 2a 2a 20 49 66 20 69 74 20 69 73 20 63 75 72 72  ** If it is curr
2f840 65 6e 74 6c 79 20 6d 65 6d 6f 72 79 20 6d 61 70  ently memory map
2f850 70 65 64 2c 20 75 6e 6d 61 70 20 66 69 6c 65 20  ped, unmap file 
2f860 70 46 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  pFd..*/.static v
2f870 6f 69 64 20 75 6e 69 78 55 6e 6d 61 70 66 69 6c  oid unixUnmapfil
2f880 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 64 29  e(unixFile *pFd)
2f890 7b 0a 20 20 61 73 73 65 72 74 28 20 70 46 64 2d  {.  assert( pFd-
2f8a0 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30 20 29 3b  >nFetchOut==0 );
2f8b0 0a 20 20 69 66 28 20 70 46 64 2d 3e 70 4d 61 70  .  if( pFd->pMap
2f8c0 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 6f 73  Region ){.    os
2f8d0 4d 75 6e 6d 61 70 28 70 46 64 2d 3e 70 4d 61 70  Munmap(pFd->pMap
2f8e0 52 65 67 69 6f 6e 2c 20 70 46 64 2d 3e 6d 6d 61  Region, pFd->mma
2f8f0 70 53 69 7a 65 41 63 74 75 61 6c 29 3b 0a 20 20  pSizeActual);.  
2f900 20 20 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f    pFd->pMapRegio
2f910 6e 20 3d 20 30 3b 0a 20 20 20 20 70 46 64 2d 3e  n = 0;.    pFd->
2f920 6d 6d 61 70 53 69 7a 65 20 3d 20 30 3b 0a 20 20  mmapSize = 0;.  
2f930 20 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 41    pFd->mmapSizeA
2f940 63 74 75 61 6c 20 3d 20 30 3b 0a 20 20 7d 0a 7d  ctual = 0;.  }.}
2f950 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20  ../*.** Attempt 
2f960 74 6f 20 73 65 74 20 74 68 65 20 73 69 7a 65 20  to set the size 
2f970 6f 66 20 74 68 65 20 6d 65 6d 6f 72 79 20 6d 61  of the memory ma
2f980 70 70 69 6e 67 20 6d 61 69 6e 74 61 69 6e 65 64  pping maintained
2f990 20 62 79 20 66 69 6c 65 20 0a 2a 2a 20 64 65 73   by file .** des
2f9a0 63 72 69 70 74 6f 72 20 70 46 64 20 74 6f 20 6e  criptor pFd to n
2f9b0 4e 65 77 20 62 79 74 65 73 2e 20 41 6e 79 20 65  New bytes. Any e
2f9c0 78 69 73 74 69 6e 67 20 6d 61 70 70 69 6e 67 20  xisting mapping 
2f9d0 69 73 20 64 69 73 63 61 72 64 65 64 2e 0a 2a 2a  is discarded..**
2f9e0 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75  .** If successfu
2f9f0 6c 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  l, this function
2fa00 20 73 65 74 73 20 74 68 65 20 66 6f 6c 6c 6f 77   sets the follow
2fa10 69 6e 67 20 76 61 72 69 61 62 6c 65 73 3a 0a 2a  ing variables:.*
2fa20 2a 0a 2a 2a 20 20 20 20 20 20 20 75 6e 69 78 46  *.**       unixF
2fa30 69 6c 65 2e 70 4d 61 70 52 65 67 69 6f 6e 0a 2a  ile.pMapRegion.*
2fa40 2a 20 20 20 20 20 20 20 75 6e 69 78 46 69 6c 65  *       unixFile
2fa50 2e 6d 6d 61 70 53 69 7a 65 0a 2a 2a 20 20 20 20  .mmapSize.**    
2fa60 20 20 20 75 6e 69 78 46 69 6c 65 2e 6d 6d 61 70     unixFile.mmap
2fa70 53 69 7a 65 41 63 74 75 61 6c 0a 2a 2a 0a 2a 2a  SizeActual.**.**
2fa80 20 49 66 20 75 6e 73 75 63 63 65 73 73 66 75 6c   If unsuccessful
2fa90 2c 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  , an error messa
2faa0 67 65 20 69 73 20 6c 6f 67 67 65 64 20 76 69 61  ge is logged via
2fab0 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 29 20 61   sqlite3_log() a
2fac0 6e 64 0a 2a 2a 20 74 68 65 20 74 68 72 65 65 20  nd.** the three 
2fad0 76 61 72 69 61 62 6c 65 73 20 61 62 6f 76 65 20  variables above 
2fae0 61 72 65 20 7a 65 72 6f 65 64 2e 20 49 6e 20 74  are zeroed. In t
2faf0 68 69 73 20 63 61 73 65 20 53 51 4c 69 74 65 20  his case SQLite 
2fb00 73 68 6f 75 6c 64 0a 2a 2a 20 63 6f 6e 74 69 6e  should.** contin
2fb10 75 65 20 61 63 63 65 73 73 69 6e 67 20 74 68 65  ue accessing the
2fb20 20 64 61 74 61 62 61 73 65 20 75 73 69 6e 67 20   database using 
2fb30 74 68 65 20 78 52 65 61 64 28 29 20 61 6e 64 20  the xRead() and 
2fb40 78 57 72 69 74 65 28 29 0a 2a 2a 20 6d 65 74 68  xWrite().** meth
2fb50 6f 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ods..*/.static v
2fb60 6f 69 64 20 75 6e 69 78 52 65 6d 61 70 66 69 6c  oid unixRemapfil
2fb70 65 28 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  e(.  unixFile *p
2fb80 46 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Fd,             
2fb90 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73       /* File des
2fba0 63 72 69 70 74 6f 72 20 6f 62 6a 65 63 74 20 2a  criptor object *
2fbb0 2f 0a 20 20 69 36 34 20 6e 4e 65 77 20 20 20 20  /.  i64 nNew    
2fbc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fbd0 20 20 20 20 2f 2a 20 52 65 71 75 69 72 65 64 20      /* Required 
2fbe0 6d 61 70 70 69 6e 67 20 73 69 7a 65 20 2a 2f 0a  mapping size */.
2fbf0 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
2fc00 2a 7a 45 72 72 20 3d 20 22 6d 6d 61 70 22 3b 0a  *zErr = "mmap";.
2fc10 20 20 69 6e 74 20 68 20 3d 20 70 46 64 2d 3e 68    int h = pFd->h
2fc20 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2fc30 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64         /* File d
2fc40 65 73 63 72 69 70 74 6f 72 20 6f 70 65 6e 20 6f  escriptor open o
2fc50 6e 20 64 62 20 66 69 6c 65 20 2a 2f 0a 20 20 75  n db file */.  u
2fc60 38 20 2a 70 4f 72 69 67 20 3d 20 28 75 38 20 2a  8 *pOrig = (u8 *
2fc70 29 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e  )pFd->pMapRegion
2fc80 3b 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74  ;   /* Pointer t
2fc90 6f 20 63 75 72 72 65 6e 74 20 66 69 6c 65 20 6d  o current file m
2fca0 61 70 70 69 6e 67 20 2a 2f 0a 20 20 69 36 34 20  apping */.  i64 
2fcb0 6e 4f 72 69 67 20 3d 20 70 46 64 2d 3e 6d 6d 61  nOrig = pFd->mma
2fcc0 70 53 69 7a 65 41 63 74 75 61 6c 3b 20 20 20 20  pSizeActual;    
2fcd0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 70 4f 72 69   /* Size of pOri
2fce0 67 20 72 65 67 69 6f 6e 20 69 6e 20 62 79 74 65  g region in byte
2fcf0 73 20 2a 2f 0a 20 20 75 38 20 2a 70 4e 65 77 20  s */.  u8 *pNew 
2fd00 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
2fd10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
2fd20 6f 63 61 74 69 6f 6e 20 6f 66 20 6e 65 77 20 6d  ocation of new m
2fd30 61 70 70 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20  apping */.  int 
2fd40 66 6c 61 67 73 20 3d 20 50 52 4f 54 5f 52 45 41  flags = PROT_REA
2fd50 44 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  D;              
2fd60 20 2f 2a 20 46 6c 61 67 73 20 74 6f 20 70 61 73   /* Flags to pas
2fd70 73 20 74 6f 20 6d 6d 61 70 28 29 20 2a 2f 0a 0a  s to mmap() */..
2fd80 20 20 61 73 73 65 72 74 28 20 70 46 64 2d 3e 6e    assert( pFd->n
2fd90 46 65 74 63 68 4f 75 74 3d 3d 30 20 29 3b 0a 20  FetchOut==0 );. 
2fda0 20 61 73 73 65 72 74 28 20 6e 4e 65 77 3e 70 46   assert( nNew>pF
2fdb0 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 3b 0a 20  d->mmapSize );. 
2fdc0 20 61 73 73 65 72 74 28 20 6e 4e 65 77 3c 3d 70   assert( nNew<=p
2fdd0 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20  Fd->mmapSizeMax 
2fde0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4e 65  );.  assert( nNe
2fdf0 77 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  w>0 );.  assert(
2fe00 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 41 63   pFd->mmapSizeAc
2fe10 74 75 61 6c 3e 3d 70 46 64 2d 3e 6d 6d 61 70 53  tual>=pFd->mmapS
2fe20 69 7a 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ize );.  assert(
2fe30 20 4d 41 50 5f 46 41 49 4c 45 44 21 3d 30 20 29   MAP_FAILED!=0 )
2fe40 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
2fe50 5f 4d 4d 41 50 5f 52 45 41 44 57 52 49 54 45 0a  _MMAP_READWRITE.
2fe60 20 20 69 66 28 20 28 70 46 64 2d 3e 63 74 72 6c    if( (pFd->ctrl
2fe70 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45  Flags & UNIXFILE
2fe80 5f 52 44 4f 4e 4c 59 29 3d 3d 30 20 29 20 66 6c  _RDONLY)==0 ) fl
2fe90 61 67 73 20 7c 3d 20 50 52 4f 54 5f 57 52 49 54  ags |= PROT_WRIT
2fea0 45 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28  E;.#endif..  if(
2feb0 20 70 4f 72 69 67 20 29 7b 0a 23 69 66 20 48 41   pOrig ){.#if HA
2fec0 56 45 5f 4d 52 45 4d 41 50 0a 20 20 20 20 69 36  VE_MREMAP.    i6
2fed0 34 20 6e 52 65 75 73 65 20 3d 20 70 46 64 2d 3e  4 nReuse = pFd->
2fee0 6d 6d 61 70 53 69 7a 65 3b 0a 23 65 6c 73 65 0a  mmapSize;.#else.
2fef0 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 73 7a      const int sz
2ff00 53 79 73 70 61 67 65 20 3d 20 6f 73 47 65 74 70  Syspage = osGetp
2ff10 61 67 65 73 69 7a 65 28 29 3b 0a 20 20 20 20 69  agesize();.    i
2ff20 36 34 20 6e 52 65 75 73 65 20 3d 20 28 70 46 64  64 nReuse = (pFd
2ff30 2d 3e 6d 6d 61 70 53 69 7a 65 20 26 20 7e 28 73  ->mmapSize & ~(s
2ff40 7a 53 79 73 70 61 67 65 2d 31 29 29 3b 0a 23 65  zSyspage-1));.#e
2ff50 6e 64 69 66 0a 20 20 20 20 75 38 20 2a 70 52 65  ndif.    u8 *pRe
2ff60 71 20 3d 20 26 70 4f 72 69 67 5b 6e 52 65 75 73  q = &pOrig[nReus
2ff70 65 5d 3b 0a 0a 20 20 20 20 2f 2a 20 55 6e 6d 61  e];..    /* Unma
2ff80 70 20 61 6e 79 20 70 61 67 65 73 20 6f 66 20 74  p any pages of t
2ff90 68 65 20 65 78 69 73 74 69 6e 67 20 6d 61 70 70  he existing mapp
2ffa0 69 6e 67 20 74 68 61 74 20 63 61 6e 6e 6f 74 20  ing that cannot 
2ffb0 62 65 20 72 65 75 73 65 64 2e 20 2a 2f 0a 20 20  be reused. */.  
2ffc0 20 20 69 66 28 20 6e 52 65 75 73 65 21 3d 6e 4f    if( nReuse!=nO
2ffd0 72 69 67 20 29 7b 0a 20 20 20 20 20 20 6f 73 4d  rig ){.      osM
2ffe0 75 6e 6d 61 70 28 70 52 65 71 2c 20 6e 4f 72 69  unmap(pReq, nOri
2fff0 67 2d 6e 52 65 75 73 65 29 3b 0a 20 20 20 20 7d  g-nReuse);.    }
30000 0a 0a 23 69 66 20 48 41 56 45 5f 4d 52 45 4d 41  ..#if HAVE_MREMA
30010 50 0a 20 20 20 20 70 4e 65 77 20 3d 20 6f 73 4d  P.    pNew = osM
30020 72 65 6d 61 70 28 70 4f 72 69 67 2c 20 6e 52 65  remap(pOrig, nRe
30030 75 73 65 2c 20 6e 4e 65 77 2c 20 4d 52 45 4d 41  use, nNew, MREMA
30040 50 5f 4d 41 59 4d 4f 56 45 29 3b 0a 20 20 20 20  P_MAYMOVE);.    
30050 7a 45 72 72 20 3d 20 22 6d 72 65 6d 61 70 22 3b  zErr = "mremap";
30060 0a 23 65 6c 73 65 0a 20 20 20 20 70 4e 65 77 20  .#else.    pNew 
30070 3d 20 6f 73 4d 6d 61 70 28 70 52 65 71 2c 20 6e  = osMmap(pReq, n
30080 4e 65 77 2d 6e 52 65 75 73 65 2c 20 66 6c 61 67  New-nReuse, flag
30090 73 2c 20 4d 41 50 5f 53 48 41 52 45 44 2c 20 68  s, MAP_SHARED, h
300a0 2c 20 6e 52 65 75 73 65 29 3b 0a 20 20 20 20 69  , nReuse);.    i
300b0 66 28 20 70 4e 65 77 21 3d 4d 41 50 5f 46 41 49  f( pNew!=MAP_FAI
300c0 4c 45 44 20 29 7b 0a 20 20 20 20 20 20 69 66 28  LED ){.      if(
300d0 20 70 4e 65 77 21 3d 70 52 65 71 20 29 7b 0a 20   pNew!=pReq ){. 
300e0 20 20 20 20 20 20 20 6f 73 4d 75 6e 6d 61 70 28         osMunmap(
300f0 70 4e 65 77 2c 20 6e 4e 65 77 20 2d 20 6e 52 65  pNew, nNew - nRe
30100 75 73 65 29 3b 0a 20 20 20 20 20 20 20 20 70 4e  use);.        pN
30110 65 77 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65  ew = 0;.      }e
30120 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 4e 65  lse{.        pNe
30130 77 20 3d 20 70 4f 72 69 67 3b 0a 20 20 20 20 20  w = pOrig;.     
30140 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a   }.    }.#endif.
30150 0a 20 20 20 20 2f 2a 20 54 68 65 20 61 74 74 65  .    /* The atte
30160 6d 70 74 20 74 6f 20 65 78 74 65 6e 64 20 74 68  mpt to extend th
30170 65 20 65 78 69 73 74 69 6e 67 20 6d 61 70 70 69  e existing mappi
30180 6e 67 20 66 61 69 6c 65 64 2e 20 46 72 65 65 20  ng failed. Free 
30190 69 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  it. */.    if( p
301a0 4e 65 77 3d 3d 4d 41 50 5f 46 41 49 4c 45 44 20  New==MAP_FAILED 
301b0 7c 7c 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  || pNew==0 ){.  
301c0 20 20 20 20 6f 73 4d 75 6e 6d 61 70 28 70 4f 72      osMunmap(pOr
301d0 69 67 2c 20 6e 52 65 75 73 65 29 3b 0a 20 20 20  ig, nReuse);.   
301e0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
301f0 70 4e 65 77 20 69 73 20 73 74 69 6c 6c 20 4e 55  pNew is still NU
30200 4c 4c 2c 20 74 72 79 20 74 6f 20 63 72 65 61 74  LL, try to creat
30210 65 20 61 6e 20 65 6e 74 69 72 65 6c 79 20 6e 65  e an entirely ne
30220 77 20 6d 61 70 70 69 6e 67 2e 20 2a 2f 0a 20 20  w mapping. */.  
30230 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20  if( pNew==0 ){. 
30240 20 20 20 70 4e 65 77 20 3d 20 6f 73 4d 6d 61 70     pNew = osMmap
30250 28 30 2c 20 6e 4e 65 77 2c 20 66 6c 61 67 73 2c  (0, nNew, flags,
30260 20 4d 41 50 5f 53 48 41 52 45 44 2c 20 68 2c 20   MAP_SHARED, h, 
30270 30 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  0);.  }..  if( p
30280 4e 65 77 3d 3d 4d 41 50 5f 46 41 49 4c 45 44 20  New==MAP_FAILED 
30290 29 7b 0a 20 20 20 20 70 4e 65 77 20 3d 20 30 3b  ){.    pNew = 0;
302a0 0a 20 20 20 20 6e 4e 65 77 20 3d 20 30 3b 0a 20  .    nNew = 0;. 
302b0 20 20 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28     unixLogError(
302c0 53 51 4c 49 54 45 5f 4f 4b 2c 20 7a 45 72 72 2c  SQLITE_OK, zErr,
302d0 20 70 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 0a 20   pFd->zPath);.. 
302e0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6d 6d 61     /* If the mma
302f0 70 28 29 20 61 62 6f 76 65 20 66 61 69 6c 65 64  p() above failed
30300 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20 61 6c  , assume that al
30310 6c 20 73 75 62 73 65 71 75 65 6e 74 20 6d 6d 61  l subsequent mma
30320 70 28 29 20 63 61 6c 6c 73 0a 20 20 20 20 2a 2a  p() calls.    **
30330 20 77 69 6c 6c 20 70 72 6f 62 61 62 6c 79 20 66   will probably f
30340 61 69 6c 20 74 6f 6f 2e 20 46 61 6c 6c 20 62 61  ail too. Fall ba
30350 63 6b 20 74 6f 20 75 73 69 6e 67 20 78 52 65 61  ck to using xRea
30360 64 2f 78 57 72 69 74 65 20 65 78 63 6c 75 73 69  d/xWrite exclusi
30370 76 65 6c 79 0a 20 20 20 20 2a 2a 20 69 6e 20 74  vely.    ** in t
30380 68 69 73 20 63 61 73 65 2e 20 20 2a 2f 0a 20 20  his case.  */.  
30390 20 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d    pFd->mmapSizeM
303a0 61 78 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 46  ax = 0;.  }.  pF
303b0 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20 3d 20  d->pMapRegion = 
303c0 28 76 6f 69 64 20 2a 29 70 4e 65 77 3b 0a 20 20  (void *)pNew;.  
303d0 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d 20  pFd->mmapSize = 
303e0 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74  pFd->mmapSizeAct
303f0 75 61 6c 20 3d 20 6e 4e 65 77 3b 0a 7d 0a 0a 2f  ual = nNew;.}../
30400 2a 0a 2a 2a 20 4d 65 6d 6f 72 79 20 6d 61 70 20  *.** Memory map 
30410 6f 72 20 72 65 6d 61 70 20 74 68 65 20 66 69 6c  or remap the fil
30420 65 20 6f 70 65 6e 65 64 20 62 79 20 66 69 6c 65  e opened by file
30430 2d 64 65 73 63 72 69 70 74 6f 72 20 70 46 64 20  -descriptor pFd 
30440 28 69 66 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20  (if the file.** 
30450 69 73 20 61 6c 72 65 61 64 79 20 6d 61 70 70 65  is already mappe
30460 64 2c 20 74 68 65 20 65 78 69 73 74 69 6e 67 20  d, the existing 
30470 6d 61 70 70 69 6e 67 20 69 73 20 72 65 70 6c 61  mapping is repla
30480 63 65 64 20 62 79 20 74 68 65 20 6e 65 77 29 2e  ced by the new).
30490 20 4f 72 2c 20 69 66 20 0a 2a 2a 20 74 68 65 72   Or, if .** ther
304a0 65 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  e already exists
304b0 20 61 20 6d 61 70 70 69 6e 67 20 66 6f 72 20 74   a mapping for t
304c0 68 69 73 20 66 69 6c 65 2c 20 61 6e 64 20 74 68  his file, and th
304d0 65 72 65 20 61 72 65 20 73 74 69 6c 6c 20 0a 2a  ere are still .*
304e0 2a 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 78 46  * outstanding xF
304f0 65 74 63 68 28 29 20 72 65 66 65 72 65 6e 63 65  etch() reference
30500 73 20 74 6f 20 69 74 2c 20 74 68 69 73 20 66 75  s to it, this fu
30510 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
30520 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61  p..**.** If para
30530 6d 65 74 65 72 20 6e 42 79 74 65 20 69 73 20 6e  meter nByte is n
30540 6f 6e 2d 6e 65 67 61 74 69 76 65 2c 20 74 68 65  on-negative, the
30550 6e 20 69 74 20 69 73 20 74 68 65 20 72 65 71 75  n it is the requ
30560 65 73 74 65 64 20 73 69 7a 65 20 6f 66 20 0a 2a  ested size of .*
30570 2a 20 74 68 65 20 6d 61 70 70 69 6e 67 20 74 6f  * the mapping to
30580 20 63 72 65 61 74 65 2e 20 4f 74 68 65 72 77 69   create. Otherwi
30590 73 65 2c 20 69 66 20 6e 42 79 74 65 20 69 73 20  se, if nByte is 
305a0 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20  less than zero, 
305b0 74 68 65 6e 20 74 68 65 20 0a 2a 2a 20 72 65 71  then the .** req
305c0 75 65 73 74 65 64 20 73 69 7a 65 20 69 73 20 74  uested size is t
305d0 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66  he size of the f
305e0 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 54 68 65  ile on disk. The
305f0 20 61 63 74 75 61 6c 20 73 69 7a 65 20 6f 66 20   actual size of 
30600 74 68 65 0a 2a 2a 20 63 72 65 61 74 65 64 20 6d  the.** created m
30610 61 70 70 69 6e 67 20 69 73 20 65 69 74 68 65 72  apping is either
30620 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 73   the requested s
30630 69 7a 65 20 6f 72 20 74 68 65 20 76 61 6c 75 65  ize or the value
30640 20 63 6f 6e 66 69 67 75 72 65 64 20 0a 2a 2a 20   configured .** 
30650 75 73 69 6e 67 20 53 51 4c 49 54 45 5f 46 43 4e  using SQLITE_FCN
30660 54 4c 5f 4d 4d 41 50 5f 4c 49 4d 49 54 2c 20 77  TL_MMAP_LIMIT, w
30670 68 69 63 68 65 76 65 72 20 69 73 20 73 6d 61 6c  hichever is smal
30680 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54  ler..**.** SQLIT
30690 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
306a0 20 69 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63   if no error occ
306b0 75 72 73 20 28 65 76 65 6e 20 69 66 20 74 68 65  urs (even if the
306c0 20 6d 61 70 70 69 6e 67 20 69 73 20 6e 6f 74 0a   mapping is not.
306d0 2a 2a 20 72 65 63 72 65 61 74 65 64 20 61 73 20  ** recreated as 
306e0 61 20 72 65 73 75 6c 74 20 6f 66 20 6f 75 74 73  a result of outs
306f0 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63  tanding referenc
30700 65 73 29 20 6f 72 20 61 6e 20 53 51 4c 69 74 65  es) or an SQLite
30710 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 6f   error.** code o
30720 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61  therwise..*/.sta
30730 74 69 63 20 69 6e 74 20 75 6e 69 78 4d 61 70 66  tic int unixMapf
30740 69 6c 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46  ile(unixFile *pF
30750 64 2c 20 69 36 34 20 6e 42 79 74 65 29 7b 0a 20  d, i64 nByte){. 
30760 20 69 36 34 20 6e 4d 61 70 20 3d 20 6e 42 79 74   i64 nMap = nByt
30770 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  e;.  int rc;..  
30780 61 73 73 65 72 74 28 20 6e 4d 61 70 3e 3d 30 20  assert( nMap>=0 
30790 7c 7c 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75  || pFd->nFetchOu
307a0 74 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 46  t==0 );.  if( pF
307b0 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3e 30 20 29  d->nFetchOut>0 )
307c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
307d0 4b 3b 0a 0a 20 20 69 66 28 20 6e 4d 61 70 3c 30  K;..  if( nMap<0
307e0 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73   ){.    struct s
307f0 74 61 74 20 73 74 61 74 62 75 66 3b 20 20 20 20  tat statbuf;    
30800 20 20 20 20 20 20 2f 2a 20 4c 6f 77 2d 6c 65 76        /* Low-lev
30810 65 6c 20 66 69 6c 65 20 69 6e 66 6f 72 6d 61 74  el file informat
30820 69 6f 6e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  ion */.    rc = 
30830 6f 73 46 73 74 61 74 28 70 46 64 2d 3e 68 2c 20  osFstat(pFd->h, 
30840 26 73 74 61 74 62 75 66 29 3b 0a 20 20 20 20 69  &statbuf);.    i
30850 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
30860 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
30870 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53   SQLITE_IOERR_FS
30880 54 41 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  TAT;.    }.    n
30890 4d 61 70 20 3d 20 73 74 61 74 62 75 66 2e 73 74  Map = statbuf.st
308a0 5f 73 69 7a 65 3b 0a 20 20 7d 0a 20 20 69 66 28  _size;.  }.  if(
308b0 20 6e 4d 61 70 3e 70 46 64 2d 3e 6d 6d 61 70 53   nMap>pFd->mmapS
308c0 69 7a 65 4d 61 78 20 29 7b 0a 20 20 20 20 6e 4d  izeMax ){.    nM
308d0 61 70 20 3d 20 70 46 64 2d 3e 6d 6d 61 70 53 69  ap = pFd->mmapSi
308e0 7a 65 4d 61 78 3b 0a 20 20 7d 0a 0a 20 20 69 66  zeMax;.  }..  if
308f0 28 20 6e 4d 61 70 21 3d 70 46 64 2d 3e 6d 6d 61  ( nMap!=pFd->mma
30900 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 69 66 28  pSize ){.    if(
30910 20 6e 4d 61 70 3e 30 20 29 7b 0a 20 20 20 20 20   nMap>0 ){.     
30920 20 75 6e 69 78 52 65 6d 61 70 66 69 6c 65 28 70   unixRemapfile(p
30930 46 64 2c 20 6e 4d 61 70 29 3b 0a 20 20 20 20 7d  Fd, nMap);.    }
30940 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 6e 69 78  else{.      unix
30950 55 6e 6d 61 70 66 69 6c 65 28 70 46 64 29 3b 0a  Unmapfile(pFd);.
30960 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
30970 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
30980 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
30990 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
309a0 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70  0 */../*.** If p
309b0 6f 73 73 69 62 6c 65 2c 20 72 65 74 75 72 6e 20  ossible, return 
309c0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 6d  a pointer to a m
309d0 61 70 70 69 6e 67 20 6f 66 20 66 69 6c 65 20 66  apping of file f
309e0 64 20 73 74 61 72 74 69 6e 67 20 61 74 20 6f 66  d starting at of
309f0 66 73 65 74 0a 2a 2a 20 69 4f 66 66 2e 20 54 68  fset.** iOff. Th
30a00 65 20 6d 61 70 70 69 6e 67 20 6d 75 73 74 20 62  e mapping must b
30a10 65 20 76 61 6c 69 64 20 66 6f 72 20 61 74 20 6c  e valid for at l
30a20 65 61 73 74 20 6e 41 6d 74 20 62 79 74 65 73 2e  east nAmt bytes.
30a30 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 68 20 61  .**.** If such a
30a40 20 70 6f 69 6e 74 65 72 20 63 61 6e 20 62 65 20   pointer can be 
30a50 6f 62 74 61 69 6e 65 64 2c 20 73 74 6f 72 65 20  obtained, store 
30a60 69 74 20 69 6e 20 2a 70 70 20 61 6e 64 20 72 65  it in *pp and re
30a70 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  turn SQLITE_OK..
30a80 2a 2a 20 4f 72 2c 20 69 66 20 6f 6e 65 20 63 61  ** Or, if one ca
30a90 6e 6e 6f 74 20 62 75 74 20 6e 6f 20 65 72 72 6f  nnot but no erro
30aa0 72 20 6f 63 63 75 72 73 2c 20 73 65 74 20 2a 70  r occurs, set *p
30ab0 70 20 74 6f 20 30 20 61 6e 64 20 72 65 74 75 72  p to 0 and retur
30ac0 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20  n SQLITE_OK..** 
30ad0 46 69 6e 61 6c 6c 79 2c 20 69 66 20 61 6e 20 65  Finally, if an e
30ae0 72 72 6f 72 20 64 6f 65 73 20 6f 63 63 75 72 2c  rror does occur,
30af0 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74   return an SQLit
30b00 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 54 68  e error code. Th
30b10 65 20 66 69 6e 61 6c 0a 2a 2a 20 76 61 6c 75 65  e final.** value
30b20 20 6f 66 20 2a 70 70 20 69 73 20 75 6e 64 65 66   of *pp is undef
30b30 69 6e 65 64 20 69 6e 20 74 68 69 73 20 63 61 73  ined in this cas
30b40 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73  e..**.** If this
30b50 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 72   function does r
30b60 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 2c  eturn a pointer,
30b70 20 74 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74   the caller must
30b80 20 65 76 65 6e 74 75 61 6c 6c 79 20 0a 2a 2a 20   eventually .** 
30b90 72 65 6c 65 61 73 65 20 74 68 65 20 72 65 66 65  release the refe
30ba0 72 65 6e 63 65 20 62 79 20 63 61 6c 6c 69 6e 67  rence by calling
30bb0 20 75 6e 69 78 55 6e 66 65 74 63 68 28 29 2e 0a   unixUnfetch()..
30bc0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
30bd0 69 78 46 65 74 63 68 28 73 71 6c 69 74 65 33 5f  ixFetch(sqlite3_
30be0 66 69 6c 65 20 2a 66 64 2c 20 69 36 34 20 69 4f  file *fd, i64 iO
30bf0 66 66 2c 20 69 6e 74 20 6e 41 6d 74 2c 20 76 6f  ff, int nAmt, vo
30c00 69 64 20 2a 2a 70 70 29 7b 0a 23 69 66 20 53 51  id **pp){.#if SQ
30c10 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
30c20 5a 45 3e 30 0a 20 20 75 6e 69 78 46 69 6c 65 20  ZE>0.  unixFile 
30c30 2a 70 46 64 20 3d 20 28 75 6e 69 78 46 69 6c 65  *pFd = (unixFile
30c40 20 2a 29 66 64 3b 20 20 20 2f 2a 20 54 68 65 20   *)fd;   /* The 
30c50 75 6e 64 65 72 6c 79 69 6e 67 20 64 61 74 61 62  underlying datab
30c60 61 73 65 20 66 69 6c 65 20 2a 2f 0a 23 65 6e 64  ase file */.#end
30c70 69 66 0a 20 20 2a 70 70 20 3d 20 30 3b 0a 0a 23  if.  *pp = 0;..#
30c80 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  if SQLITE_MAX_MM
30c90 41 50 5f 53 49 5a 45 3e 30 0a 20 20 69 66 28 20  AP_SIZE>0.  if( 
30ca0 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78  pFd->mmapSizeMax
30cb0 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 46  >0 ){.    if( pF
30cc0 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 3d 3d 30  d->pMapRegion==0
30cd0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63   ){.      int rc
30ce0 20 3d 20 75 6e 69 78 4d 61 70 66 69 6c 65 28 70   = unixMapfile(p
30cf0 46 64 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 69  Fd, -1);.      i
30d00 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
30d10 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
30d20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 46 64 2d    }.    if( pFd-
30d30 3e 6d 6d 61 70 53 69 7a 65 20 3e 3d 20 69 4f 66  >mmapSize >= iOf
30d40 66 2b 6e 41 6d 74 20 29 7b 0a 20 20 20 20 20 20  f+nAmt ){.      
30d50 2a 70 70 20 3d 20 26 28 28 75 38 20 2a 29 70 46  *pp = &((u8 *)pF
30d60 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 5b 69  d->pMapRegion)[i
30d70 4f 66 66 5d 3b 0a 20 20 20 20 20 20 70 46 64 2d  Off];.      pFd-
30d80 3e 6e 46 65 74 63 68 4f 75 74 2b 2b 3b 0a 20 20  >nFetchOut++;.  
30d90 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20    }.  }.#endif. 
30da0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
30db0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74  K;.}../*.** If t
30dc0 68 65 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e  he third argumen
30dd0 74 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74  t is non-NULL, t
30de0 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
30df0 6e 20 72 65 6c 65 61 73 65 73 20 61 20 0a 2a 2a  n releases a .**
30e00 20 72 65 66 65 72 65 6e 63 65 20 6f 62 74 61 69   reference obtai
30e10 6e 65 64 20 62 79 20 61 6e 20 65 61 72 6c 69 65  ned by an earlie
30e20 72 20 63 61 6c 6c 20 74 6f 20 75 6e 69 78 46 65  r call to unixFe
30e30 74 63 68 28 29 2e 20 54 68 65 20 73 65 63 6f 6e  tch(). The secon
30e40 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 70 61  d.** argument pa
30e50 73 73 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e  ssed to this fun
30e60 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 74 68  ction must be th
30e70 65 20 73 61 6d 65 20 61 73 20 74 68 65 20 63 6f  e same as the co
30e80 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 61  rresponding.** a
30e90 72 67 75 6d 65 6e 74 20 74 68 61 74 20 77 61 73  rgument that was
30ea0 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 75   passed to the u
30eb0 6e 69 78 46 65 74 63 68 28 29 20 69 6e 76 6f 63  nixFetch() invoc
30ec0 61 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 4f 72  ation. .**.** Or
30ed0 2c 20 69 66 20 74 68 65 20 74 68 69 72 64 20 61  , if the third a
30ee0 72 67 75 6d 65 6e 74 20 69 73 20 4e 55 4c 4c 2c  rgument is NULL,
30ef0 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   then this funct
30f00 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 63 61 6c  ion is being cal
30f10 6c 65 64 20 0a 2a 2a 20 74 6f 20 69 6e 66 6f 72  led .** to infor
30f20 6d 20 74 68 65 20 56 46 53 20 6c 61 79 65 72 20  m the VFS layer 
30f30 74 68 61 74 2c 20 61 63 63 6f 72 64 69 6e 67 20  that, according 
30f40 74 6f 20 50 4f 53 49 58 2c 20 61 6e 79 20 65 78  to POSIX, any ex
30f50 69 73 74 69 6e 67 20 6d 61 70 70 69 6e 67 20 0a  isting mapping .
30f60 2a 2a 20 6d 61 79 20 6e 6f 77 20 62 65 20 69 6e  ** may now be in
30f70 76 61 6c 69 64 20 61 6e 64 20 73 68 6f 75 6c 64  valid and should
30f80 20 62 65 20 75 6e 6d 61 70 70 65 64 2e 0a 2a 2f   be unmapped..*/
30f90 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
30fa0 55 6e 66 65 74 63 68 28 73 71 6c 69 74 65 33 5f  Unfetch(sqlite3_
30fb0 66 69 6c 65 20 2a 66 64 2c 20 69 36 34 20 69 4f  file *fd, i64 iO
30fc0 66 66 2c 20 76 6f 69 64 20 2a 70 29 7b 0a 23 69  ff, void *p){.#i
30fd0 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  f SQLITE_MAX_MMA
30fe0 50 5f 53 49 5a 45 3e 30 0a 20 20 75 6e 69 78 46  P_SIZE>0.  unixF
30ff0 69 6c 65 20 2a 70 46 64 20 3d 20 28 75 6e 69 78  ile *pFd = (unix
31000 46 69 6c 65 20 2a 29 66 64 3b 20 20 20 2f 2a 20  File *)fd;   /* 
31010 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64  The underlying d
31020 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
31030 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
31040 45 52 28 69 4f 66 66 29 3b 0a 0a 20 20 2f 2a 20  ER(iOff);..  /* 
31050 49 66 20 70 3d 3d 30 20 28 75 6e 6d 61 70 20 74  If p==0 (unmap t
31060 68 65 20 65 6e 74 69 72 65 20 66 69 6c 65 29 20  he entire file) 
31070 74 68 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20  then there must 
31080 62 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e  be no outstandin
31090 67 20 0a 20 20 2a 2a 20 78 46 65 74 63 68 20 72  g .  ** xFetch r
310a0 65 66 65 72 65 6e 63 65 73 2e 20 4f 72 2c 20 69  eferences. Or, i
310b0 66 20 70 21 3d 30 20 28 6d 65 61 6e 69 6e 67 20  f p!=0 (meaning 
310c0 69 74 20 69 73 20 61 6e 20 78 46 65 74 63 68 20  it is an xFetch 
310d0 72 65 66 65 72 65 6e 63 65 29 2c 0a 20 20 2a 2a  reference),.  **
310e0 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75 73 74   then there must
310f0 20 62 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65   be at least one
31100 20 6f 75 74 73 74 61 6e 64 69 6e 67 2e 20 20 2a   outstanding.  *
31110 2f 0a 20 20 61 73 73 65 72 74 28 20 28 70 3d 3d  /.  assert( (p==
31120 30 29 3d 3d 28 70 46 64 2d 3e 6e 46 65 74 63 68  0)==(pFd->nFetch
31130 4f 75 74 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a  Out==0) );..  /*
31140 20 49 66 20 70 21 3d 30 2c 20 69 74 20 6d 75 73   If p!=0, it mus
31150 74 20 6d 61 74 63 68 20 74 68 65 20 69 4f 66 66  t match the iOff
31160 20 76 61 6c 75 65 2e 20 2a 2f 0a 20 20 61 73 73   value. */.  ass
31170 65 72 74 28 20 70 3d 3d 30 20 7c 7c 20 70 3d 3d  ert( p==0 || p==
31180 26 28 28 75 38 20 2a 29 70 46 64 2d 3e 70 4d 61  &((u8 *)pFd->pMa
31190 70 52 65 67 69 6f 6e 29 5b 69 4f 66 66 5d 20 29  pRegion)[iOff] )
311a0 3b 0a 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  ;..  if( p ){.  
311b0 20 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74    pFd->nFetchOut
311c0 2d 2d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  --;.  }else{.   
311d0 20 75 6e 69 78 55 6e 6d 61 70 66 69 6c 65 28 70   unixUnmapfile(p
311e0 46 64 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65  Fd);.  }..  asse
311f0 72 74 28 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f  rt( pFd->nFetchO
31200 75 74 3e 3d 30 20 29 3b 0a 23 65 6c 73 65 0a 20  ut>=0 );.#else. 
31210 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
31220 52 28 66 64 29 3b 0a 20 20 55 4e 55 53 45 44 5f  R(fd);.  UNUSED_
31230 50 41 52 41 4d 45 54 45 52 28 70 29 3b 0a 20 20  PARAMETER(p);.  
31240 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
31250 28 69 4f 66 66 29 3b 0a 23 65 6e 64 69 66 0a 20  (iOff);.#endif. 
31260 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
31270 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48 65 72 65  K;.}../*.** Here
31280 20 65 6e 64 73 20 74 68 65 20 69 6d 70 6c 65 6d   ends the implem
31290 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 6c 6c 20  entation of all 
312a0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 6d 65 74  sqlite3_file met
312b0 68 6f 64 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  hods..**.*******
312c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
312d0 45 6e 64 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  End sqlite3_file
312e0 20 4d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a   Methods *******
312f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
31300 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
31310 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
31320 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
31330 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
31340 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
31350 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  *******/../*.** 
31360 54 68 69 73 20 64 69 76 69 73 69 6f 6e 20 63 6f  This division co
31370 6e 74 61 69 6e 73 20 64 65 66 69 6e 69 74 69 6f  ntains definitio
31380 6e 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 69 6f  ns of sqlite3_io
31390 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 73  _methods objects
313a0 20 74 68 61 74 0a 2a 2a 20 69 6d 70 6c 65 6d 65   that.** impleme
313b0 6e 74 20 76 61 72 69 6f 75 73 20 66 69 6c 65 20  nt various file 
313c0 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74 65 67 69  locking strategi
313d0 65 73 2e 20 20 49 74 20 61 6c 73 6f 20 63 6f 6e  es.  It also con
313e0 74 61 69 6e 73 20 64 65 66 69 6e 69 74 69 6f 6e  tains definition
313f0 73 0a 2a 2a 20 6f 66 20 22 66 69 6e 64 65 72 22  s.** of "finder"
31400 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20 41 20 66   functions.  A f
31410 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 69  inder-function i
31420 73 20 75 73 65 64 20 74 6f 20 6c 6f 63 61 74 65  s used to locate
31430 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
31440 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  .** sqlite3_io_m
31450 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 66 6f  ethods object fo
31460 72 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 64  r a particular d
31470 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54  atabase file.  T
31480 68 65 20 70 41 70 70 44 61 74 61 0a 2a 2a 20 66  he pAppData.** f
31490 69 65 6c 64 20 6f 66 20 74 68 65 20 73 71 6c 69  ield of the sqli
314a0 74 65 33 5f 76 66 73 20 56 46 53 20 6f 62 6a 65  te3_vfs VFS obje
314b0 63 74 73 20 61 72 65 20 69 6e 69 74 69 61 6c 69  cts are initiali
314c0 7a 65 64 20 74 6f 20 62 65 20 70 6f 69 6e 74 65  zed to be pointe
314d0 72 73 20 74 6f 0a 2a 2a 20 74 68 65 20 63 6f 72  rs to.** the cor
314e0 72 65 63 74 20 66 69 6e 64 65 72 2d 66 75 6e 63  rect finder-func
314f0 74 69 6f 6e 20 66 6f 72 20 74 68 61 74 20 56 46  tion for that VF
31500 53 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 73 74 20 66 69  S..**.** Most fi
31510 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 73 20 72  nder functions r
31520 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
31530 74 6f 20 61 20 66 69 78 65 64 20 73 71 6c 69 74  to a fixed sqlit
31540 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 0a 2a 2a  e3_io_methods.**
31550 20 6f 62 6a 65 63 74 2e 20 20 54 68 65 20 6f 6e   object.  The on
31560 6c 79 20 69 6e 74 65 72 65 73 74 69 6e 67 20 66  ly interesting f
31570 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 69  inder-function i
31580 73 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64  s autolockIoFind
31590 65 72 2c 20 77 68 69 63 68 0a 2a 2a 20 6c 6f 6f  er, which.** loo
315a0 6b 73 20 61 74 20 74 68 65 20 66 69 6c 65 73 79  ks at the filesy
315b0 73 74 65 6d 20 74 79 70 65 20 61 6e 64 20 74 72  stem type and tr
315c0 69 65 73 20 74 6f 20 67 75 65 73 73 20 74 68 65  ies to guess the
315d0 20 62 65 73 74 20 6c 6f 63 6b 69 6e 67 0a 2a 2a   best locking.**
315e0 20 73 74 72 61 74 65 67 79 20 66 72 6f 6d 20 74   strategy from t
315f0 68 61 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 66  hat..**.** For f
31600 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 46  inder-function F
31610 2c 20 74 77 6f 20 6f 62 6a 65 63 74 73 20 61 72  , two objects ar
31620 65 20 63 72 65 61 74 65 64 3a 0a 2a 2a 0a 2a 2a  e created:.**.**
31630 20 20 20 20 28 31 29 20 54 68 65 20 72 65 61 6c      (1) The real
31640 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e   finder-function
31650 20 6e 61 6d 65 64 20 22 46 49 6d 70 74 28 29 22   named "FImpt()"
31660 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 41  ..**.**    (2) A
31670 20 63 6f 6e 73 74 61 6e 74 20 70 6f 69 6e 74 65   constant pointe
31680 72 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  r to this functi
31690 6f 6e 20 6e 61 6d 65 64 20 6a 75 73 74 20 22 46  on named just "F
316a0 22 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 41 20 70 6f  "..**.**.** A po
316b0 69 6e 74 65 72 20 74 6f 20 74 68 65 20 46 20 70  inter to the F p
316c0 6f 69 6e 74 65 72 20 69 73 20 75 73 65 64 20 61  ointer is used a
316d0 73 20 74 68 65 20 70 41 70 70 44 61 74 61 20 76  s the pAppData v
316e0 61 6c 75 65 20 66 6f 72 20 56 46 53 0a 2a 2a 20  alue for VFS.** 
316f0 6f 62 6a 65 63 74 73 2e 20 20 57 65 20 68 61 76  objects.  We hav
31700 65 20 74 6f 20 64 6f 20 74 68 69 73 20 69 6e 73  e to do this ins
31710 74 65 61 64 20 6f 66 20 6c 65 74 74 69 6e 67 20  tead of letting 
31720 70 41 70 70 44 61 74 61 20 70 6f 69 6e 74 0a 2a  pAppData point.*
31730 2a 20 64 69 72 65 63 74 6c 79 20 61 74 20 74 68  * directly at th
31740 65 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f  e finder-functio
31750 6e 20 73 69 6e 63 65 20 43 39 30 20 72 75 6c 65  n since C90 rule
31760 73 20 70 72 65 76 65 6e 74 20 61 20 76 6f 69 64  s prevent a void
31770 2a 0a 2a 2a 20 66 72 6f 6d 20 62 65 20 63 61 73  *.** from be cas
31780 74 20 69 6e 74 6f 20 61 20 66 75 6e 63 74 69 6f  t into a functio
31790 6e 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a  n pointer..**.**
317a0 0a 2a 2a 20 45 61 63 68 20 69 6e 73 74 61 6e 63  .** Each instanc
317b0 65 20 6f 66 20 74 68 69 73 20 6d 61 63 72 6f 20  e of this macro 
317c0 67 65 6e 65 72 61 74 65 73 20 74 77 6f 20 6f 62  generates two ob
317d0 6a 65 63 74 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a  jects:.**.**   *
317e0 20 20 41 20 63 6f 6e 73 74 61 6e 74 20 73 71 6c    A constant sql
317f0 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
31800 6f 62 6a 65 63 74 20 63 61 6c 6c 20 4d 45 54 48  object call METH
31810 4f 44 20 74 68 61 74 20 68 61 73 20 6c 6f 63 6b  OD that has lock
31820 69 6e 67 0a 2a 2a 20 20 20 20 20 20 6d 65 74 68  ing.**      meth
31830 6f 64 73 20 43 4c 4f 53 45 2c 20 4c 4f 43 4b 2c  ods CLOSE, LOCK,
31840 20 55 4e 4c 4f 43 4b 2c 20 43 4b 52 45 53 4c 4f   UNLOCK, CKRESLO
31850 43 4b 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 41  CK..**.**   *  A
31860 6e 20 49 2f 4f 20 6d 65 74 68 6f 64 20 66 69 6e  n I/O method fin
31870 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c  der function cal
31880 6c 65 64 20 46 49 4e 44 45 52 20 74 68 61 74 20  led FINDER that 
31890 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65  returns a pointe
318a0 72 0a 2a 2a 20 20 20 20 20 20 74 6f 20 74 68 65  r.**      to the
318b0 20 4d 45 54 48 4f 44 20 6f 62 6a 65 63 74 20 69   METHOD object i
318c0 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 62  n the previous b
318d0 75 6c 6c 65 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e  ullet..*/.#defin
318e0 65 20 49 4f 4d 45 54 48 4f 44 53 28 46 49 4e 44  e IOMETHODS(FIND
318f0 45 52 2c 4d 45 54 48 4f 44 2c 56 45 52 53 49 4f  ER,METHOD,VERSIO
31900 4e 2c 43 4c 4f 53 45 2c 4c 4f 43 4b 2c 55 4e 4c  N,CLOSE,LOCK,UNL
31910 4f 43 4b 2c 43 4b 4c 4f 43 4b 2c 53 48 4d 4d 41  OCK,CKLOCK,SHMMA
31920 50 29 20 20 20 20 20 5c 0a 73 74 61 74 69 63 20  P)     \.static 
31930 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f  const sqlite3_io
31940 5f 6d 65 74 68 6f 64 73 20 4d 45 54 48 4f 44 20  _methods METHOD 
31950 3d 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 20  = {             
31960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31970 20 20 20 20 20 20 5c 0a 20 20 20 56 45 52 53 49        \.   VERSI
31980 4f 4e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ON,             
31990 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69         /* iVersi
319a0 6f 6e 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  on */           
319b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
319c0 20 20 20 20 20 5c 0a 20 20 20 43 4c 4f 53 45 2c       \.   CLOSE,
319d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
319e0 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20        /* xClose 
319f0 2a 2f 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 20 20 20 20                  
31a10 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 52 65 61      \.   unixRea
31a20 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
31a30 20 20 20 20 20 2f 2a 20 78 52 65 61 64 20 2a 2f       /* xRead */
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 20 20 20 20 20                  
31a60 20 20 20 5c 0a 20 20 20 75 6e 69 78 57 72 69 74     \.   unixWrit
31a70 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
31a80 20 20 20 20 2f 2a 20 78 57 72 69 74 65 20 2a 2f      /* xWrite */
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 20 20 20 20 20 20                  
31ab0 20 20 5c 0a 20 20 20 75 6e 69 78 54 72 75 6e 63    \.   unixTrunc
31ac0 61 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ate,            
31ad0 20 20 20 2f 2a 20 78 54 72 75 6e 63 61 74 65 20     /* xTruncate 
31ae0 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
31af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31b00 20 5c 0a 20 20 20 75 6e 69 78 53 79 6e 63 2c 20   \.   unixSync, 
31b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31b20 20 20 2f 2a 20 78 53 79 6e 63 20 2a 2f 20 20 20    /* xSync */   
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 20 20 20 20 20 20 20 20                  
31b50 5c 0a 20 20 20 75 6e 69 78 46 69 6c 65 53 69 7a  \.   unixFileSiz
31b60 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
31b70 20 2f 2a 20 78 46 69 6c 65 53 69 7a 65 20 2a 2f   /* xFileSize */
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 20 20 20 20 20 20 20 20 5c                 \
31ba0 0a 20 20 20 4c 4f 43 4b 2c 20 20 20 20 20 20 20  .   LOCK,       
31bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31bc0 2f 2a 20 78 4c 6f 63 6b 20 2a 2f 20 20 20 20 20  /* xLock */     
31bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
31bf0 20 20 20 55 4e 4c 4f 43 4b 2c 20 20 20 20 20 20     UNLOCK,      
31c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
31c10 2a 20 78 55 6e 6c 6f 63 6b 20 2a 2f 20 20 20 20  * xUnlock */    
31c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31c30 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
31c40 20 20 43 4b 4c 4f 43 4b 2c 20 20 20 20 20 20 20    CKLOCK,       
31c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
31c60 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c   xCheckReservedL
31c70 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ock */          
31c80 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
31c90 20 75 6e 69 78 46 69 6c 65 43 6f 6e 74 72 6f 6c   unixFileControl
31ca0 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
31cb0 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 20 2a 2f 20  xFileControl */ 
31cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31cd0 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
31ce0 75 6e 69 78 53 65 63 74 6f 72 53 69 7a 65 2c 20  unixSectorSize, 
31cf0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
31d00 53 65 63 74 6f 72 53 69 7a 65 20 2a 2f 20 20 20  SectorSize */   
31d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31d20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75            \.   u
31d30 6e 69 78 44 65 76 69 63 65 43 68 61 72 61 63 74  nixDeviceCharact
31d40 65 72 69 73 74 69 63 73 2c 20 20 2f 2a 20 78 44  eristics,  /* xD
31d50 65 76 69 63 65 43 61 70 61 62 69 6c 69 74 69 65  eviceCapabilitie
31d60 73 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  s */            
31d70 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 53 48           \.   SH
31d80 4d 4d 41 50 2c 20 20 20 20 20 20 20 20 20 20 20  MMAP,           
31d90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68            /* xSh
31da0 6d 4d 61 70 20 2a 2f 20 20 20 20 20 20 20 20 20  mMap */         
31db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31dc0 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69          \.   uni
31dd0 78 53 68 6d 4c 6f 63 6b 2c 20 20 20 20 20 20 20  xShmLock,       
31de0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d           /* xShm
31df0 4c 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20 20 20  Lock */         
31e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31e10 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78         \.   unix
31e20 53 68 6d 42 61 72 72 69 65 72 2c 20 20 20 20 20  ShmBarrier,     
31e30 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 42          /* xShmB
31e40 61 72 72 69 65 72 20 2a 2f 20 20 20 20 20 20 20  arrier */       
31e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31e60 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53        \.   unixS
31e70 68 6d 55 6e 6d 61 70 2c 20 20 20 20 20 20 20 20  hmUnmap,        
31e80 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 55 6e         /* xShmUn
31e90 6d 61 70 20 2a 2f 20 20 20 20 20 20 20 20 20 20  map */          
31ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31eb0 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 46 65       \.   unixFe
31ec0 74 63 68 2c 20 20 20 20 20 20 20 20 20 20 20 20  tch,            
31ed0 20 20 20 20 20 20 2f 2a 20 78 46 65 74 63 68 20        /* xFetch 
31ee0 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
31ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31f00 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 55 6e 66      \.   unixUnf
31f10 65 74 63 68 2c 20 20 20 20 20 20 20 20 20 20 20  etch,           
31f20 20 20 20 20 20 2f 2a 20 78 55 6e 66 65 74 63 68       /* xUnfetch
31f30 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
31f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31f50 20 20 20 5c 0a 7d 3b 20 20 20 20 20 20 20 20 20     \.};         
31f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31fa0 20 20 5c 0a 73 74 61 74 69 63 20 63 6f 6e 73 74    \.static const
31fb0 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
31fc0 6f 64 73 20 2a 46 49 4e 44 45 52 23 23 49 6d 70  ods *FINDER##Imp
31fd0 6c 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c  l(const char *z,
31fe0 20 75 6e 69 78 46 69 6c 65 20 2a 70 29 7b 20 20   unixFile *p){  
31ff0 20 5c 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41   \.  UNUSED_PARA
32000 4d 45 54 45 52 28 7a 29 3b 20 55 4e 55 53 45 44  METER(z); UNUSED
32010 5f 50 41 52 41 4d 45 54 45 52 28 70 29 3b 20 20  _PARAMETER(p);  
32020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32040 5c 0a 20 20 72 65 74 75 72 6e 20 26 4d 45 54 48  \.  return &METH
32050 4f 44 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OD;             
32060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
32090 0a 7d 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .}              
320a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
320b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
320c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
320d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
320e0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c  static const sql
320f0 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
32100 2a 28 2a 63 6f 6e 73 74 20 46 49 4e 44 45 52 29  *(*const FINDER)
32110 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 75 6e 69  (const char*,uni
32120 78 46 69 6c 65 20 2a 70 29 20 20 20 20 5c 0a 20  xFile *p)    \. 
32130 20 20 20 3d 20 46 49 4e 44 45 52 23 23 49 6d 70     = FINDER##Imp
32140 6c 3b 0a 0a 2f 2a 0a 2a 2a 20 48 65 72 65 20 61  l;../*.** Here a
32150 72 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 73 71  re all of the sq
32160 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
32170 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 65 61 63   objects for eac
32180 68 20 6f 66 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b  h of the.** lock
32190 69 6e 67 20 73 74 72 61 74 65 67 69 65 73 2e 20  ing strategies. 
321a0 20 46 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20   Functions that 
321b0 72 65 74 75 72 6e 20 70 6f 69 6e 74 65 72 73 20  return pointers 
321c0 74 6f 20 74 68 65 73 65 20 6d 65 74 68 6f 64 73  to these methods
321d0 0a 2a 2a 20 61 72 65 20 61 6c 73 6f 20 63 72 65  .** are also cre
321e0 61 74 65 64 2e 0a 2a 2f 0a 49 4f 4d 45 54 48 4f  ated..*/.IOMETHO
321f0 44 53 28 0a 20 20 70 6f 73 69 78 49 6f 46 69 6e  DS(.  posixIoFin
32200 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  der,            
32210 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69  /* Finder functi
32220 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 70 6f 73  on name */.  pos
32230 69 78 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20  ixIoMethods,    
32240 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65         /* sqlite
32250 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a  3_io_methods obj
32260 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 33 2c  ect name */.  3,
32270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32280 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65          /* share
32290 64 20 6d 65 6d 6f 72 79 20 61 6e 64 20 6d 6d 61  d memory and mma
322a0 70 20 61 72 65 20 65 6e 61 62 6c 65 64 20 2a 2f  p are enabled */
322b0 0a 20 20 75 6e 69 78 43 6c 6f 73 65 2c 20 20 20  .  unixClose,   
322c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
322d0 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f  xClose method */
322e0 0a 20 20 75 6e 69 78 4c 6f 63 6b 2c 20 20 20 20  .  unixLock,    
322f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
32300 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  xLock method */.
32310 20 20 75 6e 69 78 55 6e 6c 6f 63 6b 2c 20 20 20    unixUnlock,   
32320 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
32330 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f  Unlock method */
32340 0a 20 20 75 6e 69 78 43 68 65 63 6b 52 65 73 65  .  unixCheckRese
32350 72 76 65 64 4c 6f 63 6b 2c 20 20 20 20 2f 2a 20  rvedLock,    /* 
32360 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  xCheckReservedLo
32370 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75  ck method */.  u
32380 6e 69 78 53 68 6d 4d 61 70 20 20 20 20 20 20 20  nixShmMap       
32390 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d           /* xShm
323a0 4d 61 70 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a  Map method */.).
323b0 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 6e 6f 6c  IOMETHODS(.  nol
323c0 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20 20 20 20  ockIoFinder,    
323d0 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72         /* Finder
323e0 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a   function name *
323f0 2f 0a 20 20 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68  /.  nolockIoMeth
32400 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  ods,          /*
32410 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
32420 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20  ods object name 
32430 2a 2f 0a 20 20 32 2c 20 20 20 20 20 20 20 20 20  */.  2,         
32440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
32450 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  * shared memory 
32460 69 73 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20  is enabled */.  
32470 6e 6f 6c 6f 63 6b 43 6c 6f 73 65 2c 20 20 20 20  nolockClose,    
32480 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c            /* xCl
32490 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ose method */.  
324a0 6e 6f 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20 20  nolockLock,     
324b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f            /* xLo
324c0 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 6e  ck method */.  n
324d0 6f 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20  olockUnlock,    
324e0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c           /* xUnl
324f0 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
32500 6e 6f 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72  nolockCheckReser
32510 76 65 64 4c 6f 63 6b 2c 20 20 2f 2a 20 78 43 68  vedLock,  /* xCh
32520 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20  eckReservedLock 
32530 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 30 20 20 20  method */.  0   
32540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32550 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70        /* xShmMap
32560 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 49 4f 4d   method */.).IOM
32570 45 54 48 4f 44 53 28 0a 20 20 64 6f 74 6c 6f 63  ETHODS(.  dotloc
32580 6b 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20  kIoFinder,      
32590 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75      /* Finder fu
325a0 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20  nction name */. 
325b0 20 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64   dotlockIoMethod
325c0 73 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71  s,         /* sq
325d0 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
325e0 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a   object name */.
325f0 20 20 31 2c 20 20 20 20 20 20 20 20 20 20 20 20    1,            
32600 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
32610 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20  hared memory is 
32620 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 64 6f  disabled */.  do
32630 74 6c 6f 63 6b 43 6c 6f 73 65 2c 20 20 20 20 20  tlockClose,     
32640 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73          /* xClos
32650 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 64 6f  e method */.  do
32660 74 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20 20 20  tlockLock,      
32670 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b          /* xLock
32680 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 64 6f 74   method */.  dot
32690 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20 20  lockUnlock,     
326a0 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63         /* xUnloc
326b0 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 64 6f  k method */.  do
326c0 74 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76  tlockCheckReserv
326d0 65 64 4c 6f 63 6b 2c 20 2f 2a 20 78 43 68 65 63  edLock, /* xChec
326e0 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65  kReservedLock me
326f0 74 68 6f 64 20 2a 2f 0a 20 20 30 20 20 20 20 20  thod */.  0     
32700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32710 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20 6d      /* xShmMap m
32720 65 74 68 6f 64 20 2a 2f 0a 29 0a 0a 23 69 66 20  ethod */.)..#if 
32730 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
32740 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 49 4f 4d 45  CKING_STYLE.IOME
32750 54 48 4f 44 53 28 0a 20 20 66 6c 6f 63 6b 49 6f  THODS(.  flockIo
32760 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20  Finder,         
32770 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e     /* Finder fun
32780 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  ction name */.  
32790 66 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 2c 20  flockIoMethods, 
327a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c            /* sql
327b0 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
327c0 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20  object name */. 
327d0 20 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   1,             
327e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68             /* sh
327f0 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64  ared memory is d
32800 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 66 6c 6f  isabled */.  flo
32810 63 6b 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20  ckClose,        
32820 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65         /* xClose
32830 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f   method */.  flo
32840 63 6b 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  ckLock,         
32850 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20         /* xLock 
32860 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f 63  method */.  floc
32870 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20  kUnlock,        
32880 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b        /* xUnlock
32890 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f   method */.  flo
328a0 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  ckCheckReservedL
328b0 6f 63 6b 2c 20 20 20 2f 2a 20 78 43 68 65 63 6b  ock,   /* xCheck
328c0 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74  ReservedLock met
328d0 68 6f 64 20 2a 2f 0a 20 20 30 20 20 20 20 20 20  hod */.  0      
328e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
328f0 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20 6d 65     /* xShmMap me
32900 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66  thod */.).#endif
32910 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53  ..#if OS_VXWORKS
32920 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 73 65  .IOMETHODS(.  se
32930 6d 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20  mIoFinder,      
32940 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65          /* Finde
32950 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20  r function name 
32960 2a 2f 0a 20 20 73 65 6d 49 6f 4d 65 74 68 6f 64  */.  semIoMethod
32970 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  s,             /
32980 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  * sqlite3_io_met
32990 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65  hods object name
329a0 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20   */.  1,        
329b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
329c0 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  /* shared memory
329d0 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a   is disabled */.
329e0 20 20 73 65 6d 58 43 6c 6f 73 65 2c 20 20 20 20    semXClose,    
329f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
32a00 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a  Close method */.
32a10 20 20 73 65 6d 58 4c 6f 63 6b 2c 20 20 20 20 20    semXLock,     
32a20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
32a30 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  Lock method */. 
32a40 20 73 65 6d 58 55 6e 6c 6f 63 6b 2c 20 20 20 20   semXUnlock,    
32a50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55             /* xU
32a60 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  nlock method */.
32a70 20 20 73 65 6d 58 43 68 65 63 6b 52 65 73 65 72    semXCheckReser
32a80 76 65 64 4c 6f 63 6b 2c 20 20 20 20 2f 2a 20 78  vedLock,    /* x
32a90 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
32aa0 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 30 20  k method */.  0 
32ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32ac0 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d          /* xShmM
32ad0 61 70 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23  ap method */.).#
32ae0 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e  endif..#if defin
32af0 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26  ed(__APPLE__) &&
32b00 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
32b10 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 49 4f 4d  OCKING_STYLE.IOM
32b20 45 54 48 4f 44 53 28 0a 20 20 61 66 70 49 6f 46  ETHODS(.  afpIoF
32b30 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20  inder,          
32b40 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75      /* Finder fu
32b50 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20  nction name */. 
32b60 20 61 66 70 49 6f 4d 65 74 68 6f 64 73 2c 20 20   afpIoMethods,  
32b70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71             /* sq
32b80 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
32b90 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a   object name */.
32ba0 20 20 31 2c 20 20 20 20 20 20 20 20 20 20 20 20    1,            
32bb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
32bc0 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20  hared memory is 
32bd0 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 61 66  disabled */.  af
32be0 70 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20  pClose,         
32bf0 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73          /* xClos
32c00 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 61 66  e method */.  af
32c10 70 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  pLock,          
32c20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b          /* xLock
32c30 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 61 66 70   method */.  afp
32c40 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  Unlock,         
32c50 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63         /* xUnloc
32c60 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 61 66  k method */.  af
32c70 70 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  pCheckReservedLo
32c80 63 6b 2c 20 20 20 20 20 2f 2a 20 78 43 68 65 63  ck,     /* xChec
32c90 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65  kReservedLock me
32ca0 74 68 6f 64 20 2a 2f 0a 20 20 30 20 20 20 20 20  thod */.  0     
32cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32cc0 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20 6d      /* xShmMap m
32cd0 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69  ethod */.).#endi
32ce0 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 72 6f  f../*.** The pro
32cf0 78 79 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f  xy locking metho
32d00 64 20 69 73 20 61 20 22 73 75 70 65 72 2d 6d 65  d is a "super-me
32d10 74 68 6f 64 22 20 69 6e 20 74 68 65 20 73 65 6e  thod" in the sen
32d20 73 65 20 74 68 61 74 20 69 74 0a 2a 2a 20 6f 70  se that it.** op
32d30 65 6e 73 20 73 65 63 6f 6e 64 61 72 79 20 66 69  ens secondary fi
32d40 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 66  le descriptors f
32d50 6f 72 20 74 68 65 20 63 6f 6e 63 68 20 61 6e 64  or the conch and
32d60 20 6c 6f 63 6b 20 66 69 6c 65 73 20 61 6e 64 0a   lock files and.
32d70 2a 2a 20 69 74 20 75 73 65 73 20 70 72 6f 78 79  ** it uses proxy
32d80 2c 20 64 6f 74 2d 66 69 6c 65 2c 20 41 46 50 2c  , dot-file, AFP,
32d90 20 61 6e 64 20 66 6c 6f 63 6b 28 29 20 6c 6f 63   and flock() loc
32da0 6b 69 6e 67 20 6d 65 74 68 6f 64 73 20 6f 6e 20  king methods on 
32db0 74 68 6f 73 65 0a 2a 2a 20 73 65 63 6f 6e 64 61  those.** seconda
32dc0 72 79 20 66 69 6c 65 73 2e 20 20 46 6f 72 20 74  ry files.  For t
32dd0 68 69 73 20 72 65 61 73 6f 6e 2c 20 74 68 65 20  his reason, the 
32de0 64 69 76 69 73 69 6f 6e 20 74 68 61 74 20 69 6d  division that im
32df0 70 6c 65 6d 65 6e 74 73 0a 2a 2a 20 70 72 6f 78  plements.** prox
32e00 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20 6c 6f 63  y locking is loc
32e10 61 74 65 64 20 6d 75 63 68 20 66 75 72 74 68 65  ated much furthe
32e20 72 20 64 6f 77 6e 20 69 6e 20 74 68 65 20 66 69  r down in the fi
32e30 6c 65 2e 20 20 42 75 74 20 77 65 20 6e 65 65 64  le.  But we need
32e40 0a 2a 2a 20 74 6f 20 67 6f 20 61 68 65 61 64 20  .** to go ahead 
32e50 61 6e 64 20 64 65 66 69 6e 65 20 74 68 65 20 73  and define the s
32e60 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
32e70 73 20 61 6e 64 20 66 69 6e 64 65 72 20 66 75 6e  s and finder fun
32e80 63 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 70 72 6f  ction.** for pro
32e90 78 79 20 6c 6f 63 6b 69 6e 67 20 68 65 72 65 2e  xy locking here.
32ea0 20 20 53 6f 20 77 65 20 66 6f 72 77 61 72 64 20    So we forward 
32eb0 64 65 63 6c 61 72 65 20 74 68 65 20 49 2f 4f 20  declare the I/O 
32ec0 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a 23 69 66 20  methods..*/.#if 
32ed0 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
32ee0 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41  _) && SQLITE_ENA
32ef0 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
32f00 45 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  E.static int pro
32f10 78 79 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f  xyClose(sqlite3_
32f20 66 69 6c 65 2a 29 3b 0a 73 74 61 74 69 63 20 69  file*);.static i
32f30 6e 74 20 70 72 6f 78 79 4c 6f 63 6b 28 73 71 6c  nt proxyLock(sql
32f40 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 29  ite3_file*, int)
32f50 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  ;.static int pro
32f60 78 79 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33  xyUnlock(sqlite3
32f70 5f 66 69 6c 65 2a 2c 20 69 6e 74 29 3b 0a 73 74  _file*, int);.st
32f80 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43 68  atic int proxyCh
32f90 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28  eckReservedLock(
32fa0 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69  sqlite3_file*, i
32fb0 6e 74 2a 29 3b 0a 49 4f 4d 45 54 48 4f 44 53 28  nt*);.IOMETHODS(
32fc0 0a 20 20 70 72 6f 78 79 49 6f 46 69 6e 64 65 72  .  proxyIoFinder
32fd0 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
32fe0 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20  Finder function 
32ff0 6e 61 6d 65 20 2a 2f 0a 20 20 70 72 6f 78 79 49  name */.  proxyI
33000 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20  oMethods,       
33010 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69      /* sqlite3_i
33020 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74  o_methods object
33030 20 6e 61 6d 65 20 2a 2f 0a 20 20 32 2c 20 20 20   name */.  2,   
33040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33050 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d       /* shared m
33060 65 6d 6f 72 79 20 69 73 20 65 6e 61 62 6c 65 64  emory is enabled
33070 20 2a 2f 0a 20 20 70 72 6f 78 79 43 6c 6f 73 65   */.  proxyClose
33080 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
33090 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64  /* xClose method
330a0 20 2a 2f 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 2c   */.  proxyLock,
330b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
330c0 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  /* xLock method 
330d0 2a 2f 0a 20 20 70 72 6f 78 79 55 6e 6c 6f 63 6b  */.  proxyUnlock
330e0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
330f0 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64  * xUnlock method
33100 20 2a 2f 0a 20 20 70 72 6f 78 79 43 68 65 63 6b   */.  proxyCheck
33110 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20 20  ReservedLock,   
33120 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65  /* xCheckReserve
33130 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  dLock method */.
33140 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20    0             
33150 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
33160 53 68 6d 4d 61 70 20 6d 65 74 68 6f 64 20 2a 2f  ShmMap method */
33170 0a 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 6e 66  .).#endif../* nf
33180 73 20 6c 6f 63 6b 64 20 6f 6e 20 4f 53 58 20 31  s lockd on OSX 1
33190 30 2e 33 2b 20 64 6f 65 73 6e 27 74 20 63 6c 65  0.3+ doesn't cle
331a0 61 72 20 77 72 69 74 65 20 6c 6f 63 6b 73 20 77  ar write locks w
331b0 68 65 6e 20 61 20 72 65 61 64 20 6c 6f 63 6b 20  hen a read lock 
331c0 69 73 20 73 65 74 20 2a 2f 0a 23 69 66 20 64 65  is set */.#if de
331d0 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
331e0 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
331f0 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
33200 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 6e 66 73  IOMETHODS(.  nfs
33210 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20  IoFinder,       
33220 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65          /* Finde
33230 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20  r function name 
33240 2a 2f 0a 20 20 6e 66 73 49 6f 4d 65 74 68 6f 64  */.  nfsIoMethod
33250 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
33260 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  /* sqlite3_io_me
33270 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d  thods object nam
33280 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20  e */.  1,       
33290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
332a0 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f    /* shared memo
332b0 72 79 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a  ry is disabled *
332c0 2f 0a 20 20 75 6e 69 78 43 6c 6f 73 65 2c 20 20  /.  unixClose,  
332d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
332e0 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20  * xClose method 
332f0 2a 2f 0a 20 20 75 6e 69 78 4c 6f 63 6b 2c 20 20  */.  unixLock,  
33300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33310 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  /* xLock method 
33320 2a 2f 0a 20 20 6e 66 73 55 6e 6c 6f 63 6b 2c 20  */.  nfsUnlock, 
33330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33340 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f  /* xUnlock metho
33350 64 20 2a 2f 0a 20 20 75 6e 69 78 43 68 65 63 6b  d */.  unixCheck
33360 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20 20  ReservedLock,   
33370 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72    /* xCheckReser
33380 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  vedLock method *
33390 2f 0a 20 20 30 20 20 20 20 20 20 20 20 20 20 20  /.  0           
333a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
333b0 2a 20 78 53 68 6d 4d 61 70 20 6d 65 74 68 6f 64  * xShmMap method
333c0 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 23 69   */.).#endif..#i
333d0 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
333e0 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45  E__) && SQLITE_E
333f0 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
33400 59 4c 45 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20  YLE./* .** This 
33410 22 66 69 6e 64 65 72 22 20 66 75 6e 63 74 69 6f  "finder" functio
33420 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20 64 65  n attempts to de
33430 74 65 72 6d 69 6e 65 20 74 68 65 20 62 65 73 74  termine the best
33440 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74 65 67   locking strateg
33450 79 20 0a 2a 2a 20 66 6f 72 20 74 68 65 20 64 61  y .** for the da
33460 74 61 62 61 73 65 20 66 69 6c 65 20 22 66 69 6c  tabase file "fil
33470 65 50 61 74 68 22 2e 20 20 49 74 20 74 68 65 6e  ePath".  It then
33480 20 72 65 74 75 72 6e 73 20 74 68 65 20 73 71 6c   returns the sql
33490 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 0a  ite3_io_methods.
334a0 2a 2a 20 6f 62 6a 65 63 74 20 74 68 61 74 20 69  ** object that i
334b0 6d 70 6c 65 6d 65 6e 74 73 20 74 68 61 74 20 73  mplements that s
334c0 74 72 61 74 65 67 79 2e 0a 2a 2a 0a 2a 2a 20 54  trategy..**.** T
334d0 68 69 73 20 69 73 20 66 6f 72 20 4d 61 63 4f 53  his is for MacOS
334e0 58 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69  X only..*/.stati
334f0 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  c const sqlite3_
33500 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 61 75 74 6f  io_methods *auto
33510 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 49 6d 70 6c  lockIoFinderImpl
33520 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  (.  const char *
33530 66 69 6c 65 50 61 74 68 2c 20 20 20 20 2f 2a 20  filePath,    /* 
33540 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  name of the data
33550 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75  base file */.  u
33560 6e 69 78 46 69 6c 65 20 2a 70 4e 65 77 20 20 20  nixFile *pNew   
33570 20 20 20 20 20 20 20 20 2f 2a 20 6f 70 65 6e 20          /* open 
33580 66 69 6c 65 20 6f 62 6a 65 63 74 20 66 6f 72 20  file object for 
33590 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
335a0 65 20 2a 2f 0a 29 7b 0a 20 20 73 74 61 74 69 63  e */.){.  static
335b0 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 4d 61   const struct Ma
335c0 70 70 69 6e 67 20 7b 0a 20 20 20 20 63 6f 6e 73  pping {.    cons
335d0 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 73 79 73  t char *zFilesys
335e0 74 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  tem;            
335f0 20 20 2f 2a 20 46 69 6c 65 73 79 73 74 65 6d 20    /* Filesystem 
33600 74 79 70 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20  type name */.   
33610 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69   const sqlite3_i
33620 6f 5f 6d 65 74 68 6f 64 73 20 2a 70 4d 65 74 68  o_methods *pMeth
33630 6f 64 73 3b 20 20 20 2f 2a 20 41 70 70 72 6f 70  ods;   /* Approp
33640 72 69 61 74 65 20 6c 6f 63 6b 69 6e 67 20 6d 65  riate locking me
33650 74 68 6f 64 20 2a 2f 0a 20 20 7d 20 61 4d 61 70  thod */.  } aMap
33660 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22 68 66  [] = {.    { "hf
33670 73 22 2c 20 20 20 20 26 70 6f 73 69 78 49 6f 4d  s",    &posixIoM
33680 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20  ethods },.    { 
33690 22 75 66 73 22 2c 20 20 20 20 26 70 6f 73 69 78  "ufs",    &posix
336a0 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20  IoMethods },.   
336b0 20 7b 20 22 61 66 70 66 73 22 2c 20 20 26 61 66   { "afpfs",  &af
336c0 70 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20  pIoMethods },.  
336d0 20 20 7b 20 22 73 6d 62 66 73 22 2c 20 20 26 61    { "smbfs",  &a
336e0 66 70 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20  fpIoMethods },. 
336f0 20 20 20 7b 20 22 77 65 62 64 61 76 22 2c 20 26     { "webdav", &
33700 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 20  nolockIoMethods 
33710 7d 2c 0a 20 20 20 20 7b 20 30 2c 20 30 20 7d 0a  },.    { 0, 0 }.
33720 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20    };.  int i;.  
33730 73 74 72 75 63 74 20 73 74 61 74 66 73 20 66 73  struct statfs fs
33740 49 6e 66 6f 3b 0a 20 20 73 74 72 75 63 74 20 66  Info;.  struct f
33750 6c 6f 63 6b 20 6c 6f 63 6b 49 6e 66 6f 3b 0a 0a  lock lockInfo;..
33760 20 20 69 66 28 20 21 66 69 6c 65 50 61 74 68 20    if( !filePath 
33770 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 66 69 6c  ){.    /* If fil
33780 65 50 61 74 68 3d 3d 4e 55 4c 4c 20 74 68 61 74  ePath==NULL that
33790 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20 64 65   means we are de
337a0 61 6c 69 6e 67 20 77 69 74 68 20 61 20 74 72 61  aling with a tra
337b0 6e 73 69 65 6e 74 20 66 69 6c 65 0a 20 20 20 20  nsient file.    
337c0 2a 2a 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74  ** that does not
337d0 20 6e 65 65 64 20 74 6f 20 62 65 20 6c 6f 63 6b   need to be lock
337e0 65 64 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  ed. */.    retur
337f0 6e 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f  n &nolockIoMetho
33800 64 73 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 74  ds;.  }.  if( st
33810 61 74 66 73 28 66 69 6c 65 50 61 74 68 2c 20 26  atfs(filePath, &
33820 66 73 49 6e 66 6f 29 20 21 3d 20 2d 31 20 29 7b  fsInfo) != -1 ){
33830 0a 20 20 20 20 69 66 28 20 66 73 49 6e 66 6f 2e  .    if( fsInfo.
33840 66 5f 66 6c 61 67 73 20 26 20 4d 4e 54 5f 52 44  f_flags & MNT_RD
33850 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20 72 65  ONLY ){.      re
33860 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65  turn &nolockIoMe
33870 74 68 6f 64 73 3b 0a 20 20 20 20 7d 0a 20 20 20  thods;.    }.   
33880 20 66 6f 72 28 69 3d 30 3b 20 61 4d 61 70 5b 69   for(i=0; aMap[i
33890 5d 2e 7a 46 69 6c 65 73 79 73 74 65 6d 3b 20 69  ].zFilesystem; i
338a0 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  ++){.      if( s
338b0 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e 66 5f 66  trcmp(fsInfo.f_f
338c0 73 74 79 70 65 6e 61 6d 65 2c 20 61 4d 61 70 5b  stypename, aMap[
338d0 69 5d 2e 7a 46 69 6c 65 73 79 73 74 65 6d 29 3d  i].zFilesystem)=
338e0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  =0 ){.        re
338f0 74 75 72 6e 20 61 4d 61 70 5b 69 5d 2e 70 4d 65  turn aMap[i].pMe
33900 74 68 6f 64 73 3b 0a 20 20 20 20 20 20 7d 0a 20  thods;.      }. 
33910 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44     }.  }..  /* D
33920 65 66 61 75 6c 74 20 63 61 73 65 2e 20 48 61 6e  efault case. Han
33930 64 6c 65 73 2c 20 61 6d 6f 6e 67 73 74 20 6f 74  dles, amongst ot
33940 68 65 72 73 2c 20 22 6e 66 73 22 2e 0a 20 20 2a  hers, "nfs"..  *
33950 2a 20 54 65 73 74 20 62 79 74 65 2d 72 61 6e 67  * Test byte-rang
33960 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20 66 63 6e  e lock using fcn
33970 74 6c 28 29 2e 20 49 66 20 74 68 65 20 63 61 6c  tl(). If the cal
33980 6c 20 73 75 63 63 65 65 64 73 2c 20 0a 20 20 2a  l succeeds, .  *
33990 2a 20 61 73 73 75 6d 65 20 74 68 61 74 20 74 68  * assume that th
339a0 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 73 75  e file-system su
339b0 70 70 6f 72 74 73 20 50 4f 53 49 58 20 73 74 79  pports POSIX sty
339c0 6c 65 20 6c 6f 63 6b 73 2e 20 0a 20 20 2a 2f 0a  le locks. .  */.
339d0 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 6c 65 6e    lockInfo.l_len
339e0 20 3d 20 31 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f   = 1;.  lockInfo
339f0 2e 6c 5f 73 74 61 72 74 20 3d 20 30 3b 0a 20 20  .l_start = 0;.  
33a00 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 77 68 65 6e 63  lockInfo.l_whenc
33a10 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20  e = SEEK_SET;.  
33a20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 74 79 70 65 20  lockInfo.l_type 
33a30 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 69 66 28  = F_RDLCK;.  if(
33a40 20 6f 73 46 63 6e 74 6c 28 70 4e 65 77 2d 3e 68   osFcntl(pNew->h
33a50 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63 6b  , F_GETLK, &lock
33a60 49 6e 66 6f 29 21 3d 2d 31 20 29 20 7b 0a 20 20  Info)!=-1 ) {.  
33a70 20 20 69 66 28 20 73 74 72 63 6d 70 28 66 73 49    if( strcmp(fsI
33a80 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65  nfo.f_fstypename
33a90 2c 20 22 6e 66 73 22 29 3d 3d 30 20 29 7b 0a 20  , "nfs")==0 ){. 
33aa0 20 20 20 20 20 72 65 74 75 72 6e 20 26 6e 66 73       return &nfs
33ab0 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 20 20 7d  IoMethods;.    }
33ac0 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 72 65   else {.      re
33ad0 74 75 72 6e 20 26 70 6f 73 69 78 49 6f 4d 65 74  turn &posixIoMet
33ae0 68 6f 64 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  hods;.    }.  }e
33af0 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  lse{.    return 
33b00 26 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64  &dotlockIoMethod
33b10 73 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20  s;.  }.}.static 
33b20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f  const sqlite3_io
33b30 5f 6d 65 74 68 6f 64 73 20 0a 20 20 2a 28 2a 63  _methods .  *(*c
33b40 6f 6e 73 74 20 61 75 74 6f 6c 6f 63 6b 49 6f 46  onst autolockIoF
33b50 69 6e 64 65 72 29 28 63 6f 6e 73 74 20 63 68 61  inder)(const cha
33b60 72 2a 2c 75 6e 69 78 46 69 6c 65 2a 29 20 3d 20  r*,unixFile*) = 
33b70 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72  autolockIoFinder
33b80 49 6d 70 6c 3b 0a 0a 23 65 6e 64 69 66 20 2f 2a  Impl;..#endif /*
33b90 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
33ba0 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  __) && SQLITE_EN
33bb0 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
33bc0 4c 45 20 2a 2f 0a 0a 23 69 66 20 4f 53 5f 56 58  LE */..#if OS_VX
33bd0 57 4f 52 4b 53 0a 2f 2a 0a 2a 2a 20 54 68 69 73  WORKS./*.** This
33be0 20 22 66 69 6e 64 65 72 22 20 66 75 6e 63 74 69   "finder" functi
33bf0 6f 6e 20 66 6f 72 20 56 78 57 6f 72 6b 73 20 63  on for VxWorks c
33c00 68 65 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20  hecks to see if 
33c10 70 6f 73 69 78 20 61 64 76 69 73 6f 72 79 0a 2a  posix advisory.*
33c20 2a 20 6c 6f 63 6b 69 6e 67 20 77 6f 72 6b 73 2e  * locking works.
33c30 20 20 49 66 20 69 74 20 64 6f 65 73 2c 20 74 68    If it does, th
33c40 65 6e 20 74 68 61 74 20 69 73 20 77 68 61 74 20  en that is what 
33c50 69 73 20 75 73 65 64 2e 20 20 49 66 20 69 74 20  is used.  If it 
33c60 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 77 6f 72 6b  does not.** work
33c70 2c 20 74 68 65 6e 20 66 61 6c 6c 62 61 63 6b 20  , then fallback 
33c80 74 6f 20 6e 61 6d 65 64 20 73 65 6d 61 70 68 6f  to named semapho
33c90 72 65 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 73  re locking..*/.s
33ca0 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69  tatic const sqli
33cb0 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a  te3_io_methods *
33cc0 76 78 77 6f 72 6b 73 49 6f 46 69 6e 64 65 72 49  vxworksIoFinderI
33cd0 6d 70 6c 28 0a 20 20 63 6f 6e 73 74 20 63 68 61  mpl(.  const cha
33ce0 72 20 2a 66 69 6c 65 50 61 74 68 2c 20 20 20 20  r *filePath,    
33cf0 2f 2a 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64  /* name of the d
33d00 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
33d10 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e 65 77    unixFile *pNew
33d20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74 68             /* th
33d30 65 20 6f 70 65 6e 20 66 69 6c 65 20 6f 62 6a 65  e open file obje
33d40 63 74 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63  ct */.){.  struc
33d50 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 49 6e 66 6f  t flock lockInfo
33d60 3b 0a 0a 20 20 69 66 28 20 21 66 69 6c 65 50 61  ;..  if( !filePa
33d70 74 68 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  th ){.    /* If 
33d80 66 69 6c 65 50 61 74 68 3d 3d 4e 55 4c 4c 20 74  filePath==NULL t
33d90 68 61 74 20 6d 65 61 6e 73 20 77 65 20 61 72 65  hat means we are
33da0 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 20   dealing with a 
33db0 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 0a 20  transient file. 
33dc0 20 20 20 2a 2a 20 74 68 61 74 20 64 6f 65 73 20     ** that does 
33dd0 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 6c  not need to be l
33de0 6f 63 6b 65 64 2e 20 2a 2f 0a 20 20 20 20 72 65  ocked. */.    re
33df0 74 75 72 6e 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65  turn &nolockIoMe
33e00 74 68 6f 64 73 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  thods;.  }..  /*
33e10 20 54 65 73 74 20 69 66 20 66 63 6e 74 6c 28 29   Test if fcntl()
33e20 20 69 73 20 73 75 70 70 6f 72 74 65 64 20 61 6e   is supported an
33e30 64 20 75 73 65 20 50 4f 53 49 58 20 73 74 79 6c  d use POSIX styl
33e40 65 20 6c 6f 63 6b 73 2e 0a 20 20 2a 2a 20 4f 74  e locks..  ** Ot
33e50 68 65 72 77 69 73 65 20 66 61 6c 6c 20 62 61 63  herwise fall bac
33e60 6b 20 74 6f 20 74 68 65 20 6e 61 6d 65 64 20 73  k to the named s
33e70 65 6d 61 70 68 6f 72 65 20 6d 65 74 68 6f 64 2e  emaphore method.
33e80 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b 49 6e 66 6f  .  */.  lockInfo
33e90 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20 6c 6f  .l_len = 1;.  lo
33ea0 63 6b 49 6e 66 6f 2e 6c 5f 73 74 61 72 74 20 3d  ckInfo.l_start =
33eb0 20 30 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c   0;.  lockInfo.l
33ec0 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53  _whence = SEEK_S
33ed0 45 54 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c  ET;.  lockInfo.l
33ee0 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b  _type = F_RDLCK;
33ef0 0a 20 20 69 66 28 20 6f 73 46 63 6e 74 6c 28 70  .  if( osFcntl(p
33f00 4e 65 77 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b 2c  New->h, F_GETLK,
33f10 20 26 6c 6f 63 6b 49 6e 66 6f 29 21 3d 2d 31 20   &lockInfo)!=-1 
33f20 29 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 26  ) {.    return &
33f30 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 3b 0a  posixIoMethods;.
33f40 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
33f50 75 72 6e 20 26 73 65 6d 49 6f 4d 65 74 68 6f 64  urn &semIoMethod
33f60 73 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20  s;.  }.}.static 
33f70 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f  const sqlite3_io
33f80 5f 6d 65 74 68 6f 64 73 20 0a 20 20 2a 28 2a 63  _methods .  *(*c
33f90 6f 6e 73 74 20 76 78 77 6f 72 6b 73 49 6f 46 69  onst vxworksIoFi
33fa0 6e 64 65 72 29 28 63 6f 6e 73 74 20 63 68 61 72  nder)(const char
33fb0 2a 2c 75 6e 69 78 46 69 6c 65 2a 29 20 3d 20 76  *,unixFile*) = v
33fc0 78 77 6f 72 6b 73 49 6f 46 69 6e 64 65 72 49 6d  xworksIoFinderIm
33fd0 70 6c 3b 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 4f  pl;..#endif /* O
33fe0 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 0a 2f 2a  S_VXWORKS */../*
33ff0 0a 2a 2a 20 41 6e 20 61 62 73 74 72 61 63 74 20  .** An abstract 
34000 74 79 70 65 20 66 6f 72 20 61 20 70 6f 69 6e 74  type for a point
34010 65 72 20 74 6f 20 61 6e 20 49 4f 20 6d 65 74 68  er to an IO meth
34020 6f 64 20 66 69 6e 64 65 72 20 66 75 6e 63 74 69  od finder functi
34030 6f 6e 3a 0a 2a 2f 0a 74 79 70 65 64 65 66 20 63  on:.*/.typedef c
34040 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f  onst sqlite3_io_
34050 6d 65 74 68 6f 64 73 20 2a 28 2a 66 69 6e 64 65  methods *(*finde
34060 72 5f 74 79 70 65 29 28 63 6f 6e 73 74 20 63 68  r_type)(const ch
34070 61 72 2a 2c 75 6e 69 78 46 69 6c 65 2a 29 3b 0a  ar*,unixFile*);.
34080 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
34090 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
340a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
340b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
340c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
340d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
340e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 73 71 6c  ************ sql
340f0 69 74 65 33 5f 76 66 73 20 6d 65 74 68 6f 64 73  ite3_vfs methods
34100 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
34110 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
34120 0a 2a 2a 20 54 68 69 73 20 64 69 76 69 73 69 6f  .** This divisio
34130 6e 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 69  n contains the i
34140 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
34150 20 6d 65 74 68 6f 64 73 20 6f 6e 20 74 68 65 0a   methods on the.
34160 2a 2a 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6f  ** sqlite3_vfs o
34170 62 6a 65 63 74 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a  bject..*/../*.**
34180 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
34190 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
341a0 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63 74 75  unixFile structu
341b0 72 65 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  re pointed to by
341c0 20 70 49 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   pId..*/.static 
341d0 69 6e 74 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69  int fillInUnixFi
341e0 6c 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  le(.  sqlite3_vf
341f0 73 20 2a 70 56 66 73 2c 20 20 20 20 20 20 2f 2a  s *pVfs,      /*
34200 20 50 6f 69 6e 74 65 72 20 74 6f 20 76 66 73 20   Pointer to vfs 
34210 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20  object */.  int 
34220 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h,              
34230 20 20 20 20 2f 2a 20 4f 70 65 6e 20 66 69 6c 65      /* Open file
34240 20 64 65 73 63 72 69 70 74 6f 72 20 6f 66 20 66   descriptor of f
34250 69 6c 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 64  ile being opened
34260 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69   */.  sqlite3_fi
34270 6c 65 20 2a 70 49 64 2c 20 20 20 20 20 20 2f 2a  le *pId,      /*
34280 20 57 72 69 74 65 20 74 6f 20 74 68 65 20 75 6e   Write to the un
34290 69 78 46 69 6c 65 20 73 74 72 75 63 74 75 72 65  ixFile structure
342a0 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74   here */.  const
342b0 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
342c0 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68  ,  /* Name of th
342d0 65 20 66 69 6c 65 20 62 65 69 6e 67 20 6f 70 65  e file being ope
342e0 6e 65 64 20 2a 2f 0a 20 20 69 6e 74 20 63 74 72  ned */.  int ctr
342f0 6c 46 6c 61 67 73 20 20 20 20 20 20 20 20 20 20  lFlags          
34300 20 2f 2a 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65   /* Zero or more
34310 20 55 4e 49 58 46 49 4c 45 5f 2a 20 76 61 6c 75   UNIXFILE_* valu
34320 65 73 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74  es */.){.  const
34330 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
34340 6f 64 73 20 2a 70 4c 6f 63 6b 69 6e 67 53 74 79  ods *pLockingSty
34350 6c 65 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  le;.  unixFile *
34360 70 4e 65 77 20 3d 20 28 75 6e 69 78 46 69 6c 65  pNew = (unixFile
34370 20 2a 29 70 49 64 3b 0a 20 20 69 6e 74 20 72 63   *)pId;.  int rc
34380 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
34390 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 70   assert( pNew->p
343a0 49 6e 6f 64 65 3d 3d 4e 55 4c 4c 20 29 3b 0a 0a  Inode==NULL );..
343b0 20 20 2f 2a 20 55 73 75 61 6c 6c 79 20 74 68 65    /* Usually the
343c0 20 70 61 74 68 20 7a 46 69 6c 65 6e 61 6d 65 20   path zFilename 
343d0 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61 20  should not be a 
343e0 72 65 6c 61 74 69 76 65 20 70 61 74 68 6e 61 6d  relative pathnam
343f0 65 2e 20 54 68 65 0a 20 20 2a 2a 20 65 78 63 65  e. The.  ** exce
34400 70 74 69 6f 6e 20 69 73 20 77 68 65 6e 20 6f 70  ption is when op
34410 65 6e 69 6e 67 20 74 68 65 20 70 72 6f 78 79 20  ening the proxy 
34420 22 63 6f 6e 63 68 22 20 66 69 6c 65 20 69 6e 20  "conch" file in 
34430 62 75 69 6c 64 73 20 74 68 61 74 0a 20 20 2a 2a  builds that.  **
34440 20 69 6e 63 6c 75 64 65 20 74 68 65 20 73 70 65   include the spe
34450 63 69 61 6c 20 41 70 70 6c 65 20 6c 6f 63 6b 69  cial Apple locki
34460 6e 67 20 73 74 79 6c 65 73 2e 0a 20 20 2a 2f 0a  ng styles..  */.
34470 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50  #if defined(__AP
34480 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45  PLE__) && SQLITE
34490 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
344a0 53 54 59 4c 45 0a 20 20 61 73 73 65 72 74 28 20  STYLE.  assert( 
344b0 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20  zFilename==0 || 
344c0 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 27 2f  zFilename[0]=='/
344d0 27 20 0a 20 20 20 20 7c 7c 20 70 56 66 73 2d 3e  ' .    || pVfs->
344e0 70 41 70 70 44 61 74 61 3d 3d 28 76 6f 69 64 2a  pAppData==(void*
344f0 29 26 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64  )&autolockIoFind
34500 65 72 20 29 3b 0a 23 65 6c 73 65 0a 20 20 61 73  er );.#else.  as
34510 73 65 72 74 28 20 7a 46 69 6c 65 6e 61 6d 65 3d  sert( zFilename=
34520 3d 30 20 7c 7c 20 7a 46 69 6c 65 6e 61 6d 65 5b  =0 || zFilename[
34530 30 5d 3d 3d 27 2f 27 20 29 3b 0a 23 65 6e 64 69  0]=='/' );.#endi
34540 66 0a 0a 20 20 2f 2a 20 4e 6f 20 6c 6f 63 6b 69  f..  /* No locki
34550 6e 67 20 6f 63 63 75 72 73 20 69 6e 20 74 65 6d  ng occurs in tem
34560 70 6f 72 61 72 79 20 66 69 6c 65 73 20 2a 2f 0a  porary files */.
34570 20 20 61 73 73 65 72 74 28 20 7a 46 69 6c 65 6e    assert( zFilen
34580 61 6d 65 21 3d 30 20 7c 7c 20 28 63 74 72 6c 46  ame!=0 || (ctrlF
34590 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f  lags & UNIXFILE_
345a0 4e 4f 4c 4f 43 4b 29 21 3d 30 20 29 3b 0a 0a 20  NOLOCK)!=0 );.. 
345b0 20 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e 20   OSTRACE(("OPEN 
345c0 20 20 20 25 2d 33 64 20 25 73 5c 6e 22 2c 20 68     %-3d %s\n", h
345d0 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 29 3b 0a 20  , zFilename));. 
345e0 20 70 4e 65 77 2d 3e 68 20 3d 20 68 3b 0a 20 20   pNew->h = h;.  
345f0 70 4e 65 77 2d 3e 70 56 66 73 20 3d 20 70 56 66  pNew->pVfs = pVf
34600 73 3b 0a 20 20 70 4e 65 77 2d 3e 7a 50 61 74 68  s;.  pNew->zPath
34610 20 3d 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20   = zFilename;.  
34620 70 4e 65 77 2d 3e 63 74 72 6c 46 6c 61 67 73 20  pNew->ctrlFlags 
34630 3d 20 28 75 38 29 63 74 72 6c 46 6c 61 67 73 3b  = (u8)ctrlFlags;
34640 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
34650 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 70 4e  MMAP_SIZE>0.  pN
34660 65 77 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20  ew->mmapSizeMax 
34670 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  = sqlite3GlobalC
34680 6f 6e 66 69 67 2e 73 7a 4d 6d 61 70 3b 0a 23 65  onfig.szMmap;.#e
34690 6e 64 69 66 0a 20 20 69 66 28 20 73 71 6c 69 74  ndif.  if( sqlit
346a0 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e 28 28  e3_uri_boolean((
346b0 28 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49  (ctrlFlags & UNI
346c0 58 46 49 4c 45 5f 55 52 49 29 20 3f 20 7a 46 69  XFILE_URI) ? zFi
346d0 6c 65 6e 61 6d 65 20 3a 20 30 29 2c 0a 20 20 20  lename : 0),.   
346e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
346f0 20 20 20 20 20 20 20 20 22 70 73 6f 77 22 2c 20          "psow", 
34700 53 51 4c 49 54 45 5f 50 4f 57 45 52 53 41 46 45  SQLITE_POWERSAFE
34710 5f 4f 56 45 52 57 52 49 54 45 29 20 29 7b 0a 20  _OVERWRITE) ){. 
34720 20 20 20 70 4e 65 77 2d 3e 63 74 72 6c 46 6c 61     pNew->ctrlFla
34730 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 50  gs |= UNIXFILE_P
34740 53 4f 57 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  SOW;.  }.  if( s
34750 74 72 63 6d 70 28 70 56 66 73 2d 3e 7a 4e 61 6d  trcmp(pVfs->zNam
34760 65 2c 22 75 6e 69 78 2d 65 78 63 6c 22 29 3d 3d  e,"unix-excl")==
34770 30 20 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 63  0 ){.    pNew->c
34780 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58  trlFlags |= UNIX
34790 46 49 4c 45 5f 45 58 43 4c 3b 0a 20 20 7d 0a 0a  FILE_EXCL;.  }..
347a0 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20  #if OS_VXWORKS. 
347b0 20 70 4e 65 77 2d 3e 70 49 64 20 3d 20 76 78 77   pNew->pId = vxw
347c0 6f 72 6b 73 46 69 6e 64 46 69 6c 65 49 64 28 7a  orksFindFileId(z
347d0 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28  Filename);.  if(
347e0 20 70 4e 65 77 2d 3e 70 49 64 3d 3d 30 20 29 7b   pNew->pId==0 ){
347f0 0a 20 20 20 20 63 74 72 6c 46 6c 61 67 73 20 7c  .    ctrlFlags |
34800 3d 20 55 4e 49 58 46 49 4c 45 5f 4e 4f 4c 4f 43  = UNIXFILE_NOLOC
34810 4b 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  K;.    rc = SQLI
34820 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 23 65  TE_NOMEM;.  }.#e
34830 6e 64 69 66 0a 0a 20 20 69 66 28 20 63 74 72 6c  ndif..  if( ctrl
34840 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45  Flags & UNIXFILE
34850 5f 4e 4f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70  _NOLOCK ){.    p
34860 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 20 26  LockingStyle = &
34870 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b  nolockIoMethods;
34880 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4c  .  }else{.    pL
34890 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 20 28 2a  ockingStyle = (*
348a0 2a 28 66 69 6e 64 65 72 5f 74 79 70 65 2a 29 70  *(finder_type*)p
348b0 56 66 73 2d 3e 70 41 70 70 44 61 74 61 29 28 7a  Vfs->pAppData)(z
348c0 46 69 6c 65 6e 61 6d 65 2c 20 70 4e 65 77 29 3b  Filename, pNew);
348d0 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
348e0 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
348f0 0a 20 20 20 20 2f 2a 20 43 61 63 68 65 20 7a 46  .    /* Cache zF
34900 69 6c 65 6e 61 6d 65 20 69 6e 20 74 68 65 20 6c  ilename in the l
34910 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 28  ocking context (
34920 41 46 50 20 61 6e 64 20 64 6f 74 6c 6f 63 6b 20  AFP and dotlock 
34930 6f 76 65 72 72 69 64 65 29 20 66 6f 72 0a 20 20  override) for.  
34940 20 20 2a 2a 20 70 72 6f 78 79 4c 6f 63 6b 20 61    ** proxyLock a
34950 63 74 69 76 61 74 69 6f 6e 20 69 73 20 70 6f 73  ctivation is pos
34960 73 69 62 6c 65 20 28 72 65 6d 6f 74 65 20 70 72  sible (remote pr
34970 6f 78 79 20 69 73 20 62 61 73 65 64 20 6f 6e 20  oxy is based on 
34980 64 62 20 6e 61 6d 65 29 0a 20 20 20 20 2a 2a 20  db name).    ** 
34990 7a 46 69 6c 65 6e 61 6d 65 20 72 65 6d 61 69 6e  zFilename remain
349a0 73 20 76 61 6c 69 64 20 75 6e 74 69 6c 20 66 69  s valid until fi
349b0 6c 65 20 69 73 20 63 6c 6f 73 65 64 2c 20 74 6f  le is closed, to
349c0 20 73 75 70 70 6f 72 74 20 2a 2f 0a 20 20 20 20   support */.    
349d0 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  pNew->lockingCon
349e0 74 65 78 74 20 3d 20 28 76 6f 69 64 2a 29 7a 46  text = (void*)zF
349f0 69 6c 65 6e 61 6d 65 3b 0a 23 65 6e 64 69 66 0a  ilename;.#endif.
34a00 20 20 7d 0a 0a 20 20 69 66 28 20 70 4c 6f 63 6b    }..  if( pLock
34a10 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26 70 6f 73  ingStyle == &pos
34a20 69 78 49 6f 4d 65 74 68 6f 64 73 0a 23 69 66 20  ixIoMethods.#if 
34a30 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
34a40 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41  _) && SQLITE_ENA
34a50 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
34a60 45 0a 20 20 20 20 7c 7c 20 70 4c 6f 63 6b 69 6e  E.    || pLockin
34a70 67 53 74 79 6c 65 20 3d 3d 20 26 6e 66 73 49 6f  gStyle == &nfsIo
34a80 4d 65 74 68 6f 64 73 0a 23 65 6e 64 69 66 0a 20  Methods.#endif. 
34a90 20 20 20 20 2f 2a 20 73 75 70 70 6f 72 74 20 57      /* support W
34aa0 41 4c 20 6d 6f 64 65 20 6f 6e 20 72 65 61 64 20  AL mode on read 
34ab0 6f 6e 6c 79 20 6d 6f 75 6e 74 65 64 20 66 69 6c  only mounted fil
34ac0 65 73 79 73 74 65 6d 20 2a 2f 0a 20 20 20 20 7c  esystem */.    |
34ad0 7c 20 28 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65  | (pLockingStyle
34ae0 20 3d 3d 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74   == &nolockIoMet
34af0 68 6f 64 73 20 26 26 20 7a 46 69 6c 65 6e 61 6d  hods && zFilenam
34b00 65 21 3d 30 29 0a 20 20 29 7b 0a 20 20 20 20 75  e!=0).  ){.    u
34b10 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
34b20 0a 20 20 20 20 72 63 20 3d 20 66 69 6e 64 49 6e  .    rc = findIn
34b30 6f 64 65 49 6e 66 6f 28 70 4e 65 77 2c 20 26 70  odeInfo(pNew, &p
34b40 4e 65 77 2d 3e 70 49 6e 6f 64 65 29 3b 0a 20 20  New->pInode);.  
34b50 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
34b60 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  _OK ){.      /* 
34b70 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
34b80 72 72 65 64 20 69 6e 20 66 69 6e 64 49 6e 6f 64  rred in findInod
34b90 65 49 6e 66 6f 28 29 2c 20 63 6c 6f 73 65 20 74  eInfo(), close t
34ba0 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
34bb0 6f 72 0a 20 20 20 20 20 20 2a 2a 20 69 6d 6d 65  or.      ** imme
34bc0 64 69 61 74 65 6c 79 2c 20 62 65 66 6f 72 65 20  diately, before 
34bd0 72 65 6c 65 61 73 69 6e 67 20 74 68 65 20 6d 75  releasing the mu
34be0 74 65 78 2e 20 66 69 6e 64 49 6e 6f 64 65 49 6e  tex. findInodeIn
34bf0 66 6f 28 29 20 6d 61 79 20 66 61 69 6c 0a 20 20  fo() may fail.  
34c00 20 20 20 20 2a 2a 20 69 6e 20 74 77 6f 20 73 63      ** in two sc
34c10 65 6e 61 72 69 6f 73 3a 0a 20 20 20 20 20 20 2a  enarios:.      *
34c20 2a 0a 20 20 20 20 20 20 2a 2a 20 20 20 28 61 29  *.      **   (a)
34c30 20 41 20 63 61 6c 6c 20 74 6f 20 66 73 74 61 74   A call to fstat
34c40 28 29 20 66 61 69 6c 65 64 2e 0a 20 20 20 20 20  () failed..     
34c50 20 2a 2a 20 20 20 28 62 29 20 41 20 6d 61 6c 6c   **   (b) A mall
34c60 6f 63 20 66 61 69 6c 65 64 2e 0a 20 20 20 20 20  oc failed..     
34c70 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 53 63 65   **.      ** Sce
34c80 6e 61 72 69 6f 20 28 62 29 20 6d 61 79 20 6f 6e  nario (b) may on
34c90 6c 79 20 6f 63 63 75 72 20 69 66 20 74 68 65 20  ly occur if the 
34ca0 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64 69  process is holdi
34cb0 6e 67 20 6e 6f 20 6f 74 68 65 72 0a 20 20 20 20  ng no other.    
34cc0 20 20 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69    ** file descri
34cd0 70 74 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68  ptors open on th
34ce0 65 20 73 61 6d 65 20 66 69 6c 65 2e 20 49 66 20  e same file. If 
34cf0 74 68 65 72 65 20 77 65 72 65 20 6f 74 68 65 72  there were other
34d00 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 64   file.      ** d
34d10 65 73 63 72 69 70 74 6f 72 73 20 6f 6e 20 74 68  escriptors on th
34d20 69 73 20 66 69 6c 65 2c 20 74 68 65 6e 20 6e 6f  is file, then no
34d30 20 6d 61 6c 6c 6f 63 20 77 6f 75 6c 64 20 62 65   malloc would be
34d40 20 72 65 71 75 69 72 65 64 20 62 79 0a 20 20 20   required by.   
34d50 20 20 20 2a 2a 20 66 69 6e 64 49 6e 6f 64 65 49     ** findInodeI
34d60 6e 66 6f 28 29 2e 20 49 66 20 74 68 69 73 20 69  nfo(). If this i
34d70 73 20 74 68 65 20 63 61 73 65 2c 20 69 74 20 69  s the case, it i
34d80 73 20 71 75 69 74 65 20 73 61 66 65 20 74 6f 20  s quite safe to 
34d90 63 6c 6f 73 65 0a 20 20 20 20 20 20 2a 2a 20 68  close.      ** h
34da0 61 6e 64 6c 65 20 68 20 2d 20 61 73 20 69 74 20  andle h - as it 
34db0 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 68  is guaranteed th
34dc0 61 74 20 6e 6f 20 70 6f 73 69 78 20 6c 6f 63 6b  at no posix lock
34dd0 73 20 77 69 6c 6c 20 62 65 20 72 65 6c 65 61 73  s will be releas
34de0 65 64 0a 20 20 20 20 20 20 2a 2a 20 62 79 20 64  ed.      ** by d
34df0 6f 69 6e 67 20 73 6f 2e 0a 20 20 20 20 20 20 2a  oing so..      *
34e00 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 73 63  *.      ** If sc
34e10 65 6e 61 72 69 6f 20 28 61 29 20 63 61 75 73 65  enario (a) cause
34e20 64 20 74 68 65 20 65 72 72 6f 72 20 74 68 65 6e  d the error then
34e30 20 74 68 69 6e 67 73 20 61 72 65 20 6e 6f 74 20   things are not 
34e40 73 6f 20 73 61 66 65 2e 20 54 68 65 0a 20 20 20  so safe. The.   
34e50 20 20 20 2a 2a 20 69 6d 70 6c 69 63 69 74 20 61     ** implicit a
34e60 73 73 75 6d 70 74 69 6f 6e 20 68 65 72 65 20 69  ssumption here i
34e70 73 20 74 68 61 74 20 69 66 20 66 73 74 61 74 28  s that if fstat(
34e80 29 20 66 61 69 6c 73 2c 20 74 68 69 6e 67 73 20  ) fails, things 
34e90 61 72 65 20 69 6e 0a 20 20 20 20 20 20 2a 2a 20  are in.      ** 
34ea0 73 75 63 68 20 62 61 64 20 73 68 61 70 65 20 74  such bad shape t
34eb0 68 61 74 20 64 72 6f 70 70 69 6e 67 20 61 20 6c  hat dropping a l
34ec0 6f 63 6b 20 6f 72 20 74 77 6f 20 64 6f 65 73 6e  ock or two doesn
34ed0 27 74 20 6d 61 74 74 65 72 20 6d 75 63 68 2e 0a  't matter much..
34ee0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
34ef0 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 4e 65 77  obust_close(pNew
34f00 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a  , h, __LINE__);.
34f10 20 20 20 20 20 20 68 20 3d 20 2d 31 3b 0a 20 20        h = -1;.  
34f20 20 20 7d 0a 20 20 20 20 75 6e 69 78 4c 65 61 76    }.    unixLeav
34f30 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a 0a 23  eMutex();.  }..#
34f40 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
34f50 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26  _LOCKING_STYLE &
34f60 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  & defined(__APPL
34f70 45 5f 5f 29 0a 20 20 65 6c 73 65 20 69 66 28 20  E__).  else if( 
34f80 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d  pLockingStyle ==
34f90 20 26 61 66 70 49 6f 4d 65 74 68 6f 64 73 20 29   &afpIoMethods )
34fa0 7b 0a 20 20 20 20 2f 2a 20 41 46 50 20 6c 6f 63  {.    /* AFP loc
34fb0 6b 69 6e 67 20 75 73 65 73 20 74 68 65 20 66 69  king uses the fi
34fc0 6c 65 20 70 61 74 68 20 73 6f 20 69 74 20 6e 65  le path so it ne
34fd0 65 64 73 20 74 6f 20 62 65 20 69 6e 63 6c 75 64  eds to be includ
34fe0 65 64 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65  ed in.    ** the
34ff0 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65   afpLockingConte
35000 78 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  xt..    */.    a
35010 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
35020 20 2a 70 43 74 78 3b 0a 20 20 20 20 70 4e 65 77   *pCtx;.    pNew
35030 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
35040 20 3d 20 70 43 74 78 20 3d 20 73 71 6c 69 74 65   = pCtx = sqlite
35050 33 5f 6d 61 6c 6c 6f 63 36 34 28 20 73 69 7a 65  3_malloc64( size
35060 6f 66 28 2a 70 43 74 78 29 20 29 3b 0a 20 20 20  of(*pCtx) );.   
35070 20 69 66 28 20 70 43 74 78 3d 3d 30 20 29 7b 0a   if( pCtx==0 ){.
35080 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
35090 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c  E_NOMEM;.    }el
350a0 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 42 3a  se{.      /* NB:
350b0 20 7a 46 69 6c 65 6e 61 6d 65 20 65 78 69 73 74   zFilename exist
350c0 73 20 61 6e 64 20 72 65 6d 61 69 6e 73 20 76 61  s and remains va
350d0 6c 69 64 20 75 6e 74 69 6c 20 74 68 65 20 66 69  lid until the fi
350e0 6c 65 20 69 73 20 63 6c 6f 73 65 64 0a 20 20 20  le is closed.   
350f0 20 20 20 2a 2a 20 61 63 63 6f 72 64 69 6e 67 20     ** according 
35100 74 6f 20 72 65 71 75 69 72 65 6d 65 6e 74 20 46  to requirement F
35110 31 31 31 34 31 2e 20 20 53 6f 20 77 65 20 64 6f  11141.  So we do
35120 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 6d 61 6b   not need to mak
35130 65 20 61 0a 20 20 20 20 20 20 2a 2a 20 63 6f 70  e a.      ** cop
35140 79 20 6f 66 20 74 68 65 20 66 69 6c 65 6e 61 6d  y of the filenam
35150 65 2e 20 2a 2f 0a 20 20 20 20 20 20 70 43 74 78  e. */.      pCtx
35160 2d 3e 64 62 50 61 74 68 20 3d 20 7a 46 69 6c 65  ->dbPath = zFile
35170 6e 61 6d 65 3b 0a 20 20 20 20 20 20 70 43 74 78  name;.      pCtx
35180 2d 3e 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a  ->reserved = 0;.
35190 20 20 20 20 20 20 73 72 61 6e 64 6f 6d 64 65 76        srandomdev
351a0 28 29 3b 0a 20 20 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 20 20 72 63 20 3d 20 66 69 6e 64 49 6e 6f 64 65    rc = findInode
351d0 49 6e 66 6f 28 70 4e 65 77 2c 20 26 70 4e 65 77  Info(pNew, &pNew
351e0 2d 3e 70 49 6e 6f 64 65 29 3b 0a 20 20 20 20 20  ->pInode);.     
351f0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
35200 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  OK ){.        sq
35210 6c 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77 2d  lite3_free(pNew-
35220 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29  >lockingContext)
35230 3b 0a 20 20 20 20 20 20 20 20 72 6f 62 75 73 74  ;.        robust
35240 5f 63 6c 6f 73 65 28 70 4e 65 77 2c 20 68 2c 20  _close(pNew, h, 
35250 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20  __LINE__);.     
35260 20 20 20 68 20 3d 20 2d 31 3b 0a 20 20 20 20 20     h = -1;.     
35270 20 7d 0a 20 20 20 20 20 20 75 6e 69 78 4c 65 61   }.      unixLea
35280 76 65 4d 75 74 65 78 28 29 3b 20 20 20 20 20 20  veMutex();      
35290 20 20 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e    .    }.  }.#en
352a0 64 69 66 0a 0a 20 20 65 6c 73 65 20 69 66 28 20  dif..  else if( 
352b0 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d  pLockingStyle ==
352c0 20 26 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68 6f   &dotlockIoMetho
352d0 64 73 20 29 7b 0a 20 20 20 20 2f 2a 20 44 6f 74  ds ){.    /* Dot
352e0 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 75 73 65  file locking use
352f0 73 20 74 68 65 20 66 69 6c 65 20 70 61 74 68 20  s the file path 
35300 73 6f 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62  so it needs to b
35310 65 20 69 6e 63 6c 75 64 65 64 20 69 6e 0a 20 20  e included in.  
35320 20 20 2a 2a 20 74 68 65 20 64 6f 74 6c 6f 63 6b    ** the dotlock
35330 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 0a  LockingContext .
35340 20 20 20 20 2a 2f 0a 20 20 20 20 63 68 61 72 20      */.    char 
35350 2a 7a 4c 6f 63 6b 46 69 6c 65 3b 0a 20 20 20 20  *zLockFile;.    
35360 69 6e 74 20 6e 46 69 6c 65 6e 61 6d 65 3b 0a 20  int nFilename;. 
35370 20 20 20 61 73 73 65 72 74 28 20 7a 46 69 6c 65     assert( zFile
35380 6e 61 6d 65 21 3d 30 20 29 3b 0a 20 20 20 20 6e  name!=0 );.    n
35390 46 69 6c 65 6e 61 6d 65 20 3d 20 28 69 6e 74 29  Filename = (int)
353a0 73 74 72 6c 65 6e 28 7a 46 69 6c 65 6e 61 6d 65  strlen(zFilename
353b0 29 20 2b 20 36 3b 0a 20 20 20 20 7a 4c 6f 63 6b  ) + 6;.    zLock
353c0 46 69 6c 65 20 3d 20 28 63 68 61 72 20 2a 29 73  File = (char *)s
353d0 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28  qlite3_malloc64(
353e0 6e 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  nFilename);.    
353f0 69 66 28 20 7a 4c 6f 63 6b 46 69 6c 65 3d 3d 30  if( zLockFile==0
35400 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
35410 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
35420 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
35430 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
35440 46 69 6c 65 6e 61 6d 65 2c 20 7a 4c 6f 63 6b 46  Filename, zLockF
35450 69 6c 65 2c 20 22 25 73 22 20 44 4f 54 4c 4f 43  ile, "%s" DOTLOC
35460 4b 5f 53 55 46 46 49 58 2c 20 7a 46 69 6c 65 6e  K_SUFFIX, zFilen
35470 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ame);.    }.    
35480 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  pNew->lockingCon
35490 74 65 78 74 20 3d 20 7a 4c 6f 63 6b 46 69 6c 65  text = zLockFile
354a0 3b 0a 20 20 7d 0a 0a 23 69 66 20 4f 53 5f 56 58  ;.  }..#if OS_VX
354b0 57 4f 52 4b 53 0a 20 20 65 6c 73 65 20 69 66 28  WORKS.  else if(
354c0 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d   pLockingStyle =
354d0 3d 20 26 73 65 6d 49 6f 4d 65 74 68 6f 64 73 20  = &semIoMethods 
354e0 29 7b 0a 20 20 20 20 2f 2a 20 4e 61 6d 65 64 20  ){.    /* Named 
354f0 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e  semaphore lockin
35500 67 20 75 73 65 73 20 74 68 65 20 66 69 6c 65 20  g uses the file 
35510 70 61 74 68 20 73 6f 20 69 74 20 6e 65 65 64 73  path so it needs
35520 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20 69 6e   to be.    ** in
35530 63 6c 75 64 65 64 20 69 6e 20 74 68 65 20 73 65  cluded in the se
35540 6d 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 0a  mLockingContext.
35550 20 20 20 20 2a 2f 0a 20 20 20 20 75 6e 69 78 45      */.    unixE
35560 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20  nterMutex();.   
35570 20 72 63 20 3d 20 66 69 6e 64 49 6e 6f 64 65 49   rc = findInodeI
35580 6e 66 6f 28 70 4e 65 77 2c 20 26 70 4e 65 77 2d  nfo(pNew, &pNew-
35590 3e 70 49 6e 6f 64 65 29 3b 0a 20 20 20 20 69 66  >pInode);.    if
355a0 28 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  ( (rc==SQLITE_OK
355b0 29 20 26 26 20 28 70 4e 65 77 2d 3e 70 49 6e 6f  ) && (pNew->pIno
355c0 64 65 2d 3e 70 53 65 6d 3d 3d 4e 55 4c 4c 29 20  de->pSem==NULL) 
355d0 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  ){.      char *z
355e0 53 65 6d 4e 61 6d 65 20 3d 20 70 4e 65 77 2d 3e  SemName = pNew->
355f0 70 49 6e 6f 64 65 2d 3e 61 53 65 6d 4e 61 6d 65  pInode->aSemName
35600 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20  ;.      int n;. 
35610 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
35620 72 69 6e 74 66 28 4d 41 58 5f 50 41 54 48 4e 41  rintf(MAX_PATHNA
35630 4d 45 2c 20 7a 53 65 6d 4e 61 6d 65 2c 20 22 2f  ME, zSemName, "/
35640 25 73 2e 73 65 6d 22 2c 0a 20 20 20 20 20 20 20  %s.sem",.       
35650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35660 70 4e 65 77 2d 3e 70 49 64 2d 3e 7a 43 61 6e 6f  pNew->pId->zCano
35670 6e 69 63 61 6c 4e 61 6d 65 29 3b 0a 20 20 20 20  nicalName);.    
35680 20 20 66 6f 72 28 20 6e 3d 31 3b 20 7a 53 65 6d    for( n=1; zSem
35690 4e 61 6d 65 5b 6e 5d 3b 20 6e 2b 2b 20 29 0a 20  Name[n]; n++ ). 
356a0 20 20 20 20 20 20 20 69 66 28 20 7a 53 65 6d 4e         if( zSemN
356b0 61 6d 65 5b 6e 5d 3d 3d 27 2f 27 20 29 20 7a 53  ame[n]=='/' ) zS
356c0 65 6d 4e 61 6d 65 5b 6e 5d 20 3d 20 27 5f 27 3b  emName[n] = '_';
356d0 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 49 6e  .      pNew->pIn
356e0 6f 64 65 2d 3e 70 53 65 6d 20 3d 20 73 65 6d 5f  ode->pSem = sem_
356f0 6f 70 65 6e 28 7a 53 65 6d 4e 61 6d 65 2c 20 4f  open(zSemName, O
35700 5f 43 52 45 41 54 2c 20 30 36 36 36 2c 20 31 29  _CREAT, 0666, 1)
35710 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e 65 77  ;.      if( pNew
35720 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 20 3d  ->pInode->pSem =
35730 3d 20 53 45 4d 5f 46 41 49 4c 45 44 20 29 7b 0a  = SEM_FAILED ){.
35740 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
35750 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
35760 20 20 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d     pNew->pInode-
35770 3e 61 53 65 6d 4e 61 6d 65 5b 30 5d 20 3d 20 27  >aSemName[0] = '
35780 5c 30 27 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  \0';.      }.   
35790 20 7d 0a 20 20 20 20 75 6e 69 78 4c 65 61 76 65   }.    unixLeave
357a0 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a 23 65 6e  Mutex();.  }.#en
357b0 64 69 66 0a 20 20 0a 20 20 73 74 6f 72 65 4c 61  dif.  .  storeLa
357c0 73 74 45 72 72 6e 6f 28 70 4e 65 77 2c 20 30 29  stErrno(pNew, 0)
357d0 3b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53  ;.#if OS_VXWORKS
357e0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
357f0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
35800 68 3e 3d 30 20 29 20 72 6f 62 75 73 74 5f 63 6c  h>=0 ) robust_cl
35810 6f 73 65 28 70 4e 65 77 2c 20 68 2c 20 5f 5f 4c  ose(pNew, h, __L
35820 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 68 20 3d 20  INE__);.    h = 
35830 2d 31 3b 0a 20 20 20 20 6f 73 55 6e 6c 69 6e 6b  -1;.    osUnlink
35840 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20  (zFilename);.   
35850 20 70 4e 65 77 2d 3e 63 74 72 6c 46 6c 61 67 73   pNew->ctrlFlags
35860 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 44 45 4c   |= UNIXFILE_DEL
35870 45 54 45 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  ETE;.  }.#endif.
35880 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
35890 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 68  _OK ){.    if( h
358a0 3e 3d 30 20 29 20 72 6f 62 75 73 74 5f 63 6c 6f  >=0 ) robust_clo
358b0 73 65 28 70 4e 65 77 2c 20 68 2c 20 5f 5f 4c 49  se(pNew, h, __LI
358c0 4e 45 5f 5f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  NE__);.  }else{.
358d0 20 20 20 20 70 4e 65 77 2d 3e 70 4d 65 74 68 6f      pNew->pMetho
358e0 64 20 3d 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c  d = pLockingStyl
358f0 65 3b 0a 20 20 20 20 4f 70 65 6e 43 6f 75 6e 74  e;.    OpenCount
35900 65 72 28 2b 31 29 3b 0a 20 20 20 20 76 65 72 69  er(+1);.    veri
35910 66 79 44 62 46 69 6c 65 28 70 4e 65 77 29 3b 0a  fyDbFile(pNew);.
35920 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
35930 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
35940 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 64   the name of a d
35950 69 72 65 63 74 6f 72 79 20 69 6e 20 77 68 69 63  irectory in whic
35960 68 20 74 6f 20 70 75 74 20 74 65 6d 70 6f 72 61  h to put tempora
35970 72 79 20 66 69 6c 65 73 2e 0a 2a 2a 20 49 66 20  ry files..** If 
35980 6e 6f 20 73 75 69 74 61 62 6c 65 20 74 65 6d 70  no suitable temp
35990 6f 72 61 72 79 20 66 69 6c 65 20 64 69 72 65 63  orary file direc
359a0 74 6f 72 79 20 63 61 6e 20 62 65 20 66 6f 75 6e  tory can be foun
359b0 64 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a  d, return NULL..
359c0 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
359d0 63 68 61 72 20 2a 75 6e 69 78 54 65 6d 70 46 69  char *unixTempFi
359e0 6c 65 44 69 72 28 76 6f 69 64 29 7b 0a 20 20 73  leDir(void){.  s
359f0 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
35a00 20 2a 61 7a 44 69 72 73 5b 5d 20 3d 20 7b 0a 20   *azDirs[] = {. 
35a10 20 20 20 20 30 2c 0a 20 20 20 20 20 30 2c 0a 20      0,.     0,. 
35a20 20 20 20 20 30 2c 0a 20 20 20 20 20 22 2f 76 61      0,.     "/va
35a30 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20 22 2f 75  r/tmp",.     "/u
35a40 73 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20 22 2f  sr/tmp",.     "/
35a50 74 6d 70 22 2c 0a 20 20 20 20 20 30 20 20 20 20  tmp",.     0    
35a60 20 20 20 20 2f 2a 20 4c 69 73 74 20 74 65 72 6d      /* List term
35a70 69 6e 61 74 6f 72 20 2a 2f 0a 20 20 7d 3b 0a 20  inator */.  };. 
35a80 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 3b   unsigned int i;
35a90 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 20 62  .  struct stat b
35aa0 75 66 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  uf;.  const char
35ab0 20 2a 7a 44 69 72 20 3d 20 30 3b 0a 0a 20 20 61   *zDir = 0;..  a
35ac0 7a 44 69 72 73 5b 30 5d 20 3d 20 73 71 6c 69 74  zDirs[0] = sqlit
35ad0 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72  e3_temp_director
35ae0 79 3b 0a 20 20 69 66 28 20 21 61 7a 44 69 72 73  y;.  if( !azDirs
35af0 5b 31 5d 20 29 20 61 7a 44 69 72 73 5b 31 5d 20  [1] ) azDirs[1] 
35b00 3d 20 67 65 74 65 6e 76 28 22 53 51 4c 49 54 45  = getenv("SQLITE
35b10 5f 54 4d 50 44 49 52 22 29 3b 0a 20 20 69 66 28  _TMPDIR");.  if(
35b20 20 21 61 7a 44 69 72 73 5b 32 5d 20 29 20 61 7a   !azDirs[2] ) az
35b30 44 69 72 73 5b 32 5d 20 3d 20 67 65 74 65 6e 76  Dirs[2] = getenv
35b40 28 22 54 4d 50 44 49 52 22 29 3b 0a 20 20 66 6f  ("TMPDIR");.  fo
35b50 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28  r(i=0; i<sizeof(
35b60 61 7a 44 69 72 73 29 2f 73 69 7a 65 6f 66 28 61  azDirs)/sizeof(a
35b70 7a 44 69 72 73 5b 30 5d 29 3b 20 7a 44 69 72 3d  zDirs[0]); zDir=
35b80 61 7a 44 69 72 73 5b 69 2b 2b 5d 29 7b 0a 20 20  azDirs[i++]){.  
35b90 20 20 69 66 28 20 7a 44 69 72 3d 3d 30 20 29 20    if( zDir==0 ) 
35ba0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
35bb0 28 20 6f 73 53 74 61 74 28 7a 44 69 72 2c 20 26  ( osStat(zDir, &
35bc0 62 75 66 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  buf) ) continue;
35bd0 0a 20 20 20 20 69 66 28 20 21 53 5f 49 53 44 49  .    if( !S_ISDI
35be0 52 28 62 75 66 2e 73 74 5f 6d 6f 64 65 29 20 29  R(buf.st_mode) )
35bf0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
35c00 66 28 20 6f 73 41 63 63 65 73 73 28 7a 44 69 72  f( osAccess(zDir
35c10 2c 20 30 37 29 20 29 20 63 6f 6e 74 69 6e 75 65  , 07) ) continue
35c20 3b 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  ;.    break;.  }
35c30 0a 20 20 72 65 74 75 72 6e 20 7a 44 69 72 3b 0a  .  return zDir;.
35c40 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
35c50 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
35c60 20 6e 61 6d 65 20 69 6e 20 7a 42 75 66 2e 20 20   name in zBuf.  
35c70 7a 42 75 66 20 6d 75 73 74 20 62 65 20 61 6c 6c  zBuf must be all
35c80 6f 63 61 74 65 64 0a 2a 2a 20 62 79 20 74 68 65  ocated.** by the
35c90 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65 73 73   calling process
35ca0 20 61 6e 64 20 6d 75 73 74 20 62 65 20 62 69 67   and must be big
35cb0 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20   enough to hold 
35cc0 61 74 20 6c 65 61 73 74 0a 2a 2a 20 70 56 66 73  at least.** pVfs
35cd0 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20 62 79 74  ->mxPathname byt
35ce0 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  es..*/.static in
35cf0 74 20 75 6e 69 78 47 65 74 54 65 6d 70 6e 61 6d  t unixGetTempnam
35d00 65 28 69 6e 74 20 6e 42 75 66 2c 20 63 68 61 72  e(int nBuf, char
35d10 20 2a 7a 42 75 66 29 7b 0a 20 20 73 74 61 74 69   *zBuf){.  stati
35d20 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64  c const unsigned
35d30 20 63 68 61 72 20 7a 43 68 61 72 73 5b 5d 20 3d   char zChars[] =
35d40 0a 20 20 20 20 22 61 62 63 64 65 66 67 68 69 6a  .    "abcdefghij
35d50 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a  klmnopqrstuvwxyz
35d60 22 0a 20 20 20 20 22 41 42 43 44 45 46 47 48 49  ".    "ABCDEFGHI
35d70 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58 59  JKLMNOPQRSTUVWXY
35d80 5a 22 0a 20 20 20 20 22 30 31 32 33 34 35 36 37  Z".    "01234567
35d90 38 39 22 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  89";.  unsigned 
35da0 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 63 6f 6e 73  int i, j;.  cons
35db0 74 20 63 68 61 72 20 2a 7a 44 69 72 3b 0a 0a 20  t char *zDir;.. 
35dc0 20 2f 2a 20 49 74 27 73 20 6f 64 64 20 74 6f 20   /* It's odd to 
35dd0 73 69 6d 75 6c 61 74 65 20 61 6e 20 69 6f 2d 65  simulate an io-e
35de0 72 72 6f 72 20 68 65 72 65 2c 20 62 75 74 20 72  rror here, but r
35df0 65 61 6c 6c 79 20 74 68 69 73 20 69 73 20 6a 75  eally this is ju
35e00 73 74 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74 68  st.  ** using th
35e10 65 20 69 6f 2d 65 72 72 6f 72 20 69 6e 66 72 61  e io-error infra
35e20 73 74 72 75 63 74 75 72 65 20 74 6f 20 74 65 73  structure to tes
35e30 74 20 74 68 61 74 20 53 51 4c 69 74 65 20 68 61  t that SQLite ha
35e40 6e 64 6c 65 73 20 74 68 69 73 0a 20 20 2a 2a 20  ndles this.  ** 
35e50 66 75 6e 63 74 69 6f 6e 20 66 61 69 6c 69 6e 67  function failing
35e60 2e 20 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61  . .  */.  Simula
35e70 74 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72  teIOError( retur
35e80 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29  n SQLITE_IOERR )
35e90 3b 0a 0a 20 20 7a 44 69 72 20 3d 20 75 6e 69 78  ;..  zDir = unix
35ea0 54 65 6d 70 46 69 6c 65 44 69 72 28 29 3b 0a 20  TempFileDir();. 
35eb0 20 69 66 28 20 7a 44 69 72 3d 3d 30 20 29 20 7a   if( zDir==0 ) z
35ec0 44 69 72 20 3d 20 22 2e 22 3b 0a 0a 20 20 2f 2a  Dir = ".";..  /*
35ed0 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   Check that the 
35ee0 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 69 73  output buffer is
35ef0 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 66 6f   large enough fo
35f00 72 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  r the temporary 
35f10 66 69 6c 65 20 0a 20 20 2a 2a 20 6e 61 6d 65 2e  file .  ** name.
35f20 20 49 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 72   If it is not, r
35f30 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
35f40 4f 52 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28  OR..  */.  if( (
35f50 73 74 72 6c 65 6e 28 7a 44 69 72 29 20 2b 20 73  strlen(zDir) + s
35f60 74 72 6c 65 6e 28 53 51 4c 49 54 45 5f 54 45 4d  trlen(SQLITE_TEM
35f70 50 5f 46 49 4c 45 5f 50 52 45 46 49 58 29 20 2b  P_FILE_PREFIX) +
35f80 20 31 38 29 20 3e 3d 20 28 73 69 7a 65 5f 74 29   18) >= (size_t)
35f90 6e 42 75 66 20 29 7b 0a 20 20 20 20 72 65 74 75  nBuf ){.    retu
35fa0 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
35fb0 0a 20 20 7d 0a 0a 20 20 64 6f 7b 0a 20 20 20 20  .  }..  do{.    
35fc0 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
35fd0 28 6e 42 75 66 2d 31 38 2c 20 7a 42 75 66 2c 20  (nBuf-18, zBuf, 
35fe0 22 25 73 2f 22 53 51 4c 49 54 45 5f 54 45 4d 50  "%s/"SQLITE_TEMP
35ff0 5f 46 49 4c 45 5f 50 52 45 46 49 58 2c 20 7a 44  _FILE_PREFIX, zD
36000 69 72 29 3b 0a 20 20 20 20 6a 20 3d 20 28 69 6e  ir);.    j = (in
36010 74 29 73 74 72 6c 65 6e 28 7a 42 75 66 29 3b 0a  t)strlen(zBuf);.
36020 20 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64      sqlite3_rand
36030 6f 6d 6e 65 73 73 28 31 35 2c 20 26 7a 42 75 66  omness(15, &zBuf
36040 5b 6a 5d 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  [j]);.    for(i=
36050 30 3b 20 69 3c 31 35 3b 20 69 2b 2b 2c 20 6a 2b  0; i<15; i++, j+
36060 2b 29 7b 0a 20 20 20 20 20 20 7a 42 75 66 5b 6a  +){.      zBuf[j
36070 5d 20 3d 20 28 63 68 61 72 29 7a 43 68 61 72 73  ] = (char)zChars
36080 5b 20 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61  [ ((unsigned cha
36090 72 29 7a 42 75 66 5b 6a 5d 29 25 28 73 69 7a 65  r)zBuf[j])%(size
360a0 6f 66 28 7a 43 68 61 72 73 29 2d 31 29 20 5d 3b  of(zChars)-1) ];
360b0 0a 20 20 20 20 7d 0a 20 20 20 20 7a 42 75 66 5b  .    }.    zBuf[
360c0 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 7a 42 75 66  j] = 0;.    zBuf
360d0 5b 6a 2b 31 5d 20 3d 20 30 3b 0a 20 20 7d 77 68  [j+1] = 0;.  }wh
360e0 69 6c 65 28 20 6f 73 41 63 63 65 73 73 28 7a 42  ile( osAccess(zB
360f0 75 66 2c 30 29 3d 3d 30 20 29 3b 0a 20 20 72 65  uf,0)==0 );.  re
36100 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
36110 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e  }..#if SQLITE_EN
36120 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
36130 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f  LE && defined(__
36140 41 50 50 4c 45 5f 5f 29 0a 2f 2a 0a 2a 2a 20 52  APPLE__)./*.** R
36150 6f 75 74 69 6e 65 20 74 6f 20 74 72 61 6e 73 66  outine to transf
36160 6f 72 6d 20 61 20 75 6e 69 78 46 69 6c 65 20 69  orm a unixFile i
36170 6e 74 6f 20 61 20 70 72 6f 78 79 2d 6c 6f 63 6b  nto a proxy-lock
36180 69 6e 67 20 75 6e 69 78 46 69 6c 65 2e 0a 2a 2a  ing unixFile..**
36190 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   Implementation 
361a0 69 6e 20 74 68 65 20 70 72 6f 78 79 2d 6c 6f 63  in the proxy-loc
361b0 6b 20 64 69 76 69 73 69 6f 6e 2c 20 62 75 74 20  k division, but 
361c0 75 73 65 64 20 62 79 20 75 6e 69 78 4f 70 65 6e  used by unixOpen
361d0 28 29 0a 2a 2a 20 69 66 20 53 51 4c 49 54 45 5f  ().** if SQLITE_
361e0 50 52 45 46 45 52 5f 50 52 4f 58 59 5f 4c 4f 43  PREFER_PROXY_LOC
361f0 4b 49 4e 47 20 69 73 20 64 65 66 69 6e 65 64 2e  KING is defined.
36200 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
36210 72 6f 78 79 54 72 61 6e 73 66 6f 72 6d 55 6e 69  roxyTransformUni
36220 78 46 69 6c 65 28 75 6e 69 78 46 69 6c 65 2a 2c  xFile(unixFile*,
36230 20 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a 23   const char*);.#
36240 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 65 61  endif../*.** Sea
36250 72 63 68 20 66 6f 72 20 61 6e 20 75 6e 75 73 65  rch for an unuse
36260 64 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  d file descripto
36270 72 20 74 68 61 74 20 77 61 73 20 6f 70 65 6e 65  r that was opene
36280 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  d on the databas
36290 65 20 0a 2a 2a 20 66 69 6c 65 20 28 6e 6f 74 20  e .** file (not 
362a0 61 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 6d 61 73  a journal or mas
362b0 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter-journal file
362c0 29 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20  ) identified by 
362d0 70 61 74 68 6e 61 6d 65 0a 2a 2a 20 7a 50 61 74  pathname.** zPat
362e0 68 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4f 50  h with SQLITE_OP
362f0 45 4e 5f 58 58 58 20 66 6c 61 67 73 20 6d 61 74  EN_XXX flags mat
36300 63 68 69 6e 67 20 74 68 6f 73 65 20 70 61 73 73  ching those pass
36310 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
36320 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  .** argument to 
36330 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  this function..*
36340 2a 0a 2a 2a 20 53 75 63 68 20 61 20 66 69 6c 65  *.** Such a file
36350 20 64 65 73 63 72 69 70 74 6f 72 20 6d 61 79 20   descriptor may 
36360 65 78 69 73 74 20 69 66 20 61 20 64 61 74 61 62  exist if a datab
36370 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77  ase connection w
36380 61 73 20 63 6c 6f 73 65 64 0a 2a 2a 20 62 75 74  as closed.** but
36390 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20   the associated 
363a0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
363b0 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 63 6c 6f  could not be clo
363c0 73 65 64 20 62 65 63 61 75 73 65 20 73 6f 6d 65  sed because some
363d0 0a 2a 2a 20 6f 74 68 65 72 20 66 69 6c 65 20 64  .** other file d
363e0 65 73 63 72 69 70 74 6f 72 20 6f 70 65 6e 20 6f  escriptor open o
363f0 6e 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 20  n the same file 
36400 69 73 20 68 6f 6c 64 69 6e 67 20 61 20 66 69 6c  is holding a fil
36410 65 2d 6c 6f 63 6b 2e 0a 2a 2a 20 52 65 66 65 72  e-lock..** Refer
36420 20 74 6f 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20   to comments in 
36430 74 68 65 20 75 6e 69 78 43 6c 6f 73 65 28 29 20  the unixClose() 
36440 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 74 68 65  function and the
36450 20 6c 65 6e 67 74 68 79 20 63 6f 6d 6d 65 6e 74   lengthy comment
36460 0a 2a 2a 20 64 65 73 63 72 69 62 69 6e 67 20 22  .** describing "
36470 50 6f 73 69 78 20 41 64 76 69 73 6f 72 79 20 4c  Posix Advisory L
36480 6f 63 6b 69 6e 67 22 20 61 74 20 74 68 65 20 73  ocking" at the s
36490 74 61 72 74 20 6f 66 20 74 68 69 73 20 66 69 6c  tart of this fil
364a0 65 20 66 6f 72 20 0a 2a 2a 20 66 75 72 74 68 65  e for .** furthe
364b0 72 20 64 65 74 61 69 6c 73 2e 20 41 6c 73 6f 2c  r details. Also,
364c0 20 74 69 63 6b 65 74 20 23 34 30 31 38 2e 0a 2a   ticket #4018..*
364d0 2a 0a 2a 2a 20 49 66 20 61 20 73 75 69 74 61 62  *.** If a suitab
364e0 6c 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  le file descript
364f0 6f 72 20 69 73 20 66 6f 75 6e 64 2c 20 74 68 65  or is found, the
36500 6e 20 69 74 20 69 73 20 72 65 74 75 72 6e 65 64  n it is returned
36510 2e 20 49 66 20 6e 6f 0a 2a 2a 20 73 75 63 68 20  . If no.** such 
36520 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
36530 69 73 20 6c 6f 63 61 74 65 64 2c 20 2d 31 20 69  is located, -1 i
36540 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
36550 74 61 74 69 63 20 55 6e 69 78 55 6e 75 73 65 64  tatic UnixUnused
36560 46 64 20 2a 66 69 6e 64 52 65 75 73 61 62 6c 65  Fd *findReusable
36570 46 64 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  Fd(const char *z
36580 50 61 74 68 2c 20 69 6e 74 20 66 6c 61 67 73 29  Path, int flags)
36590 7b 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64  {.  UnixUnusedFd
365a0 20 2a 70 55 6e 75 73 65 64 20 3d 20 30 3b 0a 0a   *pUnused = 0;..
365b0 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 65 61 72    /* Do not sear
365c0 63 68 20 66 6f 72 20 61 6e 20 75 6e 75 73 65 64  ch for an unused
365d0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
365e0 20 6f 6e 20 76 78 77 6f 72 6b 73 2e 20 4e 6f 74   on vxworks. Not
365f0 20 62 65 63 61 75 73 65 0a 20 20 2a 2a 20 76 78   because.  ** vx
36600 77 6f 72 6b 73 20 77 6f 75 6c 64 20 6e 6f 74 20  works would not 
36610 62 65 6e 65 66 69 74 20 66 72 6f 6d 20 74 68 65  benefit from the
36620 20 63 68 61 6e 67 65 20 28 69 74 20 6d 69 67 68   change (it migh
36630 74 2c 20 77 65 27 72 65 20 6e 6f 74 20 73 75 72  t, we're not sur
36640 65 29 2c 0a 20 20 2a 2a 20 62 75 74 20 62 65 63  e),.  ** but bec
36650 61 75 73 65 20 6e 6f 20 77 61 79 20 74 6f 20 74  ause no way to t
36660 65 73 74 20 69 74 20 69 73 20 63 75 72 72 65 6e  est it is curren
36670 74 6c 79 20 61 76 61 69 6c 61 62 6c 65 2e 20 49  tly available. I
36680 74 20 69 73 20 62 65 74 74 65 72 20 0a 20 20 2a  t is better .  *
36690 2a 20 6e 6f 74 20 74 6f 20 72 69 73 6b 20 62 72  * not to risk br
366a0 65 61 6b 69 6e 67 20 76 78 77 6f 72 6b 73 20 73  eaking vxworks s
366b0 75 70 70 6f 72 74 20 66 6f 72 20 74 68 65 20 73  upport for the s
366c0 61 6b 65 20 6f 66 20 73 75 63 68 20 61 6e 20 6f  ake of such an o
366d0 62 73 63 75 72 65 20 0a 20 20 2a 2a 20 66 65 61  bscure .  ** fea
366e0 74 75 72 65 2e 20 20 2a 2f 0a 23 69 66 20 21 4f  ture.  */.#if !O
366f0 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74 72 75  S_VXWORKS.  stru
36700 63 74 20 73 74 61 74 20 73 53 74 61 74 3b 20 20  ct stat sStat;  
36710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36720 20 2f 2a 20 52 65 73 75 6c 74 73 20 6f 66 20 73   /* Results of s
36730 74 61 74 28 29 20 63 61 6c 6c 20 2a 2f 0a 0a 20  tat() call */.. 
36740 20 2f 2a 20 41 20 73 74 61 74 28 29 20 63 61 6c   /* A stat() cal
36750 6c 20 6d 61 79 20 66 61 69 6c 20 66 6f 72 20 76  l may fail for v
36760 61 72 69 6f 75 73 20 72 65 61 73 6f 6e 73 2e 20  arious reasons. 
36770 49 66 20 74 68 69 73 20 68 61 70 70 65 6e 73 2c  If this happens,
36780 20 69 74 20 69 73 0a 20 20 2a 2a 20 61 6c 6d 6f   it is.  ** almo
36790 73 74 20 63 65 72 74 61 69 6e 20 74 68 61 74 20  st certain that 
367a0 61 6e 20 6f 70 65 6e 28 29 20 63 61 6c 6c 20 6f  an open() call o
367b0 6e 20 74 68 65 20 73 61 6d 65 20 70 61 74 68 20  n the same path 
367c0 77 69 6c 6c 20 61 6c 73 6f 20 66 61 69 6c 2e 0a  will also fail..
367d0 20 20 2a 2a 20 46 6f 72 20 74 68 69 73 20 72 65    ** For this re
367e0 61 73 6f 6e 2c 20 69 66 20 61 6e 20 65 72 72 6f  ason, if an erro
367f0 72 20 6f 63 63 75 72 73 20 69 6e 20 74 68 65 20  r occurs in the 
36800 73 74 61 74 28 29 20 63 61 6c 6c 20 68 65 72 65  stat() call here
36810 2c 20 69 74 20 69 73 0a 20 20 2a 2a 20 69 67 6e  , it is.  ** ign
36820 6f 72 65 64 20 61 6e 64 20 2d 31 20 69 73 20 72  ored and -1 is r
36830 65 74 75 72 6e 65 64 2e 20 54 68 65 20 63 61 6c  eturned. The cal
36840 6c 65 72 20 77 69 6c 6c 20 74 72 79 20 74 6f 20  ler will try to 
36850 6f 70 65 6e 20 61 20 6e 65 77 20 66 69 6c 65 0a  open a new file.
36860 20 20 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20    ** descriptor 
36870 6f 6e 20 74 68 65 20 73 61 6d 65 20 70 61 74 68  on the same path
36880 2c 20 66 61 69 6c 2c 20 61 6e 64 20 72 65 74 75  , fail, and retu
36890 72 6e 20 61 6e 20 65 72 72 6f 72 20 74 6f 20 53  rn an error to S
368a0 51 4c 69 74 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  QLite..  **.  **
368b0 20 45 76 65 6e 20 69 66 20 61 20 73 75 62 73 65   Even if a subse
368c0 71 75 65 6e 74 20 6f 70 65 6e 28 29 20 63 61 6c  quent open() cal
368d0 6c 20 64 6f 65 73 20 73 75 63 63 65 65 64 2c 20  l does succeed, 
368e0 74 68 65 20 63 6f 6e 73 65 71 75 65 6e 63 65 73  the consequences
368f0 20 6f 66 0a 20 20 2a 2a 20 6e 6f 74 20 73 65 61   of.  ** not sea
36900 72 63 68 69 6e 67 20 66 6f 72 20 61 20 72 65 75  rching for a reu
36910 73 61 62 6c 65 20 66 69 6c 65 20 64 65 73 63 72  sable file descr
36920 69 70 74 6f 72 20 61 72 65 20 6e 6f 74 20 64 69  iptor are not di
36930 72 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 30 3d  re.  */.  if( 0=
36940 3d 6f 73 53 74 61 74 28 7a 50 61 74 68 2c 20 26  =osStat(zPath, &
36950 73 53 74 61 74 29 20 29 7b 0a 20 20 20 20 75 6e  sStat) ){.    un
36960 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e  ixInodeInfo *pIn
36970 6f 64 65 3b 0a 0a 20 20 20 20 75 6e 69 78 45 6e  ode;..    unixEn
36980 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20  terMutex();.    
36990 70 49 6e 6f 64 65 20 3d 20 69 6e 6f 64 65 4c 69  pInode = inodeLi
369a0 73 74 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70  st;.    while( p
369b0 49 6e 6f 64 65 20 26 26 20 28 70 49 6e 6f 64 65  Inode && (pInode
369c0 2d 3e 66 69 6c 65 49 64 2e 64 65 76 21 3d 73 53  ->fileId.dev!=sS
369d0 74 61 74 2e 73 74 5f 64 65 76 0a 20 20 20 20 20  tat.st_dev.     
369e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
369f0 7c 7c 20 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49  || pInode->fileI
36a00 64 2e 69 6e 6f 21 3d 73 53 74 61 74 2e 73 74 5f  d.ino!=sStat.st_
36a10 69 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 20 70  ino) ){.       p
36a20 49 6e 6f 64 65 20 3d 20 70 49 6e 6f 64 65 2d 3e  Inode = pInode->
36a30 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20  pNext;.    }.   
36a40 20 69 66 28 20 70 49 6e 6f 64 65 20 29 7b 0a 20   if( pInode ){. 
36a50 20 20 20 20 20 55 6e 69 78 55 6e 75 73 65 64 46       UnixUnusedF
36a60 64 20 2a 2a 70 70 3b 0a 20 20 20 20 20 20 66 6f  d **pp;.      fo
36a70 72 28 70 70 3d 26 70 49 6e 6f 64 65 2d 3e 70 55  r(pp=&pInode->pU
36a80 6e 75 73 65 64 3b 20 2a 70 70 20 26 26 20 28 2a  nused; *pp && (*
36a90 70 70 29 2d 3e 66 6c 61 67 73 21 3d 66 6c 61 67  pp)->flags!=flag
36aa0 73 3b 20 70 70 3d 26 28 28 2a 70 70 29 2d 3e 70  s; pp=&((*pp)->p
36ab0 4e 65 78 74 29 29 3b 0a 20 20 20 20 20 20 70 55  Next));.      pU
36ac0 6e 75 73 65 64 20 3d 20 2a 70 70 3b 0a 20 20 20  nused = *pp;.   
36ad0 20 20 20 69 66 28 20 70 55 6e 75 73 65 64 20 29     if( pUnused )
36ae0 7b 0a 20 20 20 20 20 20 20 20 2a 70 70 20 3d 20  {.        *pp = 
36af0 70 55 6e 75 73 65 64 2d 3e 70 4e 65 78 74 3b 0a  pUnused->pNext;.
36b00 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
36b10 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
36b20 28 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 20  ();.  }.#endif  
36b30 20 20 2f 2a 20 69 66 20 21 4f 53 5f 56 58 57 4f    /* if !OS_VXWO
36b40 52 4b 53 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  RKS */.  return 
36b50 70 55 6e 75 73 65 64 3b 0a 7d 0a 0a 2f 2a 0a 2a  pUnused;.}../*.*
36b60 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
36b70 69 73 20 63 61 6c 6c 65 64 20 62 79 20 75 6e 69  is called by uni
36b80 78 4f 70 65 6e 28 29 20 74 6f 20 64 65 74 65 72  xOpen() to deter
36b90 6d 69 6e 65 20 74 68 65 20 75 6e 69 78 20 70 65  mine the unix pe
36ba0 72 6d 69 73 73 69 6f 6e 73 0a 2a 2a 20 74 6f 20  rmissions.** to 
36bb0 63 72 65 61 74 65 20 6e 65 77 20 66 69 6c 65 73  create new files
36bc0 20 77 69 74 68 2e 20 49 66 20 6e 6f 20 65 72 72   with. If no err
36bd0 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20  or occurs, then 
36be0 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
36bf0 75 72 6e 65 64 0a 2a 2a 20 61 6e 64 20 61 20 76  urned.** and a v
36c00 61 6c 75 65 20 73 75 69 74 61 62 6c 65 20 66 6f  alue suitable fo
36c10 72 20 70 61 73 73 69 6e 67 20 61 73 20 74 68 65  r passing as the
36c20 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74 20   third argument 
36c30 74 6f 20 6f 70 65 6e 28 32 29 20 69 73 0a 2a 2a  to open(2) is.**
36c40 20 77 72 69 74 74 65 6e 20 74 6f 20 2a 70 4d 6f   written to *pMo
36c50 64 65 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72  de. If an IO err
36c60 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e 20 53 51  or occurs, an SQ
36c70 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  Lite error code 
36c80 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20  is .** returned 
36c90 61 6e 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66  and the value of
36ca0 20 2a 70 4d 6f 64 65 20 69 73 20 6e 6f 74 20 6d   *pMode is not m
36cb0 6f 64 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  odified..**.** I
36cc0 6e 20 6d 6f 73 74 20 63 61 73 65 73 2c 20 74 68  n most cases, th
36cd0 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20  is routine sets 
36ce0 2a 70 4d 6f 64 65 20 74 6f 20 30 2c 20 77 68 69  *pMode to 0, whi
36cf0 63 68 20 77 69 6c 6c 20 62 65 63 6f 6d 65 0a 2a  ch will become.*
36d00 2a 20 61 6e 20 69 6e 64 69 63 61 74 69 6f 6e 20  * an indication 
36d10 74 6f 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 29  to robust_open()
36d20 20 74 6f 20 63 72 65 61 74 65 20 74 68 65 20 66   to create the f
36d30 69 6c 65 20 75 73 69 6e 67 0a 2a 2a 20 53 51 4c  ile using.** SQL
36d40 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45  ITE_DEFAULT_FILE
36d50 5f 50 45 52 4d 49 53 53 49 4f 4e 53 20 61 64 6a  _PERMISSIONS adj
36d60 75 73 74 65 64 20 62 79 20 74 68 65 20 75 6d 61  usted by the uma
36d70 73 6b 2e 0a 2a 2a 20 42 75 74 20 69 66 20 74 68  sk..** But if th
36d80 65 20 66 69 6c 65 20 62 65 69 6e 67 20 6f 70 65  e file being ope
36d90 6e 65 64 20 69 73 20 61 20 57 41 4c 20 6f 72 20  ned is a WAL or 
36da0 72 65 67 75 6c 61 72 20 6a 6f 75 72 6e 61 6c 20  regular journal 
36db0 66 69 6c 65 2c 20 74 68 65 6e 20 0a 2a 2a 20 74  file, then .** t
36dc0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 71 75 65  his function que
36dd0 72 69 65 73 20 74 68 65 20 66 69 6c 65 2d 73 79  ries the file-sy
36de0 73 74 65 6d 20 66 6f 72 20 74 68 65 20 70 65 72  stem for the per
36df0 6d 69 73 73 69 6f 6e 73 20 6f 6e 20 74 68 65 20  missions on the 
36e00 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  .** correspondin
36e10 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  g database file 
36e20 61 6e 64 20 73 65 74 73 20 2a 70 4d 6f 64 65 20  and sets *pMode 
36e30 74 6f 20 74 68 69 73 20 76 61 6c 75 65 2e 20 57  to this value. W
36e40 68 65 6e 65 76 65 72 20 0a 2a 2a 20 70 6f 73 73  henever .** poss
36e50 69 62 6c 65 2c 20 57 41 4c 20 61 6e 64 20 6a 6f  ible, WAL and jo
36e60 75 72 6e 61 6c 20 66 69 6c 65 73 20 61 72 65 20  urnal files are 
36e70 63 72 65 61 74 65 64 20 75 73 69 6e 67 20 74 68  created using th
36e80 65 20 73 61 6d 65 20 70 65 72 6d 69 73 73 69 6f  e same permissio
36e90 6e 73 20 0a 2a 2a 20 61 73 20 74 68 65 20 61 73  ns .** as the as
36ea0 73 6f 63 69 61 74 65 64 20 64 61 74 61 62 61 73  sociated databas
36eb0 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  e file..**.** If
36ec0 20 74 68 65 20 53 51 4c 49 54 45 5f 45 4e 41 42   the SQLITE_ENAB
36ed0 4c 45 5f 38 5f 33 5f 4e 41 4d 45 53 20 6f 70 74  LE_8_3_NAMES opt
36ee0 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 2c 20  ion is enabled, 
36ef0 74 68 65 6e 20 74 68 65 0a 2a 2a 20 6f 72 69 67  then the.** orig
36f00 69 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73  inal filename is
36f10 20 75 6e 61 76 61 69 6c 61 62 6c 65 2e 20 20 42   unavailable.  B
36f20 75 74 20 38 5f 33 5f 4e 41 4d 45 53 20 69 73 20  ut 8_3_NAMES is 
36f30 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72 0a 2a 2a  only used for.**
36f40 20 46 41 54 20 66 69 6c 65 73 79 73 74 65 6d 73   FAT filesystems
36f50 20 61 6e 64 20 70 65 72 6d 69 73 73 69 6f 6e 73   and permissions
36f60 20 64 6f 20 6e 6f 74 20 6d 61 74 74 65 72 20 74   do not matter t
36f70 68 65 72 65 2c 20 73 6f 20 6a 75 73 74 20 75 73  here, so just us
36f80 65 0a 2a 2a 20 74 68 65 20 64 65 66 61 75 6c 74  e.** the default
36f90 20 70 65 72 6d 69 73 73 69 6f 6e 73 2e 0a 2a 2f   permissions..*/
36fa0 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6e 64  .static int find
36fb0 43 72 65 61 74 65 46 69 6c 65 4d 6f 64 65 28 0a  CreateFileMode(.
36fc0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
36fd0 61 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 20  ath,            
36fe0 20 20 2f 2a 20 50 61 74 68 20 6f 66 20 66 69 6c    /* Path of fil
36ff0 65 20 28 70 6f 73 73 69 62 6c 79 29 20 62 65 69  e (possibly) bei
37000 6e 67 20 63 72 65 61 74 65 64 20 2a 2f 0a 20 20  ng created */.  
37010 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20  int flags,      
37020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37030 2f 2a 20 46 6c 61 67 73 20 70 61 73 73 65 64 20  /* Flags passed 
37040 61 73 20 34 74 68 20 61 72 67 75 6d 65 6e 74 20  as 4th argument 
37050 74 6f 20 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20  to xOpen() */.  
37060 6d 6f 64 65 5f 74 20 2a 70 4d 6f 64 65 2c 20 20  mode_t *pMode,  
37070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37080 2f 2a 20 4f 55 54 3a 20 50 65 72 6d 69 73 73 69  /* OUT: Permissi
37090 6f 6e 73 20 74 6f 20 6f 70 65 6e 20 66 69 6c 65  ons to open file
370a0 20 77 69 74 68 20 2a 2f 0a 20 20 75 69 64 5f 74   with */.  uid_t
370b0 20 2a 70 55 69 64 2c 20 20 20 20 20 20 20 20 20   *pUid,         
370c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
370d0 54 3a 20 75 69 64 20 74 6f 20 73 65 74 20 6f 6e  T: uid to set on
370e0 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 67   the file */.  g
370f0 69 64 5f 74 20 2a 70 47 69 64 20 20 20 20 20 20  id_t *pGid      
37100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
37110 2a 20 4f 55 54 3a 20 67 69 64 20 74 6f 20 73 65  * OUT: gid to se
37120 74 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 2a 2f  t on the file */
37130 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
37140 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
37150 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
37160 43 6f 64 65 20 2a 2f 0a 20 20 2a 70 4d 6f 64 65  Code */.  *pMode
37170 20 3d 20 30 3b 0a 20 20 2a 70 55 69 64 20 3d 20   = 0;.  *pUid = 
37180 30 3b 0a 20 20 2a 70 47 69 64 20 3d 20 30 3b 0a  0;.  *pGid = 0;.
37190 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 28 53    if( flags & (S
371a0 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 7c 53  QLITE_OPEN_WAL|S
371b0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
371c0 4a 4f 55 52 4e 41 4c 29 20 29 7b 0a 20 20 20 20  JOURNAL) ){.    
371d0 63 68 61 72 20 7a 44 62 5b 4d 41 58 5f 50 41 54  char zDb[MAX_PAT
371e0 48 4e 41 4d 45 2b 31 5d 3b 20 20 20 20 20 2f 2a  HNAME+1];     /*
371f0 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 20 70   Database file p
37200 61 74 68 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  ath */.    int n
37210 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Db;             
37220 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
37230 65 72 20 6f 66 20 76 61 6c 69 64 20 62 79 74 65  er of valid byte
37240 73 20 69 6e 20 7a 44 62 20 2a 2f 0a 20 20 20 20  s in zDb */.    
37250 73 74 72 75 63 74 20 73 74 61 74 20 73 53 74 61  struct stat sSta
37260 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t;            /*
37270 20 4f 75 74 70 75 74 20 6f 66 20 73 74 61 74 28   Output of stat(
37280 29 20 6f 6e 20 64 61 74 61 62 61 73 65 20 66 69  ) on database fi
37290 6c 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 7a 50  le */..    /* zP
372a0 61 74 68 20 69 73 20 61 20 70 61 74 68 20 74 6f  ath is a path to
372b0 20 61 20 57 41 4c 20 6f 72 20 6a 6f 75 72 6e 61   a WAL or journa
372c0 6c 20 66 69 6c 65 2e 20 54 68 65 20 66 6f 6c 6c  l file. The foll
372d0 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 64 65 72 69  owing block deri
372e0 76 65 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 70  ves.    ** the p
372f0 61 74 68 20 74 6f 20 74 68 65 20 61 73 73 6f 63  ath to the assoc
37300 69 61 74 65 64 20 64 61 74 61 62 61 73 65 20 66  iated database f
37310 69 6c 65 20 66 72 6f 6d 20 7a 50 61 74 68 2e 20  ile from zPath. 
37320 54 68 69 73 20 62 6c 6f 63 6b 20 68 61 6e 64 6c  This block handl
37330 65 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 66 6f  es.    ** the fo
37340 6c 6c 6f 77 69 6e 67 20 6e 61 6d 69 6e 67 20 63  llowing naming c
37350 6f 6e 76 65 6e 74 69 6f 6e 73 3a 0a 20 20 20 20  onventions:.    
37360 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 22 3c 70 61  **.    **   "<pa
37370 74 68 20 74 6f 20 64 62 3e 2d 6a 6f 75 72 6e 61  th to db>-journa
37380 6c 22 0a 20 20 20 20 2a 2a 20 20 20 22 3c 70 61  l".    **   "<pa
37390 74 68 20 74 6f 20 64 62 3e 2d 77 61 6c 22 0a 20  th to db>-wal". 
373a0 20 20 20 2a 2a 20 20 20 22 3c 70 61 74 68 20 74     **   "<path t
373b0 6f 20 64 62 3e 2d 6a 6f 75 72 6e 61 6c 4e 4e 22  o db>-journalNN"
373c0 0a 20 20 20 20 2a 2a 20 20 20 22 3c 70 61 74 68  .    **   "<path
373d0 20 74 6f 20 64 62 3e 2d 77 61 6c 4e 4e 22 0a 20   to db>-walNN". 
373e0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 77 68 65     **.    ** whe
373f0 72 65 20 4e 4e 20 69 73 20 61 20 64 65 63 69 6d  re NN is a decim
37400 61 6c 20 6e 75 6d 62 65 72 2e 20 54 68 65 20 4e  al number. The N
37410 4e 20 6e 61 6d 69 6e 67 20 73 63 68 65 6d 65 73  N naming schemes
37420 20 61 72 65 20 0a 20 20 20 20 2a 2a 20 75 73 65   are .    ** use
37430 64 20 62 79 20 74 68 65 20 74 65 73 74 5f 6d 75  d by the test_mu
37440 6c 74 69 70 6c 65 78 2e 63 20 6d 6f 64 75 6c 65  ltiplex.c module
37450 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e 44 62  ..    */.    nDb
37460 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
37470 33 30 28 7a 50 61 74 68 29 20 2d 20 31 3b 20 0a  30(zPath) - 1; .
37480 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
37490 41 42 4c 45 5f 38 5f 33 5f 4e 41 4d 45 53 0a 20  ABLE_8_3_NAMES. 
374a0 20 20 20 77 68 69 6c 65 28 20 6e 44 62 3e 30 20     while( nDb>0 
374b0 26 26 20 73 71 6c 69 74 65 33 49 73 61 6c 6e 75  && sqlite3Isalnu
374c0 6d 28 7a 50 61 74 68 5b 6e 44 62 5d 29 20 29 20  m(zPath[nDb]) ) 
374d0 6e 44 62 2d 2d 3b 0a 20 20 20 20 69 66 28 20 6e  nDb--;.    if( n
374e0 44 62 3d 3d 30 20 7c 7c 20 7a 50 61 74 68 5b 6e  Db==0 || zPath[n
374f0 44 62 5d 21 3d 27 2d 27 20 29 20 72 65 74 75 72  Db]!='-' ) retur
37500 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6c  n SQLITE_OK;.#el
37510 73 65 0a 20 20 20 20 77 68 69 6c 65 28 20 7a 50  se.    while( zP
37520 61 74 68 5b 6e 44 62 5d 21 3d 27 2d 27 20 29 7b  ath[nDb]!='-' ){
37530 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
37540 44 62 3e 30 20 29 3b 0a 20 20 20 20 20 20 61 73  Db>0 );.      as
37550 73 65 72 74 28 20 7a 50 61 74 68 5b 6e 44 62 5d  sert( zPath[nDb]
37560 21 3d 27 5c 6e 27 20 29 3b 0a 20 20 20 20 20 20  !='\n' );.      
37570 6e 44 62 2d 2d 3b 0a 20 20 20 20 7d 0a 23 65 6e  nDb--;.    }.#en
37580 64 69 66 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a  dif.    memcpy(z
37590 44 62 2c 20 7a 50 61 74 68 2c 20 6e 44 62 29 3b  Db, zPath, nDb);
375a0 0a 20 20 20 20 7a 44 62 5b 6e 44 62 5d 20 3d 20  .    zDb[nDb] = 
375b0 27 5c 30 27 3b 0a 0a 20 20 20 20 69 66 28 20 30  '\0';..    if( 0
375c0 3d 3d 6f 73 53 74 61 74 28 7a 44 62 2c 20 26 73  ==osStat(zDb, &s
375d0 53 74 61 74 29 20 29 7b 0a 20 20 20 20 20 20 2a  Stat) ){.      *
375e0 70 4d 6f 64 65 20 3d 20 73 53 74 61 74 2e 73 74  pMode = sStat.st
375f0 5f 6d 6f 64 65 20 26 20 30 37 37 37 3b 0a 20 20  _mode & 0777;.  
37600 20 20 20 20 2a 70 55 69 64 20 3d 20 73 53 74 61      *pUid = sSta
37610 74 2e 73 74 5f 75 69 64 3b 0a 20 20 20 20 20 20  t.st_uid;.      
37620 2a 70 47 69 64 20 3d 20 73 53 74 61 74 2e 73 74  *pGid = sStat.st
37630 5f 67 69 64 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  _gid;.    }else{
37640 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
37650 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a  TE_IOERR_FSTAT;.
37660 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
37670 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ( flags & SQLITE
37680 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c  _OPEN_DELETEONCL
37690 4f 53 45 20 29 7b 0a 20 20 20 20 2a 70 4d 6f 64  OSE ){.    *pMod
376a0 65 20 3d 20 30 36 30 30 3b 0a 20 20 7d 0a 20 20  e = 0600;.  }.  
376b0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
376c0 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20 66 69 6c  .** Open the fil
376d0 65 20 7a 50 61 74 68 2e 0a 2a 2a 20 0a 2a 2a 20  e zPath..** .** 
376e0 50 72 65 76 69 6f 75 73 6c 79 2c 20 74 68 65 20  Previously, the 
376f0 53 51 4c 69 74 65 20 4f 53 20 6c 61 79 65 72 20  SQLite OS layer 
37700 75 73 65 64 20 74 68 72 65 65 20 66 75 6e 63 74  used three funct
37710 69 6f 6e 73 20 69 6e 20 70 6c 61 63 65 20 6f 66  ions in place of
37720 20 74 68 69 73 0a 2a 2a 20 6f 6e 65 3a 0a 2a 2a   this.** one:.**
37730 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33 4f  .**     sqlite3O
37740 73 4f 70 65 6e 52 65 61 64 57 72 69 74 65 28 29  sOpenReadWrite()
37750 3b 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33  ;.**     sqlite3
37760 4f 73 4f 70 65 6e 52 65 61 64 4f 6e 6c 79 28 29  OsOpenReadOnly()
37770 3b 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33  ;.**     sqlite3
37780 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28  OsOpenExclusive(
37790 29 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 63  );.**.** These c
377a0 61 6c 6c 73 20 63 6f 72 72 65 73 70 6f 6e 64 20  alls correspond 
377b0 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  to the following
377c0 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6f 66   combinations of
377d0 20 66 6c 61 67 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   flags:.**.**   
377e0 20 20 52 65 61 64 57 72 69 74 65 28 29 20 2d 3e    ReadWrite() ->
377f0 20 20 20 20 20 28 52 45 41 44 57 52 49 54 45 20       (READWRITE 
37800 7c 20 43 52 45 41 54 45 29 0a 2a 2a 20 20 20 20  | CREATE).**    
37810 20 52 65 61 64 4f 6e 6c 79 28 29 20 20 2d 3e 20   ReadOnly()  -> 
37820 20 20 20 20 28 52 45 41 44 4f 4e 4c 59 29 20 0a      (READONLY) .
37830 2a 2a 20 20 20 20 20 4f 70 65 6e 45 78 63 6c 75  **     OpenExclu
37840 73 69 76 65 28 29 20 2d 3e 20 28 52 45 41 44 57  sive() -> (READW
37850 52 49 54 45 20 7c 20 43 52 45 41 54 45 20 7c 20  RITE | CREATE | 
37860 45 58 43 4c 55 53 49 56 45 29 0a 2a 2a 0a 2a 2a  EXCLUSIVE).**.**
37870 20 54 68 65 20 6f 6c 64 20 4f 70 65 6e 45 78 63   The old OpenExc
37880 6c 75 73 69 76 65 28 29 20 61 63 63 65 70 74 65  lusive() accepte
37890 64 20 61 20 62 6f 6f 6c 65 61 6e 20 61 72 67 75  d a boolean argu
378a0 6d 65 6e 74 20 2d 20 22 64 65 6c 46 6c 61 67 22  ment - "delFlag"
378b0 2e 20 49 66 0a 2a 2a 20 74 72 75 65 2c 20 74 68  . If.** true, th
378c0 65 20 66 69 6c 65 20 77 61 73 20 63 6f 6e 66 69  e file was confi
378d0 67 75 72 65 64 20 74 6f 20 62 65 20 61 75 74 6f  gured to be auto
378e0 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65  matically delete
378f0 64 20 77 68 65 6e 20 74 68 65 0a 2a 2a 20 66 69  d when the.** fi
37900 6c 65 20 68 61 6e 64 6c 65 20 63 6c 6f 73 65 64  le handle closed
37910 2e 20 54 6f 20 61 63 68 69 65 76 65 20 74 68 65  . To achieve the
37920 20 73 61 6d 65 20 65 66 66 65 63 74 20 75 73 69   same effect usi
37930 6e 67 20 74 68 69 73 20 6e 65 77 20 0a 2a 2a 20  ng this new .** 
37940 69 6e 74 65 72 66 61 63 65 2c 20 61 64 64 20 74  interface, add t
37950 68 65 20 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45  he DELETEONCLOSE
37960 20 66 6c 61 67 20 74 6f 20 74 68 6f 73 65 20 73   flag to those s
37970 70 65 63 69 66 69 65 64 20 61 62 6f 76 65 20 66  pecified above f
37980 6f 72 20 0a 2a 2a 20 4f 70 65 6e 45 78 63 6c 75  or .** OpenExclu
37990 73 69 76 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  sive()..*/.stati
379a0 63 20 69 6e 74 20 75 6e 69 78 4f 70 65 6e 28 0a  c int unixOpen(.
379b0 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
379c0 56 66 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f  Vfs,           /
379d0 2a 20 54 68 65 20 56 46 53 20 66 6f 72 20 77 68  * The VFS for wh
379e0 69 63 68 20 74 68 69 73 20 69 73 20 74 68 65 20  ich this is the 
379f0 78 4f 70 65 6e 20 6d 65 74 68 6f 64 20 2a 2f 0a  xOpen method */.
37a00 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
37a10 61 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ath,           /
37a20 2a 20 50 61 74 68 6e 61 6d 65 20 6f 66 20 66 69  * Pathname of fi
37a30 6c 65 20 74 6f 20 62 65 20 6f 70 65 6e 65 64 20  le to be opened 
37a40 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  */.  sqlite3_fil
37a50 65 20 2a 70 46 69 6c 65 2c 20 20 20 20 20 20 20  e *pFile,       
37a60 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64 65    /* The file de
37a70 73 63 72 69 70 74 6f 72 20 74 6f 20 62 65 20 66  scriptor to be f
37a80 69 6c 6c 65 64 20 69 6e 20 2a 2f 0a 20 20 69 6e  illed in */.  in
37a90 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20  t flags,        
37aa0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
37ab0 70 75 74 20 66 6c 61 67 73 20 74 6f 20 63 6f 6e  put flags to con
37ac0 74 72 6f 6c 20 74 68 65 20 6f 70 65 6e 69 6e 67  trol the opening
37ad0 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 4f 75 74 46   */.  int *pOutF
37ae0 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20  lags            
37af0 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 66 6c 61     /* Output fla
37b00 67 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20 53  gs returned to S
37b10 51 4c 69 74 65 20 63 6f 72 65 20 2a 2f 0a 29 7b  QLite core */.){
37b20 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 20 3d  .  unixFile *p =
37b30 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 70 46 69   (unixFile *)pFi
37b40 6c 65 3b 0a 20 20 69 6e 74 20 66 64 20 3d 20 2d  le;.  int fd = -
37b50 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1;              
37b60 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73       /* File des
37b70 63 72 69 70 74 6f 72 20 72 65 74 75 72 6e 65 64  criptor returned
37b80 20 62 79 20 6f 70 65 6e 28 29 20 2a 2f 0a 20 20   by open() */.  
37b90 69 6e 74 20 6f 70 65 6e 46 6c 61 67 73 20 3d 20  int openFlags = 
37ba0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
37bb0 2a 20 46 6c 61 67 73 20 74 6f 20 70 61 73 73 20  * Flags to pass 
37bc0 74 6f 20 6f 70 65 6e 28 29 20 2a 2f 0a 23 69 66  to open() */.#if
37bd0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44   SQLITE_ENABLE_D
37be0 41 54 41 5f 50 52 4f 54 45 43 54 49 4f 4e 0a 20  ATA_PROTECTION. 
37bf0 20 69 6e 74 20 65 54 79 70 65 20 3d 20 66 6c 61   int eType = fla
37c00 67 73 26 30 78 46 46 30 46 46 46 30 30 3b 20 20  gs&0xFF0FFF00;  
37c10 2f 2a 20 54 79 70 65 20 6f 66 20 66 69 6c 65 20  /* Type of file 
37c20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 23 65 6c 73 65  to open */.#else
37c30 0a 20 20 69 6e 74 20 65 54 79 70 65 20 3d 20 66  .  int eType = f
37c40 6c 61 67 73 26 30 78 46 46 46 46 46 46 30 30 3b  lags&0xFFFFFF00;
37c50 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 66 69 6c    /* Type of fil
37c60 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 23 65 6e  e to open */.#en
37c70 64 69 66 0a 20 20 69 6e 74 20 6e 6f 4c 6f 63 6b  dif.  int noLock
37c80 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
37c90 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
37ca0 6f 6d 69 74 20 6c 6f 63 6b 69 6e 67 20 70 72 69  omit locking pri
37cb0 6d 69 74 69 76 65 73 20 2a 2f 0a 20 20 69 6e 74  mitives */.  int
37cc0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
37cd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
37ce0 75 6e 63 74 69 6f 6e 20 52 65 74 75 72 6e 20 43  unction Return C
37cf0 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 63 74 72  ode */.  int ctr
37d00 6c 46 6c 61 67 73 20 3d 20 30 3b 20 20 20 20 20  lFlags = 0;     
37d10 20 20 20 20 20 20 20 20 2f 2a 20 55 4e 49 58 46          /* UNIXF
37d20 49 4c 45 5f 2a 20 66 6c 61 67 73 20 2a 2f 0a 0a  ILE_* flags */..
37d30 20 20 69 6e 74 20 69 73 45 78 63 6c 75 73 69 76    int isExclusiv
37d40 65 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51  e  = (flags & SQ
37d50 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53  LITE_OPEN_EXCLUS
37d60 49 56 45 29 3b 0a 20 20 69 6e 74 20 69 73 44 65  IVE);.  int isDe
37d70 6c 65 74 65 20 20 20 20 20 3d 20 28 66 6c 61 67  lete     = (flag
37d80 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
37d90 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 29 3b 0a  DELETEONCLOSE);.
37da0 20 20 69 6e 74 20 69 73 43 72 65 61 74 65 20 20    int isCreate  
37db0 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51     = (flags & SQ
37dc0 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
37dd0 29 3b 0a 20 20 69 6e 74 20 69 73 52 65 61 64 6f  );.  int isReado
37de0 6e 6c 79 20 20 20 3d 20 28 66 6c 61 67 73 20 26  nly   = (flags &
37df0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
37e00 44 4f 4e 4c 59 29 3b 0a 20 20 69 6e 74 20 69 73  DONLY);.  int is
37e10 52 65 61 64 57 72 69 74 65 20 20 3d 20 28 66 6c  ReadWrite  = (fl
37e20 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
37e30 4e 5f 52 45 41 44 57 52 49 54 45 29 3b 0a 23 69  N_READWRITE);.#i
37e40 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
37e50 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20  LOCKING_STYLE.  
37e60 69 6e 74 20 69 73 41 75 74 6f 50 72 6f 78 79 20  int isAutoProxy 
37e70 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49   = (flags & SQLI
37e80 54 45 5f 4f 50 45 4e 5f 41 55 54 4f 50 52 4f 58  TE_OPEN_AUTOPROX
37e90 59 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64  Y);.#endif.#if d
37ea0 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
37eb0 29 20 7c 7c 20 53 51 4c 49 54 45 5f 45 4e 41 42  ) || SQLITE_ENAB
37ec0 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
37ed0 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 66 73  .  struct statfs
37ee0 20 66 73 49 6e 66 6f 3b 0a 23 65 6e 64 69 66 0a   fsInfo;.#endif.
37ef0 0a 20 20 2f 2a 20 49 66 20 63 72 65 61 74 69 6e  .  /* If creatin
37f00 67 20 61 20 6d 61 73 74 65 72 20 6f 72 20 6d 61  g a master or ma
37f10 69 6e 2d 66 69 6c 65 20 6a 6f 75 72 6e 61 6c 2c  in-file journal,
37f20 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77   this function w
37f30 69 6c 6c 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20  ill open.  ** a 
37f40 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 20  file-descriptor 
37f50 6f 6e 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  on the directory
37f60 20 74 6f 6f 2e 20 54 68 65 20 66 69 72 73 74 20   too. The first 
37f70 74 69 6d 65 20 75 6e 69 78 53 79 6e 63 28 29 0a  time unixSync().
37f80 20 20 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 74    ** is called t
37f90 68 65 20 64 69 72 65 63 74 6f 72 79 20 66 69 6c  he directory fil
37fa0 65 20 64 65 73 63 72 69 70 74 6f 72 20 77 69 6c  e descriptor wil
37fb0 6c 20 62 65 20 66 73 79 6e 63 28 29 65 64 20 61  l be fsync()ed a
37fc0 6e 64 20 63 6c 6f 73 65 28 29 64 2e 0a 20 20 2a  nd close()d..  *
37fd0 2f 0a 20 20 69 6e 74 20 73 79 6e 63 44 69 72 20  /.  int syncDir 
37fe0 3d 20 28 69 73 43 72 65 61 74 65 20 26 26 20 28  = (isCreate && (
37ff0 0a 20 20 20 20 20 20 20 20 65 54 79 70 65 3d 3d  .        eType==
38000 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54  SQLITE_OPEN_MAST
38010 45 52 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20 20  ER_JOURNAL .    
38020 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
38030 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52  E_OPEN_MAIN_JOUR
38040 4e 41 4c 20 0a 20 20 20 20 20 7c 7c 20 65 54 79  NAL .     || eTy
38050 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
38060 57 41 4c 0a 20 20 29 29 3b 0a 0a 20 20 2f 2a 20  WAL.  ));..  /* 
38070 49 66 20 61 72 67 75 6d 65 6e 74 20 7a 50 61 74  If argument zPat
38080 68 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e  h is a NULL poin
38090 74 65 72 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ter, this functi
380a0 6f 6e 20 69 73 20 72 65 71 75 69 72 65 64 20 74  on is required t
380b0 6f 20 6f 70 65 6e 0a 20 20 2a 2a 20 61 20 74 65  o open.  ** a te
380c0 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 55 73  mporary file. Us
380d0 65 20 74 68 69 73 20 62 75 66 66 65 72 20 74 6f  e this buffer to
380e0 20 73 74 6f 72 65 20 74 68 65 20 66 69 6c 65 20   store the file 
380f0 6e 61 6d 65 20 69 6e 2e 0a 20 20 2a 2f 0a 20 20  name in..  */.  
38100 63 68 61 72 20 7a 54 6d 70 6e 61 6d 65 5b 4d 41  char zTmpname[MA
38110 58 5f 50 41 54 48 4e 41 4d 45 2b 32 5d 3b 0a 20  X_PATHNAME+2];. 
38120 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
38130 6d 65 20 3d 20 7a 50 61 74 68 3b 0a 0a 20 20 2f  me = zPath;..  /
38140 2a 20 43 68 65 63 6b 20 74 68 65 20 66 6f 6c 6c  * Check the foll
38150 6f 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73  owing statements
38160 20 61 72 65 20 74 72 75 65 3a 20 0a 20 20 2a 2a   are true: .  **
38170 0a 20 20 2a 2a 20 20 20 28 61 29 20 45 78 61 63  .  **   (a) Exac
38180 74 6c 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 52  tly one of the R
38190 45 41 44 57 52 49 54 45 20 61 6e 64 20 52 45 41  EADWRITE and REA
381a0 44 4f 4e 4c 59 20 66 6c 61 67 73 20 6d 75 73 74  DONLY flags must
381b0 20 62 65 20 73 65 74 2c 20 61 6e 64 20 0a 20 20   be set, and .  
381c0 2a 2a 20 20 20 28 62 29 20 69 66 20 43 52 45 41  **   (b) if CREA
381d0 54 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20  TE is set, then 
381e0 52 45 41 44 57 52 49 54 45 20 6d 75 73 74 20 61  READWRITE must a
381f0 6c 73 6f 20 62 65 20 73 65 74 2c 20 61 6e 64 0a  lso be set, and.
38200 20 20 2a 2a 20 20 20 28 63 29 20 69 66 20 45 58    **   (c) if EX
38210 43 4c 55 53 49 56 45 20 69 73 20 73 65 74 2c 20  CLUSIVE is set, 
38220 74 68 65 6e 20 43 52 45 41 54 45 20 6d 75 73 74  then CREATE must
38230 20 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a 20 20   also be set..  
38240 2a 2a 20 20 20 28 64 29 20 69 66 20 44 45 4c 45  **   (d) if DELE
38250 54 45 4f 4e 43 4c 4f 53 45 20 69 73 20 73 65 74  TEONCLOSE is set
38260 2c 20 74 68 65 6e 20 43 52 45 41 54 45 20 6d 75  , then CREATE mu
38270 73 74 20 61 6c 73 6f 20 62 65 20 73 65 74 2e 0a  st also be set..
38280 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 28 69    */.  assert((i
38290 73 52 65 61 64 6f 6e 6c 79 3d 3d 30 20 7c 7c 20  sReadonly==0 || 
382a0 69 73 52 65 61 64 57 72 69 74 65 3d 3d 30 29 20  isReadWrite==0) 
382b0 26 26 20 28 69 73 52 65 61 64 57 72 69 74 65 20  && (isReadWrite 
382c0 7c 7c 20 69 73 52 65 61 64 6f 6e 6c 79 29 29 3b  || isReadonly));
382d0 0a 20 20 61 73 73 65 72 74 28 69 73 43 72 65 61  .  assert(isCrea
382e0 74 65 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64 57  te==0 || isReadW
382f0 72 69 74 65 29 3b 0a 20 20 61 73 73 65 72 74 28  rite);.  assert(
38300 69 73 45 78 63 6c 75 73 69 76 65 3d 3d 30 20 7c  isExclusive==0 |
38310 7c 20 69 73 43 72 65 61 74 65 29 3b 0a 20 20 61  | isCreate);.  a
38320 73 73 65 72 74 28 69 73 44 65 6c 65 74 65 3d 3d  ssert(isDelete==
38330 30 20 7c 7c 20 69 73 43 72 65 61 74 65 29 3b 0a  0 || isCreate);.
38340 0a 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 44  .  /* The main D
38350 42 2c 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 2c  B, main journal,
38360 20 57 41 4c 20 66 69 6c 65 20 61 6e 64 20 6d 61   WAL file and ma
38370 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 72 65  ster journal are
38380 20 6e 65 76 65 72 20 0a 20 20 2a 2a 20 61 75 74   never .  ** aut
38390 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74  omatically delet
383a0 65 64 2e 20 4e 6f 72 20 61 72 65 20 74 68 65 79  ed. Nor are they
383b0 20 65 76 65 72 20 74 65 6d 70 6f 72 61 72 79 20   ever temporary 
383c0 66 69 6c 65 73 2e 20 20 2a 2f 0a 20 20 61 73 73  files.  */.  ass
383d0 65 72 74 28 20 28 21 69 73 44 65 6c 65 74 65 20  ert( (!isDelete 
383e0 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79  && zName) || eTy
383f0 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe!=SQLITE_OPEN_
38400 4d 41 49 4e 5f 44 42 20 29 3b 0a 20 20 61 73 73  MAIN_DB );.  ass
38410 65 72 74 28 20 28 21 69 73 44 65 6c 65 74 65 20  ert( (!isDelete 
38420 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79  && zName) || eTy
38430 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe!=SQLITE_OPEN_
38440 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a  MAIN_JOURNAL );.
38450 20 20 61 73 73 65 72 74 28 20 28 21 69 73 44 65    assert( (!isDe
38460 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c  lete && zName) |
38470 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f  | eType!=SQLITE_
38480 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52  OPEN_MASTER_JOUR
38490 4e 41 4c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  NAL );.  assert(
384a0 20 28 21 69 73 44 65 6c 65 74 65 20 26 26 20 7a   (!isDelete && z
384b0 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21 3d  Name) || eType!=
384c0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 20  SQLITE_OPEN_WAL 
384d0 29 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72 74 20  );..  /* Assert 
384e0 74 68 61 74 20 74 68 65 20 75 70 70 65 72 20 6c  that the upper l
384f0 61 79 65 72 20 68 61 73 20 73 65 74 20 6f 6e 65  ayer has set one
38500 20 6f 66 20 74 68 65 20 22 66 69 6c 65 2d 74 79   of the "file-ty
38510 70 65 22 20 66 6c 61 67 73 2e 20 2a 2f 0a 20 20  pe" flags. */.  
38520 61 73 73 65 72 74 28 20 65 54 79 70 65 3d 3d 53  assert( eType==S
38530 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
38540 44 42 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65  DB      || eType
38550 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45  ==SQLITE_OPEN_TE
38560 4d 50 5f 44 42 20 0a 20 20 20 20 20 20 20 7c 7c  MP_DB .       ||
38570 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
38580 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
38590 20 7c 7c 20 65 5