/ Hex Artifact Content
Login

Artifact bc57de77a1317cb613e31898bfd6667ec41b39ed:


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 23 65 6e 64 69 66 0a 0a  rrent)..#endif..
6880: 7d 3b 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65  }; /* End of the
6890: 20 6f 76 65 72 72 69 64 65 61 62 6c 65 20 73 79   overrideable sy
68a0: 73 74 65 6d 20 63 61 6c 6c 73 20 2a 2f 0a 0a 2f  stem calls */../
68b0: 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65  *.** This is the
68c0: 20 78 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 28   xSetSystemCall(
68d0: 29 20 6d 65 74 68 6f 64 20 6f 66 20 73 71 6c 69  ) method of sqli
68e0: 74 65 33 5f 76 66 73 20 66 6f 72 20 61 6c 6c 20  te3_vfs for all 
68f0: 6f 66 20 74 68 65 0a 2a 2a 20 22 75 6e 69 78 22  of the.** "unix"
6900: 20 56 46 53 65 73 2e 20 20 52 65 74 75 72 6e 20   VFSes.  Return 
6910: 53 51 4c 49 54 45 5f 4f 4b 20 6f 70 6f 6e 20 73  SQLITE_OK opon s
6920: 75 63 63 65 73 73 66 75 6c 6c 79 20 75 70 64 61  uccessfully upda
6930: 74 69 6e 67 20 74 68 65 0a 2a 2a 20 73 79 73 74  ting the.** syst
6940: 65 6d 20 63 61 6c 6c 20 70 6f 69 6e 74 65 72 2c  em call pointer,
6950: 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f   or SQLITE_NOTFO
6960: 55 4e 44 20 69 66 20 74 68 65 72 65 20 69 73 20  UND if there is 
6970: 6e 6f 20 63 6f 6e 66 69 67 75 72 61 62 6c 65 0a  no configurable.
6980: 2a 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 6e  ** system call n
6990: 61 6d 65 64 20 7a 4e 61 6d 65 2e 0a 2a 2f 0a 73  amed zName..*/.s
69a0: 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 65  tatic int unixSe
69b0: 74 53 79 73 74 65 6d 43 61 6c 6c 28 0a 20 20 73  tSystemCall(.  s
69c0: 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 4e 6f 74  qlite3_vfs *pNot
69d0: 55 73 65 64 2c 20 20 20 20 20 20 20 20 2f 2a 20  Used,        /* 
69e0: 54 68 65 20 56 46 53 20 70 6f 69 6e 74 65 72 2e  The VFS pointer.
69f0: 20 20 4e 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20    Not used */.  
6a00: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
6a10: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e,            /*
6a20: 20 4e 61 6d 65 20 6f 66 20 73 79 73 74 65 6d 20   Name of system 
6a30: 63 61 6c 6c 20 74 6f 20 6f 76 65 72 72 69 64 65  call to override
6a40: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 79   */.  sqlite3_sy
6a50: 73 63 61 6c 6c 5f 70 74 72 20 70 4e 65 77 46 75  scall_ptr pNewFu
6a60: 6e 63 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74  nc  /* Pointer t
6a70: 6f 20 6e 65 77 20 73 79 73 74 65 6d 20 63 61 6c  o new system cal
6a80: 6c 20 76 61 6c 75 65 20 2a 2f 0a 29 7b 0a 20 20  l value */.){.  
6a90: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a  unsigned int i;.
6aa0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
6ab0: 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 0a 20 20 55  E_NOTFOUND;..  U
6ac0: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
6ad0: 70 4e 6f 74 55 73 65 64 29 3b 0a 20 20 69 66 28  pNotUsed);.  if(
6ae0: 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20   zName==0 ){.   
6af0: 20 2f 2a 20 49 66 20 6e 6f 20 7a 4e 61 6d 65 20   /* If no zName 
6b00: 69 73 20 67 69 76 65 6e 2c 20 72 65 73 74 6f 72  is given, restor
6b10: 65 20 61 6c 6c 20 73 79 73 74 65 6d 20 63 61 6c  e all system cal
6b20: 6c 73 20 74 6f 20 74 68 65 69 72 20 64 65 66 61  ls to their defa
6b30: 75 6c 74 0a 20 20 20 20 2a 2a 20 73 65 74 74 69  ult.    ** setti
6b40: 6e 67 73 20 61 6e 64 20 72 65 74 75 72 6e 20 4e  ngs and return N
6b50: 55 4c 4c 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  ULL.    */.    r
6b60: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
6b70: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69     for(i=0; i<si
6b80: 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f 73  zeof(aSyscall)/s
6b90: 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30  izeof(aSyscall[0
6ba0: 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ]); i++){.      
6bb0: 69 66 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e  if( aSyscall[i].
6bc0: 70 44 65 66 61 75 6c 74 20 29 7b 0a 20 20 20 20  pDefault ){.    
6bd0: 20 20 20 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e      aSyscall[i].
6be0: 70 43 75 72 72 65 6e 74 20 3d 20 61 53 79 73 63  pCurrent = aSysc
6bf0: 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3b  all[i].pDefault;
6c00: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
6c10: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49   }else{.    /* I
6c20: 66 20 7a 4e 61 6d 65 20 69 73 20 73 70 65 63 69  f zName is speci
6c30: 66 69 65 64 2c 20 6f 70 65 72 61 74 65 20 6f 6e  fied, operate on
6c40: 20 6f 6e 6c 79 20 74 68 65 20 6f 6e 65 20 73 79   only the one sy
6c50: 73 74 65 6d 20 63 61 6c 6c 0a 20 20 20 20 2a 2a  stem call.    **
6c60: 20 73 70 65 63 69 66 69 65 64 2e 0a 20 20 20 20   specified..    
6c70: 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  */.    for(i=0; 
6c80: 69 3c 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c  i<sizeof(aSyscal
6c90: 6c 29 2f 73 69 7a 65 6f 66 28 61 53 79 73 63 61  l)/sizeof(aSysca
6ca0: 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20  ll[0]); i++){.  
6cb0: 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
6cc0: 4e 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69  Name, aSyscall[i
6cd0: 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20  ].zName)==0 ){. 
6ce0: 20 20 20 20 20 20 20 69 66 28 20 61 53 79 73 63         if( aSysc
6cf0: 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3d  all[i].pDefault=
6d00: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
6d10: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66  aSyscall[i].pDef
6d20: 61 75 6c 74 20 3d 20 61 53 79 73 63 61 6c 6c 5b  ault = aSyscall[
6d30: 69 5d 2e 70 43 75 72 72 65 6e 74 3b 0a 20 20 20  i].pCurrent;.   
6d40: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
6d50: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
6d60: 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 46         if( pNewF
6d70: 75 6e 63 3d 3d 30 20 29 20 70 4e 65 77 46 75 6e  unc==0 ) pNewFun
6d80: 63 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e  c = aSyscall[i].
6d90: 70 44 65 66 61 75 6c 74 3b 0a 20 20 20 20 20 20  pDefault;.      
6da0: 20 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43    aSyscall[i].pC
6db0: 75 72 72 65 6e 74 20 3d 20 70 4e 65 77 46 75 6e  urrent = pNewFun
6dc0: 63 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  c;.        break
6dd0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
6de0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
6df0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
6e00: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 61 20   the value of a 
6e10: 73 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20 52 65  system call.  Re
6e20: 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 7a 4e 61  turn NULL if zNa
6e30: 6d 65 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 72  me is not a.** r
6e40: 65 63 6f 67 6e 69 7a 65 64 20 73 79 73 74 65 6d  ecognized system
6e50: 20 63 61 6c 6c 20 6e 61 6d 65 2e 20 20 4e 55 4c   call name.  NUL
6e60: 4c 20 69 73 20 61 6c 73 6f 20 72 65 74 75 72 6e  L is also return
6e70: 65 64 20 69 66 20 74 68 65 20 73 79 73 74 65 6d  ed if the system
6e80: 20 63 61 6c 6c 0a 2a 2a 20 69 73 20 63 75 72 72   call.** is curr
6e90: 65 6e 74 6c 79 20 75 6e 64 65 66 69 6e 65 64 2e  ently undefined.
6ea0: 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74  .*/.static sqlit
6eb0: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20 75  e3_syscall_ptr u
6ec0: 6e 69 78 47 65 74 53 79 73 74 65 6d 43 61 6c 6c  nixGetSystemCall
6ed0: 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  (.  sqlite3_vfs 
6ee0: 2a 70 4e 6f 74 55 73 65 64 2c 0a 20 20 63 6f 6e  *pNotUsed,.  con
6ef0: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 0a 29  st char *zName.)
6f00: 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  {.  unsigned int
6f10: 20 69 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41   i;..  UNUSED_PA
6f20: 52 41 4d 45 54 45 52 28 70 4e 6f 74 55 73 65 64  RAMETER(pNotUsed
6f30: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
6f40: 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 29  sizeof(aSyscall)
6f50: 2f 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c  /sizeof(aSyscall
6f60: 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  [0]); i++){.    
6f70: 69 66 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65  if( strcmp(zName
6f80: 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e  , aSyscall[i].zN
6f90: 61 6d 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  ame)==0 ) return
6fa0: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75   aSyscall[i].pCu
6fb0: 72 72 65 6e 74 3b 0a 20 20 7d 0a 20 20 72 65 74  rrent;.  }.  ret
6fc0: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
6fd0: 52 65 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 20  Return the name 
6fe0: 6f 66 20 74 68 65 20 66 69 72 73 74 20 73 79 73  of the first sys
6ff0: 74 65 6d 20 63 61 6c 6c 20 61 66 74 65 72 20 7a  tem call after z
7000: 4e 61 6d 65 2e 20 20 49 66 20 7a 4e 61 6d 65 3d  Name.  If zName=
7010: 3d 4e 55 4c 4c 0a 2a 2a 20 74 68 65 6e 20 72 65  =NULL.** then re
7020: 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66  turn the name of
7030: 20 74 68 65 20 66 69 72 73 74 20 73 79 73 74 65   the first syste
7040: 6d 20 63 61 6c 6c 2e 20 20 52 65 74 75 72 6e 20  m call.  Return 
7050: 4e 55 4c 4c 20 69 66 20 7a 4e 61 6d 65 0a 2a 2a  NULL if zName.**
7060: 20 69 73 20 74 68 65 20 6c 61 73 74 20 73 79 73   is the last sys
7070: 74 65 6d 20 63 61 6c 6c 20 6f 72 20 69 66 20 7a  tem call or if z
7080: 4e 61 6d 65 20 69 73 20 6e 6f 74 20 74 68 65 20  Name is not the 
7090: 6e 61 6d 65 20 6f 66 20 61 20 76 61 6c 69 64 0a  name of a valid.
70a0: 2a 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 0a  ** system call..
70b0: 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
70c0: 63 68 61 72 20 2a 75 6e 69 78 4e 65 78 74 53 79  char *unixNextSy
70d0: 73 74 65 6d 43 61 6c 6c 28 73 71 6c 69 74 65 33  stemCall(sqlite3
70e0: 5f 76 66 73 20 2a 70 2c 20 63 6f 6e 73 74 20 63  _vfs *p, const c
70f0: 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69  har *zName){.  i
7100: 6e 74 20 69 20 3d 20 2d 31 3b 0a 0a 20 20 55 4e  nt i = -1;..  UN
7110: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
7120: 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 20 29  );.  if( zName )
7130: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
7140: 3c 41 72 72 61 79 53 69 7a 65 28 61 53 79 73 63  <ArraySize(aSysc
7150: 61 6c 6c 29 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20  all)-1; i++){.  
7160: 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
7170: 4e 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69  Name, aSyscall[i
7180: 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 62 72  ].zName)==0 ) br
7190: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
71a0: 20 66 6f 72 28 69 2b 2b 3b 20 69 3c 41 72 72 61   for(i++; i<Arra
71b0: 79 53 69 7a 65 28 61 53 79 73 63 61 6c 6c 29 3b  ySize(aSyscall);
71c0: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 61   i++){.    if( a
71d0: 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72  Syscall[i].pCurr
71e0: 65 6e 74 21 3d 30 20 29 20 72 65 74 75 72 6e 20  ent!=0 ) return 
71f0: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d  aSyscall[i].zNam
7200: 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  e;.  }.  return 
7210: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 6e  0;.}../*.** Do n
7220: 6f 74 20 61 63 63 65 70 74 20 61 6e 79 20 66 69  ot accept any fi
7230: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6c 65  le descriptor le
7240: 73 73 20 74 68 61 6e 20 74 68 69 73 20 76 61 6c  ss than this val
7250: 75 65 2c 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ue, in order to 
7260: 61 76 6f 69 64 0a 2a 2a 20 6f 70 65 6e 69 6e 67  avoid.** opening
7270: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 75   database file u
7280: 73 69 6e 67 20 66 69 6c 65 20 64 65 73 63 72 69  sing file descri
7290: 70 74 6f 72 73 20 74 68 61 74 20 61 72 65 20 63  ptors that are c
72a0: 6f 6d 6d 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72  ommonly used for
72b0: 20 0a 2a 2a 20 73 74 61 6e 64 61 72 64 20 69 6e   .** standard in
72c0: 70 75 74 2c 20 6f 75 74 70 75 74 2c 20 61 6e 64  put, output, and
72d0: 20 65 72 72 6f 72 2e 0a 2a 2f 0a 23 69 66 6e 64   error..*/.#ifnd
72e0: 65 66 20 53 51 4c 49 54 45 5f 4d 49 4e 49 4d 55  ef SQLITE_MINIMU
72f0: 4d 5f 46 49 4c 45 5f 44 45 53 43 52 49 50 54 4f  M_FILE_DESCRIPTO
7300: 52 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54  R.# define SQLIT
7310: 45 5f 4d 49 4e 49 4d 55 4d 5f 46 49 4c 45 5f 44  E_MINIMUM_FILE_D
7320: 45 53 43 52 49 50 54 4f 52 20 33 0a 23 65 6e 64  ESCRIPTOR 3.#end
7330: 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65  if../*.** Invoke
7340: 20 6f 70 65 6e 28 29 2e 20 20 44 6f 20 73 6f 20   open().  Do so 
7350: 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 2c 20  multiple times, 
7360: 75 6e 74 69 6c 20 69 74 20 65 69 74 68 65 72 20  until it either 
7370: 73 75 63 63 65 65 64 73 20 6f 72 0a 2a 2a 20 66  succeeds or.** f
7380: 61 69 6c 73 20 66 6f 72 20 73 6f 6d 65 20 72 65  ails for some re
7390: 61 73 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20  ason other than 
73a0: 45 49 4e 54 52 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  EINTR..**.** If 
73b0: 74 68 65 20 66 69 6c 65 20 63 72 65 61 74 69 6f  the file creatio
73c0: 6e 20 6d 6f 64 65 20 22 6d 22 20 69 73 20 30 20  n mode "m" is 0 
73d0: 74 68 65 6e 20 73 65 74 20 69 74 20 74 6f 20 74  then set it to t
73e0: 68 65 20 64 65 66 61 75 6c 74 20 66 6f 72 0a 2a  he default for.*
73f0: 2a 20 53 51 4c 69 74 65 2e 20 20 54 68 65 20 64  * SQLite.  The d
7400: 65 66 61 75 6c 74 20 69 73 20 53 51 4c 49 54 45  efault is SQLITE
7410: 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45  _DEFAULT_FILE_PE
7420: 52 4d 49 53 53 49 4f 4e 53 20 28 6e 6f 72 6d 61  RMISSIONS (norma
7430: 6c 6c 79 0a 2a 2a 20 30 36 34 34 29 20 61 73 20  lly.** 0644) as 
7440: 6d 6f 64 69 66 69 65 64 20 62 79 20 74 68 65 20  modified by the 
7450: 73 79 73 74 65 6d 20 75 6d 61 73 6b 2e 20 20 49  system umask.  I
7460: 66 20 6d 20 69 73 20 6e 6f 74 20 30 2c 20 74 68  f m is not 0, th
7470: 65 6e 0a 2a 2a 20 6d 61 6b 65 20 74 68 65 20 66  en.** make the f
7480: 69 6c 65 20 63 72 65 61 74 69 6f 6e 20 6d 6f 64  ile creation mod
7490: 65 20 62 65 20 65 78 61 63 74 6c 79 20 6d 20 69  e be exactly m i
74a0: 67 6e 6f 72 69 6e 67 20 74 68 65 20 75 6d 61 73  gnoring the umas
74b0: 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 20 70  k..**.** The m p
74c0: 61 72 61 6d 65 74 65 72 20 77 69 6c 6c 20 62 65  arameter will be
74d0: 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 6e 6c 79 20 77   non-zero only w
74e0: 68 65 6e 20 63 72 65 61 74 69 6e 67 20 2d 77 61  hen creating -wa
74f0: 6c 2c 20 2d 6a 6f 75 72 6e 61 6c 2c 0a 2a 2a 20  l, -journal,.** 
7500: 61 6e 64 20 2d 73 68 6d 20 66 69 6c 65 73 2e 20  and -shm files. 
7510: 20 57 65 20 77 61 6e 74 20 74 68 6f 73 65 20 66   We want those f
7520: 69 6c 65 73 20 74 6f 20 68 61 76 65 20 2a 65 78  iles to have *ex
7530: 61 63 74 6c 79 2a 20 74 68 65 20 73 61 6d 65 0a  actly* the same.
7540: 2a 2a 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 61  ** permissions a
7550: 73 20 74 68 65 69 72 20 6f 72 69 67 69 6e 61 6c  s their original
7560: 20 64 61 74 61 62 61 73 65 2c 20 75 6e 61 64 75   database, unadu
7570: 6c 74 65 72 61 74 65 64 20 62 79 20 74 68 65 20  lterated by the 
7580: 75 6d 61 73 6b 2e 0a 2a 2a 20 49 6e 20 74 68 61  umask..** In tha
7590: 74 20 77 61 79 2c 20 69 66 20 61 20 64 61 74 61  t way, if a data
75a0: 62 61 73 65 20 66 69 6c 65 20 69 73 20 2d 72 77  base file is -rw
75b0: 2d 72 77 2d 72 77 20 6f 72 20 2d 72 77 2d 72 77  -rw-rw or -rw-rw
75c0: 2d 72 2d 2c 20 61 6e 64 20 61 0a 2a 2a 20 74 72  -r-, and a.** tr
75d0: 61 6e 73 61 63 74 69 6f 6e 20 63 72 61 73 68 65  ansaction crashe
75e0: 73 20 61 6e 64 20 6c 65 61 76 65 73 20 62 65 68  s and leaves beh
75f0: 69 6e 64 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 73  ind hot journals
7600: 2c 20 74 68 65 6e 20 61 6e 79 0a 2a 2a 20 70 72  , then any.** pr
7610: 6f 63 65 73 73 20 74 68 61 74 20 69 73 20 61 62  ocess that is ab
7620: 6c 65 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74  le to write to t
7630: 68 65 20 64 61 74 61 62 61 73 65 20 77 69 6c 6c  he database will
7640: 20 61 6c 73 6f 20 62 65 20 61 62 6c 65 20 74 6f   also be able to
7650: 0a 2a 2a 20 72 65 63 6f 76 65 72 20 74 68 65 20  .** recover the 
7660: 68 6f 74 20 6a 6f 75 72 6e 61 6c 73 2e 0a 2a 2f  hot journals..*/
7670: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 6f 62 75  .static int robu
7680: 73 74 5f 6f 70 65 6e 28 63 6f 6e 73 74 20 63 68  st_open(const ch
7690: 61 72 20 2a 7a 2c 20 69 6e 74 20 66 2c 20 6d 6f  ar *z, int f, mo
76a0: 64 65 5f 74 20 6d 29 7b 0a 20 20 69 6e 74 20 66  de_t m){.  int f
76b0: 64 3b 0a 20 20 6d 6f 64 65 5f 74 20 6d 32 20 3d  d;.  mode_t m2 =
76c0: 20 6d 20 3f 20 6d 20 3a 20 53 51 4c 49 54 45 5f   m ? m : SQLITE_
76d0: 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52  DEFAULT_FILE_PER
76e0: 4d 49 53 53 49 4f 4e 53 3b 0a 20 20 77 68 69 6c  MISSIONS;.  whil
76f0: 65 28 31 29 7b 0a 23 69 66 20 64 65 66 69 6e 65  e(1){.#if define
7700: 64 28 4f 5f 43 4c 4f 45 58 45 43 29 0a 20 20 20  d(O_CLOEXEC).   
7710: 20 66 64 20 3d 20 6f 73 4f 70 65 6e 28 7a 2c 66   fd = osOpen(z,f
7720: 7c 4f 5f 43 4c 4f 45 58 45 43 2c 6d 32 29 3b 0a  |O_CLOEXEC,m2);.
7730: 23 65 6c 73 65 0a 20 20 20 20 66 64 20 3d 20 6f  #else.    fd = o
7740: 73 4f 70 65 6e 28 7a 2c 66 2c 6d 32 29 3b 0a 23  sOpen(z,f,m2);.#
7750: 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 66 64  endif.    if( fd
7760: 3c 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  <0 ){.      if( 
7770: 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 20 63  errno==EINTR ) c
7780: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 62  ontinue;.      b
7790: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
77a0: 69 66 28 20 66 64 3e 3d 53 51 4c 49 54 45 5f 4d  if( fd>=SQLITE_M
77b0: 49 4e 49 4d 55 4d 5f 46 49 4c 45 5f 44 45 53 43  INIMUM_FILE_DESC
77c0: 52 49 50 54 4f 52 20 29 20 62 72 65 61 6b 3b 0a  RIPTOR ) break;.
77d0: 20 20 20 20 6f 73 43 6c 6f 73 65 28 66 64 29 3b      osClose(fd);
77e0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67  .    sqlite3_log
77f0: 28 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 2c  (SQLITE_WARNING,
7800: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
7810: 20 20 22 61 74 74 65 6d 70 74 20 74 6f 20 6f 70    "attempt to op
7820: 65 6e 20 5c 22 25 73 5c 22 20 61 73 20 66 69 6c  en \"%s\" as fil
7830: 65 20 64 65 73 63 72 69 70 74 6f 72 20 25 64 22  e descriptor %d"
7840: 2c 20 7a 2c 20 66 64 29 3b 0a 20 20 20 20 66 64  , z, fd);.    fd
7850: 20 3d 20 2d 31 3b 0a 20 20 20 20 69 66 28 20 6f   = -1;.    if( o
7860: 73 4f 70 65 6e 28 22 2f 64 65 76 2f 6e 75 6c 6c  sOpen("/dev/null
7870: 22 2c 20 66 2c 20 6d 29 3c 30 20 29 20 62 72 65  ", f, m)<0 ) bre
7880: 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 64  ak;.  }.  if( fd
7890: 3e 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6d  >=0 ){.    if( m
78a0: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 74 72  !=0 ){.      str
78b0: 75 63 74 20 73 74 61 74 20 73 74 61 74 62 75 66  uct stat statbuf
78c0: 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 73 46 73  ;.      if( osFs
78d0: 74 61 74 28 66 64 2c 20 26 73 74 61 74 62 75 66  tat(fd, &statbuf
78e0: 29 3d 3d 30 20 0a 20 20 20 20 20 20 20 26 26 20  )==0 .       && 
78f0: 73 74 61 74 62 75 66 2e 73 74 5f 73 69 7a 65 3d  statbuf.st_size=
7900: 3d 30 0a 20 20 20 20 20 20 20 26 26 20 28 73 74  =0.       && (st
7910: 61 74 62 75 66 2e 73 74 5f 6d 6f 64 65 26 30 37  atbuf.st_mode&07
7920: 37 37 29 21 3d 6d 20 0a 20 20 20 20 20 20 29 7b  77)!=m .      ){
7930: 0a 20 20 20 20 20 20 20 20 6f 73 46 63 68 6d 6f  .        osFchmo
7940: 64 28 66 64 2c 20 6d 29 3b 0a 20 20 20 20 20 20  d(fd, m);.      
7950: 7d 0a 20 20 20 20 7d 0a 23 69 66 20 64 65 66 69  }.    }.#if defi
7960: 6e 65 64 28 46 44 5f 43 4c 4f 45 58 45 43 29 20  ned(FD_CLOEXEC) 
7970: 26 26 20 28 21 64 65 66 69 6e 65 64 28 4f 5f 43  && (!defined(O_C
7980: 4c 4f 45 58 45 43 29 20 7c 7c 20 4f 5f 43 4c 4f  LOEXEC) || O_CLO
7990: 45 58 45 43 3d 3d 30 29 0a 20 20 20 20 6f 73 46  EXEC==0).    osF
79a0: 63 6e 74 6c 28 66 64 2c 20 46 5f 53 45 54 46 44  cntl(fd, F_SETFD
79b0: 2c 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20 46 5f  , osFcntl(fd, F_
79c0: 47 45 54 46 44 2c 20 30 29 20 7c 20 46 44 5f 43  GETFD, 0) | FD_C
79d0: 4c 4f 45 58 45 43 29 3b 0a 23 65 6e 64 69 66 0a  LOEXEC);.#endif.
79e0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 66 64 3b    }.  return fd;
79f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72  .}../*.** Helper
7a00: 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20 6f 62   functions to ob
7a10: 74 61 69 6e 20 61 6e 64 20 72 65 6c 69 6e 71 75  tain and relinqu
7a20: 69 73 68 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d  ish the global m
7a30: 75 74 65 78 2e 20 54 68 65 0a 2a 2a 20 67 6c 6f  utex. The.** glo
7a40: 62 61 6c 20 6d 75 74 65 78 20 69 73 20 75 73 65  bal mutex is use
7a50: 64 20 74 6f 20 70 72 6f 74 65 63 74 20 74 68 65  d to protect the
7a60: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 61   unixInodeInfo a
7a70: 6e 64 0a 2a 2a 20 76 78 77 6f 72 6b 73 46 69 6c  nd.** vxworksFil
7a80: 65 49 64 20 6f 62 6a 65 63 74 73 20 75 73 65 64  eId objects used
7a90: 20 62 79 20 74 68 69 73 20 66 69 6c 65 2c 20 61   by this file, a
7aa0: 6c 6c 20 6f 66 20 77 68 69 63 68 20 6d 61 79 20  ll of which may 
7ab0: 62 65 20 0a 2a 2a 20 73 68 61 72 65 64 20 62 79  be .** shared by
7ac0: 20 6d 75 6c 74 69 70 6c 65 20 74 68 72 65 61 64   multiple thread
7ad0: 73 2e 0a 2a 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f  s..**.** Functio
7ae0: 6e 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28  n unixMutexHeld(
7af0: 29 20 69 73 20 75 73 65 64 20 74 6f 20 61 73 73  ) is used to ass
7b00: 65 72 74 28 29 20 74 68 61 74 20 74 68 65 20 67  ert() that the g
7b10: 6c 6f 62 61 6c 20 6d 75 74 65 78 20 0a 2a 2a 20  lobal mutex .** 
7b20: 69 73 20 68 65 6c 64 20 77 68 65 6e 20 72 65 71  is held when req
7b30: 75 69 72 65 64 2e 20 54 68 69 73 20 66 75 6e 63  uired. This func
7b40: 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65  tion is only use
7b50: 64 20 61 73 20 70 61 72 74 20 6f 66 20 61 73 73  d as part of ass
7b60: 65 72 74 28 29 20 0a 2a 2a 20 73 74 61 74 65 6d  ert() .** statem
7b70: 65 6e 74 73 2e 20 65 2e 67 2e 0a 2a 2a 0a 2a 2a  ents. e.g..**.**
7b80: 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65     unixEnterMute
7b90: 78 28 29 0a 2a 2a 20 20 20 20 20 61 73 73 65 72  x().**     asser
7ba0: 74 28 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64  t( unixMutexHeld
7bb0: 28 29 20 29 3b 0a 2a 2a 20 20 20 75 6e 69 78 45  () );.**   unixE
7bc0: 6e 74 65 72 4c 65 61 76 65 28 29 0a 2a 2f 0a 73  nterLeave().*/.s
7bd0: 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 45  tatic void unixE
7be0: 6e 74 65 72 4d 75 74 65 78 28 76 6f 69 64 29 7b  nterMutex(void){
7bf0: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
7c00: 5f 65 6e 74 65 72 28 73 71 6c 69 74 65 33 4d 75  _enter(sqlite3Mu
7c10: 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  texAlloc(SQLITE_
7c20: 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53  MUTEX_STATIC_MAS
7c30: 54 45 52 29 29 3b 0a 7d 0a 73 74 61 74 69 63 20  TER));.}.static 
7c40: 76 6f 69 64 20 75 6e 69 78 4c 65 61 76 65 4d 75  void unixLeaveMu
7c50: 74 65 78 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c  tex(void){.  sql
7c60: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
7c70: 28 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c  (sqlite3MutexAll
7c80: 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
7c90: 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 29 3b  STATIC_MASTER));
7ca0: 0a 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  .}.#ifdef SQLITE
7cb0: 5f 44 45 42 55 47 0a 73 74 61 74 69 63 20 69 6e  _DEBUG.static in
7cc0: 74 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28  t unixMutexHeld(
7cd0: 76 6f 69 64 29 20 7b 0a 20 20 72 65 74 75 72 6e  void) {.  return
7ce0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
7cf0: 65 6c 64 28 73 71 6c 69 74 65 33 4d 75 74 65 78  eld(sqlite3Mutex
7d00: 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  Alloc(SQLITE_MUT
7d10: 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45 52  EX_STATIC_MASTER
7d20: 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23  ));.}.#endif...#
7d30: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
7d40: 45 5f 54 45 53 54 29 20 26 26 20 64 65 66 69 6e  E_TEST) && defin
7d50: 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29  ed(SQLITE_DEBUG)
7d60: 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72 20 66 75  ./*.** Helper fu
7d70: 6e 63 74 69 6f 6e 20 66 6f 72 20 70 72 69 6e 74  nction for print
7d80: 69 6e 67 20 6f 75 74 20 74 72 61 63 65 20 69 6e  ing out trace in
7d90: 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 64  formation from d
7da0: 65 62 75 67 67 69 6e 67 0a 2a 2a 20 62 69 6e 61  ebugging.** bina
7db0: 72 69 65 73 2e 20 54 68 69 73 20 72 65 74 75 72  ries. This retur
7dc0: 6e 73 20 74 68 65 20 73 74 72 69 6e 67 20 72 65  ns the string re
7dd0: 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20  presentation of 
7de0: 74 68 65 20 73 75 70 70 6c 69 65 64 0a 2a 2a 20  the supplied.** 
7df0: 69 6e 74 65 67 65 72 20 6c 6f 63 6b 2d 74 79 70  integer lock-typ
7e00: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  e..*/.static con
7e10: 73 74 20 63 68 61 72 20 2a 61 7a 46 69 6c 65 4c  st char *azFileL
7e20: 6f 63 6b 28 69 6e 74 20 65 46 69 6c 65 4c 6f 63  ock(int eFileLoc
7e30: 6b 29 7b 0a 20 20 73 77 69 74 63 68 28 20 65 46  k){.  switch( eF
7e40: 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 63  ileLock ){.    c
7e50: 61 73 65 20 4e 4f 5f 4c 4f 43 4b 3a 20 72 65 74  ase NO_LOCK: ret
7e60: 75 72 6e 20 22 4e 4f 4e 45 22 3b 0a 20 20 20 20  urn "NONE";.    
7e70: 63 61 73 65 20 53 48 41 52 45 44 5f 4c 4f 43 4b  case SHARED_LOCK
7e80: 3a 20 72 65 74 75 72 6e 20 22 53 48 41 52 45 44  : return "SHARED
7e90: 22 3b 0a 20 20 20 20 63 61 73 65 20 52 45 53 45  ";.    case RESE
7ea0: 52 56 45 44 5f 4c 4f 43 4b 3a 20 72 65 74 75 72  RVED_LOCK: retur
7eb0: 6e 20 22 52 45 53 45 52 56 45 44 22 3b 0a 20 20  n "RESERVED";.  
7ec0: 20 20 63 61 73 65 20 50 45 4e 44 49 4e 47 5f 4c    case PENDING_L
7ed0: 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 50 45 4e  OCK: return "PEN
7ee0: 44 49 4e 47 22 3b 0a 20 20 20 20 63 61 73 65 20  DING";.    case 
7ef0: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 3a 20  EXCLUSIVE_LOCK: 
7f00: 72 65 74 75 72 6e 20 22 45 58 43 4c 55 53 49 56  return "EXCLUSIV
7f10: 45 22 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  E";.  }.  return
7f20: 20 22 45 52 52 4f 52 22 3b 0a 7d 0a 23 65 6e 64   "ERROR";.}.#end
7f30: 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  if..#ifdef SQLIT
7f40: 45 5f 4c 4f 43 4b 5f 54 52 41 43 45 0a 2f 2a 0a  E_LOCK_TRACE./*.
7f50: 2a 2a 20 50 72 69 6e 74 20 6f 75 74 20 69 6e 66  ** Print out inf
7f60: 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 61  ormation about a
7f70: 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6f 70 65 72 61  ll locking opera
7f80: 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  tions..**.** Thi
7f90: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
7fa0: 64 20 66 6f 72 20 74 72 6f 75 62 6c 65 73 68 6f  d for troublesho
7fb0: 6f 74 69 6e 67 20 6c 6f 63 6b 73 20 6f 6e 20 6d  oting locks on m
7fc0: 75 6c 74 69 74 68 72 65 61 64 65 64 0a 2a 2a 20  ultithreaded.** 
7fd0: 70 6c 61 74 66 6f 72 6d 73 2e 20 20 45 6e 61 62  platforms.  Enab
7fe0: 6c 65 20 62 79 20 63 6f 6d 70 69 6c 69 6e 67 20  le by compiling 
7ff0: 77 69 74 68 20 74 68 65 20 2d 44 53 51 4c 49 54  with the -DSQLIT
8000: 45 5f 4c 4f 43 4b 5f 54 52 41 43 45 0a 2a 2a 20  E_LOCK_TRACE.** 
8010: 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 6f 70 74  command-line opt
8020: 69 6f 6e 20 6f 6e 20 74 68 65 20 63 6f 6d 70 69  ion on the compi
8030: 6c 65 72 2e 20 20 54 68 69 73 20 63 6f 64 65 20  ler.  This code 
8040: 69 73 20 6e 6f 72 6d 61 6c 6c 79 0a 2a 2a 20 74  is normally.** t
8050: 75 72 6e 65 64 20 6f 66 66 2e 0a 2a 2f 0a 73 74  urned off..*/.st
8060: 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b 54 72 61  atic int lockTra
8070: 63 65 28 69 6e 74 20 66 64 2c 20 69 6e 74 20 6f  ce(int fd, int o
8080: 70 2c 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20  p, struct flock 
8090: 2a 70 29 7b 0a 20 20 63 68 61 72 20 2a 7a 4f 70  *p){.  char *zOp
80a0: 4e 61 6d 65 2c 20 2a 7a 54 79 70 65 3b 0a 20 20  Name, *zType;.  
80b0: 69 6e 74 20 73 3b 0a 20 20 69 6e 74 20 73 61 76  int s;.  int sav
80c0: 65 64 45 72 72 6e 6f 3b 0a 20 20 69 66 28 20 6f  edErrno;.  if( o
80d0: 70 3d 3d 46 5f 47 45 54 4c 4b 20 29 7b 0a 20 20  p==F_GETLK ){.  
80e0: 20 20 7a 4f 70 4e 61 6d 65 20 3d 20 22 47 45 54    zOpName = "GET
80f0: 4c 4b 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  LK";.  }else if(
8100: 20 6f 70 3d 3d 46 5f 53 45 54 4c 4b 20 29 7b 0a   op==F_SETLK ){.
8110: 20 20 20 20 7a 4f 70 4e 61 6d 65 20 3d 20 22 53      zOpName = "S
8120: 45 54 4c 4b 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ETLK";.  }else{.
8130: 20 20 20 20 73 20 3d 20 6f 73 46 63 6e 74 6c 28      s = osFcntl(
8140: 66 64 2c 20 6f 70 2c 20 70 29 3b 0a 20 20 20 20  fd, op, p);.    
8150: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
8160: 74 66 28 22 66 63 6e 74 6c 20 75 6e 6b 6e 6f 77  tf("fcntl unknow
8170: 6e 20 25 64 20 25 64 20 25 64 5c 6e 22 2c 20 66  n %d %d %d\n", f
8180: 64 2c 20 6f 70 2c 20 73 29 3b 0a 20 20 20 20 72  d, op, s);.    r
8190: 65 74 75 72 6e 20 73 3b 0a 20 20 7d 0a 20 20 69  eturn s;.  }.  i
81a0: 66 28 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f  f( p->l_type==F_
81b0: 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20 7a 54 79  RDLCK ){.    zTy
81c0: 70 65 20 3d 20 22 52 44 4c 43 4b 22 3b 0a 20 20  pe = "RDLCK";.  
81d0: 7d 65 6c 73 65 20 69 66 28 20 70 2d 3e 6c 5f 74  }else if( p->l_t
81e0: 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 7b 0a  ype==F_WRLCK ){.
81f0: 20 20 20 20 7a 54 79 70 65 20 3d 20 22 57 52 4c      zType = "WRL
8200: 43 4b 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  CK";.  }else if(
8210: 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 55 4e   p->l_type==F_UN
8220: 4c 43 4b 20 29 7b 0a 20 20 20 20 7a 54 79 70 65  LCK ){.    zType
8230: 20 3d 20 22 55 4e 4c 43 4b 22 3b 0a 20 20 7d 65   = "UNLCK";.  }e
8240: 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
8250: 20 30 20 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65   0 );.  }.  asse
8260: 72 74 28 20 70 2d 3e 6c 5f 77 68 65 6e 63 65 3d  rt( p->l_whence=
8270: 3d 53 45 45 4b 5f 53 45 54 20 29 3b 0a 20 20 73  =SEEK_SET );.  s
8280: 20 3d 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20 6f   = osFcntl(fd, o
8290: 70 2c 20 70 29 3b 0a 20 20 73 61 76 65 64 45 72  p, p);.  savedEr
82a0: 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 73  rno = errno;.  s
82b0: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
82c0: 66 28 22 66 63 6e 74 6c 20 25 64 20 25 64 20 25  f("fcntl %d %d %
82d0: 73 20 25 73 20 25 64 20 25 64 20 25 64 20 25 64  s %s %d %d %d %d
82e0: 5c 6e 22 2c 0a 20 20 20 20 20 74 68 72 65 61 64  \n",.     thread
82f0: 69 64 2c 20 66 64 2c 20 7a 4f 70 4e 61 6d 65 2c  id, fd, zOpName,
8300: 20 7a 54 79 70 65 2c 20 28 69 6e 74 29 70 2d 3e   zType, (int)p->
8310: 6c 5f 73 74 61 72 74 2c 20 28 69 6e 74 29 70 2d  l_start, (int)p-
8320: 3e 6c 5f 6c 65 6e 2c 0a 20 20 20 20 20 28 69 6e  >l_len,.     (in
8330: 74 29 70 2d 3e 6c 5f 70 69 64 2c 20 73 29 3b 0a  t)p->l_pid, s);.
8340: 20 20 69 66 28 20 73 3d 3d 28 2d 31 29 20 26 26    if( s==(-1) &&
8350: 20 6f 70 3d 3d 46 5f 53 45 54 4c 4b 20 26 26 20   op==F_SETLK && 
8360: 28 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 52 44  (p->l_type==F_RD
8370: 4c 43 4b 20 7c 7c 20 70 2d 3e 6c 5f 74 79 70 65  LCK || p->l_type
8380: 3d 3d 46 5f 57 52 4c 43 4b 29 20 29 7b 0a 20 20  ==F_WRLCK) ){.  
8390: 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c    struct flock l
83a0: 32 3b 0a 20 20 20 20 6c 32 20 3d 20 2a 70 3b 0a  2;.    l2 = *p;.
83b0: 20 20 20 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20      osFcntl(fd, 
83c0: 46 5f 47 45 54 4c 4b 2c 20 26 6c 32 29 3b 0a 20  F_GETLK, &l2);. 
83d0: 20 20 20 69 66 28 20 6c 32 2e 6c 5f 74 79 70 65     if( l2.l_type
83e0: 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20 20  ==F_RDLCK ){.   
83f0: 20 20 20 7a 54 79 70 65 20 3d 20 22 52 44 4c 43     zType = "RDLC
8400: 4b 22 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  K";.    }else if
8410: 28 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f 57  ( l2.l_type==F_W
8420: 52 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 7a 54  RLCK ){.      zT
8430: 79 70 65 20 3d 20 22 57 52 4c 43 4b 22 3b 0a 20  ype = "WRLCK";. 
8440: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 32 2e     }else if( l2.
8450: 6c 5f 74 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20  l_type==F_UNLCK 
8460: 29 7b 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d  ){.      zType =
8470: 20 22 55 4e 4c 43 4b 22 3b 0a 20 20 20 20 7d 65   "UNLCK";.    }e
8480: 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
8490: 74 28 20 30 20 29 3b 0a 20 20 20 20 7d 0a 20 20  t( 0 );.    }.  
84a0: 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
84b0: 69 6e 74 66 28 22 66 63 6e 74 6c 2d 66 61 69 6c  intf("fcntl-fail
84c0: 75 72 65 2d 72 65 61 73 6f 6e 3a 20 25 73 20 25  ure-reason: %s %
84d0: 64 20 25 64 20 25 64 5c 6e 22 2c 0a 20 20 20 20  d %d %d\n",.    
84e0: 20 20 20 7a 54 79 70 65 2c 20 28 69 6e 74 29 6c     zType, (int)l
84f0: 32 2e 6c 5f 73 74 61 72 74 2c 20 28 69 6e 74 29  2.l_start, (int)
8500: 6c 32 2e 6c 5f 6c 65 6e 2c 20 28 69 6e 74 29 6c  l2.l_len, (int)l
8510: 32 2e 6c 5f 70 69 64 29 3b 0a 20 20 7d 0a 20 20  2.l_pid);.  }.  
8520: 65 72 72 6e 6f 20 3d 20 73 61 76 65 64 45 72 72  errno = savedErr
8530: 6e 6f 3b 0a 20 20 72 65 74 75 72 6e 20 73 3b 0a  no;.  return s;.
8540: 7d 0a 23 75 6e 64 65 66 20 6f 73 46 63 6e 74 6c  }.#undef osFcntl
8550: 0a 23 64 65 66 69 6e 65 20 6f 73 46 63 6e 74 6c  .#define osFcntl
8560: 20 6c 6f 63 6b 54 72 61 63 65 0a 23 65 6e 64 69   lockTrace.#endi
8570: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  f /* SQLITE_LOCK
8580: 5f 54 52 41 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _TRACE */../*.**
8590: 20 52 65 74 72 79 20 66 74 72 75 6e 63 61 74 65   Retry ftruncate
85a0: 28 29 20 63 61 6c 6c 73 20 74 68 61 74 20 66 61  () calls that fa
85b0: 69 6c 20 64 75 65 20 74 6f 20 45 49 4e 54 52 0a  il due to EINTR.
85c0: 2a 2a 0a 2a 2a 20 41 6c 6c 20 63 61 6c 6c 73 20  **.** All calls 
85d0: 74 6f 20 66 74 72 75 6e 63 61 74 65 28 29 20 77  to ftruncate() w
85e0: 69 74 68 69 6e 20 74 68 69 73 20 66 69 6c 65 20  ithin this file 
85f0: 73 68 6f 75 6c 64 20 62 65 20 6d 61 64 65 20 74  should be made t
8600: 68 72 6f 75 67 68 0a 2a 2a 20 74 68 69 73 20 77  hrough.** this w
8610: 72 61 70 70 65 72 2e 20 20 4f 6e 20 74 68 65 20  rapper.  On the 
8620: 41 6e 64 72 6f 69 64 20 70 6c 61 74 66 6f 72 6d  Android platform
8630: 2c 20 62 79 70 61 73 73 69 6e 67 20 74 68 65 20  , bypassing the 
8640: 6c 6f 67 69 63 20 62 65 6c 6f 77 0a 2a 2a 20 63  logic below.** c
8650: 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20 61 20 63  ould lead to a c
8660: 6f 72 72 75 70 74 20 64 61 74 61 62 61 73 65 2e  orrupt database.
8670: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
8680: 6f 62 75 73 74 5f 66 74 72 75 6e 63 61 74 65 28  obust_ftruncate(
8690: 69 6e 74 20 68 2c 20 73 71 6c 69 74 65 33 5f 69  int h, sqlite3_i
86a0: 6e 74 36 34 20 73 7a 29 7b 0a 20 20 69 6e 74 20  nt64 sz){.  int 
86b0: 72 63 3b 0a 23 69 66 64 65 66 20 5f 5f 41 4e 44  rc;.#ifdef __AND
86c0: 52 4f 49 44 5f 5f 0a 20 20 2f 2a 20 4f 6e 20 41  ROID__.  /* On A
86d0: 6e 64 72 6f 69 64 2c 20 66 74 72 75 6e 63 61 74  ndroid, ftruncat
86e0: 65 28 29 20 61 6c 77 61 79 73 20 75 73 65 73 20  e() always uses 
86f0: 33 32 2d 62 69 74 20 6f 66 66 73 65 74 73 2c 20  32-bit offsets, 
8700: 65 76 65 6e 20 69 66 20 0a 20 20 2a 2a 20 5f 46  even if .  ** _F
8710: 49 4c 45 5f 4f 46 46 53 45 54 5f 42 49 54 53 3d  ILE_OFFSET_BITS=
8720: 36 34 20 69 73 20 64 65 66 69 6e 65 64 2e 20 54  64 is defined. T
8730: 68 69 73 20 6d 65 61 6e 73 20 69 74 20 69 73 20  his means it is 
8740: 75 6e 73 61 66 65 20 74 6f 20 61 74 74 65 6d 70  unsafe to attemp
8750: 74 20 74 6f 0a 20 20 2a 2a 20 74 72 75 6e 63 61  t to.  ** trunca
8760: 74 65 20 61 20 66 69 6c 65 20 74 6f 20 61 6e 79  te a file to any
8770: 20 73 69 7a 65 20 6c 61 72 67 65 72 20 74 68 61   size larger tha
8780: 6e 20 32 47 69 42 2e 20 53 69 6c 65 6e 74 6c 79  n 2GiB. Silently
8790: 20 69 67 6e 6f 72 65 20 61 6e 79 0a 20 20 2a 2a   ignore any.  **
87a0: 20 73 75 63 68 20 61 74 74 65 6d 70 74 73 2e 20   such attempts. 
87b0: 20 2a 2f 0a 20 20 69 66 28 20 73 7a 3e 28 73 71   */.  if( sz>(sq
87c0: 6c 69 74 65 33 5f 69 6e 74 36 34 29 30 78 37 46  lite3_int64)0x7F
87d0: 46 46 46 46 46 46 20 29 7b 0a 20 20 20 20 72 63  FFFFFF ){.    rc
87e0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
87f0: 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 64  }else.#endif.  d
8800: 6f 7b 20 72 63 20 3d 20 6f 73 46 74 72 75 6e 63  o{ rc = osFtrunc
8810: 61 74 65 28 68 2c 73 7a 29 3b 20 7d 77 68 69 6c  ate(h,sz); }whil
8820: 65 28 20 72 63 3c 30 20 26 26 20 65 72 72 6e 6f  e( rc<0 && errno
8830: 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20 72 65 74  ==EINTR );.  ret
8840: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
8850: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 74 72   This routine tr
8860: 61 6e 73 6c 61 74 65 73 20 61 20 73 74 61 6e 64  anslates a stand
8870: 61 72 64 20 50 4f 53 49 58 20 65 72 72 6e 6f 20  ard POSIX errno 
8880: 63 6f 64 65 20 69 6e 74 6f 20 73 6f 6d 65 74 68  code into someth
8890: 69 6e 67 0a 2a 2a 20 75 73 65 66 75 6c 20 74 6f  ing.** useful to
88a0: 20 74 68 65 20 63 6c 69 65 6e 74 73 20 6f 66 20   the clients of 
88b0: 74 68 65 20 73 71 6c 69 74 65 33 20 66 75 6e 63  the sqlite3 func
88c0: 74 69 6f 6e 73 2e 20 20 53 70 65 63 69 66 69 63  tions.  Specific
88d0: 61 6c 6c 79 2c 20 69 74 20 69 73 0a 2a 2a 20 69  ally, it is.** i
88e0: 6e 74 65 6e 64 65 64 20 74 6f 20 74 72 61 6e 73  ntended to trans
88f0: 6c 61 74 65 20 61 20 76 61 72 69 65 74 79 20 6f  late a variety o
8900: 66 20 22 74 72 79 20 61 67 61 69 6e 22 20 65 72  f "try again" er
8910: 72 6f 72 73 20 69 6e 74 6f 20 53 51 4c 49 54 45  rors into SQLITE
8920: 5f 42 55 53 59 0a 2a 2a 20 61 6e 64 20 61 20 76  _BUSY.** and a v
8930: 61 72 69 65 74 79 20 6f 66 20 22 70 6c 65 61 73  ariety of "pleas
8940: 65 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65  e close the file
8950: 20 64 65 73 63 72 69 70 74 6f 72 20 4e 4f 57 22   descriptor NOW"
8960: 20 65 72 72 6f 72 73 20 69 6e 74 6f 20 0a 2a 2a   errors into .**
8970: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a 2a 2a   SQLITE_IOERR.**
8980: 20 0a 2a 2a 20 45 72 72 6f 72 73 20 64 75 72 69   .** Errors duri
8990: 6e 67 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  ng initializatio
89a0: 6e 20 6f 66 20 6c 6f 63 6b 73 2c 20 6f 72 20 66  n of locks, or f
89b0: 69 6c 65 20 73 79 73 74 65 6d 20 73 75 70 70 6f  ile system suppo
89c0: 72 74 20 66 6f 72 20 6c 6f 63 6b 73 2c 0a 2a 2a  rt for locks,.**
89d0: 20 73 68 6f 75 6c 64 20 68 61 6e 64 6c 65 20 45   should handle E
89e0: 4e 4f 4c 43 4b 2c 20 45 4e 4f 54 53 55 50 2c 20  NOLCK, ENOTSUP, 
89f0: 45 4f 50 4e 4f 54 53 55 50 50 20 73 65 70 61 72  EOPNOTSUPP separ
8a00: 61 74 65 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  ately..*/.static
8a10: 20 69 6e 74 20 73 71 6c 69 74 65 45 72 72 6f 72   int sqliteError
8a20: 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 69  FromPosixError(i
8a30: 6e 74 20 70 6f 73 69 78 45 72 72 6f 72 2c 20 69  nt posixError, i
8a40: 6e 74 20 73 71 6c 69 74 65 49 4f 45 72 72 29 20  nt sqliteIOErr) 
8a50: 7b 0a 20 20 73 77 69 74 63 68 20 28 70 6f 73 69  {.  switch (posi
8a60: 78 45 72 72 6f 72 29 20 7b 0a 23 69 66 20 30 0a  xError) {.#if 0.
8a70: 20 20 2f 2a 20 41 74 20 6f 6e 65 20 70 6f 69 6e    /* At one poin
8a80: 74 20 74 68 69 73 20 63 6f 64 65 20 77 61 73 20  t this code was 
8a90: 6e 6f 74 20 63 6f 6d 6d 65 6e 74 65 64 20 6f 75  not commented ou
8aa0: 74 2e 20 49 6e 20 74 68 65 6f 72 79 2c 20 74 68  t. In theory, th
8ab0: 69 73 20 62 72 61 6e 63 68 0a 20 20 2a 2a 20 73  is branch.  ** s
8ac0: 68 6f 75 6c 64 20 6e 65 76 65 72 20 62 65 20 68  hould never be h
8ad0: 69 74 2c 20 61 73 20 74 68 69 73 20 66 75 6e 63  it, as this func
8ae0: 74 69 6f 6e 20 73 68 6f 75 6c 64 20 6f 6e 6c 79  tion should only
8af0: 20 62 65 20 63 61 6c 6c 65 64 20 61 66 74 65 72   be called after
8b00: 0a 20 20 2a 2a 20 61 20 6c 6f 63 6b 69 6e 67 2d  .  ** a locking-
8b10: 72 65 6c 61 74 65 64 20 66 75 6e 63 74 69 6f 6e  related function
8b20: 20 28 69 2e 65 2e 20 66 63 6e 74 6c 28 29 29 20   (i.e. fcntl()) 
8b30: 68 61 73 20 72 65 74 75 72 6e 65 64 20 6e 6f 6e  has returned non
8b40: 2d 7a 65 72 6f 20 77 69 74 68 0a 20 20 2a 2a 20  -zero with.  ** 
8b50: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 65 72 72  the value of err
8b60: 6e 6f 20 61 73 20 74 68 65 20 66 69 72 73 74 20  no as the first 
8b70: 61 72 67 75 6d 65 6e 74 2e 20 53 69 6e 63 65 20  argument. Since 
8b80: 61 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 68 61  a system call ha
8b90: 73 20 66 61 69 6c 65 64 2c 0a 20 20 2a 2a 20 65  s failed,.  ** e
8ba0: 72 72 6e 6f 20 73 68 6f 75 6c 64 20 62 65 20 6e  rrno should be n
8bb0: 6f 6e 2d 7a 65 72 6f 2e 0a 20 20 2a 2a 0a 20 20  on-zero..  **.  
8bc0: 2a 2a 20 44 65 73 70 69 74 65 20 74 68 69 73 2c  ** Despite this,
8bd0: 20 69 66 20 65 72 72 6e 6f 20 72 65 61 6c 6c 79   if errno really
8be0: 20 69 73 20 7a 65 72 6f 2c 20 77 65 20 73 74 69   is zero, we sti
8bf0: 6c 6c 20 64 6f 6e 27 74 20 77 61 6e 74 20 74 6f  ll don't want to
8c00: 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 53 51 4c   return.  ** SQL
8c10: 49 54 45 5f 4f 4b 2e 20 54 68 65 20 73 79 73 74  ITE_OK. The syst
8c20: 65 6d 20 63 61 6c 6c 20 66 61 69 6c 65 64 2c 20  em call failed, 
8c30: 61 6e 64 20 2a 73 6f 6d 65 2a 20 53 51 4c 69 74  and *some* SQLit
8c40: 65 20 65 72 72 6f 72 20 73 68 6f 75 6c 64 20 62  e error should b
8c50: 65 0a 20 20 2a 2a 20 70 72 6f 70 61 67 61 74 65  e.  ** propagate
8c60: 64 20 62 61 63 6b 20 74 6f 20 74 68 65 20 63 61  d back to the ca
8c70: 6c 6c 65 72 2e 20 43 6f 6d 6d 65 6e 74 69 6e 67  ller. Commenting
8c80: 20 74 68 69 73 20 62 72 61 6e 63 68 20 6f 75 74   this branch out
8c90: 20 6d 65 61 6e 73 20 65 72 72 6e 6f 3d 3d 30 0a   means errno==0.
8ca0: 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20 68 61 6e    ** will be han
8cb0: 64 6c 65 64 20 62 79 20 74 68 65 20 22 64 65 66  dled by the "def
8cc0: 61 75 6c 74 3a 22 20 63 61 73 65 20 62 65 6c 6f  ault:" case belo
8cd0: 77 2e 0a 20 20 2a 2f 0a 20 20 63 61 73 65 20 30  w..  */.  case 0
8ce0: 3a 20 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  : .    return SQ
8cf0: 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a  LITE_OK;.#endif.
8d00: 0a 20 20 63 61 73 65 20 45 41 47 41 49 4e 3a 0a  .  case EAGAIN:.
8d10: 20 20 63 61 73 65 20 45 54 49 4d 45 44 4f 55 54    case ETIMEDOUT
8d20: 3a 0a 20 20 63 61 73 65 20 45 42 55 53 59 3a 0a  :.  case EBUSY:.
8d30: 20 20 63 61 73 65 20 45 49 4e 54 52 3a 0a 20 20    case EINTR:.  
8d40: 63 61 73 65 20 45 4e 4f 4c 43 4b 3a 20 20 0a 20  case ENOLCK:  . 
8d50: 20 20 20 2f 2a 20 72 61 6e 64 6f 6d 20 4e 46 53     /* random NFS
8d60: 20 72 65 74 72 79 20 65 72 72 6f 72 2c 20 75 6e   retry error, un
8d70: 6c 65 73 73 20 64 75 72 69 6e 67 20 66 69 6c 65  less during file
8d80: 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 20   system support 
8d90: 0a 20 20 20 20 20 2a 20 69 6e 74 72 6f 73 70 65  .     * introspe
8da0: 63 74 69 6f 6e 2c 20 69 6e 20 77 68 69 63 68 20  ction, in which 
8db0: 69 74 20 61 63 74 75 61 6c 6c 79 20 6d 65 61 6e  it actually mean
8dc0: 73 20 77 68 61 74 20 69 74 20 73 61 79 73 20 2a  s what it says *
8dd0: 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  /.    return SQL
8de0: 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 0a 20  ITE_BUSY;.    . 
8df0: 20 63 61 73 65 20 45 41 43 43 45 53 3a 20 0a 20   case EACCES: . 
8e00: 20 20 20 2f 2a 20 45 41 43 43 45 53 20 69 73 20     /* EACCES is 
8e10: 6c 69 6b 65 20 45 41 47 41 49 4e 20 64 75 72 69  like EAGAIN duri
8e20: 6e 67 20 6c 6f 63 6b 69 6e 67 20 6f 70 65 72 61  ng locking opera
8e30: 74 69 6f 6e 73 2c 20 62 75 74 20 6e 6f 74 20 61  tions, but not a
8e40: 6e 79 20 6f 74 68 65 72 20 74 69 6d 65 2a 2f 0a  ny other time*/.
8e50: 20 20 20 20 69 66 28 20 28 73 71 6c 69 74 65 49      if( (sqliteI
8e60: 4f 45 72 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49  OErr == SQLITE_I
8e70: 4f 45 52 52 5f 4c 4f 43 4b 29 20 7c 7c 20 0a 20  OERR_LOCK) || . 
8e80: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 49 4f         (sqliteIO
8e90: 45 72 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f  Err == SQLITE_IO
8ea0: 45 52 52 5f 55 4e 4c 4f 43 4b 29 20 7c 7c 20 0a  ERR_UNLOCK) || .
8eb0: 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 49          (sqliteI
8ec0: 4f 45 72 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49  OErr == SQLITE_I
8ed0: 4f 45 52 52 5f 52 44 4c 4f 43 4b 29 20 7c 7c 0a  OERR_RDLOCK) ||.
8ee0: 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 49          (sqliteI
8ef0: 4f 45 72 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49  OErr == SQLITE_I
8f00: 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56  OERR_CHECKRESERV
8f10: 45 44 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20 20  EDLOCK) ){.     
8f20: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
8f30: 55 53 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f  USY;.    }.    /
8f40: 2a 20 65 6c 73 65 20 66 61 6c 6c 20 74 68 72 6f  * else fall thro
8f50: 75 67 68 20 2a 2f 0a 20 20 63 61 73 65 20 45 50  ugh */.  case EP
8f60: 45 52 4d 3a 20 0a 20 20 20 20 72 65 74 75 72 6e  ERM: .    return
8f70: 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20   SQLITE_PERM;.  
8f80: 20 20 0a 23 69 66 20 45 4f 50 4e 4f 54 53 55 50    .#if EOPNOTSUP
8f90: 50 21 3d 45 4e 4f 54 53 55 50 0a 20 20 63 61 73  P!=ENOTSUP.  cas
8fa0: 65 20 45 4f 50 4e 4f 54 53 55 50 50 3a 20 0a 20  e EOPNOTSUPP: . 
8fb0: 20 20 20 2f 2a 20 73 6f 6d 65 74 68 69 6e 67 20     /* something 
8fc0: 77 65 6e 74 20 74 65 72 72 69 62 6c 79 20 61 77  went terribly aw
8fd0: 72 79 2c 20 75 6e 6c 65 73 73 20 64 75 72 69 6e  ry, unless durin
8fe0: 67 20 66 69 6c 65 20 73 79 73 74 65 6d 20 73 75  g file system su
8ff0: 70 70 6f 72 74 20 0a 20 20 20 20 20 2a 20 69 6e  pport .     * in
9000: 74 72 6f 73 70 65 63 74 69 6f 6e 2c 20 69 6e 20  trospection, in 
9010: 77 68 69 63 68 20 69 74 20 61 63 74 75 61 6c 6c  which it actuall
9020: 79 20 6d 65 61 6e 73 20 77 68 61 74 20 69 74 20  y means what it 
9030: 73 61 79 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 23  says */.#endif.#
9040: 69 66 64 65 66 20 45 4e 4f 54 53 55 50 0a 20 20  ifdef ENOTSUP.  
9050: 63 61 73 65 20 45 4e 4f 54 53 55 50 3a 20 0a 20  case ENOTSUP: . 
9060: 20 20 20 2f 2a 20 69 6e 76 61 6c 69 64 20 66 64     /* invalid fd
9070: 2c 20 75 6e 6c 65 73 73 20 64 75 72 69 6e 67 20  , unless during 
9080: 66 69 6c 65 20 73 79 73 74 65 6d 20 73 75 70 70  file system supp
9090: 6f 72 74 20 69 6e 74 72 6f 73 70 65 63 74 69 6f  ort introspectio
90a0: 6e 2c 20 69 6e 20 77 68 69 63 68 20 0a 20 20 20  n, in which .   
90b0: 20 20 2a 20 69 74 20 61 63 74 75 61 6c 6c 79 20    * it actually 
90c0: 6d 65 61 6e 73 20 77 68 61 74 20 69 74 20 73 61  means what it sa
90d0: 79 73 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 63  ys */.#endif.  c
90e0: 61 73 65 20 45 49 4f 3a 0a 20 20 63 61 73 65 20  ase EIO:.  case 
90f0: 45 42 41 44 46 3a 0a 20 20 63 61 73 65 20 45 49  EBADF:.  case EI
9100: 4e 56 41 4c 3a 0a 20 20 63 61 73 65 20 45 4e 4f  NVAL:.  case ENO
9110: 54 43 4f 4e 4e 3a 0a 20 20 63 61 73 65 20 45 4e  TCONN:.  case EN
9120: 4f 44 45 56 3a 0a 20 20 63 61 73 65 20 45 4e 58  ODEV:.  case ENX
9130: 49 4f 3a 0a 20 20 63 61 73 65 20 45 4e 4f 45 4e  IO:.  case ENOEN
9140: 54 3a 0a 23 69 66 64 65 66 20 45 53 54 41 4c 45  T:.#ifdef ESTALE
9150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9160: 20 20 20 20 20 2f 2a 20 45 53 54 41 4c 45 20 69       /* ESTALE i
9170: 73 20 6e 6f 74 20 64 65 66 69 6e 65 64 20 6f 6e  s not defined on
9180: 20 49 6e 74 65 72 69 78 20 73 79 73 74 65 6d 73   Interix systems
9190: 20 2a 2f 0a 20 20 63 61 73 65 20 45 53 54 41 4c   */.  case ESTAL
91a0: 45 3a 0a 23 65 6e 64 69 66 0a 20 20 63 61 73 65  E:.#endif.  case
91b0: 20 45 4e 4f 53 59 53 3a 0a 20 20 20 20 2f 2a 20   ENOSYS:.    /* 
91c0: 74 68 65 73 65 20 73 68 6f 75 6c 64 20 66 6f 72  these should for
91d0: 63 65 20 74 68 65 20 63 6c 69 65 6e 74 20 74 6f  ce the client to
91e0: 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20   close the file 
91f0: 61 6e 64 20 72 65 63 6f 6e 6e 65 63 74 20 2a 2f  and reconnect */
9200: 0a 20 20 20 20 0a 20 20 64 65 66 61 75 6c 74 3a  .    .  default:
9210: 20 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c   .    return sql
9220: 69 74 65 49 4f 45 72 72 3b 0a 20 20 7d 0a 7d 0a  iteIOErr;.  }.}.
9230: 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
9240: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9250: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9260: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9270: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9280: 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
9290: 2a 2a 2a 2a 20 42 65 67 69 6e 20 55 6e 69 71 75  **** Begin Uniqu
92a0: 65 20 46 69 6c 65 20 49 44 20 55 74 69 6c 69 74  e File ID Utilit
92b0: 79 20 55 73 65 64 20 42 79 20 56 78 57 6f 72 6b  y Used By VxWork
92c0: 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  s **************
92d0: 2a 0a 2a 2a 0a 2a 2a 20 4f 6e 20 6d 6f 73 74 20  *.**.** On most 
92e0: 76 65 72 73 69 6f 6e 73 20 6f 66 20 75 6e 69 78  versions of unix
92f0: 2c 20 77 65 20 63 61 6e 20 67 65 74 20 61 20 75  , we can get a u
9300: 6e 69 71 75 65 20 49 44 20 66 6f 72 20 61 20 66  nique ID for a f
9310: 69 6c 65 20 62 79 20 63 6f 6e 63 61 74 65 6e 61  ile by concatena
9320: 74 69 6e 67 0a 2a 2a 20 74 68 65 20 64 65 76 69  ting.** the devi
9330: 63 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 74 68  ce number and th
9340: 65 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72 2e 20  e inode number. 
9350: 20 42 75 74 20 74 68 69 73 20 64 6f 65 73 20 6e   But this does n
9360: 6f 74 20 77 6f 72 6b 20 6f 6e 20 56 78 57 6f 72  ot work on VxWor
9370: 6b 73 2e 0a 2a 2a 20 4f 6e 20 56 78 57 6f 72 6b  ks..** On VxWork
9380: 73 2c 20 61 20 75 6e 69 71 75 65 20 66 69 6c 65  s, a unique file
9390: 20 69 64 20 6d 75 73 74 20 62 65 20 62 61 73 65   id must be base
93a0: 64 20 6f 6e 20 74 68 65 20 63 61 6e 6f 6e 69 63  d on the canonic
93b0: 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 0a 2a 2a 0a  al filename..**.
93c0: 2a 2a 20 41 20 70 6f 69 6e 74 65 72 20 74 6f 20  ** A pointer to 
93d0: 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  an instance of t
93e0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
93f0: 75 63 74 75 72 65 20 63 61 6e 20 62 65 20 75 73  ucture can be us
9400: 65 64 20 61 73 20 61 0a 2a 2a 20 75 6e 69 71 75  ed as a.** uniqu
9410: 65 20 66 69 6c 65 20 49 44 20 69 6e 20 56 78 57  e file ID in VxW
9420: 6f 72 6b 73 2e 20 20 45 61 63 68 20 69 6e 73 74  orks.  Each inst
9430: 61 6e 63 65 20 6f 66 20 74 68 69 73 20 73 74 72  ance of this str
9440: 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 0a  ucture contains.
9450: 2a 2a 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  ** a copy of the
9460: 20 63 61 6e 6f 6e 69 63 61 6c 20 66 69 6c 65 6e   canonical filen
9470: 61 6d 65 2e 20 20 54 68 65 72 65 20 69 73 20 61  ame.  There is a
9480: 6c 73 6f 20 61 20 72 65 66 65 72 65 6e 63 65 20  lso a reference 
9490: 63 6f 75 6e 74 2e 20 20 0a 2a 2a 20 54 68 65 20  count.  .** The 
94a0: 73 74 72 75 63 74 75 72 65 20 69 73 20 72 65 63  structure is rec
94b0: 6c 61 69 6d 65 64 20 77 68 65 6e 20 74 68 65 20  laimed when the 
94c0: 6e 75 6d 62 65 72 20 6f 66 20 70 6f 69 6e 74 65  number of pointe
94d0: 72 73 20 74 6f 20 69 74 20 64 72 6f 70 73 20 74  rs to it drops t
94e0: 6f 0a 2a 2a 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a  o.** zero..**.**
94f0: 20 54 68 65 72 65 20 61 72 65 20 6e 65 76 65 72   There are never
9500: 20 76 65 72 79 20 6d 61 6e 79 20 66 69 6c 65 73   very many files
9510: 20 6f 70 65 6e 20 61 74 20 6f 6e 65 20 74 69 6d   open at one tim
9520: 65 20 61 6e 64 20 6c 6f 6f 6b 75 70 73 20 61 72  e and lookups ar
9530: 65 20 6e 6f 74 0a 2a 2a 20 61 20 70 65 72 66 6f  e not.** a perfo
9540: 72 6d 61 6e 63 65 2d 63 72 69 74 69 63 61 6c 20  rmance-critical 
9550: 70 61 74 68 2c 20 73 6f 20 69 74 20 69 73 20 73  path, so it is s
9560: 75 66 66 69 63 69 65 6e 74 20 74 6f 20 70 75 74  ufficient to put
9570: 20 74 68 65 73 65 0a 2a 2a 20 73 74 72 75 63 74   these.** struct
9580: 75 72 65 73 20 6f 6e 20 61 20 6c 69 6e 6b 65 64  ures on a linked
9590: 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 72 75 63 74   list..*/.struct
95a0: 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 7b   vxworksFileId {
95b0: 0a 20 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b  .  struct vxwork
95c0: 73 46 69 6c 65 49 64 20 2a 70 4e 65 78 74 3b 20  sFileId *pNext; 
95d0: 20 2f 2a 20 4e 65 78 74 20 69 6e 20 61 20 6c 69   /* Next in a li
95e0: 73 74 20 6f 66 20 74 68 65 6d 20 61 6c 6c 20 2a  st of them all *
95f0: 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20  /.  int nRef;   
9600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9610: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
9620: 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 69  eferences to thi
9630: 73 20 6f 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  s one */.  int n
9640: 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  Name;           
9650: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67           /* Leng
9660: 74 68 20 6f 66 20 74 68 65 20 7a 43 61 6e 6f 6e  th of the zCanon
9670: 69 63 61 6c 4e 61 6d 65 5b 5d 20 73 74 72 69 6e  icalName[] strin
9680: 67 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43 61  g */.  char *zCa
9690: 6e 6f 6e 69 63 61 6c 4e 61 6d 65 3b 20 20 20 20  nonicalName;    
96a0: 20 20 20 20 20 2f 2a 20 43 61 6e 6f 6e 69 63 61       /* Canonica
96b0: 6c 20 66 69 6c 65 6e 61 6d 65 20 2a 2f 0a 7d 3b  l filename */.};
96c0: 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53  ..#if OS_VXWORKS
96d0: 0a 2f 2a 20 0a 2a 2a 20 41 6c 6c 20 75 6e 69 71  ./* .** All uniq
96e0: 75 65 20 66 69 6c 65 6e 61 6d 65 73 20 61 72 65  ue filenames are
96f0: 20 68 65 6c 64 20 6f 6e 20 61 20 6c 69 6e 6b 65   held on a linke
9700: 64 20 6c 69 73 74 20 68 65 61 64 65 64 20 62 79  d list headed by
9710: 20 74 68 69 73 0a 2a 2a 20 76 61 72 69 61 62 6c   this.** variabl
9720: 65 3a 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72  e:.*/.static str
9730: 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49  uct vxworksFileI
9740: 64 20 2a 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69  d *vxworksFileLi
9750: 73 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 53  st = 0;../*.** S
9760: 69 6d 70 6c 69 66 79 20 61 20 66 69 6c 65 6e 61  implify a filena
9770: 6d 65 20 69 6e 74 6f 20 69 74 73 20 63 61 6e 6f  me into its cano
9780: 6e 69 63 61 6c 20 66 6f 72 6d 0a 2a 2a 20 62 79  nical form.** by
9790: 20 6d 61 6b 69 6e 67 20 74 68 65 20 66 6f 6c 6c   making the foll
97a0: 6f 77 69 6e 67 20 63 68 61 6e 67 65 73 3a 0a 2a  owing changes:.*
97b0: 2a 0a 2a 2a 20 20 2a 20 72 65 6d 6f 76 69 6e 67  *.**  * removing
97c0: 20 61 6e 79 20 74 72 61 69 6c 69 6e 67 20 61 6e   any trailing an
97d0: 64 20 64 75 70 6c 69 63 61 74 65 20 2f 0a 2a 2a  d duplicate /.**
97e0: 20 20 2a 20 63 6f 6e 76 65 72 74 20 2f 2e 2f 20    * convert /./ 
97f0: 69 6e 74 6f 20 6a 75 73 74 20 2f 0a 2a 2a 20 20  into just /.**  
9800: 2a 20 63 6f 6e 76 65 72 74 20 2f 41 2f 2e 2e 2f  * convert /A/../
9810: 20 77 68 65 72 65 20 41 20 69 73 20 61 6e 79 20   where A is any 
9820: 73 69 6d 70 6c 65 20 6e 61 6d 65 20 69 6e 74 6f  simple name into
9830: 20 6a 75 73 74 20 2f 0a 2a 2a 0a 2a 2a 20 43 68   just /.**.** Ch
9840: 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20 69  anges are made i
9850: 6e 2d 70 6c 61 63 65 2e 20 20 52 65 74 75 72 6e  n-place.  Return
9860: 20 74 68 65 20 6e 65 77 20 6e 61 6d 65 20 6c 65   the new name le
9870: 6e 67 74 68 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ngth..**.** The 
9880: 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65 6e 61 6d  original filenam
9890: 65 20 69 73 20 69 6e 20 7a 5b 30 2e 2e 6e 2d 31  e is in z[0..n-1
98a0: 5d 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e  ].  Return the n
98b0: 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 63 68 61 72  umber of.** char
98c0: 61 63 74 65 72 73 20 69 6e 20 74 68 65 20 73 69  acters in the si
98d0: 6d 70 6c 69 66 69 65 64 20 6e 61 6d 65 2e 0a 2a  mplified name..*
98e0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 78 77  /.static int vxw
98f0: 6f 72 6b 73 53 69 6d 70 6c 69 66 79 4e 61 6d 65  orksSimplifyName
9900: 28 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 29  (char *z, int n)
9910: 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20  {.  int i, j;.  
9920: 77 68 69 6c 65 28 20 6e 3e 31 20 26 26 20 7a 5b  while( n>1 && z[
9930: 6e 2d 31 5d 3d 3d 27 2f 27 20 29 7b 20 6e 2d 2d  n-1]=='/' ){ n--
9940: 3b 20 7d 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b  ; }.  for(i=j=0;
9950: 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<n; i++){.    
9960: 69 66 28 20 7a 5b 69 5d 3d 3d 27 2f 27 20 29 7b  if( z[i]=='/' ){
9970: 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2b 31  .      if( z[i+1
9980: 5d 3d 3d 27 2f 27 20 29 20 63 6f 6e 74 69 6e 75  ]=='/' ) continu
9990: 65 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 69  e;.      if( z[i
99a0: 2b 31 5d 3d 3d 27 2e 27 20 26 26 20 69 2b 32 3c  +1]=='.' && i+2<
99b0: 6e 20 26 26 20 7a 5b 69 2b 32 5d 3d 3d 27 2f 27  n && z[i+2]=='/'
99c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 20 2b 3d   ){.        i +=
99d0: 20 31 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74   1;.        cont
99e0: 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  inue;.      }.  
99f0: 20 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3d 3d      if( z[i+1]==
9a00: 27 2e 27 20 26 26 20 69 2b 33 3c 6e 20 26 26 20  '.' && i+3<n && 
9a10: 7a 5b 69 2b 32 5d 3d 3d 27 2e 27 20 26 26 20 7a  z[i+2]=='.' && z
9a20: 5b 69 2b 33 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20  [i+3]=='/' ){.  
9a30: 20 20 20 20 20 20 77 68 69 6c 65 28 20 6a 3e 30        while( j>0
9a40: 20 26 26 20 7a 5b 6a 2d 31 5d 21 3d 27 2f 27 20   && z[j-1]!='/' 
9a50: 29 7b 20 6a 2d 2d 3b 20 7d 0a 20 20 20 20 20 20  ){ j--; }.      
9a60: 20 20 69 66 28 20 6a 3e 30 20 29 7b 20 6a 2d 2d    if( j>0 ){ j--
9a70: 3b 20 7d 0a 20 20 20 20 20 20 20 20 69 20 2b 3d  ; }.        i +=
9a80: 20 32 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74   2;.        cont
9a90: 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  inue;.      }.  
9aa0: 20 20 7d 0a 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d    }.    z[j++] =
9ab0: 20 7a 5b 69 5d 3b 0a 20 20 7d 0a 20 20 7a 5b 6a   z[i];.  }.  z[j
9ac0: 5d 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  ] = 0;.  return 
9ad0: 6a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64  j;.}../*.** Find
9ae0: 20 61 20 75 6e 69 71 75 65 20 66 69 6c 65 20 49   a unique file I
9af0: 44 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20  D for the given 
9b00: 61 62 73 6f 6c 75 74 65 20 70 61 74 68 6e 61 6d  absolute pathnam
9b10: 65 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 61 20  e.  Return.** a 
9b20: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 76  pointer to the v
9b30: 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a  xworksFileId obj
9b40: 65 63 74 2e 20 20 54 68 69 73 20 70 6f 69 6e 74  ect.  This point
9b50: 65 72 20 69 73 20 74 68 65 20 75 6e 69 71 75 65  er is the unique
9b60: 0a 2a 2a 20 66 69 6c 65 20 49 44 2e 0a 2a 2a 0a  .** file ID..**.
9b70: 2a 2a 20 54 68 65 20 6e 52 65 66 20 66 69 65 6c  ** The nRef fiel
9b80: 64 20 6f 66 20 74 68 65 20 76 78 77 6f 72 6b 73  d of the vxworks
9b90: 46 69 6c 65 49 64 20 6f 62 6a 65 63 74 20 69 73  FileId object is
9ba0: 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 62 65 66   incremented bef
9bb0: 6f 72 65 0a 2a 2a 20 74 68 65 20 6f 62 6a 65 63  ore.** the objec
9bc0: 74 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20  t is returned.  
9bd0: 41 20 6e 65 77 20 76 78 77 6f 72 6b 73 46 69 6c  A new vxworksFil
9be0: 65 49 64 20 6f 62 6a 65 63 74 20 69 73 20 63 72  eId object is cr
9bf0: 65 61 74 65 64 0a 2a 2a 20 61 6e 64 20 61 64 64  eated.** and add
9c00: 65 64 20 74 6f 20 74 68 65 20 67 6c 6f 62 61 6c  ed to the global
9c10: 20 6c 69 73 74 20 69 66 20 6e 65 63 65 73 73 61   list if necessa
9c20: 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d  ry..**.** If a m
9c30: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
9c40: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72   error occurs, r
9c50: 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73  eturn NULL..*/.s
9c60: 74 61 74 69 63 20 73 74 72 75 63 74 20 76 78 77  tatic struct vxw
9c70: 6f 72 6b 73 46 69 6c 65 49 64 20 2a 76 78 77 6f  orksFileId *vxwo
9c80: 72 6b 73 46 69 6e 64 46 69 6c 65 49 64 28 63 6f  rksFindFileId(co
9c90: 6e 73 74 20 63 68 61 72 20 2a 7a 41 62 73 6f 6c  nst char *zAbsol
9ca0: 75 74 65 4e 61 6d 65 29 7b 0a 20 20 73 74 72 75  uteName){.  stru
9cb0: 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64  ct vxworksFileId
9cc0: 20 2a 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20   *pNew;         
9cd0: 2f 2a 20 73 65 61 72 63 68 20 6b 65 79 20 61 6e  /* search key an
9ce0: 64 20 6e 65 77 20 66 69 6c 65 20 49 44 20 2a 2f  d new file ID */
9cf0: 0a 20 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b  .  struct vxwork
9d00: 73 46 69 6c 65 49 64 20 2a 70 43 61 6e 64 69 64  sFileId *pCandid
9d10: 61 74 65 3b 20 20 20 2f 2a 20 46 6f 72 20 6c 6f  ate;   /* For lo
9d20: 6f 70 69 6e 67 20 6f 76 65 72 20 65 78 69 73 74  oping over exist
9d30: 69 6e 67 20 66 69 6c 65 20 49 44 73 20 2a 2f 0a  ing file IDs */.
9d40: 20 20 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20    int n;        
9d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d60: 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20        /* Length 
9d70: 6f 66 20 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65  of zAbsoluteName
9d80: 20 73 74 72 69 6e 67 20 2a 2f 0a 0a 20 20 61 73   string */..  as
9d90: 73 65 72 74 28 20 7a 41 62 73 6f 6c 75 74 65 4e  sert( zAbsoluteN
9da0: 61 6d 65 5b 30 5d 3d 3d 27 2f 27 20 29 3b 0a 20  ame[0]=='/' );. 
9db0: 20 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e   n = (int)strlen
9dc0: 28 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65 29 3b  (zAbsoluteName);
9dd0: 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  pNew = sqlite
9de0: 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  3_malloc( sizeof
9df0: 28 2a 70 4e 65 77 29 20 2b 20 28 6e 2b 31 29 20  (*pNew) + (n+1) 
9e00: 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  );.  if( pNew==0
9e10: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
9e20: 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e  New->zCanonicalN
9e30: 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70 4e  ame = (char*)&pN
9e40: 65 77 5b 31 5d 3b 0a 20 20 6d 65 6d 63 70 79 28  ew[1];.  memcpy(
9e50: 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c  pNew->zCanonical
9e60: 4e 61 6d 65 2c 20 7a 41 62 73 6f 6c 75 74 65 4e  Name, zAbsoluteN
9e70: 61 6d 65 2c 20 6e 2b 31 29 3b 0a 20 20 6e 20 3d  ame, n+1);.  n =
9e80: 20 76 78 77 6f 72 6b 73 53 69 6d 70 6c 69 66 79   vxworksSimplify
9e90: 4e 61 6d 65 28 70 4e 65 77 2d 3e 7a 43 61 6e 6f  Name(pNew->zCano
9ea0: 6e 69 63 61 6c 4e 61 6d 65 2c 20 6e 29 3b 0a 0a  nicalName, n);..
9eb0: 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20    /* Search for 
9ec0: 61 6e 20 65 78 69 73 74 69 6e 67 20 65 6e 74 72  an existing entr
9ed0: 79 20 74 68 61 74 20 6d 61 74 63 68 69 6e 67 20  y that matching 
9ee0: 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c 20 6e 61  the canonical na
9ef0: 6d 65 2e 0a 20 20 2a 2a 20 49 66 20 66 6f 75 6e  me..  ** If foun
9f00: 64 2c 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65  d, increment the
9f10: 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
9f20: 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f   and return a po
9f30: 69 6e 74 65 72 20 74 6f 0a 20 20 2a 2a 20 74 68  inter to.  ** th
9f40: 65 20 65 78 69 73 74 69 6e 67 20 66 69 6c 65 20  e existing file 
9f50: 49 44 2e 0a 20 20 2a 2f 0a 20 20 75 6e 69 78 45  ID..  */.  unixE
9f60: 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 66  nterMutex();.  f
9f70: 6f 72 28 70 43 61 6e 64 69 64 61 74 65 3d 76 78  or(pCandidate=vx
9f80: 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74 3b 20 70  worksFileList; p
9f90: 43 61 6e 64 69 64 61 74 65 3b 20 70 43 61 6e 64  Candidate; pCand
9fa0: 69 64 61 74 65 3d 70 43 61 6e 64 69 64 61 74 65  idate=pCandidate
9fb0: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66  ->pNext){.    if
9fc0: 28 20 70 43 61 6e 64 69 64 61 74 65 2d 3e 6e 4e  ( pCandidate->nN
9fd0: 61 6d 65 3d 3d 6e 20 0a 20 20 20 20 20 26 26 20  ame==n .     && 
9fe0: 6d 65 6d 63 6d 70 28 70 43 61 6e 64 69 64 61 74  memcmp(pCandidat
9ff0: 65 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d  e->zCanonicalNam
a000: 65 2c 20 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69  e, pNew->zCanoni
a010: 63 61 6c 4e 61 6d 65 2c 20 6e 29 3d 3d 30 0a 20  calName, n)==0. 
a020: 20 20 20 29 7b 0a 20 20 20 20 20 20 20 73 71 6c     ){.       sql
a030: 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77 29 3b  ite3_free(pNew);
a040: 0a 20 20 20 20 20 20 20 70 43 61 6e 64 69 64 61  .       pCandida
a050: 74 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20  te->nRef++;.    
a060: 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65     unixLeaveMute
a070: 78 28 29 3b 0a 20 20 20 20 20 20 20 72 65 74 75  x();.       retu
a080: 72 6e 20 70 43 61 6e 64 69 64 61 74 65 3b 0a 20  rn pCandidate;. 
a090: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e     }.  }..  /* N
a0a0: 6f 20 6d 61 74 63 68 20 77 61 73 20 66 6f 75 6e  o match was foun
a0b0: 64 2e 20 20 57 65 20 77 69 6c 6c 20 6d 61 6b 65  d.  We will make
a0c0: 20 61 20 6e 65 77 20 66 69 6c 65 20 49 44 20 2a   a new file ID *
a0d0: 2f 0a 20 20 70 4e 65 77 2d 3e 6e 52 65 66 20 3d  /.  pNew->nRef =
a0e0: 20 31 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4e 61 6d   1;.  pNew->nNam
a0f0: 65 20 3d 20 6e 3b 0a 20 20 70 4e 65 77 2d 3e 70  e = n;.  pNew->p
a100: 4e 65 78 74 20 3d 20 76 78 77 6f 72 6b 73 46 69  Next = vxworksFi
a110: 6c 65 4c 69 73 74 3b 0a 20 20 76 78 77 6f 72 6b  leList;.  vxwork
a120: 73 46 69 6c 65 4c 69 73 74 20 3d 20 70 4e 65 77  sFileList = pNew
a130: 3b 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74  ;.  unixLeaveMut
a140: 65 78 28 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  ex();.  return p
a150: 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65  New;.}../*.** De
a160: 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65  crement the refe
a170: 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20 61  rence count on a
a180: 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f   vxworksFileId o
a190: 62 6a 65 63 74 2e 20 20 46 72 65 65 0a 2a 2a 20  bject.  Free.** 
a1a0: 74 68 65 20 6f 62 6a 65 63 74 20 77 68 65 6e 20  the object when 
a1b0: 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  the reference co
a1c0: 75 6e 74 20 72 65 61 63 68 65 73 20 7a 65 72 6f  unt reaches zero
a1d0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
a1e0: 20 76 78 77 6f 72 6b 73 52 65 6c 65 61 73 65 46   vxworksReleaseF
a1f0: 69 6c 65 49 64 28 73 74 72 75 63 74 20 76 78 77  ileId(struct vxw
a200: 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 49 64 29  orksFileId *pId)
a210: 7b 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74  {.  unixEnterMut
a220: 65 78 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ex();.  assert( 
a230: 70 49 64 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20  pId->nRef>0 );. 
a240: 20 70 49 64 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20   pId->nRef--;.  
a250: 69 66 28 20 70 49 64 2d 3e 6e 52 65 66 3d 3d 30  if( pId->nRef==0
a260: 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 76   ){.    struct v
a270: 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 2a 70  xworksFileId **p
a280: 70 3b 0a 20 20 20 20 66 6f 72 28 70 70 3d 26 76  p;.    for(pp=&v
a290: 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74 3b 20  xworksFileList; 
a2a0: 2a 70 70 20 26 26 20 2a 70 70 21 3d 70 49 64 3b  *pp && *pp!=pId;
a2b0: 20 70 70 20 3d 20 26 28 28 2a 70 70 29 2d 3e 70   pp = &((*pp)->p
a2c0: 4e 65 78 74 29 29 7b 7d 0a 20 20 20 20 61 73 73  Next)){}.    ass
a2d0: 65 72 74 28 20 2a 70 70 3d 3d 70 49 64 20 29 3b  ert( *pp==pId );
a2e0: 0a 20 20 20 20 2a 70 70 20 3d 20 70 49 64 2d 3e  .    *pp = pId->
a2f0: 70 4e 65 78 74 3b 0a 20 20 20 20 73 71 6c 69 74  pNext;.    sqlit
a300: 65 33 5f 66 72 65 65 28 70 49 64 29 3b 0a 20 20  e3_free(pId);.  
a310: 7d 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74  }.  unixLeaveMut
a320: 65 78 28 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  ex();.}.#endif /
a330: 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a  * OS_VXWORKS */.
a340: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
a350: 20 45 6e 64 20 6f 66 20 55 6e 69 71 75 65 20 46   End of Unique F
a360: 69 6c 65 20 49 44 20 55 74 69 6c 69 74 79 20 55  ile ID Utility U
a370: 73 65 64 20 42 79 20 56 78 57 6f 72 6b 73 20 2a  sed By VxWorks *
a380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
a390: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a3a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a3b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a3c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a3d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
a3e0: 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ../*************
a3f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a400: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a410: 2a 2a 2a 2a 2a 2a 2a 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 0a 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 20 50 6f  ************* Po
a450: 73 69 78 20 41 64 76 69 73 6f 72 79 20 4c 6f 63  six Advisory Loc
a460: 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  king ***********
a470: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a480: 2a 0a 2a 2a 0a 2a 2a 20 50 4f 53 49 58 20 61 64  *.**.** POSIX ad
a490: 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20 61 72 65  visory locks are
a4a0: 20 62 72 6f 6b 65 6e 20 62 79 20 64 65 73 69 67   broken by desig
a4b0: 6e 2e 20 20 41 4e 53 49 20 53 54 44 20 31 30 30  n.  ANSI STD 100
a4c0: 33 2e 31 20 28 31 39 39 36 29 0a 2a 2a 20 73 65  3.1 (1996).** se
a4d0: 63 74 69 6f 6e 20 36 2e 35 2e 32 2e 32 20 6c 69  ction 6.5.2.2 li
a4e0: 6e 65 73 20 34 38 33 20 74 68 72 6f 75 67 68 20  nes 483 through 
a4f0: 34 39 30 20 73 70 65 63 69 66 79 20 74 68 61 74  490 specify that
a500: 20 77 68 65 6e 20 61 20 70 72 6f 63 65 73 73 0a   when a process.
a510: 2a 2a 20 73 65 74 73 20 6f 72 20 63 6c 65 61 72  ** sets or clear
a520: 73 20 61 20 6c 6f 63 6b 2c 20 74 68 61 74 20 6f  s a lock, that o
a530: 70 65 72 61 74 69 6f 6e 20 6f 76 65 72 72 69 64  peration overrid
a540: 65 73 20 61 6e 79 20 70 72 69 6f 72 20 6c 6f 63  es any prior loc
a550: 6b 73 20 73 65 74 0a 2a 2a 20 62 79 20 74 68 65  ks set.** by the
a560: 20 73 61 6d 65 20 70 72 6f 63 65 73 73 2e 20 20   same process.  
a570: 49 74 20 64 6f 65 73 20 6e 6f 74 20 65 78 70 6c  It does not expl
a580: 69 63 69 74 6c 79 20 73 61 79 20 73 6f 2c 20 62  icitly say so, b
a590: 75 74 20 74 68 69 73 20 69 6d 70 6c 69 65 73 0a  ut this implies.
a5a0: 2a 2a 20 74 68 61 74 20 69 74 20 6f 76 65 72 72  ** that it overr
a5b0: 69 64 65 73 20 6c 6f 63 6b 73 20 73 65 74 20 62  ides locks set b
a5c0: 79 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65  y the same proce
a5d0: 73 73 20 75 73 69 6e 67 20 61 20 64 69 66 66 65  ss using a diffe
a5e0: 72 65 6e 74 0a 2a 2a 20 66 69 6c 65 20 64 65 73  rent.** file des
a5f0: 63 72 69 70 74 6f 72 2e 20 20 43 6f 6e 73 69 64  criptor.  Consid
a600: 65 72 20 74 68 69 73 20 74 65 73 74 20 63 61 73  er this test cas
a610: 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 69  e:.**.**       i
a620: 6e 74 20 66 64 31 20 3d 20 6f 70 65 6e 28 22 2e  nt fd1 = open(".
a630: 2f 66 69 6c 65 31 22 2c 20 4f 5f 52 44 57 52 7c  /file1", O_RDWR|
a640: 4f 5f 43 52 45 41 54 2c 20 30 36 34 34 29 3b 0a  O_CREAT, 0644);.
a650: 2a 2a 20 20 20 20 20 20 20 69 6e 74 20 66 64 32  **       int fd2
a660: 20 3d 20 6f 70 65 6e 28 22 2e 2f 66 69 6c 65 32   = open("./file2
a670: 22 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41  ", O_RDWR|O_CREA
a680: 54 2c 20 30 36 34 34 29 3b 0a 2a 2a 0a 2a 2a 20  T, 0644);.**.** 
a690: 53 75 70 70 6f 73 65 20 2e 2f 66 69 6c 65 31 20  Suppose ./file1 
a6a0: 61 6e 64 20 2e 2f 66 69 6c 65 32 20 61 72 65 20  and ./file2 are 
a6b0: 72 65 61 6c 6c 79 20 74 68 65 20 73 61 6d 65 20  really the same 
a6c0: 66 69 6c 65 20 28 62 65 63 61 75 73 65 0a 2a 2a  file (because.**
a6d0: 20 6f 6e 65 20 69 73 20 61 20 68 61 72 64 20 6f   one is a hard o
a6e0: 72 20 73 79 6d 62 6f 6c 69 63 20 6c 69 6e 6b 20  r symbolic link 
a6f0: 74 6f 20 74 68 65 20 6f 74 68 65 72 29 20 74 68  to the other) th
a700: 65 6e 20 69 66 20 79 6f 75 20 73 65 74 0a 2a 2a  en if you set.**
a710: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
a720: 63 6b 20 6f 6e 20 66 64 31 2c 20 74 68 65 6e 20  ck on fd1, then 
a730: 74 72 79 20 74 6f 20 67 65 74 20 61 6e 20 65 78  try to get an ex
a740: 63 6c 75 73 69 76 65 20 6c 6f 63 6b 0a 2a 2a 20  clusive lock.** 
a750: 6f 6e 20 66 64 32 2c 20 69 74 20 77 6f 72 6b 73  on fd2, it works
a760: 2e 20 20 49 20 77 6f 75 6c 64 20 68 61 76 65 20  .  I would have 
a770: 65 78 70 65 63 74 65 64 20 74 68 65 20 73 65 63  expected the sec
a780: 6f 6e 64 20 6c 6f 63 6b 20 74 6f 0a 2a 2a 20 66  ond lock to.** f
a790: 61 69 6c 20 73 69 6e 63 65 20 74 68 65 72 65 20  ail since there 
a7a0: 77 61 73 20 61 6c 72 65 61 64 79 20 61 20 6c 6f  was already a lo
a7b0: 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 64  ck on the file d
a7c0: 75 65 20 74 6f 20 66 64 31 2e 0a 2a 2a 20 42 75  ue to fd1..** Bu
a7d0: 74 20 6e 6f 74 20 73 6f 2e 20 20 53 69 6e 63 65  t not so.  Since
a7e0: 20 62 6f 74 68 20 6c 6f 63 6b 73 20 63 61 6d 65   both locks came
a7f0: 20 66 72 6f 6d 20 74 68 65 20 73 61 6d 65 20 70   from the same p
a800: 72 6f 63 65 73 73 2c 20 74 68 65 0a 2a 2a 20 73  rocess, the.** s
a810: 65 63 6f 6e 64 20 6f 76 65 72 72 69 64 65 73 20  econd overrides 
a820: 74 68 65 20 66 69 72 73 74 2c 20 65 76 65 6e 20  the first, even 
a830: 74 68 6f 75 67 68 20 74 68 65 79 20 77 65 72 65  though they were
a840: 20 6f 6e 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a   on different.**
a850: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
a860: 73 20 6f 70 65 6e 65 64 20 6f 6e 20 64 69 66 66  s opened on diff
a870: 65 72 65 6e 74 20 66 69 6c 65 20 6e 61 6d 65 73  erent file names
a880: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d 65 61  ..**.** This mea
a890: 6e 73 20 74 68 61 74 20 77 65 20 63 61 6e 6e 6f  ns that we canno
a8a0: 74 20 75 73 65 20 50 4f 53 49 58 20 6c 6f 63 6b  t use POSIX lock
a8b0: 73 20 74 6f 20 73 79 6e 63 68 72 6f 6e 69 7a 65  s to synchronize
a8c0: 20 66 69 6c 65 20 61 63 63 65 73 73 0a 2a 2a 20   file access.** 
a8d0: 61 6d 6f 6e 67 20 63 6f 6d 70 65 74 69 6e 67 20  among competing 
a8e0: 74 68 72 65 61 64 73 20 6f 66 20 74 68 65 20 73  threads of the s
a8f0: 61 6d 65 20 70 72 6f 63 65 73 73 2e 20 20 50 4f  ame process.  PO
a900: 53 49 58 20 6c 6f 63 6b 73 20 77 69 6c 6c 20 77  SIX locks will w
a910: 6f 72 6b 20 66 69 6e 65 0a 2a 2a 20 74 6f 20 73  ork fine.** to s
a920: 79 6e 63 68 72 6f 6e 69 7a 65 20 61 63 63 65 73  ynchronize acces
a930: 73 20 66 6f 72 20 74 68 72 65 61 64 73 20 69 6e  s for threads in
a940: 20 73 65 70 61 72 61 74 65 20 70 72 6f 63 65 73   separate proces
a950: 73 65 73 2c 20 62 75 74 20 6e 6f 74 0a 2a 2a 20  ses, but not.** 
a960: 74 68 72 65 61 64 73 20 77 69 74 68 69 6e 20 74  threads within t
a970: 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 2e  he same process.
a980: 0a 2a 2a 0a 2a 2a 20 54 6f 20 77 6f 72 6b 20 61  .**.** To work a
a990: 72 6f 75 6e 64 20 74 68 65 20 70 72 6f 62 6c 65  round the proble
a9a0: 6d 2c 20 53 51 4c 69 74 65 20 68 61 73 20 74 6f  m, SQLite has to
a9b0: 20 6d 61 6e 61 67 65 20 66 69 6c 65 20 6c 6f 63   manage file loc
a9c0: 6b 73 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a  ks internally.**
a9d0: 20 6f 6e 20 69 74 73 20 6f 77 6e 2e 20 20 57 68   on its own.  Wh
a9e0: 65 6e 65 76 65 72 20 61 20 6e 65 77 20 64 61 74  enever a new dat
a9f0: 61 62 61 73 65 20 69 73 20 6f 70 65 6e 65 64 2c  abase is opened,
aa00: 20 77 65 20 68 61 76 65 20 74 6f 20 66 69 6e 64   we have to find
aa10: 20 74 68 65 0a 2a 2a 20 73 70 65 63 69 66 69 63   the.** specific
aa20: 20 69 6e 6f 64 65 20 6f 66 20 74 68 65 20 64 61   inode of the da
aa30: 74 61 62 61 73 65 20 66 69 6c 65 20 28 74 68 65  tabase file (the
aa40: 20 69 6e 6f 64 65 20 69 73 20 64 65 74 65 72 6d   inode is determ
aa50: 69 6e 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 73  ined by the.** s
aa60: 74 5f 64 65 76 20 61 6e 64 20 73 74 5f 69 6e 6f  t_dev and st_ino
aa70: 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 73   fields of the s
aa80: 74 61 74 20 73 74 72 75 63 74 75 72 65 20 74 68  tat structure th
aa90: 61 74 20 66 73 74 61 74 28 29 20 66 69 6c 6c 73  at fstat() fills
aaa0: 20 69 6e 29 0a 2a 2a 20 61 6e 64 20 63 68 65 63   in).** and chec
aab0: 6b 20 66 6f 72 20 6c 6f 63 6b 73 20 61 6c 72 65  k for locks alre
aac0: 61 64 79 20 65 78 69 73 74 69 6e 67 20 6f 6e 20  ady existing on 
aad0: 74 68 61 74 20 69 6e 6f 64 65 2e 20 20 57 68 65  that inode.  Whe
aae0: 6e 20 6c 6f 63 6b 73 20 61 72 65 0a 2a 2a 20 63  n locks are.** c
aaf0: 72 65 61 74 65 64 20 6f 72 20 72 65 6d 6f 76 65  reated or remove
ab00: 64 2c 20 77 65 20 68 61 76 65 20 74 6f 20 6c 6f  d, we have to lo
ab10: 6f 6b 20 61 74 20 6f 75 72 20 6f 77 6e 20 69 6e  ok at our own in
ab20: 74 65 72 6e 61 6c 20 72 65 63 6f 72 64 20 6f 66  ternal record of
ab30: 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b 73 20 74 6f   the.** locks to
ab40: 20 73 65 65 20 69 66 20 61 6e 6f 74 68 65 72 20   see if another 
ab50: 74 68 72 65 61 64 20 68 61 73 20 70 72 65 76 69  thread has previ
ab60: 6f 75 73 6c 79 20 73 65 74 20 61 20 6c 6f 63 6b  ously set a lock
ab70: 20 6f 6e 20 74 68 61 74 20 73 61 6d 65 0a 2a 2a   on that same.**
ab80: 20 69 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 28 41   inode..**.** (A
ab90: 73 69 64 65 3a 20 54 68 65 20 75 73 65 20 6f 66  side: The use of
aba0: 20 69 6e 6f 64 65 20 6e 75 6d 62 65 72 73 20 61   inode numbers a
abb0: 73 20 75 6e 69 71 75 65 20 49 44 73 20 64 6f 65  s unique IDs doe
abc0: 73 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 56 78  s not work on Vx
abd0: 57 6f 72 6b 73 2e 0a 2a 2a 20 46 6f 72 20 56 78  Works..** For Vx
abe0: 57 6f 72 6b 73 2c 20 77 65 20 68 61 76 65 20 74  Works, we have t
abf0: 6f 20 75 73 65 20 74 68 65 20 61 6c 74 65 72 6e  o use the altern
ac00: 61 74 69 76 65 20 75 6e 69 71 75 65 20 49 44 20  ative unique ID 
ac10: 73 79 73 74 65 6d 20 62 61 73 65 64 20 6f 6e 0a  system based on.
ac20: 2a 2a 20 63 61 6e 6f 6e 69 63 61 6c 20 66 69 6c  ** canonical fil
ac30: 65 6e 61 6d 65 20 61 6e 64 20 69 6d 70 6c 65 6d  ename and implem
ac40: 65 6e 74 65 64 20 69 6e 20 74 68 65 20 70 72 65  ented in the pre
ac50: 76 69 6f 75 73 20 64 69 76 69 73 69 6f 6e 2e 29  vious division.)
ac60: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74  .**.** The sqlit
ac70: 65 33 5f 66 69 6c 65 20 73 74 72 75 63 74 75 72  e3_file structur
ac80: 65 20 66 6f 72 20 50 4f 53 49 58 20 69 73 20 6e  e for POSIX is n
ac90: 6f 20 6c 6f 6e 67 65 72 20 6a 75 73 74 20 61 6e  o longer just an
aca0: 20 69 6e 74 65 67 65 72 20 66 69 6c 65 0a 2a 2a   integer file.**
acb0: 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 49 74   descriptor.  It
acc0: 20 69 73 20 6e 6f 77 20 61 20 73 74 72 75 63 74   is now a struct
acd0: 75 72 65 20 74 68 61 74 20 68 6f 6c 64 73 20 74  ure that holds t
ace0: 68 65 20 69 6e 74 65 67 65 72 20 66 69 6c 65 0a  he integer file.
acf0: 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20 61 6e  ** descriptor an
ad00: 64 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  d a pointer to a
ad10: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
ad20: 64 65 73 63 72 69 62 65 73 20 74 68 65 20 69 6e  describes the in
ad30: 74 65 72 6e 61 6c 0a 2a 2a 20 6c 6f 63 6b 73 20  ternal.** locks 
ad40: 6f 6e 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  on the correspon
ad50: 64 69 6e 67 20 69 6e 6f 64 65 2e 20 20 54 68 65  ding inode.  The
ad60: 72 65 20 69 73 20 6f 6e 65 20 6c 6f 63 6b 69 6e  re is one lockin
ad70: 67 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 70  g structure.** p
ad80: 65 72 20 69 6e 6f 64 65 2c 20 73 6f 20 69 66 20  er inode, so if 
ad90: 74 68 65 20 73 61 6d 65 20 69 6e 6f 64 65 20 69  the same inode i
ada0: 73 20 6f 70 65 6e 65 64 20 74 77 69 63 65 2c 20  s opened twice, 
adb0: 62 6f 74 68 20 75 6e 69 78 46 69 6c 65 20 73 74  both unixFile st
adc0: 72 75 63 74 75 72 65 73 0a 2a 2a 20 70 6f 69 6e  ructures.** poin
add0: 74 20 74 6f 20 74 68 65 20 73 61 6d 65 20 6c 6f  t to the same lo
ade0: 63 6b 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e  cking structure.
adf0: 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 73 74    The locking st
ae00: 72 75 63 74 75 72 65 20 6b 65 65 70 73 0a 2a 2a  ructure keeps.**
ae10: 20 61 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75   a reference cou
ae20: 6e 74 20 28 73 6f 20 77 65 20 77 69 6c 6c 20 6b  nt (so we will k
ae30: 6e 6f 77 20 77 68 65 6e 20 74 6f 20 64 65 6c 65  now when to dele
ae40: 74 65 20 69 74 29 20 61 6e 64 20 61 20 22 63 6e  te it) and a "cn
ae50: 74 22 0a 2a 2a 20 66 69 65 6c 64 20 74 68 61 74  t".** field that
ae60: 20 74 65 6c 6c 73 20 75 73 20 69 74 73 20 69 6e   tells us its in
ae70: 74 65 72 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74  ternal lock stat
ae80: 75 73 2e 20 20 63 6e 74 3d 3d 30 20 6d 65 61 6e  us.  cnt==0 mean
ae90: 73 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 69 73  s the.** file is
aea0: 20 75 6e 6c 6f 63 6b 65 64 2e 20 20 63 6e 74 3d   unlocked.  cnt=
aeb0: 3d 2d 31 20 6d 65 61 6e 73 20 74 68 65 20 66 69  =-1 means the fi
aec0: 6c 65 20 68 61 73 20 61 6e 20 65 78 63 6c 75 73  le has an exclus
aed0: 69 76 65 20 6c 6f 63 6b 2e 0a 2a 2a 20 63 6e 74  ive lock..** cnt
aee0: 3e 30 20 6d 65 61 6e 73 20 74 68 65 72 65 20 61  >0 means there a
aef0: 72 65 20 63 6e 74 20 73 68 61 72 65 64 20 6c 6f  re cnt shared lo
af00: 63 6b 73 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e  cks on the file.
af10: 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 61 74 74 65 6d  .**.** Any attem
af20: 70 74 20 74 6f 20 6c 6f 63 6b 20 6f 72 20 75 6e  pt to lock or un
af30: 6c 6f 63 6b 20 61 20 66 69 6c 65 20 66 69 72 73  lock a file firs
af40: 74 20 63 68 65 63 6b 73 20 74 68 65 20 6c 6f 63  t checks the loc
af50: 6b 69 6e 67 0a 2a 2a 20 73 74 72 75 63 74 75 72  king.** structur
af60: 65 2e 20 20 54 68 65 20 66 63 6e 74 6c 28 29 20  e.  The fcntl() 
af70: 73 79 73 74 65 6d 20 63 61 6c 6c 20 69 73 20 6f  system call is o
af80: 6e 6c 79 20 69 6e 76 6f 6b 65 64 20 74 6f 20 73  nly invoked to s
af90: 65 74 20 61 20 0a 2a 2a 20 50 4f 53 49 58 20 6c  et a .** POSIX l
afa0: 6f 63 6b 20 69 66 20 74 68 65 20 69 6e 74 65 72  ock if the inter
afb0: 6e 61 6c 20 6c 6f 63 6b 20 73 74 72 75 63 74 75  nal lock structu
afc0: 72 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 62  re transitions b
afd0: 65 74 77 65 65 6e 0a 2a 2a 20 61 20 6c 6f 63 6b  etween.** a lock
afe0: 65 64 20 61 6e 64 20 61 6e 20 75 6e 6c 6f 63 6b  ed and an unlock
aff0: 65 64 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20  ed state..**.** 
b000: 42 75 74 20 77 61 69 74 3a 20 20 74 68 65 72 65  But wait:  there
b010: 20 61 72 65 20 79 65 74 20 6d 6f 72 65 20 70 72   are yet more pr
b020: 6f 62 6c 65 6d 73 20 77 69 74 68 20 50 4f 53 49  oblems with POSI
b030: 58 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73  X advisory locks
b040: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 79 6f 75 20 63  ..**.** If you c
b050: 6c 6f 73 65 20 61 20 66 69 6c 65 20 64 65 73 63  lose a file desc
b060: 72 69 70 74 6f 72 20 74 68 61 74 20 70 6f 69 6e  riptor that poin
b070: 74 73 20 74 6f 20 61 20 66 69 6c 65 20 74 68 61  ts to a file tha
b080: 74 20 68 61 73 20 6c 6f 63 6b 73 2c 0a 2a 2a 20  t has locks,.** 
b090: 61 6c 6c 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 61  all locks on tha
b0a0: 74 20 66 69 6c 65 20 74 68 61 74 20 61 72 65 20  t file that are 
b0b0: 6f 77 6e 65 64 20 62 79 20 74 68 65 20 63 75 72  owned by the cur
b0c0: 72 65 6e 74 20 70 72 6f 63 65 73 73 20 61 72 65  rent process are
b0d0: 0a 2a 2a 20 72 65 6c 65 61 73 65 64 2e 20 20 54  .** released.  T
b0e0: 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68  o work around th
b0f0: 69 73 20 70 72 6f 62 6c 65 6d 2c 20 65 61 63 68  is problem, each
b100: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f   unixInodeInfo o
b110: 62 6a 65 63 74 0a 2a 2a 20 6d 61 69 6e 74 61 69  bject.** maintai
b120: 6e 73 20 61 20 63 6f 75 6e 74 20 6f 66 20 74 68  ns a count of th
b130: 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 65 6e 64  e number of pend
b140: 69 6e 67 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 61  ing locks on tha
b150: 20 69 6e 6f 64 65 2e 0a 2a 2a 20 57 68 65 6e 20   inode..** When 
b160: 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61  an attempt is ma
b170: 64 65 20 74 6f 20 63 6c 6f 73 65 20 61 6e 20 75  de to close an u
b180: 6e 69 78 46 69 6c 65 2c 20 69 66 20 74 68 65 72  nixFile, if ther
b190: 65 20 61 72 65 0a 2a 2a 20 6f 74 68 65 72 20 75  e are.** other u
b1a0: 6e 69 78 46 69 6c 65 20 6f 70 65 6e 20 6f 6e 20  nixFile open on 
b1b0: 74 68 65 20 73 61 6d 65 20 69 6e 6f 64 65 20 74  the same inode t
b1c0: 68 61 74 20 61 72 65 20 68 6f 6c 64 69 6e 67 20  hat are holding 
b1d0: 6c 6f 63 6b 73 2c 20 74 68 65 20 63 61 6c 6c 0a  locks, the call.
b1e0: 2a 2a 20 74 6f 20 63 6c 6f 73 65 28 29 20 74 68  ** to close() th
b1f0: 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
b200: 72 20 69 73 20 64 65 66 65 72 72 65 64 20 75 6e  r is deferred un
b210: 74 69 6c 20 61 6c 6c 20 6f 66 20 74 68 65 20 6c  til all of the l
b220: 6f 63 6b 73 20 63 6c 65 61 72 2e 0a 2a 2a 20 54  ocks clear..** T
b230: 68 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  he unixInodeInfo
b240: 20 73 74 72 75 63 74 75 72 65 20 6b 65 65 70 73   structure keeps
b250: 20 61 20 6c 69 73 74 20 6f 66 20 66 69 6c 65 20   a list of file 
b260: 64 65 73 63 72 69 70 74 6f 72 73 20 74 68 61 74  descriptors that
b270: 20 6e 65 65 64 20 74 6f 0a 2a 2a 20 62 65 20 63   need to.** be c
b280: 6c 6f 73 65 64 20 61 6e 64 20 74 68 61 74 20 6c  losed and that l
b290: 69 73 74 20 69 73 20 77 61 6c 6b 65 64 20 28 61  ist is walked (a
b2a0: 6e 64 20 63 6c 65 61 72 65 64 29 20 77 68 65 6e  nd cleared) when
b2b0: 20 74 68 65 20 6c 61 73 74 20 6c 6f 63 6b 0a 2a   the last lock.*
b2c0: 2a 20 63 6c 65 61 72 73 2e 0a 2a 2a 0a 2a 2a 20  * clears..**.** 
b2d0: 59 65 74 20 61 6e 6f 74 68 65 72 20 70 72 6f 62  Yet another prob
b2e0: 6c 65 6d 3a 20 20 4c 69 6e 75 78 54 68 72 65 61  lem:  LinuxThrea
b2f0: 64 73 20 64 6f 20 6e 6f 74 20 70 6c 61 79 20 77  ds do not play w
b300: 65 6c 6c 20 77 69 74 68 20 70 6f 73 69 78 20 6c  ell with posix l
b310: 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 4d 61 6e 79  ocks..**.** Many
b320: 20 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 73 20   older versions 
b330: 6f 66 20 6c 69 6e 75 78 20 75 73 65 20 74 68 65  of linux use the
b340: 20 4c 69 6e 75 78 54 68 72 65 61 64 73 20 6c 69   LinuxThreads li
b350: 62 72 61 72 79 20 77 68 69 63 68 20 69 73 0a 2a  brary which is.*
b360: 2a 20 6e 6f 74 20 70 6f 73 69 78 20 63 6f 6d 70  * not posix comp
b370: 6c 69 61 6e 74 2e 20 20 55 6e 64 65 72 20 4c 69  liant.  Under Li
b380: 6e 75 78 54 68 72 65 61 64 73 2c 20 61 20 6c 6f  nuxThreads, a lo
b390: 63 6b 20 63 72 65 61 74 65 64 20 62 79 20 74 68  ck created by th
b3a0: 72 65 61 64 0a 2a 2a 20 41 20 63 61 6e 6e 6f 74  read.** A cannot
b3b0: 20 62 65 20 6d 6f 64 69 66 69 65 64 20 6f 72 20   be modified or 
b3c0: 6f 76 65 72 72 69 64 64 65 6e 20 62 79 20 61 20  overridden by a 
b3d0: 64 69 66 66 65 72 65 6e 74 20 74 68 72 65 61 64  different thread
b3e0: 20 42 2e 0a 2a 2a 20 4f 6e 6c 79 20 74 68 72 65   B..** Only thre
b3f0: 61 64 20 41 20 63 61 6e 20 6d 6f 64 69 66 79 20  ad A can modify 
b400: 74 68 65 20 6c 6f 63 6b 2e 20 20 4c 6f 63 6b 69  the lock.  Locki
b410: 6e 67 20 62 65 68 61 76 69 6f 72 20 69 73 20 63  ng behavior is c
b420: 6f 72 72 65 63 74 0a 2a 2a 20 69 66 20 74 68 65  orrect.** if the
b430: 20 61 70 70 6c 69 61 74 69 6f 6e 20 75 73 65 73   appliation uses
b440: 20 74 68 65 20 6e 65 77 65 72 20 4e 61 74 69 76   the newer Nativ
b450: 65 20 50 6f 73 69 78 20 54 68 72 65 61 64 20 4c  e Posix Thread L
b460: 69 62 72 61 72 79 20 28 4e 50 54 4c 29 0a 2a 2a  ibrary (NPTL).**
b470: 20 6f 6e 20 6c 69 6e 75 78 20 2d 20 77 69 74 68   on linux - with
b480: 20 4e 50 54 4c 20 61 20 6c 6f 63 6b 20 63 72 65   NPTL a lock cre
b490: 61 74 65 64 20 62 79 20 74 68 72 65 61 64 20 41  ated by thread A
b4a0: 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20 6c 6f   can override lo
b4b0: 63 6b 73 0a 2a 2a 20 69 6e 20 74 68 72 65 61 64  cks.** in thread
b4c0: 20 42 2e 20 20 42 75 74 20 74 68 65 72 65 20 69   B.  But there i
b4d0: 73 20 6e 6f 20 77 61 79 20 74 6f 20 6b 6e 6f 77  s no way to know
b4e0: 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65   at compile-time
b4f0: 20 77 68 69 63 68 0a 2a 2a 20 74 68 72 65 61 64   which.** thread
b500: 69 6e 67 20 6c 69 62 72 61 72 79 20 69 73 20 62  ing library is b
b510: 65 69 6e 67 20 75 73 65 64 2e 20 20 53 6f 20 74  eing used.  So t
b520: 68 65 72 65 20 69 73 20 6e 6f 20 77 61 79 20 74  here is no way t
b530: 6f 20 6b 6e 6f 77 20 61 74 0a 2a 2a 20 63 6f 6d  o know at.** com
b540: 70 69 6c 65 2d 74 69 6d 65 20 77 68 65 74 68 65  pile-time whethe
b550: 72 20 6f 72 20 6e 6f 74 20 74 68 72 65 61 64 20  r or not thread 
b560: 41 20 63 61 6e 20 6f 76 65 72 72 69 64 65 20 6c  A can override l
b570: 6f 63 6b 73 20 6f 6e 20 74 68 72 65 61 64 20 42  ocks on thread B
b580: 2e 0a 2a 2a 20 4f 6e 65 20 68 61 73 20 74 6f 20  ..** One has to 
b590: 64 6f 20 61 20 72 75 6e 2d 74 69 6d 65 20 63 68  do a run-time ch
b5a0: 65 63 6b 20 74 6f 20 64 69 73 63 6f 76 65 72 20  eck to discover 
b5b0: 74 68 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20  the behavior of 
b5c0: 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 70  the.** current p
b5d0: 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 53 51  rocess..**.** SQ
b5e0: 4c 69 74 65 20 75 73 65 64 20 74 6f 20 73 75 70  Lite used to sup
b5f0: 70 6f 72 74 20 4c 69 6e 75 78 54 68 72 65 61 64  port LinuxThread
b600: 73 2e 20 20 42 75 74 20 73 75 70 70 6f 72 74 20  s.  But support 
b610: 66 6f 72 20 4c 69 6e 75 78 54 68 72 65 61 64 73  for LinuxThreads
b620: 0a 2a 2a 20 77 61 73 20 64 72 6f 70 70 65 64 20  .** was dropped 
b630: 62 65 67 69 6e 6e 69 6e 67 20 77 69 74 68 20 76  beginning with v
b640: 65 72 73 69 6f 6e 20 33 2e 37 2e 30 2e 20 20 53  ersion 3.7.0.  S
b650: 51 4c 69 74 65 20 77 69 6c 6c 20 73 74 69 6c 6c  QLite will still
b660: 20 77 6f 72 6b 20 77 69 74 68 0a 2a 2a 20 4c 69   work with.** Li
b670: 6e 75 78 54 68 72 65 61 64 73 20 70 72 6f 76 69  nuxThreads provi
b680: 64 65 64 20 74 68 61 74 20 28 31 29 20 74 68 65  ded that (1) the
b690: 72 65 20 69 73 20 6e 6f 20 6d 6f 72 65 20 74 68  re is no more th
b6a0: 61 6e 20 6f 6e 65 20 63 6f 6e 6e 65 63 74 69 6f  an one connectio
b6b0: 6e 20 0a 2a 2a 20 70 65 72 20 64 61 74 61 62 61  n .** per databa
b6c0: 73 65 20 66 69 6c 65 20 69 6e 20 74 68 65 20 73  se file in the s
b6d0: 61 6d 65 20 70 72 6f 63 65 73 73 20 61 6e 64 20  ame process and 
b6e0: 28 32 29 20 64 61 74 61 62 61 73 65 20 63 6f 6e  (2) database con
b6f0: 6e 65 63 74 69 6f 6e 73 0a 2a 2a 20 64 6f 20 6e  nections.** do n
b700: 6f 74 20 6d 6f 76 65 20 61 63 72 6f 73 73 20 74  ot move across t
b710: 68 72 65 61 64 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a  hreads..*/../*.*
b720: 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  * An instance of
b730: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
b740: 74 72 75 63 74 75 72 65 20 73 65 72 76 65 73 20  tructure serves 
b750: 61 73 20 74 68 65 20 6b 65 79 20 75 73 65 64 0a  as the key used.
b760: 2a 2a 20 74 6f 20 6c 6f 63 61 74 65 20 61 20 70  ** to locate a p
b770: 61 72 74 69 63 75 6c 61 72 20 75 6e 69 78 49 6e  articular unixIn
b780: 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 2e 0a  odeInfo object..
b790: 2a 2f 0a 73 74 72 75 63 74 20 75 6e 69 78 46 69  */.struct unixFi
b7a0: 6c 65 49 64 20 7b 0a 20 20 64 65 76 5f 74 20 64  leId {.  dev_t d
b7b0: 65 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ev;             
b7c0: 20 20 20 20 20 2f 2a 20 44 65 76 69 63 65 20 6e       /* Device n
b7d0: 75 6d 62 65 72 20 2a 2f 0a 23 69 66 20 4f 53 5f  umber */.#if OS_
b7e0: 56 58 57 4f 52 4b 53 0a 20 20 73 74 72 75 63 74  VXWORKS.  struct
b7f0: 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a   vxworksFileId *
b800: 70 49 64 3b 20 20 2f 2a 20 55 6e 69 71 75 65 20  pId;  /* Unique 
b810: 66 69 6c 65 20 49 44 20 66 6f 72 20 76 78 77 6f  file ID for vxwo
b820: 72 6b 73 2e 20 2a 2f 0a 23 65 6c 73 65 0a 20 20  rks. */.#else.  
b830: 69 6e 6f 5f 74 20 69 6e 6f 3b 20 20 20 20 20 20  ino_t ino;      
b840: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
b850: 6e 6f 64 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 23  node number */.#
b860: 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  endif.};../*.** 
b870: 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  An instance of t
b880: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
b890: 75 63 74 75 72 65 20 69 73 20 61 6c 6c 6f 63 61  ucture is alloca
b8a0: 74 65 64 20 66 6f 72 20 65 61 63 68 20 6f 70 65  ted for each ope
b8b0: 6e 0a 2a 2a 20 69 6e 6f 64 65 2e 20 20 4f 72 2c  n.** inode.  Or,
b8c0: 20 6f 6e 20 4c 69 6e 75 78 54 68 72 65 61 64 73   on LinuxThreads
b8d0: 2c 20 74 68 65 72 65 20 69 73 20 6f 6e 65 20 6f  , there is one o
b8e0: 66 20 74 68 65 73 65 20 73 74 72 75 63 74 75 72  f these structur
b8f0: 65 73 20 66 6f 72 0a 2a 2a 20 65 61 63 68 20 69  es for.** each i
b900: 6e 6f 64 65 20 6f 70 65 6e 65 64 20 62 79 20 65  node opened by e
b910: 61 63 68 20 74 68 72 65 61 64 2e 0a 2a 2a 0a 2a  ach thread..**.*
b920: 2a 20 41 20 73 69 6e 67 6c 65 20 69 6e 6f 64 65  * A single inode
b930: 20 63 61 6e 20 68 61 76 65 20 6d 75 6c 74 69 70   can have multip
b940: 6c 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  le file descript
b950: 6f 72 73 2c 20 73 6f 20 65 61 63 68 20 75 6e 69  ors, so each uni
b960: 78 46 69 6c 65 0a 2a 2a 20 73 74 72 75 63 74 75  xFile.** structu
b970: 72 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f  re contains a po
b980: 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e 73 74  inter to an inst
b990: 61 6e 63 65 20 6f 66 20 74 68 69 73 20 6f 62 6a  ance of this obj
b9a0: 65 63 74 20 61 6e 64 20 74 68 69 73 0a 2a 2a 20  ect and this.** 
b9b0: 6f 62 6a 65 63 74 20 6b 65 65 70 73 20 61 20 63  object keeps a c
b9c0: 6f 75 6e 74 20 6f 66 20 74 68 65 20 6e 75 6d 62  ount of the numb
b9d0: 65 72 20 6f 66 20 75 6e 69 78 46 69 6c 65 20 70  er of unixFile p
b9e0: 6f 69 6e 74 69 6e 67 20 74 6f 20 69 74 2e 0a 2a  ointing to it..*
b9f0: 2f 0a 73 74 72 75 63 74 20 75 6e 69 78 49 6e 6f  /.struct unixIno
ba00: 64 65 49 6e 66 6f 20 7b 0a 20 20 73 74 72 75 63  deInfo {.  struc
ba10: 74 20 75 6e 69 78 46 69 6c 65 49 64 20 66 69 6c  t unixFileId fil
ba20: 65 49 64 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  eId;       /* Th
ba30: 65 20 6c 6f 6f 6b 75 70 20 6b 65 79 20 2a 2f 0a  e lookup key */.
ba40: 20 20 69 6e 74 20 6e 53 68 61 72 65 64 3b 20 20    int nShared;  
ba50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba60: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 53    /* Number of S
ba70: 48 41 52 45 44 20 6c 6f 63 6b 73 20 68 65 6c 64  HARED locks held
ba80: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
ba90: 68 61 72 20 65 46 69 6c 65 4c 6f 63 6b 3b 20 20  har eFileLock;  
baa0: 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20        /* One of 
bab0: 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45 53  SHARED_LOCK, RES
bac0: 45 52 56 45 44 5f 4c 4f 43 4b 20 65 74 63 2e 20  ERVED_LOCK etc. 
bad0: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  */.  unsigned ch
bae0: 61 72 20 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3b  ar bProcessLock;
baf0: 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 63 6c 75       /* An exclu
bb00: 73 69 76 65 20 70 72 6f 63 65 73 73 20 6c 6f 63  sive process loc
bb10: 6b 20 69 73 20 68 65 6c 64 20 2a 2f 0a 20 20 69  k is held */.  i
bb20: 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20  nt nRef;        
bb30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
bb40: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 6f 69 6e  * Number of poin
bb50: 74 65 72 73 20 74 6f 20 74 68 69 73 20 73 74 72  ters to this str
bb60: 75 63 74 75 72 65 20 2a 2f 0a 20 20 75 6e 69 78  ucture */.  unix
bb70: 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64  ShmNode *pShmNod
bb80: 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  e;          /* S
bb90: 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 61 73 73  hared memory ass
bba0: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 69  ociated with thi
bbb0: 73 20 69 6e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  s inode */.  int
bbc0: 20 6e 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20   nLock;         
bbd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
bbe0: 4e 75 6d 62 65 72 20 6f 66 20 6f 75 74 73 74 61  Number of outsta
bbf0: 6e 64 69 6e 67 20 66 69 6c 65 20 6c 6f 63 6b 73  nding file locks
bc00: 20 2a 2f 0a 20 20 55 6e 69 78 55 6e 75 73 65 64   */.  UnixUnused
bc10: 46 64 20 2a 70 55 6e 75 73 65 64 3b 20 20 20 20  Fd *pUnused;    
bc20: 20 20 20 20 20 20 2f 2a 20 55 6e 75 73 65 64 20        /* Unused 
bc30: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73  file descriptors
bc40: 20 74 6f 20 63 6c 6f 73 65 20 2a 2f 0a 20 20 75   to close */.  u
bc50: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 4e  nixInodeInfo *pN
bc60: 65 78 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ext;           /
bc70: 2a 20 4c 69 73 74 20 6f 66 20 61 6c 6c 20 75 6e  * List of all un
bc80: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65  ixInodeInfo obje
bc90: 63 74 73 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f  cts */.  unixIno
bca0: 64 65 49 6e 66 6f 20 2a 70 50 72 65 76 3b 20 20  deInfo *pPrev;  
bcb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 20 20 20 2e           /*    .
bcc0: 2e 2e 2e 20 64 6f 75 62 6c 79 20 6c 69 6e 6b 65  ... doubly linke
bcd0: 64 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  d */.#if SQLITE_
bce0: 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
bcf0: 54 59 4c 45 0a 20 20 75 6e 73 69 67 6e 65 64 20  TYLE.  unsigned 
bd00: 6c 6f 6e 67 20 6c 6f 6e 67 20 73 68 61 72 65 64  long long shared
bd10: 42 79 74 65 3b 20 20 2f 2a 20 66 6f 72 20 41 46  Byte;  /* for AF
bd20: 50 20 73 69 6d 75 6c 61 74 65 64 20 73 68 61 72  P simulated shar
bd30: 65 64 20 6c 6f 63 6b 20 2a 2f 0a 23 65 6e 64 69  ed lock */.#endi
bd40: 66 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53  f.#if OS_VXWORKS
bd50: 0a 20 20 73 65 6d 5f 74 20 2a 70 53 65 6d 3b 20  .  sem_t *pSem; 
bd60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bd70: 20 20 20 2f 2a 20 4e 61 6d 65 64 20 50 4f 53 49     /* Named POSI
bd80: 58 20 73 65 6d 61 70 68 6f 72 65 20 2a 2f 0a 20  X semaphore */. 
bd90: 20 63 68 61 72 20 61 53 65 6d 4e 61 6d 65 5b 4d   char aSemName[M
bda0: 41 58 5f 50 41 54 48 4e 41 4d 45 2b 32 5d 3b 20  AX_PATHNAME+2]; 
bdb0: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 61 74   /* Name of that
bdc0: 20 73 65 6d 61 70 68 6f 72 65 20 2a 2f 0a 23 65   semaphore */.#e
bdd0: 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  ndif.};../*.** A
bde0: 20 6c 69 73 74 73 20 6f 66 20 61 6c 6c 20 75 6e   lists of all un
bdf0: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65  ixInodeInfo obje
be00: 63 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75  cts..*/.static u
be10: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 69 6e  nixInodeInfo *in
be20: 6f 64 65 4c 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a  odeList = 0;../*
be30: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
be40: 74 69 6f 6e 20 2d 20 75 6e 69 78 4c 6f 67 45 72  tion - unixLogEr
be50: 72 6f 72 5f 78 28 29 2c 20 69 73 20 6f 6e 6c 79  ror_x(), is only
be60: 20 65 76 65 72 20 63 61 6c 6c 65 64 20 76 69 61   ever called via
be70: 20 74 68 65 20 6d 61 63 72 6f 0a 2a 2a 20 75 6e   the macro.** un
be80: 69 78 4c 6f 67 45 72 72 6f 72 28 29 2e 0a 2a 2a  ixLogError()..**
be90: 0a 2a 2a 20 49 74 20 69 73 20 69 6e 76 6f 6b 65  .** It is invoke
bea0: 64 20 61 66 74 65 72 20 61 6e 20 65 72 72 6f 72  d after an error
beb0: 20 6f 63 63 75 72 73 20 69 6e 20 61 6e 20 4f 53   occurs in an OS
bec0: 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 65 72   function and er
bed0: 72 6e 6f 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20  rno has been.** 
bee0: 73 65 74 2e 20 49 74 20 6c 6f 67 73 20 61 20 6d  set. It logs a m
bef0: 65 73 73 61 67 65 20 75 73 69 6e 67 20 73 71 6c  essage using sql
bf00: 69 74 65 33 5f 6c 6f 67 28 29 20 63 6f 6e 74 61  ite3_log() conta
bf10: 69 6e 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e  ining the curren
bf20: 74 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 65 72  t value of.** er
bf30: 72 6e 6f 20 61 6e 64 2c 20 69 66 20 70 6f 73 73  rno and, if poss
bf40: 69 62 6c 65 2c 20 74 68 65 20 68 75 6d 61 6e 2d  ible, the human-
bf50: 72 65 61 64 61 62 6c 65 20 65 71 75 69 76 61 6c  readable equival
bf60: 65 6e 74 20 66 72 6f 6d 20 73 74 72 65 72 72 6f  ent from strerro
bf70: 72 28 29 20 6f 72 0a 2a 2a 20 73 74 72 65 72 72  r() or.** strerr
bf80: 6f 72 5f 72 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68  or_r()..**.** Th
bf90: 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
bfa0: 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 6d   passed to the m
bfb0: 61 63 72 6f 20 73 68 6f 75 6c 64 20 62 65 20 74  acro should be t
bfc0: 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20 74 68  he error code th
bfd0: 61 74 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 72 65  at.** will be re
bfe0: 74 75 72 6e 65 64 20 74 6f 20 53 51 4c 69 74 65  turned to SQLite
bff0: 20 28 65 2e 67 2e 20 53 51 4c 49 54 45 5f 49 4f   (e.g. SQLITE_IO
c000: 45 52 52 5f 44 45 4c 45 54 45 2c 20 53 51 4c 49  ERR_DELETE, SQLI
c010: 54 45 5f 43 41 4e 54 4f 50 45 4e 29 2e 20 0a 2a  TE_CANTOPEN). .*
c020: 2a 20 54 68 65 20 74 77 6f 20 73 75 62 73 65 71  * The two subseq
c030: 75 65 6e 74 20 61 72 67 75 6d 65 6e 74 73 20 73  uent arguments s
c040: 68 6f 75 6c 64 20 62 65 20 74 68 65 20 6e 61 6d  hould be the nam
c050: 65 20 6f 66 20 74 68 65 20 4f 53 20 66 75 6e 63  e of the OS func
c060: 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 66 61 69  tion that.** fai
c070: 6c 65 64 20 28 65 2e 67 2e 20 22 75 6e 6c 69 6e  led (e.g. "unlin
c080: 6b 22 2c 20 22 6f 70 65 6e 22 29 20 61 6e 64 20  k", "open") and 
c090: 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 66  the associated f
c0a0: 69 6c 65 2d 73 79 73 74 65 6d 20 70 61 74 68 2c  ile-system path,
c0b0: 0a 2a 2a 20 69 66 20 61 6e 79 2e 0a 2a 2f 0a 23  .** if any..*/.#
c0c0: 64 65 66 69 6e 65 20 75 6e 69 78 4c 6f 67 45 72  define unixLogEr
c0d0: 72 6f 72 28 61 2c 62 2c 63 29 20 20 20 20 20 75  ror(a,b,c)     u
c0e0: 6e 69 78 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e  nixLogErrorAtLin
c0f0: 65 28 61 2c 62 2c 63 2c 5f 5f 4c 49 4e 45 5f 5f  e(a,b,c,__LINE__
c100: 29 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  ).static int uni
c110: 78 4c 6f 67 45 72 72 6f 72 41 74 4c 69 6e 65 28  xLogErrorAtLine(
c120: 0a 20 20 69 6e 74 20 65 72 72 63 6f 64 65 2c 20  .  int errcode, 
c130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c140: 20 20 20 2f 2a 20 53 51 4c 69 74 65 20 65 72 72     /* SQLite err
c150: 6f 72 20 63 6f 64 65 20 2a 2f 0a 20 20 63 6f 6e  or code */.  con
c160: 73 74 20 63 68 61 72 20 2a 7a 46 75 6e 63 2c 20  st char *zFunc, 
c170: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c180: 4e 61 6d 65 20 6f 66 20 4f 53 20 66 75 6e 63 74  Name of OS funct
c190: 69 6f 6e 20 74 68 61 74 20 66 61 69 6c 65 64 20  ion that failed 
c1a0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
c1b0: 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20 20  *zPath,         
c1c0: 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 70 61 74       /* File pat
c1d0: 68 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  h associated wit
c1e0: 68 20 65 72 72 6f 72 20 2a 2f 0a 20 20 69 6e 74  h error */.  int
c1f0: 20 69 4c 69 6e 65 20 20 20 20 20 20 20 20 20 20   iLine          
c200: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c210: 53 6f 75 72 63 65 20 6c 69 6e 65 20 6e 75 6d 62  Source line numb
c220: 65 72 20 77 68 65 72 65 20 65 72 72 6f 72 20 6f  er where error o
c230: 63 63 75 72 72 65 64 20 2a 2f 0a 29 7b 0a 20 20  ccurred */.){.  
c240: 63 68 61 72 20 2a 7a 45 72 72 3b 20 20 20 20 20  char *zErr;     
c250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c260: 2f 2a 20 4d 65 73 73 61 67 65 20 66 72 6f 6d 20  /* Message from 
c270: 73 74 72 65 72 72 6f 72 28 29 20 6f 72 20 65 71  strerror() or eq
c280: 75 69 76 61 6c 65 6e 74 20 2a 2f 0a 20 20 69 6e  uivalent */.  in
c290: 74 20 69 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  t iErrno = errno
c2a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
c2b0: 20 53 61 76 65 64 20 73 79 73 63 61 6c 6c 20 65   Saved syscall e
c2c0: 72 72 6f 72 20 6e 75 6d 62 65 72 20 2a 2f 0a 0a  rror number */..
c2d0: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
c2e0: 6e 6f 74 20 61 20 74 68 72 65 61 64 73 61 66 65  not a threadsafe
c2f0: 20 62 75 69 6c 64 20 28 53 51 4c 49 54 45 5f 54   build (SQLITE_T
c300: 48 52 45 41 44 53 41 46 45 3d 3d 30 29 2c 20 74  HREADSAFE==0), t
c310: 68 65 6e 20 75 73 65 0a 20 20 2a 2a 20 74 68 65  hen use.  ** the
c320: 20 73 74 72 65 72 72 6f 72 28 29 20 66 75 6e 63   strerror() func
c330: 74 69 6f 6e 20 74 6f 20 6f 62 74 61 69 6e 20 74  tion to obtain t
c340: 68 65 20 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c  he human-readabl
c350: 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a  e error message.
c360: 20 20 2a 2a 20 65 71 75 69 76 61 6c 65 6e 74 20    ** equivalent 
c370: 74 6f 20 65 72 72 6e 6f 2e 20 4f 74 68 65 72 77  to errno. Otherw
c380: 69 73 65 2c 20 75 73 65 20 73 74 72 65 72 72 6f  ise, use strerro
c390: 72 5f 72 28 29 2e 0a 20 20 2a 2f 20 0a 23 69 66  r_r()..  */ .#if
c3a0: 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
c3b0: 46 45 20 26 26 20 64 65 66 69 6e 65 64 28 48 41  FE && defined(HA
c3c0: 56 45 5f 53 54 52 45 52 52 4f 52 5f 52 29 0a 20  VE_STRERROR_R). 
c3d0: 20 63 68 61 72 20 61 45 72 72 5b 38 30 5d 3b 0a   char aErr[80];.
c3e0: 20 20 6d 65 6d 73 65 74 28 61 45 72 72 2c 20 30    memset(aErr, 0
c3f0: 2c 20 73 69 7a 65 6f 66 28 61 45 72 72 29 29 3b  , sizeof(aErr));
c400: 0a 20 20 7a 45 72 72 20 3d 20 61 45 72 72 3b 0a  .  zErr = aErr;.
c410: 0a 20 20 2f 2a 20 49 66 20 53 54 52 45 52 52 4f  .  /* If STRERRO
c420: 52 5f 52 5f 43 48 41 52 5f 50 20 28 73 65 74 20  R_R_CHAR_P (set 
c430: 62 79 20 61 75 74 6f 63 6f 6e 66 20 73 63 72 69  by autoconf scri
c440: 70 74 73 29 20 6f 72 20 5f 5f 55 53 45 5f 47 4e  pts) or __USE_GN
c450: 55 20 69 73 20 64 65 66 69 6e 65 64 2c 0a 20 20  U is defined,.  
c460: 2a 2a 20 61 73 73 75 6d 65 20 74 68 61 74 20 74  ** assume that t
c470: 68 65 20 73 79 73 74 65 6d 20 70 72 6f 76 69 64  he system provid
c480: 65 73 20 74 68 65 20 47 4e 55 20 76 65 72 73 69  es the GNU versi
c490: 6f 6e 20 6f 66 20 73 74 72 65 72 72 6f 72 5f 72  on of strerror_r
c4a0: 28 29 20 74 68 61 74 0a 20 20 2a 2a 20 72 65 74  () that.  ** ret
c4b0: 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74  urns a pointer t
c4c0: 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61  o a buffer conta
c4d0: 69 6e 69 6e 67 20 74 68 65 20 65 72 72 6f 72 20  ining the error 
c4e0: 6d 65 73 73 61 67 65 2e 20 54 68 61 74 20 70 6f  message. That po
c4f0: 69 6e 74 65 72 20 0a 20 20 2a 2a 20 6d 61 79 20  inter .  ** may 
c500: 70 6f 69 6e 74 20 74 6f 20 61 45 72 72 5b 5d 2c  point to aErr[],
c510: 20 6f 72 20 69 74 20 6d 61 79 20 70 6f 69 6e 74   or it may point
c520: 20 74 6f 20 73 6f 6d 65 20 73 74 61 74 69 63 20   to some static 
c530: 73 74 6f 72 61 67 65 20 73 6f 6d 65 77 68 65 72  storage somewher
c540: 65 2e 20 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69  e. .  ** Otherwi
c550: 73 65 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20  se, assume that 
c560: 74 68 65 20 73 79 73 74 65 6d 20 70 72 6f 76 69  the system provi
c570: 64 65 73 20 74 68 65 20 50 4f 53 49 58 20 76 65  des the POSIX ve
c580: 72 73 69 6f 6e 20 6f 66 20 0a 20 20 2a 2a 20 73  rsion of .  ** s
c590: 74 72 65 72 72 6f 72 5f 72 28 29 2c 20 77 68 69  trerror_r(), whi
c5a0: 63 68 20 61 6c 77 61 79 73 20 77 72 69 74 65 73  ch always writes
c5b0: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
c5c0: 65 20 69 6e 74 6f 20 61 45 72 72 5b 5d 2e 0a 20  e into aErr[].. 
c5d0: 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20   **.  ** If the 
c5e0: 63 6f 64 65 20 69 6e 63 6f 72 72 65 63 74 6c 79  code incorrectly
c5f0: 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 69 74   assumes that it
c600: 20 69 73 20 74 68 65 20 50 4f 53 49 58 20 76 65   is the POSIX ve
c610: 72 73 69 6f 6e 20 74 68 61 74 20 69 73 0a 20 20  rsion that is.  
c620: 2a 2a 20 61 76 61 69 6c 61 62 6c 65 2c 20 74 68  ** available, th
c630: 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  e error message 
c640: 77 69 6c 6c 20 6f 66 74 65 6e 20 62 65 20 61 6e  will often be an
c650: 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2e 20 4e   empty string. N
c660: 6f 74 20 61 0a 20 20 2a 2a 20 68 75 67 65 20 70  ot a.  ** huge p
c670: 72 6f 62 6c 65 6d 2e 20 49 6e 63 6f 72 72 65 63  roblem. Incorrec
c680: 74 6c 79 20 63 6f 6e 63 6c 75 64 69 6e 67 20 74  tly concluding t
c690: 68 61 74 20 74 68 65 20 47 4e 55 20 76 65 72 73  hat the GNU vers
c6a0: 69 6f 6e 20 69 73 20 61 76 61 69 6c 61 62 6c 65  ion is available
c6b0: 20 0a 20 20 2a 2a 20 63 6f 75 6c 64 20 6c 65 61   .  ** could lea
c6c0: 64 20 74 6f 20 61 20 73 65 67 66 61 75 6c 74 20  d to a segfault 
c6d0: 74 68 6f 75 67 68 2e 0a 20 20 2a 2f 0a 23 69 66  though..  */.#if
c6e0: 20 64 65 66 69 6e 65 64 28 53 54 52 45 52 52 4f   defined(STRERRO
c6f0: 52 5f 52 5f 43 48 41 52 5f 50 29 20 7c 7c 20 64  R_R_CHAR_P) || d
c700: 65 66 69 6e 65 64 28 5f 5f 55 53 45 5f 47 4e 55  efined(__USE_GNU
c710: 29 0a 20 20 7a 45 72 72 20 3d 20 0a 23 20 65 6e  ).  zErr = .# en
c720: 64 69 66 0a 20 20 73 74 72 65 72 72 6f 72 5f 72  dif.  strerror_r
c730: 28 69 45 72 72 6e 6f 2c 20 61 45 72 72 2c 20 73  (iErrno, aErr, s
c740: 69 7a 65 6f 66 28 61 45 72 72 29 2d 31 29 3b 0a  izeof(aErr)-1);.
c750: 0a 23 65 6c 69 66 20 53 51 4c 49 54 45 5f 54 48  .#elif SQLITE_TH
c760: 52 45 41 44 53 41 46 45 0a 20 20 2f 2a 20 54 68  READSAFE.  /* Th
c770: 69 73 20 69 73 20 61 20 74 68 72 65 61 64 73 61  is is a threadsa
c780: 66 65 20 62 75 69 6c 64 2c 20 62 75 74 20 73 74  fe build, but st
c790: 72 65 72 72 6f 72 5f 72 28 29 20 69 73 20 6e 6f  rerror_r() is no
c7a0: 74 20 61 76 61 69 6c 61 62 6c 65 2e 20 2a 2f 0a  t available. */.
c7b0: 20 20 7a 45 72 72 20 3d 20 22 22 3b 0a 23 65 6c    zErr = "";.#el
c7c0: 73 65 0a 20 20 2f 2a 20 4e 6f 6e 2d 74 68 72 65  se.  /* Non-thre
c7d0: 61 64 73 61 66 65 20 62 75 69 6c 64 2c 20 75 73  adsafe build, us
c7e0: 65 20 73 74 72 65 72 72 6f 72 28 29 2e 20 2a 2f  e strerror(). */
c7f0: 0a 20 20 7a 45 72 72 20 3d 20 73 74 72 65 72 72  .  zErr = strerr
c800: 6f 72 28 69 45 72 72 6e 6f 29 3b 0a 23 65 6e 64  or(iErrno);.#end
c810: 69 66 0a 0a 20 20 69 66 28 20 7a 50 61 74 68 3d  if..  if( zPath=
c820: 3d 30 20 29 20 7a 50 61 74 68 20 3d 20 22 22 3b  =0 ) zPath = "";
c830: 0a 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 65  .  sqlite3_log(e
c840: 72 72 63 6f 64 65 2c 0a 20 20 20 20 20 20 22 6f  rrcode,.      "o
c850: 73 5f 75 6e 69 78 2e 63 3a 25 64 3a 20 28 25 64  s_unix.c:%d: (%d
c860: 29 20 25 73 28 25 73 29 20 2d 20 25 73 22 2c 0a  ) %s(%s) - %s",.
c870: 20 20 20 20 20 20 69 4c 69 6e 65 2c 20 69 45 72        iLine, iEr
c880: 72 6e 6f 2c 20 7a 46 75 6e 63 2c 20 7a 50 61 74  rno, zFunc, zPat
c890: 68 2c 20 7a 45 72 72 0a 20 20 29 3b 0a 0a 20 20  h, zErr.  );..  
c8a0: 72 65 74 75 72 6e 20 65 72 72 63 6f 64 65 3b 0a  return errcode;.
c8b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
c8c0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
c8d0: 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 61 73 73 75 6d  ..**.** We assum
c8e0: 65 20 74 68 61 74 20 63 6c 6f 73 65 28 29 20 61  e that close() a
c8f0: 6c 6d 6f 73 74 20 61 6c 77 61 79 73 20 77 6f 72  lmost always wor
c900: 6b 73 2c 20 73 69 6e 63 65 20 69 74 20 69 73 20  ks, since it is 
c910: 6f 6e 6c 79 20 69 6e 20 61 0a 2a 2a 20 76 65 72  only in a.** ver
c920: 79 20 73 69 63 6b 20 61 70 70 6c 69 63 61 74 69  y sick applicati
c930: 6f 6e 20 6f 72 20 6f 6e 20 61 20 76 65 72 79 20  on or on a very 
c940: 73 69 63 6b 20 70 6c 61 74 66 6f 72 6d 20 74 68  sick platform th
c950: 61 74 20 69 74 20 6d 69 67 68 74 20 66 61 69 6c  at it might fail
c960: 2e 0a 2a 2a 20 49 66 20 69 74 20 64 6f 65 73 20  ..** If it does 
c970: 66 61 69 6c 2c 20 73 69 6d 70 6c 79 20 6c 65 61  fail, simply lea
c980: 6b 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  k the file descr
c990: 69 70 74 6f 72 2c 20 62 75 74 20 64 6f 20 6c 6f  iptor, but do lo
c9a0: 67 20 74 68 65 0a 2a 2a 20 65 72 72 6f 72 2e 0a  g the.** error..
c9b0: 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
c9c0: 69 74 20 69 73 20 6e 6f 74 20 73 61 66 65 20 74  it is not safe t
c9d0: 6f 20 72 65 74 72 79 20 63 6c 6f 73 65 28 29 20  o retry close() 
c9e0: 61 66 74 65 72 20 45 49 4e 54 52 20 73 69 6e 63  after EINTR sinc
c9f0: 65 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 64 65  e the.** file de
ca00: 73 63 72 69 70 74 6f 72 20 6d 69 67 68 74 20 68  scriptor might h
ca10: 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
ca20: 20 72 65 75 73 65 64 20 62 79 20 61 6e 6f 74 68   reused by anoth
ca30: 65 72 20 74 68 72 65 61 64 2e 0a 2a 2a 20 53 6f  er thread..** So
ca40: 20 77 65 20 64 6f 6e 27 74 20 65 76 65 6e 20 74   we don't even t
ca50: 72 79 20 74 6f 20 72 65 63 6f 76 65 72 20 66 72  ry to recover fr
ca60: 6f 6d 20 61 6e 20 45 49 4e 54 52 2e 20 20 4a 75  om an EINTR.  Ju
ca70: 73 74 20 6c 6f 67 20 74 68 65 20 65 72 72 6f 72  st log the error
ca80: 0a 2a 2a 20 61 6e 64 20 6d 6f 76 65 20 6f 6e 2e  .** and move on.
ca90: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
caa0: 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 75 6e 69  robust_close(uni
cab0: 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69 6e  xFile *pFile, in
cac0: 74 20 68 2c 20 69 6e 74 20 6c 69 6e 65 6e 6f 29  t h, int lineno)
cad0: 7b 0a 20 20 69 66 28 20 6f 73 43 6c 6f 73 65 28  {.  if( osClose(
cae0: 68 29 20 29 7b 0a 20 20 20 20 75 6e 69 78 4c 6f  h) ){.    unixLo
caf0: 67 45 72 72 6f 72 41 74 4c 69 6e 65 28 53 51 4c  gErrorAtLine(SQL
cb00: 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53 45 2c  ITE_IOERR_CLOSE,
cb10: 20 22 63 6c 6f 73 65 22 2c 0a 20 20 20 20 20 20   "close",.      
cb20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cb30: 20 70 46 69 6c 65 20 3f 20 70 46 69 6c 65 2d 3e   pFile ? pFile->
cb40: 7a 50 61 74 68 20 3a 20 30 2c 20 6c 69 6e 65 6e  zPath : 0, linen
cb50: 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  o);.  }.}../*.**
cb60: 20 53 65 74 20 74 68 65 20 70 46 69 6c 65 2d 3e   Set the pFile->
cb70: 6c 61 73 74 45 72 72 6e 6f 2e 20 20 44 6f 20 74  lastErrno.  Do t
cb80: 68 69 73 20 69 6e 20 61 20 73 75 62 72 6f 75 74  his in a subrout
cb90: 69 6e 65 20 61 73 20 74 68 61 74 20 70 72 6f 76  ine as that prov
cba0: 69 64 65 73 0a 2a 2a 20 61 20 63 6f 6e 76 65 6e  ides.** a conven
cbb0: 69 65 6e 74 20 70 6c 61 63 65 20 74 6f 20 73 65  ient place to se
cbc0: 74 20 61 20 62 72 65 61 6b 70 6f 69 6e 74 2e 0a  t a breakpoint..
cbd0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
cbe0: 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 75 6e  toreLastErrno(un
cbf0: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69  ixFile *pFile, i
cc00: 6e 74 20 65 72 72 6f 72 29 7b 0a 20 20 70 46 69  nt error){.  pFi
cc10: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
cc20: 65 72 72 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  error;.}../*.** 
cc30: 43 6c 6f 73 65 20 61 6c 6c 20 66 69 6c 65 20 64  Close all file d
cc40: 65 73 63 72 69 70 74 6f 72 73 20 61 63 63 75 6d  escriptors accum
cc50: 75 61 74 65 64 20 69 6e 20 74 68 65 20 75 6e 69  uated in the uni
cc60: 78 49 6e 6f 64 65 49 6e 66 6f 2d 3e 70 55 6e 75  xInodeInfo->pUnu
cc70: 73 65 64 20 6c 69 73 74 2e 0a 2a 2f 20 0a 73 74  sed list..*/ .st
cc80: 61 74 69 63 20 76 6f 69 64 20 63 6c 6f 73 65 50  atic void closeP
cc90: 65 6e 64 69 6e 67 46 64 73 28 75 6e 69 78 46 69  endingFds(unixFi
cca0: 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 75 6e  le *pFile){.  un
ccb0: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e  ixInodeInfo *pIn
ccc0: 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e  ode = pFile->pIn
ccd0: 6f 64 65 3b 0a 20 20 55 6e 69 78 55 6e 75 73 65  ode;.  UnixUnuse
cce0: 64 46 64 20 2a 70 3b 0a 20 20 55 6e 69 78 55 6e  dFd *p;.  UnixUn
ccf0: 75 73 65 64 46 64 20 2a 70 4e 65 78 74 3b 0a 20  usedFd *pNext;. 
cd00: 20 66 6f 72 28 70 3d 70 49 6e 6f 64 65 2d 3e 70   for(p=pInode->p
cd10: 55 6e 75 73 65 64 3b 20 70 3b 20 70 3d 70 4e 65  Unused; p; p=pNe
cd20: 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d  xt){.    pNext =
cd30: 20 70 2d 3e 70 4e 65 78 74 3b 0a 23 69 66 20 4f   p->pNext;.#if O
cd40: 53 43 4c 4f 53 45 5f 43 48 45 43 4b 5f 43 4c 4f  SCLOSE_CHECK_CLO
cd50: 53 45 5f 49 4f 45 52 52 0a 20 20 20 20 69 66 28  SE_IOERR.    if(
cd60: 20 63 6c 6f 73 65 28 70 2d 3e 66 64 29 20 29 7b   close(p->fd) ){
cd70: 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74  .      storeLast
cd80: 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72  Errno(pFile, err
cd90: 6e 6f 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  no);.      rc = 
cda0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f  SQLITE_IOERR_CLO
cdb0: 53 45 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4e 65  SE;.      p->pNe
cdc0: 78 74 20 3d 20 70 45 72 72 6f 72 3b 0a 20 20 20  xt = pError;.   
cdd0: 20 20 20 70 45 72 72 6f 72 20 3d 20 70 3b 0a 20     pError = p;. 
cde0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
cdf0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
ce00: 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20  .    }.#else.   
ce10: 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 46   robust_close(pF
ce20: 69 6c 65 2c 20 70 2d 3e 66 64 2c 20 5f 5f 4c 49  ile, p->fd, __LI
ce30: 4e 45 5f 5f 29 3b 0a 20 20 20 20 73 71 6c 69 74  NE__);.    sqlit
ce40: 65 33 5f 66 72 65 65 28 70 29 3b 0a 23 65 6e 64  e3_free(p);.#end
ce50: 69 66 0a 20 20 7d 0a 20 20 70 49 6e 6f 64 65 2d  if.  }.  pInode-
ce60: 3e 70 55 6e 75 73 65 64 20 3d 20 30 3b 0a 7d 0a  >pUnused = 0;.}.
ce70: 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61  ./*.** Release a
ce80: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 73   unixInodeInfo s
ce90: 74 72 75 63 74 75 72 65 20 70 72 65 76 69 6f 75  tructure previou
cea0: 73 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 62 79  sly allocated by
ceb0: 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29   findInodeInfo()
cec0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 75 74 65  ..**.** The mute
ced0: 78 20 65 6e 74 65 72 65 64 20 75 73 69 6e 67 20  x entered using 
cee0: 74 68 65 20 75 6e 69 78 45 6e 74 65 72 4d 75 74  the unixEnterMut
cef0: 65 78 28 29 20 66 75 6e 63 74 69 6f 6e 20 6d 75  ex() function mu
cf00: 73 74 20 62 65 20 68 65 6c 64 0a 2a 2a 20 77 68  st be held.** wh
cf10: 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
cf20: 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73   is called..*/.s
cf30: 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61  tatic void relea
cf40: 73 65 49 6e 6f 64 65 49 6e 66 6f 28 75 6e 69 78  seInodeInfo(unix
cf50: 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20  File *pFile){.  
cf60: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70  unixInodeInfo *p
cf70: 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70  Inode = pFile->p
cf80: 49 6e 6f 64 65 3b 0a 20 20 61 73 73 65 72 74 28  Inode;.  assert(
cf90: 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29   unixMutexHeld()
cfa0: 20 29 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53   );.  if( ALWAYS
cfb0: 28 70 49 6e 6f 64 65 29 20 29 7b 0a 20 20 20 20  (pInode) ){.    
cfc0: 70 49 6e 6f 64 65 2d 3e 6e 52 65 66 2d 2d 3b 0a  pInode->nRef--;.
cfd0: 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e      if( pInode->
cfe0: 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20  nRef==0 ){.     
cff0: 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d   assert( pInode-
d000: 3e 70 53 68 6d 4e 6f 64 65 3d 3d 30 20 29 3b 0a  >pShmNode==0 );.
d010: 20 20 20 20 20 20 63 6c 6f 73 65 50 65 6e 64 69        closePendi
d020: 6e 67 46 64 73 28 70 46 69 6c 65 29 3b 0a 20 20  ngFds(pFile);.  
d030: 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e      if( pInode->
d040: 70 50 72 65 76 20 29 7b 0a 20 20 20 20 20 20 20  pPrev ){.       
d050: 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d   assert( pInode-
d060: 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 3d 3d 70  >pPrev->pNext==p
d070: 49 6e 6f 64 65 20 29 3b 0a 20 20 20 20 20 20 20  Inode );.       
d080: 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76 2d 3e   pInode->pPrev->
d090: 70 4e 65 78 74 20 3d 20 70 49 6e 6f 64 65 2d 3e  pNext = pInode->
d0a0: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 65 6c  pNext;.      }el
d0b0: 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  se{.        asse
d0c0: 72 74 28 20 69 6e 6f 64 65 4c 69 73 74 3d 3d 70  rt( inodeList==p
d0d0: 49 6e 6f 64 65 20 29 3b 0a 20 20 20 20 20 20 20  Inode );.       
d0e0: 20 69 6e 6f 64 65 4c 69 73 74 20 3d 20 70 49 6e   inodeList = pIn
d0f0: 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  ode->pNext;.    
d100: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 49    }.      if( pI
d110: 6e 6f 64 65 2d 3e 70 4e 65 78 74 20 29 7b 0a 20  node->pNext ){. 
d120: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
d130: 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 2d 3e 70 50  Inode->pNext->pP
d140: 72 65 76 3d 3d 70 49 6e 6f 64 65 20 29 3b 0a 20  rev==pInode );. 
d150: 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 70         pInode->p
d160: 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 49  Next->pPrev = pI
d170: 6e 6f 64 65 2d 3e 70 50 72 65 76 3b 0a 20 20 20  node->pPrev;.   
d180: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
d190: 65 33 5f 66 72 65 65 28 70 49 6e 6f 64 65 29 3b  e3_free(pInode);
d1a0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
d1b0: 0a 2a 2a 20 47 69 76 65 6e 20 61 20 66 69 6c 65  .** Given a file
d1c0: 20 64 65 73 63 72 69 70 74 6f 72 2c 20 6c 6f 63   descriptor, loc
d1d0: 61 74 65 20 74 68 65 20 75 6e 69 78 49 6e 6f 64  ate the unixInod
d1e0: 65 49 6e 66 6f 20 6f 62 6a 65 63 74 20 74 68 61  eInfo object tha
d1f0: 74 0a 2a 2a 20 64 65 73 63 72 69 62 65 73 20 74  t.** describes t
d200: 68 61 74 20 66 69 6c 65 20 64 65 73 63 72 69 70  hat file descrip
d210: 74 6f 72 2e 20 20 43 72 65 61 74 65 20 61 20 6e  tor.  Create a n
d220: 65 77 20 6f 6e 65 20 69 66 20 6e 65 63 65 73 73  ew one if necess
d230: 61 72 79 2e 20 20 54 68 65 0a 2a 2a 20 72 65 74  ary.  The.** ret
d240: 75 72 6e 20 76 61 6c 75 65 20 6d 69 67 68 74 20  urn value might 
d250: 62 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64  be uninitialized
d260: 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   if an error occ
d270: 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d  urs..**.** The m
d280: 75 74 65 78 20 65 6e 74 65 72 65 64 20 75 73 69  utex entered usi
d290: 6e 67 20 74 68 65 20 75 6e 69 78 45 6e 74 65 72  ng the unixEnter
d2a0: 4d 75 74 65 78 28 29 20 66 75 6e 63 74 69 6f 6e  Mutex() function
d2b0: 20 6d 75 73 74 20 62 65 20 68 65 6c 64 0a 2a 2a   must be held.**
d2c0: 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
d2d0: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  ion is called..*
d2e0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 61  *.** Return an a
d2f0: 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72  ppropriate error
d300: 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   code..*/.static
d310: 20 69 6e 74 20 66 69 6e 64 49 6e 6f 64 65 49 6e   int findInodeIn
d320: 66 6f 28 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  fo(.  unixFile *
d330: 70 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20  pFile,          
d340: 20 20 20 20 20 2f 2a 20 55 6e 69 78 20 66 69 6c       /* Unix fil
d350: 65 20 77 69 74 68 20 66 69 6c 65 20 64 65 73 63  e with file desc
d360: 20 75 73 65 64 20 69 6e 20 74 68 65 20 6b 65 79   used in the key
d370: 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49   */.  unixInodeI
d380: 6e 66 6f 20 2a 2a 70 70 49 6e 6f 64 65 20 20 20  nfo **ppInode   
d390: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74       /* Return t
d3a0: 68 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  he unixInodeInfo
d3b0: 20 6f 62 6a 65 63 74 20 68 65 72 65 20 2a 2f 0a   object here */.
d3c0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
d3d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d3e0: 20 20 20 20 2f 2a 20 53 79 73 74 65 6d 20 63 61      /* System ca
d3f0: 6c 6c 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a  ll return code *
d400: 2f 0a 20 20 69 6e 74 20 66 64 3b 20 20 20 20 20  /.  int fd;     
d410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d420: 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64     /* The file d
d430: 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20 70 46  escriptor for pF
d440: 69 6c 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ile */.  struct 
d450: 75 6e 69 78 46 69 6c 65 49 64 20 66 69 6c 65 49  unixFileId fileI
d460: 64 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 6b 75  d;      /* Looku
d470: 70 20 6b 65 79 20 66 6f 72 20 74 68 65 20 75 6e  p key for the un
d480: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 2f 0a 20  ixInodeInfo */. 
d490: 20 73 74 72 75 63 74 20 73 74 61 74 20 73 74 61   struct stat sta
d4a0: 74 62 75 66 3b 20 20 20 20 20 20 20 20 20 20 20  tbuf;           
d4b0: 2f 2a 20 4c 6f 77 2d 6c 65 76 65 6c 20 66 69 6c  /* Low-level fil
d4c0: 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f  e information */
d4d0: 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  .  unixInodeInfo
d4e0: 20 2a 70 49 6e 6f 64 65 20 3d 20 30 3b 20 20 20   *pInode = 0;   
d4f0: 20 20 2f 2a 20 43 61 6e 64 69 64 61 74 65 20 75    /* Candidate u
d500: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a  nixInodeInfo obj
d510: 65 63 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ect */..  assert
d520: 28 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28  ( unixMutexHeld(
d530: 29 20 29 3b 0a 0a 20 20 2f 2a 20 47 65 74 20 6c  ) );..  /* Get l
d540: 6f 77 2d 6c 65 76 65 6c 20 69 6e 66 6f 72 6d 61  ow-level informa
d550: 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 66  tion about the f
d560: 69 6c 65 20 74 68 61 74 20 77 65 20 63 61 6e 20  ile that we can 
d570: 75 73 65 64 20 74 6f 0a 20 20 2a 2a 20 63 72 65  used to.  ** cre
d580: 61 74 65 20 61 20 75 6e 69 71 75 65 20 6e 61 6d  ate a unique nam
d590: 65 20 66 6f 72 20 74 68 65 20 66 69 6c 65 2e 0a  e for the file..
d5a0: 20 20 2a 2f 0a 20 20 66 64 20 3d 20 70 46 69 6c    */.  fd = pFil
d5b0: 65 2d 3e 68 3b 0a 20 20 72 63 20 3d 20 6f 73 46  e->h;.  rc = osF
d5c0: 73 74 61 74 28 66 64 2c 20 26 73 74 61 74 62 75  stat(fd, &statbu
d5d0: 66 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 30 20  f);.  if( rc!=0 
d5e0: 29 7b 0a 20 20 20 20 73 74 6f 72 65 4c 61 73 74  ){.    storeLast
d5f0: 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72  Errno(pFile, err
d600: 6e 6f 29 3b 0a 23 69 66 64 65 66 20 45 4f 56 45  no);.#ifdef EOVE
d610: 52 46 4c 4f 57 0a 20 20 20 20 69 66 28 20 70 46  RFLOW.    if( pF
d620: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3d 3d  ile->lastErrno==
d630: 45 4f 56 45 52 46 4c 4f 57 20 29 20 72 65 74 75  EOVERFLOW ) retu
d640: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 3b  rn SQLITE_NOLFS;
d650: 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75  .#endif.    retu
d660: 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b  rn SQLITE_IOERR;
d670: 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 5f 5f 41  .  }..#ifdef __A
d680: 50 50 4c 45 5f 5f 0a 20 20 2f 2a 20 4f 6e 20 4f  PPLE__.  /* On O
d690: 53 20 58 20 6f 6e 20 61 6e 20 6d 73 64 6f 73 20  S X on an msdos 
d6a0: 66 69 6c 65 73 79 73 74 65 6d 2c 20 74 68 65 20  filesystem, the 
d6b0: 69 6e 6f 64 65 20 6e 75 6d 62 65 72 20 69 73 20  inode number is 
d6c0: 72 65 70 6f 72 74 65 64 0a 20 20 2a 2a 20 69 6e  reported.  ** in
d6d0: 63 6f 72 72 65 63 74 6c 79 20 66 6f 72 20 7a 65  correctly for ze
d6e0: 72 6f 2d 73 69 7a 65 20 66 69 6c 65 73 2e 20 20  ro-size files.  
d6f0: 53 65 65 20 74 69 63 6b 65 74 20 23 33 32 36 30  See ticket #3260
d700: 2e 20 20 54 6f 20 77 6f 72 6b 0a 20 20 2a 2a 20  .  To work.  ** 
d710: 61 72 6f 75 6e 64 20 74 68 69 73 20 70 72 6f 62  around this prob
d720: 6c 65 6d 20 28 77 65 20 63 6f 6e 73 69 64 65 72  lem (we consider
d730: 20 69 74 20 61 20 62 75 67 20 69 6e 20 4f 53 20   it a bug in OS 
d740: 58 2c 20 6e 6f 74 20 53 51 4c 69 74 65 29 0a 20  X, not SQLite). 
d750: 20 2a 2a 20 77 65 20 61 6c 77 61 79 73 20 69 6e   ** we always in
d760: 63 72 65 61 73 65 20 74 68 65 20 66 69 6c 65 20  crease the file 
d770: 73 69 7a 65 20 74 6f 20 31 20 62 79 20 77 72 69  size to 1 by wri
d780: 74 69 6e 67 20 61 20 73 69 6e 67 6c 65 20 62 79  ting a single by
d790: 74 65 0a 20 20 2a 2a 20 70 72 69 6f 72 20 74 6f  te.  ** prior to
d7a0: 20 61 63 63 65 73 73 69 6e 67 20 74 68 65 20 69   accessing the i
d7b0: 6e 6f 64 65 20 6e 75 6d 62 65 72 2e 20 20 54 68  node number.  Th
d7c0: 65 20 6f 6e 65 20 62 79 74 65 20 77 72 69 74 74  e one byte writt
d7d0: 65 6e 20 69 73 0a 20 20 2a 2a 20 61 6e 20 41 53  en is.  ** an AS
d7e0: 43 49 49 20 27 53 27 20 63 68 61 72 61 63 74 65  CII 'S' characte
d7f0: 72 20 77 68 69 63 68 20 61 6c 73 6f 20 68 61 70  r which also hap
d800: 70 65 6e 73 20 74 6f 20 62 65 20 74 68 65 20 66  pens to be the f
d810: 69 72 73 74 20 62 79 74 65 0a 20 20 2a 2a 20 69  irst byte.  ** i
d820: 6e 20 74 68 65 20 68 65 61 64 65 72 20 6f 66 20  n the header of 
d830: 65 76 65 72 79 20 53 51 4c 69 74 65 20 64 61 74  every SQLite dat
d840: 61 62 61 73 65 2e 20 20 49 6e 20 74 68 69 73 20  abase.  In this 
d850: 77 61 79 2c 20 69 66 20 74 68 65 72 65 0a 20 20  way, if there.  
d860: 2a 2a 20 69 73 20 61 20 72 61 63 65 20 63 6f 6e  ** is a race con
d870: 64 69 74 69 6f 6e 20 73 75 63 68 20 74 68 61 74  dition such that
d880: 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64 20   another thread 
d890: 68 61 73 20 61 6c 72 65 61 64 79 20 70 6f 70 75  has already popu
d8a0: 6c 61 74 65 64 0a 20 20 2a 2a 20 74 68 65 20 66  lated.  ** the f
d8b0: 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65  irst page of the
d8c0: 20 64 61 74 61 62 61 73 65 2c 20 6e 6f 20 64 61   database, no da
d8d0: 6d 61 67 65 20 69 73 20 64 6f 6e 65 2e 0a 20 20  mage is done..  
d8e0: 2a 2f 0a 20 20 69 66 28 20 73 74 61 74 62 75 66  */.  if( statbuf
d8f0: 2e 73 74 5f 73 69 7a 65 3d 3d 30 20 26 26 20 28  .st_size==0 && (
d900: 70 46 69 6c 65 2d 3e 66 73 46 6c 61 67 73 20 26  pFile->fsFlags &
d910: 20 53 51 4c 49 54 45 5f 46 53 46 4c 41 47 53 5f   SQLITE_FSFLAGS_
d920: 49 53 5f 4d 53 44 4f 53 29 21 3d 30 20 29 7b 0a  IS_MSDOS)!=0 ){.
d930: 20 20 20 20 64 6f 7b 20 72 63 20 3d 20 6f 73 57      do{ rc = osW
d940: 72 69 74 65 28 66 64 2c 20 22 53 22 2c 20 31 29  rite(fd, "S", 1)
d950: 3b 20 7d 77 68 69 6c 65 28 20 72 63 3c 30 20 26  ; }while( rc<0 &
d960: 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29  & errno==EINTR )
d970: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 31 20  ;.    if( rc!=1 
d980: 29 7b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61  ){.      storeLa
d990: 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65  stErrno(pFile, e
d9a0: 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 72 65 74  rrno);.      ret
d9b0: 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
d9c0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
d9d0: 20 6f 73 46 73 74 61 74 28 66 64 2c 20 26 73 74   osFstat(fd, &st
d9e0: 61 74 62 75 66 29 3b 0a 20 20 20 20 69 66 28 20  atbuf);.    if( 
d9f0: 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  rc!=0 ){.      s
da00: 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46  toreLastErrno(pF
da10: 69 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20  ile, errno);.   
da20: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
da30: 5f 49 4f 45 52 52 3b 0a 20 20 20 20 7d 0a 20 20  _IOERR;.    }.  
da40: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 6d 65 6d 73  }.#endif..  mems
da50: 65 74 28 26 66 69 6c 65 49 64 2c 20 30 2c 20 73  et(&fileId, 0, s
da60: 69 7a 65 6f 66 28 66 69 6c 65 49 64 29 29 3b 0a  izeof(fileId));.
da70: 20 20 66 69 6c 65 49 64 2e 64 65 76 20 3d 20 73    fileId.dev = s
da80: 74 61 74 62 75 66 2e 73 74 5f 64 65 76 3b 0a 23  tatbuf.st_dev;.#
da90: 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  if OS_VXWORKS.  
daa0: 66 69 6c 65 49 64 2e 70 49 64 20 3d 20 70 46 69  fileId.pId = pFi
dab0: 6c 65 2d 3e 70 49 64 3b 0a 23 65 6c 73 65 0a 20  le->pId;.#else. 
dac0: 20 66 69 6c 65 49 64 2e 69 6e 6f 20 3d 20 73 74   fileId.ino = st
dad0: 61 74 62 75 66 2e 73 74 5f 69 6e 6f 3b 0a 23 65  atbuf.st_ino;.#e
dae0: 6e 64 69 66 0a 20 20 70 49 6e 6f 64 65 20 3d 20  ndif.  pInode = 
daf0: 69 6e 6f 64 65 4c 69 73 74 3b 0a 20 20 77 68 69  inodeList;.  whi
db00: 6c 65 28 20 70 49 6e 6f 64 65 20 26 26 20 6d 65  le( pInode && me
db10: 6d 63 6d 70 28 26 66 69 6c 65 49 64 2c 20 26 70  mcmp(&fileId, &p
db20: 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2c 20 73  Inode->fileId, s
db30: 69 7a 65 6f 66 28 66 69 6c 65 49 64 29 29 20 29  izeof(fileId)) )
db40: 7b 0a 20 20 20 20 70 49 6e 6f 64 65 20 3d 20 70  {.    pInode = p
db50: 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a 20 20  Inode->pNext;.  
db60: 7d 0a 20 20 69 66 28 20 70 49 6e 6f 64 65 3d 3d  }.  if( pInode==
db70: 30 20 29 7b 0a 20 20 20 20 70 49 6e 6f 64 65 20  0 ){.    pInode 
db80: 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
db90: 28 20 73 69 7a 65 6f 66 28 2a 70 49 6e 6f 64 65  ( sizeof(*pInode
dba0: 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e  ) );.    if( pIn
dbb0: 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ode==0 ){.      
dbc0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
dbd0: 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d  MEM;.    }.    m
dbe0: 65 6d 73 65 74 28 70 49 6e 6f 64 65 2c 20 30 2c  emset(pInode, 0,
dbf0: 20 73 69 7a 65 6f 66 28 2a 70 49 6e 6f 64 65 29   sizeof(*pInode)
dc00: 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70  );.    memcpy(&p
dc10: 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2c 20 26  Inode->fileId, &
dc20: 66 69 6c 65 49 64 2c 20 73 69 7a 65 6f 66 28 66  fileId, sizeof(f
dc30: 69 6c 65 49 64 29 29 3b 0a 20 20 20 20 70 49 6e  ileId));.    pIn
dc40: 6f 64 65 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20  ode->nRef = 1;. 
dc50: 20 20 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74     pInode->pNext
dc60: 20 3d 20 69 6e 6f 64 65 4c 69 73 74 3b 0a 20 20   = inodeList;.  
dc70: 20 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76 20    pInode->pPrev 
dc80: 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 69 6e 6f  = 0;.    if( ino
dc90: 64 65 4c 69 73 74 20 29 20 69 6e 6f 64 65 4c 69  deList ) inodeLi
dca0: 73 74 2d 3e 70 50 72 65 76 20 3d 20 70 49 6e 6f  st->pPrev = pIno
dcb0: 64 65 3b 0a 20 20 20 20 69 6e 6f 64 65 4c 69 73  de;.    inodeLis
dcc0: 74 20 3d 20 70 49 6e 6f 64 65 3b 0a 20 20 7d 65  t = pInode;.  }e
dcd0: 6c 73 65 7b 0a 20 20 20 20 70 49 6e 6f 64 65 2d  lse{.    pInode-
dce0: 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 2a  >nRef++;.  }.  *
dcf0: 70 70 49 6e 6f 64 65 20 3d 20 70 49 6e 6f 64 65  ppInode = pInode
dd00: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
dd10: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  E_OK;.}../*.** R
dd20: 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 70 46  eturn TRUE if pF
dd30: 69 6c 65 20 68 61 73 20 62 65 65 6e 20 72 65 6e  ile has been ren
dd40: 61 6d 65 64 20 6f 72 20 75 6e 6c 69 6e 6b 65 64  amed or unlinked
dd50: 20 73 69 6e 63 65 20 69 74 20 77 61 73 20 66 69   since it was fi
dd60: 72 73 74 20 6f 70 65 6e 65 64 2e 0a 2a 2f 0a 73  rst opened..*/.s
dd70: 74 61 74 69 63 20 69 6e 74 20 66 69 6c 65 48 61  tatic int fileHa
dd80: 73 4d 6f 76 65 64 28 75 6e 69 78 46 69 6c 65 20  sMoved(unixFile 
dd90: 2a 70 46 69 6c 65 29 7b 0a 23 69 66 20 4f 53 5f  *pFile){.#if OS_
dda0: 56 58 57 4f 52 4b 53 0a 20 20 72 65 74 75 72 6e  VXWORKS.  return
ddb0: 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 21 3d   pFile->pInode!=
ddc0: 30 20 26 26 20 70 46 69 6c 65 2d 3e 70 49 64 21  0 && pFile->pId!
ddd0: 3d 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e  =pFile->pInode->
dde0: 66 69 6c 65 49 64 2e 70 49 64 3b 0a 23 65 6c 73  fileId.pId;.#els
ddf0: 65 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 20  e.  struct stat 
de00: 62 75 66 3b 0a 20 20 72 65 74 75 72 6e 20 70 46  buf;.  return pF
de10: 69 6c 65 2d 3e 70 49 6e 6f 64 65 21 3d 30 20 26  ile->pInode!=0 &
de20: 26 0a 20 20 20 20 20 20 28 6f 73 53 74 61 74 28  &.      (osStat(
de30: 70 46 69 6c 65 2d 3e 7a 50 61 74 68 2c 20 26 62  pFile->zPath, &b
de40: 75 66 29 21 3d 30 20 7c 7c 20 62 75 66 2e 73 74  uf)!=0 || buf.st
de50: 5f 69 6e 6f 21 3d 70 46 69 6c 65 2d 3e 70 49 6e  _ino!=pFile->pIn
de60: 6f 64 65 2d 3e 66 69 6c 65 49 64 2e 69 6e 6f 29  ode->fileId.ino)
de70: 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a  ;.#endif.}.../*.
de80: 2a 2a 20 43 68 65 63 6b 20 61 20 75 6e 69 78 46  ** Check a unixF
de90: 69 6c 65 20 74 68 61 74 20 69 73 20 61 20 64 61  ile that is a da
dea0: 74 61 62 61 73 65 2e 20 20 56 65 72 69 66 79 20  tabase.  Verify 
deb0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a  the following:.*
dec0: 2a 0a 2a 2a 20 28 31 29 20 54 68 65 72 65 20 69  *.** (1) There i
ded0: 73 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 68 61  s exactly one ha
dee0: 72 64 20 6c 69 6e 6b 20 6f 6e 20 74 68 65 20 66  rd link on the f
def0: 69 6c 65 0a 2a 2a 20 28 32 29 20 54 68 65 20 66  ile.** (2) The f
df00: 69 6c 65 20 69 73 20 6e 6f 74 20 61 20 73 79 6d  ile is not a sym
df10: 62 6f 6c 69 63 20 6c 69 6e 6b 0a 2a 2a 20 28 33  bolic link.** (3
df20: 29 20 54 68 65 20 66 69 6c 65 20 68 61 73 20 6e  ) The file has n
df30: 6f 74 20 62 65 65 6e 20 72 65 6e 61 6d 65 64 20  ot been renamed 
df40: 6f 72 20 75 6e 6c 69 6e 6b 65 64 0a 2a 2a 0a 2a  or unlinked.**.*
df50: 2a 20 49 73 73 75 65 20 73 71 6c 69 74 65 33 5f  * Issue sqlite3_
df60: 6c 6f 67 28 53 51 4c 49 54 45 5f 57 41 52 4e 49  log(SQLITE_WARNI
df70: 4e 47 2c 2e 2e 2e 29 20 6d 65 73 73 61 67 65 73  NG,...) messages
df80: 20 69 66 20 61 6e 79 74 68 69 6e 67 20 69 73 20   if anything is 
df90: 6e 6f 74 20 72 69 67 68 74 2e 0a 2a 2f 0a 73 74  not right..*/.st
dfa0: 61 74 69 63 20 76 6f 69 64 20 76 65 72 69 66 79  atic void verify
dfb0: 44 62 46 69 6c 65 28 75 6e 69 78 46 69 6c 65 20  DbFile(unixFile 
dfc0: 2a 70 46 69 6c 65 29 7b 0a 20 20 73 74 72 75 63  *pFile){.  struc
dfd0: 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20 69 6e  t stat buf;.  in
dfe0: 74 20 72 63 3b 0a 20 20 69 66 28 20 70 46 69 6c  t rc;.  if( pFil
dff0: 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 55  e->ctrlFlags & U
e000: 4e 49 58 46 49 4c 45 5f 57 41 52 4e 45 44 20 29  NIXFILE_WARNED )
e010: 7b 0a 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 72 20  {.    /* One or 
e020: 6d 6f 72 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  more of the foll
e030: 6f 77 69 6e 67 20 77 61 72 6e 69 6e 67 73 20 68  owing warnings h
e040: 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
e050: 20 69 73 73 75 65 64 2e 20 20 44 6f 20 6e 6f 74   issued.  Do not
e060: 0a 20 20 20 20 2a 2a 20 72 65 70 65 61 74 20 74  .    ** repeat t
e070: 68 65 6d 20 73 6f 20 61 73 20 6e 6f 74 20 74 6f  hem so as not to
e080: 20 63 6c 75 74 74 65 72 20 74 68 65 20 65 72 72   clutter the err
e090: 6f 72 20 6c 6f 67 20 2a 2f 0a 20 20 20 20 72 65  or log */.    re
e0a0: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  turn;.  }.  rc =
e0b0: 20 6f 73 46 73 74 61 74 28 70 46 69 6c 65 2d 3e   osFstat(pFile->
e0c0: 68 2c 20 26 62 75 66 29 3b 0a 20 20 69 66 28 20  h, &buf);.  if( 
e0d0: 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  rc!=0 ){.    sql
e0e0: 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
e0f0: 57 41 52 4e 49 4e 47 2c 20 22 63 61 6e 6e 6f 74  WARNING, "cannot
e100: 20 66 73 74 61 74 20 64 62 20 66 69 6c 65 20 25   fstat db file %
e110: 73 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68  s", pFile->zPath
e120: 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63 74  );.    pFile->ct
e130: 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46  rlFlags |= UNIXF
e140: 49 4c 45 5f 57 41 52 4e 45 44 3b 0a 20 20 20 20  ILE_WARNED;.    
e150: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66  return;.  }.  if
e160: 28 20 62 75 66 2e 73 74 5f 6e 6c 69 6e 6b 3d 3d  ( buf.st_nlink==
e170: 30 20 26 26 20 28 70 46 69 6c 65 2d 3e 63 74 72  0 && (pFile->ctr
e180: 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c  lFlags & UNIXFIL
e190: 45 5f 44 45 4c 45 54 45 29 3d 3d 30 20 29 7b 0a  E_DELETE)==0 ){.
e1a0: 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28      sqlite3_log(
e1b0: 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 2c 20  SQLITE_WARNING, 
e1c0: 22 66 69 6c 65 20 75 6e 6c 69 6e 6b 65 64 20 77  "file unlinked w
e1d0: 68 69 6c 65 20 6f 70 65 6e 3a 20 25 73 22 2c 20  hile open: %s", 
e1e0: 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20  pFile->zPath);. 
e1f0: 20 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c     pFile->ctrlFl
e200: 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f  ags |= UNIXFILE_
e210: 57 41 52 4e 45 44 3b 0a 20 20 20 20 72 65 74 75  WARNED;.    retu
e220: 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 62 75  rn;.  }.  if( bu
e230: 66 2e 73 74 5f 6e 6c 69 6e 6b 3e 31 20 29 7b 0a  f.st_nlink>1 ){.
e240: 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28      sqlite3_log(
e250: 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 2c 20  SQLITE_WARNING, 
e260: 22 6d 75 6c 74 69 70 6c 65 20 6c 69 6e 6b 73 20  "multiple links 
e270: 74 6f 20 66 69 6c 65 3a 20 25 73 22 2c 20 70 46  to file: %s", pF
e280: 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20  ile->zPath);.   
e290: 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67   pFile->ctrlFlag
e2a0: 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 57 41  s |= UNIXFILE_WA
e2b0: 52 4e 45 44 3b 0a 20 20 20 20 72 65 74 75 72 6e  RNED;.    return
e2c0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 69 6c 65  ;.  }.  if( file
e2d0: 48 61 73 4d 6f 76 65 64 28 70 46 69 6c 65 29 20  HasMoved(pFile) 
e2e0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c  ){.    sqlite3_l
e2f0: 6f 67 28 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e  og(SQLITE_WARNIN
e300: 47 2c 20 22 66 69 6c 65 20 72 65 6e 61 6d 65 64  G, "file renamed
e310: 20 77 68 69 6c 65 20 6f 70 65 6e 3a 20 25 73 22   while open: %s"
e320: 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b  , pFile->zPath);
e330: 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c  .    pFile->ctrl
e340: 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c  Flags |= UNIXFIL
e350: 45 5f 57 41 52 4e 45 44 3b 0a 20 20 20 20 72 65  E_WARNED;.    re
e360: 74 75 72 6e 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a  turn;.  }.}.../*
e370: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
e380: 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 72 65   checks if there
e390: 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20 6c   is a RESERVED l
e3a0: 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20  ock held on the 
e3b0: 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c  specified.** fil
e3c0: 65 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79  e by this or any
e3d0: 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20   other process. 
e3e0: 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69  If such a lock i
e3f0: 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65  s held, set *pRe
e400: 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e  sOut.** to a non
e410: 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65  -zero value othe
e420: 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69  rwise *pResOut i
e430: 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20  s set to zero.  
e440: 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  The return value
e450: 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51  .** is set to SQ
e460: 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61  LITE_OK unless a
e470: 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75  n I/O error occu
e480: 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63  rs during lock c
e490: 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  hecking..*/.stat
e4a0: 69 63 20 69 6e 74 20 75 6e 69 78 43 68 65 63 6b  ic int unixCheck
e4b0: 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c  ReservedLock(sql
e4c0: 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
e4d0: 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20  nt *pResOut){.  
e4e0: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
e4f0: 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65 72 76  OK;.  int reserv
e500: 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69  ed = 0;.  unixFi
e510: 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
e520: 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53 69  xFile*)id;..  Si
e530: 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
e540: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
e550: 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44  RR_CHECKRESERVED
e560: 4c 4f 43 4b 3b 20 29 3b 0a 0a 20 20 61 73 73 65  LOCK; );..  asse
e570: 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 75  rt( pFile );.  u
e580: 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
e590: 20 2f 2a 20 42 65 63 61 75 73 65 20 70 46 69 6c   /* Because pFil
e5a0: 65 2d 3e 70 49 6e 6f 64 65 20 69 73 20 73 68 61  e->pInode is sha
e5b0: 72 65 64 20 61 63 72 6f 73 73 20 74 68 72 65 61  red across threa
e5c0: 64 73 20 2a 2f 0a 0a 20 20 2f 2a 20 43 68 65 63  ds */..  /* Chec
e5d0: 6b 20 69 66 20 61 20 74 68 72 65 61 64 20 69 6e  k if a thread in
e5e0: 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 68 6f   this process ho
e5f0: 6c 64 73 20 73 75 63 68 20 61 20 6c 6f 63 6b 20  lds such a lock 
e600: 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
e610: 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
e620: 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b  k>SHARED_LOCK ){
e630: 0a 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20  .    reserved = 
e640: 31 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 74 68  1;.  }..  /* Oth
e650: 65 72 77 69 73 65 20 73 65 65 20 69 66 20 73 6f  erwise see if so
e660: 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  me other process
e670: 20 68 6f 6c 64 73 20 69 74 2e 0a 20 20 2a 2f 0a   holds it..  */.
e680: 23 69 66 6e 64 65 66 20 5f 5f 44 4a 47 50 50 5f  #ifndef __DJGPP_
e690: 5f 0a 20 20 69 66 28 20 21 72 65 73 65 72 76 65  _.  if( !reserve
e6a0: 64 20 26 26 20 21 70 46 69 6c 65 2d 3e 70 49 6e  d && !pFile->pIn
e6b0: 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63  ode->bProcessLoc
e6c0: 6b 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  k ){.    struct 
e6d0: 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 20 20  flock lock;.    
e6e0: 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20  lock.l_whence = 
e6f0: 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 6c 6f  SEEK_SET;.    lo
e700: 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 52 45 53  ck.l_start = RES
e710: 45 52 56 45 44 5f 42 59 54 45 3b 0a 20 20 20 20  ERVED_BYTE;.    
e720: 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a  lock.l_len = 1;.
e730: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20      lock.l_type 
e740: 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20 20 20 20 69  = F_WRLCK;.    i
e750: 66 28 20 6f 73 46 63 6e 74 6c 28 70 46 69 6c 65  f( osFcntl(pFile
e760: 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c  ->h, F_GETLK, &l
e770: 6f 63 6b 29 20 29 7b 0a 23 69 66 20 4f 53 4c 4f  ock) ){.#if OSLO
e780: 43 4b 49 4e 47 5f 43 48 45 43 4b 5f 42 55 53 59  CKING_CHECK_BUSY
e790: 5f 49 4f 45 52 52 0a 20 20 20 20 20 20 69 6e 74  _IOERR.      int
e7a0: 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
e7b0: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
e7c0: 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78  teErrorFromPosix
e7d0: 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51  Error(tErrno, SQ
e7e0: 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b  LITE_IOERR_CHECK
e7f0: 52 45 53 45 52 56 45 44 4c 4f 43 4b 29 3b 0a 20  RESERVEDLOCK);. 
e800: 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72       storeLastEr
e810: 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e  rno(pFile, tErrn
e820: 6f 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20  o);.#else.      
e830: 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
e840: 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c  R_CHECKRESERVEDL
e850: 4f 43 4b 3b 0a 20 20 20 20 20 20 73 74 6f 72 65  OCK;.      store
e860: 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c  LastErrno(pFile,
e870: 20 65 72 72 6e 6f 29 3b 0a 23 65 6e 64 69 66 0a   errno);.#endif.
e880: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 28 20 6c      } else if( l
e890: 6f 63 6b 2e 6c 5f 74 79 70 65 21 3d 46 5f 55 4e  ock.l_type!=F_UN
e8a0: 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 73  LCK ){.      res
e8b0: 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d  erved = 1;.    }
e8c0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20  .  }.#endif.  . 
e8d0: 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
e8e0: 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54  );.  OSTRACE(("T
e8f0: 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25  EST WR-LOCK %d %
e900: 64 20 25 64 20 28 75 6e 69 78 29 5c 6e 22 2c 20  d %d (unix)\n", 
e910: 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65  pFile->h, rc, re
e920: 73 65 72 76 65 64 29 29 3b 0a 0a 20 20 2a 70 52  served));..  *pR
e930: 65 73 4f 75 74 20 3d 20 72 65 73 65 72 76 65 64  esOut = reserved
e940: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
e950: 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20  ../*.** Attempt 
e960: 74 6f 20 73 65 74 20 61 20 73 79 73 74 65 6d 2d  to set a system-
e970: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65  lock on the file
e980: 20 70 46 69 6c 65 2e 20 20 54 68 65 20 6c 6f 63   pFile.  The loc
e990: 6b 20 69 73 20 0a 2a 2a 20 64 65 73 63 72 69 62  k is .** describ
e9a0: 65 64 20 62 79 20 70 4c 6f 63 6b 2e 0a 2a 2a 0a  ed by pLock..**.
e9b0: 2a 2a 20 49 66 20 74 68 65 20 70 46 69 6c 65 20  ** If the pFile 
e9c0: 77 61 73 20 6f 70 65 6e 65 64 20 72 65 61 64 2f  was opened read/
e9d0: 77 72 69 74 65 20 66 72 6f 6d 20 75 6e 69 78 2d  write from unix-
e9e0: 65 78 63 6c 2c 20 74 68 65 6e 20 74 68 65 20 6f  excl, then the o
e9f0: 6e 6c 79 20 6c 6f 63 6b 0a 2a 2a 20 65 76 65 72  nly lock.** ever
ea00: 20 6f 62 74 61 69 6e 65 64 20 69 73 20 61 6e 20   obtained is an 
ea10: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2c 20  exclusive lock, 
ea20: 61 6e 64 20 69 74 20 69 73 20 6f 62 74 61 69 6e  and it is obtain
ea30: 65 64 20 65 78 61 63 74 6c 79 20 6f 6e 63 65 0a  ed exactly once.
ea40: 2a 2a 20 74 68 65 20 66 69 72 73 74 20 74 69 6d  ** the first tim
ea50: 65 20 61 6e 79 20 6c 6f 63 6b 20 69 73 20 61 74  e any lock is at
ea60: 74 65 6d 70 74 65 64 2e 20 20 41 6c 6c 20 73 75  tempted.  All su
ea70: 62 73 65 71 75 65 6e 74 20 73 79 73 74 65 6d 20  bsequent system 
ea80: 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 6f 70 65 72 61  locking.** opera
ea90: 74 69 6f 6e 73 20 62 65 63 6f 6d 65 20 6e 6f 2d  tions become no-
eaa0: 6f 70 73 2e 20 20 4c 6f 63 6b 69 6e 67 20 6f 70  ops.  Locking op
eab0: 65 72 61 74 69 6f 6e 73 20 73 74 69 6c 6c 20 68  erations still h
eac0: 61 70 70 65 6e 20 69 6e 74 65 72 6e 61 6c 6c 79  appen internally
ead0: 2c 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74 6f  ,.** in order to
eae0: 20 63 6f 6f 72 64 69 6e 61 74 65 20 61 63 63 65   coordinate acce
eaf0: 73 73 20 62 65 74 77 65 65 6e 20 73 65 70 61 72  ss between separ
eb00: 61 74 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  ate database con
eb10: 6e 65 63 74 69 6f 6e 73 0a 2a 2a 20 77 69 74 68  nections.** with
eb20: 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 2c  in this process,
eb30: 20 62 75 74 20 61 6c 6c 20 6f 66 20 74 68 61 74   but all of that
eb40: 20 69 73 20 68 61 6e 64 6c 65 64 20 69 6e 20 6d   is handled in m
eb50: 65 6d 6f 72 79 20 61 6e 64 20 74 68 65 0a 2a 2a  emory and the.**
eb60: 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
eb70: 6d 20 64 6f 65 73 20 6e 6f 74 20 70 61 72 74 69  m does not parti
eb80: 63 69 70 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  cipate..**.** Th
eb90: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
eba0: 20 70 61 73 73 2d 74 68 72 6f 75 67 68 20 74 6f   pass-through to
ebb0: 20 66 63 6e 74 6c 28 46 5f 53 45 54 4c 4b 29 20   fcntl(F_SETLK) 
ebc0: 69 66 20 70 46 69 6c 65 20 69 73 20 75 73 69 6e  if pFile is usin
ebd0: 67 0a 2a 2a 20 61 6e 79 20 56 46 53 20 6f 74 68  g.** any VFS oth
ebe0: 65 72 20 74 68 61 6e 20 22 75 6e 69 78 2d 65 78  er than "unix-ex
ebf0: 63 6c 22 20 6f 72 20 69 66 20 70 46 69 6c 65 20  cl" or if pFile 
ec00: 69 73 20 6f 70 65 6e 65 64 20 6f 6e 20 22 75 6e  is opened on "un
ec10: 69 78 2d 65 78 63 6c 22 0a 2a 2a 20 61 6e 64 20  ix-excl".** and 
ec20: 69 73 20 72 65 61 64 2d 6f 6e 6c 79 2e 0a 2a 2a  is read-only..**
ec30: 0a 2a 2a 20 5a 65 72 6f 20 69 73 20 72 65 74 75  .** Zero is retu
ec40: 72 6e 65 64 20 69 66 20 74 68 65 20 63 61 6c 6c  rned if the call
ec50: 20 63 6f 6d 70 6c 65 74 65 73 20 73 75 63 63 65   completes succe
ec60: 73 73 66 75 6c 6c 79 2c 20 6f 72 20 2d 31 20 69  ssfully, or -1 i
ec70: 66 20 61 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 66  f a call.** to f
ec80: 63 6e 74 6c 28 29 20 66 61 69 6c 73 2e 20 49 6e  cntl() fails. In
ec90: 20 74 68 69 73 20 63 61 73 65 2c 20 65 72 72 6e   this case, errn
eca0: 6f 20 69 73 20 73 65 74 20 61 70 70 72 6f 70 72  o is set appropr
ecb0: 69 61 74 65 6c 79 20 28 62 79 20 66 63 6e 74 6c  iately (by fcntl
ecc0: 28 29 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ())..*/.static i
ecd0: 6e 74 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28  nt unixFileLock(
ece0: 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c  unixFile *pFile,
ecf0: 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 2a 70   struct flock *p
ed00: 4c 6f 63 6b 2c 20 69 6e 74 20 6e 52 65 74 72 79  Lock, int nRetry
ed10: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75  ){.  int rc;.  u
ed20: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49  nixInodeInfo *pI
ed30: 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49  node = pFile->pI
ed40: 6e 6f 64 65 3b 0a 20 20 61 73 73 65 72 74 28 20  node;.  assert( 
ed50: 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20  unixMutexHeld() 
ed60: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e  );.  assert( pIn
ed70: 6f 64 65 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  ode!=0 );.  if( 
ed80: 28 28 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61  ((pFile->ctrlFla
ed90: 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 45 58  gs & UNIXFILE_EX
eda0: 43 4c 29 21 3d 30 20 7c 7c 20 70 49 6e 6f 64 65  CL)!=0 || pInode
edb0: 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 29 0a  ->bProcessLock).
edc0: 20 20 20 26 26 20 28 28 70 46 69 6c 65 2d 3e 63     && ((pFile->c
edd0: 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46  trlFlags & UNIXF
ede0: 49 4c 45 5f 52 44 4f 4e 4c 59 29 3d 3d 30 29 0a  ILE_RDONLY)==0).
edf0: 20 20 29 7b 0a 20 20 20 20 69 66 28 20 70 49 6e    ){.    if( pIn
ee00: 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63  ode->bProcessLoc
ee10: 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 74  k==0 ){.      st
ee20: 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b  ruct flock lock;
ee30: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
ee40: 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20  Inode->nLock==0 
ee50: 29 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  );.      lock.l_
ee60: 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45  whence = SEEK_SE
ee70: 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  T;.      lock.l_
ee80: 73 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46  start = SHARED_F
ee90: 49 52 53 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b  IRST;.      lock
eea0: 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f  .l_len = SHARED_
eeb0: 53 49 5a 45 3b 0a 20 20 20 20 20 20 6c 6f 63 6b  SIZE;.      lock
eec0: 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57 52 4c 43  .l_type = F_WRLC
eed0: 4b 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6f 73  K;.      rc = os
eee0: 46 63 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20  Fcntl(pFile->h, 
eef0: 46 5f 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3b  F_SETLK, &lock);
ef00: 0a 20 20 20 20 20 20 69 66 28 20 72 63 3c 30 20  .      if( rc<0 
ef10: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
ef20: 20 20 20 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63     pInode->bProc
ef30: 65 73 73 4c 6f 63 6b 20 3d 20 31 3b 0a 20 20 20  essLock = 1;.   
ef40: 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b     pInode->nLock
ef50: 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ++;.    }else{. 
ef60: 20 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 20       rc = 0;.   
ef70: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
ef80: 69 6e 74 20 69 20 3d 20 30 3b 20 20 20 20 20 20  int i = 0;      
ef90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
efa0: 0a 20 20 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20  .    for(;;){.  
efb0: 20 20 20 20 72 63 20 3d 20 6f 73 46 63 6e 74 6c      rc = osFcntl
efc0: 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 53 45 54  (pFile->h, F_SET
efd0: 4c 4b 2c 20 70 4c 6f 63 6b 29 3b 0a 20 20 20 20  LK, pLock);.    
efe0: 20 20 69 66 28 20 72 63 20 26 26 20 6e 52 65 74    if( rc && nRet
eff0: 72 79 2d 2d 20 29 7b 0a 20 20 20 20 20 20 20 20  ry-- ){.        
f000: 75 73 6c 65 65 70 28 31 30 30 20 2a 20 28 2b 2b  usleep(100 * (++
f010: 69 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  i));.      }else
f020: 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  {.        break;
f030: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
f040: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
f050: 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68  }../*.** Lock th
f060: 65 20 66 69 6c 65 20 77 69 74 68 20 74 68 65 20  e file with the 
f070: 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20 62  lock specified b
f080: 79 20 70 61 72 61 6d 65 74 65 72 20 65 46 69 6c  y parameter eFil
f090: 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f  eLock - one.** o
f0a0: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  f the following:
f0b0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53  .**.**     (1) S
f0c0: 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  HARED_LOCK.**   
f0d0: 20 20 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c    (2) RESERVED_L
f0e0: 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50  OCK.**     (3) P
f0f0: 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20  ENDING_LOCK.**  
f100: 20 20 20 28 34 29 20 45 58 43 4c 55 53 49 56 45     (4) EXCLUSIVE
f110: 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65  _LOCK.**.** Some
f120: 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65  times when reque
f130: 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73  sting one lock s
f140: 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c  tate, additional
f150: 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20   lock states.** 
f160: 61 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20  are inserted in 
f170: 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f  between.  The lo
f180: 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c  cking might fail
f190: 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c   on one of the l
f1a0: 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69  ater.** transiti
f1b0: 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20  ons leaving the 
f1c0: 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66 65  lock state diffe
f1d0: 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69  rent from what i
f1e0: 74 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a  t started but.**
f1f0: 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20   still short of 
f200: 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66  its goal.  The f
f210: 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73  ollowing chart s
f220: 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64  hows the allowed
f230: 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  .** transitions 
f240: 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65 64  and the inserted
f250: 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74   intermediate st
f260: 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55  ates:.**.**    U
f270: 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45  NLOCKED -> SHARE
f280: 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d  D.**    SHARED -
f290: 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20  > RESERVED.**   
f2a0: 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44   SHARED -> (PEND
f2b0: 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56  ING) -> EXCLUSIV
f2c0: 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44  E.**    RESERVED
f2d0: 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e   -> (PENDING) ->
f2e0: 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20   EXCLUSIVE.**   
f2f0: 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c   PENDING -> EXCL
f300: 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73  USIVE.**.** This
f310: 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e   routine will on
f320: 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f  ly increase a lo
f330: 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c  ck.  Use the sql
f340: 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a  ite3OsUnlock().*
f350: 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77  * routine to low
f360: 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  er a locking lev
f370: 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  el..*/.static in
f380: 74 20 75 6e 69 78 4c 6f 63 6b 28 73 71 6c 69 74  t unixLock(sqlit
f390: 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
f3a0: 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20 2f   eFileLock){.  /
f3b0: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
f3c0: 64 65 73 63 72 69 62 65 73 20 74 68 65 20 69 6d  describes the im
f3d0: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
f3e0: 74 68 65 20 76 61 72 69 6f 75 73 20 6c 6f 63 6b  the various lock
f3f0: 73 20 61 6e 64 0a 20 20 2a 2a 20 6c 6f 63 6b 20  s and.  ** lock 
f400: 74 72 61 6e 73 69 74 69 6f 6e 73 20 69 6e 20 74  transitions in t
f410: 65 72 6d 73 20 6f 66 20 74 68 65 20 50 4f 53 49  erms of the POSI
f420: 58 20 61 64 76 69 73 6f 72 79 20 73 68 61 72 65  X advisory share
f430: 64 20 61 6e 64 20 65 78 63 6c 75 73 69 76 65 0a  d and exclusive.
f440: 20 20 2a 2a 20 6c 6f 63 6b 20 70 72 69 6d 69 74    ** lock primit
f450: 69 76 65 73 20 28 63 61 6c 6c 65 64 20 72 65 61  ives (called rea
f460: 64 2d 6c 6f 63 6b 73 20 61 6e 64 20 77 72 69 74  d-locks and writ
f470: 65 2d 6c 6f 63 6b 73 20 62 65 6c 6f 77 2c 20 74  e-locks below, t
f480: 6f 20 61 76 6f 69 64 0a 20 20 2a 2a 20 63 6f 6e  o avoid.  ** con
f490: 66 75 73 69 6f 6e 20 77 69 74 68 20 53 51 4c 69  fusion with SQLi
f4a0: 74 65 20 6c 6f 63 6b 20 6e 61 6d 65 73 29 2e 20  te lock names). 
f4b0: 54 68 65 20 61 6c 67 6f 72 69 74 68 6d 73 20 61  The algorithms a
f4c0: 72 65 20 63 6f 6d 70 6c 69 63 61 74 65 64 0a 20  re complicated. 
f4d0: 20 2a 2a 20 73 6c 69 67 68 74 6c 79 20 69 6e 20   ** slightly in 
f4e0: 6f 72 64 65 72 20 74 6f 20 62 65 20 63 6f 6d 70  order to be comp
f4f0: 61 74 69 62 6c 65 20 77 69 74 68 20 77 69 6e 64  atible with wind
f500: 6f 77 73 20 73 79 73 74 65 6d 73 20 73 69 6d 75  ows systems simu
f510: 6c 74 61 6e 65 6f 75 73 6c 79 0a 20 20 2a 2a 20  ltaneously.  ** 
f520: 61 63 63 65 73 73 69 6e 67 20 74 68 65 20 73 61  accessing the sa
f530: 6d 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  me database file
f540: 2c 20 69 6e 20 63 61 73 65 20 74 68 61 74 20 69  , in case that i
f550: 73 20 65 76 65 72 20 72 65 71 75 69 72 65 64 2e  s ever required.
f560: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 53 79 6d 62 6f  .  **.  ** Symbo
f570: 6c 73 20 64 65 66 69 6e 65 64 20 69 6e 20 6f 73  ls defined in os
f580: 2e 68 20 69 6e 64 65 6e 74 69 66 79 20 74 68 65  .h indentify the
f590: 20 27 70 65 6e 64 69 6e 67 20 62 79 74 65 27 20   'pending byte' 
f5a0: 61 6e 64 20 74 68 65 20 27 72 65 73 65 72 76 65  and the 'reserve
f5b0: 64 0a 20 20 2a 2a 20 62 79 74 65 27 2c 20 65 61  d.  ** byte', ea
f5c0: 63 68 20 73 69 6e 67 6c 65 20 62 79 74 65 73 20  ch single bytes 
f5d0: 61 74 20 77 65 6c 6c 20 6b 6e 6f 77 6e 20 6f 66  at well known of
f5e0: 66 73 65 74 73 2c 20 61 6e 64 20 74 68 65 20 27  fsets, and the '
f5f0: 73 68 61 72 65 64 20 62 79 74 65 0a 20 20 2a 2a  shared byte.  **
f600: 20 72 61 6e 67 65 27 2c 20 61 20 72 61 6e 67 65   range', a range
f610: 20 6f 66 20 35 31 30 20 62 79 74 65 73 20 61 74   of 510 bytes at
f620: 20 61 20 77 65 6c 6c 20 6b 6e 6f 77 6e 20 6f 66   a well known of
f630: 66 73 65 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  fset..  **.  ** 
f640: 54 6f 20 6f 62 74 61 69 6e 20 61 20 53 48 41 52  To obtain a SHAR
f650: 45 44 20 6c 6f 63 6b 2c 20 61 20 72 65 61 64 2d  ED lock, a read-
f660: 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64  lock is obtained
f670: 20 6f 6e 20 74 68 65 20 27 70 65 6e 64 69 6e 67   on the 'pending
f680: 0a 20 20 2a 2a 20 62 79 74 65 27 2e 20 20 49 66  .  ** byte'.  If
f690: 20 74 68 69 73 20 69 73 20 73 75 63 63 65 73 73   this is success
f6a0: 66 75 6c 2c 20 61 20 72 61 6e 64 6f 6d 20 62 79  ful, a random by
f6b0: 74 65 20 66 72 6f 6d 20 74 68 65 20 27 73 68 61  te from the 'sha
f6c0: 72 65 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61  red byte.  ** ra
f6d0: 6e 67 65 27 20 69 73 20 72 65 61 64 2d 6c 6f 63  nge' is read-loc
f6e0: 6b 65 64 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b  ked and the lock
f6f0: 20 6f 6e 20 74 68 65 20 27 70 65 6e 64 69 6e 67   on the 'pending
f700: 20 62 79 74 65 27 20 72 65 6c 65 61 73 65 64 2e   byte' released.
f710: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 70 72 6f  .  **.  ** A pro
f720: 63 65 73 73 20 6d 61 79 20 6f 6e 6c 79 20 6f 62  cess may only ob
f730: 74 61 69 6e 20 61 20 52 45 53 45 52 56 45 44 20  tain a RESERVED 
f740: 6c 6f 63 6b 20 61 66 74 65 72 20 69 74 20 68 61  lock after it ha
f750: 73 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2e  s a SHARED lock.
f760: 0a 20 20 2a 2a 20 41 20 52 45 53 45 52 56 45 44  .  ** A RESERVED
f770: 20 6c 6f 63 6b 20 69 73 20 69 6d 70 6c 65 6d 65   lock is impleme
f780: 6e 74 65 64 20 62 79 20 67 72 61 62 62 69 6e 67  nted by grabbing
f790: 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e   a write-lock on
f7a0: 20 74 68 65 0a 20 20 2a 2a 20 27 72 65 73 65 72   the.  ** 'reser
f7b0: 76 65 64 20 62 79 74 65 27 2e 20 0a 20 20 2a 2a  ved byte'. .  **
f7c0: 0a 20 20 2a 2a 20 41 20 70 72 6f 63 65 73 73 20  .  ** A process 
f7d0: 6d 61 79 20 6f 6e 6c 79 20 6f 62 74 61 69 6e 20  may only obtain 
f7e0: 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 61  a PENDING lock a
f7f0: 66 74 65 72 20 69 74 20 68 61 73 20 6f 62 74 61  fter it has obta
f800: 69 6e 65 64 20 61 0a 20 20 2a 2a 20 53 48 41 52  ined a.  ** SHAR
f810: 45 44 20 6c 6f 63 6b 2e 20 41 20 50 45 4e 44 49  ED lock. A PENDI
f820: 4e 47 20 6c 6f 63 6b 20 69 73 20 69 6d 70 6c 65  NG lock is imple
f830: 6d 65 6e 74 65 64 20 62 79 20 6f 62 74 61 69 6e  mented by obtain
f840: 69 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b  ing a write-lock
f850: 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 27 70 65  .  ** on the 'pe
f860: 6e 64 69 6e 67 20 62 79 74 65 27 2e 20 54 68 69  nding byte'. Thi
f870: 73 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 6e  s ensures that n
f880: 6f 20 6e 65 77 20 53 48 41 52 45 44 20 6c 6f 63  o new SHARED loc
f890: 6b 73 20 63 61 6e 20 62 65 0a 20 20 2a 2a 20 6f  ks can be.  ** o
f8a0: 62 74 61 69 6e 65 64 2c 20 62 75 74 20 65 78 69  btained, but exi
f8b0: 73 74 69 6e 67 20 53 48 41 52 45 44 20 6c 6f 63  sting SHARED loc
f8c0: 6b 73 20 61 72 65 20 61 6c 6c 6f 77 65 64 20 74  ks are allowed t
f8d0: 6f 20 70 65 72 73 69 73 74 2e 20 41 20 70 72 6f  o persist. A pro
f8e0: 63 65 73 73 0a 20 20 2a 2a 20 64 6f 65 73 20 6e  cess.  ** does n
f8f0: 6f 74 20 68 61 76 65 20 74 6f 20 6f 62 74 61 69  ot have to obtai
f900: 6e 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  n a RESERVED loc
f910: 6b 20 6f 6e 20 74 68 65 20 77 61 79 20 74 6f 20  k on the way to 
f920: 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 2e 0a  a PENDING lock..
f930: 20 20 2a 2a 20 54 68 69 73 20 70 72 6f 70 65 72    ** This proper
f940: 74 79 20 69 73 20 75 73 65 64 20 62 79 20 74 68  ty is used by th
f950: 65 20 61 6c 67 6f 72 69 74 68 6d 20 66 6f 72 20  e algorithm for 
f960: 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 6a  rolling back a j
f970: 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20 2a 2a  ournal file.  **
f980: 20 61 66 74 65 72 20 61 20 63 72 61 73 68 2e 0a   after a crash..
f990: 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 45 58 43    **.  ** An EXC
f9a0: 4c 55 53 49 56 45 20 6c 6f 63 6b 2c 20 6f 62 74  LUSIVE lock, obt
f9b0: 61 69 6e 65 64 20 61 66 74 65 72 20 61 20 50 45  ained after a PE
f9c0: 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 68 65  NDING lock is he
f9d0: 6c 64 2c 20 69 73 0a 20 20 2a 2a 20 69 6d 70 6c  ld, is.  ** impl
f9e0: 65 6d 65 6e 74 65 64 20 62 79 20 6f 62 74 61 69  emented by obtai
f9f0: 6e 69 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f 63  ning a write-loc
fa00: 6b 20 6f 6e 20 74 68 65 20 65 6e 74 69 72 65 20  k on the entire 
fa10: 27 73 68 61 72 65 64 20 62 79 74 65 0a 20 20 2a  'shared byte.  *
fa20: 2a 20 72 61 6e 67 65 27 2e 20 53 69 6e 63 65 20  * range'. Since 
fa30: 61 6c 6c 20 6f 74 68 65 72 20 6c 6f 63 6b 73 20  all other locks 
fa40: 72 65 71 75 69 72 65 20 61 20 72 65 61 64 2d 6c  require a read-l
fa50: 6f 63 6b 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68  ock on one of th
fa60: 65 20 62 79 74 65 73 0a 20 20 2a 2a 20 77 69 74  e bytes.  ** wit
fa70: 68 69 6e 20 74 68 69 73 20 72 61 6e 67 65 2c 20  hin this range, 
fa80: 74 68 69 73 20 65 6e 73 75 72 65 73 20 74 68 61  this ensures tha
fa90: 74 20 6e 6f 20 6f 74 68 65 72 20 6c 6f 63 6b 73  t no other locks
faa0: 20 61 72 65 20 68 65 6c 64 20 6f 6e 20 74 68 65   are held on the
fab0: 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 20  .  ** database. 
fac0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 72  .  **.  ** The r
fad0: 65 61 73 6f 6e 20 61 20 73 69 6e 67 6c 65 20 62  eason a single b
fae0: 79 74 65 20 63 61 6e 6e 6f 74 20 62 65 20 75 73  yte cannot be us
faf0: 65 64 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68  ed instead of th
fb00: 65 20 27 73 68 61 72 65 64 20 62 79 74 65 0a 20  e 'shared byte. 
fb10: 20 2a 2a 20 72 61 6e 67 65 27 20 69 73 20 74 68   ** range' is th
fb20: 61 74 20 73 6f 6d 65 20 76 65 72 73 69 6f 6e 73  at some versions
fb30: 20 6f 66 20 77 69 6e 64 6f 77 73 20 64 6f 20 6e   of windows do n
fb40: 6f 74 20 73 75 70 70 6f 72 74 20 72 65 61 64 2d  ot support read-
fb50: 6c 6f 63 6b 73 2e 20 42 79 0a 20 20 2a 2a 20 6c  locks. By.  ** l
fb60: 6f 63 6b 69 6e 67 20 61 20 72 61 6e 64 6f 6d 20  ocking a random 
fb70: 62 79 74 65 20 66 72 6f 6d 20 61 20 72 61 6e 67  byte from a rang
fb80: 65 2c 20 63 6f 6e 63 75 72 72 65 6e 74 20 53 48  e, concurrent SH
fb90: 41 52 45 44 20 6c 6f 63 6b 73 20 6d 61 79 20 65  ARED locks may e
fba0: 78 69 73 74 0a 20 20 2a 2a 20 65 76 65 6e 20 69  xist.  ** even i
fbb0: 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 70 72  f the locking pr
fbc0: 69 6d 69 74 69 76 65 20 75 73 65 64 20 69 73 20  imitive used is 
fbd0: 61 6c 77 61 79 73 20 61 20 77 72 69 74 65 2d 6c  always a write-l
fbe0: 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20  ock..  */.  int 
fbf0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
fc00: 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
fc10: 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
fc20: 64 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e  d;.  unixInodeIn
fc30: 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a 20 20 73 74  fo *pInode;.  st
fc40: 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b  ruct flock lock;
fc50: 0a 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20  .  int tErrno = 
fc60: 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46  0;..  assert( pF
fc70: 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45  ile );.  OSTRACE
fc80: 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73  (("LOCK    %d %s
fc90: 20 77 61 73 20 25 73 28 25 73 2c 25 64 29 20 70   was %s(%s,%d) p
fca0: 69 64 3d 25 64 20 28 75 6e 69 78 29 5c 6e 22 2c  id=%d (unix)\n",
fcb0: 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20   pFile->h,.     
fcc0: 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c   azFileLock(eFil
fcd0: 65 4c 6f 63 6b 29 2c 20 61 7a 46 69 6c 65 4c 6f  eLock), azFileLo
fce0: 63 6b 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  ck(pFile->eFileL
fcf0: 6f 63 6b 29 2c 0a 20 20 20 20 20 20 61 7a 46 69  ock),.      azFi
fd00: 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2d 3e 70 49  leLock(pFile->pI
fd10: 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29  node->eFileLock)
fd20: 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d  , pFile->pInode-
fd30: 3e 6e 53 68 61 72 65 64 2c 0a 20 20 20 20 20 20  >nShared,.      
fd40: 6f 73 47 65 74 70 69 64 28 30 29 29 29 3b 0a 0a  osGetpid(0)));..
fd50: 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73    /* If there is
fd60: 20 61 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b 20   already a lock 
fd70: 6f 66 20 74 68 69 73 20 74 79 70 65 20 6f 72 20  of this type or 
fd80: 6d 6f 72 65 20 72 65 73 74 72 69 63 74 69 76 65  more restrictive
fd90: 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 75 6e 69   on the.  ** uni
fda0: 78 46 69 6c 65 2c 20 64 6f 20 6e 6f 74 68 69 6e  xFile, do nothin
fdb0: 67 2e 20 44 6f 6e 27 74 20 75 73 65 20 74 68 65  g. Don't use the
fdc0: 20 65 6e 64 5f 6c 6f 63 6b 3a 20 65 78 69 74 20   end_lock: exit 
fdd0: 70 61 74 68 2c 20 61 73 0a 20 20 2a 2a 20 75 6e  path, as.  ** un
fde0: 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 20 68  ixEnterMutex() h
fdf0: 61 73 6e 27 74 20 62 65 65 6e 20 63 61 6c 6c 65  asn't been calle
fe00: 64 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  d yet..  */.  if
fe10: 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ( pFile->eFileLo
fe20: 63 6b 3e 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b  ck>=eFileLock ){
fe30: 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4c  .    OSTRACE(("L
fe40: 4f 43 4b 20 20 20 20 25 64 20 25 73 20 6f 6b 20  OCK    %d %s ok 
fe50: 28 61 6c 72 65 61 64 79 20 68 65 6c 64 29 20 28  (already held) (
fe60: 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  unix)\n", pFile-
fe70: 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  >h,.            
fe80: 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65  azFileLock(eFile
fe90: 4c 6f 63 6b 29 29 29 3b 0a 20 20 20 20 72 65 74  Lock)));.    ret
fea0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
feb0: 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75   }..  /* Make su
fec0: 72 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 73  re the locking s
fed0: 65 71 75 65 6e 63 65 20 69 73 20 63 6f 72 72 65  equence is corre
fee0: 63 74 2e 0a 20 20 2a 2a 20 20 28 31 29 20 57 65  ct..  **  (1) We
fef0: 20 6e 65 76 65 72 20 6d 6f 76 65 20 66 72 6f 6d   never move from
ff00: 20 75 6e 6c 6f 63 6b 65 64 20 74 6f 20 61 6e 79   unlocked to any
ff10: 74 68 69 6e 67 20 68 69 67 68 65 72 20 74 68 61  thing higher tha
ff20: 6e 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 0a 20  n shared lock.. 
ff30: 20 2a 2a 20 20 28 32 29 20 53 51 4c 69 74 65 20   **  (2) SQLite 
ff40: 6e 65 76 65 72 20 65 78 70 6c 69 63 69 74 6c 79  never explicitly
ff50: 20 72 65 71 75 65 73 74 73 20 61 20 70 65 6e 64   requests a pend
ff60: 69 67 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28  ig lock..  **  (
ff70: 33 29 20 41 20 73 68 61 72 65 64 20 6c 6f 63 6b  3) A shared lock
ff80: 20 69 73 20 61 6c 77 61 79 73 20 68 65 6c 64 20   is always held 
ff90: 77 68 65 6e 20 61 20 72 65 73 65 72 76 65 20 6c  when a reserve l
ffa0: 6f 63 6b 20 69 73 20 72 65 71 75 65 73 74 65 64  ock is requested
ffb0: 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
ffc0: 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
ffd0: 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 65 46  k!=NO_LOCK || eF
ffe0: 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
fff0: 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  LOCK );.  assert
10000 28 20 65 46 69 6c 65 4c 6f 63 6b 21 3d 50 45 4e  ( eFileLock!=PEN
10010 44 49 4e 47 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61  DING_LOCK );.  a
10020 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b  ssert( eFileLock
10030 21 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  !=RESERVED_LOCK 
10040 7c 7c 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  || pFile->eFileL
10050 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
10060 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6d   );..  /* This m
10070 75 74 65 78 20 69 73 20 6e 65 65 64 65 64 20 62  utex is needed b
10080 65 63 61 75 73 65 20 70 46 69 6c 65 2d 3e 70 49  ecause pFile->pI
10090 6e 6f 64 65 20 69 73 20 73 68 61 72 65 64 20 61  node is shared a
100a0 63 72 6f 73 73 20 74 68 72 65 61 64 73 0a 20 20  cross threads.  
100b0 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75  */.  unixEnterMu
100c0 74 65 78 28 29 3b 0a 20 20 70 49 6e 6f 64 65 20  tex();.  pInode 
100d0 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b  = pFile->pInode;
100e0 0a 0a 20 20 2f 2a 20 49 66 20 73 6f 6d 65 20 74  ..  /* If some t
100f0 68 72 65 61 64 20 75 73 69 6e 67 20 74 68 69 73  hread using this
10100 20 50 49 44 20 68 61 73 20 61 20 6c 6f 63 6b 20   PID has a lock 
10110 76 69 61 20 61 20 64 69 66 66 65 72 65 6e 74 20  via a different 
10120 75 6e 69 78 46 69 6c 65 2a 0a 20 20 2a 2a 20 68  unixFile*.  ** h
10130 61 6e 64 6c 65 20 74 68 61 74 20 70 72 65 63 6c  andle that precl
10140 75 64 65 73 20 74 68 65 20 72 65 71 75 65 73 74  udes the request
10150 65 64 20 6c 6f 63 6b 2c 20 72 65 74 75 72 6e 20  ed lock, return 
10160 42 55 53 59 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  BUSY..  */.  if(
10170 20 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f   (pFile->eFileLo
10180 63 6b 21 3d 70 49 6e 6f 64 65 2d 3e 65 46 69 6c  ck!=pInode->eFil
10190 65 4c 6f 63 6b 20 26 26 20 0a 20 20 20 20 20 20  eLock && .      
101a0 20 20 20 20 28 70 49 6e 6f 64 65 2d 3e 65 46 69      (pInode->eFi
101b0 6c 65 4c 6f 63 6b 3e 3d 50 45 4e 44 49 4e 47 5f  leLock>=PENDING_
101c0 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63  LOCK || eFileLoc
101d0 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 29 29 0a  k>SHARED_LOCK)).
101e0 20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51    ){.    rc = SQ
101f0 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 67  LITE_BUSY;.    g
10200 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20  oto end_lock;.  
10210 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 20 53 48 41  }..  /* If a SHA
10220 52 45 44 20 6c 6f 63 6b 20 69 73 20 72 65 71 75  RED lock is requ
10230 65 73 74 65 64 2c 20 61 6e 64 20 73 6f 6d 65 20  ested, and some 
10240 74 68 72 65 61 64 20 75 73 69 6e 67 20 74 68 69  thread using thi
10250 73 20 50 49 44 20 61 6c 72 65 61 64 79 0a 20 20  s PID already.  
10260 2a 2a 20 68 61 73 20 61 20 53 48 41 52 45 44 20  ** has a SHARED 
10270 6f 72 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b  or RESERVED lock
10280 2c 20 74 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74  , then increment
10290 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
102a0 73 20 61 6e 64 0a 20 20 2a 2a 20 72 65 74 75 72  s and.  ** retur
102b0 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 20 20 2a  n SQLITE_OK..  *
102c0 2f 0a 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63  /.  if( eFileLoc
102d0 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26  k==SHARED_LOCK &
102e0 26 20 0a 20 20 20 20 20 20 28 70 49 6e 6f 64 65  & .      (pInode
102f0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41  ->eFileLock==SHA
10300 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f  RED_LOCK || pIno
10310 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52  de->eFileLock==R
10320 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 20 29 7b  ESERVED_LOCK) ){
10330 0a 20 20 20 20 61 73 73 65 72 74 28 20 65 46 69  .    assert( eFi
10340 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
10350 4f 43 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72  OCK );.    asser
10360 74 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  t( pFile->eFileL
10370 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  ock==0 );.    as
10380 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53  sert( pInode->nS
10390 68 61 72 65 64 3e 30 20 29 3b 0a 20 20 20 20 70  hared>0 );.    p
103a0 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
103b0 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20  = SHARED_LOCK;. 
103c0 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72     pInode->nShar
103d0 65 64 2b 2b 3b 0a 20 20 20 20 70 49 6e 6f 64 65  ed++;.    pInode
103e0 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 67  ->nLock++;.    g
103f0 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20  oto end_lock;.  
10400 7d 0a 0a 0a 20 20 2f 2a 20 41 20 50 45 4e 44 49  }...  /* A PENDI
10410 4e 47 20 6c 6f 63 6b 20 69 73 20 6e 65 65 64 65  NG lock is neede
10420 64 20 62 65 66 6f 72 65 20 61 63 71 75 69 72 69  d before acquiri
10430 6e 67 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b  ng a SHARED lock
10440 20 61 6e 64 20 62 65 66 6f 72 65 0a 20 20 2a 2a   and before.  **
10450 20 61 63 71 75 69 72 69 6e 67 20 61 6e 20 45 58   acquiring an EX
10460 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 46  CLUSIVE lock.  F
10470 6f 72 20 74 68 65 20 53 48 41 52 45 44 20 6c 6f  or the SHARED lo
10480 63 6b 2c 20 74 68 65 20 50 45 4e 44 49 4e 47 20  ck, the PENDING 
10490 77 69 6c 6c 0a 20 20 2a 2a 20 62 65 20 72 65 6c  will.  ** be rel
104a0 65 61 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 6c 6f  eased..  */.  lo
104b0 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 20  ck.l_len = 1L;. 
104c0 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d   lock.l_whence =
104d0 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 69 66 28   SEEK_SET;.  if(
104e0 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52   eFileLock==SHAR
104f0 45 44 5f 4c 4f 43 4b 20 0a 20 20 20 20 20 20 7c  ED_LOCK .      |
10500 7c 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58  | (eFileLock==EX
10510 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20  CLUSIVE_LOCK && 
10520 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
10530 3c 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 29 0a 20  <PENDING_LOCK). 
10540 20 29 7b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74   ){.    lock.l_t
10550 79 70 65 20 3d 20 28 65 46 69 6c 65 4c 6f 63 6b  ype = (eFileLock
10560 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 3f 46 5f  ==SHARED_LOCK?F_
10570 52 44 4c 43 4b 3a 46 5f 57 52 4c 43 4b 29 3b 0a  RDLCK:F_WRLCK);.
10580 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74      lock.l_start
10590 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b   = PENDING_BYTE;
105a0 0a 20 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c  .    if( unixFil
105b0 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f  eLock(pFile, &lo
105c0 63 6b 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20  ck, 0) ){.      
105d0 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
105e0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
105f0 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45  eErrorFromPosixE
10600 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c  rror(tErrno, SQL
10610 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b  ITE_IOERR_LOCK);
10620 0a 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f  .      if( IS_LO
10630 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a  CK_ERROR(rc) ){.
10640 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73          storeLas
10650 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45  tErrno(pFile, tE
10660 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 20  rrno);.      }. 
10670 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f       goto end_lo
10680 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a  ck;.    }.  }...
10690 20 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20    /* If control 
106a0 67 65 74 73 20 74 6f 20 74 68 69 73 20 70 6f 69  gets to this poi
106b0 6e 74 2c 20 74 68 65 6e 20 61 63 74 75 61 6c 6c  nt, then actuall
106c0 79 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 6d  y go ahead and m
106d0 61 6b 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69  ake.  ** operati
106e0 6e 67 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20  ng system calls 
106f0 66 6f 72 20 74 68 65 20 73 70 65 63 69 66 69 65  for the specifie
10700 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69  d lock..  */.  i
10710 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  f( eFileLock==SH
10720 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
10730 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d   assert( pInode-
10740 3e 6e 53 68 61 72 65 64 3d 3d 30 20 29 3b 0a 20  >nShared==0 );. 
10750 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64     assert( pInod
10760 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20  e->eFileLock==0 
10770 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  );.    assert( r
10780 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c==SQLITE_OK );.
10790 0a 20 20 20 20 2f 2a 20 4e 6f 77 20 67 65 74 20  .    /* Now get 
107a0 74 68 65 20 72 65 61 64 2d 6c 6f 63 6b 20 2a 2f  the read-lock */
107b0 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72  .    lock.l_star
107c0 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54  t = SHARED_FIRST
107d0 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e  ;.    lock.l_len
107e0 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a   = SHARED_SIZE;.
107f0 20 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65      if( unixFile
10800 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63  Lock(pFile, &loc
10810 6b 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 74  k, 0) ){.      t
10820 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
10830 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
10840 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
10850 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49  ror(tErrno, SQLI
10860 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a  TE_IOERR_LOCK);.
10870 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 72      }..    /* Dr
10880 6f 70 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  op the temporary
10890 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 2a 2f   PENDING lock */
108a0 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72  .    lock.l_star
108b0 74 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  t = PENDING_BYTE
108c0 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e  ;.    lock.l_len
108d0 20 3d 20 31 4c 3b 0a 20 20 20 20 6c 6f 63 6b 2e   = 1L;.    lock.
108e0 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b  l_type = F_UNLCK
108f0 3b 0a 20 20 20 20 69 66 28 20 75 6e 69 78 46 69  ;.    if( unixFi
10900 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c  leLock(pFile, &l
10910 6f 63 6b 2c 20 31 30 29 20 26 26 20 72 63 3d 3d  ock, 10) && rc==
10920 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
10930 20 20 20 2f 2a 20 54 68 69 73 20 63 6f 75 6c 64     /* This could
10940 20 68 61 70 70 65 6e 20 77 69 74 68 20 61 20 6e   happen with a n
10950 65 74 77 6f 72 6b 20 6d 6f 75 6e 74 20 2a 2f 0a  etwork mount */.
10960 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65        tErrno = e
10970 72 72 6e 6f 3b 0a 23 69 66 20 4f 53 4c 4f 43 4b  rrno;.#if OSLOCK
10980 49 4e 47 5f 43 48 45 43 4b 5f 42 55 53 59 5f 49  ING_CHECK_BUSY_I
10990 4f 45 52 52 0a 20 20 20 20 20 20 72 63 20 3d 20  OERR.      rc = 
109a0 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
109b0 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
109c0 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  , SQLITE_IOERR_U
109d0 4e 4c 4f 43 4b 29 3b 20 0a 23 65 6c 73 65 0a 20  NLOCK); .#else. 
109e0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
109f0 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 20 0a  _IOERR_UNLOCK; .
10a00 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 0a 20 20  #endif.    }..  
10a10 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
10a20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52    if( IS_LOCK_ER
10a30 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20  ROR(rc) ){.     
10a40 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e     storeLastErrn
10a50 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29  o(pFile, tErrno)
10a60 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
10a70 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20  goto end_lock;. 
10a80 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
10a90 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
10aa0 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a   = SHARED_LOCK;.
10ab0 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c        pInode->nL
10ac0 6f 63 6b 2b 2b 3b 0a 20 20 20 20 20 20 70 49 6e  ock++;.      pIn
10ad0 6f 64 65 2d 3e 6e 53 68 61 72 65 64 20 3d 20 31  ode->nShared = 1
10ae0 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  ;.    }.  }else 
10af0 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45  if( eFileLock==E
10b00 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 26 26  XCLUSIVE_LOCK &&
10b10 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
10b20 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20 57 65 20  >1 ){.    /* We 
10b30 61 72 65 20 74 72 79 69 6e 67 20 66 6f 72 20 61  are trying for a
10b40 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
10b50 20 62 75 74 20 61 6e 6f 74 68 65 72 20 74 68 72   but another thr
10b60 65 61 64 20 69 6e 20 74 68 69 73 0a 20 20 20 20  ead in this.    
10b70 2a 2a 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20  ** same process 
10b80 69 73 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67  is still holding
10b90 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20   a shared lock. 
10ba0 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  */.    rc = SQLI
10bb0 54 45 5f 42 55 53 59 3b 0a 20 20 7d 65 6c 73 65  TE_BUSY;.  }else
10bc0 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71  {.    /* The req
10bd0 75 65 73 74 20 77 61 73 20 66 6f 72 20 61 20 52  uest was for a R
10be0 45 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55  ESERVED or EXCLU
10bf0 53 49 56 45 20 6c 6f 63 6b 2e 20 20 49 74 20 69  SIVE lock.  It i
10c00 73 0a 20 20 20 20 2a 2a 20 61 73 73 75 6d 65 64  s.    ** assumed
10c10 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20 61   that there is a
10c20 20 53 48 41 52 45 44 20 6f 72 20 67 72 65 61 74   SHARED or great
10c30 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66  er lock on the f
10c40 69 6c 65 0a 20 20 20 20 2a 2a 20 61 6c 72 65 61  ile.    ** alrea
10c50 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  dy..    */.    a
10c60 73 73 65 72 74 28 20 30 21 3d 70 46 69 6c 65 2d  ssert( 0!=pFile-
10c70 3e 65 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a 20 20  >eFileLock );.  
10c80 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20    lock.l_type = 
10c90 46 5f 57 52 4c 43 4b 3b 0a 0a 20 20 20 20 61 73  F_WRLCK;..    as
10ca0 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d  sert( eFileLock=
10cb0 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c  =RESERVED_LOCK |
10cc0 7c 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43  | eFileLock==EXC
10cd0 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20  LUSIVE_LOCK );. 
10ce0 20 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b     if( eFileLock
10cf0 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  ==RESERVED_LOCK 
10d00 29 7b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  ){.      lock.l_
10d10 73 74 61 72 74 20 3d 20 52 45 53 45 52 56 45 44  start = RESERVED
10d20 5f 42 59 54 45 3b 0a 20 20 20 20 20 20 6c 6f 63  _BYTE;.      loc
10d30 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 20 20  k.l_len = 1L;.  
10d40 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6c    }else{.      l
10d50 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48  ock.l_start = SH
10d60 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20  ARED_FIRST;.    
10d70 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53    lock.l_len = S
10d80 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20  HARED_SIZE;.    
10d90 7d 0a 0a 20 20 20 20 69 66 28 20 75 6e 69 78 46  }..    if( unixF
10da0 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26  ileLock(pFile, &
10db0 6c 6f 63 6b 2c 20 30 29 20 29 7b 0a 20 20 20 20  lock, 0) ){.    
10dc0 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f    tErrno = errno
10dd0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
10de0 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69  iteErrorFromPosi
10df0 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53  xError(tErrno, S
10e00 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b  QLITE_IOERR_LOCK
10e10 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
10e20 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a  =SQLITE_BUSY ){.
10e30 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73          storeLas
10e40 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45  tErrno(pFile, tE
10e50 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 20  rrno);.      }. 
10e60 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 0a 23 69 66     }.  }.  ..#if
10e70 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
10e80 0a 20 20 2f 2a 20 53 65 74 20 75 70 20 74 68 65  .  /* Set up the
10e90 20 74 72 61 6e 73 61 63 74 69 6f 6e 2d 63 6f 75   transaction-cou
10ea0 6e 74 65 72 20 63 68 61 6e 67 65 20 63 68 65 63  nter change chec
10eb0 6b 69 6e 67 20 66 6c 61 67 73 20 77 68 65 6e 0a  king flags when.
10ec0 20 20 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 69    ** transitioni
10ed0 6e 67 20 66 72 6f 6d 20 61 20 53 48 41 52 45 44  ng from a SHARED
10ee0 20 74 6f 20 61 20 52 45 53 45 52 56 45 44 20 6c   to a RESERVED l
10ef0 6f 63 6b 2e 20 20 54 68 65 20 63 68 61 6e 67 65  ock.  The change
10f00 0a 20 20 2a 2a 20 66 72 6f 6d 20 53 48 41 52 45  .  ** from SHARE
10f10 44 20 74 6f 20 52 45 53 45 52 56 45 44 20 6d 61  D to RESERVED ma
10f20 72 6b 73 20 74 68 65 20 62 65 67 69 6e 6e 69 6e  rks the beginnin
10f30 67 20 6f 66 20 61 20 6e 6f 72 6d 61 6c 0a 20 20  g of a normal.  
10f40 2a 2a 20 77 72 69 74 65 20 6f 70 65 72 61 74 69  ** write operati
10f50 6f 6e 20 28 6e 6f 74 20 61 20 68 6f 74 20 6a 6f  on (not a hot jo
10f60 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 29 2e  urnal rollback).
10f70 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d  .  */.  if( rc==
10f80 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 26 26 20  SQLITE_OK.   && 
10f90 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
10fa0 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 20 20  <=SHARED_LOCK.  
10fb0 20 26 26 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52   && eFileLock==R
10fc0 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 20 20 29  ESERVED_LOCK.  )
10fd0 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 74 72 61  {.    pFile->tra
10fe0 6e 73 43 6e 74 72 43 68 6e 67 20 3d 20 30 3b 0a  nsCntrChng = 0;.
10ff0 20 20 20 20 70 46 69 6c 65 2d 3e 64 62 55 70 64      pFile->dbUpd
11000 61 74 65 20 3d 20 30 3b 0a 20 20 20 20 70 46 69  ate = 0;.    pFi
11010 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74  le->inNormalWrit
11020 65 20 3d 20 31 3b 0a 20 20 7d 0a 23 65 6e 64 69  e = 1;.  }.#endi
11030 66 0a 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  f...  if( rc==SQ
11040 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
11050 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
11060 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20  = eFileLock;.   
11070 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f   pInode->eFileLo
11080 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a  ck = eFileLock;.
11090 20 20 7d 65 6c 73 65 20 69 66 28 20 65 46 69 6c    }else if( eFil
110a0 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
110b0 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46 69  _LOCK ){.    pFi
110c0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
110d0 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20  PENDING_LOCK;.  
110e0 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c    pInode->eFileL
110f0 6f 63 6b 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f  ock = PENDING_LO
11100 43 4b 3b 0a 20 20 7d 0a 0a 65 6e 64 5f 6c 6f 63  CK;.  }..end_loc
11110 6b 3a 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75  k:.  unixLeaveMu
11120 74 65 78 28 29 3b 0a 20 20 4f 53 54 52 41 43 45  tex();.  OSTRACE
11130 28 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73  (("LOCK    %d %s
11140 20 25 73 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70   %s (unix)\n", p
11150 46 69 6c 65 2d 3e 68 2c 20 61 7a 46 69 6c 65 4c  File->h, azFileL
11160 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20  ock(eFileLock), 
11170 0a 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54  .      rc==SQLIT
11180 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66  E_OK ? "ok" : "f
11190 61 69 6c 65 64 22 29 29 3b 0a 20 20 72 65 74 75  ailed"));.  retu
111a0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
111b0 41 64 64 20 74 68 65 20 66 69 6c 65 20 64 65 73  Add the file des
111c0 63 72 69 70 74 6f 72 20 75 73 65 64 20 62 79 20  criptor used by 
111d0 66 69 6c 65 20 68 61 6e 64 6c 65 20 70 46 69 6c  file handle pFil
111e0 65 20 74 6f 20 74 68 65 20 63 6f 72 72 65 73 70  e to the corresp
111f0 6f 6e 64 69 6e 67 0a 2a 2a 20 70 55 6e 75 73 65  onding.** pUnuse
11200 64 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69  d list..*/.stati
11210 63 20 76 6f 69 64 20 73 65 74 50 65 6e 64 69 6e  c void setPendin
11220 67 46 64 28 75 6e 69 78 46 69 6c 65 20 2a 70 46  gFd(unixFile *pF
11230 69 6c 65 29 7b 0a 20 20 75 6e 69 78 49 6e 6f 64  ile){.  unixInod
11240 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20  eInfo *pInode = 
11250 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20  pFile->pInode;. 
11260 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70   UnixUnusedFd *p
11270 20 3d 20 70 46 69 6c 65 2d 3e 70 55 6e 75 73 65   = pFile->pUnuse
11280 64 3b 0a 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20  d;.  p->pNext = 
11290 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 3b  pInode->pUnused;
112a0 0a 20 20 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73  .  pInode->pUnus
112b0 65 64 20 3d 20 70 3b 0a 20 20 70 46 69 6c 65 2d  ed = p;.  pFile-
112c0 3e 68 20 3d 20 2d 31 3b 0a 20 20 70 46 69 6c 65  >h = -1;.  pFile
112d0 2d 3e 70 55 6e 75 73 65 64 20 3d 20 30 3b 0a 7d  ->pUnused = 0;.}
112e0 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68  ../*.** Lower th
112f0 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
11300 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  on file descript
11310 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c  or pFile to eFil
11320 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63  eLock.  eFileLoc
11330 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74  k.** must be eit
11340 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53  her NO_LOCK or S
11350 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a  HARED_LOCK..**.*
11360 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67  * If the locking
11370 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69   level of the fi
11380 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73  le descriptor is
11390 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62   already at or b
113a0 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75  elow.** the requ
113b0 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65  ested locking le
113c0 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  vel, this routin
113d0 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  e is a no-op..**
113e0 20 0a 2a 2a 20 49 66 20 68 61 6e 64 6c 65 4e 46   .** If handleNF
113f0 53 55 6e 6c 6f 63 6b 20 69 73 20 74 72 75 65 2c  SUnlock is true,
11400 20 74 68 65 6e 20 6f 6e 20 64 6f 77 6e 67 72 61   then on downgra
11410 64 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56  ding an EXCLUSIV
11420 45 5f 4c 4f 43 4b 20 74 6f 20 53 48 41 52 45 44  E_LOCK to SHARED
11430 0a 2a 2a 20 74 68 65 20 62 79 74 65 20 72 61 6e  .** the byte ran
11440 67 65 20 69 73 20 64 69 76 69 64 65 64 20 69 6e  ge is divided in
11450 74 6f 20 32 20 70 61 72 74 73 20 61 6e 64 20 74  to 2 parts and t
11460 68 65 20 66 69 72 73 74 20 70 61 72 74 20 69 73  he first part is
11470 20 75 6e 6c 6f 63 6b 65 64 20 74 68 65 6e 0a 2a   unlocked then.*
11480 2a 20 73 65 74 20 74 6f 20 61 20 72 65 61 64 20  * set to a read 
11490 6c 6f 63 6b 2c 20 74 68 65 6e 20 74 68 65 20 6f  lock, then the o
114a0 74 68 65 72 20 70 61 72 74 20 69 73 20 73 69 6d  ther part is sim
114b0 70 6c 79 20 75 6e 6c 6f 63 6b 65 64 2e 20 20 54  ply unlocked.  T
114c0 68 69 73 20 77 6f 72 6b 73 20 0a 2a 2a 20 61 72  his works .** ar
114d0 6f 75 6e 64 20 61 20 62 75 67 20 69 6e 20 42 53  ound a bug in BS
114e0 44 20 4e 46 53 20 6c 6f 63 6b 64 20 28 61 6c 73  D NFS lockd (als
114f0 6f 20 73 65 65 6e 20 6f 6e 20 4d 61 63 4f 53 58  o seen on MacOSX
11500 20 31 30 2e 33 2b 29 20 74 68 61 74 20 66 61 69   10.3+) that fai
11510 6c 73 20 74 6f 20 0a 2a 2a 20 72 65 6d 6f 76 65  ls to .** remove
11520 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20   the write lock 
11530 6f 6e 20 61 20 72 65 67 69 6f 6e 20 77 68 65 6e  on a region when
11540 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 69 73 20   a read lock is 
11550 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  set..*/.static i
11560 6e 74 20 70 6f 73 69 78 55 6e 6c 6f 63 6b 28 73  nt posixUnlock(s
11570 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
11580 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 2c 20   int eFileLock, 
11590 69 6e 74 20 68 61 6e 64 6c 65 4e 46 53 55 6e 6c  int handleNFSUnl
115a0 6f 63 6b 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65  ock){.  unixFile
115b0 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
115c0 69 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69 78 49  ile*)id;.  unixI
115d0 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65  nodeInfo *pInode
115e0 3b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b  ;.  struct flock
115f0 20 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20 72 63 20   lock;.  int rc 
11600 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
11610 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
11620 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4c  .  OSTRACE(("UNL
11630 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73 20 25  OCK  %d %d was %
11640 64 28 25 64 2c 25 64 29 20 70 69 64 3d 25 64 20  d(%d,%d) pid=%d 
11650 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65  (unix)\n", pFile
11660 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a  ->h, eFileLock,.
11670 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69        pFile->eFi
11680 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e 70  leLock, pFile->p
11690 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
116a0 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d  , pFile->pInode-
116b0 3e 6e 53 68 61 72 65 64 2c 0a 20 20 20 20 20 20  >nShared,.      
116c0 6f 73 47 65 74 70 69 64 28 30 29 29 29 3b 0a 0a  osGetpid(0)));..
116d0 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c    assert( eFileL
116e0 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock<=SHARED_LOCK
116f0 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   );.  if( pFile-
11700 3e 65 46 69 6c 65 4c 6f 63 6b 3c 3d 65 46 69 6c  >eFileLock<=eFil
11710 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65 74  eLock ){.    ret
11720 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
11730 20 7d 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75   }.  unixEnterMu
11740 74 65 78 28 29 3b 0a 20 20 70 49 6e 6f 64 65 20  tex();.  pInode 
11750 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b  = pFile->pInode;
11760 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64  .  assert( pInod
11770 65 2d 3e 6e 53 68 61 72 65 64 21 3d 30 20 29 3b  e->nShared!=0 );
11780 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46  .  if( pFile->eF
11790 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c  ileLock>SHARED_L
117a0 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72  OCK ){.    asser
117b0 74 28 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65  t( pInode->eFile
117c0 4c 6f 63 6b 3d 3d 70 46 69 6c 65 2d 3e 65 46 69  Lock==pFile->eFi
117d0 6c 65 4c 6f 63 6b 20 29 3b 0a 0a 23 69 66 64 65  leLock );..#ifde
117e0 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
117f0 20 20 20 2f 2a 20 57 68 65 6e 20 72 65 64 75 63     /* When reduc
11800 69 6e 67 20 61 20 6c 6f 63 6b 20 73 75 63 68 20  ing a lock such 
11810 74 68 61 74 20 6f 74 68 65 72 20 70 72 6f 63 65  that other proce
11820 73 73 65 73 20 63 61 6e 20 73 74 61 72 74 0a 20  sses can start. 
11830 20 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 74 68     ** reading th
11840 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
11850 61 67 61 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65  again, make sure
11860 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 2a 2a   that the.    **
11870 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
11880 6e 74 65 72 20 77 61 73 20 75 70 64 61 74 65 64  nter was updated
11890 20 69 66 20 61 6e 79 20 70 61 72 74 20 6f 66 20   if any part of 
118a0 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20  the database.   
118b0 20 2a 2a 20 66 69 6c 65 20 63 68 61 6e 67 65 64   ** file changed
118c0 2e 20 20 49 66 20 74 68 65 20 74 72 61 6e 73 61  .  If the transa
118d0 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 69 73  ction counter is
118e0 20 6e 6f 74 20 75 70 64 61 74 65 64 2c 0a 20 20   not updated,.  
118f0 20 20 2a 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65    ** other conne
11900 63 74 69 6f 6e 73 20 74 6f 20 74 68 65 20 73 61  ctions to the sa
11910 6d 65 20 66 69 6c 65 20 6d 69 67 68 74 20 6e 6f  me file might no
11920 74 20 72 65 61 6c 69 7a 65 20 74 68 61 74 0a 20  t realize that. 
11930 20 20 20 2a 2a 20 74 68 65 20 66 69 6c 65 20 68     ** the file h
11940 61 73 20 63 68 61 6e 67 65 64 20 61 6e 64 20 68  as changed and h
11950 65 6e 63 65 20 6d 69 67 68 74 20 6e 6f 74 20 6b  ence might not k
11960 6e 6f 77 20 74 6f 20 66 6c 75 73 68 20 74 68 65  now to flush the
11970 69 72 0a 20 20 20 20 2a 2a 20 63 61 63 68 65 2e  ir.    ** cache.
11980 20 20 54 68 65 20 75 73 65 20 6f 66 20 61 20 73    The use of a s
11990 74 61 6c 65 20 63 61 63 68 65 20 63 61 6e 20 6c  tale cache can l
119a0 65 61 64 20 74 6f 20 64 61 74 61 62 61 73 65 20  ead to database 
119b0 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20  corruption..    
119c0 2a 2f 0a 20 20 20 20 70 46 69 6c 65 2d 3e 69 6e  */.    pFile->in
119d0 4e 6f 72 6d 61 6c 57 72 69 74 65 20 3d 20 30 3b  NormalWrite = 0;
119e0 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
119f0 64 6f 77 6e 67 72 61 64 69 6e 67 20 74 6f 20 61  downgrading to a
11a00 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20   shared lock on 
11a10 4e 46 53 20 69 6e 76 6f 6c 76 65 73 20 63 6c 65  NFS involves cle
11a20 61 72 69 6e 67 20 74 68 65 20 77 72 69 74 65 20  aring the write 
11a30 6c 6f 63 6b 0a 20 20 20 20 2a 2a 20 62 65 66 6f  lock.    ** befo
11a40 72 65 20 65 73 74 61 62 6c 69 73 68 69 6e 67 20  re establishing 
11a50 74 68 65 20 72 65 61 64 6c 6f 63 6b 20 2d 20 74  the readlock - t
11a60 6f 20 61 76 6f 69 64 20 61 20 72 61 63 65 20 63  o avoid a race c
11a70 6f 6e 64 69 74 69 6f 6e 20 77 65 20 64 6f 77 6e  ondition we down
11a80 67 72 61 64 65 0a 20 20 20 20 2a 2a 20 74 68 65  grade.    ** the
11a90 20 6c 6f 63 6b 20 69 6e 20 32 20 62 6c 6f 63 6b   lock in 2 block
11aa0 73 2c 20 73 6f 20 74 68 61 74 20 70 61 72 74 20  s, so that part 
11ab0 6f 66 20 74 68 65 20 72 61 6e 67 65 20 77 69 6c  of the range wil
11ac0 6c 20 62 65 20 63 6f 76 65 72 65 64 20 62 79 20  l be covered by 
11ad0 61 20 0a 20 20 20 20 2a 2a 20 77 72 69 74 65 20  a .    ** write 
11ae0 6c 6f 63 6b 20 75 6e 74 69 6c 20 74 68 65 20 72  lock until the r
11af0 65 73 74 20 69 73 20 63 6f 76 65 72 65 64 20 62  est is covered b
11b00 79 20 61 20 72 65 61 64 20 6c 6f 63 6b 3a 0a 20  y a read lock:. 
11b10 20 20 20 2a 2a 20 20 31 3a 20 20 20 5b 57 57 57     **  1:   [WWW
11b20 57 57 5d 0a 20 20 20 20 2a 2a 20 20 32 3a 20 20  WW].    **  2:  
11b30 20 5b 2e 2e 2e 2e 57 5d 0a 20 20 20 20 2a 2a 20   [....W].    ** 
11b40 20 33 3a 20 20 20 5b 52 52 52 52 57 5d 0a 20 20   3:   [RRRRW].  
11b50 20 20 2a 2a 20 20 34 3a 20 20 20 5b 52 52 52 52    **  4:   [RRRR
11b60 2e 5d 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  .].    */.    if
11b70 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41  ( eFileLock==SHA
11b80 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 23 69 66 20  RED_LOCK ){.#if 
11b90 21 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45  !defined(__APPLE
11ba0 5f 5f 29 20 7c 7c 20 21 53 51 4c 49 54 45 5f 45  __) || !SQLITE_E
11bb0 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
11bc0 59 4c 45 0a 20 20 20 20 20 20 28 76 6f 69 64 29  YLE.      (void)
11bd0 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b 3b  handleNFSUnlock;
11be0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 68  .      assert( h
11bf0 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b 3d 3d  andleNFSUnlock==
11c00 30 20 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  0 );.#endif.#if 
11c10 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
11c20 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41  _) && SQLITE_ENA
11c30 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
11c40 45 0a 20 20 20 20 20 20 69 66 28 20 68 61 6e 64  E.      if( hand
11c50 6c 65 4e 46 53 55 6e 6c 6f 63 6b 20 29 7b 0a 20  leNFSUnlock ){. 
11c60 20 20 20 20 20 20 20 69 6e 74 20 74 45 72 72 6e         int tErrn
11c70 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o;              
11c80 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65 20 66   /* Error code f
11c90 72 6f 6d 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  rom system call 
11ca0 65 72 72 6f 72 73 20 2a 2f 0a 20 20 20 20 20 20  errors */.      
11cb0 20 20 6f 66 66 5f 74 20 64 69 76 53 69 7a 65 20    off_t divSize 
11cc0 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 20 2d 20  = SHARED_SIZE - 
11cd0 31 3b 0a 20 20 20 20 20 20 20 20 0a 20 20 20 20  1;.        .    
11ce0 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20      lock.l_type 
11cf0 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 20  = F_UNLCK;.     
11d00 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65     lock.l_whence
11d10 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20   = SEEK_SET;.   
11d20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72       lock.l_star
11d30 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54  t = SHARED_FIRST
11d40 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  ;.        lock.l
11d50 5f 6c 65 6e 20 3d 20 64 69 76 53 69 7a 65 3b 0a  _len = divSize;.
11d60 20 20 20 20 20 20 20 20 69 66 28 20 75 6e 69 78          if( unix
11d70 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20  FileLock(pFile, 
11d80 26 6c 6f 63 6b 2c 20 31 30 29 3d 3d 28 2d 31 29  &lock, 10)==(-1)
11d90 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74 45   ){.          tE
11da0 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 23 69  rrno = errno;.#i
11db0 66 20 4f 53 4c 4f 43 4b 49 4e 47 5f 43 48 45 43  f OSLOCKING_CHEC
11dc0 4b 5f 42 55 53 59 5f 49 4f 45 52 52 0a 20 20 20  K_BUSY_IOERR.   
11dd0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
11de0 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78  teErrorFromPosix
11df0 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51  Error(tErrno, SQ
11e00 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43  LITE_IOERR_UNLOC
11e10 4b 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20  K);.#else.      
11e20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
11e30 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 23 65  IOERR_UNLOCK;.#e
11e40 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20 20 69  ndif.          i
11e50 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
11e60 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20  (rc) ){.        
11e70 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72      storeLastErr
11e80 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f  no(pFile, tErrno
11e90 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
11ea0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
11eb0 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20  d_unlock;.      
11ec0 20 20 7d 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b    }.        lock
11ed0 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c 43  .l_type = F_RDLC
11ee0 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e  K;.        lock.
11ef0 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f  l_whence = SEEK_
11f00 53 45 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63  SET;.        loc
11f10 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52  k.l_start = SHAR
11f20 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20  ED_FIRST;.      
11f30 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 64    lock.l_len = d
11f40 69 76 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20  ivSize;.        
11f50 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b  if( unixFileLock
11f60 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 2c 20 31  (pFile, &lock, 1
11f70 30 29 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20  0)==(-1) ){.    
11f80 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65        tErrno = e
11f90 72 72 6e 6f 3b 0a 23 69 66 20 4f 53 4c 4f 43 4b  rrno;.#if OSLOCK
11fa0 49 4e 47 5f 43 48 45 43 4b 5f 42 55 53 59 5f 49  ING_CHECK_BUSY_I
11fb0 4f 45 52 52 0a 20 20 20 20 20 20 20 20 20 20 72  OERR.          r
11fc0 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46  c = sqliteErrorF
11fd0 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45  romPosixError(tE
11fe0 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45  rrno, SQLITE_IOE
11ff0 52 52 5f 52 44 4c 4f 43 4b 29 3b 0a 23 65 6c 73  RR_RDLOCK);.#els
12000 65 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  e.          rc =
12010 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e   SQLITE_IOERR_UN
12020 4c 4f 43 4b 3b 0a 23 65 6e 64 69 66 0a 20 20 20  LOCK;.#endif.   
12030 20 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f         if( IS_LO
12040 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a  CK_ERROR(rc) ){.
12050 20 20 20 20 20 20 20 20 20 20 20 20 73 74 6f 72              stor
12060 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65  eLastErrno(pFile
12070 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20  , tErrno);.     
12080 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
12090 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b   goto end_unlock
120a0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
120b0 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20      lock.l_type 
120c0 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 20  = F_UNLCK;.     
120d0 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65     lock.l_whence
120e0 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20   = SEEK_SET;.   
120f0 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72       lock.l_star
12100 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54  t = SHARED_FIRST
12110 2b 64 69 76 53 69 7a 65 3b 0a 20 20 20 20 20 20  +divSize;.      
12120 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53    lock.l_len = S
12130 48 41 52 45 44 5f 53 49 5a 45 2d 64 69 76 53 69  HARED_SIZE-divSi
12140 7a 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ze;.        if( 
12150 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69  unixFileLock(pFi
12160 6c 65 2c 20 26 6c 6f 63 6b 2c 20 31 30 29 3d 3d  le, &lock, 10)==
12170 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20  (-1) ){.        
12180 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f    tErrno = errno
12190 3b 0a 23 69 66 20 4f 53 4c 4f 43 4b 49 4e 47 5f  ;.#if OSLOCKING_
121a0 43 48 45 43 4b 5f 42 55 53 59 5f 49 4f 45 52 52  CHECK_BUSY_IOERR
121b0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
121c0 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
121d0 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
121e0 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  , SQLITE_IOERR_U
121f0 4e 4c 4f 43 4b 29 3b 0a 23 65 6c 73 65 0a 20 20  NLOCK);.#else.  
12200 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
12210 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
12220 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20  ;.#endif.       
12230 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
12240 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20  RROR(rc) ){.    
12250 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73          storeLas
12260 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45  tErrno(pFile, tE
12270 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20  rrno);.         
12280 20 7d 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74   }.          got
12290 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20  o end_unlock;.  
122a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
122b0 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65  lse.#endif /* de
122c0 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
122d0 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
122e0 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
122f0 2a 2f 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20  */.      {.     
12300 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d     lock.l_type =
12310 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 20 20 20 20   F_RDLCK;.      
12320 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20    lock.l_whence 
12330 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20  = SEEK_SET;.    
12340 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74      lock.l_start
12350 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b   = SHARED_FIRST;
12360 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  .        lock.l_
12370 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a  len = SHARED_SIZ
12380 45 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 75  E;.        if( u
12390 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c  nixFileLock(pFil
123a0 65 2c 20 26 6c 6f 63 6b 2c 20 31 30 29 20 29 7b  e, &lock, 10) ){
123b0 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 74  .          int t
123c0 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 23  Errno = errno;.#
123d0 69 66 20 4f 53 4c 4f 43 4b 49 4e 47 5f 43 48 45  if OSLOCKING_CHE
123e0 43 4b 5f 42 55 53 59 5f 49 4f 45 52 52 0a 20 20  CK_BUSY_IOERR.  
123f0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
12400 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69  iteErrorFromPosi
12410 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53  xError(tErrno, S
12420 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f  QLITE_IOERR_RDLO
12430 43 4b 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20  CK);.#else.     
12440 20 20 20 20 20 2f 2a 20 49 6e 20 74 68 65 6f 72       /* In theor
12450 79 2c 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 75  y, the call to u
12460 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 29 20 63 61  nixFileLock() ca
12470 6e 6e 6f 74 20 66 61 69 6c 20 62 65 63 61 75 73  nnot fail becaus
12480 65 20 61 6e 6f 74 68 65 72 0a 20 20 20 20 20 20  e another.      
12490 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 69      ** process i
124a0 73 20 68 6f 6c 64 69 6e 67 20 61 6e 20 69 6e 63  s holding an inc
124b0 6f 6d 70 61 74 69 62 6c 65 20 6c 6f 63 6b 2e 20  ompatible lock. 
124c0 49 66 20 69 74 20 64 6f 65 73 2c 20 74 68 69 73  If it does, this
124d0 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69   .          ** i
124e0 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 74 68  ndicates that th
124f0 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  e other process 
12500 69 73 20 6e 6f 74 20 66 6f 6c 6c 6f 77 69 6e 67  is not following
12510 20 74 68 65 20 6c 6f 63 6b 69 6e 67 0a 20 20 20   the locking.   
12520 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 74 6f 63         ** protoc
12530 6f 6c 2e 20 49 66 20 74 68 69 73 20 68 61 70 70  ol. If this happ
12540 65 6e 73 2c 20 72 65 74 75 72 6e 20 53 51 4c 49  ens, return SQLI
12550 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 2e  TE_IOERR_RDLOCK.
12560 20 52 65 74 75 72 6e 69 6e 67 0a 20 20 20 20 20   Returning.     
12570 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 42       ** SQLITE_B
12580 55 53 59 20 77 6f 75 6c 64 20 63 6f 6e 66 75 73  USY would confus
12590 65 20 74 68 65 20 75 70 70 65 72 20 6c 61 79 65  e the upper laye
125a0 72 20 28 69 6e 20 70 72 61 63 74 69 63 65 20 69  r (in practice i
125b0 74 20 63 61 75 73 65 73 20 0a 20 20 20 20 20 20  t causes .      
125c0 20 20 20 20 2a 2a 20 61 6e 20 61 73 73 65 72 74      ** an assert
125d0 20 74 6f 20 66 61 69 6c 29 2e 20 2a 2f 20 0a 20   to fail). */ . 
125e0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
125f0 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43  LITE_IOERR_RDLOC
12600 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 73 74 6f  K;.          sto
12610 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c  reLastErrno(pFil
12620 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 23 65 6e 64  e, tErrno);.#end
12630 69 66 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  if.          if(
12640 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72   IS_LOCK_ERROR(r
12650 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  c) ){.          
12660 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f    storeLastErrno
12670 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b  (pFile, tErrno);
12680 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
12690 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
126a0 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20  unlock;.        
126b0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
126c0 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20      lock.l_type 
126d0 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 6c  = F_UNLCK;.    l
126e0 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53  ock.l_whence = S
126f0 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 6c 6f 63  EEK_SET;.    loc
12700 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50 45 4e 44  k.l_start = PEND
12710 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20 20 6c 6f  ING_BYTE;.    lo
12720 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 32 4c 3b 20 20  ck.l_len = 2L;  
12730 61 73 73 65 72 74 28 20 50 45 4e 44 49 4e 47 5f  assert( PENDING_
12740 42 59 54 45 2b 31 3d 3d 52 45 53 45 52 56 45 44  BYTE+1==RESERVED
12750 5f 42 59 54 45 20 29 3b 0a 20 20 20 20 69 66 28  _BYTE );.    if(
12760 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46   unixFileLock(pF
12770 69 6c 65 2c 20 26 6c 6f 63 6b 2c 20 31 30 29 3d  ile, &lock, 10)=
12780 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 49 6e 6f  =0 ){.      pIno
12790 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  de->eFileLock = 
127a0 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20  SHARED_LOCK;.   
127b0 20 7d 65 6c 73 65 7b 0a 23 69 66 20 4f 53 4c 4f   }else{.#if OSLO
127c0 43 4b 49 4e 47 5f 43 48 45 43 4b 5f 42 55 53 59  CKING_CHECK_BUSY
127d0 5f 49 4f 45 52 52 0a 20 20 20 20 20 20 74 45 72  _IOERR.      tEr
127e0 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
127f0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72     rc = sqliteEr
12800 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f  rorFromPosixErro
12810 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45  r(tErrno, SQLITE
12820 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a  _IOERR_UNLOCK);.
12830 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43        if( IS_LOC
12840 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20  K_ERROR(rc) ){. 
12850 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74         storeLast
12860 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72  Errno(pFile, tEr
12870 72 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  rno);.      }.#e
12880 6c 73 65 0a 20 20 20 20 20 20 72 63 20 3d 20 53  lse.      rc = S
12890 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
128a0 43 4b 3b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c  CK;.      storeL
128b0 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20  astErrno(pFile, 
128c0 65 72 72 6e 6f 29 3b 0a 23 65 6e 64 69 66 0a 20  errno);.#endif. 
128d0 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e       goto end_un
128e0 6c 6f 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  lock;.    }.  }.
128f0 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d    if( eFileLock=
12900 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  =NO_LOCK ){.    
12910 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65  /* Decrement the
12920 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 63 6f 75   shared lock cou
12930 6e 74 65 72 2e 20 20 52 65 6c 65 61 73 65 20 74  nter.  Release t
12940 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20 61 6e  he lock using an
12950 0a 20 20 20 20 2a 2a 20 4f 53 20 63 61 6c 6c 20  .    ** OS call 
12960 6f 6e 6c 79 20 77 68 65 6e 20 61 6c 6c 20 74 68  only when all th
12970 72 65 61 64 73 20 69 6e 20 74 68 69 73 20 73 61  reads in this sa
12980 6d 65 20 70 72 6f 63 65 73 73 20 68 61 76 65 20  me process have 
12990 72 65 6c 65 61 73 65 64 0a 20 20 20 20 2a 2a 20  released.    ** 
129a0 74 68 65 20 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2f  the lock..    */
129b0 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68  .    pInode->nSh
129c0 61 72 65 64 2d 2d 3b 0a 20 20 20 20 69 66 28 20  ared--;.    if( 
129d0 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3d  pInode->nShared=
129e0 3d 30 20 29 7b 0a 20 20 20 20 20 20 6c 6f 63 6b  =0 ){.      lock
129f0 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43  .l_type = F_UNLC
12a00 4b 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  K;.      lock.l_
12a10 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45  whence = SEEK_SE
12a20 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  T;.      lock.l_
12a30 73 74 61 72 74 20 3d 20 6c 6f 63 6b 2e 6c 5f 6c  start = lock.l_l
12a40 65 6e 20 3d 20 30 4c 3b 0a 20 20 20 20 20 20 69  en = 0L;.      i
12a50 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28  f( unixFileLock(
12a60 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 2c 20 31 30  pFile, &lock, 10
12a70 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
12a80 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
12a90 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20  k = NO_LOCK;.   
12aa0 20 20 20 7d 65 6c 73 65 7b 0a 23 69 66 20 4f 53     }else{.#if OS
12ab0 4c 4f 43 4b 49 4e 47 5f 43 48 45 43 4b 5f 42 55  LOCKING_CHECK_BU
12ac0 53 59 5f 49 4f 45 52 52 0a 20 20 20 20 20 20 20  SY_IOERR.       
12ad0 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
12ae0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
12af0 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73  liteErrorFromPos
12b00 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20  ixError(tErrno, 
12b10 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c  SQLITE_IOERR_UNL
12b20 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 69 66  OCK);.        if
12b30 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28  ( IS_LOCK_ERROR(
12b40 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  rc) ){.         
12b50 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28   storeLastErrno(
12b60 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a  pFile, tErrno);.
12b70 20 20 20 20 20 20 20 20 7d 0a 23 65 6c 73 65 0a          }.#else.
12b80 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
12b90 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
12ba0 3b 0a 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c  ;.        storeL
12bb0 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20  astErrno(pFile, 
12bc0 65 72 72 6e 6f 29 3b 0a 23 65 6e 64 69 66 0a 20  errno);.#endif. 
12bd0 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65         pInode->e
12be0 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f  FileLock = NO_LO
12bf0 43 4b 3b 0a 20 20 20 20 20 20 20 20 70 46 69 6c  CK;.        pFil
12c00 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e  e->eFileLock = N
12c10 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 0a  O_LOCK;.      }.
12c20 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65      }..    /* De
12c30 63 72 65 6d 65 6e 74 20 74 68 65 20 63 6f 75 6e  crement the coun
12c40 74 20 6f 66 20 6c 6f 63 6b 73 20 61 67 61 69 6e  t of locks again
12c50 73 74 20 74 68 69 73 20 73 61 6d 65 20 66 69 6c  st this same fil
12c60 65 2e 20 20 57 68 65 6e 20 74 68 65 0a 20 20 20  e.  When the.   
12c70 20 2a 2a 20 63 6f 75 6e 74 20 72 65 61 63 68 65   ** count reache
12c80 73 20 7a 65 72 6f 2c 20 63 6c 6f 73 65 20 61 6e  s zero, close an
12c90 79 20 6f 74 68 65 72 20 66 69 6c 65 20 64 65 73  y other file des
12ca0 63 72 69 70 74 6f 72 73 20 77 68 6f 73 65 20 63  criptors whose c
12cb0 6c 6f 73 65 0a 20 20 20 20 2a 2a 20 77 61 73 20  lose.    ** was 
12cc0 64 65 66 65 72 72 65 64 20 62 65 63 61 75 73 65  deferred because
12cd0 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   of outstanding 
12ce0 6c 6f 63 6b 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  locks..    */.  
12cf0 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2d    pInode->nLock-
12d00 2d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  -;.    assert( p
12d10 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e 3d 30 20  Inode->nLock>=0 
12d20 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64  );.    if( pInod
12d30 65 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20  e->nLock==0 ){. 
12d40 20 20 20 20 20 63 6c 6f 73 65 50 65 6e 64 69 6e       closePendin
12d50 67 46 64 73 28 70 46 69 6c 65 29 3b 0a 20 20 20  gFds(pFile);.   
12d60 20 7d 0a 20 20 7d 0a 0a 65 6e 64 5f 75 6e 6c 6f   }.  }..end_unlo
12d70 63 6b 3a 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d  ck:.  unixLeaveM
12d80 75 74 65 78 28 29 3b 0a 20 20 69 66 28 20 72 63  utex();.  if( rc
12d90 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70 46  ==SQLITE_OK ) pF
12da0 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
12db0 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 72 65   eFileLock;.  re
12dc0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
12dd0 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b  * Lower the lock
12de0 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c  ing level on fil
12df0 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69  e descriptor pFi
12e00 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e  le to eFileLock.
12e10 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d    eFileLock.** m
12e20 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f  ust be either NO
12e30 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f  _LOCK or SHARED_
12e40 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  LOCK..**.** If t
12e50 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
12e60 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73   of the file des
12e70 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61  criptor is alrea
12e80 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a  dy at or below.*
12e90 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  * the requested 
12ea0 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74  locking level, t
12eb0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
12ec0 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
12ed0 63 20 69 6e 74 20 75 6e 69 78 55 6e 6c 6f 63 6b  c int unixUnlock
12ee0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
12ef0 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b  d, int eFileLock
12f00 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  ){.#if SQLITE_MA
12f10 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20  X_MMAP_SIZE>0.  
12f20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63  assert( eFileLoc
12f30 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c  k==SHARED_LOCK |
12f40 7c 20 28 28 75 6e 69 78 46 69 6c 65 20 2a 29 69  | ((unixFile *)i
12f50 64 29 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30  d)->nFetchOut==0
12f60 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74   );.#endif.  ret
12f70 75 72 6e 20 70 6f 73 69 78 55 6e 6c 6f 63 6b 28  urn posixUnlock(
12f80 69 64 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 20 30  id, eFileLock, 0
12f90 29 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45  );.}..#if SQLITE
12fa0 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
12fb0 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
12fc0 4d 61 70 66 69 6c 65 28 75 6e 69 78 46 69 6c 65  Mapfile(unixFile
12fd0 20 2a 70 46 64 2c 20 69 36 34 20 6e 42 79 74 65   *pFd, i64 nByte
12fe0 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75  );.static void u
12ff0 6e 69 78 55 6e 6d 61 70 66 69 6c 65 28 75 6e 69  nixUnmapfile(uni
13000 78 46 69 6c 65 20 2a 70 46 64 29 3b 0a 23 65 6e  xFile *pFd);.#en
13010 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  dif../*.** This 
13020 66 75 6e 63 74 69 6f 6e 20 70 65 72 66 6f 72 6d  function perform
13030 73 20 74 68 65 20 70 61 72 74 73 20 6f 66 20 74  s the parts of t
13040 68 65 20 22 63 6c 6f 73 65 20 66 69 6c 65 22 20  he "close file" 
13050 6f 70 65 72 61 74 69 6f 6e 20 0a 2a 2a 20 63 6f  operation .** co
13060 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6c 6f 63 6b  mmon to all lock
13070 69 6e 67 20 73 63 68 65 6d 65 73 2e 20 49 74 20  ing schemes. It 
13080 63 6c 6f 73 65 73 20 74 68 65 20 64 69 72 65 63  closes the direc
13090 74 6f 72 79 20 61 6e 64 20 66 69 6c 65 0a 2a 2a  tory and file.**
130a0 20 68 61 6e 64 6c 65 73 2c 20 69 66 20 74 68 65   handles, if the
130b0 79 20 61 72 65 20 76 61 6c 69 64 2c 20 61 6e 64  y are valid, and
130c0 20 73 65 74 73 20 61 6c 6c 20 66 69 65 6c 64 73   sets all fields
130d0 20 6f 66 20 74 68 65 20 75 6e 69 78 46 69 6c 65   of the unixFile
130e0 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20 74 6f  .** structure to
130f0 20 30 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20   0..**.** It is 
13100 2a 6e 6f 74 2a 20 6e 65 63 65 73 73 61 72 79 20  *not* necessary 
13110 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 75 74 65  to hold the mute
13120 78 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74  x when this rout
13130 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 0a 2a  ine is called,.*
13140 2a 20 65 76 65 6e 20 6f 6e 20 56 78 57 6f 72 6b  * even on VxWork
13150 73 2e 20 20 41 20 6d 75 74 65 78 20 77 69 6c 6c  s.  A mutex will
13160 20 62 65 20 61 63 71 75 69 72 65 64 20 6f 6e 20   be acquired on 
13170 56 78 57 6f 72 6b 73 20 62 79 20 74 68 65 0a 2a  VxWorks by the.*
13180 2a 20 76 78 77 6f 72 6b 73 52 65 6c 65 61 73 65  * vxworksRelease
13190 46 69 6c 65 49 64 28 29 20 72 6f 75 74 69 6e 65  FileId() routine
131a0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
131b0 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 73 71  closeUnixFile(sq
131c0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b  lite3_file *id){
131d0 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
131e0 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
131f0 69 64 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  id;.#if SQLITE_M
13200 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20  AX_MMAP_SIZE>0. 
13210 20 75 6e 69 78 55 6e 6d 61 70 66 69 6c 65 28 70   unixUnmapfile(p
13220 46 69 6c 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20  File);.#endif.  
13230 69 66 28 20 70 46 69 6c 65 2d 3e 68 3e 3d 30 20  if( pFile->h>=0 
13240 29 7b 0a 20 20 20 20 72 6f 62 75 73 74 5f 63 6c  ){.    robust_cl
13250 6f 73 65 28 70 46 69 6c 65 2c 20 70 46 69 6c 65  ose(pFile, pFile
13260 2d 3e 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a  ->h, __LINE__);.
13270 20 20 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 2d      pFile->h = -
13280 31 3b 0a 20 20 7d 0a 23 69 66 20 4f 53 5f 56 58  1;.  }.#if OS_VX
13290 57 4f 52 4b 53 0a 20 20 69 66 28 20 70 46 69 6c  WORKS.  if( pFil
132a0 65 2d 3e 70 49 64 20 29 7b 0a 20 20 20 20 69 66  e->pId ){.    if
132b0 28 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61  ( pFile->ctrlFla
132c0 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 44 45  gs & UNIXFILE_DE
132d0 4c 45 54 45 20 29 7b 0a 20 20 20 20 20 20 6f 73  LETE ){.      os
132e0 55 6e 6c 69 6e 6b 28 70 46 69 6c 65 2d 3e 70 49  Unlink(pFile->pI
132f0 64 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d  d->zCanonicalNam
13300 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 76 78  e);.    }.    vx
13310 77 6f 72 6b 73 52 65 6c 65 61 73 65 46 69 6c 65  worksReleaseFile
13320 49 64 28 70 46 69 6c 65 2d 3e 70 49 64 29 3b 0a  Id(pFile->pId);.
13330 20 20 20 20 70 46 69 6c 65 2d 3e 70 49 64 20 3d      pFile->pId =
13340 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23   0;.  }.#endif.#
13350 69 66 64 65 66 20 53 51 4c 49 54 45 5f 55 4e 4c  ifdef SQLITE_UNL
13360 49 4e 4b 5f 41 46 54 45 52 5f 43 4c 4f 53 45 0a  INK_AFTER_CLOSE.
13370 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 63 74 72    if( pFile->ctr
13380 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c  lFlags & UNIXFIL
13390 45 5f 44 45 4c 45 54 45 20 29 7b 0a 20 20 20 20  E_DELETE ){.    
133a0 6f 73 55 6e 6c 69 6e 6b 28 70 46 69 6c 65 2d 3e  osUnlink(pFile->
133b0 7a 50 61 74 68 29 3b 0a 20 20 20 20 73 71 6c 69  zPath);.    sqli
133c0 74 65 33 5f 66 72 65 65 28 2a 28 63 68 61 72 2a  te3_free(*(char*
133d0 2a 29 26 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29  *)&pFile->zPath)
133e0 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 7a 50 61  ;.    pFile->zPa
133f0 74 68 20 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64  th = 0;.  }.#end
13400 69 66 0a 20 20 4f 53 54 52 41 43 45 28 28 22 43  if.  OSTRACE(("C
13410 4c 4f 53 45 20 20 20 25 2d 33 64 5c 6e 22 2c 20  LOSE   %-3d\n", 
13420 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 4f 70  pFile->h));.  Op
13430 65 6e 43 6f 75 6e 74 65 72 28 2d 31 29 3b 0a 20  enCounter(-1);. 
13440 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 46   sqlite3_free(pF
13450 69 6c 65 2d 3e 70 55 6e 75 73 65 64 29 3b 0a 20  ile->pUnused);. 
13460 20 6d 65 6d 73 65 74 28 70 46 69 6c 65 2c 20 30   memset(pFile, 0
13470 2c 20 73 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c  , sizeof(unixFil
13480 65 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  e));.  return SQ
13490 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
134a0 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a  * Close a file..
134b0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
134c0 69 78 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f  ixClose(sqlite3_
134d0 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 69 6e 74  file *id){.  int
134e0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
134f0 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
13500 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a  le = (unixFile *
13510 29 69 64 3b 0a 20 20 76 65 72 69 66 79 44 62 46  )id;.  verifyDbF
13520 69 6c 65 28 70 46 69 6c 65 29 3b 0a 20 20 75 6e  ile(pFile);.  un
13530 69 78 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f  ixUnlock(id, NO_
13540 4c 4f 43 4b 29 3b 0a 20 20 75 6e 69 78 45 6e 74  LOCK);.  unixEnt
13550 65 72 4d 75 74 65 78 28 29 3b 0a 0a 20 20 2f 2a  erMutex();..  /*
13560 20 75 6e 69 78 46 69 6c 65 2e 70 49 6e 6f 64 65   unixFile.pInode
13570 20 69 73 20 61 6c 77 61 79 73 20 76 61 6c 69 64   is always valid
13580 20 68 65 72 65 2e 20 4f 74 68 65 72 77 69 73 65   here. Otherwise
13590 2c 20 61 20 64 69 66 66 65 72 65 6e 74 20 63 6c  , a different cl
135a0 6f 73 65 0a 20 20 2a 2a 20 72 6f 75 74 69 6e 65  ose.  ** routine
135b0 20 28 65 2e 67 2e 20 6e 6f 6c 6f 63 6b 43 6c 6f   (e.g. nolockClo
135c0 73 65 28 29 29 20 77 6f 75 6c 64 20 62 65 20 63  se()) would be c
135d0 61 6c 6c 65 64 20 69 6e 73 74 65 61 64 2e 0a 20  alled instead.. 
135e0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 46   */.  assert( pF
135f0 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 4c 6f  ile->pInode->nLo
13600 63 6b 3e 30 20 7c 7c 20 70 46 69 6c 65 2d 3e 70  ck>0 || pFile->p
13610 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c  Inode->bProcessL
13620 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  ock==0 );.  if( 
13630 41 4c 57 41 59 53 28 70 46 69 6c 65 2d 3e 70 49  ALWAYS(pFile->pI
13640 6e 6f 64 65 29 20 26 26 20 70 46 69 6c 65 2d 3e  node) && pFile->
13650 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 20 29 7b  pInode->nLock ){
13660 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
13670 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67   are outstanding
13680 20 6c 6f 63 6b 73 2c 20 64 6f 20 6e 6f 74 20 61   locks, do not a
13690 63 74 75 61 6c 6c 79 20 63 6c 6f 73 65 20 74 68  ctually close th
136a0 65 20 66 69 6c 65 20 6a 75 73 74 0a 20 20 20 20  e file just.    
136b0 2a 2a 20 79 65 74 20 62 65 63 61 75 73 65 20 74  ** yet because t
136c0 68 61 74 20 77 6f 75 6c 64 20 63 6c 65 61 72 20  hat would clear 
136d0 74 68 6f 73 65 20 6c 6f 63 6b 73 2e 20 20 49 6e  those locks.  In
136e0 73 74 65 61 64 2c 20 61 64 64 20 74 68 65 20 66  stead, add the f
136f0 69 6c 65 0a 20 20 20 20 2a 2a 20 64 65 73 63 72  ile.    ** descr
13700 69 70 74 6f 72 20 74 6f 20 70 49 6e 6f 64 65 2d  iptor to pInode-
13710 3e 70 55 6e 75 73 65 64 20 6c 69 73 74 2e 20 20  >pUnused list.  
13720 49 74 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d  It will be autom
13730 61 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65 64 20  atically closed 
13740 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 74 68 65  .    ** when the
13750 20 6c 61 73 74 20 6c 6f 63 6b 20 69 73 20 63 6c   last lock is cl
13760 65 61 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  eared..    */.  
13770 20 20 73 65 74 50 65 6e 64 69 6e 67 46 64 28 70    setPendingFd(p
13780 46 69 6c 65 29 3b 0a 20 20 7d 0a 20 20 72 65 6c  File);.  }.  rel
13790 65 61 73 65 49 6e 6f 64 65 49 6e 66 6f 28 70 46  easeInodeInfo(pF
137a0 69 6c 65 29 3b 0a 20 20 72 63 20 3d 20 63 6c 6f  ile);.  rc = clo
137b0 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a  seUnixFile(id);.
137c0 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
137d0 28 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ();.  return rc;
137e0 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .}../***********
137f0 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 70  *** End of the p
13800 6f 73 69 78 20 61 64 76 69 73 6f 72 79 20 6c 6f  osix advisory lo
13810 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ck implementatio
13820 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  n **************
13830 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
13840 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13850 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13860 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13870 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13880 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **/../**********
13890 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
138a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
138b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
138c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
138d0 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
138e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
138f0 2a 2a 2a 20 4e 6f 2d 6f 70 20 4c 6f 63 6b 69 6e  *** No-op Lockin
13900 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  g **************
13910 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13920 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4f 66 20 74 68  ****.**.** Of th
13930 65 20 76 61 72 69 6f 75 73 20 6c 6f 63 6b 69 6e  e various lockin
13940 67 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  g implementation
13950 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 74 68 69  s available, thi
13960 73 20 69 73 20 62 79 20 66 61 72 20 74 68 65 0a  s is by far the.
13970 2a 2a 20 73 69 6d 70 6c 65 73 74 3a 20 20 6c 6f  ** simplest:  lo
13980 63 6b 69 6e 67 20 69 73 20 69 67 6e 6f 72 65 64  cking is ignored
13990 2e 20 20 4e 6f 20 61 74 74 65 6d 70 74 20 69 73  .  No attempt is
139a0 20 6d 61 64 65 20 74 6f 20 6c 6f 63 6b 20 74 68   made to lock th
139b0 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69  e database.** fi
139c0 6c 65 20 66 6f 72 20 72 65 61 64 69 6e 67 20 6f  le for reading o
139d0 72 20 77 72 69 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a  r writing..**.**
139e0 20 54 68 69 73 20 6c 6f 63 6b 69 6e 67 20 6d 6f   This locking mo
139f0 64 65 20 69 73 20 61 70 70 72 6f 70 72 69 61 74  de is appropriat
13a00 65 20 66 6f 72 20 75 73 65 20 6f 6e 20 72 65 61  e for use on rea
13a10 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 73  d-only databases
13a20 0a 2a 2a 20 28 65 78 3a 20 64 61 74 61 62 61 73  .** (ex: databas
13a30 65 73 20 74 68 61 74 20 61 72 65 20 62 75 72 6e  es that are burn
13a40 65 64 20 69 6e 74 6f 20 43 44 2d 52 4f 4d 2c 20  ed into CD-ROM, 
13a50 66 6f 72 20 65 78 61 6d 70 6c 65 2e 29 20 20 49  for example.)  I
13a60 74 20 63 61 6e 0a 2a 2a 20 61 6c 73 6f 20 62 65  t can.** also be
13a70 20 75 73 65 64 20 69 66 20 74 68 65 20 61 70 70   used if the app
13a80 6c 69 63 61 74 69 6f 6e 20 65 6d 70 6c 6f 79 73  lication employs
13a90 20 73 6f 6d 65 20 65 78 74 65 72 6e 61 6c 20 6d   some external m
13aa0 65 63 68 61 6e 69 73 6d 20 74 6f 0a 2a 2a 20 70  echanism to.** p
13ab0 72 65 76 65 6e 74 20 73 69 6d 75 6c 74 61 6e 65  revent simultane
13ac0 6f 75 73 20 61 63 63 65 73 73 20 6f 66 20 74 68  ous access of th
13ad0 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20  e same database 
13ae0 62 79 20 74 77 6f 20 6f 72 20 6d 6f 72 65 0a 2a  by two or more.*
13af0 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * database conne
13b00 63 74 69 6f 6e 73 2e 20 20 42 75 74 20 74 68 65  ctions.  But the
13b10 72 65 20 69 73 20 61 20 73 65 72 69 6f 75 73 20  re is a serious 
13b20 72 69 73 6b 20 6f 66 20 64 61 74 61 62 61 73 65  risk of database
13b30 0a 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20 69  .** corruption i
13b40 66 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20 6d  f this locking m
13b50 6f 64 65 20 69 73 20 75 73 65 64 20 69 6e 20 73  ode is used in s
13b60 69 74 75 61 74 69 6f 6e 73 20 77 68 65 72 65 20  ituations where 
13b70 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 64 61 74 61  multiple.** data
13b80 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  base connections
13b90 20 61 72 65 20 61 63 63 65 73 73 69 6e 67 20 74   are accessing t
13ba0 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65  he same database
13bb0 20 66 69 6c 65 20 61 74 20 74 68 65 20 73 61 6d   file at the sam
13bc0 65 0a 2a 2a 20 74 69 6d 65 20 61 6e 64 20 6f 6e  e.** time and on
13bd0 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 6f  e or more of tho
13be0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61  se connections a
13bf0 72 65 20 77 72 69 74 69 6e 67 2e 0a 2a 2f 0a 0a  re writing..*/..
13c00 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63  static int noloc
13c10 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  kCheckReservedLo
13c20 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
13c30 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 2a 70  *NotUsed, int *p
13c40 52 65 73 4f 75 74 29 7b 0a 20 20 55 4e 55 53 45  ResOut){.  UNUSE
13c50 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
13c60 73 65 64 29 3b 0a 20 20 2a 70 52 65 73 4f 75 74  sed);.  *pResOut
13c70 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 53   = 0;.  return S
13c80 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 73 74 61 74  QLITE_OK;.}.stat
13c90 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 4c 6f 63  ic int nolockLoc
13ca0 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
13cb0 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 4e 6f 74  NotUsed, int Not
13cc0 55 73 65 64 32 29 7b 0a 20 20 55 4e 55 53 45 44  Used2){.  UNUSED
13cd0 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74 55  _PARAMETER2(NotU
13ce0 73 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b 0a  sed, NotUsed2);.
13cf0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
13d00 4f 4b 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74  OK;.}.static int
13d10 20 6e 6f 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 73 71   nolockUnlock(sq
13d20 6c 69 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55  lite3_file *NotU
13d30 73 65 64 2c 20 69 6e 74 20 4e 6f 74 55 73 65 64  sed, int NotUsed
13d40 32 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  2){.  UNUSED_PAR
13d50 41 4d 45 54 45 52 32 28 4e 6f 74 55 73 65 64 2c  AMETER2(NotUsed,
13d60 20 4e 6f 74 55 73 65 64 32 29 3b 0a 20 20 72 65   NotUsed2);.  re
13d70 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
13d80 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 74  }../*.** Close t
13d90 68 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  he file..*/.stat
13da0 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 43 6c 6f  ic int nolockClo
13db0 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  se(sqlite3_file 
13dc0 2a 69 64 29 20 7b 0a 20 20 69 6e 74 20 72 63 20  *id) {.  int rc 
13dd0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75  = SQLITE_OK;.  u
13de0 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
13df0 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 69 64 3b   (unixFile *)id;
13e00 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  .  unixEnterMute
13e10 78 28 29 3b 0a 20 20 0a 20 20 2f 2a 20 75 6e 69  x();.  .  /* uni
13e20 78 46 69 6c 65 2e 70 49 6e 6f 64 65 20 69 73 20  xFile.pInode is 
13e30 61 6c 77 61 79 73 20 76 61 6c 69 64 20 68 65 72  always valid her
13e40 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61 20  e. Otherwise, a 
13e50 64 69 66 66 65 72 65 6e 74 20 63 6c 6f 73 65 0a  different close.
13e60 20 20 2a 2a 20 72 6f 75 74 69 6e 65 20 28 65 2e    ** routine (e.
13e70 67 2e 20 6e 6f 6c 6f 63 6b 43 6c 6f 73 65 28 29  g. nolockClose()
13e80 29 20 77 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65  ) would be calle
13e90 64 20 69 6e 73 74 65 61 64 2e 0a 20 20 2a 2f 0a  d instead..  */.
13ea0 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d    assert( pFile-
13eb0 3e 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e 30  >pInode->nLock>0
13ec0 20 7c 7c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64   || pFile->pInod
13ed0 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d  e->bProcessLock=
13ee0 3d 30 20 29 3b 0a 20 20 69 66 28 20 41 4c 57 41  =0 );.  if( ALWA
13ef0 59 53 28 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  YS(pFile->pInode
13f00 29 20 26 26 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  ) && pFile->pIno
13f10 64 65 2d 3e 6e 4c 6f 63 6b 20 29 7b 0a 20 20 20  de->nLock ){.   
13f20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
13f30 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63   outstanding loc
13f40 6b 73 2c 20 64 6f 20 6e 6f 74 20 61 63 74 75 61  ks, do not actua
13f50 6c 6c 79 20 63 6c 6f 73 65 20 74 68 65 20 66 69  lly close the fi
13f60 6c 65 20 6a 75 73 74 0a 20 20 20 20 2a 2a 20 79  le just.    ** y
13f70 65 74 20 62 65 63 61 75 73 65 20 74 68 61 74 20  et because that 
13f80 77 6f 75 6c 64 20 63 6c 65 61 72 20 74 68 6f 73  would clear thos
13f90 65 20 6c 6f 63 6b 73 2e 20 20 49 6e 73 74 65 61  e locks.  Instea
13fa0 64 2c 20 61 64 64 20 74 68 65 20 66 69 6c 65 0a  d, add the file.
13fb0 20 20 20 20 2a 2a 20 64 65 73 63 72 69 70 74 6f      ** descripto
13fc0 72 20 74 6f 20 70 49 6e 6f 64 65 2d 3e 70 55 6e  r to pInode->pUn
13fd0 75 73 65 64 20 6c 69 73 74 2e 20 20 49 74 20 77  used list.  It w
13fe0 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74 69 63  ill be automatic
13ff0 61 6c 6c 79 20 63 6c 6f 73 65 64 20 0a 20 20 20  ally closed .   
14000 20 2a 2a 20 77 68 65 6e 20 74 68 65 20 6c 61 73   ** when the las
14010 74 20 6c 6f 63 6b 20 69 73 20 63 6c 65 61 72 65  t lock is cleare
14020 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 65  d..    */.    se
14030 74 50 65 6e 64 69 6e 67 46 64 28 70 46 69 6c 65  tPendingFd(pFile
14040 29 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65  );.  }.  release
14050 49 6e 6f 64 65 49 6e 66 6f 28 70 46 69 6c 65 29  InodeInfo(pFile)
14060 3b 0a 20 20 72 63 20 3d 20 63 6c 6f 73 65 55 6e  ;.  rc = closeUn
14070 69 78 46 69 6c 65 28 69 64 29 3b 0a 20 20 75 6e  ixFile(id);.  un
14080 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
14090 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
140a0 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
140b0 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20  **** End of the 
140c0 6e 6f 2d 6f 70 20 6c 6f 63 6b 20 69 6d 70 6c 65  no-op lock imple
140d0 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a  mentation ******
140e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
140f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14100 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14110 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14120 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14130 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
14140 0a 2f 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 2a 2a 2a 2a 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 0a 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 20 42 65 67 69 6e  ********** Begin
141b0 20 64 6f 74 2d 66 69 6c 65 20 4c 6f 63 6b 69 6e   dot-file Lockin
141c0 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  g **************
141d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
141e0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 6f 74 66 69  .**.** The dotfi
141f0 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c 65  le locking imple
14200 6d 65 6e 74 61 74 69 6f 6e 20 75 73 65 73 20 74  mentation uses t
14210 68 65 20 65 78 69 73 74 65 6e 63 65 20 6f 66 20  he existence of 
14220 73 65 70 61 72 61 74 65 20 6c 6f 63 6b 0a 2a 2a  separate lock.**
14230 20 66 69 6c 65 73 20 28 72 65 61 6c 6c 79 20 61   files (really a
14240 20 64 69 72 65 63 74 6f 72 79 29 20 74 6f 20 63   directory) to c
14250 6f 6e 74 72 6f 6c 20 61 63 63 65 73 73 20 74 6f  ontrol access to
14260 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
14270 54 68 69 73 20 77 6f 72 6b 73 0a 2a 2a 20 6f 6e  This works.** on
14280 20 6a 75 73 74 20 61 62 6f 75 74 20 65 76 65 72   just about ever
14290 79 20 66 69 6c 65 73 79 73 74 65 6d 20 69 6d 61  y filesystem ima
142a0 67 69 6e 61 62 6c 65 2e 20 20 42 75 74 20 74 68  ginable.  But th
142b0 65 72 65 20 61 72 65 20 73 65 72 69 6f 75 73 20  ere are serious 
142c0 64 6f 77 6e 73 69 64 65 73 3a 0a 2a 2a 0a 2a 2a  downsides:.**.**
142d0 20 20 20 20 28 31 29 20 20 54 68 65 72 65 20 69      (1)  There i
142e0 73 20 7a 65 72 6f 20 63 6f 6e 63 75 72 72 65 6e  s zero concurren
142f0 63 79 2e 20 20 41 20 73 69 6e 67 6c 65 20 72 65  cy.  A single re
14300 61 64 65 72 20 62 6c 6f 63 6b 73 20 61 6c 6c 20  ader blocks all 
14310 6f 74 68 65 72 0a 2a 2a 20 20 20 20 20 20 20 20  other.**        
14320 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 66 72 6f   connections fro
14330 6d 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69  m reading or wri
14340 74 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ting the databas
14350 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20  e..**.**    (2) 
14360 20 41 6e 20 61 70 70 6c 69 63 61 74 69 6f 6e 20   An application 
14370 63 72 61 73 68 20 6f 72 20 70 6f 77 65 72 20 6c  crash or power l
14380 6f 73 73 20 63 61 6e 20 6c 65 61 76 65 20 73 74  oss can leave st
14390 61 6c 65 20 6c 6f 63 6b 20 66 69 6c 65 73 0a 2a  ale lock files.*
143a0 2a 20 20 20 20 20 20 20 20 20 73 69 74 74 69 6e  *         sittin
143b0 67 20 61 72 6f 75 6e 64 20 74 68 61 74 20 6e 65  g around that ne
143c0 65 64 20 74 6f 20 62 65 20 63 6c 65 61 72 65 64  ed to be cleared
143d0 20 6d 61 6e 75 61 6c 6c 79 2e 0a 2a 2a 0a 2a 2a   manually..**.**
143e0 20 4e 65 76 65 72 74 68 65 6c 65 73 73 2c 20 61   Nevertheless, a
143f0 20 64 6f 74 6c 6f 63 6b 20 69 73 20 61 6e 20 61   dotlock is an a
14400 70 70 72 6f 70 72 69 61 74 65 20 6c 6f 63 6b 69  ppropriate locki
14410 6e 67 20 6d 6f 64 65 20 66 6f 72 20 75 73 65 20  ng mode for use 
14420 69 66 20 6e 6f 0a 2a 2a 20 6f 74 68 65 72 20 6c  if no.** other l
14430 6f 63 6b 69 6e 67 20 73 74 72 61 74 65 67 79 20  ocking strategy 
14440 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a  is available..**
14450 0a 2a 2a 20 44 6f 74 66 69 6c 65 20 6c 6f 63 6b  .** Dotfile lock
14460 69 6e 67 20 77 6f 72 6b 73 20 62 79 20 63 72 65  ing works by cre
14470 61 74 69 6e 67 20 61 20 73 75 62 64 69 72 65 63  ating a subdirec
14480 74 6f 72 79 20 69 6e 20 74 68 65 20 73 61 6d 65  tory in the same
14490 20 64 69 72 65 63 74 6f 72 79 20 61 73 0a 2a 2a   directory as.**
144a0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6e   the database an
144b0 64 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  d with the same 
144c0 6e 61 6d 65 20 62 75 74 20 77 69 74 68 20 61 20  name but with a 
144d0 22 2e 6c 6f 63 6b 22 20 65 78 74 65 6e 73 69 6f  ".lock" extensio
144e0 6e 20 61 64 64 65 64 2e 0a 2a 2a 20 54 68 65 20  n added..** The 
144f0 65 78 69 73 74 65 6e 63 65 20 6f 66 20 61 20 6c  existence of a l
14500 6f 63 6b 20 64 69 72 65 63 74 6f 72 79 20 69 6d  ock directory im
14510 70 6c 69 65 73 20 61 6e 20 45 58 43 4c 55 53 49  plies an EXCLUSI
14520 56 45 20 6c 6f 63 6b 2e 20 20 41 6c 6c 20 6f 74  VE lock.  All ot
14530 68 65 72 0a 2a 2a 20 6c 6f 63 6b 20 74 79 70 65  her.** lock type
14540 73 20 28 53 48 41 52 45 44 2c 20 52 45 53 45 52  s (SHARED, RESER
14550 56 45 44 2c 20 50 45 4e 44 49 4e 47 29 20 61 72  VED, PENDING) ar
14560 65 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 45 58  e mapped into EX
14570 43 4c 55 53 49 56 45 2e 0a 2a 2f 0a 0a 2f 2a 0a  CLUSIVE..*/../*.
14580 2a 2a 20 54 68 65 20 66 69 6c 65 20 73 75 66 66  ** The file suff
14590 69 78 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  ix added to the 
145a0 64 61 74 61 20 62 61 73 65 20 66 69 6c 65 6e 61  data base filena
145b0 6d 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63  me in order to c
145c0 72 65 61 74 65 20 74 68 65 0a 2a 2a 20 6c 6f 63  reate the.** loc
145d0 6b 20 64 69 72 65 63 74 6f 72 79 2e 0a 2a 2f 0a  k directory..*/.
145e0 23 64 65 66 69 6e 65 20 44 4f 54 4c 4f 43 4b 5f  #define DOTLOCK_
145f0 53 55 46 46 49 58 20 22 2e 6c 6f 63 6b 22 0a 0a  SUFFIX ".lock"..
14600 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
14610 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74 68 65  ne checks if the
14620 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44  re is a RESERVED
14630 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68   lock held on th
14640 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66  e specified.** f
14650 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20 61  ile by this or a
14660 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  ny other process
14670 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b  . If such a lock
14680 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70   is held, set *p
14690 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e  ResOut.** to a n
146a0 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74  on-zero value ot
146b0 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74  herwise *pResOut
146c0 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e   is set to zero.
146d0 20 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c    The return val
146e0 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20  ue.** is set to 
146f0 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73  SQLITE_OK unless
14700 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63   an I/O error oc
14710 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b  curs during lock
14720 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a   checking..**.**
14730 20 49 6e 20 64 6f 74 66 69 6c 65 20 6c 6f 63 6b   In dotfile lock
14740 69 6e 67 2c 20 65 69 74 68 65 72 20 61 20 6c 6f  ing, either a lo
14750 63 6b 20 65 78 69 73 74 73 20 6f 72 20 69 74 20  ck exists or it 
14760 64 6f 65 73 20 6e 6f 74 2e 20 20 53 6f 20 69 6e  does not.  So in
14770 20 74 68 69 73 0a 2a 2a 20 76 61 72 69 61 74 69   this.** variati
14780 6f 6e 20 6f 66 20 43 68 65 63 6b 52 65 73 65 72  on of CheckReser
14790 76 65 64 4c 6f 63 6b 28 29 2c 20 2a 70 52 65 73  vedLock(), *pRes
147a0 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 74 72  Out is set to tr
147b0 75 65 20 69 66 20 61 6e 79 20 6c 6f 63 6b 0a 2a  ue if any lock.*
147c0 2a 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65  * is held on the
147d0 20 66 69 6c 65 20 61 6e 64 20 66 61 6c 73 65 20   file and false 
147e0 69 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 75  if the file is u
147f0 6e 6c 6f 63 6b 65 64 2e 0a 2a 2f 0a 73 74 61 74  nlocked..*/.stat
14800 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 43 68  ic int dotlockCh
14810 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28  eckReservedLock(
14820 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
14830 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 20  , int *pResOut) 
14840 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
14850 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65  ITE_OK;.  int re
14860 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e  served = 0;.  un
14870 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
14880 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a  (unixFile*)id;..
14890 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
148a0 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r( return SQLITE
148b0 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45  _IOERR_CHECKRESE
148c0 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a  RVEDLOCK; );.  .
148d0 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
148e0 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69  );..  /* Check i
148f0 66 20 61 20 74 68 72 65 61 64 20 69 6e 20 74 68  f a thread in th
14900 69 73 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73  is process holds
14910 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a   such a lock */.
14920 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69    if( pFile->eFi
14930 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f  leLock>SHARED_LO
14940 43 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 45 69 74  CK ){.    /* Eit
14950 68 65 72 20 74 68 69 73 20 63 6f 6e 6e 65 63 74  her this connect
14960 69 6f 6e 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65  ion or some othe
14970 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 20  r connection in 
14980 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73  the same process
14990 0a 20 20 20 20 2a 2a 20 68 6f 6c 64 73 20 61 20  .    ** holds a 
149a0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65  lock on the file
149b0 2e 20 20 4e 6f 20 6e 65 65 64 20 74 6f 20 63 68  .  No need to ch
149c0 65 63 6b 20 66 75 72 74 68 65 72 2e 20 2a 2f 0a  eck further. */.
149d0 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31      reserved = 1
149e0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
149f0 2a 20 54 68 65 20 6c 6f 63 6b 20 69 73 20 68 65  * The lock is he
14a00 6c 64 20 69 66 20 61 6e 64 20 6f 6e 6c 79 20 69  ld if and only i
14a10 66 20 74 68 65 20 6c 6f 63 6b 66 69 6c 65 20 65  f the lockfile e
14a20 78 69 73 74 73 20 2a 2f 0a 20 20 20 20 63 6f 6e  xists */.    con
14a30 73 74 20 63 68 61 72 20 2a 7a 4c 6f 63 6b 46 69  st char *zLockFi
14a40 6c 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  le = (const char
14a50 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  *)pFile->locking
14a60 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 72 65 73  Context;.    res
14a70 65 72 76 65 64 20 3d 20 6f 73 41 63 63 65 73 73  erved = osAccess
14a80 28 7a 4c 6f 63 6b 46 69 6c 65 2c 20 30 29 3d 3d  (zLockFile, 0)==
14a90 30 3b 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45  0;.  }.  OSTRACE
14aa0 28 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20  (("TEST WR-LOCK 
14ab0 25 64 20 25 64 20 25 64 20 28 64 6f 74 6c 6f 63  %d %d %d (dotloc
14ac0 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  k)\n", pFile->h,
14ad0 20 72 63 2c 20 72 65 73 65 72 76 65 64 29 29 3b   rc, reserved));
14ae0 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65  .  *pResOut = re
14af0 73 65 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e  served;.  return
14b00 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f   rc;.}../*.** Lo
14b10 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74 68  ck the file with
14b20 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66   the lock specif
14b30 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72  ied by parameter
14b40 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65   eFileLock - one
14b50 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  .** of the follo
14b60 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  wing:.**.**     
14b70 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a  (1) SHARED_LOCK.
14b80 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53 45 52  **     (2) RESER
14b90 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  VED_LOCK.**     
14ba0 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  (3) PENDING_LOCK
14bb0 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c  .**     (4) EXCL
14bc0 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a  USIVE_LOCK.**.**
14bd0 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20   Sometimes when 
14be0 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c  requesting one l
14bf0 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74  ock state, addit
14c00 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65  ional lock state
14c10 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65  s.** are inserte
14c20 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54  d in between.  T
14c30 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74  he locking might
14c40 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20   fail on one of 
14c50 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61  the later.** tra
14c60 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67  nsitions leaving
14c70 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20   the lock state 
14c80 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77  different from w
14c90 68 61 74 20 69 74 20 73 74 61 72 74 65 64 20 62  hat it started b
14ca0 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72  ut.** still shor
14cb0 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20  t of its goal.  
14cc0 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68  The following ch
14cd0 61 72 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c  art shows the al
14ce0 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74  lowed.** transit
14cf0 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73  ions and the ins
14d00 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61  erted intermedia
14d10 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a  te states:.**.**
14d20 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20      UNLOCKED -> 
14d30 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41  SHARED.**    SHA
14d40 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a  RED -> RESERVED.
14d50 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20  **    SHARED -> 
14d60 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43  (PENDING) -> EXC
14d70 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53  LUSIVE.**    RES
14d80 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e  ERVED -> (PENDIN
14d90 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  G) -> EXCLUSIVE.
14da0 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e  **    PENDING ->
14db0 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a   EXCLUSIVE.**.**
14dc0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   This routine wi
14dd0 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65  ll only increase
14de0 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68   a lock.  Use th
14df0 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63  e sqlite3OsUnloc
14e00 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74  k().** routine t
14e10 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e  o lower a lockin
14e20 67 20 6c 65 76 65 6c 2e 0a 2a 2a 0a 2a 2a 20 57  g level..**.** W
14e30 69 74 68 20 64 6f 74 66 69 6c 65 20 6c 6f 63 6b  ith dotfile lock
14e40 69 6e 67 2c 20 77 65 20 72 65 61 6c 6c 79 20 6f  ing, we really o
14e50 6e 6c 79 20 73 75 70 70 6f 72 74 20 73 74 61 74  nly support stat
14e60 65 20 28 34 29 3a 20 45 58 43 4c 55 53 49 56 45  e (4): EXCLUSIVE
14e70 2e 0a 2a 2a 20 42 75 74 20 77 65 20 74 72 61 63  ..** But we trac
14e80 6b 20 74 68 65 20 6f 74 68 65 72 20 6c 6f 63 6b  k the other lock
14e90 69 6e 67 20 6c 65 76 65 6c 73 20 69 6e 74 65 72  ing levels inter
14ea0 6e 61 6c 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  nally..*/.static
14eb0 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b   int dotlockLock
14ec0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
14ed0 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b  d, int eFileLock
14ee0 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  ) {.  unixFile *
14ef0 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
14f00 65 2a 29 69 64 3b 0a 20 20 63 68 61 72 20 2a 7a  e*)id;.  char *z
14f10 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63 68 61 72  LockFile = (char
14f20 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e   *)pFile->lockin
14f30 67 43 6f 6e 74 65 78 74 3b 0a 20 20 69 6e 74 20  gContext;.  int 
14f40 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
14f50 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 68 61 76  ..  /* If we hav
14f60 65 20 61 6e 79 20 6c 6f 63 6b 2c 20 74 68 65 6e  e any lock, then
14f70 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65 20 61   the lock file a
14f80 6c 72 65 61 64 79 20 65 78 69 73 74 73 2e 20 20  lready exists.  
14f90 41 6c 6c 20 77 65 20 68 61 76 65 0a 20 20 2a 2a  All we have.  **
14fa0 20 74 6f 20 64 6f 20 69 73 20 61 64 6a 75 73 74   to do is adjust
14fb0 20 6f 75 72 20 69 6e 74 65 72 6e 61 6c 20 72 65   our internal re
14fc0 63 6f 72 64 20 6f 66 20 74 68 65 20 6c 6f 63 6b  cord of the lock
14fd0 20 6c 65 76 65 6c 2e 0a 20 20 2a 2f 0a 20 20 69   level..  */.  i
14fe0 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  f( pFile->eFileL
14ff0 6f 63 6b 20 3e 20 4e 4f 5f 4c 4f 43 4b 20 29 7b  ock > NO_LOCK ){
15000 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c  .    pFile->eFil
15010 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63  eLock = eFileLoc
15020 6b 3b 0a 20 20 20 20 2f 2a 20 41 6c 77 61 79 73  k;.    /* Always
15030 20 75 70 64 61 74 65 20 74 68 65 20 74 69 6d 65   update the time
15040 73 74 61 6d 70 20 6f 6e 20 74 68 65 20 6f 6c 64  stamp on the old
15050 20 66 69 6c 65 20 2a 2f 0a 23 69 66 64 65 66 20   file */.#ifdef 
15060 48 41 56 45 5f 55 54 49 4d 45 0a 20 20 20 20 75  HAVE_UTIME.    u
15070 74 69 6d 65 28 7a 4c 6f 63 6b 46 69 6c 65 2c 20  time(zLockFile, 
15080 4e 55 4c 4c 29 3b 0a 23 65 6c 73 65 0a 20 20 20  NULL);.#else.   
15090 20 75 74 69 6d 65 73 28 7a 4c 6f 63 6b 46 69 6c   utimes(zLockFil
150a0 65 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6e 64 69 66  e, NULL);.#endif
150b0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
150c0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20  TE_OK;.  }.  .  
150d0 2f 2a 20 67 72 61 62 20 61 6e 20 65 78 63 6c 75  /* grab an exclu
150e0 73 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 72  sive lock */.  r
150f0 63 20 3d 20 6f 73 4d 6b 64 69 72 28 7a 4c 6f 63  c = osMkdir(zLoc
15100 6b 46 69 6c 65 2c 20 30 37 37 37 29 3b 0a 20 20  kFile, 0777);.  
15110 69 66 28 20 72 63 3c 30 20 29 7b 0a 20 20 20 20  if( rc<0 ){.    
15120 2f 2a 20 66 61 69 6c 65 64 20 74 6f 20 6f 70 65  /* failed to ope
15130 6e 2f 63 72 65 61 74 65 20 74 68 65 20 6c 6f 63  n/create the loc
15140 6b 20 64 69 72 65 63 74 6f 72 79 20 2a 2f 0a 20  k directory */. 
15150 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20     int tErrno = 
15160 65 72 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20 45  errno;.    if( E
15170 45 58 49 53 54 20 3d 3d 20 74 45 72 72 6e 6f 20  EXIST == tErrno 
15180 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
15190 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d  LITE_BUSY;.    }
151a0 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 72 63   else {.      rc
151b0 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
151c0 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
151d0 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
151e0 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69  R_LOCK);.      i
151f0 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
15200 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20  (rc) ){.        
15210 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70  storeLastErrno(p
15220 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20  File, tErrno);. 
15230 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
15240 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 20   return rc;.  } 
15250 0a 20 20 0a 20 20 2f 2a 20 67 6f 74 20 69 74 2c  .  .  /* got it,
15260 20 73 65 74 20 74 68 65 20 74 79 70 65 20 61 6e   set the type an
15270 64 20 72 65 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20  d return ok */. 
15280 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
15290 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20  k = eFileLock;. 
152a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
152b0 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c  *.** Lower the l
152c0 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20  ocking level on 
152d0 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
152e0 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f  pFile to eFileLo
152f0 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a  ck.  eFileLock.*
15300 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  * must be either
15310 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52   NO_LOCK or SHAR
15320 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49  ED_LOCK..**.** I
15330 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  f the locking le
15340 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20  vel of the file 
15350 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c  descriptor is al
15360 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f  ready at or belo
15370 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74  w.** the request
15380 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  ed locking level
15390 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
153a0 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a  s a no-op..**.**
153b0 20 57 68 65 6e 20 74 68 65 20 6c 6f 63 6b 69 6e   When the lockin
153c0 67 20 6c 65 76 65 6c 20 72 65 61 63 68 65 73 20  g level reaches 
153d0 4e 4f 5f 4c 4f 43 4b 2c 20 64 65 6c 65 74 65 20  NO_LOCK, delete 
153e0 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65 2e 0a 2a  the lock file..*
153f0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f 74  /.static int dot
15400 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 73 71 6c 69 74  lockUnlock(sqlit
15410 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
15420 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20   eFileLock) {.  
15430 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
15440 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
15450 0a 20 20 63 68 61 72 20 2a 7a 4c 6f 63 6b 46 69  .  char *zLockFi
15460 6c 65 20 3d 20 28 63 68 61 72 20 2a 29 70 46 69  le = (char *)pFi
15470 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
15480 78 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  xt;.  int rc;.. 
15490 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
154a0 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e  ;.  OSTRACE(("UN
154b0 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73 20  LOCK  %d %d was 
154c0 25 64 20 70 69 64 3d 25 64 20 28 64 6f 74 6c 6f  %d pid=%d (dotlo
154d0 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  ck)\n", pFile->h
154e0 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20  , eFileLock,.   
154f0 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65          pFile->e
15500 46 69 6c 65 4c 6f 63 6b 2c 20 6f 73 47 65 74 70  FileLock, osGetp
15510 69 64 28 30 29 29 29 3b 0a 20 20 61 73 73 65 72  id(0)));.  asser
15520 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48  t( eFileLock<=SH
15530 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a  ARED_LOCK );.  .
15540 20 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20 70 6f    /* no-op if po
15550 73 73 69 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20  ssible */.  if( 
15560 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
15570 3d 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20  ==eFileLock ){. 
15580 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
15590 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  _OK;.  }..  /* T
155a0 6f 20 64 6f 77 6e 67 72 61 64 65 20 74 6f 20 73  o downgrade to s
155b0 68 61 72 65 64 2c 20 73 69 6d 70 6c 79 20 75 70  hared, simply up
155c0 64 61 74 65 20 6f 75 72 20 69 6e 74 65 72 6e 61  date our interna
155d0 6c 20 6e 6f 74 69 6f 6e 20 6f 66 20 74 68 65 0a  l notion of the.
155e0 20 20 2a 2a 20 6c 6f 63 6b 20 73 74 61 74 65 2e    ** lock state.
155f0 20 20 4e 6f 20 6e 65 65 64 20 74 6f 20 6d 65 73    No need to mes
15600 73 20 77 69 74 68 20 74 68 65 20 66 69 6c 65 20  s with the file 
15610 6f 6e 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20  on disk..  */.  
15620 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  if( eFileLock==S
15630 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  HARED_LOCK ){.  
15640 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
15650 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b  ck = SHARED_LOCK
15660 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
15670 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20  ITE_OK;.  }.  . 
15680 20 2f 2a 20 54 6f 20 66 75 6c 6c 79 20 75 6e 6c   /* To fully unl
15690 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65  ock the database
156a0 2c 20 64 65 6c 65 74 65 20 74 68 65 20 6c 6f 63  , delete the loc
156b0 6b 20 66 69 6c 65 20 2a 2f 0a 20 20 61 73 73 65  k file */.  asse
156c0 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 4e  rt( eFileLock==N
156d0 4f 5f 4c 4f 43 4b 20 29 3b 0a 20 20 72 63 20 3d  O_LOCK );.  rc =
156e0 20 6f 73 52 6d 64 69 72 28 7a 4c 6f 63 6b 46 69   osRmdir(zLockFi
156f0 6c 65 29 3b 0a 20 20 69 66 28 20 72 63 3c 30 20  le);.  if( rc<0 
15700 26 26 20 65 72 72 6e 6f 3d 3d 45 4e 4f 54 44 49  && errno==ENOTDI
15710 52 20 29 20 72 63 20 3d 20 6f 73 55 6e 6c 69 6e  R ) rc = osUnlin
15720 6b 28 7a 4c 6f 63 6b 46 69 6c 65 29 3b 0a 20 20  k(zLockFile);.  
15730 69 66 28 20 72 63 3c 30 20 29 7b 0a 20 20 20 20  if( rc<0 ){.    
15740 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72  int tErrno = err
15750 6e 6f 3b 0a 20 20 20 20 72 63 20 3d 20 30 3b 0a  no;.    rc = 0;.
15760 20 20 20 20 69 66 28 20 45 4e 4f 45 4e 54 20 21      if( ENOENT !
15770 3d 20 74 45 72 72 6e 6f 20 29 7b 0a 23 69 66 20  = tErrno ){.#if 
15780 4f 53 4c 4f 43 4b 49 4e 47 5f 43 48 45 43 4b 5f  OSLOCKING_CHECK_
15790 42 55 53 59 5f 49 4f 45 52 52 0a 20 20 20 20 20  BUSY_IOERR.     
157a0 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f   rc = sqliteErro
157b0 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28  rFromPosixError(
157c0 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49  tErrno, SQLITE_I
157d0 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 23 65  OERR_UNLOCK);.#e
157e0 6c 73 65 0a 20 20 20 20 20 20 72 63 20 3d 20 53  lse.      rc = S
157f0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
15800 43 4b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d  CK;.#endif.    }
15810 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b  .    if( IS_LOCK
15820 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20  _ERROR(rc) ){.  
15830 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72      storeLastErr
15840 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f  no(pFile, tErrno
15850 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  );.    }.    ret
15860 75 72 6e 20 72 63 3b 20 0a 20 20 7d 0a 20 20 70  urn rc; .  }.  p
15870 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
15880 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 72 65 74  = NO_LOCK;.  ret
15890 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
158a0 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20  ../*.** Close a 
158b0 66 69 6c 65 2e 20 20 4d 61 6b 65 20 73 75 72 65  file.  Make sure
158c0 20 74 68 65 20 6c 6f 63 6b 20 68 61 73 20 62 65   the lock has be
158d0 65 6e 20 72 65 6c 65 61 73 65 64 20 62 65 66 6f  en released befo
158e0 72 65 20 63 6c 6f 73 69 6e 67 2e 0a 2a 2f 0a 73  re closing..*/.s
158f0 74 61 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63  tatic int dotloc
15900 6b 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66  kClose(sqlite3_f
15910 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69 6e 74  ile *id) {.  int
15920 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
15930 0a 20 20 69 66 28 20 69 64 20 29 7b 0a 20 20 20  .  if( id ){.   
15940 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
15950 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
15960 3b 0a 20 20 20 20 64 6f 74 6c 6f 63 6b 55 6e 6c  ;.    dotlockUnl
15970 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29  ock(id, NO_LOCK)
15980 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
15990 65 65 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e  ee(pFile->lockin
159a0 67 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 72  gContext);.    r
159b0 63 20 3d 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c  c = closeUnixFil
159c0 65 28 69 64 29 3b 0a 20 20 7d 0a 20 20 72 65 74  e(id);.  }.  ret
159d0 75 72 6e 20 72 63 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a  urn rc;.}./*****
159e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e  ************* En
159f0 64 20 6f 66 20 74 68 65 20 64 6f 74 2d 66 69 6c  d of the dot-fil
15a00 65 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74  e lock implement
15a10 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ation **********
15a20 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
15a30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15a40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15a50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15a60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15a70 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 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 2a  ****************
15ab0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15ac0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 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 20 42 65 67 69 6e 20 66 6c 6f 63  ***** Begin floc
15af0 6b 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a  k Locking ******
15b00 2a 2a 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 0a 2a 2a 0a 2a 2a  **********.**.**
15b20 20 55 73 65 20 74 68 65 20 66 6c 6f 63 6b 28 29   Use the flock()
15b30 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 74 6f 20   system call to 
15b40 64 6f 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2e  do file locking.
15b50 0a 2a 2a 0a 2a 2a 20 66 6c 6f 63 6b 28 29 20 6c  .**.** flock() l
15b60 6f 63 6b 69 6e 67 20 69 73 20 6c 69 6b 65 20 64  ocking is like d
15b70 6f 74 2d 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20  ot-file locking 
15b80 69 6e 20 74 68 61 74 20 74 68 65 20 76 61 72 69  in that the vari
15b90 6f 75 73 0a 2a 2a 20 66 69 6e 65 2d 67 72 61 69  ous.** fine-grai
15ba0 6e 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 73  n locking levels
15bb0 20 73 75 70 70 6f 72 74 65 64 20 62 79 20 53 51   supported by SQ
15bc0 4c 69 74 65 20 61 72 65 20 63 6f 6c 6c 61 70 73  Lite are collaps
15bd0 65 64 20 69 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e  ed into.** a sin
15be0 67 6c 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f  gle exclusive lo
15bf0 63 6b 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  ck.  In other wo
15c00 72 64 73 2c 20 53 48 41 52 45 44 2c 20 52 45 53  rds, SHARED, RES
15c10 45 52 56 45 44 2c 20 61 6e 64 0a 2a 2a 20 50 45  ERVED, and.** PE
15c20 4e 44 49 4e 47 20 6c 6f 63 6b 73 20 61 72 65 20  NDING locks are 
15c30 74 68 65 20 73 61 6d 65 20 74 68 69 6e 67 20 61  the same thing a
15c40 73 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  s an EXCLUSIVE l
15c50 6f 63 6b 2e 20 20 53 51 4c 69 74 65 0a 2a 2a 20  ock.  SQLite.** 
15c60 73 74 69 6c 6c 20 77 6f 72 6b 73 20 77 68 65 6e  still works when
15c70 20 79 6f 75 20 64 6f 20 74 68 69 73 2c 20 62 75   you do this, bu
15c80 74 20 63 6f 6e 63 75 72 72 65 6e 63 79 20 69 73  t concurrency is
15c90 20 72 65 64 75 63 65 64 20 73 69 6e 63 65 0a 2a   reduced since.*
15ca0 2a 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20  * only a single 
15cb0 70 72 6f 63 65 73 73 20 63 61 6e 20 62 65 20 72  process can be r
15cc0 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61 62  eading the datab
15cd0 61 73 65 20 61 74 20 61 20 74 69 6d 65 2e 0a 2a  ase at a time..*
15ce0 2a 0a 2a 2a 20 4f 6d 69 74 20 74 68 69 73 20 73  *.** Omit this s
15cf0 65 63 74 69 6f 6e 20 69 66 20 53 51 4c 49 54 45  ection if SQLITE
15d00 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
15d10 53 54 59 4c 45 20 69 73 20 74 75 72 6e 65 64 20  STYLE is turned 
15d20 6f 66 66 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54  off.*/.#if SQLIT
15d30 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
15d40 5f 53 54 59 4c 45 0a 0a 2f 2a 0a 2a 2a 20 52 65  _STYLE../*.** Re
15d50 74 72 79 20 66 6c 6f 63 6b 28 29 20 63 61 6c 6c  try flock() call
15d60 73 20 74 68 61 74 20 66 61 69 6c 20 77 69 74 68  s that fail with
15d70 20 45 49 4e 54 52 0a 2a 2f 0a 23 69 66 64 65 66   EINTR.*/.#ifdef
15d80 20 45 49 4e 54 52 0a 73 74 61 74 69 63 20 69 6e   EINTR.static in
15d90 74 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 69  t robust_flock(i
15da0 6e 74 20 66 64 2c 20 69 6e 74 20 6f 70 29 7b 0a  nt fd, int op){.
15db0 20 20 69 6e 74 20 72 63 3b 0a 20 20 64 6f 7b 20    int rc;.  do{ 
15dc0 72 63 20 3d 20 66 6c 6f 63 6b 28 66 64 2c 6f 70  rc = flock(fd,op
15dd0 29 3b 20 7d 77 68 69 6c 65 28 20 72 63 3c 30 20  ); }while( rc<0 
15de0 26 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20  && errno==EINTR 
15df0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
15e00 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
15e10 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 61 2c   robust_flock(a,
15e20 62 29 20 66 6c 6f 63 6b 28 61 2c 62 29 0a 23 65  b) flock(a,b).#e
15e30 6e 64 69 66 0a 20 20 20 20 20 0a 0a 2f 2a 0a 2a  ndif.     ../*.*
15e40 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
15e50 68 65 63 6b 73 20 69 66 20 74 68 65 72 65 20 69  hecks if there i
15e60 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  s a RESERVED loc
15e70 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70  k held on the sp
15e80 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20  ecified.** file 
15e90 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f  by this or any o
15ea0 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66  ther process. If
15eb0 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20   such a lock is 
15ec0 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f  held, set *pResO
15ed0 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a  ut.** to a non-z
15ee0 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77  ero value otherw
15ef0 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20  ise *pResOut is 
15f00 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68  set to zero.  Th
15f10 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a  e return value.*
15f20 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49  * is set to SQLI
15f30 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20  TE_OK unless an 
15f40 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73  I/O error occurs
15f50 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65   during lock che
15f60 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  cking..*/.static
15f70 20 69 6e 74 20 66 6c 6f 63 6b 43 68 65 63 6b 52   int flockCheckR
15f80 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69  eservedLock(sqli
15f90 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
15fa0 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20 69  t *pResOut){.  i
15fb0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
15fc0 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65  K;.  int reserve
15fd0 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c  d = 0;.  unixFil
15fe0 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
15ff0 46 69 6c 65 2a 29 69 64 3b 0a 20 20 0a 20 20 53  File*)id;.  .  S
16000 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
16010 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
16020 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45  ERR_CHECKRESERVE
16030 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61  DLOCK; );.  .  a
16040 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
16050 20 20 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66    .  /* Check if
16060 20 61 20 74 68 72 65 61 64 20 69 6e 20 74 68 69   a thread in thi
16070 73 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20  s process holds 
16080 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20  such a lock */. 
16090 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c   if( pFile->eFil
160a0 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43  eLock>SHARED_LOC
160b0 4b 20 29 7b 0a 20 20 20 20 72 65 73 65 72 76 65  K ){.    reserve
160c0 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a 20 20  d = 1;.  }.  .  
160d0 2f 2a 20 4f 74 68 65 72 77 69 73 65 20 73 65 65  /* Otherwise see
160e0 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 70   if some other p
160f0 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 69 74 2e  rocess holds it.
16100 20 2a 2f 0a 20 20 69 66 28 20 21 72 65 73 65 72   */.  if( !reser
16110 76 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20 61 74  ved ){.    /* at
16120 74 65 6d 70 74 20 74 6f 20 67 65 74 20 74 68 65  tempt to get the
16130 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 69 6e 74   lock */.    int
16140 20 6c 72 63 20 3d 20 72 6f 62 75 73 74 5f 66 6c   lrc = robust_fl
16150 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f  ock(pFile->h, LO
16160 43 4b 5f 45 58 20 7c 20 4c 4f 43 4b 5f 4e 42 29  CK_EX | LOCK_NB)
16170 3b 0a 20 20 20 20 69 66 28 20 21 6c 72 63 20 29  ;.    if( !lrc )
16180 7b 0a 20 20 20 20 20 20 2f 2a 20 67 6f 74 20 74  {.      /* got t
16190 68 65 20 6c 6f 63 6b 2c 20 75 6e 6c 6f 63 6b 20  he lock, unlock 
161a0 69 74 20 2a 2f 0a 20 20 20 20 20 20 6c 72 63 20  it */.      lrc 
161b0 3d 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 70  = robust_flock(p
161c0 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 55 4e  File->h, LOCK_UN
161d0 29 3b 0a 20 20 20 20 20 20 69 66 20 28 20 6c 72  );.      if ( lr
161e0 63 20 29 20 7b 0a 20 20 20 20 20 20 20 20 69 6e  c ) {.        in
161f0 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  t tErrno = errno
16200 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 75 6e 6c  ;.        /* unl
16210 6f 63 6b 20 66 61 69 6c 65 64 20 77 69 74 68 20  ock failed with 
16220 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 23 69 66 20  an error */.#if 
16230 4f 53 4c 4f 43 4b 49 4e 47 5f 43 48 45 43 4b 5f  OSLOCKING_CHECK_
16240 42 55 53 59 5f 49 4f 45 52 52 0a 20 20 20 20 20  BUSY_IOERR.     
16250 20 20 20 6c 72 63 20 3d 20 73 71 6c 69 74 65 45     lrc = sqliteE
16260 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
16270 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54  or(tErrno, SQLIT
16280 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b  E_IOERR_UNLOCK);
16290 0a 23 65 6c 73 65 20 0a 20 20 20 20 20 20 20 20  .#else .        
162a0 6c 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45  lrc = SQLITE_IOE
162b0 52 52 5f 55 4e 4c 4f 43 4b 3b 20 0a 23 65 6e 64  RR_UNLOCK; .#end
162c0 69 66 0a 20 20 20 20 20 20 20 20 69 66 28 20 49  if.        if( I
162d0 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63  S_LOCK_ERROR(lrc
162e0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  ) ){.          s
162f0 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46  toreLastErrno(pF
16300 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20  ile, tErrno);.  
16310 20 20 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63          rc = lrc
16320 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
16330 20 20 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b    }.    } else {
16340 0a 20 20 20 20 20 20 69 6e 74 20 74 45 72 72 6e  .      int tErrn
16350 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
16360 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20   reserved = 1;. 
16370 20 20 20 20 20 2f 2a 20 73 6f 6d 65 6f 6e 65 20       /* someone 
16380 65 6c 73 65 20 6d 69 67 68 74 20 68 61 76 65 20  else might have 
16390 69 74 20 72 65 73 65 72 76 65 64 20 2a 2f 0a 20  it reserved */. 
163a0 20 20 20 20 20 6c 72 63 20 3d 20 73 71 6c 69 74       lrc = sqlit
163b0 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45  eErrorFromPosixE
163c0 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c  rror(tErrno, SQL
163d0 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b  ITE_IOERR_LOCK);
163e0 20 0a 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c   .      if( IS_L
163f0 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 29 20 29  OCK_ERROR(lrc) )
16400 7b 0a 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c  {.        storeL
16410 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20  astErrno(pFile, 
16420 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 20  tErrno);.       
16430 20 72 63 20 3d 20 6c 72 63 3b 0a 20 20 20 20 20   rc = lrc;.     
16440 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 4f   }.    }.  }.  O
16450 53 54 52 41 43 45 28 28 22 54 45 53 54 20 57 52  STRACE(("TEST WR
16460 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 20 28  -LOCK %d %d %d (
16470 66 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65  flock)\n", pFile
16480 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65 72 76 65  ->h, rc, reserve
16490 64 29 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  d));..#ifdef SQL
164a0 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b  ITE_IGNORE_FLOCK
164b0 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20 20 69  _LOCK_ERRORS.  i
164c0 66 28 20 28 72 63 20 26 20 53 51 4c 49 54 45 5f  f( (rc & SQLITE_
164d0 49 4f 45 52 52 29 20 3d 3d 20 53 51 4c 49 54 45  IOERR) == SQLITE
164e0 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20 20 72 63  _IOERR ){.    rc
164f0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
16500 20 20 72 65 73 65 72 76 65 64 3d 31 3b 0a 20 20    reserved=1;.  
16510 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
16520 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f  TE_IGNORE_FLOCK_
16530 4c 4f 43 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a 20  LOCK_ERRORS */. 
16540 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65   *pResOut = rese
16550 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72  rved;.  return r
16560 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b  c;.}../*.** Lock
16570 20 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74   the file with t
16580 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65  he lock specifie
16590 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 65  d by parameter e
165a0 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a  FileLock - one.*
165b0 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  * of the followi
165c0 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31  ng:.**.**     (1
165d0 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a  ) SHARED_LOCK.**
165e0 20 20 20 20 20 28 32 29 20 52 45 53 45 52 56 45       (2) RESERVE
165f0 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33  D_LOCK.**     (3
16600 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a  ) PENDING_LOCK.*
16610 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c 55 53  *     (4) EXCLUS
16620 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53  IVE_LOCK.**.** S
16630 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65  ometimes when re
16640 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63  questing one loc
16650 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f  k state, additio
16660 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a  nal lock states.
16670 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64 20  ** are inserted 
16680 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65  in between.  The
16690 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66   locking might f
166a0 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68  ail on one of th
166b0 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73  e later.** trans
166c0 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74  itions leaving t
166d0 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69  he lock state di
166e0 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61  fferent from wha
166f0 74 20 69 74 20 73 74 61 72 74 65 64 20 62 75 74  t it started but
16700 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20  .** still short 
16710 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68  of its goal.  Th
16720 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72  e following char
16730 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f  t shows the allo
16740 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f  wed.** transitio
16750 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72  ns and the inser
16760 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65  ted intermediate
16770 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20   states:.**.**  
16780 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48    UNLOCKED -> SH
16790 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45  ARED.**    SHARE
167a0 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a  D -> RESERVED.**
167b0 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50      SHARED -> (P
167c0 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55  ENDING) -> EXCLU
167d0 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52  SIVE.**    RESER
167e0 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  VED -> (PENDING)
167f0 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
16800 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45      PENDING -> E
16810 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 66  XCLUSIVE.**.** f
16820 6c 6f 63 6b 28 29 20 6f 6e 6c 79 20 72 65 61 6c  lock() only real
16830 6c 79 20 73 75 70 70 6f 72 74 20 45 58 43 4c 55  ly support EXCLU
16840 53 49 56 45 20 6c 6f 63 6b 73 2e 20 20 57 65 20  SIVE locks.  We 
16850 74 72 61 63 6b 20 69 6e 74 65 72 6d 65 64 69 61  track intermedia
16860 74 65 0a 2a 2a 20 6c 6f 63 6b 20 73 74 61 74 65  te.** lock state
16870 73 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65 33  s in the sqlite3
16880 5f 66 69 6c 65 20 73 74 72 75 63 74 75 72 65 2c  _file structure,
16890 20 62 75 74 20 61 6c 6c 20 6c 6f 63 6b 73 20 53   but all locks S
168a0 48 41 52 45 44 20 6f 72 0a 2a 2a 20 61 62 6f 76  HARED or.** abov
168b0 65 20 61 72 65 20 72 65 61 6c 6c 79 20 45 58 43  e are really EXC
168c0 4c 55 53 49 56 45 20 6c 6f 63 6b 73 20 61 6e 64  LUSIVE locks and
168d0 20 65 78 63 6c 75 64 65 20 61 6c 6c 20 6f 74 68   exclude all oth
168e0 65 72 20 70 72 6f 63 65 73 73 65 73 20 66 72 6f  er processes fro
168f0 6d 0a 2a 2a 20 61 63 63 65 73 73 20 74 68 65 20  m.** access the 
16900 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  file..**.** This
16910 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e   routine will on
16920 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f  ly increase a lo
16930 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c  ck.  Use the sql
16940 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a  ite3OsUnlock().*
16950 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77  * routine to low
16960 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  er a locking lev
16970 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  el..*/.static in
16980 74 20 66 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69  t flockLock(sqli
16990 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
169a0 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20  t eFileLock) {. 
169b0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
169c0 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20  _OK;.  unixFile 
169d0 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
169e0 6c 65 2a 29 69 64 3b 0a 0a 20 20 61 73 73 65 72  le*)id;..  asser
169f0 74 28 20 70 46 69 6c 65 20 29 3b 0a 0a 20 20 2f  t( pFile );..  /
16a00 2a 20 69 66 20 77 65 20 61 6c 72 65 61 64 79 20  * if we already 
16a10 68 61 76 65 20 61 20 6c 6f 63 6b 2c 20 69 74 20  have a lock, it 
16a20 69 73 20 65 78 63 6c 75 73 69 76 65 2e 20 20 0a  is exclusive.  .
16a30 20 20 2a 2a 20 4a 75 73 74 20 61 64 6a 75 73 74    ** Just adjust
16a40 20 6c 65 76 65 6c 20 61 6e 64 20 70 75 6e 74 20   level and punt 
16a50 6f 6e 20 6f 75 74 74 61 20 68 65 72 65 2e 20 2a  on outta here. *
16a60 2f 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 65  /.  if (pFile->e
16a70 46 69 6c 65 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c 4f  FileLock > NO_LO
16a80 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d  CK) {.    pFile-
16a90 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69  >eFileLock = eFi
16aa0 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 72 65 74 75  leLock;.    retu
16ab0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
16ac0 7d 0a 20 20 0a 20 20 2f 2a 20 67 72 61 62 20 61  }.  .  /* grab a
16ad0 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
16ae0 20 2a 2f 0a 20 20 0a 20 20 69 66 20 28 72 6f 62   */.  .  if (rob
16af0 75 73 74 5f 66 6c 6f 63 6b 28 70 46 69 6c 65 2d  ust_flock(pFile-
16b00 3e 68 2c 20 4c 4f 43 4b 5f 45 58 20 7c 20 4c 4f  >h, LOCK_EX | LO
16b10 43 4b 5f 4e 42 29 29 20 7b 0a 20 20 20 20 69 6e  CK_NB)) {.    in
16b20 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  t tErrno = errno
16b30 3b 0a 20 20 20 20 2f 2a 20 64 69 64 6e 27 74 20  ;.    /* didn't 
16b40 67 65 74 2c 20 6d 75 73 74 20 62 65 20 62 75 73  get, must be bus
16b50 79 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71  y */.    rc = sq
16b60 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73  liteErrorFromPos
16b70 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20  ixError(tErrno, 
16b80 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43  SQLITE_IOERR_LOC
16b90 4b 29 3b 0a 20 20 20 20 69 66 28 20 49 53 5f 4c  K);.    if( IS_L
16ba0 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b  OCK_ERROR(rc) ){
16bb0 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74  .      storeLast
16bc0 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72  Errno(pFile, tEr
16bd0 72 6e 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 20  rno);.    }.  } 
16be0 65 6c 73 65 20 7b 0a 20 20 20 20 2f 2a 20 67 6f  else {.    /* go
16bf0 74 20 69 74 2c 20 73 65 74 20 74 68 65 20 74 79  t it, set the ty
16c00 70 65 20 61 6e 64 20 72 65 74 75 72 6e 20 6f 6b  pe and return ok
16c10 20 2a 2f 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65   */.    pFile->e
16c20 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65  FileLock = eFile
16c30 4c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 4f 53 54 52  Lock;.  }.  OSTR
16c40 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64  ACE(("LOCK    %d
16c50 20 25 73 20 25 73 20 28 66 6c 6f 63 6b 29 5c 6e   %s %s (flock)\n
16c60 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 61 7a 46  ", pFile->h, azF
16c70 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63  ileLock(eFileLoc
16c80 6b 29 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  k), .           
16c90 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20  rc==SQLITE_OK ? 
16ca0 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29  "ok" : "failed")
16cb0 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
16cc0 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f  _IGNORE_FLOCK_LO
16cd0 43 4b 5f 45 52 52 4f 52 53 0a 20 20 69 66 28 20  CK_ERRORS.  if( 
16ce0 28 72 63 20 26 20 53 51 4c 49 54 45 5f 49 4f 45  (rc & SQLITE_IOE
16cf0 52 52 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f  RR) == SQLITE_IO
16d00 45 52 52 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ERR ){.    rc = 
16d10 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d  SQLITE_BUSY;.  }
16d20 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
16d30 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c  E_IGNORE_FLOCK_L
16d40 4f 43 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a 20 20  OCK_ERRORS */.  
16d50 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
16d60 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c  *.** Lower the l
16d70 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20  ocking level on 
16d80 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
16d90 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f  pFile to eFileLo
16da0 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a  ck.  eFileLock.*
16db0 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  * must be either
16dc0 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52   NO_LOCK or SHAR
16dd0 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49  ED_LOCK..**.** I
16de0 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  f the locking le
16df0 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20  vel of the file 
16e00 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c  descriptor is al
16e10 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f  ready at or belo
16e20 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74  w.** the request
16e30 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  ed locking level
16e40 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
16e50 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
16e60 61 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b 55 6e  atic int flockUn
16e70 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  lock(sqlite3_fil
16e80 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65  e *id, int eFile
16e90 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69  Lock) {.  unixFi
16ea0 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
16eb0 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 0a 20 20  xFile*)id;.  .  
16ec0 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b  assert( pFile );
16ed0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4c  .  OSTRACE(("UNL
16ee0 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73 20 25  OCK  %d %d was %
16ef0 64 20 70 69 64 3d 25 64 20 28 66 6c 6f 63 6b 29  d pid=%d (flock)
16f00 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65  \n", pFile->h, e
16f10 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20  FileLock,.      
16f20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c       pFile->eFil
16f30 65 4c 6f 63 6b 2c 20 6f 73 47 65 74 70 69 64 28  eLock, osGetpid(
16f40 30 29 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20  0)));.  assert( 
16f50 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45  eFileLock<=SHARE
16f60 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f  D_LOCK );.  .  /
16f70 2a 20 6e 6f 2d 6f 70 20 69 66 20 70 6f 73 73 69  * no-op if possi
16f80 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ble */.  if( pFi
16f90 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 65  le->eFileLock==e
16fa0 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  FileLock ){.    
16fb0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
16fc0 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 73 68  ;.  }.  .  /* sh
16fd0 61 72 65 64 20 63 61 6e 20 6a 75 73 74 20 62 65  ared can just be
16fe0 20 73 65 74 20 62 65 63 61 75 73 65 20 77 65 20   set because we 
16ff0 61 6c 77 61 79 73 20 68 61 76 65 20 61 6e 20 65  always have an e
17000 78 63 6c 75 73 69 76 65 20 2a 2f 0a 20 20 69 66  xclusive */.  if
17010 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41   (eFileLock==SHA
17020 52 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20  RED_LOCK) {.    
17030 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
17040 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20   = eFileLock;.  
17050 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
17060 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20  OK;.  }.  .  /* 
17070 6e 6f 2c 20 72 65 61 6c 6c 79 2c 20 75 6e 6c 6f  no, really, unlo
17080 63 6b 2e 20 2a 2f 0a 20 20 69 66 28 20 72 6f 62  ck. */.  if( rob
17090 75 73 74 5f 66 6c 6f 63 6b 28 70 46 69 6c 65 2d  ust_flock(pFile-
170a0 3e 68 2c 20 4c 4f 43 4b 5f 55 4e 29 20 29 7b 0a  >h, LOCK_UN) ){.
170b0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 49 47  #ifdef SQLITE_IG
170c0 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f  NORE_FLOCK_LOCK_
170d0 45 52 52 4f 52 53 0a 20 20 20 20 72 65 74 75 72  ERRORS.    retur
170e0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e  n SQLITE_OK;.#en
170f0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47  dif /* SQLITE_IG
17100 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f  NORE_FLOCK_LOCK_
17110 45 52 52 4f 52 53 20 2a 2f 0a 20 20 20 20 72 65  ERRORS */.    re
17120 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
17130 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 7d 65 6c 73  R_UNLOCK;.  }els
17140 65 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46  e{.    pFile->eF
17150 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43  ileLock = NO_LOC
17160 4b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  K;.    return SQ
17170 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a  LITE_OK;.  }.}..
17180 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69  /*.** Close a fi
17190 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
171a0 74 20 66 6c 6f 63 6b 43 6c 6f 73 65 28 73 71 6c  t flockClose(sql
171b0 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b  ite3_file *id) {
171c0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
171d0 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 69 64 20  TE_OK;.  if( id 
171e0 29 7b 0a 20 20 20 20 66 6c 6f 63 6b 55 6e 6c 6f  ){.    flockUnlo
171f0 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b  ck(id, NO_LOCK);
17200 0a 20 20 20 20 72 63 20 3d 20 63 6c 6f 73 65 55  .    rc = closeU
17210 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 20 20 7d  nixFile(id);.  }
17220 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
17230 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
17240 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
17250 5f 53 54 59 4c 45 20 26 26 20 21 4f 53 5f 56 58  _STYLE && !OS_VX
17260 57 4f 52 4b 20 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a  WORK */../******
17270 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e  ************* En
17280 64 20 6f 66 20 74 68 65 20 66 6c 6f 63 6b 20 6c  d of the flock l
17290 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ock implementati
172a0 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  on *************
172b0 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
172c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
172d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
172e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
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 2f 0a 0a 2f 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 2a 2a  ****************
17340 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17350 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 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 20 42 65 67 69 6e 20 4e 61 6d 65 64 20 53  ** Begin Named S
17380 65 6d 61 70 68 6f 72 65 20 4c 6f 63 6b 69 6e 67  emaphore Locking
17390 20 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 0a 2a 2a 0a 2a 2a 20  *********.**.** 
173b0 4e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65 20  Named semaphore 
173c0 6c 6f 63 6b 69 6e 67 20 69 73 20 6f 6e 6c 79 20  locking is only 
173d0 73 75 70 70 6f 72 74 65 64 20 6f 6e 20 56 78 57  supported on VxW
173e0 6f 72 6b 73 2e 0a 2a 2a 0a 2a 2a 20 53 65 6d 61  orks..**.** Sema
173f0 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 69 73  phore locking is
17400 20 6c 69 6b 65 20 64 6f 74 2d 6c 6f 63 6b 20 61   like dot-lock a
17410 6e 64 20 66 6c 6f 63 6b 20 69 6e 20 74 68 61 74  nd flock in that
17420 20 69 74 20 72 65 61 6c 6c 79 20 6f 6e 6c 79 0a   it really only.
17430 2a 2a 20 73 75 70 70 6f 72 74 73 20 45 58 43 4c  ** supports EXCL
17440 55 53 49 56 45 20 6c 6f 63 6b 69 6e 67 2e 20 20  USIVE locking.  
17450 4f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 70 72  Only a single pr
17460 6f 63 65 73 73 20 63 61 6e 20 72 65 61 64 20 6f  ocess can read o
17470 72 20 77 72 69 74 65 0a 2a 2a 20 74 68 65 20 64  r write.** the d
17480 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 74 20  atabase file at 
17490 61 20 74 69 6d 65 2e 20 20 54 68 69 73 20 72 65  a time.  This re
174a0 64 75 63 65 73 20 70 6f 74 65 6e 74 69 61 6c 20  duces potential 
174b0 63 6f 6e 63 75 72 72 65 6e 63 79 2c 20 62 75 74  concurrency, but
174c0 0a 2a 2a 20 6d 61 6b 65 73 20 74 68 65 20 6c 6f  .** makes the lo
174d0 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ck implementatio
174e0 6e 20 6d 75 63 68 20 65 61 73 69 65 72 2e 0a 2a  n much easier..*
174f0 2f 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53  /.#if OS_VXWORKS
17500 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
17510 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74  tine checks if t
17520 68 65 72 65 20 69 73 20 61 20 52 45 53 45 52 56  here is a RESERV
17530 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20  ED lock held on 
17540 74 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a  the specified.**
17550 20 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72   file by this or
17560 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65   any other proce
17570 73 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f  ss. If such a lo
17580 63 6b 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20  ck is held, set 
17590 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61  *pResOut.** to a
175a0 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20   non-zero value 
175b0 6f 74 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f  otherwise *pResO
175c0 75 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72  ut is set to zer
175d0 6f 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 76  o.  The return v
175e0 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74  alue.** is set t
175f0 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65  o SQLITE_OK unle
17600 73 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20  ss an I/O error 
17610 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f  occurs during lo
17620 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a  ck checking..*/.
17630 73 74 61 74 69 63 20 69 6e 74 20 73 65 6d 58 43  static int semXC
17640 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
17650 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
17660 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29  d, int *pResOut)
17670 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51   {.  int rc = SQ
17680 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72  LITE_OK;.  int r
17690 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 75  eserved = 0;.  u
176a0 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
176b0 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
176c0 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
176d0 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54  or( return SQLIT
176e0 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53  E_IOERR_CHECKRES
176f0 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20  ERVEDLOCK; );.  
17700 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
17710 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20   );..  /* Check 
17720 69 66 20 61 20 74 68 72 65 61 64 20 69 6e 20 74  if a thread in t
17730 68 69 73 20 70 72 6f 63 65 73 73 20 68 6f 6c 64  his process hold
17740 73 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f  s such a lock */
17750 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46  .  if( pFile->eF
17760 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c  ileLock>SHARED_L
17770 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 73 65 72  OCK ){.    reser
17780 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a  ved = 1;.  }.  .
17790 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 20 73    /* Otherwise s
177a0 65 65 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72  ee if some other
177b0 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 69   process holds i
177c0 74 2e 20 2a 2f 0a 20 20 69 66 28 20 21 72 65 73  t. */.  if( !res
177d0 65 72 76 65 64 20 29 7b 0a 20 20 20 20 73 65 6d  erved ){.    sem
177e0 5f 74 20 2a 70 53 65 6d 20 3d 20 70 46 69 6c 65  _t *pSem = pFile
177f0 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 3b 0a  ->pInode->pSem;.
17800 0a 20 20 20 20 69 66 28 20 73 65 6d 5f 74 72 79  .    if( sem_try
17810 77 61 69 74 28 70 53 65 6d 29 3d 3d 2d 31 20 29  wait(pSem)==-1 )
17820 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 45 72 72  {.      int tErr
17830 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
17840 20 20 69 66 28 20 45 41 47 41 49 4e 20 21 3d 20    if( EAGAIN != 
17850 74 45 72 72 6e 6f 20 29 7b 0a 20 20 20 20 20 20  tErrno ){.      
17860 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72    rc = sqliteErr
17870 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72  orFromPosixError
17880 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f  (tErrno, SQLITE_
17890 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52  IOERR_CHECKRESER
178a0 56 45 44 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  VEDLOCK);.      
178b0 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f    storeLastErrno
178c0 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b  (pFile, tErrno);
178d0 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  .      } else {.
178e0 20 20 20 20 20 20 20 20 2f 2a 20 73 6f 6d 65 6f          /* someo
178f0 6e 65 20 65 6c 73 65 20 68 61 73 20 74 68 65 20  ne else has the 
17900 6c 6f 63 6b 20 77 68 65 6e 20 77 65 20 61 72 65  lock when we are
17910 20 69 6e 20 4e 4f 5f 4c 4f 43 4b 20 2a 2f 0a 20   in NO_LOCK */. 
17920 20 20 20 20 20 20 20 72 65 73 65 72 76 65 64 20         reserved 
17930 3d 20 28 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  = (pFile->eFileL
17940 6f 63 6b 20 3c 20 53 48 41 52 45 44 5f 4c 4f 43  ock < SHARED_LOC
17950 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  K);.      }.    
17960 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
17970 77 65 20 63 6f 75 6c 64 20 68 61 76 65 20 69 74  we could have it
17980 20 69 66 20 77 65 20 77 61 6e 74 20 69 74 20 2a   if we want it *
17990 2f 0a 20 20 20 20 20 20 73 65 6d 5f 70 6f 73 74  /.      sem_post
179a0 28 70 53 65 6d 29 3b 0a 20 20 20 20 7d 0a 20 20  (pSem);.    }.  
179b0 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54 45  }.  OSTRACE(("TE
179c0 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64  ST WR-LOCK %d %d
179d0 20 25 64 20 28 73 65 6d 29 5c 6e 22 2c 20 70 46   %d (sem)\n", pF
179e0 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65  ile->h, rc, rese
179f0 72 76 65 64 29 29 3b 0a 0a 20 20 2a 70 52 65 73  rved));..  *pRes
17a00 4f 75 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0a  Out = reserved;.
17a10 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
17a20 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66  /*.** Lock the f
17a30 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63  ile with the loc
17a40 6b 20 73 70 65 63 69 66 69 65 64 20 62 79 20 70  k specified by p
17a50 61 72 61 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f  arameter eFileLo
17a60 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74  ck - one.** of t
17a70 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a  he following:.**
17a80 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48 41 52  .**     (1) SHAR
17a90 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28  ED_LOCK.**     (
17aa0 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  2) RESERVED_LOCK
17ab0 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44  .**     (3) PEND
17ac0 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  ING_LOCK.**     
17ad0 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  (4) EXCLUSIVE_LO
17ae0 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d  CK.**.** Sometim
17af0 65 73 20 77 68 65 6e 20 72 65 71 75 65 73 74 69  es when requesti
17b00 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74  ng one lock stat
17b10 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f  e, additional lo
17b20 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65  ck states.** are
17b30 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74   inserted in bet
17b40 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69  ween.  The locki
17b50 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e  ng might fail on
17b60 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65   one of the late
17b70 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73  r.** transitions
17b80 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63   leaving the loc
17b90 6b 20 73 74 61 74 65 20 64 69 66 66 65 72 65 6e  k state differen
17ba0 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73  t from what it s
17bb0 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74  tarted but.** st
17bc0 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73  ill short of its
17bd0 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c   goal.  The foll
17be0 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77  owing chart show
17bf0 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a  s the allowed.**
17c00 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64   transitions and
17c10 20 74 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e   the inserted in
17c20 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65  termediate state
17c30 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f  s:.**.**    UNLO
17c40 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a  CKED -> SHARED.*
17c50 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52  *    SHARED -> R
17c60 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48  ESERVED.**    SH
17c70 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47  ARED -> (PENDING
17c80 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  ) -> EXCLUSIVE.*
17c90 2a 20 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e  *    RESERVED ->
17ca0 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58   (PENDING) -> EX
17cb0 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45  CLUSIVE.**    PE
17cc0 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49  NDING -> EXCLUSI
17cd0 56 45 0a 2a 2a 0a 2a 2a 20 53 65 6d 61 70 68 6f  VE.**.** Semapho
17ce0 72 65 20 6c 6f 63 6b 73 20 6f 6e 6c 79 20 72 65  re locks only re
17cf0 61 6c 6c 79 20 73 75 70 70 6f 72 74 20 45 58 43  ally support EXC
17d00 4c 55 53 49 56 45 20 6c 6f 63 6b 73 2e 20 20 57  LUSIVE locks.  W
17d10 65 20 74 72 61 63 6b 20 69 6e 74 65 72 6d 65 64  e track intermed
17d20 69 61 74 65 0a 2a 2a 20 6c 6f 63 6b 20 73 74 61  iate.** lock sta
17d30 74 65 73 20 69 6e 20 74 68 65 20 73 71 6c 69 74  tes in the sqlit
17d40 65 33 5f 66 69 6c 65 20 73 74 72 75 63 74 75 72  e3_file structur
17d50 65 2c 20 62 75 74 20 61 6c 6c 20 6c 6f 63 6b 73  e, but all locks
17d60 20 53 48 41 52 45 44 20 6f 72 0a 2a 2a 20 61 62   SHARED or.** ab
17d70 6f 76 65 20 61 72 65 20 72 65 61 6c 6c 79 20 45  ove are really E
17d80 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73 20 61  XCLUSIVE locks a
17d90 6e 64 20 65 78 63 6c 75 64 65 20 61 6c 6c 20 6f  nd exclude all o
17da0 74 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 66  ther processes f
17db0 72 6f 6d 0a 2a 2a 20 61 63 63 65 73 73 20 74 68  rom.** access th
17dc0 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  e file..**.** Th
17dd0 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
17de0 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20  only increase a 
17df0 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73  lock.  Use the s
17e00 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29  qlite3OsUnlock()
17e10 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c  .** routine to l
17e20 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c  ower a locking l
17e30 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  evel..*/.static 
17e40 69 6e 74 20 73 65 6d 58 4c 6f 63 6b 28 73 71 6c  int semXLock(sql
17e50 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
17e60 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a  nt eFileLock) {.
17e70 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
17e80 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
17e90 64 3b 0a 20 20 73 65 6d 5f 74 20 2a 70 53 65 6d  d;.  sem_t *pSem
17ea0 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65   = pFile->pInode
17eb0 2d 3e 70 53 65 6d 3b 0a 20 20 69 6e 74 20 72 63  ->pSem;.  int rc
17ec0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
17ed0 20 2f 2a 20 69 66 20 77 65 20 61 6c 72 65 61 64   /* if we alread
17ee0 79 20 68 61 76 65 20 61 20 6c 6f 63 6b 2c 20 69  y have a lock, i
17ef0 74 20 69 73 20 65 78 63 6c 75 73 69 76 65 2e 20  t is exclusive. 
17f00 20 0a 20 20 2a 2a 20 4a 75 73 74 20 61 64 6a 75   .  ** Just adju
17f10 73 74 20 6c 65 76 65 6c 20 61 6e 64 20 70 75 6e  st level and pun
17f20 74 20 6f 6e 20 6f 75 74 74 61 20 68 65 72 65 2e  t on outta here.
17f30 20 2a 2f 0a 20 20 69 66 20 28 70 46 69 6c 65 2d   */.  if (pFile-
17f40 3e 65 46 69 6c 65 4c 6f 63 6b 20 3e 20 4e 4f 5f  >eFileLock > NO_
17f50 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c  LOCK) {.    pFil
17f60 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65  e->eFileLock = e
17f70 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 72 63  FileLock;.    rc
17f80 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
17f90 20 20 67 6f 74 6f 20 73 65 6d 5f 65 6e 64 5f 6c    goto sem_end_l
17fa0 6f 63 6b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  ock;.  }.  .  /*
17fb0 20 6c 6f 63 6b 20 73 65 6d 61 70 68 6f 72 65 20   lock semaphore 
17fc0 6e 6f 77 20 62 75 74 20 62 61 69 6c 20 6f 75 74  now but bail out
17fd0 20 77 68 65 6e 20 61 6c 72 65 61 64 79 20 6c 6f   when already lo
17fe0 63 6b 65 64 2e 20 2a 2f 0a 20 20 69 66 28 20 73  cked. */.  if( s
17ff0 65 6d 5f 74 72 79 77 61 69 74 28 70 53 65 6d 29  em_trywait(pSem)
18000 3d 3d 2d 31 20 29 7b 0a 20 20 20 20 72 63 20 3d  ==-1 ){.    rc =
18010 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
18020 20 20 67 6f 74 6f 20 73 65 6d 5f 65 6e 64 5f 6c    goto sem_end_l
18030 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 67  ock;.  }..  /* g
18040 6f 74 20 69 74 2c 20 73 65 74 20 74 68 65 20 74  ot it, set the t
18050 79 70 65 20 61 6e 64 20 72 65 74 75 72 6e 20 6f  ype and return o
18060 6b 20 2a 2f 0a 20 20 70 46 69 6c 65 2d 3e 65 46  k */.  pFile->eF
18070 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c  ileLock = eFileL
18080 6f 63 6b 3b 0a 0a 20 73 65 6d 5f 65 6e 64 5f 6c  ock;.. sem_end_l
18090 6f 63 6b 3a 0a 20 20 72 65 74 75 72 6e 20 72 63  ock:.  return rc
180a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72  ;.}../*.** Lower
180b0 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
180c0 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72  el on file descr
180d0 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65  iptor pFile to e
180e0 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65  FileLock.  eFile
180f0 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20  Lock.** must be 
18100 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f  either NO_LOCK o
18110 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a  r SHARED_LOCK..*
18120 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b  *.** If the lock
18130 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65  ing level of the
18140 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
18150 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f   is already at o
18160 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72  r below.** the r
18170 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67  equested locking
18180 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75   level, this rou
18190 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
181a0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
181b0 65 6d 58 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65  emXUnlock(sqlite
181c0 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
181d0 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75  eFileLock) {.  u
181e0 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
181f0 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
18200 20 20 73 65 6d 5f 74 20 2a 70 53 65 6d 20 3d 20    sem_t *pSem = 
18210 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70  pFile->pInode->p
18220 53 65 6d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  Sem;..  assert( 
18230 70 46 69 6c 65 20 29 3b 0a 20 20 61 73 73 65 72  pFile );.  asser
18240 74 28 20 70 53 65 6d 20 29 3b 0a 20 20 4f 53 54  t( pSem );.  OST
18250 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25  RACE(("UNLOCK  %
18260 64 20 25 64 20 77 61 73 20 25 64 20 70 69 64 3d  d %d was %d pid=
18270 25 64 20 28 73 65 6d 29 5c 6e 22 2c 20 70 46 69  %d (sem)\n", pFi
18280 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b  le->h, eFileLock
18290 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69  ,.           pFi
182a0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 6f  le->eFileLock, o
182b0 73 47 65 74 70 69 64 28 30 29 29 29 3b 0a 20 20  sGetpid(0)));.  
182c0 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63  assert( eFileLoc
182d0 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k<=SHARED_LOCK )
182e0 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f 70 20  ;.  .  /* no-op 
182f0 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 20  if possible */. 
18300 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c   if( pFile->eFil
18310 65 4c 6f 63 6b 3d 3d 65 46 69 6c 65 4c 6f 63 6b  eLock==eFileLock
18320 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
18330 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
18340 0a 20 20 2f 2a 20 73 68 61 72 65 64 20 63 61 6e  .  /* shared can
18350 20 6a 75 73 74 20 62 65 20 73 65 74 20 62 65 63   just be set bec
18360 61 75 73 65 20 77 65 20 61 6c 77 61 79 73 20 68  ause we always h
18370 61 76 65 20 61 6e 20 65 78 63 6c 75 73 69 76 65  ave an exclusive
18380 20 2a 2f 0a 20 20 69 66 20 28 65 46 69 6c 65 4c   */.  if (eFileL
18390 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
183a0 29 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65  ) {.    pFile->e
183b0 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65  FileLock = eFile
183c0 4c 6f 63 6b 3b 0a 20 20 20 20 72 65 74 75 72 6e  Lock;.    return
183d0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
183e0 20 20 0a 20 20 2f 2a 20 6e 6f 2c 20 72 65 61 6c    .  /* no, real
183f0 6c 79 20 75 6e 6c 6f 63 6b 2e 20 2a 2f 0a 20 20  ly unlock. */.  
18400 69 66 20 28 20 73 65 6d 5f 70 6f 73 74 28 70 53  if ( sem_post(pS
18410 65 6d 29 3d 3d 2d 31 20 29 20 7b 0a 20 20 20 20  em)==-1 ) {.    
18420 69 6e 74 20 72 63 2c 20 74 45 72 72 6e 6f 20 3d  int rc, tErrno =
18430 20 65 72 72 6e 6f 3b 0a 20 20 20 20 72 63 20 3d   errno;.    rc =
18440 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d   sqliteErrorFrom
18450 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e  PosixError(tErrn
18460 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  o, SQLITE_IOERR_
18470 55 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28  UNLOCK);.    if(
18480 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72   IS_LOCK_ERROR(r
18490 63 29 20 29 7b 0a 20 20 20 20 20 20 73 74 6f 72  c) ){.      stor
184a0 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65  eLastErrno(pFile
184b0 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 7d  , tErrno);.    }
184c0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 20  .    return rc; 
184d0 0a 20 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 65 46  .  }.  pFile->eF
184e0 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43  ileLock = NO_LOC
184f0 4b 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  K;.  return SQLI
18500 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2a  TE_OK;.}../*. **
18510 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 20   Close a file.. 
18520 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
18530 6d 58 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f  mXClose(sqlite3_
18540 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69 66  file *id) {.  if
18550 28 20 69 64 20 29 7b 0a 20 20 20 20 75 6e 69 78  ( id ){.    unix
18560 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
18570 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20  nixFile*)id;.   
18580 20 73 65 6d 58 55 6e 6c 6f 63 6b 28 69 64 2c 20   semXUnlock(id, 
18590 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 61 73  NO_LOCK);.    as
185a0 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20  sert( pFile );. 
185b0 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65     unixEnterMute
185c0 78 28 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65  x();.    release
185d0 49 6e 6f 64 65 49 6e 66 6f 28 70 46 69 6c 65 29  InodeInfo(pFile)
185e0 3b 0a 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d  ;.    unixLeaveM
185f0 75 74 65 78 28 29 3b 0a 20 20 20 20 63 6c 6f 73  utex();.    clos
18600 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 20  eUnixFile(id);. 
18610 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
18620 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64 69 66  TE_OK;.}..#endif
18630 20 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20 2a   /* OS_VXWORKS *
18640 2f 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65 64 20 73 65  /./*.** Named se
18650 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 20  maphore locking 
18660 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c  is only availabl
18670 65 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a  e on VxWorks..**
18680 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
18690 20 45 6e 64 20 6f 66 20 74 68 65 20 6e 61 6d 65   End of the name
186a0 64 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b  d semaphore lock
186b0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
186c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
186d0 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
186e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
186f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18700 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18710 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
18720 0a 0a 0a 2f 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 2a 2a 2a 2a 2a 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 0a 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 20 42  ************** B
18790 65 67 69 6e 20 41 46 50 20 4c 6f 63 6b 69 6e 67  egin AFP Locking
187a0 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 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 0a 2a 2a 0a 2a 2a 20 41 46 50 20 69 73 20  **.**.** AFP is 
187d0 74 68 65 20 41 70 70 6c 65 20 46 69 6c 69 6e 67  the Apple Filing
187e0 20 50 72 6f 74 6f 63 6f 6c 2e 20 20 41 46 50 20   Protocol.  AFP 
187f0 69 73 20 61 20 6e 65 74 77 6f 72 6b 20 66 69 6c  is a network fil
18800 65 73 79 73 74 65 6d 20 66 6f 75 6e 64 0a 2a 2a  esystem found.**
18810 20 6f 6e 20 41 70 70 6c 65 20 4d 61 63 69 6e 74   on Apple Macint
18820 6f 73 68 20 63 6f 6d 70 75 74 65 72 73 20 2d 20  osh computers - 
18830 62 6f 74 68 20 4f 53 39 20 61 6e 64 20 4f 53 58  both OS9 and OSX
18840 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 72 64 2d 70 61  ..**.** Third-pa
18850 72 74 79 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  rty implementati
18860 6f 6e 73 20 6f 66 20 41 46 50 20 61 72 65 20 61  ons of AFP are a
18870 76 61 69 6c 61 62 6c 65 2e 20 20 42 75 74 20 74  vailable.  But t
18880 68 69 73 20 63 6f 64 65 20 68 65 72 65 0a 2a 2a  his code here.**
18890 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 6f 6e 20 4f   only works on O
188a0 53 58 2e 0a 2a 2f 0a 0a 23 69 66 20 64 65 66 69  SX..*/..#if defi
188b0 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26  ned(__APPLE__) &
188c0 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  & SQLITE_ENABLE_
188d0 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a  LOCKING_STYLE./*
188e0 0a 2a 2a 20 54 68 65 20 61 66 70 4c 6f 63 6b 69  .** The afpLocki
188f0 6e 67 43 6f 6e 74 65 78 74 20 73 74 72 75 63 74  ngContext struct
18900 75 72 65 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c  ure contains all
18910 20 61 66 70 20 6c 6f 63 6b 20 73 70 65 63 69 66   afp lock specif
18920 69 63 20 73 74 61 74 65 0a 2a 2f 0a 74 79 70 65  ic state.*/.type
18930 64 65 66 20 73 74 72 75 63 74 20 61 66 70 4c 6f  def struct afpLo
18940 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 61 66 70  ckingContext afp
18950 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  LockingContext;.
18960 73 74 72 75 63 74 20 61 66 70 4c 6f 63 6b 69 6e  struct afpLockin
18970 67 43 6f 6e 74 65 78 74 20 7b 0a 20 20 69 6e 74  gContext {.  int
18980 20 72 65 73 65 72 76 65 64 3b 0a 20 20 63 6f 6e   reserved;.  con
18990 73 74 20 63 68 61 72 20 2a 64 62 50 61 74 68 3b  st char *dbPath;
189a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
189b0 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f 70 65 6e  Name of the open
189c0 20 66 69 6c 65 20 2a 2f 0a 7d 3b 0a 0a 73 74 72   file */.};..str
189d0 75 63 74 20 42 79 74 65 52 61 6e 67 65 4c 6f 63  uct ByteRangeLoc
189e0 6b 50 42 32 0a 7b 0a 20 20 75 6e 73 69 67 6e 65  kPB2.{.  unsigne
189f0 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6f 66 66 73  d long long offs
18a00 65 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 6f 66  et;        /* of
18a10 66 73 65 74 20 74 6f 20 66 69 72 73 74 20 62 79  fset to first by
18a20 74 65 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20  te to lock */.  
18a30 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f  unsigned long lo
18a40 6e 67 20 6c 65 6e 67 74 68 3b 20 20 20 20 20 20  ng length;      
18a50 20 20 2f 2a 20 6e 62 72 20 6f 66 20 62 79 74 65    /* nbr of byte
18a60 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75  s to lock */.  u
18a70 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e  nsigned long lon
18a80 67 20 72 65 74 52 61 6e 67 65 53 74 61 72 74 3b  g retRangeStart;
18a90 20 2f 2a 20 6e 62 72 20 6f 66 20 31 73 74 20 62   /* nbr of 1st b
18aa0 79 74 65 20 6c 6f 63 6b 65 64 20 69 66 20 73 75  yte locked if su
18ab0 63 63 65 73 73 66 75 6c 20 2a 2f 0a 20 20 75 6e  ccessful */.  un
18ac0 73 69 67 6e 65 64 20 63 68 61 72 20 75 6e 4c 6f  signed char unLo
18ad0 63 6b 46 6c 61 67 3b 20 20 20 20 20 20 20 20 20  ckFlag;         
18ae0 2f 2a 20 31 20 3d 20 75 6e 6c 6f 63 6b 2c 20 30  /* 1 = unlock, 0
18af0 20 3d 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75 6e 73   = lock */.  uns
18b00 69 67 6e 65 64 20 63 68 61 72 20 73 74 61 72 74  igned char start
18b10 45 6e 64 46 6c 61 67 3b 20 20 20 20 20 20 20 2f  EndFlag;       /
18b20 2a 20 31 3d 72 65 6c 20 74 6f 20 65 6e 64 20 6f  * 1=rel to end o
18b30 66 20 66 6f 72 6b 2c 20 30 3d 72 65 6c 20 74 6f  f fork, 0=rel to
18b40 20 73 74 61 72 74 20 2a 2f 0a 20 20 69 6e 74 20   start */.  int 
18b50 66 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  fd;             
18b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18b70 20 66 69 6c 65 20 64 65 73 63 20 74 6f 20 61 73   file desc to as
18b80 73 6f 63 20 74 68 69 73 20 6c 6f 63 6b 20 77 69  soc this lock wi
18b90 74 68 20 2a 2f 0a 7d 3b 0a 0a 23 64 65 66 69 6e  th */.};..#defin
18ba0 65 20 61 66 70 66 73 42 79 74 65 52 61 6e 67 65  e afpfsByteRange
18bb0 4c 6f 63 6b 32 46 53 43 54 4c 20 20 20 20 20 20  Lock2FSCTL      
18bc0 20 20 5f 49 4f 57 52 28 27 7a 27 2c 20 32 33 2c    _IOWR('z', 23,
18bd0 20 73 74 72 75 63 74 20 42 79 74 65 52 61 6e 67   struct ByteRang
18be0 65 4c 6f 63 6b 50 42 32 29 0a 0a 2f 2a 0a 2a 2a  eLockPB2)../*.**
18bf0 20 54 68 69 73 20 69 73 20 61 20 75 74 69 6c 69   This is a utili
18c00 74 79 20 66 6f 72 20 73 65 74 74 69 6e 67 20 6f  ty for setting o
18c10 72 20 63 6c 65 61 72 69 6e 67 20 61 20 62 69 74  r clearing a bit
18c20 2d 72 61 6e 67 65 20 6c 6f 63 6b 20 6f 6e 20 61  -range lock on a
18c30 6e 0a 2a 2a 20 41 46 50 20 66 69 6c 65 73 79 73  n.** AFP filesys
18c40 74 65 6d 2e 0a 2a 2a 20 0a 2a 2a 20 52 65 74 75  tem..** .** Retu
18c50 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
18c60 73 75 63 63 65 73 73 2c 20 53 51 4c 49 54 45 5f  success, SQLITE_
18c70 42 55 53 59 20 6f 6e 20 66 61 69 6c 75 72 65 2e  BUSY on failure.
18c80 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
18c90 66 70 53 65 74 4c 6f 63 6b 28 0a 20 20 63 6f 6e  fpSetLock(.  con
18ca0 73 74 20 63 68 61 72 20 2a 70 61 74 68 2c 20 20  st char *path,  
18cb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
18cc0 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ame of the file 
18cd0 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20 6f 72 20  to be locked or 
18ce0 75 6e 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 6e  unlocked */.  un
18cf0 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20  ixFile *pFile,  
18d00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18d10 4f 70 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69  Open file descri
18d20 70 74 6f 72 20 6f 6e 20 70 61 74 68 20 2a 2f 0a  ptor on path */.
18d30 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20    unsigned long 
18d40 6c 6f 6e 67 20 6f 66 66 73 65 74 2c 20 20 20 20  long offset,    
18d50 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 74   /* First byte t
18d60 6f 20 62 65 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20  o be locked */. 
18d70 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c   unsigned long l
18d80 6f 6e 67 20 6c 65 6e 67 74 68 2c 20 20 20 20 20  ong length,     
18d90 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
18da0 65 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20  es to lock */.  
18db0 69 6e 74 20 73 65 74 4c 6f 63 6b 46 6c 61 67 20  int setLockFlag 
18dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
18dd0 2a 20 54 72 75 65 20 74 6f 20 73 65 74 20 6c 6f  * True to set lo
18de0 63 6b 2e 20 20 46 61 6c 73 65 20 74 6f 20 63 6c  ck.  False to cl
18df0 65 61 72 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20  ear lock */.){. 
18e00 20 73 74 72 75 63 74 20 42 79 74 65 52 61 6e 67   struct ByteRang
18e10 65 4c 6f 63 6b 50 42 32 20 70 62 3b 0a 20 20 69  eLockPB2 pb;.  i
18e20 6e 74 20 65 72 72 3b 0a 20 20 0a 20 20 70 62 2e  nt err;.  .  pb.
18e30 75 6e 4c 6f 63 6b 46 6c 61 67 20 3d 20 73 65 74  unLockFlag = set
18e40 4c 6f 63 6b 46 6c 61 67 20 3f 20 30 20 3a 20 31  LockFlag ? 0 : 1
18e50 3b 0a 20 20 70 62 2e 73 74 61 72 74 45 6e 64 46  ;.  pb.startEndF
18e60 6c 61 67 20 3d 20 30 3b 0a 20 20 70 62 2e 6f 66  lag = 0;.  pb.of
18e70 66 73 65 74 20 3d 20 6f 66 66 73 65 74 3b 0a 20  fset = offset;. 
18e80 20 70 62 2e 6c 65 6e 67 74 68 20 3d 20 6c 65 6e   pb.length = len
18e90 67 74 68 3b 20 0a 20 20 70 62 2e 66 64 20 3d 20  gth; .  pb.fd = 
18ea0 70 46 69 6c 65 2d 3e 68 3b 0a 20 20 0a 20 20 4f  pFile->h;.  .  O
18eb0 53 54 52 41 43 45 28 28 22 41 46 50 53 45 54 4c  STRACE(("AFPSETL
18ec0 4f 43 4b 20 5b 25 73 5d 20 66 6f 72 20 25 64 25  OCK [%s] for %d%
18ed0 73 20 69 6e 20 72 61 6e 67 65 20 25 6c 6c 78 3a  s in range %llx:
18ee0 25 6c 6c 78 5c 6e 22 2c 20 0a 20 20 20 20 28 73  %llx\n", .    (s
18ef0 65 74 4c 6f 63 6b 46 6c 61 67 3f 22 4f 4e 22 3a  etLockFlag?"ON":
18f00 22 4f 46 46 22 29 2c 20 70 46 69 6c 65 2d 3e 68  "OFF"), pFile->h
18f10 2c 20 28 70 62 2e 66 64 3d 3d 2d 31 3f 22 5b 74  , (pb.fd==-1?"[t
18f20 65 73 74 76 61 6c 2d 31 5d 22 3a 22 22 29 2c 0a  estval-1]":""),.
18f30 20 20 20 20 6f 66 66 73 65 74 2c 20 6c 65 6e 67      offset, leng
18f40 74 68 29 29 3b 0a 20 20 65 72 72 20 3d 20 66 73  th));.  err = fs
18f50 63 74 6c 28 70 61 74 68 2c 20 61 66 70 66 73 42  ctl(path, afpfsB
18f60 79 74 65 52 61 6e 67 65 4c 6f 63 6b 32 46 53 43  yteRangeLock2FSC
18f70 54 4c 2c 20 26 70 62 2c 20 30 29 3b 0a 20 20 69  TL, &pb, 0);.  i
18f80 66 20 28 20 65 72 72 3d 3d 2d 31 20 29 20 7b 0a  f ( err==-1 ) {.
18f90 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20      int rc;.    
18fa0 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72  int tErrno = err
18fb0 6e 6f 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28  no;.    OSTRACE(
18fc0 28 22 41 46 50 53 45 54 4c 4f 43 4b 20 66 61 69  ("AFPSETLOCK fai
18fd0 6c 65 64 20 74 6f 20 66 73 63 74 6c 28 29 20 27  led to fsctl() '
18fe0 25 73 27 20 25 64 20 25 73 5c 6e 22 2c 0a 20 20  %s' %d %s\n",.  
18ff0 20 20 20 20 20 20 20 20 20 20 20 70 61 74 68 2c             path,
19000 20 74 45 72 72 6e 6f 2c 20 73 74 72 65 72 72 6f   tErrno, strerro
19010 72 28 74 45 72 72 6e 6f 29 29 29 3b 0a 23 69 66  r(tErrno)));.#if
19020 64 65 66 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52  def SQLITE_IGNOR
19030 45 5f 41 46 50 5f 4c 4f 43 4b 5f 45 52 52 4f 52  E_AFP_LOCK_ERROR
19040 53 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  S.    rc = SQLIT
19050 45 5f 42 55 53 59 3b 0a 23 65 6c 73 65 0a 20 20  E_BUSY;.#else.  
19060 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72    rc = sqliteErr
19070 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72  orFromPosixError
19080 28 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20 20 20  (tErrno,.       
19090 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74               set
190a0 4c 6f 63 6b 46 6c 61 67 20 3f 20 53 51 4c 49 54  LockFlag ? SQLIT
190b0 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 20 3a 20 53  E_IOERR_LOCK : S
190c0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
190d0 43 4b 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53  CK);.#endif /* S
190e0 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 41 46 50  QLITE_IGNORE_AFP
190f0 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a  _LOCK_ERRORS */.
19100 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f      if( IS_LOCK_
19110 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20  ERROR(rc) ){.   
19120 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e     storeLastErrn
19130 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29  o(pFile, tErrno)
19140 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
19150 72 6e 20 72 63 3b 0a 20 20 7d 20 65 6c 73 65 20  rn rc;.  } else 
19160 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
19170 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ITE_OK;.  }.}../
19180 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
19190 65 20 63 68 65 63 6b 73 20 69 66 20 74 68 65 72  e checks if ther
191a0 65 20 69 73 20 61 20 52 45 53 45 52 56 45 44 20  e is a RESERVED 
191b0 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65  lock held on the
191c0 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69   specified.** fi
191d0 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e  le by this or an
191e0 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e  y other process.
191f0 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20   If such a lock 
19200 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52  is held, set *pR
19210 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f  esOut.** to a no
19220 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74 68  n-zero value oth
19230 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75 74 20  erwise *pResOut 
19240 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20  is set to zero. 
19250 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
19260 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53  e.** is set to S
19270 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20  QLITE_OK unless 
19280 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63  an I/O error occ
19290 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20  urs during lock 
192a0 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61  checking..*/.sta
192b0 74 69 63 20 69 6e 74 20 61 66 70 43 68 65 63 6b  tic int afpCheck
192c0 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c  ReservedLock(sql
192d0 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
192e0 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20  nt *pResOut){.  
192f0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
19300 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65 72 76  OK;.  int reserv
19310 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69  ed = 0;.  unixFi
19320 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
19330 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 61 66 70  xFile*)id;.  afp
19340 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
19350 63 6f 6e 74 65 78 74 3b 0a 20 20 0a 20 20 53 69  context;.  .  Si
19360 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
19370 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
19380 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44  RR_CHECKRESERVED
19390 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73  LOCK; );.  .  as
193a0 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20  sert( pFile );. 
193b0 20 63 6f 6e 74 65 78 74 20 3d 20 28 61 66 70 4c   context = (afpL
193c0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29  ockingContext *)
193d0 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43   pFile->lockingC
193e0 6f 6e 74 65 78 74 3b 0a 20 20 69 66 28 20 63 6f  ontext;.  if( co
193f0 6e 74 65 78 74 2d 3e 72 65 73 65 72 76 65 64 20  ntext->reserved 
19400 29 7b 0a 20 20 20 20 2a 70 52 65 73 4f 75 74 20  ){.    *pResOut 
19410 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 1;.    return 
19420 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
19430 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
19440 29 3b 20 2f 2a 20 42 65 63 61 75 73 65 20 70 46  ); /* Because pF
19450 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 69 73 20 73  ile->pInode is s
19460 68 61 72 65 64 20 61 63 72 6f 73 73 20 74 68 72  hared across thr
19470 65 61 64 73 20 2a 2f 0a 20 20 0a 20 20 2f 2a 20  eads */.  .  /* 
19480 43 68 65 63 6b 20 69 66 20 61 20 74 68 72 65 61  Check if a threa
19490 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73  d in this proces
194a0 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c  s holds such a l
194b0 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ock */.  if( pFi
194c0 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c  le->pInode->eFil
194d0 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43  eLock>SHARED_LOC
194e0 4b 20 29 7b 0a 20 20 20 20 72 65 73 65 72 76 65  K ){.    reserve
194f0 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a 20 20  d = 1;.  }.  .  
19500 2f 2a 20 4f 74 68 65 72 77 69 73 65 20 73 65 65  /* Otherwise see
19510 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 70   if some other p
19520 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 69 74 2e  rocess holds it.
19530 0a 20 20 20 2a 2f 0a 20 20 69 66 28 20 21 72 65  .   */.  if( !re
19540 73 65 72 76 65 64 20 29 7b 0a 20 20 20 20 2f 2a  served ){.    /*
19550 20 6c 6f 63 6b 20 74 68 65 20 52 45 53 45 52 56   lock the RESERV
19560 45 44 20 62 79 74 65 20 2a 2f 0a 20 20 20 20 69  ED byte */.    i
19570 6e 74 20 6c 72 63 20 3d 20 61 66 70 53 65 74 4c  nt lrc = afpSetL
19580 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50  ock(context->dbP
19590 61 74 68 2c 20 70 46 69 6c 65 2c 20 52 45 53 45  ath, pFile, RESE
195a0 52 56 45 44 5f 42 59 54 45 2c 20 31 2c 31 29 3b  RVED_BYTE, 1,1);
195b0 20 20 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54    .    if( SQLIT
195c0 45 5f 4f 4b 3d 3d 6c 72 63 20 29 7b 0a 20 20 20  E_OK==lrc ){.   
195d0 20 20 20 2f 2a 20 69 66 20 77 65 20 73 75 63 63     /* if we succ
195e0 65 65 64 65 64 20 69 6e 20 74 61 6b 69 6e 67 20  eeded in taking 
195f0 74 68 65 20 72 65 73 65 72 76 65 64 20 6c 6f 63  the reserved loc
19600 6b 2c 20 75 6e 6c 6f 63 6b 20 69 74 20 74 6f 20  k, unlock it to 
19610 72 65 73 74 6f 72 65 0a 20 20 20 20 20 20 2a 2a  restore.      **
19620 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 73 74   the original st
19630 61 74 65 20 2a 2f 0a 20 20 20 20 20 20 6c 72 63  ate */.      lrc
19640 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f   = afpSetLock(co
19650 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70  ntext->dbPath, p
19660 46 69 6c 65 2c 20 52 45 53 45 52 56 45 44 5f 42  File, RESERVED_B
19670 59 54 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  YTE, 1, 0);.    
19680 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 2f  } else {.      /
19690 2a 20 69 66 20 77 65 20 66 61 69 6c 65 64 20 74  * if we failed t
196a0 6f 20 67 65 74 20 74 68 65 20 6c 6f 63 6b 20 74  o get the lock t
196b0 68 65 6e 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65  hen someone else
196c0 20 6d 75 73 74 20 68 61 76 65 20 69 74 20 2a 2f   must have it */
196d0 0a 20 20 20 20 20 20 72 65 73 65 72 76 65 64 20  .      reserved 
196e0 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = 1;.    }.    i
196f0 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
19700 28 6c 72 63 29 20 29 7b 0a 20 20 20 20 20 20 72  (lrc) ){.      r
19710 63 3d 6c 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d  c=lrc;.    }.  }
19720 0a 20 20 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d  .  .  unixLeaveM
19730 75 74 65 78 28 29 3b 0a 20 20 4f 53 54 52 41 43  utex();.  OSTRAC
19740 45 28 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b  E(("TEST WR-LOCK
19750 20 25 64 20 25 64 20 25 64 20 28 61 66 70 29 5c   %d %d %d (afp)\
19760 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63  n", pFile->h, rc
19770 2c 20 72 65 73 65 72 76 65 64 29 29 3b 0a 20 20  , reserved));.  
19780 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65  .  *pResOut = re
19790 73 65 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e  served;.  return
197a0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f   rc;.}../*.** Lo
197b0 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74 68  ck the file with
197c0 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66   the lock specif
197d0 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72  ied by parameter
197e0 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65   eFileLock - one
197f0 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  .** of the follo
19800 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  wing:.**.**     
19810 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a  (1) SHARED_LOCK.
19820 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53 45 52  **     (2) RESER
19830 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  VED_LOCK.**     
19840 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  (3) PENDING_LOCK
19850 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c  .**     (4) EXCL
19860 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a  USIVE_LOCK.**.**
19870 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20   Sometimes when 
19880 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c  requesting one l
19890 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74  ock state, addit
198a0 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65  ional lock state
198b0 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65  s.** are inserte
198c0 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54  d in between.  T
198d0 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74  he locking might
198e0 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20   fail on one of 
198f0 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61  the later.** tra
19900 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67  nsitions leaving
19910 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20   the lock state 
19920 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77  different from w
19930 68 61 74 20 69 74 20 73 74 61 72 74 65 64 20 62  hat it started b
19940 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72  ut.** still shor
19950 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20  t of its goal.  
19960 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68  The following ch
19970 61 72 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c  art shows the al
19980 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74  lowed.** transit
19990 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73  ions and the ins
199a0 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61  erted intermedia
199b0 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a  te states:.**.**
199c0 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20      UNLOCKED -> 
199d0 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41  SHARED.**    SHA
199e0 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a  RED -> RESERVED.
199f0 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20  **    SHARED -> 
19a00 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43  (PENDING) -> EXC
19a10 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53  LUSIVE.**    RES
19a20 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e  ERVED -> (PENDIN
19a30 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  G) -> EXCLUSIVE.
19a40 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e  **    PENDING ->
19a50 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a   EXCLUSIVE.**.**
19a60 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   This routine wi
19a70 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65  ll only increase
19a80 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68   a lock.  Use th
19a90 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63  e sqlite3OsUnloc
19aa0 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74  k().** routine t
19ab0 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e  o lower a lockin
19ac0 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74  g level..*/.stat
19ad0 69 63 20 69 6e 74 20 61 66 70 4c 6f 63 6b 28 73  ic int afpLock(s
19ae0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
19af0 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b   int eFileLock){
19b00 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
19b10 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c  TE_OK;.  unixFil
19b20 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
19b30 46 69 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69 78  File*)id;.  unix
19b40 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64  InodeInfo *pInod
19b50 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  e = pFile->pInod
19b60 65 3b 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43  e;.  afpLockingC
19b70 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 20  ontext *context 
19b80 3d 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e  = (afpLockingCon
19b90 74 65 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c  text *) pFile->l
19ba0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20  ockingContext;. 
19bb0 20 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c   .  assert( pFil
19bc0 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  e );.  OSTRACE((
19bd0 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 77  "LOCK    %d %s w
19be0 61 73 20 25 73 28 25 73 2c 25 64 29 20 70 69 64  as %s(%s,%d) pid
19bf0 3d 25 64 20 28 61 66 70 29 5c 6e 22 2c 20 70 46  =%d (afp)\n", pF
19c00 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20  ile->h,.        
19c10 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46     azFileLock(eF
19c20 69 6c 65 4c 6f 63 6b 29 2c 20 61 7a 46 69 6c 65  ileLock), azFile
19c30 4c 6f 63 6b 28 70 46 69 6c 65 2d 3e 65 46 69 6c  Lock(pFile->eFil
19c40 65 4c 6f 63 6b 29 2c 0a 20 20 20 20 20 20 20 20  eLock),.        
19c50 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 70 49     azFileLock(pI
19c60 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29  node->eFileLock)
19c70 2c 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  , pInode->nShare
19c80 64 20 2c 20 6f 73 47 65 74 70 69 64 28 30 29 29  d , osGetpid(0))
19c90 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72  );..  /* If ther
19ca0 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 6c  e is already a l
19cb0 6f 63 6b 20 6f 66 20 74 68 69 73 20 74 79 70 65  ock of this type
19cc0 20 6f 72 20 6d 6f 72 65 20 72 65 73 74 72 69 63   or more restric
19cd0 74 69 76 65 20 6f 6e 20 74 68 65 0a 20 20 2a 2a  tive on the.  **
19ce0 20 75 6e 69 78 46 69 6c 65 2c 20 64 6f 20 6e 6f   unixFile, do no
19cf0 74 68 69 6e 67 2e 20 44 6f 6e 27 74 20 75 73 65  thing. Don't use
19d00 20 74 68 65 20 61 66 70 5f 65 6e 64 5f 6c 6f 63   the afp_end_loc
19d10 6b 3a 20 65 78 69 74 20 70 61 74 68 2c 20 61 73  k: exit path, as
19d20 0a 20 20 2a 2a 20 75 6e 69 78 45 6e 74 65 72 4d  .  ** unixEnterM
19d30 75 74 65 78 28 29 20 68 61 73 6e 27 74 20 62 65  utex() hasn't be
19d40 65 6e 20 63 61 6c 6c 65 64 20 79 65 74 2e 0a 20  en called yet.. 
19d50 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   */.  if( pFile-
19d60 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 65 46 69 6c  >eFileLock>=eFil
19d70 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 4f 53 54  eLock ){.    OST
19d80 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25  RACE(("LOCK    %
19d90 64 20 25 73 20 6f 6b 20 28 61 6c 72 65 61 64 79  d %s ok (already
19da0 20 68 65 6c 64 29 20 28 61 66 70 29 5c 6e 22 2c   held) (afp)\n",
19db0 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20   pFile->h,.     
19dc0 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b        azFileLock
19dd0 28 65 46 69 6c 65 4c 6f 63 6b 29 29 29 3b 0a 20  (eFileLock)));. 
19de0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
19df0 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d  _OK;.  }..  /* M
19e00 61 6b 65 20 73 75 72 65 20 74 68 65 20 6c 6f 63  ake sure the loc
19e10 6b 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73  king sequence is
19e20 20 63 6f 72 72 65 63 74 0a 20 20 2a 2a 20 20 28   correct.  **  (
19e30 31 29 20 57 65 20 6e 65 76 65 72 20 6d 6f 76 65  1) We never move
19e40 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64 20 74   from unlocked t
19e50 6f 20 61 6e 79 74 68 69 6e 67 20 68 69 67 68 65  o anything highe
19e60 72 20 74 68 61 6e 20 73 68 61 72 65 64 20 6c 6f  r than shared lo
19e70 63 6b 2e 0a 20 20 2a 2a 20 20 28 32 29 20 53 51  ck..  **  (2) SQ
19e80 4c 69 74 65 20 6e 65 76 65 72 20 65 78 70 6c 69  Lite never expli
19e90 63 69 74 6c 79 20 72 65 71 75 65 73 74 73 20 61  citly requests a
19ea0 20 70 65 6e 64 69 67 20 6c 6f 63 6b 2e 0a 20 20   pendig lock..  
19eb0 2a 2a 20 20 28 33 29 20 41 20 73 68 61 72 65 64  **  (3) A shared
19ec0 20 6c 6f 63 6b 20 69 73 20 61 6c 77 61 79 73 20   lock is always 
19ed0 68 65 6c 64 20 77 68 65 6e 20 61 20 72 65 73 65  held when a rese
19ee0 72 76 65 20 6c 6f 63 6b 20 69 73 20 72 65 71 75  rve lock is requ
19ef0 65 73 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73  ested..  */.  as
19f00 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 65 46 69  sert( pFile->eFi
19f10 6c 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c 4f 43 4b 20  leLock!=NO_LOCK 
19f20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  || eFileLock==SH
19f30 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61  ARED_LOCK );.  a
19f40 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b  ssert( eFileLock
19f50 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29  !=PENDING_LOCK )
19f60 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c  ;.  assert( eFil
19f70 65 4c 6f 63 6b 21 3d 52 45 53 45 52 56 45 44 5f  eLock!=RESERVED_
19f80 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c 65 2d 3e 65  LOCK || pFile->e
19f90 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
19fa0 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a  _LOCK );.  .  /*
19fb0 20 54 68 69 73 20 6d 75 74 65 78 20 69 73 20 6e   This mutex is n
19fc0 65 65 64 65 64 20 62 65 63 61 75 73 65 20 70 46  eeded because pF
19fd0 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 69 73 20 73  ile->pInode is s
19fe0 68 61 72 65 64 20 61 63 72 6f 73 73 20 74 68 72  hared across thr
19ff0 65 61 64 73 0a 20 20 2a 2f 0a 20 20 75 6e 69 78  eads.  */.  unix
1a000 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
1a010 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e  pInode = pFile->
1a020 70 49 6e 6f 64 65 3b 0a 0a 20 20 2f 2a 20 49 66  pInode;..  /* If
1a030 20 73 6f 6d 65 20 74 68 72 65 61 64 20 75 73 69   some thread usi
1a040 6e 67 20 74 68 69 73 20 50 49 44 20 68 61 73 20  ng this PID has 
1a050 61 20 6c 6f 63 6b 20 76 69 61 20 61 20 64 69 66  a lock via a dif
1a060 66 65 72 65 6e 74 20 75 6e 69 78 46 69 6c 65 2a  ferent unixFile*
1a070 0a 20 20 2a 2a 20 68 61 6e 64 6c 65 20 74 68 61  .  ** handle tha
1a080 74 20 70 72 65 63 6c 75 64 65 73 20 74 68 65 20  t precludes the 
1a090 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 2c 20  requested lock, 
1a0a0 72 65 74 75 72 6e 20 42 55 53 59 2e 0a 20 20 2a  return BUSY..  *
1a0b0 2f 0a 20 20 69 66 28 20 28 70 46 69 6c 65 2d 3e  /.  if( (pFile->
1a0c0 65 46 69 6c 65 4c 6f 63 6b 21 3d 70 49 6e 6f 64  eFileLock!=pInod
1a0d0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 26 26 20  e->eFileLock && 
1a0e0 0a 20 20 20 20 20 20 20 28 70 49 6e 6f 64 65 2d  .       (pInode-
1a0f0 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 50 45 4e 44  >eFileLock>=PEND
1a100 49 4e 47 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c  ING_LOCK || eFil
1a110 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43  eLock>SHARED_LOC
1a120 4b 29 29 0a 20 20 20 20 20 29 7b 0a 20 20 20 20  K)).     ){.    
1a130 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
1a140 3b 0a 20 20 20 20 67 6f 74 6f 20 61 66 70 5f 65  ;.    goto afp_e
1a150 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 0a  nd_lock;.  }.  .
1a160 20 20 2f 2a 20 49 66 20 61 20 53 48 41 52 45 44    /* If a SHARED
1a170 20 6c 6f 63 6b 20 69 73 20 72 65 71 75 65 73 74   lock is request
1a180 65 64 2c 20 61 6e 64 20 73 6f 6d 65 20 74 68 72  ed, and some thr
1a190 65 61 64 20 75 73 69 6e 67 20 74 68 69 73 20 50  ead using this P
1a1a0 49 44 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20  ID already.  ** 
1a1b0 68 61 73 20 61 20 53 48 41 52 45 44 20 6f 72 20  has a SHARED or 
1a1c0 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 74  RESERVED lock, t
1a1d0 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 72 65  hen increment re
1a1e0 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 73 20 61  ference counts a
1a1f0 6e 64 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 53  nd.  ** return S
1a200 51 4c 49 54 45 5f 4f 4b 2e 0a 20 20 2a 2f 0a 20  QLITE_OK..  */. 
1a210 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d   if( eFileLock==
1a220 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20 0a  SHARED_LOCK && .
1a230 20 20 20 20 20 28 70 49 6e 6f 64 65 2d 3e 65 46       (pInode->eF
1a240 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
1a250 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e  LOCK || pInode->
1a260 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52  eFileLock==RESER
1a270 56 45 44 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20  VED_LOCK) ){.   
1a280 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f   assert( eFileLo
1a290 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
1a2a0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
1a2b0 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  File->eFileLock=
1a2c0 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
1a2d0 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  ( pInode->nShare
1a2e0 64 3e 30 20 29 3b 0a 20 20 20 20 70 46 69 6c 65  d>0 );.    pFile
1a2f0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48  ->eFileLock = SH
1a300 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70  ARED_LOCK;.    p
1a310 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2b 2b  Inode->nShared++
1a320 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c  ;.    pInode->nL
1a330 6f 63 6b 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20  ock++;.    goto 
1a340 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20  afp_end_lock;.  
1a350 7d 0a 20 20 20 20 0a 20 20 2f 2a 20 41 20 50 45  }.    .  /* A PE
1a360 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 6e 65  NDING lock is ne
1a370 65 64 65 64 20 62 65 66 6f 72 65 20 61 63 71 75  eded before acqu
1a380 69 72 69 6e 67 20 61 20 53 48 41 52 45 44 20 6c  iring a SHARED l
1a390 6f 63 6b 20 61 6e 64 20 62 65 66 6f 72 65 0a 20  ock and before. 
1a3a0 20 2a 2a 20 61 63 71 75 69 72 69 6e 67 20 61 6e   ** acquiring an
1a3b0 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e   EXCLUSIVE lock.
1a3c0 20 20 46 6f 72 20 74 68 65 20 53 48 41 52 45 44    For the SHARED
1a3d0 20 6c 6f 63 6b 2c 20 74 68 65 20 50 45 4e 44 49   lock, the PENDI
1a3e0 4e 47 20 77 69 6c 6c 0a 20 20 2a 2a 20 62 65 20  NG will.  ** be 
1a3f0 72 65 6c 65 61 73 65 64 2e 0a 20 20 2a 2f 0a 20  released..  */. 
1a400 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d   if( eFileLock==
1a410 53 48 41 52 45 44 5f 4c 4f 43 4b 20 0a 20 20 20  SHARED_LOCK .   
1a420 20 20 20 7c 7c 20 28 65 46 69 6c 65 4c 6f 63 6b     || (eFileLock
1a430 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
1a440 20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65   && pFile->eFile
1a450 4c 6f 63 6b 3c 50 45 4e 44 49 4e 47 5f 4c 4f 43  Lock<PENDING_LOC
1a460 4b 29 0a 20 20 29 7b 0a 20 20 20 20 69 6e 74 20  K).  ){.    int 
1a470 66 61 69 6c 65 64 3b 0a 20 20 20 20 66 61 69 6c  failed;.    fail
1a480 65 64 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28  ed = afpSetLock(
1a490 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c  context->dbPath,
1a4a0 20 70 46 69 6c 65 2c 20 50 45 4e 44 49 4e 47 5f   pFile, PENDING_
1a4b0 42 59 54 45 2c 20 31 2c 20 31 29 3b 0a 20 20 20  BYTE, 1, 1);.   
1a4c0 20 69 66 20 28 66 61 69 6c 65 64 29 20 7b 0a 20   if (failed) {. 
1a4d0 20 20 20 20 20 72 63 20 3d 20 66 61 69 6c 65 64       rc = failed
1a4e0 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 66 70  ;.      goto afp
1a4f0 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d  _end_lock;.    }
1a500 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 49 66 20  .  }.  .  /* If 
1a510 63 6f 6e 74 72 6f 6c 20 67 65 74 73 20 74 6f 20  control gets to 
1a520 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e  this point, then
1a530 20 61 63 74 75 61 6c 6c 79 20 67 6f 20 61 68 65   actually go ahe
1a540 61 64 20 61 6e 64 20 6d 61 6b 65 0a 20 20 2a 2a  ad and make.  **
1a550 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
1a560 6d 20 63 61 6c 6c 73 20 66 6f 72 20 74 68 65 20  m calls for the 
1a570 73 70 65 63 69 66 69 65 64 20 6c 6f 63 6b 2e 0a  specified lock..
1a580 20 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65    */.  if( eFile
1a590 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
1a5a0 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 6c 72 63  K ){.    int lrc
1a5b0 31 2c 20 6c 72 63 32 2c 20 6c 72 63 31 45 72 72  1, lrc2, lrc1Err
1a5c0 6e 6f 20 3d 20 30 3b 0a 20 20 20 20 6c 6f 6e 67  no = 0;.    long
1a5d0 20 6c 6b 2c 20 6d 61 73 6b 3b 0a 20 20 20 20 0a   lk, mask;.    .
1a5e0 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f      assert( pIno
1a5f0 64 65 2d 3e 6e 53 68 61 72 65 64 3d 3d 30 20 29  de->nShared==0 )
1a600 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49  ;.    assert( pI
1a610 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  node->eFileLock=
1a620 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 0a 20  =0 );.        . 
1a630 20 20 20 6d 61 73 6b 20 3d 20 28 73 69 7a 65 6f     mask = (sizeo
1a640 66 28 6c 6f 6e 67 29 3d 3d 38 29 20 3f 20 4c 41  f(long)==8) ? LA
1a650 52 47 45 53 54 5f 49 4e 54 36 34 20 3a 20 30 78  RGEST_INT64 : 0x
1a660 37 66 66 66 66 66 66 66 3b 0a 20 20 20 20 2f 2a  7fffffff;.    /*
1a670 20 4e 6f 77 20 67 65 74 20 74 68 65 20 72 65 61   Now get the rea
1a680 64 2d 6c 6f 63 6b 20 53 48 41 52 45 44 5f 4c 4f  d-lock SHARED_LO
1a690 43 4b 20 2a 2f 0a 20 20 20 20 2f 2a 20 6e 6f 74  CK */.    /* not
1a6a0 65 20 74 68 61 74 20 74 68 65 20 71 75 61 6c 69  e that the quali
1a6b0 74 79 20 6f 66 20 74 68 65 20 72 61 6e 64 6f 6d  ty of the random
1a6c0 6e 65 73 73 20 64 6f 65 73 6e 27 74 20 6d 61 74  ness doesn't mat
1a6d0 74 65 72 20 74 68 61 74 20 6d 75 63 68 20 2a 2f  ter that much */
1a6e0 0a 20 20 20 20 6c 6b 20 3d 20 72 61 6e 64 6f 6d  .    lk = random
1a6f0 28 29 3b 20 0a 20 20 20 20 70 49 6e 6f 64 65 2d  (); .    pInode-
1a700 3e 73 68 61 72 65 64 42 79 74 65 20 3d 20 28 6c  >sharedByte = (l
1a710 6b 20 26 20 6d 61 73 6b 29 25 28 53 48 41 52 45  k & mask)%(SHARE
1a720 44 5f 53 49 5a 45 20 2d 20 31 29 3b 0a 20 20 20  D_SIZE - 1);.   
1a730 20 6c 72 63 31 20 3d 20 61 66 70 53 65 74 4c 6f   lrc1 = afpSetLo
1a740 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61  ck(context->dbPa
1a750 74 68 2c 20 70 46 69 6c 65 2c 20 0a 20 20 20 20  th, pFile, .    
1a760 20 20 20 20 20 20 53 48 41 52 45 44 5f 46 49 52        SHARED_FIR
1a770 53 54 2b 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65  ST+pInode->share
1a780 64 42 79 74 65 2c 20 31 2c 20 31 29 3b 0a 20 20  dByte, 1, 1);.  
1a790 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52    if( IS_LOCK_ER
1a7a0 52 4f 52 28 6c 72 63 31 29 20 29 7b 0a 20 20 20  ROR(lrc1) ){.   
1a7b0 20 20 20 6c 72 63 31 45 72 72 6e 6f 20 3d 20 70     lrc1Errno = p
1a7c0 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3b  File->lastErrno;
1a7d0 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 44 72  .    }.    /* Dr
1a7e0 6f 70 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  op the temporary
1a7f0 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 2a 2f   PENDING lock */
1a800 0a 20 20 20 20 6c 72 63 32 20 3d 20 61 66 70 53  .    lrc2 = afpS
1a810 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
1a820 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 50  dbPath, pFile, P
1a830 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 31 2c 20  ENDING_BYTE, 1, 
1a840 30 29 3b 0a 20 20 20 20 0a 20 20 20 20 69 66 28  0);.    .    if(
1a850 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c   IS_LOCK_ERROR(l
1a860 72 63 31 29 20 29 20 7b 0a 20 20 20 20 20 20 73  rc1) ) {.      s
1a870 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46  toreLastErrno(pF
1a880 69 6c 65 2c 20 6c 72 63 31 45 72 72 6e 6f 29 3b  ile, lrc1Errno);
1a890 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63 31  .      rc = lrc1
1a8a0 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 66 70  ;.      goto afp
1a8b0 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d  _end_lock;.    }
1a8c0 20 65 6c 73 65 20 69 66 28 20 49 53 5f 4c 4f 43   else if( IS_LOC
1a8d0 4b 5f 45 52 52 4f 52 28 6c 72 63 32 29 20 29 7b  K_ERROR(lrc2) ){
1a8e0 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63 32  .      rc = lrc2
1a8f0 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 66 70  ;.      goto afp
1a900 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d  _end_lock;.    }
1a910 20 65 6c 73 65 20 69 66 28 20 6c 72 63 31 20 21   else if( lrc1 !
1a920 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 29 20 7b 0a  = SQLITE_OK ) {.
1a930 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63 31 3b        rc = lrc1;
1a940 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  .    } else {.  
1a950 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
1a960 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f  Lock = SHARED_LO
1a970 43 4b 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65  CK;.      pInode
1a980 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 20  ->nLock++;.     
1a990 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
1a9a0 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65   = 1;.    }.  }e
1a9b0 6c 73 65 20 69 66 28 20 65 46 69 6c 65 4c 6f 63  lse if( eFileLoc
1a9c0 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
1a9d0 4b 20 26 26 20 70 49 6e 6f 64 65 2d 3e 6e 53 68  K && pInode->nSh
1a9e0 61 72 65 64 3e 31 20 29 7b 0a 20 20 20 20 2f 2a  ared>1 ){.    /*
1a9f0 20 57 65 20 61 72 65 20 74 72 79 69 6e 67 20 66   We are trying f
1aa00 6f 72 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  or an exclusive 
1aa10 6c 6f 63 6b 20 62 75 74 20 61 6e 6f 74 68 65 72  lock but another
1aa20 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 0a   thread in this.
1aa30 20 20 20 20 20 2a 2a 20 73 61 6d 65 20 70 72 6f       ** same pro
1aa40 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20 68 6f  cess is still ho
1aa50 6c 64 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c  lding a shared l
1aa60 6f 63 6b 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d  ock. */.    rc =
1aa70 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
1aa80 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68  }else{.    /* Th
1aa90 65 20 72 65 71 75 65 73 74 20 77 61 73 20 66 6f  e request was fo
1aaa0 72 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20  r a RESERVED or 
1aab0 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20  EXCLUSIVE lock. 
1aac0 20 49 74 20 69 73 0a 20 20 20 20 2a 2a 20 61 73   It is.    ** as
1aad0 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 72 65  sumed that there
1aae0 20 69 73 20 61 20 53 48 41 52 45 44 20 6f 72 20   is a SHARED or 
1aaf0 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20  greater lock on 
1ab00 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20  the file.    ** 
1ab10 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a  already..    */.
1ab20 20 20 20 20 69 6e 74 20 66 61 69 6c 65 64 20 3d      int failed =
1ab30 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   0;.    assert( 
1ab40 30 21 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  0!=pFile->eFileL
1ab50 6f 63 6b 20 29 3b 0a 20 20 20 20 69 66 20 28 65  ock );.    if (e
1ab60 46 69 6c 65 4c 6f 63 6b 20 3e 3d 20 52 45 53 45  FileLock >= RESE
1ab70 52 56 45 44 5f 4c 4f 43 4b 20 26 26 20 70 46 69  RVED_LOCK && pFi
1ab80 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3c 20  le->eFileLock < 
1ab90 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 20 7b  RESERVED_LOCK) {
1aba0 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 63 71 75  .        /* Acqu
1abb0 69 72 65 20 61 20 52 45 53 45 52 56 45 44 20 6c  ire a RESERVED l
1abc0 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 66  ock */.        f
1abd0 61 69 6c 65 64 20 3d 20 61 66 70 53 65 74 4c 6f  ailed = afpSetLo
1abe0 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61  ck(context->dbPa
1abf0 74 68 2c 20 70 46 69 6c 65 2c 20 52 45 53 45 52  th, pFile, RESER
1ac00 56 45 44 5f 42 59 54 45 2c 20 31 2c 31 29 3b 0a  VED_BYTE, 1,1);.
1ac10 20 20 20 20 20 20 69 66 28 20 21 66 61 69 6c 65        if( !faile
1ac20 64 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e  d ){.        con
1ac30 74 65 78 74 2d 3e 72 65 73 65 72 76 65 64 20 3d  text->reserved =
1ac40 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
1ac50 7d 0a 20 20 20 20 69 66 20 28 21 66 61 69 6c 65  }.    if (!faile
1ac60 64 20 26 26 20 65 46 69 6c 65 4c 6f 63 6b 20 3d  d && eFileLock =
1ac70 3d 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  = EXCLUSIVE_LOCK
1ac80 29 20 7b 0a 20 20 20 20 20 20 2f 2a 20 41 63 71  ) {.      /* Acq
1ac90 75 69 72 65 20 61 6e 20 45 58 43 4c 55 53 49 56  uire an EXCLUSIV
1aca0 45 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20  E lock */.      
1acb0 20 20 0a 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f    .      /* Remo
1acc0 76 65 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f  ve the shared lo
1acd0 63 6b 20 62 65 66 6f 72 65 20 74 72 79 69 6e 67  ck before trying
1ace0 20 74 68 65 20 72 61 6e 67 65 2e 20 20 77 65 27   the range.  we'
1acf0 6c 6c 20 6e 65 65 64 20 74 6f 20 0a 20 20 20 20  ll need to .    
1ad00 20 20 2a 2a 20 72 65 65 73 74 61 62 6c 69 73 68    ** reestablish
1ad10 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b   the shared lock
1ad20 20 69 66 20 77 65 20 63 61 6e 27 74 20 67 65 74   if we can't get
1ad30 20 74 68 65 20 20 61 66 70 55 6e 6c 6f 63 6b 0a   the  afpUnlock.
1ad40 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
1ad50 66 28 20 21 28 66 61 69 6c 65 64 20 3d 20 61 66  f( !(failed = af
1ad60 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  pSetLock(context
1ad70 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c  ->dbPath, pFile,
1ad80 20 53 48 41 52 45 44 5f 46 49 52 53 54 20 2b 0a   SHARED_FIRST +.
1ad90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ada0 20 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d           pInode-
1adb0 3e 73 68 61 72 65 64 42 79 74 65 2c 20 31 2c 20  >sharedByte, 1, 
1adc0 30 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  0)) ){.        i
1add0 6e 74 20 66 61 69 6c 65 64 32 20 3d 20 53 51 4c  nt failed2 = SQL
1ade0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
1adf0 2f 2a 20 6e 6f 77 20 61 74 74 65 6d 6d 70 74 20  /* now attemmpt 
1ae00 74 6f 20 67 65 74 20 74 68 65 20 65 78 63 6c 75  to get the exclu
1ae10 73 69 76 65 20 6c 6f 63 6b 20 72 61 6e 67 65 20  sive lock range 
1ae20 2a 2f 0a 20 20 20 20 20 20 20 20 66 61 69 6c 65  */.        faile
1ae30 64 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63  d = afpSetLock(c
1ae40 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20  ontext->dbPath, 
1ae50 70 46 69 6c 65 2c 20 53 48 41 52 45 44 5f 46 49  pFile, SHARED_FI
1ae60 52 53 54 2c 20 0a 20 20 20 20 20 20 20 20 20 20  RST, .          
1ae70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ae80 20 20 20 20 20 53 48 41 52 45 44 5f 53 49 5a 45       SHARED_SIZE
1ae90 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 1);.        if
1aea0 28 20 66 61 69 6c 65 64 20 26 26 20 28 66 61 69  ( failed && (fai
1aeb0 6c 65 64 32 20 3d 20 61 66 70 53 65 74 4c 6f 63  led2 = afpSetLoc
1aec0 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74  k(context->dbPat
1aed0 68 2c 20 70 46 69 6c 65 2c 20 0a 20 20 20 20 20  h, pFile, .     
1aee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aef0 20 20 53 48 41 52 45 44 5f 46 49 52 53 54 20 2b    SHARED_FIRST +
1af00 20 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42   pInode->sharedB
1af10 79 74 65 2c 20 31 2c 20 31 29 29 20 29 7b 0a 20  yte, 1, 1)) ){. 
1af20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61 6e 27           /* Can'
1af30 74 20 72 65 65 73 74 61 62 6c 69 73 68 20 74 68  t reestablish th
1af40 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20 20  e shared lock.  
1af50 53 71 6c 69 74 65 20 63 61 6e 27 74 20 64 65 61  Sqlite can't dea
1af60 6c 2c 20 74 68 69 73 20 69 73 0a 20 20 20 20 20  l, this is.     
1af70 20 20 20 20 20 2a 2a 20 61 20 63 72 69 74 69 63       ** a critic
1af80 61 6c 20 49 2f 4f 20 65 72 72 6f 72 0a 20 20 20  al I/O error.   
1af90 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
1afa0 20 20 20 20 72 63 20 3d 20 28 28 66 61 69 6c 65      rc = ((faile
1afb0 64 20 26 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  d & SQLITE_IOERR
1afc0 29 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  ) == SQLITE_IOER
1afd0 52 29 20 3f 20 66 61 69 6c 65 64 32 20 3a 20 0a  R) ? failed2 : .
1afe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
1aff0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b  QLITE_IOERR_LOCK
1b000 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
1b010 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20   afp_end_lock;. 
1b020 20 20 20 20 20 20 20 7d 20 0a 20 20 20 20 20 20         } .      
1b030 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
1b040 63 20 3d 20 66 61 69 6c 65 64 3b 20 0a 20 20 20  c = failed; .   
1b050 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
1b060 66 28 20 66 61 69 6c 65 64 20 29 7b 0a 20 20 20  f( failed ){.   
1b070 20 20 20 72 63 20 3d 20 66 61 69 6c 65 64 3b 0a     rc = failed;.
1b080 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 69      }.  }.  .  i
1b090 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1b0a0 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65   ){.    pFile->e
1b0b0 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65  FileLock = eFile
1b0c0 4c 6f 63 6b 3b 0a 20 20 20 20 70 49 6e 6f 64 65  Lock;.    pInode
1b0d0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46  ->eFileLock = eF
1b0e0 69 6c 65 4c 6f 63 6b 3b 0a 20 20 7d 65 6c 73 65  ileLock;.  }else
1b0f0 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d   if( eFileLock==
1b100 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
1b110 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69  {.    pFile->eFi
1b120 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e 44 49 4e 47  leLock = PENDING
1b130 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 49 6e 6f 64  _LOCK;.    pInod
1b140 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 50  e->eFileLock = P
1b150 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 7d  ENDING_LOCK;.  }
1b160 0a 20 20 0a 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b  .  .afp_end_lock
1b170 3a 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74  :.  unixLeaveMut
1b180 65 78 28 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  ex();.  OSTRACE(
1b190 28 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20  ("LOCK    %d %s 
1b1a0 25 73 20 28 61 66 70 29 5c 6e 22 2c 20 70 46 69  %s (afp)\n", pFi
1b1b0 6c 65 2d 3e 68 2c 20 61 7a 46 69 6c 65 4c 6f 63  le->h, azFileLoc
1b1c0 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 0a 20  k(eFileLock), . 
1b1d0 20 20 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49          rc==SQLI
1b1e0 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22  TE_OK ? "ok" : "
1b1f0 66 61 69 6c 65 64 22 29 29 3b 0a 20 20 72 65 74  failed"));.  ret
1b200 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1b210 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69   Lower the locki
1b220 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65  ng level on file
1b230 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c   descriptor pFil
1b240 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20  e to eFileLock. 
1b250 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75   eFileLock.** mu
1b260 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f  st be either NO_
1b270 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c  LOCK or SHARED_L
1b280 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  OCK..**.** If th
1b290 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
1b2a0 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  of the file desc
1b2b0 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64  riptor is alread
1b2c0 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a  y at or below.**
1b2d0 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
1b2e0 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68  ocking level, th
1b2f0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
1b300 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
1b310 20 69 6e 74 20 61 66 70 55 6e 6c 6f 63 6b 28 73   int afpUnlock(s
1b320 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
1b330 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20   int eFileLock) 
1b340 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
1b350 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69  ITE_OK;.  unixFi
1b360 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
1b370 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69  xFile*)id;.  uni
1b380 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f  xInodeInfo *pIno
1b390 64 65 3b 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67  de;.  afpLocking
1b3a0 43 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  Context *context
1b3b0 20 3d 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f   = (afpLockingCo
1b3c0 6e 74 65 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e  ntext *) pFile->
1b3d0 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  lockingContext;.
1b3e0 20 20 69 6e 74 20 73 6b 69 70 53 68 61 72 65 64    int skipShared
1b3f0 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c   = 0;.#ifdef SQL
1b400 49 54 45 5f 54 45 53 54 0a 20 20 69 6e 74 20 68  ITE_TEST.  int h
1b410 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 23 65 6e   = pFile->h;.#en
1b420 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70  dif..  assert( p
1b430 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43  File );.  OSTRAC
1b440 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25  E(("UNLOCK  %d %
1b450 64 20 77 61 73 20 25 64 28 25 64 2c 25 64 29 20  d was %d(%d,%d) 
1b460 70 69 64 3d 25 64 20 28 61 66 70 29 5c 6e 22 2c  pid=%d (afp)\n",
1b470 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65   pFile->h, eFile
1b480 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20 20 20  Lock,.          
1b490 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
1b4a0 6b 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  k, pFile->pInode
1b4b0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 70 46 69  ->eFileLock, pFi
1b4c0 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 53 68 61  le->pInode->nSha
1b4d0 72 65 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20  red,.           
1b4e0 6f 73 47 65 74 70 69 64 28 30 29 29 29 3b 0a 0a  osGetpid(0)));..
1b4f0 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c    assert( eFileL
1b500 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock<=SHARED_LOCK
1b510 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   );.  if( pFile-
1b520 3e 65 46 69 6c 65 4c 6f 63 6b 3c 3d 65 46 69 6c  >eFileLock<=eFil
1b530 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65 74  eLock ){.    ret
1b540 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1b550 20 7d 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75   }.  unixEnterMu
1b560 74 65 78 28 29 3b 0a 20 20 70 49 6e 6f 64 65 20  tex();.  pInode 
1b570 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b  = pFile->pInode;
1b580 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64  .  assert( pInod
1b590 65 2d 3e 6e 53 68 61 72 65 64 21 3d 30 20 29 3b  e->nShared!=0 );
1b5a0 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46  .  if( pFile->eF
1b5b0 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c  ileLock>SHARED_L
1b5c0 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72  OCK ){.    asser
1b5d0 74 28 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65  t( pInode->eFile
1b5e0 4c 6f 63 6b 3d 3d 70 46 69 6c 65 2d 3e 65 46 69  Lock==pFile->eFi
1b5f0 6c 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 53 69  leLock );.    Si
1b600 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e  mulateIOErrorBen
1b610 69 67 6e 28 31 29 3b 0a 20 20 20 20 53 69 6d 75  ign(1);.    Simu
1b620 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 68 3d 28  lateIOError( h=(
1b630 2d 31 29 20 29 0a 20 20 20 20 53 69 6d 75 6c 61  -1) ).    Simula
1b640 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28  teIOErrorBenign(
1b650 30 29 3b 0a 20 20 20 20 0a 23 69 66 64 65 66 20  0);.    .#ifdef 
1b660 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20  SQLITE_DEBUG.   
1b670 20 2f 2a 20 57 68 65 6e 20 72 65 64 75 63 69 6e   /* When reducin
1b680 67 20 61 20 6c 6f 63 6b 20 73 75 63 68 20 74 68  g a lock such th
1b690 61 74 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  at other process
1b6a0 65 73 20 63 61 6e 20 73 74 61 72 74 0a 20 20 20  es can start.   
1b6b0 20 2a 2a 20 72 65 61 64 69 6e 67 20 74 68 65 20   ** reading the 
1b6c0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 67  database file ag
1b6d0 61 69 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74  ain, make sure t
1b6e0 68 61 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 74  hat the.    ** t
1b6f0 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74  ransaction count
1b700 65 72 20 77 61 73 20 75 70 64 61 74 65 64 20 69  er was updated i
1b710 66 20 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68  f any part of th
1b720 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a  e database.    *
1b730 2a 20 66 69 6c 65 20 63 68 61 6e 67 65 64 2e 20  * file changed. 
1b740 20 49 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   If the transact
1b750 69 6f 6e 20 63 6f 75 6e 74 65 72 20 69 73 20 6e  ion counter is n
1b760 6f 74 20 75 70 64 61 74 65 64 2c 0a 20 20 20 20  ot updated,.    
1b770 2a 2a 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74  ** other connect
1b780 69 6f 6e 73 20 74 6f 20 74 68 65 20 73 61 6d 65  ions to the same
1b790 20 66 69 6c 65 20 6d 69 67 68 74 20 6e 6f 74 20   file might not 
1b7a0 72 65 61 6c 69 7a 65 20 74 68 61 74 0a 20 20 20  realize that.   
1b7b0 20 2a 2a 20 74 68 65 20 66 69 6c 65 20 68 61 73   ** the file has
1b7c0 20 63 68 61 6e 67 65 64 20 61 6e 64 20 68 65 6e   changed and hen
1b7d0 63 65 20 6d 69 67 68 74 20 6e 6f 74 20 6b 6e 6f  ce might not kno
1b7e0 77 20 74 6f 20 66 6c 75 73 68 20 74 68 65 69 72  w to flush their
1b7f0 0a 20 20 20 20 2a 2a 20 63 61 63 68 65 2e 20 20  .    ** cache.  
1b800 54 68 65 20 75 73 65 20 6f 66 20 61 20 73 74 61  The use of a sta
1b810 6c 65 20 63 61 63 68 65 20 63 61 6e 20 6c 65 61  le cache can lea
1b820 64 20 74 6f 20 64 61 74 61 62 61 73 65 20 63 6f  d to database co
1b830 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f  rruption..    */
1b840 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69  .    assert( pFi
1b850 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74  le->inNormalWrit
1b860 65 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  e==0.           
1b870 7c 7c 20 70 46 69 6c 65 2d 3e 64 62 55 70 64 61  || pFile->dbUpda
1b880 74 65 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20  te==0.          
1b890 20 7c 7c 20 70 46 69 6c 65 2d 3e 74 72 61 6e 73   || pFile->trans
1b8a0 43 6e 74 72 43 68 6e 67 3d 3d 31 20 29 3b 0a 20  CntrChng==1 );. 
1b8b0 20 20 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d     pFile->inNorm
1b8c0 61 6c 57 72 69 74 65 20 3d 20 30 3b 0a 23 65 6e  alWrite = 0;.#en
1b8d0 64 69 66 0a 20 20 20 20 0a 20 20 20 20 69 66 28  dif.    .    if(
1b8e0 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
1b8f0 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  k==EXCLUSIVE_LOC
1b900 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
1b910 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  afpSetLock(conte
1b920 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  xt->dbPath, pFil
1b930 65 2c 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c  e, SHARED_FIRST,
1b940 20 53 48 41 52 45 44 5f 53 49 5a 45 2c 20 30 29   SHARED_SIZE, 0)
1b950 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
1b960 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 65 46  SQLITE_OK && (eF
1b970 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
1b980 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e  LOCK || pInode->
1b990 6e 53 68 61 72 65 64 3e 31 29 20 29 7b 0a 20 20  nShared>1) ){.  
1b9a0 20 20 20 20 20 20 2f 2a 20 6f 6e 6c 79 20 72 65        /* only re
1b9b0 2d 65 73 74 61 62 6c 69 73 68 20 74 68 65 20 73  -establish the s
1b9c0 68 61 72 65 64 20 6c 6f 63 6b 20 69 66 20 6e 65  hared lock if ne
1b9d0 63 65 73 73 61 72 79 20 2a 2f 0a 20 20 20 20 20  cessary */.     
1b9e0 20 20 20 69 6e 74 20 73 68 61 72 65 64 4c 6f 63     int sharedLoc
1b9f0 6b 42 79 74 65 20 3d 20 53 48 41 52 45 44 5f 46  kByte = SHARED_F
1ba00 49 52 53 54 2b 70 49 6e 6f 64 65 2d 3e 73 68 61  IRST+pInode->sha
1ba10 72 65 64 42 79 74 65 3b 0a 20 20 20 20 20 20 20  redByte;.       
1ba20 20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b   rc = afpSetLock
1ba30 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68  (context->dbPath
1ba40 2c 20 70 46 69 6c 65 2c 20 73 68 61 72 65 64 4c  , pFile, sharedL
1ba50 6f 63 6b 42 79 74 65 2c 20 31 2c 20 31 29 3b 0a  ockByte, 1, 1);.
1ba60 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20        } else {. 
1ba70 20 20 20 20 20 20 20 73 6b 69 70 53 68 61 72 65         skipShare
1ba80 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  d = 1;.      }. 
1ba90 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
1baa0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 46  =SQLITE_OK && pF
1bab0 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d  ile->eFileLock>=
1bac0 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 7b 0a  PENDING_LOCK ){.
1bad0 20 20 20 20 20 20 72 63 20 3d 20 61 66 70 53 65        rc = afpSe
1bae0 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64  tLock(context->d
1baf0 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 50 45  bPath, pFile, PE
1bb00 4e 44 49 4e 47 5f 42 59 54 45 2c 20 31 2c 20 30  NDING_BYTE, 1, 0
1bb10 29 3b 0a 20 20 20 20 7d 20 0a 20 20 20 20 69 66  );.    } .    if
1bb20 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1bb30 26 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  && pFile->eFileL
1bb40 6f 63 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f  ock>=RESERVED_LO
1bb50 43 4b 20 26 26 20 63 6f 6e 74 65 78 74 2d 3e 72  CK && context->r
1bb60 65 73 65 72 76 65 64 20 29 7b 0a 20 20 20 20 20  eserved ){.     
1bb70 20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b   rc = afpSetLock
1bb80 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68  (context->dbPath
1bb90 2c 20 70 46 69 6c 65 2c 20 52 45 53 45 52 56 45  , pFile, RESERVE
1bba0 44 5f 42 59 54 45 2c 20 31 2c 20 30 29 3b 0a 20  D_BYTE, 1, 0);. 
1bbb0 20 20 20 20 20 69 66 28 20 21 72 63 20 29 7b 20       if( !rc ){ 
1bbc0 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 65 78 74  .        context
1bbd0 2d 3e 72 65 73 65 72 76 65 64 20 3d 20 30 3b 20  ->reserved = 0; 
1bbe0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1bbf0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1bc00 45 5f 4f 4b 20 26 26 20 28 65 46 69 6c 65 4c 6f  E_OK && (eFileLo
1bc10 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
1bc20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72  || pInode->nShar
1bc30 65 64 3e 31 29 29 7b 0a 20 20 20 20 20 20 70 49  ed>1)){.      pI
1bc40 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  node->eFileLock 
1bc50 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20  = SHARED_LOCK;. 
1bc60 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72     }.  }.  if( r
1bc70 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1bc80 65 46 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f  eFileLock==NO_LO
1bc90 43 4b 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 44 65  CK ){..    /* De
1bca0 63 72 65 6d 65 6e 74 20 74 68 65 20 73 68 61 72  crement the shar
1bcb0 65 64 20 6c 6f 63 6b 20 63 6f 75 6e 74 65 72 2e  ed lock counter.
1bcc0 20 20 52 65 6c 65 61 73 65 20 74 68 65 20 6c 6f    Release the lo
1bcd0 63 6b 20 75 73 69 6e 67 20 61 6e 0a 20 20 20 20  ck using an.    
1bce0 2a 2a 20 4f 53 20 63 61 6c 6c 20 6f 6e 6c 79 20  ** OS call only 
1bcf0 77 68 65 6e 20 61 6c 6c 20 74 68 72 65 61 64 73  when all threads
1bd00 20 69 6e 20 74 68 69 73 20 73 61 6d 65 20 70 72   in this same pr
1bd10 6f 63 65 73 73 20 68 61 76 65 20 72 65 6c 65 61  ocess have relea
1bd20 73 65 64 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c  sed.    ** the l
1bd30 6f 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ock..    */.    
1bd40 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f  unsigned long lo
1bd50 6e 67 20 73 68 61 72 65 64 4c 6f 63 6b 42 79 74  ng sharedLockByt
1bd60 65 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54  e = SHARED_FIRST
1bd70 2b 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42  +pInode->sharedB
1bd80 79 74 65 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d  yte;.    pInode-
1bd90 3e 6e 53 68 61 72 65 64 2d 2d 3b 0a 20 20 20 20  >nShared--;.    
1bda0 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61  if( pInode->nSha
1bdb0 72 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  red==0 ){.      
1bdc0 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42  SimulateIOErrorB
1bdd0 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20  enign(1);.      
1bde0 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
1bdf0 20 68 3d 28 2d 31 29 20 29 0a 20 20 20 20 20 20   h=(-1) ).      
1be00 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42  SimulateIOErrorB
1be10 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20  enign(0);.      
1be20 69 66 28 20 21 73 6b 69 70 53 68 61 72 65 64 20  if( !skipShared 
1be30 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
1be40 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65  afpSetLock(conte
1be50 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c  xt->dbPath, pFil
1be60 65 2c 20 73 68 61 72 65 64 4c 6f 63 6b 42 79 74  e, sharedLockByt
1be70 65 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  e, 1, 0);.      
1be80 7d 0a 20 20 20 20 20 20 69 66 28 20 21 72 63 20  }.      if( !rc 
1be90 29 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 6f 64  ){.        pInod
1bea0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e  e->eFileLock = N
1beb0 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20  O_LOCK;.        
1bec0 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
1bed0 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20   = NO_LOCK;.    
1bee0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
1bef0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1bf00 29 7b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d  ){.      pInode-
1bf10 3e 6e 4c 6f 63 6b 2d 2d 3b 0a 20 20 20 20 20 20  >nLock--;.      
1bf20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e  assert( pInode->
1bf30 6e 4c 6f 63 6b 3e 3d 30 20 29 3b 0a 20 20 20 20  nLock>=0 );.    
1bf40 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c    if( pInode->nL
1bf50 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ock==0 ){.      
1bf60 20 20 63 6c 6f 73 65 50 65 6e 64 69 6e 67 46 64    closePendingFd
1bf70 73 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20  s(pFile);.      
1bf80 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20  }.    }.  }.  . 
1bf90 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
1bfa0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
1bfb0 49 54 45 5f 4f 4b 20 29 20 70 46 69 6c 65 2d 3e  ITE_OK ) pFile->
1bfc0 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c  eFileLock = eFil
1bfd0 65 4c 6f 63 6b 3b 0a 20 20 72 65 74 75 72 6e 20  eLock;.  return 
1bfe0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  rc;.}../*.** Clo
1bff0 73 65 20 61 20 66 69 6c 65 20 26 20 63 6c 65 61  se a file & clea
1c000 6e 75 70 20 41 46 50 20 73 70 65 63 69 66 69 63  nup AFP specific
1c010 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74   locking context
1c020 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20   .*/.static int 
1c030 61 66 70 43 6c 6f 73 65 28 73 71 6c 69 74 65 33  afpClose(sqlite3
1c040 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69  _file *id) {.  i
1c050 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1c060 4b 3b 0a 20 20 69 66 28 20 69 64 20 29 7b 0a 20  K;.  if( id ){. 
1c070 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69     unixFile *pFi
1c080 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
1c090 69 64 3b 0a 20 20 20 20 61 66 70 55 6e 6c 6f 63  id;.    afpUnloc
1c0a0 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a  k(id, NO_LOCK);.
1c0b0 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74      unixEnterMut
1c0c0 65 78 28 29 3b 0a 20 20 20 20 69 66 28 20 70 46  ex();.    if( pF
1c0d0 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 26 26 20 70  ile->pInode && p
1c0e0 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 4c  File->pInode->nL
1c0f0 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ock ){.      /* 
1c100 49 66 20 74 68 65 72 65 20 61 72 65 20 6f 75 74  If there are out
1c110 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 2c 20  standing locks, 
1c120 64 6f 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20  do not actually 
1c130 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20 6a  close the file j
1c140 75 73 74 0a 20 20 20 20 20 20 2a 2a 20 79 65 74  ust.      ** yet
1c150 20 62 65 63 61 75 73 65 20 74 68 61 74 20 77 6f   because that wo
1c160 75 6c 64 20 63 6c 65 61 72 20 74 68 6f 73 65 20  uld clear those 
1c170 6c 6f 63 6b 73 2e 20 20 49 6e 73 74 65 61 64 2c  locks.  Instead,
1c180 20 61 64 64 20 74 68 65 20 66 69 6c 65 0a 20 20   add the file.  
1c190 20 20 20 20 2a 2a 20 64 65 73 63 72 69 70 74 6f      ** descripto
1c1a0 72 20 74 6f 20 70 49 6e 6f 64 65 2d 3e 61 50 65  r to pInode->aPe
1c1b0 6e 64 69 6e 67 2e 20 20 49 74 20 77 69 6c 6c 20  nding.  It will 
1c1c0 62 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  be automatically
1c1d0 20 63 6c 6f 73 65 64 20 77 68 65 6e 0a 20 20 20   closed when.   
1c1e0 20 20 20 2a 2a 20 74 68 65 20 6c 61 73 74 20 6c     ** the last l
1c1f0 6f 63 6b 20 69 73 20 63 6c 65 61 72 65 64 2e 0a  ock is cleared..
1c200 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
1c210 65 74 50 65 6e 64 69 6e 67 46 64 28 70 46 69 6c  etPendingFd(pFil
1c220 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  e);.    }.    re
1c230 6c 65 61 73 65 49 6e 6f 64 65 49 6e 66 6f 28 70  leaseInodeInfo(p
1c240 46 69 6c 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  File);.    sqlit
1c250 65 33 5f 66 72 65 65 28 70 46 69 6c 65 2d 3e 6c  e3_free(pFile->l
1c260 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3b 0a  ockingContext);.
1c270 20 20 20 20 72 63 20 3d 20 63 6c 6f 73 65 55 6e      rc = closeUn
1c280 69 78 46 69 6c 65 28 69 64 29 3b 0a 20 20 20 20  ixFile(id);.    
1c290 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
1c2a0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
1c2b0 63 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20  c;.}..#endif /* 
1c2c0 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
1c2d0 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41  _) && SQLITE_ENA
1c2e0 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
1c2f0 45 20 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63  E */./*.** The c
1c300 6f 64 65 20 61 62 6f 76 65 20 69 73 20 74 68 65  ode above is the
1c310 20 41 46 50 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d   AFP lock implem
1c320 65 6e 74 61 74 69 6f 6e 2e 20 20 54 68 65 20 63  entation.  The c
1c330 6f 64 65 20 69 73 20 73 70 65 63 69 66 69 63 0a  ode is specific.
1c340 2a 2a 20 74 6f 20 4d 61 63 4f 53 58 20 61 6e 64  ** to MacOSX and
1c350 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 6f   does not work o
1c360 6e 20 6f 74 68 65 72 20 75 6e 69 78 20 70 6c 61  n other unix pla
1c370 74 66 6f 72 6d 73 2e 20 20 4e 6f 20 61 6c 74 65  tforms.  No alte
1c380 72 6e 61 74 69 76 65 0a 2a 2a 20 69 73 20 61 76  rnative.** is av
1c390 61 69 6c 61 62 6c 65 2e 20 20 49 66 20 79 6f 75  ailable.  If you
1c3a0 20 64 6f 6e 27 74 20 63 6f 6d 70 69 6c 65 20 66   don't compile f
1c3b0 6f 72 20 61 20 6d 61 63 2c 20 74 68 65 6e 20 74  or a mac, then t
1c3c0 68 65 20 22 75 6e 69 78 2d 61 66 70 22 0a 2a 2a  he "unix-afp".**
1c3d0 20 56 46 53 20 69 73 20 6e 6f 74 20 61 76 61 69   VFS is not avai
1c3e0 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a  lable..**.******
1c3f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
1c400 45 6e 64 20 6f 66 20 74 68 65 20 41 46 50 20 6c  End of the AFP l
1c410 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ock implementati
1c420 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  on *************
1c430 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
1c440 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c450 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c460 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c470 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c480 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 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 2a  ****************
1c4c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c4d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 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 20 42 65 67 69 6e 20 4e 46 53  ****** Begin NFS
1c500 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a   Locking *******
1c510 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c520 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 23 69 66 20  *********/..#if 
1c530 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
1c540 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41  _) && SQLITE_ENA
1c550 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
1c560 45 0a 2f 2a 0a 20 2a 2a 20 4c 6f 77 65 72 20 74  E./*. ** Lower t
1c570 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
1c580 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70   on file descrip
1c590 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69  tor pFile to eFi
1c5a0 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f  leLock.  eFileLo
1c5b0 63 6b 0a 20 2a 2a 20 6d 75 73 74 20 62 65 20 65  ck. ** must be e
1c5c0 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72  ither NO_LOCK or
1c5d0 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 20 2a   SHARED_LOCK.. *
1c5e0 2a 0a 20 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63  *. ** If the loc
1c5f0 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68  king level of th
1c600 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
1c610 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20  r is already at 
1c620 6f 72 20 62 65 6c 6f 77 0a 20 2a 2a 20 74 68 65  or below. ** the
1c630 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69   requested locki
1c640 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72  ng level, this r
1c650 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
1c660 70 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  p.. */.static in
1c670 74 20 6e 66 73 55 6e 6c 6f 63 6b 28 73 71 6c 69  t nfsUnlock(sqli
1c680 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
1c690 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20  t eFileLock){.  
1c6a0 72 65 74 75 72 6e 20 70 6f 73 69 78 55 6e 6c 6f  return posixUnlo
1c6b0 63 6b 28 69 64 2c 20 65 46 69 6c 65 4c 6f 63 6b  ck(id, eFileLock
1c6c0 2c 20 31 29 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20  , 1);.}..#endif 
1c6d0 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  /* defined(__APP
1c6e0 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f  LE__) && SQLITE_
1c6f0 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
1c700 54 59 4c 45 20 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68  TYLE */./*.** Th
1c710 65 20 63 6f 64 65 20 61 62 6f 76 65 20 69 73 20  e code above is 
1c720 74 68 65 20 4e 46 53 20 6c 6f 63 6b 20 69 6d 70  the NFS lock imp
1c730 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 20 54 68  lementation.  Th
1c740 65 20 63 6f 64 65 20 69 73 20 73 70 65 63 69 66  e code is specif
1c750 69 63 0a 2a 2a 20 74 6f 20 4d 61 63 4f 53 58 20  ic.** to MacOSX 
1c760 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72  and does not wor
1c770 6b 20 6f 6e 20 6f 74 68 65 72 20 75 6e 69 78 20  k on other unix 
1c780 70 6c 61 74 66 6f 72 6d 73 2e 20 20 4e 6f 20 61  platforms.  No a
1c790 6c 74 65 72 6e 61 74 69 76 65 0a 2a 2a 20 69 73  lternative.** is
1c7a0 20 61 76 61 69 6c 61 62 6c 65 2e 20 20 0a 2a 2a   available.  .**
1c7b0 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
1c7c0 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68  ****** End of th
1c7d0 65 20 4e 46 53 20 6c 6f 63 6b 20 69 6d 70 6c 65  e NFS lock imple
1c7e0 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a  mentation ******
1c7f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c800 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
1c810 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c820 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c830 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c840 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
1c850 0a 0a 2f 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 2a 2a 2a 2a 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 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
1c8b0 2a 2a 20 4e 6f 6e 2d 6c 6f 63 6b 69 6e 67 20 73  ** Non-locking s
1c8c0 71 6c 69 74 65 33 5f 66 69 6c 65 20 6d 65 74 68  qlite3_file meth
1c8d0 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ods ************
1c8e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c8f0 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 65 78 74  *.**.** The next
1c900 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e 74 61 69   division contai
1c910 6e 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ns implementatio
1c920 6e 73 20 66 6f 72 20 61 6c 6c 20 6d 65 74 68 6f  ns for all metho
1c930 64 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20 73 71  ds of the .** sq
1c940 6c 69 74 65 33 5f 66 69 6c 65 20 6f 62 6a 65 63  lite3_file objec
1c950 74 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68 65  t other than the
1c960 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 73   locking methods
1c970 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 0a 2a  .  The locking.*
1c980 2a 20 6d 65 74 68 6f 64 73 20 77 65 72 65 20 64  * methods were d
1c990 65 66 69 6e 65 64 20 69 6e 20 64 69 76 69 73 69  efined in divisi
1c9a0 6f 6e 73 20 61 62 6f 76 65 20 28 6f 6e 65 20 6c  ons above (one l
1c9b0 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 20 70 65  ocking method pe
1c9c0 72 0a 2a 2a 20 64 69 76 69 73 69 6f 6e 29 2e 20  r.** division). 
1c9d0 20 54 68 6f 73 65 20 6d 65 74 68 6f 64 73 20 74   Those methods t
1c9e0 68 61 74 20 61 72 65 20 63 6f 6d 6d 6f 6e 20 74  hat are common t
1c9f0 6f 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6d 6f  o all locking mo
1ca00 64 65 73 0a 2a 2a 20 61 72 65 20 67 61 74 68 65  des.** are gathe
1ca10 72 20 74 6f 67 65 74 68 65 72 20 69 6e 74 6f 20  r together into 
1ca20 74 68 69 73 20 64 69 76 69 73 69 6f 6e 2e 0a 2a  this division..*
1ca30 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74 6f  /../*.** Seek to
1ca40 20 74 68 65 20 6f 66 66 73 65 74 20 70 61 73 73   the offset pass
1ca50 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
1ca60 20 61 72 67 75 6d 65 6e 74 2c 20 74 68 65 6e 20   argument, then 
1ca70 72 65 61 64 20 63 6e 74 20 0a 2a 2a 20 62 79 74  read cnt .** byt
1ca80 65 73 20 69 6e 74 6f 20 70 42 75 66 2e 20 52 65  es into pBuf. Re
1ca90 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
1caa0 6f 66 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c  of bytes actuall
1cab0 79 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 4e 42  y read..**.** NB
1cac0 3a 20 20 49 66 20 79 6f 75 20 64 65 66 69 6e 65  :  If you define
1cad0 20 55 53 45 5f 50 52 45 41 44 20 6f 72 20 55 53   USE_PREAD or US
1cae0 45 5f 50 52 45 41 44 36 34 2c 20 74 68 65 6e 20  E_PREAD64, then 
1caf0 69 74 20 6d 69 67 68 74 20 61 6c 73 6f 0a 2a 2a  it might also.**
1cb00 20 62 65 20 6e 65 63 65 73 73 61 72 79 20 74 6f   be necessary to
1cb10 20 64 65 66 69 6e 65 20 5f 58 4f 50 45 4e 5f 53   define _XOPEN_S
1cb20 4f 55 52 43 45 20 74 6f 20 62 65 20 35 30 30 2e  OURCE to be 500.
1cb30 20 20 54 68 69 73 20 76 61 72 69 65 73 20 66 72    This varies fr
1cb40 6f 6d 0a 2a 2a 20 6f 6e 65 20 73 79 73 74 65 6d  om.** one system
1cb50 20 74 6f 20 61 6e 6f 74 68 65 72 2e 20 20 53 69   to another.  Si
1cb60 6e 63 65 20 53 51 4c 69 74 65 20 64 6f 65 73 20  nce SQLite does 
1cb70 6e 6f 74 20 64 65 66 69 6e 65 20 55 53 45 5f 50  not define USE_P
1cb80 52 45 41 44 0a 2a 2a 20 69 6e 20 61 6e 79 20 66  READ.** in any f
1cb90 6f 72 6d 20 62 79 20 64 65 66 61 75 6c 74 2c 20  orm by default, 
1cba0 77 65 20 77 69 6c 6c 20 6e 6f 74 20 61 74 74 65  we will not atte
1cbb0 6d 70 74 20 74 6f 20 64 65 66 69 6e 65 20 5f 58  mpt to define _X
1cbc0 4f 50 45 4e 5f 53 4f 55 52 43 45 2e 0a 2a 2a 20  OPEN_SOURCE..** 
1cbd0 53 65 65 20 74 69 63 6b 65 74 73 20 23 32 37 34  See tickets #274
1cbe0 31 20 61 6e 64 20 23 32 36 38 31 2e 0a 2a 2a 0a  1 and #2681..**.
1cbf0 2a 2a 20 54 6f 20 61 76 6f 69 64 20 73 74 6f 6d  ** To avoid stom
1cc00 70 69 6e 67 20 74 68 65 20 65 72 72 6e 6f 20 76  ping the errno v
1cc10 61 6c 75 65 20 6f 6e 20 61 20 66 61 69 6c 65 64  alue on a failed
1cc20 20 72 65 61 64 20 74 68 65 20 6c 61 73 74 45 72   read the lastEr
1cc30 72 6e 6f 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20  rno value.** is 
1cc40 73 65 74 20 62 65 66 6f 72 65 20 72 65 74 75 72  set before retur
1cc50 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ning..*/.static 
1cc60 69 6e 74 20 73 65 65 6b 41 6e 64 52 65 61 64 28  int seekAndRead(
1cc70 75 6e 69 78 46 69 6c 65 20 2a 69 64 2c 20 73 71  unixFile *id, sq
1cc80 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66 73  lite3_int64 offs
1cc90 65 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 2c 20  et, void *pBuf, 
1cca0 69 6e 74 20 63 6e 74 29 7b 0a 20 20 69 6e 74 20  int cnt){.  int 
1ccb0 67 6f 74 3b 0a 20 20 69 6e 74 20 70 72 69 6f 72  got;.  int prior
1ccc0 20 3d 20 30 3b 0a 23 69 66 20 28 21 64 65 66 69   = 0;.#if (!defi
1ccd0 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29 20 26  ned(USE_PREAD) &
1cce0 26 20 21 64 65 66 69 6e 65 64 28 55 53 45 5f 50  & !defined(USE_P
1ccf0 52 45 41 44 36 34 29 29 0a 20 20 69 36 34 20 6e  READ64)).  i64 n
1cd00 65 77 4f 66 66 73 65 74 3b 0a 23 65 6e 64 69 66  ewOffset;.#endif
1cd10 0a 20 20 54 49 4d 45 52 5f 53 54 41 52 54 3b 0a  .  TIMER_START;.
1cd20 20 20 61 73 73 65 72 74 28 20 63 6e 74 3d 3d 28    assert( cnt==(
1cd30 63 6e 74 26 30 78 31 66 66 66 66 29 20 29 3b 0a  cnt&0x1ffff) );.
1cd40 20 20 61 73 73 65 72 74 28 20 69 64 2d 3e 68 3e    assert( id->h>
1cd50 32 20 29 3b 0a 20 20 63 6e 74 20 26 3d 20 30 78  2 );.  cnt &= 0x
1cd60 31 66 66 66 66 3b 0a 20 20 64 6f 7b 0a 23 69 66  1ffff;.  do{.#if
1cd70 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45   defined(USE_PRE
1cd80 41 44 29 0a 20 20 20 20 67 6f 74 20 3d 20 6f 73  AD).    got = os
1cd90 50 72 65 61 64 28 69 64 2d 3e 68 2c 20 70 42 75  Pread(id->h, pBu
1cda0 66 2c 20 63 6e 74 2c 20 6f 66 66 73 65 74 29 3b  f, cnt, offset);
1cdb0 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  .    SimulateIOE
1cdc0 72 72 6f 72 28 20 67 6f 74 20 3d 20 2d 31 20 29  rror( got = -1 )
1cdd0 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28  ;.#elif defined(
1cde0 55 53 45 5f 50 52 45 41 44 36 34 29 0a 20 20 20  USE_PREAD64).   
1cdf0 20 67 6f 74 20 3d 20 6f 73 50 72 65 61 64 36 34   got = osPread64
1ce00 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e  (id->h, pBuf, cn
1ce10 74 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20  t, offset);.    
1ce20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
1ce30 20 67 6f 74 20 3d 20 2d 31 20 29 3b 0a 23 65 6c   got = -1 );.#el
1ce40 73 65 0a 20 20 20 20 6e 65 77 4f 66 66 73 65 74  se.    newOffset
1ce50 20 3d 20 6c 73 65 65 6b 28 69 64 2d 3e 68 2c 20   = lseek(id->h, 
1ce60 6f 66 66 73 65 74 2c 20 53 45 45 4b 5f 53 45 54  offset, SEEK_SET
1ce70 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49  );.    SimulateI
1ce80 4f 45 72 72 6f 72 28 20 6e 65 77 4f 66 66 73 65  OError( newOffse
1ce90 74 2d 2d 20 29 3b 0a 20 20 20 20 69 66 28 20 6e  t-- );.    if( n
1cea0 65 77 4f 66 66 73 65 74 21 3d 6f 66 66 73 65 74  ewOffset!=offset
1ceb0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 65   ){.      if( ne
1cec0 77 4f 66 66 73 65 74 20 3d 3d 20 2d 31 20 29 7b  wOffset == -1 ){
1ced0 0a 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61  .        storeLa
1cee0 73 74 45 72 72 6e 6f 28 28 75 6e 69 78 46 69 6c  stErrno((unixFil
1cef0 65 2a 29 69 64 2c 20 65 72 72 6e 6f 29 3b 0a 20  e*)id, errno);. 
1cf00 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1cf10 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72      storeLastErr
1cf20 6e 6f 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64  no((unixFile*)id
1cf30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
1cf40 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20      return -1;. 
1cf50 20 20 20 7d 0a 20 20 20 20 67 6f 74 20 3d 20 6f     }.    got = o
1cf60 73 52 65 61 64 28 69 64 2d 3e 68 2c 20 70 42 75  sRead(id->h, pBu
1cf70 66 2c 20 63 6e 74 29 3b 0a 23 65 6e 64 69 66 0a  f, cnt);.#endif.
1cf80 20 20 20 20 69 66 28 20 67 6f 74 3d 3d 63 6e 74      if( got==cnt
1cf90 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66   ) break;.    if
1cfa0 28 20 67 6f 74 3c 30 20 29 7b 0a 20 20 20 20 20  ( got<0 ){.     
1cfb0 20 69 66 28 20 65 72 72 6e 6f 3d 3d 45 49 4e 54   if( errno==EINT
1cfc0 52 20 29 7b 20 67 6f 74 20 3d 20 31 3b 20 63 6f  R ){ got = 1; co
1cfd0 6e 74 69 6e 75 65 3b 20 7d 0a 20 20 20 20 20 20  ntinue; }.      
1cfe0 70 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20  prior = 0;.     
1cff0 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28   storeLastErrno(
1d000 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 2c 20 20  (unixFile*)id,  
1d010 65 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 62 72  errno);.      br
1d020 65 61 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  eak;.    }else i
1d030 66 28 20 67 6f 74 3e 30 20 29 7b 0a 20 20 20 20  f( got>0 ){.    
1d040 20 20 63 6e 74 20 2d 3d 20 67 6f 74 3b 0a 20 20    cnt -= got;.  
1d050 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 67 6f      offset += go
1d060 74 3b 0a 20 20 20 20 20 20 70 72 69 6f 72 20 2b  t;.      prior +
1d070 3d 20 67 6f 74 3b 0a 20 20 20 20 20 20 70 42 75  = got;.      pBu
1d080 66 20 3d 20 28 76 6f 69 64 2a 29 28 67 6f 74 20  f = (void*)(got 
1d090 2b 20 28 63 68 61 72 2a 29 70 42 75 66 29 3b 0a  + (char*)pBuf);.
1d0a0 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20      }.  }while( 
1d0b0 67 6f 74 3e 30 20 29 3b 0a 20 20 54 49 4d 45 52  got>0 );.  TIMER
1d0c0 5f 45 4e 44 3b 0a 20 20 4f 53 54 52 41 43 45 28  _END;.  OSTRACE(
1d0d0 28 22 52 45 41 44 20 20 20 20 25 2d 33 64 20 25  ("READ    %-3d %
1d0e0 35 64 20 25 37 6c 6c 64 20 25 6c 6c 75 5c 6e 22  5d %7lld %llu\n"
1d0f0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 64  ,.            id
1d100 2d 3e 68 2c 20 67 6f 74 2b 70 72 69 6f 72 2c 20  ->h, got+prior, 
1d110 6f 66 66 73 65 74 2d 70 72 69 6f 72 2c 20 54 49  offset-prior, TI
1d120 4d 45 52 5f 45 4c 41 50 53 45 44 29 29 3b 0a 20  MER_ELAPSED));. 
1d130 20 72 65 74 75 72 6e 20 67 6f 74 2b 70 72 69 6f   return got+prio
1d140 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  r;.}../*.** Read
1d150 20 64 61 74 61 20 66 72 6f 6d 20 61 20 66 69 6c   data from a fil
1d160 65 20 69 6e 74 6f 20 61 20 62 75 66 66 65 72 2e  e into a buffer.
1d170 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
1d180 4f 4b 20 69 66 20 61 6c 6c 0a 2a 2a 20 62 79 74  OK if all.** byt
1d190 65 73 20 77 65 72 65 20 72 65 61 64 20 73 75 63  es were read suc
1d1a0 63 65 73 73 66 75 6c 6c 79 20 61 6e 64 20 53 51  cessfully and SQ
1d1b0 4c 49 54 45 5f 49 4f 45 52 52 20 69 66 20 61 6e  LITE_IOERR if an
1d1c0 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77  ything goes.** w
1d1d0 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rong..*/.static 
1d1e0 69 6e 74 20 75 6e 69 78 52 65 61 64 28 0a 20 20  int unixRead(.  
1d1f0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
1d200 2c 20 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c  , .  void *pBuf,
1d210 20 0a 20 20 69 6e 74 20 61 6d 74 2c 0a 20 20 73   .  int amt,.  s
1d220 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66  qlite3_int64 off
1d230 73 65 74 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c  set.){.  unixFil
1d240 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
1d250 46 69 6c 65 20 2a 29 69 64 3b 0a 20 20 69 6e 74  File *)id;.  int
1d260 20 67 6f 74 3b 0a 20 20 61 73 73 65 72 74 28 20   got;.  assert( 
1d270 69 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  id );.  assert( 
1d280 6f 66 66 73 65 74 3e 3d 30 20 29 3b 0a 20 20 61  offset>=0 );.  a
1d290 73 73 65 72 74 28 20 61 6d 74 3e 30 20 29 3b 0a  ssert( amt>0 );.
1d2a0 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73  .  /* If this is
1d2b0 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65   a database file
1d2c0 20 28 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 2c   (not a journal,
1d2d0 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
1d2e0 6f 72 20 74 65 6d 70 0a 20 20 2a 2a 20 66 69 6c  or temp.  ** fil
1d2f0 65 29 2c 20 74 68 65 20 62 79 74 65 73 20 69 6e  e), the bytes in
1d300 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 72 61 6e   the locking ran
1d310 67 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20  ge should never 
1d320 62 65 20 72 65 61 64 20 6f 72 20 77 72 69 74 74  be read or writt
1d330 65 6e 2e 20 2a 2f 0a 23 69 66 20 30 0a 20 20 61  en. */.#if 0.  a
1d340 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 70 55  ssert( pFile->pU
1d350 6e 75 73 65 64 3d 3d 30 0a 20 20 20 20 20 20 20  nused==0.       
1d360 7c 7c 20 6f 66 66 73 65 74 3e 3d 50 45 4e 44 49  || offset>=PENDI
1d370 4e 47 5f 42 59 54 45 2b 35 31 32 0a 20 20 20 20  NG_BYTE+512.    
1d380 20 20 20 7c 7c 20 6f 66 66 73 65 74 2b 61 6d 74     || offset+amt
1d390 3c 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 0a  <=PENDING_BYTE .
1d3a0 20 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66    );.#endif..#if
1d3b0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
1d3c0 5f 53 49 5a 45 3e 30 0a 20 20 2f 2a 20 44 65 61  _SIZE>0.  /* Dea
1d3d0 6c 20 77 69 74 68 20 61 73 20 6d 75 63 68 20 6f  l with as much o
1d3e0 66 20 74 68 69 73 20 72 65 61 64 20 72 65 71 75  f this read requ
1d3f0 65 73 74 20 61 73 20 70 6f 73 73 69 62 6c 65 20  est as possible 
1d400 62 79 20 74 72 61 6e 73 66 65 72 69 6e 67 0a 20  by transfering. 
1d410 20 2a 2a 20 64 61 74 61 20 66 72 6f 6d 20 74 68   ** data from th
1d420 65 20 6d 65 6d 6f 72 79 20 6d 61 70 70 69 6e 67  e memory mapping
1d430 20 75 73 69 6e 67 20 6d 65 6d 63 70 79 28 29 2e   using memcpy().
1d440 20 20 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73 65    */.  if( offse
1d450 74 3c 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a  t<pFile->mmapSiz
1d460 65 20 29 7b 0a 20 20 20 20 69 66 28 20 6f 66 66  e ){.    if( off
1d470 73 65 74 2b 61 6d 74 20 3c 3d 20 70 46 69 6c 65  set+amt <= pFile
1d480 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20  ->mmapSize ){.  
1d490 20 20 20 20 6d 65 6d 63 70 79 28 70 42 75 66 2c      memcpy(pBuf,
1d4a0 20 26 28 28 75 38 20 2a 29 28 70 46 69 6c 65 2d   &((u8 *)(pFile-
1d4b0 3e 70 4d 61 70 52 65 67 69 6f 6e 29 29 5b 6f 66  >pMapRegion))[of
1d4c0 66 73 65 74 5d 2c 20 61 6d 74 29 3b 0a 20 20 20  fset], amt);.   
1d4d0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1d4e0 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  _OK;.    }else{.
1d4f0 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 70 79 20        int nCopy 
1d500 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a  = pFile->mmapSiz
1d510 65 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20  e - offset;.    
1d520 20 20 6d 65 6d 63 70 79 28 70 42 75 66 2c 20 26    memcpy(pBuf, &
1d530 28 28 75 38 20 2a 29 28 70 46 69 6c 65 2d 3e 70  ((u8 *)(pFile->p
1d540 4d 61 70 52 65 67 69 6f 6e 29 29 5b 6f 66 66 73  MapRegion))[offs
1d550 65 74 5d 2c 20 6e 43 6f 70 79 29 3b 0a 20 20 20  et], nCopy);.   
1d560 20 20 20 70 42 75 66 20 3d 20 26 28 28 75 38 20     pBuf = &((u8 
1d570 2a 29 70 42 75 66 29 5b 6e 43 6f 70 79 5d 3b 0a  *)pBuf)[nCopy];.
1d580 20 20 20 20 20 20 61 6d 74 20 2d 3d 20 6e 43 6f        amt -= nCo
1d590 70 79 3b 0a 20 20 20 20 20 20 6f 66 66 73 65 74  py;.      offset
1d5a0 20 2b 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20 7d   += nCopy;.    }
1d5b0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 67  .  }.#endif..  g
1d5c0 6f 74 20 3d 20 73 65 65 6b 41 6e 64 52 65 61 64  ot = seekAndRead
1d5d0 28 70 46 69 6c 65 2c 20 6f 66 66 73 65 74 2c 20  (pFile, offset, 
1d5e0 70 42 75 66 2c 20 61 6d 74 29 3b 0a 20 20 69 66  pBuf, amt);.  if
1d5f0 28 20 67 6f 74 3d 3d 61 6d 74 20 29 7b 0a 20 20  ( got==amt ){.  
1d600 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1d610 4f 4b 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  OK;.  }else if( 
1d620 67 6f 74 3c 30 20 29 7b 0a 20 20 20 20 2f 2a 20  got<0 ){.    /* 
1d630 6c 61 73 74 45 72 72 6e 6f 20 73 65 74 20 62 79  lastErrno set by
1d640 20 73 65 65 6b 41 6e 64 52 65 61 64 20 2a 2f 0a   seekAndRead */.
1d650 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1d660 45 5f 49 4f 45 52 52 5f 52 45 41 44 3b 0a 20 20  E_IOERR_READ;.  
1d670 7d 65 6c 73 65 7b 0a 20 20 20 20 73 74 6f 72 65  }else{.    store
1d680 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c  LastErrno(pFile,
1d690 20 30 29 3b 20 20 20 2f 2a 20 6e 6f 74 20 61 20   0);   /* not a 
1d6a0 73 79 73 74 65 6d 20 65 72 72 6f 72 20 2a 2f 0a  system error */.
1d6b0 20 20 20 20 2f 2a 20 55 6e 72 65 61 64 20 70 61      /* Unread pa
1d6c0 72 74 73 20 6f 66 20 74 68 65 20 62 75 66 66 65  rts of the buffe
1d6d0 72 20 6d 75 73 74 20 62 65 20 7a 65 72 6f 2d 66  r must be zero-f
1d6e0 69 6c 6c 65 64 20 2a 2f 0a 20 20 20 20 6d 65 6d  illed */.    mem
1d6f0 73 65 74 28 26 28 28 63 68 61 72 2a 29 70 42 75  set(&((char*)pBu
1d700 66 29 5b 67 6f 74 5d 2c 20 30 2c 20 61 6d 74 2d  f)[got], 0, amt-
1d710 67 6f 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  got);.    return
1d720 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48   SQLITE_IOERR_SH
1d730 4f 52 54 5f 52 45 41 44 3b 0a 20 20 7d 0a 7d 0a  ORT_READ;.  }.}.
1d740 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74  ./*.** Attempt t
1d750 6f 20 73 65 65 6b 20 74 68 65 20 66 69 6c 65 2d  o seek the file-
1d760 64 65 73 63 72 69 70 74 6f 72 20 70 61 73 73 65  descriptor passe
1d770 64 20 61 73 20 74 68 65 20 66 69 72 73 74 20 61  d as the first a
1d780 72 67 75 6d 65 6e 74 20 74 6f 0a 2a 2a 20 61 62  rgument to.** ab
1d790 73 6f 6c 75 74 65 20 6f 66 66 73 65 74 20 69 4f  solute offset iO
1d7a0 66 66 2c 20 74 68 65 6e 20 61 74 74 65 6d 70 74  ff, then attempt
1d7b0 20 74 6f 20 77 72 69 74 65 20 6e 42 75 66 20 62   to write nBuf b
1d7c0 79 74 65 73 20 6f 66 20 64 61 74 61 20 66 72 6f  ytes of data fro
1d7d0 6d 0a 2a 2a 20 70 42 75 66 20 74 6f 20 69 74 2e  m.** pBuf to it.
1d7e0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
1d7f0 75 72 73 2c 20 72 65 74 75 72 6e 20 2d 31 20 61  urs, return -1 a
1d800 6e 64 20 73 65 74 20 2a 70 69 45 72 72 6e 6f 2e  nd set *piErrno.
1d810 20 4f 74 68 65 72 77 69 73 65 2c 20 0a 2a 2a 20   Otherwise, .** 
1d820 72 65 74 75 72 6e 20 74 68 65 20 61 63 74 75 61  return the actua
1d830 6c 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  l number of byte
1d840 73 20 77 72 69 74 74 65 6e 20 28 77 68 69 63 68  s written (which
1d850 20 6d 61 79 20 62 65 20 6c 65 73 73 20 74 68 61   may be less tha
1d860 6e 0a 2a 2a 20 6e 42 75 66 29 2e 0a 2a 2f 0a 73  n.** nBuf)..*/.s
1d870 74 61 74 69 63 20 69 6e 74 20 73 65 65 6b 41 6e  tatic int seekAn
1d880 64 57 72 69 74 65 46 64 28 0a 20 20 69 6e 74 20  dWriteFd(.  int 
1d890 66 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  fd,             
1d8a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1d8b0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74  ile descriptor t
1d8c0 6f 20 77 72 69 74 65 20 74 6f 20 2a 2f 0a 20 20  o write to */.  
1d8d0 69 36 34 20 69 4f 66 66 2c 20 20 20 20 20 20 20  i64 iOff,       
1d8e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d8f0 2f 2a 20 46 69 6c 65 20 6f 66 66 73 65 74 20 74  /* File offset t
1d900 6f 20 62 65 67 69 6e 20 77 72 69 74 69 6e 67 20  o begin writing 
1d910 61 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f  at */.  const vo
1d920 69 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20  id *pBuf,       
1d930 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20          /* Copy 
1d940 64 61 74 61 20 66 72 6f 6d 20 74 68 69 73 20 62  data from this b
1d950 75 66 66 65 72 20 74 6f 20 74 68 65 20 66 69 6c  uffer to the fil
1d960 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 75 66 2c  e */.  int nBuf,
1d970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d980 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
1d990 66 20 62 75 66 66 65 72 20 70 42 75 66 20 69 6e  f buffer pBuf in
1d9a0 20 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20   bytes */.  int 
1d9b0 2a 70 69 45 72 72 6e 6f 20 20 20 20 20 20 20 20  *piErrno        
1d9c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
1d9d0 55 54 3a 20 45 72 72 6f 72 20 6e 75 6d 62 65 72  UT: Error number
1d9e0 20 69 66 20 65 72 72 6f 72 20 6f 63 63 75 72 73   if error occurs
1d9f0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
1da00 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
1da10 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75           /* Valu
1da20 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 73 79  e returned by sy
1da30 73 74 65 6d 20 63 61 6c 6c 20 2a 2f 0a 0a 20 20  stem call */..  
1da40 61 73 73 65 72 74 28 20 6e 42 75 66 3d 3d 28 6e  assert( nBuf==(n
1da50 42 75 66 26 30 78 31 66 66 66 66 29 20 29 3b 0a  Buf&0x1ffff) );.
1da60 20 20 61 73 73 65 72 74 28 20 66 64 3e 32 20 29    assert( fd>2 )
1da70 3b 0a 20 20 6e 42 75 66 20 26 3d 20 30 78 31 66  ;.  nBuf &= 0x1f
1da80 66 66 66 3b 0a 20 20 54 49 4d 45 52 5f 53 54 41  fff;.  TIMER_STA
1da90 52 54 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  RT;..#if defined
1daa0 28 55 53 45 5f 50 52 45 41 44 29 0a 20 20 64 6f  (USE_PREAD).  do
1dab0 7b 20 72 63 20 3d 20 28 69 6e 74 29 6f 73 50 77  { rc = (int)osPw
1dac0 72 69 74 65 28 66 64 2c 20 70 42 75 66 2c 20 6e  rite(fd, pBuf, n
1dad0 42 75 66 2c 20 69 4f 66 66 29 3b 20 7d 77 68 69  Buf, iOff); }whi
1dae0 6c 65 28 20 72 63 3c 30 20 26 26 20 65 72 72 6e  le( rc<0 && errn
1daf0 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 23 65 6c 69  o==EINTR );.#eli
1db00 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52  f defined(USE_PR
1db10 45 41 44 36 34 29 0a 20 20 64 6f 7b 20 72 63 20  EAD64).  do{ rc 
1db20 3d 20 28 69 6e 74 29 6f 73 50 77 72 69 74 65 36  = (int)osPwrite6
1db30 34 28 66 64 2c 20 70 42 75 66 2c 20 6e 42 75 66  4(fd, pBuf, nBuf
1db40 2c 20 69 4f 66 66 29 3b 7d 77 68 69 6c 65 28 20  , iOff);}while( 
1db50 72 63 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45  rc<0 && errno==E
1db60 49 4e 54 52 29 3b 0a 23 65 6c 73 65 0a 20 20 64  INTR);.#else.  d
1db70 6f 7b 0a 20 20 20 20 69 36 34 20 69 53 65 65 6b  o{.    i64 iSeek
1db80 20 3d 20 6c 73 65 65 6b 28 66 64 2c 20 69 4f 66   = lseek(fd, iOf
1db90 66 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20 20  f, SEEK_SET);.  
1dba0 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
1dbb0 72 28 20 69 53 65 65 6b 2d 2d 20 29 3b 0a 0a 20  r( iSeek-- );.. 
1dbc0 20 20 20 69 66 28 20 69 53 65 65 6b 21 3d 69 4f     if( iSeek!=iO
1dbd0 66 66 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ff ){.      if( 
1dbe0 70 69 45 72 72 6e 6f 20 29 20 2a 70 69 45 72 72  piErrno ) *piErr
1dbf0 6e 6f 20 3d 20 28 69 53 65 65 6b 3d 3d 2d 31 20  no = (iSeek==-1 
1dc00 3f 20 65 72 72 6e 6f 20 3a 20 30 29 3b 0a 20 20  ? errno : 0);.  
1dc10 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20      return -1;. 
1dc20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 6f 73     }.    rc = os
1dc30 57 72 69 74 65 28 66 64 2c 20 70 42 75 66 2c 20  Write(fd, pBuf, 
1dc40 6e 42 75 66 29 3b 0a 20 20 7d 77 68 69 6c 65 28  nBuf);.  }while(
1dc50 20 72 63 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d   rc<0 && errno==
1dc60 45 49 4e 54 52 20 29 3b 0a 23 65 6e 64 69 66 0a  EINTR );.#endif.
1dc70 0a 20 20 54 49 4d 45 52 5f 45 4e 44 3b 0a 20 20  .  TIMER_END;.  
1dc80 4f 53 54 52 41 43 45 28 28 22 57 52 49 54 45 20  OSTRACE(("WRITE 
1dc90 20 20 25 2d 33 64 20 25 35 64 20 25 37 6c 6c 64    %-3d %5d %7lld
1dca0 20 25 6c 6c 75 5c 6e 22 2c 20 66 64 2c 20 72 63   %llu\n", fd, rc
1dcb0 2c 20 69 4f 66 66 2c 20 54 49 4d 45 52 5f 45 4c  , iOff, TIMER_EL
1dcc0 41 50 53 45 44 29 29 3b 0a 0a 20 20 69 66 28 20  APSED));..  if( 
1dcd0 72 63 3c 30 20 26 26 20 70 69 45 72 72 6e 6f 20  rc<0 && piErrno 
1dce0 29 20 2a 70 69 45 72 72 6e 6f 20 3d 20 65 72 72  ) *piErrno = err
1dcf0 6e 6f 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  no;.  return rc;
1dd00 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20  .}.../*.** Seek 
1dd10 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20 69 6e  to the offset in
1dd20 20 69 64 2d 3e 6f 66 66 73 65 74 20 74 68 65 6e   id->offset then
1dd30 20 72 65 61 64 20 63 6e 74 20 62 79 74 65 73 20   read cnt bytes 
1dd40 69 6e 74 6f 20 70 42 75 66 2e 0a 2a 2a 20 52 65  into pBuf..** Re
1dd50 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
1dd60 6f 66 20 62 79 74 65 73 20 61 63 74 75 61 6c 6c  of bytes actuall
1dd70 79 20 72 65 61 64 2e 20 20 55 70 64 61 74 65 20  y read.  Update 
1dd80 74 68 65 20 6f 66 66 73 65 74 2e 0a 2a 2a 0a 2a  the offset..**.*
1dd90 2a 20 54 6f 20 61 76 6f 69 64 20 73 74 6f 6d 70  * To avoid stomp
1dda0 69 6e 67 20 74 68 65 20 65 72 72 6e 6f 20 76 61  ing the errno va
1ddb0 6c 75 65 20 6f 6e 20 61 20 66 61 69 6c 65 64 20  lue on a failed 
1ddc0 77 72 69 74 65 20 74 68 65 20 6c 61 73 74 45 72  write the lastEr
1ddd0 72 6e 6f 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20  rno value.** is 
1dde0 73 65 74 20 62 65 66 6f 72 65 20 72 65 74 75 72  set before retur
1ddf0 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ning..*/.static 
1de00 69 6e 74 20 73 65 65 6b 41 6e 64 57 72 69 74 65  int seekAndWrite
1de10 28 75 6e 69 78 46 69 6c 65 20 2a 69 64 2c 20 69  (unixFile *id, i
1de20 36 34 20 6f 66 66 73 65 74 2c 20 63 6f 6e 73 74  64 offset, const
1de30 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 69 6e 74   void *pBuf, int
1de40 20 63 6e 74 29 7b 0a 20 20 72 65 74 75 72 6e 20   cnt){.  return 
1de50 73 65 65 6b 41 6e 64 57 72 69 74 65 46 64 28 69  seekAndWriteFd(i
1de60 64 2d 3e 68 2c 20 6f 66 66 73 65 74 2c 20 70 42  d->h, offset, pB
1de70 75 66 2c 20 63 6e 74 2c 20 26 69 64 2d 3e 6c 61  uf, cnt, &id->la
1de80 73 74 45 72 72 6e 6f 29 3b 0a 7d 0a 0a 0a 2f 2a  stErrno);.}.../*
1de90 0a 2a 2a 20 57 72 69 74 65 20 64 61 74 61 20 66  .** Write data f
1dea0 72 6f 6d 20 61 20 62 75 66 66 65 72 20 69 6e 74  rom a buffer int
1deb0 6f 20 61 20 66 69 6c 65 2e 20 20 52 65 74 75 72  o a file.  Retur
1dec0 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
1ded0 75 63 63 65 73 73 0a 2a 2a 20 6f 72 20 73 6f 6d  uccess.** or som
1dee0 65 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f  e other error co
1def0 64 65 20 6f 6e 20 66 61 69 6c 75 72 65 2e 0a 2a  de on failure..*
1df00 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
1df10 78 57 72 69 74 65 28 0a 20 20 73 71 6c 69 74 65  xWrite(.  sqlite
1df20 33 5f 66 69 6c 65 20 2a 69 64 2c 20 0a 20 20 63  3_file *id, .  c
1df30 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 75 66 2c  onst void *pBuf,
1df40 20 0a 20 20 69 6e 74 20 61 6d 74 2c 0a 20 20 73   .  int amt,.  s
1df50 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66  qlite3_int64 off
1df60 73 65 74 20 0a 29 7b 0a 20 20 75 6e 69 78 46 69  set .){.  unixFi
1df70 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
1df80 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74  xFile*)id;.  int
1df90 20 77 72 6f 74 65 20 3d 20 30 3b 0a 20 20 61 73   wrote = 0;.  as
1dfa0 73 65 72 74 28 20 69 64 20 29 3b 0a 20 20 61 73  sert( id );.  as
1dfb0 73 65 72 74 28 20 61 6d 74 3e 30 20 29 3b 0a 0a  sert( amt>0 );..
1dfc0 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
1dfd0 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  a database file 
1dfe0 28 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 2c 20  (not a journal, 
1dff0 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6f  master-journal o
1e000 72 20 74 65 6d 70 0a 20 20 2a 2a 20 66 69 6c 65  r temp.  ** file
1e010 29 2c 20 74 68 65 20 62 79 74 65 73 20 69 6e 20  ), the bytes in 
1e020 74 68 65 20 6c 6f 63 6b 69 6e 67 20 72 61 6e 67  the locking rang
1e030 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 62  e should never b
1e040 65 20 72 65 61 64 20 6f 72 20 77 72 69 74 74 65  e read or writte
1e050 6e 2e 20 2a 2f 0a 23 69 66 20 30 0a 20 20 61 73  n. */.#if 0.  as
1e060 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 70 55 6e  sert( pFile->pUn
1e070 75 73 65 64 3d 3d 30 0a 20 20 20 20 20 20 20 7c  used==0.       |
1e080 7c 20 6f 66 66 73 65 74 3e 3d 50 45 4e 44 49 4e  | offset>=PENDIN
1e090 47 5f 42 59 54 45 2b 35 31 32 0a 20 20 20 20 20  G_BYTE+512.     
1e0a0 20 20 7c 7c 20 6f 66 66 73 65 74 2b 61 6d 74 3c    || offset+amt<
1e0b0 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 0a 20  =PENDING_BYTE . 
1e0c0 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64   );.#endif..#ifd
1e0d0 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
1e0e0 20 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 64    /* If we are d
1e0f0 6f 69 6e 67 20 61 20 6e 6f 72 6d 61 6c 20 77 72  oing a normal wr
1e100 69 74 65 20 74 6f 20 61 20 64 61 74 61 62 61 73  ite to a databas
1e110 65 20 66 69 6c 65 20 28 61 73 20 6f 70 70 6f 73  e file (as oppos
1e120 65 64 20 74 6f 0a 20 20 2a 2a 20 64 6f 69 6e 67  ed to.  ** doing
1e130 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72   a hot-journal r
1e140 6f 6c 6c 62 61 63 6b 20 6f 72 20 61 20 77 72 69  ollback or a wri
1e150 74 65 20 74 6f 20 73 6f 6d 65 20 66 69 6c 65 20  te to some file 
1e160 6f 74 68 65 72 20 74 68 61 6e 20 61 0a 20 20 2a  other than a.  *
1e170 2a 20 6e 6f 72 6d 61 6c 20 64 61 74 61 62 61 73  * normal databas
1e180 65 20 66 69 6c 65 29 20 74 68 65 6e 20 72 65 63  e file) then rec
1e190 6f 72 64 20 74 68 65 20 66 61 63 74 20 74 68 61  ord the fact tha
1e1a0 74 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20  t the database. 
1e1b0 20 2a 2a 20 68 61 73 20 63 68 61 6e 67 65 64 2e   ** has changed.
1e1c0 20 20 49 66 20 74 68 65 20 74 72 61 6e 73 61 63    If the transac
1e1d0 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 69 73 20  tion counter is 
1e1e0 6d 6f 64 69 66 69 65 64 2c 20 72 65 63 6f 72 64  modified, record
1e1f0 20 74 68 61 74 0a 20 20 2a 2a 20 66 61 63 74 20   that.  ** fact 
1e200 74 6f 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  too..  */.  if( 
1e210 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57  pFile->inNormalW
1e220 72 69 74 65 20 29 7b 0a 20 20 20 20 70 46 69 6c  rite ){.    pFil
1e230 65 2d 3e 64 62 55 70 64 61 74 65 20 3d 20 31 3b  e->dbUpdate = 1;
1e240 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
1e250 65 20 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66  e has been modif
1e260 69 65 64 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f  ied */.    if( o
1e270 66 66 73 65 74 3c 3d 32 34 20 26 26 20 6f 66 66  ffset<=24 && off
1e280 73 65 74 2b 61 6d 74 3e 3d 32 37 20 29 7b 0a 20  set+amt>=27 ){. 
1e290 20 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20       int rc;.   
1e2a0 20 20 20 63 68 61 72 20 6f 6c 64 43 6e 74 72 5b     char oldCntr[
1e2b0 34 5d 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61  4];.      Simula
1e2c0 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28  teIOErrorBenign(
1e2d0 31 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  1);.      rc = s
1e2e0 65 65 6b 41 6e 64 52 65 61 64 28 70 46 69 6c 65  eekAndRead(pFile
1e2f0 2c 20 32 34 2c 20 6f 6c 64 43 6e 74 72 2c 20 34  , 24, oldCntr, 4
1e300 29 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74  );.      Simulat
1e310 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30  eIOErrorBenign(0
1e320 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
1e330 3d 34 20 7c 7c 20 6d 65 6d 63 6d 70 28 6f 6c 64  =4 || memcmp(old
1e340 43 6e 74 72 2c 20 26 28 28 63 68 61 72 2a 29 70  Cntr, &((char*)p
1e350 42 75 66 29 5b 32 34 2d 6f 66 66 73 65 74 5d 2c  Buf)[24-offset],
1e360 20 34 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20   4)!=0 ){.      
1e370 20 20 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e    pFile->transCn
1e380 74 72 43 68 6e 67 20 3d 20 31 3b 20 20 2f 2a 20  trChng = 1;  /* 
1e390 54 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  The transaction 
1e3a0 63 6f 75 6e 74 65 72 20 68 61 73 20 63 68 61 6e  counter has chan
1e3b0 67 65 64 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20  ged */.      }. 
1e3c0 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
1e3d0 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
1e3e0 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 2f 2a  MMAP_SIZE>0.  /*
1e3f0 20 44 65 61 6c 20 77 69 74 68 20 61 73 20 6d 75   Deal with as mu
1e400 63 68 20 6f 66 20 74 68 69 73 20 77 72 69 74 65  ch of this write
1e410 20 72 65 71 75 65 73 74 20 61 73 20 70 6f 73 73   request as poss
1e420 69 62 6c 65 20 62 79 20 74 72 61 6e 73 66 65 72  ible by transfer
1e430 69 6e 67 0a 20 20 2a 2a 20 64 61 74 61 20 66 72  ing.  ** data fr
1e440 6f 6d 20 74 68 65 20 6d 65 6d 6f 72 79 20 6d 61  om the memory ma
1e450 70 70 69 6e 67 20 75 73 69 6e 67 20 6d 65 6d 63  pping using memc
1e460 70 79 28 29 2e 20 20 2a 2f 0a 20 20 69 66 28 20  py().  */.  if( 
1e470 6f 66 66 73 65 74 3c 70 46 69 6c 65 2d 3e 6d 6d  offset<pFile->mm
1e480 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 69 66  apSize ){.    if
1e490 28 20 6f 66 66 73 65 74 2b 61 6d 74 20 3c 3d 20  ( offset+amt <= 
1e4a0 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20  pFile->mmapSize 
1e4b0 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  ){.      memcpy(
1e4c0 26 28 28 75 38 20 2a 29 28 70 46 69 6c 65 2d 3e  &((u8 *)(pFile->
1e4d0 70 4d 61 70 52 65 67 69 6f 6e 29 29 5b 6f 66 66  pMapRegion))[off
1e4e0 73 65 74 5d 2c 20 70 42 75 66 2c 20 61 6d 74 29  set], pBuf, amt)
1e4f0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
1e500 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65  QLITE_OK;.    }e
1e510 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  lse{.      int n
1e520 43 6f 70 79 20 3d 20 70 46 69 6c 65 2d 3e 6d 6d  Copy = pFile->mm
1e530 61 70 53 69 7a 65 20 2d 20 6f 66 66 73 65 74 3b  apSize - offset;
1e540 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 28  .      memcpy(&(
1e550 28 75 38 20 2a 29 28 70 46 69 6c 65 2d 3e 70 4d  (u8 *)(pFile->pM
1e560 61 70 52 65 67 69 6f 6e 29 29 5b 6f 66 66 73 65  apRegion))[offse
1e570 74 5d 2c 20 70 42 75 66 2c 20 6e 43 6f 70 79 29  t], pBuf, nCopy)
1e580 3b 0a 20 20 20 20 20 20 70 42 75 66 20 3d 20 26  ;.      pBuf = &
1e590 28 28 75 38 20 2a 29 70 42 75 66 29 5b 6e 43 6f  ((u8 *)pBuf)[nCo
1e5a0 70 79 5d 3b 0a 20 20 20 20 20 20 61 6d 74 20 2d  py];.      amt -
1e5b0 3d 20 6e 43 6f 70 79 3b 0a 20 20 20 20 20 20 6f  = nCopy;.      o
1e5c0 66 66 73 65 74 20 2b 3d 20 6e 43 6f 70 79 3b 0a  ffset += nCopy;.
1e5d0 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
1e5e0 0a 0a 20 20 77 68 69 6c 65 28 20 61 6d 74 3e 30  ..  while( amt>0
1e5f0 20 26 26 20 28 77 72 6f 74 65 20 3d 20 73 65 65   && (wrote = see
1e600 6b 41 6e 64 57 72 69 74 65 28 70 46 69 6c 65 2c  kAndWrite(pFile,
1e610 20 6f 66 66 73 65 74 2c 20 70 42 75 66 2c 20 61   offset, pBuf, a
1e620 6d 74 29 29 3e 30 20 29 7b 0a 20 20 20 20 61 6d  mt))>0 ){.    am
1e630 74 20 2d 3d 20 77 72 6f 74 65 3b 0a 20 20 20 20  t -= wrote;.    
1e640 6f 66 66 73 65 74 20 2b 3d 20 77 72 6f 74 65 3b  offset += wrote;
1e650 0a 20 20 20 20 70 42 75 66 20 3d 20 26 28 28 63  .    pBuf = &((c
1e660 68 61 72 2a 29 70 42 75 66 29 5b 77 72 6f 74 65  har*)pBuf)[wrote
1e670 5d 3b 0a 20 20 7d 0a 20 20 53 69 6d 75 6c 61 74  ];.  }.  Simulat
1e680 65 49 4f 45 72 72 6f 72 28 28 20 77 72 6f 74 65  eIOError(( wrote
1e690 3d 28 2d 31 29 2c 20 61 6d 74 3d 31 20 29 29 3b  =(-1), amt=1 ));
1e6a0 0a 20 20 53 69 6d 75 6c 61 74 65 44 69 73 6b 66  .  SimulateDiskf
1e6b0 75 6c 6c 45 72 72 6f 72 28 28 20 77 72 6f 74 65  ullError(( wrote
1e6c0 3d 30 2c 20 61 6d 74 3d 31 20 29 29 3b 0a 0a 20  =0, amt=1 ));.. 
1e6d0 20 69 66 28 20 61 6d 74 3e 30 20 29 7b 0a 20 20   if( amt>0 ){.  
1e6e0 20 20 69 66 28 20 77 72 6f 74 65 3c 30 20 26 26    if( wrote<0 &&
1e6f0 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
1e700 6f 21 3d 45 4e 4f 53 50 43 20 29 7b 0a 20 20 20  o!=ENOSPC ){.   
1e710 20 20 20 2f 2a 20 6c 61 73 74 45 72 72 6e 6f 20     /* lastErrno 
1e720 73 65 74 20 62 79 20 73 65 65 6b 41 6e 64 57 72  set by seekAndWr
1e730 69 74 65 20 2a 2f 0a 20 20 20 20 20 20 72 65 74  ite */.      ret
1e740 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
1e750 5f 57 52 49 54 45 3b 0a 20 20 20 20 7d 65 6c 73  _WRITE;.    }els
1e760 65 7b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61  e{.      storeLa
1e770 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 30  stErrno(pFile, 0
1e780 29 3b 20 2f 2a 20 6e 6f 74 20 61 20 73 79 73 74  ); /* not a syst
1e790 65 6d 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20  em error */.    
1e7a0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1e7b0 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  FULL;.    }.  }.
1e7c0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1e7d0 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  _OK;.}..#ifdef S
1e7e0 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a  QLITE_TEST./*.**
1e7f0 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65   Count the numbe
1e800 72 20 6f 66 20 66 75 6c 6c 73 79 6e 63 73 20 61  r of fullsyncs a
1e810 6e 64 20 6e 6f 72 6d 61 6c 20 73 79 6e 63 73 2e  nd normal syncs.
1e820 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20 74    This is used t
1e830 6f 20 74 65 73 74 0a 2a 2a 20 74 68 61 74 20 73  o test.** that s
1e840 79 6e 63 73 20 61 6e 64 20 66 75 6c 6c 73 79 6e  yncs and fullsyn
1e850 63 73 20 61 72 65 20 6f 63 63 75 72 72 69 6e 67  cs are occurring
1e860 20 61 74 20 74 68 65 20 72 69 67 68 74 20 74 69   at the right ti
1e870 6d 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  mes..*/.int sqli
1e880 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 20 3d  te3_sync_count =
1e890 20 30 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f   0;.int sqlite3_
1e8a0 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 20 3d  fullsync_count =
1e8b0 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a   0;.#endif../*.*
1e8c0 2a 20 57 65 20 64 6f 20 6e 6f 74 20 74 72 75 73  * We do not trus
1e8d0 74 20 73 79 73 74 65 6d 73 20 74 6f 20 70 72 6f  t systems to pro
1e8e0 76 69 64 65 20 61 20 77 6f 72 6b 69 6e 67 20 66  vide a working f
1e8f0 64 61 74 61 73 79 6e 63 28 29 2e 20 20 53 6f 6d  datasync().  Som
1e900 65 20 64 6f 2e 0a 2a 2a 20 4f 74 68 65 72 73 20  e do..** Others 
1e910 64 6f 20 6e 6f 2e 20 20 54 6f 20 62 65 20 73 61  do no.  To be sa
1e920 66 65 2c 20 77 65 20 77 69 6c 6c 20 73 74 69 63  fe, we will stic
1e930 6b 20 77 69 74 68 20 74 68 65 20 28 73 6c 69 67  k with the (slig
1e940 68 74 6c 79 20 73 6c 6f 77 65 72 29 0a 2a 2a 20  htly slower).** 
1e950 66 73 79 6e 63 28 29 2e 20 49 66 20 79 6f 75 20  fsync(). If you 
1e960 6b 6e 6f 77 20 74 68 61 74 20 79 6f 75 72 20 73  know that your s
1e970 79 73 74 65 6d 20 64 6f 65 73 20 73 75 70 70 6f  ystem does suppo
1e980 72 74 20 66 64 61 74 61 73 79 6e 63 28 29 20 63  rt fdatasync() c
1e990 6f 72 72 65 63 74 6c 79 2c 0a 2a 2a 20 74 68 65  orrectly,.** the
1e9a0 6e 20 73 69 6d 70 6c 79 20 63 6f 6d 70 69 6c 65  n simply compile
1e9b0 20 77 69 74 68 20 2d 44 66 64 61 74 61 73 79 6e   with -Dfdatasyn
1e9c0 63 3d 66 64 61 74 61 73 79 6e 63 20 6f 72 20 2d  c=fdatasync or -
1e9d0 44 48 41 56 45 5f 46 44 41 54 41 53 59 4e 43 0a  DHAVE_FDATASYNC.
1e9e0 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
1e9f0 66 64 61 74 61 73 79 6e 63 29 20 26 26 20 21 48  fdatasync) && !H
1ea00 41 56 45 5f 46 44 41 54 41 53 59 4e 43 0a 23 20  AVE_FDATASYNC.# 
1ea10 64 65 66 69 6e 65 20 66 64 61 74 61 73 79 6e 63  define fdatasync
1ea20 20 66 73 79 6e 63 0a 23 65 6e 64 69 66 0a 0a 2f   fsync.#endif../
1ea30 2a 0a 2a 2a 20 44 65 66 69 6e 65 20 48 41 56 45  *.** Define HAVE
1ea40 5f 46 55 4c 4c 46 53 59 4e 43 20 74 6f 20 30 20  _FULLFSYNC to 0 
1ea50 6f 72 20 31 20 64 65 70 65 6e 64 69 6e 67 20 6f  or 1 depending o
1ea60 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  n whether or not
1ea70 0a 2a 2a 20 74 68 65 20 46 5f 46 55 4c 4c 46 53  .** the F_FULLFS
1ea80 59 4e 43 20 6d 61 63 72 6f 20 69 73 20 64 65 66  YNC macro is def
1ea90 69 6e 65 64 2e 20 20 46 5f 46 55 4c 4c 46 53 59  ined.  F_FULLFSY
1eaa0 4e 43 20 69 73 20 63 75 72 72 65 6e 74 6c 79 0a  NC is currently.
1eab0 2a 2a 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c  ** only availabl
1eac0 65 20 6f 6e 20 4d 61 63 20 4f 53 20 58 2e 20 20  e on Mac OS X.  
1ead0 42 75 74 20 74 68 61 74 20 63 6f 75 6c 64 20 63  But that could c
1eae0 68 61 6e 67 65 2e 0a 2a 2f 0a 23 69 66 64 65 66  hange..*/.#ifdef
1eaf0 20 46 5f 46 55 4c 4c 46 53 59 4e 43 0a 23 20 64   F_FULLFSYNC.# d
1eb00 65 66 69 6e 65 20 48 41 56 45 5f 46 55 4c 4c 46  efine HAVE_FULLF
1eb10 53 59 4e 43 20 31 0a 23 65 6c 73 65 0a 23 20 64  SYNC 1.#else.# d
1eb20 65 66 69 6e 65 20 48 41 56 45 5f 46 55 4c 4c 46  efine HAVE_FULLF
1eb30 53 59 4e 43 20 30 0a 23 65 6e 64 69 66 0a 0a 23  SYNC 0.#endif..#
1eb40 69 66 64 65 66 20 53 51 4c 49 54 45 5f 55 53 45  ifdef SQLITE_USE
1eb50 5f 52 45 51 55 45 53 54 5f 46 55 4c 4c 46 53 59  _REQUEST_FULLFSY
1eb60 4e 43 0a 23 69 6d 70 6f 72 74 20 3c 6e 6f 74 69  NC.#import <noti
1eb70 66 79 2e 68 3e 0a 23 69 6d 70 6f 72 74 20 3c 6c  fy.h>.#import <l
1eb80 69 62 6b 65 72 6e 2f 4f 53 41 74 6f 6d 69 63 2e  ibkern/OSAtomic.
1eb90 68 3e 0a 73 74 61 74 69 63 20 4f 53 53 70 69 6e  h>.static OSSpin
1eba0 4c 6f 63 6b 20 6e 6f 74 69 66 79 5f 6c 6f 63 6b  Lock notify_lock
1ebb0 20 3d 20 30 3b 0a 23 64 65 66 69 6e 65 20 52 45   = 0;.#define RE
1ebc0 51 55 45 53 54 5f 46 55 4c 4c 53 59 4e 43 5f 4e  QUEST_FULLSYNC_N
1ebd0 4f 54 49 46 49 43 41 54 49 4f 4e 20 20 20 20 22  OTIFICATION    "
1ebe0 63 6f 6d 2e 61 70 70 6c 65 2e 72 65 71 73 79 6e  com.apple.reqsyn
1ebf0 63 22 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  c".#endif../*.**
1ec00 20 54 68 65 20 66 73 79 6e 63 28 29 20 73 79 73   The fsync() sys
1ec10 74 65 6d 20 63 61 6c 6c 20 64 6f 65 73 20 6e 6f  tem call does no
1ec20 74 20 77 6f 72 6b 20 61 73 20 61 64 76 65 72 74  t work as advert
1ec30 69 73 65 64 20 6f 6e 20 6d 61 6e 79 0a 2a 2a 20  ised on many.** 
1ec40 75 6e 69 78 20 73 79 73 74 65 6d 73 2e 20 20 54  unix systems.  T
1ec50 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 72 6f  he following pro
1ec60 63 65 64 75 72 65 20 69 73 20 61 6e 20 61 74 74  cedure is an att
1ec70 65 6d 70 74 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20  empt to make.** 
1ec80 69 74 20 77 6f 72 6b 20 62 65 74 74 65 72 2e 0a  it work better..
1ec90 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 49 54 45  **.** The SQLITE
1eca0 5f 4e 4f 5f 53 59 4e 43 20 6d 61 63 72 6f 20 64  _NO_SYNC macro d
1ecb0 69 73 61 62 6c 65 73 20 61 6c 6c 20 66 73 79 6e  isables all fsyn
1ecc0 63 28 29 73 2e 20 20 54 68 69 73 20 69 73 20 75  c()s.  This is u
1ecd0 73 65 66 75 6c 0a 2a 2a 20 66 6f 72 20 74 65 73  seful.** for tes
1ece0 74 69 6e 67 20 77 68 65 6e 20 77 65 20 77 61 6e  ting when we wan
1ecf0 74 20 74 6f 20 72 75 6e 20 74 68 72 6f 75 67 68  t to run through
1ed00 20 74 68 65 20 74 65 73 74 20 73 75 69 74 65 20   the test suite 
1ed10 71 75 69 63 6b 6c 79 2e 0a 2a 2a 20 59 6f 75 20  quickly..** You 
1ed20 61 72 65 20 73 74 72 6f 6e 67 6c 79 20 61 64 76  are strongly adv
1ed30 69 73 65 64 20 2a 6e 6f 74 2a 20 74 6f 20 64 65  ised *not* to de
1ed40 70 6c 6f 79 20 77 69 74 68 20 53 51 4c 49 54 45  ploy with SQLITE
1ed50 5f 4e 4f 5f 53 59 4e 43 0a 2a 2a 20 65 6e 61 62  _NO_SYNC.** enab
1ed60 6c 65 64 2c 20 68 6f 77 65 76 65 72 2c 20 73 69  led, however, si
1ed70 6e 63 65 20 77 69 74 68 20 53 51 4c 49 54 45 5f  nce with SQLITE_
1ed80 4e 4f 5f 53 59 4e 43 20 65 6e 61 62 6c 65 64 2c  NO_SYNC enabled,
1ed90 20 61 6e 20 4f 53 20 63 72 61 73 68 0a 2a 2a 20   an OS crash.** 
1eda0 6f 72 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65  or power failure
1edb0 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 63 6f 72   will likely cor
1edc0 72 75 70 74 20 74 68 65 20 64 61 74 61 62 61 73  rupt the databas
1edd0 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 51  e file..**.** SQ
1ede0 4c 69 74 65 20 73 65 74 73 20 74 68 65 20 64 61  Lite sets the da
1edf0 74 61 4f 6e 6c 79 20 66 6c 61 67 20 69 66 20 74  taOnly flag if t
1ee00 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66  he size of the f
1ee10 69 6c 65 20 69 73 20 75 6e 63 68 61 6e 67 65 64  ile is unchanged
1ee20 2e 0a 2a 2a 20 54 68 65 20 69 64 65 61 20 62 65  ..** The idea be
1ee30 68 69 6e 64 20 64 61 74 61 4f 6e 6c 79 20 69 73  hind dataOnly is
1ee40 20 74 68 61 74 20 69 74 20 73 68 6f 75 6c 64 20   that it should 
1ee50 6f 6e 6c 79 20 77 72 69 74 65 20 74 68 65 20 66  only write the f
1ee60 69 6c 65 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20 74  ile content.** t
1ee70 6f 20 64 69 73 6b 2c 20 6e 6f 74 20 74 68 65 20  o disk, not the 
1ee80 69 6e 6f 64 65 2e 20 20 57 65 20 6f 6e 6c 79 20  inode.  We only 
1ee90 73 65 74 20 64 61 74 61 4f 6e 6c 79 20 69 66 20  set dataOnly if 
1eea0 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20 69 73  the file size is
1eeb0 20 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20 73   .** unchanged s
1eec0 69 6e 63 65 20 74 68 65 20 66 69 6c 65 20 73 69  ince the file si
1eed0 7a 65 20 69 73 20 70 61 72 74 20 6f 66 20 74 68  ze is part of th
1eee0 65 20 69 6e 6f 64 65 2e 20 20 48 6f 77 65 76 65  e inode.  Howeve
1eef0 72 2c 20 0a 2a 2a 20 54 65 64 20 54 73 27 6f 20  r, .** Ted Ts'o 
1ef00 74 65 6c 6c 73 20 75 73 20 74 68 61 74 20 66 64  tells us that fd
1ef10 61 74 61 73 79 6e 63 28 29 20 77 69 6c 6c 20 61  atasync() will a
1ef20 6c 73 6f 20 77 72 69 74 65 20 74 68 65 20 69 6e  lso write the in
1ef30 6f 64 65 20 69 66 20 74 68 65 0a 2a 2a 20 66 69  ode if the.** fi
1ef40 6c 65 20 73 69 7a 65 20 68 61 73 20 63 68 61 6e  le size has chan
1ef50 67 65 64 2e 20 20 54 68 65 20 6f 6e 6c 79 20 72  ged.  The only r
1ef60 65 61 6c 20 64 69 66 66 65 72 65 6e 63 65 20 62  eal difference b
1ef70 65 74 77 65 65 6e 20 66 64 61 74 61 73 79 6e 63  etween fdatasync
1ef80 28 29 0a 2a 2a 20 61 6e 64 20 66 73 79 6e 63 28  ().** and fsync(
1ef90 29 2c 20 54 65 64 20 74 65 6c 6c 73 20 75 73 2c  ), Ted tells us,
1efa0 20 69 73 20 74 68 61 74 20 66 64 61 74 61 73 79   is that fdatasy
1efb0 6e 63 28 29 20 77 69 6c 6c 20 6e 6f 74 20 66 6c  nc() will not fl
1efc0 75 73 68 20 74 68 65 0a 2a 2a 20 69 6e 6f 64 65  ush the.** inode
1efd0 20 69 66 20 74 68 65 20 6d 74 69 6d 65 20 6f 72   if the mtime or
1efe0 20 6f 77 6e 65 72 20 6f 72 20 6f 74 68 65 72 20   owner or other 
1eff0 69 6e 6f 64 65 20 61 74 74 72 69 62 75 74 65 73  inode attributes
1f000 20 68 61 76 65 20 63 68 61 6e 67 65 64 2e 0a 2a   have changed..*
1f010 2a 20 57 65 20 6f 6e 6c 79 20 63 61 72 65 20 61  * We only care a
1f020 62 6f 75 74 20 74 68 65 20 66 69 6c 65 20 73 69  bout the file si
1f030 7a 65 2c 20 6e 6f 74 20 74 68 65 20 6f 74 68 65  ze, not the othe
1f040 72 20 66 69 6c 65 20 61 74 74 72 69 62 75 74 65  r file attribute
1f050 73 2c 20 73 6f 0a 2a 2a 20 61 73 20 66 61 72 20  s, so.** as far 
1f060 61 73 20 53 51 4c 69 74 65 20 69 73 20 63 6f 6e  as SQLite is con
1f070 63 65 72 6e 65 64 2c 20 61 6e 20 66 64 61 74 61  cerned, an fdata
1f080 73 79 6e 63 28 29 20 69 73 20 61 6c 77 61 79 73  sync() is always
1f090 20 61 64 65 71 75 61 74 65 2e 0a 2a 2a 20 53 6f   adequate..** So
1f0a0 2c 20 77 65 20 61 6c 77 61 79 73 20 75 73 65 20  , we always use 
1f0b0 66 64 61 74 61 73 79 6e 63 28 29 20 69 66 20 69  fdatasync() if i
1f0c0 74 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20  t is available, 
1f0d0 72 65 67 61 72 64 6c 65 73 73 20 6f 66 0a 2a 2a  regardless of.**
1f0e0 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
1f0f0 65 20 64 61 74 61 4f 6e 6c 79 20 66 6c 61 67 2e  e dataOnly flag.
1f100 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
1f110 75 6c 6c 5f 66 73 79 6e 63 28 69 6e 74 20 66 64  ull_fsync(int fd
1f120 2c 20 69 6e 74 20 66 75 6c 6c 53 79 6e 63 2c 20  , int fullSync, 
1f130 69 6e 74 20 64 61 74 61 4f 6e 6c 79 29 7b 0a 20  int dataOnly){. 
1f140 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 54   int rc;..  /* T
1f150 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 22 69 66  he following "if
1f160 64 65 66 2f 65 6c 69 66 2f 65 6c 73 65 2f 22 20  def/elif/else/" 
1f170 62 6c 6f 63 6b 20 68 61 73 20 74 68 65 20 73 61  block has the sa
1f180 6d 65 20 73 74 72 75 63 74 75 72 65 20 61 73 0a  me structure as.
1f190 20 20 2a 2a 20 74 68 65 20 6f 6e 65 20 62 65 6c    ** the one bel
1f1a0 6f 77 2e 20 49 74 20 69 73 20 72 65 70 6c 69 63  ow. It is replic
1f1b0 61 74 65 64 20 68 65 72 65 20 73 6f 6c 65 6c 79  ated here solely
1f1c0 20 74 6f 20 61 76 6f 69 64 20 63 6c 75 74 74 65   to avoid clutte
1f1d0 72 69 6e 67 20 0a 20 20 2a 2a 20 75 70 20 74 68  ring .  ** up th
1f1e0 65 20 72 65 61 6c 20 63 6f 64 65 20 77 69 74 68  e real code with
1f1f0 20 74 68 65 20 55 4e 55 53 45 44 5f 50 41 52 41   the UNUSED_PARA
1f200 4d 45 54 45 52 28 29 20 6d 61 63 72 6f 73 2e 0a  METER() macros..
1f210 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49    */.#ifdef SQLI
1f220 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20 55 4e 55  TE_NO_SYNC.  UNU
1f230 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66 64  SED_PARAMETER(fd
1f240 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
1f250 4d 45 54 45 52 28 66 75 6c 6c 53 79 6e 63 29 3b  METER(fullSync);
1f260 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
1f270 54 45 52 28 64 61 74 61 4f 6e 6c 79 29 3b 0a 23  TER(dataOnly);.#
1f280 65 6c 69 66 20 48 41 56 45 5f 46 55 4c 4c 46 53  elif HAVE_FULLFS
1f290 59 4e 43 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  YNC.  UNUSED_PAR
1f2a0 41 4d 45 54 45 52 28 64 61 74 61 4f 6e 6c 79 29  AMETER(dataOnly)
1f2b0 3b 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44  ;.#else.  UNUSED
1f2c0 5f 50 41 52 41 4d 45 54 45 52 28 66 75 6c 6c 53  _PARAMETER(fullS
1f2d0 79 6e 63 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  ync);.  UNUSED_P
1f2e0 41 52 41 4d 45 54 45 52 28 64 61 74 61 4f 6e 6c  ARAMETER(dataOnl
1f2f0 79 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a  y);.#endif..  /*
1f300 20 52 65 63 6f 72 64 20 74 68 65 20 6e 75 6d 62   Record the numb
1f310 65 72 20 6f 66 20 74 69 6d 65 73 20 74 68 61 74  er of times that
1f320 20 77 65 20 64 6f 20 61 20 6e 6f 72 6d 61 6c 20   we do a normal 
1f330 66 73 79 6e 63 28 29 20 61 6e 64 20 0a 20 20 2a  fsync() and .  *
1f340 2a 20 46 55 4c 4c 53 59 4e 43 2e 20 20 54 68 69  * FULLSYNC.  Thi
1f350 73 20 69 73 20 75 73 65 64 20 64 75 72 69 6e 67  s is used during
1f360 20 74 65 73 74 69 6e 67 20 74 6f 20 76 65 72 69   testing to veri
1f370 66 79 20 74 68 61 74 20 74 68 69 73 20 70 72 6f  fy that this pro
1f380 63 65 64 75 72 65 0a 20 20 2a 2a 20 67 65 74 73  cedure.  ** gets
1f390 20 63 61 6c 6c 65 64 20 77 69 74 68 20 74 68 65   called with the
1f3a0 20 63 6f 72 72 65 63 74 20 61 72 67 75 6d 65 6e   correct argumen
1f3b0 74 73 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20  ts..  */.#ifdef 
1f3c0 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 66  SQLITE_TEST.  if
1f3d0 28 20 66 75 6c 6c 53 79 6e 63 20 29 20 73 71 6c  ( fullSync ) sql
1f3e0 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f  ite3_fullsync_co
1f3f0 75 6e 74 2b 2b 3b 0a 20 20 73 71 6c 69 74 65 33  unt++;.  sqlite3
1f400 5f 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 23  _sync_count++;.#
1f410 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20 77  endif..  /* If w
1f420 65 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20  e compiled with 
1f430 74 68 65 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59  the SQLITE_NO_SY
1f440 4e 43 20 66 6c 61 67 2c 20 74 68 65 6e 20 73 79  NC flag, then sy
1f450 6e 63 69 6e 67 20 69 73 20 61 0a 20 20 2a 2a 20  ncing is a.  ** 
1f460 6e 6f 2d 6f 70 0a 20 20 2a 2f 0a 23 69 66 64 65  no-op.  */.#ifde
1f470 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43  f SQLITE_NO_SYNC
1f480 0a 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  .  rc = SQLITE_O
1f490 4b 3b 0a 23 65 6c 69 66 20 48 41 56 45 5f 46 55  K;.#elif HAVE_FU
1f4a0 4c 4c 46 53 59 4e 43 0a 20 20 69 66 28 20 66 75  LLFSYNC.  if( fu
1f4b0 6c 6c 53 79 6e 63 20 29 7b 0a 23 69 66 64 65 66  llSync ){.#ifdef
1f4c0 20 53 51 4c 49 54 45 5f 55 53 45 5f 52 45 51 55   SQLITE_USE_REQU
1f4d0 45 53 54 5f 46 55 4c 4c 46 53 59 4e 43 0a 20 20  EST_FULLFSYNC.  
1f4e0 20 20 72 63 20 3d 20 6f 73 46 73 79 6e 63 28 66    rc = osFsync(f
1f4f0 64 29 3b 0a 20 20 20 20 69 66 20 28 21 72 63 29  d);.    if (!rc)
1f500 20 7b 0a 20 20 20 20 20 20 4f 53 53 70 69 6e 4c   {.      OSSpinL
1f510 6f 63 6b 4c 6f 63 6b 28 26 6e 6f 74 69 66 79 5f  ockLock(&notify_
1f520 6c 6f 63 6b 29 3b 0a 20 20 20 20 20 20 72 63 20  lock);.      rc 
1f530 3d 20 6e 6f 74 69 66 79 5f 70 6f 73 74 28 52 45  = notify_post(RE
1f540 51 55 45 53 54 5f 46 55 4c 4c 53 59 4e 43 5f 4e  QUEST_FULLSYNC_N
1f550 4f 54 49 46 49 43 41 54 49 4f 4e 29 3b 0a 20 20  OTIFICATION);.  
1f560 20 20 20 20 4f 53 53 70 69 6e 4c 6f 63 6b 55 6e      OSSpinLockUn
1f570 6c 6f 63 6b 28 26 6e 6f 74 69 66 79 5f 6c 6f 63  lock(&notify_loc
1f580 6b 29 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a  k);.    }.#else.
1f590 20 20 20 20 72 63 20 3d 20 6f 73 46 63 6e 74 6c      rc = osFcntl
1f5a0 28 66 64 2c 20 46 5f 46 55 4c 4c 46 53 59 4e 43  (fd, F_FULLFSYNC
1f5b0 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  , 0);.#endif.  }
1f5c0 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 31  else{.    rc = 1
1f5d0 3b 0a 20 20 7d 0a 20 20 2f 2a 20 49 66 20 74 68  ;.  }.  /* If th
1f5e0 65 20 46 55 4c 4c 46 53 59 4e 43 20 66 61 69 6c  e FULLFSYNC fail
1f5f0 65 64 2c 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f  ed, fall back to
1f600 20 61 74 74 65 6d 70 74 69 6e 67 20 61 6e 20 66   attempting an f
1f610 73 79 6e 63 28 29 2e 0a 20 20 2a 2a 20 49 74 20  sync()..  ** It 
1f620 73 68 6f 75 6c 64 6e 27 74 20 62 65 20 70 6f 73  shouldn't be pos
1f630 73 69 62 6c 65 20 66 6f 72 20 66 75 6c 6c 66 73  sible for fullfs
1f640 79 6e 63 20 74 6f 20 66 61 69 6c 20 6f 6e 20 74  ync to fail on t
1f650 68 65 20 6c 6f 63 61 6c 20 0a 20 20 2a 2a 20 66  he local .  ** f
1f660 69 6c 65 20 73 79 73 74 65 6d 20 28 6f 6e 20 4f  ile system (on O
1f670 53 58 29 2c 20 73 6f 20 66 61 69 6c 75 72 65 20  SX), so failure 
1f680 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 46  indicates that F
1f690 55 4c 4c 46 53 59 4e 43 0a 20 20 2a 2a 20 69 73  ULLFSYNC.  ** is
1f6a0 6e 27 74 20 73 75 70 70 6f 72 74 65 64 20 66 6f  n't supported fo
1f6b0 72 20 74 68 69 73 20 66 69 6c 65 20 73 79 73 74  r this file syst
1f6c0 65 6d 2e 20 53 6f 2c 20 61 74 74 65 6d 70 74 20  em. So, attempt 
1f6d0 61 6e 20 66 73 79 6e 63 20 0a 20 20 2a 2a 20 61  an fsync .  ** a
1f6e0 6e 64 20 28 66 6f 72 20 6e 6f 77 29 20 69 67 6e  nd (for now) ign
1f6f0 6f 72 65 20 74 68 65 20 6f 76 65 72 68 65 61 64  ore the overhead
1f700 20 6f 66 20 61 20 73 75 70 65 72 66 6c 75 6f 75   of a superfluou
1f710 73 20 66 63 6e 74 6c 20 63 61 6c 6c 2e 20 20 0a  s fcntl call.  .
1f720 20 20 2a 2a 20 49 74 27 64 20 62 65 20 62 65 74    ** It'd be bet
1f730 74 65 72 20 74 6f 20 64 65 74 65 63 74 20 66 75  ter to detect fu
1f740 6c 6c 66 73 79 6e 63 20 73 75 70 70 6f 72 74 20  llfsync support 
1f750 6f 6e 63 65 20 61 6e 64 20 61 76 6f 69 64 20 0a  once and avoid .
1f760 20 20 2a 2a 20 74 68 65 20 66 63 6e 74 6c 20 63    ** the fcntl c
1f770 61 6c 6c 20 65 76 65 72 79 20 74 69 6d 65 20 73  all every time s
1f780 79 6e 63 20 69 73 20 63 61 6c 6c 65 64 2e 0a 20  ync is called.. 
1f790 20 2a 2f 0a 20 20 69 66 28 20 72 63 20 29 20 72   */.  if( rc ) r
1f7a0 63 20 3d 20 66 73 79 6e 63 28 66 64 29 3b 0a 0a  c = fsync(fd);..
1f7b0 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  #elif defined(__
1f7c0 41 50 50 4c 45 5f 5f 29 0a 20 20 2f 2a 20 66 64  APPLE__).  /* fd
1f7d0 61 74 61 73 79 6e 63 28 29 20 6f 6e 20 48 46 53  atasync() on HFS
1f7e0 2b 20 64 6f 65 73 6e 27 74 20 79 65 74 20 66 6c  + doesn't yet fl
1f7f0 75 73 68 20 74 68 65 20 66 69 6c 65 20 73 69 7a  ush the file siz
1f800 65 20 69 66 20 69 74 20 63 68 61 6e 67 65 64 20  e if it changed 
1f810 63 6f 72 72 65 63 74 6c 79 0a 20 20 2a 2a 20 73  correctly.  ** s
1f820 6f 20 63 75 72 72 65 6e 74 6c 79 20 77 65 20 64  o currently we d
1f830 65 66 61 75 6c 74 20 74 6f 20 74 68 65 20 6d 61  efault to the ma
1f840 63 72 6f 20 74 68 61 74 20 72 65 64 65 66 69 6e  cro that redefin
1f850 65 73 20 66 64 61 74 61 73 79 6e 63 20 74 6f 20  es fdatasync to 
1f860 66 73 79 6e 63 0a 20 20 2a 2f 0a 20 20 72 63 20  fsync.  */.  rc 
1f870 3d 20 66 73 79 6e 63 28 66 64 29 3b 0a 23 65 6c  = fsync(fd);.#el
1f880 73 65 20 0a 20 20 72 63 20 3d 20 66 64 61 74 61  se .  rc = fdata
1f890 73 79 6e 63 28 66 64 29 3b 0a 23 69 66 20 4f 53  sync(fd);.#if OS
1f8a0 5f 56 58 57 4f 52 4b 53 0a 20 20 69 66 28 20 72  _VXWORKS.  if( r
1f8b0 63 3d 3d 2d 31 20 26 26 20 65 72 72 6e 6f 3d 3d  c==-1 && errno==
1f8c0 45 4e 4f 54 53 55 50 20 29 7b 0a 20 20 20 20 72  ENOTSUP ){.    r
1f8d0 63 20 3d 20 66 73 79 6e 63 28 66 64 29 3b 0a 20  c = fsync(fd);. 
1f8e0 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f   }.#endif /* OS_
1f8f0 56 58 57 4f 52 4b 53 20 2a 2f 0a 23 65 6e 64 69  VXWORKS */.#endi
1f900 66 20 2f 2a 20 69 66 64 65 66 20 53 51 4c 49 54  f /* ifdef SQLIT
1f910 45 5f 4e 4f 5f 53 59 4e 43 20 65 6c 69 66 20 48  E_NO_SYNC elif H
1f920 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 2a 2f  AVE_FULLFSYNC */
1f930 0a 0a 20 20 69 66 28 20 4f 53 5f 56 58 57 4f 52  ..  if( OS_VXWOR
1f940 4b 53 20 26 26 20 72 63 21 3d 20 2d 31 20 29 7b  KS && rc!= -1 ){
1f950 0a 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 7d  .    rc = 0;.  }
1f960 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1f970 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 66 69  ./*.** Open a fi
1f980 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f  le descriptor to
1f990 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 63   the directory c
1f9a0 6f 6e 74 61 69 6e 69 6e 67 20 66 69 6c 65 20 7a  ontaining file z
1f9b0 46 69 6c 65 6e 61 6d 65 2e 0a 2a 2a 20 49 66 20  Filename..** If 
1f9c0 73 75 63 63 65 73 73 66 75 6c 2c 20 2a 70 46 64  successful, *pFd
1f9d0 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6f   is set to the o
1f9e0 70 65 6e 65 64 20 66 69 6c 65 20 64 65 73 63 72  pened file descr
1f9f0 69 70 74 6f 72 20 61 6e 64 0a 2a 2a 20 53 51 4c  iptor and.** SQL
1fa00 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
1fa10 65 64 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  ed. If an error 
1fa20 6f 63 63 75 72 73 2c 20 65 69 74 68 65 72 20 53  occurs, either S
1fa30 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 6f  QLITE_NOMEM.** o
1fa40 72 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  r SQLITE_CANTOPE
1fa50 4e 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  N is returned an
1fa60 64 20 2a 70 46 64 20 69 73 20 73 65 74 20 74 6f  d *pFd is set to
1fa70 20 61 6e 20 75 6e 64 65 66 69 6e 65 64 0a 2a 2a   an undefined.**
1fa80 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54 68   value..**.** Th
1fa90 65 20 64 69 72 65 63 74 6f 72 79 20 66 69 6c 65  e directory file
1faa0 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 75   descriptor is u
1fab0 73 65 64 20 66 6f 72 20 6f 6e 6c 79 20 6f 6e 65  sed for only one
1fac0 20 74 68 69 6e 67 20 2d 20 74 6f 0a 2a 2a 20 66   thing - to.** f
1fad0 73 79 6e 63 28 29 20 61 20 64 69 72 65 63 74 6f  sync() a directo
1fae0 72 79 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ry to make sure 
1faf0 66 69 6c 65 20 63 72 65 61 74 69 6f 6e 20 61 6e  file creation an
1fb00 64 20 64 65 6c 65 74 69 6f 6e 20 65 76 65 6e 74  d deletion event
1fb10 73 0a 2a 2a 20 61 72 65 20 66 6c 75 73 68 65 64  s.** are flushed
1fb20 20 74 6f 20 64 69 73 6b 2e 20 20 53 75 63 68 20   to disk.  Such 
1fb30 66 73 79 6e 63 73 20 61 72 65 20 6e 6f 74 20 6e  fsyncs are not n
1fb40 65 65 64 65 64 20 6f 6e 20 6e 65 77 65 72 0a 2a  eeded on newer.*
1fb50 2a 20 6a 6f 75 72 6e 61 6c 69 6e 67 20 66 69 6c  * journaling fil
1fb60 65 73 79 73 74 65 6d 73 2c 20 62 75 74 20 61 72  esystems, but ar
1fb70 65 20 72 65 71 75 69 72 65 64 20 6f 6e 20 6f 6c  e required on ol
1fb80 64 65 72 20 66 69 6c 65 73 79 73 74 65 6d 73 2e  der filesystems.
1fb90 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
1fba0 69 6e 65 20 63 61 6e 20 62 65 20 6f 76 65 72 72  ine can be overr
1fbb0 69 64 64 65 6e 20 75 73 69 6e 67 20 74 68 65 20  idden using the 
1fbc0 78 53 65 74 53 79 73 43 61 6c 6c 20 69 6e 74 65  xSetSysCall inte
1fbd0 72 66 61 63 65 2e 0a 2a 2a 20 54 68 65 20 61 62  rface..** The ab
1fbe0 69 6c 69 74 79 20 74 6f 20 6f 76 65 72 72 69 64  ility to overrid
1fbf0 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  e this routine w
1fc00 61 73 20 61 64 64 65 64 20 69 6e 20 73 75 70 70  as added in supp
1fc10 6f 72 74 20 6f 66 20 74 68 65 0a 2a 2a 20 63 68  ort of the.** ch
1fc20 72 6f 6d 69 75 6d 20 73 61 6e 64 62 6f 78 2e 20  romium sandbox. 
1fc30 20 4f 70 65 6e 69 6e 67 20 61 20 64 69 72 65 63   Opening a direc
1fc40 74 6f 72 79 20 69 73 20 61 20 73 65 63 75 72 69  tory is a securi
1fc50 74 79 20 72 69 73 6b 20 28 77 65 20 61 72 65 0a  ty risk (we are.
1fc60 2a 2a 20 74 6f 6c 64 29 20 73 6f 20 6d 61 6b 69  ** told) so maki
1fc70 6e 67 20 69 74 20 6f 76 65 72 72 69 64 65 61 62  ng it overrideab
1fc80 6c 65 20 61 6c 6c 6f 77 73 20 74 68 65 20 63 68  le allows the ch
1fc90 72 6f 6d 69 75 6d 20 73 61 6e 64 62 6f 78 20 74  romium sandbox t
1fca0 6f 0a 2a 2a 20 72 65 70 6c 61 63 65 20 74 68 69  o.** replace thi
1fcb0 73 20 72 6f 75 74 69 6e 65 20 77 69 74 68 20 61  s routine with a
1fcc0 20 68 61 72 6d 6c 65 73 73 20 6e 6f 2d 6f 70 2e   harmless no-op.
1fcd0 20 20 54 6f 20 6d 61 6b 65 20 74 68 69 73 20 72    To make this r
1fce0 6f 75 74 69 6e 65 0a 2a 2a 20 61 20 6e 6f 2d 6f  outine.** a no-o
1fcf0 70 2c 20 72 65 70 6c 61 63 65 20 69 74 20 77 69  p, replace it wi
1fd00 74 68 20 61 20 73 74 75 62 20 74 68 61 74 20 72  th a stub that r
1fd10 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b  eturns SQLITE_OK
1fd20 20 62 75 74 20 6c 65 61 76 65 73 0a 2a 2a 20 2a   but leaves.** *
1fd30 70 46 64 20 73 65 74 20 74 6f 20 61 20 6e 65 67  pFd set to a neg
1fd40 61 74 69 76 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a  ative number..**
1fd50 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 4f 4b  .** If SQLITE_OK
1fd60 20 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68   is returned, th
1fd70 65 20 63 61 6c 6c 65 72 20 69 73 20 72 65 73 70  e caller is resp
1fd80 6f 6e 73 69 62 6c 65 20 66 6f 72 20 63 6c 6f 73  onsible for clos
1fd90 69 6e 67 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20  ing.** the file 
1fda0 64 65 73 63 72 69 70 74 6f 72 20 2a 70 46 64 20  descriptor *pFd 
1fdb0 75 73 69 6e 67 20 63 6c 6f 73 65 28 29 2e 0a 2a  using close()..*
1fdc0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 70 65  /.static int ope
1fdd0 6e 44 69 72 65 63 74 6f 72 79 28 63 6f 6e 73 74  nDirectory(const
1fde0 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
1fdf0 2c 20 69 6e 74 20 2a 70 46 64 29 7b 0a 20 20 69  , int *pFd){.  i
1fe00 6e 74 20 69 69 3b 0a 20 20 69 6e 74 20 66 64 20  nt ii;.  int fd 
1fe10 3d 20 2d 31 3b 0a 20 20 63 68 61 72 20 7a 44 69  = -1;.  char zDi
1fe20 72 6e 61 6d 65 5b 4d 41 58 5f 50 41 54 48 4e 41  rname[MAX_PATHNA
1fe30 4d 45 2b 31 5d 3b 0a 0a 20 20 73 71 6c 69 74 65  ME+1];..  sqlite
1fe40 33 5f 73 6e 70 72 69 6e 74 66 28 4d 41 58 5f 50  3_snprintf(MAX_P
1fe50 41 54 48 4e 41 4d 45 2c 20 7a 44 69 72 6e 61 6d  ATHNAME, zDirnam
1fe60 65 2c 20 22 25 73 22 2c 20 7a 46 69 6c 65 6e 61  e, "%s", zFilena
1fe70 6d 65 29 3b 0a 20 20 66 6f 72 28 69 69 3d 28 69  me);.  for(ii=(i
1fe80 6e 74 29 73 74 72 6c 65 6e 28 7a 44 69 72 6e 61  nt)strlen(zDirna
1fe90 6d 65 29 3b 20 69 69 3e 31 20 26 26 20 7a 44 69  me); ii>1 && zDi
1fea0 72 6e 61 6d 65 5b 69 69 5d 21 3d 27 2f 27 3b 20  rname[ii]!='/'; 
1feb0 69 69 2d 2d 29 3b 0a 20 20 69 66 28 20 69 69 3e  ii--);.  if( ii>
1fec0 30 20 29 7b 0a 20 20 20 20 7a 44 69 72 6e 61 6d  0 ){.    zDirnam
1fed0 65 5b 69 69 5d 20 3d 20 27 5c 30 27 3b 0a 20 20  e[ii] = '\0';.  
1fee0 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70    fd = robust_op
1fef0 65 6e 28 7a 44 69 72 6e 61 6d 65 2c 20 4f 5f 52  en(zDirname, O_R
1ff00 44 4f 4e 4c 59 7c 4f 5f 42 49 4e 41 52 59 2c 20  DONLY|O_BINARY, 
1ff10 30 29 3b 0a 20 20 20 20 69 66 28 20 66 64 3e 3d  0);.    if( fd>=
1ff20 30 20 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41  0 ){.      OSTRA
1ff30 43 45 28 28 22 4f 50 45 4e 44 49 52 20 25 2d 33  CE(("OPENDIR %-3
1ff40 64 20 25 73 5c 6e 22 2c 20 66 64 2c 20 7a 44 69  d %s\n", fd, zDi
1ff50 72 6e 61 6d 65 29 29 3b 0a 20 20 20 20 7d 0a 20  rname));.    }. 
1ff60 20 7d 0a 20 20 2a 70 46 64 20 3d 20 66 64 3b 0a   }.  *pFd = fd;.
1ff70 20 20 72 65 74 75 72 6e 20 28 66 64 3e 3d 30 3f    return (fd>=0?
1ff80 53 51 4c 49 54 45 5f 4f 4b 3a 75 6e 69 78 4c 6f  SQLITE_OK:unixLo
1ff90 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41  gError(SQLITE_CA
1ffa0 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c 20 22 6f 70  NTOPEN_BKPT, "op
1ffb0 65 6e 22 2c 20 7a 44 69 72 6e 61 6d 65 29 29 3b  en", zDirname));
1ffc0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73  .}../*.** Make s
1ffd0 75 72 65 20 61 6c 6c 20 77 72 69 74 65 73 20 74  ure all writes t
1ffe0 6f 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 66  o a particular f
1fff0 69 6c 65 20 61 72 65 20 63 6f 6d 6d 69 74 74 65  ile are committe
20000 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a  d to disk..**.**
20010 20 49 66 20 64 61 74 61 4f 6e 6c 79 3d 3d 30 20   If dataOnly==0 
20020 74 68 65 6e 20 62 6f 74 68 20 74 68 65 20 66 69  then both the fi
20030 6c 65 20 69 74 73 65 6c 66 20 61 6e 64 20 69 74  le itself and it
20040 73 20 6d 65 74 61 64 61 74 61 20 28 66 69 6c 65  s metadata (file
20050 0a 2a 2a 20 73 69 7a 65 2c 20 61 63 63 65 73 73  .** size, access
20060 20 74 69 6d 65 2c 20 65 74 63 29 20 61 72 65 20   time, etc) are 
20070 73 79 6e 63 65 64 2e 20 20 49 66 20 64 61 74 61  synced.  If data
20080 4f 6e 6c 79 21 3d 30 20 74 68 65 6e 20 6f 6e 6c  Only!=0 then onl
20090 79 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 64 61  y the.** file da
200a0 74 61 20 69 73 20 73 79 6e 63 65 64 2e 0a 2a 2a  ta is synced..**
200b0 0a 2a 2a 20 55 6e 64 65 72 20 55 6e 69 78 2c 20  .** Under Unix, 
200c0 61 6c 73 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  also make sure t
200d0 68 61 74 20 74 68 65 20 64 69 72 65 63 74 6f 72  hat the director
200e0 79 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20  y entry for the 
200f0 66 69 6c 65 0a 2a 2a 20 68 61 73 20 62 65 65 6e  file.** has been
20100 20 63 72 65 61 74 65 64 20 62 79 20 66 73 79 6e   created by fsyn
20110 63 2d 69 6e 67 20 74 68 65 20 64 69 72 65 63 74  c-ing the direct
20120 6f 72 79 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  ory that contain
20130 73 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 20 49  s the file..** I
20140 66 20 77 65 20 64 6f 20 6e 6f 74 20 64 6f 20 74  f we do not do t
20150 68 69 73 20 61 6e 64 20 77 65 20 65 6e 63 6f 75  his and we encou
20160 6e 74 65 72 20 61 20 70 6f 77 65 72 20 66 61 69  nter a power fai
20170 6c 75 72 65 2c 20 74 68 65 20 64 69 72 65 63 74  lure, the direct
20180 6f 72 79 0a 2a 2a 20 65 6e 74 72 79 20 66 6f 72  ory.** entry for
20190 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67   the journal mig
201a0 68 74 20 6e 6f 74 20 65 78 69 73 74 20 61 66 74  ht not exist aft
201b0 65 72 20 77 65 20 72 65 62 6f 6f 74 2e 20 20 54  er we reboot.  T
201c0 68 65 20 6e 65 78 74 0a 2a 2a 20 53 51 4c 69 74  he next.** SQLit
201d0 65 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20  e to access the 
201e0 66 69 6c 65 20 77 69 6c 6c 20 6e 6f 74 20 6b 6e  file will not kn
201f0 6f 77 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72  ow that the jour
20200 6e 61 6c 20 65 78 69 73 74 73 20 28 62 65 63 61  nal exists (beca
20210 75 73 65 0a 2a 2a 20 74 68 65 20 64 69 72 65 63  use.** the direc
20220 74 6f 72 79 20 65 6e 74 72 79 20 66 6f 72 20 74  tory entry for t
20230 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 6e  he journal was n
20240 65 76 65 72 20 63 72 65 61 74 65 64 29 20 61 6e  ever created) an
20250 64 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  d the transactio
20260 6e 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 72 6f  n.** will not ro
20270 6c 6c 20 62 61 63 6b 20 2d 20 70 6f 73 73 69 62  ll back - possib
20280 6c 79 20 6c 65 61 64 69 6e 67 20 74 6f 20 64 61  ly leading to da
20290 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
202a0 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
202b0 20 75 6e 69 78 53 79 6e 63 28 73 71 6c 69 74 65   unixSync(sqlite
202c0 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
202d0 66 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20 72 63  flags){.  int rc
202e0 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  ;.  unixFile *pF
202f0 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
20300 29 69 64 3b 0a 0a 20 20 69 6e 74 20 69 73 44 61  )id;..  int isDa
20310 74 61 4f 6e 6c 79 20 3d 20 28 66 6c 61 67 73 26  taOnly = (flags&
20320 53 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54 41  SQLITE_SYNC_DATA
20330 4f 4e 4c 59 29 3b 0a 20 20 69 6e 74 20 69 73 46  ONLY);.  int isF
20340 75 6c 6c 73 79 6e 63 20 3d 20 28 66 6c 61 67 73  ullsync = (flags
20350 26 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53  &0x0F)==SQLITE_S
20360 59 4e 43 5f 46 55 4c 4c 3b 0a 0a 20 20 2f 2a 20  YNC_FULL;..  /* 
20370 43 68 65 63 6b 20 74 68 61 74 20 6f 6e 65 20 6f  Check that one o
20380 66 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f  f SQLITE_SYNC_NO
20390 52 4d 41 4c 20 6f 72 20 46 55 4c 4c 20 77 61 73  RMAL or FULL was
203a0 20 70 61 73 73 65 64 20 2a 2f 0a 20 20 61 73 73   passed */.  ass
203b0 65 72 74 28 28 66 6c 61 67 73 26 30 78 30 46 29  ert((flags&0x0F)
203c0 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f  ==SQLITE_SYNC_NO
203d0 52 4d 41 4c 0a 20 20 20 20 20 20 7c 7c 20 28 66  RMAL.      || (f
203e0 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51 4c 49  lags&0x0F)==SQLI
203f0 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 0a 20 20 29  TE_SYNC_FULL.  )
20400 3b 0a 0a 20 20 2f 2a 20 55 6e 69 78 20 63 61 6e  ;..  /* Unix can
20410 6e 6f 74 2c 20 62 75 74 20 73 6f 6d 65 20 73 79  not, but some sy
20420 73 74 65 6d 73 20 6d 61 79 20 72 65 74 75 72 6e  stems may return
20430 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 66 72 6f   SQLITE_FULL fro
20440 6d 20 68 65 72 65 2e 20 54 68 69 73 0a 20 20 2a  m here. This.  *
20450 2a 20 6c 69 6e 65 20 69 73 20 74 6f 20 74 65 73  * line is to tes
20460 74 20 74 68 61 74 20 64 6f 69 6e 67 20 73 6f 20  t that doing so 
20470 64 6f 65 73 20 6e 6f 74 20 63 61 75 73 65 20 61  does not cause a
20480 6e 79 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 2a  ny problems..  *
20490 2f 0a 20 20 53 69 6d 75 6c 61 74 65 44 69 73 6b  /.  SimulateDisk
204a0 66 75 6c 6c 45 72 72 6f 72 28 20 72 65 74 75 72  fullError( retur
204b0 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 3b  n SQLITE_FULL );
204c0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  ..  assert( pFil
204d0 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  e );.  OSTRACE((
204e0 22 53 59 4e 43 20 20 20 20 25 2d 33 64 5c 6e 22  "SYNC    %-3d\n"
204f0 2c 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20  , pFile->h));.  
20500 72 63 20 3d 20 66 75 6c 6c 5f 66 73 79 6e 63 28  rc = full_fsync(
20510 70 46 69 6c 65 2d 3e 68 2c 20 69 73 46 75 6c 6c  pFile->h, isFull
20520 73 79 6e 63 2c 20 69 73 44 61 74 61 4f 6e 6c 79  sync, isDataOnly
20530 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  );.  SimulateIOE
20540 72 72 6f 72 28 20 72 63 3d 31 20 29 3b 0a 20 20  rror( rc=1 );.  
20550 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 73 74  if( rc ){.    st
20560 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69  oreLastErrno(pFi
20570 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20  le, errno);.    
20580 72 65 74 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72  return unixLogEr
20590 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52  ror(SQLITE_IOERR
205a0 5f 46 53 59 4e 43 2c 20 22 66 75 6c 6c 5f 66 73  _FSYNC, "full_fs
205b0 79 6e 63 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61  ync", pFile->zPa
205c0 74 68 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41  th);.  }..  /* A
205d0 6c 73 6f 20 66 73 79 6e 63 20 74 68 65 20 64 69  lso fsync the di
205e0 72 65 63 74 6f 72 79 20 63 6f 6e 74 61 69 6e 69  rectory containi
205f0 6e 67 20 74 68 65 20 66 69 6c 65 20 69 66 20 74  ng the file if t
20600 68 65 20 44 49 52 53 59 4e 43 20 66 6c 61 67 0a  he DIRSYNC flag.
20610 20 20 2a 2a 20 69 73 20 73 65 74 2e 20 20 54 68    ** is set.  Th
20620 69 73 20 69 73 20 61 20 6f 6e 65 2d 74 69 6d 65  is is a one-time
20630 20 6f 63 63 75 72 72 65 6e 63 65 2e 20 20 4d 61   occurrence.  Ma
20640 6e 79 20 73 79 73 74 65 6d 73 20 28 65 78 61 6d  ny systems (exam
20650 70 6c 65 73 3a 20 41 49 58 29 0a 20 20 2a 2a 20  ples: AIX).  ** 
20660 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 66 73  are unable to fs
20670 79 6e 63 20 61 20 64 69 72 65 63 74 6f 72 79 2c  ync a directory,
20680 20 73 6f 20 69 67 6e 6f 72 65 20 65 72 72 6f 72   so ignore error
20690 73 20 6f 6e 20 74 68 65 20 66 73 79 6e 63 2e 0a  s on the fsync..
206a0 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65    */.  if( pFile
206b0 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e  ->ctrlFlags & UN
206c0 49 58 46 49 4c 45 5f 44 49 52 53 59 4e 43 20 29  IXFILE_DIRSYNC )
206d0 7b 0a 20 20 20 20 69 6e 74 20 64 69 72 66 64 3b  {.    int dirfd;
206e0 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 44  .    OSTRACE(("D
206f0 49 52 53 59 4e 43 20 25 73 20 28 68 61 76 65 5f  IRSYNC %s (have_
20700 66 75 6c 6c 66 73 79 6e 63 3d 25 64 20 66 75 6c  fullfsync=%d ful
20710 6c 73 79 6e 63 3d 25 64 29 5c 6e 22 2c 20 70 46  lsync=%d)\n", pF
20720 69 6c 65 2d 3e 7a 50 61 74 68 2c 0a 20 20 20 20  ile->zPath,.    
20730 20 20 20 20 20 20 20 20 48 41 56 45 5f 46 55 4c          HAVE_FUL
20740 4c 46 53 59 4e 43 2c 20 69 73 46 75 6c 6c 73 79  LFSYNC, isFullsy
20750 6e 63 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 6f  nc));.    rc = o
20760 73 4f 70 65 6e 44 69 72 65 63 74 6f 72 79 28 70  sOpenDirectory(p
20770 46 69 6c 65 2d 3e 7a 50 61 74 68 2c 20 26 64 69  File->zPath, &di
20780 72 66 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63  rfd);.    if( rc
20790 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 64  ==SQLITE_OK && d
207a0 69 72 66 64 3e 3d 30 20 29 7b 0a 20 20 20 20 20  irfd>=0 ){.     
207b0 20 66 75 6c 6c 5f 66 73 79 6e 63 28 64 69 72 66   full_fsync(dirf
207c0 64 2c 20 30 2c 20 30 29 3b 0a 23 69 66 20 4f 53  d, 0, 0);.#if OS
207d0 43 4c 4f 53 45 5f 43 48 45 43 4b 5f 43 4c 4f 53  CLOSE_CHECK_CLOS
207e0 45 5f 49 4f 45 52 52 0a 20 20 20 20 20 20 69 66  E_IOERR.      if
207f0 28 20 63 6c 6f 73 65 28 70 46 69 6c 65 2d 3e 64  ( close(pFile->d
20800 69 72 66 64 29 20 29 7b 0a 20 20 20 20 20 20 20  irfd) ){.       
20810 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28   storeLastErrno(
20820 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 20  pFile, errno);. 
20830 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
20840 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f 43 4c 4f  TE_IOERR_DIR_CLO
20850 53 45 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6c 73  SE;.      }.#els
20860 65 0a 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63  e.      robust_c
20870 6c 6f 73 65 28 70 46 69 6c 65 2c 20 64 69 72 66  lose(pFile, dirf
20880 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 23 65  d, __LINE__);.#e
20890 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 20 69  ndif.    }else i
208a0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 41  f( rc==SQLITE_CA
208b0 4e 54 4f 50 45 4e 20 29 7b 0a 20 20 20 20 20 20  NTOPEN ){.      
208c0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
208d0 20 20 20 20 7d 0a 20 20 20 20 70 46 69 6c 65 2d      }.    pFile-
208e0 3e 63 74 72 6c 46 6c 61 67 73 20 26 3d 20 7e 55  >ctrlFlags &= ~U
208f0 4e 49 58 46 49 4c 45 5f 44 49 52 53 59 4e 43 3b  NIXFILE_DIRSYNC;
20900 0a 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ..  }.  return r
20910 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e  c;.}../*.** Trun
20920 63 61 74 65 20 61 6e 20 6f 70 65 6e 20 66 69 6c  cate an open fil
20930 65 20 74 6f 20 61 20 73 70 65 63 69 66 69 65 64  e to a specified
20940 20 73 69 7a 65 0a 2a 2f 0a 73 74 61 74 69 63 20   size.*/.static 
20950 69 6e 74 20 75 6e 69 78 54 72 75 6e 63 61 74 65  int unixTruncate
20960 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
20970 64 2c 20 69 36 34 20 6e 42 79 74 65 29 7b 0a 20  d, i64 nByte){. 
20980 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
20990 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 69   = (unixFile *)i
209a0 64 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61  d;.  int rc;.  a
209b0 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
209c0 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
209d0 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r( return SQLITE
209e0 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 20  _IOERR_TRUNCATE 
209f0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
20a00 75 73 65 72 20 68 61 73 20 63 6f 6e 66 69 67 75  user has configu
20a10 72 65 64 20 61 20 63 68 75 6e 6b 2d 73 69 7a 65  red a chunk-size
20a20 20 66 6f 72 20 74 68 69 73 20 66 69 6c 65 2c 20   for this file, 
20a30 74 72 75 6e 63 61 74 65 20 74 68 65 0a 20 20 2a  truncate the.  *
20a40 2a 20 66 69 6c 65 20 73 6f 20 74 68 61 74 20 69  * file so that i
20a50 74 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 6e  t consists of an
20a60 20 69 6e 74 65 67 65 72 20 6e 75 6d 62 65 72 20   integer number 
20a70 6f 66 20 63 68 75 6e 6b 73 20 28 69 2e 65 2e 20  of chunks (i.e. 
20a80 74 68 65 0a 20 20 2a 2a 20 61 63 74 75 61 6c 20  the.  ** actual 
20a90 66 69 6c 65 20 73 69 7a 65 20 61 66 74 65 72 20  file size after 
20aa0 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 6d 61  the operation ma
20ab0 79 20 62 65 20 6c 61 72 67 65 72 20 74 68 61 6e  y be larger than
20ac0 20 74 68 65 20 72 65 71 75 65 73 74 65 64 0a 20   the requested. 
20ad0 20 2a 2a 20 73 69 7a 65 29 2e 0a 20 20 2a 2f 0a   ** size)..  */.
20ae0 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 73 7a 43    if( pFile->szC
20af0 68 75 6e 6b 3e 30 20 29 7b 0a 20 20 20 20 6e 42  hunk>0 ){.    nB
20b00 79 74 65 20 3d 20 28 28 6e 42 79 74 65 20 2b 20  yte = ((nByte + 
20b10 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20 2d  pFile->szChunk -
20b20 20 31 29 2f 70 46 69 6c 65 2d 3e 73 7a 43 68 75   1)/pFile->szChu
20b30 6e 6b 29 20 2a 20 70 46 69 6c 65 2d 3e 73 7a 43  nk) * pFile->szC
20b40 68 75 6e 6b 3b 0a 20 20 7d 0a 0a 20 20 72 63 20  hunk;.  }..  rc 
20b50 3d 20 72 6f 62 75 73 74 5f 66 74 72 75 6e 63 61  = robust_ftrunca
20b60 74 65 28 70 46 69 6c 65 2d 3e 68 2c 20 6e 42 79  te(pFile->h, nBy
20b70 74 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  te);.  if( rc ){
20b80 0a 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72  .    storeLastEr
20b90 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f  rno(pFile, errno
20ba0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 75 6e  );.    return un
20bb0 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  ixLogError(SQLIT
20bc0 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45  E_IOERR_TRUNCATE
20bd0 2c 20 22 66 74 72 75 6e 63 61 74 65 22 2c 20 70  , "ftruncate", p
20be0 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  File->zPath);.  
20bf0 7d 65 6c 73 65 7b 0a 23 69 66 64 65 66 20 53 51  }else{.#ifdef SQ
20c00 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 2f  LITE_DEBUG.    /
20c10 2a 20 49 66 20 77 65 20 61 72 65 20 64 6f 69 6e  * If we are doin
20c20 67 20 61 20 6e 6f 72 6d 61 6c 20 77 72 69 74 65  g a normal write
20c30 20 74 6f 20 61 20 64 61 74 61 62 61 73 65 20 66   to a database f
20c40 69 6c 65 20 28 61 73 20 6f 70 70 6f 73 65 64 20  ile (as opposed 
20c50 74 6f 0a 20 20 20 20 2a 2a 20 64 6f 69 6e 67 20  to.    ** doing 
20c60 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  a hot-journal ro
20c70 6c 6c 62 61 63 6b 20 6f 72 20 61 20 77 72 69 74  llback or a writ
20c80 65 20 74 6f 20 73 6f 6d 65 20 66 69 6c 65 20 6f  e to some file o
20c90 74 68 65 72 20 74 68 61 6e 20 61 0a 20 20 20 20  ther than a.    
20ca0 2a 2a 20 6e 6f 72 6d 61 6c 20 64 61 74 61 62 61  ** normal databa
20cb0 73 65 20 66 69 6c 65 29 20 61 6e 64 20 77 65 20  se file) and we 
20cc0 74 72 75 6e 63 61 74 65 20 74 68 65 20 66 69 6c  truncate the fil
20cd0 65 20 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68  e to zero length
20ce0 2c 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 65 66  ,.    ** that ef
20cf0 66 65 63 74 69 76 65 6c 79 20 75 70 64 61 74 65  fectively update
20d00 73 20 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75  s the change cou
20d10 6e 74 65 72 2e 20 20 54 68 69 73 20 6d 69 67 68  nter.  This migh
20d20 74 20 68 61 70 70 65 6e 0a 20 20 20 20 2a 2a 20  t happen.    ** 
20d30 77 68 65 6e 20 72 65 73 74 6f 72 69 6e 67 20 61  when restoring a
20d40 20 64 61 74 61 62 61 73 65 20 75 73 69 6e 67 20   database using 
20d50 74 68 65 20 62 61 63 6b 75 70 20 41 50 49 20 66  the backup API f
20d60 72 6f 6d 20 61 20 7a 65 72 6f 2d 6c 65 6e 67 74  rom a zero-lengt
20d70 68 0a 20 20 20 20 2a 2a 20 73 6f 75 72 63 65 2e  h.    ** source.
20d80 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
20d90 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57  pFile->inNormalW
20da0 72 69 74 65 20 26 26 20 6e 42 79 74 65 3d 3d 30  rite && nByte==0
20db0 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d   ){.      pFile-
20dc0 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 20 3d  >transCntrChng =
20dd0 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66   1;.    }.#endif
20de0 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  ..#if SQLITE_MAX
20df0 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 20  _MMAP_SIZE>0.   
20e00 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20   /* If the file 
20e10 77 61 73 20 6a 75 73 74 20 74 72 75 6e 63 61 74  was just truncat
20e20 65 64 20 74 6f 20 61 20 73 69 7a 65 20 73 6d 61  ed to a size sma
20e30 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20 63 75  ller than the cu
20e40 72 72 65 6e 74 6c 79 0a 20 20 20 20 2a 2a 20 6d  rrently.    ** m
20e50 61 70 70 65 64 20 72 65 67 69 6f 6e 2c 20 72 65  apped region, re
20e60 64 75 63 65 20 74 68 65 20 65 66 66 65 63 74 69  duce the effecti
20e70 76 65 20 6d 61 70 70 69 6e 67 20 73 69 7a 65 20  ve mapping size 
20e80 61 73 20 77 65 6c 6c 2e 20 53 51 4c 69 74 65 20  as well. SQLite 
20e90 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 75 73 65 20  will.    ** use 
20ea0 72 65 61 64 28 29 20 61 6e 64 20 77 72 69 74 65  read() and write
20eb0 28 29 20 74 6f 20 61 63 63 65 73 73 20 64 61 74  () to access dat
20ec0 61 20 62 65 79 6f 6e 64 20 74 68 69 73 20 70 6f  a beyond this po
20ed0 69 6e 74 20 66 72 6f 6d 20 6e 6f 77 20 6f 6e 2e  int from now on.
20ee0 20 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66    .    */.    if
20ef0 28 20 6e 42 79 74 65 3c 70 46 69 6c 65 2d 3e 6d  ( nByte<pFile->m
20f00 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  mapSize ){.     
20f10 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65   pFile->mmapSize
20f20 20 3d 20 6e 42 79 74 65 3b 0a 20 20 20 20 7d 0a   = nByte;.    }.
20f30 23 65 6e 64 69 66 0a 0a 20 20 20 20 72 65 74 75  #endif..    retu
20f40 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
20f50 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72  }.}../*.** Deter
20f60 6d 69 6e 65 20 74 68 65 20 63 75 72 72 65 6e 74  mine the current
20f70 20 73 69 7a 65 20 6f 66 20 61 20 66 69 6c 65 20   size of a file 
20f80 69 6e 20 62 79 74 65 73 0a 2a 2f 0a 73 74 61 74  in bytes.*/.stat
20f90 69 63 20 69 6e 74 20 75 6e 69 78 46 69 6c 65 53  ic int unixFileS
20fa0 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ize(sqlite3_file
20fb0 20 2a 69 64 2c 20 69 36 34 20 2a 70 53 69 7a 65   *id, i64 *pSize
20fc0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  ){.  int rc;.  s
20fd0 74 72 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a  truct stat buf;.
20fe0 20 20 61 73 73 65 72 74 28 20 69 64 20 29 3b 0a    assert( id );.
20ff0 20 20 72 63 20 3d 20 6f 73 46 73 74 61 74 28 28    rc = osFstat((
21000 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e  (unixFile*)id)->
21010 68 2c 20 26 62 75 66 29 3b 0a 20 20 53 69 6d 75  h, &buf);.  Simu
21020 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72 63 3d  lateIOError( rc=
21030 31 20 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 30  1 );.  if( rc!=0
21040 20 29 7b 0a 20 20 20 20 73 74 6f 72 65 4c 61 73   ){.    storeLas
21050 74 45 72 72 6e 6f 28 28 75 6e 69 78 46 69 6c 65  tErrno((unixFile
21060 2a 29 69 64 2c 20 65 72 72 6e 6f 29 3b 0a 20 20  *)id, errno);.  
21070 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
21080 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a 20 20 7d  IOERR_FSTAT;.  }
21090 0a 20 20 2a 70 53 69 7a 65 20 3d 20 62 75 66 2e  .  *pSize = buf.
210a0 73 74 5f 73 69 7a 65 3b 0a 0a 20 20 2f 2a 20 57  st_size;..  /* W
210b0 68 65 6e 20 6f 70 65 6e 69 6e 67 20 61 20 7a 65  hen opening a ze
210c0 72 6f 2d 73 69 7a 65 20 64 61 74 61 62 61 73 65  ro-size database
210d0 2c 20 74 68 65 20 66 69 6e 64 49 6e 6f 64 65 49  , the findInodeI
210e0 6e 66 6f 28 29 20 70 72 6f 63 65 64 75 72 65 0a  nfo() procedure.
210f0 20 20 2a 2a 20 77 72 69 74 65 73 20 61 20 73 69    ** writes a si
21100 6e 67 6c 65 20 62 79 74 65 20 69 6e 74 6f 20 74  ngle byte into t
21110 68 61 74 20 66 69 6c 65 20 69 6e 20 6f 72 64 65  hat file in orde
21120 72 20 74 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64  r to work around
21130 20 61 20 62 75 67 0a 20 20 2a 2a 20 69 6e 20 74   a bug.  ** in t
21140 68 65 20 4f 53 2d 58 20 6d 73 64 6f 73 20 66 69  he OS-X msdos fi
21150 6c 65 73 79 73 74 65 6d 2e 20 20 49 6e 20 6f 72  lesystem.  In or
21160 64 65 72 20 74 6f 20 61 76 6f 69 64 20 70 72 6f  der to avoid pro
21170 62 6c 65 6d 73 20 77 69 74 68 20 75 70 70 65 72  blems with upper
21180 0a 20 20 2a 2a 20 6c 61 79 65 72 73 2c 20 77 65  .  ** layers, we
21190 20 6e 65 65 64 20 74 6f 20 72 65 70 6f 72 74 20   need to report 
211a0 74 68 69 73 20 66 69 6c 65 20 73 69 7a 65 20 61  this file size a
211b0 73 20 7a 65 72 6f 20 65 76 65 6e 20 74 68 6f 75  s zero even thou
211c0 67 68 20 69 74 20 69 73 0a 20 20 2a 2a 20 72 65  gh it is.  ** re
211d0 61 6c 6c 79 20 31 2e 20 20 20 54 69 63 6b 65 74  ally 1.   Ticket
211e0 20 23 33 32 36 30 2e 0a 20 20 2a 2f 0a 20 20 69   #3260..  */.  i
211f0 66 28 20 2a 70 53 69 7a 65 3d 3d 31 20 29 20 2a  f( *pSize==1 ) *
21200 70 53 69 7a 65 20 3d 20 30 3b 0a 0a 0a 20 20 72  pSize = 0;...  r
21210 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
21220 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 45  .}..#if SQLITE_E
21230 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
21240 59 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f  YLE && defined(_
21250 5f 41 50 50 4c 45 5f 5f 29 0a 2f 2a 0a 2a 2a 20  _APPLE__)./*.** 
21260 48 61 6e 64 6c 65 72 20 66 6f 72 20 70 72 6f 78  Handler for prox
21270 79 2d 6c 6f 63 6b 69 6e 67 20 66 69 6c 65 2d 63  y-locking file-c
21280 6f 6e 74 72 6f 6c 20 76 65 72 62 73 2e 20 20 44  ontrol verbs.  D
21290 65 66 69 6e 65 64 20 62 65 6c 6f 77 20 69 6e 20  efined below in 
212a0 74 68 65 0a 2a 2a 20 70 72 6f 78 79 69 6e 67 20  the.** proxying 
212b0 6c 6f 63 6b 69 6e 67 20 64 69 76 69 73 69 6f 6e  locking division
212c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
212d0 70 72 6f 78 79 46 69 6c 65 43 6f 6e 74 72 6f 6c  proxyFileControl
212e0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 69  (sqlite3_file*,i
212f0 6e 74 2c 76 6f 69 64 2a 29 3b 0a 23 65 6e 64 69  nt,void*);.#endi
21300 66 0a 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 66  f../* .** This f
21310 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
21320 64 20 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20  d to handle the 
21330 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a  SQLITE_FCNTL_SIZ
21340 45 5f 48 49 4e 54 20 0a 2a 2a 20 66 69 6c 65 2d  E_HINT .** file-
21350 63 6f 6e 74 72 6f 6c 20 6f 70 65 72 61 74 69 6f  control operatio
21360 6e 2e 20 20 45 6e 6c 61 72 67 65 20 74 68 65 20  n.  Enlarge the 
21370 64 61 74 61 62 61 73 65 20 74 6f 20 6e 42 79 74  database to nByt
21380 65 73 20 69 6e 20 73 69 7a 65 0a 2a 2a 20 28 72  es in size.** (r
21390 6f 75 6e 64 65 64 20 75 70 20 74 6f 20 74 68 65  ounded up to the
213a0 20 6e 65 78 74 20 63 68 75 6e 6b 2d 73 69 7a 65   next chunk-size
213b0 29 2e 20 20 49 66 20 74 68 65 20 64 61 74 61 62  ).  If the datab
213c0 61 73 65 20 69 73 20 61 6c 72 65 61 64 79 0a 2a  ase is already.*
213d0 2a 20 6e 42 79 74 65 73 20 6f 72 20 6c 61 72 67  * nBytes or larg
213e0 65 72 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  er, this routine
213f0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
21400 73 74 61 74 69 63 20 69 6e 74 20 66 63 6e 74 6c  static int fcntl
21410 53 69 7a 65 48 69 6e 74 28 75 6e 69 78 46 69 6c  SizeHint(unixFil
21420 65 20 2a 70 46 69 6c 65 2c 20 69 36 34 20 6e 42  e *pFile, i64 nB
21430 79 74 65 29 7b 0a 20 20 69 66 28 20 70 46 69 6c  yte){.  if( pFil
21440 65 2d 3e 73 7a 43 68 75 6e 6b 3e 30 20 29 7b 0a  e->szChunk>0 ){.
21450 20 20 20 20 69 36 34 20 6e 53 69 7a 65 3b 20 20      i64 nSize;  
21460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21470 20 20 2f 2a 20 52 65 71 75 69 72 65 64 20 66 69    /* Required fi
21480 6c 65 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 73  le size */.    s
21490 74 72 75 63 74 20 73 74 61 74 20 62 75 66 3b 20  truct stat buf; 
214a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
214b0 55 73 65 64 20 74 6f 20 68 6f 6c 64 20 72 65 74  Used to hold ret
214c0 75 72 6e 20 76 61 6c 75 65 73 20 6f 66 20 66 73  urn values of fs
214d0 74 61 74 28 29 20 2a 2f 0a 20 20 20 0a 20 20 20  tat() */.   .   
214e0 20 69 66 28 20 6f 73 46 73 74 61 74 28 70 46 69   if( osFstat(pFi
214f0 6c 65 2d 3e 68 2c 20 26 62 75 66 29 20 29 7b 0a  le->h, &buf) ){.
21500 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45        storeLastE
21510 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e  rrno(pFile, errn
21520 6f 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  o);.      return
21530 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53   SQLITE_IOERR_FS
21540 54 41 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  TAT;.    }..    
21550 6e 53 69 7a 65 20 3d 20 28 28 6e 42 79 74 65 2b  nSize = ((nByte+
21560 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 2d 31  pFile->szChunk-1
21570 29 20 2f 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75  ) / pFile->szChu
21580 6e 6b 29 20 2a 20 70 46 69 6c 65 2d 3e 73 7a 43  nk) * pFile->szC
21590 68 75 6e 6b 3b 0a 20 20 20 20 69 66 28 20 6e 53  hunk;.    if( nS
215a0 69 7a 65 3e 28 69 36 34 29 62 75 66 2e 73 74 5f  ize>(i64)buf.st_
215b0 73 69 7a 65 20 29 7b 0a 0a 23 69 66 20 64 65 66  size ){..#if def
215c0 69 6e 65 64 28 48 41 56 45 5f 50 4f 53 49 58 5f  ined(HAVE_POSIX_
215d0 46 41 4c 4c 4f 43 41 54 45 29 20 26 26 20 48 41  FALLOCATE) && HA
215e0 56 45 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f 43 41  VE_POSIX_FALLOCA
215f0 54 45 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  TE.      /* The 
21600 63 6f 64 65 20 62 65 6c 6f 77 20 69 73 20 68 61  code below is ha
21610 6e 64 6c 69 6e 67 20 74 68 65 20 72 65 74 75 72  ndling the retur
21620 6e 20 76 61 6c 75 65 20 6f 66 20 6f 73 46 61 6c  n value of osFal
21630 6c 6f 63 61 74 65 28 29 20 0a 20 20 20 20 20 20  locate() .      
21640 2a 2a 20 63 6f 72 72 65 63 74 6c 79 2e 20 70 6f  ** correctly. po
21650 73 69 78 5f 66 61 6c 6c 6f 63 61 74 65 28 29 20  six_fallocate() 
21660 69 73 20 64 65 66 69 6e 65 64 20 74 6f 20 22 72  is defined to "r
21670 65 74 75 72 6e 73 20 7a 65 72 6f 20 6f 6e 20 73  eturns zero on s
21680 75 63 63 65 73 73 2c 20 0a 20 20 20 20 20 20 2a  uccess, .      *
21690 2a 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 6e 75  * or an error nu
216a0 6d 62 65 72 20 6f 6e 20 20 66 61 69 6c 75 72 65  mber on  failure
216b0 22 2e 20 53 65 65 20 74 68 65 20 6d 61 6e 70 61  ". See the manpa
216c0 67 65 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 20  ge for details. 
216d0 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 65 72 72  */.      int err
216e0 3b 0a 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20  ;.      do{.    
216f0 20 20 20 20 65 72 72 20 3d 20 6f 73 46 61 6c 6c      err = osFall
21700 6f 63 61 74 65 28 70 46 69 6c 65 2d 3e 68 2c 20  ocate(pFile->h, 
21710 62 75 66 2e 73 74 5f 73 69 7a 65 2c 20 6e 53 69  buf.st_size, nSi
21720 7a 65 2d 62 75 66 2e 73 74 5f 73 69 7a 65 29 3b  ze-buf.st_size);
21730 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28 20 65  .      }while( e
21740 72 72 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20 20  rr==EINTR );.   
21750 20 20 20 69 66 28 20 65 72 72 20 29 20 72 65 74     if( err ) ret
21760 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
21770 5f 57 52 49 54 45 3b 0a 23 65 6c 73 65 0a 20 20  _WRITE;.#else.  
21780 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 4f 53      /* If the OS
21790 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 70   does not have p
217a0 6f 73 69 78 5f 66 61 6c 6c 6f 63 61 74 65 28 29  osix_fallocate()
217b0 2c 20 66 61 6b 65 20 69 74 2e 20 57 72 69 74 65  , fake it. Write
217c0 20 61 20 0a 20 20 20 20 20 20 2a 2a 20 73 69 6e   a .      ** sin
217d0 67 6c 65 20 62 79 74 65 20 74 6f 20 74 68 65 20  gle byte to the 
217e0 6c 61 73 74 20 62 79 74 65 20 69 6e 20 65 61 63  last byte in eac
217f0 68 20 62 6c 6f 63 6b 20 74 68 61 74 20 66 61 6c  h block that fal
21800 6c 73 20 65 6e 74 69 72 65 6c 79 0a 20 20 20 20  ls entirely.    
21810 20 20 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20    ** within the 
21820 65 78 74 65 6e 64 65 64 20 72 65 67 69 6f 6e 2e  extended region.
21830 20 54 68 65 6e 2c 20 69 66 20 72 65 71 75 69 72   Then, if requir
21840 65 64 2c 20 61 20 73 69 6e 67 6c 65 20 62 79 74  ed, a single byt
21850 65 0a 20 20 20 20 20 20 2a 2a 20 61 74 20 6f 66  e.      ** at of
21860 66 73 65 74 20 28 6e 53 69 7a 65 2d 31 29 2c 20  fset (nSize-1), 
21870 74 6f 20 73 65 74 20 74 68 65 20 73 69 7a 65 20  to set the size 
21880 6f 66 20 74 68 65 20 66 69 6c 65 20 63 6f 72 72  of the file corr
21890 65 63 74 6c 79 2e 0a 20 20 20 20 20 20 2a 2a 20  ectly..      ** 
218a0 54 68 69 73 20 69 73 20 61 20 73 69 6d 69 6c 61  This is a simila
218b0 72 20 74 65 63 68 6e 69 71 75 65 20 74 6f 20 74  r technique to t
218c0 68 61 74 20 75 73 65 64 20 62 79 20 67 6c 69 62  hat used by glib
218d0 63 20 6f 6e 20 73 79 73 74 65 6d 73 0a 20 20 20  c on systems.   
218e0 20 20 20 2a 2a 20 74 68 61 74 20 64 6f 20 6e 6f     ** that do no
218f0 74 20 68 61 76 65 20 61 20 72 65 61 6c 20 66 61  t have a real fa
21900 6c 6c 6f 63 61 74 65 28 29 20 63 61 6c 6c 2e 0a  llocate() call..
21910 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
21920 6e 74 20 6e 42 6c 6b 20 3d 20 62 75 66 2e 73 74  nt nBlk = buf.st
21930 5f 62 6c 6b 73 69 7a 65 3b 20 20 2f 2a 20 46 69  _blksize;  /* Fi
21940 6c 65 2d 73 79 73 74 65 6d 20 62 6c 6f 63 6b 20  le-system block 
21950 73 69 7a 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e  size */.      in
21960 74 20 6e 57 72 69 74 65 20 3d 20 30 3b 20 20 20  t nWrite = 0;   
21970 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
21980 62 65 72 20 6f 66 20 62 79 74 65 73 20 77 72 69  ber of bytes wri
21990 74 74 65 6e 20 62 79 20 73 65 65 6b 41 6e 64 57  tten by seekAndW
219a0 72 69 74 65 20 2a 2f 0a 20 20 20 20 20 20 69 36  rite */.      i6
219b0 34 20 69 57 72 69 74 65 3b 20 20 20 20 20 20 20  4 iWrite;       
219c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78            /* Nex
219d0 74 20 6f 66 66 73 65 74 20 74 6f 20 77 72 69 74  t offset to writ
219e0 65 20 74 6f 20 2a 2f 0a 0a 20 20 20 20 20 20 69  e to */..      i
219f0 66 28 20 72 6f 62 75 73 74 5f 66 74 72 75 6e 63  f( robust_ftrunc
21a00 61 74 65 28 70 46 69 6c 65 2d 3e 68 2c 20 6e 53  ate(pFile->h, nS
21a10 69 7a 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ize) ){.        
21a20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70  storeLastErrno(p
21a30 46 69 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 20 20  File, errno);.  
21a40 20 20 20 20 20 20 72 65 74 75 72 6e 20 75 6e 69        return uni
21a50 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  xLogError(SQLITE
21a60 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 2c  _IOERR_TRUNCATE,
21a70 20 22 66 74 72 75 6e 63 61 74 65 22 2c 20 70 46   "ftruncate", pF
21a80 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20  ile->zPath);.   
21a90 20 20 20 7d 0a 20 20 20 20 20 20 69 57 72 69 74     }.      iWrit
21aa0 65 20 3d 20 28 28 62 75 66 2e 73 74 5f 73 69 7a  e = ((buf.st_siz
21ab0 65 20 2b 20 32 2a 6e 42 6c 6b 20 2d 20 31 29 2f  e + 2*nBlk - 1)/
21ac0 6e 42 6c 6b 29 2a 6e 42 6c 6b 2d 31 3b 0a 20 20  nBlk)*nBlk-1;.  
21ad0 20 20 20 20 61 73 73 65 72 74 28 20 69 57 72 69      assert( iWri
21ae0 74 65 3e 3d 62 75 66 2e 73 74 5f 73 69 7a 65 20  te>=buf.st_size 
21af0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
21b00 20 28 69 57 72 69 74 65 2f 6e 42 6c 6b 29 3d 3d   (iWrite/nBlk)==
21b10 28 28 62 75 66 2e 73 74 5f 73 69 7a 65 2b 6e 42  ((buf.st_size+nB
21b20 6c 6b 2d 31 29 2f 6e 42 6c 6b 29 20 29 3b 0a 20  lk-1)/nBlk) );. 
21b30 20 20 20 20 20 61 73 73 65 72 74 28 20 28 28 69       assert( ((i
21b40 57 72 69 74 65 2b 31 29 25 6e 42 6c 6b 29 3d 3d  Write+1)%nBlk)==
21b50 30 20 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 2f  0 );.      for(/
21b60 2a 6e 6f 2d 6f 70 2a 2f 3b 20 69 57 72 69 74 65  *no-op*/; iWrite
21b70 3c 6e 53 69 7a 65 3b 20 69 57 72 69 74 65 2b 3d  <nSize; iWrite+=
21b80 6e 42 6c 6b 20 29 7b 0a 20 20 20 20 20 20 20 20  nBlk ){.        
21b90 6e 57 72 69 74 65 20 3d 20 73 65 65 6b 41 6e 64  nWrite = seekAnd
21ba0 57 72 69 74 65 28 70 46 69 6c 65 2c 20 69 57 72  Write(pFile, iWr
21bb0 69 74 65 2c 20 22 22 2c 20 31 29 3b 0a 20 20 20  ite, "", 1);.   
21bc0 20 20 20 20 20 69 66 28 20 6e 57 72 69 74 65 21       if( nWrite!
21bd0 3d 31 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =1 ) return SQLI
21be0 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 3b 0a  TE_IOERR_WRITE;.
21bf0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
21c00 28 20 6e 57 72 69 74 65 3d 3d 30 20 7c 7c 20 28  ( nWrite==0 || (
21c10 6e 53 69 7a 65 25 6e 42 6c 6b 29 20 29 7b 0a 20  nSize%nBlk) ){. 
21c20 20 20 20 20 20 20 20 6e 57 72 69 74 65 20 3d 20         nWrite = 
21c30 73 65 65 6b 41 6e 64 57 72 69 74 65 28 70 46 69  seekAndWrite(pFi
21c40 6c 65 2c 20 6e 53 69 7a 65 2d 31 2c 20 22 22 2c  le, nSize-1, "",
21c50 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   1);.        if(
21c60 20 6e 57 72 69 74 65 21 3d 31 20 29 20 72 65 74   nWrite!=1 ) ret
21c70 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
21c80 5f 57 52 49 54 45 3b 0a 20 20 20 20 20 20 7d 0a  _WRITE;.      }.
21c90 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d  #endif.    }.  }
21ca0 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  ..#if SQLITE_MAX
21cb0 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 69  _MMAP_SIZE>0.  i
21cc0 66 28 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69  f( pFile->mmapSi
21cd0 7a 65 4d 61 78 3e 30 20 26 26 20 6e 42 79 74 65  zeMax>0 && nByte
21ce0 3e 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65  >pFile->mmapSize
21cf0 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a   ){.    int rc;.
21d00 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 73      if( pFile->s
21d10 7a 43 68 75 6e 6b 3c 3d 30 20 29 7b 0a 20 20 20  zChunk<=0 ){.   
21d20 20 20 20 69 66 28 20 72 6f 62 75 73 74 5f 66 74     if( robust_ft
21d30 72 75 6e 63 61 74 65 28 70 46 69 6c 65 2d 3e 68  runcate(pFile->h
21d40 2c 20 6e 42 79 74 65 29 20 29 7b 0a 20 20 20 20  , nByte) ){.    
21d50 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72      storeLastErr
21d60 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29  no(pFile, errno)
21d70 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
21d80 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51   unixLogError(SQ
21d90 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43  LITE_IOERR_TRUNC
21da0 41 54 45 2c 20 22 66 74 72 75 6e 63 61 74 65 22  ATE, "ftruncate"
21db0 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b  , pFile->zPath);
21dc0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
21dd0 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4d 61 70      rc = unixMap
21de0 66 69 6c 65 28 70 46 69 6c 65 2c 20 6e 42 79 74  file(pFile, nByt
21df0 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  e);.    return r
21e00 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  c;.  }.#endif.. 
21e10 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
21e20 4b 3b 0a 7d 0a 0a 0a 23 69 66 20 28 53 51 4c 49  K;.}...#if (SQLI
21e30 54 45 5f 45 4e 41 42 4c 45 5f 41 50 50 4c 45 5f  TE_ENABLE_APPLE_
21e40 53 50 49 3e 30 29 20 26 26 20 64 65 66 69 6e 65  SPI>0) && define
21e50 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 23 69 6e  d(__APPLE__).#in
21e60 63 6c 75 64 65 20 22 73 71 6c 69 74 65 33 5f 70  clude "sqlite3_p
21e70 72 69 76 61 74 65 2e 68 22 0a 23 69 6e 63 6c 75  rivate.h".#inclu
21e80 64 65 20 3c 63 6f 70 79 66 69 6c 65 2e 68 3e 0a  de <copyfile.h>.
21e90 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
21ea0 47 65 74 44 62 50 61 74 68 46 6f 72 55 6e 69 78  GetDbPathForUnix
21eb0 46 69 6c 65 28 75 6e 69 78 46 69 6c 65 20 2a 70  File(unixFile *p
21ec0 46 69 6c 65 2c 20 63 68 61 72 20 2a 64 62 50 61  File, char *dbPa
21ed0 74 68 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66  th);.#endif..#if
21ee0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
21ef0 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 73 74 61  OCKING_STYLE.sta
21f00 74 69 63 20 69 6e 74 20 69 73 50 72 6f 78 79 4c  tic int isProxyL
21f10 6f 63 6b 69 6e 67 4d 6f 64 65 28 75 6e 69 78 46  ockingMode(unixF
21f20 69 6c 65 20 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a  ile *);.#endif..
21f30 23 69 66 20 28 53 51 4c 49 54 45 5f 45 4e 41 42  #if (SQLITE_ENAB
21f40 4c 45 5f 41 50 50 4c 45 5f 53 50 49 3e 30 29 20  LE_APPLE_SPI>0) 
21f50 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  && defined(__APP
21f60 4c 45 5f 5f 29 0a 73 74 61 74 69 63 20 69 6e 74  LE__).static int
21f70 20 75 6e 69 78 54 72 75 6e 63 61 74 65 44 61 74   unixTruncateDat
21f80 61 62 61 73 65 28 75 6e 69 78 46 69 6c 65 20 2a  abase(unixFile *
21f90 2c 20 69 6e 74 29 3b 0a 0a 73 74 61 74 69 63 20  , int);..static 
21fa0 69 6e 74 20 75 6e 69 78 49 6e 76 61 6c 69 64 61  int unixInvalida
21fb0 74 65 53 75 70 70 6f 72 74 46 69 6c 65 73 28 75  teSupportFiles(u
21fc0 6e 69 78 46 69 6c 65 20 2a 2c 20 69 6e 74 29 3b  nixFile *, int);
21fd0 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6e  ..static int fin
21fe0 64 43 72 65 61 74 65 46 69 6c 65 4d 6f 64 65 28  dCreateFileMode(
21ff0 63 6f 6e 73 74 20 63 68 61 72 20 2a 2c 20 69 6e  const char *, in
22000 74 2c 20 6d 6f 64 65 5f 74 2a 2c 20 75 69 64 5f  t, mode_t*, uid_
22010 74 20 2a 2c 67 69 64 5f 74 20 2a 29 3b 0a 0a 2f  t *,gid_t *);../
22020 2a 20 6f 70 65 6e 73 20 61 20 72 65 61 64 2f 77  * opens a read/w
22030 72 69 74 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  rite connection 
22040 74 6f 20 61 20 66 69 6c 65 20 7a 4e 61 6d 65 20  to a file zName 
22050 69 6e 68 65 72 69 74 69 6e 67 20 74 68 65 20 61  inheriting the a
22060 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a 20 75 73  ppropriate.** us
22070 65 72 2f 70 65 72 6d 73 20 66 72 6f 6d 20 74 68  er/perms from th
22080 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
22090 69 66 20 72 75 6e 6e 69 6e 67 20 61 73 20 72 6f  if running as ro
220a0 6f 74 2e 20 20 52 65 74 75 72 6e 73 20 74 68 65  ot.  Returns the
220b0 20 66 69 6c 65 20 0a 2a 2a 20 64 65 73 63 72 69   file .** descri
220c0 70 74 6f 72 20 62 79 20 72 65 66 65 72 65 6e 63  ptor by referenc
220d0 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  e.*/.static int 
220e0 75 6e 69 78 4f 70 65 6e 43 68 69 6c 64 46 69 6c  unixOpenChildFil
220f0 65 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  e(.  const char 
22100 2a 7a 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 6f 70  *zName,.  int op
22110 65 6e 46 6c 61 67 73 2c 0a 20 20 69 6e 74 20 64  enFlags,.  int d
22120 62 4f 70 65 6e 46 6c 61 67 73 2c 0a 20 20 69 6e  bOpenFlags,.  in
22130 74 20 70 72 6f 74 46 6c 61 67 73 2c 0a 20 20 69  t protFlags,.  i
22140 6e 74 20 2a 70 46 64 0a 29 7b 0a 20 20 69 6e 74  nt *pFd.){.  int
22150 20 66 64 20 3d 20 2d 31 3b 0a 20 20 6d 6f 64 65   fd = -1;.  mode
22160 5f 74 20 6f 70 65 6e 4d 6f 64 65 3b 20 20 20 20  _t openMode;    
22170 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 65 72            /* Per
22180 6d 69 73 73 69 6f 6e 73 20 74 6f 20 63 72 65 61  missions to crea
22190 74 65 20 66 69 6c 65 20 77 69 74 68 20 2a 2f 0a  te file with */.
221a0 20 20 75 69 64 5f 74 20 75 69 64 3b 20 20 20 20    uid_t uid;    
221b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
221c0 2f 2a 20 55 73 65 72 69 64 20 66 6f 72 20 74 68  /* Userid for th
221d0 65 20 66 69 6c 65 20 2a 2f 0a 20 20 67 69 64 5f  e file */.  gid_
221e0 74 20 67 69 64 3b 20 20 20 20 20 20 20 20 20 20  t gid;          
221f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 72 6f            /* Gro
22200 75 70 69 64 20 66 6f 72 20 74 68 65 20 66 69 6c  upid for the fil
22210 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 20  e */.  int rc;. 
22220 20 0a 20 20 61 73 73 65 72 74 28 70 46 64 21 3d   .  assert(pFd!=
22230 4e 55 4c 4c 29 3b 0a 20 20 72 63 20 3d 20 66 69  NULL);.  rc = fi
22240 6e 64 43 72 65 61 74 65 46 69 6c 65 4d 6f 64 65  ndCreateFileMode
22250 28 7a 4e 61 6d 65 2c 20 64 62 4f 70 65 6e 46 6c  (zName, dbOpenFl
22260 61 67 73 2c 20 26 6f 70 65 6e 4d 6f 64 65 2c 20  ags, &openMode, 
22270 26 75 69 64 2c 20 26 67 69 64 29 3b 0a 20 20 69  &uid, &gid);.  i
22280 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
22290 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
222a0 63 3b 0a 20 20 7d 0a 20 20 66 64 20 3d 20 72 6f  c;.  }.  fd = ro
222b0 62 75 73 74 5f 6f 70 65 6e 28 7a 4e 61 6d 65 2c  bust_open(zName,
222c0 20 6f 70 65 6e 46 6c 61 67 73 2c 20 6f 70 65 6e   openFlags, open
222d0 4d 6f 64 65 29 3b 0a 20 20 4f 53 54 52 41 43 45  Mode);.  OSTRACE
222e0 28 28 22 4f 50 45 4e 58 20 20 20 25 2d 33 64 20  (("OPENX   %-3d 
222f0 25 73 20 30 25 6f 5c 6e 22 2c 20 66 64 2c 20 7a  %s 0%o\n", fd, z
22300 4e 61 6d 65 2c 20 6f 70 65 6e 46 6c 61 67 73 29  Name, openFlags)
22310 29 3b 0a 20 20 69 66 28 20 66 64 3c 30 20 29 7b  );.  if( fd<0 ){
22320 0a 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f  .    rc = unixLo
22330 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41  gError(SQLITE_CA
22340 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c 20 22 6f 70  NTOPEN_BKPT, "op
22350 65 6e 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  en", zName);.   
22360 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
22370 20 20 2f 2a 20 69 66 20 77 65 27 72 65 20 6f 70    /* if we're op
22380 65 6e 69 6e 67 20 74 68 65 20 77 61 6c 20 6f 72  ening the wal or
22390 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 72 75 6e   journal and run
223a0 6e 69 6e 67 20 61 73 20 72 6f 6f 74 2c 20 73 65  ning as root, se
223b0 74 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  t.  ** the journ
223c0 61 6c 20 75 69 64 2f 67 69 64 20 2a 2f 0a 20 20  al uid/gid */.  
223d0 69 66 28 20 64 62 4f 70 65 6e 46 6c 61 67 73 20  if( dbOpenFlags 
223e0 26 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57  & (SQLITE_OPEN_W
223f0 41 4c 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  AL|SQLITE_OPEN_M
22400 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 20 29 7b 0a  AIN_JOURNAL) ){.
22410 20 20 20 20 75 69 64 5f 74 20 65 75 69 64 20 3d      uid_t euid =
22420 20 67 65 74 65 75 69 64 28 29 3b 0a 20 20 20 20   geteuid();.    
22430 69 66 28 20 65 75 69 64 3d 3d 30 20 26 26 20 28  if( euid==0 && (
22440 65 75 69 64 21 3d 75 69 64 20 7c 7c 20 67 65 74  euid!=uid || get
22450 65 67 69 64 28 29 21 3d 67 69 64 29 20 29 7b 0a  egid()!=gid) ){.
22460 20 20 20 20 20 20 69 66 28 20 66 63 68 6f 77 6e        if( fchown
22470 28 66 64 2c 20 75 69 64 2c 20 67 69 64 29 20 29  (fd, uid, gid) )
22480 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
22490 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42  QLITE_CANTOPEN_B
224a0 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  KPT;.      }.   
224b0 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d   }.  }.  if( rc=
224c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
224d0 20 20 2a 70 46 64 20 3d 20 66 64 3b 0a 20 20 7d    *pFd = fd;.  }
224e0 20 65 6c 73 65 20 7b 0a 20 20 20 20 2a 70 46 64   else {.    *pFd
224f0 20 3d 20 2d 31 3b 0a 20 20 20 20 63 6c 6f 73 65   = -1;.    close
22500 28 66 64 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  (fd);.  }.  retu
22510 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63  rn rc;.}..static
22520 20 69 6e 74 20 75 6e 69 78 52 65 70 6c 61 63 65   int unixReplace
22530 44 61 74 61 62 61 73 65 28 75 6e 69 78 46 69 6c  Database(unixFil
22540 65 20 2a 70 46 69 6c 65 2c 20 73 71 6c 69 74 65  e *pFile, sqlite
22550 33 20 2a 73 72 63 64 62 29 20 7b 0a 20 20 73 71  3 *srcdb) {.  sq
22560 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 20 3d  lite3_file *id =
22570 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a   (sqlite3_file *
22580 29 70 46 69 6c 65 3b 0a 20 20 42 74 72 65 65 20  )pFile;.  Btree 
22590 2a 70 53 72 63 42 74 72 65 65 20 3d 20 4e 55 4c  *pSrcBtree = NUL
225a0 4c 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  L;.  sqlite3_fil
225b0 65 20 2a 73 72 63 5f 66 69 6c 65 20 3d 20 4e 55  e *src_file = NU
225c0 4c 4c 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  LL;.  unixFile *
225d0 70 53 72 63 46 69 6c 65 20 3d 20 4e 55 4c 4c 3b  pSrcFile = NULL;
225e0 0a 20 20 63 68 61 72 20 73 72 63 57 61 6c 50 61  .  char srcWalPa
225f0 74 68 5b 4d 41 58 50 41 54 48 4c 45 4e 2b 35 5d  th[MAXPATHLEN+5]
22600 3b 0a 20 20 69 6e 74 20 73 72 63 57 61 6c 46 44  ;.  int srcWalFD
22610 20 3d 20 2d 31 3b 0a 20 20 69 6e 74 20 72 63 20   = -1;.  int rc 
22620 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 76  = SQLITE_OK;.  v
22630 6f 69 64 20 2a 70 4c 6f 63 6b 20 3d 20 4e 55 4c  oid *pLock = NUL
22640 4c 3b 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 3d  L;.  int flags =
22650 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 73   0;.  sqlite3 *s
22660 72 63 64 62 32 20 3d 20 4e 55 4c 4c 3b 0a 20 20  rcdb2 = NULL;.  
22670 63 6f 70 79 66 69 6c 65 5f 73 74 61 74 65 5f 74  copyfile_state_t
22680 20 73 3b 0a 20 20 69 6e 74 20 63 6f 72 72 75 70   s;.  int corrup
22690 74 53 72 63 46 69 6c 65 4c 6f 63 6b 20 3d 20 30  tSrcFileLock = 0
226a0 3b 0a 20 20 69 6e 74 20 63 6f 72 72 75 70 74 44  ;.  int corruptD
226b0 73 74 46 69 6c 65 4c 6f 63 6b 20 3d 20 30 3b 0a  stFileLock = 0;.
226c0 20 20 69 6e 74 20 69 73 53 72 63 43 6f 72 72 75    int isSrcCorru
226d0 70 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 73  pt = 0;.  int is
226e0 44 73 74 43 6f 72 72 75 70 74 20 3d 20 30 3b 0a  DstCorrupt = 0;.
226f0 20 20 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65    .  if( !sqlite
22700 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 73  3SafetyCheckOk(s
22710 72 63 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74  rcdb) ){.    ret
22720 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
22730 45 3b 0a 20 20 7d 0a 20 20 20 20 0a 23 69 66 20  E;.  }.    .#if 
22740 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44 41  SQLITE_ENABLE_DA
22750 54 41 5f 50 52 4f 54 45 43 54 49 4f 4e 0a 20 20  TA_PROTECTION.  
22760 66 6c 61 67 73 20 7c 3d 20 70 46 69 6c 65 2d 3e  flags |= pFile->
22770 70 72 6f 74 46 6c 61 67 73 3b 0a 23 65 6e 64 69  protFlags;.#endi
22780 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  f.#if SQLITE_ENA
22790 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
227a0 45 0a 20 20 69 66 28 20 69 73 50 72 6f 78 79 4c  E.  if( isProxyL
227b0 6f 63 6b 69 6e 67 4d 6f 64 65 28 70 46 69 6c 65  ockingMode(pFile
227c0 29 20 29 7b 0a 20 20 20 20 66 6c 61 67 73 20 7c  ) ){.    flags |
227d0 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 41 55  = SQLITE_OPEN_AU
227e0 54 4f 50 52 4f 58 59 3b 0a 20 20 7d 0a 23 65 6e  TOPROXY;.  }.#en
227f0 64 69 66 0a 20 20 0a 20 20 72 63 20 3d 20 73 71  dif.  .  rc = sq
22800 6c 69 74 65 33 64 65 6d 6f 5f 73 75 70 65 72 6c  lite3demo_superl
22810 6f 63 6b 28 70 46 69 6c 65 2d 3e 7a 50 61 74 68  ock(pFile->zPath
22820 2c 20 30 2c 20 66 6c 61 67 73 2c 20 30 2c 20 30  , 0, flags, 0, 0
22830 2c 20 26 70 4c 6f 63 6b 29 3b 0a 20 20 69 66 28  , &pLock);.  if(
22840 20 72 63 20 29 7b 0a 20 20 20 20 69 66 28 20 72   rc ){.    if( r
22850 63 3d 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  c==SQLITE_CORRUP
22860 54 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f  T || rc==SQLITE_
22870 4e 4f 54 41 44 42 20 29 7b 0a 20 20 20 20 20 20  NOTADB ){.      
22880 69 73 44 73 74 43 6f 72 72 75 70 74 20 3d 20 31  isDstCorrupt = 1
22890 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
228a0 69 74 65 33 64 65 6d 6f 5f 73 75 70 65 72 6c 6f  ite3demo_superlo
228b0 63 6b 5f 63 6f 72 72 75 70 74 28 69 64 2c 20 53  ck_corrupt(id, S
228c0 51 4c 49 54 45 5f 4c 4f 43 4b 5f 45 58 43 4c 55  QLITE_LOCK_EXCLU
228d0 53 49 56 45 2c 0a 20 20 20 20 20 20 20 20 20 20  SIVE,.          
228e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
228f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
22900 63 6f 72 72 75 70 74 44 73 74 46 69 6c 65 4c 6f  corruptDstFileLo
22910 63 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ck);.    }.    i
22920 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72  f( rc ){.      r
22930 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
22940 20 20 7d 0a 20 20 2f 2a 20 67 65 74 20 74 68 65    }.  /* get the
22950 20 73 72 63 20 66 69 6c 65 20 64 65 73 63 72 69   src file descri
22960 70 74 6f 72 20 61 64 68 65 72 69 6e 67 20 74 6f  ptor adhering to
22970 20 74 68 65 20 64 62 20 73 74 72 75 63 74 20 61   the db struct a
22980 63 63 65 73 73 20 72 75 6c 65 73 20 0a 20 20 20  ccess rules .   
22990 2a 2a 20 74 68 69 73 20 63 6f 64 65 20 69 73 20  ** this code is 
229a0 6d 6f 64 65 6c 65 64 20 61 66 74 65 72 20 73 71  modeled after sq
229b0 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72  lite3_file_contr
229c0 6f 6c 28 29 20 69 6e 20 6d 61 69 6e 2e 63 0a 20  ol() in main.c. 
229d0 20 20 2a 2f 20 0a 20 20 73 71 6c 69 74 65 33 5f    */ .  sqlite3_
229e0 6d 75 74 65 78 5f 65 6e 74 65 72 28 73 72 63 64  mutex_enter(srcd
229f0 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28  b->mutex);.  if(
22a00 20 73 72 63 64 62 2d 3e 6e 44 62 3e 30 20 29 7b   srcdb->nDb>0 ){
22a10 0a 20 20 20 20 70 53 72 63 42 74 72 65 65 20 3d  .    pSrcBtree =
22a20 20 73 72 63 64 62 2d 3e 61 44 62 5b 30 5d 2e 70   srcdb->aDb[0].p
22a30 42 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53  Bt;.  }.  if( pS
22a40 72 63 42 74 72 65 65 20 29 7b 0a 20 20 20 20 50  rcBtree ){.    P
22a50 61 67 65 72 20 2a 70 53 72 63 50 61 67 65 72 3b  ager *pSrcPager;
22a60 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
22a70 65 45 6e 74 65 72 28 70 53 72 63 42 74 72 65 65  eEnter(pSrcBtree
22a80 29 3b 0a 20 20 20 20 70 53 72 63 50 61 67 65 72  );.    pSrcPager
22a90 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50   = sqlite3BtreeP
22aa0 61 67 65 72 28 70 53 72 63 42 74 72 65 65 29 3b  ager(pSrcBtree);
22ab0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 53 72  .    assert( pSr
22ac0 63 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 20  cPager!=0 );.   
22ad0 20 73 72 63 5f 66 69 6c 65 20 3d 20 73 71 6c 69   src_file = sqli
22ae0 74 65 33 50 61 67 65 72 46 69 6c 65 28 70 53 72  te3PagerFile(pSr
22af0 63 50 61 67 65 72 29 3b 0a 20 20 20 20 61 73 73  cPager);.    ass
22b00 65 72 74 28 20 73 72 63 5f 66 69 6c 65 21 3d 30  ert( src_file!=0
22b10 20 29 3b 0a 20 20 20 20 69 66 28 20 73 72 63 5f   );.    if( src_
22b20 66 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 73 20 29  file->pMethods )
22b30 7b 0a 20 20 20 20 20 20 69 6e 74 20 73 72 63 46  {.      int srcF
22b40 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  lags = 0;.      
22b50 70 53 72 63 46 69 6c 65 20 3d 20 28 75 6e 69 78  pSrcFile = (unix
22b60 46 69 6c 65 20 2a 29 73 72 63 5f 66 69 6c 65 3b  File *)src_file;
22b70 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
22b80 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
22b90 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f 41 50   || defined(__AP
22ba0 50 4c 45 5f 5f 29 0a 20 20 20 20 20 20 69 66 20  PLE__).      if 
22bb0 28 28 70 53 72 63 46 69 6c 65 2d 3e 6f 70 65 6e  ((pSrcFile->open
22bc0 46 6c 61 67 73 20 26 20 4f 5f 52 44 57 52 29 20  Flags & O_RDWR) 
22bd0 3d 3d 20 4f 5f 52 44 57 52 29 20 7b 0a 20 20 20  == O_RDWR) {.   
22be0 20 20 20 20 20 73 72 63 46 6c 61 67 73 20 3d 20       srcFlags = 
22bf0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
22c00 57 52 49 54 45 3b 0a 20 20 20 20 20 20 7d 20 65  WRITE;.      } e
22c10 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 73 72  lse {.        sr
22c20 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f  cFlags = SQLITE_
22c30 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  OPEN_READONLY;. 
22c40 20 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20       }.#else.   
22c50 20 20 20 73 72 63 46 6c 61 67 73 20 3d 20 53 51     srcFlags = SQ
22c60 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
22c70 49 54 45 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  ITE;.#endif.#if 
22c80 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44 41  SQLITE_ENABLE_DA
22c90 54 41 5f 50 52 4f 54 45 43 54 49 4f 4e 0a 20 20  TA_PROTECTION.  
22ca0 20 20 20 20 73 72 63 46 6c 61 67 73 20 7c 3d 20      srcFlags |= 
22cb0 70 53 72 63 46 69 6c 65 2d 3e 70 72 6f 74 46 6c  pSrcFile->protFl
22cc0 61 67 73 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  ags;.#endif.#if 
22cd0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
22ce0 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20  CKING_STYLE.    
22cf0 20 20 69 66 28 20 69 73 50 72 6f 78 79 4c 6f 63    if( isProxyLoc
22d00 6b 69 6e 67 4d 6f 64 65 28 70 53 72 63 46 69 6c  kingMode(pSrcFil
22d10 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 72  e) ){.        sr
22d20 63 46 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45  cFlags |= SQLITE
22d30 5f 4f 50 45 4e 5f 41 55 54 4f 50 52 4f 58 59 3b  _OPEN_AUTOPROXY;
22d40 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
22d50 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
22d60 65 33 5f 6f 70 65 6e 5f 76 32 28 70 53 72 63 46  e3_open_v2(pSrcF
22d70 69 6c 65 2d 3e 7a 50 61 74 68 2c 20 26 73 72 63  ile->zPath, &src
22d80 64 62 32 2c 20 73 72 63 46 6c 61 67 73 2c 20 30  db2, srcFlags, 0
22d90 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
22da0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
22db0 20 20 20 20 20 20 2f 2a 20 73 74 61 72 74 20 61        /* start a
22dc0 20 64 65 66 65 72 72 65 64 20 74 72 61 6e 73 61   deferred transa
22dd0 63 74 69 6f 6e 20 61 6e 64 20 72 65 61 64 20 74  ction and read t
22de0 6f 20 65 73 74 61 62 6c 69 73 68 20 61 20 72 65  o establish a re
22df0 61 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20  ad lock */.     
22e00 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
22e10 65 78 65 63 28 73 72 63 64 62 32 2c 20 22 42 45  exec(srcdb2, "BE
22e20 47 49 4e 20 44 45 46 45 52 52 45 44 3b 20 50 52  GIN DEFERRED; PR
22e30 41 47 4d 41 20 73 63 68 65 6d 61 5f 76 65 72 73  AGMA schema_vers
22e40 69 6f 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  ion",.          
22e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22e60 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  0, 0, 0);.      
22e70 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
22e80 5f 43 4f 52 52 55 50 54 20 7c 7c 20 72 63 3d 3d  _CORRUPT || rc==
22e90 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 20 29 7b  SQLITE_NOTADB ){
22ea0 0a 20 20 20 20 20 20 20 20 20 20 69 73 53 72 63  .          isSrc
22eb0 43 6f 72 72 75 70 74 20 3d 20 31 3b 0a 20 20 20  Corrupt = 1;.   
22ec0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
22ed0 74 65 33 64 65 6d 6f 5f 73 75 70 65 72 6c 6f 63  te3demo_superloc
22ee0 6b 5f 63 6f 72 72 75 70 74 28 73 72 63 5f 66 69  k_corrupt(src_fi
22ef0 6c 65 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f  le, SQLITE_LOCK_
22f00 53 48 41 52 45 44 2c 0a 20 20 20 20 20 20 20 20  SHARED,.        
22f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22f30 20 20 20 20 20 26 63 6f 72 72 75 70 74 53 72 63       &corruptSrc
22f40 46 69 6c 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 20  FileLock);.     
22f50 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
22f60 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 21 73 72   }.  }.  if( !sr
22f70 63 64 62 32 20 7c 7c 20 70 53 72 63 46 69 6c 65  cdb2 || pSrcFile
22f80 3d 3d 4e 55 4c 4c 20 7c 7c 20 70 53 72 63 46 69  ==NULL || pSrcFi
22f90 6c 65 2d 3e 68 3c 30 29 7b 0a 20 20 20 20 72 63  le->h<0){.    rc
22fa0 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e   = SQLITE_INTERN
22fb0 41 4c 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  AL;.  }.  if( rc
22fc0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
22fd0 20 20 20 67 6f 74 6f 20 65 6e 64 5f 72 65 70 6c     goto end_repl
22fe0 61 63 65 5f 64 61 74 61 62 61 73 65 3b 0a 20 20  ace_database;.  
22ff0 7d 0a 20 20 2f 2a 20 62 6f 74 68 20 64 61 74 61  }.  /* both data
23000 62 61 73 65 73 20 61 72 65 20 6c 6f 63 6b 65 64  bases are locked
23010 20 61 70 70 72 6f 70 72 69 61 74 65 6c 79 2c 20   appropriately, 
23020 63 6f 70 79 20 74 68 65 20 73 72 63 20 77 61 6c  copy the src wal
23030 20 6a 6f 75 72 6e 61 6c 20 69 66 20 0a 20 20 20   journal if .   
23040 2a 2a 20 6f 6e 65 20 65 78 69 73 74 73 20 61 6e  ** one exists an
23050 64 20 74 68 65 6e 20 74 68 65 20 61 63 74 75 61  d then the actua
23060 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a  l database file.
23070 20 20 20 2a 2f 0a 20 20 73 74 72 6c 63 70 79 28     */.  strlcpy(
23080 73 72 63 57 61 6c 50 61 74 68 2c 20 70 53 72 63  srcWalPath, pSrc
23090 46 69 6c 65 2d 3e 7a 50 61 74 68 2c 20 4d 41 58  File->zPath, MAX
230a0 50 41 54 48 4c 45 4e 2b 35 29 3b 0a 20 20 73 74  PATHLEN+5);.  st
230b0 72 6c 63 61 74 28 73 72 63 57 61 6c 50 61 74 68  rlcat(srcWalPath
230c0 2c 20 22 2d 77 61 6c 22 2c 20 4d 41 58 50 41 54  , "-wal", MAXPAT
230d0 48 4c 45 4e 2b 35 29 3b 0a 20 20 73 72 63 57 61  HLEN+5);.  srcWa
230e0 6c 46 44 20 3d 20 6f 70 65 6e 28 73 72 63 57 61  lFD = open(srcWa
230f0 6c 50 61 74 68 2c 20 4f 5f 52 44 4f 4e 4c 59 29  lPath, O_RDONLY)
23100 3b 0a 20 20 69 66 28 20 21 28 73 72 63 57 61 6c  ;.  if( !(srcWal
23110 46 44 3c 30 29 20 29 7b 0a 20 20 20 20 63 68 61  FD<0) ){.    cha
23120 72 20 64 73 74 57 61 6c 50 61 74 68 5b 4d 41 58  r dstWalPath[MAX
23130 50 41 54 48 4c 45 4e 2b 35 5d 3b 0a 20 20 20 20  PATHLEN+5];.    
23140 69 6e 74 20 64 73 74 57 61 6c 46 44 20 3d 20 2d  int dstWalFD = -
23150 31 3b 0a 20 20 20 20 69 6e 74 20 70 72 6f 74 46  1;.    int protF
23160 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20 20 73 74  lags = 0;.    st
23170 72 6c 63 70 79 28 64 73 74 57 61 6c 50 61 74 68  rlcpy(dstWalPath
23180 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 2c 20  , pFile->zPath, 
23190 4d 41 58 50 41 54 48 4c 45 4e 2b 35 29 3b 0a 20  MAXPATHLEN+5);. 
231a0 20 20 20 73 74 72 6c 63 61 74 28 64 73 74 57 61     strlcat(dstWa
231b0 6c 50 61 74 68 2c 20 22 2d 77 61 6c 22 2c 20 4d  lPath, "-wal", M
231c0 41 58 50 41 54 48 4c 45 4e 2b 35 29 3b 0a 0a 20  AXPATHLEN+5);.. 
231d0 20 20 20 72 63 20 3d 20 75 6e 69 78 4f 70 65 6e     rc = unixOpen
231e0 43 68 69 6c 64 46 69 6c 65 28 64 73 74 57 61 6c  ChildFile(dstWal
231f0 50 61 74 68 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43  Path, O_RDWR|O_C
23200 52 45 41 54 2c 20 53 51 4c 49 54 45 5f 4f 50 45  REAT, SQLITE_OPE
23210 4e 5f 57 41 4c 2c 0a 20 20 20 20 20 20 20 20 20  N_WAL,.         
23220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23230 20 20 70 72 6f 74 46 6c 61 67 73 2c 20 26 64 73    protFlags, &ds
23240 74 57 61 6c 46 44 29 3b 0a 20 20 20 20 69 66 28  tWalFD);.    if(
23250 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
23260 7b 0a 20 20 20 20 20 20 73 20 3d 20 63 6f 70 79  {.      s = copy
23270 66 69 6c 65 5f 73 74 61 74 65 5f 61 6c 6c 6f 63  file_state_alloc
23280 28 29 3b 0a 20 20 20 20 20 20 6c 73 65 65 6b 28  ();.      lseek(
23290 73 72 63 57 61 6c 46 44 2c 20 30 2c 20 53 45 45  srcWalFD, 0, SEE
232a0 4b 5f 53 45 54 29 3b 0a 20 20 20 20 20 20 6c 73  K_SET);.      ls
232b0 65 65 6b 28 64 73 74 57 61 6c 46 44 2c 20 30 2c  eek(dstWalFD, 0,
232c0 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20 20 20 20   SEEK_SET);.    
232d0 20 20 69 66 28 20 66 63 6f 70 79 66 69 6c 65 28    if( fcopyfile(
232e0 73 72 63 57 61 6c 46 44 2c 20 64 73 74 57 61 6c  srcWalFD, dstWal
232f0 46 44 2c 20 73 2c 20 43 4f 50 59 46 49 4c 45 5f  FD, s, COPYFILE_
23300 44 41 54 41 29 20 29 7b 0a 20 20 20 20 20 20 20  DATA) ){.       
23310 20 69 6e 74 20 65 72 72 3d 65 72 72 6e 6f 3b 0a   int err=errno;.
23320 20 20 20 20 20 20 20 20 73 77 69 74 63 68 28 65          switch(e
23330 72 72 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  rr) {.          
23340 63 61 73 65 20 45 4e 4f 4d 45 4d 3a 0a 20 20 20  case ENOMEM:.   
23350 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
23360 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
23370 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
23380 20 20 20 20 20 20 20 20 20 64 65 66 61 75 6c 74           default
23390 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 74  :.            st
233a0 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69  oreLastErrno(pFi
233b0 6c 65 2c 20 65 72 72 29 3b 0a 20 20 20 20 20 20  le, err);.      
233c0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
233d0 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20 20 20 20  E_IOERR;.       
233e0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
233f0 20 63 6f 70 79 66 69 6c 65 5f 73 74 61 74 65 5f   copyfile_state_
23400 66 72 65 65 28 73 29 3b 0a 20 20 20 20 20 20 63  free(s);.      c
23410 6c 6f 73 65 28 64 73 74 57 61 6c 46 44 29 3b 0a  lose(dstWalFD);.
23420 20 20 20 20 7d 0a 20 20 20 20 63 6c 6f 73 65 28      }.    close(
23430 73 72 63 57 61 6c 46 44 29 3b 0a 20 20 7d 0a 20  srcWalFD);.  }. 
23440 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
23450 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 62 65 66  OK ){.    /* bef
23460 6f 72 65 20 77 65 20 63 6f 70 79 2c 20 65 6e 73  ore we copy, ens
23470 75 72 65 20 74 68 61 74 20 74 68 65 20 66 69 6c  ure that the fil
23480 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72  e change counter
23490 20 77 69 6c 6c 20 62 65 20 6d 6f 64 69 66 69 65   will be modifie
234a0 64 20 2a 2f 0a 20 20 20 20 75 69 6e 74 33 32 5f  d */.    uint32_
234b0 74 20 73 72 63 43 68 61 6e 67 65 20 3d 20 30 3b  t srcChange = 0;
234c0 0a 20 20 20 20 75 69 6e 74 33 32 5f 74 20 64 73  .    uint32_t ds
234d0 74 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20  tChange = 0;.   
234e0 20 70 72 65 61 64 28 70 53 72 63 46 69 6c 65 2d   pread(pSrcFile-
234f0 3e 68 2c 20 26 73 72 63 43 68 61 6e 67 65 2c 20  >h, &srcChange, 
23500 34 2c 20 32 34 29 3b 0a 20 20 20 20 70 72 65 61  4, 24);.    prea
23510 64 28 70 46 69 6c 65 2d 3e 68 2c 20 26 64 73 74  d(pFile->h, &dst
23520 43 68 61 6e 67 65 2c 20 34 2c 20 32 34 29 3b 0a  Change, 4, 24);.
23530 20 20 20 20 0a 20 20 20 20 2f 2a 20 63 6f 70 79      .    /* copy
23540 20 74 68 65 20 61 63 74 75 61 6c 20 64 61 74 61   the actual data
23550 62 61 73 65 20 2a 2f 0a 20 20 20 20 73 20 3d 20  base */.    s = 
23560 63 6f 70 79 66 69 6c 65 5f 73 74 61 74 65 5f 61  copyfile_state_a
23570 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 6c 73 65 65  lloc();.    lsee
23580 6b 28 70 53 72 63 46 69 6c 65 2d 3e 68 2c 20 30  k(pSrcFile->h, 0
23590 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20 20 20  , SEEK_SET);.   
235a0 20 6c 73 65 65 6b 28 70 46 69 6c 65 2d 3e 68 2c   lseek(pFile->h,
235b0 20 30 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20   0, SEEK_SET);. 
235c0 20 20 20 69 66 28 20 66 63 6f 70 79 66 69 6c 65     if( fcopyfile
235d0 28 70 53 72 63 46 69 6c 65 2d 3e 68 2c 20 70 46  (pSrcFile->h, pF
235e0 69 6c 65 2d 3e 68 2c 20 73 2c 20 43 4f 50 59 46  ile->h, s, COPYF
235f0 49 4c 45 5f 44 41 54 41 29 20 29 7b 0a 20 20 20  ILE_DATA) ){.   
23600 20 20 20 69 6e 74 20 65 72 72 3d 65 72 72 6e 6f     int err=errno
23610 3b 0a 20 20 20 20 20 20 73 77 69 74 63 68 28 65  ;.      switch(e
23620 72 72 29 20 7b 0a 20 20 20 20 20 20 20 20 63 61  rr) {.        ca
23630 73 65 20 45 4e 4f 4d 45 4d 3a 0a 20 20 20 20 20  se ENOMEM:.     
23640 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
23650 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20  _NOMEM;.        
23660 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
23670 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20   default:.      
23680 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72      storeLastErr
23690 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72 29 3b 0a  no(pFile, err);.
236a0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
236b0 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20  QLITE_IOERR;.   
236c0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 63     }.    }.    c
236d0 6f 70 79 66 69 6c 65 5f 73 74 61 74 65 5f 66 72  opyfile_state_fr
236e0 65 65 28 73 29 3b 0a 20 20 20 20 0a 20 20 20 20  ee(s);.    .    
236f0 69 66 20 28 73 72 63 43 68 61 6e 67 65 20 3d 3d  if (srcChange ==
23700 20 64 73 74 43 68 61 6e 67 65 29 20 7b 0a 20 20   dstChange) {.  
23710 20 20 20 20 2f 2a 20 6d 6f 64 69 66 79 20 74 68      /* modify th
23720 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72  e change counter
23730 20 74 6f 20 66 6f 72 63 65 20 70 61 67 65 20 7a   to force page z
23740 65 72 6f 20 74 6f 20 62 65 20 72 65 6c 6f 61 64  ero to be reload
23750 65 64 20 2a 2f 0a 20 20 20 20 20 20 64 73 74 43  ed */.      dstC
23760 68 61 6e 67 65 20 2b 2b 3b 0a 20 20 20 20 20 20  hange ++;.      
23770 70 77 72 69 74 65 28 70 46 69 6c 65 2d 3e 68 2c  pwrite(pFile->h,
23780 20 26 64 73 74 43 68 61 6e 67 65 2c 20 34 2c 20   &dstChange, 4, 
23790 32 34 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  24);.    }.  }. 
237a0 20 69 66 28 20 69 73 53 72 63 43 6f 72 72 75 70   if( isSrcCorrup
237b0 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
237c0 64 65 6d 6f 5f 73 75 70 65 72 75 6e 6c 6f 63 6b  demo_superunlock
237d0 5f 63 6f 72 72 75 70 74 28 73 72 63 5f 66 69 6c  _corrupt(src_fil
237e0 65 2c 20 63 6f 72 72 75 70 74 53 72 63 46 69 6c  e, corruptSrcFil
237f0 65 4c 6f 63 6b 29 3b 0a 20 20 7d 65 6c 73 65 7b  eLock);.  }else{
23800 0a 20 20 20 20 2f 2a 20 64 6f 6e 65 20 77 69 74  .    /* done wit
23810 68 20 74 68 65 20 73 6f 75 72 63 65 20 64 62 20  h the source db 
23820 73 6f 20 65 6e 64 20 74 68 65 20 74 72 61 6e 73  so end the trans
23830 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 73 71  action */.    sq
23840 6c 69 74 65 33 5f 65 78 65 63 28 73 72 63 64 62  lite3_exec(srcdb
23850 32 2c 20 22 43 4f 4d 4d 49 54 22 2c 20 30 2c 20  2, "COMMIT", 0, 
23860 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20  0, 0);.  }.  /* 
23870 7a 65 72 6f 20 6f 75 74 20 61 6e 79 20 6f 6c 64  zero out any old
23880 20 6a 6f 75 72 6e 61 6c 20 63 6c 75 74 74 65 72   journal clutter
23890 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   */.  if( rc==SQ
238a0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
238b0 6e 74 20 73 6b 69 70 57 41 4c 20 3d 20 28 73 72  nt skipWAL = (sr
238c0 63 57 61 6c 46 44 3c 30 29 3f 30 3a 31 3b 0a 20  cWalFD<0)?0:1;. 
238d0 20 20 20 75 6e 69 78 49 6e 76 61 6c 69 64 61 74     unixInvalidat
238e0 65 53 75 70 70 6f 72 74 46 69 6c 65 73 28 70 46  eSupportFiles(pF
238f0 69 6c 65 2c 20 73 6b 69 70 57 41 4c 29 3b 0a 20  ile, skipWAL);. 
23900 20 7d 0a 20 20 0a 65 6e 64 5f 72 65 70 6c 61 63   }.  .end_replac
23910 65 5f 64 61 74 61 62 61 73 65 3a 0a 20 20 69 66  e_database:.  if
23920 28 20 70 53 72 63 42 74 72 65 65 20 29 7b 0a 20  ( pSrcBtree ){. 
23930 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65     sqlite3_close
23940 28 73 72 63 64 62 32 29 3b 0a 20 20 20 20 73 71  (srcdb2);.    sq
23950 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
23960 70 53 72 63 42 74 72 65 65 29 3b 0a 20 20 7d 0a  pSrcBtree);.  }.
23970 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
23980 6c 65 61 76 65 28 73 72 63 64 62 2d 3e 6d 75 74  leave(srcdb->mut
23990 65 78 29 3b 0a 20 20 69 66 28 20 69 73 44 73 74  ex);.  if( isDst
239a0 43 6f 72 72 75 70 74 20 29 7b 0a 20 20 20 20 73  Corrupt ){.    s
239b0 71 6c 69 74 65 33 64 65 6d 6f 5f 73 75 70 65 72  qlite3demo_super
239c0 75 6e 6c 6f 63 6b 5f 63 6f 72 72 75 70 74 28 69  unlock_corrupt(i
239d0 64 2c 20 63 6f 72 72 75 70 74 44 73 74 46 69 6c  d, corruptDstFil
239e0 65 4c 6f 63 6b 29 3b 0a 20 20 7d 65 6c 73 65 7b  eLock);.  }else{
239f0 0a 20 20 20 20 73 71 6c 69 74 65 33 64 65 6d 6f  .    sqlite3demo
23a00 5f 73 75 70 65 72 75 6e 6c 6f 63 6b 28 70 4c 6f  _superunlock(pLo
23a10 63 6b 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ck);.  }.  retur
23a20 6e 20 72 63 3b 0a 7d 0a 23 64 65 66 69 6e 65 20  n rc;.}.#define 
23a30 53 51 4c 49 54 45 5f 46 49 4c 45 5f 48 45 41 44  SQLITE_FILE_HEAD
23a40 45 52 5f 4c 45 4e 20 31 36 0a 2f 2a 20 43 68 65  ER_LEN 16./* Che
23a50 63 6b 20 66 6f 72 20 61 20 63 6f 6e 66 6c 69 63  ck for a conflic
23a60 74 69 6e 67 20 6c 6f 63 6b 2e 20 20 49 66 20 6f  ting lock.  If o
23a70 6e 65 20 69 73 20 66 6f 75 6e 64 2c 20 70 72 69  ne is found, pri
23a80 6e 74 20 61 6e 20 74 68 69 73 0a 20 2a 2a 20 6f  nt an this. ** o
23a90 6e 20 73 74 61 6e 64 61 72 64 20 6f 75 74 70 75  n standard outpu
23aa0 74 20 75 73 69 6e 67 20 74 68 65 20 66 6f 72 6d  t using the form
23ab0 61 74 20 73 74 72 69 6e 67 20 67 69 76 65 6e 20  at string given 
23ac0 61 6e 64 20 72 65 74 75 72 6e 20 31 2e 0a 20 2a  and return 1.. *
23ad0 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6e  * If there are n
23ae0 6f 20 63 6f 6e 66 6c 69 63 74 69 6e 67 20 6c 6f  o conflicting lo
23af0 63 6b 73 2c 20 72 65 74 75 72 6e 20 30 2e 0a 20  cks, return 0.. 
23b00 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
23b10 69 78 49 73 4c 6f 63 6b 65 64 28 0a 20 20 70 69  ixIsLocked(.  pi
23b20 64 5f 74 20 70 69 64 2c 20 20 20 20 20 20 20 20  d_t pid,        
23b30 20 20 20 20 2f 2a 20 50 49 44 20 74 6f 20 74 65      /* PID to te
23b40 73 74 20 66 6f 72 20 6c 6f 63 6b 20 6f 77 6e 65  st for lock owne
23b50 72 20 2a 2f 0a 20 20 69 6e 74 20 68 2c 20 20 20  r */.  int h,   
23b60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23b70 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  File descriptor 
23b80 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 69 6e  to check */.  in
23b90 74 20 74 79 70 65 2c 20 20 20 20 20 20 20 20 20  t type,         
23ba0 20 20 20 20 2f 2a 20 46 5f 52 44 4c 43 4b 20 6f      /* F_RDLCK o
23bb0 72 20 46 5f 57 52 4c 43 4b 20 2a 2f 0a 20 20 75  r F_WRLCK */.  u
23bc0 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 4f 66 73  nsigned int iOfs
23bd0 74 2c 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79  t,   /* First by
23be0 74 65 20 6f 66 20 74 68 65 20 6c 6f 63 6b 20 2a  te of the lock *
23bf0 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  /.  unsigned int
23c00 20 69 43 6e 74 2c 20 20 20 20 2f 2a 20 4e 75 6d   iCnt,    /* Num
23c10 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
23c20 74 68 65 20 6c 6f 63 6b 20 72 61 6e 67 65 20 2a  the lock range *
23c30 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
23c40 7a 54 79 70 65 20 20 20 20 20 2f 2a 20 54 79 70  zType     /* Typ
23c50 65 20 6f 66 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a  e of lock */.){.
23c60 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c    struct flock l
23c70 6b 3b 0a 20 20 69 6e 74 20 65 72 72 3b 0a 20 20  k;.  int err;.  
23c80 0a 20 20 6d 65 6d 73 65 74 28 26 6c 6b 2c 20 30  .  memset(&lk, 0
23c90 2c 20 73 69 7a 65 6f 66 28 6c 6b 29 29 3b 0a 20  , sizeof(lk));. 
23ca0 20 6c 6b 2e 6c 5f 74 79 70 65 20 3d 20 74 79 70   lk.l_type = typ
23cb0 65 3b 0a 20 20 6c 6b 2e 6c 5f 77 68 65 6e 63 65  e;.  lk.l_whence
23cc0 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 6c   = SEEK_SET;.  l
23cd0 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 69 4f 66 73  k.l_start = iOfs
23ce0 74 3b 0a 20 20 6c 6b 2e 6c 5f 6c 65 6e 20 3d 20  t;.  lk.l_len = 
23cf0 69 43 6e 74 3b 0a 20 20 0a 20 20 69 66 28 20 70  iCnt;.  .  if( p
23d00 69 64 21 3d 53 51 4c 49 54 45 5f 4c 4f 43 4b 53  id!=SQLITE_LOCKS
23d10 54 41 54 45 5f 41 4e 59 50 49 44 20 29 7b 0a 23  TATE_ANYPID ){.#
23d20 69 66 6e 64 65 66 20 46 5f 47 45 54 4c 4b 50 49  ifndef F_GETLKPI
23d30 44 0a 23 20 77 61 72 6e 69 6e 67 20 46 5f 47 45  D.# warning F_GE
23d40 54 4c 4b 50 49 44 20 75 6e 64 65 66 69 6e 65 64  TLKPID undefined
23d50 2c 20 5f 73 71 6c 69 74 65 33 5f 6c 6f 63 6b 73  , _sqlite3_locks
23d60 74 61 74 65 20 66 61 6c 6c 69 6e 67 20 62 61 63  tate falling bac
23d70 6b 20 74 6f 20 46 5f 47 45 54 4c 4b 0a 20 20 20  k to F_GETLK.   
23d80 20 65 72 72 20 3d 20 66 63 6e 74 6c 28 68 2c 20   err = fcntl(h, 
23d90 46 5f 47 45 54 4c 4b 2c 20 26 6c 6b 29 3b 0a 23  F_GETLK, &lk);.#
23da0 65 6c 73 65 0a 20 20 20 20 6c 6b 2e 6c 5f 70 69  else.    lk.l_pi
23db0 64 20 3d 20 70 69 64 3b 0a 20 20 20 20 65 72 72  d = pid;.    err
23dc0 20 3d 20 66 63 6e 74 6c 28 68 2c 20 46 5f 47 45   = fcntl(h, F_GE
23dd0 54 4c 4b 50 49 44 2c 20 26 6c 6b 29 3b 0a 23 65  TLKPID, &lk);.#e
23de0 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ndif.  }else{.  
23df0 20 20 65 72 72 20 3d 20 66 63 6e 74 6c 28 68 2c    err = fcntl(h,
23e00 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 6b 29 3b 0a   F_GETLK, &lk);.
23e10 20 20 7d 0a 20 20 0a 20 20 69 66 28 20 65 72 72    }.  .  if( err
23e20 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 66 70  ==(-1) ){.    fp
23e30 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 66  rintf(stderr, "f
23e40 63 6e 74 6c 28 25 64 29 20 66 61 69 6c 65 64 3a  cntl(%d) failed:
23e50 20 65 72 72 6e 6f 3d 25 64 5c 6e 22 2c 20 68 2c   errno=%d\n", h,
23e60 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 72 65 74   errno);.    ret
23e70 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 20 20 0a 20  urn -1;.  }.  . 
23e80 20 69 66 28 20 6c 6b 2e 6c 5f 74 79 70 65 21 3d   if( lk.l_type!=
23e90 46 5f 55 4e 4c 43 4b 20 26 26 20 28 70 69 64 3d  F_UNLCK && (pid=
23ea0 3d 53 51 4c 49 54 45 5f 4c 4f 43 4b 53 54 41 54  =SQLITE_LOCKSTAT
23eb0 45 5f 41 4e 59 50 49 44 20 7c 7c 20 6c 6b 2e 6c  E_ANYPID || lk.l
23ec0 5f 70 69 64 3d 3d 70 69 64 29 20 29 7b 0a 23 69  _pid==pid) ){.#i
23ed0 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
23ee0 47 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74  G.    fprintf(st
23ef0 64 65 72 72 2c 20 22 25 73 20 6c 6f 63 6b 20 68  derr, "%s lock h
23f00 65 6c 64 20 62 79 20 25 64 5c 6e 22 2c 20 7a 54  eld by %d\n", zT
23f10 79 70 65 2c 20 28 69 6e 74 29 6c 6b 2e 6c 5f 70  ype, (int)lk.l_p
23f20 69 64 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  id);.#endif.    
23f30 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 20 0a 20  return 1;.  } . 
23f40 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 73 74   return 0;.}..st
23f50 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4c 6f 63  atic int unixLoc
23f60 6b 73 74 61 74 65 50 69 64 28 75 6e 69 78 46 69  kstatePid(unixFi
23f70 6c 65 20 2a 2c 20 70 69 64 5f 74 2c 20 69 6e 74  le *, pid_t, int
23f80 20 2a 29 3b 0a 0a 23 65 6e 64 69 66 20 2f 2a 20   *);..#endif /* 
23f90 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41  (SQLITE_ENABLE_A
23fa0 50 50 4c 45 5f 53 50 49 3e 30 29 20 26 26 20 64  PPLE_SPI>0) && d
23fb0 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
23fc0 29 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  ) */.../*.** If 
23fd0 2a 70 41 72 67 20 69 73 20 69 6e 69 74 69 61 6c  *pArg is initial
23fe0 6c 79 20 6e 65 67 61 74 69 76 65 20 74 68 65 6e  ly negative then
23ff0 20 74 68 69 73 20 69 73 20 61 20 71 75 65 72 79   this is a query
24000 2e 20 20 53 65 74 20 2a 70 41 72 67 20 74 6f 0a  .  Set *pArg to.
24010 2a 2a 20 31 20 6f 72 20 30 20 64 65 70 65 6e 64  ** 1 or 0 depend
24020 69 6e 67 20 6f 6e 20 77 68 65 74 68 65 72 20 6f  ing on whether o
24030 72 20 6e 6f 74 20 62 69 74 20 6d 61 73 6b 20 6f  r not bit mask o
24040 66 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61  f pFile->ctrlFla
24050 67 73 20 69 73 20 73 65 74 2e 0a 2a 2a 0a 2a 2a  gs is set..**.**
24060 20 49 66 20 2a 70 41 72 67 20 69 73 20 30 20 6f   If *pArg is 0 o
24070 72 20 31 2c 20 74 68 65 6e 20 63 6c 65 61 72 20  r 1, then clear 
24080 6f 72 20 73 65 74 20 74 68 65 20 6d 61 73 6b 20  or set the mask 
24090 62 69 74 20 6f 66 20 70 46 69 6c 65 2d 3e 63 74  bit of pFile->ct
240a0 72 6c 46 6c 61 67 73 2e 0a 2a 2f 0a 73 74 61 74  rlFlags..*/.stat
240b0 69 63 20 76 6f 69 64 20 75 6e 69 78 4d 6f 64 65  ic void unixMode
240c0 42 69 74 28 75 6e 69 78 46 69 6c 65 20 2a 70 46  Bit(unixFile *pF
240d0 69 6c 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  ile, unsigned ch
240e0 61 72 20 6d 61 73 6b 2c 20 69 6e 74 20 2a 70 41  ar mask, int *pA
240f0 72 67 29 7b 0a 20 20 69 66 28 20 2a 70 41 72 67  rg){.  if( *pArg
24100 3c 30 20 29 7b 0a 20 20 20 20 2a 70 41 72 67 20  <0 ){.    *pArg 
24110 3d 20 28 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c  = (pFile->ctrlFl
24120 61 67 73 20 26 20 6d 61 73 6b 29 21 3d 30 3b 0a  ags & mask)!=0;.
24130 20 20 7d 65 6c 73 65 20 69 66 28 20 28 2a 70 41    }else if( (*pA
24140 72 67 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 46  rg)==0 ){.    pF
24150 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26  ile->ctrlFlags &
24160 3d 20 7e 6d 61 73 6b 3b 0a 20 20 7d 65 6c 73 65  = ~mask;.  }else
24170 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63 74 72  {.    pFile->ctr
24180 6c 46 6c 61 67 73 20 7c 3d 20 6d 61 73 6b 3b 0a  lFlags |= mask;.
24190 20 20 7d 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72    }.}../* Forwar
241a0 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 2a 2f  d declaration */
241b0 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
241c0 47 65 74 54 65 6d 70 6e 61 6d 65 28 69 6e 74 20  GetTempname(int 
241d0 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66  nBuf, char *zBuf
241e0 29 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6e 66 6f 72 6d  );../*.** Inform
241f0 61 74 69 6f 6e 20 61 6e 64 20 63 6f 6e 74 72 6f  ation and contro
24200 6c 20 6f 66 20 61 6e 20 6f 70 65 6e 20 66 69 6c  l of an open fil
24210 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61  e handle..*/.sta
24220 74 69 63 20 69 6e 74 20 75 6e 69 78 46 69 6c 65  tic int unixFile
24230 43 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f  Control(sqlite3_
24240 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6f 70  file *id, int op
24250 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20  , void *pArg){. 
24260 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
24270 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
24280 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29  ;.  switch( op )
24290 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  {.    case SQLIT
242a0 45 5f 46 43 4e 54 4c 5f 57 41 4c 5f 42 4c 4f 43  E_FCNTL_WAL_BLOC
242b0 4b 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 70 46  K: {.      /* pF
242c0 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c  ile->ctrlFlags |
242d0 3d 20 55 4e 49 58 46 49 4c 45 5f 42 4c 4f 43 4b  = UNIXFILE_BLOCK
242e0 3b 20 2f 2f 20 44 65 66 65 72 72 65 64 20 66 65  ; // Deferred fe
242f0 61 74 75 72 65 20 2a 2f 0a 20 20 20 20 20 20 72  ature */.      r
24300 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
24310 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
24320 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43  SQLITE_FCNTL_LOC
24330 4b 53 54 41 54 45 3a 20 7b 0a 20 20 20 20 20 20  KSTATE: {.      
24340 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d 20 70 46  *(int*)pArg = pF
24350 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3b 0a  ile->eFileLock;.
24360 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
24370 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
24380 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
24390 4e 54 4c 5f 4c 41 53 54 5f 45 52 52 4e 4f 3a 20  NTL_LAST_ERRNO: 
243a0 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74 2a 29 70  {.      *(int*)p
243b0 41 72 67 20 3d 20 70 46 69 6c 65 2d 3e 6c 61 73  Arg = pFile->las
243c0 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 65  tErrno;.      re
243d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
243e0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
243f0 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 43 48 55 4e  QLITE_FCNTL_CHUN
24400 4b 5f 53 49 5a 45 3a 20 7b 0a 20 20 20 20 20 20  K_SIZE: {.      
24410 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20 3d  pFile->szChunk =
24420 20 2a 28 69 6e 74 20 2a 29 70 41 72 67 3b 0a 20   *(int *)pArg;. 
24430 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
24440 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
24450 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
24460 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 3a 20 7b 0a  TL_SIZE_HINT: {.
24470 20 20 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20        int rc;.  
24480 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72      SimulateIOEr
24490 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20  rorBenign(1);.  
244a0 20 20 20 20 72 63 20 3d 20 66 63 6e 74 6c 53 69      rc = fcntlSi
244b0 7a 65 48 69 6e 74 28 70 46 69 6c 65 2c 20 2a 28  zeHint(pFile, *(
244c0 69 36 34 20 2a 29 70 41 72 67 29 3b 0a 20 20 20  i64 *)pArg);.   
244d0 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72     SimulateIOErr
244e0 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20  orBenign(0);.   
244f0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
24500 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
24510 49 54 45 5f 46 43 4e 54 4c 5f 50 45 52 53 49 53  ITE_FCNTL_PERSIS
24520 54 5f 57 41 4c 3a 20 7b 0a 20 20 20 20 20 20 75  T_WAL: {.      u
24530 6e 69 78 4d 6f 64 65 42 69 74 28 70 46 69 6c 65  nixModeBit(pFile
24540 2c 20 55 4e 49 58 46 49 4c 45 5f 50 45 52 53 49  , UNIXFILE_PERSI
24550 53 54 5f 57 41 4c 2c 20 28 69 6e 74 2a 29 70 41  ST_WAL, (int*)pA
24560 72 67 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  rg);.      retur
24570 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
24580 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
24590 54 45 5f 46 43 4e 54 4c 5f 50 4f 57 45 52 53 41  TE_FCNTL_POWERSA
245a0 46 45 5f 4f 56 45 52 57 52 49 54 45 3a 20 7b 0a  FE_OVERWRITE: {.
245b0 20 20 20 20 20 20 75 6e 69 78 4d 6f 64 65 42 69        unixModeBi
245c0 74 28 70 46 69 6c 65 2c 20 55 4e 49 58 46 49 4c  t(pFile, UNIXFIL
245d0 45 5f 50 53 4f 57 2c 20 28 69 6e 74 2a 29 70 41  E_PSOW, (int*)pA
245e0 72 67 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  rg);.      retur
245f0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
24600 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
24610 54 45 5f 46 43 4e 54 4c 5f 56 46 53 4e 41 4d 45  TE_FCNTL_VFSNAME
24620 3a 20 7b 0a 20 20 20 20 20 20 2a 28 63 68 61 72  : {.      *(char
24630 2a 2a 29 70 41 72 67 20 3d 20 73 71 6c 69 74 65  **)pArg = sqlite
24640 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20  3_mprintf("%s", 
24650 70 46 69 6c 65 2d 3e 70 56 66 73 2d 3e 7a 4e 61  pFile->pVfs->zNa
24660 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  me);.      retur
24670 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
24680 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
24690 54 45 5f 46 43 4e 54 4c 5f 54 45 4d 50 46 49 4c  TE_FCNTL_TEMPFIL
246a0 45 4e 41 4d 45 3a 20 7b 0a 20 20 20 20 20 20 63  ENAME: {.      c
246b0 68 61 72 20 2a 7a 54 46 69 6c 65 20 3d 20 73 71  har *zTFile = sq
246c0 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 70 46  lite3_malloc( pF
246d0 69 6c 65 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74  ile->pVfs->mxPat
246e0 68 6e 61 6d 65 20 29 3b 0a 20 20 20 20 20 20 69  hname );.      i
246f0 66 28 20 7a 54 46 69 6c 65 20 29 7b 0a 20 20 20  f( zTFile ){.   
24700 20 20 20 20 20 75 6e 69 78 47 65 74 54 65 6d 70       unixGetTemp
24710 6e 61 6d 65 28 70 46 69 6c 65 2d 3e 70 56 66 73  name(pFile->pVfs
24720 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2c 20 7a 54  ->mxPathname, zT
24730 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 2a  File);.        *
24740 28 63 68 61 72 2a 2a 29 70 41 72 67 20 3d 20 7a  (char**)pArg = z
24750 54 46 69 6c 65 3b 0a 20 20 20 20 20 20 7d 0a 20  TFile;.      }. 
24760 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
24770 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20  TE_OK;.    }.   
24780 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e   case SQLITE_FCN
24790 54 4c 5f 48 41 53 5f 4d 4f 56 45 44 3a 20 7b 0a  TL_HAS_MOVED: {.
247a0 20 20 20 20 20 20 2a 28 69 6e 74 2a 29 70 41 72        *(int*)pAr
247b0 67 20 3d 20 66 69 6c 65 48 61 73 4d 6f 76 65 64  g = fileHasMoved
247c0 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 72  (pFile);.      r
247d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
247e0 0a 20 20 20 20 7d 0a 23 69 66 20 53 51 4c 49 54  .    }.#if SQLIT
247f0 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
24800 30 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  0.    case SQLIT
24810 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a  E_FCNTL_MMAP_SIZ
24820 45 3a 20 7b 0a 20 20 20 20 20 20 69 36 34 20 6e  E: {.      i64 n
24830 65 77 4c 69 6d 69 74 20 3d 20 2a 28 69 36 34 2a  ewLimit = *(i64*
24840 29 70 41 72 67 3b 0a 20 20 20 20 20 20 69 6e 74  )pArg;.      int
24850 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
24860 0a 20 20 20 20 20 20 69 66 28 20 6e 65 77 4c 69  .      if( newLi
24870 6d 69 74 3e 73 71 6c 69 74 65 33 47 6c 6f 62 61  mit>sqlite3Globa
24880 6c 43 6f 6e 66 69 67 2e 6d 78 4d 6d 61 70 20 29  lConfig.mxMmap )
24890 7b 0a 20 20 20 20 20 20 20 20 6e 65 77 4c 69 6d  {.        newLim
248a0 69 74 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62  it = sqlite3Glob
248b0 61 6c 43 6f 6e 66 69 67 2e 6d 78 4d 6d 61 70 3b  alConfig.mxMmap;
248c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a  .      }.      *
248d0 28 69 36 34 2a 29 70 41 72 67 20 3d 20 70 46 69  (i64*)pArg = pFi
248e0 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 3b  le->mmapSizeMax;
248f0 0a 20 20 20 20 20 20 69 66 28 20 6e 65 77 4c 69  .      if( newLi
24900 6d 69 74 3e 3d 30 20 26 26 20 6e 65 77 4c 69 6d  mit>=0 && newLim
24910 69 74 21 3d 70 46 69 6c 65 2d 3e 6d 6d 61 70 53  it!=pFile->mmapS
24920 69 7a 65 4d 61 78 20 26 26 20 70 46 69 6c 65 2d  izeMax && pFile-
24930 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30 20 29 7b  >nFetchOut==0 ){
24940 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  .        pFile->
24950 6d 6d 61 70 53 69 7a 65 4d 61 78 20 3d 20 6e 65  mmapSizeMax = ne
24960 77 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 20 20  wLimit;.        
24970 69 66 28 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53  if( pFile->mmapS
24980 69 7a 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  ize>0 ){.       
24990 20 20 20 75 6e 69 78 55 6e 6d 61 70 66 69 6c 65     unixUnmapfile
249a0 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20  (pFile);.       
249b0 20 20 20 72 63 20 3d 20 75 6e 69 78 4d 61 70 66     rc = unixMapf
249c0 69 6c 65 28 70 46 69 6c 65 2c 20 2d 31 29 3b 0a  ile(pFile, -1);.
249d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
249e0 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  }.      return r
249f0 63 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  c;.    }.#endif.
24a00 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
24a10 42 55 47 0a 20 20 20 20 2f 2a 20 54 68 65 20 70  BUG.    /* The p
24a20 61 67 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20  ager calls this 
24a30 6d 65 74 68 6f 64 20 74 6f 20 73 69 67 6e 61 6c  method to signal
24a40 20 74 68 61 74 20 69 74 20 68 61 73 20 64 6f 6e   that it has don
24a50 65 0a 20 20 20 20 2a 2a 20 61 20 72 6f 6c 6c 62  e.    ** a rollb
24a60 61 63 6b 20 61 6e 64 20 74 68 61 74 20 74 68 65  ack and that the
24a70 20 64 61 74 61 62 61 73 65 20 69 73 20 74 68 65   database is the
24a80 72 65 66 6f 72 65 20 75 6e 63 68 61 6e 67 65 64  refore unchanged
24a90 20 61 6e 64 0a 20 20 20 20 2a 2a 20 69 74 20 68   and.    ** it h
24aa0 65 6e 63 65 20 69 74 20 69 73 20 4f 4b 20 66 6f  ence it is OK fo
24ab0 72 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  r the transactio
24ac0 6e 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72  n change counter
24ad0 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20 75 6e   to be.    ** un
24ae0 63 68 61 6e 67 65 64 2e 0a 20 20 20 20 2a 2f 0a  changed..    */.
24af0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
24b00 46 43 4e 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47  FCNTL_DB_UNCHANG
24b10 45 44 3a 20 7b 0a 20 20 20 20 20 20 28 28 75 6e  ED: {.      ((un
24b20 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 64 62 55  ixFile*)id)->dbU
24b30 70 64 61 74 65 20 3d 20 30 3b 0a 20 20 20 20 20  pdate = 0;.     
24b40 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
24b50 4b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  K;.    }.#endif.
24b60 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  #if SQLITE_ENABL
24b70 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
24b80 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  && defined(__APP
24b90 4c 45 5f 5f 29 0a 20 20 20 20 63 61 73 65 20 53  LE__).    case S
24ba0 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 45 54 5f  QLITE_FCNTL_SET_
24bb0 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 3a 0a 20  LOCKPROXYFILE:. 
24bc0 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
24bd0 43 4e 54 4c 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f  CNTL_GET_LOCKPRO
24be0 58 59 46 49 4c 45 3a 20 7b 0a 20 20 20 20 20 20  XYFILE: {.      
24bf0 72 65 74 75 72 6e 20 70 72 6f 78 79 46 69 6c 65  return proxyFile
24c00 43 6f 6e 74 72 6f 6c 28 69 64 2c 6f 70 2c 70 41  Control(id,op,pA
24c10 72 67 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  rg);.    }.#endi
24c20 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42  f /* SQLITE_ENAB
24c30 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
24c40 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50   && defined(__AP
24c50 50 4c 45 5f 5f 29 20 2a 2f 0a 23 69 66 20 28 53  PLE__) */.#if (S
24c60 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 50  QLITE_ENABLE_APP
24c70 4c 45 5f 53 50 49 3e 30 29 20 26 26 20 64 65 66  LE_SPI>0) && def
24c80 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a  ined(__APPLE__).
24c90 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
24ca0 46 43 4e 54 4c 5f 54 52 55 4e 43 41 54 45 5f 44  FCNTL_TRUNCATE_D
24cb0 41 54 41 42 41 53 45 3a 20 7b 0a 20 20 20 20 20  ATABASE: {.     
24cc0 20 72 65 74 75 72 6e 20 75 6e 69 78 54 72 75 6e   return unixTrun
24cd0 63 61 74 65 44 61 74 61 62 61 73 65 28 70 46 69  cateDatabase(pFi
24ce0 6c 65 2c 20 28 70 41 72 67 20 3f 20 28 2a 28 69  le, (pArg ? (*(i
24cf0 6e 74 20 2a 29 70 41 72 67 29 20 3a 20 30 29 29  nt *)pArg) : 0))
24d00 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
24d10 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 52 45   SQLITE_FCNTL_RE
24d20 50 4c 41 43 45 5f 44 41 54 41 42 41 53 45 3a 20  PLACE_DATABASE: 
24d30 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 75  {.      return u
24d40 6e 69 78 52 65 70 6c 61 63 65 44 61 74 61 62 61  nixReplaceDataba
24d50 73 65 28 70 46 69 6c 65 2c 20 28 73 71 6c 69 74  se(pFile, (sqlit
24d60 65 33 20 2a 29 70 41 72 67 29 3b 0a 20 20 20 20  e3 *)pArg);.    
24d70 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
24d80 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b 53 54 41 54  E_FCNTL_LOCKSTAT
24d90 45 5f 50 49 44 3a 20 7b 0a 20 20 20 20 20 20 4c  E_PID: {.      L
24da0 6f 63 6b 73 74 61 74 65 50 49 44 20 2a 70 4c 6f  ockstatePID *pLo
24db0 63 6b 73 74 61 74 65 3b 0a 20 20 20 20 20 20 69  ckstate;.      i
24dc0 6e 74 20 72 63 3b 0a 20 20 20 20 20 20 0a 20 20  nt rc;.      .  
24dd0 20 20 20 20 69 66 28 20 70 41 72 67 3d 3d 4e 55      if( pArg==NU
24de0 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  LL ){.        re
24df0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
24e00 53 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  SE;.      }.    
24e10 20 20 70 4c 6f 63 6b 73 74 61 74 65 20 3d 20 28    pLockstate = (
24e20 4c 6f 63 6b 73 74 61 74 65 50 49 44 20 2a 29 70  LockstatePID *)p
24e30 41 72 67 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  Arg;.      rc = 
24e40 75 6e 69 78 4c 6f 63 6b 73 74 61 74 65 50 69 64  unixLockstatePid
24e50 28 70 46 69 6c 65 2c 20 70 4c 6f 63 6b 73 74 61  (pFile, pLocksta
24e60 74 65 2d 3e 70 69 64 2c 20 26 28 70 4c 6f 63 6b  te->pid, &(pLock
24e70 73 74 61 74 65 2d 3e 73 74 61 74 65 29 29 3b 0a  state->state));.
24e80 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
24e90 0a 20 20 20 20 7d 0a 20 20 20 20 20 20 0a 23 65  .    }.      .#e
24ea0 6e 64 69 66 20 2f 2a 20 28 53 51 4c 49 54 45 5f  ndif /* (SQLITE_
24eb0 45 4e 41 42 4c 45 5f 41 50 50 4c 45 5f 53 50 49  ENABLE_APPLE_SPI
24ec0 3e 30 29 20 26 26 20 64 65 66 69 6e 65 64 28 5f  >0) && defined(_
24ed0 5f 41 50 50 4c 45 5f 5f 29 20 2a 2f 0a 20 20 7d  _APPLE__) */.  }
24ee0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
24ef0 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 7d 0a 0a 2f 2a  _NOTFOUND;.}../*
24f00 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73  .** Return the s
24f10 65 63 74 6f 72 20 73 69 7a 65 20 69 6e 20 62 79  ector size in by
24f20 74 65 73 20 6f 66 20 74 68 65 20 75 6e 64 65 72  tes of the under
24f30 6c 79 69 6e 67 20 62 6c 6f 63 6b 20 64 65 76 69  lying block devi
24f40 63 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73 70  ce for.** the sp
24f50 65 63 69 66 69 65 64 20 66 69 6c 65 2e 20 54 68  ecified file. Th
24f60 69 73 20 69 73 20 61 6c 6d 6f 73 74 20 61 6c 77  is is almost alw
24f70 61 79 73 20 35 31 32 20 62 79 74 65 73 2c 20 62  ays 512 bytes, b
24f80 75 74 20 6d 61 79 20 62 65 0a 2a 2a 20 6c 61 72  ut may be.** lar
24f90 67 65 72 20 66 6f 72 20 73 6f 6d 65 20 64 65 76  ger for some dev
24fa0 69 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69  ices..**.** SQLi
24fb0 74 65 20 63 6f 64 65 20 61 73 73 75 6d 65 73 20  te code assumes 
24fc0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 61  this function ca
24fd0 6e 6e 6f 74 20 66 61 69 6c 2e 20 49 74 20 61 6c  nnot fail. It al
24fe0 73 6f 20 61 73 73 75 6d 65 73 20 74 68 61 74 0a  so assumes that.
24ff0 2a 2a 20 69 66 20 74 77 6f 20 66 69 6c 65 73 20  ** if two files 
25000 61 72 65 20 63 72 65 61 74 65 64 20 69 6e 20 74  are created in t
25010 68 65 20 73 61 6d 65 20 66 69 6c 65 2d 73 79 73  he same file-sys
25020 74 65 6d 20 64 69 72 65 63 74 6f 72 79 20 28 69  tem directory (i
25030 2e 65 2e 0a 2a 2a 20 61 20 64 61 74 61 62 61 73  .e..** a databas
25040 65 20 61 6e 64 20 69 74 73 20 6a 6f 75 72 6e 61  e and its journa
25050 6c 20 66 69 6c 65 29 20 74 68 61 74 20 74 68 65  l file) that the
25060 20 73 65 63 74 6f 72 20 73 69 7a 65 20 77 69 6c   sector size wil
25070 6c 20 62 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65  l be the.** same
25080 20 66 6f 72 20 62 6f 74 68 2e 0a 2a 2f 0a 23 69   for both..*/.#i
25090 66 6e 64 65 66 20 5f 5f 51 4e 58 4e 54 4f 5f 5f  fndef __QNXNTO__
250a0 20 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69   .static int uni
250b0 78 53 65 63 74 6f 72 53 69 7a 65 28 73 71 6c 69  xSectorSize(sqli
250c0 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65  te3_file *NotUse
250d0 64 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  d){.  UNUSED_PAR
250e0 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b  AMETER(NotUsed);
250f0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
25100 5f 44 45 46 41 55 4c 54 5f 53 45 43 54 4f 52 5f  _DEFAULT_SECTOR_
25110 53 49 5a 45 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  SIZE;.}.#endif..
25120 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
25130 69 6e 67 20 76 65 72 73 69 6f 6e 20 6f 66 20 75  ing version of u
25140 6e 69 78 53 65 63 74 6f 72 53 69 7a 65 28 29 20  nixSectorSize() 
25150 69 73 20 6f 70 74 69 6d 69 7a 65 64 20 66 6f 72  is optimized for
25160 20 51 4e 58 2e 0a 2a 2f 0a 23 69 66 64 65 66 20   QNX..*/.#ifdef 
25170 5f 5f 51 4e 58 4e 54 4f 5f 5f 0a 23 69 6e 63 6c  __QNXNTO__.#incl
25180 75 64 65 20 3c 73 79 73 2f 64 63 6d 64 5f 62 6c  ude <sys/dcmd_bl
25190 6b 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73  k.h>.#include <s
251a0 79 73 2f 73 74 61 74 76 66 73 2e 68 3e 0a 73 74  ys/statvfs.h>.st
251b0 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 65 63  atic int unixSec
251c0 74 6f 72 53 69 7a 65 28 73 71 6c 69 74 65 33 5f  torSize(sqlite3_
251d0 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 75 6e 69  file *id){.  uni
251e0 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
251f0 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
25200 69 66 28 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f  if( pFile->secto
25210 72 53 69 7a 65 20 3d 3d 20 30 20 29 7b 0a 20 20  rSize == 0 ){.  
25220 20 20 73 74 72 75 63 74 20 73 74 61 74 76 66 73    struct statvfs
25230 20 66 73 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20   fsInfo;.       
25240 0a 20 20 20 20 2f 2a 20 53 65 74 20 64 65 66 61  .    /* Set defa
25250 75 6c 74 73 20 66 6f 72 20 6e 6f 6e 2d 73 75 70  ults for non-sup
25260 70 6f 72 74 65 64 20 66 69 6c 65 73 79 73 74 65  ported filesyste
25270 6d 73 20 2a 2f 0a 20 20 20 20 70 46 69 6c 65 2d  ms */.    pFile-
25280 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 53 51  >sectorSize = SQ
25290 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 53 45 43  LITE_DEFAULT_SEC
252a0 54 4f 52 5f 53 49 5a 45 3b 0a 20 20 20 20 70 46  TOR_SIZE;.    pF
252b0 69 6c 65 2d 3e 64 65 76 69 63 65 43 68 61 72 61  ile->deviceChara
252c0 63 74 65 72 69 73 74 69 63 73 20 3d 20 30 3b 0a  cteristics = 0;.
252d0 20 20 20 20 69 66 28 20 66 73 74 61 74 76 66 73      if( fstatvfs
252e0 28 70 46 69 6c 65 2d 3e 68 2c 20 26 66 73 49 6e  (pFile->h, &fsIn
252f0 66 6f 29 20 3d 3d 20 2d 31 20 29 20 7b 0a 20 20  fo) == -1 ) {.  
25300 20 20 20 20 72 65 74 75 72 6e 20 70 46 69 6c 65      return pFile
25310 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20  ->sectorSize;.  
25320 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 21 73 74    }..    if( !st
25330 72 63 6d 70 28 66 73 49 6e 66 6f 2e 66 5f 62 61  rcmp(fsInfo.f_ba
25340 73 65 74 79 70 65 2c 20 22 74 6d 70 22 29 20 29  setype, "tmp") )
25350 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e   {.      pFile->
25360 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 66 73 49  sectorSize = fsI
25370 6e 66 6f 2e 66 5f 62 73 69 7a 65 3b 0a 20 20 20  nfo.f_bsize;.   
25380 20 20 20 70 46 69 6c 65 2d 3e 64 65 76 69 63 65     pFile->device
25390 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20  Characteristics 
253a0 3d 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45  =.        SQLITE
253b0 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 34 4b 20  _IOCAP_ATOMIC4K 
253c0 7c 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 72  |       /* All r
253d0 61 6d 20 66 69 6c 65 73 79 73 74 65 6d 20 77 72  am filesystem wr
253e0 69 74 65 73 20 61 72 65 20 61 74 6f 6d 69 63 20  ites are atomic 
253f0 2a 2f 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54  */.        SQLIT
25400 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50  E_IOCAP_SAFE_APP
25410 45 4e 44 20 7c 20 20 20 20 2f 2a 20 67 72 6f 77  END |    /* grow
25420 69 6e 67 20 74 68 65 20 66 69 6c 65 20 64 6f 65  ing the file doe
25430 73 20 6e 6f 74 20 6f 63 63 75 72 20 75 6e 74 69  s not occur unti
25440 6c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l.              
25450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25460 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 77          ** the w
25470 72 69 74 65 20 73 75 63 63 65 65 64 73 20 2a 2f  rite succeeds */
25480 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f  .        SQLITE_
25490 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c  IOCAP_SEQUENTIAL
254a0 20 7c 20 20 20 20 20 2f 2a 20 54 68 65 20 72 61   |     /* The ra
254b0 6d 20 66 69 6c 65 73 79 73 74 65 6d 20 68 61 73  m filesystem has
254c0 20 6e 6f 20 77 72 69 74 65 20 62 65 68 69 6e 64   no write behind
254d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
254e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
254f0 20 20 20 20 20 20 20 2a 2a 20 73 6f 20 69 74 20         ** so it 
25500 69 73 20 6f 72 64 65 72 65 64 20 2a 2f 0a 20 20  is ordered */.  
25510 20 20 20 20 20 20 30 3b 0a 20 20 20 20 7d 65 6c        0;.    }el
25520 73 65 20 69 66 28 20 73 74 72 73 74 72 28 66 73  se if( strstr(fs
25530 49 6e 66 6f 2e 66 5f 62 61 73 65 74 79 70 65 2c  Info.f_basetype,
25540 20 22 65 74 66 73 22 29 20 29 7b 0a 20 20 20 20   "etfs") ){.    
25550 20 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53    pFile->sectorS
25560 69 7a 65 20 3d 20 66 73 49 6e 66 6f 2e 66 5f 62  ize = fsInfo.f_b
25570 73 69 7a 65 3b 0a 20 20 20 20 20 20 70 46 69 6c  size;.      pFil
25580 65 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63 74  e->deviceCharact
25590 65 72 69 73 74 69 63 73 20 3d 0a 20 20 20 20 20  eristics =.     
255a0 20 20 20 2f 2a 20 65 74 66 73 20 63 6c 75 73 74     /* etfs clust
255b0 65 72 20 73 69 7a 65 20 77 72 69 74 65 73 20 61  er size writes a
255c0 72 65 20 61 74 6f 6d 69 63 20 2a 2f 0a 20 20 20  re atomic */.   
255d0 20 20 20 20 20 28 70 46 69 6c 65 2d 3e 73 65 63       (pFile->sec
255e0 74 6f 72 53 69 7a 65 20 2f 20 35 31 32 20 2a 20  torSize / 512 * 
255f0 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f  SQLITE_IOCAP_ATO
25600 4d 49 43 35 31 32 29 20 7c 0a 20 20 20 20 20 20  MIC512) |.      
25610 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53    SQLITE_IOCAP_S
25620 41 46 45 5f 41 50 50 45 4e 44 20 7c 20 20 20 20  AFE_APPEND |    
25630 2f 2a 20 67 72 6f 77 69 6e 67 20 74 68 65 20 66  /* growing the f
25640 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63  ile does not occ
25650 75 72 20 75 6e 74 69 6c 0a 20 20 20 20 20 20 20  ur until.       
25660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
25680 2a 20 74 68 65 20 77 72 69 74 65 20 73 75 63 63  * the write succ
25690 65 65 64 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  eeds */.        
256a0 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51  SQLITE_IOCAP_SEQ
256b0 55 45 4e 54 49 41 4c 20 7c 20 20 20 20 20 2f 2a  UENTIAL |     /*
256c0 20 54 68 65 20 72 61 6d 20 66 69 6c 65 73 79 73   The ram filesys
256d0 74 65 6d 20 68 61 73 20 6e 6f 20 77 72 69 74 65  tem has no write
256e0 20 62 65 68 69 6e 64 0a 20 20 20 20 20 20 20 20   behind.        
256f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
25710 20 73 6f 20 69 74 20 69 73 20 6f 72 64 65 72 65   so it is ordere
25720 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 30 3b 0a  d */.        0;.
25730 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21 73      }else if( !s
25740 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e 66 5f 62  trcmp(fsInfo.f_b
25750 61 73 65 74 79 70 65 2c 20 22 71 6e 78 36 22 29  asetype, "qnx6")
25760 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d   ){.      pFile-
25770 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 66 73  >sectorSize = fs
25780 49 6e 66 6f 2e 66 5f 62 73 69 7a 65 3b 0a 20 20  Info.f_bsize;.  
25790 20 20 20 20 70 46 69 6c 65 2d 3e 64 65 76 69 63      pFile->devic
257a0 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
257b0 20 3d 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54   =.        SQLIT
257c0 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 20 7c  E_IOCAP_ATOMIC |
257d0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20           /* All 
257e0 66 69 6c 65 73 79 73 74 65 6d 20 77 72 69 74 65  filesystem write
257f0 73 20 61 72 65 20 61 74 6f 6d 69 63 20 2a 2f 0a  s are atomic */.
25800 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49          SQLITE_I
25810 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44  OCAP_SAFE_APPEND
25820 20 7c 20 20 20 20 2f 2a 20 67 72 6f 77 69 6e 67   |    /* growing
25830 20 74 68 65 20 66 69 6c 65 20 64 6f 65 73 20 6e   the file does n
25840 6f 74 20 6f 63 63 75 72 20 75 6e 74 69 6c 0a 20  ot occur until. 
25850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25870 20 20 20 20 20 2a 2a 20 74 68 65 20 77 72 69 74       ** the writ
25880 65 20 73 75 63 63 65 65 64 73 20 2a 2f 0a 20 20  e succeeds */.  
25890 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43        SQLITE_IOC
258a0 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 20 7c 20  AP_SEQUENTIAL | 
258b0 20 20 20 20 2f 2a 20 54 68 65 20 72 61 6d 20 66      /* The ram f
258c0 69 6c 65 73 79 73 74 65 6d 20 68 61 73 20 6e 6f  ilesystem has no
258d0 20 77 72 69 74 65 20 62 65 68 69 6e 64 0a 20 20   write behind.  
258e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
258f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25900 20 20 20 20 2a 2a 20 73 6f 20 69 74 20 69 73 20      ** so it is 
25910 6f 72 64 65 72 65 64 20 2a 2f 0a 20 20 20 20 20  ordered */.     
25920 20 20 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20     0;.    }else 
25930 69 66 28 20 21 73 74 72 63 6d 70 28 66 73 49 6e  if( !strcmp(fsIn
25940 66 6f 2e 66 5f 62 61 73 65 74 79 70 65 2c 20 22  fo.f_basetype, "
25950 71 6e 78 34 22 29 20 29 7b 0a 20 20 20 20 20 20  qnx4") ){.      
25960 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a  pFile->sectorSiz
25970 65 20 3d 20 66 73 49 6e 66 6f 2e 66 5f 62 73 69  e = fsInfo.f_bsi
25980 7a 65 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  ze;.      pFile-
25990 3e 64 65 76 69 63 65 43 68 61 72 61 63 74 65 72  >deviceCharacter
259a0 69 73 74 69 63 73 20 3d 0a 20 20 20 20 20 20 20  istics =.       
259b0 20 2f 2a 20 66 75 6c 6c 20 62 69 74 73 65 74 20   /* full bitset 
259c0 6f 66 20 61 74 6f 6d 69 63 73 20 66 72 6f 6d 20  of atomics from 
259d0 6d 61 78 20 73 65 63 74 6f 72 20 73 69 7a 65 20  max sector size 
259e0 61 6e 64 20 73 6d 61 6c 6c 65 72 20 2a 2f 0a 20  and smaller */. 
259f0 20 20 20 20 20 20 20 28 28 70 46 69 6c 65 2d 3e         ((pFile->
25a00 73 65 63 74 6f 72 53 69 7a 65 20 2f 20 35 31 32  sectorSize / 512
25a10 20 2a 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f   * SQLITE_IOCAP_
25a20 41 54 4f 4d 49 43 35 31 32 29 20 3c 3c 20 31 29  ATOMIC512) << 1)
25a30 20 2d 20 32 20 7c 0a 20 20 20 20 20 20 20 20 53   - 2 |.        S
25a40 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55  QLITE_IOCAP_SEQU
25a50 45 4e 54 49 41 4c 20 7c 20 20 20 20 20 2f 2a 20  ENTIAL |     /* 
25a60 54 68 65 20 72 61 6d 20 66 69 6c 65 73 79 73 74  The ram filesyst
25a70 65 6d 20 68 61 73 20 6e 6f 20 77 72 69 74 65 20  em has no write 
25a80 62 65 68 69 6e 64 0a 20 20 20 20 20 20 20 20 20  behind.         
25a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
25ab0 73 6f 20 69 74 20 69 73 20 6f 72 64 65 72 65 64  so it is ordered
25ac0 20 2a 2f 0a 20 20 20 20 20 20 20 20 30 3b 0a 20   */.        0;. 
25ad0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
25ae0 73 74 72 28 66 73 49 6e 66 6f 2e 66 5f 62 61 73  str(fsInfo.f_bas
25af0 65 74 79 70 65 2c 20 22 64 6f 73 22 29 20 29 7b  etype, "dos") ){
25b00 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 65  .      pFile->se
25b10 63 74 6f 72 53 69 7a 65 20 3d 20 66 73 49 6e 66  ctorSize = fsInf
25b20 6f 2e 66 5f 62 73 69 7a 65 3b 0a 20 20 20 20 20  o.f_bsize;.     
25b30 20 70 46 69 6c 65 2d 3e 64 65 76 69 63 65 43 68   pFile->deviceCh
25b40 61 72 61 63 74 65 72 69 73 74 69 63 73 20 3d 0a  aracteristics =.
25b50 20 20 20 20 20 20 20 20 2f 2a 20 66 75 6c 6c 20          /* full 
25b60 62 69 74 73 65 74 20 6f 66 20 61 74 6f 6d 69 63  bitset of atomic
25b70 73 20 66 72 6f 6d 20 6d 61 78 20 73 65 63 74 6f  s from max secto
25b80 72 20 73 69 7a 65 20 61 6e 64 20 73 6d 61 6c 6c  r size and small
25b90 65 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 28 28  er */.        ((
25ba0 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a  pFile->sectorSiz
25bb0 65 20 2f 20 35 31 32 20 2a 20 53 51 4c 49 54 45  e / 512 * SQLITE
25bc0 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32  _IOCAP_ATOMIC512
25bd0 29 20 3c 3c 20 31 29 20 2d 20 32 20 7c 0a 20 20  ) << 1) - 2 |.  
25be0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43        SQLITE_IOC
25bf0 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 20 7c 20  AP_SEQUENTIAL | 
25c00 20 20 20 20 2f 2a 20 54 68 65 20 72 61 6d 20 66      /* The ram f
25c10 69 6c 65 73 79 73 74 65 6d 20 68 61 73 20 6e 6f  ilesystem has no
25c20 20 77 72 69 74 65 20 62 65 68 69 6e 64 0a 20 20   write behind.  
25c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25c50 20 20 20 20 2a 2a 20 73 6f 20 69 74 20 69 73 20      ** so it is 
25c60 6f 72 64 65 72 65 64 20 2a 2f 0a 20 20 20 20 20  ordered */.     
25c70 20 20 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b     0;.    }else{
25c80 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 64 65  .      pFile->de
25c90 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
25ca0 69 63 73 20 3d 0a 20 20 20 20 20 20 20 20 53 51  ics =.        SQ
25cb0 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49  LITE_IOCAP_ATOMI
25cc0 43 35 31 32 20 7c 20 20 20 20 20 20 2f 2a 20 62  C512 |      /* b
25cd0 6c 6f 63 6b 73 20 61 72 65 20 61 74 6f 6d 69 63  locks are atomic
25ce0 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 51 4c 49   */.        SQLI
25cf0 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50  TE_IOCAP_SAFE_AP
25d00 50 45 4e 44 20 7c 20 20 20 20 2f 2a 20 67 72 6f  PEND |    /* gro
25d10 77 69 6e 67 20 74 68 65 20 66 69 6c 65 20 64 6f  wing the file do
25d20 65 73 20 6e 6f 74 20 6f 63 63 75 72 20 75 6e 74  es not occur unt
25d30 69 6c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  il.             
25d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25d50 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20           ** the 
25d60 77 72 69 74 65 20 73 75 63 63 65 65 64 73 20 2a  write succeeds *
25d70 2f 0a 20 20 20 20 20 20 20 20 30 3b 0a 20 20 20  /.        0;.   
25d80 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20 4c 61 73 74   }.  }.  /* Last
25d90 20 63 68 61 6e 63 65 20 76 65 72 69 66 69 63 61   chance verifica
25da0 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 73 65  tion.  If the se
25db0 63 74 6f 72 20 73 69 7a 65 20 69 73 6e 27 74 20  ctor size isn't 
25dc0 61 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 35 31  a multiple of 51
25dd0 32 0a 20 20 2a 2a 20 74 68 65 6e 20 69 74 20 69  2.  ** then it i
25de0 73 6e 27 74 20 76 61 6c 69 64 2e 2a 2f 0a 20 20  sn't valid.*/.  
25df0 69 66 28 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f  if( pFile->secto
25e00 72 53 69 7a 65 20 25 20 35 31 32 20 21 3d 20 30  rSize % 512 != 0
25e10 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 64   ){.    pFile->d
25e20 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
25e30 74 69 63 73 20 3d 20 30 3b 0a 20 20 20 20 70 46  tics = 0;.    pF
25e40 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ile->sectorSize 
25e50 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  = SQLITE_DEFAULT
25e60 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 20 20  _SECTOR_SIZE;.  
25e70 7d 0a 20 20 72 65 74 75 72 6e 20 70 46 69 6c 65  }.  return pFile
25e80 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3b 0a 7d 0a  ->sectorSize;.}.
25e90 23 65 6e 64 69 66 20 2f 2a 20 5f 5f 51 4e 58 4e  #endif /* __QNXN
25ea0 54 4f 5f 5f 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52  TO__ */../*.** R
25eb0 65 74 75 72 6e 20 74 68 65 20 64 65 76 69 63 65  eturn the device
25ec0 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63 73   characteristics
25ed0 20 66 6f 72 20 74 68 65 20 66 69 6c 65 2e 0a 2a   for the file..*
25ee0 2a 0a 2a 2a 20 54 68 69 73 20 56 46 53 20 69 73  *.** This VFS is
25ef0 20 73 65 74 20 75 70 20 74 6f 20 72 65 74 75 72   set up to retur
25f00 6e 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50  n SQLITE_IOCAP_P
25f10 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49  OWERSAFE_OVERWRI
25f20 54 45 20 62 79 20 64 65 66 61 75 6c 74 2e 0a 2a  TE by default..*
25f30 2a 20 48 6f 77 65 76 65 72 2c 20 74 68 61 74 20  * However, that 
25f40 63 68 6f 69 63 65 20 69 73 20 63 6f 6e 74 72 6f  choice is contro
25f50 76 65 72 73 69 61 6c 20 73 69 6e 63 65 20 74 65  versial since te
25f60 63 68 6e 69 63 61 6c 6c 79 20 74 68 65 20 75 6e  chnically the un
25f70 64 65 72 6c 79 69 6e 67 0a 2a 2a 20 66 69 6c 65  derlying.** file
25f80 20 73 79 73 74 65 6d 20 64 6f 65 73 20 6e 6f 74   system does not
25f90 20 61 6c 77 61 79 73 20 70 72 6f 76 69 64 65 20   always provide 
25fa0 70 6f 77 65 72 73 61 66 65 20 6f 76 65 72 77 72  powersafe overwr
25fb0 69 74 65 73 2e 20 20 28 49 6e 20 6f 74 68 65 72  ites.  (In other
25fc0 0a 2a 2a 20 77 6f 72 64 73 2c 20 61 66 74 65 72  .** words, after
25fd0 20 61 20 70 6f 77 65 72 2d 6c 6f 73 73 20 65 76   a power-loss ev
25fe0 65 6e 74 2c 20 70 61 72 74 73 20 6f 66 20 74 68  ent, parts of th
25ff0 65 20 66 69 6c 65 20 74 68 61 74 20 77 65 72 65  e file that were
26000 20 6e 65 76 65 72 0a 2a 2a 20 77 72 69 74 74 65   never.** writte
26010 6e 20 6d 69 67 68 74 20 65 6e 64 20 75 70 20 62  n might end up b
26020 65 69 6e 67 20 61 6c 74 65 72 65 64 2e 29 20 20  eing altered.)  
26030 48 6f 77 65 76 65 72 2c 20 6e 6f 6e 2d 50 53 4f  However, non-PSO
26040 57 20 62 65 68 61 76 69 6f 72 20 69 73 20 76 65  W behavior is ve
26050 72 79 2c 0a 2a 2a 20 76 65 72 79 20 72 61 72 65  ry,.** very rare
26060 2e 20 20 41 6e 64 20 61 73 73 65 72 74 69 6e 67  .  And asserting
26070 20 50 53 4f 57 20 6d 61 6b 65 73 20 61 20 6c 61   PSOW makes a la
26080 72 67 65 20 72 65 64 75 63 74 69 6f 6e 20 69 6e  rge reduction in
26090 20 74 68 65 20 61 6d 6f 75 6e 74 0a 2a 2a 20 6f   the amount.** o
260a0 66 20 72 65 71 75 69 72 65 64 20 49 2f 4f 20 66  f required I/O f
260b0 6f 72 20 6a 6f 75 72 6e 61 6c 69 6e 67 2c 20 73  or journaling, s
260c0 69 6e 63 65 20 61 20 6c 6f 74 20 6f 66 20 70 61  ince a lot of pa
260d0 64 64 69 6e 67 20 69 73 20 65 6c 69 6d 69 6e 61  dding is elimina
260e0 74 65 64 2e 0a 2a 2a 20 20 48 65 6e 63 65 2c 20  ted..**  Hence, 
260f0 77 68 69 6c 65 20 50 4f 57 45 52 53 41 46 45 5f  while POWERSAFE_
26100 4f 56 45 52 57 52 49 54 45 20 69 73 20 6f 6e 20  OVERWRITE is on 
26110 62 79 20 64 65 66 61 75 6c 74 2c 20 74 68 65 72  by default, ther
26120 65 20 69 73 20 61 20 66 69 6c 65 2d 63 6f 6e 74  e is a file-cont
26130 72 6f 6c 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65  rol.** available
26140 20 74 6f 20 74 75 72 6e 20 69 74 20 6f 66 66 20   to turn it off 
26150 61 6e 64 20 55 52 49 20 71 75 65 72 79 20 70 61  and URI query pa
26160 72 61 6d 65 74 65 72 20 61 76 61 69 6c 61 62 6c  rameter availabl
26170 65 20 74 6f 20 74 75 72 6e 20 69 74 20 6f 66 66  e to turn it off
26180 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
26190 75 6e 69 78 44 65 76 69 63 65 43 68 61 72 61 63  unixDeviceCharac
261a0 74 65 72 69 73 74 69 63 73 28 73 71 6c 69 74 65  teristics(sqlite
261b0 33 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 75  3_file *id){.  u
261c0 6e 69 78 46 69 6c 65 20 2a 70 20 3d 20 28 75 6e  nixFile *p = (un
261d0 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e  ixFile*)id;.  in
261e0 74 20 72 63 20 3d 20 30 3b 0a 23 69 66 64 65 66  t rc = 0;.#ifdef
261f0 20 5f 5f 51 4e 58 4e 54 4f 5f 5f 0a 20 20 69 66   __QNXNTO__.  if
26200 28 20 70 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3d  ( p->sectorSize=
26210 3d 30 20 29 20 75 6e 69 78 53 65 63 74 6f 72 53  =0 ) unixSectorS
26220 69 7a 65 28 69 64 29 3b 0a 20 20 72 63 20 3d 20  ize(id);.  rc = 
26230 70 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63 74  p->deviceCharact
26240 65 72 69 73 74 69 63 73 3b 0a 23 65 6e 64 69 66  eristics;.#endif
26250 0a 20 20 69 66 28 20 70 2d 3e 63 74 72 6c 46 6c  .  if( p->ctrlFl
26260 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 50  ags & UNIXFILE_P
26270 53 4f 57 20 29 7b 0a 20 20 20 20 72 63 20 7c 3d  SOW ){.    rc |=
26280 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f   SQLITE_IOCAP_PO
26290 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54  WERSAFE_OVERWRIT
262a0 45 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  E;.  }.  return 
262b0 72 63 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69  rc;.}..#if !defi
262c0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
262d0 57 41 4c 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4d  WAL) || SQLITE_M
262e0 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 0a  AX_MMAP_SIZE>0..
262f0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
26300 20 73 79 73 74 65 6d 20 70 61 67 65 20 73 69 7a   system page siz
26310 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  e..**.** This fu
26320 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 6e 6f  nction should no
26330 74 20 62 65 20 63 61 6c 6c 65 64 20 64 69 72 65  t be called dire
26340 63 74 6c 79 20 62 79 20 6f 74 68 65 72 20 63 6f  ctly by other co
26350 64 65 20 69 6e 20 74 68 69 73 20 66 69 6c 65 2e  de in this file.
26360 20 0a 2a 2a 20 49 6e 73 74 65 61 64 2c 20 69 74   .** Instead, it
26370 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65   should be calle
26380 64 20 76 69 61 20 6d 61 63 72 6f 20 6f 73 47 65  d via macro osGe
26390 74 70 61 67 65 73 69 7a 65 28 29 2e 0a 2a 2f 0a  tpagesize()..*/.
263a0 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 47  static int unixG
263b0 65 74 70 61 67 65 73 69 7a 65 28 76 6f 69 64 29  etpagesize(void)
263c0 7b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53  {.#if OS_VXWORKS
263d0 0a 20 20 72 65 74 75 72 6e 20 31 30 32 34 3b 0a  .  return 1024;.
263e0 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 5f 42  #elif defined(_B
263f0 53 44 5f 53 4f 55 52 43 45 29 0a 20 20 72 65 74  SD_SOURCE).  ret
26400 75 72 6e 20 67 65 74 70 61 67 65 73 69 7a 65 28  urn getpagesize(
26410 29 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74 75 72  );.#else.  retur
26420 6e 20 28 69 6e 74 29 73 79 73 63 6f 6e 66 28 5f  n (int)sysconf(_
26430 53 43 5f 50 41 47 45 53 49 5a 45 29 3b 0a 23 65  SC_PAGESIZE);.#e
26440 6e 64 69 66 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f  ndif.}..#endif /
26450 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
26460 45 5f 4f 4d 49 54 5f 57 41 4c 29 20 7c 7c 20 53  E_OMIT_WAL) || S
26470 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
26480 49 5a 45 3e 30 20 2a 2f 0a 0a 23 69 66 6e 64 65  IZE>0 */..#ifnde
26490 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
264a0 4c 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a 65 63 74 20  L../*.** Object 
264b0 75 73 65 64 20 74 6f 20 72 65 70 72 65 73 65 6e  used to represen
264c0 74 20 61 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f  t an shared memo
264d0 72 79 20 62 75 66 66 65 72 2e 20 20 0a 2a 2a 0a  ry buffer.  .**.
264e0 2a 2a 20 57 68 65 6e 20 6d 75 6c 74 69 70 6c 65  ** When multiple
264f0 20 74 68 72 65 61 64 73 20 61 6c 6c 20 72 65 66   threads all ref
26500 65 72 65 6e 63 65 20 74 68 65 20 73 61 6d 65 20  erence the same 
26510 77 61 6c 2d 69 6e 64 65 78 2c 20 65 61 63 68 20  wal-index, each 
26520 74 68 72 65 61 64 0a 2a 2a 20 68 61 73 20 69 74  thread.** has it
26530 73 20 6f 77 6e 20 75 6e 69 78 53 68 6d 20 6f 62  s own unixShm ob
26540 6a 65 63 74 2c 20 62 75 74 20 74 68 65 79 20 61  ject, but they a
26550 6c 6c 20 70 6f 69 6e 74 20 74 6f 20 61 20 73 69  ll point to a si
26560 6e 67 6c 65 20 69 6e 73 74 61 6e 63 65 0a 2a 2a  ngle instance.**
26570 20 6f 66 20 74 68 69 73 20 75 6e 69 78 53 68 6d   of this unixShm
26580 4e 6f 64 65 20 6f 62 6a 65 63 74 2e 20 20 49 6e  Node object.  In
26590 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 65 61   other words, ea
265a0 63 68 20 77 61 6c 2d 69 6e 64 65 78 20 69 73 20  ch wal-index is 
265b0 6f 70 65 6e 65 64 0a 2a 2a 20 6f 6e 6c 79 20 6f  opened.** only o
265c0 6e 63 65 20 70 65 72 20 70 72 6f 63 65 73 73 2e  nce per process.
265d0 0a 2a 2a 0a 2a 2a 20 45 61 63 68 20 75 6e 69 78  .**.** Each unix
265e0 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 69  ShmNode object i
265f0 73 20 63 6f 6e 6e 65 63 74 65 64 20 74 6f 20 61  s connected to a
26600 20 73 69 6e 67 6c 65 20 75 6e 69 78 49 6e 6f 64   single unixInod
26610 65 49 6e 66 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2a  eInfo object..**
26620 20 57 65 20 63 6f 75 6c 64 20 63 6f 61 6c 65 73   We could coales
26630 63 65 20 74 68 69 73 20 6f 62 6a 65 63 74 20 69  ce this object i
26640 6e 74 6f 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  nto unixInodeInf
26650 6f 2c 20 62 75 74 20 74 68 61 74 20 77 6f 75 6c  o, but that woul
26660 64 20 6d 65 61 6e 0a 2a 2a 20 65 76 65 72 79 20  d mean.** every 
26670 6f 70 65 6e 20 66 69 6c 65 20 74 68 61 74 20 64  open file that d
26680 6f 65 73 20 6e 6f 74 20 75 73 65 20 73 68 61 72  oes not use shar
26690 65 64 20 6d 65 6d 6f 72 79 20 28 69 6e 20 6f 74  ed memory (in ot
266a0 68 65 72 20 77 6f 72 64 73 2c 20 6d 6f 73 74 0a  her words, most.
266b0 2a 2a 20 6f 70 65 6e 20 66 69 6c 65 73 29 20 77  ** open files) w
266c0 6f 75 6c 64 20 68 61 76 65 20 74 6f 20 63 61 72  ould have to car
266d0 72 79 20 61 72 6f 75 6e 64 20 74 68 69 73 20 65  ry around this e
266e0 78 74 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  xtra information
266f0 2e 20 20 53 6f 0a 2a 2a 20 74 68 65 20 75 6e 69  .  So.** the uni
26700 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63  xInodeInfo objec
26710 74 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69  t contains a poi
26720 6e 74 65 72 20 74 6f 20 74 68 69 73 20 75 6e 69  nter to this uni
26730 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 0a  xShmNode object.
26740 2a 2a 20 61 6e 64 20 74 68 65 20 75 6e 69 78 53  ** and the unixS
26750 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 69 73  hmNode object is
26760 20 63 72 65 61 74 65 64 20 6f 6e 6c 79 20 77 68   created only wh
26770 65 6e 20 6e 65 65 64 65 64 2e 0a 2a 2a 0a 2a 2a  en needed..**.**
26780 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29   unixMutexHeld()
26790 20 6d 75 73 74 20 62 65 20 74 72 75 65 20 77 68   must be true wh
267a0 65 6e 20 63 72 65 61 74 69 6e 67 20 6f 72 20 64  en creating or d
267b0 65 73 74 72 6f 79 69 6e 67 0a 2a 2a 20 74 68 69  estroying.** thi
267c0 73 20 6f 62 6a 65 63 74 20 6f 72 20 77 68 69 6c  s object or whil
267d0 65 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69  e reading or wri
267e0 74 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ting the followi
267f0 6e 67 20 66 69 65 6c 64 73 3a 0a 2a 2a 0a 2a 2a  ng fields:.**.**
26800 20 20 20 20 20 20 6e 52 65 66 0a 2a 2a 0a 2a 2a        nRef.**.**
26810 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66   The following f
26820 69 65 6c 64 73 20 61 72 65 20 72 65 61 64 2d 6f  ields are read-o
26830 6e 6c 79 20 61 66 74 65 72 20 74 68 65 20 6f 62  nly after the ob
26840 6a 65 63 74 20 69 73 20 63 72 65 61 74 65 64 3a  ject is created:
26850 0a 2a 2a 20 0a 2a 2a 20 20 20 20 20 20 66 69 64  .** .**      fid
26860 0a 2a 2a 20 20 20 20 20 20 7a 46 69 6c 65 6e 61  .**      zFilena
26870 6d 65 0a 2a 2a 0a 2a 2a 20 45 69 74 68 65 72 20  me.**.** Either 
26880 75 6e 69 78 53 68 6d 4e 6f 64 65 2e 6d 75 74 65  unixShmNode.mute
26890 78 20 6d 75 73 74 20 62 65 20 68 65 6c 64 20 6f  x must be held o
268a0 72 20 75 6e 69 78 53 68 6d 4e 6f 64 65 2e 6e 52  r unixShmNode.nR
268b0 65 66 3d 3d 30 20 61 6e 64 0a 2a 2a 20 75 6e 69  ef==0 and.** uni
268c0 78 4d 75 74 65 78 48 65 6c 64 28 29 20 69 73 20  xMutexHeld() is 
268d0 74 72 75 65 20 77 68 65 6e 20 72 65 61 64 69 6e  true when readin
268e0 67 20 6f 72 20 77 72 69 74 69 6e 67 20 61 6e 79  g or writing any
268f0 20 6f 74 68 65 72 20 66 69 65 6c 64 0a 2a 2a 20   other field.** 
26900 69 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72  in this structur
26910 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 75 6e 69  e..*/.struct uni
26920 78 53 68 6d 4e 6f 64 65 20 7b 0a 20 20 75 6e 69  xShmNode {.  uni
26930 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f  xInodeInfo *pIno
26940 64 65 3b 20 20 20 20 20 2f 2a 20 75 6e 69 78 49  de;     /* unixI
26950 6e 6f 64 65 49 6e 66 6f 20 74 68 61 74 20 6f 77  nodeInfo that ow
26960 6e 73 20 74 68 69 73 20 53 48 4d 20 6e 6f 64 65  ns this SHM node
26970 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75   */.  sqlite3_mu
26980 74 65 78 20 2a 6d 75 74 65 78 3b 20 20 20 20 20  tex *mutex;     
26990 20 2f 2a 20 4d 75 74 65 78 20 74 6f 20 61 63 63   /* Mutex to acc
269a0 65 73 73 20 74 68 69 73 20 6f 62 6a 65 63 74 20  ess this object 
269b0 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65  */.  char *zFile
269c0 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  name;           
269d0 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6d  /* Name of the m
269e0 6d 61 70 70 65 64 20 66 69 6c 65 20 2a 2f 0a 20  mapped file */. 
269f0 20 69 6e 74 20 68 3b 20 20 20 20 20 20 20 20 20   int h;         
26a00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
26a10 70 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70  pen file descrip
26a20 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 52  tor */.  int szR
26a30 65 67 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20  egion;          
26a40 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73      /* Size of s
26a50 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67  hared-memory reg
26a60 69 6f 6e 73 20 2a 2f 0a 20 20 75 31 36 20 6e 52  ions */.  u16 nR
26a70 65 67 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20  egion;          
26a80 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
26a90 61 72 72 61 79 20 61 70 52 65 67 69 6f 6e 20 2a  array apRegion *
26aa0 2f 0a 20 20 75 38 20 69 73 52 65 61 64 6f 6e 6c  /.  u8 isReadonl
26ab0 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  y;             /
26ac0 2a 20 54 72 75 65 20 69 66 20 72 65 61 64 2d 6f  * True if read-o
26ad0 6e 6c 79 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  nly */.  char **
26ae0 61 70 52 65 67 69 6f 6e 3b 20 20 20 20 20 20 20  apRegion;       
26af0 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
26b00 6d 61 70 70 65 64 20 73 68 61 72 65 64 2d 6d 65  mapped shared-me
26b10 6d 6f 72 79 20 72 65 67 69 6f 6e 73 20 2a 2f 0a  mory regions */.
26b20 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20    int nRef;     
26b30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26b40 4e 75 6d 62 65 72 20 6f 66 20 75 6e 69 78 53 68  Number of unixSh
26b50 6d 20 6f 62 6a 65 63 74 73 20 70 6f 69 6e 74 69  m objects pointi
26b60 6e 67 20 74 6f 20 74 68 69 73 20 2a 2f 0a 20 20  ng to this */.  
26b70 75 6e 69 78 53 68 6d 20 2a 70 46 69 72 73 74 3b  unixShm *pFirst;
26b80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c             /* Al
26b90 6c 20 75 6e 69 78 53 68 6d 20 6f 62 6a 65 63 74  l unixShm object
26ba0 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  s pointing to th
26bb0 69 73 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  is */.#ifdef SQL
26bc0 49 54 45 5f 44 45 42 55 47 0a 20 20 75 38 20 65  ITE_DEBUG.  u8 e
26bd0 78 63 6c 4d 61 73 6b 3b 20 20 20 20 20 20 20 20  xclMask;        
26be0 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
26bf0 66 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  f exclusive lock
26c00 73 20 68 65 6c 64 20 2a 2f 0a 20 20 75 38 20 73  s held */.  u8 s
26c10 68 61 72 65 64 4d 61 73 6b 3b 20 20 20 20 20 20  haredMask;      
26c20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
26c30 66 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 68  f shared locks h
26c40 65 6c 64 20 2a 2f 0a 20 20 75 38 20 6e 65 78 74  eld */.  u8 next
26c50 53 68 6d 49 64 3b 20 20 20 20 20 20 20 20 20 20  ShmId;          
26c60 20 20 20 20 2f 2a 20 4e 65 78 74 20 61 76 61 69      /* Next avai
26c70 6c 61 62 6c 65 20 75 6e 69 78 53 68 6d 2e 69 64  lable unixShm.id
26c80 20 76 61 6c 75 65 20 2a 2f 0a 23 65 6e 64 69 66   value */.#endif
26c90 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 53 74 72 75 63  .};../*.** Struc
26ca0 74 75 72 65 20 75 73 65 64 20 69 6e 74 65 72 6e  ture used intern
26cb0 61 6c 6c 79 20 62 79 20 74 68 69 73 20 56 46 53  ally by this VFS
26cc0 20 74 6f 20 72 65 63 6f 72 64 20 74 68 65 20 73   to record the s
26cd0 74 61 74 65 20 6f 66 20 61 6e 0a 2a 2a 20 6f 70  tate of an.** op
26ce0 65 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  en shared memory
26cf0 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a   connection..**.
26d00 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
26d10 20 66 69 65 6c 64 73 20 61 72 65 20 69 6e 69 74   fields are init
26d20 69 61 6c 69 7a 65 64 20 77 68 65 6e 20 74 68 69  ialized when thi
26d30 73 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61  s object is crea
26d40 74 65 64 20 61 6e 64 0a 2a 2a 20 61 72 65 20 72  ted and.** are r
26d50 65 61 64 2d 6f 6e 6c 79 20 74 68 65 72 65 61 66  ead-only thereaf
26d60 74 65 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 75 6e  ter:.**.**    un
26d70 69 78 53 68 6d 2e 70 46 69 6c 65 0a 2a 2a 20 20  ixShm.pFile.**  
26d80 20 20 75 6e 69 78 53 68 6d 2e 69 64 0a 2a 2a 0a    unixShm.id.**.
26d90 2a 2a 20 41 6c 6c 20 6f 74 68 65 72 20 66 69 65  ** All other fie
26da0 6c 64 73 20 61 72 65 20 72 65 61 64 2f 77 72 69  lds are read/wri
26db0 74 65 2e 20 20 54 68 65 20 75 6e 69 78 53 68 6d  te.  The unixShm
26dc0 2e 70 46 69 6c 65 2d 3e 6d 75 74 65 78 20 6d 75  .pFile->mutex mu
26dd0 73 74 20 62 65 20 68 65 6c 64 0a 2a 2a 20 77 68  st be held.** wh
26de0 69 6c 65 20 61 63 63 65 73 73 69 6e 67 20 61 6e  ile accessing an
26df0 79 20 72 65 61 64 2f 77 72 69 74 65 20 66 69 65  y read/write fie
26e00 6c 64 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 75  lds..*/.struct u
26e10 6e 69 78 53 68 6d 20 7b 0a 20 20 75 6e 69 78 53  nixShm {.  unixS
26e20 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65  hmNode *pShmNode
26e30 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 64  ;     /* The und
26e40 65 72 6c 79 69 6e 67 20 75 6e 69 78 53 68 6d 4e  erlying unixShmN
26e50 6f 64 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  ode object */.  
26e60 75 6e 69 78 53 68 6d 20 2a 70 4e 65 78 74 3b 20  unixShm *pNext; 
26e70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
26e80 78 74 20 75 6e 69 78 53 68 6d 20 77 69 74 68 20  xt unixShm with 
26e90 74 68 65 20 73 61 6d 65 20 75 6e 69 78 53 68 6d  the same unixShm
26ea0 4e 6f 64 65 20 2a 2f 0a 20 20 75 38 20 68 61 73  Node */.  u8 has
26eb0 4d 75 74 65 78 3b 20 20 20 20 20 20 20 20 20 20  Mutex;          
26ec0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
26ed0 68 6f 6c 64 69 6e 67 20 74 68 65 20 75 6e 69 78  holding the unix
26ee0 53 68 6d 4e 6f 64 65 20 6d 75 74 65 78 20 2a 2f  ShmNode mutex */
26ef0 0a 20 20 75 38 20 69 64 3b 20 20 20 20 20 20 20  .  u8 id;       
26f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26f10 20 49 64 20 6f 66 20 74 68 69 73 20 63 6f 6e 6e   Id of this conn
26f20 65 63 74 69 6f 6e 20 77 69 74 68 69 6e 20 69 74  ection within it
26f30 73 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 2f  s unixShmNode */
26f40 0a 20 20 75 31 36 20 73 68 61 72 65 64 4d 61 73  .  u16 sharedMas
26f50 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  k;            /*
26f60 20 4d 61 73 6b 20 6f 66 20 73 68 61 72 65 64 20   Mask of shared 
26f70 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20  locks held */.  
26f80 75 31 36 20 65 78 63 6c 4d 61 73 6b 3b 20 20 20  u16 exclMask;   
26f90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
26fa0 73 6b 20 6f 66 20 65 78 63 6c 75 73 69 76 65 20  sk of exclusive 
26fb0 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 7d 3b  locks held */.};
26fc0 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 61 6e 74  ../*.** Constant
26fd0 73 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69  s used for locki
26fe0 6e 67 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e  ng.*/.#define UN
26ff0 49 58 5f 53 48 4d 5f 42 41 53 45 20 20 20 28 28  IX_SHM_BASE   ((
27000 32 32 2b 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c  22+SQLITE_SHM_NL
27010 4f 43 4b 29 2a 34 29 20 20 20 20 20 20 20 20 20  OCK)*4)         
27020 2f 2a 20 66 69 72 73 74 20 6c 6f 63 6b 20 62 79  /* first lock by
27030 74 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e  te */.#define UN
27040 49 58 5f 53 48 4d 5f 44 4d 53 20 20 20 20 28 55  IX_SHM_DMS    (U
27050 4e 49 58 5f 53 48 4d 5f 42 41 53 45 2b 53 51 4c  NIX_SHM_BASE+SQL
27060 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 29 20 20  ITE_SHM_NLOCK)  
27070 2f 2a 20 64 65 61 64 6d 61 6e 20 73 77 69 74 63  /* deadman switc
27080 68 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 6c  h */../*.** Appl
27090 79 20 70 6f 73 69 78 20 61 64 76 69 73 6f 72 79  y posix advisory
270a0 20 6c 6f 63 6b 73 20 66 6f 72 20 61 6c 6c 20 62   locks for all b
270b0 79 74 65 73 20 66 72 6f 6d 20 6f 66 73 74 20 74  ytes from ofst t
270c0 68 72 6f 75 67 68 20 6f 66 73 74 2b 6e 2d 31 2e  hrough ofst+n-1.
270d0 0a 2a 2a 0a 2a 2a 20 4c 6f 63 6b 73 20 62 6c 6f  .**.** Locks blo
270e0 63 6b 20 69 66 20 74 68 65 20 6d 61 73 6b 20 69  ck if the mask i
270f0 73 20 65 78 61 63 74 6c 79 20 55 4e 49 58 5f 53  s exactly UNIX_S
27100 48 4d 5f 43 20 61 6e 64 20 61 72 65 20 6e 6f 6e  HM_C and are non
27110 2d 62 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 6f 74 68  -blocking.** oth
27120 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  erwise..*/.stati
27130 63 20 69 6e 74 20 75 6e 69 78 53 68 6d 53 79 73  c int unixShmSys
27140 74 65 6d 4c 6f 63 6b 28 0a 20 20 75 6e 69 78 46  temLock(.  unixF
27150 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 20 20 20  ile *pFile,     
27160 20 20 2f 2a 20 4f 70 65 6e 20 63 6f 6e 6e 65 63    /* Open connec
27170 74 69 6f 6e 20 74 6f 20 74 68 65 20 57 41 4c 20  tion to the WAL 
27180 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6c 6f  file */.  int lo
27190 63 6b 54 79 70 65 2c 20 20 20 20 20 20 20 20 20  ckType,         
271a0 20 2f 2a 20 46 5f 55 4e 4c 43 4b 2c 20 46 5f 52   /* F_UNLCK, F_R
271b0 44 4c 43 4b 2c 20 6f 72 20 46 5f 57 52 4c 43 4b  DLCK, or F_WRLCK
271c0 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 73 74 2c 20   */.  int ofst, 
271d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
271e0 46 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68  First byte of th
271f0 65 20 6c 6f 63 6b 69 6e 67 20 72 61 6e 67 65 20  e locking range 
27200 2a 2f 0a 20 20 69 6e 74 20 6e 20 20 20 20 20 20  */.  int n      
27210 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
27220 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74  umber of bytes t
27230 6f 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 75  o lock */.){.  u
27240 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d  nixShmNode *pShm
27250 4e 6f 64 65 3b 20 2f 2a 20 41 70 70 6c 79 20 6c  Node; /* Apply l
27260 6f 63 6b 73 20 74 6f 20 74 68 69 73 20 6f 70 65  ocks to this ope
27270 6e 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  n shared-memory 
27280 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 73 74 72  segment */.  str
27290 75 63 74 20 66 6c 6f 63 6b 20 66 3b 20 20 20 20  uct flock f;    
272a0 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 73 69 78      /* The posix
272b0 20 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 69 6e   advisory lockin
272c0 67 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  g structure */. 
272d0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
272e0 5f 4f 4b 3b 20 20 20 20 2f 2a 20 52 65 73 75 6c  _OK;    /* Resul
272f0 74 20 63 6f 64 65 20 66 6f 72 6d 20 66 63 6e 74  t code form fcnt
27300 6c 28 29 20 2a 2f 0a 0a 20 20 2f 2a 20 41 63 63  l() */..  /* Acc
27310 65 73 73 20 74 6f 20 74 68 65 20 75 6e 69 78 53  ess to the unixS
27320 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 69 73  hmNode object is
27330 20 73 65 72 69 61 6c 69 7a 65 64 20 62 79 20 74   serialized by t
27340 68 65 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 70  he caller */.  p
27350 53 68 6d 4e 6f 64 65 20 3d 20 70 46 69 6c 65 2d  ShmNode = pFile-
27360 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64  >pInode->pShmNod
27370 65 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  e;.  assert( sql
27380 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
27390 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29  pShmNode->mutex)
273a0 20 7c 7c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52   || pShmNode->nR
273b0 65 66 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 53  ef==0 );..  /* S
273c0 68 61 72 65 64 20 6c 6f 63 6b 73 20 6e 65 76 65  hared locks neve
273d0 72 20 73 70 61 6e 20 6d 6f 72 65 20 74 68 61 6e  r span more than
273e0 20 6f 6e 65 20 62 79 74 65 20 2a 2f 0a 20 20 61   one byte */.  a
273f0 73 73 65 72 74 28 20 6e 3d 3d 31 20 7c 7c 20 6c  ssert( n==1 || l
27400 6f 63 6b 54 79 70 65 21 3d 46 5f 52 44 4c 43 4b  ockType!=F_RDLCK
27410 20 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 6b 73 20   );..  /* Locks 
27420 61 72 65 20 77 69 74 68 69 6e 20 72 61 6e 67 65  are within range
27430 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6e 3e   */.  assert( n>
27440 3d 31 20 26 26 20 6e 3c 53 51 4c 49 54 45 5f 53  =1 && n<SQLITE_S
27450 48 4d 5f 4e 4c 4f 43 4b 20 29 3b 0a 0a 20 20 69  HM_NLOCK );..  i
27460 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d  f( pShmNode->h>=
27470 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6c 6b 54  0 ){.    int lkT
27480 79 70 65 3b 0a 20 20 20 20 2f 2a 20 49 6e 69 74  ype;.    /* Init
27490 69 61 6c 69 7a 65 20 74 68 65 20 6c 6f 63 6b 69  ialize the locki
274a0 6e 67 20 70 61 72 61 6d 65 74 65 72 73 20 2a 2f  ng parameters */
274b0 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 66 2c 20  .    memset(&f, 
274c0 30 2c 20 73 69 7a 65 6f 66 28 66 29 29 3b 0a 20  0, sizeof(f));. 
274d0 20 20 20 66 2e 6c 5f 74 79 70 65 20 3d 20 6c 6f     f.l_type = lo
274e0 63 6b 54 79 70 65 3b 0a 20 20 20 20 66 2e 6c 5f  ckType;.    f.l_
274f0 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45  whence = SEEK_SE
27500 54 3b 0a 20 20 20 20 66 2e 6c 5f 73 74 61 72 74  T;.    f.l_start
27510 20 3d 20 6f 66 73 74 3b 0a 20 20 20 20 66 2e 6c   = ofst;.    f.l
27520 5f 6c 65 6e 20 3d 20 6e 3b 0a 0a 20 20 20 20 6c  _len = n;..    l
27530 6b 54 79 70 65 20 3d 20 28 70 46 69 6c 65 2d 3e  kType = (pFile->
27540 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58  ctrlFlags & UNIX
27550 46 49 4c 45 5f 42 4c 4f 43 4b 29 21 3d 30 20 3f  FILE_BLOCK)!=0 ?
27560 20 46 5f 53 45 54 4c 4b 57 20 3a 20 46 5f 53 45   F_SETLKW : F_SE
27570 54 4c 4b 3b 0a 20 20 20 20 72 63 20 3d 20 6f 73  TLK;.    rc = os
27580 46 63 6e 74 6c 28 70 53 68 6d 4e 6f 64 65 2d 3e  Fcntl(pShmNode->
27590 68 2c 20 6c 6b 54 79 70 65 2c 20 26 66 29 3b 0a  h, lkType, &f);.
275a0 20 20 20 20 72 63 20 3d 20 28 72 63 21 3d 28 2d      rc = (rc!=(-
275b0 31 29 29 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20  1)) ? SQLITE_OK 
275c0 3a 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  : SQLITE_BUSY;. 
275d0 20 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c     pFile->ctrlFl
275e0 61 67 73 20 26 3d 20 7e 55 4e 49 58 46 49 4c 45  ags &= ~UNIXFILE
275f0 5f 42 4c 4f 43 4b 3b 0a 20 20 7d 0a 0a 20 20 2f  _BLOCK;.  }..  /
27600 2a 20 55 70 64 61 74 65 20 74 68 65 20 67 6c 6f  * Update the glo
27610 62 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 20 61  bal lock state a
27620 6e 64 20 64 6f 20 64 65 62 75 67 20 74 72 61 63  nd do debug trac
27630 69 6e 67 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ing */.#ifdef SQ
27640 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 7b 20 75  LITE_DEBUG.  { u
27650 31 36 20 6d 61 73 6b 3b 0a 20 20 4f 53 54 52 41  16 mask;.  OSTRA
27660 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b 20 22 29  CE(("SHM-LOCK ")
27670 29 3b 0a 20 20 6d 61 73 6b 20 3d 20 6f 66 73 74  );.  mask = ofst
27680 3e 33 31 20 3f 20 30 78 66 66 66 66 20 3a 20 28  >31 ? 0xffff : (
27690 31 3c 3c 28 6f 66 73 74 2b 6e 29 29 20 2d 20 28  1<<(ofst+n)) - (
276a0 31 3c 3c 6f 66 73 74 29 3b 0a 20 20 69 66 28 20  1<<ofst);.  if( 
276b0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
276c0 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 54 79 70  .    if( lockTyp
276d0 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20  e==F_UNLCK ){.  
276e0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 75 6e      OSTRACE(("un
276f0 6c 6f 63 6b 20 25 64 20 6f 6b 22 2c 20 6f 66 73  lock %d ok", ofs
27700 74 29 29 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e  t));.      pShmN
27710 6f 64 65 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 3d  ode->exclMask &=
27720 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70 53   ~mask;.      pS
27730 68 6d 4e 6f 64 65 2d 3e 73 68 61 72 65 64 4d 61  hmNode->sharedMa
27740 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20  sk &= ~mask;.   
27750 20 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b 54   }else if( lockT
27760 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a  ype==F_RDLCK ){.
27770 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
27780 72 65 61 64 2d 6c 6f 63 6b 20 25 64 20 6f 6b 22  read-lock %d ok"
27790 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20 20 20 20  , ofst));.      
277a0 70 53 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61  pShmNode->exclMa
277b0 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20  sk &= ~mask;.   
277c0 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 68 61     pShmNode->sha
277d0 72 65 64 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b  redMask |= mask;
277e0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
277f0 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 54 79    assert( lockTy
27800 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 3b 0a 20  pe==F_WRLCK );. 
27810 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 77       OSTRACE(("w
27820 72 69 74 65 2d 6c 6f 63 6b 20 25 64 20 6f 6b 22  rite-lock %d ok"
27830 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20 20 20 20  , ofst));.      
27840 70 53 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61  pShmNode->exclMa
27850 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20  sk |= mask;.    
27860 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 68 61 72    pShmNode->shar
27870 65 64 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b  edMask &= ~mask;
27880 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
27890 20 20 20 20 69 66 28 20 6c 6f 63 6b 54 79 70 65      if( lockType
278a0 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20  ==F_UNLCK ){.   
278b0 20 20 20 4f 53 54 52 41 43 45 28 28 22 75 6e 6c     OSTRACE(("unl
278c0 6f 63 6b 20 25 64 20 66 61 69 6c 65 64 22 2c 20  ock %d failed", 
278d0 6f 66 73 74 29 29 3b 0a 20 20 20 20 7d 65 6c 73  ofst));.    }els
278e0 65 20 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d  e if( lockType==
278f0 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20 20  F_RDLCK ){.     
27900 20 4f 53 54 52 41 43 45 28 28 22 72 65 61 64 2d   OSTRACE(("read-
27910 6c 6f 63 6b 20 66 61 69 6c 65 64 22 29 29 3b 0a  lock failed"));.
27920 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
27930 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 54 79 70   assert( lockTyp
27940 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 3b 0a 20 20  e==F_WRLCK );.  
27950 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 77 72      OSTRACE(("wr
27960 69 74 65 2d 6c 6f 63 6b 20 25 64 20 66 61 69 6c  ite-lock %d fail
27970 65 64 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20  ed", ofst));.   
27980 20 7d 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45   }.  }.  OSTRACE
27990 28 28 22 20 2d 20 61 66 74 65 72 77 61 72 64 73  ((" - afterwards
279a0 20 25 30 33 78 2c 25 30 33 78 5c 6e 22 2c 0a 20   %03x,%03x\n",. 
279b0 20 20 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f            pShmNo
279c0 64 65 2d 3e 73 68 61 72 65 64 4d 61 73 6b 2c 20  de->sharedMask, 
279d0 70 53 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61  pShmNode->exclMa
279e0 73 6b 29 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  sk));.  }.#endif
279f0 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 20 20  ..  return rc;  
27a00 20 20 20 20 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20        .}../*.** 
27a10 52 65 74 75 72 6e 20 74 68 65 20 6d 69 6e 69 6d  Return the minim
27a20 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 33 32 4b  um number of 32K
27a30 42 20 73 68 6d 20 72 65 67 69 6f 6e 73 20 74 68  B shm regions th
27a40 61 74 20 73 68 6f 75 6c 64 20 62 65 20 6d 61 70  at should be map
27a50 70 65 64 20 61 74 0a 2a 2a 20 61 20 74 69 6d 65  ped at.** a time
27a60 2c 20 61 73 73 75 6d 69 6e 67 20 74 68 61 74 20  , assuming that 
27a70 65 61 63 68 20 6d 61 70 70 69 6e 67 20 6d 75 73  each mapping mus
27a80 74 20 62 65 20 61 6e 20 69 6e 74 65 67 65 72 20  t be an integer 
27a90 6d 75 6c 74 69 70 6c 65 20 6f 66 20 74 68 65 0a  multiple of the.
27aa0 2a 2a 20 63 75 72 72 65 6e 74 20 73 79 73 74 65  ** current syste
27ab0 6d 20 70 61 67 65 2d 73 69 7a 65 2e 0a 2a 2a 0a  m page-size..**.
27ac0 2a 2a 20 55 73 75 61 6c 6c 79 2c 20 74 68 69 73  ** Usually, this
27ad0 20 69 73 20 31 2e 20 54 68 65 20 65 78 63 65 70   is 1. The excep
27ae0 74 69 6f 6e 20 73 65 65 6d 73 20 74 6f 20 62 65  tion seems to be
27af0 20 73 79 73 74 65 6d 73 20 74 68 61 74 20 61 72   systems that ar
27b00 65 20 63 6f 6e 66 69 67 75 72 65 64 0a 2a 2a 20  e configured.** 
27b10 74 6f 20 75 73 65 20 36 34 4b 42 20 70 61 67 65  to use 64KB page
27b20 73 20 2d 20 69 6e 20 74 68 69 73 20 63 61 73 65  s - in this case
27b30 20 65 61 63 68 20 6d 61 70 70 69 6e 67 20 6d 75   each mapping mu
27b40 73 74 20 63 6f 76 65 72 20 61 74 20 6c 65 61 73  st cover at leas
27b50 74 20 74 77 6f 0a 2a 2a 20 73 68 6d 20 72 65 67  t two.** shm reg
27b60 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ions..*/.static 
27b70 69 6e 74 20 75 6e 69 78 53 68 6d 52 65 67 69 6f  int unixShmRegio
27b80 6e 50 65 72 4d 61 70 28 76 6f 69 64 29 7b 0a 20  nPerMap(void){. 
27b90 20 69 6e 74 20 73 68 6d 73 7a 20 3d 20 33 32 2a   int shmsz = 32*
27ba0 31 30 32 34 3b 20 20 20 20 20 20 20 20 20 20 20  1024;           
27bb0 20 2f 2a 20 53 48 4d 20 72 65 67 69 6f 6e 20 73   /* SHM region s
27bc0 69 7a 65 20 2a 2f 0a 20 20 69 6e 74 20 70 67 73  ize */.  int pgs
27bd0 7a 20 3d 20 6f 73 47 65 74 70 61 67 65 73 69 7a  z = osGetpagesiz
27be0 65 28 29 3b 20 20 20 2f 2a 20 53 79 73 74 65 6d  e();   /* System
27bf0 20 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a 20 20   page size */.  
27c00 61 73 73 65 72 74 28 20 28 28 70 67 73 7a 2d 31  assert( ((pgsz-1
27c10 29 26 70 67 73 7a 29 3d 3d 30 20 29 3b 20 20 20  )&pgsz)==0 );   
27c20 2f 2a 20 50 61 67 65 20 73 69 7a 65 20 6d 75 73  /* Page size mus
27c30 74 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20  t be a power of 
27c40 32 20 2a 2f 0a 20 20 69 66 28 20 70 67 73 7a 3c  2 */.  if( pgsz<
27c50 73 68 6d 73 7a 20 29 20 72 65 74 75 72 6e 20 31  shmsz ) return 1
27c60 3b 0a 20 20 72 65 74 75 72 6e 20 70 67 73 7a 2f  ;.  return pgsz/
27c70 73 68 6d 73 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  shmsz;.}../*.** 
27c80 50 75 72 67 65 20 74 68 65 20 75 6e 69 78 53 68  Purge the unixSh
27c90 6d 4e 6f 64 65 4c 69 73 74 20 6c 69 73 74 20 6f  mNodeList list o
27ca0 66 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 77 69  f all entries wi
27cb0 74 68 20 75 6e 69 78 53 68 6d 4e 6f 64 65 2e 6e  th unixShmNode.n
27cc0 52 65 66 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20 54 68  Ref==0..**.** Th
27cd0 69 73 20 69 73 20 6e 6f 74 20 61 20 56 46 53 20  is is not a VFS 
27ce0 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6d 65  shared-memory me
27cf0 74 68 6f 64 3b 20 69 74 20 69 73 20 61 20 75 74  thod; it is a ut
27d00 69 6c 69 74 79 20 66 75 6e 63 74 69 6f 6e 20 63  ility function c
27d10 61 6c 6c 65 64 0a 2a 2a 20 62 79 20 56 46 53 20  alled.** by VFS 
27d20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6d 65  shared-memory me
27d30 74 68 6f 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  thods..*/.static
27d40 20 76 6f 69 64 20 75 6e 69 78 53 68 6d 50 75 72   void unixShmPur
27d50 67 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 64  ge(unixFile *pFd
27d60 29 7b 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65  ){.  unixShmNode
27d70 20 2a 70 20 3d 20 70 46 64 2d 3e 70 49 6e 6f 64   *p = pFd->pInod
27d80 65 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 61  e->pShmNode;.  a
27d90 73 73 65 72 74 28 20 75 6e 69 78 4d 75 74 65 78  ssert( unixMutex
27da0 48 65 6c 64 28 29 20 29 3b 0a 20 20 69 66 28 20  Held() );.  if( 
27db0 70 20 26 26 20 70 2d 3e 6e 52 65 66 3d 3d 30 20  p && p->nRef==0 
27dc0 29 7b 0a 20 20 20 20 69 6e 74 20 6e 53 68 6d 50  ){.    int nShmP
27dd0 65 72 4d 61 70 20 3d 20 75 6e 69 78 53 68 6d 52  erMap = unixShmR
27de0 65 67 69 6f 6e 50 65 72 4d 61 70 28 29 3b 0a 20  egionPerMap();. 
27df0 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 61 73     int i;.    as
27e00 73 65 72 74 28 20 70 2d 3e 70 49 6e 6f 64 65 3d  sert( p->pInode=
27e10 3d 70 46 64 2d 3e 70 49 6e 6f 64 65 20 29 3b 0a  =pFd->pInode );.
27e20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
27e30 78 5f 66 72 65 65 28 70 2d 3e 6d 75 74 65 78 29  x_free(p->mutex)
27e40 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
27e50 3c 70 2d 3e 6e 52 65 67 69 6f 6e 3b 20 69 2b 3d  <p->nRegion; i+=
27e60 6e 53 68 6d 50 65 72 4d 61 70 29 7b 0a 20 20 20  nShmPerMap){.   
27e70 20 20 20 69 66 28 20 70 2d 3e 68 3e 3d 30 20 29     if( p->h>=0 )
27e80 7b 0a 20 20 20 20 20 20 20 20 6f 73 4d 75 6e 6d  {.        osMunm
27e90 61 70 28 70 2d 3e 61 70 52 65 67 69 6f 6e 5b 69  ap(p->apRegion[i
27ea0 5d 2c 20 70 2d 3e 73 7a 52 65 67 69 6f 6e 29 3b  ], p->szRegion);
27eb0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
27ec0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
27ed0 65 65 28 70 2d 3e 61 70 52 65 67 69 6f 6e 5b 69  ee(p->apRegion[i
27ee0 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ]);.      }.    
27ef0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  }.    sqlite3_fr
27f00 65 65 28 70 2d 3e 61 70 52 65 67 69 6f 6e 29 3b  ee(p->apRegion);
27f10 0a 20 20 20 20 69 66 28 20 70 2d 3e 68 3e 3d 30  .    if( p->h>=0
27f20 20 29 7b 0a 20 20 20 20 20 20 72 6f 62 75 73 74   ){.      robust
27f30 5f 63 6c 6f 73 65 28 70 46 64 2c 20 70 2d 3e 68  _close(pFd, p->h
27f40 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20  , __LINE__);.   
27f50 20 20 20 70 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20     p->h = -1;.  
27f60 20 20 7d 0a 20 20 20 20 70 2d 3e 70 49 6e 6f 64    }.    p->pInod
27f70 65 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d 20 30 3b  e->pShmNode = 0;
27f80 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
27f90 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66  e(p);.  }.}..#if
27fa0 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
27fb0 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  __) && SQLITE_EN
27fc0 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
27fd0 4c 45 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  LE.static const 
27fe0 63 68 61 72 20 2a 70 72 6f 78 79 53 68 61 72 65  char *proxyShare
27ff0 64 4d 65 6d 6f 72 79 42 61 73 65 50 61 74 68 28  dMemoryBasePath(
28000 75 6e 69 78 46 69 6c 65 20 2a 29 3b 0a 23 65 6e  unixFile *);.#en
28010 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20  dif../*.** Open 
28020 61 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  a shared-memory 
28030 61 72 65 61 20 61 73 73 6f 63 69 61 74 65 64 20  area associated 
28040 77 69 74 68 20 6f 70 65 6e 20 64 61 74 61 62 61  with open databa
28050 73 65 20 66 69 6c 65 20 70 44 62 46 64 2e 20 20  se file pDbFd.  
28060 0a 2a 2a 20 54 68 69 73 20 70 61 72 74 69 63 75  .** This particu
28070 6c 61 72 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  lar implementati
28080 6f 6e 20 75 73 65 73 20 6d 6d 61 70 70 65 64 20  on uses mmapped 
28090 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  files..**.** The
280a0 20 66 69 6c 65 20 75 73 65 64 20 74 6f 20 69 6d   file used to im
280b0 70 6c 65 6d 65 6e 74 20 73 68 61 72 65 64 2d 6d  plement shared-m
280c0 65 6d 6f 72 79 20 69 73 20 69 6e 20 74 68 65 20  emory is in the 
280d0 73 61 6d 65 20 64 69 72 65 63 74 6f 72 79 0a 2a  same directory.*
280e0 2a 20 61 73 20 74 68 65 20 6f 70 65 6e 20 64 61  * as the open da
280f0 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20  tabase file and 
28100 68 61 73 20 74 68 65 20 73 61 6d 65 20 6e 61 6d  has the same nam
28110 65 20 61 73 20 74 68 65 20 6f 70 65 6e 20 64 61  e as the open da
28120 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 77  tabase.** file w
28130 69 74 68 20 74 68 65 20 22 2d 73 68 6d 22 20 73  ith the "-shm" s
28140 75 66 66 69 78 20 61 64 64 65 64 2e 20 20 46 6f  uffix added.  Fo
28150 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68  r example, if th
28160 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a  e database file.
28170 2a 2a 20 69 73 20 22 2f 68 6f 6d 65 2f 75 73 65  ** is "/home/use
28180 72 31 2f 63 6f 6e 66 69 67 2e 64 62 22 20 74 68  r1/config.db" th
28190 65 6e 20 74 68 65 20 66 69 6c 65 20 74 68 61 74  en the file that
281a0 20 69 73 20 63 72 65 61 74 65 64 20 61 6e 64 20   is created and 
281b0 6d 6d 61 70 70 65 64 0a 2a 2a 20 66 6f 72 20 73  mmapped.** for s
281c0 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 77 69 6c  hared memory wil
281d0 6c 20 62 65 20 63 61 6c 6c 65 64 20 22 2f 68 6f  l be called "/ho
281e0 6d 65 2f 75 73 65 72 31 2f 63 6f 6e 66 69 67 2e  me/user1/config.
281f0 64 62 2d 73 68 6d 22 2e 20 20 0a 2a 2a 0a 2a 2a  db-shm".  .**.**
28200 20 41 6e 6f 74 68 65 72 20 61 70 70 72 6f 61 63   Another approac
28210 68 20 74 6f 20 69 73 20 74 6f 20 75 73 65 20 66  h to is to use f
28220 69 6c 65 73 20 69 6e 20 2f 64 65 76 2f 73 68 6d  iles in /dev/shm
28230 20 6f 72 20 2f 64 65 76 2f 74 6d 70 20 6f 72 20   or /dev/tmp or 
28240 61 6e 0a 2a 2a 20 73 6f 6d 65 20 6f 74 68 65 72  an.** some other
28250 20 74 6d 70 66 73 20 6d 6f 75 6e 74 2e 20 42 75   tmpfs mount. Bu
28260 74 20 69 66 20 61 20 66 69 6c 65 20 69 6e 20 61  t if a file in a
28270 20 64 69 66 66 65 72 65 6e 74 20 64 69 72 65 63   different direc
28280 74 6f 72 79 0a 2a 2a 20 66 72 6f 6d 20 74 68 65  tory.** from the
28290 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
282a0 73 20 75 73 65 64 2c 20 74 68 65 6e 20 64 69 66  s used, then dif
282b0 66 65 72 69 6e 67 20 61 63 63 65 73 73 20 70 65  fering access pe
282c0 72 6d 69 73 73 69 6f 6e 73 0a 2a 2a 20 6f 72 20  rmissions.** or 
282d0 61 20 63 68 72 6f 6f 74 28 29 20 6d 69 67 68 74  a chroot() might
282e0 20 63 61 75 73 65 20 74 77 6f 20 64 69 66 66 65   cause two diffe
282f0 72 65 6e 74 20 70 72 6f 63 65 73 73 65 73 20 6f  rent processes o
28300 6e 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 64 61  n the same.** da
28310 74 61 62 61 73 65 20 74 6f 20 65 6e 64 20 75 70  tabase to end up
28320 20 75 73 69 6e 67 20 64 69 66 66 65 72 65 6e 74   using different
28330 20 66 69 6c 65 73 20 66 6f 72 20 73 68 61 72 65   files for share
28340 64 20 6d 65 6d 6f 72 79 20 2d 20 0a 2a 2a 20 6d  d memory - .** m
28350 65 61 6e 69 6e 67 20 74 68 61 74 20 74 68 65 69  eaning that thei
28360 72 20 6d 65 6d 6f 72 79 20 77 6f 75 6c 64 20 6e  r memory would n
28370 6f 74 20 72 65 61 6c 6c 79 20 62 65 20 73 68 61  ot really be sha
28380 72 65 64 20 2d 20 72 65 73 75 6c 74 69 6e 67 0a  red - resulting.
28390 2a 2a 20 69 6e 20 64 61 74 61 62 61 73 65 20 63  ** in database c
283a0 6f 72 72 75 70 74 69 6f 6e 2e 20 20 4e 65 76 65  orruption.  Neve
283b0 72 74 68 65 6c 65 73 73 2c 20 74 68 69 73 20 74  rtheless, this t
283c0 6d 70 66 73 20 66 69 6c 65 20 75 73 61 67 65 0a  mpfs file usage.
283d0 2a 2a 20 63 61 6e 20 62 65 20 65 6e 61 62 6c 65  ** can be enable
283e0 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  d at compile-tim
283f0 65 20 75 73 69 6e 67 20 2d 44 53 51 4c 49 54 45  e using -DSQLITE
28400 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 3d 22  _SHM_DIRECTORY="
28410 2f 64 65 76 2f 73 68 6d 22 0a 2a 2a 20 6f 72 20  /dev/shm".** or 
28420 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74 2e 20  the equivalent. 
28430 20 54 68 65 20 75 73 65 20 6f 66 20 74 68 65 20   The use of the 
28440 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43  SQLITE_SHM_DIREC
28450 54 4f 52 59 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  TORY compile-tim
28460 65 0a 2a 2a 20 6f 70 74 69 6f 6e 20 72 65 73 75  e.** option resu
28470 6c 74 73 20 69 6e 20 61 6e 20 69 6e 63 6f 6d 70  lts in an incomp
28480 61 74 69 62 6c 65 20 62 75 69 6c 64 20 6f 66 20  atible build of 
28490 53 51 4c 69 74 65 3b 20 20 62 75 69 6c 64 73 20  SQLite;  builds 
284a0 6f 66 20 53 51 4c 69 74 65 0a 2a 2a 20 74 68 61  of SQLite.** tha
284b0 74 20 77 69 74 68 20 64 69 66 66 65 72 69 6e 67  t with differing
284c0 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45   SQLITE_SHM_DIRE
284d0 43 54 4f 52 59 20 73 65 74 74 69 6e 67 73 20 61  CTORY settings a
284e0 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20 74 68  ttempt to use th
284f0 65 0a 2a 2a 20 73 61 6d 65 20 64 61 74 61 62 61  e.** same databa
28500 73 65 20 66 69 6c 65 20 61 74 20 74 68 65 20 73  se file at the s
28510 61 6d 65 20 74 69 6d 65 2c 20 64 61 74 61 62 61  ame time, databa
28520 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 77 69  se corruption wi
28530 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65 73  ll likely.** res
28540 75 6c 74 2e 20 54 68 65 20 53 51 4c 49 54 45 5f  ult. The SQLITE_
28550 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 20 63 6f  SHM_DIRECTORY co
28560 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f  mpile-time optio
28570 6e 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 0a  n is considered.
28580 2a 2a 20 22 75 6e 73 75 70 70 6f 72 74 65 64 22  ** "unsupported"
28590 20 61 6e 64 20 6d 61 79 20 67 6f 20 61 77 61 79   and may go away
285a0 20 69 6e 20 61 20 66 75 74 75 72 65 20 53 51 4c   in a future SQL
285b0 69 74 65 20 72 65 6c 65 61 73 65 2e 0a 2a 2a 0a  ite release..**.
285c0 2a 2a 20 57 68 65 6e 20 6f 70 65 6e 69 6e 67 20  ** When opening 
285d0 61 20 6e 65 77 20 73 68 61 72 65 64 2d 6d 65 6d  a new shared-mem
285e0 6f 72 79 20 66 69 6c 65 2c 20 69 66 20 6e 6f 20  ory file, if no 
285f0 6f 74 68 65 72 20 69 6e 73 74 61 6e 63 65 73 20  other instances 
28600 6f 66 20 74 68 61 74 0a 2a 2a 20 66 69 6c 65 20  of that.** file 
28610 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 6f 70  are currently op
28620 65 6e 2c 20 69 6e 20 74 68 69 73 20 70 72 6f 63  en, in this proc
28630 65 73 73 20 6f 72 20 69 6e 20 6f 74 68 65 72 20  ess or in other 
28640 70 72 6f 63 65 73 73 65 73 2c 20 74 68 65 6e 0a  processes, then.
28650 2a 2a 20 74 68 65 20 66 69 6c 65 20 6d 75 73 74  ** the file must
28660 20 62 65 20 74 72 75 6e 63 61 74 65 64 20 74 6f   be truncated to
28670 20 7a 65 72 6f 20 6c 65 6e 67 74 68 20 6f 72 20   zero length or 
28680 68 61 76 65 20 69 74 73 20 68 65 61 64 65 72 20  have its header 
28690 63 6c 65 61 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  cleared..**.** I
286a0 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  f the original d
286b0 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 70 44  atabase file (pD
286c0 62 46 64 29 20 69 73 20 75 73 69 6e 67 20 74 68  bFd) is using th
286d0 65 20 22 75 6e 69 78 2d 65 78 63 6c 22 20 56 46  e "unix-excl" VF
286e0 53 0a 2a 2a 20 74 68 61 74 20 6d 65 61 6e 73 20  S.** that means 
286f0 74 68 61 74 20 61 6e 20 65 78 63 6c 75 73 69 76  that an exclusiv
28700 65 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f  e lock is held o
28710 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
28720 69 6c 65 20 61 6e 64 0a 2a 2a 20 74 68 61 74 20  ile and.** that 
28730 6e 6f 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  no other process
28740 65 73 20 61 72 65 20 61 62 6c 65 20 74 6f 20 72  es are able to r
28750 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 68 65  ead or write the
28760 20 64 61 74 61 62 61 73 65 2e 20 20 49 6e 0a 2a   database.  In.*
28770 2a 20 74 68 61 74 20 63 61 73 65 2c 20 77 65 20  * that case, we 
28780 64 6f 20 6e 6f 74 20 72 65 61 6c 6c 79 20 6e 65  do not really ne
28790 65 64 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  ed shared memory
287a0 2e 20 20 4e 6f 20 73 68 61 72 65 64 20 6d 65 6d  .  No shared mem
287b0 6f 72 79 0a 2a 2a 20 66 69 6c 65 20 69 73 20 63  ory.** file is c
287c0 72 65 61 74 65 64 2e 20 20 54 68 65 20 73 68 61  reated.  The sha
287d0 72 65 64 20 6d 65 6d 6f 72 79 20 77 69 6c 6c 20  red memory will 
287e0 62 65 20 73 69 6d 75 6c 61 74 65 64 20 77 69 74  be simulated wit
287f0 68 20 68 65 61 70 20 6d 65 6d 6f 72 79 2e 0a 2a  h heap memory..*
28800 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
28810 78 4f 70 65 6e 53 68 61 72 65 64 4d 65 6d 6f 72  xOpenSharedMemor
28820 79 28 75 6e 69 78 46 69 6c 65 20 2a 70 44 62 46  y(unixFile *pDbF
28830 64 29 7b 0a 20 20 73 74 72 75 63 74 20 75 6e 69  d){.  struct uni
28840 78 53 68 6d 20 2a 70 20 3d 20 30 3b 20 20 20 20  xShm *p = 0;    
28850 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e        /* The con
28860 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65 20 6f 70  nection to be op
28870 65 6e 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74  ened */.  struct
28880 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53   unixShmNode *pS
28890 68 6d 4e 6f 64 65 3b 20 20 20 2f 2a 20 54 68 65  hmNode;   /* The
288a0 20 75 6e 64 65 72 6c 79 69 6e 67 20 6d 6d 61 70   underlying mmap
288b0 70 65 64 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  ped file */.  in
288c0 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
288d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
288e0 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a   Result code */.
288f0 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20    unixInodeInfo 
28900 2a 70 49 6e 6f 64 65 3b 20 20 20 20 20 20 20 20  *pInode;        
28910 20 20 2f 2a 20 54 68 65 20 69 6e 6f 64 65 20 6f    /* The inode o
28920 66 20 66 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a  f fd */.  char *
28930 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 3b 20 20 20  zShmFilename;   
28940 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
28950 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 75 73  e of the file us
28960 65 64 20 66 6f 72 20 53 48 4d 20 2a 2f 0a 20 20  ed for SHM */.  
28970 69 6e 74 20 6e 53 68 6d 46 69 6c 65 6e 61 6d 65  int nShmFilename
28980 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
28990 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 53  /* Size of the S
289a0 48 4d 20 66 69 6c 65 6e 61 6d 65 20 69 6e 20 62  HM filename in b
289b0 79 74 65 73 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c  ytes */..  /* Al
289c0 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72  locate space for
289d0 20 74 68 65 20 6e 65 77 20 75 6e 69 78 53 68 6d   the new unixShm
289e0 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20 20 70 20   object. */.  p 
289f0 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
28a00 28 20 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a  ( sizeof(*p) );.
28a10 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
28a20 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
28a30 3b 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c  ;.  memset(p, 0,
28a40 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20   sizeof(*p));.  
28a50 61 73 73 65 72 74 28 20 70 44 62 46 64 2d 3e 70  assert( pDbFd->p
28a60 53 68 6d 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  Shm==0 );..  /* 
28a70 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
28a80 61 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62  a unixShmNode ob
28a90 6a 65 63 74 20 61 6c 72 65 61 64 79 20 65 78 69  ject already exi
28aa0 73 74 73 2e 20 52 65 75 73 65 20 61 6e 20 65 78  sts. Reuse an ex
28ab0 69 73 74 69 6e 67 0a 20 20 2a 2a 20 6f 6e 65 20  isting.  ** one 
28ac0 69 66 20 70 72 65 73 65 6e 74 2e 20 43 72 65 61  if present. Crea
28ad0 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 69 66 20  te a new one if 
28ae0 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a  necessary..  */.
28af0 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
28b00 28 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70  ();.  pInode = p
28b10 44 62 46 64 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20  DbFd->pInode;.  
28b20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 49 6e 6f 64  pShmNode = pInod
28b30 65 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 69  e->pShmNode;.  i
28b40 66 28 20 70 53 68 6d 4e 6f 64 65 3d 3d 30 20 29  f( pShmNode==0 )
28b50 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73 74 61  {.    struct sta
28b60 74 20 73 53 74 61 74 3b 20 20 20 20 20 20 20 20  t sStat;        
28b70 20 20 20 20 20 20 20 20 20 2f 2a 20 66 73 74 61           /* fsta
28b80 74 28 29 20 69 6e 66 6f 20 66 6f 72 20 64 61 74  t() info for dat
28b90 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 23 69  abase file */.#i
28ba0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 53 48 4d  fndef SQLITE_SHM
28bb0 5f 44 49 52 45 43 54 4f 52 59 0a 20 20 20 20 63  _DIRECTORY.    c
28bc0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 42 61 73 65  onst char *zBase
28bd0 50 61 74 68 20 3d 20 70 44 62 46 64 2d 3e 7a 50  Path = pDbFd->zP
28be0 61 74 68 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20  ath;.#endif..   
28bf0 20 2f 2a 20 43 61 6c 6c 20 66 73 74 61 74 28 29   /* Call fstat()
28c00 20 74 6f 20 66 69 67 75 72 65 20 6f 75 74 20 74   to figure out t
28c10 68 65 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 6f  he permissions o
28c20 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
28c30 69 6c 65 2e 20 49 66 0a 20 20 20 20 2a 2a 20 61  ile. If.    ** a
28c40 20 6e 65 77 20 2a 2d 73 68 6d 20 66 69 6c 65 20   new *-shm file 
28c50 69 73 20 63 72 65 61 74 65 64 2c 20 61 6e 20 61  is created, an a
28c60 74 74 65 6d 70 74 20 77 69 6c 6c 20 62 65 20 6d  ttempt will be m
28c70 61 64 65 20 74 6f 20 63 72 65 61 74 65 20 69 74  ade to create it
28c80 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 74 68 65  .    ** with the
28c90 20 73 61 6d 65 20 70 65 72 6d 69 73 73 69 6f 6e   same permission
28ca0 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  s..    */.    if
28cb0 28 20 6f 73 46 73 74 61 74 28 70 44 62 46 64 2d  ( osFstat(pDbFd-
28cc0 3e 68 2c 20 26 73 53 74 61 74 29 20 26 26 20 70  >h, &sStat) && p
28cd0 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c  Inode->bProcessL
28ce0 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ock==0 ){.      
28cf0 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70  storeLastErrno(p
28d00 44 62 46 64 2c 20 65 72 72 6e 6f 29 3b 0a 20 20  DbFd, errno);.  
28d10 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
28d20 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a 20 20 20  IOERR_FSTAT;.   
28d30 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e     goto shm_open
28d40 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 23 69 66  _err;.    }..#if
28d50 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
28d60 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  __) && SQLITE_EN
28d70 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
28d80 4c 45 20 5c 0a 20 20 20 20 20 20 26 26 20 21 64  LE \.      && !d
28d90 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 53 48  efined(SQLITE_SH
28da0 4d 5f 44 49 52 45 43 54 4f 52 59 29 0a 20 20 20  M_DIRECTORY).   
28db0 20 2f 2a 20 49 66 20 70 44 62 46 64 20 69 73 20   /* If pDbFd is 
28dc0 63 6f 6e 66 69 67 75 72 65 64 20 77 69 74 68 20  configured with 
28dd0 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 6d 6f  proxy locking mo
28de0 64 65 2c 20 75 73 65 20 74 68 65 20 6c 6f 63 61  de, use the loca
28df0 6c 20 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 20 66  l .    ** lock f
28e00 69 6c 65 20 70 61 74 68 20 74 6f 20 64 65 74 65  ile path to dete
28e10 72 6d 69 6e 65 20 74 68 65 20 2d 73 68 6d 20 66  rmine the -shm f
28e20 69 6c 65 20 70 61 74 68 0a 20 20 20 20 2a 2f 0a  ile path.    */.
28e30 20 20 20 20 69 66 28 20 69 73 50 72 6f 78 79 4c      if( isProxyL
28e40 6f 63 6b 69 6e 67 4d 6f 64 65 28 70 44 62 46 64  ockingMode(pDbFd
28e50 29 20 29 7b 0a 20 20 20 20 20 20 7a 42 61 73 65  ) ){.      zBase
28e60 50 61 74 68 20 3d 20 70 72 6f 78 79 53 68 61 72  Path = proxyShar
28e70 65 64 4d 65 6d 6f 72 79 42 61 73 65 50 61 74 68  edMemoryBasePath
28e80 28 70 44 62 46 64 29 3b 0a 20 20 20 20 20 20 69  (pDbFd);.      i
28e90 66 28 20 21 7a 42 61 73 65 50 61 74 68 20 29 7b  f( !zBasePath ){
28ea0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
28eb0 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b  LITE_CANTOPEN_BK
28ec0 50 54 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  PT;.        goto
28ed0 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20   shm_open_err;. 
28ee0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e       }.    }.#en
28ef0 64 69 66 0a 20 20 20 20 0a 23 69 66 64 65 66 20  dif.    .#ifdef 
28f00 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43  SQLITE_SHM_DIREC
28f10 54 4f 52 59 0a 20 20 20 20 6e 53 68 6d 46 69 6c  TORY.    nShmFil
28f20 65 6e 61 6d 65 20 3d 20 73 69 7a 65 6f 66 28 53  ename = sizeof(S
28f30 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54  QLITE_SHM_DIRECT
28f40 4f 52 59 29 20 2b 20 33 31 3b 0a 23 65 6c 73 65  ORY) + 31;.#else
28f50 0a 20 20 20 20 6e 53 68 6d 46 69 6c 65 6e 61 6d  .    nShmFilenam
28f60 65 20 3d 20 36 20 2b 20 28 69 6e 74 29 73 74 72  e = 6 + (int)str
28f70 6c 65 6e 28 7a 42 61 73 65 50 61 74 68 29 3b 0a  len(zBasePath);.
28f80 23 65 6e 64 69 66 0a 20 20 20 20 70 53 68 6d 4e  #endif.    pShmN
28f90 6f 64 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  ode = sqlite3_ma
28fa0 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 53  lloc( sizeof(*pS
28fb0 68 6d 4e 6f 64 65 29 20 2b 20 6e 53 68 6d 46 69  hmNode) + nShmFi
28fc0 6c 65 6e 61 6d 65 20 29 3b 0a 20 20 20 20 69 66  lename );.    if
28fd0 28 20 70 53 68 6d 4e 6f 64 65 3d 3d 30 20 29 7b  ( pShmNode==0 ){
28fe0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
28ff0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
29000 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72  goto shm_open_er
29010 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d  r;.    }.    mem
29020 73 65 74 28 70 53 68 6d 4e 6f 64 65 2c 20 30 2c  set(pShmNode, 0,
29030 20 73 69 7a 65 6f 66 28 2a 70 53 68 6d 4e 6f 64   sizeof(*pShmNod
29040 65 29 2b 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 29  e)+nShmFilename)
29050 3b 0a 20 20 20 20 7a 53 68 6d 46 69 6c 65 6e 61  ;.    zShmFilena
29060 6d 65 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a  me = pShmNode->z
29070 46 69 6c 65 6e 61 6d 65 20 3d 20 28 63 68 61 72  Filename = (char
29080 2a 29 26 70 53 68 6d 4e 6f 64 65 5b 31 5d 3b 0a  *)&pShmNode[1];.
29090 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53 48  #ifdef SQLITE_SH
290a0 4d 5f 44 49 52 45 43 54 4f 52 59 0a 20 20 20 20  M_DIRECTORY.    
290b0 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
290c0 28 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 7a  (nShmFilename, z
290d0 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 0a 20 20  ShmFilename, .  
290e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
290f0 20 20 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49     SQLITE_SHM_DI
29100 52 45 43 54 4f 52 59 20 22 2f 73 71 6c 69 74 65  RECTORY "/sqlite
29110 2d 73 68 6d 2d 25 78 2d 25 78 22 2c 0a 20 20 20  -shm-%x-%x",.   
29120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29130 20 20 28 75 33 32 29 73 53 74 61 74 2e 73 74 5f    (u32)sStat.st_
29140 69 6e 6f 2c 20 28 75 33 32 29 73 53 74 61 74 2e  ino, (u32)sStat.
29150 73 74 5f 64 65 76 29 3b 0a 23 65 6c 73 65 0a 20  st_dev);.#else. 
29160 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
29170 6e 74 66 28 6e 53 68 6d 46 69 6c 65 6e 61 6d 65  ntf(nShmFilename
29180 2c 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20  , zShmFilename, 
29190 22 25 73 2d 73 68 6d 22 2c 20 7a 42 61 73 65 50  "%s-shm", zBaseP
291a0 61 74 68 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ath);.    sqlite
291b0 33 46 69 6c 65 53 75 66 66 69 78 33 28 70 44 62  3FileSuffix3(pDb
291c0 46 64 2d 3e 7a 50 61 74 68 2c 20 7a 53 68 6d 46  Fd->zPath, zShmF
291d0 69 6c 65 6e 61 6d 65 29 3b 0a 23 65 6e 64 69 66  ilename);.#endif
291e0 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 68  .    pShmNode->h
291f0 20 3d 20 2d 31 3b 0a 20 20 20 20 70 44 62 46 64   = -1;.    pDbFd
29200 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f  ->pInode->pShmNo
29210 64 65 20 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a 20  de = pShmNode;. 
29220 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e     pShmNode->pIn
29230 6f 64 65 20 3d 20 70 44 62 46 64 2d 3e 70 49 6e  ode = pDbFd->pIn
29240 6f 64 65 3b 0a 20 20 20 20 70 53 68 6d 4e 6f 64  ode;.    pShmNod
29250 65 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69 74  e->mutex = sqlit
29260 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53  e3_mutex_alloc(S
29270 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41 53 54  QLITE_MUTEX_FAST
29280 29 3b 0a 20 20 20 20 69 66 28 20 70 53 68 6d 4e  );.    if( pShmN
29290 6f 64 65 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b  ode->mutex==0 ){
292a0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
292b0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
292c0 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72  goto shm_open_er
292d0 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  r;.    }..    if
292e0 28 20 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65  ( pInode->bProce
292f0 73 73 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20  ssLock==0 ){.   
29300 20 20 20 69 6e 74 20 6f 70 65 6e 46 6c 61 67 73     int openFlags
29310 20 3d 20 4f 5f 52 44 57 52 20 7c 20 4f 5f 43 52   = O_RDWR | O_CR
29320 45 41 54 3b 0a 20 20 20 20 20 20 69 66 28 20 73  EAT;.      if( s
29330 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65  qlite3_uri_boole
29340 61 6e 28 70 44 62 46 64 2d 3e 7a 50 61 74 68 2c  an(pDbFd->zPath,
29350 20 22 72 65 61 64 6f 6e 6c 79 5f 73 68 6d 22 2c   "readonly_shm",
29360 20 30 29 0a 23 69 66 20 64 65 66 69 6e 65 64 28   0).#if defined(
29370 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 50 45  SQLITE_ENABLE_PE
29380 52 53 49 53 54 5f 57 41 4c 29 26 26 28 53 51 4c  RSIST_WAL)&&(SQL
29390 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
293a0 4e 47 5f 53 54 59 4c 45 20 5c 0a 20 20 20 20 7c  NG_STYLE \.    |
293b0 7c 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  | defined(__APPL
293c0 45 5f 5f 29 29 0a 20 20 20 20 20 20 20 20 20 7c  E__)).         |
293d0 7c 20 28 70 44 62 46 64 2d 3e 6f 70 65 6e 46 6c  | (pDbFd->openFl
293e0 61 67 73 20 26 20 4f 5f 52 44 57 52 29 20 21 3d  ags & O_RDWR) !=
293f0 20 4f 5f 52 44 57 52 0a 23 65 6e 64 69 66 0a 20   O_RDWR.#endif. 
29400 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
29410 20 20 20 6f 70 65 6e 46 6c 61 67 73 20 3d 20 4f     openFlags = O
29420 5f 52 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 20  _RDONLY;.       
29430 20 70 53 68 6d 4e 6f 64 65 2d 3e 69 73 52 65 61   pShmNode->isRea
29440 64 6f 6e 6c 79 20 3d 20 31 3b 0a 20 20 20 20 20  donly = 1;.     
29450 20 7d 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64   }.      pShmNod
29460 65 2d 3e 68 20 3d 20 72 6f 62 75 73 74 5f 6f 70  e->h = robust_op
29470 65 6e 28 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 2c  en(zShmFilename,
29480 20 6f 70 65 6e 46 6c 61 67 73 2c 20 28 73 53 74   openFlags, (sSt
29490 61 74 2e 73 74 5f 6d 6f 64 65 26 30 37 37 37 29  at.st_mode&0777)
294a0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 68  );.      if( pSh
294b0 6d 4e 6f 64 65 2d 3e 68 3c 30 20 29 7b 0a 20 20  mNode->h<0 ){.  
294c0 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c        rc = unixL
294d0 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43  ogError(SQLITE_C
294e0 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c 20 22 6f  ANTOPEN_BKPT, "o
294f0 70 65 6e 22 2c 20 7a 53 68 6d 46 69 6c 65 6e 61  pen", zShmFilena
29500 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  me);.        got
29510 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a  o shm_open_err;.
29520 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
29530 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69  * Check to see i
29540 66 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73  f another proces
29550 73 20 69 73 20 68 6f 6c 64 69 6e 67 20 74 68 65  s is holding the
29560 20 64 65 61 64 2d 6d 61 6e 20 73 77 69 74 63 68   dead-man switch
29570 2e 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 6e 6f  ..      ** If no
29580 74 2c 20 74 72 75 6e 63 61 74 65 20 74 68 65 20  t, truncate the 
29590 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20 6c 65 6e  file to zero len
295a0 67 74 68 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20  gth. .      */. 
295b0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
295c0 5f 4f 4b 3b 0a 20 20 20 20 20 20 69 66 28 20 75  _OK;.      if( u
295d0 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b  nixShmSystemLock
295e0 28 70 44 62 46 64 2c 20 46 5f 57 52 4c 43 4b 2c  (pDbFd, F_WRLCK,
295f0 20 55 4e 49 58 5f 53 48 4d 5f 44 4d 53 2c 20 31   UNIX_SHM_DMS, 1
29600 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  )==SQLITE_OK ){.
29610 20 20 20 20 20 20 20 20 69 66 28 20 72 6f 62 75          if( robu
29620 73 74 5f 66 74 72 75 6e 63 61 74 65 28 70 53 68  st_ftruncate(pSh
29630 6d 4e 6f 64 65 2d 3e 68 2c 20 30 29 20 29 7b 0a  mNode->h, 0) ){.
29640 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 75            rc = u
29650 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49  nixLogError(SQLI
29660 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4f 50 45 4e  TE_IOERR_SHMOPEN
29670 2c 20 22 66 74 72 75 6e 63 61 74 65 22 2c 20 7a  , "ftruncate", z
29680 53 68 6d 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  ShmFilename);.  
29690 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
296a0 20 20 20 20 20 20 20 2f 2a 20 49 66 20 72 75 6e         /* If run
296b0 6e 69 6e 67 20 61 73 20 72 6f 6f 74 20 73 65 74  ning as root set
296c0 20 74 68 65 20 75 69 64 2f 67 69 64 20 6f 66 20   the uid/gid of 
296d0 74 68 65 20 73 68 6d 20 66 69 6c 65 20 74 6f 20  the shm file to 
296e0 6d 61 74 63 68 0a 20 20 20 20 20 20 20 20 20 20  match.          
296f0 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
29700 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 75 69 64  */.          uid
29710 5f 74 20 65 75 69 64 20 3d 20 67 65 74 65 75 69  _t euid = geteui
29720 64 28 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  d();.          i
29730 66 28 20 28 21 70 53 68 6d 4e 6f 64 65 2d 3e 69  f( (!pShmNode->i
29740 73 52 65 61 64 6f 6e 6c 79 29 20 26 26 20 65 75  sReadonly) && eu
29750 69 64 3d 3d 30 20 26 26 20 28 65 75 69 64 21 3d  id==0 && (euid!=
29760 73 53 74 61 74 2e 73 74 5f 75 69 64 20 7c 7c 20  sStat.st_uid || 
29770 67 65 74 65 67 69 64 28 29 21 3d 73 53 74 61 74  getegid()!=sStat
29780 2e 73 74 5f 67 69 64 29 20 29 7b 0a 20 20 20 20  .st_gid) ){.    
29790 20 20 20 20 20 20 20 20 69 66 28 20 6f 73 46 63          if( osFc
297a0 68 6f 77 6e 28 70 53 68 6d 4e 6f 64 65 2d 3e 68  hown(pShmNode->h
297b0 2c 20 73 53 74 61 74 2e 73 74 5f 75 69 64 2c 20  , sStat.st_uid, 
297c0 73 53 74 61 74 2e 73 74 5f 67 69 64 29 20 29 7b  sStat.st_gid) ){
297d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72  .              r
297e0 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
297f0 5f 53 48 4d 4f 50 45 4e 3b 0a 20 20 20 20 20 20  _SHMOPEN;.      
29800 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
29810 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
29820 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
29830 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
29840 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e  .        rc = un
29850 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28  ixShmSystemLock(
29860 70 44 62 46 64 2c 20 46 5f 52 44 4c 43 4b 2c 20  pDbFd, F_RDLCK, 
29870 55 4e 49 58 5f 53 48 4d 5f 44 4d 53 2c 20 31 29  UNIX_SHM_DMS, 1)
29880 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
29890 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 73 68  if( rc ) goto sh
298a0 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20  m_open_err;.    
298b0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65  }.  }..  /* Make
298c0 20 74 68 65 20 6e 65 77 20 63 6f 6e 6e 65 63 74   the new connect
298d0 69 6f 6e 20 61 20 63 68 69 6c 64 20 6f 66 20 74  ion a child of t
298e0 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a  he unixShmNode *
298f0 2f 0a 20 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 20  /.  p->pShmNode 
29900 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a 23 69 66 64  = pShmNode;.#ifd
29910 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
29920 20 20 70 2d 3e 69 64 20 3d 20 70 53 68 6d 4e 6f    p->id = pShmNo
29930 64 65 2d 3e 6e 65 78 74 53 68 6d 49 64 2b 2b 3b  de->nextShmId++;
29940 0a 23 65 6e 64 69 66 0a 20 20 70 53 68 6d 4e 6f  .#endif.  pShmNo
29950 64 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 70 44  de->nRef++;.  pD
29960 62 46 64 2d 3e 70 53 68 6d 20 3d 20 70 3b 0a 20  bFd->pShm = p;. 
29970 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
29980 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 72 65 66  );..  /* The ref
29990 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20  erence count on 
299a0 70 53 68 6d 4e 6f 64 65 20 68 61 73 20 61 6c 72  pShmNode has alr
299b0 65 61 64 79 20 62 65 65 6e 20 69 6e 63 72 65 6d  eady been increm
299c0 65 6e 74 65 64 20 75 6e 64 65 72 0a 20 20 2a 2a  ented under.  **
299d0 20 74 68 65 20 63 6f 76 65 72 20 6f 66 20 74 68   the cover of th
299e0 65 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78  e unixEnterMutex
299f0 28 29 20 6d 75 74 65 78 20 61 6e 64 20 74 68 65  () mutex and the
29a00 20 70 6f 69 6e 74 65 72 20 66 72 6f 6d 20 74 68   pointer from th
29a10 65 0a 20 20 2a 2a 20 6e 65 77 20 28 73 74 72 75  e.  ** new (stru
29a20 63 74 20 75 6e 69 78 53 68 6d 29 20 6f 62 6a 65  ct unixShm) obje
29a30 63 74 20 74 6f 20 74 68 65 20 70 53 68 6d 4e 6f  ct to the pShmNo
29a40 64 65 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e  de has been set.
29a50 20 41 6c 6c 20 74 68 61 74 20 69 73 0a 20 20 2a   All that is.  *
29a60 2a 20 6c 65 66 74 20 74 6f 20 64 6f 20 69 73 20  * left to do is 
29a70 74 6f 20 6c 69 6e 6b 20 74 68 65 20 6e 65 77 20  to link the new 
29a80 6f 62 6a 65 63 74 20 69 6e 74 6f 20 74 68 65 20  object into the 
29a90 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 74 61 72  linked list star
29aa0 74 69 6e 67 0a 20 20 2a 2a 20 61 74 20 70 53 68  ting.  ** at pSh
29ab0 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 2e 20 54  mNode->pFirst. T
29ac0 68 69 73 20 6d 75 73 74 20 62 65 20 64 6f 6e 65  his must be done
29ad0 20 77 68 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74   while holding t
29ae0 68 65 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  he pShmNode->mut
29af0 65 78 20 0a 20 20 2a 2a 20 6d 75 74 65 78 2e 0a  ex .  ** mutex..
29b00 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d    */.  sqlite3_m
29b10 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e  utex_enter(pShmN
29b20 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70  ode->mutex);.  p
29b30 2d 3e 70 4e 65 78 74 20 3d 20 70 53 68 6d 4e 6f  ->pNext = pShmNo
29b40 64 65 2d 3e 70 46 69 72 73 74 3b 0a 20 20 70 53  de->pFirst;.  pS
29b50 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 20 3d  hmNode->pFirst =
29b60 20 70 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75   p;.  sqlite3_mu
29b70 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f  tex_leave(pShmNo
29b80 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  de->mutex);.  re
29b90 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
29ba0 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20  .  /* Jump here 
29bb0 6f 6e 20 61 6e 79 20 65 72 72 6f 72 20 2a 2f 0a  on any error */.
29bc0 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3a 0a 20 20  shm_open_err:.  
29bd0 75 6e 69 78 53 68 6d 50 75 72 67 65 28 70 44 62  unixShmPurge(pDb
29be0 46 64 29 3b 20 20 20 20 20 20 20 2f 2a 20 54 68  Fd);       /* Th
29bf0 69 73 20 63 61 6c 6c 20 66 72 65 65 73 20 70 53  is call frees pS
29c00 68 6d 4e 6f 64 65 20 69 66 20 72 65 71 75 69 72  hmNode if requir
29c10 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ed */.  sqlite3_
29c20 66 72 65 65 28 70 29 3b 0a 20 20 75 6e 69 78 4c  free(p);.  unixL
29c30 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 72  eaveMutex();.  r
29c40 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
29c50 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
29c60 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f 62   is called to ob
29c70 74 61 69 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  tain a pointer t
29c80 6f 20 72 65 67 69 6f 6e 20 69 52 65 67 69 6f 6e  o region iRegion
29c90 20 6f 66 20 74 68 65 20 0a 2a 2a 20 73 68 61 72   of the .** shar
29ca0 65 64 2d 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69  ed-memory associ
29cb0 61 74 65 64 20 77 69 74 68 20 74 68 65 20 64 61  ated with the da
29cc0 74 61 62 61 73 65 20 66 69 6c 65 20 66 64 2e 20  tabase file fd. 
29cd0 53 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65  Shared-memory re
29ce0 67 69 6f 6e 73 20 0a 2a 2a 20 61 72 65 20 6e 75  gions .** are nu
29cf0 6d 62 65 72 65 64 20 73 74 61 72 74 69 6e 67 20  mbered starting 
29d00 66 72 6f 6d 20 7a 65 72 6f 2e 20 45 61 63 68 20  from zero. Each 
29d10 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65  shared-memory re
29d20 67 69 6f 6e 20 69 73 20 73 7a 52 65 67 69 6f 6e  gion is szRegion
29d30 20 0a 2a 2a 20 62 79 74 65 73 20 69 6e 20 73 69   .** bytes in si
29d40 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ze..**.** If an 
29d50 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61 6e  error occurs, an
29d60 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
29d70 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 20  eturned and *pp 
29d80 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a  is set to NULL..
29d90 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  **.** Otherwise,
29da0 20 69 66 20 74 68 65 20 62 45 78 74 65 6e 64 20   if the bExtend 
29db0 70 61 72 61 6d 65 74 65 72 20 69 73 20 30 20 61  parameter is 0 a
29dc0 6e 64 20 74 68 65 20 72 65 71 75 65 73 74 65 64  nd the requested
29dd0 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 0a 2a   shared-memory.*
29de0 2a 20 72 65 67 69 6f 6e 20 68 61 73 20 6e 6f 74  * region has not
29df0 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20   been allocated 
29e00 28 62 79 20 61 6e 79 20 63 6c 69 65 6e 74 2c 20  (by any client, 
29e10 69 6e 63 6c 75 64 69 6e 67 20 6f 6e 65 20 72 75  including one ru
29e20 6e 6e 69 6e 67 20 69 6e 20 61 0a 2a 2a 20 73 65  nning in a.** se
29e30 70 61 72 61 74 65 20 70 72 6f 63 65 73 73 29 2c  parate process),
29e40 20 74 68 65 6e 20 2a 70 70 20 69 73 20 73 65 74   then *pp is set
29e50 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 53 51 4c   to NULL and SQL
29e60 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e  ITE_OK returned.
29e70 20 49 66 20 0a 2a 2a 20 62 45 78 74 65 6e 64 20   If .** bExtend 
29e80 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 61 6e 64 20  is non-zero and 
29e90 74 68 65 20 72 65 71 75 65 73 74 65 64 20 73 68  the requested sh
29ea0 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69  ared-memory regi
29eb0 6f 6e 20 68 61 73 20 6e 6f 74 20 79 65 74 20 0a  on has not yet .
29ec0 2a 2a 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  ** been allocate
29ed0 64 2c 20 69 74 20 69 73 20 61 6c 6c 6f 63 61 74  d, it is allocat
29ee0 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
29ef0 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ion..**.** If th
29f00 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  e shared-memory 
29f10 72 65 67 69 6f 6e 20 68 61 73 20 61 6c 72 65 61  region has alrea
29f20 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65  dy been allocate
29f30 64 20 6f 72 20 69 73 20 61 6c 6c 6f 63 61 74 65  d or is allocate
29f40 64 20 62 79 0a 2a 2a 20 74 68 69 73 20 63 61 6c  d by.** this cal
29f50 6c 20 61 73 20 64 65 73 63 72 69 62 65 64 20 61  l as described a
29f60 62 6f 76 65 2c 20 74 68 65 6e 20 69 74 20 69 73  bove, then it is
29f70 20 6d 61 70 70 65 64 20 69 6e 74 6f 20 74 68 69   mapped into thi
29f80 73 20 70 72 6f 63 65 73 73 65 73 20 0a 2a 2a 20  s processes .** 
29f90 61 64 64 72 65 73 73 20 73 70 61 63 65 20 28 69  address space (i
29fa0 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65  f it is not alre
29fb0 61 64 79 29 2c 20 2a 70 70 20 69 73 20 73 65 74  ady), *pp is set
29fc0 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   to point to the
29fd0 20 6d 61 70 70 65 64 20 0a 2a 2a 20 6d 65 6d 6f   mapped .** memo
29fe0 72 79 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b  ry and SQLITE_OK
29ff0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
2a000 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 68 6d  atic int unixShm
2a010 4d 61 70 28 0a 20 20 73 71 6c 69 74 65 33 5f 66  Map(.  sqlite3_f
2a020 69 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20  ile *fd,        
2a030 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65         /* Handle
2a040 20 6f 70 65 6e 20 6f 6e 20 64 61 74 61 62 61 73   open on databas
2a050 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  e file */.  int 
2a060 69 52 65 67 69 6f 6e 2c 20 20 20 20 20 20 20 20  iRegion,        
2a070 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
2a080 65 67 69 6f 6e 20 74 6f 20 72 65 74 72 69 65 76  egion to retriev
2a090 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 52 65 67  e */.  int szReg
2a0a0 69 6f 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  ion,            
2a0b0 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
2a0c0 66 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20 20 69  f regions */.  i
2a0d0 6e 74 20 62 45 78 74 65 6e 64 2c 20 20 20 20 20  nt bExtend,     
2a0e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a0f0 2a 20 54 72 75 65 20 74 6f 20 65 78 74 65 6e 64  * True to extend
2a100 20 66 69 6c 65 20 69 66 20 6e 65 63 65 73 73 61   file if necessa
2a110 72 79 20 2a 2f 0a 20 20 76 6f 69 64 20 76 6f 6c  ry */.  void vol
2a120 61 74 69 6c 65 20 2a 2a 70 70 20 20 20 20 20 20  atile **pp      
2a130 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
2a140 4d 61 70 70 65 64 20 6d 65 6d 6f 72 79 20 2a 2f  Mapped memory */
2a150 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  .){.  unixFile *
2a160 70 44 62 46 64 20 3d 20 28 75 6e 69 78 46 69 6c  pDbFd = (unixFil
2a170 65 2a 29 66 64 3b 0a 20 20 75 6e 69 78 53 68 6d  e*)fd;.  unixShm
2a180 20 2a 70 3b 0a 20 20 75 6e 69 78 53 68 6d 4e 6f   *p;.  unixShmNo
2a190 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 0a 20 20  de *pShmNode;.  
2a1a0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
2a1b0 4f 4b 3b 0a 20 20 69 6e 74 20 6e 53 68 6d 50 65  OK;.  int nShmPe
2a1c0 72 4d 61 70 20 3d 20 75 6e 69 78 53 68 6d 52 65  rMap = unixShmRe
2a1d0 67 69 6f 6e 50 65 72 4d 61 70 28 29 3b 0a 20 20  gionPerMap();.  
2a1e0 69 6e 74 20 6e 52 65 71 52 65 67 69 6f 6e 3b 0a  int nReqRegion;.
2a1f0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 73 68 61  .  /* If the sha
2a200 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20  red-memory file 
2a210 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e  has not yet been
2a220 20 6f 70 65 6e 65 64 2c 20 6f 70 65 6e 20 69 74   opened, open it
2a230 20 6e 6f 77 2e 20 2a 2f 0a 20 20 69 66 28 20 70   now. */.  if( p
2a240 44 62 46 64 2d 3e 70 53 68 6d 3d 3d 30 20 29 7b  DbFd->pShm==0 ){
2a250 0a 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4f 70  .    rc = unixOp
2a260 65 6e 53 68 61 72 65 64 4d 65 6d 6f 72 79 28 70  enSharedMemory(p
2a270 44 62 46 64 29 3b 0a 20 20 20 20 69 66 28 20 72  DbFd);.    if( r
2a280 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
2a290 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
2a2a0 20 70 20 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d   p = pDbFd->pShm
2a2b0 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70  ;.  pShmNode = p
2a2c0 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 73 71  ->pShmNode;.  sq
2a2d0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
2a2e0 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  r(pShmNode->mute
2a2f0 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a  x);.  assert( sz
2a300 52 65 67 69 6f 6e 3d 3d 70 53 68 6d 4e 6f 64 65  Region==pShmNode
2a310 2d 3e 73 7a 52 65 67 69 6f 6e 20 7c 7c 20 70 53  ->szRegion || pS
2a320 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3d  hmNode->nRegion=
2a330 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
2a340 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64 65  pShmNode->pInode
2a350 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 20  ==pDbFd->pInode 
2a360 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 68  );.  assert( pSh
2a370 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 7c 7c 20 70  mNode->h>=0 || p
2a380 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50  DbFd->pInode->bP
2a390 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 31 20 29 3b  rocessLock==1 );
2a3a0 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e  .  assert( pShmN
2a3b0 6f 64 65 2d 3e 68 3c 30 20 7c 7c 20 70 44 62 46  ode->h<0 || pDbF
2a3c0 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63  d->pInode->bProc
2a3d0 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 0a 20  essLock==0 );.. 
2a3e0 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 6e 75 6d 62   /* Minimum numb
2a3f0 65 72 20 6f 66 20 72 65 67 69 6f 6e 73 20 72 65  er of regions re
2a400 71 75 69 72 65 64 20 74 6f 20 62 65 20 6d 61 70  quired to be map
2a410 70 65 64 2e 20 2a 2f 0a 20 20 6e 52 65 71 52 65  ped. */.  nReqRe
2a420 67 69 6f 6e 20 3d 20 28 28 69 52 65 67 69 6f 6e  gion = ((iRegion
2a430 2b 6e 53 68 6d 50 65 72 4d 61 70 29 20 2f 20 6e  +nShmPerMap) / n
2a440 53 68 6d 50 65 72 4d 61 70 29 20 2a 20 6e 53 68  ShmPerMap) * nSh
2a450 6d 50 65 72 4d 61 70 3b 0a 0a 20 20 69 66 28 20  mPerMap;..  if( 
2a460 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f  pShmNode->nRegio
2a470 6e 3c 6e 52 65 71 52 65 67 69 6f 6e 20 29 7b 0a  n<nReqRegion ){.
2a480 20 20 20 20 63 68 61 72 20 2a 2a 61 70 4e 65 77      char **apNew
2a490 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2a4a0 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 61 70         /* New ap
2a4b0 52 65 67 69 6f 6e 5b 5d 20 61 72 72 61 79 20 2a  Region[] array *
2a4c0 2f 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20  /.    int nByte 
2a4d0 3d 20 6e 52 65 71 52 65 67 69 6f 6e 2a 73 7a 52  = nReqRegion*szR
2a4e0 65 67 69 6f 6e 3b 20 20 20 2f 2a 20 4d 69 6e 69  egion;   /* Mini
2a4f0 6d 75 6d 20 72 65 71 75 69 72 65 64 20 66 69 6c  mum required fil
2a500 65 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 73 74  e size */.    st
2a510 72 75 63 74 20 73 74 61 74 20 73 53 74 61 74 3b  ruct stat sStat;
2a520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a530 20 2f 2a 20 55 73 65 64 20 62 79 20 66 73 74 61   /* Used by fsta
2a540 74 28 29 20 2a 2f 0a 0a 20 20 20 20 70 53 68 6d  t() */..    pShm
2a550 4e 6f 64 65 2d 3e 73 7a 52 65 67 69 6f 6e 20 3d  Node->szRegion =
2a560 20 73 7a 52 65 67 69 6f 6e 3b 0a 0a 20 20 20 20   szRegion;..    
2a570 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e  if( pShmNode->h>
2a580 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  =0 ){.      /* T
2a590 68 65 20 72 65 71 75 65 73 74 65 64 20 72 65 67  he requested reg
2a5a0 69 6f 6e 20 69 73 20 6e 6f 74 20 6d 61 70 70 65  ion is not mappe
2a5b0 64 20 69 6e 74 6f 20 74 68 69 73 20 70 72 6f 63  d into this proc
2a5c0 65 73 73 65 73 20 61 64 64 72 65 73 73 20 73 70  esses address sp
2a5d0 61 63 65 2e 0a 20 20 20 20 20 20 2a 2a 20 43 68  ace..      ** Ch
2a5e0 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 69 74  eck to see if it
2a5f0 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61   has been alloca
2a600 74 65 64 20 28 69 2e 65 2e 20 69 66 20 74 68 65  ted (i.e. if the
2a610 20 77 61 6c 2d 69 6e 64 65 78 20 66 69 6c 65 20   wal-index file 
2a620 69 73 0a 20 20 20 20 20 20 2a 2a 20 6c 61 72 67  is.      ** larg
2a630 65 20 65 6e 6f 75 67 68 20 74 6f 20 63 6f 6e 74  e enough to cont
2a640 61 69 6e 20 74 68 65 20 72 65 71 75 65 73 74 65  ain the requeste
2a650 64 20 72 65 67 69 6f 6e 29 2e 0a 20 20 20 20 20  d region)..     
2a660 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6f 73   */.      if( os
2a670 46 73 74 61 74 28 70 53 68 6d 4e 6f 64 65 2d 3e  Fstat(pShmNode->
2a680 68 2c 20 26 73 53 74 61 74 29 20 29 7b 0a 20 20  h, &sStat) ){.  
2a690 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2a6a0 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45 3b  E_IOERR_SHMSIZE;
2a6b0 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68  .        goto sh
2a6c0 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20  mpage_out;.     
2a6d0 20 7d 0a 20 20 0a 20 20 20 20 20 20 69 66 28 20   }.  .      if( 
2a6e0 73 53 74 61 74 2e 73 74 5f 73 69 7a 65 3c 6e 42  sStat.st_size<nB
2a6f0 79 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  yte ){.        /
2a700 2a 20 54 68 65 20 72 65 71 75 65 73 74 65 64 20  * The requested 
2a710 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 64 6f  memory region do
2a720 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 20 49 66  es not exist. If
2a730 20 62 45 78 74 65 6e 64 20 69 73 20 73 65 74 20   bExtend is set 
2a740 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 61  to.        ** fa
2a750 6c 73 65 2c 20 65 78 69 74 20 65 61 72 6c 79 2e  lse, exit early.
2a760 20 2a 70 70 20 77 69 6c 6c 20 62 65 20 73 65 74   *pp will be set
2a770 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20 53 51 4c   to NULL and SQL
2a780 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e  ITE_OK returned.
2a790 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
2a7a0 20 20 20 20 69 66 28 20 21 62 45 78 74 65 6e 64      if( !bExtend
2a7b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
2a7c0 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a  to shmpage_out;.
2a7d0 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
2a7e0 20 20 20 2f 2a 20 41 6c 74 65 72 6e 61 74 69 76     /* Alternativ
2a7f0 65 6c 79 2c 20 69 66 20 62 45 78 74 65 6e 64 20  ely, if bExtend 
2a800 69 73 20 74 72 75 65 2c 20 65 78 74 65 6e 64 20  is true, extend 
2a810 74 68 65 20 66 69 6c 65 2e 20 44 6f 20 74 68 69  the file. Do thi
2a820 73 20 62 79 0a 20 20 20 20 20 20 20 20 2a 2a 20  s by.        ** 
2a830 77 72 69 74 69 6e 67 20 61 20 73 69 6e 67 6c 65  writing a single
2a840 20 62 79 74 65 20 74 6f 20 74 68 65 20 65 6e 64   byte to the end
2a850 20 6f 66 20 65 61 63 68 20 28 4f 53 29 20 70 61   of each (OS) pa
2a860 67 65 20 62 65 69 6e 67 0a 20 20 20 20 20 20 20  ge being.       
2a870 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 6f 72   ** allocated or
2a880 20 65 78 74 65 6e 64 65 64 2e 20 54 65 63 68 6e   extended. Techn
2a890 69 63 61 6c 6c 79 2c 20 77 65 20 6e 65 65 64 20  ically, we need 
2a8a0 6f 6e 6c 79 20 77 72 69 74 65 20 74 6f 20 74 68  only write to th
2a8b0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c 61 73  e.        ** las
2a8c0 74 20 70 61 67 65 20 69 6e 20 6f 72 64 65 72 20  t page in order 
2a8d0 74 6f 20 65 78 74 65 6e 64 20 74 68 65 20 66 69  to extend the fi
2a8e0 6c 65 2e 20 42 75 74 20 77 72 69 74 69 6e 67 20  le. But writing 
2a8f0 74 6f 20 61 6c 6c 20 6e 65 77 0a 20 20 20 20 20  to all new.     
2a900 20 20 20 2a 2a 20 70 61 67 65 73 20 66 6f 72 63     ** pages forc
2a910 65 73 20 74 68 65 20 4f 53 20 74 6f 20 61 6c 6c  es the OS to all
2a920 6f 63 61 74 65 20 74 68 65 6d 20 69 6d 6d 65 64  ocate them immed
2a930 69 61 74 65 6c 79 2c 20 77 68 69 63 68 20 72 65  iately, which re
2a940 64 75 63 65 73 0a 20 20 20 20 20 20 20 20 2a 2a  duces.        **
2a950 20 74 68 65 20 63 68 61 6e 63 65 73 20 6f 66 20   the chances of 
2a960 53 49 47 42 55 53 20 77 68 69 6c 65 20 61 63 63  SIGBUS while acc
2a970 65 73 73 69 6e 67 20 74 68 65 20 6d 61 70 70 65  essing the mappe
2a980 64 20 72 65 67 69 6f 6e 20 6c 61 74 65 72 20 6f  d region later o
2a990 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  n..        */.  
2a9a0 20 20 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20        else{.    
2a9b0 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e        static con
2a9c0 73 74 20 69 6e 74 20 70 67 73 7a 20 3d 20 34 30  st int pgsz = 40
2a9d0 39 36 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  96;.          in
2a9e0 74 20 69 50 67 3b 0a 0a 20 20 20 20 20 20 20 20  t iPg;..        
2a9f0 20 20 2f 2a 20 57 72 69 74 65 20 74 6f 20 74 68    /* Write to th
2aa00 65 20 6c 61 73 74 20 62 79 74 65 20 6f 66 20 65  e last byte of e
2aa10 61 63 68 20 6e 65 77 6c 79 20 61 6c 6c 6f 63 61  ach newly alloca
2aa20 74 65 64 20 6f 72 20 65 78 74 65 6e 64 65 64 20  ted or extended 
2aa30 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  page */.        
2aa40 20 20 61 73 73 65 72 74 28 20 28 6e 42 79 74 65    assert( (nByte
2aa50 20 25 20 70 67 73 7a 29 3d 3d 30 20 29 3b 0a 20   % pgsz)==0 );. 
2aa60 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 50 67           for(iPg
2aa70 3d 28 73 53 74 61 74 2e 73 74 5f 73 69 7a 65 2f  =(sStat.st_size/
2aa80 70 67 73 7a 29 3b 20 69 50 67 3c 28 6e 42 79 74  pgsz); iPg<(nByt
2aa90 65 2f 70 67 73 7a 29 3b 20 69 50 67 2b 2b 29 7b  e/pgsz); iPg++){
2aaa0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
2aab0 20 73 65 65 6b 41 6e 64 57 72 69 74 65 46 64 28   seekAndWriteFd(
2aac0 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 69 50 67  pShmNode->h, iPg
2aad0 2a 70 67 73 7a 20 2b 20 70 67 73 7a 2d 31 2c 20  *pgsz + pgsz-1, 
2aae0 22 22 2c 20 31 2c 20 30 29 21 3d 31 20 29 7b 0a  "", 1, 0)!=1 ){.
2aaf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
2ab00 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 20  nst char *zFile 
2ab10 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a 46 69 6c  = pShmNode->zFil
2ab20 65 6e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20  ename;.         
2ab30 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f       rc = unixLo
2ab40 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
2ab50 45 52 52 5f 53 48 4d 53 49 5a 45 2c 20 22 77 72  ERR_SHMSIZE, "wr
2ab60 69 74 65 22 2c 20 7a 46 69 6c 65 29 3b 0a 20 20  ite", zFile);.  
2ab70 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
2ab80 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20   shmpage_out;.  
2ab90 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2aba0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2abb0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
2abc0 0a 20 20 20 20 2f 2a 20 4d 61 70 20 74 68 65 20  .    /* Map the 
2abd0 72 65 71 75 65 73 74 65 64 20 6d 65 6d 6f 72 79  requested memory
2abe0 20 72 65 67 69 6f 6e 20 69 6e 74 6f 20 74 68 69   region into thi
2abf0 73 20 70 72 6f 63 65 73 73 65 73 20 61 64 64 72  s processes addr
2ac00 65 73 73 20 73 70 61 63 65 2e 20 2a 2f 0a 20 20  ess space. */.  
2ac10 20 20 61 70 4e 65 77 20 3d 20 28 63 68 61 72 20    apNew = (char 
2ac20 2a 2a 29 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c  **)sqlite3_reall
2ac30 6f 63 28 0a 20 20 20 20 20 20 20 20 70 53 68 6d  oc(.        pShm
2ac40 4e 6f 64 65 2d 3e 61 70 52 65 67 69 6f 6e 2c 20  Node->apRegion, 
2ac50 6e 52 65 71 52 65 67 69 6f 6e 2a 73 69 7a 65 6f  nReqRegion*sizeo
2ac60 66 28 63 68 61 72 20 2a 29 0a 20 20 20 20 29 3b  f(char *).    );
2ac70 0a 20 20 20 20 69 66 28 20 21 61 70 4e 65 77 20  .    if( !apNew 
2ac80 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
2ac90 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
2aca0 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d  ;.      goto shm
2acb0 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  page_out;.    }.
2acc0 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 70      pShmNode->ap
2acd0 52 65 67 69 6f 6e 20 3d 20 61 70 4e 65 77 3b 0a  Region = apNew;.
2ace0 20 20 20 20 77 68 69 6c 65 28 20 70 53 68 6d 4e      while( pShmN
2acf0 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c 6e 52 65  ode->nRegion<nRe
2ad00 71 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 20  qRegion ){.     
2ad10 20 69 6e 74 20 6e 4d 61 70 20 3d 20 73 7a 52 65   int nMap = szRe
2ad20 67 69 6f 6e 2a 6e 53 68 6d 50 65 72 4d 61 70 3b  gion*nShmPerMap;
2ad30 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
2ad40 20 20 20 20 76 6f 69 64 20 2a 70 4d 65 6d 3b 0a      void *pMem;.
2ad50 20 20 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f        if( pShmNo
2ad60 64 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20  de->h>=0 ){.    
2ad70 20 20 20 20 70 4d 65 6d 20 3d 20 6f 73 4d 6d 61      pMem = osMma
2ad80 70 28 30 2c 20 6e 4d 61 70 2c 0a 20 20 20 20 20  p(0, nMap,.     
2ad90 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d         pShmNode-
2ada0 3e 69 73 52 65 61 64 6f 6e 6c 79 20 3f 20 50 52  >isReadonly ? PR
2adb0 4f 54 5f 52 45 41 44 20 3a 20 50 52 4f 54 5f 52  OT_READ : PROT_R
2adc0 45 41 44 7c 50 52 4f 54 5f 57 52 49 54 45 2c 20  EAD|PROT_WRITE, 
2add0 0a 20 20 20 20 20 20 20 20 20 20 20 20 4d 41 50  .            MAP
2ade0 5f 53 48 41 52 45 44 2c 20 70 53 68 6d 4e 6f 64  _SHARED, pShmNod
2adf0 65 2d 3e 68 2c 20 73 7a 52 65 67 69 6f 6e 2a 28  e->h, szRegion*(
2ae00 69 36 34 29 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  i64)pShmNode->nR
2ae10 65 67 69 6f 6e 0a 20 20 20 20 20 20 20 20 29 3b  egion.        );
2ae20 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4d 65  .        if( pMe
2ae30 6d 3d 3d 4d 41 50 5f 46 41 49 4c 45 44 20 29 7b  m==MAP_FAILED ){
2ae40 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
2ae50 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c  unixLogError(SQL
2ae60 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4d 41 50  ITE_IOERR_SHMMAP
2ae70 2c 20 22 6d 6d 61 70 22 2c 20 70 53 68 6d 4e 6f  , "mmap", pShmNo
2ae80 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  de->zFilename);.
2ae90 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73            goto s
2aea0 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  hmpage_out;.    
2aeb0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
2aec0 65 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 20  e{.        pMem 
2aed0 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
2aee0 28 73 7a 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20  (szRegion);.    
2aef0 20 20 20 20 69 66 28 20 70 4d 65 6d 3d 3d 30 20      if( pMem==0 
2af00 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
2af10 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
2af20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73            goto s
2af30 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  hmpage_out;.    
2af40 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6d 65      }.        me
2af50 6d 73 65 74 28 70 4d 65 6d 2c 20 30 2c 20 73 7a  mset(pMem, 0, sz
2af60 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20 20 20 7d  Region);.      }
2af70 0a 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ..      for(i=0;
2af80 20 69 3c 6e 53 68 6d 50 65 72 4d 61 70 3b 20 69   i<nShmPerMap; i
2af90 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 53 68  ++){.        pSh
2afa0 6d 4e 6f 64 65 2d 3e 61 70 52 65 67 69 6f 6e 5b  mNode->apRegion[
2afb0 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f  pShmNode->nRegio
2afc0 6e 2b 69 5d 20 3d 20 26 28 28 63 68 61 72 2a 29  n+i] = &((char*)
2afd0 70 4d 65 6d 29 5b 73 7a 52 65 67 69 6f 6e 2a 69  pMem)[szRegion*i
2afe0 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  ];.      }.     
2aff0 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69   pShmNode->nRegi
2b000 6f 6e 20 2b 3d 20 6e 53 68 6d 50 65 72 4d 61 70  on += nShmPerMap
2b010 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 73 68 6d  ;.    }.  }..shm
2b020 70 61 67 65 5f 6f 75 74 3a 0a 20 20 69 66 28 20  page_out:.  if( 
2b030 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f  pShmNode->nRegio
2b040 6e 3e 69 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20  n>iRegion ){.   
2b050 20 2a 70 70 20 3d 20 70 53 68 6d 4e 6f 64 65 2d   *pp = pShmNode-
2b060 3e 61 70 52 65 67 69 6f 6e 5b 69 52 65 67 69 6f  >apRegion[iRegio
2b070 6e 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  n];.  }else{.   
2b080 20 2a 70 70 20 3d 20 30 3b 0a 20 20 7d 0a 20 20   *pp = 0;.  }.  
2b090 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 69 73  if( pShmNode->is
2b0a0 52 65 61 64 6f 6e 6c 79 20 26 26 20 72 63 3d 3d  Readonly && rc==
2b0b0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d  SQLITE_OK ) rc =
2b0c0 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
2b0d0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
2b0e0 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65  x_leave(pShmNode
2b0f0 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
2b100 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2b110 43 68 61 6e 67 65 20 74 68 65 20 6c 6f 63 6b 20  Change the lock 
2b120 73 74 61 74 65 20 66 6f 72 20 61 20 73 68 61 72  state for a shar
2b130 65 64 2d 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e  ed-memory segmen
2b140 74 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68  t..**.** Note th
2b150 61 74 20 74 68 65 20 72 65 6c 61 74 69 6f 6e 73  at the relations
2b160 68 69 70 20 62 65 74 77 65 65 6e 20 53 48 41 52  hip between SHAR
2b170 45 64 20 61 6e 64 20 45 58 43 4c 55 53 49 56 45  Ed and EXCLUSIVE
2b180 20 6c 6f 63 6b 73 20 69 73 20 61 20 6c 69 74 74   locks is a litt
2b190 6c 65 0a 2a 2a 20 64 69 66 66 65 72 65 6e 74 20  le.** different 
2b1a0 68 65 72 65 20 74 68 61 6e 20 69 6e 20 70 6f 73  here than in pos
2b1b0 69 78 2e 20 20 49 6e 20 78 53 68 6d 4c 6f 63 6b  ix.  In xShmLock
2b1c0 28 29 2c 20 6f 6e 65 20 63 61 6e 20 67 6f 20 66  (), one can go f
2b1d0 72 6f 6d 20 75 6e 6c 6f 63 6b 65 64 0a 2a 2a 20  rom unlocked.** 
2b1e0 74 6f 20 73 68 61 72 65 64 20 61 6e 64 20 62 61  to shared and ba
2b1f0 63 6b 20 6f 72 20 66 72 6f 6d 20 75 6e 6c 6f 63  ck or from unloc
2b200 6b 65 64 20 74 6f 20 65 78 63 6c 75 73 69 76 65  ked to exclusive
2b210 20 61 6e 64 20 62 61 63 6b 2e 20 20 42 75 74 20   and back.  But 
2b220 6f 6e 65 20 6d 61 79 0a 2a 2a 20 6e 6f 74 20 67  one may.** not g
2b230 6f 20 66 72 6f 6d 20 73 68 61 72 65 64 20 74 6f  o from shared to
2b240 20 65 78 63 6c 75 73 69 76 65 20 6f 72 20 66 72   exclusive or fr
2b250 6f 6d 20 65 78 63 6c 75 73 69 76 65 20 74 6f 20  om exclusive to 
2b260 73 68 61 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  shared..*/.stati
2b270 63 20 69 6e 74 20 75 6e 69 78 53 68 6d 4c 6f 63  c int unixShmLoc
2b280 6b 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  k(.  sqlite3_fil
2b290 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20  e *fd,          
2b2a0 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c 65  /* Database file
2b2b0 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73 68 61   holding the sha
2b2c0 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20  red memory */.  
2b2d0 69 6e 74 20 6f 66 73 74 2c 20 20 20 20 20 20 20  int ofst,       
2b2e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
2b2f0 72 73 74 20 6c 6f 63 6b 20 74 6f 20 61 63 71 75  rst lock to acqu
2b300 69 72 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a  ire or release *
2b310 2f 0a 20 20 69 6e 74 20 6e 2c 20 20 20 20 20 20  /.  int n,      
2b320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2b330 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6c 6f 63 6b  * Number of lock
2b340 73 20 74 6f 20 61 63 71 75 69 72 65 20 6f 72 20  s to acquire or 
2b350 72 65 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74  release */.  int
2b360 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20   flags          
2b370 20 20 20 20 20 20 20 20 2f 2a 20 57 68 61 74 20          /* What 
2b380 74 6f 20 64 6f 20 77 69 74 68 20 74 68 65 20 6c  to do with the l
2b390 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78  ock */.){.  unix
2b3a0 46 69 6c 65 20 2a 70 44 62 46 64 20 3d 20 28 75  File *pDbFd = (u
2b3b0 6e 69 78 46 69 6c 65 2a 29 66 64 3b 20 20 20 20  nixFile*)fd;    
2b3c0 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20    /* Connection 
2b3d0 68 6f 6c 64 69 6e 67 20 73 68 61 72 65 64 20 6d  holding shared m
2b3e0 65 6d 6f 72 79 20 2a 2f 0a 20 20 75 6e 69 78 53  emory */.  unixS
2b3f0 68 6d 20 2a 70 20 3d 20 70 44 62 46 64 2d 3e 70  hm *p = pDbFd->p
2b400 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  Shm;            
2b410 20 2f 2a 20 54 68 65 20 73 68 61 72 65 64 20 6d   /* The shared m
2b420 65 6d 6f 72 79 20 62 65 69 6e 67 20 6c 6f 63 6b  emory being lock
2b430 65 64 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20  ed */.  unixShm 
2b440 2a 70 58 3b 20 20 20 20 20 20 20 20 20 20 20 20  *pX;            
2b450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2b460 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65   For looping ove
2b470 72 20 61 6c 6c 20 73 69 62 6c 69 6e 67 73 20 2a  r all siblings *
2b480 2f 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  /.  unixShmNode 
2b490 2a 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70  *pShmNode = p->p
2b4a0 53 68 6d 4e 6f 64 65 3b 20 20 2f 2a 20 54 68 65  ShmNode;  /* The
2b4b0 20 75 6e 64 65 72 6c 79 69 6e 67 20 66 69 6c 65   underlying file
2b4c0 20 69 4e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20   iNode */.  int 
2b4d0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
2b4e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b4f0 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
2b500 20 2a 2f 0a 20 20 75 31 36 20 6d 61 73 6b 3b 20   */.  u16 mask; 
2b510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b520 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
2b530 61 73 6b 20 6f 66 20 6c 6f 63 6b 73 20 74 6f 20  ask of locks to 
2b540 74 61 6b 65 20 6f 72 20 72 65 6c 65 61 73 65 20  take or release 
2b550 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 53  */..  assert( pS
2b560 68 6d 4e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70  hmNode==pDbFd->p
2b570 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 20  Inode->pShmNode 
2b580 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 68  );.  assert( pSh
2b590 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64 65 3d 3d 70  mNode->pInode==p
2b5a0 44 62 46 64 2d 3e 70 49 6e 6f 64 65 20 29 3b 0a  DbFd->pInode );.
2b5b0 20 20 61 73 73 65 72 74 28 20 6f 66 73 74 3e 3d    assert( ofst>=
2b5c0 30 20 26 26 20 6f 66 73 74 2b 6e 3c 3d 53 51 4c  0 && ofst+n<=SQL
2b5d0 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 20 29 3b  ITE_SHM_NLOCK );
2b5e0 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 3d 31 20  .  assert( n>=1 
2b5f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 66 6c 61  );.  assert( fla
2b600 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f  gs==(SQLITE_SHM_
2b610 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48  LOCK | SQLITE_SH
2b620 4d 5f 53 48 41 52 45 44 29 0a 20 20 20 20 20 20  M_SHARED).      
2b630 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49   || flags==(SQLI
2b640 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51  TE_SHM_LOCK | SQ
2b650 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49  LITE_SHM_EXCLUSI
2b660 56 45 29 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c  VE).       || fl
2b670 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d  ags==(SQLITE_SHM
2b680 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45  _UNLOCK | SQLITE
2b690 5f 53 48 4d 5f 53 48 41 52 45 44 29 0a 20 20 20  _SHM_SHARED).   
2b6a0 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53      || flags==(S
2b6b0 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b  QLITE_SHM_UNLOCK
2b6c0 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58   | SQLITE_SHM_EX
2b6d0 43 4c 55 53 49 56 45 29 20 29 3b 0a 20 20 61 73  CLUSIVE) );.  as
2b6e0 73 65 72 74 28 20 6e 3d 3d 31 20 7c 7c 20 28 66  sert( n==1 || (f
2b6f0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 53 48  lags & SQLITE_SH
2b700 4d 5f 45 58 43 4c 55 53 49 56 45 29 21 3d 30 20  M_EXCLUSIVE)!=0 
2b710 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 68  );.  assert( pSh
2b720 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 7c 7c 20 70  mNode->h>=0 || p
2b730 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50  DbFd->pInode->bP
2b740 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 31 20 29 3b  rocessLock==1 );
2b750 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d 4e  .  assert( pShmN
2b760 6f 64 65 2d 3e 68 3c 30 20 7c 7c 20 70 44 62 46  ode->h<0 || pDbF
2b770 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63  d->pInode->bProc
2b780 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 0a 20  essLock==0 );.. 
2b790 20 6d 61 73 6b 20 3d 20 28 31 3c 3c 28 6f 66 73   mask = (1<<(ofs
2b7a0 74 2b 6e 29 29 20 2d 20 28 31 3c 3c 6f 66 73 74  t+n)) - (1<<ofst
2b7b0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 31  );.  assert( n>1
2b7c0 20 7c 7c 20 6d 61 73 6b 3d 3d 28 31 3c 3c 6f 66   || mask==(1<<of
2b7d0 73 74 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  st) );.  sqlite3
2b7e0 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68  _mutex_enter(pSh
2b7f0 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20  mNode->mutex);. 
2b800 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c   if( flags & SQL
2b810 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 29  ITE_SHM_UNLOCK )
2b820 7b 0a 20 20 20 20 75 31 36 20 61 6c 6c 4d 61 73  {.    u16 allMas
2b830 6b 20 3d 20 30 3b 20 2f 2a 20 4d 61 73 6b 20 6f  k = 0; /* Mask o
2b840 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20  f locks held by 
2b850 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 0a 20 20 20  siblings */..   
2b860 20 2f 2a 20 53 65 65 20 69 66 20 61 6e 79 20 73   /* See if any s
2b870 69 62 6c 69 6e 67 73 20 68 6f 6c 64 20 74 68 69  iblings hold thi
2b880 73 20 73 61 6d 65 20 6c 6f 63 6b 20 2a 2f 0a 20  s same lock */. 
2b890 20 20 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f     for(pX=pShmNo
2b8a0 64 65 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20  de->pFirst; pX; 
2b8b0 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20  pX=pX->pNext){. 
2b8c0 20 20 20 20 20 69 66 28 20 70 58 3d 3d 70 20 29       if( pX==p )
2b8d0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
2b8e0 20 61 73 73 65 72 74 28 20 28 70 58 2d 3e 65 78   assert( (pX->ex
2b8f0 63 6c 4d 61 73 6b 20 26 20 28 70 2d 3e 65 78 63  clMask & (p->exc
2b900 6c 4d 61 73 6b 7c 70 2d 3e 73 68 61 72 65 64 4d  lMask|p->sharedM
2b910 61 73 6b 29 29 3d 3d 30 20 29 3b 0a 20 20 20 20  ask))==0 );.    
2b920 20 20 61 6c 6c 4d 61 73 6b 20 7c 3d 20 70 58 2d    allMask |= pX-
2b930 3e 73 68 61 72 65 64 4d 61 73 6b 3b 0a 20 20 20  >sharedMask;.   
2b940 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 6e 6c 6f 63   }..    /* Unloc
2b950 6b 20 74 68 65 20 73 79 73 74 65 6d 2d 6c 65 76  k the system-lev
2b960 65 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20  el locks */.    
2b970 69 66 28 20 28 6d 61 73 6b 20 26 20 61 6c 6c 4d  if( (mask & allM
2b980 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ask)==0 ){.     
2b990 20 72 63 20 3d 20 75 6e 69 78 53 68 6d 53 79 73   rc = unixShmSys
2b9a0 74 65 6d 4c 6f 63 6b 28 70 44 62 46 64 2c 20 46  temLock(pDbFd, F
2b9b0 5f 55 4e 4c 43 4b 2c 20 6f 66 73 74 2b 55 4e 49  _UNLCK, ofst+UNI
2b9c0 58 5f 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a  X_SHM_BASE, n);.
2b9d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2b9e0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2b9f0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55  .    }..    /* U
2ba00 6e 64 6f 20 74 68 65 20 6c 6f 63 61 6c 20 6c 6f  ndo the local lo
2ba10 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 72  cks */.    if( r
2ba20 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2ba30 20 20 20 20 20 20 70 2d 3e 65 78 63 6c 4d 61 73        p->exclMas
2ba40 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20  k &= ~mask;.    
2ba50 20 20 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20    p->sharedMask 
2ba60 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 7d 20  &= ~mask;.    } 
2ba70 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61  .  }else if( fla
2ba80 67 73 20 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f  gs & SQLITE_SHM_
2ba90 53 48 41 52 45 44 20 29 7b 0a 20 20 20 20 75 31  SHARED ){.    u1
2baa0 36 20 61 6c 6c 53 68 61 72 65 64 20 3d 20 30 3b  6 allShared = 0;
2bab0 20 20 2f 2a 20 55 6e 69 6f 6e 20 6f 66 20 6c 6f    /* Union of lo
2bac0 63 6b 73 20 68 65 6c 64 20 62 79 20 63 6f 6e 6e  cks held by conn
2bad0 65 63 74 69 6f 6e 73 20 6f 74 68 65 72 20 74 68  ections other th
2bae0 61 6e 20 22 70 22 20 2a 2f 0a 0a 20 20 20 20 2f  an "p" */..    /
2baf0 2a 20 46 69 6e 64 20 6f 75 74 20 77 68 69 63 68  * Find out which
2bb00 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 61 72   shared locks ar
2bb10 65 20 61 6c 72 65 61 64 79 20 68 65 6c 64 20 62  e already held b
2bb20 79 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63  y sibling connec
2bb30 74 69 6f 6e 73 2e 0a 20 20 20 20 2a 2a 20 49 66  tions..    ** If
2bb40 20 61 6e 79 20 73 69 62 6c 69 6e 67 20 61 6c 72   any sibling alr
2bb50 65 61 64 79 20 68 6f 6c 64 73 20 61 6e 20 65 78  eady holds an ex
2bb60 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2c 20 67 6f  clusive lock, go
2bb70 20 61 68 65 61 64 20 61 6e 64 20 72 65 74 75 72   ahead and retur
2bb80 6e 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f  n.    ** SQLITE_
2bb90 42 55 53 59 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  BUSY..    */.   
2bba0 20 66 6f 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65   for(pX=pShmNode
2bbb0 2d 3e 70 46 69 72 73 74 3b 20 70 58 3b 20 70 58  ->pFirst; pX; pX
2bbc0 3d 70 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  =pX->pNext){.   
2bbd0 20 20 20 69 66 28 20 28 70 58 2d 3e 65 78 63 6c     if( (pX->excl
2bbe0 4d 61 73 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20  Mask & mask)!=0 
2bbf0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
2bc00 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
2bc10 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2bc20 20 20 7d 0a 20 20 20 20 20 20 61 6c 6c 53 68 61    }.      allSha
2bc30 72 65 64 20 7c 3d 20 70 58 2d 3e 73 68 61 72 65  red |= pX->share
2bc40 64 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  dMask;.    }..  
2bc50 20 20 2f 2a 20 47 65 74 20 73 68 61 72 65 64 20    /* Get shared 
2bc60 6c 6f 63 6b 73 20 61 74 20 74 68 65 20 73 79 73  locks at the sys
2bc70 74 65 6d 20 6c 65 76 65 6c 2c 20 69 66 20 6e 65  tem level, if ne
2bc80 63 65 73 73 61 72 79 20 2a 2f 0a 20 20 20 20 69  cessary */.    i
2bc90 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2bca0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 61   ){.      if( (a
2bcb0 6c 6c 53 68 61 72 65 64 20 26 20 6d 61 73 6b 29  llShared & mask)
2bcc0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
2bcd0 63 20 3d 20 75 6e 69 78 53 68 6d 53 79 73 74 65  c = unixShmSyste
2bce0 6d 4c 6f 63 6b 28 70 44 62 46 64 2c 20 46 5f 52  mLock(pDbFd, F_R
2bcf0 44 4c 43 4b 2c 20 6f 66 73 74 2b 55 4e 49 58 5f  DLCK, ofst+UNIX_
2bd00 53 48 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20  SHM_BASE, n);.  
2bd10 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2bd20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
2bd30 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  K;.      }.    }
2bd40 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 74 68 65  ..    /* Get the
2bd50 20 6c 6f 63 61 6c 20 73 68 61 72 65 64 20 6c 6f   local shared lo
2bd60 63 6b 73 20 2a 2f 0a 20 20 20 20 69 66 28 20 72  cks */.    if( r
2bd70 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2bd80 20 20 20 20 20 20 70 2d 3e 73 68 61 72 65 64 4d        p->sharedM
2bd90 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20  ask |= mask;.   
2bda0 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
2bdb0 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 6e 6f 20  /* Make sure no 
2bdc0 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69  sibling connecti
2bdd0 6f 6e 73 20 68 6f 6c 64 20 6c 6f 63 6b 73 20 74  ons hold locks t
2bde0 68 61 74 20 77 69 6c 6c 20 62 6c 6f 63 6b 20 74  hat will block t
2bdf0 68 69 73 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 2e  his.    ** lock.
2be00 20 20 49 66 20 61 6e 79 20 64 6f 2c 20 72 65 74    If any do, ret
2be10 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 20  urn SQLITE_BUSY 
2be20 72 69 67 68 74 20 61 77 61 79 2e 0a 20 20 20 20  right away..    
2be30 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53  */.    for(pX=pS
2be40 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20  hmNode->pFirst; 
2be50 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74  pX; pX=pX->pNext
2be60 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 58  ){.      if( (pX
2be70 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20 6d 61 73  ->exclMask & mas
2be80 6b 29 21 3d 30 20 7c 7c 20 28 70 58 2d 3e 73 68  k)!=0 || (pX->sh
2be90 61 72 65 64 4d 61 73 6b 20 26 20 6d 61 73 6b 29  aredMask & mask)
2bea0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  !=0 ){.        r
2beb0 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
2bec0 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
2bed0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2bee0 0a 20 20 20 20 2f 2a 20 47 65 74 20 74 68 65 20  .    /* Get the 
2bef0 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20  exclusive locks 
2bf00 61 74 20 74 68 65 20 73 79 73 74 65 6d 20 6c 65  at the system le
2bf10 76 65 6c 2e 20 20 54 68 65 6e 20 69 66 20 73 75  vel.  Then if su
2bf20 63 63 65 73 73 66 75 6c 0a 20 20 20 20 2a 2a 20  ccessful.    ** 
2bf30 61 6c 73 6f 20 6d 61 72 6b 20 74 68 65 20 6c 6f  also mark the lo
2bf40 63 61 6c 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61  cal connection a
2bf50 73 20 62 65 69 6e 67 20 6c 6f 63 6b 65 64 2e 0a  s being locked..
2bf60 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72      */.    if( r
2bf70 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2bf80 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 53        rc = unixS
2bf90 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 44 62  hmSystemLock(pDb
2bfa0 46 64 2c 20 46 5f 57 52 4c 43 4b 2c 20 6f 66 73  Fd, F_WRLCK, ofs
2bfb0 74 2b 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45 2c  t+UNIX_SHM_BASE,
2bfc0 20 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   n);.      if( r
2bfd0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2bfe0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2bff0 28 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26  (p->sharedMask &
2c000 20 6d 61 73 6b 29 3d 3d 30 20 29 3b 0a 20 20 20   mask)==0 );.   
2c010 20 20 20 20 20 70 2d 3e 65 78 63 6c 4d 61 73 6b       p->exclMask
2c020 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20   |= mask;.      
2c030 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  }.    }.  }.  sq
2c040 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
2c050 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  e(pShmNode->mute
2c060 78 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  x);.  OSTRACE(("
2c070 53 48 4d 2d 4c 4f 43 4b 20 73 68 6d 69 64 2d 25  SHM-LOCK shmid-%
2c080 64 2c 20 70 69 64 2d 25 64 20 67 6f 74 20 25 30  d, pid-%d got %0
2c090 33 78 2c 25 30 33 78 5c 6e 22 2c 0a 20 20 20 20  3x,%03x\n",.    
2c0a0 20 20 20 20 20 20 20 70 2d 3e 69 64 2c 20 6f 73         p->id, os
2c0b0 47 65 74 70 69 64 28 30 29 2c 20 70 2d 3e 73 68  Getpid(0), p->sh
2c0c0 61 72 65 64 4d 61 73 6b 2c 20 70 2d 3e 65 78 63  aredMask, p->exc
2c0d0 6c 4d 61 73 6b 29 29 3b 0a 20 20 72 65 74 75 72  lMask));.  retur
2c0e0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  n rc;.}../*.** I
2c0f0 6d 70 6c 65 6d 65 6e 74 20 61 20 6d 65 6d 6f 72  mplement a memor
2c100 79 20 62 61 72 72 69 65 72 20 6f 72 20 6d 65 6d  y barrier or mem
2c110 6f 72 79 20 66 65 6e 63 65 20 6f 6e 20 73 68 61  ory fence on sha
2c120 72 65 64 20 6d 65 6d 6f 72 79 2e 20 20 0a 2a 2a  red memory.  .**
2c130 0a 2a 2a 20 41 6c 6c 20 6c 6f 61 64 73 20 61 6e  .** All loads an
2c140 64 20 73 74 6f 72 65 73 20 62 65 67 75 6e 20 62  d stores begun b
2c150 65 66 6f 72 65 20 74 68 65 20 62 61 72 72 69 65  efore the barrie
2c160 72 20 6d 75 73 74 20 63 6f 6d 70 6c 65 74 65 20  r must complete 
2c170 62 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 20 6c 6f  before.** any lo
2c180 61 64 20 6f 72 20 73 74 6f 72 65 20 62 65 67 75  ad or store begu
2c190 6e 20 61 66 74 65 72 20 74 68 65 20 62 61 72 72  n after the barr
2c1a0 69 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ier..*/.static v
2c1b0 6f 69 64 20 75 6e 69 78 53 68 6d 42 61 72 72 69  oid unixShmBarri
2c1c0 65 72 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  er(.  sqlite3_fi
2c1d0 6c 65 20 2a 66 64 20 20 20 20 20 20 20 20 20 20  le *fd          
2c1e0 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
2c1f0 65 20 66 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74  e file holding t
2c200 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  he shared memory
2c210 20 2a 2f 0a 29 7b 0a 20 20 55 4e 55 53 45 44 5f   */.){.  UNUSED_
2c220 50 41 52 41 4d 45 54 45 52 28 66 64 29 3b 0a 20  PARAMETER(fd);. 
2c230 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
2c240 29 3b 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75  );.  unixLeaveMu
2c250 74 65 78 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  tex();.}../*.** 
2c260 43 6c 6f 73 65 20 61 20 63 6f 6e 6e 65 63 74 69  Close a connecti
2c270 6f 6e 20 74 6f 20 73 68 61 72 65 64 2d 6d 65 6d  on to shared-mem
2c280 6f 72 79 2e 20 20 44 65 6c 65 74 65 20 74 68 65  ory.  Delete the
2c290 20 75 6e 64 65 72 6c 79 69 6e 67 20 0a 2a 2a 20   underlying .** 
2c2a0 73 74 6f 72 61 67 65 20 69 66 20 64 65 6c 65 74  storage if delet
2c2b0 65 46 6c 61 67 20 69 73 20 74 72 75 65 2e 0a 2a  eFlag is true..*
2c2c0 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73  *.** If there is
2c2d0 20 6e 6f 20 73 68 61 72 65 64 20 6d 65 6d 6f 72   no shared memor
2c2e0 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  y associated wit
2c2f0 68 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  h the connection
2c300 20 74 68 65 6e 20 74 68 69 73 0a 2a 2a 20 72 6f   then this.** ro
2c310 75 74 69 6e 65 20 69 73 20 61 20 68 61 72 6d 6c  utine is a harml
2c320 65 73 73 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  ess no-op..*/.st
2c330 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 68 6d  atic int unixShm
2c340 55 6e 6d 61 70 28 0a 20 20 73 71 6c 69 74 65 33  Unmap(.  sqlite3
2c350 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20 20 20 20  _file *fd,      
2c360 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2c370 75 6e 64 65 72 6c 79 69 6e 67 20 64 61 74 61 62  underlying datab
2c380 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  ase file */.  in
2c390 74 20 64 65 6c 65 74 65 46 6c 61 67 20 20 20 20  t deleteFlag    
2c3a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2c3b0 20 44 65 6c 65 74 65 20 73 68 61 72 65 64 2d 6d   Delete shared-m
2c3c0 65 6d 6f 72 79 20 69 66 20 74 72 75 65 20 2a 2f  emory if true */
2c3d0 0a 29 7b 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70  .){.  unixShm *p
2c3e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2c3f0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e        /* The con
2c400 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65 20 63 6c  nection to be cl
2c410 6f 73 65 64 20 2a 2f 0a 20 20 75 6e 69 78 53 68  osed */.  unixSh
2c420 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b  mNode *pShmNode;
2c430 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2c440 20 75 6e 64 65 72 6c 79 69 6e 67 20 73 68 61 72   underlying shar
2c450 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20 2a  ed-memory file *
2c460 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 2a 70 70  /.  unixShm **pp
2c470 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2c480 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69      /* For loopi
2c490 6e 67 20 6f 76 65 72 20 73 69 62 6c 69 6e 67 20  ng over sibling 
2c4a0 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a 20  connections */. 
2c4b0 20 75 6e 69 78 46 69 6c 65 20 2a 70 44 62 46 64   unixFile *pDbFd
2c4c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2c4d0 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69   /* The underlyi
2c4e0 6e 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ng database file
2c4f0 20 2a 2f 0a 0a 20 20 70 44 62 46 64 20 3d 20 28   */..  pDbFd = (
2c500 75 6e 69 78 46 69 6c 65 2a 29 66 64 3b 0a 20 20  unixFile*)fd;.  
2c510 70 20 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b  p = pDbFd->pShm;
2c520 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
2c530 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2c540 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e    pShmNode = p->
2c550 70 53 68 6d 4e 6f 64 65 3b 0a 0a 20 20 61 73 73  pShmNode;..  ass
2c560 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 3d 3d 70  ert( pShmNode==p
2c570 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53  DbFd->pInode->pS
2c580 68 6d 4e 6f 64 65 20 29 3b 0a 20 20 61 73 73 65  hmNode );.  asse
2c590 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49  rt( pShmNode->pI
2c5a0 6e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e  node==pDbFd->pIn
2c5b0 6f 64 65 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 6d  ode );..  /* Rem
2c5c0 6f 76 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70  ove connection p
2c5d0 20 66 72 6f 6d 20 74 68 65 20 73 65 74 20 6f 66   from the set of
2c5e0 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 73 73   connections ass
2c5f0 6f 63 69 61 74 65 64 0a 20 20 2a 2a 20 77 69 74  ociated.  ** wit
2c600 68 20 70 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20  h pShmNode */.  
2c610 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
2c620 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  ter(pShmNode->mu
2c630 74 65 78 29 3b 0a 20 20 66 6f 72 28 70 70 3d 26  tex);.  for(pp=&
2c640 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74  pShmNode->pFirst
2c650 3b 20 28 2a 70 70 29 21 3d 70 3b 20 70 70 20 3d  ; (*pp)!=p; pp =
2c660 20 26 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29 7b   &(*pp)->pNext){
2c670 7d 0a 20 20 2a 70 70 20 3d 20 70 2d 3e 70 4e 65  }.  *pp = p->pNe
2c680 78 74 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20 74  xt;..  /* Free t
2c690 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20  he connection p 
2c6a0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  */.  sqlite3_fre
2c6b0 65 28 70 29 3b 0a 20 20 70 44 62 46 64 2d 3e 70  e(p);.  pDbFd->p
2c6c0 53 68 6d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  Shm = 0;.  sqlit
2c6d0 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70  e3_mutex_leave(p
2c6e0 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b  ShmNode->mutex);
2c6f0 0a 0a 20 20 2f 2a 20 49 66 20 70 53 68 6d 4e 6f  ..  /* If pShmNo
2c700 64 65 2d 3e 6e 52 65 66 20 68 61 73 20 72 65 61  de->nRef has rea
2c710 63 68 65 64 20 30 2c 20 74 68 65 6e 20 63 6c 6f  ched 0, then clo
2c720 73 65 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  se the underlyin
2c730 67 0a 20 20 2a 2a 20 73 68 61 72 65 64 2d 6d 65  g.  ** shared-me
2c740 6d 6f 72 79 20 66 69 6c 65 2c 20 74 6f 6f 20 2a  mory file, too *
2c750 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74  /.  unixEnterMut
2c760 65 78 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ex();.  assert( 
2c770 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3e 30  pShmNode->nRef>0
2c780 20 29 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e   );.  pShmNode->
2c790 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 53  nRef--;.  if( pS
2c7a0 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3d 3d 30 20  hmNode->nRef==0 
2c7b0 29 7b 0a 20 20 20 20 69 66 28 20 64 65 6c 65 74  ){.    if( delet
2c7c0 65 46 6c 61 67 20 26 26 20 70 53 68 6d 4e 6f 64  eFlag && pShmNod
2c7d0 65 2d 3e 68 3e 3d 30 20 29 20 7b 0a 20 20 20 20  e->h>=0 ) {.    
2c7e0 20 20 69 66 20 28 64 65 6c 65 74 65 46 6c 61 67    if (deleteFlag
2c7f0 20 3d 3d 20 31 29 20 7b 20 0a 20 20 20 20 20 20   == 1) { .      
2c800 20 20 6f 73 55 6e 6c 69 6e 6b 28 70 53 68 6d 4e    osUnlink(pShmN
2c810 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b  ode->zFilename);
2c820 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 69 66  .      } else if
2c830 20 28 64 65 6c 65 74 65 46 6c 61 67 20 3d 3d 20   (deleteFlag == 
2c840 32 29 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  2) {.        /* 
2c850 66 74 72 75 6e 63 61 74 65 28 70 53 68 6d 4e 6f  ftruncate(pShmNo
2c860 64 65 2d 3e 68 2c 20 33 32 20 2a 20 31 30 32 34  de->h, 32 * 1024
2c870 29 3b 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20  ); */.      }.  
2c880 20 20 7d 0a 20 20 20 20 75 6e 69 78 53 68 6d 50    }.    unixShmP
2c890 75 72 67 65 28 70 44 62 46 64 29 3b 0a 20 20 7d  urge(pDbFd);.  }
2c8a0 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65  .  unixLeaveMute
2c8b0 78 28 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53  x();..  return S
2c8c0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 23 65  QLITE_OK;.}...#e
2c8d0 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 75 6e 69  lse.# define uni
2c8e0 78 53 68 6d 4d 61 70 20 20 20 20 20 30 0a 23 20  xShmMap     0.# 
2c8f0 64 65 66 69 6e 65 20 75 6e 69 78 53 68 6d 4c 6f  define unixShmLo
2c900 63 6b 20 20 20 20 30 0a 23 20 64 65 66 69 6e 65  ck    0.# define
2c910 20 75 6e 69 78 53 68 6d 42 61 72 72 69 65 72 20   unixShmBarrier 
2c920 30 0a 23 20 64 65 66 69 6e 65 20 75 6e 69 78 53  0.# define unixS
2c930 68 6d 55 6e 6d 61 70 20 20 20 30 0a 23 65 6e 64  hmUnmap   0.#end
2c940 69 66 20 2f 2a 20 23 69 66 6e 64 65 66 20 53 51  if /* #ifndef SQ
2c950 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f  LITE_OMIT_WAL */
2c960 0a 0a 23 69 66 20 28 53 51 4c 49 54 45 5f 45 4e  ..#if (SQLITE_EN
2c970 41 42 4c 45 5f 41 50 50 4c 45 5f 53 50 49 3e 30  ABLE_APPLE_SPI>0
2c980 29 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41  ) && defined(__A
2c990 50 50 4c 45 5f 5f 29 0a 73 74 61 74 69 63 20 63  PPLE__).static c
2c9a0 6f 6e 73 74 20 63 68 61 72 20 2a 75 6e 69 78 54  onst char *unixT
2c9b0 65 6d 70 46 69 6c 65 44 69 72 28 76 6f 69 64 29  empFileDir(void)
2c9c0 3b 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  ;..static int un
2c9d0 69 78 49 6e 76 61 6c 69 64 61 74 65 53 75 70 70  ixInvalidateSupp
2c9e0 6f 72 74 46 69 6c 65 73 28 75 6e 69 78 46 69 6c  ortFiles(unixFil
2c9f0 65 20 2a 70 46 69 6c 65 2c 20 69 6e 74 20 73 6b  e *pFile, int sk
2ca00 69 70 57 41 4c 29 20 7b 0a 20 20 63 68 61 72 20  ipWAL) {.  char 
2ca10 6a 50 61 74 68 5b 4d 41 58 50 41 54 48 4c 45 4e  jPath[MAXPATHLEN
2ca20 2b 39 5d 3b 0a 20 20 69 6e 74 20 7a 4c 65 6e 20  +9];.  int zLen 
2ca30 3d 20 73 74 72 6c 63 70 79 28 6a 50 61 74 68 2c  = strlcpy(jPath,
2ca40 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 2c 20 4d   pFile->zPath, M
2ca50 41 58 50 41 54 48 4c 45 4e 2b 39 29 3b 0a 20 20  AXPATHLEN+9);.  
2ca60 69 66 28 20 7a 4c 65 6e 3c 4d 41 58 50 41 54 48  if( zLen<MAXPATH
2ca70 4c 45 4e 20 29 7b 0a 20 20 20 20 73 69 7a 65 5f  LEN ){.    size_
2ca80 74 20 6a 4c 65 6e 3b 0a 20 20 20 20 63 6f 6e 73  t jLen;.    cons
2ca90 74 20 63 68 61 72 20 65 78 74 65 6e 73 69 6f 6e  t char extension
2caa0 73 5b 33 5d 5b 39 5d 20 3d 20 7b 20 22 2d 77 61  s[3][9] = { "-wa
2cab0 6c 22 2c 20 22 2d 6a 6f 75 72 6e 61 6c 22 2c 20  l", "-journal", 
2cac0 22 2d 73 68 6d 22 20 7d 3b 0a 20 20 20 20 69 6e  "-shm" };.    in
2cad0 74 20 6a 20 3d 20 28 73 6b 69 70 57 41 4c 20 3f  t j = (skipWAL ?
2cae0 20 31 20 3a 20 30 29 3b 0a 20 20 20 20 66 6f 72   1 : 0);.    for
2caf0 28 20 3b 20 6a 3c 33 3b 20 6a 2b 2b 20 29 7b 0a  ( ; j<3; j++ ){.
2cb00 20 20 20 20 20 20 0a 20 20 20 20 20 20 2f 2a 20        .      /* 
2cb10 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
2cb20 74 68 65 20 73 68 6d 20 66 69 6c 65 20 69 73 20  the shm file is 
2cb30 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20 66  already opened f
2cb40 6f 72 20 74 68 69 73 20 70 46 69 6c 65 20 2a 2f  or this pFile */
2cb50 0a 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 32 20  .      if( j==2 
2cb60 29 7b 0a 20 20 20 20 20 20 20 20 75 6e 69 78 45  ){.        unixE
2cb70 6e 74 65 72 4d 75 74 65 78 28 29 3b 20 2f 2a 20  nterMutex(); /* 
2cb80 42 65 63 61 75 73 65 20 70 46 69 6c 65 2d 3e 70  Because pFile->p
2cb90 49 6e 6f 64 65 20 69 73 20 73 68 61 72 65 64 20  Inode is shared 
2cba0 61 63 72 6f 73 73 20 74 68 72 65 61 64 73 20 2a  across threads *
2cbb0 2f 0a 20 20 20 20 20 20 20 20 75 6e 69 78 53 68  /.        unixSh
2cbc0 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 20  mNode *pShmNode 
2cbd0 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d  = pFile->pInode-
2cbe0 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 20 20 20  >pShmNode;.     
2cbf0 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 20     if( pShmNode 
2cc00 26 26 20 21 70 53 68 6d 4e 6f 64 65 2d 3e 69 73  && !pShmNode->is
2cc10 52 65 61 64 6f 6e 6c 79 20 29 7b 0a 20 20 20 20  Readonly ){.    
2cc20 20 20 20 20 20 20 73 74 72 75 63 74 20 73 74 61        struct sta
2cc30 74 20 73 53 74 61 74 3b 0a 20 20 20 20 20 20 20  t sStat;.       
2cc40 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
2cc50 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d  _enter(pShmNode-
2cc60 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20 20  >mutex);.       
2cc70 20 20 20 0a 20 20 20 20 20 20 20 20 20 20 69 66     .          if
2cc80 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30  ( pShmNode->h>=0
2cc90 20 26 26 20 21 6f 73 46 73 74 61 74 28 70 53 68   && !osFstat(pSh
2cca0 6d 4e 6f 64 65 2d 3e 68 2c 20 26 73 53 74 61 74  mNode->h, &sStat
2ccb0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
2ccc0 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 73   unsigned long s
2ccd0 69 7a 65 20 3d 20 28 73 53 74 61 74 2e 73 74 5f  ize = (sStat.st_
2cce0 73 69 7a 65 3c 34 29 20 3f 20 73 53 74 61 74 2e  size<4) ? sStat.
2ccf0 73 74 5f 73 69 7a 65 20 3a 20 34 3b 0a 20 20 20  st_size : 4;.   
2cd00 20 20 20 20 20 20 20 20 20 69 66 28 20 73 69 7a           if( siz
2cd10 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  e>0 ){.         
2cd20 20 20 20 20 20 62 7a 65 72 6f 28 70 53 68 6d 4e       bzero(pShmN
2cd30 6f 64 65 2d 3e 61 70 52 65 67 69 6f 6e 5b 30 5d  ode->apRegion[0]
2cd40 2c 20 73 69 7a 65 29 3b 0a 20 20 20 20 20 20 20  , size);.       
2cd50 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d         sqlite3_m
2cd60 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e  utex_leave(pShmN
2cd70 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20  ode->mutex);.   
2cd80 20 20 20 20 20 20 20 20 20 20 20 75 6e 69 78 4c             unixL
2cd90 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 20  eaveMutex();.   
2cda0 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
2cdb0 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nue;.           
2cdc0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
2cdd0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2cde0 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68  _mutex_leave(pSh
2cdf0 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20  mNode->mutex);. 
2ce00 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2ce10 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
2ce20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
2ce30 20 6a 4c 65 6e 20 3d 20 73 74 72 6c 63 70 79 28   jLen = strlcpy(
2ce40 26 6a 50 61 74 68 5b 7a 4c 65 6e 5d 2c 20 65 78  &jPath[zLen], ex
2ce50 74 65 6e 73 69 6f 6e 73 5b 6a 5d 2c 20 39 29 3b  tensions[j], 9);
2ce60 0a 20 20 20 20 20 20 69 66 28 20 6a 4c 65 6e 20  .      if( jLen 
2ce70 3c 20 39 20 29 7b 0a 20 20 20 20 20 20 20 20 69  < 9 ){.        i
2ce80 6e 74 20 6a 66 6c 61 67 73 20 3d 20 28 6a 3c 32  nt jflags = (j<2
2ce90 29 20 3f 20 4f 5f 54 52 55 4e 43 20 3a 20 4f 5f  ) ? O_TRUNC : O_
2cea0 52 44 57 52 3b 0a 20 20 20 20 20 20 20 20 69 6e  RDWR;.        in
2ceb0 74 20 6a 66 64 20 3d 20 6f 70 65 6e 28 6a 50 61  t jfd = open(jPa
2cec0 74 68 2c 20 6a 66 6c 61 67 73 29 3b 0a 20 20 20  th, jflags);.   
2ced0 20 20 20 20 20 69 66 28 20 6a 66 64 3d 3d 28 2d       if( jfd==(-
2cee0 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  1) ){.          
2cef0 69 66 28 20 65 72 72 6e 6f 21 3d 45 4e 4f 45 4e  if( errno!=ENOEN
2cf00 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  T ){.           
2cf10 20 70 65 72 72 6f 72 28 6a 50 61 74 68 29 3b 0a   perror(jPath);.
2cf20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2cf30 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
2cf40 20 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 32 20         if( j==2 
2cf50 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
2cf60 74 72 75 63 74 20 73 74 61 74 20 73 53 74 61 74  truct stat sStat
2cf70 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
2cf80 28 20 21 6f 73 46 73 74 61 74 28 6a 66 64 2c 20  ( !osFstat(jfd, 
2cf90 26 73 53 74 61 74 29 20 29 7b 0a 20 20 20 20 20  &sStat) ){.     
2cfa0 20 20 20 20 20 20 20 20 20 75 6e 73 69 67 6e 65           unsigne
2cfb0 64 20 6c 6f 6e 67 20 73 69 7a 65 20 3d 20 28 73  d long size = (s
2cfc0 53 74 61 74 2e 73 74 5f 73 69 7a 65 3c 34 29 20  Stat.st_size<4) 
2cfd0 3f 20 73 53 74 61 74 2e 73 74 5f 73 69 7a 65 20  ? sStat.st_size 
2cfe0 3a 20 34 3b 0a 20 20 20 20 20 20 20 20 20 20 20  : 4;.           
2cff0 20 20 20 69 66 28 20 73 69 7a 65 3e 30 20 29 7b     if( size>0 ){
2d000 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2d010 20 75 69 6e 74 33 32 5f 74 20 7a 65 72 6f 20 3d   uint32_t zero =
2d020 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
2d030 20 20 20 20 70 77 72 69 74 65 28 6a 66 64 2c 20      pwrite(jfd, 
2d040 26 7a 65 72 6f 2c 20 28 73 69 7a 65 5f 74 29 73  &zero, (size_t)s
2d050 69 7a 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ize, 0);.       
2d060 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2d070 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2d080 20 7d 0a 20 20 20 20 20 20 20 20 20 20 66 73 79   }.          fsy
2d090 6e 63 28 6a 66 64 29 3b 0a 20 20 20 20 20 20 20  nc(jfd);.       
2d0a0 20 20 20 63 6c 6f 73 65 28 6a 66 64 29 3b 0a 20     close(jfd);. 
2d0b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2d0c0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
2d0d0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
2d0e0 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  ..static int uni
2d0f0 78 55 6e 73 61 66 65 54 72 75 6e 63 61 74 65 44  xUnsafeTruncateD
2d100 61 74 61 62 61 73 65 28 75 6e 69 78 46 69 6c 65  atabase(unixFile
2d110 20 2a 70 46 69 6c 65 29 7b 0a 20 20 2f 2a 20 74   *pFile){.  /* t
2d120 68 69 73 20 69 73 20 6e 61 73 74 79 20 26 20 62  his is nasty & b
2d130 61 64 2e 20 20 64 65 73 74 72 75 63 74 69 6f 6e  ad.  destruction
2d140 20 77 69 74 68 20 70 72 65 6a 75 64 69 63 65 2e   with prejudice.
2d150 20 20 77 65 27 6c 6c 20 6c 6f 73 65 20 61 6c 6c    we'll lose all
2d160 20 74 68 65 0a 20 20 2a 2a 20 66 69 6c 65 20 6c   the.  ** file l
2d170 6f 63 6b 73 20 69 6e 20 74 68 69 73 20 70 72 6f  ocks in this pro
2d180 63 65 73 73 2c 20 68 6f 77 65 76 65 72 2e 20 73  cess, however. s
2d190 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74  qlite3_file_cont
2d1a0 72 6f 6c 20 77 6f 72 6b 73 20 70 72 6f 70 65 72  rol works proper
2d1b0 6c 79 2e 0a 20 20 2a 2a 20 42 75 74 20 69 66 20  ly..  ** But if 
2d1c0 69 74 20 66 61 69 6c 73 2c 20 74 68 69 73 20 77  it fails, this w
2d1d0 6f 72 6b 73 20 61 70 70 72 6f 78 69 6d 61 74 65  orks approximate
2d1e0 6c 79 0a 20 20 2a 2f 0a 20 20 63 68 61 72 20 6a  ly.  */.  char j
2d1f0 6f 75 72 6e 61 6c 50 61 74 68 5b 4d 41 58 50 41  ournalPath[MAXPA
2d200 54 48 4c 45 4e 5d 3b 0a 20 20 63 68 61 72 20 77  THLEN];.  char w
2d210 61 6c 50 61 74 68 5b 4d 41 58 50 41 54 48 4c 45  alPath[MAXPATHLE
2d220 4e 5d 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  N];.  int rc = S
2d230 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 0a 23 69 66  QLITE_OK;.  .#if
2d240 64 65 66 20 44 45 42 55 47 0a 20 20 66 70 72 69  def DEBUG.  fpri
2d250 6e 74 66 28 73 74 64 65 72 72 2c 20 22 46 6f 72  ntf(stderr, "For
2d260 63 65 20 74 72 75 6e 63 61 74 69 6e 67 20 64 61  ce truncating da
2d270 74 61 62 61 73 65 20 25 73 5c 6e 22 2c 20 70 46  tabase %s\n", pF
2d280 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 23 65 6e  ile->zPath);.#en
2d290 64 69 66 0a 20 20 73 74 72 6c 63 70 79 28 6a 6f  dif.  strlcpy(jo
2d2a0 75 72 6e 61 6c 50 61 74 68 2c 20 70 46 69 6c 65  urnalPath, pFile
2d2b0 2d 3e 7a 50 61 74 68 2c 20 4d 41 58 50 41 54 48  ->zPath, MAXPATH
2d2c0 4c 45 4e 29 3b 0a 20 20 73 74 72 6c 63 61 74 28  LEN);.  strlcat(
2d2d0 6a 6f 75 72 6e 61 6c 50 61 74 68 2c 20 22 2d 6a  journalPath, "-j
2d2e0 6f 75 72 6e 61 6c 22 2c 20 4d 41 58 50 41 54 48  ournal", MAXPATH
2d2f0 4c 45 4e 29 3b 0a 20 20 73 74 72 6c 63 70 79 28  LEN);.  strlcpy(
2d300 77 61 6c 50 61 74 68 2c 20 70 46 69 6c 65 2d 3e  walPath, pFile->
2d310 7a 50 61 74 68 2c 20 4d 41 58 50 41 54 48 4c 45  zPath, MAXPATHLE
2d320 4e 29 3b 0a 20 20 73 74 72 6c 63 61 74 28 77 61  N);.  strlcat(wa
2d330 6c 50 61 74 68 2c 20 22 2d 77 61 6c 22 2c 20 4d  lPath, "-wal", M
2d340 41 58 50 41 54 48 4c 45 4e 29 3b 0a 20 20 69 6e  AXPATHLEN);.  in
2d350 74 20 66 64 31 20 3d 20 70 46 69 6c 65 2d 3e 68  t fd1 = pFile->h
2d360 3b 0a 20 20 69 6e 74 20 72 65 73 75 6c 74 20 3d  ;.  int result =
2d370 20 30 3b 0a 20 20 72 65 73 75 6c 74 20 3d 20 66   0;.  result = f
2d380 74 72 75 6e 63 61 74 65 28 66 64 31 2c 20 30 6c  truncate(fd1, 0l
2d390 6c 29 3b 0a 20 20 69 66 20 28 72 65 73 75 6c 74  l);.  if (result
2d3a0 29 20 7b 0a 20 20 20 20 72 65 73 75 6c 74 20 3d  ) {.    result =
2d3b0 20 65 72 72 6e 6f 3b 0a 20 20 7d 0a 20 20 69 66   errno;.  }.  if
2d3c0 20 28 72 65 73 75 6c 74 29 20 7b 0a 20 20 20 20   (result) {.    
2d3d0 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
2d3e0 52 3b 0a 20 20 20 20 73 74 6f 72 65 4c 61 73 74  R;.    storeLast
2d3f0 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 72 65 73  Errno(pFile, res
2d400 75 6c 74 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 69  ult);.  }.  .  i
2d410 6e 74 20 66 64 32 20 3d 20 6f 70 65 6e 28 6a 6f  nt fd2 = open(jo
2d420 75 72 6e 61 6c 50 61 74 68 2c 20 4f 5f 52 44 57  urnalPath, O_RDW
2d430 52 29 3b 0a 20 20 69 6e 74 20 72 65 73 75 6c 74  R);.  int result
2d440 32 20 3d 20 30 3b 0a 20 20 69 66 20 28 66 64 32  2 = 0;.  if (fd2
2d450 20 3c 20 30 29 20 7b 0a 20 20 20 20 69 66 20 28   < 0) {.    if (
2d460 65 72 72 6e 6f 20 21 3d 20 45 4e 4f 45 4e 54 29  errno != ENOENT)
2d470 20 7b 0a 20 20 20 20 20 20 72 65 73 75 6c 74 32   {.      result2
2d480 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 7d 20   = errno;.    } 
2d490 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 72 65 73  else {.      res
2d4a0 75 6c 74 32 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  ult2 = 0;.    }.
2d4b0 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 72    } else {.    r
2d4c0 65 73 75 6c 74 32 20 3d 20 66 74 72 75 6e 63 61  esult2 = ftrunca
2d4d0 74 65 28 66 64 32 2c 20 30 6c 6c 29 3b 0a 20 20  te(fd2, 0ll);.  
2d4e0 20 20 69 66 20 28 72 65 73 75 6c 74 32 29 20 7b    if (result2) {
2d4f0 0a 20 20 20 20 20 20 72 65 73 75 6c 74 32 20 3d  .      result2 =
2d500 20 65 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20   errno;.    }.  
2d510 7d 0a 20 20 69 66 20 28 72 65 73 75 6c 74 32 20  }.  if (result2 
2d520 26 26 20 21 72 65 73 75 6c 74 29 20 7b 0a 20 20  && !result) {.  
2d530 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
2d540 45 52 52 3b 0a 20 20 20 20 73 74 6f 72 65 4c 61  ERR;.    storeLa
2d550 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 72  stErrno(pFile, r
2d560 65 73 75 6c 74 32 29 3b 0a 20 20 7d 0a 20 20 0a  esult2);.  }.  .
2d570 20 20 69 6e 74 20 66 64 33 20 3d 20 6f 70 65 6e    int fd3 = open
2d580 28 77 61 6c 50 61 74 68 2c 20 4f 5f 52 44 57 52  (walPath, O_RDWR
2d590 29 3b 0a 20 20 69 6e 74 20 72 65 73 75 6c 74 33  );.  int result3
2d5a0 20 3d 20 30 3b 0a 20 20 69 66 20 28 66 64 33 20   = 0;.  if (fd3 
2d5b0 3c 20 30 29 20 7b 0a 20 20 20 20 69 66 20 28 65  < 0) {.    if (e
2d5c0 72 72 6e 6f 20 21 3d 20 45 4e 4f 45 4e 54 29 20  rrno != ENOENT) 
2d5d0 7b 0a 20 20 20 20 20 20 72 65 73 75 6c 74 33 20  {.      result3 
2d5e0 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 7d 20 65  = errno;.    } e
2d5f0 6c 73 65 20 7b 0a 20 20 20 20 20 20 72 65 73 75  lse {.      resu
2d600 6c 74 33 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  lt3 = 0;.    }. 
2d610 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 72 65   } else {.    re
2d620 73 75 6c 74 33 20 3d 20 66 74 72 75 6e 63 61 74  sult3 = ftruncat
2d630 65 28 66 64 33 2c 20 30 6c 6c 29 3b 0a 20 20 20  e(fd3, 0ll);.   
2d640 20 69 66 20 28 72 65 73 75 6c 74 33 29 20 7b 0a   if (result3) {.
2d650 20 20 20 20 20 20 72 65 73 75 6c 74 33 20 3d 20        result3 = 
2d660 65 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d  errno;.    }.  }
2d670 0a 20 20 69 66 20 28 72 65 73 75 6c 74 33 20 26  .  if (result3 &
2d680 26 20 21 28 72 65 73 75 6c 74 20 7c 7c 20 72 65  & !(result || re
2d690 73 75 6c 74 32 29 29 20 7b 0a 20 20 20 20 72 63  sult2)) {.    rc
2d6a0 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b   = SQLITE_IOERR;
2d6b0 0a 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72  .    storeLastEr
2d6c0 72 6e 6f 28 70 46 69 6c 65 2c 20 72 65 73 75 6c  rno(pFile, resul
2d6d0 74 32 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 69 66  t2);.  }.  .  if
2d6e0 20 28 66 64 33 20 3e 3d 20 30 29 20 7b 0a 20 20   (fd3 >= 0) {.  
2d6f0 20 20 66 73 79 6e 63 28 66 64 33 29 3b 0a 20 20    fsync(fd3);.  
2d700 20 20 63 6c 6f 73 65 28 66 64 33 29 3b 0a 20 20    close(fd3);.  
2d710 7d 0a 20 20 69 66 20 28 66 64 32 20 3e 3d 20 30  }.  if (fd2 >= 0
2d720 29 20 7b 0a 20 20 20 20 66 73 79 6e 63 28 66 64  ) {.    fsync(fd
2d730 32 29 3b 0a 20 20 20 20 63 6c 6f 73 65 28 66 64  2);.    close(fd
2d740 32 29 3b 0a 20 20 7d 0a 20 20 66 73 79 6e 63 28  2);.  }.  fsync(
2d750 66 64 31 29 3b 0a 09 0a 20 20 72 65 74 75 72 6e  fd1);...  return
2d760 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69   rc;.}..static i
2d770 6e 74 20 75 6e 69 78 54 72 75 6e 63 61 74 65 44  nt unixTruncateD
2d780 61 74 61 62 61 73 65 28 75 6e 69 78 46 69 6c 65  atabase(unixFile
2d790 20 2a 70 46 69 6c 65 2c 20 69 6e 74 20 62 46 6c   *pFile, int bFl
2d7a0 61 67 73 29 20 7b 0a 20 20 73 71 6c 69 74 65 33  ags) {.  sqlite3
2d7b0 5f 66 69 6c 65 20 2a 69 64 20 3d 20 28 73 71 6c  _file *id = (sql
2d7c0 69 74 65 33 5f 66 69 6c 65 20 2a 29 70 46 69 6c  ite3_file *)pFil
2d7d0 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  e;.  int rc = SQ
2d7e0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 76 6f 69 64 20  LITE_OK;.  void 
2d7f0 2a 70 4c 6f 63 6b 20 3d 20 4e 55 4c 4c 3b 0a 20  *pLock = NULL;. 
2d800 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 30 3b 0a   int flags = 0;.
2d810 20 20 69 6e 74 20 63 6f 72 72 75 70 74 46 69 6c    int corruptFil
2d820 65 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 69 6e 74  eLock = 0;.  int
2d830 20 69 73 43 6f 72 72 75 70 74 20 3d 20 30 3b 0a   isCorrupt = 0;.
2d840 20 20 69 6e 74 20 66 6f 72 63 65 20 3d 20 28 62    int force = (b
2d850 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 54  Flags & SQLITE_T
2d860 52 55 4e 43 41 54 45 5f 46 4f 52 43 45 29 3b 0a  RUNCATE_FORCE);.
2d870 20 20 69 6e 74 20 73 61 66 65 46 61 69 6c 65 64    int safeFailed
2d880 20 3d 20 30 3b 0a 0a 23 69 66 20 53 51 4c 49 54   = 0;..#if SQLIT
2d890 45 5f 45 4e 41 42 4c 45 5f 44 41 54 41 5f 50 52  E_ENABLE_DATA_PR
2d8a0 4f 54 45 43 54 49 4f 4e 0a 20 20 66 6c 61 67 73  OTECTION.  flags
2d8b0 20 7c 3d 20 70 46 69 6c 65 2d 3e 70 72 6f 74 46   |= pFile->protF
2d8c0 6c 61 67 73 3b 0a 23 65 6e 64 69 66 0a 23 69 66  lags;.#endif.#if
2d8d0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
2d8e0 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 69  OCKING_STYLE.  i
2d8f0 66 28 20 69 73 50 72 6f 78 79 4c 6f 63 6b 69 6e  f( isProxyLockin
2d900 67 4d 6f 64 65 28 70 46 69 6c 65 29 20 29 7b 0a  gMode(pFile) ){.
2d910 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c      flags |= SQL
2d920 49 54 45 5f 4f 50 45 4e 5f 41 55 54 4f 50 52 4f  ITE_OPEN_AUTOPRO
2d930 58 59 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  XY;.  }.#endif. 
2d940 20 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33   .  rc = sqlite3
2d950 64 65 6d 6f 5f 73 75 70 65 72 6c 6f 63 6b 28 70  demo_superlock(p
2d960 46 69 6c 65 2d 3e 7a 50 61 74 68 2c 20 30 2c 20  File->zPath, 0, 
2d970 66 6c 61 67 73 2c 20 30 2c 20 30 2c 20 26 70 4c  flags, 0, 0, &pL
2d980 6f 63 6b 29 3b 0a 20 20 69 66 28 20 72 63 20 29  ock);.  if( rc )
2d990 7b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  {.    if( rc==SQ
2d9a0 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 7c 7c 20  LITE_CORRUPT || 
2d9b0 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54 41 44  rc==SQLITE_NOTAD
2d9c0 42 20 29 7b 0a 20 20 20 20 20 20 69 73 43 6f 72  B ){.      isCor
2d9d0 72 75 70 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  rupt = 1;.      
2d9e0 72 63 20 3d 20 73 71 6c 69 74 65 33 64 65 6d 6f  rc = sqlite3demo
2d9f0 5f 73 75 70 65 72 6c 6f 63 6b 5f 63 6f 72 72 75  _superlock_corru
2da00 70 74 28 69 64 2c 20 53 51 4c 49 54 45 5f 4c 4f  pt(id, SQLITE_LO
2da10 43 4b 5f 45 58 43 4c 55 53 49 56 45 2c 0a 20 20  CK_EXCLUSIVE,.  
2da20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2da30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2da40 20 20 20 20 20 20 20 26 63 6f 72 72 75 70 74 46         &corruptF
2da50 69 6c 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 7d 0a  ileLock);.    }.
2da60 20 20 20 20 69 66 28 20 72 63 20 26 26 20 21 66      if( rc && !f
2da70 6f 72 63 65 20 29 7b 0a 20 20 20 20 20 20 72 65  orce ){.      re
2da80 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
2da90 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
2daa0 4b 3b 20 2f 2a 20 49 67 6e 6f 72 65 20 74 68 65  K; /* Ignore the
2dab0 20 6c 6f 63 6b 69 6e 67 20 66 61 69 6c 75 72 65   locking failure
2dac0 20 69 66 20 66 6f 72 63 65 20 69 73 20 74 72 75   if force is tru
2dad0 65 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 28  e */.  }.  if( (
2dae0 62 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 54 52  bFlags&SQLITE_TR
2daf0 55 4e 43 41 54 45 5f 49 4e 49 54 49 41 4c 49 5a  UNCATE_INITIALIZ
2db00 45 5f 48 45 41 44 45 52 5f 4d 41 53 4b 29 21 3d  E_HEADER_MASK)!=
2db10 30 20 29 7b 0a 20 20 20 20 2f 2a 20 69 6e 69 74  0 ){.    /* init
2db20 69 61 6c 69 7a 65 20 61 20 6e 65 77 20 64 61 74  ialize a new dat
2db30 61 62 61 73 65 20 69 6e 20 54 4d 50 44 49 52 20  abase in TMPDIR 
2db40 61 6e 64 20 63 6f 70 79 20 74 68 65 20 63 6f 6e  and copy the con
2db50 74 65 6e 74 73 20 6f 76 65 72 20 2a 2f 0a 20 20  tents over */.  
2db60 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 74 44    const char *tD
2db70 69 72 20 3d 20 75 6e 69 78 54 65 6d 70 46 69 6c  ir = unixTempFil
2db80 65 44 69 72 28 29 3b 0a 20 20 20 20 69 6e 74 20  eDir();.    int 
2db90 74 44 69 72 4c 65 6e 20 3d 20 73 74 72 6c 65 6e  tDirLen = strlen
2dba0 28 74 44 69 72 29 3b 0a 20 20 20 20 69 6e 74 20  (tDir);.    int 
2dbb0 74 4c 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 68  tLen = sizeof(ch
2dbc0 61 72 29 20 2a 20 28 74 44 69 72 4c 65 6e 20 2b  ar) * (tDirLen +
2dbd0 20 31 32 29 3b 0a 20 20 20 20 63 68 61 72 20 2a   12);.    char *
2dbe0 74 44 62 50 61 74 68 20 3d 20 28 63 68 61 72 20  tDbPath = (char 
2dbf0 2a 29 6d 61 6c 6c 6f 63 28 74 4c 65 6e 29 3b 0a  *)malloc(tLen);.
2dc00 20 20 20 20 69 6e 74 20 74 46 64 20 3d 20 2d 31      int tFd = -1
2dc10 3b 0a 20 20 20 20 0a 20 20 20 20 73 74 72 6c 63  ;.    .    strlc
2dc20 70 79 28 74 44 62 50 61 74 68 2c 20 74 44 69 72  py(tDbPath, tDir
2dc30 2c 20 74 4c 65 6e 29 3b 0a 20 20 20 20 69 66 28  , tLen);.    if(
2dc40 20 74 44 62 50 61 74 68 5b 28 74 44 69 72 4c 65   tDbPath[(tDirLe
2dc50 6e 2d 31 29 5d 20 21 3d 20 27 2f 27 20 29 7b 0a  n-1)] != '/' ){.
2dc60 20 20 20 20 20 20 73 74 72 6c 63 61 74 28 74 44        strlcat(tD
2dc70 62 50 61 74 68 2c 20 22 2f 74 6d 70 64 62 58 58  bPath, "/tmpdbXX
2dc80 58 58 58 22 2c 20 74 4c 65 6e 29 3b 0a 20 20 20  XXX", tLen);.   
2dc90 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
2dca0 73 74 72 6c 63 61 74 28 74 44 62 50 61 74 68 2c  strlcat(tDbPath,
2dcb0 20 22 74 6d 70 64 62 58 58 58 58 58 22 2c 20 74   "tmpdbXXXXX", t
2dcc0 4c 65 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Len);.    }.    
2dcd0 74 46 64 20 3d 20 6d 6b 73 74 65 6d 70 28 74 44  tFd = mkstemp(tD
2dce0 62 50 61 74 68 29 3b 0a 20 20 20 20 69 66 28 20  bPath);.    if( 
2dcf0 74 46 64 3d 3d 2d 31 20 29 7b 0a 20 20 20 20 20  tFd==-1 ){.     
2dd00 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28   storeLastErrno(
2dd10 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 20  pFile, errno);. 
2dd20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
2dd30 5f 49 4f 45 52 52 3b 0a 20 20 20 20 20 20 73 61  _IOERR;.      sa
2dd40 66 65 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20  feFailed = 1;.  
2dd50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
2dd60 71 6c 69 74 65 33 20 2a 74 44 62 20 3d 20 4e 55  qlite3 *tDb = NU
2dd70 4c 4c 3b 0a 20 20 20 20 20 20 63 6f 70 79 66 69  LL;.      copyfi
2dd80 6c 65 5f 73 74 61 74 65 5f 74 20 73 3b 0a 20 20  le_state_t s;.  
2dd90 20 20 20 20 69 6e 74 20 74 72 63 20 3d 20 73 71      int trc = sq
2dda0 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 74 44  lite3_open_v2(tD
2ddb0 62 50 61 74 68 2c 20 26 74 44 62 2c 0a 20 20 20  bPath, &tDb,.   
2ddc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ddd0 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45  (SQLITE_OPEN_CRE
2dde0 41 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45  ATE | SQLITE_OPE
2ddf0 4e 5f 52 45 41 44 57 52 49 54 45 0a 20 20 20 20  N_READWRITE.    
2de00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2de10 20 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f    | SQLITE_OPEN_
2de20 41 55 54 4f 50 52 4f 58 59 29 2c 20 4e 55 4c 4c  AUTOPROXY), NULL
2de30 29 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 65  );.      char *e
2de40 72 72 6d 73 67 20 3d 20 4e 55 4c 4c 3b 0a 20 20  rrmsg = NULL;.  
2de50 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
2de60 73 71 6c 20 3d 20 22 22 3b 0a 20 20 20 20 20 20  sql = "";.      
2de70 69 66 28 20 21 74 72 63 20 26 26 20 28 62 46 6c  if( !trc && (bFl
2de80 61 67 73 26 53 51 4c 49 54 45 5f 54 52 55 4e 43  ags&SQLITE_TRUNC
2de90 41 54 45 5f 50 41 47 45 53 49 5a 45 5f 4d 41 53  ATE_PAGESIZE_MAS
2dea0 4b 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  K) ){.        co
2deb0 6e 73 74 20 63 68 61 72 20 70 61 67 65 73 69 7a  nst char pagesiz
2dec0 65 5f 73 71 6c 5b 34 5d 5b 32 32 5d 20 3d 20 7b  e_sql[4][22] = {
2ded0 0a 20 20 20 20 20 20 20 20 20 20 22 70 72 61 67  .          "prag
2dee0 6d 61 20 70 61 67 65 5f 73 69 7a 65 3d 31 30 32  ma page_size=102
2def0 34 22 2c 0a 20 20 20 20 20 20 20 20 20 20 22 70  4",.          "p
2df00 72 61 67 6d 61 20 70 61 67 65 5f 73 69 7a 65 3d  ragma page_size=
2df10 32 30 34 38 22 2c 0a 20 20 20 20 20 20 20 20 20  2048",.         
2df20 20 22 70 72 61 67 6d 61 20 70 61 67 65 5f 73 69   "pragma page_si
2df30 7a 65 3d 34 30 39 36 22 2c 0a 20 20 20 20 20 20  ze=4096",.      
2df40 20 20 20 20 22 70 72 61 67 6d 61 20 70 61 67 65      "pragma page
2df50 5f 73 69 7a 65 3d 38 31 39 32 22 20 0a 20 20 20  _size=8192" .   
2df60 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 20 20       };.        
2df70 69 6e 74 20 69 50 61 67 65 73 69 7a 65 20 3d 20  int iPagesize = 
2df80 28 28 28 62 46 6c 61 67 73 26 53 51 4c 49 54 45  (((bFlags&SQLITE
2df90 5f 54 52 55 4e 43 41 54 45 5f 50 41 47 45 53 49  _TRUNCATE_PAGESI
2dfa0 5a 45 5f 4d 41 53 4b 29 20 3e 3e 20 34 29 20 2d  ZE_MASK) >> 4) -
2dfb0 20 31 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73   1);.        ass
2dfc0 65 72 74 28 20 69 50 61 67 65 73 69 7a 65 3e 3d  ert( iPagesize>=
2dfd0 30 20 26 26 20 69 50 61 67 65 73 69 7a 65 3c 3d  0 && iPagesize<=
2dfe0 34 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  4 );.        sql
2dff0 20 3d 20 70 61 67 65 73 69 7a 65 5f 73 71 6c 5b   = pagesize_sql[
2e000 69 50 61 67 65 73 69 7a 65 5d 3b 0a 20 20 20 20  iPagesize];.    
2e010 20 20 20 20 74 72 63 20 3d 20 73 71 6c 69 74 65      trc = sqlite
2e020 33 5f 65 78 65 63 28 74 44 62 2c 20 73 71 6c 2c  3_exec(tDb, sql,
2e030 20 30 2c 20 30 2c 20 26 65 72 72 6d 73 67 29 3b   0, 0, &errmsg);
2e040 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
2e050 66 28 20 21 74 72 63 20 29 7b 0a 20 20 20 20 20  f( !trc ){.     
2e060 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 61 75     const char au
2e070 74 6f 76 61 63 75 75 6d 5f 73 71 6c 5b 33 5d 5b  tovacuum_sql[3][
2e080 32 31 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20  21] = {.        
2e090 20 20 22 70 72 61 67 6d 61 20 61 75 74 6f 5f 76    "pragma auto_v
2e0a0 61 63 75 75 6d 3d 30 22 2c 0a 20 20 20 20 20 20  acuum=0",.      
2e0b0 20 20 20 20 22 70 72 61 67 6d 61 20 61 75 74 6f      "pragma auto
2e0c0 5f 76 61 63 75 75 6d 3d 31 22 2c 0a 20 20 20 20  _vacuum=1",.    
2e0d0 20 20 20 20 20 20 22 70 72 61 67 6d 61 20 61 75        "pragma au
2e0e0 74 6f 5f 76 61 63 75 75 6d 3d 32 22 0a 20 20 20  to_vacuum=2".   
2e0f0 20 20 20 20 20 7d 3b 0a 20 20 20 20 20 20 20 20       };.        
2e100 69 6e 74 20 69 41 75 74 6f 76 61 63 75 75 6d 20  int iAutovacuum 
2e110 3d 20 32 3b 20 2f 2a 20 64 65 66 61 75 6c 74 20  = 2; /* default 
2e120 74 6f 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 2a  to incremental *
2e130 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 62  /.        if( (b
2e140 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 54 52 55  Flags&SQLITE_TRU
2e150 4e 43 41 54 45 5f 41 55 54 4f 56 41 43 55 55 4d  NCATE_AUTOVACUUM
2e160 5f 4d 41 53 4b 29 20 29 7b 0a 20 20 20 20 20 20  _MASK) ){.      
2e170 20 20 20 20 69 41 75 74 6f 76 61 63 75 75 6d 20      iAutovacuum 
2e180 3d 20 28 28 28 62 46 6c 61 67 73 26 53 51 4c 49  = (((bFlags&SQLI
2e190 54 45 5f 54 52 55 4e 43 41 54 45 5f 41 55 54 4f  TE_TRUNCATE_AUTO
2e1a0 56 41 43 55 55 4d 5f 4d 41 53 4b 29 20 3e 3e 20  VACUUM_MASK) >> 
2e1b0 32 29 20 2d 20 31 29 3b 0a 20 20 20 20 20 20 20  2) - 1);.       
2e1c0 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72   }.        asser
2e1d0 74 28 20 69 41 75 74 6f 76 61 63 75 75 6d 3e 3d  t( iAutovacuum>=
2e1e0 30 20 26 26 20 69 41 75 74 6f 76 61 63 75 75 6d  0 && iAutovacuum
2e1f0 3c 3d 32 20 29 3b 0a 20 20 20 20 20 20 20 20 73  <=2 );.        s
2e200 71 6c 20 3d 20 61 75 74 6f 76 61 63 75 75 6d 5f  ql = autovacuum_
2e210 73 71 6c 5b 69 41 75 74 6f 76 61 63 75 75 6d 5d  sql[iAutovacuum]
2e220 3b 0a 20 20 20 20 20 20 20 20 74 72 63 20 3d 20  ;.        trc = 
2e230 73 71 6c 69 74 65 33 5f 65 78 65 63 28 74 44 62  sqlite3_exec(tDb
2e240 2c 20 73 71 6c 2c 20 30 2c 20 30 2c 20 26 65 72  , sql, 0, 0, &er
2e250 72 6d 73 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20  rmsg);.      }. 
2e260 20 20 20 20 20 69 66 28 20 21 74 72 63 20 26 26       if( !trc &&
2e270 20 28 62 46 6c 61 67 73 26 53 51 4c 49 54 45 5f   (bFlags&SQLITE_
2e280 54 52 55 4e 43 41 54 45 5f 4a 4f 55 52 4e 41 4c  TRUNCATE_JOURNAL
2e290 4d 4f 44 45 5f 57 41 4c 29 20 29 7b 0a 20 20 20  MODE_WAL) ){.   
2e2a0 20 20 20 20 20 73 71 6c 20 3d 20 22 70 72 61 67       sql = "prag
2e2b0 6d 61 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  ma journal_mode=
2e2c0 77 61 6c 22 3b 0a 20 20 20 20 20 20 20 20 74 72  wal";.        tr
2e2d0 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63  c = sqlite3_exec
2e2e0 28 74 44 62 2c 20 73 71 6c 2c 20 30 2c 20 30 2c  (tDb, sql, 0, 0,
2e2f0 20 26 65 72 72 6d 73 67 29 3b 0a 20 20 20 20 20   &errmsg);.     
2e300 20 7d 0a 20 20 20 20 20 20 69 66 28 20 74 72 63   }.      if( trc
2e310 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
2e320 21 74 44 62 20 29 7b 0a 20 20 20 20 20 20 20 20  !tDb ){.        
2e330 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
2e340 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 6f 70 65  , "failed to ope
2e350 6e 20 74 65 6d 70 20 64 61 74 61 62 61 73 65 20  n temp database 
2e360 27 25 73 27 20 74 6f 20 72 65 73 65 74 20 22 0a  '%s' to reset ".
2e370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e380 20 20 20 20 20 20 20 20 20 20 22 74 72 75 6e 63            "trunc
2e390 61 74 65 64 20 64 61 74 61 62 61 73 65 20 25 73  ated database %s
2e3a0 20 77 69 74 68 20 66 6c 61 67 73 20 25 78 3a 20   with flags %x: 
2e3b0 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
2e3c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e3d0 20 20 74 44 62 50 61 74 68 2c 20 70 46 69 6c 65    tDbPath, pFile
2e3e0 2d 3e 7a 50 61 74 68 2c 20 62 46 6c 61 67 73 2c  ->zPath, bFlags,
2e3f0 20 74 72 63 29 3b 0a 20 20 20 20 20 20 20 20 7d   trc);.        }
2e400 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
2e410 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  fprintf(stderr, 
2e420 22 66 61 69 6c 65 64 20 74 6f 20 73 65 74 20 27  "failed to set '
2e430 25 73 27 20 6f 6e 20 74 72 75 6e 63 61 74 65 64  %s' on truncated
2e440 20 64 61 74 61 62 61 73 65 20 25 73 2c 20 25 64   database %s, %d
2e450 3a 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  : ".            
2e460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 25                "%
2e470 73 5c 6e 22 2c 20 73 71 6c 2c 20 70 46 69 6c 65  s\n", sql, pFile
2e480 2d 3e 7a 50 61 74 68 2c 20 74 72 63 2c 20 65 72  ->zPath, trc, er
2e490 72 6d 73 67 29 3b 0a 20 20 20 20 20 20 20 20 7d  rmsg);.        }
2e4a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
2e4b0 66 28 20 74 44 62 20 29 7b 0a 20 20 20 20 20 20  f( tDb ){.      
2e4c0 20 20 69 6e 74 20 6f 66 66 20 3d 20 30 3b 0a 20    int off = 0;. 
2e4d0 20 20 20 20 20 20 20 2f 2a 20 6d 65 72 67 65 20         /* merge 
2e4e0 74 68 65 20 77 61 6c 20 69 6e 74 6f 20 74 68 65  the wal into the
2e4f0 20 64 62 20 2a 2f 0a 20 20 20 20 20 20 20 20 73   db */.        s
2e500 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74  qlite3_file_cont
2e510 72 6f 6c 28 74 44 62 2c 20 4e 55 4c 4c 2c 20 53  rol(tDb, NULL, S
2e520 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 45 52 53  QLITE_FCNTL_PERS
2e530 49 53 54 5f 57 41 4c 2c 20 26 6f 66 66 29 3b 0a  IST_WAL, &off);.
2e540 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
2e550 63 6c 6f 73 65 28 74 44 62 29 3b 0a 20 20 20 20  close(tDb);.    
2e560 20 20 7d 0a 20 20 20 20 20 20 73 20 3d 20 63 6f    }.      s = co
2e570 70 79 66 69 6c 65 5f 73 74 61 74 65 5f 61 6c 6c  pyfile_state_all
2e580 6f 63 28 29 3b 0a 20 20 20 20 20 20 6c 73 65 65  oc();.      lsee
2e590 6b 28 74 46 64 2c 20 30 2c 20 53 45 45 4b 5f 53  k(tFd, 0, SEEK_S
2e5a0 45 54 29 3b 0a 20 20 20 20 20 20 6c 73 65 65 6b  ET);.      lseek
2e5b0 28 70 46 69 6c 65 2d 3e 68 2c 20 30 2c 20 53 45  (pFile->h, 0, SE
2e5c0 45 4b 5f 53 45 54 29 3b 0a 20 20 20 20 20 20 69  EK_SET);.      i
2e5d0 66 28 20 66 63 6f 70 79 66 69 6c 65 28 74 46 64  f( fcopyfile(tFd
2e5e0 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 73 2c 20 43  , pFile->h, s, C
2e5f0 4f 50 59 46 49 4c 45 5f 44 41 54 41 29 20 29 7b  OPYFILE_DATA) ){
2e600 0a 20 20 20 20 20 20 20 20 69 6e 74 20 65 72 72  .        int err
2e610 3d 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20  =errno;.        
2e620 73 77 69 74 63 68 28 65 72 72 29 20 7b 0a 20 20  switch(err) {.  
2e630 20 20 20 20 20 20 20 20 63 61 73 65 20 45 4e 4f          case ENO
2e640 4d 45 4d 3a 0a 20 20 20 20 20 20 20 20 20 20 20  MEM:.           
2e650 20 74 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f   trc = SQLITE_NO
2e660 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  MEM;.           
2e670 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
2e680 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20    default:.     
2e690 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74         storeLast
2e6a0 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72  Errno(pFile, err
2e6b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  );.            t
2e6c0 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
2e6d0 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  R;.        }.   
2e6e0 20 20 20 7d 0a 20 20 20 20 20 20 63 6f 70 79 66     }.      copyf
2e6f0 69 6c 65 5f 73 74 61 74 65 5f 66 72 65 65 28 73  ile_state_free(s
2e700 29 3b 0a 20 20 20 20 20 20 66 73 79 6e 63 28 70  );.      fsync(p
2e710 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 20 20 20 20  File->h);.      
2e720 63 6c 6f 73 65 28 74 46 64 29 3b 0a 20 20 20 20  close(tFd);.    
2e730 20 20 75 6e 6c 69 6e 6b 28 74 44 62 50 61 74 68    unlink(tDbPath
2e740 29 3b 0a 20 20 20 20 20 20 69 66 28 20 74 72 63  );.      if( trc
2e750 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2e760 20 20 20 20 20 20 20 73 61 66 65 46 61 69 6c 65         safeFaile
2e770 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72  d = 1;.        r
2e780 63 20 3d 20 74 72 63 3b 0a 20 20 20 20 20 20 7d  c = trc;.      }
2e790 0a 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65 28  .    }.    free(
2e7a0 74 44 62 50 61 74 68 29 3b 0a 20 20 7d 20 65 6c  tDbPath);.  } el
2e7b0 73 65 20 7b 0a 20 20 20 20 72 63 20 3d 20 70 46  se {.    rc = pF
2e7c0 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 54  ile->pMethod->xT
2e7d0 72 75 6e 63 61 74 65 28 69 64 2c 20 0a 20 20 20  runcate(id, .   
2e7e0 20 20 20 20 20 20 20 20 28 28 70 46 69 6c 65 2d          ((pFile-
2e7f0 3e 66 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54  >fsFlags & SQLIT
2e800 45 5f 46 53 46 4c 41 47 53 5f 49 53 5f 4d 53 44  E_FSFLAGS_IS_MSD
2e810 4f 53 29 20 21 3d 20 30 29 20 3f 20 31 4c 20 3a  OS) != 0) ? 1L :
2e820 20 30 4c 29 3b 0a 20 20 20 20 69 66 28 20 72 63   0L);.    if( rc
2e830 20 29 7b 0a 20 20 20 20 20 20 73 61 66 65 46 61   ){.      safeFa
2e840 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  iled = 1;.    }.
2e850 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
2e860 4c 49 54 45 5f 4f 4b 20 7c 7c 20 66 6f 72 63 65  LITE_OK || force
2e870 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 75 6e 69   ){.    rc = uni
2e880 78 49 6e 76 61 6c 69 64 61 74 65 53 75 70 70 6f  xInvalidateSuppo
2e890 72 74 46 69 6c 65 73 28 70 46 69 6c 65 2c 20 30  rtFiles(pFile, 0
2e8a0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  );.    if( rc ){
2e8b0 0a 20 20 20 20 20 20 73 61 66 65 46 61 69 6c 65  .      safeFaile
2e8c0 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  d = 1;.    }.  }
2e8d0 0a 20 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f  .  pFile->pMetho
2e8e0 64 2d 3e 78 53 79 6e 63 28 69 64 2c 20 53 51 4c  d->xSync(id, SQL
2e8f0 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 29 3b 0a  ITE_SYNC_FULL);.
2e900 0a 0a 20 20 69 66 28 20 69 73 43 6f 72 72 75 70  ..  if( isCorrup
2e910 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
2e920 64 65 6d 6f 5f 73 75 70 65 72 75 6e 6c 6f 63 6b  demo_superunlock
2e930 5f 63 6f 72 72 75 70 74 28 69 64 2c 20 63 6f 72  _corrupt(id, cor
2e940 72 75 70 74 46 69 6c 65 4c 6f 63 6b 29 3b 0a 20  ruptFileLock);. 
2e950 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 6f 63 6b   }else if( pLock
2e960 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 64   ){.    sqlite3d
2e970 65 6d 6f 5f 73 75 70 65 72 75 6e 6c 6f 63 6b 28  emo_superunlock(
2e980 70 4c 6f 63 6b 29 3b 0a 20 20 7d 65 6c 73 65 7b  pLock);.  }else{
2e990 0a 20 20 20 20 61 73 73 65 72 74 28 66 6f 72 63  .    assert(forc
2e9a0 65 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 69 66 28  e);.  }.  .  if(
2e9b0 20 66 6f 72 63 65 20 26 26 20 73 61 66 65 46 61   force && safeFa
2e9c0 69 6c 65 64 29 7b 0a 20 20 20 20 72 63 20 3d 20  iled){.    rc = 
2e9d0 75 6e 69 78 55 6e 73 61 66 65 54 72 75 6e 63 61  unixUnsafeTrunca
2e9e0 74 65 44 61 74 61 62 61 73 65 28 70 46 69 6c 65  teDatabase(pFile
2e9f0 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 72 65 74 75  );.  }.  .  retu
2ea00 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2a  rn rc;.}../*. **
2ea10 20 4c 6f 63 6b 20 6c 6f 63 61 74 69 6f 6e 73 20   Lock locations 
2ea20 66 6f 72 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  for shared-memor
2ea30 79 20 6c 6f 63 6b 73 20 75 73 65 64 20 62 79 20  y locks used by 
2ea40 57 41 4c 20 6d 6f 64 65 2e 0a 20 2a 2f 0a 23 69  WAL mode.. */.#i
2ea50 66 6e 64 65 66 20 53 48 4d 5f 42 41 53 45 0a 23  fndef SHM_BASE.#
2ea60 20 64 65 66 69 6e 65 20 53 48 4d 5f 42 41 53 45   define SHM_BASE
2ea70 20 20 20 20 20 20 20 20 20 20 31 32 30 0a 23 20            120.# 
2ea80 64 65 66 69 6e 65 20 53 48 4d 5f 57 52 49 54 45  define SHM_WRITE
2ea90 20 20 20 20 20 20 20 20 20 53 48 4d 5f 42 41 53           SHM_BAS
2eaa0 45 0a 23 20 64 65 66 69 6e 65 20 53 48 4d 5f 43  E.# define SHM_C
2eab0 48 45 43 4b 50 4f 49 4e 54 20 20 20 20 28 53 48  HECKPOINT    (SH
2eac0 4d 5f 42 41 53 45 2b 31 29 0a 23 20 64 65 66 69  M_BASE+1).# defi
2ead0 6e 65 20 53 48 4d 5f 52 45 43 4f 56 45 52 20 20  ne SHM_RECOVER  
2eae0 20 20 20 20 20 28 53 48 4d 5f 42 41 53 45 2b 32       (SHM_BASE+2
2eaf0 29 0a 23 20 64 65 66 69 6e 65 20 53 48 4d 5f 52  ).# define SHM_R
2eb00 45 41 44 5f 46 49 52 53 54 20 20 20 20 28 53 48  EAD_FIRST    (SH
2eb10 4d 5f 42 41 53 45 2b 33 29 0a 23 20 64 65 66 69  M_BASE+3).# defi
2eb20 6e 65 20 53 48 4d 5f 52 45 41 44 5f 53 49 5a 45  ne SHM_READ_SIZE
2eb30 20 20 20 20 20 35 0a 23 65 6e 64 69 66 20 2f 2a       5.#endif /*
2eb40 20 53 48 4d 5f 42 41 53 45 20 2a 2f 0a 0a 2f 2a   SHM_BASE */../*
2eb50 0a 2a 2a 20 54 68 69 73 20 74 65 73 74 20 6f 6e  .** This test on
2eb60 6c 79 20 77 6f 72 6b 73 20 66 6f 72 20 6c 6f 63  ly works for loc
2eb70 6b 20 74 65 73 74 69 6e 67 20 6f 6e 20 75 6e 69  k testing on uni
2eb80 78 2f 70 6f 73 69 78 20 56 46 53 2e 0a 2a 2a 20  x/posix VFS..** 
2eb90 41 64 61 70 74 65 64 20 66 72 6f 6d 20 74 6f 6f  Adapted from too
2eba0 6c 2f 67 65 74 6c 6f 63 6b 2e 63 20 66 34 63 33  l/getlock.c f4c3
2ebb0 39 62 36 35 31 33 37 30 31 35 36 63 61 65 39 37  9b651370156cae97
2ebc0 39 35 30 31 61 37 62 31 35 36 62 64 62 61 35 30  9501a7b156bdba50
2ebd0 65 37 63 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69  e7ce.*/.static i
2ebe0 6e 74 20 75 6e 69 78 4c 6f 63 6b 73 74 61 74 65  nt unixLockstate
2ebf0 50 69 64 28 75 6e 69 78 46 69 6c 65 20 2a 70 46  Pid(unixFile *pF
2ec00 69 6c 65 2c 20 70 69 64 5f 74 20 70 69 64 2c 20  ile, pid_t pid, 
2ec10 69 6e 74 20 2a 70 4c 6f 63 6b 73 74 61 74 65 29  int *pLockstate)
2ec20 7b 0a 20 20 69 6e 74 20 68 44 62 3b 20 20 20 20  {.  int hDb;    
2ec30 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63      /* File desc
2ec40 72 69 70 74 6f 72 20 66 6f 72 20 74 68 65 20 6f  riptor for the o
2ec50 70 65 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  pen database fil
2ec60 65 20 2a 2f 0a 20 20 69 6e 74 20 68 53 68 6d 20  e */.  int hShm 
2ec70 3d 20 2d 31 3b 20 20 2f 2a 20 46 69 6c 65 20 64  = -1;  /* File d
2ec80 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20 57 41  escriptor for WA
2ec90 4c 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  L shared-memory 
2eca0 66 69 6c 65 20 2a 2f 0a 20 20 73 73 69 7a 65 5f  file */.  ssize_
2ecb0 74 20 67 6f 74 3b 20 20 20 20 2f 2a 20 42 79 74  t got;    /* Byt
2ecc0 65 73 20 72 65 61 64 20 66 72 6f 6d 20 68 65 61  es read from hea
2ecd0 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 69 73 57  der */.  int isW
2ece0 61 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  al = 0;         
2ecf0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 69      /* True if i
2ed00 6e 20 57 41 4c 20 6d 6f 64 65 20 2a 2f 0a 20 20  n WAL mode */.  
2ed10 69 6e 74 20 6e 4c 6f 63 6b 20 3d 20 30 3b 20 20  int nLock = 0;  
2ed20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
2ed30 6d 62 65 72 20 6f 66 20 6c 6f 63 6b 73 20 68 65  mber of locks he
2ed40 6c 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 48 64  ld */.  int noHd
2ed50 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  r = 0;          
2ed60 20 20 20 2f 2a 20 5a 65 72 6f 20 62 79 74 65 20     /* Zero byte 
2ed70 44 42 20 68 61 73 20 6e 6f 20 68 65 61 64 65 72  DB has no header
2ed80 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
2ed90 68 61 72 20 61 48 64 72 5b 31 30 30 5d 3b 20 20  har aHdr[100];  
2eda0 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 65 61   /* Database hea
2edb0 64 65 72 20 2a 2f 0a 20 20 0a 20 20 61 73 73 65  der */.  .  asse
2edc0 72 74 28 70 4c 6f 63 6b 73 74 61 74 65 29 3b 0a  rt(pLockstate);.
2edd0 20 20 0a 20 20 2f 2a 20 6d 61 6b 65 20 73 75 72    .  /* make sur
2ede0 65 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67  e we are dealing
2edf0 20 77 69 74 68 20 61 20 64 61 74 61 62 61 73 65   with a database
2ee00 20 66 69 6c 65 20 2a 2f 0a 20 20 68 44 62 20 3d   file */.  hDb =
2ee10 20 70 46 69 6c 65 2d 3e 68 3b 0a 20 20 69 66 28   pFile->h;.  if(
2ee20 20 68 44 62 3c 30 20 29 7b 0a 20 20 20 20 2a 70   hDb<0 ){.    *p
2ee30 4c 6f 63 6b 73 74 61 74 65 20 3d 20 53 51 4c 49  Lockstate = SQLI
2ee40 54 45 5f 4c 4f 43 4b 53 54 41 54 45 5f 45 52 52  TE_LOCKSTATE_ERR
2ee50 4f 52 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  OR;.    return S
2ee60 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
2ee70 0a 20 20 61 73 73 65 72 74 28 20 28 73 74 72 6c  .  assert( (strl
2ee80 65 6e 28 53 51 4c 49 54 45 5f 46 49 4c 45 5f 48  en(SQLITE_FILE_H
2ee90 45 41 44 45 52 29 2b 31 29 3d 3d 53 51 4c 49 54  EADER)+1)==SQLIT
2eea0 45 5f 46 49 4c 45 5f 48 45 41 44 45 52 5f 4c 45  E_FILE_HEADER_LE
2eeb0 4e 20 29 3b 0a 20 20 67 6f 74 20 3d 20 70 72 65  N );.  got = pre
2eec0 61 64 28 68 44 62 2c 20 61 48 64 72 2c 20 31 30  ad(hDb, aHdr, 10
2eed0 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 67 6f 74  0, 0);.  if( got
2eee0 3c 30 20 29 7b 0a 20 20 20 20 2a 70 4c 6f 63 6b  <0 ){.    *pLock
2eef0 73 74 61 74 65 20 3d 20 53 51 4c 49 54 45 5f 4c  state = SQLITE_L
2ef00 4f 43 4b 53 54 41 54 45 5f 45 52 52 4f 52 3b 0a  OCKSTATE_ERROR;.
2ef10 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2ef20 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  E_ERROR;.  }.  i
2ef30 66 28 20 67 6f 74 3d 3d 30 20 29 7b 0a 20 20 20  f( got==0 ){.   
2ef40 20 6e 6f 48 64 72 20 3d 20 31 3b 0a 20 20 7d 65   noHdr = 1;.  }e
2ef50 6c 73 65 20 69 66 28 20 67 6f 74 21 3d 31 30 30  lse if( got!=100
2ef60 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 6d 65 6d  .         || mem
2ef70 63 6d 70 28 61 48 64 72 2c 20 53 51 4c 49 54 45  cmp(aHdr, SQLITE
2ef80 5f 46 49 4c 45 5f 48 45 41 44 45 52 2c 20 53 51  _FILE_HEADER, SQ
2ef90 4c 49 54 45 5f 46 49 4c 45 5f 48 45 41 44 45 52  LITE_FILE_HEADER
2efa0 5f 4c 45 4e 29 21 3d 30 0a 20 20 29 7b 0a 20 20  _LEN)!=0.  ){.  
2efb0 20 20 2a 70 4c 6f 63 6b 73 74 61 74 65 20 3d 20    *pLockstate = 
2efc0 53 51 4c 49 54 45 5f 4c 4f 43 4b 53 54 41 54 45  SQLITE_LOCKSTATE
2efd0 5f 4e 4f 54 41 44 42 3b 0a 20 20 20 20 72 65 74  _NOTADB;.    ret
2efe0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44  urn SQLITE_NOTAD
2eff0 42 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 46  B;.  }.  .  /* F
2f000 69 72 73 74 20 63 68 65 63 6b 20 66 6f 72 20 61  irst check for a
2f010 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
2f020 20 2a 2f 0a 20 20 6e 4c 6f 63 6b 20 2b 3d 20 75   */.  nLock += u
2f030 6e 69 78 49 73 4c 6f 63 6b 65 64 28 70 69 64 2c  nixIsLocked(pid,
2f040 20 68 44 62 2c 20 46 5f 52 44 4c 43 4b 2c 20 53   hDb, F_RDLCK, S
2f050 48 41 52 45 44 5f 46 49 52 53 54 2c 20 53 48 41  HARED_FIRST, SHA
2f060 52 45 44 5f 53 49 5a 45 2c 0a 20 20 20 20 20 20  RED_SIZE,.      
2f070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f080 20 20 22 45 58 43 4c 55 53 49 56 45 22 29 3b 0a    "EXCLUSIVE");.
2f090 20 20 69 66 20 28 21 6e 6f 48 64 72 29 20 7b 0a    if (!noHdr) {.
2f0a0 20 20 20 20 69 73 57 61 6c 20 3d 20 61 48 64 72      isWal = aHdr
2f0b0 5b 31 38 5d 3d 3d 32 3b 0a 20 20 7d 0a 20 20 69  [18]==2;.  }.  i
2f0c0 66 28 20 6e 4c 6f 63 6b 3d 3d 30 20 26 26 20 69  f( nLock==0 && i
2f0d0 73 57 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  sWal==0 ){.    /
2f0e0 2a 20 52 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 20  * Rollback mode 
2f0f0 2a 2f 0a 20 20 20 20 6e 4c 6f 63 6b 20 2b 3d 20  */.    nLock += 
2f100 75 6e 69 78 49 73 4c 6f 63 6b 65 64 28 70 69 64  unixIsLocked(pid
2f110 2c 20 68 44 62 2c 20 46 5f 57 52 4c 43 4b 2c 20  , hDb, F_WRLCK, 
2f120 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 53 48  PENDING_BYTE, SH
2f130 41 52 45 44 5f 53 49 5a 45 2b 32 2c 0a 20 20 20  ARED_SIZE+2,.   
2f140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f150 20 20 20 20 20 20 20 22 50 45 4e 44 49 4e 47 7c         "PENDING|
2f160 52 45 53 45 52 56 45 44 7c 53 48 41 52 45 44 22  RESERVED|SHARED"
2f170 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 4c 6f  );.  }.  if( nLo
2f180 63 6b 3d 3d 30 20 26 26 20 69 73 57 61 6c 21 3d  ck==0 && isWal!=
2f190 30 20 29 7b 0a 20 20 20 20 2f 2a 20 6c 6f 6f 6b  0 ){.    /* look
2f1a0 75 70 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  up the file desc
2f1b0 72 69 70 74 6f 72 20 66 6f 72 20 74 68 65 20 73  riptor for the s
2f1c0 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 66 69 6c  hared memory fil
2f1d0 65 20 69 66 20 77 65 20 68 61 76 65 20 69 74 20  e if we have it 
2f1e0 6f 70 65 6e 0a 20 20 20 20 2a 2a 20 69 6e 20 74  open.    ** in t
2f1f0 68 69 73 20 70 72 6f 63 65 73 73 20 2a 2f 0a 20  his process */. 
2f200 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65     unixEnterMute
2f210 78 28 29 3b 20 2f 2a 20 42 65 63 61 75 73 65 20  x(); /* Because 
2f220 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 69 73  pFile->pInode is
2f230 20 73 68 61 72 65 64 20 61 63 72 6f 73 73 20 74   shared across t
2f240 68 72 65 61 64 73 20 2a 2f 0a 20 20 20 20 75 6e  hreads */.    un
2f250 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e  ixShmNode *pShmN
2f260 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e  ode = pFile->pIn
2f270 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20  ode->pShmNode;. 
2f280 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 20     if( pShmNode 
2f290 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2f2a0 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68  _mutex_enter(pSh
2f2b0 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20  mNode->mutex);. 
2f2c0 20 20 20 20 20 0a 20 20 20 20 20 20 68 53 68 6d       .      hShm
2f2d0 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3b 0a   = pShmNode->h;.
2f2e0 20 20 20 20 20 20 69 66 28 20 68 53 68 6d 20 3e        if( hShm >
2f2f0 3d 20 30 29 7b 0a 20 20 20 20 20 20 20 20 69 66  = 0){.        if
2f300 28 20 75 6e 69 78 49 73 4c 6f 63 6b 65 64 28 70  ( unixIsLocked(p
2f310 69 64 2c 20 68 53 68 6d 2c 20 46 5f 52 44 4c 43  id, hShm, F_RDLC
2f320 4b 2c 20 53 48 4d 5f 52 45 43 4f 56 45 52 2c 20  K, SHM_RECOVER, 
2f330 31 2c 20 22 57 41 4c 2d 52 45 43 4f 56 45 52 59  1, "WAL-RECOVERY
2f340 22 29 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20  ") ||.          
2f350 20 75 6e 69 78 49 73 4c 6f 63 6b 65 64 28 70 69   unixIsLocked(pi
2f360 64 2c 20 68 53 68 6d 2c 20 46 5f 52 44 4c 43 4b  d, hShm, F_RDLCK
2f370 2c 20 53 48 4d 5f 57 52 49 54 45 2c 20 31 2c 20  , SHM_WRITE, 1, 
2f380 22 57 41 4c 2d 57 52 49 54 45 22 29 20 29 7b 0a  "WAL-WRITE") ){.
2f390 20 20 20 20 20 20 20 20 20 20 6e 4c 6f 63 6b 20            nLock 
2f3a0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 1;.        }. 
2f3b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 0a 20 20       }.      .  
2f3c0 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
2f3d0 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65  x_leave(pShmNode
2f3e0 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 7d 20  ->mutex);.    } 
2f3f0 0a 20 20 20 20 0a 20 20 20 20 69 66 28 20 68 53  .    .    if( hS
2f400 68 6d 3c 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  hm<0 ){.      /*
2f410 20 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f   the shared memo
2f420 72 79 20 66 69 6c 65 20 69 73 6e 27 74 20 6f 70  ry file isn't op
2f430 65 6e 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65  en in this proce
2f440 73 73 20 73 70 61 63 65 2c 20 6f 70 65 6e 20 6f  ss space, open o
2f450 75 72 0a 20 20 20 20 20 20 2a 2a 20 6f 77 6e 20  ur.      ** own 
2f460 46 44 20 2a 2f 0a 20 20 20 20 20 20 63 68 61 72  FD */.      char
2f470 20 7a 53 68 6d 5b 4d 41 58 50 41 54 48 4c 45 4e   zShm[MAXPATHLEN
2f480 5d 3b 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20  ];.      .      
2f490 2f 2a 20 57 41 4c 20 6d 6f 64 65 20 2a 2f 0a 20  /* WAL mode */. 
2f4a0 20 20 20 20 20 73 74 72 6c 63 70 79 28 7a 53 68       strlcpy(zSh
2f4b0 6d 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 2c  m, pFile->zPath,
2f4c0 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a 20 20   MAXPATHLEN);.  
2f4d0 20 20 20 20 73 74 72 6c 63 61 74 28 7a 53 68 6d      strlcat(zShm
2f4e0 2c 20 22 2d 73 68 6d 22 2c 20 4d 41 58 50 41 54  , "-shm", MAXPAT
2f4f0 48 4c 45 4e 29 3b 0a 20 20 20 20 20 20 68 53 68  HLEN);.      hSh
2f500 6d 20 3d 20 6f 70 65 6e 28 7a 53 68 6d 2c 20 4f  m = open(zShm, O
2f510 5f 52 44 4f 4e 4c 59 2c 20 30 29 3b 0a 20 20 20  _RDONLY, 0);.   
2f520 20 20 20 69 66 28 20 68 53 68 6d 3c 30 20 29 7b     if( hShm<0 ){
2f530 0a 20 20 20 20 20 20 20 20 2a 70 4c 6f 63 6b 73  .        *pLocks
2f540 74 61 74 65 20 3d 20 53 51 4c 49 54 45 5f 4c 4f  tate = SQLITE_LO
2f550 43 4b 53 54 41 54 45 5f 4f 46 46 3b 0a 20 20 20  CKSTATE_OFF;.   
2f560 20 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75       unixLeaveMu
2f570 74 65 78 28 29 3b 0a 20 20 20 20 20 20 20 20 72  tex();.        r
2f580 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2f590 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
2f5a0 66 28 20 75 6e 69 78 49 73 4c 6f 63 6b 65 64 28  f( unixIsLocked(
2f5b0 70 69 64 2c 20 68 53 68 6d 2c 20 46 5f 52 44 4c  pid, hShm, F_RDL
2f5c0 43 4b 2c 20 53 48 4d 5f 52 45 43 4f 56 45 52 2c  CK, SHM_RECOVER,
2f5d0 20 31 2c 20 22 57 41 4c 2d 52 45 43 4f 56 45 52   1, "WAL-RECOVER
2f5e0 59 22 29 20 7c 7c 0a 20 20 20 20 20 20 20 20 20  Y") ||.         
2f5f0 75 6e 69 78 49 73 4c 6f 63 6b 65 64 28 70 69 64  unixIsLocked(pid
2f600 2c 20 68 53 68 6d 2c 20 46 5f 52 44 4c 43 4b 2c  , hShm, F_RDLCK,
2f610 20 53 48 4d 5f 57 52 49 54 45 2c 20 31 2c 20 22   SHM_WRITE, 1, "
2f620 57 41 4c 2d 57 52 49 54 45 22 29 20 29 7b 0a 20  WAL-WRITE") ){. 
2f630 20 20 20 20 20 20 20 6e 4c 6f 63 6b 20 3d 20 31         nLock = 1
2f640 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2f650 63 6c 6f 73 65 28 68 53 68 6d 29 3b 0a 20 20 20  close(hShm);.   
2f660 20 7d 0a 20 20 20 20 75 6e 69 78 4c 65 61 76 65   }.    unixLeave
2f670 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a 20 20 69  Mutex();.  }.  i
2f680 66 28 20 6e 4c 6f 63 6b 3e 30 20 29 7b 0a 20 20  f( nLock>0 ){.  
2f690 20 20 2a 70 4c 6f 63 6b 73 74 61 74 65 20 3d 20    *pLockstate = 
2f6a0 53 51 4c 49 54 45 5f 4c 4f 43 4b 53 54 41 54 45  SQLITE_LOCKSTATE
2f6b0 5f 4f 4e 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a  _ON;.  } else {.
2f6c0 20 20 20 20 2a 70 4c 6f 63 6b 73 74 61 74 65 20      *pLockstate 
2f6d0 3d 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 53 54 41  = SQLITE_LOCKSTA
2f6e0 54 45 5f 4f 46 46 3b 0a 20 20 7d 0a 20 20 72 65  TE_OFF;.  }.  re
2f6f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2f700 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 28 53 51  }..#endif /* (SQ
2f710 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 50 4c  LITE_ENABLE_APPL
2f720 45 5f 53 50 49 3e 30 29 20 26 26 20 64 65 66 69  E_SPI>0) && defi
2f730 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 2a  ned(__APPLE__) *
2f740 2f 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  /..#if SQLITE_MA
2f750 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 2f 2a  X_MMAP_SIZE>0./*
2f760 0a 2a 2a 20 49 66 20 69 74 20 69 73 20 63 75 72  .** If it is cur
2f770 72 65 6e 74 6c 79 20 6d 65 6d 6f 72 79 20 6d 61  rently memory ma
2f780 70 70 65 64 2c 20 75 6e 6d 61 70 20 66 69 6c 65  pped, unmap file
2f790 20 70 46 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   pFd..*/.static 
2f7a0 76 6f 69 64 20 75 6e 69 78 55 6e 6d 61 70 66 69  void unixUnmapfi
2f7b0 6c 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 64  le(unixFile *pFd
2f7c0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 46 64  ){.  assert( pFd
2f7d0 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30 20 29  ->nFetchOut==0 )
2f7e0 3b 0a 20 20 69 66 28 20 70 46 64 2d 3e 70 4d 61  ;.  if( pFd->pMa
2f7f0 70 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 6f  pRegion ){.    o
2f800 73 4d 75 6e 6d 61 70 28 70 46 64 2d 3e 70 4d 61  sMunmap(pFd->pMa
2f810 70 52 65 67 69 6f 6e 2c 20 70 46 64 2d 3e 6d 6d  pRegion, pFd->mm
2f820 61 70 53 69 7a 65 41 63 74 75 61 6c 29 3b 0a 20  apSizeActual);. 
2f830 20 20 20 70 46 64 2d 3e 70 4d 61 70 52 65 67 69     pFd->pMapRegi
2f840 6f 6e 20 3d 20 30 3b 0a 20 20 20 20 70 46 64 2d  on = 0;.    pFd-
2f850 3e 6d 6d 61 70 53 69 7a 65 20 3d 20 30 3b 0a 20  >mmapSize = 0;. 
2f860 20 20 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65     pFd->mmapSize
2f870 41 63 74 75 61 6c 20 3d 20 30 3b 0a 20 20 7d 0a  Actual = 0;.  }.
2f880 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74  }../*.** Attempt
2f890 20 74 6f 20 73 65 74 20 74 68 65 20 73 69 7a 65   to set the size
2f8a0 20 6f 66 20 74 68 65 20 6d 65 6d 6f 72 79 20 6d   of the memory m
2f8b0 61 70 70 69 6e 67 20 6d 61 69 6e 74 61 69 6e 65  apping maintaine
2f8c0 64 20 62 79 20 66 69 6c 65 20 0a 2a 2a 20 64 65  d by file .** de
2f8d0 73 63 72 69 70 74 6f 72 20 70 46 64 20 74 6f 20  scriptor pFd to 
2f8e0 6e 4e 65 77 20 62 79 74 65 73 2e 20 41 6e 79 20  nNew bytes. Any 
2f8f0 65 78 69 73 74 69 6e 67 20 6d 61 70 70 69 6e 67  existing mapping
2f900 20 69 73 20 64 69 73 63 61 72 64 65 64 2e 0a 2a   is discarded..*
2f910 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66  *.** If successf
2f920 75 6c 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ul, this functio
2f930 6e 20 73 65 74 73 20 74 68 65 20 66 6f 6c 6c 6f  n sets the follo
2f940 77 69 6e 67 20 76 61 72 69 61 62 6c 65 73 3a 0a  wing variables:.
2f950 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 75 6e 69 78  **.**       unix
2f960 46 69 6c 65 2e 70 4d 61 70 52 65 67 69 6f 6e 0a  File.pMapRegion.
2f970 2a 2a 20 20 20 20 20 20 20 75 6e 69 78 46 69 6c  **       unixFil
2f980 65 2e 6d 6d 61 70 53 69 7a 65 0a 2a 2a 20 20 20  e.mmapSize.**   
2f990 20 20 20 20 75 6e 69 78 46 69 6c 65 2e 6d 6d 61      unixFile.mma
2f9a0 70 53 69 7a 65 41 63 74 75 61 6c 0a 2a 2a 0a 2a  pSizeActual.**.*
2f9b0 2a 20 49 66 20 75 6e 73 75 63 63 65 73 73 66 75  * If unsuccessfu
2f9c0 6c 2c 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  l, an error mess
2f9d0 61 67 65 20 69 73 20 6c 6f 67 67 65 64 20 76 69  age is logged vi
2f9e0 61 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 29 20  a sqlite3_log() 
2f9f0 61 6e 64 0a 2a 2a 20 74 68 65 20 74 68 72 65 65  and.** the three
2fa00 20 76 61 72 69 61 62 6c 65 73 20 61 62 6f 76 65   variables above
2fa10 20 61 72 65 20 7a 65 72 6f 65 64 2e 20 49 6e 20   are zeroed. In 
2fa20 74 68 69 73 20 63 61 73 65 20 53 51 4c 69 74 65  this case SQLite
2fa30 20 73 68 6f 75 6c 64 0a 2a 2a 20 63 6f 6e 74 69   should.** conti
2fa40 6e 75 65 20 61 63 63 65 73 73 69 6e 67 20 74 68  nue accessing th
2fa50 65 20 64 61 74 61 62 61 73 65 20 75 73 69 6e 67  e database using
2fa60 20 74 68 65 20 78 52 65 61 64 28 29 20 61 6e 64   the xRead() and
2fa70 20 78 57 72 69 74 65 28 29 0a 2a 2a 20 6d 65 74   xWrite().** met
2fa80 68 6f 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  hods..*/.static 
2fa90 76 6f 69 64 20 75 6e 69 78 52 65 6d 61 70 66 69  void unixRemapfi
2faa0 6c 65 28 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  le(.  unixFile *
2fab0 70 46 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  pFd,            
2fac0 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65        /* File de
2fad0 73 63 72 69 70 74 6f 72 20 6f 62 6a 65 63 74 20  scriptor object 
2fae0 2a 2f 0a 20 20 69 36 34 20 6e 4e 65 77 20 20 20  */.  i64 nNew   
2faf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fb00 20 20 20 20 20 2f 2a 20 52 65 71 75 69 72 65 64       /* Required
2fb10 20 6d 61 70 70 69 6e 67 20 73 69 7a 65 20 2a 2f   mapping size */
2fb20 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  .){.  const char
2fb30 20 2a 7a 45 72 72 20 3d 20 22 6d 6d 61 70 22 3b   *zErr = "mmap";
2fb40 0a 20 20 69 6e 74 20 68 20 3d 20 70 46 64 2d 3e  .  int h = pFd->
2fb50 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h;              
2fb60 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20          /* File 
2fb70 64 65 73 63 72 69 70 74 6f 72 20 6f 70 65 6e 20  descriptor open 
2fb80 6f 6e 20 64 62 20 66 69 6c 65 20 2a 2f 0a 20 20  on db file */.  
2fb90 75 38 20 2a 70 4f 72 69 67 20 3d 20 28 75 38 20  u8 *pOrig = (u8 
2fba0 2a 29 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f  *)pFd->pMapRegio
2fbb0 6e 3b 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20  n;   /* Pointer 
2fbc0 74 6f 20 63 75 72 72 65 6e 74 20 66 69 6c 65 20  to current file 
2fbd0 6d 61 70 70 69 6e 67 20 2a 2f 0a 20 20 69 36 34  mapping */.  i64
2fbe0 20 6e 4f 72 69 67 20 3d 20 70 46 64 2d 3e 6d 6d   nOrig = pFd->mm
2fbf0 61 70 53 69 7a 65 41 63 74 75 61 6c 3b 20 20 20  apSizeActual;   
2fc00 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 70 4f 72    /* Size of pOr
2fc10 69 67 20 72 65 67 69 6f 6e 20 69 6e 20 62 79 74  ig region in byt
2fc20 65 73 20 2a 2f 0a 20 20 75 38 20 2a 70 4e 65 77  es */.  u8 *pNew
2fc30 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
2fc40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2fc50 4c 6f 63 61 74 69 6f 6e 20 6f 66 20 6e 65 77 20  Location of new 
2fc60 6d 61 70 70 69 6e 67 20 2a 2f 0a 20 20 69 6e 74  mapping */.  int
2fc70 20 66 6c 61 67 73 20 3d 20 50 52 4f 54 5f 52 45   flags = PROT_RE
2fc80 41 44 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  AD;             
2fc90 20 20 2f 2a 20 46 6c 61 67 73 20 74 6f 20 70 61    /* Flags to pa
2fca0 73 73 20 74 6f 20 6d 6d 61 70 28 29 20 2a 2f 0a  ss to mmap() */.
2fcb0 0a 20 20 61 73 73 65 72 74 28 20 70 46 64 2d 3e  .  assert( pFd->
2fcc0 6e 46 65 74 63 68 4f 75 74 3d 3d 30 20 29 3b 0a  nFetchOut==0 );.
2fcd0 20 20 61 73 73 65 72 74 28 20 6e 4e 65 77 3e 70    assert( nNew>p
2fce0 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 3b 0a  Fd->mmapSize );.
2fcf0 20 20 61 73 73 65 72 74 28 20 6e 4e 65 77 3c 3d    assert( nNew<=
2fd00 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78  pFd->mmapSizeMax
2fd10 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4e   );.  assert( nN
2fd20 65 77 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  ew>0 );.  assert
2fd30 28 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 41  ( pFd->mmapSizeA
2fd40 63 74 75 61 6c 3e 3d 70 46 64 2d 3e 6d 6d 61 70  ctual>=pFd->mmap
2fd50 53 69 7a 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Size );.  assert
2fd60 28 20 4d 41 50 5f 46 41 49 4c 45 44 21 3d 30 20  ( MAP_FAILED!=0 
2fd70 29 3b 0a 0a 20 20 69 66 28 20 28 70 46 64 2d 3e  );..  if( (pFd->
2fd80 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58  ctrlFlags & UNIX
2fd90 46 49 4c 45 5f 52 44 4f 4e 4c 59 29 3d 3d 30 20  FILE_RDONLY)==0 
2fda0 29 20 66 6c 61 67 73 20 7c 3d 20 50 52 4f 54 5f  ) flags |= PROT_
2fdb0 57 52 49 54 45 3b 0a 0a 20 20 69 66 28 20 70 4f  WRITE;..  if( pO
2fdc0 72 69 67 20 29 7b 0a 23 69 66 20 48 41 56 45 5f  rig ){.#if HAVE_
2fdd0 4d 52 45 4d 41 50 0a 20 20 20 20 69 36 34 20 6e  MREMAP.    i64 n
2fde0 52 65 75 73 65 20 3d 20 70 46 64 2d 3e 6d 6d 61  Reuse = pFd->mma
2fdf0 70 53 69 7a 65 3b 0a 23 65 6c 73 65 0a 20 20 20  pSize;.#else.   
2fe00 20 63 6f 6e 73 74 20 69 6e 74 20 73 7a 53 79 73   const int szSys
2fe10 70 61 67 65 20 3d 20 6f 73 47 65 74 70 61 67 65  page = osGetpage
2fe20 73 69 7a 65 28 29 3b 0a 20 20 20 20 69 36 34 20  size();.    i64 
2fe30 6e 52 65 75 73 65 20 3d 20 28 70 46 64 2d 3e 6d  nReuse = (pFd->m
2fe40 6d 61 70 53 69 7a 65 20 26 20 7e 28 73 7a 53 79  mapSize & ~(szSy
2fe50 73 70 61 67 65 2d 31 29 29 3b 0a 23 65 6e 64 69  spage-1));.#endi
2fe60 66 0a 20 20 20 20 75 38 20 2a 70 52 65 71 20 3d  f.    u8 *pReq =
2fe70 20 26 70 4f 72 69 67 5b 6e 52 65 75 73 65 5d 3b   &pOrig[nReuse];
2fe80 0a 0a 20 20 20 20 2f 2a 20 55 6e 6d 61 70 20 61  ..    /* Unmap a
2fe90 6e 79 20 70 61 67 65 73 20 6f 66 20 74 68 65 20  ny pages of the 
2fea0 65 78 69 73 74 69 6e 67 20 6d 61 70 70 69 6e 67  existing mapping
2feb0 20 74 68 61 74 20 63 61 6e 6e 6f 74 20 62 65 20   that cannot be 
2fec0 72 65 75 73 65 64 2e 20 2a 2f 0a 20 20 20 20 69  reused. */.    i
2fed0 66 28 20 6e 52 65 75 73 65 21 3d 6e 4f 72 69 67  f( nReuse!=nOrig
2fee0 20 29 7b 0a 20 20 20 20 20 20 6f 73 4d 75 6e 6d   ){.      osMunm
2fef0 61 70 28 70 52 65 71 2c 20 6e 4f 72 69 67 2d 6e  ap(pReq, nOrig-n
2ff00 52 65 75 73 65 29 3b 0a 20 20 20 20 7d 0a 0a 23  Reuse);.    }..#
2ff10 69 66 20 48 41 56 45 5f 4d 52 45 4d 41 50 0a 20  if HAVE_MREMAP. 
2ff20 20 20 20 70 4e 65 77 20 3d 20 6f 73 4d 72 65 6d     pNew = osMrem
2ff30 61 70 28 70 4f 72 69 67 2c 20 6e 52 65 75 73 65  ap(pOrig, nReuse
2ff40 2c 20 6e 4e 65 77 2c 20 4d 52 45 4d 41 50 5f 4d  , nNew, MREMAP_M
2ff50 41 59 4d 4f 56 45 29 3b 0a 20 20 20 20 7a 45 72  AYMOVE);.    zEr
2ff60 72 20 3d 20 22 6d 72 65 6d 61 70 22 3b 0a 23 65  r = "mremap";.#e
2ff70 6c 73 65 0a 20 20 20 20 70 4e 65 77 20 3d 20 6f  lse.    pNew = o
2ff80 73 4d 6d 61 70 28 70 52 65 71 2c 20 6e 4e 65 77  sMmap(pReq, nNew
2ff90 2d 6e 52 65 75 73 65 2c 20 66 6c 61 67 73 2c 20  -nReuse, flags, 
2ffa0 4d 41 50 5f 53 48 41 52 45 44 2c 20 68 2c 20 6e  MAP_SHARED, h, n
2ffb0 52 65 75 73 65 29 3b 0a 20 20 20 20 69 66 28 20  Reuse);.    if( 
2ffc0 70 4e 65 77 21 3d 4d 41 50 5f 46 41 49 4c 45 44  pNew!=MAP_FAILED
2ffd0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 4e   ){.      if( pN
2ffe0 65 77 21 3d 70 52 65 71 20 29 7b 0a 20 20 20 20  ew!=pReq ){.    
2fff0 20 20 20 20 6f 73 4d 75 6e 6d 61 70 28 70 4e 65      osMunmap(pNe
30000 77 2c 20 6e 4e 65 77 20 2d 20 6e 52 65 75 73 65  w, nNew - nReuse
30010 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20  );.        pNew 
30020 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 0;.      }else
30030 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 20 3d  {.        pNew =
30040 20 70 4f 72 69 67 3b 0a 20 20 20 20 20 20 7d 0a   pOrig;.      }.
30050 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
30060 20 20 2f 2a 20 54 68 65 20 61 74 74 65 6d 70 74    /* The attempt
30070 20 74 6f 20 65 78 74 65 6e 64 20 74 68 65 20 65   to extend the e
30080 78 69 73 74 69 6e 67 20 6d 61 70 70 69 6e 67 20  xisting mapping 
30090 66 61 69 6c 65 64 2e 20 46 72 65 65 20 69 74 2e  failed. Free it.
300a0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4e 65 77   */.    if( pNew
300b0 3d 3d 4d 41 50 5f 46 41 49 4c 45 44 20 7c 7c 20  ==MAP_FAILED || 
300c0 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pNew==0 ){.     
300d0 20 6f 73 4d 75 6e 6d 61 70 28 70 4f 72 69 67 2c   osMunmap(pOrig,
300e0 20 6e 52 65 75 73 65 29 3b 0a 20 20 20 20 7d 0a   nReuse);.    }.
300f0 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 70 4e 65    }..  /* If pNe
30100 77 20 69 73 20 73 74 69 6c 6c 20 4e 55 4c 4c 2c  w is still NULL,
30110 20 74 72 79 20 74 6f 20 63 72 65 61 74 65 20 61   try to create a
30120 6e 20 65 6e 74 69 72 65 6c 79 20 6e 65 77 20 6d  n entirely new m
30130 61 70 70 69 6e 67 2e 20 2a 2f 0a 20 20 69 66 28  apping. */.  if(
30140 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20   pNew==0 ){.    
30150 70 4e 65 77 20 3d 20 6f 73 4d 6d 61 70 28 30 2c  pNew = osMmap(0,
30160 20 6e 4e 65 77 2c 20 66 6c 61 67 73 2c 20 4d 41   nNew, flags, MA
30170 50 5f 53 48 41 52 45 44 2c 20 68 2c 20 30 29 3b  P_SHARED, h, 0);
30180 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4e 65 77  .  }..  if( pNew
30190 3d 3d 4d 41 50 5f 46 41 49 4c 45 44 20 29 7b 0a  ==MAP_FAILED ){.
301a0 20 20 20 20 70 4e 65 77 20 3d 20 30 3b 0a 20 20      pNew = 0;.  
301b0 20 20 6e 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20    nNew = 0;.    
301c0 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c  unixLogError(SQL
301d0 49 54 45 5f 4f 4b 2c 20 7a 45 72 72 2c 20 70 46  ITE_OK, zErr, pF
301e0 64 2d 3e 7a 50 61 74 68 29 3b 0a 0a 20 20 20 20  d->zPath);..    
301f0 2f 2a 20 49 66 20 74 68 65 20 6d 6d 61 70 28 29  /* If the mmap()
30200 20 61 62 6f 76 65 20 66 61 69 6c 65 64 2c 20 61   above failed, a
30210 73 73 75 6d 65 20 74 68 61 74 20 61 6c 6c 20 73  ssume that all s
30220 75 62 73 65 71 75 65 6e 74 20 6d 6d 61 70 28 29  ubsequent mmap()
30230 20 63 61 6c 6c 73 0a 20 20 20 20 2a 2a 20 77 69   calls.    ** wi
30240 6c 6c 20 70 72 6f 62 61 62 6c 79 20 66 61 69 6c  ll probably fail
30250 20 74 6f 6f 2e 20 46 61 6c 6c 20 62 61 63 6b 20   too. Fall back 
30260 74 6f 20 75 73 69 6e 67 20 78 52 65 61 64 2f 78  to using xRead/x
30270 57 72 69 74 65 20 65 78 63 6c 75 73 69 76 65 6c  Write exclusivel
30280 79 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 69 73  y.    ** in this
30290 20 63 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20 70   case.  */.    p
302a0 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20  Fd->mmapSizeMax 
302b0 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 46 64 2d 3e  = 0;.  }.  pFd->
302c0 70 4d 61 70 52 65 67 69 6f 6e 20 3d 20 28 76 6f  pMapRegion = (vo
302d0 69 64 20 2a 29 70 4e 65 77 3b 0a 20 20 70 46 64  id *)pNew;.  pFd
302e0 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d 20 70 46 64  ->mmapSize = pFd
302f0 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75 61 6c  ->mmapSizeActual
30300 20 3d 20 6e 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a   = nNew;.}../*.*
30310 2a 20 4d 65 6d 6f 72 79 20 6d 61 70 20 6f 72 20  * Memory map or 
30320 72 65 6d 61 70 20 74 68 65 20 66 69 6c 65 20 6f  remap the file o
30330 70 65 6e 65 64 20 62 79 20 66 69 6c 65 2d 64 65  pened by file-de
30340 73 63 72 69 70 74 6f 72 20 70 46 64 20 28 69 66  scriptor pFd (if
30350 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 69 73 20   the file.** is 
30360 61 6c 72 65 61 64 79 20 6d 61 70 70 65 64 2c 20  already mapped, 
30370 74 68 65 20 65 78 69 73 74 69 6e 67 20 6d 61 70  the existing map
30380 70 69 6e 67 20 69 73 20 72 65 70 6c 61 63 65 64  ping is replaced
30390 20 62 79 20 74 68 65 20 6e 65 77 29 2e 20 4f 72   by the new). Or
303a0 2c 20 69 66 20 0a 2a 2a 20 74 68 65 72 65 20 61  , if .** there a
303b0 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 61 20  lready exists a 
303c0 6d 61 70 70 69 6e 67 20 66 6f 72 20 74 68 69 73  mapping for this
303d0 20 66 69 6c 65 2c 20 61 6e 64 20 74 68 65 72 65   file, and there
303e0 20 61 72 65 20 73 74 69 6c 6c 20 0a 2a 2a 20 6f   are still .** o
303f0 75 74 73 74 61 6e 64 69 6e 67 20 78 46 65 74 63  utstanding xFetc
30400 68 28 29 20 72 65 66 65 72 65 6e 63 65 73 20 74  h() references t
30410 6f 20 69 74 2c 20 74 68 69 73 20 66 75 6e 63 74  o it, this funct
30420 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ion is a no-op..
30430 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74  **.** If paramet
30440 65 72 20 6e 42 79 74 65 20 69 73 20 6e 6f 6e 2d  er nByte is non-
30450 6e 65 67 61 74 69 76 65 2c 20 74 68 65 6e 20 69  negative, then i
30460 74 20 69 73 20 74 68 65 20 72 65 71 75 65 73 74  t is the request
30470 65 64 20 73 69 7a 65 20 6f 66 20 0a 2a 2a 20 74  ed size of .** t
30480 68 65 20 6d 61 70 70 69 6e 67 20 74 6f 20 63 72  he mapping to cr
30490 65 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  eate. Otherwise,
304a0 20 69 66 20 6e 42 79 74 65 20 69 73 20 6c 65 73   if nByte is les
304b0 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65  s than zero, the
304c0 6e 20 74 68 65 20 0a 2a 2a 20 72 65 71 75 65 73  n the .** reques
304d0 74 65 64 20 73 69 7a 65 20 69 73 20 74 68 65 20  ted size is the 
304e0 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65  size of the file
304f0 20 6f 6e 20 64 69 73 6b 2e 20 54 68 65 20 61 63   on disk. The ac
30500 74 75 61 6c 20 73 69 7a 65 20 6f 66 20 74 68 65  tual size of the
30510 0a 2a 2a 20 63 72 65 61 74 65 64 20 6d 61 70 70  .** created mapp
30520 69 6e 67 20 69 73 20 65 69 74 68 65 72 20 74 68  ing is either th
30530 65 20 72 65 71 75 65 73 74 65 64 20 73 69 7a 65  e requested size
30540 20 6f 72 20 74 68 65 20 76 61 6c 75 65 20 63 6f   or the value co
30550 6e 66 69 67 75 72 65 64 20 0a 2a 2a 20 75 73 69  nfigured .** usi
30560 6e 67 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  ng SQLITE_FCNTL_
30570 4d 4d 41 50 5f 4c 49 4d 49 54 2c 20 77 68 69 63  MMAP_LIMIT, whic
30580 68 65 76 65 72 20 69 73 20 73 6d 61 6c 6c 65 72  hever is smaller
30590 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ..**.** SQLITE_O
305a0 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  K is returned if
305b0 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   no error occurs
305c0 20 28 65 76 65 6e 20 69 66 20 74 68 65 20 6d 61   (even if the ma
305d0 70 70 69 6e 67 20 69 73 20 6e 6f 74 0a 2a 2a 20  pping is not.** 
305e0 72 65 63 72 65 61 74 65 64 20 61 73 20 61 20 72  recreated as a r
305f0 65 73 75 6c 74 20 6f 66 20 6f 75 74 73 74 61 6e  esult of outstan
30600 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 29  ding references)
30610 20 6f 72 20 61 6e 20 53 51 4c 69 74 65 20 65 72   or an SQLite er
30620 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 6f 74 68 65  ror.** code othe
30630 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  rwise..*/.static
30640 20 69 6e 74 20 75 6e 69 78 4d 61 70 66 69 6c 65   int unixMapfile
30650 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 64 2c 20  (unixFile *pFd, 
30660 69 36 34 20 6e 42 79 74 65 29 7b 0a 20 20 69 36  i64 nByte){.  i6
30670 34 20 6e 4d 61 70 20 3d 20 6e 42 79 74 65 3b 0a  4 nMap = nByte;.
30680 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
30690 65 72 74 28 20 6e 4d 61 70 3e 3d 30 20 7c 7c 20  ert( nMap>=0 || 
306a0 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d  pFd->nFetchOut==
306b0 30 20 29 3b 0a 20 20 69 66 28 20 70 46 64 2d 3e  0 );.  if( pFd->
306c0 6e 46 65 74 63 68 4f 75 74 3e 30 20 29 20 72 65  nFetchOut>0 ) re
306d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
306e0 0a 20 20 69 66 28 20 6e 4d 61 70 3c 30 20 29 7b  .  if( nMap<0 ){
306f0 0a 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74  .    struct stat
30700 20 73 74 61 74 62 75 66 3b 20 20 20 20 20 20 20   statbuf;       
30710 20 20 20 2f 2a 20 4c 6f 77 2d 6c 65 76 65 6c 20     /* Low-level 
30720 66 69 6c 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  file information
30730 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 6f 73 46   */.    rc = osF
30740 73 74 61 74 28 70 46 64 2d 3e 68 2c 20 26 73 74  stat(pFd->h, &st
30750 61 74 62 75 66 29 3b 0a 20 20 20 20 69 66 28 20  atbuf);.    if( 
30760 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
30770 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
30780 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54  LITE_IOERR_FSTAT
30790 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 4d 61 70  ;.    }.    nMap
307a0 20 3d 20 73 74 61 74 62 75 66 2e 73 74 5f 73 69   = statbuf.st_si
307b0 7a 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 4d  ze;.  }.  if( nM
307c0 61 70 3e 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65  ap>pFd->mmapSize
307d0 4d 61 78 20 29 7b 0a 20 20 20 20 6e 4d 61 70 20  Max ){.    nMap 
307e0 3d 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d  = pFd->mmapSizeM
307f0 61 78 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6e  ax;.  }..  if( n
30800 4d 61 70 21 3d 70 46 64 2d 3e 6d 6d 61 70 53 69  Map!=pFd->mmapSi
30810 7a 65 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 4d  ze ){.    if( nM
30820 61 70 3e 30 20 29 7b 0a 20 20 20 20 20 20 75 6e  ap>0 ){.      un
30830 69 78 52 65 6d 61 70 66 69 6c 65 28 70 46 64 2c  ixRemapfile(pFd,
30840 20 6e 4d 61 70 29 3b 0a 20 20 20 20 7d 65 6c 73   nMap);.    }els
30850 65 7b 0a 20 20 20 20 20 20 75 6e 69 78 55 6e 6d  e{.      unixUnm
30860 61 70 66 69 6c 65 28 70 46 64 29 3b 0a 20 20 20  apfile(pFd);.   
30870 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
30880 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
30890 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4d  ndif /* SQLITE_M
308a0 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 20 2a  AX_MMAP_SIZE>0 *
308b0 2f 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 70 6f 73 73  /../*.** If poss
308c0 69 62 6c 65 2c 20 72 65 74 75 72 6e 20 61 20 70  ible, return a p
308d0 6f 69 6e 74 65 72 20 74 6f 20 61 20 6d 61 70 70  ointer to a mapp
308e0 69 6e 67 20 6f 66 20 66 69 6c 65 20 66 64 20 73  ing of file fd s
308f0 74 61 72 74 69 6e 67 20 61 74 20 6f 66 66 73 65  tarting at offse
30900 74 0a 2a 2a 20 69 4f 66 66 2e 20 54 68 65 20 6d  t.** iOff. The m
30910 61 70 70 69 6e 67 20 6d 75 73 74 20 62 65 20 76  apping must be v
30920 61 6c 69 64 20 66 6f 72 20 61 74 20 6c 65 61 73  alid for at leas
30930 74 20 6e 41 6d 74 20 62 79 74 65 73 2e 0a 2a 2a  t nAmt bytes..**
30940 0a 2a 2a 20 49 66 20 73 75 63 68 20 61 20 70 6f  .** If such a po
30950 69 6e 74 65 72 20 63 61 6e 20 62 65 20 6f 62 74  inter can be obt
30960 61 69 6e 65 64 2c 20 73 74 6f 72 65 20 69 74 20  ained, store it 
30970 69 6e 20 2a 70 70 20 61 6e 64 20 72 65 74 75 72  in *pp and retur
30980 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20  n SQLITE_OK..** 
30990 4f 72 2c 20 69 66 20 6f 6e 65 20 63 61 6e 6e 6f  Or, if one canno
309a0 74 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f  t but no error o
309b0 63 63 75 72 73 2c 20 73 65 74 20 2a 70 70 20 74  ccurs, set *pp t
309c0 6f 20 30 20 61 6e 64 20 72 65 74 75 72 6e 20 53  o 0 and return S
309d0 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 46 69 6e  QLITE_OK..** Fin
309e0 61 6c 6c 79 2c 20 69 66 20 61 6e 20 65 72 72 6f  ally, if an erro
309f0 72 20 64 6f 65 73 20 6f 63 63 75 72 2c 20 72 65  r does occur, re
30a00 74 75 72 6e 20 61 6e 20 53 51 4c 69 74 65 20 65  turn an SQLite e
30a10 72 72 6f 72 20 63 6f 64 65 2e 20 54 68 65 20 66  rror code. The f
30a20 69 6e 61 6c 0a 2a 2a 20 76 61 6c 75 65 20 6f 66  inal.** value of
30a30 20 2a 70 70 20 69 73 20 75 6e 64 65 66 69 6e 65   *pp is undefine
30a40 64 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  d in this case..
30a50 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 66 75  **.** If this fu
30a60 6e 63 74 69 6f 6e 20 64 6f 65 73 20 72 65 74 75  nction does retu
30a70 72 6e 20 61 20 70 6f 69 6e 74 65 72 2c 20 74 68  rn a pointer, th
30a80 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 65 76  e caller must ev
30a90 65 6e 74 75 61 6c 6c 79 20 0a 2a 2a 20 72 65 6c  entually .** rel
30aa0 65 61 73 65 20 74 68 65 20 72 65 66 65 72 65 6e  ease the referen
30ab0 63 65 20 62 79 20 63 61 6c 6c 69 6e 67 20 75 6e  ce by calling un
30ac0 69 78 55 6e 66 65 74 63 68 28 29 2e 0a 2a 2f 0a  ixUnfetch()..*/.
30ad0 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 46  static int unixF
30ae0 65 74 63 68 28 73 71 6c 69 74 65 33 5f 66 69 6c  etch(sqlite3_fil
30af0 65 20 2a 66 64 2c 20 69 36 34 20 69 4f 66 66 2c  e *fd, i64 iOff,
30b00 20 69 6e 74 20 6e 41 6d 74 2c 20 76 6f 69 64 20   int nAmt, void 
30b10 2a 2a 70 70 29 7b 0a 23 69 66 20 53 51 4c 49 54  **pp){.#if SQLIT
30b20 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
30b30 30 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  0.  unixFile *pF
30b40 64 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29  d = (unixFile *)
30b50 66 64 3b 20 20 20 2f 2a 20 54 68 65 20 75 6e 64  fd;   /* The und
30b60 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65  erlying database
30b70 20 66 69 6c 65 20 2a 2f 0a 23 65 6e 64 69 66 0a   file */.#endif.
30b80 20 20 2a 70 70 20 3d 20 30 3b 0a 0a 23 69 66 20    *pp = 0;..#if 
30b90 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
30ba0 53 49 5a 45 3e 30 0a 20 20 69 66 28 20 70 46 64  SIZE>0.  if( pFd
30bb0 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 3e 30 20  ->mmapSizeMax>0 
30bc0 29 7b 0a 20 20 20 20 69 66 28 20 70 46 64 2d 3e  ){.    if( pFd->
30bd0 70 4d 61 70 52 65 67 69 6f 6e 3d 3d 30 20 29 7b  pMapRegion==0 ){
30be0 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20  .      int rc = 
30bf0 75 6e 69 78 4d 61 70 66 69 6c 65 28 70 46 64 2c  unixMapfile(pFd,
30c00 20 2d 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20   -1);.      if( 
30c10 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
30c20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
30c30 0a 20 20 20 20 69 66 28 20 70 46 64 2d 3e 6d 6d  .    if( pFd->mm
30c40 61 70 53 69 7a 65 20 3e 3d 20 69 4f 66 66 2b 6e  apSize >= iOff+n
30c50 41 6d 74 20 29 7b 0a 20 20 20 20 20 20 2a 70 70  Amt ){.      *pp
30c60 20 3d 20 26 28 28 75 38 20 2a 29 70 46 64 2d 3e   = &((u8 *)pFd->
30c70 70 4d 61 70 52 65 67 69 6f 6e 29 5b 69 4f 66 66  pMapRegion)[iOff
30c80 5d 3b 0a 20 20 20 20 20 20 70 46 64 2d 3e 6e 46  ];.      pFd->nF
30c90 65 74 63 68 4f 75 74 2b 2b 3b 0a 20 20 20 20 7d  etchOut++;.    }
30ca0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65  .  }.#endif.  re
30cb0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
30cc0 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  }../*.** If the 
30cd0 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74 20 69  third argument i
30ce0 73 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74 68 65 6e  s non-NULL, then
30cf0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
30d00 65 6c 65 61 73 65 73 20 61 20 0a 2a 2a 20 72 65  eleases a .** re
30d10 66 65 72 65 6e 63 65 20 6f 62 74 61 69 6e 65 64  ference obtained
30d20 20 62 79 20 61 6e 20 65 61 72 6c 69 65 72 20 63   by an earlier c
30d30 61 6c 6c 20 74 6f 20 75 6e 69 78 46 65 74 63 68  all to unixFetch
30d40 28 29 2e 20 54 68 65 20 73 65 63 6f 6e 64 0a 2a  (). The second.*
30d50 2a 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65  * argument passe
30d60 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  d to this functi
30d70 6f 6e 20 6d 75 73 74 20 62 65 20 74 68 65 20 73  on must be the s
30d80 61 6d 65 20 61 73 20 74 68 65 20 63 6f 72 72 65  ame as the corre
30d90 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 61 72 67 75  sponding.** argu
30da0 6d 65 6e 74 20 74 68 61 74 20 77 61 73 20 70 61  ment that was pa
30db0 73 73 65 64 20 74 6f 20 74 68 65 20 75 6e 69 78  ssed to the unix
30dc0 46 65 74 63 68 28 29 20 69 6e 76 6f 63 61 74 69  Fetch() invocati
30dd0 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69  on. .**.** Or, i
30de0 66 20 74 68 65 20 74 68 69 72 64 20 61 72 67 75  f the third argu
30df0 6d 65 6e 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68  ment is NULL, th
30e00 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
30e10 20 69 73 20 62 65 69 6e 67 20 63 61 6c 6c 65 64   is being called
30e20 20 0a 2a 2a 20 74 6f 20 69 6e 66 6f 72 6d 20 74   .** to inform t
30e30 68 65 20 56 46 53 20 6c 61 79 65 72 20 74 68 61  he VFS layer tha
30e40 74 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  t, according to 
30e50 50 4f 53 49 58 2c 20 61 6e 79 20 65 78 69 73 74  POSIX, any exist
30e60 69 6e 67 20 6d 61 70 70 69 6e 67 20 0a 2a 2a 20  ing mapping .** 
30e70 6d 61 79 20 6e 6f 77 20 62 65 20 69 6e 76 61 6c  may now be inval
30e80 69 64 20 61 6e 64 20 73 68 6f 75 6c 64 20 62 65  id and should be
30e90 20 75 6e 6d 61 70 70 65 64 2e 0a 2a 2f 0a 73 74   unmapped..*/.st
30ea0 61 74 69 63 20 69 6e 74 20 75 6e 69 78 55 6e 66  atic int unixUnf
30eb0 65 74 63 68 28 73 71 6c 69 74 65 33 5f 66 69 6c  etch(sqlite3_fil
30ec0 65 20 2a 66 64 2c 20 69 36 34 20 69 4f 66 66 2c  e *fd, i64 iOff,
30ed0 20 76 6f 69 64 20 2a 70 29 7b 0a 23 69 66 20 53   void *p){.#if S
30ee0 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
30ef0 49 5a 45 3e 30 0a 20 20 75 6e 69 78 46 69 6c 65  IZE>0.  unixFile
30f00 20 2a 70 46 64 20 3d 20 28 75 6e 69 78 46 69 6c   *pFd = (unixFil
30f10 65 20 2a 29 66 64 3b 20 20 20 2f 2a 20 54 68 65  e *)fd;   /* The
30f20 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61 74 61   underlying data
30f30 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 55  base file */.  U
30f40 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
30f50 69 4f 66 66 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  iOff);..  /* If 
30f60 70 3d 3d 30 20 28 75 6e 6d 61 70 20 74 68 65 20  p==0 (unmap the 
30f70 65 6e 74 69 72 65 20 66 69 6c 65 29 20 74 68 65  entire file) the
30f80 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62 65 20  n there must be 
30f90 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 0a  no outstanding .
30fa0 20 20 2a 2a 20 78 46 65 74 63 68 20 72 65 66 65    ** xFetch refe
30fb0 72 65 6e 63 65 73 2e 20 4f 72 2c 20 69 66 20 70  rences. Or, if p
30fc0 21 3d 30 20 28 6d 65 61 6e 69 6e 67 20 69 74 20  !=0 (meaning it 
30fd0 69 73 20 61 6e 20 78 46 65 74 63 68 20 72 65 66  is an xFetch ref
30fe0 65 72 65 6e 63 65 29 2c 0a 20 20 2a 2a 20 74 68  erence),.  ** th
30ff0 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62 65  en there must be
31000 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 6f 75   at least one ou
31010 74 73 74 61 6e 64 69 6e 67 2e 20 20 2a 2f 0a 20  tstanding.  */. 
31020 20 61 73 73 65 72 74 28 20 28 70 3d 3d 30 29 3d   assert( (p==0)=
31030 3d 28 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74  =(pFd->nFetchOut
31040 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  ==0) );..  /* If
31050 20 70 21 3d 30 2c 20 69 74 20 6d 75 73 74 20 6d   p!=0, it must m
31060 61 74 63 68 20 74 68 65 20 69 4f 66 66 20 76 61  atch the iOff va
31070 6c 75 65 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74  lue. */.  assert
31080 28 20 70 3d 3d 30 20 7c 7c 20 70 3d 3d 26 28 28  ( p==0 || p==&((
31090 75 38 20 2a 29 70 46 64 2d 3e 70 4d 61 70 52 65  u8 *)pFd->pMapRe
310a0 67 69 6f 6e 29 5b 69 4f 66 66 5d 20 29 3b 0a 0a  gion)[iOff] );..
310b0 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 70    if( p ){.    p
310c0 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 2d 2d 3b  Fd->nFetchOut--;
310d0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75 6e  .  }else{.    un
310e0 69 78 55 6e 6d 61 70 66 69 6c 65 28 70 46 64 29  ixUnmapfile(pFd)
310f0 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
31100 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3e   pFd->nFetchOut>
31110 3d 30 20 29 3b 0a 23 65 6c 73 65 0a 20 20 55 4e  =0 );.#else.  UN
31120 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66  USED_PARAMETER(f
31130 64 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  d);.  UNUSED_PAR
31140 41 4d 45 54 45 52 28 70 29 3b 0a 20 20 55 4e 55  AMETER(p);.  UNU
31150 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 69 4f  SED_PARAMETER(iO
31160 66 66 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65  ff);.#endif.  re
31170 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
31180 7d 0a 0a 2f 2a 0a 2a 2a 20 48 65 72 65 20 65 6e  }../*.** Here en
31190 64 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74  ds the implement
311a0 61 74 69 6f 6e 20 6f 66 20 61 6c 6c 20 73 71 6c  ation of all sql
311b0 69 74 65 33 5f 66 69 6c 65 20 6d 65 74 68 6f 64  ite3_file method
311c0 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  s..**.**********
311d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64  ************ End
311e0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 4d 65   sqlite3_file Me
311f0 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  thods **********
31200 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
31210 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
31220 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
31230 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
31240 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
31250 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
31260 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ****/../*.** Thi
31270 73 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e 74 61  s division conta
31280 69 6e 73 20 64 65 66 69 6e 69 74 69 6f 6e 73 20  ins definitions 
31290 6f 66 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  of sqlite3_io_me
312a0 74 68 6f 64 73 20 6f 62 6a 65 63 74 73 20 74 68  thods objects th
312b0 61 74 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 20  at.** implement 
312c0 76 61 72 69 6f 75 73 20 66 69 6c 65 20 6c 6f 63  various file loc
312d0 6b 69 6e 67 20 73 74 72 61 74 65 67 69 65 73 2e  king strategies.
312e0 20 20 49 74 20 61 6c 73 6f 20 63 6f 6e 74 61 69    It also contai
312f0 6e 73 20 64 65 66 69 6e 69 74 69 6f 6e 73 0a 2a  ns definitions.*
31300 2a 20 6f 66 20 22 66 69 6e 64 65 72 22 20 66 75  * of "finder" fu
31310 6e 63 74 69 6f 6e 73 2e 20 20 41 20 66 69 6e 64  nctions.  A find
31320 65 72 2d 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  er-function is u
31330 73 65 64 20 74 6f 20 6c 6f 63 61 74 65 20 74 68  sed to locate th
31340 65 20 61 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a  e appropriate.**
31350 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
31360 6f 64 73 20 6f 62 6a 65 63 74 20 66 6f 72 20 61  ods object for a
31370 20 70 61 72 74 69 63 75 6c 61 72 20 64 61 74 61   particular data
31380 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68 65 20  base file.  The 
31390 70 41 70 70 44 61 74 61 0a 2a 2a 20 66 69 65 6c  pAppData.** fiel
313a0 64 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33  d of the sqlite3
313b0 5f 76 66 73 20 56 46 53 20 6f 62 6a 65 63 74 73  _vfs VFS objects
313c0 20 61 72 65 20 69 6e 69 74 69 61 6c 69 7a 65 64   are initialized
313d0 20 74 6f 20 62 65 20 70 6f 69 6e 74 65 72 73 20   to be pointers 
313e0 74 6f 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65 63  to.** the correc
313f0 74 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f  t finder-functio
31400 6e 20 66 6f 72 20 74 68 61 74 20 56 46 53 2e 0a  n for that VFS..
31410 2a 2a 0a 2a 2a 20 4d 6f 73 74 20 66 69 6e 64 65  **.** Most finde
31420 72 20 66 75 6e 63 74 69 6f 6e 73 20 72 65 74 75  r functions retu
31430 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
31440 61 20 66 69 78 65 64 20 73 71 6c 69 74 65 33 5f  a fixed sqlite3_
31450 69 6f 5f 6d 65 74 68 6f 64 73 0a 2a 2a 20 6f 62  io_methods.** ob
31460 6a 65 63 74 2e 20 20 54 68 65 20 6f 6e 6c 79 20  ject.  The only 
31470 69 6e 74 65 72 65 73 74 69 6e 67 20 66 69 6e 64  interesting find
31480 65 72 2d 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  er-function is a
31490 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c  utolockIoFinder,
314a0 20 77 68 69 63 68 0a 2a 2a 20 6c 6f 6f 6b 73 20   which.** looks 
314b0 61 74 20 74 68 65 20 66 69 6c 65 73 79 73 74 65  at the filesyste
314c0 6d 20 74 79 70 65 20 61 6e 64 20 74 72 69 65 73  m type and tries
314d0 20 74 6f 20 67 75 65 73 73 20 74 68 65 20 62 65   to guess the be
314e0 73 74 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 73 74  st locking.** st
314f0 72 61 74 65 67 79 20 66 72 6f 6d 20 74 68 61 74  rategy from that
31500 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 66 69 6e 64  ..**.** For find
31510 65 72 2d 66 75 6e 63 74 69 6f 6e 20 46 2c 20 74  er-function F, t
31520 77 6f 20 6f 62 6a 65 63 74 73 20 61 72 65 20 63  wo objects are c
31530 72 65 61 74 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20  reated:.**.**   
31540 20 28 31 29 20 54 68 65 20 72 65 61 6c 20 66 69   (1) The real fi
31550 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 6e 61  nder-function na
31560 6d 65 64 20 22 46 49 6d 70 74 28 29 22 2e 0a 2a  med "FImpt()"..*
31570 2a 0a 2a 2a 20 20 20 20 28 32 29 20 41 20 63 6f  *.**    (2) A co
31580 6e 73 74 61 6e 74 20 70 6f 69 6e 74 65 72 20 74  nstant pointer t
31590 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  o this function 
315a0 6e 61 6d 65 64 20 6a 75 73 74 20 22 46 22 2e 0a  named just "F"..
315b0 2a 2a 0a 2a 2a 0a 2a 2a 20 41 20 70 6f 69 6e 74  **.**.** A point
315c0 65 72 20 74 6f 20 74 68 65 20 46 20 70 6f 69 6e  er to the F poin
315d0 74 65 72 20 69 73 20 75 73 65 64 20 61 73 20 74  ter is used as t
315e0 68 65 20 70 41 70 70 44 61 74 61 20 76 61 6c 75  he pAppData valu
315f0 65 20 66 6f 72 20 56 46 53 0a 2a 2a 20 6f 62 6a  e for VFS.** obj
31600 65 63 74 73 2e 20 20 57 65 20 68 61 76 65 20 74  ects.  We have t
31610 6f 20 64 6f 20 74 68 69 73 20 69 6e 73 74 65 61  o do this instea
31620 64 20 6f 66 20 6c 65 74 74 69 6e 67 20 70 41 70  d of letting pAp
31630 70 44 61 74 61 20 70 6f 69 6e 74 0a 2a 2a 20 64  pData point.** d
31640 69 72 65 63 74 6c 79 20 61 74 20 74 68 65 20 66  irectly at the f
31650 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 73  inder-function s
31660 69 6e 63 65 20 43 39 30 20 72 75 6c 65 73 20 70  ince C90 rules p
31670 72 65 76 65 6e 74 20 61 20 76 6f 69 64 2a 0a 2a  revent a void*.*
31680 2a 20 66 72 6f 6d 20 62 65 20 63 61 73 74 20 69  * from be cast i
31690 6e 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20 70  nto a function p
316a0 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a  ointer..**.**.**
316b0 20 45 61 63 68 20 69 6e 73 74 61 6e 63 65 20 6f   Each instance o
316c0 66 20 74 68 69 73 20 6d 61 63 72 6f 20 67 65 6e  f this macro gen
316d0 65 72 61 74 65 73 20 74 77 6f 20 6f 62 6a 65 63  erates two objec
316e0 74 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 41  ts:.**.**   *  A
316f0 20 63 6f 6e 73 74 61 6e 74 20 73 71 6c 69 74 65   constant sqlite
31700 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a  3_io_methods obj
31710 65 63 74 20 63 61 6c 6c 20 4d 45 54 48 4f 44 20  ect call METHOD 
31720 74 68 61 74 20 68 61 73 20 6c 6f 63 6b 69 6e 67  that has locking
31730 0a 2a 2a 20 20 20 20 20 20 6d 65 74 68 6f 64 73  .**      methods
31740 20 43 4c 4f 53 45 2c 20 4c 4f 43 4b 2c 20 55 4e   CLOSE, LOCK, UN
31750 4c 4f 43 4b 2c 20 43 4b 52 45 53 4c 4f 43 4b 2e  LOCK, CKRESLOCK.
31760 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 41 6e 20 49  .**.**   *  An I
31770 2f 4f 20 6d 65 74 68 6f 64 20 66 69 6e 64 65 72  /O method finder
31780 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64   function called
31790 20 46 49 4e 44 45 52 20 74 68 61 74 20 72 65 74   FINDER that ret
317a0 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72 0a 2a  urns a pointer.*
317b0 2a 20 20 20 20 20 20 74 6f 20 74 68 65 20 4d 45  *      to the ME
317c0 54 48 4f 44 20 6f 62 6a 65 63 74 20 69 6e 20 74  THOD object in t
317d0 68 65 20 70 72 65 76 69 6f 75 73 20 62 75 6c 6c  he previous bull
317e0 65 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 49  et..*/.#define I
317f0 4f 4d 45 54 48 4f 44 53 28 46 49 4e 44 45 52 2c  OMETHODS(FINDER,
31800 4d 45 54 48 4f 44 2c 56 45 52 53 49 4f 4e 2c 43  METHOD,VERSION,C
31810 4c 4f 53 45 2c 4c 4f 43 4b 2c 55 4e 4c 4f 43 4b  LOSE,LOCK,UNLOCK
31820 2c 43 4b 4c 4f 43 4b 2c 53 48 4d 4d 41 50 29 20  ,CKLOCK,SHMMAP) 
31830 20 20 20 20 5c 0a 73 74 61 74 69 63 20 63 6f 6e      \.static con
31840 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  st sqlite3_io_me
31850 74 68 6f 64 73 20 4d 45 54 48 4f 44 20 3d 20 7b  thods METHOD = {
31860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31880 20 20 20 5c 0a 20 20 20 56 45 52 53 49 4f 4e 2c     \.   VERSION,
31890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
318a0 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20      /* iVersion 
318b0 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
318c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
318d0 20 20 5c 0a 20 20 20 43 4c 4f 53 45 2c 20 20 20    \.   CLOSE,   
318e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
318f0 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 2a 2f 20     /* xClose */ 
31900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31920 20 5c 0a 20 20 20 75 6e 69 78 52 65 61 64 2c 20   \.   unixRead, 
31930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31940 20 20 2f 2a 20 78 52 65 61 64 20 2a 2f 20 20 20    /* xRead */   
31950 20 20 20 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 5c 0a 20 20 20 75 6e 69 78 57 72 69 74 65 2c 20  \.   unixWrite, 
31980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31990 20 2f 2a 20 78 57 72 69 74 65 20 2a 2f 20 20 20   /* xWrite */   
319a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
319b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
319c0 0a 20 20 20 75 6e 69 78 54 72 75 6e 63 61 74 65  .   unixTruncate
319d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
319e0 2f 2a 20 78 54 72 75 6e 63 61 74 65 20 2a 2f 20  /* xTruncate */ 
319f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
31a10 20 20 20 75 6e 69 78 53 79 6e 63 2c 20 20 20 20     unixSync,    
31a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
31a30 2a 20 78 53 79 6e 63 20 2a 2f 20 20 20 20 20 20  * xSync */      
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 5c 0a 20               \. 
31a60 20 20 75 6e 69 78 46 69 6c 65 53 69 7a 65 2c 20    unixFileSize, 
31a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
31a80 20 78 46 69 6c 65 53 69 7a 65 20 2a 2f 20 20 20   xFileSize */   
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 5c 0a 20 20              \.  
31ab0 20 4c 4f 43 4b 2c 20 20 20 20 20 20 20 20 20 20   LOCK,          
31ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
31ad0 78 4c 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20 20  xLock */        
31ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31af0 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
31b00 55 4e 4c 4f 43 4b 2c 20 20 20 20 20 20 20 20 20  UNLOCK,         
31b10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
31b20 55 6e 6c 6f 63 6b 20 2a 2f 20 20 20 20 20 20 20  Unlock */       
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 5c 0a 20 20 20 43            \.   C
31b50 4b 4c 4f 43 4b 2c 20 20 20 20 20 20 20 20 20 20  KLOCK,          
31b60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43             /* xC
31b70 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
31b80 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
31b90 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e           \.   un
31ba0 69 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 2c 20 20  ixFileControl,  
31bb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69            /* xFi
31bc0 6c 65 43 6f 6e 74 72 6f 6c 20 2a 2f 20 20 20 20  leControl */    
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 5c 0a 20 20 20 75 6e 69          \.   uni
31bf0 78 53 65 63 74 6f 72 53 69 7a 65 2c 20 20 20 20  xSectorSize,    
31c00 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 65 63           /* xSec
31c10 74 6f 72 53 69 7a 65 20 2a 2f 20 20 20 20 20 20  torSize */      
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 5c 0a 20 20 20 75 6e 69 78         \.   unix
31c40 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
31c50 73 74 69 63 73 2c 20 20 2f 2a 20 78 44 65 76 69  stics,  /* xDevi
31c60 63 65 43 61 70 61 62 69 6c 69 74 69 65 73 20 2a  ceCapabilities *
31c70 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
31c80 20 20 20 20 20 20 5c 0a 20 20 20 53 48 4d 4d 41        \.   SHMMA
31c90 50 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  P,              
31ca0 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61         /* xShmMa
31cb0 70 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  p */            
31cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31cd0 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 68       \.   unixSh
31ce0 6d 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  mLock,          
31cf0 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4c 6f 63        /* xShmLoc
31d00 6b 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  k */            
31d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31d20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 68 6d      \.   unixShm
31d30 42 61 72 72 69 65 72 2c 20 20 20 20 20 20 20 20  Barrier,        
31d40 20 20 20 20 20 2f 2a 20 78 53 68 6d 42 61 72 72       /* xShmBarr
31d50 69 65 72 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ier */          
31d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31d70 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 68 6d 55     \.   unixShmU
31d80 6e 6d 61 70 2c 20 20 20 20 20 20 20 20 20 20 20  nmap,           
31d90 20 20 20 20 2f 2a 20 78 53 68 6d 55 6e 6d 61 70      /* xShmUnmap
31da0 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
31db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31dc0 20 20 5c 0a 20 20 20 75 6e 69 78 46 65 74 63 68    \.   unixFetch
31dd0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
31de0 20 20 20 2f 2a 20 78 46 65 74 63 68 20 2a 2f 20     /* xFetch */ 
31df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31e10 20 5c 0a 20 20 20 75 6e 69 78 55 6e 66 65 74 63   \.   unixUnfetc
31e20 68 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h,              
31e30 20 20 2f 2a 20 78 55 6e 66 65 74 63 68 20 2a 2f    /* xUnfetch */
31e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31e60 5c 0a 7d 3b 20 20 20 20 20 20 20 20 20 20 20 20  \.};            
31e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
31eb0 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71  .static const sq
31ec0 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
31ed0 20 2a 46 49 4e 44 45 52 23 23 49 6d 70 6c 28 63   *FINDER##Impl(c
31ee0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 75 6e  onst char *z, un
31ef0 69 78 46 69 6c 65 20 2a 70 29 7b 20 20 20 5c 0a  ixFile *p){   \.
31f00 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
31f10 45 52 28 7a 29 3b 20 55 4e 55 53 45 44 5f 50 41  ER(z); UNUSED_PA
31f20 52 41 4d 45 54 45 52 28 70 29 3b 20 20 20 20 20  RAMETER(p);     
31f30 20 20 20 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 5c 0a 20               \. 
31f50 20 72 65 74 75 72 6e 20 26 4d 45 54 48 4f 44 3b   return &METHOD;
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 5c 0a 7d 20              \.} 
31fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31fe0 20 20 20 20 20 20 20 20 20 20 20 5c 0a 73 74 61             \.sta
31ff0 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  tic const sqlite
32000 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 28 2a  3_io_methods *(*
32010 63 6f 6e 73 74 20 46 49 4e 44 45 52 29 28 63 6f  const FINDER)(co
32020 6e 73 74 20 63 68 61 72 2a 2c 75 6e 69 78 46 69  nst char*,unixFi
32030 6c 65 20 2a 70 29 20 20 20 20 5c 0a 20 20 20 20  le *p)    \.    
32040 3d 20 46 49 4e 44 45 52 23 23 49 6d 70 6c 3b 0a  = FINDER##Impl;.
32050 0a 2f 2a 0a 2a 2a 20 48 65 72 65 20 61 72 65 20  ./*.** Here are 
32060 61 6c 6c 20 6f 66 20 74 68 65 20 73 71 6c 69 74  all of the sqlit
32070 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62  e3_io_methods ob
32080 6a 65 63 74 73 20 66 6f 72 20 65 61 63 68 20 6f  jects for each o
32090 66 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b 69 6e 67  f the.** locking
320a0 20 73 74 72 61 74 65 67 69 65 73 2e 20 20 46 75   strategies.  Fu
320b0 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 72 65 74  nctions that ret
320c0 75 72 6e 20 70 6f 69 6e 74 65 72 73 20 74 6f 20  urn pointers to 
320d0 74 68 65 73 65 20 6d 65 74 68 6f 64 73 0a 2a 2a  these methods.**
320e0 20 61 72 65 20 61 6c 73 6f 20 63 72 65 61 74 65   are also create
320f0 64 2e 0a 2a 2f 0a 49 4f 4d 45 54 48 4f 44 53 28  d..*/.IOMETHODS(
32100 0a 20 20 70 6f 73 69 78 49 6f 46 69 6e 64 65 72  .  posixIoFinder
32110 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
32120 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20  Finder function 
32130 6e 61 6d 65 20 2a 2f 0a 20 20 70 6f 73 69 78 49  name */.  posixI
32140 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20  oMethods,       
32150 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69      /* sqlite3_i
32160 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74  o_methods object
32170 20 6e 61 6d 65 20 2a 2f 0a 20 20 33 2c 20 20 20   name */.  3,   
32180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32190 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d       /* shared m
321a0 65 6d 6f 72 79 20 61 6e 64 20 6d 6d 61 70 20 61  emory and mmap a
321b0 72 65 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20  re enabled */.  
321c0 75 6e 69 78 43 6c 6f 73 65 2c 20 20 20 20 20 20  unixClose,      
321d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c            /* xCl
321e0 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ose method */.  
321f0 75 6e 69 78 4c 6f 63 6b 2c 20 20 20 20 20 20 20  unixLock,       
32200 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f            /* xLo
32210 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75  ck method */.  u
32220 6e 69 78 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20  nixUnlock,      
32230 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c           /* xUnl
32240 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
32250 75 6e 69 78 43 68 65 63 6b 52 65 73 65 72 76 65  unixCheckReserve
32260 64 4c 6f 63 6b 2c 20 20 20 20 2f 2a 20 78 43 68  dLock,    /* xCh
32270 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20  eckReservedLock 
32280 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78  method */.  unix
32290 53 68 6d 4d 61 70 20 20 20 20 20 20 20 20 20 20  ShmMap          
322a0 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70        /* xShmMap
322b0 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 49 4f 4d   method */.).IOM
322c0 45 54 48 4f 44 53 28 0a 20 20 6e 6f 6c 6f 63 6b  ETHODS(.  nolock
322d0 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20  IoFinder,       
322e0 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75      /* Finder fu
322f0 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20  nction name */. 
32300 20 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73   nolockIoMethods
32310 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71  ,          /* sq
32320 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
32330 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a   object name */.
32340 20 20 32 2c 20 20 20 20 20 20 20 20 20 20 20 20    2,            
32350 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
32360 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20  hared memory is 
32370 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20 6e 6f 6c  enabled */.  nol
32380 6f 63 6b 43 6c 6f 73 65 2c 20 20 20 20 20 20 20  ockClose,       
32390 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65         /* xClose
323a0 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c   method */.  nol
323b0 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20  ockLock,        
323c0 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20         /* xLock 
323d0 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c 6f  method */.  nolo
323e0 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20  ckUnlock,       
323f0 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b        /* xUnlock
32400 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c   method */.  nol
32410 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64  ockCheckReserved
32420 4c 6f 63 6b 2c 20 20 2f 2a 20 78 43 68 65 63 6b  Lock,  /* xCheck
32430 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74  ReservedLock met
32440 68 6f 64 20 2a 2f 0a 20 20 30 20 20 20 20 20 20  hod */.  0      
32450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32460 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20 6d 65     /* xShmMap me
32470 74 68 6f 64 20 2a 2f 0a 29 0a 49 4f 4d 45 54 48  thod */.).IOMETH
32480 4f 44 53 28 0a 20 20 64 6f 74 6c 6f 63 6b 49 6f  ODS(.  dotlockIo
32490 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20  Finder,         
324a0 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74   /* Finder funct
324b0 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 64 6f  ion name */.  do
324c0 74 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 2c 20  tlockIoMethods, 
324d0 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74          /* sqlit
324e0 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62  e3_io_methods ob
324f0 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31  ject name */.  1
32500 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
32510 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72           /* shar
32520 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73  ed memory is dis
32530 61 62 6c 65 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f  abled */.  dotlo
32540 63 6b 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20  ckClose,        
32550 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d       /* xClose m
32560 65 74 68 6f 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f  ethod */.  dotlo
32570 63 6b 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  ckLock,         
32580 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65       /* xLock me
32590 74 68 6f 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63  thod */.  dotloc
325a0 6b 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20  kUnlock,        
325b0 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d      /* xUnlock m
325c0 65 74 68 6f 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f  ethod */.  dotlo
325d0 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  ckCheckReservedL
325e0 6f 63 6b 2c 20 2f 2a 20 78 43 68 65 63 6b 52 65  ock, /* xCheckRe
325f0 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f  servedLock metho
32600 64 20 2a 2f 0a 20 20 30 20 20 20 20 20 20 20 20  d */.  0        
32610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32620 20 2f 2a 20 78 53 68 6d 4d 61 70 20 6d 65 74 68   /* xShmMap meth
32630 6f 64 20 2a 2f 0a 29 0a 0a 23 69 66 20 53 51 4c  od */.)..#if SQL
32640 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
32650 4e 47 5f 53 54 59 4c 45 0a 49 4f 4d 45 54 48 4f  NG_STYLE.IOMETHO
32660 44 53 28 0a 20 20 66 6c 6f 63 6b 49 6f 46 69 6e  DS(.  flockIoFin
32670 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  der,            
32680 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69  /* Finder functi
32690 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 66 6c 6f  on name */.  flo
326a0 63 6b 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20  ckIoMethods,    
326b0 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65         /* sqlite
326c0 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a  3_io_methods obj
326d0 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c  ect name */.  1,
326e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
326f0 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65          /* share
32700 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73 61  d memory is disa
32710 62 6c 65 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b 43  bled */.  flockC
32720 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  lose,           
32730 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65      /* xClose me
32740 74 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b 4c  thod */.  flockL
32750 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
32760 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74      /* xLock met
32770 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b 55 6e  hod */.  flockUn
32780 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  lock,           
32790 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65     /* xUnlock me
327a0 74 68 6f 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b 43  thod */.  flockC
327b0 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
327c0 2c 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73  ,   /* xCheckRes
327d0 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64  ervedLock method
327e0 20 2a 2f 0a 20 20 30 20 20 20 20 20 20 20 20 20   */.  0         
327f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32800 2f 2a 20 78 53 68 6d 4d 61 70 20 6d 65 74 68 6f  /* xShmMap metho
32810 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 23  d */.).#endif..#
32820 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 49 4f  if OS_VXWORKS.IO
32830 4d 45 54 48 4f 44 53 28 0a 20 20 73 65 6d 49 6f  METHODS(.  semIo
32840 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20  Finder,         
32850 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66       /* Finder f
32860 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a  unction name */.
32870 20 20 73 65 6d 49 6f 4d 65 74 68 6f 64 73 2c 20    semIoMethods, 
32880 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73              /* s
32890 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
328a0 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f  s object name */
328b0 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20 20 20  .  1,           
328c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
328d0 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73  shared memory is
328e0 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 73   disabled */.  s
328f0 65 6d 58 43 6c 6f 73 65 2c 20 20 20 20 20 20 20  emXClose,       
32900 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f           /* xClo
32910 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 73  se method */.  s
32920 65 6d 58 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20  emXLock,        
32930 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63           /* xLoc
32940 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 73 65  k method */.  se
32950 6d 58 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20  mXUnlock,       
32960 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f          /* xUnlo
32970 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 73  ck method */.  s
32980 65 6d 58 43 68 65 63 6b 52 65 73 65 72 76 65 64  emXCheckReserved
32990 4c 6f 63 6b 2c 20 20 20 20 2f 2a 20 78 43 68 65  Lock,    /* xChe
329a0 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d  ckReservedLock m
329b0 65 74 68 6f 64 20 2a 2f 0a 20 20 30 20 20 20 20  ethod */.  0    
329c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
329d0 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20       /* xShmMap 
329e0 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64  method */.).#end
329f0 69 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  if..#if defined(
32a00 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51  __APPLE__) && SQ
32a10 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
32a20 49 4e 47 5f 53 54 59 4c 45 0a 49 4f 4d 45 54 48  ING_STYLE.IOMETH
32a30 4f 44 53 28 0a 20 20 61 66 70 49 6f 46 69 6e 64  ODS(.  afpIoFind
32a40 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
32a50 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74   /* Finder funct
32a60 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 61 66  ion name */.  af
32a70 70 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20  pIoMethods,     
32a80 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74          /* sqlit
32a90 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62  e3_io_methods ob
32aa0 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31  ject name */.  1
32ab0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
32ac0 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72           /* shar
32ad0 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73  ed memory is dis
32ae0 61 62 6c 65 64 20 2a 2f 0a 20 20 61 66 70 43 6c  abled */.  afpCl
32af0 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ose,            
32b00 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d       /* xClose m
32b10 65 74 68 6f 64 20 2a 2f 0a 20 20 61 66 70 4c 6f  ethod */.  afpLo
32b20 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
32b30 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65       /* xLock me
32b40 74 68 6f 64 20 2a 2f 0a 20 20 61 66 70 55 6e 6c  thod */.  afpUnl
32b50 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
32b60 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d      /* xUnlock m
32b70 65 74 68 6f 64 20 2a 2f 0a 20 20 61 66 70 43 68  ethod */.  afpCh
32b80 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c  eckReservedLock,
32b90 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65       /* xCheckRe
32ba0 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f  servedLock metho
32bb0 64 20 2a 2f 0a 20 20 30 20 20 20 20 20 20 20 20  d */.  0        
32bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32bd0 20 2f 2a 20 78 53 68 6d 4d 61 70 20 6d 65 74 68   /* xShmMap meth
32be0 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a  od */.).#endif..
32bf0 2f 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79 20  /*.** The proxy 
32c00 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 20 69  locking method i
32c10 73 20 61 20 22 73 75 70 65 72 2d 6d 65 74 68 6f  s a "super-metho
32c20 64 22 20 69 6e 20 74 68 65 20 73 65 6e 73 65 20  d" in the sense 
32c30 74 68 61 74 20 69 74 0a 2a 2a 20 6f 70 65 6e 73  that it.** opens
32c40 20 73 65 63 6f 6e 64 61 72 79 20 66 69 6c 65 20   secondary file 
32c50 64 65 73 63 72 69 70 74 6f 72 73 20 66 6f 72 20  descriptors for 
32c60 74 68 65 20 63 6f 6e 63 68 20 61 6e 64 20 6c 6f  the conch and lo
32c70 63 6b 20 66 69 6c 65 73 20 61 6e 64 0a 2a 2a 20  ck files and.** 
32c80 69 74 20 75 73 65 73 20 70 72 6f 78 79 2c 20 64  it uses proxy, d
32c90 6f 74 2d 66 69 6c 65 2c 20 41 46 50 2c 20 61 6e  ot-file, AFP, an
32ca0 64 20 66 6c 6f 63 6b 28 29 20 6c 6f 63 6b 69 6e  d flock() lockin
32cb0 67 20 6d 65 74 68 6f 64 73 20 6f 6e 20 74 68 6f  g methods on tho
32cc0 73 65 0a 2a 2a 20 73 65 63 6f 6e 64 61 72 79 20  se.** secondary 
32cd0 66 69 6c 65 73 2e 20 20 46 6f 72 20 74 68 69 73  files.  For this
32ce0 20 72 65 61 73 6f 6e 2c 20 74 68 65 20 64 69 76   reason, the div
32cf0 69 73 69 6f 6e 20 74 68 61 74 20 69 6d 70 6c 65  ision that imple
32d00 6d 65 6e 74 73 0a 2a 2a 20 70 72 6f 78 79 20 6c  ments.** proxy l
32d10 6f 63 6b 69 6e 67 20 69 73 20 6c 6f 63 61 74 65  ocking is locate
32d20 64 20 6d 75 63 68 20 66 75 72 74 68 65 72 20 64  d much further d
32d30 6f 77 6e 20 69 6e 20 74 68 65 20 66 69 6c 65 2e  own in the file.
32d40 20 20 42 75 74 20 77 65 20 6e 65 65 64 0a 2a 2a    But we need.**
32d50 20 74 6f 20 67 6f 20 61 68 65 61 64 20 61 6e 64   to go ahead and
32d60 20 64 65 66 69 6e 65 20 74 68 65 20 73 71 6c 69   define the sqli
32d70 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 61  te3_io_methods a
32d80 6e 64 20 66 69 6e 64 65 72 20 66 75 6e 63 74 69  nd finder functi
32d90 6f 6e 0a 2a 2a 20 66 6f 72 20 70 72 6f 78 79 20  on.** for proxy 
32da0 6c 6f 63 6b 69 6e 67 20 68 65 72 65 2e 20 20 53  locking here.  S
32db0 6f 20 77 65 20 66 6f 72 77 61 72 64 20 64 65 63  o we forward dec
32dc0 6c 61 72 65 20 74 68 65 20 49 2f 4f 20 6d 65 74  lare the I/O met
32dd0 68 6f 64 73 2e 0a 2a 2f 0a 23 69 66 20 64 65 66  hods..*/.#if def
32de0 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
32df0 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
32e00 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 73  _LOCKING_STYLE.s
32e10 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43  tatic int proxyC
32e20 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  lose(sqlite3_fil
32e30 65 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  e*);.static int 
32e40 70 72 6f 78 79 4c 6f 63 6b 28 73 71 6c 69 74 65  proxyLock(sqlite
32e50 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 29 3b 0a 73  3_file*, int);.s
32e60 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 55  tatic int proxyU
32e70 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  nlock(sqlite3_fi
32e80 6c 65 2a 2c 20 69 6e 74 29 3b 0a 73 74 61 74 69  le*, int);.stati
32e90 63 20 69 6e 74 20 70 72 6f 78 79 43 68 65 63 6b  c int proxyCheck
32ea0 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c  ReservedLock(sql
32eb0 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 2a  ite3_file*, int*
32ec0 29 3b 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20  );.IOMETHODS(.  
32ed0 70 72 6f 78 79 49 6f 46 69 6e 64 65 72 2c 20 20  proxyIoFinder,  
32ee0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e            /* Fin
32ef0 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  der function nam
32f00 65 20 2a 2f 0a 20 20 70 72 6f 78 79 49 6f 4d 65  e */.  proxyIoMe
32f10 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20  thods,          
32f20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d   /* sqlite3_io_m
32f30 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61  ethods object na
32f40 6d 65 20 2a 2f 0a 20 20 32 2c 20 20 20 20 20 20  me */.  2,      
32f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32f60 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f    /* shared memo
32f70 72 79 20 69 73 20 65 6e 61 62 6c 65 64 20 2a 2f  ry is enabled */
32f80 0a 20 20 70 72 6f 78 79 43 6c 6f 73 65 2c 20 20  .  proxyClose,  
32f90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
32fa0 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f  xClose method */
32fb0 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 2c 20 20 20  .  proxyLock,   
32fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
32fd0 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  xLock method */.
32fe0 20 20 70 72 6f 78 79 55 6e 6c 6f 63 6b 2c 20 20    proxyUnlock,  
32ff0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
33000 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f  Unlock method */
33010 0a 20 20 70 72 6f 78 79 43 68 65 63 6b 52 65 73  .  proxyCheckRes
33020 65 72 76 65 64 4c 6f 63 6b 2c 20 20 20 2f 2a 20  ervedLock,   /* 
33030 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  xCheckReservedLo
33040 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 30  ck method */.  0
33050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33060 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d           /* xShm
33070 4d 61 70 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a  Map method */.).
33080 23 65 6e 64 69 66 0a 0a 2f 2a 20 6e 66 73 20 6c  #endif../* nfs l
33090 6f 63 6b 64 20 6f 6e 20 4f 53 58 20 31 30 2e 33  ockd on OSX 10.3
330a0 2b 20 64 6f 65 73 6e 27 74 20 63 6c 65 61 72 20  + doesn't clear 
330b0 77 72 69 74 65 20 6c 6f 63 6b 73 20 77 68 65 6e  write locks when
330c0 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 69 73 20   a read lock is 
330d0 73 65 74 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e  set */.#if defin
330e0 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26  ed(__APPLE__) &&
330f0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
33100 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 49 4f 4d  OCKING_STYLE.IOM
33110 45 54 48 4f 44 53 28 0a 20 20 6e 66 73 49 6f 46  ETHODS(.  nfsIoF
33120 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20  inder,          
33130 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66       /* Finder f
33140 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a  unction name */.
33150 20 20 6e 66 73 49 6f 4d 65 74 68 6f 64 73 2c 20    nfsIoMethods, 
33160 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
33170 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
33180 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a  ds object name *
33190 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20 20  /.  1,          
331a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
331b0 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  * shared memory 
331c0 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20  is disabled */. 
331d0 20 75 6e 69 78 43 6c 6f 73 65 2c 20 20 20 20 20   unixClose,     
331e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
331f0 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a  Close method */.
33200 20 20 75 6e 69 78 4c 6f 63 6b 2c 20 20 20 20 20    unixLock,     
33210 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
33220 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  xLock method */.
33230 20 20 6e 66 73 55 6e 6c 6f 63 6b 2c 20 20 20 20    nfsUnlock,    
33240 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
33250 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  xUnlock method *
33260 2f 0a 20 20 75 6e 69 78 43 68 65 63 6b 52 65 73  /.  unixCheckRes
33270 65 72 76 65 64 4c 6f 63 6b 2c 20 20 20 20 20 2f  ervedLock,     /
33280 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  * xCheckReserved
33290 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  Lock method */. 
332a0 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20   0              
332b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
332c0 53 68 6d 4d 61 70 20 6d 65 74 68 6f 64 20 2a 2f  ShmMap method */
332d0 0a 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64  .).#endif..#if d
332e0 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
332f0 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42  ) && SQLITE_ENAB
33300 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
33310 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 22 66 69  ./* .** This "fi
33320 6e 64 65 72 22 20 66 75 6e 63 74 69 6f 6e 20 61  nder" function a
33330 74 74 65 6d 70 74 73 20 74 6f 20 64 65 74 65 72  ttempts to deter
33340 6d 69 6e 65 20 74 68 65 20 62 65 73 74 20 6c 6f  mine the best lo
33350 63 6b 69 6e 67 20 73 74 72 61 74 65 67 79 20 0a  cking strategy .
33360 2a 2a 20 66 6f 72 20 74 68 65 20 64 61 74 61 62  ** for the datab
33370 61 73 65 20 66 69 6c 65 20 22 66 69 6c 65 50 61  ase file "filePa
33380 74 68 22 2e 20 20 49 74 20 74 68 65 6e 20 72 65  th".  It then re
33390 74 75 72 6e 73 20 74 68 65 20 73 71 6c 69 74 65  turns the sqlite
333a0 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 0a 2a 2a 20  3_io_methods.** 
333b0 6f 62 6a 65 63 74 20 74 68 61 74 20 69 6d 70 6c  object that impl
333c0 65 6d 65 6e 74 73 20 74 68 61 74 20 73 74 72 61  ements that stra
333d0 74 65 67 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tegy..**.** This
333e0 20 69 73 20 66 6f 72 20 4d 61 63 4f 53 58 20 6f   is for MacOSX o
333f0 6e 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  nly..*/.static c
33400 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f  onst sqlite3_io_
33410 6d 65 74 68 6f 64 73 20 2a 61 75 74 6f 6c 6f 63  methods *autoloc
33420 6b 49 6f 46 69 6e 64 65 72 49 6d 70 6c 28 0a 20  kIoFinderImpl(. 
33430 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 69 6c   const char *fil
33440 65 50 61 74 68 2c 20 20 20 20 2f 2a 20 6e 61 6d  ePath,    /* nam
33450 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
33460 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78  e file */.  unix
33470 46 69 6c 65 20 2a 70 4e 65 77 20 20 20 20 20 20  File *pNew      
33480 20 20 20 20 20 2f 2a 20 6f 70 65 6e 20 66 69 6c       /* open fil
33490 65 20 6f 62 6a 65 63 74 20 66 6f 72 20 74 68 65  e object for the
334a0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
334b0 2f 0a 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f  /.){.  static co
334c0 6e 73 74 20 73 74 72 75 63 74 20 4d 61 70 70 69  nst struct Mappi
334d0 6e 67 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ng {.    const c
334e0 68 61 72 20 2a 7a 46 69 6c 65 73 79 73 74 65 6d  har *zFilesystem
334f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
33500 2a 20 46 69 6c 65 73 79 73 74 65 6d 20 74 79 70  * Filesystem typ
33510 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 63 6f  e name */.    co
33520 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  nst sqlite3_io_m
33530 65 74 68 6f 64 73 20 2a 70 4d 65 74 68 6f 64 73  ethods *pMethods
33540 3b 20 20 20 2f 2a 20 41 70 70 72 6f 70 72 69 61  ;   /* Appropria
33550 74 65 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f  te locking metho
33560 64 20 2a 2f 0a 20 20 7d 20 61 4d 61 70 5b 5d 20  d */.  } aMap[] 
33570 3d 20 7b 0a 20 20 20 20 7b 20 22 68 66 73 22 2c  = {.    { "hfs",
33580 20 20 20 20 26 70 6f 73 69 78 49 6f 4d 65 74 68      &posixIoMeth
33590 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20 22 75 66  ods },.    { "uf
335a0 73 22 2c 20 20 20 20 26 70 6f 73 69 78 49 6f 4d  s",    &posixIoM
335b0 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20  ethods },.    { 
335c0 22 61 66 70 66 73 22 2c 20 20 26 61 66 70 49 6f  "afpfs",  &afpIo
335d0 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b  Methods },.    {
335e0 20 22 73 6d 62 66 73 22 2c 20 20 26 61 66 70 49   "smbfs",  &afpI
335f0 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20  oMethods },.    
33600 7b 20 22 77 65 62 64 61 76 22 2c 20 26 6e 6f 6c  { "webdav", &nol
33610 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a  ockIoMethods },.
33620 20 20 20 20 7b 20 30 2c 20 30 20 7d 0a 20 20 7d      { 0, 0 }.  }
33630 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72  ;.  int i;.  str
33640 75 63 74 20 73 74 61 74 66 73 20 66 73 49 6e 66  uct statfs fsInf
33650 6f 3b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63  o;.  struct floc
33660 6b 20 6c 6f 63 6b 49 6e 66 6f 3b 0a 0a 20 20 69  k lockInfo;..  i
33670 66 28 20 21 66 69 6c 65 50 61 74 68 20 29 7b 0a  f( !filePath ){.
33680 20 20 20 20 2f 2a 20 49 66 20 66 69 6c 65 50 61      /* If filePa
33690 74 68 3d 3d 4e 55 4c 4c 20 74 68 61 74 20 6d 65  th==NULL that me
336a0 61 6e 73 20 77 65 20 61 72 65 20 64 65 61 6c 69  ans we are deali
336b0 6e 67 20 77 69 74 68 20 61 20 74 72 61 6e 73 69  ng with a transi
336c0 65 6e 74 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20  ent file.    ** 
336d0 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65  that does not ne
336e0 65 64 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 2e  ed to be locked.
336f0 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 26   */.    return &
33700 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b  nolockIoMethods;
33710 0a 20 20 7d 0a 20 20 69 66 28 20 73 74 61 74 66  .  }.  if( statf
33720 73 28 66 69 6c 65 50 61 74 68 2c 20 26 66 73 49  s(filePath, &fsI
33730 6e 66 6f 29 20 21 3d 20 2d 31 20 29 7b 0a 20 20  nfo) != -1 ){.  
33740 20 20 69 66 28 20 66 73 49 6e 66 6f 2e 66 5f 66    if( fsInfo.f_f
33750 6c 61 67 73 20 26 20 4d 4e 54 5f 52 44 4f 4e 4c  lags & MNT_RDONL
33760 59 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  Y ){.      retur
33770 6e 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f  n &nolockIoMetho
33780 64 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  ds;.    }.    fo
33790 72 28 69 3d 30 3b 20 61 4d 61 70 5b 69 5d 2e 7a  r(i=0; aMap[i].z
337a0 46 69 6c 65 73 79 73 74 65 6d 3b 20 69 2b 2b 29  Filesystem; i++)
337b0 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63  {.      if( strc
337c0 6d 70 28 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79  mp(fsInfo.f_fsty
337d0 70 65 6e 61 6d 65 2c 20 61 4d 61 70 5b 69 5d 2e  pename, aMap[i].
337e0 7a 46 69 6c 65 73 79 73 74 65 6d 29 3d 3d 30 20  zFilesystem)==0 
337f0 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
33800 6e 20 61 4d 61 70 5b 69 5d 2e 70 4d 65 74 68 6f  n aMap[i].pMetho
33810 64 73 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ds;.      }.    
33820 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 66 61  }.  }..  /* Defa
33830 75 6c 74 20 63 61 73 65 2e 20 48 61 6e 64 6c 65  ult case. Handle
33840 73 2c 20 61 6d 6f 6e 67 73 74 20 6f 74 68 65 72  s, amongst other
33850 73 2c 20 22 6e 66 73 22 2e 0a 20 20 2a 2a 20 54  s, "nfs"..  ** T
33860 65 73 74 20 62 79 74 65 2d 72 61 6e 67 65 20 6c  est byte-range l
33870 6f 63 6b 20 75 73 69 6e 67 20 66 63 6e 74 6c 28  ock using fcntl(
33880 29 2e 20 49 66 20 74 68 65 20 63 61 6c 6c 20 73  ). If the call s
33890 75 63 63 65 65 64 73 2c 20 0a 20 20 2a 2a 20 61  ucceeds, .  ** a
338a0 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 20 66  ssume that the f
338b0 69 6c 65 2d 73 79 73 74 65 6d 20 73 75 70 70 6f  ile-system suppo
338c0 72 74 73 20 50 4f 53 49 58 20 73 74 79 6c 65 20  rts POSIX style 
338d0 6c 6f 63 6b 73 2e 20 0a 20 20 2a 2f 0a 20 20 6c  locks. .  */.  l
338e0 6f 63 6b 49 6e 66 6f 2e 6c 5f 6c 65 6e 20 3d 20  ockInfo.l_len = 
338f0 31 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f  1;.  lockInfo.l_
33900 73 74 61 72 74 20 3d 20 30 3b 0a 20 20 6c 6f 63  start = 0;.  loc
33910 6b 49 6e 66 6f 2e 6c 5f 77 68 65 6e 63 65 20 3d  kInfo.l_whence =
33920 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 6c 6f 63   SEEK_SET;.  loc
33930 6b 49 6e 66 6f 2e 6c 5f 74 79 70 65 20 3d 20 46  kInfo.l_type = F
33940 5f 52 44 4c 43 4b 3b 0a 20 20 69 66 28 20 6f 73  _RDLCK;.  if( os
33950 46 63 6e 74 6c 28 70 4e 65 77 2d 3e 68 2c 20 46  Fcntl(pNew->h, F
33960 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63 6b 49 6e 66  _GETLK, &lockInf
33970 6f 29 21 3d 2d 31 20 29 20 7b 0a 20 20 20 20 69  o)!=-1 ) {.    i
33980 66 28 20 73 74 72 63 6d 70 28 66 73 49 6e 66 6f  f( strcmp(fsInfo
33990 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20 22  .f_fstypename, "
339a0 6e 66 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  nfs")==0 ){.    
339b0 20 20 72 65 74 75 72 6e 20 26 6e 66 73 49 6f 4d    return &nfsIoM
339c0 65 74 68 6f 64 73 3b 0a 20 20 20 20 7d 20 65 6c  ethods;.    } el
339d0 73 65 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72  se {.      retur
339e0 6e 20 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64  n &posixIoMethod
339f0 73 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  s;.    }.  }else
33a00 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 26 64 6f  {.    return &do
33a10 74 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a  tlockIoMethods;.
33a20 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 63 6f 6e    }.}.static con
33a30 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  st sqlite3_io_me
33a40 74 68 6f 64 73 20 0a 20 20 2a 28 2a 63 6f 6e 73  thods .  *(*cons
33a50 74 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64  t autolockIoFind
33a60 65 72 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c  er)(const char*,
33a70 75 6e 69 78 46 69 6c 65 2a 29 20 3d 20 61 75 74  unixFile*) = aut
33a80 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 49 6d 70  olockIoFinderImp
33a90 6c 3b 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65  l;..#endif /* de
33aa0 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
33ab0 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
33ac0 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
33ad0 2a 2f 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52  */..#if OS_VXWOR
33ae0 4b 53 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 22 66  KS./*.** This "f
33af0 69 6e 64 65 72 22 20 66 75 6e 63 74 69 6f 6e 20  inder" function 
33b00 66 6f 72 20 56 78 57 6f 72 6b 73 20 63 68 65 63  for VxWorks chec
33b10 6b 73 20 74 6f 20 73 65 65 20 69 66 20 70 6f 73  ks to see if pos
33b20 69 78 20 61 64 76 69 73 6f 72 79 0a 2a 2a 20 6c  ix advisory.** l
33b30 6f 63 6b 69 6e 67 20 77 6f 72 6b 73 2e 20 20 49  ocking works.  I
33b40 66 20 69 74 20 64 6f 65 73 2c 20 74 68 65 6e 20  f it does, then 
33b50 74 68 61 74 20 69 73 20 77 68 61 74 20 69 73 20  that is what is 
33b60 75 73 65 64 2e 20 20 49 66 20 69 74 20 64 6f 65  used.  If it doe
33b70 73 20 6e 6f 74 0a 2a 2a 20 77 6f 72 6b 2c 20 74  s not.** work, t
33b80 68 65 6e 20 66 61 6c 6c 62 61 63 6b 20 74 6f 20  hen fallback to 
33b90 6e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65 20  named semaphore 
33ba0 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  locking..*/.stat
33bb0 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ic const sqlite3
33bc0 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 76 78 77  _io_methods *vxw
33bd0 6f 72 6b 73 49 6f 46 69 6e 64 65 72 49 6d 70 6c  orksIoFinderImpl
33be0 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  (.  const char *
33bf0 66 69 6c 65 50 61 74 68 2c 20 20 20 20 2f 2a 20  filePath,    /* 
33c00 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  name of the data
33c10 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75  base file */.  u
33c20 6e 69 78 46 69 6c 65 20 2a 70 4e 65 77 20 20 20  nixFile *pNew   
33c30 20 20 20 20 20 20 20 20 2f 2a 20 74 68 65 20 6f          /* the o
33c40 70 65 6e 20 66 69 6c 65 20 6f 62 6a 65 63 74 20  pen file object 
33c50 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 66  */.){.  struct f
33c60 6c 6f 63 6b 20 6c 6f 63 6b 49 6e 66 6f 3b 0a 0a  lock lockInfo;..
33c70 20 20 69 66 28 20 21 66 69 6c 65 50 61 74 68 20    if( !filePath 
33c80 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 66 69 6c  ){.    /* If fil
33c90 65 50 61 74 68 3d 3d 4e 55 4c 4c 20 74 68 61 74  ePath==NULL that
33ca0 20 6d 65 61 6e 73 20 77 65 20 61 72 65 20 64 65   means we are de
33cb0 61 6c 69 6e 67 20 77 69 74 68 20 61 20 74 72 61  aling with a tra
33cc0 6e 73 69 65 6e 74 20 66 69 6c 65 0a 20 20 20 20  nsient file.    
33cd0 2a 2a 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74  ** that does not
33ce0 20 6e 65 65 64 20 74 6f 20 62 65 20 6c 6f 63 6b   need to be lock
33cf0 65 64 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  ed. */.    retur
33d00 6e 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f  n &nolockIoMetho
33d10 64 73 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 65  ds;.  }..  /* Te
33d20 73 74 20 69 66 20 66 63 6e 74 6c 28 29 20 69 73  st if fcntl() is
33d30 20 73 75 70 70 6f 72 74 65 64 20 61 6e 64 20 75   supported and u
33d40 73 65 20 50 4f 53 49 58 20 73 74 79 6c 65 20 6c  se POSIX style l
33d50 6f 63 6b 73 2e 0a 20 20 2a 2a 20 4f 74 68 65 72  ocks..  ** Other
33d60 77 69 73 65 20 66 61 6c 6c 20 62 61 63 6b 20 74  wise fall back t
33d70 6f 20 74 68 65 20 6e 61 6d 65 64 20 73 65 6d 61  o the named sema
33d80 70 68 6f 72 65 20 6d 65 74 68 6f 64 2e 0a 20 20  phore method..  
33d90 2a 2f 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f  */.  lockInfo.l_
33da0 6c 65 6e 20 3d 20 31 3b 0a 20 20 6c 6f 63 6b 49  len = 1;.  lockI
33db0 6e 66 6f 2e 6c 5f 73 74 61 72 74 20 3d 20 30 3b  nfo.l_start = 0;
33dc0 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 77 68  .  lockInfo.l_wh
33dd0 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b  ence = SEEK_SET;
33de0 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 74 79  .  lockInfo.l_ty
33df0 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20  pe = F_RDLCK;.  
33e00 69 66 28 20 6f 73 46 63 6e 74 6c 28 70 4e 65 77  if( osFcntl(pNew
33e10 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c  ->h, F_GETLK, &l
33e20 6f 63 6b 49 6e 66 6f 29 21 3d 2d 31 20 29 20 7b  ockInfo)!=-1 ) {
33e30 0a 20 20 20 20 72 65 74 75 72 6e 20 26 70 6f 73  .    return &pos
33e40 69 78 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d  ixIoMethods;.  }
33e50 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
33e60 20 26 73 65 6d 49 6f 4d 65 74 68 6f 64 73 3b 0a   &semIoMethods;.
33e70 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 63 6f 6e    }.}.static con
33e80 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  st sqlite3_io_me
33e90 74 68 6f 64 73 20 0a 20 20 2a 28 2a 63 6f 6e 73  thods .  *(*cons
33ea0 74 20 76 78 77 6f 72 6b 73 49 6f 46 69 6e 64 65  t vxworksIoFinde
33eb0 72 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 75  r)(const char*,u
33ec0 6e 69 78 46 69 6c 65 2a 29 20 3d 20 76 78 77 6f  nixFile*) = vxwo
33ed0 72 6b 73 49 6f 46 69 6e 64 65 72 49 6d 70 6c 3b  rksIoFinderImpl;
33ee0 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56  ..#endif /* OS_V
33ef0 58 57 4f 52 4b 53 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  XWORKS */../*.**
33f00 20 41 6e 20 61 62 73 74 72 61 63 74 20 74 79 70   An abstract typ
33f10 65 20 66 6f 72 20 61 20 70 6f 69 6e 74 65 72 20  e for a pointer 
33f20 74 6f 20 61 6e 20 49 4f 20 6d 65 74 68 6f 64 20  to an IO method 
33f30 66 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 3a  finder function:
33f40 0a 2a 2f 0a 74 79 70 65 64 65 66 20 63 6f 6e 73  .*/.typedef cons
33f50 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  t sqlite3_io_met
33f60 68 6f 64 73 20 2a 28 2a 66 69 6e 64 65 72 5f 74  hods *(*finder_t
33f70 79 70 65 29 28 63 6f 6e 73 74 20 63 68 61 72 2a  ype)(const char*
33f80 2c 75 6e 69 78 46 69 6c 65 2a 29 3b 0a 0a 0a 2f  ,unixFile*);.../
33f90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33fa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33fb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33fc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33fd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
33fe0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33ff0 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 73 71 6c 69 74 65  ********* sqlite
34000 33 5f 76 66 73 20 6d 65 74 68 6f 64 73 20 2a 2a  3_vfs methods **
34010 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
34020 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a  **********.**.**
34030 20 54 68 69 73 20 64 69 76 69 73 69 6f 6e 20 63   This division c
34040 6f 6e 74 61 69 6e 73 20 74 68 65 20 69 6d 70 6c  ontains the impl
34050 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 6d 65  ementation of me
34060 74 68 6f 64 73 20 6f 6e 20 74 68 65 0a 2a 2a 20  thods on the.** 
34070 73 71 6c 69 74 65 33 5f 76 66 73 20 6f 62 6a 65  sqlite3_vfs obje
34080 63 74 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e  ct..*/../*.** In
34090 69 74 69 61 6c 69 7a 65 20 74 68 65 20 63 6f 6e  itialize the con
340a0 74 65 6e 74 73 20 6f 66 20 74 68 65 20 75 6e 69  tents of the uni
340b0 78 46 69 6c 65 20 73 74 72 75 63 74 75 72 65 20  xFile structure 
340c0 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 70 49  pointed to by pI
340d0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
340e0 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65 28   fillInUnixFile(
340f0 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
34100 70 56 66 73 2c 20 20 20 20 20 20 2f 2a 20 50 6f  pVfs,      /* Po
34110 69 6e 74 65 72 20 74 6f 20 76 66 73 20 6f 62 6a  inter to vfs obj
34120 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 68 2c 20  ect */.  int h, 
34130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34140 20 2f 2a 20 4f 70 65 6e 20 66 69 6c 65 20 64 65   /* Open file de
34150 73 63 72 69 70 74 6f 72 20 6f 66 20 66 69 6c 65  scriptor of file
34160 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20 2a 2f   being opened */
34170 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
34180 2a 70 49 64 2c 20 20 20 20 20 20 2f 2a 20 57 72  *pId,      /* Wr
34190 69 74 65 20 74 6f 20 74 68 65 20 75 6e 69 78 46  ite to the unixF
341a0 69 6c 65 20 73 74 72 75 63 74 75 72 65 20 68 65  ile structure he
341b0 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  re */.  const ch
341c0 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20  ar *zFilename,  
341d0 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66  /* Name of the f
341e0 69 6c 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 64  ile being opened
341f0 20 2a 2f 0a 20 20 69 6e 74 20 63 74 72 6c 46 6c   */.  int ctrlFl
34200 61 67 73 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ags           /*
34210 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 55 4e   Zero or more UN
34220 49 58 46 49 4c 45 5f 2a 20 76 61 6c 75 65 73 20  IXFILE_* values 
34230 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 73 71  */.){.  const sq
34240 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
34250 20 2a 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 3b   *pLockingStyle;
34260 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 4e 65  .  unixFile *pNe
34270 77 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29  w = (unixFile *)
34280 70 49 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  pId;.  int rc = 
34290 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73  SQLITE_OK;..  as
342a0 73 65 72 74 28 20 70 4e 65 77 2d 3e 70 49 6e 6f  sert( pNew->pIno
342b0 64 65 3d 3d 4e 55 4c 4c 20 29 3b 0a 0a 20 20 2f  de==NULL );..  /
342c0 2a 20 55 73 75 61 6c 6c 79 20 74 68 65 20 70 61  * Usually the pa
342d0 74 68 20 7a 46 69 6c 65 6e 61 6d 65 20 73 68 6f  th zFilename sho
342e0 75 6c 64 20 6e 6f 74 20 62 65 20 61 20 72 65 6c  uld not be a rel
342f0 61 74 69 76 65 20 70 61 74 68 6e 61 6d 65 2e 20  ative pathname. 
34300 54 68 65 0a 20 20 2a 2a 20 65 78 63 65 70 74 69  The.  ** excepti
34310 6f 6e 20 69 73 20 77 68 65 6e 20 6f 70 65 6e 69  on is when openi
34320 6e 67 20 74 68 65 20 70 72 6f 78 79 20 22 63 6f  ng the proxy "co
34330 6e 63 68 22 20 66 69 6c 65 20 69 6e 20 62 75 69  nch" file in bui
34340 6c 64 73 20 74 68 61 74 0a 20 20 2a 2a 20 69 6e  lds that.  ** in
34350 63 6c 75 64 65 20 74 68 65 20 73 70 65 63 69 61  clude the specia
34360 6c 20 41 70 70 6c 65 20 6c 6f 63 6b 69 6e 67 20  l Apple locking 
34370 73 74 79 6c 65 73 2e 0a 20 20 2a 2f 0a 23 69 66  styles..  */.#if
34380 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
34390 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  __) && SQLITE_EN
343a0 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
343b0 4c 45 0a 20 20 61 73 73 65 72 74 28 20 7a 46 69  LE.  assert( zFi
343c0 6c 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20 7a 46 69  lename==0 || zFi
343d0 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 27 2f 27 20 0a  lename[0]=='/' .
343e0 20 20 20 20 7c 7c 20 70 56 66 73 2d 3e 70 41 70      || pVfs->pAp
343f0 70 44 61 74 61 3d 3d 28 76 6f 69 64 2a 29 26 61  pData==(void*)&a
34400 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 20  utolockIoFinder 
34410 29 3b 0a 23 65 6c 73 65 0a 20 20 61 73 73 65 72  );.#else.  asser
34420 74 28 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20  t( zFilename==0 
34430 7c 7c 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d  || zFilename[0]=
34440 3d 27 2f 27 20 29 3b 0a 23 65 6e 64 69 66 0a 0a  ='/' );.#endif..
34450 20 20 2f 2a 20 4e 6f 20 6c 6f 63 6b 69 6e 67 20    /* No locking 
34460 6f 63 63 75 72 73 20 69 6e 20 74 65 6d 70 6f 72  occurs in tempor
34470 61 72 79 20 66 69 6c 65 73 20 2a 2f 0a 20 20 61  ary files */.  a
34480 73 73 65 72 74 28 20 7a 46 69 6c 65 6e 61 6d 65  ssert( zFilename
34490 21 3d 30 20 7c 7c 20 28 63 74 72 6c 46 6c 61 67  !=0 || (ctrlFlag
344a0 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 4e 4f 4c  s & UNIXFILE_NOL
344b0 4f 43 4b 29 21 3d 30 20 29 3b 0a 0a 20 20 4f 53  OCK)!=0 );..  OS
344c0 54 52 41 43 45 28 28 22 4f 50 45 4e 20 20 20 20  TRACE(("OPEN    
344d0 25 2d 33 64 20 25 73 5c 6e 22 2c 20 68 2c 20 7a  %-3d %s\n", h, z
344e0 46 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 70 4e  Filename));.  pN
344f0 65 77 2d 3e 68 20 3d 20 68 3b 0a 20 20 70 4e 65  ew->h = h;.  pNe
34500 77 2d 3e 70 56 66 73 20 3d 20 70 56 66 73 3b 0a  w->pVfs = pVfs;.
34510 20 20 70 4e 65 77 2d 3e 7a 50 61 74 68 20 3d 20    pNew->zPath = 
34520 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 70 4e 65  zFilename;.  pNe
34530 77 2d 3e 63 74 72 6c 46 6c 61 67 73 20 3d 20 28  w->ctrlFlags = (
34540 75 38 29 63 74 72 6c 46 6c 61 67 73 3b 0a 23 69  u8)ctrlFlags;.#i
34550 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  f SQLITE_MAX_MMA
34560 50 5f 53 49 5a 45 3e 30 0a 20 20 70 4e 65 77 2d  P_SIZE>0.  pNew-
34570 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20 3d 20 73  >mmapSizeMax = s
34580 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
34590 69 67 2e 73 7a 4d 6d 61 70 3b 0a 23 65 6e 64 69  ig.szMmap;.#endi
345a0 66 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  f.  if( sqlite3_
345b0 75 72 69 5f 62 6f 6f 6c 65 61 6e 28 28 28 63 74  uri_boolean(((ct
345c0 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49  rlFlags & UNIXFI
345d0 4c 45 5f 55 52 49 29 20 3f 20 7a 46 69 6c 65 6e  LE_URI) ? zFilen
345e0 61 6d 65 20 3a 20 30 29 2c 0a 20 20 20 20 20 20  ame : 0),.      
345f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34600 20 20 20 20 20 22 70 73 6f 77 22 2c 20 53 51 4c       "psow", SQL
34610 49 54 45 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56  ITE_POWERSAFE_OV
34620 45 52 57 52 49 54 45 29 20 29 7b 0a 20 20 20 20  ERWRITE) ){.    
34630 70 4e 65 77 2d 3e 63 74 72 6c 46 6c 61 67 73 20  pNew->ctrlFlags 
34640 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 50 53 4f 57  |= UNIXFILE_PSOW
34650 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 74 72 63  ;.  }.  if( strc
34660 6d 70 28 70 56 66 73 2d 3e 7a 4e 61 6d 65 2c 22  mp(pVfs->zName,"
34670 75 6e 69 78 2d 65 78 63 6c 22 29 3d 3d 30 20 29  unix-excl")==0 )
34680 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 63 74 72 6c  {.    pNew->ctrl
34690 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c  Flags |= UNIXFIL
346a0 45 5f 45 58 43 4c 3b 0a 20 20 7d 0a 0a 23 69 66  E_EXCL;.  }..#if
346b0 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 70 4e   OS_VXWORKS.  pN
346c0 65 77 2d 3e 70 49 64 20 3d 20 76 78 77 6f 72 6b  ew->pId = vxwork
346d0 73 46 69 6e 64 46 69 6c 65 49 64 28 7a 46 69 6c  sFindFileId(zFil
346e0 65 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 70 4e  ename);.  if( pN
346f0 65 77 2d 3e 70 49 64 3d 3d 30 20 29 7b 0a 20 20  ew->pId==0 ){.  
34700 20 20 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55    ctrlFlags |= U
34710 4e 49 58 46 49 4c 45 5f 4e 4f 4c 4f 43 4b 3b 0a  NIXFILE_NOLOCK;.
34720 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
34730 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 23 65 6e 64 69  NOMEM;.  }.#endi
34740 66 0a 0a 20 20 69 66 28 20 63 74 72 6c 46 6c 61  f..  if( ctrlFla
34750 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 4e 4f  gs & UNIXFILE_NO
34760 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 4c 6f 63  LOCK ){.    pLoc
34770 6b 69 6e 67 53 74 79 6c 65 20 3d 20 26 6e 6f 6c  kingStyle = &nol
34780 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20  ockIoMethods;.  
34790 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4c 6f 63 6b  }else{.    pLock
347a0 69 6e 67 53 74 79 6c 65 20 3d 20 28 2a 2a 28 66  ingStyle = (**(f
347b0 69 6e 64 65 72 5f 74 79 70 65 2a 29 70 56 66 73  inder_type*)pVfs
347c0 2d 3e 70 41 70 70 44 61 74 61 29 28 7a 46 69 6c  ->pAppData)(zFil
347d0 65 6e 61 6d 65 2c 20 70 4e 65 77 29 3b 0a 23 69  ename, pNew);.#i
347e0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
347f0 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20  LOCKING_STYLE.  
34800 20 20 2f 2a 20 43 61 63 68 65 20 7a 46 69 6c 65    /* Cache zFile
34810 6e 61 6d 65 20 69 6e 20 74 68 65 20 6c 6f 63 6b  name in the lock
34820 69 6e 67 20 63 6f 6e 74 65 78 74 20 28 41 46 50  ing context (AFP
34830 20 61 6e 64 20 64 6f 74 6c 6f 63 6b 20 6f 76 65   and dotlock ove
34840 72 72 69 64 65 29 20 66 6f 72 0a 20 20 20 20 2a  rride) for.    *
34850 2a 20 70 72 6f 78 79 4c 6f 63 6b 20 61 63 74 69  * proxyLock acti
34860 76 61 74 69 6f 6e 20 69 73 20 70 6f 73 73 69 62  vation is possib
34870 6c 65 20 28 72 65 6d 6f 74 65 20 70 72 6f 78 79  le (remote proxy
34880 20 69 73 20 62 61 73 65 64 20 6f 6e 20 64 62 20   is based on db 
34890 6e 61 6d 65 29 0a 20 20 20 20 2a 2a 20 7a 46 69  name).    ** zFi
348a0 6c 65 6e 61 6d 65 20 72 65 6d 61 69 6e 73 20 76  lename remains v
348b0 61 6c 69 64 20 75 6e 74 69 6c 20 66 69 6c 65 20  alid until file 
348c0 69 73 20 63 6c 6f 73 65 64 2c 20 74 6f 20 73 75  is closed, to su
348d0 70 70 6f 72 74 20 2a 2f 0a 20 20 20 20 70 4e 65  pport */.    pNe
348e0 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  w->lockingContex
348f0 74 20 3d 20 28 76 6f 69 64 2a 29 7a 46 69 6c 65  t = (void*)zFile
34900 6e 61 6d 65 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  name;.#endif.  }
34910 0a 0a 20 20 69 66 28 20 70 4c 6f 63 6b 69 6e 67  ..  if( pLocking
34920 53 74 79 6c 65 20 3d 3d 20 26 70 6f 73 69 78 49  Style == &posixI
34930 6f 4d 65 74 68 6f 64 73 0a 23 69 66 20 64 65 66  oMethods.#if def
34940 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
34950 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
34960 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20  _LOCKING_STYLE. 
34970 20 20 20 7c 7c 20 70 4c 6f 63 6b 69 6e 67 53 74     || pLockingSt
34980 79 6c 65 20 3d 3d 20 26 6e 66 73 49 6f 4d 65 74  yle == &nfsIoMet
34990 68 6f 64 73 0a 23 65 6e 64 69 66 0a 20 20 20 20  hods.#endif.    
349a0 20 2f 2a 20 73 75 70 70 6f 72 74 20 57 41 4c 20   /* support WAL 
349b0 6d 6f 64 65 20 6f 6e 20 72 65 61 64 20 6f 6e 6c  mode on read onl
349c0 79 20 6d 6f 75 6e 74 65 64 20 66 69 6c 65 73 79  y mounted filesy
349d0 73 74 65 6d 20 2a 2f 0a 20 20 20 20 7c 7c 20 70  stem */.    || p
349e0 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20  LockingStyle == 
349f0 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73  &nolockIoMethods
34a00 20 0a 20 20 29 7b 0a 20 20 20 20 75 6e 69 78 45   .  ){.    unixE
34a10 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20  nterMutex();.   
34a20 20 72 63 20 3d 20 66 69 6e 64 49 6e 6f 64 65 49   rc = findInodeI
34a30 6e 66 6f 28 70 4e 65 77 2c 20 26 70 4e 65 77 2d  nfo(pNew, &pNew-
34a40 3e 70 49 6e 6f 64 65 29 3b 0a 20 20 20 20 69 66  >pInode);.    if
34a50 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
34a60 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 61  ){.      /* If a
34a70 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64  n error occurred
34a80 20 69 6e 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66   in findInodeInf
34a90 6f 28 29 2c 20 63 6c 6f 73 65 20 74 68 65 20 66  o(), close the f
34aa0 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 0a 20  ile descriptor. 
34ab0 20 20 20 20 20 2a 2a 20 69 6d 6d 65 64 69 61 74       ** immediat
34ac0 65 6c 79 2c 20 62 65 66 6f 72 65 20 72 65 6c 65  ely, before rele
34ad0 61 73 69 6e 67 20 74 68 65 20 6d 75 74 65 78 2e  asing the mutex.
34ae0 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29   findInodeInfo()
34af0 20 6d 61 79 20 66 61 69 6c 0a 20 20 20 20 20 20   may fail.      
34b00 2a 2a 20 69 6e 20 74 77 6f 20 73 63 65 6e 61 72  ** in two scenar
34b10 69 6f 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ios:.      **.  
34b20 20 20 20 20 2a 2a 20 20 20 28 61 29 20 41 20 63      **   (a) A c
34b30 61 6c 6c 20 74 6f 20 66 73 74 61 74 28 29 20 66  all to fstat() f
34b40 61 69 6c 65 64 2e 0a 20 20 20 20 20 20 2a 2a 20  ailed..      ** 
34b50 20 20 28 62 29 20 41 20 6d 61 6c 6c 6f 63 20 66    (b) A malloc f
34b60 61 69 6c 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a  ailed..      **.
34b70 20 20 20 20 20 20 2a 2a 20 53 63 65 6e 61 72 69        ** Scenari
34b80 6f 20 28 62 29 20 6d 61 79 20 6f 6e 6c 79 20 6f  o (b) may only o
34b90 63 63 75 72 20 69 66 20 74 68 65 20 70 72 6f 63  ccur if the proc
34ba0 65 73 73 20 69 73 20 68 6f 6c 64 69 6e 67 20 6e  ess is holding n
34bb0 6f 20 6f 74 68 65 72 0a 20 20 20 20 20 20 2a 2a  o other.      **
34bc0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
34bd0 73 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73 61  s open on the sa
34be0 6d 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72  me file. If ther
34bf0 65 20 77 65 72 65 20 6f 74 68 65 72 20 66 69 6c  e were other fil
34c00 65 0a 20 20 20 20 20 20 2a 2a 20 64 65 73 63 72  e.      ** descr
34c10 69 70 74 6f 72 73 20 6f 6e 20 74 68 69 73 20 66  iptors on this f
34c20 69 6c 65 2c 20 74 68 65 6e 20 6e 6f 20 6d 61 6c  ile, then no mal
34c30 6c 6f 63 20 77 6f 75 6c 64 20 62 65 20 72 65 71  loc would be req
34c40 75 69 72 65 64 20 62 79 0a 20 20 20 20 20 20 2a  uired by.      *
34c50 2a 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28  * findInodeInfo(
34c60 29 2e 20 49 66 20 74 68 69 73 20 69 73 20 74 68  ). If this is th
34c70 65 20 63 61 73 65 2c 20 69 74 20 69 73 20 71 75  e case, it is qu
34c80 69 74 65 20 73 61 66 65 20 74 6f 20 63 6c 6f 73  ite safe to clos
34c90 65 0a 20 20 20 20 20 20 2a 2a 20 68 61 6e 64 6c  e.      ** handl
34ca0 65 20 68 20 2d 20 61 73 20 69 74 20 69 73 20 67  e h - as it is g
34cb0 75 61 72 61 6e 74 65 65 64 20 74 68 61 74 20 6e  uaranteed that n
34cc0 6f 20 70 6f 73 69 78 20 6c 6f 63 6b 73 20 77 69  o posix locks wi
34cd0 6c 6c 20 62 65 20 72 65 6c 65 61 73 65 64 0a 20  ll be released. 
34ce0 20 20 20 20 20 2a 2a 20 62 79 20 64 6f 69 6e 67       ** by doing
34cf0 20 73 6f 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20   so..      **.  
34d00 20 20 20 20 2a 2a 20 49 66 20 73 63 65 6e 61 72      ** If scenar
34d10 69 6f 20 28 61 29 20 63 61 75 73 65 64 20 74 68  io (a) caused th
34d20 65 20 65 72 72 6f 72 20 74 68 65 6e 20 74 68 69  e error then thi
34d30 6e 67 73 20 61 72 65 20 6e 6f 74 20 73 6f 20 73  ngs are not so s
34d40 61 66 65 2e 20 54 68 65 0a 20 20 20 20 20 20 2a  afe. The.      *
34d50 2a 20 69 6d 70 6c 69 63 69 74 20 61 73 73 75 6d  * implicit assum
34d60 70 74 69 6f 6e 20 68 65 72 65 20 69 73 20 74 68  ption here is th
34d70 61 74 20 69 66 20 66 73 74 61 74 28 29 20 66 61  at if fstat() fa
34d80 69 6c 73 2c 20 74 68 69 6e 67 73 20 61 72 65 20  ils, things are 
34d90 69 6e 0a 20 20 20 20 20 20 2a 2a 20 73 75 63 68  in.      ** such
34da0 20 62 61 64 20 73 68 61 70 65 20 74 68 61 74 20   bad shape that 
34db0 64 72 6f 70 70 69 6e 67 20 61 20 6c 6f 63 6b 20  dropping a lock 
34dc0 6f 72 20 74 77 6f 20 64 6f 65 73 6e 27 74 20 6d  or two doesn't m
34dd0 61 74 74 65 72 20 6d 75 63 68 2e 0a 20 20 20 20  atter much..    
34de0 20 20 2a 2f 0a 20 20 20 20 20 20 72 6f 62 75 73    */.      robus
34df0 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c 20 68 2c  t_close(pNew, h,
34e00 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20   __LINE__);.    
34e10 20 20 68 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a    h = -1;.    }.
34e20 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74      unixLeaveMut
34e30 65 78 28 29 3b 0a 20 20 7d 0a 0a 23 69 66 20 53  ex();.  }..#if S
34e40 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
34e50 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65  KING_STYLE && de
34e60 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
34e70 0a 20 20 65 6c 73 65 20 69 66 28 20 70 4c 6f 63  .  else if( pLoc
34e80 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26 61 66  kingStyle == &af
34e90 70 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20  pIoMethods ){.  
34ea0 20 20 2f 2a 20 41 46 50 20 6c 6f 63 6b 69 6e 67    /* AFP locking
34eb0 20 75 73 65 73 20 74 68 65 20 66 69 6c 65 20 70   uses the file p
34ec0 61 74 68 20 73 6f 20 69 74 20 6e 65 65 64 73 20  ath so it needs 
34ed0 74 6f 20 62 65 20 69 6e 63 6c 75 64 65 64 20 69  to be included i
34ee0 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 61 66 70  n.    ** the afp
34ef0 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2e 0a  LockingContext..
34f00 20 20 20 20 2a 2f 0a 20 20 20 20 61 66 70 4c 6f      */.    afpLo
34f10 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43  ckingContext *pC
34f20 74 78 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6c 6f  tx;.    pNew->lo
34f30 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20 70  ckingContext = p
34f40 43 74 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  Ctx = sqlite3_ma
34f50 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 43  lloc( sizeof(*pC
34f60 74 78 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  tx) );.    if( p
34f70 43 74 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Ctx==0 ){.      
34f80 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
34f90 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  M;.    }else{.  
34fa0 20 20 20 20 2f 2a 20 4e 42 3a 20 7a 46 69 6c 65      /* NB: zFile
34fb0 6e 61 6d 65 20 65 78 69 73 74 73 20 61 6e 64 20  name exists and 
34fc0 72 65 6d 61 69 6e 73 20 76 61 6c 69 64 20 75 6e  remains valid un
34fd0 74 69 6c 20 74 68 65 20 66 69 6c 65 20 69 73 20  til the file is 
34fe0 63 6c 6f 73 65 64 0a 20 20 20 20 20 20 2a 2a 20  closed.      ** 
34ff0 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 72 65 71  according to req
35000 75 69 72 65 6d 65 6e 74 20 46 31 31 31 34 31 2e  uirement F11141.
35010 20 20 53 6f 20 77 65 20 64 6f 20 6e 6f 74 20 6e    So we do not n
35020 65 65 64 20 74 6f 20 6d 61 6b 65 20 61 0a 20 20  eed to make a.  
35030 20 20 20 20 2a 2a 20 63 6f 70 79 20 6f 66 20 74      ** copy of t
35040 68 65 20 66 69 6c 65 6e 61 6d 65 2e 20 2a 2f 0a  he filename. */.
35050 20 20 20 20 20 20 70 43 74 78 2d 3e 64 62 50 61        pCtx->dbPa
35060 74 68 20 3d 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a  th = zFilename;.
35070 20 20 20 20 20 20 70 43 74 78 2d 3e 72 65 73 65        pCtx->rese
35080 72 76 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20  rved = 0;.      
35090 73 72 61 6e 64 6f 6d 64 65 76 28 29 3b 0a 20 20  srandomdev();.  
350a0 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74      unixEnterMut
350b0 65 78 28 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  ex();.      rc =
350c0 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 70   findInodeInfo(p
350d0 4e 65 77 2c 20 26 70 4e 65 77 2d 3e 70 49 6e 6f  New, &pNew->pIno
350e0 64 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  de);.      if( r
350f0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
35100 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
35110 66 72 65 65 28 70 4e 65 77 2d 3e 6c 6f 63 6b 69  free(pNew->locki
35120 6e 67 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20  ngContext);.    
35130 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65      robust_close
35140 28 70 4e 65 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45  (pNew, h, __LINE
35150 5f 5f 29 3b 0a 20 20 20 20 20 20 20 20 68 20 3d  __);.        h =
35160 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   -1;.      }.   
35170 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65     unixLeaveMute
35180 78 28 29 3b 20 20 20 20 20 20 20 20 0a 20 20 20  x();        .   
35190 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
351a0 20 65 6c 73 65 20 69 66 28 20 70 4c 6f 63 6b 69   else if( pLocki
351b0 6e 67 53 74 79 6c 65 20 3d 3d 20 26 64 6f 74 6c  ngStyle == &dotl
351c0 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a  ockIoMethods ){.
351d0 20 20 20 20 2f 2a 20 44 6f 74 66 69 6c 65 20 6c      /* Dotfile l
351e0 6f 63 6b 69 6e 67 20 75 73 65 73 20 74 68 65 20  ocking uses the 
351f0 66 69 6c 65 20 70 61 74 68 20 73 6f 20 69 74 20  file path so it 
35200 6e 65 65 64 73 20 74 6f 20 62 65 20 69 6e 63 6c  needs to be incl
35210 75 64 65 64 20 69 6e 0a 20 20 20 20 2a 2a 20 74  uded in.    ** t
35220 68 65 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e  he dotlockLockin
35230 67 43 6f 6e 74 65 78 74 20 0a 20 20 20 20 2a 2f  gContext .    */
35240 0a 20 20 20 20 63 68 61 72 20 2a 7a 4c 6f 63 6b  .    char *zLock
35250 46 69 6c 65 3b 0a 20 20 20 20 69 6e 74 20 6e 46  File;.    int nF
35260 69 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 61 73 73  ilename;.    ass
35270 65 72 74 28 20 7a 46 69 6c 65 6e 61 6d 65 21 3d  ert( zFilename!=
35280 30 20 29 3b 0a 20 20 20 20 6e 46 69 6c 65 6e 61  0 );.    nFilena
35290 6d 65 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e  me = (int)strlen
352a0 28 7a 46 69 6c 65 6e 61 6d 65 29 20 2b 20 36 3b  (zFilename) + 6;
352b0 0a 20 20 20 20 7a 4c 6f 63 6b 46 69 6c 65 20 3d  .    zLockFile =
352c0 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33   (char *)sqlite3
352d0 5f 6d 61 6c 6c 6f 63 28 6e 46 69 6c 65 6e 61 6d  _malloc(nFilenam
352e0 65 29 3b 0a 20 20 20 20 69 66 28 20 7a 4c 6f 63  e);.    if( zLoc
352f0 6b 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20  kFile==0 ){.    
35300 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
35310 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  MEM;.    }else{.
35320 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
35330 70 72 69 6e 74 66 28 6e 46 69 6c 65 6e 61 6d 65  printf(nFilename
35340 2c 20 7a 4c 6f 63 6b 46 69 6c 65 2c 20 22 25 73  , zLockFile, "%s
35350 22 20 44 4f 54 4c 4f 43 4b 5f 53 55 46 46 49 58  " DOTLOCK_SUFFIX
35360 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  , zFilename);.  
35370 20 20 7d 0a 20 20 20 20 70 4e 65 77 2d 3e 6c 6f    }.    pNew->lo
35380 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20 7a  ckingContext = z
35390 4c 6f 63 6b 46 69 6c 65 3b 0a 20 20 7d 0a 0a 23  LockFile;.  }..#
353a0 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  if OS_VXWORKS.  
353b0 65 6c 73 65 20 69 66 28 20 70 4c 6f 63 6b 69 6e  else if( pLockin
353c0 67 53 74 79 6c 65 20 3d 3d 20 26 73 65 6d 49 6f  gStyle == &semIo
353d0 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f  Methods ){.    /
353e0 2a 20 4e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72  * Named semaphor
353f0 65 20 6c 6f 63 6b 69 6e 67 20 75 73 65 73 20 74  e locking uses t
35400 68 65 20 66 69 6c 65 20 70 61 74 68 20 73 6f 20  he file path so 
35410 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20  it needs to be. 
35420 20 20 20 2a 2a 20 69 6e 63 6c 75 64 65 64 20 69     ** included i
35430 6e 20 74 68 65 20 73 65 6d 4c 6f 63 6b 69 6e 67  n the semLocking
35440 43 6f 6e 74 65 78 74 0a 20 20 20 20 2a 2f 0a 20  Context.    */. 
35450 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65     unixEnterMute
35460 78 28 29 3b 0a 20 20 20 20 72 63 20 3d 20 66 69  x();.    rc = fi
35470 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 70 4e 65 77  ndInodeInfo(pNew
35480 2c 20 26 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 29  , &pNew->pInode)
35490 3b 0a 20 20 20 20 69 66 28 20 28 72 63 3d 3d 53  ;.    if( (rc==S
354a0 51 4c 49 54 45 5f 4f 4b 29 20 26 26 20 28 70 4e  QLITE_OK) && (pN
354b0 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d  ew->pInode->pSem
354c0 3d 3d 4e 55 4c 4c 29 20 29 7b 0a 20 20 20 20 20  ==NULL) ){.     
354d0 20 63 68 61 72 20 2a 7a 53 65 6d 4e 61 6d 65 20   char *zSemName 
354e0 3d 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e  = pNew->pInode->
354f0 61 53 65 6d 4e 61 6d 65 3b 0a 20 20 20 20 20 20  aSemName;.      
35500 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 73 71 6c  int n;.      sql
35510 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d 41  ite3_snprintf(MA
35520 58 5f 50 41 54 48 4e 41 4d 45 2c 20 7a 53 65 6d  X_PATHNAME, zSem
35530 4e 61 6d 65 2c 20 22 2f 25 73 2e 73 65 6d 22 2c  Name, "/%s.sem",
35540 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
35550 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 49          pNew->pI
35560 64 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d  d->zCanonicalNam
35570 65 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 20 6e  e);.      for( n
35580 3d 31 3b 20 7a 53 65 6d 4e 61 6d 65 5b 6e 5d 3b  =1; zSemName[n];
35590 20 6e 2b 2b 20 29 0a 20 20 20 20 20 20 20 20 69   n++ ).        i
355a0 66 28 20 7a 53 65 6d 4e 61 6d 65 5b 6e 5d 3d 3d  f( zSemName[n]==
355b0 27 2f 27 20 29 20 7a 53 65 6d 4e 61 6d 65 5b 6e  '/' ) zSemName[n
355c0 5d 20 3d 20 27 5f 27 3b 0a 20 20 20 20 20 20 70  ] = '_';.      p
355d0 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65  New->pInode->pSe
355e0 6d 20 3d 20 73 65 6d 5f 6f 70 65 6e 28 7a 53 65  m = sem_open(zSe
355f0 6d 4e 61 6d 65 2c 20 4f 5f 43 52 45 41 54 2c 20  mName, O_CREAT, 
35600 30 36 36 36 2c 20 31 29 3b 0a 20 20 20 20 20 20  0666, 1);.      
35610 69 66 28 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65  if( pNew->pInode
35620 2d 3e 70 53 65 6d 20 3d 3d 20 53 45 4d 5f 46 41  ->pSem == SEM_FA
35630 49 4c 45 44 20 29 7b 0a 20 20 20 20 20 20 20 20  ILED ){.        
35640 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
35650 4d 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  M;.        pNew-
35660 3e 70 49 6e 6f 64 65 2d 3e 61 53 65 6d 4e 61 6d  >pInode->aSemNam
35670 65 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20  e[0] = '\0';.   
35680 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 75     }.    }.    u
35690 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
356a0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20  .  }.#endif.  . 
356b0 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28   storeLastErrno(
356c0 70 4e 65 77 2c 20 30 29 3b 0a 23 69 66 20 4f 53  pNew, 0);.#if OS
356d0 5f 56 58 57 4f 52 4b 53 0a 20 20 69 66 28 20 72  _VXWORKS.  if( r
356e0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
356f0 20 20 20 20 69 66 28 20 68 3e 3d 30 20 29 20 72      if( h>=0 ) r
35700 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 4e 65 77  obust_close(pNew
35710 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a  , h, __LINE__);.
35720 20 20 20 20 68 20 3d 20 2d 31 3b 0a 20 20 20 20      h = -1;.    
35730 6f 73 55 6e 6c 69 6e 6b 28 7a 46 69 6c 65 6e 61  osUnlink(zFilena
35740 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 63  me);.    pNew->c
35750 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58  trlFlags |= UNIX
35760 46 49 4c 45 5f 44 45 4c 45 54 45 3b 0a 20 20 7d  FILE_DELETE;.  }
35770 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 72 63  .#endif.  if( rc
35780 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
35790 20 20 20 69 66 28 20 68 3e 3d 30 20 29 20 72 6f     if( h>=0 ) ro
357a0 62 75 73 74 5f 63 6c 6f 73 65 28 70 4e 65 77 2c  bust_close(pNew,
357b0 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20   h, __LINE__);. 
357c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4e 65 77   }else{.    pNew
357d0 2d 3e 70 4d 65 74 68 6f 64 20 3d 20 70 4c 6f 63  ->pMethod = pLoc
357e0 6b 69 6e 67 53 74 79 6c 65 3b 0a 20 20 20 20 4f  kingStyle;.    O
357f0 70 65 6e 43 6f 75 6e 74 65 72 28 2b 31 29 3b 0a  penCounter(+1);.
35800 20 20 20 20 76 65 72 69 66 79 44 62 46 69 6c 65      verifyDbFile
35810 28 70 4e 65 77 29 3b 0a 20 20 7d 0a 20 20 72 65  (pNew);.  }.  re
35820 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
35830 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 61 6d  * Return the nam
35840 65 20 6f 66 20 61 20 64 69 72 65 63 74 6f 72 79  e of a directory
35850 20 69 6e 20 77 68 69 63 68 20 74 6f 20 70 75 74   in which to put
35860 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73   temporary files
35870 2e 0a 2a 2a 20 49 66 20 6e 6f 20 73 75 69 74 61  ..** If no suita
35880 62 6c 65 20 74 65 6d 70 6f 72 61 72 79 20 66 69  ble temporary fi
35890 6c 65 20 64 69 72 65 63 74 6f 72 79 20 63 61 6e  le directory can
358a0 20 62 65 20 66 6f 75 6e 64 2c 20 72 65 74 75 72   be found, retur
358b0 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69  n NULL..*/.stati
358c0 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 75 6e  c const char *un
358d0 69 78 54 65 6d 70 46 69 6c 65 44 69 72 28 76 6f  ixTempFileDir(vo
358e0 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f  id){.  static co
358f0 6e 73 74 20 63 68 61 72 20 2a 61 7a 44 69 72 73  nst char *azDirs
35900 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 30 2c 0a 20  [] = {.     0,. 
35910 20 20 20 20 30 2c 0a 20 20 20 20 20 30 2c 0a 20      0,.     0,. 
35920 20 20 20 20 22 2f 76 61 72 2f 74 6d 70 22 2c 0a      "/var/tmp",.
35930 20 20 20 20 20 22 2f 75 73 72 2f 74 6d 70 22 2c       "/usr/tmp",
35940 0a 20 20 20 20 20 22 2f 74 6d 70 22 2c 0a 20 20  .     "/tmp",.  
35950 20 20 20 30 20 20 20 20 20 20 20 20 2f 2a 20 4c     0        /* L
35960 69 73 74 20 74 65 72 6d 69 6e 61 74 6f 72 20 2a  ist terminator *
35970 2f 0a 20 20 7d 3b 0a 20 20 75 6e 73 69 67 6e 65  /.  };.  unsigne
35980 64 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63  d int i;.  struc
35990 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20 63 6f  t stat buf;.  co
359a0 6e 73 74 20 63 68 61 72 20 2a 7a 44 69 72 20 3d  nst char *zDir =
359b0 20 30 3b 0a 0a 20 20 61 7a 44 69 72 73 5b 30 5d   0;..  azDirs[0]
359c0 20 3d 20 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f   = sqlite3_temp_
359d0 64 69 72 65 63 74 6f 72 79 3b 0a 20 20 69 66 28  directory;.  if(
359e0 20 21 61 7a 44 69 72 73 5b 31 5d 20 29 20 61 7a   !azDirs[1] ) az
359f0 44 69 72 73 5b 31 5d 20 3d 20 67 65 74 65 6e 76  Dirs[1] = getenv
35a00 28 22 53 51 4c 49 54 45 5f 54 4d 50 44 49 52 22  ("SQLITE_TMPDIR"
35a10 29 3b 0a 20 20 69 66 28 20 21 61 7a 44 69 72 73  );.  if( !azDirs
35a20 5b 32 5d 20 29 20 61 7a 44 69 72 73 5b 32 5d 20  [2] ) azDirs[2] 
35a30 3d 20 67 65 74 65 6e 76 28 22 54 4d 50 44 49 52  = getenv("TMPDIR
35a40 22 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  ");.  for(i=0; i
35a50 3c 73 69 7a 65 6f 66 28 61 7a 44 69 72 73 29 2f  <sizeof(azDirs)/
35a60 73 69 7a 65 6f 66 28 61 7a 44 69 72 73 5b 30 5d  sizeof(azDirs[0]
35a70 29 3b 20 7a 44 69 72 3d 61 7a 44 69 72 73 5b 69  ); zDir=azDirs[i
35a80 2b 2b 5d 29 7b 0a 20 20 20 20 69 66 28 20 7a 44  ++]){.    if( zD
35a90 69 72 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  ir==0 ) continue
35aa0 3b 0a 20 20 20 20 69 66 28 20 6f 73 53 74 61 74  ;.    if( osStat
35ab0 28 7a 44 69 72 2c 20 26 62 75 66 29 20 29 20 63  (zDir, &buf) ) c
35ac0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
35ad0 20 21 53 5f 49 53 44 49 52 28 62 75 66 2e 73 74   !S_ISDIR(buf.st
35ae0 5f 6d 6f 64 65 29 20 29 20 63 6f 6e 74 69 6e 75  _mode) ) continu
35af0 65 3b 0a 20 20 20 20 69 66 28 20 6f 73 41 63 63  e;.    if( osAcc
35b00 65 73 73 28 7a 44 69 72 2c 20 30 37 29 20 29 20  ess(zDir, 07) ) 
35b10 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 62 72  continue;.    br
35b20 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  eak;.  }.  retur
35b30 6e 20 7a 44 69 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n zDir;.}../*.**
35b40 20 43 72 65 61 74 65 20 61 20 74 65 6d 70 6f 72   Create a tempor
35b50 61 72 79 20 66 69 6c 65 20 6e 61 6d 65 20 69 6e  ary file name in
35b60 20 7a 42 75 66 2e 20 20 7a 42 75 66 20 6d 75 73   zBuf.  zBuf mus
35b70 74 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 0a 2a  t be allocated.*
35b80 2a 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67  * by the calling
35b90 20 70 72 6f 63 65 73 73 20 61 6e 64 20 6d 75 73   process and mus
35ba0 74 20 62 65 20 62 69 67 20 65 6e 6f 75 67 68 20  t be big enough 
35bb0 74 6f 20 68 6f 6c 64 20 61 74 20 6c 65 61 73 74  to hold at least
35bc0 0a 2a 2a 20 70 56 66 73 2d 3e 6d 78 50 61 74 68  .** pVfs->mxPath
35bd0 6e 61 6d 65 20 62 79 74 65 73 2e 0a 2a 2f 0a 73  name bytes..*/.s
35be0 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 47 65  tatic int unixGe
35bf0 74 54 65 6d 70 6e 61 6d 65 28 69 6e 74 20 6e 42  tTempname(int nB
35c00 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b  uf, char *zBuf){
35c10 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
35c20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 7a 43  unsigned char zC
35c30 68 61 72 73 5b 5d 20 3d 0a 20 20 20 20 22 61 62  hars[] =.    "ab
35c40 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72  cdefghijklmnopqr
35c50 73 74 75 76 77 78 79 7a 22 0a 20 20 20 20 22 41  stuvwxyz".    "A
35c60 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51  BCDEFGHIJKLMNOPQ
35c70 52 53 54 55 56 57 58 59 5a 22 0a 20 20 20 20 22  RSTUVWXYZ".    "
35c80 30 31 32 33 34 35 36 37 38 39 22 3b 0a 20 20 75  0123456789";.  u
35c90 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 2c 20 6a  nsigned int i, j
35ca0 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
35cb0 7a 44 69 72 3b 0a 0a 20 20 2f 2a 20 49 74 27 73  zDir;..  /* It's
35cc0 20 6f 64 64 20 74 6f 20 73 69 6d 75 6c 61 74 65   odd to simulate
35cd0 20 61 6e 20 69 6f 2d 65 72 72 6f 72 20 68 65 72   an io-error her
35ce0 65 2c 20 62 75 74 20 72 65 61 6c 6c 79 20 74 68  e, but really th
35cf0 69 73 20 69 73 20 6a 75 73 74 0a 20 20 2a 2a 20  is is just.  ** 
35d00 75 73 69 6e 67 20 74 68 65 20 69 6f 2d 65 72 72  using the io-err
35d10 6f 72 20 69 6e 66 72 61 73 74 72 75 63 74 75 72  or infrastructur
35d20 65 20 74 6f 20 74 65 73 74 20 74 68 61 74 20 53  e to test that S
35d30 51 4c 69 74 65 20 68 61 6e 64 6c 65 73 20 74 68  QLite handles th
35d40 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e  is.  ** function
35d50 20 66 61 69 6c 69 6e 67 2e 20 0a 20 20 2a 2f 0a   failing. .  */.
35d60 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
35d70 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  r( return SQLITE
35d80 5f 49 4f 45 52 52 20 29 3b 0a 0a 20 20 7a 44 69  _IOERR );..  zDi
35d90 72 20 3d 20 75 6e 69 78 54 65 6d 70 46 69 6c 65  r = unixTempFile
35da0 44 69 72 28 29 3b 0a 20 20 69 66 28 20 7a 44 69  Dir();.  if( zDi
35db0 72 3d 3d 30 20 29 20 7a 44 69 72 20 3d 20 22 2e  r==0 ) zDir = ".
35dc0 22 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  ";..  /* Check t
35dd0 68 61 74 20 74 68 65 20 6f 75 74 70 75 74 20 62  hat the output b
35de0 75 66 66 65 72 20 69 73 20 6c 61 72 67 65 20 65  uffer is large e
35df0 6e 6f 75 67 68 20 66 6f 72 20 74 68 65 20 74 65  nough for the te
35e00 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 0a 20 20  mporary file .  
35e10 2a 2a 20 6e 61 6d 65 2e 20 49 66 20 69 74 20 69  ** name. If it i
35e20 73 20 6e 6f 74 2c 20 72 65 74 75 72 6e 20 53 51  s not, return SQ
35e30 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 20 20 2a 2f  LITE_ERROR..  */
35e40 0a 20 20 69 66 28 20 28 73 74 72 6c 65 6e 28 7a  .  if( (strlen(z
35e50 44 69 72 29 20 2b 20 73 74 72 6c 65 6e 28 53 51  Dir) + strlen(SQ
35e60 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f 50  LITE_TEMP_FILE_P
35e70 52 45 46 49 58 29 20 2b 20 31 38 29 20 3e 3d 20  REFIX) + 18) >= 
35e80 28 73 69 7a 65 5f 74 29 6e 42 75 66 20 29 7b 0a  (size_t)nBuf ){.
35e90 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
35ea0 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  E_ERROR;.  }..  
35eb0 64 6f 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  do{.    sqlite3_
35ec0 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2d 31 38  snprintf(nBuf-18
35ed0 2c 20 7a 42 75 66 2c 20 22 25 73 2f 22 53 51 4c  , zBuf, "%s/"SQL
35ee0 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f 50 52  ITE_TEMP_FILE_PR
35ef0 45 46 49 58 2c 20 7a 44 69 72 29 3b 0a 20 20 20  EFIX, zDir);.   
35f00 20 6a 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e   j = (int)strlen
35f10 28 7a 42 75 66 29 3b 0a 20 20 20 20 73 71 6c 69  (zBuf);.    sqli
35f20 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 31  te3_randomness(1
35f30 35 2c 20 26 7a 42 75 66 5b 6a 5d 29 3b 0a 20 20  5, &zBuf[j]);.  
35f40 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31 35 3b    for(i=0; i<15;
35f50 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20   i++, j++){.    
35f60 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 28 63 68 61    zBuf[j] = (cha
35f70 72 29 7a 43 68 61 72 73 5b 20 28 28 75 6e 73 69  r)zChars[ ((unsi
35f80 67 6e 65 64 20 63 68 61 72 29 7a 42 75 66 5b 6a  gned char)zBuf[j
35f90 5d 29 25 28 73 69 7a 65 6f 66 28 7a 43 68 61 72  ])%(sizeof(zChar
35fa0 73 29 2d 31 29 20 5d 3b 0a 20 20 20 20 7d 0a 20  s)-1) ];.    }. 
35fb0 20 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 30 3b 0a     zBuf[j] = 0;.
35fc0 20 20 20 20 7a 42 75 66 5b 6a 2b 31 5d 20 3d 20      zBuf[j+1] = 
35fd0 30 3b 0a 20 20 7d 77 68 69 6c 65 28 20 6f 73 41  0;.  }while( osA
35fe0 63 63 65 73 73 28 7a 42 75 66 2c 30 29 3d 3d 30  ccess(zBuf,0)==0
35ff0 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   );.  return SQL
36000 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 53  ITE_OK;.}..#if S
36010 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
36020 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65  KING_STYLE && de
36030 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
36040 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65 20 74  ./*.** Routine t
36050 6f 20 74 72 61 6e 73 66 6f 72 6d 20 61 20 75 6e  o transform a un
36060 69 78 46 69 6c 65 20 69 6e 74 6f 20 61 20 70 72  ixFile into a pr
36070 6f 78 79 2d 6c 6f 63 6b 69 6e 67 20 75 6e 69 78  oxy-locking unix
36080 46 69 6c 65 2e 0a 2a 2a 20 49 6d 70 6c 65 6d 65  File..** Impleme
36090 6e 74 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 70  ntation in the p
360a0 72 6f 78 79 2d 6c 6f 63 6b 20 64 69 76 69 73 69  roxy-lock divisi
360b0 6f 6e 2c 20 62 75 74 20 75 73 65 64 20 62 79 20  on, but used by 
360c0 75 6e 69 78 4f 70 65 6e 28 29 0a 2a 2a 20 69 66  unixOpen().** if
360d0 20 53 51 4c 49 54 45 5f 50 52 45 46 45 52 5f 50   SQLITE_PREFER_P
360e0 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 20 69 73 20  ROXY_LOCKING is 
360f0 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  defined..*/.stat
36100 69 63 20 69 6e 74 20 70 72 6f 78 79 54 72 61 6e  ic int proxyTran
36110 73 66 6f 72 6d 55 6e 69 78 46 69 6c 65 28 75 6e  sformUnixFile(un
36120 69 78 46 69 6c 65 2a 2c 20 63 6f 6e 73 74 20 63  ixFile*, const c
36130 68 61 72 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f  har*);.#endif../
36140 2a 0a 2a 2a 20 53 65 61 72 63 68 20 66 6f 72 20  *.** Search for 
36150 61 6e 20 75 6e 75 73 65 64 20 66 69 6c 65 20 64  an unused file d
36160 65 73 63 72 69 70 74 6f 72 20 74 68 61 74 20 77  escriptor that w
36170 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 74 68 65  as opened on the
36180 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 66 69   database .** fi
36190 6c 65 20 28 6e 6f 74 20 61 20 6a 6f 75 72 6e 61  le (not a journa
361a0 6c 20 6f 72 20 6d 61 73 74 65 72 2d 6a 6f 75 72  l or master-jour
361b0 6e 61 6c 20 66 69 6c 65 29 20 69 64 65 6e 74 69  nal file) identi
361c0 66 69 65 64 20 62 79 20 70 61 74 68 6e 61 6d 65  fied by pathname
361d0 0a 2a 2a 20 7a 50 61 74 68 20 77 69 74 68 20 53  .** zPath with S
361e0 51 4c 49 54 45 5f 4f 50 45 4e 5f 58 58 58 20 66  QLITE_OPEN_XXX f
361f0 6c 61 67 73 20 6d 61 74 63 68 69 6e 67 20 74 68  lags matching th
36200 6f 73 65 20 70 61 73 73 65 64 20 61 73 20 74 68  ose passed as th
36210 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 61 72 67 75  e second.** argu
36220 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e  ment to this fun
36230 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 53 75 63  ction..**.** Suc
36240 68 20 61 20 66 69 6c 65 20 64 65 73 63 72 69 70  h a file descrip
36250 74 6f 72 20 6d 61 79 20 65 78 69 73 74 20 69 66  tor may exist if
36260 20 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e   a database conn
36270 65 63 74 69 6f 6e 20 77 61 73 20 63 6c 6f 73 65  ection was close
36280 64 0a 2a 2a 20 62 75 74 20 74 68 65 20 61 73 73  d.** but the ass
36290 6f 63 69 61 74 65 64 20 66 69 6c 65 20 64 65 73  ociated file des
362a0 63 72 69 70 74 6f 72 20 63 6f 75 6c 64 20 6e 6f  criptor could no
362b0 74 20 62 65 20 63 6c 6f 73 65 64 20 62 65 63 61  t be closed beca
362c0 75 73 65 20 73 6f 6d 65 0a 2a 2a 20 6f 74 68 65  use some.** othe
362d0 72 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  r file descripto
362e0 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73 61  r open on the sa
362f0 6d 65 20 66 69 6c 65 20 69 73 20 68 6f 6c 64 69  me file is holdi
36300 6e 67 20 61 20 66 69 6c 65 2d 6c 6f 63 6b 2e 0a  ng a file-lock..
36310 2a 2a 20 52 65 66 65 72 20 74 6f 20 63 6f 6d 6d  ** Refer to comm
36320 65 6e 74 73 20 69 6e 20 74 68 65 20 75 6e 69 78  ents in the unix
36330 43 6c 6f 73 65 28 29 20 66 75 6e 63 74 69 6f 6e  Close() function
36340 20 61 6e 64 20 74 68 65 20 6c 65 6e 67 74 68 79   and the lengthy
36350 20 63 6f 6d 6d 65 6e 74 0a 2a 2a 20 64 65 73 63   comment.** desc
36360 72 69 62 69 6e 67 20 22 50 6f 73 69 78 20 41 64  ribing "Posix Ad
36370 76 69 73 6f 72 79 20 4c 6f 63 6b 69 6e 67 22 20  visory Locking" 
36380 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
36390 74 68 69 73 20 66 69 6c 65 20 66 6f 72 20 0a 2a  this file for .*
363a0 2a 20 66 75 72 74 68 65 72 20 64 65 74 61 69 6c  * further detail
363b0 73 2e 20 41 6c 73 6f 2c 20 74 69 63 6b 65 74 20  s. Also, ticket 
363c0 23 34 30 31 38 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  #4018..**.** If 
363d0 61 20 73 75 69 74 61 62 6c 65 20 66 69 6c 65 20  a suitable file 
363e0 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 66 6f  descriptor is fo
363f0 75 6e 64 2c 20 74 68 65 6e 20 69 74 20 69 73 20  und, then it is 
36400 72 65 74 75 72 6e 65 64 2e 20 49 66 20 6e 6f 0a  returned. If no.
36410 2a 2a 20 73 75 63 68 20 66 69 6c 65 20 64 65 73  ** such file des
36420 63 72 69 70 74 6f 72 20 69 73 20 6c 6f 63 61 74  criptor is locat
36430 65 64 2c 20 2d 31 20 69 73 20 72 65 74 75 72 6e  ed, -1 is return
36440 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 55 6e  ed..*/.static Un
36450 69 78 55 6e 75 73 65 64 46 64 20 2a 66 69 6e 64  ixUnusedFd *find
36460 52 65 75 73 61 62 6c 65 46 64 28 63 6f 6e 73 74  ReusableFd(const
36470 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 69 6e   char *zPath, in
36480 74 20 66 6c 61 67 73 29 7b 0a 20 20 55 6e 69 78  t flags){.  Unix
36490 55 6e 75 73 65 64 46 64 20 2a 70 55 6e 75 73 65  UnusedFd *pUnuse
364a0 64 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 44 6f 20  d = 0;..  /* Do 
364b0 6e 6f 74 20 73 65 61 72 63 68 20 66 6f 72 20 61  not search for a
364c0 6e 20 75 6e 75 73 65 64 20 66 69 6c 65 20 64 65  n unused file de
364d0 73 63 72 69 70 74 6f 72 20 6f 6e 20 76 78 77 6f  scriptor on vxwo
364e0 72 6b 73 2e 20 4e 6f 74 20 62 65 63 61 75 73 65  rks. Not because
364f0 0a 20 20 2a 2a 20 76 78 77 6f 72 6b 73 20 77 6f  .  ** vxworks wo
36500 75 6c 64 20 6e 6f 74 20 62 65 6e 65 66 69 74 20  uld not benefit 
36510 66 72 6f 6d 20 74 68 65 20 63 68 61 6e 67 65 20  from the change 
36520 28 69 74 20 6d 69 67 68 74 2c 20 77 65 27 72 65  (it might, we're
36530 20 6e 6f 74 20 73 75 72 65 29 2c 0a 20 20 2a 2a   not sure),.  **
36540 20 62 75 74 20 62 65 63 61 75 73 65 20 6e 6f 20   but because no 
36550 77 61 79 20 74 6f 20 74 65 73 74 20 69 74 20 69  way to test it i
36560 73 20 63 75 72 72 65 6e 74 6c 79 20 61 76 61 69  s currently avai
36570 6c 61 62 6c 65 2e 20 49 74 20 69 73 20 62 65 74  lable. It is bet
36580 74 65 72 20 0a 20 20 2a 2a 20 6e 6f 74 20 74 6f  ter .  ** not to
36590 20 72 69 73 6b 20 62 72 65 61 6b 69 6e 67 20 76   risk breaking v
365a0 78 77 6f 72 6b 73 20 73 75 70 70 6f 72 74 20 66  xworks support f
365b0 6f 72 20 74 68 65 20 73 61 6b 65 20 6f 66 20 73  or the sake of s
365c0 75 63 68 20 61 6e 20 6f 62 73 63 75 72 65 20 0a  uch an obscure .
365d0 20 20 2a 2a 20 66 65 61 74 75 72 65 2e 20 20 2a    ** feature.  *
365e0 2f 0a 23 69 66 20 21 4f 53 5f 56 58 57 4f 52 4b  /.#if !OS_VXWORK
365f0 53 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 20  S.  struct stat 
36600 73 53 74 61 74 3b 20 20 20 20 20 20 20 20 20 20  sStat;          
36610 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
36620 6c 74 73 20 6f 66 20 73 74 61 74 28 29 20 63 61  lts of stat() ca
36630 6c 6c 20 2a 2f 0a 0a 20 20 2f 2a 20 41 20 73 74  ll */..  /* A st
36640 61 74 28 29 20 63 61 6c 6c 20 6d 61 79 20 66 61  at() call may fa
36650 69 6c 20 66 6f 72 20 76 61 72 69 6f 75 73 20 72  il for various r
36660 65 61 73 6f 6e 73 2e 20 49 66 20 74 68 69 73 20  easons. If this 
36670 68 61 70 70 65 6e 73 2c 20 69 74 20 69 73 0a 20  happens, it is. 
36680 20 2a 2a 20 61 6c 6d 6f 73 74 20 63 65 72 74 61   ** almost certa
36690 69 6e 20 74 68 61 74 20 61 6e 20 6f 70 65 6e 28  in that an open(
366a0 29 20 63 61 6c 6c 20 6f 6e 20 74 68 65 20 73 61  ) call on the sa
366b0 6d 65 20 70 61 74 68 20 77 69 6c 6c 20 61 6c 73  me path will als
366c0 6f 20 66 61 69 6c 2e 0a 20 20 2a 2a 20 46 6f 72  o fail..  ** For
366d0 20 74 68 69 73 20 72 65 61 73 6f 6e 2c 20 69 66   this reason, if
366e0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
366f0 20 69 6e 20 74 68 65 20 73 74 61 74 28 29 20 63   in the stat() c
36700 61 6c 6c 20 68 65 72 65 2c 20 69 74 20 69 73 0a  all here, it is.
36710 20 20 2a 2a 20 69 67 6e 6f 72 65 64 20 61 6e 64    ** ignored and
36720 20 2d 31 20 69 73 20 72 65 74 75 72 6e 65 64 2e   -1 is returned.
36730 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c   The caller will
36740 20 74 72 79 20 74 6f 20 6f 70 65 6e 20 61 20 6e   try to open a n
36750 65 77 20 66 69 6c 65 0a 20 20 2a 2a 20 64 65 73  ew file.  ** des
36760 63 72 69 70 74 6f 72 20 6f 6e 20 74 68 65 20 73  criptor on the s
36770 61 6d 65 20 70 61 74 68 2c 20 66 61 69 6c 2c 20  ame path, fail, 
36780 61 6e 64 20 72 65 74 75 72 6e 20 61 6e 20 65 72  and return an er
36790 72 6f 72 20 74 6f 20 53 51 4c 69 74 65 2e 0a 20  ror to SQLite.. 
367a0 20 2a 2a 0a 20 20 2a 2a 20 45 76 65 6e 20 69 66   **.  ** Even if
367b0 20 61 20 73 75 62 73 65 71 75 65 6e 74 20 6f 70   a subsequent op
367c0 65 6e 28 29 20 63 61 6c 6c 20 64 6f 65 73 20 73  en() call does s
367d0 75 63 63 65 65 64 2c 20 74 68 65 20 63 6f 6e 73  ucceed, the cons
367e0 65 71 75 65 6e 63 65 73 20 6f 66 0a 20 20 2a 2a  equences of.  **
367f0 20 6e 6f 74 20 73 65 61 72 63 68 69 6e 67 20 66   not searching f
36800 6f 72 20 61 20 72 65 75 73 61 62 6c 65 20 66 69  or a reusable fi
36810 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 61 72  le descriptor ar
36820 65 20 6e 6f 74 20 64 69 72 65 2e 20 20 2a 2f 0a  e not dire.  */.
36830 20 20 69 66 28 20 30 3d 3d 6f 73 53 74 61 74 28    if( 0==osStat(
36840 7a 50 61 74 68 2c 20 26 73 53 74 61 74 29 20 29  zPath, &sStat) )
36850 7b 0a 20 20 20 20 75 6e 69 78 49 6e 6f 64 65 49  {.    unixInodeI
36860 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a 0a 20 20  nfo *pInode;..  
36870 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
36880 28 29 3b 0a 20 20 20 20 70 49 6e 6f 64 65 20 3d  ();.    pInode =
36890 20 69 6e 6f 64 65 4c 69 73 74 3b 0a 20 20 20 20   inodeList;.    
368a0 77 68 69 6c 65 28 20 70 49 6e 6f 64 65 20 26 26  while( pInode &&
368b0 20 28 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64   (pInode->fileId
368c0 2e 64 65 76 21 3d 73 53 74 61 74 2e 73 74 5f 64  .dev!=sStat.st_d
368d0 65 76 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ev.             
368e0 20 20 20 20 20 20 20 20 7c 7c 20 70 49 6e 6f 64          || pInod
368f0 65 2d 3e 66 69 6c 65 49 64 2e 69 6e 6f 21 3d 73  e->fileId.ino!=s
36900 53 74 61 74 2e 73 74 5f 69 6e 6f 29 20 29 7b 0a  Stat.st_ino) ){.
36910 20 20 20 20 20 20 20 70 49 6e 6f 64 65 20 3d 20         pInode = 
36920 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a 20  pInode->pNext;. 
36930 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 49 6e     }.    if( pIn
36940 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 55 6e 69  ode ){.      Uni
36950 78 55 6e 75 73 65 64 46 64 20 2a 2a 70 70 3b 0a  xUnusedFd **pp;.
36960 20 20 20 20 20 20 66 6f 72 28 70 70 3d 26 70 49        for(pp=&pI
36970 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 3b 20 2a  node->pUnused; *
36980 70 70 20 26 26 20 28 2a 70 70 29 2d 3e 66 6c 61  pp && (*pp)->fla
36990 67 73 21 3d 66 6c 61 67 73 3b 20 70 70 3d 26 28  gs!=flags; pp=&(
369a0 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29 29 3b 0a  (*pp)->pNext));.
369b0 20 20 20 20 20 20 70 55 6e 75 73 65 64 20 3d 20        pUnused = 
369c0 2a 70 70 3b 0a 20 20 20 20 20 20 69 66 28 20 70  *pp;.      if( p
369d0 55 6e 75 73 65 64 20 29 7b 0a 20 20 20 20 20 20  Unused ){.      
369e0 20 20 2a 70 70 20 3d 20 70 55 6e 75 73 65 64 2d    *pp = pUnused-
369f0 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a  >pNext;.      }.
36a00 20 20 20 20 7d 0a 20 20 20 20 75 6e 69 78 4c 65      }.    unixLe
36a10 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a  aveMutex();.  }.
36a20 23 65 6e 64 69 66 20 20 20 20 2f 2a 20 69 66 20  #endif    /* if 
36a30 21 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 20  !OS_VXWORKS */. 
36a40 20 72 65 74 75 72 6e 20 70 55 6e 75 73 65 64 3b   return pUnused;
36a50 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
36a60 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
36a70 64 20 62 79 20 75 6e 69 78 4f 70 65 6e 28 29 20  d by unixOpen() 
36a80 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  to determine the
36a90 20 75 6e 69 78 20 70 65 72 6d 69 73 73 69 6f 6e   unix permission
36aa0 73 0a 2a 2a 20 74 6f 20 63 72 65 61 74 65 20 6e  s.** to create n
36ab0 65 77 20 66 69 6c 65 73 20 77 69 74 68 2e 20 49  ew files with. I
36ac0 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72  f no error occur
36ad0 73 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f  s, then SQLITE_O
36ae0 4b 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a  K is returned.**
36af0 20 61 6e 64 20 61 20 76 61 6c 75 65 20 73 75 69   and a value sui
36b00 74 61 62 6c 65 20 66 6f 72 20 70 61 73 73 69 6e  table for passin
36b10 67 20 61 73 20 74 68 65 20 74 68 69 72 64 20 61  g as the third a
36b20 72 67 75 6d 65 6e 74 20 74 6f 20 6f 70 65 6e 28  rgument to open(
36b30 32 29 20 69 73 0a 2a 2a 20 77 72 69 74 74 65 6e  2) is.** written
36b40 20 74 6f 20 2a 70 4d 6f 64 65 2e 20 49 66 20 61   to *pMode. If a
36b50 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  n IO error occur
36b60 73 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  s, an SQLite err
36b70 6f 72 20 63 6f 64 65 20 69 73 20 0a 2a 2a 20 72  or code is .** r
36b80 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20  eturned and the 
36b90 76 61 6c 75 65 20 6f 66 20 2a 70 4d 6f 64 65 20  value of *pMode 
36ba0 69 73 20 6e 6f 74 20 6d 6f 64 69 66 69 65 64 2e  is not modified.
36bb0 0a 2a 2a 0a 2a 2a 20 49 6e 20 6d 6f 73 74 20 63  .**.** In most c
36bc0 61 73 65 73 2c 20 74 68 69 73 20 72 6f 75 74 69  ases, this routi
36bd0 6e 65 20 73 65 74 73 20 2a 70 4d 6f 64 65 20 74  ne sets *pMode t
36be0 6f 20 30 2c 20 77 68 69 63 68 20 77 69 6c 6c 20  o 0, which will 
36bf0 62 65 63 6f 6d 65 0a 2a 2a 20 61 6e 20 69 6e 64  become.** an ind
36c00 69 63 61 74 69 6f 6e 20 74 6f 20 72 6f 62 75 73  ication to robus
36c10 74 5f 6f 70 65 6e 28 29 20 74 6f 20 63 72 65 61  t_open() to crea
36c20 74 65 20 74 68 65 20 66 69 6c 65 20 75 73 69 6e  te the file usin
36c30 67 0a 2a 2a 20 53 51 4c 49 54 45 5f 44 45 46 41  g.** SQLITE_DEFA
36c40 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53  ULT_FILE_PERMISS
36c50 49 4f 4e 53 20 61 64 6a 75 73 74 65 64 20 62 79  IONS adjusted by
36c60 20 74 68 65 20 75 6d 61 73 6b 2e 0a 2a 2a 20 42   the umask..** B
36c70 75 74 20 69 66 20 74 68 65 20 66 69 6c 65 20 62  ut if the file b
36c80 65 69 6e 67 20 6f 70 65 6e 65 64 20 69 73 20 61  eing opened is a
36c90 20 57 41 4c 20 6f 72 20 72 65 67 75 6c 61 72 20   WAL or regular 
36ca0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68  journal file, th
36cb0 65 6e 20 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63  en .** this func
36cc0 74 69 6f 6e 20 71 75 65 72 69 65 73 20 74 68 65  tion queries the
36cd0 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 66 6f 72   file-system for
36ce0 20 74 68 65 20 70 65 72 6d 69 73 73 69 6f 6e 73   the permissions
36cf0 20 6f 6e 20 74 68 65 20 0a 2a 2a 20 63 6f 72 72   on the .** corr
36d00 65 73 70 6f 6e 64 69 6e 67 20 64 61 74 61 62 61  esponding databa
36d10 73 65 20 66 69 6c 65 20 61 6e 64 20 73 65 74 73  se file and sets
36d20 20 2a 70 4d 6f 64 65 20 74 6f 20 74 68 69 73 20   *pMode to this 
36d30 76 61 6c 75 65 2e 20 57 68 65 6e 65 76 65 72 20  value. Whenever 
36d40 0a 2a 2a 20 70 6f 73 73 69 62 6c 65 2c 20 57 41  .** possible, WA
36d50 4c 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 20 66 69  L and journal fi
36d60 6c 65 73 20 61 72 65 20 63 72 65 61 74 65 64 20  les are created 
36d70 75 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20 70  using the same p
36d80 65 72 6d 69 73 73 69 6f 6e 73 20 0a 2a 2a 20 61  ermissions .** a
36d90 73 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64  s the associated
36da0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
36db0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 53 51 4c  **.** If the SQL
36dc0 49 54 45 5f 45 4e 41 42 4c 45 5f 38 5f 33 5f 4e  ITE_ENABLE_8_3_N
36dd0 41 4d 45 53 20 6f 70 74 69 6f 6e 20 69 73 20 65  AMES option is e
36de0 6e 61 62 6c 65 64 2c 20 74 68 65 6e 20 74 68 65  nabled, then the
36df0 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c  .** original fil
36e00 65 6e 61 6d 65 20 69 73 20 75 6e 61 76 61 69 6c  ename is unavail
36e10 61 62 6c 65 2e 20 20 42 75 74 20 38 5f 33 5f 4e  able.  But 8_3_N
36e20 41 4d 45 53 20 69 73 20 6f 6e 6c 79 20 75 73 65  AMES is only use
36e30 64 20 66 6f 72 0a 2a 2a 20 46 41 54 20 66 69 6c  d for.** FAT fil
36e40 65 73 79 73 74 65 6d 73 20 61 6e 64 20 70 65 72  esystems and per
36e50 6d 69 73 73 69 6f 6e 73 20 64 6f 20 6e 6f 74 20  missions do not 
36e60 6d 61 74 74 65 72 20 74 68 65 72 65 2c 20 73 6f  matter there, so
36e70 20 6a 75 73 74 20 75 73 65 0a 2a 2a 20 74 68 65   just use.** the
36e80 20 64 65 66 61 75 6c 74 20 70 65 72 6d 69 73 73   default permiss
36e90 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ions..*/.static 
36ea0 69 6e 74 20 66 69 6e 64 43 72 65 61 74 65 46 69  int findCreateFi
36eb0 6c 65 4d 6f 64 65 28 0a 20 20 63 6f 6e 73 74 20  leMode(.  const 
36ec0 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20  char *zPath,    
36ed0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 74            /* Pat
36ee0 68 20 6f 66 20 66 69 6c 65 20 28 70 6f 73 73 69  h of file (possi
36ef0 62 6c 79 29 20 62 65 69 6e 67 20 63 72 65 61 74  bly) being creat
36f00 65 64 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  ed */.  int flag
36f10 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
36f20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73          /* Flags
36f30 20 70 61 73 73 65 64 20 61 73 20 34 74 68 20 61   passed as 4th a
36f40 72 67 75 6d 65 6e 74 20 74 6f 20 78 4f 70 65 6e  rgument to xOpen
36f50 28 29 20 2a 2f 0a 20 20 6d 6f 64 65 5f 74 20 2a  () */.  mode_t *
36f60 70 4d 6f 64 65 2c 20 20 20 20 20 20 20 20 20 20  pMode,          
36f70 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
36f80 50 65 72 6d 69 73 73 69 6f 6e 73 20 74 6f 20 6f  Permissions to o
36f90 70 65 6e 20 66 69 6c 65 20 77 69 74 68 20 2a 2f  pen file with */
36fa0 0a 20 20 75 69 64 5f 74 20 2a 70 55 69 64 2c 20  .  uid_t *pUid, 
36fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36fc0 20 20 20 2f 2a 20 4f 55 54 3a 20 75 69 64 20 74     /* OUT: uid t
36fd0 6f 20 73 65 74 20 6f 6e 20 74 68 65 20 66 69 6c  o set on the fil
36fe0 65 20 2a 2f 0a 20 20 67 69 64 5f 74 20 2a 70 47  e */.  gid_t *pG
36ff0 69 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20  id              
37000 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 67         /* OUT: g
37010 69 64 20 74 6f 20 73 65 74 20 6f 6e 20 74 68 65  id to set on the
37020 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   file */.){.  in
37030 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
37040 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
37050 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a   Return Code */.
37060 20 20 2a 70 4d 6f 64 65 20 3d 20 30 3b 0a 20 20    *pMode = 0;.  
37070 2a 70 55 69 64 20 3d 20 30 3b 0a 20 20 2a 70 47  *pUid = 0;.  *pG
37080 69 64 20 3d 20 30 3b 0a 20 20 69 66 28 20 66 6c  id = 0;.  if( fl
37090 61 67 73 20 26 20 28 53 51 4c 49 54 45 5f 4f 50  ags & (SQLITE_OP
370a0 45 4e 5f 57 41 4c 7c 53 51 4c 49 54 45 5f 4f 50  EN_WAL|SQLITE_OP
370b0 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29  EN_MAIN_JOURNAL)
370c0 20 29 7b 0a 20 20 20 20 63 68 61 72 20 7a 44 62   ){.    char zDb
370d0 5b 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 31 5d  [MAX_PATHNAME+1]
370e0 3b 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73  ;     /* Databas
370f0 65 20 66 69 6c 65 20 70 61 74 68 20 2a 2f 0a 20  e file path */. 
37100 20 20 20 69 6e 74 20 6e 44 62 3b 20 20 20 20 20     int nDb;     
37110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37120 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 76 61   /* Number of va
37130 6c 69 64 20 62 79 74 65 73 20 69 6e 20 7a 44 62  lid bytes in zDb
37140 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20 73   */.    struct s
37150 74 61 74 20 73 53 74 61 74 3b 20 20 20 20 20 20  tat sStat;      
37160 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20        /* Output 
37170 6f 66 20 73 74 61 74 28 29 20 6f 6e 20 64 61 74  of stat() on dat
37180 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20  abase file */.. 
37190 20 20 20 2f 2a 20 7a 50 61 74 68 20 69 73 20 61     /* zPath is a
371a0 20 70 61 74 68 20 74 6f 20 61 20 57 41 4c 20 6f   path to a WAL o
371b0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  r journal file. 
371c0 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c  The following bl
371d0 6f 63 6b 20 64 65 72 69 76 65 73 0a 20 20 20 20  ock derives.    
371e0 2a 2a 20 74 68 65 20 70 61 74 68 20 74 6f 20 74  ** the path to t
371f0 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 64 61  he associated da
37200 74 61 62 61 73 65 20 66 69 6c 65 20 66 72 6f 6d  tabase file from
37210 20 7a 50 61 74 68 2e 20 54 68 69 73 20 62 6c 6f   zPath. This blo
37220 63 6b 20 68 61 6e 64 6c 65 73 0a 20 20 20 20 2a  ck handles.    *
37230 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * the following 
37240 6e 61 6d 69 6e 67 20 63 6f 6e 76 65 6e 74 69 6f  naming conventio
37250 6e 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ns:.    **.    *
37260 2a 20 20 20 22 3c 70 61 74 68 20 74 6f 20 64 62  *   "<path to db
37270 3e 2d 6a 6f 75 72 6e 61 6c 22 0a 20 20 20 20 2a  >-journal".    *
37280 2a 20 20 20 22 3c 70 61 74 68 20 74 6f 20 64 62  *   "<path to db
37290 3e 2d 77 61 6c 22 0a 20 20 20 20 2a 2a 20 20 20  >-wal".    **   
372a0 22 3c 70 61 74 68 20 74 6f 20 64 62 3e 2d 6a 6f  "<path to db>-jo
372b0 75 72 6e 61 6c 4e 4e 22 0a 20 20 20 20 2a 2a 20  urnalNN".    ** 
372c0 20 20 22 3c 70 61 74 68 20 74 6f 20 64 62 3e 2d    "<path to db>-
372d0 77 61 6c 4e 4e 22 0a 20 20 20 20 2a 2a 0a 20 20  walNN".    **.  
372e0 20 20 2a 2a 20 77 68 65 72 65 20 4e 4e 20 69 73    ** where NN is
372f0 20 61 20 64 65 63 69 6d 61 6c 20 6e 75 6d 62 65   a decimal numbe
37300 72 2e 20 54 68 65 20 4e 4e 20 6e 61 6d 69 6e 67  r. The NN naming
37310 20 73 63 68 65 6d 65 73 20 61 72 65 20 0a 20 20   schemes are .  
37320 20 20 2a 2a 20 75 73 65 64 20 62 79 20 74 68 65    ** used by the
37330 20 74 65 73 74 5f 6d 75 6c 74 69 70 6c 65 78 2e   test_multiplex.
37340 63 20 6d 6f 64 75 6c 65 2e 0a 20 20 20 20 2a 2f  c module..    */
37350 0a 20 20 20 20 6e 44 62 20 3d 20 73 71 6c 69 74  .    nDb = sqlit
37360 65 33 53 74 72 6c 65 6e 33 30 28 7a 50 61 74 68  e3Strlen30(zPath
37370 29 20 2d 20 31 3b 20 0a 23 69 66 64 65 66 20 53  ) - 1; .#ifdef S
37380 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 38 5f 33  QLITE_ENABLE_8_3
37390 5f 4e 41 4d 45 53 0a 20 20 20 20 77 68 69 6c 65  _NAMES.    while
373a0 28 20 6e 44 62 3e 30 20 26 26 20 73 71 6c 69 74  ( nDb>0 && sqlit
373b0 65 33 49 73 61 6c 6e 75 6d 28 7a 50 61 74 68 5b  e3Isalnum(zPath[
373c0 6e 44 62 5d 29 20 29 20 6e 44 62 2d 2d 3b 0a 20  nDb]) ) nDb--;. 
373d0 20 20 20 69 66 28 20 6e 44 62 3d 3d 30 20 7c 7c     if( nDb==0 ||
373e0 20 7a 50 61 74 68 5b 6e 44 62 5d 21 3d 27 2d 27   zPath[nDb]!='-'
373f0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
37400 5f 4f 4b 3b 0a 23 65 6c 73 65 0a 20 20 20 20 77  _OK;.#else.    w
37410 68 69 6c 65 28 20 7a 50 61 74 68 5b 6e 44 62 5d  hile( zPath[nDb]
37420 21 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20 20 61  !='-' ){.      a
37430 73 73 65 72 74 28 20 6e 44 62 3e 30 20 29 3b 0a  ssert( nDb>0 );.
37440 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 50        assert( zP
37450 61 74 68 5b 6e 44 62 5d 21 3d 27 5c 6e 27 20 29  ath[nDb]!='\n' )
37460 3b 0a 20 20 20 20 20 20 6e 44 62 2d 2d 3b 0a 20  ;.      nDb--;. 
37470 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
37480 6d 65 6d 63 70 79 28 7a 44 62 2c 20 7a 50 61 74  memcpy(zDb, zPat
37490 68 2c 20 6e 44 62 29 3b 0a 20 20 20 20 7a 44 62  h, nDb);.    zDb
374a0 5b 6e 44 62 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20  [nDb] = '\0';.. 
374b0 20 20 20 69 66 28 20 30 3d 3d 6f 73 53 74 61 74     if( 0==osStat
374c0 28 7a 44 62 2c 20 26 73 53 74 61 74 29 20 29 7b  (zDb, &sStat) ){
374d0 0a 20 20 20 20 20 20 2a 70 4d 6f 64 65 20 3d 20  .      *pMode = 
374e0 73 53 74 61 74 2e 73 74 5f 6d 6f 64 65 20 26 20  sStat.st_mode & 
374f0 30 37 37 37 3b 0a 20 20 20 20 20 20 2a 70 55 69  0777;.      *pUi
37500 64 20 3d 20 73 53 74 61 74 2e 73 74 5f 75 69 64  d = sStat.st_uid
37510 3b 0a 20 20 20 20 20 20 2a 70 47 69 64 20 3d 20  ;.      *pGid = 
37520 73 53 74 61 74 2e 73 74 5f 67 69 64 3b 0a 20 20  sStat.st_gid;.  
37530 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
37540 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
37550 5f 46 53 54 41 54 3b 0a 20 20 20 20 7d 0a 20 20  _FSTAT;.    }.  
37560 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20  }else if( flags 
37570 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45  & SQLITE_OPEN_DE
37580 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 29 7b 0a 20  LETEONCLOSE ){. 
37590 20 20 20 2a 70 4d 6f 64 65 20 3d 20 30 36 30 30     *pMode = 0600
375a0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
375b0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e  c;.}../*.** Open
375c0 20 74 68 65 20 66 69 6c 65 20 7a 50 61 74 68 2e   the file zPath.
375d0 0a 2a 2a 20 0a 2a 2a 20 50 72 65 76 69 6f 75 73  .** .** Previous
375e0 6c 79 2c 20 74 68 65 20 53 51 4c 69 74 65 20 4f  ly, the SQLite O
375f0 53 20 6c 61 79 65 72 20 75 73 65 64 20 74 68 72  S layer used thr
37600 65 65 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e 20  ee functions in 
37610 70 6c 61 63 65 20 6f 66 20 74 68 69 73 0a 2a 2a  place of this.**
37620 20 6f 6e 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20   one:.**.**     
37630 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61  sqlite3OsOpenRea
37640 64 57 72 69 74 65 28 29 3b 0a 2a 2a 20 20 20 20  dWrite();.**    
37650 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65   sqlite3OsOpenRe
37660 61 64 4f 6e 6c 79 28 29 3b 0a 2a 2a 20 20 20 20  adOnly();.**    
37670 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 45 78   sqlite3OsOpenEx
37680 63 6c 75 73 69 76 65 28 29 3b 0a 2a 2a 0a 2a 2a  clusive();.**.**
37690 20 54 68 65 73 65 20 63 61 6c 6c 73 20 63 6f 72   These calls cor
376a0 72 65 73 70 6f 6e 64 20 74 6f 20 74 68 65 20 66  respond to the f
376b0 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d 62 69 6e 61  ollowing combina
376c0 74 69 6f 6e 73 20 6f 66 20 66 6c 61 67 73 3a 0a  tions of flags:.
376d0 2a 2a 0a 2a 2a 20 20 20 20 20 52 65 61 64 57 72  **.**     ReadWr
376e0 69 74 65 28 29 20 2d 3e 20 20 20 20 20 28 52 45  ite() ->     (RE
376f0 41 44 57 52 49 54 45 20 7c 20 43 52 45 41 54 45  ADWRITE | CREATE
37700 29 0a 2a 2a 20 20 20 20 20 52 65 61 64 4f 6e 6c  ).**     ReadOnl
37710 79 28 29 20 20 2d 3e 20 20 20 20 20 28 52 45 41  y()  ->     (REA
37720 44 4f 4e 4c 59 29 20 0a 2a 2a 20 20 20 20 20 4f  DONLY) .**     O
37730 70 65 6e 45 78 63 6c 75 73 69 76 65 28 29 20 2d  penExclusive() -
37740 3e 20 28 52 45 41 44 57 52 49 54 45 20 7c 20 43  > (READWRITE | C
37750 52 45 41 54 45 20 7c 20 45 58 43 4c 55 53 49 56  REATE | EXCLUSIV
37760 45 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 6c 64  E).**.** The old
37770 20 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28 29   OpenExclusive()
37780 20 61 63 63 65 70 74 65 64 20 61 20 62 6f 6f 6c   accepted a bool
37790 65 61 6e 20 61 72 67 75 6d 65 6e 74 20 2d 20 22  ean argument - "
377a0 64 65 6c 46 6c 61 67 22 2e 20 49 66 0a 2a 2a 20  delFlag". If.** 
377b0 74 72 75 65 2c 20 74 68 65 20 66 69 6c 65 20 77  true, the file w
377c0 61 73 20 63 6f 6e 66 69 67 75 72 65 64 20 74 6f  as configured to
377d0 20 62 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c   be automaticall
377e0 79 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20 74  y deleted when t
377f0 68 65 0a 2a 2a 20 66 69 6c 65 20 68 61 6e 64 6c  he.** file handl
37800 65 20 63 6c 6f 73 65 64 2e 20 54 6f 20 61 63 68  e closed. To ach
37810 69 65 76 65 20 74 68 65 20 73 61 6d 65 20 65 66  ieve the same ef
37820 66 65 63 74 20 75 73 69 6e 67 20 74 68 69 73 20  fect using this 
37830 6e 65 77 20 0a 2a 2a 20 69 6e 74 65 72 66 61 63  new .** interfac
37840 65 2c 20 61 64 64 20 74 68 65 20 44 45 4c 45 54  e, add the DELET
37850 45 4f 4e 43 4c 4f 53 45 20 66 6c 61 67 20 74 6f  EONCLOSE flag to
37860 20 74 68 6f 73 65 20 73 70 65 63 69 66 69 65 64   those specified
37870 20 61 62 6f 76 65 20 66 6f 72 20 0a 2a 2a 20 4f   above for .** O
37880 70 65 6e 45 78 63 6c 75 73 69 76 65 28 29 2e 0a  penExclusive()..
37890 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
378a0 69 78 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65  ixOpen(.  sqlite
378b0 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20  3_vfs *pVfs,    
378c0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 46         /* The VF
378d0 53 20 66 6f 72 20 77 68 69 63 68 20 74 68 69 73  S for which this
378e0 20 69 73 20 74 68 65 20 78 4f 70 65 6e 20 6d 65   is the xOpen me
378f0 74 68 6f 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  thod */.  const 
37900 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20 20  char *zPath,    
37910 20 20 20 20 20 20 20 2f 2a 20 50 61 74 68 6e 61         /* Pathna
37920 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 62 65  me of file to be
37930 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 73 71 6c   opened */.  sql
37940 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65  ite3_file *pFile
37950 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ,         /* The
37960 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
37970 20 74 6f 20 62 65 20 66 69 6c 6c 65 64 20 69 6e   to be filled in
37980 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c   */.  int flags,
37990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
379a0 20 20 20 2f 2a 20 49 6e 70 75 74 20 66 6c 61 67     /* Input flag
379b0 73 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 74 68 65  s to control the
379c0 20 6f 70 65 6e 69 6e 67 20 2a 2f 0a 20 20 69 6e   opening */.  in
379d0 74 20 2a 70 4f 75 74 46 6c 61 67 73 20 20 20 20  t *pOutFlags    
379e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75             /* Ou
379f0 74 70 75 74 20 66 6c 61 67 73 20 72 65 74 75 72  tput flags retur
37a00 6e 65 64 20 74 6f 20 53 51 4c 69 74 65 20 63 6f  ned to SQLite co
37a10 72 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 46  re */.){.  unixF
37a20 69 6c 65 20 2a 70 20 3d 20 28 75 6e 69 78 46 69  ile *p = (unixFi
37a30 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20 20 69 6e  le *)pFile;.  in
37a40 74 20 66 64 20 3d 20 2d 31 3b 20 20 20 20 20 20  t fd = -1;      
37a50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
37a60 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  File descriptor 
37a70 72 65 74 75 72 6e 65 64 20 62 79 20 6f 70 65 6e  returned by open
37a80 28 29 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 65 6e  () */.  int open
37a90 46 6c 61 67 73 20 3d 20 30 3b 20 20 20 20 20 20  Flags = 0;      
37aa0 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20         /* Flags 
37ab0 74 6f 20 70 61 73 73 20 74 6f 20 6f 70 65 6e 28  to pass to open(
37ac0 29 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  ) */.#if SQLITE_
37ad0 45 4e 41 42 4c 45 5f 44 41 54 41 5f 50 52 4f 54  ENABLE_DATA_PROT
37ae0 45 43 54 49 4f 4e 0a 20 20 69 6e 74 20 65 54 79  ECTION.  int eTy
37af0 70 65 20 3d 20 66 6c 61 67 73 26 30 78 46 46 30  pe = flags&0xFF0
37b00 46 46 46 30 30 3b 20 20 2f 2a 20 54 79 70 65 20  FFF00;  /* Type 
37b10 6f 66 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20  of file to open 
37b20 2a 2f 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 65  */.#else.  int e
37b30 54 79 70 65 20 3d 20 66 6c 61 67 73 26 30 78 46  Type = flags&0xF
37b40 46 46 46 46 46 30 30 3b 20 20 2f 2a 20 54 79 70  FFFFF00;  /* Typ
37b50 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 6f 70 65  e of file to ope
37b60 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 69 6e  n */.#endif.  in
37b70 74 20 6e 6f 4c 6f 63 6b 3b 20 20 20 20 20 20 20  t noLock;       
37b80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
37b90 54 72 75 65 20 74 6f 20 6f 6d 69 74 20 6c 6f 63  True to omit loc
37ba0 6b 69 6e 67 20 70 72 69 6d 69 74 69 76 65 73 20  king primitives 
37bb0 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
37bc0 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
37bd0 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20      /* Function 
37be0 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20  Return Code */. 
37bf0 20 69 6e 74 20 63 74 72 6c 46 6c 61 67 73 20 3d   int ctrlFlags =
37c00 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
37c10 2f 2a 20 55 4e 49 58 46 49 4c 45 5f 2a 20 66 6c  /* UNIXFILE_* fl
37c20 61 67 73 20 2a 2f 0a 0a 20 20 69 6e 74 20 69 73  ags */..  int is
37c30 45 78 63 6c 75 73 69 76 65 20 20 3d 20 28 66 6c  Exclusive  = (fl
37c40 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
37c50 4e 5f 45 58 43 4c 55 53 49 56 45 29 3b 0a 20 20  N_EXCLUSIVE);.  
37c60 69 6e 74 20 69 73 44 65 6c 65 74 65 20 20 20 20  int isDelete    
37c70 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49   = (flags & SQLI
37c80 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e  TE_OPEN_DELETEON
37c90 43 4c 4f 53 45 29 3b 0a 20 20 69 6e 74 20 69 73  CLOSE);.  int is
37ca0 43 72 65 61 74 65 20 20 20 20 20 3d 20 28 66 6c  Create     = (fl
37cb0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
37cc0 4e 5f 43 52 45 41 54 45 29 3b 0a 20 20 69 6e 74  N_CREATE);.  int
37cd0 20 69 73 52 65 61 64 6f 6e 6c 79 20 20 20 3d 20   isReadonly   = 
37ce0 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
37cf0 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a  OPEN_READONLY);.
37d00 20 20 69 6e 74 20 69 73 52 65 61 64 57 72 69 74    int isReadWrit
37d10 65 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51  e  = (flags & SQ
37d20 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
37d30 49 54 45 29 3b 0a 23 69 66 20 53 51 4c 49 54 45  ITE);.#if SQLITE
37d40 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
37d50 53 54 59 4c 45 0a 20 20 69 6e 74 20 69 73 41 75  STYLE.  int isAu
37d60 74 6f 50 72 6f 78 79 20 20 3d 20 28 66 6c 61 67  toProxy  = (flag
37d70 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
37d80 41 55 54 4f 50 52 4f 58 59 29 3b 0a 23 65 6e 64  AUTOPROXY);.#end
37d90 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  if.#if defined(_
37da0 5f 41 50 50 4c 45 5f 5f 29 20 7c 7c 20 53 51 4c  _APPLE__) || SQL
37db0 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
37dc0 4e 47 5f 53 54 59 4c 45 0a 20 20 73 74 72 75 63  NG_STYLE.  struc
37dd0 74 20 73 74 61 74 66 73 20 66 73 49 6e 66 6f 3b  t statfs fsInfo;
37de0 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66  .#endif..  /* If
37df0 20 63 72 65 61 74 69 6e 67 20 61 20 6d 61 73 74   creating a mast
37e00 65 72 20 6f 72 20 6d 61 69 6e 2d 66 69 6c 65 20  er or main-file 
37e10 6a 6f 75 72 6e 61 6c 2c 20 74 68 69 73 20 66 75  journal, this fu
37e20 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 6f 70 65 6e  nction will open
37e30 0a 20 20 2a 2a 20 61 20 66 69 6c 65 2d 64 65 73  .  ** a file-des
37e40 63 72 69 70 74 6f 72 20 6f 6e 20 74 68 65 20 64  criptor on the d
37e50 69 72 65 63 74 6f 72 79 20 74 6f 6f 2e 20 54 68  irectory too. Th
37e60 65 20 66 69 72 73 74 20 74 69 6d 65 20 75 6e 69  e first time uni
37e70 78 53 79 6e 63 28 29 0a 20 20 2a 2a 20 69 73 20  xSync().  ** is 
37e80 63 61 6c 6c 65 64 20 74 68 65 20 64 69 72 65 63  called the direc
37e90 74 6f 72 79 20 66 69 6c 65 20 64 65 73 63 72 69  tory file descri
37ea0 70 74 6f 72 20 77 69 6c 6c 20 62 65 20 66 73 79  ptor will be fsy
37eb0 6e 63 28 29 65 64 20 61 6e 64 20 63 6c 6f 73 65  nc()ed and close
37ec0 28 29 64 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20  ()d..  */.  int 
37ed0 73 79 6e 63 44 69 72 20 3d 20 28 69 73 43 72 65  syncDir = (isCre
37ee0 61 74 65 20 26 26 20 28 0a 20 20 20 20 20 20 20  ate && (.       
37ef0 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
37f00 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e  PEN_MASTER_JOURN
37f10 41 4c 20 0a 20 20 20 20 20 7c 7c 20 65 54 79 70  AL .     || eTyp
37f20 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e==SQLITE_OPEN_M
37f30 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20  AIN_JOURNAL .   
37f40 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49    || eType==SQLI
37f50 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20 29 29  TE_OPEN_WAL.  ))
37f60 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 72 67 75 6d  ;..  /* If argum
37f70 65 6e 74 20 7a 50 61 74 68 20 69 73 20 61 20 4e  ent zPath is a N
37f80 55 4c 4c 20 70 6f 69 6e 74 65 72 2c 20 74 68 69  ULL pointer, thi
37f90 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65  s function is re
37fa0 71 75 69 72 65 64 20 74 6f 20 6f 70 65 6e 0a 20  quired to open. 
37fb0 20 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72 79 20   ** a temporary 
37fc0 66 69 6c 65 2e 20 55 73 65 20 74 68 69 73 20 62  file. Use this b
37fd0 75 66 66 65 72 20 74 6f 20 73 74 6f 72 65 20 74  uffer to store t
37fe0 68 65 20 66 69 6c 65 20 6e 61 6d 65 20 69 6e 2e  he file name in.
37ff0 0a 20 20 2a 2f 0a 20 20 63 68 61 72 20 7a 54 6d  .  */.  char zTm
38000 70 6e 61 6d 65 5b 4d 41 58 5f 50 41 54 48 4e 41  pname[MAX_PATHNA
38010 4d 45 2b 32 5d 3b 0a 20 20 63 6f 6e 73 74 20 63  ME+2];.  const c
38020 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 7a 50 61  har *zName = zPa
38030 74 68 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20  th;..  /* Check 
38040 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
38050 61 74 65 6d 65 6e 74 73 20 61 72 65 20 74 72 75  atements are tru
38060 65 3a 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  e: .  **.  **   
38070 28 61 29 20 45 78 61 63 74 6c 79 20 6f 6e 65 20  (a) Exactly one 
38080 6f 66 20 74 68 65 20 52 45 41 44 57 52 49 54 45  of the READWRITE
38090 20 61 6e 64 20 52 45 41 44 4f 4e 4c 59 20 66 6c   and READONLY fl
380a0 61 67 73 20 6d 75 73 74 20 62 65 20 73 65 74 2c  ags must be set,
380b0 20 61 6e 64 20 0a 20 20 2a 2a 20 20 20 28 62 29   and .  **   (b)
380c0 20 69 66 20 43 52 45 41 54 45 20 69 73 20 73 65   if CREATE is se
380d0 74 2c 20 74 68 65 6e 20 52 45 41 44 57 52 49 54  t, then READWRIT
380e0 45 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 73  E must also be s
380f0 65 74 2c 20 61 6e 64 0a 20 20 2a 2a 20 20 20 28  et, and.  **   (
38100 63 29 20 69 66 20 45 58 43 4c 55 53 49 56 45 20  c) if EXCLUSIVE 
38110 69 73 20 73 65 74 2c 20 74 68 65 6e 20 43 52 45  is set, then CRE
38120 41 54 45 20 6d 75 73 74 20 61 6c 73 6f 20 62 65  ATE must also be
38130 20 73 65 74 2e 0a 20 20 2a 2a 20 20 20 28 64 29   set..  **   (d)
38140 20 69 66 20 44 45 4c 45 54 45 4f 4e 43 4c 4f 53   if DELETEONCLOS
38150 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 43  E is set, then C
38160 52 45 41 54 45 20 6d 75 73 74 20 61 6c 73 6f 20  REATE must also 
38170 62 65 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 61  be set..  */.  a
38180 73 73 65 72 74 28 28 69 73 52 65 61 64 6f 6e 6c  ssert((isReadonl
38190 79 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64 57 72  y==0 || isReadWr
381a0 69 74 65 3d 3d 30 29 20 26 26 20 28 69 73 52 65  ite==0) && (isRe
381b0 61 64 57 72 69 74 65 20 7c 7c 20 69 73 52 65 61  adWrite || isRea
381c0 64 6f 6e 6c 79 29 29 3b 0a 20 20 61 73 73 65 72  donly));.  asser
381d0 74 28 69 73 43 72 65 61 74 65 3d 3d 30 20 7c 7c  t(isCreate==0 ||
381e0 20 69 73 52 65 61 64 57 72 69 74 65 29 3b 0a 20   isReadWrite);. 
381f0 20 61 73 73 65 72 74 28 69 73 45 78 63 6c 75 73   assert(isExclus
38200 69 76 65 3d 3d 30 20 7c 7c 20 69 73 43 72 65 61  ive==0 || isCrea
38210 74 65 29 3b 0a 20 20 61 73 73 65 72 74 28 69 73  te);.  assert(is
38220 44 65 6c 65 74 65 3d 3d 30 20 7c 7c 20 69 73 43  Delete==0 || isC
38230 72 65 61 74 65 29 3b 0a 0a 20 20 2f 2a 20 54 68  reate);..  /* Th
38240 65 20 6d 61 69 6e 20 44 42 2c 20 6d 61 69 6e 20  e main DB, main 
38250 6a 6f 75 72 6e 61 6c 2c 20 57 41 4c 20 66 69 6c  journal, WAL fil
38260 65 20 61 6e 64 20 6d 61 73 74 65 72 20 6a 6f 75  e and master jou
38270 72 6e 61 6c 20 61 72 65 20 6e 65 76 65 72 20 0a  rnal are never .
38280 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c    ** automatical
38290 6c 79 20 64 65 6c 65 74 65 64 2e 20 4e 6f 72 20  ly deleted. Nor 
382a0 61 72 65 20 74 68 65 79 20 65 76 65 72 20 74 65  are they ever te
382b0 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 20 20  mporary files.  
382c0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 21 69  */.  assert( (!i
382d0 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65  sDelete && zName
382e0 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49  ) || eType!=SQLI
382f0 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20  TE_OPEN_MAIN_DB 
38300 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 21 69  );.  assert( (!i
38310 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65  sDelete && zName
38320 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c 49  ) || eType!=SQLI
38330 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
38340 52 4e 41 4c 20 29 3b 0a 20 20 61 73 73 65 72 74  RNAL );.  assert
38350 28 20 28 21 69 73 44 65 6c 65 74 65 20 26 26 20  ( (!isDelete && 
38360 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65 21  zName) || eType!
38370 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53  =SQLITE_OPEN_MAS
38380 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20  TER_JOURNAL );. 
38390 20 61 73 73 65 72 74 28 20 28 21 69 73 44 65 6c   assert( (!isDel
383a0 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c  ete && zName) ||
383b0 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f   eType!=SQLITE_O
383c0 50 45 4e 5f 57 41 4c 20 29 3b 0a 0a 20 20 2f 2a  PEN_WAL );..  /*
383d0 20 41 73 73 65 72 74 20 74 68 61 74 20 74 68 65   Assert that the
383e0 20 75 70 70 65 72 20 6c 61 79 65 72 20 68 61 73   upper layer has
383f0 20 73 65 74 20 6f 6e 65 20 6f 66 20 74 68 65 20   set one of the 
38400 22 66 69 6c 65 2d 74 79 70 65 22 20 66 6c 61 67  "file-type" flag
38410 73 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  s. */.  assert( 
38420 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
38430 45 4e 5f 4d 41 49 4e 5f 44 42 20 20 20 20 20 20  EN_MAIN_DB      
38440 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
38450 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 20 0a 20  _OPEN_TEMP_DB . 
38460 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d        || eType==
38470 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
38480 5f 4a 4f 55 52 4e 41 4c 20 7c 7c 20 65 54 79 70  _JOURNAL || eTyp
38490 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54  e==SQLITE_OPEN_T
384a0 45 4d 50 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20  EMP_JOURNAL .   
384b0 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51      || eType==SQ
384c0 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55  LITE_OPEN_SUBJOU
384d0 52 4e 41 4c 20 20 20 7c 7c 20 65 54 79 70 65 3d  RNAL   || eType=
384e0 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53  =SQLITE_OPEN_MAS
384f0 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20 20  TER_JOURNAL .   
38500 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51      || eType==SQ
38510 4c 49 54 45 5f 4f 50 45 4e 5f 54 52 41 4e 53 49  LITE_OPEN_TRANSI
38520 45 4e 54 5f 44 42 20 7c 7c 20 65 54 79 70 65 3d  ENT_DB || eType=
38530 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c  =SQLITE_OPEN_WAL
38540 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 44 65 74 65  .  );..  /* Dete
38550 63 74 20 61 20 70 69 64 20 63 68 61 6e 67 65 20  ct