/ Hex Artifact Content
Login

Artifact fcbdfbbadd280d80a23695b9311f373e01203cbcf25a1317d7e2f1ba2cdc5be5:


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 20 55 73 65 20 70 72 65 61 64 28  f../* Use pread(
0b40: 29 20 61 6e 64 20 70 77 72 69 74 65 28 29 20 69  ) and pwrite() i
0b50: 66 20 74 68 65 79 20 61 72 65 20 61 76 61 69 6c  f they are avail
0b60: 61 62 6c 65 20 2a 2f 0a 23 69 66 20 64 65 66 69  able */.#if defi
0b70: 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 23  ned(__APPLE__).#
0b80: 20 64 65 66 69 6e 65 20 48 41 56 45 5f 50 52 45   define HAVE_PRE
0b90: 41 44 20 31 0a 23 20 64 65 66 69 6e 65 20 48 41  AD 1.# define HA
0ba0: 56 45 5f 50 57 52 49 54 45 20 31 0a 23 65 6e 64  VE_PWRITE 1.#end
0bb0: 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 48  if.#if defined(H
0bc0: 41 56 45 5f 50 52 45 41 44 36 34 29 20 26 26 20  AVE_PREAD64) && 
0bd0: 64 65 66 69 6e 65 64 28 48 41 56 45 5f 50 57 52  defined(HAVE_PWR
0be0: 49 54 45 36 34 29 0a 23 20 75 6e 64 65 66 20 55  ITE64).# undef U
0bf0: 53 45 5f 50 52 45 41 44 0a 23 20 64 65 66 69 6e  SE_PREAD.# defin
0c00: 65 20 55 53 45 5f 50 52 45 41 44 36 34 20 31 0a  e USE_PREAD64 1.
0c10: 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 48 41  #elif defined(HA
0c20: 56 45 5f 50 52 45 41 44 29 20 26 26 20 64 65 66  VE_PREAD) && def
0c30: 69 6e 65 64 28 48 41 56 45 5f 50 57 52 49 54 45  ined(HAVE_PWRITE
0c40: 29 0a 23 20 75 6e 64 65 66 20 55 53 45 5f 50 52  ).# undef USE_PR
0c50: 45 41 44 36 34 0a 23 20 64 65 66 69 6e 65 20 55  EAD64.# define U
0c60: 53 45 5f 50 52 45 41 44 20 31 0a 23 65 6e 64 69  SE_PREAD 1.#endi
0c70: 66 0a 0a 2f 2a 0a 2a 2a 20 73 74 61 6e 64 61 72  f../*.** standar
0c80: 64 20 69 6e 63 6c 75 64 65 20 66 69 6c 65 73 2e  d include files.
0c90: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79  .*/.#include <sy
0ca0: 73 2f 74 79 70 65 73 2e 68 3e 0a 23 69 6e 63 6c  s/types.h>.#incl
0cb0: 75 64 65 20 3c 73 79 73 2f 73 74 61 74 2e 68 3e  ude <sys/stat.h>
0cc0: 0a 23 69 6e 63 6c 75 64 65 20 3c 66 63 6e 74 6c  .#include <fcntl
0cd0: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79  .h>.#include <sy
0ce0: 73 2f 69 6f 63 74 6c 2e 68 3e 0a 23 69 6e 63 6c  s/ioctl.h>.#incl
0cf0: 75 64 65 20 3c 75 6e 69 73 74 64 2e 68 3e 0a 23  ude <unistd.h>.#
0d00: 69 6e 63 6c 75 64 65 20 3c 74 69 6d 65 2e 68 3e  include <time.h>
0d10: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 74  .#include <sys/t
0d20: 69 6d 65 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  ime.h>.#include 
0d30: 3c 65 72 72 6e 6f 2e 68 3e 0a 23 69 66 20 21 64  <errno.h>.#if !d
0d40: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
0d50: 49 54 5f 57 41 4c 29 20 7c 7c 20 53 51 4c 49 54  IT_WAL) || SQLIT
0d60: 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
0d70: 30 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73 79 73  0.# include <sys
0d80: 2f 6d 6d 61 6e 2e 68 3e 0a 23 65 6e 64 69 66 0a  /mman.h>.#endif.
0d90: 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
0da0: 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
0db0: 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f  .# include <sys/
0dc0: 69 6f 63 74 6c 2e 68 3e 0a 23 20 69 6e 63 6c 75  ioctl.h>.# inclu
0dd0: 64 65 20 3c 75 75 69 64 2f 75 75 69 64 2e 68 3e  de <uuid/uuid.h>
0de0: 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f  .# include <sys/
0df0: 66 69 6c 65 2e 68 3e 0a 23 20 69 6e 63 6c 75 64  file.h>.# includ
0e00: 65 20 3c 73 79 73 2f 70 61 72 61 6d 2e 68 3e 0a  e <sys/param.h>.
0e10: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
0e20: 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
0e30: 53 54 59 4c 45 20 2a 2f 0a 0a 23 69 66 20 64 65  STYLE */..#if de
0e40: 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
0e50: 20 26 26 20 28 28 5f 5f 4d 41 43 5f 4f 53 5f 58   && ((__MAC_OS_X
0e60: 5f 56 45 52 53 49 4f 4e 5f 4d 49 4e 5f 52 45 51  _VERSION_MIN_REQ
0e70: 55 49 52 45 44 20 3e 20 31 30 35 30 29 20 7c 7c  UIRED > 1050) ||
0e80: 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   \.             
0e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 5f                (_
0ea0: 5f 49 50 48 4f 4e 45 5f 4f 53 5f 56 45 52 53 49  _IPHONE_OS_VERSI
0eb0: 4f 4e 5f 4d 49 4e 5f 52 45 51 55 49 52 45 44 20  ON_MIN_REQUIRED 
0ec0: 3e 20 32 30 30 30 29 29 0a 23 20 20 69 66 20 28  > 2000)).#  if (
0ed0: 21 64 65 66 69 6e 65 64 28 54 41 52 47 45 54 5f  !defined(TARGET_
0ee0: 4f 53 5f 45 4d 42 45 44 44 45 44 29 20 7c 7c 20  OS_EMBEDDED) || 
0ef0: 28 54 41 52 47 45 54 5f 4f 53 5f 45 4d 42 45 44  (TARGET_OS_EMBED
0f00: 44 45 44 3d 3d 30 29 29 20 5c 0a 20 20 20 20 20  DED==0)) \.     
0f10: 20 20 26 26 20 28 21 64 65 66 69 6e 65 64 28 54    && (!defined(T
0f20: 41 52 47 45 54 5f 49 50 48 4f 4e 45 5f 53 49 4d  ARGET_IPHONE_SIM
0f30: 55 4c 41 54 4f 52 29 20 7c 7c 20 28 54 41 52 47  ULATOR) || (TARG
0f40: 45 54 5f 49 50 48 4f 4e 45 5f 53 49 4d 55 4c 41  ET_IPHONE_SIMULA
0f50: 54 4f 52 3d 3d 30 29 29 0a 23 20 20 20 20 64 65  TOR==0)).#    de
0f60: 66 69 6e 65 20 48 41 56 45 5f 47 45 54 48 4f 53  fine HAVE_GETHOS
0f70: 54 55 55 49 44 20 31 0a 23 20 20 65 6c 73 65 0a  TUUID 1.#  else.
0f80: 23 20 20 20 20 77 61 72 6e 69 6e 67 20 22 67 65  #    warning "ge
0f90: 74 68 6f 73 74 75 75 69 64 28 29 20 69 73 20 64  thostuuid() is d
0fa0: 69 73 61 62 6c 65 64 2e 22 0a 23 20 20 65 6e 64  isabled.".#  end
0fb0: 69 66 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66 20  if.#endif...#if 
0fc0: 4f 53 5f 56 58 57 4f 52 4b 53 0a 23 20 69 6e 63  OS_VXWORKS.# inc
0fd0: 6c 75 64 65 20 3c 73 79 73 2f 69 6f 63 74 6c 2e  lude <sys/ioctl.
0fe0: 68 3e 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73 65  h>.# include <se
0ff0: 6d 61 70 68 6f 72 65 2e 68 3e 0a 23 20 69 6e 63  maphore.h>.# inc
1000: 6c 75 64 65 20 3c 6c 69 6d 69 74 73 2e 68 3e 0a  lude <limits.h>.
1010: 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57  #endif /* OS_VXW
1020: 4f 52 4b 53 20 2a 2f 0a 0a 23 69 66 20 64 65 66  ORKS */..#if def
1030: 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
1040: 7c 7c 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  || SQLITE_ENABLE
1050: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 23  _LOCKING_STYLE.#
1060: 20 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 6d 6f   include <sys/mo
1070: 75 6e 74 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a 23  unt.h>.#endif..#
1080: 69 66 64 65 66 20 48 41 56 45 5f 55 54 49 4d 45  ifdef HAVE_UTIME
1090: 0a 23 20 69 6e 63 6c 75 64 65 20 3c 75 74 69 6d  .# include <utim
10a0: 65 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  e.h>.#endif../*.
10b0: 2a 2a 20 41 6c 6c 6f 77 65 64 20 76 61 6c 75 65  ** Allowed value
10c0: 73 20 6f 66 20 75 6e 69 78 46 69 6c 65 2e 66 73  s of unixFile.fs
10d0: 46 6c 61 67 73 0a 2a 2f 0a 23 64 65 66 69 6e 65  Flags.*/.#define
10e0: 20 53 51 4c 49 54 45 5f 46 53 46 4c 41 47 53 5f   SQLITE_FSFLAGS_
10f0: 49 53 5f 4d 53 44 4f 53 20 20 20 20 20 30 78 31  IS_MSDOS     0x1
1100: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 77 65 20 61 72  ../*.** If we ar
1110: 65 20 74 6f 20 62 65 20 74 68 72 65 61 64 2d 73  e to be thread-s
1120: 61 66 65 2c 20 69 6e 63 6c 75 64 65 20 74 68 65  afe, include the
1130: 20 70 74 68 72 65 61 64 73 20 68 65 61 64 65 72   pthreads header
1140: 20 61 6e 64 20 64 65 66 69 6e 65 0a 2a 2a 20 74   and define.** t
1150: 68 65 20 53 51 4c 49 54 45 5f 55 4e 49 58 5f 54  he SQLITE_UNIX_T
1160: 48 52 45 41 44 53 20 6d 61 63 72 6f 2e 0a 2a 2f  HREADS macro..*/
1170: 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45  .#if SQLITE_THRE
1180: 41 44 53 41 46 45 0a 23 20 69 6e 63 6c 75 64 65  ADSAFE.# include
1190: 20 3c 70 74 68 72 65 61 64 2e 68 3e 0a 23 20 64   <pthread.h>.# d
11a0: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 55 4e 49  efine SQLITE_UNI
11b0: 58 5f 54 48 52 45 41 44 53 20 31 0a 23 65 6e 64  X_THREADS 1.#end
11c0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 61 75 6c  if../*.** Defaul
11d0: 74 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 77 68  t permissions wh
11e0: 65 6e 20 63 72 65 61 74 69 6e 67 20 61 20 6e 65  en creating a ne
11f0: 77 20 66 69 6c 65 0a 2a 2f 0a 23 69 66 6e 64 65  w file.*/.#ifnde
1200: 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  f SQLITE_DEFAULT
1210: 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e  _FILE_PERMISSION
1220: 53 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54  S.# define SQLIT
1230: 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50  E_DEFAULT_FILE_P
1240: 45 52 4d 49 53 53 49 4f 4e 53 20 30 36 34 34 0a  ERMISSIONS 0644.
1250: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 65  #endif../*.** De
1260: 66 61 75 6c 74 20 70 65 72 6d 69 73 73 69 6f 6e  fault permission
1270: 73 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67 20  s when creating 
1280: 61 75 74 6f 20 70 72 6f 78 79 20 64 69 72 0a 2a  auto proxy dir.*
1290: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
12a0: 5f 44 45 46 41 55 4c 54 5f 50 52 4f 58 59 44 49  _DEFAULT_PROXYDI
12b0: 52 5f 50 45 52 4d 49 53 53 49 4f 4e 53 0a 23 20  R_PERMISSIONS.# 
12c0: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 44 45  define SQLITE_DE
12d0: 46 41 55 4c 54 5f 50 52 4f 58 59 44 49 52 5f 50  FAULT_PROXYDIR_P
12e0: 45 52 4d 49 53 53 49 4f 4e 53 20 30 37 35 35 0a  ERMISSIONS 0755.
12f0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61  #endif../*.** Ma
1300: 78 69 6d 75 6d 20 73 75 70 70 6f 72 74 65 64 20  ximum supported 
1310: 70 61 74 68 2d 6c 65 6e 67 74 68 2e 0a 2a 2f 0a  path-length..*/.
1320: 23 64 65 66 69 6e 65 20 4d 41 58 5f 50 41 54 48  #define MAX_PATH
1330: 4e 41 4d 45 20 35 31 32 0a 0a 2f 2a 0a 2a 2a 20  NAME 512../*.** 
1340: 4d 61 78 69 6d 75 6d 20 73 75 70 70 6f 72 74 65  Maximum supporte
1350: 64 20 73 79 6d 62 6f 6c 69 63 20 6c 69 6e 6b 73  d symbolic links
1360: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 51 4c 49  .*/.#define SQLI
1370: 54 45 5f 4d 41 58 5f 53 59 4d 4c 49 4e 4b 53 20  TE_MAX_SYMLINKS 
1380: 31 30 30 0a 0a 2f 2a 20 41 6c 77 61 79 73 20 63  100../* Always c
1390: 61 73 74 20 74 68 65 20 67 65 74 70 69 64 28 29  ast the getpid()
13a0: 20 72 65 74 75 72 6e 20 74 79 70 65 20 66 6f 72   return type for
13b0: 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 77   compatibility w
13c0: 69 74 68 0a 2a 2a 20 6b 65 72 6e 65 6c 20 6d 6f  ith.** kernel mo
13d0: 64 75 6c 65 73 20 69 6e 20 56 78 57 6f 72 6b 73  dules in VxWorks
13e0: 2e 20 2a 2f 0a 23 64 65 66 69 6e 65 20 6f 73 47  . */.#define osG
13f0: 65 74 70 69 64 28 58 29 20 28 70 69 64 5f 74 29  etpid(X) (pid_t)
1400: 67 65 74 70 69 64 28 29 0a 0a 2f 2a 0a 2a 2a 20  getpid()../*.** 
1410: 4f 6e 6c 79 20 73 65 74 20 74 68 65 20 6c 61 73  Only set the las
1420: 74 45 72 72 6e 6f 20 69 66 20 74 68 65 20 65 72  tErrno if the er
1430: 72 6f 72 20 63 6f 64 65 20 69 73 20 61 20 72 65  ror code is a re
1440: 61 6c 20 65 72 72 6f 72 20 61 6e 64 20 6e 6f 74  al error and not
1450: 20 0a 2a 2a 20 61 20 6e 6f 72 6d 61 6c 20 65 78   .** a normal ex
1460: 70 65 63 74 65 64 20 72 65 74 75 72 6e 20 63 6f  pected return co
1470: 64 65 20 6f 66 20 53 51 4c 49 54 45 5f 42 55 53  de of SQLITE_BUS
1480: 59 20 6f 72 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a  Y or SQLITE_OK.*
1490: 2f 0a 23 64 65 66 69 6e 65 20 49 53 5f 4c 4f 43  /.#define IS_LOC
14a0: 4b 5f 45 52 52 4f 52 28 78 29 20 20 28 28 78 20  K_ERROR(x)  ((x 
14b0: 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 29 20 26 26  != SQLITE_OK) &&
14c0: 20 28 78 20 21 3d 20 53 51 4c 49 54 45 5f 42 55   (x != SQLITE_BU
14d0: 53 59 29 29 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  SY))../* Forward
14e0: 20 72 65 66 65 72 65 6e 63 65 73 20 2a 2f 0a 74   references */.t
14f0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 75 6e  ypedef struct un
1500: 69 78 53 68 6d 20 75 6e 69 78 53 68 6d 3b 20 20  ixShm unixShm;  
1510: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1520: 43 6f 6e 6e 65 63 74 69 6f 6e 20 73 68 61 72 65  Connection share
1530: 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 74 79 70 65  d memory */.type
1540: 64 65 66 20 73 74 72 75 63 74 20 75 6e 69 78 53  def struct unixS
1550: 68 6d 4e 6f 64 65 20 75 6e 69 78 53 68 6d 4e 6f  hmNode unixShmNo
1560: 64 65 3b 20 20 20 20 20 20 20 2f 2a 20 53 68 61  de;       /* Sha
1570: 72 65 64 20 6d 65 6d 6f 72 79 20 69 6e 73 74 61  red memory insta
1580: 6e 63 65 20 2a 2f 0a 74 79 70 65 64 65 66 20 73  nce */.typedef s
1590: 74 72 75 63 74 20 75 6e 69 78 49 6e 6f 64 65 49  truct unixInodeI
15a0: 6e 66 6f 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  nfo unixInodeInf
15b0: 6f 3b 20 20 20 2f 2a 20 41 6e 20 69 2d 6e 6f 64  o;   /* An i-nod
15c0: 65 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  e */.typedef str
15d0: 75 63 74 20 55 6e 69 78 55 6e 75 73 65 64 46 64  uct UnixUnusedFd
15e0: 20 55 6e 69 78 55 6e 75 73 65 64 46 64 3b 20 20   UnixUnusedFd;  
15f0: 20 20 20 2f 2a 20 41 6e 20 75 6e 75 73 65 64 20     /* An unused 
1600: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
1610: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 74 69  */../*.** Someti
1620: 6d 65 73 2c 20 61 66 74 65 72 20 61 20 66 69 6c  mes, after a fil
1630: 65 20 68 61 6e 64 6c 65 20 69 73 20 63 6c 6f 73  e handle is clos
1640: 65 64 20 62 79 20 53 51 4c 69 74 65 2c 20 74 68  ed by SQLite, th
1650: 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
1660: 72 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 63  r.** cannot be c
1670: 6c 6f 73 65 64 20 69 6d 6d 65 64 69 61 74 65 6c  losed immediatel
1680: 79 2e 20 49 6e 20 74 68 65 73 65 20 63 61 73 65  y. In these case
1690: 73 2c 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20  s, instances of 
16a0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a  the following.**
16b0: 20 73 74 72 75 63 74 75 72 65 20 61 72 65 20 75   structure are u
16c0: 73 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65  sed to store the
16d0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
16e0: 20 77 68 69 6c 65 20 77 61 69 74 69 6e 67 20 66   while waiting f
16f0: 6f 72 20 61 6e 0a 2a 2a 20 6f 70 70 6f 72 74 75  or an.** opportu
1700: 6e 69 74 79 20 74 6f 20 65 69 74 68 65 72 20 63  nity to either c
1710: 6c 6f 73 65 20 6f 72 20 72 65 75 73 65 20 69 74  lose or reuse it
1720: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 55 6e 69 78  ..*/.struct Unix
1730: 55 6e 75 73 65 64 46 64 20 7b 0a 20 20 69 6e 74  UnusedFd {.  int
1740: 20 66 64 3b 20 20 20 20 20 20 20 20 20 20 20 20   fd;            
1750: 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64         /* File d
1760: 65 73 63 72 69 70 74 6f 72 20 74 6f 20 63 6c 6f  escriptor to clo
1770: 73 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  se */.  int flag
1780: 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
1790: 20 20 2f 2a 20 46 6c 61 67 73 20 74 68 69 73 20    /* Flags this 
17a0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
17b0: 77 61 73 20 6f 70 65 6e 65 64 20 77 69 74 68 20  was opened with 
17c0: 2a 2f 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46  */.  UnixUnusedF
17d0: 64 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 2f  d *pNext;      /
17e0: 2a 20 4e 65 78 74 20 75 6e 75 73 65 64 20 66 69  * Next unused fi
17f0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6f 6e  le descriptor on
1800: 20 73 61 6d 65 20 66 69 6c 65 20 2a 2f 0a 7d 3b   same file */.};
1810: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 75 6e 69 78  ../*.** The unix
1820: 46 69 6c 65 20 73 74 72 75 63 74 75 72 65 20 69  File structure i
1830: 73 20 73 75 62 63 6c 61 73 73 20 6f 66 20 73 71  s subclass of sq
1840: 6c 69 74 65 33 5f 66 69 6c 65 20 73 70 65 63 69  lite3_file speci
1850: 66 69 63 20 74 6f 20 74 68 65 20 75 6e 69 78 0a  fic to the unix.
1860: 2a 2a 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74  ** VFS implement
1870: 61 74 69 6f 6e 73 2e 0a 2a 2f 0a 74 79 70 65 64  ations..*/.typed
1880: 65 66 20 73 74 72 75 63 74 20 75 6e 69 78 46 69  ef struct unixFi
1890: 6c 65 20 75 6e 69 78 46 69 6c 65 3b 0a 73 74 72  le unixFile;.str
18a0: 75 63 74 20 75 6e 69 78 46 69 6c 65 20 7b 0a 20  uct unixFile {. 
18b0: 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
18c0: 6f 64 73 20 63 6f 6e 73 74 20 2a 70 4d 65 74 68  ods const *pMeth
18d0: 6f 64 3b 20 20 2f 2a 20 41 6c 77 61 79 73 20 74  od;  /* Always t
18e0: 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 2a  he first entry *
18f0: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  /.  sqlite3_vfs 
1900: 2a 70 56 66 73 3b 20 20 20 20 20 20 20 20 20 20  *pVfs;          
1910: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56          /* The V
1920: 46 53 20 74 68 61 74 20 63 72 65 61 74 65 64 20  FS that created 
1930: 74 68 69 73 20 75 6e 69 78 46 69 6c 65 20 2a 2f  this unixFile */
1940: 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  .  unixInodeInfo
1950: 20 2a 70 49 6e 6f 64 65 3b 20 20 20 20 20 20 20   *pInode;       
1960: 20 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 20 61         /* Info a
1970: 62 6f 75 74 20 6c 6f 63 6b 73 20 6f 6e 20 74 68  bout locks on th
1980: 69 73 20 69 6e 6f 64 65 20 2a 2f 0a 20 20 69 6e  is inode */.  in
1990: 74 20 68 3b 20 20 20 20 20 20 20 20 20 20 20 20  t h;            
19a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19b0: 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64 65    /* The file de
19c0: 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 75 6e  scriptor */.  un
19d0: 73 69 67 6e 65 64 20 63 68 61 72 20 65 46 69 6c  signed char eFil
19e0: 65 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20  eLock;          
19f0: 20 20 2f 2a 20 54 68 65 20 74 79 70 65 20 6f 66    /* The type of
1a00: 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68   lock held on th
1a10: 69 73 20 66 64 20 2a 2f 0a 20 20 75 6e 73 69 67  is fd */.  unsig
1a20: 6e 65 64 20 73 68 6f 72 74 20 69 6e 74 20 63 74  ned short int ct
1a30: 72 6c 46 6c 61 67 73 3b 20 20 20 20 20 20 20 2f  rlFlags;       /
1a40: 2a 20 42 65 68 61 76 69 6f 72 61 6c 20 62 69 74  * Behavioral bit
1a50: 73 2e 20 20 55 4e 49 58 46 49 4c 45 5f 2a 20 66  s.  UNIXFILE_* f
1a60: 6c 61 67 73 20 2a 2f 0a 20 20 69 6e 74 20 6c 61  lags */.  int la
1a70: 73 74 45 72 72 6e 6f 3b 20 20 20 20 20 20 20 20  stErrno;        
1a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a90: 20 54 68 65 20 75 6e 69 78 20 65 72 72 6e 6f 20   The unix errno 
1aa0: 66 72 6f 6d 20 6c 61 73 74 20 49 2f 4f 20 65 72  from last I/O er
1ab0: 72 6f 72 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 6c  ror */.  void *l
1ac0: 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 20 20  ockingContext;  
1ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ae0: 4c 6f 63 6b 69 6e 67 20 73 74 79 6c 65 20 73 70  Locking style sp
1af0: 65 63 69 66 69 63 20 73 74 61 74 65 20 2a 2f 0a  ecific state */.
1b00: 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a    UnixUnusedFd *
1b10: 70 50 72 65 61 6c 6c 6f 63 61 74 65 64 55 6e 75  pPreallocatedUnu
1b20: 73 65 64 3b 20 20 2f 2a 20 50 72 65 2d 61 6c 6c  sed;  /* Pre-all
1b30: 6f 63 61 74 65 64 20 55 6e 69 78 55 6e 75 73 65  ocated UnixUnuse
1b40: 64 46 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  dFd */.  const c
1b50: 68 61 72 20 2a 7a 50 61 74 68 3b 20 20 20 20 20  har *zPath;     
1b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b70: 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65  Name of the file
1b80: 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70   */.  unixShm *p
1b90: 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  Shm;            
1ba0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61            /* Sha
1bb0: 72 65 64 20 6d 65 6d 6f 72 79 20 73 65 67 6d 65  red memory segme
1bc0: 6e 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a  nt information *
1bd0: 2f 0a 20 20 69 6e 74 20 73 7a 43 68 75 6e 6b 3b  /.  int szChunk;
1be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bf0: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66 69          /* Confi
1c00: 67 75 72 65 64 20 62 79 20 46 43 4e 54 4c 5f 43  gured by FCNTL_C
1c10: 48 55 4e 4b 5f 53 49 5a 45 20 2a 2f 0a 23 69 66  HUNK_SIZE */.#if
1c20: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
1c30: 5f 53 49 5a 45 3e 30 0a 20 20 69 6e 74 20 6e 46  _SIZE>0.  int nF
1c40: 65 74 63 68 4f 75 74 3b 20 20 20 20 20 20 20 20  etchOut;        
1c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c60: 20 4e 75 6d 62 65 72 20 6f 66 20 6f 75 74 73 74   Number of outst
1c70: 61 6e 64 69 6e 67 20 78 46 65 74 63 68 20 72 65  anding xFetch re
1c80: 66 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  fs */.  sqlite3_
1c90: 69 6e 74 36 34 20 6d 6d 61 70 53 69 7a 65 3b 20  int64 mmapSize; 
1ca0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
1cb0: 73 61 62 6c 65 20 73 69 7a 65 20 6f 66 20 6d 61  sable size of ma
1cc0: 70 70 69 6e 67 20 61 74 20 70 4d 61 70 52 65 67  pping at pMapReg
1cd0: 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ion */.  sqlite3
1ce0: 5f 69 6e 74 36 34 20 6d 6d 61 70 53 69 7a 65 41  _int64 mmapSizeA
1cf0: 63 74 75 61 6c 3b 20 20 20 20 20 20 20 2f 2a 20  ctual;       /* 
1d00: 41 63 74 75 61 6c 20 73 69 7a 65 20 6f 66 20 6d  Actual size of m
1d10: 61 70 70 69 6e 67 20 61 74 20 70 4d 61 70 52 65  apping at pMapRe
1d20: 67 69 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65  gion */.  sqlite
1d30: 33 5f 69 6e 74 36 34 20 6d 6d 61 70 53 69 7a 65  3_int64 mmapSize
1d40: 4d 61 78 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  Max;          /*
1d50: 20 43 6f 6e 66 69 67 75 72 65 64 20 46 43 4e 54   Configured FCNT
1d60: 4c 5f 4d 4d 41 50 5f 53 49 5a 45 20 76 61 6c 75  L_MMAP_SIZE valu
1d70: 65 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 4d 61  e */.  void *pMa
1d80: 70 52 65 67 69 6f 6e 3b 20 20 20 20 20 20 20 20  pRegion;        
1d90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65             /* Me
1da0: 6d 6f 72 79 20 6d 61 70 70 65 64 20 72 65 67 69  mory mapped regi
1db0: 6f 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 69  on */.#endif.  i
1dc0: 6e 74 20 73 65 63 74 6f 72 53 69 7a 65 3b 20 20  nt sectorSize;  
1dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1de0: 20 20 20 2f 2a 20 44 65 76 69 63 65 20 73 65 63     /* Device sec
1df0: 74 6f 72 20 73 69 7a 65 20 2a 2f 0a 20 20 69 6e  tor size */.  in
1e00: 74 20 64 65 76 69 63 65 43 68 61 72 61 63 74 65  t deviceCharacte
1e10: 72 69 73 74 69 63 73 3b 20 20 20 20 20 20 20 20  ristics;        
1e20: 20 20 2f 2a 20 50 72 65 63 6f 6d 70 75 74 65 64    /* Precomputed
1e30: 20 64 65 76 69 63 65 20 63 68 61 72 61 63 74 65   device characte
1e40: 72 69 73 74 69 63 73 20 2a 2f 0a 23 69 66 20 53  ristics */.#if S
1e50: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
1e60: 4b 49 4e 47 5f 53 54 59 4c 45 20 7c 7c 20 64 65  KING_STYLE || de
1e70: 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
1e80: 0a 20 20 69 6e 74 20 6f 70 65 6e 46 6c 61 67 73  .  int openFlags
1e90: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1ea0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 6c         /* The fl
1eb0: 61 67 73 20 73 70 65 63 69 66 69 65 64 20 61 74  ags specified at
1ec0: 20 6f 70 65 6e 28 29 20 2a 2f 0a 23 65 6e 64 69   open() */.#endi
1ed0: 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  f.#if SQLITE_ENA
1ee0: 42 4c 45 5f 44 41 54 41 5f 50 52 4f 54 45 43 54  BLE_DATA_PROTECT
1ef0: 49 4f 4e 0a 20 20 69 6e 74 20 70 72 6f 74 46 6c  ION.  int protFl
1f00: 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
1f10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
1f20: 61 20 70 72 6f 74 65 63 74 69 6f 6e 20 66 6c 61  a protection fla
1f30: 67 73 20 66 72 6f 6d 20 75 6e 69 78 4f 70 65 6e  gs from unixOpen
1f40: 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20 53   */.#endif.#if S
1f50: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
1f60: 4b 49 4e 47 5f 53 54 59 4c 45 20 7c 7c 20 64 65  KING_STYLE || de
1f70: 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
1f80: 0a 20 20 75 6e 73 69 67 6e 65 64 20 66 73 46 6c  .  unsigned fsFl
1f90: 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
1fa0: 20 20 20 20 20 20 20 2f 2a 20 63 61 63 68 65 64         /* cached
1fb0: 20 64 65 74 61 69 6c 73 20 66 72 6f 6d 20 73 74   details from st
1fc0: 61 74 66 73 28 29 20 2a 2f 0a 23 65 6e 64 69 66  atfs() */.#endif
1fd0: 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
1fe0: 20 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73    struct vxworks
1ff0: 46 69 6c 65 49 64 20 2a 70 49 64 3b 20 20 20 20  FileId *pId;    
2000: 20 20 20 20 20 20 2f 2a 20 55 6e 69 71 75 65 20        /* Unique 
2010: 66 69 6c 65 20 49 44 20 2a 2f 0a 23 65 6e 64 69  file ID */.#endi
2020: 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  f.#ifdef SQLITE_
2030: 44 45 42 55 47 0a 20 20 2f 2a 20 54 68 65 20 6e  DEBUG.  /* The n
2040: 65 78 74 20 67 72 6f 75 70 20 6f 66 20 76 61 72  ext group of var
2050: 69 61 62 6c 65 73 20 61 72 65 20 75 73 65 64 20  iables are used 
2060: 74 6f 20 74 72 61 63 6b 20 77 68 65 74 68 65 72  to track whether
2070: 20 6f 72 20 6e 6f 74 20 74 68 65 0a 20 20 2a 2a   or not the.  **
2080: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
2090: 6e 74 65 72 20 69 6e 20 62 79 74 65 73 20 32 34  nter in bytes 24
20a0: 2d 32 37 20 6f 66 20 64 61 74 61 62 61 73 65 20  -27 of database 
20b0: 66 69 6c 65 73 20 61 72 65 20 75 70 64 61 74 65  files are update
20c0: 64 0a 20 20 2a 2a 20 77 68 65 6e 65 76 65 72 20  d.  ** whenever 
20d0: 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65 20  any part of the 
20e0: 64 61 74 61 62 61 73 65 20 63 68 61 6e 67 65 73  database changes
20f0: 2e 20 20 41 6e 20 61 73 73 65 72 74 69 6f 6e 20  .  An assertion 
2100: 66 61 75 6c 74 20 77 69 6c 6c 0a 20 20 2a 2a 20  fault will.  ** 
2110: 6f 63 63 75 72 20 69 66 20 61 20 66 69 6c 65 20  occur if a file 
2120: 69 73 20 75 70 64 61 74 65 64 20 77 69 74 68 6f  is updated witho
2130: 75 74 20 61 6c 73 6f 20 75 70 64 61 74 69 6e 67  ut also updating
2140: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
2150: 0a 20 20 2a 2a 20 63 6f 75 6e 74 65 72 2e 20 20  .  ** counter.  
2160: 54 68 69 73 20 74 65 73 74 20 69 73 20 6d 61 64  This test is mad
2170: 65 20 74 6f 20 61 76 6f 69 64 20 6e 65 77 20 70  e to avoid new p
2180: 72 6f 62 6c 65 6d 73 20 73 69 6d 69 6c 61 72 20  roblems similar 
2190: 74 6f 20 74 68 65 0a 20 20 2a 2a 20 6f 6e 65 20  to the.  ** one 
21a0: 64 65 73 63 72 69 62 65 64 20 62 79 20 74 69 63  described by tic
21b0: 6b 65 74 20 23 33 35 38 34 2e 20 0a 20 20 2a 2f  ket #3584. .  */
21c0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
21d0: 20 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 3b 20   transCntrChng; 
21e0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65    /* True if the
21f0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75   transaction cou
2200: 6e 74 65 72 20 63 68 61 6e 67 65 64 20 2a 2f 0a  nter changed */.
2210: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
2220: 64 62 55 70 64 61 74 65 3b 20 20 20 20 20 20 20  dbUpdate;       
2230: 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 79 20   /* True if any 
2240: 70 61 72 74 20 6f 66 20 64 61 74 61 62 61 73 65  part of database
2250: 20 66 69 6c 65 20 63 68 61 6e 67 65 64 20 2a 2f   file changed */
2260: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
2270: 20 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 3b 20   inNormalWrite; 
2280: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 69 6e 20    /* True if in 
2290: 61 20 6e 6f 72 6d 61 6c 20 77 72 69 74 65 20 6f  a normal write o
22a0: 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 0a 23 65 6e  peration */..#en
22b0: 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
22c0: 54 45 5f 54 45 53 54 0a 20 20 2f 2a 20 49 6e 20  TE_TEST.  /* In 
22d0: 74 65 73 74 20 6d 6f 64 65 2c 20 69 6e 63 72 65  test mode, incre
22e0: 61 73 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20  ase the size of 
22f0: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 61  this structure a
2300: 20 62 69 74 20 73 6f 20 74 68 61 74 20 0a 20 20   bit so that .  
2310: 2a 2a 20 69 74 20 69 73 20 6c 61 72 67 65 72 20  ** it is larger 
2320: 74 68 61 6e 20 74 68 65 20 73 74 72 75 63 74 20  than the struct 
2330: 43 72 61 73 68 46 69 6c 65 20 64 65 66 69 6e 65  CrashFile define
2340: 64 20 69 6e 20 74 65 73 74 36 2e 63 2e 0a 20 20  d in test6.c..  
2350: 2a 2f 0a 20 20 63 68 61 72 20 61 50 61 64 64 69  */.  char aPaddi
2360: 6e 67 5b 33 32 5d 3b 0a 23 65 6e 64 69 66 0a 7d  ng[32];.#endif.}
2370: 3b 0a 0a 2f 2a 20 54 68 69 73 20 76 61 72 69 61  ;../* This varia
2380: 62 6c 65 20 68 6f 6c 64 73 20 74 68 65 20 70 72  ble holds the pr
2390: 6f 63 65 73 73 20 69 64 20 28 70 69 64 29 20 66  ocess id (pid) f
23a0: 72 6f 6d 20 77 68 65 6e 20 74 68 65 20 78 52 61  rom when the xRa
23b0: 6e 64 6f 6d 6e 65 73 73 28 29 0a 2a 2a 20 6d 65  ndomness().** me
23c0: 74 68 6f 64 20 77 61 73 20 63 61 6c 6c 65 64 2e  thod was called.
23d0: 20 20 49 66 20 78 4f 70 65 6e 28 29 20 69 73 20    If xOpen() is 
23e0: 63 61 6c 6c 65 64 20 66 72 6f 6d 20 61 20 64 69  called from a di
23f0: 66 66 65 72 65 6e 74 20 70 72 6f 63 65 73 73 20  fferent process 
2400: 69 64 2c 0a 2a 2a 20 69 6e 64 69 63 61 74 69 6e  id,.** indicatin
2410: 67 20 74 68 61 74 20 61 20 66 6f 72 6b 28 29 20  g that a fork() 
2420: 68 61 73 20 6f 63 63 75 72 72 65 64 2c 20 74 68  has occurred, th
2430: 65 20 50 52 4e 47 20 77 69 6c 6c 20 62 65 20 72  e PRNG will be r
2440: 65 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  eset..*/.static 
2450: 70 69 64 5f 74 20 72 61 6e 64 6f 6d 6e 65 73 73  pid_t randomness
2460: 50 69 64 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20  Pid = 0;../*.** 
2470: 41 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73 20 66  Allowed values f
2480: 6f 72 20 74 68 65 20 75 6e 69 78 46 69 6c 65 2e  or the unixFile.
2490: 63 74 72 6c 46 6c 61 67 73 20 62 69 74 6d 61 73  ctrlFlags bitmas
24a0: 6b 3a 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e  k:.*/.#define UN
24b0: 49 58 46 49 4c 45 5f 45 58 43 4c 20 20 20 20 20  IXFILE_EXCL     
24c0: 20 20 20 30 78 30 31 20 20 20 20 20 2f 2a 20 43     0x01     /* C
24d0: 6f 6e 6e 65 63 74 69 6f 6e 73 20 66 72 6f 6d 20  onnections from 
24e0: 6f 6e 65 20 70 72 6f 63 65 73 73 20 6f 6e 6c 79  one process only
24f0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49 58   */.#define UNIX
2500: 46 49 4c 45 5f 52 44 4f 4e 4c 59 20 20 20 20 20  FILE_RDONLY     
2510: 20 30 78 30 32 20 20 20 20 20 2f 2a 20 43 6f 6e   0x02     /* Con
2520: 6e 65 63 74 69 6f 6e 20 69 73 20 72 65 61 64 20  nection is read 
2530: 6f 6e 6c 79 20 2a 2f 0a 23 64 65 66 69 6e 65 20  only */.#define 
2540: 55 4e 49 58 46 49 4c 45 5f 50 45 52 53 49 53 54  UNIXFILE_PERSIST
2550: 5f 57 41 4c 20 30 78 30 34 20 20 20 20 20 2f 2a  _WAL 0x04     /*
2560: 20 50 65 72 73 69 73 74 65 6e 74 20 57 41 4c 20   Persistent WAL 
2570: 6d 6f 64 65 20 2a 2f 0a 23 69 66 6e 64 65 66 20  mode */.#ifndef 
2580: 53 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 44  SQLITE_DISABLE_D
2590: 49 52 53 59 4e 43 0a 23 20 64 65 66 69 6e 65 20  IRSYNC.# define 
25a0: 55 4e 49 58 46 49 4c 45 5f 44 49 52 53 59 4e 43  UNIXFILE_DIRSYNC
25b0: 20 20 20 20 30 78 30 38 20 20 20 20 20 2f 2a 20      0x08     /* 
25c0: 44 69 72 65 63 74 6f 72 79 20 73 79 6e 63 20 6e  Directory sync n
25d0: 65 65 64 65 64 20 2a 2f 0a 23 65 6c 73 65 0a 23  eeded */.#else.#
25e0: 20 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c 45   define UNIXFILE
25f0: 5f 44 49 52 53 59 4e 43 20 20 20 20 30 78 30 30  _DIRSYNC    0x00
2600: 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20  .#endif.#define 
2610: 55 4e 49 58 46 49 4c 45 5f 50 53 4f 57 20 20 20  UNIXFILE_PSOW   
2620: 20 20 20 20 20 30 78 31 30 20 20 20 20 20 2f 2a       0x10     /*
2630: 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f   SQLITE_IOCAP_PO
2640: 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54  WERSAFE_OVERWRIT
2650: 45 20 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49  E */.#define UNI
2660: 58 46 49 4c 45 5f 44 45 4c 45 54 45 20 20 20 20  XFILE_DELETE    
2670: 20 20 30 78 32 30 20 20 20 20 20 2f 2a 20 44 65    0x20     /* De
2680: 6c 65 74 65 20 6f 6e 20 63 6c 6f 73 65 20 2a 2f  lete on close */
2690: 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c  .#define UNIXFIL
26a0: 45 5f 55 52 49 20 20 20 20 20 20 20 20 20 30 78  E_URI         0x
26b0: 34 30 20 20 20 20 20 2f 2a 20 46 69 6c 65 6e 61  40     /* Filena
26c0: 6d 65 20 6d 69 67 68 74 20 68 61 76 65 20 71 75  me might have qu
26d0: 65 72 79 20 70 61 72 61 6d 65 74 65 72 73 20 2a  ery parameters *
26e0: 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 46 49  /.#define UNIXFI
26f0: 4c 45 5f 4e 4f 4c 4f 43 4b 20 20 20 20 20 20 30  LE_NOLOCK      0
2700: 78 38 30 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f  x80     /* Do no
2710: 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 2a 2f   file locking */
2720: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 6c 75 64 65 20  ../*.** Include 
2730: 63 6f 64 65 20 74 68 61 74 20 69 73 20 63 6f 6d  code that is com
2740: 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6f 73 5f 2a 2e  mon to all os_*.
2750: 63 20 66 69 6c 65 73 0a 2a 2f 0a 23 69 6e 63 6c  c files.*/.#incl
2760: 75 64 65 20 22 6f 73 5f 63 6f 6d 6d 6f 6e 2e 68  ude "os_common.h
2770: 22 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65 20  "../*.** Define 
2780: 76 61 72 69 6f 75 73 20 6d 61 63 72 6f 73 20 74  various macros t
2790: 68 61 74 20 61 72 65 20 6d 69 73 73 69 6e 67 20  hat are missing 
27a0: 66 72 6f 6d 20 73 6f 6d 65 20 73 79 73 74 65 6d  from some system
27b0: 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4f 5f  s..*/.#ifndef O_
27c0: 4c 41 52 47 45 46 49 4c 45 0a 23 20 64 65 66 69  LARGEFILE.# defi
27d0: 6e 65 20 4f 5f 4c 41 52 47 45 46 49 4c 45 20 30  ne O_LARGEFILE 0
27e0: 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53  .#endif.#ifdef S
27f0: 51 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 4c 46  QLITE_DISABLE_LF
2800: 53 0a 23 20 75 6e 64 65 66 20 4f 5f 4c 41 52 47  S.# undef O_LARG
2810: 45 46 49 4c 45 0a 23 20 64 65 66 69 6e 65 20 4f  EFILE.# define O
2820: 5f 4c 41 52 47 45 46 49 4c 45 20 30 0a 23 65 6e  _LARGEFILE 0.#en
2830: 64 69 66 0a 23 69 66 6e 64 65 66 20 4f 5f 4e 4f  dif.#ifndef O_NO
2840: 46 4f 4c 4c 4f 57 0a 23 20 64 65 66 69 6e 65 20  FOLLOW.# define 
2850: 4f 5f 4e 4f 46 4f 4c 4c 4f 57 20 30 0a 23 65 6e  O_NOFOLLOW 0.#en
2860: 64 69 66 0a 23 69 66 6e 64 65 66 20 4f 5f 42 49  dif.#ifndef O_BI
2870: 4e 41 52 59 0a 23 20 64 65 66 69 6e 65 20 4f 5f  NARY.# define O_
2880: 42 49 4e 41 52 59 20 30 0a 23 65 6e 64 69 66 0a  BINARY 0.#endif.
2890: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 74 68 72 65 61  ./*.** The threa
28a0: 64 69 64 20 6d 61 63 72 6f 20 72 65 73 6f 6c 76  did macro resolv
28b0: 65 73 20 74 6f 20 74 68 65 20 74 68 72 65 61 64  es to the thread
28c0: 2d 69 64 20 6f 72 20 74 6f 20 30 2e 20 20 55 73  -id or to 0.  Us
28d0: 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e  ed for.** testin
28e0: 67 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20  g and debugging 
28f0: 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c  only..*/.#if SQL
2900: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a 23  ITE_THREADSAFE.#
2910: 64 65 66 69 6e 65 20 74 68 72 65 61 64 69 64 20  define threadid 
2920: 70 74 68 72 65 61 64 5f 73 65 6c 66 28 29 0a 23  pthread_self().#
2930: 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 74 68 72  else.#define thr
2940: 65 61 64 69 64 20 30 0a 23 65 6e 64 69 66 0a 0a  eadid 0.#endif..
2950: 23 69 66 64 65 66 20 5f 5f 41 50 50 4c 45 5f 5f  #ifdef __APPLE__
2960: 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  .#define SQLITE_
2970: 45 4e 41 42 4c 45 5f 53 55 50 45 52 4c 4f 43 4b  ENABLE_SUPERLOCK
2980: 20 31 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53   1.#endif..#if S
2990: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 55 50  QLITE_ENABLE_SUP
29a0: 45 52 4c 4f 43 4b 0a 23 69 6e 63 6c 75 64 65 20  ERLOCK.#include 
29b0: 22 73 71 6c 69 74 65 33 2e 68 22 0a 23 69 6e 63  "sqlite3.h".#inc
29c0: 6c 75 64 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a  lude <string.h>.
29d0: 23 69 6e 63 6c 75 64 65 20 3c 61 73 73 65 72 74  #include <assert
29e0: 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20 41 20 73 74 72  .h>../*.** A str
29f0: 75 63 74 75 72 65 20 74 6f 20 63 6f 6c 6c 65 63  ucture to collec
2a00: 74 20 61 20 62 75 73 79 2d 68 61 6e 64 6c 65 72  t a busy-handler
2a10: 20 63 61 6c 6c 62 61 63 6b 20 61 6e 64 20 61 72   callback and ar
2a20: 67 75 6d 65 6e 74 20 61 6e 64 20 61 20 63 6f 75  gument and a cou
2a30: 6e 74 0a 2a 2a 20 6f 66 20 74 68 65 20 6e 75 6d  nt.** of the num
2a40: 62 65 72 20 6f 66 20 74 69 6d 65 73 20 69 74 20  ber of times it 
2a50: 68 61 73 20 62 65 65 6e 20 69 6e 76 6f 6b 65 64  has been invoked
2a60: 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 53 75 70 65  ..*/.struct Supe
2a70: 72 6c 6f 63 6b 42 75 73 79 20 7b 0a 20 20 69 6e  rlockBusy {.  in
2a80: 74 20 28 2a 78 42 75 73 79 29 28 76 6f 69 64 2a  t (*xBusy)(void*
2a90: 2c 69 6e 74 29 3b 20 20 20 20 20 20 20 20 2f 2a  ,int);        /*
2aa0: 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 73 79   Pointer to busy
2ab0: 2d 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f  -handler functio
2ac0: 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75  n */.  void *pBu
2ad0: 73 79 41 72 67 3b 20 20 20 20 20 20 20 20 20 20  syArg;          
2ae0: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
2af0: 61 72 67 20 74 6f 20 70 61 73 73 20 74 6f 20 78  arg to pass to x
2b00: 42 75 73 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 42  Busy */.  int nB
2b10: 75 73 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  usy;            
2b20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2b30: 62 65 72 20 6f 66 20 74 69 6d 65 73 20 78 42 75  ber of times xBu
2b40: 73 79 20 68 61 73 20 62 65 65 6e 20 69 6e 76 6f  sy has been invo
2b50: 6b 65 64 20 2a 2f 0a 7d 3b 0a 74 79 70 65 64 65  ked */.};.typede
2b60: 66 20 73 74 72 75 63 74 20 53 75 70 65 72 6c 6f  f struct Superlo
2b70: 63 6b 42 75 73 79 20 53 75 70 65 72 6c 6f 63 6b  ckBusy Superlock
2b80: 42 75 73 79 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  Busy;../*.** An 
2b90: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
2ba0: 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
2bb0: 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  ure is allocated
2bc0: 20 66 6f 72 20 65 61 63 68 20 61 63 74 69 76 65   for each active
2bd0: 0a 2a 2a 20 73 75 70 65 72 6c 6f 63 6b 2e 20 54  .** superlock. T
2be0: 68 65 20 6f 70 61 71 75 65 20 68 61 6e 64 6c 65  he opaque handle
2bf0: 20 72 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c   returned by sql
2c00: 69 74 65 33 64 65 6d 6f 5f 73 75 70 65 72 6c 6f  ite3demo_superlo
2c10: 63 6b 28 29 20 69 73 0a 2a 2a 20 61 63 74 75 61  ck() is.** actua
2c20: 6c 6c 79 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  lly a pointer to
2c30: 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   an instance of 
2c40: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 2e 0a  this structure..
2c50: 2a 2f 0a 73 74 72 75 63 74 20 53 75 70 65 72 6c  */.struct Superl
2c60: 6f 63 6b 20 7b 0a 20 20 73 71 6c 69 74 65 33 20  ock {.  sqlite3 
2c70: 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  *db;            
2c80: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
2c90: 61 73 65 20 68 61 6e 64 6c 65 20 75 73 65 64 20  ase handle used 
2ca0: 74 6f 20 6c 6f 63 6b 20 64 62 20 2a 2f 0a 20 20  to lock db */.  
2cb0: 69 6e 74 20 62 57 61 6c 3b 20 20 20 20 20 20 20  int bWal;       
2cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cd0: 2f 2a 20 54 72 75 65 20 69 66 20 64 62 20 69 73  /* True if db is
2ce0: 20 61 20 57 41 4c 20 64 61 74 61 62 61 73 65 20   a WAL database 
2cf0: 2a 2f 0a 7d 3b 0a 74 79 70 65 64 65 66 20 73 74  */.};.typedef st
2d00: 72 75 63 74 20 53 75 70 65 72 6c 6f 63 6b 20 53  ruct Superlock S
2d10: 75 70 65 72 6c 6f 63 6b 3b 0a 0a 2f 2a 0a 2a 2a  uperlock;../*.**
2d20: 20 54 68 65 20 70 43 74 78 20 70 6f 69 6e 74 65   The pCtx pointe
2d30: 72 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73  r passed to this
2d40: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 63 74   function is act
2d50: 75 61 6c 6c 79 20 61 20 70 6f 69 6e 74 65 72 20  ually a pointer 
2d60: 74 6f 20 61 0a 2a 2a 20 53 75 70 65 72 6c 6f 63  to a.** Superloc
2d70: 6b 42 75 73 79 20 73 74 72 75 63 74 75 72 65 2e  kBusy structure.
2d80: 20 49 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79   Invoke the busy
2d90: 2d 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f  -handler functio
2da0: 6e 20 65 6e 63 61 70 73 75 6c 61 74 65 64 0a 2a  n encapsulated.*
2db0: 2a 20 62 79 20 74 68 65 20 73 74 72 75 63 74 75  * by the structu
2dc0: 72 65 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68  re and return th
2dd0: 65 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a 73 74 61  e result..*/.sta
2de0: 74 69 63 20 69 6e 74 20 73 75 70 65 72 6c 6f 63  tic int superloc
2df0: 6b 42 75 73 79 48 61 6e 64 6c 65 72 28 76 6f 69  kBusyHandler(voi
2e00: 64 20 2a 70 43 74 78 2c 20 69 6e 74 20 55 4e 55  d *pCtx, int UNU
2e10: 53 45 44 29 7b 0a 20 20 53 75 70 65 72 6c 6f 63  SED){.  Superloc
2e20: 6b 42 75 73 79 20 2a 70 42 75 73 79 20 3d 20 28  kBusy *pBusy = (
2e30: 53 75 70 65 72 6c 6f 63 6b 42 75 73 79 20 2a 29  SuperlockBusy *)
2e40: 70 43 74 78 3b 0a 20 20 69 66 28 20 70 42 75 73  pCtx;.  if( pBus
2e50: 79 2d 3e 78 42 75 73 79 3d 3d 30 20 29 20 72 65  y->xBusy==0 ) re
2e60: 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e  turn 0;.  return
2e70: 20 70 42 75 73 79 2d 3e 78 42 75 73 79 28 70 42   pBusy->xBusy(pB
2e80: 75 73 79 2d 3e 70 42 75 73 79 41 72 67 2c 20 70  usy->pBusyArg, p
2e90: 42 75 73 79 2d 3e 6e 42 75 73 79 2b 2b 29 3b 0a  Busy->nBusy++);.
2ea0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
2eb0: 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  nction is used t
2ec0: 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74  o determine if t
2ed0: 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
2ee0: 20 66 69 6c 65 20 66 6f 72 20 0a 2a 2a 20 63 6f   file for .** co
2ef0: 6e 6e 65 63 74 69 6f 6e 20 64 62 20 69 73 20 6f  nnection db is o
2f00: 70 65 6e 20 69 6e 20 57 41 4c 20 6d 6f 64 65 20  pen in WAL mode 
2f10: 6f 72 20 6e 6f 74 2e 20 49 66 20 6e 6f 20 65 72  or not. If no er
2f20: 72 6f 72 20 6f 63 63 75 72 73 20 61 6e 64 20 74  ror occurs and t
2f30: 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66  he.** database f
2f40: 69 6c 65 20 69 73 20 69 6e 20 57 41 4c 20 6d 6f  ile is in WAL mo
2f50: 64 65 2c 20 73 65 74 20 2a 70 62 57 61 6c 20 74  de, set *pbWal t
2f60: 6f 20 74 72 75 65 20 61 6e 64 20 72 65 74 75 72  o true and retur
2f70: 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20  n SQLITE_OK..** 
2f80: 49 66 20 69 74 20 69 73 20 6e 6f 74 20 69 6e 20  If it is not in 
2f90: 57 41 4c 20 6d 6f 64 65 2c 20 73 65 74 20 2a 70  WAL mode, set *p
2fa0: 62 57 61 6c 20 74 6f 20 66 61 6c 73 65 2e 0a 2a  bWal to false..*
2fb0: 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
2fc0: 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20   occurs, return 
2fd0: 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
2fe0: 63 6f 64 65 2e 20 54 68 65 20 76 61 6c 75 65 20  code. The value 
2ff0: 6f 66 20 2a 70 62 57 61 6c 0a 2a 2a 20 69 73 20  of *pbWal.** is 
3000: 75 6e 64 65 66 69 6e 65 64 20 69 6e 20 74 68 69  undefined in thi
3010: 73 20 63 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  s case..*/.stati
3020: 63 20 69 6e 74 20 73 75 70 65 72 6c 6f 63 6b 49  c int superlockI
3030: 73 57 61 6c 28 53 75 70 65 72 6c 6f 63 6b 20 2a  sWal(Superlock *
3040: 70 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72 63  pLock){.  int rc
3050: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3060: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
3070: 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20 73 71  urn Code */.  sq
3080: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
3090: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t;            /*
30a0: 20 43 6f 6d 70 69 6c 65 64 20 50 52 41 47 4d 41   Compiled PRAGMA
30b0: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 73 74   journal_mode st
30c0: 61 74 65 6d 65 6e 74 20 2a 2f 0a 0a 20 20 72 63  atement */..  rc
30d0: 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61   = sqlite3_prepa
30e0: 72 65 28 70 4c 6f 63 6b 2d 3e 64 62 2c 20 22 50  re(pLock->db, "P
30f0: 52 41 47 4d 41 20 6d 61 69 6e 2e 6a 6f 75 72 6e  RAGMA main.journ
3100: 61 6c 5f 6d 6f 64 65 22 2c 20 2d 31 2c 20 26 70  al_mode", -1, &p
3110: 53 74 6d 74 2c 20 30 29 3b 0a 20 20 69 66 28 20  Stmt, 0);.  if( 
3120: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
3130: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 70 4c  return rc;..  pL
3140: 6f 63 6b 2d 3e 62 57 61 6c 20 3d 20 30 3b 0a 20  ock->bWal = 0;. 
3150: 20 69 66 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d   if( SQLITE_ROW=
3160: 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53  =sqlite3_step(pS
3170: 74 6d 74 29 20 29 7b 0a 20 20 20 20 63 6f 6e 73  tmt) ){.    cons
3180: 74 20 63 68 61 72 20 2a 7a 4d 6f 64 65 20 3d 20  t char *zMode = 
3190: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 73 71  (const char *)sq
31a0: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
31b0: 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20  t(pStmt, 0);.   
31c0: 20 69 66 28 20 7a 4d 6f 64 65 20 26 26 20 73 74   if( zMode && st
31d0: 72 6c 65 6e 28 7a 4d 6f 64 65 29 3d 3d 33 20 26  rlen(zMode)==3 &
31e0: 26 20 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63  & sqlite3_strnic
31f0: 6d 70 28 22 77 61 6c 22 2c 20 7a 4d 6f 64 65 2c  mp("wal", zMode,
3200: 20 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20   3)==0 ){.      
3210: 70 4c 6f 63 6b 2d 3e 62 57 61 6c 20 3d 20 31 3b  pLock->bWal = 1;
3220: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
3230: 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 66 69 6e  turn sqlite3_fin
3240: 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 7d 0a  alize(pStmt);.}.
3250: 0a 2f 2a 0a 2a 2a 20 4f 62 74 61 69 6e 20 61 6e  ./*.** Obtain an
3260: 20 65 78 63 6c 75 73 69 76 65 20 73 68 6d 2d 6c   exclusive shm-l
3270: 6f 63 6b 20 6f 6e 20 6e 42 79 74 65 20 62 79 74  ock on nByte byt
3280: 65 73 20 73 74 61 72 74 69 6e 67 20 61 74 20 6f  es starting at o
3290: 66 66 73 65 74 20 69 64 78 0a 2a 2a 20 6f 66 20  ffset idx.** of 
32a0: 74 68 65 20 66 69 6c 65 20 66 64 2e 20 49 66 20  the file fd. If 
32b0: 74 68 65 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 20  the lock cannot 
32c0: 62 65 20 6f 62 74 61 69 6e 65 64 20 69 6d 6d 65  be obtained imme
32d0: 64 69 61 74 65 6c 79 2c 20 69 6e 76 6f 6b 65 0a  diately, invoke.
32e0: 2a 2a 20 74 68 65 20 62 75 73 79 2d 68 61 6e 64  ** the busy-hand
32f0: 6c 65 72 20 75 6e 74 69 6c 20 65 69 74 68 65 72  ler until either
3300: 20 69 74 20 69 73 20 6f 62 74 61 69 6e 65 64 20   it is obtained 
3310: 6f 72 20 74 68 65 20 62 75 73 79 2d 68 61 6e 64  or the busy-hand
3320: 6c 65 72 0a 2a 2a 20 63 61 6c 6c 62 61 63 6b 20  ler.** callback 
3330: 72 65 74 75 72 6e 73 20 30 2e 0a 2a 2f 0a 73 74  returns 0..*/.st
3340: 61 74 69 63 20 69 6e 74 20 73 75 70 65 72 6c 6f  atic int superlo
3350: 63 6b 53 68 6d 4c 6f 63 6b 28 0a 20 20 73 71 6c  ckShmLock(.  sql
3360: 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20  ite3_file *fd,  
3370: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3380: 44 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61  Database file ha
3390: 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 69 64  ndle */.  int id
33a0: 78 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x,              
33b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
33c0: 73 65 74 20 6f 66 20 73 68 6d 2d 6c 6f 63 6b 20  set of shm-lock 
33d0: 74 6f 20 6f 62 74 61 69 6e 20 2a 2f 0a 20 20 69  to obtain */.  i
33e0: 6e 74 20 6e 42 79 74 65 2c 20 20 20 20 20 20 20  nt nByte,       
33f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3400: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6e 73  * Number of cons
3410: 65 63 74 69 76 65 20 62 79 74 65 73 20 74 6f 20  ective bytes to 
3420: 6c 6f 63 6b 20 2a 2f 0a 20 20 53 75 70 65 72 6c  lock */.  Superl
3430: 6f 63 6b 42 75 73 79 20 2a 70 42 75 73 79 20 20  ockBusy *pBusy  
3440: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 75 73            /* Bus
3450: 79 2d 68 61 6e 64 6c 65 72 20 77 72 61 70 70 65  y-handler wrappe
3460: 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20  r object */.){. 
3470: 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 28   int rc;.  int (
3480: 2a 78 53 68 6d 4c 6f 63 6b 29 28 73 71 6c 69 74  *xShmLock)(sqlit
3490: 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 2c 20 69  e3_file*, int, i
34a0: 6e 74 2c 20 69 6e 74 29 20 3d 20 66 64 2d 3e 70  nt, int) = fd->p
34b0: 4d 65 74 68 6f 64 73 2d 3e 78 53 68 6d 4c 6f 63  Methods->xShmLoc
34c0: 6b 3b 0a 20 20 64 6f 20 7b 0a 20 20 20 20 72 63  k;.  do {.    rc
34d0: 20 3d 20 78 53 68 6d 4c 6f 63 6b 28 66 64 2c 20   = xShmLock(fd, 
34e0: 69 64 78 2c 20 6e 42 79 74 65 2c 20 53 51 4c 49  idx, nByte, SQLI
34f0: 54 45 5f 53 48 4d 5f 4c 4f 43 4b 7c 53 51 4c 49  TE_SHM_LOCK|SQLI
3500: 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45  TE_SHM_EXCLUSIVE
3510: 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20 72 63 3d  );.  }while( rc=
3520: 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20  =SQLITE_BUSY && 
3530: 73 75 70 65 72 6c 6f 63 6b 42 75 73 79 48 61 6e  superlockBusyHan
3540: 64 6c 65 72 28 28 76 6f 69 64 20 2a 29 70 42 75  dler((void *)pBu
3550: 73 79 2c 20 30 29 20 29 3b 0a 20 20 72 65 74 75  sy, 0) );.  retu
3560: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
3570: 4f 62 74 61 69 6e 20 74 68 65 20 65 78 74 72 61  Obtain the extra
3580: 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 20 64 61   locks on the da
3590: 74 61 62 61 73 65 20 66 69 6c 65 20 72 65 71 75  tabase file requ
35a0: 69 72 65 64 20 66 6f 72 20 57 41 4c 20 64 61 74  ired for WAL dat
35b0: 61 62 61 73 65 73 2e 0a 2a 2a 20 49 6e 76 6f 6b  abases..** Invok
35c0: 65 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 62  e the supplied b
35d0: 75 73 79 2d 68 61 6e 64 6c 65 72 20 61 73 20 72  usy-handler as r
35e0: 65 71 75 69 72 65 64 2e 0a 2a 2f 0a 73 74 61 74  equired..*/.stat
35f0: 69 63 20 69 6e 74 20 73 75 70 65 72 6c 6f 63 6b  ic int superlock
3600: 57 61 6c 4c 6f 63 6b 28 0a 20 20 73 71 6c 69 74  WalLock(.  sqlit
3610: 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
3620: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
3630: 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 6f 70  tabase handle op
3640: 65 6e 20 6f 6e 20 57 41 4c 20 64 61 74 61 62 61  en on WAL databa
3650: 73 65 20 2a 2f 0a 20 20 53 75 70 65 72 6c 6f 63  se */.  Superloc
3660: 6b 42 75 73 79 20 2a 70 42 75 73 79 20 20 20 20  kBusy *pBusy    
3670: 20 20 20 20 20 20 20 20 2f 2a 20 42 75 73 79 20          /* Busy 
3680: 68 61 6e 64 6c 65 72 20 77 72 61 70 70 65 72 20  handler wrapper 
3690: 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 69  object */.){.  i
36a0: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
36b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
36c0: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
36d0: 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
36e0: 2a 66 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20  *fd = 0;        
36f0: 20 20 20 2f 2a 20 4d 61 69 6e 20 64 61 74 61 62     /* Main datab
3700: 61 73 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20  ase file handle 
3710: 2a 2f 0a 20 20 76 6f 69 64 20 76 6f 6c 61 74 69  */.  void volati
3720: 6c 65 20 2a 70 20 3d 20 30 3b 20 20 20 20 20 20  le *p = 0;      
3730: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
3740: 74 6f 20 66 69 72 73 74 20 70 61 67 65 20 6f 66  to first page of
3750: 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a   shared memory *
3760: 2f 0a 0a 20 20 2f 2a 20 4f 62 74 61 69 6e 20 61  /..  /* Obtain a
3770: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
3780: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 6f 62 6a  sqlite3_file obj
3790: 65 63 74 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20  ect open on the 
37a0: 6d 61 69 6e 20 64 62 20 66 69 6c 65 2e 20 2a 2f  main db file. */
37b0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
37c0: 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c  file_control(db,
37d0: 20 22 6d 61 69 6e 22 2c 20 53 51 4c 49 54 45 5f   "main", SQLITE_
37e0: 46 43 4e 54 4c 5f 46 49 4c 45 5f 50 4f 49 4e 54  FCNTL_FILE_POINT
37f0: 45 52 2c 20 28 76 6f 69 64 20 2a 29 26 66 64 29  ER, (void *)&fd)
3800: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
3810: 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
3820: 63 3b 0a 0a 20 20 2f 2a 20 4f 62 74 61 69 6e 20  c;..  /* Obtain 
3830: 74 68 65 20 22 72 65 63 6f 76 65 72 79 22 20 6c  the "recovery" l
3840: 6f 63 6b 2e 20 4e 6f 72 6d 61 6c 6c 79 2c 20 74  ock. Normally, t
3850: 68 69 73 20 6c 6f 63 6b 20 69 73 20 6f 6e 6c 79  his lock is only
3860: 20 6f 62 74 61 69 6e 65 64 20 62 79 0a 20 20 2a   obtained by.  *
3870: 2a 20 63 6c 69 65 6e 74 73 20 72 75 6e 6e 69 6e  * clients runnin
3880: 67 20 64 61 74 61 62 61 73 65 20 72 65 63 6f 76  g database recov
3890: 65 72 79 2e 20 20 0a 20 20 2a 2f 0a 20 20 72 63  ery.  .  */.  rc
38a0: 20 3d 20 73 75 70 65 72 6c 6f 63 6b 53 68 6d 4c   = superlockShmL
38b0: 6f 63 6b 28 66 64 2c 20 32 2c 20 31 2c 20 70 42  ock(fd, 2, 1, pB
38c0: 75 73 79 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  usy);.  if( rc!=
38d0: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
38e0: 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 5a 65 72  rn rc;..  /* Zer
38f0: 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  o the start of t
3900: 68 65 20 66 69 72 73 74 20 73 68 61 72 65 64 2d  he first shared-
3910: 6d 65 6d 6f 72 79 20 70 61 67 65 2e 20 54 68 69  memory page. Thi
3920: 73 20 6d 65 61 6e 73 20 74 68 61 74 20 61 6e 79  s means that any
3930: 0a 20 20 2a 2a 20 63 6c 69 65 6e 74 73 20 74 68  .  ** clients th
3940: 61 74 20 6f 70 65 6e 20 72 65 61 64 20 6f 72 20  at open read or 
3950: 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f  write transactio
3960: 6e 73 20 66 72 6f 6d 20 74 68 69 73 20 70 6f 69  ns from this poi
3970: 6e 74 20 6f 6e 20 77 69 6c 6c 0a 20 20 2a 2a 20  nt on will.  ** 
3980: 68 61 76 65 20 74 6f 20 72 75 6e 20 72 65 63 6f  have to run reco
3990: 76 65 72 79 20 62 65 66 6f 72 65 20 70 72 6f 63  very before proc
39a0: 65 65 64 69 6e 67 2e 20 53 69 6e 63 65 20 74 68  eeding. Since th
39b0: 65 79 20 6e 65 65 64 20 74 68 65 20 22 72 65 63  ey need the "rec
39c0: 6f 76 65 72 79 22 0a 20 20 2a 2a 20 6c 6f 63 6b  overy".  ** lock
39d0: 20 74 68 61 74 20 74 68 69 73 20 70 72 6f 63 65   that this proce
39e0: 73 73 20 69 73 20 68 6f 6c 64 69 6e 67 20 74 6f  ss is holding to
39f0: 20 64 6f 20 74 68 61 74 2c 20 6e 6f 20 6e 65 77   do that, no new
3a00: 20 72 65 61 64 20 6f 72 20 77 72 69 74 65 0a 20   read or write. 
3a10: 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 73   ** transactions
3a20: 20 6d 61 79 20 6e 6f 77 20 62 65 20 6f 70 65 6e   may now be open
3a30: 65 64 2e 20 4e 6f 72 20 63 61 6e 20 61 20 63 68  ed. Nor can a ch
3a40: 65 63 6b 70 6f 69 6e 74 20 62 65 20 72 75 6e 2c  eckpoint be run,
3a50: 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a 20 73 61   for the.  ** sa
3a60: 6d 65 20 72 65 61 73 6f 6e 2e 0a 20 20 2a 2f 0a  me reason..  */.
3a70: 20 20 72 63 20 3d 20 66 64 2d 3e 70 4d 65 74 68    rc = fd->pMeth
3a80: 6f 64 73 2d 3e 78 53 68 6d 4d 61 70 28 66 64 2c  ods->xShmMap(fd,
3a90: 20 30 2c 20 33 32 2a 31 30 32 34 2c 20 31 2c 20   0, 32*1024, 1, 
3aa0: 26 70 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  &p);.  if( rc!=S
3ab0: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
3ac0: 6e 20 72 63 3b 0a 20 20 6d 65 6d 73 65 74 28 28  n rc;.  memset((
3ad0: 76 6f 69 64 20 2a 29 70 2c 20 30 2c 20 33 32 29  void *)p, 0, 32)
3ae0: 3b 0a 0a 20 20 2f 2a 20 4f 62 74 61 69 6e 20 65  ;..  /* Obtain e
3af0: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20 6f  xclusive locks o
3b00: 6e 20 61 6c 6c 20 74 68 65 20 22 72 65 61 64 2d  n all the "read-
3b10: 6c 6f 63 6b 22 20 73 6c 6f 74 73 2e 20 4f 6e 63  lock" slots. Onc
3b20: 65 20 74 68 65 73 65 20 6c 6f 63 6b 73 0a 20 20  e these locks.  
3b30: 2a 2a 20 61 72 65 20 68 65 6c 64 2c 20 69 74 20  ** are held, it 
3b40: 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 68  is guaranteed th
3b50: 61 74 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  at there are no 
3b60: 61 63 74 69 76 65 20 72 65 61 64 65 72 2c 20 77  active reader, w
3b70: 72 69 74 65 72 20 6f 72 20 0a 20 20 2a 2a 20 63  riter or .  ** c
3b80: 68 65 63 6b 70 6f 69 6e 74 65 72 20 63 6c 69 65  heckpointer clie
3b90: 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  nts..  */.  rc =
3ba0: 20 73 75 70 65 72 6c 6f 63 6b 53 68 6d 4c 6f 63   superlockShmLoc
3bb0: 6b 28 66 64 2c 20 33 2c 20 53 51 4c 49 54 45 5f  k(fd, 3, SQLITE_
3bc0: 53 48 4d 5f 4e 4c 4f 43 4b 2d 33 2c 20 70 42 75  SHM_NLOCK-3, pBu
3bd0: 73 79 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  sy);.  return rc
3be0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  ;.}../*.** Relea
3bf0: 73 65 20 61 20 73 75 70 65 72 6c 6f 63 6b 20 68  se a superlock h
3c00: 65 6c 64 20 6f 6e 20 61 20 64 61 74 61 62 61 73  eld on a databas
3c10: 65 20 66 69 6c 65 2e 20 54 68 65 20 61 72 67 75  e file. The argu
3c20: 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20 0a  ment passed to .
3c30: 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** this function
3c40: 20 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e 20   must have been 
3c50: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 61 20  obtained from a 
3c60: 73 75 63 63 65 73 73 66 75 6c 20 63 61 6c 6c 20  successful call 
3c70: 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 64 65 6d  to.** sqlite3dem
3c80: 6f 5f 73 75 70 65 72 6c 6f 63 6b 28 29 2e 0a 2a  o_superlock()..*
3c90: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 71  /.static void sq
3ca0: 6c 69 74 65 33 64 65 6d 6f 5f 73 75 70 65 72 75  lite3demo_superu
3cb0: 6e 6c 6f 63 6b 28 76 6f 69 64 20 2a 70 4c 6f 63  nlock(void *pLoc
3cc0: 6b 29 7b 0a 20 20 53 75 70 65 72 6c 6f 63 6b 20  k){.  Superlock 
3cd0: 2a 70 20 3d 20 28 53 75 70 65 72 6c 6f 63 6b 20  *p = (Superlock 
3ce0: 2a 29 70 4c 6f 63 6b 3b 0a 20 20 69 66 28 20 70  *)pLock;.  if( p
3cf0: 2d 3e 62 57 61 6c 20 29 7b 0a 20 20 20 20 69 6e  ->bWal ){.    in
3d00: 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
3d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3d20: 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
3d30: 20 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20      int flags = 
3d40: 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43  SQLITE_SHM_UNLOC
3d50: 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45  K | SQLITE_SHM_E
3d60: 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20 73 71  XCLUSIVE;.    sq
3d70: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 20 3d  lite3_file *fd =
3d80: 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   0;.    rc = sql
3d90: 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f  ite3_file_contro
3da0: 6c 28 70 2d 3e 64 62 2c 20 22 6d 61 69 6e 22 2c  l(p->db, "main",
3db0: 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 46 49   SQLITE_FCNTL_FI
3dc0: 4c 45 5f 50 4f 49 4e 54 45 52 2c 0a 20 20 20 20  LE_POINTER,.    
3dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3de0: 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 20 2a           (void *
3df0: 29 26 66 64 29 3b 0a 20 20 20 20 69 66 28 20 72  )&fd);.    if( r
3e00: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
3e10: 20 20 20 20 20 20 66 64 2d 3e 70 4d 65 74 68 6f        fd->pMetho
3e20: 64 73 2d 3e 78 53 68 6d 4c 6f 63 6b 28 66 64 2c  ds->xShmLock(fd,
3e30: 20 32 2c 20 31 2c 20 66 6c 61 67 73 29 3b 0a 20   2, 1, flags);. 
3e40: 20 20 20 20 20 66 64 2d 3e 70 4d 65 74 68 6f 64       fd->pMethod
3e50: 73 2d 3e 78 53 68 6d 4c 6f 63 6b 28 66 64 2c 20  s->xShmLock(fd, 
3e60: 33 2c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c  3, SQLITE_SHM_NL
3e70: 4f 43 4b 2d 33 2c 20 66 6c 61 67 73 29 3b 0a 20  OCK-3, flags);. 
3e80: 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
3e90: 65 33 5f 63 6c 6f 73 65 28 70 2d 3e 64 62 29 3b  e3_close(p->db);
3ea0: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
3eb0: 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 62 74  p);.}../*.** Obt
3ec0: 61 69 6e 20 61 20 73 75 70 65 72 6c 6f 63 6b 20  ain a superlock 
3ed0: 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
3ee0: 66 69 6c 65 20 69 64 65 6e 74 69 66 69 65 64 20  file identified 
3ef0: 62 79 20 7a 50 61 74 68 2c 20 75 73 69 6e 67 20  by zPath, using 
3f00: 74 68 65 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 70  the.** locking p
3f10: 72 69 6d 69 74 69 76 65 73 20 70 72 6f 76 69 64  rimitives provid
3f20: 65 64 20 62 79 20 56 46 53 20 7a 56 66 73 2e 20  ed by VFS zVfs. 
3f30: 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53  If successful, S
3f40: 51 4c 49 54 45 5f 4f 4b 20 69 73 0a 2a 2a 20 72  QLITE_OK is.** r
3f50: 65 74 75 72 6e 65 64 20 61 6e 64 20 6f 75 74 70  eturned and outp
3f60: 75 74 20 76 61 72 69 61 62 6c 65 20 2a 70 70 4c  ut variable *ppL
3f70: 6f 63 6b 20 69 73 20 70 6f 70 75 6c 61 74 65 64  ock is populated
3f80: 20 77 69 74 68 20 61 6e 20 6f 70 61 71 75 65 20   with an opaque 
3f90: 68 61 6e 64 6c 65 0a 2a 2a 20 74 68 61 74 20 6d  handle.** that m
3fa0: 61 79 20 62 65 20 75 73 65 64 20 77 69 74 68 20  ay be used with 
3fb0: 73 71 6c 69 74 65 33 64 65 6d 6f 5f 73 75 70 65  sqlite3demo_supe
3fc0: 72 75 6e 6c 6f 63 6b 28 29 20 74 6f 20 72 65 6c  runlock() to rel
3fd0: 65 61 73 65 20 74 68 65 20 6c 6f 63 6b 2e 0a 2a  ease the lock..*
3fe0: 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
3ff0: 20 6f 63 63 75 72 73 2c 20 2a 70 70 4c 6f 63 6b   occurs, *ppLock
4000: 20 69 73 20 73 65 74 20 74 6f 20 30 20 61 6e 64   is set to 0 and
4010: 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
4020: 20 63 6f 64 65 20 0a 2a 2a 20 28 65 2e 67 2e 20   code .** (e.g. 
4030: 53 51 4c 49 54 45 5f 42 55 53 59 29 20 69 73 20  SQLITE_BUSY) is 
4040: 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
4050: 49 66 20 61 20 72 65 71 75 69 72 65 64 20 6c 6f  If a required lo
4060: 63 6b 20 63 61 6e 6e 6f 74 20 62 65 20 6f 62 74  ck cannot be obt
4070: 61 69 6e 65 64 20 69 6d 6d 65 64 69 61 74 65 6c  ained immediatel
4080: 79 20 61 6e 64 20 74 68 65 20 78 42 75 73 79 20  y and the xBusy 
4090: 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20 74 6f 20  parameter.** to 
40a0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
40b0: 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20   not NULL, then 
40c0: 78 42 75 73 79 20 69 73 20 69 6e 76 6f 6b 65 64  xBusy is invoked
40d0: 20 69 6e 20 74 68 65 20 73 61 6d 65 20 77 61 79   in the same way
40e0: 0a 2a 2a 20 61 73 20 61 20 62 75 73 79 2d 68 61  .** as a busy-ha
40f0: 6e 64 6c 65 72 20 72 65 67 69 73 74 65 72 65 64  ndler registered
4100: 20 77 69 74 68 20 53 51 4c 69 74 65 20 28 75 73   with SQLite (us
4110: 69 6e 67 20 73 71 6c 69 74 65 33 5f 62 75 73 79  ing sqlite3_busy
4120: 5f 68 61 6e 64 6c 65 72 28 29 29 0a 2a 2a 20 75  _handler()).** u
4130: 6e 74 69 6c 20 65 69 74 68 65 72 20 74 68 65 20  ntil either the 
4140: 6c 6f 63 6b 20 63 61 6e 20 62 65 20 6f 62 74 61  lock can be obta
4150: 69 6e 65 64 20 6f 72 20 74 68 65 20 62 75 73 79  ined or the busy
4160: 2d 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f  -handler functio
4170: 6e 20 72 65 74 75 72 6e 73 0a 2a 2a 20 30 20 28  n returns.** 0 (
4180: 69 6e 64 69 63 61 74 69 6e 67 20 22 67 69 76 65  indicating "give
4190: 20 75 70 22 29 2e 0a 2a 2f 0a 73 74 61 74 69 63   up")..*/.static
41a0: 20 69 6e 74 20 73 71 6c 69 74 65 33 64 65 6d 6f   int sqlite3demo
41b0: 5f 73 75 70 65 72 6c 6f 63 6b 28 0a 20 20 63 6f  _superlock(.  co
41c0: 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c  nst char *zPath,
41d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
41e0: 20 50 61 74 68 20 74 6f 20 64 61 74 61 62 61 73   Path to databas
41f0: 65 20 66 69 6c 65 20 74 6f 20 6c 6f 63 6b 20 2a  e file to lock *
4200: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
4210: 7a 56 66 73 2c 20 20 20 20 20 20 20 20 20 20 20  zVfs,           
4220: 20 20 20 20 2f 2a 20 56 46 53 20 74 6f 20 75 73      /* VFS to us
4230: 65 20 74 6f 20 61 63 63 65 73 73 20 64 61 74 61  e to access data
4240: 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69  base file */.  i
4250: 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20  nt flags,       
4260: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
4270: 64 64 69 74 69 6f 6e 61 6c 20 66 6c 61 67 73 20  dditional flags 
4280: 74 6f 20 70 61 73 73 20 74 6f 20 73 71 6c 69 74  to pass to sqlit
4290: 65 33 5f 6f 70 65 6e 5f 76 32 20 2a 2f 0a 20 20  e3_open_v2 */.  
42a0: 69 6e 74 20 28 2a 78 42 75 73 79 29 28 76 6f 69  int (*xBusy)(voi
42b0: 64 2a 2c 69 6e 74 29 2c 20 20 20 20 20 20 20 20  d*,int),        
42c0: 2f 2a 20 42 75 73 79 20 68 61 6e 64 6c 65 72 20  /* Busy handler 
42d0: 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 76 6f  callback */.  vo
42e0: 69 64 20 2a 70 42 75 73 79 41 72 67 2c 20 20 20  id *pBusyArg,   
42f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4300: 20 43 6f 6e 74 65 78 74 20 61 72 67 20 66 6f 72   Context arg for
4310: 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 2a 2f   busy handler */
4320: 0a 20 20 76 6f 69 64 20 2a 2a 70 70 4c 6f 63 6b  .  void **ppLock
4330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4340: 20 20 20 2f 2a 20 4f 55 54 3a 20 43 6f 6e 74 65     /* OUT: Conte
4350: 78 74 20 74 6f 20 70 61 73 73 20 74 6f 20 73 75  xt to pass to su
4360: 70 65 72 75 6e 6c 6f 63 6b 28 29 20 2a 2f 0a 29  perunlock() */.)
4370: 7b 0a 20 20 53 75 70 65 72 6c 6f 63 6b 42 75 73  {.  SuperlockBus
4380: 79 20 62 75 73 79 20 3d 20 7b 30 2c 20 30 2c 20  y busy = {0, 0, 
4390: 30 7d 3b 20 2f 2a 20 42 75 73 79 20 68 61 6e 64  0}; /* Busy hand
43a0: 6c 65 72 20 77 72 61 70 70 65 72 20 6f 62 6a 65  ler wrapper obje
43b0: 63 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  ct */.  int rc; 
43c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
43d0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
43e0: 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 53 75 70 65  n code */.  Supe
43f0: 72 6c 6f 63 6b 20 2a 70 4c 6f 63 6b 3b 0a 0a 20  rlock *pLock;.. 
4400: 20 70 4c 6f 63 6b 20 3d 20 73 71 6c 69 74 65 33   pLock = sqlite3
4410: 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 53  _malloc(sizeof(S
4420: 75 70 65 72 6c 6f 63 6b 29 29 3b 0a 20 20 69 66  uperlock));.  if
4430: 28 20 21 70 4c 6f 63 6b 20 29 20 72 65 74 75 72  ( !pLock ) retur
4440: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
4450: 20 20 6d 65 6d 73 65 74 28 70 4c 6f 63 6b 2c 20    memset(pLock, 
4460: 30 2c 20 73 69 7a 65 6f 66 28 53 75 70 65 72 6c  0, sizeof(Superl
4470: 6f 63 6b 29 29 3b 0a 0a 20 20 2f 2a 20 4f 70 65  ock));..  /* Ope
4480: 6e 20 61 20 64 61 74 61 62 61 73 65 20 68 61 6e  n a database han
4490: 64 6c 65 20 6f 6e 20 74 68 65 20 66 69 6c 65 20  dle on the file 
44a0: 74 6f 20 73 75 70 65 72 6c 6f 63 6b 2e 20 2a 2f  to superlock. */
44b0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
44c0: 6f 70 65 6e 5f 76 32 28 0a 20 20 20 20 20 20 7a  open_v2(.      z
44d0: 50 61 74 68 2c 20 26 70 4c 6f 63 6b 2d 3e 64 62  Path, &pLock->db
44e0: 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  , SQLITE_OPEN_RE
44f0: 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f  ADWRITE|SQLITE_O
4500: 50 45 4e 5f 43 52 45 41 54 45 7c 66 6c 61 67 73  PEN_CREATE|flags
4510: 2c 20 7a 56 66 73 0a 20 20 29 3b 0a 0a 20 20 2f  , zVfs.  );..  /
4520: 2a 20 49 6e 73 74 61 6c 6c 20 61 20 62 75 73 79  * Install a busy
4530: 2d 68 61 6e 64 6c 65 72 20 61 6e 64 20 65 78 65  -handler and exe
4540: 63 75 74 65 20 61 20 42 45 47 49 4e 20 45 58 43  cute a BEGIN EXC
4550: 4c 55 53 49 56 45 2e 20 49 66 20 74 68 69 73 20  LUSIVE. If this 
4560: 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 61 20 57 41  is not.  ** a WA
4570: 4c 20 64 61 74 61 62 61 73 65 2c 20 74 68 69 73  L database, this
4580: 20 69 73 20 61 6c 6c 20 77 65 20 6e 65 65 64 20   is all we need 
4590: 74 6f 20 64 6f 2e 20 20 0a 20 20 2a 2a 0a 20 20  to do.  .  **.  
45a0: 2a 2a 20 41 20 77 72 61 70 70 65 72 20 66 75 6e  ** A wrapper fun
45b0: 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ction is used to
45c0: 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79   invoke the busy
45d0: 2d 68 61 6e 64 6c 65 72 20 69 6e 73 74 65 61 64  -handler instead
45e0: 20 6f 66 0a 20 20 2a 2a 20 72 65 67 69 73 74 65   of.  ** registe
45f0: 72 69 6e 67 20 74 68 65 20 62 75 73 79 2d 68 61  ring the busy-ha
4600: 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e 20 73  ndler function s
4610: 75 70 70 6c 69 65 64 20 62 79 20 74 68 65 20 75  upplied by the u
4620: 73 65 72 20 64 69 72 65 63 74 6c 79 0a 20 20 2a  ser directly.  *
4630: 2a 20 77 69 74 68 20 53 51 4c 69 74 65 2e 20 54  * with SQLite. T
4640: 68 69 73 20 69 73 20 62 65 63 61 75 73 65 20 74  his is because t
4650: 68 65 20 73 61 6d 65 20 62 75 73 79 2d 68 61 6e  he same busy-han
4660: 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e 20 6d 61  dler function ma
4670: 79 20 62 65 0a 20 20 2a 2a 20 69 6e 76 6f 6b 65  y be.  ** invoke
4680: 64 20 64 69 72 65 63 74 6c 79 20 6c 61 74 65 72  d directly later
4690: 20 6f 6e 20 77 68 65 6e 20 61 74 74 65 6d 70 74   on when attempt
46a0: 69 6e 67 20 74 6f 20 6f 62 74 61 69 6e 20 74 68  ing to obtain th
46b0: 65 20 65 78 74 72 61 20 6c 6f 63 6b 73 0a 20 20  e extra locks.  
46c0: 2a 2a 20 72 65 71 75 69 72 65 64 20 69 6e 20 57  ** required in W
46d0: 41 4c 20 6d 6f 64 65 2e 20 42 79 20 75 73 69 6e  AL mode. By usin
46e0: 67 20 74 68 65 20 77 72 61 70 70 65 72 2c 20 77  g the wrapper, w
46f0: 65 20 61 72 65 20 61 62 6c 65 20 74 6f 20 67 75  e are able to gu
4700: 61 72 61 6e 74 65 65 0a 20 20 2a 2a 20 74 68 61  arantee.  ** tha
4710: 74 20 74 68 65 20 22 6e 42 75 73 79 22 20 69 6e  t the "nBusy" in
4720: 74 65 67 65 72 20 70 61 72 61 6d 65 74 65 72 20  teger parameter 
4730: 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 75 73  passed to the us
4740: 65 72 73 20 62 75 73 79 2d 68 61 6e 64 6c 65 72  ers busy-handler
4750: 0a 20 20 2a 2a 20 72 65 70 72 65 73 65 6e 74 73  .  ** represents
4760: 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65   the total numbe
4770: 72 20 6f 66 20 62 75 73 79 2d 68 61 6e 64 6c 65  r of busy-handle
4780: 72 20 69 6e 76 6f 63 61 74 69 6f 6e 73 20 6d 61  r invocations ma
4790: 64 65 20 77 69 74 68 69 6e 0a 20 20 2a 2a 20 74  de within.  ** t
47a0: 68 69 73 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  his call to sqli
47b0: 74 65 33 64 65 6d 6f 5f 73 75 70 65 72 6c 6f 63  te3demo_superloc
47c0: 6b 28 29 2c 20 69 6e 63 6c 75 64 69 6e 67 20 61  k(), including a
47d0: 6e 79 20 6d 61 64 65 20 64 75 72 69 6e 67 20 74  ny made during t
47e0: 68 65 0a 20 20 2a 2a 20 22 42 45 47 49 4e 20 45  he.  ** "BEGIN E
47f0: 58 43 4c 55 53 49 56 45 22 2e 0a 20 20 2a 2f 0a  XCLUSIVE"..  */.
4800: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
4810: 5f 4f 4b 20 29 7b 0a 20 20 20 20 62 75 73 79 2e  _OK ){.    busy.
4820: 78 42 75 73 79 20 3d 20 78 42 75 73 79 3b 0a 20  xBusy = xBusy;. 
4830: 20 20 20 62 75 73 79 2e 70 42 75 73 79 41 72 67     busy.pBusyArg
4840: 20 3d 20 70 42 75 73 79 41 72 67 3b 0a 20 20 20   = pBusyArg;.   
4850: 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 68 61   sqlite3_busy_ha
4860: 6e 64 6c 65 72 28 70 4c 6f 63 6b 2d 3e 64 62 2c  ndler(pLock->db,
4870: 20 73 75 70 65 72 6c 6f 63 6b 42 75 73 79 48 61   superlockBusyHa
4880: 6e 64 6c 65 72 2c 20 28 76 6f 69 64 20 2a 29 26  ndler, (void *)&
4890: 62 75 73 79 29 3b 0a 20 20 20 20 72 63 20 3d 20  busy);.    rc = 
48a0: 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 4c 6f  sqlite3_exec(pLo
48b0: 63 6b 2d 3e 64 62 2c 20 22 42 45 47 49 4e 20 45  ck->db, "BEGIN E
48c0: 58 43 4c 55 53 49 56 45 22 2c 20 30 2c 20 30 2c  XCLUSIVE", 0, 0,
48d0: 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49   0);.  }..  /* I
48e0: 66 20 74 68 65 20 42 45 47 49 4e 20 45 58 43 4c  f the BEGIN EXCL
48f0: 55 53 49 56 45 20 77 61 73 20 65 78 65 63 75 74  USIVE was execut
4900: 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  ed successfully 
4910: 61 6e 64 20 74 68 69 73 20 69 73 20 61 20 57 41  and this is a WA
4920: 4c 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2c  L.  ** database,
4930: 20 63 61 6c 6c 20 73 75 70 65 72 6c 6f 63 6b 57   call superlockW
4940: 61 6c 4c 6f 63 6b 28 29 20 74 6f 20 6f 62 74 61  alLock() to obta
4950: 69 6e 20 74 68 65 20 65 78 74 72 61 20 6c 6f 63  in the extra loc
4960: 6b 73 20 72 65 71 75 69 72 65 64 0a 20 20 2a 2a  ks required.  **
4970: 20 74 6f 20 70 72 65 76 65 6e 74 20 72 65 61 64   to prevent read
4980: 65 72 73 2c 20 77 72 69 74 65 72 73 20 61 6e 64  ers, writers and
4990: 2f 6f 72 20 63 68 65 63 6b 70 6f 69 6e 74 65 72  /or checkpointer
49a0: 73 20 66 72 6f 6d 20 61 63 63 65 73 73 69 6e 67  s from accessing
49b0: 20 74 68 65 0a 20 20 2a 2a 20 64 62 20 77 68 69   the.  ** db whi
49c0: 6c 65 20 74 68 69 73 20 70 72 6f 63 65 73 73 20  le this process 
49d0: 69 73 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 73  is holding the s
49e0: 75 70 65 72 6c 6f 63 6b 2e 0a 20 20 2a 2a 0a 20  uperlock..  **. 
49f0: 20 2a 2a 20 42 65 66 6f 72 65 20 61 74 74 65 6d   ** Before attem
4a00: 70 74 69 6e 67 20 61 6e 79 20 57 41 4c 20 6c 6f  pting any WAL lo
4a10: 63 6b 73 2c 20 63 6f 6d 6d 69 74 20 74 68 65 20  cks, commit the 
4a20: 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 74 61 72  transaction star
4a30: 74 65 64 20 61 62 6f 76 65 0a 20 20 2a 2a 20 74  ted above.  ** t
4a40: 6f 20 64 72 6f 70 20 74 68 65 20 57 41 4c 20 72  o drop the WAL r
4a50: 65 61 64 20 61 6e 64 20 77 72 69 74 65 20 6c 6f  ead and write lo
4a60: 63 6b 73 20 63 75 72 72 65 6e 74 6c 79 20 68 65  cks currently he
4a70: 6c 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74  ld. Otherwise, t
4a80: 68 65 0a 20 20 2a 2a 20 6e 65 77 20 57 41 4c 20  he.  ** new WAL 
4a90: 6c 6f 63 6b 73 20 6d 61 79 20 63 6f 6e 66 6c 69  locks may confli
4aa0: 63 74 20 77 69 74 68 20 74 68 65 20 6f 6c 64 2e  ct with the old.
4ab0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d  .  */.  if( rc==
4ac0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
4ad0: 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d   if( SQLITE_OK==
4ae0: 28 72 63 20 3d 20 73 75 70 65 72 6c 6f 63 6b 49  (rc = superlockI
4af0: 73 57 61 6c 28 70 4c 6f 63 6b 29 29 20 26 26 20  sWal(pLock)) && 
4b00: 70 4c 6f 63 6b 2d 3e 62 57 61 6c 20 29 7b 0a 20  pLock->bWal ){. 
4b10: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
4b20: 33 5f 65 78 65 63 28 70 4c 6f 63 6b 2d 3e 64 62  3_exec(pLock->db
4b30: 2c 20 22 43 4f 4d 4d 49 54 22 2c 20 30 2c 20 30  , "COMMIT", 0, 0
4b40: 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
4b50: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
4b60: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 75  .        rc = su
4b70: 70 65 72 6c 6f 63 6b 57 61 6c 4c 6f 63 6b 28 70  perlockWalLock(p
4b80: 4c 6f 63 6b 2d 3e 64 62 2c 20 26 62 75 73 79 29  Lock->db, &busy)
4b90: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
4ba0: 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d 53    }..  if( rc!=S
4bb0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
4bc0: 73 71 6c 69 74 65 33 64 65 6d 6f 5f 73 75 70 65  sqlite3demo_supe
4bd0: 72 75 6e 6c 6f 63 6b 28 70 4c 6f 63 6b 29 3b 0a  runlock(pLock);.
4be0: 20 20 20 20 2a 70 70 4c 6f 63 6b 20 3d 20 30 3b      *ppLock = 0;
4bf0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70  .  }else{.    *p
4c00: 70 4c 6f 63 6b 20 3d 20 70 4c 6f 63 6b 3b 0a 20  pLock = pLock;. 
4c10: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
4c20: 0a 7d 0a 0a 2f 2a 20 41 20 63 6f 72 72 75 70 74  .}../* A corrupt
4c30: 20 44 42 20 77 6f 6e 27 74 20 77 6f 72 6b 20 77   DB won't work w
4c40: 69 74 68 20 74 68 65 20 73 71 6c 2d 62 61 73 65  ith the sql-base
4c50: 64 20 6c 6f 63 6b 69 6e 67 20 61 74 74 65 6d 70  d locking attemp
4c60: 74 2c 20 67 72 61 62 20 61 6e 20 0a 2a 2a 20 65  t, grab an .** e
4c70: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 61 6e  xclusive lock an
4c80: 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  d return SQLITE_
4c90: 4f 4b 20 6f 72 20 53 51 4c 49 54 45 5f 42 55 53  OK or SQLITE_BUS
4ca0: 59 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 66 61  Y if the lock fa
4cb0: 69 6c 73 20 0a 2a 2a 20 72 65 74 75 72 6e 73 20  ils .** returns 
4cc0: 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 6b  the current lock
4cd0: 20 6c 65 76 65 6c 20 68 65 6c 64 20 6f 6e 20 73   level held on s
4ce0: 71 6c 69 74 65 33 5f 66 69 6c 65 0a 2a 2f 0a 73  qlite3_file.*/.s
4cf0: 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65  tatic int sqlite
4d00: 33 64 65 6d 6f 5f 73 75 70 65 72 6c 6f 63 6b 5f  3demo_superlock_
4d10: 63 6f 72 72 75 70 74 28 0a 20 20 73 71 6c 69 74  corrupt(.  sqlit
4d20: 65 33 5f 66 69 6c 65 20 2a 69 64 2c 0a 20 20 69  e3_file *id,.  i
4d30: 6e 74 20 65 54 61 72 67 65 74 46 69 6c 65 4c 6f  nt eTargetFileLo
4d40: 63 6b 2c 0a 20 20 69 6e 74 20 2a 70 46 69 6c 65  ck,.  int *pFile
4d50: 4c 6f 63 6b 0a 29 7b 0a 20 20 75 6e 69 78 46 69  Lock.){.  unixFi
4d60: 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
4d70: 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74  xFile*)id;.  int
4d80: 20 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 70 46 69   eFileLock = pFi
4d90: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20  le->eFileLock;. 
4da0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
4db0: 5f 4f 4b 3b 0a 20 20 0a 20 20 69 66 28 20 65 46  _OK;.  .  if( eF
4dc0: 69 6c 65 4c 6f 63 6b 3c 65 54 61 72 67 65 74 46  ileLock<eTargetF
4dd0: 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72  ileLock ){.    r
4de0: 63 20 3d 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68  c = pFile->pMeth
4df0: 6f 64 2d 3e 78 4c 6f 63 6b 28 69 64 2c 20 53 51  od->xLock(id, SQ
4e00: 4c 49 54 45 5f 4c 4f 43 4b 5f 53 48 41 52 45 44  LITE_LOCK_SHARED
4e10: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 72 63  );.  }.  if( !rc
4e20: 20 26 26 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f   && SQLITE_LOCK_
4e30: 53 48 41 52 45 44 3c 65 54 61 72 67 65 74 46 69  SHARED<eTargetFi
4e40: 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72 63  leLock ){.    rc
4e50: 20 3d 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f   = pFile->pMetho
4e60: 64 2d 3e 78 4c 6f 63 6b 28 69 64 2c 20 53 51 4c  d->xLock(id, SQL
4e70: 49 54 45 5f 4c 4f 43 4b 5f 45 58 43 4c 55 53 49  ITE_LOCK_EXCLUSI
4e80: 56 45 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  VE);.  }.  if( r
4e90: 63 20 29 7b 0a 20 20 20 20 69 66 28 20 70 46 69  c ){.    if( pFi
4ea0: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3e 20  le->eFileLock > 
4eb0: 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20  eFileLock ){.   
4ec0: 20 20 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f     pFile->pMetho
4ed0: 64 2d 3e 78 55 6e 6c 6f 63 6b 28 69 64 2c 20 65  d->xUnlock(id, e
4ee0: 46 69 6c 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 7d  FileLock);.    }
4ef0: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
4f00: 20 20 7d 0a 20 20 69 66 20 28 70 46 69 6c 65 4c    }.  if (pFileL
4f10: 6f 63 6b 29 20 7b 0a 20 20 20 20 2a 70 46 69 6c  ock) {.    *pFil
4f20: 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63  eLock = eFileLoc
4f30: 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  k;.  }.  return 
4f40: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 73 74  SQLITE_OK;.}..st
4f50: 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33  atic int sqlite3
4f60: 64 65 6d 6f 5f 73 75 70 65 72 75 6e 6c 6f 63 6b  demo_superunlock
4f70: 5f 63 6f 72 72 75 70 74 28 73 71 6c 69 74 65 33  _corrupt(sqlite3
4f80: 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65  _file *id, int e
4f90: 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e  FileLock) {.  un
4fa0: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
4fb0: 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
4fc0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
4fd0: 5f 4f 4b 3b 0a 20 20 0a 20 20 69 66 28 20 70 46  _OK;.  .  if( pF
4fe0: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3e  ile->eFileLock >
4ff0: 20 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20   eFileLock ){.  
5000: 20 20 72 63 20 3d 20 70 46 69 6c 65 2d 3e 70 4d    rc = pFile->pM
5010: 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28 69  ethod->xUnlock(i
5020: 64 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 53  d, SQLITE_LOCK_S
5030: 48 41 52 45 44 29 3b 0a 20 20 7d 0a 20 20 69 66  HARED);.  }.  if
5040: 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ( pFile->eFileLo
5050: 63 6b 20 3e 20 65 46 69 6c 65 4c 6f 63 6b 20 29  ck > eFileLock )
5060: 7b 0a 20 20 20 20 69 6e 74 20 75 6e 6c 6f 63 6b  {.    int unlock
5070: 52 43 20 3d 20 70 46 69 6c 65 2d 3e 70 4d 65 74  RC = pFile->pMet
5080: 68 6f 64 2d 3e 78 55 6e 6c 6f 63 6b 28 69 64 2c  hod->xUnlock(id,
5090: 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 4e 4f 4e   SQLITE_LOCK_NON
50a0: 45 29 3b 0a 20 20 20 20 69 66 20 28 21 72 63 29  E);.    if (!rc)
50b0: 20 72 63 20 3d 20 75 6e 6c 6f 63 6b 52 43 3b 0a   rc = unlockRC;.
50c0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
50d0: 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  .}..#endif /* SQ
50e0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 55 50 45  LITE_ENABLE_SUPE
50f0: 52 4c 4f 43 4b 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a  RLOCK */.../*.**
5100: 20 48 41 56 45 5f 4d 52 45 4d 41 50 20 64 65 66   HAVE_MREMAP def
5110: 61 75 6c 74 73 20 74 6f 20 74 72 75 65 20 6f 6e  aults to true on
5120: 20 4c 69 6e 75 78 20 61 6e 64 20 66 61 6c 73 65   Linux and false
5130: 20 65 76 65 72 79 77 68 65 72 65 20 65 6c 73 65   everywhere else
5140: 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65  ..*/.#if !define
5150: 64 28 48 41 56 45 5f 4d 52 45 4d 41 50 29 0a 23  d(HAVE_MREMAP).#
5160: 20 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 6c 69   if defined(__li
5170: 6e 75 78 5f 5f 29 20 26 26 20 64 65 66 69 6e 65  nux__) && define
5180: 64 28 5f 47 4e 55 5f 53 4f 55 52 43 45 29 0a 23  d(_GNU_SOURCE).#
5190: 20 20 64 65 66 69 6e 65 20 48 41 56 45 5f 4d 52    define HAVE_MR
51a0: 45 4d 41 50 20 31 0a 23 20 65 6c 73 65 0a 23 20  EMAP 1.# else.# 
51b0: 20 64 65 66 69 6e 65 20 48 41 56 45 5f 4d 52 45   define HAVE_MRE
51c0: 4d 41 50 20 30 0a 23 20 65 6e 64 69 66 0a 23 65  MAP 0.# endif.#e
51d0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 45 78 70 6c  ndif../*.** Expl
51e0: 69 63 69 74 6c 79 20 63 61 6c 6c 20 74 68 65 20  icitly call the 
51f0: 36 34 2d 62 69 74 20 76 65 72 73 69 6f 6e 20 6f  64-bit version o
5200: 66 20 6c 73 65 65 6b 28 29 20 6f 6e 20 41 6e 64  f lseek() on And
5210: 72 6f 69 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  roid. Otherwise,
5220: 20 6c 73 65 65 6b 28 29 0a 2a 2a 20 69 73 20 74   lseek().** is t
5230: 68 65 20 33 32 2d 62 69 74 20 76 65 72 73 69 6f  he 32-bit versio
5240: 6e 2c 20 65 76 65 6e 20 69 66 20 5f 46 49 4c 45  n, even if _FILE
5250: 5f 4f 46 46 53 45 54 5f 42 49 54 53 3d 36 34 20  _OFFSET_BITS=64 
5260: 69 73 20 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 23  is defined..*/.#
5270: 69 66 64 65 66 20 5f 5f 41 4e 44 52 4f 49 44 5f  ifdef __ANDROID_
5280: 5f 0a 23 20 64 65 66 69 6e 65 20 6c 73 65 65 6b  _.# define lseek
5290: 20 6c 73 65 65 6b 36 34 0a 23 65 6e 64 69 66 0a   lseek64.#endif.
52a0: 0a 23 69 66 64 65 66 20 5f 5f 6c 69 6e 75 78 5f  .#ifdef __linux_
52b0: 5f 0a 2f 2a 0a 2a 2a 20 4c 69 6e 75 78 2d 73 70  _./*.** Linux-sp
52c0: 65 63 69 66 69 63 20 49 4f 43 54 4c 20 6d 61 67  ecific IOCTL mag
52d0: 69 63 20 6e 75 6d 62 65 72 73 20 75 73 65 64 20  ic numbers used 
52e0: 66 6f 72 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20  for controlling 
52f0: 46 32 46 53 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  F2FS.*/.#define 
5300: 46 32 46 53 5f 49 4f 43 54 4c 5f 4d 41 47 49 43  F2FS_IOCTL_MAGIC
5310: 20 20 20 20 20 20 20 20 30 78 66 35 0a 23 64 65          0xf5.#de
5320: 66 69 6e 65 20 46 32 46 53 5f 49 4f 43 5f 53 54  fine F2FS_IOC_ST
5330: 41 52 54 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45  ART_ATOMIC_WRITE
5340: 20 20 20 20 20 5f 49 4f 28 46 32 46 53 5f 49 4f       _IO(F2FS_IO
5350: 43 54 4c 5f 4d 41 47 49 43 2c 20 31 29 0a 23 64  CTL_MAGIC, 1).#d
5360: 65 66 69 6e 65 20 46 32 46 53 5f 49 4f 43 5f 43  efine F2FS_IOC_C
5370: 4f 4d 4d 49 54 5f 41 54 4f 4d 49 43 5f 57 52 49  OMMIT_ATOMIC_WRI
5380: 54 45 20 20 20 20 5f 49 4f 28 46 32 46 53 5f 49  TE    _IO(F2FS_I
5390: 4f 43 54 4c 5f 4d 41 47 49 43 2c 20 32 29 0a 23  OCTL_MAGIC, 2).#
53a0: 64 65 66 69 6e 65 20 46 32 46 53 5f 49 4f 43 5f  define F2FS_IOC_
53b0: 53 54 41 52 54 5f 56 4f 4c 41 54 49 4c 45 5f 57  START_VOLATILE_W
53c0: 52 49 54 45 20 20 20 5f 49 4f 28 46 32 46 53 5f  RITE   _IO(F2FS_
53d0: 49 4f 43 54 4c 5f 4d 41 47 49 43 2c 20 33 29 0a  IOCTL_MAGIC, 3).
53e0: 23 64 65 66 69 6e 65 20 46 32 46 53 5f 49 4f 43  #define F2FS_IOC
53f0: 5f 41 42 4f 52 54 5f 56 4f 4c 41 54 49 4c 45 5f  _ABORT_VOLATILE_
5400: 57 52 49 54 45 20 20 20 5f 49 4f 28 46 32 46 53  WRITE   _IO(F2FS
5410: 5f 49 4f 43 54 4c 5f 4d 41 47 49 43 2c 20 35 29  _IOCTL_MAGIC, 5)
5420: 0a 23 64 65 66 69 6e 65 20 46 32 46 53 5f 49 4f  .#define F2FS_IO
5430: 43 5f 47 45 54 5f 46 45 41 54 55 52 45 53 20 20  C_GET_FEATURES  
5440: 20 20 20 20 20 20 20 20 20 5f 49 4f 52 28 46 32           _IOR(F2
5450: 46 53 5f 49 4f 43 54 4c 5f 4d 41 47 49 43 2c 20  FS_IOCTL_MAGIC, 
5460: 31 32 2c 20 75 33 32 29 0a 23 64 65 66 69 6e 65  12, u32).#define
5470: 20 46 32 46 53 5f 46 45 41 54 55 52 45 5f 41 54   F2FS_FEATURE_AT
5480: 4f 4d 49 43 5f 57 52 49 54 45 20 30 78 30 30 30  OMIC_WRITE 0x000
5490: 34 0a 23 65 6e 64 69 66 20 2f 2a 20 5f 5f 6c 69  4.#endif /* __li
54a0: 6e 75 78 5f 5f 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a  nux__ */.../*.**
54b0: 20 44 69 66 66 65 72 65 6e 74 20 55 6e 69 78 20   Different Unix 
54c0: 73 79 73 74 65 6d 73 20 64 65 63 6c 61 72 65 20  systems declare 
54d0: 6f 70 65 6e 28 29 20 69 6e 20 64 69 66 66 65 72  open() in differ
54e0: 65 6e 74 20 77 61 79 73 2e 20 20 53 61 6d 65 20  ent ways.  Same 
54f0: 75 73 65 0a 2a 2a 20 6f 70 65 6e 28 63 6f 6e 73  use.** open(cons
5500: 74 20 63 68 61 72 2a 2c 69 6e 74 2c 6d 6f 64 65  t char*,int,mode
5510: 5f 74 29 2e 20 20 4f 74 68 65 72 73 20 75 73 65  _t).  Others use
5520: 20 6f 70 65 6e 28 63 6f 6e 73 74 20 63 68 61 72   open(const char
5530: 2a 2c 69 6e 74 2c 2e 2e 2e 29 2e 0a 2a 2a 20 54  *,int,...)..** T
5540: 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 69 73  he difference is
5550: 20 69 6d 70 6f 72 74 61 6e 74 20 77 68 65 6e 20   important when 
5560: 75 73 69 6e 67 20 61 20 70 6f 69 6e 74 65 72 20  using a pointer 
5570: 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 2e  to the function.
5580: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 61 66 65 73  .**.** The safes
5590: 74 20 77 61 79 20 74 6f 20 64 65 61 6c 20 77 69  t way to deal wi
55a0: 74 68 20 74 68 65 20 70 72 6f 62 6c 65 6d 20 69  th the problem i
55b0: 73 20 74 6f 20 61 6c 77 61 79 73 20 75 73 65 20  s to always use 
55c0: 74 68 69 73 20 77 72 61 70 70 65 72 0a 2a 2a 20  this wrapper.** 
55d0: 77 68 69 63 68 20 61 6c 77 61 79 73 20 68 61 73  which always has
55e0: 20 74 68 65 20 73 61 6d 65 20 77 65 6c 6c 2d 64   the same well-d
55f0: 65 66 69 6e 65 64 20 69 6e 74 65 72 66 61 63 65  efined interface
5600: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
5610: 70 6f 73 69 78 4f 70 65 6e 28 63 6f 6e 73 74 20  posixOpen(const 
5620: 63 68 61 72 20 2a 7a 46 69 6c 65 2c 20 69 6e 74  char *zFile, int
5630: 20 66 6c 61 67 73 2c 20 69 6e 74 20 6d 6f 64 65   flags, int mode
5640: 29 7b 0a 20 20 72 65 74 75 72 6e 20 6f 70 65 6e  ){.  return open
5650: 28 7a 46 69 6c 65 2c 20 66 6c 61 67 73 2c 20 6d  (zFile, flags, m
5660: 6f 64 65 29 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77  ode);.}../* Forw
5670: 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f  ard reference */
5680: 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 70 65 6e  .static int open
5690: 44 69 72 65 63 74 6f 72 79 28 63 6f 6e 73 74 20  Directory(const 
56a0: 63 68 61 72 2a 2c 20 69 6e 74 2a 29 3b 0a 73 74  char*, int*);.st
56b0: 61 74 69 63 20 69 6e 74 20 75 6e 69 78 47 65 74  atic int unixGet
56c0: 70 61 67 65 73 69 7a 65 28 76 6f 69 64 29 3b 0a  pagesize(void);.
56d0: 0a 2f 2a 0a 2a 2a 20 4d 61 6e 79 20 73 79 73 74  ./*.** Many syst
56e0: 65 6d 20 63 61 6c 6c 73 20 61 72 65 20 61 63 63  em calls are acc
56f0: 65 73 73 65 64 20 74 68 72 6f 75 67 68 20 70 6f  essed through po
5700: 69 6e 74 65 72 2d 74 6f 2d 66 75 6e 63 74 69 6f  inter-to-functio
5710: 6e 73 20 73 6f 20 74 68 61 74 0a 2a 2a 20 74 68  ns so that.** th
5720: 65 79 20 6d 61 79 20 62 65 20 6f 76 65 72 72 69  ey may be overri
5730: 64 64 65 6e 20 61 74 20 72 75 6e 74 69 6d 65 20  dden at runtime 
5740: 74 6f 20 66 61 63 69 6c 69 74 61 74 65 20 66 61  to facilitate fa
5750: 75 6c 74 20 69 6e 6a 65 63 74 69 6f 6e 20 64 75  ult injection du
5760: 72 69 6e 67 0a 2a 2a 20 74 65 73 74 69 6e 67 20  ring.** testing 
5770: 61 6e 64 20 73 61 6e 64 62 6f 78 69 6e 67 2e 20  and sandboxing. 
5780: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   The following a
5790: 72 72 61 79 20 68 6f 6c 64 73 20 74 68 65 20 6e  rray holds the n
57a0: 61 6d 65 73 20 61 6e 64 20 70 6f 69 6e 74 65 72  ames and pointer
57b0: 73 0a 2a 2a 20 74 6f 20 61 6c 6c 20 6f 76 65 72  s.** to all over
57c0: 72 69 64 65 61 62 6c 65 20 73 79 73 74 65 6d 20  rideable system 
57d0: 63 61 6c 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  calls..*/.static
57e0: 20 73 74 72 75 63 74 20 75 6e 69 78 5f 73 79 73   struct unix_sys
57f0: 63 61 6c 6c 20 7b 0a 20 20 63 6f 6e 73 74 20 63  call {.  const c
5800: 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20  har *zName;     
5810: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
5820: 66 20 74 68 65 20 73 79 73 74 65 6d 20 63 61 6c  f the system cal
5830: 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73  l */.  sqlite3_s
5840: 79 73 63 61 6c 6c 5f 70 74 72 20 70 43 75 72 72  yscall_ptr pCurr
5850: 65 6e 74 3b 20 2f 2a 20 43 75 72 72 65 6e 74 20  ent; /* Current 
5860: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 73 79 73  value of the sys
5870: 74 65 6d 20 63 61 6c 6c 20 2a 2f 0a 20 20 73 71  tem call */.  sq
5880: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
5890: 72 20 70 44 65 66 61 75 6c 74 3b 20 2f 2a 20 44  r pDefault; /* D
58a0: 65 66 61 75 6c 74 20 76 61 6c 75 65 20 2a 2f 0a  efault value */.
58b0: 7d 20 61 53 79 73 63 61 6c 6c 5b 5d 20 3d 20 7b  } aSyscall[] = {
58c0: 0a 20 20 7b 20 22 6f 70 65 6e 22 2c 20 20 20 20  .  { "open",    
58d0: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
58e0: 73 63 61 6c 6c 5f 70 74 72 29 70 6f 73 69 78 4f  scall_ptr)posixO
58f0: 70 65 6e 2c 20 20 30 20 20 7d 2c 0a 23 64 65 66  pen,  0  },.#def
5900: 69 6e 65 20 6f 73 4f 70 65 6e 20 20 20 20 20 20  ine osOpen      
5910: 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63  ((int(*)(const c
5920: 68 61 72 2a 2c 69 6e 74 2c 69 6e 74 29 29 61 53  har*,int,int))aS
5930: 79 73 63 61 6c 6c 5b 30 5d 2e 70 43 75 72 72 65  yscall[0].pCurre
5940: 6e 74 29 0a 0a 20 20 7b 20 22 63 6c 6f 73 65 22  nt)..  { "close"
5950: 2c 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65  ,        (sqlite
5960: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 63 6c  3_syscall_ptr)cl
5970: 6f 73 65 2c 20 20 20 20 20 20 30 20 20 7d 2c 0a  ose,      0  },.
5980: 23 64 65 66 69 6e 65 20 6f 73 43 6c 6f 73 65 20  #define osClose 
5990: 20 20 20 20 28 28 69 6e 74 28 2a 29 28 69 6e 74      ((int(*)(int
59a0: 29 29 61 53 79 73 63 61 6c 6c 5b 31 5d 2e 70 43  ))aSyscall[1].pC
59b0: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 61 63  urrent)..  { "ac
59c0: 63 65 73 73 22 2c 20 20 20 20 20 20 20 28 73 71  cess",       (sq
59d0: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
59e0: 72 29 61 63 63 65 73 73 2c 20 20 20 20 20 30 20  r)access,     0 
59f0: 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 41 63   },.#define osAc
5a00: 63 65 73 73 20 20 20 20 28 28 69 6e 74 28 2a 29  cess    ((int(*)
5a10: 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74  (const char*,int
5a20: 29 29 61 53 79 73 63 61 6c 6c 5b 32 5d 2e 70 43  ))aSyscall[2].pC
5a30: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 67 65  urrent)..  { "ge
5a40: 74 63 77 64 22 2c 20 20 20 20 20 20 20 28 73 71  tcwd",       (sq
5a50: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
5a60: 72 29 67 65 74 63 77 64 2c 20 20 20 20 20 30 20  r)getcwd,     0 
5a70: 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 47 65   },.#define osGe
5a80: 74 63 77 64 20 20 20 20 28 28 63 68 61 72 2a 28  tcwd    ((char*(
5a90: 2a 29 28 63 68 61 72 2a 2c 73 69 7a 65 5f 74 29  *)(char*,size_t)
5aa0: 29 61 53 79 73 63 61 6c 6c 5b 33 5d 2e 70 43 75  )aSyscall[3].pCu
5ab0: 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 73 74 61  rrent)..  { "sta
5ac0: 74 22 2c 20 20 20 20 20 20 20 20 20 28 73 71 6c  t",         (sql
5ad0: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
5ae0: 29 73 74 61 74 2c 20 20 20 20 20 20 20 30 20 20  )stat,       0  
5af0: 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 53 74 61  },.#define osSta
5b00: 74 20 20 20 20 20 20 28 28 69 6e 74 28 2a 29 28  t      ((int(*)(
5b10: 63 6f 6e 73 74 20 63 68 61 72 2a 2c 73 74 72 75  const char*,stru
5b20: 63 74 20 73 74 61 74 2a 29 29 61 53 79 73 63 61  ct stat*))aSysca
5b30: 6c 6c 5b 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a  ll[4].pCurrent).
5b40: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 44 4a 47 50 50  ./*.** The DJGPP
5b50: 20 63 6f 6d 70 69 6c 65 72 20 65 6e 76 69 72 6f   compiler enviro
5b60: 6e 6d 65 6e 74 20 6c 6f 6f 6b 73 20 6d 6f 73 74  nment looks most
5b70: 6c 79 20 6c 69 6b 65 20 55 6e 69 78 2c 20 62 75  ly like Unix, bu
5b80: 74 20 69 74 0a 2a 2a 20 6c 61 63 6b 73 20 74 68  t it.** lacks th
5b90: 65 20 66 63 6e 74 6c 28 29 20 73 79 73 74 65 6d  e fcntl() system
5ba0: 20 63 61 6c 6c 2e 20 20 53 6f 20 72 65 64 65 66   call.  So redef
5bb0: 69 6e 65 20 66 63 6e 74 6c 28 29 20 74 6f 20 62  ine fcntl() to b
5bc0: 65 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 74  e something.** t
5bd0: 68 61 74 20 61 6c 77 61 79 73 20 73 75 63 63 65  hat always succe
5be0: 65 64 73 2e 20 20 54 68 69 73 20 6d 65 61 6e 73  eds.  This means
5bf0: 20 74 68 61 74 20 6c 6f 63 6b 69 6e 67 20 64 6f   that locking do
5c00: 65 73 20 6e 6f 74 20 6f 63 63 75 72 20 75 6e 64  es not occur und
5c10: 65 72 0a 2a 2a 20 44 4a 47 50 50 2e 20 20 42 75  er.** DJGPP.  Bu
5c20: 74 20 69 74 20 69 73 20 44 4f 53 20 2d 20 77 68  t it is DOS - wh
5c30: 61 74 20 64 69 64 20 79 6f 75 20 65 78 70 65 63  at did you expec
5c40: 74 3f 0a 2a 2f 0a 23 69 66 64 65 66 20 5f 5f 44  t?.*/.#ifdef __D
5c50: 4a 47 50 50 5f 5f 0a 20 20 7b 20 22 66 73 74 61  JGPP__.  { "fsta
5c60: 74 22 2c 20 20 20 20 20 20 20 20 30 2c 20 20 20  t",        0,   
5c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
5c80: 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 46 73   },.#define osFs
5c90: 74 61 74 28 61 2c 62 2c 63 29 20 20 20 20 30 0a  tat(a,b,c)    0.
5ca0: 23 65 6c 73 65 20 20 20 20 20 0a 20 20 7b 20 22  #else     .  { "
5cb0: 66 73 74 61 74 22 2c 20 20 20 20 20 20 20 20 28  fstat",        (
5cc0: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
5cd0: 70 74 72 29 66 73 74 61 74 2c 20 20 20 20 20 20  ptr)fstat,      
5ce0: 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73  0  },.#define os
5cf0: 46 73 74 61 74 20 20 20 20 20 28 28 69 6e 74 28  Fstat     ((int(
5d00: 2a 29 28 69 6e 74 2c 73 74 72 75 63 74 20 73 74  *)(int,struct st
5d10: 61 74 2a 29 29 61 53 79 73 63 61 6c 6c 5b 35 5d  at*))aSyscall[5]
5d20: 2e 70 43 75 72 72 65 6e 74 29 0a 23 65 6e 64 69  .pCurrent).#endi
5d30: 66 0a 0a 20 20 7b 20 22 66 74 72 75 6e 63 61 74  f..  { "ftruncat
5d40: 65 22 2c 20 20 20 20 28 73 71 6c 69 74 65 33 5f  e",    (sqlite3_
5d50: 73 79 73 63 61 6c 6c 5f 70 74 72 29 66 74 72 75  syscall_ptr)ftru
5d60: 6e 63 61 74 65 2c 20 20 30 20 20 7d 2c 0a 23 64  ncate,  0  },.#d
5d70: 65 66 69 6e 65 20 6f 73 46 74 72 75 6e 63 61 74  efine osFtruncat
5d80: 65 20 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c 6f  e ((int(*)(int,o
5d90: 66 66 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b 36  ff_t))aSyscall[6
5da0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b  ].pCurrent)..  {
5db0: 20 22 66 63 6e 74 6c 22 2c 20 20 20 20 20 20 20   "fcntl",       
5dc0: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
5dd0: 6c 5f 70 74 72 29 66 63 6e 74 6c 2c 20 20 20 20  l_ptr)fcntl,    
5de0: 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20    0  },.#define 
5df0: 6f 73 46 63 6e 74 6c 20 20 20 20 20 28 28 69 6e  osFcntl     ((in
5e00: 74 28 2a 29 28 69 6e 74 2c 69 6e 74 2c 2e 2e 2e  t(*)(int,int,...
5e10: 29 29 61 53 79 73 63 61 6c 6c 5b 37 5d 2e 70 43  ))aSyscall[7].pC
5e20: 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 72 65  urrent)..  { "re
5e30: 61 64 22 2c 20 20 20 20 20 20 20 20 20 28 73 71  ad",         (sq
5e40: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
5e50: 72 29 72 65 61 64 2c 20 20 20 20 20 20 20 30 20  r)read,       0 
5e60: 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 52 65   },.#define osRe
5e70: 61 64 20 20 20 20 20 20 28 28 73 73 69 7a 65 5f  ad      ((ssize_
5e80: 74 28 2a 29 28 69 6e 74 2c 76 6f 69 64 2a 2c 73  t(*)(int,void*,s
5e90: 69 7a 65 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b  ize_t))aSyscall[
5ea0: 38 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  8].pCurrent)..#i
5eb0: 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52  f defined(USE_PR
5ec0: 45 41 44 29 20 7c 7c 20 53 51 4c 49 54 45 5f 45  EAD) || SQLITE_E
5ed0: 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
5ee0: 59 4c 45 0a 20 20 7b 20 22 70 72 65 61 64 22 2c  YLE.  { "pread",
5ef0: 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33          (sqlite3
5f00: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 70 72 65  _syscall_ptr)pre
5f10: 61 64 2c 20 20 20 20 20 20 30 20 20 7d 2c 0a 23  ad,      0  },.#
5f20: 65 6c 73 65 0a 20 20 7b 20 22 70 72 65 61 64 22  else.  { "pread"
5f30: 2c 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65  ,        (sqlite
5f40: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c  3_syscall_ptr)0,
5f50: 20 20 20 20 20 20 20 20 20 20 30 20 20 7d 2c 0a            0  },.
5f60: 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 6f  #endif.#define o
5f70: 73 50 72 65 61 64 20 20 20 20 20 28 28 73 73 69  sPread     ((ssi
5f80: 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 76 6f 69 64  ze_t(*)(int,void
5f90: 2a 2c 73 69 7a 65 5f 74 2c 6f 66 66 5f 74 29 29  *,size_t,off_t))
5fa0: 61 53 79 73 63 61 6c 6c 5b 39 5d 2e 70 43 75 72  aSyscall[9].pCur
5fb0: 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e  rent)..#if defin
5fc0: 65 64 28 55 53 45 5f 50 52 45 41 44 36 34 29 0a  ed(USE_PREAD64).
5fd0: 20 20 7b 20 22 70 72 65 61 64 36 34 22 2c 20 20    { "pread64",  
5fe0: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
5ff0: 63 61 6c 6c 5f 70 74 72 29 70 72 65 61 64 36 34  call_ptr)pread64
6000: 2c 20 20 20 20 30 20 20 7d 2c 0a 23 65 6c 73 65  ,    0  },.#else
6010: 0a 20 20 7b 20 22 70 72 65 61 64 36 34 22 2c 20  .  { "pread64", 
6020: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
6030: 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20  scall_ptr)0,    
6040: 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 65 6e 64        0  },.#end
6050: 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 50 72 65  if.#define osPre
6060: 61 64 36 34 20 28 28 73 73 69 7a 65 5f 74 28 2a  ad64 ((ssize_t(*
6070: 29 28 69 6e 74 2c 76 6f 69 64 2a 2c 73 69 7a 65  )(int,void*,size
6080: 5f 74 2c 6f 66 66 36 34 5f 74 29 29 61 53 79 73  _t,off64_t))aSys
6090: 63 61 6c 6c 5b 31 30 5d 2e 70 43 75 72 72 65 6e  call[10].pCurren
60a0: 74 29 0a 0a 20 20 7b 20 22 77 72 69 74 65 22 2c  t)..  { "write",
60b0: 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33          (sqlite3
60c0: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 77 72 69  _syscall_ptr)wri
60d0: 74 65 2c 20 20 20 20 20 20 30 20 20 7d 2c 0a 23  te,      0  },.#
60e0: 64 65 66 69 6e 65 20 6f 73 57 72 69 74 65 20 20  define osWrite  
60f0: 20 20 20 28 28 73 73 69 7a 65 5f 74 28 2a 29 28     ((ssize_t(*)(
6100: 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c  int,const void*,
6110: 73 69 7a 65 5f 74 29 29 61 53 79 73 63 61 6c 6c  size_t))aSyscall
6120: 5b 31 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [11].pCurrent)..
6130: 23 69 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f  #if defined(USE_
6140: 50 52 45 41 44 29 20 7c 7c 20 53 51 4c 49 54 45  PREAD) || SQLITE
6150: 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
6160: 53 54 59 4c 45 0a 20 20 7b 20 22 70 77 72 69 74  STYLE.  { "pwrit
6170: 65 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74  e",       (sqlit
6180: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 70  e3_syscall_ptr)p
6190: 77 72 69 74 65 2c 20 20 20 20 20 30 20 20 7d 2c  write,     0  },
61a0: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 70 77 72 69  .#else.  { "pwri
61b0: 74 65 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69  te",       (sqli
61c0: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
61d0: 30 2c 20 20 20 20 20 20 20 20 20 20 30 20 20 7d  0,          0  }
61e0: 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65  ,.#endif.#define
61f0: 20 6f 73 50 77 72 69 74 65 20 20 20 20 28 28 73   osPwrite    ((s
6200: 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 63 6f  size_t(*)(int,co
6210: 6e 73 74 20 76 6f 69 64 2a 2c 73 69 7a 65 5f 74  nst void*,size_t
6220: 2c 6f 66 66 5f 74 29 29 5c 0a 20 20 20 20 20 20  ,off_t))\.      
6230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 53                aS
6240: 79 73 63 61 6c 6c 5b 31 32 5d 2e 70 43 75 72 72  yscall[12].pCurr
6250: 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65  ent)..#if define
6260: 64 28 55 53 45 5f 50 52 45 41 44 36 34 29 0a 20  d(USE_PREAD64). 
6270: 20 7b 20 22 70 77 72 69 74 65 36 34 22 2c 20 20   { "pwrite64",  
6280: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
6290: 61 6c 6c 5f 70 74 72 29 70 77 72 69 74 65 36 34  all_ptr)pwrite64
62a0: 2c 20 20 20 30 20 20 7d 2c 0a 23 65 6c 73 65 0a  ,   0  },.#else.
62b0: 20 20 7b 20 22 70 77 72 69 74 65 36 34 22 2c 20    { "pwrite64", 
62c0: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
62d0: 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20 20  call_ptr)0,     
62e0: 20 20 20 20 20 30 20 20 7d 2c 0a 23 65 6e 64 69       0  },.#endi
62f0: 66 0a 23 64 65 66 69 6e 65 20 6f 73 50 77 72 69  f.#define osPwri
6300: 74 65 36 34 20 20 28 28 73 73 69 7a 65 5f 74 28  te64  ((ssize_t(
6310: 2a 29 28 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69  *)(int,const voi
6320: 64 2a 2c 73 69 7a 65 5f 74 2c 6f 66 66 36 34 5f  d*,size_t,off64_
6330: 74 29 29 5c 0a 20 20 20 20 20 20 20 20 20 20 20  t))\.           
6340: 20 20 20 20 20 20 20 20 20 61 53 79 73 63 61 6c           aSyscal
6350: 6c 5b 31 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[13].pCurrent).
6360: 0a 20 20 7b 20 22 66 63 68 6d 6f 64 22 2c 20 20  .  { "fchmod",  
6370: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
6380: 73 63 61 6c 6c 5f 70 74 72 29 66 63 68 6d 6f 64  scall_ptr)fchmod
6390: 2c 20 20 20 20 20 20 20 20 20 20 30 20 20 7d 2c  ,          0  },
63a0: 0a 23 64 65 66 69 6e 65 20 6f 73 46 63 68 6d 6f  .#define osFchmo
63b0: 64 20 20 20 20 28 28 69 6e 74 28 2a 29 28 69 6e  d    ((int(*)(in
63c0: 74 2c 6d 6f 64 65 5f 74 29 29 61 53 79 73 63 61  t,mode_t))aSysca
63d0: 6c 6c 5b 31 34 5d 2e 70 43 75 72 72 65 6e 74 29  ll[14].pCurrent)
63e0: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 48 41  ..#if defined(HA
63f0: 56 45 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f 43 41  VE_POSIX_FALLOCA
6400: 54 45 29 20 26 26 20 48 41 56 45 5f 50 4f 53 49  TE) && HAVE_POSI
6410: 58 5f 46 41 4c 4c 4f 43 41 54 45 0a 20 20 7b 20  X_FALLOCATE.  { 
6420: 22 66 61 6c 6c 6f 63 61 74 65 22 2c 20 20 20 20  "fallocate",    
6430: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
6440: 5f 70 74 72 29 70 6f 73 69 78 5f 66 61 6c 6c 6f  _ptr)posix_fallo
6450: 63 61 74 65 2c 20 20 30 20 7d 2c 0a 23 65 6c 73  cate,  0 },.#els
6460: 65 0a 20 20 7b 20 22 66 61 6c 6c 6f 63 61 74 65  e.  { "fallocate
6470: 22 2c 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73  ",    (sqlite3_s
6480: 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20  yscall_ptr)0,   
6490: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
64a0: 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65  ,.#endif.#define
64b0: 20 6f 73 46 61 6c 6c 6f 63 61 74 65 20 28 28 69   osFallocate ((i
64c0: 6e 74 28 2a 29 28 69 6e 74 2c 6f 66 66 5f 74 2c  nt(*)(int,off_t,
64d0: 6f 66 66 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b  off_t))aSyscall[
64e0: 31 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  15].pCurrent).. 
64f0: 20 7b 20 22 75 6e 6c 69 6e 6b 22 2c 20 20 20 20   { "unlink",    
6500: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
6510: 61 6c 6c 5f 70 74 72 29 75 6e 6c 69 6e 6b 2c 20  all_ptr)unlink, 
6520: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
6530: 64 65 66 69 6e 65 20 6f 73 55 6e 6c 69 6e 6b 20  define osUnlink 
6540: 20 20 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73     ((int(*)(cons
6550: 74 20 63 68 61 72 2a 29 29 61 53 79 73 63 61 6c  t char*))aSyscal
6560: 6c 5b 31 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[16].pCurrent).
6570: 0a 20 20 7b 20 22 6f 70 65 6e 44 69 72 65 63 74  .  { "openDirect
6580: 6f 72 79 22 2c 20 20 20 20 28 73 71 6c 69 74 65  ory",    (sqlite
6590: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 6f 70  3_syscall_ptr)op
65a0: 65 6e 44 69 72 65 63 74 6f 72 79 2c 20 20 20 20  enDirectory,    
65b0: 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f    0 },.#define o
65c0: 73 4f 70 65 6e 44 69 72 65 63 74 6f 72 79 20 28  sOpenDirectory (
65d0: 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68  (int(*)(const ch
65e0: 61 72 2a 2c 69 6e 74 2a 29 29 61 53 79 73 63 61  ar*,int*))aSysca
65f0: 6c 6c 5b 31 37 5d 2e 70 43 75 72 72 65 6e 74 29  ll[17].pCurrent)
6600: 0a 0a 20 20 7b 20 22 6d 6b 64 69 72 22 2c 20 20  ..  { "mkdir",  
6610: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73        (sqlite3_s
6620: 79 73 63 61 6c 6c 5f 70 74 72 29 6d 6b 64 69 72  yscall_ptr)mkdir
6630: 2c 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c  ,           0 },
6640: 0a 23 64 65 66 69 6e 65 20 6f 73 4d 6b 64 69 72  .#define osMkdir
6650: 20 20 20 20 20 28 28 69 6e 74 28 2a 29 28 63 6f       ((int(*)(co
6660: 6e 73 74 20 63 68 61 72 2a 2c 6d 6f 64 65 5f 74  nst char*,mode_t
6670: 29 29 61 53 79 73 63 61 6c 6c 5b 31 38 5d 2e 70  ))aSyscall[18].p
6680: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 72  Current)..  { "r
6690: 6d 64 69 72 22 2c 20 20 20 20 20 20 20 20 28 73  mdir",        (s
66a0: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
66b0: 74 72 29 72 6d 64 69 72 2c 20 20 20 20 20 20 20  tr)rmdir,       
66c0: 20 20 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65      0 },.#define
66d0: 20 6f 73 52 6d 64 69 72 20 20 20 20 20 28 28 69   osRmdir     ((i
66e0: 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72  nt(*)(const char
66f0: 2a 29 29 61 53 79 73 63 61 6c 6c 5b 31 39 5d 2e  *))aSyscall[19].
6700: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64  pCurrent)..#if d
6710: 65 66 69 6e 65 64 28 48 41 56 45 5f 46 43 48 4f  efined(HAVE_FCHO
6720: 57 4e 29 0a 20 20 7b 20 22 66 63 68 6f 77 6e 22  WN).  { "fchown"
6730: 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33  ,       (sqlite3
6740: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 66 63 68  _syscall_ptr)fch
6750: 6f 77 6e 2c 20 20 20 20 20 20 20 20 20 20 30 20  own,          0 
6760: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 66 63  },.#else.  { "fc
6770: 68 6f 77 6e 22 2c 20 20 20 20 20 20 20 28 73 71  hown",       (sq
6780: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
6790: 72 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  r)0,            
67a0: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 23     0 },.#endif.#
67b0: 64 65 66 69 6e 65 20 6f 73 46 63 68 6f 77 6e 20  define osFchown 
67c0: 20 20 20 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c     ((int(*)(int,
67d0: 75 69 64 5f 74 2c 67 69 64 5f 74 29 29 61 53 79  uid_t,gid_t))aSy
67e0: 73 63 61 6c 6c 5b 32 30 5d 2e 70 43 75 72 72 65  scall[20].pCurre
67f0: 6e 74 29 0a 0a 20 20 7b 20 22 67 65 74 65 75 69  nt)..  { "geteui
6800: 64 22 2c 20 20 20 20 20 20 28 73 71 6c 69 74 65  d",      (sqlite
6810: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 67 65  3_syscall_ptr)ge
6820: 74 65 75 69 64 2c 20 20 20 20 20 20 20 20 20 30  teuid,         0
6830: 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 47 65   },.#define osGe
6840: 74 65 75 69 64 20 20 20 28 28 75 69 64 5f 74 28  teuid   ((uid_t(
6850: 2a 29 28 76 6f 69 64 29 29 61 53 79 73 63 61 6c  *)(void))aSyscal
6860: 6c 5b 32 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[21].pCurrent).
6870: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
6880: 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 20 7c  LITE_OMIT_WAL) |
6890: 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  | SQLITE_MAX_MMA
68a0: 50 5f 53 49 5a 45 3e 30 0a 20 20 7b 20 22 6d 6d  P_SIZE>0.  { "mm
68b0: 61 70 22 2c 20 20 20 20 20 20 20 20 20 28 73 71  ap",         (sq
68c0: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
68d0: 72 29 6d 6d 61 70 2c 20 20 20 20 20 20 20 20 20  r)mmap,         
68e0: 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20     0 },.#else.  
68f0: 7b 20 22 6d 6d 61 70 22 2c 20 20 20 20 20 20 20  { "mmap",       
6900: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
6910: 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20  ll_ptr)0,       
6920: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e          0 },.#en
6930: 64 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 4d 6d  dif.#define osMm
6940: 61 70 20 28 28 76 6f 69 64 2a 28 2a 29 28 76 6f  ap ((void*(*)(vo
6950: 69 64 2a 2c 73 69 7a 65 5f 74 2c 69 6e 74 2c 69  id*,size_t,int,i
6960: 6e 74 2c 69 6e 74 2c 6f 66 66 5f 74 29 29 61 53  nt,int,off_t))aS
6970: 79 73 63 61 6c 6c 5b 32 32 5d 2e 70 43 75 72 72  yscall[22].pCurr
6980: 65 6e 74 29 0a 0a 23 69 66 20 21 64 65 66 69 6e  ent)..#if !defin
6990: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ed(SQLITE_OMIT_W
69a0: 41 4c 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41  AL) || SQLITE_MA
69b0: 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20  X_MMAP_SIZE>0.  
69c0: 7b 20 22 6d 75 6e 6d 61 70 22 2c 20 20 20 20 20  { "munmap",     
69d0: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
69e0: 6c 6c 5f 70 74 72 29 6d 75 6e 6d 61 70 2c 20 20  ll_ptr)munmap,  
69f0: 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c          0 },.#el
6a00: 73 65 0a 20 20 7b 20 22 6d 75 6e 6d 61 70 22 2c  se.  { "munmap",
6a10: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f         (sqlite3_
6a20: 73 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20  syscall_ptr)0,  
6a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
6a40: 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65  ,.#endif.#define
6a50: 20 6f 73 4d 75 6e 6d 61 70 20 28 28 76 6f 69 64   osMunmap ((void
6a60: 2a 28 2a 29 28 76 6f 69 64 2a 2c 73 69 7a 65 5f  *(*)(void*,size_
6a70: 74 29 29 61 53 79 73 63 61 6c 6c 5b 32 33 5d 2e  t))aSyscall[23].
6a80: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 48  pCurrent)..#if H
6a90: 41 56 45 5f 4d 52 45 4d 41 50 20 26 26 20 28 21  AVE_MREMAP && (!
6aa0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
6ab0: 4d 49 54 5f 57 41 4c 29 20 7c 7c 20 53 51 4c 49  MIT_WAL) || SQLI
6ac0: 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
6ad0: 3e 30 29 0a 20 20 7b 20 22 6d 72 65 6d 61 70 22  >0).  { "mremap"
6ae0: 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33  ,       (sqlite3
6af0: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 6d 72 65  _syscall_ptr)mre
6b00: 6d 61 70 2c 20 20 20 20 20 20 20 20 20 20 30 20  map,          0 
6b10: 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 6d 72  },.#else.  { "mr
6b20: 65 6d 61 70 22 2c 20 20 20 20 20 20 20 28 73 71  emap",       (sq
6b30: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
6b40: 72 29 30 2c 20 20 20 20 20 20 20 20 20 20 20 20  r)0,            
6b50: 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 23     0 },.#endif.#
6b60: 64 65 66 69 6e 65 20 6f 73 4d 72 65 6d 61 70 20  define osMremap 
6b70: 28 28 76 6f 69 64 2a 28 2a 29 28 76 6f 69 64 2a  ((void*(*)(void*
6b80: 2c 73 69 7a 65 5f 74 2c 73 69 7a 65 5f 74 2c 69  ,size_t,size_t,i
6b90: 6e 74 2c 2e 2e 2e 29 29 61 53 79 73 63 61 6c 6c  nt,...))aSyscall
6ba0: 5b 32 34 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [24].pCurrent)..
6bb0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
6bc0: 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 20 7c 7c  ITE_OMIT_WAL) ||
6bd0: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
6be0: 5f 53 49 5a 45 3e 30 0a 20 20 7b 20 22 67 65 74  _SIZE>0.  { "get
6bf0: 70 61 67 65 73 69 7a 65 22 2c 20 20 28 73 71 6c  pagesize",  (sql
6c00: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
6c10: 29 75 6e 69 78 47 65 74 70 61 67 65 73 69 7a 65  )unixGetpagesize
6c20: 2c 20 30 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b  , 0 },.#else.  {
6c30: 20 22 67 65 74 70 61 67 65 73 69 7a 65 22 2c 20   "getpagesize", 
6c40: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
6c50: 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20 20  l_ptr)0,        
6c60: 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64         0 },.#end
6c70: 69 66 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74  if.#define osGet
6c80: 70 61 67 65 73 69 7a 65 20 28 28 69 6e 74 28 2a  pagesize ((int(*
6c90: 29 28 76 6f 69 64 29 29 61 53 79 73 63 61 6c 6c  )(void))aSyscall
6ca0: 5b 32 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [25].pCurrent)..
6cb0: 23 69 66 20 64 65 66 69 6e 65 64 28 48 41 56 45  #if defined(HAVE
6cc0: 5f 52 45 41 44 4c 49 4e 4b 29 0a 20 20 7b 20 22  _READLINK).  { "
6cd0: 72 65 61 64 6c 69 6e 6b 22 2c 20 20 20 20 20 28  readlink",     (
6ce0: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
6cf0: 70 74 72 29 72 65 61 64 6c 69 6e 6b 2c 20 20 20  ptr)readlink,   
6d00: 20 20 20 20 20 30 20 7d 2c 0a 23 65 6c 73 65 0a       0 },.#else.
6d10: 20 20 7b 20 22 72 65 61 64 6c 69 6e 6b 22 2c 20    { "readlink", 
6d20: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
6d30: 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20 20  call_ptr)0,     
6d40: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
6d50: 65 6e 64 69 66 0a 23 64 65 66 69 6e 65 20 6f 73  endif.#define os
6d60: 52 65 61 64 6c 69 6e 6b 20 28 28 73 73 69 7a 65  Readlink ((ssize
6d70: 5f 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72  _t(*)(const char
6d80: 2a 2c 63 68 61 72 2a 2c 73 69 7a 65 5f 74 29 29  *,char*,size_t))
6d90: 61 53 79 73 63 61 6c 6c 5b 32 36 5d 2e 70 43 75  aSyscall[26].pCu
6da0: 72 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69  rrent)..#if defi
6db0: 6e 65 64 28 48 41 56 45 5f 4c 53 54 41 54 29 0a  ned(HAVE_LSTAT).
6dc0: 20 20 7b 20 22 6c 73 74 61 74 22 2c 20 20 20 20    { "lstat",    
6dd0: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
6de0: 73 63 61 6c 6c 5f 70 74 72 29 6c 73 74 61 74 2c  scall_ptr)lstat,
6df0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
6e00: 65 6c 73 65 0a 20 20 7b 20 22 6c 73 74 61 74 22  else.  { "lstat"
6e10: 2c 20 20 20 20 20 20 20 20 20 28 73 71 6c 69 74  ,         (sqlit
6e20: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 30  e3_syscall_ptr)0
6e30: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30  ,              0
6e40: 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66 69   },.#endif.#defi
6e50: 6e 65 20 6f 73 4c 73 74 61 74 20 20 20 20 20 20  ne osLstat      
6e60: 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63  ((int(*)(const c
6e70: 68 61 72 2a 2c 73 74 72 75 63 74 20 73 74 61 74  har*,struct stat
6e80: 2a 29 29 61 53 79 73 63 61 6c 6c 5b 32 37 5d 2e  *))aSyscall[27].
6e90: 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66 20 64  pCurrent)..#if d
6ea0: 65 66 69 6e 65 64 28 5f 5f 6c 69 6e 75 78 5f 5f  efined(__linux__
6eb0: 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  ) && defined(SQL
6ec0: 49 54 45 5f 45 4e 41 42 4c 45 5f 42 41 54 43 48  ITE_ENABLE_BATCH
6ed0: 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 29 0a 20  _ATOMIC_WRITE). 
6ee0: 20 7b 20 22 69 6f 63 74 6c 22 2c 20 20 20 20 20   { "ioctl",     
6ef0: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
6f00: 63 61 6c 6c 5f 70 74 72 29 69 6f 63 74 6c 2c 20  call_ptr)ioctl, 
6f10: 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65           0 },.#e
6f20: 6c 73 65 0a 20 20 7b 20 22 69 6f 63 74 6c 22 2c  lse.  { "ioctl",
6f30: 20 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65           (sqlite
6f40: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c  3_syscall_ptr)0,
6f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
6f60: 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e  },.#endif.#defin
6f70: 65 20 6f 73 49 6f 63 74 6c 20 28 28 69 6e 74 28  e osIoctl ((int(
6f80: 2a 29 28 69 6e 74 2c 69 6e 74 2c 2e 2e 2e 29 29  *)(int,int,...))
6f90: 61 53 79 73 63 61 6c 6c 5b 32 38 5d 2e 70 43 75  aSyscall[28].pCu
6fa0: 72 72 65 6e 74 29 0a 0a 7d 3b 20 2f 2a 20 45 6e  rrent)..}; /* En
6fb0: 64 20 6f 66 20 74 68 65 20 6f 76 65 72 72 69 64  d of the overrid
6fc0: 65 61 62 6c 65 20 73 79 73 74 65 6d 20 63 61 6c  eable system cal
6fd0: 6c 73 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 4f 6e  ls */.../*.** On
6fe0: 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 2c 20 63   some systems, c
6ff0: 61 6c 6c 73 20 74 6f 20 66 63 68 6f 77 6e 28 29  alls to fchown()
7000: 20 77 69 6c 6c 20 74 72 69 67 67 65 72 20 61 20   will trigger a 
7010: 6d 65 73 73 61 67 65 20 69 6e 20 61 20 73 65 63  message in a sec
7020: 75 72 69 74 79 0a 2a 2a 20 6c 6f 67 20 69 66 20  urity.** log if 
7030: 74 68 65 79 20 63 6f 6d 65 20 66 72 6f 6d 20 6e  they come from n
7040: 6f 6e 2d 72 6f 6f 74 20 70 72 6f 63 65 73 73 65  on-root processe
7050: 73 2e 20 20 53 6f 20 61 76 6f 69 64 20 63 61 6c  s.  So avoid cal
7060: 6c 69 6e 67 20 66 63 68 6f 77 6e 28 29 20 69 66  ling fchown() if
7070: 0a 2a 2a 20 77 65 20 61 72 65 20 6e 6f 74 20 72  .** we are not r
7080: 75 6e 6e 69 6e 67 20 61 73 20 72 6f 6f 74 2e 0a  unning as root..
7090: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 6f  */.static int ro
70a0: 62 75 73 74 46 63 68 6f 77 6e 28 69 6e 74 20 66  bustFchown(int f
70b0: 64 2c 20 75 69 64 5f 74 20 75 69 64 2c 20 67 69  d, uid_t uid, gi
70c0: 64 5f 74 20 67 69 64 29 7b 0a 23 69 66 20 64 65  d_t gid){.#if de
70d0: 66 69 6e 65 64 28 48 41 56 45 5f 46 43 48 4f 57  fined(HAVE_FCHOW
70e0: 4e 29 0a 20 20 72 65 74 75 72 6e 20 6f 73 47 65  N).  return osGe
70f0: 74 65 75 69 64 28 29 20 3f 20 30 20 3a 20 6f 73  teuid() ? 0 : os
7100: 46 63 68 6f 77 6e 28 66 64 2c 75 69 64 2c 67 69  Fchown(fd,uid,gi
7110: 64 29 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74 75  d);.#else.  retu
7120: 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  rn 0;.#endif.}..
7130: 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68  /*.** This is th
7140: 65 20 78 53 65 74 53 79 73 74 65 6d 43 61 6c 6c  e xSetSystemCall
7150: 28 29 20 6d 65 74 68 6f 64 20 6f 66 20 73 71 6c  () method of sql
7160: 69 74 65 33 5f 76 66 73 20 66 6f 72 20 61 6c 6c  ite3_vfs for all
7170: 20 6f 66 20 74 68 65 0a 2a 2a 20 22 75 6e 69 78   of the.** "unix
7180: 22 20 56 46 53 65 73 2e 20 20 52 65 74 75 72 6e  " VFSes.  Return
7190: 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 70 6f 6e 20   SQLITE_OK opon 
71a0: 73 75 63 63 65 73 73 66 75 6c 6c 79 20 75 70 64  successfully upd
71b0: 61 74 69 6e 67 20 74 68 65 0a 2a 2a 20 73 79 73  ating the.** sys
71c0: 74 65 6d 20 63 61 6c 6c 20 70 6f 69 6e 74 65 72  tem call pointer
71d0: 2c 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 54 46  , or SQLITE_NOTF
71e0: 4f 55 4e 44 20 69 66 20 74 68 65 72 65 20 69 73  OUND if there is
71f0: 20 6e 6f 20 63 6f 6e 66 69 67 75 72 61 62 6c 65   no configurable
7200: 0a 2a 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  .** system call 
7210: 6e 61 6d 65 64 20 7a 4e 61 6d 65 2e 0a 2a 2f 0a  named zName..*/.
7220: 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53  static int unixS
7230: 65 74 53 79 73 74 65 6d 43 61 6c 6c 28 0a 20 20  etSystemCall(.  
7240: 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 4e 6f  sqlite3_vfs *pNo
7250: 74 55 73 65 64 2c 20 20 20 20 20 20 20 20 2f 2a  tUsed,        /*
7260: 20 54 68 65 20 56 46 53 20 70 6f 69 6e 74 65 72   The VFS pointer
7270: 2e 20 20 4e 6f 74 20 75 73 65 64 20 2a 2f 0a 20  .  Not used */. 
7280: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
7290: 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  me,            /
72a0: 2a 20 4e 61 6d 65 20 6f 66 20 73 79 73 74 65 6d  * Name of system
72b0: 20 63 61 6c 6c 20 74 6f 20 6f 76 65 72 72 69 64   call to overrid
72c0: 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73  e */.  sqlite3_s
72d0: 79 73 63 61 6c 6c 5f 70 74 72 20 70 4e 65 77 46  yscall_ptr pNewF
72e0: 75 6e 63 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20  unc  /* Pointer 
72f0: 74 6f 20 6e 65 77 20 73 79 73 74 65 6d 20 63 61  to new system ca
7300: 6c 6c 20 76 61 6c 75 65 20 2a 2f 0a 29 7b 0a 20  ll value */.){. 
7310: 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 3b   unsigned int i;
7320: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
7330: 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 0a 20 20  TE_NOTFOUND;..  
7340: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
7350: 28 70 4e 6f 74 55 73 65 64 29 3b 0a 20 20 69 66  (pNotUsed);.  if
7360: 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  ( zName==0 ){.  
7370: 20 20 2f 2a 20 49 66 20 6e 6f 20 7a 4e 61 6d 65    /* If no zName
7380: 20 69 73 20 67 69 76 65 6e 2c 20 72 65 73 74 6f   is given, resto
7390: 72 65 20 61 6c 6c 20 73 79 73 74 65 6d 20 63 61  re all system ca
73a0: 6c 6c 73 20 74 6f 20 74 68 65 69 72 20 64 65 66  lls to their def
73b0: 61 75 6c 74 0a 20 20 20 20 2a 2a 20 73 65 74 74  ault.    ** sett
73c0: 69 6e 67 73 20 61 6e 64 20 72 65 74 75 72 6e 20  ings and return 
73d0: 4e 55 4c 4c 0a 20 20 20 20 2a 2f 0a 20 20 20 20  NULL.    */.    
73e0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
73f0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73      for(i=0; i<s
7400: 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f  izeof(aSyscall)/
7410: 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b  sizeof(aSyscall[
7420: 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  0]); i++){.     
7430: 20 69 66 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d   if( aSyscall[i]
7440: 2e 70 44 65 66 61 75 6c 74 20 29 7b 0a 20 20 20  .pDefault ){.   
7450: 20 20 20 20 20 61 53 79 73 63 61 6c 6c 5b 69 5d       aSyscall[i]
7460: 2e 70 43 75 72 72 65 6e 74 20 3d 20 61 53 79 73  .pCurrent = aSys
7470: 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74  call[i].pDefault
7480: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
7490: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
74a0: 49 66 20 7a 4e 61 6d 65 20 69 73 20 73 70 65 63  If zName is spec
74b0: 69 66 69 65 64 2c 20 6f 70 65 72 61 74 65 20 6f  ified, operate o
74c0: 6e 20 6f 6e 6c 79 20 74 68 65 20 6f 6e 65 20 73  n only the one s
74d0: 79 73 74 65 6d 20 63 61 6c 6c 0a 20 20 20 20 2a  ystem call.    *
74e0: 2a 20 73 70 65 63 69 66 69 65 64 2e 0a 20 20 20  * specified..   
74f0: 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   */.    for(i=0;
7500: 20 69 3c 73 69 7a 65 6f 66 28 61 53 79 73 63 61   i<sizeof(aSysca
7510: 6c 6c 29 2f 73 69 7a 65 6f 66 28 61 53 79 73 63  ll)/sizeof(aSysc
7520: 61 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20  all[0]); i++){. 
7530: 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28       if( strcmp(
7540: 7a 4e 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c 5b  zName, aSyscall[
7550: 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a  i].zName)==0 ){.
7560: 20 20 20 20 20 20 20 20 69 66 28 20 61 53 79 73          if( aSys
7570: 63 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74  call[i].pDefault
7580: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
7590: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65   aSyscall[i].pDe
75a0: 66 61 75 6c 74 20 3d 20 61 53 79 73 63 61 6c 6c  fault = aSyscall
75b0: 5b 69 5d 2e 70 43 75 72 72 65 6e 74 3b 0a 20 20  [i].pCurrent;.  
75c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
75d0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
75e0: 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77          if( pNew
75f0: 46 75 6e 63 3d 3d 30 20 29 20 70 4e 65 77 46 75  Func==0 ) pNewFu
7600: 6e 63 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d  nc = aSyscall[i]
7610: 2e 70 44 65 66 61 75 6c 74 3b 0a 20 20 20 20 20  .pDefault;.     
7620: 20 20 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70     aSyscall[i].p
7630: 43 75 72 72 65 6e 74 20 3d 20 70 4e 65 77 46 75  Current = pNewFu
7640: 6e 63 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  nc;.        brea
7650: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
7660: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
7670: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
7680: 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 61  n the value of a
7690: 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20 52   system call.  R
76a0: 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 7a 4e  eturn NULL if zN
76b0: 61 6d 65 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20  ame is not a.** 
76c0: 72 65 63 6f 67 6e 69 7a 65 64 20 73 79 73 74 65  recognized syste
76d0: 6d 20 63 61 6c 6c 20 6e 61 6d 65 2e 20 20 4e 55  m call name.  NU
76e0: 4c 4c 20 69 73 20 61 6c 73 6f 20 72 65 74 75 72  LL is also retur
76f0: 6e 65 64 20 69 66 20 74 68 65 20 73 79 73 74 65  ned if the syste
7700: 6d 20 63 61 6c 6c 0a 2a 2a 20 69 73 20 63 75 72  m call.** is cur
7710: 72 65 6e 74 6c 79 20 75 6e 64 65 66 69 6e 65 64  rently undefined
7720: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69  ..*/.static sqli
7730: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20  te3_syscall_ptr 
7740: 75 6e 69 78 47 65 74 53 79 73 74 65 6d 43 61 6c  unixGetSystemCal
7750: 6c 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  l(.  sqlite3_vfs
7760: 20 2a 70 4e 6f 74 55 73 65 64 2c 0a 20 20 63 6f   *pNotUsed,.  co
7770: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 0a  nst char *zName.
7780: 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e  ){.  unsigned in
7790: 74 20 69 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50  t i;..  UNUSED_P
77a0: 41 52 41 4d 45 54 45 52 28 70 4e 6f 74 55 73 65  ARAMETER(pNotUse
77b0: 64 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  d);.  for(i=0; i
77c0: 3c 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c  <sizeof(aSyscall
77d0: 29 2f 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c  )/sizeof(aSyscal
77e0: 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  l[0]); i++){.   
77f0: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d   if( strcmp(zNam
7800: 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a  e, aSyscall[i].z
7810: 4e 61 6d 65 29 3d 3d 30 20 29 20 72 65 74 75 72  Name)==0 ) retur
7820: 6e 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43  n aSyscall[i].pC
7830: 75 72 72 65 6e 74 3b 0a 20 20 7d 0a 20 20 72 65  urrent;.  }.  re
7840: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
7850: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 61 6d 65   Return the name
7860: 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 73 79   of the first sy
7870: 73 74 65 6d 20 63 61 6c 6c 20 61 66 74 65 72 20  stem call after 
7880: 7a 4e 61 6d 65 2e 20 20 49 66 20 7a 4e 61 6d 65  zName.  If zName
7890: 3d 3d 4e 55 4c 4c 0a 2a 2a 20 74 68 65 6e 20 72  ==NULL.** then r
78a0: 65 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f  eturn the name o
78b0: 66 20 74 68 65 20 66 69 72 73 74 20 73 79 73 74  f the first syst
78c0: 65 6d 20 63 61 6c 6c 2e 20 20 52 65 74 75 72 6e  em call.  Return
78d0: 20 4e 55 4c 4c 20 69 66 20 7a 4e 61 6d 65 0a 2a   NULL if zName.*
78e0: 2a 20 69 73 20 74 68 65 20 6c 61 73 74 20 73 79  * is the last sy
78f0: 73 74 65 6d 20 63 61 6c 6c 20 6f 72 20 69 66 20  stem call or if 
7900: 7a 4e 61 6d 65 20 69 73 20 6e 6f 74 20 74 68 65  zName is not the
7910: 20 6e 61 6d 65 20 6f 66 20 61 20 76 61 6c 69 64   name of a valid
7920: 0a 2a 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e  .** system call.
7930: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
7940: 20 63 68 61 72 20 2a 75 6e 69 78 4e 65 78 74 53   char *unixNextS
7950: 79 73 74 65 6d 43 61 6c 6c 28 73 71 6c 69 74 65  ystemCall(sqlite
7960: 33 5f 76 66 73 20 2a 70 2c 20 63 6f 6e 73 74 20  3_vfs *p, const 
7970: 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20  char *zName){.  
7980: 69 6e 74 20 69 20 3d 20 2d 31 3b 0a 0a 20 20 55  int i = -1;..  U
7990: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
79a0: 70 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 20  p);.  if( zName 
79b0: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
79c0: 69 3c 41 72 72 61 79 53 69 7a 65 28 61 53 79 73  i<ArraySize(aSys
79d0: 63 61 6c 6c 29 2d 31 3b 20 69 2b 2b 29 7b 0a 20  call)-1; i++){. 
79e0: 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28       if( strcmp(
79f0: 7a 4e 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c 5b  zName, aSyscall[
7a00: 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 62  i].zName)==0 ) b
7a10: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
7a20: 20 20 66 6f 72 28 69 2b 2b 3b 20 69 3c 41 72 72    for(i++; i<Arr
7a30: 61 79 53 69 7a 65 28 61 53 79 73 63 61 6c 6c 29  aySize(aSyscall)
7a40: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
7a50: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72  aSyscall[i].pCur
7a60: 72 65 6e 74 21 3d 30 20 29 20 72 65 74 75 72 6e  rent!=0 ) return
7a70: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61   aSyscall[i].zNa
7a80: 6d 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  me;.  }.  return
7a90: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20   0;.}../*.** Do 
7aa0: 6e 6f 74 20 61 63 63 65 70 74 20 61 6e 79 20 66  not accept any f
7ab0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6c  ile descriptor l
7ac0: 65 73 73 20 74 68 61 6e 20 74 68 69 73 20 76 61  ess than this va
7ad0: 6c 75 65 2c 20 69 6e 20 6f 72 64 65 72 20 74 6f  lue, in order to
7ae0: 20 61 76 6f 69 64 0a 2a 2a 20 6f 70 65 6e 69 6e   avoid.** openin
7af0: 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  g database file 
7b00: 75 73 69 6e 67 20 66 69 6c 65 20 64 65 73 63 72  using file descr
7b10: 69 70 74 6f 72 73 20 74 68 61 74 20 61 72 65 20  iptors that are 
7b20: 63 6f 6d 6d 6f 6e 6c 79 20 75 73 65 64 20 66 6f  commonly used fo
7b30: 72 20 0a 2a 2a 20 73 74 61 6e 64 61 72 64 20 69  r .** standard i
7b40: 6e 70 75 74 2c 20 6f 75 74 70 75 74 2c 20 61 6e  nput, output, an
7b50: 64 20 65 72 72 6f 72 2e 0a 2a 2f 0a 23 69 66 6e  d error..*/.#ifn
7b60: 64 65 66 20 53 51 4c 49 54 45 5f 4d 49 4e 49 4d  def SQLITE_MINIM
7b70: 55 4d 5f 46 49 4c 45 5f 44 45 53 43 52 49 50 54  UM_FILE_DESCRIPT
7b80: 4f 52 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49  OR.# define SQLI
7b90: 54 45 5f 4d 49 4e 49 4d 55 4d 5f 46 49 4c 45 5f  TE_MINIMUM_FILE_
7ba0: 44 45 53 43 52 49 50 54 4f 52 20 33 0a 23 65 6e  DESCRIPTOR 3.#en
7bb0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b  dif../*.** Invok
7bc0: 65 20 6f 70 65 6e 28 29 2e 20 20 44 6f 20 73 6f  e open().  Do so
7bd0: 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 2c   multiple times,
7be0: 20 75 6e 74 69 6c 20 69 74 20 65 69 74 68 65 72   until it either
7bf0: 20 73 75 63 63 65 65 64 73 20 6f 72 0a 2a 2a 20   succeeds or.** 
7c00: 66 61 69 6c 73 20 66 6f 72 20 73 6f 6d 65 20 72  fails for some r
7c10: 65 61 73 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e  eason other than
7c20: 20 45 49 4e 54 52 2e 0a 2a 2a 0a 2a 2a 20 49 66   EINTR..**.** If
7c30: 20 74 68 65 20 66 69 6c 65 20 63 72 65 61 74 69   the file creati
7c40: 6f 6e 20 6d 6f 64 65 20 22 6d 22 20 69 73 20 30  on mode "m" is 0
7c50: 20 74 68 65 6e 20 73 65 74 20 69 74 20 74 6f 20   then set it to 
7c60: 74 68 65 20 64 65 66 61 75 6c 74 20 66 6f 72 0a  the default for.
7c70: 2a 2a 20 53 51 4c 69 74 65 2e 20 20 54 68 65 20  ** SQLite.  The 
7c80: 64 65 66 61 75 6c 74 20 69 73 20 53 51 4c 49 54  default is SQLIT
7c90: 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50  E_DEFAULT_FILE_P
7ca0: 45 52 4d 49 53 53 49 4f 4e 53 20 28 6e 6f 72 6d  ERMISSIONS (norm
7cb0: 61 6c 6c 79 0a 2a 2a 20 30 36 34 34 29 20 61 73  ally.** 0644) as
7cc0: 20 6d 6f 64 69 66 69 65 64 20 62 79 20 74 68 65   modified by the
7cd0: 20 73 79 73 74 65 6d 20 75 6d 61 73 6b 2e 20 20   system umask.  
7ce0: 49 66 20 6d 20 69 73 20 6e 6f 74 20 30 2c 20 74  If m is not 0, t
7cf0: 68 65 6e 0a 2a 2a 20 6d 61 6b 65 20 74 68 65 20  hen.** make the 
7d00: 66 69 6c 65 20 63 72 65 61 74 69 6f 6e 20 6d 6f  file creation mo
7d10: 64 65 20 62 65 20 65 78 61 63 74 6c 79 20 6d 20  de be exactly m 
7d20: 69 67 6e 6f 72 69 6e 67 20 74 68 65 20 75 6d 61  ignoring the uma
7d30: 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 20  sk..**.** The m 
7d40: 70 61 72 61 6d 65 74 65 72 20 77 69 6c 6c 20 62  parameter will b
7d50: 65 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 6e 6c 79 20  e non-zero only 
7d60: 77 68 65 6e 20 63 72 65 61 74 69 6e 67 20 2d 77  when creating -w
7d70: 61 6c 2c 20 2d 6a 6f 75 72 6e 61 6c 2c 0a 2a 2a  al, -journal,.**
7d80: 20 61 6e 64 20 2d 73 68 6d 20 66 69 6c 65 73 2e   and -shm files.
7d90: 20 20 57 65 20 77 61 6e 74 20 74 68 6f 73 65 20    We want those 
7da0: 66 69 6c 65 73 20 74 6f 20 68 61 76 65 20 2a 65  files to have *e
7db0: 78 61 63 74 6c 79 2a 20 74 68 65 20 73 61 6d 65  xactly* the same
7dc0: 0a 2a 2a 20 70 65 72 6d 69 73 73 69 6f 6e 73 20  .** permissions 
7dd0: 61 73 20 74 68 65 69 72 20 6f 72 69 67 69 6e 61  as their origina
7de0: 6c 20 64 61 74 61 62 61 73 65 2c 20 75 6e 61 64  l database, unad
7df0: 75 6c 74 65 72 61 74 65 64 20 62 79 20 74 68 65  ulterated by the
7e00: 20 75 6d 61 73 6b 2e 0a 2a 2a 20 49 6e 20 74 68   umask..** In th
7e10: 61 74 20 77 61 79 2c 20 69 66 20 61 20 64 61 74  at way, if a dat
7e20: 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 2d 72  abase file is -r
7e30: 77 2d 72 77 2d 72 77 20 6f 72 20 2d 72 77 2d 72  w-rw-rw or -rw-r
7e40: 77 2d 72 2d 2c 20 61 6e 64 20 61 0a 2a 2a 20 74  w-r-, and a.** t
7e50: 72 61 6e 73 61 63 74 69 6f 6e 20 63 72 61 73 68  ransaction crash
7e60: 65 73 20 61 6e 64 20 6c 65 61 76 65 73 20 62 65  es and leaves be
7e70: 68 69 6e 64 20 68 6f 74 20 6a 6f 75 72 6e 61 6c  hind hot journal
7e80: 73 2c 20 74 68 65 6e 20 61 6e 79 0a 2a 2a 20 70  s, then any.** p
7e90: 72 6f 63 65 73 73 20 74 68 61 74 20 69 73 20 61  rocess that is a
7ea0: 62 6c 65 20 74 6f 20 77 72 69 74 65 20 74 6f 20  ble to write to 
7eb0: 74 68 65 20 64 61 74 61 62 61 73 65 20 77 69 6c  the database wil
7ec0: 6c 20 61 6c 73 6f 20 62 65 20 61 62 6c 65 20 74  l also be able t
7ed0: 6f 0a 2a 2a 20 72 65 63 6f 76 65 72 20 74 68 65  o.** recover the
7ee0: 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 73 2e 0a 2a   hot journals..*
7ef0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 6f 62  /.static int rob
7f00: 75 73 74 5f 6f 70 65 6e 28 63 6f 6e 73 74 20 63  ust_open(const c
7f10: 68 61 72 20 2a 7a 2c 20 69 6e 74 20 66 2c 20 6d  har *z, int f, m
7f20: 6f 64 65 5f 74 20 6d 29 7b 0a 20 20 69 6e 74 20  ode_t m){.  int 
7f30: 66 64 3b 0a 20 20 6d 6f 64 65 5f 74 20 6d 32 20  fd;.  mode_t m2 
7f40: 3d 20 6d 20 3f 20 6d 20 3a 20 53 51 4c 49 54 45  = m ? m : SQLITE
7f50: 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45  _DEFAULT_FILE_PE
7f60: 52 4d 49 53 53 49 4f 4e 53 3b 0a 20 20 77 68 69  RMISSIONS;.  whi
7f70: 6c 65 28 31 29 7b 0a 23 69 66 20 64 65 66 69 6e  le(1){.#if defin
7f80: 65 64 28 4f 5f 43 4c 4f 45 58 45 43 29 0a 20 20  ed(O_CLOEXEC).  
7f90: 20 20 66 64 20 3d 20 6f 73 4f 70 65 6e 28 7a 2c    fd = osOpen(z,
7fa0: 66 7c 4f 5f 43 4c 4f 45 58 45 43 2c 6d 32 29 3b  f|O_CLOEXEC,m2);
7fb0: 0a 23 65 6c 73 65 0a 20 20 20 20 66 64 20 3d 20  .#else.    fd = 
7fc0: 6f 73 4f 70 65 6e 28 7a 2c 66 2c 6d 32 29 3b 0a  osOpen(z,f,m2);.
7fd0: 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 66  #endif.    if( f
7fe0: 64 3c 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  d<0 ){.      if(
7ff0: 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 20   errno==EINTR ) 
8000: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
8010: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
8020: 20 69 66 28 20 66 64 3e 3d 53 51 4c 49 54 45 5f   if( fd>=SQLITE_
8030: 4d 49 4e 49 4d 55 4d 5f 46 49 4c 45 5f 44 45 53  MINIMUM_FILE_DES
8040: 43 52 49 50 54 4f 52 20 29 20 62 72 65 61 6b 3b  CRIPTOR ) break;
8050: 0a 20 20 20 20 6f 73 43 6c 6f 73 65 28 66 64 29  .    osClose(fd)
8060: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f  ;.    sqlite3_lo
8070: 67 28 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47  g(SQLITE_WARNING
8080: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
8090: 20 20 20 22 61 74 74 65 6d 70 74 20 74 6f 20 6f     "attempt to o
80a0: 70 65 6e 20 5c 22 25 73 5c 22 20 61 73 20 66 69  pen \"%s\" as fi
80b0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 25 64  le descriptor %d
80c0: 22 2c 20 7a 2c 20 66 64 29 3b 0a 20 20 20 20 66  ", z, fd);.    f
80d0: 64 20 3d 20 2d 31 3b 0a 20 20 20 20 69 66 28 20  d = -1;.    if( 
80e0: 6f 73 4f 70 65 6e 28 22 2f 64 65 76 2f 6e 75 6c  osOpen("/dev/nul
80f0: 6c 22 2c 20 66 2c 20 6d 29 3c 30 20 29 20 62 72  l", f, m)<0 ) br
8100: 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66  eak;.  }.  if( f
8110: 64 3e 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  d>=0 ){.    if( 
8120: 6d 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 74  m!=0 ){.      st
8130: 72 75 63 74 20 73 74 61 74 20 73 74 61 74 62 75  ruct stat statbu
8140: 66 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 73 46  f;.      if( osF
8150: 73 74 61 74 28 66 64 2c 20 26 73 74 61 74 62 75  stat(fd, &statbu
8160: 66 29 3d 3d 30 20 0a 20 20 20 20 20 20 20 26 26  f)==0 .       &&
8170: 20 73 74 61 74 62 75 66 2e 73 74 5f 73 69 7a 65   statbuf.st_size
8180: 3d 3d 30 0a 20 20 20 20 20 20 20 26 26 20 28 73  ==0.       && (s
8190: 74 61 74 62 75 66 2e 73 74 5f 6d 6f 64 65 26 30  tatbuf.st_mode&0
81a0: 37 37 37 29 21 3d 6d 20 0a 20 20 20 20 20 20 29  777)!=m .      )
81b0: 7b 0a 20 20 20 20 20 20 20 20 6f 73 46 63 68 6d  {.        osFchm
81c0: 6f 64 28 66 64 2c 20 6d 29 3b 0a 20 20 20 20 20  od(fd, m);.     
81d0: 20 7d 0a 20 20 20 20 7d 0a 23 69 66 20 64 65 66   }.    }.#if def
81e0: 69 6e 65 64 28 46 44 5f 43 4c 4f 45 58 45 43 29  ined(FD_CLOEXEC)
81f0: 20 26 26 20 28 21 64 65 66 69 6e 65 64 28 4f 5f   && (!defined(O_
8200: 43 4c 4f 45 58 45 43 29 20 7c 7c 20 4f 5f 43 4c  CLOEXEC) || O_CL
8210: 4f 45 58 45 43 3d 3d 30 29 0a 20 20 20 20 6f 73  OEXEC==0).    os
8220: 46 63 6e 74 6c 28 66 64 2c 20 46 5f 53 45 54 46  Fcntl(fd, F_SETF
8230: 44 2c 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20 46  D, osFcntl(fd, F
8240: 5f 47 45 54 46 44 2c 20 30 29 20 7c 20 46 44 5f  _GETFD, 0) | FD_
8250: 43 4c 4f 45 58 45 43 29 3b 0a 23 65 6e 64 69 66  CLOEXEC);.#endif
8260: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 66 64  .  }.  return fd
8270: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65  ;.}../*.** Helpe
8280: 72 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20 6f  r functions to o
8290: 62 74 61 69 6e 20 61 6e 64 20 72 65 6c 69 6e 71  btain and relinq
82a0: 75 69 73 68 20 74 68 65 20 67 6c 6f 62 61 6c 20  uish the global 
82b0: 6d 75 74 65 78 2e 20 54 68 65 0a 2a 2a 20 67 6c  mutex. The.** gl
82c0: 6f 62 61 6c 20 6d 75 74 65 78 20 69 73 20 75 73  obal mutex is us
82d0: 65 64 20 74 6f 20 70 72 6f 74 65 63 74 20 74 68  ed to protect th
82e0: 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20  e unixInodeInfo 
82f0: 61 6e 64 0a 2a 2a 20 76 78 77 6f 72 6b 73 46 69  and.** vxworksFi
8300: 6c 65 49 64 20 6f 62 6a 65 63 74 73 20 75 73 65  leId objects use
8310: 64 20 62 79 20 74 68 69 73 20 66 69 6c 65 2c 20  d by this file, 
8320: 61 6c 6c 20 6f 66 20 77 68 69 63 68 20 6d 61 79  all of which may
8330: 20 62 65 20 0a 2a 2a 20 73 68 61 72 65 64 20 62   be .** shared b
8340: 79 20 6d 75 6c 74 69 70 6c 65 20 74 68 72 65 61  y multiple threa
8350: 64 73 2e 0a 2a 2a 0a 2a 2a 20 46 75 6e 63 74 69  ds..**.** Functi
8360: 6f 6e 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64  on unixMutexHeld
8370: 28 29 20 69 73 20 75 73 65 64 20 74 6f 20 61 73  () is used to as
8380: 73 65 72 74 28 29 20 74 68 61 74 20 74 68 65 20  sert() that the 
8390: 67 6c 6f 62 61 6c 20 6d 75 74 65 78 20 0a 2a 2a  global mutex .**
83a0: 20 69 73 20 68 65 6c 64 20 77 68 65 6e 20 72 65   is held when re
83b0: 71 75 69 72 65 64 2e 20 54 68 69 73 20 66 75 6e  quired. This fun
83c0: 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73  ction is only us
83d0: 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 61 73  ed as part of as
83e0: 73 65 72 74 28 29 20 0a 2a 2a 20 73 74 61 74 65  sert() .** state
83f0: 6d 65 6e 74 73 2e 20 65 2e 67 2e 0a 2a 2a 0a 2a  ments. e.g..**.*
8400: 2a 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74  *   unixEnterMut
8410: 65 78 28 29 0a 2a 2a 20 20 20 20 20 61 73 73 65  ex().**     asse
8420: 72 74 28 20 75 6e 69 78 4d 75 74 65 78 48 65 6c  rt( unixMutexHel
8430: 64 28 29 20 29 3b 0a 2a 2a 20 20 20 75 6e 69 78  d() );.**   unix
8440: 45 6e 74 65 72 4c 65 61 76 65 28 29 0a 2a 2f 0a  EnterLeave().*/.
8450: 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78  static void unix
8460: 45 6e 74 65 72 4d 75 74 65 78 28 76 6f 69 64 29  EnterMutex(void)
8470: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  {.  sqlite3_mute
8480: 78 5f 65 6e 74 65 72 28 73 71 6c 69 74 65 33 4d  x_enter(sqlite3M
8490: 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45  utexAlloc(SQLITE
84a0: 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 56 46  _MUTEX_STATIC_VF
84b0: 53 31 29 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76  S1));.}.static v
84c0: 6f 69 64 20 75 6e 69 78 4c 65 61 76 65 4d 75 74  oid unixLeaveMut
84d0: 65 78 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69  ex(void){.  sqli
84e0: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
84f0: 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
8500: 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
8510: 54 41 54 49 43 5f 56 46 53 31 29 29 3b 0a 7d 0a  TATIC_VFS1));.}.
8520: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
8530: 42 55 47 0a 73 74 61 74 69 63 20 69 6e 74 20 75  BUG.static int u
8540: 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 76 6f 69  nixMutexHeld(voi
8550: 64 29 20 7b 0a 20 20 72 65 74 75 72 6e 20 73 71  d) {.  return sq
8560: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
8570: 28 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c  (sqlite3MutexAll
8580: 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
8590: 53 54 41 54 49 43 5f 56 46 53 31 29 29 3b 0a 7d  STATIC_VFS1));.}
85a0: 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66 64 65 66  .#endif...#ifdef
85b0: 20 53 51 4c 49 54 45 5f 48 41 56 45 5f 4f 53 5f   SQLITE_HAVE_OS_
85c0: 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20 48 65 6c 70  TRACE./*.** Help
85d0: 65 72 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20  er function for 
85e0: 70 72 69 6e 74 69 6e 67 20 6f 75 74 20 74 72 61  printing out tra
85f0: 63 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ce information f
8600: 72 6f 6d 20 64 65 62 75 67 67 69 6e 67 0a 2a 2a  rom debugging.**
8610: 20 62 69 6e 61 72 69 65 73 2e 20 54 68 69 73 20   binaries. This 
8620: 72 65 74 75 72 6e 73 20 74 68 65 20 73 74 72 69  returns the stri
8630: 6e 67 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  ng representatio
8640: 6e 20 6f 66 20 74 68 65 20 73 75 70 70 6c 69 65  n of the supplie
8650: 64 0a 2a 2a 20 69 6e 74 65 67 65 72 20 6c 6f 63  d.** integer loc
8660: 6b 2d 74 79 70 65 2e 0a 2a 2f 0a 73 74 61 74 69  k-type..*/.stati
8670: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a  c const char *az
8680: 46 69 6c 65 4c 6f 63 6b 28 69 6e 74 20 65 46 69  FileLock(int eFi
8690: 6c 65 4c 6f 63 6b 29 7b 0a 20 20 73 77 69 74 63  leLock){.  switc
86a0: 68 28 20 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a  h( eFileLock ){.
86b0: 20 20 20 20 63 61 73 65 20 4e 4f 5f 4c 4f 43 4b      case NO_LOCK
86c0: 3a 20 72 65 74 75 72 6e 20 22 4e 4f 4e 45 22 3b  : return "NONE";
86d0: 0a 20 20 20 20 63 61 73 65 20 53 48 41 52 45 44  .    case SHARED
86e0: 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 53  _LOCK: return "S
86f0: 48 41 52 45 44 22 3b 0a 20 20 20 20 63 61 73 65  HARED";.    case
8700: 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 3a 20   RESERVED_LOCK: 
8710: 72 65 74 75 72 6e 20 22 52 45 53 45 52 56 45 44  return "RESERVED
8720: 22 3b 0a 20 20 20 20 63 61 73 65 20 50 45 4e 44  ";.    case PEND
8730: 49 4e 47 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e  ING_LOCK: return
8740: 20 22 50 45 4e 44 49 4e 47 22 3b 0a 20 20 20 20   "PENDING";.    
8750: 63 61 73 65 20 45 58 43 4c 55 53 49 56 45 5f 4c  case EXCLUSIVE_L
8760: 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 45 58 43  OCK: return "EXC
8770: 4c 55 53 49 56 45 22 3b 0a 20 20 7d 0a 20 20 72  LUSIVE";.  }.  r
8780: 65 74 75 72 6e 20 22 45 52 52 4f 52 22 3b 0a 7d  eturn "ERROR";.}
8790: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20  .#endif..#ifdef 
87a0: 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52 41 43  SQLITE_LOCK_TRAC
87b0: 45 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 6f 75  E./*.** Print ou
87c0: 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  t information ab
87d0: 6f 75 74 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20  out all locking 
87e0: 6f 70 65 72 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a  operations..**.*
87f0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
8800: 73 20 75 73 65 64 20 66 6f 72 20 74 72 6f 75 62  s used for troub
8810: 6c 65 73 68 6f 6f 74 69 6e 67 20 6c 6f 63 6b 73  leshooting locks
8820: 20 6f 6e 20 6d 75 6c 74 69 74 68 72 65 61 64 65   on multithreade
8830: 64 0a 2a 2a 20 70 6c 61 74 66 6f 72 6d 73 2e 20  d.** platforms. 
8840: 20 45 6e 61 62 6c 65 20 62 79 20 63 6f 6d 70 69   Enable by compi
8850: 6c 69 6e 67 20 77 69 74 68 20 74 68 65 20 2d 44  ling with the -D
8860: 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52 41 43  SQLITE_LOCK_TRAC
8870: 45 0a 2a 2a 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e  E.** command-lin
8880: 65 20 6f 70 74 69 6f 6e 20 6f 6e 20 74 68 65 20  e option on the 
8890: 63 6f 6d 70 69 6c 65 72 2e 20 20 54 68 69 73 20  compiler.  This 
88a0: 63 6f 64 65 20 69 73 20 6e 6f 72 6d 61 6c 6c 79  code is normally
88b0: 0a 2a 2a 20 74 75 72 6e 65 64 20 6f 66 66 2e 0a  .** turned off..
88c0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f  */.static int lo
88d0: 63 6b 54 72 61 63 65 28 69 6e 74 20 66 64 2c 20  ckTrace(int fd, 
88e0: 69 6e 74 20 6f 70 2c 20 73 74 72 75 63 74 20 66  int op, struct f
88f0: 6c 6f 63 6b 20 2a 70 29 7b 0a 20 20 63 68 61 72  lock *p){.  char
8900: 20 2a 7a 4f 70 4e 61 6d 65 2c 20 2a 7a 54 79 70   *zOpName, *zTyp
8910: 65 3b 0a 20 20 69 6e 74 20 73 3b 0a 20 20 69 6e  e;.  int s;.  in
8920: 74 20 73 61 76 65 64 45 72 72 6e 6f 3b 0a 20 20  t savedErrno;.  
8930: 69 66 28 20 6f 70 3d 3d 46 5f 47 45 54 4c 4b 20  if( op==F_GETLK 
8940: 29 7b 0a 20 20 20 20 7a 4f 70 4e 61 6d 65 20 3d  ){.    zOpName =
8950: 20 22 47 45 54 4c 4b 22 3b 0a 20 20 7d 65 6c 73   "GETLK";.  }els
8960: 65 20 69 66 28 20 6f 70 3d 3d 46 5f 53 45 54 4c  e if( op==F_SETL
8970: 4b 20 29 7b 0a 20 20 20 20 7a 4f 70 4e 61 6d 65  K ){.    zOpName
8980: 20 3d 20 22 53 45 54 4c 4b 22 3b 0a 20 20 7d 65   = "SETLK";.  }e
8990: 6c 73 65 7b 0a 20 20 20 20 73 20 3d 20 6f 73 46  lse{.    s = osF
89a0: 63 6e 74 6c 28 66 64 2c 20 6f 70 2c 20 70 29 3b  cntl(fd, op, p);
89b0: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
89c0: 67 50 72 69 6e 74 66 28 22 66 63 6e 74 6c 20 75  gPrintf("fcntl u
89d0: 6e 6b 6e 6f 77 6e 20 25 64 20 25 64 20 25 64 5c  nknown %d %d %d\
89e0: 6e 22 2c 20 66 64 2c 20 6f 70 2c 20 73 29 3b 0a  n", fd, op, s);.
89f0: 20 20 20 20 72 65 74 75 72 6e 20 73 3b 0a 20 20      return s;.  
8a00: 7d 0a 20 20 69 66 28 20 70 2d 3e 6c 5f 74 79 70  }.  if( p->l_typ
8a10: 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20  e==F_RDLCK ){.  
8a20: 20 20 7a 54 79 70 65 20 3d 20 22 52 44 4c 43 4b    zType = "RDLCK
8a30: 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70  ";.  }else if( p
8a40: 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 57 52 4c 43  ->l_type==F_WRLC
8a50: 4b 20 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d  K ){.    zType =
8a60: 20 22 57 52 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73   "WRLCK";.  }els
8a70: 65 20 69 66 28 20 70 2d 3e 6c 5f 74 79 70 65 3d  e if( p->l_type=
8a80: 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20  =F_UNLCK ){.    
8a90: 7a 54 79 70 65 20 3d 20 22 55 4e 4c 43 4b 22 3b  zType = "UNLCK";
8aa0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
8ab0: 73 65 72 74 28 20 30 20 29 3b 0a 20 20 7d 0a 20  sert( 0 );.  }. 
8ac0: 20 61 73 73 65 72 74 28 20 70 2d 3e 6c 5f 77 68   assert( p->l_wh
8ad0: 65 6e 63 65 3d 3d 53 45 45 4b 5f 53 45 54 20 29  ence==SEEK_SET )
8ae0: 3b 0a 20 20 73 20 3d 20 6f 73 46 63 6e 74 6c 28  ;.  s = osFcntl(
8af0: 66 64 2c 20 6f 70 2c 20 70 29 3b 0a 20 20 73 61  fd, op, p);.  sa
8b00: 76 65 64 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  vedErrno = errno
8b10: 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67  ;.  sqlite3Debug
8b20: 50 72 69 6e 74 66 28 22 66 63 6e 74 6c 20 25 64  Printf("fcntl %d
8b30: 20 25 64 20 25 73 20 25 73 20 25 64 20 25 64 20   %d %s %s %d %d 
8b40: 25 64 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 74  %d %d\n",.     t
8b50: 68 72 65 61 64 69 64 2c 20 66 64 2c 20 7a 4f 70  hreadid, fd, zOp
8b60: 4e 61 6d 65 2c 20 7a 54 79 70 65 2c 20 28 69 6e  Name, zType, (in
8b70: 74 29 70 2d 3e 6c 5f 73 74 61 72 74 2c 20 28 69  t)p->l_start, (i
8b80: 6e 74 29 70 2d 3e 6c 5f 6c 65 6e 2c 0a 20 20 20  nt)p->l_len,.   
8b90: 20 20 28 69 6e 74 29 70 2d 3e 6c 5f 70 69 64 2c    (int)p->l_pid,
8ba0: 20 73 29 3b 0a 20 20 69 66 28 20 73 3d 3d 28 2d   s);.  if( s==(-
8bb0: 31 29 20 26 26 20 6f 70 3d 3d 46 5f 53 45 54 4c  1) && op==F_SETL
8bc0: 4b 20 26 26 20 28 70 2d 3e 6c 5f 74 79 70 65 3d  K && (p->l_type=
8bd0: 3d 46 5f 52 44 4c 43 4b 20 7c 7c 20 70 2d 3e 6c  =F_RDLCK || p->l
8be0: 5f 74 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 29 20  _type==F_WRLCK) 
8bf0: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 66 6c  ){.    struct fl
8c00: 6f 63 6b 20 6c 32 3b 0a 20 20 20 20 6c 32 20 3d  ock l2;.    l2 =
8c10: 20 2a 70 3b 0a 20 20 20 20 6f 73 46 63 6e 74 6c   *p;.    osFcntl
8c20: 28 66 64 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c  (fd, F_GETLK, &l
8c30: 32 29 3b 0a 20 20 20 20 69 66 28 20 6c 32 2e 6c  2);.    if( l2.l
8c40: 5f 74 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29  _type==F_RDLCK )
8c50: 7b 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20  {.      zType = 
8c60: 22 52 44 4c 43 4b 22 3b 0a 20 20 20 20 7d 65 6c  "RDLCK";.    }el
8c70: 73 65 20 69 66 28 20 6c 32 2e 6c 5f 74 79 70 65  se if( l2.l_type
8c80: 3d 3d 46 5f 57 52 4c 43 4b 20 29 7b 0a 20 20 20  ==F_WRLCK ){.   
8c90: 20 20 20 7a 54 79 70 65 20 3d 20 22 57 52 4c 43     zType = "WRLC
8ca0: 4b 22 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  K";.    }else if
8cb0: 28 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f 55  ( l2.l_type==F_U
8cc0: 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 7a 54  NLCK ){.      zT
8cd0: 79 70 65 20 3d 20 22 55 4e 4c 43 4b 22 3b 0a 20  ype = "UNLCK";. 
8ce0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
8cf0: 61 73 73 65 72 74 28 20 30 20 29 3b 0a 20 20 20  assert( 0 );.   
8d00: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65   }.    sqlite3De
8d10: 62 75 67 50 72 69 6e 74 66 28 22 66 63 6e 74 6c  bugPrintf("fcntl
8d20: 2d 66 61 69 6c 75 72 65 2d 72 65 61 73 6f 6e 3a  -failure-reason:
8d30: 20 25 73 20 25 64 20 25 64 20 25 64 5c 6e 22 2c   %s %d %d %d\n",
8d40: 0a 20 20 20 20 20 20 20 7a 54 79 70 65 2c 20 28  .       zType, (
8d50: 69 6e 74 29 6c 32 2e 6c 5f 73 74 61 72 74 2c 20  int)l2.l_start, 
8d60: 28 69 6e 74 29 6c 32 2e 6c 5f 6c 65 6e 2c 20 28  (int)l2.l_len, (
8d70: 69 6e 74 29 6c 32 2e 6c 5f 70 69 64 29 3b 0a 20  int)l2.l_pid);. 
8d80: 20 7d 0a 20 20 65 72 72 6e 6f 20 3d 20 73 61 76   }.  errno = sav
8d90: 65 64 45 72 72 6e 6f 3b 0a 20 20 72 65 74 75 72  edErrno;.  retur
8da0: 6e 20 73 3b 0a 7d 0a 23 75 6e 64 65 66 20 6f 73  n s;.}.#undef os
8db0: 46 63 6e 74 6c 0a 23 64 65 66 69 6e 65 20 6f 73  Fcntl.#define os
8dc0: 46 63 6e 74 6c 20 6c 6f 63 6b 54 72 61 63 65 0a  Fcntl lockTrace.
8dd0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
8de0: 5f 4c 4f 43 4b 5f 54 52 41 43 45 20 2a 2f 0a 0a  _LOCK_TRACE */..
8df0: 2f 2a 0a 2a 2a 20 52 65 74 72 79 20 66 74 72 75  /*.** Retry ftru
8e00: 6e 63 61 74 65 28 29 20 63 61 6c 6c 73 20 74 68  ncate() calls th
8e10: 61 74 20 66 61 69 6c 20 64 75 65 20 74 6f 20 45  at fail due to E
8e20: 49 4e 54 52 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 63  INTR.**.** All c
8e30: 61 6c 6c 73 20 74 6f 20 66 74 72 75 6e 63 61 74  alls to ftruncat
8e40: 65 28 29 20 77 69 74 68 69 6e 20 74 68 69 73 20  e() within this 
8e50: 66 69 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 6d  file should be m
8e60: 61 64 65 20 74 68 72 6f 75 67 68 0a 2a 2a 20 74  ade through.** t
8e70: 68 69 73 20 77 72 61 70 70 65 72 2e 20 20 4f 6e  his wrapper.  On
8e80: 20 74 68 65 20 41 6e 64 72 6f 69 64 20 70 6c 61   the Android pla
8e90: 74 66 6f 72 6d 2c 20 62 79 70 61 73 73 69 6e 67  tform, bypassing
8ea0: 20 74 68 65 20 6c 6f 67 69 63 20 62 65 6c 6f 77   the logic below
8eb0: 0a 2a 2a 20 63 6f 75 6c 64 20 6c 65 61 64 20 74  .** could lead t
8ec0: 6f 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61  o a corrupt data
8ed0: 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  base..*/.static 
8ee0: 69 6e 74 20 72 6f 62 75 73 74 5f 66 74 72 75 6e  int robust_ftrun
8ef0: 63 61 74 65 28 69 6e 74 20 68 2c 20 73 71 6c 69  cate(int h, sqli
8f00: 74 65 33 5f 69 6e 74 36 34 20 73 7a 29 7b 0a 20  te3_int64 sz){. 
8f10: 20 69 6e 74 20 72 63 3b 0a 23 69 66 64 65 66 20   int rc;.#ifdef 
8f20: 5f 5f 41 4e 44 52 4f 49 44 5f 5f 0a 20 20 2f 2a  __ANDROID__.  /*
8f30: 20 4f 6e 20 41 6e 64 72 6f 69 64 2c 20 66 74 72   On Android, ftr
8f40: 75 6e 63 61 74 65 28 29 20 61 6c 77 61 79 73 20  uncate() always 
8f50: 75 73 65 73 20 33 32 2d 62 69 74 20 6f 66 66 73  uses 32-bit offs
8f60: 65 74 73 2c 20 65 76 65 6e 20 69 66 20 0a 20 20  ets, even if .  
8f70: 2a 2a 20 5f 46 49 4c 45 5f 4f 46 46 53 45 54 5f  ** _FILE_OFFSET_
8f80: 42 49 54 53 3d 36 34 20 69 73 20 64 65 66 69 6e  BITS=64 is defin
8f90: 65 64 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 69  ed. This means i
8fa0: 74 20 69 73 20 75 6e 73 61 66 65 20 74 6f 20 61  t is unsafe to a
8fb0: 74 74 65 6d 70 74 20 74 6f 0a 20 20 2a 2a 20 74  ttempt to.  ** t
8fc0: 72 75 6e 63 61 74 65 20 61 20 66 69 6c 65 20 74  runcate a file t
8fd0: 6f 20 61 6e 79 20 73 69 7a 65 20 6c 61 72 67 65  o any size large
8fe0: 72 20 74 68 61 6e 20 32 47 69 42 2e 20 53 69 6c  r than 2GiB. Sil
8ff0: 65 6e 74 6c 79 20 69 67 6e 6f 72 65 20 61 6e 79  ently ignore any
9000: 0a 20 20 2a 2a 20 73 75 63 68 20 61 74 74 65 6d  .  ** such attem
9010: 70 74 73 2e 20 20 2a 2f 0a 20 20 69 66 28 20 73  pts.  */.  if( s
9020: 7a 3e 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  z>(sqlite3_int64
9030: 29 30 78 37 46 46 46 46 46 46 46 20 29 7b 0a 20  )0x7FFFFFFF ){. 
9040: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
9050: 4b 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69  K;.  }else.#endi
9060: 66 0a 20 20 64 6f 7b 20 72 63 20 3d 20 6f 73 46  f.  do{ rc = osF
9070: 74 72 75 6e 63 61 74 65 28 68 2c 73 7a 29 3b 20  truncate(h,sz); 
9080: 7d 77 68 69 6c 65 28 20 72 63 3c 30 20 26 26 20  }while( rc<0 && 
9090: 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a  errno==EINTR );.
90a0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
90b0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
90c0: 6e 65 20 74 72 61 6e 73 6c 61 74 65 73 20 61 20  ne translates a 
90d0: 73 74 61 6e 64 61 72 64 20 50 4f 53 49 58 20 65  standard POSIX e
90e0: 72 72 6e 6f 20 63 6f 64 65 20 69 6e 74 6f 20 73  rrno code into s
90f0: 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 75 73 65 66  omething.** usef
9100: 75 6c 20 74 6f 20 74 68 65 20 63 6c 69 65 6e 74  ul to the client
9110: 73 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33  s of the sqlite3
9120: 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20 53 70 65   functions.  Spe
9130: 63 69 66 69 63 61 6c 6c 79 2c 20 69 74 20 69 73  cifically, it is
9140: 0a 2a 2a 20 69 6e 74 65 6e 64 65 64 20 74 6f 20  .** intended to 
9150: 74 72 61 6e 73 6c 61 74 65 20 61 20 76 61 72 69  translate a vari
9160: 65 74 79 20 6f 66 20 22 74 72 79 20 61 67 61 69  ety of "try agai
9170: 6e 22 20 65 72 72 6f 72 73 20 69 6e 74 6f 20 53  n" errors into S
9180: 51 4c 49 54 45 5f 42 55 53 59 0a 2a 2a 20 61 6e  QLITE_BUSY.** an
9190: 64 20 61 20 76 61 72 69 65 74 79 20 6f 66 20 22  d a variety of "
91a0: 70 6c 65 61 73 65 20 63 6c 6f 73 65 20 74 68 65  please close the
91b0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
91c0: 20 4e 4f 57 22 20 65 72 72 6f 72 73 20 69 6e 74   NOW" errors int
91d0: 6f 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 49 4f 45  o .** SQLITE_IOE
91e0: 52 52 0a 2a 2a 20 0a 2a 2a 20 45 72 72 6f 72 73  RR.** .** Errors
91f0: 20 64 75 72 69 6e 67 20 69 6e 69 74 69 61 6c 69   during initiali
9200: 7a 61 74 69 6f 6e 20 6f 66 20 6c 6f 63 6b 73 2c  zation of locks,
9210: 20 6f 72 20 66 69 6c 65 20 73 79 73 74 65 6d 20   or file system 
9220: 73 75 70 70 6f 72 74 20 66 6f 72 20 6c 6f 63 6b  support for lock
9230: 73 2c 0a 2a 2a 20 73 68 6f 75 6c 64 20 68 61 6e  s,.** should han
9240: 64 6c 65 20 45 4e 4f 4c 43 4b 2c 20 45 4e 4f 54  dle ENOLCK, ENOT
9250: 53 55 50 2c 20 45 4f 50 4e 4f 54 53 55 50 50 20  SUP, EOPNOTSUPP 
9260: 73 65 70 61 72 61 74 65 6c 79 2e 0a 2a 2f 0a 73  separately..*/.s
9270: 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65  tatic int sqlite
9280: 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
9290: 72 6f 72 28 69 6e 74 20 70 6f 73 69 78 45 72 72  ror(int posixErr
92a0: 6f 72 2c 20 69 6e 74 20 73 71 6c 69 74 65 49 4f  or, int sqliteIO
92b0: 45 72 72 29 20 7b 0a 20 20 61 73 73 65 72 74 28  Err) {.  assert(
92c0: 20 28 73 71 6c 69 74 65 49 4f 45 72 72 20 3d 3d   (sqliteIOErr ==
92d0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f   SQLITE_IOERR_LO
92e0: 43 4b 29 20 7c 7c 20 0a 20 20 20 20 20 20 20 20  CK) || .        
92f0: 20 20 28 73 71 6c 69 74 65 49 4f 45 72 72 20 3d    (sqliteIOErr =
9300: 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  = SQLITE_IOERR_U
9310: 4e 4c 4f 43 4b 29 20 7c 7c 20 0a 20 20 20 20 20  NLOCK) || .     
9320: 20 20 20 20 20 28 73 71 6c 69 74 65 49 4f 45 72       (sqliteIOEr
9330: 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  r == SQLITE_IOER
9340: 52 5f 52 44 4c 4f 43 4b 29 20 7c 7c 0a 20 20 20  R_RDLOCK) ||.   
9350: 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 49 4f         (sqliteIO
9360: 45 72 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f  Err == SQLITE_IO
9370: 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45  ERR_CHECKRESERVE
9380: 44 4c 4f 43 4b 29 20 29 3b 0a 20 20 73 77 69 74  DLOCK) );.  swit
9390: 63 68 20 28 70 6f 73 69 78 45 72 72 6f 72 29 20  ch (posixError) 
93a0: 7b 0a 20 20 63 61 73 65 20 45 41 43 43 45 53 3a  {.  case EACCES:
93b0: 20 0a 20 20 63 61 73 65 20 45 41 47 41 49 4e 3a   .  case EAGAIN:
93c0: 0a 20 20 63 61 73 65 20 45 54 49 4d 45 44 4f 55  .  case ETIMEDOU
93d0: 54 3a 0a 20 20 63 61 73 65 20 45 42 55 53 59 3a  T:.  case EBUSY:
93e0: 0a 20 20 63 61 73 65 20 45 49 4e 54 52 3a 0a 20  .  case EINTR:. 
93f0: 20 63 61 73 65 20 45 4e 4f 4c 43 4b 3a 20 20 0a   case ENOLCK:  .
9400: 20 20 20 20 2f 2a 20 72 61 6e 64 6f 6d 20 4e 46      /* random NF
9410: 53 20 72 65 74 72 79 20 65 72 72 6f 72 2c 20 75  S retry error, u
9420: 6e 6c 65 73 73 20 64 75 72 69 6e 67 20 66 69 6c  nless during fil
9430: 65 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74  e system support
9440: 20 0a 20 20 20 20 20 2a 20 69 6e 74 72 6f 73 70   .     * introsp
9450: 65 63 74 69 6f 6e 2c 20 69 6e 20 77 68 69 63 68  ection, in which
9460: 20 69 74 20 61 63 74 75 61 6c 6c 79 20 6d 65 61   it actually mea
9470: 6e 73 20 77 68 61 74 20 69 74 20 73 61 79 73 20  ns what it says 
9480: 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  */.    return SQ
9490: 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 0a  LITE_BUSY;.    .
94a0: 20 20 63 61 73 65 20 45 50 45 52 4d 3a 20 0a 20    case EPERM: . 
94b0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
94c0: 5f 50 45 52 4d 3b 0a 20 20 20 20 0a 20 20 64 65  _PERM;.    .  de
94d0: 66 61 75 6c 74 3a 20 0a 20 20 20 20 72 65 74 75  fault: .    retu
94e0: 72 6e 20 73 71 6c 69 74 65 49 4f 45 72 72 3b 0a  rn sqliteIOErr;.
94f0: 20 20 7d 0a 7d 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a    }.}.../*******
9500: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9510: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9520: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9530: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9540: 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
9550: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e  ********** Begin
9560: 20 55 6e 69 71 75 65 20 46 69 6c 65 20 49 44 20   Unique File ID 
9570: 55 74 69 6c 69 74 79 20 55 73 65 64 20 42 79 20  Utility Used By 
9580: 56 78 57 6f 72 6b 73 20 2a 2a 2a 2a 2a 2a 2a 2a  VxWorks ********
9590: 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4f 6e  *******.**.** On
95a0: 20 6d 6f 73 74 20 76 65 72 73 69 6f 6e 73 20 6f   most versions o
95b0: 66 20 75 6e 69 78 2c 20 77 65 20 63 61 6e 20 67  f unix, we can g
95c0: 65 74 20 61 20 75 6e 69 71 75 65 20 49 44 20 66  et a unique ID f
95d0: 6f 72 20 61 20 66 69 6c 65 20 62 79 20 63 6f 6e  or a file by con
95e0: 63 61 74 65 6e 61 74 69 6e 67 0a 2a 2a 20 74 68  catenating.** th
95f0: 65 20 64 65 76 69 63 65 20 6e 75 6d 62 65 72 20  e device number 
9600: 61 6e 64 20 74 68 65 20 69 6e 6f 64 65 20 6e 75  and the inode nu
9610: 6d 62 65 72 2e 20 20 42 75 74 20 74 68 69 73 20  mber.  But this 
9620: 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e  does not work on
9630: 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a 20 4f 6e 20   VxWorks..** On 
9640: 56 78 57 6f 72 6b 73 2c 20 61 20 75 6e 69 71 75  VxWorks, a uniqu
9650: 65 20 66 69 6c 65 20 69 64 20 6d 75 73 74 20 62  e file id must b
9660: 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 63  e based on the c
9670: 61 6e 6f 6e 69 63 61 6c 20 66 69 6c 65 6e 61 6d  anonical filenam
9680: 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 70 6f 69 6e 74  e..**.** A point
9690: 65 72 20 74 6f 20 61 6e 20 69 6e 73 74 61 6e 63  er to an instanc
96a0: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
96b0: 6e 67 20 73 74 72 75 63 74 75 72 65 20 63 61 6e  ng structure can
96c0: 20 62 65 20 75 73 65 64 20 61 73 20 61 0a 2a 2a   be used as a.**
96d0: 20 75 6e 69 71 75 65 20 66 69 6c 65 20 49 44 20   unique file ID 
96e0: 69 6e 20 56 78 57 6f 72 6b 73 2e 20 20 45 61 63  in VxWorks.  Eac
96f0: 68 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  h instance of th
9700: 69 73 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e  is structure con
9710: 74 61 69 6e 73 0a 2a 2a 20 61 20 63 6f 70 79 20  tains.** a copy 
9720: 6f 66 20 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c  of the canonical
9730: 20 66 69 6c 65 6e 61 6d 65 2e 20 20 54 68 65 72   filename.  Ther
9740: 65 20 69 73 20 61 6c 73 6f 20 61 20 72 65 66 65  e is also a refe
9750: 72 65 6e 63 65 20 63 6f 75 6e 74 2e 20 20 0a 2a  rence count.  .*
9760: 2a 20 54 68 65 20 73 74 72 75 63 74 75 72 65 20  * The structure 
9770: 69 73 20 72 65 63 6c 61 69 6d 65 64 20 77 68 65  is reclaimed whe
9780: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
9790: 70 6f 69 6e 74 65 72 73 20 74 6f 20 69 74 20 64  pointers to it d
97a0: 72 6f 70 73 20 74 6f 0a 2a 2a 20 7a 65 72 6f 2e  rops to.** zero.
97b0: 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72 65  .**.** There are
97c0: 20 6e 65 76 65 72 20 76 65 72 79 20 6d 61 6e 79   never very many
97d0: 20 66 69 6c 65 73 20 6f 70 65 6e 20 61 74 20 6f   files open at o
97e0: 6e 65 20 74 69 6d 65 20 61 6e 64 20 6c 6f 6f 6b  ne time and look
97f0: 75 70 73 20 61 72 65 20 6e 6f 74 0a 2a 2a 20 61  ups are not.** a
9800: 20 70 65 72 66 6f 72 6d 61 6e 63 65 2d 63 72 69   performance-cri
9810: 74 69 63 61 6c 20 70 61 74 68 2c 20 73 6f 20 69  tical path, so i
9820: 74 20 69 73 20 73 75 66 66 69 63 69 65 6e 74 20  t is sufficient 
9830: 74 6f 20 70 75 74 20 74 68 65 73 65 0a 2a 2a 20  to put these.** 
9840: 73 74 72 75 63 74 75 72 65 73 20 6f 6e 20 61 20  structures on a 
9850: 6c 69 6e 6b 65 64 20 6c 69 73 74 2e 0a 2a 2f 0a  linked list..*/.
9860: 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69  struct vxworksFi
9870: 6c 65 49 64 20 7b 0a 20 20 73 74 72 75 63 74 20  leId {.  struct 
9880: 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70  vxworksFileId *p
9890: 4e 65 78 74 3b 20 20 2f 2a 20 4e 65 78 74 20 69  Next;  /* Next i
98a0: 6e 20 61 20 6c 69 73 74 20 6f 66 20 74 68 65 6d  n a list of them
98b0: 20 61 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e 52   all */.  int nR
98c0: 65 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ef;             
98d0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
98e0: 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20  r of references 
98f0: 74 6f 20 74 68 69 73 20 6f 6e 65 20 2a 2f 0a 20  to this one */. 
9900: 20 69 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20   int nName;     
9910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9920: 2a 20 4c 65 6e 67 74 68 20 6f 66 20 74 68 65 20  * Length of the 
9930: 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 5b 5d  zCanonicalName[]
9940: 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 63 68 61   string */.  cha
9950: 72 20 2a 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d  r *zCanonicalNam
9960: 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61  e;         /* Ca
9970: 6e 6f 6e 69 63 61 6c 20 66 69 6c 65 6e 61 6d 65  nonical filename
9980: 20 2a 2f 0a 7d 3b 0a 0a 23 69 66 20 4f 53 5f 56   */.};..#if OS_V
9990: 58 57 4f 52 4b 53 0a 2f 2a 20 0a 2a 2a 20 41 6c  XWORKS./* .** Al
99a0: 6c 20 75 6e 69 71 75 65 20 66 69 6c 65 6e 61 6d  l unique filenam
99b0: 65 73 20 61 72 65 20 68 65 6c 64 20 6f 6e 20 61  es are held on a
99c0: 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 68 65 61   linked list hea
99d0: 64 65 64 20 62 79 20 74 68 69 73 0a 2a 2a 20 76  ded by this.** v
99e0: 61 72 69 61 62 6c 65 3a 0a 2a 2f 0a 73 74 61 74  ariable:.*/.stat
99f0: 69 63 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b  ic struct vxwork
9a00: 73 46 69 6c 65 49 64 20 2a 76 78 77 6f 72 6b 73  sFileId *vxworks
9a10: 46 69 6c 65 4c 69 73 74 20 3d 20 30 3b 0a 0a 2f  FileList = 0;../
9a20: 2a 0a 2a 2a 20 53 69 6d 70 6c 69 66 79 20 61 20  *.** Simplify a 
9a30: 66 69 6c 65 6e 61 6d 65 20 69 6e 74 6f 20 69 74  filename into it
9a40: 73 20 63 61 6e 6f 6e 69 63 61 6c 20 66 6f 72 6d  s canonical form
9a50: 0a 2a 2a 20 62 79 20 6d 61 6b 69 6e 67 20 74 68  .** by making th
9a60: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 6e  e following chan
9a70: 67 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 2a 20 72 65  ges:.**.**  * re
9a80: 6d 6f 76 69 6e 67 20 61 6e 79 20 74 72 61 69 6c  moving any trail
9a90: 69 6e 67 20 61 6e 64 20 64 75 70 6c 69 63 61 74  ing and duplicat
9aa0: 65 20 2f 0a 2a 2a 20 20 2a 20 63 6f 6e 76 65 72  e /.**  * conver
9ab0: 74 20 2f 2e 2f 20 69 6e 74 6f 20 6a 75 73 74 20  t /./ into just 
9ac0: 2f 0a 2a 2a 20 20 2a 20 63 6f 6e 76 65 72 74 20  /.**  * convert 
9ad0: 2f 41 2f 2e 2e 2f 20 77 68 65 72 65 20 41 20 69  /A/../ where A i
9ae0: 73 20 61 6e 79 20 73 69 6d 70 6c 65 20 6e 61 6d  s any simple nam
9af0: 65 20 69 6e 74 6f 20 6a 75 73 74 20 2f 0a 2a 2a  e into just /.**
9b00: 0a 2a 2a 20 43 68 61 6e 67 65 73 20 61 72 65 20  .** Changes are 
9b10: 6d 61 64 65 20 69 6e 2d 70 6c 61 63 65 2e 20 20  made in-place.  
9b20: 52 65 74 75 72 6e 20 74 68 65 20 6e 65 77 20 6e  Return the new n
9b30: 61 6d 65 20 6c 65 6e 67 74 68 2e 0a 2a 2a 0a 2a  ame length..**.*
9b40: 2a 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 66  * The original f
9b50: 69 6c 65 6e 61 6d 65 20 69 73 20 69 6e 20 7a 5b  ilename is in z[
9b60: 30 2e 2e 6e 2d 31 5d 2e 20 20 52 65 74 75 72 6e  0..n-1].  Return
9b70: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a   the number of.*
9b80: 2a 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20  * characters in 
9b90: 74 68 65 20 73 69 6d 70 6c 69 66 69 65 64 20 6e  the simplified n
9ba0: 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ame..*/.static i
9bb0: 6e 74 20 76 78 77 6f 72 6b 73 53 69 6d 70 6c 69  nt vxworksSimpli
9bc0: 66 79 4e 61 6d 65 28 63 68 61 72 20 2a 7a 2c 20  fyName(char *z, 
9bd0: 69 6e 74 20 6e 29 7b 0a 20 20 69 6e 74 20 69 2c  int n){.  int i,
9be0: 20 6a 3b 0a 20 20 77 68 69 6c 65 28 20 6e 3e 31   j;.  while( n>1
9bf0: 20 26 26 20 7a 5b 6e 2d 31 5d 3d 3d 27 2f 27 20   && z[n-1]=='/' 
9c00: 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 66 6f 72 28  ){ n--; }.  for(
9c10: 69 3d 6a 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29  i=j=0; i<n; i++)
9c20: 7b 0a 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d  {.    if( z[i]==
9c30: 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 69 66 28  '/' ){.      if(
9c40: 20 7a 5b 69 2b 31 5d 3d 3d 27 2f 27 20 29 20 63   z[i+1]=='/' ) c
9c50: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69  ontinue;.      i
9c60: 66 28 20 7a 5b 69 2b 31 5d 3d 3d 27 2e 27 20 26  f( z[i+1]=='.' &
9c70: 26 20 69 2b 32 3c 6e 20 26 26 20 7a 5b 69 2b 32  & i+2<n && z[i+2
9c80: 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20  ]=='/' ){.      
9c90: 20 20 69 20 2b 3d 20 31 3b 0a 20 20 20 20 20 20    i += 1;.      
9ca0: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
9cb0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 5b    }.      if( z[
9cc0: 69 2b 31 5d 3d 3d 27 2e 27 20 26 26 20 69 2b 33  i+1]=='.' && i+3
9cd0: 3c 6e 20 26 26 20 7a 5b 69 2b 32 5d 3d 3d 27 2e  <n && z[i+2]=='.
9ce0: 27 20 26 26 20 7a 5b 69 2b 33 5d 3d 3d 27 2f 27  ' && z[i+3]=='/'
9cf0: 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c   ){.        whil
9d00: 65 28 20 6a 3e 30 20 26 26 20 7a 5b 6a 2d 31 5d  e( j>0 && z[j-1]
9d10: 21 3d 27 2f 27 20 29 7b 20 6a 2d 2d 3b 20 7d 0a  !='/' ){ j--; }.
9d20: 20 20 20 20 20 20 20 20 69 66 28 20 6a 3e 30 20          if( j>0 
9d30: 29 7b 20 6a 2d 2d 3b 20 7d 0a 20 20 20 20 20 20  ){ j--; }.      
9d40: 20 20 69 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20    i += 2;.      
9d50: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
9d60: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 5b    }.    }.    z[
9d70: 6a 2b 2b 5d 20 3d 20 7a 5b 69 5d 3b 0a 20 20 7d  j++] = z[i];.  }
9d80: 0a 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20 72  .  z[j] = 0;.  r
9d90: 65 74 75 72 6e 20 6a 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn j;.}../*.*
9da0: 2a 20 46 69 6e 64 20 61 20 75 6e 69 71 75 65 20  * Find a unique 
9db0: 66 69 6c 65 20 49 44 20 66 6f 72 20 74 68 65 20  file ID for the 
9dc0: 67 69 76 65 6e 20 61 62 73 6f 6c 75 74 65 20 70  given absolute p
9dd0: 61 74 68 6e 61 6d 65 2e 20 20 52 65 74 75 72 6e  athname.  Return
9de0: 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  .** a pointer to
9df0: 20 74 68 65 20 76 78 77 6f 72 6b 73 46 69 6c 65   the vxworksFile
9e00: 49 64 20 6f 62 6a 65 63 74 2e 20 20 54 68 69 73  Id object.  This
9e10: 20 70 6f 69 6e 74 65 72 20 69 73 20 74 68 65 20   pointer is the 
9e20: 75 6e 69 71 75 65 0a 2a 2a 20 66 69 6c 65 20 49  unique.** file I
9e30: 44 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 52 65  D..**.** The nRe
9e40: 66 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 76  f field of the v
9e50: 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a  xworksFileId obj
9e60: 65 63 74 20 69 73 20 69 6e 63 72 65 6d 65 6e 74  ect is increment
9e70: 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65  ed before.** the
9e80: 20 6f 62 6a 65 63 74 20 69 73 20 72 65 74 75 72   object is retur
9e90: 6e 65 64 2e 20 20 41 20 6e 65 77 20 76 78 77 6f  ned.  A new vxwo
9ea0: 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65 63 74  rksFileId object
9eb0: 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 61   is created.** a
9ec0: 6e 64 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  nd added to the 
9ed0: 67 6c 6f 62 61 6c 20 6c 69 73 74 20 69 66 20 6e  global list if n
9ee0: 65 63 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20  ecessary..**.** 
9ef0: 49 66 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  If a memory allo
9f00: 63 61 74 69 6f 6e 20 65 72 72 6f 72 20 6f 63 63  cation error occ
9f10: 75 72 73 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c  urs, return NULL
9f20: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75  ..*/.static stru
9f30: 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64  ct vxworksFileId
9f40: 20 2a 76 78 77 6f 72 6b 73 46 69 6e 64 46 69 6c   *vxworksFindFil
9f50: 65 49 64 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  eId(const char *
9f60: 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65 29 7b 0a  zAbsoluteName){.
9f70: 20 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73    struct vxworks
9f80: 46 69 6c 65 49 64 20 2a 70 4e 65 77 3b 20 20 20  FileId *pNew;   
9f90: 20 20 20 20 20 20 2f 2a 20 73 65 61 72 63 68 20        /* search 
9fa0: 6b 65 79 20 61 6e 64 20 6e 65 77 20 66 69 6c 65  key and new file
9fb0: 20 49 44 20 2a 2f 0a 20 20 73 74 72 75 63 74 20   ID */.  struct 
9fc0: 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70  vxworksFileId *p
9fd0: 43 61 6e 64 69 64 61 74 65 3b 20 20 20 2f 2a 20  Candidate;   /* 
9fe0: 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72  For looping over
9ff0: 20 65 78 69 73 74 69 6e 67 20 66 69 6c 65 20 49   existing file I
a000: 44 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20  Ds */.  int n;  
a010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a020: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
a030: 65 6e 67 74 68 20 6f 66 20 7a 41 62 73 6f 6c 75  ength of zAbsolu
a040: 74 65 4e 61 6d 65 20 73 74 72 69 6e 67 20 2a 2f  teName string */
a050: 0a 0a 20 20 61 73 73 65 72 74 28 20 7a 41 62 73  ..  assert( zAbs
a060: 6f 6c 75 74 65 4e 61 6d 65 5b 30 5d 3d 3d 27 2f  oluteName[0]=='/
a070: 27 20 29 3b 0a 20 20 6e 20 3d 20 28 69 6e 74 29  ' );.  n = (int)
a080: 73 74 72 6c 65 6e 28 7a 41 62 73 6f 6c 75 74 65  strlen(zAbsolute
a090: 4e 61 6d 65 29 3b 0a 20 20 70 4e 65 77 20 3d 20  Name);.  pNew = 
a0a0: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34  sqlite3_malloc64
a0b0: 28 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20  ( sizeof(*pNew) 
a0c0: 2b 20 28 6e 2b 31 29 20 29 3b 0a 20 20 69 66 28  + (n+1) );.  if(
a0d0: 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72   pNew==0 ) retur
a0e0: 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 7a 43 61  n 0;.  pNew->zCa
a0f0: 6e 6f 6e 69 63 61 6c 4e 61 6d 65 20 3d 20 28 63  nonicalName = (c
a100: 68 61 72 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a 20  har*)&pNew[1];. 
a110: 20 6d 65 6d 63 70 79 28 70 4e 65 77 2d 3e 7a 43   memcpy(pNew->zC
a120: 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20 7a 41  anonicalName, zA
a130: 62 73 6f 6c 75 74 65 4e 61 6d 65 2c 20 6e 2b 31  bsoluteName, n+1
a140: 29 3b 0a 20 20 6e 20 3d 20 76 78 77 6f 72 6b 73  );.  n = vxworks
a150: 53 69 6d 70 6c 69 66 79 4e 61 6d 65 28 70 4e 65  SimplifyName(pNe
a160: 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d  w->zCanonicalNam
a170: 65 2c 20 6e 29 3b 0a 0a 20 20 2f 2a 20 53 65 61  e, n);..  /* Sea
a180: 72 63 68 20 66 6f 72 20 61 6e 20 65 78 69 73 74  rch for an exist
a190: 69 6e 67 20 65 6e 74 72 79 20 74 68 61 74 20 6d  ing entry that m
a1a0: 61 74 63 68 69 6e 67 20 74 68 65 20 63 61 6e 6f  atching the cano
a1b0: 6e 69 63 61 6c 20 6e 61 6d 65 2e 0a 20 20 2a 2a  nical name..  **
a1c0: 20 49 66 20 66 6f 75 6e 64 2c 20 69 6e 63 72 65   If found, incre
a1d0: 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e  ment the referen
a1e0: 63 65 20 63 6f 75 6e 74 20 61 6e 64 20 72 65 74  ce count and ret
a1f0: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
a200: 0a 20 20 2a 2a 20 74 68 65 20 65 78 69 73 74 69  .  ** the existi
a210: 6e 67 20 66 69 6c 65 20 49 44 2e 0a 20 20 2a 2f  ng file ID..  */
a220: 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  .  unixEnterMute
a230: 78 28 29 3b 0a 20 20 66 6f 72 28 70 43 61 6e 64  x();.  for(pCand
a240: 69 64 61 74 65 3d 76 78 77 6f 72 6b 73 46 69 6c  idate=vxworksFil
a250: 65 4c 69 73 74 3b 20 70 43 61 6e 64 69 64 61 74  eList; pCandidat
a260: 65 3b 20 70 43 61 6e 64 69 64 61 74 65 3d 70 43  e; pCandidate=pC
a270: 61 6e 64 69 64 61 74 65 2d 3e 70 4e 65 78 74 29  andidate->pNext)
a280: 7b 0a 20 20 20 20 69 66 28 20 70 43 61 6e 64 69  {.    if( pCandi
a290: 64 61 74 65 2d 3e 6e 4e 61 6d 65 3d 3d 6e 20 0a  date->nName==n .
a2a0: 20 20 20 20 20 26 26 20 6d 65 6d 63 6d 70 28 70       && memcmp(p
a2b0: 43 61 6e 64 69 64 61 74 65 2d 3e 7a 43 61 6e 6f  Candidate->zCano
a2c0: 6e 69 63 61 6c 4e 61 6d 65 2c 20 70 4e 65 77 2d  nicalName, pNew-
a2d0: 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c  >zCanonicalName,
a2e0: 20 6e 29 3d 3d 30 0a 20 20 20 20 29 7b 0a 20 20   n)==0.    ){.  
a2f0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
a300: 65 28 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 20  e(pNew);.       
a310: 70 43 61 6e 64 69 64 61 74 65 2d 3e 6e 52 65 66  pCandidate->nRef
a320: 2b 2b 3b 0a 20 20 20 20 20 20 20 75 6e 69 78 4c  ++;.       unixL
a330: 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 20  eaveMutex();.   
a340: 20 20 20 20 72 65 74 75 72 6e 20 70 43 61 6e 64      return pCand
a350: 69 64 61 74 65 3b 0a 20 20 20 20 7d 0a 20 20 7d  idate;.    }.  }
a360: 0a 0a 20 20 2f 2a 20 4e 6f 20 6d 61 74 63 68 20  ..  /* No match 
a370: 77 61 73 20 66 6f 75 6e 64 2e 20 20 57 65 20 77  was found.  We w
a380: 69 6c 6c 20 6d 61 6b 65 20 61 20 6e 65 77 20 66  ill make a new f
a390: 69 6c 65 20 49 44 20 2a 2f 0a 20 20 70 4e 65 77  ile ID */.  pNew
a3a0: 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 70 4e  ->nRef = 1;.  pN
a3b0: 65 77 2d 3e 6e 4e 61 6d 65 20 3d 20 6e 3b 0a 20  ew->nName = n;. 
a3c0: 20 70 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20 76   pNew->pNext = v
a3d0: 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74 3b 0a  xworksFileList;.
a3e0: 20 20 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73    vxworksFileLis
a3f0: 74 20 3d 20 70 4e 65 77 3b 0a 20 20 75 6e 69 78  t = pNew;.  unix
a400: 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
a410: 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a  return pNew;.}..
a420: 2f 2a 0a 2a 2a 20 44 65 63 72 65 6d 65 6e 74 20  /*.** Decrement 
a430: 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  the reference co
a440: 75 6e 74 20 6f 6e 20 61 20 76 78 77 6f 72 6b 73  unt on a vxworks
a450: 46 69 6c 65 49 64 20 6f 62 6a 65 63 74 2e 20 20  FileId object.  
a460: 46 72 65 65 0a 2a 2a 20 74 68 65 20 6f 62 6a 65  Free.** the obje
a470: 63 74 20 77 68 65 6e 20 74 68 65 20 72 65 66 65  ct when the refe
a480: 72 65 6e 63 65 20 63 6f 75 6e 74 20 72 65 61 63  rence count reac
a490: 68 65 73 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61  hes zero..*/.sta
a4a0: 74 69 63 20 76 6f 69 64 20 76 78 77 6f 72 6b 73  tic void vxworks
a4b0: 52 65 6c 65 61 73 65 46 69 6c 65 49 64 28 73 74  ReleaseFileId(st
a4c0: 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65  ruct vxworksFile
a4d0: 49 64 20 2a 70 49 64 29 7b 0a 20 20 75 6e 69 78  Id *pId){.  unix
a4e0: 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
a4f0: 61 73 73 65 72 74 28 20 70 49 64 2d 3e 6e 52 65  assert( pId->nRe
a500: 66 3e 30 20 29 3b 0a 20 20 70 49 64 2d 3e 6e 52  f>0 );.  pId->nR
a510: 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 49 64 2d  ef--;.  if( pId-
a520: 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20  >nRef==0 ){.    
a530: 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69  struct vxworksFi
a540: 6c 65 49 64 20 2a 2a 70 70 3b 0a 20 20 20 20 66  leId **pp;.    f
a550: 6f 72 28 70 70 3d 26 76 78 77 6f 72 6b 73 46 69  or(pp=&vxworksFi
a560: 6c 65 4c 69 73 74 3b 20 2a 70 70 20 26 26 20 2a  leList; *pp && *
a570: 70 70 21 3d 70 49 64 3b 20 70 70 20 3d 20 26 28  pp!=pId; pp = &(
a580: 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29 29 7b 7d  (*pp)->pNext)){}
a590: 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a 70 70  .    assert( *pp
a5a0: 3d 3d 70 49 64 20 29 3b 0a 20 20 20 20 2a 70 70  ==pId );.    *pp
a5b0: 20 3d 20 70 49 64 2d 3e 70 4e 65 78 74 3b 0a 20   = pId->pNext;. 
a5c0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
a5d0: 70 49 64 29 3b 0a 20 20 7d 0a 20 20 75 6e 69 78  pId);.  }.  unix
a5e0: 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 7d 0a  LeaveMutex();.}.
a5f0: 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57  #endif /* OS_VXW
a600: 4f 52 4b 53 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a  ORKS */./*******
a610: 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20  ******** End of 
a620: 55 6e 69 71 75 65 20 46 69 6c 65 20 49 44 20 55  Unique File ID U
a630: 74 69 6c 69 74 79 20 55 73 65 64 20 42 79 20 56  tility Used By V
a640: 78 57 6f 72 6b 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  xWorks *********
a650: 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
a660: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a670: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a680: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a690: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a6a0: 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a 2a 2a 2a 2a  ******/.../*****
a6b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a6c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a6d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a6e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a6f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
a700: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a710: 2a 2a 2a 2a 2a 20 50 6f 73 69 78 20 41 64 76 69  ***** Posix Advi
a720: 73 6f 72 79 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a  sory Locking ***
a730: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a740: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20  *********.**.** 
a750: 50 4f 53 49 58 20 61 64 76 69 73 6f 72 79 20 6c  POSIX advisory l
a760: 6f 63 6b 73 20 61 72 65 20 62 72 6f 6b 65 6e 20  ocks are broken 
a770: 62 79 20 64 65 73 69 67 6e 2e 20 20 41 4e 53 49  by design.  ANSI
a780: 20 53 54 44 20 31 30 30 33 2e 31 20 28 31 39 39   STD 1003.1 (199
a790: 36 29 0a 2a 2a 20 73 65 63 74 69 6f 6e 20 36 2e  6).** section 6.
a7a0: 35 2e 32 2e 32 20 6c 69 6e 65 73 20 34 38 33 20  5.2.2 lines 483 
a7b0: 74 68 72 6f 75 67 68 20 34 39 30 20 73 70 65 63  through 490 spec
a7c0: 69 66 79 20 74 68 61 74 20 77 68 65 6e 20 61 20  ify that when a 
a7d0: 70 72 6f 63 65 73 73 0a 2a 2a 20 73 65 74 73 20  process.** sets 
a7e0: 6f 72 20 63 6c 65 61 72 73 20 61 20 6c 6f 63 6b  or clears a lock
a7f0: 2c 20 74 68 61 74 20 6f 70 65 72 61 74 69 6f 6e  , that operation
a800: 20 6f 76 65 72 72 69 64 65 73 20 61 6e 79 20 70   overrides any p
a810: 72 69 6f 72 20 6c 6f 63 6b 73 20 73 65 74 0a 2a  rior locks set.*
a820: 2a 20 62 79 20 74 68 65 20 73 61 6d 65 20 70 72  * by the same pr
a830: 6f 63 65 73 73 2e 20 20 49 74 20 64 6f 65 73 20  ocess.  It does 
a840: 6e 6f 74 20 65 78 70 6c 69 63 69 74 6c 79 20 73  not explicitly s
a850: 61 79 20 73 6f 2c 20 62 75 74 20 74 68 69 73 20  ay so, but this 
a860: 69 6d 70 6c 69 65 73 0a 2a 2a 20 74 68 61 74 20  implies.** that 
a870: 69 74 20 6f 76 65 72 72 69 64 65 73 20 6c 6f 63  it overrides loc
a880: 6b 73 20 73 65 74 20 62 79 20 74 68 65 20 73 61  ks set by the sa
a890: 6d 65 20 70 72 6f 63 65 73 73 20 75 73 69 6e 67  me process using
a8a0: 20 61 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20   a different.** 
a8b0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e  file descriptor.
a8c0: 20 20 43 6f 6e 73 69 64 65 72 20 74 68 69 73 20    Consider this 
a8d0: 74 65 73 74 20 63 61 73 65 3a 0a 2a 2a 0a 2a 2a  test case:.**.**
a8e0: 20 20 20 20 20 20 20 69 6e 74 20 66 64 31 20 3d         int fd1 =
a8f0: 20 6f 70 65 6e 28 22 2e 2f 66 69 6c 65 31 22 2c   open("./file1",
a900: 20 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54 2c   O_RDWR|O_CREAT,
a910: 20 30 36 34 34 29 3b 0a 2a 2a 20 20 20 20 20 20   0644);.**      
a920: 20 69 6e 74 20 66 64 32 20 3d 20 6f 70 65 6e 28   int fd2 = open(
a930: 22 2e 2f 66 69 6c 65 32 22 2c 20 4f 5f 52 44 57  "./file2", O_RDW
a940: 52 7c 4f 5f 43 52 45 41 54 2c 20 30 36 34 34 29  R|O_CREAT, 0644)
a950: 3b 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73 65 20  ;.**.** Suppose 
a960: 2e 2f 66 69 6c 65 31 20 61 6e 64 20 2e 2f 66 69  ./file1 and ./fi
a970: 6c 65 32 20 61 72 65 20 72 65 61 6c 6c 79 20 74  le2 are really t
a980: 68 65 20 73 61 6d 65 20 66 69 6c 65 20 28 62 65  he same file (be
a990: 63 61 75 73 65 0a 2a 2a 20 6f 6e 65 20 69 73 20  cause.** one is 
a9a0: 61 20 68 61 72 64 20 6f 72 20 73 79 6d 62 6f 6c  a hard or symbol
a9b0: 69 63 20 6c 69 6e 6b 20 74 6f 20 74 68 65 20 6f  ic link to the o
a9c0: 74 68 65 72 29 20 74 68 65 6e 20 69 66 20 79 6f  ther) then if yo
a9d0: 75 20 73 65 74 0a 2a 2a 20 61 6e 20 65 78 63 6c  u set.** an excl
a9e0: 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 66 64  usive lock on fd
a9f0: 31 2c 20 74 68 65 6e 20 74 72 79 20 74 6f 20 67  1, then try to g
aa00: 65 74 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  et an exclusive 
aa10: 6c 6f 63 6b 0a 2a 2a 20 6f 6e 20 66 64 32 2c 20  lock.** on fd2, 
aa20: 69 74 20 77 6f 72 6b 73 2e 20 20 49 20 77 6f 75  it works.  I wou
aa30: 6c 64 20 68 61 76 65 20 65 78 70 65 63 74 65 64  ld have expected
aa40: 20 74 68 65 20 73 65 63 6f 6e 64 20 6c 6f 63 6b   the second lock
aa50: 20 74 6f 0a 2a 2a 20 66 61 69 6c 20 73 69 6e 63   to.** fail sinc
aa60: 65 20 74 68 65 72 65 20 77 61 73 20 61 6c 72 65  e there was alre
aa70: 61 64 79 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68  ady a lock on th
aa80: 65 20 66 69 6c 65 20 64 75 65 20 74 6f 20 66 64  e file due to fd
aa90: 31 2e 0a 2a 2a 20 42 75 74 20 6e 6f 74 20 73 6f  1..** But not so
aaa0: 2e 20 20 53 69 6e 63 65 20 62 6f 74 68 20 6c 6f  .  Since both lo
aab0: 63 6b 73 20 63 61 6d 65 20 66 72 6f 6d 20 74 68  cks came from th
aac0: 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73 2c 20  e same process, 
aad0: 74 68 65 0a 2a 2a 20 73 65 63 6f 6e 64 20 6f 76  the.** second ov
aae0: 65 72 72 69 64 65 73 20 74 68 65 20 66 69 72 73  errides the firs
aaf0: 74 2c 20 65 76 65 6e 20 74 68 6f 75 67 68 20 74  t, even though t
ab00: 68 65 79 20 77 65 72 65 20 6f 6e 20 64 69 66 66  hey were on diff
ab10: 65 72 65 6e 74 0a 2a 2a 20 66 69 6c 65 20 64 65  erent.** file de
ab20: 73 63 72 69 70 74 6f 72 73 20 6f 70 65 6e 65 64  scriptors opened
ab30: 20 6f 6e 20 64 69 66 66 65 72 65 6e 74 20 66 69   on different fi
ab40: 6c 65 20 6e 61 6d 65 73 2e 0a 2a 2a 0a 2a 2a 20  le names..**.** 
ab50: 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20  This means that 
ab60: 77 65 20 63 61 6e 6e 6f 74 20 75 73 65 20 50 4f  we cannot use PO
ab70: 53 49 58 20 6c 6f 63 6b 73 20 74 6f 20 73 79 6e  SIX locks to syn
ab80: 63 68 72 6f 6e 69 7a 65 20 66 69 6c 65 20 61 63  chronize file ac
ab90: 63 65 73 73 0a 2a 2a 20 61 6d 6f 6e 67 20 63 6f  cess.** among co
aba0: 6d 70 65 74 69 6e 67 20 74 68 72 65 61 64 73 20  mpeting threads 
abb0: 6f 66 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63  of the same proc
abc0: 65 73 73 2e 20 20 50 4f 53 49 58 20 6c 6f 63 6b  ess.  POSIX lock
abd0: 73 20 77 69 6c 6c 20 77 6f 72 6b 20 66 69 6e 65  s will work fine
abe0: 0a 2a 2a 20 74 6f 20 73 79 6e 63 68 72 6f 6e 69  .** to synchroni
abf0: 7a 65 20 61 63 63 65 73 73 20 66 6f 72 20 74 68  ze access for th
ac00: 72 65 61 64 73 20 69 6e 20 73 65 70 61 72 61 74  reads in separat
ac10: 65 20 70 72 6f 63 65 73 73 65 73 2c 20 62 75 74  e processes, but
ac20: 20 6e 6f 74 0a 2a 2a 20 74 68 72 65 61 64 73 20   not.** threads 
ac30: 77 69 74 68 69 6e 20 74 68 65 20 73 61 6d 65 20  within the same 
ac40: 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54  process..**.** T
ac50: 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68  o work around th
ac60: 65 20 70 72 6f 62 6c 65 6d 2c 20 53 51 4c 69 74  e problem, SQLit
ac70: 65 20 68 61 73 20 74 6f 20 6d 61 6e 61 67 65 20  e has to manage 
ac80: 66 69 6c 65 20 6c 6f 63 6b 73 20 69 6e 74 65 72  file locks inter
ac90: 6e 61 6c 6c 79 0a 2a 2a 20 6f 6e 20 69 74 73 20  nally.** on its 
aca0: 6f 77 6e 2e 20 20 57 68 65 6e 65 76 65 72 20 61  own.  Whenever a
acb0: 20 6e 65 77 20 64 61 74 61 62 61 73 65 20 69 73   new database is
acc0: 20 6f 70 65 6e 65 64 2c 20 77 65 20 68 61 76 65   opened, we have
acd0: 20 74 6f 20 66 69 6e 64 20 74 68 65 0a 2a 2a 20   to find the.** 
ace0: 73 70 65 63 69 66 69 63 20 69 6e 6f 64 65 20 6f  specific inode o
acf0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
ad00: 69 6c 65 20 28 74 68 65 20 69 6e 6f 64 65 20 69  ile (the inode i
ad10: 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20  s determined by 
ad20: 74 68 65 0a 2a 2a 20 73 74 5f 64 65 76 20 61 6e  the.** st_dev an
ad30: 64 20 73 74 5f 69 6e 6f 20 66 69 65 6c 64 73 20  d st_ino fields 
ad40: 6f 66 20 74 68 65 20 73 74 61 74 20 73 74 72 75  of the stat stru
ad50: 63 74 75 72 65 20 74 68 61 74 20 66 73 74 61 74  cture that fstat
ad60: 28 29 20 66 69 6c 6c 73 20 69 6e 29 0a 2a 2a 20  () fills in).** 
ad70: 61 6e 64 20 63 68 65 63 6b 20 66 6f 72 20 6c 6f  and check for lo
ad80: 63 6b 73 20 61 6c 72 65 61 64 79 20 65 78 69 73  cks already exis
ad90: 74 69 6e 67 20 6f 6e 20 74 68 61 74 20 69 6e 6f  ting on that ino
ada0: 64 65 2e 20 20 57 68 65 6e 20 6c 6f 63 6b 73 20  de.  When locks 
adb0: 61 72 65 0a 2a 2a 20 63 72 65 61 74 65 64 20 6f  are.** created o
adc0: 72 20 72 65 6d 6f 76 65 64 2c 20 77 65 20 68 61  r removed, we ha
add0: 76 65 20 74 6f 20 6c 6f 6f 6b 20 61 74 20 6f 75  ve to look at ou
ade0: 72 20 6f 77 6e 20 69 6e 74 65 72 6e 61 6c 20 72  r own internal r
adf0: 65 63 6f 72 64 20 6f 66 20 74 68 65 0a 2a 2a 20  ecord of the.** 
ae00: 6c 6f 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20  locks to see if 
ae10: 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64 20 68  another thread h
ae20: 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 73 65  as previously se
ae30: 74 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 61 74  t a lock on that
ae40: 20 73 61 6d 65 0a 2a 2a 20 69 6e 6f 64 65 2e 0a   same.** inode..
ae50: 2a 2a 0a 2a 2a 20 28 41 73 69 64 65 3a 20 54 68  **.** (Aside: Th
ae60: 65 20 75 73 65 20 6f 66 20 69 6e 6f 64 65 20 6e  e use of inode n
ae70: 75 6d 62 65 72 73 20 61 73 20 75 6e 69 71 75 65  umbers as unique
ae80: 20 49 44 73 20 64 6f 65 73 20 6e 6f 74 20 77 6f   IDs does not wo
ae90: 72 6b 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a  rk on VxWorks..*
aea0: 2a 20 46 6f 72 20 56 78 57 6f 72 6b 73 2c 20 77  * For VxWorks, w
aeb0: 65 20 68 61 76 65 20 74 6f 20 75 73 65 20 74 68  e have to use th
aec0: 65 20 61 6c 74 65 72 6e 61 74 69 76 65 20 75 6e  e alternative un
aed0: 69 71 75 65 20 49 44 20 73 79 73 74 65 6d 20 62  ique ID system b
aee0: 61 73 65 64 20 6f 6e 0a 2a 2a 20 63 61 6e 6f 6e  ased on.** canon
aef0: 69 63 61 6c 20 66 69 6c 65 6e 61 6d 65 20 61 6e  ical filename an
af00: 64 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 69 6e  d implemented in
af10: 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 64 69   the previous di
af20: 76 69 73 69 6f 6e 2e 29 0a 2a 2a 0a 2a 2a 20 54  vision.).**.** T
af30: 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  he sqlite3_file 
af40: 73 74 72 75 63 74 75 72 65 20 66 6f 72 20 50 4f  structure for PO
af50: 53 49 58 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72  SIX is no longer
af60: 20 6a 75 73 74 20 61 6e 20 69 6e 74 65 67 65 72   just an integer
af70: 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63 72 69 70   file.** descrip
af80: 74 6f 72 2e 20 20 49 74 20 69 73 20 6e 6f 77 20  tor.  It is now 
af90: 61 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  a structure that
afa0: 20 68 6f 6c 64 73 20 74 68 65 20 69 6e 74 65 67   holds the integ
afb0: 65 72 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63 72  er file.** descr
afc0: 69 70 74 6f 72 20 61 6e 64 20 61 20 70 6f 69 6e  iptor and a poin
afd0: 74 65 72 20 74 6f 20 61 20 73 74 72 75 63 74 75  ter to a structu
afe0: 72 65 20 74 68 61 74 20 64 65 73 63 72 69 62 65  re that describe
aff0: 73 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 0a 2a  s the internal.*
b000: 2a 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 20 63  * locks on the c
b010: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 69 6e 6f  orresponding ino
b020: 64 65 2e 20 20 54 68 65 72 65 20 69 73 20 6f 6e  de.  There is on
b030: 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63 74  e locking struct
b040: 75 72 65 0a 2a 2a 20 70 65 72 20 69 6e 6f 64 65  ure.** per inode
b050: 2c 20 73 6f 20 69 66 20 74 68 65 20 73 61 6d 65  , so if the same
b060: 20 69 6e 6f 64 65 20 69 73 20 6f 70 65 6e 65 64   inode is opened
b070: 20 74 77 69 63 65 2c 20 62 6f 74 68 20 75 6e 69   twice, both uni
b080: 78 46 69 6c 65 20 73 74 72 75 63 74 75 72 65 73  xFile structures
b090: 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20 74 68 65  .** point to the
b0a0: 20 73 61 6d 65 20 6c 6f 63 6b 69 6e 67 20 73 74   same locking st
b0b0: 72 75 63 74 75 72 65 2e 20 20 54 68 65 20 6c 6f  ructure.  The lo
b0c0: 63 6b 69 6e 67 20 73 74 72 75 63 74 75 72 65 20  cking structure 
b0d0: 6b 65 65 70 73 0a 2a 2a 20 61 20 72 65 66 65 72  keeps.** a refer
b0e0: 65 6e 63 65 20 63 6f 75 6e 74 20 28 73 6f 20 77  ence count (so w
b0f0: 65 20 77 69 6c 6c 20 6b 6e 6f 77 20 77 68 65 6e  e will know when
b100: 20 74 6f 20 64 65 6c 65 74 65 20 69 74 29 20 61   to delete it) a
b110: 6e 64 20 61 20 22 63 6e 74 22 0a 2a 2a 20 66 69  nd a "cnt".** fi
b120: 65 6c 64 20 74 68 61 74 20 74 65 6c 6c 73 20 75  eld that tells u
b130: 73 20 69 74 73 20 69 6e 74 65 72 6e 61 6c 20 6c  s its internal l
b140: 6f 63 6b 20 73 74 61 74 75 73 2e 20 20 63 6e 74  ock status.  cnt
b150: 3d 3d 30 20 6d 65 61 6e 73 20 74 68 65 0a 2a 2a  ==0 means the.**
b160: 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65   file is unlocke
b170: 64 2e 20 20 63 6e 74 3d 3d 2d 31 20 6d 65 61 6e  d.  cnt==-1 mean
b180: 73 20 74 68 65 20 66 69 6c 65 20 68 61 73 20 61  s the file has a
b190: 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
b1a0: 2e 0a 2a 2a 20 63 6e 74 3e 30 20 6d 65 61 6e 73  ..** cnt>0 means
b1b0: 20 74 68 65 72 65 20 61 72 65 20 63 6e 74 20 73   there are cnt s
b1c0: 68 61 72 65 64 20 6c 6f 63 6b 73 20 6f 6e 20 74  hared locks on t
b1d0: 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41  he file..**.** A
b1e0: 6e 79 20 61 74 74 65 6d 70 74 20 74 6f 20 6c 6f  ny attempt to lo
b1f0: 63 6b 20 6f 72 20 75 6e 6c 6f 63 6b 20 61 20 66  ck or unlock a f
b200: 69 6c 65 20 66 69 72 73 74 20 63 68 65 63 6b 73  ile first checks
b210: 20 74 68 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20   the locking.** 
b220: 73 74 72 75 63 74 75 72 65 2e 20 20 54 68 65 20  structure.  The 
b230: 66 63 6e 74 6c 28 29 20 73 79 73 74 65 6d 20 63  fcntl() system c
b240: 61 6c 6c 20 69 73 20 6f 6e 6c 79 20 69 6e 76 6f  all is only invo
b250: 6b 65 64 20 74 6f 20 73 65 74 20 61 20 0a 2a 2a  ked to set a .**
b260: 20 50 4f 53 49 58 20 6c 6f 63 6b 20 69 66 20 74   POSIX lock if t
b270: 68 65 20 69 6e 74 65 72 6e 61 6c 20 6c 6f 63 6b  he internal lock
b280: 20 73 74 72 75 63 74 75 72 65 20 74 72 61 6e 73   structure trans
b290: 69 74 69 6f 6e 73 20 62 65 74 77 65 65 6e 0a 2a  itions between.*
b2a0: 2a 20 61 20 6c 6f 63 6b 65 64 20 61 6e 64 20 61  * a locked and a
b2b0: 6e 20 75 6e 6c 6f 63 6b 65 64 20 73 74 61 74 65  n unlocked state
b2c0: 2e 0a 2a 2a 0a 2a 2a 20 42 75 74 20 77 61 69 74  ..**.** But wait
b2d0: 3a 20 20 74 68 65 72 65 20 61 72 65 20 79 65 74  :  there are yet
b2e0: 20 6d 6f 72 65 20 70 72 6f 62 6c 65 6d 73 20 77   more problems w
b2f0: 69 74 68 20 50 4f 53 49 58 20 61 64 76 69 73 6f  ith POSIX adviso
b300: 72 79 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20  ry locks..**.** 
b310: 49 66 20 79 6f 75 20 63 6c 6f 73 65 20 61 20 66  If you close a f
b320: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74  ile descriptor t
b330: 68 61 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 20  hat points to a 
b340: 66 69 6c 65 20 74 68 61 74 20 68 61 73 20 6c 6f  file that has lo
b350: 63 6b 73 2c 0a 2a 2a 20 61 6c 6c 20 6c 6f 63 6b  cks,.** all lock
b360: 73 20 6f 6e 20 74 68 61 74 20 66 69 6c 65 20 74  s on that file t
b370: 68 61 74 20 61 72 65 20 6f 77 6e 65 64 20 62 79  hat are owned by
b380: 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 72 6f   the current pro
b390: 63 65 73 73 20 61 72 65 0a 2a 2a 20 72 65 6c 65  cess are.** rele
b3a0: 61 73 65 64 2e 20 20 54 6f 20 77 6f 72 6b 20 61  ased.  To work a
b3b0: 72 6f 75 6e 64 20 74 68 69 73 20 70 72 6f 62 6c  round this probl
b3c0: 65 6d 2c 20 65 61 63 68 20 75 6e 69 78 49 6e 6f  em, each unixIno
b3d0: 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a 2a  deInfo object.**
b3e0: 20 6d 61 69 6e 74 61 69 6e 73 20 61 20 63 6f 75   maintains a cou
b3f0: 6e 74 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72  nt of the number
b400: 20 6f 66 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b   of pending lock
b410: 73 20 6f 6e 20 74 68 61 20 69 6e 6f 64 65 2e 0a  s on tha inode..
b420: 2a 2a 20 57 68 65 6e 20 61 6e 20 61 74 74 65 6d  ** When an attem
b430: 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 63 6c  pt is made to cl
b440: 6f 73 65 20 61 6e 20 75 6e 69 78 46 69 6c 65 2c  ose an unixFile,
b450: 20 69 66 20 74 68 65 72 65 20 61 72 65 0a 2a 2a   if there are.**
b460: 20 6f 74 68 65 72 20 75 6e 69 78 46 69 6c 65 20   other unixFile 
b470: 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73 61 6d 65  open on the same
b480: 20 69 6e 6f 64 65 20 74 68 61 74 20 61 72 65 20   inode that are 
b490: 68 6f 6c 64 69 6e 67 20 6c 6f 63 6b 73 2c 20 74  holding locks, t
b4a0: 68 65 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 63 6c  he call.** to cl
b4b0: 6f 73 65 28 29 20 74 68 65 20 66 69 6c 65 20 64  ose() the file d
b4c0: 65 73 63 72 69 70 74 6f 72 20 69 73 20 64 65 66  escriptor is def
b4d0: 65 72 72 65 64 20 75 6e 74 69 6c 20 61 6c 6c 20  erred until all 
b4e0: 6f 66 20 74 68 65 20 6c 6f 63 6b 73 20 63 6c 65  of the locks cle
b4f0: 61 72 2e 0a 2a 2a 20 54 68 65 20 75 6e 69 78 49  ar..** The unixI
b500: 6e 6f 64 65 49 6e 66 6f 20 73 74 72 75 63 74 75  nodeInfo structu
b510: 72 65 20 6b 65 65 70 73 20 61 20 6c 69 73 74 20  re keeps a list 
b520: 6f 66 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  of file descript
b530: 6f 72 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f  ors that need to
b540: 0a 2a 2a 20 62 65 20 63 6c 6f 73 65 64 20 61 6e  .** be closed an
b550: 64 20 74 68 61 74 20 6c 69 73 74 20 69 73 20 77  d that list is w
b560: 61 6c 6b 65 64 20 28 61 6e 64 20 63 6c 65 61 72  alked (and clear
b570: 65 64 29 20 77 68 65 6e 20 74 68 65 20 6c 61 73  ed) when the las
b580: 74 20 6c 6f 63 6b 0a 2a 2a 20 63 6c 65 61 72 73  t lock.** clears
b590: 2e 0a 2a 2a 0a 2a 2a 20 59 65 74 20 61 6e 6f 74  ..**.** Yet anot
b5a0: 68 65 72 20 70 72 6f 62 6c 65 6d 3a 20 20 4c 69  her problem:  Li
b5b0: 6e 75 78 54 68 72 65 61 64 73 20 64 6f 20 6e 6f  nuxThreads do no
b5c0: 74 20 70 6c 61 79 20 77 65 6c 6c 20 77 69 74 68  t play well with
b5d0: 20 70 6f 73 69 78 20 6c 6f 63 6b 73 2e 0a 2a 2a   posix locks..**
b5e0: 0a 2a 2a 20 4d 61 6e 79 20 6f 6c 64 65 72 20 76  .** Many older v
b5f0: 65 72 73 69 6f 6e 73 20 6f 66 20 6c 69 6e 75 78  ersions of linux
b600: 20 75 73 65 20 74 68 65 20 4c 69 6e 75 78 54 68   use the LinuxTh
b610: 72 65 61 64 73 20 6c 69 62 72 61 72 79 20 77 68  reads library wh
b620: 69 63 68 20 69 73 0a 2a 2a 20 6e 6f 74 20 70 6f  ich is.** not po
b630: 73 69 78 20 63 6f 6d 70 6c 69 61 6e 74 2e 20 20  six compliant.  
b640: 55 6e 64 65 72 20 4c 69 6e 75 78 54 68 72 65 61  Under LinuxThrea
b650: 64 73 2c 20 61 20 6c 6f 63 6b 20 63 72 65 61 74  ds, a lock creat
b660: 65 64 20 62 79 20 74 68 72 65 61 64 0a 2a 2a 20  ed by thread.** 
b670: 41 20 63 61 6e 6e 6f 74 20 62 65 20 6d 6f 64 69  A cannot be modi
b680: 66 69 65 64 20 6f 72 20 6f 76 65 72 72 69 64 64  fied or overridd
b690: 65 6e 20 62 79 20 61 20 64 69 66 66 65 72 65 6e  en by a differen
b6a0: 74 20 74 68 72 65 61 64 20 42 2e 0a 2a 2a 20 4f  t thread B..** O
b6b0: 6e 6c 79 20 74 68 72 65 61 64 20 41 20 63 61 6e  nly thread A can
b6c0: 20 6d 6f 64 69 66 79 20 74 68 65 20 6c 6f 63 6b   modify the lock
b6d0: 2e 20 20 4c 6f 63 6b 69 6e 67 20 62 65 68 61 76  .  Locking behav
b6e0: 69 6f 72 20 69 73 20 63 6f 72 72 65 63 74 0a 2a  ior is correct.*
b6f0: 2a 20 69 66 20 74 68 65 20 61 70 70 6c 69 61 74  * if the appliat
b700: 69 6f 6e 20 75 73 65 73 20 74 68 65 20 6e 65 77  ion uses the new
b710: 65 72 20 4e 61 74 69 76 65 20 50 6f 73 69 78 20  er Native Posix 
b720: 54 68 72 65 61 64 20 4c 69 62 72 61 72 79 20 28  Thread Library (
b730: 4e 50 54 4c 29 0a 2a 2a 20 6f 6e 20 6c 69 6e 75  NPTL).** on linu
b740: 78 20 2d 20 77 69 74 68 20 4e 50 54 4c 20 61 20  x - with NPTL a 
b750: 6c 6f 63 6b 20 63 72 65 61 74 65 64 20 62 79 20  lock created by 
b760: 74 68 72 65 61 64 20 41 20 63 61 6e 20 6f 76 65  thread A can ove
b770: 72 72 69 64 65 20 6c 6f 63 6b 73 0a 2a 2a 20 69  rride locks.** i
b780: 6e 20 74 68 72 65 61 64 20 42 2e 20 20 42 75 74  n thread B.  But
b790: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77 61 79   there is no way
b7a0: 20 74 6f 20 6b 6e 6f 77 20 61 74 20 63 6f 6d 70   to know at comp
b7b0: 69 6c 65 2d 74 69 6d 65 20 77 68 69 63 68 0a 2a  ile-time which.*
b7c0: 2a 20 74 68 72 65 61 64 69 6e 67 20 6c 69 62 72  * threading libr
b7d0: 61 72 79 20 69 73 20 62 65 69 6e 67 20 75 73 65  ary is being use
b7e0: 64 2e 20 20 53 6f 20 74 68 65 72 65 20 69 73 20  d.  So there is 
b7f0: 6e 6f 20 77 61 79 20 74 6f 20 6b 6e 6f 77 20 61  no way to know a
b800: 74 0a 2a 2a 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  t.** compile-tim
b810: 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  e whether or not
b820: 20 74 68 72 65 61 64 20 41 20 63 61 6e 20 6f 76   thread A can ov
b830: 65 72 72 69 64 65 20 6c 6f 63 6b 73 20 6f 6e 20  erride locks on 
b840: 74 68 72 65 61 64 20 42 2e 0a 2a 2a 20 4f 6e 65  thread B..** One
b850: 20 68 61 73 20 74 6f 20 64 6f 20 61 20 72 75 6e   has to do a run
b860: 2d 74 69 6d 65 20 63 68 65 63 6b 20 74 6f 20 64  -time check to d
b870: 69 73 63 6f 76 65 72 20 74 68 65 20 62 65 68 61  iscover the beha
b880: 76 69 6f 72 20 6f 66 20 74 68 65 0a 2a 2a 20 63  vior of the.** c
b890: 75 72 72 65 6e 74 20 70 72 6f 63 65 73 73 2e 0a  urrent process..
b8a0: 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 75 73 65  **.** SQLite use
b8b0: 64 20 74 6f 20 73 75 70 70 6f 72 74 20 4c 69 6e  d to support Lin
b8c0: 75 78 54 68 72 65 61 64 73 2e 20 20 42 75 74 20  uxThreads.  But 
b8d0: 73 75 70 70 6f 72 74 20 66 6f 72 20 4c 69 6e 75  support for Linu
b8e0: 78 54 68 72 65 61 64 73 0a 2a 2a 20 77 61 73 20  xThreads.** was 
b8f0: 64 72 6f 70 70 65 64 20 62 65 67 69 6e 6e 69 6e  dropped beginnin
b900: 67 20 77 69 74 68 20 76 65 72 73 69 6f 6e 20 33  g with version 3
b910: 2e 37 2e 30 2e 20 20 53 51 4c 69 74 65 20 77 69  .7.0.  SQLite wi
b920: 6c 6c 20 73 74 69 6c 6c 20 77 6f 72 6b 20 77 69  ll still work wi
b930: 74 68 0a 2a 2a 20 4c 69 6e 75 78 54 68 72 65 61  th.** LinuxThrea
b940: 64 73 20 70 72 6f 76 69 64 65 64 20 74 68 61 74  ds provided that
b950: 20 28 31 29 20 74 68 65 72 65 20 69 73 20 6e 6f   (1) there is no
b960: 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 63   more than one c
b970: 6f 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20 70 65  onnection .** pe
b980: 72 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  r database file 
b990: 69 6e 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63  in the same proc
b9a0: 65 73 73 20 61 6e 64 20 28 32 29 20 64 61 74 61  ess and (2) data
b9b0: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  base connections
b9c0: 0a 2a 2a 20 64 6f 20 6e 6f 74 20 6d 6f 76 65 20  .** do not move 
b9d0: 61 63 72 6f 73 73 20 74 68 72 65 61 64 73 2e 0a  across threads..
b9e0: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73  */../*.** An ins
b9f0: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
ba00: 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
ba10: 20 73 65 72 76 65 73 20 61 73 20 74 68 65 20 6b   serves as the k
ba20: 65 79 20 75 73 65 64 0a 2a 2a 20 74 6f 20 6c 6f  ey used.** to lo
ba30: 63 61 74 65 20 61 20 70 61 72 74 69 63 75 6c 61  cate a particula
ba40: 72 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20  r unixInodeInfo 
ba50: 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 72 75 63  object..*/.struc
ba60: 74 20 75 6e 69 78 46 69 6c 65 49 64 20 7b 0a 20  t unixFileId {. 
ba70: 20 64 65 76 5f 74 20 64 65 76 3b 20 20 20 20 20   dev_t dev;     
ba80: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ba90: 44 65 76 69 63 65 20 6e 75 6d 62 65 72 20 2a 2f  Device number */
baa0: 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
bab0: 20 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73    struct vxworks
bac0: 46 69 6c 65 49 64 20 2a 70 49 64 3b 20 20 2f 2a  FileId *pId;  /*
bad0: 20 55 6e 69 71 75 65 20 66 69 6c 65 20 49 44 20   Unique file ID 
bae0: 66 6f 72 20 76 78 77 6f 72 6b 73 2e 20 2a 2f 0a  for vxworks. */.
baf0: 23 65 6c 73 65 0a 20 20 2f 2a 20 57 65 20 61 72  #else.  /* We ar
bb00: 65 20 74 6f 6c 64 20 74 68 61 74 20 73 6f 6d 65  e told that some
bb10: 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 41 6e 64   versions of And
bb20: 72 6f 69 64 20 63 6f 6e 74 61 69 6e 20 61 20 62  roid contain a b
bb30: 75 67 20 74 68 61 74 0a 20 20 2a 2a 20 73 69 7a  ug that.  ** siz
bb40: 65 73 20 69 6e 6f 5f 74 20 61 74 20 6f 6e 6c 79  es ino_t at only
bb50: 20 33 32 2d 62 69 74 73 20 69 6e 73 74 65 61 64   32-bits instead
bb60: 20 6f 66 20 36 34 2d 62 69 74 73 2e 20 28 53 65   of 64-bits. (Se
bb70: 65 0a 20 20 2a 2a 20 68 74 74 70 73 3a 2f 2f 61  e.  ** https://a
bb80: 6e 64 72 6f 69 64 2d 72 65 76 69 65 77 2e 67 6f  ndroid-review.go
bb90: 6f 67 6c 65 73 6f 75 72 63 65 2e 63 6f 6d 2f 23  oglesource.com/#
bba0: 2f 63 2f 31 31 35 33 35 31 2f 33 2f 64 69 73 74  /c/115351/3/dist
bbb0: 2f 73 71 6c 69 74 65 33 2e 63 29 0a 20 20 2a 2a  /sqlite3.c).  **
bbc0: 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20   To work around 
bbd0: 74 68 69 73 2c 20 61 6c 77 61 79 73 20 61 6c 6c  this, always all
bbe0: 6f 63 61 74 65 20 36 34 2d 62 69 74 73 20 66 6f  ocate 64-bits fo
bbf0: 72 20 74 68 65 20 69 6e 6f 64 65 20 6e 75 6d 62  r the inode numb
bc00: 65 72 2e 20 20 0a 20 20 2a 2a 20 4f 6e 20 73 6d  er.  .  ** On sm
bc10: 61 6c 6c 20 6d 61 63 68 69 6e 65 73 20 74 68 61  all machines tha
bc20: 74 20 6f 6e 6c 79 20 68 61 76 65 20 33 32 2d 62  t only have 32-b
bc30: 69 74 20 69 6e 6f 64 65 73 2c 20 74 68 69 73 20  it inodes, this 
bc40: 77 61 73 74 65 73 20 34 20 62 79 74 65 73 2c 0a  wastes 4 bytes,.
bc50: 20 20 2a 2a 20 62 75 74 20 74 68 61 74 20 73 68    ** but that sh
bc60: 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61 20 62 69  ould not be a bi
bc70: 67 20 64 65 61 6c 2e 20 2a 2f 0a 20 20 2f 2a 20  g deal. */.  /* 
bc80: 57 41 53 3a 20 20 69 6e 6f 5f 74 20 69 6e 6f 3b  WAS:  ino_t ino;
bc90: 20 20 20 2a 2f 0a 20 20 75 36 34 20 69 6e 6f 3b     */.  u64 ino;
bca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bcb0: 20 20 20 2f 2a 20 49 6e 6f 64 65 20 6e 75 6d 62     /* Inode numb
bcc0: 65 72 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a  er */.#endif.};.
bcd0: 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e  ./*.** An instan
bce0: 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ce of the follow
bcf0: 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 69 73  ing structure is
bd00: 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 65   allocated for e
bd10: 61 63 68 20 6f 70 65 6e 0a 2a 2a 20 69 6e 6f 64  ach open.** inod
bd20: 65 2e 20 20 4f 72 2c 20 6f 6e 20 4c 69 6e 75 78  e.  Or, on Linux
bd30: 54 68 72 65 61 64 73 2c 20 74 68 65 72 65 20 69  Threads, there i
bd40: 73 20 6f 6e 65 20 6f 66 20 74 68 65 73 65 20 73  s one of these s
bd50: 74 72 75 63 74 75 72 65 73 20 66 6f 72 0a 2a 2a  tructures for.**
bd60: 20 65 61 63 68 20 69 6e 6f 64 65 20 6f 70 65 6e   each inode open
bd70: 65 64 20 62 79 20 65 61 63 68 20 74 68 72 65 61  ed by each threa
bd80: 64 2e 0a 2a 2a 0a 2a 2a 20 41 20 73 69 6e 67 6c  d..**.** A singl
bd90: 65 20 69 6e 6f 64 65 20 63 61 6e 20 68 61 76 65  e inode can have
bda0: 20 6d 75 6c 74 69 70 6c 65 20 66 69 6c 65 20 64   multiple file d
bdb0: 65 73 63 72 69 70 74 6f 72 73 2c 20 73 6f 20 65  escriptors, so e
bdc0: 61 63 68 20 75 6e 69 78 46 69 6c 65 0a 2a 2a 20  ach unixFile.** 
bdd0: 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69  structure contai
bde0: 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ns a pointer to 
bdf0: 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  an instance of t
be00: 68 69 73 20 6f 62 6a 65 63 74 20 61 6e 64 20 74  his object and t
be10: 68 69 73 0a 2a 2a 20 6f 62 6a 65 63 74 20 6b 65  his.** object ke
be20: 65 70 73 20 61 20 63 6f 75 6e 74 20 6f 66 20 74  eps a count of t
be30: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 75 6e 69  he number of uni
be40: 78 46 69 6c 65 20 70 6f 69 6e 74 69 6e 67 20 74  xFile pointing t
be50: 6f 20 69 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  o it..*/.struct 
be60: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 7b 0a  unixInodeInfo {.
be70: 20 20 73 74 72 75 63 74 20 75 6e 69 78 46 69 6c    struct unixFil
be80: 65 49 64 20 66 69 6c 65 49 64 3b 20 20 20 20 20  eId fileId;     
be90: 20 20 2f 2a 20 54 68 65 20 6c 6f 6f 6b 75 70 20    /* The lookup 
bea0: 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 68  key */.  int nSh
beb0: 61 72 65 64 3b 20 20 20 20 20 20 20 20 20 20 20  ared;           
bec0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
bed0: 65 72 20 6f 66 20 53 48 41 52 45 44 20 6c 6f 63  er of SHARED loc
bee0: 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20 75 6e 73  ks held */.  uns
bef0: 69 67 6e 65 64 20 63 68 61 72 20 65 46 69 6c 65  igned char eFile
bf00: 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 2f 2a 20  Lock;        /* 
bf10: 4f 6e 65 20 6f 66 20 53 48 41 52 45 44 5f 4c 4f  One of SHARED_LO
bf20: 43 4b 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  CK, RESERVED_LOC
bf30: 4b 20 65 74 63 2e 20 2a 2f 0a 20 20 75 6e 73 69  K etc. */.  unsi
bf40: 67 6e 65 64 20 63 68 61 72 20 62 50 72 6f 63 65  gned char bProce
bf50: 73 73 4c 6f 63 6b 3b 20 20 20 20 20 2f 2a 20 41  ssLock;     /* A
bf60: 6e 20 65 78 63 6c 75 73 69 76 65 20 70 72 6f 63  n exclusive proc
bf70: 65 73 73 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  ess lock is held
bf80: 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20   */.  int nRef; 
bf90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bfa0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
bfb0: 6f 66 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 74  of pointers to t
bfc0: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f  his structure */
bfd0: 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a  .  unixShmNode *
bfe0: 70 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20 20 20  pShmNode;       
bff0: 20 20 20 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d     /* Shared mem
c000: 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77  ory associated w
c010: 69 74 68 20 74 68 69 73 20 69 6e 6f 64 65 20 2a  ith this inode *
c020: 2f 0a 20 20 69 6e 74 20 6e 4c 6f 63 6b 3b 20 20  /.  int nLock;  
c030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c040: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
c050: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 66 69 6c   outstanding fil
c060: 65 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 55 6e 69  e locks */.  Uni
c070: 78 55 6e 75 73 65 64 46 64 20 2a 70 55 6e 75 73  xUnusedFd *pUnus
c080: 65 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ed;          /* 
c090: 55 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73 63  Unused file desc
c0a0: 72 69 70 74 6f 72 73 20 74 6f 20 63 6c 6f 73 65  riptors to close
c0b0: 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49   */.  unixInodeI
c0c0: 6e 66 6f 20 2a 70 4e 65 78 74 3b 20 20 20 20 20  nfo *pNext;     
c0d0: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
c0e0: 20 61 6c 6c 20 75 6e 69 78 49 6e 6f 64 65 49 6e   all unixInodeIn
c0f0: 66 6f 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20  fo objects */.  
c100: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70  unixInodeInfo *p
c110: 50 72 65 76 3b 20 20 20 20 20 20 20 20 20 20 20  Prev;           
c120: 2f 2a 20 20 20 20 2e 2e 2e 2e 20 64 6f 75 62 6c  /*    .... doubl
c130: 79 20 6c 69 6e 6b 65 64 20 2a 2f 0a 23 69 66 20  y linked */.#if 
c140: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
c150: 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 75 6e  CKING_STYLE.  un
c160: 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67  signed long long
c170: 20 73 68 61 72 65 64 42 79 74 65 3b 20 20 2f 2a   sharedByte;  /*
c180: 20 66 6f 72 20 41 46 50 20 73 69 6d 75 6c 61 74   for AFP simulat
c190: 65 64 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 2a  ed shared lock *
c1a0: 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20 4f 53 5f  /.#endif.#if OS_
c1b0: 56 58 57 4f 52 4b 53 0a 20 20 73 65 6d 5f 74 20  VXWORKS.  sem_t 
c1c0: 2a 70 53 65 6d 3b 20 20 20 20 20 20 20 20 20 20  *pSem;          
c1d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
c1e0: 65 64 20 50 4f 53 49 58 20 73 65 6d 61 70 68 6f  ed POSIX semapho
c1f0: 72 65 20 2a 2f 0a 20 20 63 68 61 72 20 61 53 65  re */.  char aSe
c200: 6d 4e 61 6d 65 5b 4d 41 58 5f 50 41 54 48 4e 41  mName[MAX_PATHNA
c210: 4d 45 2b 32 5d 3b 20 20 2f 2a 20 4e 61 6d 65 20  ME+2];  /* Name 
c220: 6f 66 20 74 68 61 74 20 73 65 6d 61 70 68 6f 72  of that semaphor
c230: 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a  e */.#endif.};..
c240: 2f 2a 0a 2a 2a 20 41 20 6c 69 73 74 73 20 6f 66  /*.** A lists of
c250: 20 61 6c 6c 20 75 6e 69 78 49 6e 6f 64 65 49 6e   all unixInodeIn
c260: 66 6f 20 6f 62 6a 65 63 74 73 2e 0a 2a 2f 0a 73  fo objects..*/.s
c270: 74 61 74 69 63 20 75 6e 69 78 49 6e 6f 64 65 49  tatic unixInodeI
c280: 6e 66 6f 20 2a 69 6e 6f 64 65 4c 69 73 74 20 3d  nfo *inodeList =
c290: 20 30 3b 20 20 2f 2a 20 41 6c 6c 20 75 6e 69 78   0;  /* All unix
c2a0: 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74  InodeInfo object
c2b0: 73 20 2a 2f 0a 73 74 61 74 69 63 20 75 6e 73 69  s */.static unsi
c2c0: 67 6e 65 64 20 69 6e 74 20 6e 55 6e 75 73 65 64  gned int nUnused
c2d0: 46 64 20 3d 20 30 3b 20 20 20 20 2f 2a 20 54 6f  Fd = 0;    /* To
c2e0: 74 61 6c 20 75 6e 75 73 65 64 20 66 69 6c 65 20  tal unused file 
c2f0: 64 65 73 63 72 69 70 74 6f 72 73 20 2a 2f 0a 0a  descriptors */..
c300: 2f 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  /*.**.** This fu
c310: 6e 63 74 69 6f 6e 20 2d 20 75 6e 69 78 4c 6f 67  nction - unixLog
c320: 45 72 72 6f 72 41 74 4c 69 6e 65 28 29 2c 20 69  ErrorAtLine(), i
c330: 73 20 6f 6e 6c 79 20 65 76 65 72 20 63 61 6c 6c  s only ever call
c340: 65 64 20 76 69 61 20 74 68 65 20 6d 61 63 72 6f  ed via the macro
c350: 0a 2a 2a 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72  .** unixLogError
c360: 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20  ()..**.** It is 
c370: 69 6e 76 6f 6b 65 64 20 61 66 74 65 72 20 61 6e  invoked after an
c380: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 69 6e   error occurs in
c390: 20 61 6e 20 4f 53 20 66 75 6e 63 74 69 6f 6e 20   an OS function 
c3a0: 61 6e 64 20 65 72 72 6e 6f 20 68 61 73 20 62 65  and errno has be
c3b0: 65 6e 0a 2a 2a 20 73 65 74 2e 20 49 74 20 6c 6f  en.** set. It lo
c3c0: 67 73 20 61 20 6d 65 73 73 61 67 65 20 75 73 69  gs a message usi
c3d0: 6e 67 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 29  ng sqlite3_log()
c3e0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
c3f0: 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66  current value of
c400: 0a 2a 2a 20 65 72 72 6e 6f 20 61 6e 64 2c 20 69  .** errno and, i
c410: 66 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 65 20  f possible, the 
c420: 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 65  human-readable e
c430: 71 75 69 76 61 6c 65 6e 74 20 66 72 6f 6d 20 73  quivalent from s
c440: 74 72 65 72 72 6f 72 28 29 20 6f 72 0a 2a 2a 20  trerror() or.** 
c450: 73 74 72 65 72 72 6f 72 5f 72 28 29 2e 0a 2a 2a  strerror_r()..**
c460: 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 61 72  .** The first ar
c470: 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f  gument passed to
c480: 20 74 68 65 20 6d 61 63 72 6f 20 73 68 6f 75 6c   the macro shoul
c490: 64 20 62 65 20 74 68 65 20 65 72 72 6f 72 20 63  d be the error c
c4a0: 6f 64 65 20 74 68 61 74 0a 2a 2a 20 77 69 6c 6c  ode that.** will
c4b0: 20 62 65 20 72 65 74 75 72 6e 65 64 20 74 6f 20   be returned to 
c4c0: 53 51 4c 69 74 65 20 28 65 2e 67 2e 20 53 51 4c  SQLite (e.g. SQL
c4d0: 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45  ITE_IOERR_DELETE
c4e0: 2c 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  , SQLITE_CANTOPE
c4f0: 4e 29 2e 20 0a 2a 2a 20 54 68 65 20 74 77 6f 20  N). .** The two 
c500: 73 75 62 73 65 71 75 65 6e 74 20 61 72 67 75 6d  subsequent argum
c510: 65 6e 74 73 20 73 68 6f 75 6c 64 20 62 65 20 74  ents should be t
c520: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 4f  he name of the O
c530: 53 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 0a  S function that.
c540: 2a 2a 20 66 61 69 6c 65 64 20 28 65 2e 67 2e 20  ** failed (e.g. 
c550: 22 75 6e 6c 69 6e 6b 22 2c 20 22 6f 70 65 6e 22  "unlink", "open"
c560: 29 20 61 6e 64 20 74 68 65 20 61 73 73 6f 63 69  ) and the associ
c570: 61 74 65 64 20 66 69 6c 65 2d 73 79 73 74 65 6d  ated file-system
c580: 20 70 61 74 68 2c 0a 2a 2a 20 69 66 20 61 6e 79   path,.** if any
c590: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 75 6e 69  ..*/.#define uni
c5a0: 78 4c 6f 67 45 72 72 6f 72 28 61 2c 62 2c 63 29  xLogError(a,b,c)
c5b0: 20 20 20 20 20 75 6e 69 78 4c 6f 67 45 72 72 6f       unixLogErro
c5c0: 72 41 74 4c 69 6e 65 28 61 2c 62 2c 63 2c 5f 5f  rAtLine(a,b,c,__
c5d0: 4c 49 4e 45 5f 5f 29 0a 73 74 61 74 69 63 20 69  LINE__).static i
c5e0: 6e 74 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 41  nt unixLogErrorA
c5f0: 74 4c 69 6e 65 28 0a 20 20 69 6e 74 20 65 72 72  tLine(.  int err
c600: 63 6f 64 65 2c 20 20 20 20 20 20 20 20 20 20 20  code,           
c610: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 69           /* SQLi
c620: 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f  te error code */
c630: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
c640: 46 75 6e 63 2c 20 20 20 20 20 20 20 20 20 20 20  Func,           
c650: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 4f 53     /* Name of OS
c660: 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 66   function that f
c670: 61 69 6c 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  ailed */.  const
c680: 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20   char *zPath,   
c690: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
c6a0: 6c 65 20 70 61 74 68 20 61 73 73 6f 63 69 61 74  le path associat
c6b0: 65 64 20 77 69 74 68 20 65 72 72 6f 72 20 2a 2f  ed with error */
c6c0: 0a 20 20 69 6e 74 20 69 4c 69 6e 65 20 20 20 20  .  int iLine    
c6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c6e0: 20 20 20 2f 2a 20 53 6f 75 72 63 65 20 6c 69 6e     /* Source lin
c6f0: 65 20 6e 75 6d 62 65 72 20 77 68 65 72 65 20 65  e number where e
c700: 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20 2a 2f  rror occurred */
c710: 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72  .){.  char *zErr
c720: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
c730: 20 20 20 20 20 20 2f 2a 20 4d 65 73 73 61 67 65        /* Message
c740: 20 66 72 6f 6d 20 73 74 72 65 72 72 6f 72 28 29   from strerror()
c750: 20 6f 72 20 65 71 75 69 76 61 6c 65 6e 74 20 2a   or equivalent *
c760: 2f 0a 20 20 69 6e 74 20 69 45 72 72 6e 6f 20 3d  /.  int iErrno =
c770: 20 65 72 72 6e 6f 3b 20 20 20 20 20 20 20 20 20   errno;         
c780: 20 20 20 20 2f 2a 20 53 61 76 65 64 20 73 79 73      /* Saved sys
c790: 63 61 6c 6c 20 65 72 72 6f 72 20 6e 75 6d 62 65  call error numbe
c7a0: 72 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 74 68  r */..  /* If th
c7b0: 69 73 20 69 73 20 6e 6f 74 20 61 20 74 68 72 65  is is not a thre
c7c0: 61 64 73 61 66 65 20 62 75 69 6c 64 20 28 53 51  adsafe build (SQ
c7d0: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 3d  LITE_THREADSAFE=
c7e0: 3d 30 29 2c 20 74 68 65 6e 20 75 73 65 0a 20 20  =0), then use.  
c7f0: 2a 2a 20 74 68 65 20 73 74 72 65 72 72 6f 72 28  ** the strerror(
c800: 29 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 6f 62  ) function to ob
c810: 74 61 69 6e 20 74 68 65 20 68 75 6d 61 6e 2d 72  tain the human-r
c820: 65 61 64 61 62 6c 65 20 65 72 72 6f 72 20 6d 65  eadable error me
c830: 73 73 61 67 65 0a 20 20 2a 2a 20 65 71 75 69 76  ssage.  ** equiv
c840: 61 6c 65 6e 74 20 74 6f 20 65 72 72 6e 6f 2e 20  alent to errno. 
c850: 4f 74 68 65 72 77 69 73 65 2c 20 75 73 65 20 73  Otherwise, use s
c860: 74 72 65 72 72 6f 72 5f 72 28 29 2e 0a 20 20 2a  trerror_r()..  *
c870: 2f 20 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48  / .#if SQLITE_TH
c880: 52 45 41 44 53 41 46 45 20 26 26 20 64 65 66 69  READSAFE && defi
c890: 6e 65 64 28 48 41 56 45 5f 53 54 52 45 52 52 4f  ned(HAVE_STRERRO
c8a0: 52 5f 52 29 0a 20 20 63 68 61 72 20 61 45 72 72  R_R).  char aErr
c8b0: 5b 38 30 5d 3b 0a 20 20 6d 65 6d 73 65 74 28 61  [80];.  memset(a
c8c0: 45 72 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61  Err, 0, sizeof(a
c8d0: 45 72 72 29 29 3b 0a 20 20 7a 45 72 72 20 3d 20  Err));.  zErr = 
c8e0: 61 45 72 72 3b 0a 0a 20 20 2f 2a 20 49 66 20 53  aErr;..  /* If S
c8f0: 54 52 45 52 52 4f 52 5f 52 5f 43 48 41 52 5f 50  TRERROR_R_CHAR_P
c900: 20 28 73 65 74 20 62 79 20 61 75 74 6f 63 6f 6e   (set by autocon
c910: 66 20 73 63 72 69 70 74 73 29 20 6f 72 20 5f 5f  f scripts) or __
c920: 55 53 45 5f 47 4e 55 20 69 73 20 64 65 66 69 6e  USE_GNU is defin
c930: 65 64 2c 0a 20 20 2a 2a 20 61 73 73 75 6d 65 20  ed,.  ** assume 
c940: 74 68 61 74 20 74 68 65 20 73 79 73 74 65 6d 20  that the system 
c950: 70 72 6f 76 69 64 65 73 20 74 68 65 20 47 4e 55  provides the GNU
c960: 20 76 65 72 73 69 6f 6e 20 6f 66 20 73 74 72 65   version of stre
c970: 72 72 6f 72 5f 72 28 29 20 74 68 61 74 0a 20 20  rror_r() that.  
c980: 2a 2a 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69  ** returns a poi
c990: 6e 74 65 72 20 74 6f 20 61 20 62 75 66 66 65 72  nter to a buffer
c9a0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
c9b0: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 20 54  error message. T
c9c0: 68 61 74 20 70 6f 69 6e 74 65 72 20 0a 20 20 2a  hat pointer .  *
c9d0: 2a 20 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20 61  * may point to a
c9e0: 45 72 72 5b 5d 2c 20 6f 72 20 69 74 20 6d 61 79  Err[], or it may
c9f0: 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65 20 73   point to some s
ca00: 74 61 74 69 63 20 73 74 6f 72 61 67 65 20 73 6f  tatic storage so
ca10: 6d 65 77 68 65 72 65 2e 20 0a 20 20 2a 2a 20 4f  mewhere. .  ** O
ca20: 74 68 65 72 77 69 73 65 2c 20 61 73 73 75 6d 65  therwise, assume
ca30: 20 74 68 61 74 20 74 68 65 20 73 79 73 74 65 6d   that the system
ca40: 20 70 72 6f 76 69 64 65 73 20 74 68 65 20 50 4f   provides the PO
ca50: 53 49 58 20 76 65 72 73 69 6f 6e 20 6f 66 20 0a  SIX version of .
ca60: 20 20 2a 2a 20 73 74 72 65 72 72 6f 72 5f 72 28    ** strerror_r(
ca70: 29 2c 20 77 68 69 63 68 20 61 6c 77 61 79 73 20  ), which always 
ca80: 77 72 69 74 65 73 20 61 6e 20 65 72 72 6f 72 20  writes an error 
ca90: 6d 65 73 73 61 67 65 20 69 6e 74 6f 20 61 45 72  message into aEr
caa0: 72 5b 5d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  r[]..  **.  ** I
cab0: 66 20 74 68 65 20 63 6f 64 65 20 69 6e 63 6f 72  f the code incor
cac0: 72 65 63 74 6c 79 20 61 73 73 75 6d 65 73 20 74  rectly assumes t
cad0: 68 61 74 20 69 74 20 69 73 20 74 68 65 20 50 4f  hat it is the PO
cae0: 53 49 58 20 76 65 72 73 69 6f 6e 20 74 68 61 74  SIX version that
caf0: 20 69 73 0a 20 20 2a 2a 20 61 76 61 69 6c 61 62   is.  ** availab
cb00: 6c 65 2c 20 74 68 65 20 65 72 72 6f 72 20 6d 65  le, the error me
cb10: 73 73 61 67 65 20 77 69 6c 6c 20 6f 66 74 65 6e  ssage will often
cb20: 20 62 65 20 61 6e 20 65 6d 70 74 79 20 73 74 72   be an empty str
cb30: 69 6e 67 2e 20 4e 6f 74 20 61 0a 20 20 2a 2a 20  ing. Not a.  ** 
cb40: 68 75 67 65 20 70 72 6f 62 6c 65 6d 2e 20 49 6e  huge problem. In
cb50: 63 6f 72 72 65 63 74 6c 79 20 63 6f 6e 63 6c 75  correctly conclu
cb60: 64 69 6e 67 20 74 68 61 74 20 74 68 65 20 47 4e  ding that the GN
cb70: 55 20 76 65 72 73 69 6f 6e 20 69 73 20 61 76 61  U version is ava
cb80: 69 6c 61 62 6c 65 20 0a 20 20 2a 2a 20 63 6f 75  ilable .  ** cou
cb90: 6c 64 20 6c 65 61 64 20 74 6f 20 61 20 73 65 67  ld lead to a seg
cba0: 66 61 75 6c 74 20 74 68 6f 75 67 68 2e 0a 20 20  fault though..  
cbb0: 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  */.#if defined(S
cbc0: 54 52 45 52 52 4f 52 5f 52 5f 43 48 41 52 5f 50  TRERROR_R_CHAR_P
cbd0: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f 55  ) || defined(__U
cbe0: 53 45 5f 47 4e 55 29 0a 20 20 7a 45 72 72 20 3d  SE_GNU).  zErr =
cbf0: 20 0a 23 20 65 6e 64 69 66 0a 20 20 73 74 72 65   .# endif.  stre
cc00: 72 72 6f 72 5f 72 28 69 45 72 72 6e 6f 2c 20 61  rror_r(iErrno, a
cc10: 45 72 72 2c 20 73 69 7a 65 6f 66 28 61 45 72 72  Err, sizeof(aErr
cc20: 29 2d 31 29 3b 0a 0a 23 65 6c 69 66 20 53 51 4c  )-1);..#elif SQL
cc30: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a 20  ITE_THREADSAFE. 
cc40: 20 2f 2a 20 54 68 69 73 20 69 73 20 61 20 74 68   /* This is a th
cc50: 72 65 61 64 73 61 66 65 20 62 75 69 6c 64 2c 20  readsafe build, 
cc60: 62 75 74 20 73 74 72 65 72 72 6f 72 5f 72 28 29  but strerror_r()
cc70: 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c   is not availabl
cc80: 65 2e 20 2a 2f 0a 20 20 7a 45 72 72 20 3d 20 22  e. */.  zErr = "
cc90: 22 3b 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 4e 6f  ";.#else.  /* No
cca0: 6e 2d 74 68 72 65 61 64 73 61 66 65 20 62 75 69  n-threadsafe bui
ccb0: 6c 64 2c 20 75 73 65 20 73 74 72 65 72 72 6f 72  ld, use strerror
ccc0: 28 29 2e 20 2a 2f 0a 20 20 7a 45 72 72 20 3d 20  (). */.  zErr = 
ccd0: 73 74 72 65 72 72 6f 72 28 69 45 72 72 6e 6f 29  strerror(iErrno)
cce0: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20  ;.#endif..  if( 
ccf0: 7a 50 61 74 68 3d 3d 30 20 29 20 7a 50 61 74 68  zPath==0 ) zPath
cd00: 20 3d 20 22 22 3b 0a 20 20 73 71 6c 69 74 65 33   = "";.  sqlite3
cd10: 5f 6c 6f 67 28 65 72 72 63 6f 64 65 2c 0a 20 20  _log(errcode,.  
cd20: 20 20 20 20 22 6f 73 5f 75 6e 69 78 2e 63 3a 25      "os_unix.c:%
cd30: 64 3a 20 28 25 64 29 20 25 73 28 25 73 29 20 2d  d: (%d) %s(%s) -
cd40: 20 25 73 22 2c 0a 20 20 20 20 20 20 69 4c 69 6e   %s",.      iLin
cd50: 65 2c 20 69 45 72 72 6e 6f 2c 20 7a 46 75 6e 63  e, iErrno, zFunc
cd60: 2c 20 7a 50 61 74 68 2c 20 7a 45 72 72 0a 20 20  , zPath, zErr.  
cd70: 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 65 72 72  );..  return err
cd80: 63 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  code;.}../*.** C
cd90: 6c 6f 73 65 20 61 20 66 69 6c 65 20 64 65 73 63  lose a file desc
cda0: 72 69 70 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 57 65  riptor..**.** We
cdb0: 20 61 73 73 75 6d 65 20 74 68 61 74 20 63 6c 6f   assume that clo
cdc0: 73 65 28 29 20 61 6c 6d 6f 73 74 20 61 6c 77 61  se() almost alwa
cdd0: 79 73 20 77 6f 72 6b 73 2c 20 73 69 6e 63 65 20  ys works, since 
cde0: 69 74 20 69 73 20 6f 6e 6c 79 20 69 6e 20 61 0a  it is only in a.
cdf0: 2a 2a 20 76 65 72 79 20 73 69 63 6b 20 61 70 70  ** very sick app
ce00: 6c 69 63 61 74 69 6f 6e 20 6f 72 20 6f 6e 20 61  lication or on a
ce10: 20 76 65 72 79 20 73 69 63 6b 20 70 6c 61 74 66   very sick platf
ce20: 6f 72 6d 20 74 68 61 74 20 69 74 20 6d 69 67 68  orm that it migh
ce30: 74 20 66 61 69 6c 2e 0a 2a 2a 20 49 66 20 69 74  t fail..** If it
ce40: 20 64 6f 65 73 20 66 61 69 6c 2c 20 73 69 6d 70   does fail, simp
ce50: 6c 79 20 6c 65 61 6b 20 74 68 65 20 66 69 6c 65  ly leak the file
ce60: 20 64 65 73 63 72 69 70 74 6f 72 2c 20 62 75 74   descriptor, but
ce70: 20 64 6f 20 6c 6f 67 20 74 68 65 0a 2a 2a 20 65   do log the.** e
ce80: 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  rror..**.** Note
ce90: 20 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20   that it is not 
cea0: 73 61 66 65 20 74 6f 20 72 65 74 72 79 20 63 6c  safe to retry cl
ceb0: 6f 73 65 28 29 20 61 66 74 65 72 20 45 49 4e 54  ose() after EINT
cec0: 52 20 73 69 6e 63 65 20 74 68 65 0a 2a 2a 20 66  R since the.** f
ced0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6d  ile descriptor m
cee0: 69 67 68 74 20 68 61 76 65 20 61 6c 72 65 61 64  ight have alread
cef0: 79 20 62 65 65 6e 20 72 65 75 73 65 64 20 62 79  y been reused by
cf00: 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64 2e   another thread.
cf10: 0a 2a 2a 20 53 6f 20 77 65 20 64 6f 6e 27 74 20  .** So we don't 
cf20: 65 76 65 6e 20 74 72 79 20 74 6f 20 72 65 63 6f  even try to reco
cf30: 76 65 72 20 66 72 6f 6d 20 61 6e 20 45 49 4e 54  ver from an EINT
cf40: 52 2e 20 20 4a 75 73 74 20 6c 6f 67 20 74 68 65  R.  Just log the
cf50: 20 65 72 72 6f 72 0a 2a 2a 20 61 6e 64 20 6d 6f   error.** and mo
cf60: 76 65 20 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ve on..*/.static
cf70: 20 76 6f 69 64 20 72 6f 62 75 73 74 5f 63 6c 6f   void robust_clo
cf80: 73 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  se(unixFile *pFi
cf90: 6c 65 2c 20 69 6e 74 20 68 2c 20 69 6e 74 20 6c  le, int h, int l
cfa0: 69 6e 65 6e 6f 29 7b 0a 20 20 69 66 28 20 6f 73  ineno){.  if( os
cfb0: 43 6c 6f 73 65 28 68 29 20 29 7b 0a 20 20 20 20  Close(h) ){.    
cfc0: 75 6e 69 78 4c 6f 67 45 72 72 6f 72 41 74 4c 69  unixLogErrorAtLi
cfd0: 6e 65 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  ne(SQLITE_IOERR_
cfe0: 43 4c 4f 53 45 2c 20 22 63 6c 6f 73 65 22 2c 0a  CLOSE, "close",.
cff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d000: 20 20 20 20 20 20 20 70 46 69 6c 65 20 3f 20 70         pFile ? p
d010: 46 69 6c 65 2d 3e 7a 50 61 74 68 20 3a 20 30 2c  File->zPath : 0,
d020: 20 6c 69 6e 65 6e 6f 29 3b 0a 20 20 7d 0a 7d 0a   lineno);.  }.}.
d030: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 70  ./*.** Set the p
d040: 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2e  File->lastErrno.
d050: 20 20 44 6f 20 74 68 69 73 20 69 6e 20 61 20 73    Do this in a s
d060: 75 62 72 6f 75 74 69 6e 65 20 61 73 20 74 68 61  ubroutine as tha
d070: 74 20 70 72 6f 76 69 64 65 73 0a 2a 2a 20 61 20  t provides.** a 
d080: 63 6f 6e 76 65 6e 69 65 6e 74 20 70 6c 61 63 65  convenient place
d090: 20 74 6f 20 73 65 74 20 61 20 62 72 65 61 6b 70   to set a breakp
d0a0: 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  oint..*/.static 
d0b0: 76 6f 69 64 20 73 74 6f 72 65 4c 61 73 74 45 72  void storeLastEr
d0c0: 72 6e 6f 28 75 6e 69 78 46 69 6c 65 20 2a 70 46  rno(unixFile *pF
d0d0: 69 6c 65 2c 20 69 6e 74 20 65 72 72 6f 72 29 7b  ile, int error){
d0e0: 0a 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72  .  pFile->lastEr
d0f0: 72 6e 6f 20 3d 20 65 72 72 6f 72 3b 0a 7d 0a 0a  rno = error;.}..
d100: 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20  /*.** Close all 
d110: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73  file descriptors
d120: 20 61 63 63 75 6d 75 61 74 65 64 20 69 6e 20 74   accumuated in t
d130: 68 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  he unixInodeInfo
d140: 2d 3e 70 55 6e 75 73 65 64 20 6c 69 73 74 2e 0a  ->pUnused list..
d150: 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20  */ .static void 
d160: 63 6c 6f 73 65 50 65 6e 64 69 6e 67 46 64 73 28  closePendingFds(
d170: 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 29  unixFile *pFile)
d180: 7b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  {.  unixInodeInf
d190: 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c  o *pInode = pFil
d1a0: 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 55 6e 69  e->pInode;.  Uni
d1b0: 78 55 6e 75 73 65 64 46 64 20 2a 70 3b 0a 20 20  xUnusedFd *p;.  
d1c0: 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70 4e  UnixUnusedFd *pN
d1d0: 65 78 74 3b 0a 20 20 66 6f 72 28 70 3d 70 49 6e  ext;.  for(p=pIn
d1e0: 6f 64 65 2d 3e 70 55 6e 75 73 65 64 3b 20 70 3b  ode->pUnused; p;
d1f0: 20 70 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70   p=pNext){.    p
d200: 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b  Next = p->pNext;
d210: 0a 23 69 66 20 4f 53 43 4c 4f 53 45 5f 43 48 45  .#if OSCLOSE_CHE
d220: 43 4b 5f 43 4c 4f 53 45 5f 49 4f 45 52 52 0a 20  CK_CLOSE_IOERR. 
d230: 20 20 20 69 66 28 20 63 6c 6f 73 65 28 70 2d 3e     if( close(p->
d240: 66 64 29 20 29 7b 0a 20 20 20 20 20 20 73 74 6f  fd) ){.      sto
d250: 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c  reLastErrno(pFil
d260: 65 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 20  e, errno);.     
d270: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
d280: 52 52 5f 43 4c 4f 53 45 3b 0a 20 20 20 20 20 20  RR_CLOSE;.      
d290: 70 2d 3e 70 4e 65 78 74 20 3d 20 70 45 72 72 6f  p->pNext = pErro
d2a0: 72 3b 0a 20 20 20 20 20 20 70 45 72 72 6f 72 20  r;.      pError 
d2b0: 3d 20 70 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = p;.    }else{.
d2c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
d2d0: 65 65 28 70 29 3b 0a 20 20 20 20 7d 0a 23 65 6c  ee(p);.    }.#el
d2e0: 73 65 0a 20 20 20 20 72 6f 62 75 73 74 5f 63 6c  se.    robust_cl
d2f0: 6f 73 65 28 70 46 69 6c 65 2c 20 70 2d 3e 66 64  ose(pFile, p->fd
d300: 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20  , __LINE__);.   
d310: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
d320: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 6e 55 6e  ;.#endif.    nUn
d330: 75 73 65 64 46 64 2d 2d 3b 0a 20 20 7d 0a 20 20  usedFd--;.  }.  
d340: 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 20  pInode->pUnused 
d350: 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  = 0;.}../*.** Re
d360: 6c 65 61 73 65 20 61 20 75 6e 69 78 49 6e 6f 64  lease a unixInod
d370: 65 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20  eInfo structure 
d380: 70 72 65 76 69 6f 75 73 6c 79 20 61 6c 6c 6f 63  previously alloc
d390: 61 74 65 64 20 62 79 20 66 69 6e 64 49 6e 6f 64  ated by findInod
d3a0: 65 49 6e 66 6f 28 29 2e 0a 2a 2a 0a 2a 2a 20 54  eInfo()..**.** T
d3b0: 68 65 20 6d 75 74 65 78 20 65 6e 74 65 72 65 64  he mutex entered
d3c0: 20 75 73 69 6e 67 20 74 68 65 20 75 6e 69 78 45   using the unixE
d3d0: 6e 74 65 72 4d 75 74 65 78 28 29 20 66 75 6e 63  nterMutex() func
d3e0: 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 68 65 6c  tion must be hel
d3f0: 64 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73 20 66  d.** when this f
d400: 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
d410: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
d420: 64 20 72 65 6c 65 61 73 65 49 6e 6f 64 65 49 6e  d releaseInodeIn
d430: 66 6f 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  fo(unixFile *pFi
d440: 6c 65 29 7b 0a 20 20 75 6e 69 78 49 6e 6f 64 65  le){.  unixInode
d450: 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70  Info *pInode = p
d460: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20  File->pInode;.  
d470: 61 73 73 65 72 74 28 20 75 6e 69 78 4d 75 74 65  assert( unixMute
d480: 78 48 65 6c 64 28 29 20 29 3b 0a 20 20 69 66 28  xHeld() );.  if(
d490: 20 41 4c 57 41 59 53 28 70 49 6e 6f 64 65 29 20   ALWAYS(pInode) 
d4a0: 29 7b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e  ){.    pInode->n
d4b0: 52 65 66 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70  Ref--;.    if( p
d4c0: 49 6e 6f 64 65 2d 3e 6e 52 65 66 3d 3d 30 20 29  Inode->nRef==0 )
d4d0: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
d4e0: 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65  pInode->pShmNode
d4f0: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 63 6c 6f  ==0 );.      clo
d500: 73 65 50 65 6e 64 69 6e 67 46 64 73 28 70 46 69  sePendingFds(pFi
d510: 6c 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  le);.      if( p
d520: 49 6e 6f 64 65 2d 3e 70 50 72 65 76 20 29 7b 0a  Inode->pPrev ){.
d530: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
d540: 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76 2d 3e 70  pInode->pPrev->p
d550: 4e 65 78 74 3d 3d 70 49 6e 6f 64 65 20 29 3b 0a  Next==pInode );.
d560: 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e          pInode->
d570: 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70  pPrev->pNext = p
d580: 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a 20 20  Inode->pNext;.  
d590: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
d5a0: 20 20 20 61 73 73 65 72 74 28 20 69 6e 6f 64 65     assert( inode
d5b0: 4c 69 73 74 3d 3d 70 49 6e 6f 64 65 20 29 3b 0a  List==pInode );.
d5c0: 20 20 20 20 20 20 20 20 69 6e 6f 64 65 4c 69 73          inodeLis
d5d0: 74 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78  t = pInode->pNex
d5e0: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
d5f0: 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 70 4e 65   if( pInode->pNe
d600: 78 74 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  xt ){.        as
d610: 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 70 4e  sert( pInode->pN
d620: 65 78 74 2d 3e 70 50 72 65 76 3d 3d 70 49 6e 6f  ext->pPrev==pIno
d630: 64 65 20 29 3b 0a 20 20 20 20 20 20 20 20 70 49  de );.        pI
d640: 6e 6f 64 65 2d 3e 70 4e 65 78 74 2d 3e 70 50 72  node->pNext->pPr
d650: 65 76 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 50 72  ev = pInode->pPr
d660: 65 76 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ev;.      }.    
d670: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
d680: 49 6e 6f 64 65 29 3b 0a 20 20 20 20 7d 0a 20 20  Inode);.    }.  
d690: 7d 0a 20 20 61 73 73 65 72 74 28 20 69 6e 6f 64  }.  assert( inod
d6a0: 65 4c 69 73 74 21 3d 30 20 7c 7c 20 6e 55 6e 75  eList!=0 || nUnu
d6b0: 73 65 64 46 64 3d 3d 30 20 29 3b 0a 7d 0a 0a 2f  sedFd==0 );.}../
d6c0: 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 66 69 6c  *.** Given a fil
d6d0: 65 20 64 65 73 63 72 69 70 74 6f 72 2c 20 6c 6f  e descriptor, lo
d6e0: 63 61 74 65 20 74 68 65 20 75 6e 69 78 49 6e 6f  cate the unixIno
d6f0: 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 20 74 68  deInfo object th
d700: 61 74 0a 2a 2a 20 64 65 73 63 72 69 62 65 73 20  at.** describes 
d710: 74 68 61 74 20 66 69 6c 65 20 64 65 73 63 72 69  that file descri
d720: 70 74 6f 72 2e 20 20 43 72 65 61 74 65 20 61 20  ptor.  Create a 
d730: 6e 65 77 20 6f 6e 65 20 69 66 20 6e 65 63 65 73  new one if neces
d740: 73 61 72 79 2e 20 20 54 68 65 0a 2a 2a 20 72 65  sary.  The.** re
d750: 74 75 72 6e 20 76 61 6c 75 65 20 6d 69 67 68 74  turn value might
d760: 20 62 65 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65   be uninitialize
d770: 64 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  d if an error oc
d780: 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  curs..**.** The 
d790: 6d 75 74 65 78 20 65 6e 74 65 72 65 64 20 75 73  mutex entered us
d7a0: 69 6e 67 20 74 68 65 20 75 6e 69 78 45 6e 74 65  ing the unixEnte
d7b0: 72 4d 75 74 65 78 28 29 20 66 75 6e 63 74 69 6f  rMutex() functio
d7c0: 6e 20 6d 75 73 74 20 62 65 20 68 65 6c 64 0a 2a  n must be held.*
d7d0: 2a 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  * when this func
d7e0: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e 0a  tion is called..
d7f0: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20  **.** Return an 
d800: 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f  appropriate erro
d810: 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69  r code..*/.stati
d820: 63 20 69 6e 74 20 66 69 6e 64 49 6e 6f 64 65 49  c int findInodeI
d830: 6e 66 6f 28 0a 20 20 75 6e 69 78 46 69 6c 65 20  nfo(.  unixFile 
d840: 2a 70 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20  *pFile,         
d850: 20 20 20 20 20 20 2f 2a 20 55 6e 69 78 20 66 69        /* Unix fi
d860: 6c 65 20 77 69 74 68 20 66 69 6c 65 20 64 65 73  le with file des
d870: 63 20 75 73 65 64 20 69 6e 20 74 68 65 20 6b 65  c used in the ke
d880: 79 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65  y */.  unixInode
d890: 49 6e 66 6f 20 2a 2a 70 70 49 6e 6f 64 65 20 20  Info **ppInode  
d8a0: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
d8b0: 74 68 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  the unixInodeInf
d8c0: 6f 20 6f 62 6a 65 63 74 20 68 65 72 65 20 2a 2f  o object here */
d8d0: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  .){.  int rc;   
d8e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d8f0: 20 20 20 20 20 2f 2a 20 53 79 73 74 65 6d 20 63       /* System c
d900: 61 6c 6c 20 72 65 74 75 72 6e 20 63 6f 64 65 20  all return code 
d910: 2a 2f 0a 20 20 69 6e 74 20 66 64 3b 20 20 20 20  */.  int fd;    
d920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d930: 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20      /* The file 
d940: 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20 70  descriptor for p
d950: 46 69 6c 65 20 2a 2f 0a 20 20 73 74 72 75 63 74  File */.  struct
d960: 20 75 6e 69 78 46 69 6c 65 49 64 20 66 69 6c 65   unixFileId file
d970: 49 64 3b 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 6b  Id;      /* Look
d980: 75 70 20 6b 65 79 20 66 6f 72 20 74 68 65 20 75  up key for the u
d990: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 2f 0a  nixInodeInfo */.
d9a0: 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73 74    struct stat st
d9b0: 61 74 62 75 66 3b 20 20 20 20 20 20 20 20 20 20  atbuf;          
d9c0: 20 2f 2a 20 4c 6f 77 2d 6c 65 76 65 6c 20 66 69   /* Low-level fi
d9d0: 6c 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a  le information *
d9e0: 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  /.  unixInodeInf
d9f0: 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 30 3b 20 20  o *pInode = 0;  
da00: 20 20 20 2f 2a 20 43 61 6e 64 69 64 61 74 65 20     /* Candidate 
da10: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62  unixInodeInfo ob
da20: 6a 65 63 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72  ject */..  asser
da30: 74 28 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64  t( unixMutexHeld
da40: 28 29 20 29 3b 0a 0a 20 20 2f 2a 20 47 65 74 20  () );..  /* Get 
da50: 6c 6f 77 2d 6c 65 76 65 6c 20 69 6e 66 6f 72 6d  low-level inform
da60: 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20  ation about the 
da70: 66 69 6c 65 20 74 68 61 74 20 77 65 20 63 61 6e  file that we can
da80: 20 75 73 65 64 20 74 6f 0a 20 20 2a 2a 20 63 72   used to.  ** cr
da90: 65 61 74 65 20 61 20 75 6e 69 71 75 65 20 6e 61  eate a unique na
daa0: 6d 65 20 66 6f 72 20 74 68 65 20 66 69 6c 65 2e  me for the file.
dab0: 0a 20 20 2a 2f 0a 20 20 66 64 20 3d 20 70 46 69  .  */.  fd = pFi
dac0: 6c 65 2d 3e 68 3b 0a 20 20 72 63 20 3d 20 6f 73  le->h;.  rc = os
dad0: 46 73 74 61 74 28 66 64 2c 20 26 73 74 61 74 62  Fstat(fd, &statb
dae0: 75 66 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 30  uf);.  if( rc!=0
daf0: 20 29 7b 0a 20 20 20 20 73 74 6f 72 65 4c 61 73   ){.    storeLas
db00: 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72  tErrno(pFile, er
db10: 72 6e 6f 29 3b 0a 23 69 66 20 64 65 66 69 6e 65  rno);.#if define
db20: 64 28 45 4f 56 45 52 46 4c 4f 57 29 20 26 26 20  d(EOVERFLOW) && 
db30: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
db40: 49 53 41 42 4c 45 5f 4c 46 53 29 0a 20 20 20 20  ISABLE_LFS).    
db50: 69 66 28 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  if( pFile->lastE
db60: 72 72 6e 6f 3d 3d 45 4f 56 45 52 46 4c 4f 57 20  rrno==EOVERFLOW 
db70: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
db80: 4e 4f 4c 46 53 3b 0a 23 65 6e 64 69 66 0a 20 20  NOLFS;.#endif.  
db90: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
dba0: 49 4f 45 52 52 3b 0a 20 20 7d 0a 0a 23 69 66 64  IOERR;.  }..#ifd
dbb0: 65 66 20 5f 5f 41 50 50 4c 45 5f 5f 0a 20 20 2f  ef __APPLE__.  /
dbc0: 2a 20 4f 6e 20 4f 53 20 58 20 6f 6e 20 61 6e 20  * On OS X on an 
dbd0: 6d 73 64 6f 73 20 66 69 6c 65 73 79 73 74 65 6d  msdos filesystem
dbe0: 2c 20 74 68 65 20 69 6e 6f 64 65 20 6e 75 6d 62  , the inode numb
dbf0: 65 72 20 69 73 20 72 65 70 6f 72 74 65 64 0a 20  er is reported. 
dc00: 20 2a 2a 20 69 6e 63 6f 72 72 65 63 74 6c 79 20   ** incorrectly 
dc10: 66 6f 72 20 7a 65 72 6f 2d 73 69 7a 65 20 66 69  for zero-size fi
dc20: 6c 65 73 2e 20 20 53 65 65 20 74 69 63 6b 65 74  les.  See ticket
dc30: 20 23 33 32 36 30 2e 20 20 54 6f 20 77 6f 72 6b   #3260.  To work
dc40: 0a 20 20 2a 2a 20 61 72 6f 75 6e 64 20 74 68 69  .  ** around thi
dc50: 73 20 70 72 6f 62 6c 65 6d 20 28 77 65 20 63 6f  s problem (we co
dc60: 6e 73 69 64 65 72 20 69 74 20 61 20 62 75 67 20  nsider it a bug 
dc70: 69 6e 20 4f 53 20 58 2c 20 6e 6f 74 20 53 51 4c  in OS X, not SQL
dc80: 69 74 65 29 0a 20 20 2a 2a 20 77 65 20 61 6c 77  ite).  ** we alw
dc90: 61 79 73 20 69 6e 63 72 65 61 73 65 20 74 68 65  ays increase the
dca0: 20 66 69 6c 65 20 73 69 7a 65 20 74 6f 20 31 20   file size to 1 
dcb0: 62 79 20 77 72 69 74 69 6e 67 20 61 20 73 69 6e  by writing a sin
dcc0: 67 6c 65 20 62 79 74 65 0a 20 20 2a 2a 20 70 72  gle byte.  ** pr
dcd0: 69 6f 72 20 74 6f 20 61 63 63 65 73 73 69 6e 67  ior to accessing
dce0: 20 74 68 65 20 69 6e 6f 64 65 20 6e 75 6d 62 65   the inode numbe
dcf0: 72 2e 20 20 54 68 65 20 6f 6e 65 20 62 79 74 65  r.  The one byte
dd00: 20 77 72 69 74 74 65 6e 20 69 73 0a 20 20 2a 2a   written is.  **
dd10: 20 61 6e 20 41 53 43 49 49 20 27 53 27 20 63 68   an ASCII 'S' ch
dd20: 61 72 61 63 74 65 72 20 77 68 69 63 68 20 61 6c  aracter which al
dd30: 73 6f 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65  so happens to be
dd40: 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65 0a   the first byte.
dd50: 20 20 2a 2a 20 69 6e 20 74 68 65 20 68 65 61 64    ** in the head
dd60: 65 72 20 6f 66 20 65 76 65 72 79 20 53 51 4c 69  er of every SQLi
dd70: 74 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 6e  te database.  In
dd80: 20 74 68 69 73 20 77 61 79 2c 20 69 66 20 74 68   this way, if th
dd90: 65 72 65 0a 20 20 2a 2a 20 69 73 20 61 20 72 61  ere.  ** is a ra
dda0: 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 73 75 63  ce condition suc
ddb0: 68 20 74 68 61 74 20 61 6e 6f 74 68 65 72 20 74  h that another t
ddc0: 68 72 65 61 64 20 68 61 73 20 61 6c 72 65 61 64  hread has alread
ddd0: 79 20 70 6f 70 75 6c 61 74 65 64 0a 20 20 2a 2a  y populated.  **
dde0: 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20   the first page 
ddf0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  of the database,
de00: 20 6e 6f 20 64 61 6d 61 67 65 20 69 73 20 64 6f   no damage is do
de10: 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73  ne..  */.  if( s
de20: 74 61 74 62 75 66 2e 73 74 5f 73 69 7a 65 3d 3d  tatbuf.st_size==
de30: 30 20 26 26 20 28 70 46 69 6c 65 2d 3e 66 73 46  0 && (pFile->fsF
de40: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 53  lags & SQLITE_FS
de50: 46 4c 41 47 53 5f 49 53 5f 4d 53 44 4f 53 29 21  FLAGS_IS_MSDOS)!
de60: 3d 30 20 29 7b 0a 20 20 20 20 64 6f 7b 20 72 63  =0 ){.    do{ rc
de70: 20 3d 20 6f 73 57 72 69 74 65 28 66 64 2c 20 22   = osWrite(fd, "
de80: 53 22 2c 20 31 29 3b 20 7d 77 68 69 6c 65 28 20  S", 1); }while( 
de90: 72 63 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45  rc<0 && errno==E
dea0: 49 4e 54 52 20 29 3b 0a 20 20 20 20 69 66 28 20  INTR );.    if( 
deb0: 72 63 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 73  rc!=1 ){.      s
dec0: 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46  toreLastErrno(pF
ded0: 69 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20  ile, errno);.   
dee0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
def0: 5f 49 4f 45 52 52 3b 0a 20 20 20 20 7d 0a 20 20  _IOERR;.    }.  
df00: 20 20 72 63 20 3d 20 6f 73 46 73 74 61 74 28 66    rc = osFstat(f
df10: 64 2c 20 26 73 74 61 74 62 75 66 29 3b 0a 20 20  d, &statbuf);.  
df20: 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20    if( rc!=0 ){. 
df30: 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72       storeLastEr
df40: 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f  rno(pFile, errno
df50: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
df60: 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20  SQLITE_IOERR;.  
df70: 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
df80: 20 20 6d 65 6d 73 65 74 28 26 66 69 6c 65 49 64    memset(&fileId
df90: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 66 69 6c 65  , 0, sizeof(file
dfa0: 49 64 29 29 3b 0a 20 20 66 69 6c 65 49 64 2e 64  Id));.  fileId.d
dfb0: 65 76 20 3d 20 73 74 61 74 62 75 66 2e 73 74 5f  ev = statbuf.st_
dfc0: 64 65 76 3b 0a 23 69 66 20 4f 53 5f 56 58 57 4f  dev;.#if OS_VXWO
dfd0: 52 4b 53 0a 20 20 66 69 6c 65 49 64 2e 70 49 64  RKS.  fileId.pId
dfe0: 20 3d 20 70 46 69 6c 65 2d 3e 70 49 64 3b 0a 23   = pFile->pId;.#
dff0: 65 6c 73 65 0a 20 20 66 69 6c 65 49 64 2e 69 6e  else.  fileId.in
e000: 6f 20 3d 20 28 75 36 34 29 73 74 61 74 62 75 66  o = (u64)statbuf
e010: 2e 73 74 5f 69 6e 6f 3b 0a 23 65 6e 64 69 66 0a  .st_ino;.#endif.
e020: 20 20 61 73 73 65 72 74 28 20 69 6e 6f 64 65 4c    assert( inodeL
e030: 69 73 74 21 3d 30 20 7c 7c 20 6e 55 6e 75 73 65  ist!=0 || nUnuse
e040: 64 46 64 3d 3d 30 20 29 3b 0a 20 20 70 49 6e 6f  dFd==0 );.  pIno
e050: 64 65 20 3d 20 69 6e 6f 64 65 4c 69 73 74 3b 0a  de = inodeList;.
e060: 20 20 77 68 69 6c 65 28 20 70 49 6e 6f 64 65 20    while( pInode 
e070: 26 26 20 6d 65 6d 63 6d 70 28 26 66 69 6c 65 49  && memcmp(&fileI
e080: 64 2c 20 26 70 49 6e 6f 64 65 2d 3e 66 69 6c 65  d, &pInode->file
e090: 49 64 2c 20 73 69 7a 65 6f 66 28 66 69 6c 65 49  Id, sizeof(fileI
e0a0: 64 29 29 20 29 7b 0a 20 20 20 20 70 49 6e 6f 64  d)) ){.    pInod
e0b0: 65 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78  e = pInode->pNex
e0c0: 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 49 6e  t;.  }.  if( pIn
e0d0: 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 70 49  ode==0 ){.    pI
e0e0: 6e 6f 64 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d  node = sqlite3_m
e0f0: 61 6c 6c 6f 63 36 34 28 20 73 69 7a 65 6f 66 28  alloc64( sizeof(
e100: 2a 70 49 6e 6f 64 65 29 20 29 3b 0a 20 20 20 20  *pInode) );.    
e110: 69 66 28 20 70 49 6e 6f 64 65 3d 3d 30 20 29 7b  if( pInode==0 ){
e120: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
e130: 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
e140: 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65  .    }.    memse
e150: 74 28 70 49 6e 6f 64 65 2c 20 30 2c 20 73 69 7a  t(pInode, 0, siz
e160: 65 6f 66 28 2a 70 49 6e 6f 64 65 29 29 3b 0a 20  eof(*pInode));. 
e170: 20 20 20 6d 65 6d 63 70 79 28 26 70 49 6e 6f 64     memcpy(&pInod
e180: 65 2d 3e 66 69 6c 65 49 64 2c 20 26 66 69 6c 65  e->fileId, &file
e190: 49 64 2c 20 73 69 7a 65 6f 66 28 66 69 6c 65 49  Id, sizeof(fileI
e1a0: 64 29 29 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d  d));.    pInode-
e1b0: 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 70  >nRef = 1;.    p
e1c0: 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 20 3d 20 69  Inode->pNext = i
e1d0: 6e 6f 64 65 4c 69 73 74 3b 0a 20 20 20 20 70 49  nodeList;.    pI
e1e0: 6e 6f 64 65 2d 3e 70 50 72 65 76 20 3d 20 30 3b  node->pPrev = 0;
e1f0: 0a 20 20 20 20 69 66 28 20 69 6e 6f 64 65 4c 69  .    if( inodeLi
e200: 73 74 20 29 20 69 6e 6f 64 65 4c 69 73 74 2d 3e  st ) inodeList->
e210: 70 50 72 65 76 20 3d 20 70 49 6e 6f 64 65 3b 0a  pPrev = pInode;.
e220: 20 20 20 20 69 6e 6f 64 65 4c 69 73 74 20 3d 20      inodeList = 
e230: 70 49 6e 6f 64 65 3b 0a 20 20 7d 65 6c 73 65 7b  pInode;.  }else{
e240: 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 52 65  .    pInode->nRe
e250: 66 2b 2b 3b 0a 20 20 7d 0a 20 20 2a 70 70 49 6e  f++;.  }.  *ppIn
e260: 6f 64 65 20 3d 20 70 49 6e 6f 64 65 3b 0a 20 20  ode = pInode;.  
e270: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
e280: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
e290: 6e 20 54 52 55 45 20 69 66 20 70 46 69 6c 65 20  n TRUE if pFile 
e2a0: 68 61 73 20 62 65 65 6e 20 72 65 6e 61 6d 65 64  has been renamed
e2b0: 20 6f 72 20 75 6e 6c 69 6e 6b 65 64 20 73 69 6e   or unlinked sin
e2c0: 63 65 20 69 74 20 77 61 73 20 66 69 72 73 74 20  ce it was first 
e2d0: 6f 70 65 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  opened..*/.stati
e2e0: 63 20 69 6e 74 20 66 69 6c 65 48 61 73 4d 6f 76  c int fileHasMov
e2f0: 65 64 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  ed(unixFile *pFi
e300: 6c 65 29 7b 0a 23 69 66 20 4f 53 5f 56 58 57 4f  le){.#if OS_VXWO
e310: 52 4b 53 0a 20 20 72 65 74 75 72 6e 20 70 46 69  RKS.  return pFi
e320: 6c 65 2d 3e 70 49 6e 6f 64 65 21 3d 30 20 26 26  le->pInode!=0 &&
e330: 20 70 46 69 6c 65 2d 3e 70 49 64 21 3d 70 46 69   pFile->pId!=pFi
e340: 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 66 69 6c 65  le->pInode->file
e350: 49 64 2e 70 49 64 3b 0a 23 65 6c 73 65 0a 20 20  Id.pId;.#else.  
e360: 73 74 72 75 63 74 20 73 74 61 74 20 62 75 66 3b  struct stat buf;
e370: 0a 20 20 72 65 74 75 72 6e 20 70 46 69 6c 65 2d  .  return pFile-
e380: 3e 70 49 6e 6f 64 65 21 3d 30 20 26 26 0a 20 20  >pInode!=0 &&.  
e390: 20 20 20 20 28 6f 73 53 74 61 74 28 70 46 69 6c      (osStat(pFil
e3a0: 65 2d 3e 7a 50 61 74 68 2c 20 26 62 75 66 29 21  e->zPath, &buf)!
e3b0: 3d 30 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20  =0 .         || 
e3c0: 28 75 36 34 29 62 75 66 2e 73 74 5f 69 6e 6f 21  (u64)buf.st_ino!
e3d0: 3d 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e  =pFile->pInode->
e3e0: 66 69 6c 65 49 64 2e 69 6e 6f 29 3b 0a 23 65 6e  fileId.ino);.#en
e3f0: 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68  dif.}.../*.** Ch
e400: 65 63 6b 20 61 20 75 6e 69 78 46 69 6c 65 20 74  eck a unixFile t
e410: 68 61 74 20 69 73 20 61 20 64 61 74 61 62 61 73  hat is a databas
e420: 65 2e 20 20 56 65 72 69 66 79 20 74 68 65 20 66  e.  Verify the f
e430: 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20  ollowing:.**.** 
e440: 28 31 29 20 54 68 65 72 65 20 69 73 20 65 78 61  (1) There is exa
e450: 63 74 6c 79 20 6f 6e 65 20 68 61 72 64 20 6c 69  ctly one hard li
e460: 6e 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 0a 2a  nk on the file.*
e470: 2a 20 28 32 29 20 54 68 65 20 66 69 6c 65 20 69  * (2) The file i
e480: 73 20 6e 6f 74 20 61 20 73 79 6d 62 6f 6c 69 63  s not a symbolic
e490: 20 6c 69 6e 6b 0a 2a 2a 20 28 33 29 20 54 68 65   link.** (3) The
e4a0: 20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 62 65   file has not be
e4b0: 65 6e 20 72 65 6e 61 6d 65 64 20 6f 72 20 75 6e  en renamed or un
e4c0: 6c 69 6e 6b 65 64 0a 2a 2a 0a 2a 2a 20 49 73 73  linked.**.** Iss
e4d0: 75 65 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53  ue sqlite3_log(S
e4e0: 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 2c 2e 2e  QLITE_WARNING,..
e4f0: 2e 29 20 6d 65 73 73 61 67 65 73 20 69 66 20 61  .) messages if a
e500: 6e 79 74 68 69 6e 67 20 69 73 20 6e 6f 74 20 72  nything is not r
e510: 69 67 68 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ight..*/.static 
e520: 76 6f 69 64 20 76 65 72 69 66 79 44 62 46 69 6c  void verifyDbFil
e530: 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c  e(unixFile *pFil
e540: 65 29 7b 0a 20 20 73 74 72 75 63 74 20 73 74 61  e){.  struct sta
e550: 74 20 62 75 66 3b 0a 20 20 69 6e 74 20 72 63 3b  t buf;.  int rc;
e560: 0a 0a 20 20 2f 2a 20 54 68 65 73 65 20 76 65 72  ..  /* These ver
e570: 69 66 69 63 61 74 69 6f 6e 73 20 6f 63 63 75 72  ifications occur
e580: 73 20 66 6f 72 20 74 68 65 20 6d 61 69 6e 20 64  s for the main d
e590: 61 74 61 62 61 73 65 20 6f 6e 6c 79 20 2a 2f 0a  atabase only */.
e5a0: 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 63 74 72    if( pFile->ctr
e5b0: 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c  lFlags & UNIXFIL
e5c0: 45 5f 4e 4f 4c 4f 43 4b 20 29 20 72 65 74 75 72  E_NOLOCK ) retur
e5d0: 6e 3b 0a 0a 20 20 72 63 20 3d 20 6f 73 46 73 74  n;..  rc = osFst
e5e0: 61 74 28 70 46 69 6c 65 2d 3e 68 2c 20 26 62 75  at(pFile->h, &bu
e5f0: 66 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 30 20  f);.  if( rc!=0 
e600: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c  ){.    sqlite3_l
e610: 6f 67 28 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e  og(SQLITE_WARNIN
e620: 47 2c 20 22 63 61 6e 6e 6f 74 20 66 73 74 61 74  G, "cannot fstat
e630: 20 64 62 20 66 69 6c 65 20 25 73 22 2c 20 70 46   db file %s", pF
e640: 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20  ile->zPath);.   
e650: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69   return;.  }.  i
e660: 66 28 20 62 75 66 2e 73 74 5f 6e 6c 69 6e 6b 3d  f( buf.st_nlink=
e670: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
e680: 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 57 41 52  3_log(SQLITE_WAR
e690: 4e 49 4e 47 2c 20 22 66 69 6c 65 20 75 6e 6c 69  NING, "file unli
e6a0: 6e 6b 65 64 20 77 68 69 6c 65 20 6f 70 65 6e 3a  nked while open:
e6b0: 20 25 73 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61   %s", pFile->zPa
e6c0: 74 68 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  th);.    return;
e6d0: 0a 20 20 7d 0a 20 20 69 66 28 20 62 75 66 2e 73  .  }.  if( buf.s
e6e0: 74 5f 6e 6c 69 6e 6b 3e 31 20 29 7b 0a 20 20 20  t_nlink>1 ){.   
e6f0: 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c   sqlite3_log(SQL
e700: 49 54 45 5f 57 41 52 4e 49 4e 47 2c 20 22 6d 75  ITE_WARNING, "mu
e710: 6c 74 69 70 6c 65 20 6c 69 6e 6b 73 20 74 6f 20  ltiple links to 
e720: 66 69 6c 65 3a 20 25 73 22 2c 20 70 46 69 6c 65  file: %s", pFile
e730: 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 72 65  ->zPath);.    re
e740: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20  turn;.  }.  if( 
e750: 66 69 6c 65 48 61 73 4d 6f 76 65 64 28 70 46 69  fileHasMoved(pFi
e760: 6c 65 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  le) ){.    sqlit
e770: 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 57 41  e3_log(SQLITE_WA
e780: 52 4e 49 4e 47 2c 20 22 66 69 6c 65 20 72 65 6e  RNING, "file ren
e790: 61 6d 65 64 20 77 68 69 6c 65 20 6f 70 65 6e 3a  amed while open:
e7a0: 20 25 73 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61   %s", pFile->zPa
e7b0: 74 68 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  th);.    return;
e7c0: 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  .  }.}.../*.** T
e7d0: 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63  his routine chec
e7e0: 6b 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61  ks if there is a
e7f0: 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68   RESERVED lock h
e800: 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69  eld on the speci
e810: 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20  fied.** file by 
e820: 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65  this or any othe
e830: 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75  r process. If su
e840: 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c  ch a lock is hel
e850: 64 2c 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a  d, set *pResOut.
e860: 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f  ** to a non-zero
e870: 20 76 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65   value otherwise
e880: 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65 74   *pResOut is set
e890: 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72   to zero.  The r
e8a0: 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69  eturn value.** i
e8b0: 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f  s set to SQLITE_
e8c0: 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f  OK unless an I/O
e8d0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75   error occurs du
e8e0: 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69  ring lock checki
e8f0: 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
e900: 74 20 75 6e 69 78 43 68 65 63 6b 52 65 73 65 72  t unixCheckReser
e910: 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  vedLock(sqlite3_
e920: 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70  file *id, int *p
e930: 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e 74 20 72  ResOut){.  int r
e940: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
e950: 20 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d 20   int reserved = 
e960: 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  0;.  unixFile *p
e970: 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
e980: 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61 74  *)id;..  Simulat
e990: 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e  eIOError( return
e9a0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48   SQLITE_IOERR_CH
e9b0: 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b  ECKRESERVEDLOCK;
e9c0: 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   );..  assert( p
e9d0: 46 69 6c 65 20 29 3b 0a 20 20 61 73 73 65 72 74  File );.  assert
e9e0: 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  ( pFile->eFileLo
e9f0: 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck<=SHARED_LOCK 
ea00: 29 3b 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75  );.  unixEnterMu
ea10: 74 65 78 28 29 3b 20 2f 2a 20 42 65 63 61 75 73  tex(); /* Becaus
ea20: 65 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20  e pFile->pInode 
ea30: 69 73 20 73 68 61 72 65 64 20 61 63 72 6f 73 73  is shared across
ea40: 20 74 68 72 65 61 64 73 20 2a 2f 0a 0a 20 20 2f   threads */..  /
ea50: 2a 20 43 68 65 63 6b 20 69 66 20 61 20 74 68 72  * Check if a thr
ea60: 65 61 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63  ead in this proc
ea70: 65 73 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61  ess holds such a
ea80: 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70   lock */.  if( p
ea90: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65 46  File->pInode->eF
eaa0: 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c  ileLock>SHARED_L
eab0: 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 73 65 72  OCK ){.    reser
eac0: 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20  ved = 1;.  }..  
ead0: 2f 2a 20 4f 74 68 65 72 77 69 73 65 20 73 65 65  /* Otherwise see
eae0: 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 70   if some other p
eaf0: 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 69 74 2e  rocess holds it.
eb00: 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 5f 5f  .  */.#ifndef __
eb10: 44 4a 47 50 50 5f 5f 0a 20 20 69 66 28 20 21 72  DJGPP__.  if( !r
eb20: 65 73 65 72 76 65 64 20 26 26 20 21 70 46 69 6c  eserved && !pFil
eb30: 65 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63  e->pInode->bProc
eb40: 65 73 73 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 73  essLock ){.    s
eb50: 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b  truct flock lock
eb60: 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65  ;.    lock.l_whe
eb70: 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a  nce = SEEK_SET;.
eb80: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74      lock.l_start
eb90: 20 3d 20 52 45 53 45 52 56 45 44 5f 42 59 54 45   = RESERVED_BYTE
eba0: 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e  ;.    lock.l_len
ebb0: 20 3d 20 31 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c   = 1;.    lock.l
ebc0: 5f 74 79 70 65 20 3d 20 46 5f 57 52 4c 43 4b 3b  _type = F_WRLCK;
ebd0: 0a 20 20 20 20 69 66 28 20 6f 73 46 63 6e 74 6c  .    if( osFcntl
ebe0: 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 47 45 54  (pFile->h, F_GET
ebf0: 4c 4b 2c 20 26 6c 6f 63 6b 29 20 29 7b 0a 23 69  LK, &lock) ){.#i
ec00: 66 20 4f 53 4c 4f 43 4b 49 4e 47 5f 43 48 45 43  f OSLOCKING_CHEC
ec10: 4b 5f 42 55 53 59 5f 49 4f 45 52 52 0a 20 20 20  K_BUSY_IOERR.   
ec20: 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20     int tErrno = 
ec30: 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20  errno;.      rc 
ec40: 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  = sqliteErrorFro
ec50: 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72  mPosixError(tErr
ec60: 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  no, SQLITE_IOERR
ec70: 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f  _CHECKRESERVEDLO
ec80: 43 4b 29 3b 0a 20 20 20 20 20 20 73 74 6f 72 65  CK);.      store
ec90: 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c  LastErrno(pFile,
eca0: 20 74 45 72 72 6e 6f 29 3b 0a 23 65 6c 73 65 0a   tErrno);.#else.
ecb0: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
ecc0: 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53  E_IOERR_CHECKRES
ecd0: 45 52 56 45 44 4c 4f 43 4b 3b 0a 20 20 20 20 20  ERVEDLOCK;.     
ece0: 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28   storeLastErrno(
ecf0: 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 23  pFile, errno);.#
ed00: 65 6e 64 69 66 0a 20 20 20 20 7d 20 65 6c 73 65  endif.    } else
ed10: 20 69 66 28 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65   if( lock.l_type
ed20: 21 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20  !=F_UNLCK ){.   
ed30: 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b     reserved = 1;
ed40: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
ed50: 66 0a 20 20 0a 20 20 75 6e 69 78 4c 65 61 76 65  f.  .  unixLeave
ed60: 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53 54 52 41  Mutex();.  OSTRA
ed70: 43 45 28 28 22 54 45 53 54 20 57 52 2d 4c 4f 43  CE(("TEST WR-LOC
ed80: 4b 20 25 64 20 25 64 20 25 64 20 28 75 6e 69 78  K %d %d %d (unix
ed90: 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
eda0: 72 63 2c 20 72 65 73 65 72 76 65 64 29 29 3b 0a  rc, reserved));.
edb0: 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65  .  *pResOut = re
edc0: 73 65 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e  served;.  return
edd0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74   rc;.}../*.** At
ede0: 74 65 6d 70 74 20 74 6f 20 73 65 74 20 61 20 73  tempt to set a s
edf0: 79 73 74 65 6d 2d 6c 6f 63 6b 20 6f 6e 20 74 68  ystem-lock on th
ee00: 65 20 66 69 6c 65 20 70 46 69 6c 65 2e 20 20 54  e file pFile.  T
ee10: 68 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20 64  he lock is .** d
ee20: 65 73 63 72 69 62 65 64 20 62 79 20 70 4c 6f 63  escribed by pLoc
ee30: 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  k..**.** If the 
ee40: 70 46 69 6c 65 20 77 61 73 20 6f 70 65 6e 65 64  pFile was opened
ee50: 20 72 65 61 64 2f 77 72 69 74 65 20 66 72 6f 6d   read/write from
ee60: 20 75 6e 69 78 2d 65 78 63 6c 2c 20 74 68 65 6e   unix-excl, then
ee70: 20 74 68 65 20 6f 6e 6c 79 20 6c 6f 63 6b 0a 2a   the only lock.*
ee80: 2a 20 65 76 65 72 20 6f 62 74 61 69 6e 65 64 20  * ever obtained 
ee90: 69 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  is an exclusive 
eea0: 6c 6f 63 6b 2c 20 61 6e 64 20 69 74 20 69 73 20  lock, and it is 
eeb0: 6f 62 74 61 69 6e 65 64 20 65 78 61 63 74 6c 79  obtained exactly
eec0: 20 6f 6e 63 65 0a 2a 2a 20 74 68 65 20 66 69 72   once.** the fir
eed0: 73 74 20 74 69 6d 65 20 61 6e 79 20 6c 6f 63 6b  st time any lock
eee0: 20 69 73 20 61 74 74 65 6d 70 74 65 64 2e 20 20   is attempted.  
eef0: 41 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 20 73  All subsequent s
ef00: 79 73 74 65 6d 20 6c 6f 63 6b 69 6e 67 0a 2a 2a  ystem locking.**
ef10: 20 6f 70 65 72 61 74 69 6f 6e 73 20 62 65 63 6f   operations beco
ef20: 6d 65 20 6e 6f 2d 6f 70 73 2e 20 20 4c 6f 63 6b  me no-ops.  Lock
ef30: 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73 20 73  ing operations s
ef40: 74 69 6c 6c 20 68 61 70 70 65 6e 20 69 6e 74 65  till happen inte
ef50: 72 6e 61 6c 6c 79 2c 0a 2a 2a 20 69 6e 20 6f 72  rnally,.** in or
ef60: 64 65 72 20 74 6f 20 63 6f 6f 72 64 69 6e 61 74  der to coordinat
ef70: 65 20 61 63 63 65 73 73 20 62 65 74 77 65 65 6e  e access between
ef80: 20 73 65 70 61 72 61 74 65 20 64 61 74 61 62 61   separate databa
ef90: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 0a 2a  se connections.*
efa0: 2a 20 77 69 74 68 69 6e 20 74 68 69 73 20 70 72  * within this pr
efb0: 6f 63 65 73 73 2c 20 62 75 74 20 61 6c 6c 20 6f  ocess, but all o
efc0: 66 20 74 68 61 74 20 69 73 20 68 61 6e 64 6c 65  f that is handle
efd0: 64 20 69 6e 20 6d 65 6d 6f 72 79 20 61 6e 64 20  d in memory and 
efe0: 74 68 65 0a 2a 2a 20 6f 70 65 72 61 74 69 6e 67  the.** operating
eff0: 20 73 79 73 74 65 6d 20 64 6f 65 73 20 6e 6f 74   system does not
f000: 20 70 61 72 74 69 63 69 70 61 74 65 2e 0a 2a 2a   participate..**
f010: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
f020: 6e 20 69 73 20 61 20 70 61 73 73 2d 74 68 72 6f  n is a pass-thro
f030: 75 67 68 20 74 6f 20 66 63 6e 74 6c 28 46 5f 53  ugh to fcntl(F_S
f040: 45 54 4c 4b 29 20 69 66 20 70 46 69 6c 65 20 69  ETLK) if pFile i
f050: 73 20 75 73 69 6e 67 0a 2a 2a 20 61 6e 79 20 56  s using.** any V
f060: 46 53 20 6f 74 68 65 72 20 74 68 61 6e 20 22 75  FS other than "u
f070: 6e 69 78 2d 65 78 63 6c 22 20 6f 72 20 69 66 20  nix-excl" or if 
f080: 70 46 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20  pFile is opened 
f090: 6f 6e 20 22 75 6e 69 78 2d 65 78 63 6c 22 0a 2a  on "unix-excl".*
f0a0: 2a 20 61 6e 64 20 69 73 20 72 65 61 64 2d 6f 6e  * and is read-on
f0b0: 6c 79 2e 0a 2a 2a 0a 2a 2a 20 5a 65 72 6f 20 69  ly..**.** Zero i
f0c0: 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68  s returned if th
f0d0: 65 20 63 61 6c 6c 20 63 6f 6d 70 6c 65 74 65 73  e call completes
f0e0: 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 6f   successfully, o
f0f0: 72 20 2d 31 20 69 66 20 61 20 63 61 6c 6c 0a 2a  r -1 if a call.*
f100: 2a 20 74 6f 20 66 63 6e 74 6c 28 29 20 66 61 69  * to fcntl() fai
f110: 6c 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ls. In this case
f120: 2c 20 65 72 72 6e 6f 20 69 73 20 73 65 74 20 61  , errno is set a
f130: 70 70 72 6f 70 72 69 61 74 65 6c 79 20 28 62 79  ppropriately (by
f140: 20 66 63 6e 74 6c 28 29 29 2e 0a 2a 2f 0a 73 74   fcntl())..*/.st
f150: 61 74 69 63 20 69 6e 74 20 75 6e 69 78 46 69 6c  atic int unixFil
f160: 65 4c 6f 63 6b 28 75 6e 69 78 46 69 6c 65 20 2a  eLock(unixFile *
f170: 70 46 69 6c 65 2c 20 73 74 72 75 63 74 20 66 6c  pFile, struct fl
f180: 6f 63 6b 20 2a 70 4c 6f 63 6b 2c 20 69 6e 74 20  ock *pLock, int 
f190: 6e 52 65 74 72 79 29 7b 0a 20 20 69 6e 74 20 72  nRetry){.  int r
f1a0: 63 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e  c;.  unixInodeIn
f1b0: 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69  fo *pInode = pFi
f1c0: 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 73  le->pInode;.  as
f1d0: 73 65 72 74 28 20 75 6e 69 78 4d 75 74 65 78 48  sert( unixMutexH
f1e0: 65 6c 64 28 29 20 29 3b 0a 20 20 61 73 73 65 72  eld() );.  asser
f1f0: 74 28 20 70 49 6e 6f 64 65 21 3d 30 20 29 3b 0a  t( pInode!=0 );.
f200: 20 20 69 66 28 20 28 70 46 69 6c 65 2d 3e 63 74    if( (pFile->ct
f210: 72 6c 46 6c 61 67 73 20 26 20 28 55 4e 49 58 46  rlFlags & (UNIXF
f220: 49 4c 45 5f 45 58 43 4c 7c 55 4e 49 58 46 49 4c  ILE_EXCL|UNIXFIL
f230: 45 5f 52 44 4f 4e 4c 59 29 29 3d 3d 55 4e 49 58  E_RDONLY))==UNIX
f240: 46 49 4c 45 5f 45 58 43 4c 20 29 7b 0a 20 20 20  FILE_EXCL ){.   
f250: 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 62 50 72   if( pInode->bPr
f260: 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 7b 0a  ocessLock==0 ){.
f270: 20 20 20 20 20 20 73 74 72 75 63 74 20 66 6c 6f        struct flo
f280: 63 6b 20 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 61  ck lock;.      a
f290: 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e  ssert( pInode->n
f2a0: 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Lock==0 );.     
f2b0: 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d   lock.l_whence =
f2c0: 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 20   SEEK_SET;.     
f2d0: 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20   lock.l_start = 
f2e0: 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20  SHARED_FIRST;.  
f2f0: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d      lock.l_len =
f300: 20 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20   SHARED_SIZE;.  
f310: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20      lock.l_type 
f320: 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20 20 20 20 20  = F_WRLCK;.     
f330: 20 72 63 20 3d 20 6f 73 46 63 6e 74 6c 28 70 46   rc = osFcntl(pF
f340: 69 6c 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c  ile->h, F_SETLK,
f350: 20 26 6c 6f 63 6b 29 3b 0a 20 20 20 20 20 20 69   &lock);.      i
f360: 66 28 20 72 63 3c 30 20 29 20 72 65 74 75 72 6e  f( rc<0 ) return
f370: 20 72 63 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64   rc;.      pInod
f380: 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 20  e->bProcessLock 
f390: 3d 20 31 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64  = 1;.      pInod
f3a0: 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20  e->nLock++;.    
f3b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
f3c0: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  = 0;.    }.  }el
f3d0: 73 65 7b 0a 20 20 20 20 69 6e 74 20 69 20 3d 20  se{.    int i = 
f3e0: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
f3f0: 20 20 20 20 20 20 20 20 0a 20 20 20 20 66 6f 72          .    for
f400: 28 3b 3b 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  (;;){.      rc =
f410: 20 6f 73 46 63 6e 74 6c 28 70 46 69 6c 65 2d 3e   osFcntl(pFile->
f420: 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 70 4c 6f 63  h, F_SETLK, pLoc
f430: 6b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  k);.      if( rc
f440: 20 26 26 20 6e 52 65 74 72 79 2d 2d 20 29 7b 0a   && nRetry-- ){.
f450: 20 20 20 20 20 20 20 20 75 73 6c 65 65 70 28 31          usleep(1
f460: 30 30 20 2a 20 28 2b 2b 69 29 29 3b 0a 20 20 20  00 * (++i));.   
f470: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
f480: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
f490: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
f4a0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
f4b0: 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77   Lock the file w
f4c0: 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65  ith the lock spe
f4d0: 63 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65  cified by parame
f4e0: 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20  ter eFileLock - 
f4f0: 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f  one.** of the fo
f500: 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
f510: 20 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f     (1) SHARED_LO
f520: 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45  CK.**     (2) RE
f530: 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20  SERVED_LOCK.**  
f540: 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c     (3) PENDING_L
f550: 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45  OCK.**     (4) E
f560: 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a  XCLUSIVE_LOCK.**
f570: 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68  .** Sometimes wh
f580: 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e  en requesting on
f590: 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64  e lock state, ad
f5a0: 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74  ditional lock st
f5b0: 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65  ates.** are inse
f5c0: 72 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e  rted in between.
f5d0: 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69    The locking mi
f5e0: 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20  ght fail on one 
f5f0: 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20  of the later.** 
f600: 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76  transitions leav
f610: 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61  ing the lock sta
f620: 74 65 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f  te different fro
f630: 6d 20 77 68 61 74 20 69 74 20 73 74 61 72 74 65  m what it starte
f640: 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73  d but.** still s
f650: 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c  hort of its goal
f660: 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .  The following
f670: 20 63 68 61 72 74 20 73 68 6f 77 73 20 74 68 65   chart shows the
f680: 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e   allowed.** tran
f690: 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20  sitions and the 
f6a0: 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65  inserted interme
f6b0: 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a  diate states:.**
f6c0: 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20  .**    UNLOCKED 
f6d0: 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20  -> SHARED.**    
f6e0: 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56  SHARED -> RESERV
f6f0: 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20  ED.**    SHARED 
f700: 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20  -> (PENDING) -> 
f710: 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20  EXCLUSIVE.**    
f720: 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e  RESERVED -> (PEN
f730: 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49  DING) -> EXCLUSI
f740: 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47  VE.**    PENDING
f750: 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
f760: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
f770: 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65   will only incre
f780: 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65  ase a lock.  Use
f790: 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e   the sqlite3OsUn
f7a0: 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e  lock().** routin
f7b0: 65 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63  e to lower a loc
f7c0: 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73  king level..*/.s
f7d0: 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4c 6f  tatic int unixLo
f7e0: 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
f7f0: 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f  *id, int eFileLo
f800: 63 6b 29 7b 0a 20 20 2f 2a 20 54 68 65 20 66 6f  ck){.  /* The fo
f810: 6c 6c 6f 77 69 6e 67 20 64 65 73 63 72 69 62 65  llowing describe
f820: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
f830: 74 69 6f 6e 20 6f 66 20 74 68 65 20 76 61 72 69  tion of the vari
f840: 6f 75 73 20 6c 6f 63 6b 73 20 61 6e 64 0a 20 20  ous locks and.  
f850: 2a 2a 20 6c 6f 63 6b 20 74 72 61 6e 73 69 74 69  ** lock transiti
f860: 6f 6e 73 20 69 6e 20 74 65 72 6d 73 20 6f 66 20  ons in terms of 
f870: 74 68 65 20 50 4f 53 49 58 20 61 64 76 69 73 6f  the POSIX adviso
f880: 72 79 20 73 68 61 72 65 64 20 61 6e 64 20 65 78  ry shared and ex
f890: 63 6c 75 73 69 76 65 0a 20 20 2a 2a 20 6c 6f 63  clusive.  ** loc
f8a0: 6b 20 70 72 69 6d 69 74 69 76 65 73 20 28 63 61  k primitives (ca
f8b0: 6c 6c 65 64 20 72 65 61 64 2d 6c 6f 63 6b 73 20  lled read-locks 
f8c0: 61 6e 64 20 77 72 69 74 65 2d 6c 6f 63 6b 73 20  and write-locks 
f8d0: 62 65 6c 6f 77 2c 20 74 6f 20 61 76 6f 69 64 0a  below, to avoid.
f8e0: 20 20 2a 2a 20 63 6f 6e 66 75 73 69 6f 6e 20 77    ** confusion w
f8f0: 69 74 68 20 53 51 4c 69 74 65 20 6c 6f 63 6b 20  ith SQLite lock 
f900: 6e 61 6d 65 73 29 2e 20 54 68 65 20 61 6c 67 6f  names). The algo
f910: 72 69 74 68 6d 73 20 61 72 65 20 63 6f 6d 70 6c  rithms are compl
f920: 69 63 61 74 65 64 0a 20 20 2a 2a 20 73 6c 69 67  icated.  ** slig
f930: 68 74 6c 79 20 69 6e 20 6f 72 64 65 72 20 74 6f  htly in order to
f940: 20 62 65 20 63 6f 6d 70 61 74 69 62 6c 65 20 77   be compatible w
f950: 69 74 68 20 57 69 6e 64 6f 77 73 39 35 20 73 79  ith Windows95 sy
f960: 73 74 65 6d 73 20 73 69 6d 75 6c 74 61 6e 65 6f  stems simultaneo
f970: 75 73 6c 79 0a 20 20 2a 2a 20 61 63 63 65 73 73  usly.  ** access
f980: 69 6e 67 20 74 68 65 20 73 61 6d 65 20 64 61 74  ing the same dat
f990: 61 62 61 73 65 20 66 69 6c 65 2c 20 69 6e 20 63  abase file, in c
f9a0: 61 73 65 20 74 68 61 74 20 69 73 20 65 76 65 72  ase that is ever
f9b0: 20 72 65 71 75 69 72 65 64 2e 0a 20 20 2a 2a 0a   required..  **.
f9c0: 20 20 2a 2a 20 53 79 6d 62 6f 6c 73 20 64 65 66    ** Symbols def
f9d0: 69 6e 65 64 20 69 6e 20 6f 73 2e 68 20 69 6e 64  ined in os.h ind
f9e0: 65 6e 74 69 66 79 20 74 68 65 20 27 70 65 6e 64  entify the 'pend
f9f0: 69 6e 67 20 62 79 74 65 27 20 61 6e 64 20 74 68  ing byte' and th
fa00: 65 20 27 72 65 73 65 72 76 65 64 0a 20 20 2a 2a  e 'reserved.  **
fa10: 20 62 79 74 65 27 2c 20 65 61 63 68 20 73 69 6e   byte', each sin
fa20: 67 6c 65 20 62 79 74 65 73 20 61 74 20 77 65 6c  gle bytes at wel
fa30: 6c 20 6b 6e 6f 77 6e 20 6f 66 66 73 65 74 73 2c  l known offsets,
fa40: 20 61 6e 64 20 74 68 65 20 27 73 68 61 72 65 64   and the 'shared
fa50: 20 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65   byte.  ** range
fa60: 27 2c 20 61 20 72 61 6e 67 65 20 6f 66 20 35 31  ', a range of 51
fa70: 30 20 62 79 74 65 73 20 61 74 20 61 20 77 65 6c  0 bytes at a wel
fa80: 6c 20 6b 6e 6f 77 6e 20 6f 66 66 73 65 74 2e 0a  l known offset..
fa90: 20 20 2a 2a 0a 20 20 2a 2a 20 54 6f 20 6f 62 74    **.  ** To obt
faa0: 61 69 6e 20 61 20 53 48 41 52 45 44 20 6c 6f 63  ain a SHARED loc
fab0: 6b 2c 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69  k, a read-lock i
fac0: 73 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68  s obtained on th
fad0: 65 20 27 70 65 6e 64 69 6e 67 0a 20 20 2a 2a 20  e 'pending.  ** 
fae0: 62 79 74 65 27 2e 20 20 49 66 20 74 68 69 73 20  byte'.  If this 
faf0: 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 27  is successful, '
fb00: 73 68 61 72 65 64 20 62 79 74 65 20 72 61 6e 67  shared byte rang
fb10: 65 27 20 69 73 20 72 65 61 64 2d 6c 6f 63 6b 65  e' is read-locke
fb20: 64 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 6c  d.  ** and the l
fb30: 6f 63 6b 20 6f 6e 20 74 68 65 20 27 70 65 6e 64  ock on the 'pend
fb40: 69 6e 67 20 62 79 74 65 27 20 72 65 6c 65 61 73  ing byte' releas
fb50: 65 64 2e 20 20 28 4c 65 67 61 63 79 20 6e 6f 74  ed.  (Legacy not
fb60: 65 3a 20 20 57 68 65 6e 0a 20 20 2a 2a 20 53 51  e:  When.  ** SQ
fb70: 4c 69 74 65 20 77 61 73 20 66 69 72 73 74 20 64  Lite was first d
fb80: 65 76 65 6c 6f 70 65 64 2c 20 57 69 6e 64 6f 77  eveloped, Window
fb90: 73 39 35 20 73 79 73 74 65 6d 73 20 77 65 72 65  s95 systems were
fba0: 20 73 74 69 6c 6c 20 76 65 72 79 20 63 6f 6d 6d   still very comm
fbb0: 6f 6e 2c 0a 20 20 2a 2a 20 61 6e 64 20 57 69 64  on,.  ** and Wid
fbc0: 6e 6f 77 73 39 35 20 6c 61 63 6b 73 20 61 20 73  nows95 lacks a s
fbd0: 68 61 72 65 64 2d 6c 6f 63 6b 20 63 61 70 61 62  hared-lock capab
fbe0: 69 6c 69 74 79 2e 20 20 53 6f 20 6f 6e 20 57 69  ility.  So on Wi
fbf0: 6e 64 6f 77 73 39 35 2c 20 61 0a 20 20 2a 2a 20  ndows95, a.  ** 
fc00: 73 69 6e 67 6c 65 20 72 61 6e 64 6f 6d 6c 79 20  single randomly 
fc10: 73 65 6c 65 63 74 65 64 20 62 79 20 66 72 6f 6d  selected by from
fc20: 20 74 68 65 20 27 73 68 61 72 65 64 20 62 79 74   the 'shared byt
fc30: 65 20 72 61 6e 67 65 27 20 69 73 20 6c 6f 63 6b  e range' is lock
fc40: 65 64 2e 0a 20 20 2a 2a 20 57 69 6e 64 6f 77 73  ed..  ** Windows
fc50: 39 35 20 69 73 20 6e 6f 77 20 70 72 65 74 74 79  95 is now pretty
fc60: 20 6d 75 63 68 20 65 78 74 69 6e 63 74 2c 20 62   much extinct, b
fc70: 75 74 20 74 68 69 73 20 77 6f 72 6b 2d 61 72 6f  ut this work-aro
fc80: 75 6e 64 20 66 6f 72 20 74 68 65 0a 20 20 2a 2a  und for the.  **
fc90: 20 6c 61 63 6b 20 6f 66 20 73 68 61 72 65 64 2d   lack of shared-
fca0: 6c 6f 63 6b 73 20 6f 6e 20 57 69 6e 64 6f 77 73  locks on Windows
fcb0: 39 35 20 6c 69 76 65 73 20 6f 6e 2c 20 66 6f 72  95 lives on, for
fcc0: 20 62 61 63 6b 77 61 72 64 73 0a 20 20 2a 2a 20   backwards.  ** 
fcd0: 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 2e 29 0a  compatibility.).
fce0: 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 70 72 6f 63    **.  ** A proc
fcf0: 65 73 73 20 6d 61 79 20 6f 6e 6c 79 20 6f 62 74  ess may only obt
fd00: 61 69 6e 20 61 20 52 45 53 45 52 56 45 44 20 6c  ain a RESERVED l
fd10: 6f 63 6b 20 61 66 74 65 72 20 69 74 20 68 61 73  ock after it has
fd20: 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2e 0a   a SHARED lock..
fd30: 20 20 2a 2a 20 41 20 52 45 53 45 52 56 45 44 20    ** A RESERVED 
fd40: 6c 6f 63 6b 20 69 73 20 69 6d 70 6c 65 6d 65 6e  lock is implemen
fd50: 74 65 64 20 62 79 20 67 72 61 62 62 69 6e 67 20  ted by grabbing 
fd60: 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20  a write-lock on 
fd70: 74 68 65 0a 20 20 2a 2a 20 27 72 65 73 65 72 76  the.  ** 'reserv
fd80: 65 64 20 62 79 74 65 27 2e 20 0a 20 20 2a 2a 0a  ed byte'. .  **.
fd90: 20 20 2a 2a 20 41 20 70 72 6f 63 65 73 73 20 6d    ** A process m
fda0: 61 79 20 6f 6e 6c 79 20 6f 62 74 61 69 6e 20 61  ay only obtain a
fdb0: 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 61 66   PENDING lock af
fdc0: 74 65 72 20 69 74 20 68 61 73 20 6f 62 74 61 69  ter it has obtai
fdd0: 6e 65 64 20 61 0a 20 20 2a 2a 20 53 48 41 52 45  ned a.  ** SHARE
fde0: 44 20 6c 6f 63 6b 2e 20 41 20 50 45 4e 44 49 4e  D lock. A PENDIN
fdf0: 47 20 6c 6f 63 6b 20 69 73 20 69 6d 70 6c 65 6d  G lock is implem
fe00: 65 6e 74 65 64 20 62 79 20 6f 62 74 61 69 6e 69  ented by obtaini
fe10: 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 0a  ng a write-lock.
fe20: 20 20 2a 2a 20 6f 6e 20 74 68 65 20 27 70 65 6e    ** on the 'pen
fe30: 64 69 6e 67 20 62 79 74 65 27 2e 20 54 68 69 73  ding byte'. This
fe40: 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 6e 6f   ensures that no
fe50: 20 6e 65 77 20 53 48 41 52 45 44 20 6c 6f 63 6b   new SHARED lock
fe60: 73 20 63 61 6e 20 62 65 0a 20 20 2a 2a 20 6f 62  s can be.  ** ob
fe70: 74 61 69 6e 65 64 2c 20 62 75 74 20 65 78 69 73  tained, but exis
fe80: 74 69 6e 67 20 53 48 41 52 45 44 20 6c 6f 63 6b  ting SHARED lock
fe90: 73 20 61 72 65 20 61 6c 6c 6f 77 65 64 20 74 6f  s are allowed to
fea0: 20 70 65 72 73 69 73 74 2e 20 41 20 70 72 6f 63   persist. A proc
feb0: 65 73 73 0a 20 20 2a 2a 20 64 6f 65 73 20 6e 6f  ess.  ** does no
fec0: 74 20 68 61 76 65 20 74 6f 20 6f 62 74 61 69 6e  t have to obtain
fed0: 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
fee0: 20 6f 6e 20 74 68 65 20 77 61 79 20 74 6f 20 61   on the way to a
fef0: 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 2e 0a 20   PENDING lock.. 
ff00: 20 2a 2a 20 54 68 69 73 20 70 72 6f 70 65 72 74   ** This propert
ff10: 79 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65  y is used by the
ff20: 20 61 6c 67 6f 72 69 74 68 6d 20 66 6f 72 20 72   algorithm for r
ff30: 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 6a 6f  olling back a jo
ff40: 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20 2a 2a 20  urnal file.  ** 
ff50: 61 66 74 65 72 20 61 20 63 72 61 73 68 2e 0a 20  after a crash.. 
ff60: 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 45 58 43 4c   **.  ** An EXCL
ff70: 55 53 49 56 45 20 6c 6f 63 6b 2c 20 6f 62 74 61  USIVE lock, obta
ff80: 69 6e 65 64 20 61 66 74 65 72 20 61 20 50 45 4e  ined after a PEN
ff90: 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 68 65 6c  DING lock is hel
ffa0: 64 2c 20 69 73 0a 20 20 2a 2a 20 69 6d 70 6c 65  d, is.  ** imple
ffb0: 6d 65 6e 74 65 64 20 62 79 20 6f 62 74 61 69 6e  mented by obtain
ffc0: 69 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b  ing a write-lock
ffd0: 20 6f 6e 20 74 68 65 20 65 6e 74 69 72 65 20 27   on the entire '
ffe0: 73 68 61 72 65 64 20 62 79 74 65 0a 20 20 2a 2a  shared byte.  **
fff0: 20 72 61 6e 67 65 27 2e 20 53 69 6e 63 65 20 61   range'. Since a
10000 6c 6c 20 6f 74 68 65 72 20 6c 6f 63 6b 73 20 72  ll other locks r
10010 65 71 75 69 72 65 20 61 20 72 65 61 64 2d 6c 6f  equire a read-lo
10020 63 6b 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65  ck on one of the
10030 20 62 79 74 65 73 0a 20 20 2a 2a 20 77 69 74 68   bytes.  ** with
10040 69 6e 20 74 68 69 73 20 72 61 6e 67 65 2c 20 74  in this range, t
10050 68 69 73 20 65 6e 73 75 72 65 73 20 74 68 61 74  his ensures that
10060 20 6e 6f 20 6f 74 68 65 72 20 6c 6f 63 6b 73 20   no other locks 
10070 61 72 65 20 68 65 6c 64 20 6f 6e 20 74 68 65 0a  are held on the.
10080 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 0a    ** database. .
10090 20 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20    */.  int rc = 
100a0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69  SQLITE_OK;.  uni
100b0 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
100c0 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
100d0 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70  unixInodeInfo *p
100e0 49 6e 6f 64 65 3b 0a 20 20 73 74 72 75 63 74 20  Inode;.  struct 
100f0 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 69 6e  flock lock;.  in
10100 74 20 74 45 72 72 6e 6f 20 3d 20 30 3b 0a 0a 20  t tErrno = 0;.. 
10110 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
10120 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f  ;.  OSTRACE(("LO
10130 43 4b 20 20 20 20 25 64 20 25 73 20 77 61 73 20  CK    %d %s was 
10140 25 73 28 25 73 2c 25 64 29 20 70 69 64 3d 25 64  %s(%s,%d) pid=%d
10150 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c   (unix)\n", pFil
10160 65 2d 3e 68 2c 0a 20 20 20 20 20 20 61 7a 46 69  e->h,.      azFi
10170 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b  leLock(eFileLock
10180 29 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 70 46  ), azFileLock(pF
10190 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c  ile->eFileLock),
101a0 0a 20 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63  .      azFileLoc
101b0 6b 28 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d  k(pFile->pInode-
101c0 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 70 46 69  >eFileLock), pFi
101d0 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 53 68 61  le->pInode->nSha
101e0 72 65 64 2c 0a 20 20 20 20 20 20 6f 73 47 65 74  red,.      osGet
101f0 70 69 64 28 30 29 29 29 3b 0a 0a 20 20 2f 2a 20  pid(0)));..  /* 
10200 49 66 20 74 68 65 72 65 20 69 73 20 61 6c 72 65  If there is alre
10210 61 64 79 20 61 20 6c 6f 63 6b 20 6f 66 20 74 68  ady a lock of th
10220 69 73 20 74 79 70 65 20 6f 72 20 6d 6f 72 65 20  is type or more 
10230 72 65 73 74 72 69 63 74 69 76 65 20 6f 6e 20 74  restrictive on t
10240 68 65 0a 20 20 2a 2a 20 75 6e 69 78 46 69 6c 65  he.  ** unixFile
10250 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 44 6f  , do nothing. Do
10260 6e 27 74 20 75 73 65 20 74 68 65 20 65 6e 64 5f  n't use the end_
10270 6c 6f 63 6b 3a 20 65 78 69 74 20 70 61 74 68 2c  lock: exit path,
10280 20 61 73 0a 20 20 2a 2a 20 75 6e 69 78 45 6e 74   as.  ** unixEnt
10290 65 72 4d 75 74 65 78 28 29 20 68 61 73 6e 27 74  erMutex() hasn't
102a0 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 79 65 74   been called yet
102b0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ..  */.  if( pFi
102c0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 65  le->eFileLock>=e
102d0 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  FileLock ){.    
102e0 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20  OSTRACE(("LOCK  
102f0 20 20 25 64 20 25 73 20 6f 6b 20 28 61 6c 72 65    %d %s ok (alre
10300 61 64 79 20 68 65 6c 64 29 20 28 75 6e 69 78 29  ady held) (unix)
10310 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20  \n", pFile->h,. 
10320 20 20 20 20 20 20 20 20 20 20 20 61 7a 46 69 6c             azFil
10330 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29  eLock(eFileLock)
10340 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ));.    return S
10350 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
10360 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68   /* Make sure th
10370 65 20 6c 6f 63 6b 69 6e 67 20 73 65 71 75 65 6e  e locking sequen
10380 63 65 20 69 73 20 63 6f 72 72 65 63 74 2e 0a 20  ce is correct.. 
10390 20 2a 2a 20 20 28 31 29 20 57 65 20 6e 65 76 65   **  (1) We neve
103a0 72 20 6d 6f 76 65 20 66 72 6f 6d 20 75 6e 6c 6f  r move from unlo
103b0 63 6b 65 64 20 74 6f 20 61 6e 79 74 68 69 6e 67  cked to anything
103c0 20 68 69 67 68 65 72 20 74 68 61 6e 20 73 68 61   higher than sha
103d0 72 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20  red lock..  **  
103e0 28 32 29 20 53 51 4c 69 74 65 20 6e 65 76 65 72  (2) SQLite never
103f0 20 65 78 70 6c 69 63 69 74 6c 79 20 72 65 71 75   explicitly requ
10400 65 73 74 73 20 61 20 70 65 6e 64 69 67 20 6c 6f  ests a pendig lo
10410 63 6b 2e 0a 20 20 2a 2a 20 20 28 33 29 20 41 20  ck..  **  (3) A 
10420 73 68 61 72 65 64 20 6c 6f 63 6b 20 69 73 20 61  shared lock is a
10430 6c 77 61 79 73 20 68 65 6c 64 20 77 68 65 6e 20  lways held when 
10440 61 20 72 65 73 65 72 76 65 20 6c 6f 63 6b 20 69  a reserve lock i
10450 73 20 72 65 71 75 65 73 74 65 64 2e 0a 20 20 2a  s requested..  *
10460 2f 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  /.  assert( pFil
10470 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 4e 4f  e->eFileLock!=NO
10480 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f  _LOCK || eFileLo
10490 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
104a0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46 69  );.  assert( eFi
104b0 6c 65 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e 47 5f  leLock!=PENDING_
104c0 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  LOCK );.  assert
104d0 28 20 65 46 69 6c 65 4c 6f 63 6b 21 3d 52 45 53  ( eFileLock!=RES
104e0 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46  ERVED_LOCK || pF
104f0 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d  ile->eFileLock==
10500 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 0a  SHARED_LOCK );..
10510 20 20 2f 2a 20 54 68 69 73 20 6d 75 74 65 78 20    /* This mutex 
10520 69 73 20 6e 65 65 64 65 64 20 62 65 63 61 75 73  is needed becaus
10530 65 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20  e pFile->pInode 
10540 69 73 20 73 68 61 72 65 64 20 61 63 72 6f 73 73  is shared across
10550 20 74 68 72 65 61 64 73 0a 20 20 2a 2f 0a 20 20   threads.  */.  
10560 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
10570 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70 46 69  ;.  pInode = pFi
10580 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 0a 20 20 2f  le->pInode;..  /
10590 2a 20 49 66 20 73 6f 6d 65 20 74 68 72 65 61 64  * If some thread
105a0 20 75 73 69 6e 67 20 74 68 69 73 20 50 49 44 20   using this PID 
105b0 68 61 73 20 61 20 6c 6f 63 6b 20 76 69 61 20 61  has a lock via a
105c0 20 64 69 66 66 65 72 65 6e 74 20 75 6e 69 78 46   different unixF
105d0 69 6c 65 2a 0a 20 20 2a 2a 20 68 61 6e 64 6c 65  ile*.  ** handle
105e0 20 74 68 61 74 20 70 72 65 63 6c 75 64 65 73 20   that precludes 
105f0 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
10600 63 6b 2c 20 72 65 74 75 72 6e 20 42 55 53 59 2e  ck, return BUSY.
10610 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 46 69  .  */.  if( (pFi
10620 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 70  le->eFileLock!=p
10630 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
10640 20 26 26 20 0a 20 20 20 20 20 20 20 20 20 20 28   && .          (
10650 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
10660 6b 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20  k>=PENDING_LOCK 
10670 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41  || eFileLock>SHA
10680 52 45 44 5f 4c 4f 43 4b 29 29 0a 20 20 29 7b 0a  RED_LOCK)).  ){.
10690 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
106a0 42 55 53 59 3b 0a 20 20 20 20 67 6f 74 6f 20 65  BUSY;.    goto e
106b0 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20  nd_lock;.  }..  
106c0 2f 2a 20 49 66 20 61 20 53 48 41 52 45 44 20 6c  /* If a SHARED l
106d0 6f 63 6b 20 69 73 20 72 65 71 75 65 73 74 65 64  ock is requested
106e0 2c 20 61 6e 64 20 73 6f 6d 65 20 74 68 72 65 61  , and some threa
106f0 64 20 75 73 69 6e 67 20 74 68 69 73 20 50 49 44  d using this PID
10700 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 68 61   already.  ** ha
10710 73 20 61 20 53 48 41 52 45 44 20 6f 72 20 52 45  s a SHARED or RE
10720 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 74 68 65  SERVED lock, the
10730 6e 20 69 6e 63 72 65 6d 65 6e 74 20 72 65 66 65  n increment refe
10740 72 65 6e 63 65 20 63 6f 75 6e 74 73 20 61 6e 64  rence counts and
10750 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c  .  ** return SQL
10760 49 54 45 5f 4f 4b 2e 0a 20 20 2a 2f 0a 20 20 69  ITE_OK..  */.  i
10770 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  f( eFileLock==SH
10780 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20 0a 20 20  ARED_LOCK && .  
10790 20 20 20 20 28 70 49 6e 6f 64 65 2d 3e 65 46 69      (pInode->eFi
107a0 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c  leLock==SHARED_L
107b0 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 65  OCK || pInode->e
107c0 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56  FileLock==RESERV
107d0 45 44 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20  ED_LOCK) ){.    
107e0 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63  assert( eFileLoc
107f0 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k==SHARED_LOCK )
10800 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 46  ;.    assert( pF
10810 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d  ile->eFileLock==
10820 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
10830 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
10840 3e 30 20 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d  >0 );.    pFile-
10850 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41  >eFileLock = SHA
10860 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 49  RED_LOCK;.    pI
10870 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2b 2b 3b  node->nShared++;
10880 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f  .    pInode->nLo
10890 63 6b 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 65  ck++;.    goto e
108a0 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 0a 20  nd_lock;.  }... 
108b0 20 2f 2a 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f   /* A PENDING lo
108c0 63 6b 20 69 73 20 6e 65 65 64 65 64 20 62 65 66  ck is needed bef
108d0 6f 72 65 20 61 63 71 75 69 72 69 6e 67 20 61 20  ore acquiring a 
108e0 53 48 41 52 45 44 20 6c 6f 63 6b 20 61 6e 64 20  SHARED lock and 
108f0 62 65 66 6f 72 65 0a 20 20 2a 2a 20 61 63 71 75  before.  ** acqu
10900 69 72 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49  iring an EXCLUSI
10910 56 45 20 6c 6f 63 6b 2e 20 20 46 6f 72 20 74 68  VE lock.  For th
10920 65 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74  e SHARED lock, t
10930 68 65 20 50 45 4e 44 49 4e 47 20 77 69 6c 6c 0a  he PENDING will.
10940 20 20 2a 2a 20 62 65 20 72 65 6c 65 61 73 65 64    ** be released
10950 2e 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b 2e 6c 5f  ..  */.  lock.l_
10960 6c 65 6e 20 3d 20 31 4c 3b 0a 20 20 6c 6f 63 6b  len = 1L;.  lock
10970 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b  .l_whence = SEEK
10980 5f 53 45 54 3b 0a 20 20 69 66 28 20 65 46 69 6c  _SET;.  if( eFil
10990 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
109a0 43 4b 20 0a 20 20 20 20 20 20 7c 7c 20 28 65 46  CK .      || (eF
109b0 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ileLock==EXCLUSI
109c0 56 45 5f 4c 4f 43 4b 20 26 26 20 70 46 69 6c 65  VE_LOCK && pFile
109d0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 50 45 4e 44  ->eFileLock<PEND
109e0 49 4e 47 5f 4c 4f 43 4b 29 0a 20 20 29 7b 0a 20  ING_LOCK).  ){. 
109f0 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d     lock.l_type =
10a00 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41   (eFileLock==SHA
10a10 52 45 44 5f 4c 4f 43 4b 3f 46 5f 52 44 4c 43 4b  RED_LOCK?F_RDLCK
10a20 3a 46 5f 57 52 4c 43 4b 29 3b 0a 20 20 20 20 6c  :F_WRLCK);.    l
10a30 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50 45  ock.l_start = PE
10a40 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20 20  NDING_BYTE;.    
10a50 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b  if( unixFileLock
10a60 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 2c 20 30  (pFile, &lock, 0
10a70 29 20 29 7b 0a 20 20 20 20 20 20 74 45 72 72 6e  ) ){.      tErrn
10a80 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
10a90 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f   rc = sqliteErro
10aa0 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28  rFromPosixError(
10ab0 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49  tErrno, SQLITE_I
10ac0 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  OERR_LOCK);.    
10ad0 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52    if( IS_LOCK_ER
10ae0 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20  ROR(rc) ){.     
10af0 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e     storeLastErrn
10b00 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29  o(pFile, tErrno)
10b10 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
10b20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20  goto end_lock;. 
10b30 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20     }.  }...  /* 
10b40 49 66 20 63 6f 6e 74 72 6f 6c 20 67 65 74 73 20  If control gets 
10b50 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74  to this point, t
10b60 68 65 6e 20 61 63 74 75 61 6c 6c 79 20 67 6f 20  hen actually go 
10b70 61 68 65 61 64 20 61 6e 64 20 6d 61 6b 65 0a 20  ahead and make. 
10b80 20 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 73 79   ** operating sy
10b90 73 74 65 6d 20 63 61 6c 6c 73 20 66 6f 72 20 74  stem calls for t
10ba0 68 65 20 73 70 65 63 69 66 69 65 64 20 6c 6f 63  he specified loc
10bb0 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 46  k..  */.  if( eF
10bc0 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
10bd0 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73 73 65  LOCK ){.    asse
10be0 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61  rt( pInode->nSha
10bf0 72 65 64 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  red==0 );.    as
10c00 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 65 46  sert( pInode->eF
10c10 69 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20  ileLock==0 );.  
10c20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
10c30 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 20 20  LITE_OK );..    
10c40 2f 2a 20 4e 6f 77 20 67 65 74 20 74 68 65 20 72  /* Now get the r
10c50 65 61 64 2d 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20  ead-lock */.    
10c60 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53  lock.l_start = S
10c70 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20  HARED_FIRST;.   
10c80 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48   lock.l_len = SH
10c90 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20 69  ARED_SIZE;.    i
10ca0 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28  f( unixFileLock(
10cb0 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 2c 20 30 29  pFile, &lock, 0)
10cc0 20 29 7b 0a 20 20 20 20 20 20 74 45 72 72 6e 6f   ){.      tErrno
10cd0 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
10ce0 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72  rc = sqliteError
10cf0 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74  FromPosixError(t
10d00 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f  Errno, SQLITE_IO
10d10 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 7d  ERR_LOCK);.    }
10d20 0a 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 74 68  ..    /* Drop th
10d30 65 20 74 65 6d 70 6f 72 61 72 79 20 50 45 4e 44  e temporary PEND
10d40 49 4e 47 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20  ING lock */.    
10d50 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50  lock.l_start = P
10d60 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20  ENDING_BYTE;.   
10d70 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 4c   lock.l_len = 1L
10d80 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70  ;.    lock.l_typ
10d90 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20  e = F_UNLCK;.   
10da0 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63   if( unixFileLoc
10db0 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 2c 20  k(pFile, &lock, 
10dc0 31 30 29 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  10) && rc==SQLIT
10dd0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a  E_OK ){.      /*
10de0 20 54 68 69 73 20 63 6f 75 6c 64 20 68 61 70 70   This could happ
10df0 65 6e 20 77 69 74 68 20 61 20 6e 65 74 77 6f 72  en with a networ
10e00 6b 20 6d 6f 75 6e 74 20 2a 2f 0a 20 20 20 20 20  k mount */.     
10e10 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
10e20 0a 23 69 66 20 4f 53 4c 4f 43 4b 49 4e 47 5f 43  .#if OSLOCKING_C
10e30 48 45 43 4b 5f 42 55 53 59 5f 49 4f 45 52 52 0a  HECK_BUSY_IOERR.
10e40 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
10e50 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45  eErrorFromPosixE
10e60 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c  rror(tErrno, SQL
10e70 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
10e80 29 3b 20 0a 23 65 6c 73 65 0a 20 20 20 20 20 20  ); .#else.      
10e90 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
10ea0 52 5f 55 4e 4c 4f 43 4b 3b 20 0a 23 65 6e 64 69  R_UNLOCK; .#endi
10eb0 66 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  f.    }..    if(
10ec0 20 72 63 20 29 7b 0a 20 20 20 20 20 20 69 66 28   rc ){.      if(
10ed0 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72   IS_LOCK_ERROR(r
10ee0 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74  c) ){.        st
10ef0 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69  oreLastErrno(pFi
10f00 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20  le, tErrno);.   
10f10 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20     }.      goto 
10f20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 65  end_lock;.    }e
10f30 6c 73 65 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  lse{.      pFile
10f40 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48  ->eFileLock = SH
10f50 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20  ARED_LOCK;.     
10f60 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b   pInode->nLock++
10f70 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e  ;.      pInode->
10f80 6e 53 68 61 72 65 64 20 3d 20 31 3b 0a 20 20 20  nShared = 1;.   
10f90 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65   }.  }else if( e
10fa0 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53  FileLock==EXCLUS
10fb0 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70 49 6e 6f  IVE_LOCK && pIno
10fc0 64 65 2d 3e 6e 53 68 61 72 65 64 3e 31 20 29 7b  de->nShared>1 ){
10fd0 0a 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20 74  .    /* We are t
10fe0 72 79 69 6e 67 20 66 6f 72 20 61 6e 20 65 78 63  rying for an exc
10ff0 6c 75 73 69 76 65 20 6c 6f 63 6b 20 62 75 74 20  lusive lock but 
11000 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64 20 69  another thread i
11010 6e 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 73 61  n this.    ** sa
11020 6d 65 20 70 72 6f 63 65 73 73 20 69 73 20 73 74  me process is st
11030 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 20 73 68  ill holding a sh
11040 61 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20  ared lock. */.  
11050 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
11060 53 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  SY;.  }else{.   
11070 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 20   /* The request 
11080 77 61 73 20 66 6f 72 20 61 20 52 45 53 45 52 56  was for a RESERV
11090 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20  ED or EXCLUSIVE 
110a0 6c 6f 63 6b 2e 20 20 49 74 20 69 73 0a 20 20 20  lock.  It is.   
110b0 20 2a 2a 20 61 73 73 75 6d 65 64 20 74 68 61 74   ** assumed that
110c0 20 74 68 65 72 65 20 69 73 20 61 20 53 48 41 52   there is a SHAR
110d0 45 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f  ED or greater lo
110e0 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 0a 20  ck on the file. 
110f0 20 20 20 2a 2a 20 61 6c 72 65 61 64 79 2e 0a 20     ** already.. 
11100 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74     */.    assert
11110 28 20 30 21 3d 70 46 69 6c 65 2d 3e 65 46 69 6c  ( 0!=pFile->eFil
11120 65 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 6c 6f 63  eLock );.    loc
11130 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57 52 4c  k.l_type = F_WRL
11140 43 4b 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28  CK;..    assert(
11150 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45   eFileLock==RESE
11160 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69  RVED_LOCK || eFi
11170 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  leLock==EXCLUSIV
11180 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 69 66  E_LOCK );.    if
11190 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53  ( eFileLock==RES
111a0 45 52 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20  ERVED_LOCK ){.  
111b0 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74      lock.l_start
111c0 20 3d 20 52 45 53 45 52 56 45 44 5f 42 59 54 45   = RESERVED_BYTE
111d0 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c  ;.      lock.l_l
111e0 65 6e 20 3d 20 31 4c 3b 0a 20 20 20 20 7d 65 6c  en = 1L;.    }el
111f0 73 65 7b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  se{.      lock.l
11200 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f  _start = SHARED_
11210 46 49 52 53 54 3b 0a 20 20 20 20 20 20 6c 6f 63  FIRST;.      loc
11220 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44  k.l_len = SHARED
11230 5f 53 49 5a 45 3b 0a 20 20 20 20 7d 0a 0a 20 20  _SIZE;.    }..  
11240 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f    if( unixFileLo
11250 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 2c  ck(pFile, &lock,
11260 20 30 29 20 29 7b 0a 20 20 20 20 20 20 74 45 72   0) ){.      tEr
11270 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
11280 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72     rc = sqliteEr
11290 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f  rorFromPosixErro
112a0 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45  r(tErrno, SQLITE
112b0 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20  _IOERR_LOCK);.  
112c0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
112d0 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20  TE_BUSY ){.     
112e0 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e     storeLastErrn
112f0 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29  o(pFile, tErrno)
11300 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
11310 20 20 7d 0a 20 20 0a 0a 23 69 66 64 65 66 20 53    }.  ..#ifdef S
11320 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a  QLITE_DEBUG.  /*
11330 20 53 65 74 20 75 70 20 74 68 65 20 74 72 61 6e   Set up the tran
11340 73 61 63 74 69 6f 6e 2d 63 6f 75 6e 74 65 72 20  saction-counter 
11350 63 68 61 6e 67 65 20 63 68 65 63 6b 69 6e 67 20  change checking 
11360 66 6c 61 67 73 20 77 68 65 6e 0a 20 20 2a 2a 20  flags when.  ** 
11370 74 72 61 6e 73 69 74 69 6f 6e 69 6e 67 20 66 72  transitioning fr
11380 6f 6d 20 61 20 53 48 41 52 45 44 20 74 6f 20 61  om a SHARED to a
11390 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2e 20   RESERVED lock. 
113a0 20 54 68 65 20 63 68 61 6e 67 65 0a 20 20 2a 2a   The change.  **
113b0 20 66 72 6f 6d 20 53 48 41 52 45 44 20 74 6f 20   from SHARED to 
113c0 52 45 53 45 52 56 45 44 20 6d 61 72 6b 73 20 74  RESERVED marks t
113d0 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
113e0 61 20 6e 6f 72 6d 61 6c 0a 20 20 2a 2a 20 77 72  a normal.  ** wr
113f0 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 20 28 6e  ite operation (n
11400 6f 74 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c  ot a hot journal
11410 20 72 6f 6c 6c 62 61 63 6b 29 2e 0a 20 20 2a 2f   rollback)..  */
11420 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
11430 45 5f 4f 4b 0a 20 20 20 26 26 20 70 46 69 6c 65  E_OK.   && pFile
11440 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41  ->eFileLock<=SHA
11450 52 45 44 5f 4c 4f 43 4b 0a 20 20 20 26 26 20 65  RED_LOCK.   && e
11460 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56  FileLock==RESERV
11470 45 44 5f 4c 4f 43 4b 0a 20 20 29 7b 0a 20 20 20  ED_LOCK.  ){.   
11480 20 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e 74   pFile->transCnt
11490 72 43 68 6e 67 20 3d 20 30 3b 0a 20 20 20 20 70  rChng = 0;.    p
114a0 46 69 6c 65 2d 3e 64 62 55 70 64 61 74 65 20 3d  File->dbUpdate =
114b0 20 30 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 69   0;.    pFile->i
114c0 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 3d 20 31  nNormalWrite = 1
114d0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 0a 20  ;.  }.#endif... 
114e0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
114f0 4f 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  OK ){.    pFile-
11500 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69  >eFileLock = eFi
11510 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 70 49 6e 6f  leLock;.    pIno
11520 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  de->eFileLock = 
11530 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 7d 65 6c  eFileLock;.  }el
11540 73 65 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b  se if( eFileLock
11550 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
11560 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65   ){.    pFile->e
11570 46 69 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e 44 49  FileLock = PENDI
11580 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 49 6e  NG_LOCK;.    pIn
11590 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ode->eFileLock =
115a0 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20   PENDING_LOCK;. 
115b0 20 7d 0a 0a 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20   }..end_lock:.  
115c0 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
115d0 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f  ;.  OSTRACE(("LO
115e0 43 4b 20 20 20 20 25 64 20 25 73 20 25 73 20 28  CK    %d %s %s (
115f0 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  unix)\n", pFile-
11600 3e 68 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65  >h, azFileLock(e
11610 46 69 6c 65 4c 6f 63 6b 29 2c 20 0a 20 20 20 20  FileLock), .    
11620 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20    rc==SQLITE_OK 
11630 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64  ? "ok" : "failed
11640 22 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  "));.  return rc
11650 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74  ;.}../*.** Add t
11660 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
11670 6f 72 20 75 73 65 64 20 62 79 20 66 69 6c 65 20  or used by file 
11680 68 61 6e 64 6c 65 20 70 46 69 6c 65 20 74 6f 20  handle pFile to 
11690 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
116a0 67 0a 2a 2a 20 70 55 6e 75 73 65 64 20 6c 69 73  g.** pUnused lis
116b0 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
116c0 64 20 73 65 74 50 65 6e 64 69 6e 67 46 64 28 75  d setPendingFd(u
116d0 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b  nixFile *pFile){
116e0 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  .  unixInodeInfo
116f0 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65   *pInode = pFile
11700 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 55 6e 69 78  ->pInode;.  Unix
11710 55 6e 75 73 65 64 46 64 20 2a 70 20 3d 20 70 46  UnusedFd *p = pF
11720 69 6c 65 2d 3e 70 50 72 65 61 6c 6c 6f 63 61 74  ile->pPreallocat
11730 65 64 55 6e 75 73 65 64 3b 0a 20 20 70 2d 3e 70  edUnused;.  p->p
11740 4e 65 78 74 20 3d 20 70 49 6e 6f 64 65 2d 3e 70  Next = pInode->p
11750 55 6e 75 73 65 64 3b 0a 20 20 70 49 6e 6f 64 65  Unused;.  pInode
11760 2d 3e 70 55 6e 75 73 65 64 20 3d 20 70 3b 0a 20  ->pUnused = p;. 
11770 20 70 46 69 6c 65 2d 3e 68 20 3d 20 2d 31 3b 0a   pFile->h = -1;.
11780 20 20 70 46 69 6c 65 2d 3e 70 50 72 65 61 6c 6c    pFile->pPreall
11790 6f 63 61 74 65 64 55 6e 75 73 65 64 20 3d 20 30  ocatedUnused = 0
117a0 3b 0a 20 20 6e 55 6e 75 73 65 64 46 64 2b 2b 3b  ;.  nUnusedFd++;
117b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20  .}../*.** Lower 
117c0 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
117d0 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69  l on file descri
117e0 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46  ptor pFile to eF
117f0 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c  ileLock.  eFileL
11800 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65  ock.** must be e
11810 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72  ither NO_LOCK or
11820 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a   SHARED_LOCK..**
11830 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69  .** If the locki
11840 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20  ng level of the 
11850 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
11860 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72  is already at or
11870 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65   below.** the re
11880 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20  quested locking 
11890 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74  level, this rout
118a0 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
118b0 2a 2a 20 0a 2a 2a 20 49 66 20 68 61 6e 64 6c 65  ** .** If handle
118c0 4e 46 53 55 6e 6c 6f 63 6b 20 69 73 20 74 72 75  NFSUnlock is tru
118d0 65 2c 20 74 68 65 6e 20 6f 6e 20 64 6f 77 6e 67  e, then on downg
118e0 72 61 64 69 6e 67 20 61 6e 20 45 58 43 4c 55 53  rading an EXCLUS
118f0 49 56 45 5f 4c 4f 43 4b 20 74 6f 20 53 48 41 52  IVE_LOCK to SHAR
11900 45 44 0a 2a 2a 20 74 68 65 20 62 79 74 65 20 72  ED.** the byte r
11910 61 6e 67 65 20 69 73 20 64 69 76 69 64 65 64 20  ange is divided 
11920 69 6e 74 6f 20 32 20 70 61 72 74 73 20 61 6e 64  into 2 parts and
11930 20 74 68 65 20 66 69 72 73 74 20 70 61 72 74 20   the first part 
11940 69 73 20 75 6e 6c 6f 63 6b 65 64 20 74 68 65 6e  is unlocked then
11950 0a 2a 2a 20 73 65 74 20 74 6f 20 61 20 72 65 61  .** set to a rea
11960 64 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 74 68 65  d lock, then the
11970 20 6f 74 68 65 72 20 70 61 72 74 20 69 73 20 73   other part is s
11980 69 6d 70 6c 79 20 75 6e 6c 6f 63 6b 65 64 2e 20  imply unlocked. 
11990 20 54 68 69 73 20 77 6f 72 6b 73 20 0a 2a 2a 20   This works .** 
119a0 61 72 6f 75 6e 64 20 61 20 62 75 67 20 69 6e 20  around a bug in 
119b0 42 53 44 20 4e 46 53 20 6c 6f 63 6b 64 20 28 61  BSD NFS lockd (a
119c0 6c 73 6f 20 73 65 65 6e 20 6f 6e 20 4d 61 63 4f  lso seen on MacO
119d0 53 58 20 31 30 2e 33 2b 29 20 74 68 61 74 20 66  SX 10.3+) that f
119e0 61 69 6c 73 20 74 6f 20 0a 2a 2a 20 72 65 6d 6f  ails to .** remo
119f0 76 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63  ve the write loc
11a00 6b 20 6f 6e 20 61 20 72 65 67 69 6f 6e 20 77 68  k on a region wh
11a10 65 6e 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 69  en a read lock i
11a20 73 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  s set..*/.static
11a30 20 69 6e 74 20 70 6f 73 69 78 55 6e 6c 6f 63 6b   int posixUnlock
11a40 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
11a50 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b  d, int eFileLock
11a60 2c 20 69 6e 74 20 68 61 6e 64 6c 65 4e 46 53 55  , int handleNFSU
11a70 6e 6c 6f 63 6b 29 7b 0a 20 20 75 6e 69 78 46 69  nlock){.  unixFi
11a80 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
11a90 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69  xFile*)id;.  uni
11aa0 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f  xInodeInfo *pIno
11ab0 64 65 3b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f  de;.  struct flo
11ac0 63 6b 20 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20 72  ck lock;.  int r
11ad0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
11ae0 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20    assert( pFile 
11af0 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55  );.  OSTRACE(("U
11b00 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73  NLOCK  %d %d was
11b10 20 25 64 28 25 64 2c 25 64 29 20 70 69 64 3d 25   %d(%d,%d) pid=%
11b20 64 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69  d (unix)\n", pFi
11b30 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b  le->h, eFileLock
11b40 2c 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65  ,.      pFile->e
11b50 46 69 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d  FileLock, pFile-
11b60 3e 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f  >pInode->eFileLo
11b70 63 6b 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  ck, pFile->pInod
11b80 65 2d 3e 6e 53 68 61 72 65 64 2c 0a 20 20 20 20  e->nShared,.    
11b90 20 20 6f 73 47 65 74 70 69 64 28 30 29 29 29 3b    osGetpid(0)));
11ba0 0a 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c  ..  assert( eFil
11bb0 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f  eLock<=SHARED_LO
11bc0 43 4b 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c  CK );.  if( pFil
11bd0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 3d 65 46  e->eFileLock<=eF
11be0 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72  ileLock ){.    r
11bf0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
11c00 0a 20 20 7d 0a 20 20 75 6e 69 78 45 6e 74 65 72  .  }.  unixEnter
11c10 4d 75 74 65 78 28 29 3b 0a 20 20 70 49 6e 6f 64  Mutex();.  pInod
11c20 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  e = pFile->pInod
11c30 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49 6e  e;.  assert( pIn
11c40 6f 64 65 2d 3e 6e 53 68 61 72 65 64 21 3d 30 20  ode->nShared!=0 
11c50 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  );.  if( pFile->
11c60 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44  eFileLock>SHARED
11c70 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73 73  _LOCK ){.    ass
11c80 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 65 46 69  ert( pInode->eFi
11c90 6c 65 4c 6f 63 6b 3d 3d 70 46 69 6c 65 2d 3e 65  leLock==pFile->e
11ca0 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a 0a 23 69 66  FileLock );..#if
11cb0 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
11cc0 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 72 65 64  .    /* When red
11cd0 75 63 69 6e 67 20 61 20 6c 6f 63 6b 20 73 75 63  ucing a lock suc
11ce0 68 20 74 68 61 74 20 6f 74 68 65 72 20 70 72 6f  h that other pro
11cf0 63 65 73 73 65 73 20 63 61 6e 20 73 74 61 72 74  cesses can start
11d00 0a 20 20 20 20 2a 2a 20 72 65 61 64 69 6e 67 20  .    ** reading 
11d10 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
11d20 65 20 61 67 61 69 6e 2c 20 6d 61 6b 65 20 73 75  e again, make su
11d30 72 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20  re that the.    
11d40 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  ** transaction c
11d50 6f 75 6e 74 65 72 20 77 61 73 20 75 70 64 61 74  ounter was updat
11d60 65 64 20 69 66 20 61 6e 79 20 70 61 72 74 20 6f  ed if any part o
11d70 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20  f the database. 
11d80 20 20 20 2a 2a 20 66 69 6c 65 20 63 68 61 6e 67     ** file chang
11d90 65 64 2e 20 20 49 66 20 74 68 65 20 74 72 61 6e  ed.  If the tran
11da0 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20  saction counter 
11db0 69 73 20 6e 6f 74 20 75 70 64 61 74 65 64 2c 0a  is not updated,.
11dc0 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 63 6f 6e      ** other con
11dd0 6e 65 63 74 69 6f 6e 73 20 74 6f 20 74 68 65 20  nections to the 
11de0 73 61 6d 65 20 66 69 6c 65 20 6d 69 67 68 74 20  same file might 
11df0 6e 6f 74 20 72 65 61 6c 69 7a 65 20 74 68 61 74  not realize that
11e00 0a 20 20 20 20 2a 2a 20 74 68 65 20 66 69 6c 65  .    ** the file
11e10 20 68 61 73 20 63 68 61 6e 67 65 64 20 61 6e 64   has changed and
11e20 20 68 65 6e 63 65 20 6d 69 67 68 74 20 6e 6f 74   hence might not
11e30 20 6b 6e 6f 77 20 74 6f 20 66 6c 75 73 68 20 74   know to flush t
11e40 68 65 69 72 0a 20 20 20 20 2a 2a 20 63 61 63 68  heir.    ** cach
11e50 65 2e 20 20 54 68 65 20 75 73 65 20 6f 66 20 61  e.  The use of a
11e60 20 73 74 61 6c 65 20 63 61 63 68 65 20 63 61 6e   stale cache can
11e70 20 6c 65 61 64 20 74 6f 20 64 61 74 61 62 61 73   lead to databas
11e80 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20  e corruption..  
11e90 20 20 2a 2f 0a 20 20 20 20 70 46 69 6c 65 2d 3e    */.    pFile->
11ea0 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 3d 20  inNormalWrite = 
11eb0 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f  0;.#endif..    /
11ec0 2a 20 64 6f 77 6e 67 72 61 64 69 6e 67 20 74 6f  * downgrading to
11ed0 20 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f   a shared lock o
11ee0 6e 20 4e 46 53 20 69 6e 76 6f 6c 76 65 73 20 63  n NFS involves c
11ef0 6c 65 61 72 69 6e 67 20 74 68 65 20 77 72 69 74  learing the writ
11f00 65 20 6c 6f 63 6b 0a 20 20 20 20 2a 2a 20 62 65  e lock.    ** be
11f10 66 6f 72 65 20 65 73 74 61 62 6c 69 73 68 69 6e  fore establishin
11f20 67 20 74 68 65 20 72 65 61 64 6c 6f 63 6b 20 2d  g the readlock -
11f30 20 74 6f 20 61 76 6f 69 64 20 61 20 72 61 63 65   to avoid a race
11f40 20 63 6f 6e 64 69 74 69 6f 6e 20 77 65 20 64 6f   condition we do
11f50 77 6e 67 72 61 64 65 0a 20 20 20 20 2a 2a 20 74  wngrade.    ** t
11f60 68 65 20 6c 6f 63 6b 20 69 6e 20 32 20 62 6c 6f  he lock in 2 blo
11f70 63 6b 73 2c 20 73 6f 20 74 68 61 74 20 70 61 72  cks, so that par
11f80 74 20 6f 66 20 74 68 65 20 72 61 6e 67 65 20 77  t of the range w
11f90 69 6c 6c 20 62 65 20 63 6f 76 65 72 65 64 20 62  ill be covered b
11fa0 79 20 61 20 0a 20 20 20 20 2a 2a 20 77 72 69 74  y a .    ** writ
11fb0 65 20 6c 6f 63 6b 20 75 6e 74 69 6c 20 74 68 65  e lock until the
11fc0 20 72 65 73 74 20 69 73 20 63 6f 76 65 72 65 64   rest is covered
11fd0 20 62 79 20 61 20 72 65 61 64 20 6c 6f 63 6b 3a   by a read lock:
11fe0 0a 20 20 20 20 2a 2a 20 20 31 3a 20 20 20 5b 57  .    **  1:   [W
11ff0 57 57 57 57 5d 0a 20 20 20 20 2a 2a 20 20 32 3a  WWWW].    **  2:
12000 20 20 20 5b 2e 2e 2e 2e 57 5d 0a 20 20 20 20 2a     [....W].    *
12010 2a 20 20 33 3a 20 20 20 5b 52 52 52 52 57 5d 0a  *  3:   [RRRRW].
12020 20 20 20 20 2a 2a 20 20 34 3a 20 20 20 5b 52 52      **  4:   [RR
12030 52 52 2e 5d 0a 20 20 20 20 2a 2f 0a 20 20 20 20  RR.].    */.    
12040 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  if( eFileLock==S
12050 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 23 69  HARED_LOCK ){.#i
12060 66 20 21 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  f !defined(__APP
12070 4c 45 5f 5f 29 20 7c 7c 20 21 53 51 4c 49 54 45  LE__) || !SQLITE
12080 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
12090 53 54 59 4c 45 0a 20 20 20 20 20 20 28 76 6f 69  STYLE.      (voi
120a0 64 29 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63  d)handleNFSUnloc
120b0 6b 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  k;.      assert(
120c0 20 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b   handleNFSUnlock
120d0 3d 3d 30 20 29 3b 0a 23 65 6e 64 69 66 0a 23 69  ==0 );.#endif.#i
120e0 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
120f0 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45  E__) && SQLITE_E
12100 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
12110 59 4c 45 0a 20 20 20 20 20 20 69 66 28 20 68 61  YLE.      if( ha
12120 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b 20 29 7b  ndleNFSUnlock ){
12130 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74 45 72  .        int tEr
12140 72 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20  rno;            
12150 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65     /* Error code
12160 20 66 72 6f 6d 20 73 79 73 74 65 6d 20 63 61 6c   from system cal
12170 6c 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 20 20  l errors */.    
12180 20 20 20 20 6f 66 66 5f 74 20 64 69 76 53 69 7a      off_t divSiz
12190 65 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 20  e = SHARED_SIZE 
121a0 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 0a 20 20  - 1;.        .  
121b0 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70        lock.l_typ
121c0 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20  e = F_UNLCK;.   
121d0 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e       lock.l_when
121e0 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20  ce = SEEK_SET;. 
121f0 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74         lock.l_st
12200 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52  art = SHARED_FIR
12210 53 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b  ST;.        lock
12220 2e 6c 5f 6c 65 6e 20 3d 20 64 69 76 53 69 7a 65  .l_len = divSize
12230 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 75 6e  ;.        if( un
12240 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65  ixFileLock(pFile
12250 2c 20 26 6c 6f 63 6b 2c 20 31 30 29 3d 3d 28 2d  , &lock, 10)==(-
12260 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  1) ){.          
12270 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
12280 23 69 66 20 4f 53 4c 4f 43 4b 49 4e 47 5f 43 48  #if OSLOCKING_CH
12290 45 43 4b 5f 42 55 53 59 5f 49 4f 45 52 52 0a 20  ECK_BUSY_IOERR. 
122a0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
122b0 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73  liteErrorFromPos
122c0 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20  ixError(tErrno, 
122d0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c  SQLITE_IOERR_UNL
122e0 4f 43 4b 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20  OCK);.#else.    
122f0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
12300 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a  E_IOERR_UNLOCK;.
12310 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20  #endif.         
12320 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28   storeLastErrno(
12330 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a  pFile, tErrno);.
12340 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
12350 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20  nd_unlock;.     
12360 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6c 6f 63     }.        loc
12370 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c  k.l_type = F_RDL
12380 43 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b  CK;.        lock
12390 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b  .l_whence = SEEK
123a0 5f 53 45 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f  _SET;.        lo
123b0 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41  ck.l_start = SHA
123c0 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20  RED_FIRST;.     
123d0 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20     lock.l_len = 
123e0 64 69 76 53 69 7a 65 3b 0a 20 20 20 20 20 20 20  divSize;.       
123f0 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63   if( unixFileLoc
12400 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 2c 20  k(pFile, &lock, 
12410 31 30 29 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20  10)==(-1) ){.   
12420 20 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20         tErrno = 
12430 65 72 72 6e 6f 3b 0a 23 69 66 20 4f 53 4c 4f 43  errno;.#if OSLOC
12440 4b 49 4e 47 5f 43 48 45 43 4b 5f 42 55 53 59 5f  KING_CHECK_BUSY_
12450 49 4f 45 52 52 0a 20 20 20 20 20 20 20 20 20 20  IOERR.          
12460 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72  rc = sqliteError
12470 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74  FromPosixError(t
12480 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f  Errno, SQLITE_IO
12490 45 52 52 5f 52 44 4c 4f 43 4b 29 3b 0a 23 65 6c  ERR_RDLOCK);.#el
124a0 73 65 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  se.          rc 
124b0 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  = SQLITE_IOERR_U
124c0 4e 4c 4f 43 4b 3b 0a 23 65 6e 64 69 66 0a 20 20  NLOCK;.#endif.  
124d0 20 20 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c          if( IS_L
124e0 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b  OCK_ERROR(rc) ){
124f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 74 6f  .            sto
12500 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c  reLastErrno(pFil
12510 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20  e, tErrno);.    
12520 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
12530 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63    goto end_unloc
12540 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
12550 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65       lock.l_type
12560 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20   = F_UNLCK;.    
12570 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63      lock.l_whenc
12580 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20  e = SEEK_SET;.  
12590 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61        lock.l_sta
125a0 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53  rt = SHARED_FIRS
125b0 54 2b 64 69 76 53 69 7a 65 3b 0a 20 20 20 20 20  T+divSize;.     
125c0 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20     lock.l_len = 
125d0 53 48 41 52 45 44 5f 53 49 5a 45 2d 64 69 76 53  SHARED_SIZE-divS
125e0 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ize;.        if(
125f0 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46   unixFileLock(pF
12600 69 6c 65 2c 20 26 6c 6f 63 6b 2c 20 31 30 29 3d  ile, &lock, 10)=
12610 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20  =(-1) ){.       
12620 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e     tErrno = errn
12630 6f 3b 0a 23 69 66 20 4f 53 4c 4f 43 4b 49 4e 47  o;.#if OSLOCKING
12640 5f 43 48 45 43 4b 5f 42 55 53 59 5f 49 4f 45 52  _CHECK_BUSY_IOER
12650 52 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  R.          rc =
12660 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d   sqliteErrorFrom
12670 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e  PosixError(tErrn
12680 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  o, SQLITE_IOERR_
12690 55 4e 4c 4f 43 4b 29 3b 0a 23 65 6c 73 65 0a 20  UNLOCK);.#else. 
126a0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
126b0 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43  LITE_IOERR_UNLOC
126c0 4b 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  K;.#endif.      
126d0 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f      if( IS_LOCK_
126e0 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20  ERROR(rc) ){.   
126f0 20 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61           storeLa
12700 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74  stErrno(pFile, t
12710 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20  Errno);.        
12720 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 74    }.          st
12730 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69  oreLastErrno(pFi
12740 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20  le, tErrno);.   
12750 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
12760 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20  unlock;.        
12770 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65  }.      }else.#e
12780 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28  ndif /* defined(
12790 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51  __APPLE__) && SQ
127a0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
127b0 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 20 20 20  ING_STYLE */.   
127c0 20 20 20 7b 0a 20 20 20 20 20 20 20 20 6c 6f 63     {.        loc
127d0 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c  k.l_type = F_RDL
127e0 43 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b  CK;.        lock
127f0 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b  .l_whence = SEEK
12800 5f 53 45 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f  _SET;.        lo
12810 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41  ck.l_start = SHA
12820 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20  RED_FIRST;.     
12830 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20     lock.l_len = 
12840 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20  SHARED_SIZE;.   
12850 20 20 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c       if( unixFil
12860 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f  eLock(pFile, &lo
12870 63 6b 2c 20 31 30 29 20 29 7b 0a 20 20 20 20 20  ck, 10) ){.     
12880 20 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20       int tErrno 
12890 3d 20 65 72 72 6e 6f 3b 0a 23 69 66 20 4f 53 4c  = errno;.#if OSL
128a0 4f 43 4b 49 4e 47 5f 43 48 45 43 4b 5f 42 55 53  OCKING_CHECK_BUS
128b0 59 5f 49 4f 45 52 52 0a 20 20 20 20 20 20 20 20  Y_IOERR.        
128c0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72    rc = sqliteErr
128d0 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72  orFromPosixError
128e0 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f  (tErrno, SQLITE_
128f0 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 29 3b 0a 23  IOERR_RDLOCK);.#
12900 65 6c 73 65 0a 20 20 20 20 20 20 20 20 20 20 2f  else.          /
12910 2a 20 49 6e 20 74 68 65 6f 72 79 2c 20 74 68 65  * In theory, the
12920 20 63 61 6c 6c 20 74 6f 20 75 6e 69 78 46 69 6c   call to unixFil
12930 65 4c 6f 63 6b 28 29 20 63 61 6e 6e 6f 74 20 66  eLock() cannot f
12940 61 69 6c 20 62 65 63 61 75 73 65 20 61 6e 6f 74  ail because anot
12950 68 65 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  her.          **
12960 20 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64   process is hold
12970 69 6e 67 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69  ing an incompati
12980 62 6c 65 20 6c 6f 63 6b 2e 20 49 66 20 69 74 20  ble lock. If it 
12990 64 6f 65 73 2c 20 74 68 69 73 20 0a 20 20 20 20  does, this .    
129a0 20 20 20 20 20 20 2a 2a 20 69 6e 64 69 63 61 74        ** indicat
129b0 65 73 20 74 68 61 74 20 74 68 65 20 6f 74 68 65  es that the othe
129c0 72 20 70 72 6f 63 65 73 73 20 69 73 20 6e 6f 74  r process is not
129d0 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6c   following the l
129e0 6f 63 6b 69 6e 67 0a 20 20 20 20 20 20 20 20 20  ocking.         
129f0 20 2a 2a 20 70 72 6f 74 6f 63 6f 6c 2e 20 49 66   ** protocol. If
12a00 20 74 68 69 73 20 68 61 70 70 65 6e 73 2c 20 72   this happens, r
12a10 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
12a20 52 52 5f 52 44 4c 4f 43 4b 2e 20 52 65 74 75 72  RR_RDLOCK. Retur
12a30 6e 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20 2a  ning.          *
12a40 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 77 6f  * SQLITE_BUSY wo
12a50 75 6c 64 20 63 6f 6e 66 75 73 65 20 74 68 65 20  uld confuse the 
12a60 75 70 70 65 72 20 6c 61 79 65 72 20 28 69 6e 20  upper layer (in 
12a70 70 72 61 63 74 69 63 65 20 69 74 20 63 61 75 73  practice it caus
12a80 65 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  es .          **
12a90 20 61 6e 20 61 73 73 65 72 74 20 74 6f 20 66 61   an assert to fa
12aa0 69 6c 29 2e 20 2a 2f 20 0a 20 20 20 20 20 20 20  il). */ .       
12ab0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
12ac0 4f 45 52 52 5f 52 44 4c 4f 43 4b 3b 0a 20 20 20  OERR_RDLOCK;.   
12ad0 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74         storeLast
12ae0 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72  Errno(pFile, tEr
12af0 72 6e 6f 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  rno);.#endif.   
12b00 20 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f         if( IS_LO
12b10 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a  CK_ERROR(rc) ){.
12b20 20 20 20 20 20 20 20 20 20 20 20 20 73 74 6f 72              stor
12b30 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65  eLastErrno(pFile
12b40 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20  , tErrno);.     
12b50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
12b60 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b   goto end_unlock
12b70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
12b80 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6c 6f    }.    }.    lo
12b90 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e  ck.l_type = F_UN
12ba0 4c 43 4b 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f  LCK;.    lock.l_
12bb0 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45  whence = SEEK_SE
12bc0 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74  T;.    lock.l_st
12bd0 61 72 74 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59  art = PENDING_BY
12be0 54 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c  TE;.    lock.l_l
12bf0 65 6e 20 3d 20 32 4c 3b 20 20 61 73 73 65 72 74  en = 2L;  assert
12c00 28 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2b 31  ( PENDING_BYTE+1
12c10 3d 3d 52 45 53 45 52 56 45 44 5f 42 59 54 45 20  ==RESERVED_BYTE 
12c20 29 3b 0a 20 20 20 20 69 66 28 20 75 6e 69 78 46  );.    if( unixF
12c30 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26  ileLock(pFile, &
12c40 6c 6f 63 6b 2c 20 31 30 29 3d 3d 30 20 29 7b 0a  lock, 10)==0 ){.
12c50 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46        pInode->eF
12c60 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44  ileLock = SHARED
12c70 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c 73 65  _LOCK;.    }else
12c80 7b 0a 23 69 66 20 4f 53 4c 4f 43 4b 49 4e 47 5f  {.#if OSLOCKING_
12c90 43 48 45 43 4b 5f 42 55 53 59 5f 49 4f 45 52 52  CHECK_BUSY_IOERR
12ca0 0a 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20  .      tErrno = 
12cb0 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20  errno;.      rc 
12cc0 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  = sqliteErrorFro
12cd0 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72  mPosixError(tErr
12ce0 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  no, SQLITE_IOERR
12cf0 5f 55 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  _UNLOCK);.      
12d00 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f  if( IS_LOCK_ERRO
12d10 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20  R(rc) ){.       
12d20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28   storeLastErrno(
12d30 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a  pFile, tErrno);.
12d40 20 20 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20        }.#else.  
12d50 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
12d60 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20  IOERR_UNLOCK;.  
12d70 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72      storeLastErr
12d80 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29  no(pFile, errno)
12d90 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 67  ;.#endif.      g
12da0 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a  oto end_unlock;.
12db0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
12dc0 65 46 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f  eFileLock==NO_LO
12dd0 43 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 44 65 63  CK ){.    /* Dec
12de0 72 65 6d 65 6e 74 20 74 68 65 20 73 68 61 72 65  rement the share
12df0 64 20 6c 6f 63 6b 20 63 6f 75 6e 74 65 72 2e 20  d lock counter. 
12e00 20 52 65 6c 65 61 73 65 20 74 68 65 20 6c 6f 63   Release the loc
12e10 6b 20 75 73 69 6e 67 20 61 6e 0a 20 20 20 20 2a  k using an.    *
12e20 2a 20 4f 53 20 63 61 6c 6c 20 6f 6e 6c 79 20 77  * OS call only w
12e30 68 65 6e 20 61 6c 6c 20 74 68 72 65 61 64 73 20  hen all threads 
12e40 69 6e 20 74 68 69 73 20 73 61 6d 65 20 70 72 6f  in this same pro
12e50 63 65 73 73 20 68 61 76 65 20 72 65 6c 65 61 73  cess have releas
12e60 65 64 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c 6f  ed.    ** the lo
12e70 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  ck..    */.    p
12e80 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2d 2d  Inode->nShared--
12e90 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65  ;.    if( pInode
12ea0 2d 3e 6e 53 68 61 72 65 64 3d 3d 30 20 29 7b 0a  ->nShared==0 ){.
12eb0 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70        lock.l_typ
12ec0 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20  e = F_UNLCK;.   
12ed0 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65     lock.l_whence
12ee0 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20   = SEEK_SET;.   
12ef0 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20     lock.l_start 
12f00 3d 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 30  = lock.l_len = 0
12f10 4c 3b 0a 20 20 20 20 20 20 69 66 28 20 75 6e 69  L;.      if( uni
12f20 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c  xFileLock(pFile,
12f30 20 26 6c 6f 63 6b 2c 20 31 30 29 3d 3d 30 20 29   &lock, 10)==0 )
12f40 7b 0a 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65  {.        pInode
12f50 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f  ->eFileLock = NO
12f60 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 65 6c  _LOCK;.      }el
12f70 73 65 7b 0a 23 69 66 20 4f 53 4c 4f 43 4b 49 4e  se{.#if OSLOCKIN
12f80 47 5f 43 48 45 43 4b 5f 42 55 53 59 5f 49 4f 45  G_CHECK_BUSY_IOE
12f90 52 52 0a 20 20 20 20 20 20 20 20 74 45 72 72 6e  RR.        tErrn
12fa0 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
12fb0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72     rc = sqliteEr
12fc0 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f  rorFromPosixErro
12fd0 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45  r(tErrno, SQLITE
12fe0 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a  _IOERR_UNLOCK);.
12ff0 20 20 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c          if( IS_L
13000 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b  OCK_ERROR(rc) ){
13010 0a 20 20 20 20 20 20 20 20 20 20 73 74 6f 72 65  .          store
13020 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c  LastErrno(pFile,
13030 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20   tErrno);.      
13040 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 20 20    }.#else.      
13050 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
13060 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20  ERR_UNLOCK;.    
13070 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72      storeLastErr
13080 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29  no(pFile, errno)
13090 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20  ;.#endif.       
130a0 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f   pInode->eFileLo
130b0 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20  ck = NO_LOCK;.  
130c0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69        pFile->eFi
130d0 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b  leLock = NO_LOCK
130e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
130f0 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e  .    /* Decremen
13100 74 20 74 68 65 20 63 6f 75 6e 74 20 6f 66 20 6c  t the count of l
13110 6f 63 6b 73 20 61 67 61 69 6e 73 74 20 74 68 69  ocks against thi
13120 73 20 73 61 6d 65 20 66 69 6c 65 2e 20 20 57 68  s same file.  Wh
13130 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f  en the.    ** co
13140 75 6e 74 20 72 65 61 63 68 65 73 20 7a 65 72 6f  unt reaches zero
13150 2c 20 63 6c 6f 73 65 20 61 6e 79 20 6f 74 68 65  , close any othe
13160 72 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  r file descripto
13170 72 73 20 77 68 6f 73 65 20 63 6c 6f 73 65 0a 20  rs whose close. 
13180 20 20 20 2a 2a 20 77 61 73 20 64 65 66 65 72 72     ** was deferr
13190 65 64 20 62 65 63 61 75 73 65 20 6f 66 20 6f 75  ed because of ou
131a0 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 2e  tstanding locks.
131b0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49 6e 6f  .    */.    pIno
131c0 64 65 2d 3e 6e 4c 6f 63 6b 2d 2d 3b 0a 20 20 20  de->nLock--;.   
131d0 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d   assert( pInode-
131e0 3e 6e 4c 6f 63 6b 3e 3d 30 20 29 3b 0a 20 20 20  >nLock>=0 );.   
131f0 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f   if( pInode->nLo
13200 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 63  ck==0 ){.      c
13210 6c 6f 73 65 50 65 6e 64 69 6e 67 46 64 73 28 70  losePendingFds(p
13220 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  File);.    }.  }
13230 0a 0a 65 6e 64 5f 75 6e 6c 6f 63 6b 3a 0a 20 20  ..end_unlock:.  
13240 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
13250 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
13260 54 45 5f 4f 4b 20 29 20 70 46 69 6c 65 2d 3e 65  TE_OK ) pFile->e
13270 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65  FileLock = eFile
13280 4c 6f 63 6b 3b 0a 20 20 72 65 74 75 72 6e 20 72  Lock;.  return r
13290 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65  c;.}../*.** Lowe
132a0 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  r the locking le
132b0 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63  vel on file desc
132c0 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20  riptor pFile to 
132d0 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c  eFileLock.  eFil
132e0 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65  eLock.** must be
132f0 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20   either NO_LOCK 
13300 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a  or SHARED_LOCK..
13310 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63  **.** If the loc
13320 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68  king level of th
13330 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
13340 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20  r is already at 
13350 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20  or below.** the 
13360 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e  requested lockin
13370 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f  g level, this ro
13380 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
13390 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
133a0 75 6e 69 78 55 6e 6c 6f 63 6b 28 73 71 6c 69 74  unixUnlock(sqlit
133b0 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
133c0 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 23 69 66   eFileLock){.#if
133d0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
133e0 5f 53 49 5a 45 3e 30 0a 20 20 61 73 73 65 72 74  _SIZE>0.  assert
133f0 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41  ( eFileLock==SHA
13400 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 28 28 75 6e  RED_LOCK || ((un
13410 69 78 46 69 6c 65 20 2a 29 69 64 29 2d 3e 6e 46  ixFile *)id)->nF
13420 65 74 63 68 4f 75 74 3d 3d 30 20 29 3b 0a 23 65  etchOut==0 );.#e
13430 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 70 6f  ndif.  return po
13440 73 69 78 55 6e 6c 6f 63 6b 28 69 64 2c 20 65 46  sixUnlock(id, eF
13450 69 6c 65 4c 6f 63 6b 2c 20 30 29 3b 0a 7d 0a 0a  ileLock, 0);.}..
13460 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d  #if SQLITE_MAX_M
13470 4d 41 50 5f 53 49 5a 45 3e 30 0a 73 74 61 74 69  MAP_SIZE>0.stati
13480 63 20 69 6e 74 20 75 6e 69 78 4d 61 70 66 69 6c  c int unixMapfil
13490 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 64 2c  e(unixFile *pFd,
134a0 20 69 36 34 20 6e 42 79 74 65 29 3b 0a 73 74 61   i64 nByte);.sta
134b0 74 69 63 20 76 6f 69 64 20 75 6e 69 78 55 6e 6d  tic void unixUnm
134c0 61 70 66 69 6c 65 28 75 6e 69 78 46 69 6c 65 20  apfile(unixFile 
134d0 2a 70 46 64 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f  *pFd);.#endif../
134e0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
134f0 6f 6e 20 70 65 72 66 6f 72 6d 73 20 74 68 65 20  on performs the 
13500 70 61 72 74 73 20 6f 66 20 74 68 65 20 22 63 6c  parts of the "cl
13510 6f 73 65 20 66 69 6c 65 22 20 6f 70 65 72 61 74  ose file" operat
13520 69 6f 6e 20 0a 2a 2a 20 63 6f 6d 6d 6f 6e 20 74  ion .** common t
13530 6f 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 73 63  o all locking sc
13540 68 65 6d 65 73 2e 20 49 74 20 63 6c 6f 73 65 73  hemes. It closes
13550 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 61   the directory a
13560 6e 64 20 66 69 6c 65 0a 2a 2a 20 68 61 6e 64 6c  nd file.** handl
13570 65 73 2c 20 69 66 20 74 68 65 79 20 61 72 65 20  es, if they are 
13580 76 61 6c 69 64 2c 20 61 6e 64 20 73 65 74 73 20  valid, and sets 
13590 61 6c 6c 20 66 69 65 6c 64 73 20 6f 66 20 74 68  all fields of th
135a0 65 20 75 6e 69 78 46 69 6c 65 0a 2a 2a 20 73 74  e unixFile.** st
135b0 72 75 63 74 75 72 65 20 74 6f 20 30 2e 0a 2a 2a  ructure to 0..**
135c0 0a 2a 2a 20 49 74 20 69 73 20 2a 6e 6f 74 2a 20  .** It is *not* 
135d0 6e 65 63 65 73 73 61 72 79 20 74 6f 20 68 6f 6c  necessary to hol
135e0 64 20 74 68 65 20 6d 75 74 65 78 20 77 68 65 6e  d the mutex when
135f0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
13600 20 63 61 6c 6c 65 64 2c 0a 2a 2a 20 65 76 65 6e   called,.** even
13610 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 20 20 41 20   on VxWorks.  A 
13620 6d 75 74 65 78 20 77 69 6c 6c 20 62 65 20 61 63  mutex will be ac
13630 71 75 69 72 65 64 20 6f 6e 20 56 78 57 6f 72 6b  quired on VxWork
13640 73 20 62 79 20 74 68 65 0a 2a 2a 20 76 78 77 6f  s by the.** vxwo
13650 72 6b 73 52 65 6c 65 61 73 65 46 69 6c 65 49 64  rksReleaseFileId
13660 28 29 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73  () routine..*/.s
13670 74 61 74 69 63 20 69 6e 74 20 63 6c 6f 73 65 55  tatic int closeU
13680 6e 69 78 46 69 6c 65 28 73 71 6c 69 74 65 33 5f  nixFile(sqlite3_
13690 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 75 6e 69  file *id){.  uni
136a0 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
136b0 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 23 69  unixFile*)id;.#i
136c0 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41  f SQLITE_MAX_MMA
136d0 50 5f 53 49 5a 45 3e 30 0a 20 20 75 6e 69 78 55  P_SIZE>0.  unixU
136e0 6e 6d 61 70 66 69 6c 65 28 70 46 69 6c 65 29 3b  nmapfile(pFile);
136f0 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 46  .#endif.  if( pF
13700 69 6c 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20  ile->h>=0 ){.   
13710 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 46   robust_close(pF
13720 69 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 5f  ile, pFile->h, _
13730 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 70 46  _LINE__);.    pF
13740 69 6c 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20 7d  ile->h = -1;.  }
13750 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
13760 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 49 64    if( pFile->pId
13770 20 29 7b 0a 20 20 20 20 69 66 28 20 70 46 69 6c   ){.    if( pFil
13780 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 55  e->ctrlFlags & U
13790 4e 49 58 46 49 4c 45 5f 44 45 4c 45 54 45 20 29  NIXFILE_DELETE )
137a0 7b 0a 20 20 20 20 20 20 6f 73 55 6e 6c 69 6e 6b  {.      osUnlink
137b0 28 70 46 69 6c 65 2d 3e 70 49 64 2d 3e 7a 43 61  (pFile->pId->zCa
137c0 6e 6f 6e 69 63 61 6c 4e 61 6d 65 29 3b 0a 20 20  nonicalName);.  
137d0 20 20 7d 0a 20 20 20 20 76 78 77 6f 72 6b 73 52    }.    vxworksR
137e0 65 6c 65 61 73 65 46 69 6c 65 49 64 28 70 46 69  eleaseFileId(pFi
137f0 6c 65 2d 3e 70 49 64 29 3b 0a 20 20 20 20 70 46  le->pId);.    pF
13800 69 6c 65 2d 3e 70 49 64 20 3d 20 30 3b 0a 20 20  ile->pId = 0;.  
13810 7d 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  }.#endif.#ifdef 
13820 53 51 4c 49 54 45 5f 55 4e 4c 49 4e 4b 5f 41 46  SQLITE_UNLINK_AF
13830 54 45 52 5f 43 4c 4f 53 45 0a 20 20 69 66 28 20  TER_CLOSE.  if( 
13840 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73  pFile->ctrlFlags
13850 20 26 20 55 4e 49 58 46 49 4c 45 5f 44 45 4c 45   & UNIXFILE_DELE
13860 54 45 20 29 7b 0a 20 20 20 20 6f 73 55 6e 6c 69  TE ){.    osUnli
13870 6e 6b 28 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29  nk(pFile->zPath)
13880 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
13890 65 65 28 2a 28 63 68 61 72 2a 2a 29 26 70 46 69  ee(*(char**)&pFi
138a0 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20  le->zPath);.    
138b0 70 46 69 6c 65 2d 3e 7a 50 61 74 68 20 3d 20 30  pFile->zPath = 0
138c0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 4f  ;.  }.#endif.  O
138d0 53 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20 20  STRACE(("CLOSE  
138e0 20 25 2d 33 64 5c 6e 22 2c 20 70 46 69 6c 65 2d   %-3d\n", pFile-
138f0 3e 68 29 29 3b 0a 20 20 4f 70 65 6e 43 6f 75 6e  >h));.  OpenCoun
13900 74 65 72 28 2d 31 29 3b 0a 20 20 73 71 6c 69 74  ter(-1);.  sqlit
13910 65 33 5f 66 72 65 65 28 70 46 69 6c 65 2d 3e 70  e3_free(pFile->p
13920 50 72 65 61 6c 6c 6f 63 61 74 65 64 55 6e 75 73  PreallocatedUnus
13930 65 64 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70 46  ed);.  memset(pF
13940 69 6c 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28 75  ile, 0, sizeof(u
13950 6e 69 78 46 69 6c 65 29 29 3b 0a 20 20 72 65 74  nixFile));.  ret
13960 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
13970 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20  ../*.** Close a 
13980 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
13990 69 6e 74 20 75 6e 69 78 43 6c 6f 73 65 28 73 71  int unixClose(sq
139a0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b  lite3_file *id){
139b0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
139c0 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c  TE_OK;.  unixFil
139d0 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
139e0 46 69 6c 65 20 2a 29 69 64 3b 0a 20 20 76 65 72  File *)id;.  ver
139f0 69 66 79 44 62 46 69 6c 65 28 70 46 69 6c 65 29  ifyDbFile(pFile)
13a00 3b 0a 20 20 75 6e 69 78 55 6e 6c 6f 63 6b 28 69  ;.  unixUnlock(i
13a10 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 75  d, NO_LOCK);.  u
13a20 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
13a30 0a 0a 20 20 2f 2a 20 75 6e 69 78 46 69 6c 65 2e  ..  /* unixFile.
13a40 70 49 6e 6f 64 65 20 69 73 20 61 6c 77 61 79 73  pInode is always
13a50 20 76 61 6c 69 64 20 68 65 72 65 2e 20 4f 74 68   valid here. Oth
13a60 65 72 77 69 73 65 2c 20 61 20 64 69 66 66 65 72  erwise, a differ
13a70 65 6e 74 20 63 6c 6f 73 65 0a 20 20 2a 2a 20 72  ent close.  ** r
13a80 6f 75 74 69 6e 65 20 28 65 2e 67 2e 20 6e 6f 6c  outine (e.g. nol
13a90 6f 63 6b 43 6c 6f 73 65 28 29 29 20 77 6f 75 6c  ockClose()) woul
13aa0 64 20 62 65 20 63 61 6c 6c 65 64 20 69 6e 73 74  d be called inst
13ab0 65 61 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ead..  */.  asse
13ac0 72 74 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  rt( pFile->pInod
13ad0 65 2d 3e 6e 4c 6f 63 6b 3e 30 20 7c 7c 20 70 46  e->nLock>0 || pF
13ae0 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72  ile->pInode->bPr
13af0 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 3b 0a  ocessLock==0 );.
13b00 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 46 69    if( ALWAYS(pFi
13b10 6c 65 2d 3e 70 49 6e 6f 64 65 29 20 26 26 20 70  le->pInode) && p
13b20 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 4c  File->pInode->nL
13b30 6f 63 6b 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  ock ){.    /* If
13b40 20 74 68 65 72 65 20 61 72 65 20 6f 75 74 73 74   there are outst
13b50 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 2c 20 64 6f  anding locks, do
13b60 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 63 6c   not actually cl
13b70 6f 73 65 20 74 68 65 20 66 69 6c 65 20 6a 75 73  ose the file jus
13b80 74 0a 20 20 20 20 2a 2a 20 79 65 74 20 62 65 63  t.    ** yet bec
13b90 61 75 73 65 20 74 68 61 74 20 77 6f 75 6c 64 20  ause that would 
13ba0 63 6c 65 61 72 20 74 68 6f 73 65 20 6c 6f 63 6b  clear those lock
13bb0 73 2e 20 20 49 6e 73 74 65 61 64 2c 20 61 64 64  s.  Instead, add
13bc0 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a   the file.    **
13bd0 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20 70   descriptor to p
13be0 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 20 6c  Inode->pUnused l
13bf0 69 73 74 2e 20 20 49 74 20 77 69 6c 6c 20 62 65  ist.  It will be
13c00 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63   automatically c
13c10 6c 6f 73 65 64 20 0a 20 20 20 20 2a 2a 20 77 68  losed .    ** wh
13c20 65 6e 20 74 68 65 20 6c 61 73 74 20 6c 6f 63 6b  en the last lock
13c30 20 69 73 20 63 6c 65 61 72 65 64 2e 0a 20 20 20   is cleared..   
13c40 20 2a 2f 0a 20 20 20 20 73 65 74 50 65 6e 64 69   */.    setPendi
13c50 6e 67 46 64 28 70 46 69 6c 65 29 3b 0a 20 20 7d  ngFd(pFile);.  }
13c60 0a 20 20 72 65 6c 65 61 73 65 49 6e 6f 64 65 49  .  releaseInodeI
13c70 6e 66 6f 28 70 46 69 6c 65 29 3b 0a 20 20 72 63  nfo(pFile);.  rc
13c80 20 3d 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65   = closeUnixFile
13c90 28 69 64 29 3b 0a 20 20 75 6e 69 78 4c 65 61 76  (id);.  unixLeav
13ca0 65 4d 75 74 65 78 28 29 3b 0a 20 20 72 65 74 75  eMutex();.  retu
13cb0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a  rn rc;.}../*****
13cc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66  ********* End of
13cd0 20 74 68 65 20 70 6f 73 69 78 20 61 64 76 69 73   the posix advis
13ce0 6f 72 79 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65  ory lock impleme
13cf0 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a  ntation ********
13d00 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
13d10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13d20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13d30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13d40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13d50 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a  ********/../****
13d60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13d70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13d80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13d90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13da0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
13db0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13dc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e 6f 2d 6f 70 20  ********* No-op 
13dd0 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a  Locking ********
13de0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13df0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a  **********.**.**
13e00 20 4f 66 20 74 68 65 20 76 61 72 69 6f 75 73 20   Of the various 
13e10 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c 65 6d 65 6e  locking implemen
13e20 74 61 74 69 6f 6e 73 20 61 76 61 69 6c 61 62 6c  tations availabl
13e30 65 2c 20 74 68 69 73 20 69 73 20 62 79 20 66 61  e, this is by fa
13e40 72 20 74 68 65 0a 2a 2a 20 73 69 6d 70 6c 65 73  r the.** simples
13e50 74 3a 20 20 6c 6f 63 6b 69 6e 67 20 69 73 20 69  t:  locking is i
13e60 67 6e 6f 72 65 64 2e 20 20 4e 6f 20 61 74 74 65  gnored.  No atte
13e70 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 6c  mpt is made to l
13e80 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65  ock the database
13e90 0a 2a 2a 20 66 69 6c 65 20 66 6f 72 20 72 65 61  .** file for rea
13ea0 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 2e  ding or writing.
13eb0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6c 6f 63 6b  .**.** This lock
13ec0 69 6e 67 20 6d 6f 64 65 20 69 73 20 61 70 70 72  ing mode is appr
13ed0 6f 70 72 69 61 74 65 20 66 6f 72 20 75 73 65 20  opriate for use 
13ee0 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74  on read-only dat
13ef0 61 62 61 73 65 73 0a 2a 2a 20 28 65 78 3a 20 64  abases.** (ex: d
13f00 61 74 61 62 61 73 65 73 20 74 68 61 74 20 61 72  atabases that ar
13f10 65 20 62 75 72 6e 65 64 20 69 6e 74 6f 20 43 44  e burned into CD
13f20 2d 52 4f 4d 2c 20 66 6f 72 20 65 78 61 6d 70 6c  -ROM, for exampl
13f30 65 2e 29 20 20 49 74 20 63 61 6e 0a 2a 2a 20 61  e.)  It can.** a
13f40 6c 73 6f 20 62 65 20 75 73 65 64 20 69 66 20 74  lso be used if t
13f50 68 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 65  he application e
13f60 6d 70 6c 6f 79 73 20 73 6f 6d 65 20 65 78 74 65  mploys some exte
13f70 72 6e 61 6c 20 6d 65 63 68 61 6e 69 73 6d 20 74  rnal mechanism t
13f80 6f 0a 2a 2a 20 70 72 65 76 65 6e 74 20 73 69 6d  o.** prevent sim
13f90 75 6c 74 61 6e 65 6f 75 73 20 61 63 63 65 73 73  ultaneous access
13fa0 20 6f 66 20 74 68 65 20 73 61 6d 65 20 64 61 74   of the same dat
13fb0 61 62 61 73 65 20 62 79 20 74 77 6f 20 6f 72 20  abase by two or 
13fc0 6d 6f 72 65 0a 2a 2a 20 64 61 74 61 62 61 73 65  more.** database
13fd0 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 20 20 42   connections.  B
13fe0 75 74 20 74 68 65 72 65 20 69 73 20 61 20 73 65  ut there is a se
13ff0 72 69 6f 75 73 20 72 69 73 6b 20 6f 66 20 64 61  rious risk of da
14000 74 61 62 61 73 65 0a 2a 2a 20 63 6f 72 72 75 70  tabase.** corrup
14010 74 69 6f 6e 20 69 66 20 74 68 69 73 20 6c 6f 63  tion if this loc
14020 6b 69 6e 67 20 6d 6f 64 65 20 69 73 20 75 73 65  king mode is use
14030 64 20 69 6e 20 73 69 74 75 61 74 69 6f 6e 73 20  d in situations 
14040 77 68 65 72 65 20 6d 75 6c 74 69 70 6c 65 0a 2a  where multiple.*
14050 2a 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * database conne
14060 63 74 69 6f 6e 73 20 61 72 65 20 61 63 63 65 73  ctions are acces
14070 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20 64 61  sing the same da
14080 74 61 62 61 73 65 20 66 69 6c 65 20 61 74 20 74  tabase file at t
14090 68 65 20 73 61 6d 65 0a 2a 2a 20 74 69 6d 65 20  he same.** time 
140a0 61 6e 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  and one or more 
140b0 6f 66 20 74 68 6f 73 65 20 63 6f 6e 6e 65 63 74  of those connect
140c0 69 6f 6e 73 20 61 72 65 20 77 72 69 74 69 6e 67  ions are writing
140d0 2e 0a 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74  ..*/..static int
140e0 20 6e 6f 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65   nolockCheckRese
140f0 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33  rvedLock(sqlite3
14100 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64 2c 20  _file *NotUsed, 
14110 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20  int *pResOut){. 
14120 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
14130 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 2a 70  R(NotUsed);.  *p
14140 52 65 73 4f 75 74 20 3d 20 30 3b 0a 20 20 72 65  ResOut = 0;.  re
14150 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
14160 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c  }.static int nol
14170 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  ockLock(sqlite3_
14180 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64 2c 20 69  file *NotUsed, i
14190 6e 74 20 4e 6f 74 55 73 65 64 32 29 7b 0a 20 20  nt NotUsed2){.  
141a0 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
141b0 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73  2(NotUsed, NotUs
141c0 65 64 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  ed2);.  return S
141d0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 73 74 61 74  QLITE_OK;.}.stat
141e0 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 55 6e 6c  ic int nolockUnl
141f0 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
14200 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 4e   *NotUsed, int N
14210 6f 74 55 73 65 64 32 29 7b 0a 20 20 55 4e 55 53  otUsed2){.  UNUS
14220 45 44 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f  ED_PARAMETER2(No
14230 74 55 73 65 64 2c 20 4e 6f 74 55 73 65 64 32 29  tUsed, NotUsed2)
14240 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
14250 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
14260 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 2e 0a 2a  lose the file..*
14270 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c  /.static int nol
14280 6f 63 6b 43 6c 6f 73 65 28 73 71 6c 69 74 65 33  ockClose(sqlite3
14290 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69  _file *id) {.  i
142a0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
142b0 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  K;.  unixFile *p
142c0 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
142d0 20 2a 29 69 64 3b 0a 20 20 75 6e 69 78 45 6e 74   *)id;.  unixEnt
142e0 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 69 66 28  erMutex();.  if(
142f0 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 29   pFile->pInode )
14300 7b 20 20 0a 20 20 20 20 61 73 73 65 72 74 28 20  {  .    assert( 
14310 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e  pFile->pInode->n
14320 4c 6f 63 6b 3e 30 20 7c 7c 20 70 46 69 6c 65 2d  Lock>0 || pFile-
14330 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73  >pInode->bProces
14340 73 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20  sLock==0 );.    
14350 69 66 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  if( pFile->pInod
14360 65 2d 3e 6e 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  e->nLock ){.    
14370 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72    /* If there ar
14380 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f  e outstanding lo
14390 63 6b 73 2c 20 64 6f 20 6e 6f 74 20 61 63 74 75  cks, do not actu
143a0 61 6c 6c 79 20 63 6c 6f 73 65 20 74 68 65 20 66  ally close the f
143b0 69 6c 65 20 6a 75 73 74 0a 20 20 20 20 20 20 2a  ile just.      *
143c0 2a 20 79 65 74 20 62 65 63 61 75 73 65 20 74 68  * yet because th
143d0 61 74 20 77 6f 75 6c 64 20 63 6c 65 61 72 20 74  at would clear t
143e0 68 6f 73 65 20 6c 6f 63 6b 73 2e 20 20 49 6e 73  hose locks.  Ins
143f0 74 65 61 64 2c 20 61 64 64 20 74 68 65 20 66 69  tead, add the fi
14400 6c 65 0a 20 20 20 20 20 20 2a 2a 20 64 65 73 63  le.      ** desc
14410 72 69 70 74 6f 72 20 74 6f 20 70 49 6e 6f 64 65  riptor to pInode
14420 2d 3e 70 55 6e 75 73 65 64 20 6c 69 73 74 2e 20  ->pUnused list. 
14430 20 49 74 20 77 69 6c 6c 20 62 65 20 61 75 74 6f   It will be auto
14440 6d 61 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65 64  matically closed
14450 20 0a 20 20 20 20 20 20 2a 2a 20 77 68 65 6e 20   .      ** when 
14460 74 68 65 20 6c 61 73 74 20 6c 6f 63 6b 20 69 73  the last lock is
14470 20 63 6c 65 61 72 65 64 2e 0a 20 20 20 20 20 20   cleared..      
14480 2a 2f 0a 20 20 20 20 20 20 73 65 74 50 65 6e 64  */.      setPend
14490 69 6e 67 46 64 28 70 46 69 6c 65 29 3b 0a 20 20  ingFd(pFile);.  
144a0 20 20 7d 0a 20 20 20 20 72 65 6c 65 61 73 65 49    }.    releaseI
144b0 6e 6f 64 65 49 6e 66 6f 28 70 46 69 6c 65 29 3b  nodeInfo(pFile);
144c0 0a 20 20 7d 0a 20 20 72 63 20 3d 20 63 6c 6f 73  .  }.  rc = clos
144d0 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 20  eUnixFile(id);. 
144e0 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
144f0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
14500 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  }../************
14510 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74  ******* End of t
14520 68 65 20 6e 6f 2d 6f 70 20 6c 6f 63 6b 20 69 6d  he no-op lock im
14530 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a  plementation ***
14540 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14550 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
14560 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14570 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14580 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14590 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
145a0 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  */../***********
145b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
145c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
145d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
145e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
145f0 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
14600 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65  ************* Be
14610 67 69 6e 20 64 6f 74 2d 66 69 6c 65 20 4c 6f 63  gin dot-file Loc
14620 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  king ***********
14630 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14640 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 6f  ***.**.** The do
14650 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 6d  tfile locking im
14660 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 75 73 65  plementation use
14670 73 20 74 68 65 20 65 78 69 73 74 65 6e 63 65 20  s the existence 
14680 6f 66 20 73 65 70 61 72 61 74 65 20 6c 6f 63 6b  of separate lock
14690 0a 2a 2a 20 66 69 6c 65 73 20 28 72 65 61 6c 6c  .** files (reall
146a0 79 20 61 20 64 69 72 65 63 74 6f 72 79 29 20 74  y a directory) t
146b0 6f 20 63 6f 6e 74 72 6f 6c 20 61 63 63 65 73 73  o control access
146c0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
146d0 2e 20 20 54 68 69 73 20 77 6f 72 6b 73 0a 2a 2a  .  This works.**
146e0 20 6f 6e 20 6a 75 73 74 20 61 62 6f 75 74 20 65   on just about e
146f0 76 65 72 79 20 66 69 6c 65 73 79 73 74 65 6d 20  very filesystem 
14700 69 6d 61 67 69 6e 61 62 6c 65 2e 20 20 42 75 74  imaginable.  But
14710 20 74 68 65 72 65 20 61 72 65 20 73 65 72 69 6f   there are serio
14720 75 73 20 64 6f 77 6e 73 69 64 65 73 3a 0a 2a 2a  us downsides:.**
14730 0a 2a 2a 20 20 20 20 28 31 29 20 20 54 68 65 72  .**    (1)  Ther
14740 65 20 69 73 20 7a 65 72 6f 20 63 6f 6e 63 75 72  e is zero concur
14750 72 65 6e 63 79 2e 20 20 41 20 73 69 6e 67 6c 65  rency.  A single
14760 20 72 65 61 64 65 72 20 62 6c 6f 63 6b 73 20 61   reader blocks a
14770 6c 6c 20 6f 74 68 65 72 0a 2a 2a 20 20 20 20 20  ll other.**     
14780 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20      connections 
14790 66 72 6f 6d 20 72 65 61 64 69 6e 67 20 6f 72 20  from reading or 
147a0 77 72 69 74 69 6e 67 20 74 68 65 20 64 61 74 61  writing the data
147b0 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28  base..**.**    (
147c0 32 29 20 20 41 6e 20 61 70 70 6c 69 63 61 74 69  2)  An applicati
147d0 6f 6e 20 63 72 61 73 68 20 6f 72 20 70 6f 77 65  on crash or powe
147e0 72 20 6c 6f 73 73 20 63 61 6e 20 6c 65 61 76 65  r loss can leave
147f0 20 73 74 61 6c 65 20 6c 6f 63 6b 20 66 69 6c 65   stale lock file
14800 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 73 69 74  s.**         sit
14810 74 69 6e 67 20 61 72 6f 75 6e 64 20 74 68 61 74  ting around that
14820 20 6e 65 65 64 20 74 6f 20 62 65 20 63 6c 65 61   need to be clea
14830 72 65 64 20 6d 61 6e 75 61 6c 6c 79 2e 0a 2a 2a  red manually..**
14840 0a 2a 2a 20 4e 65 76 65 72 74 68 65 6c 65 73 73  .** Nevertheless
14850 2c 20 61 20 64 6f 74 6c 6f 63 6b 20 69 73 20 61  , a dotlock is a
14860 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 6c 6f  n appropriate lo
14870 63 6b 69 6e 67 20 6d 6f 64 65 20 66 6f 72 20 75  cking mode for u
14880 73 65 20 69 66 20 6e 6f 0a 2a 2a 20 6f 74 68 65  se if no.** othe
14890 72 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74 65  r locking strate
148a0 67 79 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e  gy is available.
148b0 0a 2a 2a 0a 2a 2a 20 44 6f 74 66 69 6c 65 20 6c  .**.** Dotfile l
148c0 6f 63 6b 69 6e 67 20 77 6f 72 6b 73 20 62 79 20  ocking works by 
148d0 63 72 65 61 74 69 6e 67 20 61 20 73 75 62 64 69  creating a subdi
148e0 72 65 63 74 6f 72 79 20 69 6e 20 74 68 65 20 73  rectory in the s
148f0 61 6d 65 20 64 69 72 65 63 74 6f 72 79 20 61 73  ame directory as
14900 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
14910 20 61 6e 64 20 77 69 74 68 20 74 68 65 20 73 61   and with the sa
14920 6d 65 20 6e 61 6d 65 20 62 75 74 20 77 69 74 68  me name but with
14930 20 61 20 22 2e 6c 6f 63 6b 22 20 65 78 74 65 6e   a ".lock" exten
14940 73 69 6f 6e 20 61 64 64 65 64 2e 0a 2a 2a 20 54  sion added..** T
14950 68 65 20 65 78 69 73 74 65 6e 63 65 20 6f 66 20  he existence of 
14960 61 20 6c 6f 63 6b 20 64 69 72 65 63 74 6f 72 79  a lock directory
14970 20 69 6d 70 6c 69 65 73 20 61 6e 20 45 58 43 4c   implies an EXCL
14980 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20 41 6c 6c  USIVE lock.  All
14990 20 6f 74 68 65 72 0a 2a 2a 20 6c 6f 63 6b 20 74   other.** lock t
149a0 79 70 65 73 20 28 53 48 41 52 45 44 2c 20 52 45  ypes (SHARED, RE
149b0 53 45 52 56 45 44 2c 20 50 45 4e 44 49 4e 47 29  SERVED, PENDING)
149c0 20 61 72 65 20 6d 61 70 70 65 64 20 69 6e 74 6f   are mapped into
149d0 20 45 58 43 4c 55 53 49 56 45 2e 0a 2a 2f 0a 0a   EXCLUSIVE..*/..
149e0 2f 2a 0a 2a 2a 20 54 68 65 20 66 69 6c 65 20 73  /*.** The file s
149f0 75 66 66 69 78 20 61 64 64 65 64 20 74 6f 20 74  uffix added to t
14a00 68 65 20 64 61 74 61 20 62 61 73 65 20 66 69 6c  he data base fil
14a10 65 6e 61 6d 65 20 69 6e 20 6f 72 64 65 72 20 74  ename in order t
14a20 6f 20 63 72 65 61 74 65 20 74 68 65 0a 2a 2a 20  o create the.** 
14a30 6c 6f 63 6b 20 64 69 72 65 63 74 6f 72 79 2e 0a  lock directory..
14a40 2a 2f 0a 23 64 65 66 69 6e 65 20 44 4f 54 4c 4f  */.#define DOTLO
14a50 43 4b 5f 53 55 46 46 49 58 20 22 2e 6c 6f 63 6b  CK_SUFFIX ".lock
14a60 22 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  "../*.** This ro
14a70 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20  utine checks if 
14a80 74 68 65 72 65 20 69 73 20 61 20 52 45 53 45 52  there is a RESER
14a90 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e  VED lock held on
14aa0 20 74 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a   the specified.*
14ab0 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f  * file by this o
14ac0 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63  r any other proc
14ad0 65 73 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c  ess. If such a l
14ae0 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 73 65 74  ock is held, set
14af0 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20   *pResOut.** to 
14b00 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65  a non-zero value
14b10 20 6f 74 68 65 72 77 69 73 65 20 2a 70 52 65 73   otherwise *pRes
14b20 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65  Out is set to ze
14b30 72 6f 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20  ro.  The return 
14b40 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20  value.** is set 
14b50 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c  to SQLITE_OK unl
14b60 65 73 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72  ess an I/O error
14b70 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 6c   occurs during l
14b80 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2a  ock checking..**
14b90 0a 2a 2a 20 49 6e 20 64 6f 74 66 69 6c 65 20 6c  .** In dotfile l
14ba0 6f 63 6b 69 6e 67 2c 20 65 69 74 68 65 72 20 61  ocking, either a
14bb0 20 6c 6f 63 6b 20 65 78 69 73 74 73 20 6f 72 20   lock exists or 
14bc0 69 74 20 64 6f 65 73 20 6e 6f 74 2e 20 20 53 6f  it does not.  So
14bd0 20 69 6e 20 74 68 69 73 0a 2a 2a 20 76 61 72 69   in this.** vari
14be0 61 74 69 6f 6e 20 6f 66 20 43 68 65 63 6b 52 65  ation of CheckRe
14bf0 73 65 72 76 65 64 4c 6f 63 6b 28 29 2c 20 2a 70  servedLock(), *p
14c00 52 65 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f  ResOut is set to
14c10 20 74 72 75 65 20 69 66 20 61 6e 79 20 6c 6f 63   true if any loc
14c20 6b 0a 2a 2a 20 69 73 20 68 65 6c 64 20 6f 6e 20  k.** is held on 
14c30 74 68 65 20 66 69 6c 65 20 61 6e 64 20 66 61 6c  the file and fal
14c40 73 65 20 69 66 20 74 68 65 20 66 69 6c 65 20 69  se if the file i
14c50 73 20 75 6e 6c 6f 63 6b 65 64 2e 0a 2a 2f 0a 73  s unlocked..*/.s
14c60 74 61 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f 63  tatic int dotloc
14c70 6b 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  kCheckReservedLo
14c80 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
14c90 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75  *id, int *pResOu
14ca0 74 29 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  t) {.  int rc = 
14cb0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
14cc0 20 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20   reserved = 0;. 
14cd0 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
14ce0 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
14cf0 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  ;..  SimulateIOE
14d00 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c  rror( return SQL
14d10 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52  ITE_IOERR_CHECKR
14d20 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a  ESERVEDLOCK; );.
14d30 20 20 0a 20 20 61 73 73 65 72 74 28 20 70 46 69    .  assert( pFi
14d40 6c 65 20 29 3b 0a 20 20 72 65 73 65 72 76 65 64  le );.  reserved
14d50 20 3d 20 6f 73 41 63 63 65 73 73 28 28 63 6f 6e   = osAccess((con
14d60 73 74 20 63 68 61 72 2a 29 70 46 69 6c 65 2d 3e  st char*)pFile->
14d70 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2c 20  lockingContext, 
14d80 30 29 3d 3d 30 3b 0a 20 20 4f 53 54 52 41 43 45  0)==0;.  OSTRACE
14d90 28 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20  (("TEST WR-LOCK 
14da0 25 64 20 25 64 20 25 64 20 28 64 6f 74 6c 6f 63  %d %d %d (dotloc
14db0 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  k)\n", pFile->h,
14dc0 20 72 63 2c 20 72 65 73 65 72 76 65 64 29 29 3b   rc, reserved));
14dd0 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65  .  *pResOut = re
14de0 73 65 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e  served;.  return
14df0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f   rc;.}../*.** Lo
14e00 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74 68  ck the file with
14e10 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66   the lock specif
14e20 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72  ied by parameter
14e30 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65   eFileLock - one
14e40 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  .** of the follo
14e50 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  wing:.**.**     
14e60 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a  (1) SHARED_LOCK.
14e70 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53 45 52  **     (2) RESER
14e80 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20  VED_LOCK.**     
14e90 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b  (3) PENDING_LOCK
14ea0 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c  .**     (4) EXCL
14eb0 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a  USIVE_LOCK.**.**
14ec0 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20   Sometimes when 
14ed0 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c  requesting one l
14ee0 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74  ock state, addit
14ef0 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65  ional lock state
14f00 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65  s.** are inserte
14f10 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54  d in between.  T
14f20 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74  he locking might
14f30 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20   fail on one of 
14f40 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61  the later.** tra
14f50 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67  nsitions leaving
14f60 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20   the lock state 
14f70 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77  different from w
14f80 68 61 74 20 69 74 20 73 74 61 72 74 65 64 20 62  hat it started b
14f90 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72  ut.** still shor
14fa0 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20  t of its goal.  
14fb0 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68  The following ch
14fc0 61 72 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c  art shows the al
14fd0 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74  lowed.** transit
14fe0 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73  ions and the ins
14ff0 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61  erted intermedia
15000 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a  te states:.**.**
15010 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20      UNLOCKED -> 
15020 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41  SHARED.**    SHA
15030 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a  RED -> RESERVED.
15040 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20  **    SHARED -> 
15050 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43  (PENDING) -> EXC
15060 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53  LUSIVE.**    RES
15070 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e  ERVED -> (PENDIN
15080 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a  G) -> EXCLUSIVE.
15090 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e  **    PENDING ->
150a0 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a   EXCLUSIVE.**.**
150b0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   This routine wi
150c0 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65  ll only increase
150d0 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68   a lock.  Use th
150e0 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63  e sqlite3OsUnloc
150f0 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74  k().** routine t
15100 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e  o lower a lockin
15110 67 20 6c 65 76 65 6c 2e 0a 2a 2a 0a 2a 2a 20 57  g level..**.** W
15120 69 74 68 20 64 6f 74 66 69 6c 65 20 6c 6f 63 6b  ith dotfile lock
15130 69 6e 67 2c 20 77 65 20 72 65 61 6c 6c 79 20 6f  ing, we really o
15140 6e 6c 79 20 73 75 70 70 6f 72 74 20 73 74 61 74  nly support stat
15150 65 20 28 34 29 3a 20 45 58 43 4c 55 53 49 56 45  e (4): EXCLUSIVE
15160 2e 0a 2a 2a 20 42 75 74 20 77 65 20 74 72 61 63  ..** But we trac
15170 6b 20 74 68 65 20 6f 74 68 65 72 20 6c 6f 63 6b  k the other lock
15180 69 6e 67 20 6c 65 76 65 6c 73 20 69 6e 74 65 72  ing levels inter
15190 6e 61 6c 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  nally..*/.static
151a0 20 69 6e 74 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b   int dotlockLock
151b0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
151c0 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b  d, int eFileLock
151d0 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  ) {.  unixFile *
151e0 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
151f0 65 2a 29 69 64 3b 0a 20 20 63 68 61 72 20 2a 7a  e*)id;.  char *z
15200 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63 68 61 72  LockFile = (char
15210 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e   *)pFile->lockin
15220 67 43 6f 6e 74 65 78 74 3b 0a 20 20 69 6e 74 20  gContext;.  int 
15230 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
15240 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 68 61 76  ..  /* If we hav
15250 65 20 61 6e 79 20 6c 6f 63 6b 2c 20 74 68 65 6e  e any lock, then
15260 20 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65 20 61   the lock file a
15270 6c 72 65 61 64 79 20 65 78 69 73 74 73 2e 20 20  lready exists.  
15280 41 6c 6c 20 77 65 20 68 61 76 65 0a 20 20 2a 2a  All we have.  **
15290 20 74 6f 20 64 6f 20 69 73 20 61 64 6a 75 73 74   to do is adjust
152a0 20 6f 75 72 20 69 6e 74 65 72 6e 61 6c 20 72 65   our internal re
152b0 63 6f 72 64 20 6f 66 20 74 68 65 20 6c 6f 63 6b  cord of the lock
152c0 20 6c 65 76 65 6c 2e 0a 20 20 2a 2f 0a 20 20 69   level..  */.  i
152d0 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  f( pFile->eFileL
152e0 6f 63 6b 20 3e 20 4e 4f 5f 4c 4f 43 4b 20 29 7b  ock > NO_LOCK ){
152f0 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c  .    pFile->eFil
15300 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63  eLock = eFileLoc
15310 6b 3b 0a 20 20 20 20 2f 2a 20 41 6c 77 61 79 73  k;.    /* Always
15320 20 75 70 64 61 74 65 20 74 68 65 20 74 69 6d 65   update the time
15330 73 74 61 6d 70 20 6f 6e 20 74 68 65 20 6f 6c 64  stamp on the old
15340 20 66 69 6c 65 20 2a 2f 0a 23 69 66 64 65 66 20   file */.#ifdef 
15350 48 41 56 45 5f 55 54 49 4d 45 0a 20 20 20 20 75  HAVE_UTIME.    u
15360 74 69 6d 65 28 7a 4c 6f 63 6b 46 69 6c 65 2c 20  time(zLockFile, 
15370 4e 55 4c 4c 29 3b 0a 23 65 6c 73 65 0a 20 20 20  NULL);.#else.   
15380 20 75 74 69 6d 65 73 28 7a 4c 6f 63 6b 46 69 6c   utimes(zLockFil
15390 65 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6e 64 69 66  e, NULL);.#endif
153a0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
153b0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20  TE_OK;.  }.  .  
153c0 2f 2a 20 67 72 61 62 20 61 6e 20 65 78 63 6c 75  /* grab an exclu
153d0 73 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 72  sive lock */.  r
153e0 63 20 3d 20 6f 73 4d 6b 64 69 72 28 7a 4c 6f 63  c = osMkdir(zLoc
153f0 6b 46 69 6c 65 2c 20 30 37 37 37 29 3b 0a 20 20  kFile, 0777);.  
15400 69 66 28 20 72 63 3c 30 20 29 7b 0a 20 20 20 20  if( rc<0 ){.    
15410 2f 2a 20 66 61 69 6c 65 64 20 74 6f 20 6f 70 65  /* failed to ope
15420 6e 2f 63 72 65 61 74 65 20 74 68 65 20 6c 6f 63  n/create the loc
15430 6b 20 64 69 72 65 63 74 6f 72 79 20 2a 2f 0a 20  k directory */. 
15440 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20     int tErrno = 
15450 65 72 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20 45  errno;.    if( E
15460 45 58 49 53 54 20 3d 3d 20 74 45 72 72 6e 6f 20  EXIST == tErrno 
15470 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
15480 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d  LITE_BUSY;.    }
15490 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 72 63   else {.      rc
154a0 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
154b0 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
154c0 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
154d0 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69  R_LOCK);.      i
154e0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 42 55  f( rc!=SQLITE_BU
154f0 53 59 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74  SY ){.        st
15500 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69  oreLastErrno(pFi
15510 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20  le, tErrno);.   
15520 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72     }.    }.    r
15530 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 20 0a 20  eturn rc;.  } . 
15540 20 0a 20 20 2f 2a 20 67 6f 74 20 69 74 2c 20 73   .  /* got it, s
15550 65 74 20 74 68 65 20 74 79 70 65 20 61 6e 64 20  et the type and 
15560 72 65 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20 70  return ok */.  p
15570 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
15580 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 72  = eFileLock;.  r
15590 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
155a0 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63  ** Lower the loc
155b0 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69  king level on fi
155c0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46  le descriptor pF
155d0 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b  ile to eFileLock
155e0 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20  .  eFileLock.** 
155f0 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20 4e  must be either N
15600 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44  O_LOCK or SHARED
15610 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  _LOCK..**.** If 
15620 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
15630 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65  l of the file de
15640 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65  scriptor is alre
15650 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a  ady at or below.
15660 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ** the requested
15670 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20   locking level, 
15680 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
15690 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 57  a no-op..**.** W
156a0 68 65 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  hen the locking 
156b0 6c 65 76 65 6c 20 72 65 61 63 68 65 73 20 4e 4f  level reaches NO
156c0 5f 4c 4f 43 4b 2c 20 64 65 6c 65 74 65 20 74 68  _LOCK, delete th
156d0 65 20 6c 6f 63 6b 20 66 69 6c 65 2e 0a 2a 2f 0a  e lock file..*/.
156e0 73 74 61 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f  static int dotlo
156f0 63 6b 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33  ckUnlock(sqlite3
15700 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65  _file *id, int e
15710 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e  FileLock) {.  un
15720 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
15730 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
15740 20 63 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65   char *zLockFile
15750 20 3d 20 28 63 68 61 72 20 2a 29 70 46 69 6c 65   = (char *)pFile
15760 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
15770 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  ;.  int rc;..  a
15780 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
15790 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4c 4f    OSTRACE(("UNLO
157a0 43 4b 20 20 25 64 20 25 64 20 77 61 73 20 25 64  CK  %d %d was %d
157b0 20 70 69 64 3d 25 64 20 28 64 6f 74 6c 6f 63 6b   pid=%d (dotlock
157c0 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20  )\n", pFile->h, 
157d0 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20 20  eFileLock,.     
157e0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69        pFile->eFi
157f0 6c 65 4c 6f 63 6b 2c 20 6f 73 47 65 74 70 69 64  leLock, osGetpid
15800 28 30 29 29 29 3b 0a 20 20 61 73 73 65 72 74 28  (0)));.  assert(
15810 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52   eFileLock<=SHAR
15820 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20  ED_LOCK );.  .  
15830 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20 70 6f 73 73  /* no-op if poss
15840 69 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70 46  ible */.  if( pF
15850 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d  ile->eFileLock==
15860 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20  eFileLock ){.   
15870 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
15880 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 6f 20  K;.  }..  /* To 
15890 64 6f 77 6e 67 72 61 64 65 20 74 6f 20 73 68 61  downgrade to sha
158a0 72 65 64 2c 20 73 69 6d 70 6c 79 20 75 70 64 61  red, simply upda
158b0 74 65 20 6f 75 72 20 69 6e 74 65 72 6e 61 6c 20  te our internal 
158c0 6e 6f 74 69 6f 6e 20 6f 66 20 74 68 65 0a 20 20  notion of the.  
158d0 2a 2a 20 6c 6f 63 6b 20 73 74 61 74 65 2e 20 20  ** lock state.  
158e0 4e 6f 20 6e 65 65 64 20 74 6f 20 6d 65 73 73 20  No need to mess 
158f0 77 69 74 68 20 74 68 65 20 66 69 6c 65 20 6f 6e  with the file on
15900 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66   disk..  */.  if
15910 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41  ( eFileLock==SHA
15920 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RED_LOCK ){.    
15930 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
15940 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a   = SHARED_LOCK;.
15950 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
15960 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  E_OK;.  }.  .  /
15970 2a 20 54 6f 20 66 75 6c 6c 79 20 75 6e 6c 6f 63  * To fully unloc
15980 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20  k the database, 
15990 64 65 6c 65 74 65 20 74 68 65 20 6c 6f 63 6b 20  delete the lock 
159a0 66 69 6c 65 20 2a 2f 0a 20 20 61 73 73 65 72 74  file */.  assert
159b0 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f  ( eFileLock==NO_
159c0 4c 4f 43 4b 20 29 3b 0a 20 20 72 63 20 3d 20 6f  LOCK );.  rc = o
159d0 73 52 6d 64 69 72 28 7a 4c 6f 63 6b 46 69 6c 65  sRmdir(zLockFile
159e0 29 3b 0a 20 20 69 66 28 20 72 63 3c 30 20 29 7b  );.  if( rc<0 ){
159f0 0a 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20  .    int tErrno 
15a00 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 69 66 28  = errno;.    if(
15a10 20 74 45 72 72 6e 6f 3d 3d 45 4e 4f 45 4e 54 20   tErrno==ENOENT 
15a20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
15a30 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c  LITE_OK;.    }el
15a40 73 65 7b 0a 23 69 66 20 4f 53 4c 4f 43 4b 49 4e  se{.#if OSLOCKIN
15a50 47 5f 43 48 45 43 4b 5f 42 55 53 59 5f 49 4f 45  G_CHECK_BUSY_IOE
15a60 52 52 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  RR.      rc = sq
15a70 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73  liteErrorFromPos
15a80 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20  ixError(tErrno, 
15a90 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c  SQLITE_IOERR_UNL
15aa0 4f 43 4b 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20  OCK);.#else.    
15ab0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
15ac0 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 23 65 6e 64  ERR_UNLOCK;.#end
15ad0 69 66 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61  if.      storeLa
15ae0 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74  stErrno(pFile, t
15af0 45 72 72 6e 6f 29 3b 0a 20 20 20 20 7d 0a 20 20  Errno);.    }.  
15b00 20 20 72 65 74 75 72 6e 20 72 63 3b 20 0a 20 20    return rc; .  
15b10 7d 0a 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  }.  pFile->eFile
15b20 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a  Lock = NO_LOCK;.
15b30 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
15b40 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  OK;.}../*.** Clo
15b50 73 65 20 61 20 66 69 6c 65 2e 20 20 4d 61 6b 65  se a file.  Make
15b60 20 73 75 72 65 20 74 68 65 20 6c 6f 63 6b 20 68   sure the lock h
15b70 61 73 20 62 65 65 6e 20 72 65 6c 65 61 73 65 64  as been released
15b80 20 62 65 66 6f 72 65 20 63 6c 6f 73 69 6e 67 2e   before closing.
15b90 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
15ba0 6f 74 6c 6f 63 6b 43 6c 6f 73 65 28 73 71 6c 69  otlockClose(sqli
15bb0 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a  te3_file *id) {.
15bc0 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
15bd0 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
15be0 64 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 21  d;.  assert( id!
15bf0 3d 30 20 29 3b 0a 20 20 64 6f 74 6c 6f 63 6b 55  =0 );.  dotlockU
15c00 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43  nlock(id, NO_LOC
15c10 4b 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  K);.  sqlite3_fr
15c20 65 65 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e  ee(pFile->lockin
15c30 67 43 6f 6e 74 65 78 74 29 3b 0a 20 20 72 65 74  gContext);.  ret
15c40 75 72 6e 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c  urn closeUnixFil
15c50 65 28 69 64 29 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a  e(id);.}./******
15c60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64  ************ End
15c70 20 6f 66 20 74 68 65 20 64 6f 74 2d 66 69 6c 65   of the dot-file
15c80 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61   lock implementa
15c90 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  tion ***********
15ca0 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
15cb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15cc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15cd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15ce0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15cf0 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a  *******/../*****
15d00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15d10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15d20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15d30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15d40 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
15d50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15d60 2a 2a 2a 2a 20 42 65 67 69 6e 20 66 6c 6f 63 6b  **** Begin flock
15d70 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a   Locking *******
15d80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15d90 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20  *********.**.** 
15da0 55 73 65 20 74 68 65 20 66 6c 6f 63 6b 28 29 20  Use the flock() 
15db0 73 79 73 74 65 6d 20 63 61 6c 6c 20 74 6f 20 64  system call to d
15dc0 6f 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2e 0a  o file locking..
15dd0 2a 2a 0a 2a 2a 20 66 6c 6f 63 6b 28 29 20 6c 6f  **.** flock() lo
15de0 63 6b 69 6e 67 20 69 73 20 6c 69 6b 65 20 64 6f  cking is like do
15df0 74 2d 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 69  t-file locking i
15e00 6e 20 74 68 61 74 20 74 68 65 20 76 61 72 69 6f  n that the vario
15e10 75 73 0a 2a 2a 20 66 69 6e 65 2d 67 72 61 69 6e  us.** fine-grain
15e20 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 73 20   locking levels 
15e30 73 75 70 70 6f 72 74 65 64 20 62 79 20 53 51 4c  supported by SQL
15e40 69 74 65 20 61 72 65 20 63 6f 6c 6c 61 70 73 65  ite are collapse
15e50 64 20 69 6e 74 6f 0a 2a 2a 20 61 20 73 69 6e 67  d into.** a sing
15e60 6c 65 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  le exclusive loc
15e70 6b 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  k.  In other wor
15e80 64 73 2c 20 53 48 41 52 45 44 2c 20 52 45 53 45  ds, SHARED, RESE
15e90 52 56 45 44 2c 20 61 6e 64 0a 2a 2a 20 50 45 4e  RVED, and.** PEN
15ea0 44 49 4e 47 20 6c 6f 63 6b 73 20 61 72 65 20 74  DING locks are t
15eb0 68 65 20 73 61 6d 65 20 74 68 69 6e 67 20 61 73  he same thing as
15ec0 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
15ed0 63 6b 2e 20 20 53 51 4c 69 74 65 0a 2a 2a 20 73  ck.  SQLite.** s
15ee0 74 69 6c 6c 20 77 6f 72 6b 73 20 77 68 65 6e 20  till works when 
15ef0 79 6f 75 20 64 6f 20 74 68 69 73 2c 20 62 75 74  you do this, but
15f00 20 63 6f 6e 63 75 72 72 65 6e 63 79 20 69 73 20   concurrency is 
15f10 72 65 64 75 63 65 64 20 73 69 6e 63 65 0a 2a 2a  reduced since.**
15f20 20 6f 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 70   only a single p
15f30 72 6f 63 65 73 73 20 63 61 6e 20 62 65 20 72 65  rocess can be re
15f40 61 64 69 6e 67 20 74 68 65 20 64 61 74 61 62 61  ading the databa
15f50 73 65 20 61 74 20 61 20 74 69 6d 65 2e 0a 2a 2a  se at a time..**
15f60 0a 2a 2a 20 4f 6d 69 74 20 74 68 69 73 20 73 65  .** Omit this se
15f70 63 74 69 6f 6e 20 69 66 20 53 51 4c 49 54 45 5f  ction if SQLITE_
15f80 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
15f90 54 59 4c 45 20 69 73 20 74 75 72 6e 65 64 20 6f  TYLE is turned o
15fa0 66 66 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45  ff.*/.#if SQLITE
15fb0 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
15fc0 53 54 59 4c 45 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  STYLE../*.** Ret
15fd0 72 79 20 66 6c 6f 63 6b 28 29 20 63 61 6c 6c 73  ry flock() calls
15fe0 20 74 68 61 74 20 66 61 69 6c 20 77 69 74 68 20   that fail with 
15ff0 45 49 4e 54 52 0a 2a 2f 0a 23 69 66 64 65 66 20  EINTR.*/.#ifdef 
16000 45 49 4e 54 52 0a 73 74 61 74 69 63 20 69 6e 74  EINTR.static int
16010 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 69 6e   robust_flock(in
16020 74 20 66 64 2c 20 69 6e 74 20 6f 70 29 7b 0a 20  t fd, int op){. 
16030 20 69 6e 74 20 72 63 3b 0a 20 20 64 6f 7b 20 72   int rc;.  do{ r
16040 63 20 3d 20 66 6c 6f 63 6b 28 66 64 2c 6f 70 29  c = flock(fd,op)
16050 3b 20 7d 77 68 69 6c 65 28 20 72 63 3c 30 20 26  ; }while( rc<0 &
16060 26 20 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29  & errno==EINTR )
16070 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
16080 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
16090 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 61 2c 62  robust_flock(a,b
160a0 29 20 66 6c 6f 63 6b 28 61 2c 62 29 0a 23 65 6e  ) flock(a,b).#en
160b0 64 69 66 0a 20 20 20 20 20 0a 0a 2f 2a 0a 2a 2a  dif.     ../*.**
160c0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68   This routine ch
160d0 65 63 6b 73 20 69 66 20 74 68 65 72 65 20 69 73  ecks if there is
160e0 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
160f0 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65   held on the spe
16100 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62  cified.** file b
16110 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74  y this or any ot
16120 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20  her process. If 
16130 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68  such a lock is h
16140 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73 4f 75  eld, set *pResOu
16150 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65  t.** to a non-ze
16160 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72 77 69  ro value otherwi
16170 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73  se *pResOut is s
16180 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65  et to zero.  The
16190 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a   return value.**
161a0 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54   is set to SQLIT
161b0 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49  E_OK unless an I
161c0 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  /O error occurs 
161d0 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63  during lock chec
161e0 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  king..*/.static 
161f0 69 6e 74 20 66 6c 6f 63 6b 43 68 65 63 6b 52 65  int flockCheckRe
16200 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74  servedLock(sqlit
16210 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
16220 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e   *pResOut){.  in
16230 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
16240 3b 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65 64  ;.  int reserved
16250 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65   = 0;.  unixFile
16260 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
16270 69 6c 65 2a 29 69 64 3b 0a 20 20 0a 20 20 53 69  ile*)id;.  .  Si
16280 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
16290 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
162a0 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44  RR_CHECKRESERVED
162b0 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73  LOCK; );.  .  as
162c0 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20  sert( pFile );. 
162d0 20 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20   .  /* Check if 
162e0 61 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73  a thread in this
162f0 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73   process holds s
16300 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20  uch a lock */.  
16310 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  if( pFile->eFile
16320 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b  Lock>SHARED_LOCK
16330 20 29 7b 0a 20 20 20 20 72 65 73 65 72 76 65 64   ){.    reserved
16340 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f   = 1;.  }.  .  /
16350 2a 20 4f 74 68 65 72 77 69 73 65 20 73 65 65 20  * Otherwise see 
16360 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72  if some other pr
16370 6f 63 65 73 73 20 68 6f 6c 64 73 20 69 74 2e 20  ocess holds it. 
16380 2a 2f 0a 20 20 69 66 28 20 21 72 65 73 65 72 76  */.  if( !reserv
16390 65 64 20 29 7b 0a 20 20 20 20 2f 2a 20 61 74 74  ed ){.    /* att
163a0 65 6d 70 74 20 74 6f 20 67 65 74 20 74 68 65 20  empt to get the 
163b0 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 69 6e 74 20  lock */.    int 
163c0 6c 72 63 20 3d 20 72 6f 62 75 73 74 5f 66 6c 6f  lrc = robust_flo
163d0 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43  ck(pFile->h, LOC
163e0 4b 5f 45 58 20 7c 20 4c 4f 43 4b 5f 4e 42 29 3b  K_EX | LOCK_NB);
163f0 0a 20 20 20 20 69 66 28 20 21 6c 72 63 20 29 7b  .    if( !lrc ){
16400 0a 20 20 20 20 20 20 2f 2a 20 67 6f 74 20 74 68  .      /* got th
16410 65 20 6c 6f 63 6b 2c 20 75 6e 6c 6f 63 6b 20 69  e lock, unlock i
16420 74 20 2a 2f 0a 20 20 20 20 20 20 6c 72 63 20 3d  t */.      lrc =
16430 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28 70 46   robust_flock(pF
16440 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 55 4e 29  ile->h, LOCK_UN)
16450 3b 0a 20 20 20 20 20 20 69 66 20 28 20 6c 72 63  ;.      if ( lrc
16460 20 29 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74   ) {.        int
16470 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
16480 0a 20 20 20 20 20 20 20 20 2f 2a 20 75 6e 6c 6f  .        /* unlo
16490 63 6b 20 66 61 69 6c 65 64 20 77 69 74 68 20 61  ck failed with a
164a0 6e 20 65 72 72 6f 72 20 2a 2f 0a 23 69 66 20 4f  n error */.#if O
164b0 53 4c 4f 43 4b 49 4e 47 5f 43 48 45 43 4b 5f 42  SLOCKING_CHECK_B
164c0 55 53 59 5f 49 4f 45 52 52 0a 20 20 20 20 20 20  USY_IOERR.      
164d0 20 20 6c 72 63 20 3d 20 73 71 6c 69 74 65 45 72    lrc = sqliteEr
164e0 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f  rorFromPosixErro
164f0 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45  r(tErrno, SQLITE
16500 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a  _IOERR_UNLOCK);.
16510 23 65 6c 73 65 20 0a 20 20 20 20 20 20 20 20 6c  #else .        l
16520 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
16530 52 5f 55 4e 4c 4f 43 4b 3b 20 0a 23 65 6e 64 69  R_UNLOCK; .#endi
16540 66 0a 20 20 20 20 20 20 20 20 69 66 28 20 49 53  f.        if( IS
16550 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 29  _LOCK_ERROR(lrc)
16560 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74   ){.          st
16570 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69  oreLastErrno(pFi
16580 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20  le, tErrno);.   
16590 20 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63 3b         rc = lrc;
165a0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
165b0 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e     storeLastErrn
165c0 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29  o(pFile, tErrno)
165d0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 6c  ;.        rc = l
165e0 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
165f0 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 69  } else {.      i
16600 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  nt tErrno = errn
16610 6f 3b 0a 20 20 20 20 20 20 72 65 73 65 72 76 65  o;.      reserve
16620 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 2f 2a 20  d = 1;.      /* 
16630 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 6d 69 67  someone else mig
16640 68 74 20 68 61 76 65 20 69 74 20 72 65 73 65 72  ht have it reser
16650 76 65 64 20 2a 2f 0a 20 20 20 20 20 20 6c 72 63  ved */.      lrc
16660 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
16670 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
16680 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
16690 52 5f 4c 4f 43 4b 29 3b 20 0a 20 20 20 20 20 20  R_LOCK); .      
166a0 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f  if( IS_LOCK_ERRO
166b0 52 28 6c 72 63 29 20 29 7b 0a 20 20 20 20 20 20  R(lrc) ){.      
166c0 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f    storeLastErrno
166d0 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b  (pFile, tErrno);
166e0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 6c 72  .        rc = lr
166f0 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  c;.      }.    }
16700 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28  .  }.  OSTRACE((
16710 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64  "TEST WR-LOCK %d
16720 20 25 64 20 25 64 20 28 66 6c 6f 63 6b 29 5c 6e   %d %d (flock)\n
16730 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c  ", pFile->h, rc,
16740 20 72 65 73 65 72 76 65 64 29 29 3b 0a 0a 23 69   reserved));..#i
16750 66 64 65 66 20 53 51 4c 49 54 45 5f 49 47 4e 4f  fdef SQLITE_IGNO
16760 52 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52  RE_FLOCK_LOCK_ER
16770 52 4f 52 53 0a 20 20 69 66 28 20 28 72 63 20 26  RORS.  if( (rc &
16780 20 30 78 66 66 29 20 3d 3d 20 53 51 4c 49 54 45   0xff) == SQLITE
16790 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20 20 72 63  _IOERR ){.    rc
167a0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
167b0 20 20 72 65 73 65 72 76 65 64 3d 31 3b 0a 20 20    reserved=1;.  
167c0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
167d0 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f  TE_IGNORE_FLOCK_
167e0 4c 4f 43 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a 20  LOCK_ERRORS */. 
167f0 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65   *pResOut = rese
16800 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72  rved;.  return r
16810 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b  c;.}../*.** Lock
16820 20 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74   the file with t
16830 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65  he lock specifie
16840 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 65  d by parameter e
16850 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a  FileLock - one.*
16860 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  * of the followi
16870 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31  ng:.**.**     (1
16880 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a  ) SHARED_LOCK.**
16890 20 20 20 20 20 28 32 29 20 52 45 53 45 52 56 45       (2) RESERVE
168a0 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33  D_LOCK.**     (3
168b0 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a  ) PENDING_LOCK.*
168c0 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c 55 53  *     (4) EXCLUS
168d0 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53  IVE_LOCK.**.** S
168e0 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65  ometimes when re
168f0 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63  questing one loc
16900 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f  k state, additio
16910 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a  nal lock states.
16920 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64 20  ** are inserted 
16930 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65  in between.  The
16940 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66   locking might f
16950 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68  ail on one of th
16960 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73  e later.** trans
16970 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74  itions leaving t
16980 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69  he lock state di
16990 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61  fferent from wha
169a0 74 20 69 74 20 73 74 61 72 74 65 64 20 62 75 74  t it started but
169b0 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20  .** still short 
169c0 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68  of its goal.  Th
169d0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72  e following char
169e0 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f  t shows the allo
169f0 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f  wed.** transitio
16a00 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72  ns and the inser
16a10 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65  ted intermediate
16a20 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20   states:.**.**  
16a30 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48    UNLOCKED -> SH
16a40 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45  ARED.**    SHARE
16a50 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a  D -> RESERVED.**
16a60 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50      SHARED -> (P
16a70 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55  ENDING) -> EXCLU
16a80 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52  SIVE.**    RESER
16a90 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  VED -> (PENDING)
16aa0 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
16ab0 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45      PENDING -> E
16ac0 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 66  XCLUSIVE.**.** f
16ad0 6c 6f 63 6b 28 29 20 6f 6e 6c 79 20 72 65 61 6c  lock() only real
16ae0 6c 79 20 73 75 70 70 6f 72 74 20 45 58 43 4c 55  ly support EXCLU
16af0 53 49 56 45 20 6c 6f 63 6b 73 2e 20 20 57 65 20  SIVE locks.  We 
16b00 74 72 61 63 6b 20 69 6e 74 65 72 6d 65 64 69 61  track intermedia
16b10 74 65 0a 2a 2a 20 6c 6f 63 6b 20 73 74 61 74 65  te.** lock state
16b20 73 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65 33  s in the sqlite3
16b30 5f 66 69 6c 65 20 73 74 72 75 63 74 75 72 65 2c  _file structure,
16b40 20 62 75 74 20 61 6c 6c 20 6c 6f 63 6b 73 20 53   but all locks S
16b50 48 41 52 45 44 20 6f 72 0a 2a 2a 20 61 62 6f 76  HARED or.** abov
16b60 65 20 61 72 65 20 72 65 61 6c 6c 79 20 45 58 43  e are really EXC
16b70 4c 55 53 49 56 45 20 6c 6f 63 6b 73 20 61 6e 64  LUSIVE locks and
16b80 20 65 78 63 6c 75 64 65 20 61 6c 6c 20 6f 74 68   exclude all oth
16b90 65 72 20 70 72 6f 63 65 73 73 65 73 20 66 72 6f  er processes fro
16ba0 6d 0a 2a 2a 20 61 63 63 65 73 73 20 74 68 65 20  m.** access the 
16bb0 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  file..**.** This
16bc0 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e   routine will on
16bd0 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f  ly increase a lo
16be0 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c  ck.  Use the sql
16bf0 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a  ite3OsUnlock().*
16c00 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77  * routine to low
16c10 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  er a locking lev
16c20 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  el..*/.static in
16c30 74 20 66 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69  t flockLock(sqli
16c40 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
16c50 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20  t eFileLock) {. 
16c60 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
16c70 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20  _OK;.  unixFile 
16c80 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
16c90 6c 65 2a 29 69 64 3b 0a 0a 20 20 61 73 73 65 72  le*)id;..  asser
16ca0 74 28 20 70 46 69 6c 65 20 29 3b 0a 0a 20 20 2f  t( pFile );..  /
16cb0 2a 20 69 66 20 77 65 20 61 6c 72 65 61 64 79 20  * if we already 
16cc0 68 61 76 65 20 61 20 6c 6f 63 6b 2c 20 69 74 20  have a lock, it 
16cd0 69 73 20 65 78 63 6c 75 73 69 76 65 2e 20 20 0a  is exclusive.  .
16ce0 20 20 2a 2a 20 4a 75 73 74 20 61 64 6a 75 73 74    ** Just adjust
16cf0 20 6c 65 76 65 6c 20 61 6e 64 20 70 75 6e 74 20   level and punt 
16d00 6f 6e 20 6f 75 74 74 61 20 68 65 72 65 2e 20 2a  on outta here. *
16d10 2f 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 65  /.  if (pFile->e
16d20 46 69 6c 65 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c 4f  FileLock > NO_LO
16d30 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d  CK) {.    pFile-
16d40 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69  >eFileLock = eFi
16d50 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 72 65 74 75  leLock;.    retu
16d60 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
16d70 7d 0a 20 20 0a 20 20 2f 2a 20 67 72 61 62 20 61  }.  .  /* grab a
16d80 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
16d90 20 2a 2f 0a 20 20 0a 20 20 69 66 20 28 72 6f 62   */.  .  if (rob
16da0 75 73 74 5f 66 6c 6f 63 6b 28 70 46 69 6c 65 2d  ust_flock(pFile-
16db0 3e 68 2c 20 4c 4f 43 4b 5f 45 58 20 7c 20 4c 4f  >h, LOCK_EX | LO
16dc0 43 4b 5f 4e 42 29 29 20 7b 0a 20 20 20 20 69 6e  CK_NB)) {.    in
16dd0 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  t tErrno = errno
16de0 3b 0a 20 20 20 20 2f 2a 20 64 69 64 6e 27 74 20  ;.    /* didn't 
16df0 67 65 74 2c 20 6d 75 73 74 20 62 65 20 62 75 73  get, must be bus
16e00 79 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71  y */.    rc = sq
16e10 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73  liteErrorFromPos
16e20 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20  ixError(tErrno, 
16e30 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43  SQLITE_IOERR_LOC
16e40 4b 29 3b 0a 20 20 20 20 69 66 28 20 49 53 5f 4c  K);.    if( IS_L
16e50 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b  OCK_ERROR(rc) ){
16e60 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74  .      storeLast
16e70 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72  Errno(pFile, tEr
16e80 72 6e 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 20  rno);.    }.  } 
16e90 65 6c 73 65 20 7b 0a 20 20 20 20 2f 2a 20 67 6f  else {.    /* go
16ea0 74 20 69 74 2c 20 73 65 74 20 74 68 65 20 74 79  t it, set the ty
16eb0 70 65 20 61 6e 64 20 72 65 74 75 72 6e 20 6f 6b  pe and return ok
16ec0 20 2a 2f 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65   */.    pFile->e
16ed0 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65  FileLock = eFile
16ee0 4c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 4f 53 54 52  Lock;.  }.  OSTR
16ef0 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64  ACE(("LOCK    %d
16f00 20 25 73 20 25 73 20 28 66 6c 6f 63 6b 29 5c 6e   %s %s (flock)\n
16f10 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 61 7a 46  ", pFile->h, azF
16f20 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63  ileLock(eFileLoc
16f30 6b 29 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  k), .           
16f40 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20  rc==SQLITE_OK ? 
16f50 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29  "ok" : "failed")
16f60 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
16f70 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f 4c 4f  _IGNORE_FLOCK_LO
16f80 43 4b 5f 45 52 52 4f 52 53 0a 20 20 69 66 28 20  CK_ERRORS.  if( 
16f90 28 72 63 20 26 20 30 78 66 66 29 20 3d 3d 20 53  (rc & 0xff) == S
16fa0 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20  QLITE_IOERR ){. 
16fb0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
16fc0 55 53 59 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20  USY;.  }.#endif 
16fd0 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45  /* SQLITE_IGNORE
16fe0 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f  _FLOCK_LOCK_ERRO
16ff0 52 53 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72  RS */.  return r
17000 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77  c;.}.../*.** Low
17010 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  er the locking l
17020 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73  evel on file des
17030 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f  criptor pFile to
17040 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69   eFileLock.  eFi
17050 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62  leLock.** must b
17060 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b  e either NO_LOCK
17070 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e   or SHARED_LOCK.
17080 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f  .**.** If the lo
17090 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74  cking level of t
170a0 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
170b0 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74  or is already at
170c0 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65   or below.** the
170d0 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69   requested locki
170e0 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72  ng level, this r
170f0 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
17100 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  p..*/.static int
17110 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 73 71 6c   flockUnlock(sql
17120 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
17130 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a  nt eFileLock) {.
17140 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
17150 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
17160 64 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20  d;.  .  assert( 
17170 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41  pFile );.  OSTRA
17180 43 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20  CE(("UNLOCK  %d 
17190 25 64 20 77 61 73 20 25 64 20 70 69 64 3d 25 64  %d was %d pid=%d
171a0 20 28 66 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69   (flock)\n", pFi
171b0 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b  le->h, eFileLock
171c0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46 69  ,.           pFi
171d0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 6f  le->eFileLock, o
171e0 73 47 65 74 70 69 64 28 30 29 29 29 3b 0a 20 20  sGetpid(0)));.  
171f0 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63  assert( eFileLoc
17200 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k<=SHARED_LOCK )
17210 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f 70 20  ;.  .  /* no-op 
17220 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 20  if possible */. 
17230 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c   if( pFile->eFil
17240 65 4c 6f 63 6b 3d 3d 65 46 69 6c 65 4c 6f 63 6b  eLock==eFileLock
17250 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
17260 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
17270 0a 20 20 2f 2a 20 73 68 61 72 65 64 20 63 61 6e  .  /* shared can
17280 20 6a 75 73 74 20 62 65 20 73 65 74 20 62 65 63   just be set bec
17290 61 75 73 65 20 77 65 20 61 6c 77 61 79 73 20 68  ause we always h
172a0 61 76 65 20 61 6e 20 65 78 63 6c 75 73 69 76 65  ave an exclusive
172b0 20 2a 2f 0a 20 20 69 66 20 28 65 46 69 6c 65 4c   */.  if (eFileL
172c0 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
172d0 29 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65  ) {.    pFile->e
172e0 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65  FileLock = eFile
172f0 4c 6f 63 6b 3b 0a 20 20 20 20 72 65 74 75 72 6e  Lock;.    return
17300 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
17310 20 20 0a 20 20 2f 2a 20 6e 6f 2c 20 72 65 61 6c    .  /* no, real
17320 6c 79 2c 20 75 6e 6c 6f 63 6b 2e 20 2a 2f 0a 20  ly, unlock. */. 
17330 20 69 66 28 20 72 6f 62 75 73 74 5f 66 6c 6f 63   if( robust_floc
17340 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b  k(pFile->h, LOCK
17350 5f 55 4e 29 20 29 7b 0a 23 69 66 64 65 66 20 53  _UN) ){.#ifdef S
17360 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f  QLITE_IGNORE_FLO
17370 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20  CK_LOCK_ERRORS. 
17380 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
17390 5f 4f 4b 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53  _OK;.#endif /* S
173a0 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f  QLITE_IGNORE_FLO
173b0 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 20 2a  CK_LOCK_ERRORS *
173c0 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  /.    return SQL
173d0 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
173e0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
173f0 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
17400 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 72  = NO_LOCK;.    r
17410 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
17420 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  .  }.}../*.** Cl
17430 6f 73 65 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73  ose a file..*/.s
17440 74 61 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b 43  tatic int flockC
17450 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  lose(sqlite3_fil
17460 65 20 2a 69 64 29 20 7b 0a 20 20 61 73 73 65 72  e *id) {.  asser
17470 74 28 20 69 64 21 3d 30 20 29 3b 0a 20 20 66 6c  t( id!=0 );.  fl
17480 6f 63 6b 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f  ockUnlock(id, NO
17490 5f 4c 4f 43 4b 29 3b 0a 20 20 72 65 74 75 72 6e  _LOCK);.  return
174a0 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69   closeUnixFile(i
174b0 64 29 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a  d);.}..#endif /*
174c0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
174d0 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20  OCKING_STYLE && 
174e0 21 4f 53 5f 56 58 57 4f 52 4b 20 2a 2f 0a 0a 2f  !OS_VXWORK */../
174f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17500 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 66  *** End of the f
17510 6c 6f 63 6b 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d  lock lock implem
17520 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a  entation *******
17530 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
17540 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17550 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17560 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17570 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17580 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
17590 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
175a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
175b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
175c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
175d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
175e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
175f0 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 4e  ******** Begin N
17600 61 6d 65 64 20 53 65 6d 61 70 68 6f 72 65 20 4c  amed Semaphore L
17610 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ocking *********
17620 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
17630 2a 2a 0a 2a 2a 20 4e 61 6d 65 64 20 73 65 6d 61  **.** Named sema
17640 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 69 73  phore locking is
17650 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 65 64 20   only supported 
17660 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a 0a 2a  on VxWorks..**.*
17670 2a 20 53 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b  * Semaphore lock
17680 69 6e 67 20 69 73 20 6c 69 6b 65 20 64 6f 74 2d  ing is like dot-
17690 6c 6f 63 6b 20 61 6e 64 20 66 6c 6f 63 6b 20 69  lock and flock i
176a0 6e 20 74 68 61 74 20 69 74 20 72 65 61 6c 6c 79  n that it really
176b0 20 6f 6e 6c 79 0a 2a 2a 20 73 75 70 70 6f 72 74   only.** support
176c0 73 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  s EXCLUSIVE lock
176d0 69 6e 67 2e 20 20 4f 6e 6c 79 20 61 20 73 69 6e  ing.  Only a sin
176e0 67 6c 65 20 70 72 6f 63 65 73 73 20 63 61 6e 20  gle process can 
176f0 72 65 61 64 20 6f 72 20 77 72 69 74 65 0a 2a 2a  read or write.**
17700 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
17710 6c 65 20 61 74 20 61 20 74 69 6d 65 2e 20 20 54  le at a time.  T
17720 68 69 73 20 72 65 64 75 63 65 73 20 70 6f 74 65  his reduces pote
17730 6e 74 69 61 6c 20 63 6f 6e 63 75 72 72 65 6e 63  ntial concurrenc
17740 79 2c 20 62 75 74 0a 2a 2a 20 6d 61 6b 65 73 20  y, but.** makes 
17750 74 68 65 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65  the lock impleme
17760 6e 74 61 74 69 6f 6e 20 6d 75 63 68 20 65 61 73  ntation much eas
17770 69 65 72 2e 0a 2a 2f 0a 23 69 66 20 4f 53 5f 56  ier..*/.#if OS_V
17780 58 57 4f 52 4b 53 0a 0a 2f 2a 0a 2a 2a 20 54 68  XWORKS../*.** Th
17790 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b  is routine check
177a0 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20  s if there is a 
177b0 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65  RESERVED lock he
177c0 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66  ld on the specif
177d0 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74  ied.** file by t
177e0 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72  his or any other
177f0 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63   process. If suc
17800 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  h a lock is held
17810 2c 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a  , set *pResOut.*
17820 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20  * to a non-zero 
17830 76 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20  value otherwise 
17840 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65 74 20  *pResOut is set 
17850 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65  to zero.  The re
17860 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73  turn value.** is
17870 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f   set to SQLITE_O
17880 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20  K unless an I/O 
17890 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72  error occurs dur
178a0 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e  ing lock checkin
178b0 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
178c0 20 73 65 6d 58 43 68 65 63 6b 52 65 73 65 72 76   semXCheckReserv
178d0 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  edLock(sqlite3_f
178e0 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52  ile *id, int *pR
178f0 65 73 4f 75 74 29 20 7b 0a 20 20 69 6e 74 20 72  esOut) {.  int r
17900 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
17910 20 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d 20   int reserved = 
17920 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  0;.  unixFile *p
17930 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
17940 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61 74  *)id;..  Simulat
17950 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e  eIOError( return
17960 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48   SQLITE_IOERR_CH
17970 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b  ECKRESERVEDLOCK;
17980 20 29 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28   );.  .  assert(
17990 20 70 46 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20   pFile );..  /* 
179a0 43 68 65 63 6b 20 69 66 20 61 20 74 68 72 65 61  Check if a threa
179b0 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73  d in this proces
179c0 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c  s holds such a l
179d0 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ock */.  if( pFi
179e0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48  le->eFileLock>SH
179f0 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
17a00 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20   reserved = 1;. 
17a10 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74 68 65 72   }.  .  /* Other
17a20 77 69 73 65 20 73 65 65 20 69 66 20 73 6f 6d 65  wise see if some
17a30 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 68   other process h
17a40 6f 6c 64 73 20 69 74 2e 20 2a 2f 0a 20 20 69 66  olds it. */.  if
17a50 28 20 21 72 65 73 65 72 76 65 64 20 29 7b 0a 20  ( !reserved ){. 
17a60 20 20 20 73 65 6d 5f 74 20 2a 70 53 65 6d 20 3d     sem_t *pSem =
17a70 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e   pFile->pInode->
17a80 70 53 65 6d 3b 0a 0a 20 20 20 20 69 66 28 20 73  pSem;..    if( s
17a90 65 6d 5f 74 72 79 77 61 69 74 28 70 53 65 6d 29  em_trywait(pSem)
17aa0 3d 3d 2d 31 20 29 7b 0a 20 20 20 20 20 20 69 6e  ==-1 ){.      in
17ab0 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  t tErrno = errno
17ac0 3b 0a 20 20 20 20 20 20 69 66 28 20 45 41 47 41  ;.      if( EAGA
17ad0 49 4e 20 21 3d 20 74 45 72 72 6e 6f 20 29 7b 0a  IN != tErrno ){.
17ae0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
17af0 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69  iteErrorFromPosi
17b00 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53  xError(tErrno, S
17b10 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43  QLITE_IOERR_CHEC
17b20 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 29 3b 0a  KRESERVEDLOCK);.
17b30 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73          storeLas
17b40 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45  tErrno(pFile, tE
17b50 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 20 65  rrno);.      } e
17b60 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a  lse {.        /*
17b70 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 68 61   someone else ha
17b80 73 20 74 68 65 20 6c 6f 63 6b 20 77 68 65 6e 20  s the lock when 
17b90 77 65 20 61 72 65 20 69 6e 20 4e 4f 5f 4c 4f 43  we are in NO_LOC
17ba0 4b 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 73  K */.        res
17bb0 65 72 76 65 64 20 3d 20 28 70 46 69 6c 65 2d 3e  erved = (pFile->
17bc0 65 46 69 6c 65 4c 6f 63 6b 20 3c 20 53 48 41 52  eFileLock < SHAR
17bd0 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  ED_LOCK);.      
17be0 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
17bf0 20 20 20 2f 2a 20 77 65 20 63 6f 75 6c 64 20 68     /* we could h
17c00 61 76 65 20 69 74 20 69 66 20 77 65 20 77 61 6e  ave it if we wan
17c10 74 20 69 74 20 2a 2f 0a 20 20 20 20 20 20 73 65  t it */.      se
17c20 6d 5f 70 6f 73 74 28 70 53 65 6d 29 3b 0a 20 20  m_post(pSem);.  
17c30 20 20 7d 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43    }.  }.  OSTRAC
17c40 45 28 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b  E(("TEST WR-LOCK
17c50 20 25 64 20 25 64 20 25 64 20 28 73 65 6d 29 5c   %d %d %d (sem)\
17c60 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63  n", pFile->h, rc
17c70 2c 20 72 65 73 65 72 76 65 64 29 29 3b 0a 0a 20  , reserved));.. 
17c80 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65   *pResOut = rese
17c90 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72  rved;.  return r
17ca0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b  c;.}../*.** Lock
17cb0 20 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74   the file with t
17cc0 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65  he lock specifie
17cd0 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 65  d by parameter e
17ce0 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a  FileLock - one.*
17cf0 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  * of the followi
17d00 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31  ng:.**.**     (1
17d10 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a  ) SHARED_LOCK.**
17d20 20 20 20 20 20 28 32 29 20 52 45 53 45 52 56 45       (2) RESERVE
17d30 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33  D_LOCK.**     (3
17d40 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a  ) PENDING_LOCK.*
17d50 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c 55 53  *     (4) EXCLUS
17d60 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53  IVE_LOCK.**.** S
17d70 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65  ometimes when re
17d80 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63  questing one loc
17d90 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f  k state, additio
17da0 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a  nal lock states.
17db0 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64 20  ** are inserted 
17dc0 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65  in between.  The
17dd0 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66   locking might f
17de0 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68  ail on one of th
17df0 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73  e later.** trans
17e00 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74  itions leaving t
17e10 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69  he lock state di
17e20 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61  fferent from wha
17e30 74 20 69 74 20 73 74 61 72 74 65 64 20 62 75 74  t it started but
17e40 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20  .** still short 
17e50 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68  of its goal.  Th
17e60 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72  e following char
17e70 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f  t shows the allo
17e80 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f  wed.** transitio
17e90 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72  ns and the inser
17ea0 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65  ted intermediate
17eb0 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20   states:.**.**  
17ec0 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48    UNLOCKED -> SH
17ed0 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45  ARED.**    SHARE
17ee0 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a  D -> RESERVED.**
17ef0 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50      SHARED -> (P
17f00 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55  ENDING) -> EXCLU
17f10 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52  SIVE.**    RESER
17f20 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  VED -> (PENDING)
17f30 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
17f40 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45      PENDING -> E
17f50 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 53  XCLUSIVE.**.** S
17f60 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 73 20 6f  emaphore locks o
17f70 6e 6c 79 20 72 65 61 6c 6c 79 20 73 75 70 70 6f  nly really suppo
17f80 72 74 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  rt EXCLUSIVE loc
17f90 6b 73 2e 20 20 57 65 20 74 72 61 63 6b 20 69 6e  ks.  We track in
17fa0 74 65 72 6d 65 64 69 61 74 65 0a 2a 2a 20 6c 6f  termediate.** lo
17fb0 63 6b 20 73 74 61 74 65 73 20 69 6e 20 74 68 65  ck states in the
17fc0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 73 74   sqlite3_file st
17fd0 72 75 63 74 75 72 65 2c 20 62 75 74 20 61 6c 6c  ructure, but all
17fe0 20 6c 6f 63 6b 73 20 53 48 41 52 45 44 20 6f 72   locks SHARED or
17ff0 0a 2a 2a 20 61 62 6f 76 65 20 61 72 65 20 72 65  .** above are re
18000 61 6c 6c 79 20 45 58 43 4c 55 53 49 56 45 20 6c  ally EXCLUSIVE l
18010 6f 63 6b 73 20 61 6e 64 20 65 78 63 6c 75 64 65  ocks and exclude
18020 20 61 6c 6c 20 6f 74 68 65 72 20 70 72 6f 63 65   all other proce
18030 73 73 65 73 20 66 72 6f 6d 0a 2a 2a 20 61 63 63  sses from.** acc
18040 65 73 73 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a  ess the file..**
18050 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
18060 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65   will only incre
18070 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65  ase a lock.  Use
18080 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e   the sqlite3OsUn
18090 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e  lock().** routin
180a0 65 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63  e to lower a loc
180b0 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73  king level..*/.s
180c0 74 61 74 69 63 20 69 6e 74 20 73 65 6d 58 4c 6f  tatic int semXLo
180d0 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
180e0 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f  *id, int eFileLo
180f0 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65  ck) {.  unixFile
18100 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
18110 69 6c 65 2a 29 69 64 3b 0a 20 20 73 65 6d 5f 74  ile*)id;.  sem_t
18120 20 2a 70 53 65 6d 20 3d 20 70 46 69 6c 65 2d 3e   *pSem = pFile->
18130 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 3b 0a 20 20  pInode->pSem;.  
18140 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
18150 4f 4b 3b 0a 0a 20 20 2f 2a 20 69 66 20 77 65 20  OK;..  /* if we 
18160 61 6c 72 65 61 64 79 20 68 61 76 65 20 61 20 6c  already have a l
18170 6f 63 6b 2c 20 69 74 20 69 73 20 65 78 63 6c 75  ock, it is exclu
18180 73 69 76 65 2e 20 20 0a 20 20 2a 2a 20 4a 75 73  sive.  .  ** Jus
18190 74 20 61 64 6a 75 73 74 20 6c 65 76 65 6c 20 61  t adjust level a
181a0 6e 64 20 70 75 6e 74 20 6f 6e 20 6f 75 74 74 61  nd punt on outta
181b0 20 68 65 72 65 2e 20 2a 2f 0a 20 20 69 66 20 28   here. */.  if (
181c0 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
181d0 20 3e 20 4e 4f 5f 4c 4f 43 4b 29 20 7b 0a 20 20   > NO_LOCK) {.  
181e0 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
181f0 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a  ck = eFileLock;.
18200 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
18210 4f 4b 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6d  OK;.    goto sem
18220 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 20  _end_lock;.  }. 
18230 20 0a 20 20 2f 2a 20 6c 6f 63 6b 20 73 65 6d 61   .  /* lock sema
18240 70 68 6f 72 65 20 6e 6f 77 20 62 75 74 20 62 61  phore now but ba
18250 69 6c 20 6f 75 74 20 77 68 65 6e 20 61 6c 72 65  il out when alre
18260 61 64 79 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a 20  ady locked. */. 
18270 20 69 66 28 20 73 65 6d 5f 74 72 79 77 61 69 74   if( sem_trywait
18280 28 70 53 65 6d 29 3d 3d 2d 31 20 29 7b 0a 20 20  (pSem)==-1 ){.  
18290 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
182a0 53 59 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6d  SY;.    goto sem
182b0 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a  _end_lock;.  }..
182c0 20 20 2f 2a 20 67 6f 74 20 69 74 2c 20 73 65 74    /* got it, set
182d0 20 74 68 65 20 74 79 70 65 20 61 6e 64 20 72 65   the type and re
182e0 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20 70 46 69  turn ok */.  pFi
182f0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
18300 65 46 69 6c 65 4c 6f 63 6b 3b 0a 0a 20 73 65 6d  eFileLock;.. sem
18310 5f 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 72 65 74  _end_lock:.  ret
18320 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
18330 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69   Lower the locki
18340 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65  ng level on file
18350 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c   descriptor pFil
18360 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20  e to eFileLock. 
18370 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75   eFileLock.** mu
18380 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f  st be either NO_
18390 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c  LOCK or SHARED_L
183a0 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  OCK..**.** If th
183b0 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
183c0 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  of the file desc
183d0 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64  riptor is alread
183e0 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a  y at or below.**
183f0 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
18400 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68  ocking level, th
18410 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
18420 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
18430 20 69 6e 74 20 73 65 6d 58 55 6e 6c 6f 63 6b 28   int semXUnlock(
18440 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
18450 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29  , int eFileLock)
18460 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70   {.  unixFile *p
18470 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
18480 2a 29 69 64 3b 0a 20 20 73 65 6d 5f 74 20 2a 70  *)id;.  sem_t *p
18490 53 65 6d 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e  Sem = pFile->pIn
184a0 6f 64 65 2d 3e 70 53 65 6d 3b 0a 0a 20 20 61 73  ode->pSem;..  as
184b0 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20  sert( pFile );. 
184c0 20 61 73 73 65 72 74 28 20 70 53 65 6d 20 29 3b   assert( pSem );
184d0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4c  .  OSTRACE(("UNL
184e0 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73 20 25  OCK  %d %d was %
184f0 64 20 70 69 64 3d 25 64 20 28 73 65 6d 29 5c 6e  d pid=%d (sem)\n
18500 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69  ", pFile->h, eFi
18510 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20  leLock,.        
18520 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
18530 6f 63 6b 2c 20 6f 73 47 65 74 70 69 64 28 30 29  ock, osGetpid(0)
18540 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46  ));.  assert( eF
18550 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f  ileLock<=SHARED_
18560 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20  LOCK );.  .  /* 
18570 6e 6f 2d 6f 70 20 69 66 20 70 6f 73 73 69 62 6c  no-op if possibl
18580 65 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65  e */.  if( pFile
18590 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 65 46 69  ->eFileLock==eFi
185a0 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65  leLock ){.    re
185b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
185c0 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 73 68 61 72    }.  .  /* shar
185d0 65 64 20 63 61 6e 20 6a 75 73 74 20 62 65 20 73  ed can just be s
185e0 65 74 20 62 65 63 61 75 73 65 20 77 65 20 61 6c  et because we al
185f0 77 61 79 73 20 68 61 76 65 20 61 6e 20 65 78 63  ways have an exc
18600 6c 75 73 69 76 65 20 2a 2f 0a 20 20 69 66 20 28  lusive */.  if (
18610 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
18620 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46  D_LOCK) {.    pF
18630 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
18640 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20   eFileLock;.    
18650 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
18660 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 6e 6f  ;.  }.  .  /* no
18670 2c 20 72 65 61 6c 6c 79 20 75 6e 6c 6f 63 6b 2e  , really unlock.
18680 20 2a 2f 0a 20 20 69 66 20 28 20 73 65 6d 5f 70   */.  if ( sem_p
18690 6f 73 74 28 70 53 65 6d 29 3d 3d 2d 31 20 29 20  ost(pSem)==-1 ) 
186a0 7b 0a 20 20 20 20 69 6e 74 20 72 63 2c 20 74 45  {.    int rc, tE
186b0 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
186c0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72    rc = sqliteErr
186d0 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72  orFromPosixError
186e0 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f  (tErrno, SQLITE_
186f0 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 20  IOERR_UNLOCK);. 
18700 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
18710 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20  RROR(rc) ){.    
18720 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f    storeLastErrno
18730 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b  (pFile, tErrno);
18740 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
18750 6e 20 72 63 3b 20 0a 20 20 7d 0a 20 20 70 46 69  n rc; .  }.  pFi
18760 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
18770 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 72 65 74 75 72  NO_LOCK;.  retur
18780 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
18790 2f 2a 0a 20 2a 2a 20 43 6c 6f 73 65 20 61 20 66  /*. ** Close a f
187a0 69 6c 65 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20  ile.. */.static 
187b0 69 6e 74 20 73 65 6d 58 43 6c 6f 73 65 28 73 71  int semXClose(sq
187c0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20  lite3_file *id) 
187d0 7b 0a 20 20 69 66 28 20 69 64 20 29 7b 0a 20 20  {.  if( id ){.  
187e0 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
187f0 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
18800 64 3b 0a 20 20 20 20 73 65 6d 58 55 6e 6c 6f 63  d;.    semXUnloc
18810 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a  k(id, NO_LOCK);.
18820 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c      assert( pFil
18830 65 20 29 3b 0a 20 20 20 20 75 6e 69 78 45 6e 74  e );.    unixEnt
18840 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 72  erMutex();.    r
18850 65 6c 65 61 73 65 49 6e 6f 64 65 49 6e 66 6f 28  eleaseInodeInfo(
18860 70 46 69 6c 65 29 3b 0a 20 20 20 20 75 6e 69 78  pFile);.    unix
18870 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
18880 20 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28    closeUnixFile(
18890 69 64 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  id);.  }.  retur
188a0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
188b0 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57  #endif /* OS_VXW
188c0 4f 52 4b 53 20 2a 2f 0a 2f 2a 0a 2a 2a 20 4e 61  ORKS */./*.** Na
188d0 6d 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f  med semaphore lo
188e0 63 6b 69 6e 67 20 69 73 20 6f 6e 6c 79 20 61 76  cking is only av
188f0 61 69 6c 61 62 6c 65 20 6f 6e 20 56 78 57 6f 72  ailable on VxWor
18900 6b 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ks..**.*********
18910 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68  ****** End of th
18920 65 20 6e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72  e named semaphor
18930 65 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74  e lock implement
18940 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ation **********
18950 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
18960 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18970 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18980 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18990 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
189a0 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a  *****/.../******
189b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
189c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
189d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
189e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
189f0 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
18a00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18a10 2a 2a 2a 2a 20 42 65 67 69 6e 20 41 46 50 20 4c  **** Begin AFP L
18a20 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ocking *********
18a30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18a40 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 41  ********.**.** A
18a50 46 50 20 69 73 20 74 68 65 20 41 70 70 6c 65 20  FP is the Apple 
18a60 46 69 6c 69 6e 67 20 50 72 6f 74 6f 63 6f 6c 2e  Filing Protocol.
18a70 20 20 41 46 50 20 69 73 20 61 20 6e 65 74 77 6f    AFP is a netwo
18a80 72 6b 20 66 69 6c 65 73 79 73 74 65 6d 20 66 6f  rk filesystem fo
18a90 75 6e 64 0a 2a 2a 20 6f 6e 20 41 70 70 6c 65 20  und.** on Apple 
18aa0 4d 61 63 69 6e 74 6f 73 68 20 63 6f 6d 70 75 74  Macintosh comput
18ab0 65 72 73 20 2d 20 62 6f 74 68 20 4f 53 39 20 61  ers - both OS9 a
18ac0 6e 64 20 4f 53 58 2e 0a 2a 2a 0a 2a 2a 20 54 68  nd OSX..**.** Th
18ad0 69 72 64 2d 70 61 72 74 79 20 69 6d 70 6c 65 6d  ird-party implem
18ae0 65 6e 74 61 74 69 6f 6e 73 20 6f 66 20 41 46 50  entations of AFP
18af0 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 2e 20   are available. 
18b00 20 42 75 74 20 74 68 69 73 20 63 6f 64 65 20 68   But this code h
18b10 65 72 65 0a 2a 2a 20 6f 6e 6c 79 20 77 6f 72 6b  ere.** only work
18b20 73 20 6f 6e 20 4f 53 58 2e 0a 2a 2f 0a 0a 23 69  s on OSX..*/..#i
18b30 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
18b40 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45  E__) && SQLITE_E
18b50 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
18b60 59 4c 45 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 66  YLE./*.** The af
18b70 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  pLockingContext 
18b80 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69  structure contai
18b90 6e 73 20 61 6c 6c 20 61 66 70 20 6c 6f 63 6b 20  ns all afp lock 
18ba0 73 70 65 63 69 66 69 63 20 73 74 61 74 65 0a 2a  specific state.*
18bb0 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
18bc0 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65   afpLockingConte
18bd0 78 74 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e  xt afpLockingCon
18be0 74 65 78 74 3b 0a 73 74 72 75 63 74 20 61 66 70  text;.struct afp
18bf0 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 7b  LockingContext {
18c00 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65 64 3b  .  int reserved;
18c10 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 64  .  const char *d
18c20 62 50 61 74 68 3b 20 20 20 20 20 20 20 20 20 20  bPath;          
18c30 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
18c40 65 20 6f 70 65 6e 20 66 69 6c 65 20 2a 2f 0a 7d  e open file */.}
18c50 3b 0a 0a 73 74 72 75 63 74 20 42 79 74 65 52 61  ;..struct ByteRa
18c60 6e 67 65 4c 6f 63 6b 50 42 32 0a 7b 0a 20 20 75  ngeLockPB2.{.  u
18c70 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e  nsigned long lon
18c80 67 20 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20  g offset;       
18c90 20 2f 2a 20 6f 66 66 73 65 74 20 74 6f 20 66 69   /* offset to fi
18ca0 72 73 74 20 62 79 74 65 20 74 6f 20 6c 6f 63 6b  rst byte to lock
18cb0 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c   */.  unsigned l
18cc0 6f 6e 67 20 6c 6f 6e 67 20 6c 65 6e 67 74 68 3b  ong long length;
18cd0 20 20 20 20 20 20 20 20 2f 2a 20 6e 62 72 20 6f          /* nbr o
18ce0 66 20 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20  f bytes to lock 
18cf0 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f  */.  unsigned lo
18d00 6e 67 20 6c 6f 6e 67 20 72 65 74 52 61 6e 67 65  ng long retRange
18d10 53 74 61 72 74 3b 20 2f 2a 20 6e 62 72 20 6f 66  Start; /* nbr of
18d20 20 31 73 74 20 62 79 74 65 20 6c 6f 63 6b 65 64   1st byte locked
18d30 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 20 2a   if successful *
18d40 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
18d50 72 20 75 6e 4c 6f 63 6b 46 6c 61 67 3b 20 20 20  r unLockFlag;   
18d60 20 20 20 20 20 20 2f 2a 20 31 20 3d 20 75 6e 6c        /* 1 = unl
18d70 6f 63 6b 2c 20 30 20 3d 20 6c 6f 63 6b 20 2a 2f  ock, 0 = lock */
18d80 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
18d90 20 73 74 61 72 74 45 6e 64 46 6c 61 67 3b 20 20   startEndFlag;  
18da0 20 20 20 20 20 2f 2a 20 31 3d 72 65 6c 20 74 6f       /* 1=rel to
18db0 20 65 6e 64 20 6f 66 20 66 6f 72 6b 2c 20 30 3d   end of fork, 0=
18dc0 72 65 6c 20 74 6f 20 73 74 61 72 74 20 2a 2f 0a  rel to start */.
18dd0 20 20 69 6e 74 20 66 64 3b 20 20 20 20 20 20 20    int fd;       
18de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18df0 20 20 20 20 2f 2a 20 66 69 6c 65 20 64 65 73 63      /* file desc
18e00 20 74 6f 20 61 73 73 6f 63 20 74 68 69 73 20 6c   to assoc this l
18e10 6f 63 6b 20 77 69 74 68 20 2a 2f 0a 7d 3b 0a 0a  ock with */.};..
18e20 23 64 65 66 69 6e 65 20 61 66 70 66 73 42 79 74  #define afpfsByt
18e30 65 52 61 6e 67 65 4c 6f 63 6b 32 46 53 43 54 4c  eRangeLock2FSCTL
18e40 20 20 20 20 20 20 20 20 5f 49 4f 57 52 28 27 7a          _IOWR('z
18e50 27 2c 20 32 33 2c 20 73 74 72 75 63 74 20 42 79  ', 23, struct By
18e60 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32 29 0a  teRangeLockPB2).
18e70 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  ./*.** This is a
18e80 20 75 74 69 6c 69 74 79 20 66 6f 72 20 73 65 74   utility for set
18e90 74 69 6e 67 20 6f 72 20 63 6c 65 61 72 69 6e 67  ting or clearing
18ea0 20 61 20 62 69 74 2d 72 61 6e 67 65 20 6c 6f 63   a bit-range loc
18eb0 6b 20 6f 6e 20 61 6e 0a 2a 2a 20 41 46 50 20 66  k on an.** AFP f
18ec0 69 6c 65 73 79 73 74 65 6d 2e 0a 2a 2a 20 0a 2a  ilesystem..** .*
18ed0 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
18ee0 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 53  OK on success, S
18ef0 51 4c 49 54 45 5f 42 55 53 59 20 6f 6e 20 66 61  QLITE_BUSY on fa
18f00 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  ilure..*/.static
18f10 20 69 6e 74 20 61 66 70 53 65 74 4c 6f 63 6b 28   int afpSetLock(
18f20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70  .  const char *p
18f30 61 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 20  ath,            
18f40 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
18f50 20 66 69 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b   file to be lock
18f60 65 64 20 6f 72 20 75 6e 6c 6f 63 6b 65 64 20 2a  ed or unlocked *
18f70 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  /.  unixFile *pF
18f80 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ile,            
18f90 20 20 20 2f 2a 20 4f 70 65 6e 20 66 69 6c 65 20     /* Open file 
18fa0 64 65 73 63 72 69 70 74 6f 72 20 6f 6e 20 70 61  descriptor on pa
18fb0 74 68 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  th */.  unsigned
18fc0 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6f 66 66 73 65   long long offse
18fd0 74 2c 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20  t,     /* First 
18fe0 62 79 74 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65  byte to be locke
18ff0 64 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  d */.  unsigned 
19000 6c 6f 6e 67 20 6c 6f 6e 67 20 6c 65 6e 67 74 68  long long length
19010 2c 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  ,     /* Number 
19020 6f 66 20 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b  of bytes to lock
19030 20 2a 2f 0a 20 20 69 6e 74 20 73 65 74 4c 6f 63   */.  int setLoc
19040 6b 46 6c 61 67 20 20 20 20 20 20 20 20 20 20 20  kFlag           
19050 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
19060 73 65 74 20 6c 6f 63 6b 2e 20 20 46 61 6c 73 65  set lock.  False
19070 20 74 6f 20 63 6c 65 61 72 20 6c 6f 63 6b 20 2a   to clear lock *
19080 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 42 79  /.){.  struct By
19090 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32 20 70  teRangeLockPB2 p
190a0 62 3b 0a 20 20 69 6e 74 20 65 72 72 3b 0a 20 20  b;.  int err;.  
190b0 0a 20 20 70 62 2e 75 6e 4c 6f 63 6b 46 6c 61 67  .  pb.unLockFlag
190c0 20 3d 20 73 65 74 4c 6f 63 6b 46 6c 61 67 20 3f   = setLockFlag ?
190d0 20 30 20 3a 20 31 3b 0a 20 20 70 62 2e 73 74 61   0 : 1;.  pb.sta
190e0 72 74 45 6e 64 46 6c 61 67 20 3d 20 30 3b 0a 20  rtEndFlag = 0;. 
190f0 20 70 62 2e 6f 66 66 73 65 74 20 3d 20 6f 66 66   pb.offset = off
19100 73 65 74 3b 0a 20 20 70 62 2e 6c 65 6e 67 74 68  set;.  pb.length
19110 20 3d 20 6c 65 6e 67 74 68 3b 20 0a 20 20 70 62   = length; .  pb
19120 2e 66 64 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a  .fd = pFile->h;.
19130 20 20 0a 20 20 4f 53 54 52 41 43 45 28 28 22 41    .  OSTRACE(("A
19140 46 50 53 45 54 4c 4f 43 4b 20 5b 25 73 5d 20 66  FPSETLOCK [%s] f
19150 6f 72 20 25 64 25 73 20 69 6e 20 72 61 6e 67 65  or %d%s in range
19160 20 25 6c 6c 78 3a 25 6c 6c 78 5c 6e 22 2c 20 0a   %llx:%llx\n", .
19170 20 20 20 20 28 73 65 74 4c 6f 63 6b 46 6c 61 67      (setLockFlag
19180 3f 22 4f 4e 22 3a 22 4f 46 46 22 29 2c 20 70 46  ?"ON":"OFF"), pF
19190 69 6c 65 2d 3e 68 2c 20 28 70 62 2e 66 64 3d 3d  ile->h, (pb.fd==
191a0 2d 31 3f 22 5b 74 65 73 74 76 61 6c 2d 31 5d 22  -1?"[testval-1]"
191b0 3a 22 22 29 2c 0a 20 20 20 20 6f 66 66 73 65 74  :""),.    offset
191c0 2c 20 6c 65 6e 67 74 68 29 29 3b 0a 20 20 65 72  , length));.  er
191d0 72 20 3d 20 66 73 63 74 6c 28 70 61 74 68 2c 20  r = fsctl(path, 
191e0 61 66 70 66 73 42 79 74 65 52 61 6e 67 65 4c 6f  afpfsByteRangeLo
191f0 63 6b 32 46 53 43 54 4c 2c 20 26 70 62 2c 20 30  ck2FSCTL, &pb, 0
19200 29 3b 0a 20 20 69 66 20 28 20 65 72 72 3d 3d 2d  );.  if ( err==-
19210 31 20 29 20 7b 0a 20 20 20 20 69 6e 74 20 72 63  1 ) {.    int rc
19220 3b 0a 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f  ;.    int tErrno
19230 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 4f 53   = errno;.    OS
19240 54 52 41 43 45 28 28 22 41 46 50 53 45 54 4c 4f  TRACE(("AFPSETLO
19250 43 4b 20 66 61 69 6c 65 64 20 74 6f 20 66 73 63  CK failed to fsc
19260 74 6c 28 29 20 27 25 73 27 20 25 64 20 25 73 5c  tl() '%s' %d %s\
19270 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
19280 20 70 61 74 68 2c 20 74 45 72 72 6e 6f 2c 20 73   path, tErrno, s
19290 74 72 65 72 72 6f 72 28 74 45 72 72 6e 6f 29 29  trerror(tErrno))
192a0 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
192b0 5f 49 47 4e 4f 52 45 5f 41 46 50 5f 4c 4f 43 4b  _IGNORE_AFP_LOCK
192c0 5f 45 52 52 4f 52 53 0a 20 20 20 20 72 63 20 3d  _ERRORS.    rc =
192d0 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 23 65   SQLITE_BUSY;.#e
192e0 6c 73 65 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  lse.    rc = sql
192f0 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69  iteErrorFromPosi
19300 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 0a 20  xError(tErrno,. 
19310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19320 20 20 20 73 65 74 4c 6f 63 6b 46 6c 61 67 20 3f     setLockFlag ?
19330 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f   SQLITE_IOERR_LO
19340 43 4b 20 3a 20 53 51 4c 49 54 45 5f 49 4f 45 52  CK : SQLITE_IOER
19350 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 23 65 6e 64 69  R_UNLOCK);.#endi
19360 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f  f /* SQLITE_IGNO
19370 52 45 5f 41 46 50 5f 4c 4f 43 4b 5f 45 52 52 4f  RE_AFP_LOCK_ERRO
19380 52 53 20 2a 2f 0a 20 20 20 20 69 66 28 20 49 53  RS */.    if( IS
19390 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20  _LOCK_ERROR(rc) 
193a0 29 7b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61  ){.      storeLa
193b0 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74  stErrno(pFile, t
193c0 45 72 72 6e 6f 29 3b 0a 20 20 20 20 7d 0a 20 20  Errno);.    }.  
193d0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
193e0 20 65 6c 73 65 20 7b 0a 20 20 20 20 72 65 74 75   else {.    retu
193f0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
19400 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
19410 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69  routine checks i
19420 66 20 74 68 65 72 65 20 69 73 20 61 20 52 45 53  f there is a RES
19430 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20  ERVED lock held 
19440 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64  on the specified
19450 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73  .** file by this
19460 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72   or any other pr
19470 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68 20 61  ocess. If such a
19480 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 73   lock is held, s
19490 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74  et *pResOut.** t
194a0 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c  o a non-zero val
194b0 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a 70 52  ue otherwise *pR
194c0 65 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20  esOut is set to 
194d0 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74 75 72  zero.  The retur
194e0 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65  n value.** is se
194f0 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75  t to SQLITE_OK u
19500 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65 72 72  nless an I/O err
19510 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  or occurs during
19520 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a   lock checking..
19530 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66  */.static int af
19540 70 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  pCheckReservedLo
19550 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
19560 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75  *id, int *pResOu
19570 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
19580 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
19590 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20  reserved = 0;.  
195a0 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
195b0 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
195c0 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e  .  afpLockingCon
195d0 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 3b 0a 20  text *context;. 
195e0 20 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72   .  SimulateIOEr
195f0 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
19600 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45  TE_IOERR_CHECKRE
19610 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20  SERVEDLOCK; );. 
19620 20 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c   .  assert( pFil
19630 65 20 29 3b 0a 20 20 63 6f 6e 74 65 78 74 20 3d  e );.  context =
19640 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74   (afpLockingCont
19650 65 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f  ext *) pFile->lo
19660 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20  ckingContext;.  
19670 69 66 28 20 63 6f 6e 74 65 78 74 2d 3e 72 65 73  if( context->res
19680 65 72 76 65 64 20 29 7b 0a 20 20 20 20 2a 70 52  erved ){.    *pR
19690 65 73 4f 75 74 20 3d 20 31 3b 0a 20 20 20 20 72  esOut = 1;.    r
196a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
196b0 0a 20 20 7d 0a 20 20 75 6e 69 78 45 6e 74 65 72  .  }.  unixEnter
196c0 4d 75 74 65 78 28 29 3b 20 2f 2a 20 42 65 63 61  Mutex(); /* Beca
196d0 75 73 65 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  use pFile->pInod
196e0 65 20 69 73 20 73 68 61 72 65 64 20 61 63 72 6f  e is shared acro
196f0 73 73 20 74 68 72 65 61 64 73 20 2a 2f 0a 20 20  ss threads */.  
19700 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61  .  /* Check if a
19710 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 20   thread in this 
19720 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75  process holds su
19730 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69  ch a lock */.  i
19740 66 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  f( pFile->pInode
19750 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52  ->eFileLock>SHAR
19760 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72  ED_LOCK ){.    r
19770 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d  eserved = 1;.  }
19780 0a 20 20 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69  .  .  /* Otherwi
19790 73 65 20 73 65 65 20 69 66 20 73 6f 6d 65 20 6f  se see if some o
197a0 74 68 65 72 20 70 72 6f 63 65 73 73 20 68 6f 6c  ther process hol
197b0 64 73 20 69 74 2e 0a 20 20 20 2a 2f 0a 20 20 69  ds it..   */.  i
197c0 66 28 20 21 72 65 73 65 72 76 65 64 20 29 7b 0a  f( !reserved ){.
197d0 20 20 20 20 2f 2a 20 6c 6f 63 6b 20 74 68 65 20      /* lock the 
197e0 52 45 53 45 52 56 45 44 20 62 79 74 65 20 2a 2f  RESERVED byte */
197f0 0a 20 20 20 20 69 6e 74 20 6c 72 63 20 3d 20 61  .    int lrc = a
19800 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78  fpSetLock(contex
19810 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65  t->dbPath, pFile
19820 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c  , RESERVED_BYTE,
19830 20 31 2c 31 29 3b 20 20 0a 20 20 20 20 69 66 28   1,1);  .    if(
19840 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 6c 72 63 20   SQLITE_OK==lrc 
19850 29 7b 0a 20 20 20 20 20 20 2f 2a 20 69 66 20 77  ){.      /* if w
19860 65 20 73 75 63 63 65 65 64 65 64 20 69 6e 20 74  e succeeded in t
19870 61 6b 69 6e 67 20 74 68 65 20 72 65 73 65 72 76  aking the reserv
19880 65 64 20 6c 6f 63 6b 2c 20 75 6e 6c 6f 63 6b 20  ed lock, unlock 
19890 69 74 20 74 6f 20 72 65 73 74 6f 72 65 0a 20 20  it to restore.  
198a0 20 20 20 20 2a 2a 20 74 68 65 20 6f 72 69 67 69      ** the origi
198b0 6e 61 6c 20 73 74 61 74 65 20 2a 2f 0a 20 20 20  nal state */.   
198c0 20 20 20 6c 72 63 20 3d 20 61 66 70 53 65 74 4c     lrc = afpSetL
198d0 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50  ock(context->dbP
198e0 61 74 68 2c 20 70 46 69 6c 65 2c 20 52 45 53 45  ath, pFile, RESE
198f0 52 56 45 44 5f 42 59 54 45 2c 20 31 2c 20 30 29  RVED_BYTE, 1, 0)
19900 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20  ;.    } else {. 
19910 20 20 20 20 20 2f 2a 20 69 66 20 77 65 20 66 61       /* if we fa
19920 69 6c 65 64 20 74 6f 20 67 65 74 20 74 68 65 20  iled to get the 
19930 6c 6f 63 6b 20 74 68 65 6e 20 73 6f 6d 65 6f 6e  lock then someon
19940 65 20 65 6c 73 65 20 6d 75 73 74 20 68 61 76 65  e else must have
19950 20 69 74 20 2a 2f 0a 20 20 20 20 20 20 72 65 73   it */.      res
19960 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d  erved = 1;.    }
19970 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b  .    if( IS_LOCK
19980 5f 45 52 52 4f 52 28 6c 72 63 29 20 29 7b 0a 20  _ERROR(lrc) ){. 
19990 20 20 20 20 20 72 63 3d 6c 72 63 3b 0a 20 20 20       rc=lrc;.   
199a0 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 75 6e 69 78   }.  }.  .  unix
199b0 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
199c0 4f 53 54 52 41 43 45 28 28 22 54 45 53 54 20 57  OSTRACE(("TEST W
199d0 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 20  R-LOCK %d %d %d 
199e0 28 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  (afp)\n", pFile-
199f0 3e 68 2c 20 72 63 2c 20 72 65 73 65 72 76 65 64  >h, rc, reserved
19a00 29 29 3b 0a 20 20 0a 20 20 2a 70 52 65 73 4f 75  ));.  .  *pResOu
19a10 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20 20  t = reserved;.  
19a20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
19a30 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c  .** Lock the fil
19a40 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20  e with the lock 
19a50 73 70 65 63 69 66 69 65 64 20 62 79 20 70 61 72  specified by par
19a60 61 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b  ameter eFileLock
19a70 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65   - one.** of the
19a80 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
19a90 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 45 44  *     (1) SHARED
19aa0 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29  _LOCK.**     (2)
19ab0 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a   RESERVED_LOCK.*
19ac0 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e  *     (3) PENDIN
19ad0 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34  G_LOCK.**     (4
19ae0 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ) EXCLUSIVE_LOCK
19af0 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73  .**.** Sometimes
19b00 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67   when requesting
19b10 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c   one lock state,
19b20 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b   additional lock
19b30 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69   states.** are i
19b40 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 77 65  nserted in betwe
19b50 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67  en.  The locking
19b60 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f   might fail on o
19b70 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a  ne of the later.
19b80 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c  ** transitions l
19b90 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20  eaving the lock 
19ba0 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74 20  state different 
19bb0 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61  from what it sta
19bc0 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c  rted but.** stil
19bd0 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67  l short of its g
19be0 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  oal.  The follow
19bf0 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73 20  ing chart shows 
19c00 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74  the allowed.** t
19c10 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74  ransitions and t
19c20 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65  he inserted inte
19c30 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 73 3a  rmediate states:
19c40 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b  .**.**    UNLOCK
19c50 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20  ED -> SHARED.** 
19c60 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53     SHARED -> RES
19c70 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52  ERVED.**    SHAR
19c80 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20  ED -> (PENDING) 
19c90 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  -> EXCLUSIVE.** 
19ca0 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28     RESERVED -> (
19cb0 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c  PENDING) -> EXCL
19cc0 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44  USIVE.**    PEND
19cd0 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  ING -> EXCLUSIVE
19ce0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
19cf0 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e  ine will only in
19d00 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20  crease a lock.  
19d10 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 4f  Use the sqlite3O
19d20 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75  sUnlock().** rou
19d30 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61 20  tine to lower a 
19d40 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a  locking level..*
19d50 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66 70  /.static int afp
19d60 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
19d70 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65  e *id, int eFile
19d80 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72 63 20  Lock){.  int rc 
19d90 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75  = SQLITE_OK;.  u
19da0 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
19db0 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
19dc0 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20    unixInodeInfo 
19dd0 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d  *pInode = pFile-
19de0 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 66 70 4c 6f  >pInode;.  afpLo
19df0 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 63 6f  ckingContext *co
19e00 6e 74 65 78 74 20 3d 20 28 61 66 70 4c 6f 63 6b  ntext = (afpLock
19e10 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 20 70 46  ingContext *) pF
19e20 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
19e30 65 78 74 3b 0a 20 20 0a 20 20 61 73 73 65 72 74  ext;.  .  assert
19e40 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54  ( pFile );.  OST
19e50 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25  RACE(("LOCK    %
19e60 64 20 25 73 20 77 61 73 20 25 73 28 25 73 2c 25  d %s was %s(%s,%
19e70 64 29 20 70 69 64 3d 25 64 20 28 61 66 70 29 5c  d) pid=%d (afp)\
19e80 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20  n", pFile->h,.  
19e90 20 20 20 20 20 20 20 20 20 61 7a 46 69 6c 65 4c           azFileL
19ea0 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20  ock(eFileLock), 
19eb0 61 7a 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65  azFileLock(pFile
19ec0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c 0a 20 20  ->eFileLock),.  
19ed0 20 20 20 20 20 20 20 20 20 61 7a 46 69 6c 65 4c           azFileL
19ee0 6f 63 6b 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c  ock(pInode->eFil
19ef0 65 4c 6f 63 6b 29 2c 20 70 49 6e 6f 64 65 2d 3e  eLock), pInode->
19f00 6e 53 68 61 72 65 64 20 2c 20 6f 73 47 65 74 70  nShared , osGetp
19f10 69 64 28 30 29 29 29 3b 0a 0a 20 20 2f 2a 20 49  id(0)));..  /* I
19f20 66 20 74 68 65 72 65 20 69 73 20 61 6c 72 65 61  f there is alrea
19f30 64 79 20 61 20 6c 6f 63 6b 20 6f 66 20 74 68 69  dy a lock of thi
19f40 73 20 74 79 70 65 20 6f 72 20 6d 6f 72 65 20 72  s type or more r
19f50 65 73 74 72 69 63 74 69 76 65 20 6f 6e 20 74 68  estrictive on th
19f60 65 0a 20 20 2a 2a 20 75 6e 69 78 46 69 6c 65 2c  e.  ** unixFile,
19f70 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e   do nothing. Don
19f80 27 74 20 75 73 65 20 74 68 65 20 61 66 70 5f 65  't use the afp_e
19f90 6e 64 5f 6c 6f 63 6b 3a 20 65 78 69 74 20 70 61  nd_lock: exit pa
19fa0 74 68 2c 20 61 73 0a 20 20 2a 2a 20 75 6e 69 78  th, as.  ** unix
19fb0 45 6e 74 65 72 4d 75 74 65 78 28 29 20 68 61 73  EnterMutex() has
19fc0 6e 27 74 20 62 65 65 6e 20 63 61 6c 6c 65 64 20  n't been called 
19fd0 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  yet..  */.  if( 
19fe0 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
19ff0 3e 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20  >=eFileLock ){. 
1a000 20 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43     OSTRACE(("LOC
1a010 4b 20 20 20 20 25 64 20 25 73 20 6f 6b 20 28 61  K    %d %s ok (a
1a020 6c 72 65 61 64 79 20 68 65 6c 64 29 20 28 61 66  lready held) (af
1a030 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  p)\n", pFile->h,
1a040 0a 20 20 20 20 20 20 20 20 20 20 20 61 7a 46 69  .           azFi
1a050 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b  leLock(eFileLock
1a060 29 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  )));.    return 
1a070 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
1a080 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
1a090 68 65 20 6c 6f 63 6b 69 6e 67 20 73 65 71 75 65  he locking seque
1a0a0 6e 63 65 20 69 73 20 63 6f 72 72 65 63 74 0a 20  nce is correct. 
1a0b0 20 2a 2a 20 20 28 31 29 20 57 65 20 6e 65 76 65   **  (1) We neve
1a0c0 72 20 6d 6f 76 65 20 66 72 6f 6d 20 75 6e 6c 6f  r move from unlo
1a0d0 63 6b 65 64 20 74 6f 20 61 6e 79 74 68 69 6e 67  cked to anything
1a0e0 20 68 69 67 68 65 72 20 74 68 61 6e 20 73 68 61   higher than sha
1a0f0 72 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20  red lock..  **  
1a100 28 32 29 20 53 51 4c 69 74 65 20 6e 65 76 65 72  (2) SQLite never
1a110 20 65 78 70 6c 69 63 69 74 6c 79 20 72 65 71 75   explicitly requ
1a120 65 73 74 73 20 61 20 70 65 6e 64 69 67 20 6c 6f  ests a pendig lo
1a130 63 6b 2e 0a 20 20 2a 2a 20 20 28 33 29 20 41 20  ck..  **  (3) A 
1a140 73 68 61 72 65 64 20 6c 6f 63 6b 20 69 73 20 61  shared lock is a
1a150 6c 77 61 79 73 20 68 65 6c 64 20 77 68 65 6e 20  lways held when 
1a160 61 20 72 65 73 65 72 76 65 20 6c 6f 63 6b 20 69  a reserve lock i
1a170 73 20 72 65 71 75 65 73 74 65 64 2e 0a 20 20 2a  s requested..  *
1a180 2f 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  /.  assert( pFil
1a190 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 4e 4f  e->eFileLock!=NO
1a1a0 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f  _LOCK || eFileLo
1a1b0 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
1a1c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46 69  );.  assert( eFi
1a1d0 6c 65 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e 47 5f  leLock!=PENDING_
1a1e0 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  LOCK );.  assert
1a1f0 28 20 65 46 69 6c 65 4c 6f 63 6b 21 3d 52 45 53  ( eFileLock!=RES
1a200 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46  ERVED_LOCK || pF
1a210 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d  ile->eFileLock==
1a220 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
1a230 20 0a 20 20 2f 2a 20 54 68 69 73 20 6d 75 74 65   .  /* This mute
1a240 78 20 69 73 20 6e 65 65 64 65 64 20 62 65 63 61  x is needed beca
1a250 75 73 65 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  use pFile->pInod
1a260 65 20 69 73 20 73 68 61 72 65 64 20 61 63 72 6f  e is shared acro
1a270 73 73 20 74 68 72 65 61 64 73 0a 20 20 2a 2f 0a  ss threads.  */.
1a280 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
1a290 28 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70  ();.  pInode = p
1a2a0 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 0a 20  File->pInode;.. 
1a2b0 20 2f 2a 20 49 66 20 73 6f 6d 65 20 74 68 72 65   /* If some thre
1a2c0 61 64 20 75 73 69 6e 67 20 74 68 69 73 20 50 49  ad using this PI
1a2d0 44 20 68 61 73 20 61 20 6c 6f 63 6b 20 76 69 61  D has a lock via
1a2e0 20 61 20 64 69 66 66 65 72 65 6e 74 20 75 6e 69   a different uni
1a2f0 78 46 69 6c 65 2a 0a 20 20 2a 2a 20 68 61 6e 64  xFile*.  ** hand
1a300 6c 65 20 74 68 61 74 20 70 72 65 63 6c 75 64 65  le that preclude
1a310 73 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  s the requested 
1a320 6c 6f 63 6b 2c 20 72 65 74 75 72 6e 20 42 55 53  lock, return BUS
1a330 59 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70  Y..  */.  if( (p
1a340 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21  File->eFileLock!
1a350 3d 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f  =pInode->eFileLo
1a360 63 6b 20 26 26 20 0a 20 20 20 20 20 20 20 28 70  ck && .       (p
1a370 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
1a380 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 7c  >=PENDING_LOCK |
1a390 7c 20 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52  | eFileLock>SHAR
1a3a0 45 44 5f 4c 4f 43 4b 29 29 0a 20 20 20 20 20 29  ED_LOCK)).     )
1a3b0 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
1a3c0 45 5f 42 55 53 59 3b 0a 20 20 20 20 67 6f 74 6f  E_BUSY;.    goto
1a3d0 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20   afp_end_lock;. 
1a3e0 20 7d 0a 20 20 0a 20 20 2f 2a 20 49 66 20 61 20   }.  .  /* If a 
1a3f0 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 73 20 72  SHARED lock is r
1a400 65 71 75 65 73 74 65 64 2c 20 61 6e 64 20 73 6f  equested, and so
1a410 6d 65 20 74 68 72 65 61 64 20 75 73 69 6e 67 20  me thread using 
1a420 74 68 69 73 20 50 49 44 20 61 6c 72 65 61 64 79  this PID already
1a430 0a 20 20 2a 2a 20 68 61 73 20 61 20 53 48 41 52  .  ** has a SHAR
1a440 45 44 20 6f 72 20 52 45 53 45 52 56 45 44 20 6c  ED or RESERVED l
1a450 6f 63 6b 2c 20 74 68 65 6e 20 69 6e 63 72 65 6d  ock, then increm
1a460 65 6e 74 20 72 65 66 65 72 65 6e 63 65 20 63 6f  ent reference co
1a470 75 6e 74 73 20 61 6e 64 0a 20 20 2a 2a 20 72 65  unts and.  ** re
1a480 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  turn SQLITE_OK..
1a490 20 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65    */.  if( eFile
1a4a0 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
1a4b0 4b 20 26 26 20 0a 20 20 20 20 20 28 70 49 6e 6f  K && .     (pIno
1a4c0 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  de->eFileLock==S
1a4d0 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49  HARED_LOCK || pI
1a4e0 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  node->eFileLock=
1a4f0 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 20  =RESERVED_LOCK) 
1a500 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 65  ){.    assert( e
1a510 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
1a520 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 61 73 73  _LOCK );.    ass
1a530 65 72 74 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c  ert( pFile->eFil
1a540 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20  eLock==0 );.    
1a550 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e  assert( pInode->
1a560 6e 53 68 61 72 65 64 3e 30 20 29 3b 0a 20 20 20  nShared>0 );.   
1a570 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
1a580 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b  k = SHARED_LOCK;
1a590 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68  .    pInode->nSh
1a5a0 61 72 65 64 2b 2b 3b 0a 20 20 20 20 70 49 6e 6f  ared++;.    pIno
1a5b0 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20  de->nLock++;.   
1a5c0 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f   goto afp_end_lo
1a5d0 63 6b 3b 0a 20 20 7d 0a 20 20 20 20 0a 20 20 2f  ck;.  }.    .  /
1a5e0 2a 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b  * A PENDING lock
1a5f0 20 69 73 20 6e 65 65 64 65 64 20 62 65 66 6f 72   is needed befor
1a600 65 20 61 63 71 75 69 72 69 6e 67 20 61 20 53 48  e acquiring a SH
1a610 41 52 45 44 20 6c 6f 63 6b 20 61 6e 64 20 62 65  ARED lock and be
1a620 66 6f 72 65 0a 20 20 2a 2a 20 61 63 71 75 69 72  fore.  ** acquir
1a630 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45  ing an EXCLUSIVE
1a640 20 6c 6f 63 6b 2e 20 20 46 6f 72 20 74 68 65 20   lock.  For the 
1a650 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65  SHARED lock, the
1a660 20 50 45 4e 44 49 4e 47 20 77 69 6c 6c 0a 20 20   PENDING will.  
1a670 2a 2a 20 62 65 20 72 65 6c 65 61 73 65 64 2e 0a  ** be released..
1a680 20 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65    */.  if( eFile
1a690 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
1a6a0 4b 20 0a 20 20 20 20 20 20 7c 7c 20 28 65 46 69  K .      || (eFi
1a6b0 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  leLock==EXCLUSIV
1a6c0 45 5f 4c 4f 43 4b 20 26 26 20 70 46 69 6c 65 2d  E_LOCK && pFile-
1a6d0 3e 65 46 69 6c 65 4c 6f 63 6b 3c 50 45 4e 44 49  >eFileLock<PENDI
1a6e0 4e 47 5f 4c 4f 43 4b 29 0a 20 20 29 7b 0a 20 20  NG_LOCK).  ){.  
1a6f0 20 20 69 6e 74 20 66 61 69 6c 65 64 3b 0a 20 20    int failed;.  
1a700 20 20 66 61 69 6c 65 64 20 3d 20 61 66 70 53 65    failed = afpSe
1a710 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64  tLock(context->d
1a720 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 50 45  bPath, pFile, PE
1a730 4e 44 49 4e 47 5f 42 59 54 45 2c 20 31 2c 20 31  NDING_BYTE, 1, 1
1a740 29 3b 0a 20 20 20 20 69 66 20 28 66 61 69 6c 65  );.    if (faile
1a750 64 29 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  d) {.      rc = 
1a760 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 67 6f  failed;.      go
1a770 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b  to afp_end_lock;
1a780 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20  .    }.  }.  .  
1a790 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20 67 65  /* If control ge
1a7a0 74 73 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74  ts to this point
1a7b0 2c 20 74 68 65 6e 20 61 63 74 75 61 6c 6c 79 20  , then actually 
1a7c0 67 6f 20 61 68 65 61 64 20 61 6e 64 20 6d 61 6b  go ahead and mak
1a7d0 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69 6e 67  e.  ** operating
1a7e0 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 66 6f   system calls fo
1a7f0 72 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  r the specified 
1a800 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  lock..  */.  if(
1a810 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52   eFileLock==SHAR
1a820 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 69  ED_LOCK ){.    i
1a830 6e 74 20 6c 72 63 31 2c 20 6c 72 63 32 2c 20 6c  nt lrc1, lrc2, l
1a840 72 63 31 45 72 72 6e 6f 20 3d 20 30 3b 0a 20 20  rc1Errno = 0;.  
1a850 20 20 6c 6f 6e 67 20 6c 6b 2c 20 6d 61 73 6b 3b    long lk, mask;
1a860 0a 20 20 20 20 0a 20 20 20 20 61 73 73 65 72 74  .    .    assert
1a870 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  ( pInode->nShare
1a880 64 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  d==0 );.    asse
1a890 72 74 28 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c  rt( pInode->eFil
1a8a0 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20  eLock==0 );.    
1a8b0 20 20 20 20 0a 20 20 20 20 6d 61 73 6b 20 3d 20      .    mask = 
1a8c0 28 73 69 7a 65 6f 66 28 6c 6f 6e 67 29 3d 3d 38  (sizeof(long)==8
1a8d0 29 20 3f 20 4c 41 52 47 45 53 54 5f 49 4e 54 36  ) ? LARGEST_INT6
1a8e0 34 20 3a 20 30 78 37 66 66 66 66 66 66 66 3b 0a  4 : 0x7fffffff;.
1a8f0 20 20 20 20 2f 2a 20 4e 6f 77 20 67 65 74 20 74      /* Now get t
1a900 68 65 20 72 65 61 64 2d 6c 6f 63 6b 20 53 48 41  he read-lock SHA
1a910 52 45 44 5f 4c 4f 43 4b 20 2a 2f 0a 20 20 20 20  RED_LOCK */.    
1a920 2f 2a 20 6e 6f 74 65 20 74 68 61 74 20 74 68 65  /* note that the
1a930 20 71 75 61 6c 69 74 79 20 6f 66 20 74 68 65 20   quality of the 
1a940 72 61 6e 64 6f 6d 6e 65 73 73 20 64 6f 65 73 6e  randomness doesn
1a950 27 74 20 6d 61 74 74 65 72 20 74 68 61 74 20 6d  't matter that m
1a960 75 63 68 20 2a 2f 0a 20 20 20 20 6c 6b 20 3d 20  uch */.    lk = 
1a970 72 61 6e 64 6f 6d 28 29 3b 20 0a 20 20 20 20 70  random(); .    p
1a980 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79 74  Inode->sharedByt
1a990 65 20 3d 20 28 6c 6b 20 26 20 6d 61 73 6b 29 25  e = (lk & mask)%
1a9a0 28 53 48 41 52 45 44 5f 53 49 5a 45 20 2d 20 31  (SHARED_SIZE - 1
1a9b0 29 3b 0a 20 20 20 20 6c 72 63 31 20 3d 20 61 66  );.    lrc1 = af
1a9c0 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  pSetLock(context
1a9d0 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c  ->dbPath, pFile,
1a9e0 20 0a 20 20 20 20 20 20 20 20 20 20 53 48 41 52   .          SHAR
1a9f0 45 44 5f 46 49 52 53 54 2b 70 49 6e 6f 64 65 2d  ED_FIRST+pInode-
1aa00 3e 73 68 61 72 65 64 42 79 74 65 2c 20 31 2c 20  >sharedByte, 1, 
1aa10 31 29 3b 0a 20 20 20 20 69 66 28 20 49 53 5f 4c  1);.    if( IS_L
1aa20 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 31 29 20  OCK_ERROR(lrc1) 
1aa30 29 7b 0a 20 20 20 20 20 20 6c 72 63 31 45 72 72  ){.      lrc1Err
1aa40 6e 6f 20 3d 20 70 46 69 6c 65 2d 3e 6c 61 73 74  no = pFile->last
1aa50 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20  Errno;.    }.   
1aa60 20 2f 2a 20 44 72 6f 70 20 74 68 65 20 74 65 6d   /* Drop the tem
1aa70 70 6f 72 61 72 79 20 50 45 4e 44 49 4e 47 20 6c  porary PENDING l
1aa80 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c 72 63 32 20  ock */.    lrc2 
1aa90 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e  = afpSetLock(con
1aaa0 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46  text->dbPath, pF
1aab0 69 6c 65 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54  ile, PENDING_BYT
1aac0 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 0a 20  E, 1, 0);.    . 
1aad0 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
1aae0 52 52 4f 52 28 6c 72 63 31 29 20 29 20 7b 0a 20  RROR(lrc1) ) {. 
1aaf0 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72       storeLastEr
1ab00 72 6e 6f 28 70 46 69 6c 65 2c 20 6c 72 63 31 45  rno(pFile, lrc1E
1ab10 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 72 63 20  rrno);.      rc 
1ab20 3d 20 6c 72 63 31 3b 0a 20 20 20 20 20 20 67 6f  = lrc1;.      go
1ab30 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b  to afp_end_lock;
1ab40 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 28 20  .    } else if( 
1ab50 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72  IS_LOCK_ERROR(lr
1ab60 63 32 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20  c2) ){.      rc 
1ab70 3d 20 6c 72 63 32 3b 0a 20 20 20 20 20 20 67 6f  = lrc2;.      go
1ab80 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b  to afp_end_lock;
1ab90 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 28 20  .    } else if( 
1aba0 6c 72 63 31 20 21 3d 20 53 51 4c 49 54 45 5f 4f  lrc1 != SQLITE_O
1abb0 4b 20 29 20 7b 0a 20 20 20 20 20 20 72 63 20 3d  K ) {.      rc =
1abc0 20 6c 72 63 31 3b 0a 20 20 20 20 7d 20 65 6c 73   lrc1;.    } els
1abd0 65 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  e {.      pFile-
1abe0 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41  >eFileLock = SHA
1abf0 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20  RED_LOCK;.      
1ac00 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b  pInode->nLock++;
1ac10 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e  .      pInode->n
1ac20 53 68 61 72 65 64 20 3d 20 31 3b 0a 20 20 20 20  Shared = 1;.    
1ac30 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65 46  }.  }else if( eF
1ac40 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ileLock==EXCLUSI
1ac50 56 45 5f 4c 4f 43 4b 20 26 26 20 70 49 6e 6f 64  VE_LOCK && pInod
1ac60 65 2d 3e 6e 53 68 61 72 65 64 3e 31 20 29 7b 0a  e->nShared>1 ){.
1ac70 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20 74 72      /* We are tr
1ac80 79 69 6e 67 20 66 6f 72 20 61 6e 20 65 78 63 6c  ying for an excl
1ac90 75 73 69 76 65 20 6c 6f 63 6b 20 62 75 74 20 61  usive lock but a
1aca0 6e 6f 74 68 65 72 20 74 68 72 65 61 64 20 69 6e  nother thread in
1acb0 20 74 68 69 73 0a 20 20 20 20 20 2a 2a 20 73 61   this.     ** sa
1acc0 6d 65 20 70 72 6f 63 65 73 73 20 69 73 20 73 74  me process is st
1acd0 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 20 73 68  ill holding a sh
1ace0 61 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20  ared lock. */.  
1acf0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
1ad00 53 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  SY;.  }else{.   
1ad10 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 20   /* The request 
1ad20 77 61 73 20 66 6f 72 20 61 20 52 45 53 45 52 56  was for a RESERV
1ad30 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20  ED or EXCLUSIVE 
1ad40 6c 6f 63 6b 2e 20 20 49 74 20 69 73 0a 20 20 20  lock.  It is.   
1ad50 20 2a 2a 20 61 73 73 75 6d 65 64 20 74 68 61 74   ** assumed that
1ad60 20 74 68 65 72 65 20 69 73 20 61 20 53 48 41 52   there is a SHAR
1ad70 45 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f  ED or greater lo
1ad80 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 0a 20  ck on the file. 
1ad90 20 20 20 2a 2a 20 61 6c 72 65 61 64 79 2e 0a 20     ** already.. 
1ada0 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 66 61     */.    int fa
1adb0 69 6c 65 64 20 3d 20 30 3b 0a 20 20 20 20 61 73  iled = 0;.    as
1adc0 73 65 72 74 28 20 30 21 3d 70 46 69 6c 65 2d 3e  sert( 0!=pFile->
1add0 65 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a 20 20 20  eFileLock );.   
1ade0 20 69 66 20 28 65 46 69 6c 65 4c 6f 63 6b 20 3e   if (eFileLock >
1adf0 3d 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  = RESERVED_LOCK 
1ae00 26 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  && pFile->eFileL
1ae10 6f 63 6b 20 3c 20 52 45 53 45 52 56 45 44 5f 4c  ock < RESERVED_L
1ae20 4f 43 4b 29 20 7b 0a 20 20 20 20 20 20 20 20 2f  OCK) {.        /
1ae30 2a 20 41 63 71 75 69 72 65 20 61 20 52 45 53 45  * Acquire a RESE
1ae40 52 56 45 44 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20  RVED lock */.   
1ae50 20 20 20 20 20 66 61 69 6c 65 64 20 3d 20 61 66       failed = af
1ae60 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  pSetLock(context
1ae70 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c  ->dbPath, pFile,
1ae80 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20   RESERVED_BYTE, 
1ae90 31 2c 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20  1,1);.      if( 
1aea0 21 66 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20  !failed ){.     
1aeb0 20 20 20 63 6f 6e 74 65 78 74 2d 3e 72 65 73 65     context->rese
1aec0 72 76 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  rved = 1;.      
1aed0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28  }.    }.    if (
1aee0 21 66 61 69 6c 65 64 20 26 26 20 65 46 69 6c 65  !failed && eFile
1aef0 4c 6f 63 6b 20 3d 3d 20 45 58 43 4c 55 53 49 56  Lock == EXCLUSIV
1af00 45 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 20 20  E_LOCK) {.      
1af10 2f 2a 20 41 63 71 75 69 72 65 20 61 6e 20 45 58  /* Acquire an EX
1af20 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 2a 2f 0a  CLUSIVE lock */.
1af30 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 2f          .      /
1af40 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 73 68 61  * Remove the sha
1af50 72 65 64 20 6c 6f 63 6b 20 62 65 66 6f 72 65 20  red lock before 
1af60 74 72 79 69 6e 67 20 74 68 65 20 72 61 6e 67 65  trying the range
1af70 2e 20 20 77 65 27 6c 6c 20 6e 65 65 64 20 74 6f  .  we'll need to
1af80 20 0a 20 20 20 20 20 20 2a 2a 20 72 65 65 73 74   .      ** reest
1af90 61 62 6c 69 73 68 20 74 68 65 20 73 68 61 72 65  ablish the share
1afa0 64 20 6c 6f 63 6b 20 69 66 20 77 65 20 63 61 6e  d lock if we can
1afb0 27 74 20 67 65 74 20 74 68 65 20 20 61 66 70 55  't get the  afpU
1afc0 6e 6c 6f 63 6b 0a 20 20 20 20 20 20 2a 2f 0a 20  nlock.      */. 
1afd0 20 20 20 20 20 69 66 28 20 21 28 66 61 69 6c 65       if( !(faile
1afe0 64 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63  d = afpSetLock(c
1aff0 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20  ontext->dbPath, 
1b000 70 46 69 6c 65 2c 20 53 48 41 52 45 44 5f 46 49  pFile, SHARED_FI
1b010 52 53 54 20 2b 0a 20 20 20 20 20 20 20 20 20 20  RST +.          
1b020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1b030 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79 74  Inode->sharedByt
1b040 65 2c 20 31 2c 20 30 29 29 20 29 7b 0a 20 20 20  e, 1, 0)) ){.   
1b050 20 20 20 20 20 69 6e 74 20 66 61 69 6c 65 64 32       int failed2
1b060 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1b070 20 20 20 20 20 20 2f 2a 20 6e 6f 77 20 61 74 74        /* now att
1b080 65 6d 6d 70 74 20 74 6f 20 67 65 74 20 74 68 65  emmpt to get the
1b090 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20   exclusive lock 
1b0a0 72 61 6e 67 65 20 2a 2f 0a 20 20 20 20 20 20 20  range */.       
1b0b0 20 66 61 69 6c 65 64 20 3d 20 61 66 70 53 65 74   failed = afpSet
1b0c0 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62  Lock(context->db
1b0d0 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 53 48 41  Path, pFile, SHA
1b0e0 52 45 44 5f 46 49 52 53 54 2c 20 0a 20 20 20 20  RED_FIRST, .    
1b0f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b100 20 20 20 20 20 20 20 20 20 20 20 53 48 41 52 45             SHARE
1b110 44 5f 53 49 5a 45 2c 20 31 29 3b 0a 20 20 20 20  D_SIZE, 1);.    
1b120 20 20 20 20 69 66 28 20 66 61 69 6c 65 64 20 26      if( failed &
1b130 26 20 28 66 61 69 6c 65 64 32 20 3d 20 61 66 70  & (failed2 = afp
1b140 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d  SetLock(context-
1b150 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20  >dbPath, pFile, 
1b160 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1b170 20 20 20 20 20 20 20 20 53 48 41 52 45 44 5f 46          SHARED_F
1b180 49 52 53 54 20 2b 20 70 49 6e 6f 64 65 2d 3e 73  IRST + pInode->s
1b190 68 61 72 65 64 42 79 74 65 2c 20 31 2c 20 31 29  haredByte, 1, 1)
1b1a0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  ) ){.          /
1b1b0 2a 20 43 61 6e 27 74 20 72 65 65 73 74 61 62 6c  * Can't reestabl
1b1c0 69 73 68 20 74 68 65 20 73 68 61 72 65 64 20 6c  ish the shared l
1b1d0 6f 63 6b 2e 20 20 53 71 6c 69 74 65 20 63 61 6e  ock.  Sqlite can
1b1e0 27 74 20 64 65 61 6c 2c 20 74 68 69 73 20 69 73  't deal, this is
1b1f0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 20  .          ** a 
1b200 63 72 69 74 69 63 61 6c 20 49 2f 4f 20 65 72 72  critical I/O err
1b210 6f 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  or.          */.
1b220 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 28            rc = (
1b230 28 66 61 69 6c 65 64 20 26 20 30 78 66 66 29 20  (failed & 0xff) 
1b240 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 29  == SQLITE_IOERR)
1b250 20 3f 20 66 61 69 6c 65 64 32 20 3a 20 0a 20 20   ? failed2 : .  
1b260 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
1b270 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a  ITE_IOERR_LOCK;.
1b280 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 61            goto a
1b290 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20  fp_end_lock;.   
1b2a0 20 20 20 20 20 7d 20 0a 20 20 20 20 20 20 7d 65       } .      }e
1b2b0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20  lse{.        rc 
1b2c0 3d 20 66 61 69 6c 65 64 3b 20 0a 20 20 20 20 20  = failed; .     
1b2d0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
1b2e0 20 66 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20   failed ){.     
1b2f0 20 72 63 20 3d 20 66 61 69 6c 65 64 3b 0a 20 20   rc = failed;.  
1b300 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 69 66 28    }.  }.  .  if(
1b310 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1b320 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69  {.    pFile->eFi
1b330 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f  leLock = eFileLo
1b340 63 6b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e  ck;.    pInode->
1b350 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c  eFileLock = eFil
1b360 65 4c 6f 63 6b 3b 0a 20 20 7d 65 6c 73 65 20 69  eLock;.  }else i
1b370 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58  f( eFileLock==EX
1b380 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a  CLUSIVE_LOCK ){.
1b390 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65      pFile->eFile
1b3a0 4c 6f 63 6b 20 3d 20 50 45 4e 44 49 4e 47 5f 4c  Lock = PENDING_L
1b3b0 4f 43 4b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d  OCK;.    pInode-
1b3c0 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e  >eFileLock = PEN
1b3d0 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a 20  DING_LOCK;.  }. 
1b3e0 20 0a 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3a 0a   .afp_end_lock:.
1b3f0 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
1b400 28 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  ();.  OSTRACE(("
1b410 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 25 73  LOCK    %d %s %s
1b420 20 28 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65   (afp)\n", pFile
1b430 2d 3e 68 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28  ->h, azFileLock(
1b440 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 0a 20 20 20  eFileLock), .   
1b450 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45        rc==SQLITE
1b460 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61  _OK ? "ok" : "fa
1b470 69 6c 65 64 22 29 29 3b 0a 20 20 72 65 74 75 72  iled"));.  retur
1b480 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  n rc;.}../*.** L
1b490 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67  ower the locking
1b4a0 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64   level on file d
1b4b0 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20  escriptor pFile 
1b4c0 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65  to eFileLock.  e
1b4d0 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74  FileLock.** must
1b4e0 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f   be either NO_LO
1b4f0 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43  CK or SHARED_LOC
1b500 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  K..**.** If the 
1b510 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66  locking level of
1b520 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
1b530 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20  ptor is already 
1b540 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74  at or below.** t
1b550 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63  he requested loc
1b560 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69 73  king level, this
1b570 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
1b580 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  -op..*/.static i
1b590 6e 74 20 61 66 70 55 6e 6c 6f 63 6b 28 73 71 6c  nt afpUnlock(sql
1b5a0 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
1b5b0 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a  nt eFileLock) {.
1b5c0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1b5d0 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65  E_OK;.  unixFile
1b5e0 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
1b5f0 69 6c 65 2a 29 69 64 3b 0a 20 20 75 6e 69 78 49  ile*)id;.  unixI
1b600 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65  nodeInfo *pInode
1b610 3b 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f  ;.  afpLockingCo
1b620 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 20 3d  ntext *context =
1b630 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74   (afpLockingCont
1b640 65 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f  ext *) pFile->lo
1b650 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20  ckingContext;.  
1b660 69 6e 74 20 73 6b 69 70 53 68 61 72 65 64 20 3d  int skipShared =
1b670 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   0;.#ifdef SQLIT
1b680 45 5f 54 45 53 54 0a 20 20 69 6e 74 20 68 20 3d  E_TEST.  int h =
1b690 20 70 46 69 6c 65 2d 3e 68 3b 0a 23 65 6e 64 69   pFile->h;.#endi
1b6a0 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  f..  assert( pFi
1b6b0 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  le );.  OSTRACE(
1b6c0 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20  ("UNLOCK  %d %d 
1b6d0 77 61 73 20 25 64 28 25 64 2c 25 64 29 20 70 69  was %d(%d,%d) pi
1b6e0 64 3d 25 64 20 28 61 66 70 29 5c 6e 22 2c 20 70  d=%d (afp)\n", p
1b6f0 46 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f  File->h, eFileLo
1b700 63 6b 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  ck,.           p
1b710 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c  File->eFileLock,
1b720 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e   pFile->pInode->
1b730 65 46 69 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c 65  eFileLock, pFile
1b740 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  ->pInode->nShare
1b750 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 6f 73  d,.           os
1b760 47 65 74 70 69 64 28 30 29 29 29 3b 0a 0a 20 20  Getpid(0)));..  
1b770 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63  assert( eFileLoc
1b780 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k<=SHARED_LOCK )
1b790 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65  ;.  if( pFile->e
1b7a0 46 69 6c 65 4c 6f 63 6b 3c 3d 65 46 69 6c 65 4c  FileLock<=eFileL
1b7b0 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ock ){.    retur
1b7c0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
1b7d0 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  .  unixEnterMute
1b7e0 78 28 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20  x();.  pInode = 
1b7f0 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20  pFile->pInode;. 
1b800 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d   assert( pInode-
1b810 3e 6e 53 68 61 72 65 64 21 3d 30 20 29 3b 0a 20  >nShared!=0 );. 
1b820 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c   if( pFile->eFil
1b830 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43  eLock>SHARED_LOC
1b840 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  K ){.    assert(
1b850 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f   pInode->eFileLo
1b860 63 6b 3d 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65  ck==pFile->eFile
1b870 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 53 69 6d 75  Lock );.    Simu
1b880 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67  lateIOErrorBenig
1b890 6e 28 31 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61  n(1);.    Simula
1b8a0 74 65 49 4f 45 72 72 6f 72 28 20 68 3d 28 2d 31  teIOError( h=(-1
1b8b0 29 20 29 0a 20 20 20 20 53 69 6d 75 6c 61 74 65  ) ).    Simulate
1b8c0 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29  IOErrorBenign(0)
1b8d0 3b 0a 20 20 20 20 0a 23 69 66 64 65 66 20 53 51  ;.    .#ifdef SQ
1b8e0 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20 20 2f  LITE_DEBUG.    /
1b8f0 2a 20 57 68 65 6e 20 72 65 64 75 63 69 6e 67 20  * When reducing 
1b900 61 20 6c 6f 63 6b 20 73 75 63 68 20 74 68 61 74  a lock such that
1b910 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73   other processes
1b920 20 63 61 6e 20 73 74 61 72 74 0a 20 20 20 20 2a   can start.    *
1b930 2a 20 72 65 61 64 69 6e 67 20 74 68 65 20 64 61  * reading the da
1b940 74 61 62 61 73 65 20 66 69 6c 65 20 61 67 61 69  tabase file agai
1b950 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  n, make sure tha
1b960 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 72 61  t the.    ** tra
1b970 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72  nsaction counter
1b980 20 77 61 73 20 75 70 64 61 74 65 64 20 69 66 20   was updated if 
1b990 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65 20  any part of the 
1b9a0 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20  database.    ** 
1b9b0 66 69 6c 65 20 63 68 61 6e 67 65 64 2e 20 20 49  file changed.  I
1b9c0 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
1b9d0 6e 20 63 6f 75 6e 74 65 72 20 69 73 20 6e 6f 74  n counter is not
1b9e0 20 75 70 64 61 74 65 64 2c 0a 20 20 20 20 2a 2a   updated,.    **
1b9f0 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f   other connectio
1ba00 6e 73 20 74 6f 20 74 68 65 20 73 61 6d 65 20 66  ns to the same f
1ba10 69 6c 65 20 6d 69 67 68 74 20 6e 6f 74 20 72 65  ile might not re
1ba20 61 6c 69 7a 65 20 74 68 61 74 0a 20 20 20 20 2a  alize that.    *
1ba30 2a 20 74 68 65 20 66 69 6c 65 20 68 61 73 20 63  * the file has c
1ba40 68 61 6e 67 65 64 20 61 6e 64 20 68 65 6e 63 65  hanged and hence
1ba50 20 6d 69 67 68 74 20 6e 6f 74 20 6b 6e 6f 77 20   might not know 
1ba60 74 6f 20 66 6c 75 73 68 20 74 68 65 69 72 0a 20  to flush their. 
1ba70 20 20 20 2a 2a 20 63 61 63 68 65 2e 20 20 54 68     ** cache.  Th
1ba80 65 20 75 73 65 20 6f 66 20 61 20 73 74 61 6c 65  e use of a stale
1ba90 20 63 61 63 68 65 20 63 61 6e 20 6c 65 61 64 20   cache can lead 
1baa0 74 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72 72  to database corr
1bab0 75 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  uption..    */. 
1bac0 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65     assert( pFile
1bad0 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 3d  ->inNormalWrite=
1bae0 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  =0.           ||
1baf0 20 70 46 69 6c 65 2d 3e 64 62 55 70 64 61 74 65   pFile->dbUpdate
1bb00 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 7c  ==0.           |
1bb10 7c 20 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e  | pFile->transCn
1bb20 74 72 43 68 6e 67 3d 3d 31 20 29 3b 0a 20 20 20  trChng==1 );.   
1bb30 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c   pFile->inNormal
1bb40 57 72 69 74 65 20 3d 20 30 3b 0a 23 65 6e 64 69  Write = 0;.#endi
1bb50 66 0a 20 20 20 20 0a 20 20 20 20 69 66 28 20 70  f.    .    if( p
1bb60 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  File->eFileLock=
1bb70 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
1bb80 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61 66  ){.      rc = af
1bb90 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  pSetLock(context
1bba0 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c  ->dbPath, pFile,
1bbb0 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20 53   SHARED_FIRST, S
1bbc0 48 41 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a  HARED_SIZE, 0);.
1bbd0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
1bbe0 4c 49 54 45 5f 4f 4b 20 26 26 20 28 65 46 69 6c  LITE_OK && (eFil
1bbf0 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
1bc00 43 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 6e 53  CK || pInode->nS
1bc10 68 61 72 65 64 3e 31 29 20 29 7b 0a 20 20 20 20  hared>1) ){.    
1bc20 20 20 20 20 2f 2a 20 6f 6e 6c 79 20 72 65 2d 65      /* only re-e
1bc30 73 74 61 62 6c 69 73 68 20 74 68 65 20 73 68 61  stablish the sha
1bc40 72 65 64 20 6c 6f 63 6b 20 69 66 20 6e 65 63 65  red lock if nece
1bc50 73 73 61 72 79 20 2a 2f 0a 20 20 20 20 20 20 20  ssary */.       
1bc60 20 69 6e 74 20 73 68 61 72 65 64 4c 6f 63 6b 42   int sharedLockB
1bc70 79 74 65 20 3d 20 53 48 41 52 45 44 5f 46 49 52  yte = SHARED_FIR
1bc80 53 54 2b 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65  ST+pInode->share
1bc90 64 42 79 74 65 3b 0a 20 20 20 20 20 20 20 20 72  dByte;.        r
1bca0 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63  c = afpSetLock(c
1bcb0 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20  ontext->dbPath, 
1bcc0 70 46 69 6c 65 2c 20 73 68 61 72 65 64 4c 6f 63  pFile, sharedLoc
1bcd0 6b 42 79 74 65 2c 20 31 2c 20 31 29 3b 0a 20 20  kByte, 1, 1);.  
1bce0 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
1bcf0 20 20 20 20 20 73 6b 69 70 53 68 61 72 65 64 20       skipShared 
1bd00 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
1bd10 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
1bd20 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 46 69 6c  QLITE_OK && pFil
1bd30 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 50 45  e->eFileLock>=PE
1bd40 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 7b 0a 20 20  NDING_LOCK ){.  
1bd50 20 20 20 20 72 63 20 3d 20 61 66 70 53 65 74 4c      rc = afpSetL
1bd60 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50  ock(context->dbP
1bd70 61 74 68 2c 20 70 46 69 6c 65 2c 20 50 45 4e 44  ath, pFile, PEND
1bd80 49 4e 47 5f 42 59 54 45 2c 20 31 2c 20 30 29 3b  ING_BYTE, 1, 0);
1bd90 0a 20 20 20 20 7d 20 0a 20 20 20 20 69 66 28 20  .    } .    if( 
1bda0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1bdb0 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
1bdc0 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  k>=RESERVED_LOCK
1bdd0 20 26 26 20 63 6f 6e 74 65 78 74 2d 3e 72 65 73   && context->res
1bde0 65 72 76 65 64 20 29 7b 0a 20 20 20 20 20 20 72  erved ){.      r
1bdf0 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63  c = afpSetLock(c
1be00 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20  ontext->dbPath, 
1be10 70 46 69 6c 65 2c 20 52 45 53 45 52 56 45 44 5f  pFile, RESERVED_
1be20 42 59 54 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20  BYTE, 1, 0);.   
1be30 20 20 20 69 66 28 20 21 72 63 20 29 7b 20 0a 20     if( !rc ){ . 
1be40 20 20 20 20 20 20 20 63 6f 6e 74 65 78 74 2d 3e         context->
1be50 72 65 73 65 72 76 65 64 20 3d 20 30 3b 20 0a 20  reserved = 0; . 
1be60 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1be70 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1be80 4f 4b 20 26 26 20 28 65 46 69 6c 65 4c 6f 63 6b  OK && (eFileLock
1be90 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c  ==SHARED_LOCK ||
1bea0 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
1beb0 3e 31 29 29 7b 0a 20 20 20 20 20 20 70 49 6e 6f  >1)){.      pIno
1bec0 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  de->eFileLock = 
1bed0 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20  SHARED_LOCK;.   
1bee0 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d   }.  }.  if( rc=
1bef0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65 46  =SQLITE_OK && eF
1bf00 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b  ileLock==NO_LOCK
1bf10 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72   ){..    /* Decr
1bf20 65 6d 65 6e 74 20 74 68 65 20 73 68 61 72 65 64  ement the shared
1bf30 20 6c 6f 63 6b 20 63 6f 75 6e 74 65 72 2e 20 20   lock counter.  
1bf40 52 65 6c 65 61 73 65 20 74 68 65 20 6c 6f 63 6b  Release the lock
1bf50 20 75 73 69 6e 67 20 61 6e 0a 20 20 20 20 2a 2a   using an.    **
1bf60 20 4f 53 20 63 61 6c 6c 20 6f 6e 6c 79 20 77 68   OS call only wh
1bf70 65 6e 20 61 6c 6c 20 74 68 72 65 61 64 73 20 69  en all threads i
1bf80 6e 20 74 68 69 73 20 73 61 6d 65 20 70 72 6f 63  n this same proc
1bf90 65 73 73 20 68 61 76 65 20 72 65 6c 65 61 73 65  ess have release
1bfa0 64 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c 6f 63  d.    ** the loc
1bfb0 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 75 6e  k..    */.    un
1bfc0 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67  signed long long
1bfd0 20 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 20   sharedLockByte 
1bfe0 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b 70  = SHARED_FIRST+p
1bff0 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79 74  Inode->sharedByt
1c000 65 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e  e;.    pInode->n
1c010 53 68 61 72 65 64 2d 2d 3b 0a 20 20 20 20 69 66  Shared--;.    if
1c020 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  ( pInode->nShare
1c030 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 53 69  d==0 ){.      Si
1c040 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e  mulateIOErrorBen
1c050 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 53 69  ign(1);.      Si
1c060 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 68  mulateIOError( h
1c070 3d 28 2d 31 29 20 29 0a 20 20 20 20 20 20 53 69  =(-1) ).      Si
1c080 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e  mulateIOErrorBen
1c090 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 69 66  ign(0);.      if
1c0a0 28 20 21 73 6b 69 70 53 68 61 72 65 64 20 29 7b  ( !skipShared ){
1c0b0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 66  .        rc = af
1c0c0 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  pSetLock(context
1c0d0 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c  ->dbPath, pFile,
1c0e0 20 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c   sharedLockByte,
1c0f0 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a   1, 0);.      }.
1c100 20 20 20 20 20 20 69 66 28 20 21 72 63 20 29 7b        if( !rc ){
1c110 0a 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d  .        pInode-
1c120 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f  >eFileLock = NO_
1c130 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 70 46  LOCK;.        pF
1c140 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
1c150 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20   NO_LOCK;.      
1c160 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
1c170 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1c180 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e  .      pInode->n
1c190 4c 6f 63 6b 2d 2d 3b 0a 20 20 20 20 20 20 61 73  Lock--;.      as
1c1a0 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c  sert( pInode->nL
1c1b0 6f 63 6b 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20  ock>=0 );.      
1c1c0 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63  if( pInode->nLoc
1c1d0 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  k==0 ){.        
1c1e0 63 6c 6f 73 65 50 65 6e 64 69 6e 67 46 64 73 28  closePendingFds(
1c1f0 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 7d 0a  pFile);.      }.
1c200 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 75      }.  }.  .  u
1c210 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
1c220 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1c230 45 5f 4f 4b 20 29 20 70 46 69 6c 65 2d 3e 65 46  E_OK ) pFile->eF
1c240 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c  ileLock = eFileL
1c250 6f 63 6b 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ock;.  return rc
1c260 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
1c270 20 61 20 66 69 6c 65 20 26 20 63 6c 65 61 6e 75   a file & cleanu
1c280 70 20 41 46 50 20 73 70 65 63 69 66 69 63 20 6c  p AFP specific l
1c290 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 0a  ocking context .
1c2a0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66  */.static int af
1c2b0 70 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66  pClose(sqlite3_f
1c2c0 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69 6e 74  ile *id) {.  int
1c2d0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1c2e0 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
1c2f0 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
1c300 69 64 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64  id;.  assert( id
1c310 21 3d 30 20 29 3b 0a 20 20 61 66 70 55 6e 6c 6f  !=0 );.  afpUnlo
1c320 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b  ck(id, NO_LOCK);
1c330 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  .  unixEnterMute
1c340 78 28 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65  x();.  if( pFile
1c350 2d 3e 70 49 6e 6f 64 65 20 26 26 20 70 46 69 6c  ->pInode && pFil
1c360 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b  e->pInode->nLock
1c370 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   ){.    /* If th
1c380 65 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64  ere are outstand
1c390 69 6e 67 20 6c 6f 63 6b 73 2c 20 64 6f 20 6e 6f  ing locks, do no
1c3a0 74 20 61 63 74 75 61 6c 6c 79 20 63 6c 6f 73 65  t actually close
1c3b0 20 74 68 65 20 66 69 6c 65 20 6a 75 73 74 0a 20   the file just. 
1c3c0 20 20 20 2a 2a 20 79 65 74 20 62 65 63 61 75 73     ** yet becaus
1c3d0 65 20 74 68 61 74 20 77 6f 75 6c 64 20 63 6c 65  e that would cle
1c3e0 61 72 20 74 68 6f 73 65 20 6c 6f 63 6b 73 2e 20  ar those locks. 
1c3f0 20 49 6e 73 74 65 61 64 2c 20 61 64 64 20 74 68   Instead, add th
1c400 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 64 65  e file.    ** de
1c410 73 63 72 69 70 74 6f 72 20 74 6f 20 70 49 6e 6f  scriptor to pIno
1c420 64 65 2d 3e 61 50 65 6e 64 69 6e 67 2e 20 20 49  de->aPending.  I
1c430 74 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61  t will be automa
1c440 74 69 63 61 6c 6c 79 20 63 6c 6f 73 65 64 20 77  tically closed w
1c450 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c  hen.    ** the l
1c460 61 73 74 20 6c 6f 63 6b 20 69 73 20 63 6c 65 61  ast lock is clea
1c470 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  red..    */.    
1c480 73 65 74 50 65 6e 64 69 6e 67 46 64 28 70 46 69  setPendingFd(pFi
1c490 6c 65 29 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61  le);.  }.  relea
1c4a0 73 65 49 6e 6f 64 65 49 6e 66 6f 28 70 46 69 6c  seInodeInfo(pFil
1c4b0 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  e);.  sqlite3_fr
1c4c0 65 65 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e  ee(pFile->lockin
1c4d0 67 43 6f 6e 74 65 78 74 29 3b 0a 20 20 72 63 20  gContext);.  rc 
1c4e0 3d 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28  = closeUnixFile(
1c4f0 69 64 29 3b 0a 20 20 75 6e 69 78 4c 65 61 76 65  id);.  unixLeave
1c500 4d 75 74 65 78 28 29 3b 0a 20 20 72 65 74 75 72  Mutex();.  retur
1c510 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20  n rc;.}..#endif 
1c520 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  /* defined(__APP
1c530 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f  LE__) && SQLITE_
1c540 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
1c550 54 59 4c 45 20 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68  TYLE */./*.** Th
1c560 65 20 63 6f 64 65 20 61 62 6f 76 65 20 69 73 20  e code above is 
1c570 74 68 65 20 41 46 50 20 6c 6f 63 6b 20 69 6d 70  the AFP lock imp
1c580 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 20 54 68  lementation.  Th
1c590 65 20 63 6f 64 65 20 69 73 20 73 70 65 63 69 66  e code is specif
1c5a0 69 63 0a 2a 2a 20 74 6f 20 4d 61 63 4f 53 58 20  ic.** to MacOSX 
1c5b0 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72  and does not wor
1c5c0 6b 20 6f 6e 20 6f 74 68 65 72 20 75 6e 69 78 20  k on other unix 
1c5d0 70 6c 61 74 66 6f 72 6d 73 2e 20 20 4e 6f 20 61  platforms.  No a
1c5e0 6c 74 65 72 6e 61 74 69 76 65 0a 2a 2a 20 69 73  lternative.** is
1c5f0 20 61 76 61 69 6c 61 62 6c 65 2e 20 20 49 66 20   available.  If 
1c600 79 6f 75 20 64 6f 6e 27 74 20 63 6f 6d 70 69 6c  you don't compil
1c610 65 20 66 6f 72 20 61 20 6d 61 63 2c 20 74 68 65  e for a mac, the
1c620 6e 20 74 68 65 20 22 75 6e 69 78 2d 61 66 70 22  n the "unix-afp"
1c630 0a 2a 2a 20 56 46 53 20 69 73 20 6e 6f 74 20 61  .** VFS is not a
1c640 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 2a  vailable..**.***
1c650 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c660 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 41 46  ** End of the AF
1c670 50 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74  P lock implement
1c680 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ation **********
1c690 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
1c6a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c6b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c6c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c6d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c6e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a  ***********/../*
1c6f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c700 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c710 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c720 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c730 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
1c740 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c750 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20  ********* Begin 
1c760 4e 46 53 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a  NFS Locking ****
1c770 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c780 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 23  ************/..#
1c790 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
1c7a0 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f  LE__) && SQLITE_
1c7b0 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
1c7c0 54 59 4c 45 0a 2f 2a 0a 20 2a 2a 20 4c 6f 77 65  TYLE./*. ** Lowe
1c7d0 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  r the locking le
1c7e0 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63  vel on file desc
1c7f0 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20  riptor pFile to 
1c800 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c  eFileLock.  eFil
1c810 65 4c 6f 63 6b 0a 20 2a 2a 20 6d 75 73 74 20 62  eLock. ** must b
1c820 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b  e either NO_LOCK
1c830 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e   or SHARED_LOCK.
1c840 0a 20 2a 2a 0a 20 2a 2a 20 49 66 20 74 68 65 20  . **. ** If the 
1c850 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66  locking level of
1c860 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
1c870 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20  ptor is already 
1c880 61 74 20 6f 72 20 62 65 6c 6f 77 0a 20 2a 2a 20  at or below. ** 
1c890 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
1c8a0 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69  cking level, thi
1c8b0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
1c8c0 6f 2d 6f 70 2e 0a 20 2a 2f 0a 73 74 61 74 69 63  o-op.. */.static
1c8d0 20 69 6e 74 20 6e 66 73 55 6e 6c 6f 63 6b 28 73   int nfsUnlock(s
1c8e0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
1c8f0 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b   int eFileLock){
1c900 0a 20 20 72 65 74 75 72 6e 20 70 6f 73 69 78 55  .  return posixU
1c910 6e 6c 6f 63 6b 28 69 64 2c 20 65 46 69 6c 65 4c  nlock(id, eFileL
1c920 6f 63 6b 2c 20 31 29 3b 0a 7d 0a 0a 23 65 6e 64  ock, 1);.}..#end
1c930 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f  if /* defined(__
1c940 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49  APPLE__) && SQLI
1c950 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
1c960 47 5f 53 54 59 4c 45 20 2a 2f 0a 2f 2a 0a 2a 2a  G_STYLE */./*.**
1c970 20 54 68 65 20 63 6f 64 65 20 61 62 6f 76 65 20   The code above 
1c980 69 73 20 74 68 65 20 4e 46 53 20 6c 6f 63 6b 20  is the NFS lock 
1c990 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 20  implementation. 
1c9a0 20 54 68 65 20 63 6f 64 65 20 69 73 20 73 70 65   The code is spe
1c9b0 63 69 66 69 63 0a 2a 2a 20 74 6f 20 4d 61 63 4f  cific.** to MacO
1c9c0 53 58 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20  SX and does not 
1c9d0 77 6f 72 6b 20 6f 6e 20 6f 74 68 65 72 20 75 6e  work on other un
1c9e0 69 78 20 70 6c 61 74 66 6f 72 6d 73 2e 20 20 4e  ix platforms.  N
1c9f0 6f 20 61 6c 74 65 72 6e 61 74 69 76 65 0a 2a 2a  o alternative.**
1ca00 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 20 20   is available.  
1ca10 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .**.************
1ca20 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66  ********* End of
1ca30 20 74 68 65 20 4e 46 53 20 6c 6f 63 6b 20 69 6d   the NFS lock im
1ca40 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a  plementation ***
1ca50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ca60 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
1ca70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ca80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ca90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1caa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1cab0 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **/../**********
1cac0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1cad0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1cae0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1caf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1cb00 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
1cb10 2a 2a 2a 2a 2a 20 4e 6f 6e 2d 6c 6f 63 6b 69 6e  ***** Non-lockin
1cb20 67 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 6d  g sqlite3_file m
1cb30 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ethods *********
1cb40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1cb50 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e  ****.**.** The n
1cb60 65 78 74 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e  ext division con
1cb70 74 61 69 6e 73 20 69 6d 70 6c 65 6d 65 6e 74 61  tains implementa
1cb80 74 69 6f 6e 73 20 66 6f 72 20 61 6c 6c 20 6d 65  tions for all me
1cb90 74 68 6f 64 73 20 6f 66 20 74 68 65 20 0a 2a 2a  thods of the .**
1cba0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 6f 62   sqlite3_file ob
1cbb0 6a 65 63 74 20 6f 74 68 65 72 20 74 68 61 6e 20  ject other than 
1cbc0 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68  the locking meth
1cbd0 6f 64 73 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e  ods.  The lockin
1cbe0 67 0a 2a 2a 20 6d 65 74 68 6f 64 73 20 77 65 72  g.** methods wer
1cbf0 65 20 64 65 66 69 6e 65 64 20 69 6e 20 64 69 76  e defined in div
1cc00 69 73 69 6f 6e 73 20 61 62 6f 76 65 20 28 6f 6e  isions above (on
1cc10 65 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64  e locking method
1cc20 20 70 65 72 0a 2a 2a 20 64 69 76 69 73 69 6f 6e   per.** division
1cc30 29 2e 20 20 54 68 6f 73 65 20 6d 65 74 68 6f 64  ).  Those method
1cc40 73 20 74 68 61 74 20 61 72 65 20 63 6f 6d 6d 6f  s that are commo
1cc50 6e 20 74 6f 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67  n to all locking
1cc60 20 6d 6f 64 65 73 0a 2a 2a 20 61 72 65 20 67 61   modes.** are ga
1cc70 74 68 65 72 20 74 6f 67 65 74 68 65 72 20 69 6e  ther together in
1cc80 74 6f 20 74 68 69 73 20 64 69 76 69 73 69 6f 6e  to this division
1cc90 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b  ..*/../*.** Seek
1cca0 20 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20 70   to the offset p
1ccb0 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
1ccc0 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c 20 74 68  ond argument, th
1ccd0 65 6e 20 72 65 61 64 20 63 6e 74 20 0a 2a 2a 20  en read cnt .** 
1cce0 62 79 74 65 73 20 69 6e 74 6f 20 70 42 75 66 2e  bytes into pBuf.
1ccf0 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
1cd00 65 72 20 6f 66 20 62 79 74 65 73 20 61 63 74 75  er of bytes actu
1cd10 61 6c 6c 79 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a  ally read..**.**
1cd20 20 4e 42 3a 20 20 49 66 20 79 6f 75 20 64 65 66   NB:  If you def
1cd30 69 6e 65 20 55 53 45 5f 50 52 45 41 44 20 6f 72  ine USE_PREAD or
1cd40 20 55 53 45 5f 50 52 45 41 44 36 34 2c 20 74 68   USE_PREAD64, th
1cd50 65 6e 20 69 74 20 6d 69 67 68 74 20 61 6c 73 6f  en it might also
1cd60 0a 2a 2a 20 62 65 20 6e 65 63 65 73 73 61 72 79  .** be necessary
1cd70 20 74 6f 20 64 65 66 69 6e 65 20 5f 58 4f 50 45   to define _XOPE
1cd80 4e 5f 53 4f 55 52 43 45 20 74 6f 20 62 65 20 35  N_SOURCE to be 5
1cd90 30 30 2e 20 20 54 68 69 73 20 76 61 72 69 65 73  00.  This varies
1cda0 20 66 72 6f 6d 0a 2a 2a 20 6f 6e 65 20 73 79 73   from.** one sys
1cdb0 74 65 6d 20 74 6f 20 61 6e 6f 74 68 65 72 2e 20  tem to another. 
1cdc0 20 53 69 6e 63 65 20 53 51 4c 69 74 65 20 64 6f   Since SQLite do
1cdd0 65 73 20 6e 6f 74 20 64 65 66 69 6e 65 20 55 53  es not define US
1cde0 45 5f 50 52 45 41 44 0a 2a 2a 20 69 6e 20 61 6e  E_PREAD.** in an
1cdf0 79 20 66 6f 72 6d 20 62 79 20 64 65 66 61 75 6c  y form by defaul
1ce00 74 2c 20 77 65 20 77 69 6c 6c 20 6e 6f 74 20 61  t, we will not a
1ce10 74 74 65 6d 70 74 20 74 6f 20 64 65 66 69 6e 65  ttempt to define
1ce20 20 5f 58 4f 50 45 4e 5f 53 4f 55 52 43 45 2e 0a   _XOPEN_SOURCE..
1ce30 2a 2a 20 53 65 65 20 74 69 63 6b 65 74 73 20 23  ** See tickets #
1ce40 32 37 34 31 20 61 6e 64 20 23 32 36 38 31 2e 0a  2741 and #2681..
1ce50 2a 2a 0a 2a 2a 20 54 6f 20 61 76 6f 69 64 20 73  **.** To avoid s
1ce60 74 6f 6d 70 69 6e 67 20 74 68 65 20 65 72 72 6e  tomping the errn
1ce70 6f 20 76 61 6c 75 65 20 6f 6e 20 61 20 66 61 69  o value on a fai
1ce80 6c 65 64 20 72 65 61 64 20 74 68 65 20 6c 61 73  led read the las
1ce90 74 45 72 72 6e 6f 20 76 61 6c 75 65 0a 2a 2a 20  tErrno value.** 
1cea0 69 73 20 73 65 74 20 62 65 66 6f 72 65 20 72 65  is set before re
1ceb0 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  turning..*/.stat
1cec0 69 63 20 69 6e 74 20 73 65 65 6b 41 6e 64 52 65  ic int seekAndRe
1ced0 61 64 28 75 6e 69 78 46 69 6c 65 20 2a 69 64 2c  ad(unixFile *id,
1cee0 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f   sqlite3_int64 o
1cef0 66 66 73 65 74 2c 20 76 6f 69 64 20 2a 70 42 75  ffset, void *pBu
1cf00 66 2c 20 69 6e 74 20 63 6e 74 29 7b 0a 20 20 69  f, int cnt){.  i
1cf10 6e 74 20 67 6f 74 3b 0a 20 20 69 6e 74 20 70 72  nt got;.  int pr
1cf20 69 6f 72 20 3d 20 30 3b 0a 23 69 66 20 28 21 64  ior = 0;.#if (!d
1cf30 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44  efined(USE_PREAD
1cf40 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 55 53  ) && !defined(US
1cf50 45 5f 50 52 45 41 44 36 34 29 29 0a 20 20 69 36  E_PREAD64)).  i6
1cf60 34 20 6e 65 77 4f 66 66 73 65 74 3b 0a 23 65 6e  4 newOffset;.#en
1cf70 64 69 66 0a 20 20 54 49 4d 45 52 5f 53 54 41 52  dif.  TIMER_STAR
1cf80 54 3b 0a 20 20 61 73 73 65 72 74 28 20 63 6e 74  T;.  assert( cnt
1cf90 3d 3d 28 63 6e 74 26 30 78 31 66 66 66 66 29 20  ==(cnt&0x1ffff) 
1cfa0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 2d  );.  assert( id-
1cfb0 3e 68 3e 32 20 29 3b 0a 20 20 64 6f 7b 0a 23 69  >h>2 );.  do{.#i
1cfc0 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52  f defined(USE_PR
1cfd0 45 41 44 29 0a 20 20 20 20 67 6f 74 20 3d 20 6f  EAD).    got = o
1cfe0 73 50 72 65 61 64 28 69 64 2d 3e 68 2c 20 70 42  sPread(id->h, pB
1cff0 75 66 2c 20 63 6e 74 2c 20 6f 66 66 73 65 74 29  uf, cnt, offset)
1d000 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f  ;.    SimulateIO
1d010 45 72 72 6f 72 28 20 67 6f 74 20 3d 20 2d 31 20  Error( got = -1 
1d020 29 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e 65 64  );.#elif defined
1d030 28 55 53 45 5f 50 52 45 41 44 36 34 29 0a 20 20  (USE_PREAD64).  
1d040 20 20 67 6f 74 20 3d 20 6f 73 50 72 65 61 64 36    got = osPread6
1d050 34 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63  4(id->h, pBuf, c
1d060 6e 74 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 20  nt, offset);.   
1d070 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
1d080 28 20 67 6f 74 20 3d 20 2d 31 20 29 3b 0a 23 65  ( got = -1 );.#e
1d090 6c 73 65 0a 20 20 20 20 6e 65 77 4f 66 66 73 65  lse.    newOffse
1d0a0 74 20 3d 20 6c 73 65 65 6b 28 69 64 2d 3e 68 2c  t = lseek(id->h,
1d0b0 20 6f 66 66 73 65 74 2c 20 53 45 45 4b 5f 53 45   offset, SEEK_SE
1d0c0 54 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65  T);.    Simulate
1d0d0 49 4f 45 72 72 6f 72 28 20 6e 65 77 4f 66 66 73  IOError( newOffs
1d0e0 65 74 20 3d 20 2d 31 20 29 3b 0a 20 20 20 20 69  et = -1 );.    i
1d0f0 66 28 20 6e 65 77 4f 66 66 73 65 74 3c 30 20 29  f( newOffset<0 )
1d100 7b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73  {.      storeLas
1d110 74 45 72 72 6e 6f 28 28 75 6e 69 78 46 69 6c 65  tErrno((unixFile
1d120 2a 29 69 64 2c 20 65 72 72 6e 6f 29 3b 0a 20 20  *)id, errno);.  
1d130 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20      return -1;. 
1d140 20 20 20 7d 0a 20 20 20 20 67 6f 74 20 3d 20 6f     }.    got = o
1d150 73 52 65 61 64 28 69 64 2d 3e 68 2c 20 70 42 75  sRead(id->h, pBu
1d160 66 2c 20 63 6e 74 29 3b 0a 23 65 6e 64 69 66 0a  f, cnt);.#endif.
1d170 20 20 20 20 69 66 28 20 67 6f 74 3d 3d 63 6e 74      if( got==cnt
1d180 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66   ) break;.    if
1d190 28 20 67 6f 74 3c 30 20 29 7b 0a 20 20 20 20 20  ( got<0 ){.     
1d1a0 20 69 66 28 20 65 72 72 6e 6f 3d 3d 45 49 4e 54   if( errno==EINT
1d1b0 52 20 29 7b 20 67 6f 74 20 3d 20 31 3b 20 63 6f  R ){ got = 1; co
1d1c0 6e 74 69 6e 75 65 3b 20 7d 0a 20 20 20 20 20 20  ntinue; }.      
1d1d0 70 72 69 6f 72 20 3d 20 30 3b 0a 20 20 20 20 20  prior = 0;.     
1d1e0 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28   storeLastErrno(
1d1f0 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 2c 20 20  (unixFile*)id,  
1d200 65 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 62 72  errno);.      br
1d210 65 61 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  eak;.    }else i
1d220 66 28 20 67 6f 74 3e 30 20 29 7b 0a 20 20 20 20  f( got>0 ){.    
1d230 20 20 63 6e 74 20 2d 3d 20 67 6f 74 3b 0a 20 20    cnt -= got;.  
1d240 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 67 6f      offset += go
1d250 74 3b 0a 20 20 20 20 20 20 70 72 69 6f 72 20 2b  t;.      prior +
1d260 3d 20 67 6f 74 3b 0a 20 20 20 20 20 20 70 42 75  = got;.      pBu
1d270 66 20 3d 20 28 76 6f 69 64 2a 29 28 67 6f 74 20  f = (void*)(got 
1d280 2b 20 28 63 68 61 72 2a 29 70 42 75 66 29 3b 0a  + (char*)pBuf);.
1d290 20 20 20 20 7d 0a 20 20 7d 77 68 69 6c 65 28 20      }.  }while( 
1d2a0 67 6f 74 3e 30 20 29 3b 0a 20 20 54 49 4d 45 52  got>0 );.  TIMER
1d2b0 5f 45 4e 44 3b 0a 20 20 4f 53 54 52 41 43 45 28  _END;.  OSTRACE(
1d2c0 28 22 52 45 41 44 20 20 20 20 25 2d 33 64 20 25  ("READ    %-3d %
1d2d0 35 64 20 25 37 6c 6c 64 20 25 6c 6c 75 5c 6e 22  5d %7lld %llu\n"
1d2e0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 64  ,.            id
1d2f0 2d 3e 68 2c 20 67 6f 74 2b 70 72 69 6f 72 2c 20  ->h, got+prior, 
1d300 6f 66 66 73 65 74 2d 70 72 69 6f 72 2c 20 54 49  offset-prior, TI
1d310 4d 45 52 5f 45 4c 41 50 53 45 44 29 29 3b 0a 20  MER_ELAPSED));. 
1d320 20 72 65 74 75 72 6e 20 67 6f 74 2b 70 72 69 6f   return got+prio
1d330 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  r;.}../*.** Read
1d340 20 64 61 74 61 20 66 72 6f 6d 20 61 20 66 69 6c   data from a fil
1d350 65 20 69 6e 74 6f 20 61 20 62 75 66 66 65 72 2e  e into a buffer.
1d360 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
1d370 4f 4b 20 69 66 20 61 6c 6c 0a 2a 2a 20 62 79 74  OK if all.** byt
1d380 65 73 20 77 65 72 65 20 72 65 61 64 20 73 75 63  es were read suc
1d390 63 65 73 73 66 75 6c 6c 79 20 61 6e 64 20 53 51  cessfully and SQ
1d3a0 4c 49 54 45 5f 49 4f 45 52 52 20 69 66 20 61 6e  LITE_IOERR if an
1d3b0 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77  ything goes.** w
1d3c0 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rong..*/.static 
1d3d0 69 6e 74 20 75 6e 69 78 52 65 61 64 28 0a 20 20  int unixRead(.  
1d3e0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
1d3f0 2c 20 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c  , .  void *pBuf,
1d400 20 0a 20 20 69 6e 74 20 61 6d 74 2c 0a 20 20 73   .  int amt,.  s
1d410 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6f 66 66  qlite3_int64 off
1d420 73 65 74 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c  set.){.  unixFil
1d430 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
1d440 46 69 6c 65 20 2a 29 69 64 3b 0a 20 20 69 6e 74  File *)id;.  int
1d450 20 67 6f 74 3b 0a 20 20 61 73 73 65 72 74 28 20   got;.  assert( 
1d460 69 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  id );.  assert( 
1d470 6f 66 66 73 65 74 3e 3d 30 20 29 3b 0a 20 20 61  offset>=0 );.  a
1d480 73 73 65 72 74 28 20 61 6d 74 3e 30 20 29 3b 0a  ssert( amt>0 );.
1d490 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73  .  /* If this is
1d4a0 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65   a database file
1d4b0 20 28 6e 6f 74 20 61 20 6a 6f 75 72 6e 61 6c 2c   (not a journal,
1d4c0 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
1d4d0 6f 72 20 74 65 6d 70 0a 20 20 2a 2a 20 66 69 6c  or temp.  ** fil
1d4e0 65 29 2c 20 74 68 65 20 62 79 74 65 73 20 69 6e  e), the bytes in
1d4f0 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 72 61 6e   the locking ran
1d500 67 65 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20  ge should never 
1d510 62 65 20 72 65 61 64 20 6f 72 20 77 72 69 74 74  be read or writt
1d520 65 6e 2e 20 2a 2f 0a 23 69 66 20 30 0a 20 20 61  en. */.#if 0.  a
1d530 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 70 50  ssert( pFile->pP
1d540 72 65 61 6c 6c 6f 63 61 74 65 64 55 6e 75 73 65  reallocatedUnuse
1d550 64 3d 3d 30 0a 20 20 20 20 20 20 20 7c 7c 20 6f  d==0.       || o
1d560 66 66 73 65 74 3e 3d 50 45 4e 44 49 4e 47 5f 42  ffset>=PENDING_B
1d570 59 54 45 2b 35 31 32 0a 20 20 20 20 20 20 20 7c  YTE+512.       |
1d580 7c 20 6f 66 66 73 65 74 2b 61 6d 74 3c 3d 50 45  | offset+amt<=PE
1d590 4e 44 49 4e 47 5f 42 59 54 45 20 0a 20 20 29 3b  NDING_BYTE .  );
1d5a0 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c  .#endif..#if SQL
1d5b0 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
1d5c0 45 3e 30 0a 20 20 2f 2a 20 44 65 61 6c 20 77 69  E>0.  /* Deal wi
1d5d0 74 68 20 61 73 20 6d 75 63 68 20 6f 66 20 74 68  th as much of th
1d5e0 69 73 20 72 65 61 64 20 72 65 71 75 65 73 74 20  is read request 
1d5f0 61 73 20 70 6f 73 73 69 62 6c 65 20 62 79 20 74  as possible by t
1d600 72 61 6e 73 66 65 72 69 6e 67 0a 20 20 2a 2a 20  ransfering.  ** 
1d610 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 6d 65  data from the me
1d620 6d 6f 72 79 20 6d 61 70 70 69 6e 67 20 75 73 69  mory mapping usi
1d630 6e 67 20 6d 65 6d 63 70 79 28 29 2e 20 20 2a 2f  ng memcpy().  */
1d640 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c 70 46  .  if( offset<pF
1d650 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b  ile->mmapSize ){
1d660 0a 20 20 20 20 69 66 28 20 6f 66 66 73 65 74 2b  .    if( offset+
1d670 61 6d 74 20 3c 3d 20 70 46 69 6c 65 2d 3e 6d 6d  amt <= pFile->mm
1d680 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  apSize ){.      
1d690 6d 65 6d 63 70 79 28 70 42 75 66 2c 20 26 28 28  memcpy(pBuf, &((
1d6a0 75 38 20 2a 29 28 70 46 69 6c 65 2d 3e 70 4d 61  u8 *)(pFile->pMa
1d6b0 70 52 65 67 69 6f 6e 29 29 5b 6f 66 66 73 65 74  pRegion))[offset
1d6c0 5d 2c 20 61 6d 74 29 3b 0a 20 20 20 20 20 20 72  ], amt);.      r
1d6d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1d6e0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1d6f0 20 20 69 6e 74 20 6e 43 6f 70 79 20 3d 20 70 46    int nCopy = pF
1d700 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 2d 20  ile->mmapSize - 
1d710 6f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 6d 65  offset;.      me
1d720 6d 63 70 79 28 70 42 75 66 2c 20 26 28 28 75 38  mcpy(pBuf, &((u8
1d730 20 2a 29 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52   *)(pFile->pMapR
1d740 65 67 69 6f 6e 29 29 5b 6f 66 66 73 65 74 5d 2c  egion))[offset],
1d750 20 6e 43 6f 70 79 29 3b 0a 20 20 20 20 20 20 70   nCopy);.      p
1d760 42 75 66 20 3d 20 26 28 28 75 38 20 2a 29 70 42  Buf = &((u8 *)pB
1d770 75 66 29 5b 6e 43 6f 70 79 5d 3b 0a 20 20 20 20  uf)[nCopy];.    
1d780 20 20 61 6d 74 20 2d 3d 20 6e 43 6f 70 79 3b 0a    amt -= nCopy;.
1d790 20 20 20 20 20 20 6f 66 66 73 65 74 20 2b 3d 20        offset += 
1d7a0 6e 43 6f 70 79 3b 0a 20 20 20 20 7d 0a 20 20 7d  nCopy;.    }.  }
1d7b0 0a 23 65 6e 64 69 66 0a 0a 20 20 67 6f 74 20 3d  .#endif..  got =
1d7c0 20 73 65 65 6b 41 6e 64 52 65 61 64 28 70 46 69   seekAndRead(pFi
1d7d0 6c 65 2c 20 6f 66 66 73 65 74 2c 20 70 42 75 66  le, offset, pBuf
1d7e0 2c 20 61 6d 74 29 3b 0a 20 20 69 66 28 20 67 6f  , amt);.  if( go
1d7f0 74 3d 3d 61 6d 74 20 29 7b 0a 20 20 20 20 72 65  t==amt ){.    re
1d800 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1d810 20 20 7d 65 6c 73 65 20 69 66 28 20 67 6f 74 3c    }else if( got<
1d820 30 20 29 7b 0a 20 20 20 20 2f 2a 20 6c 61 73 74  0 ){.    /* last
1d830 45 72 72 6e 6f 20 73 65 74 20 62 79 20 73 65 65  Errno set by see
1d840 6b 41 6e 64 52 65 61 64 20 2a 2f 0a 20 20 20 20  kAndRead */.    
1d850 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
1d860 45 52 52 5f 52 45 41 44 3b 0a 20 20 7d 65 6c 73  ERR_READ;.  }els
1d870 65 7b 0a 20 20 20 20 73 74 6f 72 65 4c 61 73 74  e{.    storeLast
1d880 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 30 29 3b  Errno(pFile, 0);
1d890 20 20 20 2f 2a 20 6e 6f 74 20 61 20 73 79 73 74     /* not a syst
1d8a0 65 6d 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20  em error */.    
1d8b0 2f 2a 20 55 6e 72 65 61 64 20 70 61 72 74 73 20  /* Unread parts 
1d8c0 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 6d 75  of the buffer mu
1d8d0 73 74 20 62 65 20 7a 65 72 6f 2d 66 69 6c 6c 65  st be zero-fille
1d8e0 64 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28  d */.    memset(
1d8f0 26 28 28 63 68 61 72 2a 29 70 42 75 66 29 5b 67  &((char*)pBuf)[g
1d900 6f 74 5d 2c 20 30 2c 20 61 6d 74 2d 67 6f 74 29  ot], 0, amt-got)
1d910 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
1d920 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f  ITE_IOERR_SHORT_
1d930 52 45 41 44 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  READ;.  }.}../*.
1d940 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73 65  ** Attempt to se
1d950 65 6b 20 74 68 65 20 66 69 6c 65 2d 64 65 73 63  ek the file-desc
1d960 72 69 70 74 6f 72 20 70 61 73 73 65 64 20 61 73  riptor passed as
1d970 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
1d980 65 6e 74 20 74 6f 0a 2a 2a 20 61 62 73 6f 6c 75  ent to.** absolu
1d990 74 65 20 6f 66 66 73 65 74 20 69 4f 66 66 2c 20  te offset iOff, 
1d9a0 74 68 65 6e 20 61 74 74 65 6d 70 74 20 74 6f 20  then attempt to 
1d9b0 77 72 69 74 65 20 6e 42 75 66 20 62 79 74 65 73  write nBuf bytes
1d9c0 20 6f 66 20 64 61 74 61 20 66 72 6f 6d 0a 2a 2a   of data from.**
1d9d0 20 70 42 75 66 20 74 6f 20 69 74 2e 20 49 66 20   pBuf to it. If 
1d9e0 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
1d9f0 20 72 65 74 75 72 6e 20 2d 31 20 61 6e 64 20 73   return -1 and s
1da00 65 74 20 2a 70 69 45 72 72 6e 6f 2e 20 4f 74 68  et *piErrno. Oth
1da10 65 72 77 69 73 65 2c 20 0a 2a 2a 20 72 65 74 75  erwise, .** retu
1da20 72 6e 20 74 68 65 20 61 63 74 75 61 6c 20 6e 75  rn the actual nu
1da30 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 77 72  mber of bytes wr
1da40 69 74 74 65 6e 20 28 77 68 69 63 68 20 6d 61 79  itten (which may
1da50 20 62 65 20 6c 65 73 73 20 74 68 61 6e 0a 2a 2a   be less than.**
1da60 20 6e 42 75 66 29 2e 0a 2a 2f 0a 73 74 61 74 69   nBuf)..*/.stati
1da70 63 20 69 6e 74 20 73 65 65 6b 41 6e 64 57 72 69  c int seekAndWri
1da80 74 65 46 64 28 0a 20 20 69 6e 74 20 66 64 2c 20  teFd(.  int fd, 
1da90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1daa0 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20          /* File 
1dab0 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20 77 72  descriptor to wr
1dac0 69 74 65 20 74 6f 20 2a 2f 0a 20 20 69 36 34 20  ite to */.  i64 
1dad0 69 4f 66 66 2c 20 20 20 20 20 20 20 20 20 20 20  iOff,           
1dae0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
1daf0 69 6c 65 20 6f 66 66 73 65 74 20 74 6f 20 62 65  ile offset to be
1db00 67 69 6e 20 77 72 69 74 69 6e 67 20 61 74 20 2a  gin writing at *
1db10 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  /.  const void *
1db20 70 42 75 66 2c 20 20 20 20 20 20 20 20 20 20 20  pBuf,           
1db30 20 20 20 20 2f 2a 20 43 6f 70 79 20 64 61 74 61      /* Copy data
1db40 20 66 72 6f 6d 20 74 68 69 73 20 62 75 66 66 65   from this buffe
1db50 72 20 74 6f 20 74 68 65 20 66 69 6c 65 20 2a 2f  r to the file */
1db60 0a 20 20 69 6e 74 20 6e 42 75 66 2c 20 20 20 20  .  int nBuf,    
1db70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1db80 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 62 75     /* Size of bu
1db90 66 66 65 72 20 70 42 75 66 20 69 6e 20 62 79 74  ffer pBuf in byt
1dba0 65 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 69 45  es */.  int *piE
1dbb0 72 72 6e 6f 20 20 20 20 20 20 20 20 20 20 20 20  rrno            
1dbc0 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
1dbd0 45 72 72 6f 72 20 6e 75 6d 62 65 72 20 69 66 20  Error number if 
1dbe0 65 72 72 6f 72 20 6f 63 63 75 72 73 20 2a 2f 0a  error occurs */.
1dbf0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b  ){.  int rc = 0;
1dc00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc10 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 72 65       /* Value re
1dc20 74 75 72 6e 65 64 20 62 79 20 73 79 73 74 65 6d  turned by system
1dc30 20 63 61 6c 6c 20 2a 2f 0a 0a 20 20 61 73 73 65   call */..  asse
1dc40 72 74 28 20 6e 42 75 66 3d 3d 28 6e 42 75 66 26  rt( nBuf==(nBuf&
1dc50 30 78 31 66 66 66 66 29 20 29 3b 0a 20 20 61 73  0x1ffff) );.  as
1dc60 73 65 72 74 28 20 66 64 3e 32 20 29 3b 0a 20 20  sert( fd>2 );.  
1dc70 61 73 73 65 72 74 28 20 70 69 45 72 72 6e 6f 21  assert( piErrno!
1dc80 3d 30 20 29 3b 0a 20 20 6e 42 75 66 20 26 3d 20  =0 );.  nBuf &= 
1dc90 30 78 31 66 66 66 66 3b 0a 20 20 54 49 4d 45 52  0x1ffff;.  TIMER
1dca0 5f 53 54 41 52 54 3b 0a 0a 23 69 66 20 64 65 66  _START;..#if def
1dcb0 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29 0a  ined(USE_PREAD).
1dcc0 20 20 64 6f 7b 20 72 63 20 3d 20 28 69 6e 74 29    do{ rc = (int)
1dcd0 6f 73 50 77 72 69 74 65 28 66 64 2c 20 70 42 75  osPwrite(fd, pBu
1dce0 66 2c 20 6e 42 75 66 2c 20 69 4f 66 66 29 3b 20  f, nBuf, iOff); 
1dcf0 7d 77 68 69 6c 65 28 20 72 63 3c 30 20 26 26 20  }while( rc<0 && 
1dd00 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a  errno==EINTR );.
1dd10 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 55 53  #elif defined(US
1dd20 45 5f 50 52 45 41 44 36 34 29 0a 20 20 64 6f 7b  E_PREAD64).  do{
1dd30 20 72 63 20 3d 20 28 69 6e 74 29 6f 73 50 77 72   rc = (int)osPwr
1dd40 69 74 65 36 34 28 66 64 2c 20 70 42 75 66 2c 20  ite64(fd, pBuf, 
1dd50 6e 42 75 66 2c 20 69 4f 66 66 29 3b 7d 77 68 69  nBuf, iOff);}whi
1dd60 6c 65 28 20 72 63 3c 30 20 26 26 20 65 72 72 6e  le( rc<0 && errn
1dd70 6f 3d 3d 45 49 4e 54 52 29 3b 0a 23 65 6c 73 65  o==EINTR);.#else
1dd80 0a 20 20 64 6f 7b 0a 20 20 20 20 69 36 34 20 69  .  do{.    i64 i
1dd90 53 65 65 6b 20 3d 20 6c 73 65 65 6b 28 66 64 2c  Seek = lseek(fd,
1dda0 20 69 4f 66 66 2c 20 53 45 45 4b 5f 53 45 54 29   iOff, SEEK_SET)
1ddb0 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f  ;.    SimulateIO
1ddc0 45 72 72 6f 72 28 20 69 53 65 65 6b 20 3d 20 2d  Error( iSeek = -
1ddd0 31 20 29 3b 0a 20 20 20 20 69 66 28 20 69 53 65  1 );.    if( iSe
1dde0 65 6b 3c 30 20 29 7b 0a 20 20 20 20 20 20 72 63  ek<0 ){.      rc
1ddf0 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 62 72 65   = -1;.      bre
1de00 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  ak;.    }.    rc
1de10 20 3d 20 6f 73 57 72 69 74 65 28 66 64 2c 20 70   = osWrite(fd, p
1de20 42 75 66 2c 20 6e 42 75 66 29 3b 0a 20 20 7d 77  Buf, nBuf);.  }w
1de30 68 69 6c 65 28 20 72 63 3c 30 20 26 26 20 65 72  hile( rc<0 && er
1de40 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 23 65  rno==EINTR );.#e
1de50 6e 64 69 66 0a 0a 20 20 54 49 4d 45 52 5f 45 4e  ndif..  TIMER_EN
1de60 44 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 57  D;.  OSTRACE(("W
1de70 52 49 54 45 20 20 20 25 2d 33 64 20 25 35 64 20  RITE   %-3d %5d 
1de80 25 37 6c 6c 64 20 25 6c 6c 75 5c 6e 22 2c 20 66  %7lld %llu\n", f
1de90 64 2c 20 72 63 2c 20 69 4f 66 66 2c 20 54 49 4d  d, rc, iOff, TIM
1dea0 45 52 5f 45 4c 41 50 53 45 44 29 29 3b 0a 0a 20  ER_ELAPSED));.. 
1deb0 20 69 66 28 20 72 63 3c 30 20 29 20 2a 70 69 45   if( rc<0 ) *piE
1dec0 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
1ded0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
1dee0 2a 0a 2a 2a 20 53 65 65 6b 20 74 6f 20 74 68 65  *.** Seek to the
1def0 20 6f 66 66 73 65 74 20 69 6e 20 69 64 2d 3e 6f   offset in id->o
1df00 66 66 73 65 74 20 74 68 65 6e 20 72 65 61 64 20  ffset then read 
1df10 63 6e 74 20 62 79 74 65 73 20 69 6e 74 6f 20 70  cnt bytes into p
1df20 42 75 66 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74  Buf..** Return t
1df30 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
1df40 65 73 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64  es actually read
1df50 2e 20 20 55 70 64 61 74 65 20 74 68 65 20 6f 66  .  Update the of
1df60 66 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61  fset..**.** To a
1df70 76 6f 69 64 20 73 74 6f 6d 70 69 6e 67 20 74 68  void stomping th
1df80 65 20 65 72 72 6e 6f 20 76 61 6c 75 65 20 6f 6e  e errno value on
1df90 20 61 20 66 61 69 6c 65 64 20 77 72 69 74 65 20   a failed write 
1dfa0 74 68 65 20 6c 61 73 74 45 72 72 6e 6f 20 76 61  the lastErrno va
1dfb0 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 62 65  lue.** is set be
1dfc0 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
1dfd0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
1dfe0 65 6b 41 6e 64 57 72 69 74 65 28 75 6e 69 78 46  ekAndWrite(unixF
1dff0 69 6c 65 20 2a 69 64 2c 20 69 36 34 20 6f 66 66  ile *id, i64 off
1e000 73 65 74 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20  set, const void 
1e010 2a 70 42 75 66 2c 20 69 6e 74 20 63 6e 74 29 7b  *pBuf, int cnt){
1e020 0a 20 20 72 65 74 75 72 6e 20 73 65 65 6b 41 6e  .  return seekAn
1e030 64 57 72 69 74 65 46 64 28 69 64 2d 3e 68 2c 20  dWriteFd(id->h, 
1e040 6f 66 66 73 65 74 2c 20 70 42 75 66 2c 20 63 6e  offset, pBuf, cn
1e050 74 2c 20 26 69 64 2d 3e 6c 61 73 74 45 72 72 6e  t, &id->lastErrn
1e060 6f 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72  o);.}.../*.** Wr
1e070 69 74 65 20 64 61 74 61 20 66 72 6f 6d 20 61 20  ite data from a 
1e080 62 75 66 66 65 72 20 69 6e 74 6f 20 61 20 66 69  buffer into a fi
1e090 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  le.  Return SQLI
1e0a0 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
1e0b0 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65  .** or some othe
1e0c0 72 20 65 72 72 6f 72 20 63 6f 64 65 20 6f 6e 20  r error code on 
1e0d0 66 61 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74  failure..*/.stat
1e0e0 69 63 20 69 6e 74 20 75 6e 69 78 57 72 69 74 65  ic int unixWrite
1e0f0 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  (.  sqlite3_file
1e100 20 2a 69 64 2c 20 0a 20 20 63 6f 6e 73 74 20 76   *id, .  const v
1e110 6f 69 64 20 2a 70 42 75 66 2c 20 0a 20 20 69 6e  oid *pBuf, .  in
1e120 74 20 61 6d 74 2c 0a 20 20 73 71 6c 69 74 65 33  t amt,.  sqlite3
1e130 5f 69 6e 74 36 34 20 6f 66 66 73 65 74 20 0a 29  _int64 offset .)
1e140 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  {.  unixFile *pF
1e150 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
1e160 29 69 64 3b 0a 20 20 69 6e 74 20 77 72 6f 74 65  )id;.  int wrote
1e170 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20   = 0;.  assert( 
1e180 69 64 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  id );.  assert( 
1e190 61 6d 74 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 49  amt>0 );..  /* I
1e1a0 66 20 74 68 69 73 20 69 73 20 61 20 64 61 74 61  f this is a data
1e1b0 62 61 73 65 20 66 69 6c 65 20 28 6e 6f 74 20 61  base file (not a
1e1c0 20 6a 6f 75 72 6e 61 6c 2c 20 6d 61 73 74 65 72   journal, master
1e1d0 2d 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 65 6d 70  -journal or temp
1e1e0 0a 20 20 2a 2a 20 66 69 6c 65 29 2c 20 74 68 65  .  ** file), the
1e1f0 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6c 6f   bytes in the lo
1e200 63 6b 69 6e 67 20 72 61 6e 67 65 20 73 68 6f 75  cking range shou
1e210 6c 64 20 6e 65 76 65 72 20 62 65 20 72 65 61 64  ld never be read
1e220 20 6f 72 20 77 72 69 74 74 65 6e 2e 20 2a 2f 0a   or written. */.
1e230 23 69 66 20 30 0a 20 20 61 73 73 65 72 74 28 20  #if 0.  assert( 
1e240 70 46 69 6c 65 2d 3e 70 50 72 65 61 6c 6c 6f 63  pFile->pPrealloc
1e250 61 74 65 64 55 6e 75 73 65 64 3d 3d 30 0a 20 20  atedUnused==0.  
1e260 20 20 20 20 20 7c 7c 20 6f 66 66 73 65 74 3e 3d       || offset>=
1e270 50 45 4e 44 49 4e 47 5f 42 59 54 45 2b 35 31 32  PENDING_BYTE+512
1e280 0a 20 20 20 20 20 20 20 7c 7c 20 6f 66 66 73 65  .       || offse
1e290 74 2b 61 6d 74 3c 3d 50 45 4e 44 49 4e 47 5f 42  t+amt<=PENDING_B
1e2a0 59 54 45 20 0a 20 20 29 3b 0a 23 65 6e 64 69 66  YTE .  );.#endif
1e2b0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
1e2c0 44 45 42 55 47 0a 20 20 2f 2a 20 49 66 20 77 65  DEBUG.  /* If we
1e2d0 20 61 72 65 20 64 6f 69 6e 67 20 61 20 6e 6f 72   are doing a nor
1e2e0 6d 61 6c 20 77 72 69 74 65 20 74 6f 20 61 20 64  mal write to a d
1e2f0 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 61 73  atabase file (as
1e300 20 6f 70 70 6f 73 65 64 20 74 6f 0a 20 20 2a 2a   opposed to.  **
1e310 20 64 6f 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75   doing a hot-jou
1e320 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 6f 72  rnal rollback or
1e330 20 61 20 77 72 69 74 65 20 74 6f 20 73 6f 6d 65   a write to some
1e340 20 66 69 6c 65 20 6f 74 68 65 72 20 74 68 61 6e   file other than
1e350 20 61 0a 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20 64   a.  ** normal d
1e360 61 74 61 62 61 73 65 20 66 69 6c 65 29 20 74 68  atabase file) th
1e370 65 6e 20 72 65 63 6f 72 64 20 74 68 65 20 66 61  en record the fa
1e380 63 74 20 74 68 61 74 20 74 68 65 20 64 61 74 61  ct that the data
1e390 62 61 73 65 0a 20 20 2a 2a 20 68 61 73 20 63 68  base.  ** has ch
1e3a0 61 6e 67 65 64 2e 20 20 49 66 20 74 68 65 20 74  anged.  If the t
1e3b0 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74  ransaction count
1e3c0 65 72 20 69 73 20 6d 6f 64 69 66 69 65 64 2c 20  er is modified, 
1e3d0 72 65 63 6f 72 64 20 74 68 61 74 0a 20 20 2a 2a  record that.  **
1e3e0 20 66 61 63 74 20 74 6f 6f 2e 0a 20 20 2a 2f 0a   fact too..  */.
1e3f0 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 69 6e 4e    if( pFile->inN
1e400 6f 72 6d 61 6c 57 72 69 74 65 20 29 7b 0a 20 20  ormalWrite ){.  
1e410 20 20 70 46 69 6c 65 2d 3e 64 62 55 70 64 61 74    pFile->dbUpdat
1e420 65 20 3d 20 31 3b 20 20 2f 2a 20 54 68 65 20 64  e = 1;  /* The d
1e430 61 74 61 62 61 73 65 20 68 61 73 20 62 65 65 6e  atabase has been
1e440 20 6d 6f 64 69 66 69 65 64 20 2a 2f 0a 20 20 20   modified */.   
1e450 20 69 66 28 20 6f 66 66 73 65 74 3c 3d 32 34 20   if( offset<=24 
1e460 26 26 20 6f 66 66 73 65 74 2b 61 6d 74 3e 3d 32  && offset+amt>=2
1e470 37 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  7 ){.      int r
1e480 63 3b 0a 20 20 20 20 20 20 63 68 61 72 20 6f 6c  c;.      char ol
1e490 64 43 6e 74 72 5b 34 5d 3b 0a 20 20 20 20 20 20  dCntr[4];.      
1e4a0 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42  SimulateIOErrorB
1e4b0 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20  enign(1);.      
1e4c0 72 63 20 3d 20 73 65 65 6b 41 6e 64 52 65 61 64  rc = seekAndRead
1e4d0 28 70 46 69 6c 65 2c 20 32 34 2c 20 6f 6c 64 43  (pFile, 24, oldC
1e4e0 6e 74 72 2c 20 34 29 3b 0a 20 20 20 20 20 20 53  ntr, 4);.      S
1e4f0 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65  imulateIOErrorBe
1e500 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 69  nign(0);.      i
1e510 66 28 20 72 63 21 3d 34 20 7c 7c 20 6d 65 6d 63  f( rc!=4 || memc
1e520 6d 70 28 6f 6c 64 43 6e 74 72 2c 20 26 28 28 63  mp(oldCntr, &((c
1e530 68 61 72 2a 29 70 42 75 66 29 5b 32 34 2d 6f 66  har*)pBuf)[24-of
1e540 66 73 65 74 5d 2c 20 34 29 21 3d 30 20 29 7b 0a  fset], 4)!=0 ){.
1e550 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 74          pFile->t
1e560 72 61 6e 73 43 6e 74 72 43 68 6e 67 20 3d 20 31  ransCntrChng = 1
1e570 3b 20 20 2f 2a 20 54 68 65 20 74 72 61 6e 73 61  ;  /* The transa
1e580 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 68 61  ction counter ha
1e590 73 20 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20 20  s changed */.   
1e5a0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23     }.    }.  }.#
1e5b0 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e  endif..#if defin
1e5c0 65 64 28 53 51 4c 49 54 45 5f 4d 4d 41 50 5f 52  ed(SQLITE_MMAP_R
1e5d0 45 41 44 57 52 49 54 45 29 20 26 26 20 53 51 4c  EADWRITE) && SQL
1e5e0 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
1e5f0 45 3e 30 0a 20 20 2f 2a 20 44 65 61 6c 20 77 69  E>0.  /* Deal wi
1e600 74 68 20 61 73 20 6d 75 63 68 20 6f 66 20 74 68  th as much of th
1e610 69 73 20 77 72 69 74 65 20 72 65 71 75 65 73 74  is write request
1e620 20 61 73 20 70 6f 73 73 69 62 6c 65 20 62 79 20   as possible by 
1e630 74 72 61 6e 73 66 65 72 69 6e 67 0a 20 20 2a 2a  transfering.  **
1e640 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 6d   data from the m
1e650 65 6d 6f 72 79 20 6d 61 70 70 69 6e 67 20 75 73  emory mapping us
1e660 69 6e 67 20 6d 65 6d 63 70 79 28 29 2e 20 20 2a  ing memcpy().  *
1e670 2f 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c 70  /.  if( offset<p
1e680 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29  File->mmapSize )
1e690 7b 0a 20 20 20 20 69 66 28 20 6f 66 66 73 65 74  {.    if( offset
1e6a0 2b 61 6d 74 20 3c 3d 20 70 46 69 6c 65 2d 3e 6d  +amt <= pFile->m
1e6b0 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  mapSize ){.     
1e6c0 20 6d 65 6d 63 70 79 28 26 28 28 75 38 20 2a 29   memcpy(&((u8 *)
1e6d0 28 70 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69  (pFile->pMapRegi
1e6e0 6f 6e 29 29 5b 6f 66 66 73 65 74 5d 2c 20 70 42  on))[offset], pB
1e6f0 75 66 2c 20 61 6d 74 29 3b 0a 20 20 20 20 20 20  uf, amt);.      
1e700 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1e710 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1e720 20 20 20 69 6e 74 20 6e 43 6f 70 79 20 3d 20 70     int nCopy = p
1e730 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 2d  File->mmapSize -
1e740 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 20 20 6d   offset;.      m
1e750 65 6d 63 70 79 28 26 28 28 75 38 20 2a 29 28 70  emcpy(&((u8 *)(p
1e760 46 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e  File->pMapRegion
1e770 29 29 5b 6f 66 66 73 65 74 5d 2c 20 70 42 75 66  ))[offset], pBuf
1e780 2c 20 6e 43 6f 70 79 29 3b 0a 20 20 20 20 20 20  , nCopy);.      
1e790 70 42 75 66 20 3d 20 26 28 28 75 38 20 2a 29 70  pBuf = &((u8 *)p
1e7a0 42 75 66 29 5b 6e 43 6f 70 79 5d 3b 0a 20 20 20  Buf)[nCopy];.   
1e7b0 20 20 20 61 6d 74 20 2d 3d 20 6e 43 6f 70 79 3b     amt -= nCopy;
1e7c0 0a 20 20 20 20 20 20 6f 66 66 73 65 74 20 2b 3d  .      offset +=
1e7d0 20 6e 43 6f 70 79 3b 0a 20 20 20 20 7d 0a 20 20   nCopy;.    }.  
1e7e0 7d 0a 23 65 6e 64 69 66 0a 20 0a 20 20 77 68 69  }.#endif. .  whi
1e7f0 6c 65 28 20 28 77 72 6f 74 65 20 3d 20 73 65 65  le( (wrote = see
1e800 6b 41 6e 64 57 72 69 74 65 28 70 46 69 6c 65 2c  kAndWrite(pFile,
1e810 20 6f 66 66 73 65 74 2c 20 70 42 75 66 2c 20 61   offset, pBuf, a
1e820 6d 74 29 29 3c 61 6d 74 20 26 26 20 77 72 6f 74  mt))<amt && wrot
1e830 65 3e 30 20 29 7b 0a 20 20 20 20 61 6d 74 20 2d  e>0 ){.    amt -
1e840 3d 20 77 72 6f 74 65 3b 0a 20 20 20 20 6f 66 66  = wrote;.    off
1e850 73 65 74 20 2b 3d 20 77 72 6f 74 65 3b 0a 20 20  set += wrote;.  
1e860 20 20 70 42 75 66 20 3d 20 26 28 28 63 68 61 72    pBuf = &((char
1e870 2a 29 70 42 75 66 29 5b 77 72 6f 74 65 5d 3b 0a  *)pBuf)[wrote];.
1e880 20 20 7d 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f    }.  SimulateIO
1e890 45 72 72 6f 72 28 28 20 77 72 6f 74 65 3d 28 2d  Error(( wrote=(-
1e8a0 31 29 2c 20 61 6d 74 3d 31 20 29 29 3b 0a 20 20  1), amt=1 ));.  
1e8b0 53 69 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c 6c  SimulateDiskfull
1e8c0 45 72 72 6f 72 28 28 20 77 72 6f 74 65 3d 30 2c  Error(( wrote=0,
1e8d0 20 61 6d 74 3d 31 20 29 29 3b 0a 0a 20 20 69 66   amt=1 ));..  if
1e8e0 28 20 61 6d 74 3e 77 72 6f 74 65 20 29 7b 0a 20  ( amt>wrote ){. 
1e8f0 20 20 20 69 66 28 20 77 72 6f 74 65 3c 30 20 26     if( wrote<0 &
1e900 26 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  & pFile->lastErr
1e910 6e 6f 21 3d 45 4e 4f 53 50 43 20 29 7b 0a 20 20  no!=ENOSPC ){.  
1e920 20 20 20 20 2f 2a 20 6c 61 73 74 45 72 72 6e 6f      /* lastErrno
1e930 20 73 65 74 20 62 79 20 73 65 65 6b 41 6e 64 57   set by seekAndW
1e940 72 69 74 65 20 2a 2f 0a 20 20 20 20 20 20 72 65  rite */.      re
1e950 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
1e960 52 5f 57 52 49 54 45 3b 0a 20 20 20 20 7d 65 6c  R_WRITE;.    }el
1e970 73 65 7b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c  se{.      storeL
1e980 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20  astErrno(pFile, 
1e990 30 29 3b 20 2f 2a 20 6e 6f 74 20 61 20 73 79 73  0); /* not a sys
1e9a0 74 65 6d 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20  tem error */.   
1e9b0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1e9c0 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d  _FULL;.    }.  }
1e9d0 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ..  return SQLIT
1e9e0 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  E_OK;.}..#ifdef 
1e9f0 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a  SQLITE_TEST./*.*
1ea00 2a 20 43 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62  * Count the numb
1ea10 65 72 20 6f 66 20 66 75 6c 6c 73 79 6e 63 73 20  er of fullsyncs 
1ea20 61 6e 64 20 6e 6f 72 6d 61 6c 20 73 79 6e 63 73  and normal syncs
1ea30 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20  .  This is used 
1ea40 74 6f 20 74 65 73 74 0a 2a 2a 20 74 68 61 74 20  to test.** that 
1ea50 73 79 6e 63 73 20 61 6e 64 20 66 75 6c 6c 73 79  syncs and fullsy
1ea60 6e 63 73 20 61 72 65 20 6f 63 63 75 72 72 69 6e  ncs are occurrin
1ea70 67 20 61 74 20 74 68 65 20 72 69 67 68 74 20 74  g at the right t
1ea80 69 6d 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  imes..*/.int sql
1ea90 69 74 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 20  ite3_sync_count 
1eaa0 3d 20 30 3b 0a 69 6e 74 20 73 71 6c 69 74 65 33  = 0;.int sqlite3
1eab0 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 20  _fullsync_count 
1eac0 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  = 0;.#endif../*.
1ead0 2a 2a 20 57 65 20 64 6f 20 6e 6f 74 20 74 72 75  ** We do not tru
1eae0 73 74 20 73 79 73 74 65 6d 73 20 74 6f 20 70 72  st systems to pr
1eaf0 6f 76 69 64 65 20 61 20 77 6f 72 6b 69 6e 67 20  ovide a working 
1eb00 66 64 61 74 61 73 79 6e 63 28 29 2e 20 20 53 6f  fdatasync().  So
1eb10 6d 65 20 64 6f 2e 0a 2a 2a 20 4f 74 68 65 72 73  me do..** Others
1eb20 20 64 6f 20 6e 6f 2e 20 20 54 6f 20 62 65 20 73   do no.  To be s
1eb30 61 66 65 2c 20 77 65 20 77 69 6c 6c 20 73 74 69  afe, we will sti
1eb40 63 6b 20 77 69 74 68 20 74 68 65 20 28 73 6c 69  ck with the (sli
1eb50 67 68 74 6c 79 20 73 6c 6f 77 65 72 29 0a 2a 2a  ghtly slower).**
1eb60 20 66 73 79 6e 63 28 29 2e 20 49 66 20 79 6f 75   fsync(). If you
1eb70 20 6b 6e 6f 77 20 74 68 61 74 20 79 6f 75 72 20   know that your 
1eb80 73 79 73 74 65 6d 20 64 6f 65 73 20 73 75 70 70  system does supp
1eb90 6f 72 74 20 66 64 61 74 61 73 79 6e 63 28 29 20  ort fdatasync() 
1eba0 63 6f 72 72 65 63 74 6c 79 2c 0a 2a 2a 20 74 68  correctly,.** th
1ebb0 65 6e 20 73 69 6d 70 6c 79 20 63 6f 6d 70 69 6c  en simply compil
1ebc0 65 20 77 69 74 68 20 2d 44 66 64 61 74 61 73 79  e with -Dfdatasy
1ebd0 6e 63 3d 66 64 61 74 61 73 79 6e 63 20 6f 72 20  nc=fdatasync or 
1ebe0 2d 44 48 41 56 45 5f 46 44 41 54 41 53 59 4e 43  -DHAVE_FDATASYNC
1ebf0 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64  .*/.#if !defined
1ec00 28 66 64 61 74 61 73 79 6e 63 29 20 26 26 20 21  (fdatasync) && !
1ec10 48 41 56 45 5f 46 44 41 54 41 53 59 4e 43 0a 23  HAVE_FDATASYNC.#
1ec20 20 64 65 66 69 6e 65 20 66 64 61 74 61 73 79 6e   define fdatasyn
1ec30 63 20 66 73 79 6e 63 0a 23 65 6e 64 69 66 0a 0a  c fsync.#endif..
1ec40 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65 20 48 41 56  /*.** Define HAV
1ec50 45 5f 46 55 4c 4c 46 53 59 4e 43 20 74 6f 20 30  E_FULLFSYNC to 0
1ec60 20 6f 72 20 31 20 64 65 70 65 6e 64 69 6e 67 20   or 1 depending 
1ec70 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  on whether or no
1ec80 74 0a 2a 2a 20 74 68 65 20 46 5f 46 55 4c 4c 46  t.** the F_FULLF
1ec90 53 59 4e 43 20 6d 61 63 72 6f 20 69 73 20 64 65  SYNC macro is de
1eca0 66 69 6e 65 64 2e 20 20 46 5f 46 55 4c 4c 46 53  fined.  F_FULLFS
1ecb0 59 4e 43 20 69 73 20 63 75 72 72 65 6e 74 6c 79  YNC is currently
1ecc0 0a 2a 2a 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62  .** only availab
1ecd0 6c 65 20 6f 6e 20 4d 61 63 20 4f 53 20 58 2e 20  le on Mac OS X. 
1ece0 20 42 75 74 20 74 68 61 74 20 63 6f 75 6c 64 20   But that could 
1ecf0 63 68 61 6e 67 65 2e 0a 2a 2f 0a 23 69 66 64 65  change..*/.#ifde
1ed00 66 20 46 5f 46 55 4c 4c 46 53 59 4e 43 0a 23 20  f F_FULLFSYNC.# 
1ed10 64 65 66 69 6e 65 20 48 41 56 45 5f 46 55 4c 4c  define HAVE_FULL
1ed20 46 53 59 4e 43 20 31 0a 23 65 6c 73 65 0a 23 20  FSYNC 1.#else.# 
1ed30 64 65 66 69 6e 65 20 48 41 56 45 5f 46 55 4c 4c  define HAVE_FULL
1ed40 46 53 59 4e 43 20 30 0a 23 65 6e 64 69 66 0a 0a  FSYNC 0.#endif..
1ed50 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 55 53  #ifdef SQLITE_US
1ed60 45 5f 52 45 51 55 45 53 54 5f 46 55 4c 4c 46 53  E_REQUEST_FULLFS
1ed70 59 4e 43 0a 23 69 6d 70 6f 72 74 20 3c 6e 6f 74  YNC.#import <not
1ed80 69 66 79 2e 68 3e 0a 23 69 6d 70 6f 72 74 20 3c  ify.h>.#import <
1ed90 6c 69 62 6b 65 72 6e 2f 4f 53 41 74 6f 6d 69 63  libkern/OSAtomic
1eda0 2e 68 3e 0a 73 74 61 74 69 63 20 4f 53 53 70 69  .h>.static OSSpi
1edb0 6e 4c 6f 63 6b 20 6e 6f 74 69 66 79 5f 6c 6f 63  nLock notify_loc
1edc0 6b 20 3d 20 30 3b 0a 23 64 65 66 69 6e 65 20 52  k = 0;.#define R
1edd0 45 51 55 45 53 54 5f 46 55 4c 4c 53 59 4e 43 5f  EQUEST_FULLSYNC_
1ede0 4e 4f 54 49 46 49 43 41 54 49 4f 4e 20 20 20 20  NOTIFICATION    
1edf0 22 63 6f 6d 2e 61 70 70 6c 65 2e 72 65 71 73 79  "com.apple.reqsy
1ee00 6e 63 22 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  nc".#endif../*.*
1ee10 2a 20 54 68 65 20 66 73 79 6e 63 28 29 20 73 79  * The fsync() sy
1ee20 73 74 65 6d 20 63 61 6c 6c 20 64 6f 65 73 20 6e  stem call does n
1ee30 6f 74 20 77 6f 72 6b 20 61 73 20 61 64 76 65 72  ot work as adver
1ee40 74 69 73 65 64 20 6f 6e 20 6d 61 6e 79 0a 2a 2a  tised on many.**
1ee50 20 75 6e 69 78 20 73 79 73 74 65 6d 73 2e 20 20   unix systems.  
1ee60 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 72  The following pr
1ee70 6f 63 65 64 75 72 65 20 69 73 20 61 6e 20 61 74  ocedure is an at
1ee80 74 65 6d 70 74 20 74 6f 20 6d 61 6b 65 0a 2a 2a  tempt to make.**
1ee90 20 69 74 20 77 6f 72 6b 20 62 65 74 74 65 72 2e   it work better.
1eea0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 49 54  .**.** The SQLIT
1eeb0 45 5f 4e 4f 5f 53 59 4e 43 20 6d 61 63 72 6f 20  E_NO_SYNC macro 
1eec0 64 69 73 61 62 6c 65 73 20 61 6c 6c 20 66 73 79  disables all fsy
1eed0 6e 63 28 29 73 2e 20 20 54 68 69 73 20 69 73 20  nc()s.  This is 
1eee0 75 73 65 66 75 6c 0a 2a 2a 20 66 6f 72 20 74 65  useful.** for te
1eef0 73 74 69 6e 67 20 77 68 65 6e 20 77 65 20 77 61  sting when we wa
1ef00 6e 74 20 74 6f 20 72 75 6e 20 74 68 72 6f 75 67  nt to run throug
1ef10 68 20 74 68 65 20 74 65 73 74 20 73 75 69 74 65  h the test suite
1ef20 20 71 75 69 63 6b 6c 79 2e 0a 2a 2a 20 59 6f 75   quickly..** You
1ef30 20 61 72 65 20 73 74 72 6f 6e 67 6c 79 20 61 64   are strongly ad
1ef40 76 69 73 65 64 20 2a 6e 6f 74 2a 20 74 6f 20 64  vised *not* to d
1ef50 65 70 6c 6f 79 20 77 69 74 68 20 53 51 4c 49 54  eploy with SQLIT
1ef60 45 5f 4e 4f 5f 53 59 4e 43 0a 2a 2a 20 65 6e 61  E_NO_SYNC.** ena
1ef70 62 6c 65 64 2c 20 68 6f 77 65 76 65 72 2c 20 73  bled, however, s
1ef80 69 6e 63 65 20 77 69 74 68 20 53 51 4c 49 54 45  ince with SQLITE
1ef90 5f 4e 4f 5f 53 59 4e 43 20 65 6e 61 62 6c 65 64  _NO_SYNC enabled
1efa0 2c 20 61 6e 20 4f 53 20 63 72 61 73 68 0a 2a 2a  , an OS crash.**
1efb0 20 6f 72 20 70 6f 77 65 72 20 66 61 69 6c 75 72   or power failur
1efc0 65 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 63 6f  e will likely co
1efd0 72 72 75 70 74 20 74 68 65 20 64 61 74 61 62 61  rrupt the databa
1efe0 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53  se file..**.** S
1eff0 51 4c 69 74 65 20 73 65 74 73 20 74 68 65 20 64  QLite sets the d
1f000 61 74 61 4f 6e 6c 79 20 66 6c 61 67 20 69 66 20  ataOnly flag if 
1f010 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
1f020 66 69 6c 65 20 69 73 20 75 6e 63 68 61 6e 67 65  file is unchange
1f030 64 2e 0a 2a 2a 20 54 68 65 20 69 64 65 61 20 62  d..** The idea b
1f040 65 68 69 6e 64 20 64 61 74 61 4f 6e 6c 79 20 69  ehind dataOnly i
1f050 73 20 74 68 61 74 20 69 74 20 73 68 6f 75 6c 64  s that it should
1f060 20 6f 6e 6c 79 20 77 72 69 74 65 20 74 68 65 20   only write the 
1f070 66 69 6c 65 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20  file content.** 
1f080 74 6f 20 64 69 73 6b 2c 20 6e 6f 74 20 74 68 65  to disk, not the
1f090 20 69 6e 6f 64 65 2e 20 20 57 65 20 6f 6e 6c 79   inode.  We only
1f0a0 20 73 65 74 20 64 61 74 61 4f 6e 6c 79 20 69 66   set dataOnly if
1f0b0 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20 69   the file size i
1f0c0 73 20 0a 2a 2a 20 75 6e 63 68 61 6e 67 65 64 20  s .** unchanged 
1f0d0 73 69 6e 63 65 20 74 68 65 20 66 69 6c 65 20 73  since the file s
1f0e0 69 7a 65 20 69 73 20 70 61 72 74 20 6f 66 20 74  ize is part of t
1f0f0 68 65 20 69 6e 6f 64 65 2e 20 20 48 6f 77 65 76  he inode.  Howev
1f100 65 72 2c 20 0a 2a 2a 20 54 65 64 20 54 73 27 6f  er, .** Ted Ts'o
1f110 20 74 65 6c 6c 73 20 75 73 20 74 68 61 74 20 66   tells us that f
1f120 64 61 74 61 73 79 6e 63 28 29 20 77 69 6c 6c 20  datasync() will 
1f130 61 6c 73 6f 20 77 72 69 74 65 20 74 68 65 20 69  also write the i
1f140 6e 6f 64 65 20 69 66 20 74 68 65 0a 2a 2a 20 66  node if the.** f
1f150 69 6c 65 20 73 69 7a 65 20 68 61 73 20 63 68 61  ile size has cha
1f160 6e 67 65 64 2e 20 20 54 68 65 20 6f 6e 6c 79 20  nged.  The only 
1f170 72 65 61 6c 20 64 69 66 66 65 72 65 6e 63 65 20  real difference 
1f180 62 65 74 77 65 65 6e 20 66 64 61 74 61 73 79 6e  between fdatasyn
1f190 63 28 29 0a 2a 2a 20 61 6e 64 20 66 73 79 6e 63  c().** and fsync
1f1a0 28 29 2c 20 54 65 64 20 74 65 6c 6c 73 20 75 73  (), Ted tells us
1f1b0 2c 20 69 73 20 74 68 61 74 20 66 64 61 74 61 73  , is that fdatas
1f1c0 79 6e 63 28 29 20 77 69 6c 6c 20 6e 6f 74 20 66  ync() will not f
1f1d0 6c 75 73 68 20 74 68 65 0a 2a 2a 20 69 6e 6f 64  lush the.** inod
1f1e0 65 20 69 66 20 74 68 65 20 6d 74 69 6d 65 20 6f  e if the mtime o
1f1f0 72 20 6f 77 6e 65 72 20 6f 72 20 6f 74 68 65 72  r owner or other
1f200 20 69 6e 6f 64 65 20 61 74 74 72 69 62 75 74 65   inode attribute
1f210 73 20 68 61 76 65 20 63 68 61 6e 67 65 64 2e 0a  s have changed..
1f220 2a 2a 20 57 65 20 6f 6e 6c 79 20 63 61 72 65 20  ** We only care 
1f230 61 62 6f 75 74 20 74 68 65 20 66 69 6c 65 20 73  about the file s
1f240 69 7a 65 2c 20 6e 6f 74 20 74 68 65 20 6f 74 68  ize, not the oth
1f250 65 72 20 66 69 6c 65 20 61 74 74 72 69 62 75 74  er file attribut
1f260 65 73 2c 20 73 6f 0a 2a 2a 20 61 73 20 66 61 72  es, so.** as far
1f270 20 61 73 20 53 51 4c 69 74 65 20 69 73 20 63 6f   as SQLite is co
1f280 6e 63 65 72 6e 65 64 2c 20 61 6e 20 66 64 61 74  ncerned, an fdat
1f290 61 73 79 6e 63 28 29 20 69 73 20 61 6c 77 61 79  async() is alway
1f2a0 73 20 61 64 65 71 75 61 74 65 2e 0a 2a 2a 20 53  s adequate..** S
1f2b0 6f 2c 20 77 65 20 61 6c 77 61 79 73 20 75 73 65  o, we always use
1f2c0 20 66 64 61 74 61 73 79 6e 63 28 29 20 69 66 20   fdatasync() if 
1f2d0 69 74 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c  it is available,
1f2e0 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66 0a 2a   regardless of.*
1f2f0 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  * the value of t
1f300 68 65 20 64 61 74 61 4f 6e 6c 79 20 66 6c 61 67  he dataOnly flag
1f310 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1f320 66 75 6c 6c 5f 66 73 79 6e 63 28 69 6e 74 20 66  full_fsync(int f
1f330 64 2c 20 69 6e 74 20 66 75 6c 6c 53 79 6e 63 2c  d, int fullSync,
1f340 20 69 6e 74 20 64 61 74 61 4f 6e 6c 79 29 7b 0a   int dataOnly){.
1f350 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20    int rc;..  /* 
1f360 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 22 69  The following "i
1f370 66 64 65 66 2f 65 6c 69 66 2f 65 6c 73 65 2f 22  fdef/elif/else/"
1f380 20 62 6c 6f 63 6b 20 68 61 73 20 74 68 65 20 73   block has the s
1f390 61 6d 65 20 73 74 72 75 63 74 75 72 65 20 61 73  ame structure as
1f3a0 0a 20 20 2a 2a 20 74 68 65 20 6f 6e 65 20 62 65  .  ** the one be
1f3b0 6c 6f 77 2e 20 49 74 20 69 73 20 72 65 70 6c 69  low. It is repli
1f3c0 63 61 74 65 64 20 68 65 72 65 20 73 6f 6c 65 6c  cated here solel
1f3d0 79 20 74 6f 20 61 76 6f 69 64 20 63 6c 75 74 74  y to avoid clutt
1f3e0 65 72 69 6e 67 20 0a 20 20 2a 2a 20 75 70 20 74  ering .  ** up t
1f3f0 68 65 20 72 65 61 6c 20 63 6f 64 65 20 77 69 74  he real code wit
1f400 68 20 74 68 65 20 55 4e 55 53 45 44 5f 50 41 52  h the UNUSED_PAR
1f410 41 4d 45 54 45 52 28 29 20 6d 61 63 72 6f 73 2e  AMETER() macros.
1f420 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  .  */.#ifdef SQL
1f430 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20 55 4e  ITE_NO_SYNC.  UN
1f440 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66  USED_PARAMETER(f
1f450 64 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  d);.  UNUSED_PAR
1f460 41 4d 45 54 45 52 28 66 75 6c 6c 53 79 6e 63 29  AMETER(fullSync)
1f470 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
1f480 45 54 45 52 28 64 61 74 61 4f 6e 6c 79 29 3b 0a  ETER(dataOnly);.
1f490 23 65 6c 69 66 20 48 41 56 45 5f 46 55 4c 4c 46  #elif HAVE_FULLF
1f4a0 53 59 4e 43 0a 20 20 55 4e 55 53 45 44 5f 50 41  SYNC.  UNUSED_PA
1f4b0 52 41 4d 45 54 45 52 28 64 61 74 61 4f 6e 6c 79  RAMETER(dataOnly
1f4c0 29 3b 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45  );.#else.  UNUSE
1f4d0 44 5f 50 41 52 41 4d 45 54 45 52 28 66 75 6c 6c  D_PARAMETER(full
1f4e0 53 79 6e 63 29 3b 0a 20 20 55 4e 55 53 45 44 5f  Sync);.  UNUSED_
1f4f0 50 41 52 41 4d 45 54 45 52 28 64 61 74 61 4f 6e  PARAMETER(dataOn
1f500 6c 79 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  ly);.#endif..  /
1f510 2a 20 52 65 63 6f 72 64 20 74 68 65 20 6e 75 6d  * Record the num
1f520 62 65 72 20 6f 66 20 74 69 6d 65 73 20 74 68 61  ber of times tha
1f530 74 20 77 65 20 64 6f 20 61 20 6e 6f 72 6d 61 6c  t we do a normal
1f540 20 66 73 79 6e 63 28 29 20 61 6e 64 20 0a 20 20   fsync() and .  
1f550 2a 2a 20 46 55 4c 4c 53 59 4e 43 2e 20 20 54 68  ** FULLSYNC.  Th
1f560 69 73 20 69 73 20 75 73 65 64 20 64 75 72 69 6e  is is used durin
1f570 67 20 74 65 73 74 69 6e 67 20 74 6f 20 76 65 72  g testing to ver
1f580 69 66 79 20 74 68 61 74 20 74 68 69 73 20 70 72  ify that this pr
1f590 6f 63 65 64 75 72 65 0a 20 20 2a 2a 20 67 65 74  ocedure.  ** get
1f5a0 73 20 63 61 6c 6c 65 64 20 77 69 74 68 20 74 68  s called with th
1f5b0 65 20 63 6f 72 72 65 63 74 20 61 72 67 75 6d 65  e correct argume
1f5c0 6e 74 73 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66  nts..  */.#ifdef
1f5d0 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69   SQLITE_TEST.  i
1f5e0 66 28 20 66 75 6c 6c 53 79 6e 63 20 29 20 73 71  f( fullSync ) sq
1f5f0 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f 63  lite3_fullsync_c
1f600 6f 75 6e 74 2b 2b 3b 0a 20 20 73 71 6c 69 74 65  ount++;.  sqlite
1f610 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a  3_sync_count++;.
1f620 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66 20  #endif..  /* If 
1f630 77 65 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68  we compiled with
1f640 20 74 68 65 20 53 51 4c 49 54 45 5f 4e 4f 5f 53   the SQLITE_NO_S
1f650 59 4e 43 20 66 6c 61 67 2c 20 74 68 65 6e 20 73  YNC flag, then s
1f660 79 6e 63 69 6e 67 20 69 73 20 61 0a 20 20 2a 2a  yncing is a.  **
1f670 20 6e 6f 2d 6f 70 2e 20 20 42 75 74 20 67 6f 20   no-op.  But go 
1f680 61 68 65 61 64 20 61 6e 64 20 63 61 6c 6c 20 66  ahead and call f
1f690 73 74 61 74 28 29 20 74 6f 20 76 61 6c 69 64 61  stat() to valida
1f6a0 74 65 20 74 68 65 20 66 69 6c 65 0a 20 20 2a 2a  te the file.  **
1f6b0 20 64 65 73 63 72 69 70 74 6f 72 20 61 73 20 77   descriptor as w
1f6c0 65 20 6e 65 65 64 20 61 20 6d 65 74 68 6f 64 20  e need a method 
1f6d0 74 6f 20 70 72 6f 76 6f 6b 65 20 61 20 66 61 69  to provoke a fai
1f6e0 6c 75 72 65 20 64 75 72 69 6e 67 0a 20 20 2a 2a  lure during.  **
1f6f0 20 63 6f 76 65 72 61 74 65 20 74 65 73 74 69 6e   coverate testin
1f700 67 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53  g..  */.#ifdef S
1f710 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20  QLITE_NO_SYNC.  
1f720 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73 74 61  {.    struct sta
1f730 74 20 62 75 66 3b 0a 20 20 20 20 72 63 20 3d 20  t buf;.    rc = 
1f740 6f 73 46 73 74 61 74 28 66 64 2c 20 26 62 75 66  osFstat(fd, &buf
1f750 29 3b 0a 20 20 7d 0a 23 65 6c 69 66 20 48 41 56  );.  }.#elif HAV
1f760 45 5f 46 55 4c 4c 46 53 59 4e 43 0a 20 20 69 66  E_FULLFSYNC.  if
1f770 28 20 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 23 69  ( fullSync ){.#i
1f780 66 64 65 66 20 53 51 4c 49 54 45 5f 55 53 45 5f  fdef SQLITE_USE_
1f790 52 45 51 55 45 53 54 5f 46 55 4c 4c 46 53 59 4e  REQUEST_FULLFSYN
1f7a0 43 0a 20 20 20 20 72 63 20 3d 20 6f 73 46 73 79  C.    rc = osFsy
1f7b0 6e 63 28 66 64 29 3b 0a 20 20 20 20 69 66 20 28  nc(fd);.    if (
1f7c0 21 72 63 29 20 7b 0a 20 20 20 20 20 20 4f 53 53  !rc) {.      OSS
1f7d0 70 69 6e 4c 6f 63 6b 4c 6f 63 6b 28 26 6e 6f 74  pinLockLock(&not
1f7e0 69 66 79 5f 6c 6f 63 6b 29 3b 0a 20 20 20 20 20  ify_lock);.     
1f7f0 20 72 63 20 3d 20 6e 6f 74 69 66 79 5f 70 6f 73   rc = notify_pos
1f800 74 28 52 45 51 55 45 53 54 5f 46 55 4c 4c 53 59  t(REQUEST_FULLSY
1f810 4e 43 5f 4e 4f 54 49 46 49 43 41 54 49 4f 4e 29  NC_NOTIFICATION)
1f820 3b 0a 20 20 20 20 20 20 4f 53 53 70 69 6e 4c 6f  ;.      OSSpinLo
1f830 63 6b 55 6e 6c 6f 63 6b 28 26 6e 6f 74 69 66 79  ckUnlock(&notify
1f840 5f 6c 6f 63 6b 29 3b 0a 20 20 20 20 7d 0a 23 65  _lock);.    }.#e
1f850 6c 73 65 0a 20 20 20 20 72 63 20 3d 20 6f 73 46  lse.    rc = osF
1f860 63 6e 74 6c 28 66 64 2c 20 46 5f 46 55 4c 4c 46  cntl(fd, F_FULLF
1f870 53 59 4e 43 2c 20 30 29 3b 0a 23 65 6e 64 69 66  SYNC, 0);.#endif
1f880 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
1f890 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 2f 2a 20 49   = 1;.  }.  /* I
1f8a0 66 20 74 68 65 20 46 55 4c 4c 46 53 59 4e 43 20  f the FULLFSYNC 
1f8b0 66 61 69 6c 65 64 2c 20 66 61 6c 6c 20 62 61 63  failed, fall bac
1f8c0 6b 20 74 6f 20 61 74 74 65 6d 70 74 69 6e 67 20  k to attempting 
1f8d0 61 6e 20 66 73 79 6e 63 28 29 2e 0a 20 20 2a 2a  an fsync()..  **
1f8e0 20 49 74 20 73 68 6f 75 6c 64 6e 27 74 20 62 65   It shouldn't be
1f8f0 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 66 75   possible for fu
1f900 6c 6c 66 73 79 6e 63 20 74 6f 20 66 61 69 6c 20  llfsync to fail 
1f910 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 0a 20 20  on the local .  
1f920 2a 2a 20 66 69 6c 65 20 73 79 73 74 65 6d 20 28  ** file system (
1f930 6f 6e 20 4f 53 58 29 2c 20 73 6f 20 66 61 69 6c  on OSX), so fail
1f940 75 72 65 20 69 6e 64 69 63 61 74 65 73 20 74 68  ure indicates th
1f950 61 74 20 46 55 4c 4c 46 53 59 4e 43 0a 20 20 2a  at FULLFSYNC.  *
1f960 2a 20 69 73 6e 27 74 20 73 75 70 70 6f 72 74 65  * isn't supporte
1f970 64 20 66 6f 72 20 74 68 69 73 20 66 69 6c 65 20  d for this file 
1f980 73 79 73 74 65 6d 2e 20 53 6f 2c 20 61 74 74 65  system. So, atte
1f990 6d 70 74 20 61 6e 20 66 73 79 6e 63 20 0a 20 20  mpt an fsync .  
1f9a0 2a 2a 20 61 6e 64 20 28 66 6f 72 20 6e 6f 77 29  ** and (for now)
1f9b0 20 69 67 6e 6f 72 65 20 74 68 65 20 6f 76 65 72   ignore the over
1f9c0 68 65 61 64 20 6f 66 20 61 20 73 75 70 65 72 66  head of a superf
1f9d0 6c 75 6f 75 73 20 66 63 6e 74 6c 20 63 61 6c 6c  luous fcntl call
1f9e0 2e 20 20 0a 20 20 2a 2a 20 49 74 27 64 20 62 65  .  .  ** It'd be
1f9f0 20 62 65 74 74 65 72 20 74 6f 20 64 65 74 65 63   better to detec
1fa00 74 20 66 75 6c 6c 66 73 79 6e 63 20 73 75 70 70  t fullfsync supp
1fa10 6f 72 74 20 6f 6e 63 65 20 61 6e 64 20 61 76 6f  ort once and avo
1fa20 69 64 20 0a 20 20 2a 2a 20 74 68 65 20 66 63 6e  id .  ** the fcn
1fa30 74 6c 20 63 61 6c 6c 20 65 76 65 72 79 20 74 69  tl call every ti
1fa40 6d 65 20 73 79 6e 63 20 69 73 20 63 61 6c 6c 65  me sync is calle
1fa50 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63  d..  */.  if( rc
1fa60 20 29 20 72 63 20 3d 20 66 73 79 6e 63 28 66 64   ) rc = fsync(fd
1fa70 29 3b 0a 0a 23 65 6c 69 66 20 64 65 66 69 6e 65  );..#elif define
1fa80 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 2f  d(__APPLE__).  /
1fa90 2a 20 66 64 61 74 61 73 79 6e 63 28 29 20 6f 6e  * fdatasync() on
1faa0 20 48 46 53 2b 20 64 6f 65 73 6e 27 74 20 79 65   HFS+ doesn't ye
1fab0 74 20 66 6c 75 73 68 20 74 68 65 20 66 69 6c 65  t flush the file
1fac0 20 73 69 7a 65 20 69 66 20 69 74 20 63 68 61 6e   size if it chan
1fad0 67 65 64 20 63 6f 72 72 65 63 74 6c 79 0a 20 20  ged correctly.  
1fae0 2a 2a 20 73 6f 20 63 75 72 72 65 6e 74 6c 79 20  ** so currently 
1faf0 77 65 20 64 65 66 61 75 6c 74 20 74 6f 20 74 68  we default to th
1fb00 65 20 6d 61 63 72 6f 20 74 68 61 74 20 72 65 64  e macro that red
1fb10 65 66 69 6e 65 73 20 66 64 61 74 61 73 79 6e 63  efines fdatasync
1fb20 20 74 6f 20 66 73 79 6e 63 0a 20 20 2a 2f 0a 20   to fsync.  */. 
1fb30 20 72 63 20 3d 20 66 73 79 6e 63 28 66 64 29 3b   rc = fsync(fd);
1fb40 0a 23 65 6c 73 65 20 0a 20 20 72 63 20 3d 20 66  .#else .  rc = f
1fb50 64 61 74 61 73 79 6e 63 28 66 64 29 3b 0a 23 69  datasync(fd);.#i
1fb60 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 69  f OS_VXWORKS.  i
1fb70 66 28 20 72 63 3d 3d 2d 31 20 26 26 20 65 72 72  f( rc==-1 && err
1fb80 6e 6f 3d 3d 45 4e 4f 54 53 55 50 20 29 7b 0a 20  no==ENOTSUP ){. 
1fb90 20 20 20 72 63 20 3d 20 66 73 79 6e 63 28 66 64     rc = fsync(fd
1fba0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  );.  }.#endif /*
1fbb0 20 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 23   OS_VXWORKS */.#
1fbc0 65 6e 64 69 66 20 2f 2a 20 69 66 64 65 66 20 53  endif /* ifdef S
1fbd0 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20 65 6c  QLITE_NO_SYNC el
1fbe0 69 66 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e  if HAVE_FULLFSYN
1fbf0 43 20 2a 2f 0a 0a 20 20 69 66 28 20 4f 53 5f 56  C */..  if( OS_V
1fc00 58 57 4f 52 4b 53 20 26 26 20 72 63 21 3d 20 2d  XWORKS && rc!= -
1fc10 31 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 30 3b  1 ){.    rc = 0;
1fc20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
1fc30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20  ;.}../*.** Open 
1fc40 61 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  a file descripto
1fc50 72 20 74 6f 20 74 68 65 20 64 69 72 65 63 74 6f  r to the directo
1fc60 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20 66 69  ry containing fi
1fc70 6c 65 20 7a 46 69 6c 65 6e 61 6d 65 2e 0a 2a 2a  le zFilename..**
1fc80 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
1fc90 2a 70 46 64 20 69 73 20 73 65 74 20 74 6f 20 74  *pFd is set to t
1fca0 68 65 20 6f 70 65 6e 65 64 20 66 69 6c 65 20 64  he opened file d
1fcb0 65 73 63 72 69 70 74 6f 72 20 61 6e 64 0a 2a 2a  escriptor and.**
1fcc0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
1fcd0 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 65 72  turned. If an er
1fce0 72 6f 72 20 6f 63 63 75 72 73 2c 20 65 69 74 68  ror occurs, eith
1fcf0 65 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a  er SQLITE_NOMEM.
1fd00 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f 43 41 4e  ** or SQLITE_CAN
1fd10 54 4f 50 45 4e 20 69 73 20 72 65 74 75 72 6e 65  TOPEN is returne
1fd20 64 20 61 6e 64 20 2a 70 46 64 20 69 73 20 73 65  d and *pFd is se
1fd30 74 20 74 6f 20 61 6e 20 75 6e 64 65 66 69 6e 65  t to an undefine
1fd40 64 0a 2a 2a 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a  d.** value..**.*
1fd50 2a 20 54 68 65 20 64 69 72 65 63 74 6f 72 79 20  * The directory 
1fd60 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
1fd70 69 73 20 75 73 65 64 20 66 6f 72 20 6f 6e 6c 79  is used for only
1fd80 20 6f 6e 65 20 74 68 69 6e 67 20 2d 20 74 6f 0a   one thing - to.
1fd90 2a 2a 20 66 73 79 6e 63 28 29 20 61 20 64 69 72  ** fsync() a dir
1fda0 65 63 74 6f 72 79 20 74 6f 20 6d 61 6b 65 20 73  ectory to make s
1fdb0 75 72 65 20 66 69 6c 65 20 63 72 65 61 74 69 6f  ure file creatio
1fdc0 6e 20 61 6e 64 20 64 65 6c 65 74 69 6f 6e 20 65  n and deletion e
1fdd0 76 65 6e 74 73 0a 2a 2a 20 61 72 65 20 66 6c 75  vents.** are flu
1fde0 73 68 65 64 20 74 6f 20 64 69 73 6b 2e 20 20 53  shed to disk.  S
1fdf0 75 63 68 20 66 73 79 6e 63 73 20 61 72 65 20 6e  uch fsyncs are n
1fe00 6f 74 20 6e 65 65 64 65 64 20 6f 6e 20 6e 65 77  ot needed on new
1fe10 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 69 6e 67  er.** journaling
1fe20 20 66 69 6c 65 73 79 73 74 65 6d 73 2c 20 62 75   filesystems, bu
1fe30 74 20 61 72 65 20 72 65 71 75 69 72 65 64 20 6f  t are required o
1fe40 6e 20 6f 6c 64 65 72 20 66 69 6c 65 73 79 73 74  n older filesyst
1fe50 65 6d 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ems..**.** This 
1fe60 72 6f 75 74 69 6e 65 20 63 61 6e 20 62 65 20 6f  routine can be o
1fe70 76 65 72 72 69 64 64 65 6e 20 75 73 69 6e 67 20  verridden using 
1fe80 74 68 65 20 78 53 65 74 53 79 73 43 61 6c 6c 20  the xSetSysCall 
1fe90 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2a 20 54 68  interface..** Th
1fea0 65 20 61 62 69 6c 69 74 79 20 74 6f 20 6f 76 65  e ability to ove
1feb0 72 72 69 64 65 20 74 68 69 73 20 72 6f 75 74 69  rride this routi
1fec0 6e 65 20 77 61 73 20 61 64 64 65 64 20 69 6e 20  ne was added in 
1fed0 73 75 70 70 6f 72 74 20 6f 66 20 74 68 65 0a 2a  support of the.*
1fee0 2a 20 63 68 72 6f 6d 69 75 6d 20 73 61 6e 64 62  * chromium sandb
1fef0 6f 78 2e 20 20 4f 70 65 6e 69 6e 67 20 61 20 64  ox.  Opening a d
1ff00 69 72 65 63 74 6f 72 79 20 69 73 20 61 20 73 65  irectory is a se
1ff10 63 75 72 69 74 79 20 72 69 73 6b 20 28 77 65 20  curity risk (we 
1ff20 61 72 65 0a 2a 2a 20 74 6f 6c 64 29 20 73 6f 20  are.** told) so 
1ff30 6d 61 6b 69 6e 67 20 69 74 20 6f 76 65 72 72 69  making it overri
1ff40 64 65 61 62 6c 65 20 61 6c 6c 6f 77 73 20 74 68  deable allows th
1ff50 65 20 63 68 72 6f 6d 69 75 6d 20 73 61 6e 64 62  e chromium sandb
1ff60 6f 78 20 74 6f 0a 2a 2a 20 72 65 70 6c 61 63 65  ox to.** replace
1ff70 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   this routine wi
1ff80 74 68 20 61 20 68 61 72 6d 6c 65 73 73 20 6e 6f  th a harmless no
1ff90 2d 6f 70 2e 20 20 54 6f 20 6d 61 6b 65 20 74 68  -op.  To make th
1ffa0 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 20  is routine.** a 
1ffb0 6e 6f 2d 6f 70 2c 20 72 65 70 6c 61 63 65 20 69  no-op, replace i
1ffc0 74 20 77 69 74 68 20 61 20 73 74 75 62 20 74 68  t with a stub th
1ffd0 61 74 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  at returns SQLIT
1ffe0 45 5f 4f 4b 20 62 75 74 20 6c 65 61 76 65 73 0a  E_OK but leaves.
1fff0 2a 2a 20 2a 70 46 64 20 73 65 74 20 74 6f 20 61  ** *pFd set to a
20000 20 6e 65 67 61 74 69 76 65 20 6e 75 6d 62 65 72   negative number
20010 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54  ..**.** If SQLIT
20020 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
20030 2c 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20  , the caller is 
20040 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20  responsible for 
20050 63 6c 6f 73 69 6e 67 0a 2a 2a 20 74 68 65 20 66  closing.** the f
20060 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a  ile descriptor *
20070 70 46 64 20 75 73 69 6e 67 20 63 6c 6f 73 65 28  pFd using close(
20080 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
20090 20 6f 70 65 6e 44 69 72 65 63 74 6f 72 79 28 63   openDirectory(c
200a0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
200b0 6e 61 6d 65 2c 20 69 6e 74 20 2a 70 46 64 29 7b  name, int *pFd){
200c0 0a 20 20 69 6e 74 20 69 69 3b 0a 20 20 69 6e 74  .  int ii;.  int
200d0 20 66 64 20 3d 20 2d 31 3b 0a 20 20 63 68 61 72   fd = -1;.  char
200e0 20 7a 44 69 72 6e 61 6d 65 5b 4d 41 58 5f 50 41   zDirname[MAX_PA
200f0 54 48 4e 41 4d 45 2b 31 5d 3b 0a 0a 20 20 73 71  THNAME+1];..  sq
20100 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d  lite3_snprintf(M
20110 41 58 5f 50 41 54 48 4e 41 4d 45 2c 20 7a 44 69  AX_PATHNAME, zDi
20120 72 6e 61 6d 65 2c 20 22 25 73 22 2c 20 7a 46 69  rname, "%s", zFi
20130 6c 65 6e 61 6d 65 29 3b 0a 20 20 66 6f 72 28 69  lename);.  for(i
20140 69 3d 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 44  i=(int)strlen(zD
20150 69 72 6e 61 6d 65 29 3b 20 69 69 3e 30 20 26 26  irname); ii>0 &&
20160 20 7a 44 69 72 6e 61 6d 65 5b 69 69 5d 21 3d 27   zDirname[ii]!='
20170 2f 27 3b 20 69 69 2d 2d 29 3b 0a 20 20 69 66 28  /'; ii--);.  if(
20180 20 69 69 3e 30 20 29 7b 0a 20 20 20 20 7a 44 69   ii>0 ){.    zDi
20190 72 6e 61 6d 65 5b 69 69 5d 20 3d 20 27 5c 30 27  rname[ii] = '\0'
201a0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
201b0 66 28 20 7a 44 69 72 6e 61 6d 65 5b 30 5d 21 3d  f( zDirname[0]!=
201c0 27 2f 27 20 29 20 7a 44 69 72 6e 61 6d 65 5b 30  '/' ) zDirname[0
201d0 5d 20 3d 20 27 2e 27 3b 0a 20 20 20 20 7a 44 69  ] = '.';.    zDi
201e0 72 6e 61 6d 65 5b 31 5d 20 3d 20 30 3b 0a 20 20  rname[1] = 0;.  
201f0 7d 0a 20 20 66 64 20 3d 20 72 6f 62 75 73 74 5f  }.  fd = robust_
20200 6f 70 65 6e 28 7a 44 69 72 6e 61 6d 65 2c 20 4f  open(zDirname, O
20210 5f 52 44 4f 4e 4c 59 7c 4f 5f 42 49 4e 41 52 59  _RDONLY|O_BINARY
20220 2c 20 30 29 3b 0a 20 20 69 66 28 20 66 64 3e 3d  , 0);.  if( fd>=
20230 30 20 29 7b 0a 20 20 20 20 4f 53 54 52 41 43 45  0 ){.    OSTRACE
20240 28 28 22 4f 50 45 4e 44 49 52 20 25 2d 33 64 20  (("OPENDIR %-3d 
20250 25 73 5c 6e 22 2c 20 66 64 2c 20 7a 44 69 72 6e  %s\n", fd, zDirn
20260 61 6d 65 29 29 3b 0a 20 20 7d 0a 20 20 2a 70 46  ame));.  }.  *pF
20270 64 20 3d 20 66 64 3b 0a 20 20 69 66 28 20 66 64  d = fd;.  if( fd
20280 3e 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  >=0 ) return SQL
20290 49 54 45 5f 4f 4b 3b 0a 20 20 72 65 74 75 72 6e  ITE_OK;.  return
202a0 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51   unixLogError(SQ
202b0 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b  LITE_CANTOPEN_BK
202c0 50 54 2c 20 22 6f 70 65 6e 44 69 72 65 63 74 6f  PT, "openDirecto
202d0 72 79 22 2c 20 7a 44 69 72 6e 61 6d 65 29 3b 0a  ry", zDirname);.
202e0 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75  }../*.** Make su
202f0 72 65 20 61 6c 6c 20 77 72 69 74 65 73 20 74 6f  re all writes to
20300 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 66 69   a particular fi
20310 6c 65 20 61 72 65 20 63 6f 6d 6d 69 74 74 65 64  le are committed
20320 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20   to disk..**.** 
20330 49 66 20 64 61 74 61 4f 6e 6c 79 3d 3d 30 20 74  If dataOnly==0 t
20340 68 65 6e 20 62 6f 74 68 20 74 68 65 20 66 69 6c  hen both the fil
20350 65 20 69 74 73 65 6c 66 20 61 6e 64 20 69 74 73  e itself and its
20360 20 6d 65 74 61 64 61 74 61 20 28 66 69 6c 65 0a   metadata (file.
20370 2a 2a 20 73 69 7a 65 2c 20 61 63 63 65 73 73 20  ** size, access 
20380 74 69 6d 65 2c 20 65 74 63 29 20 61 72 65 20 73  time, etc) are s
20390 79 6e 63 65 64 2e 20 20 49 66 20 64 61 74 61 4f  ynced.  If dataO
203a0 6e 6c 79 21 3d 30 20 74 68 65 6e 20 6f 6e 6c 79  nly!=0 then only
203b0 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20 64 61 74   the.** file dat
203c0 61 20 69 73 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a  a is synced..**.
203d0 2a 2a 20 55 6e 64 65 72 20 55 6e 69 78 2c 20 61  ** Under Unix, a
203e0 6c 73 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68  lso make sure th
203f0 61 74 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  at the directory
20400 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 66   entry for the f
20410 69 6c 65 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20  ile.** has been 
20420 63 72 65 61 74 65 64 20 62 79 20 66 73 79 6e 63  created by fsync
20430 2d 69 6e 67 20 74 68 65 20 64 69 72 65 63 74 6f  -ing the directo
20440 72 79 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ry that contains
20450 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 20 49 66   the file..** If
20460 20 77 65 20 64 6f 20 6e 6f 74 20 64 6f 20 74 68   we do not do th
20470 69 73 20 61 6e 64 20 77 65 20 65 6e 63 6f 75 6e  is and we encoun
20480 74 65 72 20 61 20 70 6f 77 65 72 20 66 61 69 6c  ter a power fail
20490 75 72 65 2c 20 74 68 65 20 64 69 72 65 63 74 6f  ure, the directo
204a0 72 79 0a 2a 2a 20 65 6e 74 72 79 20 66 6f 72 20  ry.** entry for 
204b0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68  the journal migh
204c0 74 20 6e 6f 74 20 65 78 69 73 74 20 61 66 74 65  t not exist afte
204d0 72 20 77 65 20 72 65 62 6f 6f 74 2e 20 20 54 68  r we reboot.  Th
204e0 65 20 6e 65 78 74 0a 2a 2a 20 53 51 4c 69 74 65  e next.** SQLite
204f0 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 66   to access the f
20500 69 6c 65 20 77 69 6c 6c 20 6e 6f 74 20 6b 6e 6f  ile will not kno
20510 77 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e  w that the journ
20520 61 6c 20 65 78 69 73 74 73 20 28 62 65 63 61 75  al exists (becau
20530 73 65 0a 2a 2a 20 74 68 65 20 64 69 72 65 63 74  se.** the direct
20540 6f 72 79 20 65 6e 74 72 79 20 66 6f 72 20 74 68  ory entry for th
20550 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 6e 65  e journal was ne
20560 76 65 72 20 63 72 65 61 74 65 64 29 20 61 6e 64  ver created) and
20570 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
20580 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 72 6f 6c  .** will not rol
20590 6c 20 62 61 63 6b 20 2d 20 70 6f 73 73 69 62 6c  l back - possibl
205a0 79 20 6c 65 61 64 69 6e 67 20 74 6f 20 64 61 74  y leading to dat
205b0 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
205c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
205d0 75 6e 69 78 53 79 6e 63 28 73 71 6c 69 74 65 33  unixSync(sqlite3
205e0 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 66  _file *id, int f
205f0 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b  lags){.  int rc;
20600 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
20610 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
20620 69 64 3b 0a 0a 20 20 69 6e 74 20 69 73 44 61 74  id;..  int isDat
20630 61 4f 6e 6c 79 20 3d 20 28 66 6c 61 67 73 26 53  aOnly = (flags&S
20640 51 4c 49 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f  QLITE_SYNC_DATAO
20650 4e 4c 59 29 3b 0a 20 20 69 6e 74 20 69 73 46 75  NLY);.  int isFu
20660 6c 6c 73 79 6e 63 20 3d 20 28 66 6c 61 67 73 26  llsync = (flags&
20670 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59  0x0F)==SQLITE_SY
20680 4e 43 5f 46 55 4c 4c 3b 0a 0a 20 20 2f 2a 20 43  NC_FULL;..  /* C
20690 68 65 63 6b 20 74 68 61 74 20 6f 6e 65 20 6f 66  heck that one of
206a0 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52   SQLITE_SYNC_NOR
206b0 4d 41 4c 20 6f 72 20 46 55 4c 4c 20 77 61 73 20  MAL or FULL was 
206c0 70 61 73 73 65 64 20 2a 2f 0a 20 20 61 73 73 65  passed */.  asse
206d0 72 74 28 28 66 6c 61 67 73 26 30 78 30 46 29 3d  rt((flags&0x0F)=
206e0 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52  =SQLITE_SYNC_NOR
206f0 4d 41 4c 0a 20 20 20 20 20 20 7c 7c 20 28 66 6c  MAL.      || (fl
20700 61 67 73 26 30 78 30 46 29 3d 3d 53 51 4c 49 54  ags&0x0F)==SQLIT
20710 45 5f 53 59 4e 43 5f 46 55 4c 4c 0a 20 20 29 3b  E_SYNC_FULL.  );
20720 0a 0a 20 20 2f 2a 20 55 6e 69 78 20 63 61 6e 6e  ..  /* Unix cann
20730 6f 74 2c 20 62 75 74 20 73 6f 6d 65 20 73 79 73  ot, but some sys
20740 74 65 6d 73 20 6d 61 79 20 72 65 74 75 72 6e 20  tems may return 
20750 53 51 4c 49 54 45 5f 46 55 4c 4c 20 66 72 6f 6d  SQLITE_FULL from
20760 20 68 65 72 65 2e 20 54 68 69 73 0a 20 20 2a 2a   here. This.  **
20770 20 6c 69 6e 65 20 69 73 20 74 6f 20 74 65 73 74   line is to test
20780 20 74 68 61 74 20 64 6f 69 6e 67 20 73 6f 20 64   that doing so d
20790 6f 65 73 20 6e 6f 74 20 63 61 75 73 65 20 61 6e  oes not cause an
207a0 79 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 2a 2f  y problems..  */
207b0 0a 20 20 53 69 6d 75 6c 61 74 65 44 69 73 6b 66  .  SimulateDiskf
207c0 75 6c 6c 45 72 72 6f 72 28 20 72 65 74 75 72 6e  ullError( return
207d0 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 3b 0a   SQLITE_FULL );.
207e0 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
207f0 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22   );.  OSTRACE(("
20800 53 59 4e 43 20 20 20 20 25 2d 33 64 5c 6e 22 2c  SYNC    %-3d\n",
20810 20 70 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 72   pFile->h));.  r
20820 63 20 3d 20 66 75 6c 6c 5f 66 73 79 6e 63 28 70  c = full_fsync(p
20830 46 69 6c 65 2d 3e 68 2c 20 69 73 46 75 6c 6c 73  File->h, isFulls
20840 79 6e 63 2c 20 69 73 44 61 74 61 4f 6e 6c 79 29  ync, isDataOnly)
20850 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ;.  SimulateIOEr
20860 72 6f 72 28 20 72 63 3d 31 20 29 3b 0a 20 20 69  ror( rc=1 );.  i
20870 66 28 20 72 63 20 29 7b 0a 20 20 20 20 73 74 6f  f( rc ){.    sto
20880 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c  reLastErrno(pFil
20890 65 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 72  e, errno);.    r
208a0 65 74 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72  eturn unixLogErr
208b0 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  or(SQLITE_IOERR_
208c0 46 53 59 4e 43 2c 20 22 66 75 6c 6c 5f 66 73 79  FSYNC, "full_fsy
208d0 6e 63 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74  nc", pFile->zPat
208e0 68 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c  h);.  }..  /* Al
208f0 73 6f 20 66 73 79 6e 63 20 74 68 65 20 64 69 72  so fsync the dir
20900 65 63 74 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e  ectory containin
20910 67 20 74 68 65 20 66 69 6c 65 20 69 66 20 74 68  g the file if th
20920 65 20 44 49 52 53 59 4e 43 20 66 6c 61 67 0a 20  e DIRSYNC flag. 
20930 20 2a 2a 20 69 73 20 73 65 74 2e 20 20 54 68 69   ** is set.  Thi
20940 73 20 69 73 20 61 20 6f 6e 65 2d 74 69 6d 65 20  s is a one-time 
20950 6f 63 63 75 72 72 65 6e 63 65 2e 20 20 4d 61 6e  occurrence.  Man
20960 79 20 73 79 73 74 65 6d 73 20 28 65 78 61 6d 70  y systems (examp
20970 6c 65 73 3a 20 41 49 58 29 0a 20 20 2a 2a 20 61  les: AIX).  ** a
20980 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 66 73 79  re unable to fsy
20990 6e 63 20 61 20 64 69 72 65 63 74 6f 72 79 2c 20  nc a directory, 
209a0 73 6f 20 69 67 6e 6f 72 65 20 65 72 72 6f 72 73  so ignore errors
209b0 20 6f 6e 20 74 68 65 20 66 73 79 6e 63 2e 0a 20   on the fsync.. 
209c0 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   */.  if( pFile-
209d0 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49  >ctrlFlags & UNI
209e0 58 46 49 4c 45 5f 44 49 52 53 59 4e 43 20 29 7b  XFILE_DIRSYNC ){
209f0 0a 20 20 20 20 69 6e 74 20 64 69 72 66 64 3b 0a  .    int dirfd;.
20a00 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 44 49      OSTRACE(("DI
20a10 52 53 59 4e 43 20 25 73 20 28 68 61 76 65 5f 66  RSYNC %s (have_f
20a20 75 6c 6c 66 73 79 6e 63 3d 25 64 20 66 75 6c 6c  ullfsync=%d full
20a30 73 79 6e 63 3d 25 64 29 5c 6e 22 2c 20 70 46 69  sync=%d)\n", pFi
20a40 6c 65 2d 3e 7a 50 61 74 68 2c 0a 20 20 20 20 20  le->zPath,.     
20a50 20 20 20 20 20 20 20 48 41 56 45 5f 46 55 4c 4c         HAVE_FULL
20a60 46 53 59 4e 43 2c 20 69 73 46 75 6c 6c 73 79 6e  FSYNC, isFullsyn
20a70 63 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 6f 73  c));.    rc = os
20a80 4f 70 65 6e 44 69 72 65 63 74 6f 72 79 28 70 46  OpenDirectory(pF
20a90 69 6c 65 2d 3e 7a 50 61 74 68 2c 20 26 64 69 72  ile->zPath, &dir
20aa0 66 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  fd);.    if( rc=
20ab0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
20ac0 20 20 20 20 66 75 6c 6c 5f 66 73 79 6e 63 28 64      full_fsync(d
20ad0 69 72 66 64 2c 20 30 2c 20 30 29 3b 0a 23 69 66  irfd, 0, 0);.#if
20ae0 20 4f 53 43 4c 4f 53 45 5f 43 48 45 43 4b 5f 43   OSCLOSE_CHECK_C
20af0 4c 4f 53 45 5f 49 4f 45 52 52 0a 20 20 20 20 20  LOSE_IOERR.     
20b00 20 69 66 28 20 63 6c 6f 73 65 28 70 46 69 6c 65   if( close(pFile
20b10 2d 3e 64 69 72 66 64 29 20 29 7b 0a 20 20 20 20  ->dirfd) ){.    
20b20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72      storeLastErr
20b30 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29  no(pFile, errno)
20b40 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  ;.        rc = S
20b50 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f  QLITE_IOERR_DIR_
20b60 43 4c 4f 53 45 3b 0a 20 20 20 20 20 20 7d 0a 23  CLOSE;.      }.#
20b70 65 6c 73 65 0a 20 20 20 20 20 20 72 6f 62 75 73  else.      robus
20b80 74 5f 63 6c 6f 73 65 28 70 46 69 6c 65 2c 20 64  t_close(pFile, d
20b90 69 72 66 64 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b  irfd, __LINE__);
20ba0 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73  .#endif.    }els
20bb0 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
20bc0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 41 4e 54   rc==SQLITE_CANT
20bd0 4f 50 45 4e 20 29 3b 0a 20 20 20 20 20 20 72 63  OPEN );.      rc
20be0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
20bf0 20 20 7d 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63    }.    pFile->c
20c00 74 72 6c 46 6c 61 67 73 20 26 3d 20 7e 55 4e 49  trlFlags &= ~UNI
20c10 58 46 49 4c 45 5f 44 49 52 53 59 4e 43 3b 0a 0a  XFILE_DIRSYNC;..
20c20 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
20c30 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61  .}../*.** Trunca
20c40 74 65 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20  te an open file 
20c50 74 6f 20 61 20 73 70 65 63 69 66 69 65 64 20 73  to a specified s
20c60 69 7a 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ize.*/.static in
20c70 74 20 75 6e 69 78 54 72 75 6e 63 61 74 65 28 73  t unixTruncate(s
20c80 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
20c90 20 69 36 34 20 6e 42 79 74 65 29 7b 0a 20 20 75   i64 nByte){.  u
20ca0 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
20cb0 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 69 64 3b   (unixFile *)id;
20cc0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73  .  int rc;.  ass
20cd0 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
20ce0 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28  SimulateIOError(
20cf0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
20d00 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 20 29 3b  OERR_TRUNCATE );
20d10 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 75 73  ..  /* If the us
20d20 65 72 20 68 61 73 20 63 6f 6e 66 69 67 75 72 65  er has configure
20d30 64 20 61 20 63 68 75 6e 6b 2d 73 69 7a 65 20 66  d a chunk-size f
20d40 6f 72 20 74 68 69 73 20 66 69 6c 65 2c 20 74 72  or this file, tr
20d50 75 6e 63 61 74 65 20 74 68 65 0a 20 20 2a 2a 20  uncate the.  ** 
20d60 66 69 6c 65 20 73 6f 20 74 68 61 74 20 69 74 20  file so that it 
20d70 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 6e 20 69  consists of an i
20d80 6e 74 65 67 65 72 20 6e 75 6d 62 65 72 20 6f 66  nteger number of
20d90 20 63 68 75 6e 6b 73 20 28 69 2e 65 2e 20 74 68   chunks (i.e. th
20da0 65 0a 20 20 2a 2a 20 61 63 74 75 61 6c 20 66 69  e.  ** actual fi
20db0 6c 65 20 73 69 7a 65 20 61 66 74 65 72 20 74 68  le size after th
20dc0 65 20 6f 70 65 72 61 74 69 6f 6e 20 6d 61 79 20  e operation may 
20dd0 62 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  be larger than t
20de0 68 65 20 72 65 71 75 65 73 74 65 64 0a 20 20 2a  he requested.  *
20df0 2a 20 73 69 7a 65 29 2e 0a 20 20 2a 2f 0a 20 20  * size)..  */.  
20e00 69 66 28 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75  if( pFile->szChu
20e10 6e 6b 3e 30 20 29 7b 0a 20 20 20 20 6e 42 79 74  nk>0 ){.    nByt
20e20 65 20 3d 20 28 28 6e 42 79 74 65 20 2b 20 70 46  e = ((nByte + pF
20e30 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20 2d 20 31  ile->szChunk - 1
20e40 29 2f 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b  )/pFile->szChunk
20e50 29 20 2a 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75  ) * pFile->szChu
20e60 6e 6b 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20  nk;.  }..  rc = 
20e70 72 6f 62 75 73 74 5f 66 74 72 75 6e 63 61 74 65  robust_ftruncate
20e80 28 70 46 69 6c 65 2d 3e 68 2c 20 6e 42 79 74 65  (pFile->h, nByte
20e90 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
20ea0 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e     storeLastErrn
20eb0 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29 3b  o(pFile, errno);
20ec0 0a 20 20 20 20 72 65 74 75 72 6e 20 75 6e 69 78  .    return unix
20ed0 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
20ee0 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 2c 20  IOERR_TRUNCATE, 
20ef0 22 66 74 72 75 6e 63 61 74 65 22 2c 20 70 46 69  "ftruncate", pFi
20f00 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 65  le->zPath);.  }e
20f10 6c 73 65 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  lse{.#ifdef SQLI
20f20 54 45 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a 20  TE_DEBUG.    /* 
20f30 49 66 20 77 65 20 61 72 65 20 64 6f 69 6e 67 20  If we are doing 
20f40 61 20 6e 6f 72 6d 61 6c 20 77 72 69 74 65 20 74  a normal write t
20f50 6f 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c  o a database fil
20f60 65 20 28 61 73 20 6f 70 70 6f 73 65 64 20 74 6f  e (as opposed to
20f70 0a 20 20 20 20 2a 2a 20 64 6f 69 6e 67 20 61 20  .    ** doing a 
20f80 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  hot-journal roll
20f90 62 61 63 6b 20 6f 72 20 61 20 77 72 69 74 65 20  back or a write 
20fa0 74 6f 20 73 6f 6d 65 20 66 69 6c 65 20 6f 74 68  to some file oth
20fb0 65 72 20 74 68 61 6e 20 61 0a 20 20 20 20 2a 2a  er than a.    **
20fc0 20 6e 6f 72 6d 61 6c 20 64 61 74 61 62 61 73 65   normal database
20fd0 20 66 69 6c 65 29 20 61 6e 64 20 77 65 20 74 72   file) and we tr
20fe0 75 6e 63 61 74 65 20 74 68 65 20 66 69 6c 65 20  uncate the file 
20ff0 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68 2c 0a  to zero length,.
21000 20 20 20 20 2a 2a 20 74 68 61 74 20 65 66 66 65      ** that effe
21010 63 74 69 76 65 6c 79 20 75 70 64 61 74 65 73 20  ctively updates 
21020 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74  the change count
21030 65 72 2e 20 20 54 68 69 73 20 6d 69 67 68 74 20  er.  This might 
21040 68 61 70 70 65 6e 0a 20 20 20 20 2a 2a 20 77 68  happen.    ** wh
21050 65 6e 20 72 65 73 74 6f 72 69 6e 67 20 61 20 64  en restoring a d
21060 61 74 61 62 61 73 65 20 75 73 69 6e 67 20 74 68  atabase using th
21070 65 20 62 61 63 6b 75 70 20 41 50 49 20 66 72 6f  e backup API fro
21080 6d 20 61 20 7a 65 72 6f 2d 6c 65 6e 67 74 68 0a  m a zero-length.
21090 20 20 20 20 2a 2a 20 73 6f 75 72 63 65 2e 0a 20      ** source.. 
210a0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 46     */.    if( pF
210b0 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69  ile->inNormalWri
210c0 74 65 20 26 26 20 6e 42 79 74 65 3d 3d 30 20 29  te && nByte==0 )
210d0 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 74  {.      pFile->t
210e0 72 61 6e 73 43 6e 74 72 43 68 6e 67 20 3d 20 31  ransCntrChng = 1
210f0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ;.    }.#endif..
21100 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d  #if SQLITE_MAX_M
21110 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 20 20 2f  MAP_SIZE>0.    /
21120 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 77 61  * If the file wa
21130 73 20 6a 75 73 74 20 74 72 75 6e 63 61 74 65 64  s just truncated
21140 20 74 6f 20 61 20 73 69 7a 65 20 73 6d 61 6c 6c   to a size small
21150 65 72 20 74 68 61 6e 20 74 68 65 20 63 75 72 72  er than the curr
21160 65 6e 74 6c 79 0a 20 20 20 20 2a 2a 20 6d 61 70  ently.    ** map
21170 70 65 64 20 72 65 67 69 6f 6e 2c 20 72 65 64 75  ped region, redu
21180 63 65 20 74 68 65 20 65 66 66 65 63 74 69 76 65  ce the effective
21190 20 6d 61 70 70 69 6e 67 20 73 69 7a 65 20 61 73   mapping size as
211a0 20 77 65 6c 6c 2e 20 53 51 4c 69 74 65 20 77 69   well. SQLite wi
211b0 6c 6c 0a 20 20 20 20 2a 2a 20 75 73 65 20 72 65  ll.    ** use re
211c0 61 64 28 29 20 61 6e 64 20 77 72 69 74 65 28 29  ad() and write()
211d0 20 74 6f 20 61 63 63 65 73 73 20 64 61 74 61 20   to access data 
211e0 62 65 79 6f 6e 64 20 74 68 69 73 20 70 6f 69 6e  beyond this poin
211f0 74 20 66 72 6f 6d 20 6e 6f 77 20 6f 6e 2e 20 20  t from now on.  
21200 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
21210 6e 42 79 74 65 3c 70 46 69 6c 65 2d 3e 6d 6d 61  nByte<pFile->mma
21220 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 70  pSize ){.      p
21230 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d  File->mmapSize =
21240 20 6e 42 79 74 65 3b 0a 20 20 20 20 7d 0a 23 65   nByte;.    }.#e
21250 6e 64 69 66 0a 0a 20 20 20 20 72 65 74 75 72 6e  ndif..    return
21260 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
21270 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69  }../*.** Determi
21280 6e 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  ne the current s
21290 69 7a 65 20 6f 66 20 61 20 66 69 6c 65 20 69 6e  ize of a file in
212a0 20 62 79 74 65 73 0a 2a 2f 0a 73 74 61 74 69 63   bytes.*/.static
212b0 20 69 6e 74 20 75 6e 69 78 46 69 6c 65 53 69 7a   int unixFileSiz
212c0 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
212d0 69 64 2c 20 69 36 34 20 2a 70 53 69 7a 65 29 7b  id, i64 *pSize){
212e0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 74 72  .  int rc;.  str
212f0 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20  uct stat buf;.  
21300 61 73 73 65 72 74 28 20 69 64 20 29 3b 0a 20 20  assert( id );.  
21310 72 63 20 3d 20 6f 73 46 73 74 61 74 28 28 28 75  rc = osFstat(((u
21320 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 68 2c  nixFile*)id)->h,
21330 20 26 62 75 66 29 3b 0a 20 20 53 69 6d 75 6c 61   &buf);.  Simula
21340 74 65 49 4f 45 72 72 6f 72 28 20 72 63 3d 31 20  teIOError( rc=1 
21350 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 30 20 29  );.  if( rc!=0 )
21360 7b 0a 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45  {.    storeLastE
21370 72 72 6e 6f 28 28 75 6e 69 78 46 69 6c 65 2a 29  rrno((unixFile*)
21380 69 64 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20  id, errno);.    
21390 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
213a0 45 52 52 5f 46 53 54 41 54 3b 0a 20 20 7d 0a 20  ERR_FSTAT;.  }. 
213b0 20 2a 70 53 69 7a 65 20 3d 20 62 75 66 2e 73 74   *pSize = buf.st
213c0 5f 73 69 7a 65 3b 0a 0a 20 20 2f 2a 20 57 68 65  _size;..  /* Whe
213d0 6e 20 6f 70 65 6e 69 6e 67 20 61 20 7a 65 72 6f  n opening a zero
213e0 2d 73 69 7a 65 20 64 61 74 61 62 61 73 65 2c 20  -size database, 
213f0 74 68 65 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66  the findInodeInf
21400 6f 28 29 20 70 72 6f 63 65 64 75 72 65 0a 20 20  o() procedure.  
21410 2a 2a 20 77 72 69 74 65 73 20 61 20 73 69 6e 67  ** writes a sing
21420 6c 65 20 62 79 74 65 20 69 6e 74 6f 20 74 68 61  le byte into tha
21430 74 20 66 69 6c 65 20 69 6e 20 6f 72 64 65 72 20  t file in order 
21440 74 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 61  to work around a
21450 20 62 75 67 0a 20 20 2a 2a 20 69 6e 20 74 68 65   bug.  ** in the
21460 20 4f 53 2d 58 20 6d 73 64 6f 73 20 66 69 6c 65   OS-X msdos file
21470 73 79 73 74 65 6d 2e 20 20 49 6e 20 6f 72 64 65  system.  In orde
21480 72 20 74 6f 20 61 76 6f 69 64 20 70 72 6f 62 6c  r to avoid probl
21490 65 6d 73 20 77 69 74 68 20 75 70 70 65 72 0a 20  ems with upper. 
214a0 20 2a 2a 20 6c 61 79 65 72 73 2c 20 77 65 20 6e   ** layers, we n
214b0 65 65 64 20 74 6f 20 72 65 70 6f 72 74 20 74 68  eed to report th
214c0 69 73 20 66 69 6c 65 20 73 69 7a 65 20 61 73 20  is file size as 
214d0 7a 65 72 6f 20 65 76 65 6e 20 74 68 6f 75 67 68  zero even though
214e0 20 69 74 20 69 73 0a 20 20 2a 2a 20 72 65 61 6c   it is.  ** real
214f0 6c 79 20 31 2e 20 20 20 54 69 63 6b 65 74 20 23  ly 1.   Ticket #
21500 33 32 36 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  3260..  */.  if(
21510 20 2a 70 53 69 7a 65 3d 3d 31 20 29 20 2a 70 53   *pSize==1 ) *pS
21520 69 7a 65 20 3d 20 30 3b 0a 0a 0a 20 20 72 65 74  ize = 0;...  ret
21530 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
21540 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  ..#if SQLITE_ENA
21550 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
21560 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41  E && defined(__A
21570 50 50 4c 45 5f 5f 29 0a 2f 2a 0a 2a 2a 20 48 61  PPLE__)./*.** Ha
21580 6e 64 6c 65 72 20 66 6f 72 20 70 72 6f 78 79 2d  ndler for proxy-
21590 6c 6f 63 6b 69 6e 67 20 66 69 6c 65 2d 63 6f 6e  locking file-con
215a0 74 72 6f 6c 20 76 65 72 62 73 2e 20 20 44 65 66  trol verbs.  Def
215b0 69 6e 65 64 20 62 65 6c 6f 77 20 69 6e 20 74 68  ined below in th
215c0 65 0a 2a 2a 20 70 72 6f 78 79 69 6e 67 20 6c 6f  e.** proxying lo
215d0 63 6b 69 6e 67 20 64 69 76 69 73 69 6f 6e 2e 0a  cking division..
215e0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  */.static int pr
215f0 6f 78 79 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 73  oxyFileControl(s
21600 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 69 6e 74  qlite3_file*,int
21610 2c 76 6f 69 64 2a 29 3b 0a 23 65 6e 64 69 66 0a  ,void*);.#endif.
21620 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ./* .** This fun
21630 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
21640 74 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 53 51  to handle the SQ
21650 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f  LITE_FCNTL_SIZE_
21660 48 49 4e 54 20 0a 2a 2a 20 66 69 6c 65 2d 63 6f  HINT .** file-co
21670 6e 74 72 6f 6c 20 6f 70 65 72 61 74 69 6f 6e 2e  ntrol operation.
21680 20 20 45 6e 6c 61 72 67 65 20 74 68 65 20 64 61    Enlarge the da
21690 74 61 62 61 73 65 20 74 6f 20 6e 42 79 74 65 73  tabase to nBytes
216a0 20 69 6e 20 73 69 7a 65 0a 2a 2a 20 28 72 6f 75   in size.** (rou
216b0 6e 64 65 64 20 75 70 20 74 6f 20 74 68 65 20 6e  nded up to the n
216c0 65 78 74 20 63 68 75 6e 6b 2d 73 69 7a 65 29 2e  ext chunk-size).
216d0 20 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73    If the databas
216e0 65 20 69 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20  e is already.** 
216f0 6e 42 79 74 65 73 20 6f 72 20 6c 61 72 67 65 72  nBytes or larger
21700 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
21710 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
21720 61 74 69 63 20 69 6e 74 20 66 63 6e 74 6c 53 69  atic int fcntlSi
21730 7a 65 48 69 6e 74 28 75 6e 69 78 46 69 6c 65 20  zeHint(unixFile 
21740 2a 70 46 69 6c 65 2c 20 69 36 34 20 6e 42 79 74  *pFile, i64 nByt
21750 65 29 7b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d  e){.  if( pFile-
21760 3e 73 7a 43 68 75 6e 6b 3e 30 20 29 7b 0a 20 20  >szChunk>0 ){.  
21770 20 20 69 36 34 20 6e 53 69 7a 65 3b 20 20 20 20    i64 nSize;    
21780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21790 2f 2a 20 52 65 71 75 69 72 65 64 20 66 69 6c 65  /* Required file
217a0 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 73 74 72   size */.    str
217b0 75 63 74 20 73 74 61 74 20 62 75 66 3b 20 20 20  uct stat buf;   
217c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73             /* Us
217d0 65 64 20 74 6f 20 68 6f 6c 64 20 72 65 74 75 72  ed to hold retur
217e0 6e 20 76 61 6c 75 65 73 20 6f 66 20 66 73 74 61  n values of fsta
217f0 74 28 29 20 2a 2f 0a 20 20 20 0a 20 20 20 20 69  t() */.   .    i
21800 66 28 20 6f 73 46 73 74 61 74 28 70 46 69 6c 65  f( osFstat(pFile
21810 2d 3e 68 2c 20 26 62 75 66 29 20 29 7b 0a 20 20  ->h, &buf) ){.  
21820 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72      storeLastErr
21830 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29  no(pFile, errno)
21840 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
21850 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41  QLITE_IOERR_FSTA
21860 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e 53  T;.    }..    nS
21870 69 7a 65 20 3d 20 28 28 6e 42 79 74 65 2b 70 46  ize = ((nByte+pF
21880 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 2d 31 29 20  ile->szChunk-1) 
21890 2f 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b  / pFile->szChunk
218a0 29 20 2a 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75  ) * pFile->szChu
218b0 6e 6b 3b 0a 20 20 20 20 69 66 28 20 6e 53 69 7a  nk;.    if( nSiz
218c0 65 3e 28 69 36 34 29 62 75 66 2e 73 74 5f 73 69  e>(i64)buf.st_si
218d0 7a 65 20 29 7b 0a 0a 23 69 66 20 64 65 66 69 6e  ze ){..#if defin
218e0 65 64 28 48 41 56 45 5f 50 4f 53 49 58 5f 46 41  ed(HAVE_POSIX_FA
218f0 4c 4c 4f 43 41 54 45 29 20 26 26 20 48 41 56 45  LLOCATE) && HAVE
21900 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f 43 41 54 45  _POSIX_FALLOCATE
21910 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f  .      /* The co
21920 64 65 20 62 65 6c 6f 77 20 69 73 20 68 61 6e 64  de below is hand
21930 6c 69 6e 67 20 74 68 65 20 72 65 74 75 72 6e 20  ling the return 
21940 76 61 6c 75 65 20 6f 66 20 6f 73 46 61 6c 6c 6f  value of osFallo
21950 63 61 74 65 28 29 20 0a 20 20 20 20 20 20 2a 2a  cate() .      **
21960 20 63 6f 72 72 65 63 74 6c 79 2e 20 70 6f 73 69   correctly. posi
21970 78 5f 66 61 6c 6c 6f 63 61 74 65 28 29 20 69 73  x_fallocate() is
21980 20 64 65 66 69 6e 65 64 20 74 6f 20 22 72 65 74   defined to "ret
21990 75 72 6e 73 20 7a 65 72 6f 20 6f 6e 20 73 75 63  urns zero on suc
219a0 63 65 73 73 2c 20 0a 20 20 20 20 20 20 2a 2a 20  cess, .      ** 
219b0 6f 72 20 61 6e 20 65 72 72 6f 72 20 6e 75 6d 62  or an error numb
219c0 65 72 20 6f 6e 20 20 66 61 69 6c 75 72 65 22 2e  er on  failure".
219d0 20 53 65 65 20 74 68 65 20 6d 61 6e 70 61 67 65   See the manpage
219e0 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 20 2a 2f   for details. */
219f0 0a 20 20 20 20 20 20 69 6e 74 20 65 72 72 3b 0a  .      int err;.
21a00 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20        do{.      
21a10 20 20 65 72 72 20 3d 20 6f 73 46 61 6c 6c 6f 63    err = osFalloc
21a20 61 74 65 28 70 46 69 6c 65 2d 3e 68 2c 20 62 75  ate(pFile->h, bu
21a30 66 2e 73 74 5f 73 69 7a 65 2c 20 6e 53 69 7a 65  f.st_size, nSize
21a40 2d 62 75 66 2e 73 74 5f 73 69 7a 65 29 3b 0a 20  -buf.st_size);. 
21a50 20 20 20 20 20 7d 77 68 69 6c 65 28 20 65 72 72       }while( err
21a60 3d 3d 45 49 4e 54 52 20 29 3b 0a 20 20 20 20 20  ==EINTR );.     
21a70 20 69 66 28 20 65 72 72 20 29 20 72 65 74 75 72   if( err ) retur
21a80 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57  n SQLITE_IOERR_W
21a90 52 49 54 45 3b 0a 23 65 6c 73 65 0a 20 20 20 20  RITE;.#else.    
21aa0 20 20 2f 2a 20 49 66 20 74 68 65 20 4f 53 20 64    /* If the OS d
21ab0 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 70 6f 73  oes not have pos
21ac0 69 78 5f 66 61 6c 6c 6f 63 61 74 65 28 29 2c 20  ix_fallocate(), 
21ad0 66 61 6b 65 20 69 74 2e 20 57 72 69 74 65 20 61  fake it. Write a
21ae0 20 0a 20 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c   .      ** singl
21af0 65 20 62 79 74 65 20 74 6f 20 74 68 65 20 6c 61  e byte to the la
21b00 73 74 20 62 79 74 65 20 69 6e 20 65 61 63 68 20  st byte in each 
21b10 62 6c 6f 63 6b 20 74 68 61 74 20 66 61 6c 6c 73  block that falls
21b20 20 65 6e 74 69 72 65 6c 79 0a 20 20 20 20 20 20   entirely.      
21b30 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20 65 78  ** within the ex
21b40 74 65 6e 64 65 64 20 72 65 67 69 6f 6e 2e 20 54  tended region. T
21b50 68 65 6e 2c 20 69 66 20 72 65 71 75 69 72 65 64  hen, if required
21b60 2c 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 0a  , a single byte.
21b70 20 20 20 20 20 20 2a 2a 20 61 74 20 6f 66 66 73        ** at offs
21b80 65 74 20 28 6e 53 69 7a 65 2d 31 29 2c 20 74 6f  et (nSize-1), to
21b90 20 73 65 74 20 74 68 65 20 73 69 7a 65 20 6f 66   set the size of
21ba0 20 74 68 65 20 66 69 6c 65 20 63 6f 72 72 65 63   the file correc
21bb0 74 6c 79 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68  tly..      ** Th
21bc0 69 73 20 69 73 20 61 20 73 69 6d 69 6c 61 72 20  is is a similar 
21bd0 74 65 63 68 6e 69 71 75 65 20 74 6f 20 74 68 61  technique to tha
21be0 74 20 75 73 65 64 20 62 79 20 67 6c 69 62 63 20  t used by glibc 
21bf0 6f 6e 20 73 79 73 74 65 6d 73 0a 20 20 20 20 20  on systems.     
21c00 20 2a 2a 20 74 68 61 74 20 64 6f 20 6e 6f 74 20   ** that do not 
21c10 68 61 76 65 20 61 20 72 65 61 6c 20 66 61 6c 6c  have a real fall
21c20 6f 63 61 74 65 28 29 20 63 61 6c 6c 2e 0a 20 20  ocate() call..  
21c30 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74      */.      int
21c40 20 6e 42 6c 6b 20 3d 20 62 75 66 2e 73 74 5f 62   nBlk = buf.st_b
21c50 6c 6b 73 69 7a 65 3b 20 20 2f 2a 20 46 69 6c 65  lksize;  /* File
21c60 2d 73 79 73 74 65 6d 20 62 6c 6f 63 6b 20 73 69  -system block si
21c70 7a 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ze */.      int 
21c80 6e 57 72 69 74 65 20 3d 20 30 3b 20 20 20 20 20  nWrite = 0;     
21c90 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
21ca0 72 20 6f 66 20 62 79 74 65 73 20 77 72 69 74 74  r of bytes writt
21cb0 65 6e 20 62 79 20 73 65 65 6b 41 6e 64 57 72 69  en by seekAndWri
21cc0 74 65 20 2a 2f 0a 20 20 20 20 20 20 69 36 34 20  te */.      i64 
21cd0 69 57 72 69 74 65 3b 20 20 20 20 20 20 20 20 20  iWrite;         
21ce0 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20          /* Next 
21cf0 6f 66 66 73 65 74 20 74 6f 20 77 72 69 74 65 20  offset to write 
21d00 74 6f 20 2a 2f 0a 0a 20 20 20 20 20 20 69 57 72  to */..      iWr
21d10 69 74 65 20 3d 20 28 62 75 66 2e 73 74 5f 73 69  ite = (buf.st_si
21d20 7a 65 2f 6e 42 6c 6b 29 2a 6e 42 6c 6b 20 2b 20  ze/nBlk)*nBlk + 
21d30 6e 42 6c 6b 20 2d 20 31 3b 0a 20 20 20 20 20 20  nBlk - 1;.      
21d40 61 73 73 65 72 74 28 20 69 57 72 69 74 65 3e 3d  assert( iWrite>=
21d50 62 75 66 2e 73 74 5f 73 69 7a 65 20 29 3b 0a 20  buf.st_size );. 
21d60 20 20 20 20 20 61 73 73 65 72 74 28 20 28 28 69       assert( ((i
21d70 57 72 69 74 65 2b 31 29 25 6e 42 6c 6b 29 3d 3d  Write+1)%nBlk)==
21d80 30 20 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 2f  0 );.      for(/
21d90 2a 6e 6f 2d 6f 70 2a 2f 3b 20 69 57 72 69 74 65  *no-op*/; iWrite
21da0 3c 6e 53 69 7a 65 2b 6e 42 6c 6b 2d 31 3b 20 69  <nSize+nBlk-1; i
21db0 57 72 69 74 65 2b 3d 6e 42 6c 6b 20 29 7b 0a 20  Write+=nBlk ){. 
21dc0 20 20 20 20 20 20 20 69 66 28 20 69 57 72 69 74         if( iWrit
21dd0 65 3e 3d 6e 53 69 7a 65 20 29 20 69 57 72 69 74  e>=nSize ) iWrit
21de0 65 20 3d 20 6e 53 69 7a 65 20 2d 20 31 3b 0a 20  e = nSize - 1;. 
21df0 20 20 20 20 20 20 20 6e 57 72 69 74 65 20 3d 20         nWrite = 
21e00 73 65 65 6b 41 6e 64 57 72 69 74 65 28 70 46 69  seekAndWrite(pFi
21e10 6c 65 2c 20 69 57 72 69 74 65 2c 20 22 22 2c 20  le, iWrite, "", 
21e20 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  1);.        if( 
21e30 6e 57 72 69 74 65 21 3d 31 20 29 20 72 65 74 75  nWrite!=1 ) retu
21e40 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
21e50 57 52 49 54 45 3b 0a 20 20 20 20 20 20 7d 0a 23  WRITE;.      }.#
21e60 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a  endif.    }.  }.
21e70 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
21e80 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 69 66  MMAP_SIZE>0.  if
21e90 28 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a  ( pFile->mmapSiz
21ea0 65 4d 61 78 3e 30 20 26 26 20 6e 42 79 74 65 3e  eMax>0 && nByte>
21eb0 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20  pFile->mmapSize 
21ec0 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20  ){.    int rc;. 
21ed0 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 73 7a     if( pFile->sz
21ee0 43 68 75 6e 6b 3c 3d 30 20 29 7b 0a 20 20 20 20  Chunk<=0 ){.    
21ef0 20 20 69 66 28 20 72 6f 62 75 73 74 5f 66 74 72    if( robust_ftr
21f00 75 6e 63 61 74 65 28 70 46 69 6c 65 2d 3e 68 2c  uncate(pFile->h,
21f10 20 6e 42 79 74 65 29 20 29 7b 0a 20 20 20 20 20   nByte) ){.     
21f20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e     storeLastErrn
21f30 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29 3b  o(pFile, errno);
21f40 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
21f50 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c  unixLogError(SQL
21f60 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41  ITE_IOERR_TRUNCA
21f70 54 45 2c 20 22 66 74 72 75 6e 63 61 74 65 22 2c  TE, "ftruncate",
21f80 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a   pFile->zPath);.
21f90 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
21fa0 20 20 20 72 63 20 3d 20 75 6e 69 78 4d 61 70 66     rc = unixMapf
21fb0 69 6c 65 28 70 46 69 6c 65 2c 20 6e 42 79 74 65  ile(pFile, nByte
21fc0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  );.    return rc
21fd0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
21fe0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
21ff0 3b 0a 7d 0a 0a 0a 23 69 66 20 28 53 51 4c 49 54  ;.}...#if (SQLIT
22000 45 5f 45 4e 41 42 4c 45 5f 41 50 50 4c 45 5f 53  E_ENABLE_APPLE_S
22010 50 49 3e 30 29 20 26 26 20 64 65 66 69 6e 65 64  PI>0) && defined
22020 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 23 69 6e 63  (__APPLE__).#inc
22030 6c 75 64 65 20 22 73 71 6c 69 74 65 33 5f 70 72  lude "sqlite3_pr
22040 69 76 61 74 65 2e 68 22 0a 23 69 6e 63 6c 75 64  ivate.h".#includ
22050 65 20 3c 63 6f 70 79 66 69 6c 65 2e 68 3e 0a 73  e <copyfile.h>.s
22060 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 47  tatic int proxyG
22070 65 74 44 62 50 61 74 68 46 6f 72 55 6e 69 78 46  etDbPathForUnixF
22080 69 6c 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46  ile(unixFile *pF
22090 69 6c 65 2c 20 63 68 61 72 20 2a 64 62 50 61 74  ile, char *dbPat
220a0 68 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  h);.#endif..#if 
220b0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
220c0 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 73 74 61 74  CKING_STYLE.stat
220d0 69 63 20 69 6e 74 20 69 73 50 72 6f 78 79 4c 6f  ic int isProxyLo
220e0 63 6b 69 6e 67 4d 6f 64 65 28 75 6e 69 78 46 69  ckingMode(unixFi
220f0 6c 65 20 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a 23  le *);.#endif..#
22100 69 66 20 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  if (SQLITE_ENABL
22110 45 5f 41 50 50 4c 45 5f 53 50 49 3e 30 29 20 26  E_APPLE_SPI>0) &
22120 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  & defined(__APPL
22130 45 5f 5f 29 0a 73 74 61 74 69 63 20 69 6e 74 20  E__).static int 
22140 75 6e 69 78 54 72 75 6e 63 61 74 65 44 61 74 61  unixTruncateData
22150 62 61 73 65 28 75 6e 69 78 46 69 6c 65 20 2a 2c  base(unixFile *,
22160 20 69 6e 74 29 3b 0a 0a 73 74 61 74 69 63 20 69   int);..static i
22170 6e 74 20 75 6e 69 78 49 6e 76 61 6c 69 64 61 74  nt unixInvalidat
22180 65 53 75 70 70 6f 72 74 46 69 6c 65 73 28 75 6e  eSupportFiles(un
22190 69 78 46 69 6c 65 20 2a 2c 20 69 6e 74 29 3b 0a  ixFile *, int);.
221a0 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6e 64  .static int find
221b0 43 72 65 61 74 65 46 69 6c 65 4d 6f 64 65 28 63  CreateFileMode(c
221c0 6f 6e 73 74 20 63 68 61 72 20 2a 2c 20 69 6e 74  onst char *, int
221d0 2c 20 6d 6f 64 65 5f 74 2a 2c 20 75 69 64 5f 74  , mode_t*, uid_t
221e0 20 2a 2c 67 69 64 5f 74 20 2a 29 3b 0a 0a 2f 2a   *,gid_t *);../*
221f0 20 6f 70 65 6e 73 20 61 20 72 65 61 64 2f 77 72   opens a read/wr
22200 69 74 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74  ite connection t
22210 6f 20 61 20 66 69 6c 65 20 7a 4e 61 6d 65 20 69  o a file zName i
22220 6e 68 65 72 69 74 69 6e 67 20 74 68 65 20 61 70  nheriting the ap
22230 70 72 6f 70 72 69 61 74 65 0a 2a 2a 20 75 73 65  propriate.** use
22240 72 2f 70 65 72 6d 73 20 66 72 6f 6d 20 74 68 65  r/perms from the
22250 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
22260 66 20 72 75 6e 6e 69 6e 67 20 61 73 20 72 6f 6f  f running as roo
22270 74 2e 20 20 52 65 74 75 72 6e 73 20 74 68 65 20  t.  Returns the 
22280 66 69 6c 65 20 0a 2a 2a 20 64 65 73 63 72 69 70  file .** descrip
22290 74 6f 72 20 62 79 20 72 65 66 65 72 65 6e 63 65  tor by reference
222a0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
222b0 6e 69 78 4f 70 65 6e 43 68 69 6c 64 46 69 6c 65  nixOpenChildFile
222c0 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  (.  const char *
222d0 7a 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 6f 70 65  zName,.  int ope
222e0 6e 46 6c 61 67 73 2c 0a 20 20 69 6e 74 20 64 62  nFlags,.  int db
222f0 4f 70 65 6e 46 6c 61 67 73 2c 0a 20 20 69 6e 74  OpenFlags,.  int
22300 20 70 72 6f 74 46 6c 61 67 73 2c 0a 20 20 69 6e   protFlags,.  in
22310 74 20 2a 70 46 64 0a 29 7b 0a 20 20 69 6e 74 20  t *pFd.){.  int 
22320 66 64 20 3d 20 2d 31 3b 0a 20 20 6d 6f 64 65 5f  fd = -1;.  mode_
22330 74 20 6f 70 65 6e 4d 6f 64 65 3b 20 20 20 20 20  t openMode;     
22340 20 20 20 20 20 20 20 20 20 2f 2a 20 50 65 72 6d           /* Perm
22350 69 73 73 69 6f 6e 73 20 74 6f 20 63 72 65 61 74  issions to creat
22360 65 20 66 69 6c 65 20 77 69 74 68 20 2a 2f 0a 20  e file with */. 
22370 20 75 69 64 5f 74 20 75 69 64 3b 20 20 20 20 20   uid_t uid;     
22380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22390 2a 20 55 73 65 72 69 64 20 66 6f 72 20 74 68 65  * Userid for the
223a0 20 66 69 6c 65 20 2a 2f 0a 20 20 67 69 64 5f 74   file */.  gid_t
223b0 20 67 69 64 3b 20 20 20 20 20 20 20 20 20 20 20   gid;           
223c0 20 20 20 20 20 20 20 20 20 2f 2a 20 47 72 6f 75           /* Grou
223d0 70 69 64 20 66 6f 72 20 74 68 65 20 66 69 6c 65  pid for the file
223e0 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20   */.  int rc;.  
223f0 0a 20 20 61 73 73 65 72 74 28 70 46 64 21 3d 4e  .  assert(pFd!=N
22400 55 4c 4c 29 3b 0a 20 20 72 63 20 3d 20 66 69 6e  ULL);.  rc = fin
22410 64 43 72 65 61 74 65 46 69 6c 65 4d 6f 64 65 28  dCreateFileMode(
22420 7a 4e 61 6d 65 2c 20 64 62 4f 70 65 6e 46 6c 61  zName, dbOpenFla
22430 67 73 2c 20 26 6f 70 65 6e 4d 6f 64 65 2c 20 26  gs, &openMode, &
22440 75 69 64 2c 20 26 67 69 64 29 3b 0a 20 20 69 66  uid, &gid);.  if
22450 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
22460 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
22470 3b 0a 20 20 7d 0a 20 20 66 64 20 3d 20 72 6f 62  ;.  }.  fd = rob
22480 75 73 74 5f 6f 70 65 6e 28 7a 4e 61 6d 65 2c 20  ust_open(zName, 
22490 6f 70 65 6e 46 6c 61 67 73 2c 20 6f 70 65 6e 4d  openFlags, openM
224a0 6f 64 65 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  ode);.  OSTRACE(
224b0 28 22 4f 50 45 4e 58 20 20 20 25 2d 33 64 20 25  ("OPENX   %-3d %
224c0 73 20 30 25 6f 5c 6e 22 2c 20 66 64 2c 20 7a 4e  s 0%o\n", fd, zN
224d0 61 6d 65 2c 20 6f 70 65 6e 46 6c 61 67 73 29 29  ame, openFlags))
224e0 3b 0a 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a  ;.  if( fd<0 ){.
224f0 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67      rc = unixLog
22500 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e  Error(SQLITE_CAN
22510 54 4f 50 45 4e 5f 42 4b 50 54 2c 20 22 6f 70 65  TOPEN_BKPT, "ope
22520 6e 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  n", zName);.    
22530 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
22540 20 2f 2a 20 69 66 20 77 65 27 72 65 20 6f 70 65   /* if we're ope
22550 6e 69 6e 67 20 74 68 65 20 77 61 6c 20 6f 72 20  ning the wal or 
22560 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 72 75 6e 6e  journal and runn
22570 69 6e 67 20 61 73 20 72 6f 6f 74 2c 20 73 65 74  ing as root, set
22580 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61  .  ** the journa
22590 6c 20 75 69 64 2f 67 69 64 20 2a 2f 0a 20 20 69  l uid/gid */.  i
225a0 66 28 20 64 62 4f 70 65 6e 46 6c 61 67 73 20 26  f( dbOpenFlags &
225b0 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41   (SQLITE_OPEN_WA
225c0 4c 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  L|SQLITE_OPEN_MA
225d0 49 4e 5f 4a 4f 55 52 4e 41 4c 29 20 29 7b 0a 20  IN_JOURNAL) ){. 
225e0 20 20 20 75 69 64 5f 74 20 65 75 69 64 20 3d 20     uid_t euid = 
225f0 67 65 74 65 75 69 64 28 29 3b 0a 20 20 20 20 69  geteuid();.    i
22600 66 28 20 65 75 69 64 3d 3d 30 20 26 26 20 28 65  f( euid==0 && (e
22610 75 69 64 21 3d 75 69 64 20 7c 7c 20 67 65 74 65  uid!=uid || gete
22620 67 69 64 28 29 21 3d 67 69 64 29 20 29 7b 0a 20  gid()!=gid) ){. 
22630 20 20 20 20 20 69 66 28 20 66 63 68 6f 77 6e 28       if( fchown(
22640 66 64 2c 20 75 69 64 2c 20 67 69 64 29 20 29 7b  fd, uid, gid) ){
22650 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
22660 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b  LITE_CANTOPEN_BK
22670 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  PT;.      }.    
22680 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  }.  }.  if( rc==
22690 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
226a0 20 2a 70 46 64 20 3d 20 66 64 3b 0a 20 20 7d 20   *pFd = fd;.  } 
226b0 65 6c 73 65 20 7b 0a 20 20 20 20 2a 70 46 64 20  else {.    *pFd 
226c0 3d 20 2d 31 3b 0a 20 20 20 20 63 6c 6f 73 65 28  = -1;.    close(
226d0 66 64 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  fd);.  }.  retur
226e0 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20  n rc;.}..static 
226f0 69 6e 74 20 75 6e 69 78 52 65 70 6c 61 63 65 44  int unixReplaceD
22700 61 74 61 62 61 73 65 28 75 6e 69 78 46 69 6c 65  atabase(unixFile
22710 20 2a 70 46 69 6c 65 2c 20 73 71 6c 69 74 65 33   *pFile, sqlite3
22720 20 2a 73 72 63 64 62 29 20 7b 0a 20 20 73 71 6c   *srcdb) {.  sql
22730 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 20 3d 20  ite3_file *id = 
22740 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29  (sqlite3_file *)
22750 70 46 69 6c 65 3b 0a 20 20 42 74 72 65 65 20 2a  pFile;.  Btree *
22760 70 53 72 63 42 74 72 65 65 20 3d 20 4e 55 4c 4c  pSrcBtree = NULL
22770 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  ;.  sqlite3_file
22780 20 2a 73 72 63 5f 66 69 6c 65 20 3d 20 4e 55 4c   *src_file = NUL
22790 4c 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  L;.  unixFile *p
227a0 53 72 63 46 69 6c 65 20 3d 20 4e 55 4c 4c 3b 0a  SrcFile = NULL;.
227b0 20 20 63 68 61 72 20 73 72 63 57 61 6c 50 61 74    char srcWalPat
227c0 68 5b 4d 41 58 50 41 54 48 4c 45 4e 2b 35 5d 3b  h[MAXPATHLEN+5];
227d0 0a 20 20 69 6e 74 20 73 72 63 57 61 6c 46 44 20  .  int srcWalFD 
227e0 3d 20 2d 31 3b 0a 20 20 69 6e 74 20 72 63 20 3d  = -1;.  int rc =
227f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 76 6f   SQLITE_OK;.  vo
22800 69 64 20 2a 70 4c 6f 63 6b 20 3d 20 4e 55 4c 4c  id *pLock = NULL
22810 3b 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20  ;.  int flags = 
22820 30 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 73 72  0;.  sqlite3 *sr
22830 63 64 62 32 20 3d 20 4e 55 4c 4c 3b 0a 20 20 63  cdb2 = NULL;.  c
22840 6f 70 79 66 69 6c 65 5f 73 74 61 74 65 5f 74 20  opyfile_state_t 
22850 73 3b 0a 20 20 69 6e 74 20 63 6f 72 72 75 70 74  s;.  int corrupt
22860 53 72 63 46 69 6c 65 4c 6f 63 6b 20 3d 20 30 3b  SrcFileLock = 0;
22870 0a 20 20 69 6e 74 20 63 6f 72 72 75 70 74 44 73  .  int corruptDs
22880 74 46 69 6c 65 4c 6f 63 6b 20 3d 20 30 3b 0a 20  tFileLock = 0;. 
22890 20 69 6e 74 20 69 73 53 72 63 43 6f 72 72 75 70   int isSrcCorrup
228a0 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 73 44  t = 0;.  int isD
228b0 73 74 43 6f 72 72 75 70 74 20 3d 20 30 3b 0a 20  stCorrupt = 0;. 
228c0 20 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33   .  if( !sqlite3
228d0 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 73 72  SafetyCheckOk(sr
228e0 63 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75  cdb) ){.    retu
228f0 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
22900 3b 0a 20 20 7d 0a 20 20 20 20 0a 23 69 66 20 53  ;.  }.    .#if S
22910 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44 41 54  QLITE_ENABLE_DAT
22920 41 5f 50 52 4f 54 45 43 54 49 4f 4e 0a 20 20 66  A_PROTECTION.  f
22930 6c 61 67 73 20 7c 3d 20 70 46 69 6c 65 2d 3e 70  lags |= pFile->p
22940 72 6f 74 46 6c 61 67 73 3b 0a 23 65 6e 64 69 66  rotFlags;.#endif
22950 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
22960 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
22970 0a 20 20 69 66 28 20 69 73 50 72 6f 78 79 4c 6f  .  if( isProxyLo
22980 63 6b 69 6e 67 4d 6f 64 65 28 70 46 69 6c 65 29  ckingMode(pFile)
22990 20 29 7b 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d   ){.    flags |=
229a0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 41 55 54   SQLITE_OPEN_AUT
229b0 4f 50 52 4f 58 59 3b 0a 20 20 7d 0a 23 65 6e 64  OPROXY;.  }.#end
229c0 69 66 0a 20 20 0a 20 20 72 63 20 3d 20 73 71 6c  if.  .  rc = sql
229d0 69 74 65 33 64 65 6d 6f 5f 73 75 70 65 72 6c 6f  ite3demo_superlo
229e0 63 6b 28 70 46 69 6c 65 2d 3e 7a 50 61 74 68 2c  ck(pFile->zPath,
229f0 20 30 2c 20 66 6c 61 67 73 2c 20 30 2c 20 30 2c   0, flags, 0, 0,
22a00 20 26 70 4c 6f 63 6b 29 3b 0a 20 20 69 66 28 20   &pLock);.  if( 
22a10 72 63 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63  rc ){.    if( rc
22a20 3d 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  ==SQLITE_CORRUPT
22a30 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e   || rc==SQLITE_N
22a40 4f 54 41 44 42 20 29 7b 0a 20 20 20 20 20 20 69  OTADB ){.      i
22a50 73 44 73 74 43 6f 72 72 75 70 74 20 3d 20 31 3b  sDstCorrupt = 1;
22a60 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
22a70 74 65 33 64 65 6d 6f 5f 73 75 70 65 72 6c 6f 63  te3demo_superloc
22a80 6b 5f 63 6f 72 72 75 70 74 28 69 64 2c 20 53 51  k_corrupt(id, SQ
22a90 4c 49 54 45 5f 4c 4f 43 4b 5f 45 58 43 4c 55 53  LITE_LOCK_EXCLUS
22aa0 49 56 45 2c 0a 20 20 20 20 20 20 20 20 20 20 20  IVE,.           
22ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 63                &c
22ad0 6f 72 72 75 70 74 44 73 74 46 69 6c 65 4c 6f 63  orruptDstFileLoc
22ae0 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  k);.    }.    if
22af0 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65  ( rc ){.      re
22b00 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
22b10 20 7d 0a 20 20 2f 2a 20 67 65 74 20 74 68 65 20   }.  /* get the 
22b20 73 72 63 20 66 69 6c 65 20 64 65 73 63 72 69 70  src file descrip
22b30 74 6f 72 20 61 64 68 65 72 69 6e 67 20 74 6f 20  tor adhering to 
22b40 74 68 65 20 64 62 20 73 74 72 75 63 74 20 61 63  the db struct ac
22b50 63 65 73 73 20 72 75 6c 65 73 20 0a 20 20 20 2a  cess rules .   *
22b60 2a 20 74 68 69 73 20 63 6f 64 65 20 69 73 20 6d  * this code is m
22b70 6f 64 65 6c 65 64 20 61 66 74 65 72 20 73 71 6c  odeled after sql
22b80 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f  ite3_file_contro
22b90 6c 28 29 20 69 6e 20 6d 61 69 6e 2e 63 0a 20 20  l() in main.c.  
22ba0 20 2a 2f 20 0a 20 20 73 71 6c 69 74 65 33 5f 6d   */ .  sqlite3_m
22bb0 75 74 65 78 5f 65 6e 74 65 72 28 73 72 63 64 62  utex_enter(srcdb
22bc0 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20  ->mutex);.  if( 
22bd0 73 72 63 64 62 2d 3e 6e 44 62 3e 30 20 29 7b 0a  srcdb->nDb>0 ){.
22be0 20 20 20 20 70 53 72 63 42 74 72 65 65 20 3d 20      pSrcBtree = 
22bf0 73 72 63 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42  srcdb->aDb[0].pB
22c00 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 72  t;.  }.  if( pSr
22c10 63 42 74 72 65 65 20 29 7b 0a 20 20 20 20 50 61  cBtree ){.    Pa
22c20 67 65 72 20 2a 70 53 72 63 50 61 67 65 72 3b 0a  ger *pSrcPager;.
22c30 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
22c40 45 6e 74 65 72 28 70 53 72 63 42 74 72 65 65 29  Enter(pSrcBtree)
22c50 3b 0a 20 20 20 20 70 53 72 63 50 61 67 65 72 20  ;.    pSrcPager 
22c60 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  = sqlite3BtreePa
22c70 67 65 72 28 70 53 72 63 42 74 72 65 65 29 3b 0a  ger(pSrcBtree);.
22c80 20 20 20 20 61 73 73 65 72 74 28 20 70 53 72 63      assert( pSrc
22c90 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 20 20  Pager!=0 );.    
22ca0 73 72 63 5f 66 69 6c 65 20 3d 20 73 71 6c 69 74  src_file = sqlit
22cb0 65 33 50 61 67 65 72 46 69 6c 65 28 70 53 72 63  e3PagerFile(pSrc
22cc0 50 61 67 65 72 29 3b 0a 20 20 20 20 61 73 73 65  Pager);.    asse
22cd0 72 74 28 20 73 72 63 5f 66 69 6c 65 21 3d 30 20  rt( src_file!=0 
22ce0 29 3b 0a 20 20 20 20 69 66 28 20 73 72 63 5f 66  );.    if( src_f
22cf0 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b  ile->pMethods ){
22d00 0a 20 20 20 20 20 20 69 6e 74 20 73 72 63 46 6c  .      int srcFl
22d10 61 67 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  ags = 0;.      p
22d20 53 72 63 46 69 6c 65 20 3d 20 28 75 6e 69 78 46  SrcFile = (unixF
22d30 69 6c 65 20 2a 29 73 72 63 5f 66 69 6c 65 3b 0a  ile *)src_file;.
22d40 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  #if SQLITE_ENABL
22d50 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
22d60 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  || defined(__APP
22d70 4c 45 5f 5f 29 0a 20 20 20 20 20 20 69 66 20 28  LE__).      if (
22d80 28 70 53 72 63 46 69 6c 65 2d 3e 6f 70 65 6e 46  (pSrcFile->openF
22d90 6c 61 67 73 20 26 20 4f 5f 52 44 57 52 29 20 3d  lags & O_RDWR) =
22da0 3d 20 4f 5f 52 44 57 52 29 20 7b 0a 20 20 20 20  = O_RDWR) {.    
22db0 20 20 20 20 73 72 63 46 6c 61 67 73 20 3d 20 53      srcFlags = S
22dc0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
22dd0 52 49 54 45 3b 0a 20 20 20 20 20 20 7d 20 65 6c  RITE;.      } el
22de0 73 65 20 7b 0a 20 20 20 20 20 20 20 20 73 72 63  se {.        src
22df0 46 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f  Flags = SQLITE_O
22e00 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  PEN_READONLY;.  
22e10 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20      }.#else.    
22e20 20 20 73 72 63 46 6c 61 67 73 20 3d 20 53 51 4c    srcFlags = SQL
22e30 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
22e40 54 45 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 53  TE;.#endif.#if S
22e50 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 44 41 54  QLITE_ENABLE_DAT
22e60 41 5f 50 52 4f 54 45 43 54 49 4f 4e 0a 20 20 20  A_PROTECTION.   
22e70 20 20 20 73 72 63 46 6c 61 67 73 20 7c 3d 20 70     srcFlags |= p
22e80 53 72 63 46 69 6c 65 2d 3e 70 72 6f 74 46 6c 61  SrcFile->protFla
22e90 67 73 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 53  gs;.#endif.#if S
22ea0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
22eb0 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20 20  KING_STYLE.     
22ec0 20 69 66 28 20 69 73 50 72 6f 78 79 4c 6f 63 6b   if( isProxyLock
22ed0 69 6e 67 4d 6f 64 65 28 70 53 72 63 46 69 6c 65  ingMode(pSrcFile
22ee0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 72 63  ) ){.        src
22ef0 46 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  Flags |= SQLITE_
22f00 4f 50 45 4e 5f 41 55 54 4f 50 52 4f 58 59 3b 0a  OPEN_AUTOPROXY;.
22f10 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
22f20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
22f30 33 5f 6f 70 65 6e 5f 76 32 28 70 53 72 63 46 69  3_open_v2(pSrcFi
22f40 6c 65 2d 3e 7a 50 61 74 68 2c 20 26 73 72 63 64  le->zPath, &srcd
22f50 62 32 2c 20 73 72 63 46 6c 61 67 73 2c 20 30 29  b2, srcFlags, 0)
22f60 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
22f70 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
22f80 20 20 20 20 20 2f 2a 20 73 74 61 72 74 20 61 20       /* start a 
22f90 64 65 66 65 72 72 65 64 20 74 72 61 6e 73 61 63  deferred transac
22fa0 74 69 6f 6e 20 61 6e 64 20 72 65 61 64 20 74 6f  tion and read to
22fb0 20 65 73 74 61 62 6c 69 73 68 20 61 20 72 65 61   establish a rea
22fc0 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20  d lock */.      
22fd0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65    rc = sqlite3_e
22fe0 78 65 63 28 73 72 63 64 62 32 2c 20 22 42 45 47  xec(srcdb2, "BEG
22ff0 49 4e 20 44 45 46 45 52 52 45 44 3b 20 50 52 41  IN DEFERRED; PRA
23000 47 4d 41 20 73 63 68 65 6d 61 5f 76 65 72 73 69  GMA schema_versi
23010 6f 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  on",.           
23020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
23030 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , 0, 0);.       
23040 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
23050 43 4f 52 52 55 50 54 20 7c 7c 20 72 63 3d 3d 53  CORRUPT || rc==S
23060 51 4c 49 54 45 5f 4e 4f 54 41 44 42 20 29 7b 0a  QLITE_NOTADB ){.
23070 20 20 20 20 20 20 20 20 20 20 69 73 53 72 63 43            isSrcC
23080 6f 72 72 75 70 74 20 3d 20 31 3b 0a 20 20 20 20  orrupt = 1;.    
23090 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
230a0 65 33 64 65 6d 6f 5f 73 75 70 65 72 6c 6f 63 6b  e3demo_superlock
230b0 5f 63 6f 72 72 75 70 74 28 73 72 63 5f 66 69 6c  _corrupt(src_fil
230c0 65 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 53  e, SQLITE_LOCK_S
230d0 48 41 52 45 44 2c 0a 20 20 20 20 20 20 20 20 20  HARED,.         
230e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
230f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23100 20 20 20 20 26 63 6f 72 72 75 70 74 53 72 63 46      &corruptSrcF
23110 69 6c 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 20 20  ileLock);.      
23120 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
23130 7d 0a 20 20 7d 0a 20 20 69 66 28 20 21 73 72 63  }.  }.  if( !src
23140 64 62 32 20 7c 7c 20 70 53 72 63 46 69 6c 65 3d  db2 || pSrcFile=
23150 3d 4e 55 4c 4c 20 7c 7c 20 70 53 72 63 46 69 6c  =NULL || pSrcFil
23160 65 2d 3e 68 3c 30 29 7b 0a 20 20 20 20 72 63 20  e->h<0){.    rc 
23170 3d 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e 41  = SQLITE_INTERNA
23180 4c 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21  L;.  }.  if( rc!
23190 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
231a0 20 20 67 6f 74 6f 20 65 6e 64 5f 72 65 70 6c 61    goto end_repla
231b0 63 65 5f 64 61 74 61 62 61 73 65 3b 0a 20 20 7d  ce_database;.  }
231c0 0a 20 20 2f 2a 20 62 6f 74 68 20 64 61 74 61 62  .  /* both datab
231d0 61 73 65 73 20 61 72 65 20 6c 6f 63 6b 65 64 20  ases are locked 
231e0 61 70 70 72 6f 70 72 69 61 74 65 6c 79 2c 20 63  appropriately, c
231f0 6f 70 79 20 74 68 65 20 73 72 63 20 77 61 6c 20  opy the src wal 
23200 6a 6f 75 72 6e 61 6c 20 69 66 20 0a 20 20 20 2a  journal if .   *
23210 2a 20 6f 6e 65 20 65 78 69 73 74 73 20 61 6e 64  * one exists and
23220 20 74 68 65 6e 20 74 68 65 20 61 63 74 75 61 6c   then the actual
23230 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 20   database file. 
23240 20 20 2a 2f 0a 20 20 73 74 72 6c 63 70 79 28 73    */.  strlcpy(s
23250 72 63 57 61 6c 50 61 74 68 2c 20 70 53 72 63 46  rcWalPath, pSrcF
23260 69 6c 65 2d 3e 7a 50 61 74 68 2c 20 4d 41 58 50  ile->zPath, MAXP
23270 41 54 48 4c 45 4e 2b 35 29 3b 0a 20 20 73 74 72  ATHLEN+5);.  str
23280 6c 63 61 74 28 73 72 63 57 61 6c 50 61 74 68 2c  lcat(srcWalPath,
23290 20 22 2d 77 61 6c 22 2c 20 4d 41 58 50 41 54 48   "-wal", MAXPATH
232a0 4c 45 4e 2b 35 29 3b 0a 20 20 73 72 63 57 61 6c  LEN+5);.  srcWal
232b0 46 44 20 3d 20 6f 70 65 6e 28 73 72 63 57 61 6c  FD = open(srcWal
232c0 50 61 74 68 2c 20 4f 5f 52 44 4f 4e 4c 59 29 3b  Path, O_RDONLY);
232d0 0a 20 20 69 66 28 20 21 28 73 72 63 57 61 6c 46  .  if( !(srcWalF
232e0 44 3c 30 29 20 29 7b 0a 20 20 20 20 63 68 61 72  D<0) ){.    char
232f0 20 64 73 74 57 61 6c 50 61 74 68 5b 4d 41 58 50   dstWalPath[MAXP
23300 41 54 48 4c 45 4e 2b 35 5d 3b 0a 20 20 20 20 69  ATHLEN+5];.    i
23310 6e 74 20 64 73 74 57 61 6c 46 44 20 3d 20 2d 31  nt dstWalFD = -1
23320 3b 0a 20 20 20 20 69 6e 74 20 70 72 6f 74 46 6c  ;.    int protFl
23330 61 67 73 20 3d 20 30 3b 0a 20 20 20 20 73 74 72  ags = 0;.    str
23340 6c 63 70 79 28 64 73 74 57 61 6c 50 61 74 68 2c  lcpy(dstWalPath,
23350 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 2c 20 4d   pFile->zPath, M
23360 41 58 50 41 54 48 4c 45 4e 2b 35 29 3b 0a 20 20  AXPATHLEN+5);.  
23370 20 20 73 74 72 6c 63 61 74 28 64 73 74 57 61 6c    strlcat(dstWal
23380 50 61 74 68 2c 20 22 2d 77 61 6c 22 2c 20 4d 41  Path, "-wal", MA
23390 58 50 41 54 48 4c 45 4e 2b 35 29 3b 0a 0a 20 20  XPATHLEN+5);..  
233a0 20 20 72 63 20 3d 20 75 6e 69 78 4f 70 65 6e 43    rc = unixOpenC
233b0 68 69 6c 64 46 69 6c 65 28 64 73 74 57 61 6c 50  hildFile(dstWalP
233c0 61 74 68 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43 52  ath, O_RDWR|O_CR
233d0 45 41 54 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  EAT, SQLITE_OPEN
233e0 5f 57 41 4c 2c 0a 20 20 20 20 20 20 20 20 20 20  _WAL,.          
233f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23400 20 70 72 6f 74 46 6c 61 67 73 2c 20 26 64 73 74   protFlags, &dst
23410 57 61 6c 46 44 29 3b 0a 20 20 20 20 69 66 28 20  WalFD);.    if( 
23420 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
23430 0a 20 20 20 20 20 20 73 20 3d 20 63 6f 70 79 66  .      s = copyf
23440 69 6c 65 5f 73 74 61 74 65 5f 61 6c 6c 6f 63 28  ile_state_alloc(
23450 29 3b 0a 20 20 20 20 20 20 6c 73 65 65 6b 28 73  );.      lseek(s
23460 72 63 57 61 6c 46 44 2c 20 30 2c 20 53 45 45 4b  rcWalFD, 0, SEEK
23470 5f 53 45 54 29 3b 0a 20 20 20 20 20 20 6c 73 65  _SET);.      lse
23480 65 6b 28 64 73 74 57 61 6c 46 44 2c 20 30 2c 20  ek(dstWalFD, 0, 
23490 53 45 45 4b 5f 53 45 54 29 3b 0a 20 20 20 20 20  SEEK_SET);.     
234a0 20 69 66 28 20 66 63 6f 70 79 66 69 6c 65 28 73   if( fcopyfile(s
234b0 72 63 57 61 6c 46 44 2c 20 64 73 74 57 61 6c 46  rcWalFD, dstWalF
234c0 44 2c 20 73 2c 20 43 4f 50 59 46 49 4c 45 5f 44  D, s, COPYFILE_D
234d0 41 54 41 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ATA) ){.        
234e0 69 6e 74 20 65 72 72 3d 65 72 72 6e 6f 3b 0a 20  int err=errno;. 
234f0 20 20 20 20 20 20 20 73 77 69 74 63 68 28 65 72         switch(er
23500 72 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 63  r) {.          c
23510 61 73 65 20 45 4e 4f 4d 45 4d 3a 0a 20 20 20 20  ase ENOMEM:.    
23520 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
23530 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
23540 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
23550 20 20 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a          default:
23560 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 74 6f  .            sto
23570 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c  reLastErrno(pFil
23580 65 2c 20 65 72 72 29 3b 0a 20 20 20 20 20 20 20  e, err);.       
23590 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
235a0 5f 49 4f 45 52 52 3b 0a 20 20 20 20 20 20 20 20  _IOERR;.        
235b0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
235c0 63 6f 70 79 66 69 6c 65 5f 73 74 61 74 65 5f 66  copyfile_state_f
235d0 72 65 65 28 73 29 3b 0a 20 20 20 20 20 20 63 6c  ree(s);.      cl
235e0 6f 73 65 28 64 73 74 57 61 6c 46 44 29 3b 0a 20  ose(dstWalFD);. 
235f0 20 20 20 7d 0a 20 20 20 20 63 6c 6f 73 65 28 73     }.    close(s
23600 72 63 57 61 6c 46 44 29 3b 0a 20 20 7d 0a 20 20  rcWalFD);.  }.  
23610 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
23620 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 62 65 66 6f  K ){.    /* befo
23630 72 65 20 77 65 20 63 6f 70 79 2c 20 65 6e 73 75  re we copy, ensu
23640 72 65 20 74 68 61 74 20 74 68 65 20 66 69 6c 65  re that the file
23650 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20   change counter 
23660 77 69 6c 6c 20 62 65 20 6d 6f 64 69 66 69 65 64  will be modified
23670 20 2a 2f 0a 20 20 20 20 75 69 6e 74 33 32 5f 74   */.    uint32_t
23680 20 73 72 63 43 68 61 6e 67 65 20 3d 20 30 3b 0a   srcChange = 0;.
23690 20 20 20 20 75 69 6e 74 33 32 5f 74 20 64 73 74      uint32_t dst
236a0 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20  Change = 0;.    
236b0 70 72 65 61 64 28 70 53 72 63 46 69 6c 65 2d 3e  pread(pSrcFile->
236c0 68 2c 20 26 73 72 63 43 68 61 6e 67 65 2c 20 34  h, &srcChange, 4
236d0 2c 20 32 34 29 3b 0a 20 20 20 20 70 72 65 61 64  , 24);.    pread
236e0 28 70 46 69 6c 65 2d 3e 68 2c 20 26 64 73 74 43  (pFile->h, &dstC
236f0 68 61 6e 67 65 2c 20 34 2c 20 32 34 29 3b 0a 20  hange, 4, 24);. 
23700 20 20 20 0a 20 20 20 20 2f 2a 20 63 6f 70 79 20     .    /* copy 
23710 74 68 65 20 61 63 74 75 61 6c 20 64 61 74 61 62  the actual datab
23720 61 73 65 20 2a 2f 0a 20 20 20 20 73 20 3d 20 63  ase */.    s = c
23730 6f 70 79 66 69 6c 65 5f 73 74 61 74 65 5f 61 6c  opyfile_state_al
23740 6c 6f 63 28 29 3b 0a 20 20 20 20 6c 73 65 65 6b  loc();.    lseek
23750 28 70 53 72 63 46 69 6c 65 2d 3e 68 2c 20 30 2c  (pSrcFile->h, 0,
23760 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20 20 20 20   SEEK_SET);.    
23770 6c 73 65 65 6b 28 70 46 69 6c 65 2d 3e 68 2c 20  lseek(pFile->h, 
23780 30 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20 20  0, SEEK_SET);.  
23790 20 20 69 66 28 20 66 63 6f 70 79 66 69 6c 65 28    if( fcopyfile(
237a0 70 53 72 63 46 69 6c 65 2d 3e 68 2c 20 70 46 69  pSrcFile->h, pFi
237b0 6c 65 2d 3e 68 2c 20 73 2c 20 43 4f 50 59 46 49  le->h, s, COPYFI
237c0 4c 45 5f 44 41 54 41 29 20 29 7b 0a 20 20 20 20  LE_DATA) ){.    
237d0 20 20 69 6e 74 20 65 72 72 3d 65 72 72 6e 6f 3b    int err=errno;
237e0 0a 20 20 20 20 20 20 73 77 69 74 63 68 28 65 72  .      switch(er
237f0 72 29 20 7b 0a 20 20 20 20 20 20 20 20 63 61 73  r) {.        cas
23800 65 20 45 4e 4f 4d 45 4d 3a 0a 20 20 20 20 20 20  e ENOMEM:.      
23810 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
23820 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20  NOMEM;.         
23830 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
23840 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 20  default:.       
23850 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e     storeLastErrn
23860 6f 28 70 46 69 6c 65 2c 20 65 72 72 29 3b 0a 20  o(pFile, err);. 
23870 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
23880 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20  LITE_IOERR;.    
23890 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 63 6f    }.    }.    co
238a0 70 79 66 69 6c 65 5f 73 74 61 74 65 5f 66 72 65  pyfile_state_fre
238b0 65 28 73 29 3b 0a 20 20 20 20 0a 20 20 20 20 69  e(s);.    .    i
238c0 66 20 28 73 72 63 43 68 61 6e 67 65 20 3d 3d 20  f (srcChange == 
238d0 64 73 74 43 68 61 6e 67 65 29 20 7b 0a 20 20 20  dstChange) {.   
238e0 20 20 20 2f 2a 20 6d 6f 64 69 66 79 20 74 68 65     /* modify the
238f0 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20   change counter 
23900 74 6f 20 66 6f 72 63 65 20 70 61 67 65 20 7a 65  to force page ze
23910 72 6f 20 74 6f 20 62 65 20 72 65 6c 6f 61 64 65  ro to be reloade
23920 64 20 2a 2f 0a 20 20 20 20 20 20 64 73 74 43 68  d */.      dstCh
23930 61 6e 67 65 20 2b 2b 3b 0a 20 20 20 20 20 20 70  ange ++;.      p
23940 77 72 69 74 65 28 70 46 69 6c 65 2d 3e 68 2c 20  write(pFile->h, 
23950 26 64 73 74 43 68 61 6e 67 65 2c 20 34 2c 20 32  &dstChange, 4, 2
23960 34 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  4);.    }.  }.  
23970 69 66 28 20 69 73 53 72 63 43 6f 72 72 75 70 74  if( isSrcCorrupt
23980 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 64   ){.    sqlite3d
23990 65 6d 6f 5f 73 75 70 65 72 75 6e 6c 6f 63 6b 5f  emo_superunlock_
239a0 63 6f 72 72 75 70 74 28 73 72 63 5f 66 69 6c 65  corrupt(src_file
239b0 2c 20 63 6f 72 72 75 70 74 53 72 63 46 69 6c 65  , corruptSrcFile
239c0 4c 6f 63 6b 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Lock);.  }else{.
239d0 20 20 20 20 2f 2a 20 64 6f 6e 65 20 77 69 74 68      /* done with
239e0 20 74 68 65 20 73 6f 75 72 63 65 20 64 62 20 73   the source db s
239f0 6f 20 65 6e 64 20 74 68 65 20 74 72 61 6e 73 61  o end the transa
23a00 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 73 71 6c  ction */.    sql
23a10 69 74 65 33 5f 65 78 65 63 28 73 72 63 64 62 32  ite3_exec(srcdb2
23a20 2c 20 22 43 4f 4d 4d 49 54 22 2c 20 30 2c 20 30  , "COMMIT", 0, 0
23a30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20 7a  , 0);.  }.  /* z
23a40 65 72 6f 20 6f 75 74 20 61 6e 79 20 6f 6c 64 20  ero out any old 
23a50 6a 6f 75 72 6e 61 6c 20 63 6c 75 74 74 65 72 20  journal clutter 
23a60 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  */.  if( rc==SQL
23a70 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e  ITE_OK ){.    in
23a80 74 20 73 6b 69 70 57 41 4c 20 3d 20 28 73 72 63  t skipWAL = (src
23a90 57 61 6c 46 44 3c 30 29 3f 30 3a 31 3b 0a 20 20  WalFD<0)?0:1;.  
23aa0 20 20 75 6e 69 78 49 6e 76 61 6c 69 64 61 74 65    unixInvalidate
23ab0 53 75 70 70 6f 72 74 46 69 6c 65 73 28 70 46 69  SupportFiles(pFi
23ac0 6c 65 2c 20 73 6b 69 70 57 41 4c 29 3b 0a 20 20  le, skipWAL);.  
23ad0 7d 0a 20 20 0a 65 6e 64 5f 72 65 70 6c 61 63 65  }.  .end_replace
23ae0 5f 64 61 74 61 62 61 73 65 3a 0a 20 20 69 66 28  _database:.  if(
23af0 20 70 53 72 63 42 74 72 65 65 20 29 7b 0a 20 20   pSrcBtree ){.  
23b00 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28    sqlite3_close(
23b10 73 72 63 64 62 32 29 3b 0a 20 20 20 20 73 71 6c  srcdb2);.    sql
23b20 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
23b30 53 72 63 42 74 72 65 65 29 3b 0a 20 20 7d 0a 20  SrcBtree);.  }. 
23b40 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
23b50 65 61 76 65 28 73 72 63 64 62 2d 3e 6d 75 74 65  eave(srcdb->mute
23b60 78 29 3b 0a 20 20 69 66 28 20 69 73 44 73 74 43  x);.  if( isDstC
23b70 6f 72 72 75 70 74 20 29 7b 0a 20 20 20 20 73 71  orrupt ){.    sq
23b80 6c 69 74 65 33 64 65 6d 6f 5f 73 75 70 65 72 75  lite3demo_superu
23b90 6e 6c 6f 63 6b 5f 63 6f 72 72 75 70 74 28 69 64  nlock_corrupt(id
23ba0 2c 20 63 6f 72 72 75 70 74 44 73 74 46 69 6c 65  , corruptDstFile
23bb0 4c 6f 63 6b 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Lock);.  }else{.
23bc0 20 20 20 20 73 71 6c 69 74 65 33 64 65 6d 6f 5f      sqlite3demo_
23bd0 73 75 70 65 72 75 6e 6c 6f 63 6b 28 70 4c 6f 63  superunlock(pLoc
23be0 6b 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  k);.  }.  return
23bf0 20 72 63 3b 0a 7d 0a 23 64 65 66 69 6e 65 20 53   rc;.}.#define S
23c00 51 4c 49 54 45 5f 46 49 4c 45 5f 48 45 41 44 45  QLITE_FILE_HEADE
23c10 52 5f 4c 45 4e 20 31 36 0a 2f 2a 20 43 68 65 63  R_LEN 16./* Chec
23c20 6b 20 66 6f 72 20 61 20 63 6f 6e 66 6c 69 63 74  k for a conflict
23c30 69 6e 67 20 6c 6f 63 6b 2e 20 20 49 66 20 6f 6e  ing lock.  If on
23c40 65 20 69 73 20 66 6f 75 6e 64 2c 20 70 72 69 6e  e is found, prin
23c50 74 20 61 6e 20 74 68 69 73 0a 20 2a 2a 20 6f 6e  t an this. ** on
23c60 20 73 74 61 6e 64 61 72 64 20 6f 75 74 70 75 74   standard output
23c70 20 75 73 69 6e 67 20 74 68 65 20 66 6f 72 6d 61   using the forma
23c80 74 20 73 74 72 69 6e 67 20 67 69 76 65 6e 20 61  t string given a
23c90 6e 64 20 72 65 74 75 72 6e 20 31 2e 0a 20 2a 2a  nd return 1.. **
23ca0 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f   If there are no
23cb0 20 63 6f 6e 66 6c 69 63 74 69 6e 67 20 6c 6f 63   conflicting loc
23cc0 6b 73 2c 20 72 65 74 75 72 6e 20 30 2e 0a 20 2a  ks, return 0.. *
23cd0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
23ce0 78 49 73 4c 6f 63 6b 65 64 28 0a 20 20 70 69 64  xIsLocked(.  pid
23cf0 5f 74 20 70 69 64 2c 20 20 20 20 20 20 20 20 20  _t pid,         
23d00 20 20 20 2f 2a 20 50 49 44 20 74 6f 20 74 65 73     /* PID to tes
23d10 74 20 66 6f 72 20 6c 6f 63 6b 20 6f 77 6e 65 72  t for lock owner
23d20 20 2a 2f 0a 20 20 69 6e 74 20 68 2c 20 20 20 20   */.  int h,    
23d30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
23d40 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74  ile descriptor t
23d50 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 69 6e 74  o check */.  int
23d60 20 74 79 70 65 2c 20 20 20 20 20 20 20 20 20 20   type,          
23d70 20 20 20 2f 2a 20 46 5f 52 44 4c 43 4b 20 6f 72     /* F_RDLCK or
23d80 20 46 5f 57 52 4c 43 4b 20 2a 2f 0a 20 20 75 6e   F_WRLCK */.  un
23d90 73 69 67 6e 65 64 20 69 6e 74 20 69 4f 66 73 74  signed int iOfst
23da0 2c 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74  ,   /* First byt
23db0 65 20 6f 66 20 74 68 65 20 6c 6f 63 6b 20 2a 2f  e of the lock */
23dc0 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  .  unsigned int 
23dd0 69 43 6e 74 2c 20 20 20 20 2f 2a 20 4e 75 6d 62  iCnt,    /* Numb
23de0 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74  er of bytes in t
23df0 68 65 20 6c 6f 63 6b 20 72 61 6e 67 65 20 2a 2f  he lock range */
23e00 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
23e10 54 79 70 65 20 20 20 20 20 2f 2a 20 54 79 70 65  Type     /* Type
23e20 20 6f 66 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20   of lock */.){. 
23e30 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6b   struct flock lk
23e40 3b 0a 20 20 69 6e 74 20 65 72 72 3b 0a 20 20 0a  ;.  int err;.  .
23e50 20 20 6d 65 6d 73 65 74 28 26 6c 6b 2c 20 30 2c    memset(&lk, 0,
23e60 20 73 69 7a 65 6f 66 28 6c 6b 29 29 3b 0a 20 20   sizeof(lk));.  
23e70 6c 6b 2e 6c 5f 74 79 70 65 20 3d 20 74 79 70 65  lk.l_type = type
23e80 3b 0a 20 20 6c 6b 2e 6c 5f 77 68 65 6e 63 65 20  ;.  lk.l_whence 
23e90 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 6c 6b  = SEEK_SET;.  lk
23ea0 2e 6c 5f 73 74 61 72 74 20 3d 20 69 4f 66 73 74  .l_start = iOfst
23eb0 3b 0a 20 20 6c 6b 2e 6c 5f 6c 65 6e 20 3d 20 69  ;.  lk.l_len = i
23ec0 43 6e 74 3b 0a 20 20 0a 20 20 69 66 28 20 70 69  Cnt;.  .  if( pi
23ed0 64 21 3d 53 51 4c 49 54 45 5f 4c 4f 43 4b 53 54  d!=SQLITE_LOCKST
23ee0 41 54 45 5f 41 4e 59 50 49 44 20 29 7b 0a 23 69  ATE_ANYPID ){.#i
23ef0 66 6e 64 65 66 20 46 5f 47 45 54 4c 4b 50 49 44  fndef F_GETLKPID
23f00 0a 23 20 77 61 72 6e 69 6e 67 20 46 5f 47 45 54  .# warning F_GET
23f10 4c 4b 50 49 44 20 75 6e 64 65 66 69 6e 65 64 2c  LKPID undefined,
23f20 20 5f 73 71 6c 69 74 65 33 5f 6c 6f 63 6b 73 74   _sqlite3_lockst
23f30 61 74 65 20 66 61 6c 6c 69 6e 67 20 62 61 63 6b  ate falling back
23f40 20 74 6f 20 46 5f 47 45 54 4c 4b 0a 20 20 20 20   to F_GETLK.    
23f50 65 72 72 20 3d 20 66 63 6e 74 6c 28 68 2c 20 46  err = fcntl(h, F
23f60 5f 47 45 54 4c 4b 2c 20 26 6c 6b 29 3b 0a 23 65  _GETLK, &lk);.#e
23f70 6c 73 65 0a 20 20 20 20 6c 6b 2e 6c 5f 70 69 64  lse.    lk.l_pid
23f80 20 3d 20 70 69 64 3b 0a 20 20 20 20 65 72 72 20   = pid;.    err 
23f90 3d 20 66 63 6e 74 6c 28 68 2c 20 46 5f 47 45 54  = fcntl(h, F_GET
23fa0 4c 4b 50 49 44 2c 20 26 6c 6b 29 3b 0a 23 65 6e  LKPID, &lk);.#en
23fb0 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  dif.  }else{.   
23fc0 20 65 72 72 20 3d 20 66 63 6e 74 6c 28 68 2c 20   err = fcntl(h, 
23fd0 46 5f 47 45 54 4c 4b 2c 20 26 6c 6b 29 3b 0a 20  F_GETLK, &lk);. 
23fe0 20 7d 0a 20 20 0a 20 20 69 66 28 20 65 72 72 3d   }.  .  if( err=
23ff0 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 66 70 72  =(-1) ){.    fpr
24000 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 66 63  intf(stderr, "fc
24010 6e 74 6c 28 25 64 29 20 66 61 69 6c 65 64 3a 20  ntl(%d) failed: 
24020 65 72 72 6e 6f 3d 25 64 5c 6e 22 2c 20 68 2c 20  errno=%d\n", h, 
24030 65 72 72 6e 6f 29 3b 0a 20 20 20 20 72 65 74 75  errno);.    retu
24040 72 6e 20 2d 31 3b 0a 20 20 7d 0a 20 20 0a 20 20  rn -1;.  }.  .  
24050 69 66 28 20 6c 6b 2e 6c 5f 74 79 70 65 21 3d 46  if( lk.l_type!=F
24060 5f 55 4e 4c 43 4b 20 26 26 20 28 70 69 64 3d 3d  _UNLCK && (pid==
24070 53 51 4c 49 54 45 5f 4c 4f 43 4b 53 54 41 54 45  SQLITE_LOCKSTATE
24080 5f 41 4e 59 50 49 44 20 7c 7c 20 6c 6b 2e 6c 5f  _ANYPID || lk.l_
24090 70 69 64 3d 3d 70 69 64 29 20 29 7b 0a 23 69 66  pid==pid) ){.#if
240a0 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
240b0 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64  .    fprintf(std
240c0 65 72 72 2c 20 22 25 73 20 6c 6f 63 6b 20 68 65  err, "%s lock he
240d0 6c 64 20 62 79 20 25 64 5c 6e 22 2c 20 7a 54 79  ld by %d\n", zTy
240e0 70 65 2c 20 28 69 6e 74 29 6c 6b 2e 6c 5f 70 69  pe, (int)lk.l_pi
240f0 64 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 72  d);.#endif.    r
24100 65 74 75 72 6e 20 31 3b 0a 20 20 7d 20 0a 20 20  eturn 1;.  } .  
24110 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 73 74 61  return 0;.}..sta
24120 74 69 63 20 69 6e 74 20 75 6e 69 78 4c 6f 63 6b  tic int unixLock
24130 73 74 61 74 65 50 69 64 28 75 6e 69 78 46 69 6c  statePid(unixFil
24140 65 20 2a 2c 20 70 69 64 5f 74 2c 20 69 6e 74 20  e *, pid_t, int 
24150 2a 29 3b 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 28  *);..#endif /* (
24160 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
24170 50 4c 45 5f 53 50 49 3e 30 29 20 26 26 20 64 65  PLE_SPI>0) && de
24180 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
24190 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 2a   */.../*.** If *
241a0 70 41 72 67 20 69 73 20 69 6e 69 74 69 61 6c 6c  pArg is initiall
241b0 79 20 6e 65 67 61 74 69 76 65 20 74 68 65 6e 20  y negative then 
241c0 74 68 69 73 20 69 73 20 61 20 71 75 65 72 79 2e  this is a query.
241d0 20 20 53 65 74 20 2a 70 41 72 67 20 74 6f 0a 2a    Set *pArg to.*
241e0 2a 20 31 20 6f 72 20 30 20 64 65 70 65 6e 64 69  * 1 or 0 dependi
241f0 6e 67 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72  ng on whether or
24200 20 6e 6f 74 20 62 69 74 20 6d 61 73 6b 20 6f 66   not bit mask of
24210 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67   pFile->ctrlFlag
24220 73 20 69 73 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20  s is set..**.** 
24230 49 66 20 2a 70 41 72 67 20 69 73 20 30 20 6f 72  If *pArg is 0 or
24240 20 31 2c 20 74 68 65 6e 20 63 6c 65 61 72 20 6f   1, then clear o
24250 72 20 73 65 74 20 74 68 65 20 6d 61 73 6b 20 62  r set the mask b
24260 69 74 20 6f 66 20 70 46 69 6c 65 2d 3e 63 74 72  it of pFile->ctr
24270 6c 46 6c 61 67 73 2e 0a 2a 2f 0a 73 74 61 74 69  lFlags..*/.stati
24280 63 20 76 6f 69 64 20 75 6e 69 78 4d 6f 64 65 42  c void unixModeB
24290 69 74 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  it(unixFile *pFi
242a0 6c 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  le, unsigned cha
242b0 72 20 6d 61 73 6b 2c 20 69 6e 74 20 2a 70 41 72  r mask, int *pAr
242c0 67 29 7b 0a 20 20 69 66 28 20 2a 70 41 72 67 3c  g){.  if( *pArg<
242d0 30 20 29 7b 0a 20 20 20 20 2a 70 41 72 67 20 3d  0 ){.    *pArg =
242e0 20 28 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61   (pFile->ctrlFla
242f0 67 73 20 26 20 6d 61 73 6b 29 21 3d 30 3b 0a 20  gs & mask)!=0;. 
24300 20 7d 65 6c 73 65 20 69 66 28 20 28 2a 70 41 72   }else if( (*pAr
24310 67 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 46 69  g)==0 ){.    pFi
24320 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 3d  le->ctrlFlags &=
24330 20 7e 6d 61 73 6b 3b 0a 20 20 7d 65 6c 73 65 7b   ~mask;.  }else{
24340 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c  .    pFile->ctrl
24350 46 6c 61 67 73 20 7c 3d 20 6d 61 73 6b 3b 0a 20  Flags |= mask;. 
24360 20 7d 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64   }.}../* Forward
24370 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 2a 2f 0a   declaration */.
24380 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 47  static int unixG
24390 65 74 54 65 6d 70 6e 61 6d 65 28 69 6e 74 20 6e  etTempname(int n
243a0 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29  Buf, char *zBuf)
243b0 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6e 66 6f 72 6d 61  ;../*.** Informa
243c0 74 69 6f 6e 20 61 6e 64 20 63 6f 6e 74 72 6f 6c  tion and control
243d0 20 6f 66 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65   of an open file
243e0 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74   handle..*/.stat
243f0 69 63 20 69 6e 74 20 75 6e 69 78 46 69 6c 65 43  ic int unixFileC
24400 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66  ontrol(sqlite3_f
24410 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 6f 70 2c  ile *id, int op,
24420 20 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20   void *pArg){.  
24430 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
24440 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
24450 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b  .  switch( op ){
24460 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 6c  .#if defined(__l
24470 69 6e 75 78 5f 5f 29 20 26 26 20 64 65 66 69 6e  inux__) && defin
24480 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
24490 5f 42 41 54 43 48 5f 41 54 4f 4d 49 43 5f 57 52  _BATCH_ATOMIC_WR
244a0 49 54 45 29 0a 20 20 20 20 63 61 73 65 20 53 51  ITE).    case SQ
244b0 4c 49 54 45 5f 46 43 4e 54 4c 5f 42 45 47 49 4e  LITE_FCNTL_BEGIN
244c0 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 3a 20 7b  _ATOMIC_WRITE: {
244d0 0a 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20  .      int rc = 
244e0 6f 73 49 6f 63 74 6c 28 70 46 69 6c 65 2d 3e 68  osIoctl(pFile->h
244f0 2c 20 46 32 46 53 5f 49 4f 43 5f 53 54 41 52 54  , F2FS_IOC_START
24500 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 29 3b 0a  _ATOMIC_WRITE);.
24510 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 20        return rc 
24520 3f 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42  ? SQLITE_IOERR_B
24530 45 47 49 4e 5f 41 54 4f 4d 49 43 20 3a 20 53 51  EGIN_ATOMIC : SQ
24540 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
24550 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
24560 43 4e 54 4c 5f 43 4f 4d 4d 49 54 5f 41 54 4f 4d  CNTL_COMMIT_ATOM
24570 49 43 5f 57 52 49 54 45 3a 20 7b 0a 20 20 20 20  IC_WRITE: {.    
24580 20 20 69 6e 74 20 72 63 20 3d 20 6f 73 49 6f 63    int rc = osIoc
24590 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46 32 46  tl(pFile->h, F2F
245a0 53 5f 49 4f 43 5f 43 4f 4d 4d 49 54 5f 41 54 4f  S_IOC_COMMIT_ATO
245b0 4d 49 43 5f 57 52 49 54 45 29 3b 0a 20 20 20 20  MIC_WRITE);.    
245c0 20 20 72 65 74 75 72 6e 20 72 63 20 3f 20 53 51    return rc ? SQ
245d0 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4f 4d 4d 49  LITE_IOERR_COMMI
245e0 54 5f 41 54 4f 4d 49 43 20 3a 20 53 51 4c 49 54  T_ATOMIC : SQLIT
245f0 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
24600 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
24610 4c 5f 52 4f 4c 4c 42 41 43 4b 5f 41 54 4f 4d 49  L_ROLLBACK_ATOMI
24620 43 5f 57 52 49 54 45 3a 20 7b 0a 20 20 20 20 20  C_WRITE: {.     
24630 20 69 6e 74 20 72 63 20 3d 20 6f 73 49 6f 63 74   int rc = osIoct
24640 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46 32 46 53  l(pFile->h, F2FS
24650 5f 49 4f 43 5f 41 42 4f 52 54 5f 56 4f 4c 41 54  _IOC_ABORT_VOLAT
24660 49 4c 45 5f 57 52 49 54 45 29 3b 0a 20 20 20 20  ILE_WRITE);.    
24670 20 20 72 65 74 75 72 6e 20 72 63 20 3f 20 53 51    return rc ? SQ
24680 4c 49 54 45 5f 49 4f 45 52 52 5f 52 4f 4c 4c 42  LITE_IOERR_ROLLB
24690 41 43 4b 5f 41 54 4f 4d 49 43 20 3a 20 53 51 4c  ACK_ATOMIC : SQL
246a0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 23 65  ITE_OK;.    }.#e
246b0 6e 64 69 66 20 2f 2a 20 5f 5f 6c 69 6e 75 78 5f  ndif /* __linux_
246c0 5f 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42  _ && SQLITE_ENAB
246d0 4c 45 5f 42 41 54 43 48 5f 41 54 4f 4d 49 43 5f  LE_BATCH_ATOMIC_
246e0 57 52 49 54 45 20 2a 2f 0a 0a 20 20 20 20 63 61  WRITE */..    ca
246f0 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
24700 4c 4f 43 4b 53 54 41 54 45 3a 20 7b 0a 20 20 20  LOCKSTATE: {.   
24710 20 20 20 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d     *(int*)pArg =
24720 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
24730 6b 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  k;.      return 
24740 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
24750 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
24760 5f 46 43 4e 54 4c 5f 4c 41 53 54 5f 45 52 52 4e  _FCNTL_LAST_ERRN
24770 4f 3a 20 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74  O: {.      *(int
24780 2a 29 70 41 72 67 20 3d 20 70 46 69 6c 65 2d 3e  *)pArg = pFile->
24790 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20  lastErrno;.     
247a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
247b0 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  K;.    }.    cas
247c0 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 43  e SQLITE_FCNTL_C
247d0 48 55 4e 4b 5f 53 49 5a 45 3a 20 7b 0a 20 20 20  HUNK_SIZE: {.   
247e0 20 20 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e     pFile->szChun
247f0 6b 20 3d 20 2a 28 69 6e 74 20 2a 29 70 41 72 67  k = *(int *)pArg
24800 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
24810 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
24820 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
24830 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 3a  FCNTL_SIZE_HINT:
24840 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 3b   {.      int rc;
24850 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49  .      SimulateI
24860 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b  OErrorBenign(1);
24870 0a 20 20 20 20 20 20 72 63 20 3d 20 66 63 6e 74  .      rc = fcnt
24880 6c 53 69 7a 65 48 69 6e 74 28 70 46 69 6c 65 2c  lSizeHint(pFile,
24890 20 2a 28 69 36 34 20 2a 29 70 41 72 67 29 3b 0a   *(i64 *)pArg);.
248a0 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f        SimulateIO
248b0 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a  ErrorBenign(0);.
248c0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
248d0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
248e0 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 45 52  SQLITE_FCNTL_PER
248f0 53 49 53 54 5f 57 41 4c 3a 20 7b 0a 20 20 20 20  SIST_WAL: {.    
24900 20 20 75 6e 69 78 4d 6f 64 65 42 69 74 28 70 46    unixModeBit(pF
24910 69 6c 65 2c 20 55 4e 49 58 46 49 4c 45 5f 50 45  ile, UNIXFILE_PE
24920 52 53 49 53 54 5f 57 41 4c 2c 20 28 69 6e 74 2a  RSIST_WAL, (int*
24930 29 70 41 72 67 29 3b 0a 20 20 20 20 20 20 72 65  )pArg);.      re
24940 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
24950 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
24960 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 4f 57 45  QLITE_FCNTL_POWE
24970 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 3a  RSAFE_OVERWRITE:
24980 20 7b 0a 20 20 20 20 20 20 75 6e 69 78 4d 6f 64   {.      unixMod
24990 65 42 69 74 28 70 46 69 6c 65 2c 20 55 4e 49 58  eBit(pFile, UNIX
249a0 46 49 4c 45 5f 50 53 4f 57 2c 20 28 69 6e 74 2a  FILE_PSOW, (int*
249b0 29 70 41 72 67 29 3b 0a 20 20 20 20 20 20 72 65  )pArg);.      re
249c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
249d0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
249e0 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 56 46 53 4e  QLITE_FCNTL_VFSN
249f0 41 4d 45 3a 20 7b 0a 20 20 20 20 20 20 2a 28 63  AME: {.      *(c
24a00 68 61 72 2a 2a 29 70 41 72 67 20 3d 20 73 71 6c  har**)pArg = sql
24a10 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73  ite3_mprintf("%s
24a20 22 2c 20 70 46 69 6c 65 2d 3e 70 56 66 73 2d 3e  ", pFile->pVfs->
24a30 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65  zName);.      re
24a40 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
24a50 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
24a60 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 54 45 4d 50  QLITE_FCNTL_TEMP
24a70 46 49 4c 45 4e 41 4d 45 3a 20 7b 0a 20 20 20 20  FILENAME: {.    
24a80 20 20 63 68 61 72 20 2a 7a 54 46 69 6c 65 20 3d    char *zTFile =
24a90 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36   sqlite3_malloc6
24aa0 34 28 20 70 46 69 6c 65 2d 3e 70 56 66 73 2d 3e  4( pFile->pVfs->
24ab0 6d 78 50 61 74 68 6e 61 6d 65 20 29 3b 0a 20 20  mxPathname );.  
24ac0 20 20 20 20 69 66 28 20 7a 54 46 69 6c 65 20 29      if( zTFile )
24ad0 7b 0a 20 20 20 20 20 20 20 20 75 6e 69 78 47 65  {.        unixGe
24ae0 74 54 65 6d 70 6e 61 6d 65 28 70 46 69 6c 65 2d  tTempname(pFile-
24af0 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d  >pVfs->mxPathnam
24b00 65 2c 20 7a 54 46 69 6c 65 29 3b 0a 20 20 20 20  e, zTFile);.    
24b10 20 20 20 20 2a 28 63 68 61 72 2a 2a 29 70 41 72      *(char**)pAr
24b20 67 20 3d 20 7a 54 46 69 6c 65 3b 0a 20 20 20 20  g = zTFile;.    
24b30 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
24b40 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
24b50 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
24b60 45 5f 46 43 4e 54 4c 5f 48 41 53 5f 4d 4f 56 45  E_FCNTL_HAS_MOVE
24b70 44 3a 20 7b 0a 20 20 20 20 20 20 2a 28 69 6e 74  D: {.      *(int
24b80 2a 29 70 41 72 67 20 3d 20 66 69 6c 65 48 61 73  *)pArg = fileHas
24b90 4d 6f 76 65 64 28 70 46 69 6c 65 29 3b 0a 20 20  Moved(pFile);.  
24ba0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
24bb0 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 23 69 66 20  E_OK;.    }.#if 
24bc0 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
24bd0 53 49 5a 45 3e 30 0a 20 20 20 20 63 61 73 65 20  SIZE>0.    case 
24be0 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41  SQLITE_FCNTL_MMA
24bf0 50 5f 53 49 5a 45 3a 20 7b 0a 20 20 20 20 20 20  P_SIZE: {.      
24c00 69 36 34 20 6e 65 77 4c 69 6d 69 74 20 3d 20 2a  i64 newLimit = *
24c10 28 69 36 34 2a 29 70 41 72 67 3b 0a 20 20 20 20  (i64*)pArg;.    
24c20 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
24c30 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 69 66 28 20  E_OK;.      if( 
24c40 6e 65 77 4c 69 6d 69 74 3e 73 71 6c 69 74 65 33  newLimit>sqlite3
24c50 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 78 4d  GlobalConfig.mxM
24c60 6d 61 70 20 29 7b 0a 20 20 20 20 20 20 20 20 6e  map ){.        n
24c70 65 77 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74 65  ewLimit = sqlite
24c80 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 78  3GlobalConfig.mx
24c90 4d 6d 61 70 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  Mmap;.      }.. 
24ca0 20 20 20 20 20 2f 2a 20 54 68 65 20 76 61 6c 75       /* The valu
24cb0 65 20 6f 66 20 6e 65 77 4c 69 6d 69 74 20 6d 61  e of newLimit ma
24cc0 79 20 62 65 20 65 76 65 6e 74 75 61 6c 6c 79 20  y be eventually 
24cd0 63 61 73 74 20 74 6f 20 28 73 69 7a 65 5f 74 29  cast to (size_t)
24ce0 20 61 6e 64 20 70 61 73 73 65 64 0a 20 20 20 20   and passed.    
24cf0 20 20 2a 2a 20 74 6f 20 6d 6d 61 70 28 29 2e 20    ** to mmap(). 
24d00 52 65 73 74 72 69 63 74 20 69 74 73 20 76 61 6c  Restrict its val
24d10 75 65 20 74 6f 20 32 47 42 20 69 66 20 28 73 69  ue to 2GB if (si
24d20 7a 65 5f 74 29 20 69 73 20 6e 6f 74 20 61 74 20  ze_t) is not at 
24d30 6c 65 61 73 74 20 61 0a 20 20 20 20 20 20 2a 2a  least a.      **
24d40 20 36 34 2d 62 69 74 20 74 79 70 65 2e 20 2a 2f   64-bit type. */
24d50 0a 20 20 20 20 20 20 69 66 28 20 6e 65 77 4c 69  .      if( newLi
24d60 6d 69 74 3e 30 20 26 26 20 73 69 7a 65 6f 66 28  mit>0 && sizeof(
24d70 73 69 7a 65 5f 74 29 3c 38 20 29 7b 0a 20 20 20  size_t)<8 ){.   
24d80 20 20 20 20 20 6e 65 77 4c 69 6d 69 74 20 3d 20       newLimit = 
24d90 28 6e 65 77 4c 69 6d 69 74 20 26 20 30 78 37 46  (newLimit & 0x7F
24da0 46 46 46 46 46 46 29 3b 0a 20 20 20 20 20 20 7d  FFFFFF);.      }
24db0 0a 0a 20 20 20 20 20 20 2a 28 69 36 34 2a 29 70  ..      *(i64*)p
24dc0 41 72 67 20 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61  Arg = pFile->mma
24dd0 70 53 69 7a 65 4d 61 78 3b 0a 20 20 20 20 20 20  pSizeMax;.      
24de0 69 66 28 20 6e 65 77 4c 69 6d 69 74 3e 3d 30 20  if( newLimit>=0 
24df0 26 26 20 6e 65 77 4c 69 6d 69 74 21 3d 70 46 69  && newLimit!=pFi
24e00 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20  le->mmapSizeMax 
24e10 26 26 20 70 46 69 6c 65 2d 3e 6e 46 65 74 63 68  && pFile->nFetch
24e20 4f 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Out==0 ){.      
24e30 20 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a    pFile->mmapSiz
24e40 65 4d 61 78 20 3d 20 6e 65 77 4c 69 6d 69 74 3b  eMax = newLimit;
24e50 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 46 69  .        if( pFi
24e60 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 3e 30 20 29  le->mmapSize>0 )
24e70 7b 0a 20 20 20 20 20 20 20 20 20 20 75 6e 69 78  {.          unix
24e80 55 6e 6d 61 70 66 69 6c 65 28 70 46 69 6c 65 29  Unmapfile(pFile)
24e90 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
24ea0 20 75 6e 69 78 4d 61 70 66 69 6c 65 28 70 46 69   unixMapfile(pFi
24eb0 6c 65 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 20  le, -1);.       
24ec0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
24ed0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
24ee0 7d 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  }.#endif.#ifdef 
24ef0 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 20  SQLITE_DEBUG.   
24f00 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 63 61   /* The pager ca
24f10 6c 6c 73 20 74 68 69 73 20 6d 65 74 68 6f 64 20  lls this method 
24f20 74 6f 20 73 69 67 6e 61 6c 20 74 68 61 74 20 69  to signal that i
24f30 74 20 68 61 73 20 64 6f 6e 65 0a 20 20 20 20 2a  t has done.    *
24f40 2a 20 61 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64  * a rollback and
24f50 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61   that the databa
24f60 73 65 20 69 73 20 74 68 65 72 65 66 6f 72 65 20  se is therefore 
24f70 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 0a 20 20  unchanged and.  
24f80 20 20 2a 2a 20 69 74 20 68 65 6e 63 65 20 69 74    ** it hence it
24f90 20 69 73 20 4f 4b 20 66 6f 72 20 74 68 65 20 74   is OK for the t
24fa0 72 61 6e 73 61 63 74 69 6f 6e 20 63 68 61 6e 67  ransaction chang
24fb0 65 20 63 6f 75 6e 74 65 72 20 74 6f 20 62 65 0a  e counter to be.
24fc0 20 20 20 20 2a 2a 20 75 6e 63 68 61 6e 67 65 64      ** unchanged
24fd0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
24fe0 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44  e SQLITE_FCNTL_D
24ff0 42 5f 55 4e 43 48 41 4e 47 45 44 3a 20 7b 0a 20  B_UNCHANGED: {. 
25000 20 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65 2a       ((unixFile*
25010 29 69 64 29 2d 3e 64 62 55 70 64 61 74 65 20 3d  )id)->dbUpdate =
25020 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   0;.      return
25030 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
25040 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  }.#endif.#if SQL
25050 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
25060 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69  NG_STYLE && defi
25070 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20  ned(__APPLE__). 
25080 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
25090 43 4e 54 4c 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f  CNTL_SET_LOCKPRO
250a0 58 59 46 49 4c 45 3a 0a 20 20 20 20 63 61 73 65  XYFILE:.    case
250b0 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 47 45   SQLITE_FCNTL_GE
250c0 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 3a  T_LOCKPROXYFILE:
250d0 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   {.      return 
250e0 70 72 6f 78 79 46 69 6c 65 43 6f 6e 74 72 6f 6c  proxyFileControl
250f0 28 69 64 2c 6f 70 2c 70 41 72 67 29 3b 0a 20 20  (id,op,pArg);.  
25100 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
25110 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
25120 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66  ING_STYLE && def
25130 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
25140 2a 2f 0a 23 69 66 20 28 53 51 4c 49 54 45 5f 45  */.#if (SQLITE_E
25150 4e 41 42 4c 45 5f 41 50 50 4c 45 5f 53 50 49 3e  NABLE_APPLE_SPI>
25160 30 29 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f  0) && defined(__
25170 41 50 50 4c 45 5f 5f 29 0a 20 20 20 20 63 61 73  APPLE__).    cas
25180 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 54  e SQLITE_FCNTL_T
25190 52 55 4e 43 41 54 45 5f 44 41 54 41 42 41 53 45  RUNCATE_DATABASE
251a0 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  : {.      return
251b0 20 75 6e 69 78 54 72 75 6e 63 61 74 65 44 61 74   unixTruncateDat
251c0 61 62 61 73 65 28 70 46 69 6c 65 2c 20 28 70 41  abase(pFile, (pA
251d0 72 67 20 3f 20 28 2a 28 69 6e 74 20 2a 29 70 41  rg ? (*(int *)pA
251e0 72 67 29 20 3a 20 30 29 29 3b 0a 20 20 20 20 7d  rg) : 0));.    }
251f0 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
25200 5f 46 43 4e 54 4c 5f 52 45 50 4c 41 43 45 5f 44  _FCNTL_REPLACE_D
25210 41 54 41 42 41 53 45 3a 20 7b 0a 20 20 20 20 20  ATABASE: {.     
25220 20 72 65 74 75 72 6e 20 75 6e 69 78 52 65 70 6c   return unixRepl
25230 61 63 65 44 61 74 61 62 61 73 65 28 70 46 69 6c  aceDatabase(pFil
25240 65 2c 20 28 73 71 6c 69 74 65 33 20 2a 29 70 41  e, (sqlite3 *)pA
25250 72 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  rg);.    }.    c
25260 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ase SQLITE_FCNTL
25270 5f 4c 4f 43 4b 53 54 41 54 45 5f 50 49 44 3a 20  _LOCKSTATE_PID: 
25280 7b 0a 20 20 20 20 20 20 4c 6f 63 6b 73 74 61 74  {.      Lockstat
25290 65 50 49 44 20 2a 70 4c 6f 63 6b 73 74 61 74 65  ePID *pLockstate
252a0 3b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 3b 0a  ;.      int rc;.
252b0 20 20 20 20 20 20 0a 20 20 20 20 20 20 69 66 28        .      if(
252c0 20 70 41 72 67 3d 3d 4e 55 4c 4c 20 29 7b 0a 20   pArg==NULL ){. 
252d0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
252e0 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20 20  LITE_MISUSE;.   
252f0 20 20 20 7d 0a 20 20 20 20 20 20 70 4c 6f 63 6b     }.      pLock
25300 73 74 61 74 65 20 3d 20 28 4c 6f 63 6b 73 74 61  state = (Locksta
25310 74 65 50 49 44 20 2a 29 70 41 72 67 3b 0a 20 20  tePID *)pArg;.  
25320 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 63      rc = unixLoc
25330 6b 73 74 61 74 65 50 69 64 28 70 46 69 6c 65 2c  kstatePid(pFile,
25340 20 70 4c 6f 63 6b 73 74 61 74 65 2d 3e 70 69 64   pLockstate->pid
25350 2c 20 26 28 70 4c 6f 63 6b 73 74 61 74 65 2d 3e  , &(pLockstate->
25360 73 74 61 74 65 29 29 3b 0a 20 20 20 20 20 20 72  state));.      r
25370 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
25380 20 20 20 20 20 20 0a 23 65 6e 64 69 66 20 2f 2a        .#endif /*
25390 20 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f   (SQLITE_ENABLE_
253a0 41 50 50 4c 45 5f 53 50 49 3e 30 29 20 26 26 20  APPLE_SPI>0) && 
253b0 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
253c0 5f 29 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75  _) */.  }.  retu
253d0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55  rn SQLITE_NOTFOU
253e0 4e 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  ND;.}../*.** If 
253f0 70 46 64 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  pFd->sectorSize 
25400 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 77 68 65 6e  is non-zero when
25410 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
25420 73 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20  s called, it is 
25430 61 0a 2a 2a 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65  a.** no-op. Othe
25440 72 77 69 73 65 2c 20 74 68 65 20 76 61 6c 75 65  rwise, the value
25450 73 20 6f 66 20 70 46 64 2d 3e 73 65 63 74 6f 72  s of pFd->sector
25460 53 69 7a 65 20 61 6e 64 20 0a 2a 2a 20 70 46 64  Size and .** pFd
25470 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63 74 65  ->deviceCharacte
25480 72 69 73 74 69 63 73 20 61 72 65 20 73 65 74 20  ristics are set 
25490 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65  according to the
254a0 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 0a 2a 2a   file-system .**
254b0 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63 73   characteristics
254c0 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 61  . .**.** There a
254d0 72 65 20 74 77 6f 20 76 65 72 73 69 6f 6e 73 20  re two versions 
254e0 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
254f0 2e 20 4f 6e 65 20 66 6f 72 20 51 4e 58 20 61 6e  . One for QNX an
25500 64 20 6f 6e 65 20 66 6f 72 20 61 6c 6c 0a 2a 2a  d one for all.**
25510 20 6f 74 68 65 72 20 73 79 73 74 65 6d 73 2e 0a   other systems..
25520 2a 2f 0a 23 69 66 6e 64 65 66 20 5f 5f 51 4e 58  */.#ifndef __QNX
25530 4e 54 4f 5f 5f 0a 73 74 61 74 69 63 20 76 6f 69  NTO__.static voi
25540 64 20 73 65 74 44 65 76 69 63 65 43 68 61 72 61  d setDeviceChara
25550 63 74 65 72 69 73 74 69 63 73 28 75 6e 69 78 46  cteristics(unixF
25560 69 6c 65 20 2a 70 46 64 29 7b 0a 20 20 61 73 73  ile *pFd){.  ass
25570 65 72 74 28 20 70 46 64 2d 3e 64 65 76 69 63 65  ert( pFd->device
25580 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 3d  Characteristics=
25590 3d 30 20 7c 7c 20 70 46 64 2d 3e 73 65 63 74 6f  =0 || pFd->secto
255a0 72 53 69 7a 65 21 3d 30 20 29 3b 0a 20 20 69 66  rSize!=0 );.  if
255b0 28 20 70 46 64 2d 3e 73 65 63 74 6f 72 53 69 7a  ( pFd->sectorSiz
255c0 65 3d 3d 30 20 29 7b 0a 23 69 66 20 64 65 66 69  e==0 ){.#if defi
255d0 6e 65 64 28 5f 5f 6c 69 6e 75 78 5f 5f 29 20 26  ned(__linux__) &
255e0 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
255f0 5f 45 4e 41 42 4c 45 5f 42 41 54 43 48 5f 41 54  _ENABLE_BATCH_AT
25600 4f 4d 49 43 5f 57 52 49 54 45 29 0a 20 20 20 20  OMIC_WRITE).    
25610 69 6e 74 20 72 65 73 3b 0a 20 20 20 20 75 33 32  int res;.    u32
25620 20 66 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20   f = 0;..    /* 
25630 43 68 65 63 6b 20 66 6f 72 20 73 75 70 70 6f 72  Check for suppor
25640 74 20 66 6f 72 20 46 32 46 53 20 61 74 6f 6d 69  t for F2FS atomi
25650 63 20 62 61 74 63 68 20 77 72 69 74 65 73 2e 20  c batch writes. 
25660 2a 2f 0a 20 20 20 20 72 65 73 20 3d 20 6f 73 49  */.    res = osI
25670 6f 63 74 6c 28 70 46 64 2d 3e 68 2c 20 46 32 46  octl(pFd->h, F2F
25680 53 5f 49 4f 43 5f 47 45 54 5f 46 45 41 54 55 52  S_IOC_GET_FEATUR
25690 45 53 2c 20 26 66 29 3b 0a 20 20 20 20 69 66 28  ES, &f);.    if(
256a0 20 72 65 73 3d 3d 30 20 26 26 20 28 66 20 26 20   res==0 && (f & 
256b0 46 32 46 53 5f 46 45 41 54 55 52 45 5f 41 54 4f  F2FS_FEATURE_ATO
256c0 4d 49 43 5f 57 52 49 54 45 29 20 29 7b 0a 20 20  MIC_WRITE) ){.  
256d0 20 20 20 20 70 46 64 2d 3e 64 65 76 69 63 65 43      pFd->deviceC
256e0 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20 3d  haracteristics =
256f0 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 42 41   SQLITE_IOCAP_BA
25700 54 43 48 5f 41 54 4f 4d 49 43 3b 0a 20 20 20 20  TCH_ATOMIC;.    
25710 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 5f 5f 6c 69  }.#endif /* __li
25720 6e 75 78 5f 5f 20 26 26 20 53 51 4c 49 54 45 5f  nux__ && SQLITE_
25730 45 4e 41 42 4c 45 5f 42 41 54 43 48 5f 41 54 4f  ENABLE_BATCH_ATO
25740 4d 49 43 5f 57 52 49 54 45 20 2a 2f 0a 0a 20 20  MIC_WRITE */..  
25750 20 20 2f 2a 20 53 65 74 20 74 68 65 20 50 4f 57    /* Set the POW
25760 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45  ERSAFE_OVERWRITE
25770 20 66 6c 61 67 20 69 66 20 72 65 71 75 65 73 74   flag if request
25780 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  ed. */.    if( p
25790 46 64 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20  Fd->ctrlFlags & 
257a0 55 4e 49 58 46 49 4c 45 5f 50 53 4f 57 20 29 7b  UNIXFILE_PSOW ){
257b0 0a 20 20 20 20 20 20 70 46 64 2d 3e 64 65 76 69  .      pFd->devi
257c0 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
257d0 73 20 7c 3d 20 53 51 4c 49 54 45 5f 49 4f 43 41  s |= SQLITE_IOCA
257e0 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52  P_POWERSAFE_OVER
257f0 57 52 49 54 45 3b 0a 20 20 20 20 7d 0a 0a 20 20  WRITE;.    }..  
25800 20 20 70 46 64 2d 3e 73 65 63 74 6f 72 53 69 7a    pFd->sectorSiz
25810 65 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55  e = SQLITE_DEFAU
25820 4c 54 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a  LT_SECTOR_SIZE;.
25830 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 69 6e 63    }.}.#else.#inc
25840 6c 75 64 65 20 3c 73 79 73 2f 64 63 6d 64 5f 62  lude <sys/dcmd_b
25850 6c 6b 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  lk.h>.#include <
25860 73 79 73 2f 73 74 61 74 76 66 73 2e 68 3e 0a 73  sys/statvfs.h>.s
25870 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 44 65  tatic void setDe
25880 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
25890 69 63 73 28 75 6e 69 78 46 69 6c 65 20 2a 70 46  ics(unixFile *pF
258a0 69 6c 65 29 7b 0a 20 20 69 66 28 20 70 46 69 6c  ile){.  if( pFil
258b0 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 3d  e->sectorSize ==
258c0 20 30 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74   0 ){.    struct
258d0 20 73 74 61 74 76 66 73 20 66 73 49 6e 66 6f 3b   statvfs fsInfo;
258e0 0a 20 20 20 20 20 20 20 0a 20 20 20 20 2f 2a 20  .       .    /* 
258f0 53 65 74 20 64 65 66 61 75 6c 74 73 20 66 6f 72  Set defaults for
25900 20 6e 6f 6e 2d 73 75 70 70 6f 72 74 65 64 20 66   non-supported f
25910 69 6c 65 73 79 73 74 65 6d 73 20 2a 2f 0a 20 20  ilesystems */.  
25920 20 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53    pFile->sectorS
25930 69 7a 65 20 3d 20 53 51 4c 49 54 45 5f 44 45 46  ize = SQLITE_DEF
25940 41 55 4c 54 5f 53 45 43 54 4f 52 5f 53 49 5a 45  AULT_SECTOR_SIZE
25950 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 64 65 76  ;.    pFile->dev
25960 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
25970 63 73 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  cs = 0;.    if( 
25980 66 73 74 61 74 76 66 73 28 70 46 69 6c 65 2d 3e  fstatvfs(pFile->
25990 68 2c 20 26 66 73 49 6e 66 6f 29 20 3d 3d 20 2d  h, &fsInfo) == -
259a0 31 20 29 20 7b 0a 20 20 20 20 20 20 72 65 74 75  1 ) {.      retu
259b0 72 6e 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72  rn pFile->sector
259c0 53 69 7a 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  Size;.    }..   
259d0 20 69 66 28 20 21 73 74 72 63 6d 70 28 66 73 49   if( !strcmp(fsI
259e0 6e 66 6f 2e 66 5f 62 61 73 65 74 79 70 65 2c 20  nfo.f_basetype, 
259f0 22 74 6d 70 22 29 20 29 20 7b 0a 20 20 20 20 20  "tmp") ) {.     
25a00 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69   pFile->sectorSi
25a10 7a 65 20 3d 20 66 73 49 6e 66 6f 2e 66 5f 62 73  ze = fsInfo.f_bs
25a20 69 7a 65 3b 0a 20 20 20 20 20 20 70 46 69 6c 65  ize;.      pFile
25a30 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63 74 65  ->deviceCharacte
25a40 72 69 73 74 69 63 73 20 3d 0a 20 20 20 20 20 20  ristics =.      
25a50 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41    SQLITE_IOCAP_A
25a60 54 4f 4d 49 43 34 4b 20 7c 20 20 20 20 20 20 20  TOMIC4K |       
25a70 2f 2a 20 41 6c 6c 20 72 61 6d 20 66 69 6c 65 73  /* All ram files
25a80 79 73 74 65 6d 20 77 72 69 74 65 73 20 61 72 65  ystem writes are
25a90 20 61 74 6f 6d 69 63 20 2a 2f 0a 20 20 20 20 20   atomic */.     
25aa0 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f     SQLITE_IOCAP_
25ab0 53 41 46 45 5f 41 50 50 45 4e 44 20 7c 20 20 20  SAFE_APPEND |   
25ac0 20 2f 2a 20 67 72 6f 77 69 6e 67 20 74 68 65 20   /* growing the 
25ad0 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 6f 63  file does not oc
25ae0 63 75 72 20 75 6e 74 69 6c 0a 20 20 20 20 20 20  cur until.      
25af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25b10 2a 2a 20 74 68 65 20 77 72 69 74 65 20 73 75 63  ** the write suc
25b20 63 65 65 64 73 20 2a 2f 0a 20 20 20 20 20 20 20  ceeds */.       
25b30 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45   SQLITE_IOCAP_SE
25b40 51 55 45 4e 54 49 41 4c 20 7c 20 20 20 20 20 2f  QUENTIAL |     /
25b50 2a 20 54 68 65 20 72 61 6d 20 66 69 6c 65 73 79  * The ram filesy
25b60 73 74 65 6d 20 68 61 73 20 6e 6f 20 77 72 69 74  stem has no writ
25b70 65 20 62 65 68 69 6e 64 0a 20 20 20 20 20 20 20  e behind.       
25b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a                 *
25ba0 2a 20 73 6f 20 69 74 20 69 73 20 6f 72 64 65 72  * so it is order
25bb0 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 30 3b  ed */.        0;
25bc0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
25bd0 74 72 73 74 72 28 66 73 49 6e 66 6f 2e 66 5f 62  trstr(fsInfo.f_b
25be0 61 73 65 74 79 70 65 2c 20 22 65 74 66 73 22 29  asetype, "etfs")
25bf0 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d   ){.      pFile-
25c00 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 66 73  >sectorSize = fs
25c10 49 6e 66 6f 2e 66 5f 62 73 69 7a 65 3b 0a 20 20  Info.f_bsize;.  
25c20 20 20 20 20 70 46 69 6c 65 2d 3e 64 65 76 69 63      pFile->devic
25c30 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
25c40 20 3d 0a 20 20 20 20 20 20 20 20 2f 2a 20 65 74   =.        /* et
25c50 66 73 20 63 6c 75 73 74 65 72 20 73 69 7a 65 20  fs cluster size 
25c60 77 72 69 74 65 73 20 61 72 65 20 61 74 6f 6d 69  writes are atomi
25c70 63 20 2a 2f 0a 20 20 20 20 20 20 20 20 28 70 46  c */.        (pF
25c80 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ile->sectorSize 
25c90 2f 20 35 31 32 20 2a 20 53 51 4c 49 54 45 5f 49  / 512 * SQLITE_I
25ca0 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 29 20  OCAP_ATOMIC512) 
25cb0 7c 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45  |.        SQLITE
25cc0 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45  _IOCAP_SAFE_APPE
25cd0 4e 44 20 7c 20 20 20 20 2f 2a 20 67 72 6f 77 69  ND |    /* growi
25ce0 6e 67 20 74 68 65 20 66 69 6c 65 20 64 6f 65 73  ng the file does
25cf0 20 6e 6f 74 20 6f 63 63 75 72 20 75 6e 74 69 6c   not occur until
25d00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
25d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25d20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 77 72         ** the wr
25d30 69 74 65 20 73 75 63 63 65 65 64 73 20 2a 2f 0a  ite succeeds */.
25d40 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49          SQLITE_I
25d50 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 20  OCAP_SEQUENTIAL 
25d60 7c 20 20 20 20 20 2f 2a 20 54 68 65 20 72 61 6d  |     /* The ram
25d70 20 66 69 6c 65 73 79 73 74 65 6d 20 68 61 73 20   filesystem has 
25d80 6e 6f 20 77 72 69 74 65 20 62 65 68 69 6e 64 0a  no write behind.
25d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25db0 20 20 20 20 20 20 2a 2a 20 73 6f 20 69 74 20 69        ** so it i
25dc0 73 20 6f 72 64 65 72 65 64 20 2a 2f 0a 20 20 20  s ordered */.   
25dd0 20 20 20 20 20 30 3b 0a 20 20 20 20 7d 65 6c 73       0;.    }els
25de0 65 20 69 66 28 20 21 73 74 72 63 6d 70 28 66 73  e if( !strcmp(fs
25df0 49 6e 66 6f 2e 66 5f 62 61 73 65 74 79 70 65 2c  Info.f_basetype,
25e00 20 22 71 6e 78 36 22 29 20 29 7b 0a 20 20 20 20   "qnx6") ){.    
25e10 20 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53    pFile->sectorS
25e20 69 7a 65 20 3d 20 66 73 49 6e 66 6f 2e 66 5f 62  ize = fsInfo.f_b
25e30 73 69 7a 65 3b 0a 20 20 20 20 20 20 70 46 69 6c  size;.      pFil
25e40 65 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63 74  e->deviceCharact
25e50 65 72 69 73 74 69 63 73 20 3d 0a 20 20 20 20 20  eristics =.     
25e60 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f     SQLITE_IOCAP_
25e70 41 54 4f 4d 49 43 20 7c 20 20 20 20 20 20 20 20  ATOMIC |        
25e80 20 2f 2a 20 41 6c 6c 20 66 69 6c 65 73 79 73 74   /* All filesyst
25e90 65 6d 20 77 72 69 74 65 73 20 61 72 65 20 61 74  em writes are at
25ea0 6f 6d 69 63 20 2a 2f 0a 20 20 20 20 20 20 20 20  omic */.        
25eb0 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46  SQLITE_IOCAP_SAF
25ec0 45 5f 41 50 50 45 4e 44 20 7c 20 20 20 20 2f 2a  E_APPEND |    /*
25ed0 20 67 72 6f 77 69 6e 67 20 74 68 65 20 66 69 6c   growing the fil
25ee0 65 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75 72  e does not occur
25ef0 20 75 6e 74 69 6c 0a 20 20 20 20 20 20 20 20 20   until.         
25f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25f10 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
25f20 74 68 65 20 77 72 69 74 65 20 73 75 63 63 65 65  the write succee
25f30 64 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 51  ds */.        SQ
25f40 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45  LITE_IOCAP_SEQUE
25f50 4e 54 49 41 4c 20 7c 20 20 20 20 20 2f 2a 20 54  NTIAL |     /* T
25f60 68 65 20 72 61 6d 20 66 69 6c 65 73 79 73 74 65  he ram filesyste
25f70 6d 20 68 61 73 20 6e 6f 20 77 72 69 74 65 20 62  m has no write b
25f80 65 68 69 6e 64 0a 20 20 20 20 20 20 20 20 20 20  ehind.          
25f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25fa0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73              ** s
25fb0 6f 20 69 74 20 69 73 20 6f 72 64 65 72 65 64 20  o it is ordered 
25fc0 2a 2f 0a 20 20 20 20 20 20 20 20 30 3b 0a 20 20  */.        0;.  
25fd0 20 20 7d 65 6c 73 65 20 69 66 28 20 21 73 74 72    }else if( !str
25fe0 63 6d 70 28 66 73 49 6e 66 6f 2e 66 5f 62 61 73  cmp(fsInfo.f_bas
25ff0 65 74 79 70 65 2c 20 22 71 6e 78 34 22 29 20 29  etype, "qnx4") )
26000 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73  {.      pFile->s
26010 65 63 74 6f 72 53 69 7a 65 20 3d 20 66 73 49 6e  ectorSize = fsIn
26020 66 6f 2e 66 5f 62 73 69 7a 65 3b 0a 20 20 20 20  fo.f_bsize;.    
26030 20 20 70 46 69 6c 65 2d 3e 64 65 76 69 63 65 43    pFile->deviceC
26040 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20 3d  haracteristics =
26050 0a 20 20 20 20 20 20 20 20 2f 2a 20 66 75 6c 6c  .        /* full
26060 20 62 69 74 73 65 74 20 6f 66 20 61 74 6f 6d 69   bitset of atomi
26070 63 73 20 66 72 6f 6d 20 6d 61 78 20 73 65 63 74  cs from max sect
26080 6f 72 20 73 69 7a 65 20 61 6e 64 20 73 6d 61 6c  or size and smal
26090 6c 65 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 28  ler */.        (
260a0 28 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69  (pFile->sectorSi
260b0 7a 65 20 2f 20 35 31 32 20 2a 20 53 51 4c 49 54  ze / 512 * SQLIT
260c0 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31  E_IOCAP_ATOMIC51
260d0 32 29 20 3c 3c 20 31 29 20 2d 20 32 20 7c 0a 20  2) << 1) - 2 |. 
260e0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f         SQLITE_IO
260f0 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 20 7c  CAP_SEQUENTIAL |
26100 20 20 20 20 20 2f 2a 20 54 68 65 20 72 61 6d 20       /* The ram 
26110 66 69 6c 65 73 79 73 74 65 6d 20 68 61 73 20 6e  filesystem has n
26120 6f 20 77 72 69 74 65 20 62 65 68 69 6e 64 0a 20  o write behind. 
26130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26150 20 20 20 20 20 2a 2a 20 73 6f 20 69 74 20 69 73       ** so it is
26160 20 6f 72 64 65 72 65 64 20 2a 2f 0a 20 20 20 20   ordered */.    
26170 20 20 20 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65      0;.    }else
26180 20 69 66 28 20 73 74 72 73 74 72 28 66 73 49 6e   if( strstr(fsIn
26190 66 6f 2e 66 5f 62 61 73 65 74 79 70 65 2c 20 22  fo.f_basetype, "
261a0 64 6f 73 22 29 20 29 7b 0a 20 20 20 20 20 20 70  dos") ){.      p
261b0 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65  File->sectorSize
261c0 20 3d 20 66 73 49 6e 66 6f 2e 66 5f 62 73 69 7a   = fsInfo.f_bsiz
261d0 65 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  e;.      pFile->
261e0 64 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  deviceCharacteri
261f0 73 74 69 63 73 20 3d 0a 20 20 20 20 20 20 20 20  stics =.        
26200 2f 2a 20 66 75 6c 6c 20 62 69 74 73 65 74 20 6f  /* full bitset o
26210 66 20 61 74 6f 6d 69 63 73 20 66 72 6f 6d 20 6d  f atomics from m
26220 61 78 20 73 65 63 74 6f 72 20 73 69 7a 65 20 61  ax sector size a
26230 6e 64 20 73 6d 61 6c 6c 65 72 20 2a 2f 0a 20 20  nd smaller */.  
26240 20 20 20 20 20 20 28 28 70 46 69 6c 65 2d 3e 73        ((pFile->s
26250 65 63 74 6f 72 53 69 7a 65 20 2f 20 35 31 32 20  ectorSize / 512 
26260 2a 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41  * SQLITE_IOCAP_A
26270 54 4f 4d 49 43 35 31 32 29 20 3c 3c 20 31 29 20  TOMIC512) << 1) 
26280 2d 20 32 20 7c 0a 20 20 20 20 20 20 20 20 53 51  - 2 |.        SQ
26290 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45  LITE_IOCAP_SEQUE
262a0 4e 54 49 41 4c 20 7c 20 20 20 20 20 2f 2a 20 54  NTIAL |     /* T
262b0 68 65 20 72 61 6d 20 66 69 6c 65 73 79 73 74 65  he ram filesyste
262c0 6d 20 68 61 73 20 6e 6f 20 77 72 69 74 65 20 62  m has no write b
262d0 65 68 69 6e 64 0a 20 20 20 20 20 20 20 20 20 20  ehind.          
262e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
262f0 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73              ** s
26300 6f 20 69 74 20 69 73 20 6f 72 64 65 72 65 64 20  o it is ordered 
26310 2a 2f 0a 20 20 20 20 20 20 20 20 30 3b 0a 20 20  */.        0;.  
26320 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
26330 46 69 6c 65 2d 3e 64 65 76 69 63 65 43 68 61 72  File->deviceChar
26340 61 63 74 65 72 69 73 74 69 63 73 20 3d 0a 20 20  acteristics =.  
26350 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43        SQLITE_IOC
26360 41 50 5f 41 54 4f 4d 49 43 35 31 32 20 7c 20 20  AP_ATOMIC512 |  
26370 20 20 20 20 2f 2a 20 62 6c 6f 63 6b 73 20 61 72      /* blocks ar
26380 65 20 61 74 6f 6d 69 63 20 2a 2f 0a 20 20 20 20  e atomic */.    
26390 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41 50      SQLITE_IOCAP
263a0 5f 53 41 46 45 5f 41 50 50 45 4e 44 20 7c 20 20  _SAFE_APPEND |  
263b0 20 20 2f 2a 20 67 72 6f 77 69 6e 67 20 74 68 65    /* growing the
263c0 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 6f   file does not o
263d0 63 63 75 72 20 75 6e 74 69 6c 0a 20 20 20 20 20  ccur until.     
263e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
263f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26400 20 2a 2a 20 74 68 65 20 77 72 69 74 65 20 73 75   ** the write su
26410 63 63 65 65 64 73 20 2a 2f 0a 20 20 20 20 20 20  cceeds */.      
26420 20 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20    0;.    }.  }. 
26430 20 2f 2a 20 4c 61 73 74 20 63 68 61 6e 63 65 20   /* Last chance 
26440 76 65 72 69 66 69 63 61 74 69 6f 6e 2e 20 20 49  verification.  I
26450 66 20 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a  f the sector siz
26460 65 20 69 73 6e 27 74 20 61 20 6d 75 6c 74 69 70  e isn't a multip
26470 6c 65 20 6f 66 20 35 31 32 0a 20 20 2a 2a 20 74  le of 512.  ** t
26480 68 65 6e 20 69 74 20 69 73 6e 27 74 20 76 61 6c  hen it isn't val
26490 69 64 2e 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  id.*/.  if( pFil
264a0 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 25 20  e->sectorSize % 
264b0 35 31 32 20 21 3d 20 30 20 29 7b 0a 20 20 20 20  512 != 0 ){.    
264c0 70 46 69 6c 65 2d 3e 64 65 76 69 63 65 43 68 61  pFile->deviceCha
264d0 72 61 63 74 65 72 69 73 74 69 63 73 20 3d 20 30  racteristics = 0
264e0 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 73 65 63  ;.    pFile->sec
264f0 74 6f 72 53 69 7a 65 20 3d 20 53 51 4c 49 54 45  torSize = SQLITE
26500 5f 44 45 46 41 55 4c 54 5f 53 45 43 54 4f 52 5f  _DEFAULT_SECTOR_
26510 53 49 5a 45 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  SIZE;.  }.}.#end
26520 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  if../*.** Return
26530 20 74 68 65 20 73 65 63 74 6f 72 20 73 69 7a 65   the sector size
26540 20 69 6e 20 62 79 74 65 73 20 6f 66 20 74 68 65   in bytes of the
26550 20 75 6e 64 65 72 6c 79 69 6e 67 20 62 6c 6f 63   underlying bloc
26560 6b 20 64 65 76 69 63 65 20 66 6f 72 0a 2a 2a 20  k device for.** 
26570 74 68 65 20 73 70 65 63 69 66 69 65 64 20 66 69  the specified fi
26580 6c 65 2e 20 54 68 69 73 20 69 73 20 61 6c 6d 6f  le. This is almo
26590 73 74 20 61 6c 77 61 79 73 20 35 31 32 20 62 79  st always 512 by
265a0 74 65 73 2c 20 62 75 74 20 6d 61 79 20 62 65 0a  tes, but may be.
265b0 2a 2a 20 6c 61 72 67 65 72 20 66 6f 72 20 73 6f  ** larger for so
265c0 6d 65 20 64 65 76 69 63 65 73 2e 0a 2a 2a 0a 2a  me devices..**.*
265d0 2a 20 53 51 4c 69 74 65 20 63 6f 64 65 20 61 73  * SQLite code as
265e0 73 75 6d 65 73 20 74 68 69 73 20 66 75 6e 63 74  sumes this funct
265f0 69 6f 6e 20 63 61 6e 6e 6f 74 20 66 61 69 6c 2e  ion cannot fail.
26600 20 49 74 20 61 6c 73 6f 20 61 73 73 75 6d 65 73   It also assumes
26610 20 74 68 61 74 0a 2a 2a 20 69 66 20 74 77 6f 20   that.** if two 
26620 66 69 6c 65 73 20 61 72 65 20 63 72 65 61 74 65  files are create
26630 64 20 69 6e 20 74 68 65 20 73 61 6d 65 20 66 69  d in the same fi
26640 6c 65 2d 73 79 73 74 65 6d 20 64 69 72 65 63 74  le-system direct
26650 6f 72 79 20 28 69 2e 65 2e 0a 2a 2a 20 61 20 64  ory (i.e..** a d
26660 61 74 61 62 61 73 65 20 61 6e 64 20 69 74 73 20  atabase and its 
26670 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 74 68  journal file) th
26680 61 74 20 74 68 65 20 73 65 63 74 6f 72 20 73 69  at the sector si
26690 7a 65 20 77 69 6c 6c 20 62 65 20 74 68 65 0a 2a  ze will be the.*
266a0 2a 20 73 61 6d 65 20 66 6f 72 20 62 6f 74 68 2e  * same for both.
266b0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
266c0 6e 69 78 53 65 63 74 6f 72 53 69 7a 65 28 73 71  nixSectorSize(sq
266d0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 7b  lite3_file *id){
266e0 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 64  .  unixFile *pFd
266f0 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
26700 3b 0a 20 20 73 65 74 44 65 76 69 63 65 43 68 61  ;.  setDeviceCha
26710 72 61 63 74 65 72 69 73 74 69 63 73 28 70 46 64  racteristics(pFd
26720 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 46 64 2d  );.  return pFd-
26730 3e 73 65 63 74 6f 72 53 69 7a 65 3b 0a 7d 0a 0a  >sectorSize;.}..
26740 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
26750 20 64 65 76 69 63 65 20 63 68 61 72 61 63 74 65   device characte
26760 72 69 73 74 69 63 73 20 66 6f 72 20 74 68 65 20  ristics for the 
26770 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  file..**.** This
26780 20 56 46 53 20 69 73 20 73 65 74 20 75 70 20 74   VFS is set up t
26790 6f 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  o return SQLITE_
267a0 49 4f 43 41 50 5f 50 4f 57 45 52 53 41 46 45 5f  IOCAP_POWERSAFE_
267b0 4f 56 45 52 57 52 49 54 45 20 62 79 20 64 65 66  OVERWRITE by def
267c0 61 75 6c 74 2e 0a 2a 2a 20 48 6f 77 65 76 65 72  ault..** However
267d0 2c 20 74 68 61 74 20 63 68 6f 69 63 65 20 69 73  , that choice is
267e0 20 63 6f 6e 74 72 6f 76 65 72 73 69 61 6c 20 73   controversial s
267f0 69 6e 63 65 20 74 65 63 68 6e 69 63 61 6c 6c 79  ince technically
26800 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 0a   the underlying.
26810 2a 2a 20 66 69 6c 65 20 73 79 73 74 65 6d 20 64  ** file system d
26820 6f 65 73 20 6e 6f 74 20 61 6c 77 61 79 73 20 70  oes not always p
26830 72 6f 76 69 64 65 20 70 6f 77 65 72 73 61 66 65  rovide powersafe
26840 20 6f 76 65 72 77 72 69 74 65 73 2e 20 20 28 49   overwrites.  (I
26850 6e 20 6f 74 68 65 72 0a 2a 2a 20 77 6f 72 64 73  n other.** words
26860 2c 20 61 66 74 65 72 20 61 20 70 6f 77 65 72 2d  , after a power-
26870 6c 6f 73 73 20 65 76 65 6e 74 2c 20 70 61 72 74  loss event, part
26880 73 20 6f 66 20 74 68 65 20 66 69 6c 65 20 74 68  s of the file th
26890 61 74 20 77 65 72 65 20 6e 65 76 65 72 0a 2a 2a  at were never.**
268a0 20 77 72 69 74 74 65 6e 20 6d 69 67 68 74 20 65   written might e
268b0 6e 64 20 75 70 20 62 65 69 6e 67 20 61 6c 74 65  nd up being alte
268c0 72 65 64 2e 29 20 20 48 6f 77 65 76 65 72 2c 20  red.)  However, 
268d0 6e 6f 6e 2d 50 53 4f 57 20 62 65 68 61 76 69 6f  non-PSOW behavio
268e0 72 20 69 73 20 76 65 72 79 2c 0a 2a 2a 20 76 65  r is very,.** ve
268f0 72 79 20 72 61 72 65 2e 20 20 41 6e 64 20 61 73  ry rare.  And as
26900 73 65 72 74 69 6e 67 20 50 53 4f 57 20 6d 61 6b  serting PSOW mak
26910 65 73 20 61 20 6c 61 72 67 65 20 72 65 64 75 63  es a large reduc
26920 74 69 6f 6e 20 69 6e 20 74 68 65 20 61 6d 6f 75  tion in the amou
26930 6e 74 0a 2a 2a 20 6f 66 20 72 65 71 75 69 72 65  nt.** of require
26940 64 20 49 2f 4f 20 66 6f 72 20 6a 6f 75 72 6e 61  d I/O for journa
26950 6c 69 6e 67 2c 20 73 69 6e 63 65 20 61 20 6c 6f  ling, since a lo
26960 74 20 6f 66 20 70 61 64 64 69 6e 67 20 69 73 20  t of padding is 
26970 65 6c 69 6d 69 6e 61 74 65 64 2e 0a 2a 2a 20 20  eliminated..**  
26980 48 65 6e 63 65 2c 20 77 68 69 6c 65 20 50 4f 57  Hence, while POW
26990 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45  ERSAFE_OVERWRITE
269a0 20 69 73 20 6f 6e 20 62 79 20 64 65 66 61 75 6c   is on by defaul
269b0 74 2c 20 74 68 65 72 65 20 69 73 20 61 20 66 69  t, there is a fi
269c0 6c 65 2d 63 6f 6e 74 72 6f 6c 0a 2a 2a 20 61 76  le-control.** av
269d0 61 69 6c 61 62 6c 65 20 74 6f 20 74 75 72 6e 20  ailable to turn 
269e0 69 74 20 6f 66 66 20 61 6e 64 20 55 52 49 20 71  it off and URI q
269f0 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 20 61  uery parameter a
26a00 76 61 69 6c 61 62 6c 65 20 74 6f 20 74 75 72 6e  vailable to turn
26a10 20 69 74 20 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74   it off..*/.stat
26a20 69 63 20 69 6e 74 20 75 6e 69 78 44 65 76 69 63  ic int unixDevic
26a30 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
26a40 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
26a50 64 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  d){.  unixFile *
26a60 70 46 64 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  pFd = (unixFile*
26a70 29 69 64 3b 0a 20 20 73 65 74 44 65 76 69 63 65  )id;.  setDevice
26a80 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
26a90 70 46 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  pFd);.  return p
26aa0 46 64 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63  Fd->deviceCharac
26ab0 74 65 72 69 73 74 69 63 73 3b 0a 7d 0a 0a 23 69  teristics;.}..#i
26ac0 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
26ad0 45 5f 4f 4d 49 54 5f 57 41 4c 29 20 7c 7c 20 53  E_OMIT_WAL) || S
26ae0 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
26af0 49 5a 45 3e 30 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  IZE>0../*.** Ret
26b00 75 72 6e 20 74 68 65 20 73 79 73 74 65 6d 20 70  urn the system p
26b10 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20  age size..**.** 
26b20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68  This function sh
26b30 6f 75 6c 64 20 6e 6f 74 20 62 65 20 63 61 6c 6c  ould not be call
26b40 65 64 20 64 69 72 65 63 74 6c 79 20 62 79 20 6f  ed directly by o
26b50 74 68 65 72 20 63 6f 64 65 20 69 6e 20 74 68 69  ther code in thi
26b60 73 20 66 69 6c 65 2e 20 0a 2a 2a 20 49 6e 73 74  s file. .** Inst
26b70 65 61 64 2c 20 69 74 20 73 68 6f 75 6c 64 20 62  ead, it should b
26b80 65 20 63 61 6c 6c 65 64 20 76 69 61 20 6d 61 63  e called via mac
26b90 72 6f 20 6f 73 47 65 74 70 61 67 65 73 69 7a 65  ro osGetpagesize
26ba0 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ()..*/.static in
26bb0 74 20 75 6e 69 78 47 65 74 70 61 67 65 73 69 7a  t unixGetpagesiz
26bc0 65 28 76 6f 69 64 29 7b 0a 23 69 66 20 4f 53 5f  e(void){.#if OS_
26bd0 56 58 57 4f 52 4b 53 0a 20 20 72 65 74 75 72 6e  VXWORKS.  return
26be0 20 31 30 32 34 3b 0a 23 65 6c 69 66 20 64 65 66   1024;.#elif def
26bf0 69 6e 65 64 28 5f 42 53 44 5f 53 4f 55 52 43 45  ined(_BSD_SOURCE
26c00 29 0a 20 20 72 65 74 75 72 6e 20 67 65 74 70 61  ).  return getpa
26c10 67 65 73 69 7a 65 28 29 3b 0a 23 65 6c 73 65 0a  gesize();.#else.
26c20 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29 73 79    return (int)sy
26c30 73 63 6f 6e 66 28 5f 53 43 5f 50 41 47 45 53 49  sconf(_SC_PAGESI
26c40 5a 45 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 23  ZE);.#endif.}..#
26c50 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
26c60 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  d(SQLITE_OMIT_WA
26c70 4c 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58  L) || SQLITE_MAX
26c80 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 20 2a 2f 0a  _MMAP_SIZE>0 */.
26c90 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
26ca0 4f 4d 49 54 5f 57 41 4c 0a 0a 2f 2a 0a 2a 2a 20  OMIT_WAL../*.** 
26cb0 4f 62 6a 65 63 74 20 75 73 65 64 20 74 6f 20 72  Object used to r
26cc0 65 70 72 65 73 65 6e 74 20 61 6e 20 73 68 61 72  epresent an shar
26cd0 65 64 20 6d 65 6d 6f 72 79 20 62 75 66 66 65 72  ed memory buffer
26ce0 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 6d  .  .**.** When m
26cf0 75 6c 74 69 70 6c 65 20 74 68 72 65 61 64 73 20  ultiple threads 
26d00 61 6c 6c 20 72 65 66 65 72 65 6e 63 65 20 74 68  all reference th
26d10 65 20 73 61 6d 65 20 77 61 6c 2d 69 6e 64 65 78  e same wal-index
26d20 2c 20 65 61 63 68 20 74 68 72 65 61 64 0a 2a 2a  , each thread.**
26d30 20 68 61 73 20 69 74 73 20 6f 77 6e 20 75 6e 69   has its own uni
26d40 78 53 68 6d 20 6f 62 6a 65 63 74 2c 20 62 75 74  xShm object, but
26d50 20 74 68 65 79 20 61 6c 6c 20 70 6f 69 6e 74 20   they all point 
26d60 74 6f 20 61 20 73 69 6e 67 6c 65 20 69 6e 73 74  to a single inst
26d70 61 6e 63 65 0a 2a 2a 20 6f 66 20 74 68 69 73 20  ance.** of this 
26d80 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65  unixShmNode obje
26d90 63 74 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  ct.  In other wo
26da0 72 64 73 2c 20 65 61 63 68 20 77 61 6c 2d 69 6e  rds, each wal-in
26db0 64 65 78 20 69 73 20 6f 70 65 6e 65 64 0a 2a 2a  dex is opened.**
26dc0 20 6f 6e 6c 79 20 6f 6e 63 65 20 70 65 72 20 70   only once per p
26dd0 72 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 45 61  rocess..**.** Ea
26de0 63 68 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f  ch unixShmNode o
26df0 62 6a 65 63 74 20 69 73 20 63 6f 6e 6e 65 63 74  bject is connect
26e00 65 64 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 75  ed to a single u
26e10 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a  nixInodeInfo obj
26e20 65 63 74 2e 0a 2a 2a 20 57 65 20 63 6f 75 6c 64  ect..** We could
26e30 20 63 6f 61 6c 65 73 63 65 20 74 68 69 73 20 6f   coalesce this o
26e40 62 6a 65 63 74 20 69 6e 74 6f 20 75 6e 69 78 49  bject into unixI
26e50 6e 6f 64 65 49 6e 66 6f 2c 20 62 75 74 20 74 68  nodeInfo, but th
26e60 61 74 20 77 6f 75 6c 64 20 6d 65 61 6e 0a 2a 2a  at would mean.**
26e70 20 65 76 65 72 79 20 6f 70 65 6e 20 66 69 6c 65   every open file
26e80 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 75   that does not u
26e90 73 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  se shared memory
26ea0 20 28 69 6e 20 6f 74 68 65 72 20 77 6f 72 64 73   (in other words
26eb0 2c 20 6d 6f 73 74 0a 2a 2a 20 6f 70 65 6e 20 66  , most.** open f
26ec0 69 6c 65 73 29 20 77 6f 75 6c 64 20 68 61 76 65  iles) would have
26ed0 20 74 6f 20 63 61 72 72 79 20 61 72 6f 75 6e 64   to carry around
26ee0 20 74 68 69 73 20 65 78 74 72 61 20 69 6e 66 6f   this extra info
26ef0 72 6d 61 74 69 6f 6e 2e 20 20 53 6f 0a 2a 2a 20  rmation.  So.** 
26f00 74 68 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  the unixInodeInf
26f10 6f 20 6f 62 6a 65 63 74 20 63 6f 6e 74 61 69 6e  o object contain
26f20 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  s a pointer to t
26f30 68 69 73 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  his unixShmNode 
26f40 6f 62 6a 65 63 74 0a 2a 2a 20 61 6e 64 20 74 68  object.** and th
26f50 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62  e unixShmNode ob
26f60 6a 65 63 74 20 69 73 20 63 72 65 61 74 65 64 20  ject is created 
26f70 6f 6e 6c 79 20 77 68 65 6e 20 6e 65 65 64 65 64  only when needed
26f80 2e 0a 2a 2a 0a 2a 2a 20 75 6e 69 78 4d 75 74 65  ..**.** unixMute
26f90 78 48 65 6c 64 28 29 20 6d 75 73 74 20 62 65 20  xHeld() must be 
26fa0 74 72 75 65 20 77 68 65 6e 20 63 72 65 61 74 69  true when creati
26fb0 6e 67 20 6f 72 20 64 65 73 74 72 6f 79 69 6e 67  ng or destroying
26fc0 0a 2a 2a 20 74 68 69 73 20 6f 62 6a 65 63 74 20  .** this object 
26fd0 6f 72 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67  or while reading
26fe0 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68 65 20   or writing the 
26ff0 66 6f 6c 6c 6f 77 69 6e 67 20 66 69 65 6c 64 73  following fields
27000 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 6e 52 65  :.**.**      nRe
27010 66 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  f.**.** The foll
27020 6f 77 69 6e 67 20 66 69 65 6c 64 73 20 61 72 65  owing fields are
27030 20 72 65 61 64 2d 6f 6e 6c 79 20 61 66 74 65 72   read-only after
27040 20 74 68 65 20 6f 62 6a 65 63 74 20 69 73 20 63   the object is c
27050 72 65 61 74 65 64 3a 0a 2a 2a 20 0a 2a 2a 20 20  reated:.** .**  
27060 20 20 20 20 66 69 64 0a 2a 2a 20 20 20 20 20 20      fid.**      
27070 7a 46 69 6c 65 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20  zFilename.**.** 
27080 45 69 74 68 65 72 20 75 6e 69 78 53 68 6d 4e 6f  Either unixShmNo
27090 64 65 2e 6d 75 74 65 78 20 6d 75 73 74 20 62 65  de.mutex must be
270a0 20 68 65 6c 64 20 6f 72 20 75 6e 69 78 53 68 6d   held or unixShm
270b0 4e 6f 64 65 2e 6e 52 65 66 3d 3d 30 20 61 6e 64  Node.nRef==0 and
270c0 0a 2a 2a 20 75 6e 69 78 4d 75 74 65 78 48 65 6c  .** unixMutexHel
270d0 64 28 29 20 69 73 20 74 72 75 65 20 77 68 65 6e  d() is true when
270e0 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74   reading or writ
270f0 69 6e 67 20 61 6e 79 20 6f 74 68 65 72 20 66 69  ing any other fi
27100 65 6c 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20 73  eld.** in this s
27110 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 72  tructure..*/.str
27120 75 63 74 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  uct unixShmNode 
27130 7b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  {.  unixInodeInf
27140 6f 20 2a 70 49 6e 6f 64 65 3b 20 20 20 20 20 2f  o *pInode;     /
27150 2a 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20  * unixInodeInfo 
27160 74 68 61 74 20 6f 77 6e 73 20 74 68 69 73 20 53  that owns this S
27170 48 4d 20 6e 6f 64 65 20 2a 2f 0a 20 20 73 71 6c  HM node */.  sql
27180 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65  ite3_mutex *mute
27190 78 3b 20 20 20 20 20 20 2f 2a 20 4d 75 74 65 78  x;      /* Mutex
271a0 20 74 6f 20 61 63 63 65 73 73 20 74 68 69 73 20   to access this 
271b0 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 63 68 61 72  object */.  char
271c0 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20   *zFilename;    
271d0 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
271e0 66 20 74 68 65 20 6d 6d 61 70 70 65 64 20 66 69  f the mmapped fi
271f0 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 68 3b 20 20  le */.  int h;  
27200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27210 20 20 20 2f 2a 20 4f 70 65 6e 20 66 69 6c 65 20     /* Open file 
27220 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20  descriptor */.  
27230 69 6e 74 20 73 7a 52 65 67 69 6f 6e 3b 20 20 20  int szRegion;   
27240 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
27250 7a 65 20 6f 66 20 73 68 61 72 65 64 2d 6d 65 6d  ze of shared-mem
27260 6f 72 79 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20  ory regions */. 
27270 20 75 31 36 20 6e 52 65 67 69 6f 6e 3b 20 20 20   u16 nRegion;   
27280 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
27290 69 7a 65 20 6f 66 20 61 72 72 61 79 20 61 70 52  ize of array apR
272a0 65 67 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 69 73  egion */.  u8 is
272b0 52 65 61 64 6f 6e 6c 79 3b 20 20 20 20 20 20 20  Readonly;       
272c0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
272d0 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20   read-only */.  
272e0 75 38 20 69 73 55 6e 6c 6f 63 6b 65 64 3b 20 20  u8 isUnlocked;  
272f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
27300 75 65 20 69 66 20 6e 6f 20 44 4d 53 20 6c 6f 63  ue if no DMS loc
27310 6b 20 68 65 6c 64 20 2a 2f 0a 20 20 63 68 61 72  k held */.  char
27320 20 2a 2a 61 70 52 65 67 69 6f 6e 3b 20 20 20 20   **apRegion;    
27330 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20         /* Array 
27340 6f 66 20 6d 61 70 70 65 64 20 73 68 61 72 65 64  of mapped shared
27350 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 73 20  -memory regions 
27360 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20  */.  int nRef;  
27370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27380 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e 69  /* Number of uni
27390 78 53 68 6d 20 6f 62 6a 65 63 74 73 20 70 6f 69  xShm objects poi
273a0 6e 74 69 6e 67 20 74 6f 20 74 68 69 73 20 2a 2f  nting to this */
273b0 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 46 69 72  .  unixShm *pFir
273c0 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  st;           /*
273d0 20 41 6c 6c 20 75 6e 69 78 53 68 6d 20 6f 62 6a   All unixShm obj
273e0 65 63 74 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f  ects pointing to
273f0 20 74 68 69 73 20 2a 2f 0a 23 69 66 64 65 66 20   this */.#ifdef 
27400 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 75  SQLITE_DEBUG.  u
27410 38 20 65 78 63 6c 4d 61 73 6b 3b 20 20 20 20 20  8 exclMask;     
27420 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
27430 6b 20 6f 66 20 65 78 63 6c 75 73 69 76 65 20 6c  k of exclusive l
27440 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20 75  ocks held */.  u
27450 38 20 73 68 61 72 65 64 4d 61 73 6b 3b 20 20 20  8 sharedMask;   
27460 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
27470 6b 20 6f 66 20 73 68 61 72 65 64 20 6c 6f 63 6b  k of shared lock
27480 73 20 68 65 6c 64 20 2a 2f 0a 20 20 75 38 20 6e  s held */.  u8 n
27490 65 78 74 53 68 6d 49 64 3b 20 20 20 20 20 20 20  extShmId;       
274a0 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 61         /* Next a
274b0 76 61 69 6c 61 62 6c 65 20 75 6e 69 78 53 68 6d  vailable unixShm
274c0 2e 69 64 20 76 61 6c 75 65 20 2a 2f 0a 23 65 6e  .id value */.#en
274d0 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 53 74  dif.};../*.** St
274e0 72 75 63 74 75 72 65 20 75 73 65 64 20 69 6e 74  ructure used int
274f0 65 72 6e 61 6c 6c 79 20 62 79 20 74 68 69 73 20  ernally by this 
27500 56 46 53 20 74 6f 20 72 65 63 6f 72 64 20 74 68  VFS to record th
27510 65 20 73 74 61 74 65 20 6f 66 20 61 6e 0a 2a 2a  e state of an.**
27520 20 6f 70 65 6e 20 73 68 61 72 65 64 20 6d 65 6d   open shared mem
27530 6f 72 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a  ory connection..
27540 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  **.** The follow
27550 69 6e 67 20 66 69 65 6c 64 73 20 61 72 65 20 69  ing fields are i
27560 6e 69 74 69 61 6c 69 7a 65 64 20 77 68 65 6e 20  nitialized when 
27570 74 68 69 73 20 6f 62 6a 65 63 74 20 69 73 20 63  this object is c
27580 72 65 61 74 65 64 20 61 6e 64 0a 2a 2a 20 61 72  reated and.** ar
27590 65 20 72 65 61 64 2d 6f 6e 6c 79 20 74 68 65 72  e read-only ther
275a0 65 61 66 74 65 72 3a 0a 2a 2a 0a 2a 2a 20 20 20  eafter:.**.**   
275b0 20 75 6e 69 78 53 68 6d 2e 70 46 69 6c 65 0a 2a   unixShm.pFile.*
275c0 2a 20 20 20 20 75 6e 69 78 53 68 6d 2e 69 64 0a  *    unixShm.id.
275d0 2a 2a 0a 2a 2a 20 41 6c 6c 20 6f 74 68 65 72 20  **.** All other 
275e0 66 69 65 6c 64 73 20 61 72 65 20 72 65 61 64 2f  fields are read/
275f0 77 72 69 74 65 2e 20 20 54 68 65 20 75 6e 69 78  write.  The unix
27600 53 68 6d 2e 70 46 69 6c 65 2d 3e 6d 75 74 65 78  Shm.pFile->mutex
27610 20 6d 75 73 74 20 62 65 20 68 65 6c 64 0a 2a 2a   must be held.**
27620 20 77 68 69 6c 65 20 61 63 63 65 73 73 69 6e 67   while accessing
27630 20 61 6e 79 20 72 65 61 64 2f 77 72 69 74 65 20   any read/write 
27640 66 69 65 6c 64 73 2e 0a 2a 2f 0a 73 74 72 75 63  fields..*/.struc
27650 74 20 75 6e 69 78 53 68 6d 20 7b 0a 20 20 75 6e  t unixShm {.  un
27660 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e  ixShmNode *pShmN
27670 6f 64 65 3b 20 20 20 20 20 2f 2a 20 54 68 65 20  ode;     /* The 
27680 75 6e 64 65 72 6c 79 69 6e 67 20 75 6e 69 78 53  underlying unixS
27690 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 2a 2f  hmNode object */
276a0 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 4e 65 78  .  unixShm *pNex
276b0 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t;            /*
276c0 20 4e 65 78 74 20 75 6e 69 78 53 68 6d 20 77 69   Next unixShm wi
276d0 74 68 20 74 68 65 20 73 61 6d 65 20 75 6e 69 78  th the same unix
276e0 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 75 38 20  ShmNode */.  u8 
276f0 68 61 73 4d 75 74 65 78 3b 20 20 20 20 20 20 20  hasMutex;       
27700 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
27710 69 66 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 75  if holding the u
27720 6e 69 78 53 68 6d 4e 6f 64 65 20 6d 75 74 65 78  nixShmNode mutex
27730 20 2a 2f 0a 20 20 75 38 20 69 64 3b 20 20 20 20   */.  u8 id;    
27740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27750 20 2f 2a 20 49 64 20 6f 66 20 74 68 69 73 20 63   /* Id of this c
27760 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 69 6e  onnection within
27770 20 69 74 73 20 75 6e 69 78 53 68 6d 4e 6f 64 65   its unixShmNode
27780 20 2a 2f 0a 20 20 75 31 36 20 73 68 61 72 65 64   */.  u16 shared
27790 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20  Mask;           
277a0 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 73 68 61 72   /* Mask of shar
277b0 65 64 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f  ed locks held */
277c0 0a 20 20 75 31 36 20 65 78 63 6c 4d 61 73 6b 3b  .  u16 exclMask;
277d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
277e0 20 4d 61 73 6b 20 6f 66 20 65 78 63 6c 75 73 69   Mask of exclusi
277f0 76 65 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a 2f  ve locks held */
27800 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74  .};../*.** Const
27810 61 6e 74 73 20 75 73 65 64 20 66 6f 72 20 6c 6f  ants used for lo
27820 63 6b 69 6e 67 0a 2a 2f 0a 23 64 65 66 69 6e 65  cking.*/.#define
27830 20 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45 20 20   UNIX_SHM_BASE  
27840 20 28 28 32 32 2b 53 51 4c 49 54 45 5f 53 48 4d   ((22+SQLITE_SHM
27850 5f 4e 4c 4f 43 4b 29 2a 34 29 20 20 20 20 20 20  _NLOCK)*4)      
27860 20 20 20 2f 2a 20 66 69 72 73 74 20 6c 6f 63 6b     /* first lock
27870 20 62 79 74 65 20 2a 2f 0a 23 64 65 66 69 6e 65   byte */.#define
27880 20 55 4e 49 58 5f 53 48 4d 5f 44 4d 53 20 20 20   UNIX_SHM_DMS   
27890 20 28 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45 2b   (UNIX_SHM_BASE+
278a0 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b  SQLITE_SHM_NLOCK
278b0 29 20 20 2f 2a 20 64 65 61 64 6d 61 6e 20 73 77  )  /* deadman sw
278c0 69 74 63 68 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41  itch */../*.** A
278d0 70 70 6c 79 20 70 6f 73 69 78 20 61 64 76 69 73  pply posix advis
278e0 6f 72 79 20 6c 6f 63 6b 73 20 66 6f 72 20 61 6c  ory locks for al
278f0 6c 20 62 79 74 65 73 20 66 72 6f 6d 20 6f 66 73  l bytes from ofs
27900 74 20 74 68 72 6f 75 67 68 20 6f 66 73 74 2b 6e  t through ofst+n
27910 2d 31 2e 0a 2a 2a 0a 2a 2a 20 4c 6f 63 6b 73 20  -1..**.** Locks 
27920 62 6c 6f 63 6b 20 69 66 20 74 68 65 20 6d 61 73  block if the mas
27930 6b 20 69 73 20 65 78 61 63 74 6c 79 20 55 4e 49  k is exactly UNI
27940 58 5f 53 48 4d 5f 43 20 61 6e 64 20 61 72 65 20  X_SHM_C and are 
27950 6e 6f 6e 2d 62 6c 6f 63 6b 69 6e 67 0a 2a 2a 20  non-blocking.** 
27960 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74  otherwise..*/.st
27970 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 68 6d  atic int unixShm
27980 53 79 73 74 65 6d 4c 6f 63 6b 28 0a 20 20 75 6e  SystemLock(.  un
27990 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20  ixFile *pFile,  
279a0 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 63 6f 6e       /* Open con
279b0 6e 65 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 57  nection to the W
279c0 41 4c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  AL file */.  int
279d0 20 6c 6f 63 6b 54 79 70 65 2c 20 20 20 20 20 20   lockType,      
279e0 20 20 20 20 2f 2a 20 46 5f 55 4e 4c 43 4b 2c 20      /* F_UNLCK, 
279f0 46 5f 52 44 4c 43 4b 2c 20 6f 72 20 46 5f 57 52  F_RDLCK, or F_WR
27a00 4c 43 4b 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 73  LCK */.  int ofs
27a10 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
27a20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66  /* First byte of
27a30 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 72 61 6e   the locking ran
27a40 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 20 20 20  ge */.  int n   
27a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
27a60 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
27a70 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a  s to lock */.){.
27a80 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70    unixShmNode *p
27a90 53 68 6d 4e 6f 64 65 3b 20 2f 2a 20 41 70 70 6c  ShmNode; /* Appl
27aa0 79 20 6c 6f 63 6b 73 20 74 6f 20 74 68 69 73 20  y locks to this 
27ab0 6f 70 65 6e 20 73 68 61 72 65 64 2d 6d 65 6d 6f  open shared-memo
27ac0 72 79 20 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20  ry segment */.  
27ad0 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 66 3b 20  struct flock f; 
27ae0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 6f         /* The po
27af0 73 69 78 20 61 64 76 69 73 6f 72 79 20 6c 6f 63  six advisory loc
27b00 6b 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 2a  king structure *
27b10 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
27b20 49 54 45 5f 4f 4b 3b 20 20 20 20 2f 2a 20 52 65  ITE_OK;    /* Re
27b30 73 75 6c 74 20 63 6f 64 65 20 66 6f 72 6d 20 66  sult code form f
27b40 63 6e 74 6c 28 29 20 2a 2f 0a 0a 20 20 2f 2a 20  cntl() */..  /* 
27b50 41 63 63 65 73 73 20 74 6f 20 74 68 65 20 75 6e  Access to the un
27b60 69 78 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74  ixShmNode object
27b70 20 69 73 20 73 65 72 69 61 6c 69 7a 65 64 20 62   is serialized b
27b80 79 20 74 68 65 20 63 61 6c 6c 65 72 20 2a 2f 0a  y the caller */.
27b90 20 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 46 69    pShmNode = pFi
27ba0 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d  le->pInode->pShm
27bb0 4e 6f 64 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Node;.  assert( 
27bc0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
27bd0 6c 64 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  ld(pShmNode->mut
27be0 65 78 29 20 7c 7c 20 70 53 68 6d 4e 6f 64 65 2d  ex) || pShmNode-
27bf0 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 0a 20 20 2f  >nRef==0 );..  /
27c00 2a 20 53 68 61 72 65 64 20 6c 6f 63 6b 73 20 6e  * Shared locks n
27c10 65 76 65 72 20 73 70 61 6e 20 6d 6f 72 65 20 74  ever span more t
27c20 68 61 6e 20 6f 6e 65 20 62 79 74 65 20 2a 2f 0a  han one byte */.
27c30 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 31 20 7c    assert( n==1 |
27c40 7c 20 6c 6f 63 6b 54 79 70 65 21 3d 46 5f 52 44  | lockType!=F_RD
27c50 4c 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 63  LCK );..  /* Loc
27c60 6b 73 20 61 72 65 20 77 69 74 68 69 6e 20 72 61  ks are within ra
27c70 6e 67 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  nge */.  assert(
27c80 20 6e 3e 3d 31 20 26 26 20 6e 3c 3d 53 51 4c 49   n>=1 && n<=SQLI
27c90 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 20 29 3b 0a  TE_SHM_NLOCK );.
27ca0 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d  .  if( pShmNode-
27cb0 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  >h>=0 ){.    /* 
27cc0 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6c  Initialize the l
27cd0 6f 63 6b 69 6e 67 20 70 61 72 61 6d 65 74 65 72  ocking parameter
27ce0 73 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28  s */.    memset(
27cf0 26 66 2c 20 30 2c 20 73 69 7a 65 6f 66 28 66 29  &f, 0, sizeof(f)
27d00 29 3b 0a 20 20 20 20 66 2e 6c 5f 74 79 70 65 20  );.    f.l_type 
27d10 3d 20 6c 6f 63 6b 54 79 70 65 3b 0a 20 20 20 20  = lockType;.    
27d20 66 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45  f.l_whence = SEE
27d30 4b 5f 53 45 54 3b 0a 20 20 20 20 66 2e 6c 5f 73  K_SET;.    f.l_s
27d40 74 61 72 74 20 3d 20 6f 66 73 74 3b 0a 20 20 20  tart = ofst;.   
27d50 20 66 2e 6c 5f 6c 65 6e 20 3d 20 6e 3b 0a 0a 20   f.l_len = n;.. 
27d60 20 20 20 72 63 20 3d 20 6f 73 46 63 6e 74 6c 28     rc = osFcntl(
27d70 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 46 5f 53  pShmNode->h, F_S
27d80 45 54 4c 4b 2c 20 26 66 29 3b 0a 20 20 20 20 72  ETLK, &f);.    r
27d90 63 20 3d 20 28 72 63 21 3d 28 2d 31 29 29 20 3f  c = (rc!=(-1)) ?
27da0 20 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 53 51 4c   SQLITE_OK : SQL
27db0 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 0a 20  ITE_BUSY;.  }.. 
27dc0 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 67   /* Update the g
27dd0 6c 6f 62 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65  lobal lock state
27de0 20 61 6e 64 20 64 6f 20 64 65 62 75 67 20 74 72   and do debug tr
27df0 61 63 69 6e 67 20 2a 2f 0a 23 69 66 64 65 66 20  acing */.#ifdef 
27e00 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 7b  SQLITE_DEBUG.  {
27e10 20 75 31 36 20 6d 61 73 6b 3b 0a 20 20 4f 53 54   u16 mask;.  OST
27e20 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b 20  RACE(("SHM-LOCK 
27e30 22 29 29 3b 0a 20 20 6d 61 73 6b 20 3d 20 6f 66  "));.  mask = of
27e40 73 74 3e 33 31 20 3f 20 30 78 66 66 66 66 20 3a  st>31 ? 0xffff :
27e50 20 28 31 3c 3c 28 6f 66 73 74 2b 6e 29 29 20 2d   (1<<(ofst+n)) -
27e60 20 28 31 3c 3c 6f 66 73 74 29 3b 0a 20 20 69 66   (1<<ofst);.  if
27e70 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
27e80 29 7b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 54  ){.    if( lockT
27e90 79 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a  ype==F_UNLCK ){.
27ea0 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
27eb0 75 6e 6c 6f 63 6b 20 25 64 20 6f 6b 22 2c 20 6f  unlock %d ok", o
27ec0 66 73 74 29 29 3b 0a 20 20 20 20 20 20 70 53 68  fst));.      pSh
27ed0 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61 73 6b 20  mNode->exclMask 
27ee0 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20 20 20  &= ~mask;.      
27ef0 70 53 68 6d 4e 6f 64 65 2d 3e 73 68 61 72 65 64  pShmNode->shared
27f00 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20  Mask &= ~mask;. 
27f10 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63     }else if( loc
27f20 6b 54 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29  kType==F_RDLCK )
27f30 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  {.      OSTRACE(
27f40 28 22 72 65 61 64 2d 6c 6f 63 6b 20 25 64 20 6f  ("read-lock %d o
27f50 6b 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20 20  k", ofst));.    
27f60 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c    pShmNode->excl
27f70 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20  Mask &= ~mask;. 
27f80 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73       pShmNode->s
27f90 68 61 72 65 64 4d 61 73 6b 20 7c 3d 20 6d 61 73  haredMask |= mas
27fa0 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  k;.    }else{.  
27fb0 20 20 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b      assert( lock
27fc0 54 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 3b  Type==F_WRLCK );
27fd0 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28  .      OSTRACE((
27fe0 22 77 72 69 74 65 2d 6c 6f 63 6b 20 25 64 20 6f  "write-lock %d o
27ff0 6b 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20 20  k", ofst));.    
28000 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c    pShmNode->excl
28010 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20  Mask |= mask;.  
28020 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 68      pShmNode->sh
28030 61 72 65 64 4d 61 73 6b 20 26 3d 20 7e 6d 61 73  aredMask &= ~mas
28040 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  k;.    }.  }else
28050 7b 0a 20 20 20 20 69 66 28 20 6c 6f 63 6b 54 79  {.    if( lockTy
28060 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20  pe==F_UNLCK ){. 
28070 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 75       OSTRACE(("u
28080 6e 6c 6f 63 6b 20 25 64 20 66 61 69 6c 65 64 22  nlock %d failed"
28090 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20 20 7d 65  , ofst));.    }e
280a0 6c 73 65 20 69 66 28 20 6c 6f 63 6b 54 79 70 65  lse if( lockType
280b0 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20 20  ==F_RDLCK ){.   
280c0 20 20 20 4f 53 54 52 41 43 45 28 28 22 72 65 61     OSTRACE(("rea
280d0 64 2d 6c 6f 63 6b 20 66 61 69 6c 65 64 22 29 29  d-lock failed"))
280e0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
280f0 20 20 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 54     assert( lockT
28100 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 3b 0a  ype==F_WRLCK );.
28110 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
28120 77 72 69 74 65 2d 6c 6f 63 6b 20 25 64 20 66 61  write-lock %d fa
28130 69 6c 65 64 22 2c 20 6f 66 73 74 29 29 3b 0a 20  iled", ofst));. 
28140 20 20 20 7d 0a 20 20 7d 0a 20 20 4f 53 54 52 41     }.  }.  OSTRA
28150 43 45 28 28 22 20 2d 20 61 66 74 65 72 77 61 72  CE((" - afterwar
28160 64 73 20 25 30 33 78 2c 25 30 33 78 5c 6e 22 2c  ds %03x,%03x\n",
28170 0a 20 20 20 20 20 20 20 20 20 20 20 70 53 68 6d  .           pShm
28180 4e 6f 64 65 2d 3e 73 68 61 72 65 64 4d 61 73 6b  Node->sharedMask
28190 2c 20 70 53 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c  , pShmNode->excl
281a0 4d 61 73 6b 29 29 3b 0a 20 20 7d 0a 23 65 6e 64  Mask));.  }.#end
281b0 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  if..  return rc;
281c0 20 20 20 20 20 20 20 20 0a 7d 0a 0a 2f 2a 0a 2a          .}../*.*
281d0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6d 69 6e  * Return the min
281e0 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 33  imum number of 3
281f0 32 4b 42 20 73 68 6d 20 72 65 67 69 6f 6e 73 20  2KB shm regions 
28200 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 6d  that should be m
28210 61 70 70 65 64 20 61 74 0a 2a 2a 20 61 20 74 69  apped at.** a ti
28220 6d 65 2c 20 61 73 73 75 6d 69 6e 67 20 74 68 61  me, assuming tha
28230 74 20 65 61 63 68 20 6d 61 70 70 69 6e 67 20 6d  t each mapping m
28240 75 73 74 20 62 65 20 61 6e 20 69 6e 74 65 67 65  ust be an intege
28250 72 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 74 68  r multiple of th
28260 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 73 79 73  e.** current sys
28270 74 65 6d 20 70 61 67 65 2d 73 69 7a 65 2e 0a 2a  tem page-size..*
28280 2a 0a 2a 2a 20 55 73 75 61 6c 6c 79 2c 20 74 68  *.** Usually, th
28290 69 73 20 69 73 20 31 2e 20 54 68 65 20 65 78 63  is is 1. The exc
282a0 65 70 74 69 6f 6e 20 73 65 65 6d 73 20 74 6f 20  eption seems to 
282b0 62 65 20 73 79 73 74 65 6d 73 20 74 68 61 74 20  be systems that 
282c0 61 72 65 20 63 6f 6e 66 69 67 75 72 65 64 0a 2a  are configured.*
282d0 2a 20 74 6f 20 75 73 65 20 36 34 4b 42 20 70 61  * to use 64KB pa
282e0 67 65 73 20 2d 20 69 6e 20 74 68 69 73 20 63 61  ges - in this ca
282f0 73 65 20 65 61 63 68 20 6d 61 70 70 69 6e 67 20  se each mapping 
28300 6d 75 73 74 20 63 6f 76 65 72 20 61 74 20 6c 65  must cover at le
28310 61 73 74 20 74 77 6f 0a 2a 2a 20 73 68 6d 20 72  ast two.** shm r
28320 65 67 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69  egions..*/.stati
28330 63 20 69 6e 74 20 75 6e 69 78 53 68 6d 52 65 67  c int unixShmReg
28340 69 6f 6e 50 65 72 4d 61 70 28 76 6f 69 64 29 7b  ionPerMap(void){
28350 0a 20 20 69 6e 74 20 73 68 6d 73 7a 20 3d 20 33  .  int shmsz = 3
28360 32 2a 31 30 32 34 3b 20 20 20 20 20 20 20 20 20  2*1024;         
28370 20 20 20 2f 2a 20 53 48 4d 20 72 65 67 69 6f 6e     /* SHM region
28380 20 73 69 7a 65 20 2a 2f 0a 20 20 69 6e 74 20 70   size */.  int p
28390 67 73 7a 20 3d 20 6f 73 47 65 74 70 61 67 65 73  gsz = osGetpages
283a0 69 7a 65 28 29 3b 20 20 20 2f 2a 20 53 79 73 74  ize();   /* Syst
283b0 65 6d 20 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a  em page size */.
283c0 20 20 61 73 73 65 72 74 28 20 28 28 70 67 73 7a    assert( ((pgsz
283d0 2d 31 29 26 70 67 73 7a 29 3d 3d 30 20 29 3b 20  -1)&pgsz)==0 ); 
283e0 20 20 2f 2a 20 50 61 67 65 20 73 69 7a 65 20 6d    /* Page size m
283f0 75 73 74 20 62 65 20 61 20 70 6f 77 65 72 20 6f  ust be a power o
28400 66 20 32 20 2a 2f 0a 20 20 69 66 28 20 70 67 73  f 2 */.  if( pgs
28410 7a 3c 73 68 6d 73 7a 20 29 20 72 65 74 75 72 6e  z<shmsz ) return
28420 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 70 67 73   1;.  return pgs
28430 7a 2f 73 68 6d 73 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a  z/shmsz;.}../*.*
28440 2a 20 50 75 72 67 65 20 74 68 65 20 75 6e 69 78  * Purge the unix
28450 53 68 6d 4e 6f 64 65 4c 69 73 74 20 6c 69 73 74  ShmNodeList list
28460 20 6f 66 20 61 6c 6c 20 65 6e 74 72 69 65 73 20   of all entries 
28470 77 69 74 68 20 75 6e 69 78 53 68 6d 4e 6f 64 65  with unixShmNode
28480 2e 6e 52 65 66 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20  .nRef==0..**.** 
28490 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20 56 46  This is not a VF
284a0 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  S shared-memory 
284b0 6d 65 74 68 6f 64 3b 20 69 74 20 69 73 20 61 20  method; it is a 
284c0 75 74 69 6c 69 74 79 20 66 75 6e 63 74 69 6f 6e  utility function
284d0 20 63 61 6c 6c 65 64 0a 2a 2a 20 62 79 20 56 46   called.** by VF
284e0 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  S shared-memory 
284f0 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a 73 74 61 74  methods..*/.stat
28500 69 63 20 76 6f 69 64 20 75 6e 69 78 53 68 6d 50  ic void unixShmP
28510 75 72 67 65 28 75 6e 69 78 46 69 6c 65 20 2a 70  urge(unixFile *p
28520 46 64 29 7b 0a 20 20 75 6e 69 78 53 68 6d 4e 6f  Fd){.  unixShmNo
28530 64 65 20 2a 70 20 3d 20 70 46 64 2d 3e 70 49 6e  de *p = pFd->pIn
28540 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20  ode->pShmNode;. 
28550 20 61 73 73 65 72 74 28 20 75 6e 69 78 4d 75 74   assert( unixMut
28560 65 78 48 65 6c 64 28 29 20 29 3b 0a 20 20 69 66  exHeld() );.  if
28570 28 20 70 20 26 26 20 41 4c 57 41 59 53 28 70 2d  ( p && ALWAYS(p-
28580 3e 6e 52 65 66 3d 3d 30 29 20 29 7b 0a 20 20 20  >nRef==0) ){.   
28590 20 69 6e 74 20 6e 53 68 6d 50 65 72 4d 61 70 20   int nShmPerMap 
285a0 3d 20 75 6e 69 78 53 68 6d 52 65 67 69 6f 6e 50  = unixShmRegionP
285b0 65 72 4d 61 70 28 29 3b 0a 20 20 20 20 69 6e 74  erMap();.    int
285c0 20 69 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   i;.    assert( 
285d0 70 2d 3e 70 49 6e 6f 64 65 3d 3d 70 46 64 2d 3e  p->pInode==pFd->
285e0 70 49 6e 6f 64 65 20 29 3b 0a 20 20 20 20 73 71  pInode );.    sq
285f0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65  lite3_mutex_free
28600 28 70 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20  (p->mutex);.    
28610 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 52  for(i=0; i<p->nR
28620 65 67 69 6f 6e 3b 20 69 2b 3d 6e 53 68 6d 50 65  egion; i+=nShmPe
28630 72 4d 61 70 29 7b 0a 20 20 20 20 20 20 69 66 28  rMap){.      if(
28640 20 70 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20   p->h>=0 ){.    
28650 20 20 20 20 6f 73 4d 75 6e 6d 61 70 28 70 2d 3e      osMunmap(p->
28660 61 70 52 65 67 69 6f 6e 5b 69 5d 2c 20 70 2d 3e  apRegion[i], p->
28670 73 7a 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20 20  szRegion);.     
28680 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
28690 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e  sqlite3_free(p->
286a0 61 70 52 65 67 69 6f 6e 5b 69 5d 29 3b 0a 20 20  apRegion[i]);.  
286b0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
286c0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e  sqlite3_free(p->
286d0 61 70 52 65 67 69 6f 6e 29 3b 0a 20 20 20 20 69  apRegion);.    i
286e0 66 28 20 70 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20  f( p->h>=0 ){.  
286f0 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65      robust_close
28700 28 70 46 64 2c 20 70 2d 3e 68 2c 20 5f 5f 4c 49  (pFd, p->h, __LI
28710 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20 70 2d 3e  NE__);.      p->
28720 68 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20  h = -1;.    }.  
28730 20 20 70 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68    p->pInode->pSh
28740 6d 4e 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 73  mNode = 0;.    s
28750 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
28760 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65    }.}../*.** The
28770 20 44 4d 53 20 6c 6f 63 6b 20 68 61 73 20 6e 6f   DMS lock has no
28780 74 20 79 65 74 20 62 65 65 6e 20 74 61 6b 65 6e  t yet been taken
28790 20 6f 6e 20 73 68 6d 20 66 69 6c 65 20 70 53 68   on shm file pSh
287a0 6d 4e 6f 64 65 2e 20 41 74 74 65 6d 70 74 20 74  mNode. Attempt t
287b0 6f 0a 2a 2a 20 74 61 6b 65 20 69 74 20 6e 6f 77  o.** take it now
287c0 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  . Return SQLITE_
287d0 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  OK if successful
287e0 2c 20 6f 72 20 61 6e 20 53 51 4c 69 74 65 20 65  , or an SQLite e
287f0 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 6f 74 68  rror.** code oth
28800 65 72 77 69 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  erwise..**.** If
28810 20 74 68 65 20 44 4d 53 20 63 61 6e 6e 6f 74 20   the DMS cannot 
28820 62 65 20 6c 6f 63 6b 65 64 20 62 65 63 61 75 73  be locked becaus
28830 65 20 74 68 69 73 20 69 73 20 61 20 72 65 61 64  e this is a read
28840 6f 6e 6c 79 5f 73 68 6d 3d 31 20 0a 2a 2a 20 63  only_shm=1 .** c
28850 6f 6e 6e 65 63 74 69 6f 6e 20 61 6e 64 20 6e 6f  onnection and no
28860 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 61   other process a
28870 6c 72 65 61 64 79 20 68 6f 6c 64 73 20 61 20 6c  lready holds a l
28880 6f 63 6b 2c 20 72 65 74 75 72 6e 0a 2a 2a 20 53  ock, return.** S
28890 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 43  QLITE_READONLY_C
288a0 41 4e 54 49 4e 49 54 20 61 6e 64 20 73 65 74 20  ANTINIT and set 
288b0 70 53 68 6d 4e 6f 64 65 2d 3e 69 73 55 6e 6c 6f  pShmNode->isUnlo
288c0 63 6b 65 64 3d 31 2e 0a 2a 2f 0a 73 74 61 74 69  cked=1..*/.stati
288d0 63 20 69 6e 74 20 75 6e 69 78 4c 6f 63 6b 53 68  c int unixLockSh
288e0 61 72 65 64 4d 65 6d 6f 72 79 28 75 6e 69 78 46  aredMemory(unixF
288f0 69 6c 65 20 2a 70 44 62 46 64 2c 20 75 6e 69 78  ile *pDbFd, unix
28900 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64  ShmNode *pShmNod
28910 65 29 7b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f  e){.  struct flo
28920 63 6b 20 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20 72  ck lock;.  int r
28930 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
28940 20 20 2f 2a 20 55 73 65 20 46 5f 47 45 54 4c 4b    /* Use F_GETLK
28950 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68   to determine th
28960 65 20 6c 6f 63 6b 73 20 6f 74 68 65 72 20 70 72  e locks other pr
28970 6f 63 65 73 73 65 73 20 61 72 65 20 68 6f 6c 64  ocesses are hold
28980 69 6e 67 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20  ing.  ** on the 
28990 44 4d 53 20 62 79 74 65 2e 20 49 66 20 69 74 20  DMS byte. If it 
289a0 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 61  indicates that a
289b0 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69  nother process i
289c0 73 20 68 6f 6c 64 69 6e 67 0a 20 20 2a 2a 20 61  s holding.  ** a
289d0 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68   SHARED lock, th
289e0 65 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 20  en this process 
289f0 6d 61 79 20 61 6c 73 6f 20 74 61 6b 65 20 61 20  may also take a 
28a00 53 48 41 52 45 44 20 6c 6f 63 6b 0a 20 20 2a 2a  SHARED lock.  **
28a10 20 61 6e 64 20 70 72 6f 63 65 65 64 20 77 69 74   and proceed wit
28a20 68 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 2a 2d  h opening the *-
28a30 73 68 6d 20 66 69 6c 65 2e 20 0a 20 20 2a 2a 0a  shm file. .  **.
28a40 20 20 2a 2a 20 4f 72 2c 20 69 66 20 6e 6f 20 6f    ** Or, if no o
28a50 74 68 65 72 20 70 72 6f 63 65 73 73 20 69 73 20  ther process is 
28a60 68 6f 6c 64 69 6e 67 20 61 6e 79 20 6c 6f 63 6b  holding any lock
28a70 2c 20 74 68 65 6e 20 74 68 69 73 20 70 72 6f 63  , then this proc
28a80 65 73 73 0a 20 20 2a 2a 20 69 73 20 74 68 65 20  ess.  ** is the 
28a90 66 69 72 73 74 20 74 6f 20 6f 70 65 6e 20 69 74  first to open it
28aa0 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  . In this case t
28ab0 61 6b 65 20 61 6e 20 45 58 43 4c 55 53 49 56 45  ake an EXCLUSIVE
28ac0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 2a   lock on the.  *
28ad0 2a 20 44 4d 53 20 62 79 74 65 20 61 6e 64 20 74  * DMS byte and t
28ae0 72 75 6e 63 61 74 65 20 74 68 65 20 2a 2d 73 68  runcate the *-sh
28af0 6d 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20 62  m file to zero b
28b00 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 20 54 68  ytes in size. Th
28b10 65 6e 0a 20 20 2a 2a 20 64 6f 77 6e 67 72 61 64  en.  ** downgrad
28b20 65 20 74 6f 20 61 20 53 48 41 52 45 44 20 6c 6f  e to a SHARED lo
28b30 63 6b 20 6f 6e 20 74 68 65 20 44 4d 53 20 62 79  ck on the DMS by
28b40 74 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66  te..  **.  ** If
28b50 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73   another process
28b60 20 69 73 20 68 6f 6c 64 69 6e 67 20 61 6e 20 45   is holding an E
28b70 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e  XCLUSIVE lock on
28b80 20 74 68 65 20 44 4d 53 20 62 79 74 65 2c 0a 20   the DMS byte,. 
28b90 20 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54   ** return SQLIT
28ba0 45 5f 42 55 53 59 20 74 6f 20 74 68 65 20 63 61  E_BUSY to the ca
28bb0 6c 6c 65 72 20 28 69 74 20 77 69 6c 6c 20 74 72  ller (it will tr
28bc0 79 20 61 67 61 69 6e 29 2e 20 41 6e 20 65 61 72  y again). An ear
28bd0 6c 69 65 72 0a 20 20 2a 2a 20 76 65 72 73 69 6f  lier.  ** versio
28be0 6e 20 6f 66 20 74 68 69 73 20 63 6f 64 65 20 61  n of this code a
28bf0 74 74 65 6d 70 74 65 64 20 74 68 65 20 53 48 41  ttempted the SHA
28c00 52 45 44 20 6c 6f 63 6b 20 61 74 20 74 68 69 73  RED lock at this
28c10 20 70 6f 69 6e 74 2e 20 42 75 74 0a 20 20 2a 2a   point. But.  **
28c20 20 74 68 69 73 20 69 6e 74 72 6f 64 75 63 65 64   this introduced
28c30 20 61 20 73 75 62 74 6c 65 20 72 61 63 65 20 63   a subtle race c
28c40 6f 6e 64 69 74 69 6f 6e 3a 20 69 66 20 74 68 65  ondition: if the
28c50 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 69 6e 67   process holding
28c60 0a 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20  .  ** EXCLUSIVE 
28c70 66 61 69 6c 65 64 20 6a 75 73 74 20 62 65 66 6f  failed just befo
28c80 72 65 20 74 72 75 6e 63 61 74 69 6e 67 20 74 68  re truncating th
28c90 65 20 2a 2d 73 68 6d 20 66 69 6c 65 2c 20 74 68  e *-shm file, th
28ca0 65 6e 20 74 68 69 73 0a 20 20 2a 2a 20 70 72 6f  en this.  ** pro
28cb0 63 65 73 73 20 6d 69 67 68 74 20 6f 70 65 6e 20  cess might open 
28cc0 61 6e 64 20 75 73 65 20 74 68 65 20 2a 2d 73 68  and use the *-sh
28cd0 6d 20 66 69 6c 65 20 77 69 74 68 6f 75 74 20 74  m file without t
28ce0 72 75 6e 63 61 74 69 6e 67 20 69 74 2e 0a 20 20  runcating it..  
28cf0 2a 2a 20 41 6e 64 20 69 66 20 74 68 65 20 2a 2d  ** And if the *-
28d00 73 68 6d 20 66 69 6c 65 20 68 61 73 20 62 65 65  shm file has bee
28d10 6e 20 63 6f 72 72 75 70 74 65 64 20 62 79 20 61  n corrupted by a
28d20 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f   power failure o
28d30 72 0a 20 20 2a 2a 20 73 79 73 74 65 6d 20 63 72  r.  ** system cr
28d40 61 73 68 2c 20 74 68 65 20 64 61 74 61 62 61 73  ash, the databas
28d50 65 20 69 74 73 65 6c 66 20 6d 61 79 20 61 6c 73  e itself may als
28d60 6f 20 62 65 63 6f 6d 65 20 63 6f 72 72 75 70 74  o become corrupt
28d70 2e 20 20 2a 2f 0a 20 20 6c 6f 63 6b 2e 6c 5f 77  .  */.  lock.l_w
28d80 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54  hence = SEEK_SET
28d90 3b 0a 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74  ;.  lock.l_start
28da0 20 3d 20 55 4e 49 58 5f 53 48 4d 5f 44 4d 53 3b   = UNIX_SHM_DMS;
28db0 0a 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20  .  lock.l_len = 
28dc0 31 3b 0a 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65  1;.  lock.l_type
28dd0 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20 20 69 66   = F_WRLCK;.  if
28de0 28 20 6f 73 46 63 6e 74 6c 28 70 53 68 6d 4e 6f  ( osFcntl(pShmNo
28df0 64 65 2d 3e 68 2c 20 46 5f 47 45 54 4c 4b 2c 20  de->h, F_GETLK, 
28e00 26 6c 6f 63 6b 29 21 3d 30 20 29 20 7b 0a 20 20  &lock)!=0 ) {.  
28e10 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
28e20 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20 7d 65 6c 73  ERR_LOCK;.  }els
28e30 65 20 69 66 28 20 6c 6f 63 6b 2e 6c 5f 74 79 70  e if( lock.l_typ
28e40 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20  e==F_UNLCK ){.  
28e50 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e    if( pShmNode->
28e60 69 73 52 65 61 64 6f 6e 6c 79 20 29 7b 0a 20 20  isReadonly ){.  
28e70 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 69 73      pShmNode->is
28e80 55 6e 6c 6f 63 6b 65 64 20 3d 20 31 3b 0a 20 20  Unlocked = 1;.  
28e90 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
28ea0 52 45 41 44 4f 4e 4c 59 5f 43 41 4e 54 49 4e 49  READONLY_CANTINI
28eb0 54 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  T;.    }else{.  
28ec0 20 20 20 20 72 63 20 3d 20 75 6e 69 78 53 68 6d      rc = unixShm
28ed0 53 79 73 74 65 6d 4c 6f 63 6b 28 70 44 62 46 64  SystemLock(pDbFd
28ee0 2c 20 46 5f 57 52 4c 43 4b 2c 20 55 4e 49 58 5f  , F_WRLCK, UNIX_
28ef0 53 48 4d 5f 44 4d 53 2c 20 31 29 3b 0a 20 20 20  SHM_DMS, 1);.   
28f00 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
28f10 45 5f 4f 4b 20 26 26 20 72 6f 62 75 73 74 5f 66  E_OK && robust_f
28f20 74 72 75 6e 63 61 74 65 28 70 53 68 6d 4e 6f 64  truncate(pShmNod
28f30 65 2d 3e 68 2c 20 30 29 20 29 7b 0a 20 20 20 20  e->h, 0) ){.    
28f40 20 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67      rc = unixLog
28f50 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f 45  Error(SQLITE_IOE
28f60 52 52 5f 53 48 4d 4f 50 45 4e 2c 22 66 74 72 75  RR_SHMOPEN,"ftru
28f70 6e 63 61 74 65 22 2c 70 53 68 6d 4e 6f 64 65 2d  ncate",pShmNode-
28f80 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20  >zFilename);.   
28f90 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c     }.    }.  }el
28fa0 73 65 20 69 66 28 20 6c 6f 63 6b 2e 6c 5f 74 79  se if( lock.l_ty
28fb0 70 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 7b 0a 20  pe==F_WRLCK ){. 
28fc0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
28fd0 55 53 59 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  USY;.  }..  if( 
28fe0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
28ff0 0a 20 20 20 20 61 73 73 65 72 74 28 20 6c 6f 63  .    assert( loc
29000 6b 2e 6c 5f 74 79 70 65 3d 3d 46 5f 55 4e 4c 43  k.l_type==F_UNLC
29010 4b 20 7c 7c 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65  K || lock.l_type
29020 3d 3d 46 5f 52 44 4c 43 4b 20 29 3b 0a 20 20 20  ==F_RDLCK );.   
29030 20 72 63 20 3d 20 75 6e 69 78 53 68 6d 53 79 73   rc = unixShmSys
29040 74 65 6d 4c 6f 63 6b 28 70 44 62 46 64 2c 20 46  temLock(pDbFd, F
29050 5f 52 44 4c 43 4b 2c 20 55 4e 49 58 5f 53 48 4d  _RDLCK, UNIX_SHM
29060 5f 44 4d 53 2c 20 31 29 3b 0a 20 20 7d 0a 20 20  _DMS, 1);.  }.  
29070 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
29080 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
29090 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45  E__) && SQLITE_E
290a0 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
290b0 59 4c 45 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  YLE.static const
290c0 20 63 68 61 72 20 2a 70 72 6f 78 79 53 68 61 72   char *proxyShar
290d0 65 64 4d 65 6d 6f 72 79 42 61 73 65 50 61 74 68  edMemoryBasePath
290e0 28 75 6e 69 78 46 69 6c 65 20 2a 29 3b 0a 23 65  (unixFile *);.#e
290f0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e  ndif../*.** Open
29100 20 61 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79   a shared-memory
29110 20 61 72 65 61 20 61 73 73 6f 63 69 61 74 65 64   area associated
29120 20 77 69 74 68 20 6f 70 65 6e 20 64 61 74 61 62   with open datab
29130 61 73 65 20 66 69 6c 65 20 70 44 62 46 64 2e 20  ase file pDbFd. 
29140 20 0a 2a 2a 20 54 68 69 73 20 70 61 72 74 69 63   .** This partic
29150 75 6c 61 72 20 69 6d 70 6c 65 6d 65 6e 74 61 74  ular implementat
29160 69 6f 6e 20 75 73 65 73 20 6d 6d 61 70 70 65 64  ion uses mmapped
29170 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68   files..**.** Th
29180 65 20 66 69 6c 65 20 75 73 65 64 20 74 6f 20 69  e file used to i
29190 6d 70 6c 65 6d 65 6e 74 20 73 68 61 72 65 64 2d  mplement shared-
291a0 6d 65 6d 6f 72 79 20 69 73 20 69 6e 20 74 68 65  memory is in the
291b0 20 73 61 6d 65 20 64 69 72 65 63 74 6f 72 79 0a   same directory.
291c0 2a 2a 20 61 73 20 74 68 65 20 6f 70 65 6e 20 64  ** as the open d
291d0 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64  atabase file and
291e0 20 68 61 73 20 74 68 65 20 73 61 6d 65 20 6e 61   has the same na
291f0 6d 65 20 61 73 20 74 68 65 20 6f 70 65 6e 20 64  me as the open d
29200 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20  atabase.** file 
29210 77 69 74 68 20 74 68 65 20 22 2d 73 68 6d 22 20  with the "-shm" 
29220 73 75 66 66 69 78 20 61 64 64 65 64 2e 20 20 46  suffix added.  F
29230 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74  or example, if t
29240 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
29250 0a 2a 2a 20 69 73 20 22 2f 68 6f 6d 65 2f 75 73  .** is "/home/us
29260 65 72 31 2f 63 6f 6e 66 69 67 2e 64 62 22 20 74  er1/config.db" t
29270 68 65 6e 20 74 68 65 20 66 69 6c 65 20 74 68 61  hen the file tha
29280 74 20 69 73 20 63 72 65 61 74 65 64 20 61 6e 64  t is created and
29290 20 6d 6d 61 70 70 65 64 0a 2a 2a 20 66 6f 72 20   mmapped.** for 
292a0 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 77 69  shared memory wi
292b0 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 22 2f 68  ll be called "/h
292c0 6f 6d 65 2f 75 73 65 72 31 2f 63 6f 6e 66 69 67  ome/user1/config
292d0 2e 64 62 2d 73 68 6d 22 2e 20 20 0a 2a 2a 0a 2a  .db-shm".  .**.*
292e0 2a 20 41 6e 6f 74 68 65 72 20 61 70 70 72 6f 61  * Another approa
292f0 63 68 20 74 6f 20 69 73 20 74 6f 20 75 73 65 20  ch to is to use 
29300 66 69 6c 65 73 20 69 6e 20 2f 64 65 76 2f 73 68  files in /dev/sh
29310 6d 20 6f 72 20 2f 64 65 76 2f 74 6d 70 20 6f 72  m or /dev/tmp or
29320 20 61 6e 0a 2a 2a 20 73 6f 6d 65 20 6f 74 68 65   an.** some othe
29330 72 20 74 6d 70 66 73 20 6d 6f 75 6e 74 2e 20 42  r tmpfs mount. B
29340 75 74 20 69 66 20 61 20 66 69 6c 65 20 69 6e 20  ut if a file in 
29350 61 20 64 69 66 66 65 72 65 6e 74 20 64 69 72 65  a different dire
29360 63 74 6f 72 79 0a 2a 2a 20 66 72 6f 6d 20 74 68  ctory.** from th
29370 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
29380 69 73 20 75 73 65 64 2c 20 74 68 65 6e 20 64 69  is used, then di
29390 66 66 65 72 69 6e 67 20 61 63 63 65 73 73 20 70  ffering access p
293a0 65 72 6d 69 73 73 69 6f 6e 73 0a 2a 2a 20 6f 72  ermissions.** or
293b0 20 61 20 63 68 72 6f 6f 74 28 29 20 6d 69 67 68   a chroot() migh
293c0 74 20 63 61 75 73 65 20 74 77 6f 20 64 69 66 66  t cause two diff
293d0 65 72 65 6e 74 20 70 72 6f 63 65 73 73 65 73 20  erent processes 
293e0 6f 6e 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 64  on the same.** d
293f0 61 74 61 62 61 73 65 20 74 6f 20 65 6e 64 20 75  atabase to end u
29400 70 20 75 73 69 6e 67 20 64 69 66 66 65 72 65 6e  p using differen
29410 74 20 66 69 6c 65 73 20 66 6f 72 20 73 68 61 72  t files for shar
29420 65 64 20 6d 65 6d 6f 72 79 20 2d 20 0a 2a 2a 20  ed memory - .** 
29430 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 74 68 65  meaning that the
29440 69 72 20 6d 65 6d 6f 72 79 20 77 6f 75 6c 64 20  ir memory would 
29450 6e 6f 74 20 72 65 61 6c 6c 79 20 62 65 20 73 68  not really be sh
29460 61 72 65 64 20 2d 20 72 65 73 75 6c 74 69 6e 67  ared - resulting
29470 0a 2a 2a 20 69 6e 20 64 61 74 61 62 61 73 65 20  .** in database 
29480 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20 4e 65 76  corruption.  Nev
29490 65 72 74 68 65 6c 65 73 73 2c 20 74 68 69 73 20  ertheless, this 
294a0 74 6d 70 66 73 20 66 69 6c 65 20 75 73 61 67 65  tmpfs file usage
294b0 0a 2a 2a 20 63 61 6e 20 62 65 20 65 6e 61 62 6c  .** can be enabl
294c0 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69  ed at compile-ti
294d0 6d 65 20 75 73 69 6e 67 20 2d 44 53 51 4c 49 54  me using -DSQLIT
294e0 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 3d  E_SHM_DIRECTORY=
294f0 22 2f 64 65 76 2f 73 68 6d 22 0a 2a 2a 20 6f 72  "/dev/shm".** or
29500 20 74 68 65 20 65 71 75 69 76 61 6c 65 6e 74 2e   the equivalent.
29510 20 20 54 68 65 20 75 73 65 20 6f 66 20 74 68 65    The use of the
29520 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45   SQLITE_SHM_DIRE
29530 43 54 4f 52 59 20 63 6f 6d 70 69 6c 65 2d 74 69  CTORY compile-ti
29540 6d 65 0a 2a 2a 20 6f 70 74 69 6f 6e 20 72 65 73  me.** option res
29550 75 6c 74 73 20 69 6e 20 61 6e 20 69 6e 63 6f 6d  ults in an incom
29560 70 61 74 69 62 6c 65 20 62 75 69 6c 64 20 6f 66  patible build of
29570 20 53 51 4c 69 74 65 3b 20 20 62 75 69 6c 64 73   SQLite;  builds
29580 20 6f 66 20 53 51 4c 69 74 65 0a 2a 2a 20 74 68   of SQLite.** th
29590 61 74 20 77 69 74 68 20 64 69 66 66 65 72 69 6e  at with differin
295a0 67 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52  g SQLITE_SHM_DIR
295b0 45 43 54 4f 52 59 20 73 65 74 74 69 6e 67 73 20  ECTORY settings 
295c0 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20 74  attempt to use t
295d0 68 65 0a 2a 2a 20 73 61 6d 65 20 64 61 74 61 62  he.** same datab
295e0 61 73 65 20 66 69 6c 65 20 61 74 20 74 68 65 20  ase file at the 
295f0 73 61 6d 65 20 74 69 6d 65 2c 20 64 61 74 61 62  same time, datab
29600 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 77  ase corruption w
29610 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65  ill likely.** re
29620 73 75 6c 74 2e 20 54 68 65 20 53 51 4c 49 54 45  sult. The SQLITE
29630 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 20 63  _SHM_DIRECTORY c
29640 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69  ompile-time opti
29650 6f 6e 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64  on is considered
29660 0a 2a 2a 20 22 75 6e 73 75 70 70 6f 72 74 65 64  .** "unsupported
29670 22 20 61 6e 64 20 6d 61 79 20 67 6f 20 61 77 61  " and may go awa
29680 79 20 69 6e 20 61 20 66 75 74 75 72 65 20 53 51  y in a future SQ
29690 4c 69 74 65 20 72 65 6c 65 61 73 65 2e 0a 2a 2a  Lite release..**
296a0 0a 2a 2a 20 57 68 65 6e 20 6f 70 65 6e 69 6e 67  .** When opening
296b0 20 61 20 6e 65 77 20 73 68 61 72 65 64 2d 6d 65   a new shared-me
296c0 6d 6f 72 79 20 66 69 6c 65 2c 20 69 66 20 6e 6f  mory file, if no
296d0 20 6f 74 68 65 72 20 69 6e 73 74 61 6e 63 65 73   other instances
296e0 20 6f 66 20 74 68 61 74 0a 2a 2a 20 66 69 6c 65   of that.** file
296f0 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 6f   are currently o
29700 70 65 6e 2c 20 69 6e 20 74 68 69 73 20 70 72 6f  pen, in this pro
29710 63 65 73 73 20 6f 72 20 69 6e 20 6f 74 68 65 72  cess or in other
29720 20 70 72 6f 63 65 73 73 65 73 2c 20 74 68 65 6e   processes, then
29730 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20 6d 75 73  .** the file mus
29740 74 20 62 65 20 74 72 75 6e 63 61 74 65 64 20 74  t be truncated t
29750 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68 20 6f 72  o zero length or
29760 20 68 61 76 65 20 69 74 73 20 68 65 61 64 65 72   have its header
29770 20 63 6c 65 61 72 65 64 2e 0a 2a 2a 0a 2a 2a 20   cleared..**.** 
29780 49 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  If the original 
29790 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 70  database file (p
297a0 44 62 46 64 29 20 69 73 20 75 73 69 6e 67 20 74  DbFd) is using t
297b0 68 65 20 22 75 6e 69 78 2d 65 78 63 6c 22 20 56  he "unix-excl" V
297c0 46 53 0a 2a 2a 20 74 68 61 74 20 6d 65 61 6e 73  FS.** that means
297d0 20 74 68 61 74 20 61 6e 20 65 78 63 6c 75 73 69   that an exclusi
297e0 76 65 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20  ve lock is held 
297f0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
29800 66 69 6c 65 20 61 6e 64 0a 2a 2a 20 74 68 61 74  file and.** that
29810 20 6e 6f 20 6f 74 68 65 72 20 70 72 6f 63 65 73   no other proces
29820 73 65 73 20 61 72 65 20 61 62 6c 65 20 74 6f 20  ses are able to 
29830 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 68  read or write th
29840 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 6e 0a  e database.  In.
29850 2a 2a 20 74 68 61 74 20 63 61 73 65 2c 20 77 65  ** that case, we
29860 20 64 6f 20 6e 6f 74 20 72 65 61 6c 6c 79 20 6e   do not really n
29870 65 65 64 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  eed shared memor
29880 79 2e 20 20 4e 6f 20 73 68 61 72 65 64 20 6d 65  y.  No shared me
29890 6d 6f 72 79 0a 2a 2a 20 66 69 6c 65 20 69 73 20  mory.** file is 
298a0 63 72 65 61 74 65 64 2e 20 20 54 68 65 20 73 68  created.  The sh
298b0 61 72 65 64 20 6d 65 6d 6f 72 79 20 77 69 6c 6c  ared memory will
298c0 20 62 65 20 73 69 6d 75 6c 61 74 65 64 20 77 69   be simulated wi
298d0 74 68 20 68 65 61 70 20 6d 65 6d 6f 72 79 2e 0a  th heap memory..
298e0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
298f0 69 78 4f 70 65 6e 53 68 61 72 65 64 4d 65 6d 6f  ixOpenSharedMemo
29900 72 79 28 75 6e 69 78 46 69 6c 65 20 2a 70 44 62  ry(unixFile *pDb
29910 46 64 29 7b 0a 20 20 73 74 72 75 63 74 20 75 6e  Fd){.  struct un
29920 69 78 53 68 6d 20 2a 70 20 3d 20 30 3b 20 20 20  ixShm *p = 0;   
29930 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f         /* The co
29940 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 62 65 20 6f  nnection to be o
29950 70 65 6e 65 64 20 2a 2f 0a 20 20 73 74 72 75 63  pened */.  struc
29960 74 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70  t unixShmNode *p
29970 53 68 6d 4e 6f 64 65 3b 20 20 20 2f 2a 20 54 68  ShmNode;   /* Th
29980 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 6d 6d 61  e underlying mma
29990 70 70 65 64 20 66 69 6c 65 20 2a 2f 0a 20 20 69  pped file */.  i
299a0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
299b0 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  K;             /
299c0 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f  * Result code */
299d0 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  .  unixInodeInfo
299e0 20 2a 70 49 6e 6f 64 65 3b 20 20 20 20 20 20 20   *pInode;       
299f0 20 20 20 2f 2a 20 54 68 65 20 69 6e 6f 64 65 20     /* The inode 
29a00 6f 66 20 66 64 20 2a 2f 0a 20 20 63 68 61 72 20  of fd */.  char 
29a10 2a 7a 53 68 6d 3b 20 20 20 20 20 20 20 20 20 20  *zShm;          
29a20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
29a30 65 20 66 69 6c 65 20 75 73 65 64 20 66 6f 72 20  e file used for 
29a40 53 48 4d 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 68  SHM */.  int nSh
29a50 6d 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20  mFilename;      
29a60 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
29a70 20 6f 66 20 74 68 65 20 53 48 4d 20 66 69 6c 65   of the SHM file
29a80 6e 61 6d 65 20 69 6e 20 62 79 74 65 73 20 2a 2f  name in bytes */
29a90 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
29aa0 73 70 61 63 65 20 66 6f 72 20 74 68 65 20 6e 65  space for the ne
29ab0 77 20 75 6e 69 78 53 68 6d 20 6f 62 6a 65 63 74  w unixShm object
29ac0 2e 20 2a 2f 0a 20 20 70 20 3d 20 73 71 6c 69 74  . */.  p = sqlit
29ad0 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20 73 69 7a  e3_malloc64( siz
29ae0 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69 66 28  eof(*p) );.  if(
29af0 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53   p==0 ) return S
29b00 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  QLITE_NOMEM_BKPT
29b10 3b 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c  ;.  memset(p, 0,
29b20 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20   sizeof(*p));.  
29b30 61 73 73 65 72 74 28 20 70 44 62 46 64 2d 3e 70  assert( pDbFd->p
29b40 53 68 6d 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  Shm==0 );..  /* 
29b50 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20  Check to see if 
29b60 61 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f 62  a unixShmNode ob
29b70 6a 65 63 74 20 61 6c 72 65 61 64 79 20 65 78 69  ject already exi
29b80 73 74 73 2e 20 52 65 75 73 65 20 61 6e 20 65 78  sts. Reuse an ex
29b90 69 73 74 69 6e 67 0a 20 20 2a 2a 20 6f 6e 65 20  isting.  ** one 
29ba0 69 66 20 70 72 65 73 65 6e 74 2e 20 43 72 65 61  if present. Crea
29bb0 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 69 66 20  te a new one if 
29bc0 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a  necessary..  */.
29bd0 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
29be0 28 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70  ();.  pInode = p
29bf0 44 62 46 64 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20  DbFd->pInode;.  
29c00 70 53 68 6d 4e 6f 64 65 20 3d 20 70 49 6e 6f 64  pShmNode = pInod
29c10 65 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 69  e->pShmNode;.  i
29c20 66 28 20 70 53 68 6d 4e 6f 64 65 3d 3d 30 20 29  f( pShmNode==0 )
29c30 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73 74 61  {.    struct sta
29c40 74 20 73 53 74 61 74 3b 20 20 20 20 20 20 20 20  t sStat;        
29c50 20 20 20 20 20 20 20 20 20 2f 2a 20 66 73 74 61           /* fsta
29c60 74 28 29 20 69 6e 66 6f 20 66 6f 72 20 64 61 74  t() info for dat
29c70 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 23 69  abase file */.#i
29c80 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 53 48 4d  fndef SQLITE_SHM
29c90 5f 44 49 52 45 43 54 4f 52 59 0a 20 20 20 20 63  _DIRECTORY.    c
29ca0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 42 61 73 65  onst char *zBase
29cb0 50 61 74 68 20 3d 20 70 44 62 46 64 2d 3e 7a 50  Path = pDbFd->zP
29cc0 61 74 68 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20  ath;.#endif..   
29cd0 20 2f 2a 20 43 61 6c 6c 20 66 73 74 61 74 28 29   /* Call fstat()
29ce0 20 74 6f 20 66 69 67 75 72 65 20 6f 75 74 20 74   to figure out t
29cf0 68 65 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 6f  he permissions o
29d00 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
29d10 69 6c 65 2e 20 49 66 0a 20 20 20 20 2a 2a 20 61  ile. If.    ** a
29d20 20 6e 65 77 20 2a 2d 73 68 6d 20 66 69 6c 65 20   new *-shm file 
29d30 69 73 20 63 72 65 61 74 65 64 2c 20 61 6e 20 61  is created, an a
29d40 74 74 65 6d 70 74 20 77 69 6c 6c 20 62 65 20 6d  ttempt will be m
29d50 61 64 65 20 74 6f 20 63 72 65 61 74 65 20 69 74  ade to create it
29d60 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 74 68 65  .    ** with the
29d70 20 73 61 6d 65 20 70 65 72 6d 69 73 73 69 6f 6e   same permission
29d80 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  s..    */.    if
29d90 28 20 6f 73 46 73 74 61 74 28 70 44 62 46 64 2d  ( osFstat(pDbFd-
29da0 3e 68 2c 20 26 73 53 74 61 74 29 20 29 7b 0a 20  >h, &sStat) ){. 
29db0 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72       storeLastEr
29dc0 72 6e 6f 28 70 44 62 46 64 2c 20 65 72 72 6e 6f  rno(pDbFd, errno
29dd0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  );.      rc = SQ
29de0 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54  LITE_IOERR_FSTAT
29df0 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d  ;.      goto shm
29e00 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d  _open_err;.    }
29e10 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  ..#if defined(__
29e20 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49  APPLE__) && SQLI
29e30 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
29e40 47 5f 53 54 59 4c 45 20 5c 0a 20 20 20 20 20 20  G_STYLE \.      
29e50 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
29e60 54 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59  TE_SHM_DIRECTORY
29e70 29 0a 20 20 20 20 2f 2a 20 49 66 20 70 44 62 46  ).    /* If pDbF
29e80 64 20 69 73 20 63 6f 6e 66 69 67 75 72 65 64 20  d is configured 
29e90 77 69 74 68 20 70 72 6f 78 79 20 6c 6f 63 6b 69  with proxy locki
29ea0 6e 67 20 6d 6f 64 65 2c 20 75 73 65 20 74 68 65  ng mode, use the
29eb0 20 6c 6f 63 61 6c 20 0a 20 20 20 20 2a 2a 20 6c   local .    ** l
29ec0 6f 63 6b 20 66 69 6c 65 20 70 61 74 68 20 74 6f  ock file path to
29ed0 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 2d   determine the -
29ee0 73 68 6d 20 66 69 6c 65 20 70 61 74 68 0a 20 20  shm file path.  
29ef0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 73 50    */.    if( isP
29f00 72 6f 78 79 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28  roxyLockingMode(
29f10 70 44 62 46 64 29 20 29 7b 0a 20 20 20 20 20 20  pDbFd) ){.      
29f20 7a 42 61 73 65 50 61 74 68 20 3d 20 70 72 6f 78  zBasePath = prox
29f30 79 53 68 61 72 65 64 4d 65 6d 6f 72 79 42 61 73  ySharedMemoryBas
29f40 65 50 61 74 68 28 70 44 62 46 64 29 3b 0a 20 20  ePath(pDbFd);.  
29f50 20 20 20 20 69 66 28 20 21 7a 42 61 73 65 50 61      if( !zBasePa
29f60 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  th ){.        rc
29f70 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50   = SQLITE_CANTOP
29f80 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20  EN_BKPT;.       
29f90 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65   goto shm_open_e
29fa0 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rr;.      }.    
29fb0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 0a 23 69  }.#endif.    .#i
29fc0 66 64 65 66 20 53 51 4c 49 54 45 5f 53 48 4d 5f  fdef SQLITE_SHM_
29fd0 44 49 52 45 43 54 4f 52 59 0a 20 20 20 20 6e 53  DIRECTORY.    nS
29fe0 68 6d 46 69 6c 65 6e 61 6d 65 20 3d 20 73 69 7a  hmFilename = siz
29ff0 65 6f 66 28 53 51 4c 49 54 45 5f 53 48 4d 5f 44  eof(SQLITE_SHM_D
2a000 49 52 45 43 54 4f 52 59 29 20 2b 20 33 31 3b 0a  IRECTORY) + 31;.
2a010 23 65 6c 73 65 0a 20 20 20 20 6e 53 68 6d 46 69  #else.    nShmFi
2a020 6c 65 6e 61 6d 65 20 3d 20 36 20 2b 20 28 69 6e  lename = 6 + (in
2a030 74 29 73 74 72 6c 65 6e 28 7a 42 61 73 65 50 61  t)strlen(zBasePa
2a040 74 68 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  th);.#endif.    
2a050 70 53 68 6d 4e 6f 64 65 20 3d 20 73 71 6c 69 74  pShmNode = sqlit
2a060 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20 73 69 7a  e3_malloc64( siz
2a070 65 6f 66 28 2a 70 53 68 6d 4e 6f 64 65 29 20 2b  eof(*pShmNode) +
2a080 20 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 20 29 3b   nShmFilename );
2a090 0a 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64  .    if( pShmNod
2a0a0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  e==0 ){.      rc
2a0b0 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f   = SQLITE_NOMEM_
2a0c0 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f  BKPT;.      goto
2a0d0 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20   shm_open_err;. 
2a0e0 20 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28     }.    memset(
2a0f0 70 53 68 6d 4e 6f 64 65 2c 20 30 2c 20 73 69 7a  pShmNode, 0, siz
2a100 65 6f 66 28 2a 70 53 68 6d 4e 6f 64 65 29 2b 6e  eof(*pShmNode)+n
2a110 53 68 6d 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  ShmFilename);.  
2a120 20 20 7a 53 68 6d 20 3d 20 70 53 68 6d 4e 6f 64    zShm = pShmNod
2a130 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 28  e->zFilename = (
2a140 63 68 61 72 2a 29 26 70 53 68 6d 4e 6f 64 65 5b  char*)&pShmNode[
2a150 31 5d 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  1];.#ifdef SQLIT
2a160 45 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 0a  E_SHM_DIRECTORY.
2a170 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
2a180 69 6e 74 66 28 6e 53 68 6d 46 69 6c 65 6e 61 6d  intf(nShmFilenam
2a190 65 2c 20 7a 53 68 6d 2c 20 0a 20 20 20 20 20 20  e, zShm, .      
2a1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
2a1b0 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54  QLITE_SHM_DIRECT
2a1c0 4f 52 59 20 22 2f 73 71 6c 69 74 65 2d 73 68 6d  ORY "/sqlite-shm
2a1d0 2d 25 78 2d 25 78 22 2c 0a 20 20 20 20 20 20 20  -%x-%x",.       
2a1e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 75                (u
2a1f0 33 32 29 73 53 74 61 74 2e 73 74 5f 69 6e 6f 2c  32)sStat.st_ino,
2a200 20 28 75 33 32 29 73 53 74 61 74 2e 73 74 5f 64   (u32)sStat.st_d
2a210 65 76 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 73  ev);.#else.    s
2a220 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
2a230 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20 7a 53  nShmFilename, zS
2a240 68 6d 2c 20 22 25 73 2d 73 68 6d 22 2c 20 7a 42  hm, "%s-shm", zB
2a250 61 73 65 50 61 74 68 29 3b 0a 20 20 20 20 73 71  asePath);.    sq
2a260 6c 69 74 65 33 46 69 6c 65 53 75 66 66 69 78 33  lite3FileSuffix3
2a270 28 70 44 62 46 64 2d 3e 7a 50 61 74 68 2c 20 7a  (pDbFd->zPath, z
2a280 53 68 6d 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  Shm);.#endif.   
2a290 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 20 3d 20 2d   pShmNode->h = -
2a2a0 31 3b 0a 20 20 20 20 70 44 62 46 64 2d 3e 70 49  1;.    pDbFd->pI
2a2b0 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d  node->pShmNode =
2a2c0 20 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 20 20 70   pShmNode;.    p
2a2d0 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64 65 20  ShmNode->pInode 
2a2e0 3d 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 3b  = pDbFd->pInode;
2a2f0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
2a300 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f  GlobalConfig.bCo
2a310 72 65 4d 75 74 65 78 20 29 7b 0a 20 20 20 20 20  reMutex ){.     
2a320 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78   pShmNode->mutex
2a330 20 3d 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78   = sqlite3_mutex
2a340 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  _alloc(SQLITE_MU
2a350 54 45 58 5f 46 41 53 54 29 3b 0a 20 20 20 20 20  TEX_FAST);.     
2a360 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d   if( pShmNode->m
2a370 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20  utex==0 ){.     
2a380 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
2a390 4f 4d 45 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 20  OMEM_BKPT;.     
2a3a0 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e     goto shm_open
2a3b0 5f 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _err;.      }.  
2a3c0 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 49 6e    }..    if( pIn
2a3d0 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63  ode->bProcessLoc
2a3e0 6b 3d 3d 30 20 29 7b 0a 23 69 66 64 65 66 20 5f  k==0 ){.#ifdef _
2a3f0 5f 41 50 50 4c 45 5f 5f 0a 20 20 20 20 20 20 2f  _APPLE__.      /
2a400 2a 20 4f 6e 20 4d 61 63 4f 53 20 61 6e 64 20 69  * On MacOS and i
2a410 4f 53 2c 20 61 76 6f 69 64 20 65 76 65 6e 20 74  OS, avoid even t
2a420 72 79 69 6e 67 20 74 6f 20 6f 70 65 6e 20 61 20  rying to open a 
2a430 72 65 61 64 2d 6f 6e 6c 79 20 53 48 4d 20 66 69  read-only SHM fi
2a440 6c 65 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20  le.      ** for 
2a450 77 72 69 74 69 6e 67 2c 20 62 65 63 61 75 73 65  writing, because
2a460 20 64 6f 69 6e 67 20 73 6f 20 67 65 6e 65 72 61   doing so genera
2a470 74 65 73 20 73 63 61 72 79 20 6c 6f 67 20 6d 65  tes scary log me
2a480 73 73 61 67 65 73 20 2a 2f 0a 20 20 20 20 20 20  ssages */.      
2a490 69 66 28 20 6f 73 41 63 63 65 73 73 28 7a 53 68  if( osAccess(zSh
2a4a0 6d 2c 20 52 5f 4f 4b 7c 57 5f 4f 4b 29 21 3d 30  m, R_OK|W_OK)!=0
2a4b0 20 26 26 20 28 65 72 72 6e 6f 3d 3d 45 50 45 52   && (errno==EPER
2a4c0 4d 20 7c 7c 20 65 72 72 6e 6f 3d 3d 45 41 43 43  M || errno==EACC
2a4d0 45 53 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ES) ){.        p
2a4e0 53 68 6d 4e 6f 64 65 2d 3e 68 20 3d 20 2d 31 3b  ShmNode->h = -1;
2a4f0 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e  .      }else.#en
2a500 64 69 66 0a 20 20 20 20 20 20 69 66 28 20 30 3d  dif.      if( 0=
2a510 3d 73 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f  =sqlite3_uri_boo
2a520 6c 65 61 6e 28 70 44 62 46 64 2d 3e 7a 50 61 74  lean(pDbFd->zPat
2a530 68 2c 20 22 72 65 61 64 6f 6e 6c 79 5f 73 68 6d  h, "readonly_shm
2a540 22 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20  ", 0) ){.       
2a550 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 20 3d 20 72   pShmNode->h = r
2a560 6f 62 75 73 74 5f 6f 70 65 6e 28 7a 53 68 6d 2c  obust_open(zShm,
2a570 20 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54 2c   O_RDWR|O_CREAT,
2a580 20 28 73 53 74 61 74 2e 73 74 5f 6d 6f 64 65 26   (sStat.st_mode&
2a590 30 37 37 37 29 29 3b 0a 20 20 20 20 20 20 7d 0a  0777));.      }.
2a5a0 20 20 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f        if( pShmNo
2a5b0 64 65 2d 3e 68 3c 30 20 29 7b 0a 20 20 20 20 20  de->h<0 ){.     
2a5c0 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 20 3d     pShmNode->h =
2a5d0 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28 7a 53 68   robust_open(zSh
2a5e0 6d 2c 20 4f 5f 52 44 4f 4e 4c 59 2c 20 28 73 53  m, O_RDONLY, (sS
2a5f0 74 61 74 2e 73 74 5f 6d 6f 64 65 26 30 37 37 37  tat.st_mode&0777
2a600 29 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ));.        if( 
2a610 70 53 68 6d 4e 6f 64 65 2d 3e 68 3c 30 20 29 7b  pShmNode->h<0 ){
2a620 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
2a630 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c  unixLogError(SQL
2a640 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50  ITE_CANTOPEN_BKP
2a650 54 2c 20 22 6f 70 65 6e 22 2c 20 7a 53 68 6d 29  T, "open", zShm)
2a660 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
2a670 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20   shm_open_err;. 
2a680 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2a690 20 70 53 68 6d 4e 6f 64 65 2d 3e 69 73 52 65 61   pShmNode->isRea
2a6a0 64 6f 6e 6c 79 20 3d 20 31 3b 0a 20 20 20 20 20  donly = 1;.     
2a6b0 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   }..      /* If 
2a6c0 74 68 69 73 20 70 72 6f 63 65 73 73 20 69 73 20  this process is 
2a6d0 72 75 6e 6e 69 6e 67 20 61 73 20 72 6f 6f 74 2c  running as root,
2a6e0 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
2a6f0 74 68 65 20 53 48 4d 20 66 69 6c 65 0a 20 20 20  the SHM file.   
2a700 20 20 20 2a 2a 20 69 73 20 6f 77 6e 65 64 20 62     ** is owned b
2a710 79 20 74 68 65 20 73 61 6d 65 20 75 73 65 72 20  y the same user 
2a720 74 68 61 74 20 6f 77 6e 73 20 74 68 65 20 6f 72  that owns the or
2a730 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 2e  iginal database.
2a740 20 20 4f 74 68 65 72 77 69 73 65 2c 0a 20 20 20    Otherwise,.   
2a750 20 20 20 2a 2a 20 74 68 65 20 6f 72 69 67 69 6e     ** the origin
2a760 61 6c 20 6f 77 6e 65 72 20 77 69 6c 6c 20 6e 6f  al owner will no
2a770 74 20 62 65 20 61 62 6c 65 20 74 6f 20 63 6f 6e  t be able to con
2a780 6e 65 63 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  nect..      */. 
2a790 20 20 20 20 20 72 6f 62 75 73 74 46 63 68 6f 77       robustFchow
2a7a0 6e 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 73  n(pShmNode->h, s
2a7b0 53 74 61 74 2e 73 74 5f 75 69 64 2c 20 73 53 74  Stat.st_uid, sSt
2a7c0 61 74 2e 73 74 5f 67 69 64 29 3b 0a 0a 20 20 20  at.st_gid);..   
2a7d0 20 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 63 6b     rc = unixLock
2a7e0 53 68 61 72 65 64 4d 65 6d 6f 72 79 28 70 44 62  SharedMemory(pDb
2a7f0 46 64 2c 20 70 53 68 6d 4e 6f 64 65 29 3b 0a 20  Fd, pShmNode);. 
2a800 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
2a810 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51  ITE_OK && rc!=SQ
2a820 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 43 41  LITE_READONLY_CA
2a830 4e 54 49 4e 49 54 20 29 20 67 6f 74 6f 20 73 68  NTINIT ) goto sh
2a840 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20  m_open_err;.    
2a850 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65  }.  }..  /* Make
2a860 20 74 68 65 20 6e 65 77 20 63 6f 6e 6e 65 63 74   the new connect
2a870 69 6f 6e 20 61 20 63 68 69 6c 64 20 6f 66 20 74  ion a child of t
2a880 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a  he unixShmNode *
2a890 2f 0a 20 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 20  /.  p->pShmNode 
2a8a0 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a 23 69 66 64  = pShmNode;.#ifd
2a8b0 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
2a8c0 20 20 70 2d 3e 69 64 20 3d 20 70 53 68 6d 4e 6f    p->id = pShmNo
2a8d0 64 65 2d 3e 6e 65 78 74 53 68 6d 49 64 2b 2b 3b  de->nextShmId++;
2a8e0 0a 23 65 6e 64 69 66 0a 20 20 70 53 68 6d 4e 6f  .#endif.  pShmNo
2a8f0 64 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 70 44  de->nRef++;.  pD
2a900 62 46 64 2d 3e 70 53 68 6d 20 3d 20 70 3b 0a 20  bFd->pShm = p;. 
2a910 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
2a920 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 72 65 66  );..  /* The ref
2a930 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20  erence count on 
2a940 70 53 68 6d 4e 6f 64 65 20 68 61 73 20 61 6c 72  pShmNode has alr
2a950 65 61 64 79 20 62 65 65 6e 20 69 6e 63 72 65 6d  eady been increm
2a960 65 6e 74 65 64 20 75 6e 64 65 72 0a 20 20 2a 2a  ented under.  **
2a970 20 74 68 65 20 63 6f 76 65 72 20 6f 66 20 74 68   the cover of th
2a980 65 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78  e unixEnterMutex
2a990 28 29 20 6d 75 74 65 78 20 61 6e 64 20 74 68 65  () mutex and the
2a9a0 20 70 6f 69 6e 74 65 72 20 66 72 6f 6d 20 74 68   pointer from th
2a9b0 65 0a 20 20 2a 2a 20 6e 65 77 20 28 73 74 72 75  e.  ** new (stru
2a9c0 63 74 20 75 6e 69 78 53 68 6d 29 20 6f 62 6a 65  ct unixShm) obje
2a9d0 63 74 20 74 6f 20 74 68 65 20 70 53 68 6d 4e 6f  ct to the pShmNo
2a9e0 64 65 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e  de has been set.
2a9f0 20 41 6c 6c 20 74 68 61 74 20 69 73 0a 20 20 2a   All that is.  *
2aa00 2a 20 6c 65 66 74 20 74 6f 20 64 6f 20 69 73 20  * left to do is 
2aa10 74 6f 20 6c 69 6e 6b 20 74 68 65 20 6e 65 77 20  to link the new 
2aa20 6f 62 6a 65 63 74 20 69 6e 74 6f 20 74 68 65 20  object into the 
2aa30 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 74 61 72  linked list star
2aa40 74 69 6e 67 0a 20 20 2a 2a 20 61 74 20 70 53 68  ting.  ** at pSh
2aa50 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 2e 20 54  mNode->pFirst. T
2aa60 68 69 73 20 6d 75 73 74 20 62 65 20 64 6f 6e 65  his must be done
2aa70 20 77 68 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74   while holding t
2aa80 68 65 20 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  he pShmNode->mut
2aa90 65 78 20 0a 20 20 2a 2a 20 6d 75 74 65 78 2e 0a  ex .  ** mutex..
2aaa0 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d    */.  sqlite3_m
2aab0 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e  utex_enter(pShmN
2aac0 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70  ode->mutex);.  p
2aad0 2d 3e 70 4e 65 78 74 20 3d 20 70 53 68 6d 4e 6f  ->pNext = pShmNo
2aae0 64 65 2d 3e 70 46 69 72 73 74 3b 0a 20 20 70 53  de->pFirst;.  pS
2aaf0 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 20 3d  hmNode->pFirst =
2ab00 20 70 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75   p;.  sqlite3_mu
2ab10 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f  tex_leave(pShmNo
2ab20 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  de->mutex);.  re
2ab30 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 4a  turn rc;..  /* J
2ab40 75 6d 70 20 68 65 72 65 20 6f 6e 20 61 6e 79 20  ump here on any 
2ab50 65 72 72 6f 72 20 2a 2f 0a 73 68 6d 5f 6f 70 65  error */.shm_ope
2ab60 6e 5f 65 72 72 3a 0a 20 20 75 6e 69 78 53 68 6d  n_err:.  unixShm
2ab70 50 75 72 67 65 28 70 44 62 46 64 29 3b 20 20 20  Purge(pDbFd);   
2ab80 20 20 20 20 2f 2a 20 54 68 69 73 20 63 61 6c 6c      /* This call
2ab90 20 66 72 65 65 73 20 70 53 68 6d 4e 6f 64 65 20   frees pShmNode 
2aba0 69 66 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20  if required */. 
2abb0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
2abc0 3b 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74  ;.  unixLeaveMut
2abd0 65 78 28 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ex();.  return r
2abe0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
2abf0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
2ac00 6c 65 64 20 74 6f 20 6f 62 74 61 69 6e 20 61 20  led to obtain a 
2ac10 70 6f 69 6e 74 65 72 20 74 6f 20 72 65 67 69 6f  pointer to regio
2ac20 6e 20 69 52 65 67 69 6f 6e 20 6f 66 20 74 68 65  n iRegion of the
2ac30 20 0a 2a 2a 20 73 68 61 72 65 64 2d 6d 65 6d 6f   .** shared-memo
2ac40 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ry associated wi
2ac50 74 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20  th the database 
2ac60 66 69 6c 65 20 66 64 2e 20 53 68 61 72 65 64 2d  file fd. Shared-
2ac70 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 73 20 0a  memory regions .
2ac80 2a 2a 20 61 72 65 20 6e 75 6d 62 65 72 65 64 20  ** are numbered 
2ac90 73 74 61 72 74 69 6e 67 20 66 72 6f 6d 20 7a 65  starting from ze
2aca0 72 6f 2e 20 45 61 63 68 20 73 68 61 72 65 64 2d  ro. Each shared-
2acb0 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20 69 73  memory region is
2acc0 20 73 7a 52 65 67 69 6f 6e 20 0a 2a 2a 20 62 79   szRegion .** by
2acd0 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a  tes in size..**.
2ace0 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
2acf0 63 63 75 72 73 2c 20 61 6e 20 65 72 72 6f 72 20  ccurs, an error 
2ad00 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
2ad10 20 61 6e 64 20 2a 70 70 20 69 73 20 73 65 74 20   and *pp is set 
2ad20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 4f  to NULL..**.** O
2ad30 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68 65  therwise, if the
2ad40 20 62 45 78 74 65 6e 64 20 70 61 72 61 6d 65 74   bExtend paramet
2ad50 65 72 20 69 73 20 30 20 61 6e 64 20 74 68 65 20  er is 0 and the 
2ad60 72 65 71 75 65 73 74 65 64 20 73 68 61 72 65 64  requested shared
2ad70 2d 6d 65 6d 6f 72 79 0a 2a 2a 20 72 65 67 69 6f  -memory.** regio
2ad80 6e 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 61  n has not been a
2ad90 6c 6c 6f 63 61 74 65 64 20 28 62 79 20 61 6e 79  llocated (by any
2ada0 20 63 6c 69 65 6e 74 2c 20 69 6e 63 6c 75 64 69   client, includi
2adb0 6e 67 20 6f 6e 65 20 72 75 6e 6e 69 6e 67 20 69  ng one running i
2adc0 6e 20 61 0a 2a 2a 20 73 65 70 61 72 61 74 65 20  n a.** separate 
2add0 70 72 6f 63 65 73 73 29 2c 20 74 68 65 6e 20 2a  process), then *
2ade0 70 70 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c  pp is set to NUL
2adf0 4c 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20  L and SQLITE_OK 
2ae00 72 65 74 75 72 6e 65 64 2e 20 49 66 20 0a 2a 2a  returned. If .**
2ae10 20 62 45 78 74 65 6e 64 20 69 73 20 6e 6f 6e 2d   bExtend is non-
2ae20 7a 65 72 6f 20 61 6e 64 20 74 68 65 20 72 65 71  zero and the req
2ae30 75 65 73 74 65 64 20 73 68 61 72 65 64 2d 6d 65  uested shared-me
2ae40 6d 6f 72 79 20 72 65 67 69 6f 6e 20 68 61 73 20  mory region has 
2ae50 6e 6f 74 20 79 65 74 20 0a 2a 2a 20 62 65 65 6e  not yet .** been
2ae60 20 61 6c 6c 6f 63 61 74 65 64 2c 20 69 74 20 69   allocated, it i
2ae70 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74  s allocated by t
2ae80 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  his function..**
2ae90 0a 2a 2a 20 49 66 20 74 68 65 20 73 68 61 72 65  .** If the share
2aea0 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e 20  d-memory region 
2aeb0 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
2aec0 20 61 6c 6c 6f 63 61 74 65 64 20 6f 72 20 69 73   allocated or is
2aed0 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 0a 2a 2a   allocated by.**
2aee0 20 74 68 69 73 20 63 61 6c 6c 20 61 73 20 64 65   this call as de
2aef0 73 63 72 69 62 65 64 20 61 62 6f 76 65 2c 20 74  scribed above, t
2af00 68 65 6e 20 69 74 20 69 73 20 6d 61 70 70 65 64  hen it is mapped
2af10 20 69 6e 74 6f 20 74 68 69 73 20 70 72 6f 63 65   into this proce
2af20 73 73 65 73 20 0a 2a 2a 20 61 64 64 72 65 73 73  sses .** address
2af30 20 73 70 61 63 65 20 28 69 66 20 69 74 20 69 73   space (if it is
2af40 20 6e 6f 74 20 61 6c 72 65 61 64 79 29 2c 20 2a   not already), *
2af50 70 70 20 69 73 20 73 65 74 20 74 6f 20 70 6f 69  pp is set to poi
2af60 6e 74 20 74 6f 20 74 68 65 20 6d 61 70 70 65 64  nt to the mapped
2af70 20 0a 2a 2a 20 6d 65 6d 6f 72 79 20 61 6e 64 20   .** memory and 
2af80 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
2af90 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
2afa0 74 20 75 6e 69 78 53 68 6d 4d 61 70 28 0a 20 20  t unixShmMap(.  
2afb0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
2afc0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2afd0 2f 2a 20 48 61 6e 64 6c 65 20 6f 70 65 6e 20 6f  /* Handle open o
2afe0 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  n database file 
2aff0 2a 2f 0a 20 20 69 6e 74 20 69 52 65 67 69 6f 6e  */.  int iRegion
2b000 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2b010 20 20 20 20 20 2f 2a 20 52 65 67 69 6f 6e 20 74       /* Region t
2b020 6f 20 72 65 74 72 69 65 76 65 20 2a 2f 0a 20 20  o retrieve */.  
2b030 69 6e 74 20 73 7a 52 65 67 69 6f 6e 2c 20 20 20  int szRegion,   
2b040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b050 2f 2a 20 53 69 7a 65 20 6f 66 20 72 65 67 69 6f  /* Size of regio
2b060 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 62 45 78 74  ns */.  int bExt
2b070 65 6e 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  end,            
2b080 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2b090 74 6f 20 65 78 74 65 6e 64 20 66 69 6c 65 20 69  to extend file i
2b0a0 66 20 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a 20  f necessary */. 
2b0b0 20 76 6f 69 64 20 76 6f 6c 61 74 69 6c 65 20 2a   void volatile *
2b0c0 2a 70 70 20 20 20 20 20 20 20 20 20 20 20 20 20  *pp             
2b0d0 20 2f 2a 20 4f 55 54 3a 20 4d 61 70 70 65 64 20   /* OUT: Mapped 
2b0e0 6d 65 6d 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20 75  memory */.){.  u
2b0f0 6e 69 78 46 69 6c 65 20 2a 70 44 62 46 64 20 3d  nixFile *pDbFd =
2b100 20 28 75 6e 69 78 46 69 6c 65 2a 29 66 64 3b 0a   (unixFile*)fd;.
2b110 20 20 75 6e 69 78 53 68 6d 20 2a 70 3b 0a 20 20    unixShm *p;.  
2b120 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68  unixShmNode *pSh
2b130 6d 4e 6f 64 65 3b 0a 20 20 69 6e 74 20 72 63 20  mNode;.  int rc 
2b140 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
2b150 6e 74 20 6e 53 68 6d 50 65 72 4d 61 70 20 3d 20  nt nShmPerMap = 
2b160 75 6e 69 78 53 68 6d 52 65 67 69 6f 6e 50 65 72  unixShmRegionPer
2b170 4d 61 70 28 29 3b 0a 20 20 69 6e 74 20 6e 52 65  Map();.  int nRe
2b180 71 52 65 67 69 6f 6e 3b 0a 0a 20 20 2f 2a 20 49  qRegion;..  /* I
2b190 66 20 74 68 65 20 73 68 61 72 65 64 2d 6d 65 6d  f the shared-mem
2b1a0 6f 72 79 20 66 69 6c 65 20 68 61 73 20 6e 6f 74  ory file has not
2b1b0 20 79 65 74 20 62 65 65 6e 20 6f 70 65 6e 65 64   yet been opened
2b1c0 2c 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e 20 2a  , open it now. *
2b1d0 2f 0a 20 20 69 66 28 20 70 44 62 46 64 2d 3e 70  /.  if( pDbFd->p
2b1e0 53 68 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63  Shm==0 ){.    rc
2b1f0 20 3d 20 75 6e 69 78 4f 70 65 6e 53 68 61 72 65   = unixOpenShare
2b200 64 4d 65 6d 6f 72 79 28 70 44 62 46 64 29 3b 0a  dMemory(pDbFd);.
2b210 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2b220 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
2b230 63 3b 0a 20 20 7d 0a 0a 20 20 70 20 3d 20 70 44  c;.  }..  p = pD
2b240 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 70 53 68  bFd->pShm;.  pSh
2b250 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d 4e  mNode = p->pShmN
2b260 6f 64 65 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ode;.  sqlite3_m
2b270 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e  utex_enter(pShmN
2b280 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69  ode->mutex);.  i
2b290 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 69 73 55  f( pShmNode->isU
2b2a0 6e 6c 6f 63 6b 65 64 20 29 7b 0a 20 20 20 20 72  nlocked ){.    r
2b2b0 63 20 3d 20 75 6e 69 78 4c 6f 63 6b 53 68 61 72  c = unixLockShar
2b2c0 65 64 4d 65 6d 6f 72 79 28 70 44 62 46 64 2c 20  edMemory(pDbFd, 
2b2d0 70 53 68 6d 4e 6f 64 65 29 3b 0a 20 20 20 20 69  pShmNode);.    i
2b2e0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2b2f0 20 29 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f   ) goto shmpage_
2b300 6f 75 74 3b 0a 20 20 20 20 70 53 68 6d 4e 6f 64  out;.    pShmNod
2b310 65 2d 3e 69 73 55 6e 6c 6f 63 6b 65 64 20 3d 20  e->isUnlocked = 
2b320 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  0;.  }.  assert(
2b330 20 73 7a 52 65 67 69 6f 6e 3d 3d 70 53 68 6d 4e   szRegion==pShmN
2b340 6f 64 65 2d 3e 73 7a 52 65 67 69 6f 6e 20 7c 7c  ode->szRegion ||
2b350 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69   pShmNode->nRegi
2b360 6f 6e 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  on==0 );.  asser
2b370 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e  t( pShmNode->pIn
2b380 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f  ode==pDbFd->pIno
2b390 64 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  de );.  assert( 
2b3a0 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 7c  pShmNode->h>=0 |
2b3b0 7c 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d  | pDbFd->pInode-
2b3c0 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 31  >bProcessLock==1
2b3d0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53   );.  assert( pS
2b3e0 68 6d 4e 6f 64 65 2d 3e 68 3c 30 20 7c 7c 20 70  hmNode->h<0 || p
2b3f0 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50  DbFd->pInode->bP
2b400 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 3b  rocessLock==0 );
2b410 0a 0a 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 6e  ..  /* Minimum n
2b420 75 6d 62 65 72 20 6f 66 20 72 65 67 69 6f 6e 73  umber of regions
2b430 20 72 65 71 75 69 72 65 64 20 74 6f 20 62 65 20   required to be 
2b440 6d 61 70 70 65 64 2e 20 2a 2f 0a 20 20 6e 52 65  mapped. */.  nRe
2b450 71 52 65 67 69 6f 6e 20 3d 20 28 28 69 52 65 67  qRegion = ((iReg
2b460 69 6f 6e 2b 6e 53 68 6d 50 65 72 4d 61 70 29 20  ion+nShmPerMap) 
2b470 2f 20 6e 53 68 6d 50 65 72 4d 61 70 29 20 2a 20  / nShmPerMap) * 
2b480 6e 53 68 6d 50 65 72 4d 61 70 3b 0a 0a 20 20 69  nShmPerMap;..  i
2b490 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  f( pShmNode->nRe
2b4a0 67 69 6f 6e 3c 6e 52 65 71 52 65 67 69 6f 6e 20  gion<nReqRegion 
2b4b0 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 2a 61 70  ){.    char **ap
2b4c0 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20  New;            
2b4d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77            /* New
2b4e0 20 61 70 52 65 67 69 6f 6e 5b 5d 20 61 72 72 61   apRegion[] arra
2b4f0 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42 79  y */.    int nBy
2b500 74 65 20 3d 20 6e 52 65 71 52 65 67 69 6f 6e 2a  te = nReqRegion*
2b510 73 7a 52 65 67 69 6f 6e 3b 20 20 20 2f 2a 20 4d  szRegion;   /* M
2b520 69 6e 69 6d 75 6d 20 72 65 71 75 69 72 65 64 20  inimum required 
2b530 66 69 6c 65 20 73 69 7a 65 20 2a 2f 0a 20 20 20  file size */.   
2b540 20 73 74 72 75 63 74 20 73 74 61 74 20 73 53 74   struct stat sSt
2b550 61 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  at;             
2b560 20 20 20 20 2f 2a 20 55 73 65 64 20 62 79 20 66      /* Used by f
2b570 73 74 61 74 28 29 20 2a 2f 0a 0a 20 20 20 20 70  stat() */..    p
2b580 53 68 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67 69 6f  ShmNode->szRegio
2b590 6e 20 3d 20 73 7a 52 65 67 69 6f 6e 3b 0a 0a 20  n = szRegion;.. 
2b5a0 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d     if( pShmNode-
2b5b0 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  >h>=0 ){.      /
2b5c0 2a 20 54 68 65 20 72 65 71 75 65 73 74 65 64 20  * The requested 
2b5d0 72 65 67 69 6f 6e 20 69 73 20 6e 6f 74 20 6d 61  region is not ma
2b5e0 70 70 65 64 20 69 6e 74 6f 20 74 68 69 73 20 70  pped into this p
2b5f0 72 6f 63 65 73 73 65 73 20 61 64 64 72 65 73 73  rocesses address
2b600 20 73 70 61 63 65 2e 0a 20 20 20 20 20 20 2a 2a   space..      **
2b610 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
2b620 20 69 74 20 68 61 73 20 62 65 65 6e 20 61 6c 6c   it has been all
2b630 6f 63 61 74 65 64 20 28 69 2e 65 2e 20 69 66 20  ocated (i.e. if 
2b640 74 68 65 20 77 61 6c 2d 69 6e 64 65 78 20 66 69  the wal-index fi
2b650 6c 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 6c  le is.      ** l
2b660 61 72 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 63  arge enough to c
2b670 6f 6e 74 61 69 6e 20 74 68 65 20 72 65 71 75 65  ontain the reque
2b680 73 74 65 64 20 72 65 67 69 6f 6e 29 2e 0a 20 20  sted region)..  
2b690 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
2b6a0 20 6f 73 46 73 74 61 74 28 70 53 68 6d 4e 6f 64   osFstat(pShmNod
2b6b0 65 2d 3e 68 2c 20 26 73 53 74 61 74 29 20 29 7b  e->h, &sStat) ){
2b6c0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
2b6d0 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49  LITE_IOERR_SHMSI
2b6e0 5a 45 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  ZE;.        goto
2b6f0 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20   shmpage_out;.  
2b700 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 69      }.  .      i
2b710 66 28 20 73 53 74 61 74 2e 73 74 5f 73 69 7a 65  f( sStat.st_size
2b720 3c 6e 42 79 74 65 20 29 7b 0a 20 20 20 20 20 20  <nByte ){.      
2b730 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74    /* The request
2b740 65 64 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e  ed memory region
2b750 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e   does not exist.
2b760 20 49 66 20 62 45 78 74 65 6e 64 20 69 73 20 73   If bExtend is s
2b770 65 74 20 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a  et to.        **
2b780 20 66 61 6c 73 65 2c 20 65 78 69 74 20 65 61 72   false, exit ear
2b790 6c 79 2e 20 2a 70 70 20 77 69 6c 6c 20 62 65 20  ly. *pp will be 
2b7a0 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20  set to NULL and 
2b7b0 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
2b7c0 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ed..        */. 
2b7d0 20 20 20 20 20 20 20 69 66 28 20 21 62 45 78 74         if( !bExt
2b7e0 65 6e 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20  end ){.         
2b7f0 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75   goto shmpage_ou
2b800 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  t;.        }..  
2b810 20 20 20 20 20 20 2f 2a 20 41 6c 74 65 72 6e 61        /* Alterna
2b820 74 69 76 65 6c 79 2c 20 69 66 20 62 45 78 74 65  tively, if bExte
2b830 6e 64 20 69 73 20 74 72 75 65 2c 20 65 78 74 65  nd is true, exte
2b840 6e 64 20 74 68 65 20 66 69 6c 65 2e 20 44 6f 20  nd the file. Do 
2b850 74 68 69 73 20 62 79 0a 20 20 20 20 20 20 20 20  this by.        
2b860 2a 2a 20 77 72 69 74 69 6e 67 20 61 20 73 69 6e  ** writing a sin
2b870 67 6c 65 20 62 79 74 65 20 74 6f 20 74 68 65 20  gle byte to the 
2b880 65 6e 64 20 6f 66 20 65 61 63 68 20 28 4f 53 29  end of each (OS)
2b890 20 70 61 67 65 20 62 65 69 6e 67 0a 20 20 20 20   page being.    
2b8a0 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64      ** allocated
2b8b0 20 6f 72 20 65 78 74 65 6e 64 65 64 2e 20 54 65   or extended. Te
2b8c0 63 68 6e 69 63 61 6c 6c 79 2c 20 77 65 20 6e 65  chnically, we ne
2b8d0 65 64 20 6f 6e 6c 79 20 77 72 69 74 65 20 74 6f  ed only write to
2b8e0 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
2b8f0 6c 61 73 74 20 70 61 67 65 20 69 6e 20 6f 72 64  last page in ord
2b900 65 72 20 74 6f 20 65 78 74 65 6e 64 20 74 68 65  er to extend the
2b910 20 66 69 6c 65 2e 20 42 75 74 20 77 72 69 74 69   file. But writi
2b920 6e 67 20 74 6f 20 61 6c 6c 20 6e 65 77 0a 20 20  ng to all new.  
2b930 20 20 20 20 20 20 2a 2a 20 70 61 67 65 73 20 66        ** pages f
2b940 6f 72 63 65 73 20 74 68 65 20 4f 53 20 74 6f 20  orces the OS to 
2b950 61 6c 6c 6f 63 61 74 65 20 74 68 65 6d 20 69 6d  allocate them im
2b960 6d 65 64 69 61 74 65 6c 79 2c 20 77 68 69 63 68  mediately, which
2b970 20 72 65 64 75 63 65 73 0a 20 20 20 20 20 20 20   reduces.       
2b980 20 2a 2a 20 74 68 65 20 63 68 61 6e 63 65 73 20   ** the chances 
2b990 6f 66 20 53 49 47 42 55 53 20 77 68 69 6c 65 20  of SIGBUS while 
2b9a0 61 63 63 65 73 73 69 6e 67 20 74 68 65 20 6d 61  accessing the ma
2b9b0 70 70 65 64 20 72 65 67 69 6f 6e 20 6c 61 74 65  pped region late
2b9c0 72 20 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2f  r on..        */
2b9d0 0a 20 20 20 20 20 20 20 20 65 6c 73 65 7b 0a 20  .        else{. 
2b9e0 20 20 20 20 20 20 20 20 20 73 74 61 74 69 63 20           static 
2b9f0 63 6f 6e 73 74 20 69 6e 74 20 70 67 73 7a 20 3d  const int pgsz =
2ba00 20 34 30 39 36 3b 0a 20 20 20 20 20 20 20 20 20   4096;.         
2ba10 20 69 6e 74 20 69 50 67 3b 0a 0a 20 20 20 20 20   int iPg;..     
2ba20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 6f       /* Write to
2ba30 20 74 68 65 20 6c 61 73 74 20 62 79 74 65 20 6f   the last byte o
2ba40 66 20 65 61 63 68 20 6e 65 77 6c 79 20 61 6c 6c  f each newly all
2ba50 6f 63 61 74 65 64 20 6f 72 20 65 78 74 65 6e 64  ocated or extend
2ba60 65 64 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20  ed page */.     
2ba70 20 20 20 20 20 61 73 73 65 72 74 28 20 28 6e 42       assert( (nB
2ba80 79 74 65 20 25 20 70 67 73 7a 29 3d 3d 30 20 29  yte % pgsz)==0 )
2ba90 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  ;.          for(
2baa0 69 50 67 3d 28 73 53 74 61 74 2e 73 74 5f 73 69  iPg=(sStat.st_si
2bab0 7a 65 2f 70 67 73 7a 29 3b 20 69 50 67 3c 28 6e  ze/pgsz); iPg<(n
2bac0 42 79 74 65 2f 70 67 73 7a 29 3b 20 69 50 67 2b  Byte/pgsz); iPg+
2bad0 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
2bae0 69 6e 74 20 78 20 3d 20 30 3b 0a 20 20 20 20 20  int x = 0;.     
2baf0 20 20 20 20 20 20 20 69 66 28 20 73 65 65 6b 41         if( seekA
2bb00 6e 64 57 72 69 74 65 46 64 28 70 53 68 6d 4e 6f  ndWriteFd(pShmNo
2bb10 64 65 2d 3e 68 2c 20 69 50 67 2a 70 67 73 7a 20  de->h, iPg*pgsz 
2bb20 2b 20 70 67 73 7a 2d 31 2c 20 22 22 2c 20 31 2c  + pgsz-1, "", 1,
2bb30 20 26 78 29 21 3d 31 20 29 7b 0a 20 20 20 20 20   &x)!=1 ){.     
2bb40 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63           const c
2bb50 68 61 72 20 2a 7a 46 69 6c 65 20 3d 20 70 53 68  har *zFile = pSh
2bb60 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65  mNode->zFilename
2bb70 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2bb80 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f  rc = unixLogErro
2bb90 72 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  r(SQLITE_IOERR_S
2bba0 48 4d 53 49 5a 45 2c 20 22 77 72 69 74 65 22 2c  HMSIZE, "write",
2bbb0 20 7a 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20   zFile);.       
2bbc0 20 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 70         goto shmp
2bbd0 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20  age_out;.       
2bbe0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2bbf0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
2bc00 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
2bc10 2f 2a 20 4d 61 70 20 74 68 65 20 72 65 71 75 65  /* Map the reque
2bc20 73 74 65 64 20 6d 65 6d 6f 72 79 20 72 65 67 69  sted memory regi
2bc30 6f 6e 20 69 6e 74 6f 20 74 68 69 73 20 70 72 6f  on into this pro
2bc40 63 65 73 73 65 73 20 61 64 64 72 65 73 73 20 73  cesses address s
2bc50 70 61 63 65 2e 20 2a 2f 0a 20 20 20 20 61 70 4e  pace. */.    apN
2bc60 65 77 20 3d 20 28 63 68 61 72 20 2a 2a 29 73 71  ew = (char **)sq
2bc70 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 0a 20  lite3_realloc(. 
2bc80 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d         pShmNode-
2bc90 3e 61 70 52 65 67 69 6f 6e 2c 20 6e 52 65 71 52  >apRegion, nReqR
2bca0 65 67 69 6f 6e 2a 73 69 7a 65 6f 66 28 63 68 61  egion*sizeof(cha
2bcb0 72 20 2a 29 0a 20 20 20 20 29 3b 0a 20 20 20 20  r *).    );.    
2bcc0 69 66 28 20 21 61 70 4e 65 77 20 29 7b 0a 20 20  if( !apNew ){.  
2bcd0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2bce0 49 4f 45 52 52 5f 4e 4f 4d 45 4d 5f 42 4b 50 54  IOERR_NOMEM_BKPT
2bcf0 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d  ;.      goto shm
2bd00 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  page_out;.    }.
2bd10 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 70      pShmNode->ap
2bd20 52 65 67 69 6f 6e 20 3d 20 61 70 4e 65 77 3b 0a  Region = apNew;.
2bd30 20 20 20 20 77 68 69 6c 65 28 20 70 53 68 6d 4e      while( pShmN
2bd40 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c 6e 52 65  ode->nRegion<nRe
2bd50 71 52 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 20  qRegion ){.     
2bd60 20 69 6e 74 20 6e 4d 61 70 20 3d 20 73 7a 52 65   int nMap = szRe
2bd70 67 69 6f 6e 2a 6e 53 68 6d 50 65 72 4d 61 70 3b  gion*nShmPerMap;
2bd80 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
2bd90 20 20 20 20 76 6f 69 64 20 2a 70 4d 65 6d 3b 0a      void *pMem;.
2bda0 20 20 20 20 20 20 69 66 28 20 70 53 68 6d 4e 6f        if( pShmNo
2bdb0 64 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20  de->h>=0 ){.    
2bdc0 20 20 20 20 70 4d 65 6d 20 3d 20 6f 73 4d 6d 61      pMem = osMma
2bdd0 70 28 30 2c 20 6e 4d 61 70 2c 0a 20 20 20 20 20  p(0, nMap,.     
2bde0 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d         pShmNode-
2bdf0 3e 69 73 52 65 61 64 6f 6e 6c 79 20 3f 20 50 52  >isReadonly ? PR
2be00 4f 54 5f 52 45 41 44 20 3a 20 50 52 4f 54 5f 52  OT_READ : PROT_R
2be10 45 41 44 7c 50 52 4f 54 5f 57 52 49 54 45 2c 20  EAD|PROT_WRITE, 
2be20 0a 20 20 20 20 20 20 20 20 20 20 20 20 4d 41 50  .            MAP
2be30 5f 53 48 41 52 45 44 2c 20 70 53 68 6d 4e 6f 64  _SHARED, pShmNod
2be40 65 2d 3e 68 2c 20 73 7a 52 65 67 69 6f 6e 2a 28  e->h, szRegion*(
2be50 69 36 34 29 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  i64)pShmNode->nR
2be60 65 67 69 6f 6e 0a 20 20 20 20 20 20 20 20 29 3b  egion.        );
2be70 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4d 65  .        if( pMe
2be80 6d 3d 3d 4d 41 50 5f 46 41 49 4c 45 44 20 29 7b  m==MAP_FAILED ){
2be90 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
2bea0 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c  unixLogError(SQL
2beb0 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4d 41 50  ITE_IOERR_SHMMAP
2bec0 2c 20 22 6d 6d 61 70 22 2c 20 70 53 68 6d 4e 6f  , "mmap", pShmNo
2bed0 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  de->zFilename);.
2bee0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 73            goto s
2bef0 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  hmpage_out;.    
2bf00 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
2bf10 65 7b 0a 20 20 20 20 20 20 20 20 70 4d 65 6d 20  e{.        pMem 
2bf20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
2bf30 36 34 28 73 7a 52 65 67 69 6f 6e 29 3b 0a 20 20  64(szRegion);.  
2bf40 20 20 20 20 20 20 69 66 28 20 70 4d 65 6d 3d 3d        if( pMem==
2bf50 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  0 ){.          r
2bf60 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
2bf70 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 20  _BKPT;.         
2bf80 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75   goto shmpage_ou
2bf90 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
2bfa0 20 20 20 20 20 6d 65 6d 73 65 74 28 70 4d 65 6d       memset(pMem
2bfb0 2c 20 30 2c 20 73 7a 52 65 67 69 6f 6e 29 3b 0a  , 0, szRegion);.
2bfc0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 66        }..      f
2bfd0 6f 72 28 69 3d 30 3b 20 69 3c 6e 53 68 6d 50 65  or(i=0; i<nShmPe
2bfe0 72 4d 61 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  rMap; i++){.    
2bff0 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 70      pShmNode->ap
2c000 52 65 67 69 6f 6e 5b 70 53 68 6d 4e 6f 64 65 2d  Region[pShmNode-
2c010 3e 6e 52 65 67 69 6f 6e 2b 69 5d 20 3d 20 26 28  >nRegion+i] = &(
2c020 28 63 68 61 72 2a 29 70 4d 65 6d 29 5b 73 7a 52  (char*)pMem)[szR
2c030 65 67 69 6f 6e 2a 69 5d 3b 0a 20 20 20 20 20 20  egion*i];.      
2c040 7d 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65  }.      pShmNode
2c050 2d 3e 6e 52 65 67 69 6f 6e 20 2b 3d 20 6e 53 68  ->nRegion += nSh
2c060 6d 50 65 72 4d 61 70 3b 0a 20 20 20 20 7d 0a 20  mPerMap;.    }. 
2c070 20 7d 0a 0a 73 68 6d 70 61 67 65 5f 6f 75 74 3a   }..shmpage_out:
2c080 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d  .  if( pShmNode-
2c090 3e 6e 52 65 67 69 6f 6e 3e 69 52 65 67 69 6f 6e  >nRegion>iRegion
2c0a0 20 29 7b 0a 20 20 20 20 2a 70 70 20 3d 20 70 53   ){.    *pp = pS
2c0b0 68 6d 4e 6f 64 65 2d 3e 61 70 52 65 67 69 6f 6e  hmNode->apRegion
2c0c0 5b 69 52 65 67 69 6f 6e 5d 3b 0a 20 20 7d 65 6c  [iRegion];.  }el
2c0d0 73 65 7b 0a 20 20 20 20 2a 70 70 20 3d 20 30 3b  se{.    *pp = 0;
2c0e0 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 68 6d 4e  .  }.  if( pShmN
2c0f0 6f 64 65 2d 3e 69 73 52 65 61 64 6f 6e 6c 79 20  ode->isReadonly 
2c100 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
2c110 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52   ) rc = SQLITE_R
2c120 45 41 44 4f 4e 4c 59 3b 0a 20 20 73 71 6c 69 74  EADONLY;.  sqlit
2c130 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70  e3_mutex_leave(p
2c140 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b  ShmNode->mutex);
2c150 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2c160 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
2c170 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 66 6f 72  e lock state for
2c180 20 61 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79   a shared-memory
2c190 20 73 65 67 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20   segment..**.** 
2c1a0 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 72 65  Note that the re
2c1b0 6c 61 74 69 6f 6e 73 68 69 70 20 62 65 74 77 65  lationship betwe
2c1c0 65 6e 20 53 48 41 52 45 64 20 61 6e 64 20 45 58  en SHAREd and EX
2c1d0 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73 20 69 73  CLUSIVE locks is
2c1e0 20 61 20 6c 69 74 74 6c 65 0a 2a 2a 20 64 69 66   a little.** dif
2c1f0 66 65 72 65 6e 74 20 68 65 72 65 20 74 68 61 6e  ferent here than
2c200 20 69 6e 20 70 6f 73 69 78 2e 20 20 49 6e 20 78   in posix.  In x
2c210 53 68 6d 4c 6f 63 6b 28 29 2c 20 6f 6e 65 20 63  ShmLock(), one c
2c220 61 6e 20 67 6f 20 66 72 6f 6d 20 75 6e 6c 6f 63  an go from unloc
2c230 6b 65 64 0a 2a 2a 20 74 6f 20 73 68 61 72 65 64  ked.** to shared
2c240 20 61 6e 64 20 62 61 63 6b 20 6f 72 20 66 72 6f   and back or fro
2c250 6d 20 75 6e 6c 6f 63 6b 65 64 20 74 6f 20 65 78  m unlocked to ex
2c260 63 6c 75 73 69 76 65 20 61 6e 64 20 62 61 63 6b  clusive and back
2c270 2e 20 20 42 75 74 20 6f 6e 65 20 6d 61 79 0a 2a  .  But one may.*
2c280 2a 20 6e 6f 74 20 67 6f 20 66 72 6f 6d 20 73 68  * not go from sh
2c290 61 72 65 64 20 74 6f 20 65 78 63 6c 75 73 69 76  ared to exclusiv
2c2a0 65 20 6f 72 20 66 72 6f 6d 20 65 78 63 6c 75 73  e or from exclus
2c2b0 69 76 65 20 74 6f 20 73 68 61 72 65 64 2e 0a 2a  ive to shared..*
2c2c0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
2c2d0 78 53 68 6d 4c 6f 63 6b 28 0a 20 20 73 71 6c 69  xShmLock(.  sqli
2c2e0 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20  te3_file *fd,   
2c2f0 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
2c300 73 65 20 66 69 6c 65 20 68 6f 6c 64 69 6e 67 20  se file holding 
2c310 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  the shared memor
2c320 79 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 73 74 2c  y */.  int ofst,
2c330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c340 20 20 2f 2a 20 46 69 72 73 74 20 6c 6f 63 6b 20    /* First lock 
2c350 74 6f 20 61 63 71 75 69 72 65 20 6f 72 20 72 65  to acquire or re
2c360 6c 65 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  lease */.  int n
2c370 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2c380 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2c390 6f 66 20 6c 6f 63 6b 73 20 74 6f 20 61 63 71 75  of locks to acqu
2c3a0 69 72 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a  ire or release *
2c3b0 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20  /.  int flags   
2c3c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2c3d0 2a 20 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74  * What to do wit
2c3e0 68 20 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a 29 7b  h the lock */.){
2c3f0 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 44 62  .  unixFile *pDb
2c400 46 64 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  Fd = (unixFile*)
2c410 66 64 3b 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e  fd;      /* Conn
2c420 65 63 74 69 6f 6e 20 68 6f 6c 64 69 6e 67 20 73  ection holding s
2c430 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a  hared memory */.
2c440 20 20 75 6e 69 78 53 68 6d 20 2a 70 20 3d 20 70    unixShm *p = p
2c450 44 62 46 64 2d 3e 70 53 68 6d 3b 20 20 20 20 20  DbFd->pShm;     
2c460 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73          /* The s
2c470 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 62 65 69  hared memory bei
2c480 6e 67 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75  ng locked */.  u
2c490 6e 69 78 53 68 6d 20 2a 70 58 3b 20 20 20 20 20  nixShm *pX;     
2c4a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c4b0 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70       /* For loop
2c4c0 69 6e 67 20 6f 76 65 72 20 61 6c 6c 20 73 69 62  ing over all sib
2c4d0 6c 69 6e 67 73 20 2a 2f 0a 20 20 75 6e 69 78 53  lings */.  unixS
2c4e0 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65  hmNode *pShmNode
2c4f0 20 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 20   = p->pShmNode; 
2c500 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69   /* The underlyi
2c510 6e 67 20 66 69 6c 65 20 69 4e 6f 64 65 20 2a 2f  ng file iNode */
2c520 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
2c530 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
2c540 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
2c550 6c 74 20 63 6f 64 65 20 2a 2f 0a 20 20 75 31 36  lt code */.  u16
2c560 20 6d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20   mask;          
2c570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c580 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f     /* Mask of lo
2c590 63 6b 73 20 74 6f 20 74 61 6b 65 20 6f 72 20 72  cks to take or r
2c5a0 65 6c 65 61 73 65 20 2a 2f 0a 0a 20 20 61 73 73  elease */..  ass
2c5b0 65 72 74 28 20 70 53 68 6d 4e 6f 64 65 3d 3d 70  ert( pShmNode==p
2c5c0 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53  DbFd->pInode->pS
2c5d0 68 6d 4e 6f 64 65 20 29 3b 0a 20 20 61 73 73 65  hmNode );.  asse
2c5e0 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49  rt( pShmNode->pI
2c5f0 6e 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e  node==pDbFd->pIn
2c600 6f 64 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ode );.  assert(
2c610 20 6f 66 73 74 3e 3d 30 20 26 26 20 6f 66 73 74   ofst>=0 && ofst
2c620 2b 6e 3c 3d 53 51 4c 49 54 45 5f 53 48 4d 5f 4e  +n<=SQLITE_SHM_N
2c630 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  LOCK );.  assert
2c640 28 20 6e 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65  ( n>=1 );.  asse
2c650 72 74 28 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49  rt( flags==(SQLI
2c660 54 45 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51  TE_SHM_LOCK | SQ
2c670 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 29  LITE_SHM_SHARED)
2c680 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c 61 67 73  .       || flags
2c690 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f  ==(SQLITE_SHM_LO
2c6a0 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f  CK | SQLITE_SHM_
2c6b0 45 58 43 4c 55 53 49 56 45 29 0a 20 20 20 20 20  EXCLUSIVE).     
2c6c0 20 20 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c    || flags==(SQL
2c6d0 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c  ITE_SHM_UNLOCK |
2c6e0 20 53 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52   SQLITE_SHM_SHAR
2c6f0 45 44 29 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c  ED).       || fl
2c700 61 67 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d  ags==(SQLITE_SHM
2c710 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45  _UNLOCK | SQLITE
2c720 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 20  _SHM_EXCLUSIVE) 
2c730 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d  );.  assert( n==
2c740 31 20 7c 7c 20 28 66 6c 61 67 73 20 26 20 53 51  1 || (flags & SQ
2c750 4c 49 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49  LITE_SHM_EXCLUSI
2c760 56 45 29 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  VE)!=0 );.  asse
2c770 72 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e  rt( pShmNode->h>
2c780 3d 30 20 7c 7c 20 70 44 62 46 64 2d 3e 70 49 6e  =0 || pDbFd->pIn
2c790 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63  ode->bProcessLoc
2c7a0 6b 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74  k==1 );.  assert
2c7b0 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3c 30 20  ( pShmNode->h<0 
2c7c0 7c 7c 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65  || pDbFd->pInode
2c7d0 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d  ->bProcessLock==
2c7e0 30 20 29 3b 0a 0a 20 20 6d 61 73 6b 20 3d 20 28  0 );..  mask = (
2c7f0 31 3c 3c 28 6f 66 73 74 2b 6e 29 29 20 2d 20 28  1<<(ofst+n)) - (
2c800 31 3c 3c 6f 66 73 74 29 3b 0a 20 20 61 73 73 65  1<<ofst);.  asse
2c810 72 74 28 20 6e 3e 31 20 7c 7c 20 6d 61 73 6b 3d  rt( n>1 || mask=
2c820 3d 28 31 3c 3c 6f 66 73 74 29 20 29 3b 0a 20 20  =(1<<ofst) );.  
2c830 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
2c840 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  ter(pShmNode->mu
2c850 74 65 78 29 3b 0a 20 20 69 66 28 20 66 6c 61 67  tex);.  if( flag
2c860 73 20 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f 55  s & SQLITE_SHM_U
2c870 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 75 31 36  NLOCK ){.    u16
2c880 20 61 6c 6c 4d 61 73 6b 20 3d 20 30 3b 20 2f 2a   allMask = 0; /*
2c890 20 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b 73 20 68   Mask of locks h
2c8a0 65 6c 64 20 62 79 20 73 69 62 6c 69 6e 67 73 20  eld by siblings 
2c8b0 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 65 20 69  */..    /* See i
2c8c0 66 20 61 6e 79 20 73 69 62 6c 69 6e 67 73 20 68  f any siblings h
2c8d0 6f 6c 64 20 74 68 69 73 20 73 61 6d 65 20 6c 6f  old this same lo
2c8e0 63 6b 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58  ck */.    for(pX
2c8f0 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73  =pShmNode->pFirs
2c900 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e  t; pX; pX=pX->pN
2c910 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ext){.      if( 
2c920 70 58 3d 3d 70 20 29 20 63 6f 6e 74 69 6e 75 65  pX==p ) continue
2c930 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
2c940 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20  (pX->exclMask & 
2c950 28 70 2d 3e 65 78 63 6c 4d 61 73 6b 7c 70 2d 3e  (p->exclMask|p->
2c960 73 68 61 72 65 64 4d 61 73 6b 29 29 3d 3d 30 20  sharedMask))==0 
2c970 29 3b 0a 20 20 20 20 20 20 61 6c 6c 4d 61 73 6b  );.      allMask
2c980 20 7c 3d 20 70 58 2d 3e 73 68 61 72 65 64 4d 61   |= pX->sharedMa
2c990 73 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  sk;.    }..    /
2c9a0 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 73 79 73  * Unlock the sys
2c9b0 74 65 6d 2d 6c 65 76 65 6c 20 6c 6f 63 6b 73 20  tem-level locks 
2c9c0 2a 2f 0a 20 20 20 20 69 66 28 20 28 6d 61 73 6b  */.    if( (mask
2c9d0 20 26 20 61 6c 6c 4d 61 73 6b 29 3d 3d 30 20 29   & allMask)==0 )
2c9e0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69  {.      rc = uni
2c9f0 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70  xShmSystemLock(p
2ca00 44 62 46 64 2c 20 46 5f 55 4e 4c 43 4b 2c 20 6f  DbFd, F_UNLCK, o
2ca10 66 73 74 2b 55 4e 49 58 5f 53 48 4d 5f 42 41 53  fst+UNIX_SHM_BAS
2ca20 45 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65  E, n);.    }else
2ca30 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
2ca40 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20  ITE_OK;.    }.. 
2ca50 20 20 20 2f 2a 20 55 6e 64 6f 20 74 68 65 20 6c     /* Undo the l
2ca60 6f 63 61 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20  ocal locks */.  
2ca70 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2ca80 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  _OK ){.      p->
2ca90 65 78 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61 73  exclMask &= ~mas
2caa0 6b 3b 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72  k;.      p->shar
2cab0 65 64 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b  edMask &= ~mask;
2cac0 0a 20 20 20 20 7d 20 0a 20 20 7d 65 6c 73 65 20  .    } .  }else 
2cad0 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49  if( flags & SQLI
2cae0 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 20 29 7b  TE_SHM_SHARED ){
2caf0 0a 20 20 20 20 75 31 36 20 61 6c 6c 53 68 61 72  .    u16 allShar
2cb00 65 64 20 3d 20 30 3b 20 20 2f 2a 20 55 6e 69 6f  ed = 0;  /* Unio
2cb10 6e 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20  n of locks held 
2cb20 62 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f  by connections o
2cb30 74 68 65 72 20 74 68 61 6e 20 22 70 22 20 2a 2f  ther than "p" */
2cb40 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20 6f 75  ..    /* Find ou
2cb50 74 20 77 68 69 63 68 20 73 68 61 72 65 64 20 6c  t which shared l
2cb60 6f 63 6b 73 20 61 72 65 20 61 6c 72 65 61 64 79  ocks are already
2cb70 20 68 65 6c 64 20 62 79 20 73 69 62 6c 69 6e 67   held by sibling
2cb80 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0a 20 20   connections..  
2cb90 20 20 2a 2a 20 49 66 20 61 6e 79 20 73 69 62 6c    ** If any sibl
2cba0 69 6e 67 20 61 6c 72 65 61 64 79 20 68 6f 6c 64  ing already hold
2cbb0 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  s an exclusive l
2cbc0 6f 63 6b 2c 20 67 6f 20 61 68 65 61 64 20 61 6e  ock, go ahead an
2cbd0 64 20 72 65 74 75 72 6e 0a 20 20 20 20 2a 2a 20  d return.    ** 
2cbe0 53 51 4c 49 54 45 5f 42 55 53 59 2e 0a 20 20 20  SQLITE_BUSY..   
2cbf0 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d 70   */.    for(pX=p
2cc00 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b  ShmNode->pFirst;
2cc10 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78   pX; pX=pX->pNex
2cc20 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70  t){.      if( (p
2cc30 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20 6d 61  X->exclMask & ma
2cc40 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  sk)!=0 ){.      
2cc50 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
2cc60 53 59 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  SY;.        brea
2cc70 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
2cc80 20 61 6c 6c 53 68 61 72 65 64 20 7c 3d 20 70 58   allShared |= pX
2cc90 2d 3e 73 68 61 72 65 64 4d 61 73 6b 3b 0a 20 20  ->sharedMask;.  
2cca0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20    }..    /* Get 
2ccb0 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 61 74 20  shared locks at 
2ccc0 74 68 65 20 73 79 73 74 65 6d 20 6c 65 76 65 6c  the system level
2ccd0 2c 20 69 66 20 6e 65 63 65 73 73 61 72 79 20 2a  , if necessary *
2cce0 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
2ccf0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2cd00 20 69 66 28 20 28 61 6c 6c 53 68 61 72 65 64 20   if( (allShared 
2cd10 26 20 6d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20  & mask)==0 ){.  
2cd20 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 53        rc = unixS
2cd30 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 44 62  hmSystemLock(pDb
2cd40 46 64 2c 20 46 5f 52 44 4c 43 4b 2c 20 6f 66 73  Fd, F_RDLCK, ofs
2cd50 74 2b 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45 2c  t+UNIX_SHM_BASE,
2cd60 20 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   n);.      }else
2cd70 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
2cd80 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
2cd90 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
2cda0 47 65 74 20 74 68 65 20 6c 6f 63 61 6c 20 73 68  Get the local sh
2cdb0 61 72 65 64 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20  ared locks */.  
2cdc0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2cdd0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  _OK ){.      p->
2cde0 73 68 61 72 65 64 4d 61 73 6b 20 7c 3d 20 6d 61  sharedMask |= ma
2cdf0 73 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  sk;.    }.  }els
2ce00 65 7b 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73  e{.    /* Make s
2ce10 75 72 65 20 6e 6f 20 73 69 62 6c 69 6e 67 20 63  ure no sibling c
2ce20 6f 6e 6e 65 63 74 69 6f 6e 73 20 68 6f 6c 64 20  onnections hold 
2ce30 6c 6f 63 6b 73 20 74 68 61 74 20 77 69 6c 6c 20  locks that will 
2ce40 62 6c 6f 63 6b 20 74 68 69 73 0a 20 20 20 20 2a  block this.    *
2ce50 2a 20 6c 6f 63 6b 2e 20 20 49 66 20 61 6e 79 20  * lock.  If any 
2ce60 64 6f 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54  do, return SQLIT
2ce70 45 5f 42 55 53 59 20 72 69 67 68 74 20 61 77 61  E_BUSY right awa
2ce80 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  y..    */.    fo
2ce90 72 28 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70  r(pX=pShmNode->p
2cea0 46 69 72 73 74 3b 20 70 58 3b 20 70 58 3d 70 58  First; pX; pX=pX
2ceb0 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20  ->pNext){.      
2cec0 69 66 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73  if( (pX->exclMas
2ced0 6b 20 26 20 6d 61 73 6b 29 21 3d 30 20 7c 7c 20  k & mask)!=0 || 
2cee0 28 70 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20  (pX->sharedMask 
2cef0 26 20 6d 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20  & mask)!=0 ){.  
2cf00 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2cf10 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20  E_BUSY;.        
2cf20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
2cf30 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 47     }.  .    /* G
2cf40 65 74 20 74 68 65 20 65 78 63 6c 75 73 69 76 65  et the exclusive
2cf50 20 6c 6f 63 6b 73 20 61 74 20 74 68 65 20 73 79   locks at the sy
2cf60 73 74 65 6d 20 6c 65 76 65 6c 2e 20 20 54 68 65  stem level.  The
2cf70 6e 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 0a  n if successful.
2cf80 20 20 20 20 2a 2a 20 61 6c 73 6f 20 6d 61 72 6b      ** also mark
2cf90 20 74 68 65 20 6c 6f 63 61 6c 20 63 6f 6e 6e 65   the local conne
2cfa0 63 74 69 6f 6e 20 61 73 20 62 65 69 6e 67 20 6c  ction as being l
2cfb0 6f 63 6b 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  ocked..    */.  
2cfc0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2cfd0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
2cfe0 3d 20 75 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c  = unixShmSystemL
2cff0 6f 63 6b 28 70 44 62 46 64 2c 20 46 5f 57 52 4c  ock(pDbFd, F_WRL
2d000 43 4b 2c 20 6f 66 73 74 2b 55 4e 49 58 5f 53 48  CK, ofst+UNIX_SH
2d010 4d 5f 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20  M_BASE, n);.    
2d020 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2d030 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61  _OK ){.        a
2d040 73 73 65 72 74 28 20 28 70 2d 3e 73 68 61 72 65  ssert( (p->share
2d050 64 4d 61 73 6b 20 26 20 6d 61 73 6b 29 3d 3d 30  dMask & mask)==0
2d060 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 65   );.        p->e
2d070 78 63 6c 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b  xclMask |= mask;
2d080 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2d090 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   }.  sqlite3_mut
2d0a0 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64  ex_leave(pShmNod
2d0b0 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 4f 53 54  e->mutex);.  OST
2d0c0 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b 20  RACE(("SHM-LOCK 
2d0d0 73 68 6d 69 64 2d 25 64 2c 20 70 69 64 2d 25 64  shmid-%d, pid-%d
2d0e0 20 67 6f 74 20 25 30 33 78 2c 25 30 33 78 5c 6e   got %03x,%03x\n
2d0f0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d  ",.           p-
2d100 3e 69 64 2c 20 6f 73 47 65 74 70 69 64 28 30 29  >id, osGetpid(0)
2d110 2c 20 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 2c  , p->sharedMask,
2d120 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 29 29 3b 0a   p->exclMask));.
2d130 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2d140 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 20  /*.** Implement 
2d150 61 20 6d 65 6d 6f 72 79 20 62 61 72 72 69 65 72  a memory barrier
2d160 20 6f 72 20 6d 65 6d 6f 72 79 20 66 65 6e 63 65   or memory fence
2d170 20 6f 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f 72   on shared memor
2d180 79 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6c  y.  .**.** All l
2d190 6f 61 64 73 20 61 6e 64 20 73 74 6f 72 65 73 20  oads and stores 
2d1a0 62 65 67 75 6e 20 62 65 66 6f 72 65 20 74 68 65  begun before the
2d1b0 20 62 61 72 72 69 65 72 20 6d 75 73 74 20 63 6f   barrier must co
2d1c0 6d 70 6c 65 74 65 20 62 65 66 6f 72 65 0a 2a 2a  mplete before.**
2d1d0 20 61 6e 79 20 6c 6f 61 64 20 6f 72 20 73 74 6f   any load or sto
2d1e0 72 65 20 62 65 67 75 6e 20 61 66 74 65 72 20 74  re begun after t
2d1f0 68 65 20 62 61 72 72 69 65 72 2e 0a 2a 2f 0a 73  he barrier..*/.s
2d200 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 53  tatic void unixS
2d210 68 6d 42 61 72 72 69 65 72 28 0a 20 20 73 71 6c  hmBarrier(.  sql
2d220 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 20 20 20  ite3_file *fd   
2d230 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2d240 44 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 6f  Database file ho
2d250 6c 64 69 6e 67 20 74 68 65 20 73 68 61 72 65 64  lding the shared
2d260 20 6d 65 6d 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20   memory */.){.  
2d270 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
2d280 28 66 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 4d  (fd);.  sqlite3M
2d290 65 6d 6f 72 79 42 61 72 72 69 65 72 28 29 3b 20  emoryBarrier(); 
2d2a0 20 20 20 20 20 20 20 20 2f 2a 20 63 6f 6d 70 69          /* compi
2d2b0 6c 65 72 2d 64 65 66 69 6e 65 64 20 6d 65 6d 6f  ler-defined memo
2d2c0 72 79 20 62 61 72 72 69 65 72 20 2a 2f 0a 20 20  ry barrier */.  
2d2d0 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
2d2e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2d2f0 2f 2a 20 41 6c 73 6f 20 6d 75 74 65 78 2c 20 66  /* Also mutex, f
2d300 6f 72 20 72 65 64 75 6e 64 61 6e 63 79 20 2a 2f  or redundancy */
2d310 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65  .  unixLeaveMute
2d320 78 28 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  x();.}../*.** Cl
2d330 6f 73 65 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e  ose a connection
2d340 20 74 6f 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72   to shared-memor
2d350 79 2e 20 20 44 65 6c 65 74 65 20 74 68 65 20 75  y.  Delete the u
2d360 6e 64 65 72 6c 79 69 6e 67 20 0a 2a 2a 20 73 74  nderlying .** st
2d370 6f 72 61 67 65 20 69 66 20 64 65 6c 65 74 65 46  orage if deleteF
2d380 6c 61 67 20 69 73 20 74 72 75 65 2e 0a 2a 2a 0a  lag is true..**.
2d390 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 6e  ** If there is n
2d3a0 6f 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  o shared memory 
2d3b0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
2d3c0 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74  the connection t
2d3d0 68 65 6e 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74  hen this.** rout
2d3e0 69 6e 65 20 69 73 20 61 20 68 61 72 6d 6c 65 73  ine is a harmles
2d3f0 73 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74  s no-op..*/.stat
2d400 69 63 20 69 6e 74 20 75 6e 69 78 53 68 6d 55 6e  ic int unixShmUn
2d410 6d 61 70 28 0a 20 20 73 71 6c 69 74 65 33 5f 66  map(.  sqlite3_f
2d420 69 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20  ile *fd,        
2d430 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e         /* The un
2d440 64 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73  derlying databas
2d450 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  e file */.  int 
2d460 64 65 6c 65 74 65 46 6c 61 67 20 20 20 20 20 20  deleteFlag      
2d470 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
2d480 65 6c 65 74 65 20 73 68 61 72 65 64 2d 6d 65 6d  elete shared-mem
2d490 6f 72 79 20 69 66 20 74 72 75 65 20 2a 2f 0a 29  ory if true */.)
2d4a0 7b 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 3b 20  {.  unixShm *p; 
2d4b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d4c0 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 6e 65      /* The conne
2d4d0 63 74 69 6f 6e 20 74 6f 20 62 65 20 63 6c 6f 73  ction to be clos
2d4e0 65 64 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 4e  ed */.  unixShmN
2d4f0 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 20  ode *pShmNode;  
2d500 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75          /* The u
2d510 6e 64 65 72 6c 79 69 6e 67 20 73 68 61 72 65 64  nderlying shared
2d520 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20 2a 2f 0a  -memory file */.
2d530 20 20 75 6e 69 78 53 68 6d 20 2a 2a 70 70 3b 20    unixShm **pp; 
2d540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d550 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67    /* For looping
2d560 20 6f 76 65 72 20 73 69 62 6c 69 6e 67 20 63 6f   over sibling co
2d570 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 75  nnections */.  u
2d580 6e 69 78 46 69 6c 65 20 2a 70 44 62 46 64 3b 20  nixFile *pDbFd; 
2d590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2d5a0 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  * The underlying
2d5b0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
2d5c0 2f 0a 0a 20 20 70 44 62 46 64 20 3d 20 28 75 6e  /..  pDbFd = (un
2d5d0 69 78 46 69 6c 65 2a 29 66 64 3b 0a 20 20 70 20  ixFile*)fd;.  p 
2d5e0 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20  = pDbFd->pShm;. 
2d5f0 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
2d600 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
2d610 70 53 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53  pShmNode = p->pS
2d620 68 6d 4e 6f 64 65 3b 0a 0a 20 20 61 73 73 65 72  hmNode;..  asser
2d630 74 28 20 70 53 68 6d 4e 6f 64 65 3d 3d 70 44 62  t( pShmNode==pDb
2d640 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d  Fd->pInode->pShm
2d650 4e 6f 64 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Node );.  assert
2d660 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f  ( pShmNode->pIno
2d670 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64  de==pDbFd->pInod
2d680 65 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76  e );..  /* Remov
2d690 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20 66  e connection p f
2d6a0 72 6f 6d 20 74 68 65 20 73 65 74 20 6f 66 20 63  rom the set of c
2d6b0 6f 6e 6e 65 63 74 69 6f 6e 73 20 61 73 73 6f 63  onnections assoc
2d6c0 69 61 74 65 64 0a 20 20 2a 2a 20 77 69 74 68 20  iated.  ** with 
2d6d0 70 53 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 73 71  pShmNode */.  sq
2d6e0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
2d6f0 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  r(pShmNode->mute
2d700 78 29 3b 0a 20 20 66 6f 72 28 70 70 3d 26 70 53  x);.  for(pp=&pS
2d710 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20  hmNode->pFirst; 
2d720 28 2a 70 70 29 21 3d 70 3b 20 70 70 20 3d 20 26  (*pp)!=p; pp = &
2d730 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29 7b 7d 0a  (*pp)->pNext){}.
2d740 20 20 2a 70 70 20 3d 20 70 2d 3e 70 4e 65 78 74    *pp = p->pNext
2d750 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20 74 68 65  ;..  /* Free the
2d760 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20 2a 2f   connection p */
2d770 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
2d780 70 29 3b 0a 20 20 70 44 62 46 64 2d 3e 70 53 68  p);.  pDbFd->pSh
2d790 6d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  m = 0;.  sqlite3
2d7a0 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68  _mutex_leave(pSh
2d7b0 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 0a  mNode->mutex);..
2d7c0 20 20 2f 2a 20 49 66 20 70 53 68 6d 4e 6f 64 65    /* If pShmNode
2d7d0 2d 3e 6e 52 65 66 20 68 61 73 20 72 65 61 63 68  ->nRef has reach
2d7e0 65 64 20 30 2c 20 74 68 65 6e 20 63 6c 6f 73 65  ed 0, then close
2d7f0 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 0a   the underlying.
2d800 20 20 2a 2a 20 73 68 61 72 65 64 2d 6d 65 6d 6f    ** shared-memo
2d810 72 79 20 66 69 6c 65 2c 20 74 6f 6f 20 2a 2f 0a  ry file, too */.
2d820 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
2d830 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53  ();.  assert( pS
2d840 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66 3e 30 20 29  hmNode->nRef>0 )
2d850 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52  ;.  pShmNode->nR
2d860 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 53 68 6d  ef--;.  if( pShm
2d870 4e 6f 64 65 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b  Node->nRef==0 ){
2d880 0a 20 20 20 20 69 66 28 20 64 65 6c 65 74 65 46  .    if( deleteF
2d890 6c 61 67 20 26 26 20 70 53 68 6d 4e 6f 64 65 2d  lag && pShmNode-
2d8a0 3e 68 3e 3d 30 20 29 20 7b 0a 20 20 20 20 20 20  >h>=0 ) {.      
2d8b0 69 66 20 28 64 65 6c 65 74 65 46 6c 61 67 20 3d  if (deleteFlag =
2d8c0 3d 20 31 29 20 7b 20 0a 20 20 20 20 20 20 20 20  = 1) { .        
2d8d0 6f 73 55 6e 6c 69 6e 6b 28 70 53 68 6d 4e 6f 64  osUnlink(pShmNod
2d8e0 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  e->zFilename);. 
2d8f0 20 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28       } else if (
2d900 64 65 6c 65 74 65 46 6c 61 67 20 3d 3d 20 32 29  deleteFlag == 2)
2d910 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 66 74   {.        /* ft
2d920 72 75 6e 63 61 74 65 28 70 53 68 6d 4e 6f 64 65  runcate(pShmNode
2d930 2d 3e 68 2c 20 33 32 20 2a 20 31 30 32 34 29 3b  ->h, 32 * 1024);
2d940 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   */.      }.    
2d950 7d 0a 20 20 20 20 75 6e 69 78 53 68 6d 50 75 72  }.    unixShmPur
2d960 67 65 28 70 44 62 46 64 29 3b 0a 20 20 7d 0a 20  ge(pDbFd);.  }. 
2d970 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
2d980 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  );..  return SQL
2d990 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 23 65 6c 73  ITE_OK;.}...#els
2d9a0 65 0a 23 20 64 65 66 69 6e 65 20 75 6e 69 78 53  e.# define unixS
2d9b0 68 6d 4d 61 70 20 20 20 20 20 30 0a 23 20 64 65  hmMap     0.# de
2d9c0 66 69 6e 65 20 75 6e 69 78 53 68 6d 4c 6f 63 6b  fine unixShmLock
2d9d0 20 20 20 20 30 0a 23 20 64 65 66 69 6e 65 20 75      0.# define u
2d9e0 6e 69 78 53 68 6d 42 61 72 72 69 65 72 20 30 0a  nixShmBarrier 0.
2d9f0 23 20 64 65 66 69 6e 65 20 75 6e 69 78 53 68 6d  # define unixShm
2da00 55 6e 6d 61 70 20 20 20 30 0a 23 65 6e 64 69 66  Unmap   0.#endif
2da10 20 2f 2a 20 23 69 66 6e 64 65 66 20 53 51 4c 49   /* #ifndef SQLI
2da20 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a  TE_OMIT_WAL */..
2da30 23 69 66 20 28 53 51 4c 49 54 45 5f 45 4e 41 42  #if (SQLITE_ENAB
2da40 4c 45 5f 41 50 50 4c 45 5f 53 50 49 3e 30 29 20  LE_APPLE_SPI>0) 
2da50 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  && defined(__APP
2da60 4c 45 5f 5f 29 0a 73 74 61 74 69 63 20 63 6f 6e  LE__).static con
2da70 73 74 20 63 68 61 72 20 2a 75 6e 69 78 54 65 6d  st char *unixTem
2da80 70 46 69 6c 65 44 69 72 28 76 6f 69 64 29 3b 0a  pFileDir(void);.
2da90 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
2daa0 49 6e 76 61 6c 69 64 61 74 65 53 75 70 70 6f 72  InvalidateSuppor
2dab0 74 46 69 6c 65 73 28 75 6e 69 78 46 69 6c 65 20  tFiles(unixFile 
2dac0 2a 70 46 69 6c 65 2c 20 69 6e 74 20 73 6b 69 70  *pFile, int skip
2dad0 57 41 4c 29 20 7b 0a 20 20 63 68 61 72 20 6a 50  WAL) {.  char jP
2dae0 61 74 68 5b 4d 41 58 50 41 54 48 4c 45 4e 2b 39  ath[MAXPATHLEN+9
2daf0 5d 3b 0a 20 20 69 6e 74 20 7a 4c 65 6e 20 3d 20  ];.  int zLen = 
2db00 73 74 72 6c 63 70 79 28 6a 50 61 74 68 2c 20 70  strlcpy(jPath, p
2db10 46 69 6c 65 2d 3e 7a 50 61 74 68 2c 20 4d 41 58  File->zPath, MAX
2db20 50 41 54 48 4c 45 4e 2b 39 29 3b 0a 20 20 69 66  PATHLEN+9);.  if
2db30 28 20 7a 4c 65 6e 3c 4d 41 58 50 41 54 48 4c 45  ( zLen<MAXPATHLE
2db40 4e 20 29 7b 0a 20 20 20 20 73 69 7a 65 5f 74 20  N ){.    size_t 
2db50 6a 4c 65 6e 3b 0a 20 20 20 20 63 6f 6e 73 74 20  jLen;.    const 
2db60 63 68 61 72 20 65 78 74 65 6e 73 69 6f 6e 73 5b  char extensions[
2db70 33 5d 5b 39 5d 20 3d 20 7b 20 22 2d 77 61 6c 22  3][9] = { "-wal"
2db80 2c 20 22 2d 6a 6f 75 72 6e 61 6c 22 2c 20 22 2d  , "-journal", "-
2db90 73 68 6d 22 20 7d 3b 0a 20 20 20 20 69 6e 74 20  shm" };.    int 
2dba0 6a 20 3d 20 28 73 6b 69 70 57 41 4c 20 3f 20 31  j = (skipWAL ? 1
2dbb0 20 3a 20 30 29 3b 0a 20 20 20 20 66 6f 72 28 20   : 0);.    for( 
2dbc0 3b 20 6a 3c 33 3b 20 6a 2b 2b 20 29 7b 0a 20 20  ; j<3; j++ ){.  
2dbd0 20 20 20 20 0a 20 20 20 20 20 20 2f 2a 20 43 68      .      /* Ch
2dbe0 65 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68  eck to see if th
2dbf0 65 20 73 68 6d 20 66 69 6c 65 20 69 73 20 61 6c  e shm file is al
2dc00 72 65 61 64 79 20 6f 70 65 6e 65 64 20 66 6f 72  ready opened for
2dc10 20 74 68 69 73 20 70 46 69 6c 65 20 2a 2f 0a 20   this pFile */. 
2dc20 20 20 20 20 20 69 66 28 20 6a 3d 3d 32 20 29 7b       if( j==2 ){
2dc30 0a 20 20 20 20 20 20 20 20 75 6e 69 78 45 6e 74  .        unixEnt
2dc40 65 72 4d 75 74 65 78 28 29 3b 20 2f 2a 20 42 65  erMutex(); /* Be
2dc50 63 61 75 73 65 20 70 46 69 6c 65 2d 3e 70 49 6e  cause pFile->pIn
2dc60 6f 64 65 20 69 73 20 73 68 61 72 65 64 20 61 63  ode is shared ac
2dc70 72 6f 73 73 20 74 68 72 65 61 64 73 20 2a 2f 0a  ross threads */.
2dc80 20 20 20 20 20 20 20 20 75 6e 69 78 53 68 6d 4e          unixShmN
2dc90 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 20 3d 20  ode *pShmNode = 
2dca0 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70  pFile->pInode->p
2dcb0 53 68 6d 4e 6f 64 65 3b 0a 20 20 20 20 20 20 20  ShmNode;.       
2dcc0 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 20 26 26   if( pShmNode &&
2dcd0 20 21 70 53 68 6d 4e 6f 64 65 2d 3e 69 73 52 65   !pShmNode->isRe
2dce0 61 64 6f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20  adonly ){.      
2dcf0 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74 20      struct stat 
2dd00 73 53 74 61 74 3b 0a 20 20 20 20 20 20 20 20 20  sStat;.         
2dd10 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
2dd20 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d  nter(pShmNode->m
2dd30 75 74 65 78 29 3b 0a 20 20 20 20 20 20 20 20 20  utex);.         
2dd40 20 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20   .          if( 
2dd50 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 26  pShmNode->h>=0 &
2dd60 26 20 21 6f 73 46 73 74 61 74 28 70 53 68 6d 4e  & !osFstat(pShmN
2dd70 6f 64 65 2d 3e 68 2c 20 26 73 53 74 61 74 29 20  ode->h, &sStat) 
2dd80 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 75  ){.            u
2dd90 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 73 69 7a  nsigned long siz
2dda0 65 20 3d 20 28 73 53 74 61 74 2e 73 74 5f 73 69  e = (sStat.st_si
2ddb0 7a 65 3c 34 29 20 3f 20 73 53 74 61 74 2e 73 74  ze<4) ? sStat.st
2ddc0 5f 73 69 7a 65 20 3a 20 34 3b 0a 20 20 20 20 20  _size : 4;.     
2ddd0 20 20 20 20 20 20 20 69 66 28 20 73 69 7a 65 3e         if( size>
2dde0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
2ddf0 20 20 20 62 7a 65 72 6f 28 70 53 68 6d 4e 6f 64     bzero(pShmNod
2de00 65 2d 3e 61 70 52 65 67 69 6f 6e 5b 30 5d 2c 20  e->apRegion[0], 
2de10 73 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 20  size);.         
2de20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
2de30 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64  ex_leave(pShmNod
2de40 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 20  e->mutex);.     
2de50 20 20 20 20 20 20 20 20 20 75 6e 69 78 4c 65 61           unixLea
2de60 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 20  veMutex();.     
2de70 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
2de80 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  e;.            }
2de90 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2dea0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d         sqlite3_m
2deb0 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e  utex_leave(pShmN
2dec0 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20  ode->mutex);.   
2ded0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 75       }.        u
2dee0 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
2def0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6a  .      }.      j
2df00 4c 65 6e 20 3d 20 73 74 72 6c 63 70 79 28 26 6a  Len = strlcpy(&j
2df10 50 61 74 68 5b 7a 4c 65 6e 5d 2c 20 65 78 74 65  Path[zLen], exte
2df20 6e 73 69 6f 6e 73 5b 6a 5d 2c 20 39 29 3b 0a 20  nsions[j], 9);. 
2df30 20 20 20 20 20 69 66 28 20 6a 4c 65 6e 20 3c 20       if( jLen < 
2df40 39 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  9 ){.        int
2df50 20 6a 66 6c 61 67 73 20 3d 20 28 6a 3c 32 29 20   jflags = (j<2) 
2df60 3f 20 4f 5f 54 52 55 4e 43 20 3a 20 4f 5f 52 44  ? O_TRUNC : O_RD
2df70 57 52 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  WR;.        int 
2df80 6a 66 64 20 3d 20 6f 70 65 6e 28 6a 50 61 74 68  jfd = open(jPath
2df90 2c 20 6a 66 6c 61 67 73 29 3b 0a 20 20 20 20 20  , jflags);.     
2dfa0 20 20 20 69 66 28 20 6a 66 64 3d 3d 28 2d 31 29     if( jfd==(-1)
2dfb0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
2dfc0 28 20 65 72 72 6e 6f 21 3d 45 4e 4f 45 4e 54 20  ( errno!=ENOENT 
2dfd0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
2dfe0 65 72 72 6f 72 28 6a 50 61 74 68 29 3b 0a 20 20  error(jPath);.  
2dff0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2e000 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
2e010 20 20 20 20 20 69 66 28 20 6a 3d 3d 32 20 29 7b       if( j==2 ){
2e020 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72  .            str
2e030 75 63 74 20 73 74 61 74 20 73 53 74 61 74 3b 0a  uct stat sStat;.
2e040 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
2e050 21 6f 73 46 73 74 61 74 28 6a 66 64 2c 20 26 73  !osFstat(jfd, &s
2e060 53 74 61 74 29 20 29 7b 0a 20 20 20 20 20 20 20  Stat) ){.       
2e070 20 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20         unsigned 
2e080 6c 6f 6e 67 20 73 69 7a 65 20 3d 20 28 73 53 74  long size = (sSt
2e090 61 74 2e 73 74 5f 73 69 7a 65 3c 34 29 20 3f 20  at.st_size<4) ? 
2e0a0 73 53 74 61 74 2e 73 74 5f 73 69 7a 65 20 3a 20  sStat.st_size : 
2e0b0 34 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  4;.             
2e0c0 20 69 66 28 20 73 69 7a 65 3e 30 20 29 7b 0a 20   if( size>0 ){. 
2e0d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 75                 u
2e0e0 69 6e 74 33 32 5f 74 20 7a 65 72 6f 20 3d 20 30  int32_t zero = 0
2e0f0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2e100 20 20 70 77 72 69 74 65 28 6a 66 64 2c 20 26 7a    pwrite(jfd, &z
2e110 65 72 6f 2c 20 28 73 69 7a 65 5f 74 29 73 69 7a  ero, (size_t)siz
2e120 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  e, 0);.         
2e130 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2e140 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
2e150 0a 20 20 20 20 20 20 20 20 20 20 66 73 79 6e 63  .          fsync
2e160 28 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 20 20  (jfd);.         
2e170 20 63 6c 6f 73 65 28 6a 66 64 29 3b 0a 20 20 20   close(jfd);.   
2e180 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
2e190 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
2e1a0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
2e1b0 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 55  static int unixU
2e1c0 6e 73 61 66 65 54 72 75 6e 63 61 74 65 44 61 74  nsafeTruncateDat
2e1d0 61 62 61 73 65 28 75 6e 69 78 46 69 6c 65 20 2a  abase(unixFile *
2e1e0 70 46 69 6c 65 29 7b 0a 20 20 2f 2a 20 74 68 69  pFile){.  /* thi
2e1f0 73 20 69 73 20 6e 61 73 74 79 20 26 20 62 61 64  s is nasty & bad
2e200 2e 20 20 64 65 73 74 72 75 63 74 69 6f 6e 20 77  .  destruction w
2e210 69 74 68 20 70 72 65 6a 75 64 69 63 65 2e 20 20  ith prejudice.  
2e220 77 65 27 6c 6c 20 6c 6f 73 65 20 61 6c 6c 20 74  we'll lose all t
2e230 68 65 0a 20 20 2a 2a 20 66 69 6c 65 20 6c 6f 63  he.  ** file loc
2e240 6b 73 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65  ks in this proce
2e250 73 73 2c 20 68 6f 77 65 76 65 72 2e 20 73 71 6c  ss, however. sql
2e260 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f  ite3_file_contro
2e270 6c 20 77 6f 72 6b 73 20 70 72 6f 70 65 72 6c 79  l works properly
2e280 2e 0a 20 20 2a 2a 20 42 75 74 20 69 66 20 69 74  ..  ** But if it
2e290 20 66 61 69 6c 73 2c 20 74 68 69 73 20 77 6f 72   fails, this wor
2e2a0 6b 73 20 61 70 70 72 6f 78 69 6d 61 74 65 6c 79  ks approximately
2e2b0 0a 20 20 2a 2f 0a 20 20 63 68 61 72 20 6a 6f 75  .  */.  char jou
2e2c0 72 6e 61 6c 50 61 74 68 5b 4d 41 58 50 41 54 48  rnalPath[MAXPATH
2e2d0 4c 45 4e 5d 3b 0a 20 20 63 68 61 72 20 77 61 6c  LEN];.  char wal
2e2e0 50 61 74 68 5b 4d 41 58 50 41 54 48 4c 45 4e 5d  Path[MAXPATHLEN]
2e2f0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
2e300 49 54 45 5f 4f 4b 3b 0a 20 20 0a 23 69 66 64 65  ITE_OK;.  .#ifde
2e310 66 20 44 45 42 55 47 0a 20 20 66 70 72 69 6e 74  f DEBUG.  fprint
2e320 66 28 73 74 64 65 72 72 2c 20 22 46 6f 72 63 65  f(stderr, "Force
2e330 20 74 72 75 6e 63 61 74 69 6e 67 20 64 61 74 61   truncating data
2e340 62 61 73 65 20 25 73 5c 6e 22 2c 20 70 46 69 6c  base %s\n", pFil
2e350 65 2d 3e 7a 50 61 74 68 29 3b 0a 23 65 6e 64 69  e->zPath);.#endi
2e360 66 0a 20 20 73 74 72 6c 63 70 79 28 6a 6f 75 72  f.  strlcpy(jour
2e370 6e 61 6c 50 61 74 68 2c 20 70 46 69 6c 65 2d 3e  nalPath, pFile->
2e380 7a 50 61 74 68 2c 20 4d 41 58 50 41 54 48 4c 45  zPath, MAXPATHLE
2e390 4e 29 3b 0a 20 20 73 74 72 6c 63 61 74 28 6a 6f  N);.  strlcat(jo
2e3a0 75 72 6e 61 6c 50 61 74 68 2c 20 22 2d 6a 6f 75  urnalPath, "-jou
2e3b0 72 6e 61 6c 22 2c 20 4d 41 58 50 41 54 48 4c 45  rnal", MAXPATHLE
2e3c0 4e 29 3b 0a 20 20 73 74 72 6c 63 70 79 28 77 61  N);.  strlcpy(wa
2e3d0 6c 50 61 74 68 2c 20 70 46 69 6c 65 2d 3e 7a 50  lPath, pFile->zP
2e3e0 61 74 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29  ath, MAXPATHLEN)
2e3f0 3b 0a 20 20 73 74 72 6c 63 61 74 28 77 61 6c 50  ;.  strlcat(walP
2e400 61 74 68 2c 20 22 2d 77 61 6c 22 2c 20 4d 41 58  ath, "-wal", MAX
2e410 50 41 54 48 4c 45 4e 29 3b 0a 20 20 69 6e 74 20  PATHLEN);.  int 
2e420 66 64 31 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a  fd1 = pFile->h;.
2e430 20 20 69 6e 74 20 72 65 73 75 6c 74 20 3d 20 30    int result = 0
2e440 3b 0a 20 20 72 65 73 75 6c 74 20 3d 20 66 74 72  ;.  result = ftr
2e450 75 6e 63 61 74 65 28 66 64 31 2c 20 30 6c 6c 29  uncate(fd1, 0ll)
2e460 3b 0a 20 20 69 66 20 28 72 65 73 75 6c 74 29 20  ;.  if (result) 
2e470 7b 0a 20 20 20 20 72 65 73 75 6c 74 20 3d 20 65  {.    result = e
2e480 72 72 6e 6f 3b 0a 20 20 7d 0a 20 20 69 66 20 28  rrno;.  }.  if (
2e490 72 65 73 75 6c 74 29 20 7b 0a 20 20 20 20 72 63  result) {.    rc
2e4a0 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b   = SQLITE_IOERR;
2e4b0 0a 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72  .    storeLastEr
2e4c0 72 6e 6f 28 70 46 69 6c 65 2c 20 72 65 73 75 6c  rno(pFile, resul
2e4d0 74 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 69 6e 74  t);.  }.  .  int
2e4e0 20 66 64 32 20 3d 20 6f 70 65 6e 28 6a 6f 75 72   fd2 = open(jour
2e4f0 6e 61 6c 50 61 74 68 2c 20 4f 5f 52 44 57 52 29  nalPath, O_RDWR)
2e500 3b 0a 20 20 69 6e 74 20 72 65 73 75 6c 74 32 20  ;.  int result2 
2e510 3d 20 30 3b 0a 20 20 69 66 20 28 66 64 32 20 3c  = 0;.  if (fd2 <
2e520 20 30 29 20 7b 0a 20 20 20 20 69 66 20 28 65 72   0) {.    if (er
2e530 72 6e 6f 20 21 3d 20 45 4e 4f 45 4e 54 29 20 7b  rno != ENOENT) {
2e540 0a 20 20 20 20 20 20 72 65 73 75 6c 74 32 20 3d  .      result2 =
2e550 20 65 72 72 6e 6f 3b 0a 20 20 20 20 7d 20 65 6c   errno;.    } el
2e560 73 65 20 7b 0a 20 20 20 20 20 20 72 65 73 75 6c  se {.      resul
2e570 74 32 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  t2 = 0;.    }.  
2e580 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 72 65 73  } else {.    res
2e590 75 6c 74 32 20 3d 20 66 74 72 75 6e 63 61 74 65  ult2 = ftruncate
2e5a0 28 66 64 32 2c 20 30 6c 6c 29 3b 0a 20 20 20 20  (fd2, 0ll);.    
2e5b0 69 66 20 28 72 65 73 75 6c 74 32 29 20 7b 0a 20  if (result2) {. 
2e5c0 20 20 20 20 20 72 65 73 75 6c 74 32 20 3d 20 65       result2 = e
2e5d0 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rrno;.    }.  }.
2e5e0 20 20 69 66 20 28 72 65 73 75 6c 74 32 20 26 26    if (result2 &&
2e5f0 20 21 72 65 73 75 6c 74 29 20 7b 0a 20 20 20 20   !result) {.    
2e600 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
2e610 52 3b 0a 20 20 20 20 73 74 6f 72 65 4c 61 73 74  R;.    storeLast
2e620 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 72 65 73  Errno(pFile, res
2e630 75 6c 74 32 29 3b 0a 20 20 7d 0a 20 20 0a 20 20  ult2);.  }.  .  
2e640 69 6e 74 20 66 64 33 20 3d 20 6f 70 65 6e 28 77  int fd3 = open(w
2e650 61 6c 50 61 74 68 2c 20 4f 5f 52 44 57 52 29 3b  alPath, O_RDWR);
2e660 0a 20 20 69 6e 74 20 72 65 73 75 6c 74 33 20 3d  .  int result3 =
2e670 20 30 3b 0a 20 20 69 66 20 28 66 64 33 20 3c 20   0;.  if (fd3 < 
2e680 30 29 20 7b 0a 20 20 20 20 69 66 20 28 65 72 72  0) {.    if (err
2e690 6e 6f 20 21 3d 20 45 4e 4f 45 4e 54 29 20 7b 0a  no != ENOENT) {.
2e6a0 20 20 20 20 20 20 72 65 73 75 6c 74 33 20 3d 20        result3 = 
2e6b0 65 72 72 6e 6f 3b 0a 20 20 20 20 7d 20 65 6c 73  errno;.    } els
2e6c0 65 20 7b 0a 20 20 20 20 20 20 72 65 73 75 6c 74  e {.      result
2e6d0 33 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d  3 = 0;.    }.  }
2e6e0 20 65 6c 73 65 20 7b 0a 20 20 20 20 72 65 73 75   else {.    resu
2e6f0 6c 74 33 20 3d 20 66 74 72 75 6e 63 61 74 65 28  lt3 = ftruncate(
2e700 66 64 33 2c 20 30 6c 6c 29 3b 0a 20 20 20 20 69  fd3, 0ll);.    i
2e710 66 20 28 72 65 73 75 6c 74 33 29 20 7b 0a 20 20  f (result3) {.  
2e720 20 20 20 20 72 65 73 75 6c 74 33 20 3d 20 65 72      result3 = er
2e730 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  rno;.    }.  }. 
2e740 20 69 66 20 28 72 65 73 75 6c 74 33 20 26 26 20   if (result3 && 
2e750 21 28 72 65 73 75 6c 74 20 7c 7c 20 72 65 73 75  !(result || resu
2e760 6c 74 32 29 29 20 7b 0a 20 20 20 20 72 63 20 3d  lt2)) {.    rc =
2e770 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20   SQLITE_IOERR;. 
2e780 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e     storeLastErrn
2e790 6f 28 70 46 69 6c 65 2c 20 72 65 73 75 6c 74 32  o(pFile, result2
2e7a0 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 69 66 20 28  );.  }.  .  if (
2e7b0 66 64 33 20 3e 3d 20 30 29 20 7b 0a 20 20 20 20  fd3 >= 0) {.    
2e7c0 66 73 79 6e 63 28 66 64 33 29 3b 0a 20 20 20 20  fsync(fd3);.    
2e7d0 63 6c 6f 73 65 28 66 64 33 29 3b 0a 20 20 7d 0a  close(fd3);.  }.
2e7e0 20 20 69 66 20 28 66 64 32 20 3e 3d 20 30 29 20    if (fd2 >= 0) 
2e7f0 7b 0a 20 20 20 20 66 73 79 6e 63 28 66 64 32 29  {.    fsync(fd2)
2e800 3b 0a 20 20 20 20 63 6c 6f 73 65 28 66 64 32 29  ;.    close(fd2)
2e810 3b 0a 20 20 7d 0a 20 20 66 73 79 6e 63 28 66 64  ;.  }.  fsync(fd
2e820 31 29 3b 0a 09 0a 20 20 72 65 74 75 72 6e 20 72  1);...  return r
2e830 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  c;.}..static int
2e840 20 75 6e 69 78 54 72 75 6e 63 61 74 65 44 61 74   unixTruncateDat
2e850 61 62 61 73 65 28 75 6e 69 78 46 69 6c 65 20 2a  abase(unixFile *
2e860 70 46 69 6c 65 2c 20 69 6e 74 20 62 46 6c 61 67  pFile, int bFlag
2e870 73 29 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 66  s) {.  sqlite3_f
2e880 69 6c 65 20 2a 69 64 20 3d 20 28 73 71 6c 69 74  ile *id = (sqlit
2e890 65 33 5f 66 69 6c 65 20 2a 29 70 46 69 6c 65 3b  e3_file *)pFile;
2e8a0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
2e8b0 54 45 5f 4f 4b 3b 0a 20 20 76 6f 69 64 20 2a 70  TE_OK;.  void *p
2e8c0 4c 6f 63 6b 20 3d 20 4e 55 4c 4c 3b 0a 20 20 69  Lock = NULL;.  i
2e8d0 6e 74 20 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20  nt flags = 0;.  
2e8e0 69 6e 74 20 63 6f 72 72 75 70 74 46 69 6c 65 4c  int corruptFileL
2e8f0 6f 63 6b 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  ock = 0;.  int i
2e900 73 43 6f 72 72 75 70 74 20 3d 20 30 3b 0a 20 20  sCorrupt = 0;.  
2e910 69 6e 74 20 66 6f 72 63 65 20 3d 20 28 62 46 6c  int force = (bFl
2e920 61 67 73 20 26 20 53 51 4c 49 54 45 5f 54 52 55  ags & SQLITE_TRU
2e930 4e 43 41 54 45 5f 46 4f 52 43 45 29 3b 0a 20 20  NCATE_FORCE);.  
2e940 69 6e 74 20 73 61 66 65 46 61 69 6c 65 64 20 3d  int safeFailed =
2e950 20 30 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f   0;..#if SQLITE_
2e960 45 4e 41 42 4c 45 5f 44 41 54 41 5f 50 52 4f 54  ENABLE_DATA_PROT
2e970 45 43 54 49 4f 4e 0a 20 20 66 6c 61 67 73 20 7c  ECTION.  flags |
2e980 3d 20 70 46 69 6c 65 2d 3e 70 72 6f 74 46 6c 61  = pFile->protFla
2e990 67 73 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 53  gs;.#endif.#if S
2e9a0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
2e9b0 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 69 66 28  KING_STYLE.  if(
2e9c0 20 69 73 50 72 6f 78 79 4c 6f 63 6b 69 6e 67 4d   isProxyLockingM
2e9d0 6f 64 65 28 70 46 69 6c 65 29 20 29 7b 0a 20 20  ode(pFile) ){.  
2e9e0 20 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54    flags |= SQLIT
2e9f0 45 5f 4f 50 45 4e 5f 41 55 54 4f 50 52 4f 58 59  E_OPEN_AUTOPROXY
2ea00 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a  ;.  }.#endif.  .
2ea10 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 64 65    rc = sqlite3de
2ea20 6d 6f 5f 73 75 70 65 72 6c 6f 63 6b 28 70 46 69  mo_superlock(pFi
2ea30 6c 65 2d 3e 7a 50 61 74 68 2c 20 30 2c 20 66 6c  le->zPath, 0, fl
2ea40 61 67 73 2c 20 30 2c 20 30 2c 20 26 70 4c 6f 63  ags, 0, 0, &pLoc
2ea50 6b 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  k);.  if( rc ){.
2ea60 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2ea70 54 45 5f 43 4f 52 52 55 50 54 20 7c 7c 20 72 63  TE_CORRUPT || rc
2ea80 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 20  ==SQLITE_NOTADB 
2ea90 29 7b 0a 20 20 20 20 20 20 69 73 43 6f 72 72 75  ){.      isCorru
2eaa0 70 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 63  pt = 1;.      rc
2eab0 20 3d 20 73 71 6c 69 74 65 33 64 65 6d 6f 5f 73   = sqlite3demo_s
2eac0 75 70 65 72 6c 6f 63 6b 5f 63 6f 72 72 75 70 74  uperlock_corrupt
2ead0 28 69 64 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  (id, SQLITE_LOCK
2eae0 5f 45 58 43 4c 55 53 49 56 45 2c 0a 20 20 20 20  _EXCLUSIVE,.    
2eaf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2eb00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2eb10 20 20 20 20 20 26 63 6f 72 72 75 70 74 46 69 6c       &corruptFil
2eb20 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 7d 0a 20 20  eLock);.    }.  
2eb30 20 20 69 66 28 20 72 63 20 26 26 20 21 66 6f 72    if( rc && !for
2eb40 63 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ce ){.      retu
2eb50 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
2eb60 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2eb70 20 2f 2a 20 49 67 6e 6f 72 65 20 74 68 65 20 6c   /* Ignore the l
2eb80 6f 63 6b 69 6e 67 20 66 61 69 6c 75 72 65 20 69  ocking failure i
2eb90 66 20 66 6f 72 63 65 20 69 73 20 74 72 75 65 20  f force is true 
2eba0 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 28 62 46  */.  }.  if( (bF
2ebb0 6c 61 67 73 26 53 51 4c 49 54 45 5f 54 52 55 4e  lags&SQLITE_TRUN
2ebc0 43 41 54 45 5f 49 4e 49 54 49 41 4c 49 5a 45 5f  CATE_INITIALIZE_
2ebd0 48 45 41 44 45 52 5f 4d 41 53 4b 29 21 3d 30 20  HEADER_MASK)!=0 
2ebe0 29 7b 0a 20 20 20 20 2f 2a 20 69 6e 69 74 69 61  ){.    /* initia
2ebf0 6c 69 7a 65 20 61 20 6e 65 77 20 64 61 74 61 62  lize a new datab
2ec00 61 73 65 20 69 6e 20 54 4d 50 44 49 52 20 61 6e  ase in TMPDIR an
2ec10 64 20 63 6f 70 79 20 74 68 65 20 63 6f 6e 74 65  d copy the conte
2ec20 6e 74 73 20 6f 76 65 72 20 2a 2f 0a 20 20 20 20  nts over */.    
2ec30 63 6f 6e 73 74 20 63 68 61 72 20 2a 74 44 69 72  const char *tDir
2ec40 20 3d 20 75 6e 69 78 54 65 6d 70 46 69 6c 65 44   = unixTempFileD
2ec50 69 72 28 29 3b 0a 20 20 20 20 69 6e 74 20 74 44  ir();.    int tD
2ec60 69 72 4c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 74  irLen = strlen(t
2ec70 44 69 72 29 3b 0a 20 20 20 20 69 6e 74 20 74 4c  Dir);.    int tL
2ec80 65 6e 20 3d 20 73 69 7a 65 6f 66 28 63 68 61 72  en = sizeof(char
2ec90 29 20 2a 20 28 74 44 69 72 4c 65 6e 20 2b 20 31  ) * (tDirLen + 1
2eca0 32 29 3b 0a 20 20 20 20 63 68 61 72 20 2a 74 44  2);.    char *tD
2ecb0 62 50 61 74 68 20 3d 20 28 63 68 61 72 20 2a 29  bPath = (char *)
2ecc0 6d 61 6c 6c 6f 63 28 74 4c 65 6e 29 3b 0a 20 20  malloc(tLen);.  
2ecd0 20 20 69 6e 74 20 74 46 64 20 3d 20 2d 31 3b 0a    int tFd = -1;.
2ece0 20 20 20 20 0a 20 20 20 20 73 74 72 6c 63 70 79      .    strlcpy
2ecf0 28 74 44 62 50 61 74 68 2c 20 74 44 69 72 2c 20  (tDbPath, tDir, 
2ed00 74 4c 65 6e 29 3b 0a 20 20 20 20 69 66 28 20 74  tLen);.    if( t
2ed10 44 62 50 61 74 68 5b 28 74 44 69 72 4c 65 6e 2d  DbPath[(tDirLen-
2ed20 31 29 5d 20 21 3d 20 27 2f 27 20 29 7b 0a 20 20  1)] != '/' ){.  
2ed30 20 20 20 20 73 74 72 6c 63 61 74 28 74 44 62 50      strlcat(tDbP
2ed40 61 74 68 2c 20 22 2f 74 6d 70 64 62 58 58 58 58  ath, "/tmpdbXXXX
2ed50 58 22 2c 20 74 4c 65 6e 29 3b 0a 20 20 20 20 7d  X", tLen);.    }
2ed60 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 73 74   else {.      st
2ed70 72 6c 63 61 74 28 74 44 62 50 61 74 68 2c 20 22  rlcat(tDbPath, "
2ed80 74 6d 70 64 62 58 58 58 58 58 22 2c 20 74 4c 65  tmpdbXXXXX", tLe
2ed90 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 74 46  n);.    }.    tF
2eda0 64 20 3d 20 6d 6b 73 74 65 6d 70 28 74 44 62 50  d = mkstemp(tDbP
2edb0 61 74 68 29 3b 0a 20 20 20 20 69 66 28 20 74 46  ath);.    if( tF
2edc0 64 3d 3d 2d 31 20 29 7b 0a 20 20 20 20 20 20 73  d==-1 ){.      s
2edd0 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46  toreLastErrno(pF
2ede0 69 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20  ile, errno);.   
2edf0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
2ee00 4f 45 52 52 3b 0a 20 20 20 20 20 20 73 61 66 65  OERR;.      safe
2ee10 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20  Failed = 1;.    
2ee20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
2ee30 69 74 65 33 20 2a 74 44 62 20 3d 20 4e 55 4c 4c  ite3 *tDb = NULL
2ee40 3b 0a 20 20 20 20 20 20 63 6f 70 79 66 69 6c 65  ;.      copyfile
2ee50 5f 73 74 61 74 65 5f 74 20 73 3b 0a 20 20 20 20  _state_t s;.    
2ee60 20 20 69 6e 74 20 74 72 63 20 3d 20 73 71 6c 69    int trc = sqli
2ee70 74 65 33 5f 6f 70 65 6e 5f 76 32 28 74 44 62 50  te3_open_v2(tDbP
2ee80 61 74 68 2c 20 26 74 44 62 2c 0a 20 20 20 20 20  ath, &tDb,.     
2ee90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 53                (S
2eea0 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
2eeb0 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  E | SQLITE_OPEN_
2eec0 52 45 41 44 57 52 49 54 45 0a 20 20 20 20 20 20  READWRITE.      
2eed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2eee0 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 41 55  | SQLITE_OPEN_AU
2eef0 54 4f 50 52 4f 58 59 29 2c 20 4e 55 4c 4c 29 3b  TOPROXY), NULL);
2ef00 0a 20 20 20 20 20 20 63 68 61 72 20 2a 65 72 72  .      char *err
2ef10 6d 73 67 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20  msg = NULL;.    
2ef20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71    const char *sq
2ef30 6c 20 3d 20 22 22 3b 0a 20 20 20 20 20 20 69 66  l = "";.      if
2ef40 28 20 21 74 72 63 20 26 26 20 28 62 46 6c 61 67  ( !trc && (bFlag
2ef50 73 26 53 51 4c 49 54 45 5f 54 52 55 4e 43 41 54  s&SQLITE_TRUNCAT
2ef60 45 5f 50 41 47 45 53 49 5a 45 5f 4d 41 53 4b 29  E_PAGESIZE_MASK)
2ef70 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73   ){.        cons
2ef80 74 20 63 68 61 72 20 70 61 67 65 73 69 7a 65 5f  t char pagesize_
2ef90 73 71 6c 5b 34 5d 5b 32 32 5d 20 3d 20 7b 0a 20  sql[4][22] = {. 
2efa0 20 20 20 20 20 20 20 20 20 22 70 72 61 67 6d 61           "pragma
2efb0 20 70 61 67 65 5f 73 69 7a 65 3d 31 30 32 34 22   page_size=1024"
2efc0 2c 0a 20 20 20 20 20 20 20 20 20 20 22 70 72 61  ,.          "pra
2efd0 67 6d 61 20 70 61 67 65 5f 73 69 7a 65 3d 32 30  gma page_size=20
2efe0 34 38 22 2c 0a 20 20 20 20 20 20 20 20 20 20 22  48",.          "
2eff0 70 72 61 67 6d 61 20 70 61 67 65 5f 73 69 7a 65  pragma page_size
2f000 3d 34 30 39 36 22 2c 0a 20 20 20 20 20 20 20 20  =4096",.        
2f010 20 20 22 70 72 61 67 6d 61 20 70 61 67 65 5f 73    "pragma page_s
2f020 69 7a 65 3d 38 31 39 32 22 20 0a 20 20 20 20 20  ize=8192" .     
2f030 20 20 20 7d 3b 0a 20 20 20 20 20 20 20 20 69 6e     };.        in
2f040 74 20 69 50 61 67 65 73 69 7a 65 20 3d 20 28 28  t iPagesize = ((
2f050 28 62 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 54  (bFlags&SQLITE_T
2f060 52 55 4e 43 41 54 45 5f 50 41 47 45 53 49 5a 45  RUNCATE_PAGESIZE
2f070 5f 4d 41 53 4b 29 20 3e 3e 20 34 29 20 2d 20 31  _MASK) >> 4) - 1
2f080 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
2f090 74 28 20 69 50 61 67 65 73 69 7a 65 3e 3d 30 20  t( iPagesize>=0 
2f0a0 26 26 20 69 50 61 67 65 73 69 7a 65 3c 3d 34 20  && iPagesize<=4 
2f0b0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 20 3d  );.        sql =
2f0c0 20 70 61 67 65 73 69 7a 65 5f 73 71 6c 5b 69 50   pagesize_sql[iP
2f0d0 61 67 65 73 69 7a 65 5d 3b 0a 20 20 20 20 20 20  agesize];.      
2f0e0 20 20 74 72 63 20 3d 20 73 71 6c 69 74 65 33 5f    trc = sqlite3_
2f0f0 65 78 65 63 28 74 44 62 2c 20 73 71 6c 2c 20 30  exec(tDb, sql, 0
2f100 2c 20 30 2c 20 26 65 72 72 6d 73 67 29 3b 0a 20  , 0, &errmsg);. 
2f110 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
2f120 20 21 74 72 63 20 29 7b 0a 20 20 20 20 20 20 20   !trc ){.       
2f130 20 63 6f 6e 73 74 20 63 68 61 72 20 61 75 74 6f   const char auto
2f140 76 61 63 75 75 6d 5f 73 71 6c 5b 33 5d 5b 32 31  vacuum_sql[3][21
2f150 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 20 20  ] = {.          
2f160 22 70 72 61 67 6d 61 20 61 75 74 6f 5f 76 61 63  "pragma auto_vac
2f170 75 75 6d 3d 30 22 2c 0a 20 20 20 20 20 20 20 20  uum=0",.        
2f180 20 20 22 70 72 61 67 6d 61 20 61 75 74 6f 5f 76    "pragma auto_v
2f190 61 63 75 75 6d 3d 31 22 2c 0a 20 20 20 20 20 20  acuum=1",.      
2f1a0 20 20 20 20 22 70 72 61 67 6d 61 20 61 75 74 6f      "pragma auto
2f1b0 5f 76 61 63 75 75 6d 3d 32 22 0a 20 20 20 20 20  _vacuum=2".     
2f1c0 20 20 20 7d 3b 0a 20 20 20 20 20 20 20 20 69 6e     };.        in
2f1d0 74 20 69 41 75 74 6f 76 61 63 75 75 6d 20 3d 20  t iAutovacuum = 
2f1e0 32 3b 20 2f 2a 20 64 65 66 61 75 6c 74 20 74 6f  2; /* default to
2f1f0 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 2a 2f 0a   incremental */.
2f200 20 20 20 20 20 20 20 20 69 66 28 20 28 62 46 6c          if( (bFl
2f210 61 67 73 26 53 51 4c 49 54 45 5f 54 52 55 4e 43  ags&SQLITE_TRUNC
2f220 41 54 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4d  ATE_AUTOVACUUM_M
2f230 41 53 4b 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ASK) ){.        
2f240 20 20 69 41 75 74 6f 76 61 63 75 75 6d 20 3d 20    iAutovacuum = 
2f250 28 28 28 62 46 6c 61 67 73 26 53 51 4c 49 54 45  (((bFlags&SQLITE
2f260 5f 54 52 55 4e 43 41 54 45 5f 41 55 54 4f 56 41  _TRUNCATE_AUTOVA
2f270 43 55 55 4d 5f 4d 41 53 4b 29 20 3e 3e 20 32 29  CUUM_MASK) >> 2)
2f280 20 2d 20 31 29 3b 0a 20 20 20 20 20 20 20 20 7d   - 1);.        }
2f290 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2f2a0 20 69 41 75 74 6f 76 61 63 75 75 6d 3e 3d 30 20   iAutovacuum>=0 
2f2b0 26 26 20 69 41 75 74 6f 76 61 63 75 75 6d 3c 3d  && iAutovacuum<=
2f2c0 32 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  2 );.        sql
2f2d0 20 3d 20 61 75 74 6f 76 61 63 75 75 6d 5f 73 71   = autovacuum_sq
2f2e0 6c 5b 69 41 75 74 6f 76 61 63 75 75 6d 5d 3b 0a  l[iAutovacuum];.
2f2f0 20 20 20 20 20 20 20 20 74 72 63 20 3d 20 73 71          trc = sq
2f300 6c 69 74 65 33 5f 65 78 65 63 28 74 44 62 2c 20  lite3_exec(tDb, 
2f310 73 71 6c 2c 20 30 2c 20 30 2c 20 26 65 72 72 6d  sql, 0, 0, &errm
2f320 73 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  sg);.      }.   
2f330 20 20 20 69 66 28 20 21 74 72 63 20 26 26 20 28     if( !trc && (
2f340 62 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 54 52  bFlags&SQLITE_TR
2f350 55 4e 43 41 54 45 5f 4a 4f 55 52 4e 41 4c 4d 4f  UNCATE_JOURNALMO
2f360 44 45 5f 57 41 4c 29 20 29 7b 0a 20 20 20 20 20  DE_WAL) ){.     
2f370 20 20 20 73 71 6c 20 3d 20 22 70 72 61 67 6d 61     sql = "pragma
2f380 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61   journal_mode=wa
2f390 6c 22 3b 0a 20 20 20 20 20 20 20 20 74 72 63 20  l";.        trc 
2f3a0 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 74  = sqlite3_exec(t
2f3b0 44 62 2c 20 73 71 6c 2c 20 30 2c 20 30 2c 20 26  Db, sql, 0, 0, &
2f3c0 65 72 72 6d 73 67 29 3b 0a 20 20 20 20 20 20 7d  errmsg);.      }
2f3d0 0a 20 20 20 20 20 20 69 66 28 20 74 72 63 20 29  .      if( trc )
2f3e0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 74  {.        if( !t
2f3f0 44 62 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  Db ){.          
2f400 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  fprintf(stderr, 
2f410 22 66 61 69 6c 65 64 20 74 6f 20 6f 70 65 6e 20  "failed to open 
2f420 74 65 6d 70 20 64 61 74 61 62 61 73 65 20 27 25  temp database '%
2f430 73 27 20 74 6f 20 72 65 73 65 74 20 22 0a 20 20  s' to reset ".  
2f440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f450 20 20 20 20 20 20 20 20 22 74 72 75 6e 63 61 74          "truncat
2f460 65 64 20 64 61 74 61 62 61 73 65 20 25 73 20 77  ed database %s w
2f470 69 74 68 20 66 6c 61 67 73 20 25 78 3a 20 25 64  ith flags %x: %d
2f480 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
2f490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f4a0 74 44 62 50 61 74 68 2c 20 70 46 69 6c 65 2d 3e  tDbPath, pFile->
2f4b0 7a 50 61 74 68 2c 20 62 46 6c 61 67 73 2c 20 74  zPath, bFlags, t
2f4c0 72 63 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  rc);.        }el
2f4d0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 66 70  se{.          fp
2f4e0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 66  rintf(stderr, "f
2f4f0 61 69 6c 65 64 20 74 6f 20 73 65 74 20 27 25 73  ailed to set '%s
2f500 27 20 6f 6e 20 74 72 75 6e 63 61 74 65 64 20 64  ' on truncated d
2f510 61 74 61 62 61 73 65 20 25 73 2c 20 25 64 3a 20  atabase %s, %d: 
2f520 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
2f530 20 20 20 20 20 20 20 20 20 20 20 20 22 25 73 5c              "%s\
2f540 6e 22 2c 20 73 71 6c 2c 20 70 46 69 6c 65 2d 3e  n", sql, pFile->
2f550 7a 50 61 74 68 2c 20 74 72 63 2c 20 65 72 72 6d  zPath, trc, errm
2f560 73 67 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  sg);.        }. 
2f570 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
2f580 20 74 44 62 20 29 7b 0a 20 20 20 20 20 20 20 20   tDb ){.        
2f590 69 6e 74 20 6f 66 66 20 3d 20 30 3b 0a 20 20 20  int off = 0;.   
2f5a0 20 20 20 20 20 2f 2a 20 6d 65 72 67 65 20 74 68       /* merge th
2f5b0 65 20 77 61 6c 20 69 6e 74 6f 20 74 68 65 20 64  e wal into the d
2f5c0 62 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c  b */.        sql
2f5d0 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f  ite3_file_contro
2f5e0 6c 28 74 44 62 2c 20 4e 55 4c 4c 2c 20 53 51 4c  l(tDb, NULL, SQL
2f5f0 49 54 45 5f 46 43 4e 54 4c 5f 50 45 52 53 49 53  ITE_FCNTL_PERSIS
2f600 54 5f 57 41 4c 2c 20 26 6f 66 66 29 3b 0a 20 20  T_WAL, &off);.  
2f610 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c        sqlite3_cl
2f620 6f 73 65 28 74 44 62 29 3b 0a 20 20 20 20 20 20  ose(tDb);.      
2f630 7d 0a 20 20 20 20 20 20 73 20 3d 20 63 6f 70 79  }.      s = copy
2f640 66 69 6c 65 5f 73 74 61 74 65 5f 61 6c 6c 6f 63  file_state_alloc
2f650 28 29 3b 0a 20 20 20 20 20 20 6c 73 65 65 6b 28  ();.      lseek(
2f660 74 46 64 2c 20 30 2c 20 53 45 45 4b 5f 53 45 54  tFd, 0, SEEK_SET
2f670 29 3b 0a 20 20 20 20 20 20 6c 73 65 65 6b 28 70  );.      lseek(p
2f680 46 69 6c 65 2d 3e 68 2c 20 30 2c 20 53 45 45 4b  File->h, 0, SEEK
2f690 5f 53 45 54 29 3b 0a 20 20 20 20 20 20 69 66 28  _SET);.      if(
2f6a0 20 66 63 6f 70 79 66 69 6c 65 28 74 46 64 2c 20   fcopyfile(tFd, 
2f6b0 70 46 69 6c 65 2d 3e 68 2c 20 73 2c 20 43 4f 50  pFile->h, s, COP
2f6c0 59 46 49 4c 45 5f 44 41 54 41 29 20 29 7b 0a 20  YFILE_DATA) ){. 
2f6d0 20 20 20 20 20 20 20 69 6e 74 20 65 72 72 3d 65         int err=e
2f6e0 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 73 77  rrno;.        sw
2f6f0 69 74 63 68 28 65 72 72 29 20 7b 0a 20 20 20 20  itch(err) {.    
2f700 20 20 20 20 20 20 63 61 73 65 20 45 4e 4f 4d 45        case ENOME
2f710 4d 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  M:.            t
2f720 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
2f730 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  M;.            b
2f740 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
2f750 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 20  default:.       
2f760 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72       storeLastEr
2f770 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72 29 3b  rno(pFile, err);
2f780 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 72 63  .            trc
2f790 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b   = SQLITE_IOERR;
2f7a0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2f7b0 20 7d 0a 20 20 20 20 20 20 63 6f 70 79 66 69 6c   }.      copyfil
2f7c0 65 5f 73 74 61 74 65 5f 66 72 65 65 28 73 29 3b  e_state_free(s);
2f7d0 0a 20 20 20 20 20 20 66 73 79 6e 63 28 70 46 69  .      fsync(pFi
2f7e0 6c 65 2d 3e 68 29 3b 0a 20 20 20 20 20 20 63 6c  le->h);.      cl
2f7f0 6f 73 65 28 74 46 64 29 3b 0a 20 20 20 20 20 20  ose(tFd);.      
2f800 75 6e 6c 69 6e 6b 28 74 44 62 50 61 74 68 29 3b  unlink(tDbPath);
2f810 0a 20 20 20 20 20 20 69 66 28 20 74 72 63 21 3d  .      if( trc!=
2f820 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2f830 20 20 20 20 20 73 61 66 65 46 61 69 6c 65 64 20       safeFailed 
2f840 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72 63 20  = 1;.        rc 
2f850 3d 20 74 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  = trc;.      }. 
2f860 20 20 20 7d 0a 20 20 20 20 66 72 65 65 28 74 44     }.    free(tD
2f870 62 50 61 74 68 29 3b 0a 20 20 7d 20 65 6c 73 65  bPath);.  } else
2f880 20 7b 0a 20 20 20 20 72 63 20 3d 20 70 46 69 6c   {.    rc = pFil
2f890 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 54 72 75  e->pMethod->xTru
2f8a0 6e 63 61 74 65 28 69 64 2c 20 0a 20 20 20 20 20  ncate(id, .     
2f8b0 20 20 20 20 20 20 28 28 70 46 69 6c 65 2d 3e 66        ((pFile->f
2f8c0 73 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  sFlags & SQLITE_
2f8d0 46 53 46 4c 41 47 53 5f 49 53 5f 4d 53 44 4f 53  FSFLAGS_IS_MSDOS
2f8e0 29 20 21 3d 20 30 29 20 3f 20 31 4c 20 3a 20 30  ) != 0) ? 1L : 0
2f8f0 4c 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  L);.    if( rc )
2f900 7b 0a 20 20 20 20 20 20 73 61 66 65 46 61 69 6c  {.      safeFail
2f910 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ed = 1;.    }.  
2f920 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
2f930 54 45 5f 4f 4b 20 7c 7c 20 66 6f 72 63 65 20 29  TE_OK || force )
2f940 7b 0a 20 20 20 20 72 63 20 3d 20 75 6e 69 78 49  {.    rc = unixI
2f950 6e 76 61 6c 69 64 61 74 65 53 75 70 70 6f 72 74  nvalidateSupport
2f960 46 69 6c 65 73 28 70 46 69 6c 65 2c 20 30 29 3b  Files(pFile, 0);
2f970 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
2f980 20 20 20 20 20 73 61 66 65 46 61 69 6c 65 64 20       safeFailed 
2f990 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = 1;.    }.  }. 
2f9a0 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d   pFile->pMethod-
2f9b0 3e 78 53 79 6e 63 28 69 64 2c 20 53 51 4c 49 54  >xSync(id, SQLIT
2f9c0 45 5f 53 59 4e 43 5f 46 55 4c 4c 29 3b 0a 0a 0a  E_SYNC_FULL);...
2f9d0 20 20 69 66 28 20 69 73 43 6f 72 72 75 70 74 20    if( isCorrupt 
2f9e0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 64 65  ){.    sqlite3de
2f9f0 6d 6f 5f 73 75 70 65 72 75 6e 6c 6f 63 6b 5f 63  mo_superunlock_c
2fa00 6f 72 72 75 70 74 28 69 64 2c 20 63 6f 72 72 75  orrupt(id, corru
2fa10 70 74 46 69 6c 65 4c 6f 63 6b 29 3b 0a 20 20 7d  ptFileLock);.  }
2fa20 65 6c 73 65 20 69 66 28 20 70 4c 6f 63 6b 20 29  else if( pLock )
2fa30 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 64 65 6d  {.    sqlite3dem
2fa40 6f 5f 73 75 70 65 72 75 6e 6c 6f 63 6b 28 70 4c  o_superunlock(pL
2fa50 6f 63 6b 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ock);.  }else{. 
2fa60 20 20 20 61 73 73 65 72 74 28 66 6f 72 63 65 29     assert(force)
2fa70 3b 0a 20 20 7d 0a 20 20 0a 20 20 69 66 28 20 66  ;.  }.  .  if( f
2fa80 6f 72 63 65 20 26 26 20 73 61 66 65 46 61 69 6c  orce && safeFail
2fa90 65 64 29 7b 0a 20 20 20 20 72 63 20 3d 20 75 6e  ed){.    rc = un
2faa0 69 78 55 6e 73 61 66 65 54 72 75 6e 63 61 74 65  ixUnsafeTruncate
2fab0 44 61 74 61 62 61 73 65 28 70 46 69 6c 65 29 3b  Database(pFile);
2fac0 0a 20 20 7d 0a 20 20 0a 20 20 72 65 74 75 72 6e  .  }.  .  return
2fad0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2a 20 4c   rc;.}../*. ** L
2fae0 6f 63 6b 20 6c 6f 63 61 74 69 6f 6e 73 20 66 6f  ock locations fo
2faf0 72 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  r shared-memory 
2fb00 6c 6f 63 6b 73 20 75 73 65 64 20 62 79 20 57 41  locks used by WA
2fb10 4c 20 6d 6f 64 65 2e 0a 20 2a 2f 0a 23 69 66 6e  L mode.. */.#ifn
2fb20 64 65 66 20 53 48 4d 5f 42 41 53 45 0a 23 20 64  def SHM_BASE.# d
2fb30 65 66 69 6e 65 20 53 48 4d 5f 42 41 53 45 20 20  efine SHM_BASE  
2fb40 20 20 20 20 20 20 20 20 31 32 30 0a 23 20 64 65          120.# de
2fb50 66 69 6e 65 20 53 48 4d 5f 57 52 49 54 45 20 20  fine SHM_WRITE  
2fb60 20 20 20 20 20 20 20 53 48 4d 5f 42 41 53 45 0a         SHM_BASE.
2fb70 23 20 64 65 66 69 6e 65 20 53 48 4d 5f 43 48 45  # define SHM_CHE
2fb80 43 4b 50 4f 49 4e 54 20 20 20 20 28 53 48 4d 5f  CKPOINT    (SHM_
2fb90 42 41 53 45 2b 31 29 0a 23 20 64 65 66 69 6e 65  BASE+1).# define
2fba0 20 53 48 4d 5f 52 45 43 4f 56 45 52 20 20 20 20   SHM_RECOVER    
2fbb0 20 20 20 28 53 48 4d 5f 42 41 53 45 2b 32 29 0a     (SHM_BASE+2).
2fbc0 23 20 64 65 66 69 6e 65 20 53 48 4d 5f 52 45 41  # define SHM_REA
2fbd0 44 5f 46 49 52 53 54 20 20 20 20 28 53 48 4d 5f  D_FIRST    (SHM_
2fbe0 42 41 53 45 2b 33 29 0a 23 20 64 65 66 69 6e 65  BASE+3).# define
2fbf0 20 53 48 4d 5f 52 45 41 44 5f 53 49 5a 45 20 20   SHM_READ_SIZE  
2fc00 20 20 20 35 0a 23 65 6e 64 69 66 20 2f 2a 20 53     5.#endif /* S
2fc10 48 4d 5f 42 41 53 45 20 2a 2f 0a 0a 2f 2a 0a 2a  HM_BASE */../*.*
2fc20 2a 20 54 68 69 73 20 74 65 73 74 20 6f 6e 6c 79  * This test only
2fc30 20 77 6f 72 6b 73 20 66 6f 72 20 6c 6f 63 6b 20   works for lock 
2fc40 74 65 73 74 69 6e 67 20 6f 6e 20 75 6e 69 78 2f  testing on unix/
2fc50 70 6f 73 69 78 20 56 46 53 2e 0a 2a 2a 20 41 64  posix VFS..** Ad
2fc60 61 70 74 65 64 20 66 72 6f 6d 20 74 6f 6f 6c 2f  apted from tool/
2fc70 67 65 74 6c 6f 63 6b 2e 63 20 66 34 63 33 39 62  getlock.c f4c39b
2fc80 36 35 31 33 37 30 31 35 36 63 61 65 39 37 39 35  651370156cae9795
2fc90 30 31 61 37 62 31 35 36 62 64 62 61 35 30 65 37  01a7b156bdba50e7
2fca0 63 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ce.*/.static int
2fcb0 20 75 6e 69 78 4c 6f 63 6b 73 74 61 74 65 50 69   unixLockstatePi
2fcc0 64 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c  d(unixFile *pFil
2fcd0 65 2c 20 70 69 64 5f 74 20 70 69 64 2c 20 69 6e  e, pid_t pid, in
2fce0 74 20 2a 70 4c 6f 63 6b 73 74 61 74 65 29 7b 0a  t *pLockstate){.
2fcf0 20 20 69 6e 74 20 68 44 62 3b 20 20 20 20 20 20    int hDb;      
2fd00 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69    /* File descri
2fd10 70 74 6f 72 20 66 6f 72 20 74 68 65 20 6f 70 65  ptor for the ope
2fd20 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  n database file 
2fd30 2a 2f 0a 20 20 69 6e 74 20 68 53 68 6d 20 3d 20  */.  int hShm = 
2fd40 2d 31 3b 20 20 2f 2a 20 46 69 6c 65 20 64 65 73  -1;  /* File des
2fd50 63 72 69 70 74 6f 72 20 66 6f 72 20 57 41 4c 20  criptor for WAL 
2fd60 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69  shared-memory fi
2fd70 6c 65 20 2a 2f 0a 20 20 73 73 69 7a 65 5f 74 20  le */.  ssize_t 
2fd80 67 6f 74 3b 20 20 20 20 2f 2a 20 42 79 74 65 73  got;    /* Bytes
2fd90 20 72 65 61 64 20 66 72 6f 6d 20 68 65 61 64 65   read from heade
2fda0 72 20 2a 2f 0a 20 20 69 6e 74 20 69 73 57 61 6c  r */.  int isWal
2fdb0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
2fdc0 20 20 2f 2a 20 54 72 75 65 20 69 66 20 69 6e 20    /* True if in 
2fdd0 57 41 4c 20 6d 6f 64 65 20 2a 2f 0a 20 20 69 6e  WAL mode */.  in
2fde0 74 20 6e 4c 6f 63 6b 20 3d 20 30 3b 20 20 20 20  t nLock = 0;    
2fdf0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2fe00 65 72 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64  er of locks held
2fe10 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 48 64 72 20   */.  int noHdr 
2fe20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
2fe30 20 2f 2a 20 5a 65 72 6f 20 62 79 74 65 20 44 42   /* Zero byte DB
2fe40 20 68 61 73 20 6e 6f 20 68 65 61 64 65 72 20 2a   has no header *
2fe50 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
2fe60 72 20 61 48 64 72 5b 31 30 30 5d 3b 20 20 20 2f  r aHdr[100];   /
2fe70 2a 20 44 61 74 61 62 61 73 65 20 68 65 61 64 65  * Database heade
2fe80 72 20 2a 2f 0a 20 20 0a 20 20 61 73 73 65 72 74  r */.  .  assert
2fe90 28 70 4c 6f 63 6b 73 74 61 74 65 29 3b 0a 20 20  (pLockstate);.  
2fea0 0a 20 20 2f 2a 20 6d 61 6b 65 20 73 75 72 65 20  .  /* make sure 
2feb0 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77  we are dealing w
2fec0 69 74 68 20 61 20 64 61 74 61 62 61 73 65 20 66  ith a database f
2fed0 69 6c 65 20 2a 2f 0a 20 20 68 44 62 20 3d 20 70  ile */.  hDb = p
2fee0 46 69 6c 65 2d 3e 68 3b 0a 20 20 69 66 28 20 68  File->h;.  if( h
2fef0 44 62 3c 30 20 29 7b 0a 20 20 20 20 2a 70 4c 6f  Db<0 ){.    *pLo
2ff00 63 6b 73 74 61 74 65 20 3d 20 53 51 4c 49 54 45  ckstate = SQLITE
2ff10 5f 4c 4f 43 4b 53 54 41 54 45 5f 45 52 52 4f 52  _LOCKSTATE_ERROR
2ff20 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
2ff30 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  ITE_ERROR;.  }. 
2ff40 20 61 73 73 65 72 74 28 20 28 73 74 72 6c 65 6e   assert( (strlen
2ff50 28 53 51 4c 49 54 45 5f 46 49 4c 45 5f 48 45 41  (SQLITE_FILE_HEA
2ff60 44 45 52 29 2b 31 29 3d 3d 53 51 4c 49 54 45 5f  DER)+1)==SQLITE_
2ff70 46 49 4c 45 5f 48 45 41 44 45 52 5f 4c 45 4e 20  FILE_HEADER_LEN 
2ff80 29 3b 0a 20 20 67 6f 74 20 3d 20 70 72 65 61 64  );.  got = pread
2ff90 28 68 44 62 2c 20 61 48 64 72 2c 20 31 30 30 2c  (hDb, aHdr, 100,
2ffa0 20 30 29 3b 0a 20 20 69 66 28 20 67 6f 74 3c 30   0);.  if( got<0
2ffb0 20 29 7b 0a 20 20 20 20 2a 70 4c 6f 63 6b 73 74   ){.    *pLockst
2ffc0 61 74 65 20 3d 20 53 51 4c 49 54 45 5f 4c 4f 43  ate = SQLITE_LOC
2ffd0 4b 53 54 41 54 45 5f 45 52 52 4f 52 3b 0a 20 20  KSTATE_ERROR;.  
2ffe0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2fff0 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
30000 20 67 6f 74 3d 3d 30 20 29 7b 0a 20 20 20 20 6e   got==0 ){.    n
30010 6f 48 64 72 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  oHdr = 1;.  }els
30020 65 20 69 66 28 20 67 6f 74 21 3d 31 30 30 0a 20  e if( got!=100. 
30030 20 20 20 20 20 20 20 20 7c 7c 20 6d 65 6d 63 6d          || memcm
30040 70 28 61 48 64 72 2c 20 53 51 4c 49 54 45 5f 46  p(aHdr, SQLITE_F
30050 49 4c 45 5f 48 45 41 44 45 52 2c 20 53 51 4c 49  ILE_HEADER, SQLI
30060 54 45 5f 46 49 4c 45 5f 48 45 41 44 45 52 5f 4c  TE_FILE_HEADER_L
30070 45 4e 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20  EN)!=0.  ){.    
30080 2a 70 4c 6f 63 6b 73 74 61 74 65 20 3d 20 53 51  *pLockstate = SQ
30090 4c 49 54 45 5f 4c 4f 43 4b 53 54 41 54 45 5f 4e  LITE_LOCKSTATE_N
300a0 4f 54 41 44 42 3b 0a 20 20 20 20 72 65 74 75 72  OTADB;.    retur
300b0 6e 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3b  n SQLITE_NOTADB;
300c0 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 46 69 72  .  }.  .  /* Fir
300d0 73 74 20 63 68 65 63 6b 20 66 6f 72 20 61 6e 20  st check for an 
300e0 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 2a  exclusive lock *
300f0 2f 0a 20 20 6e 4c 6f 63 6b 20 2b 3d 20 75 6e 69  /.  nLock += uni
30100 78 49 73 4c 6f 63 6b 65 64 28 70 69 64 2c 20 68  xIsLocked(pid, h
30110 44 62 2c 20 46 5f 52 44 4c 43 4b 2c 20 53 48 41  Db, F_RDLCK, SHA
30120 52 45 44 5f 46 49 52 53 54 2c 20 53 48 41 52 45  RED_FIRST, SHARE
30130 44 5f 53 49 5a 45 2c 0a 20 20 20 20 20 20 20 20  D_SIZE,.        
30140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30150 22 45 58 43 4c 55 53 49 56 45 22 29 3b 0a 20 20  "EXCLUSIVE");.  
30160 69 66 20 28 21 6e 6f 48 64 72 29 20 7b 0a 20 20  if (!noHdr) {.  
30170 20 20 69 73 57 61 6c 20 3d 20 61 48 64 72 5b 31    isWal = aHdr[1
30180 38 5d 3d 3d 32 3b 0a 20 20 7d 0a 20 20 69 66 28  8]==2;.  }.  if(
30190 20 6e 4c 6f 63 6b 3d 3d 30 20 26 26 20 69 73 57   nLock==0 && isW
301a0 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  al==0 ){.    /* 
301b0 52 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65 20 2a 2f  Rollback mode */
301c0 0a 20 20 20 20 6e 4c 6f 63 6b 20 2b 3d 20 75 6e  .    nLock += un
301d0 69 78 49 73 4c 6f 63 6b 65 64 28 70 69 64 2c 20  ixIsLocked(pid, 
301e0 68 44 62 2c 20 46 5f 57 52 4c 43 4b 2c 20 50 45  hDb, F_WRLCK, PE
301f0 4e 44 49 4e 47 5f 42 59 54 45 2c 20 53 48 41 52  NDING_BYTE, SHAR
30200 45 44 5f 53 49 5a 45 2b 32 2c 0a 20 20 20 20 20  ED_SIZE+2,.     
30210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30220 20 20 20 20 20 22 50 45 4e 44 49 4e 47 7c 52 45       "PENDING|RE
30230 53 45 52 56 45 44 7c 53 48 41 52 45 44 22 29 3b  SERVED|SHARED");
30240 0a 20 20 7d 0a 20 20 69 66 28 20 6e 4c 6f 63 6b  .  }.  if( nLock
30250 3d 3d 30 20 26 26 20 69 73 57 61 6c 21 3d 30 20  ==0 && isWal!=0 
30260 29 7b 0a 20 20 20 20 2f 2a 20 6c 6f 6f 6b 75 70  ){.    /* lookup
30270 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
30280 70 74 6f 72 20 66 6f 72 20 74 68 65 20 73 68 61  ptor for the sha
30290 72 65 64 20 6d 65 6d 6f 72 79 20 66 69 6c 65 20  red memory file 
302a0 69 66 20 77 65 20 68 61 76 65 20 69 74 20 6f 70  if we have it op
302b0 65 6e 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 69  en.    ** in thi
302c0 73 20 70 72 6f 63 65 73 73 20 2a 2f 0a 20 20 20  s process */.   
302d0 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
302e0 29 3b 20 2f 2a 20 42 65 63 61 75 73 65 20 70 46  ); /* Because pF
302f0 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 69 73 20 73  ile->pInode is s
30300 68 61 72 65 64 20 61 63 72 6f 73 73 20 74 68 72  hared across thr
30310 65 61 64 73 20 2a 2f 0a 20 20 20 20 75 6e 69 78  eads */.    unix
30320 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64  ShmNode *pShmNod
30330 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  e = pFile->pInod
30340 65 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 20  e->pShmNode;.   
30350 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 20 29 7b   if( pShmNode ){
30360 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
30370 75 74 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e  utex_enter(pShmN
30380 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20  ode->mutex);.   
30390 20 20 20 0a 20 20 20 20 20 20 68 53 68 6d 20 3d     .      hShm =
303a0 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3b 0a 20 20   pShmNode->h;.  
303b0 20 20 20 20 69 66 28 20 68 53 68 6d 20 3e 3d 20      if( hShm >= 
303c0 30 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0){.        if( 
303d0 75 6e 69 78 49 73 4c 6f 63 6b 65 64 28 70 69 64  unixIsLocked(pid
303e0 2c 20 68 53 68 6d 2c 20 46 5f 52 44 4c 43 4b 2c  , hShm, F_RDLCK,
303f0 20 53 48 4d 5f 52 45 43 4f 56 45 52 2c 20 31 2c   SHM_RECOVER, 1,
30400 20 22 57 41 4c 2d 52 45 43 4f 56 45 52 59 22 29   "WAL-RECOVERY")
30410 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20 75   ||.           u
30420 6e 69 78 49 73 4c 6f 63 6b 65 64 28 70 69 64 2c  nixIsLocked(pid,
30430 20 68 53 68 6d 2c 20 46 5f 52 44 4c 43 4b 2c 20   hShm, F_RDLCK, 
30440 53 48 4d 5f 57 52 49 54 45 2c 20 31 2c 20 22 57  SHM_WRITE, 1, "W
30450 41 4c 2d 57 52 49 54 45 22 29 20 29 7b 0a 20 20  AL-WRITE") ){.  
30460 20 20 20 20 20 20 20 20 6e 4c 6f 63 6b 20 3d 20          nLock = 
30470 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
30480 20 20 20 7d 0a 20 20 20 20 20 20 0a 20 20 20 20     }.      .    
30490 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
304a0 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e  leave(pShmNode->
304b0 6d 75 74 65 78 29 3b 0a 20 20 20 20 7d 20 0a 20  mutex);.    } . 
304c0 20 20 20 0a 20 20 20 20 69 66 28 20 68 53 68 6d     .    if( hShm
304d0 3c 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 74  <0 ){.      /* t
304e0 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  he shared memory
304f0 20 66 69 6c 65 20 69 73 6e 27 74 20 6f 70 65 6e   file isn't open
30500 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73   in this process
30510 20 73 70 61 63 65 2c 20 6f 70 65 6e 20 6f 75 72   space, open our
30520 0a 20 20 20 20 20 20 2a 2a 20 6f 77 6e 20 46 44  .      ** own FD
30530 20 2a 2f 0a 20 20 20 20 20 20 63 68 61 72 20 7a   */.      char z
30540 53 68 6d 5b 4d 41 58 50 41 54 48 4c 45 4e 5d 3b  Shm[MAXPATHLEN];
30550 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20 2f 2a  .      .      /*
30560 20 57 41 4c 20 6d 6f 64 65 20 2a 2f 0a 20 20 20   WAL mode */.   
30570 20 20 20 73 74 72 6c 63 70 79 28 7a 53 68 6d 2c     strlcpy(zShm,
30580 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 2c 20 4d   pFile->zPath, M
30590 41 58 50 41 54 48 4c 45 4e 29 3b 0a 20 20 20 20  AXPATHLEN);.    
305a0 20 20 73 74 72 6c 63 61 74 28 7a 53 68 6d 2c 20    strlcat(zShm, 
305b0 22 2d 73 68 6d 22 2c 20 4d 41 58 50 41 54 48 4c  "-shm", MAXPATHL
305c0 45 4e 29 3b 0a 20 20 20 20 20 20 68 53 68 6d 20  EN);.      hShm 
305d0 3d 20 6f 70 65 6e 28 7a 53 68 6d 2c 20 4f 5f 52  = open(zShm, O_R
305e0 44 4f 4e 4c 59 2c 20 30 29 3b 0a 20 20 20 20 20  DONLY, 0);.     
305f0 20 69 66 28 20 68 53 68 6d 3c 30 20 29 7b 0a 20   if( hShm<0 ){. 
30600 20 20 20 20 20 20 20 2a 70 4c 6f 63 6b 73 74 61         *pLocksta
30610 74 65 20 3d 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  te = SQLITE_LOCK
30620 53 54 41 54 45 5f 4f 46 46 3b 0a 20 20 20 20 20  STATE_OFF;.     
30630 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65     unixLeaveMute
30640 78 28 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  x();.        ret
30650 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
30660 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
30670 20 75 6e 69 78 49 73 4c 6f 63 6b 65 64 28 70 69   unixIsLocked(pi
30680 64 2c 20 68 53 68 6d 2c 20 46 5f 52 44 4c 43 4b  d, hShm, F_RDLCK
30690 2c 20 53 48 4d 5f 52 45 43 4f 56 45 52 2c 20 31  , SHM_RECOVER, 1
306a0 2c 20 22 57 41 4c 2d 52 45 43 4f 56 45 52 59 22  , "WAL-RECOVERY"
306b0 29 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 75 6e  ) ||.         un
306c0 69 78 49 73 4c 6f 63 6b 65 64 28 70 69 64 2c 20  ixIsLocked(pid, 
306d0 68 53 68 6d 2c 20 46 5f 52 44 4c 43 4b 2c 20 53  hShm, F_RDLCK, S
306e0 48 4d 5f 57 52 49 54 45 2c 20 31 2c 20 22 57 41  HM_WRITE, 1, "WA
306f0 4c 2d 57 52 49 54 45 22 29 20 29 7b 0a 20 20 20  L-WRITE") ){.   
30700 20 20 20 20 20 6e 4c 6f 63 6b 20 3d 20 31 3b 0a       nLock = 1;.
30710 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 6c        }.      cl
30720 6f 73 65 28 68 53 68 6d 29 3b 0a 20 20 20 20 7d  ose(hShm);.    }
30730 0a 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75  .    unixLeaveMu
30740 74 65 78 28 29 3b 0a 20 20 7d 0a 20 20 69 66 28  tex();.  }.  if(
30750 20 6e 4c 6f 63 6b 3e 30 20 29 7b 0a 20 20 20 20   nLock>0 ){.    
30760 2a 70 4c 6f 63 6b 73 74 61 74 65 20 3d 20 53 51  *pLockstate = SQ
30770 4c 49 54 45 5f 4c 4f 43 4b 53 54 41 54 45 5f 4f  LITE_LOCKSTATE_O
30780 4e 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  N;.  } else {.  
30790 20 20 2a 70 4c 6f 63 6b 73 74 61 74 65 20 3d 20    *pLockstate = 
307a0 53 51 4c 49 54 45 5f 4c 4f 43 4b 53 54 41 54 45  SQLITE_LOCKSTATE
307b0 5f 4f 46 46 3b 0a 20 20 7d 0a 20 20 72 65 74 75  _OFF;.  }.  retu
307c0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
307d0 0a 23 65 6e 64 69 66 20 2f 2a 20 28 53 51 4c 49  .#endif /* (SQLI
307e0 54 45 5f 45 4e 41 42 4c 45 5f 41 50 50 4c 45 5f  TE_ENABLE_APPLE_
307f0 53 50 49 3e 30 29 20 26 26 20 64 65 66 69 6e 65  SPI>0) && define
30800 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 2a 2f 0a  d(__APPLE__) */.
30810 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
30820 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 2f 2a 0a 2a  MMAP_SIZE>0./*.*
30830 2a 20 49 66 20 69 74 20 69 73 20 63 75 72 72 65  * If it is curre
30840 6e 74 6c 79 20 6d 65 6d 6f 72 79 20 6d 61 70 70  ntly memory mapp
30850 65 64 2c 20 75 6e 6d 61 70 20 66 69 6c 65 20 70  ed, unmap file p
30860 46 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  Fd..*/.static vo
30870 69 64 20 75 6e 69 78 55 6e 6d 61 70 66 69 6c 65  id unixUnmapfile
30880 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 64 29 7b  (unixFile *pFd){
30890 0a 20 20 61 73 73 65 72 74 28 20 70 46 64 2d 3e  .  assert( pFd->
308a0 6e 46 65 74 63 68 4f 75 74 3d 3d 30 20 29 3b 0a  nFetchOut==0 );.
308b0 20 20 69 66 28 20 70 46 64 2d 3e 70 4d 61 70 52    if( pFd->pMapR
308c0 65 67 69 6f 6e 20 29 7b 0a 20 20 20 20 6f 73 4d  egion ){.    osM
308d0 75 6e 6d 61 70 28 70 46 64 2d 3e 70 4d 61 70 52  unmap(pFd->pMapR
308e0 65 67 69 6f 6e 2c 20 70 46 64 2d 3e 6d 6d 61 70  egion, pFd->mmap
308f0 53 69 7a 65 41 63 74 75 61 6c 29 3b 0a 20 20 20  SizeActual);.   
30900 20 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e   pFd->pMapRegion
30910 20 3d 20 30 3b 0a 20 20 20 20 70 46 64 2d 3e 6d   = 0;.    pFd->m
30920 6d 61 70 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20  mapSize = 0;.   
30930 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 41 63   pFd->mmapSizeAc
30940 74 75 61 6c 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a  tual = 0;.  }.}.
30950 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74  ./*.** Attempt t
30960 6f 20 73 65 74 20 74 68 65 20 73 69 7a 65 20 6f  o set the size o
30970 66 20 74 68 65 20 6d 65 6d 6f 72 79 20 6d 61 70  f the memory map
30980 70 69 6e 67 20 6d 61 69 6e 74 61 69 6e 65 64 20  ping maintained 
30990 62 79 20 66 69 6c 65 20 0a 2a 2a 20 64 65 73 63  by file .** desc
309a0 72 69 70 74 6f 72 20 70 46 64 20 74 6f 20 6e 4e  riptor pFd to nN
309b0 65 77 20 62 79 74 65 73 2e 20 41 6e 79 20 65 78  ew bytes. Any ex
309c0 69 73 74 69 6e 67 20 6d 61 70 70 69 6e 67 20 69  isting mapping i
309d0 73 20 64 69 73 63 61 72 64 65 64 2e 0a 2a 2a 0a  s discarded..**.
309e0 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  ** If successful
309f0 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
30a00 73 65 74 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69  sets the followi
30a10 6e 67 20 76 61 72 69 61 62 6c 65 73 3a 0a 2a 2a  ng variables:.**
30a20 0a 2a 2a 20 20 20 20 20 20 20 75 6e 69 78 46 69  .**       unixFi
30a30 6c 65 2e 70 4d 61 70 52 65 67 69 6f 6e 0a 2a 2a  le.pMapRegion.**
30a40 20 20 20 20 20 20 20 75 6e 69 78 46 69 6c 65 2e         unixFile.
30a50 6d 6d 61 70 53 69 7a 65 0a 2a 2a 20 20 20 20 20  mmapSize.**     
30a60 20 20 75 6e 69 78 46 69 6c 65 2e 6d 6d 61 70 53    unixFile.mmapS
30a70 69 7a 65 41 63 74 75 61 6c 0a 2a 2a 0a 2a 2a 20  izeActual.**.** 
30a80 49 66 20 75 6e 73 75 63 63 65 73 73 66 75 6c 2c  If unsuccessful,
30a90 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
30aa0 65 20 69 73 20 6c 6f 67 67 65 64 20 76 69 61 20  e is logged via 
30ab0 73 71 6c 69 74 65 33 5f 6c 6f 67 28 29 20 61 6e  sqlite3_log() an
30ac0 64 0a 2a 2a 20 74 68 65 20 74 68 72 65 65 20 76  d.** the three v
30ad0 61 72 69 61 62 6c 65 73 20 61 62 6f 76 65 20 61  ariables above a
30ae0 72 65 20 7a 65 72 6f 65 64 2e 20 49 6e 20 74 68  re zeroed. In th
30af0 69 73 20 63 61 73 65 20 53 51 4c 69 74 65 20 73  is case SQLite s
30b00 68 6f 75 6c 64 0a 2a 2a 20 63 6f 6e 74 69 6e 75  hould.** continu
30b10 65 20 61 63 63 65 73 73 69 6e 67 20 74 68 65 20  e accessing the 
30b20 64 61 74 61 62 61 73 65 20 75 73 69 6e 67 20 74  database using t
30b30 68 65 20 78 52 65 61 64 28 29 20 61 6e 64 20 78  he xRead() and x
30b40 57 72 69 74 65 28 29 0a 2a 2a 20 6d 65 74 68 6f  Write().** metho
30b50 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ds..*/.static vo
30b60 69 64 20 75 6e 69 78 52 65 6d 61 70 66 69 6c 65  id unixRemapfile
30b70 28 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  (.  unixFile *pF
30b80 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
30b90 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63      /* File desc
30ba0 72 69 70 74 6f 72 20 6f 62 6a 65 63 74 20 2a 2f  riptor object */
30bb0 0a 20 20 69 36 34 20 6e 4e 65 77 20 20 20 20 20  .  i64 nNew     
30bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30bd0 20 20 20 2f 2a 20 52 65 71 75 69 72 65 64 20 6d     /* Required m
30be0 61 70 70 69 6e 67 20 73 69 7a 65 20 2a 2f 0a 29  apping size */.)
30bf0 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
30c00 7a 45 72 72 20 3d 20 22 6d 6d 61 70 22 3b 0a 20  zErr = "mmap";. 
30c10 20 69 6e 74 20 68 20 3d 20 70 46 64 2d 3e 68 3b   int h = pFd->h;
30c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30c30 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65        /* File de
30c40 73 63 72 69 70 74 6f 72 20 6f 70 65 6e 20 6f 6e  scriptor open on
30c50 20 64 62 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38   db file */.  u8
30c60 20 2a 70 4f 72 69 67 20 3d 20 28 75 38 20 2a 29   *pOrig = (u8 *)
30c70 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 3b  pFd->pMapRegion;
30c80 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
30c90 20 63 75 72 72 65 6e 74 20 66 69 6c 65 20 6d 61   current file ma
30ca0 70 70 69 6e 67 20 2a 2f 0a 20 20 69 36 34 20 6e  pping */.  i64 n
30cb0 4f 72 69 67 20 3d 20 70 46 64 2d 3e 6d 6d 61 70  Orig = pFd->mmap
30cc0 53 69 7a 65 41 63 74 75 61 6c 3b 20 20 20 20 20  SizeActual;     
30cd0 2f 2a 20 53 69 7a 65 20 6f 66 20 70 4f 72 69 67  /* Size of pOrig
30ce0 20 72 65 67 69 6f 6e 20 69 6e 20 62 79 74 65 73   region in bytes
30cf0 20 2a 2f 0a 20 20 75 38 20 2a 70 4e 65 77 20 3d   */.  u8 *pNew =
30d00 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
30d10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
30d20 63 61 74 69 6f 6e 20 6f 66 20 6e 65 77 20 6d 61  cation of new ma
30d30 70 70 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 66  pping */.  int f
30d40 6c 61 67 73 20 3d 20 50 52 4f 54 5f 52 45 41 44  lags = PROT_READ
30d50 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
30d60 2f 2a 20 46 6c 61 67 73 20 74 6f 20 70 61 73 73  /* Flags to pass
30d70 20 74 6f 20 6d 6d 61 70 28 29 20 2a 2f 0a 0a 20   to mmap() */.. 
30d80 20 61 73 73 65 72 74 28 20 70 46 64 2d 3e 6e 46   assert( pFd->nF
30d90 65 74 63 68 4f 75 74 3d 3d 30 20 29 3b 0a 20 20  etchOut==0 );.  
30da0 61 73 73 65 72 74 28 20 6e 4e 65 77 3e 70 46 64  assert( nNew>pFd
30db0 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 3b 0a 20 20  ->mmapSize );.  
30dc0 61 73 73 65 72 74 28 20 6e 4e 65 77 3c 3d 70 46  assert( nNew<=pF
30dd0 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20 29  d->mmapSizeMax )
30de0 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4e 65 77  ;.  assert( nNew
30df0 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >0 );.  assert( 
30e00 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74  pFd->mmapSizeAct
30e10 75 61 6c 3e 3d 70 46 64 2d 3e 6d 6d 61 70 53 69  ual>=pFd->mmapSi
30e20 7a 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ze );.  assert( 
30e30 4d 41 50 5f 46 41 49 4c 45 44 21 3d 30 20 29 3b  MAP_FAILED!=0 );
30e40 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
30e50 4d 4d 41 50 5f 52 45 41 44 57 52 49 54 45 0a 20  MMAP_READWRITE. 
30e60 20 69 66 28 20 28 70 46 64 2d 3e 63 74 72 6c 46   if( (pFd->ctrlF
30e70 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f  lags & UNIXFILE_
30e80 52 44 4f 4e 4c 59 29 3d 3d 30 20 29 20 66 6c 61  RDONLY)==0 ) fla
30e90 67 73 20 7c 3d 20 50 52 4f 54 5f 57 52 49 54 45  gs |= PROT_WRITE
30ea0 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20  ;.#endif..  if( 
30eb0 70 4f 72 69 67 20 29 7b 0a 23 69 66 20 48 41 56  pOrig ){.#if HAV
30ec0 45 5f 4d 52 45 4d 41 50 0a 20 20 20 20 69 36 34  E_MREMAP.    i64
30ed0 20 6e 52 65 75 73 65 20 3d 20 70 46 64 2d 3e 6d   nReuse = pFd->m
30ee0 6d 61 70 53 69 7a 65 3b 0a 23 65 6c 73 65 0a 20  mapSize;.#else. 
30ef0 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 73 7a 53     const int szS
30f00 79 73 70 61 67 65 20 3d 20 6f 73 47 65 74 70 61  yspage = osGetpa
30f10 67 65 73 69 7a 65 28 29 3b 0a 20 20 20 20 69 36  gesize();.    i6
30f20 34 20 6e 52 65 75 73 65 20 3d 20 28 70 46 64 2d  4 nReuse = (pFd-
30f30 3e 6d 6d 61 70 53 69 7a 65 20 26 20 7e 28 73 7a  >mmapSize & ~(sz
30f40 53 79 73 70 61 67 65 2d 31 29 29 3b 0a 23 65 6e  Syspage-1));.#en
30f50 64 69 66 0a 20 20 20 20 75 38 20 2a 70 52 65 71  dif.    u8 *pReq
30f60 20 3d 20 26 70 4f 72 69 67 5b 6e 52 65 75 73 65   = &pOrig[nReuse
30f70 5d 3b 0a 0a 20 20 20 20 2f 2a 20 55 6e 6d 61 70  ];..    /* Unmap
30f80 20 61 6e 79 20 70 61 67 65 73 20 6f 66 20 74 68   any pages of th
30f90 65 20 65 78 69 73 74 69 6e 67 20 6d 61 70 70 69  e existing mappi
30fa0 6e 67 20 74 68 61 74 20 63 61 6e 6e 6f 74 20 62  ng that cannot b
30fb0 65 20 72 65 75 73 65 64 2e 20 2a 2f 0a 20 20 20  e reused. */.   
30fc0 20 69 66 28 20 6e 52 65 75 73 65 21 3d 6e 4f 72   if( nReuse!=nOr
30fd0 69 67 20 29 7b 0a 20 20 20 20 20 20 6f 73 4d 75  ig ){.      osMu
30fe0 6e 6d 61 70 28 70 52 65 71 2c 20 6e 4f 72 69 67  nmap(pReq, nOrig
30ff0 2d 6e 52 65 75 73 65 29 3b 0a 20 20 20 20 7d 0a  -nReuse);.    }.
31000 0a 23 69 66 20 48 41 56 45 5f 4d 52 45 4d 41 50  .#if HAVE_MREMAP
31010 0a 20 20 20 20 70 4e 65 77 20 3d 20 6f 73 4d 72  .    pNew = osMr
31020 65 6d 61 70 28 70 4f 72 69 67 2c 20 6e 52 65 75  emap(pOrig, nReu
31030 73 65 2c 20 6e 4e 65 77 2c 20 4d 52 45 4d 41 50  se, nNew, MREMAP
31040 5f 4d 41 59 4d 4f 56 45 29 3b 0a 20 20 20 20 7a  _MAYMOVE);.    z
31050 45 72 72 20 3d 20 22 6d 72 65 6d 61 70 22 3b 0a  Err = "mremap";.
31060 23 65 6c 73 65 0a 20 20 20 20 70 4e 65 77 20 3d  #else.    pNew =
31070 20 6f 73 4d 6d 61 70 28 70 52 65 71 2c 20 6e 4e   osMmap(pReq, nN
31080 65 77 2d 6e 52 65 75 73 65 2c 20 66 6c 61 67 73  ew-nReuse, flags
31090 2c 20 4d 41 50 5f 53 48 41 52 45 44 2c 20 68 2c  , MAP_SHARED, h,
310a0 20 6e 52 65 75 73 65 29 3b 0a 20 20 20 20 69 66   nReuse);.    if
310b0 28 20 70 4e 65 77 21 3d 4d 41 50 5f 46 41 49 4c  ( pNew!=MAP_FAIL
310c0 45 44 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ED ){.      if( 
310d0 70 4e 65 77 21 3d 70 52 65 71 20 29 7b 0a 20 20  pNew!=pReq ){.  
310e0 20 20 20 20 20 20 6f 73 4d 75 6e 6d 61 70 28 70        osMunmap(p
310f0 4e 65 77 2c 20 6e 4e 65 77 20 2d 20 6e 52 65 75  New, nNew - nReu
31100 73 65 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  se);.        pNe
31110 77 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c  w = 0;.      }el
31120 73 65 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  se{.        pNew
31130 20 3d 20 70 4f 72 69 67 3b 0a 20 20 20 20 20 20   = pOrig;.      
31140 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  }.    }.#endif..
31150 20 20 20 20 2f 2a 20 54 68 65 20 61 74 74 65 6d      /* The attem
31160 70 74 20 74 6f 20 65 78 74 65 6e 64 20 74 68 65  pt to extend the
31170 20 65 78 69 73 74 69 6e 67 20 6d 61 70 70 69 6e   existing mappin
31180 67 20 66 61 69 6c 65 64 2e 20 46 72 65 65 20 69  g failed. Free i
31190 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4e  t. */.    if( pN
311a0 65 77 3d 3d 4d 41 50 5f 46 41 49 4c 45 44 20 7c  ew==MAP_FAILED |
311b0 7c 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20  | pNew==0 ){.   
311c0 20 20 20 6f 73 4d 75 6e 6d 61 70 28 70 4f 72 69     osMunmap(pOri
311d0 67 2c 20 6e 52 65 75 73 65 29 3b 0a 20 20 20 20  g, nReuse);.    
311e0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 70  }.  }..  /* If p
311f0 4e 65 77 20 69 73 20 73 74 69 6c 6c 20 4e 55 4c  New is still NUL
31200 4c 2c 20 74 72 79 20 74 6f 20 63 72 65 61 74 65  L, try to create
31210 20 61 6e 20 65 6e 74 69 72 65 6c 79 20 6e 65 77   an entirely new
31220 20 6d 61 70 70 69 6e 67 2e 20 2a 2f 0a 20 20 69   mapping. */.  i
31230 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( pNew==0 ){.  
31240 20 20 70 4e 65 77 20 3d 20 6f 73 4d 6d 61 70 28    pNew = osMmap(
31250 30 2c 20 6e 4e 65 77 2c 20 66 6c 61 67 73 2c 20  0, nNew, flags, 
31260 4d 41 50 5f 53 48 41 52 45 44 2c 20 68 2c 20 30  MAP_SHARED, h, 0
31270 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 4e  );.  }..  if( pN
31280 65 77 3d 3d 4d 41 50 5f 46 41 49 4c 45 44 20 29  ew==MAP_FAILED )
31290 7b 0a 20 20 20 20 70 4e 65 77 20 3d 20 30 3b 0a  {.    pNew = 0;.
312a0 20 20 20 20 6e 4e 65 77 20 3d 20 30 3b 0a 20 20      nNew = 0;.  
312b0 20 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53    unixLogError(S
312c0 51 4c 49 54 45 5f 4f 4b 2c 20 7a 45 72 72 2c 20  QLITE_OK, zErr, 
312d0 70 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 0a 20 20  pFd->zPath);..  
312e0 20 20 2f 2a 20 49 66 20 74 68 65 20 6d 6d 61 70    /* If the mmap
312f0 28 29 20 61 62 6f 76 65 20 66 61 69 6c 65 64 2c  () above failed,
31300 20 61 73 73 75 6d 65 20 74 68 61 74 20 61 6c 6c   assume that all
31310 20 73 75 62 73 65 71 75 65 6e 74 20 6d 6d 61 70   subsequent mmap
31320 28 29 20 63 61 6c 6c 73 0a 20 20 20 20 2a 2a 20  () calls.    ** 
31330 77 69 6c 6c 20 70 72 6f 62 61 62 6c 79 20 66 61  will probably fa
31340 69 6c 20 74 6f 6f 2e 20 46 61 6c 6c 20 62 61 63  il too. Fall bac
31350 6b 20 74 6f 20 75 73 69 6e 67 20 78 52 65 61 64  k to using xRead
31360 2f 78 57 72 69 74 65 20 65 78 63 6c 75 73 69 76  /xWrite exclusiv
31370 65 6c 79 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68  ely.    ** in th
31380 69 73 20 63 61 73 65 2e 20 20 2a 2f 0a 20 20 20  is case.  */.   
31390 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61   pFd->mmapSizeMa
313a0 78 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 46 64  x = 0;.  }.  pFd
313b0 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20 3d 20 28  ->pMapRegion = (
313c0 76 6f 69 64 20 2a 29 70 4e 65 77 3b 0a 20 20 70  void *)pNew;.  p
313d0 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d 20 70  Fd->mmapSize = p
313e0 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75  Fd->mmapSizeActu
313f0 61 6c 20 3d 20 6e 4e 65 77 3b 0a 7d 0a 0a 2f 2a  al = nNew;.}../*
31400 0a 2a 2a 20 4d 65 6d 6f 72 79 20 6d 61 70 20 6f  .** Memory map o
31410 72 20 72 65 6d 61 70 20 74 68 65 20 66 69 6c 65  r remap the file
31420 20 6f 70 65 6e 65 64 20 62 79 20 66 69 6c 65 2d   opened by file-
31430 64 65 73 63 72 69 70 74 6f 72 20 70 46 64 20 28  descriptor pFd (
31440 69 66 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 69  if the file.** i
31450 73 20 61 6c 72 65 61 64 79 20 6d 61 70 70 65 64  s already mapped
31460 2c 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 6d  , the existing m
31470 61 70 70 69 6e 67 20 69 73 20 72 65 70 6c 61 63  apping is replac
31480 65 64 20 62 79 20 74 68 65 20 6e 65 77 29 2e 20  ed by the new). 
31490 4f 72 2c 20 69 66 20 0a 2a 2a 20 74 68 65 72 65  Or, if .** there
314a0 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20   already exists 
314b0 61 20 6d 61 70 70 69 6e 67 20 66 6f 72 20 74 68  a mapping for th
314c0 69 73 20 66 69 6c 65 2c 20 61 6e 64 20 74 68 65  is file, and the
314d0 72 65 20 61 72 65 20 73 74 69 6c 6c 20 0a 2a 2a  re are still .**
314e0 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 78 46 65   outstanding xFe
314f0 74 63 68 28 29 20 72 65 66 65 72 65 6e 63 65 73  tch() references
31500 20 74 6f 20 69 74 2c 20 74 68 69 73 20 66 75 6e   to it, this fun
31510 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
31520 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d  ..**.** If param
31530 65 74 65 72 20 6e 42 79 74 65 20 69 73 20 6e 6f  eter nByte is no
31540 6e 2d 6e 65 67 61 74 69 76 65 2c 20 74 68 65 6e  n-negative, then
31550 20 69 74 20 69 73 20 74 68 65 20 72 65 71 75 65   it is the reque
31560 73 74 65 64 20 73 69 7a 65 20 6f 66 20 0a 2a 2a  sted size of .**
31570 20 74 68 65 20 6d 61 70 70 69 6e 67 20 74 6f 20   the mapping to 
31580 63 72 65 61 74 65 2e 20 4f 74 68 65 72 77 69 73  create. Otherwis
31590 65 2c 20 69 66 20 6e 42 79 74 65 20 69 73 20 6c  e, if nByte is l
315a0 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74  ess than zero, t
315b0 68 65 6e 20 74 68 65 20 0a 2a 2a 20 72 65 71 75  hen the .** requ
315c0 65 73 74 65 64 20 73 69 7a 65 20 69 73 20 74 68  ested size is th
315d0 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69  e size of the fi
315e0 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 54 68 65 20  le on disk. The 
315f0 61 63 74 75 61 6c 20 73 69 7a 65 20 6f 66 20 74  actual size of t
31600 68 65 0a 2a 2a 20 63 72 65 61 74 65 64 20 6d 61  he.** created ma
31610 70 70 69 6e 67 20 69 73 20 65 69 74 68 65 72 20  pping is either 
31620 74 68 65 20 72 65 71 75 65 73 74 65 64 20 73 69  the requested si
31630 7a 65 20 6f 72 20 74 68 65 20 76 61 6c 75 65 20  ze or the value 
31640 63 6f 6e 66 69 67 75 72 65 64 20 0a 2a 2a 20 75  configured .** u
31650 73 69 6e 67 20 53 51 4c 49 54 45 5f 46 43 4e 54  sing SQLITE_FCNT
31660 4c 5f 4d 4d 41 50 5f 4c 49 4d 49 54 2c 20 77 68  L_MMAP_LIMIT, wh
31670 69 63 68 65 76 65 72 20 69 73 20 73 6d 61 6c 6c  ichever is small
31680 65 72 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45  er..**.** SQLITE
31690 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
316a0 69 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75  if no error occu
316b0 72 73 20 28 65 76 65 6e 20 69 66 20 74 68 65 20  rs (even if the 
316c0 6d 61 70 70 69 6e 67 20 69 73 20 6e 6f 74 0a 2a  mapping is not.*
316d0 2a 20 72 65 63 72 65 61 74 65 64 20 61 73 20 61  * recreated as a
316e0 20 72 65 73 75 6c 74 20 6f 66 20 6f 75 74 73 74   result of outst
316f0 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65  anding reference
31700 73 29 20 6f 72 20 61 6e 20 53 51 4c 69 74 65 20  s) or an SQLite 
31710 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 6f 74  error.** code ot
31720 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74  herwise..*/.stat
31730 69 63 20 69 6e 74 20 75 6e 69 78 4d 61 70 66 69  ic int unixMapfi
31740 6c 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 64  le(unixFile *pFd
31750 2c 20 69 36 34 20 6e 4d 61 70 29 7b 0a 20 20 61  , i64 nMap){.  a
31760 73 73 65 72 74 28 20 6e 4d 61 70 3e 3d 30 20 7c  ssert( nMap>=0 |
31770 7c 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f 75 74  | pFd->nFetchOut
31780 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
31790 20 6e 4d 61 70 3e 30 20 7c 7c 20 28 70 46 64 2d   nMap>0 || (pFd-
317a0 3e 6d 6d 61 70 53 69 7a 65 3d 3d 30 20 26 26 20  >mmapSize==0 && 
317b0 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 3d  pFd->pMapRegion=
317c0 3d 30 29 20 29 3b 0a 20 20 69 66 28 20 70 46 64  =0) );.  if( pFd
317d0 2d 3e 6e 46 65 74 63 68 4f 75 74 3e 30 20 29 20  ->nFetchOut>0 ) 
317e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
317f0 3b 0a 0a 20 20 69 66 28 20 6e 4d 61 70 3c 30 20  ;..  if( nMap<0 
31800 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73 74  ){.    struct st
31810 61 74 20 73 74 61 74 62 75 66 3b 20 20 20 20 20  at statbuf;     
31820 20 20 20 20 20 2f 2a 20 4c 6f 77 2d 6c 65 76 65       /* Low-leve
31830 6c 20 66 69 6c 65 20 69 6e 66 6f 72 6d 61 74 69  l file informati
31840 6f 6e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f 73  on */.    if( os
31850 46 73 74 61 74 28 70 46 64 2d 3e 68 2c 20 26 73  Fstat(pFd->h, &s
31860 74 61 74 62 75 66 29 20 29 7b 0a 20 20 20 20 20  tatbuf) ){.     
31870 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
31880 4f 45 52 52 5f 46 53 54 41 54 3b 0a 20 20 20 20  OERR_FSTAT;.    
31890 7d 0a 20 20 20 20 6e 4d 61 70 20 3d 20 73 74 61  }.    nMap = sta
318a0 74 62 75 66 2e 73 74 5f 73 69 7a 65 3b 0a 20 20  tbuf.st_size;.  
318b0 7d 0a 20 20 69 66 28 20 6e 4d 61 70 3e 70 46 64  }.  if( nMap>pFd
318c0 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20 29 7b  ->mmapSizeMax ){
318d0 0a 20 20 20 20 6e 4d 61 70 20 3d 20 70 46 64 2d  .    nMap = pFd-
318e0 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 3b 0a 20 20  >mmapSizeMax;.  
318f0 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 4d 61  }..  assert( nMa
31900 70 3e 30 20 7c 7c 20 28 70 46 64 2d 3e 6d 6d 61  p>0 || (pFd->mma
31910 70 53 69 7a 65 3d 3d 30 20 26 26 20 70 46 64 2d  pSize==0 && pFd-
31920 3e 70 4d 61 70 52 65 67 69 6f 6e 3d 3d 30 29 20  >pMapRegion==0) 
31930 29 3b 0a 20 20 69 66 28 20 6e 4d 61 70 21 3d 70  );.  if( nMap!=p
31940 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a  Fd->mmapSize ){.
31950 20 20 20 20 75 6e 69 78 52 65 6d 61 70 66 69 6c      unixRemapfil
31960 65 28 70 46 64 2c 20 6e 4d 61 70 29 3b 0a 20 20  e(pFd, nMap);.  
31970 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  }..  return SQLI
31980 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20  TE_OK;.}.#endif 
31990 2f 2a 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  /* SQLITE_MAX_MM
319a0 41 50 5f 53 49 5a 45 3e 30 20 2a 2f 0a 0a 2f 2a  AP_SIZE>0 */../*
319b0 0a 2a 2a 20 49 66 20 70 6f 73 73 69 62 6c 65 2c  .** If possible,
319c0 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   return a pointe
319d0 72 20 74 6f 20 61 20 6d 61 70 70 69 6e 67 20 6f  r to a mapping o
319e0 66 20 66 69 6c 65 20 66 64 20 73 74 61 72 74 69  f file fd starti
319f0 6e 67 20 61 74 20 6f 66 66 73 65 74 0a 2a 2a 20  ng at offset.** 
31a00 69 4f 66 66 2e 20 54 68 65 20 6d 61 70 70 69 6e  iOff. The mappin
31a10 67 20 6d 75 73 74 20 62 65 20 76 61 6c 69 64 20  g must be valid 
31a20 66 6f 72 20 61 74 20 6c 65 61 73 74 20 6e 41 6d  for at least nAm
31a30 74 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 49  t bytes..**.** I
31a40 66 20 73 75 63 68 20 61 20 70 6f 69 6e 74 65 72  f such a pointer
31a50 20 63 61 6e 20 62 65 20 6f 62 74 61 69 6e 65 64   can be obtained
31a60 2c 20 73 74 6f 72 65 20 69 74 20 69 6e 20 2a 70  , store it in *p
31a70 70 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c  p and return SQL
31a80 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 4f 72 2c 20 69  ITE_OK..** Or, i
31a90 66 20 6f 6e 65 20 63 61 6e 6e 6f 74 20 62 75 74  f one cannot but
31aa0 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   no error occurs
31ab0 2c 20 73 65 74 20 2a 70 70 20 74 6f 20 30 20 61  , set *pp to 0 a
31ac0 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  nd return SQLITE
31ad0 5f 4f 4b 2e 0a 2a 2a 20 46 69 6e 61 6c 6c 79 2c  _OK..** Finally,
31ae0 20 69 66 20 61 6e 20 65 72 72 6f 72 20 64 6f 65   if an error doe
31af0 73 20 6f 63 63 75 72 2c 20 72 65 74 75 72 6e 20  s occur, return 
31b00 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
31b10 63 6f 64 65 2e 20 54 68 65 20 66 69 6e 61 6c 0a  code. The final.
31b20 2a 2a 20 76 61 6c 75 65 20 6f 66 20 2a 70 70 20  ** value of *pp 
31b30 69 73 20 75 6e 64 65 66 69 6e 65 64 20 69 6e 20  is undefined in 
31b40 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a  this case..**.**
31b50 20 49 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   If this functio
31b60 6e 20 64 6f 65 73 20 72 65 74 75 72 6e 20 61 20  n does return a 
31b70 70 6f 69 6e 74 65 72 2c 20 74 68 65 20 63 61 6c  pointer, the cal
31b80 6c 65 72 20 6d 75 73 74 20 65 76 65 6e 74 75 61  ler must eventua
31b90 6c 6c 79 20 0a 2a 2a 20 72 65 6c 65 61 73 65 20  lly .** release 
31ba0 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 62 79  the reference by
31bb0 20 63 61 6c 6c 69 6e 67 20 75 6e 69 78 55 6e 66   calling unixUnf
31bc0 65 74 63 68 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  etch()..*/.stati
31bd0 63 20 69 6e 74 20 75 6e 69 78 46 65 74 63 68 28  c int unixFetch(
31be0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
31bf0 2c 20 69 36 34 20 69 4f 66 66 2c 20 69 6e 74 20  , i64 iOff, int 
31c00 6e 41 6d 74 2c 20 76 6f 69 64 20 2a 2a 70 70 29  nAmt, void **pp)
31c10 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  {.#if SQLITE_MAX
31c20 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 75  _MMAP_SIZE>0.  u
31c30 6e 69 78 46 69 6c 65 20 2a 70 46 64 20 3d 20 28  nixFile *pFd = (
31c40 75 6e 69 78 46 69 6c 65 20 2a 29 66 64 3b 20 20  unixFile *)fd;  
31c50 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69   /* The underlyi
31c60 6e 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ng database file
31c70 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 2a 70 70   */.#endif.  *pp
31c80 20 3d 20 30 3b 0a 0a 23 69 66 20 53 51 4c 49 54   = 0;..#if SQLIT
31c90 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
31ca0 30 0a 20 20 69 66 28 20 70 46 64 2d 3e 6d 6d 61  0.  if( pFd->mma
31cb0 70 53 69 7a 65 4d 61 78 3e 30 20 29 7b 0a 20 20  pSizeMax>0 ){.  
31cc0 20 20 69 66 28 20 70 46 64 2d 3e 70 4d 61 70 52    if( pFd->pMapR
31cd0 65 67 69 6f 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  egion==0 ){.    
31ce0 20 20 69 6e 74 20 72 63 20 3d 20 75 6e 69 78 4d    int rc = unixM
31cf0 61 70 66 69 6c 65 28 70 46 64 2c 20 2d 31 29 3b  apfile(pFd, -1);
31d00 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
31d10 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
31d20 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
31d30 69 66 28 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a  if( pFd->mmapSiz
31d40 65 20 3e 3d 20 69 4f 66 66 2b 6e 41 6d 74 20 29  e >= iOff+nAmt )
31d50 7b 0a 20 20 20 20 20 20 2a 70 70 20 3d 20 26 28  {.      *pp = &(
31d60 28 75 38 20 2a 29 70 46 64 2d 3e 70 4d 61 70 52  (u8 *)pFd->pMapR
31d70 65 67 69 6f 6e 29 5b 69 4f 66 66 5d 3b 0a 20 20  egion)[iOff];.  
31d80 20 20 20 20 70 46 64 2d 3e 6e 46 65 74 63 68 4f      pFd->nFetchO
31d90 75 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ut++;.    }.  }.
31da0 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
31db0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
31dc0 0a 2a 2a 20 49 66 20 74 68 65 20 74 68 69 72 64  .** If the third
31dd0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e   argument is non
31de0 2d 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 69 73  -NULL, then this
31df0 20 66 75 6e 63 74 69 6f 6e 20 72 65 6c 65 61 73   function releas
31e00 65 73 20 61 20 0a 2a 2a 20 72 65 66 65 72 65 6e  es a .** referen
31e10 63 65 20 6f 62 74 61 69 6e 65 64 20 62 79 20 61  ce obtained by a
31e20 6e 20 65 61 72 6c 69 65 72 20 63 61 6c 6c 20 74  n earlier call t
31e30 6f 20 75 6e 69 78 46 65 74 63 68 28 29 2e 20 54  o unixFetch(). T
31e40 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 61 72 67  he second.** arg
31e50 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20  ument passed to 
31e60 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 75  this function mu
31e70 73 74 20 62 65 20 74 68 65 20 73 61 6d 65 20 61  st be the same a
31e80 73 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  s the correspond
31e90 69 6e 67 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 20  ing.** argument 
31ea0 74 68 61 74 20 77 61 73 20 70 61 73 73 65 64 20  that was passed 
31eb0 74 6f 20 74 68 65 20 75 6e 69 78 46 65 74 63 68  to the unixFetch
31ec0 28 29 20 69 6e 76 6f 63 61 74 69 6f 6e 2e 20 0a  () invocation. .
31ed0 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 74 68 65  **.** Or, if the
31ee0 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74 20   third argument 
31ef0 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68  is NULL, then th
31f00 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 62  is function is b
31f10 65 69 6e 67 20 63 61 6c 6c 65 64 20 0a 2a 2a 20  eing called .** 
31f20 74 6f 20 69 6e 66 6f 72 6d 20 74 68 65 20 56 46  to inform the VF
31f30 53 20 6c 61 79 65 72 20 74 68 61 74 2c 20 61 63  S layer that, ac
31f40 63 6f 72 64 69 6e 67 20 74 6f 20 50 4f 53 49 58  cording to POSIX
31f50 2c 20 61 6e 79 20 65 78 69 73 74 69 6e 67 20 6d  , any existing m
31f60 61 70 70 69 6e 67 20 0a 2a 2a 20 6d 61 79 20 6e  apping .** may n
31f70 6f 77 20 62 65 20 69 6e 76 61 6c 69 64 20 61 6e  ow be invalid an
31f80 64 20 73 68 6f 75 6c 64 20 62 65 20 75 6e 6d 61  d should be unma
31f90 70 70 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  pped..*/.static 
31fa0 69 6e 74 20 75 6e 69 78 55 6e 66 65 74 63 68 28  int unixUnfetch(
31fb0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
31fc0 2c 20 69 36 34 20 69 4f 66 66 2c 20 76 6f 69 64  , i64 iOff, void
31fd0 20 2a 70 29 7b 0a 23 69 66 20 53 51 4c 49 54 45   *p){.#if SQLITE
31fe0 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
31ff0 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 64  .  unixFile *pFd
32000 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 66   = (unixFile *)f
32010 64 3b 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65  d;   /* The unde
32020 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65 20  rlying database 
32030 66 69 6c 65 20 2a 2f 0a 20 20 55 4e 55 53 45 44  file */.  UNUSED
32040 5f 50 41 52 41 4d 45 54 45 52 28 69 4f 66 66 29  _PARAMETER(iOff)
32050 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 3d 3d 30 20  ;..  /* If p==0 
32060 28 75 6e 6d 61 70 20 74 68 65 20 65 6e 74 69 72  (unmap the entir
32070 65 20 66 69 6c 65 29 20 74 68 65 6e 20 74 68 65  e file) then the
32080 72 65 20 6d 75 73 74 20 62 65 20 6e 6f 20 6f 75  re must be no ou
32090 74 73 74 61 6e 64 69 6e 67 20 0a 20 20 2a 2a 20  tstanding .  ** 
320a0 78 46 65 74 63 68 20 72 65 66 65 72 65 6e 63 65  xFetch reference
320b0 73 2e 20 4f 72 2c 20 69 66 20 70 21 3d 30 20 28  s. Or, if p!=0 (
320c0 6d 65 61 6e 69 6e 67 20 69 74 20 69 73 20 61 6e  meaning it is an
320d0 20 78 46 65 74 63 68 20 72 65 66 65 72 65 6e 63   xFetch referenc
320e0 65 29 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 74 68  e),.  ** then th
320f0 65 72 65 20 6d 75 73 74 20 62 65 20 61 74 20 6c  ere must be at l
32100 65 61 73 74 20 6f 6e 65 20 6f 75 74 73 74 61 6e  east one outstan
32110 64 69 6e 67 2e 20 20 2a 2f 0a 20 20 61 73 73 65  ding.  */.  asse
32120 72 74 28 20 28 70 3d 3d 30 29 3d 3d 28 70 46 64  rt( (p==0)==(pFd
32130 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30 29 20  ->nFetchOut==0) 
32140 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 21 3d 30  );..  /* If p!=0
32150 2c 20 69 74 20 6d 75 73 74 20 6d 61 74 63 68 20  , it must match 
32160 74 68 65 20 69 4f 66 66 20 76 61 6c 75 65 2e 20  the iOff value. 
32170 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 3d 3d  */.  assert( p==
32180 30 20 7c 7c 20 70 3d 3d 26 28 28 75 38 20 2a 29  0 || p==&((u8 *)
32190 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29  pFd->pMapRegion)
321a0 5b 69 4f 66 66 5d 20 29 3b 0a 0a 20 20 69 66 28  [iOff] );..  if(
321b0 20 70 20 29 7b 0a 20 20 20 20 70 46 64 2d 3e 6e   p ){.    pFd->n
321c0 46 65 74 63 68 4f 75 74 2d 2d 3b 0a 20 20 7d 65  FetchOut--;.  }e
321d0 6c 73 65 7b 0a 20 20 20 20 75 6e 69 78 55 6e 6d  lse{.    unixUnm
321e0 61 70 66 69 6c 65 28 70 46 64 29 3b 0a 20 20 7d  apfile(pFd);.  }
321f0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 64 2d  ..  assert( pFd-
32200 3e 6e 46 65 74 63 68 4f 75 74 3e 3d 30 20 29 3b  >nFetchOut>=0 );
32210 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f  .#else.  UNUSED_
32220 50 41 52 41 4d 45 54 45 52 28 66 64 29 3b 0a 20  PARAMETER(fd);. 
32230 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
32240 52 28 70 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50  R(p);.  UNUSED_P
32250 41 52 41 4d 45 54 45 52 28 69 4f 66 66 29 3b 0a  ARAMETER(iOff);.
32260 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
32270 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
32280 0a 2a 2a 20 48 65 72 65 20 65 6e 64 73 20 74 68  .** Here ends th
32290 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
322a0 20 6f 66 20 61 6c 6c 20 73 71 6c 69 74 65 33 5f   of all sqlite3_
322b0 66 69 6c 65 20 6d 65 74 68 6f 64 73 2e 0a 2a 2a  file methods..**
322c0 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
322d0 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 73 71 6c 69  ******* End sqli
322e0 74 65 33 5f 66 69 6c 65 20 4d 65 74 68 6f 64 73  te3_file Methods
322f0 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
32300 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
32310 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
32320 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
32330 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
32340 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
32350 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
32360 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 64 69 76  ../*.** This div
32370 69 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 64  ision contains d
32380 65 66 69 6e 69 74 69 6f 6e 73 20 6f 66 20 73 71  efinitions of sq
32390 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
323a0 20 6f 62 6a 65 63 74 73 20 74 68 61 74 0a 2a 2a   objects that.**
323b0 20 69 6d 70 6c 65 6d 65 6e 74 20 76 61 72 69 6f   implement vario
323c0 75 73 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20  us file locking 
323d0 73 74 72 61 74 65 67 69 65 73 2e 20 20 49 74 20  strategies.  It 
323e0 61 6c 73 6f 20 63 6f 6e 74 61 69 6e 73 20 64 65  also contains de
323f0 66 69 6e 69 74 69 6f 6e 73 0a 2a 2a 20 6f 66 20  finitions.** of 
32400 22 66 69 6e 64 65 72 22 20 66 75 6e 63 74 69 6f  "finder" functio
32410 6e 73 2e 20 20 41 20 66 69 6e 64 65 72 2d 66 75  ns.  A finder-fu
32420 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  nction is used t
32430 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 61 70 70  o locate the app
32440 72 6f 70 72 69 61 74 65 0a 2a 2a 20 73 71 6c 69  ropriate.** sqli
32450 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f  te3_io_methods o
32460 62 6a 65 63 74 20 66 6f 72 20 61 20 70 61 72 74  bject for a part
32470 69 63 75 6c 61 72 20 64 61 74 61 62 61 73 65 20  icular database 
32480 66 69 6c 65 2e 20 20 54 68 65 20 70 41 70 70 44  file.  The pAppD
32490 61 74 61 0a 2a 2a 20 66 69 65 6c 64 20 6f 66 20  ata.** field of 
324a0 74 68 65 20 73 71 6c 69 74 65 33 5f 76 66 73 20  the sqlite3_vfs 
324b0 56 46 53 20 6f 62 6a 65 63 74 73 20 61 72 65 20  VFS objects are 
324c0 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 62  initialized to b
324d0 65 20 70 6f 69 6e 74 65 72 73 20 74 6f 0a 2a 2a  e pointers to.**
324e0 20 74 68 65 20 63 6f 72 72 65 63 74 20 66 69 6e   the correct fin
324f0 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 66 6f 72  der-function for
32500 20 74 68 61 74 20 56 46 53 2e 0a 2a 2a 0a 2a 2a   that VFS..**.**
32510 20 4d 6f 73 74 20 66 69 6e 64 65 72 20 66 75 6e   Most finder fun
32520 63 74 69 6f 6e 73 20 72 65 74 75 72 6e 20 61 20  ctions return a 
32530 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 69 78  pointer to a fix
32540 65 64 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  ed sqlite3_io_me
32550 74 68 6f 64 73 0a 2a 2a 20 6f 62 6a 65 63 74 2e  thods.** object.
32560 20 20 54 68 65 20 6f 6e 6c 79 20 69 6e 74 65 72    The only inter
32570 65 73 74 69 6e 67 20 66 69 6e 64 65 72 2d 66 75  esting finder-fu
32580 6e 63 74 69 6f 6e 20 69 73 20 61 75 74 6f 6c 6f  nction is autolo
32590 63 6b 49 6f 46 69 6e 64 65 72 2c 20 77 68 69 63  ckIoFinder, whic
325a0 68 0a 2a 2a 20 6c 6f 6f 6b 73 20 61 74 20 74 68  h.** looks at th
325b0 65 20 66 69 6c 65 73 79 73 74 65 6d 20 74 79 70  e filesystem typ
325c0 65 20 61 6e 64 20 74 72 69 65 73 20 74 6f 20 67  e and tries to g
325d0 75 65 73 73 20 74 68 65 20 62 65 73 74 20 6c 6f  uess the best lo
325e0 63 6b 69 6e 67 0a 2a 2a 20 73 74 72 61 74 65 67  cking.** strateg
325f0 79 20 66 72 6f 6d 20 74 68 61 74 2e 0a 2a 2a 0a  y from that..**.
32600 2a 2a 20 46 6f 72 20 66 69 6e 64 65 72 2d 66 75  ** For finder-fu
32610 6e 63 74 69 6f 6e 20 46 2c 20 74 77 6f 20 6f 62  nction F, two ob
32620 6a 65 63 74 73 20 61 72 65 20 63 72 65 61 74 65  jects are create
32630 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20  d:.**.**    (1) 
32640 54 68 65 20 72 65 61 6c 20 66 69 6e 64 65 72 2d  The real finder-
32650 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 64 20 22  function named "
32660 46 49 6d 70 74 28 29 22 2e 0a 2a 2a 0a 2a 2a 20  FImpt()"..**.** 
32670 20 20 20 28 32 29 20 41 20 63 6f 6e 73 74 61 6e     (2) A constan
32680 74 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 69  t pointer to thi
32690 73 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 64  s function named
326a0 20 6a 75 73 74 20 22 46 22 2e 0a 2a 2a 0a 2a 2a   just "F"..**.**
326b0 0a 2a 2a 20 41 20 70 6f 69 6e 74 65 72 20 74 6f  .** A pointer to
326c0 20 74 68 65 20 46 20 70 6f 69 6e 74 65 72 20 69   the F pointer i
326d0 73 20 75 73 65 64 20 61 73 20 74 68 65 20 70 41  s used as the pA
326e0 70 70 44 61 74 61 20 76 61 6c 75 65 20 66 6f 72  ppData value for
326f0 20 56 46 53 0a 2a 2a 20 6f 62 6a 65 63 74 73 2e   VFS.** objects.
32700 20 20 57 65 20 68 61 76 65 20 74 6f 20 64 6f 20    We have to do 
32710 74 68 69 73 20 69 6e 73 74 65 61 64 20 6f 66 20  this instead of 
32720 6c 65 74 74 69 6e 67 20 70 41 70 70 44 61 74 61  letting pAppData
32730 20 70 6f 69 6e 74 0a 2a 2a 20 64 69 72 65 63 74   point.** direct
32740 6c 79 20 61 74 20 74 68 65 20 66 69 6e 64 65 72  ly at the finder
32750 2d 66 75 6e 63 74 69 6f 6e 20 73 69 6e 63 65 20  -function since 
32760 43 39 30 20 72 75 6c 65 73 20 70 72 65 76 65 6e  C90 rules preven
32770 74 20 61 20 76 6f 69 64 2a 0a 2a 2a 20 66 72 6f  t a void*.** fro
32780 6d 20 62 65 20 63 61 73 74 20 69 6e 74 6f 20 61  m be cast into a
32790 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65   function pointe
327a0 72 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 45 61 63 68  r..**.**.** Each
327b0 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69   instance of thi
327c0 73 20 6d 61 63 72 6f 20 67 65 6e 65 72 61 74 65  s macro generate
327d0 73 20 74 77 6f 20 6f 62 6a 65 63 74 73 3a 0a 2a  s two objects:.*
327e0 2a 0a 2a 2a 20 20 20 2a 20 20 41 20 63 6f 6e 73  *.**   *  A cons
327f0 74 61 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f  tant sqlite3_io_
32800 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 63  methods object c
32810 61 6c 6c 20 4d 45 54 48 4f 44 20 74 68 61 74 20  all METHOD that 
32820 68 61 73 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20  has locking.**  
32830 20 20 20 20 6d 65 74 68 6f 64 73 20 43 4c 4f 53      methods CLOS
32840 45 2c 20 4c 4f 43 4b 2c 20 55 4e 4c 4f 43 4b 2c  E, LOCK, UNLOCK,
32850 20 43 4b 52 45 53 4c 4f 43 4b 2e 0a 2a 2a 0a 2a   CKRESLOCK..**.*
32860 2a 20 20 20 2a 20 20 41 6e 20 49 2f 4f 20 6d 65  *   *  An I/O me
32870 74 68 6f 64 20 66 69 6e 64 65 72 20 66 75 6e 63  thod finder func
32880 74 69 6f 6e 20 63 61 6c 6c 65 64 20 46 49 4e 44  tion called FIND
32890 45 52 20 74 68 61 74 20 72 65 74 75 72 6e 73 20  ER that returns 
328a0 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 20 20 20  a pointer.**    
328b0 20 20 74 6f 20 74 68 65 20 4d 45 54 48 4f 44 20    to the METHOD 
328c0 6f 62 6a 65 63 74 20 69 6e 20 74 68 65 20 70 72  object in the pr
328d0 65 76 69 6f 75 73 20 62 75 6c 6c 65 74 2e 0a 2a  evious bullet..*
328e0 2f 0a 23 64 65 66 69 6e 65 20 49 4f 4d 45 54 48  /.#define IOMETH
328f0 4f 44 53 28 46 49 4e 44 45 52 2c 4d 45 54 48 4f  ODS(FINDER,METHO
32900 44 2c 56 45 52 53 49 4f 4e 2c 43 4c 4f 53 45 2c  D,VERSION,CLOSE,
32910 4c 4f 43 4b 2c 55 4e 4c 4f 43 4b 2c 43 4b 4c 4f  LOCK,UNLOCK,CKLO
32920 43 4b 2c 53 48 4d 4d 41 50 29 20 20 20 20 20 5c  CK,SHMMAP)     \
32930 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71  .static const sq
32940 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
32950 20 4d 45 54 48 4f 44 20 3d 20 7b 20 20 20 20 20   METHOD = {     
32960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
32980 20 20 20 56 45 52 53 49 4f 4e 2c 20 20 20 20 20     VERSION,     
32990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
329a0 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 20 20 20  * iVersion */   
329b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
329c0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
329d0 20 20 43 4c 4f 53 45 2c 20 20 20 20 20 20 20 20    CLOSE,        
329e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
329f0 20 78 43 6c 6f 73 65 20 2a 2f 20 20 20 20 20 20   xClose */      
32a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32a10 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
32a20 20 75 6e 69 78 52 65 61 64 2c 20 20 20 20 20 20   unixRead,      
32a30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
32a40 78 52 65 61 64 20 2a 2f 20 20 20 20 20 20 20 20  xRead */        
32a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32a60 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
32a70 75 6e 69 78 57 72 69 74 65 2c 20 20 20 20 20 20  unixWrite,      
32a80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
32a90 57 72 69 74 65 20 2a 2f 20 20 20 20 20 20 20 20  Write */        
32aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32ab0 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75            \.   u
32ac0 6e 69 78 54 72 75 6e 63 61 74 65 2c 20 20 20 20  nixTruncate,    
32ad0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 54             /* xT
32ae0 72 75 6e 63 61 74 65 20 2a 2f 20 20 20 20 20 20  runcate */      
32af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32b00 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e           \.   un
32b10 69 78 53 79 6e 63 2c 20 20 20 20 20 20 20 20 20  ixSync,         
32b20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 79            /* xSy
32b30 6e 63 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  nc */           
32b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32b50 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69          \.   uni
32b60 78 46 69 6c 65 53 69 7a 65 2c 20 20 20 20 20 20  xFileSize,      
32b70 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c           /* xFil
32b80 65 53 69 7a 65 20 2a 2f 20 20 20 20 20 20 20 20  eSize */        
32b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32ba0 20 20 20 20 20 20 20 5c 0a 20 20 20 4c 4f 43 4b         \.   LOCK
32bb0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
32bc0 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b          /* xLock
32bd0 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
32be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32bf0 20 20 20 20 20 20 5c 0a 20 20 20 55 4e 4c 4f 43        \.   UNLOC
32c00 4b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K,              
32c10 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63         /* xUnloc
32c20 6b 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  k */            
32c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32c40 20 20 20 20 20 5c 0a 20 20 20 43 4b 4c 4f 43 4b       \.   CKLOCK
32c50 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
32c60 20 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52        /* xCheckR
32c70 65 73 65 72 76 65 64 4c 6f 63 6b 20 2a 2f 20 20  eservedLock */  
32c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32c90 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 46 69 6c      \.   unixFil
32ca0 65 43 6f 6e 74 72 6f 6c 2c 20 20 20 20 20 20 20  eControl,       
32cb0 20 20 20 20 20 2f 2a 20 78 46 69 6c 65 43 6f 6e       /* xFileCon
32cc0 74 72 6f 6c 20 2a 2f 20 20 20 20 20 20 20 20 20  trol */         
32cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32ce0 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 65 63 74     \.   unixSect
32cf0 6f 72 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20  orSize,         
32d00 20 20 20 20 2f 2a 20 78 53 65 63 74 6f 72 53 69      /* xSectorSi
32d10 7a 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  ze */           
32d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32d30 20 20 5c 0a 20 20 20 75 6e 69 78 44 65 76 69 63    \.   unixDevic
32d40 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
32d50 2c 20 20 2f 2a 20 78 44 65 76 69 63 65 43 61 70  ,  /* xDeviceCap
32d60 61 62 69 6c 69 74 69 65 73 20 2a 2f 20 20 20 20  abilities */    
32d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32d80 20 5c 0a 20 20 20 53 48 4d 4d 41 50 2c 20 20 20   \.   SHMMAP,   
32d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32da0 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20 2a 2f 20    /* xShmMap */ 
32db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32dd0 5c 0a 20 20 20 75 6e 69 78 53 68 6d 4c 6f 63 6b  \.   unixShmLock
32de0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
32df0 20 2f 2a 20 78 53 68 6d 4c 6f 63 6b 20 2a 2f 20   /* xShmLock */ 
32e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
32e20 0a 20 20 20 75 6e 69 78 53 68 6d 42 61 72 72 69  .   unixShmBarri
32e30 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
32e40 2f 2a 20 78 53 68 6d 42 61 72 72 69 65 72 20 2a  /* xShmBarrier *
32e50 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
32e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
32e70 20 20 20 75 6e 69 78 53 68 6d 55 6e 6d 61 70 2c     unixShmUnmap,
32e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
32e90 2a 20 78 53 68 6d 55 6e 6d 61 70 20 2a 2f 20 20  * xShmUnmap */  
32ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
32ec0 20 20 75 6e 69 78 46 65 74 63 68 2c 20 20 20 20    unixFetch,    
32ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
32ee0 20 78 46 65 74 63 68 20 2a 2f 20 20 20 20 20 20   xFetch */      
32ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32f00 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
32f10 20 75 6e 69 78 55 6e 66 65 74 63 68 2c 20 20 20   unixUnfetch,   
32f20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
32f30 78 55 6e 66 65 74 63 68 20 2a 2f 20 20 20 20 20  xUnfetch */     
32f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32f50 20 20 20 20 20 20 20 20 20 20 20 5c 0a 7d 3b 20             \.}; 
32f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32fa0 20 20 20 20 20 20 20 20 20 20 5c 0a 73 74 61 74            \.stat
32fb0 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ic const sqlite3
32fc0 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 46 49 4e  _io_methods *FIN
32fd0 44 45 52 23 23 49 6d 70 6c 28 63 6f 6e 73 74 20  DER##Impl(const 
32fe0 63 68 61 72 20 2a 7a 2c 20 75 6e 69 78 46 69 6c  char *z, unixFil
32ff0 65 20 2a 70 29 7b 20 20 20 5c 0a 20 20 55 4e 55  e *p){   \.  UNU
33000 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 7a 29  SED_PARAMETER(z)
33010 3b 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54  ; UNUSED_PARAMET
33020 45 52 28 70 29 3b 20 20 20 20 20 20 20 20 20 20  ER(p);          
33030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33040 20 20 20 20 20 20 20 20 5c 0a 20 20 72 65 74 75          \.  retu
33050 72 6e 20 26 4d 45 54 48 4f 44 3b 20 20 20 20 20  rn &METHOD;     
33060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33090 20 20 20 20 20 20 20 5c 0a 7d 20 20 20 20 20 20         \.}      
330a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
330b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
330c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
330d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
330e0 20 20 20 20 20 20 5c 0a 73 74 61 74 69 63 20 63        \.static c
330f0 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f  onst sqlite3_io_
33100 6d 65 74 68 6f 64 73 20 2a 28 2a 63 6f 6e 73 74  methods *(*const
33110 20 46 49 4e 44 45 52 29 28 63 6f 6e 73 74 20 63   FINDER)(const c
33120 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65 20 2a 70  har*,unixFile *p
33130 29 20 20 20 20 5c 0a 20 20 20 20 3d 20 46 49 4e  )    \.    = FIN
33140 44 45 52 23 23 49 6d 70 6c 3b 0a 0a 2f 2a 0a 2a  DER##Impl;../*.*
33150 2a 20 48 65 72 65 20 61 72 65 20 61 6c 6c 20 6f  * Here are all o
33160 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6f  f the sqlite3_io
33170 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 73  _methods objects
33180 20 66 6f 72 20 65 61 63 68 20 6f 66 20 74 68 65   for each of the
33190 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 73 74 72 61  .** locking stra
331a0 74 65 67 69 65 73 2e 20 20 46 75 6e 63 74 69 6f  tegies.  Functio
331b0 6e 73 20 74 68 61 74 20 72 65 74 75 72 6e 20 70  ns that return p
331c0 6f 69 6e 74 65 72 73 20 74 6f 20 74 68 65 73 65  ointers to these
331d0 20 6d 65 74 68 6f 64 73 0a 2a 2a 20 61 72 65 20   methods.** are 
331e0 61 6c 73 6f 20 63 72 65 61 74 65 64 2e 0a 2a 2f  also created..*/
331f0 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 70 6f  .IOMETHODS(.  po
33200 73 69 78 49 6f 46 69 6e 64 65 72 2c 20 20 20 20  sixIoFinder,    
33210 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65          /* Finde
33220 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20  r function name 
33230 2a 2f 0a 20 20 70 6f 73 69 78 49 6f 4d 65 74 68  */.  posixIoMeth
33240 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ods,           /
33250 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  * sqlite3_io_met
33260 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65  hods object name
33270 20 2a 2f 0a 20 20 33 2c 20 20 20 20 20 20 20 20   */.  3,        
33280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33290 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79  /* shared memory
332a0 20 61 6e 64 20 6d 6d 61 70 20 61 72 65 20 65 6e   and mmap are en
332b0 61 62 6c 65 64 20 2a 2f 0a 20 20 75 6e 69 78 43  abled */.  unixC
332c0 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  lose,           
332d0 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d       /* xClose m
332e0 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 4c  ethod */.  unixL
332f0 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
33300 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65       /* xLock me
33310 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 55 6e  thod */.  unixUn
33320 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  lock,           
33330 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d      /* xUnlock m
33340 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 43  ethod */.  unixC
33350 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
33360 2c 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65  ,    /* xCheckRe
33370 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f  servedLock metho
33380 64 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 4d 61  d */.  unixShmMa
33390 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p               
333a0 20 2f 2a 20 78 53 68 6d 4d 61 70 20 6d 65 74 68   /* xShmMap meth
333b0 6f 64 20 2a 2f 0a 29 0a 49 4f 4d 45 54 48 4f 44  od */.).IOMETHOD
333c0 53 28 0a 20 20 6e 6f 6c 6f 63 6b 49 6f 46 69 6e  S(.  nolockIoFin
333d0 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 2f  der,           /
333e0 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f  * Finder functio
333f0 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 6e 6f 6c 6f  n name */.  nolo
33400 63 6b 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20  ckIoMethods,    
33410 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33        /* sqlite3
33420 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65  _io_methods obje
33430 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 33 2c 20  ct name */.  3, 
33440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33450 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64         /* shared
33460 20 6d 65 6d 6f 72 79 20 69 73 20 65 6e 61 62 6c   memory is enabl
33470 65 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 43 6c  ed */.  nolockCl
33480 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ose,            
33490 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68    /* xClose meth
334a0 6f 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 4c 6f  od */.  nolockLo
334b0 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
334c0 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f    /* xLock metho
334d0 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 55 6e 6c  d */.  nolockUnl
334e0 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
334f0 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68   /* xUnlock meth
33500 6f 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 43 68  od */.  nolockCh
33510 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c  eckReservedLock,
33520 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72    /* xCheckReser
33530 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  vedLock method *
33540 2f 0a 20 20 30 20 20 20 20 20 20 20 20 20 20 20  /.  0           
33550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
33560 20 78 53 68 6d 4d 61 70 20 6d 65 74 68 6f 64 20   xShmMap method 
33570 2a 2f 0a 29 0a 49 4f 4d 45 54 48 4f 44 53 28 0a  */.).IOMETHODS(.
33580 20 20 64 6f 74 6c 6f 63 6b 49 6f 46 69 6e 64 65    dotlockIoFinde
33590 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  r,          /* F
335a0 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e  inder function n
335b0 61 6d 65 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b  ame */.  dotlock
335c0 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20  IoMethods,      
335d0 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f     /* sqlite3_io
335e0 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20  _methods object 
335f0 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20  name */.  1,    
33600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33610 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65      /* shared me
33620 6d 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65 64  mory is disabled
33630 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 43 6c 6f   */.  dotlockClo
33640 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
33650 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64  /* xClose method
33660 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 4c 6f 63   */.  dotlockLoc
33670 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
33680 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  /* xLock method 
33690 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 55 6e 6c 6f  */.  dotlockUnlo
336a0 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  ck,            /
336b0 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64  * xUnlock method
336c0 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 43 68 65   */.  dotlockChe
336d0 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20  ckReservedLock, 
336e0 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65  /* xCheckReserve
336f0 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  dLock method */.
33700 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20    0             
33710 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
33720 53 68 6d 4d 61 70 20 6d 65 74 68 6f 64 20 2a 2f  ShmMap method */
33730 0a 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 45  .)..#if SQLITE_E
33740 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
33750 59 4c 45 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20  YLE.IOMETHODS(. 
33760 20 66 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20   flockIoFinder, 
33770 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
33780 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61  nder function na
33790 6d 65 20 2a 2f 0a 20 20 66 6c 6f 63 6b 49 6f 4d  me */.  flockIoM
337a0 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20  ethods,         
337b0 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f    /* sqlite3_io_
337c0 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e  methods object n
337d0 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20  ame */.  1,     
337e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
337f0 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d     /* shared mem
33800 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65 64 20  ory is disabled 
33810 2a 2f 0a 20 20 66 6c 6f 63 6b 43 6c 6f 73 65 2c  */.  flockClose,
33820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
33830 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20  * xClose method 
33840 2a 2f 0a 20 20 66 6c 6f 63 6b 4c 6f 63 6b 2c 20  */.  flockLock, 
33850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
33860 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  * xLock method *
33870 2f 0a 20 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c  /.  flockUnlock,
33880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
33890 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20   xUnlock method 
338a0 2a 2f 0a 20 20 66 6c 6f 63 6b 43 68 65 63 6b 52  */.  flockCheckR
338b0 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20 20 2f  eservedLock,   /
338c0 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  * xCheckReserved
338d0 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  Lock method */. 
338e0 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20   0              
338f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
33900 68 6d 4d 61 70 20 6d 65 74 68 6f 64 20 2a 2f 0a  hmMap method */.
33910 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 4f 53  ).#endif..#if OS
33920 5f 56 58 57 4f 52 4b 53 0a 49 4f 4d 45 54 48 4f  _VXWORKS.IOMETHO
33930 44 53 28 0a 20 20 73 65 6d 49 6f 46 69 6e 64 65  DS(.  semIoFinde
33940 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
33950 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69  /* Finder functi
33960 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 73 65 6d  on name */.  sem
33970 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20  IoMethods,      
33980 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65         /* sqlite
33990 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a  3_io_methods obj
339a0 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c  ect name */.  1,
339b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
339c0 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65          /* share
339d0 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73 61  d memory is disa
339e0 62 6c 65 64 20 2a 2f 0a 20 20 73 65 6d 58 43 6c  bled */.  semXCl
339f0 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ose,            
33a00 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65      /* xClose me
33a10 74 68 6f 64 20 2a 2f 0a 20 20 73 65 6d 58 4c 6f  thod */.  semXLo
33a20 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
33a30 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74      /* xLock met
33a40 68 6f 64 20 2a 2f 0a 20 20 73 65 6d 58 55 6e 6c  hod */.  semXUnl
33a50 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
33a60 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65     /* xUnlock me
33a70 74 68 6f 64 20 2a 2f 0a 20 20 73 65 6d 58 43 68  thod */.  semXCh
33a80 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c  eckReservedLock,
33a90 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73      /* xCheckRes
33aa0 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64  ervedLock method
33ab0 20 2a 2f 0a 20 20 30 20 20 20 20 20 20 20 20 20   */.  0         
33ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33ad0 2f 2a 20 78 53 68 6d 4d 61 70 20 6d 65 74 68 6f  /* xShmMap metho
33ae0 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 23  d */.).#endif..#
33af0 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
33b00 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f  LE__) && SQLITE_
33b10 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
33b20 54 59 4c 45 0a 49 4f 4d 45 54 48 4f 44 53 28 0a  TYLE.IOMETHODS(.
33b30 20 20 61 66 70 49 6f 46 69 6e 64 65 72 2c 20 20    afpIoFinder,  
33b40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
33b50 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e  inder function n
33b60 61 6d 65 20 2a 2f 0a 20 20 61 66 70 49 6f 4d 65  ame */.  afpIoMe
33b70 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20  thods,          
33b80 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f     /* sqlite3_io
33b90 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20  _methods object 
33ba0 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20  name */.  1,    
33bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33bc0 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65      /* shared me
33bd0 6d 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65 64  mory is disabled
33be0 20 2a 2f 0a 20 20 61 66 70 43 6c 6f 73 65 2c 20   */.  afpClose, 
33bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33c00 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64  /* xClose method
33c10 20 2a 2f 0a 20 20 61 66 70 4c 6f 63 6b 2c 20 20   */.  afpLock,  
33c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33c30 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  /* xLock method 
33c40 2a 2f 0a 20 20 61 66 70 55 6e 6c 6f 63 6b 2c 20  */.  afpUnlock, 
33c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
33c60 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64  * xUnlock method
33c70 20 2a 2f 0a 20 20 61 66 70 43 68 65 63 6b 52 65   */.  afpCheckRe
33c80 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20 20 20 20  servedLock,     
33c90 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65  /* xCheckReserve
33ca0 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  dLock method */.
33cb0 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20    0             
33cc0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
33cd0 53 68 6d 4d 61 70 20 6d 65 74 68 6f 64 20 2a 2f  ShmMap method */
33ce0 0a 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .).#endif../*.**
33cf0 20 54 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b 69   The proxy locki
33d00 6e 67 20 6d 65 74 68 6f 64 20 69 73 20 61 20 22  ng method is a "
33d10 73 75 70 65 72 2d 6d 65 74 68 6f 64 22 20 69 6e  super-method" in
33d20 20 74 68 65 20 73 65 6e 73 65 20 74 68 61 74 20   the sense that 
33d30 69 74 0a 2a 2a 20 6f 70 65 6e 73 20 73 65 63 6f  it.** opens seco
33d40 6e 64 61 72 79 20 66 69 6c 65 20 64 65 73 63 72  ndary file descr
33d50 69 70 74 6f 72 73 20 66 6f 72 20 74 68 65 20 63  iptors for the c
33d60 6f 6e 63 68 20 61 6e 64 20 6c 6f 63 6b 20 66 69  onch and lock fi
33d70 6c 65 73 20 61 6e 64 0a 2a 2a 20 69 74 20 75 73  les and.** it us
33d80 65 73 20 70 72 6f 78 79 2c 20 64 6f 74 2d 66 69  es proxy, dot-fi
33d90 6c 65 2c 20 41 46 50 2c 20 61 6e 64 20 66 6c 6f  le, AFP, and flo
33da0 63 6b 28 29 20 6c 6f 63 6b 69 6e 67 20 6d 65 74  ck() locking met
33db0 68 6f 64 73 20 6f 6e 20 74 68 6f 73 65 0a 2a 2a  hods on those.**
33dc0 20 73 65 63 6f 6e 64 61 72 79 20 66 69 6c 65 73   secondary files
33dd0 2e 20 20 46 6f 72 20 74 68 69 73 20 72 65 61 73  .  For this reas
33de0 6f 6e 2c 20 74 68 65 20 64 69 76 69 73 69 6f 6e  on, the division
33df0 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73   that implements
33e00 0a 2a 2a 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e  .** proxy lockin
33e10 67 20 69 73 20 6c 6f 63 61 74 65 64 20 6d 75 63  g is located muc
33e20 68 20 66 75 72 74 68 65 72 20 64 6f 77 6e 20 69  h further down i
33e30 6e 20 74 68 65 20 66 69 6c 65 2e 20 20 42 75 74  n the file.  But
33e40 20 77 65 20 6e 65 65 64 0a 2a 2a 20 74 6f 20 67   we need.** to g
33e50 6f 20 61 68 65 61 64 20 61 6e 64 20 64 65 66 69  o ahead and defi
33e60 6e 65 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69  ne the sqlite3_i
33e70 6f 5f 6d 65 74 68 6f 64 73 20 61 6e 64 20 66 69  o_methods and fi
33e80 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  nder function.**
33e90 20 66 6f 72 20 70 72 6f 78 79 20 6c 6f 63 6b 69   for proxy locki
33ea0 6e 67 20 68 65 72 65 2e 20 20 53 6f 20 77 65 20  ng here.  So we 
33eb0 66 6f 72 77 61 72 64 20 64 65 63 6c 61 72 65 20  forward declare 
33ec0 74 68 65 20 49 2f 4f 20 6d 65 74 68 6f 64 73 2e  the I/O methods.
33ed0 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .*/.#if defined(
33ee0 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51  __APPLE__) && SQ
33ef0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
33f00 49 4e 47 5f 53 54 59 4c 45 0a 73 74 61 74 69 63  ING_STYLE.static
33f10 20 69 6e 74 20 70 72 6f 78 79 43 6c 6f 73 65 28   int proxyClose(
33f20 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 3b 0a  sqlite3_file*);.
33f30 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
33f40 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
33f50 65 2a 2c 20 69 6e 74 29 3b 0a 73 74 61 74 69 63  e*, int);.static
33f60 20 69 6e 74 20 70 72 6f 78 79 55 6e 6c 6f 63 6b   int proxyUnlock
33f70 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20  (sqlite3_file*, 
33f80 69 6e 74 29 3b 0a 73 74 61 74 69 63 20 69 6e 74  int);.static int
33f90 20 70 72 6f 78 79 43 68 65 63 6b 52 65 73 65 72   proxyCheckReser
33fa0 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  vedLock(sqlite3_
33fb0 66 69 6c 65 2a 2c 20 69 6e 74 2a 29 3b 0a 49 4f  file*, int*);.IO
33fc0 4d 45 54 48 4f 44 53 28 0a 20 20 70 72 6f 78 79  METHODS(.  proxy
33fd0 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20  IoFinder,       
33fe0 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66       /* Finder f
33ff0 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a  unction name */.
34000 20 20 70 72 6f 78 79 49 6f 4d 65 74 68 6f 64 73    proxyIoMethods
34010 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73  ,           /* s
34020 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
34030 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f  s object name */
34040 0a 20 20 32 2c 20 20 20 20 20 20 20 20 20 20 20  .  2,           
34050 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
34060 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73  shared memory is
34070 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20 70 72   enabled */.  pr
34080 6f 78 79 43 6c 6f 73 65 2c 20 20 20 20 20 20 20  oxyClose,       
34090 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73          /* xClos
340a0 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 70 72  e method */.  pr
340b0 6f 78 79 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20  oxyLock,        
340c0 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b          /* xLock
340d0 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 70 72 6f   method */.  pro
340e0 78 79 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20  xyUnlock,       
340f0 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63         /* xUnloc
34100 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 70 72  k method */.  pr
34110 6f 78 79 43 68 65 63 6b 52 65 73 65 72 76 65 64  oxyCheckReserved
34120 4c 6f 63 6b 2c 20 20 20 2f 2a 20 78 43 68 65 63  Lock,   /* xChec
34130 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65  kReservedLock me
34140 74 68 6f 64 20 2a 2f 0a 20 20 30 20 20 20 20 20  thod */.  0     
34150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34160 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20 6d      /* xShmMap m
34170 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69  ethod */.).#endi
34180 66 0a 0a 2f 2a 20 6e 66 73 20 6c 6f 63 6b 64 20  f../* nfs lockd 
34190 6f 6e 20 4f 53 58 20 31 30 2e 33 2b 20 64 6f 65  on OSX 10.3+ doe
341a0 73 6e 27 74 20 63 6c 65 61 72 20 77 72 69 74 65  sn't clear write
341b0 20 6c 6f 63 6b 73 20 77 68 65 6e 20 61 20 72 65   locks when a re
341c0 61 64 20 6c 6f 63 6b 20 69 73 20 73 65 74 20 2a  ad lock is set *
341d0 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  /.#if defined(__
341e0 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49  APPLE__) && SQLI
341f0 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
34200 47 5f 53 54 59 4c 45 0a 49 4f 4d 45 54 48 4f 44  G_STYLE.IOMETHOD
34210 53 28 0a 20 20 6e 66 73 49 6f 46 69 6e 64 65 72  S(.  nfsIoFinder
34220 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
34230 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69  /* Finder functi
34240 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 6e 66 73  on name */.  nfs
34250 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20  IoMethods,      
34260 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74          /* sqlit
34270 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62  e3_io_methods ob
34280 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31  ject name */.  1
34290 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
342a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61            /* sha
342b0 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69  red memory is di
342c0 73 61 62 6c 65 64 20 2a 2f 0a 20 20 75 6e 69 78  sabled */.  unix
342d0 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20  Close,          
342e0 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65         /* xClose
342f0 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69   method */.  uni
34300 78 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  xLock,          
34310 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b          /* xLock
34320 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 66 73   method */.  nfs
34330 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  Unlock,         
34340 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f          /* xUnlo
34350 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75  ck method */.  u
34360 6e 69 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  nixCheckReserved
34370 4c 6f 63 6b 2c 20 20 20 20 20 2f 2a 20 78 43 68  Lock,     /* xCh
34380 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20  eckReservedLock 
34390 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 30 20 20 20  method */.  0   
343a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
343b0 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61         /* xShmMa
343c0 70 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65  p method */.).#e
343d0 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e 65  ndif..#if define
343e0 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20  d(__APPLE__) && 
343f0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
34400 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 20 0a  CKING_STYLE./* .
34410 2a 2a 20 54 68 69 73 20 22 66 69 6e 64 65 72 22  ** This "finder"
34420 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70   function attemp
34430 74 73 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ts to determine 
34440 74 68 65 20 62 65 73 74 20 6c 6f 63 6b 69 6e 67  the best locking
34450 20 73 74 72 61 74 65 67 79 20 0a 2a 2a 20 66 6f   strategy .** fo
34460 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  r the database f
34470 69 6c 65 20 22 66 69 6c 65 50 61 74 68 22 2e 20  ile "filePath". 
34480 20 49 74 20 74 68 65 6e 20 72 65 74 75 72 6e 73   It then returns
34490 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6f 5f   the sqlite3_io_
344a0 6d 65 74 68 6f 64 73 0a 2a 2a 20 6f 62 6a 65 63  methods.** objec
344b0 74 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74  t that implement
344c0 73 20 74 68 61 74 20 73 74 72 61 74 65 67 79 2e  s that strategy.
344d0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 66  .**.** This is f
344e0 6f 72 20 4d 61 63 4f 53 58 20 6f 6e 6c 79 2e 0a  or MacOSX only..
344f0 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
34500 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
34510 64 73 20 2a 61 75 74 6f 6c 6f 63 6b 49 6f 46 69  ds *autolockIoFi
34520 6e 64 65 72 49 6d 70 6c 28 0a 20 20 63 6f 6e 73  nderImpl(.  cons
34530 74 20 63 68 61 72 20 2a 66 69 6c 65 50 61 74 68  t char *filePath
34540 2c 20 20 20 20 2f 2a 20 6e 61 6d 65 20 6f 66 20  ,    /* name of 
34550 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
34560 65 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20  e */.  unixFile 
34570 2a 70 4e 65 77 20 20 20 20 20 20 20 20 20 20 20  *pNew           
34580 2f 2a 20 6f 70 65 6e 20 66 69 6c 65 20 6f 62 6a  /* open file obj
34590 65 63 74 20 66 6f 72 20 74 68 65 20 64 61 74 61  ect for the data
345a0 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a  base file */.){.
345b0 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73    static const s
345c0 74 72 75 63 74 20 4d 61 70 70 69 6e 67 20 7b 0a  truct Mapping {.
345d0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
345e0 7a 46 69 6c 65 73 79 73 74 65 6d 3b 20 20 20 20  zFilesystem;    
345f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
34600 65 73 79 73 74 65 6d 20 74 79 70 65 20 6e 61 6d  esystem type nam
34610 65 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 73  e */.    const s
34620 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
34630 73 20 2a 70 4d 65 74 68 6f 64 73 3b 20 20 20 2f  s *pMethods;   /
34640 2a 20 41 70 70 72 6f 70 72 69 61 74 65 20 6c 6f  * Appropriate lo
34650 63 6b 69 6e 67 20 6d 65 74 68 6f 64 20 2a 2f 0a  cking method */.
34660 20 20 7d 20 61 4d 61 70 5b 5d 20 3d 20 7b 0a 20    } aMap[] = {. 
34670 20 20 20 7b 20 22 68 66 73 22 2c 20 20 20 20 26     { "hfs",    &
34680 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 20 7d  posixIoMethods }
34690 2c 0a 20 20 20 20 7b 20 22 75 66 73 22 2c 20 20  ,.    { "ufs",  
346a0 20 20 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64    &posixIoMethod
346b0 73 20 7d 2c 0a 20 20 20 20 7b 20 22 61 66 70 66  s },.    { "afpf
346c0 73 22 2c 20 20 26 61 66 70 49 6f 4d 65 74 68 6f  s",  &afpIoMetho
346d0 64 73 20 7d 2c 0a 20 20 20 20 7b 20 22 73 6d 62  ds },.    { "smb
346e0 66 73 22 2c 20 20 26 61 66 70 49 6f 4d 65 74 68  fs",  &afpIoMeth
346f0 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20 22 77 65  ods },.    { "we
34700 62 64 61 76 22 2c 20 26 6e 6f 6c 6f 63 6b 49 6f  bdav", &nolockIo
34710 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b  Methods },.    {
34720 20 30 2c 20 30 20 7d 0a 20 20 7d 3b 0a 20 20 69   0, 0 }.  };.  i
34730 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 73  nt i;.  struct s
34740 74 61 74 66 73 20 66 73 49 6e 66 6f 3b 0a 20 20  tatfs fsInfo;.  
34750 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63  struct flock loc
34760 6b 49 6e 66 6f 3b 0a 0a 20 20 69 66 28 20 21 66  kInfo;..  if( !f
34770 69 6c 65 50 61 74 68 20 29 7b 0a 20 20 20 20 2f  ilePath ){.    /
34780 2a 20 49 66 20 66 69 6c 65 50 61 74 68 3d 3d 4e  * If filePath==N
34790 55 4c 4c 20 74 68 61 74 20 6d 65 61 6e 73 20 77  ULL that means w
347a0 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69  e are dealing wi
347b0 74 68 20 61 20 74 72 61 6e 73 69 65 6e 74 20 66  th a transient f
347c0 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68 61 74 20  ile.    ** that 
347d0 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f  does not need to
347e0 20 62 65 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a 20   be locked. */. 
347f0 20 20 20 72 65 74 75 72 6e 20 26 6e 6f 6c 6f 63     return &noloc
34800 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a  kIoMethods;.  }.
34810 20 20 69 66 28 20 73 74 61 74 66 73 28 66 69 6c    if( statfs(fil
34820 65 50 61 74 68 2c 20 26 66 73 49 6e 66 6f 29 20  ePath, &fsInfo) 
34830 21 3d 20 2d 31 20 29 7b 0a 20 20 20 20 69 66 28  != -1 ){.    if(
34840 20 66 73 49 6e 66 6f 2e 66 5f 66 6c 61 67 73 20   fsInfo.f_flags 
34850 26 20 4d 4e 54 5f 52 44 4f 4e 4c 59 20 29 7b 0a  & MNT_RDONLY ){.
34860 20 20 20 20 20 20 72 65 74 75 72 6e 20 26 6e 6f        return &no
34870 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20  lockIoMethods;. 
34880 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30     }.    for(i=0
34890 3b 20 61 4d 61 70 5b 69 5d 2e 7a 46 69 6c 65 73  ; aMap[i].zFiles
348a0 79 73 74 65 6d 3b 20 69 2b 2b 29 7b 0a 20 20 20  ystem; i++){.   
348b0 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 66 73     if( strcmp(fs
348c0 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61 6d  Info.f_fstypenam
348d0 65 2c 20 61 4d 61 70 5b 69 5d 2e 7a 46 69 6c 65  e, aMap[i].zFile
348e0 73 79 73 74 65 6d 29 3d 3d 30 20 29 7b 0a 20 20  system)==0 ){.  
348f0 20 20 20 20 20 20 72 65 74 75 72 6e 20 61 4d 61        return aMa
34900 70 5b 69 5d 2e 70 4d 65 74 68 6f 64 73 3b 0a 20  p[i].pMethods;. 
34910 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
34920 0a 0a 20 20 2f 2a 20 44 65 66 61 75 6c 74 20 63  ..  /* Default c
34930 61 73 65 2e 20 48 61 6e 64 6c 65 73 2c 20 61 6d  ase. Handles, am
34940 6f 6e 67 73 74 20 6f 74 68 65 72 73 2c 20 22 6e  ongst others, "n
34950 66 73 22 2e 0a 20 20 2a 2a 20 54 65 73 74 20 62  fs"..  ** Test b
34960 79 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 20 75  yte-range lock u
34970 73 69 6e 67 20 66 63 6e 74 6c 28 29 2e 20 49 66  sing fcntl(). If
34980 20 74 68 65 20 63 61 6c 6c 20 73 75 63 63 65 65   the call succee
34990 64 73 2c 20 0a 20 20 2a 2a 20 61 73 73 75 6d 65  ds, .  ** assume
349a0 20 74 68 61 74 20 74 68 65 20 66 69 6c 65 2d 73   that the file-s
349b0 79 73 74 65 6d 20 73 75 70 70 6f 72 74 73 20 50  ystem supports P
349c0 4f 53 49 58 20 73 74 79 6c 65 20 6c 6f 63 6b 73  OSIX style locks
349d0 2e 20 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b 49 6e  . .  */.  lockIn
349e0 66 6f 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20  fo.l_len = 1;.  
349f0 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 73 74 61 72 74  lockInfo.l_start
34a00 20 3d 20 30 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f   = 0;.  lockInfo
34a10 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b  .l_whence = SEEK
34a20 5f 53 45 54 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f  _SET;.  lockInfo
34a30 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c 43  .l_type = F_RDLC
34a40 4b 3b 0a 20 20 69 66 28 20 6f 73 46 63 6e 74 6c  K;.  if( osFcntl
34a50 28 70 4e 65 77 2d 3e 68 2c 20 46 5f 47 45 54 4c  (pNew->h, F_GETL
34a60 4b 2c 20 26 6c 6f 63 6b 49 6e 66 6f 29 21 3d 2d  K, &lockInfo)!=-
34a70 31 20 29 20 7b 0a 20 20 20 20 69 66 28 20 73 74  1 ) {.    if( st
34a80 72 63 6d 70 28 66 73 49 6e 66 6f 2e 66 5f 66 73  rcmp(fsInfo.f_fs
34a90 74 79 70 65 6e 61 6d 65 2c 20 22 6e 66 73 22 29  typename, "nfs")
34aa0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ==0 ){.      ret
34ab0 75 72 6e 20 26 6e 66 73 49 6f 4d 65 74 68 6f 64  urn &nfsIoMethod
34ac0 73 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  s;.    } else {.
34ad0 20 20 20 20 20 20 72 65 74 75 72 6e 20 26 70 6f        return &po
34ae0 73 69 78 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20  sixIoMethods;.  
34af0 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
34b00 20 72 65 74 75 72 6e 20 26 64 6f 74 6c 6f 63 6b   return &dotlock
34b10 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 7d  IoMethods;.  }.}
34b20 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71  .static const sq
34b30 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
34b40 20 0a 20 20 2a 28 2a 63 6f 6e 73 74 20 61 75 74   .  *(*const aut
34b50 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 29 28 63  olockIoFinder)(c
34b60 6f 6e 73 74 20 63 68 61 72 2a 2c 75 6e 69 78 46  onst char*,unixF
34b70 69 6c 65 2a 29 20 3d 20 61 75 74 6f 6c 6f 63 6b  ile*) = autolock
34b80 49 6f 46 69 6e 64 65 72 49 6d 70 6c 3b 0a 0a 23  IoFinderImpl;..#
34b90 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64  endif /* defined
34ba0 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53  (__APPLE__) && S
34bb0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
34bc0 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a 23  KING_STYLE */..#
34bd0 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 2f 2a  if OS_VXWORKS./*
34be0 0a 2a 2a 20 54 68 69 73 20 22 66 69 6e 64 65 72  .** This "finder
34bf0 22 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 56  " function for V
34c00 78 57 6f 72 6b 73 20 63 68 65 63 6b 73 20 74 6f  xWorks checks to
34c10 20 73 65 65 20 69 66 20 70 6f 73 69 78 20 61 64   see if posix ad
34c20 76 69 73 6f 72 79 0a 2a 2a 20 6c 6f 63 6b 69 6e  visory.** lockin
34c30 67 20 77 6f 72 6b 73 2e 20 20 49 66 20 69 74 20  g works.  If it 
34c40 64 6f 65 73 2c 20 74 68 65 6e 20 74 68 61 74 20  does, then that 
34c50 69 73 20 77 68 61 74 20 69 73 20 75 73 65 64 2e  is what is used.
34c60 20 20 49 66 20 69 74 20 64 6f 65 73 20 6e 6f 74    If it does not
34c70 0a 2a 2a 20 77 6f 72 6b 2c 20 74 68 65 6e 20 66  .** work, then f
34c80 61 6c 6c 62 61 63 6b 20 74 6f 20 6e 61 6d 65 64  allback to named
34c90 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69   semaphore locki
34ca0 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  ng..*/.static co
34cb0 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  nst sqlite3_io_m
34cc0 65 74 68 6f 64 73 20 2a 76 78 77 6f 72 6b 73 49  ethods *vxworksI
34cd0 6f 46 69 6e 64 65 72 49 6d 70 6c 28 0a 20 20 63  oFinderImpl(.  c
34ce0 6f 6e 73 74 20 63 68 61 72 20 2a 66 69 6c 65 50  onst char *fileP
34cf0 61 74 68 2c 20 20 20 20 2f 2a 20 6e 61 6d 65 20  ath,    /* name 
34d00 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
34d10 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 46 69  file */.  unixFi
34d20 6c 65 20 2a 70 4e 65 77 20 20 20 20 20 20 20 20  le *pNew        
34d30 20 20 20 2f 2a 20 74 68 65 20 6f 70 65 6e 20 66     /* the open f
34d40 69 6c 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b  ile object */.){
34d50 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20  .  struct flock 
34d60 6c 6f 63 6b 49 6e 66 6f 3b 0a 0a 20 20 69 66 28  lockInfo;..  if(
34d70 20 21 66 69 6c 65 50 61 74 68 20 29 7b 0a 20 20   !filePath ){.  
34d80 20 20 2f 2a 20 49 66 20 66 69 6c 65 50 61 74 68    /* If filePath
34d90 3d 3d 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61 6e  ==NULL that mean
34da0 73 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67  s we are dealing
34db0 20 77 69 74 68 20 61 20 74 72 61 6e 73 69 65 6e   with a transien
34dc0 74 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68  t file.    ** th
34dd0 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64  at does not need
34de0 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 2e 20 2a   to be locked. *
34df0 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 26 6e 6f  /.    return &no
34e00 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20  lockIoMethods;. 
34e10 20 7d 0a 0a 20 20 2f 2a 20 54 65 73 74 20 69 66   }..  /* Test if
34e20 20 66 63 6e 74 6c 28 29 20 69 73 20 73 75 70 70   fcntl() is supp
34e30 6f 72 74 65 64 20 61 6e 64 20 75 73 65 20 50 4f  orted and use PO
34e40 53 49 58 20 73 74 79 6c 65 20 6c 6f 63 6b 73 2e  SIX style locks.
34e50 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 20  .  ** Otherwise 
34e60 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 74 68 65  fall back to the
34e70 20 6e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65   named semaphore
34e80 20 6d 65 74 68 6f 64 2e 0a 20 20 2a 2f 0a 20 20   method..  */.  
34e90 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 6c 65 6e 20 3d  lockInfo.l_len =
34ea0 20 31 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c   1;.  lockInfo.l
34eb0 5f 73 74 61 72 74 20 3d 20 30 3b 0a 20 20 6c 6f  _start = 0;.  lo
34ec0 63 6b 49 6e 66 6f 2e 6c 5f 77 68 65 6e 63 65 20  ckInfo.l_whence 
34ed0 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 6c 6f  = SEEK_SET;.  lo
34ee0 63 6b 49 6e 66 6f 2e 6c 5f 74 79 70 65 20 3d 20  ckInfo.l_type = 
34ef0 46 5f 52 44 4c 43 4b 3b 0a 20 20 69 66 28 20 6f  F_RDLCK;.  if( o
34f00 73 46 63 6e 74 6c 28 70 4e 65 77 2d 3e 68 2c 20  sFcntl(pNew->h, 
34f10 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63 6b 49 6e  F_GETLK, &lockIn
34f20 66 6f 29 21 3d 2d 31 20 29 20 7b 0a 20 20 20 20  fo)!=-1 ) {.    
34f30 72 65 74 75 72 6e 20 26 70 6f 73 69 78 49 6f 4d  return &posixIoM
34f40 65 74 68 6f 64 73 3b 0a 20 20 7d 65 6c 73 65 7b  ethods;.  }else{
34f50 0a 20 20 20 20 72 65 74 75 72 6e 20 26 73 65 6d  .    return &sem
34f60 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 7d  IoMethods;.  }.}
34f70 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71  .static const sq
34f80 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
34f90 20 0a 20 20 2a 28 2a 63 6f 6e 73 74 20 76 78 77   .  *(*const vxw
34fa0 6f 72 6b 73 49 6f 46 69 6e 64 65 72 29 28 63 6f  orksIoFinder)(co
34fb0 6e 73 74 20 63 68 61 72 2a 2c 75 6e 69 78 46 69  nst char*,unixFi
34fc0 6c 65 2a 29 20 3d 20 76 78 77 6f 72 6b 73 49 6f  le*) = vxworksIo
34fd0 46 69 6e 64 65 72 49 6d 70 6c 3b 0a 0a 23 65 6e  FinderImpl;..#en
34fe0 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b  dif /* OS_VXWORK
34ff0 53 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 61  S */../*.** An a
35000 62 73 74 72 61 63 74 20 74 79 70 65 20 66 6f 72  bstract type for
35010 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
35020 20 49 4f 20 6d 65 74 68 6f 64 20 66 69 6e 64 65   IO method finde
35030 72 20 66 75 6e 63 74 69 6f 6e 3a 0a 2a 2f 0a 74  r function:.*/.t
35040 79 70 65 64 65 66 20 63 6f 6e 73 74 20 73 71 6c  ypedef const sql
35050 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
35060 2a 28 2a 66 69 6e 64 65 72 5f 74 79 70 65 29 28  *(*finder_type)(
35070 63 6f 6e 73 74 20 63 68 61 72 2a 2c 75 6e 69 78  const char*,unix
35080 46 69 6c 65 2a 29 3b 0a 0a 0a 2f 2a 2a 2a 2a 2a  File*);.../*****
35090 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
350a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
350b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
350c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
350d0 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
350e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
350f0 2a 2a 2a 2a 20 73 71 6c 69 74 65 33 5f 76 66 73  **** sqlite3_vfs
35100 20 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a   methods *******
35110 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
35120 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
35130 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e 74 61 69   division contai
35140 6e 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74  ns the implement
35150 61 74 69 6f 6e 20 6f 66 20 6d 65 74 68 6f 64 73  ation of methods
35160 20 6f 6e 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74   on the.** sqlit
35170 65 33 5f 76 66 73 20 6f 62 6a 65 63 74 2e 0a 2a  e3_vfs object..*
35180 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  /../*.** Initial
35190 69 7a 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ize the contents
351a0 20 6f 66 20 74 68 65 20 75 6e 69 78 46 69 6c 65   of the unixFile
351b0 20 73 74 72 75 63 74 75 72 65 20 70 6f 69 6e 74   structure point
351c0 65 64 20 74 6f 20 62 79 20 70 49 64 2e 0a 2a 2f  ed to by pId..*/
351d0 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c 6c  .static int fill
351e0 49 6e 55 6e 69 78 46 69 6c 65 28 0a 20 20 73 71  InUnixFile(.  sq
351f0 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
35200 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
35210 20 74 6f 20 76 66 73 20 6f 62 6a 65 63 74 20 2a   to vfs object *
35220 2f 0a 20 20 69 6e 74 20 68 2c 20 20 20 20 20 20  /.  int h,      
35230 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
35240 70 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70  pen file descrip
35250 74 6f 72 20 6f 66 20 66 69 6c 65 20 62 65 69 6e  tor of file bein
35260 67 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 73 71  g opened */.  sq
35270 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 49 64 2c  lite3_file *pId,
35280 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
35290 6f 20 74 68 65 20 75 6e 69 78 46 69 6c 65 20 73  o the unixFile s
352a0 74 72 75 63 74 75 72 65 20 68 65 72 65 20 2a 2f  tructure here */
352b0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
352c0 46 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61  Filename,  /* Na
352d0 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 62  me of the file b
352e0 65 69 6e 67 20 6f 70 65 6e 65 64 20 2a 2f 0a 20  eing opened */. 
352f0 20 69 6e 74 20 63 74 72 6c 46 6c 61 67 73 20 20   int ctrlFlags  
35300 20 20 20 20 20 20 20 20 20 2f 2a 20 5a 65 72 6f           /* Zero
35310 20 6f 72 20 6d 6f 72 65 20 55 4e 49 58 46 49 4c   or more UNIXFIL
35320 45 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a 29 7b  E_* values */.){
35330 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  .  const sqlite3
35340 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 70 4c 6f  _io_methods *pLo
35350 63 6b 69 6e 67 53 74 79 6c 65 3b 0a 20 20 75 6e  ckingStyle;.  un
35360 69 78 46 69 6c 65 20 2a 70 4e 65 77 20 3d 20 28  ixFile *pNew = (
35370 75 6e 69 78 46 69 6c 65 20 2a 29 70 49 64 3b 0a  unixFile *)pId;.
35380 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
35390 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28  E_OK;..  assert(
353a0 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 3d 3d 4e   pNew->pInode==N
353b0 55 4c 4c 20 29 3b 0a 0a 20 20 2f 2a 20 4e 6f 20  ULL );..  /* No 
353c0 6c 6f 63 6b 69 6e 67 20 6f 63 63 75 72 73 20 69  locking occurs i
353d0 6e 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  n temporary file
353e0 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 7a  s */.  assert( z
353f0 46 69 6c 65 6e 61 6d 65 21 3d 30 20 7c 7c 20 28  Filename!=0 || (
35400 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58  ctrlFlags & UNIX
35410 46 49 4c 45 5f 4e 4f 4c 4f 43 4b 29 21 3d 30 20  FILE_NOLOCK)!=0 
35420 29 3b 0a 0a 20 20 4f 53 54 52 41 43 45 28 28 22  );..  OSTRACE(("
35430 4f 50 45 4e 20 20 20 20 25 2d 33 64 20 25 73 5c  OPEN    %-3d %s\
35440 6e 22 2c 20 68 2c 20 7a 46 69 6c 65 6e 61 6d 65  n", h, zFilename
35450 29 29 3b 0a 20 20 70 4e 65 77 2d 3e 68 20 3d 20  ));.  pNew->h = 
35460 68 3b 0a 20 20 70 4e 65 77 2d 3e 70 56 66 73 20  h;.  pNew->pVfs 
35470 3d 20 70 56 66 73 3b 0a 20 20 70 4e 65 77 2d 3e  = pVfs;.  pNew->
35480 7a 50 61 74 68 20 3d 20 7a 46 69 6c 65 6e 61 6d  zPath = zFilenam
35490 65 3b 0a 20 20 70 4e 65 77 2d 3e 63 74 72 6c 46  e;.  pNew->ctrlF
354a0 6c 61 67 73 20 3d 20 28 75 38 29 63 74 72 6c 46  lags = (u8)ctrlF
354b0 6c 61 67 73 3b 0a 23 69 66 20 53 51 4c 49 54 45  lags;.#if SQLITE
354c0 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
354d0 0a 20 20 70 4e 65 77 2d 3e 6d 6d 61 70 53 69 7a  .  pNew->mmapSiz
354e0 65 4d 61 78 20 3d 20 73 71 6c 69 74 65 33 47 6c  eMax = sqlite3Gl
354f0 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4d 6d 61  obalConfig.szMma
35500 70 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20  p;.#endif.  if( 
35510 73 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c  sqlite3_uri_bool
35520 65 61 6e 28 28 28 63 74 72 6c 46 6c 61 67 73 20  ean(((ctrlFlags 
35530 26 20 55 4e 49 58 46 49 4c 45 5f 55 52 49 29 20  & UNIXFILE_URI) 
35540 3f 20 7a 46 69 6c 65 6e 61 6d 65 20 3a 20 30 29  ? zFilename : 0)
35550 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
35560 20 20 20 20 20 20 20 20 20 20 20 20 20 22 70 73               "ps
35570 6f 77 22 2c 20 53 51 4c 49 54 45 5f 50 4f 57 45  ow", SQLITE_POWE
35580 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 29  RSAFE_OVERWRITE)
35590 20 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 63 74   ){.    pNew->ct
355a0 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46  rlFlags |= UNIXF
355b0 49 4c 45 5f 50 53 4f 57 3b 0a 20 20 7d 0a 20 20  ILE_PSOW;.  }.  
355c0 69 66 28 20 73 74 72 63 6d 70 28 70 56 66 73 2d  if( strcmp(pVfs-
355d0 3e 7a 4e 61 6d 65 2c 22 75 6e 69 78 2d 65 78 63  >zName,"unix-exc
355e0 6c 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4e  l")==0 ){.    pN
355f0 65 77 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d  ew->ctrlFlags |=
35600 20 55 4e 49 58 46 49 4c 45 5f 45 58 43 4c 3b 0a   UNIXFILE_EXCL;.
35610 20 20 7d 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f    }..#if OS_VXWO
35620 52 4b 53 0a 20 20 70 4e 65 77 2d 3e 70 49 64 20  RKS.  pNew->pId 
35630 3d 20 76 78 77 6f 72 6b 73 46 69 6e 64 46 69 6c  = vxworksFindFil
35640 65 49 64 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  eId(zFilename);.
35650 20 20 69 66 28 20 70 4e 65 77 2d 3e 70 49 64 3d    if( pNew->pId=
35660 3d 30 20 29 7b 0a 20 20 20 20 63 74 72 6c 46 6c  =0 ){.    ctrlFl
35670 61 67 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f  ags |= UNIXFILE_
35680 4e 4f 4c 4f 43 4b 3b 0a 20 20 20 20 72 63 20 3d  NOLOCK;.    rc =
35690 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
356a0 50 54 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  PT;.  }.#endif..
356b0 20 20 69 66 28 20 63 74 72 6c 46 6c 61 67 73 20    if( ctrlFlags 
356c0 26 20 55 4e 49 58 46 49 4c 45 5f 4e 4f 4c 4f 43  & UNIXFILE_NOLOC
356d0 4b 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 69 6e  K ){.    pLockin
356e0 67 53 74 79 6c 65 20 3d 20 26 6e 6f 6c 6f 63 6b  gStyle = &nolock
356f0 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 65 6c  IoMethods;.  }el
35700 73 65 7b 0a 20 20 20 20 70 4c 6f 63 6b 69 6e 67  se{.    pLocking
35710 53 74 79 6c 65 20 3d 20 28 2a 2a 28 66 69 6e 64  Style = (**(find
35720 65 72 5f 74 79 70 65 2a 29 70 56 66 73 2d 3e 70  er_type*)pVfs->p
35730 41 70 70 44 61 74 61 29 28 7a 46 69 6c 65 6e 61  AppData)(zFilena
35740 6d 65 2c 20 70 4e 65 77 29 3b 0a 23 69 66 20 53  me, pNew);.#if S
35750 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
35760 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20 2f  KING_STYLE.    /
35770 2a 20 43 61 63 68 65 20 7a 46 69 6c 65 6e 61 6d  * Cache zFilenam
35780 65 20 69 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67  e in the locking
35790 20 63 6f 6e 74 65 78 74 20 28 41 46 50 20 61 6e   context (AFP an
357a0 64 20 64 6f 74 6c 6f 63 6b 20 6f 76 65 72 72 69  d dotlock overri
357b0 64 65 29 20 66 6f 72 0a 20 20 20 20 2a 2a 20 70  de) for.    ** p
357c0 72 6f 78 79 4c 6f 63 6b 20 61 63 74 69 76 61 74  roxyLock activat
357d0 69 6f 6e 20 69 73 20 70 6f 73 73 69 62 6c 65 20  ion is possible 
357e0 28 72 65 6d 6f 74 65 20 70 72 6f 78 79 20 69 73  (remote proxy is
357f0 20 62 61 73 65 64 20 6f 6e 20 64 62 20 6e 61 6d   based on db nam
35800 65 29 0a 20 20 20 20 2a 2a 20 7a 46 69 6c 65 6e  e).    ** zFilen
35810 61 6d 65 20 72 65 6d 61 69 6e 73 20 76 61 6c 69  ame remains vali
35820 64 20 75 6e 74 69 6c 20 66 69 6c 65 20 69 73 20  d until file is 
35830 63 6c 6f 73 65 64 2c 20 74 6f 20 73 75 70 70 6f  closed, to suppo
35840 72 74 20 2a 2f 0a 20 20 20 20 70 4e 65 77 2d 3e  rt */.    pNew->
35850 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d  lockingContext =
35860 20 28 76 6f 69 64 2a 29 7a 46 69 6c 65 6e 61 6d   (void*)zFilenam
35870 65 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20  e;.#endif.  }.. 
35880 20 69 66 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79   if( pLockingSty
35890 6c 65 20 3d 3d 20 26 70 6f 73 69 78 49 6f 4d 65  le == &posixIoMe
358a0 74 68 6f 64 73 0a 23 69 66 20 64 65 66 69 6e 65  thods.#if define
358b0 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20  d(__APPLE__) && 
358c0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
358d0 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20  CKING_STYLE.    
358e0 7c 7c 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65  || pLockingStyle
358f0 20 3d 3d 20 26 6e 66 73 49 6f 4d 65 74 68 6f 64   == &nfsIoMethod
35900 73 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 2f 2a  s.#endif.     /*
35910 20 73 75 70 70 6f 72 74 20 57 41 4c 20 6d 6f 64   support WAL mod
35920 65 20 6f 6e 20 72 65 61 64 20 6f 6e 6c 79 20 6d  e on read only m
35930 6f 75 6e 74 65 64 20 66 69 6c 65 73 79 73 74 65  ounted filesyste
35940 6d 20 2a 2f 0a 20 20 20 20 7c 7c 20 28 70 4c 6f  m */.    || (pLo
35950 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26 6e  ckingStyle == &n
35960 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 20 26  olockIoMethods &
35970 26 20 7a 46 69 6c 65 6e 61 6d 65 21 3d 30 29 0a  & zFilename!=0).
35980 20 20 29 7b 0a 20 20 20 20 75 6e 69 78 45 6e 74    ){.    unixEnt
35990 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 72  erMutex();.    r
359a0 63 20 3d 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66  c = findInodeInf
359b0 6f 28 70 4e 65 77 2c 20 26 70 4e 65 77 2d 3e 70  o(pNew, &pNew->p
359c0 49 6e 6f 64 65 29 3b 0a 20 20 20 20 69 66 28 20  Inode);.    if( 
359d0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
359e0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6e 20  .      /* If an 
359f0 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20 69  error occurred i
35a00 6e 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28  n findInodeInfo(
35a10 29 2c 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c  ), close the fil
35a20 65 20 64 65 73 63 72 69 70 74 6f 72 0a 20 20 20  e descriptor.   
35a30 20 20 20 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c     ** immediatel
35a40 79 2c 20 62 65 66 6f 72 65 20 72 65 6c 65 61 73  y, before releas
35a50 69 6e 67 20 74 68 65 20 6d 75 74 65 78 2e 20 66  ing the mutex. f
35a60 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29 20 6d  indInodeInfo() m
35a70 61 79 20 66 61 69 6c 0a 20 20 20 20 20 20 2a 2a  ay fail.      **
35a80 20 69 6e 20 74 77 6f 20 73 63 65 6e 61 72 69 6f   in two scenario
35a90 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  s:.      **.    
35aa0 20 20 2a 2a 20 20 20 28 61 29 20 41 20 63 61 6c    **   (a) A cal
35ab0 6c 20 74 6f 20 66 73 74 61 74 28 29 20 66 61 69  l to fstat() fai
35ac0 6c 65 64 2e 0a 20 20 20 20 20 20 2a 2a 20 20 20  led..      **   
35ad0 28 62 29 20 41 20 6d 61 6c 6c 6f 63 20 66 61 69  (b) A malloc fai
35ae0 6c 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  led..      **.  
35af0 20 20 20 20 2a 2a 20 53 63 65 6e 61 72 69 6f 20      ** Scenario 
35b00 28 62 29 20 6d 61 79 20 6f 6e 6c 79 20 6f 63 63  (b) may only occ
35b10 75 72 20 69 66 20 74 68 65 20 70 72 6f 63 65 73  ur if the proces
35b20 73 20 69 73 20 68 6f 6c 64 69 6e 67 20 6e 6f 20  s is holding no 
35b30 6f 74 68 65 72 0a 20 20 20 20 20 20 2a 2a 20 66  other.      ** f
35b40 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20  ile descriptors 
35b50 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73 61 6d 65  open on the same
35b60 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20   file. If there 
35b70 77 65 72 65 20 6f 74 68 65 72 20 66 69 6c 65 0a  were other file.
35b80 20 20 20 20 20 20 2a 2a 20 64 65 73 63 72 69 70        ** descrip
35b90 74 6f 72 73 20 6f 6e 20 74 68 69 73 20 66 69 6c  tors on this fil
35ba0 65 2c 20 74 68 65 6e 20 6e 6f 20 6d 61 6c 6c 6f  e, then no mallo
35bb0 63 20 77 6f 75 6c 64 20 62 65 20 72 65 71 75 69  c would be requi
35bc0 72 65 64 20 62 79 0a 20 20 20 20 20 20 2a 2a 20  red by.      ** 
35bd0 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29 2e  findInodeInfo().
35be0 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
35bf0 63 61 73 65 2c 20 69 74 20 69 73 20 71 75 69 74  case, it is quit
35c00 65 20 73 61 66 65 20 74 6f 20 63 6c 6f 73 65 0a  e safe to close.
35c10 20 20 20 20 20 20 2a 2a 20 68 61 6e 64 6c 65 20        ** handle 
35c20 68 20 2d 20 61 73 20 69 74 20 69 73 20 67 75 61  h - as it is gua
35c30 72 61 6e 74 65 65 64 20 74 68 61 74 20 6e 6f 20  ranteed that no 
35c40 70 6f 73 69 78 20 6c 6f 63 6b 73 20 77 69 6c 6c  posix locks will
35c50 20 62 65 20 72 65 6c 65 61 73 65 64 0a 20 20 20   be released.   
35c60 20 20 20 2a 2a 20 62 79 20 64 6f 69 6e 67 20 73     ** by doing s
35c70 6f 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  o..      **.    
35c80 20 20 2a 2a 20 49 66 20 73 63 65 6e 61 72 69 6f    ** If scenario
35c90 20 28 61 29 20 63 61 75 73 65 64 20 74 68 65 20   (a) caused the 
35ca0 65 72 72 6f 72 20 74 68 65 6e 20 74 68 69 6e 67  error then thing
35cb0 73 20 61 72 65 20 6e 6f 74 20 73 6f 20 73 61 66  s are not so saf
35cc0 65 2e 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20  e. The.      ** 
35cd0 69 6d 70 6c 69 63 69 74 20 61 73 73 75 6d 70 74  implicit assumpt
35ce0 69 6f 6e 20 68 65 72 65 20 69 73 20 74 68 61 74  ion here is that
35cf0 20 69 66 20 66 73 74 61 74 28 29 20 66 61 69 6c   if fstat() fail
35d00 73 2c 20 74 68 69 6e 67 73 20 61 72 65 20 69 6e  s, things are in
35d10 0a 20 20 20 20 20 20 2a 2a 20 73 75 63 68 20 62  .      ** such b
35d20 61 64 20 73 68 61 70 65 20 74 68 61 74 20 64 72  ad shape that dr
35d30 6f 70 70 69 6e 67 20 61 20 6c 6f 63 6b 20 6f 72  opping a lock or
35d40 20 74 77 6f 20 64 6f 65 73 6e 27 74 20 6d 61 74   two doesn't mat
35d50 74 65 72 20 6d 75 63 68 2e 0a 20 20 20 20 20 20  ter much..      
35d60 2a 2f 0a 20 20 20 20 20 20 72 6f 62 75 73 74 5f  */.      robust_
35d70 63 6c 6f 73 65 28 70 4e 65 77 2c 20 68 2c 20 5f  close(pNew, h, _
35d80 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20  _LINE__);.      
35d90 68 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20  h = -1;.    }.  
35da0 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
35db0 28 29 3b 0a 20 20 7d 0a 0a 23 69 66 20 53 51 4c  ();.  }..#if SQL
35dc0 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
35dd0 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69  NG_STYLE && defi
35de0 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20  ned(__APPLE__). 
35df0 20 65 6c 73 65 20 69 66 28 20 70 4c 6f 63 6b 69   else if( pLocki
35e00 6e 67 53 74 79 6c 65 20 3d 3d 20 26 61 66 70 49  ngStyle == &afpI
35e10 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20  oMethods ){.    
35e20 2f 2a 20 41 46 50 20 6c 6f 63 6b 69 6e 67 20 75  /* AFP locking u
35e30 73 65 73 20 74 68 65 20 66 69 6c 65 20 70 61 74  ses the file pat
35e40 68 20 73 6f 20 69 74 20 6e 65 65 64 73 20 74 6f  h so it needs to
35e50 20 62 65 20 69 6e 63 6c 75 64 65 64 20 69 6e 0a   be included in.
35e60 20 20 20 20 2a 2a 20 74 68 65 20 61 66 70 4c 6f      ** the afpLo
35e70 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2e 0a 20 20  ckingContext..  
35e80 20 20 2a 2f 0a 20 20 20 20 61 66 70 4c 6f 63 6b    */.    afpLock
35e90 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78  ingContext *pCtx
35ea0 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b  ;.    pNew->lock
35eb0 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20 70 43 74  ingContext = pCt
35ec0 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  x = sqlite3_mall
35ed0 6f 63 36 34 28 20 73 69 7a 65 6f 66 28 2a 70 43  oc64( sizeof(*pC
35ee0 74 78 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  tx) );.    if( p
35ef0 43 74 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Ctx==0 ){.      
35f00 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
35f10 4d 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 65 6c 73  M_BKPT;.    }els
35f20 65 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 42 3a 20  e{.      /* NB: 
35f30 7a 46 69 6c 65 6e 61 6d 65 20 65 78 69 73 74 73  zFilename exists
35f40 20 61 6e 64 20 72 65 6d 61 69 6e 73 20 76 61 6c   and remains val
35f50 69 64 20 75 6e 74 69 6c 20 74 68 65 20 66 69 6c  id until the fil
35f60 65 20 69 73 20 63 6c 6f 73 65 64 0a 20 20 20 20  e is closed.    
35f70 20 20 2a 2a 20 61 63 63 6f 72 64 69 6e 67 20 74    ** according t
35f80 6f 20 72 65 71 75 69 72 65 6d 65 6e 74 20 46 31  o requirement F1
35f90 31 31 34 31 2e 20 20 53 6f 20 77 65 20 64 6f 20  1141.  So we do 
35fa0 6e 6f 74 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65  not need to make
35fb0 20 61 0a 20 20 20 20 20 20 2a 2a 20 63 6f 70 79   a.      ** copy
35fc0 20 6f 66 20 74 68 65 20 66 69 6c 65 6e 61 6d 65   of the filename
35fd0 2e 20 2a 2f 0a 20 20 20 20 20 20 70 43 74 78 2d  . */.      pCtx-
35fe0 3e 64 62 50 61 74 68 20 3d 20 7a 46 69 6c 65 6e  >dbPath = zFilen
35ff0 61 6d 65 3b 0a 20 20 20 20 20 20 70 43 74 78 2d  ame;.      pCtx-
36000 3e 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20  >reserved = 0;. 
36010 20 20 20 20 20 73 72 61 6e 64 6f 6d 64 65 76 28       srandomdev(
36020 29 3b 0a 20 20 20 20 20 20 75 6e 69 78 45 6e 74  );.      unixEnt
36030 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 20  erMutex();.     
36040 20 72 63 20 3d 20 66 69 6e 64 49 6e 6f 64 65 49   rc = findInodeI
36050 6e 66 6f 28 70 4e 65 77 2c 20 26 70 4e 65 77 2d  nfo(pNew, &pNew-
36060 3e 70 49 6e 6f 64 65 29 3b 0a 20 20 20 20 20 20  >pInode);.      
36070 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
36080 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  K ){.        sql
36090 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77 2d 3e  ite3_free(pNew->
360a0 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3b  lockingContext);
360b0 0a 20 20 20 20 20 20 20 20 72 6f 62 75 73 74 5f  .        robust_
360c0 63 6c 6f 73 65 28 70 4e 65 77 2c 20 68 2c 20 5f  close(pNew, h, _
360d0 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20  _LINE__);.      
360e0 20 20 68 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20    h = -1;.      
360f0 7d 0a 20 20 20 20 20 20 75 6e 69 78 4c 65 61 76  }.      unixLeav
36100 65 4d 75 74 65 78 28 29 3b 20 20 20 20 20 20 20  eMutex();       
36110 20 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64   .    }.  }.#end
36120 69 66 0a 0a 20 20 65 6c 73 65 20 69 66 28 20 70  if..  else if( p
36130 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20  LockingStyle == 
36140 26 64 6f 74 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64  &dotlockIoMethod
36150 73 20 29 7b 0a 20 20 20 20 2f 2a 20 44 6f 74 66  s ){.    /* Dotf
36160 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 75 73 65 73  ile locking uses
36170 20 74 68 65 20 66 69 6c 65 20 70 61 74 68 20 73   the file path s
36180 6f 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65  o it needs to be
36190 20 69 6e 63 6c 75 64 65 64 20 69 6e 0a 20 20 20   included in.   
361a0 20 2a 2a 20 74 68 65 20 64 6f 74 6c 6f 63 6b 4c   ** the dotlockL
361b0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 0a 20  ockingContext . 
361c0 20 20 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a     */.    char *
361d0 7a 4c 6f 63 6b 46 69 6c 65 3b 0a 20 20 20 20 69  zLockFile;.    i
361e0 6e 74 20 6e 46 69 6c 65 6e 61 6d 65 3b 0a 20 20  nt nFilename;.  
361f0 20 20 61 73 73 65 72 74 28 20 7a 46 69 6c 65 6e    assert( zFilen
36200 61 6d 65 21 3d 30 20 29 3b 0a 20 20 20 20 6e 46  ame!=0 );.    nF
36210 69 6c 65 6e 61 6d 65 20 3d 20 28 69 6e 74 29 73  ilename = (int)s
36220 74 72 6c 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 29  trlen(zFilename)
36230 20 2b 20 36 3b 0a 20 20 20 20 7a 4c 6f 63 6b 46   + 6;.    zLockF
36240 69 6c 65 20 3d 20 28 63 68 61 72 20 2a 29 73 71  ile = (char *)sq
36250 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 6e  lite3_malloc64(n
36260 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 69  Filename);.    i
36270 66 28 20 7a 4c 6f 63 6b 46 69 6c 65 3d 3d 30 20  f( zLockFile==0 
36280 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
36290 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b 50 54 3b  LITE_NOMEM_BKPT;
362a0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
362b0 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
362c0 74 66 28 6e 46 69 6c 65 6e 61 6d 65 2c 20 7a 4c  tf(nFilename, zL
362d0 6f 63 6b 46 69 6c 65 2c 20 22 25 73 22 20 44 4f  ockFile, "%s" DO
362e0 54 4c 4f 43 4b 5f 53 55 46 46 49 58 2c 20 7a 46  TLOCK_SUFFIX, zF
362f0 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a  ilename);.    }.
36300 20 20 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e      pNew->lockin
36310 67 43 6f 6e 74 65 78 74 20 3d 20 7a 4c 6f 63 6b  gContext = zLock
36320 46 69 6c 65 3b 0a 20 20 7d 0a 0a 23 69 66 20 4f  File;.  }..#if O
36330 53 5f 56 58 57 4f 52 4b 53 0a 20 20 65 6c 73 65  S_VXWORKS.  else
36340 20 69 66 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79   if( pLockingSty
36350 6c 65 20 3d 3d 20 26 73 65 6d 49 6f 4d 65 74 68  le == &semIoMeth
36360 6f 64 73 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 61  ods ){.    /* Na
36370 6d 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f  med semaphore lo
36380 63 6b 69 6e 67 20 75 73 65 73 20 74 68 65 20 66  cking uses the f
36390 69 6c 65 20 70 61 74 68 20 73 6f 20 69 74 20 6e  ile path so it n
363a0 65 65 64 73 20 74 6f 20 62 65 0a 20 20 20 20 2a  eeds to be.    *
363b0 2a 20 69 6e 63 6c 75 64 65 64 20 69 6e 20 74 68  * included in th
363c0 65 20 73 65 6d 4c 6f 63 6b 69 6e 67 43 6f 6e 74  e semLockingCont
363d0 65 78 74 0a 20 20 20 20 2a 2f 0a 20 20 20 20 75  ext.    */.    u
363e0 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
363f0 0a 20 20 20 20 72 63 20 3d 20 66 69 6e 64 49 6e  .    rc = findIn
36400 6f 64 65 49 6e 66 6f 28 70 4e 65 77 2c 20 26 70  odeInfo(pNew, &p
36410 4e 65 77 2d 3e 70 49 6e 6f 64 65 29 3b 0a 20 20  New->pInode);.  
36420 20 20 69 66 28 20 28 72 63 3d 3d 53 51 4c 49 54    if( (rc==SQLIT
36430 45 5f 4f 4b 29 20 26 26 20 28 70 4e 65 77 2d 3e  E_OK) && (pNew->
36440 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 3d 3d 4e 55  pInode->pSem==NU
36450 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20 63 68 61  LL) ){.      cha
36460 72 20 2a 7a 53 65 6d 4e 61 6d 65 20 3d 20 70 4e  r *zSemName = pN
36470 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 61 53 65 6d  ew->pInode->aSem
36480 4e 61 6d 65 3b 0a 20 20 20 20 20 20 69 6e 74 20  Name;.      int 
36490 6e 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  n;.      sqlite3
364a0 5f 73 6e 70 72 69 6e 74 66 28 4d 41 58 5f 50 41  _snprintf(MAX_PA
364b0 54 48 4e 41 4d 45 2c 20 7a 53 65 6d 4e 61 6d 65  THNAME, zSemName
364c0 2c 20 22 2f 25 73 2e 73 65 6d 22 2c 0a 20 20 20  , "/%s.sem",.   
364d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
364e0 20 20 20 20 70 4e 65 77 2d 3e 70 49 64 2d 3e 7a      pNew->pId->z
364f0 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 29 3b 0a  CanonicalName);.
36500 20 20 20 20 20 20 66 6f 72 28 20 6e 3d 31 3b 20        for( n=1; 
36510 7a 53 65 6d 4e 61 6d 65 5b 6e 5d 3b 20 6e 2b 2b  zSemName[n]; n++
36520 20 29 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a   ).        if( z
36530 53 65 6d 4e 61 6d 65 5b 6e 5d 3d 3d 27 2f 27 20  SemName[n]=='/' 
36540 29 20 7a 53 65 6d 4e 61 6d 65 5b 6e 5d 20 3d 20  ) zSemName[n] = 
36550 27 5f 27 3b 0a 20 20 20 20 20 20 70 4e 65 77 2d  '_';.      pNew-
36560 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 20 3d 20  >pInode->pSem = 
36570 73 65 6d 5f 6f 70 65 6e 28 7a 53 65 6d 4e 61 6d  sem_open(zSemNam
36580 65 2c 20 4f 5f 43 52 45 41 54 2c 20 30 36 36 36  e, O_CREAT, 0666
36590 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 1);.      if( 
365a0 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53  pNew->pInode->pS
365b0 65 6d 20 3d 3d 20 53 45 4d 5f 46 41 49 4c 45 44  em == SEM_FAILED
365c0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
365d0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 5f 42 4b   SQLITE_NOMEM_BK
365e0 50 54 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  PT;.        pNew
365f0 2d 3e 70 49 6e 6f 64 65 2d 3e 61 53 65 6d 4e 61  ->pInode->aSemNa
36600 6d 65 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 20 20  me[0] = '\0';.  
36610 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
36620 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
36630 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a  ;.  }.#endif.  .
36640 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f    storeLastErrno
36650 28 70 4e 65 77 2c 20 30 29 3b 0a 23 69 66 20 4f  (pNew, 0);.#if O
36660 53 5f 56 58 57 4f 52 4b 53 0a 20 20 69 66 28 20  S_VXWORKS.  if( 
36670 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
36680 0a 20 20 20 20 69 66 28 20 68 3e 3d 30 20 29 20  .    if( h>=0 ) 
36690 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 4e 65  robust_close(pNe
366a0 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b  w, h, __LINE__);
366b0 0a 20 20 20 20 68 20 3d 20 2d 31 3b 0a 20 20 20  .    h = -1;.   
366c0 20 6f 73 55 6e 6c 69 6e 6b 28 7a 46 69 6c 65 6e   osUnlink(zFilen
366d0 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  ame);.    pNew->
366e0 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49  ctrlFlags |= UNI
366f0 58 46 49 4c 45 5f 44 45 4c 45 54 45 3b 0a 20 20  XFILE_DELETE;.  
36700 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 72  }.#endif.  if( r
36710 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
36720 20 20 20 20 69 66 28 20 68 3e 3d 30 20 29 20 72      if( h>=0 ) r
36730 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 4e 65 77  obust_close(pNew
36740 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a  , h, __LINE__);.
36750 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4e 65    }else{.    pNe
36760 77 2d 3e 70 4d 65 74 68 6f 64 20 3d 20 70 4c 6f  w->pMethod = pLo
36770 63 6b 69 6e 67 53 74 79 6c 65 3b 0a 20 20 20 20  ckingStyle;.    
36780 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2b 31 29 3b  OpenCounter(+1);
36790 0a 20 20 20 20 76 65 72 69 66 79 44 62 46 69 6c  .    verifyDbFil
367a0 65 28 70 4e 65 77 29 3b 0a 20 20 7d 0a 20 20 72  e(pNew);.  }.  r
367b0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
367c0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 61  ** Return the na
367d0 6d 65 20 6f 66 20 61 20 64 69 72 65 63 74 6f 72  me of a director
367e0 79 20 69 6e 20 77 68 69 63 68 20 74 6f 20 70 75  y in which to pu
367f0 74 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  t temporary file
36800 73 2e 0a 2a 2a 20 49 66 20 6e 6f 20 73 75 69 74  s..** If no suit
36810 61 62 6c 65 20 74 65 6d 70 6f 72 61 72 79 20 66  able temporary f
36820 69 6c 65 20 64 69 72 65 63 74 6f 72 79 20 63 61  ile directory ca
36830 6e 20 62 65 20 66 6f 75 6e 64 2c 20 72 65 74 75  n be found, retu
36840 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74  rn NULL..*/.stat
36850 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 75  ic const char *u
36860 6e 69 78 54 65 6d 70 46 69 6c 65 44 69 72 28 76  nixTempFileDir(v
36870 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20 63  oid){.  static c
36880 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 44 69 72  onst char *azDir
36890 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 30 2c 0a  s[] = {.     0,.
368a0 20 20 20 20 20 30 2c 0a 20 20 20 20 20 22 2f 76       0,.     "/v
368b0 61 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20 22 2f  ar/tmp",.     "/
368c0 75 73 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20 22  usr/tmp",.     "
368d0 2f 74 6d 70 22 2c 0a 20 20 20 20 20 22 2e 22 0a  /tmp",.     ".".
368e0 20 20 7d 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20    };.  unsigned 
368f0 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 73 74 72  int i = 0;.  str
36900 75 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20  uct stat buf;.  
36910 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 69 72  const char *zDir
36920 20 3d 20 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f   = sqlite3_temp_
36930 64 69 72 65 63 74 6f 72 79 3b 0a 0a 20 20 69 66  directory;..  if
36940 28 20 21 61 7a 44 69 72 73 5b 30 5d 20 29 20 61  ( !azDirs[0] ) a
36950 7a 44 69 72 73 5b 30 5d 20 3d 20 67 65 74 65 6e  zDirs[0] = geten
36960 76 28 22 53 51 4c 49 54 45 5f 54 4d 50 44 49 52  v("SQLITE_TMPDIR
36970 22 29 3b 0a 20 20 69 66 28 20 21 61 7a 44 69 72  ");.  if( !azDir
36980 73 5b 31 5d 20 29 20 61 7a 44 69 72 73 5b 31 5d  s[1] ) azDirs[1]
36990 20 3d 20 67 65 74 65 6e 76 28 22 54 4d 50 44 49   = getenv("TMPDI
369a0 52 22 29 3b 0a 20 20 77 68 69 6c 65 28 31 29 7b  R");.  while(1){
369b0 0a 20 20 20 20 69 66 28 20 7a 44 69 72 21 3d 30  .    if( zDir!=0
369c0 0a 20 20 20 20 20 26 26 20 6f 73 53 74 61 74 28  .     && osStat(
369d0 7a 44 69 72 2c 20 26 62 75 66 29 3d 3d 30 0a 20  zDir, &buf)==0. 
369e0 20 20 20 20 26 26 20 53 5f 49 53 44 49 52 28 62      && S_ISDIR(b
369f0 75 66 2e 73 74 5f 6d 6f 64 65 29 0a 20 20 20 20  uf.st_mode).    
36a00 20 26 26 20 6f 73 41 63 63 65 73 73 28 7a 44 69   && osAccess(zDi
36a10 72 2c 20 30 33 29 3d 3d 30 0a 20 20 20 20 29 7b  r, 03)==0.    ){
36a20 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 7a 44  .      return zD
36a30 69 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ir;.    }.    if
36a40 28 20 69 3e 3d 73 69 7a 65 6f 66 28 61 7a 44 69  ( i>=sizeof(azDi
36a50 72 73 29 2f 73 69 7a 65 6f 66 28 61 7a 44 69 72  rs)/sizeof(azDir
36a60 73 5b 30 5d 29 20 29 20 62 72 65 61 6b 3b 0a 20  s[0]) ) break;. 
36a70 20 20 20 7a 44 69 72 20 3d 20 61 7a 44 69 72 73     zDir = azDirs
36a80 5b 69 2b 2b 5d 3b 0a 20 20 7d 0a 20 20 72 65 74  [i++];.  }.  ret
36a90 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
36aa0 43 72 65 61 74 65 20 61 20 74 65 6d 70 6f 72 61  Create a tempora
36ab0 72 79 20 66 69 6c 65 20 6e 61 6d 65 20 69 6e 20  ry file name in 
36ac0 7a 42 75 66 2e 20 20 7a 42 75 66 20 6d 75 73 74  zBuf.  zBuf must
36ad0 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a   be allocated.**
36ae0 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e 67 20   by the calling 
36af0 70 72 6f 63 65 73 73 20 61 6e 64 20 6d 75 73 74  process and must
36b00 20 62 65 20 62 69 67 20 65 6e 6f 75 67 68 20 74   be big enough t
36b10 6f 20 68 6f 6c 64 20 61 74 20 6c 65 61 73 74 0a  o hold at least.
36b20 2a 2a 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  ** pVfs->mxPathn
36b30 61 6d 65 20 62 79 74 65 73 2e 0a 2a 2f 0a 73 74  ame bytes..*/.st
36b40 61 74 69 63 20 69 6e 74 20 75 6e 69 78 47 65 74  atic int unixGet
36b50 54 65 6d 70 6e 61 6d 65 28 69 6e 74 20 6e 42 75  Tempname(int nBu
36b60 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a  f, char *zBuf){.
36b70 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
36b80 69 72 3b 0a 20 20 69 6e 74 20 69 4c 69 6d 69 74  ir;.  int iLimit
36b90 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 74 27 73   = 0;..  /* It's
36ba0 20 6f 64 64 20 74 6f 20 73 69 6d 75 6c 61 74 65   odd to simulate
36bb0 20 61 6e 20 69 6f 2d 65 72 72 6f 72 20 68 65 72   an io-error her
36bc0 65 2c 20 62 75 74 20 72 65 61 6c 6c 79 20 74 68  e, but really th
36bd0 69 73 20 69 73 20 6a 75 73 74 0a 20 20 2a 2a 20  is is just.  ** 
36be0 75 73 69 6e 67 20 74 68 65 20 69 6f 2d 65 72 72  using the io-err
36bf0 6f 72 20 69 6e 66 72 61 73 74 72 75 63 74 75 72  or infrastructur
36c00 65 20 74 6f 20 74 65 73 74 20 74 68 61 74 20 53  e to test that S
36c10 51 4c 69 74 65 20 68 61 6e 64 6c 65 73 20 74 68  QLite handles th
36c20 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e  is.  ** function
36c30 20 66 61 69 6c 69 6e 67 2e 20 0a 20 20 2a 2f 0a   failing. .  */.
36c40 20 20 7a 42 75 66 5b 30 5d 20 3d 20 30 3b 0a 20    zBuf[0] = 0;. 
36c50 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
36c60 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ( return SQLITE_
36c70 49 4f 45 52 52 20 29 3b 0a 0a 20 20 7a 44 69 72  IOERR );..  zDir
36c80 20 3d 20 75 6e 69 78 54 65 6d 70 46 69 6c 65 44   = unixTempFileD
36c90 69 72 28 29 3b 0a 20 20 69 66 28 20 7a 44 69 72  ir();.  if( zDir
36ca0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
36cb0 49 54 45 5f 49 4f 45 52 52 5f 47 45 54 54 45 4d  ITE_IOERR_GETTEM
36cc0 50 50 41 54 48 3b 0a 20 20 64 6f 7b 0a 20 20 20  PPATH;.  do{.   
36cd0 20 75 36 34 20 72 3b 0a 20 20 20 20 73 71 6c 69   u64 r;.    sqli
36ce0 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73  te3_randomness(s
36cf0 69 7a 65 6f 66 28 72 29 2c 20 26 72 29 3b 0a 20  izeof(r), &r);. 
36d00 20 20 20 61 73 73 65 72 74 28 20 6e 42 75 66 3e     assert( nBuf>
36d10 32 20 29 3b 0a 20 20 20 20 7a 42 75 66 5b 6e 42  2 );.    zBuf[nB
36d20 75 66 2d 32 5d 20 3d 20 30 3b 0a 20 20 20 20 73  uf-2] = 0;.    s
36d30 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
36d40 6e 42 75 66 2c 20 7a 42 75 66 2c 20 22 25 73 2f  nBuf, zBuf, "%s/
36d50 22 53 51 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c  "SQLITE_TEMP_FIL
36d60 45 5f 50 52 45 46 49 58 22 25 6c 6c 78 25 63 22  E_PREFIX"%llx%c"
36d70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
36d80 20 20 20 20 20 20 20 7a 44 69 72 2c 20 72 2c 20         zDir, r, 
36d90 30 29 3b 0a 20 20 20 20 69 66 28 20 7a 42 75 66  0);.    if( zBuf
36da0 5b 6e 42 75 66 2d 32 5d 21 3d 30 20 7c 7c 20 28  [nBuf-2]!=0 || (
36db0 69 4c 69 6d 69 74 2b 2b 29 3e 31 30 20 29 20 72  iLimit++)>10 ) r
36dc0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
36dd0 4f 52 3b 0a 20 20 7d 77 68 69 6c 65 28 20 6f 73  OR;.  }while( os
36de0 41 63 63 65 73 73 28 7a 42 75 66 2c 30 29 3d 3d  Access(zBuf,0)==
36df0 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  0 );.  return SQ
36e00 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20  LITE_OK;.}..#if 
36e10 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
36e20 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64  CKING_STYLE && d
36e30 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
36e40 29 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65 20  )./*.** Routine 
36e50 74 6f 20 74 72 61 6e 73 66 6f 72 6d 20 61 20 75  to transform a u
36e60 6e 69 78 46 69 6c 65 20 69 6e 74 6f 20 61 20 70  nixFile into a p
36e70 72 6f 78 79 2d 6c 6f 63 6b 69 6e 67 20 75 6e 69  roxy-locking uni
36e80 78 46 69 6c 65 2e 0a 2a 2a 20 49 6d 70 6c 65 6d  xFile..** Implem
36e90 65 6e 74 61 74 69 6f 6e 20 69 6e 20 74 68 65 20  entation in the 
36ea0 70 72 6f 78 79 2d 6c 6f 63 6b 20 64 69 76 69 73  proxy-lock divis
36eb0 69 6f 6e 2c 20 62 75 74 20 75 73 65 64 20 62 79  ion, but used by
36ec0 20 75 6e 69 78 4f 70 65 6e 28 29 0a 2a 2a 20 69   unixOpen().** i
36ed0 66 20 53 51 4c 49 54 45 5f 50 52 45 46 45 52 5f  f SQLITE_PREFER_
36ee0 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 20 69 73  PROXY_LOCKING is
36ef0 20 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61   defined..*/.sta
36f00 74 69 63 20 69 6e 74 20 70 72 6f 78 79 54 72 61  tic int proxyTra
36f10 6e 73 66 6f 72 6d 55 6e 69 78 46 69 6c 65 28 75  nsformUnixFile(u
36f20 6e 69 78 46 69 6c 65 2a 2c 20 63 6f 6e 73 74 20  nixFile*, const 
36f30 63 68 61 72 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a  char*);.#endif..
36f40 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20 66 6f 72  /*.** Search for
36f50 20 61 6e 20 75 6e 75 73 65 64 20 66 69 6c 65 20   an unused file 
36f60 64 65 73 63 72 69 70 74 6f 72 20 74 68 61 74 20  descriptor that 
36f70 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 74 68  was opened on th
36f80 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 66  e database .** f
36f90 69 6c 65 20 28 6e 6f 74 20 61 20 6a 6f 75 72 6e  ile (not a journ
36fa0 61 6c 20 6f 72 20 6d 61 73 74 65 72 2d 6a 6f 75  al or master-jou
36fb0 72 6e 61 6c 20 66 69 6c 65 29 20 69 64 65 6e 74  rnal file) ident
36fc0 69 66 69 65 64 20 62 79 20 70 61 74 68 6e 61 6d  ified by pathnam
36fd0 65 0a 2a 2a 20 7a 50 61 74 68 20 77 69 74 68 20  e.** zPath with 
36fe0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 58 58 58 20  SQLITE_OPEN_XXX 
36ff0 66 6c 61 67 73 20 6d 61 74 63 68 69 6e 67 20 74  flags matching t
37000 68 6f 73 65 20 70 61 73 73 65 64 20 61 73 20 74  hose passed as t
37010 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 61 72 67  he second.** arg
37020 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75  ument to this fu
37030 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 53 75  nction..**.** Su
37040 63 68 20 61 20 66 69 6c 65 20 64 65 73 63 72 69  ch a file descri
37050 70 74 6f 72 20 6d 61 79 20 65 78 69 73 74 20 69  ptor may exist i
37060 66 20 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e  f a database con
37070 6e 65 63 74 69 6f 6e 20 77 61 73 20 63 6c 6f 73  nection was clos
37080 65 64 0a 2a 2a 20 62 75 74 20 74 68 65 20 61 73  ed.** but the as
37090 73 6f 63 69 61 74 65 64 20 66 69 6c 65 20 64 65  sociated file de
370a0 73 63 72 69 70 74 6f 72 20 63 6f 75 6c 64 20 6e  scriptor could n
370b0 6f 74 20 62 65 20 63 6c 6f 73 65 64 20 62 65 63  ot be closed bec
370c0 61 75 73 65 20 73 6f 6d 65 0a 2a 2a 20 6f 74 68  ause some.** oth
370d0 65 72 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  er file descript
370e0 6f 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73  or open on the s
370f0 61 6d 65 20 66 69 6c 65 20 69 73 20 68 6f 6c 64  ame file is hold
37100 69 6e 67 20 61 20 66 69 6c 65 2d 6c 6f 63 6b 2e  ing a file-lock.
37110 0a 2a 2a 20 52 65 66 65 72 20 74 6f 20 63 6f 6d  .** Refer to com
37120 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 75 6e 69  ments in the uni
37130 78 43 6c 6f 73 65 28 29 20 66 75 6e 63 74 69 6f  xClose() functio
37140 6e 20 61 6e 64 20 74 68 65 20 6c 65 6e 67 74 68  n and the length
37150 79 20 63 6f 6d 6d 65 6e 74 0a 2a 2a 20 64 65 73  y comment.** des
37160 63 72 69 62 69 6e 67 20 22 50 6f 73 69 78 20 41  cribing "Posix A
37170 64 76 69 73 6f 72 79 20 4c 6f 63 6b 69 6e 67 22  dvisory Locking"
37180 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
37190 20 74 68 69 73 20 66 69 6c 65 20 66 6f 72 20 0a   this file for .
371a0 2a 2a 20 66 75 72 74 68 65 72 20 64 65 74 61 69  ** further detai
371b0 6c 73 2e 20 41 6c 73 6f 2c 20 74 69 63 6b 65 74  ls. Also, ticket
371c0 20 23 34 30 31 38 2e 0a 2a 2a 0a 2a 2a 20 49 66   #4018..**.** If
371d0 20 61 20 73 75 69 74 61 62 6c 65 20 66 69 6c 65   a suitable file
371e0 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 66   descriptor is f
371f0 6f 75 6e 64 2c 20 74 68 65 6e 20 69 74 20 69 73  ound, then it is
37200 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 6e 6f   returned. If no
37210 0a 2a 2a 20 73 75 63 68 20 66 69 6c 65 20 64 65  .** such file de
37220 73 63 72 69 70 74 6f 72 20 69 73 20 6c 6f 63 61  scriptor is loca
37230 74 65 64 2c 20 2d 31 20 69 73 20 72 65 74 75 72  ted, -1 is retur
37240 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 55  ned..*/.static U
37250 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 66 69 6e  nixUnusedFd *fin
37260 64 52 65 75 73 61 62 6c 65 46 64 28 63 6f 6e 73  dReusableFd(cons
37270 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 69  t char *zPath, i
37280 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 55 6e 69  nt flags){.  Uni
37290 78 55 6e 75 73 65 64 46 64 20 2a 70 55 6e 75 73  xUnusedFd *pUnus
372a0 65 64 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 44 6f  ed = 0;..  /* Do
372b0 20 6e 6f 74 20 73 65 61 72 63 68 20 66 6f 72 20   not search for 
372c0 61 6e 20 75 6e 75 73 65 64 20 66 69 6c 65 20 64  an unused file d
372d0 65 73 63 72 69 70 74 6f 72 20 6f 6e 20 76 78 77  escriptor on vxw
372e0 6f 72 6b 73 2e 20 4e 6f 74 20 62 65 63 61 75 73  orks. Not becaus
372f0 65 0a 20 20 2a 2a 20 76 78 77 6f 72 6b 73 20 77  e.  ** vxworks w
37300 6f 75 6c 64 20 6e 6f 74 20 62 65 6e 65 66 69 74  ould not benefit
37310 20 66 72 6f 6d 20 74 68 65 20 63 68 61 6e 67 65   from the change
37320 20 28 69 74 20 6d 69 67 68 74 2c 20 77 65 27 72   (it might, we'r
37330 65 20 6e 6f 74 20 73 75 72 65 29 2c 0a 20 20 2a  e not sure),.  *
37340 2a 20 62 75 74 20 62 65 63 61 75 73 65 20 6e 6f  * but because no
37350 20 77 61 79 20 74 6f 20 74 65 73 74 20 69 74 20   way to test it 
37360 69 73 20 63 75 72 72 65 6e 74 6c 79 20 61 76 61  is currently ava
37370 69 6c 61 62 6c 65 2e 20 49 74 20 69 73 20 62 65  ilable. It is be
37380 74 74 65 72 20 0a 20 20 2a 2a 20 6e 6f 74 20 74  tter .  ** not t
37390 6f 20 72 69 73 6b 20 62 72 65 61 6b 69 6e 67 20  o risk breaking 
373a0 76 78 77 6f 72 6b 73 20 73 75 70 70 6f 72 74 20  vxworks support 
373b0 66 6f 72 20 74 68 65 20 73 61 6b 65 20 6f 66 20  for the sake of 
373c0 73 75 63 68 20 61 6e 20 6f 62 73 63 75 72 65 20  such an obscure 
373d0 0a 20 20 2a 2a 20 66 65 61 74 75 72 65 2e 20 20  .  ** feature.  
373e0 2a 2f 0a 23 69 66 20 21 4f 53 5f 56 58 57 4f 52  */.#if !OS_VXWOR
373f0 4b 53 0a 20 20 73 74 72 75 63 74 20 73 74 61 74  KS.  struct stat
37400 20 73 53 74 61 74 3b 20 20 20 20 20 20 20 20 20   sStat;         
37410 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
37420 75 6c 74 73 20 6f 66 20 73 74 61 74 28 29 20 63  ults of stat() c
37430 61 6c 6c 20 2a 2f 0a 0a 20 20 75 6e 69 78 45 6e  all */..  unixEn
37440 74 65 72 4d 75 74 65 78 28 29 3b 0a 0a 20 20 2f  terMutex();..  /
37450 2a 20 41 20 73 74 61 74 28 29 20 63 61 6c 6c 20  * A stat() call 
37460 6d 61 79 20 66 61 69 6c 20 66 6f 72 20 76 61 72  may fail for var
37470 69 6f 75 73 20 72 65 61 73 6f 6e 73 2e 20 49 66  ious reasons. If
37480 20 74 68 69 73 20 68 61 70 70 65 6e 73 2c 20 69   this happens, i
37490 74 20 69 73 0a 20 20 2a 2a 20 61 6c 6d 6f 73 74  t is.  ** almost
374a0 20 63 65 72 74 61 69 6e 20 74 68 61 74 20 61 6e   certain that an
374b0 20 6f 70 65 6e 28 29 20 63 61 6c 6c 20 6f 6e 20   open() call on 
374c0 74 68 65 20 73 61 6d 65 20 70 61 74 68 20 77 69  the same path wi
374d0 6c 6c 20 61 6c 73 6f 20 66 61 69 6c 2e 0a 20 20  ll also fail..  
374e0 2a 2a 20 46 6f 72 20 74 68 69 73 20 72 65 61 73  ** For this reas
374f0 6f 6e 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20  on, if an error 
37500 6f 63 63 75 72 73 20 69 6e 20 74 68 65 20 73 74  occurs in the st
37510 61 74 28 29 20 63 61 6c 6c 20 68 65 72 65 2c 20  at() call here, 
37520 69 74 20 69 73 0a 20 20 2a 2a 20 69 67 6e 6f 72  it is.  ** ignor
37530 65 64 20 61 6e 64 20 2d 31 20 69 73 20 72 65 74  ed and -1 is ret
37540 75 72 6e 65 64 2e 20 54 68 65 20 63 61 6c 6c 65  urned. The calle
37550 72 20 77 69 6c 6c 20 74 72 79 20 74 6f 20 6f 70  r will try to op
37560 65 6e 20 61 20 6e 65 77 20 66 69 6c 65 0a 20 20  en a new file.  
37570 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20 6f 6e  ** descriptor on
37580 20 74 68 65 20 73 61 6d 65 20 70 61 74 68 2c 20   the same path, 
37590 66 61 69 6c 2c 20 61 6e 64 20 72 65 74 75 72 6e  fail, and return
375a0 20 61 6e 20 65 72 72 6f 72 20 74 6f 20 53 51 4c   an error to SQL
375b0 69 74 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45  ite..  **.  ** E
375c0 76 65 6e 20 69 66 20 61 20 73 75 62 73 65 71 75  ven if a subsequ
375d0 65 6e 74 20 6f 70 65 6e 28 29 20 63 61 6c 6c 20  ent open() call 
375e0 64 6f 65 73 20 73 75 63 63 65 65 64 2c 20 74 68  does succeed, th
375f0 65 20 63 6f 6e 73 65 71 75 65 6e 63 65 73 20 6f  e consequences o
37600 66 0a 20 20 2a 2a 20 6e 6f 74 20 73 65 61 72 63  f.  ** not searc
37610 68 69 6e 67 20 66 6f 72 20 61 20 72 65 75 73 61  hing for a reusa
37620 62 6c 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  ble file descrip
37630 74 6f 72 20 61 72 65 20 6e 6f 74 20 64 69 72 65  tor are not dire
37640 2e 20 20 2a 2f 0a 20 20 69 66 28 20 6e 55 6e 75  .  */.  if( nUnu
37650 73 65 64 46 64 3e 30 20 26 26 20 30 3d 3d 6f 73  sedFd>0 && 0==os
37660 53 74 61 74 28 7a 50 61 74 68 2c 20 26 73 53 74  Stat(zPath, &sSt
37670 61 74 29 20 29 7b 0a 20 20 20 20 75 6e 69 78 49  at) ){.    unixI
37680 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65  nodeInfo *pInode
37690 3b 0a 0a 20 20 20 20 70 49 6e 6f 64 65 20 3d 20  ;..    pInode = 
376a0 69 6e 6f 64 65 4c 69 73 74 3b 0a 20 20 20 20 77  inodeList;.    w
376b0 68 69 6c 65 28 20 70 49 6e 6f 64 65 20 26 26 20  hile( pInode && 
376c0 28 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2e  (pInode->fileId.
376d0 64 65 76 21 3d 73 53 74 61 74 2e 73 74 5f 64 65  dev!=sStat.st_de
376e0 76 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v.              
376f0 20 20 20 20 20 20 20 7c 7c 20 70 49 6e 6f 64 65         || pInode
37700 2d 3e 66 69 6c 65 49 64 2e 69 6e 6f 21 3d 28 75  ->fileId.ino!=(u
37710 36 34 29 73 53 74 61 74 2e 73 74 5f 69 6e 6f 29  64)sStat.st_ino)
37720 20 29 7b 0a 20 20 20 20 20 20 20 70 49 6e 6f 64   ){.       pInod
37730 65 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78  e = pInode->pNex
37740 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  t;.    }.    if(
37750 20 70 49 6e 6f 64 65 20 29 7b 0a 20 20 20 20 20   pInode ){.     
37760 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 2a   UnixUnusedFd **
37770 70 70 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 70  pp;.      for(pp
37780 3d 26 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65  =&pInode->pUnuse
37790 64 3b 20 2a 70 70 20 26 26 20 28 2a 70 70 29 2d  d; *pp && (*pp)-
377a0 3e 66 6c 61 67 73 21 3d 66 6c 61 67 73 3b 20 70  >flags!=flags; p
377b0 70 3d 26 28 28 2a 70 70 29 2d 3e 70 4e 65 78 74  p=&((*pp)->pNext
377c0 29 29 3b 0a 20 20 20 20 20 20 70 55 6e 75 73 65  ));.      pUnuse
377d0 64 20 3d 20 2a 70 70 3b 0a 20 20 20 20 20 20 69  d = *pp;.      i
377e0 66 28 20 70 55 6e 75 73 65 64 20 29 7b 0a 20 20  f( pUnused ){.  
377f0 20 20 20 20 20 20 6e 55 6e 75 73 65 64 46 64 2d        nUnusedFd-
37800 2d 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 20 3d  -;.        *pp =
37810 20 70 55 6e 75 73 65 64 2d 3e 70 4e 65 78 74 3b   pUnused->pNext;
37820 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
37830 20 7d 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75   }.  unixLeaveMu
37840 74 65 78 28 29 3b 0a 23 65 6e 64 69 66 20 20 20  tex();.#endif   
37850 20 2f 2a 20 69 66 20 21 4f 53 5f 56 58 57 4f 52   /* if !OS_VXWOR
37860 4b 53 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 70  KS */.  return p
37870 55 6e 75 73 65 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Unused;.}../*.**
37880 20 46 69 6e 64 20 74 68 65 20 6d 6f 64 65 2c 20   Find the mode, 
37890 75 69 64 20 61 6e 64 20 67 69 64 20 6f 66 20 66  uid and gid of f
378a0 69 6c 65 20 7a 46 69 6c 65 2e 20 0a 2a 2f 0a 73  ile zFile. .*/.s
378b0 74 61 74 69 63 20 69 6e 74 20 67 65 74 46 69 6c  tatic int getFil
378c0 65 4d 6f 64 65 28 0a 20 20 63 6f 6e 73 74 20 63  eMode(.  const c
378d0 68 61 72 20 2a 7a 46 69 6c 65 2c 20 20 20 20 20  har *zFile,     
378e0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
378f0 20 6e 61 6d 65 20 2a 2f 0a 20 20 6d 6f 64 65 5f   name */.  mode_
37900 74 20 2a 70 4d 6f 64 65 2c 20 20 20 20 20 20 20  t *pMode,       
37910 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
37920 54 3a 20 50 65 72 6d 69 73 73 69 6f 6e 73 20 6f  T: Permissions o
37930 66 20 7a 46 69 6c 65 20 2a 2f 0a 20 20 75 69 64  f zFile */.  uid
37940 5f 74 20 2a 70 55 69 64 2c 20 20 20 20 20 20 20  _t *pUid,       
37950 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
37960 4f 55 54 3a 20 75 69 64 20 6f 66 20 7a 46 69 6c  OUT: uid of zFil
37970 65 2e 20 2a 2f 0a 20 20 67 69 64 5f 74 20 2a 70  e. */.  gid_t *p
37980 47 69 64 20 20 20 20 20 20 20 20 20 20 20 20 20  Gid             
37990 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
379a0 67 69 64 20 6f 66 20 7a 46 69 6c 65 2e 20 2a 2f  gid of zFile. */
379b0 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 73 74 61  .){.  struct sta
379c0 74 20 73 53 74 61 74 3b 20 20 20 20 20 20 20 20  t sStat;        
379d0 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20        /* Output 
379e0 6f 66 20 73 74 61 74 28 29 20 6f 6e 20 64 61 74  of stat() on dat
379f0 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
37a00 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
37a10 4f 4b 3b 0a 20 20 69 66 28 20 30 3d 3d 6f 73 53  OK;.  if( 0==osS
37a20 74 61 74 28 7a 46 69 6c 65 2c 20 26 73 53 74 61  tat(zFile, &sSta
37a30 74 29 20 29 7b 0a 20 20 20 20 2a 70 4d 6f 64 65  t) ){.    *pMode
37a40 20 3d 20 73 53 74 61 74 2e 73 74 5f 6d 6f 64 65   = sStat.st_mode
37a50 20 26 20 30 37 37 37 3b 0a 20 20 20 20 2a 70 55   & 0777;.    *pU
37a60 69 64 20 3d 20 73 53 74 61 74 2e 73 74 5f 75 69  id = sStat.st_ui
37a70 64 3b 0a 20 20 20 20 2a 70 47 69 64 20 3d 20 73  d;.    *pGid = s
37a80 53 74 61 74 2e 73 74 5f 67 69 64 3b 0a 20 20 7d  Stat.st_gid;.  }
37a90 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 53  else{.    rc = S
37aa0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41  QLITE_IOERR_FSTA
37ab0 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  T;.  }.  return 
37ac0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
37ad0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
37ae0 6c 6c 65 64 20 62 79 20 75 6e 69 78 4f 70 65 6e  lled by unixOpen
37af0 28 29 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  () to determine 
37b00 74 68 65 20 75 6e 69 78 20 70 65 72 6d 69 73 73  the unix permiss
37b10 69 6f 6e 73 0a 2a 2a 20 74 6f 20 63 72 65 61 74  ions.** to creat
37b20 65 20 6e 65 77 20 66 69 6c 65 73 20 77 69 74 68  e new files with
37b30 2e 20 49 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63  . If no error oc
37b40 63 75 72 73 2c 20 74 68 65 6e 20 53 51 4c 49 54  curs, then SQLIT
37b50 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
37b60 0a 2a 2a 20 61 6e 64 20 61 20 76 61 6c 75 65 20  .** and a value 
37b70 73 75 69 74 61 62 6c 65 20 66 6f 72 20 70 61 73  suitable for pas
37b80 73 69 6e 67 20 61 73 20 74 68 65 20 74 68 69 72  sing as the thir
37b90 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 6f 70  d argument to op
37ba0 65 6e 28 32 29 20 69 73 0a 2a 2a 20 77 72 69 74  en(2) is.** writ
37bb0 74 65 6e 20 74 6f 20 2a 70 4d 6f 64 65 2e 20 49  ten to *pMode. I
37bc0 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63  f an IO error oc
37bd0 63 75 72 73 2c 20 61 6e 20 53 51 4c 69 74 65 20  curs, an SQLite 
37be0 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 0a 2a  error code is .*
37bf0 2a 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74  * returned and t
37c00 68 65 20 76 61 6c 75 65 20 6f 66 20 2a 70 4d 6f  he value of *pMo
37c10 64 65 20 69 73 20 6e 6f 74 20 6d 6f 64 69 66 69  de is not modifi
37c20 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6d 6f 73  ed..**.** In mos
37c30 74 20 63 61 73 65 73 2c 20 74 68 69 73 20 72 6f  t cases, this ro
37c40 75 74 69 6e 65 20 73 65 74 73 20 2a 70 4d 6f 64  utine sets *pMod
37c50 65 20 74 6f 20 30 2c 20 77 68 69 63 68 20 77 69  e to 0, which wi
37c60 6c 6c 20 62 65 63 6f 6d 65 0a 2a 2a 20 61 6e 20  ll become.** an 
37c70 69 6e 64 69 63 61 74 69 6f 6e 20 74 6f 20 72 6f  indication to ro
37c80 62 75 73 74 5f 6f 70 65 6e 28 29 20 74 6f 20 63  bust_open() to c
37c90 72 65 61 74 65 20 74 68 65 20 66 69 6c 65 20 75  reate the file u
37ca0 73 69 6e 67 0a 2a 2a 20 53 51 4c 49 54 45 5f 44  sing.** SQLITE_D
37cb0 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d  EFAULT_FILE_PERM
37cc0 49 53 53 49 4f 4e 53 20 61 64 6a 75 73 74 65 64  ISSIONS adjusted
37cd0 20 62 79 20 74 68 65 20 75 6d 61 73 6b 2e 0a 2a   by the umask..*
37ce0 2a 20 42 75 74 20 69 66 20 74 68 65 20 66 69 6c  * But if the fil
37cf0 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20 69  e being opened i
37d00 73 20 61 20 57 41 4c 20 6f 72 20 72 65 67 75 6c  s a WAL or regul
37d10 61 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  ar journal file,
37d20 20 74 68 65 6e 20 0a 2a 2a 20 74 68 69 73 20 66   then .** this f
37d30 75 6e 63 74 69 6f 6e 20 71 75 65 72 69 65 73 20  unction queries 
37d40 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  the file-system 
37d50 66 6f 72 20 74 68 65 20 70 65 72 6d 69 73 73 69  for the permissi
37d60 6f 6e 73 20 6f 6e 20 74 68 65 20 0a 2a 2a 20 63  ons on the .** c
37d70 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 64 61 74  orresponding dat
37d80 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 73  abase file and s
37d90 65 74 73 20 2a 70 4d 6f 64 65 20 74 6f 20 74 68  ets *pMode to th
37da0 69 73 20 76 61 6c 75 65 2e 20 57 68 65 6e 65 76  is value. Whenev
37db0 65 72 20 0a 2a 2a 20 70 6f 73 73 69 62 6c 65 2c  er .** possible,
37dc0 20 57 41 4c 20 61 6e 64 20 6a 6f 75 72 6e 61 6c   WAL and journal
37dd0 20 66 69 6c 65 73 20 61 72 65 20 63 72 65 61 74   files are creat
37de0 65 64 20 75 73 69 6e 67 20 74 68 65 20 73 61 6d  ed using the sam
37df0 65 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 0a 2a  e permissions .*
37e00 2a 20 61 73 20 74 68 65 20 61 73 73 6f 63 69 61  * as the associa
37e10 74 65 64 20 64 61 74 61 62 61 73 65 20 66 69 6c  ted database fil
37e20 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
37e30 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 38 5f  SQLITE_ENABLE_8_
37e40 33 5f 4e 41 4d 45 53 20 6f 70 74 69 6f 6e 20 69  3_NAMES option i
37e50 73 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e 20  s enabled, then 
37e60 74 68 65 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 20  the.** original 
37e70 66 69 6c 65 6e 61 6d 65 20 69 73 20 75 6e 61 76  filename is unav
37e80 61 69 6c 61 62 6c 65 2e 20 20 42 75 74 20 38 5f  ailable.  But 8_
37e90 33 5f 4e 41 4d 45 53 20 69 73 20 6f 6e 6c 79 20  3_NAMES is only 
37ea0 75 73 65 64 20 66 6f 72 0a 2a 2a 20 46 41 54 20  used for.** FAT 
37eb0 66 69 6c 65 73 79 73 74 65 6d 73 20 61 6e 64 20  filesystems and 
37ec0 70 65 72 6d 69 73 73 69 6f 6e 73 20 64 6f 20 6e  permissions do n
37ed0 6f 74 20 6d 61 74 74 65 72 20 74 68 65 72 65 2c  ot matter there,
37ee0 20 73 6f 20 6a 75 73 74 20 75 73 65 0a 2a 2a 20   so just use.** 
37ef0 74 68 65 20 64 65 66 61 75 6c 74 20 70 65 72 6d  the default perm
37f00 69 73 73 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 61 74  issions..*/.stat
37f10 69 63 20 69 6e 74 20 66 69 6e 64 43 72 65 61 74  ic int findCreat
37f20 65 46 69 6c 65 4d 6f 64 65 28 0a 20 20 63 6f 6e  eFileMode(.  con
37f30 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20  st char *zPath, 
37f40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
37f50 50 61 74 68 20 6f 66 20 66 69 6c 65 20 28 70 6f  Path of file (po
37f60 73 73 69 62 6c 79 29 20 62 65 69 6e 67 20 63 72  ssibly) being cr
37f70 65 61 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 66  eated */.  int f
37f80 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20 20  lags,           
37f90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c             /* Fl
37fa0 61 67 73 20 70 61 73 73 65 64 20 61 73 20 34 74  ags passed as 4t
37fb0 68 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 78 4f  h argument to xO
37fc0 70 65 6e 28 29 20 2a 2f 0a 20 20 6d 6f 64 65 5f  pen() */.  mode_
37fd0 74 20 2a 70 4d 6f 64 65 2c 20 20 20 20 20 20 20  t *pMode,       
37fe0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
37ff0 54 3a 20 50 65 72 6d 69 73 73 69 6f 6e 73 20 74  T: Permissions t
38000 6f 20 6f 70 65 6e 20 66 69 6c 65 20 77 69 74 68  o open file with
38010 20 2a 2f 0a 20 20 75 69 64 5f 74 20 2a 70 55 69   */.  uid_t *pUi
38020 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
38030 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 75 69        /* OUT: ui
38040 64 20 74 6f 20 73 65 74 20 6f 6e 20 74 68 65 20  d to set on the 
38050 66 69 6c 65 20 2a 2f 0a 20 20 67 69 64 5f 74 20  file */.  gid_t 
38060 2a 70 47 69 64 20 20 20 20 20 20 20 20 20 20 20  *pGid           
38070 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
38080 3a 20 67 69 64 20 74 6f 20 73 65 74 20 6f 6e 20  : gid to set on 
38090 74 68 65 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20  the file */.){. 
380a0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
380b0 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
380c0 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20   /* Return Code 
380d0 2a 2f 0a 20 20 2a 70 4d 6f 64 65 20 3d 20 30 3b  */.  *pMode = 0;
380e0 0a 20 20 2a 70 55 69 64 20 3d 20 30 3b 0a 20 20  .  *pUid = 0;.  
380f0 2a 70 47 69 64 20 3d 20 30 3b 0a 20 20 69 66 28  *pGid = 0;.  if(
38100 20 66 6c 61 67 73 20 26 20 28 53 51 4c 49 54 45   flags & (SQLITE
38110 5f 4f 50 45 4e 5f 57 41 4c 7c 53 51 4c 49 54 45  _OPEN_WAL|SQLITE
38120 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e  _OPEN_MAIN_JOURN
38130 41 4c 29 20 29 7b 0a 20 20 20 20 63 68 61 72 20  AL) ){.    char 
38140 7a 44 62 5b 4d 41 58 5f 50 41 54 48 4e 41 4d 45  zDb[MAX_PATHNAME
38150 2b 31 5d 3b 20 20 20 20 20 2f 2a 20 44 61 74 61  +1];     /* Data
38160 62 61 73 65 20 66 69 6c 65 20 70 61 74 68 20 2a  base file path *
38170 2f 0a 20 20 20 20 69 6e 74 20 6e 44 62 3b 20 20  /.    int nDb;  
38180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38190 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
381a0 20 76 61 6c 69 64 20 62 79 74 65 73 20 69 6e 20   valid bytes in 
381b0 7a 44 62 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 7a  zDb */..    /* z
381c0 50 61 74 68 20 69 73 20 61 20 70 61 74 68 20 74  Path is a path t
381d0 6f 20 61 20 57 41 4c 20 6f 72 20 6a 6f 75 72 6e  o a WAL or journ
381e0 61 6c 20 66 69 6c 65 2e 20 54 68 65 20 66 6f 6c  al file. The fol
381f0 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 64 65 72  lowing block der
38200 69 76 65 73 0a 20 20 20 20 2a 2a 20 74 68 65 20  ives.    ** the 
38210 70 61 74 68 20 74 6f 20 74 68 65 20 61 73 73 6f  path to the asso
38220 63 69 61 74 65 64 20 64 61 74 61 62 61 73 65 20  ciated database 
38230 66 69 6c 65 20 66 72 6f 6d 20 7a 50 61 74 68 2e  file from zPath.
38240 20 54 68 69 73 20 62 6c 6f 63 6b 20 68 61 6e 64   This block hand
38250 6c 65 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 66  les.    ** the f
38260 6f 6c 6c 6f 77 69 6e 67 20 6e 61 6d 69 6e 67 20  ollowing naming 
38270 63 6f 6e 76 65 6e 74 69 6f 6e 73 3a 0a 20 20 20  conventions:.   
38280 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 22 3c 70   **.    **   "<p
38290 61 74 68 20 74 6f 20 64 62 3e 2d 6a 6f 75 72 6e  ath to db>-journ
382a0 61 6c 22 0a 20 20 20 20 2a 2a 20 20 20 22 3c 70  al".    **   "<p
382b0 61 74 68 20 74 6f 20 64 62 3e 2d 77 61 6c 22 0a  ath to db>-wal".
382c0 20 20 20 20 2a 2a 20 20 20 22 3c 70 61 74 68 20      **   "<path 
382d0 74 6f 20 64 62 3e 2d 6a 6f 75 72 6e 61 6c 4e 4e  to db>-journalNN
382e0 22 0a 20 20 20 20 2a 2a 20 20 20 22 3c 70 61 74  ".    **   "<pat
382f0 68 20 74 6f 20 64 62 3e 2d 77 61 6c 4e 4e 22 0a  h to db>-walNN".
38300 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 77 68      **.    ** wh
38310 65 72 65 20 4e 4e 20 69 73 20 61 20 64 65 63 69  ere NN is a deci
38320 6d 61 6c 20 6e 75 6d 62 65 72 2e 20 54 68 65 20  mal number. The 
38330 4e 4e 20 6e 61 6d 69 6e 67 20 73 63 68 65 6d 65  NN naming scheme
38340 73 20 61 72 65 20 0a 20 20 20 20 2a 2a 20 75 73  s are .    ** us
38350 65 64 20 62 79 20 74 68 65 20 74 65 73 74 5f 6d  ed by the test_m
38360 75 6c 74 69 70 6c 65 78 2e 63 20 6d 6f 64 75 6c  ultiplex.c modul
38370 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6e 44  e..    */.    nD
38380 62 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  b = sqlite3Strle
38390 6e 33 30 28 7a 50 61 74 68 29 20 2d 20 31 3b 20  n30(zPath) - 1; 
383a0 0a 20 20 20 20 77 68 69 6c 65 28 20 7a 50 61 74  .    while( zPat
383b0 68 5b 6e 44 62 5d 21 3d 27 2d 27 20 29 7b 0a 20  h[nDb]!='-' ){. 
383c0 20 20 20 20 20 2f 2a 20 49 6e 20 6e 6f 72 6d 61       /* In norma
383d0 6c 20 6f 70 65 72 61 74 69 6f 6e 2c 20 74 68 65  l operation, the
383e0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
383f0 6d 65 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 63  me will always c
38400 6f 6e 74 61 69 6e 0a 20 20 20 20 20 20 2a 2a 20  ontain.      ** 
38410 61 20 27 2d 27 20 63 68 61 72 61 63 74 65 72 2e  a '-' character.
38420 20 20 48 6f 77 65 76 65 72 20 69 6e 20 38 2b 33    However in 8+3
38430 20 66 69 6c 65 6e 61 6d 65 20 6d 6f 64 65 2c 20   filename mode, 
38440 6f 72 20 69 66 20 61 20 63 6f 72 72 75 70 74 0a  or if a corrupt.
38450 20 20 20 20 20 20 2a 2a 20 72 6f 6c 6c 62 61 63        ** rollbac
38460 6b 20 6a 6f 75 72 6e 61 6c 20 73 70 65 63 69 66  k journal specif
38470 69 65 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  ies a master jou
38480 72 6e 61 6c 20 77 69 74 68 20 61 20 67 6f 6f 66  rnal with a goof
38490 79 20 6e 61 6d 65 2c 20 74 68 65 6e 0a 20 20 20  y name, then.   
384a0 20 20 20 2a 2a 20 74 68 65 20 27 2d 27 20 6d 69     ** the '-' mi
384b0 67 68 74 20 62 65 20 6d 69 73 73 69 6e 67 2e 20  ght be missing. 
384c0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6e 44 62  */.      if( nDb
384d0 3d 3d 30 20 7c 7c 20 7a 50 61 74 68 5b 6e 44 62  ==0 || zPath[nDb
384e0 5d 3d 3d 27 2e 27 20 29 20 72 65 74 75 72 6e 20  ]=='.' ) return 
384f0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
38500 20 6e 44 62 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20   nDb--;.    }.  
38510 20 20 6d 65 6d 63 70 79 28 7a 44 62 2c 20 7a 50    memcpy(zDb, zP
38520 61 74 68 2c 20 6e 44 62 29 3b 0a 20 20 20 20 7a  ath, nDb);.    z
38530 44 62 5b 6e 44 62 5d 20 3d 20 27 5c 30 27 3b 0a  Db[nDb] = '\0';.
38540 0a 20 20 20 20 72 63 20 3d 20 67 65 74 46 69 6c  .    rc = getFil
38550 65 4d 6f 64 65 28 7a 44 62 2c 20 70 4d 6f 64 65  eMode(zDb, pMode
38560 2c 20 70 55 69 64 2c 20 70 47 69 64 29 3b 0a 20  , pUid, pGid);. 
38570 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73   }else