/ Hex Artifact Content
Login

Artifact 5d735a657897109af9fffb6e5144de2d091b96f0:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 4d 61 79 20 32  /*.** 2004 May 2
0010: 32 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  2.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
0180: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74   file contains t
0190: 68 65 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74  he VFS implement
01a0: 61 74 69 6f 6e 20 66 6f 72 20 75 6e 69 78 2d 6c  ation for unix-l
01b0: 69 6b 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  ike operating sy
01c0: 73 74 65 6d 73 0a 2a 2a 20 69 6e 63 6c 75 64 65  stems.** include
01d0: 20 4c 69 6e 75 78 2c 20 4d 61 63 4f 53 58 2c 20   Linux, MacOSX, 
01e0: 2a 42 53 44 2c 20 51 4e 58 2c 20 56 78 57 6f 72  *BSD, QNX, VxWor
01f0: 6b 73 2c 20 41 49 58 2c 20 48 50 55 58 2c 20 61  ks, AIX, HPUX, a
0200: 6e 64 20 6f 74 68 65 72 73 2e 0a 2a 2a 0a 2a 2a  nd others..**.**
0210: 20 54 68 65 72 65 20 61 72 65 20 61 63 74 75 61   There are actua
0220: 6c 6c 79 20 73 65 76 65 72 61 6c 20 64 69 66 66  lly several diff
0230: 65 72 65 6e 74 20 56 46 53 20 69 6d 70 6c 65 6d  erent VFS implem
0240: 65 6e 74 61 74 69 6f 6e 73 20 69 6e 20 74 68 69  entations in thi
0250: 73 20 66 69 6c 65 2e 0a 2a 2a 20 54 68 65 20 64  s file..** The d
0260: 69 66 66 65 72 65 6e 63 65 73 20 61 72 65 20 69  ifferences are i
0270: 6e 20 74 68 65 20 77 61 79 20 74 68 61 74 20 66  n the way that f
0280: 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20 64  ile locking is d
0290: 6f 6e 65 2e 20 20 54 68 65 20 64 65 66 61 75 6c  one.  The defaul
02a0: 74 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74  t.** implementat
02b0: 69 6f 6e 20 75 73 65 73 20 50 6f 73 69 78 20 41  ion uses Posix A
02c0: 64 76 69 73 6f 72 79 20 4c 6f 63 6b 73 2e 20 20  dvisory Locks.  
02d0: 41 6c 74 65 72 6e 61 74 69 76 65 20 69 6d 70 6c  Alternative impl
02e0: 65 6d 65 6e 74 61 74 69 6f 6e 73 0a 2a 2a 20 75  ementations.** u
02f0: 73 65 20 66 6c 6f 63 6b 28 29 2c 20 64 6f 74 2d  se flock(), dot-
0300: 66 69 6c 65 73 2c 20 76 61 72 69 6f 75 73 20 70  files, various p
0310: 72 6f 70 72 69 65 74 61 72 79 20 6c 6f 63 6b 69  roprietary locki
0320: 6e 67 20 73 63 68 65 6d 61 73 2c 20 6f 72 20 73  ng schemas, or s
0330: 69 6d 70 6c 79 0a 2a 2a 20 73 6b 69 70 20 6c 6f  imply.** skip lo
0340: 63 6b 69 6e 67 20 61 6c 6c 20 74 6f 67 65 74 68  cking all togeth
0350: 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 73  er..**.** This s
0360: 6f 75 72 63 65 20 66 69 6c 65 20 69 73 20 6f 72  ource file is or
0370: 67 61 6e 69 7a 65 64 20 69 6e 74 6f 20 64 69 76  ganized into div
0380: 69 73 69 6f 6e 73 20 77 68 65 72 65 20 74 68 65  isions where the
0390: 20 6c 6f 67 69 63 20 66 6f 72 20 76 61 72 69 6f   logic for vario
03a0: 75 73 0a 2a 2a 20 73 75 62 66 75 6e 63 74 69 6f  us.** subfunctio
03b0: 6e 73 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20  ns is contained 
03c0: 77 69 74 68 69 6e 20 74 68 65 20 61 70 70 72 6f  within the appro
03d0: 70 72 69 61 74 65 20 64 69 76 69 73 69 6f 6e 2e  priate division.
03e0: 20 20 50 4c 45 41 53 45 0a 2a 2a 20 4b 45 45 50    PLEASE.** KEEP
03f0: 20 54 48 45 20 53 54 52 55 43 54 55 52 45 20 4f   THE STRUCTURE O
0400: 46 20 54 48 49 53 20 46 49 4c 45 20 49 4e 54 41  F THIS FILE INTA
0410: 43 54 2e 20 20 4e 65 77 20 63 6f 64 65 20 73 68  CT.  New code sh
0420: 6f 75 6c 64 20 62 65 20 70 6c 61 63 65 64 0a 2a  ould be placed.*
0430: 2a 20 69 6e 20 74 68 65 20 63 6f 72 72 65 63 74  * in the correct
0440: 20 64 69 76 69 73 69 6f 6e 20 61 6e 64 20 73 68   division and sh
0450: 6f 75 6c 64 20 62 65 20 63 6c 65 61 72 6c 79 20  ould be clearly 
0460: 6c 61 62 65 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  labeled..**.** T
0470: 68 65 20 6c 61 79 6f 75 74 20 6f 66 20 64 69 76  he layout of div
0480: 69 73 69 6f 6e 73 20 69 73 20 61 73 20 66 6f 6c  isions is as fol
0490: 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  lows:.**.**   * 
04a0: 20 47 65 6e 65 72 61 6c 2d 70 75 72 70 6f 73 65   General-purpose
04b0: 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 20 61 6e   declarations an
04c0: 64 20 75 74 69 6c 69 74 79 20 66 75 6e 63 74 69  d utility functi
04d0: 6f 6e 73 2e 0a 2a 2a 20 20 20 2a 20 20 55 6e 69  ons..**   *  Uni
04e0: 71 75 65 20 66 69 6c 65 20 49 44 20 6c 6f 67 69  que file ID logi
04f0: 63 20 75 73 65 64 20 62 79 20 56 78 57 6f 72 6b  c used by VxWork
0500: 73 2e 0a 2a 2a 20 20 20 2a 20 20 56 61 72 69 6f  s..**   *  Vario
0510: 75 73 20 6c 6f 63 6b 69 6e 67 20 70 72 69 6d 69  us locking primi
0520: 74 69 76 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74  tive implementat
0530: 69 6f 6e 73 20 28 61 6c 6c 20 65 78 63 65 70 74  ions (all except
0540: 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 29 3a   proxy locking):
0550: 0a 2a 2a 20 20 20 20 20 20 2b 20 66 6f 72 20 50  .**      + for P
0560: 6f 73 69 78 20 41 64 76 69 73 6f 72 79 20 4c 6f  osix Advisory Lo
0570: 63 6b 73 0a 2a 2a 20 20 20 20 20 20 2b 20 66 6f  cks.**      + fo
0580: 72 20 6e 6f 2d 6f 70 20 6c 6f 63 6b 73 0a 2a 2a  r no-op locks.**
0590: 20 20 20 20 20 20 2b 20 66 6f 72 20 64 6f 74 2d        + for dot-
05a0: 66 69 6c 65 20 6c 6f 63 6b 73 0a 2a 2a 20 20 20  file locks.**   
05b0: 20 20 20 2b 20 66 6f 72 20 66 6c 6f 63 6b 28 29     + for flock()
05c0: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   locking.**     
05d0: 20 2b 20 66 6f 72 20 6e 61 6d 65 64 20 73 65 6d   + for named sem
05e0: 61 70 68 6f 72 65 20 6c 6f 63 6b 73 20 28 56 78  aphore locks (Vx
05f0: 57 6f 72 6b 73 20 6f 6e 6c 79 29 0a 2a 2a 20 20  Works only).**  
0600: 20 20 20 20 2b 20 66 6f 72 20 41 46 50 20 66 69      + for AFP fi
0610: 6c 65 73 79 73 74 65 6d 20 6c 6f 63 6b 73 20 28  lesystem locks (
0620: 4d 61 63 4f 53 58 20 6f 6e 6c 79 29 0a 2a 2a 20  MacOSX only).** 
0630: 20 20 2a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c    *  sqlite3_fil
0640: 65 20 6d 65 74 68 6f 64 73 20 6e 6f 74 20 61 73  e methods not as
0650: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 6c 6f  sociated with lo
0660: 63 6b 69 6e 67 2e 0a 2a 2a 20 20 20 2a 20 20 44  cking..**   *  D
0670: 65 66 69 6e 69 74 69 6f 6e 73 20 6f 66 20 73 71  efinitions of sq
0680: 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
0690: 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 61 6c 6c   objects for all
06a0: 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20   locking.**     
06b0: 20 6d 65 74 68 6f 64 73 20 70 6c 75 73 20 22 66   methods plus "f
06c0: 69 6e 64 65 72 22 20 66 75 6e 63 74 69 6f 6e 73  inder" functions
06d0: 20 66 6f 72 20 65 61 63 68 20 6c 6f 63 6b 69 6e   for each lockin
06e0: 67 20 6d 65 74 68 6f 64 2e 0a 2a 2a 20 20 20 2a  g method..**   *
06f0: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6d 65    sqlite3_vfs me
0700: 74 68 6f 64 20 69 6d 70 6c 65 6d 65 6e 74 61 74  thod implementat
0710: 69 6f 6e 73 2e 0a 2a 2a 20 20 20 2a 20 20 4c 6f  ions..**   *  Lo
0720: 63 6b 69 6e 67 20 70 72 69 6d 69 74 69 76 65 73  cking primitives
0730: 20 66 6f 72 20 74 68 65 20 70 72 6f 78 79 20 75   for the proxy u
0740: 62 65 72 2d 6c 6f 63 6b 69 6e 67 2d 6d 65 74 68  ber-locking-meth
0750: 6f 64 2e 20 28 4d 61 63 4f 53 58 20 6f 6e 6c 79  od. (MacOSX only
0760: 29 0a 2a 2a 20 20 20 2a 20 20 44 65 66 69 6e 69  ).**   *  Defini
0770: 74 69 6f 6e 73 20 6f 66 20 73 71 6c 69 74 65 33  tions of sqlite3
0780: 5f 76 66 73 20 6f 62 6a 65 63 74 73 20 66 6f 72  _vfs objects for
0790: 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6d 65 74   all locking met
07a0: 68 6f 64 73 0a 2a 2a 20 20 20 20 20 20 70 6c 75  hods.**      plu
07b0: 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  s implementation
07c0: 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 6f 73 5f  s of sqlite3_os_
07d0: 69 6e 69 74 28 29 20 61 6e 64 20 73 71 6c 69 74  init() and sqlit
07e0: 65 33 5f 6f 73 5f 65 6e 64 28 29 2e 0a 2a 2f 0a  e3_os_end()..*/.
07f0: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0800: 49 6e 74 2e 68 22 0a 23 69 66 20 53 51 4c 49 54  Int.h".#if SQLIT
0810: 45 5f 4f 53 5f 55 4e 49 58 20 20 20 20 20 20 20  E_OS_UNIX       
0820: 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 66         /* This f
0830: 69 6c 65 20 69 73 20 75 73 65 64 20 6f 6e 20 75  ile is used on u
0840: 6e 69 78 20 6f 6e 6c 79 20 2a 2f 0a 0a 2f 2a 0a  nix only */../*.
0850: 2a 2a 20 54 68 65 72 65 20 61 72 65 20 76 61 72  ** There are var
0860: 69 6f 75 73 20 6d 65 74 68 6f 64 73 20 66 6f 72  ious methods for
0870: 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 75 73   file locking us
0880: 65 64 20 66 6f 72 20 63 6f 6e 63 75 72 72 65 6e  ed for concurren
0890: 63 79 0a 2a 2a 20 63 6f 6e 74 72 6f 6c 3a 0a 2a  cy.** control:.*
08a0: 2a 0a 2a 2a 20 20 20 31 2e 20 50 4f 53 49 58 20  *.**   1. POSIX 
08b0: 6c 6f 63 6b 69 6e 67 20 28 74 68 65 20 64 65 66  locking (the def
08c0: 61 75 6c 74 29 2c 0a 2a 2a 20 20 20 32 2e 20 4e  ault),.**   2. N
08d0: 6f 20 6c 6f 63 6b 69 6e 67 2c 0a 2a 2a 20 20 20  o locking,.**   
08e0: 33 2e 20 44 6f 74 2d 66 69 6c 65 20 6c 6f 63 6b  3. Dot-file lock
08f0: 69 6e 67 2c 0a 2a 2a 20 20 20 34 2e 20 66 6c 6f  ing,.**   4. flo
0900: 63 6b 28 29 20 6c 6f 63 6b 69 6e 67 2c 0a 2a 2a  ck() locking,.**
0910: 20 20 20 35 2e 20 41 46 50 20 6c 6f 63 6b 69 6e     5. AFP lockin
0920: 67 20 28 4f 53 58 20 6f 6e 6c 79 29 2c 0a 2a 2a  g (OSX only),.**
0930: 20 20 20 36 2e 20 4e 61 6d 65 64 20 50 4f 53 49     6. Named POSI
0940: 58 20 73 65 6d 61 70 68 6f 72 65 73 20 28 56 58  X semaphores (VX
0950: 57 6f 72 6b 73 20 6f 6e 6c 79 29 2c 0a 2a 2a 20  Works only),.** 
0960: 20 20 37 2e 20 70 72 6f 78 79 20 6c 6f 63 6b 69    7. proxy locki
0970: 6e 67 2e 20 28 4f 53 58 20 6f 6e 6c 79 29 0a 2a  ng. (OSX only).*
0980: 2a 0a 2a 2a 20 53 74 79 6c 65 73 20 34 2c 20 35  *.** Styles 4, 5
0990: 2c 20 61 6e 64 20 37 20 61 72 65 20 6f 6e 6c 79  , and 7 are only
09a0: 20 61 76 61 69 6c 61 62 6c 65 20 6f 66 20 53 51   available of SQ
09b0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
09c0: 49 4e 47 5f 53 54 59 4c 45 0a 2a 2a 20 69 73 20  ING_STYLE.** is 
09d0: 64 65 66 69 6e 65 64 20 74 6f 20 31 2e 20 20 54  defined to 1.  T
09e0: 68 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  he SQLITE_ENABLE
09f0: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 61  _LOCKING_STYLE a
0a00: 6c 73 6f 20 65 6e 61 62 6c 65 73 20 61 75 74 6f  lso enables auto
0a10: 6d 61 74 69 63 0a 2a 2a 20 73 65 6c 65 63 74 69  matic.** selecti
0a20: 6f 6e 20 6f 66 20 74 68 65 20 61 70 70 72 6f 70  on of the approp
0a30: 72 69 61 74 65 20 6c 6f 63 6b 69 6e 67 20 73 74  riate locking st
0a40: 79 6c 65 20 62 61 73 65 64 20 6f 6e 20 74 68 65  yle based on the
0a50: 20 66 69 6c 65 73 79 73 74 65 6d 0a 2a 2a 20 77   filesystem.** w
0a60: 68 65 72 65 20 74 68 65 20 64 61 74 61 62 61 73  here the databas
0a70: 65 20 69 73 20 6c 6f 63 61 74 65 64 2e 20 20 0a  e is located.  .
0a80: 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
0a90: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
0aa0: 43 4b 49 4e 47 5f 53 54 59 4c 45 29 0a 23 20 20  CKING_STYLE).#  
0ab0: 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
0ac0: 4c 45 5f 5f 29 0a 23 20 20 20 20 64 65 66 69 6e  LE__).#    defin
0ad0: 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  e SQLITE_ENABLE_
0ae0: 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 31 0a  LOCKING_STYLE 1.
0af0: 23 20 20 65 6c 73 65 0a 23 20 20 20 20 64 65 66  #  else.#    def
0b00: 69 6e 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ine SQLITE_ENABL
0b10: 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
0b20: 30 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64 69  0.#  endif.#endi
0b30: 66 0a 0a 2f 2a 0a 2a 2a 20 73 74 61 6e 64 61 72  f../*.** standar
0b40: 64 20 69 6e 63 6c 75 64 65 20 66 69 6c 65 73 2e  d include files.
0b50: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79  .*/.#include <sy
0b60: 73 2f 74 79 70 65 73 2e 68 3e 0a 23 69 6e 63 6c  s/types.h>.#incl
0b70: 75 64 65 20 3c 73 79 73 2f 73 74 61 74 2e 68 3e  ude <sys/stat.h>
0b80: 0a 23 69 6e 63 6c 75 64 65 20 3c 66 63 6e 74 6c  .#include <fcntl
0b90: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 75 6e  .h>.#include <un
0ba0: 69 73 74 64 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  istd.h>.#include
0bb0: 20 3c 74 69 6d 65 2e 68 3e 0a 23 69 6e 63 6c 75   <time.h>.#inclu
0bc0: 64 65 20 3c 73 79 73 2f 74 69 6d 65 2e 68 3e 0a  de <sys/time.h>.
0bd0: 23 69 6e 63 6c 75 64 65 20 3c 65 72 72 6e 6f 2e  #include <errno.
0be0: 68 3e 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  h>.#if !defined(
0bf0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29  SQLITE_OMIT_WAL)
0c00: 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d   || SQLITE_MAX_M
0c10: 4d 41 50 5f 53 49 5a 45 3e 30 0a 23 20 69 6e 63  MAP_SIZE>0.# inc
0c20: 6c 75 64 65 20 3c 73 79 73 2f 6d 6d 61 6e 2e 68  lude <sys/mman.h
0c30: 3e 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51  >.#endif..#if SQ
0c40: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
0c50: 49 4e 47 5f 53 54 59 4c 45 0a 23 20 69 6e 63 6c  ING_STYLE.# incl
0c60: 75 64 65 20 3c 73 79 73 2f 69 6f 63 74 6c 2e 68  ude <sys/ioctl.h
0c70: 3e 0a 23 20 69 6e 63 6c 75 64 65 20 3c 75 75 69  >.# include <uui
0c80: 64 2f 75 75 69 64 2e 68 3e 0a 23 20 69 6e 63 6c  d/uuid.h>.# incl
0c90: 75 64 65 20 3c 73 79 73 2f 66 69 6c 65 2e 68 3e  ude <sys/file.h>
0ca0: 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f  .# include <sys/
0cb0: 70 61 72 61 6d 2e 68 3e 0a 23 65 6e 64 69 66 20  param.h>.#endif 
0cc0: 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
0cd0: 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a  _LOCKING_STYLE *
0ce0: 2f 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  /..#if defined(_
0cf0: 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 28 28 5f  _APPLE__) && ((_
0d00: 5f 4d 41 43 5f 4f 53 5f 58 5f 56 45 52 53 49 4f  _MAC_OS_X_VERSIO
0d10: 4e 5f 4d 49 4e 5f 52 45 51 55 49 52 45 44 20 3e  N_MIN_REQUIRED >
0d20: 20 31 30 35 30 29 20 7c 7c 20 5c 0a 20 20 20 20   1050) || \.    
0d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d40: 20 20 20 20 20 20 20 28 5f 5f 49 50 48 4f 4e 45         (__IPHONE
0d50: 5f 4f 53 5f 56 45 52 53 49 4f 4e 5f 4d 49 4e 5f  _OS_VERSION_MIN_
0d60: 52 45 51 55 49 52 45 44 20 3e 20 32 30 30 30 29  REQUIRED > 2000)
0d70: 29 0a 23 20 20 69 66 20 28 21 64 65 66 69 6e 65  ).#  if (!define
0d80: 64 28 54 41 52 47 45 54 5f 4f 53 5f 45 4d 42 45  d(TARGET_OS_EMBE
0d90: 44 44 45 44 29 20 7c 7c 20 28 54 41 52 47 45 54  DDED) || (TARGET
0da0: 5f 4f 53 5f 45 4d 42 45 44 44 45 44 3d 3d 30 29  _OS_EMBEDDED==0)
0db0: 29 20 5c 0a 20 20 20 20 20 20 20 26 26 20 28 21  ) \.       && (!
0dc0: 64 65 66 69 6e 65 64 28 54 41 52 47 45 54 5f 49  defined(TARGET_I
0dd0: 50 48 4f 4e 45 5f 53 49 4d 55 4c 41 54 4f 52 29  PHONE_SIMULATOR)
0de0: 20 7c 7c 20 28 54 41 52 47 45 54 5f 49 50 48 4f   || (TARGET_IPHO
0df0: 4e 45 5f 53 49 4d 55 4c 41 54 4f 52 3d 3d 30 29  NE_SIMULATOR==0)
0e00: 29 0a 23 20 20 20 20 64 65 66 69 6e 65 20 48 41  ).#    define HA
0e10: 56 45 5f 47 45 54 48 4f 53 54 55 55 49 44 20 31  VE_GETHOSTUUID 1
0e20: 0a 23 20 20 65 6c 73 65 0a 23 20 20 20 20 77 61  .#  else.#    wa
0e30: 72 6e 69 6e 67 20 22 67 65 74 68 6f 73 74 75 75  rning "gethostuu
0e40: 69 64 28 29 20 69 73 20 64 69 73 61 62 6c 65 64  id() is disabled
0e50: 2e 22 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64  .".#  endif.#end
0e60: 69 66 0a 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f  if...#if OS_VXWO
0e70: 52 4b 53 0a 23 20 69 6e 63 6c 75 64 65 20 3c 73  RKS.# include <s
0e80: 79 73 2f 69 6f 63 74 6c 2e 68 3e 0a 23 20 69 6e  ys/ioctl.h>.# in
0e90: 63 6c 75 64 65 20 3c 73 65 6d 61 70 68 6f 72 65  clude <semaphore
0ea0: 2e 68 3e 0a 23 20 69 6e 63 6c 75 64 65 20 3c 6c  .h>.# include <l
0eb0: 69 6d 69 74 73 2e 68 3e 0a 23 65 6e 64 69 66 20  imits.h>.#endif 
0ec0: 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f  /* OS_VXWORKS */
0ed0: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  ..#if defined(__
0ee0: 41 50 50 4c 45 5f 5f 29 20 7c 7c 20 53 51 4c 49  APPLE__) || SQLI
0ef0: 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
0f00: 47 5f 53 54 59 4c 45 0a 23 20 69 6e 63 6c 75 64  G_STYLE.# includ
0f10: 65 20 3c 73 79 73 2f 6d 6f 75 6e 74 2e 68 3e 0a  e <sys/mount.h>.
0f20: 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 48  #endif..#ifdef H
0f30: 41 56 45 5f 55 54 49 4d 45 0a 23 20 69 6e 63 6c  AVE_UTIME.# incl
0f40: 75 64 65 20 3c 75 74 69 6d 65 2e 68 3e 0a 23 65  ude <utime.h>.#e
0f50: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f  ndif../*.** Allo
0f60: 77 65 64 20 76 61 6c 75 65 73 20 6f 66 20 75 6e  wed values of un
0f70: 69 78 46 69 6c 65 2e 66 73 46 6c 61 67 73 0a 2a  ixFile.fsFlags.*
0f80: 2f 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45  /.#define SQLITE
0f90: 5f 46 53 46 4c 41 47 53 5f 49 53 5f 4d 53 44 4f  _FSFLAGS_IS_MSDO
0fa0: 53 20 20 20 20 20 30 78 31 0a 0a 2f 2a 0a 2a 2a  S     0x1../*.**
0fb0: 20 49 66 20 77 65 20 61 72 65 20 74 6f 20 62 65   If we are to be
0fc0: 20 74 68 72 65 61 64 2d 73 61 66 65 2c 20 69 6e   thread-safe, in
0fd0: 63 6c 75 64 65 20 74 68 65 20 70 74 68 72 65 61  clude the pthrea
0fe0: 64 73 20 68 65 61 64 65 72 20 61 6e 64 20 64 65  ds header and de
0ff0: 66 69 6e 65 0a 2a 2a 20 74 68 65 20 53 51 4c 49  fine.** the SQLI
1000: 54 45 5f 55 4e 49 58 5f 54 48 52 45 41 44 53 20  TE_UNIX_THREADS 
1010: 6d 61 63 72 6f 2e 0a 2a 2f 0a 23 69 66 20 53 51  macro..*/.#if SQ
1020: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a  LITE_THREADSAFE.
1030: 23 20 69 6e 63 6c 75 64 65 20 3c 70 74 68 72 65  # include <pthre
1040: 61 64 2e 68 3e 0a 23 20 64 65 66 69 6e 65 20 53  ad.h>.# define S
1050: 51 4c 49 54 45 5f 55 4e 49 58 5f 54 48 52 45 41  QLITE_UNIX_THREA
1060: 44 53 20 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  DS 1.#endif../*.
1070: 2a 2a 20 44 65 66 61 75 6c 74 20 70 65 72 6d 69  ** Default permi
1080: 73 73 69 6f 6e 73 20 77 68 65 6e 20 63 72 65 61  ssions when crea
1090: 74 69 6e 67 20 61 20 6e 65 77 20 66 69 6c 65 0a  ting a new file.
10a0: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
10b0: 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50  E_DEFAULT_FILE_P
10c0: 45 52 4d 49 53 53 49 4f 4e 53 0a 23 20 64 65 66  ERMISSIONS.# def
10d0: 69 6e 65 20 53 51 4c 49 54 45 5f 44 45 46 41 55  ine SQLITE_DEFAU
10e0: 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49  LT_FILE_PERMISSI
10f0: 4f 4e 53 20 30 36 34 34 0a 23 65 6e 64 69 66 0a  ONS 0644.#endif.
1100: 0a 2f 2a 0a 2a 2a 20 44 65 66 61 75 6c 74 20 70  ./*.** Default p
1110: 65 72 6d 69 73 73 69 6f 6e 73 20 77 68 65 6e 20  ermissions when 
1120: 63 72 65 61 74 69 6e 67 20 61 75 74 6f 20 70 72  creating auto pr
1130: 6f 78 79 20 64 69 72 0a 2a 2f 0a 23 69 66 6e 64  oxy dir.*/.#ifnd
1140: 65 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  ef SQLITE_DEFAUL
1150: 54 5f 50 52 4f 58 59 44 49 52 5f 50 45 52 4d 49  T_PROXYDIR_PERMI
1160: 53 53 49 4f 4e 53 0a 23 20 64 65 66 69 6e 65 20  SSIONS.# define 
1170: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50  SQLITE_DEFAULT_P
1180: 52 4f 58 59 44 49 52 5f 50 45 52 4d 49 53 53 49  ROXYDIR_PERMISSI
1190: 4f 4e 53 20 30 37 35 35 0a 23 65 6e 64 69 66 0a  ONS 0755.#endif.
11a0: 0a 2f 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20 73  ./*.** Maximum s
11b0: 75 70 70 6f 72 74 65 64 20 70 61 74 68 2d 6c 65  upported path-le
11c0: 6e 67 74 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  ngth..*/.#define
11d0: 20 4d 41 58 5f 50 41 54 48 4e 41 4d 45 20 35 31   MAX_PATHNAME 51
11e0: 32 0a 0a 2f 2a 20 41 6c 77 61 79 73 20 63 61 73  2../* Always cas
11f0: 74 20 74 68 65 20 67 65 74 70 69 64 28 29 20 72  t the getpid() r
1200: 65 74 75 72 6e 20 74 79 70 65 20 66 6f 72 20 63  eturn type for c
1210: 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 77 69 74  ompatibility wit
1220: 68 0a 2a 2a 20 6b 65 72 6e 65 6c 20 6d 6f 64 75  h.** kernel modu
1230: 6c 65 73 20 69 6e 20 56 78 57 6f 72 6b 73 2e 20  les in VxWorks. 
1240: 2a 2f 0a 23 64 65 66 69 6e 65 20 6f 73 47 65 74  */.#define osGet
1250: 70 69 64 28 58 29 20 28 70 69 64 5f 74 29 67 65  pid(X) (pid_t)ge
1260: 74 70 69 64 28 29 0a 0a 2f 2a 0a 2a 2a 20 4f 6e  tpid()../*.** On
1270: 6c 79 20 73 65 74 20 74 68 65 20 6c 61 73 74 45  ly set the lastE
1280: 72 72 6e 6f 20 69 66 20 74 68 65 20 65 72 72 6f  rrno if the erro
1290: 72 20 63 6f 64 65 20 69 73 20 61 20 72 65 61 6c  r code is a real
12a0: 20 65 72 72 6f 72 20 61 6e 64 20 6e 6f 74 20 0a   error and not .
12b0: 2a 2a 20 61 20 6e 6f 72 6d 61 6c 20 65 78 70 65  ** a normal expe
12c0: 63 74 65 64 20 72 65 74 75 72 6e 20 63 6f 64 65  cted return code
12d0: 20 6f 66 20 53 51 4c 49 54 45 5f 42 55 53 59 20   of SQLITE_BUSY 
12e0: 6f 72 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2f 0a  or SQLITE_OK.*/.
12f0: 23 64 65 66 69 6e 65 20 49 53 5f 4c 4f 43 4b 5f  #define IS_LOCK_
1300: 45 52 52 4f 52 28 78 29 20 20 28 28 78 20 21 3d  ERROR(x)  ((x !=
1310: 20 53 51 4c 49 54 45 5f 4f 4b 29 20 26 26 20 28   SQLITE_OK) && (
1320: 78 20 21 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  x != SQLITE_BUSY
1330: 29 29 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72  ))../* Forward r
1340: 65 66 65 72 65 6e 63 65 73 20 2a 2f 0a 74 79 70  eferences */.typ
1350: 65 64 65 66 20 73 74 72 75 63 74 20 75 6e 69 78  edef struct unix
1360: 53 68 6d 20 75 6e 69 78 53 68 6d 3b 20 20 20 20  Shm unixShm;    
1370: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
1380: 6e 6e 65 63 74 69 6f 6e 20 73 68 61 72 65 64 20  nnection shared 
1390: 6d 65 6d 6f 72 79 20 2a 2f 0a 74 79 70 65 64 65  memory */.typede
13a0: 66 20 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d  f struct unixShm
13b0: 4e 6f 64 65 20 75 6e 69 78 53 68 6d 4e 6f 64 65  Node unixShmNode
13c0: 3b 20 20 20 20 20 20 20 2f 2a 20 53 68 61 72 65  ;       /* Share
13d0: 64 20 6d 65 6d 6f 72 79 20 69 6e 73 74 61 6e 63  d memory instanc
13e0: 65 20 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  e */.typedef str
13f0: 75 63 74 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  uct unixInodeInf
1400: 6f 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 3b  o unixInodeInfo;
1410: 20 20 20 2f 2a 20 41 6e 20 69 2d 6e 6f 64 65 20     /* An i-node 
1420: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
1430: 74 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 55  t UnixUnusedFd U
1440: 6e 69 78 55 6e 75 73 65 64 46 64 3b 20 20 20 20  nixUnusedFd;    
1450: 20 2f 2a 20 41 6e 20 75 6e 75 73 65 64 20 66 69   /* An unused fi
1460: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f  le descriptor */
1470: 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65  ../*.** Sometime
1480: 73 2c 20 61 66 74 65 72 20 61 20 66 69 6c 65 20  s, after a file 
1490: 68 61 6e 64 6c 65 20 69 73 20 63 6c 6f 73 65 64  handle is closed
14a0: 20 62 79 20 53 51 4c 69 74 65 2c 20 74 68 65 20   by SQLite, the 
14b0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 0a  file descriptor.
14c0: 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 63 6c 6f  ** cannot be clo
14d0: 73 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e  sed immediately.
14e0: 20 49 6e 20 74 68 65 73 65 20 63 61 73 65 73 2c   In these cases,
14f0: 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68   instances of th
1500: 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 73  e following.** s
1510: 74 72 75 63 74 75 72 65 20 61 72 65 20 75 73 65  tructure are use
1520: 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 66  d to store the f
1530: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 77  ile descriptor w
1540: 68 69 6c 65 20 77 61 69 74 69 6e 67 20 66 6f 72  hile waiting for
1550: 20 61 6e 0a 2a 2a 20 6f 70 70 6f 72 74 75 6e 69   an.** opportuni
1560: 74 79 20 74 6f 20 65 69 74 68 65 72 20 63 6c 6f  ty to either clo
1570: 73 65 20 6f 72 20 72 65 75 73 65 20 69 74 2e 0a  se or reuse it..
1580: 2a 2f 0a 73 74 72 75 63 74 20 55 6e 69 78 55 6e  */.struct UnixUn
1590: 75 73 65 64 46 64 20 7b 0a 20 20 69 6e 74 20 66  usedFd {.  int f
15a0: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
15b0: 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73       /* File des
15c0: 63 72 69 70 74 6f 72 20 74 6f 20 63 6c 6f 73 65  criptor to close
15d0: 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 3b   */.  int flags;
15e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15f0: 2f 2a 20 46 6c 61 67 73 20 74 68 69 73 20 66 69  /* Flags this fi
1600: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 77 61  le descriptor wa
1610: 73 20 6f 70 65 6e 65 64 20 77 69 74 68 20 2a 2f  s opened with */
1620: 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20  .  UnixUnusedFd 
1630: 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 2f 2a 20  *pNext;      /* 
1640: 4e 65 78 74 20 75 6e 75 73 65 64 20 66 69 6c 65  Next unused file
1650: 20 64 65 73 63 72 69 70 74 6f 72 20 6f 6e 20 73   descriptor on s
1660: 61 6d 65 20 66 69 6c 65 20 2a 2f 0a 7d 3b 0a 0a  ame file */.};..
1670: 2f 2a 0a 2a 2a 20 54 68 65 20 75 6e 69 78 46 69  /*.** The unixFi
1680: 6c 65 20 73 74 72 75 63 74 75 72 65 20 69 73 20  le structure is 
1690: 73 75 62 63 6c 61 73 73 20 6f 66 20 73 71 6c 69  subclass of sqli
16a0: 74 65 33 5f 66 69 6c 65 20 73 70 65 63 69 66 69  te3_file specifi
16b0: 63 20 74 6f 20 74 68 65 20 75 6e 69 78 0a 2a 2a  c to the unix.**
16c0: 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74 61 74   VFS implementat
16d0: 69 6f 6e 73 2e 0a 2a 2f 0a 74 79 70 65 64 65 66  ions..*/.typedef
16e0: 20 73 74 72 75 63 74 20 75 6e 69 78 46 69 6c 65   struct unixFile
16f0: 20 75 6e 69 78 46 69 6c 65 3b 0a 73 74 72 75 63   unixFile;.struc
1700: 74 20 75 6e 69 78 46 69 6c 65 20 7b 0a 20 20 73  t unixFile {.  s
1710: 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
1720: 73 20 63 6f 6e 73 74 20 2a 70 4d 65 74 68 6f 64  s const *pMethod
1730: 3b 20 20 2f 2a 20 41 6c 77 61 79 73 20 74 68 65  ;  /* Always the
1740: 20 66 69 72 73 74 20 65 6e 74 72 79 20 2a 2f 0a   first entry */.
1750: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
1760: 56 66 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  Vfs;            
1770: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 46 53        /* The VFS
1780: 20 74 68 61 74 20 63 72 65 61 74 65 64 20 74 68   that created th
1790: 69 73 20 75 6e 69 78 46 69 6c 65 20 2a 2f 0a 20  is unixFile */. 
17a0: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
17b0: 70 49 6e 6f 64 65 3b 20 20 20 20 20 20 20 20 20  pInode;         
17c0: 20 20 20 20 20 2f 2a 20 49 6e 66 6f 20 61 62 6f       /* Info abo
17d0: 75 74 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 69 73  ut locks on this
17e0: 20 69 6e 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20   inode */.  int 
17f0: 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h;              
1800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1810: 2f 2a 20 54 68 65 20 66 69 6c 65 20 64 65 73 63  /* The file desc
1820: 72 69 70 74 6f 72 20 2a 2f 0a 20 20 75 6e 73 69  riptor */.  unsi
1830: 67 6e 65 64 20 63 68 61 72 20 65 46 69 6c 65 4c  gned char eFileL
1840: 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ock;            
1850: 2f 2a 20 54 68 65 20 74 79 70 65 20 6f 66 20 6c  /* The type of l
1860: 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 69 73  ock held on this
1870: 20 66 64 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65   fd */.  unsigne
1880: 64 20 73 68 6f 72 74 20 69 6e 74 20 63 74 72 6c  d short int ctrl
1890: 46 6c 61 67 73 3b 20 20 20 20 20 20 20 2f 2a 20  Flags;       /* 
18a0: 42 65 68 61 76 69 6f 72 61 6c 20 62 69 74 73 2e  Behavioral bits.
18b0: 20 20 55 4e 49 58 46 49 4c 45 5f 2a 20 66 6c 61    UNIXFILE_* fla
18c0: 67 73 20 2a 2f 0a 20 20 69 6e 74 20 6c 61 73 74  gs */.  int last
18d0: 45 72 72 6e 6f 3b 20 20 20 20 20 20 20 20 20 20  Errno;          
18e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
18f0: 68 65 20 75 6e 69 78 20 65 72 72 6e 6f 20 66 72  he unix errno fr
1900: 6f 6d 20 6c 61 73 74 20 49 2f 4f 20 65 72 72 6f  om last I/O erro
1910: 72 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 6c 6f 63  r */.  void *loc
1920: 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 20 20 20 20  kingContext;    
1930: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
1940: 63 6b 69 6e 67 20 73 74 79 6c 65 20 73 70 65 63  cking style spec
1950: 69 66 69 63 20 73 74 61 74 65 20 2a 2f 0a 20 20  ific state */.  
1960: 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70 55  UnixUnusedFd *pU
1970: 6e 75 73 65 64 3b 20 20 20 20 20 20 20 20 20 20  nused;          
1980: 20 20 20 20 2f 2a 20 50 72 65 2d 61 6c 6c 6f 63      /* Pre-alloc
1990: 61 74 65 64 20 55 6e 69 78 55 6e 75 73 65 64 46  ated UnixUnusedF
19a0: 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  d */.  const cha
19b0: 72 20 2a 7a 50 61 74 68 3b 20 20 20 20 20 20 20  r *zPath;       
19c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
19d0: 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 2a  me of the file *
19e0: 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 53 68  /.  unixShm *pSh
19f0: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
1a00: 20 20 20 20 20 20 20 20 2f 2a 20 53 68 61 72 65          /* Share
1a10: 64 20 6d 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74  d memory segment
1a20: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a   information */.
1a30: 20 20 69 6e 74 20 73 7a 43 68 75 6e 6b 3b 20 20    int szChunk;  
1a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a50: 20 20 20 20 20 20 2f 2a 20 43 6f 6e 66 69 67 75        /* Configu
1a60: 72 65 64 20 62 79 20 46 43 4e 54 4c 5f 43 48 55  red by FCNTL_CHU
1a70: 4e 4b 5f 53 49 5a 45 20 2a 2f 0a 23 69 66 20 53  NK_SIZE */.#if S
1a80: 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53  QLITE_MAX_MMAP_S
1a90: 49 5a 45 3e 30 0a 20 20 69 6e 74 20 6e 46 65 74  IZE>0.  int nFet
1aa0: 63 68 4f 75 74 3b 20 20 20 20 20 20 20 20 20 20  chOut;          
1ab0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1ac0: 75 6d 62 65 72 20 6f 66 20 6f 75 74 73 74 61 6e  umber of outstan
1ad0: 64 69 6e 67 20 78 46 65 74 63 68 20 72 65 66 73  ding xFetch refs
1ae0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e   */.  sqlite3_in
1af0: 74 36 34 20 6d 6d 61 70 53 69 7a 65 3b 20 20 20  t64 mmapSize;   
1b00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 61            /* Usa
1b10: 62 6c 65 20 73 69 7a 65 20 6f 66 20 6d 61 70 70  ble size of mapp
1b20: 69 6e 67 20 61 74 20 70 4d 61 70 52 65 67 69 6f  ing at pMapRegio
1b30: 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69  n */.  sqlite3_i
1b40: 6e 74 36 34 20 6d 6d 61 70 53 69 7a 65 41 63 74  nt64 mmapSizeAct
1b50: 75 61 6c 3b 20 20 20 20 20 20 20 2f 2a 20 41 63  ual;       /* Ac
1b60: 74 75 61 6c 20 73 69 7a 65 20 6f 66 20 6d 61 70  tual size of map
1b70: 70 69 6e 67 20 61 74 20 70 4d 61 70 52 65 67 69  ping at pMapRegi
1b80: 6f 6e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  on */.  sqlite3_
1b90: 69 6e 74 36 34 20 6d 6d 61 70 53 69 7a 65 4d 61  int64 mmapSizeMa
1ba0: 78 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  x;          /* C
1bb0: 6f 6e 66 69 67 75 72 65 64 20 46 43 4e 54 4c 5f  onfigured FCNTL_
1bc0: 4d 4d 41 50 5f 53 49 5a 45 20 76 61 6c 75 65 20  MMAP_SIZE value 
1bd0: 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 4d 61 70 52  */.  void *pMapR
1be0: 65 67 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20  egion;          
1bf0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 6d 6f           /* Memo
1c00: 72 79 20 6d 61 70 70 65 64 20 72 65 67 69 6f 6e  ry mapped region
1c10: 20 2a 2f 0a 23 65 6e 64 69 66 0a 23 69 66 64 65   */.#endif.#ifde
1c20: 66 20 5f 5f 51 4e 58 4e 54 4f 5f 5f 0a 20 20 69  f __QNXNTO__.  i
1c30: 6e 74 20 73 65 63 74 6f 72 53 69 7a 65 3b 20 20  nt sectorSize;  
1c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c50: 20 20 20 2f 2a 20 44 65 76 69 63 65 20 73 65 63     /* Device sec
1c60: 74 6f 72 20 73 69 7a 65 20 2a 2f 0a 20 20 69 6e  tor size */.  in
1c70: 74 20 64 65 76 69 63 65 43 68 61 72 61 63 74 65  t deviceCharacte
1c80: 72 69 73 74 69 63 73 3b 20 20 20 20 20 20 20 20  ristics;        
1c90: 20 20 2f 2a 20 50 72 65 63 6f 6d 70 75 74 65 64    /* Precomputed
1ca0: 20 64 65 76 69 63 65 20 63 68 61 72 61 63 74 65   device characte
1cb0: 72 69 73 74 69 63 73 20 2a 2f 0a 23 65 6e 64 69  ristics */.#endi
1cc0: 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  f.#if SQLITE_ENA
1cd0: 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
1ce0: 45 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f 41  E || defined(__A
1cf0: 50 50 4c 45 5f 5f 29 0a 20 20 69 6e 74 20 6f 70  PPLE__).  int op
1d00: 65 6e 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20  enFlags;        
1d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d20: 20 54 68 65 20 66 6c 61 67 73 20 73 70 65 63 69   The flags speci
1d30: 66 69 65 64 20 61 74 20 6f 70 65 6e 28 29 20 2a  fied at open() *
1d40: 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  /.#endif.#if SQL
1d50: 49 54 45 5f 45 4e 41 42 4c 45 5f 44 41 54 41 5f  ITE_ENABLE_DATA_
1d60: 50 52 4f 54 45 43 54 49 4f 4e 0a 20 20 69 6e 74  PROTECTION.  int
1d70: 20 70 72 6f 74 46 6c 61 67 73 3b 20 20 20 20 20   protFlags;     
1d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d90: 20 2f 2a 20 44 61 74 61 20 70 72 6f 74 65 63 74   /* Data protect
1da0: 69 6f 6e 20 66 6c 61 67 73 20 66 72 6f 6d 20 75  ion flags from u
1db0: 6e 69 78 4f 70 65 6e 20 2a 2f 0a 23 65 6e 64 69  nixOpen */.#endi
1dc0: 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  f.#if SQLITE_ENA
1dd0: 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
1de0: 45 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f 41  E || defined(__A
1df0: 50 50 4c 45 5f 5f 29 0a 20 20 75 6e 73 69 67 6e  PPLE__).  unsign
1e00: 65 64 20 66 73 46 6c 61 67 73 3b 20 20 20 20 20  ed fsFlags;     
1e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e20: 20 63 61 63 68 65 64 20 64 65 74 61 69 6c 73 20   cached details 
1e30: 66 72 6f 6d 20 73 74 61 74 66 73 28 29 20 2a 2f  from statfs() */
1e40: 0a 23 65 6e 64 69 66 0a 23 69 66 20 4f 53 5f 56  .#endif.#if OS_V
1e50: 58 57 4f 52 4b 53 0a 20 20 73 74 72 75 63 74 20  XWORKS.  struct 
1e60: 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70  vxworksFileId *p
1e70: 49 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  Id;          /* 
1e80: 55 6e 69 71 75 65 20 66 69 6c 65 20 49 44 20 2a  Unique file ID *
1e90: 2f 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20  /.#endif.#ifdef 
1ea0: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f  SQLITE_DEBUG.  /
1eb0: 2a 20 54 68 65 20 6e 65 78 74 20 67 72 6f 75 70  * The next group
1ec0: 20 6f 66 20 76 61 72 69 61 62 6c 65 73 20 61 72   of variables ar
1ed0: 65 20 75 73 65 64 20 74 6f 20 74 72 61 63 6b 20  e used to track 
1ee0: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
1ef0: 68 65 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  he.  ** transact
1f00: 69 6f 6e 20 63 6f 75 6e 74 65 72 20 69 6e 20 62  ion counter in b
1f10: 79 74 65 73 20 32 34 2d 32 37 20 6f 66 20 64 61  ytes 24-27 of da
1f20: 74 61 62 61 73 65 20 66 69 6c 65 73 20 61 72 65  tabase files are
1f30: 20 75 70 64 61 74 65 64 0a 20 20 2a 2a 20 77 68   updated.  ** wh
1f40: 65 6e 65 76 65 72 20 61 6e 79 20 70 61 72 74 20  enever any part 
1f50: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
1f60: 63 68 61 6e 67 65 73 2e 20 20 41 6e 20 61 73 73  changes.  An ass
1f70: 65 72 74 69 6f 6e 20 66 61 75 6c 74 20 77 69 6c  ertion fault wil
1f80: 6c 0a 20 20 2a 2a 20 6f 63 63 75 72 20 69 66 20  l.  ** occur if 
1f90: 61 20 66 69 6c 65 20 69 73 20 75 70 64 61 74 65  a file is update
1fa0: 64 20 77 69 74 68 6f 75 74 20 61 6c 73 6f 20 75  d without also u
1fb0: 70 64 61 74 69 6e 67 20 74 68 65 20 74 72 61 6e  pdating the tran
1fc0: 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 63 6f 75  saction.  ** cou
1fd0: 6e 74 65 72 2e 20 20 54 68 69 73 20 74 65 73 74  nter.  This test
1fe0: 20 69 73 20 6d 61 64 65 20 74 6f 20 61 76 6f 69   is made to avoi
1ff0: 64 20 6e 65 77 20 70 72 6f 62 6c 65 6d 73 20 73  d new problems s
2000: 69 6d 69 6c 61 72 20 74 6f 20 74 68 65 0a 20 20  imilar to the.  
2010: 2a 2a 20 6f 6e 65 20 64 65 73 63 72 69 62 65 64  ** one described
2020: 20 62 79 20 74 69 63 6b 65 74 20 23 33 35 38 34   by ticket #3584
2030: 2e 20 0a 20 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  . .  */.  unsign
2040: 65 64 20 63 68 61 72 20 74 72 61 6e 73 43 6e 74  ed char transCnt
2050: 72 43 68 6e 67 3b 20 20 20 2f 2a 20 54 72 75 65  rChng;   /* True
2060: 20 69 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   if the transact
2070: 69 6f 6e 20 63 6f 75 6e 74 65 72 20 63 68 61 6e  ion counter chan
2080: 67 65 64 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ged */.  unsigne
2090: 64 20 63 68 61 72 20 64 62 55 70 64 61 74 65 3b  d char dbUpdate;
20a0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
20b0: 69 66 20 61 6e 79 20 70 61 72 74 20 6f 66 20 64  if any part of d
20c0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 63 68 61  atabase file cha
20d0: 6e 67 65 64 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  nged */.  unsign
20e0: 65 64 20 63 68 61 72 20 69 6e 4e 6f 72 6d 61 6c  ed char inNormal
20f0: 57 72 69 74 65 3b 20 20 20 2f 2a 20 54 72 75 65  Write;   /* True
2100: 20 69 66 20 69 6e 20 61 20 6e 6f 72 6d 61 6c 20   if in a normal 
2110: 77 72 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 20  write operation 
2120: 2a 2f 0a 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64  */..#endif..#ifd
2130: 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
2140: 20 2f 2a 20 49 6e 20 74 65 73 74 20 6d 6f 64 65   /* In test mode
2150: 2c 20 69 6e 63 72 65 61 73 65 20 74 68 65 20 73  , increase the s
2160: 69 7a 65 20 6f 66 20 74 68 69 73 20 73 74 72 75  ize of this stru
2170: 63 74 75 72 65 20 61 20 62 69 74 20 73 6f 20 74  cture a bit so t
2180: 68 61 74 20 0a 20 20 2a 2a 20 69 74 20 69 73 20  hat .  ** it is 
2190: 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20  larger than the 
21a0: 73 74 72 75 63 74 20 43 72 61 73 68 46 69 6c 65  struct CrashFile
21b0: 20 64 65 66 69 6e 65 64 20 69 6e 20 74 65 73 74   defined in test
21c0: 36 2e 63 2e 0a 20 20 2a 2f 0a 20 20 63 68 61 72  6.c..  */.  char
21d0: 20 61 50 61 64 64 69 6e 67 5b 33 32 5d 3b 0a 23   aPadding[32];.#
21e0: 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 20 54 68 69  endif.};../* Thi
21f0: 73 20 76 61 72 69 61 62 6c 65 20 68 6f 6c 64 73  s variable holds
2200: 20 74 68 65 20 70 72 6f 63 65 73 73 20 69 64 20   the process id 
2210: 28 70 69 64 29 20 66 72 6f 6d 20 77 68 65 6e 20  (pid) from when 
2220: 74 68 65 20 78 52 61 6e 64 6f 6d 6e 65 73 73 28  the xRandomness(
2230: 29 0a 2a 2a 20 6d 65 74 68 6f 64 20 77 61 73 20  ).** method was 
2240: 63 61 6c 6c 65 64 2e 20 20 49 66 20 78 4f 70 65  called.  If xOpe
2250: 6e 28 29 20 69 73 20 63 61 6c 6c 65 64 20 66 72  n() is called fr
2260: 6f 6d 20 61 20 64 69 66 66 65 72 65 6e 74 20 70  om a different p
2270: 72 6f 63 65 73 73 20 69 64 2c 0a 2a 2a 20 69 6e  rocess id,.** in
2280: 64 69 63 61 74 69 6e 67 20 74 68 61 74 20 61 20  dicating that a 
2290: 66 6f 72 6b 28 29 20 68 61 73 20 6f 63 63 75 72  fork() has occur
22a0: 72 65 64 2c 20 74 68 65 20 50 52 4e 47 20 77 69  red, the PRNG wi
22b0: 6c 6c 20 62 65 20 72 65 73 65 74 2e 0a 2a 2f 0a  ll be reset..*/.
22c0: 73 74 61 74 69 63 20 70 69 64 5f 74 20 72 61 6e  static pid_t ran
22d0: 64 6f 6d 6e 65 73 73 50 69 64 20 3d 20 30 3b 0a  domnessPid = 0;.
22e0: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77 65 64 20 76  ./*.** Allowed v
22f0: 61 6c 75 65 73 20 66 6f 72 20 74 68 65 20 75 6e  alues for the un
2300: 69 78 46 69 6c 65 2e 63 74 72 6c 46 6c 61 67 73  ixFile.ctrlFlags
2310: 20 62 69 74 6d 61 73 6b 3a 0a 2a 2f 0a 23 64 65   bitmask:.*/.#de
2320: 66 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f 45 58  fine UNIXFILE_EX
2330: 43 4c 20 20 20 20 20 20 20 20 30 78 30 31 20 20  CL        0x01  
2340: 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e     /* Connection
2350: 73 20 66 72 6f 6d 20 6f 6e 65 20 70 72 6f 63 65  s from one proce
2360: 73 73 20 6f 6e 6c 79 20 2a 2f 0a 23 64 65 66 69  ss only */.#defi
2370: 6e 65 20 55 4e 49 58 46 49 4c 45 5f 52 44 4f 4e  ne UNIXFILE_RDON
2380: 4c 59 20 20 20 20 20 20 30 78 30 32 20 20 20 20  LY      0x02    
2390: 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 69   /* Connection i
23a0: 73 20 72 65 61 64 20 6f 6e 6c 79 20 2a 2f 0a 23  s read only */.#
23b0: 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f  define UNIXFILE_
23c0: 50 45 52 53 49 53 54 5f 57 41 4c 20 30 78 30 34  PERSIST_WAL 0x04
23d0: 20 20 20 20 20 2f 2a 20 50 65 72 73 69 73 74 65       /* Persiste
23e0: 6e 74 20 57 41 4c 20 6d 6f 64 65 20 2a 2f 0a 23  nt WAL mode */.#
23f0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 49  ifndef SQLITE_DI
2400: 53 41 42 4c 45 5f 44 49 52 53 59 4e 43 0a 23 20  SABLE_DIRSYNC.# 
2410: 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f  define UNIXFILE_
2420: 44 49 52 53 59 4e 43 20 20 20 20 30 78 30 38 20  DIRSYNC    0x08 
2430: 20 20 20 20 2f 2a 20 44 69 72 65 63 74 6f 72 79      /* Directory
2440: 20 73 79 6e 63 20 6e 65 65 64 65 64 20 2a 2f 0a   sync needed */.
2450: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 55  #else.# define U
2460: 4e 49 58 46 49 4c 45 5f 44 49 52 53 59 4e 43 20  NIXFILE_DIRSYNC 
2470: 20 20 20 30 78 30 30 0a 23 65 6e 64 69 66 0a 23     0x00.#endif.#
2480: 64 65 66 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f  define UNIXFILE_
2490: 50 53 4f 57 20 20 20 20 20 20 20 20 30 78 31 30  PSOW        0x10
24a0: 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 49       /* SQLITE_I
24b0: 4f 43 41 50 5f 50 4f 57 45 52 53 41 46 45 5f 4f  OCAP_POWERSAFE_O
24c0: 56 45 52 57 52 49 54 45 20 2a 2f 0a 23 64 65 66  VERWRITE */.#def
24d0: 69 6e 65 20 55 4e 49 58 46 49 4c 45 5f 44 45 4c  ine UNIXFILE_DEL
24e0: 45 54 45 20 20 20 20 20 20 30 78 32 30 20 20 20  ETE      0x20   
24f0: 20 20 2f 2a 20 44 65 6c 65 74 65 20 6f 6e 20 63    /* Delete on c
2500: 6c 6f 73 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  lose */.#define 
2510: 55 4e 49 58 46 49 4c 45 5f 55 52 49 20 20 20 20  UNIXFILE_URI    
2520: 20 20 20 20 20 30 78 34 30 20 20 20 20 20 2f 2a       0x40     /*
2530: 20 46 69 6c 65 6e 61 6d 65 20 6d 69 67 68 74 20   Filename might 
2540: 68 61 76 65 20 71 75 65 72 79 20 70 61 72 61 6d  have query param
2550: 65 74 65 72 73 20 2a 2f 0a 23 64 65 66 69 6e 65  eters */.#define
2560: 20 55 4e 49 58 46 49 4c 45 5f 4e 4f 4c 4f 43 4b   UNIXFILE_NOLOCK
2570: 20 20 20 20 20 20 30 78 38 30 20 20 20 20 20 2f        0x80     /
2580: 2a 20 44 6f 20 6e 6f 20 66 69 6c 65 20 6c 6f 63  * Do no file loc
2590: 6b 69 6e 67 20 2a 2f 0a 23 64 65 66 69 6e 65 20  king */.#define 
25a0: 55 4e 49 58 46 49 4c 45 5f 57 41 52 4e 45 44 20  UNIXFILE_WARNED 
25b0: 20 20 20 30 78 30 31 30 30 20 20 20 20 20 2f 2a     0x0100     /*
25c0: 20 76 65 72 69 66 79 44 62 46 69 6c 65 28 29 20   verifyDbFile() 
25d0: 77 61 72 6e 69 6e 67 73 20 69 73 73 75 65 64 20  warnings issued 
25e0: 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 46  */.#define UNIXF
25f0: 49 4c 45 5f 42 4c 4f 43 4b 20 20 20 20 20 30 78  ILE_BLOCK     0x
2600: 30 32 30 30 20 20 20 20 20 2f 2a 20 4e 65 78 74  0200     /* Next
2610: 20 53 48 4d 20 6c 6f 63 6b 20 6d 69 67 68 74 20   SHM lock might 
2620: 62 6c 6f 63 6b 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  block */../*.** 
2630: 49 6e 63 6c 75 64 65 20 63 6f 64 65 20 74 68 61  Include code tha
2640: 74 20 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61  t is common to a
2650: 6c 6c 20 6f 73 5f 2a 2e 63 20 66 69 6c 65 73 0a  ll os_*.c files.
2660: 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 6f 73 5f  */.#include "os_
2670: 63 6f 6d 6d 6f 6e 2e 68 22 0a 0a 2f 2a 0a 2a 2a  common.h"../*.**
2680: 20 44 65 66 69 6e 65 20 76 61 72 69 6f 75 73 20   Define various 
2690: 6d 61 63 72 6f 73 20 74 68 61 74 20 61 72 65 20  macros that are 
26a0: 6d 69 73 73 69 6e 67 20 66 72 6f 6d 20 73 6f 6d  missing from som
26b0: 65 20 73 79 73 74 65 6d 73 2e 0a 2a 2f 0a 23 69  e systems..*/.#i
26c0: 66 6e 64 65 66 20 4f 5f 4c 41 52 47 45 46 49 4c  fndef O_LARGEFIL
26d0: 45 0a 23 20 64 65 66 69 6e 65 20 4f 5f 4c 41 52  E.# define O_LAR
26e0: 47 45 46 49 4c 45 20 30 0a 23 65 6e 64 69 66 0a  GEFILE 0.#endif.
26f0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49  #ifdef SQLITE_DI
2700: 53 41 42 4c 45 5f 4c 46 53 0a 23 20 75 6e 64 65  SABLE_LFS.# unde
2710: 66 20 4f 5f 4c 41 52 47 45 46 49 4c 45 0a 23 20  f O_LARGEFILE.# 
2720: 64 65 66 69 6e 65 20 4f 5f 4c 41 52 47 45 46 49  define O_LARGEFI
2730: 4c 45 20 30 0a 23 65 6e 64 69 66 0a 23 69 66 6e  LE 0.#endif.#ifn
2740: 64 65 66 20 4f 5f 4e 4f 46 4f 4c 4c 4f 57 0a 23  def O_NOFOLLOW.#
2750: 20 64 65 66 69 6e 65 20 4f 5f 4e 4f 46 4f 4c 4c   define O_NOFOLL
2760: 4f 57 20 30 0a 23 65 6e 64 69 66 0a 23 69 66 6e  OW 0.#endif.#ifn
2770: 64 65 66 20 4f 5f 42 49 4e 41 52 59 0a 23 20 64  def O_BINARY.# d
2780: 65 66 69 6e 65 20 4f 5f 42 49 4e 41 52 59 20 30  efine O_BINARY 0
2790: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
27a0: 68 65 20 74 68 72 65 61 64 69 64 20 6d 61 63 72  he threadid macr
27b0: 6f 20 72 65 73 6f 6c 76 65 73 20 74 6f 20 74 68  o resolves to th
27c0: 65 20 74 68 72 65 61 64 2d 69 64 20 6f 72 20 74  e thread-id or t
27d0: 6f 20 30 2e 20 20 55 73 65 64 20 66 6f 72 0a 2a  o 0.  Used for.*
27e0: 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20 64 65  * testing and de
27f0: 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f  bugging only..*/
2800: 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48 52 45  .#if SQLITE_THRE
2810: 41 44 53 41 46 45 0a 23 64 65 66 69 6e 65 20 74  ADSAFE.#define t
2820: 68 72 65 61 64 69 64 20 70 74 68 72 65 61 64 5f  hreadid pthread_
2830: 73 65 6c 66 28 29 0a 23 65 6c 73 65 0a 23 64 65  self().#else.#de
2840: 66 69 6e 65 20 74 68 72 65 61 64 69 64 20 30 0a  fine threadid 0.
2850: 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 5f  #endif..#ifdef _
2860: 5f 41 50 50 4c 45 5f 5f 0a 23 64 65 66 69 6e 65  _APPLE__.#define
2870: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
2880: 55 50 45 52 4c 4f 43 4b 20 31 0a 23 65 6e 64 69  UPERLOCK 1.#endi
2890: 66 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e  f..#if SQLITE_EN
28a0: 41 42 4c 45 5f 53 55 50 45 52 4c 4f 43 4b 0a 23  ABLE_SUPERLOCK.#
28b0: 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 33  include "sqlite3
28c0: 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74  .h".#include <st
28d0: 72 69 6e 67 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  ring.h>.#include
28e0: 20 3c 61 73 73 65 72 74 2e 68 3e 0a 0a 2f 2a 0a   <assert.h>../*.
28f0: 2a 2a 20 41 20 73 74 72 75 63 74 75 72 65 20 74  ** A structure t
2900: 6f 20 63 6f 6c 6c 65 63 74 20 61 20 62 75 73 79  o collect a busy
2910: 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63  -handler callbac
2920: 6b 20 61 6e 64 20 61 72 67 75 6d 65 6e 74 20 61  k and argument a
2930: 6e 64 20 61 20 63 6f 75 6e 74 0a 2a 2a 20 6f 66  nd a count.** of
2940: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74   the number of t
2950: 69 6d 65 73 20 69 74 20 68 61 73 20 62 65 65 6e  imes it has been
2960: 20 69 6e 76 6f 6b 65 64 2e 0a 2a 2f 0a 73 74 72   invoked..*/.str
2970: 75 63 74 20 53 75 70 65 72 6c 6f 63 6b 42 75 73  uct SuperlockBus
2980: 79 20 7b 0a 20 20 69 6e 74 20 28 2a 78 42 75 73  y {.  int (*xBus
2990: 79 29 28 76 6f 69 64 2a 2c 69 6e 74 29 3b 20 20  y)(void*,int);  
29a0: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
29b0: 20 74 6f 20 62 75 73 79 2d 68 61 6e 64 6c 65 72   to busy-handler
29c0: 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 76   function */.  v
29d0: 6f 69 64 20 2a 70 42 75 73 79 41 72 67 3b 20 20  oid *pBusyArg;  
29e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
29f0: 2a 20 46 69 72 73 74 20 61 72 67 20 74 6f 20 70  * First arg to p
2a00: 61 73 73 20 74 6f 20 78 42 75 73 79 20 2a 2f 0a  ass to xBusy */.
2a10: 20 20 69 6e 74 20 6e 42 75 73 79 3b 20 20 20 20    int nBusy;    
2a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a30: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74    /* Number of t
2a40: 69 6d 65 73 20 78 42 75 73 79 20 68 61 73 20 62  imes xBusy has b
2a50: 65 65 6e 20 69 6e 76 6f 6b 65 64 20 2a 2f 0a 7d  een invoked */.}
2a60: 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  ;.typedef struct
2a70: 20 53 75 70 65 72 6c 6f 63 6b 42 75 73 79 20 53   SuperlockBusy S
2a80: 75 70 65 72 6c 6f 63 6b 42 75 73 79 3b 0a 0a 2f  uperlockBusy;../
2a90: 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65  *.** An instance
2aa0: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
2ab0: 67 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61  g structure is a
2ac0: 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 65 61 63  llocated for eac
2ad0: 68 20 61 63 74 69 76 65 0a 2a 2a 20 73 75 70 65  h active.** supe
2ae0: 72 6c 6f 63 6b 2e 20 54 68 65 20 6f 70 61 71 75  rlock. The opaqu
2af0: 65 20 68 61 6e 64 6c 65 20 72 65 74 75 72 6e 65  e handle returne
2b00: 64 20 62 79 20 73 71 6c 69 74 65 33 64 65 6d 6f  d by sqlite3demo
2b10: 5f 73 75 70 65 72 6c 6f 63 6b 28 29 20 69 73 0a  _superlock() is.
2b20: 2a 2a 20 61 63 74 75 61 6c 6c 79 20 61 20 70 6f  ** actually a po
2b30: 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e 73 74  inter to an inst
2b40: 61 6e 63 65 20 6f 66 20 74 68 69 73 20 73 74 72  ance of this str
2b50: 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 72 75 63  ucture..*/.struc
2b60: 74 20 53 75 70 65 72 6c 6f 63 6b 20 7b 0a 20 20  t Superlock {.  
2b70: 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20  sqlite3 *db;    
2b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b90: 2f 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e 64  /* Database hand
2ba0: 6c 65 20 75 73 65 64 20 74 6f 20 6c 6f 63 6b 20  le used to lock 
2bb0: 64 62 20 2a 2f 0a 20 20 69 6e 74 20 62 57 61 6c  db */.  int bWal
2bc0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2bd0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2be0: 69 66 20 64 62 20 69 73 20 61 20 57 41 4c 20 64  if db is a WAL d
2bf0: 61 74 61 62 61 73 65 20 2a 2f 0a 7d 3b 0a 74 79  atabase */.};.ty
2c00: 70 65 64 65 66 20 73 74 72 75 63 74 20 53 75 70  pedef struct Sup
2c10: 65 72 6c 6f 63 6b 20 53 75 70 65 72 6c 6f 63 6b  erlock Superlock
2c20: 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 43 74  ;../*.** The pCt
2c30: 78 20 70 6f 69 6e 74 65 72 20 70 61 73 73 65 64  x pointer passed
2c40: 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
2c50: 6e 20 69 73 20 61 63 74 75 61 6c 6c 79 20 61 20  n is actually a 
2c60: 70 6f 69 6e 74 65 72 20 74 6f 20 61 0a 2a 2a 20  pointer to a.** 
2c70: 53 75 70 65 72 6c 6f 63 6b 42 75 73 79 20 73 74  SuperlockBusy st
2c80: 72 75 63 74 75 72 65 2e 20 49 6e 76 6f 6b 65 20  ructure. Invoke 
2c90: 74 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72  the busy-handler
2ca0: 20 66 75 6e 63 74 69 6f 6e 20 65 6e 63 61 70 73   function encaps
2cb0: 75 6c 61 74 65 64 0a 2a 2a 20 62 79 20 74 68 65  ulated.** by the
2cc0: 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 72   structure and r
2cd0: 65 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74  eturn the result
2ce0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2cf0: 73 75 70 65 72 6c 6f 63 6b 42 75 73 79 48 61 6e  superlockBusyHan
2d00: 64 6c 65 72 28 76 6f 69 64 20 2a 70 43 74 78 2c  dler(void *pCtx,
2d10: 20 69 6e 74 20 55 4e 55 53 45 44 29 7b 0a 20 20   int UNUSED){.  
2d20: 53 75 70 65 72 6c 6f 63 6b 42 75 73 79 20 2a 70  SuperlockBusy *p
2d30: 42 75 73 79 20 3d 20 28 53 75 70 65 72 6c 6f 63  Busy = (Superloc
2d40: 6b 42 75 73 79 20 2a 29 70 43 74 78 3b 0a 20 20  kBusy *)pCtx;.  
2d50: 69 66 28 20 70 42 75 73 79 2d 3e 78 42 75 73 79  if( pBusy->xBusy
2d60: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
2d70: 20 20 72 65 74 75 72 6e 20 70 42 75 73 79 2d 3e    return pBusy->
2d80: 78 42 75 73 79 28 70 42 75 73 79 2d 3e 70 42 75  xBusy(pBusy->pBu
2d90: 73 79 41 72 67 2c 20 70 42 75 73 79 2d 3e 6e 42  syArg, pBusy->nB
2da0: 75 73 79 2b 2b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  usy++);.}../*.**
2db0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
2dc0: 73 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d  s used to determ
2dd0: 69 6e 65 20 69 66 20 74 68 65 20 6d 61 69 6e 20  ine if the main 
2de0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f  database file fo
2df0: 72 20 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e  r .** connection
2e00: 20 64 62 20 69 73 20 6f 70 65 6e 20 69 6e 20 57   db is open in W
2e10: 41 4c 20 6d 6f 64 65 20 6f 72 20 6e 6f 74 2e 20  AL mode or not. 
2e20: 49 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75  If no error occu
2e30: 72 73 20 61 6e 64 20 74 68 65 0a 2a 2a 20 64 61  rs and the.** da
2e40: 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 69  tabase file is i
2e50: 6e 20 57 41 4c 20 6d 6f 64 65 2c 20 73 65 74 20  n WAL mode, set 
2e60: 2a 70 62 57 61 6c 20 74 6f 20 74 72 75 65 20 61  *pbWal to true a
2e70: 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  nd return SQLITE
2e80: 5f 4f 4b 2e 0a 2a 2a 20 49 66 20 69 74 20 69 73  _OK..** If it is
2e90: 20 6e 6f 74 20 69 6e 20 57 41 4c 20 6d 6f 64 65   not in WAL mode
2ea0: 2c 20 73 65 74 20 2a 70 62 57 61 6c 20 74 6f 20  , set *pbWal to 
2eb0: 66 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  false..**.** If 
2ec0: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
2ed0: 20 72 65 74 75 72 6e 20 61 6e 20 53 51 4c 69 74   return an SQLit
2ee0: 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 54 68  e error code. Th
2ef0: 65 20 76 61 6c 75 65 20 6f 66 20 2a 70 62 57 61  e value of *pbWa
2f00: 6c 0a 2a 2a 20 69 73 20 75 6e 64 65 66 69 6e 65  l.** is undefine
2f10: 64 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  d in this case..
2f20: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 75  */.static int su
2f30: 70 65 72 6c 6f 63 6b 49 73 57 61 6c 28 53 75 70  perlockIsWal(Sup
2f40: 65 72 6c 6f 63 6b 20 2a 70 4c 6f 63 6b 29 7b 0a  erlock *pLock){.
2f50: 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
2f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f70: 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65    /* Return Code
2f80: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74   */.  sqlite3_st
2f90: 6d 74 20 2a 70 53 74 6d 74 3b 20 20 20 20 20 20  mt *pStmt;      
2fa0: 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 69 6c 65        /* Compile
2fb0: 64 20 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c  d PRAGMA journal
2fc0: 5f 6d 6f 64 65 20 73 74 61 74 65 6d 65 6e 74 20  _mode statement 
2fd0: 2a 2f 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  */..  rc = sqlit
2fe0: 65 33 5f 70 72 65 70 61 72 65 28 70 4c 6f 63 6b  e3_prepare(pLock
2ff0: 2d 3e 64 62 2c 20 22 50 52 41 47 4d 41 20 6d 61  ->db, "PRAGMA ma
3000: 69 6e 2e 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 22  in.journal_mode"
3010: 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29  , -1, &pStmt, 0)
3020: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
3030: 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
3040: 63 3b 0a 0a 20 20 70 4c 6f 63 6b 2d 3e 62 57 61  c;..  pLock->bWa
3050: 6c 20 3d 20 30 3b 0a 20 20 69 66 28 20 53 51 4c  l = 0;.  if( SQL
3060: 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33  ITE_ROW==sqlite3
3070: 5f 73 74 65 70 28 70 53 74 6d 74 29 20 29 7b 0a  _step(pStmt) ){.
3080: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
3090: 7a 4d 6f 64 65 20 3d 20 28 63 6f 6e 73 74 20 63  zMode = (const c
30a0: 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 63 6f  har *)sqlite3_co
30b0: 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c  lumn_text(pStmt,
30c0: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 7a 4d 6f   0);.    if( zMo
30d0: 64 65 20 26 26 20 73 74 72 6c 65 6e 28 7a 4d 6f  de && strlen(zMo
30e0: 64 65 29 3d 3d 33 20 26 26 20 73 71 6c 69 74 65  de)==3 && sqlite
30f0: 33 5f 73 74 72 6e 69 63 6d 70 28 22 77 61 6c 22  3_strnicmp("wal"
3100: 2c 20 7a 4d 6f 64 65 2c 20 33 29 3d 3d 30 20 29  , zMode, 3)==0 )
3110: 7b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 2d 3e 62  {.      pLock->b
3120: 57 61 6c 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  Wal = 1;.    }. 
3130: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 73 71 6c   }..  return sql
3140: 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
3150: 74 6d 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f  tmt);.}../*.** O
3160: 62 74 61 69 6e 20 61 6e 20 65 78 63 6c 75 73 69  btain an exclusi
3170: 76 65 20 73 68 6d 2d 6c 6f 63 6b 20 6f 6e 20 6e  ve shm-lock on n
3180: 42 79 74 65 20 62 79 74 65 73 20 73 74 61 72 74  Byte bytes start
3190: 69 6e 67 20 61 74 20 6f 66 66 73 65 74 20 69 64  ing at offset id
31a0: 78 0a 2a 2a 20 6f 66 20 74 68 65 20 66 69 6c 65  x.** of the file
31b0: 20 66 64 2e 20 49 66 20 74 68 65 20 6c 6f 63 6b   fd. If the lock
31c0: 20 63 61 6e 6e 6f 74 20 62 65 20 6f 62 74 61 69   cannot be obtai
31d0: 6e 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 2c  ned immediately,
31e0: 20 69 6e 76 6f 6b 65 0a 2a 2a 20 74 68 65 20 62   invoke.** the b
31f0: 75 73 79 2d 68 61 6e 64 6c 65 72 20 75 6e 74 69  usy-handler unti
3200: 6c 20 65 69 74 68 65 72 20 69 74 20 69 73 20 6f  l either it is o
3210: 62 74 61 69 6e 65 64 20 6f 72 20 74 68 65 20 62  btained or the b
3220: 75 73 79 2d 68 61 6e 64 6c 65 72 0a 2a 2a 20 63  usy-handler.** c
3230: 61 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73 20  allback returns 
3240: 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  0..*/.static int
3250: 20 73 75 70 65 72 6c 6f 63 6b 53 68 6d 4c 6f 63   superlockShmLoc
3260: 6b 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  k(.  sqlite3_fil
3270: 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20  e *fd,          
3280: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
3290: 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 2a 2f 0a   file handle */.
32a0: 20 20 69 6e 74 20 69 64 78 2c 20 20 20 20 20 20    int idx,      
32b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32c0: 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 73    /* Offset of s
32d0: 68 6d 2d 6c 6f 63 6b 20 74 6f 20 6f 62 74 61 69  hm-lock to obtai
32e0: 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65  n */.  int nByte
32f0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
3300: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
3310: 20 6f 66 20 63 6f 6e 73 65 63 74 69 76 65 20 62   of consective b
3320: 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a  ytes to lock */.
3330: 20 20 53 75 70 65 72 6c 6f 63 6b 42 75 73 79 20    SuperlockBusy 
3340: 2a 70 42 75 73 79 20 20 20 20 20 20 20 20 20 20  *pBusy          
3350: 20 20 2f 2a 20 42 75 73 79 2d 68 61 6e 64 6c 65    /* Busy-handle
3360: 72 20 77 72 61 70 70 65 72 20 6f 62 6a 65 63 74  r wrapper object
3370: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
3380: 0a 20 20 69 6e 74 20 28 2a 78 53 68 6d 4c 6f 63  .  int (*xShmLoc
3390: 6b 29 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  k)(sqlite3_file*
33a0: 2c 20 69 6e 74 2c 20 69 6e 74 2c 20 69 6e 74 29  , int, int, int)
33b0: 20 3d 20 66 64 2d 3e 70 4d 65 74 68 6f 64 73 2d   = fd->pMethods-
33c0: 3e 78 53 68 6d 4c 6f 63 6b 3b 0a 20 20 64 6f 20  >xShmLock;.  do 
33d0: 7b 0a 20 20 20 20 72 63 20 3d 20 78 53 68 6d 4c  {.    rc = xShmL
33e0: 6f 63 6b 28 66 64 2c 20 69 64 78 2c 20 6e 42 79  ock(fd, idx, nBy
33f0: 74 65 2c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 4c  te, SQLITE_SHM_L
3400: 4f 43 4b 7c 53 51 4c 49 54 45 5f 53 48 4d 5f 45  OCK|SQLITE_SHM_E
3410: 58 43 4c 55 53 49 56 45 29 3b 0a 20 20 7d 77 68  XCLUSIVE);.  }wh
3420: 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
3430: 42 55 53 59 20 26 26 20 73 75 70 65 72 6c 6f 63  BUSY && superloc
3440: 6b 42 75 73 79 48 61 6e 64 6c 65 72 28 28 76 6f  kBusyHandler((vo
3450: 69 64 20 2a 29 70 42 75 73 79 2c 20 30 29 20 29  id *)pBusy, 0) )
3460: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
3470: 0a 0a 2f 2a 0a 2a 2a 20 4f 62 74 61 69 6e 20 74  ../*.** Obtain t
3480: 68 65 20 65 78 74 72 61 20 6c 6f 63 6b 73 20 6f  he extra locks o
3490: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
34a0: 69 6c 65 20 72 65 71 75 69 72 65 64 20 66 6f 72  ile required for
34b0: 20 57 41 4c 20 64 61 74 61 62 61 73 65 73 2e 0a   WAL databases..
34c0: 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 73 75  ** Invoke the su
34d0: 70 70 6c 69 65 64 20 62 75 73 79 2d 68 61 6e 64  pplied busy-hand
34e0: 6c 65 72 20 61 73 20 72 65 71 75 69 72 65 64 2e  ler as required.
34f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
3500: 75 70 65 72 6c 6f 63 6b 57 61 6c 4c 6f 63 6b 28  uperlockWalLock(
3510: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
3520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3530: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68     /* Database h
3540: 61 6e 64 6c 65 20 6f 70 65 6e 20 6f 6e 20 57 41  andle open on WA
3550: 4c 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  L database */.  
3560: 53 75 70 65 72 6c 6f 63 6b 42 75 73 79 20 2a 70  SuperlockBusy *p
3570: 42 75 73 79 20 20 20 20 20 20 20 20 20 20 20 20  Busy            
3580: 2f 2a 20 42 75 73 79 20 68 61 6e 64 6c 65 72 20  /* Busy handler 
3590: 77 72 61 70 70 65 72 20 6f 62 6a 65 63 74 20 2a  wrapper object *
35a0: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  /.){.  int rc;  
35b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35c0: 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
35d0: 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74   code */.  sqlit
35e0: 65 33 5f 66 69 6c 65 20 2a 66 64 20 3d 20 30 3b  e3_file *fd = 0;
35f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
3600: 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
3610: 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 76 6f 69   handle */.  voi
3620: 64 20 76 6f 6c 61 74 69 6c 65 20 2a 70 20 3d 20  d volatile *p = 
3630: 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0;           /* 
3640: 50 6f 69 6e 74 65 72 20 74 6f 20 66 69 72 73 74  Pointer to first
3650: 20 70 61 67 65 20 6f 66 20 73 68 61 72 65 64 20   page of shared 
3660: 6d 65 6d 6f 72 79 20 2a 2f 0a 0a 20 20 2f 2a 20  memory */..  /* 
3670: 4f 62 74 61 69 6e 20 61 20 70 6f 69 6e 74 65 72  Obtain a pointer
3680: 20 74 6f 20 74 68 65 20 73 71 6c 69 74 65 33 5f   to the sqlite3_
3690: 66 69 6c 65 20 6f 62 6a 65 63 74 20 6f 70 65 6e  file object open
36a0: 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20 64 62 20   on the main db 
36b0: 66 69 6c 65 2e 20 2a 2f 0a 20 20 72 63 20 3d 20  file. */.  rc = 
36c0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e  sqlite3_file_con
36d0: 74 72 6f 6c 28 64 62 2c 20 22 6d 61 69 6e 22 2c  trol(db, "main",
36e0: 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 46 49   SQLITE_FCNTL_FI
36f0: 4c 45 5f 50 4f 49 4e 54 45 52 2c 20 28 76 6f 69  LE_POINTER, (voi
3700: 64 20 2a 29 26 66 64 29 3b 0a 20 20 69 66 28 20  d *)&fd);.  if( 
3710: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
3720: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a  return rc;..  /*
3730: 20 4f 62 74 61 69 6e 20 74 68 65 20 22 72 65 63   Obtain the "rec
3740: 6f 76 65 72 79 22 20 6c 6f 63 6b 2e 20 4e 6f 72  overy" lock. Nor
3750: 6d 61 6c 6c 79 2c 20 74 68 69 73 20 6c 6f 63 6b  mally, this lock
3760: 20 69 73 20 6f 6e 6c 79 20 6f 62 74 61 69 6e 65   is only obtaine
3770: 64 20 62 79 0a 20 20 2a 2a 20 63 6c 69 65 6e 74  d by.  ** client
3780: 73 20 72 75 6e 6e 69 6e 67 20 64 61 74 61 62 61  s running databa
3790: 73 65 20 72 65 63 6f 76 65 72 79 2e 20 20 0a 20  se recovery.  . 
37a0: 20 2a 2f 0a 20 20 72 63 20 3d 20 73 75 70 65 72   */.  rc = super
37b0: 6c 6f 63 6b 53 68 6d 4c 6f 63 6b 28 66 64 2c 20  lockShmLock(fd, 
37c0: 32 2c 20 31 2c 20 70 42 75 73 79 29 3b 0a 20 20  2, 1, pBusy);.  
37d0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
37e0: 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  K ) return rc;..
37f0: 20 20 2f 2a 20 5a 65 72 6f 20 74 68 65 20 73 74    /* Zero the st
3800: 61 72 74 20 6f 66 20 74 68 65 20 66 69 72 73 74  art of the first
3810: 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 70   shared-memory p
3820: 61 67 65 2e 20 54 68 69 73 20 6d 65 61 6e 73 20  age. This means 
3830: 74 68 61 74 20 61 6e 79 0a 20 20 2a 2a 20 63 6c  that any.  ** cl
3840: 69 65 6e 74 73 20 74 68 61 74 20 6f 70 65 6e 20  ients that open 
3850: 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72  read or write tr
3860: 61 6e 73 61 63 74 69 6f 6e 73 20 66 72 6f 6d 20  ansactions from 
3870: 74 68 69 73 20 70 6f 69 6e 74 20 6f 6e 20 77 69  this point on wi
3880: 6c 6c 0a 20 20 2a 2a 20 68 61 76 65 20 74 6f 20  ll.  ** have to 
3890: 72 75 6e 20 72 65 63 6f 76 65 72 79 20 62 65 66  run recovery bef
38a0: 6f 72 65 20 70 72 6f 63 65 65 64 69 6e 67 2e 20  ore proceeding. 
38b0: 53 69 6e 63 65 20 74 68 65 79 20 6e 65 65 64 20  Since they need 
38c0: 74 68 65 20 22 72 65 63 6f 76 65 72 79 22 0a 20  the "recovery". 
38d0: 20 2a 2a 20 6c 6f 63 6b 20 74 68 61 74 20 74 68   ** lock that th
38e0: 69 73 20 70 72 6f 63 65 73 73 20 69 73 20 68 6f  is process is ho
38f0: 6c 64 69 6e 67 20 74 6f 20 64 6f 20 74 68 61 74  lding to do that
3900: 2c 20 6e 6f 20 6e 65 77 20 72 65 61 64 20 6f 72  , no new read or
3910: 20 77 72 69 74 65 0a 20 20 2a 2a 20 74 72 61 6e   write.  ** tran
3920: 73 61 63 74 69 6f 6e 73 20 6d 61 79 20 6e 6f 77  sactions may now
3930: 20 62 65 20 6f 70 65 6e 65 64 2e 20 4e 6f 72 20   be opened. Nor 
3940: 63 61 6e 20 61 20 63 68 65 63 6b 70 6f 69 6e 74  can a checkpoint
3950: 20 62 65 20 72 75 6e 2c 20 66 6f 72 20 74 68 65   be run, for the
3960: 0a 20 20 2a 2a 20 73 61 6d 65 20 72 65 61 73 6f  .  ** same reaso
3970: 6e 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 66  n..  */.  rc = f
3980: 64 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 53 68  d->pMethods->xSh
3990: 6d 4d 61 70 28 66 64 2c 20 30 2c 20 33 32 2a 31  mMap(fd, 0, 32*1
39a0: 30 32 34 2c 20 31 2c 20 26 70 29 3b 0a 20 20 69  024, 1, &p);.  i
39b0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
39c0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
39d0: 6d 65 6d 73 65 74 28 28 76 6f 69 64 20 2a 29 70  memset((void *)p
39e0: 2c 20 30 2c 20 33 32 29 3b 0a 0a 20 20 2f 2a 20  , 0, 32);..  /* 
39f0: 4f 62 74 61 69 6e 20 65 78 63 6c 75 73 69 76 65  Obtain exclusive
3a00: 20 6c 6f 63 6b 73 20 6f 6e 20 61 6c 6c 20 74 68   locks on all th
3a10: 65 20 22 72 65 61 64 2d 6c 6f 63 6b 22 20 73 6c  e "read-lock" sl
3a20: 6f 74 73 2e 20 4f 6e 63 65 20 74 68 65 73 65 20  ots. Once these 
3a30: 6c 6f 63 6b 73 0a 20 20 2a 2a 20 61 72 65 20 68  locks.  ** are h
3a40: 65 6c 64 2c 20 69 74 20 69 73 20 67 75 61 72 61  eld, it is guara
3a50: 6e 74 65 65 64 20 74 68 61 74 20 74 68 65 72 65  nteed that there
3a60: 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 72   are no active r
3a70: 65 61 64 65 72 2c 20 77 72 69 74 65 72 20 6f 72  eader, writer or
3a80: 20 0a 20 20 2a 2a 20 63 68 65 63 6b 70 6f 69 6e   .  ** checkpoin
3a90: 74 65 72 20 63 6c 69 65 6e 74 73 2e 0a 20 20 2a  ter clients..  *
3aa0: 2f 0a 20 20 72 63 20 3d 20 73 75 70 65 72 6c 6f  /.  rc = superlo
3ab0: 63 6b 53 68 6d 4c 6f 63 6b 28 66 64 2c 20 33 2c  ckShmLock(fd, 3,
3ac0: 20 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f 43   SQLITE_SHM_NLOC
3ad0: 4b 2d 33 2c 20 70 42 75 73 79 29 3b 0a 20 20 72  K-3, pBusy);.  r
3ae0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
3af0: 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 73 75 70  ** Release a sup
3b00: 65 72 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 61  erlock held on a
3b10: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
3b20: 54 68 65 20 61 72 67 75 6d 65 6e 74 20 70 61 73  The argument pas
3b30: 73 65 64 20 74 6f 20 0a 2a 2a 20 74 68 69 73 20  sed to .** this 
3b40: 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 68 61  function must ha
3b50: 76 65 20 62 65 65 6e 20 6f 62 74 61 69 6e 65 64  ve been obtained
3b60: 20 66 72 6f 6d 20 61 20 73 75 63 63 65 73 73 66   from a successf
3b70: 75 6c 20 63 61 6c 6c 20 74 6f 0a 2a 2a 20 73 71  ul call to.** sq
3b80: 6c 69 74 65 33 64 65 6d 6f 5f 73 75 70 65 72 6c  lite3demo_superl
3b90: 6f 63 6b 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  ock()..*/.static
3ba0: 20 76 6f 69 64 20 73 71 6c 69 74 65 33 64 65 6d   void sqlite3dem
3bb0: 6f 5f 73 75 70 65 72 75 6e 6c 6f 63 6b 28 76 6f  o_superunlock(vo
3bc0: 69 64 20 2a 70 4c 6f 63 6b 29 7b 0a 20 20 53 75  id *pLock){.  Su
3bd0: 70 65 72 6c 6f 63 6b 20 2a 70 20 3d 20 28 53 75  perlock *p = (Su
3be0: 70 65 72 6c 6f 63 6b 20 2a 29 70 4c 6f 63 6b 3b  perlock *)pLock;
3bf0: 0a 20 20 69 66 28 20 70 2d 3e 62 57 61 6c 20 29  .  if( p->bWal )
3c00: 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 20 20 20  {.    int rc;   
3c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c20: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
3c30: 63 6f 64 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20  code */.    int 
3c40: 66 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 53  flags = SQLITE_S
3c50: 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49  HM_UNLOCK | SQLI
3c60: 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45  TE_SHM_EXCLUSIVE
3c70: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69  ;.    sqlite3_fi
3c80: 6c 65 20 2a 66 64 20 3d 20 30 3b 0a 20 20 20 20  le *fd = 0;.    
3c90: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c  rc = sqlite3_fil
3ca0: 65 5f 63 6f 6e 74 72 6f 6c 28 70 2d 3e 64 62 2c  e_control(p->db,
3cb0: 20 22 6d 61 69 6e 22 2c 20 53 51 4c 49 54 45 5f   "main", SQLITE_
3cc0: 46 43 4e 54 4c 5f 46 49 4c 45 5f 50 4f 49 4e 54  FCNTL_FILE_POINT
3cd0: 45 52 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ER,.            
3ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3cf0: 20 28 76 6f 69 64 20 2a 29 26 66 64 29 3b 0a 20   (void *)&fd);. 
3d00: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
3d10: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 66 64  E_OK ){.      fd
3d20: 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 53 68 6d  ->pMethods->xShm
3d30: 4c 6f 63 6b 28 66 64 2c 20 32 2c 20 31 2c 20 66  Lock(fd, 2, 1, f
3d40: 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 66 64 2d  lags);.      fd-
3d50: 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 53 68 6d 4c  >pMethods->xShmL
3d60: 6f 63 6b 28 66 64 2c 20 33 2c 20 53 51 4c 49 54  ock(fd, 3, SQLIT
3d70: 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 2d 33 2c 20 66  E_SHM_NLOCK-3, f
3d80: 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  lags);.    }.  }
3d90: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65  .  sqlite3_close
3da0: 28 70 2d 3e 64 62 29 3b 0a 20 20 73 71 6c 69 74  (p->db);.  sqlit
3db0: 65 33 5f 66 72 65 65 28 70 29 3b 0a 7d 0a 0a 2f  e3_free(p);.}../
3dc0: 2a 0a 2a 2a 20 4f 62 74 61 69 6e 20 61 20 73 75  *.** Obtain a su
3dd0: 70 65 72 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  perlock on the d
3de0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 64 65  atabase file ide
3df0: 6e 74 69 66 69 65 64 20 62 79 20 7a 50 61 74 68  ntified by zPath
3e00: 2c 20 75 73 69 6e 67 20 74 68 65 0a 2a 2a 20 6c  , using the.** l
3e10: 6f 63 6b 69 6e 67 20 70 72 69 6d 69 74 69 76 65  ocking primitive
3e20: 73 20 70 72 6f 76 69 64 65 64 20 62 79 20 56 46  s provided by VF
3e30: 53 20 7a 56 66 73 2e 20 49 66 20 73 75 63 63 65  S zVfs. If succe
3e40: 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b  ssful, SQLITE_OK
3e50: 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20   is.** returned 
3e60: 61 6e 64 20 6f 75 74 70 75 74 20 76 61 72 69 61  and output varia
3e70: 62 6c 65 20 2a 70 70 4c 6f 63 6b 20 69 73 20 70  ble *ppLock is p
3e80: 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20 61 6e  opulated with an
3e90: 20 6f 70 61 71 75 65 20 68 61 6e 64 6c 65 0a 2a   opaque handle.*
3ea0: 2a 20 74 68 61 74 20 6d 61 79 20 62 65 20 75 73  * that may be us
3eb0: 65 64 20 77 69 74 68 20 73 71 6c 69 74 65 33 64  ed with sqlite3d
3ec0: 65 6d 6f 5f 73 75 70 65 72 75 6e 6c 6f 63 6b 28  emo_superunlock(
3ed0: 29 20 74 6f 20 72 65 6c 65 61 73 65 20 74 68 65  ) to release the
3ee0: 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   lock..**.** If 
3ef0: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
3f00: 20 2a 70 70 4c 6f 63 6b 20 69 73 20 73 65 74 20   *ppLock is set 
3f10: 74 6f 20 30 20 61 6e 64 20 61 6e 20 53 51 4c 69  to 0 and an SQLi
3f20: 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 0a 2a  te error code .*
3f30: 2a 20 28 65 2e 67 2e 20 53 51 4c 49 54 45 5f 42  * (e.g. SQLITE_B
3f40: 55 53 59 29 20 69 73 20 72 65 74 75 72 6e 65 64  USY) is returned
3f50: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 72 65 71  ..**.** If a req
3f60: 75 69 72 65 64 20 6c 6f 63 6b 20 63 61 6e 6e 6f  uired lock canno
3f70: 74 20 62 65 20 6f 62 74 61 69 6e 65 64 20 69 6d  t be obtained im
3f80: 6d 65 64 69 61 74 65 6c 79 20 61 6e 64 20 74 68  mediately and th
3f90: 65 20 78 42 75 73 79 20 70 61 72 61 6d 65 74 65  e xBusy paramete
3fa0: 72 0a 2a 2a 20 74 6f 20 74 68 69 73 20 66 75 6e  r.** to this fun
3fb0: 63 74 69 6f 6e 20 69 73 20 6e 6f 74 20 4e 55 4c  ction is not NUL
3fc0: 4c 2c 20 74 68 65 6e 20 78 42 75 73 79 20 69 73  L, then xBusy is
3fd0: 20 69 6e 76 6f 6b 65 64 20 69 6e 20 74 68 65 20   invoked in the 
3fe0: 73 61 6d 65 20 77 61 79 0a 2a 2a 20 61 73 20 61  same way.** as a
3ff0: 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 72 65   busy-handler re
4000: 67 69 73 74 65 72 65 64 20 77 69 74 68 20 53 51  gistered with SQ
4010: 4c 69 74 65 20 28 75 73 69 6e 67 20 73 71 6c 69  Lite (using sqli
4020: 74 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65 72  te3_busy_handler
4030: 28 29 29 0a 2a 2a 20 75 6e 74 69 6c 20 65 69 74  ()).** until eit
4040: 68 65 72 20 74 68 65 20 6c 6f 63 6b 20 63 61 6e  her the lock can
4050: 20 62 65 20 6f 62 74 61 69 6e 65 64 20 6f 72 20   be obtained or 
4060: 74 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72  the busy-handler
4070: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
4080: 73 0a 2a 2a 20 30 20 28 69 6e 64 69 63 61 74 69  s.** 0 (indicati
4090: 6e 67 20 22 67 69 76 65 20 75 70 22 29 2e 0a 2a  ng "give up")..*
40a0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c  /.static int sql
40b0: 69 74 65 33 64 65 6d 6f 5f 73 75 70 65 72 6c 6f  ite3demo_superlo
40c0: 63 6b 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  ck(.  const char
40d0: 20 2a 7a 50 61 74 68 2c 20 20 20 20 20 20 20 20   *zPath,        
40e0: 20 20 20 20 20 20 2f 2a 20 50 61 74 68 20 74 6f        /* Path to
40f0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
4100: 6f 20 6c 6f 63 6b 20 2a 2f 0a 20 20 63 6f 6e 73  o lock */.  cons
4110: 74 20 63 68 61 72 20 2a 7a 56 66 73 2c 20 20 20  t char *zVfs,   
4120: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
4130: 46 53 20 74 6f 20 75 73 65 20 74 6f 20 61 63 63  FS to use to acc
4140: 65 73 73 20 64 61 74 61 62 61 73 65 20 66 69 6c  ess database fil
4150: 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  e */.  int flags
4160: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
4170: 20 20 20 20 2f 2a 20 41 64 64 69 74 69 6f 6e 61      /* Additiona
4180: 6c 20 66 6c 61 67 73 20 74 6f 20 70 61 73 73 20  l flags to pass 
4190: 74 6f 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f  to sqlite3_open_
41a0: 76 32 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 42  v2 */.  int (*xB
41b0: 75 73 79 29 28 76 6f 69 64 2a 2c 69 6e 74 29 2c  usy)(void*,int),
41c0: 20 20 20 20 20 20 20 20 2f 2a 20 42 75 73 79 20          /* Busy 
41d0: 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63 6b  handler callback
41e0: 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 73   */.  void *pBus
41f0: 79 41 72 67 2c 20 20 20 20 20 20 20 20 20 20 20  yArg,           
4200: 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74        /* Context
4210: 20 61 72 67 20 66 6f 72 20 62 75 73 79 20 68 61   arg for busy ha
4220: 6e 64 6c 65 72 20 2a 2f 0a 20 20 76 6f 69 64 20  ndler */.  void 
4230: 2a 2a 70 70 4c 6f 63 6b 20 20 20 20 20 20 20 20  **ppLock        
4240: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
4250: 54 3a 20 43 6f 6e 74 65 78 74 20 74 6f 20 70 61  T: Context to pa
4260: 73 73 20 74 6f 20 73 75 70 65 72 75 6e 6c 6f 63  ss to superunloc
4270: 6b 28 29 20 2a 2f 0a 29 7b 0a 20 20 53 75 70 65  k() */.){.  Supe
4280: 72 6c 6f 63 6b 42 75 73 79 20 62 75 73 79 20 3d  rlockBusy busy =
4290: 20 7b 30 2c 20 30 2c 20 30 7d 3b 20 2f 2a 20 42   {0, 0, 0}; /* B
42a0: 75 73 79 20 68 61 6e 64 6c 65 72 20 77 72 61 70  usy handler wrap
42b0: 70 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20  per object */.  
42c0: 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
42d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
42e0: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
42f0: 2f 0a 20 20 53 75 70 65 72 6c 6f 63 6b 20 2a 70  /.  Superlock *p
4300: 4c 6f 63 6b 3b 0a 0a 20 20 70 4c 6f 63 6b 20 3d  Lock;..  pLock =
4310: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
4320: 73 69 7a 65 6f 66 28 53 75 70 65 72 6c 6f 63 6b  sizeof(Superlock
4330: 29 29 3b 0a 20 20 69 66 28 20 21 70 4c 6f 63 6b  ));.  if( !pLock
4340: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
4350: 5f 4e 4f 4d 45 4d 3b 0a 20 20 6d 65 6d 73 65 74  _NOMEM;.  memset
4360: 28 70 4c 6f 63 6b 2c 20 30 2c 20 73 69 7a 65 6f  (pLock, 0, sizeo
4370: 66 28 53 75 70 65 72 6c 6f 63 6b 29 29 3b 0a 0a  f(Superlock));..
4380: 20 20 2f 2a 20 4f 70 65 6e 20 61 20 64 61 74 61    /* Open a data
4390: 62 61 73 65 20 68 61 6e 64 6c 65 20 6f 6e 20 74  base handle on t
43a0: 68 65 20 66 69 6c 65 20 74 6f 20 73 75 70 65 72  he file to super
43b0: 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 72 63 20 3d 20  lock. */.  rc = 
43c0: 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28  sqlite3_open_v2(
43d0: 0a 20 20 20 20 20 20 7a 50 61 74 68 2c 20 26 70  .      zPath, &p
43e0: 4c 6f 63 6b 2d 3e 64 62 2c 20 53 51 4c 49 54 45  Lock->db, SQLITE
43f0: 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c  _OPEN_READWRITE|
4400: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
4410: 54 45 7c 66 6c 61 67 73 2c 20 7a 56 66 73 0a 20  TE|flags, zVfs. 
4420: 20 29 3b 0a 0a 20 20 2f 2a 20 49 6e 73 74 61 6c   );..  /* Instal
4430: 6c 20 61 20 62 75 73 79 2d 68 61 6e 64 6c 65 72  l a busy-handler
4440: 20 61 6e 64 20 65 78 65 63 75 74 65 20 61 20 42   and execute a B
4450: 45 47 49 4e 20 45 58 43 4c 55 53 49 56 45 2e 20  EGIN EXCLUSIVE. 
4460: 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74 0a 20  If this is not. 
4470: 20 2a 2a 20 61 20 57 41 4c 20 64 61 74 61 62 61   ** a WAL databa
4480: 73 65 2c 20 74 68 69 73 20 69 73 20 61 6c 6c 20  se, this is all 
4490: 77 65 20 6e 65 65 64 20 74 6f 20 64 6f 2e 20 20  we need to do.  
44a0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 77 72 61  .  **.  ** A wra
44b0: 70 70 65 72 20 66 75 6e 63 74 69 6f 6e 20 69 73  pper function is
44c0: 20 75 73 65 64 20 74 6f 20 69 6e 76 6f 6b 65 20   used to invoke 
44d0: 74 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72  the busy-handler
44e0: 20 69 6e 73 74 65 61 64 20 6f 66 0a 20 20 2a 2a   instead of.  **
44f0: 20 72 65 67 69 73 74 65 72 69 6e 67 20 74 68 65   registering the
4500: 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 66 75   busy-handler fu
4510: 6e 63 74 69 6f 6e 20 73 75 70 70 6c 69 65 64 20  nction supplied 
4520: 62 79 20 74 68 65 20 75 73 65 72 20 64 69 72 65  by the user dire
4530: 63 74 6c 79 0a 20 20 2a 2a 20 77 69 74 68 20 53  ctly.  ** with S
4540: 51 4c 69 74 65 2e 20 54 68 69 73 20 69 73 20 62  QLite. This is b
4550: 65 63 61 75 73 65 20 74 68 65 20 73 61 6d 65 20  ecause the same 
4560: 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 66 75 6e  busy-handler fun
4570: 63 74 69 6f 6e 20 6d 61 79 20 62 65 0a 20 20 2a  ction may be.  *
4580: 2a 20 69 6e 76 6f 6b 65 64 20 64 69 72 65 63 74  * invoked direct
4590: 6c 79 20 6c 61 74 65 72 20 6f 6e 20 77 68 65 6e  ly later on when
45a0: 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 6f   attempting to o
45b0: 62 74 61 69 6e 20 74 68 65 20 65 78 74 72 61 20  btain the extra 
45c0: 6c 6f 63 6b 73 0a 20 20 2a 2a 20 72 65 71 75 69  locks.  ** requi
45d0: 72 65 64 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2e  red in WAL mode.
45e0: 20 42 79 20 75 73 69 6e 67 20 74 68 65 20 77 72   By using the wr
45f0: 61 70 70 65 72 2c 20 77 65 20 61 72 65 20 61 62  apper, we are ab
4600: 6c 65 20 74 6f 20 67 75 61 72 61 6e 74 65 65 0a  le to guarantee.
4610: 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20 22 6e    ** that the "n
4620: 42 75 73 79 22 20 69 6e 74 65 67 65 72 20 70 61  Busy" integer pa
4630: 72 61 6d 65 74 65 72 20 70 61 73 73 65 64 20 74  rameter passed t
4640: 6f 20 74 68 65 20 75 73 65 72 73 20 62 75 73 79  o the users busy
4650: 2d 68 61 6e 64 6c 65 72 0a 20 20 2a 2a 20 72 65  -handler.  ** re
4660: 70 72 65 73 65 6e 74 73 20 74 68 65 20 74 6f 74  presents the tot
4670: 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 62 75 73  al number of bus
4680: 79 2d 68 61 6e 64 6c 65 72 20 69 6e 76 6f 63 61  y-handler invoca
4690: 74 69 6f 6e 73 20 6d 61 64 65 20 77 69 74 68 69  tions made withi
46a0: 6e 0a 20 20 2a 2a 20 74 68 69 73 20 63 61 6c 6c  n.  ** this call
46b0: 20 74 6f 20 73 71 6c 69 74 65 33 64 65 6d 6f 5f   to sqlite3demo_
46c0: 73 75 70 65 72 6c 6f 63 6b 28 29 2c 20 69 6e 63  superlock(), inc
46d0: 6c 75 64 69 6e 67 20 61 6e 79 20 6d 61 64 65 20  luding any made 
46e0: 64 75 72 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20  during the.  ** 
46f0: 22 42 45 47 49 4e 20 45 58 43 4c 55 53 49 56 45  "BEGIN EXCLUSIVE
4700: 22 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63  "..  */.  if( rc
4710: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
4720: 20 20 20 62 75 73 79 2e 78 42 75 73 79 20 3d 20     busy.xBusy = 
4730: 78 42 75 73 79 3b 0a 20 20 20 20 62 75 73 79 2e  xBusy;.    busy.
4740: 70 42 75 73 79 41 72 67 20 3d 20 70 42 75 73 79  pBusyArg = pBusy
4750: 41 72 67 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Arg;.    sqlite3
4760: 5f 62 75 73 79 5f 68 61 6e 64 6c 65 72 28 70 4c  _busy_handler(pL
4770: 6f 63 6b 2d 3e 64 62 2c 20 73 75 70 65 72 6c 6f  ock->db, superlo
4780: 63 6b 42 75 73 79 48 61 6e 64 6c 65 72 2c 20 28  ckBusyHandler, (
4790: 76 6f 69 64 20 2a 29 26 62 75 73 79 29 3b 0a 20  void *)&busy);. 
47a0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
47b0: 65 78 65 63 28 70 4c 6f 63 6b 2d 3e 64 62 2c 20  exec(pLock->db, 
47c0: 22 42 45 47 49 4e 20 45 58 43 4c 55 53 49 56 45  "BEGIN EXCLUSIVE
47d0: 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 7d  ", 0, 0, 0);.  }
47e0: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 42 45  ..  /* If the BE
47f0: 47 49 4e 20 45 58 43 4c 55 53 49 56 45 20 77 61  GIN EXCLUSIVE wa
4800: 73 20 65 78 65 63 75 74 65 64 20 73 75 63 63 65  s executed succe
4810: 73 73 66 75 6c 6c 79 20 61 6e 64 20 74 68 69 73  ssfully and this
4820: 20 69 73 20 61 20 57 41 4c 0a 20 20 2a 2a 20 64   is a WAL.  ** d
4830: 61 74 61 62 61 73 65 2c 20 63 61 6c 6c 20 73 75  atabase, call su
4840: 70 65 72 6c 6f 63 6b 57 61 6c 4c 6f 63 6b 28 29  perlockWalLock()
4850: 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 65   to obtain the e
4860: 78 74 72 61 20 6c 6f 63 6b 73 20 72 65 71 75 69  xtra locks requi
4870: 72 65 64 0a 20 20 2a 2a 20 74 6f 20 70 72 65 76  red.  ** to prev
4880: 65 6e 74 20 72 65 61 64 65 72 73 2c 20 77 72 69  ent readers, wri
4890: 74 65 72 73 20 61 6e 64 2f 6f 72 20 63 68 65 63  ters and/or chec
48a0: 6b 70 6f 69 6e 74 65 72 73 20 66 72 6f 6d 20 61  kpointers from a
48b0: 63 63 65 73 73 69 6e 67 20 74 68 65 0a 20 20 2a  ccessing the.  *
48c0: 2a 20 64 62 20 77 68 69 6c 65 20 74 68 69 73 20  * db while this 
48d0: 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64 69  process is holdi
48e0: 6e 67 20 74 68 65 20 73 75 70 65 72 6c 6f 63 6b  ng the superlock
48f0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 42 65 66 6f  ..  **.  ** Befo
4900: 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20 61 6e  re attempting an
4910: 79 20 57 41 4c 20 6c 6f 63 6b 73 2c 20 63 6f 6d  y WAL locks, com
4920: 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61 63 74  mit the transact
4930: 69 6f 6e 20 73 74 61 72 74 65 64 20 61 62 6f 76  ion started abov
4940: 65 0a 20 20 2a 2a 20 74 6f 20 64 72 6f 70 20 74  e.  ** to drop t
4950: 68 65 20 57 41 4c 20 72 65 61 64 20 61 6e 64 20  he WAL read and 
4960: 77 72 69 74 65 20 6c 6f 63 6b 73 20 63 75 72 72  write locks curr
4970: 65 6e 74 6c 79 20 68 65 6c 64 2e 20 4f 74 68 65  ently held. Othe
4980: 72 77 69 73 65 2c 20 74 68 65 0a 20 20 2a 2a 20  rwise, the.  ** 
4990: 6e 65 77 20 57 41 4c 20 6c 6f 63 6b 73 20 6d 61  new WAL locks ma
49a0: 79 20 63 6f 6e 66 6c 69 63 74 20 77 69 74 68 20  y conflict with 
49b0: 74 68 65 20 6f 6c 64 2e 0a 20 20 2a 2f 0a 20 20  the old..  */.  
49c0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
49d0: 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 53 51 4c  K ){.    if( SQL
49e0: 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 73 75  ITE_OK==(rc = su
49f0: 70 65 72 6c 6f 63 6b 49 73 57 61 6c 28 70 4c 6f  perlockIsWal(pLo
4a00: 63 6b 29 29 20 26 26 20 70 4c 6f 63 6b 2d 3e 62  ck)) && pLock->b
4a10: 57 61 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20  Wal ){.      rc 
4a20: 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70  = sqlite3_exec(p
4a30: 4c 6f 63 6b 2d 3e 64 62 2c 20 22 43 4f 4d 4d 49  Lock->db, "COMMI
4a40: 54 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  T", 0, 0, 0);.  
4a50: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
4a60: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
4a70: 20 72 63 20 3d 20 73 75 70 65 72 6c 6f 63 6b 57   rc = superlockW
4a80: 61 6c 4c 6f 63 6b 28 70 4c 6f 63 6b 2d 3e 64 62  alLock(pLock->db
4a90: 2c 20 26 62 75 73 79 29 3b 0a 20 20 20 20 20 20  , &busy);.      
4aa0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  }.    }.  }..  i
4ab0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
4ac0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 64   ){.    sqlite3d
4ad0: 65 6d 6f 5f 73 75 70 65 72 75 6e 6c 6f 63 6b 28  emo_superunlock(
4ae0: 70 4c 6f 63 6b 29 3b 0a 20 20 20 20 2a 70 70 4c  pLock);.    *ppL
4af0: 6f 63 6b 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  ock = 0;.  }else
4b00: 7b 0a 20 20 20 20 2a 70 70 4c 6f 63 6b 20 3d 20  {.    *ppLock = 
4b10: 70 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65  pLock;.  }..  re
4b20: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 41  turn rc;.}../* A
4b30: 20 63 6f 72 72 75 70 74 20 44 42 20 77 6f 6e 27   corrupt DB won'
4b40: 74 20 77 6f 72 6b 20 77 69 74 68 20 74 68 65 20  t work with the 
4b50: 73 71 6c 2d 62 61 73 65 64 20 6c 6f 63 6b 69 6e  sql-based lockin
4b60: 67 20 61 74 74 65 6d 70 74 2c 20 67 72 61 62 20  g attempt, grab 
4b70: 61 6e 20 0a 2a 2a 20 65 78 63 6c 75 73 69 76 65  an .** exclusive
4b80: 20 6c 6f 63 6b 20 61 6e 64 20 72 65 74 75 72 6e   lock and return
4b90: 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 72 20 53 51   SQLITE_OK or SQ
4ba0: 4c 49 54 45 5f 42 55 53 59 20 69 66 20 74 68 65  LITE_BUSY if the
4bb0: 20 6c 6f 63 6b 20 66 61 69 6c 73 20 0a 2a 2a 20   lock fails .** 
4bc0: 72 65 74 75 72 6e 73 20 74 68 65 20 63 75 72 72  returns the curr
4bd0: 65 6e 74 20 6c 6f 63 6b 20 6c 65 76 65 6c 20 68  ent lock level h
4be0: 65 6c 64 20 6f 6e 20 73 71 6c 69 74 65 33 5f 66  eld on sqlite3_f
4bf0: 69 6c 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ile.*/.static in
4c00: 74 20 73 71 6c 69 74 65 33 64 65 6d 6f 5f 73 75  t sqlite3demo_su
4c10: 70 65 72 6c 6f 63 6b 5f 63 6f 72 72 75 70 74 28  perlock_corrupt(
4c20: 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
4c30: 2a 69 64 2c 0a 20 20 69 6e 74 20 65 54 61 72 67  *id,.  int eTarg
4c40: 65 74 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20 69 6e  etFileLock,.  in
4c50: 74 20 2a 70 46 69 6c 65 4c 6f 63 6b 0a 29 7b 0a  t *pFileLock.){.
4c60: 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
4c70: 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
4c80: 64 3b 0a 20 20 69 6e 74 20 65 46 69 6c 65 4c 6f  d;.  int eFileLo
4c90: 63 6b 20 3d 20 70 46 69 6c 65 2d 3e 65 46 69 6c  ck = pFile->eFil
4ca0: 65 4c 6f 63 6b 3b 0a 20 20 69 6e 74 20 72 63 20  eLock;.  int rc 
4cb0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 0a  = SQLITE_OK;.  .
4cc0: 20 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3c    if( eFileLock<
4cd0: 65 54 61 72 67 65 74 46 69 6c 65 4c 6f 63 6b 20  eTargetFileLock 
4ce0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 46 69 6c  ){.    rc = pFil
4cf0: 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63  e->pMethod->xLoc
4d00: 6b 28 69 64 2c 20 53 51 4c 49 54 45 5f 4c 4f 43  k(id, SQLITE_LOC
4d10: 4b 5f 53 48 41 52 45 44 29 3b 0a 20 20 7d 0a 20  K_SHARED);.  }. 
4d20: 20 69 66 28 20 21 72 63 20 26 26 20 53 51 4c 49   if( !rc && SQLI
4d30: 54 45 5f 4c 4f 43 4b 5f 53 48 41 52 45 44 3c 65  TE_LOCK_SHARED<e
4d40: 54 61 72 67 65 74 46 69 6c 65 4c 6f 63 6b 20 29  TargetFileLock )
4d50: 7b 0a 20 20 20 20 72 63 20 3d 20 70 46 69 6c 65  {.    rc = pFile
4d60: 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b  ->pMethod->xLock
4d70: 28 69 64 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  (id, SQLITE_LOCK
4d80: 5f 45 58 43 4c 55 53 49 56 45 29 3b 0a 20 20 7d  _EXCLUSIVE);.  }
4d90: 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
4da0: 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c   if( pFile->eFil
4db0: 65 4c 6f 63 6b 20 3e 20 65 46 69 6c 65 4c 6f 63  eLock > eFileLoc
4dc0: 6b 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  k ){.      pFile
4dd0: 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f  ->pMethod->xUnlo
4de0: 63 6b 28 69 64 2c 20 65 46 69 6c 65 4c 6f 63 6b  ck(id, eFileLock
4df0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  );.    }.    ret
4e00: 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66  urn rc;.  }.  if
4e10: 20 28 70 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20   (pFileLock) {. 
4e20: 20 20 20 2a 70 46 69 6c 65 4c 6f 63 6b 20 3d 20     *pFileLock = 
4e30: 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 7d 0a 20  eFileLock;.  }. 
4e40: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
4e50: 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74  K;.}..static int
4e60: 20 73 71 6c 69 74 65 33 64 65 6d 6f 5f 73 75 70   sqlite3demo_sup
4e70: 65 72 75 6e 6c 6f 63 6b 5f 63 6f 72 72 75 70 74  erunlock_corrupt
4e80: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
4e90: 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b  d, int eFileLock
4ea0: 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  ) {.  unixFile *
4eb0: 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
4ec0: 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20 72 63 20  e*)id;.  int rc 
4ed0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 0a  = SQLITE_OK;.  .
4ee0: 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69    if( pFile->eFi
4ef0: 6c 65 4c 6f 63 6b 20 3e 20 65 46 69 6c 65 4c 6f  leLock > eFileLo
4f00: 63 6b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  ck ){.    rc = p
4f10: 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78  File->pMethod->x
4f20: 55 6e 6c 6f 63 6b 28 69 64 2c 20 53 51 4c 49 54  Unlock(id, SQLIT
4f30: 45 5f 4c 4f 43 4b 5f 53 48 41 52 45 44 29 3b 0a  E_LOCK_SHARED);.
4f40: 20 20 7d 0a 20 20 69 66 28 20 70 46 69 6c 65 2d    }.  if( pFile-
4f50: 3e 65 46 69 6c 65 4c 6f 63 6b 20 3e 20 65 46 69  >eFileLock > eFi
4f60: 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 69 6e  leLock ){.    in
4f70: 74 20 75 6e 6c 6f 63 6b 52 43 20 3d 20 70 46 69  t unlockRC = pFi
4f80: 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 55 6e  le->pMethod->xUn
4f90: 6c 6f 63 6b 28 69 64 2c 20 53 51 4c 49 54 45 5f  lock(id, SQLITE_
4fa0: 4c 4f 43 4b 5f 4e 4f 4e 45 29 3b 0a 20 20 20 20  LOCK_NONE);.    
4fb0: 69 66 20 28 21 72 63 29 20 72 63 20 3d 20 75 6e  if (!rc) rc = un
4fc0: 6c 6f 63 6b 52 43 3b 0a 20 20 7d 0a 20 20 72 65  lockRC;.  }.  re
4fd0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6e 64  turn rc;.}..#end
4fe0: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41  if /* SQLITE_ENA
4ff0: 42 4c 45 5f 53 55 50 45 52 4c 4f 43 4b 20 2a 2f  BLE_SUPERLOCK */
5000: 0a 0a 0a 2f 2a 0a 2a 2a 20 48 41 56 45 5f 4d 52  .../*.** HAVE_MR
5010: 45 4d 41 50 20 64 65 66 61 75 6c 74 73 20 74 6f  EMAP defaults to
5020: 20 74 72 75 65 20 6f 6e 20 4c 69 6e 75 78 20 61   true on Linux a
5030: 6e 64 20 66 61 6c 73 65 20 65 76 65 72 79 77 68  nd false everywh
5040: 65 72 65 20 65 6c 73 65 2e 0a 2a 2f 0a 23 69 66  ere else..*/.#if
5050: 20 21 64 65 66 69 6e 65 64 28 48 41 56 45 5f 4d   !defined(HAVE_M
5060: 52 45 4d 41 50 29 0a 23 20 69 66 20 64 65 66 69  REMAP).# if defi
5070: 6e 65 64 28 5f 5f 6c 69 6e 75 78 5f 5f 29 20 26  ned(__linux__) &
5080: 26 20 64 65 66 69 6e 65 64 28 5f 47 4e 55 5f 53  & defined(_GNU_S
5090: 4f 55 52 43 45 29 0a 23 20 20 64 65 66 69 6e 65  OURCE).#  define
50a0: 20 48 41 56 45 5f 4d 52 45 4d 41 50 20 31 0a 23   HAVE_MREMAP 1.#
50b0: 20 65 6c 73 65 0a 23 20 20 64 65 66 69 6e 65 20   else.#  define 
50c0: 48 41 56 45 5f 4d 52 45 4d 41 50 20 30 0a 23 20  HAVE_MREMAP 0.# 
50d0: 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 2f 2a  endif.#endif../*
50e0: 0a 2a 2a 20 45 78 70 6c 69 63 69 74 6c 79 20 63  .** Explicitly c
50f0: 61 6c 6c 20 74 68 65 20 36 34 2d 62 69 74 20 76  all the 64-bit v
5100: 65 72 73 69 6f 6e 20 6f 66 20 6c 73 65 65 6b 28  ersion of lseek(
5110: 29 20 6f 6e 20 41 6e 64 72 6f 69 64 2e 20 4f 74  ) on Android. Ot
5120: 68 65 72 77 69 73 65 2c 20 6c 73 65 65 6b 28 29  herwise, lseek()
5130: 0a 2a 2a 20 69 73 20 74 68 65 20 33 32 2d 62 69  .** is the 32-bi
5140: 74 20 76 65 72 73 69 6f 6e 2c 20 65 76 65 6e 20  t version, even 
5150: 69 66 20 5f 46 49 4c 45 5f 4f 46 46 53 45 54 5f  if _FILE_OFFSET_
5160: 42 49 54 53 3d 36 34 20 69 73 20 64 65 66 69 6e  BITS=64 is defin
5170: 65 64 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 5f 5f  ed..*/.#ifdef __
5180: 41 4e 44 52 4f 49 44 5f 5f 0a 23 20 64 65 66 69  ANDROID__.# defi
5190: 6e 65 20 6c 73 65 65 6b 20 6c 73 65 65 6b 36 34  ne lseek lseek64
51a0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44  .#endif../*.** D
51b0: 69 66 66 65 72 65 6e 74 20 55 6e 69 78 20 73 79  ifferent Unix sy
51c0: 73 74 65 6d 73 20 64 65 63 6c 61 72 65 20 6f 70  stems declare op
51d0: 65 6e 28 29 20 69 6e 20 64 69 66 66 65 72 65 6e  en() in differen
51e0: 74 20 77 61 79 73 2e 20 20 53 61 6d 65 20 75 73  t ways.  Same us
51f0: 65 0a 2a 2a 20 6f 70 65 6e 28 63 6f 6e 73 74 20  e.** open(const 
5200: 63 68 61 72 2a 2c 69 6e 74 2c 6d 6f 64 65 5f 74  char*,int,mode_t
5210: 29 2e 20 20 4f 74 68 65 72 73 20 75 73 65 20 6f  ).  Others use o
5220: 70 65 6e 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c  pen(const char*,
5230: 69 6e 74 2c 2e 2e 2e 29 2e 0a 2a 2a 20 54 68 65  int,...)..** The
5240: 20 64 69 66 66 65 72 65 6e 63 65 20 69 73 20 69   difference is i
5250: 6d 70 6f 72 74 61 6e 74 20 77 68 65 6e 20 75 73  mportant when us
5260: 69 6e 67 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  ing a pointer to
5270: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a   the function..*
5280: 2a 0a 2a 2a 20 54 68 65 20 73 61 66 65 73 74 20  *.** The safest 
5290: 77 61 79 20 74 6f 20 64 65 61 6c 20 77 69 74 68  way to deal with
52a0: 20 74 68 65 20 70 72 6f 62 6c 65 6d 20 69 73 20   the problem is 
52b0: 74 6f 20 61 6c 77 61 79 73 20 75 73 65 20 74 68  to always use th
52c0: 69 73 20 77 72 61 70 70 65 72 0a 2a 2a 20 77 68  is wrapper.** wh
52d0: 69 63 68 20 61 6c 77 61 79 73 20 68 61 73 20 74  ich always has t
52e0: 68 65 20 73 61 6d 65 20 77 65 6c 6c 2d 64 65 66  he same well-def
52f0: 69 6e 65 64 20 69 6e 74 65 72 66 61 63 65 2e 0a  ined interface..
5300: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 6f  */.static int po
5310: 73 69 78 4f 70 65 6e 28 63 6f 6e 73 74 20 63 68  sixOpen(const ch
5320: 61 72 20 2a 7a 46 69 6c 65 2c 20 69 6e 74 20 66  ar *zFile, int f
5330: 6c 61 67 73 2c 20 69 6e 74 20 6d 6f 64 65 29 7b  lags, int mode){
5340: 0a 20 20 72 65 74 75 72 6e 20 6f 70 65 6e 28 7a  .  return open(z
5350: 46 69 6c 65 2c 20 66 6c 61 67 73 2c 20 6d 6f 64  File, flags, mod
5360: 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 6e 20  e);.}../*.** On 
5370: 73 6f 6d 65 20 73 79 73 74 65 6d 73 2c 20 63 61  some systems, ca
5380: 6c 6c 73 20 74 6f 20 66 63 68 6f 77 6e 28 29 20  lls to fchown() 
5390: 77 69 6c 6c 20 74 72 69 67 67 65 72 20 61 20 6d  will trigger a m
53a0: 65 73 73 61 67 65 20 69 6e 20 61 20 73 65 63 75  essage in a secu
53b0: 72 69 74 79 0a 2a 2a 20 6c 6f 67 20 69 66 20 74  rity.** log if t
53c0: 68 65 79 20 63 6f 6d 65 20 66 72 6f 6d 20 6e 6f  hey come from no
53d0: 6e 2d 72 6f 6f 74 20 70 72 6f 63 65 73 73 65 73  n-root processes
53e0: 2e 20 20 53 6f 20 61 76 6f 69 64 20 63 61 6c 6c  .  So avoid call
53f0: 69 6e 67 20 66 63 68 6f 77 6e 28 29 20 69 66 0a  ing fchown() if.
5400: 2a 2a 20 77 65 20 61 72 65 20 6e 6f 74 20 72 75  ** we are not ru
5410: 6e 6e 69 6e 67 20 61 73 20 72 6f 6f 74 2e 0a 2a  nning as root..*
5420: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 6f 73  /.static int pos
5430: 69 78 46 63 68 6f 77 6e 28 69 6e 74 20 66 64 2c  ixFchown(int fd,
5440: 20 75 69 64 5f 74 20 75 69 64 2c 20 67 69 64 5f   uid_t uid, gid_
5450: 74 20 67 69 64 29 7b 0a 23 69 66 20 4f 53 5f 56  t gid){.#if OS_V
5460: 58 57 4f 52 4b 53 0a 20 20 72 65 74 75 72 6e 20  XWORKS.  return 
5470: 30 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74 75 72  0;.#else.  retur
5480: 6e 20 67 65 74 65 75 69 64 28 29 20 3f 20 30 20  n geteuid() ? 0 
5490: 3a 20 66 63 68 6f 77 6e 28 66 64 2c 75 69 64 2c  : fchown(fd,uid,
54a0: 67 69 64 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  gid);.#endif.}..
54b0: 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72  /* Forward refer
54c0: 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 69  ence */.static i
54d0: 6e 74 20 6f 70 65 6e 44 69 72 65 63 74 6f 72 79  nt openDirectory
54e0: 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20 69 6e  (const char*, in
54f0: 74 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  t*);.static int 
5500: 75 6e 69 78 47 65 74 70 61 67 65 73 69 7a 65 28  unixGetpagesize(
5510: 76 6f 69 64 29 3b 0a 0a 2f 2a 0a 2a 2a 20 4d 61  void);../*.** Ma
5520: 6e 79 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20  ny system calls 
5530: 61 72 65 20 61 63 63 65 73 73 65 64 20 74 68 72  are accessed thr
5540: 6f 75 67 68 20 70 6f 69 6e 74 65 72 2d 74 6f 2d  ough pointer-to-
5550: 66 75 6e 63 74 69 6f 6e 73 20 73 6f 20 74 68 61  functions so tha
5560: 74 0a 2a 2a 20 74 68 65 79 20 6d 61 79 20 62 65  t.** they may be
5570: 20 6f 76 65 72 72 69 64 64 65 6e 20 61 74 20 72   overridden at r
5580: 75 6e 74 69 6d 65 20 74 6f 20 66 61 63 69 6c 69  untime to facili
5590: 74 61 74 65 20 66 61 75 6c 74 20 69 6e 6a 65 63  tate fault injec
55a0: 74 69 6f 6e 20 64 75 72 69 6e 67 0a 2a 2a 20 74  tion during.** t
55b0: 65 73 74 69 6e 67 20 61 6e 64 20 73 61 6e 64 62  esting and sandb
55c0: 6f 78 69 6e 67 2e 20 20 54 68 65 20 66 6f 6c 6c  oxing.  The foll
55d0: 6f 77 69 6e 67 20 61 72 72 61 79 20 68 6f 6c 64  owing array hold
55e0: 73 20 74 68 65 20 6e 61 6d 65 73 20 61 6e 64 20  s the names and 
55f0: 70 6f 69 6e 74 65 72 73 0a 2a 2a 20 74 6f 20 61  pointers.** to a
5600: 6c 6c 20 6f 76 65 72 72 69 64 65 61 62 6c 65 20  ll overrideable 
5610: 73 79 73 74 65 6d 20 63 61 6c 6c 73 2e 0a 2a 2f  system calls..*/
5620: 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20 75  .static struct u
5630: 6e 69 78 5f 73 79 73 63 61 6c 6c 20 7b 0a 20 20  nix_syscall {.  
5640: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
5650: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
5660: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 73 79 73   Name of the sys
5670: 74 65 6d 20 63 61 6c 6c 20 2a 2f 0a 20 20 73 71  tem call */.  sq
5680: 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74  lite3_syscall_pt
5690: 72 20 70 43 75 72 72 65 6e 74 3b 20 2f 2a 20 43  r pCurrent; /* C
56a0: 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20  urrent value of 
56b0: 74 68 65 20 73 79 73 74 65 6d 20 63 61 6c 6c 20  the system call 
56c0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 79 73  */.  sqlite3_sys
56d0: 63 61 6c 6c 5f 70 74 72 20 70 44 65 66 61 75 6c  call_ptr pDefaul
56e0: 74 3b 20 2f 2a 20 44 65 66 61 75 6c 74 20 76 61  t; /* Default va
56f0: 6c 75 65 20 2a 2f 0a 7d 20 61 53 79 73 63 61 6c  lue */.} aSyscal
5700: 6c 5b 5d 20 3d 20 7b 0a 20 20 7b 20 22 6f 70 65  l[] = {.  { "ope
5710: 6e 22 2c 20 20 20 20 20 20 20 20 20 28 73 71 6c  n",         (sql
5720: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
5730: 29 70 6f 73 69 78 4f 70 65 6e 2c 20 20 30 20 20  )posixOpen,  0  
5740: 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 4f 70 65  },.#define osOpe
5750: 6e 20 20 20 20 20 20 28 28 69 6e 74 28 2a 29 28  n      ((int(*)(
5760: 63 6f 6e 73 74 20 63 68 61 72 2a 2c 69 6e 74 2c  const char*,int,
5770: 69 6e 74 29 29 61 53 79 73 63 61 6c 6c 5b 30 5d  int))aSyscall[0]
5780: 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20  .pCurrent)..  { 
5790: 22 63 6c 6f 73 65 22 2c 20 20 20 20 20 20 20 20  "close",        
57a0: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
57b0: 5f 70 74 72 29 63 6c 6f 73 65 2c 20 20 20 20 20  _ptr)close,     
57c0: 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f   0  },.#define o
57d0: 73 43 6c 6f 73 65 20 20 20 20 20 28 28 69 6e 74  sClose     ((int
57e0: 28 2a 29 28 69 6e 74 29 29 61 53 79 73 63 61 6c  (*)(int))aSyscal
57f0: 6c 5b 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  l[1].pCurrent)..
5800: 20 20 7b 20 22 61 63 63 65 73 73 22 2c 20 20 20    { "access",   
5810: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
5820: 63 61 6c 6c 5f 70 74 72 29 61 63 63 65 73 73 2c  call_ptr)access,
5830: 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69       0  },.#defi
5840: 6e 65 20 6f 73 41 63 63 65 73 73 20 20 20 20 28  ne osAccess    (
5850: 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68  (int(*)(const ch
5860: 61 72 2a 2c 69 6e 74 29 29 61 53 79 73 63 61 6c  ar*,int))aSyscal
5870: 6c 5b 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  l[2].pCurrent)..
5880: 20 20 7b 20 22 67 65 74 63 77 64 22 2c 20 20 20    { "getcwd",   
5890: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
58a0: 63 61 6c 6c 5f 70 74 72 29 67 65 74 63 77 64 2c  call_ptr)getcwd,
58b0: 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69       0  },.#defi
58c0: 6e 65 20 6f 73 47 65 74 63 77 64 20 20 20 20 28  ne osGetcwd    (
58d0: 28 63 68 61 72 2a 28 2a 29 28 63 68 61 72 2a 2c  (char*(*)(char*,
58e0: 73 69 7a 65 5f 74 29 29 61 53 79 73 63 61 6c 6c  size_t))aSyscall
58f0: 5b 33 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  [3].pCurrent).. 
5900: 20 7b 20 22 73 74 61 74 22 2c 20 20 20 20 20 20   { "stat",      
5910: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
5920: 61 6c 6c 5f 70 74 72 29 73 74 61 74 2c 20 20 20  all_ptr)stat,   
5930: 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69 6e      0  },.#defin
5940: 65 20 6f 73 53 74 61 74 20 20 20 20 20 20 28 28  e osStat      ((
5950: 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61  int(*)(const cha
5960: 72 2a 2c 73 74 72 75 63 74 20 73 74 61 74 2a 29  r*,struct stat*)
5970: 29 61 53 79 73 63 61 6c 6c 5b 34 5d 2e 70 43 75  )aSyscall[4].pCu
5980: 72 72 65 6e 74 29 0a 0a 2f 2a 0a 2a 2a 20 54 68  rrent)../*.** Th
5990: 65 20 44 4a 47 50 50 20 63 6f 6d 70 69 6c 65 72  e DJGPP compiler
59a0: 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 6c 6f 6f   environment loo
59b0: 6b 73 20 6d 6f 73 74 6c 79 20 6c 69 6b 65 20 55  ks mostly like U
59c0: 6e 69 78 2c 20 62 75 74 20 69 74 0a 2a 2a 20 6c  nix, but it.** l
59d0: 61 63 6b 73 20 74 68 65 20 66 63 6e 74 6c 28 29  acks the fcntl()
59e0: 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20 53   system call.  S
59f0: 6f 20 72 65 64 65 66 69 6e 65 20 66 63 6e 74 6c  o redefine fcntl
5a00: 28 29 20 74 6f 20 62 65 20 73 6f 6d 65 74 68 69  () to be somethi
5a10: 6e 67 0a 2a 2a 20 74 68 61 74 20 61 6c 77 61 79  ng.** that alway
5a20: 73 20 73 75 63 63 65 65 64 73 2e 20 20 54 68 69  s succeeds.  Thi
5a30: 73 20 6d 65 61 6e 73 20 74 68 61 74 20 6c 6f 63  s means that loc
5a40: 6b 69 6e 67 20 64 6f 65 73 20 6e 6f 74 20 6f 63  king does not oc
5a50: 63 75 72 20 75 6e 64 65 72 0a 2a 2a 20 44 4a 47  cur under.** DJG
5a60: 50 50 2e 20 20 42 75 74 20 69 74 20 69 73 20 44  PP.  But it is D
5a70: 4f 53 20 2d 20 77 68 61 74 20 64 69 64 20 79 6f  OS - what did yo
5a80: 75 20 65 78 70 65 63 74 3f 0a 2a 2f 0a 23 69 66  u expect?.*/.#if
5a90: 64 65 66 20 5f 5f 44 4a 47 50 50 5f 5f 0a 20 20  def __DJGPP__.  
5aa0: 7b 20 22 66 73 74 61 74 22 2c 20 20 20 20 20 20  { "fstat",      
5ab0: 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20    0,            
5ac0: 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69       0  },.#defi
5ad0: 6e 65 20 6f 73 46 73 74 61 74 28 61 2c 62 2c 63  ne osFstat(a,b,c
5ae0: 29 20 20 20 20 30 0a 23 65 6c 73 65 20 20 20 20  )    0.#else    
5af0: 20 0a 20 20 7b 20 22 66 73 74 61 74 22 2c 20 20   .  { "fstat",  
5b00: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73        (sqlite3_s
5b10: 79 73 63 61 6c 6c 5f 70 74 72 29 66 73 74 61 74  yscall_ptr)fstat
5b20: 2c 20 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65  ,      0  },.#de
5b30: 66 69 6e 65 20 6f 73 46 73 74 61 74 20 20 20 20  fine osFstat    
5b40: 20 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c 73 74   ((int(*)(int,st
5b50: 72 75 63 74 20 73 74 61 74 2a 29 29 61 53 79 73  ruct stat*))aSys
5b60: 63 61 6c 6c 5b 35 5d 2e 70 43 75 72 72 65 6e 74  call[5].pCurrent
5b70: 29 0a 23 65 6e 64 69 66 0a 0a 20 20 7b 20 22 66  ).#endif..  { "f
5b80: 74 72 75 6e 63 61 74 65 22 2c 20 20 20 20 28 73  truncate",    (s
5b90: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
5ba0: 74 72 29 66 74 72 75 6e 63 61 74 65 2c 20 20 30  tr)ftruncate,  0
5bb0: 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73 46    },.#define osF
5bc0: 74 72 75 6e 63 61 74 65 20 28 28 69 6e 74 28 2a  truncate ((int(*
5bd0: 29 28 69 6e 74 2c 6f 66 66 5f 74 29 29 61 53 79  )(int,off_t))aSy
5be0: 73 63 61 6c 6c 5b 36 5d 2e 70 43 75 72 72 65 6e  scall[6].pCurren
5bf0: 74 29 0a 0a 20 20 7b 20 22 66 63 6e 74 6c 22 2c  t)..  { "fcntl",
5c00: 20 20 20 20 20 20 20 20 28 73 71 6c 69 74 65 33          (sqlite3
5c10: 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 66 63 6e  _syscall_ptr)fcn
5c20: 74 6c 2c 20 20 20 20 20 20 30 20 20 7d 2c 0a 23  tl,      0  },.#
5c30: 64 65 66 69 6e 65 20 6f 73 46 63 6e 74 6c 20 20  define osFcntl  
5c40: 20 20 20 28 28 69 6e 74 28 2a 29 28 69 6e 74 2c     ((int(*)(int,
5c50: 69 6e 74 2c 2e 2e 2e 29 29 61 53 79 73 63 61 6c  int,...))aSyscal
5c60: 6c 5b 37 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  l[7].pCurrent)..
5c70: 20 20 7b 20 22 72 65 61 64 22 2c 20 20 20 20 20    { "read",     
5c80: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
5c90: 63 61 6c 6c 5f 70 74 72 29 72 65 61 64 2c 20 20  call_ptr)read,  
5ca0: 20 20 20 20 20 30 20 20 7d 2c 0a 23 64 65 66 69       0  },.#defi
5cb0: 6e 65 20 6f 73 52 65 61 64 20 20 20 20 20 20 28  ne osRead      (
5cc0: 28 73 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c  (ssize_t(*)(int,
5cd0: 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 29 29 61 53  void*,size_t))aS
5ce0: 79 73 63 61 6c 6c 5b 38 5d 2e 70 43 75 72 72 65  yscall[8].pCurre
5cf0: 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  nt)..#if defined
5d00: 28 55 53 45 5f 50 52 45 41 44 29 20 7c 7c 20 53  (USE_PREAD) || S
5d10: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
5d20: 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 7b 20 22  KING_STYLE.  { "
5d30: 70 72 65 61 64 22 2c 20 20 20 20 20 20 20 20 28  pread",        (
5d40: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
5d50: 70 74 72 29 70 72 65 61 64 2c 20 20 20 20 20 20  ptr)pread,      
5d60: 30 20 20 7d 2c 0a 23 65 6c 73 65 0a 20 20 7b 20  0  },.#else.  { 
5d70: 22 70 72 65 61 64 22 2c 20 20 20 20 20 20 20 20  "pread",        
5d80: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
5d90: 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20 20 20  _ptr)0,         
5da0: 20 30 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64   0  },.#endif.#d
5db0: 65 66 69 6e 65 20 6f 73 50 72 65 61 64 20 20 20  efine osPread   
5dc0: 20 20 28 28 73 73 69 7a 65 5f 74 28 2a 29 28 69    ((ssize_t(*)(i
5dd0: 6e 74 2c 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c  nt,void*,size_t,
5de0: 6f 66 66 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b  off_t))aSyscall[
5df0: 39 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69  9].pCurrent)..#i
5e00: 66 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52  f defined(USE_PR
5e10: 45 41 44 36 34 29 0a 20 20 7b 20 22 70 72 65 61  EAD64).  { "prea
5e20: 64 36 34 22 2c 20 20 20 20 20 20 28 73 71 6c 69  d64",      (sqli
5e30: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
5e40: 70 72 65 61 64 36 34 2c 20 20 20 20 30 20 20 7d  pread64,    0  }
5e50: 2c 0a 23 65 6c 73 65 0a 20 20 7b 20 22 70 72 65  ,.#else.  { "pre
5e60: 61 64 36 34 22 2c 20 20 20 20 20 20 28 73 71 6c  ad64",      (sql
5e70: 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72  ite3_syscall_ptr
5e80: 29 30 2c 20 20 20 20 20 20 20 20 20 20 30 20 20  )0,          0  
5e90: 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e  },.#endif.#defin
5ea0: 65 20 6f 73 50 72 65 61 64 36 34 20 20 20 28 28  e osPread64   ((
5eb0: 73 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 76  ssize_t(*)(int,v
5ec0: 6f 69 64 2a 2c 73 69 7a 65 5f 74 2c 6f 66 66 5f  oid*,size_t,off_
5ed0: 74 29 29 61 53 79 73 63 61 6c 6c 5b 31 30 5d 2e  t))aSyscall[10].
5ee0: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
5ef0: 77 72 69 74 65 22 2c 20 20 20 20 20 20 20 20 28  write",        (
5f00: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
5f10: 70 74 72 29 77 72 69 74 65 2c 20 20 20 20 20 20  ptr)write,      
5f20: 30 20 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f 73  0  },.#define os
5f30: 57 72 69 74 65 20 20 20 20 20 28 28 73 73 69 7a  Write     ((ssiz
5f40: 65 5f 74 28 2a 29 28 69 6e 74 2c 63 6f 6e 73 74  e_t(*)(int,const
5f50: 20 76 6f 69 64 2a 2c 73 69 7a 65 5f 74 29 29 61   void*,size_t))a
5f60: 53 79 73 63 61 6c 6c 5b 31 31 5d 2e 70 43 75 72  Syscall[11].pCur
5f70: 72 65 6e 74 29 0a 0a 23 69 66 20 64 65 66 69 6e  rent)..#if defin
5f80: 65 64 28 55 53 45 5f 50 52 45 41 44 29 20 7c 7c  ed(USE_PREAD) ||
5f90: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
5fa0: 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 7b  OCKING_STYLE.  {
5fb0: 20 22 70 77 72 69 74 65 22 2c 20 20 20 20 20 20   "pwrite",      
5fc0: 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c   (sqlite3_syscal
5fd0: 6c 5f 70 74 72 29 70 77 72 69 74 65 2c 20 20 20  l_ptr)pwrite,   
5fe0: 20 20 30 20 20 7d 2c 0a 23 65 6c 73 65 0a 20 20    0  },.#else.  
5ff0: 7b 20 22 70 77 72 69 74 65 22 2c 20 20 20 20 20  { "pwrite",     
6000: 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61    (sqlite3_sysca
6010: 6c 6c 5f 70 74 72 29 30 2c 20 20 20 20 20 20 20  ll_ptr)0,       
6020: 20 20 20 30 20 20 7d 2c 0a 23 65 6e 64 69 66 0a     0  },.#endif.
6030: 23 64 65 66 69 6e 65 20 6f 73 50 77 72 69 74 65  #define osPwrite
6040: 20 20 20 20 28 28 73 73 69 7a 65 5f 74 28 2a 29      ((ssize_t(*)
6050: 28 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a  (int,const void*
6060: 2c 73 69 7a 65 5f 74 2c 6f 66 66 5f 74 29 29 5c  ,size_t,off_t))\
6070: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
6080: 20 20 20 20 20 61 53 79 73 63 61 6c 6c 5b 31 32       aSyscall[12
6090: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 23 69 66  ].pCurrent)..#if
60a0: 20 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45   defined(USE_PRE
60b0: 41 44 36 34 29 0a 20 20 7b 20 22 70 77 72 69 74  AD64).  { "pwrit
60c0: 65 36 34 22 2c 20 20 20 20 20 28 73 71 6c 69 74  e64",     (sqlit
60d0: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 70  e3_syscall_ptr)p
60e0: 77 72 69 74 65 36 34 2c 20 20 20 30 20 20 7d 2c  write64,   0  },
60f0: 0a 23 65 6c 73 65 0a 20 20 7b 20 22 70 77 72 69  .#else.  { "pwri
6100: 74 65 36 34 22 2c 20 20 20 20 20 28 73 71 6c 69  te64",     (sqli
6110: 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29  te3_syscall_ptr)
6120: 30 2c 20 20 20 20 20 20 20 20 20 20 30 20 20 7d  0,          0  }
6130: 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65  ,.#endif.#define
6140: 20 6f 73 50 77 72 69 74 65 36 34 20 20 28 28 73   osPwrite64  ((s
6150: 73 69 7a 65 5f 74 28 2a 29 28 69 6e 74 2c 63 6f  size_t(*)(int,co
6160: 6e 73 74 20 76 6f 69 64 2a 2c 73 69 7a 65 5f 74  nst void*,size_t
6170: 2c 6f 66 66 5f 74 29 29 5c 0a 20 20 20 20 20 20  ,off_t))\.      
6180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 53                aS
6190: 79 73 63 61 6c 6c 5b 31 33 5d 2e 70 43 75 72 72  yscall[13].pCurr
61a0: 65 6e 74 29 0a 0a 20 20 7b 20 22 66 63 68 6d 6f  ent)..  { "fchmo
61b0: 64 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74  d",       (sqlit
61c0: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 66  e3_syscall_ptr)f
61d0: 63 68 6d 6f 64 2c 20 20 20 20 20 30 20 20 7d 2c  chmod,     0  },
61e0: 0a 23 64 65 66 69 6e 65 20 6f 73 46 63 68 6d 6f  .#define osFchmo
61f0: 64 20 20 20 20 28 28 69 6e 74 28 2a 29 28 69 6e  d    ((int(*)(in
6200: 74 2c 6d 6f 64 65 5f 74 29 29 61 53 79 73 63 61  t,mode_t))aSysca
6210: 6c 6c 5b 31 34 5d 2e 70 43 75 72 72 65 6e 74 29  ll[14].pCurrent)
6220: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 48 41  ..#if defined(HA
6230: 56 45 5f 50 4f 53 49 58 5f 46 41 4c 4c 4f 43 41  VE_POSIX_FALLOCA
6240: 54 45 29 20 26 26 20 48 41 56 45 5f 50 4f 53 49  TE) && HAVE_POSI
6250: 58 5f 46 41 4c 4c 4f 43 41 54 45 0a 20 20 7b 20  X_FALLOCATE.  { 
6260: 22 66 61 6c 6c 6f 63 61 74 65 22 2c 20 20 20 20  "fallocate",    
6270: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
6280: 5f 70 74 72 29 70 6f 73 69 78 5f 66 61 6c 6c 6f  _ptr)posix_fallo
6290: 63 61 74 65 2c 20 20 30 20 7d 2c 0a 23 65 6c 73  cate,  0 },.#els
62a0: 65 0a 20 20 7b 20 22 66 61 6c 6c 6f 63 61 74 65  e.  { "fallocate
62b0: 22 2c 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73  ",    (sqlite3_s
62c0: 79 73 63 61 6c 6c 5f 70 74 72 29 30 2c 20 20 20  yscall_ptr)0,   
62d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 7d               0 }
62e0: 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66 69 6e 65  ,.#endif.#define
62f0: 20 6f 73 46 61 6c 6c 6f 63 61 74 65 20 28 28 69   osFallocate ((i
6300: 6e 74 28 2a 29 28 69 6e 74 2c 6f 66 66 5f 74 2c  nt(*)(int,off_t,
6310: 6f 66 66 5f 74 29 29 61 53 79 73 63 61 6c 6c 5b  off_t))aSyscall[
6320: 31 35 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a 20  15].pCurrent).. 
6330: 20 7b 20 22 75 6e 6c 69 6e 6b 22 2c 20 20 20 20   { "unlink",    
6340: 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73 63     (sqlite3_sysc
6350: 61 6c 6c 5f 70 74 72 29 75 6e 6c 69 6e 6b 2c 20  all_ptr)unlink, 
6360: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
6370: 64 65 66 69 6e 65 20 6f 73 55 6e 6c 69 6e 6b 20  define osUnlink 
6380: 20 20 20 28 28 69 6e 74 28 2a 29 28 63 6f 6e 73     ((int(*)(cons
6390: 74 20 63 68 61 72 2a 29 29 61 53 79 73 63 61 6c  t char*))aSyscal
63a0: 6c 5b 31 36 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[16].pCurrent).
63b0: 0a 20 20 7b 20 22 6f 70 65 6e 44 69 72 65 63 74  .  { "openDirect
63c0: 6f 72 79 22 2c 20 20 20 20 28 73 71 6c 69 74 65  ory",    (sqlite
63d0: 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 6f 70  3_syscall_ptr)op
63e0: 65 6e 44 69 72 65 63 74 6f 72 79 2c 20 20 20 20  enDirectory,    
63f0: 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65 20 6f    0 },.#define o
6400: 73 4f 70 65 6e 44 69 72 65 63 74 6f 72 79 20 28  sOpenDirectory (
6410: 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68  (int(*)(const ch
6420: 61 72 2a 2c 69 6e 74 2a 29 29 61 53 79 73 63 61  ar*,int*))aSysca
6430: 6c 6c 5b 31 37 5d 2e 70 43 75 72 72 65 6e 74 29  ll[17].pCurrent)
6440: 0a 0a 20 20 7b 20 22 6d 6b 64 69 72 22 2c 20 20  ..  { "mkdir",  
6450: 20 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73        (sqlite3_s
6460: 79 73 63 61 6c 6c 5f 70 74 72 29 6d 6b 64 69 72  yscall_ptr)mkdir
6470: 2c 20 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c  ,           0 },
6480: 0a 23 64 65 66 69 6e 65 20 6f 73 4d 6b 64 69 72  .#define osMkdir
6490: 20 20 20 20 20 28 28 69 6e 74 28 2a 29 28 63 6f       ((int(*)(co
64a0: 6e 73 74 20 63 68 61 72 2a 2c 6d 6f 64 65 5f 74  nst char*,mode_t
64b0: 29 29 61 53 79 73 63 61 6c 6c 5b 31 38 5d 2e 70  ))aSyscall[18].p
64c0: 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22 72  Current)..  { "r
64d0: 6d 64 69 72 22 2c 20 20 20 20 20 20 20 20 28 73  mdir",        (s
64e0: 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f 70  qlite3_syscall_p
64f0: 74 72 29 72 6d 64 69 72 2c 20 20 20 20 20 20 20  tr)rmdir,       
6500: 20 20 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e 65      0 },.#define
6510: 20 6f 73 52 6d 64 69 72 20 20 20 20 20 28 28 69   osRmdir     ((i
6520: 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63 68 61 72  nt(*)(const char
6530: 2a 29 29 61 53 79 73 63 61 6c 6c 5b 31 39 5d 2e  *))aSyscall[19].
6540: 70 43 75 72 72 65 6e 74 29 0a 0a 20 20 7b 20 22  pCurrent)..  { "
6550: 66 63 68 6f 77 6e 22 2c 20 20 20 20 20 20 20 28  fchown",       (
6560: 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c 5f  sqlite3_syscall_
6570: 70 74 72 29 70 6f 73 69 78 46 63 68 6f 77 6e 2c  ptr)posixFchown,
6580: 20 20 20 20 20 30 20 7d 2c 0a 23 64 65 66 69 6e       0 },.#defin
6590: 65 20 6f 73 46 63 68 6f 77 6e 20 20 20 20 28 28  e osFchown    ((
65a0: 69 6e 74 28 2a 29 28 69 6e 74 2c 75 69 64 5f 74  int(*)(int,uid_t
65b0: 2c 67 69 64 5f 74 29 29 61 53 79 73 63 61 6c 6c  ,gid_t))aSyscall
65c0: 5b 32 30 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [20].pCurrent)..
65d0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
65e0: 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 29 20 7c 7c  ITE_OMIT_WAL) ||
65f0: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
6600: 5f 53 49 5a 45 3e 30 0a 20 20 7b 20 22 6d 6d 61  _SIZE>0.  { "mma
6610: 70 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74  p",       (sqlit
6620: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 6d  e3_syscall_ptr)m
6630: 6d 61 70 2c 20 20 20 20 20 30 20 7d 2c 0a 23 64  map,     0 },.#d
6640: 65 66 69 6e 65 20 6f 73 4d 6d 61 70 20 28 28 76  efine osMmap ((v
6650: 6f 69 64 2a 28 2a 29 28 76 6f 69 64 2a 2c 73 69  oid*(*)(void*,si
6660: 7a 65 5f 74 2c 69 6e 74 2c 69 6e 74 2c 69 6e 74  ze_t,int,int,int
6670: 2c 6f 66 66 5f 74 29 29 61 53 79 73 63 61 6c 6c  ,off_t))aSyscall
6680: 5b 32 31 5d 2e 70 43 75 72 72 65 6e 74 29 0a 0a  [21].pCurrent)..
6690: 20 20 7b 20 22 6d 75 6e 6d 61 70 22 2c 20 20 20    { "munmap",   
66a0: 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79 73      (sqlite3_sys
66b0: 63 61 6c 6c 5f 70 74 72 29 6d 75 6e 6d 61 70 2c  call_ptr)munmap,
66c0: 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23            0 },.#
66d0: 64 65 66 69 6e 65 20 6f 73 4d 75 6e 6d 61 70 20  define osMunmap 
66e0: 28 28 76 6f 69 64 2a 28 2a 29 28 76 6f 69 64 2a  ((void*(*)(void*
66f0: 2c 73 69 7a 65 5f 74 29 29 61 53 79 73 63 61 6c  ,size_t))aSyscal
6700: 6c 5b 32 32 5d 2e 70 43 75 72 72 65 6e 74 29 0a  l[22].pCurrent).
6710: 0a 23 69 66 20 48 41 56 45 5f 4d 52 45 4d 41 50  .#if HAVE_MREMAP
6720: 0a 20 20 7b 20 22 6d 72 65 6d 61 70 22 2c 20 20  .  { "mremap",  
6730: 20 20 20 20 20 28 73 71 6c 69 74 65 33 5f 73 79       (sqlite3_sy
6740: 73 63 61 6c 6c 5f 70 74 72 29 6d 72 65 6d 61 70  scall_ptr)mremap
6750: 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a  ,          0 },.
6760: 23 65 6c 73 65 0a 20 20 7b 20 22 6d 72 65 6d 61  #else.  { "mrema
6770: 70 22 2c 20 20 20 20 20 20 20 28 73 71 6c 69 74  p",       (sqlit
6780: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 29 30  e3_syscall_ptr)0
6790: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
67a0: 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 64 65 66  0 },.#endif.#def
67b0: 69 6e 65 20 6f 73 4d 72 65 6d 61 70 20 28 28 76  ine osMremap ((v
67c0: 6f 69 64 2a 28 2a 29 28 76 6f 69 64 2a 2c 73 69  oid*(*)(void*,si
67d0: 7a 65 5f 74 2c 73 69 7a 65 5f 74 2c 69 6e 74 2c  ze_t,size_t,int,
67e0: 2e 2e 2e 29 29 61 53 79 73 63 61 6c 6c 5b 32 33  ...))aSyscall[23
67f0: 5d 2e 70 43 75 72 72 65 6e 74 29 0a 20 20 7b 20  ].pCurrent).  { 
6800: 22 67 65 74 70 61 67 65 73 69 7a 65 22 2c 20 20  "getpagesize",  
6810: 28 73 71 6c 69 74 65 33 5f 73 79 73 63 61 6c 6c  (sqlite3_syscall
6820: 5f 70 74 72 29 75 6e 69 78 47 65 74 70 61 67 65  _ptr)unixGetpage
6830: 73 69 7a 65 2c 20 30 20 7d 2c 0a 23 64 65 66 69  size, 0 },.#defi
6840: 6e 65 20 6f 73 47 65 74 70 61 67 65 73 69 7a 65  ne osGetpagesize
6850: 20 28 28 69 6e 74 28 2a 29 28 76 6f 69 64 29 29   ((int(*)(void))
6860: 61 53 79 73 63 61 6c 6c 5b 32 34 5d 2e 70 43 75  aSyscall[24].pCu
6870: 72 72 65 6e 74 29 0a 0a 23 65 6e 64 69 66 0a 0a  rrent)..#endif..
6880: 7d 3b 20 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65  }; /* End of the
6890: 20 6f 76 65 72 72 69 64 65 61 62 6c 65 20 73 79   overrideable sy
68a0: 73 74 65 6d 20 63 61 6c 6c 73 20 2a 2f 0a 0a 2f  stem calls */../
68b0: 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65  *.** This is the
68c0: 20 78 53 65 74 53 79 73 74 65 6d 43 61 6c 6c 28   xSetSystemCall(
68d0: 29 20 6d 65 74 68 6f 64 20 6f 66 20 73 71 6c 69  ) method of sqli
68e0: 74 65 33 5f 76 66 73 20 66 6f 72 20 61 6c 6c 20  te3_vfs for all 
68f0: 6f 66 20 74 68 65 0a 2a 2a 20 22 75 6e 69 78 22  of the.** "unix"
6900: 20 56 46 53 65 73 2e 20 20 52 65 74 75 72 6e 20   VFSes.  Return 
6910: 53 51 4c 49 54 45 5f 4f 4b 20 6f 70 6f 6e 20 73  SQLITE_OK opon s
6920: 75 63 63 65 73 73 66 75 6c 6c 79 20 75 70 64 61  uccessfully upda
6930: 74 69 6e 67 20 74 68 65 0a 2a 2a 20 73 79 73 74  ting the.** syst
6940: 65 6d 20 63 61 6c 6c 20 70 6f 69 6e 74 65 72 2c  em call pointer,
6950: 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f   or SQLITE_NOTFO
6960: 55 4e 44 20 69 66 20 74 68 65 72 65 20 69 73 20  UND if there is 
6970: 6e 6f 20 63 6f 6e 66 69 67 75 72 61 62 6c 65 0a  no configurable.
6980: 2a 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 6e  ** system call n
6990: 61 6d 65 64 20 7a 4e 61 6d 65 2e 0a 2a 2f 0a 73  amed zName..*/.s
69a0: 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 65  tatic int unixSe
69b0: 74 53 79 73 74 65 6d 43 61 6c 6c 28 0a 20 20 73  tSystemCall(.  s
69c0: 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 4e 6f 74  qlite3_vfs *pNot
69d0: 55 73 65 64 2c 20 20 20 20 20 20 20 20 2f 2a 20  Used,        /* 
69e0: 54 68 65 20 56 46 53 20 70 6f 69 6e 74 65 72 2e  The VFS pointer.
69f0: 20 20 4e 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20    Not used */.  
6a00: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
6a10: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e,            /*
6a20: 20 4e 61 6d 65 20 6f 66 20 73 79 73 74 65 6d 20   Name of system 
6a30: 63 61 6c 6c 20 74 6f 20 6f 76 65 72 72 69 64 65  call to override
6a40: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 79   */.  sqlite3_sy
6a50: 73 63 61 6c 6c 5f 70 74 72 20 70 4e 65 77 46 75  scall_ptr pNewFu
6a60: 6e 63 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74  nc  /* Pointer t
6a70: 6f 20 6e 65 77 20 73 79 73 74 65 6d 20 63 61 6c  o new system cal
6a80: 6c 20 76 61 6c 75 65 20 2a 2f 0a 29 7b 0a 20 20  l value */.){.  
6a90: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 3b 0a  unsigned int i;.
6aa0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
6ab0: 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 0a 20 20 55  E_NOTFOUND;..  U
6ac0: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
6ad0: 70 4e 6f 74 55 73 65 64 29 3b 0a 20 20 69 66 28  pNotUsed);.  if(
6ae0: 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20   zName==0 ){.   
6af0: 20 2f 2a 20 49 66 20 6e 6f 20 7a 4e 61 6d 65 20   /* If no zName 
6b00: 69 73 20 67 69 76 65 6e 2c 20 72 65 73 74 6f 72  is given, restor
6b10: 65 20 61 6c 6c 20 73 79 73 74 65 6d 20 63 61 6c  e all system cal
6b20: 6c 73 20 74 6f 20 74 68 65 69 72 20 64 65 66 61  ls to their defa
6b30: 75 6c 74 0a 20 20 20 20 2a 2a 20 73 65 74 74 69  ult.    ** setti
6b40: 6e 67 73 20 61 6e 64 20 72 65 74 75 72 6e 20 4e  ngs and return N
6b50: 55 4c 4c 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  ULL.    */.    r
6b60: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
6b70: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69     for(i=0; i<si
6b80: 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 29 2f 73  zeof(aSyscall)/s
6b90: 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 5b 30  izeof(aSyscall[0
6ba0: 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ]); i++){.      
6bb0: 69 66 28 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e  if( aSyscall[i].
6bc0: 70 44 65 66 61 75 6c 74 20 29 7b 0a 20 20 20 20  pDefault ){.    
6bd0: 20 20 20 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e      aSyscall[i].
6be0: 70 43 75 72 72 65 6e 74 20 3d 20 61 53 79 73 63  pCurrent = aSysc
6bf0: 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3b  all[i].pDefault;
6c00: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
6c10: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49   }else{.    /* I
6c20: 66 20 7a 4e 61 6d 65 20 69 73 20 73 70 65 63 69  f zName is speci
6c30: 66 69 65 64 2c 20 6f 70 65 72 61 74 65 20 6f 6e  fied, operate on
6c40: 20 6f 6e 6c 79 20 74 68 65 20 6f 6e 65 20 73 79   only the one sy
6c50: 73 74 65 6d 20 63 61 6c 6c 0a 20 20 20 20 2a 2a  stem call.    **
6c60: 20 73 70 65 63 69 66 69 65 64 2e 0a 20 20 20 20   specified..    
6c70: 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  */.    for(i=0; 
6c80: 69 3c 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c  i<sizeof(aSyscal
6c90: 6c 29 2f 73 69 7a 65 6f 66 28 61 53 79 73 63 61  l)/sizeof(aSysca
6ca0: 6c 6c 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20  ll[0]); i++){.  
6cb0: 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
6cc0: 4e 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69  Name, aSyscall[i
6cd0: 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20  ].zName)==0 ){. 
6ce0: 20 20 20 20 20 20 20 69 66 28 20 61 53 79 73 63         if( aSysc
6cf0: 61 6c 6c 5b 69 5d 2e 70 44 65 66 61 75 6c 74 3d  all[i].pDefault=
6d00: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
6d10: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 44 65 66  aSyscall[i].pDef
6d20: 61 75 6c 74 20 3d 20 61 53 79 73 63 61 6c 6c 5b  ault = aSyscall[
6d30: 69 5d 2e 70 43 75 72 72 65 6e 74 3b 0a 20 20 20  i].pCurrent;.   
6d40: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
6d50: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
6d60: 20 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 46         if( pNewF
6d70: 75 6e 63 3d 3d 30 20 29 20 70 4e 65 77 46 75 6e  unc==0 ) pNewFun
6d80: 63 20 3d 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e  c = aSyscall[i].
6d90: 70 44 65 66 61 75 6c 74 3b 0a 20 20 20 20 20 20  pDefault;.      
6da0: 20 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43    aSyscall[i].pC
6db0: 75 72 72 65 6e 74 20 3d 20 70 4e 65 77 46 75 6e  urrent = pNewFun
6dc0: 63 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  c;.        break
6dd0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
6de0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
6df0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
6e00: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 61 20   the value of a 
6e10: 73 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20 52 65  system call.  Re
6e20: 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 7a 4e 61  turn NULL if zNa
6e30: 6d 65 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 72  me is not a.** r
6e40: 65 63 6f 67 6e 69 7a 65 64 20 73 79 73 74 65 6d  ecognized system
6e50: 20 63 61 6c 6c 20 6e 61 6d 65 2e 20 20 4e 55 4c   call name.  NUL
6e60: 4c 20 69 73 20 61 6c 73 6f 20 72 65 74 75 72 6e  L is also return
6e70: 65 64 20 69 66 20 74 68 65 20 73 79 73 74 65 6d  ed if the system
6e80: 20 63 61 6c 6c 0a 2a 2a 20 69 73 20 63 75 72 72   call.** is curr
6e90: 65 6e 74 6c 79 20 75 6e 64 65 66 69 6e 65 64 2e  ently undefined.
6ea0: 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74  .*/.static sqlit
6eb0: 65 33 5f 73 79 73 63 61 6c 6c 5f 70 74 72 20 75  e3_syscall_ptr u
6ec0: 6e 69 78 47 65 74 53 79 73 74 65 6d 43 61 6c 6c  nixGetSystemCall
6ed0: 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  (.  sqlite3_vfs 
6ee0: 2a 70 4e 6f 74 55 73 65 64 2c 0a 20 20 63 6f 6e  *pNotUsed,.  con
6ef0: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 0a 29  st char *zName.)
6f00: 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  {.  unsigned int
6f10: 20 69 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41   i;..  UNUSED_PA
6f20: 52 41 4d 45 54 45 52 28 70 4e 6f 74 55 73 65 64  RAMETER(pNotUsed
6f30: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
6f40: 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c 29  sizeof(aSyscall)
6f50: 2f 73 69 7a 65 6f 66 28 61 53 79 73 63 61 6c 6c  /sizeof(aSyscall
6f60: 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  [0]); i++){.    
6f70: 69 66 28 20 73 74 72 63 6d 70 28 7a 4e 61 6d 65  if( strcmp(zName
6f80: 2c 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e  , aSyscall[i].zN
6f90: 61 6d 65 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  ame)==0 ) return
6fa0: 20 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75   aSyscall[i].pCu
6fb0: 72 72 65 6e 74 3b 0a 20 20 7d 0a 20 20 72 65 74  rrent;.  }.  ret
6fc0: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
6fd0: 52 65 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 20  Return the name 
6fe0: 6f 66 20 74 68 65 20 66 69 72 73 74 20 73 79 73  of the first sys
6ff0: 74 65 6d 20 63 61 6c 6c 20 61 66 74 65 72 20 7a  tem call after z
7000: 4e 61 6d 65 2e 20 20 49 66 20 7a 4e 61 6d 65 3d  Name.  If zName=
7010: 3d 4e 55 4c 4c 0a 2a 2a 20 74 68 65 6e 20 72 65  =NULL.** then re
7020: 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66  turn the name of
7030: 20 74 68 65 20 66 69 72 73 74 20 73 79 73 74 65   the first syste
7040: 6d 20 63 61 6c 6c 2e 20 20 52 65 74 75 72 6e 20  m call.  Return 
7050: 4e 55 4c 4c 20 69 66 20 7a 4e 61 6d 65 0a 2a 2a  NULL if zName.**
7060: 20 69 73 20 74 68 65 20 6c 61 73 74 20 73 79 73   is the last sys
7070: 74 65 6d 20 63 61 6c 6c 20 6f 72 20 69 66 20 7a  tem call or if z
7080: 4e 61 6d 65 20 69 73 20 6e 6f 74 20 74 68 65 20  Name is not the 
7090: 6e 61 6d 65 20 6f 66 20 61 20 76 61 6c 69 64 0a  name of a valid.
70a0: 2a 2a 20 73 79 73 74 65 6d 20 63 61 6c 6c 2e 0a  ** system call..
70b0: 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
70c0: 63 68 61 72 20 2a 75 6e 69 78 4e 65 78 74 53 79  char *unixNextSy
70d0: 73 74 65 6d 43 61 6c 6c 28 73 71 6c 69 74 65 33  stemCall(sqlite3
70e0: 5f 76 66 73 20 2a 70 2c 20 63 6f 6e 73 74 20 63  _vfs *p, const c
70f0: 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69  har *zName){.  i
7100: 6e 74 20 69 20 3d 20 2d 31 3b 0a 0a 20 20 55 4e  nt i = -1;..  UN
7110: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
7120: 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 20 29  );.  if( zName )
7130: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
7140: 3c 41 72 72 61 79 53 69 7a 65 28 61 53 79 73 63  <ArraySize(aSysc
7150: 61 6c 6c 29 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20  all)-1; i++){.  
7160: 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
7170: 4e 61 6d 65 2c 20 61 53 79 73 63 61 6c 6c 5b 69  Name, aSyscall[i
7180: 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 62 72  ].zName)==0 ) br
7190: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
71a0: 20 66 6f 72 28 69 2b 2b 3b 20 69 3c 41 72 72 61   for(i++; i<Arra
71b0: 79 53 69 7a 65 28 61 53 79 73 63 61 6c 6c 29 3b  ySize(aSyscall);
71c0: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 61   i++){.    if( a
71d0: 53 79 73 63 61 6c 6c 5b 69 5d 2e 70 43 75 72 72  Syscall[i].pCurr
71e0: 65 6e 74 21 3d 30 20 29 20 72 65 74 75 72 6e 20  ent!=0 ) return 
71f0: 61 53 79 73 63 61 6c 6c 5b 69 5d 2e 7a 4e 61 6d  aSyscall[i].zNam
7200: 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  e;.  }.  return 
7210: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 6e  0;.}../*.** Do n
7220: 6f 74 20 61 63 63 65 70 74 20 61 6e 79 20 66 69  ot accept any fi
7230: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6c 65  le descriptor le
7240: 73 73 20 74 68 61 6e 20 74 68 69 73 20 76 61 6c  ss than this val
7250: 75 65 2c 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ue, in order to 
7260: 61 76 6f 69 64 0a 2a 2a 20 6f 70 65 6e 69 6e 67  avoid.** opening
7270: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 75   database file u
7280: 73 69 6e 67 20 66 69 6c 65 20 64 65 73 63 72 69  sing file descri
7290: 70 74 6f 72 73 20 74 68 61 74 20 61 72 65 20 63  ptors that are c
72a0: 6f 6d 6d 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72  ommonly used for
72b0: 20 0a 2a 2a 20 73 74 61 6e 64 61 72 64 20 69 6e   .** standard in
72c0: 70 75 74 2c 20 6f 75 74 70 75 74 2c 20 61 6e 64  put, output, and
72d0: 20 65 72 72 6f 72 2e 0a 2a 2f 0a 23 69 66 6e 64   error..*/.#ifnd
72e0: 65 66 20 53 51 4c 49 54 45 5f 4d 49 4e 49 4d 55  ef SQLITE_MINIMU
72f0: 4d 5f 46 49 4c 45 5f 44 45 53 43 52 49 50 54 4f  M_FILE_DESCRIPTO
7300: 52 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54  R.# define SQLIT
7310: 45 5f 4d 49 4e 49 4d 55 4d 5f 46 49 4c 45 5f 44  E_MINIMUM_FILE_D
7320: 45 53 43 52 49 50 54 4f 52 20 33 0a 23 65 6e 64  ESCRIPTOR 3.#end
7330: 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65  if../*.** Invoke
7340: 20 6f 70 65 6e 28 29 2e 20 20 44 6f 20 73 6f 20   open().  Do so 
7350: 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 2c 20  multiple times, 
7360: 75 6e 74 69 6c 20 69 74 20 65 69 74 68 65 72 20  until it either 
7370: 73 75 63 63 65 65 64 73 20 6f 72 0a 2a 2a 20 66  succeeds or.** f
7380: 61 69 6c 73 20 66 6f 72 20 73 6f 6d 65 20 72 65  ails for some re
7390: 61 73 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20  ason other than 
73a0: 45 49 4e 54 52 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  EINTR..**.** If 
73b0: 74 68 65 20 66 69 6c 65 20 63 72 65 61 74 69 6f  the file creatio
73c0: 6e 20 6d 6f 64 65 20 22 6d 22 20 69 73 20 30 20  n mode "m" is 0 
73d0: 74 68 65 6e 20 73 65 74 20 69 74 20 74 6f 20 74  then set it to t
73e0: 68 65 20 64 65 66 61 75 6c 74 20 66 6f 72 0a 2a  he default for.*
73f0: 2a 20 53 51 4c 69 74 65 2e 20 20 54 68 65 20 64  * SQLite.  The d
7400: 65 66 61 75 6c 74 20 69 73 20 53 51 4c 49 54 45  efault is SQLITE
7410: 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45  _DEFAULT_FILE_PE
7420: 52 4d 49 53 53 49 4f 4e 53 20 28 6e 6f 72 6d 61  RMISSIONS (norma
7430: 6c 6c 79 0a 2a 2a 20 30 36 34 34 29 20 61 73 20  lly.** 0644) as 
7440: 6d 6f 64 69 66 69 65 64 20 62 79 20 74 68 65 20  modified by the 
7450: 73 79 73 74 65 6d 20 75 6d 61 73 6b 2e 20 20 49  system umask.  I
7460: 66 20 6d 20 69 73 20 6e 6f 74 20 30 2c 20 74 68  f m is not 0, th
7470: 65 6e 0a 2a 2a 20 6d 61 6b 65 20 74 68 65 20 66  en.** make the f
7480: 69 6c 65 20 63 72 65 61 74 69 6f 6e 20 6d 6f 64  ile creation mod
7490: 65 20 62 65 20 65 78 61 63 74 6c 79 20 6d 20 69  e be exactly m i
74a0: 67 6e 6f 72 69 6e 67 20 74 68 65 20 75 6d 61 73  gnoring the umas
74b0: 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 20 70  k..**.** The m p
74c0: 61 72 61 6d 65 74 65 72 20 77 69 6c 6c 20 62 65  arameter will be
74d0: 20 6e 6f 6e 2d 7a 65 72 6f 20 6f 6e 6c 79 20 77   non-zero only w
74e0: 68 65 6e 20 63 72 65 61 74 69 6e 67 20 2d 77 61  hen creating -wa
74f0: 6c 2c 20 2d 6a 6f 75 72 6e 61 6c 2c 0a 2a 2a 20  l, -journal,.** 
7500: 61 6e 64 20 2d 73 68 6d 20 66 69 6c 65 73 2e 20  and -shm files. 
7510: 20 57 65 20 77 61 6e 74 20 74 68 6f 73 65 20 66   We want those f
7520: 69 6c 65 73 20 74 6f 20 68 61 76 65 20 2a 65 78  iles to have *ex
7530: 61 63 74 6c 79 2a 20 74 68 65 20 73 61 6d 65 0a  actly* the same.
7540: 2a 2a 20 70 65 72 6d 69 73 73 69 6f 6e 73 20 61  ** permissions a
7550: 73 20 74 68 65 69 72 20 6f 72 69 67 69 6e 61 6c  s their original
7560: 20 64 61 74 61 62 61 73 65 2c 20 75 6e 61 64 75   database, unadu
7570: 6c 74 65 72 61 74 65 64 20 62 79 20 74 68 65 20  lterated by the 
7580: 75 6d 61 73 6b 2e 0a 2a 2a 20 49 6e 20 74 68 61  umask..** In tha
7590: 74 20 77 61 79 2c 20 69 66 20 61 20 64 61 74 61  t way, if a data
75a0: 62 61 73 65 20 66 69 6c 65 20 69 73 20 2d 72 77  base file is -rw
75b0: 2d 72 77 2d 72 77 20 6f 72 20 2d 72 77 2d 72 77  -rw-rw or -rw-rw
75c0: 2d 72 2d 2c 20 61 6e 64 20 61 0a 2a 2a 20 74 72  -r-, and a.** tr
75d0: 61 6e 73 61 63 74 69 6f 6e 20 63 72 61 73 68 65  ansaction crashe
75e0: 73 20 61 6e 64 20 6c 65 61 76 65 73 20 62 65 68  s and leaves beh
75f0: 69 6e 64 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 73  ind hot journals
7600: 2c 20 74 68 65 6e 20 61 6e 79 0a 2a 2a 20 70 72  , then any.** pr
7610: 6f 63 65 73 73 20 74 68 61 74 20 69 73 20 61 62  ocess that is ab
7620: 6c 65 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74  le to write to t
7630: 68 65 20 64 61 74 61 62 61 73 65 20 77 69 6c 6c  he database will
7640: 20 61 6c 73 6f 20 62 65 20 61 62 6c 65 20 74 6f   also be able to
7650: 0a 2a 2a 20 72 65 63 6f 76 65 72 20 74 68 65 20  .** recover the 
7660: 68 6f 74 20 6a 6f 75 72 6e 61 6c 73 2e 0a 2a 2f  hot journals..*/
7670: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 6f 62 75  .static int robu
7680: 73 74 5f 6f 70 65 6e 28 63 6f 6e 73 74 20 63 68  st_open(const ch
7690: 61 72 20 2a 7a 2c 20 69 6e 74 20 66 2c 20 6d 6f  ar *z, int f, mo
76a0: 64 65 5f 74 20 6d 29 7b 0a 20 20 69 6e 74 20 66  de_t m){.  int f
76b0: 64 3b 0a 20 20 6d 6f 64 65 5f 74 20 6d 32 20 3d  d;.  mode_t m2 =
76c0: 20 6d 20 3f 20 6d 20 3a 20 53 51 4c 49 54 45 5f   m ? m : SQLITE_
76d0: 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52  DEFAULT_FILE_PER
76e0: 4d 49 53 53 49 4f 4e 53 3b 0a 20 20 77 68 69 6c  MISSIONS;.  whil
76f0: 65 28 31 29 7b 0a 23 69 66 20 64 65 66 69 6e 65  e(1){.#if define
7700: 64 28 4f 5f 43 4c 4f 45 58 45 43 29 0a 20 20 20  d(O_CLOEXEC).   
7710: 20 66 64 20 3d 20 6f 73 4f 70 65 6e 28 7a 2c 66   fd = osOpen(z,f
7720: 7c 4f 5f 43 4c 4f 45 58 45 43 2c 6d 32 29 3b 0a  |O_CLOEXEC,m2);.
7730: 23 65 6c 73 65 0a 20 20 20 20 66 64 20 3d 20 6f  #else.    fd = o
7740: 73 4f 70 65 6e 28 7a 2c 66 2c 6d 32 29 3b 0a 23  sOpen(z,f,m2);.#
7750: 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 66 64  endif.    if( fd
7760: 3c 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  <0 ){.      if( 
7770: 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 20 63  errno==EINTR ) c
7780: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 62  ontinue;.      b
7790: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
77a0: 69 66 28 20 66 64 3e 3d 53 51 4c 49 54 45 5f 4d  if( fd>=SQLITE_M
77b0: 49 4e 49 4d 55 4d 5f 46 49 4c 45 5f 44 45 53 43  INIMUM_FILE_DESC
77c0: 52 49 50 54 4f 52 20 29 20 62 72 65 61 6b 3b 0a  RIPTOR ) break;.
77d0: 20 20 20 20 6f 73 43 6c 6f 73 65 28 66 64 29 3b      osClose(fd);
77e0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67  .    sqlite3_log
77f0: 28 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 2c  (SQLITE_WARNING,
7800: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
7810: 20 20 22 61 74 74 65 6d 70 74 20 74 6f 20 6f 70    "attempt to op
7820: 65 6e 20 5c 22 25 73 5c 22 20 61 73 20 66 69 6c  en \"%s\" as fil
7830: 65 20 64 65 73 63 72 69 70 74 6f 72 20 25 64 22  e descriptor %d"
7840: 2c 20 7a 2c 20 66 64 29 3b 0a 20 20 20 20 66 64  , z, fd);.    fd
7850: 20 3d 20 2d 31 3b 0a 20 20 20 20 69 66 28 20 6f   = -1;.    if( o
7860: 73 4f 70 65 6e 28 22 2f 64 65 76 2f 6e 75 6c 6c  sOpen("/dev/null
7870: 22 2c 20 66 2c 20 6d 29 3c 30 20 29 20 62 72 65  ", f, m)<0 ) bre
7880: 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 64  ak;.  }.  if( fd
7890: 3e 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6d  >=0 ){.    if( m
78a0: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 74 72  !=0 ){.      str
78b0: 75 63 74 20 73 74 61 74 20 73 74 61 74 62 75 66  uct stat statbuf
78c0: 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 73 46 73  ;.      if( osFs
78d0: 74 61 74 28 66 64 2c 20 26 73 74 61 74 62 75 66  tat(fd, &statbuf
78e0: 29 3d 3d 30 20 0a 20 20 20 20 20 20 20 26 26 20  )==0 .       && 
78f0: 73 74 61 74 62 75 66 2e 73 74 5f 73 69 7a 65 3d  statbuf.st_size=
7900: 3d 30 0a 20 20 20 20 20 20 20 26 26 20 28 73 74  =0.       && (st
7910: 61 74 62 75 66 2e 73 74 5f 6d 6f 64 65 26 30 37  atbuf.st_mode&07
7920: 37 37 29 21 3d 6d 20 0a 20 20 20 20 20 20 29 7b  77)!=m .      ){
7930: 0a 20 20 20 20 20 20 20 20 6f 73 46 63 68 6d 6f  .        osFchmo
7940: 64 28 66 64 2c 20 6d 29 3b 0a 20 20 20 20 20 20  d(fd, m);.      
7950: 7d 0a 20 20 20 20 7d 0a 23 69 66 20 64 65 66 69  }.    }.#if defi
7960: 6e 65 64 28 46 44 5f 43 4c 4f 45 58 45 43 29 20  ned(FD_CLOEXEC) 
7970: 26 26 20 28 21 64 65 66 69 6e 65 64 28 4f 5f 43  && (!defined(O_C
7980: 4c 4f 45 58 45 43 29 20 7c 7c 20 4f 5f 43 4c 4f  LOEXEC) || O_CLO
7990: 45 58 45 43 3d 3d 30 29 0a 20 20 20 20 6f 73 46  EXEC==0).    osF
79a0: 63 6e 74 6c 28 66 64 2c 20 46 5f 53 45 54 46 44  cntl(fd, F_SETFD
79b0: 2c 20 6f 73 46 63 6e 74 6c 28 66 64 2c 20 46 5f  , osFcntl(fd, F_
79c0: 47 45 54 46 44 2c 20 30 29 20 7c 20 46 44 5f 43  GETFD, 0) | FD_C
79d0: 4c 4f 45 58 45 43 29 3b 0a 23 65 6e 64 69 66 0a  LOEXEC);.#endif.
79e0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 66 64 3b    }.  return fd;
79f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65 72  .}../*.** Helper
7a00: 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20 6f 62   functions to ob
7a10: 74 61 69 6e 20 61 6e 64 20 72 65 6c 69 6e 71 75  tain and relinqu
7a20: 69 73 68 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d  ish the global m
7a30: 75 74 65 78 2e 20 54 68 65 0a 2a 2a 20 67 6c 6f  utex. The.** glo
7a40: 62 61 6c 20 6d 75 74 65 78 20 69 73 20 75 73 65  bal mutex is use
7a50: 64 20 74 6f 20 70 72 6f 74 65 63 74 20 74 68 65  d to protect the
7a60: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 61   unixInodeInfo a
7a70: 6e 64 0a 2a 2a 20 76 78 77 6f 72 6b 73 46 69 6c  nd.** vxworksFil
7a80: 65 49 64 20 6f 62 6a 65 63 74 73 20 75 73 65 64  eId objects used
7a90: 20 62 79 20 74 68 69 73 20 66 69 6c 65 2c 20 61   by this file, a
7aa0: 6c 6c 20 6f 66 20 77 68 69 63 68 20 6d 61 79 20  ll of which may 
7ab0: 62 65 20 0a 2a 2a 20 73 68 61 72 65 64 20 62 79  be .** shared by
7ac0: 20 6d 75 6c 74 69 70 6c 65 20 74 68 72 65 61 64   multiple thread
7ad0: 73 2e 0a 2a 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f  s..**.** Functio
7ae0: 6e 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28  n unixMutexHeld(
7af0: 29 20 69 73 20 75 73 65 64 20 74 6f 20 61 73 73  ) is used to ass
7b00: 65 72 74 28 29 20 74 68 61 74 20 74 68 65 20 67  ert() that the g
7b10: 6c 6f 62 61 6c 20 6d 75 74 65 78 20 0a 2a 2a 20  lobal mutex .** 
7b20: 69 73 20 68 65 6c 64 20 77 68 65 6e 20 72 65 71  is held when req
7b30: 75 69 72 65 64 2e 20 54 68 69 73 20 66 75 6e 63  uired. This func
7b40: 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65  tion is only use
7b50: 64 20 61 73 20 70 61 72 74 20 6f 66 20 61 73 73  d as part of ass
7b60: 65 72 74 28 29 20 0a 2a 2a 20 73 74 61 74 65 6d  ert() .** statem
7b70: 65 6e 74 73 2e 20 65 2e 67 2e 0a 2a 2a 0a 2a 2a  ents. e.g..**.**
7b80: 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65     unixEnterMute
7b90: 78 28 29 0a 2a 2a 20 20 20 20 20 61 73 73 65 72  x().**     asser
7ba0: 74 28 20 75 6e 69 78 4d 75 74 65 78 48 65 6c 64  t( unixMutexHeld
7bb0: 28 29 20 29 3b 0a 2a 2a 20 20 20 75 6e 69 78 45  () );.**   unixE
7bc0: 6e 74 65 72 4c 65 61 76 65 28 29 0a 2a 2f 0a 73  nterLeave().*/.s
7bd0: 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 45  tatic void unixE
7be0: 6e 74 65 72 4d 75 74 65 78 28 76 6f 69 64 29 7b  nterMutex(void){
7bf0: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
7c00: 5f 65 6e 74 65 72 28 73 71 6c 69 74 65 33 4d 75  _enter(sqlite3Mu
7c10: 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  texAlloc(SQLITE_
7c20: 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 56 46 53  MUTEX_STATIC_VFS
7c30: 31 29 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  1));.}.static vo
7c40: 69 64 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65  id unixLeaveMute
7c50: 78 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74  x(void){.  sqlit
7c60: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 73  e3_mutex_leave(s
7c70: 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
7c80: 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
7c90: 41 54 49 43 5f 56 46 53 31 29 29 3b 0a 7d 0a 23  ATIC_VFS1));.}.#
7ca0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
7cb0: 55 47 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  UG.static int un
7cc0: 69 78 4d 75 74 65 78 48 65 6c 64 28 76 6f 69 64  ixMutexHeld(void
7cd0: 29 20 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  ) {.  return sql
7ce0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
7cf0: 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
7d00: 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
7d10: 54 41 54 49 43 5f 56 46 53 31 29 29 3b 0a 7d 0a  TATIC_VFS1));.}.
7d20: 23 65 6e 64 69 66 0a 0a 0a 23 69 66 64 65 66 20  #endif...#ifdef 
7d30: 53 51 4c 49 54 45 5f 48 41 56 45 5f 4f 53 5f 54  SQLITE_HAVE_OS_T
7d40: 52 41 43 45 0a 2f 2a 0a 2a 2a 20 48 65 6c 70 65  RACE./*.** Helpe
7d50: 72 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 70  r function for p
7d60: 72 69 6e 74 69 6e 67 20 6f 75 74 20 74 72 61 63  rinting out trac
7d70: 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72  e information fr
7d80: 6f 6d 20 64 65 62 75 67 67 69 6e 67 0a 2a 2a 20  om debugging.** 
7d90: 62 69 6e 61 72 69 65 73 2e 20 54 68 69 73 20 72  binaries. This r
7da0: 65 74 75 72 6e 73 20 74 68 65 20 73 74 72 69 6e  eturns the strin
7db0: 67 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  g representation
7dc0: 20 6f 66 20 74 68 65 20 73 75 70 70 6c 69 65 64   of the supplied
7dd0: 0a 2a 2a 20 69 6e 74 65 67 65 72 20 6c 6f 63 6b  .** integer lock
7de0: 2d 74 79 70 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  -type..*/.static
7df0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 46   const char *azF
7e00: 69 6c 65 4c 6f 63 6b 28 69 6e 74 20 65 46 69 6c  ileLock(int eFil
7e10: 65 4c 6f 63 6b 29 7b 0a 20 20 73 77 69 74 63 68  eLock){.  switch
7e20: 28 20 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20  ( eFileLock ){. 
7e30: 20 20 20 63 61 73 65 20 4e 4f 5f 4c 4f 43 4b 3a     case NO_LOCK:
7e40: 20 72 65 74 75 72 6e 20 22 4e 4f 4e 45 22 3b 0a   return "NONE";.
7e50: 20 20 20 20 63 61 73 65 20 53 48 41 52 45 44 5f      case SHARED_
7e60: 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 53 48  LOCK: return "SH
7e70: 41 52 45 44 22 3b 0a 20 20 20 20 63 61 73 65 20  ARED";.    case 
7e80: 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 3a 20 72  RESERVED_LOCK: r
7e90: 65 74 75 72 6e 20 22 52 45 53 45 52 56 45 44 22  eturn "RESERVED"
7ea0: 3b 0a 20 20 20 20 63 61 73 65 20 50 45 4e 44 49  ;.    case PENDI
7eb0: 4e 47 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20  NG_LOCK: return 
7ec0: 22 50 45 4e 44 49 4e 47 22 3b 0a 20 20 20 20 63  "PENDING";.    c
7ed0: 61 73 65 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ase EXCLUSIVE_LO
7ee0: 43 4b 3a 20 72 65 74 75 72 6e 20 22 45 58 43 4c  CK: return "EXCL
7ef0: 55 53 49 56 45 22 3b 0a 20 20 7d 0a 20 20 72 65  USIVE";.  }.  re
7f00: 74 75 72 6e 20 22 45 52 52 4f 52 22 3b 0a 7d 0a  turn "ERROR";.}.
7f10: 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53  #endif..#ifdef S
7f20: 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52 41 43 45  QLITE_LOCK_TRACE
7f30: 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 6f 75 74  ./*.** Print out
7f40: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f   information abo
7f50: 75 74 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 6f  ut all locking o
7f60: 70 65 72 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a  perations..**.**
7f70: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
7f80: 20 75 73 65 64 20 66 6f 72 20 74 72 6f 75 62 6c   used for troubl
7f90: 65 73 68 6f 6f 74 69 6e 67 20 6c 6f 63 6b 73 20  eshooting locks 
7fa0: 6f 6e 20 6d 75 6c 74 69 74 68 72 65 61 64 65 64  on multithreaded
7fb0: 0a 2a 2a 20 70 6c 61 74 66 6f 72 6d 73 2e 20 20  .** platforms.  
7fc0: 45 6e 61 62 6c 65 20 62 79 20 63 6f 6d 70 69 6c  Enable by compil
7fd0: 69 6e 67 20 77 69 74 68 20 74 68 65 20 2d 44 53  ing with the -DS
7fe0: 51 4c 49 54 45 5f 4c 4f 43 4b 5f 54 52 41 43 45  QLITE_LOCK_TRACE
7ff0: 0a 2a 2a 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65  .** command-line
8000: 20 6f 70 74 69 6f 6e 20 6f 6e 20 74 68 65 20 63   option on the c
8010: 6f 6d 70 69 6c 65 72 2e 20 20 54 68 69 73 20 63  ompiler.  This c
8020: 6f 64 65 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 0a  ode is normally.
8030: 2a 2a 20 74 75 72 6e 65 64 20 6f 66 66 2e 0a 2a  ** turned off..*
8040: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f 63  /.static int loc
8050: 6b 54 72 61 63 65 28 69 6e 74 20 66 64 2c 20 69  kTrace(int fd, i
8060: 6e 74 20 6f 70 2c 20 73 74 72 75 63 74 20 66 6c  nt op, struct fl
8070: 6f 63 6b 20 2a 70 29 7b 0a 20 20 63 68 61 72 20  ock *p){.  char 
8080: 2a 7a 4f 70 4e 61 6d 65 2c 20 2a 7a 54 79 70 65  *zOpName, *zType
8090: 3b 0a 20 20 69 6e 74 20 73 3b 0a 20 20 69 6e 74  ;.  int s;.  int
80a0: 20 73 61 76 65 64 45 72 72 6e 6f 3b 0a 20 20 69   savedErrno;.  i
80b0: 66 28 20 6f 70 3d 3d 46 5f 47 45 54 4c 4b 20 29  f( op==F_GETLK )
80c0: 7b 0a 20 20 20 20 7a 4f 70 4e 61 6d 65 20 3d 20  {.    zOpName = 
80d0: 22 47 45 54 4c 4b 22 3b 0a 20 20 7d 65 6c 73 65  "GETLK";.  }else
80e0: 20 69 66 28 20 6f 70 3d 3d 46 5f 53 45 54 4c 4b   if( op==F_SETLK
80f0: 20 29 7b 0a 20 20 20 20 7a 4f 70 4e 61 6d 65 20   ){.    zOpName 
8100: 3d 20 22 53 45 54 4c 4b 22 3b 0a 20 20 7d 65 6c  = "SETLK";.  }el
8110: 73 65 7b 0a 20 20 20 20 73 20 3d 20 6f 73 46 63  se{.    s = osFc
8120: 6e 74 6c 28 66 64 2c 20 6f 70 2c 20 70 29 3b 0a  ntl(fd, op, p);.
8130: 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
8140: 50 72 69 6e 74 66 28 22 66 63 6e 74 6c 20 75 6e  Printf("fcntl un
8150: 6b 6e 6f 77 6e 20 25 64 20 25 64 20 25 64 5c 6e  known %d %d %d\n
8160: 22 2c 20 66 64 2c 20 6f 70 2c 20 73 29 3b 0a 20  ", fd, op, s);. 
8170: 20 20 20 72 65 74 75 72 6e 20 73 3b 0a 20 20 7d     return s;.  }
8180: 0a 20 20 69 66 28 20 70 2d 3e 6c 5f 74 79 70 65  .  if( p->l_type
8190: 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20 20 20  ==F_RDLCK ){.   
81a0: 20 7a 54 79 70 65 20 3d 20 22 52 44 4c 43 4b 22   zType = "RDLCK"
81b0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 2d  ;.  }else if( p-
81c0: 3e 6c 5f 74 79 70 65 3d 3d 46 5f 57 52 4c 43 4b  >l_type==F_WRLCK
81d0: 20 29 7b 0a 20 20 20 20 7a 54 79 70 65 20 3d 20   ){.    zType = 
81e0: 22 57 52 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73 65  "WRLCK";.  }else
81f0: 20 69 66 28 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d   if( p->l_type==
8200: 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 7a  F_UNLCK ){.    z
8210: 54 79 70 65 20 3d 20 22 55 4e 4c 43 4b 22 3b 0a  Type = "UNLCK";.
8220: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
8230: 65 72 74 28 20 30 20 29 3b 0a 20 20 7d 0a 20 20  ert( 0 );.  }.  
8240: 61 73 73 65 72 74 28 20 70 2d 3e 6c 5f 77 68 65  assert( p->l_whe
8250: 6e 63 65 3d 3d 53 45 45 4b 5f 53 45 54 20 29 3b  nce==SEEK_SET );
8260: 0a 20 20 73 20 3d 20 6f 73 46 63 6e 74 6c 28 66  .  s = osFcntl(f
8270: 64 2c 20 6f 70 2c 20 70 29 3b 0a 20 20 73 61 76  d, op, p);.  sav
8280: 65 64 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b  edErrno = errno;
8290: 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50  .  sqlite3DebugP
82a0: 72 69 6e 74 66 28 22 66 63 6e 74 6c 20 25 64 20  rintf("fcntl %d 
82b0: 25 64 20 25 73 20 25 73 20 25 64 20 25 64 20 25  %d %s %s %d %d %
82c0: 64 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 74 68  d %d\n",.     th
82d0: 72 65 61 64 69 64 2c 20 66 64 2c 20 7a 4f 70 4e  readid, fd, zOpN
82e0: 61 6d 65 2c 20 7a 54 79 70 65 2c 20 28 69 6e 74  ame, zType, (int
82f0: 29 70 2d 3e 6c 5f 73 74 61 72 74 2c 20 28 69 6e  )p->l_start, (in
8300: 74 29 70 2d 3e 6c 5f 6c 65 6e 2c 0a 20 20 20 20  t)p->l_len,.    
8310: 20 28 69 6e 74 29 70 2d 3e 6c 5f 70 69 64 2c 20   (int)p->l_pid, 
8320: 73 29 3b 0a 20 20 69 66 28 20 73 3d 3d 28 2d 31  s);.  if( s==(-1
8330: 29 20 26 26 20 6f 70 3d 3d 46 5f 53 45 54 4c 4b  ) && op==F_SETLK
8340: 20 26 26 20 28 70 2d 3e 6c 5f 74 79 70 65 3d 3d   && (p->l_type==
8350: 46 5f 52 44 4c 43 4b 20 7c 7c 20 70 2d 3e 6c 5f  F_RDLCK || p->l_
8360: 74 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 29 20 29  type==F_WRLCK) )
8370: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 66 6c 6f  {.    struct flo
8380: 63 6b 20 6c 32 3b 0a 20 20 20 20 6c 32 20 3d 20  ck l2;.    l2 = 
8390: 2a 70 3b 0a 20 20 20 20 6f 73 46 63 6e 74 6c 28  *p;.    osFcntl(
83a0: 66 64 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 32  fd, F_GETLK, &l2
83b0: 29 3b 0a 20 20 20 20 69 66 28 20 6c 32 2e 6c 5f  );.    if( l2.l_
83c0: 74 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b  type==F_RDLCK ){
83d0: 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22  .      zType = "
83e0: 52 44 4c 43 4b 22 3b 0a 20 20 20 20 7d 65 6c 73  RDLCK";.    }els
83f0: 65 20 69 66 28 20 6c 32 2e 6c 5f 74 79 70 65 3d  e if( l2.l_type=
8400: 3d 46 5f 57 52 4c 43 4b 20 29 7b 0a 20 20 20 20  =F_WRLCK ){.    
8410: 20 20 7a 54 79 70 65 20 3d 20 22 57 52 4c 43 4b    zType = "WRLCK
8420: 22 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  ";.    }else if(
8430: 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f 55 4e   l2.l_type==F_UN
8440: 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 7a 54 79  LCK ){.      zTy
8450: 70 65 20 3d 20 22 55 4e 4c 43 4b 22 3b 0a 20 20  pe = "UNLCK";.  
8460: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
8470: 73 73 65 72 74 28 20 30 20 29 3b 0a 20 20 20 20  ssert( 0 );.    
8480: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  }.    sqlite3Deb
8490: 75 67 50 72 69 6e 74 66 28 22 66 63 6e 74 6c 2d  ugPrintf("fcntl-
84a0: 66 61 69 6c 75 72 65 2d 72 65 61 73 6f 6e 3a 20  failure-reason: 
84b0: 25 73 20 25 64 20 25 64 20 25 64 5c 6e 22 2c 0a  %s %d %d %d\n",.
84c0: 20 20 20 20 20 20 20 7a 54 79 70 65 2c 20 28 69         zType, (i
84d0: 6e 74 29 6c 32 2e 6c 5f 73 74 61 72 74 2c 20 28  nt)l2.l_start, (
84e0: 69 6e 74 29 6c 32 2e 6c 5f 6c 65 6e 2c 20 28 69  int)l2.l_len, (i
84f0: 6e 74 29 6c 32 2e 6c 5f 70 69 64 29 3b 0a 20 20  nt)l2.l_pid);.  
8500: 7d 0a 20 20 65 72 72 6e 6f 20 3d 20 73 61 76 65  }.  errno = save
8510: 64 45 72 72 6e 6f 3b 0a 20 20 72 65 74 75 72 6e  dErrno;.  return
8520: 20 73 3b 0a 7d 0a 23 75 6e 64 65 66 20 6f 73 46   s;.}.#undef osF
8530: 63 6e 74 6c 0a 23 64 65 66 69 6e 65 20 6f 73 46  cntl.#define osF
8540: 63 6e 74 6c 20 6c 6f 63 6b 54 72 61 63 65 0a 23  cntl lockTrace.#
8550: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
8560: 4c 4f 43 4b 5f 54 52 41 43 45 20 2a 2f 0a 0a 2f  LOCK_TRACE */../
8570: 2a 0a 2a 2a 20 52 65 74 72 79 20 66 74 72 75 6e  *.** Retry ftrun
8580: 63 61 74 65 28 29 20 63 61 6c 6c 73 20 74 68 61  cate() calls tha
8590: 74 20 66 61 69 6c 20 64 75 65 20 74 6f 20 45 49  t fail due to EI
85a0: 4e 54 52 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 63 61  NTR.**.** All ca
85b0: 6c 6c 73 20 74 6f 20 66 74 72 75 6e 63 61 74 65  lls to ftruncate
85c0: 28 29 20 77 69 74 68 69 6e 20 74 68 69 73 20 66  () within this f
85d0: 69 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 6d 61  ile should be ma
85e0: 64 65 20 74 68 72 6f 75 67 68 0a 2a 2a 20 74 68  de through.** th
85f0: 69 73 20 77 72 61 70 70 65 72 2e 20 20 4f 6e 20  is wrapper.  On 
8600: 74 68 65 20 41 6e 64 72 6f 69 64 20 70 6c 61 74  the Android plat
8610: 66 6f 72 6d 2c 20 62 79 70 61 73 73 69 6e 67 20  form, bypassing 
8620: 74 68 65 20 6c 6f 67 69 63 20 62 65 6c 6f 77 0a  the logic below.
8630: 2a 2a 20 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f  ** could lead to
8640: 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62   a corrupt datab
8650: 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ase..*/.static i
8660: 6e 74 20 72 6f 62 75 73 74 5f 66 74 72 75 6e 63  nt robust_ftrunc
8670: 61 74 65 28 69 6e 74 20 68 2c 20 73 71 6c 69 74  ate(int h, sqlit
8680: 65 33 5f 69 6e 74 36 34 20 73 7a 29 7b 0a 20 20  e3_int64 sz){.  
8690: 69 6e 74 20 72 63 3b 0a 23 69 66 64 65 66 20 5f  int rc;.#ifdef _
86a0: 5f 41 4e 44 52 4f 49 44 5f 5f 0a 20 20 2f 2a 20  _ANDROID__.  /* 
86b0: 4f 6e 20 41 6e 64 72 6f 69 64 2c 20 66 74 72 75  On Android, ftru
86c0: 6e 63 61 74 65 28 29 20 61 6c 77 61 79 73 20 75  ncate() always u
86d0: 73 65 73 20 33 32 2d 62 69 74 20 6f 66 66 73 65  ses 32-bit offse
86e0: 74 73 2c 20 65 76 65 6e 20 69 66 20 0a 20 20 2a  ts, even if .  *
86f0: 2a 20 5f 46 49 4c 45 5f 4f 46 46 53 45 54 5f 42  * _FILE_OFFSET_B
8700: 49 54 53 3d 36 34 20 69 73 20 64 65 66 69 6e 65  ITS=64 is define
8710: 64 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 69 74  d. This means it
8720: 20 69 73 20 75 6e 73 61 66 65 20 74 6f 20 61 74   is unsafe to at
8730: 74 65 6d 70 74 20 74 6f 0a 20 20 2a 2a 20 74 72  tempt to.  ** tr
8740: 75 6e 63 61 74 65 20 61 20 66 69 6c 65 20 74 6f  uncate a file to
8750: 20 61 6e 79 20 73 69 7a 65 20 6c 61 72 67 65 72   any size larger
8760: 20 74 68 61 6e 20 32 47 69 42 2e 20 53 69 6c 65   than 2GiB. Sile
8770: 6e 74 6c 79 20 69 67 6e 6f 72 65 20 61 6e 79 0a  ntly ignore any.
8780: 20 20 2a 2a 20 73 75 63 68 20 61 74 74 65 6d 70    ** such attemp
8790: 74 73 2e 20 20 2a 2f 0a 20 20 69 66 28 20 73 7a  ts.  */.  if( sz
87a0: 3e 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29  >(sqlite3_int64)
87b0: 30 78 37 46 46 46 46 46 46 46 20 29 7b 0a 20 20  0x7FFFFFFF ){.  
87c0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
87d0: 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66  ;.  }else.#endif
87e0: 0a 20 20 64 6f 7b 20 72 63 20 3d 20 6f 73 46 74  .  do{ rc = osFt
87f0: 72 75 6e 63 61 74 65 28 68 2c 73 7a 29 3b 20 7d  runcate(h,sz); }
8800: 77 68 69 6c 65 28 20 72 63 3c 30 20 26 26 20 65  while( rc<0 && e
8810: 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 20  rrno==EINTR );. 
8820: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
8830: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
8840: 65 20 74 72 61 6e 73 6c 61 74 65 73 20 61 20 73  e translates a s
8850: 74 61 6e 64 61 72 64 20 50 4f 53 49 58 20 65 72  tandard POSIX er
8860: 72 6e 6f 20 63 6f 64 65 20 69 6e 74 6f 20 73 6f  rno code into so
8870: 6d 65 74 68 69 6e 67 0a 2a 2a 20 75 73 65 66 75  mething.** usefu
8880: 6c 20 74 6f 20 74 68 65 20 63 6c 69 65 6e 74 73  l to the clients
8890: 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33 20   of the sqlite3 
88a0: 66 75 6e 63 74 69 6f 6e 73 2e 20 20 53 70 65 63  functions.  Spec
88b0: 69 66 69 63 61 6c 6c 79 2c 20 69 74 20 69 73 0a  ifically, it is.
88c0: 2a 2a 20 69 6e 74 65 6e 64 65 64 20 74 6f 20 74  ** intended to t
88d0: 72 61 6e 73 6c 61 74 65 20 61 20 76 61 72 69 65  ranslate a varie
88e0: 74 79 20 6f 66 20 22 74 72 79 20 61 67 61 69 6e  ty of "try again
88f0: 22 20 65 72 72 6f 72 73 20 69 6e 74 6f 20 53 51  " errors into SQ
8900: 4c 49 54 45 5f 42 55 53 59 0a 2a 2a 20 61 6e 64  LITE_BUSY.** and
8910: 20 61 20 76 61 72 69 65 74 79 20 6f 66 20 22 70   a variety of "p
8920: 6c 65 61 73 65 20 63 6c 6f 73 65 20 74 68 65 20  lease close the 
8930: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
8940: 4e 4f 57 22 20 65 72 72 6f 72 73 20 69 6e 74 6f  NOW" errors into
8950: 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 49 4f 45 52   .** SQLITE_IOER
8960: 52 0a 2a 2a 20 0a 2a 2a 20 45 72 72 6f 72 73 20  R.** .** Errors 
8970: 64 75 72 69 6e 67 20 69 6e 69 74 69 61 6c 69 7a  during initializ
8980: 61 74 69 6f 6e 20 6f 66 20 6c 6f 63 6b 73 2c 20  ation of locks, 
8990: 6f 72 20 66 69 6c 65 20 73 79 73 74 65 6d 20 73  or file system s
89a0: 75 70 70 6f 72 74 20 66 6f 72 20 6c 6f 63 6b 73  upport for locks
89b0: 2c 0a 2a 2a 20 73 68 6f 75 6c 64 20 68 61 6e 64  ,.** should hand
89c0: 6c 65 20 45 4e 4f 4c 43 4b 2c 20 45 4e 4f 54 53  le ENOLCK, ENOTS
89d0: 55 50 2c 20 45 4f 50 4e 4f 54 53 55 50 50 20 73  UP, EOPNOTSUPP s
89e0: 65 70 61 72 61 74 65 6c 79 2e 0a 2a 2f 0a 73 74  eparately..*/.st
89f0: 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 45  atic int sqliteE
8a00: 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
8a10: 6f 72 28 69 6e 74 20 70 6f 73 69 78 45 72 72 6f  or(int posixErro
8a20: 72 2c 20 69 6e 74 20 73 71 6c 69 74 65 49 4f 45  r, int sqliteIOE
8a30: 72 72 29 20 7b 0a 20 20 73 77 69 74 63 68 20 28  rr) {.  switch (
8a40: 70 6f 73 69 78 45 72 72 6f 72 29 20 7b 0a 23 69  posixError) {.#i
8a50: 66 20 30 0a 20 20 2f 2a 20 41 74 20 6f 6e 65 20  f 0.  /* At one 
8a60: 70 6f 69 6e 74 20 74 68 69 73 20 63 6f 64 65 20  point this code 
8a70: 77 61 73 20 6e 6f 74 20 63 6f 6d 6d 65 6e 74 65  was not commente
8a80: 64 20 6f 75 74 2e 20 49 6e 20 74 68 65 6f 72 79  d out. In theory
8a90: 2c 20 74 68 69 73 20 62 72 61 6e 63 68 0a 20 20  , this branch.  
8aa0: 2a 2a 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20  ** should never 
8ab0: 62 65 20 68 69 74 2c 20 61 73 20 74 68 69 73 20  be hit, as this 
8ac0: 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20  function should 
8ad0: 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 61  only be called a
8ae0: 66 74 65 72 0a 20 20 2a 2a 20 61 20 6c 6f 63 6b  fter.  ** a lock
8af0: 69 6e 67 2d 72 65 6c 61 74 65 64 20 66 75 6e 63  ing-related func
8b00: 74 69 6f 6e 20 28 69 2e 65 2e 20 66 63 6e 74 6c  tion (i.e. fcntl
8b10: 28 29 29 20 68 61 73 20 72 65 74 75 72 6e 65 64  ()) has returned
8b20: 20 6e 6f 6e 2d 7a 65 72 6f 20 77 69 74 68 0a 20   non-zero with. 
8b30: 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66   ** the value of
8b40: 20 65 72 72 6e 6f 20 61 73 20 74 68 65 20 66 69   errno as the fi
8b50: 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 53 69  rst argument. Si
8b60: 6e 63 65 20 61 20 73 79 73 74 65 6d 20 63 61 6c  nce a system cal
8b70: 6c 20 68 61 73 20 66 61 69 6c 65 64 2c 0a 20 20  l has failed,.  
8b80: 2a 2a 20 65 72 72 6e 6f 20 73 68 6f 75 6c 64 20  ** errno should 
8b90: 62 65 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 20 20 2a  be non-zero..  *
8ba0: 2a 0a 20 20 2a 2a 20 44 65 73 70 69 74 65 20 74  *.  ** Despite t
8bb0: 68 69 73 2c 20 69 66 20 65 72 72 6e 6f 20 72 65  his, if errno re
8bc0: 61 6c 6c 79 20 69 73 20 7a 65 72 6f 2c 20 77 65  ally is zero, we
8bd0: 20 73 74 69 6c 6c 20 64 6f 6e 27 74 20 77 61 6e   still don't wan
8be0: 74 20 74 6f 20 72 65 74 75 72 6e 0a 20 20 2a 2a  t to return.  **
8bf0: 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 54 68 65 20   SQLITE_OK. The 
8c00: 73 79 73 74 65 6d 20 63 61 6c 6c 20 66 61 69 6c  system call fail
8c10: 65 64 2c 20 61 6e 64 20 2a 73 6f 6d 65 2a 20 53  ed, and *some* S
8c20: 51 4c 69 74 65 20 65 72 72 6f 72 20 73 68 6f 75  QLite error shou
8c30: 6c 64 20 62 65 0a 20 20 2a 2a 20 70 72 6f 70 61  ld be.  ** propa
8c40: 67 61 74 65 64 20 62 61 63 6b 20 74 6f 20 74 68  gated back to th
8c50: 65 20 63 61 6c 6c 65 72 2e 20 43 6f 6d 6d 65 6e  e caller. Commen
8c60: 74 69 6e 67 20 74 68 69 73 20 62 72 61 6e 63 68  ting this branch
8c70: 20 6f 75 74 20 6d 65 61 6e 73 20 65 72 72 6e 6f   out means errno
8c80: 3d 3d 30 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65  ==0.  ** will be
8c90: 20 68 61 6e 64 6c 65 64 20 62 79 20 74 68 65 20   handled by the 
8ca0: 22 64 65 66 61 75 6c 74 3a 22 20 63 61 73 65 20  "default:" case 
8cb0: 62 65 6c 6f 77 2e 0a 20 20 2a 2f 0a 20 20 63 61  below..  */.  ca
8cc0: 73 65 20 30 3a 20 0a 20 20 20 20 72 65 74 75 72  se 0: .    retur
8cd0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6e  n SQLITE_OK;.#en
8ce0: 64 69 66 0a 0a 20 20 63 61 73 65 20 45 41 47 41  dif..  case EAGA
8cf0: 49 4e 3a 0a 20 20 63 61 73 65 20 45 54 49 4d 45  IN:.  case ETIME
8d00: 44 4f 55 54 3a 0a 20 20 63 61 73 65 20 45 42 55  DOUT:.  case EBU
8d10: 53 59 3a 0a 20 20 63 61 73 65 20 45 49 4e 54 52  SY:.  case EINTR
8d20: 3a 0a 20 20 63 61 73 65 20 45 4e 4f 4c 43 4b 3a  :.  case ENOLCK:
8d30: 20 20 0a 20 20 20 20 2f 2a 20 72 61 6e 64 6f 6d    .    /* random
8d40: 20 4e 46 53 20 72 65 74 72 79 20 65 72 72 6f 72   NFS retry error
8d50: 2c 20 75 6e 6c 65 73 73 20 64 75 72 69 6e 67 20  , unless during 
8d60: 66 69 6c 65 20 73 79 73 74 65 6d 20 73 75 70 70  file system supp
8d70: 6f 72 74 20 0a 20 20 20 20 20 2a 20 69 6e 74 72  ort .     * intr
8d80: 6f 73 70 65 63 74 69 6f 6e 2c 20 69 6e 20 77 68  ospection, in wh
8d90: 69 63 68 20 69 74 20 61 63 74 75 61 6c 6c 79 20  ich it actually 
8da0: 6d 65 61 6e 73 20 77 68 61 74 20 69 74 20 73 61  means what it sa
8db0: 79 73 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  ys */.    return
8dc0: 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
8dd0: 20 20 0a 20 20 63 61 73 65 20 45 41 43 43 45 53    .  case EACCES
8de0: 3a 20 0a 20 20 20 20 2f 2a 20 45 41 43 43 45 53  : .    /* EACCES
8df0: 20 69 73 20 6c 69 6b 65 20 45 41 47 41 49 4e 20   is like EAGAIN 
8e00: 64 75 72 69 6e 67 20 6c 6f 63 6b 69 6e 67 20 6f  during locking o
8e10: 70 65 72 61 74 69 6f 6e 73 2c 20 62 75 74 20 6e  perations, but n
8e20: 6f 74 20 61 6e 79 20 6f 74 68 65 72 20 74 69 6d  ot any other tim
8e30: 65 2a 2f 0a 20 20 20 20 69 66 28 20 28 73 71 6c  e*/.    if( (sql
8e40: 69 74 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49  iteIOErr == SQLI
8e50: 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 20 7c  TE_IOERR_LOCK) |
8e60: 7c 20 0a 20 20 20 20 20 20 20 20 28 73 71 6c 69  | .        (sqli
8e70: 74 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49 54  teIOErr == SQLIT
8e80: 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 20  E_IOERR_UNLOCK) 
8e90: 7c 7c 20 0a 20 20 20 20 20 20 20 20 28 73 71 6c  || .        (sql
8ea0: 69 74 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49  iteIOErr == SQLI
8eb0: 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 29  TE_IOERR_RDLOCK)
8ec0: 20 7c 7c 0a 20 20 20 20 20 20 20 20 28 73 71 6c   ||.        (sql
8ed0: 69 74 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49  iteIOErr == SQLI
8ee0: 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45  TE_IOERR_CHECKRE
8ef0: 53 45 52 56 45 44 4c 4f 43 4b 29 20 29 7b 0a 20  SERVEDLOCK) ){. 
8f00: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
8f10: 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a 20  TE_BUSY;.    }. 
8f20: 20 20 20 2f 2a 20 65 6c 73 65 20 66 61 6c 6c 20     /* else fall 
8f30: 74 68 72 6f 75 67 68 20 2a 2f 0a 20 20 63 61 73  through */.  cas
8f40: 65 20 45 50 45 52 4d 3a 20 0a 20 20 20 20 72 65  e EPERM: .    re
8f50: 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d  turn SQLITE_PERM
8f60: 3b 0a 20 20 20 20 0a 23 69 66 20 45 4f 50 4e 4f  ;.    .#if EOPNO
8f70: 54 53 55 50 50 21 3d 45 4e 4f 54 53 55 50 0a 20  TSUPP!=ENOTSUP. 
8f80: 20 63 61 73 65 20 45 4f 50 4e 4f 54 53 55 50 50   case EOPNOTSUPP
8f90: 3a 20 0a 20 20 20 20 2f 2a 20 73 6f 6d 65 74 68  : .    /* someth
8fa0: 69 6e 67 20 77 65 6e 74 20 74 65 72 72 69 62 6c  ing went terribl
8fb0: 79 20 61 77 72 79 2c 20 75 6e 6c 65 73 73 20 64  y awry, unless d
8fc0: 75 72 69 6e 67 20 66 69 6c 65 20 73 79 73 74 65  uring file syste
8fd0: 6d 20 73 75 70 70 6f 72 74 20 0a 20 20 20 20 20  m support .     
8fe0: 2a 20 69 6e 74 72 6f 73 70 65 63 74 69 6f 6e 2c  * introspection,
8ff0: 20 69 6e 20 77 68 69 63 68 20 69 74 20 61 63 74   in which it act
9000: 75 61 6c 6c 79 20 6d 65 61 6e 73 20 77 68 61 74  ually means what
9010: 20 69 74 20 73 61 79 73 20 2a 2f 0a 23 65 6e 64   it says */.#end
9020: 69 66 0a 23 69 66 64 65 66 20 45 4e 4f 54 53 55  if.#ifdef ENOTSU
9030: 50 0a 20 20 63 61 73 65 20 45 4e 4f 54 53 55 50  P.  case ENOTSUP
9040: 3a 20 0a 20 20 20 20 2f 2a 20 69 6e 76 61 6c 69  : .    /* invali
9050: 64 20 66 64 2c 20 75 6e 6c 65 73 73 20 64 75 72  d fd, unless dur
9060: 69 6e 67 20 66 69 6c 65 20 73 79 73 74 65 6d 20  ing file system 
9070: 73 75 70 70 6f 72 74 20 69 6e 74 72 6f 73 70 65  support introspe
9080: 63 74 69 6f 6e 2c 20 69 6e 20 77 68 69 63 68 20  ction, in which 
9090: 0a 20 20 20 20 20 2a 20 69 74 20 61 63 74 75 61  .     * it actua
90a0: 6c 6c 79 20 6d 65 61 6e 73 20 77 68 61 74 20 69  lly means what i
90b0: 74 20 73 61 79 73 20 2a 2f 0a 23 65 6e 64 69 66  t says */.#endif
90c0: 0a 20 20 63 61 73 65 20 45 49 4f 3a 0a 20 20 63  .  case EIO:.  c
90d0: 61 73 65 20 45 42 41 44 46 3a 0a 20 20 63 61 73  ase EBADF:.  cas
90e0: 65 20 45 49 4e 56 41 4c 3a 0a 20 20 63 61 73 65  e EINVAL:.  case
90f0: 20 45 4e 4f 54 43 4f 4e 4e 3a 0a 20 20 63 61 73   ENOTCONN:.  cas
9100: 65 20 45 4e 4f 44 45 56 3a 0a 20 20 63 61 73 65  e ENODEV:.  case
9110: 20 45 4e 58 49 4f 3a 0a 20 20 63 61 73 65 20 45   ENXIO:.  case E
9120: 4e 4f 45 4e 54 3a 0a 23 69 66 64 65 66 20 45 53  NOENT:.#ifdef ES
9130: 54 41 4c 45 20 20 20 20 20 20 20 20 20 20 20 20  TALE            
9140: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 53 54 41           /* ESTA
9150: 4c 45 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65  LE is not define
9160: 64 20 6f 6e 20 49 6e 74 65 72 69 78 20 73 79 73  d on Interix sys
9170: 74 65 6d 73 20 2a 2f 0a 20 20 63 61 73 65 20 45  tems */.  case E
9180: 53 54 41 4c 45 3a 0a 23 65 6e 64 69 66 0a 20 20  STALE:.#endif.  
9190: 63 61 73 65 20 45 4e 4f 53 59 53 3a 0a 20 20 20  case ENOSYS:.   
91a0: 20 2f 2a 20 74 68 65 73 65 20 73 68 6f 75 6c 64   /* these should
91b0: 20 66 6f 72 63 65 20 74 68 65 20 63 6c 69 65 6e   force the clien
91c0: 74 20 74 6f 20 63 6c 6f 73 65 20 74 68 65 20 66  t to close the f
91d0: 69 6c 65 20 61 6e 64 20 72 65 63 6f 6e 6e 65 63  ile and reconnec
91e0: 74 20 2a 2f 0a 20 20 20 20 0a 20 20 64 65 66 61  t */.    .  defa
91f0: 75 6c 74 3a 20 0a 20 20 20 20 72 65 74 75 72 6e  ult: .    return
9200: 20 73 71 6c 69 74 65 49 4f 45 72 72 3b 0a 20 20   sqliteIOErr;.  
9210: 7d 0a 7d 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  }.}.../*********
9220: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9230: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9240: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9250: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
9260: 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
9270: 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 55  ******** Begin U
9280: 6e 69 71 75 65 20 46 69 6c 65 20 49 44 20 55 74  nique File ID Ut
9290: 69 6c 69 74 79 20 55 73 65 64 20 42 79 20 56 78  ility Used By Vx
92a0: 57 6f 72 6b 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  Works **********
92b0: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4f 6e 20 6d  *****.**.** On m
92c0: 6f 73 74 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  ost versions of 
92d0: 75 6e 69 78 2c 20 77 65 20 63 61 6e 20 67 65 74  unix, we can get
92e0: 20 61 20 75 6e 69 71 75 65 20 49 44 20 66 6f 72   a unique ID for
92f0: 20 61 20 66 69 6c 65 20 62 79 20 63 6f 6e 63 61   a file by conca
9300: 74 65 6e 61 74 69 6e 67 0a 2a 2a 20 74 68 65 20  tenating.** the 
9310: 64 65 76 69 63 65 20 6e 75 6d 62 65 72 20 61 6e  device number an
9320: 64 20 74 68 65 20 69 6e 6f 64 65 20 6e 75 6d 62  d the inode numb
9330: 65 72 2e 20 20 42 75 74 20 74 68 69 73 20 64 6f  er.  But this do
9340: 65 73 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 56  es not work on V
9350: 78 57 6f 72 6b 73 2e 0a 2a 2a 20 4f 6e 20 56 78  xWorks..** On Vx
9360: 57 6f 72 6b 73 2c 20 61 20 75 6e 69 71 75 65 20  Works, a unique 
9370: 66 69 6c 65 20 69 64 20 6d 75 73 74 20 62 65 20  file id must be 
9380: 62 61 73 65 64 20 6f 6e 20 74 68 65 20 63 61 6e  based on the can
9390: 6f 6e 69 63 61 6c 20 66 69 6c 65 6e 61 6d 65 2e  onical filename.
93a0: 0a 2a 2a 0a 2a 2a 20 41 20 70 6f 69 6e 74 65 72  .**.** A pointer
93b0: 20 74 6f 20 61 6e 20 69 6e 73 74 61 6e 63 65 20   to an instance 
93c0: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
93d0: 20 73 74 72 75 63 74 75 72 65 20 63 61 6e 20 62   structure can b
93e0: 65 20 75 73 65 64 20 61 73 20 61 0a 2a 2a 20 75  e used as a.** u
93f0: 6e 69 71 75 65 20 66 69 6c 65 20 49 44 20 69 6e  nique file ID in
9400: 20 56 78 57 6f 72 6b 73 2e 20 20 45 61 63 68 20   VxWorks.  Each 
9410: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73  instance of this
9420: 20 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61   structure conta
9430: 69 6e 73 0a 2a 2a 20 61 20 63 6f 70 79 20 6f 66  ins.** a copy of
9440: 20 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c 20 66   the canonical f
9450: 69 6c 65 6e 61 6d 65 2e 20 20 54 68 65 72 65 20  ilename.  There 
9460: 69 73 20 61 6c 73 6f 20 61 20 72 65 66 65 72 65  is also a refere
9470: 6e 63 65 20 63 6f 75 6e 74 2e 20 20 0a 2a 2a 20  nce count.  .** 
9480: 54 68 65 20 73 74 72 75 63 74 75 72 65 20 69 73  The structure is
9490: 20 72 65 63 6c 61 69 6d 65 64 20 77 68 65 6e 20   reclaimed when 
94a0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 6f  the number of po
94b0: 69 6e 74 65 72 73 20 74 6f 20 69 74 20 64 72 6f  inters to it dro
94c0: 70 73 20 74 6f 0a 2a 2a 20 7a 65 72 6f 2e 0a 2a  ps to.** zero..*
94d0: 2a 0a 2a 2a 20 54 68 65 72 65 20 61 72 65 20 6e  *.** There are n
94e0: 65 76 65 72 20 76 65 72 79 20 6d 61 6e 79 20 66  ever very many f
94f0: 69 6c 65 73 20 6f 70 65 6e 20 61 74 20 6f 6e 65  iles open at one
9500: 20 74 69 6d 65 20 61 6e 64 20 6c 6f 6f 6b 75 70   time and lookup
9510: 73 20 61 72 65 20 6e 6f 74 0a 2a 2a 20 61 20 70  s are not.** a p
9520: 65 72 66 6f 72 6d 61 6e 63 65 2d 63 72 69 74 69  erformance-criti
9530: 63 61 6c 20 70 61 74 68 2c 20 73 6f 20 69 74 20  cal path, so it 
9540: 69 73 20 73 75 66 66 69 63 69 65 6e 74 20 74 6f  is sufficient to
9550: 20 70 75 74 20 74 68 65 73 65 0a 2a 2a 20 73 74   put these.** st
9560: 72 75 63 74 75 72 65 73 20 6f 6e 20 61 20 6c 69  ructures on a li
9570: 6e 6b 65 64 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74  nked list..*/.st
9580: 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65  ruct vxworksFile
9590: 49 64 20 7b 0a 20 20 73 74 72 75 63 74 20 76 78  Id {.  struct vx
95a0: 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 4e 65  worksFileId *pNe
95b0: 78 74 3b 20 20 2f 2a 20 4e 65 78 74 20 69 6e 20  xt;  /* Next in 
95c0: 61 20 6c 69 73 74 20 6f 66 20 74 68 65 6d 20 61  a list of them a
95d0: 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66  ll */.  int nRef
95e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
95f0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
9600: 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  of references to
9610: 20 74 68 69 73 20 6f 6e 65 20 2a 2f 0a 20 20 69   this one */.  i
9620: 6e 74 20 6e 4e 61 6d 65 3b 20 20 20 20 20 20 20  nt nName;       
9630: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9640: 4c 65 6e 67 74 68 20 6f 66 20 74 68 65 20 7a 43  Length of the zC
9650: 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 5b 5d 20 73  anonicalName[] s
9660: 74 72 69 6e 67 20 2a 2f 0a 20 20 63 68 61 72 20  tring */.  char 
9670: 2a 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 3b  *zCanonicalName;
9680: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 61 6e 6f           /* Cano
9690: 6e 69 63 61 6c 20 66 69 6c 65 6e 61 6d 65 20 2a  nical filename *
96a0: 2f 0a 7d 3b 0a 0a 23 69 66 20 4f 53 5f 56 58 57  /.};..#if OS_VXW
96b0: 4f 52 4b 53 0a 2f 2a 20 0a 2a 2a 20 41 6c 6c 20  ORKS./* .** All 
96c0: 75 6e 69 71 75 65 20 66 69 6c 65 6e 61 6d 65 73  unique filenames
96d0: 20 61 72 65 20 68 65 6c 64 20 6f 6e 20 61 20 6c   are held on a l
96e0: 69 6e 6b 65 64 20 6c 69 73 74 20 68 65 61 64 65  inked list heade
96f0: 64 20 62 79 20 74 68 69 73 0a 2a 2a 20 76 61 72  d by this.** var
9700: 69 61 62 6c 65 3a 0a 2a 2f 0a 73 74 61 74 69 63  iable:.*/.static
9710: 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46   struct vxworksF
9720: 69 6c 65 49 64 20 2a 76 78 77 6f 72 6b 73 46 69  ileId *vxworksFi
9730: 6c 65 4c 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a 0a  leList = 0;../*.
9740: 2a 2a 20 53 69 6d 70 6c 69 66 79 20 61 20 66 69  ** Simplify a fi
9750: 6c 65 6e 61 6d 65 20 69 6e 74 6f 20 69 74 73 20  lename into its 
9760: 63 61 6e 6f 6e 69 63 61 6c 20 66 6f 72 6d 0a 2a  canonical form.*
9770: 2a 20 62 79 20 6d 61 6b 69 6e 67 20 74 68 65 20  * by making the 
9780: 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 6e 67 65  following change
9790: 73 3a 0a 2a 2a 0a 2a 2a 20 20 2a 20 72 65 6d 6f  s:.**.**  * remo
97a0: 76 69 6e 67 20 61 6e 79 20 74 72 61 69 6c 69 6e  ving any trailin
97b0: 67 20 61 6e 64 20 64 75 70 6c 69 63 61 74 65 20  g and duplicate 
97c0: 2f 0a 2a 2a 20 20 2a 20 63 6f 6e 76 65 72 74 20  /.**  * convert 
97d0: 2f 2e 2f 20 69 6e 74 6f 20 6a 75 73 74 20 2f 0a  /./ into just /.
97e0: 2a 2a 20 20 2a 20 63 6f 6e 76 65 72 74 20 2f 41  **  * convert /A
97f0: 2f 2e 2e 2f 20 77 68 65 72 65 20 41 20 69 73 20  /../ where A is 
9800: 61 6e 79 20 73 69 6d 70 6c 65 20 6e 61 6d 65 20  any simple name 
9810: 69 6e 74 6f 20 6a 75 73 74 20 2f 0a 2a 2a 0a 2a  into just /.**.*
9820: 2a 20 43 68 61 6e 67 65 73 20 61 72 65 20 6d 61  * Changes are ma
9830: 64 65 20 69 6e 2d 70 6c 61 63 65 2e 20 20 52 65  de in-place.  Re
9840: 74 75 72 6e 20 74 68 65 20 6e 65 77 20 6e 61 6d  turn the new nam
9850: 65 20 6c 65 6e 67 74 68 2e 0a 2a 2a 0a 2a 2a 20  e length..**.** 
9860: 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c  The original fil
9870: 65 6e 61 6d 65 20 69 73 20 69 6e 20 7a 5b 30 2e  ename is in z[0.
9880: 2e 6e 2d 31 5d 2e 20 20 52 65 74 75 72 6e 20 74  .n-1].  Return t
9890: 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  he number of.** 
98a0: 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 74 68  characters in th
98b0: 65 20 73 69 6d 70 6c 69 66 69 65 64 20 6e 61 6d  e simplified nam
98c0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
98d0: 20 76 78 77 6f 72 6b 73 53 69 6d 70 6c 69 66 79   vxworksSimplify
98e0: 4e 61 6d 65 28 63 68 61 72 20 2a 7a 2c 20 69 6e  Name(char *z, in
98f0: 74 20 6e 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a  t n){.  int i, j
9900: 3b 0a 20 20 77 68 69 6c 65 28 20 6e 3e 31 20 26  ;.  while( n>1 &
9910: 26 20 7a 5b 6e 2d 31 5d 3d 3d 27 2f 27 20 29 7b  & z[n-1]=='/' ){
9920: 20 6e 2d 2d 3b 20 7d 0a 20 20 66 6f 72 28 69 3d   n--; }.  for(i=
9930: 6a 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a  j=0; i<n; i++){.
9940: 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 2f      if( z[i]=='/
9950: 27 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 7a  ' ){.      if( z
9960: 5b 69 2b 31 5d 3d 3d 27 2f 27 20 29 20 63 6f 6e  [i+1]=='/' ) con
9970: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28  tinue;.      if(
9980: 20 7a 5b 69 2b 31 5d 3d 3d 27 2e 27 20 26 26 20   z[i+1]=='.' && 
9990: 69 2b 32 3c 6e 20 26 26 20 7a 5b 69 2b 32 5d 3d  i+2<n && z[i+2]=
99a0: 3d 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='/' ){.        
99b0: 69 20 2b 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  i += 1;.        
99c0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
99d0: 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2b  }.      if( z[i+
99e0: 31 5d 3d 3d 27 2e 27 20 26 26 20 69 2b 33 3c 6e  1]=='.' && i+3<n
99f0: 20 26 26 20 7a 5b 69 2b 32 5d 3d 3d 27 2e 27 20   && z[i+2]=='.' 
9a00: 26 26 20 7a 5b 69 2b 33 5d 3d 3d 27 2f 27 20 29  && z[i+3]=='/' )
9a10: 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  {.        while(
9a20: 20 6a 3e 30 20 26 26 20 7a 5b 6a 2d 31 5d 21 3d   j>0 && z[j-1]!=
9a30: 27 2f 27 20 29 7b 20 6a 2d 2d 3b 20 7d 0a 20 20  '/' ){ j--; }.  
9a40: 20 20 20 20 20 20 69 66 28 20 6a 3e 30 20 29 7b        if( j>0 ){
9a50: 20 6a 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 20 20   j--; }.        
9a60: 69 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 20 20  i += 2;.        
9a70: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
9a80: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 7a 5b 6a 2b  }.    }.    z[j+
9a90: 2b 5d 20 3d 20 7a 5b 69 5d 3b 0a 20 20 7d 0a 20  +] = z[i];.  }. 
9aa0: 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20 72 65 74   z[j] = 0;.  ret
9ab0: 75 72 6e 20 6a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn j;.}../*.** 
9ac0: 46 69 6e 64 20 61 20 75 6e 69 71 75 65 20 66 69  Find a unique fi
9ad0: 6c 65 20 49 44 20 66 6f 72 20 74 68 65 20 67 69  le ID for the gi
9ae0: 76 65 6e 20 61 62 73 6f 6c 75 74 65 20 70 61 74  ven absolute pat
9af0: 68 6e 61 6d 65 2e 20 20 52 65 74 75 72 6e 0a 2a  hname.  Return.*
9b00: 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  * a pointer to t
9b10: 68 65 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64  he vxworksFileId
9b20: 20 6f 62 6a 65 63 74 2e 20 20 54 68 69 73 20 70   object.  This p
9b30: 6f 69 6e 74 65 72 20 69 73 20 74 68 65 20 75 6e  ointer is the un
9b40: 69 71 75 65 0a 2a 2a 20 66 69 6c 65 20 49 44 2e  ique.** file ID.
9b50: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 52 65 66 20  .**.** The nRef 
9b60: 66 69 65 6c 64 20 6f 66 20 74 68 65 20 76 78 77  field of the vxw
9b70: 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65 63  orksFileId objec
9b80: 74 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64  t is incremented
9b90: 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20 6f   before.** the o
9ba0: 62 6a 65 63 74 20 69 73 20 72 65 74 75 72 6e 65  bject is returne
9bb0: 64 2e 20 20 41 20 6e 65 77 20 76 78 77 6f 72 6b  d.  A new vxwork
9bc0: 73 46 69 6c 65 49 64 20 6f 62 6a 65 63 74 20 69  sFileId object i
9bd0: 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64  s created.** and
9be0: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 67 6c   added to the gl
9bf0: 6f 62 61 6c 20 6c 69 73 74 20 69 66 20 6e 65 63  obal list if nec
9c00: 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66  essary..**.** If
9c10: 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61   a memory alloca
9c20: 74 69 6f 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  tion error occur
9c30: 73 2c 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2e 0a  s, return NULL..
9c40: 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74  */.static struct
9c50: 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a   vxworksFileId *
9c60: 76 78 77 6f 72 6b 73 46 69 6e 64 46 69 6c 65 49  vxworksFindFileI
9c70: 64 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41  d(const char *zA
9c80: 62 73 6f 6c 75 74 65 4e 61 6d 65 29 7b 0a 20 20  bsoluteName){.  
9c90: 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69  struct vxworksFi
9ca0: 6c 65 49 64 20 2a 70 4e 65 77 3b 20 20 20 20 20  leId *pNew;     
9cb0: 20 20 20 20 2f 2a 20 73 65 61 72 63 68 20 6b 65      /* search ke
9cc0: 79 20 61 6e 64 20 6e 65 77 20 66 69 6c 65 20 49  y and new file I
9cd0: 44 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 76 78  D */.  struct vx
9ce0: 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 43 61  worksFileId *pCa
9cf0: 6e 64 69 64 61 74 65 3b 20 20 20 2f 2a 20 46 6f  ndidate;   /* Fo
9d00: 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 65  r looping over e
9d10: 78 69 73 74 69 6e 67 20 66 69 6c 65 20 49 44 73  xisting file IDs
9d20: 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20   */.  int n;    
9d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e            /* Len
9d50: 67 74 68 20 6f 66 20 7a 41 62 73 6f 6c 75 74 65  gth of zAbsolute
9d60: 4e 61 6d 65 20 73 74 72 69 6e 67 20 2a 2f 0a 0a  Name string */..
9d70: 20 20 61 73 73 65 72 74 28 20 7a 41 62 73 6f 6c    assert( zAbsol
9d80: 75 74 65 4e 61 6d 65 5b 30 5d 3d 3d 27 2f 27 20  uteName[0]=='/' 
9d90: 29 3b 0a 20 20 6e 20 3d 20 28 69 6e 74 29 73 74  );.  n = (int)st
9da0: 72 6c 65 6e 28 7a 41 62 73 6f 6c 75 74 65 4e 61  rlen(zAbsoluteNa
9db0: 6d 65 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71  me);.  pNew = sq
9dc0: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20  lite3_malloc64( 
9dd0: 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 2b 20  sizeof(*pNew) + 
9de0: 28 6e 2b 31 29 20 29 3b 0a 20 20 69 66 28 20 70  (n+1) );.  if( p
9df0: 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  New==0 ) return 
9e00: 30 3b 0a 20 20 70 4e 65 77 2d 3e 7a 43 61 6e 6f  0;.  pNew->zCano
9e10: 6e 69 63 61 6c 4e 61 6d 65 20 3d 20 28 63 68 61  nicalName = (cha
9e20: 72 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a 20 20 6d  r*)&pNew[1];.  m
9e30: 65 6d 63 70 79 28 70 4e 65 77 2d 3e 7a 43 61 6e  emcpy(pNew->zCan
9e40: 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20 7a 41 62 73  onicalName, zAbs
9e50: 6f 6c 75 74 65 4e 61 6d 65 2c 20 6e 2b 31 29 3b  oluteName, n+1);
9e60: 0a 20 20 6e 20 3d 20 76 78 77 6f 72 6b 73 53 69  .  n = vxworksSi
9e70: 6d 70 6c 69 66 79 4e 61 6d 65 28 70 4e 65 77 2d  mplifyName(pNew-
9e80: 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c  >zCanonicalName,
9e90: 20 6e 29 3b 0a 0a 20 20 2f 2a 20 53 65 61 72 63   n);..  /* Searc
9ea0: 68 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69 6e  h for an existin
9eb0: 67 20 65 6e 74 72 79 20 74 68 61 74 20 6d 61 74  g entry that mat
9ec0: 63 68 69 6e 67 20 74 68 65 20 63 61 6e 6f 6e 69  ching the canoni
9ed0: 63 61 6c 20 6e 61 6d 65 2e 0a 20 20 2a 2a 20 49  cal name..  ** I
9ee0: 66 20 66 6f 75 6e 64 2c 20 69 6e 63 72 65 6d 65  f found, increme
9ef0: 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  nt the reference
9f00: 20 63 6f 75 6e 74 20 61 6e 64 20 72 65 74 75 72   count and retur
9f10: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 0a 20  n a pointer to. 
9f20: 20 2a 2a 20 74 68 65 20 65 78 69 73 74 69 6e 67   ** the existing
9f30: 20 66 69 6c 65 20 49 44 2e 0a 20 20 2a 2f 0a 20   file ID..  */. 
9f40: 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28   unixEnterMutex(
9f50: 29 3b 0a 20 20 66 6f 72 28 70 43 61 6e 64 69 64  );.  for(pCandid
9f60: 61 74 65 3d 76 78 77 6f 72 6b 73 46 69 6c 65 4c  ate=vxworksFileL
9f70: 69 73 74 3b 20 70 43 61 6e 64 69 64 61 74 65 3b  ist; pCandidate;
9f80: 20 70 43 61 6e 64 69 64 61 74 65 3d 70 43 61 6e   pCandidate=pCan
9f90: 64 69 64 61 74 65 2d 3e 70 4e 65 78 74 29 7b 0a  didate->pNext){.
9fa0: 20 20 20 20 69 66 28 20 70 43 61 6e 64 69 64 61      if( pCandida
9fb0: 74 65 2d 3e 6e 4e 61 6d 65 3d 3d 6e 20 0a 20 20  te->nName==n .  
9fc0: 20 20 20 26 26 20 6d 65 6d 63 6d 70 28 70 43 61     && memcmp(pCa
9fd0: 6e 64 69 64 61 74 65 2d 3e 7a 43 61 6e 6f 6e 69  ndidate->zCanoni
9fe0: 63 61 6c 4e 61 6d 65 2c 20 70 4e 65 77 2d 3e 7a  calName, pNew->z
9ff0: 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c 20 6e  CanonicalName, n
a000: 29 3d 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20  )==0.    ){.    
a010: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
a020: 70 4e 65 77 29 3b 0a 20 20 20 20 20 20 20 70 43  pNew);.       pC
a030: 61 6e 64 69 64 61 74 65 2d 3e 6e 52 65 66 2b 2b  andidate->nRef++
a040: 3b 0a 20 20 20 20 20 20 20 75 6e 69 78 4c 65 61  ;.       unixLea
a050: 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 20  veMutex();.     
a060: 20 20 72 65 74 75 72 6e 20 70 43 61 6e 64 69 64    return pCandid
a070: 61 74 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ate;.    }.  }..
a080: 20 20 2f 2a 20 4e 6f 20 6d 61 74 63 68 20 77 61    /* No match wa
a090: 73 20 66 6f 75 6e 64 2e 20 20 57 65 20 77 69 6c  s found.  We wil
a0a0: 6c 20 6d 61 6b 65 20 61 20 6e 65 77 20 66 69 6c  l make a new fil
a0b0: 65 20 49 44 20 2a 2f 0a 20 20 70 4e 65 77 2d 3e  e ID */.  pNew->
a0c0: 6e 52 65 66 20 3d 20 31 3b 0a 20 20 70 4e 65 77  nRef = 1;.  pNew
a0d0: 2d 3e 6e 4e 61 6d 65 20 3d 20 6e 3b 0a 20 20 70  ->nName = n;.  p
a0e0: 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20 76 78 77  New->pNext = vxw
a0f0: 6f 72 6b 73 46 69 6c 65 4c 69 73 74 3b 0a 20 20  orksFileList;.  
a100: 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74 20  vxworksFileList 
a110: 3d 20 70 4e 65 77 3b 0a 20 20 75 6e 69 78 4c 65  = pNew;.  unixLe
a120: 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 72 65  aveMutex();.  re
a130: 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a  turn pNew;.}../*
a140: 0a 2a 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68  .** Decrement th
a150: 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
a160: 74 20 6f 6e 20 61 20 76 78 77 6f 72 6b 73 46 69  t on a vxworksFi
a170: 6c 65 49 64 20 6f 62 6a 65 63 74 2e 20 20 46 72  leId object.  Fr
a180: 65 65 0a 2a 2a 20 74 68 65 20 6f 62 6a 65 63 74  ee.** the object
a190: 20 77 68 65 6e 20 74 68 65 20 72 65 66 65 72 65   when the refere
a1a0: 6e 63 65 20 63 6f 75 6e 74 20 72 65 61 63 68 65  nce count reache
a1b0: 73 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69  s zero..*/.stati
a1c0: 63 20 76 6f 69 64 20 76 78 77 6f 72 6b 73 52 65  c void vxworksRe
a1d0: 6c 65 61 73 65 46 69 6c 65 49 64 28 73 74 72 75  leaseFileId(stru
a1e0: 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64  ct vxworksFileId
a1f0: 20 2a 70 49 64 29 7b 0a 20 20 75 6e 69 78 45 6e   *pId){.  unixEn
a200: 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 61 73  terMutex();.  as
a210: 73 65 72 74 28 20 70 49 64 2d 3e 6e 52 65 66 3e  sert( pId->nRef>
a220: 30 20 29 3b 0a 20 20 70 49 64 2d 3e 6e 52 65 66  0 );.  pId->nRef
a230: 2d 2d 3b 0a 20 20 69 66 28 20 70 49 64 2d 3e 6e  --;.  if( pId->n
a240: 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74  Ref==0 ){.    st
a250: 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69 6c 65  ruct vxworksFile
a260: 49 64 20 2a 2a 70 70 3b 0a 20 20 20 20 66 6f 72  Id **pp;.    for
a270: 28 70 70 3d 26 76 78 77 6f 72 6b 73 46 69 6c 65  (pp=&vxworksFile
a280: 4c 69 73 74 3b 20 2a 70 70 20 26 26 20 2a 70 70  List; *pp && *pp
a290: 21 3d 70 49 64 3b 20 70 70 20 3d 20 26 28 28 2a  !=pId; pp = &((*
a2a0: 70 70 29 2d 3e 70 4e 65 78 74 29 29 7b 7d 0a 20  pp)->pNext)){}. 
a2b0: 20 20 20 61 73 73 65 72 74 28 20 2a 70 70 3d 3d     assert( *pp==
a2c0: 70 49 64 20 29 3b 0a 20 20 20 20 2a 70 70 20 3d  pId );.    *pp =
a2d0: 20 70 49 64 2d 3e 70 4e 65 78 74 3b 0a 20 20 20   pId->pNext;.   
a2e0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49   sqlite3_free(pI
a2f0: 64 29 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 4c 65  d);.  }.  unixLe
a300: 61 76 65 4d 75 74 65 78 28 29 3b 0a 7d 0a 23 65  aveMutex();.}.#e
a310: 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52  ndif /* OS_VXWOR
a320: 4b 53 20 2a 2f 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  KS */./*********
a330: 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 55 6e  ****** End of Un
a340: 69 71 75 65 20 46 69 6c 65 20 49 44 20 55 74 69  ique File ID Uti
a350: 6c 69 74 79 20 55 73 65 64 20 42 79 20 56 78 57  lity Used By VxW
a360: 6f 72 6b 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  orks ***********
a370: 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
a380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a390: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a3a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a3b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a3c0: 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  ****/.../*******
a3d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a3e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a3f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a400: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a410: 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
a420: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a430: 2a 2a 2a 20 50 6f 73 69 78 20 41 64 76 69 73 6f  *** Posix Adviso
a440: 72 79 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a  ry Locking *****
a450: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
a460: 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 50 4f  *******.**.** PO
a470: 53 49 58 20 61 64 76 69 73 6f 72 79 20 6c 6f 63  SIX advisory loc
a480: 6b 73 20 61 72 65 20 62 72 6f 6b 65 6e 20 62 79  ks are broken by
a490: 20 64 65 73 69 67 6e 2e 20 20 41 4e 53 49 20 53   design.  ANSI S
a4a0: 54 44 20 31 30 30 33 2e 31 20 28 31 39 39 36 29  TD 1003.1 (1996)
a4b0: 0a 2a 2a 20 73 65 63 74 69 6f 6e 20 36 2e 35 2e  .** section 6.5.
a4c0: 32 2e 32 20 6c 69 6e 65 73 20 34 38 33 20 74 68  2.2 lines 483 th
a4d0: 72 6f 75 67 68 20 34 39 30 20 73 70 65 63 69 66  rough 490 specif
a4e0: 79 20 74 68 61 74 20 77 68 65 6e 20 61 20 70 72  y that when a pr
a4f0: 6f 63 65 73 73 0a 2a 2a 20 73 65 74 73 20 6f 72  ocess.** sets or
a500: 20 63 6c 65 61 72 73 20 61 20 6c 6f 63 6b 2c 20   clears a lock, 
a510: 74 68 61 74 20 6f 70 65 72 61 74 69 6f 6e 20 6f  that operation o
a520: 76 65 72 72 69 64 65 73 20 61 6e 79 20 70 72 69  verrides any pri
a530: 6f 72 20 6c 6f 63 6b 73 20 73 65 74 0a 2a 2a 20  or locks set.** 
a540: 62 79 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63  by the same proc
a550: 65 73 73 2e 20 20 49 74 20 64 6f 65 73 20 6e 6f  ess.  It does no
a560: 74 20 65 78 70 6c 69 63 69 74 6c 79 20 73 61 79  t explicitly say
a570: 20 73 6f 2c 20 62 75 74 20 74 68 69 73 20 69 6d   so, but this im
a580: 70 6c 69 65 73 0a 2a 2a 20 74 68 61 74 20 69 74  plies.** that it
a590: 20 6f 76 65 72 72 69 64 65 73 20 6c 6f 63 6b 73   overrides locks
a5a0: 20 73 65 74 20 62 79 20 74 68 65 20 73 61 6d 65   set by the same
a5b0: 20 70 72 6f 63 65 73 73 20 75 73 69 6e 67 20 61   process using a
a5c0: 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66 69   different.** fi
a5d0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20  le descriptor.  
a5e0: 43 6f 6e 73 69 64 65 72 20 74 68 69 73 20 74 65  Consider this te
a5f0: 73 74 20 63 61 73 65 3a 0a 2a 2a 0a 2a 2a 20 20  st case:.**.**  
a600: 20 20 20 20 20 69 6e 74 20 66 64 31 20 3d 20 6f       int fd1 = o
a610: 70 65 6e 28 22 2e 2f 66 69 6c 65 31 22 2c 20 4f  pen("./file1", O
a620: 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54 2c 20 30  _RDWR|O_CREAT, 0
a630: 36 34 34 29 3b 0a 2a 2a 20 20 20 20 20 20 20 69  644);.**       i
a640: 6e 74 20 66 64 32 20 3d 20 6f 70 65 6e 28 22 2e  nt fd2 = open(".
a650: 2f 66 69 6c 65 32 22 2c 20 4f 5f 52 44 57 52 7c  /file2", O_RDWR|
a660: 4f 5f 43 52 45 41 54 2c 20 30 36 34 34 29 3b 0a  O_CREAT, 0644);.
a670: 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73 65 20 2e 2f  **.** Suppose ./
a680: 66 69 6c 65 31 20 61 6e 64 20 2e 2f 66 69 6c 65  file1 and ./file
a690: 32 20 61 72 65 20 72 65 61 6c 6c 79 20 74 68 65  2 are really the
a6a0: 20 73 61 6d 65 20 66 69 6c 65 20 28 62 65 63 61   same file (beca
a6b0: 75 73 65 0a 2a 2a 20 6f 6e 65 20 69 73 20 61 20  use.** one is a 
a6c0: 68 61 72 64 20 6f 72 20 73 79 6d 62 6f 6c 69 63  hard or symbolic
a6d0: 20 6c 69 6e 6b 20 74 6f 20 74 68 65 20 6f 74 68   link to the oth
a6e0: 65 72 29 20 74 68 65 6e 20 69 66 20 79 6f 75 20  er) then if you 
a6f0: 73 65 74 0a 2a 2a 20 61 6e 20 65 78 63 6c 75 73  set.** an exclus
a700: 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 66 64 31 2c  ive lock on fd1,
a710: 20 74 68 65 6e 20 74 72 79 20 74 6f 20 67 65 74   then try to get
a720: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
a730: 63 6b 0a 2a 2a 20 6f 6e 20 66 64 32 2c 20 69 74  ck.** on fd2, it
a740: 20 77 6f 72 6b 73 2e 20 20 49 20 77 6f 75 6c 64   works.  I would
a750: 20 68 61 76 65 20 65 78 70 65 63 74 65 64 20 74   have expected t
a760: 68 65 20 73 65 63 6f 6e 64 20 6c 6f 63 6b 20 74  he second lock t
a770: 6f 0a 2a 2a 20 66 61 69 6c 20 73 69 6e 63 65 20  o.** fail since 
a780: 74 68 65 72 65 20 77 61 73 20 61 6c 72 65 61 64  there was alread
a790: 79 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  y a lock on the 
a7a0: 66 69 6c 65 20 64 75 65 20 74 6f 20 66 64 31 2e  file due to fd1.
a7b0: 0a 2a 2a 20 42 75 74 20 6e 6f 74 20 73 6f 2e 20  .** But not so. 
a7c0: 20 53 69 6e 63 65 20 62 6f 74 68 20 6c 6f 63 6b   Since both lock
a7d0: 73 20 63 61 6d 65 20 66 72 6f 6d 20 74 68 65 20  s came from the 
a7e0: 73 61 6d 65 20 70 72 6f 63 65 73 73 2c 20 74 68  same process, th
a7f0: 65 0a 2a 2a 20 73 65 63 6f 6e 64 20 6f 76 65 72  e.** second over
a800: 72 69 64 65 73 20 74 68 65 20 66 69 72 73 74 2c  rides the first,
a810: 20 65 76 65 6e 20 74 68 6f 75 67 68 20 74 68 65   even though the
a820: 79 20 77 65 72 65 20 6f 6e 20 64 69 66 66 65 72  y were on differ
a830: 65 6e 74 0a 2a 2a 20 66 69 6c 65 20 64 65 73 63  ent.** file desc
a840: 72 69 70 74 6f 72 73 20 6f 70 65 6e 65 64 20 6f  riptors opened o
a850: 6e 20 64 69 66 66 65 72 65 6e 74 20 66 69 6c 65  n different file
a860: 20 6e 61 6d 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68   names..**.** Th
a870: 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65  is means that we
a880: 20 63 61 6e 6e 6f 74 20 75 73 65 20 50 4f 53 49   cannot use POSI
a890: 58 20 6c 6f 63 6b 73 20 74 6f 20 73 79 6e 63 68  X locks to synch
a8a0: 72 6f 6e 69 7a 65 20 66 69 6c 65 20 61 63 63 65  ronize file acce
a8b0: 73 73 0a 2a 2a 20 61 6d 6f 6e 67 20 63 6f 6d 70  ss.** among comp
a8c0: 65 74 69 6e 67 20 74 68 72 65 61 64 73 20 6f 66  eting threads of
a8d0: 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73   the same proces
a8e0: 73 2e 20 20 50 4f 53 49 58 20 6c 6f 63 6b 73 20  s.  POSIX locks 
a8f0: 77 69 6c 6c 20 77 6f 72 6b 20 66 69 6e 65 0a 2a  will work fine.*
a900: 2a 20 74 6f 20 73 79 6e 63 68 72 6f 6e 69 7a 65  * to synchronize
a910: 20 61 63 63 65 73 73 20 66 6f 72 20 74 68 72 65   access for thre
a920: 61 64 73 20 69 6e 20 73 65 70 61 72 61 74 65 20  ads in separate 
a930: 70 72 6f 63 65 73 73 65 73 2c 20 62 75 74 20 6e  processes, but n
a940: 6f 74 0a 2a 2a 20 74 68 72 65 61 64 73 20 77 69  ot.** threads wi
a950: 74 68 69 6e 20 74 68 65 20 73 61 6d 65 20 70 72  thin the same pr
a960: 6f 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20  ocess..**.** To 
a970: 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 65 20  work around the 
a980: 70 72 6f 62 6c 65 6d 2c 20 53 51 4c 69 74 65 20  problem, SQLite 
a990: 68 61 73 20 74 6f 20 6d 61 6e 61 67 65 20 66 69  has to manage fi
a9a0: 6c 65 20 6c 6f 63 6b 73 20 69 6e 74 65 72 6e 61  le locks interna
a9b0: 6c 6c 79 0a 2a 2a 20 6f 6e 20 69 74 73 20 6f 77  lly.** on its ow
a9c0: 6e 2e 20 20 57 68 65 6e 65 76 65 72 20 61 20 6e  n.  Whenever a n
a9d0: 65 77 20 64 61 74 61 62 61 73 65 20 69 73 20 6f  ew database is o
a9e0: 70 65 6e 65 64 2c 20 77 65 20 68 61 76 65 20 74  pened, we have t
a9f0: 6f 20 66 69 6e 64 20 74 68 65 0a 2a 2a 20 73 70  o find the.** sp
aa00: 65 63 69 66 69 63 20 69 6e 6f 64 65 20 6f 66 20  ecific inode of 
aa10: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
aa20: 65 20 28 74 68 65 20 69 6e 6f 64 65 20 69 73 20  e (the inode is 
aa30: 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68  determined by th
aa40: 65 0a 2a 2a 20 73 74 5f 64 65 76 20 61 6e 64 20  e.** st_dev and 
aa50: 73 74 5f 69 6e 6f 20 66 69 65 6c 64 73 20 6f 66  st_ino fields of
aa60: 20 74 68 65 20 73 74 61 74 20 73 74 72 75 63 74   the stat struct
aa70: 75 72 65 20 74 68 61 74 20 66 73 74 61 74 28 29  ure that fstat()
aa80: 20 66 69 6c 6c 73 20 69 6e 29 0a 2a 2a 20 61 6e   fills in).** an
aa90: 64 20 63 68 65 63 6b 20 66 6f 72 20 6c 6f 63 6b  d check for lock
aaa0: 73 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 69  s already existi
aab0: 6e 67 20 6f 6e 20 74 68 61 74 20 69 6e 6f 64 65  ng on that inode
aac0: 2e 20 20 57 68 65 6e 20 6c 6f 63 6b 73 20 61 72  .  When locks ar
aad0: 65 0a 2a 2a 20 63 72 65 61 74 65 64 20 6f 72 20  e.** created or 
aae0: 72 65 6d 6f 76 65 64 2c 20 77 65 20 68 61 76 65  removed, we have
aaf0: 20 74 6f 20 6c 6f 6f 6b 20 61 74 20 6f 75 72 20   to look at our 
ab00: 6f 77 6e 20 69 6e 74 65 72 6e 61 6c 20 72 65 63  own internal rec
ab10: 6f 72 64 20 6f 66 20 74 68 65 0a 2a 2a 20 6c 6f  ord of the.** lo
ab20: 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20 61 6e  cks to see if an
ab30: 6f 74 68 65 72 20 74 68 72 65 61 64 20 68 61 73  other thread has
ab40: 20 70 72 65 76 69 6f 75 73 6c 79 20 73 65 74 20   previously set 
ab50: 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 61 74 20 73  a lock on that s
ab60: 61 6d 65 0a 2a 2a 20 69 6e 6f 64 65 2e 0a 2a 2a  ame.** inode..**
ab70: 0a 2a 2a 20 28 41 73 69 64 65 3a 20 54 68 65 20  .** (Aside: The 
ab80: 75 73 65 20 6f 66 20 69 6e 6f 64 65 20 6e 75 6d  use of inode num
ab90: 62 65 72 73 20 61 73 20 75 6e 69 71 75 65 20 49  bers as unique I
aba0: 44 73 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b  Ds does not work
abb0: 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a 20   on VxWorks..** 
abc0: 46 6f 72 20 56 78 57 6f 72 6b 73 2c 20 77 65 20  For VxWorks, we 
abd0: 68 61 76 65 20 74 6f 20 75 73 65 20 74 68 65 20  have to use the 
abe0: 61 6c 74 65 72 6e 61 74 69 76 65 20 75 6e 69 71  alternative uniq
abf0: 75 65 20 49 44 20 73 79 73 74 65 6d 20 62 61 73  ue ID system bas
ac00: 65 64 20 6f 6e 0a 2a 2a 20 63 61 6e 6f 6e 69 63  ed on.** canonic
ac10: 61 6c 20 66 69 6c 65 6e 61 6d 65 20 61 6e 64 20  al filename and 
ac20: 69 6d 70 6c 65 6d 65 6e 74 65 64 20 69 6e 20 74  implemented in t
ac30: 68 65 20 70 72 65 76 69 6f 75 73 20 64 69 76 69  he previous divi
ac40: 73 69 6f 6e 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 65  sion.).**.** The
ac50: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 73 74   sqlite3_file st
ac60: 72 75 63 74 75 72 65 20 66 6f 72 20 50 4f 53 49  ructure for POSI
ac70: 58 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6a  X is no longer j
ac80: 75 73 74 20 61 6e 20 69 6e 74 65 67 65 72 20 66  ust an integer f
ac90: 69 6c 65 0a 2a 2a 20 64 65 73 63 72 69 70 74 6f  ile.** descripto
aca0: 72 2e 20 20 49 74 20 69 73 20 6e 6f 77 20 61 20  r.  It is now a 
acb0: 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20 68  structure that h
acc0: 6f 6c 64 73 20 74 68 65 20 69 6e 74 65 67 65 72  olds the integer
acd0: 20 66 69 6c 65 0a 2a 2a 20 64 65 73 63 72 69 70   file.** descrip
ace0: 74 6f 72 20 61 6e 64 20 61 20 70 6f 69 6e 74 65  tor and a pointe
acf0: 72 20 74 6f 20 61 20 73 74 72 75 63 74 75 72 65  r to a structure
ad00: 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20   that describes 
ad10: 74 68 65 20 69 6e 74 65 72 6e 61 6c 0a 2a 2a 20  the internal.** 
ad20: 6c 6f 63 6b 73 20 6f 6e 20 74 68 65 20 63 6f 72  locks on the cor
ad30: 72 65 73 70 6f 6e 64 69 6e 67 20 69 6e 6f 64 65  responding inode
ad40: 2e 20 20 54 68 65 72 65 20 69 73 20 6f 6e 65 20  .  There is one 
ad50: 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63 74 75 72  locking structur
ad60: 65 0a 2a 2a 20 70 65 72 20 69 6e 6f 64 65 2c 20  e.** per inode, 
ad70: 73 6f 20 69 66 20 74 68 65 20 73 61 6d 65 20 69  so if the same i
ad80: 6e 6f 64 65 20 69 73 20 6f 70 65 6e 65 64 20 74  node is opened t
ad90: 77 69 63 65 2c 20 62 6f 74 68 20 75 6e 69 78 46  wice, both unixF
ada0: 69 6c 65 20 73 74 72 75 63 74 75 72 65 73 0a 2a  ile structures.*
adb0: 2a 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 73  * point to the s
adc0: 61 6d 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75  ame locking stru
add0: 63 74 75 72 65 2e 20 20 54 68 65 20 6c 6f 63 6b  cture.  The lock
ade0: 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 6b 65  ing structure ke
adf0: 65 70 73 0a 2a 2a 20 61 20 72 65 66 65 72 65 6e  eps.** a referen
ae00: 63 65 20 63 6f 75 6e 74 20 28 73 6f 20 77 65 20  ce count (so we 
ae10: 77 69 6c 6c 20 6b 6e 6f 77 20 77 68 65 6e 20 74  will know when t
ae20: 6f 20 64 65 6c 65 74 65 20 69 74 29 20 61 6e 64  o delete it) and
ae30: 20 61 20 22 63 6e 74 22 0a 2a 2a 20 66 69 65 6c   a "cnt".** fiel
ae40: 64 20 74 68 61 74 20 74 65 6c 6c 73 20 75 73 20  d that tells us 
ae50: 69 74 73 20 69 6e 74 65 72 6e 61 6c 20 6c 6f 63  its internal loc
ae60: 6b 20 73 74 61 74 75 73 2e 20 20 63 6e 74 3d 3d  k status.  cnt==
ae70: 30 20 6d 65 61 6e 73 20 74 68 65 0a 2a 2a 20 66  0 means the.** f
ae80: 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64 2e  ile is unlocked.
ae90: 20 20 63 6e 74 3d 3d 2d 31 20 6d 65 61 6e 73 20    cnt==-1 means 
aea0: 74 68 65 20 66 69 6c 65 20 68 61 73 20 61 6e 20  the file has an 
aeb0: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e 0a  exclusive lock..
aec0: 2a 2a 20 63 6e 74 3e 30 20 6d 65 61 6e 73 20 74  ** cnt>0 means t
aed0: 68 65 72 65 20 61 72 65 20 63 6e 74 20 73 68 61  here are cnt sha
aee0: 72 65 64 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 65  red locks on the
aef0: 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79   file..**.** Any
af00: 20 61 74 74 65 6d 70 74 20 74 6f 20 6c 6f 63 6b   attempt to lock
af10: 20 6f 72 20 75 6e 6c 6f 63 6b 20 61 20 66 69 6c   or unlock a fil
af20: 65 20 66 69 72 73 74 20 63 68 65 63 6b 73 20 74  e first checks t
af30: 68 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 73 74  he locking.** st
af40: 72 75 63 74 75 72 65 2e 20 20 54 68 65 20 66 63  ructure.  The fc
af50: 6e 74 6c 28 29 20 73 79 73 74 65 6d 20 63 61 6c  ntl() system cal
af60: 6c 20 69 73 20 6f 6e 6c 79 20 69 6e 76 6f 6b 65  l is only invoke
af70: 64 20 74 6f 20 73 65 74 20 61 20 0a 2a 2a 20 50  d to set a .** P
af80: 4f 53 49 58 20 6c 6f 63 6b 20 69 66 20 74 68 65  OSIX lock if the
af90: 20 69 6e 74 65 72 6e 61 6c 20 6c 6f 63 6b 20 73   internal lock s
afa0: 74 72 75 63 74 75 72 65 20 74 72 61 6e 73 69 74  tructure transit
afb0: 69 6f 6e 73 20 62 65 74 77 65 65 6e 0a 2a 2a 20  ions between.** 
afc0: 61 20 6c 6f 63 6b 65 64 20 61 6e 64 20 61 6e 20  a locked and an 
afd0: 75 6e 6c 6f 63 6b 65 64 20 73 74 61 74 65 2e 0a  unlocked state..
afe0: 2a 2a 0a 2a 2a 20 42 75 74 20 77 61 69 74 3a 20  **.** But wait: 
aff0: 20 74 68 65 72 65 20 61 72 65 20 79 65 74 20 6d   there are yet m
b000: 6f 72 65 20 70 72 6f 62 6c 65 6d 73 20 77 69 74  ore problems wit
b010: 68 20 50 4f 53 49 58 20 61 64 76 69 73 6f 72 79  h POSIX advisory
b020: 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 49 66   locks..**.** If
b030: 20 79 6f 75 20 63 6c 6f 73 65 20 61 20 66 69 6c   you close a fil
b040: 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 68 61  e descriptor tha
b050: 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 66 69  t points to a fi
b060: 6c 65 20 74 68 61 74 20 68 61 73 20 6c 6f 63 6b  le that has lock
b070: 73 2c 0a 2a 2a 20 61 6c 6c 20 6c 6f 63 6b 73 20  s,.** all locks 
b080: 6f 6e 20 74 68 61 74 20 66 69 6c 65 20 74 68 61  on that file tha
b090: 74 20 61 72 65 20 6f 77 6e 65 64 20 62 79 20 74  t are owned by t
b0a0: 68 65 20 63 75 72 72 65 6e 74 20 70 72 6f 63 65  he current proce
b0b0: 73 73 20 61 72 65 0a 2a 2a 20 72 65 6c 65 61 73  ss are.** releas
b0c0: 65 64 2e 20 20 54 6f 20 77 6f 72 6b 20 61 72 6f  ed.  To work aro
b0d0: 75 6e 64 20 74 68 69 73 20 70 72 6f 62 6c 65 6d  und this problem
b0e0: 2c 20 65 61 63 68 20 75 6e 69 78 49 6e 6f 64 65  , each unixInode
b0f0: 49 6e 66 6f 20 6f 62 6a 65 63 74 0a 2a 2a 20 6d  Info object.** m
b100: 61 69 6e 74 61 69 6e 73 20 61 20 63 6f 75 6e 74  aintains a count
b110: 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   of the number o
b120: 66 20 70 65 6e 64 69 6e 67 20 6c 6f 63 6b 73 20  f pending locks 
b130: 6f 6e 20 74 68 61 20 69 6e 6f 64 65 2e 0a 2a 2a  on tha inode..**
b140: 20 57 68 65 6e 20 61 6e 20 61 74 74 65 6d 70 74   When an attempt
b150: 20 69 73 20 6d 61 64 65 20 74 6f 20 63 6c 6f 73   is made to clos
b160: 65 20 61 6e 20 75 6e 69 78 46 69 6c 65 2c 20 69  e an unixFile, i
b170: 66 20 74 68 65 72 65 20 61 72 65 0a 2a 2a 20 6f  f there are.** o
b180: 74 68 65 72 20 75 6e 69 78 46 69 6c 65 20 6f 70  ther unixFile op
b190: 65 6e 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 69  en on the same i
b1a0: 6e 6f 64 65 20 74 68 61 74 20 61 72 65 20 68 6f  node that are ho
b1b0: 6c 64 69 6e 67 20 6c 6f 63 6b 73 2c 20 74 68 65  lding locks, the
b1c0: 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 63 6c 6f 73   call.** to clos
b1d0: 65 28 29 20 74 68 65 20 66 69 6c 65 20 64 65 73  e() the file des
b1e0: 63 72 69 70 74 6f 72 20 69 73 20 64 65 66 65 72  criptor is defer
b1f0: 72 65 64 20 75 6e 74 69 6c 20 61 6c 6c 20 6f 66  red until all of
b200: 20 74 68 65 20 6c 6f 63 6b 73 20 63 6c 65 61 72   the locks clear
b210: 2e 0a 2a 2a 20 54 68 65 20 75 6e 69 78 49 6e 6f  ..** The unixIno
b220: 64 65 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65  deInfo structure
b230: 20 6b 65 65 70 73 20 61 20 6c 69 73 74 20 6f 66   keeps a list of
b240: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
b250: 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f 0a 2a  s that need to.*
b260: 2a 20 62 65 20 63 6c 6f 73 65 64 20 61 6e 64 20  * be closed and 
b270: 74 68 61 74 20 6c 69 73 74 20 69 73 20 77 61 6c  that list is wal
b280: 6b 65 64 20 28 61 6e 64 20 63 6c 65 61 72 65 64  ked (and cleared
b290: 29 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20  ) when the last 
b2a0: 6c 6f 63 6b 0a 2a 2a 20 63 6c 65 61 72 73 2e 0a  lock.** clears..
b2b0: 2a 2a 0a 2a 2a 20 59 65 74 20 61 6e 6f 74 68 65  **.** Yet anothe
b2c0: 72 20 70 72 6f 62 6c 65 6d 3a 20 20 4c 69 6e 75  r problem:  Linu
b2d0: 78 54 68 72 65 61 64 73 20 64 6f 20 6e 6f 74 20  xThreads do not 
b2e0: 70 6c 61 79 20 77 65 6c 6c 20 77 69 74 68 20 70  play well with p
b2f0: 6f 73 69 78 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a  osix locks..**.*
b300: 2a 20 4d 61 6e 79 20 6f 6c 64 65 72 20 76 65 72  * Many older ver
b310: 73 69 6f 6e 73 20 6f 66 20 6c 69 6e 75 78 20 75  sions of linux u
b320: 73 65 20 74 68 65 20 4c 69 6e 75 78 54 68 72 65  se the LinuxThre
b330: 61 64 73 20 6c 69 62 72 61 72 79 20 77 68 69 63  ads library whic
b340: 68 20 69 73 0a 2a 2a 20 6e 6f 74 20 70 6f 73 69  h is.** not posi
b350: 78 20 63 6f 6d 70 6c 69 61 6e 74 2e 20 20 55 6e  x compliant.  Un
b360: 64 65 72 20 4c 69 6e 75 78 54 68 72 65 61 64 73  der LinuxThreads
b370: 2c 20 61 20 6c 6f 63 6b 20 63 72 65 61 74 65 64  , a lock created
b380: 20 62 79 20 74 68 72 65 61 64 0a 2a 2a 20 41 20   by thread.** A 
b390: 63 61 6e 6e 6f 74 20 62 65 20 6d 6f 64 69 66 69  cannot be modifi
b3a0: 65 64 20 6f 72 20 6f 76 65 72 72 69 64 64 65 6e  ed or overridden
b3b0: 20 62 79 20 61 20 64 69 66 66 65 72 65 6e 74 20   by a different 
b3c0: 74 68 72 65 61 64 20 42 2e 0a 2a 2a 20 4f 6e 6c  thread B..** Onl
b3d0: 79 20 74 68 72 65 61 64 20 41 20 63 61 6e 20 6d  y thread A can m
b3e0: 6f 64 69 66 79 20 74 68 65 20 6c 6f 63 6b 2e 20  odify the lock. 
b3f0: 20 4c 6f 63 6b 69 6e 67 20 62 65 68 61 76 69 6f   Locking behavio
b400: 72 20 69 73 20 63 6f 72 72 65 63 74 0a 2a 2a 20  r is correct.** 
b410: 69 66 20 74 68 65 20 61 70 70 6c 69 61 74 69 6f  if the appliatio
b420: 6e 20 75 73 65 73 20 74 68 65 20 6e 65 77 65 72  n uses the newer
b430: 20 4e 61 74 69 76 65 20 50 6f 73 69 78 20 54 68   Native Posix Th
b440: 72 65 61 64 20 4c 69 62 72 61 72 79 20 28 4e 50  read Library (NP
b450: 54 4c 29 0a 2a 2a 20 6f 6e 20 6c 69 6e 75 78 20  TL).** on linux 
b460: 2d 20 77 69 74 68 20 4e 50 54 4c 20 61 20 6c 6f  - with NPTL a lo
b470: 63 6b 20 63 72 65 61 74 65 64 20 62 79 20 74 68  ck created by th
b480: 72 65 61 64 20 41 20 63 61 6e 20 6f 76 65 72 72  read A can overr
b490: 69 64 65 20 6c 6f 63 6b 73 0a 2a 2a 20 69 6e 20  ide locks.** in 
b4a0: 74 68 72 65 61 64 20 42 2e 20 20 42 75 74 20 74  thread B.  But t
b4b0: 68 65 72 65 20 69 73 20 6e 6f 20 77 61 79 20 74  here is no way t
b4c0: 6f 20 6b 6e 6f 77 20 61 74 20 63 6f 6d 70 69 6c  o know at compil
b4d0: 65 2d 74 69 6d 65 20 77 68 69 63 68 0a 2a 2a 20  e-time which.** 
b4e0: 74 68 72 65 61 64 69 6e 67 20 6c 69 62 72 61 72  threading librar
b4f0: 79 20 69 73 20 62 65 69 6e 67 20 75 73 65 64 2e  y is being used.
b500: 20 20 53 6f 20 74 68 65 72 65 20 69 73 20 6e 6f    So there is no
b510: 20 77 61 79 20 74 6f 20 6b 6e 6f 77 20 61 74 0a   way to know at.
b520: 2a 2a 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20  ** compile-time 
b530: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
b540: 68 72 65 61 64 20 41 20 63 61 6e 20 6f 76 65 72  hread A can over
b550: 72 69 64 65 20 6c 6f 63 6b 73 20 6f 6e 20 74 68  ride locks on th
b560: 72 65 61 64 20 42 2e 0a 2a 2a 20 4f 6e 65 20 68  read B..** One h
b570: 61 73 20 74 6f 20 64 6f 20 61 20 72 75 6e 2d 74  as to do a run-t
b580: 69 6d 65 20 63 68 65 63 6b 20 74 6f 20 64 69 73  ime check to dis
b590: 63 6f 76 65 72 20 74 68 65 20 62 65 68 61 76 69  cover the behavi
b5a0: 6f 72 20 6f 66 20 74 68 65 0a 2a 2a 20 63 75 72  or of the.** cur
b5b0: 72 65 6e 74 20 70 72 6f 63 65 73 73 2e 0a 2a 2a  rent process..**
b5c0: 0a 2a 2a 20 53 51 4c 69 74 65 20 75 73 65 64 20  .** SQLite used 
b5d0: 74 6f 20 73 75 70 70 6f 72 74 20 4c 69 6e 75 78  to support Linux
b5e0: 54 68 72 65 61 64 73 2e 20 20 42 75 74 20 73 75  Threads.  But su
b5f0: 70 70 6f 72 74 20 66 6f 72 20 4c 69 6e 75 78 54  pport for LinuxT
b600: 68 72 65 61 64 73 0a 2a 2a 20 77 61 73 20 64 72  hreads.** was dr
b610: 6f 70 70 65 64 20 62 65 67 69 6e 6e 69 6e 67 20  opped beginning 
b620: 77 69 74 68 20 76 65 72 73 69 6f 6e 20 33 2e 37  with version 3.7
b630: 2e 30 2e 20 20 53 51 4c 69 74 65 20 77 69 6c 6c  .0.  SQLite will
b640: 20 73 74 69 6c 6c 20 77 6f 72 6b 20 77 69 74 68   still work with
b650: 0a 2a 2a 20 4c 69 6e 75 78 54 68 72 65 61 64 73  .** LinuxThreads
b660: 20 70 72 6f 76 69 64 65 64 20 74 68 61 74 20 28   provided that (
b670: 31 29 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d  1) there is no m
b680: 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 63 6f 6e  ore than one con
b690: 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20 70 65 72 20  nection .** per 
b6a0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e  database file in
b6b0: 20 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73   the same proces
b6c0: 73 20 61 6e 64 20 28 32 29 20 64 61 74 61 62 61  s and (2) databa
b6d0: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 0a 2a  se connections.*
b6e0: 2a 20 64 6f 20 6e 6f 74 20 6d 6f 76 65 20 61 63  * do not move ac
b6f0: 72 6f 73 73 20 74 68 72 65 61 64 73 2e 0a 2a 2f  ross threads..*/
b700: 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61  ../*.** An insta
b710: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
b720: 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 20 73  wing structure s
b730: 65 72 76 65 73 20 61 73 20 74 68 65 20 6b 65 79  erves as the key
b740: 20 75 73 65 64 0a 2a 2a 20 74 6f 20 6c 6f 63 61   used.** to loca
b750: 74 65 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  te a particular 
b760: 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62  unixInodeInfo ob
b770: 6a 65 63 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  ject..*/.struct 
b780: 75 6e 69 78 46 69 6c 65 49 64 20 7b 0a 20 20 64  unixFileId {.  d
b790: 65 76 5f 74 20 64 65 76 3b 20 20 20 20 20 20 20  ev_t dev;       
b7a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65             /* De
b7b0: 76 69 63 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 23  vice number */.#
b7c0: 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  if OS_VXWORKS.  
b7d0: 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46 69  struct vxworksFi
b7e0: 6c 65 49 64 20 2a 70 49 64 3b 20 20 2f 2a 20 55  leId *pId;  /* U
b7f0: 6e 69 71 75 65 20 66 69 6c 65 20 49 44 20 66 6f  nique file ID fo
b800: 72 20 76 78 77 6f 72 6b 73 2e 20 2a 2f 0a 23 65  r vxworks. */.#e
b810: 6c 73 65 0a 20 20 69 6e 6f 5f 74 20 69 6e 6f 3b  lse.  ino_t ino;
b820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b830: 20 20 2f 2a 20 49 6e 6f 64 65 20 6e 75 6d 62 65    /* Inode numbe
b840: 72 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a  r */.#endif.};..
b850: 2f 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63  /*.** An instanc
b860: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
b870: 6e 67 20 73 74 72 75 63 74 75 72 65 20 69 73 20  ng structure is 
b880: 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 65 61  allocated for ea
b890: 63 68 20 6f 70 65 6e 0a 2a 2a 20 69 6e 6f 64 65  ch open.** inode
b8a0: 2e 20 20 4f 72 2c 20 6f 6e 20 4c 69 6e 75 78 54  .  Or, on LinuxT
b8b0: 68 72 65 61 64 73 2c 20 74 68 65 72 65 20 69 73  hreads, there is
b8c0: 20 6f 6e 65 20 6f 66 20 74 68 65 73 65 20 73 74   one of these st
b8d0: 72 75 63 74 75 72 65 73 20 66 6f 72 0a 2a 2a 20  ructures for.** 
b8e0: 65 61 63 68 20 69 6e 6f 64 65 20 6f 70 65 6e 65  each inode opene
b8f0: 64 20 62 79 20 65 61 63 68 20 74 68 72 65 61 64  d by each thread
b900: 2e 0a 2a 2a 0a 2a 2a 20 41 20 73 69 6e 67 6c 65  ..**.** A single
b910: 20 69 6e 6f 64 65 20 63 61 6e 20 68 61 76 65 20   inode can have 
b920: 6d 75 6c 74 69 70 6c 65 20 66 69 6c 65 20 64 65  multiple file de
b930: 73 63 72 69 70 74 6f 72 73 2c 20 73 6f 20 65 61  scriptors, so ea
b940: 63 68 20 75 6e 69 78 46 69 6c 65 0a 2a 2a 20 73  ch unixFile.** s
b950: 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e  tructure contain
b960: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
b970: 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  n instance of th
b980: 69 73 20 6f 62 6a 65 63 74 20 61 6e 64 20 74 68  is object and th
b990: 69 73 0a 2a 2a 20 6f 62 6a 65 63 74 20 6b 65 65  is.** object kee
b9a0: 70 73 20 61 20 63 6f 75 6e 74 20 6f 66 20 74 68  ps a count of th
b9b0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 75 6e 69 78  e number of unix
b9c0: 46 69 6c 65 20 70 6f 69 6e 74 69 6e 67 20 74 6f  File pointing to
b9d0: 20 69 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 75   it..*/.struct u
b9e0: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 7b 0a 20  nixInodeInfo {. 
b9f0: 20 73 74 72 75 63 74 20 75 6e 69 78 46 69 6c 65   struct unixFile
ba00: 49 64 20 66 69 6c 65 49 64 3b 20 20 20 20 20 20  Id fileId;      
ba10: 20 2f 2a 20 54 68 65 20 6c 6f 6f 6b 75 70 20 6b   /* The lookup k
ba20: 65 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 68 61  ey */.  int nSha
ba30: 72 65 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  red;            
ba40: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
ba50: 72 20 6f 66 20 53 48 41 52 45 44 20 6c 6f 63 6b  r of SHARED lock
ba60: 73 20 68 65 6c 64 20 2a 2f 0a 20 20 75 6e 73 69  s held */.  unsi
ba70: 67 6e 65 64 20 63 68 61 72 20 65 46 69 6c 65 4c  gned char eFileL
ba80: 6f 63 6b 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f  ock;        /* O
ba90: 6e 65 20 6f 66 20 53 48 41 52 45 44 5f 4c 4f 43  ne of SHARED_LOC
baa0: 4b 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  K, RESERVED_LOCK
bab0: 20 65 74 63 2e 20 2a 2f 0a 20 20 75 6e 73 69 67   etc. */.  unsig
bac0: 6e 65 64 20 63 68 61 72 20 62 50 72 6f 63 65 73  ned char bProces
bad0: 73 4c 6f 63 6b 3b 20 20 20 20 20 2f 2a 20 41 6e  sLock;     /* An
bae0: 20 65 78 63 6c 75 73 69 76 65 20 70 72 6f 63 65   exclusive proce
baf0: 73 73 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20  ss lock is held 
bb00: 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20  */.  int nRef;  
bb10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bb20: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
bb30: 66 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 74 68  f pointers to th
bb40: 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  is structure */.
bb50: 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70    unixShmNode *p
bb60: 53 68 6d 4e 6f 64 65 3b 20 20 20 20 20 20 20 20  ShmNode;        
bb70: 20 20 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f    /* Shared memo
bb80: 72 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ry associated wi
bb90: 74 68 20 74 68 69 73 20 69 6e 6f 64 65 20 2a 2f  th this inode */
bba0: 0a 20 20 69 6e 74 20 6e 4c 6f 63 6b 3b 20 20 20  .  int nLock;   
bbb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bbc0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
bbd0: 6f 75 74 73 74 61 6e 64 69 6e 67 20 66 69 6c 65  outstanding file
bbe0: 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 55 6e 69 78   locks */.  Unix
bbf0: 55 6e 75 73 65 64 46 64 20 2a 70 55 6e 75 73 65  UnusedFd *pUnuse
bc00: 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55  d;          /* U
bc10: 6e 75 73 65 64 20 66 69 6c 65 20 64 65 73 63 72  nused file descr
bc20: 69 70 74 6f 72 73 20 74 6f 20 63 6c 6f 73 65 20  iptors to close 
bc30: 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e  */.  unixInodeIn
bc40: 66 6f 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20  fo *pNext;      
bc50: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
bc60: 61 6c 6c 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  all unixInodeInf
bc70: 6f 20 6f 62 6a 65 63 74 73 20 2a 2f 0a 20 20 75  o objects */.  u
bc80: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 50  nixInodeInfo *pP
bc90: 72 65 76 3b 20 20 20 20 20 20 20 20 20 20 20 2f  rev;           /
bca0: 2a 20 20 20 20 2e 2e 2e 2e 20 64 6f 75 62 6c 79  *    .... doubly
bcb0: 20 6c 69 6e 6b 65 64 20 2a 2f 0a 23 69 66 20 53   linked */.#if S
bcc0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
bcd0: 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 75 6e 73  KING_STYLE.  uns
bce0: 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20  igned long long 
bcf0: 73 68 61 72 65 64 42 79 74 65 3b 20 20 2f 2a 20  sharedByte;  /* 
bd00: 66 6f 72 20 41 46 50 20 73 69 6d 75 6c 61 74 65  for AFP simulate
bd10: 64 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 2a 2f  d shared lock */
bd20: 0a 23 65 6e 64 69 66 0a 23 69 66 20 4f 53 5f 56  .#endif.#if OS_V
bd30: 58 57 4f 52 4b 53 0a 20 20 73 65 6d 5f 74 20 2a  XWORKS.  sem_t *
bd40: 70 53 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20  pSem;           
bd50: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
bd60: 64 20 50 4f 53 49 58 20 73 65 6d 61 70 68 6f 72  d POSIX semaphor
bd70: 65 20 2a 2f 0a 20 20 63 68 61 72 20 61 53 65 6d  e */.  char aSem
bd80: 4e 61 6d 65 5b 4d 41 58 5f 50 41 54 48 4e 41 4d  Name[MAX_PATHNAM
bd90: 45 2b 32 5d 3b 20 20 2f 2a 20 4e 61 6d 65 20 6f  E+2];  /* Name o
bda0: 66 20 74 68 61 74 20 73 65 6d 61 70 68 6f 72 65  f that semaphore
bdb0: 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f   */.#endif.};../
bdc0: 2a 0a 2a 2a 20 41 20 6c 69 73 74 73 20 6f 66 20  *.** A lists of 
bdd0: 61 6c 6c 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  all unixInodeInf
bde0: 6f 20 6f 62 6a 65 63 74 73 2e 0a 2a 2f 0a 73 74  o objects..*/.st
bdf0: 61 74 69 63 20 75 6e 69 78 49 6e 6f 64 65 49 6e  atic unixInodeIn
be00: 66 6f 20 2a 69 6e 6f 64 65 4c 69 73 74 20 3d 20  fo *inodeList = 
be10: 30 3b 0a 0a 2f 2a 0a 2a 2a 0a 2a 2a 20 54 68 69  0;../*.**.** Thi
be20: 73 20 66 75 6e 63 74 69 6f 6e 20 2d 20 75 6e 69  s function - uni
be30: 78 4c 6f 67 45 72 72 6f 72 5f 78 28 29 2c 20 69  xLogError_x(), i
be40: 73 20 6f 6e 6c 79 20 65 76 65 72 20 63 61 6c 6c  s only ever call
be50: 65 64 20 76 69 61 20 74 68 65 20 6d 61 63 72 6f  ed via the macro
be60: 0a 2a 2a 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72  .** unixLogError
be70: 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20  ()..**.** It is 
be80: 69 6e 76 6f 6b 65 64 20 61 66 74 65 72 20 61 6e  invoked after an
be90: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 69 6e   error occurs in
bea0: 20 61 6e 20 4f 53 20 66 75 6e 63 74 69 6f 6e 20   an OS function 
beb0: 61 6e 64 20 65 72 72 6e 6f 20 68 61 73 20 62 65  and errno has be
bec0: 65 6e 0a 2a 2a 20 73 65 74 2e 20 49 74 20 6c 6f  en.** set. It lo
bed0: 67 73 20 61 20 6d 65 73 73 61 67 65 20 75 73 69  gs a message usi
bee0: 6e 67 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 29  ng sqlite3_log()
bef0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
bf00: 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66  current value of
bf10: 0a 2a 2a 20 65 72 72 6e 6f 20 61 6e 64 2c 20 69  .** errno and, i
bf20: 66 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 65 20  f possible, the 
bf30: 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65 20 65  human-readable e
bf40: 71 75 69 76 61 6c 65 6e 74 20 66 72 6f 6d 20 73  quivalent from s
bf50: 74 72 65 72 72 6f 72 28 29 20 6f 72 0a 2a 2a 20  trerror() or.** 
bf60: 73 74 72 65 72 72 6f 72 5f 72 28 29 2e 0a 2a 2a  strerror_r()..**
bf70: 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 61 72  .** The first ar
bf80: 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f  gument passed to
bf90: 20 74 68 65 20 6d 61 63 72 6f 20 73 68 6f 75 6c   the macro shoul
bfa0: 64 20 62 65 20 74 68 65 20 65 72 72 6f 72 20 63  d be the error c
bfb0: 6f 64 65 20 74 68 61 74 0a 2a 2a 20 77 69 6c 6c  ode that.** will
bfc0: 20 62 65 20 72 65 74 75 72 6e 65 64 20 74 6f 20   be returned to 
bfd0: 53 51 4c 69 74 65 20 28 65 2e 67 2e 20 53 51 4c  SQLite (e.g. SQL
bfe0: 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45  ITE_IOERR_DELETE
bff0: 2c 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  , SQLITE_CANTOPE
c000: 4e 29 2e 20 0a 2a 2a 20 54 68 65 20 74 77 6f 20  N). .** The two 
c010: 73 75 62 73 65 71 75 65 6e 74 20 61 72 67 75 6d  subsequent argum
c020: 65 6e 74 73 20 73 68 6f 75 6c 64 20 62 65 20 74  ents should be t
c030: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 4f  he name of the O
c040: 53 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 0a  S function that.
c050: 2a 2a 20 66 61 69 6c 65 64 20 28 65 2e 67 2e 20  ** failed (e.g. 
c060: 22 75 6e 6c 69 6e 6b 22 2c 20 22 6f 70 65 6e 22  "unlink", "open"
c070: 29 20 61 6e 64 20 74 68 65 20 61 73 73 6f 63 69  ) and the associ
c080: 61 74 65 64 20 66 69 6c 65 2d 73 79 73 74 65 6d  ated file-system
c090: 20 70 61 74 68 2c 0a 2a 2a 20 69 66 20 61 6e 79   path,.** if any
c0a0: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 75 6e 69  ..*/.#define uni
c0b0: 78 4c 6f 67 45 72 72 6f 72 28 61 2c 62 2c 63 29  xLogError(a,b,c)
c0c0: 20 20 20 20 20 75 6e 69 78 4c 6f 67 45 72 72 6f       unixLogErro
c0d0: 72 41 74 4c 69 6e 65 28 61 2c 62 2c 63 2c 5f 5f  rAtLine(a,b,c,__
c0e0: 4c 49 4e 45 5f 5f 29 0a 73 74 61 74 69 63 20 69  LINE__).static i
c0f0: 6e 74 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 41  nt unixLogErrorA
c100: 74 4c 69 6e 65 28 0a 20 20 69 6e 74 20 65 72 72  tLine(.  int err
c110: 63 6f 64 65 2c 20 20 20 20 20 20 20 20 20 20 20  code,           
c120: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 69           /* SQLi
c130: 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 2a 2f  te error code */
c140: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
c150: 46 75 6e 63 2c 20 20 20 20 20 20 20 20 20 20 20  Func,           
c160: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 4f 53     /* Name of OS
c170: 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 66   function that f
c180: 61 69 6c 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  ailed */.  const
c190: 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20   char *zPath,   
c1a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
c1b0: 6c 65 20 70 61 74 68 20 61 73 73 6f 63 69 61 74  le path associat
c1c0: 65 64 20 77 69 74 68 20 65 72 72 6f 72 20 2a 2f  ed with error */
c1d0: 0a 20 20 69 6e 74 20 69 4c 69 6e 65 20 20 20 20  .  int iLine    
c1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c1f0: 20 20 20 2f 2a 20 53 6f 75 72 63 65 20 6c 69 6e     /* Source lin
c200: 65 20 6e 75 6d 62 65 72 20 77 68 65 72 65 20 65  e number where e
c210: 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20 2a 2f  rror occurred */
c220: 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72  .){.  char *zErr
c230: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
c240: 20 20 20 20 20 20 2f 2a 20 4d 65 73 73 61 67 65        /* Message
c250: 20 66 72 6f 6d 20 73 74 72 65 72 72 6f 72 28 29   from strerror()
c260: 20 6f 72 20 65 71 75 69 76 61 6c 65 6e 74 20 2a   or equivalent *
c270: 2f 0a 20 20 69 6e 74 20 69 45 72 72 6e 6f 20 3d  /.  int iErrno =
c280: 20 65 72 72 6e 6f 3b 20 20 20 20 20 20 20 20 20   errno;         
c290: 20 20 20 20 2f 2a 20 53 61 76 65 64 20 73 79 73      /* Saved sys
c2a0: 63 61 6c 6c 20 65 72 72 6f 72 20 6e 75 6d 62 65  call error numbe
c2b0: 72 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 74 68  r */..  /* If th
c2c0: 69 73 20 69 73 20 6e 6f 74 20 61 20 74 68 72 65  is is not a thre
c2d0: 61 64 73 61 66 65 20 62 75 69 6c 64 20 28 53 51  adsafe build (SQ
c2e0: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 3d  LITE_THREADSAFE=
c2f0: 3d 30 29 2c 20 74 68 65 6e 20 75 73 65 0a 20 20  =0), then use.  
c300: 2a 2a 20 74 68 65 20 73 74 72 65 72 72 6f 72 28  ** the strerror(
c310: 29 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 6f 62  ) function to ob
c320: 74 61 69 6e 20 74 68 65 20 68 75 6d 61 6e 2d 72  tain the human-r
c330: 65 61 64 61 62 6c 65 20 65 72 72 6f 72 20 6d 65  eadable error me
c340: 73 73 61 67 65 0a 20 20 2a 2a 20 65 71 75 69 76  ssage.  ** equiv
c350: 61 6c 65 6e 74 20 74 6f 20 65 72 72 6e 6f 2e 20  alent to errno. 
c360: 4f 74 68 65 72 77 69 73 65 2c 20 75 73 65 20 73  Otherwise, use s
c370: 74 72 65 72 72 6f 72 5f 72 28 29 2e 0a 20 20 2a  trerror_r()..  *
c380: 2f 20 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 48  / .#if SQLITE_TH
c390: 52 45 41 44 53 41 46 45 20 26 26 20 64 65 66 69  READSAFE && defi
c3a0: 6e 65 64 28 48 41 56 45 5f 53 54 52 45 52 52 4f  ned(HAVE_STRERRO
c3b0: 52 5f 52 29 0a 20 20 63 68 61 72 20 61 45 72 72  R_R).  char aErr
c3c0: 5b 38 30 5d 3b 0a 20 20 6d 65 6d 73 65 74 28 61  [80];.  memset(a
c3d0: 45 72 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 61  Err, 0, sizeof(a
c3e0: 45 72 72 29 29 3b 0a 20 20 7a 45 72 72 20 3d 20  Err));.  zErr = 
c3f0: 61 45 72 72 3b 0a 0a 20 20 2f 2a 20 49 66 20 53  aErr;..  /* If S
c400: 54 52 45 52 52 4f 52 5f 52 5f 43 48 41 52 5f 50  TRERROR_R_CHAR_P
c410: 20 28 73 65 74 20 62 79 20 61 75 74 6f 63 6f 6e   (set by autocon
c420: 66 20 73 63 72 69 70 74 73 29 20 6f 72 20 5f 5f  f scripts) or __
c430: 55 53 45 5f 47 4e 55 20 69 73 20 64 65 66 69 6e  USE_GNU is defin
c440: 65 64 2c 0a 20 20 2a 2a 20 61 73 73 75 6d 65 20  ed,.  ** assume 
c450: 74 68 61 74 20 74 68 65 20 73 79 73 74 65 6d 20  that the system 
c460: 70 72 6f 76 69 64 65 73 20 74 68 65 20 47 4e 55  provides the GNU
c470: 20 76 65 72 73 69 6f 6e 20 6f 66 20 73 74 72 65   version of stre
c480: 72 72 6f 72 5f 72 28 29 20 74 68 61 74 0a 20 20  rror_r() that.  
c490: 2a 2a 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69  ** returns a poi
c4a0: 6e 74 65 72 20 74 6f 20 61 20 62 75 66 66 65 72  nter to a buffer
c4b0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
c4c0: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 20 54  error message. T
c4d0: 68 61 74 20 70 6f 69 6e 74 65 72 20 0a 20 20 2a  hat pointer .  *
c4e0: 2a 20 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20 61  * may point to a
c4f0: 45 72 72 5b 5d 2c 20 6f 72 20 69 74 20 6d 61 79  Err[], or it may
c500: 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65 20 73   point to some s
c510: 74 61 74 69 63 20 73 74 6f 72 61 67 65 20 73 6f  tatic storage so
c520: 6d 65 77 68 65 72 65 2e 20 0a 20 20 2a 2a 20 4f  mewhere. .  ** O
c530: 74 68 65 72 77 69 73 65 2c 20 61 73 73 75 6d 65  therwise, assume
c540: 20 74 68 61 74 20 74 68 65 20 73 79 73 74 65 6d   that the system
c550: 20 70 72 6f 76 69 64 65 73 20 74 68 65 20 50 4f   provides the PO
c560: 53 49 58 20 76 65 72 73 69 6f 6e 20 6f 66 20 0a  SIX version of .
c570: 20 20 2a 2a 20 73 74 72 65 72 72 6f 72 5f 72 28    ** strerror_r(
c580: 29 2c 20 77 68 69 63 68 20 61 6c 77 61 79 73 20  ), which always 
c590: 77 72 69 74 65 73 20 61 6e 20 65 72 72 6f 72 20  writes an error 
c5a0: 6d 65 73 73 61 67 65 20 69 6e 74 6f 20 61 45 72  message into aEr
c5b0: 72 5b 5d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  r[]..  **.  ** I
c5c0: 66 20 74 68 65 20 63 6f 64 65 20 69 6e 63 6f 72  f the code incor
c5d0: 72 65 63 74 6c 79 20 61 73 73 75 6d 65 73 20 74  rectly assumes t
c5e0: 68 61 74 20 69 74 20 69 73 20 74 68 65 20 50 4f  hat it is the PO
c5f0: 53 49 58 20 76 65 72 73 69 6f 6e 20 74 68 61 74  SIX version that
c600: 20 69 73 0a 20 20 2a 2a 20 61 76 61 69 6c 61 62   is.  ** availab
c610: 6c 65 2c 20 74 68 65 20 65 72 72 6f 72 20 6d 65  le, the error me
c620: 73 73 61 67 65 20 77 69 6c 6c 20 6f 66 74 65 6e  ssage will often
c630: 20 62 65 20 61 6e 20 65 6d 70 74 79 20 73 74 72   be an empty str
c640: 69 6e 67 2e 20 4e 6f 74 20 61 0a 20 20 2a 2a 20  ing. Not a.  ** 
c650: 68 75 67 65 20 70 72 6f 62 6c 65 6d 2e 20 49 6e  huge problem. In
c660: 63 6f 72 72 65 63 74 6c 79 20 63 6f 6e 63 6c 75  correctly conclu
c670: 64 69 6e 67 20 74 68 61 74 20 74 68 65 20 47 4e  ding that the GN
c680: 55 20 76 65 72 73 69 6f 6e 20 69 73 20 61 76 61  U version is ava
c690: 69 6c 61 62 6c 65 20 0a 20 20 2a 2a 20 63 6f 75  ilable .  ** cou
c6a0: 6c 64 20 6c 65 61 64 20 74 6f 20 61 20 73 65 67  ld lead to a seg
c6b0: 66 61 75 6c 74 20 74 68 6f 75 67 68 2e 0a 20 20  fault though..  
c6c0: 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  */.#if defined(S
c6d0: 54 52 45 52 52 4f 52 5f 52 5f 43 48 41 52 5f 50  TRERROR_R_CHAR_P
c6e0: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f 55  ) || defined(__U
c6f0: 53 45 5f 47 4e 55 29 0a 20 20 7a 45 72 72 20 3d  SE_GNU).  zErr =
c700: 20 0a 23 20 65 6e 64 69 66 0a 20 20 73 74 72 65   .# endif.  stre
c710: 72 72 6f 72 5f 72 28 69 45 72 72 6e 6f 2c 20 61  rror_r(iErrno, a
c720: 45 72 72 2c 20 73 69 7a 65 6f 66 28 61 45 72 72  Err, sizeof(aErr
c730: 29 2d 31 29 3b 0a 0a 23 65 6c 69 66 20 53 51 4c  )-1);..#elif SQL
c740: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a 20  ITE_THREADSAFE. 
c750: 20 2f 2a 20 54 68 69 73 20 69 73 20 61 20 74 68   /* This is a th
c760: 72 65 61 64 73 61 66 65 20 62 75 69 6c 64 2c 20  readsafe build, 
c770: 62 75 74 20 73 74 72 65 72 72 6f 72 5f 72 28 29  but strerror_r()
c780: 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c   is not availabl
c790: 65 2e 20 2a 2f 0a 20 20 7a 45 72 72 20 3d 20 22  e. */.  zErr = "
c7a0: 22 3b 0a 23 65 6c 73 65 0a 20 20 2f 2a 20 4e 6f  ";.#else.  /* No
c7b0: 6e 2d 74 68 72 65 61 64 73 61 66 65 20 62 75 69  n-threadsafe bui
c7c0: 6c 64 2c 20 75 73 65 20 73 74 72 65 72 72 6f 72  ld, use strerror
c7d0: 28 29 2e 20 2a 2f 0a 20 20 7a 45 72 72 20 3d 20  (). */.  zErr = 
c7e0: 73 74 72 65 72 72 6f 72 28 69 45 72 72 6e 6f 29  strerror(iErrno)
c7f0: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20  ;.#endif..  if( 
c800: 7a 50 61 74 68 3d 3d 30 20 29 20 7a 50 61 74 68  zPath==0 ) zPath
c810: 20 3d 20 22 22 3b 0a 20 20 73 71 6c 69 74 65 33   = "";.  sqlite3
c820: 5f 6c 6f 67 28 65 72 72 63 6f 64 65 2c 0a 20 20  _log(errcode,.  
c830: 20 20 20 20 22 6f 73 5f 75 6e 69 78 2e 63 3a 25      "os_unix.c:%
c840: 64 3a 20 28 25 64 29 20 25 73 28 25 73 29 20 2d  d: (%d) %s(%s) -
c850: 20 25 73 22 2c 0a 20 20 20 20 20 20 69 4c 69 6e   %s",.      iLin
c860: 65 2c 20 69 45 72 72 6e 6f 2c 20 7a 46 75 6e 63  e, iErrno, zFunc
c870: 2c 20 7a 50 61 74 68 2c 20 7a 45 72 72 0a 20 20  , zPath, zErr.  
c880: 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 65 72 72  );..  return err
c890: 63 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  code;.}../*.** C
c8a0: 6c 6f 73 65 20 61 20 66 69 6c 65 20 64 65 73 63  lose a file desc
c8b0: 72 69 70 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 57 65  riptor..**.** We
c8c0: 20 61 73 73 75 6d 65 20 74 68 61 74 20 63 6c 6f   assume that clo
c8d0: 73 65 28 29 20 61 6c 6d 6f 73 74 20 61 6c 77 61  se() almost alwa
c8e0: 79 73 20 77 6f 72 6b 73 2c 20 73 69 6e 63 65 20  ys works, since 
c8f0: 69 74 20 69 73 20 6f 6e 6c 79 20 69 6e 20 61 0a  it is only in a.
c900: 2a 2a 20 76 65 72 79 20 73 69 63 6b 20 61 70 70  ** very sick app
c910: 6c 69 63 61 74 69 6f 6e 20 6f 72 20 6f 6e 20 61  lication or on a
c920: 20 76 65 72 79 20 73 69 63 6b 20 70 6c 61 74 66   very sick platf
c930: 6f 72 6d 20 74 68 61 74 20 69 74 20 6d 69 67 68  orm that it migh
c940: 74 20 66 61 69 6c 2e 0a 2a 2a 20 49 66 20 69 74  t fail..** If it
c950: 20 64 6f 65 73 20 66 61 69 6c 2c 20 73 69 6d 70   does fail, simp
c960: 6c 79 20 6c 65 61 6b 20 74 68 65 20 66 69 6c 65  ly leak the file
c970: 20 64 65 73 63 72 69 70 74 6f 72 2c 20 62 75 74   descriptor, but
c980: 20 64 6f 20 6c 6f 67 20 74 68 65 0a 2a 2a 20 65   do log the.** e
c990: 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  rror..**.** Note
c9a0: 20 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20   that it is not 
c9b0: 73 61 66 65 20 74 6f 20 72 65 74 72 79 20 63 6c  safe to retry cl
c9c0: 6f 73 65 28 29 20 61 66 74 65 72 20 45 49 4e 54  ose() after EINT
c9d0: 52 20 73 69 6e 63 65 20 74 68 65 0a 2a 2a 20 66  R since the.** f
c9e0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 6d  ile descriptor m
c9f0: 69 67 68 74 20 68 61 76 65 20 61 6c 72 65 61 64  ight have alread
ca00: 79 20 62 65 65 6e 20 72 65 75 73 65 64 20 62 79  y been reused by
ca10: 20 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64 2e   another thread.
ca20: 0a 2a 2a 20 53 6f 20 77 65 20 64 6f 6e 27 74 20  .** So we don't 
ca30: 65 76 65 6e 20 74 72 79 20 74 6f 20 72 65 63 6f  even try to reco
ca40: 76 65 72 20 66 72 6f 6d 20 61 6e 20 45 49 4e 54  ver from an EINT
ca50: 52 2e 20 20 4a 75 73 74 20 6c 6f 67 20 74 68 65  R.  Just log the
ca60: 20 65 72 72 6f 72 0a 2a 2a 20 61 6e 64 20 6d 6f   error.** and mo
ca70: 76 65 20 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ve on..*/.static
ca80: 20 76 6f 69 64 20 72 6f 62 75 73 74 5f 63 6c 6f   void robust_clo
ca90: 73 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  se(unixFile *pFi
caa0: 6c 65 2c 20 69 6e 74 20 68 2c 20 69 6e 74 20 6c  le, int h, int l
cab0: 69 6e 65 6e 6f 29 7b 0a 20 20 69 66 28 20 6f 73  ineno){.  if( os
cac0: 43 6c 6f 73 65 28 68 29 20 29 7b 0a 20 20 20 20  Close(h) ){.    
cad0: 75 6e 69 78 4c 6f 67 45 72 72 6f 72 41 74 4c 69  unixLogErrorAtLi
cae0: 6e 65 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  ne(SQLITE_IOERR_
caf0: 43 4c 4f 53 45 2c 20 22 63 6c 6f 73 65 22 2c 0a  CLOSE, "close",.
cb00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cb10: 20 20 20 20 20 20 20 70 46 69 6c 65 20 3f 20 70         pFile ? p
cb20: 46 69 6c 65 2d 3e 7a 50 61 74 68 20 3a 20 30 2c  File->zPath : 0,
cb30: 20 6c 69 6e 65 6e 6f 29 3b 0a 20 20 7d 0a 7d 0a   lineno);.  }.}.
cb40: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 70  ./*.** Set the p
cb50: 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 2e  File->lastErrno.
cb60: 20 20 44 6f 20 74 68 69 73 20 69 6e 20 61 20 73    Do this in a s
cb70: 75 62 72 6f 75 74 69 6e 65 20 61 73 20 74 68 61  ubroutine as tha
cb80: 74 20 70 72 6f 76 69 64 65 73 0a 2a 2a 20 61 20  t provides.** a 
cb90: 63 6f 6e 76 65 6e 69 65 6e 74 20 70 6c 61 63 65  convenient place
cba0: 20 74 6f 20 73 65 74 20 61 20 62 72 65 61 6b 70   to set a breakp
cbb0: 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  oint..*/.static 
cbc0: 76 6f 69 64 20 73 74 6f 72 65 4c 61 73 74 45 72  void storeLastEr
cbd0: 72 6e 6f 28 75 6e 69 78 46 69 6c 65 20 2a 70 46  rno(unixFile *pF
cbe0: 69 6c 65 2c 20 69 6e 74 20 65 72 72 6f 72 29 7b  ile, int error){
cbf0: 0a 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72  .  pFile->lastEr
cc00: 72 6e 6f 20 3d 20 65 72 72 6f 72 3b 0a 7d 0a 0a  rno = error;.}..
cc10: 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20  /*.** Close all 
cc20: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73  file descriptors
cc30: 20 61 63 63 75 6d 75 61 74 65 64 20 69 6e 20 74   accumuated in t
cc40: 68 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  he unixInodeInfo
cc50: 2d 3e 70 55 6e 75 73 65 64 20 6c 69 73 74 2e 0a  ->pUnused list..
cc60: 2a 2f 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20  */ .static void 
cc70: 63 6c 6f 73 65 50 65 6e 64 69 6e 67 46 64 73 28  closePendingFds(
cc80: 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 29  unixFile *pFile)
cc90: 7b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  {.  unixInodeInf
cca0: 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c  o *pInode = pFil
ccb0: 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 55 6e 69  e->pInode;.  Uni
ccc0: 78 55 6e 75 73 65 64 46 64 20 2a 70 3b 0a 20 20  xUnusedFd *p;.  
ccd0: 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70 4e  UnixUnusedFd *pN
cce0: 65 78 74 3b 0a 20 20 66 6f 72 28 70 3d 70 49 6e  ext;.  for(p=pIn
ccf0: 6f 64 65 2d 3e 70 55 6e 75 73 65 64 3b 20 70 3b  ode->pUnused; p;
cd00: 20 70 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70   p=pNext){.    p
cd10: 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b  Next = p->pNext;
cd20: 0a 23 69 66 20 4f 53 43 4c 4f 53 45 5f 43 48 45  .#if OSCLOSE_CHE
cd30: 43 4b 5f 43 4c 4f 53 45 5f 49 4f 45 52 52 0a 20  CK_CLOSE_IOERR. 
cd40: 20 20 20 69 66 28 20 63 6c 6f 73 65 28 70 2d 3e     if( close(p->
cd50: 66 64 29 20 29 7b 0a 20 20 20 20 20 20 73 74 6f  fd) ){.      sto
cd60: 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c  reLastErrno(pFil
cd70: 65 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 20  e, errno);.     
cd80: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
cd90: 52 52 5f 43 4c 4f 53 45 3b 0a 20 20 20 20 20 20  RR_CLOSE;.      
cda0: 70 2d 3e 70 4e 65 78 74 20 3d 20 70 45 72 72 6f  p->pNext = pErro
cdb0: 72 3b 0a 20 20 20 20 20 20 70 45 72 72 6f 72 20  r;.      pError 
cdc0: 3d 20 70 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = p;.    }else{.
cdd0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
cde0: 65 65 28 70 29 3b 0a 20 20 20 20 7d 0a 23 65 6c  ee(p);.    }.#el
cdf0: 73 65 0a 20 20 20 20 72 6f 62 75 73 74 5f 63 6c  se.    robust_cl
ce00: 6f 73 65 28 70 46 69 6c 65 2c 20 70 2d 3e 66 64  ose(pFile, p->fd
ce10: 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20  , __LINE__);.   
ce20: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
ce30: 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 70  ;.#endif.  }.  p
ce40: 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 20 3d  Inode->pUnused =
ce50: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c   0;.}../*.** Rel
ce60: 65 61 73 65 20 61 20 75 6e 69 78 49 6e 6f 64 65  ease a unixInode
ce70: 49 6e 66 6f 20 73 74 72 75 63 74 75 72 65 20 70  Info structure p
ce80: 72 65 76 69 6f 75 73 6c 79 20 61 6c 6c 6f 63 61  reviously alloca
ce90: 74 65 64 20 62 79 20 66 69 6e 64 49 6e 6f 64 65  ted by findInode
cea0: 49 6e 66 6f 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68  Info()..**.** Th
ceb0: 65 20 6d 75 74 65 78 20 65 6e 74 65 72 65 64 20  e mutex entered 
cec0: 75 73 69 6e 67 20 74 68 65 20 75 6e 69 78 45 6e  using the unixEn
ced0: 74 65 72 4d 75 74 65 78 28 29 20 66 75 6e 63 74  terMutex() funct
cee0: 69 6f 6e 20 6d 75 73 74 20 62 65 20 68 65 6c 64  ion must be held
cef0: 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73 20 66 75  .** when this fu
cf00: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
cf10: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
cf20: 20 72 65 6c 65 61 73 65 49 6e 6f 64 65 49 6e 66   releaseInodeInf
cf30: 6f 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c  o(unixFile *pFil
cf40: 65 29 7b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49  e){.  unixInodeI
cf50: 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46  nfo *pInode = pF
cf60: 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61  ile->pInode;.  a
cf70: 73 73 65 72 74 28 20 75 6e 69 78 4d 75 74 65 78  ssert( unixMutex
cf80: 48 65 6c 64 28 29 20 29 3b 0a 20 20 69 66 28 20  Held() );.  if( 
cf90: 41 4c 57 41 59 53 28 70 49 6e 6f 64 65 29 20 29  ALWAYS(pInode) )
cfa0: 7b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 52  {.    pInode->nR
cfb0: 65 66 2d 2d 3b 0a 20 20 20 20 69 66 28 20 70 49  ef--;.    if( pI
cfc0: 6e 6f 64 65 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b  node->nRef==0 ){
cfd0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
cfe0: 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 3d  Inode->pShmNode=
cff0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 63 6c 6f 73  =0 );.      clos
d000: 65 50 65 6e 64 69 6e 67 46 64 73 28 70 46 69 6c  ePendingFds(pFil
d010: 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49  e);.      if( pI
d020: 6e 6f 64 65 2d 3e 70 50 72 65 76 20 29 7b 0a 20  node->pPrev ){. 
d030: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
d040: 49 6e 6f 64 65 2d 3e 70 50 72 65 76 2d 3e 70 4e  Inode->pPrev->pN
d050: 65 78 74 3d 3d 70 49 6e 6f 64 65 20 29 3b 0a 20  ext==pInode );. 
d060: 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 70         pInode->p
d070: 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 49  Prev->pNext = pI
d080: 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  node->pNext;.   
d090: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
d0a0: 20 20 61 73 73 65 72 74 28 20 69 6e 6f 64 65 4c    assert( inodeL
d0b0: 69 73 74 3d 3d 70 49 6e 6f 64 65 20 29 3b 0a 20  ist==pInode );. 
d0c0: 20 20 20 20 20 20 20 69 6e 6f 64 65 4c 69 73 74         inodeList
d0d0: 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74   = pInode->pNext
d0e0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
d0f0: 69 66 28 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78  if( pInode->pNex
d100: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  t ){.        ass
d110: 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 70 4e 65  ert( pInode->pNe
d120: 78 74 2d 3e 70 50 72 65 76 3d 3d 70 49 6e 6f 64  xt->pPrev==pInod
d130: 65 20 29 3b 0a 20 20 20 20 20 20 20 20 70 49 6e  e );.        pIn
d140: 6f 64 65 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65  ode->pNext->pPre
d150: 76 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65  v = pInode->pPre
d160: 76 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  v;.      }.     
d170: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 49   sqlite3_free(pI
d180: 6e 6f 64 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  node);.    }.  }
d190: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  .}../*.** Given 
d1a0: 61 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  a file descripto
d1b0: 72 2c 20 6c 6f 63 61 74 65 20 74 68 65 20 75 6e  r, locate the un
d1c0: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65  ixInodeInfo obje
d1d0: 63 74 20 74 68 61 74 0a 2a 2a 20 64 65 73 63 72  ct that.** descr
d1e0: 69 62 65 73 20 74 68 61 74 20 66 69 6c 65 20 64  ibes that file d
d1f0: 65 73 63 72 69 70 74 6f 72 2e 20 20 43 72 65 61  escriptor.  Crea
d200: 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 69 66 20  te a new one if 
d210: 6e 65 63 65 73 73 61 72 79 2e 20 20 54 68 65 0a  necessary.  The.
d220: 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  ** return value 
d230: 6d 69 67 68 74 20 62 65 20 75 6e 69 6e 69 74 69  might be uniniti
d240: 61 6c 69 7a 65 64 20 69 66 20 61 6e 20 65 72 72  alized if an err
d250: 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a  or occurs..**.**
d260: 20 54 68 65 20 6d 75 74 65 78 20 65 6e 74 65 72   The mutex enter
d270: 65 64 20 75 73 69 6e 67 20 74 68 65 20 75 6e 69  ed using the uni
d280: 78 45 6e 74 65 72 4d 75 74 65 78 28 29 20 66 75  xEnterMutex() fu
d290: 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 68  nction must be h
d2a0: 65 6c 64 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73  eld.** when this
d2b0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
d2c0: 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  led..**.** Retur
d2d0: 6e 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65  n an appropriate
d2e0: 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a   error code..*/.
d2f0: 73 74 61 74 69 63 20 69 6e 74 20 66 69 6e 64 49  static int findI
d300: 6e 6f 64 65 49 6e 66 6f 28 0a 20 20 75 6e 69 78  nodeInfo(.  unix
d310: 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 20 20  File *pFile,    
d320: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 6e             /* Un
d330: 69 78 20 66 69 6c 65 20 77 69 74 68 20 66 69 6c  ix file with fil
d340: 65 20 64 65 73 63 20 75 73 65 64 20 69 6e 20 74  e desc used in t
d350: 68 65 20 6b 65 79 20 2a 2f 0a 20 20 75 6e 69 78  he key */.  unix
d360: 49 6e 6f 64 65 49 6e 66 6f 20 2a 2a 70 70 49 6e  InodeInfo **ppIn
d370: 6f 64 65 20 20 20 20 20 20 20 20 2f 2a 20 52 65  ode        /* Re
d380: 74 75 72 6e 20 74 68 65 20 75 6e 69 78 49 6e 6f  turn the unixIno
d390: 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 20 68 65  deInfo object he
d3a0: 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  re */.){.  int r
d3b0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
d3c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 79 73            /* Sys
d3d0: 74 65 6d 20 63 61 6c 6c 20 72 65 74 75 72 6e 20  tem call return 
d3e0: 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 66 64  code */.  int fd
d3f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
d400: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
d410: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
d420: 66 6f 72 20 70 46 69 6c 65 20 2a 2f 0a 20 20 73  for pFile */.  s
d430: 74 72 75 63 74 20 75 6e 69 78 46 69 6c 65 49 64  truct unixFileId
d440: 20 66 69 6c 65 49 64 3b 20 20 20 20 20 20 2f 2a   fileId;      /*
d450: 20 4c 6f 6f 6b 75 70 20 6b 65 79 20 66 6f 72 20   Lookup key for 
d460: 74 68 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  the unixInodeInf
d470: 6f 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 73 74  o */.  struct st
d480: 61 74 20 73 74 61 74 62 75 66 3b 20 20 20 20 20  at statbuf;     
d490: 20 20 20 20 20 20 2f 2a 20 4c 6f 77 2d 6c 65 76        /* Low-lev
d4a0: 65 6c 20 66 69 6c 65 20 69 6e 66 6f 72 6d 61 74  el file informat
d4b0: 69 6f 6e 20 2a 2f 0a 20 20 75 6e 69 78 49 6e 6f  ion */.  unixIno
d4c0: 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d  deInfo *pInode =
d4d0: 20 30 3b 20 20 20 20 20 2f 2a 20 43 61 6e 64 69   0;     /* Candi
d4e0: 64 61 74 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e  date unixInodeIn
d4f0: 66 6f 20 6f 62 6a 65 63 74 20 2a 2f 0a 0a 20 20  fo object */..  
d500: 61 73 73 65 72 74 28 20 75 6e 69 78 4d 75 74 65  assert( unixMute
d510: 78 48 65 6c 64 28 29 20 29 3b 0a 0a 20 20 2f 2a  xHeld() );..  /*
d520: 20 47 65 74 20 6c 6f 77 2d 6c 65 76 65 6c 20 69   Get low-level i
d530: 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
d540: 20 74 68 65 20 66 69 6c 65 20 74 68 61 74 20 77   the file that w
d550: 65 20 63 61 6e 20 75 73 65 64 20 74 6f 0a 20 20  e can used to.  
d560: 2a 2a 20 63 72 65 61 74 65 20 61 20 75 6e 69 71  ** create a uniq
d570: 75 65 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20  ue name for the 
d580: 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 66 64 20  file..  */.  fd 
d590: 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 20 20 72 63  = pFile->h;.  rc
d5a0: 20 3d 20 6f 73 46 73 74 61 74 28 66 64 2c 20 26   = osFstat(fd, &
d5b0: 73 74 61 74 62 75 66 29 3b 0a 20 20 69 66 28 20  statbuf);.  if( 
d5c0: 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 73 74 6f  rc!=0 ){.    sto
d5d0: 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c  reLastErrno(pFil
d5e0: 65 2c 20 65 72 72 6e 6f 29 3b 0a 23 69 66 64 65  e, errno);.#ifde
d5f0: 66 20 45 4f 56 45 52 46 4c 4f 57 0a 20 20 20 20  f EOVERFLOW.    
d600: 69 66 28 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45  if( pFile->lastE
d610: 72 72 6e 6f 3d 3d 45 4f 56 45 52 46 4c 4f 57 20  rrno==EOVERFLOW 
d620: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
d630: 4e 4f 4c 46 53 3b 0a 23 65 6e 64 69 66 0a 20 20  NOLFS;.#endif.  
d640: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
d650: 49 4f 45 52 52 3b 0a 20 20 7d 0a 0a 23 69 66 64  IOERR;.  }..#ifd
d660: 65 66 20 5f 5f 41 50 50 4c 45 5f 5f 0a 20 20 2f  ef __APPLE__.  /
d670: 2a 20 4f 6e 20 4f 53 20 58 20 6f 6e 20 61 6e 20  * On OS X on an 
d680: 6d 73 64 6f 73 20 66 69 6c 65 73 79 73 74 65 6d  msdos filesystem
d690: 2c 20 74 68 65 20 69 6e 6f 64 65 20 6e 75 6d 62  , the inode numb
d6a0: 65 72 20 69 73 20 72 65 70 6f 72 74 65 64 0a 20  er is reported. 
d6b0: 20 2a 2a 20 69 6e 63 6f 72 72 65 63 74 6c 79 20   ** incorrectly 
d6c0: 66 6f 72 20 7a 65 72 6f 2d 73 69 7a 65 20 66 69  for zero-size fi
d6d0: 6c 65 73 2e 20 20 53 65 65 20 74 69 63 6b 65 74  les.  See ticket
d6e0: 20 23 33 32 36 30 2e 20 20 54 6f 20 77 6f 72 6b   #3260.  To work
d6f0: 0a 20 20 2a 2a 20 61 72 6f 75 6e 64 20 74 68 69  .  ** around thi
d700: 73 20 70 72 6f 62 6c 65 6d 20 28 77 65 20 63 6f  s problem (we co
d710: 6e 73 69 64 65 72 20 69 74 20 61 20 62 75 67 20  nsider it a bug 
d720: 69 6e 20 4f 53 20 58 2c 20 6e 6f 74 20 53 51 4c  in OS X, not SQL
d730: 69 74 65 29 0a 20 20 2a 2a 20 77 65 20 61 6c 77  ite).  ** we alw
d740: 61 79 73 20 69 6e 63 72 65 61 73 65 20 74 68 65  ays increase the
d750: 20 66 69 6c 65 20 73 69 7a 65 20 74 6f 20 31 20   file size to 1 
d760: 62 79 20 77 72 69 74 69 6e 67 20 61 20 73 69 6e  by writing a sin
d770: 67 6c 65 20 62 79 74 65 0a 20 20 2a 2a 20 70 72  gle byte.  ** pr
d780: 69 6f 72 20 74 6f 20 61 63 63 65 73 73 69 6e 67  ior to accessing
d790: 20 74 68 65 20 69 6e 6f 64 65 20 6e 75 6d 62 65   the inode numbe
d7a0: 72 2e 20 20 54 68 65 20 6f 6e 65 20 62 79 74 65  r.  The one byte
d7b0: 20 77 72 69 74 74 65 6e 20 69 73 0a 20 20 2a 2a   written is.  **
d7c0: 20 61 6e 20 41 53 43 49 49 20 27 53 27 20 63 68   an ASCII 'S' ch
d7d0: 61 72 61 63 74 65 72 20 77 68 69 63 68 20 61 6c  aracter which al
d7e0: 73 6f 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65  so happens to be
d7f0: 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65 0a   the first byte.
d800: 20 20 2a 2a 20 69 6e 20 74 68 65 20 68 65 61 64    ** in the head
d810: 65 72 20 6f 66 20 65 76 65 72 79 20 53 51 4c 69  er of every SQLi
d820: 74 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 6e  te database.  In
d830: 20 74 68 69 73 20 77 61 79 2c 20 69 66 20 74 68   this way, if th
d840: 65 72 65 0a 20 20 2a 2a 20 69 73 20 61 20 72 61  ere.  ** is a ra
d850: 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 73 75 63  ce condition suc
d860: 68 20 74 68 61 74 20 61 6e 6f 74 68 65 72 20 74  h that another t
d870: 68 72 65 61 64 20 68 61 73 20 61 6c 72 65 61 64  hread has alread
d880: 79 20 70 6f 70 75 6c 61 74 65 64 0a 20 20 2a 2a  y populated.  **
d890: 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20   the first page 
d8a0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  of the database,
d8b0: 20 6e 6f 20 64 61 6d 61 67 65 20 69 73 20 64 6f   no damage is do
d8c0: 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73  ne..  */.  if( s
d8d0: 74 61 74 62 75 66 2e 73 74 5f 73 69 7a 65 3d 3d  tatbuf.st_size==
d8e0: 30 20 26 26 20 28 70 46 69 6c 65 2d 3e 66 73 46  0 && (pFile->fsF
d8f0: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 53  lags & SQLITE_FS
d900: 46 4c 41 47 53 5f 49 53 5f 4d 53 44 4f 53 29 21  FLAGS_IS_MSDOS)!
d910: 3d 30 20 29 7b 0a 20 20 20 20 64 6f 7b 20 72 63  =0 ){.    do{ rc
d920: 20 3d 20 6f 73 57 72 69 74 65 28 66 64 2c 20 22   = osWrite(fd, "
d930: 53 22 2c 20 31 29 3b 20 7d 77 68 69 6c 65 28 20  S", 1); }while( 
d940: 72 63 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45  rc<0 && errno==E
d950: 49 4e 54 52 20 29 3b 0a 20 20 20 20 69 66 28 20  INTR );.    if( 
d960: 72 63 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 73  rc!=1 ){.      s
d970: 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46  toreLastErrno(pF
d980: 69 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20  ile, errno);.   
d990: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
d9a0: 5f 49 4f 45 52 52 3b 0a 20 20 20 20 7d 0a 20 20  _IOERR;.    }.  
d9b0: 20 20 72 63 20 3d 20 6f 73 46 73 74 61 74 28 66    rc = osFstat(f
d9c0: 64 2c 20 26 73 74 61 74 62 75 66 29 3b 0a 20 20  d, &statbuf);.  
d9d0: 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20    if( rc!=0 ){. 
d9e0: 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72       storeLastEr
d9f0: 72 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f  rno(pFile, errno
da00: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
da10: 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20  SQLITE_IOERR;.  
da20: 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
da30: 20 20 6d 65 6d 73 65 74 28 26 66 69 6c 65 49 64    memset(&fileId
da40: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 66 69 6c 65  , 0, sizeof(file
da50: 49 64 29 29 3b 0a 20 20 66 69 6c 65 49 64 2e 64  Id));.  fileId.d
da60: 65 76 20 3d 20 73 74 61 74 62 75 66 2e 73 74 5f  ev = statbuf.st_
da70: 64 65 76 3b 0a 23 69 66 20 4f 53 5f 56 58 57 4f  dev;.#if OS_VXWO
da80: 52 4b 53 0a 20 20 66 69 6c 65 49 64 2e 70 49 64  RKS.  fileId.pId
da90: 20 3d 20 70 46 69 6c 65 2d 3e 70 49 64 3b 0a 23   = pFile->pId;.#
daa0: 65 6c 73 65 0a 20 20 66 69 6c 65 49 64 2e 69 6e  else.  fileId.in
dab0: 6f 20 3d 20 73 74 61 74 62 75 66 2e 73 74 5f 69  o = statbuf.st_i
dac0: 6e 6f 3b 0a 23 65 6e 64 69 66 0a 20 20 70 49 6e  no;.#endif.  pIn
dad0: 6f 64 65 20 3d 20 69 6e 6f 64 65 4c 69 73 74 3b  ode = inodeList;
dae0: 0a 20 20 77 68 69 6c 65 28 20 70 49 6e 6f 64 65  .  while( pInode
daf0: 20 26 26 20 6d 65 6d 63 6d 70 28 26 66 69 6c 65   && memcmp(&file
db00: 49 64 2c 20 26 70 49 6e 6f 64 65 2d 3e 66 69 6c  Id, &pInode->fil
db10: 65 49 64 2c 20 73 69 7a 65 6f 66 28 66 69 6c 65  eId, sizeof(file
db20: 49 64 29 29 20 29 7b 0a 20 20 20 20 70 49 6e 6f  Id)) ){.    pIno
db30: 64 65 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 4e 65  de = pInode->pNe
db40: 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 49  xt;.  }.  if( pI
db50: 6e 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 70  node==0 ){.    p
db60: 49 6e 6f 64 65 20 3d 20 73 71 6c 69 74 65 33 5f  Inode = sqlite3_
db70: 6d 61 6c 6c 6f 63 36 34 28 20 73 69 7a 65 6f 66  malloc64( sizeof
db80: 28 2a 70 49 6e 6f 64 65 29 20 29 3b 0a 20 20 20  (*pInode) );.   
db90: 20 69 66 28 20 70 49 6e 6f 64 65 3d 3d 30 20 29   if( pInode==0 )
dba0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
dbb0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
dbc0: 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 49   }.    memset(pI
dbd0: 6e 6f 64 65 2c 20 30 2c 20 73 69 7a 65 6f 66 28  node, 0, sizeof(
dbe0: 2a 70 49 6e 6f 64 65 29 29 3b 0a 20 20 20 20 6d  *pInode));.    m
dbf0: 65 6d 63 70 79 28 26 70 49 6e 6f 64 65 2d 3e 66  emcpy(&pInode->f
dc00: 69 6c 65 49 64 2c 20 26 66 69 6c 65 49 64 2c 20  ileId, &fileId, 
dc10: 73 69 7a 65 6f 66 28 66 69 6c 65 49 64 29 29 3b  sizeof(fileId));
dc20: 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 52 65  .    pInode->nRe
dc30: 66 20 3d 20 31 3b 0a 20 20 20 20 70 49 6e 6f 64  f = 1;.    pInod
dc40: 65 2d 3e 70 4e 65 78 74 20 3d 20 69 6e 6f 64 65  e->pNext = inode
dc50: 4c 69 73 74 3b 0a 20 20 20 20 70 49 6e 6f 64 65  List;.    pInode
dc60: 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 20  ->pPrev = 0;.   
dc70: 20 69 66 28 20 69 6e 6f 64 65 4c 69 73 74 20 29   if( inodeList )
dc80: 20 69 6e 6f 64 65 4c 69 73 74 2d 3e 70 50 72 65   inodeList->pPre
dc90: 76 20 3d 20 70 49 6e 6f 64 65 3b 0a 20 20 20 20  v = pInode;.    
dca0: 69 6e 6f 64 65 4c 69 73 74 20 3d 20 70 49 6e 6f  inodeList = pIno
dcb0: 64 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  de;.  }else{.   
dcc0: 20 70 49 6e 6f 64 65 2d 3e 6e 52 65 66 2b 2b 3b   pInode->nRef++;
dcd0: 0a 20 20 7d 0a 20 20 2a 70 70 49 6e 6f 64 65 20  .  }.  *ppInode 
dce0: 3d 20 70 49 6e 6f 64 65 3b 0a 20 20 72 65 74 75  = pInode;.  retu
dcf0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
dd00: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
dd10: 55 45 20 69 66 20 70 46 69 6c 65 20 68 61 73 20  UE if pFile has 
dd20: 62 65 65 6e 20 72 65 6e 61 6d 65 64 20 6f 72 20  been renamed or 
dd30: 75 6e 6c 69 6e 6b 65 64 20 73 69 6e 63 65 20 69  unlinked since i
dd40: 74 20 77 61 73 20 66 69 72 73 74 20 6f 70 65 6e  t was first open
dd50: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
dd60: 74 20 66 69 6c 65 48 61 73 4d 6f 76 65 64 28 75  t fileHasMoved(u
dd70: 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b  nixFile *pFile){
dd80: 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
dd90: 20 20 72 65 74 75 72 6e 20 70 46 69 6c 65 2d 3e    return pFile->
dda0: 70 49 6e 6f 64 65 21 3d 30 20 26 26 20 70 46 69  pInode!=0 && pFi
ddb0: 6c 65 2d 3e 70 49 64 21 3d 70 46 69 6c 65 2d 3e  le->pId!=pFile->
ddc0: 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2e 70  pInode->fileId.p
ddd0: 49 64 3b 0a 23 65 6c 73 65 0a 20 20 73 74 72 75  Id;.#else.  stru
dde0: 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20 72  ct stat buf;.  r
ddf0: 65 74 75 72 6e 20 70 46 69 6c 65 2d 3e 70 49 6e  eturn pFile->pIn
de00: 6f 64 65 21 3d 30 20 26 26 0a 20 20 20 20 20 20  ode!=0 &&.      
de10: 28 6f 73 53 74 61 74 28 70 46 69 6c 65 2d 3e 7a  (osStat(pFile->z
de20: 50 61 74 68 2c 20 26 62 75 66 29 21 3d 30 20 7c  Path, &buf)!=0 |
de30: 7c 20 62 75 66 2e 73 74 5f 69 6e 6f 21 3d 70 46  | buf.st_ino!=pF
de40: 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 66 69 6c  ile->pInode->fil
de50: 65 49 64 2e 69 6e 6f 29 3b 0a 23 65 6e 64 69 66  eId.ino);.#endif
de60: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  .}.../*.** Check
de70: 20 61 20 75 6e 69 78 46 69 6c 65 20 74 68 61 74   a unixFile that
de80: 20 69 73 20 61 20 64 61 74 61 62 61 73 65 2e 20   is a database. 
de90: 20 56 65 72 69 66 79 20 74 68 65 20 66 6f 6c 6c   Verify the foll
dea0: 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 28 31 29  owing:.**.** (1)
deb0: 20 54 68 65 72 65 20 69 73 20 65 78 61 63 74 6c   There is exactl
dec0: 79 20 6f 6e 65 20 68 61 72 64 20 6c 69 6e 6b 20  y one hard link 
ded0: 6f 6e 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 28  on the file.** (
dee0: 32 29 20 54 68 65 20 66 69 6c 65 20 69 73 20 6e  2) The file is n
def0: 6f 74 20 61 20 73 79 6d 62 6f 6c 69 63 20 6c 69  ot a symbolic li
df00: 6e 6b 0a 2a 2a 20 28 33 29 20 54 68 65 20 66 69  nk.** (3) The fi
df10: 6c 65 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20  le has not been 
df20: 72 65 6e 61 6d 65 64 20 6f 72 20 75 6e 6c 69 6e  renamed or unlin
df30: 6b 65 64 0a 2a 2a 0a 2a 2a 20 49 73 73 75 65 20  ked.**.** Issue 
df40: 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49  sqlite3_log(SQLI
df50: 54 45 5f 57 41 52 4e 49 4e 47 2c 2e 2e 2e 29 20  TE_WARNING,...) 
df60: 6d 65 73 73 61 67 65 73 20 69 66 20 61 6e 79 74  messages if anyt
df70: 68 69 6e 67 20 69 73 20 6e 6f 74 20 72 69 67 68  hing is not righ
df80: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
df90: 64 20 76 65 72 69 66 79 44 62 46 69 6c 65 28 75  d verifyDbFile(u
dfa0: 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b  nixFile *pFile){
dfb0: 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 20 62  .  struct stat b
dfc0: 75 66 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  uf;.  int rc;.  
dfd0: 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 7a  assert( pFile->z
dfe0: 50 61 74 68 21 3d 30 20 7c 7c 20 70 46 69 6c 65  Path!=0 || pFile
dff0: 2d 3e 70 49 6e 6f 64 65 3d 3d 30 20 29 3b 0a 20  ->pInode==0 );. 
e000: 20 69 66 28 20 70 46 69 6c 65 2d 3e 63 74 72 6c   if( pFile->ctrl
e010: 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45  Flags & UNIXFILE
e020: 5f 57 41 52 4e 45 44 20 29 7b 0a 20 20 20 20 2f  _WARNED ){.    /
e030: 2a 20 4f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66  * One or more of
e040: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 77   the following w
e050: 61 72 6e 69 6e 67 73 20 68 61 76 65 20 61 6c 72  arnings have alr
e060: 65 61 64 79 20 62 65 65 6e 20 69 73 73 75 65 64  eady been issued
e070: 2e 20 20 44 6f 20 6e 6f 74 0a 20 20 20 20 2a 2a  .  Do not.    **
e080: 20 72 65 70 65 61 74 20 74 68 65 6d 20 73 6f 20   repeat them so 
e090: 61 73 20 6e 6f 74 20 74 6f 20 63 6c 75 74 74 65  as not to clutte
e0a0: 72 20 74 68 65 20 65 72 72 6f 72 20 6c 6f 67 20  r the error log 
e0b0: 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  */.    return;. 
e0c0: 20 7d 0a 20 20 72 63 20 3d 20 6f 73 46 73 74 61   }.  rc = osFsta
e0d0: 74 28 70 46 69 6c 65 2d 3e 68 2c 20 26 62 75 66  t(pFile->h, &buf
e0e0: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 30 20 29  );.  if( rc!=0 )
e0f0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f  {.    sqlite3_lo
e100: 67 28 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47  g(SQLITE_WARNING
e110: 2c 20 22 63 61 6e 6e 6f 74 20 66 73 74 61 74 20  , "cannot fstat 
e120: 64 62 20 66 69 6c 65 20 25 73 22 2c 20 70 46 69  db file %s", pFi
e130: 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20  le->zPath);.    
e140: 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73  pFile->ctrlFlags
e150: 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 57 41 52   |= UNIXFILE_WAR
e160: 4e 45 44 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  NED;.    return;
e170: 0a 20 20 7d 0a 20 20 69 66 28 20 62 75 66 2e 73  .  }.  if( buf.s
e180: 74 5f 6e 6c 69 6e 6b 3d 3d 30 20 26 26 20 28 70  t_nlink==0 && (p
e190: 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20  File->ctrlFlags 
e1a0: 26 20 55 4e 49 58 46 49 4c 45 5f 44 45 4c 45 54  & UNIXFILE_DELET
e1b0: 45 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  E)==0 ){.    sql
e1c0: 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
e1d0: 57 41 52 4e 49 4e 47 2c 20 22 66 69 6c 65 20 75  WARNING, "file u
e1e0: 6e 6c 69 6e 6b 65 64 20 77 68 69 6c 65 20 6f 70  nlinked while op
e1f0: 65 6e 3a 20 25 73 22 2c 20 70 46 69 6c 65 2d 3e  en: %s", pFile->
e200: 7a 50 61 74 68 29 3b 0a 20 20 20 20 70 46 69 6c  zPath);.    pFil
e210: 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20  e->ctrlFlags |= 
e220: 55 4e 49 58 46 49 4c 45 5f 57 41 52 4e 45 44 3b  UNIXFILE_WARNED;
e230: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
e240: 0a 20 20 69 66 28 20 62 75 66 2e 73 74 5f 6e 6c  .  if( buf.st_nl
e250: 69 6e 6b 3e 31 20 29 7b 0a 20 20 20 20 73 71 6c  ink>1 ){.    sql
e260: 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
e270: 57 41 52 4e 49 4e 47 2c 20 22 6d 75 6c 74 69 70  WARNING, "multip
e280: 6c 65 20 6c 69 6e 6b 73 20 74 6f 20 66 69 6c 65  le links to file
e290: 3a 20 25 73 22 2c 20 70 46 69 6c 65 2d 3e 7a 50  : %s", pFile->zP
e2a0: 61 74 68 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d  ath);.    pFile-
e2b0: 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e  >ctrlFlags |= UN
e2c0: 49 58 46 49 4c 45 5f 57 41 52 4e 45 44 3b 0a 20  IXFILE_WARNED;. 
e2d0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
e2e0: 20 69 66 28 20 66 69 6c 65 48 61 73 4d 6f 76 65   if( fileHasMove
e2f0: 64 28 70 46 69 6c 65 29 20 29 7b 0a 20 20 20 20  d(pFile) ){.    
e300: 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49  sqlite3_log(SQLI
e310: 54 45 5f 57 41 52 4e 49 4e 47 2c 20 22 66 69 6c  TE_WARNING, "fil
e320: 65 20 72 65 6e 61 6d 65 64 20 77 68 69 6c 65 20  e renamed while 
e330: 6f 70 65 6e 3a 20 25 73 22 2c 20 70 46 69 6c 65  open: %s", pFile
e340: 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 70 46  ->zPath);.    pF
e350: 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c  ile->ctrlFlags |
e360: 3d 20 55 4e 49 58 46 49 4c 45 5f 57 41 52 4e 45  = UNIXFILE_WARNE
e370: 44 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  D;.    return;. 
e380: 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69   }.}.../*.** Thi
e390: 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73  s routine checks
e3a0: 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 52   if there is a R
e3b0: 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c  ESERVED lock hel
e3c0: 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69  d on the specifi
e3d0: 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68  ed.** file by th
e3e0: 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20  is or any other 
e3f0: 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68  process. If such
e400: 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c   a lock is held,
e410: 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a   set *pResOut.**
e420: 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76   to a non-zero v
e430: 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a  alue otherwise *
e440: 70 52 65 73 4f 75 74 20 69 73 20 73 65 74 20 74  pResOut is set t
e450: 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74  o zero.  The ret
e460: 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20  urn value.** is 
e470: 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b  set to SQLITE_OK
e480: 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65   unless an I/O e
e490: 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69  rror occurs duri
e4a0: 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67  ng lock checking
e4b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
e4c0: 75 6e 69 78 43 68 65 63 6b 52 65 73 65 72 76 65  unixCheckReserve
e4d0: 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  dLock(sqlite3_fi
e4e0: 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65  le *id, int *pRe
e4f0: 73 4f 75 74 29 7b 0a 20 20 69 6e 74 20 72 63 20  sOut){.  int rc 
e500: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
e510: 6e 74 20 72 65 73 65 72 76 65 64 20 3d 20 30 3b  nt reserved = 0;
e520: 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  .  unixFile *pFi
e530: 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29  le = (unixFile*)
e540: 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65 49  id;..  SimulateI
e550: 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53  OError( return S
e560: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43  QLITE_IOERR_CHEC
e570: 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29  KRESERVEDLOCK; )
e580: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  ;..  assert( pFi
e590: 6c 65 20 29 3b 0a 20 20 75 6e 69 78 45 6e 74 65  le );.  unixEnte
e5a0: 72 4d 75 74 65 78 28 29 3b 20 2f 2a 20 42 65 63  rMutex(); /* Bec
e5b0: 61 75 73 65 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  ause pFile->pIno
e5c0: 64 65 20 69 73 20 73 68 61 72 65 64 20 61 63 72  de is shared acr
e5d0: 6f 73 73 20 74 68 72 65 61 64 73 20 2a 2f 0a 0a  oss threads */..
e5e0: 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 20    /* Check if a 
e5f0: 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 20 70  thread in this p
e600: 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75 63  rocess holds suc
e610: 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66  h a lock */.  if
e620: 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d  ( pFile->pInode-
e630: 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45  >eFileLock>SHARE
e640: 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65  D_LOCK ){.    re
e650: 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a  served = 1;.  }.
e660: 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 20  .  /* Otherwise 
e670: 73 65 65 20 69 66 20 73 6f 6d 65 20 6f 74 68 65  see if some othe
e680: 72 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20  r process holds 
e690: 69 74 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66  it..  */.#ifndef
e6a0: 20 5f 5f 44 4a 47 50 50 5f 5f 0a 20 20 69 66 28   __DJGPP__.  if(
e6b0: 20 21 72 65 73 65 72 76 65 64 20 26 26 20 21 70   !reserved && !p
e6c0: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50  File->pInode->bP
e6d0: 72 6f 63 65 73 73 4c 6f 63 6b 20 29 7b 0a 20 20  rocessLock ){.  
e6e0: 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c    struct flock l
e6f0: 6f 63 6b 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f  ock;.    lock.l_
e700: 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45  whence = SEEK_SE
e710: 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74  T;.    lock.l_st
e720: 61 72 74 20 3d 20 52 45 53 45 52 56 45 44 5f 42  art = RESERVED_B
e730: 59 54 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f  YTE;.    lock.l_
e740: 6c 65 6e 20 3d 20 31 3b 0a 20 20 20 20 6c 6f 63  len = 1;.    loc
e750: 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57 52 4c  k.l_type = F_WRL
e760: 43 4b 3b 0a 20 20 20 20 69 66 28 20 6f 73 46 63  CK;.    if( osFc
e770: 6e 74 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f  ntl(pFile->h, F_
e780: 47 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 20 29 7b  GETLK, &lock) ){
e790: 0a 23 69 66 20 4f 53 4c 4f 43 4b 49 4e 47 5f 43  .#if OSLOCKING_C
e7a0: 48 45 43 4b 5f 42 55 53 59 5f 49 4f 45 52 52 0a  HECK_BUSY_IOERR.
e7b0: 20 20 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f        int tErrno
e7c0: 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
e7d0: 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72  rc = sqliteError
e7e0: 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74  FromPosixError(t
e7f0: 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f  Errno, SQLITE_IO
e800: 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45  ERR_CHECKRESERVE
e810: 44 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 73 74  DLOCK);.      st
e820: 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69  oreLastErrno(pFi
e830: 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 23 65 6c  le, tErrno);.#el
e840: 73 65 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  se.      rc = SQ
e850: 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b  LITE_IOERR_CHECK
e860: 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 0a 20 20  RESERVEDLOCK;.  
e870: 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72      storeLastErr
e880: 6e 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29  no(pFile, errno)
e890: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 20 65  ;.#endif.    } e
e8a0: 6c 73 65 20 69 66 28 20 6c 6f 63 6b 2e 6c 5f 74  lse if( lock.l_t
e8b0: 79 70 65 21 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a  ype!=F_UNLCK ){.
e8c0: 20 20 20 20 20 20 72 65 73 65 72 76 65 64 20 3d        reserved =
e8d0: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65   1;.    }.  }.#e
e8e0: 6e 64 69 66 0a 20 20 0a 20 20 75 6e 69 78 4c 65  ndif.  .  unixLe
e8f0: 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53  aveMutex();.  OS
e900: 54 52 41 43 45 28 28 22 54 45 53 54 20 57 52 2d  TRACE(("TEST WR-
e910: 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 20 28 75  LOCK %d %d %d (u
e920: 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  nix)\n", pFile->
e930: 68 2c 20 72 63 2c 20 72 65 73 65 72 76 65 64 29  h, rc, reserved)
e940: 29 3b 0a 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d  );..  *pResOut =
e950: 20 72 65 73 65 72 76 65 64 3b 0a 20 20 72 65 74   reserved;.  ret
e960: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
e970: 20 41 74 74 65 6d 70 74 20 74 6f 20 73 65 74 20   Attempt to set 
e980: 61 20 73 79 73 74 65 6d 2d 6c 6f 63 6b 20 6f 6e  a system-lock on
e990: 20 74 68 65 20 66 69 6c 65 20 70 46 69 6c 65 2e   the file pFile.
e9a0: 20 20 54 68 65 20 6c 6f 63 6b 20 69 73 20 0a 2a    The lock is .*
e9b0: 2a 20 64 65 73 63 72 69 62 65 64 20 62 79 20 70  * described by p
e9c0: 4c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  Lock..**.** If t
e9d0: 68 65 20 70 46 69 6c 65 20 77 61 73 20 6f 70 65  he pFile was ope
e9e0: 6e 65 64 20 72 65 61 64 2f 77 72 69 74 65 20 66  ned read/write f
e9f0: 72 6f 6d 20 75 6e 69 78 2d 65 78 63 6c 2c 20 74  rom unix-excl, t
ea00: 68 65 6e 20 74 68 65 20 6f 6e 6c 79 20 6c 6f 63  hen the only loc
ea10: 6b 0a 2a 2a 20 65 76 65 72 20 6f 62 74 61 69 6e  k.** ever obtain
ea20: 65 64 20 69 73 20 61 6e 20 65 78 63 6c 75 73 69  ed is an exclusi
ea30: 76 65 20 6c 6f 63 6b 2c 20 61 6e 64 20 69 74 20  ve lock, and it 
ea40: 69 73 20 6f 62 74 61 69 6e 65 64 20 65 78 61 63  is obtained exac
ea50: 74 6c 79 20 6f 6e 63 65 0a 2a 2a 20 74 68 65 20  tly once.** the 
ea60: 66 69 72 73 74 20 74 69 6d 65 20 61 6e 79 20 6c  first time any l
ea70: 6f 63 6b 20 69 73 20 61 74 74 65 6d 70 74 65 64  ock is attempted
ea80: 2e 20 20 41 6c 6c 20 73 75 62 73 65 71 75 65 6e  .  All subsequen
ea90: 74 20 73 79 73 74 65 6d 20 6c 6f 63 6b 69 6e 67  t system locking
eaa0: 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 73 20 62  .** operations b
eab0: 65 63 6f 6d 65 20 6e 6f 2d 6f 70 73 2e 20 20 4c  ecome no-ops.  L
eac0: 6f 63 6b 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e  ocking operation
ead0: 73 20 73 74 69 6c 6c 20 68 61 70 70 65 6e 20 69  s still happen i
eae0: 6e 74 65 72 6e 61 6c 6c 79 2c 0a 2a 2a 20 69 6e  nternally,.** in
eaf0: 20 6f 72 64 65 72 20 74 6f 20 63 6f 6f 72 64 69   order to coordi
eb00: 6e 61 74 65 20 61 63 63 65 73 73 20 62 65 74 77  nate access betw
eb10: 65 65 6e 20 73 65 70 61 72 61 74 65 20 64 61 74  een separate dat
eb20: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
eb30: 73 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 69 73  s.** within this
eb40: 20 70 72 6f 63 65 73 73 2c 20 62 75 74 20 61 6c   process, but al
eb50: 6c 20 6f 66 20 74 68 61 74 20 69 73 20 68 61 6e  l of that is han
eb60: 64 6c 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20 61  dled in memory a
eb70: 6e 64 20 74 68 65 0a 2a 2a 20 6f 70 65 72 61 74  nd the.** operat
eb80: 69 6e 67 20 73 79 73 74 65 6d 20 64 6f 65 73 20  ing system does 
eb90: 6e 6f 74 20 70 61 72 74 69 63 69 70 61 74 65 2e  not participate.
eba0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
ebb0: 74 69 6f 6e 20 69 73 20 61 20 70 61 73 73 2d 74  tion is a pass-t
ebc0: 68 72 6f 75 67 68 20 74 6f 20 66 63 6e 74 6c 28  hrough to fcntl(
ebd0: 46 5f 53 45 54 4c 4b 29 20 69 66 20 70 46 69 6c  F_SETLK) if pFil
ebe0: 65 20 69 73 20 75 73 69 6e 67 0a 2a 2a 20 61 6e  e is using.** an
ebf0: 79 20 56 46 53 20 6f 74 68 65 72 20 74 68 61 6e  y VFS other than
ec00: 20 22 75 6e 69 78 2d 65 78 63 6c 22 20 6f 72 20   "unix-excl" or 
ec10: 69 66 20 70 46 69 6c 65 20 69 73 20 6f 70 65 6e  if pFile is open
ec20: 65 64 20 6f 6e 20 22 75 6e 69 78 2d 65 78 63 6c  ed on "unix-excl
ec30: 22 0a 2a 2a 20 61 6e 64 20 69 73 20 72 65 61 64  ".** and is read
ec40: 2d 6f 6e 6c 79 2e 0a 2a 2a 0a 2a 2a 20 5a 65 72  -only..**.** Zer
ec50: 6f 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  o is returned if
ec60: 20 74 68 65 20 63 61 6c 6c 20 63 6f 6d 70 6c 65   the call comple
ec70: 74 65 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79  tes successfully
ec80: 2c 20 6f 72 20 2d 31 20 69 66 20 61 20 63 61 6c  , or -1 if a cal
ec90: 6c 0a 2a 2a 20 74 6f 20 66 63 6e 74 6c 28 29 20  l.** to fcntl() 
eca0: 66 61 69 6c 73 2e 20 49 6e 20 74 68 69 73 20 63  fails. In this c
ecb0: 61 73 65 2c 20 65 72 72 6e 6f 20 69 73 20 73 65  ase, errno is se
ecc0: 74 20 61 70 70 72 6f 70 72 69 61 74 65 6c 79 20  t appropriately 
ecd0: 28 62 79 20 66 63 6e 74 6c 28 29 29 2e 0a 2a 2f  (by fcntl())..*/
ece0: 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
ecf0: 46 69 6c 65 4c 6f 63 6b 28 75 6e 69 78 46 69 6c  FileLock(unixFil
ed00: 65 20 2a 70 46 69 6c 65 2c 20 73 74 72 75 63 74  e *pFile, struct
ed10: 20 66 6c 6f 63 6b 20 2a 70 4c 6f 63 6b 2c 20 69   flock *pLock, i
ed20: 6e 74 20 6e 52 65 74 72 79 29 7b 0a 20 20 69 6e  nt nRetry){.  in
ed30: 74 20 72 63 3b 0a 20 20 75 6e 69 78 49 6e 6f 64  t rc;.  unixInod
ed40: 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20  eInfo *pInode = 
ed50: 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20  pFile->pInode;. 
ed60: 20 61 73 73 65 72 74 28 20 75 6e 69 78 4d 75 74   assert( unixMut
ed70: 65 78 48 65 6c 64 28 29 20 29 3b 0a 20 20 61 73  exHeld() );.  as
ed80: 73 65 72 74 28 20 70 49 6e 6f 64 65 21 3d 30 20  sert( pInode!=0 
ed90: 29 3b 0a 20 20 69 66 28 20 28 28 70 46 69 6c 65  );.  if( ((pFile
eda0: 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e  ->ctrlFlags & UN
edb0: 49 58 46 49 4c 45 5f 45 58 43 4c 29 21 3d 30 20  IXFILE_EXCL)!=0 
edc0: 7c 7c 20 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63  || pInode->bProc
edd0: 65 73 73 4c 6f 63 6b 29 0a 20 20 20 26 26 20 28  essLock).   && (
ede0: 28 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67  (pFile->ctrlFlag
edf0: 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 52 44 4f  s & UNIXFILE_RDO
ee00: 4e 4c 59 29 3d 3d 30 29 0a 20 20 29 7b 0a 20 20  NLY)==0).  ){.  
ee10: 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 62 50    if( pInode->bP
ee20: 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 7b  rocessLock==0 ){
ee30: 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 66 6c  .      struct fl
ee40: 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 20 20 20 20  ock lock;.      
ee50: 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e  assert( pInode->
ee60: 6e 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20  nLock==0 );.    
ee70: 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20    lock.l_whence 
ee80: 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20  = SEEK_SET;.    
ee90: 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
eea0: 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b 0a 20   SHARED_FIRST;. 
eeb0: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20       lock.l_len 
eec0: 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20  = SHARED_SIZE;. 
eed0: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65       lock.l_type
eee0: 20 3d 20 46 5f 57 52 4c 43 4b 3b 0a 20 20 20 20   = F_WRLCK;.    
eef0: 20 20 72 63 20 3d 20 6f 73 46 63 6e 74 6c 28 70    rc = osFcntl(p
ef00: 46 69 6c 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b  File->h, F_SETLK
ef10: 2c 20 26 6c 6f 63 6b 29 3b 0a 20 20 20 20 20 20  , &lock);.      
ef20: 69 66 28 20 72 63 3c 30 20 29 20 72 65 74 75 72  if( rc<0 ) retur
ef30: 6e 20 72 63 3b 0a 20 20 20 20 20 20 70 49 6e 6f  n rc;.      pIno
ef40: 64 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b  de->bProcessLock
ef50: 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 49 6e 6f   = 1;.      pIno
ef60: 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20  de->nLock++;.   
ef70: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
ef80: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 65   = 0;.    }.  }e
ef90: 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 69 20 3d  lse{.    int i =
efa0: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
efb0: 20 20 20 20 20 20 20 20 20 0a 20 20 20 20 66 6f           .    fo
efc0: 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20 72 63 20  r(;;){.      rc 
efd0: 3d 20 6f 73 46 63 6e 74 6c 28 70 46 69 6c 65 2d  = osFcntl(pFile-
efe0: 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 70 4c 6f  >h, F_SETLK, pLo
eff0: 63 6b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ck);.      if( r
f000: 63 20 26 26 20 6e 52 65 74 72 79 2d 2d 20 29 7b  c && nRetry-- ){
f010: 0a 20 20 20 20 20 20 20 20 75 73 6c 65 65 70 28  .        usleep(
f020: 31 30 30 20 2a 20 28 2b 2b 69 29 29 3b 0a 20 20  100 * (++i));.  
f030: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
f040: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
f050: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
f060: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
f070: 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20  * Lock the file 
f080: 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70  with the lock sp
f090: 65 63 69 66 69 65 64 20 62 79 20 70 61 72 61 6d  ecified by param
f0a0: 65 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d  eter eFileLock -
f0b0: 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66   one.** of the f
f0c0: 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20  ollowing:.**.** 
f0d0: 20 20 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c      (1) SHARED_L
f0e0: 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52  OCK.**     (2) R
f0f0: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20  ESERVED_LOCK.** 
f100: 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f      (3) PENDING_
f110: 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20  LOCK.**     (4) 
f120: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a  EXCLUSIVE_LOCK.*
f130: 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77  *.** Sometimes w
f140: 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f  hen requesting o
f150: 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61  ne lock state, a
f160: 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73  dditional lock s
f170: 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73  tates.** are ins
f180: 65 72 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e  erted in between
f190: 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d  .  The locking m
f1a0: 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65  ight fail on one
f1b0: 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a   of the later.**
f1c0: 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61   transitions lea
f1d0: 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74  ving the lock st
f1e0: 61 74 65 20 64 69 66 66 65 72 65 6e 74 20 66 72  ate different fr
f1f0: 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61 72 74  om what it start
f200: 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20  ed but.** still 
f210: 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61  short of its goa
f220: 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  l.  The followin
f230: 67 20 63 68 61 72 74 20 73 68 6f 77 73 20 74 68  g chart shows th
f240: 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61  e allowed.** tra
f250: 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65  nsitions and the
f260: 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d   inserted interm
f270: 65 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a  ediate states:.*
f280: 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44  *.**    UNLOCKED
f290: 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20   -> SHARED.**   
f2a0: 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52   SHARED -> RESER
f2b0: 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44  VED.**    SHARED
f2c0: 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e   -> (PENDING) ->
f2d0: 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20   EXCLUSIVE.**   
f2e0: 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45   RESERVED -> (PE
f2f0: 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53  NDING) -> EXCLUS
f300: 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e  IVE.**    PENDIN
f310: 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  G -> EXCLUSIVE.*
f320: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
f330: 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72  e will only incr
f340: 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73  ease a lock.  Us
f350: 65 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55  e the sqlite3OsU
f360: 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69  nlock().** routi
f370: 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f  ne to lower a lo
f380: 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a  cking level..*/.
f390: 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4c  static int unixL
f3a0: 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
f3b0: 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c   *id, int eFileL
f3c0: 6f 63 6b 29 7b 0a 20 20 2f 2a 20 54 68 65 20 66  ock){.  /* The f
f3d0: 6f 6c 6c 6f 77 69 6e 67 20 64 65 73 63 72 69 62  ollowing describ
f3e0: 65 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74  es the implement
f3f0: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 76 61 72  ation of the var
f400: 69 6f 75 73 20 6c 6f 63 6b 73 20 61 6e 64 0a 20  ious locks and. 
f410: 20 2a 2a 20 6c 6f 63 6b 20 74 72 61 6e 73 69 74   ** lock transit
f420: 69 6f 6e 73 20 69 6e 20 74 65 72 6d 73 20 6f 66  ions in terms of
f430: 20 74 68 65 20 50 4f 53 49 58 20 61 64 76 69 73   the POSIX advis
f440: 6f 72 79 20 73 68 61 72 65 64 20 61 6e 64 20 65  ory shared and e
f450: 78 63 6c 75 73 69 76 65 0a 20 20 2a 2a 20 6c 6f  xclusive.  ** lo
f460: 63 6b 20 70 72 69 6d 69 74 69 76 65 73 20 28 63  ck primitives (c
f470: 61 6c 6c 65 64 20 72 65 61 64 2d 6c 6f 63 6b 73  alled read-locks
f480: 20 61 6e 64 20 77 72 69 74 65 2d 6c 6f 63 6b 73   and write-locks
f490: 20 62 65 6c 6f 77 2c 20 74 6f 20 61 76 6f 69 64   below, to avoid
f4a0: 0a 20 20 2a 2a 20 63 6f 6e 66 75 73 69 6f 6e 20  .  ** confusion 
f4b0: 77 69 74 68 20 53 51 4c 69 74 65 20 6c 6f 63 6b  with SQLite lock
f4c0: 20 6e 61 6d 65 73 29 2e 20 54 68 65 20 61 6c 67   names). The alg
f4d0: 6f 72 69 74 68 6d 73 20 61 72 65 20 63 6f 6d 70  orithms are comp
f4e0: 6c 69 63 61 74 65 64 0a 20 20 2a 2a 20 73 6c 69  licated.  ** sli
f4f0: 67 68 74 6c 79 20 69 6e 20 6f 72 64 65 72 20 74  ghtly in order t
f500: 6f 20 62 65 20 63 6f 6d 70 61 74 69 62 6c 65 20  o be compatible 
f510: 77 69 74 68 20 77 69 6e 64 6f 77 73 20 73 79 73  with windows sys
f520: 74 65 6d 73 20 73 69 6d 75 6c 74 61 6e 65 6f 75  tems simultaneou
f530: 73 6c 79 0a 20 20 2a 2a 20 61 63 63 65 73 73 69  sly.  ** accessi
f540: 6e 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  ng the same data
f550: 62 61 73 65 20 66 69 6c 65 2c 20 69 6e 20 63 61  base file, in ca
f560: 73 65 20 74 68 61 74 20 69 73 20 65 76 65 72 20  se that is ever 
f570: 72 65 71 75 69 72 65 64 2e 0a 20 20 2a 2a 0a 20  required..  **. 
f580: 20 2a 2a 20 53 79 6d 62 6f 6c 73 20 64 65 66 69   ** Symbols defi
f590: 6e 65 64 20 69 6e 20 6f 73 2e 68 20 69 6e 64 65  ned in os.h inde
f5a0: 6e 74 69 66 79 20 74 68 65 20 27 70 65 6e 64 69  ntify the 'pendi
f5b0: 6e 67 20 62 79 74 65 27 20 61 6e 64 20 74 68 65  ng byte' and the
f5c0: 20 27 72 65 73 65 72 76 65 64 0a 20 20 2a 2a 20   'reserved.  ** 
f5d0: 62 79 74 65 27 2c 20 65 61 63 68 20 73 69 6e 67  byte', each sing
f5e0: 6c 65 20 62 79 74 65 73 20 61 74 20 77 65 6c 6c  le bytes at well
f5f0: 20 6b 6e 6f 77 6e 20 6f 66 66 73 65 74 73 2c 20   known offsets, 
f600: 61 6e 64 20 74 68 65 20 27 73 68 61 72 65 64 20  and the 'shared 
f610: 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27  byte.  ** range'
f620: 2c 20 61 20 72 61 6e 67 65 20 6f 66 20 35 31 30  , a range of 510
f630: 20 62 79 74 65 73 20 61 74 20 61 20 77 65 6c 6c   bytes at a well
f640: 20 6b 6e 6f 77 6e 20 6f 66 66 73 65 74 2e 0a 20   known offset.. 
f650: 20 2a 2a 0a 20 20 2a 2a 20 54 6f 20 6f 62 74 61   **.  ** To obta
f660: 69 6e 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b  in a SHARED lock
f670: 2c 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69 73  , a read-lock is
f680: 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65   obtained on the
f690: 20 27 70 65 6e 64 69 6e 67 0a 20 20 2a 2a 20 62   'pending.  ** b
f6a0: 79 74 65 27 2e 20 20 49 66 20 74 68 69 73 20 69  yte'.  If this i
f6b0: 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 61 20  s successful, a 
f6c0: 72 61 6e 64 6f 6d 20 62 79 74 65 20 66 72 6f 6d  random byte from
f6d0: 20 74 68 65 20 27 73 68 61 72 65 64 20 62 79 74   the 'shared byt
f6e0: 65 0a 20 20 2a 2a 20 72 61 6e 67 65 27 20 69 73  e.  ** range' is
f6f0: 20 72 65 61 64 2d 6c 6f 63 6b 65 64 20 61 6e 64   read-locked and
f700: 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65   the lock on the
f710: 20 27 70 65 6e 64 69 6e 67 20 62 79 74 65 27 20   'pending byte' 
f720: 72 65 6c 65 61 73 65 64 2e 0a 20 20 2a 2a 0a 20  released..  **. 
f730: 20 2a 2a 20 41 20 70 72 6f 63 65 73 73 20 6d 61   ** A process ma
f740: 79 20 6f 6e 6c 79 20 6f 62 74 61 69 6e 20 61 20  y only obtain a 
f750: 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 61 66  RESERVED lock af
f760: 74 65 72 20 69 74 20 68 61 73 20 61 20 53 48 41  ter it has a SHA
f770: 52 45 44 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 41  RED lock..  ** A
f780: 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69   RESERVED lock i
f790: 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79  s implemented by
f7a0: 20 67 72 61 62 62 69 6e 67 20 61 20 77 72 69 74   grabbing a writ
f7b0: 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20  e-lock on the.  
f7c0: 2a 2a 20 27 72 65 73 65 72 76 65 64 20 62 79 74  ** 'reserved byt
f7d0: 65 27 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41  e'. .  **.  ** A
f7e0: 20 70 72 6f 63 65 73 73 20 6d 61 79 20 6f 6e 6c   process may onl
f7f0: 79 20 6f 62 74 61 69 6e 20 61 20 50 45 4e 44 49  y obtain a PENDI
f800: 4e 47 20 6c 6f 63 6b 20 61 66 74 65 72 20 69 74  NG lock after it
f810: 20 68 61 73 20 6f 62 74 61 69 6e 65 64 20 61 0a   has obtained a.
f820: 20 20 2a 2a 20 53 48 41 52 45 44 20 6c 6f 63 6b    ** SHARED lock
f830: 2e 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b  . A PENDING lock
f840: 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   is implemented 
f850: 62 79 20 6f 62 74 61 69 6e 69 6e 67 20 61 20 77  by obtaining a w
f860: 72 69 74 65 2d 6c 6f 63 6b 0a 20 20 2a 2a 20 6f  rite-lock.  ** o
f870: 6e 20 74 68 65 20 27 70 65 6e 64 69 6e 67 20 62  n the 'pending b
f880: 79 74 65 27 2e 20 54 68 69 73 20 65 6e 73 75 72  yte'. This ensur
f890: 65 73 20 74 68 61 74 20 6e 6f 20 6e 65 77 20 53  es that no new S
f8a0: 48 41 52 45 44 20 6c 6f 63 6b 73 20 63 61 6e 20  HARED locks can 
f8b0: 62 65 0a 20 20 2a 2a 20 6f 62 74 61 69 6e 65 64  be.  ** obtained
f8c0: 2c 20 62 75 74 20 65 78 69 73 74 69 6e 67 20 53  , but existing S
f8d0: 48 41 52 45 44 20 6c 6f 63 6b 73 20 61 72 65 20  HARED locks are 
f8e0: 61 6c 6c 6f 77 65 64 20 74 6f 20 70 65 72 73 69  allowed to persi
f8f0: 73 74 2e 20 41 20 70 72 6f 63 65 73 73 0a 20 20  st. A process.  
f900: 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65  ** does not have
f910: 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 52 45 53   to obtain a RES
f920: 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68  ERVED lock on th
f930: 65 20 77 61 79 20 74 6f 20 61 20 50 45 4e 44 49  e way to a PENDI
f940: 4e 47 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 54 68  NG lock..  ** Th
f950: 69 73 20 70 72 6f 70 65 72 74 79 20 69 73 20 75  is property is u
f960: 73 65 64 20 62 79 20 74 68 65 20 61 6c 67 6f 72  sed by the algor
f970: 69 74 68 6d 20 66 6f 72 20 72 6f 6c 6c 69 6e 67  ithm for rolling
f980: 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20   back a journal 
f990: 66 69 6c 65 0a 20 20 2a 2a 20 61 66 74 65 72 20  file.  ** after 
f9a0: 61 20 63 72 61 73 68 2e 0a 20 20 2a 2a 0a 20 20  a crash..  **.  
f9b0: 2a 2a 20 41 6e 20 45 58 43 4c 55 53 49 56 45 20  ** An EXCLUSIVE 
f9c0: 6c 6f 63 6b 2c 20 6f 62 74 61 69 6e 65 64 20 61  lock, obtained a
f9d0: 66 74 65 72 20 61 20 50 45 4e 44 49 4e 47 20 6c  fter a PENDING l
f9e0: 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 69 73 0a  ock is held, is.
f9f0: 20 20 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 65 64    ** implemented
fa00: 20 62 79 20 6f 62 74 61 69 6e 69 6e 67 20 61 20   by obtaining a 
fa10: 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68  write-lock on th
fa20: 65 20 65 6e 74 69 72 65 20 27 73 68 61 72 65 64  e entire 'shared
fa30: 20 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e 67 65   byte.  ** range
fa40: 27 2e 20 53 69 6e 63 65 20 61 6c 6c 20 6f 74 68  '. Since all oth
fa50: 65 72 20 6c 6f 63 6b 73 20 72 65 71 75 69 72 65  er locks require
fa60: 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20   a read-lock on 
fa70: 6f 6e 65 20 6f 66 20 74 68 65 20 62 79 74 65 73  one of the bytes
fa80: 0a 20 20 2a 2a 20 77 69 74 68 69 6e 20 74 68 69  .  ** within thi
fa90: 73 20 72 61 6e 67 65 2c 20 74 68 69 73 20 65 6e  s range, this en
faa0: 73 75 72 65 73 20 74 68 61 74 20 6e 6f 20 6f 74  sures that no ot
fab0: 68 65 72 20 6c 6f 63 6b 73 20 61 72 65 20 68 65  her locks are he
fac0: 6c 64 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 64  ld on the.  ** d
fad0: 61 74 61 62 61 73 65 2e 20 0a 20 20 2a 2a 0a 20  atabase. .  **. 
fae0: 20 2a 2a 20 54 68 65 20 72 65 61 73 6f 6e 20 61   ** The reason a
faf0: 20 73 69 6e 67 6c 65 20 62 79 74 65 20 63 61 6e   single byte can
fb00: 6e 6f 74 20 62 65 20 75 73 65 64 20 69 6e 73 74  not be used inst
fb10: 65 61 64 20 6f 66 20 74 68 65 20 27 73 68 61 72  ead of the 'shar
fb20: 65 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e  ed byte.  ** ran
fb30: 67 65 27 20 69 73 20 74 68 61 74 20 73 6f 6d 65  ge' is that some
fb40: 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 77 69 6e   versions of win
fb50: 64 6f 77 73 20 64 6f 20 6e 6f 74 20 73 75 70 70  dows do not supp
fb60: 6f 72 74 20 72 65 61 64 2d 6c 6f 63 6b 73 2e 20  ort read-locks. 
fb70: 42 79 0a 20 20 2a 2a 20 6c 6f 63 6b 69 6e 67 20  By.  ** locking 
fb80: 61 20 72 61 6e 64 6f 6d 20 62 79 74 65 20 66 72  a random byte fr
fb90: 6f 6d 20 61 20 72 61 6e 67 65 2c 20 63 6f 6e 63  om a range, conc
fba0: 75 72 72 65 6e 74 20 53 48 41 52 45 44 20 6c 6f  urrent SHARED lo
fbb0: 63 6b 73 20 6d 61 79 20 65 78 69 73 74 0a 20 20  cks may exist.  
fbc0: 2a 2a 20 65 76 65 6e 20 69 66 20 74 68 65 20 6c  ** even if the l
fbd0: 6f 63 6b 69 6e 67 20 70 72 69 6d 69 74 69 76 65  ocking primitive
fbe0: 20 75 73 65 64 20 69 73 20 61 6c 77 61 79 73 20   used is always 
fbf0: 61 20 77 72 69 74 65 2d 6c 6f 63 6b 2e 0a 20 20  a write-lock..  
fc00: 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
fc10: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46  LITE_OK;.  unixF
fc20: 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
fc30: 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 75 6e  ixFile*)id;.  un
fc40: 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e  ixInodeInfo *pIn
fc50: 6f 64 65 3b 0a 20 20 73 74 72 75 63 74 20 66 6c  ode;.  struct fl
fc60: 6f 63 6b 20 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20  ock lock;.  int 
fc70: 74 45 72 72 6e 6f 20 3d 20 30 3b 0a 0a 20 20 61  tErrno = 0;..  a
fc80: 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
fc90: 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b    OSTRACE(("LOCK
fca0: 20 20 20 20 25 64 20 25 73 20 77 61 73 20 25 73      %d %s was %s
fcb0: 28 25 73 2c 25 64 29 20 70 69 64 3d 25 64 20 28  (%s,%d) pid=%d (
fcc0: 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  unix)\n", pFile-
fcd0: 3e 68 2c 0a 20 20 20 20 20 20 61 7a 46 69 6c 65  >h,.      azFile
fce0: 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c  Lock(eFileLock),
fcf0: 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c   azFileLock(pFil
fd00: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c 0a 20  e->eFileLock),. 
fd10: 20 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28       azFileLock(
fd20: 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65  pFile->pInode->e
fd30: 46 69 6c 65 4c 6f 63 6b 29 2c 20 70 46 69 6c 65  FileLock), pFile
fd40: 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  ->pInode->nShare
fd50: 64 2c 0a 20 20 20 20 20 20 6f 73 47 65 74 70 69  d,.      osGetpi
fd60: 64 28 30 29 29 29 3b 0a 0a 20 20 2f 2a 20 49 66  d(0)));..  /* If
fd70: 20 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64   there is alread
fd80: 79 20 61 20 6c 6f 63 6b 20 6f 66 20 74 68 69 73  y a lock of this
fd90: 20 74 79 70 65 20 6f 72 20 6d 6f 72 65 20 72 65   type or more re
fda0: 73 74 72 69 63 74 69 76 65 20 6f 6e 20 74 68 65  strictive on the
fdb0: 0a 20 20 2a 2a 20 75 6e 69 78 46 69 6c 65 2c 20  .  ** unixFile, 
fdc0: 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e 27  do nothing. Don'
fdd0: 74 20 75 73 65 20 74 68 65 20 65 6e 64 5f 6c 6f  t use the end_lo
fde0: 63 6b 3a 20 65 78 69 74 20 70 61 74 68 2c 20 61  ck: exit path, a
fdf0: 73 0a 20 20 2a 2a 20 75 6e 69 78 45 6e 74 65 72  s.  ** unixEnter
fe00: 4d 75 74 65 78 28 29 20 68 61 73 6e 27 74 20 62  Mutex() hasn't b
fe10: 65 65 6e 20 63 61 6c 6c 65 64 20 79 65 74 2e 0a  een called yet..
fe20: 20 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65    */.  if( pFile
fe30: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 65 46 69  ->eFileLock>=eFi
fe40: 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 4f 53  leLock ){.    OS
fe50: 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20  TRACE(("LOCK    
fe60: 25 64 20 25 73 20 6f 6b 20 28 61 6c 72 65 61 64  %d %s ok (alread
fe70: 79 20 68 65 6c 64 29 20 28 75 6e 69 78 29 5c 6e  y held) (unix)\n
fe80: 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20 20  ", pFile->h,.   
fe90: 20 20 20 20 20 20 20 20 20 61 7a 46 69 6c 65 4c           azFileL
fea0: 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 29 29  ock(eFileLock)))
feb0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
fec0: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f  ITE_OK;.  }..  /
fed0: 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
fee0: 6c 6f 63 6b 69 6e 67 20 73 65 71 75 65 6e 63 65  locking sequence
fef0: 20 69 73 20 63 6f 72 72 65 63 74 2e 0a 20 20 2a   is correct..  *
ff00: 2a 20 20 28 31 29 20 57 65 20 6e 65 76 65 72 20  *  (1) We never 
ff10: 6d 6f 76 65 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b  move from unlock
ff20: 65 64 20 74 6f 20 61 6e 79 74 68 69 6e 67 20 68  ed to anything h
ff30: 69 67 68 65 72 20 74 68 61 6e 20 73 68 61 72 65  igher than share
ff40: 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28 32  d lock..  **  (2
ff50: 29 20 53 51 4c 69 74 65 20 6e 65 76 65 72 20 65  ) SQLite never e
ff60: 78 70 6c 69 63 69 74 6c 79 20 72 65 71 75 65 73  xplicitly reques
ff70: 74 73 20 61 20 70 65 6e 64 69 67 20 6c 6f 63 6b  ts a pendig lock
ff80: 2e 0a 20 20 2a 2a 20 20 28 33 29 20 41 20 73 68  ..  **  (3) A sh
ff90: 61 72 65 64 20 6c 6f 63 6b 20 69 73 20 61 6c 77  ared lock is alw
ffa0: 61 79 73 20 68 65 6c 64 20 77 68 65 6e 20 61 20  ays held when a 
ffb0: 72 65 73 65 72 76 65 20 6c 6f 63 6b 20 69 73 20  reserve lock is 
ffc0: 72 65 71 75 65 73 74 65 64 2e 0a 20 20 2a 2f 0a  requested..  */.
ffd0: 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d    assert( pFile-
ffe0: 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 4e 4f 5f 4c  >eFileLock!=NO_L
fff0: 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b  OCK || eFileLock
10000 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  ==SHARED_LOCK );
10010 0a 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65  .  assert( eFile
10020 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e 47 5f 4c 4f  Lock!=PENDING_LO
10030 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
10040 65 46 69 6c 65 4c 6f 63 6b 21 3d 52 45 53 45 52  eFileLock!=RESER
10050 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46 69 6c  VED_LOCK || pFil
10060 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48  e->eFileLock==SH
10070 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20  ARED_LOCK );..  
10080 2f 2a 20 54 68 69 73 20 6d 75 74 65 78 20 69 73  /* This mutex is
10090 20 6e 65 65 64 65 64 20 62 65 63 61 75 73 65 20   needed because 
100a0 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 69 73  pFile->pInode is
100b0 20 73 68 61 72 65 64 20 61 63 72 6f 73 73 20 74   shared across t
100c0 68 72 65 61 64 73 0a 20 20 2a 2f 0a 20 20 75 6e  hreads.  */.  un
100d0 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
100e0 20 20 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65    pInode = pFile
100f0 2d 3e 70 49 6e 6f 64 65 3b 0a 0a 20 20 2f 2a 20  ->pInode;..  /* 
10100 49 66 20 73 6f 6d 65 20 74 68 72 65 61 64 20 75  If some thread u
10110 73 69 6e 67 20 74 68 69 73 20 50 49 44 20 68 61  sing this PID ha
10120 73 20 61 20 6c 6f 63 6b 20 76 69 61 20 61 20 64  s a lock via a d
10130 69 66 66 65 72 65 6e 74 20 75 6e 69 78 46 69 6c  ifferent unixFil
10140 65 2a 0a 20 20 2a 2a 20 68 61 6e 64 6c 65 20 74  e*.  ** handle t
10150 68 61 74 20 70 72 65 63 6c 75 64 65 73 20 74 68  hat precludes th
10160 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
10170 2c 20 72 65 74 75 72 6e 20 42 55 53 59 2e 0a 20  , return BUSY.. 
10180 20 2a 2f 0a 20 20 69 66 28 20 28 70 46 69 6c 65   */.  if( (pFile
10190 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 70 49 6e  ->eFileLock!=pIn
101a0 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 26  ode->eFileLock &
101b0 26 20 0a 20 20 20 20 20 20 20 20 20 20 28 70 49  & .          (pI
101c0 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e  node->eFileLock>
101d0 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 7c 7c  =PENDING_LOCK ||
101e0 20 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45   eFileLock>SHARE
101f0 44 5f 4c 4f 43 4b 29 29 0a 20 20 29 7b 0a 20 20  D_LOCK)).  ){.  
10200 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
10210 53 59 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64  SY;.    goto end
10220 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  _lock;.  }..  /*
10230 20 49 66 20 61 20 53 48 41 52 45 44 20 6c 6f 63   If a SHARED loc
10240 6b 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20  k is requested, 
10250 61 6e 64 20 73 6f 6d 65 20 74 68 72 65 61 64 20  and some thread 
10260 75 73 69 6e 67 20 74 68 69 73 20 50 49 44 20 61  using this PID a
10270 6c 72 65 61 64 79 0a 20 20 2a 2a 20 68 61 73 20  lready.  ** has 
10280 61 20 53 48 41 52 45 44 20 6f 72 20 52 45 53 45  a SHARED or RESE
10290 52 56 45 44 20 6c 6f 63 6b 2c 20 74 68 65 6e 20  RVED lock, then 
102a0 69 6e 63 72 65 6d 65 6e 74 20 72 65 66 65 72 65  increment refere
102b0 6e 63 65 20 63 6f 75 6e 74 73 20 61 6e 64 0a 20  nce counts and. 
102c0 20 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54   ** return SQLIT
102d0 45 5f 4f 4b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  E_OK..  */.  if(
102e0 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52   eFileLock==SHAR
102f0 45 44 5f 4c 4f 43 4b 20 26 26 20 0a 20 20 20 20  ED_LOCK && .    
10300 20 20 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65    (pInode->eFile
10310 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
10320 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 65 46 69  K || pInode->eFi
10330 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44  leLock==RESERVED
10340 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20 61 73  _LOCK) ){.    as
10350 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3d  sert( eFileLock=
10360 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
10370 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c      assert( pFil
10380 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20  e->eFileLock==0 
10390 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
103a0 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 30  Inode->nShared>0
103b0 20 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65   );.    pFile->e
103c0 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45  FileLock = SHARE
103d0 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 49 6e 6f  D_LOCK;.    pIno
103e0 64 65 2d 3e 6e 53 68 61 72 65 64 2b 2b 3b 0a 20  de->nShared++;. 
103f0 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b     pInode->nLock
10400 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64  ++;.    goto end
10410 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a 0a 20 20 2f  _lock;.  }...  /
10420 2a 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b  * A PENDING lock
10430 20 69 73 20 6e 65 65 64 65 64 20 62 65 66 6f 72   is needed befor
10440 65 20 61 63 71 75 69 72 69 6e 67 20 61 20 53 48  e acquiring a SH
10450 41 52 45 44 20 6c 6f 63 6b 20 61 6e 64 20 62 65  ARED lock and be
10460 66 6f 72 65 0a 20 20 2a 2a 20 61 63 71 75 69 72  fore.  ** acquir
10470 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45  ing an EXCLUSIVE
10480 20 6c 6f 63 6b 2e 20 20 46 6f 72 20 74 68 65 20   lock.  For the 
10490 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65  SHARED lock, the
104a0 20 50 45 4e 44 49 4e 47 20 77 69 6c 6c 0a 20 20   PENDING will.  
104b0 2a 2a 20 62 65 20 72 65 6c 65 61 73 65 64 2e 0a  ** be released..
104c0 20 20 2a 2f 0a 20 20 6c 6f 63 6b 2e 6c 5f 6c 65    */.  lock.l_le
104d0 6e 20 3d 20 31 4c 3b 0a 20 20 6c 6f 63 6b 2e 6c  n = 1L;.  lock.l
104e0 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53  _whence = SEEK_S
104f0 45 54 3b 0a 20 20 69 66 28 20 65 46 69 6c 65 4c  ET;.  if( eFileL
10500 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
10510 20 0a 20 20 20 20 20 20 7c 7c 20 28 65 46 69 6c   .      || (eFil
10520 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
10530 5f 4c 4f 43 4b 20 26 26 20 70 46 69 6c 65 2d 3e  _LOCK && pFile->
10540 65 46 69 6c 65 4c 6f 63 6b 3c 50 45 4e 44 49 4e  eFileLock<PENDIN
10550 47 5f 4c 4f 43 4b 29 0a 20 20 29 7b 0a 20 20 20  G_LOCK).  ){.   
10560 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 28   lock.l_type = (
10570 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
10580 44 5f 4c 4f 43 4b 3f 46 5f 52 44 4c 43 4b 3a 46  D_LOCK?F_RDLCK:F
10590 5f 57 52 4c 43 4b 29 3b 0a 20 20 20 20 6c 6f 63  _WRLCK);.    loc
105a0 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50 45 4e 44  k.l_start = PEND
105b0 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20 20 69 66  ING_BYTE;.    if
105c0 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70  ( unixFileLock(p
105d0 46 69 6c 65 2c 20 26 6c 6f 63 6b 2c 20 30 29 20  File, &lock, 0) 
105e0 29 7b 0a 20 20 20 20 20 20 74 45 72 72 6e 6f 20  ){.      tErrno 
105f0 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72  = errno;.      r
10600 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46  c = sqliteErrorF
10610 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45  romPosixError(tE
10620 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45  rrno, SQLITE_IOE
10630 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  RR_LOCK);.      
10640 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f  if( IS_LOCK_ERRO
10650 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20  R(rc) ){.       
10660 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28   storeLastErrno(
10670 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a  pFile, tErrno);.
10680 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f        }.      go
10690 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20  to end_lock;.   
106a0 20 7d 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 49 66   }.  }...  /* If
106b0 20 63 6f 6e 74 72 6f 6c 20 67 65 74 73 20 74 6f   control gets to
106c0 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65   this point, the
106d0 6e 20 61 63 74 75 61 6c 6c 79 20 67 6f 20 61 68  n actually go ah
106e0 65 61 64 20 61 6e 64 20 6d 61 6b 65 0a 20 20 2a  ead and make.  *
106f0 2a 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  * operating syst
10700 65 6d 20 63 61 6c 6c 73 20 66 6f 72 20 74 68 65  em calls for the
10710 20 73 70 65 63 69 66 69 65 64 20 6c 6f 63 6b 2e   specified lock.
10720 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c  .  */.  if( eFil
10730 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
10740 43 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  CK ){.    assert
10750 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  ( pInode->nShare
10760 64 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  d==0 );.    asse
10770 72 74 28 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c  rt( pInode->eFil
10780 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20  eLock==0 );.    
10790 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
107a0 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20 20 20 2f 2a  TE_OK );..    /*
107b0 20 4e 6f 77 20 67 65 74 20 74 68 65 20 72 65 61   Now get the rea
107c0 64 2d 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c 6f  d-lock */.    lo
107d0 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41  ck.l_start = SHA
107e0 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 6c  RED_FIRST;.    l
107f0 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52  ock.l_len = SHAR
10800 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20 69 66 28  ED_SIZE;.    if(
10810 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28 70 46   unixFileLock(pF
10820 69 6c 65 2c 20 26 6c 6f 63 6b 2c 20 30 29 20 29  ile, &lock, 0) )
10830 7b 0a 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d  {.      tErrno =
10840 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63   errno;.      rc
10850 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72   = sqliteErrorFr
10860 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72  omPosixError(tEr
10870 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52  rno, SQLITE_IOER
10880 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 7d 0a 0a  R_LOCK);.    }..
10890 20 20 20 20 2f 2a 20 44 72 6f 70 20 74 68 65 20      /* Drop the 
108a0 74 65 6d 70 6f 72 61 72 79 20 50 45 4e 44 49 4e  temporary PENDIN
108b0 47 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c 6f  G lock */.    lo
108c0 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50 45 4e  ck.l_start = PEN
108d0 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20 20 6c  DING_BYTE;.    l
108e0 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 4c 3b 0a  ock.l_len = 1L;.
108f0 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20      lock.l_type 
10900 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 69  = F_UNLCK;.    i
10910 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b 28  f( unixFileLock(
10920 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 2c 20 31 30  pFile, &lock, 10
10930 29 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ) && rc==SQLITE_
10940 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  OK ){.      /* T
10950 68 69 73 20 63 6f 75 6c 64 20 68 61 70 70 65 6e  his could happen
10960 20 77 69 74 68 20 61 20 6e 65 74 77 6f 72 6b 20   with a network 
10970 6d 6f 75 6e 74 20 2a 2f 0a 20 20 20 20 20 20 74  mount */.      t
10980 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 23  Errno = errno;.#
10990 69 66 20 4f 53 4c 4f 43 4b 49 4e 47 5f 43 48 45  if OSLOCKING_CHE
109a0 43 4b 5f 42 55 53 59 5f 49 4f 45 52 52 0a 20 20  CK_BUSY_IOERR.  
109b0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45      rc = sqliteE
109c0 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
109d0 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54  or(tErrno, SQLIT
109e0 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b  E_IOERR_UNLOCK);
109f0 20 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 72 63   .#else.      rc
10a00 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
10a10 55 4e 4c 4f 43 4b 3b 20 0a 23 65 6e 64 69 66 0a  UNLOCK; .#endif.
10a20 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72      }..    if( r
10a30 63 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 49  c ){.      if( I
10a40 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29  S_LOCK_ERROR(rc)
10a50 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74 6f 72   ){.        stor
10a60 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65  eLastErrno(pFile
10a70 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20  , tErrno);.     
10a80 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e   }.      goto en
10a90 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 65 6c 73  d_lock;.    }els
10aa0 65 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  e{.      pFile->
10ab0 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52  eFileLock = SHAR
10ac0 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 70  ED_LOCK;.      p
10ad0 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a  Inode->nLock++;.
10ae0 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53        pInode->nS
10af0 68 61 72 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d  hared = 1;.    }
10b00 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65 46 69  .  }else if( eFi
10b10 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  leLock==EXCLUSIV
10b20 45 5f 4c 4f 43 4b 20 26 26 20 70 49 6e 6f 64 65  E_LOCK && pInode
10b30 2d 3e 6e 53 68 61 72 65 64 3e 31 20 29 7b 0a 20  ->nShared>1 ){. 
10b40 20 20 20 2f 2a 20 57 65 20 61 72 65 20 74 72 79     /* We are try
10b50 69 6e 67 20 66 6f 72 20 61 6e 20 65 78 63 6c 75  ing for an exclu
10b60 73 69 76 65 20 6c 6f 63 6b 20 62 75 74 20 61 6e  sive lock but an
10b70 6f 74 68 65 72 20 74 68 72 65 61 64 20 69 6e 20  other thread in 
10b80 74 68 69 73 0a 20 20 20 20 2a 2a 20 73 61 6d 65  this.    ** same
10b90 20 70 72 6f 63 65 73 73 20 69 73 20 73 74 69 6c   process is stil
10ba0 6c 20 68 6f 6c 64 69 6e 67 20 61 20 73 68 61 72  l holding a shar
10bb0 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 20 20  ed lock. */.    
10bc0 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
10bd0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
10be0 2a 20 54 68 65 20 72 65 71 75 65 73 74 20 77 61  * The request wa
10bf0 73 20 66 6f 72 20 61 20 52 45 53 45 52 56 45 44  s for a RESERVED
10c00 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   or EXCLUSIVE lo
10c10 63 6b 2e 20 20 49 74 20 69 73 0a 20 20 20 20 2a  ck.  It is.    *
10c20 2a 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74  * assumed that t
10c30 68 65 72 65 20 69 73 20 61 20 53 48 41 52 45 44  here is a SHARED
10c40 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b   or greater lock
10c50 20 6f 6e 20 74 68 65 20 66 69 6c 65 0a 20 20 20   on the file.   
10c60 20 2a 2a 20 61 6c 72 65 61 64 79 2e 0a 20 20 20   ** already..   
10c70 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
10c80 30 21 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  0!=pFile->eFileL
10c90 6f 63 6b 20 29 3b 0a 20 20 20 20 6c 6f 63 6b 2e  ock );.    lock.
10ca0 6c 5f 74 79 70 65 20 3d 20 46 5f 57 52 4c 43 4b  l_type = F_WRLCK
10cb0 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 65  ;..    assert( e
10cc0 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56  FileLock==RESERV
10cd0 45 44 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65  ED_LOCK || eFile
10ce0 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
10cf0 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 69 66 28 20  LOCK );.    if( 
10d00 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52  eFileLock==RESER
10d10 56 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  VED_LOCK ){.    
10d20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
10d30 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 3b 0a   RESERVED_BYTE;.
10d40 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e        lock.l_len
10d50 20 3d 20 31 4c 3b 0a 20 20 20 20 7d 65 6c 73 65   = 1L;.    }else
10d60 7b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73  {.      lock.l_s
10d70 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49  tart = SHARED_FI
10d80 52 53 54 3b 0a 20 20 20 20 20 20 6c 6f 63 6b 2e  RST;.      lock.
10d90 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53  l_len = SHARED_S
10da0 49 5a 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  IZE;.    }..    
10db0 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63 6b  if( unixFileLock
10dc0 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 2c 20 30  (pFile, &lock, 0
10dd0 29 20 29 7b 0a 20 20 20 20 20 20 74 45 72 72 6e  ) ){.      tErrn
10de0 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
10df0 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f   rc = sqliteErro
10e00 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28  rFromPosixError(
10e10 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49  tErrno, SQLITE_I
10e20 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  OERR_LOCK);.    
10e30 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
10e40 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20 20  _BUSY ){.       
10e50 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28   storeLastErrno(
10e60 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a  pFile, tErrno);.
10e70 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
10e80 7d 0a 20 20 0a 0a 23 69 66 64 65 66 20 53 51 4c  }.  ..#ifdef SQL
10e90 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a 20 53  ITE_DEBUG.  /* S
10ea0 65 74 20 75 70 20 74 68 65 20 74 72 61 6e 73 61  et up the transa
10eb0 63 74 69 6f 6e 2d 63 6f 75 6e 74 65 72 20 63 68  ction-counter ch
10ec0 61 6e 67 65 20 63 68 65 63 6b 69 6e 67 20 66 6c  ange checking fl
10ed0 61 67 73 20 77 68 65 6e 0a 20 20 2a 2a 20 74 72  ags when.  ** tr
10ee0 61 6e 73 69 74 69 6f 6e 69 6e 67 20 66 72 6f 6d  ansitioning from
10ef0 20 61 20 53 48 41 52 45 44 20 74 6f 20 61 20 52   a SHARED to a R
10f00 45 53 45 52 56 45 44 20 6c 6f 63 6b 2e 20 20 54  ESERVED lock.  T
10f10 68 65 20 63 68 61 6e 67 65 0a 20 20 2a 2a 20 66  he change.  ** f
10f20 72 6f 6d 20 53 48 41 52 45 44 20 74 6f 20 52 45  rom SHARED to RE
10f30 53 45 52 56 45 44 20 6d 61 72 6b 73 20 74 68 65  SERVED marks the
10f40 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61 20   beginning of a 
10f50 6e 6f 72 6d 61 6c 0a 20 20 2a 2a 20 77 72 69 74  normal.  ** writ
10f60 65 20 6f 70 65 72 61 74 69 6f 6e 20 28 6e 6f 74  e operation (not
10f70 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 72   a hot journal r
10f80 6f 6c 6c 62 61 63 6b 29 2e 0a 20 20 2a 2f 0a 20  ollback)..  */. 
10f90 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
10fa0 4f 4b 0a 20 20 20 26 26 20 70 46 69 6c 65 2d 3e  OK.   && pFile->
10fb0 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45  eFileLock<=SHARE
10fc0 44 5f 4c 4f 43 4b 0a 20 20 20 26 26 20 65 46 69  D_LOCK.   && eFi
10fd0 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56 45 44  leLock==RESERVED
10fe0 5f 4c 4f 43 4b 0a 20 20 29 7b 0a 20 20 20 20 70  _LOCK.  ){.    p
10ff0 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e 74 72 43  File->transCntrC
11000 68 6e 67 20 3d 20 30 3b 0a 20 20 20 20 70 46 69  hng = 0;.    pFi
11010 6c 65 2d 3e 64 62 55 70 64 61 74 65 20 3d 20 30  le->dbUpdate = 0
11020 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 69 6e 4e  ;.    pFile->inN
11030 6f 72 6d 61 6c 57 72 69 74 65 20 3d 20 31 3b 0a  ormalWrite = 1;.
11040 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 0a 20 20 69    }.#endif...  i
11050 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
11060 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65   ){.    pFile->e
11070 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65  FileLock = eFile
11080 4c 6f 63 6b 3b 0a 20 20 20 20 70 49 6e 6f 64 65  Lock;.    pInode
11090 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46  ->eFileLock = eF
110a0 69 6c 65 4c 6f 63 6b 3b 0a 20 20 7d 65 6c 73 65  ileLock;.  }else
110b0 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d   if( eFileLock==
110c0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
110d0 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69  {.    pFile->eFi
110e0 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e 44 49 4e 47  leLock = PENDING
110f0 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 49 6e 6f 64  _LOCK;.    pInod
11100 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 50  e->eFileLock = P
11110 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 7d  ENDING_LOCK;.  }
11120 0a 0a 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 75 6e  ..end_lock:.  un
11130 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
11140 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b    OSTRACE(("LOCK
11150 20 20 20 20 25 64 20 25 73 20 25 73 20 28 75 6e      %d %s %s (un
11160 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  ix)\n", pFile->h
11170 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69  , azFileLock(eFi
11180 6c 65 4c 6f 63 6b 29 2c 20 0a 20 20 20 20 20 20  leLock), .      
11190 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20  rc==SQLITE_OK ? 
111a0 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29  "ok" : "failed")
111b0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
111c0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 74 68 65  }../*.** Add the
111d0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
111e0 20 75 73 65 64 20 62 79 20 66 69 6c 65 20 68 61   used by file ha
111f0 6e 64 6c 65 20 70 46 69 6c 65 20 74 6f 20 74 68  ndle pFile to th
11200 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a  e corresponding.
11210 2a 2a 20 70 55 6e 75 73 65 64 20 6c 69 73 74 2e  ** pUnused list.
11220 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
11230 73 65 74 50 65 6e 64 69 6e 67 46 64 28 75 6e 69  setPendingFd(uni
11240 78 46 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20  xFile *pFile){. 
11250 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
11260 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e  pInode = pFile->
11270 70 49 6e 6f 64 65 3b 0a 20 20 55 6e 69 78 55 6e  pInode;.  UnixUn
11280 75 73 65 64 46 64 20 2a 70 20 3d 20 70 46 69 6c  usedFd *p = pFil
11290 65 2d 3e 70 55 6e 75 73 65 64 3b 0a 20 20 70 2d  e->pUnused;.  p-
112a0 3e 70 4e 65 78 74 20 3d 20 70 49 6e 6f 64 65 2d  >pNext = pInode-
112b0 3e 70 55 6e 75 73 65 64 3b 0a 20 20 70 49 6e 6f  >pUnused;.  pIno
112c0 64 65 2d 3e 70 55 6e 75 73 65 64 20 3d 20 70 3b  de->pUnused = p;
112d0 0a 20 20 70 46 69 6c 65 2d 3e 68 20 3d 20 2d 31  .  pFile->h = -1
112e0 3b 0a 20 20 70 46 69 6c 65 2d 3e 70 55 6e 75 73  ;.  pFile->pUnus
112f0 65 64 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ed = 0;.}../*.**
11300 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69   Lower the locki
11310 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65  ng level on file
11320 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c   descriptor pFil
11330 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20  e to eFileLock. 
11340 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75   eFileLock.** mu
11350 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f  st be either NO_
11360 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c  LOCK or SHARED_L
11370 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  OCK..**.** If th
11380 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
11390 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  of the file desc
113a0 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64  riptor is alread
113b0 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a  y at or below.**
113c0 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
113d0 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68  ocking level, th
113e0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
113f0 6e 6f 2d 6f 70 2e 0a 2a 2a 20 0a 2a 2a 20 49 66  no-op..** .** If
11400 20 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b   handleNFSUnlock
11410 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 6f   is true, then o
11420 6e 20 64 6f 77 6e 67 72 61 64 69 6e 67 20 61 6e  n downgrading an
11430 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20   EXCLUSIVE_LOCK 
11440 74 6f 20 53 48 41 52 45 44 0a 2a 2a 20 74 68 65  to SHARED.** the
11450 20 62 79 74 65 20 72 61 6e 67 65 20 69 73 20 64   byte range is d
11460 69 76 69 64 65 64 20 69 6e 74 6f 20 32 20 70 61  ivided into 2 pa
11470 72 74 73 20 61 6e 64 20 74 68 65 20 66 69 72 73  rts and the firs
11480 74 20 70 61 72 74 20 69 73 20 75 6e 6c 6f 63 6b  t part is unlock
11490 65 64 20 74 68 65 6e 0a 2a 2a 20 73 65 74 20 74  ed then.** set t
114a0 6f 20 61 20 72 65 61 64 20 6c 6f 63 6b 2c 20 74  o a read lock, t
114b0 68 65 6e 20 74 68 65 20 6f 74 68 65 72 20 70 61  hen the other pa
114c0 72 74 20 69 73 20 73 69 6d 70 6c 79 20 75 6e 6c  rt is simply unl
114d0 6f 63 6b 65 64 2e 20 20 54 68 69 73 20 77 6f 72  ocked.  This wor
114e0 6b 73 20 0a 2a 2a 20 61 72 6f 75 6e 64 20 61 20  ks .** around a 
114f0 62 75 67 20 69 6e 20 42 53 44 20 4e 46 53 20 6c  bug in BSD NFS l
11500 6f 63 6b 64 20 28 61 6c 73 6f 20 73 65 65 6e 20  ockd (also seen 
11510 6f 6e 20 4d 61 63 4f 53 58 20 31 30 2e 33 2b 29  on MacOSX 10.3+)
11520 20 74 68 61 74 20 66 61 69 6c 73 20 74 6f 20 0a   that fails to .
11530 2a 2a 20 72 65 6d 6f 76 65 20 74 68 65 20 77 72  ** remove the wr
11540 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 61 20 72 65  ite lock on a re
11550 67 69 6f 6e 20 77 68 65 6e 20 61 20 72 65 61 64  gion when a read
11560 20 6c 6f 63 6b 20 69 73 20 73 65 74 2e 0a 2a 2f   lock is set..*/
11570 0a 73 74 61 74 69 63 20 69 6e 74 20 70 6f 73 69  .static int posi
11580 78 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  xUnlock(sqlite3_
11590 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46  file *id, int eF
115a0 69 6c 65 4c 6f 63 6b 2c 20 69 6e 74 20 68 61 6e  ileLock, int han
115b0 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b 29 7b 0a 20  dleNFSUnlock){. 
115c0 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
115d0 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
115e0 3b 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  ;.  unixInodeInf
115f0 6f 20 2a 70 49 6e 6f 64 65 3b 0a 20 20 73 74 72  o *pInode;.  str
11600 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63 6b 3b 0a  uct flock lock;.
11610 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
11620 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28  E_OK;..  assert(
11630 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52   pFile );.  OSTR
11640 41 43 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64  ACE(("UNLOCK  %d
11650 20 25 64 20 77 61 73 20 25 64 28 25 64 2c 25 64   %d was %d(%d,%d
11660 29 20 70 69 64 3d 25 64 20 28 75 6e 69 78 29 5c  ) pid=%d (unix)\
11670 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46  n", pFile->h, eF
11680 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 70  ileLock,.      p
11690 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c  File->eFileLock,
116a0 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e   pFile->pInode->
116b0 65 46 69 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c 65  eFileLock, pFile
116c0 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  ->pInode->nShare
116d0 64 2c 0a 20 20 20 20 20 20 6f 73 47 65 74 70 69  d,.      osGetpi
116e0 64 28 30 29 29 29 3b 0a 0a 20 20 61 73 73 65 72  d(0)));..  asser
116f0 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48  t( eFileLock<=SH
11700 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69  ARED_LOCK );.  i
11710 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  f( pFile->eFileL
11720 6f 63 6b 3c 3d 65 46 69 6c 65 4c 6f 63 6b 20 29  ock<=eFileLock )
11730 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
11740 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 75 6e  ITE_OK;.  }.  un
11750 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
11760 20 20 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65    pInode = pFile
11770 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 73 73 65  ->pInode;.  asse
11780 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61  rt( pInode->nSha
11790 72 65 64 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  red!=0 );.  if( 
117a0 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
117b0 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a  >SHARED_LOCK ){.
117c0 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e 6f      assert( pIno
117d0 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 70  de->eFileLock==p
117e0 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
117f0 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  );..#ifdef SQLIT
11800 45 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 57  E_DEBUG.    /* W
11810 68 65 6e 20 72 65 64 75 63 69 6e 67 20 61 20 6c  hen reducing a l
11820 6f 63 6b 20 73 75 63 68 20 74 68 61 74 20 6f 74  ock such that ot
11830 68 65 72 20 70 72 6f 63 65 73 73 65 73 20 63 61  her processes ca
11840 6e 20 73 74 61 72 74 0a 20 20 20 20 2a 2a 20 72  n start.    ** r
11850 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61 62  eading the datab
11860 61 73 65 20 66 69 6c 65 20 61 67 61 69 6e 2c 20  ase file again, 
11870 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74  make sure that t
11880 68 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61  he.    ** transa
11890 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 77 61  ction counter wa
118a0 73 20 75 70 64 61 74 65 64 20 69 66 20 61 6e 79  s updated if any
118b0 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 61 74   part of the dat
118c0 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c  abase.    ** fil
118d0 65 20 63 68 61 6e 67 65 64 2e 20 20 49 66 20 74  e changed.  If t
118e0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  he transaction c
118f0 6f 75 6e 74 65 72 20 69 73 20 6e 6f 74 20 75 70  ounter is not up
11900 64 61 74 65 64 2c 0a 20 20 20 20 2a 2a 20 6f 74  dated,.    ** ot
11910 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  her connections 
11920 74 6f 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65  to the same file
11930 20 6d 69 67 68 74 20 6e 6f 74 20 72 65 61 6c 69   might not reali
11940 7a 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 74  ze that.    ** t
11950 68 65 20 66 69 6c 65 20 68 61 73 20 63 68 61 6e  he file has chan
11960 67 65 64 20 61 6e 64 20 68 65 6e 63 65 20 6d 69  ged and hence mi
11970 67 68 74 20 6e 6f 74 20 6b 6e 6f 77 20 74 6f 20  ght not know to 
11980 66 6c 75 73 68 20 74 68 65 69 72 0a 20 20 20 20  flush their.    
11990 2a 2a 20 63 61 63 68 65 2e 20 20 54 68 65 20 75  ** cache.  The u
119a0 73 65 20 6f 66 20 61 20 73 74 61 6c 65 20 63 61  se of a stale ca
119b0 63 68 65 20 63 61 6e 20 6c 65 61 64 20 74 6f 20  che can lead to 
119c0 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  database corrupt
119d0 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ion..    */.    
119e0 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57  pFile->inNormalW
119f0 72 69 74 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66  rite = 0;.#endif
11a00 0a 0a 20 20 20 20 2f 2a 20 64 6f 77 6e 67 72 61  ..    /* downgra
11a10 64 69 6e 67 20 74 6f 20 61 20 73 68 61 72 65 64  ding to a shared
11a20 20 6c 6f 63 6b 20 6f 6e 20 4e 46 53 20 69 6e 76   lock on NFS inv
11a30 6f 6c 76 65 73 20 63 6c 65 61 72 69 6e 67 20 74  olves clearing t
11a40 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 0a 20 20  he write lock.  
11a50 20 20 2a 2a 20 62 65 66 6f 72 65 20 65 73 74 61    ** before esta
11a60 62 6c 69 73 68 69 6e 67 20 74 68 65 20 72 65 61  blishing the rea
11a70 64 6c 6f 63 6b 20 2d 20 74 6f 20 61 76 6f 69 64  dlock - to avoid
11a80 20 61 20 72 61 63 65 20 63 6f 6e 64 69 74 69 6f   a race conditio
11a90 6e 20 77 65 20 64 6f 77 6e 67 72 61 64 65 0a 20  n we downgrade. 
11aa0 20 20 20 2a 2a 20 74 68 65 20 6c 6f 63 6b 20 69     ** the lock i
11ab0 6e 20 32 20 62 6c 6f 63 6b 73 2c 20 73 6f 20 74  n 2 blocks, so t
11ac0 68 61 74 20 70 61 72 74 20 6f 66 20 74 68 65 20  hat part of the 
11ad0 72 61 6e 67 65 20 77 69 6c 6c 20 62 65 20 63 6f  range will be co
11ae0 76 65 72 65 64 20 62 79 20 61 20 0a 20 20 20 20  vered by a .    
11af0 2a 2a 20 77 72 69 74 65 20 6c 6f 63 6b 20 75 6e  ** write lock un
11b00 74 69 6c 20 74 68 65 20 72 65 73 74 20 69 73 20  til the rest is 
11b10 63 6f 76 65 72 65 64 20 62 79 20 61 20 72 65 61  covered by a rea
11b20 64 20 6c 6f 63 6b 3a 0a 20 20 20 20 2a 2a 20 20  d lock:.    **  
11b30 31 3a 20 20 20 5b 57 57 57 57 57 5d 0a 20 20 20  1:   [WWWWW].   
11b40 20 2a 2a 20 20 32 3a 20 20 20 5b 2e 2e 2e 2e 57   **  2:   [....W
11b50 5d 0a 20 20 20 20 2a 2a 20 20 33 3a 20 20 20 5b  ].    **  3:   [
11b60 52 52 52 52 57 5d 0a 20 20 20 20 2a 2a 20 20 34  RRRRW].    **  4
11b70 3a 20 20 20 5b 52 52 52 52 2e 5d 0a 20 20 20 20  :   [RRRR.].    
11b80 2a 2f 0a 20 20 20 20 69 66 28 20 65 46 69 6c 65  */.    if( eFile
11b90 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
11ba0 4b 20 29 7b 0a 23 69 66 20 21 64 65 66 69 6e 65  K ){.#if !define
11bb0 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 7c 7c 20  d(__APPLE__) || 
11bc0 21 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c  !SQLITE_ENABLE_L
11bd0 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20  OCKING_STYLE.   
11be0 20 20 20 28 76 6f 69 64 29 68 61 6e 64 6c 65 4e     (void)handleN
11bf0 46 53 55 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20  FSUnlock;.      
11c00 61 73 73 65 72 74 28 20 68 61 6e 64 6c 65 4e 46  assert( handleNF
11c10 53 55 6e 6c 6f 63 6b 3d 3d 30 20 29 3b 0a 23 65  SUnlock==0 );.#e
11c20 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64  ndif.#if defined
11c30 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53  (__APPLE__) && S
11c40 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
11c50 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20 20  KING_STYLE.     
11c60 20 69 66 28 20 68 61 6e 64 6c 65 4e 46 53 55 6e   if( handleNFSUn
11c70 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20  lock ){.        
11c80 69 6e 74 20 74 45 72 72 6e 6f 3b 20 20 20 20 20  int tErrno;     
11c90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72            /* Err
11ca0 6f 72 20 63 6f 64 65 20 66 72 6f 6d 20 73 79 73  or code from sys
11cb0 74 65 6d 20 63 61 6c 6c 20 65 72 72 6f 72 73 20  tem call errors 
11cc0 2a 2f 0a 20 20 20 20 20 20 20 20 6f 66 66 5f 74  */.        off_t
11cd0 20 64 69 76 53 69 7a 65 20 3d 20 53 48 41 52 45   divSize = SHARE
11ce0 44 5f 53 49 5a 45 20 2d 20 31 3b 0a 20 20 20 20  D_SIZE - 1;.    
11cf0 20 20 20 20 0a 20 20 20 20 20 20 20 20 6c 6f 63      .        loc
11d00 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c  k.l_type = F_UNL
11d10 43 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b  CK;.        lock
11d20 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b  .l_whence = SEEK
11d30 5f 53 45 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f  _SET;.        lo
11d40 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41  ck.l_start = SHA
11d50 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20  RED_FIRST;.     
11d60 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20     lock.l_len = 
11d70 64 69 76 53 69 7a 65 3b 0a 20 20 20 20 20 20 20  divSize;.       
11d80 20 69 66 28 20 75 6e 69 78 46 69 6c 65 4c 6f 63   if( unixFileLoc
11d90 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63 6b 2c 20  k(pFile, &lock, 
11da0 31 30 29 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20  10)==(-1) ){.   
11db0 20 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20         tErrno = 
11dc0 65 72 72 6e 6f 3b 0a 23 69 66 20 4f 53 4c 4f 43  errno;.#if OSLOC
11dd0 4b 49 4e 47 5f 43 48 45 43 4b 5f 42 55 53 59 5f  KING_CHECK_BUSY_
11de0 49 4f 45 52 52 0a 20 20 20 20 20 20 20 20 20 20  IOERR.          
11df0 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72  rc = sqliteError
11e00 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74  FromPosixError(t
11e10 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f  Errno, SQLITE_IO
11e20 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 23 65 6c  ERR_UNLOCK);.#el
11e30 73 65 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  se.          rc 
11e40 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  = SQLITE_IOERR_U
11e50 4e 4c 4f 43 4b 3b 0a 23 65 6e 64 69 66 0a 20 20  NLOCK;.#endif.  
11e60 20 20 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c          if( IS_L
11e70 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b  OCK_ERROR(rc) ){
11e80 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 74 6f  .            sto
11e90 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c  reLastErrno(pFil
11ea0 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20  e, tErrno);.    
11eb0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
11ec0 20 20 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63    goto end_unloc
11ed0 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
11ee0 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65       lock.l_type
11ef0 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 20 20   = F_RDLCK;.    
11f00 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63      lock.l_whenc
11f10 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20  e = SEEK_SET;.  
11f20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61        lock.l_sta
11f30 72 74 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53  rt = SHARED_FIRS
11f40 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e  T;.        lock.
11f50 6c 5f 6c 65 6e 20 3d 20 64 69 76 53 69 7a 65 3b  l_len = divSize;
11f60 0a 20 20 20 20 20 20 20 20 69 66 28 20 75 6e 69  .        if( uni
11f70 78 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c  xFileLock(pFile,
11f80 20 26 6c 6f 63 6b 2c 20 31 30 29 3d 3d 28 2d 31   &lock, 10)==(-1
11f90 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74  ) ){.          t
11fa0 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 23  Errno = errno;.#
11fb0 69 66 20 4f 53 4c 4f 43 4b 49 4e 47 5f 43 48 45  if OSLOCKING_CHE
11fc0 43 4b 5f 42 55 53 59 5f 49 4f 45 52 52 0a 20 20  CK_BUSY_IOERR.  
11fd0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
11fe0 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69  iteErrorFromPosi
11ff0 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53  xError(tErrno, S
12000 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f  QLITE_IOERR_RDLO
12010 43 4b 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20  CK);.#else.     
12020 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
12030 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 23  _IOERR_UNLOCK;.#
12040 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20 20  endif.          
12050 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f  if( IS_LOCK_ERRO
12060 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20  R(rc) ){.       
12070 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72       storeLastEr
12080 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e  rno(pFile, tErrn
12090 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  o);.          }.
120a0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
120b0 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20  nd_unlock;.     
120c0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6c 6f 63     }.        loc
120d0 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c  k.l_type = F_UNL
120e0 43 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b  CK;.        lock
120f0 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b  .l_whence = SEEK
12100 5f 53 45 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f  _SET;.        lo
12110 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41  ck.l_start = SHA
12120 52 45 44 5f 46 49 52 53 54 2b 64 69 76 53 69 7a  RED_FIRST+divSiz
12130 65 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e  e;.        lock.
12140 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45 44 5f 53  l_len = SHARED_S
12150 49 5a 45 2d 64 69 76 53 69 7a 65 3b 0a 20 20 20  IZE-divSize;.   
12160 20 20 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c       if( unixFil
12170 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f  eLock(pFile, &lo
12180 63 6b 2c 20 31 30 29 3d 3d 28 2d 31 29 20 29 7b  ck, 10)==(-1) ){
12190 0a 20 20 20 20 20 20 20 20 20 20 74 45 72 72 6e  .          tErrn
121a0 6f 20 3d 20 65 72 72 6e 6f 3b 0a 23 69 66 20 4f  o = errno;.#if O
121b0 53 4c 4f 43 4b 49 4e 47 5f 43 48 45 43 4b 5f 42  SLOCKING_CHECK_B
121c0 55 53 59 5f 49 4f 45 52 52 0a 20 20 20 20 20 20  USY_IOERR.      
121d0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45      rc = sqliteE
121e0 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
121f0 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54  or(tErrno, SQLIT
12200 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b  E_IOERR_UNLOCK);
12210 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 20 20 20  .#else.         
12220 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
12230 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 23 65 6e 64 69  RR_UNLOCK;.#endi
12240 66 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  f.          if( 
12250 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63  IS_LOCK_ERROR(rc
12260 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
12270 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28   storeLastErrno(
12280 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a  pFile, tErrno);.
12290 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
122a0 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75        goto end_u
122b0 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d  nlock;.        }
122c0 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e  .      }else.#en
122d0 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f  dif /* defined(_
122e0 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c  _APPLE__) && SQL
122f0 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
12300 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 20 20 20 20  NG_STYLE */.    
12310 20 20 7b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b    {.        lock
12320 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c 43  .l_type = F_RDLC
12330 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e  K;.        lock.
12340 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f  l_whence = SEEK_
12350 53 45 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63  SET;.        loc
12360 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52  k.l_start = SHAR
12370 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20  ED_FIRST;.      
12380 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53    lock.l_len = S
12390 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20  HARED_SIZE;.    
123a0 20 20 20 20 69 66 28 20 75 6e 69 78 46 69 6c 65      if( unixFile
123b0 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c 6f 63  Lock(pFile, &loc
123c0 6b 2c 20 31 30 29 20 29 7b 0a 20 20 20 20 20 20  k, 10) ){.      
123d0 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d      int tErrno =
123e0 20 65 72 72 6e 6f 3b 0a 23 69 66 20 4f 53 4c 4f   errno;.#if OSLO
123f0 43 4b 49 4e 47 5f 43 48 45 43 4b 5f 42 55 53 59  CKING_CHECK_BUSY
12400 5f 49 4f 45 52 52 0a 20 20 20 20 20 20 20 20 20  _IOERR.         
12410 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f   rc = sqliteErro
12420 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28  rFromPosixError(
12430 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49  tErrno, SQLITE_I
12440 4f 45 52 52 5f 52 44 4c 4f 43 4b 29 3b 0a 23 65  OERR_RDLOCK);.#e
12450 6c 73 65 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  lse.          /*
12460 20 49 6e 20 74 68 65 6f 72 79 2c 20 74 68 65 20   In theory, the 
12470 63 61 6c 6c 20 74 6f 20 75 6e 69 78 46 69 6c 65  call to unixFile
12480 4c 6f 63 6b 28 29 20 63 61 6e 6e 6f 74 20 66 61  Lock() cannot fa
12490 69 6c 20 62 65 63 61 75 73 65 20 61 6e 6f 74 68  il because anoth
124a0 65 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  er.          ** 
124b0 70 72 6f 63 65 73 73 20 69 73 20 68 6f 6c 64 69  process is holdi
124c0 6e 67 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62  ng an incompatib
124d0 6c 65 20 6c 6f 63 6b 2e 20 49 66 20 69 74 20 64  le lock. If it d
124e0 6f 65 73 2c 20 74 68 69 73 20 0a 20 20 20 20 20  oes, this .     
124f0 20 20 20 20 20 2a 2a 20 69 6e 64 69 63 61 74 65       ** indicate
12500 73 20 74 68 61 74 20 74 68 65 20 6f 74 68 65 72  s that the other
12510 20 70 72 6f 63 65 73 73 20 69 73 20 6e 6f 74 20   process is not 
12520 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 6c 6f  following the lo
12530 63 6b 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20  cking.          
12540 2a 2a 20 70 72 6f 74 6f 63 6f 6c 2e 20 49 66 20  ** protocol. If 
12550 74 68 69 73 20 68 61 70 70 65 6e 73 2c 20 72 65  this happens, re
12560 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
12570 52 5f 52 44 4c 4f 43 4b 2e 20 52 65 74 75 72 6e  R_RDLOCK. Return
12580 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ing.          **
12590 20 53 51 4c 49 54 45 5f 42 55 53 59 20 77 6f 75   SQLITE_BUSY wou
125a0 6c 64 20 63 6f 6e 66 75 73 65 20 74 68 65 20 75  ld confuse the u
125b0 70 70 65 72 20 6c 61 79 65 72 20 28 69 6e 20 70  pper layer (in p
125c0 72 61 63 74 69 63 65 20 69 74 20 63 61 75 73 65  ractice it cause
125d0 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  s .          ** 
125e0 61 6e 20 61 73 73 65 72 74 20 74 6f 20 66 61 69  an assert to fai
125f0 6c 29 2e 20 2a 2f 20 0a 20 20 20 20 20 20 20 20  l). */ .        
12600 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
12610 45 52 52 5f 52 44 4c 4f 43 4b 3b 0a 20 20 20 20  ERR_RDLOCK;.    
12620 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45        storeLastE
12630 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72 72  rrno(pFile, tErr
12640 6e 6f 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  no);.#endif.    
12650 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43        if( IS_LOC
12660 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20  K_ERROR(rc) ){. 
12670 20 20 20 20 20 20 20 20 20 20 20 73 74 6f 72 65             store
12680 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c  LastErrno(pFile,
12690 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20   tErrno);.      
126a0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
126b0 67 6f 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b  goto end_unlock;
126c0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
126d0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6c 6f 63   }.    }.    loc
126e0 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c  k.l_type = F_UNL
126f0 43 4b 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77  CK;.    lock.l_w
12700 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54  hence = SEEK_SET
12710 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61  ;.    lock.l_sta
12720 72 74 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54  rt = PENDING_BYT
12730 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65  E;.    lock.l_le
12740 6e 20 3d 20 32 4c 3b 20 20 61 73 73 65 72 74 28  n = 2L;  assert(
12750 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2b 31 3d   PENDING_BYTE+1=
12760 3d 52 45 53 45 52 56 45 44 5f 42 59 54 45 20 29  =RESERVED_BYTE )
12770 3b 0a 20 20 20 20 69 66 28 20 75 6e 69 78 46 69  ;.    if( unixFi
12780 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 26 6c  leLock(pFile, &l
12790 6f 63 6b 2c 20 31 30 29 3d 3d 30 20 29 7b 0a 20  ock, 10)==0 ){. 
127a0 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69       pInode->eFi
127b0 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f  leLock = SHARED_
127c0 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  LOCK;.    }else{
127d0 0a 23 69 66 20 4f 53 4c 4f 43 4b 49 4e 47 5f 43  .#if OSLOCKING_C
127e0 48 45 43 4b 5f 42 55 53 59 5f 49 4f 45 52 52 0a  HECK_BUSY_IOERR.
127f0 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65        tErrno = e
12800 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d  rrno;.      rc =
12810 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d   sqliteErrorFrom
12820 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e  PosixError(tErrn
12830 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  o, SQLITE_IOERR_
12840 55 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69  UNLOCK);.      i
12850 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52  f( IS_LOCK_ERROR
12860 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20  (rc) ){.        
12870 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70  storeLastErrno(p
12880 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20  File, tErrno);. 
12890 20 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20       }.#else.   
128a0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
128b0 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20  OERR_UNLOCK;.   
128c0 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e     storeLastErrn
128d0 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29 3b  o(pFile, errno);
128e0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 67 6f  .#endif.      go
128f0 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20  to end_unlock;. 
12900 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 65     }.  }.  if( e
12910 46 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43  FileLock==NO_LOC
12920 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 44 65 63 72  K ){.    /* Decr
12930 65 6d 65 6e 74 20 74 68 65 20 73 68 61 72 65 64  ement the shared
12940 20 6c 6f 63 6b 20 63 6f 75 6e 74 65 72 2e 20 20   lock counter.  
12950 52 65 6c 65 61 73 65 20 74 68 65 20 6c 6f 63 6b  Release the lock
12960 20 75 73 69 6e 67 20 61 6e 0a 20 20 20 20 2a 2a   using an.    **
12970 20 4f 53 20 63 61 6c 6c 20 6f 6e 6c 79 20 77 68   OS call only wh
12980 65 6e 20 61 6c 6c 20 74 68 72 65 61 64 73 20 69  en all threads i
12990 6e 20 74 68 69 73 20 73 61 6d 65 20 70 72 6f 63  n this same proc
129a0 65 73 73 20 68 61 76 65 20 72 65 6c 65 61 73 65  ess have release
129b0 64 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c 6f 63  d.    ** the loc
129c0 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49  k..    */.    pI
129d0 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2d 2d 3b  node->nShared--;
129e0 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d  .    if( pInode-
129f0 3e 6e 53 68 61 72 65 64 3d 3d 30 20 29 7b 0a 20  >nShared==0 ){. 
12a00 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65       lock.l_type
12a10 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20   = F_UNLCK;.    
12a20 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20    lock.l_whence 
12a30 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20  = SEEK_SET;.    
12a40 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
12a50 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 30 4c   lock.l_len = 0L
12a60 3b 0a 20 20 20 20 20 20 69 66 28 20 75 6e 69 78  ;.      if( unix
12a70 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20  FileLock(pFile, 
12a80 26 6c 6f 63 6b 2c 20 31 30 29 3d 3d 30 20 29 7b  &lock, 10)==0 ){
12a90 0a 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d  .        pInode-
12aa0 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f  >eFileLock = NO_
12ab0 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  LOCK;.      }els
12ac0 65 7b 0a 23 69 66 20 4f 53 4c 4f 43 4b 49 4e 47  e{.#if OSLOCKING
12ad0 5f 43 48 45 43 4b 5f 42 55 53 59 5f 49 4f 45 52  _CHECK_BUSY_IOER
12ae0 52 0a 20 20 20 20 20 20 20 20 74 45 72 72 6e 6f  R.        tErrno
12af0 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
12b00 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72    rc = sqliteErr
12b10 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72  orFromPosixError
12b20 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f  (tErrno, SQLITE_
12b30 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 20  IOERR_UNLOCK);. 
12b40 20 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f         if( IS_LO
12b50 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a  CK_ERROR(rc) ){.
12b60 20 20 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c            storeL
12b70 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20  astErrno(pFile, 
12b80 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 20  tErrno);.       
12b90 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 20   }.#else.       
12ba0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
12bb0 52 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20  RR_UNLOCK;.     
12bc0 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e     storeLastErrn
12bd0 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29 3b  o(pFile, errno);
12be0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
12bf0 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
12c00 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20  k = NO_LOCK;.   
12c10 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c       pFile->eFil
12c20 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b  eLock = NO_LOCK;
12c30 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
12c40 20 20 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74      /* Decrement
12c50 20 74 68 65 20 63 6f 75 6e 74 20 6f 66 20 6c 6f   the count of lo
12c60 63 6b 73 20 61 67 61 69 6e 73 74 20 74 68 69 73  cks against this
12c70 20 73 61 6d 65 20 66 69 6c 65 2e 20 20 57 68 65   same file.  Whe
12c80 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 6f 75  n the.    ** cou
12c90 6e 74 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2c  nt reaches zero,
12ca0 20 63 6c 6f 73 65 20 61 6e 79 20 6f 74 68 65 72   close any other
12cb0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
12cc0 73 20 77 68 6f 73 65 20 63 6c 6f 73 65 0a 20 20  s whose close.  
12cd0 20 20 2a 2a 20 77 61 73 20 64 65 66 65 72 72 65    ** was deferre
12ce0 64 20 62 65 63 61 75 73 65 20 6f 66 20 6f 75 74  d because of out
12cf0 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 2e 0a  standing locks..
12d00 20 20 20 20 2a 2f 0a 20 20 20 20 70 49 6e 6f 64      */.    pInod
12d10 65 2d 3e 6e 4c 6f 63 6b 2d 2d 3b 0a 20 20 20 20  e->nLock--;.    
12d20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e  assert( pInode->
12d30 6e 4c 6f 63 6b 3e 3d 30 20 29 3b 0a 20 20 20 20  nLock>=0 );.    
12d40 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63  if( pInode->nLoc
12d50 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 6c  k==0 ){.      cl
12d60 6f 73 65 50 65 6e 64 69 6e 67 46 64 73 28 70 46  osePendingFds(pF
12d70 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ile);.    }.  }.
12d80 0a 65 6e 64 5f 75 6e 6c 6f 63 6b 3a 0a 20 20 75  .end_unlock:.  u
12d90 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
12da0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
12db0 45 5f 4f 4b 20 29 20 70 46 69 6c 65 2d 3e 65 46  E_OK ) pFile->eF
12dc0 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c  ileLock = eFileL
12dd0 6f 63 6b 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ock;.  return rc
12de0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72  ;.}../*.** Lower
12df0 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
12e00 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72  el on file descr
12e10 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65  iptor pFile to e
12e20 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65  FileLock.  eFile
12e30 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20  Lock.** must be 
12e40 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f  either NO_LOCK o
12e50 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a  r SHARED_LOCK..*
12e60 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b  *.** If the lock
12e70 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65  ing level of the
12e80 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
12e90 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f   is already at o
12ea0 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72  r below.** the r
12eb0 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67  equested locking
12ec0 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75   level, this rou
12ed0 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
12ee0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
12ef0 6e 69 78 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65  nixUnlock(sqlite
12f00 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
12f10 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 23 69 66 20  eFileLock){.#if 
12f20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
12f30 53 49 5a 45 3e 30 0a 20 20 61 73 73 65 72 74 28  SIZE>0.  assert(
12f40 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52   eFileLock==SHAR
12f50 45 44 5f 4c 4f 43 4b 20 7c 7c 20 28 28 75 6e 69  ED_LOCK || ((uni
12f60 78 46 69 6c 65 20 2a 29 69 64 29 2d 3e 6e 46 65  xFile *)id)->nFe
12f70 74 63 68 4f 75 74 3d 3d 30 20 29 3b 0a 23 65 6e  tchOut==0 );.#en
12f80 64 69 66 0a 20 20 72 65 74 75 72 6e 20 70 6f 73  dif.  return pos
12f90 69 78 55 6e 6c 6f 63 6b 28 69 64 2c 20 65 46 69  ixUnlock(id, eFi
12fa0 6c 65 4c 6f 63 6b 2c 20 30 29 3b 0a 7d 0a 0a 23  leLock, 0);.}..#
12fb0 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  if SQLITE_MAX_MM
12fc0 41 50 5f 53 49 5a 45 3e 30 0a 73 74 61 74 69 63  AP_SIZE>0.static
12fd0 20 69 6e 74 20 75 6e 69 78 4d 61 70 66 69 6c 65   int unixMapfile
12fe0 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 64 2c 20  (unixFile *pFd, 
12ff0 69 36 34 20 6e 42 79 74 65 29 3b 0a 73 74 61 74  i64 nByte);.stat
13000 69 63 20 76 6f 69 64 20 75 6e 69 78 55 6e 6d 61  ic void unixUnma
13010 70 66 69 6c 65 28 75 6e 69 78 46 69 6c 65 20 2a  pfile(unixFile *
13020 70 46 64 29 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a  pFd);.#endif../*
13030 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
13040 6e 20 70 65 72 66 6f 72 6d 73 20 74 68 65 20 70  n performs the p
13050 61 72 74 73 20 6f 66 20 74 68 65 20 22 63 6c 6f  arts of the "clo
13060 73 65 20 66 69 6c 65 22 20 6f 70 65 72 61 74 69  se file" operati
13070 6f 6e 20 0a 2a 2a 20 63 6f 6d 6d 6f 6e 20 74 6f  on .** common to
13080 20 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 73 63 68   all locking sch
13090 65 6d 65 73 2e 20 49 74 20 63 6c 6f 73 65 73 20  emes. It closes 
130a0 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 61 6e  the directory an
130b0 64 20 66 69 6c 65 0a 2a 2a 20 68 61 6e 64 6c 65  d file.** handle
130c0 73 2c 20 69 66 20 74 68 65 79 20 61 72 65 20 76  s, if they are v
130d0 61 6c 69 64 2c 20 61 6e 64 20 73 65 74 73 20 61  alid, and sets a
130e0 6c 6c 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65  ll fields of the
130f0 20 75 6e 69 78 46 69 6c 65 0a 2a 2a 20 73 74 72   unixFile.** str
13100 75 63 74 75 72 65 20 74 6f 20 30 2e 0a 2a 2a 0a  ucture to 0..**.
13110 2a 2a 20 49 74 20 69 73 20 2a 6e 6f 74 2a 20 6e  ** It is *not* n
13120 65 63 65 73 73 61 72 79 20 74 6f 20 68 6f 6c 64  ecessary to hold
13130 20 74 68 65 20 6d 75 74 65 78 20 77 68 65 6e 20   the mutex when 
13140 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
13150 63 61 6c 6c 65 64 2c 0a 2a 2a 20 65 76 65 6e 20  called,.** even 
13160 6f 6e 20 56 78 57 6f 72 6b 73 2e 20 20 41 20 6d  on VxWorks.  A m
13170 75 74 65 78 20 77 69 6c 6c 20 62 65 20 61 63 71  utex will be acq
13180 75 69 72 65 64 20 6f 6e 20 56 78 57 6f 72 6b 73  uired on VxWorks
13190 20 62 79 20 74 68 65 0a 2a 2a 20 76 78 77 6f 72   by the.** vxwor
131a0 6b 73 52 65 6c 65 61 73 65 46 69 6c 65 49 64 28  ksReleaseFileId(
131b0 29 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74  ) routine..*/.st
131c0 61 74 69 63 20 69 6e 74 20 63 6c 6f 73 65 55 6e  atic int closeUn
131d0 69 78 46 69 6c 65 28 73 71 6c 69 74 65 33 5f 66  ixFile(sqlite3_f
131e0 69 6c 65 20 2a 69 64 29 7b 0a 20 20 75 6e 69 78  ile *id){.  unix
131f0 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
13200 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 23 69 66  nixFile*)id;.#if
13210 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50   SQLITE_MAX_MMAP
13220 5f 53 49 5a 45 3e 30 0a 20 20 75 6e 69 78 55 6e  _SIZE>0.  unixUn
13230 6d 61 70 66 69 6c 65 28 70 46 69 6c 65 29 3b 0a  mapfile(pFile);.
13240 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 46 69  #endif.  if( pFi
13250 6c 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20  le->h>=0 ){.    
13260 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 46 69  robust_close(pFi
13270 6c 65 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 5f 5f  le, pFile->h, __
13280 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 70 46 69  LINE__);.    pFi
13290 6c 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20 7d 0a  le->h = -1;.  }.
132a0 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20  #if OS_VXWORKS. 
132b0 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 49 64 20   if( pFile->pId 
132c0 29 7b 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65  ){.    if( pFile
132d0 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 20 55 4e  ->ctrlFlags & UN
132e0 49 58 46 49 4c 45 5f 44 45 4c 45 54 45 20 29 7b  IXFILE_DELETE ){
132f0 0a 20 20 20 20 20 20 6f 73 55 6e 6c 69 6e 6b 28  .      osUnlink(
13300 70 46 69 6c 65 2d 3e 70 49 64 2d 3e 7a 43 61 6e  pFile->pId->zCan
13310 6f 6e 69 63 61 6c 4e 61 6d 65 29 3b 0a 20 20 20  onicalName);.   
13320 20 7d 0a 20 20 20 20 76 78 77 6f 72 6b 73 52 65   }.    vxworksRe
13330 6c 65 61 73 65 46 69 6c 65 49 64 28 70 46 69 6c  leaseFileId(pFil
13340 65 2d 3e 70 49 64 29 3b 0a 20 20 20 20 70 46 69  e->pId);.    pFi
13350 6c 65 2d 3e 70 49 64 20 3d 20 30 3b 0a 20 20 7d  le->pId = 0;.  }
13360 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53  .#endif.#ifdef S
13370 51 4c 49 54 45 5f 55 4e 4c 49 4e 4b 5f 41 46 54  QLITE_UNLINK_AFT
13380 45 52 5f 43 4c 4f 53 45 0a 20 20 69 66 28 20 70  ER_CLOSE.  if( p
13390 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20  File->ctrlFlags 
133a0 26 20 55 4e 49 58 46 49 4c 45 5f 44 45 4c 45 54  & UNIXFILE_DELET
133b0 45 20 29 7b 0a 20 20 20 20 6f 73 55 6e 6c 69 6e  E ){.    osUnlin
133c0 6b 28 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b  k(pFile->zPath);
133d0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
133e0 65 28 2a 28 63 68 61 72 2a 2a 29 26 70 46 69 6c  e(*(char**)&pFil
133f0 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 70  e->zPath);.    p
13400 46 69 6c 65 2d 3e 7a 50 61 74 68 20 3d 20 30 3b  File->zPath = 0;
13410 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 4f 53  .  }.#endif.  OS
13420 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20 20 20  TRACE(("CLOSE   
13430 25 2d 33 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  %-3d\n", pFile->
13440 68 29 29 3b 0a 20 20 4f 70 65 6e 43 6f 75 6e 74  h));.  OpenCount
13450 65 72 28 2d 31 29 3b 0a 20 20 73 71 6c 69 74 65  er(-1);.  sqlite
13460 33 5f 66 72 65 65 28 70 46 69 6c 65 2d 3e 70 55  3_free(pFile->pU
13470 6e 75 73 65 64 29 3b 0a 20 20 6d 65 6d 73 65 74  nused);.  memset
13480 28 70 46 69 6c 65 2c 20 30 2c 20 73 69 7a 65 6f  (pFile, 0, sizeo
13490 66 28 75 6e 69 78 46 69 6c 65 29 29 3b 0a 20 20  f(unixFile));.  
134a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
134b0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
134c0 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74   a file..*/.stat
134d0 69 63 20 69 6e 74 20 75 6e 69 78 43 6c 6f 73 65  ic int unixClose
134e0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
134f0 64 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  d){.  int rc = S
13500 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78  QLITE_OK;.  unix
13510 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
13520 6e 69 78 46 69 6c 65 20 2a 29 69 64 3b 0a 20 20  nixFile *)id;.  
13530 76 65 72 69 66 79 44 62 46 69 6c 65 28 70 46 69  verifyDbFile(pFi
13540 6c 65 29 3b 0a 20 20 75 6e 69 78 55 6e 6c 6f 63  le);.  unixUnloc
13550 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a  k(id, NO_LOCK);.
13560 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
13570 28 29 3b 0a 0a 20 20 2f 2a 20 75 6e 69 78 46 69  ();..  /* unixFi
13580 6c 65 2e 70 49 6e 6f 64 65 20 69 73 20 61 6c 77  le.pInode is alw
13590 61 79 73 20 76 61 6c 69 64 20 68 65 72 65 2e 20  ays valid here. 
135a0 4f 74 68 65 72 77 69 73 65 2c 20 61 20 64 69 66  Otherwise, a dif
135b0 66 65 72 65 6e 74 20 63 6c 6f 73 65 0a 20 20 2a  ferent close.  *
135c0 2a 20 72 6f 75 74 69 6e 65 20 28 65 2e 67 2e 20  * routine (e.g. 
135d0 6e 6f 6c 6f 63 6b 43 6c 6f 73 65 28 29 29 20 77  nolockClose()) w
135e0 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 69  ould be called i
135f0 6e 73 74 65 61 64 2e 0a 20 20 2a 2f 0a 20 20 61  nstead..  */.  a
13600 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 70 49  ssert( pFile->pI
13610 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e 30 20 7c 7c  node->nLock>0 ||
13620 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e   pFile->pInode->
13630 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20  bProcessLock==0 
13640 29 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53 28  );.  if( ALWAYS(
13650 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 29 20 26  pFile->pInode) &
13660 26 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d  & pFile->pInode-
13670 3e 6e 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 2f 2a  >nLock ){.    /*
13680 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6f 75   If there are ou
13690 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 2c  tstanding locks,
136a0 20 64 6f 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79   do not actually
136b0 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20   close the file 
136c0 6a 75 73 74 0a 20 20 20 20 2a 2a 20 79 65 74 20  just.    ** yet 
136d0 62 65 63 61 75 73 65 20 74 68 61 74 20 77 6f 75  because that wou
136e0 6c 64 20 63 6c 65 61 72 20 74 68 6f 73 65 20 6c  ld clear those l
136f0 6f 63 6b 73 2e 20 20 49 6e 73 74 65 61 64 2c 20  ocks.  Instead, 
13700 61 64 64 20 74 68 65 20 66 69 6c 65 0a 20 20 20  add the file.   
13710 20 2a 2a 20 64 65 73 63 72 69 70 74 6f 72 20 74   ** descriptor t
13720 6f 20 70 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65  o pInode->pUnuse
13730 64 20 6c 69 73 74 2e 20 20 49 74 20 77 69 6c 6c  d list.  It will
13740 20 62 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c   be automaticall
13750 79 20 63 6c 6f 73 65 64 20 0a 20 20 20 20 2a 2a  y closed .    **
13760 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20 6c   when the last l
13770 6f 63 6b 20 69 73 20 63 6c 65 61 72 65 64 2e 0a  ock is cleared..
13780 20 20 20 20 2a 2f 0a 20 20 20 20 73 65 74 50 65      */.    setPe
13790 6e 64 69 6e 67 46 64 28 70 46 69 6c 65 29 3b 0a  ndingFd(pFile);.
137a0 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 49 6e 6f    }.  releaseIno
137b0 64 65 49 6e 66 6f 28 70 46 69 6c 65 29 3b 0a 20  deInfo(pFile);. 
137c0 20 72 63 20 3d 20 63 6c 6f 73 65 55 6e 69 78 46   rc = closeUnixF
137d0 69 6c 65 28 69 64 29 3b 0a 20 20 75 6e 69 78 4c  ile(id);.  unixL
137e0 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 72  eaveMutex();.  r
137f0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 2a  eturn rc;.}../**
13800 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64  ************ End
13810 20 6f 66 20 74 68 65 20 70 6f 73 69 78 20 61 64   of the posix ad
13820 76 69 73 6f 72 79 20 6c 6f 63 6b 20 69 6d 70 6c  visory lock impl
13830 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a  ementation *****
13840 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
13850 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13860 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13870 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13880 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13890 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a  ***********/../*
138a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
138b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
138c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
138d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
138e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
138f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13900 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e 6f 2d  ************ No-
13910 6f 70 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a  op Locking *****
13920 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
13930 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
13940 0a 2a 2a 20 4f 66 20 74 68 65 20 76 61 72 69 6f  .** Of the vario
13950 75 73 20 6c 6f 63 6b 69 6e 67 20 69 6d 70 6c 65  us locking imple
13960 6d 65 6e 74 61 74 69 6f 6e 73 20 61 76 61 69 6c  mentations avail
13970 61 62 6c 65 2c 20 74 68 69 73 20 69 73 20 62 79  able, this is by
13980 20 66 61 72 20 74 68 65 0a 2a 2a 20 73 69 6d 70   far the.** simp
13990 6c 65 73 74 3a 20 20 6c 6f 63 6b 69 6e 67 20 69  lest:  locking i
139a0 73 20 69 67 6e 6f 72 65 64 2e 20 20 4e 6f 20 61  s ignored.  No a
139b0 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74  ttempt is made t
139c0 6f 20 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62  o lock the datab
139d0 61 73 65 0a 2a 2a 20 66 69 6c 65 20 66 6f 72 20  ase.** file for 
139e0 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69  reading or writi
139f0 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 6c  ng..**.** This l
13a00 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 69 73 20 61  ocking mode is a
13a10 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 20 75  ppropriate for u
13a20 73 65 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79 20  se on read-only 
13a30 64 61 74 61 62 61 73 65 73 0a 2a 2a 20 28 65 78  databases.** (ex
13a40 3a 20 64 61 74 61 62 61 73 65 73 20 74 68 61 74  : databases that
13a50 20 61 72 65 20 62 75 72 6e 65 64 20 69 6e 74 6f   are burned into
13a60 20 43 44 2d 52 4f 4d 2c 20 66 6f 72 20 65 78 61   CD-ROM, for exa
13a70 6d 70 6c 65 2e 29 20 20 49 74 20 63 61 6e 0a 2a  mple.)  It can.*
13a80 2a 20 61 6c 73 6f 20 62 65 20 75 73 65 64 20 69  * also be used i
13a90 66 20 74 68 65 20 61 70 70 6c 69 63 61 74 69 6f  f the applicatio
13aa0 6e 20 65 6d 70 6c 6f 79 73 20 73 6f 6d 65 20 65  n employs some e
13ab0 78 74 65 72 6e 61 6c 20 6d 65 63 68 61 6e 69 73  xternal mechanis
13ac0 6d 20 74 6f 0a 2a 2a 20 70 72 65 76 65 6e 74 20  m to.** prevent 
13ad0 73 69 6d 75 6c 74 61 6e 65 6f 75 73 20 61 63 63  simultaneous acc
13ae0 65 73 73 20 6f 66 20 74 68 65 20 73 61 6d 65 20  ess of the same 
13af0 64 61 74 61 62 61 73 65 20 62 79 20 74 77 6f 20  database by two 
13b00 6f 72 20 6d 6f 72 65 0a 2a 2a 20 64 61 74 61 62  or more.** datab
13b10 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e  ase connections.
13b20 20 20 42 75 74 20 74 68 65 72 65 20 69 73 20 61    But there is a
13b30 20 73 65 72 69 6f 75 73 20 72 69 73 6b 20 6f 66   serious risk of
13b40 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 72   database.** cor
13b50 72 75 70 74 69 6f 6e 20 69 66 20 74 68 69 73 20  ruption if this 
13b60 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 69 73 20  locking mode is 
13b70 75 73 65 64 20 69 6e 20 73 69 74 75 61 74 69 6f  used in situatio
13b80 6e 73 20 77 68 65 72 65 20 6d 75 6c 74 69 70 6c  ns where multipl
13b90 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f  e.** database co
13ba0 6e 6e 65 63 74 69 6f 6e 73 20 61 72 65 20 61 63  nnections are ac
13bb0 63 65 73 73 69 6e 67 20 74 68 65 20 73 61 6d 65  cessing the same
13bc0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
13bd0 74 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 74 69  t the same.** ti
13be0 6d 65 20 61 6e 64 20 6f 6e 65 20 6f 72 20 6d 6f  me and one or mo
13bf0 72 65 20 6f 66 20 74 68 6f 73 65 20 63 6f 6e 6e  re of those conn
13c00 65 63 74 69 6f 6e 73 20 61 72 65 20 77 72 69 74  ections are writ
13c10 69 6e 67 2e 0a 2a 2f 0a 0a 73 74 61 74 69 63 20  ing..*/..static 
13c20 69 6e 74 20 6e 6f 6c 6f 63 6b 43 68 65 63 6b 52  int nolockCheckR
13c30 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69  eservedLock(sqli
13c40 74 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65  te3_file *NotUse
13c50 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29  d, int *pResOut)
13c60 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  {.  UNUSED_PARAM
13c70 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
13c80 20 2a 70 52 65 73 4f 75 74 20 3d 20 30 3b 0a 20   *pResOut = 0;. 
13c90 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
13ca0 4b 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20  K;.}.static int 
13cb0 6e 6f 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69 74  nolockLock(sqlit
13cc0 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64  e3_file *NotUsed
13cd0 2c 20 69 6e 74 20 4e 6f 74 55 73 65 64 32 29 7b  , int NotUsed2){
13ce0 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
13cf0 54 45 52 32 28 4e 6f 74 55 73 65 64 2c 20 4e 6f  TER2(NotUsed, No
13d00 74 55 73 65 64 32 29 3b 0a 20 20 72 65 74 75 72  tUsed2);.  retur
13d10 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 73  n SQLITE_OK;.}.s
13d20 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b  tatic int nolock
13d30 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  Unlock(sqlite3_f
13d40 69 6c 65 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e  ile *NotUsed, in
13d50 74 20 4e 6f 74 55 73 65 64 32 29 7b 0a 20 20 55  t NotUsed2){.  U
13d60 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 32  NUSED_PARAMETER2
13d70 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73 65  (NotUsed, NotUse
13d80 64 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  d2);.  return SQ
13d90 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
13da0 2a 20 43 6c 6f 73 65 20 74 68 65 20 66 69 6c 65  * Close the file
13db0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
13dc0 6e 6f 6c 6f 63 6b 43 6c 6f 73 65 28 73 71 6c 69  nolockClose(sqli
13dd0 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a  te3_file *id) {.
13de0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
13df0 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65  E_OK;.  unixFile
13e00 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
13e10 69 6c 65 20 2a 29 69 64 3b 0a 20 20 75 6e 69 78  ile *)id;.  unix
13e20 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20  EnterMutex();.  
13e30 69 66 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  if( pFile->pInod
13e40 65 20 29 7b 20 20 0a 20 20 20 20 61 73 73 65 72  e ){  .    asser
13e50 74 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  t( pFile->pInode
13e60 2d 3e 6e 4c 6f 63 6b 3e 30 20 7c 7c 20 70 46 69  ->nLock>0 || pFi
13e70 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50 72 6f  le->pInode->bPro
13e80 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20  cessLock==0 );. 
13e90 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70 49     if( pFile->pI
13ea0 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 20 29 7b 0a 20  node->nLock ){. 
13eb0 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65       /* If there
13ec0 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67   are outstanding
13ed0 20 6c 6f 63 6b 73 2c 20 64 6f 20 6e 6f 74 20 61   locks, do not a
13ee0 63 74 75 61 6c 6c 79 20 63 6c 6f 73 65 20 74 68  ctually close th
13ef0 65 20 66 69 6c 65 20 6a 75 73 74 0a 20 20 20 20  e file just.    
13f00 20 20 2a 2a 20 79 65 74 20 62 65 63 61 75 73 65    ** yet because
13f10 20 74 68 61 74 20 77 6f 75 6c 64 20 63 6c 65 61   that would clea
13f20 72 20 74 68 6f 73 65 20 6c 6f 63 6b 73 2e 20 20  r those locks.  
13f30 49 6e 73 74 65 61 64 2c 20 61 64 64 20 74 68 65  Instead, add the
13f40 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 64   file.      ** d
13f50 65 73 63 72 69 70 74 6f 72 20 74 6f 20 70 49 6e  escriptor to pIn
13f60 6f 64 65 2d 3e 70 55 6e 75 73 65 64 20 6c 69 73  ode->pUnused lis
13f70 74 2e 20 20 49 74 20 77 69 6c 6c 20 62 65 20 61  t.  It will be a
13f80 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6c 6f  utomatically clo
13f90 73 65 64 20 0a 20 20 20 20 20 20 2a 2a 20 77 68  sed .      ** wh
13fa0 65 6e 20 74 68 65 20 6c 61 73 74 20 6c 6f 63 6b  en the last lock
13fb0 20 69 73 20 63 6c 65 61 72 65 64 2e 0a 20 20 20   is cleared..   
13fc0 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 65 74 50     */.      setP
13fd0 65 6e 64 69 6e 67 46 64 28 70 46 69 6c 65 29 3b  endingFd(pFile);
13fe0 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6c 65 61  .    }.    relea
13ff0 73 65 49 6e 6f 64 65 49 6e 66 6f 28 70 46 69 6c  seInodeInfo(pFil
14000 65 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 63  e);.  }.  rc = c
14010 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29  loseUnixFile(id)
14020 3b 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74  ;.  unixLeaveMut
14030 65 78 28 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ex();.  return r
14040 63 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  c;.}../*********
14050 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f  ********** End o
14060 66 20 74 68 65 20 6e 6f 2d 6f 70 20 6c 6f 63 6b  f the no-op lock
14070 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
14080 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14090 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
140a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
140b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
140c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
140d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
140e0 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  ****/../********
140f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14100 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14110 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14120 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14130 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
14140 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14150 20 42 65 67 69 6e 20 64 6f 74 2d 66 69 6c 65 20   Begin dot-file 
14160 4c 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a  Locking ********
14170 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14180 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65  ******.**.** The
14190 20 64 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67   dotfile locking
141a0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
141b0 75 73 65 73 20 74 68 65 20 65 78 69 73 74 65 6e  uses the existen
141c0 63 65 20 6f 66 20 73 65 70 61 72 61 74 65 20 6c  ce of separate l
141d0 6f 63 6b 0a 2a 2a 20 66 69 6c 65 73 20 28 72 65  ock.** files (re
141e0 61 6c 6c 79 20 61 20 64 69 72 65 63 74 6f 72 79  ally a directory
141f0 29 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 61 63 63  ) to control acc
14200 65 73 73 20 74 6f 20 74 68 65 20 64 61 74 61 62  ess to the datab
14210 61 73 65 2e 20 20 54 68 69 73 20 77 6f 72 6b 73  ase.  This works
14220 0a 2a 2a 20 6f 6e 20 6a 75 73 74 20 61 62 6f 75  .** on just abou
14230 74 20 65 76 65 72 79 20 66 69 6c 65 73 79 73 74  t every filesyst
14240 65 6d 20 69 6d 61 67 69 6e 61 62 6c 65 2e 20 20  em imaginable.  
14250 42 75 74 20 74 68 65 72 65 20 61 72 65 20 73 65  But there are se
14260 72 69 6f 75 73 20 64 6f 77 6e 73 69 64 65 73 3a  rious downsides:
14270 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20 20 54  .**.**    (1)  T
14280 68 65 72 65 20 69 73 20 7a 65 72 6f 20 63 6f 6e  here is zero con
14290 63 75 72 72 65 6e 63 79 2e 20 20 41 20 73 69 6e  currency.  A sin
142a0 67 6c 65 20 72 65 61 64 65 72 20 62 6c 6f 63 6b  gle reader block
142b0 73 20 61 6c 6c 20 6f 74 68 65 72 0a 2a 2a 20 20  s all other.**  
142c0 20 20 20 20 20 20 20 63 6f 6e 6e 65 63 74 69 6f         connectio
142d0 6e 73 20 66 72 6f 6d 20 72 65 61 64 69 6e 67 20  ns from reading 
142e0 6f 72 20 77 72 69 74 69 6e 67 20 74 68 65 20 64  or writing the d
142f0 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 20  atabase..**.**  
14300 20 20 28 32 29 20 20 41 6e 20 61 70 70 6c 69 63    (2)  An applic
14310 61 74 69 6f 6e 20 63 72 61 73 68 20 6f 72 20 70  ation crash or p
14320 6f 77 65 72 20 6c 6f 73 73 20 63 61 6e 20 6c 65  ower loss can le
14330 61 76 65 20 73 74 61 6c 65 20 6c 6f 63 6b 20 66  ave stale lock f
14340 69 6c 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 20  iles.**         
14350 73 69 74 74 69 6e 67 20 61 72 6f 75 6e 64 20 74  sitting around t
14360 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20 63  hat need to be c
14370 6c 65 61 72 65 64 20 6d 61 6e 75 61 6c 6c 79 2e  leared manually.
14380 0a 2a 2a 0a 2a 2a 20 4e 65 76 65 72 74 68 65 6c  .**.** Neverthel
14390 65 73 73 2c 20 61 20 64 6f 74 6c 6f 63 6b 20 69  ess, a dotlock i
143a0 73 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65  s an appropriate
143b0 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 20 66 6f   locking mode fo
143c0 72 20 75 73 65 20 69 66 20 6e 6f 0a 2a 2a 20 6f  r use if no.** o
143d0 74 68 65 72 20 6c 6f 63 6b 69 6e 67 20 73 74 72  ther locking str
143e0 61 74 65 67 79 20 69 73 20 61 76 61 69 6c 61 62  ategy is availab
143f0 6c 65 2e 0a 2a 2a 0a 2a 2a 20 44 6f 74 66 69 6c  le..**.** Dotfil
14400 65 20 6c 6f 63 6b 69 6e 67 20 77 6f 72 6b 73 20  e locking works 
14410 62 79 20 63 72 65 61 74 69 6e 67 20 61 20 73 75  by creating a su
14420 62 64 69 72 65 63 74 6f 72 79 20 69 6e 20 74 68  bdirectory in th
14430 65 20 73 61 6d 65 20 64 69 72 65 63 74 6f 72 79  e same directory
14440 20 61 73 0a 2a 2a 20 74 68 65 20 64 61 74 61 62   as.** the datab
14450 61 73 65 20 61 6e 64 20 77 69 74 68 20 74 68 65  ase and with the
14460 20 73 61 6d 65 20 6e 61 6d 65 20 62 75 74 20 77   same name but w
14470 69 74 68 20 61 20 22 2e 6c 6f 63 6b 22 20 65 78  ith a ".lock" ex
14480 74 65 6e 73 69 6f 6e 20 61 64 64 65 64 2e 0a 2a  tension added..*
14490 2a 20 54 68 65 20 65 78 69 73 74 65 6e 63 65 20  * The existence 
144a0 6f 66 20 61 20 6c 6f 63 6b 20 64 69 72 65 63 74  of a lock direct
144b0 6f 72 79 20 69 6d 70 6c 69 65 73 20 61 6e 20 45  ory implies an E
144c0 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20  XCLUSIVE lock.  
144d0 41 6c 6c 20 6f 74 68 65 72 0a 2a 2a 20 6c 6f 63  All other.** loc
144e0 6b 20 74 79 70 65 73 20 28 53 48 41 52 45 44 2c  k types (SHARED,
144f0 20 52 45 53 45 52 56 45 44 2c 20 50 45 4e 44 49   RESERVED, PENDI
14500 4e 47 29 20 61 72 65 20 6d 61 70 70 65 64 20 69  NG) are mapped i
14510 6e 74 6f 20 45 58 43 4c 55 53 49 56 45 2e 0a 2a  nto EXCLUSIVE..*
14520 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69 6c  /../*.** The fil
14530 65 20 73 75 66 66 69 78 20 61 64 64 65 64 20 74  e suffix added t
14540 6f 20 74 68 65 20 64 61 74 61 20 62 61 73 65 20  o the data base 
14550 66 69 6c 65 6e 61 6d 65 20 69 6e 20 6f 72 64 65  filename in orde
14560 72 20 74 6f 20 63 72 65 61 74 65 20 74 68 65 0a  r to create the.
14570 2a 2a 20 6c 6f 63 6b 20 64 69 72 65 63 74 6f 72  ** lock director
14580 79 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 44 4f  y..*/.#define DO
14590 54 4c 4f 43 4b 5f 53 55 46 46 49 58 20 22 2e 6c  TLOCK_SUFFIX ".l
145a0 6f 63 6b 22 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ock"../*.** This
145b0 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20   routine checks 
145c0 69 66 20 74 68 65 72 65 20 69 73 20 61 20 52 45  if there is a RE
145d0 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64  SERVED lock held
145e0 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65   on the specifie
145f0 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69  d.** file by thi
14600 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70  s or any other p
14610 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68 20  rocess. If such 
14620 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20  a lock is held, 
14630 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20  set *pResOut.** 
14640 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61  to a non-zero va
14650 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a 70  lue otherwise *p
14660 52 65 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f  ResOut is set to
14670 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74 75   zero.  The retu
14680 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73  rn value.** is s
14690 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20  et to SQLITE_OK 
146a0 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65 72  unless an I/O er
146b0 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ror occurs durin
146c0 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e  g lock checking.
146d0 0a 2a 2a 0a 2a 2a 20 49 6e 20 64 6f 74 66 69 6c  .**.** In dotfil
146e0 65 20 6c 6f 63 6b 69 6e 67 2c 20 65 69 74 68 65  e locking, eithe
146f0 72 20 61 20 6c 6f 63 6b 20 65 78 69 73 74 73 20  r a lock exists 
14700 6f 72 20 69 74 20 64 6f 65 73 20 6e 6f 74 2e 20  or it does not. 
14710 20 53 6f 20 69 6e 20 74 68 69 73 0a 2a 2a 20 76   So in this.** v
14720 61 72 69 61 74 69 6f 6e 20 6f 66 20 43 68 65 63  ariation of Chec
14730 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 29 2c  kReservedLock(),
14740 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65 74   *pResOut is set
14750 20 74 6f 20 74 72 75 65 20 69 66 20 61 6e 79 20   to true if any 
14760 6c 6f 63 6b 0a 2a 2a 20 69 73 20 68 65 6c 64 20  lock.** is held 
14770 6f 6e 20 74 68 65 20 66 69 6c 65 20 61 6e 64 20  on the file and 
14780 66 61 6c 73 65 20 69 66 20 74 68 65 20 66 69 6c  false if the fil
14790 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64 2e 0a 2a  e is unlocked..*
147a0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f 74  /.static int dot
147b0 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72 76 65  lockCheckReserve
147c0 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  dLock(sqlite3_fi
147d0 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65  le *id, int *pRe
147e0 73 4f 75 74 29 20 7b 0a 20 20 69 6e 74 20 72 63  sOut) {.  int rc
147f0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
14800 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d 20 30  int reserved = 0
14810 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  ;.  unixFile *pF
14820 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
14830 29 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61 74 65  )id;..  Simulate
14840 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20  IOError( return 
14850 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45  SQLITE_IOERR_CHE
14860 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20  CKRESERVEDLOCK; 
14870 29 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20  );.  .  assert( 
14880 70 46 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20 43  pFile );..  /* C
14890 68 65 63 6b 20 69 66 20 61 20 74 68 72 65 61 64  heck if a thread
148a0 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73   in this process
148b0 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c 6f   holds such a lo
148c0 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  ck */.  if( pFil
148d0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41  e->eFileLock>SHA
148e0 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RED_LOCK ){.    
148f0 2f 2a 20 45 69 74 68 65 72 20 74 68 69 73 20 63  /* Either this c
14900 6f 6e 6e 65 63 74 69 6f 6e 20 6f 72 20 73 6f 6d  onnection or som
14910 65 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69  e other connecti
14920 6f 6e 20 69 6e 20 74 68 65 20 73 61 6d 65 20 70  on in the same p
14930 72 6f 63 65 73 73 0a 20 20 20 20 2a 2a 20 68 6f  rocess.    ** ho
14940 6c 64 73 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68  lds a lock on th
14950 65 20 66 69 6c 65 2e 20 20 4e 6f 20 6e 65 65 64  e file.  No need
14960 20 74 6f 20 63 68 65 63 6b 20 66 75 72 74 68 65   to check furthe
14970 72 2e 20 2a 2f 0a 20 20 20 20 72 65 73 65 72 76  r. */.    reserv
14980 65 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b  ed = 1;.  }else{
14990 0a 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 63 6b  .    /* The lock
149a0 20 69 73 20 68 65 6c 64 20 69 66 20 61 6e 64 20   is held if and 
149b0 6f 6e 6c 79 20 69 66 20 74 68 65 20 6c 6f 63 6b  only if the lock
149c0 66 69 6c 65 20 65 78 69 73 74 73 20 2a 2f 0a 20  file exists */. 
149d0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
149e0 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63 6f 6e 73  LockFile = (cons
149f0 74 20 63 68 61 72 2a 29 70 46 69 6c 65 2d 3e 6c  t char*)pFile->l
14a00 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20  ockingContext;. 
14a10 20 20 20 72 65 73 65 72 76 65 64 20 3d 20 6f 73     reserved = os
14a20 41 63 63 65 73 73 28 7a 4c 6f 63 6b 46 69 6c 65  Access(zLockFile
14a30 2c 20 30 29 3d 3d 30 3b 0a 20 20 7d 0a 20 20 4f  , 0)==0;.  }.  O
14a40 53 54 52 41 43 45 28 28 22 54 45 53 54 20 57 52  STRACE(("TEST WR
14a50 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 20 28  -LOCK %d %d %d (
14a60 64 6f 74 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69  dotlock)\n", pFi
14a70 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65 72  le->h, rc, reser
14a80 76 65 64 29 29 3b 0a 20 20 2a 70 52 65 73 4f 75  ved));.  *pResOu
14a90 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20 20  t = reserved;.  
14aa0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
14ab0 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c  .** Lock the fil
14ac0 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20  e with the lock 
14ad0 73 70 65 63 69 66 69 65 64 20 62 79 20 70 61 72  specified by par
14ae0 61 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b  ameter eFileLock
14af0 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65   - one.** of the
14b00 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
14b10 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 45 44  *     (1) SHARED
14b20 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29  _LOCK.**     (2)
14b30 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a   RESERVED_LOCK.*
14b40 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e  *     (3) PENDIN
14b50 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34  G_LOCK.**     (4
14b60 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ) EXCLUSIVE_LOCK
14b70 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73  .**.** Sometimes
14b80 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67   when requesting
14b90 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c   one lock state,
14ba0 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b   additional lock
14bb0 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69   states.** are i
14bc0 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 77 65  nserted in betwe
14bd0 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67  en.  The locking
14be0 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f   might fail on o
14bf0 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a  ne of the later.
14c00 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c  ** transitions l
14c10 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20  eaving the lock 
14c20 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74 20  state different 
14c30 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61  from what it sta
14c40 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c  rted but.** stil
14c50 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67  l short of its g
14c60 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  oal.  The follow
14c70 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73 20  ing chart shows 
14c80 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74  the allowed.** t
14c90 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74  ransitions and t
14ca0 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65  he inserted inte
14cb0 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 73 3a  rmediate states:
14cc0 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b  .**.**    UNLOCK
14cd0 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20  ED -> SHARED.** 
14ce0 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53     SHARED -> RES
14cf0 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52  ERVED.**    SHAR
14d00 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20  ED -> (PENDING) 
14d10 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  -> EXCLUSIVE.** 
14d20 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28     RESERVED -> (
14d30 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c  PENDING) -> EXCL
14d40 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44  USIVE.**    PEND
14d50 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  ING -> EXCLUSIVE
14d60 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
14d70 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e  ine will only in
14d80 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20  crease a lock.  
14d90 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 4f  Use the sqlite3O
14da0 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75  sUnlock().** rou
14db0 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61 20  tine to lower a 
14dc0 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a  locking level..*
14dd0 2a 0a 2a 2a 20 57 69 74 68 20 64 6f 74 66 69 6c  *.** With dotfil
14de0 65 20 6c 6f 63 6b 69 6e 67 2c 20 77 65 20 72 65  e locking, we re
14df0 61 6c 6c 79 20 6f 6e 6c 79 20 73 75 70 70 6f 72  ally only suppor
14e00 74 20 73 74 61 74 65 20 28 34 29 3a 20 45 58 43  t state (4): EXC
14e10 4c 55 53 49 56 45 2e 0a 2a 2a 20 42 75 74 20 77  LUSIVE..** But w
14e20 65 20 74 72 61 63 6b 20 74 68 65 20 6f 74 68 65  e track the othe
14e30 72 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 73  r locking levels
14e40 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 2a 2f 0a   internally..*/.
14e50 73 74 61 74 69 63 20 69 6e 74 20 64 6f 74 6c 6f  static int dotlo
14e60 63 6b 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  ckLock(sqlite3_f
14e70 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69  ile *id, int eFi
14e80 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78  leLock) {.  unix
14e90 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
14ea0 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 63  nixFile*)id;.  c
14eb0 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d  har *zLockFile =
14ec0 20 28 63 68 61 72 20 2a 29 70 46 69 6c 65 2d 3e   (char *)pFile->
14ed0 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  lockingContext;.
14ee0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
14ef0 45 5f 4f 4b 3b 0a 0a 0a 20 20 2f 2a 20 49 66 20  E_OK;...  /* If 
14f00 77 65 20 68 61 76 65 20 61 6e 79 20 6c 6f 63 6b  we have any lock
14f10 2c 20 74 68 65 6e 20 74 68 65 20 6c 6f 63 6b 20  , then the lock 
14f20 66 69 6c 65 20 61 6c 72 65 61 64 79 20 65 78 69  file already exi
14f30 73 74 73 2e 20 20 41 6c 6c 20 77 65 20 68 61 76  sts.  All we hav
14f40 65 0a 20 20 2a 2a 20 74 6f 20 64 6f 20 69 73 20  e.  ** to do is 
14f50 61 64 6a 75 73 74 20 6f 75 72 20 69 6e 74 65 72  adjust our inter
14f60 6e 61 6c 20 72 65 63 6f 72 64 20 6f 66 20 74 68  nal record of th
14f70 65 20 6c 6f 63 6b 20 6c 65 76 65 6c 2e 0a 20 20  e lock level..  
14f80 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  */.  if( pFile->
14f90 65 46 69 6c 65 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c  eFileLock > NO_L
14fa0 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65  OCK ){.    pFile
14fb0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46  ->eFileLock = eF
14fc0 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 2f 2a 20  ileLock;.    /* 
14fd0 41 6c 77 61 79 73 20 75 70 64 61 74 65 20 74 68  Always update th
14fe0 65 20 74 69 6d 65 73 74 61 6d 70 20 6f 6e 20 74  e timestamp on t
14ff0 68 65 20 6f 6c 64 20 66 69 6c 65 20 2a 2f 0a 23  he old file */.#
15000 69 66 64 65 66 20 48 41 56 45 5f 55 54 49 4d 45  ifdef HAVE_UTIME
15010 0a 20 20 20 20 75 74 69 6d 65 28 7a 4c 6f 63 6b  .    utime(zLock
15020 46 69 6c 65 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6c  File, NULL);.#el
15030 73 65 0a 20 20 20 20 75 74 69 6d 65 73 28 7a 4c  se.    utimes(zL
15040 6f 63 6b 46 69 6c 65 2c 20 4e 55 4c 4c 29 3b 0a  ockFile, NULL);.
15050 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72  #endif.    retur
15060 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
15070 0a 20 20 0a 20 20 2f 2a 20 67 72 61 62 20 61 6e  .  .  /* grab an
15080 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20   exclusive lock 
15090 2a 2f 0a 20 20 72 63 20 3d 20 6f 73 4d 6b 64 69  */.  rc = osMkdi
150a0 72 28 7a 4c 6f 63 6b 46 69 6c 65 2c 20 30 37 37  r(zLockFile, 077
150b0 37 29 3b 0a 20 20 69 66 28 20 72 63 3c 30 20 29  7);.  if( rc<0 )
150c0 7b 0a 20 20 20 20 2f 2a 20 66 61 69 6c 65 64 20  {.    /* failed 
150d0 74 6f 20 6f 70 65 6e 2f 63 72 65 61 74 65 20 74  to open/create t
150e0 68 65 20 6c 6f 63 6b 20 64 69 72 65 63 74 6f 72  he lock director
150f0 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 74 45 72  y */.    int tEr
15100 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
15110 20 69 66 28 20 45 45 58 49 53 54 20 3d 3d 20 74   if( EEXIST == t
15120 45 72 72 6e 6f 20 29 7b 0a 20 20 20 20 20 20 72  Errno ){.      r
15130 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
15140 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  .    } else {.  
15150 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45      rc = sqliteE
15160 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
15170 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54  or(tErrno, SQLIT
15180 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20  E_IOERR_LOCK);. 
15190 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b       if( IS_LOCK
151a0 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20  _ERROR(rc) ){.  
151b0 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45        storeLastE
151c0 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72 72  rrno(pFile, tErr
151d0 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  no);.      }.   
151e0 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63   }.    return rc
151f0 3b 0a 20 20 7d 20 0a 20 20 0a 20 20 2f 2a 20 67  ;.  } .  .  /* g
15200 6f 74 20 69 74 2c 20 73 65 74 20 74 68 65 20 74  ot it, set the t
15210 79 70 65 20 61 6e 64 20 72 65 74 75 72 6e 20 6f  ype and return o
15220 6b 20 2a 2f 0a 20 20 70 46 69 6c 65 2d 3e 65 46  k */.  pFile->eF
15230 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c  ileLock = eFileL
15240 6f 63 6b 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ock;.  return rc
15250 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72  ;.}../*.** Lower
15260 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
15270 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72  el on file descr
15280 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65  iptor pFile to e
15290 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65  FileLock.  eFile
152a0 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20  Lock.** must be 
152b0 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f  either NO_LOCK o
152c0 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a  r SHARED_LOCK..*
152d0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b  *.** If the lock
152e0 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65  ing level of the
152f0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
15300 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f   is already at o
15310 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72  r below.** the r
15320 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67  equested locking
15330 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75   level, this rou
15340 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
15350 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 65 20  .**.** When the 
15360 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 72 65  locking level re
15370 61 63 68 65 73 20 4e 4f 5f 4c 4f 43 4b 2c 20 64  aches NO_LOCK, d
15380 65 6c 65 74 65 20 74 68 65 20 6c 6f 63 6b 20 66  elete the lock f
15390 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
153a0 6e 74 20 64 6f 74 6c 6f 63 6b 55 6e 6c 6f 63 6b  nt dotlockUnlock
153b0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
153c0 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b  d, int eFileLock
153d0 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  ) {.  unixFile *
153e0 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
153f0 65 2a 29 69 64 3b 0a 20 20 63 68 61 72 20 2a 7a  e*)id;.  char *z
15400 4c 6f 63 6b 46 69 6c 65 20 3d 20 28 63 68 61 72  LockFile = (char
15410 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e   *)pFile->lockin
15420 67 43 6f 6e 74 65 78 74 3b 0a 20 20 69 6e 74 20  gContext;.  int 
15430 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  rc;..  assert( p
15440 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43  File );.  OSTRAC
15450 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25  E(("UNLOCK  %d %
15460 64 20 77 61 73 20 25 64 20 70 69 64 3d 25 64 20  d was %d pid=%d 
15470 28 64 6f 74 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46  (dotlock)\n", pF
15480 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f 63  ile->h, eFileLoc
15490 6b 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 46  k,.           pF
154a0 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20  ile->eFileLock, 
154b0 6f 73 47 65 74 70 69 64 28 30 29 29 29 3b 0a 20  osGetpid(0)));. 
154c0 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f   assert( eFileLo
154d0 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck<=SHARED_LOCK 
154e0 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f 70  );.  .  /* no-op
154f0 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a   if possible */.
15500 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69    if( pFile->eFi
15510 6c 65 4c 6f 63 6b 3d 3d 65 46 69 6c 65 4c 6f 63  leLock==eFileLoc
15520 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  k ){.    return 
15530 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
15540 20 20 2f 2a 20 54 6f 20 64 6f 77 6e 67 72 61 64    /* To downgrad
15550 65 20 74 6f 20 73 68 61 72 65 64 2c 20 73 69 6d  e to shared, sim
15560 70 6c 79 20 75 70 64 61 74 65 20 6f 75 72 20 69  ply update our i
15570 6e 74 65 72 6e 61 6c 20 6e 6f 74 69 6f 6e 20 6f  nternal notion o
15580 66 20 74 68 65 0a 20 20 2a 2a 20 6c 6f 63 6b 20  f the.  ** lock 
15590 73 74 61 74 65 2e 20 20 4e 6f 20 6e 65 65 64 20  state.  No need 
155a0 74 6f 20 6d 65 73 73 20 77 69 74 68 20 74 68 65  to mess with the
155b0 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 0a 20   file on disk.. 
155c0 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65 4c   */.  if( eFileL
155d0 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
155e0 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65   ){.    pFile->e
155f0 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45  FileLock = SHARE
15600 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 72 65 74 75  D_LOCK;.    retu
15610 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
15620 7d 0a 20 20 0a 20 20 2f 2a 20 54 6f 20 66 75 6c  }.  .  /* To ful
15630 6c 79 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61  ly unlock the da
15640 74 61 62 61 73 65 2c 20 64 65 6c 65 74 65 20 74  tabase, delete t
15650 68 65 20 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a  he lock file */.
15660 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c    assert( eFileL
15670 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b 20 29 3b 0a  ock==NO_LOCK );.
15680 20 20 72 63 20 3d 20 6f 73 52 6d 64 69 72 28 7a    rc = osRmdir(z
15690 4c 6f 63 6b 46 69 6c 65 29 3b 0a 20 20 69 66 28  LockFile);.  if(
156a0 20 72 63 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d   rc<0 && errno==
156b0 45 4e 4f 54 44 49 52 20 29 20 72 63 20 3d 20 6f  ENOTDIR ) rc = o
156c0 73 55 6e 6c 69 6e 6b 28 7a 4c 6f 63 6b 46 69 6c  sUnlink(zLockFil
156d0 65 29 3b 0a 20 20 69 66 28 20 72 63 3c 30 20 29  e);.  if( rc<0 )
156e0 7b 0a 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f  {.    int tErrno
156f0 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 72 63   = errno;.    rc
15700 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 45 4e   = 0;.    if( EN
15710 4f 45 4e 54 20 21 3d 20 74 45 72 72 6e 6f 20 29  OENT != tErrno )
15720 7b 0a 23 69 66 20 4f 53 4c 4f 43 4b 49 4e 47 5f  {.#if OSLOCKING_
15730 43 48 45 43 4b 5f 42 55 53 59 5f 49 4f 45 52 52  CHECK_BUSY_IOERR
15740 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
15750 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78  teErrorFromPosix
15760 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51  Error(tErrno, SQ
15770 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43  LITE_IOERR_UNLOC
15780 4b 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20  K);.#else.      
15790 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
157a0 52 5f 55 4e 4c 4f 43 4b 3b 0a 23 65 6e 64 69 66  R_UNLOCK;.#endif
157b0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 49  .    }.    if( I
157c0 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29  S_LOCK_ERROR(rc)
157d0 20 29 7b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c   ){.      storeL
157e0 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20  astErrno(pFile, 
157f0 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20 7d 0a 20  tErrno);.    }. 
15800 20 20 20 72 65 74 75 72 6e 20 72 63 3b 20 0a 20     return rc; . 
15810 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c   }.  pFile->eFil
15820 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b  eLock = NO_LOCK;
15830 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
15840 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  _OK;.}../*.** Cl
15850 6f 73 65 20 61 20 66 69 6c 65 2e 20 20 4d 61 6b  ose a file.  Mak
15860 65 20 73 75 72 65 20 74 68 65 20 6c 6f 63 6b 20  e sure the lock 
15870 68 61 73 20 62 65 65 6e 20 72 65 6c 65 61 73 65  has been release
15880 64 20 62 65 66 6f 72 65 20 63 6c 6f 73 69 6e 67  d before closing
15890 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
158a0 64 6f 74 6c 6f 63 6b 43 6c 6f 73 65 28 73 71 6c  dotlockClose(sql
158b0 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b  ite3_file *id) {
158c0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
158d0 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 69 64 20  TE_OK;.  if( id 
158e0 29 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20  ){.    unixFile 
158f0 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
15900 6c 65 2a 29 69 64 3b 0a 20 20 20 20 64 6f 74 6c  le*)id;.    dotl
15910 6f 63 6b 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f  ockUnlock(id, NO
15920 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 73 71 6c 69  _LOCK);.    sqli
15930 74 65 33 5f 66 72 65 65 28 70 46 69 6c 65 2d 3e  te3_free(pFile->
15940 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3b  lockingContext);
15950 0a 20 20 20 20 72 63 20 3d 20 63 6c 6f 73 65 55  .    rc = closeU
15960 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 20 20 7d  nixFile(id);.  }
15970 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
15980 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
15990 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 64  *** End of the d
159a0 6f 74 2d 66 69 6c 65 20 6c 6f 63 6b 20 69 6d 70  ot-file lock imp
159b0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a  lementation ****
159c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
159d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
159e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
159f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15a00 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15a10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
15a20 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
15a30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15a40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15a50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15a60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15a70 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
15a80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69  *********** Begi
15a90 6e 20 66 6c 6f 63 6b 20 4c 6f 63 6b 69 6e 67 20  n flock Locking 
15aa0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15ab0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
15ac0 0a 2a 2a 0a 2a 2a 20 55 73 65 20 74 68 65 20 66  .**.** Use the f
15ad0 6c 6f 63 6b 28 29 20 73 79 73 74 65 6d 20 63 61  lock() system ca
15ae0 6c 6c 20 74 6f 20 64 6f 20 66 69 6c 65 20 6c 6f  ll to do file lo
15af0 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 66 6c 6f  cking..**.** flo
15b00 63 6b 28 29 20 6c 6f 63 6b 69 6e 67 20 69 73 20  ck() locking is 
15b10 6c 69 6b 65 20 64 6f 74 2d 66 69 6c 65 20 6c 6f  like dot-file lo
15b20 63 6b 69 6e 67 20 69 6e 20 74 68 61 74 20 74 68  cking in that th
15b30 65 20 76 61 72 69 6f 75 73 0a 2a 2a 20 66 69 6e  e various.** fin
15b40 65 2d 67 72 61 69 6e 20 6c 6f 63 6b 69 6e 67 20  e-grain locking 
15b50 6c 65 76 65 6c 73 20 73 75 70 70 6f 72 74 65 64  levels supported
15b60 20 62 79 20 53 51 4c 69 74 65 20 61 72 65 20 63   by SQLite are c
15b70 6f 6c 6c 61 70 73 65 64 20 69 6e 74 6f 0a 2a 2a  ollapsed into.**
15b80 20 61 20 73 69 6e 67 6c 65 20 65 78 63 6c 75 73   a single exclus
15b90 69 76 65 20 6c 6f 63 6b 2e 20 20 49 6e 20 6f 74  ive lock.  In ot
15ba0 68 65 72 20 77 6f 72 64 73 2c 20 53 48 41 52 45  her words, SHARE
15bb0 44 2c 20 52 45 53 45 52 56 45 44 2c 20 61 6e 64  D, RESERVED, and
15bc0 0a 2a 2a 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b  .** PENDING lock
15bd0 73 20 61 72 65 20 74 68 65 20 73 61 6d 65 20 74  s are the same t
15be0 68 69 6e 67 20 61 73 20 61 6e 20 45 58 43 4c 55  hing as an EXCLU
15bf0 53 49 56 45 20 6c 6f 63 6b 2e 20 20 53 51 4c 69  SIVE lock.  SQLi
15c00 74 65 0a 2a 2a 20 73 74 69 6c 6c 20 77 6f 72 6b  te.** still work
15c10 73 20 77 68 65 6e 20 79 6f 75 20 64 6f 20 74 68  s when you do th
15c20 69 73 2c 20 62 75 74 20 63 6f 6e 63 75 72 72 65  is, but concurre
15c30 6e 63 79 20 69 73 20 72 65 64 75 63 65 64 20 73  ncy is reduced s
15c40 69 6e 63 65 0a 2a 2a 20 6f 6e 6c 79 20 61 20 73  ince.** only a s
15c50 69 6e 67 6c 65 20 70 72 6f 63 65 73 73 20 63 61  ingle process ca
15c60 6e 20 62 65 20 72 65 61 64 69 6e 67 20 74 68 65  n be reading the
15c70 20 64 61 74 61 62 61 73 65 20 61 74 20 61 20 74   database at a t
15c80 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 4f 6d 69 74 20  ime..**.** Omit 
15c90 74 68 69 73 20 73 65 63 74 69 6f 6e 20 69 66 20  this section if 
15ca0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
15cb0 43 4b 49 4e 47 5f 53 54 59 4c 45 20 69 73 20 74  CKING_STYLE is t
15cc0 75 72 6e 65 64 20 6f 66 66 0a 2a 2f 0a 23 69 66  urned off.*/.#if
15cd0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
15ce0 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 0a 2f 2a  OCKING_STYLE../*
15cf0 0a 2a 2a 20 52 65 74 72 79 20 66 6c 6f 63 6b 28  .** Retry flock(
15d00 29 20 63 61 6c 6c 73 20 74 68 61 74 20 66 61 69  ) calls that fai
15d10 6c 20 77 69 74 68 20 45 49 4e 54 52 0a 2a 2f 0a  l with EINTR.*/.
15d20 23 69 66 64 65 66 20 45 49 4e 54 52 0a 73 74 61  #ifdef EINTR.sta
15d30 74 69 63 20 69 6e 74 20 72 6f 62 75 73 74 5f 66  tic int robust_f
15d40 6c 6f 63 6b 28 69 6e 74 20 66 64 2c 20 69 6e 74  lock(int fd, int
15d50 20 6f 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a   op){.  int rc;.
15d60 20 20 64 6f 7b 20 72 63 20 3d 20 66 6c 6f 63 6b    do{ rc = flock
15d70 28 66 64 2c 6f 70 29 3b 20 7d 77 68 69 6c 65 28  (fd,op); }while(
15d80 20 72 63 3c 30 20 26 26 20 65 72 72 6e 6f 3d 3d   rc<0 && errno==
15d90 45 49 4e 54 52 20 29 3b 0a 20 20 72 65 74 75 72  EINTR );.  retur
15da0 6e 20 72 63 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20  n rc;.}.#else.# 
15db0 64 65 66 69 6e 65 20 72 6f 62 75 73 74 5f 66 6c  define robust_fl
15dc0 6f 63 6b 28 61 2c 62 29 20 66 6c 6f 63 6b 28 61  ock(a,b) flock(a
15dd0 2c 62 29 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  ,b).#endif.     
15de0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
15df0 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74  tine checks if t
15e00 68 65 72 65 20 69 73 20 61 20 52 45 53 45 52 56  here is a RESERV
15e10 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20  ED lock held on 
15e20 74 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a  the specified.**
15e30 20 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72   file by this or
15e40 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65   any other proce
15e50 73 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f  ss. If such a lo
15e60 63 6b 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20  ck is held, set 
15e70 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61  *pResOut.** to a
15e80 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20   non-zero value 
15e90 6f 74 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f  otherwise *pResO
15ea0 75 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72  ut is set to zer
15eb0 6f 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 76  o.  The return v
15ec0 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74  alue.** is set t
15ed0 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65  o SQLITE_OK unle
15ee0 73 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20  ss an I/O error 
15ef0 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f  occurs during lo
15f00 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a  ck checking..*/.
15f10 73 74 61 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b  static int flock
15f20 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
15f30 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
15f40 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74  id, int *pResOut
15f50 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
15f60 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72  LITE_OK;.  int r
15f70 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 75  eserved = 0;.  u
15f80 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
15f90 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
15fa0 20 20 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45    .  SimulateIOE
15fb0 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c  rror( return SQL
15fc0 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52  ITE_IOERR_CHECKR
15fd0 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a  ESERVEDLOCK; );.
15fe0 20 20 0a 20 20 61 73 73 65 72 74 28 20 70 46 69    .  assert( pFi
15ff0 6c 65 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 43 68  le );.  .  /* Ch
16000 65 63 6b 20 69 66 20 61 20 74 68 72 65 61 64 20  eck if a thread 
16010 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 20  in this process 
16020 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c 6f 63  holds such a loc
16030 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65  k */.  if( pFile
16040 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52  ->eFileLock>SHAR
16050 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72  ED_LOCK ){.    r
16060 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d  eserved = 1;.  }
16070 0a 20 20 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69  .  .  /* Otherwi
16080 73 65 20 73 65 65 20 69 66 20 73 6f 6d 65 20 6f  se see if some o
16090 74 68 65 72 20 70 72 6f 63 65 73 73 20 68 6f 6c  ther process hol
160a0 64 73 20 69 74 2e 20 2a 2f 0a 20 20 69 66 28 20  ds it. */.  if( 
160b0 21 72 65 73 65 72 76 65 64 20 29 7b 0a 20 20 20  !reserved ){.   
160c0 20 2f 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 67   /* attempt to g
160d0 65 74 20 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a 20  et the lock */. 
160e0 20 20 20 69 6e 74 20 6c 72 63 20 3d 20 72 6f 62     int lrc = rob
160f0 75 73 74 5f 66 6c 6f 63 6b 28 70 46 69 6c 65 2d  ust_flock(pFile-
16100 3e 68 2c 20 4c 4f 43 4b 5f 45 58 20 7c 20 4c 4f  >h, LOCK_EX | LO
16110 43 4b 5f 4e 42 29 3b 0a 20 20 20 20 69 66 28 20  CK_NB);.    if( 
16120 21 6c 72 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a  !lrc ){.      /*
16130 20 67 6f 74 20 74 68 65 20 6c 6f 63 6b 2c 20 75   got the lock, u
16140 6e 6c 6f 63 6b 20 69 74 20 2a 2f 0a 20 20 20 20  nlock it */.    
16150 20 20 6c 72 63 20 3d 20 72 6f 62 75 73 74 5f 66    lrc = robust_f
16160 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c  lock(pFile->h, L
16170 4f 43 4b 5f 55 4e 29 3b 0a 20 20 20 20 20 20 69  OCK_UN);.      i
16180 66 20 28 20 6c 72 63 20 29 20 7b 0a 20 20 20 20  f ( lrc ) {.    
16190 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d      int tErrno =
161a0 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20   errno;.        
161b0 2f 2a 20 75 6e 6c 6f 63 6b 20 66 61 69 6c 65 64  /* unlock failed
161c0 20 77 69 74 68 20 61 6e 20 65 72 72 6f 72 20 2a   with an error *
161d0 2f 0a 23 69 66 20 4f 53 4c 4f 43 4b 49 4e 47 5f  /.#if OSLOCKING_
161e0 43 48 45 43 4b 5f 42 55 53 59 5f 49 4f 45 52 52  CHECK_BUSY_IOERR
161f0 0a 20 20 20 20 20 20 20 20 6c 72 63 20 3d 20 73  .        lrc = s
16200 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
16210 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c  sixError(tErrno,
16220 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e   SQLITE_IOERR_UN
16230 4c 4f 43 4b 29 3b 0a 23 65 6c 73 65 20 0a 20 20  LOCK);.#else .  
16240 20 20 20 20 20 20 6c 72 63 20 3d 20 53 51 4c 49        lrc = SQLI
16250 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b  TE_IOERR_UNLOCK;
16260 20 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20   .#endif.       
16270 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52   if( IS_LOCK_ERR
16280 4f 52 28 6c 72 63 29 20 29 7b 0a 20 20 20 20 20  OR(lrc) ){.     
16290 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72       storeLastEr
162a0 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45 72 72 6e  rno(pFile, tErrn
162b0 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  o);.          rc
162c0 20 3d 20 6c 72 63 3b 0a 20 20 20 20 20 20 20 20   = lrc;.        
162d0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20  }.      }.    } 
162e0 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 69 6e 74  else {.      int
162f0 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
16300 0a 20 20 20 20 20 20 72 65 73 65 72 76 65 64 20  .      reserved 
16310 3d 20 31 3b 0a 20 20 20 20 20 20 2f 2a 20 73 6f  = 1;.      /* so
16320 6d 65 6f 6e 65 20 65 6c 73 65 20 6d 69 67 68 74  meone else might
16330 20 68 61 76 65 20 69 74 20 72 65 73 65 72 76 65   have it reserve
16340 64 20 2a 2f 0a 20 20 20 20 20 20 6c 72 63 20 3d  d */.      lrc =
16350 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d   sqliteErrorFrom
16360 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e  PosixError(tErrn
16370 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  o, SQLITE_IOERR_
16380 4c 4f 43 4b 29 3b 20 0a 20 20 20 20 20 20 69 66  LOCK); .      if
16390 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28  ( IS_LOCK_ERROR(
163a0 6c 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20  lrc) ){.        
163b0 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70  storeLastErrno(p
163c0 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20  File, tErrno);. 
163d0 20 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63 3b         rc = lrc;
163e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
163f0 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54   }.  OSTRACE(("T
16400 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25  EST WR-LOCK %d %
16410 64 20 25 64 20 28 66 6c 6f 63 6b 29 5c 6e 22 2c  d %d (flock)\n",
16420 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72   pFile->h, rc, r
16430 65 73 65 72 76 65 64 29 29 3b 0a 0a 23 69 66 64  eserved));..#ifd
16440 65 66 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45  ef SQLITE_IGNORE
16450 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f  _FLOCK_LOCK_ERRO
16460 52 53 0a 20 20 69 66 28 20 28 72 63 20 26 20 53  RS.  if( (rc & S
16470 51 4c 49 54 45 5f 49 4f 45 52 52 29 20 3d 3d 20  QLITE_IOERR) == 
16480 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a  SQLITE_IOERR ){.
16490 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
164a0 4f 4b 3b 0a 20 20 20 20 72 65 73 65 72 76 65 64  OK;.    reserved
164b0 3d 31 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f  =1;.  }.#endif /
164c0 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f  * SQLITE_IGNORE_
164d0 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52  FLOCK_LOCK_ERROR
164e0 53 20 2a 2f 0a 20 20 2a 70 52 65 73 4f 75 74 20  S */.  *pResOut 
164f0 3d 20 72 65 73 65 72 76 65 64 3b 0a 20 20 72 65  = reserved;.  re
16500 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
16510 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20  * Lock the file 
16520 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70  with the lock sp
16530 65 63 69 66 69 65 64 20 62 79 20 70 61 72 61 6d  ecified by param
16540 65 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d  eter eFileLock -
16550 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66   one.** of the f
16560 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20  ollowing:.**.** 
16570 20 20 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c      (1) SHARED_L
16580 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52  OCK.**     (2) R
16590 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20  ESERVED_LOCK.** 
165a0 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f      (3) PENDING_
165b0 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20  LOCK.**     (4) 
165c0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a  EXCLUSIVE_LOCK.*
165d0 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77  *.** Sometimes w
165e0 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f  hen requesting o
165f0 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61  ne lock state, a
16600 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73  dditional lock s
16610 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73  tates.** are ins
16620 65 72 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e  erted in between
16630 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d  .  The locking m
16640 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65  ight fail on one
16650 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a   of the later.**
16660 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61   transitions lea
16670 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74  ving the lock st
16680 61 74 65 20 64 69 66 66 65 72 65 6e 74 20 66 72  ate different fr
16690 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61 72 74  om what it start
166a0 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20  ed but.** still 
166b0 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61  short of its goa
166c0 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  l.  The followin
166d0 67 20 63 68 61 72 74 20 73 68 6f 77 73 20 74 68  g chart shows th
166e0 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61  e allowed.** tra
166f0 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65  nsitions and the
16700 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d   inserted interm
16710 65 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a  ediate states:.*
16720 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44  *.**    UNLOCKED
16730 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20   -> SHARED.**   
16740 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52   SHARED -> RESER
16750 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44  VED.**    SHARED
16760 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e   -> (PENDING) ->
16770 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20   EXCLUSIVE.**   
16780 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45   RESERVED -> (PE
16790 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53  NDING) -> EXCLUS
167a0 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e  IVE.**    PENDIN
167b0 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a  G -> EXCLUSIVE.*
167c0 2a 0a 2a 2a 20 66 6c 6f 63 6b 28 29 20 6f 6e 6c  *.** flock() onl
167d0 79 20 72 65 61 6c 6c 79 20 73 75 70 70 6f 72 74  y really support
167e0 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73   EXCLUSIVE locks
167f0 2e 20 20 57 65 20 74 72 61 63 6b 20 69 6e 74 65  .  We track inte
16800 72 6d 65 64 69 61 74 65 0a 2a 2a 20 6c 6f 63 6b  rmediate.** lock
16810 20 73 74 61 74 65 73 20 69 6e 20 74 68 65 20 73   states in the s
16820 71 6c 69 74 65 33 5f 66 69 6c 65 20 73 74 72 75  qlite3_file stru
16830 63 74 75 72 65 2c 20 62 75 74 20 61 6c 6c 20 6c  cture, but all l
16840 6f 63 6b 73 20 53 48 41 52 45 44 20 6f 72 0a 2a  ocks SHARED or.*
16850 2a 20 61 62 6f 76 65 20 61 72 65 20 72 65 61 6c  * above are real
16860 6c 79 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  ly EXCLUSIVE loc
16870 6b 73 20 61 6e 64 20 65 78 63 6c 75 64 65 20 61  ks and exclude a
16880 6c 6c 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  ll other process
16890 65 73 20 66 72 6f 6d 0a 2a 2a 20 61 63 63 65 73  es from.** acces
168a0 73 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  s the file..**.*
168b0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
168c0 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73  ill only increas
168d0 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74  e a lock.  Use t
168e0 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f  he sqlite3OsUnlo
168f0 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  ck().** routine 
16900 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69  to lower a locki
16910 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61  ng level..*/.sta
16920 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b 4c 6f 63  tic int flockLoc
16930 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
16940 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63  id, int eFileLoc
16950 6b 29 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  k) {.  int rc = 
16960 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69  SQLITE_OK;.  uni
16970 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
16980 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20  unixFile*)id;.. 
16990 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
169a0 3b 0a 0a 20 20 2f 2a 20 69 66 20 77 65 20 61 6c  ;..  /* if we al
169b0 72 65 61 64 79 20 68 61 76 65 20 61 20 6c 6f 63  ready have a loc
169c0 6b 2c 20 69 74 20 69 73 20 65 78 63 6c 75 73 69  k, it is exclusi
169d0 76 65 2e 20 20 0a 20 20 2a 2a 20 4a 75 73 74 20  ve.  .  ** Just 
169e0 61 64 6a 75 73 74 20 6c 65 76 65 6c 20 61 6e 64  adjust level and
169f0 20 70 75 6e 74 20 6f 6e 20 6f 75 74 74 61 20 68   punt on outta h
16a00 65 72 65 2e 20 2a 2f 0a 20 20 69 66 20 28 70 46  ere. */.  if (pF
16a10 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3e  ile->eFileLock >
16a20 20 4e 4f 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20   NO_LOCK) {.    
16a30 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
16a40 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20   = eFileLock;.  
16a50 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
16a60 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20  OK;.  }.  .  /* 
16a70 67 72 61 62 20 61 6e 20 65 78 63 6c 75 73 69 76  grab an exclusiv
16a80 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20 0a 20 20 69  e lock */.  .  i
16a90 66 20 28 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28  f (robust_flock(
16aa0 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 45  pFile->h, LOCK_E
16ab0 58 20 7c 20 4c 4f 43 4b 5f 4e 42 29 29 20 7b 0a  X | LOCK_NB)) {.
16ac0 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d      int tErrno =
16ad0 20 65 72 72 6e 6f 3b 0a 20 20 20 20 2f 2a 20 64   errno;.    /* d
16ae0 69 64 6e 27 74 20 67 65 74 2c 20 6d 75 73 74 20  idn't get, must 
16af0 62 65 20 62 75 73 79 20 2a 2f 0a 20 20 20 20 72  be busy */.    r
16b00 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46  c = sqliteErrorF
16b10 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45  romPosixError(tE
16b20 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45  rrno, SQLITE_IOE
16b30 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66  RR_LOCK);.    if
16b40 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28  ( IS_LOCK_ERROR(
16b50 72 63 29 20 29 7b 0a 20 20 20 20 20 20 73 74 6f  rc) ){.      sto
16b60 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c  reLastErrno(pFil
16b70 65 2c 20 74 45 72 72 6e 6f 29 3b 0a 20 20 20 20  e, tErrno);.    
16b80 7d 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20  }.  } else {.   
16b90 20 2f 2a 20 67 6f 74 20 69 74 2c 20 73 65 74 20   /* got it, set 
16ba0 74 68 65 20 74 79 70 65 20 61 6e 64 20 72 65 74  the type and ret
16bb0 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20 20 20 70 46  urn ok */.    pF
16bc0 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
16bd0 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 7d 0a   eFileLock;.  }.
16be0 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b    OSTRACE(("LOCK
16bf0 20 20 20 20 25 64 20 25 73 20 25 73 20 28 66 6c      %d %s %s (fl
16c00 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e  ock)\n", pFile->
16c10 68 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46  h, azFileLock(eF
16c20 69 6c 65 4c 6f 63 6b 29 2c 20 0a 20 20 20 20 20  ileLock), .     
16c30 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45        rc==SQLITE
16c40 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61  _OK ? "ok" : "fa
16c50 69 6c 65 64 22 29 29 3b 0a 23 69 66 64 65 66 20  iled"));.#ifdef 
16c60 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c  SQLITE_IGNORE_FL
16c70 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a  OCK_LOCK_ERRORS.
16c80 20 20 69 66 28 20 28 72 63 20 26 20 53 51 4c 49    if( (rc & SQLI
16c90 54 45 5f 49 4f 45 52 52 29 20 3d 3d 20 53 51 4c  TE_IOERR) == SQL
16ca0 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20  ITE_IOERR ){.   
16cb0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
16cc0 59 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  Y;.  }.#endif /*
16cd0 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46   SQLITE_IGNORE_F
16ce0 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53  LOCK_LOCK_ERRORS
16cf0 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   */.  return rc;
16d00 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72  .}.../*.** Lower
16d10 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76   the locking lev
16d20 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72  el on file descr
16d30 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65  iptor pFile to e
16d40 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65  FileLock.  eFile
16d50 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20  Lock.** must be 
16d60 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f  either NO_LOCK o
16d70 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a  r SHARED_LOCK..*
16d80 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b  *.** If the lock
16d90 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65  ing level of the
16da0 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
16db0 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f   is already at o
16dc0 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72  r below.** the r
16dd0 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67  equested locking
16de0 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75   level, this rou
16df0 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
16e00 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
16e10 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 73 71 6c 69 74  lockUnlock(sqlit
16e20 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
16e30 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20   eFileLock) {.  
16e40 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
16e50 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
16e60 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 70 46  .  .  assert( pF
16e70 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45  ile );.  OSTRACE
16e80 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64  (("UNLOCK  %d %d
16e90 20 77 61 73 20 25 64 20 70 69 64 3d 25 64 20 28   was %d pid=%d (
16ea0 66 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65  flock)\n", pFile
16eb0 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a  ->h, eFileLock,.
16ec0 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65             pFile
16ed0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 6f 73 47  ->eFileLock, osG
16ee0 65 74 70 69 64 28 30 29 29 29 3b 0a 20 20 61 73  etpid(0)));.  as
16ef0 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 3c  sert( eFileLock<
16f00 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
16f10 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66    .  /* no-op if
16f20 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a 20 20 69   possible */.  i
16f30 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  f( pFile->eFileL
16f40 6f 63 6b 3d 3d 65 46 69 6c 65 4c 6f 63 6b 20 29  ock==eFileLock )
16f50 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
16f60 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20  ITE_OK;.  }.  . 
16f70 20 2f 2a 20 73 68 61 72 65 64 20 63 61 6e 20 6a   /* shared can j
16f80 75 73 74 20 62 65 20 73 65 74 20 62 65 63 61 75  ust be set becau
16f90 73 65 20 77 65 20 61 6c 77 61 79 73 20 68 61 76  se we always hav
16fa0 65 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 2a  e an exclusive *
16fb0 2f 0a 20 20 69 66 20 28 65 46 69 6c 65 4c 6f 63  /.  if (eFileLoc
16fc0 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 29 20  k==SHARED_LOCK) 
16fd0 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69  {.    pFile->eFi
16fe0 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f  leLock = eFileLo
16ff0 63 6b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ck;.    return S
17000 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
17010 0a 20 20 2f 2a 20 6e 6f 2c 20 72 65 61 6c 6c 79  .  /* no, really
17020 2c 20 75 6e 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 69  , unlock. */.  i
17030 66 28 20 72 6f 62 75 73 74 5f 66 6c 6f 63 6b 28  f( robust_flock(
17040 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43 4b 5f 55  pFile->h, LOCK_U
17050 4e 29 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  N) ){.#ifdef SQL
17060 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b  ITE_IGNORE_FLOCK
17070 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20 20 20  _LOCK_ERRORS.   
17080 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
17090 4b 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  K;.#endif /* SQL
170a0 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b  ITE_IGNORE_FLOCK
170b0 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a  _LOCK_ERRORS */.
170c0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
170d0 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3b 0a  E_IOERR_UNLOCK;.
170e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46 69    }else{.    pFi
170f0 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
17100 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 72 65 74  NO_LOCK;.    ret
17110 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
17120 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73   }.}../*.** Clos
17130 65 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  e a file..*/.sta
17140 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b 43 6c 6f  tic int flockClo
17150 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  se(sqlite3_file 
17160 2a 69 64 29 20 7b 0a 20 20 69 6e 74 20 72 63 20  *id) {.  int rc 
17170 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
17180 66 28 20 69 64 20 29 7b 0a 20 20 20 20 66 6c 6f  f( id ){.    flo
17190 63 6b 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f  ckUnlock(id, NO_
171a0 4c 4f 43 4b 29 3b 0a 20 20 20 20 72 63 20 3d 20  LOCK);.    rc = 
171b0 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64  closeUnixFile(id
171c0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
171d0 72 63 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a  rc;.}..#endif /*
171e0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
171f0 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20  OCKING_STYLE && 
17200 21 4f 53 5f 56 58 57 4f 52 4b 20 2a 2f 0a 0a 2f  !OS_VXWORK */../
17210 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17220 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 66  *** End of the f
17230 6c 6f 63 6b 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d  lock lock implem
17240 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a  entation *******
17250 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a  **************.*
17260 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17270 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17280 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17290 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
172a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a  *************/..
172b0 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
172c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
172d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
172e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
172f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
17300 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
17310 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 4e  ******** Begin N
17320 61 6d 65 64 20 53 65 6d 61 70 68 6f 72 65 20 4c  amed Semaphore L
17330 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ocking *********
17340 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
17350 2a 2a 0a 2a 2a 20 4e 61 6d 65 64 20 73 65 6d 61  **.** Named sema
17360 70 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 69 73  phore locking is
17370 20 6f 6e 6c 79 20 73 75 70 70 6f 72 74 65 64 20   only supported 
17380 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a 2a 2a 0a 2a  on VxWorks..**.*
17390 2a 20 53 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b  * Semaphore lock
173a0 69 6e 67 20 69 73 20 6c 69 6b 65 20 64 6f 74 2d  ing is like dot-
173b0 6c 6f 63 6b 20 61 6e 64 20 66 6c 6f 63 6b 20 69  lock and flock i
173c0 6e 20 74 68 61 74 20 69 74 20 72 65 61 6c 6c 79  n that it really
173d0 20 6f 6e 6c 79 0a 2a 2a 20 73 75 70 70 6f 72 74   only.** support
173e0 73 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  s EXCLUSIVE lock
173f0 69 6e 67 2e 20 20 4f 6e 6c 79 20 61 20 73 69 6e  ing.  Only a sin
17400 67 6c 65 20 70 72 6f 63 65 73 73 20 63 61 6e 20  gle process can 
17410 72 65 61 64 20 6f 72 20 77 72 69 74 65 0a 2a 2a  read or write.**
17420 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
17430 6c 65 20 61 74 20 61 20 74 69 6d 65 2e 20 20 54  le at a time.  T
17440 68 69 73 20 72 65 64 75 63 65 73 20 70 6f 74 65  his reduces pote
17450 6e 74 69 61 6c 20 63 6f 6e 63 75 72 72 65 6e 63  ntial concurrenc
17460 79 2c 20 62 75 74 0a 2a 2a 20 6d 61 6b 65 73 20  y, but.** makes 
17470 74 68 65 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65  the lock impleme
17480 6e 74 61 74 69 6f 6e 20 6d 75 63 68 20 65 61 73  ntation much eas
17490 69 65 72 2e 0a 2a 2f 0a 23 69 66 20 4f 53 5f 56  ier..*/.#if OS_V
174a0 58 57 4f 52 4b 53 0a 0a 2f 2a 0a 2a 2a 20 54 68  XWORKS../*.** Th
174b0 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b  is routine check
174c0 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20  s if there is a 
174d0 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68 65  RESERVED lock he
174e0 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69 66  ld on the specif
174f0 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74  ied.** file by t
17500 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72  his or any other
17510 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75 63   process. If suc
17520 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64  h a lock is held
17530 2c 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a  , set *pResOut.*
17540 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20  * to a non-zero 
17550 76 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65 20  value otherwise 
17560 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65 74 20  *pResOut is set 
17570 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72 65  to zero.  The re
17580 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73  turn value.** is
17590 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f   set to SQLITE_O
175a0 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20  K unless an I/O 
175b0 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72  error occurs dur
175c0 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e  ing lock checkin
175d0 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
175e0 20 73 65 6d 58 43 68 65 63 6b 52 65 73 65 72 76   semXCheckReserv
175f0 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  edLock(sqlite3_f
17600 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70 52  ile *id, int *pR
17610 65 73 4f 75 74 29 20 7b 0a 20 20 69 6e 74 20 72  esOut) {.  int r
17620 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
17630 20 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d 20   int reserved = 
17640 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  0;.  unixFile *p
17650 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
17660 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61 74  *)id;..  Simulat
17670 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e  eIOError( return
17680 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48   SQLITE_IOERR_CH
17690 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b  ECKRESERVEDLOCK;
176a0 20 29 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28   );.  .  assert(
176b0 20 70 46 69 6c 65 20 29 3b 0a 0a 20 20 2f 2a 20   pFile );..  /* 
176c0 43 68 65 63 6b 20 69 66 20 61 20 74 68 72 65 61  Check if a threa
176d0 64 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73  d in this proces
176e0 73 20 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c  s holds such a l
176f0 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69  ock */.  if( pFi
17700 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48  le->eFileLock>SH
17710 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
17720 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20   reserved = 1;. 
17730 20 7d 0a 20 20 0a 20 20 2f 2a 20 4f 74 68 65 72   }.  .  /* Other
17740 77 69 73 65 20 73 65 65 20 69 66 20 73 6f 6d 65  wise see if some
17750 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 68   other process h
17760 6f 6c 64 73 20 69 74 2e 20 2a 2f 0a 20 20 69 66  olds it. */.  if
17770 28 20 21 72 65 73 65 72 76 65 64 20 29 7b 0a 20  ( !reserved ){. 
17780 20 20 20 73 65 6d 5f 74 20 2a 70 53 65 6d 20 3d     sem_t *pSem =
17790 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e   pFile->pInode->
177a0 70 53 65 6d 3b 0a 0a 20 20 20 20 69 66 28 20 73  pSem;..    if( s
177b0 65 6d 5f 74 72 79 77 61 69 74 28 70 53 65 6d 29  em_trywait(pSem)
177c0 3d 3d 2d 31 20 29 7b 0a 20 20 20 20 20 20 69 6e  ==-1 ){.      in
177d0 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f  t tErrno = errno
177e0 3b 0a 20 20 20 20 20 20 69 66 28 20 45 41 47 41  ;.      if( EAGA
177f0 49 4e 20 21 3d 20 74 45 72 72 6e 6f 20 29 7b 0a  IN != tErrno ){.
17800 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
17810 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69  iteErrorFromPosi
17820 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53  xError(tErrno, S
17830 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43  QLITE_IOERR_CHEC
17840 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 29 3b 0a  KRESERVEDLOCK);.
17850 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73          storeLas
17860 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74 45  tErrno(pFile, tE
17870 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 20 65  rrno);.      } e
17880 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a  lse {.        /*
17890 20 73 6f 6d 65 6f 6e 65 20 65 6c 73 65 20 68 61   someone else ha
178a0 73 20 74 68 65 20 6c 6f 63 6b 20 77 68 65 6e 20  s the lock when 
178b0 77 65 20 61 72 65 20 69 6e 20 4e 4f 5f 4c 4f 43  we are in NO_LOC
178c0 4b 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 73  K */.        res
178d0 65 72 76 65 64 20 3d 20 28 70 46 69 6c 65 2d 3e  erved = (pFile->
178e0 65 46 69 6c 65 4c 6f 63 6b 20 3c 20 53 48 41 52  eFileLock < SHAR
178f0 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  ED_LOCK);.      
17900 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
17910 20 20 20 2f 2a 20 77 65 20 63 6f 75 6c 64 20 68     /* we could h
17920 61 76 65 20 69 74 20 69 66 20 77 65 20 77 61 6e  ave it if we wan
17930 74 20 69 74 20 2a 2f 0a 20 20 20 20 20 20 73 65  t it */.      se
17940 6d 5f 70 6f 73 74 28 70 53 65 6d 29 3b 0a 20 20  m_post(pSem);.  
17950 20 20 7d 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43    }.  }.  OSTRAC
17960 45 28 28 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b  E(("TEST WR-LOCK
17970 20 25 64 20 25 64 20 25 64 20 28 73 65 6d 29 5c   %d %d %d (sem)\
17980 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63  n", pFile->h, rc
17990 2c 20 72 65 73 65 72 76 65 64 29 29 3b 0a 0a 20  , reserved));.. 
179a0 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65   *pResOut = rese
179b0 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72  rved;.  return r
179c0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b  c;.}../*.** Lock
179d0 20 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74   the file with t
179e0 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65  he lock specifie
179f0 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 65  d by parameter e
17a00 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a  FileLock - one.*
17a10 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  * of the followi
17a20 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31  ng:.**.**     (1
17a30 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a  ) SHARED_LOCK.**
17a40 20 20 20 20 20 28 32 29 20 52 45 53 45 52 56 45       (2) RESERVE
17a50 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33  D_LOCK.**     (3
17a60 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a  ) PENDING_LOCK.*
17a70 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c 55 53  *     (4) EXCLUS
17a80 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53  IVE_LOCK.**.** S
17a90 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65  ometimes when re
17aa0 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63  questing one loc
17ab0 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f  k state, additio
17ac0 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a  nal lock states.
17ad0 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64 20  ** are inserted 
17ae0 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65  in between.  The
17af0 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66   locking might f
17b00 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68  ail on one of th
17b10 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73  e later.** trans
17b20 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74  itions leaving t
17b30 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69  he lock state di
17b40 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61  fferent from wha
17b50 74 20 69 74 20 73 74 61 72 74 65 64 20 62 75 74  t it started but
17b60 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20  .** still short 
17b70 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68  of its goal.  Th
17b80 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72  e following char
17b90 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f  t shows the allo
17ba0 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f  wed.** transitio
17bb0 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72  ns and the inser
17bc0 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65  ted intermediate
17bd0 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20   states:.**.**  
17be0 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48    UNLOCKED -> SH
17bf0 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45  ARED.**    SHARE
17c00 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a  D -> RESERVED.**
17c10 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50      SHARED -> (P
17c20 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55  ENDING) -> EXCLU
17c30 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52  SIVE.**    RESER
17c40 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  VED -> (PENDING)
17c50 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
17c60 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45      PENDING -> E
17c70 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 53  XCLUSIVE.**.** S
17c80 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 73 20 6f  emaphore locks o
17c90 6e 6c 79 20 72 65 61 6c 6c 79 20 73 75 70 70 6f  nly really suppo
17ca0 72 74 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  rt EXCLUSIVE loc
17cb0 6b 73 2e 20 20 57 65 20 74 72 61 63 6b 20 69 6e  ks.  We track in
17cc0 74 65 72 6d 65 64 69 61 74 65 0a 2a 2a 20 6c 6f  termediate.** lo
17cd0 63 6b 20 73 74 61 74 65 73 20 69 6e 20 74 68 65  ck states in the
17ce0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 73 74   sqlite3_file st
17cf0 72 75 63 74 75 72 65 2c 20 62 75 74 20 61 6c 6c  ructure, but all
17d00 20 6c 6f 63 6b 73 20 53 48 41 52 45 44 20 6f 72   locks SHARED or
17d10 0a 2a 2a 20 61 62 6f 76 65 20 61 72 65 20 72 65  .** above are re
17d20 61 6c 6c 79 20 45 58 43 4c 55 53 49 56 45 20 6c  ally EXCLUSIVE l
17d30 6f 63 6b 73 20 61 6e 64 20 65 78 63 6c 75 64 65  ocks and exclude
17d40 20 61 6c 6c 20 6f 74 68 65 72 20 70 72 6f 63 65   all other proce
17d50 73 73 65 73 20 66 72 6f 6d 0a 2a 2a 20 61 63 63  sses from.** acc
17d60 65 73 73 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a  ess the file..**
17d70 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
17d80 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65   will only incre
17d90 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65  ase a lock.  Use
17da0 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e   the sqlite3OsUn
17db0 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e  lock().** routin
17dc0 65 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63  e to lower a loc
17dd0 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73  king level..*/.s
17de0 74 61 74 69 63 20 69 6e 74 20 73 65 6d 58 4c 6f  tatic int semXLo
17df0 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
17e00 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f  *id, int eFileLo
17e10 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65  ck) {.  unixFile
17e20 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
17e30 69 6c 65 2a 29 69 64 3b 0a 20 20 73 65 6d 5f 74  ile*)id;.  sem_t
17e40 20 2a 70 53 65 6d 20 3d 20 70 46 69 6c 65 2d 3e   *pSem = pFile->
17e50 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 3b 0a 20 20  pInode->pSem;.  
17e60 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
17e70 4f 4b 3b 0a 0a 20 20 2f 2a 20 69 66 20 77 65 20  OK;..  /* if we 
17e80 61 6c 72 65 61 64 79 20 68 61 76 65 20 61 20 6c  already have a l
17e90 6f 63 6b 2c 20 69 74 20 69 73 20 65 78 63 6c 75  ock, it is exclu
17ea0 73 69 76 65 2e 20 20 0a 20 20 2a 2a 20 4a 75 73  sive.  .  ** Jus
17eb0 74 20 61 64 6a 75 73 74 20 6c 65 76 65 6c 20 61  t adjust level a
17ec0 6e 64 20 70 75 6e 74 20 6f 6e 20 6f 75 74 74 61  nd punt on outta
17ed0 20 68 65 72 65 2e 20 2a 2f 0a 20 20 69 66 20 28   here. */.  if (
17ee0 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
17ef0 20 3e 20 4e 4f 5f 4c 4f 43 4b 29 20 7b 0a 20 20   > NO_LOCK) {.  
17f00 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
17f10 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a  ck = eFileLock;.
17f20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
17f30 4f 4b 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6d  OK;.    goto sem
17f40 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 20  _end_lock;.  }. 
17f50 20 0a 20 20 2f 2a 20 6c 6f 63 6b 20 73 65 6d 61   .  /* lock sema
17f60 70 68 6f 72 65 20 6e 6f 77 20 62 75 74 20 62 61  phore now but ba
17f70 69 6c 20 6f 75 74 20 77 68 65 6e 20 61 6c 72 65  il out when alre
17f80 61 64 79 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a 20  ady locked. */. 
17f90 20 69 66 28 20 73 65 6d 5f 74 72 79 77 61 69 74   if( sem_trywait
17fa0 28 70 53 65 6d 29 3d 3d 2d 31 20 29 7b 0a 20 20  (pSem)==-1 ){.  
17fb0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
17fc0 53 59 3b 0a 20 20 20 20 67 6f 74 6f 20 73 65 6d  SY;.    goto sem
17fd0 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a  _end_lock;.  }..
17fe0 20 20 2f 2a 20 67 6f 74 20 69 74 2c 20 73 65 74    /* got it, set
17ff0 20 74 68 65 20 74 79 70 65 20 61 6e 64 20 72 65   the type and re
18000 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20 20 70 46 69  turn ok */.  pFi
18010 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
18020 65 46 69 6c 65 4c 6f 63 6b 3b 0a 0a 20 73 65 6d  eFileLock;.. sem
18030 5f 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20 72 65 74  _end_lock:.  ret
18040 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
18050 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69   Lower the locki
18060 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65  ng level on file
18070 20 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c   descriptor pFil
18080 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20  e to eFileLock. 
18090 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75   eFileLock.** mu
180a0 73 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f  st be either NO_
180b0 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c  LOCK or SHARED_L
180c0 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  OCK..**.** If th
180d0 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20  e locking level 
180e0 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  of the file desc
180f0 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64  riptor is alread
18100 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a  y at or below.**
18110 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c   the requested l
18120 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68  ocking level, th
18130 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
18140 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
18150 20 69 6e 74 20 73 65 6d 58 55 6e 6c 6f 63 6b 28   int semXUnlock(
18160 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
18170 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29  , int eFileLock)
18180 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70   {.  unixFile *p
18190 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
181a0 2a 29 69 64 3b 0a 20 20 73 65 6d 5f 74 20 2a 70  *)id;.  sem_t *p
181b0 53 65 6d 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e  Sem = pFile->pIn
181c0 6f 64 65 2d 3e 70 53 65 6d 3b 0a 0a 20 20 61 73  ode->pSem;..  as
181d0 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20  sert( pFile );. 
181e0 20 61 73 73 65 72 74 28 20 70 53 65 6d 20 29 3b   assert( pSem );
181f0 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e 4c  .  OSTRACE(("UNL
18200 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73 20 25  OCK  %d %d was %
18210 64 20 70 69 64 3d 25 64 20 28 73 65 6d 29 5c 6e  d pid=%d (sem)\n
18220 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 65 46 69  ", pFile->h, eFi
18230 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20 20 20 20 20  leLock,.        
18240 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
18250 6f 63 6b 2c 20 6f 73 47 65 74 70 69 64 28 30 29  ock, osGetpid(0)
18260 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46  ));.  assert( eF
18270 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f  ileLock<=SHARED_
18280 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a 20  LOCK );.  .  /* 
18290 6e 6f 2d 6f 70 20 69 66 20 70 6f 73 73 69 62 6c  no-op if possibl
182a0 65 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65  e */.  if( pFile
182b0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 65 46 69  ->eFileLock==eFi
182c0 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65  leLock ){.    re
182d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
182e0 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 73 68 61 72    }.  .  /* shar
182f0 65 64 20 63 61 6e 20 6a 75 73 74 20 62 65 20 73  ed can just be s
18300 65 74 20 62 65 63 61 75 73 65 20 77 65 20 61 6c  et because we al
18310 77 61 79 73 20 68 61 76 65 20 61 6e 20 65 78 63  ways have an exc
18320 6c 75 73 69 76 65 20 2a 2f 0a 20 20 69 66 20 28  lusive */.  if (
18330 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
18340 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 70 46  D_LOCK) {.    pF
18350 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
18360 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20   eFileLock;.    
18370 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
18380 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 6e 6f  ;.  }.  .  /* no
18390 2c 20 72 65 61 6c 6c 79 20 75 6e 6c 6f 63 6b 2e  , really unlock.
183a0 20 2a 2f 0a 20 20 69 66 20 28 20 73 65 6d 5f 70   */.  if ( sem_p
183b0 6f 73 74 28 70 53 65 6d 29 3d 3d 2d 31 20 29 20  ost(pSem)==-1 ) 
183c0 7b 0a 20 20 20 20 69 6e 74 20 72 63 2c 20 74 45  {.    int rc, tE
183d0 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
183e0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72    rc = sqliteErr
183f0 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72  orFromPosixError
18400 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f  (tErrno, SQLITE_
18410 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 20  IOERR_UNLOCK);. 
18420 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
18430 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20  RROR(rc) ){.    
18440 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f    storeLastErrno
18450 28 70 46 69 6c 65 2c 20 74 45 72 72 6e 6f 29 3b  (pFile, tErrno);
18460 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
18470 6e 20 72 63 3b 20 0a 20 20 7d 0a 20 20 70 46 69  n rc; .  }.  pFi
18480 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
18490 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 72 65 74 75 72  NO_LOCK;.  retur
184a0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
184b0 2f 2a 0a 20 2a 2a 20 43 6c 6f 73 65 20 61 20 66  /*. ** Close a f
184c0 69 6c 65 2e 0a 20 2a 2f 0a 73 74 61 74 69 63 20  ile.. */.static 
184d0 69 6e 74 20 73 65 6d 58 43 6c 6f 73 65 28 73 71  int semXClose(sq
184e0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20  lite3_file *id) 
184f0 7b 0a 20 20 69 66 28 20 69 64 20 29 7b 0a 20 20  {.  if( id ){.  
18500 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c    unixFile *pFil
18510 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69  e = (unixFile*)i
18520 64 3b 0a 20 20 20 20 73 65 6d 58 55 6e 6c 6f 63  d;.    semXUnloc
18530 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a  k(id, NO_LOCK);.
18540 20 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c      assert( pFil
18550 65 20 29 3b 0a 20 20 20 20 75 6e 69 78 45 6e 74  e );.    unixEnt
18560 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 72  erMutex();.    r
18570 65 6c 65 61 73 65 49 6e 6f 64 65 49 6e 66 6f 28  eleaseInodeInfo(
18580 70 46 69 6c 65 29 3b 0a 20 20 20 20 75 6e 69 78  pFile);.    unix
18590 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
185a0 20 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28    closeUnixFile(
185b0 69 64 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  id);.  }.  retur
185c0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
185d0 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57  #endif /* OS_VXW
185e0 4f 52 4b 53 20 2a 2f 0a 2f 2a 0a 2a 2a 20 4e 61  ORKS */./*.** Na
185f0 6d 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f  med semaphore lo
18600 63 6b 69 6e 67 20 69 73 20 6f 6e 6c 79 20 61 76  cking is only av
18610 61 69 6c 61 62 6c 65 20 6f 6e 20 56 78 57 6f 72  ailable on VxWor
18620 6b 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ks..**.*********
18630 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68  ****** End of th
18640 65 20 6e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72  e named semaphor
18650 65 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74  e lock implement
18660 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ation **********
18670 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
18680 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18690 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
186a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
186b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
186c0 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a  *****/.../******
186d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
186e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
186f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18700 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18710 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
18720 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18730 2a 2a 2a 2a 20 42 65 67 69 6e 20 41 46 50 20 4c  **** Begin AFP L
18740 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ocking *********
18750 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
18760 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 41  ********.**.** A
18770 46 50 20 69 73 20 74 68 65 20 41 70 70 6c 65 20  FP is the Apple 
18780 46 69 6c 69 6e 67 20 50 72 6f 74 6f 63 6f 6c 2e  Filing Protocol.
18790 20 20 41 46 50 20 69 73 20 61 20 6e 65 74 77 6f    AFP is a netwo
187a0 72 6b 20 66 69 6c 65 73 79 73 74 65 6d 20 66 6f  rk filesystem fo
187b0 75 6e 64 0a 2a 2a 20 6f 6e 20 41 70 70 6c 65 20  und.** on Apple 
187c0 4d 61 63 69 6e 74 6f 73 68 20 63 6f 6d 70 75 74  Macintosh comput
187d0 65 72 73 20 2d 20 62 6f 74 68 20 4f 53 39 20 61  ers - both OS9 a
187e0 6e 64 20 4f 53 58 2e 0a 2a 2a 0a 2a 2a 20 54 68  nd OSX..**.** Th
187f0 69 72 64 2d 70 61 72 74 79 20 69 6d 70 6c 65 6d  ird-party implem
18800 65 6e 74 61 74 69 6f 6e 73 20 6f 66 20 41 46 50  entations of AFP
18810 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 2e 20   are available. 
18820 20 42 75 74 20 74 68 69 73 20 63 6f 64 65 20 68   But this code h
18830 65 72 65 0a 2a 2a 20 6f 6e 6c 79 20 77 6f 72 6b  ere.** only work
18840 73 20 6f 6e 20 4f 53 58 2e 0a 2a 2f 0a 0a 23 69  s on OSX..*/..#i
18850 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
18860 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45  E__) && SQLITE_E
18870 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
18880 59 4c 45 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 66  YLE./*.** The af
18890 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  pLockingContext 
188a0 73 74 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69  structure contai
188b0 6e 73 20 61 6c 6c 20 61 66 70 20 6c 6f 63 6b 20  ns all afp lock 
188c0 73 70 65 63 69 66 69 63 20 73 74 61 74 65 0a 2a  specific state.*
188d0 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
188e0 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65   afpLockingConte
188f0 78 74 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e  xt afpLockingCon
18900 74 65 78 74 3b 0a 73 74 72 75 63 74 20 61 66 70  text;.struct afp
18910 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 7b  LockingContext {
18920 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65 64 3b  .  int reserved;
18930 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 64  .  const char *d
18940 62 50 61 74 68 3b 20 20 20 20 20 20 20 20 20 20  bPath;          
18950 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
18960 65 20 6f 70 65 6e 20 66 69 6c 65 20 2a 2f 0a 7d  e open file */.}
18970 3b 0a 0a 73 74 72 75 63 74 20 42 79 74 65 52 61  ;..struct ByteRa
18980 6e 67 65 4c 6f 63 6b 50 42 32 0a 7b 0a 20 20 75  ngeLockPB2.{.  u
18990 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e  nsigned long lon
189a0 67 20 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20  g offset;       
189b0 20 2f 2a 20 6f 66 66 73 65 74 20 74 6f 20 66 69   /* offset to fi
189c0 72 73 74 20 62 79 74 65 20 74 6f 20 6c 6f 63 6b  rst byte to lock
189d0 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c   */.  unsigned l
189e0 6f 6e 67 20 6c 6f 6e 67 20 6c 65 6e 67 74 68 3b  ong long length;
189f0 20 20 20 20 20 20 20 20 2f 2a 20 6e 62 72 20 6f          /* nbr o
18a00 66 20 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20  f bytes to lock 
18a10 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f  */.  unsigned lo
18a20 6e 67 20 6c 6f 6e 67 20 72 65 74 52 61 6e 67 65  ng long retRange
18a30 53 74 61 72 74 3b 20 2f 2a 20 6e 62 72 20 6f 66  Start; /* nbr of
18a40 20 31 73 74 20 62 79 74 65 20 6c 6f 63 6b 65 64   1st byte locked
18a50 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 20 2a   if successful *
18a60 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
18a70 72 20 75 6e 4c 6f 63 6b 46 6c 61 67 3b 20 20 20  r unLockFlag;   
18a80 20 20 20 20 20 20 2f 2a 20 31 20 3d 20 75 6e 6c        /* 1 = unl
18a90 6f 63 6b 2c 20 30 20 3d 20 6c 6f 63 6b 20 2a 2f  ock, 0 = lock */
18aa0 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
18ab0 20 73 74 61 72 74 45 6e 64 46 6c 61 67 3b 20 20   startEndFlag;  
18ac0 20 20 20 20 20 2f 2a 20 31 3d 72 65 6c 20 74 6f       /* 1=rel to
18ad0 20 65 6e 64 20 6f 66 20 66 6f 72 6b 2c 20 30 3d   end of fork, 0=
18ae0 72 65 6c 20 74 6f 20 73 74 61 72 74 20 2a 2f 0a  rel to start */.
18af0 20 20 69 6e 74 20 66 64 3b 20 20 20 20 20 20 20    int fd;       
18b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18b10 20 20 20 20 2f 2a 20 66 69 6c 65 20 64 65 73 63      /* file desc
18b20 20 74 6f 20 61 73 73 6f 63 20 74 68 69 73 20 6c   to assoc this l
18b30 6f 63 6b 20 77 69 74 68 20 2a 2f 0a 7d 3b 0a 0a  ock with */.};..
18b40 23 64 65 66 69 6e 65 20 61 66 70 66 73 42 79 74  #define afpfsByt
18b50 65 52 61 6e 67 65 4c 6f 63 6b 32 46 53 43 54 4c  eRangeLock2FSCTL
18b60 20 20 20 20 20 20 20 20 5f 49 4f 57 52 28 27 7a          _IOWR('z
18b70 27 2c 20 32 33 2c 20 73 74 72 75 63 74 20 42 79  ', 23, struct By
18b80 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32 29 0a  teRangeLockPB2).
18b90 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  ./*.** This is a
18ba0 20 75 74 69 6c 69 74 79 20 66 6f 72 20 73 65 74   utility for set
18bb0 74 69 6e 67 20 6f 72 20 63 6c 65 61 72 69 6e 67  ting or clearing
18bc0 20 61 20 62 69 74 2d 72 61 6e 67 65 20 6c 6f 63   a bit-range loc
18bd0 6b 20 6f 6e 20 61 6e 0a 2a 2a 20 41 46 50 20 66  k on an.** AFP f
18be0 69 6c 65 73 79 73 74 65 6d 2e 0a 2a 2a 20 0a 2a  ilesystem..** .*
18bf0 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
18c00 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 53  OK on success, S
18c10 51 4c 49 54 45 5f 42 55 53 59 20 6f 6e 20 66 61  QLITE_BUSY on fa
18c20 69 6c 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  ilure..*/.static
18c30 20 69 6e 74 20 61 66 70 53 65 74 4c 6f 63 6b 28   int afpSetLock(
18c40 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70  .  const char *p
18c50 61 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 20  ath,            
18c60 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
18c70 20 66 69 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b   file to be lock
18c80 65 64 20 6f 72 20 75 6e 6c 6f 63 6b 65 64 20 2a  ed or unlocked *
18c90 2f 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  /.  unixFile *pF
18ca0 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ile,            
18cb0 20 20 20 2f 2a 20 4f 70 65 6e 20 66 69 6c 65 20     /* Open file 
18cc0 64 65 73 63 72 69 70 74 6f 72 20 6f 6e 20 70 61  descriptor on pa
18cd0 74 68 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  th */.  unsigned
18ce0 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6f 66 66 73 65   long long offse
18cf0 74 2c 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20  t,     /* First 
18d00 62 79 74 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65  byte to be locke
18d10 64 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  d */.  unsigned 
18d20 6c 6f 6e 67 20 6c 6f 6e 67 20 6c 65 6e 67 74 68  long long length
18d30 2c 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  ,     /* Number 
18d40 6f 66 20 62 79 74 65 73 20 74 6f 20 6c 6f 63 6b  of bytes to lock
18d50 20 2a 2f 0a 20 20 69 6e 74 20 73 65 74 4c 6f 63   */.  int setLoc
18d60 6b 46 6c 61 67 20 20 20 20 20 20 20 20 20 20 20  kFlag           
18d70 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
18d80 73 65 74 20 6c 6f 63 6b 2e 20 20 46 61 6c 73 65  set lock.  False
18d90 20 74 6f 20 63 6c 65 61 72 20 6c 6f 63 6b 20 2a   to clear lock *
18da0 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 42 79  /.){.  struct By
18db0 74 65 52 61 6e 67 65 4c 6f 63 6b 50 42 32 20 70  teRangeLockPB2 p
18dc0 62 3b 0a 20 20 69 6e 74 20 65 72 72 3b 0a 20 20  b;.  int err;.  
18dd0 0a 20 20 70 62 2e 75 6e 4c 6f 63 6b 46 6c 61 67  .  pb.unLockFlag
18de0 20 3d 20 73 65 74 4c 6f 63 6b 46 6c 61 67 20 3f   = setLockFlag ?
18df0 20 30 20 3a 20 31 3b 0a 20 20 70 62 2e 73 74 61   0 : 1;.  pb.sta
18e00 72 74 45 6e 64 46 6c 61 67 20 3d 20 30 3b 0a 20  rtEndFlag = 0;. 
18e10 20 70 62 2e 6f 66 66 73 65 74 20 3d 20 6f 66 66   pb.offset = off
18e20 73 65 74 3b 0a 20 20 70 62 2e 6c 65 6e 67 74 68  set;.  pb.length
18e30 20 3d 20 6c 65 6e 67 74 68 3b 20 0a 20 20 70 62   = length; .  pb
18e40 2e 66 64 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a  .fd = pFile->h;.
18e50 20 20 0a 20 20 4f 53 54 52 41 43 45 28 28 22 41    .  OSTRACE(("A
18e60 46 50 53 45 54 4c 4f 43 4b 20 5b 25 73 5d 20 66  FPSETLOCK [%s] f
18e70 6f 72 20 25 64 25 73 20 69 6e 20 72 61 6e 67 65  or %d%s in range
18e80 20 25 6c 6c 78 3a 25 6c 6c 78 5c 6e 22 2c 20 0a   %llx:%llx\n", .
18e90 20 20 20 20 28 73 65 74 4c 6f 63 6b 46 6c 61 67      (setLockFlag
18ea0 3f 22 4f 4e 22 3a 22 4f 46 46 22 29 2c 20 70 46  ?"ON":"OFF"), pF
18eb0 69 6c 65 2d 3e 68 2c 20 28 70 62 2e 66 64 3d 3d  ile->h, (pb.fd==
18ec0 2d 31 3f 22 5b 74 65 73 74 76 61 6c 2d 31 5d 22  -1?"[testval-1]"
18ed0 3a 22 22 29 2c 0a 20 20 20 20 6f 66 66 73 65 74  :""),.    offset
18ee0 2c 20 6c 65 6e 67 74 68 29 29 3b 0a 20 20 65 72  , length));.  er
18ef0 72 20 3d 20 66 73 63 74 6c 28 70 61 74 68 2c 20  r = fsctl(path, 
18f00 61 66 70 66 73 42 79 74 65 52 61 6e 67 65 4c 6f  afpfsByteRangeLo
18f10 63 6b 32 46 53 43 54 4c 2c 20 26 70 62 2c 20 30  ck2FSCTL, &pb, 0
18f20 29 3b 0a 20 20 69 66 20 28 20 65 72 72 3d 3d 2d  );.  if ( err==-
18f30 31 20 29 20 7b 0a 20 20 20 20 69 6e 74 20 72 63  1 ) {.    int rc
18f40 3b 0a 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f  ;.    int tErrno
18f50 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 4f 53   = errno;.    OS
18f60 54 52 41 43 45 28 28 22 41 46 50 53 45 54 4c 4f  TRACE(("AFPSETLO
18f70 43 4b 20 66 61 69 6c 65 64 20 74 6f 20 66 73 63  CK failed to fsc
18f80 74 6c 28 29 20 27 25 73 27 20 25 64 20 25 73 5c  tl() '%s' %d %s\
18f90 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
18fa0 20 70 61 74 68 2c 20 74 45 72 72 6e 6f 2c 20 73   path, tErrno, s
18fb0 74 72 65 72 72 6f 72 28 74 45 72 72 6e 6f 29 29  trerror(tErrno))
18fc0 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
18fd0 5f 49 47 4e 4f 52 45 5f 41 46 50 5f 4c 4f 43 4b  _IGNORE_AFP_LOCK
18fe0 5f 45 52 52 4f 52 53 0a 20 20 20 20 72 63 20 3d  _ERRORS.    rc =
18ff0 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 23 65   SQLITE_BUSY;.#e
19000 6c 73 65 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  lse.    rc = sql
19010 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69  iteErrorFromPosi
19020 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 0a 20  xError(tErrno,. 
19030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19040 20 20 20 73 65 74 4c 6f 63 6b 46 6c 61 67 20 3f     setLockFlag ?
19050 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f   SQLITE_IOERR_LO
19060 43 4b 20 3a 20 53 51 4c 49 54 45 5f 49 4f 45 52  CK : SQLITE_IOER
19070 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 23 65 6e 64 69  R_UNLOCK);.#endi
19080 66 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f  f /* SQLITE_IGNO
19090 52 45 5f 41 46 50 5f 4c 4f 43 4b 5f 45 52 52 4f  RE_AFP_LOCK_ERRO
190a0 52 53 20 2a 2f 0a 20 20 20 20 69 66 28 20 49 53  RS */.    if( IS
190b0 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29 20  _LOCK_ERROR(rc) 
190c0 29 7b 0a 20 20 20 20 20 20 73 74 6f 72 65 4c 61  ){.      storeLa
190d0 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c 20 74  stErrno(pFile, t
190e0 45 72 72 6e 6f 29 3b 0a 20 20 20 20 7d 0a 20 20  Errno);.    }.  
190f0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
19100 20 65 6c 73 65 20 7b 0a 20 20 20 20 72 65 74 75   else {.    retu
19110 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
19120 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
19130 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69  routine checks i
19140 66 20 74 68 65 72 65 20 69 73 20 61 20 52 45 53  f there is a RES
19150 45 52 56 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20  ERVED lock held 
19160 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64  on the specified
19170 0a 2a 2a 20 66 69 6c 65 20 62 79 20 74 68 69 73  .** file by this
19180 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72   or any other pr
19190 6f 63 65 73 73 2e 20 49 66 20 73 75 63 68 20 61  ocess. If such a
191a0 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20 73   lock is held, s
191b0 65 74 20 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74  et *pResOut.** t
191c0 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c  o a non-zero val
191d0 75 65 20 6f 74 68 65 72 77 69 73 65 20 2a 70 52  ue otherwise *pR
191e0 65 73 4f 75 74 20 69 73 20 73 65 74 20 74 6f 20  esOut is set to 
191f0 7a 65 72 6f 2e 20 20 54 68 65 20 72 65 74 75 72  zero.  The retur
19200 6e 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65  n value.** is se
19210 74 20 74 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75  t to SQLITE_OK u
19220 6e 6c 65 73 73 20 61 6e 20 49 2f 4f 20 65 72 72  nless an I/O err
19230 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  or occurs during
19240 20 6c 6f 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a   lock checking..
19250 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66  */.static int af
19260 70 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  pCheckReservedLo
19270 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
19280 2a 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75  *id, int *pResOu
19290 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  t){.  int rc = S
192a0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
192b0 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20  reserved = 0;.  
192c0 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
192d0 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
192e0 0a 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e  .  afpLockingCon
192f0 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 3b 0a 20  text *context;. 
19300 20 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72   .  SimulateIOEr
19310 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49  ror( return SQLI
19320 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45  TE_IOERR_CHECKRE
19330 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20  SERVEDLOCK; );. 
19340 20 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c   .  assert( pFil
19350 65 20 29 3b 0a 20 20 63 6f 6e 74 65 78 74 20 3d  e );.  context =
19360 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74   (afpLockingCont
19370 65 78 74 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f  ext *) pFile->lo
19380 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20  ckingContext;.  
19390 69 66 28 20 63 6f 6e 74 65 78 74 2d 3e 72 65 73  if( context->res
193a0 65 72 76 65 64 20 29 7b 0a 20 20 20 20 2a 70 52  erved ){.    *pR
193b0 65 73 4f 75 74 20 3d 20 31 3b 0a 20 20 20 20 72  esOut = 1;.    r
193c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
193d0 0a 20 20 7d 0a 20 20 75 6e 69 78 45 6e 74 65 72  .  }.  unixEnter
193e0 4d 75 74 65 78 28 29 3b 20 2f 2a 20 42 65 63 61  Mutex(); /* Beca
193f0 75 73 65 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  use pFile->pInod
19400 65 20 69 73 20 73 68 61 72 65 64 20 61 63 72 6f  e is shared acro
19410 73 73 20 74 68 72 65 61 64 73 20 2a 2f 0a 20 20  ss threads */.  
19420 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61  .  /* Check if a
19430 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 20   thread in this 
19440 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75  process holds su
19450 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69  ch a lock */.  i
19460 66 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  f( pFile->pInode
19470 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52  ->eFileLock>SHAR
19480 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72  ED_LOCK ){.    r
19490 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d  eserved = 1;.  }
194a0 0a 20 20 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69  .  .  /* Otherwi
194b0 73 65 20 73 65 65 20 69 66 20 73 6f 6d 65 20 6f  se see if some o
194c0 74 68 65 72 20 70 72 6f 63 65 73 73 20 68 6f 6c  ther process hol
194d0 64 73 20 69 74 2e 0a 20 20 20 2a 2f 0a 20 20 69  ds it..   */.  i
194e0 66 28 20 21 72 65 73 65 72 76 65 64 20 29 7b 0a  f( !reserved ){.
194f0 20 20 20 20 2f 2a 20 6c 6f 63 6b 20 74 68 65 20      /* lock the 
19500 52 45 53 45 52 56 45 44 20 62 79 74 65 20 2a 2f  RESERVED byte */
19510 0a 20 20 20 20 69 6e 74 20 6c 72 63 20 3d 20 61  .    int lrc = a
19520 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78  fpSetLock(contex
19530 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65  t->dbPath, pFile
19540 2c 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c  , RESERVED_BYTE,
19550 20 31 2c 31 29 3b 20 20 0a 20 20 20 20 69 66 28   1,1);  .    if(
19560 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 6c 72 63 20   SQLITE_OK==lrc 
19570 29 7b 0a 20 20 20 20 20 20 2f 2a 20 69 66 20 77  ){.      /* if w
19580 65 20 73 75 63 63 65 65 64 65 64 20 69 6e 20 74  e succeeded in t
19590 61 6b 69 6e 67 20 74 68 65 20 72 65 73 65 72 76  aking the reserv
195a0 65 64 20 6c 6f 63 6b 2c 20 75 6e 6c 6f 63 6b 20  ed lock, unlock 
195b0 69 74 20 74 6f 20 72 65 73 74 6f 72 65 0a 20 20  it to restore.  
195c0 20 20 20 20 2a 2a 20 74 68 65 20 6f 72 69 67 69      ** the origi
195d0 6e 61 6c 20 73 74 61 74 65 20 2a 2f 0a 20 20 20  nal state */.   
195e0 20 20 20 6c 72 63 20 3d 20 61 66 70 53 65 74 4c     lrc = afpSetL
195f0 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50  ock(context->dbP
19600 61 74 68 2c 20 70 46 69 6c 65 2c 20 52 45 53 45  ath, pFile, RESE
19610 52 56 45 44 5f 42 59 54 45 2c 20 31 2c 20 30 29  RVED_BYTE, 1, 0)
19620 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20  ;.    } else {. 
19630 20 20 20 20 20 2f 2a 20 69 66 20 77 65 20 66 61       /* if we fa
19640 69 6c 65 64 20 74 6f 20 67 65 74 20 74 68 65 20  iled to get the 
19650 6c 6f 63 6b 20 74 68 65 6e 20 73 6f 6d 65 6f 6e  lock then someon
19660 65 20 65 6c 73 65 20 6d 75 73 74 20 68 61 76 65  e else must have
19670 20 69 74 20 2a 2f 0a 20 20 20 20 20 20 72 65 73   it */.      res
19680 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d  erved = 1;.    }
19690 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b  .    if( IS_LOCK
196a0 5f 45 52 52 4f 52 28 6c 72 63 29 20 29 7b 0a 20  _ERROR(lrc) ){. 
196b0 20 20 20 20 20 72 63 3d 6c 72 63 3b 0a 20 20 20       rc=lrc;.   
196c0 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 75 6e 69 78   }.  }.  .  unix
196d0 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20  LeaveMutex();.  
196e0 4f 53 54 52 41 43 45 28 28 22 54 45 53 54 20 57  OSTRACE(("TEST W
196f0 52 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 20  R-LOCK %d %d %d 
19700 28 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  (afp)\n", pFile-
19710 3e 68 2c 20 72 63 2c 20 72 65 73 65 72 76 65 64  >h, rc, reserved
19720 29 29 3b 0a 20 20 0a 20 20 2a 70 52 65 73 4f 75  ));.  .  *pResOu
19730 74 20 3d 20 72 65 73 65 72 76 65 64 3b 0a 20 20  t = reserved;.  
19740 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
19750 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c  .** Lock the fil
19760 65 20 77 69 74 68 20 74 68 65 20 6c 6f 63 6b 20  e with the lock 
19770 73 70 65 63 69 66 69 65 64 20 62 79 20 70 61 72  specified by par
19780 61 6d 65 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b  ameter eFileLock
19790 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65   - one.** of the
197a0 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a   following:.**.*
197b0 2a 20 20 20 20 20 28 31 29 20 53 48 41 52 45 44  *     (1) SHARED
197c0 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29  _LOCK.**     (2)
197d0 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a   RESERVED_LOCK.*
197e0 2a 20 20 20 20 20 28 33 29 20 50 45 4e 44 49 4e  *     (3) PENDIN
197f0 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34  G_LOCK.**     (4
19800 29 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ) EXCLUSIVE_LOCK
19810 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73  .**.** Sometimes
19820 20 77 68 65 6e 20 72 65 71 75 65 73 74 69 6e 67   when requesting
19830 20 6f 6e 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c   one lock state,
19840 20 61 64 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b   additional lock
19850 20 73 74 61 74 65 73 0a 2a 2a 20 61 72 65 20 69   states.** are i
19860 6e 73 65 72 74 65 64 20 69 6e 20 62 65 74 77 65  nserted in betwe
19870 65 6e 2e 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67  en.  The locking
19880 20 6d 69 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f   might fail on o
19890 6e 65 20 6f 66 20 74 68 65 20 6c 61 74 65 72 0a  ne of the later.
198a0 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c  ** transitions l
198b0 65 61 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20  eaving the lock 
198c0 73 74 61 74 65 20 64 69 66 66 65 72 65 6e 74 20  state different 
198d0 66 72 6f 6d 20 77 68 61 74 20 69 74 20 73 74 61  from what it sta
198e0 72 74 65 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c  rted but.** stil
198f0 6c 20 73 68 6f 72 74 20 6f 66 20 69 74 73 20 67  l short of its g
19900 6f 61 6c 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  oal.  The follow
19910 69 6e 67 20 63 68 61 72 74 20 73 68 6f 77 73 20  ing chart shows 
19920 74 68 65 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74  the allowed.** t
19930 72 61 6e 73 69 74 69 6f 6e 73 20 61 6e 64 20 74  ransitions and t
19940 68 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 65  he inserted inte
19950 72 6d 65 64 69 61 74 65 20 73 74 61 74 65 73 3a  rmediate states:
19960 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b  .**.**    UNLOCK
19970 45 44 20 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20  ED -> SHARED.** 
19980 20 20 20 53 48 41 52 45 44 20 2d 3e 20 52 45 53     SHARED -> RES
19990 45 52 56 45 44 0a 2a 2a 20 20 20 20 53 48 41 52  ERVED.**    SHAR
199a0 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20  ED -> (PENDING) 
199b0 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  -> EXCLUSIVE.** 
199c0 20 20 20 52 45 53 45 52 56 45 44 20 2d 3e 20 28     RESERVED -> (
199d0 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c  PENDING) -> EXCL
199e0 55 53 49 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44  USIVE.**    PEND
199f0 49 4e 47 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  ING -> EXCLUSIVE
19a00 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
19a10 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e  ine will only in
19a20 63 72 65 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20  crease a lock.  
19a30 55 73 65 20 74 68 65 20 73 71 6c 69 74 65 33 4f  Use the sqlite3O
19a40 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75  sUnlock().** rou
19a50 74 69 6e 65 20 74 6f 20 6c 6f 77 65 72 20 61 20  tine to lower a 
19a60 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a  locking level..*
19a70 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 66 70  /.static int afp
19a80 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  Lock(sqlite3_fil
19a90 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65  e *id, int eFile
19aa0 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72 63 20  Lock){.  int rc 
19ab0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75  = SQLITE_OK;.  u
19ac0 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
19ad0 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
19ae0 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20    unixInodeInfo 
19af0 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d  *pInode = pFile-
19b00 3e 70 49 6e 6f 64 65 3b 0a 20 20 61 66 70 4c 6f  >pInode;.  afpLo
19b10 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 63 6f  ckingContext *co
19b20 6e 74 65 78 74 20 3d 20 28 61 66 70 4c 6f 63 6b  ntext = (afpLock
19b30 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 20 70 46  ingContext *) pF
19b40 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
19b50 65 78 74 3b 0a 20 20 0a 20 20 61 73 73 65 72 74  ext;.  .  assert
19b60 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54  ( pFile );.  OST
19b70 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25  RACE(("LOCK    %
19b80 64 20 25 73 20 77 61 73 20 25 73 28 25 73 2c 25  d %s was %s(%s,%
19b90 64 29 20 70 69 64 3d 25 64 20 28 61 66 70 29 5c  d) pid=%d (afp)\
19ba0 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20  n", pFile->h,.  
19bb0 20 20 20 20 20 20 20 20 20 61 7a 46 69 6c 65 4c           azFileL
19bc0 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20  ock(eFileLock), 
19bd0 61 7a 46 69 6c 65 4c 6f 63 6b 28 70 46 69 6c 65  azFileLock(pFile
19be0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c 0a 20 20  ->eFileLock),.  
19bf0 20 20 20 20 20 20 20 20 20 61 7a 46 69 6c 65 4c           azFileL
19c00 6f 63 6b 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c  ock(pInode->eFil
19c10 65 4c 6f 63 6b 29 2c 20 70 49 6e 6f 64 65 2d 3e  eLock), pInode->
19c20 6e 53 68 61 72 65 64 20 2c 20 6f 73 47 65 74 70  nShared , osGetp
19c30 69 64 28 30 29 29 29 3b 0a 0a 20 20 2f 2a 20 49  id(0)));..  /* I
19c40 66 20 74 68 65 72 65 20 69 73 20 61 6c 72 65 61  f there is alrea
19c50 64 79 20 61 20 6c 6f 63 6b 20 6f 66 20 74 68 69  dy a lock of thi
19c60 73 20 74 79 70 65 20 6f 72 20 6d 6f 72 65 20 72  s type or more r
19c70 65 73 74 72 69 63 74 69 76 65 20 6f 6e 20 74 68  estrictive on th
19c80 65 0a 20 20 2a 2a 20 75 6e 69 78 46 69 6c 65 2c  e.  ** unixFile,
19c90 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 44 6f 6e   do nothing. Don
19ca0 27 74 20 75 73 65 20 74 68 65 20 61 66 70 5f 65  't use the afp_e
19cb0 6e 64 5f 6c 6f 63 6b 3a 20 65 78 69 74 20 70 61  nd_lock: exit pa
19cc0 74 68 2c 20 61 73 0a 20 20 2a 2a 20 75 6e 69 78  th, as.  ** unix
19cd0 45 6e 74 65 72 4d 75 74 65 78 28 29 20 68 61 73  EnterMutex() has
19ce0 6e 27 74 20 62 65 65 6e 20 63 61 6c 6c 65 64 20  n't been called 
19cf0 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  yet..  */.  if( 
19d00 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
19d10 3e 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20  >=eFileLock ){. 
19d20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43     OSTRACE(("LOC
19d30 4b 20 20 20 20 25 64 20 25 73 20 6f 6b 20 28 61  K    %d %s ok (a
19d40 6c 72 65 61 64 79 20 68 65 6c 64 29 20 28 61 66  lready held) (af
19d50 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  p)\n", pFile->h,
19d60 0a 20 20 20 20 20 20 20 20 20 20 20 61 7a 46 69  .           azFi
19d70 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63 6b  leLock(eFileLock
19d80 29 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  )));.    return 
19d90 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
19da0 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
19db0 68 65 20 6c 6f 63 6b 69 6e 67 20 73 65 71 75 65  he locking seque
19dc0 6e 63 65 20 69 73 20 63 6f 72 72 65 63 74 0a 20  nce is correct. 
19dd0 20 2a 2a 20 20 28 31 29 20 57 65 20 6e 65 76 65   **  (1) We neve
19de0 72 20 6d 6f 76 65 20 66 72 6f 6d 20 75 6e 6c 6f  r move from unlo
19df0 63 6b 65 64 20 74 6f 20 61 6e 79 74 68 69 6e 67  cked to anything
19e00 20 68 69 67 68 65 72 20 74 68 61 6e 20 73 68 61   higher than sha
19e10 72 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20  red lock..  **  
19e20 28 32 29 20 53 51 4c 69 74 65 20 6e 65 76 65 72  (2) SQLite never
19e30 20 65 78 70 6c 69 63 69 74 6c 79 20 72 65 71 75   explicitly requ
19e40 65 73 74 73 20 61 20 70 65 6e 64 69 67 20 6c 6f  ests a pendig lo
19e50 63 6b 2e 0a 20 20 2a 2a 20 20 28 33 29 20 41 20  ck..  **  (3) A 
19e60 73 68 61 72 65 64 20 6c 6f 63 6b 20 69 73 20 61  shared lock is a
19e70 6c 77 61 79 73 20 68 65 6c 64 20 77 68 65 6e 20  lways held when 
19e80 61 20 72 65 73 65 72 76 65 20 6c 6f 63 6b 20 69  a reserve lock i
19e90 73 20 72 65 71 75 65 73 74 65 64 2e 0a 20 20 2a  s requested..  *
19ea0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c  /.  assert( pFil
19eb0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 4e 4f  e->eFileLock!=NO
19ec0 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f  _LOCK || eFileLo
19ed0 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck==SHARED_LOCK 
19ee0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46 69  );.  assert( eFi
19ef0 6c 65 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e 47 5f  leLock!=PENDING_
19f00 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  LOCK );.  assert
19f10 28 20 65 46 69 6c 65 4c 6f 63 6b 21 3d 52 45 53  ( eFileLock!=RES
19f20 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 46  ERVED_LOCK || pF
19f30 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d  ile->eFileLock==
19f40 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
19f50 20 0a 20 20 2f 2a 20 54 68 69 73 20 6d 75 74 65   .  /* This mute
19f60 78 20 69 73 20 6e 65 65 64 65 64 20 62 65 63 61  x is needed beca
19f70 75 73 65 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  use pFile->pInod
19f80 65 20 69 73 20 73 68 61 72 65 64 20 61 63 72 6f  e is shared acro
19f90 73 73 20 74 68 72 65 61 64 73 0a 20 20 2a 2f 0a  ss threads.  */.
19fa0 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
19fb0 28 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70  ();.  pInode = p
19fc0 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 0a 20  File->pInode;.. 
19fd0 20 2f 2a 20 49 66 20 73 6f 6d 65 20 74 68 72 65   /* If some thre
19fe0 61 64 20 75 73 69 6e 67 20 74 68 69 73 20 50 49  ad using this PI
19ff0 44 20 68 61 73 20 61 20 6c 6f 63 6b 20 76 69 61  D has a lock via
1a000 20 61 20 64 69 66 66 65 72 65 6e 74 20 75 6e 69   a different uni
1a010 78 46 69 6c 65 2a 0a 20 20 2a 2a 20 68 61 6e 64  xFile*.  ** hand
1a020 6c 65 20 74 68 61 74 20 70 72 65 63 6c 75 64 65  le that preclude
1a030 73 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  s the requested 
1a040 6c 6f 63 6b 2c 20 72 65 74 75 72 6e 20 42 55 53  lock, return BUS
1a050 59 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70  Y..  */.  if( (p
1a060 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21  File->eFileLock!
1a070 3d 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f  =pInode->eFileLo
1a080 63 6b 20 26 26 20 0a 20 20 20 20 20 20 20 28 70  ck && .       (p
1a090 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
1a0a0 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20 7c  >=PENDING_LOCK |
1a0b0 7c 20 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52  | eFileLock>SHAR
1a0c0 45 44 5f 4c 4f 43 4b 29 29 0a 20 20 20 20 20 29  ED_LOCK)).     )
1a0d0 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
1a0e0 45 5f 42 55 53 59 3b 0a 20 20 20 20 67 6f 74 6f  E_BUSY;.    goto
1a0f0 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20   afp_end_lock;. 
1a100 20 7d 0a 20 20 0a 20 20 2f 2a 20 49 66 20 61 20   }.  .  /* If a 
1a110 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 73 20 72  SHARED lock is r
1a120 65 71 75 65 73 74 65 64 2c 20 61 6e 64 20 73 6f  equested, and so
1a130 6d 65 20 74 68 72 65 61 64 20 75 73 69 6e 67 20  me thread using 
1a140 74 68 69 73 20 50 49 44 20 61 6c 72 65 61 64 79  this PID already
1a150 0a 20 20 2a 2a 20 68 61 73 20 61 20 53 48 41 52  .  ** has a SHAR
1a160 45 44 20 6f 72 20 52 45 53 45 52 56 45 44 20 6c  ED or RESERVED l
1a170 6f 63 6b 2c 20 74 68 65 6e 20 69 6e 63 72 65 6d  ock, then increm
1a180 65 6e 74 20 72 65 66 65 72 65 6e 63 65 20 63 6f  ent reference co
1a190 75 6e 74 73 20 61 6e 64 0a 20 20 2a 2a 20 72 65  unts and.  ** re
1a1a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  turn SQLITE_OK..
1a1b0 20 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65    */.  if( eFile
1a1c0 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
1a1d0 4b 20 26 26 20 0a 20 20 20 20 20 28 70 49 6e 6f  K && .     (pIno
1a1e0 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  de->eFileLock==S
1a1f0 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49  HARED_LOCK || pI
1a200 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  node->eFileLock=
1a210 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 20  =RESERVED_LOCK) 
1a220 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 65  ){.    assert( e
1a230 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
1a240 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 61 73 73  _LOCK );.    ass
1a250 65 72 74 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c  ert( pFile->eFil
1a260 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20  eLock==0 );.    
1a270 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e  assert( pInode->
1a280 6e 53 68 61 72 65 64 3e 30 20 29 3b 0a 20 20 20  nShared>0 );.   
1a290 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
1a2a0 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b  k = SHARED_LOCK;
1a2b0 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68  .    pInode->nSh
1a2c0 61 72 65 64 2b 2b 3b 0a 20 20 20 20 70 49 6e 6f  ared++;.    pIno
1a2d0 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20  de->nLock++;.   
1a2e0 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f   goto afp_end_lo
1a2f0 63 6b 3b 0a 20 20 7d 0a 20 20 20 20 0a 20 20 2f  ck;.  }.    .  /
1a300 2a 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b  * A PENDING lock
1a310 20 69 73 20 6e 65 65 64 65 64 20 62 65 66 6f 72   is needed befor
1a320 65 20 61 63 71 75 69 72 69 6e 67 20 61 20 53 48  e acquiring a SH
1a330 41 52 45 44 20 6c 6f 63 6b 20 61 6e 64 20 62 65  ARED lock and be
1a340 66 6f 72 65 0a 20 20 2a 2a 20 61 63 71 75 69 72  fore.  ** acquir
1a350 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56 45  ing an EXCLUSIVE
1a360 20 6c 6f 63 6b 2e 20 20 46 6f 72 20 74 68 65 20   lock.  For the 
1a370 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68 65  SHARED lock, the
1a380 20 50 45 4e 44 49 4e 47 20 77 69 6c 6c 0a 20 20   PENDING will.  
1a390 2a 2a 20 62 65 20 72 65 6c 65 61 73 65 64 2e 0a  ** be released..
1a3a0 20 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c 65    */.  if( eFile
1a3b0 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
1a3c0 4b 20 0a 20 20 20 20 20 20 7c 7c 20 28 65 46 69  K .      || (eFi
1a3d0 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56  leLock==EXCLUSIV
1a3e0 45 5f 4c 4f 43 4b 20 26 26 20 70 46 69 6c 65 2d  E_LOCK && pFile-
1a3f0 3e 65 46 69 6c 65 4c 6f 63 6b 3c 50 45 4e 44 49  >eFileLock<PENDI
1a400 4e 47 5f 4c 4f 43 4b 29 0a 20 20 29 7b 0a 20 20  NG_LOCK).  ){.  
1a410 20 20 69 6e 74 20 66 61 69 6c 65 64 3b 0a 20 20    int failed;.  
1a420 20 20 66 61 69 6c 65 64 20 3d 20 61 66 70 53 65    failed = afpSe
1a430 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64  tLock(context->d
1a440 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 50 45  bPath, pFile, PE
1a450 4e 44 49 4e 47 5f 42 59 54 45 2c 20 31 2c 20 31  NDING_BYTE, 1, 1
1a460 29 3b 0a 20 20 20 20 69 66 20 28 66 61 69 6c 65  );.    if (faile
1a470 64 29 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  d) {.      rc = 
1a480 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 67 6f  failed;.      go
1a490 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b  to afp_end_lock;
1a4a0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20  .    }.  }.  .  
1a4b0 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20 67 65  /* If control ge
1a4c0 74 73 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74  ts to this point
1a4d0 2c 20 74 68 65 6e 20 61 63 74 75 61 6c 6c 79 20  , then actually 
1a4e0 67 6f 20 61 68 65 61 64 20 61 6e 64 20 6d 61 6b  go ahead and mak
1a4f0 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69 6e 67  e.  ** operating
1a500 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 66 6f   system calls fo
1a510 72 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  r the specified 
1a520 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  lock..  */.  if(
1a530 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52   eFileLock==SHAR
1a540 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 69  ED_LOCK ){.    i
1a550 6e 74 20 6c 72 63 31 2c 20 6c 72 63 32 2c 20 6c  nt lrc1, lrc2, l
1a560 72 63 31 45 72 72 6e 6f 20 3d 20 30 3b 0a 20 20  rc1Errno = 0;.  
1a570 20 20 6c 6f 6e 67 20 6c 6b 2c 20 6d 61 73 6b 3b    long lk, mask;
1a580 0a 20 20 20 20 0a 20 20 20 20 61 73 73 65 72 74  .    .    assert
1a590 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  ( pInode->nShare
1a5a0 64 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  d==0 );.    asse
1a5b0 72 74 28 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c  rt( pInode->eFil
1a5c0 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20  eLock==0 );.    
1a5d0 20 20 20 20 0a 20 20 20 20 6d 61 73 6b 20 3d 20      .    mask = 
1a5e0 28 73 69 7a 65 6f 66 28 6c 6f 6e 67 29 3d 3d 38  (sizeof(long)==8
1a5f0 29 20 3f 20 4c 41 52 47 45 53 54 5f 49 4e 54 36  ) ? LARGEST_INT6
1a600 34 20 3a 20 30 78 37 66 66 66 66 66 66 66 3b 0a  4 : 0x7fffffff;.
1a610 20 20 20 20 2f 2a 20 4e 6f 77 20 67 65 74 20 74      /* Now get t
1a620 68 65 20 72 65 61 64 2d 6c 6f 63 6b 20 53 48 41  he read-lock SHA
1a630 52 45 44 5f 4c 4f 43 4b 20 2a 2f 0a 20 20 20 20  RED_LOCK */.    
1a640 2f 2a 20 6e 6f 74 65 20 74 68 61 74 20 74 68 65  /* note that the
1a650 20 71 75 61 6c 69 74 79 20 6f 66 20 74 68 65 20   quality of the 
1a660 72 61 6e 64 6f 6d 6e 65 73 73 20 64 6f 65 73 6e  randomness doesn
1a670 27 74 20 6d 61 74 74 65 72 20 74 68 61 74 20 6d  't matter that m
1a680 75 63 68 20 2a 2f 0a 20 20 20 20 6c 6b 20 3d 20  uch */.    lk = 
1a690 72 61 6e 64 6f 6d 28 29 3b 20 0a 20 20 20 20 70  random(); .    p
1a6a0 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79 74  Inode->sharedByt
1a6b0 65 20 3d 20 28 6c 6b 20 26 20 6d 61 73 6b 29 25  e = (lk & mask)%
1a6c0 28 53 48 41 52 45 44 5f 53 49 5a 45 20 2d 20 31  (SHARED_SIZE - 1
1a6d0 29 3b 0a 20 20 20 20 6c 72 63 31 20 3d 20 61 66  );.    lrc1 = af
1a6e0 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  pSetLock(context
1a6f0 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c  ->dbPath, pFile,
1a700 20 0a 20 20 20 20 20 20 20 20 20 20 53 48 41 52   .          SHAR
1a710 45 44 5f 46 49 52 53 54 2b 70 49 6e 6f 64 65 2d  ED_FIRST+pInode-
1a720 3e 73 68 61 72 65 64 42 79 74 65 2c 20 31 2c 20  >sharedByte, 1, 
1a730 31 29 3b 0a 20 20 20 20 69 66 28 20 49 53 5f 4c  1);.    if( IS_L
1a740 4f 43 4b 5f 45 52 52 4f 52 28 6c 72 63 31 29 20  OCK_ERROR(lrc1) 
1a750 29 7b 0a 20 20 20 20 20 20 6c 72 63 31 45 72 72  ){.      lrc1Err
1a760 6e 6f 20 3d 20 70 46 69 6c 65 2d 3e 6c 61 73 74  no = pFile->last
1a770 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20  Errno;.    }.   
1a780 20 2f 2a 20 44 72 6f 70 20 74 68 65 20 74 65 6d   /* Drop the tem
1a790 70 6f 72 61 72 79 20 50 45 4e 44 49 4e 47 20 6c  porary PENDING l
1a7a0 6f 63 6b 20 2a 2f 0a 20 20 20 20 6c 72 63 32 20  ock */.    lrc2 
1a7b0 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e  = afpSetLock(con
1a7c0 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46  text->dbPath, pF
1a7d0 69 6c 65 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54  ile, PENDING_BYT
1a7e0 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 0a 20  E, 1, 0);.    . 
1a7f0 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
1a800 52 52 4f 52 28 6c 72 63 31 29 20 29 20 7b 0a 20  RROR(lrc1) ) {. 
1a810 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72       storeLastEr
1a820 72 6e 6f 28 70 46 69 6c 65 2c 20 6c 72 63 31 45  rno(pFile, lrc1E
1a830 72 72 6e 6f 29 3b 0a 20 20 20 20 20 20 72 63 20  rrno);.      rc 
1a840 3d 20 6c 72 63 31 3b 0a 20 20 20 20 20 20 67 6f  = lrc1;.      go
1a850 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b  to afp_end_lock;
1a860 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 28 20  .    } else if( 
1a870 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72  IS_LOCK_ERROR(lr
1a880 63 32 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20  c2) ){.      rc 
1a890 3d 20 6c 72 63 32 3b 0a 20 20 20 20 20 20 67 6f  = lrc2;.      go
1a8a0 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b  to afp_end_lock;
1a8b0 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 28 20  .    } else if( 
1a8c0 6c 72 63 31 20 21 3d 20 53 51 4c 49 54 45 5f 4f  lrc1 != SQLITE_O
1a8d0 4b 20 29 20 7b 0a 20 20 20 20 20 20 72 63 20 3d  K ) {.      rc =
1a8e0 20 6c 72 63 31 3b 0a 20 20 20 20 7d 20 65 6c 73   lrc1;.    } els
1a8f0 65 20 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  e {.      pFile-
1a900 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41  >eFileLock = SHA
1a910 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20  RED_LOCK;.      
1a920 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b  pInode->nLock++;
1a930 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e  .      pInode->n
1a940 53 68 61 72 65 64 20 3d 20 31 3b 0a 20 20 20 20  Shared = 1;.    
1a950 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65 46  }.  }else if( eF
1a960 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ileLock==EXCLUSI
1a970 56 45 5f 4c 4f 43 4b 20 26 26 20 70 49 6e 6f 64  VE_LOCK && pInod
1a980 65 2d 3e 6e 53 68 61 72 65 64 3e 31 20 29 7b 0a  e->nShared>1 ){.
1a990 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20 74 72      /* We are tr
1a9a0 79 69 6e 67 20 66 6f 72 20 61 6e 20 65 78 63 6c  ying for an excl
1a9b0 75 73 69 76 65 20 6c 6f 63 6b 20 62 75 74 20 61  usive lock but a
1a9c0 6e 6f 74 68 65 72 20 74 68 72 65 61 64 20 69 6e  nother thread in
1a9d0 20 74 68 69 73 0a 20 20 20 20 20 2a 2a 20 73 61   this.     ** sa
1a9e0 6d 65 20 70 72 6f 63 65 73 73 20 69 73 20 73 74  me process is st
1a9f0 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61 20 73 68  ill holding a sh
1aa00 61 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20  ared lock. */.  
1aa10 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
1aa20 53 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  SY;.  }else{.   
1aa30 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 20   /* The request 
1aa40 77 61 73 20 66 6f 72 20 61 20 52 45 53 45 52 56  was for a RESERV
1aa50 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20  ED or EXCLUSIVE 
1aa60 6c 6f 63 6b 2e 20 20 49 74 20 69 73 0a 20 20 20  lock.  It is.   
1aa70 20 2a 2a 20 61 73 73 75 6d 65 64 20 74 68 61 74   ** assumed that
1aa80 20 74 68 65 72 65 20 69 73 20 61 20 53 48 41 52   there is a SHAR
1aa90 45 44 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f  ED or greater lo
1aaa0 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 0a 20  ck on the file. 
1aab0 20 20 20 2a 2a 20 61 6c 72 65 61 64 79 2e 0a 20     ** already.. 
1aac0 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 66 61     */.    int fa
1aad0 69 6c 65 64 20 3d 20 30 3b 0a 20 20 20 20 61 73  iled = 0;.    as
1aae0 73 65 72 74 28 20 30 21 3d 70 46 69 6c 65 2d 3e  sert( 0!=pFile->
1aaf0 65 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a 20 20 20  eFileLock );.   
1ab00 20 69 66 20 28 65 46 69 6c 65 4c 6f 63 6b 20 3e   if (eFileLock >
1ab10 3d 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  = RESERVED_LOCK 
1ab20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  && pFile->eFileL
1ab30 6f 63 6b 20 3c 20 52 45 53 45 52 56 45 44 5f 4c  ock < RESERVED_L
1ab40 4f 43 4b 29 20 7b 0a 20 20 20 20 20 20 20 20 2f  OCK) {.        /
1ab50 2a 20 41 63 71 75 69 72 65 20 61 20 52 45 53 45  * Acquire a RESE
1ab60 52 56 45 44 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20  RVED lock */.   
1ab70 20 20 20 20 20 66 61 69 6c 65 64 20 3d 20 61 66       failed = af
1ab80 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  pSetLock(context
1ab90 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c  ->dbPath, pFile,
1aba0 20 52 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20   RESERVED_BYTE, 
1abb0 31 2c 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20  1,1);.      if( 
1abc0 21 66 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20  !failed ){.     
1abd0 20 20 20 63 6f 6e 74 65 78 74 2d 3e 72 65 73 65     context->rese
1abe0 72 76 65 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  rved = 1;.      
1abf0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28  }.    }.    if (
1ac00 21 66 61 69 6c 65 64 20 26 26 20 65 46 69 6c 65  !failed && eFile
1ac10 4c 6f 63 6b 20 3d 3d 20 45 58 43 4c 55 53 49 56  Lock == EXCLUSIV
1ac20 45 5f 4c 4f 43 4b 29 20 7b 0a 20 20 20 20 20 20  E_LOCK) {.      
1ac30 2f 2a 20 41 63 71 75 69 72 65 20 61 6e 20 45 58  /* Acquire an EX
1ac40 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 2a 2f 0a  CLUSIVE lock */.
1ac50 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 2f          .      /
1ac60 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 73 68 61  * Remove the sha
1ac70 72 65 64 20 6c 6f 63 6b 20 62 65 66 6f 72 65 20  red lock before 
1ac80 74 72 79 69 6e 67 20 74 68 65 20 72 61 6e 67 65  trying the range
1ac90 2e 20 20 77 65 27 6c 6c 20 6e 65 65 64 20 74 6f  .  we'll need to
1aca0 20 0a 20 20 20 20 20 20 2a 2a 20 72 65 65 73 74   .      ** reest
1acb0 61 62 6c 69 73 68 20 74 68 65 20 73 68 61 72 65  ablish the share
1acc0 64 20 6c 6f 63 6b 20 69 66 20 77 65 20 63 61 6e  d lock if we can
1acd0 27 74 20 67 65 74 20 74 68 65 20 20 61 66 70 55  't get the  afpU
1ace0 6e 6c 6f 63 6b 0a 20 20 20 20 20 20 2a 2f 0a 20  nlock.      */. 
1acf0 20 20 20 20 20 69 66 28 20 21 28 66 61 69 6c 65       if( !(faile
1ad00 64 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63  d = afpSetLock(c
1ad10 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20  ontext->dbPath, 
1ad20 70 46 69 6c 65 2c 20 53 48 41 52 45 44 5f 46 49  pFile, SHARED_FI
1ad30 52 53 54 20 2b 0a 20 20 20 20 20 20 20 20 20 20  RST +.          
1ad40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1ad50 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79 74  Inode->sharedByt
1ad60 65 2c 20 31 2c 20 30 29 29 20 29 7b 0a 20 20 20  e, 1, 0)) ){.   
1ad70 20 20 20 20 20 69 6e 74 20 66 61 69 6c 65 64 32       int failed2
1ad80 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1ad90 20 20 20 20 20 20 2f 2a 20 6e 6f 77 20 61 74 74        /* now att
1ada0 65 6d 6d 70 74 20 74 6f 20 67 65 74 20 74 68 65  emmpt to get the
1adb0 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20   exclusive lock 
1adc0 72 61 6e 67 65 20 2a 2f 0a 20 20 20 20 20 20 20  range */.       
1add0 20 66 61 69 6c 65 64 20 3d 20 61 66 70 53 65 74   failed = afpSet
1ade0 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62  Lock(context->db
1adf0 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 53 48 41  Path, pFile, SHA
1ae00 52 45 44 5f 46 49 52 53 54 2c 20 0a 20 20 20 20  RED_FIRST, .    
1ae10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ae20 20 20 20 20 20 20 20 20 20 20 20 53 48 41 52 45             SHARE
1ae30 44 5f 53 49 5a 45 2c 20 31 29 3b 0a 20 20 20 20  D_SIZE, 1);.    
1ae40 20 20 20 20 69 66 28 20 66 61 69 6c 65 64 20 26      if( failed &
1ae50 26 20 28 66 61 69 6c 65 64 32 20 3d 20 61 66 70  & (failed2 = afp
1ae60 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d  SetLock(context-
1ae70 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20  >dbPath, pFile, 
1ae80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1ae90 20 20 20 20 20 20 20 20 53 48 41 52 45 44 5f 46          SHARED_F
1aea0 49 52 53 54 20 2b 20 70 49 6e 6f 64 65 2d 3e 73  IRST + pInode->s
1aeb0 68 61 72 65 64 42 79 74 65 2c 20 31 2c 20 31 29  haredByte, 1, 1)
1aec0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  ) ){.          /
1aed0 2a 20 43 61 6e 27 74 20 72 65 65 73 74 61 62 6c  * Can't reestabl
1aee0 69 73 68 20 74 68 65 20 73 68 61 72 65 64 20 6c  ish the shared l
1aef0 6f 63 6b 2e 20 20 53 71 6c 69 74 65 20 63 61 6e  ock.  Sqlite can
1af00 27 74 20 64 65 61 6c 2c 20 74 68 69 73 20 69 73  't deal, this is
1af10 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 20  .          ** a 
1af20 63 72 69 74 69 63 61 6c 20 49 2f 4f 20 65 72 72  critical I/O err
1af30 6f 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  or.          */.
1af40 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 28            rc = (
1af50 28 66 61 69 6c 65 64 20 26 20 53 51 4c 49 54 45  (failed & SQLITE
1af60 5f 49 4f 45 52 52 29 20 3d 3d 20 53 51 4c 49 54  _IOERR) == SQLIT
1af70 45 5f 49 4f 45 52 52 29 20 3f 20 66 61 69 6c 65  E_IOERR) ? faile
1af80 64 32 20 3a 20 0a 20 20 20 20 20 20 20 20 20 20  d2 : .          
1af90 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 45 52       SQLITE_IOER
1afa0 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20  R_LOCK;.        
1afb0 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c    goto afp_end_l
1afc0 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 20 0a  ock;.        } .
1afd0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1afe0 20 20 20 20 20 72 63 20 3d 20 66 61 69 6c 65 64       rc = failed
1aff0 3b 20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  ; .      }.    }
1b000 0a 20 20 20 20 69 66 28 20 66 61 69 6c 65 64 20  .    if( failed 
1b010 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 61  ){.      rc = fa
1b020 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  iled;.    }.  }.
1b030 20 20 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c    .  if( rc==SQL
1b040 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 46  ITE_OK ){.    pF
1b050 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
1b060 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20   eFileLock;.    
1b070 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
1b080 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20  k = eFileLock;. 
1b090 20 7d 65 6c 73 65 20 69 66 28 20 65 46 69 6c 65   }else if( eFile
1b0a0 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45 5f  Lock==EXCLUSIVE_
1b0b0 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c  LOCK ){.    pFil
1b0c0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 50  e->eFileLock = P
1b0d0 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 20  ENDING_LOCK;.   
1b0e0 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f   pInode->eFileLo
1b0f0 63 6b 20 3d 20 50 45 4e 44 49 4e 47 5f 4c 4f 43  ck = PENDING_LOC
1b100 4b 3b 0a 20 20 7d 0a 20 20 0a 61 66 70 5f 65 6e  K;.  }.  .afp_en
1b110 64 5f 6c 6f 63 6b 3a 0a 20 20 75 6e 69 78 4c 65  d_lock:.  unixLe
1b120 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53  aveMutex();.  OS
1b130 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20  TRACE(("LOCK    
1b140 25 64 20 25 73 20 25 73 20 28 61 66 70 29 5c 6e  %d %s %s (afp)\n
1b150 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 61 7a 46  ", pFile->h, azF
1b160 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63  ileLock(eFileLoc
1b170 6b 29 2c 20 0a 20 20 20 20 20 20 20 20 20 72 63  k), .         rc
1b180 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f  ==SQLITE_OK ? "o
1b190 6b 22 20 3a 20 22 66 61 69 6c 65 64 22 29 29 3b  k" : "failed"));
1b1a0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1b1b0 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65  ./*.** Lower the
1b1c0 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
1b1d0 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
1b1e0 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65  r pFile to eFile
1b1f0 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b  Lock.  eFileLock
1b200 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68  .** must be eith
1b210 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48  er NO_LOCK or SH
1b220 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a  ARED_LOCK..**.**
1b230 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   If the locking 
1b240 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c  level of the fil
1b250 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
1b260 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65  already at or be
1b270 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65  low.** the reque
1b280 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  sted locking lev
1b290 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  el, this routine
1b2a0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
1b2b0 73 74 61 74 69 63 20 69 6e 74 20 61 66 70 55 6e  static int afpUn
1b2c0 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  lock(sqlite3_fil
1b2d0 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65  e *id, int eFile
1b2e0 4c 6f 63 6b 29 20 7b 0a 20 20 69 6e 74 20 72 63  Lock) {.  int rc
1b2f0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1b300 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
1b310 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
1b320 0a 20 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  .  unixInodeInfo
1b330 20 2a 70 49 6e 6f 64 65 3b 0a 20 20 61 66 70 4c   *pInode;.  afpL
1b340 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 63  ockingContext *c
1b350 6f 6e 74 65 78 74 20 3d 20 28 61 66 70 4c 6f 63  ontext = (afpLoc
1b360 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 20 70  kingContext *) p
1b370 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
1b380 74 65 78 74 3b 0a 20 20 69 6e 74 20 73 6b 69 70  text;.  int skip
1b390 53 68 61 72 65 64 20 3d 20 30 3b 0a 23 69 66 64  Shared = 0;.#ifd
1b3a0 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
1b3b0 20 69 6e 74 20 68 20 3d 20 70 46 69 6c 65 2d 3e   int h = pFile->
1b3c0 68 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73  h;.#endif..  ass
1b3d0 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
1b3e0 4f 53 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b  OSTRACE(("UNLOCK
1b3f0 20 20 25 64 20 25 64 20 77 61 73 20 25 64 28 25    %d %d was %d(%
1b400 64 2c 25 64 29 20 70 69 64 3d 25 64 20 28 61 66  d,%d) pid=%d (af
1b410 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  p)\n", pFile->h,
1b420 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20   eFileLock,.    
1b430 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46         pFile->eF
1b440 69 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e  ileLock, pFile->
1b450 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
1b460 6b 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  k, pFile->pInode
1b470 2d 3e 6e 53 68 61 72 65 64 2c 0a 20 20 20 20 20  ->nShared,.     
1b480 20 20 20 20 20 20 6f 73 47 65 74 70 69 64 28 30        osGetpid(0
1b490 29 29 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  )));..  assert( 
1b4a0 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45  eFileLock<=SHARE
1b4b0 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20  D_LOCK );.  if( 
1b4c0 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
1b4d0 3c 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20  <=eFileLock ){. 
1b4e0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1b4f0 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 45  _OK;.  }.  unixE
1b500 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 70  nterMutex();.  p
1b510 49 6e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70  Inode = pFile->p
1b520 49 6e 6f 64 65 3b 0a 20 20 61 73 73 65 72 74 28  Inode;.  assert(
1b530 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
1b540 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 46 69  !=0 );.  if( pFi
1b550 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48  le->eFileLock>SH
1b560 41 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  ARED_LOCK ){.   
1b570 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d   assert( pInode-
1b580 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 70 46 69 6c  >eFileLock==pFil
1b590 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a  e->eFileLock );.
1b5a0 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72      SimulateIOEr
1b5b0 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20  rorBenign(1);.  
1b5c0 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
1b5d0 72 28 20 68 3d 28 2d 31 29 20 29 0a 20 20 20 20  r( h=(-1) ).    
1b5e0 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42  SimulateIOErrorB
1b5f0 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 0a 23  enign(0);.    .#
1b600 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
1b610 55 47 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 72  UG.    /* When r
1b620 65 64 75 63 69 6e 67 20 61 20 6c 6f 63 6b 20 73  educing a lock s
1b630 75 63 68 20 74 68 61 74 20 6f 74 68 65 72 20 70  uch that other p
1b640 72 6f 63 65 73 73 65 73 20 63 61 6e 20 73 74 61  rocesses can sta
1b650 72 74 0a 20 20 20 20 2a 2a 20 72 65 61 64 69 6e  rt.    ** readin
1b660 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  g the database f
1b670 69 6c 65 20 61 67 61 69 6e 2c 20 6d 61 6b 65 20  ile again, make 
1b680 73 75 72 65 20 74 68 61 74 20 74 68 65 0a 20 20  sure that the.  
1b690 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
1b6a0 20 63 6f 75 6e 74 65 72 20 77 61 73 20 75 70 64   counter was upd
1b6b0 61 74 65 64 20 69 66 20 61 6e 79 20 70 61 72 74  ated if any part
1b6c0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1b6d0 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 63 68 61  .    ** file cha
1b6e0 6e 67 65 64 2e 20 20 49 66 20 74 68 65 20 74 72  nged.  If the tr
1b6f0 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65  ansaction counte
1b700 72 20 69 73 20 6e 6f 74 20 75 70 64 61 74 65 64  r is not updated
1b710 2c 0a 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 63  ,.    ** other c
1b720 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 6f 20 74 68  onnections to th
1b730 65 20 73 61 6d 65 20 66 69 6c 65 20 6d 69 67 68  e same file migh
1b740 74 20 6e 6f 74 20 72 65 61 6c 69 7a 65 20 74 68  t not realize th
1b750 61 74 0a 20 20 20 20 2a 2a 20 74 68 65 20 66 69  at.    ** the fi
1b760 6c 65 20 68 61 73 20 63 68 61 6e 67 65 64 20 61  le has changed a
1b770 6e 64 20 68 65 6e 63 65 20 6d 69 67 68 74 20 6e  nd hence might n
1b780 6f 74 20 6b 6e 6f 77 20 74 6f 20 66 6c 75 73 68  ot know to flush
1b790 20 74 68 65 69 72 0a 20 20 20 20 2a 2a 20 63 61   their.    ** ca
1b7a0 63 68 65 2e 20 20 54 68 65 20 75 73 65 20 6f 66  che.  The use of
1b7b0 20 61 20 73 74 61 6c 65 20 63 61 63 68 65 20 63   a stale cache c
1b7c0 61 6e 20 6c 65 61 64 20 74 6f 20 64 61 74 61 62  an lead to datab
1b7d0 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a  ase corruption..
1b7e0 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
1b7f0 74 28 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d  t( pFile->inNorm
1b800 61 6c 57 72 69 74 65 3d 3d 30 0a 20 20 20 20 20  alWrite==0.     
1b810 20 20 20 20 20 20 7c 7c 20 70 46 69 6c 65 2d 3e        || pFile->
1b820 64 62 55 70 64 61 74 65 3d 3d 30 0a 20 20 20 20  dbUpdate==0.    
1b830 20 20 20 20 20 20 20 7c 7c 20 70 46 69 6c 65 2d         || pFile-
1b840 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 3d 3d  >transCntrChng==
1b850 31 20 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  1 );.    pFile->
1b860 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 3d 20  inNormalWrite = 
1b870 30 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 0a 20  0;.#endif.    . 
1b880 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46     if( pFile->eF
1b890 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ileLock==EXCLUSI
1b8a0 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20  VE_LOCK ){.     
1b8b0 20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b   rc = afpSetLock
1b8c0 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68  (context->dbPath
1b8d0 2c 20 70 46 69 6c 65 2c 20 53 48 41 52 45 44 5f  , pFile, SHARED_
1b8e0 46 49 52 53 54 2c 20 53 48 41 52 45 44 5f 53 49  FIRST, SHARED_SI
1b8f0 5a 45 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  ZE, 0);.      if
1b900 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1b910 26 26 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  && (eFileLock==S
1b920 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70 49  HARED_LOCK || pI
1b930 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3e 31 29  node->nShared>1)
1b940 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 6f   ){.        /* o
1b950 6e 6c 79 20 72 65 2d 65 73 74 61 62 6c 69 73 68  nly re-establish
1b960 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b   the shared lock
1b970 20 69 66 20 6e 65 63 65 73 73 61 72 79 20 2a 2f   if necessary */
1b980 0a 20 20 20 20 20 20 20 20 69 6e 74 20 73 68 61  .        int sha
1b990 72 65 64 4c 6f 63 6b 42 79 74 65 20 3d 20 53 48  redLockByte = SH
1b9a0 41 52 45 44 5f 46 49 52 53 54 2b 70 49 6e 6f 64  ARED_FIRST+pInod
1b9b0 65 2d 3e 73 68 61 72 65 64 42 79 74 65 3b 0a 20  e->sharedByte;. 
1b9c0 20 20 20 20 20 20 20 72 63 20 3d 20 61 66 70 53         rc = afpS
1b9d0 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
1b9e0 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 73  dbPath, pFile, s
1b9f0 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c 20 31  haredLockByte, 1
1ba00 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 20 65 6c  , 1);.      } el
1ba10 73 65 20 7b 0a 20 20 20 20 20 20 20 20 73 6b 69  se {.        ski
1ba20 70 53 68 61 72 65 64 20 3d 20 31 3b 0a 20 20 20  pShared = 1;.   
1ba30 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
1ba40 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1ba50 20 26 26 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65   && pFile->eFile
1ba60 4c 6f 63 6b 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f  Lock>=PENDING_LO
1ba70 43 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  CK ){.      rc =
1ba80 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74   afpSetLock(cont
1ba90 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69  ext->dbPath, pFi
1baa0 6c 65 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  le, PENDING_BYTE
1bab0 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 7d 20 0a  , 1, 0);.    } .
1bac0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1bad0 54 45 5f 4f 4b 20 26 26 20 70 46 69 6c 65 2d 3e  TE_OK && pFile->
1bae0 65 46 69 6c 65 4c 6f 63 6b 3e 3d 52 45 53 45 52  eFileLock>=RESER
1baf0 56 45 44 5f 4c 4f 43 4b 20 26 26 20 63 6f 6e 74  VED_LOCK && cont
1bb00 65 78 74 2d 3e 72 65 73 65 72 76 65 64 20 29 7b  ext->reserved ){
1bb10 0a 20 20 20 20 20 20 72 63 20 3d 20 61 66 70 53  .      rc = afpS
1bb20 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
1bb30 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 52  dbPath, pFile, R
1bb40 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 31 2c  ESERVED_BYTE, 1,
1bb50 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21   0);.      if( !
1bb60 72 63 20 29 7b 20 0a 20 20 20 20 20 20 20 20 63  rc ){ .        c
1bb70 6f 6e 74 65 78 74 2d 3e 72 65 73 65 72 76 65 64  ontext->reserved
1bb80 20 3d 20 30 3b 20 0a 20 20 20 20 20 20 7d 0a 20   = 0; .      }. 
1bb90 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
1bba0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 28 65  =SQLITE_OK && (e
1bbb0 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
1bbc0 5f 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d  _LOCK || pInode-
1bbd0 3e 6e 53 68 61 72 65 64 3e 31 29 29 7b 0a 20 20  >nShared>1)){.  
1bbe0 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c      pInode->eFil
1bbf0 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c  eLock = SHARED_L
1bc00 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  OCK;.    }.  }. 
1bc10 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1bc20 4f 4b 20 26 26 20 65 46 69 6c 65 4c 6f 63 6b 3d  OK && eFileLock=
1bc30 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 0a 20 20 20  =NO_LOCK ){..   
1bc40 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68   /* Decrement th
1bc50 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 63 6f  e shared lock co
1bc60 75 6e 74 65 72 2e 20 20 52 65 6c 65 61 73 65 20  unter.  Release 
1bc70 74 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20 61  the lock using a
1bc80 6e 0a 20 20 20 20 2a 2a 20 4f 53 20 63 61 6c 6c  n.    ** OS call
1bc90 20 6f 6e 6c 79 20 77 68 65 6e 20 61 6c 6c 20 74   only when all t
1bca0 68 72 65 61 64 73 20 69 6e 20 74 68 69 73 20 73  hreads in this s
1bcb0 61 6d 65 20 70 72 6f 63 65 73 73 20 68 61 76 65  ame process have
1bcc0 20 72 65 6c 65 61 73 65 64 0a 20 20 20 20 2a 2a   released.    **
1bcd0 20 74 68 65 20 6c 6f 63 6b 2e 0a 20 20 20 20 2a   the lock..    *
1bce0 2f 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 6c  /.    unsigned l
1bcf0 6f 6e 67 20 6c 6f 6e 67 20 73 68 61 72 65 64 4c  ong long sharedL
1bd00 6f 63 6b 42 79 74 65 20 3d 20 53 48 41 52 45 44  ockByte = SHARED
1bd10 5f 46 49 52 53 54 2b 70 49 6e 6f 64 65 2d 3e 73  _FIRST+pInode->s
1bd20 68 61 72 65 64 42 79 74 65 3b 0a 20 20 20 20 70  haredByte;.    p
1bd30 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2d 2d  Inode->nShared--
1bd40 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65  ;.    if( pInode
1bd50 2d 3e 6e 53 68 61 72 65 64 3d 3d 30 20 29 7b 0a  ->nShared==0 ){.
1bd60 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f        SimulateIO
1bd70 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29 3b 0a  ErrorBenign(1);.
1bd80 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f        SimulateIO
1bd90 45 72 72 6f 72 28 20 68 3d 28 2d 31 29 20 29 0a  Error( h=(-1) ).
1bda0 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f        SimulateIO
1bdb0 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29 3b 0a  ErrorBenign(0);.
1bdc0 20 20 20 20 20 20 69 66 28 20 21 73 6b 69 70 53        if( !skipS
1bdd0 68 61 72 65 64 20 29 7b 0a 20 20 20 20 20 20 20  hared ){.       
1bde0 20 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b   rc = afpSetLock
1bdf0 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68  (context->dbPath
1be00 2c 20 70 46 69 6c 65 2c 20 73 68 61 72 65 64 4c  , pFile, sharedL
1be10 6f 63 6b 42 79 74 65 2c 20 31 2c 20 30 29 3b 0a  ockByte, 1, 0);.
1be20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
1be30 28 20 21 72 63 20 29 7b 0a 20 20 20 20 20 20 20  ( !rc ){.       
1be40 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f   pInode->eFileLo
1be50 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20  ck = NO_LOCK;.  
1be60 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69        pFile->eFi
1be70 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b  leLock = NO_LOCK
1be80 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1be90 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1bea0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
1beb0 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2d 2d 3b 0a  Inode->nLock--;.
1bec0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
1bed0 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e 3d 30 20 29  node->nLock>=0 )
1bee0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 6e 6f  ;.      if( pIno
1bef0 64 65 2d 3e 6e 4c 6f 63 6b 3d 3d 30 20 29 7b 0a  de->nLock==0 ){.
1bf00 20 20 20 20 20 20 20 20 63 6c 6f 73 65 50 65 6e          closePen
1bf10 64 69 6e 67 46 64 73 28 70 46 69 6c 65 29 3b 0a  dingFds(pFile);.
1bf20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1bf30 7d 0a 20 20 0a 20 20 75 6e 69 78 4c 65 61 76 65  }.  .  unixLeave
1bf40 4d 75 74 65 78 28 29 3b 0a 20 20 69 66 28 20 72  Mutex();.  if( r
1bf50 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70  c==SQLITE_OK ) p
1bf60 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20  File->eFileLock 
1bf70 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 72  = eFileLock;.  r
1bf80 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1bf90 2a 2a 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 20  ** Close a file 
1bfa0 26 20 63 6c 65 61 6e 75 70 20 41 46 50 20 73 70  & cleanup AFP sp
1bfb0 65 63 69 66 69 63 20 6c 6f 63 6b 69 6e 67 20 63  ecific locking c
1bfc0 6f 6e 74 65 78 74 20 0a 2a 2f 0a 73 74 61 74 69  ontext .*/.stati
1bfd0 63 20 69 6e 74 20 61 66 70 43 6c 6f 73 65 28 73  c int afpClose(s
1bfe0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29  qlite3_file *id)
1bff0 20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51   {.  int rc = SQ
1c000 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 69  LITE_OK;.  if( i
1c010 64 20 29 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c  d ){.    unixFil
1c020 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
1c030 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20 61 66  File*)id;.    af
1c040 70 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c  pUnlock(id, NO_L
1c050 4f 43 4b 29 3b 0a 20 20 20 20 75 6e 69 78 45 6e  OCK);.    unixEn
1c060 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20  terMutex();.    
1c070 69 66 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  if( pFile->pInod
1c080 65 20 26 26 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  e && pFile->pIno
1c090 64 65 2d 3e 6e 4c 6f 63 6b 20 29 7b 0a 20 20 20  de->nLock ){.   
1c0a0 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61     /* If there a
1c0b0 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c  re outstanding l
1c0c0 6f 63 6b 73 2c 20 64 6f 20 6e 6f 74 20 61 63 74  ocks, do not act
1c0d0 75 61 6c 6c 79 20 63 6c 6f 73 65 20 74 68 65 20  ually close the 
1c0e0 66 69 6c 65 20 6a 75 73 74 0a 20 20 20 20 20 20  file just.      
1c0f0 2a 2a 20 79 65 74 20 62 65 63 61 75 73 65 20 74  ** yet because t
1c100 68 61 74 20 77 6f 75 6c 64 20 63 6c 65 61 72 20  hat would clear 
1c110 74 68 6f 73 65 20 6c 6f 63 6b 73 2e 20 20 49 6e  those locks.  In
1c120 73 74 65 61 64 2c 20 61 64 64 20 74 68 65 20 66  stead, add the f
1c130 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 64 65 73  ile.      ** des
1c140 63 72 69 70 74 6f 72 20 74 6f 20 70 49 6e 6f 64  criptor to pInod
1c150 65 2d 3e 61 50 65 6e 64 69 6e 67 2e 20 20 49 74  e->aPending.  It
1c160 20 77 69 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74   will be automat
1c170 69 63 61 6c 6c 79 20 63 6c 6f 73 65 64 20 77 68  ically closed wh
1c180 65 6e 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  en.      ** the 
1c190 6c 61 73 74 20 6c 6f 63 6b 20 69 73 20 63 6c 65  last lock is cle
1c1a0 61 72 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ared..      */. 
1c1b0 20 20 20 20 20 73 65 74 50 65 6e 64 69 6e 67 46       setPendingF
1c1c0 64 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a  d(pFile);.    }.
1c1d0 20 20 20 20 72 65 6c 65 61 73 65 49 6e 6f 64 65      releaseInode
1c1e0 49 6e 66 6f 28 70 46 69 6c 65 29 3b 0a 20 20 20  Info(pFile);.   
1c1f0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 46   sqlite3_free(pF
1c200 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
1c210 65 78 74 29 3b 0a 20 20 20 20 72 63 20 3d 20 63  ext);.    rc = c
1c220 6c 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29  loseUnixFile(id)
1c230 3b 0a 20 20 20 20 75 6e 69 78 4c 65 61 76 65 4d  ;.    unixLeaveM
1c240 75 74 65 78 28 29 3b 0a 20 20 7d 0a 20 20 72 65  utex();.  }.  re
1c250 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6e 64  turn rc;.}..#end
1c260 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 5f  if /* defined(__
1c270 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49  APPLE__) && SQLI
1c280 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
1c290 47 5f 53 54 59 4c 45 20 2a 2f 0a 2f 2a 0a 2a 2a  G_STYLE */./*.**
1c2a0 20 54 68 65 20 63 6f 64 65 20 61 62 6f 76 65 20   The code above 
1c2b0 69 73 20 74 68 65 20 41 46 50 20 6c 6f 63 6b 20  is the AFP lock 
1c2c0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 20  implementation. 
1c2d0 20 54 68 65 20 63 6f 64 65 20 69 73 20 73 70 65   The code is spe
1c2e0 63 69 66 69 63 0a 2a 2a 20 74 6f 20 4d 61 63 4f  cific.** to MacO
1c2f0 53 58 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20  SX and does not 
1c300 77 6f 72 6b 20 6f 6e 20 6f 74 68 65 72 20 75 6e  work on other un
1c310 69 78 20 70 6c 61 74 66 6f 72 6d 73 2e 20 20 4e  ix platforms.  N
1c320 6f 20 61 6c 74 65 72 6e 61 74 69 76 65 0a 2a 2a  o alternative.**
1c330 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 20 20   is available.  
1c340 49 66 20 79 6f 75 20 64 6f 6e 27 74 20 63 6f 6d  If you don't com
1c350 70 69 6c 65 20 66 6f 72 20 61 20 6d 61 63 2c 20  pile for a mac, 
1c360 74 68 65 6e 20 74 68 65 20 22 75 6e 69 78 2d 61  then the "unix-a
1c370 66 70 22 0a 2a 2a 20 56 46 53 20 69 73 20 6e 6f  fp".** VFS is no
1c380 74 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a  t available..**.
1c390 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c3a0 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65  ***** End of the
1c3b0 20 41 46 50 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d   AFP lock implem
1c3c0 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a  entation *******
1c3d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
1c3e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c3f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c400 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c410 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c420 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a  **************/.
1c430 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
1c440 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c450 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c460 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c470 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c480 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .***************
1c490 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42 65 67  ************ Beg
1c4a0 69 6e 20 4e 46 53 20 4c 6f 63 6b 69 6e 67 20 2a  in NFS Locking *
1c4b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c4c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f  ***************/
1c4d0 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f  ..#if defined(__
1c4e0 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49  APPLE__) && SQLI
1c4f0 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
1c500 47 5f 53 54 59 4c 45 0a 2f 2a 0a 20 2a 2a 20 4c  G_STYLE./*. ** L
1c510 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67  ower the locking
1c520 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64   level on file d
1c530 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65 20  escriptor pFile 
1c540 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65  to eFileLock.  e
1c550 46 69 6c 65 4c 6f 63 6b 0a 20 2a 2a 20 6d 75 73  FileLock. ** mus
1c560 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c  t be either NO_L
1c570 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f  OCK or SHARED_LO
1c580 43 4b 2e 0a 20 2a 2a 0a 20 2a 2a 20 49 66 20 74  CK.. **. ** If t
1c590 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  he locking level
1c5a0 20 6f 66 20 74 68 65 20 66 69 6c 65 20 64 65 73   of the file des
1c5b0 63 72 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61  criptor is alrea
1c5c0 64 79 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 20  dy at or below. 
1c5d0 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ** the requested
1c5e0 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20   locking level, 
1c5f0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
1c600 61 20 6e 6f 2d 6f 70 2e 0a 20 2a 2f 0a 73 74 61  a no-op.. */.sta
1c610 74 69 63 20 69 6e 74 20 6e 66 73 55 6e 6c 6f 63  tic int nfsUnloc
1c620 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
1c630 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63  id, int eFileLoc
1c640 6b 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 6f 73  k){.  return pos
1c650 69 78 55 6e 6c 6f 63 6b 28 69 64 2c 20 65 46 69  ixUnlock(id, eFi
1c660 6c 65 4c 6f 63 6b 2c 20 31 29 3b 0a 7d 0a 0a 23  leLock, 1);.}..#
1c670 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64  endif /* defined
1c680 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53  (__APPLE__) && S
1c690 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
1c6a0 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 2f 2a  KING_STYLE */./*
1c6b0 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 61 62 6f  .** The code abo
1c6c0 76 65 20 69 73 20 74 68 65 20 4e 46 53 20 6c 6f  ve is the NFS lo
1c6d0 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ck implementatio
1c6e0 6e 2e 20 20 54 68 65 20 63 6f 64 65 20 69 73 20  n.  The code is 
1c6f0 73 70 65 63 69 66 69 63 0a 2a 2a 20 74 6f 20 4d  specific.** to M
1c700 61 63 4f 53 58 20 61 6e 64 20 64 6f 65 73 20 6e  acOSX and does n
1c710 6f 74 20 77 6f 72 6b 20 6f 6e 20 6f 74 68 65 72  ot work on other
1c720 20 75 6e 69 78 20 70 6c 61 74 66 6f 72 6d 73 2e   unix platforms.
1c730 20 20 4e 6f 20 61 6c 74 65 72 6e 61 74 69 76 65    No alternative
1c740 0a 2a 2a 20 69 73 20 61 76 61 69 6c 61 62 6c 65  .** is available
1c750 2e 20 20 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .  .**.*********
1c760 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64  ************ End
1c770 20 6f 66 20 74 68 65 20 4e 46 53 20 6c 6f 63 6b   of the NFS lock
1c780 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
1c790 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c7a0 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ******.*********
1c7b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c7c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c7d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c7e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c7f0 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  *****/../*******
1c800 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c810 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c820 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c830 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c840 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
1c850 2a 2a 2a 2a 2a 2a 2a 2a 20 4e 6f 6e 2d 6c 6f 63  ******** Non-loc
1c860 6b 69 6e 67 20 73 71 6c 69 74 65 33 5f 66 69 6c  king sqlite3_fil
1c870 65 20 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a  e methods ******
1c880 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1c890 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68  *******.**.** Th
1c8a0 65 20 6e 65 78 74 20 64 69 76 69 73 69 6f 6e 20  e next division 
1c8b0 63 6f 6e 74 61 69 6e 73 20 69 6d 70 6c 65 6d 65  contains impleme
1c8c0 6e 74 61 74 69 6f 6e 73 20 66 6f 72 20 61 6c 6c  ntations for all
1c8d0 20 6d 65 74 68 6f 64 73 20 6f 66 20 74 68 65 20   methods of the 
1c8e0 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  .** sqlite3_file
1c8f0 20 6f 62 6a 65 63 74 20 6f 74 68 65 72 20 74 68   object other th
1c900 61 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6d  an the locking m
1c910 65 74 68 6f 64 73 2e 20 20 54 68 65 20 6c 6f 63  ethods.  The loc
1c920 6b 69 6e 67 0a 2a 2a 20 6d 65 74 68 6f 64 73 20  king.** methods 
1c930 77 65 72 65 20 64 65 66 69 6e 65 64 20 69 6e 20  were defined in 
1c940 64 69 76 69 73 69 6f 6e 73 20 61 62 6f 76 65 20  divisions above 
1c950 28 6f 6e 65 20 6c 6f 63 6b 69 6e 67 20 6d 65 74  (one locking met
1c960 68 6f 64 20 70 65 72 0a 2a 2a 20 64 69 76 69 73  hod per.** divis
1c970 69 6f 6e 29 2e 20 20 54 68 6f 73 65 20 6d 65 74  ion).  Those met
1c980 68 6f 64 73 20 74 68 61 74 20 61 72 65 20 63 6f  hods that are co
1c990 6d 6d 6f 6e 20 74 6f 20 61 6c 6c 20 6c 6f 63 6b  mmon to all lock
1c9a0 69 6e 67 20 6d 6f 64 65 73 0a 2a 2a 20 61 72 65  ing modes.** are
1c9b0 20 67 61 74 68 65 72 20 74 6f 67 65 74 68 65 72   gather together
1c9c0 20 69 6e 74 6f 20 74 68 69 73 20 64 69 76 69 73   into this divis
1c9d0 69 6f 6e 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53  ion..*/../*.** S
1c9e0 65 65 6b 20 74 6f 20 74 68 65 20 6f 66 66 73 65  eek to the offse
1c9f0 74 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  t passed as the 
1ca00 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2c  second argument,
1ca10 20 74 68 65 6e 20 72 65 61 64 20 63 6e 74 20 0a   then read cnt .
1ca20 2a 2a 20 62 79 74 65 73 20 69 6e 74 6f 20 70 42  ** bytes into pB
1ca30 75 66 2e 20 52 65 74 75 72 6e 20 74 68 65 20 6e  uf. Return the n
1ca40 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 61  umber of bytes a
1ca50 63 74 75 61 6c 6c 79 20 72 65 61 64 2e 0a 2a 2a  ctually read..**
1ca60 0a 2a 2a 20 4e 42 3a 20 20 49 66 20 79 6f 75 20  .** NB:  If you 
1ca70 64 65 66 69 6e 65 20 55 53 45 5f 50 52 45 41 44  define USE_PREAD
1ca80 20 6f 72 20 55 53 45 5f 50 52 45 41 44 36 34 2c   or USE_PREAD64,
1ca90 20 74 68 65 6e 20 69 74 20 6d 69 67 68 74 20 61   then it might a
1caa0 6c 73 6f 0a 2a 2a 20 62 65 20 6e 65 63 65 73 73  lso.** be necess
1cab0 61 72 79 20 74 6f 20 64 65 66 69 6e 65 20 5f 58  ary to define _X
1cac0 4f 50 45 4e 5f 53 4f 55 52 43 45 20 74 6f 20 62  OPEN_SOURCE to b
1cad0 65 20 35 30 30 2e 20 20 54 68 69 73 20 76 61 72  e 500.  This var
1cae0 69 65 73 20 66 72 6f 6d 0a 2a 2a 20 6f 6e 65 20  ies from.** one 
1caf0 73 79 73 74 65 6d 20 74 6f 20 61 6e 6f 74 68 65  system to anothe
1cb00 72 2e 20 20 53 69 6e 63 65 20 53 51 4c 69 74 65  r.  Since SQLite
1cb10 20 64 6f 65 73 20 6e 6f 74 20 64 65 66 69 6e 65   does not define
1cb20 20 55 53 45 5f 50 52 45 41 44 0a 2a 2a 20 69 6e   USE_PREAD.** in
1cb30 20 61 6e 79 20 66 6f 72 6d 20 62 79 20 64 65 66   any form by def
1cb40 61 75 6c 74 2c 20 77 65 20 77 69 6c 6c 20 6e 6f  ault, we will no
1cb50 74 20 61 74 74 65 6d 70 74 20 74 6f 20 64 65 66  t attempt to def
1cb60 69 6e 65 20 5f 58 4f 50 45 4e 5f 53 4f 55 52 43  ine _XOPEN_SOURC
1cb70 45 2e 0a 2a 2a 20 53 65 65 20 74 69 63 6b 65 74  E..** See ticket
1cb80 73 20 23 32 37 34 31 20 61 6e 64 20 23 32 36 38  s #2741 and #268
1cb90 31 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 76 6f 69  1..**.** To avoi
1cba0 64 20 73 74 6f 6d 70 69 6e 67 20 74 68 65 20 65  d stomping the e
1cbb0 72 72 6e 6f 20 76 61 6c 75 65 20 6f 6e 20 61 20  rrno value on a 
1cbc0 66 61 69 6c 65 64 20 72 65 61 64 20 74 68 65 20  failed read the 
1cbd0 6c 61 73 74 45 72 72 6e 6f 20 76 61 6c 75 65 0a  lastErrno value.
1cbe0 2a 2a 20 69 73 20 73 65 74 20 62 65 66 6f 72 65  ** is set before
1cbf0 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73   returning..*/.s
1cc00 74 61 74 69 63 20 69 6e 74 20 73 65 65 6b 41 6e  tatic int seekAn
1cc10 64 52 65 61 64 28 75 6e 69 78 46 69 6c 65 20 2a  dRead(unixFile *
1cc20 69 64 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  id, sqlite3_int6
1cc30 34 20 6f 66 66 73 65 74 2c 20 76 6f 69 64 20 2a  4 offset, void *
1cc40 70 42 75 66 2c 20 69 6e 74 20 63 6e 74 29 7b 0a  pBuf, int cnt){.
1cc50 20 20 69 6e 74 20 67 6f 74 3b 0a 20 20 69 6e 74    int got;.  int
1cc60 20 70 72 69 6f 72 20 3d 20 30 3b 0a 23 69 66 20   prior = 0;.#if 
1cc70 28 21 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52  (!defined(USE_PR
1cc80 45 41 44 29 20 26 26 20 21 64 65 66 69 6e 65 64  EAD) && !defined
1cc90 28 55 53 45 5f 50 52 45 41 44 36 34 29 29 0a 20  (USE_PREAD64)). 
1cca0 20 69 36 34 20 6e 65 77 4f 66 66 73 65 74 3b 0a   i64 newOffset;.
1ccb0 23 65 6e 64 69 66 0a 20 20 54 49 4d 45 52 5f 53  #endif.  TIMER_S
1ccc0 54 41 52 54 3b 0a 20 20 61 73 73 65 72 74 28 20  TART;.  assert( 
1ccd0 63 6e 74 3d 3d 28 63 6e 74 26 30 78 31 66 66 66  cnt==(cnt&0x1fff
1cce0 66 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  f) );.  assert( 
1ccf0 69 64 2d 3e 68 3e 32 20 29 3b 0a 20 20 64 6f 7b  id->h>2 );.  do{
1cd00 0a 23 69 66 20 64 65 66 69 6e 65 64 28 55 53 45  .#if defined(USE
1cd10 5f 50 52 45 41 44 29 0a 20 20 20 20 67 6f 74 20  _PREAD).    got 
1cd20 3d 20 6f 73 50 72 65 61 64 28 69 64 2d 3e 68 2c  = osPread(id->h,
1cd30 20 70 42 75 66 2c 20 63 6e 74 2c 20 6f 66 66 73   pBuf, cnt, offs
1cd40 65 74 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74  et);.    Simulat
1cd50 65 49 4f 45 72 72 6f 72 28 20 67 6f 74 20 3d 20  eIOError( got = 
1cd60 2d 31 20 29 3b 0a 23 65 6c 69 66 20 64 65 66 69  -1 );.#elif defi
1cd70 6e 65 64 28 55 53 45 5f 50 52 45 41 44 36 34 29  ned(USE_PREAD64)
1cd80 0a 20 20 20 20 67 6f 74 20 3d 20 6f 73 50 72 65  .    got = osPre
1cd90 61 64 36 34 28 69 64 2d 3e 68 2c 20 70 42 75 66  ad64(id->h, pBuf
1cda0 2c 20 63 6e 74 2c 20 6f 66 66 73 65 74 29 3b 0a  , cnt, offset);.
1cdb0 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72      SimulateIOEr
1cdc0 72 6f 72 28 20 67 6f 74 20 3d 20 2d 31 20 29 3b  ror( got = -1 );
1cdd0 0a 23 65 6c 73 65 0a 20 20 20 20 6e 65 77 4f 66  .#else.    newOf
1cde0 66 73 65 74 20 3d 20 6c 73 65 65 6b 28 69 64 2d  fset = lseek(id-
1cdf0 3e 68 2c 20 6f 66 66 73 65 74 2c 20 53 45 45 4b  >h, offset, SEEK
1ce00 5f 53 45 54 29 3b 0a 20 20 20 20 53 69 6d 75 6c  _SET);.    Simul
1ce10 61 74 65 49 4f 45 72 72 6f 72 28 20 6e 65 77 4f  ateIOError( newO
1ce20 66 66 73 65 74 2d 2d 20 29 3b 0a 20 20 20 20 69  ffset-- );.    i
1ce30 66 28 20 6e 65 77 4f 66 66 73 65 74 21 3d 6f 66  f( newOffset!=of
1ce40 66 73 65 74 20 29 7b 0a 20 20 20 20 20 20 69 66  fset ){.      if
1ce50 28 20 6e 65 77 4f 66 66 73 65 74 20 3d 3d 20 2d  ( newOffset == -
1ce60 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74 6f  1 ){.        sto
1ce70 72 65 4c 61 73 74 45 72 72 6e 6f 28 28 75 6e 69  reLastErrno((uni
1ce80 78 46 69 6c 65 2a 29 69 64 2c 20 65 72 72 6e 6f  xFile*)id, errno
1ce90 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
1cea0 20 20 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73          storeLas
1ceb0 74 45 72 72 6e 6f 28 28 75 6e 69 78 46 69 6c 65  tErrno((unixFile
1cec0 2a 29 69 64 2c 20 30 29 3b 0a 20 20 20 20 20 20  *)id, 0);.      
1ced0 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d  }.      return -
1cee0 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 67 6f 74  1;.    }.    got
1cef0 20 3d 20 6f 73 52 65 61 64 28 69 64 2d 3e 68 2c   = osRead(id->h,
1cf00 20 70 42 75 66 2c 20 63 6e 74 29 3b 0a 23 65 6e   pBuf, cnt);.#en
1cf10 64 69 66 0a 20 20 20 20 69 66 28 20 67 6f 74 3d  dif.    if( got=
1cf20 3d 63 6e 74 20 29 20 62 72 65 61 6b 3b 0a 20 20  =cnt ) break;.  
1cf30 20 20 69 66 28 20 67 6f 74 3c 30 20 29 7b 0a 20    if( got<0 ){. 
1cf40 20 20 20 20 20 69 66 28 20 65 72 72 6e 6f 3d 3d       if( errno==
1cf50 45 49 4e 54 52 20 29 7b 20 67 6f 74 20 3d 20 31  EINTR ){ got = 1
1cf60 3b 20 63 6f 6e 74 69 6e 75 65 3b 20 7d 0a 20 20  ; continue; }.  
1cf70 20 20 20 20 70 72 69 6f 72 20 3d 20 30 3b 0a 20      prior = 0;. 
1cf80 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72       storeLastEr
1cf90 72 6e 6f 28 28 75 6e 69 78 46 69 6c 65 2a 29 69  rno((unixFile*)i
1cfa0 64 2c 20 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20  d,  errno);.    
1cfb0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 65 6c    break;.    }el
1cfc0 73 65 20 69 66 28 20 67 6f 74 3e 30 20 29 7b 0a  se if( got>0 ){.
1cfd0 20 20 20 20 20 20 63 6e 74 20 2d 3d 20 67 6f 74        cnt -= got
1cfe0 3b 0a 20 20 20 20 20 20 6f 66 66 73 65 74 20 2b  ;.      offset +
1cff0 3d 20 67 6f 74 3b 0a 20 20 20 20 20 20 70 72 69  = got;.      pri
1d000 6f 72 20 2b 3d 20 67 6f 74 3b 0a 20 20 20 20 20  or += got;.     
1d010 20 70 42 75 66 20 3d 20 28 76 6f 69 64 2a 29 28   pBuf = (void*)(
1d020 67 6f 74 20 2b 20 28 63 68 61 72 2a 29 70 42 75  got + (char*)pBu
1d030 66 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69  f);.    }.  }whi
1d040 6c 65 28 20 67 6f 74 3e 30 20 29 3b 0a 20 20 54  le( got>0 );.  T
1d050 49 4d 45 52 5f 45 4e 44 3b 0a 20 20 4f 53 54 52  IMER_END;.  OSTR
1d060 41 43 45 28 28 22 52 45 41 44 20 20 20 20 25 2d  ACE(("READ    %-
1d070 33 64 20 25 35 64 20 25 37 6c 6c 64 20 25 6c 6c  3d %5d %7lld %ll
1d080 75 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  u\n",.          
1d090 20 20 69 64 2d 3e 68 2c 20 67 6f 74 2b 70 72 69    id->h, got+pri
1d0a0 6f 72 2c 20 6f 66 66 73 65 74 2d 70 72 69 6f 72  or, offset-prior
1d0b0 2c 20 54 49 4d 45 52 5f 45 4c 41 50 53 45 44 29  , TIMER_ELAPSED)
1d0c0 29 3b 0a 20 20 72 65 74 75 72 6e 20 67 6f 74 2b  );.  return got+
1d0d0 70 72 69 6f 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  prior;.}../*.** 
1d0e0 52 65 61 64 20 64 61 74 61 20 66 72 6f 6d 20 61  Read data from a
1d0f0 20 66 69 6c 65 20 69 6e 74 6f 20 61 20 62 75 66   file into a buf
1d100 66 65 72 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  fer.  Return SQL
1d110 49 54 45 5f 4f 4b 20 69 66 20 61 6c 6c 0a 2a 2a  ITE_OK if all.**
1d120 20 62 79 74 65 73 20 77 65 72 65 20 72 65 61 64   bytes were read
1d130 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 61 6e   successfully an
1d140 64 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 69  d SQLITE_IOERR i
1d150 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a  f anything goes.
1d160 2a 2a 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61  ** wrong..*/.sta
1d170 74 69 63 20 69 6e 74 20 75 6e 69 78 52 65 61 64  tic int unixRead
1d180 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  (.  sqlite3_file
1d190 20 2a 69 64 2c 20 0a 20 20 76 6f 69 64 20 2a 70   *id, .  void *p
1d1a0 42 75 66 2c 20 0a 20 20 69 6e 74 20 61 6d 74 2c  Buf, .  int amt,
1d1b0 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
1d1c0 20 6f 66 66 73 65 74 0a 29 7b 0a 20 20 75 6e 69   offset.){.  uni
1d1d0 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
1d1e0 75 6e 69 78 46 69 6c 65 20 2a 29 69 64 3b 0a 20  unixFile *)id;. 
1d1f0 20 69 6e 74 20 67 6f 74 3b 0a 20 20 61 73 73 65   int got;.  asse
1d200 72 74 28 20 69 64 20 29 3b 0a 20 20 61 73 73 65  rt( id );.  asse
1d210 72 74 28 20 6f 66 66 73 65 74 3e 3d 30 20 29 3b  rt( offset>=0 );
1d220 0a 20 20 61 73 73 65 72 74 28 20 61 6d 74 3e 30  .  assert( amt>0
1d230 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69   );..  /* If thi
1d240 73 20 69 73 20 61 20 64 61 74 61 62 61 73 65 20  s is a database 
1d250 66 69 6c 65 20 28 6e 6f 74 20 61 20 6a 6f 75 72  file (not a jour
1d260 6e 61 6c 2c 20 6d 61 73 74 65 72 2d 6a 6f 75 72  nal, master-jour
1d270 6e 61 6c 20 6f 72 20 74 65 6d 70 0a 20 20 2a 2a  nal or temp.  **
1d280 20 66 69 6c 65 29 2c 20 74 68 65 20 62 79 74 65   file), the byte
1d290 73 20 69 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67  s in the locking
1d2a0 20 72 61 6e 67 65 20 73 68 6f 75 6c 64 20 6e 65   range should ne
1d2b0 76 65 72 20 62 65 20 72 65 61 64 20 6f 72 20 77  ver be read or w
1d2c0 72 69 74 74 65 6e 2e 20 2a 2f 0a 23 69 66 20 30  ritten. */.#if 0
1d2d0 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
1d2e0 2d 3e 70 55 6e 75 73 65 64 3d 3d 30 0a 20 20 20  ->pUnused==0.   
1d2f0 20 20 20 20 7c 7c 20 6f 66 66 73 65 74 3e 3d 50      || offset>=P
1d300 45 4e 44 49 4e 47 5f 42 59 54 45 2b 35 31 32 0a  ENDING_BYTE+512.
1d310 20 20 20 20 20 20 20 7c 7c 20 6f 66 66 73 65 74         || offset
1d320 2b 61 6d 74 3c 3d 50 45 4e 44 49 4e 47 5f 42 59  +amt<=PENDING_BY
1d330 54 45 20 0a 20 20 29 3b 0a 23 65 6e 64 69 66 0a  TE .  );.#endif.
1d340 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
1d350 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20 2f 2a  MMAP_SIZE>0.  /*
1d360 20 44 65 61 6c 20 77 69 74 68 20 61 73 20 6d 75   Deal with as mu
1d370 63 68 20 6f 66 20 74 68 69 73 20 72 65 61 64 20  ch of this read 
1d380 72 65 71 75 65 73 74 20 61 73 20 70 6f 73 73 69  request as possi
1d390 62 6c 65 20 62 79 20 74 72 61 6e 73 66 65 72 69  ble by transferi
1d3a0 6e 67 0a 20 20 2a 2a 20 64 61 74 61 20 66 72 6f  ng.  ** data fro
1d3b0 6d 20 74 68 65 20 6d 65 6d 6f 72 79 20 6d 61 70  m the memory map
1d3c0 70 69 6e 67 20 75 73 69 6e 67 20 6d 65 6d 63 70  ping using memcp
1d3d0 79 28 29 2e 20 20 2a 2f 0a 20 20 69 66 28 20 6f  y().  */.  if( o
1d3e0 66 66 73 65 74 3c 70 46 69 6c 65 2d 3e 6d 6d 61  ffset<pFile->mma
1d3f0 70 53 69 7a 65 20 29 7b 0a 20 20 20 20 69 66 28  pSize ){.    if(
1d400 20 6f 66 66 73 65 74 2b 61 6d 74 20 3c 3d 20 70   offset+amt <= p
1d410 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29  File->mmapSize )
1d420 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70  {.      memcpy(p
1d430 42 75 66 2c 20 26 28 28 75 38 20 2a 29 28 70 46  Buf, &((u8 *)(pF
1d440 69 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29  ile->pMapRegion)
1d450 29 5b 6f 66 66 73 65 74 5d 2c 20 61 6d 74 29 3b  )[offset], amt);
1d460 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1d470 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c  LITE_OK;.    }el
1d480 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 43  se{.      int nC
1d490 6f 70 79 20 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61  opy = pFile->mma
1d4a0 70 53 69 7a 65 20 2d 20 6f 66 66 73 65 74 3b 0a  pSize - offset;.
1d4b0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 42 75        memcpy(pBu
1d4c0 66 2c 20 26 28 28 75 38 20 2a 29 28 70 46 69 6c  f, &((u8 *)(pFil
1d4d0 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 29 5b  e->pMapRegion))[
1d4e0 6f 66 66 73 65 74 5d 2c 20 6e 43 6f 70 79 29 3b  offset], nCopy);
1d4f0 0a 20 20 20 20 20 20 70 42 75 66 20 3d 20 26 28  .      pBuf = &(
1d500 28 75 38 20 2a 29 70 42 75 66 29 5b 6e 43 6f 70  (u8 *)pBuf)[nCop
1d510 79 5d 3b 0a 20 20 20 20 20 20 61 6d 74 20 2d 3d  y];.      amt -=
1d520 20 6e 43 6f 70 79 3b 0a 20 20 20 20 20 20 6f 66   nCopy;.      of
1d530 66 73 65 74 20 2b 3d 20 6e 43 6f 70 79 3b 0a 20  fset += nCopy;. 
1d540 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
1d550 0a 20 20 67 6f 74 20 3d 20 73 65 65 6b 41 6e 64  .  got = seekAnd
1d560 52 65 61 64 28 70 46 69 6c 65 2c 20 6f 66 66 73  Read(pFile, offs
1d570 65 74 2c 20 70 42 75 66 2c 20 61 6d 74 29 3b 0a  et, pBuf, amt);.
1d580 20 20 69 66 28 20 67 6f 74 3d 3d 61 6d 74 20 29    if( got==amt )
1d590 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
1d5a0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 20  ITE_OK;.  }else 
1d5b0 69 66 28 20 67 6f 74 3c 30 20 29 7b 0a 20 20 20  if( got<0 ){.   
1d5c0 20 2f 2a 20 6c 61 73 74 45 72 72 6e 6f 20 73 65   /* lastErrno se
1d5d0 74 20 62 79 20 73 65 65 6b 41 6e 64 52 65 61 64  t by seekAndRead
1d5e0 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53   */.    return S
1d5f0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44  QLITE_IOERR_READ
1d600 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
1d610 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46  toreLastErrno(pF
1d620 69 6c 65 2c 20 30 29 3b 20 20 20 2f 2a 20 6e 6f  ile, 0);   /* no
1d630 74 20 61 20 73 79 73 74 65 6d 20 65 72 72 6f 72  t a system error
1d640 20 2a 2f 0a 20 20 20 20 2f 2a 20 55 6e 72 65 61   */.    /* Unrea
1d650 64 20 70 61 72 74 73 20 6f 66 20 74 68 65 20 62  d parts of the b
1d660 75 66 66 65 72 20 6d 75 73 74 20 62 65 20 7a 65  uffer must be ze
1d670 72 6f 2d 66 69 6c 6c 65 64 20 2a 2f 0a 20 20 20  ro-filled */.   
1d680 20 6d 65 6d 73 65 74 28 26 28 28 63 68 61 72 2a   memset(&((char*
1d690 29 70 42 75 66 29 5b 67 6f 74 5d 2c 20 30 2c 20  )pBuf)[got], 0, 
1d6a0 61 6d 74 2d 67 6f 74 29 3b 0a 20 20 20 20 72 65  amt-got);.    re
1d6b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
1d6c0 52 5f 53 48 4f 52 54 5f 52 45 41 44 3b 0a 20 20  R_SHORT_READ;.  
1d6d0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d  }.}../*.** Attem
1d6e0 70 74 20 74 6f 20 73 65 65 6b 20 74 68 65 20 66  pt to seek the f
1d6f0 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 20 70  ile-descriptor p
1d700 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72  assed as the fir
1d710 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 0a 2a  st argument to.*
1d720 2a 20 61 62 73 6f 6c 75 74 65 20 6f 66 66 73 65  * absolute offse
1d730 74 20 69 4f 66 66 2c 20 74 68 65 6e 20 61 74 74  t iOff, then att
1d740 65 6d 70 74 20 74 6f 20 77 72 69 74 65 20 6e 42  empt to write nB
1d750 75 66 20 62 79 74 65 73 20 6f 66 20 64 61 74 61  uf bytes of data
1d760 20 66 72 6f 6d 0a 2a 2a 20 70 42 75 66 20 74 6f   from.** pBuf to
1d770 20 69 74 2e 20 49 66 20 61 6e 20 65 72 72 6f 72   it. If an error
1d780 20 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20   occurs, return 
1d790 2d 31 20 61 6e 64 20 73 65 74 20 2a 70 69 45 72  -1 and set *piEr
1d7a0 72 6e 6f 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  rno. Otherwise, 
1d7b0 0a 2a 2a 20 72 65 74 75 72 6e 20 74 68 65 20 61  .** return the a
1d7c0 63 74 75 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  ctual number of 
1d7d0 62 79 74 65 73 20 77 72 69 74 74 65 6e 20 28 77  bytes written (w
1d7e0 68 69 63 68 20 6d 61 79 20 62 65 20 6c 65 73 73  hich may be less
1d7f0 20 74 68 61 6e 0a 2a 2a 20 6e 42 75 66 29 2e 0a   than.** nBuf)..
1d800 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
1d810 65 6b 41 6e 64 57 72 69 74 65 46 64 28 0a 20 20  ekAndWriteFd(.  
1d820 69 6e 74 20 66 64 2c 20 20 20 20 20 20 20 20 20  int fd,         
1d830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d840 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74  /* File descript
1d850 6f 72 20 74 6f 20 77 72 69 74 65 20 74 6f 20 2a  or to write to *
1d860 2f 0a 20 20 69 36 34 20 69 4f 66 66 2c 20 20 20  /.  i64 iOff,   
1d870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d880 20 20 20 20 2f 2a 20 46 69 6c 65 20 6f 66 66 73      /* File offs
1d890 65 74 20 74 6f 20 62 65 67 69 6e 20 77 72 69 74  et to begin writ
1d8a0 69 6e 67 20 61 74 20 2a 2f 0a 20 20 63 6f 6e 73  ing at */.  cons
1d8b0 74 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20  t void *pBuf,   
1d8c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
1d8d0 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20 74 68  opy data from th
1d8e0 69 73 20 62 75 66 66 65 72 20 74 6f 20 74 68 65  is buffer to the
1d8f0 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   file */.  int n
1d900 42 75 66 2c 20 20 20 20 20 20 20 20 20 20 20 20  Buf,            
1d910 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
1d920 7a 65 20 6f 66 20 62 75 66 66 65 72 20 70 42 75  ze of buffer pBu
1d930 66 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  f in bytes */.  
1d940 69 6e 74 20 2a 70 69 45 72 72 6e 6f 20 20 20 20  int *piErrno    
1d950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d960 2f 2a 20 4f 55 54 3a 20 45 72 72 6f 72 20 6e 75  /* OUT: Error nu
1d970 6d 62 65 72 20 69 66 20 65 72 72 6f 72 20 6f 63  mber if error oc
1d980 63 75 72 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  curs */.){.  int
1d990 20 72 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20   rc = 0;        
1d9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1d9b0 56 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  Value returned b
1d9c0 79 20 73 79 73 74 65 6d 20 63 61 6c 6c 20 2a 2f  y system call */
1d9d0 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 42 75 66  ..  assert( nBuf
1d9e0 3d 3d 28 6e 42 75 66 26 30 78 31 66 66 66 66 29  ==(nBuf&0x1ffff)
1d9f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 66 64   );.  assert( fd
1da00 3e 32 20 29 3b 0a 20 20 6e 42 75 66 20 26 3d 20  >2 );.  nBuf &= 
1da10 30 78 31 66 66 66 66 3b 0a 20 20 54 49 4d 45 52  0x1ffff;.  TIMER
1da20 5f 53 54 41 52 54 3b 0a 0a 23 69 66 20 64 65 66  _START;..#if def
1da30 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 29 0a  ined(USE_PREAD).
1da40 20 20 64 6f 7b 20 72 63 20 3d 20 28 69 6e 74 29    do{ rc = (int)
1da50 6f 73 50 77 72 69 74 65 28 66 64 2c 20 70 42 75  osPwrite(fd, pBu
1da60 66 2c 20 6e 42 75 66 2c 20 69 4f 66 66 29 3b 20  f, nBuf, iOff); 
1da70 7d 77 68 69 6c 65 28 20 72 63 3c 30 20 26 26 20  }while( rc<0 && 
1da80 65 72 72 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a  errno==EINTR );.
1da90 23 65 6c 69 66 20 64 65 66 69 6e 65 64 28 55 53  #elif defined(US
1daa0 45 5f 50 52 45 41 44 36 34 29 0a 20 20 64 6f 7b  E_PREAD64).  do{
1dab0 20 72 63 20 3d 20 28 69 6e 74 29 6f 73 50 77 72   rc = (int)osPwr
1dac0 69 74 65 36 34 28 66 64 2c 20 70 42 75 66 2c 20  ite64(fd, pBuf, 
1dad0 6e 42 75 66 2c 20 69 4f 66 66 29 3b 7d 77 68 69  nBuf, iOff);}whi
1dae0 6c 65 28 20 72 63 3c 30 20 26 26 20 65 72 72 6e  le( rc<0 && errn
1daf0 6f 3d 3d 45 49 4e 54 52 29 3b 0a 23 65 6c 73 65  o==EINTR);.#else
1db00 0a 20 20 64 6f 7b 0a 20 20 20 20 69 36 34 20 69  .  do{.    i64 i
1db10 53 65 65 6b 20 3d 20 6c 73 65 65 6b 28 66 64 2c  Seek = lseek(fd,
1db20 20 69 4f 66 66 2c 20 53 45 45 4b 5f 53 45 54 29   iOff, SEEK_SET)
1db30 3b 0a 20 20 20 20 53 69 6d 75 6c 61 74 65 49 4f  ;.    SimulateIO
1db40 45 72 72 6f 72 28 20 69 53 65 65 6b 2d 2d 20 29  Error( iSeek-- )
1db50 3b 0a 0a 20 20 20 20 69 66 28 20 69 53 65 65 6b  ;..    if( iSeek
1db60 21 3d 69 4f 66 66 20 29 7b 0a 20 20 20 20 20 20  !=iOff ){.      
1db70 69 66 28 20 70 69 45 72 72 6e 6f 20 29 20 2a 70  if( piErrno ) *p
1db80 69 45 72 72 6e 6f 20 3d 20 28 69 53 65 65 6b 3d  iErrno = (iSeek=
1db90 3d 2d 31 20 3f 20 65 72 72 6e 6f 20 3a 20 30 29  =-1 ? errno : 0)
1dba0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 2d  ;.      return -
1dbb0 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  1;.    }.    rc 
1dbc0 3d 20 6f 73 57 72 69 74 65 28 66 64 2c 20 70 42  = osWrite(fd, pB
1dbd0 75 66 2c 20 6e 42 75 66 29 3b 0a 20 20 7d 77 68  uf, nBuf);.  }wh
1dbe0 69 6c 65 28 20 72 63 3c 30 20 26 26 20 65 72 72  ile( rc<0 && err
1dbf0 6e 6f 3d 3d 45 49 4e 54 52 20 29 3b 0a 23 65 6e  no==EINTR );.#en
1dc00 64 69 66 0a 0a 20 20 54 49 4d 45 52 5f 45 4e 44  dif..  TIMER_END
1dc10 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 57 52  ;.  OSTRACE(("WR
1dc20 49 54 45 20 20 20 25 2d 33 64 20 25 35 64 20 25  ITE   %-3d %5d %
1dc30 37 6c 6c 64 20 25 6c 6c 75 5c 6e 22 2c 20 66 64  7lld %llu\n", fd
1dc40 2c 20 72 63 2c 20 69 4f 66 66 2c 20 54 49 4d 45  , rc, iOff, TIME
1dc50 52 5f 45 4c 41 50 53 45 44 29 29 3b 0a 0a 20 20  R_ELAPSED));..  
1dc60 69 66 28 20 72 63 3c 30 20 26 26 20 70 69 45 72  if( rc<0 && piEr
1dc70 72 6e 6f 20 29 20 2a 70 69 45 72 72 6e 6f 20 3d  rno ) *piErrno =
1dc80 20 65 72 72 6e 6f 3b 0a 20 20 72 65 74 75 72 6e   errno;.  return
1dc90 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53   rc;.}.../*.** S
1dca0 65 65 6b 20 74 6f 20 74 68 65 20 6f 66 66 73 65  eek to the offse
1dcb0 74 20 69 6e 20 69 64 2d 3e 6f 66 66 73 65 74 20  t in id->offset 
1dcc0 74 68 65 6e 20 72 65 61 64 20 63 6e 74 20 62 79  then read cnt by
1dcd0 74 65 73 20 69 6e 74 6f 20 70 42 75 66 2e 0a 2a  tes into pBuf..*
1dce0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
1dcf0 62 65 72 20 6f 66 20 62 79 74 65 73 20 61 63 74  ber of bytes act
1dd00 75 61 6c 6c 79 20 72 65 61 64 2e 20 20 55 70 64  ually read.  Upd
1dd10 61 74 65 20 74 68 65 20 6f 66 66 73 65 74 2e 0a  ate the offset..
1dd20 2a 2a 0a 2a 2a 20 54 6f 20 61 76 6f 69 64 20 73  **.** To avoid s
1dd30 74 6f 6d 70 69 6e 67 20 74 68 65 20 65 72 72 6e  tomping the errn
1dd40 6f 20 76 61 6c 75 65 20 6f 6e 20 61 20 66 61 69  o value on a fai
1dd50 6c 65 64 20 77 72 69 74 65 20 74 68 65 20 6c 61  led write the la
1dd60 73 74 45 72 72 6e 6f 20 76 61 6c 75 65 0a 2a 2a  stErrno value.**
1dd70 20 69 73 20 73 65 74 20 62 65 66 6f 72 65 20 72   is set before r
1dd80 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61  eturning..*/.sta
1dd90 74 69 63 20 69 6e 74 20 73 65 65 6b 41 6e 64 57  tic int seekAndW
1dda0 72 69 74 65 28 75 6e 69 78 46 69 6c 65 20 2a 69  rite(unixFile *i
1ddb0 64 2c 20 69 36 34 20 6f 66 66 73 65 74 2c 20 63  d, i64 offset, c
1ddc0 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 75 66 2c  onst void *pBuf,
1ddd0 20 69 6e 74 20 63 6e 74 29 7b 0a 20 20 72 65 74   int cnt){.  ret
1dde0 75 72 6e 20 73 65 65 6b 41 6e 64 57 72 69 74 65  urn seekAndWrite
1ddf0 46 64 28 69 64 2d 3e 68 2c 20 6f 66 66 73 65 74  Fd(id->h, offset
1de00 2c 20 70 42 75 66 2c 20 63 6e 74 2c 20 26 69 64  , pBuf, cnt, &id
1de10 2d 3e 6c 61 73 74 45 72 72 6e 6f 29 3b 0a 7d 0a  ->lastErrno);.}.
1de20 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 64 61  ../*.** Write da
1de30 74 61 20 66 72 6f 6d 20 61 20 62 75 66 66 65 72  ta from a buffer
1de40 20 69 6e 74 6f 20 61 20 66 69 6c 65 2e 20 20 52   into a file.  R
1de50 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
1de60 6f 6e 20 73 75 63 63 65 73 73 0a 2a 2a 20 6f 72  on success.** or
1de70 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72 72 6f   some other erro
1de80 72 20 63 6f 64 65 20 6f 6e 20 66 61 69 6c 75 72  r code on failur
1de90 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1dea0 20 75 6e 69 78 57 72 69 74 65 28 0a 20 20 73 71   unixWrite(.  sq
1deb0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
1dec0 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  .  const void *p
1ded0 42 75 66 2c 20 0a 20 20 69 6e 74 20 61 6d 74 2c  Buf, .  int amt,
1dee0 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
1def0 20 6f 66 66 73 65 74 20 0a 29 7b 0a 20 20 75 6e   offset .){.  un
1df00 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
1df10 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
1df20 20 69 6e 74 20 77 72 6f 74 65 20 3d 20 30 3b 0a   int wrote = 0;.
1df30 20 20 61 73 73 65 72 74 28 20 69 64 20 29 3b 0a    assert( id );.
1df40 20 20 61 73 73 65 72 74 28 20 61 6d 74 3e 30 20    assert( amt>0 
1df50 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  );..  /* If this
1df60 20 69 73 20 61 20 64 61 74 61 62 61 73 65 20 66   is a database f
1df70 69 6c 65 20 28 6e 6f 74 20 61 20 6a 6f 75 72 6e  ile (not a journ
1df80 61 6c 2c 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e  al, master-journ
1df90 61 6c 20 6f 72 20 74 65 6d 70 0a 20 20 2a 2a 20  al or temp.  ** 
1dfa0 66 69 6c 65 29 2c 20 74 68 65 20 62 79 74 65 73  file), the bytes
1dfb0 20 69 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   in the locking 
1dfc0 72 61 6e 67 65 20 73 68 6f 75 6c 64 20 6e 65 76  range should nev
1dfd0 65 72 20 62 65 20 72 65 61 64 20 6f 72 20 77 72  er be read or wr
1dfe0 69 74 74 65 6e 2e 20 2a 2f 0a 23 69 66 20 30 0a  itten. */.#if 0.
1dff0 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d    assert( pFile-
1e000 3e 70 55 6e 75 73 65 64 3d 3d 30 0a 20 20 20 20  >pUnused==0.    
1e010 20 20 20 7c 7c 20 6f 66 66 73 65 74 3e 3d 50 45     || offset>=PE
1e020 4e 44 49 4e 47 5f 42 59 54 45 2b 35 31 32 0a 20  NDING_BYTE+512. 
1e030 20 20 20 20 20 20 7c 7c 20 6f 66 66 73 65 74 2b        || offset+
1e040 61 6d 74 3c 3d 50 45 4e 44 49 4e 47 5f 42 59 54  amt<=PENDING_BYT
1e050 45 20 0a 20 20 29 3b 0a 23 65 6e 64 69 66 0a 0a  E .  );.#endif..
1e060 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
1e070 42 55 47 0a 20 20 2f 2a 20 49 66 20 77 65 20 61  BUG.  /* If we a
1e080 72 65 20 64 6f 69 6e 67 20 61 20 6e 6f 72 6d 61  re doing a norma
1e090 6c 20 77 72 69 74 65 20 74 6f 20 61 20 64 61 74  l write to a dat
1e0a0 61 62 61 73 65 20 66 69 6c 65 20 28 61 73 20 6f  abase file (as o
1e0b0 70 70 6f 73 65 64 20 74 6f 0a 20 20 2a 2a 20 64  pposed to.  ** d
1e0c0 6f 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  oing a hot-journ
1e0d0 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 61  al rollback or a
1e0e0 20 77 72 69 74 65 20 74 6f 20 73 6f 6d 65 20 66   write to some f
1e0f0 69 6c 65 20 6f 74 68 65 72 20 74 68 61 6e 20 61  ile other than a
1e100 0a 20 20 2a 2a 20 6e 6f 72 6d 61 6c 20 64 61 74  .  ** normal dat
1e110 61 62 61 73 65 20 66 69 6c 65 29 20 74 68 65 6e  abase file) then
1e120 20 72 65 63 6f 72 64 20 74 68 65 20 66 61 63 74   record the fact
1e130 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61   that the databa
1e140 73 65 0a 20 20 2a 2a 20 68 61 73 20 63 68 61 6e  se.  ** has chan
1e150 67 65 64 2e 20 20 49 66 20 74 68 65 20 74 72 61  ged.  If the tra
1e160 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72  nsaction counter
1e170 20 69 73 20 6d 6f 64 69 66 69 65 64 2c 20 72 65   is modified, re
1e180 63 6f 72 64 20 74 68 61 74 0a 20 20 2a 2a 20 66  cord that.  ** f
1e190 61 63 74 20 74 6f 6f 2e 0a 20 20 2a 2f 0a 20 20  act too..  */.  
1e1a0 69 66 28 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72  if( pFile->inNor
1e1b0 6d 61 6c 57 72 69 74 65 20 29 7b 0a 20 20 20 20  malWrite ){.    
1e1c0 70 46 69 6c 65 2d 3e 64 62 55 70 64 61 74 65 20  pFile->dbUpdate 
1e1d0 3d 20 31 3b 20 20 2f 2a 20 54 68 65 20 64 61 74  = 1;  /* The dat
1e1e0 61 62 61 73 65 20 68 61 73 20 62 65 65 6e 20 6d  abase has been m
1e1f0 6f 64 69 66 69 65 64 20 2a 2f 0a 20 20 20 20 69  odified */.    i
1e200 66 28 20 6f 66 66 73 65 74 3c 3d 32 34 20 26 26  f( offset<=24 &&
1e210 20 6f 66 66 73 65 74 2b 61 6d 74 3e 3d 32 37 20   offset+amt>=27 
1e220 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 3b  ){.      int rc;
1e230 0a 20 20 20 20 20 20 63 68 61 72 20 6f 6c 64 43  .      char oldC
1e240 6e 74 72 5b 34 5d 3b 0a 20 20 20 20 20 20 53 69  ntr[4];.      Si
1e250 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e  mulateIOErrorBen
1e260 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 72 63  ign(1);.      rc
1e270 20 3d 20 73 65 65 6b 41 6e 64 52 65 61 64 28 70   = seekAndRead(p
1e280 46 69 6c 65 2c 20 32 34 2c 20 6f 6c 64 43 6e 74  File, 24, oldCnt
1e290 72 2c 20 34 29 3b 0a 20 20 20 20 20 20 53 69 6d  r, 4);.      Sim
1e2a0 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69  ulateIOErrorBeni
1e2b0 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 69 66 28  gn(0);.      if(
1e2c0 20 72 63 21 3d 34 20 7c 7c 20 6d 65 6d 63 6d 70   rc!=4 || memcmp
1e2d0 28 6f 6c 64 43 6e 74 72 2c 20 26 28 28 63 68 61  (oldCntr, &((cha
1e2e0 72 2a 29 70 42 75 66 29 5b 32 34 2d 6f 66 66 73  r*)pBuf)[24-offs
1e2f0 65 74 5d 2c 20 34 29 21 3d 30 20 29 7b 0a 20 20  et], 4)!=0 ){.  
1e300 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 74 72 61        pFile->tra
1e310 6e 73 43 6e 74 72 43 68 6e 67 20 3d 20 31 3b 20  nsCntrChng = 1; 
1e320 20 2f 2a 20 54 68 65 20 74 72 61 6e 73 61 63 74   /* The transact
1e330 69 6f 6e 20 63 6f 75 6e 74 65 72 20 68 61 73 20  ion counter has 
1e340 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20 20 20 20  changed */.     
1e350 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e   }.    }.  }.#en
1e360 64 69 66 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  dif..#if SQLITE_
1e370 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a  MAX_MMAP_SIZE>0.
1e380 20 20 2f 2a 20 44 65 61 6c 20 77 69 74 68 20 61    /* Deal with a
1e390 73 20 6d 75 63 68 20 6f 66 20 74 68 69 73 20 77  s much of this w
1e3a0 72 69 74 65 20 72 65 71 75 65 73 74 20 61 73 20  rite request as 
1e3b0 70 6f 73 73 69 62 6c 65 20 62 79 20 74 72 61 6e  possible by tran
1e3c0 73 66 65 72 69 6e 67 0a 20 20 2a 2a 20 64 61 74  sfering.  ** dat
1e3d0 61 20 66 72 6f 6d 20 74 68 65 20 6d 65 6d 6f 72  a from the memor
1e3e0 79 20 6d 61 70 70 69 6e 67 20 75 73 69 6e 67 20  y mapping using 
1e3f0 6d 65 6d 63 70 79 28 29 2e 20 20 2a 2f 0a 20 20  memcpy().  */.  
1e400 69 66 28 20 6f 66 66 73 65 74 3c 70 46 69 6c 65  if( offset<pFile
1e410 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b 0a 20 20  ->mmapSize ){.  
1e420 20 20 69 66 28 20 6f 66 66 73 65 74 2b 61 6d 74    if( offset+amt
1e430 20 3c 3d 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53   <= pFile->mmapS
1e440 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  ize ){.      mem
1e450 63 70 79 28 26 28 28 75 38 20 2a 29 28 70 46 69  cpy(&((u8 *)(pFi
1e460 6c 65 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 29  le->pMapRegion))
1e470 5b 6f 66 66 73 65 74 5d 2c 20 70 42 75 66 2c 20  [offset], pBuf, 
1e480 61 6d 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75  amt);.      retu
1e490 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1e4a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
1e4b0 6e 74 20 6e 43 6f 70 79 20 3d 20 70 46 69 6c 65  nt nCopy = pFile
1e4c0 2d 3e 6d 6d 61 70 53 69 7a 65 20 2d 20 6f 66 66  ->mmapSize - off
1e4d0 73 65 74 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  set;.      memcp
1e4e0 79 28 26 28 28 75 38 20 2a 29 28 70 46 69 6c 65  y(&((u8 *)(pFile
1e4f0 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 29 29 5b 6f  ->pMapRegion))[o
1e500 66 66 73 65 74 5d 2c 20 70 42 75 66 2c 20 6e 43  ffset], pBuf, nC
1e510 6f 70 79 29 3b 0a 20 20 20 20 20 20 70 42 75 66  opy);.      pBuf
1e520 20 3d 20 26 28 28 75 38 20 2a 29 70 42 75 66 29   = &((u8 *)pBuf)
1e530 5b 6e 43 6f 70 79 5d 3b 0a 20 20 20 20 20 20 61  [nCopy];.      a
1e540 6d 74 20 2d 3d 20 6e 43 6f 70 79 3b 0a 20 20 20  mt -= nCopy;.   
1e550 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 6e 43 6f     offset += nCo
1e560 70 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65  py;.    }.  }.#e
1e570 6e 64 69 66 0a 20 0a 20 20 77 68 69 6c 65 28 20  ndif. .  while( 
1e580 28 77 72 6f 74 65 20 3d 20 73 65 65 6b 41 6e 64  (wrote = seekAnd
1e590 57 72 69 74 65 28 70 46 69 6c 65 2c 20 6f 66 66  Write(pFile, off
1e5a0 73 65 74 2c 20 70 42 75 66 2c 20 61 6d 74 29 29  set, pBuf, amt))
1e5b0 3c 61 6d 74 20 26 26 20 77 72 6f 74 65 3e 30 20  <amt && wrote>0 
1e5c0 29 7b 0a 20 20 20 20 61 6d 74 20 2d 3d 20 77 72  ){.    amt -= wr
1e5d0 6f 74 65 3b 0a 20 20 20 20 6f 66 66 73 65 74 20  ote;.    offset 
1e5e0 2b 3d 20 77 72 6f 74 65 3b 0a 20 20 20 20 70 42  += wrote;.    pB
1e5f0 75 66 20 3d 20 26 28 28 63 68 61 72 2a 29 70 42  uf = &((char*)pB
1e600 75 66 29 5b 77 72 6f 74 65 5d 3b 0a 20 20 7d 0a  uf)[wrote];.  }.
1e610 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
1e620 72 28 28 20 77 72 6f 74 65 3d 28 2d 31 29 2c 20  r(( wrote=(-1), 
1e630 61 6d 74 3d 31 20 29 29 3b 0a 20 20 53 69 6d 75  amt=1 ));.  Simu
1e640 6c 61 74 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f  lateDiskfullErro
1e650 72 28 28 20 77 72 6f 74 65 3d 30 2c 20 61 6d 74  r(( wrote=0, amt
1e660 3d 31 20 29 29 3b 0a 0a 20 20 69 66 28 20 61 6d  =1 ));..  if( am
1e670 74 3e 77 72 6f 74 65 20 29 7b 0a 20 20 20 20 69  t>wrote ){.    i
1e680 66 28 20 77 72 6f 74 65 3c 30 20 26 26 20 70 46  f( wrote<0 && pF
1e690 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 21 3d  ile->lastErrno!=
1e6a0 45 4e 4f 53 50 43 20 29 7b 0a 20 20 20 20 20 20  ENOSPC ){.      
1e6b0 2f 2a 20 6c 61 73 74 45 72 72 6e 6f 20 73 65 74  /* lastErrno set
1e6c0 20 62 79 20 73 65 65 6b 41 6e 64 57 72 69 74 65   by seekAndWrite
1e6d0 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
1e6e0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52   SQLITE_IOERR_WR
1e6f0 49 54 45 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ITE;.    }else{.
1e700 20 20 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45        storeLastE
1e710 72 72 6e 6f 28 70 46 69 6c 65 2c 20 30 29 3b 20  rrno(pFile, 0); 
1e720 2f 2a 20 6e 6f 74 20 61 20 73 79 73 74 65 6d 20  /* not a system 
1e730 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20 72  error */.      r
1e740 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c  eturn SQLITE_FUL
1e750 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  L;.    }.  }..  
1e760 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1e770 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
1e780 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20 43 6f  TE_TEST./*.** Co
1e790 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  unt the number o
1e7a0 66 20 66 75 6c 6c 73 79 6e 63 73 20 61 6e 64 20  f fullsyncs and 
1e7b0 6e 6f 72 6d 61 6c 20 73 79 6e 63 73 2e 20 20 54  normal syncs.  T
1e7c0 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 74  his is used to t
1e7d0 65 73 74 0a 2a 2a 20 74 68 61 74 20 73 79 6e 63  est.** that sync
1e7e0 73 20 61 6e 64 20 66 75 6c 6c 73 79 6e 63 73 20  s and fullsyncs 
1e7f0 61 72 65 20 6f 63 63 75 72 72 69 6e 67 20 61 74  are occurring at
1e800 20 74 68 65 20 72 69 67 68 74 20 74 69 6d 65 73   the right times
1e810 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1e820 5f 73 79 6e 63 5f 63 6f 75 6e 74 20 3d 20 30 3b  _sync_count = 0;
1e830 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 66 75 6c  .int sqlite3_ful
1e840 6c 73 79 6e 63 5f 63 6f 75 6e 74 20 3d 20 30 3b  lsync_count = 0;
1e850 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57  .#endif../*.** W
1e860 65 20 64 6f 20 6e 6f 74 20 74 72 75 73 74 20 73  e do not trust s
1e870 79 73 74 65 6d 73 20 74 6f 20 70 72 6f 76 69 64  ystems to provid
1e880 65 20 61 20 77 6f 72 6b 69 6e 67 20 66 64 61 74  e a working fdat
1e890 61 73 79 6e 63 28 29 2e 20 20 53 6f 6d 65 20 64  async().  Some d
1e8a0 6f 2e 0a 2a 2a 20 4f 74 68 65 72 73 20 64 6f 20  o..** Others do 
1e8b0 6e 6f 2e 20 20 54 6f 20 62 65 20 73 61 66 65 2c  no.  To be safe,
1e8c0 20 77 65 20 77 69 6c 6c 20 73 74 69 63 6b 20 77   we will stick w
1e8d0 69 74 68 20 74 68 65 20 28 73 6c 69 67 68 74 6c  ith the (slightl
1e8e0 79 20 73 6c 6f 77 65 72 29 0a 2a 2a 20 66 73 79  y slower).** fsy
1e8f0 6e 63 28 29 2e 20 49 66 20 79 6f 75 20 6b 6e 6f  nc(). If you kno
1e900 77 20 74 68 61 74 20 79 6f 75 72 20 73 79 73 74  w that your syst
1e910 65 6d 20 64 6f 65 73 20 73 75 70 70 6f 72 74 20  em does support 
1e920 66 64 61 74 61 73 79 6e 63 28 29 20 63 6f 72 72  fdatasync() corr
1e930 65 63 74 6c 79 2c 0a 2a 2a 20 74 68 65 6e 20 73  ectly,.** then s
1e940 69 6d 70 6c 79 20 63 6f 6d 70 69 6c 65 20 77 69  imply compile wi
1e950 74 68 20 2d 44 66 64 61 74 61 73 79 6e 63 3d 66  th -Dfdatasync=f
1e960 64 61 74 61 73 79 6e 63 20 6f 72 20 2d 44 48 41  datasync or -DHA
1e970 56 45 5f 46 44 41 54 41 53 59 4e 43 0a 2a 2f 0a  VE_FDATASYNC.*/.
1e980 23 69 66 20 21 64 65 66 69 6e 65 64 28 66 64 61  #if !defined(fda
1e990 74 61 73 79 6e 63 29 20 26 26 20 21 48 41 56 45  tasync) && !HAVE
1e9a0 5f 46 44 41 54 41 53 59 4e 43 0a 23 20 64 65 66  _FDATASYNC.# def
1e9b0 69 6e 65 20 66 64 61 74 61 73 79 6e 63 20 66 73  ine fdatasync fs
1e9c0 79 6e 63 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ync.#endif../*.*
1e9d0 2a 20 44 65 66 69 6e 65 20 48 41 56 45 5f 46 55  * Define HAVE_FU
1e9e0 4c 4c 46 53 59 4e 43 20 74 6f 20 30 20 6f 72 20  LLFSYNC to 0 or 
1e9f0 31 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20 77  1 depending on w
1ea00 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a 2a 2a  hether or not.**
1ea10 20 74 68 65 20 46 5f 46 55 4c 4c 46 53 59 4e 43   the F_FULLFSYNC
1ea20 20 6d 61 63 72 6f 20 69 73 20 64 65 66 69 6e 65   macro is define
1ea30 64 2e 20 20 46 5f 46 55 4c 4c 46 53 59 4e 43 20  d.  F_FULLFSYNC 
1ea40 69 73 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20  is currently.** 
1ea50 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 6f  only available o
1ea60 6e 20 4d 61 63 20 4f 53 20 58 2e 20 20 42 75 74  n Mac OS X.  But
1ea70 20 74 68 61 74 20 63 6f 75 6c 64 20 63 68 61 6e   that could chan
1ea80 67 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 46 5f  ge..*/.#ifdef F_
1ea90 46 55 4c 4c 46 53 59 4e 43 0a 23 20 64 65 66 69  FULLFSYNC.# defi
1eaa0 6e 65 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e  ne HAVE_FULLFSYN
1eab0 43 20 31 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  C 1.#else.# defi
1eac0 6e 65 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e  ne HAVE_FULLFSYN
1ead0 43 20 30 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64  C 0.#endif..#ifd
1eae0 65 66 20 53 51 4c 49 54 45 5f 55 53 45 5f 52 45  ef SQLITE_USE_RE
1eaf0 51 55 45 53 54 5f 46 55 4c 4c 46 53 59 4e 43 0a  QUEST_FULLFSYNC.
1eb00 23 69 6d 70 6f 72 74 20 3c 6e 6f 74 69 66 79 2e  #import <notify.
1eb10 68 3e 0a 23 69 6d 70 6f 72 74 20 3c 6c 69 62 6b  h>.#import <libk
1eb20 65 72 6e 2f 4f 53 41 74 6f 6d 69 63 2e 68 3e 0a  ern/OSAtomic.h>.
1eb30 73 74 61 74 69 63 20 4f 53 53 70 69 6e 4c 6f 63  static OSSpinLoc
1eb40 6b 20 6e 6f 74 69 66 79 5f 6c 6f 63 6b 20 3d 20  k notify_lock = 
1eb50 30 3b 0a 23 64 65 66 69 6e 65 20 52 45 51 55 45  0;.#define REQUE
1eb60 53 54 5f 46 55 4c 4c 53 59 4e 43 5f 4e 4f 54 49  ST_FULLSYNC_NOTI
1eb70 46 49 43 41 54 49 4f 4e 20 20 20 20 22 63 6f 6d  FICATION    "com
1eb80 2e 61 70 70 6c 65 2e 72 65 71 73 79 6e 63 22 0a  .apple.reqsync".
1eb90 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
1eba0 65 20 66 73 79 6e 63 28 29 20 73 79 73 74 65 6d  e fsync() system
1ebb0 20 63 61 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 77   call does not w
1ebc0 6f 72 6b 20 61 73 20 61 64 76 65 72 74 69 73 65  ork as advertise
1ebd0 64 20 6f 6e 20 6d 61 6e 79 0a 2a 2a 20 75 6e 69  d on many.** uni
1ebe0 78 20 73 79 73 74 65 6d 73 2e 20 20 54 68 65 20  x systems.  The 
1ebf0 66 6f 6c 6c 6f 77 69 6e 67 20 70 72 6f 63 65 64  following proced
1ec00 75 72 65 20 69 73 20 61 6e 20 61 74 74 65 6d 70  ure is an attemp
1ec10 74 20 74 6f 20 6d 61 6b 65 0a 2a 2a 20 69 74 20  t to make.** it 
1ec20 77 6f 72 6b 20 62 65 74 74 65 72 2e 0a 2a 2a 0a  work better..**.
1ec30 2a 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 4e 4f  ** The SQLITE_NO
1ec40 5f 53 59 4e 43 20 6d 61 63 72 6f 20 64 69 73 61  _SYNC macro disa
1ec50 62 6c 65 73 20 61 6c 6c 20 66 73 79 6e 63 28 29  bles all fsync()
1ec60 73 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 66  s.  This is usef
1ec70 75 6c 0a 2a 2a 20 66 6f 72 20 74 65 73 74 69 6e  ul.** for testin
1ec80 67 20 77 68 65 6e 20 77 65 20 77 61 6e 74 20 74  g when we want t
1ec90 6f 20 72 75 6e 20 74 68 72 6f 75 67 68 20 74 68  o run through th
1eca0 65 20 74 65 73 74 20 73 75 69 74 65 20 71 75 69  e test suite qui
1ecb0 63 6b 6c 79 2e 0a 2a 2a 20 59 6f 75 20 61 72 65  ckly..** You are
1ecc0 20 73 74 72 6f 6e 67 6c 79 20 61 64 76 69 73 65   strongly advise
1ecd0 64 20 2a 6e 6f 74 2a 20 74 6f 20 64 65 70 6c 6f  d *not* to deplo
1ece0 79 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4e 4f  y with SQLITE_NO
1ecf0 5f 53 59 4e 43 0a 2a 2a 20 65 6e 61 62 6c 65 64  _SYNC.** enabled
1ed00 2c 20 68 6f 77 65 76 65 72 2c 20 73 69 6e 63 65  , however, since
1ed10 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4e 4f 5f   with SQLITE_NO_
1ed20 53 59 4e 43 20 65 6e 61 62 6c 65 64 2c 20 61 6e  SYNC enabled, an
1ed30 20 4f 53 20 63 72 61 73 68 0a 2a 2a 20 6f 72 20   OS crash.** or 
1ed40 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 77 69  power failure wi
1ed50 6c 6c 20 6c 69 6b 65 6c 79 20 63 6f 72 72 75 70  ll likely corrup
1ed60 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  t the database f
1ed70 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74  ile..**.** SQLit
1ed80 65 20 73 65 74 73 20 74 68 65 20 64 61 74 61 4f  e sets the dataO
1ed90 6e 6c 79 20 66 6c 61 67 20 69 66 20 74 68 65 20  nly flag if the 
1eda0 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65  size of the file
1edb0 20 69 73 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a   is unchanged..*
1edc0 2a 20 54 68 65 20 69 64 65 61 20 62 65 68 69 6e  * The idea behin
1edd0 64 20 64 61 74 61 4f 6e 6c 79 20 69 73 20 74 68  d dataOnly is th
1ede0 61 74 20 69 74 20 73 68 6f 75 6c 64 20 6f 6e 6c  at it should onl
1edf0 79 20 77 72 69 74 65 20 74 68 65 20 66 69 6c 65  y write the file
1ee00 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20 74 6f 20 64   content.** to d
1ee10 69 73 6b 2c 20 6e 6f 74 20 74 68 65 20 69 6e 6f  isk, not the ino
1ee20 64 65 2e 20 20 57 65 20 6f 6e 6c 79 20 73 65 74  de.  We only set
1ee30 20 64 61 74 61 4f 6e 6c 79 20 69 66 20 74 68 65   dataOnly if the
1ee40 20 66 69 6c 65 20 73 69 7a 65 20 69 73 20 0a 2a   file size is .*
1ee50 2a 20 75 6e 63 68 61 6e 67 65 64 20 73 69 6e 63  * unchanged sinc
1ee60 65 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20  e the file size 
1ee70 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 69  is part of the i
1ee80 6e 6f 64 65 2e 20 20 48 6f 77 65 76 65 72 2c 20  node.  However, 
1ee90 0a 2a 2a 20 54 65 64 20 54 73 27 6f 20 74 65 6c  .** Ted Ts'o tel
1eea0 6c 73 20 75 73 20 74 68 61 74 20 66 64 61 74 61  ls us that fdata
1eeb0 73 79 6e 63 28 29 20 77 69 6c 6c 20 61 6c 73 6f  sync() will also
1eec0 20 77 72 69 74 65 20 74 68 65 20 69 6e 6f 64 65   write the inode
1eed0 20 69 66 20 74 68 65 0a 2a 2a 20 66 69 6c 65 20   if the.** file 
1eee0 73 69 7a 65 20 68 61 73 20 63 68 61 6e 67 65 64  size has changed
1eef0 2e 20 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 6c  .  The only real
1ef00 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77   difference betw
1ef10 65 65 6e 20 66 64 61 74 61 73 79 6e 63 28 29 0a  een fdatasync().
1ef20 2a 2a 20 61 6e 64 20 66 73 79 6e 63 28 29 2c 20  ** and fsync(), 
1ef30 54 65 64 20 74 65 6c 6c 73 20 75 73 2c 20 69 73  Ted tells us, is
1ef40 20 74 68 61 74 20 66 64 61 74 61 73 79 6e 63 28   that fdatasync(
1ef50 29 20 77 69 6c 6c 20 6e 6f 74 20 66 6c 75 73 68  ) will not flush
1ef60 20 74 68 65 0a 2a 2a 20 69 6e 6f 64 65 20 69 66   the.** inode if
1ef70 20 74 68 65 20 6d 74 69 6d 65 20 6f 72 20 6f 77   the mtime or ow
1ef80 6e 65 72 20 6f 72 20 6f 74 68 65 72 20 69 6e 6f  ner or other ino
1ef90 64 65 20 61 74 74 72 69 62 75 74 65 73 20 68 61  de attributes ha
1efa0 76 65 20 63 68 61 6e 67 65 64 2e 0a 2a 2a 20 57  ve changed..** W
1efb0 65 20 6f 6e 6c 79 20 63 61 72 65 20 61 62 6f 75  e only care abou
1efc0 74 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 2c  t the file size,
1efd0 20 6e 6f 74 20 74 68 65 20 6f 74 68 65 72 20 66   not the other f
1efe0 69 6c 65 20 61 74 74 72 69 62 75 74 65 73 2c 20  ile attributes, 
1eff0 73 6f 0a 2a 2a 20 61 73 20 66 61 72 20 61 73 20  so.** as far as 
1f000 53 51 4c 69 74 65 20 69 73 20 63 6f 6e 63 65 72  SQLite is concer
1f010 6e 65 64 2c 20 61 6e 20 66 64 61 74 61 73 79 6e  ned, an fdatasyn
1f020 63 28 29 20 69 73 20 61 6c 77 61 79 73 20 61 64  c() is always ad
1f030 65 71 75 61 74 65 2e 0a 2a 2a 20 53 6f 2c 20 77  equate..** So, w
1f040 65 20 61 6c 77 61 79 73 20 75 73 65 20 66 64 61  e always use fda
1f050 74 61 73 79 6e 63 28 29 20 69 66 20 69 74 20 69  tasync() if it i
1f060 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 72 65 67  s available, reg
1f070 61 72 64 6c 65 73 73 20 6f 66 0a 2a 2a 20 74 68  ardless of.** th
1f080 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 64  e value of the d
1f090 61 74 61 4f 6e 6c 79 20 66 6c 61 67 2e 0a 2a 2f  ataOnly flag..*/
1f0a0 0a 73 74 61 74 69 63 20 69 6e 74 20 66 75 6c 6c  .static int full
1f0b0 5f 66 73 79 6e 63 28 69 6e 74 20 66 64 2c 20 69  _fsync(int fd, i
1f0c0 6e 74 20 66 75 6c 6c 53 79 6e 63 2c 20 69 6e 74  nt fullSync, int
1f0d0 20 64 61 74 61 4f 6e 6c 79 29 7b 0a 20 20 69 6e   dataOnly){.  in
1f0e0 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  t rc;..  /* The 
1f0f0 66 6f 6c 6c 6f 77 69 6e 67 20 22 69 66 64 65 66  following "ifdef
1f100 2f 65 6c 69 66 2f 65 6c 73 65 2f 22 20 62 6c 6f  /elif/else/" blo
1f110 63 6b 20 68 61 73 20 74 68 65 20 73 61 6d 65 20  ck has the same 
1f120 73 74 72 75 63 74 75 72 65 20 61 73 0a 20 20 2a  structure as.  *
1f130 2a 20 74 68 65 20 6f 6e 65 20 62 65 6c 6f 77 2e  * the one below.
1f140 20 49 74 20 69 73 20 72 65 70 6c 69 63 61 74 65   It is replicate
1f150 64 20 68 65 72 65 20 73 6f 6c 65 6c 79 20 74 6f  d here solely to
1f160 20 61 76 6f 69 64 20 63 6c 75 74 74 65 72 69 6e   avoid clutterin
1f170 67 20 0a 20 20 2a 2a 20 75 70 20 74 68 65 20 72  g .  ** up the r
1f180 65 61 6c 20 63 6f 64 65 20 77 69 74 68 20 74 68  eal code with th
1f190 65 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54  e UNUSED_PARAMET
1f1a0 45 52 28 29 20 6d 61 63 72 6f 73 2e 0a 20 20 2a  ER() macros..  *
1f1b0 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
1f1c0 4e 4f 5f 53 59 4e 43 0a 20 20 55 4e 55 53 45 44  NO_SYNC.  UNUSED
1f1d0 5f 50 41 52 41 4d 45 54 45 52 28 66 64 29 3b 0a  _PARAMETER(fd);.
1f1e0 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
1f1f0 45 52 28 66 75 6c 6c 53 79 6e 63 29 3b 0a 20 20  ER(fullSync);.  
1f200 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
1f210 28 64 61 74 61 4f 6e 6c 79 29 3b 0a 23 65 6c 69  (dataOnly);.#eli
1f220 66 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43  f HAVE_FULLFSYNC
1f230 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
1f240 54 45 52 28 64 61 74 61 4f 6e 6c 79 29 3b 0a 23  TER(dataOnly);.#
1f250 65 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41  else.  UNUSED_PA
1f260 52 41 4d 45 54 45 52 28 66 75 6c 6c 53 79 6e 63  RAMETER(fullSync
1f270 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
1f280 4d 45 54 45 52 28 64 61 74 61 4f 6e 6c 79 29 3b  METER(dataOnly);
1f290 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52 65  .#endif..  /* Re
1f2a0 63 6f 72 64 20 74 68 65 20 6e 75 6d 62 65 72 20  cord the number 
1f2b0 6f 66 20 74 69 6d 65 73 20 74 68 61 74 20 77 65  of times that we
1f2c0 20 64 6f 20 61 20 6e 6f 72 6d 61 6c 20 66 73 79   do a normal fsy
1f2d0 6e 63 28 29 20 61 6e 64 20 0a 20 20 2a 2a 20 46  nc() and .  ** F
1f2e0 55 4c 4c 53 59 4e 43 2e 20 20 54 68 69 73 20 69  ULLSYNC.  This i
1f2f0 73 20 75 73 65 64 20 64 75 72 69 6e 67 20 74 65  s used during te
1f300 73 74 69 6e 67 20 74 6f 20 76 65 72 69 66 79 20  sting to verify 
1f310 74 68 61 74 20 74 68 69 73 20 70 72 6f 63 65 64  that this proced
1f320 75 72 65 0a 20 20 2a 2a 20 67 65 74 73 20 63 61  ure.  ** gets ca
1f330 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 63 6f  lled with the co
1f340 72 72 65 63 74 20 61 72 67 75 6d 65 6e 74 73 2e  rrect arguments.
1f350 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  .  */.#ifdef SQL
1f360 49 54 45 5f 54 45 53 54 0a 20 20 69 66 28 20 66  ITE_TEST.  if( f
1f370 75 6c 6c 53 79 6e 63 20 29 20 73 71 6c 69 74 65  ullSync ) sqlite
1f380 33 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74  3_fullsync_count
1f390 2b 2b 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 79  ++;.  sqlite3_sy
1f3a0 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 23 65 6e 64  nc_count++;.#end
1f3b0 69 66 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 63  if..  /* If we c
1f3c0 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 74 68 65  ompiled with the
1f3d0 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20   SQLITE_NO_SYNC 
1f3e0 66 6c 61 67 2c 20 74 68 65 6e 20 73 79 6e 63 69  flag, then synci
1f3f0 6e 67 20 69 73 20 61 0a 20 20 2a 2a 20 6e 6f 2d  ng is a.  ** no-
1f400 6f 70 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53  op.  */.#ifdef S
1f410 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 0a 20 20  QLITE_NO_SYNC.  
1f420 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1f430 23 65 6c 69 66 20 48 41 56 45 5f 46 55 4c 4c 46  #elif HAVE_FULLF
1f440 53 59 4e 43 0a 20 20 69 66 28 20 66 75 6c 6c 53  SYNC.  if( fullS
1f450 79 6e 63 20 29 7b 0a 23 69 66 64 65 66 20 53 51  ync ){.#ifdef SQ
1f460 4c 49 54 45 5f 55 53 45 5f 52 45 51 55 45 53 54  LITE_USE_REQUEST
1f470 5f 46 55 4c 4c 46 53 59 4e 43 0a 20 20 20 20 72  _FULLFSYNC.    r
1f480 63 20 3d 20 6f 73 46 73 79 6e 63 28 66 64 29 3b  c = osFsync(fd);
1f490 0a 20 20 20 20 69 66 20 28 21 72 63 29 20 7b 0a  .    if (!rc) {.
1f4a0 20 20 20 20 20 20 4f 53 53 70 69 6e 4c 6f 63 6b        OSSpinLock
1f4b0 4c 6f 63 6b 28 26 6e 6f 74 69 66 79 5f 6c 6f 63  Lock(&notify_loc
1f4c0 6b 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6e  k);.      rc = n
1f4d0 6f 74 69 66 79 5f 70 6f 73 74 28 52 45 51 55 45  otify_post(REQUE
1f4e0 53 54 5f 46 55 4c 4c 53 59 4e 43 5f 4e 4f 54 49  ST_FULLSYNC_NOTI
1f4f0 46 49 43 41 54 49 4f 4e 29 3b 0a 20 20 20 20 20  FICATION);.     
1f500 20 4f 53 53 70 69 6e 4c 6f 63 6b 55 6e 6c 6f 63   OSSpinLockUnloc
1f510 6b 28 26 6e 6f 74 69 66 79 5f 6c 6f 63 6b 29 3b  k(&notify_lock);
1f520 0a 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20  .    }.#else.   
1f530 20 72 63 20 3d 20 6f 73 46 63 6e 74 6c 28 66 64   rc = osFcntl(fd
1f540 2c 20 46 5f 46 55 4c 4c 46 53 59 4e 43 2c 20 30  , F_FULLFSYNC, 0
1f550 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73  );.#endif.  }els
1f560 65 7b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  e{.    rc = 1;. 
1f570 20 7d 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 46   }.  /* If the F
1f580 55 4c 4c 46 53 59 4e 43 20 66 61 69 6c 65 64 2c  ULLFSYNC failed,
1f590 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 61 74   fall back to at
1f5a0 74 65 6d 70 74 69 6e 67 20 61 6e 20 66 73 79 6e  tempting an fsyn
1f5b0 63 28 29 2e 0a 20 20 2a 2a 20 49 74 20 73 68 6f  c()..  ** It sho
1f5c0 75 6c 64 6e 27 74 20 62 65 20 70 6f 73 73 69 62  uldn't be possib
1f5d0 6c 65 20 66 6f 72 20 66 75 6c 6c 66 73 79 6e 63  le for fullfsync
1f5e0 20 74 6f 20 66 61 69 6c 20 6f 6e 20 74 68 65 20   to fail on the 
1f5f0 6c 6f 63 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65  local .  ** file
1f600 20 73 79 73 74 65 6d 20 28 6f 6e 20 4f 53 58 29   system (on OSX)
1f610 2c 20 73 6f 20 66 61 69 6c 75 72 65 20 69 6e 64  , so failure ind
1f620 69 63 61 74 65 73 20 74 68 61 74 20 46 55 4c 4c  icates that FULL
1f630 46 53 59 4e 43 0a 20 20 2a 2a 20 69 73 6e 27 74  FSYNC.  ** isn't
1f640 20 73 75 70 70 6f 72 74 65 64 20 66 6f 72 20 74   supported for t
1f650 68 69 73 20 66 69 6c 65 20 73 79 73 74 65 6d 2e  his file system.
1f660 20 53 6f 2c 20 61 74 74 65 6d 70 74 20 61 6e 20   So, attempt an 
1f670 66 73 79 6e 63 20 0a 20 20 2a 2a 20 61 6e 64 20  fsync .  ** and 
1f680 28 66 6f 72 20 6e 6f 77 29 20 69 67 6e 6f 72 65  (for now) ignore
1f690 20 74 68 65 20 6f 76 65 72 68 65 61 64 20 6f 66   the overhead of
1f6a0 20 61 20 73 75 70 65 72 66 6c 75 6f 75 73 20 66   a superfluous f
1f6b0 63 6e 74 6c 20 63 61 6c 6c 2e 20 20 0a 20 20 2a  cntl call.  .  *
1f6c0 2a 20 49 74 27 64 20 62 65 20 62 65 74 74 65 72  * It'd be better
1f6d0 20 74 6f 20 64 65 74 65 63 74 20 66 75 6c 6c 66   to detect fullf
1f6e0 73 79 6e 63 20 73 75 70 70 6f 72 74 20 6f 6e 63  sync support onc
1f6f0 65 20 61 6e 64 20 61 76 6f 69 64 20 0a 20 20 2a  e and avoid .  *
1f700 2a 20 74 68 65 20 66 63 6e 74 6c 20 63 61 6c 6c  * the fcntl call
1f710 20 65 76 65 72 79 20 74 69 6d 65 20 73 79 6e 63   every time sync
1f720 20 69 73 20 63 61 6c 6c 65 64 2e 0a 20 20 2a 2f   is called..  */
1f730 0a 20 20 69 66 28 20 72 63 20 29 20 72 63 20 3d  .  if( rc ) rc =
1f740 20 66 73 79 6e 63 28 66 64 29 3b 0a 0a 23 65 6c   fsync(fd);..#el
1f750 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
1f760 4c 45 5f 5f 29 0a 20 20 2f 2a 20 66 64 61 74 61  LE__).  /* fdata
1f770 73 79 6e 63 28 29 20 6f 6e 20 48 46 53 2b 20 64  sync() on HFS+ d
1f780 6f 65 73 6e 27 74 20 79 65 74 20 66 6c 75 73 68  oesn't yet flush
1f790 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20 69   the file size i
1f7a0 66 20 69 74 20 63 68 61 6e 67 65 64 20 63 6f 72  f it changed cor
1f7b0 72 65 63 74 6c 79 0a 20 20 2a 2a 20 73 6f 20 63  rectly.  ** so c
1f7c0 75 72 72 65 6e 74 6c 79 20 77 65 20 64 65 66 61  urrently we defa
1f7d0 75 6c 74 20 74 6f 20 74 68 65 20 6d 61 63 72 6f  ult to the macro
1f7e0 20 74 68 61 74 20 72 65 64 65 66 69 6e 65 73 20   that redefines 
1f7f0 66 64 61 74 61 73 79 6e 63 20 74 6f 20 66 73 79  fdatasync to fsy
1f800 6e 63 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 66  nc.  */.  rc = f
1f810 73 79 6e 63 28 66 64 29 3b 0a 23 65 6c 73 65 20  sync(fd);.#else 
1f820 0a 20 20 72 63 20 3d 20 66 64 61 74 61 73 79 6e  .  rc = fdatasyn
1f830 63 28 66 64 29 3b 0a 23 69 66 20 4f 53 5f 56 58  c(fd);.#if OS_VX
1f840 57 4f 52 4b 53 0a 20 20 69 66 28 20 72 63 3d 3d  WORKS.  if( rc==
1f850 2d 31 20 26 26 20 65 72 72 6e 6f 3d 3d 45 4e 4f  -1 && errno==ENO
1f860 54 53 55 50 20 29 7b 0a 20 20 20 20 72 63 20 3d  TSUP ){.    rc =
1f870 20 66 73 79 6e 63 28 66 64 29 3b 0a 20 20 7d 0a   fsync(fd);.  }.
1f880 23 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57  #endif /* OS_VXW
1f890 4f 52 4b 53 20 2a 2f 0a 23 65 6e 64 69 66 20 2f  ORKS */.#endif /
1f8a0 2a 20 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4e  * ifdef SQLITE_N
1f8b0 4f 5f 53 59 4e 43 20 65 6c 69 66 20 48 41 56 45  O_SYNC elif HAVE
1f8c0 5f 46 55 4c 4c 46 53 59 4e 43 20 2a 2f 0a 0a 20  _FULLFSYNC */.. 
1f8d0 20 69 66 28 20 4f 53 5f 56 58 57 4f 52 4b 53 20   if( OS_VXWORKS 
1f8e0 26 26 20 72 63 21 3d 20 2d 31 20 29 7b 0a 20 20  && rc!= -1 ){.  
1f8f0 20 20 72 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20    rc = 0;.  }.  
1f900 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1f910 0a 2a 2a 20 4f 70 65 6e 20 61 20 66 69 6c 65 20  .** Open a file 
1f920 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20 74 68  descriptor to th
1f930 65 20 64 69 72 65 63 74 6f 72 79 20 63 6f 6e 74  e directory cont
1f940 61 69 6e 69 6e 67 20 66 69 6c 65 20 7a 46 69 6c  aining file zFil
1f950 65 6e 61 6d 65 2e 0a 2a 2a 20 49 66 20 73 75 63  ename..** If suc
1f960 63 65 73 73 66 75 6c 2c 20 2a 70 46 64 20 69 73  cessful, *pFd is
1f970 20 73 65 74 20 74 6f 20 74 68 65 20 6f 70 65 6e   set to the open
1f980 65 64 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ed file descript
1f990 6f 72 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45  or and.** SQLITE
1f9a0 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
1f9b0 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
1f9c0 75 72 73 2c 20 65 69 74 68 65 72 20 53 51 4c 49  urs, either SQLI
1f9d0 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 6f 72 20 53  TE_NOMEM.** or S
1f9e0 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 69  QLITE_CANTOPEN i
1f9f0 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a  s returned and *
1fa00 70 46 64 20 69 73 20 73 65 74 20 74 6f 20 61 6e  pFd is set to an
1fa10 20 75 6e 64 65 66 69 6e 65 64 0a 2a 2a 20 76 61   undefined.** va
1fa20 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64  lue..**.** The d
1fa30 69 72 65 63 74 6f 72 79 20 66 69 6c 65 20 64 65  irectory file de
1fa40 73 63 72 69 70 74 6f 72 20 69 73 20 75 73 65 64  scriptor is used
1fa50 20 66 6f 72 20 6f 6e 6c 79 20 6f 6e 65 20 74 68   for only one th
1fa60 69 6e 67 20 2d 20 74 6f 0a 2a 2a 20 66 73 79 6e  ing - to.** fsyn
1fa70 63 28 29 20 61 20 64 69 72 65 63 74 6f 72 79 20  c() a directory 
1fa80 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 66 69 6c  to make sure fil
1fa90 65 20 63 72 65 61 74 69 6f 6e 20 61 6e 64 20 64  e creation and d
1faa0 65 6c 65 74 69 6f 6e 20 65 76 65 6e 74 73 0a 2a  eletion events.*
1fab0 2a 20 61 72 65 20 66 6c 75 73 68 65 64 20 74 6f  * are flushed to
1fac0 20 64 69 73 6b 2e 20 20 53 75 63 68 20 66 73 79   disk.  Such fsy
1fad0 6e 63 73 20 61 72 65 20 6e 6f 74 20 6e 65 65 64  ncs are not need
1fae0 65 64 20 6f 6e 20 6e 65 77 65 72 0a 2a 2a 20 6a  ed on newer.** j
1faf0 6f 75 72 6e 61 6c 69 6e 67 20 66 69 6c 65 73 79  ournaling filesy
1fb00 73 74 65 6d 73 2c 20 62 75 74 20 61 72 65 20 72  stems, but are r
1fb10 65 71 75 69 72 65 64 20 6f 6e 20 6f 6c 64 65 72  equired on older
1fb20 20 66 69 6c 65 73 79 73 74 65 6d 73 2e 0a 2a 2a   filesystems..**
1fb30 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1fb40 20 63 61 6e 20 62 65 20 6f 76 65 72 72 69 64 64   can be overridd
1fb50 65 6e 20 75 73 69 6e 67 20 74 68 65 20 78 53 65  en using the xSe
1fb60 74 53 79 73 43 61 6c 6c 20 69 6e 74 65 72 66 61  tSysCall interfa
1fb70 63 65 2e 0a 2a 2a 20 54 68 65 20 61 62 69 6c 69  ce..** The abili
1fb80 74 79 20 74 6f 20 6f 76 65 72 72 69 64 65 20 74  ty to override t
1fb90 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20  his routine was 
1fba0 61 64 64 65 64 20 69 6e 20 73 75 70 70 6f 72 74  added in support
1fbb0 20 6f 66 20 74 68 65 0a 2a 2a 20 63 68 72 6f 6d   of the.** chrom
1fbc0 69 75 6d 20 73 61 6e 64 62 6f 78 2e 20 20 4f 70  ium sandbox.  Op
1fbd0 65 6e 69 6e 67 20 61 20 64 69 72 65 63 74 6f 72  ening a director
1fbe0 79 20 69 73 20 61 20 73 65 63 75 72 69 74 79 20  y is a security 
1fbf0 72 69 73 6b 20 28 77 65 20 61 72 65 0a 2a 2a 20  risk (we are.** 
1fc00 74 6f 6c 64 29 20 73 6f 20 6d 61 6b 69 6e 67 20  told) so making 
1fc10 69 74 20 6f 76 65 72 72 69 64 65 61 62 6c 65 20  it overrideable 
1fc20 61 6c 6c 6f 77 73 20 74 68 65 20 63 68 72 6f 6d  allows the chrom
1fc30 69 75 6d 20 73 61 6e 64 62 6f 78 20 74 6f 0a 2a  ium sandbox to.*
1fc40 2a 20 72 65 70 6c 61 63 65 20 74 68 69 73 20 72  * replace this r
1fc50 6f 75 74 69 6e 65 20 77 69 74 68 20 61 20 68 61  outine with a ha
1fc60 72 6d 6c 65 73 73 20 6e 6f 2d 6f 70 2e 20 20 54  rmless no-op.  T
1fc70 6f 20 6d 61 6b 65 20 74 68 69 73 20 72 6f 75 74  o make this rout
1fc80 69 6e 65 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2c 20  ine.** a no-op, 
1fc90 72 65 70 6c 61 63 65 20 69 74 20 77 69 74 68 20  replace it with 
1fca0 61 20 73 74 75 62 20 74 68 61 74 20 72 65 74 75  a stub that retu
1fcb0 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 20 62 75  rns SQLITE_OK bu
1fcc0 74 20 6c 65 61 76 65 73 0a 2a 2a 20 2a 70 46 64  t leaves.** *pFd
1fcd0 20 73 65 74 20 74 6f 20 61 20 6e 65 67 61 74 69   set to a negati
1fce0 76 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a  ve number..**.**
1fcf0 20 49 66 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73   If SQLITE_OK is
1fd00 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65 20 63   returned, the c
1fd10 61 6c 6c 65 72 20 69 73 20 72 65 73 70 6f 6e 73  aller is respons
1fd20 69 62 6c 65 20 66 6f 72 20 63 6c 6f 73 69 6e 67  ible for closing
1fd30 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20 64 65 73  .** the file des
1fd40 63 72 69 70 74 6f 72 20 2a 70 46 64 20 75 73 69  criptor *pFd usi
1fd50 6e 67 20 63 6c 6f 73 65 28 29 2e 0a 2a 2f 0a 73  ng close()..*/.s
1fd60 74 61 74 69 63 20 69 6e 74 20 6f 70 65 6e 44 69  tatic int openDi
1fd70 72 65 63 74 6f 72 79 28 63 6f 6e 73 74 20 63 68  rectory(const ch
1fd80 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 69  ar *zFilename, i
1fd90 6e 74 20 2a 70 46 64 29 7b 0a 20 20 69 6e 74 20  nt *pFd){.  int 
1fda0 69 69 3b 0a 20 20 69 6e 74 20 66 64 20 3d 20 2d  ii;.  int fd = -
1fdb0 31 3b 0a 20 20 63 68 61 72 20 7a 44 69 72 6e 61  1;.  char zDirna
1fdc0 6d 65 5b 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b  me[MAX_PATHNAME+
1fdd0 31 5d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73  1];..  sqlite3_s
1fde0 6e 70 72 69 6e 74 66 28 4d 41 58 5f 50 41 54 48  nprintf(MAX_PATH
1fdf0 4e 41 4d 45 2c 20 7a 44 69 72 6e 61 6d 65 2c 20  NAME, zDirname, 
1fe00 22 25 73 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 29  "%s", zFilename)
1fe10 3b 0a 20 20 66 6f 72 28 69 69 3d 28 69 6e 74 29  ;.  for(ii=(int)
1fe20 73 74 72 6c 65 6e 28 7a 44 69 72 6e 61 6d 65 29  strlen(zDirname)
1fe30 3b 20 69 69 3e 31 20 26 26 20 7a 44 69 72 6e 61  ; ii>1 && zDirna
1fe40 6d 65 5b 69 69 5d 21 3d 27 2f 27 3b 20 69 69 2d  me[ii]!='/'; ii-
1fe50 2d 29 3b 0a 20 20 69 66 28 20 69 69 3e 30 20 29  -);.  if( ii>0 )
1fe60 7b 0a 20 20 20 20 7a 44 69 72 6e 61 6d 65 5b 69  {.    zDirname[i
1fe70 69 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 66  i] = '\0';.    f
1fe80 64 20 3d 20 72 6f 62 75 73 74 5f 6f 70 65 6e 28  d = robust_open(
1fe90 7a 44 69 72 6e 61 6d 65 2c 20 4f 5f 52 44 4f 4e  zDirname, O_RDON
1fea0 4c 59 7c 4f 5f 42 49 4e 41 52 59 2c 20 30 29 3b  LY|O_BINARY, 0);
1feb0 0a 20 20 20 20 69 66 28 20 66 64 3e 3d 30 20 29  .    if( fd>=0 )
1fec0 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  {.      OSTRACE(
1fed0 28 22 4f 50 45 4e 44 49 52 20 25 2d 33 64 20 25  ("OPENDIR %-3d %
1fee0 73 5c 6e 22 2c 20 66 64 2c 20 7a 44 69 72 6e 61  s\n", fd, zDirna
1fef0 6d 65 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  me));.    }.  }.
1ff00 20 20 2a 70 46 64 20 3d 20 66 64 3b 0a 20 20 72    *pFd = fd;.  r
1ff10 65 74 75 72 6e 20 28 66 64 3e 3d 30 3f 53 51 4c  eturn (fd>=0?SQL
1ff20 49 54 45 5f 4f 4b 3a 75 6e 69 78 4c 6f 67 45 72  ITE_OK:unixLogEr
1ff30 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f  ror(SQLITE_CANTO
1ff40 50 45 4e 5f 42 4b 50 54 2c 20 22 6f 70 65 6e 22  PEN_BKPT, "open"
1ff50 2c 20 7a 44 69 72 6e 61 6d 65 29 29 3b 0a 7d 0a  , zDirname));.}.
1ff60 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65  ./*.** Make sure
1ff70 20 61 6c 6c 20 77 72 69 74 65 73 20 74 6f 20 61   all writes to a
1ff80 20 70 61 72 74 69 63 75 6c 61 72 20 66 69 6c 65   particular file
1ff90 20 61 72 65 20 63 6f 6d 6d 69 74 74 65 64 20 74   are committed t
1ffa0 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66  o disk..**.** If
1ffb0 20 64 61 74 61 4f 6e 6c 79 3d 3d 30 20 74 68 65   dataOnly==0 the
1ffc0 6e 20 62 6f 74 68 20 74 68 65 20 66 69 6c 65 20  n both the file 
1ffd0 69 74 73 65 6c 66 20 61 6e 64 20 69 74 73 20 6d  itself and its m
1ffe0 65 74 61 64 61 74 61 20 28 66 69 6c 65 0a 2a 2a  etadata (file.**
1fff0 20 73 69 7a 65 2c 20 61 63 63 65 73 73 20 74 69   size, access ti
20000 6d 65 2c 20 65 74 63 29 20 61 72 65 20 73 79 6e  me, etc) are syn
20010 63 65 64 2e 20 20 49 66 20 64 61 74 61 4f 6e 6c  ced.  If dataOnl
20020 79 21 3d 30 20 74 68 65 6e 20 6f 6e 6c 79 20 74  y!=0 then only t
20030 68 65 0a 2a 2a 20 66 69 6c 65 20 64 61 74 61 20  he.** file data 
20040 69 73 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a  is synced..**.**
20050 20 55 6e 64 65 72 20 55 6e 69 78 2c 20 61 6c 73   Under Unix, als
20060 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  o make sure that
20070 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 65   the directory e
20080 6e 74 72 79 20 66 6f 72 20 74 68 65 20 66 69 6c  ntry for the fil
20090 65 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 63 72  e.** has been cr
200a0 65 61 74 65 64 20 62 79 20 66 73 79 6e 63 2d 69  eated by fsync-i
200b0 6e 67 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  ng the directory
200c0 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
200d0 68 65 20 66 69 6c 65 2e 0a 2a 2a 20 49 66 20 77  he file..** If w
200e0 65 20 64 6f 20 6e 6f 74 20 64 6f 20 74 68 69 73  e do not do this
200f0 20 61 6e 64 20 77 65 20 65 6e 63 6f 75 6e 74 65   and we encounte
20100 72 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72  r a power failur
20110 65 2c 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  e, the directory
20120 0a 2a 2a 20 65 6e 74 72 79 20 66 6f 72 20 74 68  .** entry for th
20130 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20  e journal might 
20140 6e 6f 74 20 65 78 69 73 74 20 61 66 74 65 72 20  not exist after 
20150 77 65 20 72 65 62 6f 6f 74 2e 20 20 54 68 65 20  we reboot.  The 
20160 6e 65 78 74 0a 2a 2a 20 53 51 4c 69 74 65 20 74  next.** SQLite t
20170 6f 20 61 63 63 65 73 73 20 74 68 65 20 66 69 6c  o access the fil
20180 65 20 77 69 6c 6c 20 6e 6f 74 20 6b 6e 6f 77 20  e will not know 
20190 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c  that the journal
201a0 20 65 78 69 73 74 73 20 28 62 65 63 61 75 73 65   exists (because
201b0 0a 2a 2a 20 74 68 65 20 64 69 72 65 63 74 6f 72  .** the director
201c0 79 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20  y entry for the 
201d0 6a 6f 75 72 6e 61 6c 20 77 61 73 20 6e 65 76 65  journal was neve
201e0 72 20 63 72 65 61 74 65 64 29 20 61 6e 64 20 74  r created) and t
201f0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a  he transaction.*
20200 2a 20 77 69 6c 6c 20 6e 6f 74 20 72 6f 6c 6c 20  * will not roll 
20210 62 61 63 6b 20 2d 20 70 6f 73 73 69 62 6c 79 20  back - possibly 
20220 6c 65 61 64 69 6e 67 20 74 6f 20 64 61 74 61 62  leading to datab
20230 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a  ase corruption..
20240 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  */.static int un
20250 69 78 53 79 6e 63 28 73 71 6c 69 74 65 33 5f 66  ixSync(sqlite3_f
20260 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 66 6c 61  ile *id, int fla
20270 67 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  gs){.  int rc;. 
20280 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
20290 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
202a0 3b 0a 0a 20 20 69 6e 74 20 69 73 44 61 74 61 4f  ;..  int isDataO
202b0 6e 6c 79 20 3d 20 28 66 6c 61 67 73 26 53 51 4c  nly = (flags&SQL
202c0 49 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c  ITE_SYNC_DATAONL
202d0 59 29 3b 0a 20 20 69 6e 74 20 69 73 46 75 6c 6c  Y);.  int isFull
202e0 73 79 6e 63 20 3d 20 28 66 6c 61 67 73 26 30 78  sync = (flags&0x
202f0 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43  0F)==SQLITE_SYNC
20300 5f 46 55 4c 4c 3b 0a 0a 20 20 2f 2a 20 43 68 65  _FULL;..  /* Che
20310 63 6b 20 74 68 61 74 20 6f 6e 65 20 6f 66 20 53  ck that one of S
20320 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41  QLITE_SYNC_NORMA
20330 4c 20 6f 72 20 46 55 4c 4c 20 77 61 73 20 70 61  L or FULL was pa
20340 73 73 65 64 20 2a 2f 0a 20 20 61 73 73 65 72 74  ssed */.  assert
20350 28 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53  ((flags&0x0F)==S
20360 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41  QLITE_SYNC_NORMA
20370 4c 0a 20 20 20 20 20 20 7c 7c 20 28 66 6c 61 67  L.      || (flag
20380 73 26 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f  s&0x0F)==SQLITE_
20390 53 59 4e 43 5f 46 55 4c 4c 0a 20 20 29 3b 0a 0a  SYNC_FULL.  );..
203a0 20 20 2f 2a 20 55 6e 69 78 20 63 61 6e 6e 6f 74    /* Unix cannot
203b0 2c 20 62 75 74 20 73 6f 6d 65 20 73 79 73 74 65  , but some syste
203c0 6d 73 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51  ms may return SQ
203d0 4c 49 54 45 5f 46 55 4c 4c 20 66 72 6f 6d 20 68  LITE_FULL from h
203e0 65 72 65 2e 20 54 68 69 73 0a 20 20 2a 2a 20 6c  ere. This.  ** l
203f0 69 6e 65 20 69 73 20 74 6f 20 74 65 73 74 20 74  ine is to test t
20400 68 61 74 20 64 6f 69 6e 67 20 73 6f 20 64 6f 65  hat doing so doe
20410 73 20 6e 6f 74 20 63 61 75 73 65 20 61 6e 79 20  s not cause any 
20420 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 2a 2f 0a 20  problems..  */. 
20430 20 53 69 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c   SimulateDiskful
20440 6c 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53  lError( return S
20450 51 4c 49 54 45 5f 46 55 4c 4c 20 29 3b 0a 0a 20  QLITE_FULL );.. 
20460 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
20470 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 53 59  ;.  OSTRACE(("SY
20480 4e 43 20 20 20 20 25 2d 33 64 5c 6e 22 2c 20 70  NC    %-3d\n", p
20490 46 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 72 63 20  File->h));.  rc 
204a0 3d 20 66 75 6c 6c 5f 66 73 79 6e 63 28 70 46 69  = full_fsync(pFi
204b0 6c 65 2d 3e 68 2c 20 69 73 46 75 6c 6c 73 79 6e  le->h, isFullsyn
204c0 63 2c 20 69 73 44 61 74 61 4f 6e 6c 79 29 3b 0a  c, isDataOnly);.
204d0 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
204e0 72 28 20 72 63 3d 31 20 29 3b 0a 20 20 69 66 28  r( rc=1 );.  if(
204f0 20 72 63 20 29 7b 0a 20 20 20 20 73 74 6f 72 65   rc ){.    store
20500 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c  LastErrno(pFile,
20510 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 72 65 74   errno);.    ret
20520 75 72 6e 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72  urn unixLogError
20530 28 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53  (SQLITE_IOERR_FS
20540 59 4e 43 2c 20 22 66 75 6c 6c 5f 66 73 79 6e 63  YNC, "full_fsync
20550 22 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74 68 29  ", pFile->zPath)
20560 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 73 6f  ;.  }..  /* Also
20570 20 66 73 79 6e 63 20 74 68 65 20 64 69 72 65 63   fsync the direc
20580 74 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20  tory containing 
20590 74 68 65 20 66 69 6c 65 20 69 66 20 74 68 65 20  the file if the 
205a0 44 49 52 53 59 4e 43 20 66 6c 61 67 0a 20 20 2a  DIRSYNC flag.  *
205b0 2a 20 69 73 20 73 65 74 2e 20 20 54 68 69 73 20  * is set.  This 
205c0 69 73 20 61 20 6f 6e 65 2d 74 69 6d 65 20 6f 63  is a one-time oc
205d0 63 75 72 72 65 6e 63 65 2e 20 20 4d 61 6e 79 20  currence.  Many 
205e0 73 79 73 74 65 6d 73 20 28 65 78 61 6d 70 6c 65  systems (example
205f0 73 3a 20 41 49 58 29 0a 20 20 2a 2a 20 61 72 65  s: AIX).  ** are
20600 20 75 6e 61 62 6c 65 20 74 6f 20 66 73 79 6e 63   unable to fsync
20610 20 61 20 64 69 72 65 63 74 6f 72 79 2c 20 73 6f   a directory, so
20620 20 69 67 6e 6f 72 65 20 65 72 72 6f 72 73 20 6f   ignore errors o
20630 6e 20 74 68 65 20 66 73 79 6e 63 2e 0a 20 20 2a  n the fsync..  *
20640 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 63  /.  if( pFile->c
20650 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46  trlFlags & UNIXF
20660 49 4c 45 5f 44 49 52 53 59 4e 43 20 29 7b 0a 20  ILE_DIRSYNC ){. 
20670 20 20 20 69 6e 74 20 64 69 72 66 64 3b 0a 20 20     int dirfd;.  
20680 20 20 4f 53 54 52 41 43 45 28 28 22 44 49 52 53    OSTRACE(("DIRS
20690 59 4e 43 20 25 73 20 28 68 61 76 65 5f 66 75 6c  YNC %s (have_ful
206a0 6c 66 73 79 6e 63 3d 25 64 20 66 75 6c 6c 73 79  lfsync=%d fullsy
206b0 6e 63 3d 25 64 29 5c 6e 22 2c 20 70 46 69 6c 65  nc=%d)\n", pFile
206c0 2d 3e 7a 50 61 74 68 2c 0a 20 20 20 20 20 20 20  ->zPath,.       
206d0 20 20 20 20 20 48 41 56 45 5f 46 55 4c 4c 46 53       HAVE_FULLFS
206e0 59 4e 43 2c 20 69 73 46 75 6c 6c 73 79 6e 63 29  YNC, isFullsync)
206f0 29 3b 0a 20 20 20 20 72 63 20 3d 20 6f 73 4f 70  );.    rc = osOp
20700 65 6e 44 69 72 65 63 74 6f 72 79 28 70 46 69 6c  enDirectory(pFil
20710 65 2d 3e 7a 50 61 74 68 2c 20 26 64 69 72 66 64  e->zPath, &dirfd
20720 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
20730 51 4c 49 54 45 5f 4f 4b 20 26 26 20 64 69 72 66  QLITE_OK && dirf
20740 64 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 75  d>=0 ){.      fu
20750 6c 6c 5f 66 73 79 6e 63 28 64 69 72 66 64 2c 20  ll_fsync(dirfd, 
20760 30 2c 20 30 29 3b 0a 23 69 66 20 4f 53 43 4c 4f  0, 0);.#if OSCLO
20770 53 45 5f 43 48 45 43 4b 5f 43 4c 4f 53 45 5f 49  SE_CHECK_CLOSE_I
20780 4f 45 52 52 0a 20 20 20 20 20 20 69 66 28 20 63  OERR.      if( c
20790 6c 6f 73 65 28 70 46 69 6c 65 2d 3e 64 69 72 66  lose(pFile->dirf
207a0 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74  d) ){.        st
207b0 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69  oreLastErrno(pFi
207c0 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20  le, errno);.    
207d0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
207e0 49 4f 45 52 52 5f 44 49 52 5f 43 4c 4f 53 45 3b  IOERR_DIR_CLOSE;
207f0 0a 20 20 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20  .      }.#else. 
20800 20 20 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73       robust_clos
20810 65 28 70 46 69 6c 65 2c 20 64 69 72 66 64 2c 20  e(pFile, dirfd, 
20820 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 23 65 6e 64 69  __LINE__);.#endi
20830 66 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  f.    }else if( 
20840 72 63 3d 3d 53 51 4c 49 54 45 5f 43 41 4e 54 4f  rc==SQLITE_CANTO
20850 50 45 4e 20 29 7b 0a 20 20 20 20 20 20 72 63 20  PEN ){.      rc 
20860 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
20870 20 7d 0a 20 20 20 20 70 46 69 6c 65 2d 3e 63 74   }.    pFile->ct
20880 72 6c 46 6c 61 67 73 20 26 3d 20 7e 55 4e 49 58  rlFlags &= ~UNIX
20890 46 49 4c 45 5f 44 49 52 53 59 4e 43 3b 0a 0a 20  FILE_DIRSYNC;.. 
208a0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
208b0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74  }../*.** Truncat
208c0 65 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20 74  e an open file t
208d0 6f 20 61 20 73 70 65 63 69 66 69 65 64 20 73 69  o a specified si
208e0 7a 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ze.*/.static int
208f0 20 75 6e 69 78 54 72 75 6e 63 61 74 65 28 73 71   unixTruncate(sq
20900 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
20910 69 36 34 20 6e 42 79 74 65 29 7b 0a 20 20 75 6e  i64 nByte){.  un
20920 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
20930 28 75 6e 69 78 46 69 6c 65 20 2a 29 69 64 3b 0a  (unixFile *)id;.
20940 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65    int rc;.  asse
20950 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 53  rt( pFile );.  S
20960 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
20970 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
20980 45 52 52 5f 54 52 55 4e 43 41 54 45 20 29 3b 0a  ERR_TRUNCATE );.
20990 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 75 73 65  .  /* If the use
209a0 72 20 68 61 73 20 63 6f 6e 66 69 67 75 72 65 64  r has configured
209b0 20 61 20 63 68 75 6e 6b 2d 73 69 7a 65 20 66 6f   a chunk-size fo
209c0 72 20 74 68 69 73 20 66 69 6c 65 2c 20 74 72 75  r this file, tru
209d0 6e 63 61 74 65 20 74 68 65 0a 20 20 2a 2a 20 66  ncate the.  ** f
209e0 69 6c 65 20 73 6f 20 74 68 61 74 20 69 74 20 63  ile so that it c
209f0 6f 6e 73 69 73 74 73 20 6f 66 20 61 6e 20 69 6e  onsists of an in
20a00 74 65 67 65 72 20 6e 75 6d 62 65 72 20 6f 66 20  teger number of 
20a10 63 68 75 6e 6b 73 20 28 69 2e 65 2e 20 74 68 65  chunks (i.e. the
20a20 0a 20 20 2a 2a 20 61 63 74 75 61 6c 20 66 69 6c  .  ** actual fil
20a30 65 20 73 69 7a 65 20 61 66 74 65 72 20 74 68 65  e size after the
20a40 20 6f 70 65 72 61 74 69 6f 6e 20 6d 61 79 20 62   operation may b
20a50 65 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68  e larger than th
20a60 65 20 72 65 71 75 65 73 74 65 64 0a 20 20 2a 2a  e requested.  **
20a70 20 73 69 7a 65 29 2e 0a 20 20 2a 2f 0a 20 20 69   size)..  */.  i
20a80 66 28 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e  f( pFile->szChun
20a90 6b 3e 30 20 29 7b 0a 20 20 20 20 6e 42 79 74 65  k>0 ){.    nByte
20aa0 20 3d 20 28 28 6e 42 79 74 65 20 2b 20 70 46 69   = ((nByte + pFi
20ab0 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20 2d 20 31 29  le->szChunk - 1)
20ac0 2f 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 29  /pFile->szChunk)
20ad0 20 2a 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e   * pFile->szChun
20ae0 6b 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 72  k;.  }..  rc = r
20af0 6f 62 75 73 74 5f 66 74 72 75 6e 63 61 74 65 28  obust_ftruncate(
20b00 70 46 69 6c 65 2d 3e 68 2c 20 6e 42 79 74 65 29  pFile->h, nByte)
20b10 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
20b20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f    storeLastErrno
20b30 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a  (pFile, errno);.
20b40 20 20 20 20 72 65 74 75 72 6e 20 75 6e 69 78 4c      return unixL
20b50 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49  ogError(SQLITE_I
20b60 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 2c 20 22  OERR_TRUNCATE, "
20b70 66 74 72 75 6e 63 61 74 65 22 2c 20 70 46 69 6c  ftruncate", pFil
20b80 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 7d 65 6c  e->zPath);.  }el
20b90 73 65 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  se{.#ifdef SQLIT
20ba0 45 5f 44 45 42 55 47 0a 20 20 20 20 2f 2a 20 49  E_DEBUG.    /* I
20bb0 66 20 77 65 20 61 72 65 20 64 6f 69 6e 67 20 61  f we are doing a
20bc0 20 6e 6f 72 6d 61 6c 20 77 72 69 74 65 20 74 6f   normal write to
20bd0 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65   a database file
20be0 20 28 61 73 20 6f 70 70 6f 73 65 64 20 74 6f 0a   (as opposed to.
20bf0 20 20 20 20 2a 2a 20 64 6f 69 6e 67 20 61 20 68      ** doing a h
20c00 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
20c10 61 63 6b 20 6f 72 20 61 20 77 72 69 74 65 20 74  ack or a write t
20c20 6f 20 73 6f 6d 65 20 66 69 6c 65 20 6f 74 68 65  o some file othe
20c30 72 20 74 68 61 6e 20 61 0a 20 20 20 20 2a 2a 20  r than a.    ** 
20c40 6e 6f 72 6d 61 6c 20 64 61 74 61 62 61 73 65 20  normal database 
20c50 66 69 6c 65 29 20 61 6e 64 20 77 65 20 74 72 75  file) and we tru
20c60 6e 63 61 74 65 20 74 68 65 20 66 69 6c 65 20 74  ncate the file t
20c70 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68 2c 0a 20  o zero length,. 
20c80 20 20 20 2a 2a 20 74 68 61 74 20 65 66 66 65 63     ** that effec
20c90 74 69 76 65 6c 79 20 75 70 64 61 74 65 73 20 74  tively updates t
20ca0 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65  he change counte
20cb0 72 2e 20 20 54 68 69 73 20 6d 69 67 68 74 20 68  r.  This might h
20cc0 61 70 70 65 6e 0a 20 20 20 20 2a 2a 20 77 68 65  appen.    ** whe
20cd0 6e 20 72 65 73 74 6f 72 69 6e 67 20 61 20 64 61  n restoring a da
20ce0 74 61 62 61 73 65 20 75 73 69 6e 67 20 74 68 65  tabase using the
20cf0 20 62 61 63 6b 75 70 20 41 50 49 20 66 72 6f 6d   backup API from
20d00 20 61 20 7a 65 72 6f 2d 6c 65 6e 67 74 68 0a 20   a zero-length. 
20d10 20 20 20 2a 2a 20 73 6f 75 72 63 65 2e 0a 20 20     ** source..  
20d20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 46 69    */.    if( pFi
20d30 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74  le->inNormalWrit
20d40 65 20 26 26 20 6e 42 79 74 65 3d 3d 30 20 29 7b  e && nByte==0 ){
20d50 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 74 72  .      pFile->tr
20d60 61 6e 73 43 6e 74 72 43 68 6e 67 20 3d 20 31 3b  ansCntrChng = 1;
20d70 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23  .    }.#endif..#
20d80 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  if SQLITE_MAX_MM
20d90 41 50 5f 53 49 5a 45 3e 30 0a 20 20 20 20 2f 2a  AP_SIZE>0.    /*
20da0 20 49 66 20 74 68 65 20 66 69 6c 65 20 77 61 73   If the file was
20db0 20 6a 75 73 74 20 74 72 75 6e 63 61 74 65 64 20   just truncated 
20dc0 74 6f 20 61 20 73 69 7a 65 20 73 6d 61 6c 6c 65  to a size smalle
20dd0 72 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65  r than the curre
20de0 6e 74 6c 79 0a 20 20 20 20 2a 2a 20 6d 61 70 70  ntly.    ** mapp
20df0 65 64 20 72 65 67 69 6f 6e 2c 20 72 65 64 75 63  ed region, reduc
20e00 65 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20  e the effective 
20e10 6d 61 70 70 69 6e 67 20 73 69 7a 65 20 61 73 20  mapping size as 
20e20 77 65 6c 6c 2e 20 53 51 4c 69 74 65 20 77 69 6c  well. SQLite wil
20e30 6c 0a 20 20 20 20 2a 2a 20 75 73 65 20 72 65 61  l.    ** use rea
20e40 64 28 29 20 61 6e 64 20 77 72 69 74 65 28 29 20  d() and write() 
20e50 74 6f 20 61 63 63 65 73 73 20 64 61 74 61 20 62  to access data b
20e60 65 79 6f 6e 64 20 74 68 69 73 20 70 6f 69 6e 74  eyond this point
20e70 20 66 72 6f 6d 20 6e 6f 77 20 6f 6e 2e 20 20 0a   from now on.  .
20e80 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e      */.    if( n
20e90 42 79 74 65 3c 70 46 69 6c 65 2d 3e 6d 6d 61 70  Byte<pFile->mmap
20ea0 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 70 46  Size ){.      pF
20eb0 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 3d 20  ile->mmapSize = 
20ec0 6e 42 79 74 65 3b 0a 20 20 20 20 7d 0a 23 65 6e  nByte;.    }.#en
20ed0 64 69 66 0a 0a 20 20 20 20 72 65 74 75 72 6e 20  dif..    return 
20ee0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d  SQLITE_OK;.  }.}
20ef0 0a 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e  ../*.** Determin
20f00 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69  e the current si
20f10 7a 65 20 6f 66 20 61 20 66 69 6c 65 20 69 6e 20  ze of a file in 
20f20 62 79 74 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20  bytes.*/.static 
20f30 69 6e 74 20 75 6e 69 78 46 69 6c 65 53 69 7a 65  int unixFileSize
20f40 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
20f50 64 2c 20 69 36 34 20 2a 70 53 69 7a 65 29 7b 0a  d, i64 *pSize){.
20f60 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 74 72 75    int rc;.  stru
20f70 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20 61  ct stat buf;.  a
20f80 73 73 65 72 74 28 20 69 64 20 29 3b 0a 20 20 72  ssert( id );.  r
20f90 63 20 3d 20 6f 73 46 73 74 61 74 28 28 28 75 6e  c = osFstat(((un
20fa0 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 68 2c 20  ixFile*)id)->h, 
20fb0 26 62 75 66 29 3b 0a 20 20 53 69 6d 75 6c 61 74  &buf);.  Simulat
20fc0 65 49 4f 45 72 72 6f 72 28 20 72 63 3d 31 20 29  eIOError( rc=1 )
20fd0 3b 0a 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b  ;.  if( rc!=0 ){
20fe0 0a 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72  .    storeLastEr
20ff0 72 6e 6f 28 28 75 6e 69 78 46 69 6c 65 2a 29 69  rno((unixFile*)i
21000 64 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 72  d, errno);.    r
21010 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
21020 52 52 5f 46 53 54 41 54 3b 0a 20 20 7d 0a 20 20  RR_FSTAT;.  }.  
21030 2a 70 53 69 7a 65 20 3d 20 62 75 66 2e 73 74 5f  *pSize = buf.st_
21040 73 69 7a 65 3b 0a 0a 20 20 2f 2a 20 57 68 65 6e  size;..  /* When
21050 20 6f 70 65 6e 69 6e 67 20 61 20 7a 65 72 6f 2d   opening a zero-
21060 73 69 7a 65 20 64 61 74 61 62 61 73 65 2c 20 74  size database, t
21070 68 65 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f  he findInodeInfo
21080 28 29 20 70 72 6f 63 65 64 75 72 65 0a 20 20 2a  () procedure.  *
21090 2a 20 77 72 69 74 65 73 20 61 20 73 69 6e 67 6c  * writes a singl
210a0 65 20 62 79 74 65 20 69 6e 74 6f 20 74 68 61 74  e byte into that
210b0 20 66 69 6c 65 20 69 6e 20 6f 72 64 65 72 20 74   file in order t
210c0 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 61 20  o work around a 
210d0 62 75 67 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20  bug.  ** in the 
210e0 4f 53 2d 58 20 6d 73 64 6f 73 20 66 69 6c 65 73  OS-X msdos files
210f0 79 73 74 65 6d 2e 20 20 49 6e 20 6f 72 64 65 72  ystem.  In order
21100 20 74 6f 20 61 76 6f 69 64 20 70 72 6f 62 6c 65   to avoid proble
21110 6d 73 20 77 69 74 68 20 75 70 70 65 72 0a 20 20  ms with upper.  
21120 2a 2a 20 6c 61 79 65 72 73 2c 20 77 65 20 6e 65  ** layers, we ne
21130 65 64 20 74 6f 20 72 65 70 6f 72 74 20 74 68 69  ed to report thi
21140 73 20 66 69 6c 65 20 73 69 7a 65 20 61 73 20 7a  s file size as z
21150 65 72 6f 20 65 76 65 6e 20 74 68 6f 75 67 68 20  ero even though 
21160 69 74 20 69 73 0a 20 20 2a 2a 20 72 65 61 6c 6c  it is.  ** reall
21170 79 20 31 2e 20 20 20 54 69 63 6b 65 74 20 23 33  y 1.   Ticket #3
21180 32 36 30 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  260..  */.  if( 
21190 2a 70 53 69 7a 65 3d 3d 31 20 29 20 2a 70 53 69  *pSize==1 ) *pSi
211a0 7a 65 20 3d 20 30 3b 0a 0a 0a 20 20 72 65 74 75  ze = 0;...  retu
211b0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
211c0 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
211d0 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
211e0 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50   && defined(__AP
211f0 50 4c 45 5f 5f 29 0a 2f 2a 0a 2a 2a 20 48 61 6e  PLE__)./*.** Han
21200 64 6c 65 72 20 66 6f 72 20 70 72 6f 78 79 2d 6c  dler for proxy-l
21210 6f 63 6b 69 6e 67 20 66 69 6c 65 2d 63 6f 6e 74  ocking file-cont
21220 72 6f 6c 20 76 65 72 62 73 2e 20 20 44 65 66 69  rol verbs.  Defi
21230 6e 65 64 20 62 65 6c 6f 77 20 69 6e 20 74 68 65  ned below in the
21240 0a 2a 2a 20 70 72 6f 78 79 69 6e 67 20 6c 6f 63  .** proxying loc
21250 6b 69 6e 67 20 64 69 76 69 73 69 6f 6e 2e 0a 2a  king division..*
21260 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f  /.static int pro
21270 78 79 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 73 71  xyFileControl(sq
21280 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 69 6e 74 2c  lite3_file*,int,
21290 76 6f 69 64 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a  void*);.#endif..
212a0 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  /* .** This func
212b0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74  tion is called t
212c0 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 53 51 4c  o handle the SQL
212d0 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f 48  ITE_FCNTL_SIZE_H
212e0 49 4e 54 20 0a 2a 2a 20 66 69 6c 65 2d 63 6f 6e  INT .** file-con
212f0 74 72 6f 6c 20 6f 70 65 72 61 74 69 6f 6e 2e 20  trol operation. 
21300 20 45 6e 6c 61 72 67 65 20 74 68 65 20 64 61 74   Enlarge the dat
21310 61 62 61 73 65 20 74 6f 20 6e 42 79 74 65 73 20  abase to nBytes 
21320 69 6e 20 73 69 7a 65 0a 2a 2a 20 28 72 6f 75 6e  in size.** (roun
21330 64 65 64 20 75 70 20 74 6f 20 74 68 65 20 6e 65  ded up to the ne
21340 78 74 20 63 68 75 6e 6b 2d 73 69 7a 65 29 2e 20  xt chunk-size). 
21350 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
21360 20 69 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 6e   is already.** n
21370 42 79 74 65 73 20 6f 72 20 6c 61 72 67 65 72 2c  Bytes or larger,
21380 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
21390 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61   a no-op..*/.sta
213a0 74 69 63 20 69 6e 74 20 66 63 6e 74 6c 53 69 7a  tic int fcntlSiz
213b0 65 48 69 6e 74 28 75 6e 69 78 46 69 6c 65 20 2a  eHint(unixFile *
213c0 70 46 69 6c 65 2c 20 69 36 34 20 6e 42 79 74 65  pFile, i64 nByte
213d0 29 7b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e  ){.  if( pFile->
213e0 73 7a 43 68 75 6e 6b 3e 30 20 29 7b 0a 20 20 20  szChunk>0 ){.   
213f0 20 69 36 34 20 6e 53 69 7a 65 3b 20 20 20 20 20   i64 nSize;     
21400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
21410 2a 20 52 65 71 75 69 72 65 64 20 66 69 6c 65 20  * Required file 
21420 73 69 7a 65 20 2a 2f 0a 20 20 20 20 73 74 72 75  size */.    stru
21430 63 74 20 73 74 61 74 20 62 75 66 3b 20 20 20 20  ct stat buf;    
21440 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
21450 64 20 74 6f 20 68 6f 6c 64 20 72 65 74 75 72 6e  d to hold return
21460 20 76 61 6c 75 65 73 20 6f 66 20 66 73 74 61 74   values of fstat
21470 28 29 20 2a 2f 0a 20 20 20 0a 20 20 20 20 69 66  () */.   .    if
21480 28 20 6f 73 46 73 74 61 74 28 70 46 69 6c 65 2d  ( osFstat(pFile-
21490 3e 68 2c 20 26 62 75 66 29 20 29 7b 0a 20 20 20  >h, &buf) ){.   
214a0 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e     storeLastErrn
214b0 6f 28 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29 3b  o(pFile, errno);
214c0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
214d0 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54  LITE_IOERR_FSTAT
214e0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e 53 69  ;.    }..    nSi
214f0 7a 65 20 3d 20 28 28 6e 42 79 74 65 2b 70 46 69  ze = ((nByte+pFi
21500 6c 65 2d 3e 73 7a 43 68 75 6e 6b 2d 31 29 20 2f  le->szChunk-1) /
21510 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e 6b 29   pFile->szChunk)
21520 20 2a 20 70 46 69 6c 65 2d 3e 73 7a 43 68 75 6e   * pFile->szChun
21530 6b 3b 0a 20 20 20 20 69 66 28 20 6e 53 69 7a 65  k;.    if( nSize
21540 3e 28 69 36 34 29 62 75 66 2e 73 74 5f 73 69 7a  >(i64)buf.st_siz
21550 65 20 29 7b 0a 0a 23 69 66 20 64 65 66 69 6e 65  e ){..#if define
21560 64 28 48 41 56 45 5f 50 4f 53 49 58 5f 46 41 4c  d(HAVE_POSIX_FAL
21570 4c 4f 43 41 54 45 29 20 26 26 20 48 41 56 45 5f  LOCATE) && HAVE_
21580 50 4f 53 49 58 5f 46 41 4c 4c 4f 43 41 54 45 0a  POSIX_FALLOCATE.
21590 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 64        /* The cod
215a0 65 20 62 65 6c 6f 77 20 69 73 20 68 61 6e 64 6c  e below is handl
215b0 69 6e 67 20 74 68 65 20 72 65 74 75 72 6e 20 76  ing the return v
215c0 61 6c 75 65 20 6f 66 20 6f 73 46 61 6c 6c 6f 63  alue of osFalloc
215d0 61 74 65 28 29 20 0a 20 20 20 20 20 20 2a 2a 20  ate() .      ** 
215e0 63 6f 72 72 65 63 74 6c 79 2e 20 70 6f 73 69 78  correctly. posix
215f0 5f 66 61 6c 6c 6f 63 61 74 65 28 29 20 69 73 20  _fallocate() is 
21600 64 65 66 69 6e 65 64 20 74 6f 20 22 72 65 74 75  defined to "retu
21610 72 6e 73 20 7a 65 72 6f 20 6f 6e 20 73 75 63 63  rns zero on succ
21620 65 73 73 2c 20 0a 20 20 20 20 20 20 2a 2a 20 6f  ess, .      ** o
21630 72 20 61 6e 20 65 72 72 6f 72 20 6e 75 6d 62 65  r an error numbe
21640 72 20 6f 6e 20 20 66 61 69 6c 75 72 65 22 2e 20  r on  failure". 
21650 53 65 65 20 74 68 65 20 6d 61 6e 70 61 67 65 20  See the manpage 
21660 66 6f 72 20 64 65 74 61 69 6c 73 2e 20 2a 2f 0a  for details. */.
21670 20 20 20 20 20 20 69 6e 74 20 65 72 72 3b 0a 20        int err;. 
21680 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 20       do{.       
21690 20 65 72 72 20 3d 20 6f 73 46 61 6c 6c 6f 63 61   err = osFalloca
216a0 74 65 28 70 46 69 6c 65 2d 3e 68 2c 20 62 75 66  te(pFile->h, buf
216b0 2e 73 74 5f 73 69 7a 65 2c 20 6e 53 69 7a 65 2d  .st_size, nSize-
216c0 62 75 66 2e 73 74 5f 73 69 7a 65 29 3b 0a 20 20  buf.st_size);.  
216d0 20 20 20 20 7d 77 68 69 6c 65 28 20 65 72 72 3d      }while( err=
216e0 3d 45 49 4e 54 52 20 29 3b 0a 20 20 20 20 20 20  =EINTR );.      
216f0 69 66 28 20 65 72 72 20 29 20 72 65 74 75 72 6e  if( err ) return
21700 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52   SQLITE_IOERR_WR
21710 49 54 45 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20  ITE;.#else.     
21720 20 2f 2a 20 49 66 20 74 68 65 20 4f 53 20 64 6f   /* If the OS do
21730 65 73 20 6e 6f 74 20 68 61 76 65 20 70 6f 73 69  es not have posi
21740 78 5f 66 61 6c 6c 6f 63 61 74 65 28 29 2c 20 66  x_fallocate(), f
21750 61 6b 65 20 69 74 2e 20 57 72 69 74 65 20 61 20  ake it. Write a 
21760 0a 20 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65  .      ** single
21770 20 62 79 74 65 20 74 6f 20 74 68 65 20 6c 61 73   byte to the las
21780 74 20 62 79 74 65 20 69 6e 20 65 61 63 68 20 62  t byte in each b
21790 6c 6f 63 6b 20 74 68 61 74 20 66 61 6c 6c 73 20  lock that falls 
217a0 65 6e 74 69 72 65 6c 79 0a 20 20 20 20 20 20 2a  entirely.      *
217b0 2a 20 77 69 74 68 69 6e 20 74 68 65 20 65 78 74  * within the ext
217c0 65 6e 64 65 64 20 72 65 67 69 6f 6e 2e 20 54 68  ended region. Th
217d0 65 6e 2c 20 69 66 20 72 65 71 75 69 72 65 64 2c  en, if required,
217e0 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 0a 20   a single byte. 
217f0 20 20 20 20 20 2a 2a 20 61 74 20 6f 66 66 73 65       ** at offse
21800 74 20 28 6e 53 69 7a 65 2d 31 29 2c 20 74 6f 20  t (nSize-1), to 
21810 73 65 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20  set the size of 
21820 74 68 65 20 66 69 6c 65 20 63 6f 72 72 65 63 74  the file correct
21830 6c 79 2e 0a 20 20 20 20 20 20 2a 2a 20 54 68 69  ly..      ** Thi
21840 73 20 69 73 20 61 20 73 69 6d 69 6c 61 72 20 74  s is a similar t
21850 65 63 68 6e 69 71 75 65 20 74 6f 20 74 68 61 74  echnique to that
21860 20 75 73 65 64 20 62 79 20 67 6c 69 62 63 20 6f   used by glibc o
21870 6e 20 73 79 73 74 65 6d 73 0a 20 20 20 20 20 20  n systems.      
21880 2a 2a 20 74 68 61 74 20 64 6f 20 6e 6f 74 20 68  ** that do not h
21890 61 76 65 20 61 20 72 65 61 6c 20 66 61 6c 6c 6f  ave a real fallo
218a0 63 61 74 65 28 29 20 63 61 6c 6c 2e 0a 20 20 20  cate() call..   
218b0 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20     */.      int 
218c0 6e 42 6c 6b 20 3d 20 62 75 66 2e 73 74 5f 62 6c  nBlk = buf.st_bl
218d0 6b 73 69 7a 65 3b 20 20 2f 2a 20 46 69 6c 65 2d  ksize;  /* File-
218e0 73 79 73 74 65 6d 20 62 6c 6f 63 6b 20 73 69 7a  system block siz
218f0 65 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e  e */.      int n
21900 57 72 69 74 65 20 3d 20 30 3b 20 20 20 20 20 20  Write = 0;      
21910 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
21920 20 6f 66 20 62 79 74 65 73 20 77 72 69 74 74 65   of bytes writte
21930 6e 20 62 79 20 73 65 65 6b 41 6e 64 57 72 69 74  n by seekAndWrit
21940 65 20 2a 2f 0a 20 20 20 20 20 20 69 36 34 20 69  e */.      i64 i
21950 57 72 69 74 65 3b 20 20 20 20 20 20 20 20 20 20  Write;          
21960 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 6f         /* Next o
21970 66 66 73 65 74 20 74 6f 20 77 72 69 74 65 20 74  ffset to write t
21980 6f 20 2a 2f 0a 0a 20 20 20 20 20 20 69 66 28 20  o */..      if( 
21990 72 6f 62 75 73 74 5f 66 74 72 75 6e 63 61 74 65  robust_ftruncate
219a0 28 70 46 69 6c 65 2d 3e 68 2c 20 6e 53 69 7a 65  (pFile->h, nSize
219b0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 74 6f  ) ){.        sto
219c0 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c  reLastErrno(pFil
219d0 65 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 20  e, errno);.     
219e0 20 20 20 72 65 74 75 72 6e 20 75 6e 69 78 4c 6f     return unixLo
219f0 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f 49 4f  gError(SQLITE_IO
21a00 45 52 52 5f 54 52 55 4e 43 41 54 45 2c 20 22 66  ERR_TRUNCATE, "f
21a10 74 72 75 6e 63 61 74 65 22 2c 20 70 46 69 6c 65  truncate", pFile
21a20 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 20 20 20 20  ->zPath);.      
21a30 7d 0a 20 20 20 20 20 20 69 57 72 69 74 65 20 3d  }.      iWrite =
21a40 20 28 28 62 75 66 2e 73 74 5f 73 69 7a 65 20 2b   ((buf.st_size +
21a50 20 32 2a 6e 42 6c 6b 20 2d 20 31 29 2f 6e 42 6c   2*nBlk - 1)/nBl
21a60 6b 29 2a 6e 42 6c 6b 2d 31 3b 0a 20 20 20 20 20  k)*nBlk-1;.     
21a70 20 61 73 73 65 72 74 28 20 69 57 72 69 74 65 3e   assert( iWrite>
21a80 3d 62 75 66 2e 73 74 5f 73 69 7a 65 20 29 3b 0a  =buf.st_size );.
21a90 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 69        assert( (i
21aa0 57 72 69 74 65 2f 6e 42 6c 6b 29 3d 3d 28 28 62  Write/nBlk)==((b
21ab0 75 66 2e 73 74 5f 73 69 7a 65 2b 6e 42 6c 6b 2d  uf.st_size+nBlk-
21ac0 31 29 2f 6e 42 6c 6b 29 20 29 3b 0a 20 20 20 20  1)/nBlk) );.    
21ad0 20 20 61 73 73 65 72 74 28 20 28 28 69 57 72 69    assert( ((iWri
21ae0 74 65 2b 31 29 25 6e 42 6c 6b 29 3d 3d 30 20 29  te+1)%nBlk)==0 )
21af0 3b 0a 20 20 20 20 20 20 66 6f 72 28 2f 2a 6e 6f  ;.      for(/*no
21b00 2d 6f 70 2a 2f 3b 20 69 57 72 69 74 65 3c 6e 53  -op*/; iWrite<nS
21b10 69 7a 65 3b 20 69 57 72 69 74 65 2b 3d 6e 42 6c  ize; iWrite+=nBl
21b20 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 57 72  k ){.        nWr
21b30 69 74 65 20 3d 20 73 65 65 6b 41 6e 64 57 72 69  ite = seekAndWri
21b40 74 65 28 70 46 69 6c 65 2c 20 69 57 72 69 74 65  te(pFile, iWrite
21b50 2c 20 22 22 2c 20 31 29 3b 0a 20 20 20 20 20 20  , "", 1);.      
21b60 20 20 69 66 28 20 6e 57 72 69 74 65 21 3d 31 20    if( nWrite!=1 
21b70 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
21b80 49 4f 45 52 52 5f 57 52 49 54 45 3b 0a 20 20 20  IOERR_WRITE;.   
21b90 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e     }.      if( n
21ba0 57 72 69 74 65 3d 3d 30 20 7c 7c 20 28 6e 53 69  Write==0 || (nSi
21bb0 7a 65 25 6e 42 6c 6b 29 20 29 7b 0a 20 20 20 20  ze%nBlk) ){.    
21bc0 20 20 20 20 6e 57 72 69 74 65 20 3d 20 73 65 65      nWrite = see
21bd0 6b 41 6e 64 57 72 69 74 65 28 70 46 69 6c 65 2c  kAndWrite(pFile,
21be0 20 6e 53 69 7a 65 2d 31 2c 20 22 22 2c 20 31 29   nSize-1, "", 1)
21bf0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 57  ;.        if( nW
21c00 72 69 74 65 21 3d 31 20 29 20 72 65 74 75 72 6e  rite!=1 ) return
21c10 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52   SQLITE_IOERR_WR
21c20 49 54 45 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  ITE;.      }.#en
21c30 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23  dif.    }.  }..#
21c40 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  if SQLITE_MAX_MM
21c50 41 50 5f 53 49 5a 45 3e 30 0a 20 20 69 66 28 20  AP_SIZE>0.  if( 
21c60 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d  pFile->mmapSizeM
21c70 61 78 3e 30 20 26 26 20 6e 42 79 74 65 3e 70 46  ax>0 && nByte>pF
21c80 69 6c 65 2d 3e 6d 6d 61 70 53 69 7a 65 20 29 7b  ile->mmapSize ){
21c90 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20  .    int rc;.   
21ca0 20 69 66 28 20 70 46 69 6c 65 2d 3e 73 7a 43 68   if( pFile->szCh
21cb0 75 6e 6b 3c 3d 30 20 29 7b 0a 20 20 20 20 20 20  unk<=0 ){.      
21cc0 69 66 28 20 72 6f 62 75 73 74 5f 66 74 72 75 6e  if( robust_ftrun
21cd0 63 61 74 65 28 70 46 69 6c 65 2d 3e 68 2c 20 6e  cate(pFile->h, n
21ce0 42 79 74 65 29 20 29 7b 0a 20 20 20 20 20 20 20  Byte) ){.       
21cf0 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28   storeLastErrno(
21d00 70 46 69 6c 65 2c 20 65 72 72 6e 6f 29 3b 0a 20  pFile, errno);. 
21d10 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 75 6e         return un
21d20 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  ixLogError(SQLIT
21d30 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45  E_IOERR_TRUNCATE
21d40 2c 20 22 66 74 72 75 6e 63 61 74 65 22 2c 20 70  , "ftruncate", p
21d50 46 69 6c 65 2d 3e 7a 50 61 74 68 29 3b 0a 20 20  File->zPath);.  
21d60 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
21d70 20 72 63 20 3d 20 75 6e 69 78 4d 61 70 66 69 6c   rc = unixMapfil
21d80 65 28 70 46 69 6c 65 2c 20 6e 42 79 74 65 29 3b  e(pFile, nByte);
21d90 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
21da0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65    }.#endif..  re
21db0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
21dc0 7d 0a 0a 0a 23 69 66 20 28 53 51 4c 49 54 45 5f  }...#if (SQLITE_
21dd0 45 4e 41 42 4c 45 5f 41 50 50 4c 45 5f 53 50 49  ENABLE_APPLE_SPI
21de0 3e 30 29 20 26 26 20 64 65 66 69 6e 65 64 28 5f  >0) && defined(_
21df0 5f 41 50 50 4c 45 5f 5f 29 0a 23 69 6e 63 6c 75  _APPLE__).#inclu
21e00 64 65 20 22 73 71 6c 69 74 65 33 5f 70 72 69 76  de "sqlite3_priv
21e10 61 74 65 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  ate.h".#include 
21e20 3c 63 6f 70 79 66 69 6c 65 2e 68 3e 0a 73 74 61  <copyfile.h>.sta
21e30 74 69 63 20 69 6e 74 20 70 72 6f 78 79 47 65 74  tic int proxyGet
21e40 44 62 50 61 74 68 46 6f 72 55 6e 69 78 46 69 6c  DbPathForUnixFil
21e50 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c  e(unixFile *pFil
21e60 65 2c 20 63 68 61 72 20 2a 64 62 50 61 74 68 29  e, char *dbPath)
21e70 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51  ;.#endif..#if SQ
21e80 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
21e90 49 4e 47 5f 53 54 59 4c 45 0a 73 74 61 74 69 63  ING_STYLE.static
21ea0 20 69 6e 74 20 69 73 50 72 6f 78 79 4c 6f 63 6b   int isProxyLock
21eb0 69 6e 67 4d 6f 64 65 28 75 6e 69 78 46 69 6c 65  ingMode(unixFile
21ec0 20 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66   *);.#endif..#if
21ed0 20 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f   (SQLITE_ENABLE_
21ee0 41 50 50 4c 45 5f 53 50 49 3e 30 29 20 26 26 20  APPLE_SPI>0) && 
21ef0 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
21f00 5f 29 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e  _).static int un
21f10 69 78 54 72 75 6e 63 61 74 65 44 61 74 61 62 61  ixTruncateDataba
21f20 73 65 28 75 6e 69 78 46 69 6c 65 20 2a 2c 20 69  se(unixFile *, i
21f30 6e 74 29 3b 0a 0a 73 74 61 74 69 63 20 69 6e 74  nt);..static int
21f40 20 75 6e 69 78 49 6e 76 61 6c 69 64 61 74 65 53   unixInvalidateS
21f50 75 70 70 6f 72 74 46 69 6c 65 73 28 75 6e 69 78  upportFiles(unix
21f60 46 69 6c 65 20 2a 2c 20 69 6e 74 29 3b 0a 0a 73  File *, int);..s
21f70 74 61 74 69 63 20 69 6e 74 20 66 69 6e 64 43 72  tatic int findCr
21f80 65 61 74 65 46 69 6c 65 4d 6f 64 65 28 63 6f 6e  eateFileMode(con
21f90 73 74 20 63 68 61 72 20 2a 2c 20 69 6e 74 2c 20  st char *, int, 
21fa0 6d 6f 64 65 5f 74 2a 2c 20 75 69 64 5f 74 20 2a  mode_t*, uid_t *
21fb0 2c 67 69 64 5f 74 20 2a 29 3b 0a 0a 2f 2a 20 6f  ,gid_t *);../* o
21fc0 70 65 6e 73 20 61 20 72 65 61 64 2f 77 72 69 74  pens a read/writ
21fd0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  e connection to 
21fe0 61 20 66 69 6c 65 20 7a 4e 61 6d 65 20 69 6e 68  a file zName inh
21ff0 65 72 69 74 69 6e 67 20 74 68 65 20 61 70 70 72  eriting the appr
22000 6f 70 72 69 61 74 65 0a 2a 2a 20 75 73 65 72 2f  opriate.** user/
22010 70 65 72 6d 73 20 66 72 6f 6d 20 74 68 65 20 64  perms from the d
22020 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 66 20  atabase file if 
22030 72 75 6e 6e 69 6e 67 20 61 73 20 72 6f 6f 74 2e  running as root.
22040 20 20 52 65 74 75 72 6e 73 20 74 68 65 20 66 69    Returns the fi
22050 6c 65 20 0a 2a 2a 20 64 65 73 63 72 69 70 74 6f  le .** descripto
22060 72 20 62 79 20 72 65 66 65 72 65 6e 63 65 0a 2a  r by reference.*
22070 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
22080 78 4f 70 65 6e 43 68 69 6c 64 46 69 6c 65 28 0a  xOpenChildFile(.
22090 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
220a0 61 6d 65 2c 0a 20 20 69 6e 74 20 6f 70 65 6e 46  ame,.  int openF
220b0 6c 61 67 73 2c 0a 20 20 69 6e 74 20 64 62 4f 70  lags,.  int dbOp
220c0 65 6e 46 6c 61 67 73 2c 0a 20 20 69 6e 74 20 70  enFlags,.  int p
220d0 72 6f 74 46 6c 61 67 73 2c 0a 20 20 69 6e 74 20  rotFlags,.  int 
220e0 2a 70 46 64 0a 29 7b 0a 20 20 69 6e 74 20 66 64  *pFd.){.  int fd
220f0 20 3d 20 2d 31 3b 0a 20 20 6d 6f 64 65 5f 74 20   = -1;.  mode_t 
22100 6f 70 65 6e 4d 6f 64 65 3b 20 20 20 20 20 20 20  openMode;       
22110 20 20 20 20 20 20 20 2f 2a 20 50 65 72 6d 69 73         /* Permis
22120 73 69 6f 6e 73 20 74 6f 20 63 72 65 61 74 65 20  sions to create 
22130 66 69 6c 65 20 77 69 74 68 20 2a 2f 0a 20 20 75  file with */.  u
22140 69 64 5f 74 20 75 69 64 3b 20 20 20 20 20 20 20  id_t uid;       
22150 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22160 55 73 65 72 69 64 20 66 6f 72 20 74 68 65 20 66  Userid for the f
22170 69 6c 65 20 2a 2f 0a 20 20 67 69 64 5f 74 20 67  ile */.  gid_t g
22180 69 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  id;             
22190 20 20 20 20 20 20 20 2f 2a 20 47 72 6f 75 70 69         /* Groupi
221a0 64 20 66 6f 72 20 74 68 65 20 66 69 6c 65 20 2a  d for the file *
221b0 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 0a 20  /.  int rc;.  . 
221c0 20 61 73 73 65 72 74 28 70 46 64 21 3d 4e 55 4c   assert(pFd!=NUL
221d0 4c 29 3b 0a 20 20 72 63 20 3d 20 66 69 6e 64 43  L);.  rc = findC
221e0 72 65 61 74 65 46 69 6c 65 4d 6f 64 65 28 7a 4e  reateFileMode(zN
221f0 61 6d 65 2c 20 64 62 4f 70 65 6e 46 6c 61 67 73  ame, dbOpenFlags
22200 2c 20 26 6f 70 65 6e 4d 6f 64 65 2c 20 26 75 69  , &openMode, &ui
22210 64 2c 20 26 67 69 64 29 3b 0a 20 20 69 66 28 20  d, &gid);.  if( 
22220 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
22230 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
22240 20 20 7d 0a 20 20 66 64 20 3d 20 72 6f 62 75 73    }.  fd = robus
22250 74 5f 6f 70 65 6e 28 7a 4e 61 6d 65 2c 20 6f 70  t_open(zName, op
22260 65 6e 46 6c 61 67 73 2c 20 6f 70 65 6e 4d 6f 64  enFlags, openMod
22270 65 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22  e);.  OSTRACE(("
22280 4f 50 45 4e 58 20 20 20 25 2d 33 64 20 25 73 20  OPENX   %-3d %s 
22290 30 25 6f 5c 6e 22 2c 20 66 64 2c 20 7a 4e 61 6d  0%o\n", fd, zNam
222a0 65 2c 20 6f 70 65 6e 46 6c 61 67 73 29 29 3b 0a  e, openFlags));.
222b0 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20    if( fd<0 ){.  
222c0 20 20 72 63 20 3d 20 75 6e 69 78 4c 6f 67 45 72    rc = unixLogEr
222d0 72 6f 72 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f  ror(SQLITE_CANTO
222e0 50 45 4e 5f 42 4b 50 54 2c 20 22 6f 70 65 6e 22  PEN_BKPT, "open"
222f0 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65  , zName);.    re
22300 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 2f  turn rc;.  }.  /
22310 2a 20 69 66 20 77 65 27 72 65 20 6f 70 65 6e 69  * if we're openi
22320 6e 67 20 74 68 65 20 77 61 6c 20 6f 72 20 6a 6f  ng the wal or jo
22330 75 72 6e 61 6c 20 61 6e 64 20 72 75 6e 6e 69 6e  urnal and runnin
22340 67 20 61 73 20 72 6f 6f 74 2c 20 73 65 74 0a 20  g as root, set. 
22350 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   ** the journal 
22360 75 69 64 2f 67 69 64 20 2a 2f 0a 20 20 69 66 28  uid/gid */.  if(
22370 20 64 62 4f 70 65 6e 46 6c 61 67 73 20 26 20 28   dbOpenFlags & (
22380 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 7c  SQLITE_OPEN_WAL|
22390 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
223a0 5f 4a 4f 55 52 4e 41 4c 29 20 29 7b 0a 20 20 20  _JOURNAL) ){.   
223b0 20 75 69 64 5f 74 20 65 75 69 64 20 3d 20 67 65   uid_t euid = ge
223c0 74 65 75 69 64 28 29 3b 0a 20 20 20 20 69 66 28  teuid();.    if(
223d0 20 65 75 69 64 3d 3d 30 20 26 26 20 28 65 75 69   euid==0 && (eui
223e0 64 21 3d 75 69 64 20 7c 7c 20 67 65 74 65 67 69  d!=uid || getegi
223f0 64 28 29 21 3d 67 69 64 29 20 29 7b 0a 20 20 20  d()!=gid) ){.   
22400 20 20 20 69 66 28 20 66 63 68 6f 77 6e 28 66 64     if( fchown(fd
22410 2c 20 75 69 64 2c 20 67 69 64 29 20 29 7b 0a 20  , uid, gid) ){. 
22420 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
22430 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54  TE_CANTOPEN_BKPT
22440 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
22450 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
22460 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a  LITE_OK ){.    *
22470 70 46 64 20 3d 20 66 64 3b 0a 20 20 7d 20 65 6c  pFd = fd;.  } el
22480 73 65 20 7b 0a 20 20 20 20 2a 70 46 64 20 3d 20  se {.    *pFd = 
22490 2d 31 3b 0a 20 20 20 20 63 6c 6f 73 65 28 66 64  -1;.    close(fd
224a0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
224b0 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e  rc;.}..static in
224c0 74 20 75 6e 69 78 52 65 70 6c 61 63 65 44 61 74  t unixReplaceDat
224d0 61 62 61 73 65 28 75 6e 69 78 46 69 6c 65 20 2a  abase(unixFile *
224e0 70 46 69 6c 65 2c 20 73 71 6c 69 74 65 33 20 2a  pFile, sqlite3 *
224f0 73 72 63 64 62 29 20 7b 0a 20 20 73 71 6c 69 74  srcdb) {.  sqlit
22500 65 33 5f 66 69 6c 65 20 2a 69 64 20 3d 20 28 73  e3_file *id = (s
22510 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 70 46  qlite3_file *)pF
22520 69 6c 65 3b 0a 20 20 42 74 72 65 65 20 2a 70 53  ile;.  Btree *pS
22530 72 63 42 74 72 65 65 20 3d 20 4e 55 4c 4c 3b 0a  rcBtree = NULL;.
22540 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
22550 73 72 63 5f 66 69 6c 65 20 3d 20 4e 55 4c 4c 3b  src_file = NULL;
22560 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 53 72  .  unixFile *pSr
22570 63 46 69 6c 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20  cFile = NULL;.  
22580 63 68 61 72 20 73 72 63 57 61 6c 50 61 74 68 5b  char srcWalPath[
22590 4d 41 58 50 41 54 48 4c 45 4e 2b 35 5d 3b 0a 20  MAXPATHLEN+5];. 
225a0 20 69 6e 74 20 73 72 63 57 61 6c 46 44 20 3d 20   int srcWalFD = 
225b0 2d 31 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  -1;.  int rc = S
225c0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 76 6f 69 64  QLITE_OK;.  void
225d0 20 2a 70 4c 6f 63 6b 20 3d 20 4e 55 4c 4c 3b 0a   *pLock = NULL;.
225e0 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 30 3b    int flags = 0;
225f0 0a 20 20 73 71 6c 69 74 65 33 20 2a 73 72 63 64  .  sqlite3 *srcd
22600 62 32 20 3d 20 4e 55 4c 4c 3b 0a 20 20 63 6f 70  b2 = NULL;.  cop
22610 79 66 69 6c 65 5f 73 74 61 74 65 5f 74 20 73 3b  yfile_state_t s;
22620 0a 20 20 69 6e 74 20 63 6f 72 72 75 70 74 53 72  .  int corruptSr
22630 63 46 69 6c 65 4c 6f 63 6b 20 3d 20 30 3b 0a 20  cFileLock = 0;. 
22640 20 69 6e 74 20 63 6f 72 72 75 70 74 44 73 74 46   int corruptDstF
22650 69 6c 65 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 69  ileLock = 0;.  i
22660 6e 74 20 69 73 53 72 63 43 6f 72 72 75 70 74 20  nt isSrcCorrupt 
22670 3d 20 30 3b 0a 20 20 69 6e 74 20 69 73 44 73 74  = 0;.  int isDst
22680 43 6f 72 72 75 70 74 20 3d 20 30 3b 0a 20 20 0a  Corrupt = 0;.  .
22690 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
226a0 66 65 74 79 43 68 65 63 6b 4f 6b 28 73 72 63 64  fetyCheckOk(srcd
226b0 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  b) ){.    return
226c0 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a   SQLITE_MISUSE;.
226d0 20 20 7d 0a 20 20 20 20 0a 23 69 66 20 53 51 4c    }.    .#if SQL
226e0 49 54 45 5f 45 4e 41 42 4c 45 5f 44 41 54 41 5f  ITE_ENABLE_DATA_
226f0 50 52 4f 54 45 43 54 49 4f 4e 0a 20 20 66 6c 61  PROTECTION.  fla
22700 67 73 20 7c 3d 20 70 46 69 6c 65 2d 3e 70 72 6f  gs |= pFile->pro
22710 74 46 6c 61 67 73 3b 0a 23 65 6e 64 69 66 0a 23  tFlags;.#endif.#
22720 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
22730 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20  _LOCKING_STYLE. 
22740 20 69 66 28 20 69 73 50 72 6f 78 79 4c 6f 63 6b   if( isProxyLock
22750 69 6e 67 4d 6f 64 65 28 70 46 69 6c 65 29 20 29  ingMode(pFile) )
22760 7b 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53  {.    flags |= S
22770 51 4c 49 54 45 5f 4f 50 45 4e 5f 41 55 54 4f 50  QLITE_OPEN_AUTOP
22780 52 4f 58 59 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  ROXY;.  }.#endif
22790 0a 20 20 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  .  .  rc = sqlit
227a0 65 33 64 65 6d 6f 5f 73 75 70 65 72 6c 6f 63 6b  e3demo_superlock
227b0 28 70 46 69 6c 65 2d 3e 7a 50 61 74 68 2c 20 30  (pFile->zPath, 0
227c0 2c 20 66 6c 61 67 73 2c 20 30 2c 20 30 2c 20 26  , flags, 0, 0, &
227d0 70 4c 6f 63 6b 29 3b 0a 20 20 69 66 28 20 72 63  pLock);.  if( rc
227e0 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   ){.    if( rc==
227f0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 7c  SQLITE_CORRUPT |
22800 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54  | rc==SQLITE_NOT
22810 41 44 42 20 29 7b 0a 20 20 20 20 20 20 69 73 44  ADB ){.      isD
22820 73 74 43 6f 72 72 75 70 74 20 3d 20 31 3b 0a 20  stCorrupt = 1;. 
22830 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
22840 33 64 65 6d 6f 5f 73 75 70 65 72 6c 6f 63 6b 5f  3demo_superlock_
22850 63 6f 72 72 75 70 74 28 69 64 2c 20 53 51 4c 49  corrupt(id, SQLI
22860 54 45 5f 4c 4f 43 4b 5f 45 58 43 4c 55 53 49 56  TE_LOCK_EXCLUSIV
22870 45 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  E,.             
22880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22890 20 20 20 20 20 20 20 20 20 20 20 20 26 63 6f 72              &cor
228a0 72 75 70 74 44 73 74 46 69 6c 65 4c 6f 63 6b 29  ruptDstFileLock)
228b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
228c0 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  rc ){.      retu
228d0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d  rn rc;.    }.  }
228e0 0a 20 20 2f 2a 20 67 65 74 20 74 68 65 20 73 72  .  /* get the sr
228f0 63 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  c file descripto
22900 72 20 61 64 68 65 72 69 6e 67 20 74 6f 20 74 68  r adhering to th
22910 65 20 64 62 20 73 74 72 75 63 74 20 61 63 63 65  e db struct acce
22920 73 73 20 72 75 6c 65 73 20 0a 20 20 20 2a 2a 20  ss rules .   ** 
22930 74 68 69 73 20 63 6f 64 65 20 69 73 20 6d 6f 64  this code is mod
22940 65 6c 65 64 20 61 66 74 65 72 20 73 71 6c 69 74  eled after sqlit
22950 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28  e3_file_control(
22960 29 20 69 6e 20 6d 61 69 6e 2e 63 0a 20 20 20 2a  ) in main.c.   *
22970 2f 20 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  / .  sqlite3_mut
22980 65 78 5f 65 6e 74 65 72 28 73 72 63 64 62 2d 3e  ex_enter(srcdb->
22990 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 73 72  mutex);.  if( sr
229a0 63 64 62 2d 3e 6e 44 62 3e 30 20 29 7b 0a 20 20  cdb->nDb>0 ){.  
229b0 20 20 70 53 72 63 42 74 72 65 65 20 3d 20 73 72    pSrcBtree = sr
229c0 63 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 3b  cdb->aDb[0].pBt;
229d0 0a 20 20 7d 0a 20 20 69 66 28 20 70 53 72 63 42  .  }.  if( pSrcB
229e0 74 72 65 65 20 29 7b 0a 20 20 20 20 50 61 67 65  tree ){.    Page
229f0 72 20 2a 70 53 72 63 50 61 67 65 72 3b 0a 20 20  r *pSrcPager;.  
22a00 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
22a10 74 65 72 28 70 53 72 63 42 74 72 65 65 29 3b 0a  ter(pSrcBtree);.
22a20 20 20 20 20 70 53 72 63 50 61 67 65 72 20 3d 20      pSrcPager = 
22a30 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65  sqlite3BtreePage
22a40 72 28 70 53 72 63 42 74 72 65 65 29 3b 0a 20 20  r(pSrcBtree);.  
22a50 20 20 61 73 73 65 72 74 28 20 70 53 72 63 50 61    assert( pSrcPa
22a60 67 65 72 21 3d 30 20 29 3b 0a 20 20 20 20 73 72  ger!=0 );.    sr
22a70 63 5f 66 69 6c 65 20 3d 20 73 71 6c 69 74 65 33  c_file = sqlite3
22a80 50 61 67 65 72 46 69 6c 65 28 70 53 72 63 50 61  PagerFile(pSrcPa
22a90 67 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ger);.    assert
22aa0 28 20 73 72 63 5f 66 69 6c 65 21 3d 30 20 29 3b  ( src_file!=0 );
22ab0 0a 20 20 20 20 69 66 28 20 73 72 63 5f 66 69 6c  .    if( src_fil
22ac0 65 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20  e->pMethods ){. 
22ad0 20 20 20 20 20 69 6e 74 20 73 72 63 46 6c 61 67       int srcFlag
22ae0 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 53 72  s = 0;.      pSr
22af0 63 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  cFile = (unixFil
22b00 65 20 2a 29 73 72 63 5f 66 69 6c 65 3b 0a 23 69  e *)src_file;.#i
22b10 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
22b20 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 7c 7c  LOCKING_STYLE ||
22b30 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
22b40 5f 5f 29 0a 20 20 20 20 20 20 69 66 20 28 28 70  __).      if ((p
22b50 53 72 63 46 69 6c 65 2d 3e 6f 70 65 6e 46 6c 61  SrcFile->openFla
22b60 67 73 20 26 20 4f 5f 52 44 57 52 29 20 3d 3d 20  gs & O_RDWR) == 
22b70 4f 5f 52 44 57 52 29 20 7b 0a 20 20 20 20 20 20  O_RDWR) {.      
22b80 20 20 73 72 63 46 6c 61 67 73 20 3d 20 53 51 4c    srcFlags = SQL
22b90 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
22ba0 54 45 3b 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  TE;.      } else
22bb0 20 7b 0a 20 20 20 20 20 20 20 20 73 72 63 46 6c   {.        srcFl
22bc0 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45  ags = SQLITE_OPE
22bd0 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20  N_READONLY;.    
22be0 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 20 20    }.#else.      
22bf0 73 72 63 46 6c 61 67 73 20 3d 20 53 51 4c 49 54  srcFlags = SQLIT
22c00 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
22c10 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  ;.#endif.#if SQL
22c20 49 54 45 5f 45 4e 41 42 4c 45 5f 44 41 54 41 5f  ITE_ENABLE_DATA_
22c30 50 52 4f 54 45 43 54 49 4f 4e 0a 20 20 20 20 20  PROTECTION.     
22c40 20 73 72 63 46 6c 61 67 73 20 7c 3d 20 70 53 72   srcFlags |= pSr
22c50 63 46 69 6c 65 2d 3e 70 72 6f 74 46 6c 61 67 73  cFile->protFlags
22c60 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  ;.#endif.#if SQL
22c70 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
22c80 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20 20 20 69  NG_STYLE.      i
22c90 66 28 20 69 73 50 72 6f 78 79 4c 6f 63 6b 69 6e  f( isProxyLockin
22ca0 67 4d 6f 64 65 28 70 53 72 63 46 69 6c 65 29 20  gMode(pSrcFile) 
22cb0 29 7b 0a 20 20 20 20 20 20 20 20 73 72 63 46 6c  ){.        srcFl
22cc0 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50  ags |= SQLITE_OP
22cd0 45 4e 5f 41 55 54 4f 50 52 4f 58 59 3b 0a 20 20  EN_AUTOPROXY;.  
22ce0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
22cf0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
22d00 6f 70 65 6e 5f 76 32 28 70 53 72 63 46 69 6c 65  open_v2(pSrcFile
22d10 2d 3e 7a 50 61 74 68 2c 20 26 73 72 63 64 62 32  ->zPath, &srcdb2
22d20 2c 20 73 72 63 46 6c 61 67 73 2c 20 30 29 3b 0a  , srcFlags, 0);.
22d30 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
22d40 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
22d50 20 20 20 2f 2a 20 73 74 61 72 74 20 61 20 64 65     /* start a de
22d60 66 65 72 72 65 64 20 74 72 61 6e 73 61 63 74 69  ferred transacti
22d70 6f 6e 20 61 6e 64 20 72 65 61 64 20 74 6f 20 65  on and read to e
22d80 73 74 61 62 6c 69 73 68 20 61 20 72 65 61 64 20  stablish a read 
22d90 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20  lock */.        
22da0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65  rc = sqlite3_exe
22db0 63 28 73 72 63 64 62 32 2c 20 22 42 45 47 49 4e  c(srcdb2, "BEGIN
22dc0 20 44 45 46 45 52 52 45 44 3b 20 50 52 41 47 4d   DEFERRED; PRAGM
22dd0 41 20 73 63 68 65 6d 61 5f 76 65 72 73 69 6f 6e  A schema_version
22de0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
22df0 20 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20               0, 
22e00 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  0, 0);.        i
22e10 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 4f  f( rc==SQLITE_CO
22e20 52 52 55 50 54 20 7c 7c 20 72 63 3d 3d 53 51 4c  RRUPT || rc==SQL
22e30 49 54 45 5f 4e 4f 54 41 44 42 20 29 7b 0a 20 20  ITE_NOTADB ){.  
22e40 20 20 20 20 20 20 20 20 69 73 53 72 63 43 6f 72          isSrcCor
22e50 72 75 70 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  rupt = 1;.      
22e60 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
22e70 64 65 6d 6f 5f 73 75 70 65 72 6c 6f 63 6b 5f 63  demo_superlock_c
22e80 6f 72 72 75 70 74 28 73 72 63 5f 66 69 6c 65 2c  orrupt(src_file,
22e90 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 53 48 41   SQLITE_LOCK_SHA
22ea0 52 45 44 2c 0a 20 20 20 20 20 20 20 20 20 20 20  RED,.           
22eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22ed0 20 20 26 63 6f 72 72 75 70 74 53 72 63 46 69 6c    &corruptSrcFil
22ee0 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 20 20 20 20  eLock);.        
22ef0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
22f00 20 20 7d 0a 20 20 69 66 28 20 21 73 72 63 64 62    }.  if( !srcdb
22f10 32 20 7c 7c 20 70 53 72 63 46 69 6c 65 3d 3d 4e  2 || pSrcFile==N
22f20 55 4c 4c 20 7c 7c 20 70 53 72 63 46 69 6c 65 2d  ULL || pSrcFile-
22f30 3e 68 3c 30 29 7b 0a 20 20 20 20 72 63 20 3d 20  >h<0){.    rc = 
22f40 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e 41 4c 3b  SQLITE_INTERNAL;
22f50 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53  .  }.  if( rc!=S
22f60 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
22f70 67 6f 74 6f 20 65 6e 64 5f 72 65 70 6c 61 63 65  goto end_replace
22f80 5f 64 61 74 61 62 61 73 65 3b 0a 20 20 7d 0a 20  _database;.  }. 
22f90 20 2f 2a 20 62 6f 74 68 20 64 61 74 61 62 61 73   /* both databas
22fa0 65 73 20 61 72 65 20 6c 6f 63 6b 65 64 20 61 70  es are locked ap
22fb0 70 72 6f 70 72 69 61 74 65 6c 79 2c 20 63 6f 70  propriately, cop
22fc0 79 20 74 68 65 20 73 72 63 20 77 61 6c 20 6a 6f  y the src wal jo
22fd0 75 72 6e 61 6c 20 69 66 20 0a 20 20 20 2a 2a 20  urnal if .   ** 
22fe0 6f 6e 65 20 65 78 69 73 74 73 20 61 6e 64 20 74  one exists and t
22ff0 68 65 6e 20 74 68 65 20 61 63 74 75 61 6c 20 64  hen the actual d
23000 61 74 61 62 61 73 65 20 66 69 6c 65 0a 20 20 20  atabase file.   
23010 2a 2f 0a 20 20 73 74 72 6c 63 70 79 28 73 72 63  */.  strlcpy(src
23020 57 61 6c 50 61 74 68 2c 20 70 53 72 63 46 69 6c  WalPath, pSrcFil
23030 65 2d 3e 7a 50 61 74 68 2c 20 4d 41 58 50 41 54  e->zPath, MAXPAT
23040 48 4c 45 4e 2b 35 29 3b 0a 20 20 73 74 72 6c 63  HLEN+5);.  strlc
23050 61 74 28 73 72 63 57 61 6c 50 61 74 68 2c 20 22  at(srcWalPath, "
23060 2d 77 61 6c 22 2c 20 4d 41 58 50 41 54 48 4c 45  -wal", MAXPATHLE
23070 4e 2b 35 29 3b 0a 20 20 73 72 63 57 61 6c 46 44  N+5);.  srcWalFD
23080 20 3d 20 6f 70 65 6e 28 73 72 63 57 61 6c 50 61   = open(srcWalPa
23090 74 68 2c 20 4f 5f 52 44 4f 4e 4c 59 29 3b 0a 20  th, O_RDONLY);. 
230a0 20 69 66 28 20 21 28 73 72 63 57 61 6c 46 44 3c   if( !(srcWalFD<
230b0 30 29 20 29 7b 0a 20 20 20 20 63 68 61 72 20 64  0) ){.    char d
230c0 73 74 57 61 6c 50 61 74 68 5b 4d 41 58 50 41 54  stWalPath[MAXPAT
230d0 48 4c 45 4e 2b 35 5d 3b 0a 20 20 20 20 69 6e 74  HLEN+5];.    int
230e0 20 64 73 74 57 61 6c 46 44 20 3d 20 2d 31 3b 0a   dstWalFD = -1;.
230f0 20 20 20 20 69 6e 74 20 70 72 6f 74 46 6c 61 67      int protFlag
23100 73 20 3d 20 30 3b 0a 20 20 20 20 73 74 72 6c 63  s = 0;.    strlc
23110 70 79 28 64 73 74 57 61 6c 50 61 74 68 2c 20 70  py(dstWalPath, p
23120 46 69 6c 65 2d 3e 7a 50 61 74 68 2c 20 4d 41 58  File->zPath, MAX
23130 50 41 54 48 4c 45 4e 2b 35 29 3b 0a 20 20 20 20  PATHLEN+5);.    
23140 73 74 72 6c 63 61 74 28 64 73 74 57 61 6c 50 61  strlcat(dstWalPa
23150 74 68 2c 20 22 2d 77 61 6c 22 2c 20 4d 41 58 50  th, "-wal", MAXP
23160 41 54 48 4c 45 4e 2b 35 29 3b 0a 0a 20 20 20 20  ATHLEN+5);..    
23170 72 63 20 3d 20 75 6e 69 78 4f 70 65 6e 43 68 69  rc = unixOpenChi
23180 6c 64 46 69 6c 65 28 64 73 74 57 61 6c 50 61 74  ldFile(dstWalPat
23190 68 2c 20 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41  h, O_RDWR|O_CREA
231a0 54 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57  T, SQLITE_OPEN_W
231b0 41 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  AL,.            
231c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
231d0 72 6f 74 46 6c 61 67 73 2c 20 26 64 73 74 57 61  rotFlags, &dstWa
231e0 6c 46 44 29 3b 0a 20 20 20 20 69 66 28 20 72 63  lFD);.    if( rc
231f0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
23200 20 20 20 20 20 73 20 3d 20 63 6f 70 79 66 69 6c       s = copyfil
23210 65 5f 73 74 61 74 65 5f 61 6c 6c 6f 63 28 29 3b  e_state_alloc();
23220 0a 20 20 20 20 20 20 6c 73 65 65 6b 28 73 72 63  .      lseek(src
23230 57 61 6c 46 44 2c 20 30 2c 20 53 45 45 4b 5f 53  WalFD, 0, SEEK_S
23240 45 54 29 3b 0a 20 20 20 20 20 20 6c 73 65 65 6b  ET);.      lseek
23250 28 64 73 74 57 61 6c 46 44 2c 20 30 2c 20 53 45  (dstWalFD, 0, SE
23260 45 4b 5f 53 45 54 29 3b 0a 20 20 20 20 20 20 69  EK_SET);.      i
23270 66 28 20 66 63 6f 70 79 66 69 6c 65 28 73 72 63  f( fcopyfile(src
23280 57 61 6c 46 44 2c 20 64 73 74 57 61 6c 46 44 2c  WalFD, dstWalFD,
23290 20 73 2c 20 43 4f 50 59 46 49 4c 45 5f 44 41 54   s, COPYFILE_DAT
232a0 41 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  A) ){.        in
232b0 74 20 65 72 72 3d 65 72 72 6e 6f 3b 0a 20 20 20  t err=errno;.   
232c0 20 20 20 20 20 73 77 69 74 63 68 28 65 72 72 29       switch(err)
232d0 20 7b 0a 20 20 20 20 20 20 20 20 20 20 63 61 73   {.          cas
232e0 65 20 45 4e 4f 4d 45 4d 3a 0a 20 20 20 20 20 20  e ENOMEM:.      
232f0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
23300 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20  E_NOMEM;.       
23310 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
23320 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20        default:. 
23330 20 20 20 20 20 20 20 20 20 20 20 73 74 6f 72 65             store
23340 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c 65 2c  LastErrno(pFile,
23350 20 65 72 72 29 3b 0a 20 20 20 20 20 20 20 20 20   err);.         
23360 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
23370 4f 45 52 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a  OERR;.        }.
23380 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 6f        }.      co
23390 70 79 66 69 6c 65 5f 73 74 61 74 65 5f 66 72 65  pyfile_state_fre
233a0 65 28 73 29 3b 0a 20 20 20 20 20 20 63 6c 6f 73  e(s);.      clos
233b0 65 28 64 73 74 57 61 6c 46 44 29 3b 0a 20 20 20  e(dstWalFD);.   
233c0 20 7d 0a 20 20 20 20 63 6c 6f 73 65 28 73 72 63   }.    close(src
233d0 57 61 6c 46 44 29 3b 0a 20 20 7d 0a 20 20 69 66  WalFD);.  }.  if
233e0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
233f0 29 7b 0a 20 20 20 20 2f 2a 20 62 65 66 6f 72 65  ){.    /* before
23400 20 77 65 20 63 6f 70 79 2c 20 65 6e 73 75 72 65   we copy, ensure
23410 20 74 68 61 74 20 74 68 65 20 66 69 6c 65 20 63   that the file c
23420 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 77 69  hange counter wi
23430 6c 6c 20 62 65 20 6d 6f 64 69 66 69 65 64 20 2a  ll be modified *
23440 2f 0a 20 20 20 20 75 69 6e 74 33 32 5f 74 20 73  /.    uint32_t s
23450 72 63 43 68 61 6e 67 65 20 3d 20 30 3b 0a 20 20  rcChange = 0;.  
23460 20 20 75 69 6e 74 33 32 5f 74 20 64 73 74 43 68    uint32_t dstCh
23470 61 6e 67 65 20 3d 20 30 3b 0a 20 20 20 20 70 72  ange = 0;.    pr
23480 65 61 64 28 70 53 72 63 46 69 6c 65 2d 3e 68 2c  ead(pSrcFile->h,
23490 20 26 73 72 63 43 68 61 6e 67 65 2c 20 34 2c 20   &srcChange, 4, 
234a0 32 34 29 3b 0a 20 20 20 20 70 72 65 61 64 28 70  24);.    pread(p
234b0 46 69 6c 65 2d 3e 68 2c 20 26 64 73 74 43 68 61  File->h, &dstCha
234c0 6e 67 65 2c 20 34 2c 20 32 34 29 3b 0a 20 20 20  nge, 4, 24);.   
234d0 20 0a 20 20 20 20 2f 2a 20 63 6f 70 79 20 74 68   .    /* copy th
234e0 65 20 61 63 74 75 61 6c 20 64 61 74 61 62 61 73  e actual databas
234f0 65 20 2a 2f 0a 20 20 20 20 73 20 3d 20 63 6f 70  e */.    s = cop
23500 79 66 69 6c 65 5f 73 74 61 74 65 5f 61 6c 6c 6f  yfile_state_allo
23510 63 28 29 3b 0a 20 20 20 20 6c 73 65 65 6b 28 70  c();.    lseek(p
23520 53 72 63 46 69 6c 65 2d 3e 68 2c 20 30 2c 20 53  SrcFile->h, 0, S
23530 45 45 4b 5f 53 45 54 29 3b 0a 20 20 20 20 6c 73  EEK_SET);.    ls
23540 65 65 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 30 2c  eek(pFile->h, 0,
23550 20 53 45 45 4b 5f 53 45 54 29 3b 0a 20 20 20 20   SEEK_SET);.    
23560 69 66 28 20 66 63 6f 70 79 66 69 6c 65 28 70 53  if( fcopyfile(pS
23570 72 63 46 69 6c 65 2d 3e 68 2c 20 70 46 69 6c 65  rcFile->h, pFile
23580 2d 3e 68 2c 20 73 2c 20 43 4f 50 59 46 49 4c 45  ->h, s, COPYFILE
23590 5f 44 41 54 41 29 20 29 7b 0a 20 20 20 20 20 20  _DATA) ){.      
235a0 69 6e 74 20 65 72 72 3d 65 72 72 6e 6f 3b 0a 20  int err=errno;. 
235b0 20 20 20 20 20 73 77 69 74 63 68 28 65 72 72 29       switch(err)
235c0 20 7b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20   {.        case 
235d0 45 4e 4f 4d 45 4d 3a 0a 20 20 20 20 20 20 20 20  ENOMEM:.        
235e0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
235f0 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 62  MEM;.          b
23600 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 64 65  reak;.        de
23610 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 20 20 20  fault:.         
23620 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28   storeLastErrno(
23630 70 46 69 6c 65 2c 20 65 72 72 29 3b 0a 20 20 20  pFile, err);.   
23640 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
23650 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20 20 20  TE_IOERR;.      
23660 7d 0a 20 20 20 20 7d 0a 20 20 20 20 63 6f 70 79  }.    }.    copy
23670 66 69 6c 65 5f 73 74 61 74 65 5f 66 72 65 65 28  file_state_free(
23680 73 29 3b 0a 20 20 20 20 0a 20 20 20 20 69 66 20  s);.    .    if 
23690 28 73 72 63 43 68 61 6e 67 65 20 3d 3d 20 64 73  (srcChange == ds
236a0 74 43 68 61 6e 67 65 29 20 7b 0a 20 20 20 20 20  tChange) {.     
236b0 20 2f 2a 20 6d 6f 64 69 66 79 20 74 68 65 20 63   /* modify the c
236c0 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 74 6f  hange counter to
236d0 20 66 6f 72 63 65 20 70 61 67 65 20 7a 65 72 6f   force page zero
236e0 20 74 6f 20 62 65 20 72 65 6c 6f 61 64 65 64 20   to be reloaded 
236f0 2a 2f 0a 20 20 20 20 20 20 64 73 74 43 68 61 6e  */.      dstChan
23700 67 65 20 2b 2b 3b 0a 20 20 20 20 20 20 70 77 72  ge ++;.      pwr
23710 69 74 65 28 70 46 69 6c 65 2d 3e 68 2c 20 26 64  ite(pFile->h, &d
23720 73 74 43 68 61 6e 67 65 2c 20 34 2c 20 32 34 29  stChange, 4, 24)
23730 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
23740 28 20 69 73 53 72 63 43 6f 72 72 75 70 74 20 29  ( isSrcCorrupt )
23750 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 64 65 6d  {.    sqlite3dem
23760 6f 5f 73 75 70 65 72 75 6e 6c 6f 63 6b 5f 63 6f  o_superunlock_co
23770 72 72 75 70 74 28 73 72 63 5f 66 69 6c 65 2c 20  rrupt(src_file, 
23780 63 6f 72 72 75 70 74 53 72 63 46 69 6c 65 4c 6f  corruptSrcFileLo
23790 63 6b 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ck);.  }else{.  
237a0 20 20 2f 2a 20 64 6f 6e 65 20 77 69 74 68 20 74    /* done with t
237b0 68 65 20 73 6f 75 72 63 65 20 64 62 20 73 6f 20  he source db so 
237c0 65 6e 64 20 74 68 65 20 74 72 61 6e 73 61 63 74  end the transact
237d0 69 6f 6e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  ion */.    sqlit
237e0 65 33 5f 65 78 65 63 28 73 72 63 64 62 32 2c 20  e3_exec(srcdb2, 
237f0 22 43 4f 4d 4d 49 54 22 2c 20 30 2c 20 30 2c 20  "COMMIT", 0, 0, 
23800 30 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20 7a 65 72  0);.  }.  /* zer
23810 6f 20 6f 75 74 20 61 6e 79 20 6f 6c 64 20 6a 6f  o out any old jo
23820 75 72 6e 61 6c 20 63 6c 75 74 74 65 72 20 2a 2f  urnal clutter */
23830 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
23840 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20  E_OK ){.    int 
23850 73 6b 69 70 57 41 4c 20 3d 20 28 73 72 63 57 61  skipWAL = (srcWa
23860 6c 46 44 3c 30 29 3f 30 3a 31 3b 0a 20 20 20 20  lFD<0)?0:1;.    
23870 75 6e 69 78 49 6e 76 61 6c 69 64 61 74 65 53 75  unixInvalidateSu
23880 70 70 6f 72 74 46 69 6c 65 73 28 70 46 69 6c 65  pportFiles(pFile
23890 2c 20 73 6b 69 70 57 41 4c 29 3b 0a 20 20 7d 0a  , skipWAL);.  }.
238a0 20 20 0a 65 6e 64 5f 72 65 70 6c 61 63 65 5f 64    .end_replace_d
238b0 61 74 61 62 61 73 65 3a 0a 20 20 69 66 28 20 70  atabase:.  if( p
238c0 53 72 63 42 74 72 65 65 20 29 7b 0a 20 20 20 20  SrcBtree ){.    
238d0 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 73 72  sqlite3_close(sr
238e0 63 64 62 32 29 3b 0a 20 20 20 20 73 71 6c 69 74  cdb2);.    sqlit
238f0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 53 72  e3BtreeLeave(pSr
23900 63 42 74 72 65 65 29 3b 0a 20 20 7d 0a 20 20 73  cBtree);.  }.  s
23910 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
23920 76 65 28 73 72 63 64 62 2d 3e 6d 75 74 65 78 29  ve(srcdb->mutex)
23930 3b 0a 20 20 69 66 28 20 69 73 44 73 74 43 6f 72  ;.  if( isDstCor
23940 72 75 70 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  rupt ){.    sqli
23950 74 65 33 64 65 6d 6f 5f 73 75 70 65 72 75 6e 6c  te3demo_superunl
23960 6f 63 6b 5f 63 6f 72 72 75 70 74 28 69 64 2c 20  ock_corrupt(id, 
23970 63 6f 72 72 75 70 74 44 73 74 46 69 6c 65 4c 6f  corruptDstFileLo
23980 63 6b 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ck);.  }else{.  
23990 20 20 73 71 6c 69 74 65 33 64 65 6d 6f 5f 73 75    sqlite3demo_su
239a0 70 65 72 75 6e 6c 6f 63 6b 28 70 4c 6f 63 6b 29  perunlock(pLock)
239b0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
239c0 63 3b 0a 7d 0a 23 64 65 66 69 6e 65 20 53 51 4c  c;.}.#define SQL
239d0 49 54 45 5f 46 49 4c 45 5f 48 45 41 44 45 52 5f  ITE_FILE_HEADER_
239e0 4c 45 4e 20 31 36 0a 2f 2a 20 43 68 65 63 6b 20  LEN 16./* Check 
239f0 66 6f 72 20 61 20 63 6f 6e 66 6c 69 63 74 69 6e  for a conflictin
23a00 67 20 6c 6f 63 6b 2e 20 20 49 66 20 6f 6e 65 20  g lock.  If one 
23a10 69 73 20 66 6f 75 6e 64 2c 20 70 72 69 6e 74 20  is found, print 
23a20 61 6e 20 74 68 69 73 0a 20 2a 2a 20 6f 6e 20 73  an this. ** on s
23a30 74 61 6e 64 61 72 64 20 6f 75 74 70 75 74 20 75  tandard output u
23a40 73 69 6e 67 20 74 68 65 20 66 6f 72 6d 61 74 20  sing the format 
23a50 73 74 72 69 6e 67 20 67 69 76 65 6e 20 61 6e 64  string given and
23a60 20 72 65 74 75 72 6e 20 31 2e 0a 20 2a 2a 20 49   return 1.. ** I
23a70 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 63  f there are no c
23a80 6f 6e 66 6c 69 63 74 69 6e 67 20 6c 6f 63 6b 73  onflicting locks
23a90 2c 20 72 65 74 75 72 6e 20 30 2e 0a 20 2a 2f 0a  , return 0.. */.
23aa0 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 49  static int unixI
23ab0 73 4c 6f 63 6b 65 64 28 0a 20 20 70 69 64 5f 74  sLocked(.  pid_t
23ac0 20 70 69 64 2c 20 20 20 20 20 20 20 20 20 20 20   pid,           
23ad0 20 2f 2a 20 50 49 44 20 74 6f 20 74 65 73 74 20   /* PID to test 
23ae0 66 6f 72 20 6c 6f 63 6b 20 6f 77 6e 65 72 20 2a  for lock owner *
23af0 2f 0a 20 20 69 6e 74 20 68 2c 20 20 20 20 20 20  /.  int h,      
23b00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
23b10 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20  e descriptor to 
23b20 63 68 65 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 74  check */.  int t
23b30 79 70 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ype,            
23b40 20 2f 2a 20 46 5f 52 44 4c 43 4b 20 6f 72 20 46   /* F_RDLCK or F
23b50 5f 57 52 4c 43 4b 20 2a 2f 0a 20 20 75 6e 73 69  _WRLCK */.  unsi
23b60 67 6e 65 64 20 69 6e 74 20 69 4f 66 73 74 2c 20  gned int iOfst, 
23b70 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20    /* First byte 
23b80 6f 66 20 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a 20  of the lock */. 
23b90 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 43   unsigned int iC
23ba0 6e 74 2c 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  nt,    /* Number
23bb0 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65   of bytes in the
23bc0 20 6c 6f 63 6b 20 72 61 6e 67 65 20 2a 2f 0a 20   lock range */. 
23bd0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79   const char *zTy
23be0 70 65 20 20 20 20 20 2f 2a 20 54 79 70 65 20 6f  pe     /* Type o
23bf0 66 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 73  f lock */.){.  s
23c00 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6b 3b 0a  truct flock lk;.
23c10 20 20 69 6e 74 20 65 72 72 3b 0a 20 20 0a 20 20    int err;.  .  
23c20 6d 65 6d 73 65 74 28 26 6c 6b 2c 20 30 2c 20 73  memset(&lk, 0, s
23c30 69 7a 65 6f 66 28 6c 6b 29 29 3b 0a 20 20 6c 6b  izeof(lk));.  lk
23c40 2e 6c 5f 74 79 70 65 20 3d 20 74 79 70 65 3b 0a  .l_type = type;.
23c50 20 20 6c 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20    lk.l_whence = 
23c60 53 45 45 4b 5f 53 45 54 3b 0a 20 20 6c 6b 2e 6c  SEEK_SET;.  lk.l
23c70 5f 73 74 61 72 74 20 3d 20 69 4f 66 73 74 3b 0a  _start = iOfst;.
23c80 20 20 6c 6b 2e 6c 5f 6c 65 6e 20 3d 20 69 43 6e    lk.l_len = iCn
23c90 74 3b 0a 20 20 0a 20 20 69 66 28 20 70 69 64 21  t;.  .  if( pid!
23ca0 3d 53 51 4c 49 54 45 5f 4c 4f 43 4b 53 54 41 54  =SQLITE_LOCKSTAT
23cb0 45 5f 41 4e 59 50 49 44 20 29 7b 0a 23 69 66 6e  E_ANYPID ){.#ifn
23cc0 64 65 66 20 46 5f 47 45 54 4c 4b 50 49 44 0a 23  def F_GETLKPID.#
23cd0 20 77 61 72 6e 69 6e 67 20 46 5f 47 45 54 4c 4b   warning F_GETLK
23ce0 50 49 44 20 75 6e 64 65 66 69 6e 65 64 2c 20 5f  PID undefined, _
23cf0 73 71 6c 69 74 65 33 5f 6c 6f 63 6b 73 74 61 74  sqlite3_lockstat
23d00 65 20 66 61 6c 6c 69 6e 67 20 62 61 63 6b 20 74  e falling back t
23d10 6f 20 46 5f 47 45 54 4c 4b 0a 20 20 20 20 65 72  o F_GETLK.    er
23d20 72 20 3d 20 66 63 6e 74 6c 28 68 2c 20 46 5f 47  r = fcntl(h, F_G
23d30 45 54 4c 4b 2c 20 26 6c 6b 29 3b 0a 23 65 6c 73  ETLK, &lk);.#els
23d40 65 0a 20 20 20 20 6c 6b 2e 6c 5f 70 69 64 20 3d  e.    lk.l_pid =
23d50 20 70 69 64 3b 0a 20 20 20 20 65 72 72 20 3d 20   pid;.    err = 
23d60 66 63 6e 74 6c 28 68 2c 20 46 5f 47 45 54 4c 4b  fcntl(h, F_GETLK
23d70 50 49 44 2c 20 26 6c 6b 29 3b 0a 23 65 6e 64 69  PID, &lk);.#endi
23d80 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 65  f.  }else{.    e
23d90 72 72 20 3d 20 66 63 6e 74 6c 28 68 2c 20 46 5f  rr = fcntl(h, F_
23da0 47 45 54 4c 4b 2c 20 26 6c 6b 29 3b 0a 20 20 7d  GETLK, &lk);.  }
23db0 0a 20 20 0a 20 20 69 66 28 20 65 72 72 3d 3d 28  .  .  if( err==(
23dc0 2d 31 29 20 29 7b 0a 20 20 20 20 66 70 72 69 6e  -1) ){.    fprin
23dd0 74 66 28 73 74 64 65 72 72 2c 20 22 66 63 6e 74  tf(stderr, "fcnt
23de0 6c 28 25 64 29 20 66 61 69 6c 65 64 3a 20 65 72  l(%d) failed: er
23df0 72 6e 6f 3d 25 64 5c 6e 22 2c 20 68 2c 20 65 72  rno=%d\n", h, er
23e00 72 6e 6f 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  rno);.    return
23e10 20 2d 31 3b 0a 20 20 7d 0a 20 20 0a 20 20 69 66   -1;.  }.  .  if
23e20 28 20 6c 6b 2e 6c 5f 74 79 70 65 21 3d 46 5f 55  ( lk.l_type!=F_U
23e30 4e 4c 43 4b 20 26 26 20 28 70 69 64 3d 3d 53 51  NLCK && (pid==SQ
23e40 4c 49 54 45 5f 4c 4f 43 4b 53 54 41 54 45 5f 41  LITE_LOCKSTATE_A
23e50 4e 59 50 49 44 20 7c 7c 20 6c 6b 2e 6c 5f 70 69  NYPID || lk.l_pi
23e60 64 3d 3d 70 69 64 29 20 29 7b 0a 23 69 66 64 65  d==pid) ){.#ifde
23e70 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
23e80 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72     fprintf(stder
23e90 72 2c 20 22 25 73 20 6c 6f 63 6b 20 68 65 6c 64  r, "%s lock held
23ea0 20 62 79 20 25 64 5c 6e 22 2c 20 7a 54 79 70 65   by %d\n", zType
23eb0 2c 20 28 69 6e 74 29 6c 6b 2e 6c 5f 70 69 64 29  , (int)lk.l_pid)
23ec0 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74  ;.#endif.    ret
23ed0 75 72 6e 20 31 3b 0a 20 20 7d 20 0a 20 20 72 65  urn 1;.  } .  re
23ee0 74 75 72 6e 20 30 3b 0a 7d 0a 0a 73 74 61 74 69  turn 0;.}..stati
23ef0 63 20 69 6e 74 20 75 6e 69 78 4c 6f 63 6b 73 74  c int unixLockst
23f00 61 74 65 50 69 64 28 75 6e 69 78 46 69 6c 65 20  atePid(unixFile 
23f10 2a 2c 20 70 69 64 5f 74 2c 20 69 6e 74 20 2a 29  *, pid_t, int *)
23f20 3b 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 28 53 51  ;..#endif /* (SQ
23f30 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 50 4c  LITE_ENABLE_APPL
23f40 45 5f 53 50 49 3e 30 29 20 26 26 20 64 65 66 69  E_SPI>0) && defi
23f50 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 2a  ned(__APPLE__) *
23f60 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 2a 70 41  /.../*.** If *pA
23f70 72 67 20 69 73 20 69 6e 69 74 69 61 6c 6c 79 20  rg is initially 
23f80 6e 65 67 61 74 69 76 65 20 74 68 65 6e 20 74 68  negative then th
23f90 69 73 20 69 73 20 61 20 71 75 65 72 79 2e 20 20  is is a query.  
23fa0 53 65 74 20 2a 70 41 72 67 20 74 6f 0a 2a 2a 20  Set *pArg to.** 
23fb0 31 20 6f 72 20 30 20 64 65 70 65 6e 64 69 6e 67  1 or 0 depending
23fc0 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20 6e   on whether or n
23fd0 6f 74 20 62 69 74 20 6d 61 73 6b 20 6f 66 20 70  ot bit mask of p
23fe0 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73 20  File->ctrlFlags 
23ff0 69 73 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  is set..**.** If
24000 20 2a 70 41 72 67 20 69 73 20 30 20 6f 72 20 31   *pArg is 0 or 1
24010 2c 20 74 68 65 6e 20 63 6c 65 61 72 20 6f 72 20  , then clear or 
24020 73 65 74 20 74 68 65 20 6d 61 73 6b 20 62 69 74  set the mask bit
24030 20 6f 66 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46   of pFile->ctrlF
24040 6c 61 67 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lags..*/.static 
24050 76 6f 69 64 20 75 6e 69 78 4d 6f 64 65 42 69 74  void unixModeBit
24060 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65  (unixFile *pFile
24070 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
24080 6d 61 73 6b 2c 20 69 6e 74 20 2a 70 41 72 67 29  mask, int *pArg)
24090 7b 0a 20 20 69 66 28 20 2a 70 41 72 67 3c 30 20  {.  if( *pArg<0 
240a0 29 7b 0a 20 20 20 20 2a 70 41 72 67 20 3d 20 28  ){.    *pArg = (
240b0 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61 67 73  pFile->ctrlFlags
240c0 20 26 20 6d 61 73 6b 29 21 3d 30 3b 0a 20 20 7d   & mask)!=0;.  }
240d0 65 6c 73 65 20 69 66 28 20 28 2a 70 41 72 67 29  else if( (*pArg)
240e0 3d 3d 30 20 29 7b 0a 20 20 20 20 70 46 69 6c 65  ==0 ){.    pFile
240f0 2d 3e 63 74 72 6c 46 6c 61 67 73 20 26 3d 20 7e  ->ctrlFlags &= ~
24100 6d 61 73 6b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  mask;.  }else{. 
24110 20 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c     pFile->ctrlFl
24120 61 67 73 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 7d  ags |= mask;.  }
24130 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64  .}../* Forward d
24140 65 63 6c 61 72 61 74 69 6f 6e 20 2a 2f 0a 73 74  eclaration */.st
24150 61 74 69 63 20 69 6e 74 20 75 6e 69 78 47 65 74  atic int unixGet
24160 54 65 6d 70 6e 61 6d 65 28 69 6e 74 20 6e 42 75  Tempname(int nBu
24170 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29 3b 0a  f, char *zBuf);.
24180 0a 2f 2a 0a 2a 2a 20 49 6e 66 6f 72 6d 61 74 69  ./*.** Informati
24190 6f 6e 20 61 6e 64 20 63 6f 6e 74 72 6f 6c 20 6f  on and control o
241a0 66 20 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20 68  f an open file h
241b0 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  andle..*/.static
241c0 20 69 6e 74 20 75 6e 69 78 46 69 6c 65 43 6f 6e   int unixFileCon
241d0 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c  trol(sqlite3_fil
241e0 65 20 2a 69 64 2c 20 69 6e 74 20 6f 70 2c 20 76  e *id, int op, v
241f0 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 75 6e  oid *pArg){.  un
24200 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
24210 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
24220 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20   switch( op ){. 
24230 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
24240 43 4e 54 4c 5f 57 41 4c 5f 42 4c 4f 43 4b 3a 20  CNTL_WAL_BLOCK: 
24250 7b 0a 20 20 20 20 20 20 2f 2a 20 70 46 69 6c 65  {.      /* pFile
24260 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55  ->ctrlFlags |= U
24270 4e 49 58 46 49 4c 45 5f 42 4c 4f 43 4b 3b 20 2f  NIXFILE_BLOCK; /
24280 2f 20 44 65 66 65 72 72 65 64 20 66 65 61 74 75  / Deferred featu
24290 72 65 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75  re */.      retu
242a0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
242b0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
242c0 49 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43 4b 53 54  ITE_FCNTL_LOCKST
242d0 41 54 45 3a 20 7b 0a 20 20 20 20 20 20 2a 28 69  ATE: {.      *(i
242e0 6e 74 2a 29 70 41 72 67 20 3d 20 70 46 69 6c 65  nt*)pArg = pFile
242f0 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20  ->eFileLock;.   
24300 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
24310 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  _OK;.    }.    c
24320 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  ase SQLITE_FCNTL
24330 5f 4c 41 53 54 5f 45 52 52 4e 4f 3a 20 7b 0a 20  _LAST_ERRNO: {. 
24340 20 20 20 20 20 2a 28 69 6e 74 2a 29 70 41 72 67       *(int*)pArg
24350 20 3d 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72   = pFile->lastEr
24360 72 6e 6f 3b 0a 20 20 20 20 20 20 72 65 74 75 72  rno;.      retur
24370 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
24380 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
24390 54 45 5f 46 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53  TE_FCNTL_CHUNK_S
243a0 49 5a 45 3a 20 7b 0a 20 20 20 20 20 20 70 46 69  IZE: {.      pFi
243b0 6c 65 2d 3e 73 7a 43 68 75 6e 6b 20 3d 20 2a 28  le->szChunk = *(
243c0 69 6e 74 20 2a 29 70 41 72 67 3b 0a 20 20 20 20  int *)pArg;.    
243d0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
243e0 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  OK;.    }.    ca
243f0 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  se SQLITE_FCNTL_
24400 53 49 5a 45 5f 48 49 4e 54 3a 20 7b 0a 20 20 20  SIZE_HINT: {.   
24410 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 20     int rc;.     
24420 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
24430 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 20  Benign(1);.     
24440 20 72 63 20 3d 20 66 63 6e 74 6c 53 69 7a 65 48   rc = fcntlSizeH
24450 69 6e 74 28 70 46 69 6c 65 2c 20 2a 28 69 36 34  int(pFile, *(i64
24460 20 2a 29 70 41 72 67 29 3b 0a 20 20 20 20 20 20   *)pArg);.      
24470 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42  SimulateIOErrorB
24480 65 6e 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20  enign(0);.      
24490 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
244a0 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
244b0 5f 46 43 4e 54 4c 5f 50 45 52 53 49 53 54 5f 57  _FCNTL_PERSIST_W
244c0 41 4c 3a 20 7b 0a 20 20 20 20 20 20 75 6e 69 78  AL: {.      unix
244d0 4d 6f 64 65 42 69 74 28 70 46 69 6c 65 2c 20 55  ModeBit(pFile, U
244e0 4e 49 58 46 49 4c 45 5f 50 45 52 53 49 53 54 5f  NIXFILE_PERSIST_
244f0 57 41 4c 2c 20 28 69 6e 74 2a 29 70 41 72 67 29  WAL, (int*)pArg)
24500 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
24510 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
24520 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
24530 46 43 4e 54 4c 5f 50 4f 57 45 52 53 41 46 45 5f  FCNTL_POWERSAFE_
24540 4f 56 45 52 57 52 49 54 45 3a 20 7b 0a 20 20 20  OVERWRITE: {.   
24550 20 20 20 75 6e 69 78 4d 6f 64 65 42 69 74 28 70     unixModeBit(p
24560 46 69 6c 65 2c 20 55 4e 49 58 46 49 4c 45 5f 50  File, UNIXFILE_P
24570 53 4f 57 2c 20 28 69 6e 74 2a 29 70 41 72 67 29  SOW, (int*)pArg)
24580 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
24590 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
245a0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
245b0 46 43 4e 54 4c 5f 56 46 53 4e 41 4d 45 3a 20 7b  FCNTL_VFSNAME: {
245c0 0a 20 20 20 20 20 20 2a 28 63 68 61 72 2a 2a 29  .      *(char**)
245d0 70 41 72 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d  pArg = sqlite3_m
245e0 70 72 69 6e 74 66 28 22 25 73 22 2c 20 70 46 69  printf("%s", pFi
245f0 6c 65 2d 3e 70 56 66 73 2d 3e 7a 4e 61 6d 65 29  le->pVfs->zName)
24600 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
24610 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
24620 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
24630 46 43 4e 54 4c 5f 54 45 4d 50 46 49 4c 45 4e 41  FCNTL_TEMPFILENA
24640 4d 45 3a 20 7b 0a 20 20 20 20 20 20 63 68 61 72  ME: {.      char
24650 20 2a 7a 54 46 69 6c 65 20 3d 20 73 71 6c 69 74   *zTFile = sqlit
24660 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20 70 46 69  e3_malloc64( pFi
24670 6c 65 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68  le->pVfs->mxPath
24680 6e 61 6d 65 20 29 3b 0a 20 20 20 20 20 20 69 66  name );.      if
24690 28 20 7a 54 46 69 6c 65 20 29 7b 0a 20 20 20 20  ( zTFile ){.    
246a0 20 20 20 20 75 6e 69 78 47 65 74 54 65 6d 70 6e      unixGetTempn
246b0 61 6d 65 28 70 46 69 6c 65 2d 3e 70 56 66 73 2d  ame(pFile->pVfs-
246c0 3e 6d 78 50 61 74 68 6e 61 6d 65 2c 20 7a 54 46  >mxPathname, zTF
246d0 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 2a 28  ile);.        *(
246e0 63 68 61 72 2a 2a 29 70 41 72 67 20 3d 20 7a 54  char**)pArg = zT
246f0 46 69 6c 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20  File;.      }.  
24700 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
24710 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
24720 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43 4e 54  case SQLITE_FCNT
24730 4c 5f 48 41 53 5f 4d 4f 56 45 44 3a 20 7b 0a 20  L_HAS_MOVED: {. 
24740 20 20 20 20 20 2a 28 69 6e 74 2a 29 70 41 72 67       *(int*)pArg
24750 20 3d 20 66 69 6c 65 48 61 73 4d 6f 76 65 64 28   = fileHasMoved(
24760 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 72 65  pFile);.      re
24770 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
24780 20 20 20 20 7d 0a 23 69 66 20 53 51 4c 49 54 45      }.#if SQLITE
24790 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30  _MAX_MMAP_SIZE>0
247a0 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
247b0 5f 46 43 4e 54 4c 5f 4d 4d 41 50 5f 53 49 5a 45  _FCNTL_MMAP_SIZE
247c0 3a 20 7b 0a 20 20 20 20 20 20 69 36 34 20 6e 65  : {.      i64 ne
247d0 77 4c 69 6d 69 74 20 3d 20 2a 28 69 36 34 2a 29  wLimit = *(i64*)
247e0 70 41 72 67 3b 0a 20 20 20 20 20 20 69 6e 74 20  pArg;.      int 
247f0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
24800 20 20 20 20 20 20 69 66 28 20 6e 65 77 4c 69 6d        if( newLim
24810 69 74 3e 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  it>sqlite3Global
24820 43 6f 6e 66 69 67 2e 6d 78 4d 6d 61 70 20 29 7b  Config.mxMmap ){
24830 0a 20 20 20 20 20 20 20 20 6e 65 77 4c 69 6d 69  .        newLimi
24840 74 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  t = sqlite3Globa
24850 6c 43 6f 6e 66 69 67 2e 6d 78 4d 6d 61 70 3b 0a  lConfig.mxMmap;.
24860 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 28        }.      *(
24870 69 36 34 2a 29 70 41 72 67 20 3d 20 70 46 69 6c  i64*)pArg = pFil
24880 65 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 3b 0a  e->mmapSizeMax;.
24890 20 20 20 20 20 20 69 66 28 20 6e 65 77 4c 69 6d        if( newLim
248a0 69 74 3e 3d 30 20 26 26 20 6e 65 77 4c 69 6d 69  it>=0 && newLimi
248b0 74 21 3d 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69  t!=pFile->mmapSi
248c0 7a 65 4d 61 78 20 26 26 20 70 46 69 6c 65 2d 3e  zeMax && pFile->
248d0 6e 46 65 74 63 68 4f 75 74 3d 3d 30 20 29 7b 0a  nFetchOut==0 ){.
248e0 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6d          pFile->m
248f0 6d 61 70 53 69 7a 65 4d 61 78 20 3d 20 6e 65 77  mapSizeMax = new
24900 4c 69 6d 69 74 3b 0a 20 20 20 20 20 20 20 20 69  Limit;.        i
24910 66 28 20 70 46 69 6c 65 2d 3e 6d 6d 61 70 53 69  f( pFile->mmapSi
24920 7a 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ze>0 ){.        
24930 20 20 75 6e 69 78 55 6e 6d 61 70 66 69 6c 65 28    unixUnmapfile(
24940 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20  pFile);.        
24950 20 20 72 63 20 3d 20 75 6e 69 78 4d 61 70 66 69    rc = unixMapfi
24960 6c 65 28 70 46 69 6c 65 2c 20 2d 31 29 3b 0a 20  le(pFile, -1);. 
24970 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
24980 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
24990 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23  ;.    }.#endif.#
249a0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
249b0 55 47 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61  UG.    /* The pa
249c0 67 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20 6d  ger calls this m
249d0 65 74 68 6f 64 20 74 6f 20 73 69 67 6e 61 6c 20  ethod to signal 
249e0 74 68 61 74 20 69 74 20 68 61 73 20 64 6f 6e 65  that it has done
249f0 0a 20 20 20 20 2a 2a 20 61 20 72 6f 6c 6c 62 61  .    ** a rollba
24a00 63 6b 20 61 6e 64 20 74 68 61 74 20 74 68 65 20  ck and that the 
24a10 64 61 74 61 62 61 73 65 20 69 73 20 74 68 65 72  database is ther
24a20 65 66 6f 72 65 20 75 6e 63 68 61 6e 67 65 64 20  efore unchanged 
24a30 61 6e 64 0a 20 20 20 20 2a 2a 20 69 74 20 68 65  and.    ** it he
24a40 6e 63 65 20 69 74 20 69 73 20 4f 4b 20 66 6f 72  nce it is OK for
24a50 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
24a60 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20   change counter 
24a70 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20 75 6e 63  to be.    ** unc
24a80 68 61 6e 67 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  hanged..    */. 
24a90 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
24aa0 43 4e 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45  CNTL_DB_UNCHANGE
24ab0 44 3a 20 7b 0a 20 20 20 20 20 20 28 28 75 6e 69  D: {.      ((uni
24ac0 78 46 69 6c 65 2a 29 69 64 29 2d 3e 64 62 55 70  xFile*)id)->dbUp
24ad0 64 61 74 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  date = 0;.      
24ae0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
24af0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23  ;.    }.#endif.#
24b00 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
24b10 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26  _LOCKING_STYLE &
24b20 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  & defined(__APPL
24b30 45 5f 5f 29 0a 20 20 20 20 63 61 73 65 20 53 51  E__).    case SQ
24b40 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 45 54 5f 4c  LITE_FCNTL_SET_L
24b50 4f 43 4b 50 52 4f 58 59 46 49 4c 45 3a 0a 20 20  OCKPROXYFILE:.  
24b60 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 43    case SQLITE_FC
24b70 4e 54 4c 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f 58  NTL_GET_LOCKPROX
24b80 59 46 49 4c 45 3a 20 7b 0a 20 20 20 20 20 20 72  YFILE: {.      r
24b90 65 74 75 72 6e 20 70 72 6f 78 79 46 69 6c 65 43  eturn proxyFileC
24ba0 6f 6e 74 72 6f 6c 28 69 64 2c 6f 70 2c 70 41 72  ontrol(id,op,pAr
24bb0 67 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  g);.    }.#endif
24bc0 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   /* SQLITE_ENABL
24bd0 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
24be0 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  && defined(__APP
24bf0 4c 45 5f 5f 29 20 2a 2f 0a 23 69 66 20 28 53 51  LE__) */.#if (SQ
24c00 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 50 4c  LITE_ENABLE_APPL
24c10 45 5f 53 50 49 3e 30 29 20 26 26 20 64 65 66 69  E_SPI>0) && defi
24c20 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20  ned(__APPLE__). 
24c30 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
24c40 43 4e 54 4c 5f 54 52 55 4e 43 41 54 45 5f 44 41  CNTL_TRUNCATE_DA
24c50 54 41 42 41 53 45 3a 20 7b 0a 20 20 20 20 20 20  TABASE: {.      
24c60 72 65 74 75 72 6e 20 75 6e 69 78 54 72 75 6e 63  return unixTrunc
24c70 61 74 65 44 61 74 61 62 61 73 65 28 70 46 69 6c  ateDatabase(pFil
24c80 65 2c 20 28 70 41 72 67 20 3f 20 28 2a 28 69 6e  e, (pArg ? (*(in
24c90 74 20 2a 29 70 41 72 67 29 20 3a 20 30 29 29 3b  t *)pArg) : 0));
24ca0 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
24cb0 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 52 45 50  SQLITE_FCNTL_REP
24cc0 4c 41 43 45 5f 44 41 54 41 42 41 53 45 3a 20 7b  LACE_DATABASE: {
24cd0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 75 6e  .      return un
24ce0 69 78 52 65 70 6c 61 63 65 44 61 74 61 62 61 73  ixReplaceDatabas
24cf0 65 28 70 46 69 6c 65 2c 20 28 73 71 6c 69 74 65  e(pFile, (sqlite
24d00 33 20 2a 29 70 41 72 67 29 3b 0a 20 20 20 20 7d  3 *)pArg);.    }
24d10 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
24d20 5f 46 43 4e 54 4c 5f 4c 4f 43 4b 53 54 41 54 45  _FCNTL_LOCKSTATE
24d30 5f 50 49 44 3a 20 7b 0a 20 20 20 20 20 20 4c 6f  _PID: {.      Lo
24d40 63 6b 73 74 61 74 65 50 49 44 20 2a 70 4c 6f 63  ckstatePID *pLoc
24d50 6b 73 74 61 74 65 3b 0a 20 20 20 20 20 20 69 6e  kstate;.      in
24d60 74 20 72 63 3b 0a 20 20 20 20 20 20 0a 20 20 20  t rc;.      .   
24d70 20 20 20 69 66 28 20 70 41 72 67 3d 3d 4e 55 4c     if( pArg==NUL
24d80 4c 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  L ){.        ret
24d90 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
24da0 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  E;.      }.     
24db0 20 70 4c 6f 63 6b 73 74 61 74 65 20 3d 20 28 4c   pLockstate = (L
24dc0 6f 63 6b 73 74 61 74 65 50 49 44 20 2a 29 70 41  ockstatePID *)pA
24dd0 72 67 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 75  rg;.      rc = u
24de0 6e 69 78 4c 6f 63 6b 73 74 61 74 65 50 69 64 28  nixLockstatePid(
24df0 70 46 69 6c 65 2c 20 70 4c 6f 63 6b 73 74 61 74  pFile, pLockstat
24e00 65 2d 3e 70 69 64 2c 20 26 28 70 4c 6f 63 6b 73  e->pid, &(pLocks
24e10 74 61 74 65 2d 3e 73 74 61 74 65 29 29 3b 0a 20  tate->state));. 
24e20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
24e30 20 20 20 20 7d 0a 20 20 20 20 20 20 0a 23 65 6e      }.      .#en
24e40 64 69 66 20 2f 2a 20 28 53 51 4c 49 54 45 5f 45  dif /* (SQLITE_E
24e50 4e 41 42 4c 45 5f 41 50 50 4c 45 5f 53 50 49 3e  NABLE_APPLE_SPI>
24e60 30 29 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f  0) && defined(__
24e70 41 50 50 4c 45 5f 5f 29 20 2a 2f 0a 20 20 7d 0a  APPLE__) */.  }.
24e80 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
24e90 4e 4f 54 46 4f 55 4e 44 3b 0a 7d 0a 0a 2f 2a 0a  NOTFOUND;.}../*.
24ea0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 65  ** Return the se
24eb0 63 74 6f 72 20 73 69 7a 65 20 69 6e 20 62 79 74  ctor size in byt
24ec0 65 73 20 6f 66 20 74 68 65 20 75 6e 64 65 72 6c  es of the underl
24ed0 79 69 6e 67 20 62 6c 6f 63 6b 20 64 65 76 69 63  ying block devic
24ee0 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73 70 65  e for.** the spe
24ef0 63 69 66 69 65 64 20 66 69 6c 65 2e 20 54 68 69  cified file. Thi
24f00 73 20 69 73 20 61 6c 6d 6f 73 74 20 61 6c 77 61  s is almost alwa
24f10 79 73 20 35 31 32 20 62 79 74 65 73 2c 20 62 75  ys 512 bytes, bu
24f20 74 20 6d 61 79 20 62 65 0a 2a 2a 20 6c 61 72 67  t may be.** larg
24f30 65 72 20 66 6f 72 20 73 6f 6d 65 20 64 65 76 69  er for some devi
24f40 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74  ces..**.** SQLit
24f50 65 20 63 6f 64 65 20 61 73 73 75 6d 65 73 20 74  e code assumes t
24f60 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e  his function can
24f70 6e 6f 74 20 66 61 69 6c 2e 20 49 74 20 61 6c 73  not fail. It als
24f80 6f 20 61 73 73 75 6d 65 73 20 74 68 61 74 0a 2a  o assumes that.*
24f90 2a 20 69 66 20 74 77 6f 20 66 69 6c 65 73 20 61  * if two files a
24fa0 72 65 20 63 72 65 61 74 65 64 20 69 6e 20 74 68  re created in th
24fb0 65 20 73 61 6d 65 20 66 69 6c 65 2d 73 79 73 74  e same file-syst
24fc0 65 6d 20 64 69 72 65 63 74 6f 72 79 20 28 69 2e  em directory (i.
24fd0 65 2e 0a 2a 2a 20 61 20 64 61 74 61 62 61 73 65  e..** a database
24fe0 20 61 6e 64 20 69 74 73 20 6a 6f 75 72 6e 61 6c   and its journal
24ff0 20 66 69 6c 65 29 20 74 68 61 74 20 74 68 65 20   file) that the 
25000 73 65 63 74 6f 72 20 73 69 7a 65 20 77 69 6c 6c  sector size will
25010 20 62 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20   be the.** same 
25020 66 6f 72 20 62 6f 74 68 2e 0a 2a 2f 0a 23 69 66  for both..*/.#if
25030 6e 64 65 66 20 5f 5f 51 4e 58 4e 54 4f 5f 5f 20  ndef __QNXNTO__ 
25040 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
25050 53 65 63 74 6f 72 53 69 7a 65 28 73 71 6c 69 74  SectorSize(sqlit
25060 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64  e3_file *NotUsed
25070 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
25080 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
25090 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
250a0 44 45 46 41 55 4c 54 5f 53 45 43 54 4f 52 5f 53  DEFAULT_SECTOR_S
250b0 49 5a 45 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  IZE;.}.#endif../
250c0 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
250d0 6e 67 20 76 65 72 73 69 6f 6e 20 6f 66 20 75 6e  ng version of un
250e0 69 78 53 65 63 74 6f 72 53 69 7a 65 28 29 20 69  ixSectorSize() i
250f0 73 20 6f 70 74 69 6d 69 7a 65 64 20 66 6f 72 20  s optimized for 
25100 51 4e 58 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 5f  QNX..*/.#ifdef _
25110 5f 51 4e 58 4e 54 4f 5f 5f 0a 23 69 6e 63 6c 75  _QNXNTO__.#inclu
25120 64 65 20 3c 73 79 73 2f 64 63 6d 64 5f 62 6c 6b  de <sys/dcmd_blk
25130 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79  .h>.#include <sy
25140 73 2f 73 74 61 74 76 66 73 2e 68 3e 0a 73 74 61  s/statvfs.h>.sta
25150 74 69 63 20 69 6e 74 20 75 6e 69 78 53 65 63 74  tic int unixSect
25160 6f 72 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66  orSize(sqlite3_f
25170 69 6c 65 20 2a 69 64 29 7b 0a 20 20 75 6e 69 78  ile *id){.  unix
25180 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
25190 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69  nixFile*)id;.  i
251a0 66 28 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72  f( pFile->sector
251b0 53 69 7a 65 20 3d 3d 20 30 20 29 7b 0a 20 20 20  Size == 0 ){.   
251c0 20 73 74 72 75 63 74 20 73 74 61 74 76 66 73 20   struct statvfs 
251d0 66 73 49 6e 66 6f 3b 0a 20 20 20 20 20 20 20 0a  fsInfo;.       .
251e0 20 20 20 20 2f 2a 20 53 65 74 20 64 65 66 61 75      /* Set defau
251f0 6c 74 73 20 66 6f 72 20 6e 6f 6e 2d 73 75 70 70  lts for non-supp
25200 6f 72 74 65 64 20 66 69 6c 65 73 79 73 74 65 6d  orted filesystem
25210 73 20 2a 2f 0a 20 20 20 20 70 46 69 6c 65 2d 3e  s */.    pFile->
25220 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 53 51 4c  sectorSize = SQL
25230 49 54 45 5f 44 45 46 41 55 4c 54 5f 53 45 43 54  ITE_DEFAULT_SECT
25240 4f 52 5f 53 49 5a 45 3b 0a 20 20 20 20 70 46 69  OR_SIZE;.    pFi
25250 6c 65 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63  le->deviceCharac
25260 74 65 72 69 73 74 69 63 73 20 3d 20 30 3b 0a 20  teristics = 0;. 
25270 20 20 20 69 66 28 20 66 73 74 61 74 76 66 73 28     if( fstatvfs(
25280 70 46 69 6c 65 2d 3e 68 2c 20 26 66 73 49 6e 66  pFile->h, &fsInf
25290 6f 29 20 3d 3d 20 2d 31 20 29 20 7b 0a 20 20 20  o) == -1 ) {.   
252a0 20 20 20 72 65 74 75 72 6e 20 70 46 69 6c 65 2d     return pFile-
252b0 3e 73 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 20  >sectorSize;.   
252c0 20 7d 0a 0a 20 20 20 20 69 66 28 20 21 73 74 72   }..    if( !str
252d0 63 6d 70 28 66 73 49 6e 66 6f 2e 66 5f 62 61 73  cmp(fsInfo.f_bas
252e0 65 74 79 70 65 2c 20 22 74 6d 70 22 29 20 29 20  etype, "tmp") ) 
252f0 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73  {.      pFile->s
25300 65 63 74 6f 72 53 69 7a 65 20 3d 20 66 73 49 6e  ectorSize = fsIn
25310 66 6f 2e 66 5f 62 73 69 7a 65 3b 0a 20 20 20 20  fo.f_bsize;.    
25320 20 20 70 46 69 6c 65 2d 3e 64 65 76 69 63 65 43    pFile->deviceC
25330 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20 3d  haracteristics =
25340 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f  .        SQLITE_
25350 49 4f 43 41 50 5f 41 54 4f 4d 49 43 34 4b 20 7c  IOCAP_ATOMIC4K |
25360 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 72 61         /* All ra
25370 6d 20 66 69 6c 65 73 79 73 74 65 6d 20 77 72 69  m filesystem wri
25380 74 65 73 20 61 72 65 20 61 74 6f 6d 69 63 20 2a  tes are atomic *
25390 2f 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45  /.        SQLITE
253a0 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45  _IOCAP_SAFE_APPE
253b0 4e 44 20 7c 20 20 20 20 2f 2a 20 67 72 6f 77 69  ND |    /* growi
253c0 6e 67 20 74 68 65 20 66 69 6c 65 20 64 6f 65 73  ng the file does
253d0 20 6e 6f 74 20 6f 63 63 75 72 20 75 6e 74 69 6c   not occur until
253e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
253f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25400 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 77 72         ** the wr
25410 69 74 65 20 73 75 63 63 65 65 64 73 20 2a 2f 0a  ite succeeds */.
25420 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49          SQLITE_I
25430 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 20  OCAP_SEQUENTIAL 
25440 7c 20 20 20 20 20 2f 2a 20 54 68 65 20 72 61 6d  |     /* The ram
25450 20 66 69 6c 65 73 79 73 74 65 6d 20 68 61 73 20   filesystem has 
25460 6e 6f 20 77 72 69 74 65 20 62 65 68 69 6e 64 0a  no write behind.
25470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25490 20 20 20 20 20 20 2a 2a 20 73 6f 20 69 74 20 69        ** so it i
254a0 73 20 6f 72 64 65 72 65 64 20 2a 2f 0a 20 20 20  s ordered */.   
254b0 20 20 20 20 20 30 3b 0a 20 20 20 20 7d 65 6c 73       0;.    }els
254c0 65 20 69 66 28 20 73 74 72 73 74 72 28 66 73 49  e if( strstr(fsI
254d0 6e 66 6f 2e 66 5f 62 61 73 65 74 79 70 65 2c 20  nfo.f_basetype, 
254e0 22 65 74 66 73 22 29 20 29 7b 0a 20 20 20 20 20  "etfs") ){.     
254f0 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69   pFile->sectorSi
25500 7a 65 20 3d 20 66 73 49 6e 66 6f 2e 66 5f 62 73  ze = fsInfo.f_bs
25510 69 7a 65 3b 0a 20 20 20 20 20 20 70 46 69 6c 65  ize;.      pFile
25520 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63 74 65  ->deviceCharacte
25530 72 69 73 74 69 63 73 20 3d 0a 20 20 20 20 20 20  ristics =.      
25540 20 20 2f 2a 20 65 74 66 73 20 63 6c 75 73 74 65    /* etfs cluste
25550 72 20 73 69 7a 65 20 77 72 69 74 65 73 20 61 72  r size writes ar
25560 65 20 61 74 6f 6d 69 63 20 2a 2f 0a 20 20 20 20  e atomic */.    
25570 20 20 20 20 28 70 46 69 6c 65 2d 3e 73 65 63 74      (pFile->sect
25580 6f 72 53 69 7a 65 20 2f 20 35 31 32 20 2a 20 53  orSize / 512 * S
25590 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d  QLITE_IOCAP_ATOM
255a0 49 43 35 31 32 29 20 7c 0a 20 20 20 20 20 20 20  IC512) |.       
255b0 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41   SQLITE_IOCAP_SA
255c0 46 45 5f 41 50 50 45 4e 44 20 7c 20 20 20 20 2f  FE_APPEND |    /
255d0 2a 20 67 72 6f 77 69 6e 67 20 74 68 65 20 66 69  * growing the fi
255e0 6c 65 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75  le does not occu
255f0 72 20 75 6e 74 69 6c 0a 20 20 20 20 20 20 20 20  r until.        
25600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a                **
25620 20 74 68 65 20 77 72 69 74 65 20 73 75 63 63 65   the write succe
25630 65 64 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 53  eds */.        S
25640 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55  QLITE_IOCAP_SEQU
25650 45 4e 54 49 41 4c 20 7c 20 20 20 20 20 2f 2a 20  ENTIAL |     /* 
25660 54 68 65 20 72 61 6d 20 66 69 6c 65 73 79 73 74  The ram filesyst
25670 65 6d 20 68 61 73 20 6e 6f 20 77 72 69 74 65 20  em has no write 
25680 62 65 68 69 6e 64 0a 20 20 20 20 20 20 20 20 20  behind.         
25690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
256a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
256b0 73 6f 20 69 74 20 69 73 20 6f 72 64 65 72 65 64  so it is ordered
256c0 20 2a 2f 0a 20 20 20 20 20 20 20 20 30 3b 0a 20   */.        0;. 
256d0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21 73 74     }else if( !st
256e0 72 63 6d 70 28 66 73 49 6e 66 6f 2e 66 5f 62 61  rcmp(fsInfo.f_ba
256f0 73 65 74 79 70 65 2c 20 22 71 6e 78 36 22 29 20  setype, "qnx6") 
25700 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  ){.      pFile->
25710 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 66 73 49  sectorSize = fsI
25720 6e 66 6f 2e 66 5f 62 73 69 7a 65 3b 0a 20 20 20  nfo.f_bsize;.   
25730 20 20 20 70 46 69 6c 65 2d 3e 64 65 76 69 63 65     pFile->device
25740 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20  Characteristics 
25750 3d 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54 45  =.        SQLITE
25760 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 20 7c 20  _IOCAP_ATOMIC | 
25770 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 66          /* All f
25780 69 6c 65 73 79 73 74 65 6d 20 77 72 69 74 65 73  ilesystem writes
25790 20 61 72 65 20 61 74 6f 6d 69 63 20 2a 2f 0a 20   are atomic */. 
257a0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f         SQLITE_IO
257b0 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 20  CAP_SAFE_APPEND 
257c0 7c 20 20 20 20 2f 2a 20 67 72 6f 77 69 6e 67 20  |    /* growing 
257d0 74 68 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f  the file does no
257e0 74 20 6f 63 63 75 72 20 75 6e 74 69 6c 0a 20 20  t occur until.  
257f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25810 20 20 20 20 2a 2a 20 74 68 65 20 77 72 69 74 65      ** the write
25820 20 73 75 63 63 65 65 64 73 20 2a 2f 0a 20 20 20   succeeds */.   
25830 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41       SQLITE_IOCA
25840 50 5f 53 45 51 55 45 4e 54 49 41 4c 20 7c 20 20  P_SEQUENTIAL |  
25850 20 20 20 2f 2a 20 54 68 65 20 72 61 6d 20 66 69     /* The ram fi
25860 6c 65 73 79 73 74 65 6d 20 68 61 73 20 6e 6f 20  lesystem has no 
25870 77 72 69 74 65 20 62 65 68 69 6e 64 0a 20 20 20  write behind.   
25880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
258a0 20 20 20 2a 2a 20 73 6f 20 69 74 20 69 73 20 6f     ** so it is o
258b0 72 64 65 72 65 64 20 2a 2f 0a 20 20 20 20 20 20  rdered */.      
258c0 20 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69    0;.    }else i
258d0 66 28 20 21 73 74 72 63 6d 70 28 66 73 49 6e 66  f( !strcmp(fsInf
258e0 6f 2e 66 5f 62 61 73 65 74 79 70 65 2c 20 22 71  o.f_basetype, "q
258f0 6e 78 34 22 29 20 29 7b 0a 20 20 20 20 20 20 70  nx4") ){.      p
25900 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65  File->sectorSize
25910 20 3d 20 66 73 49 6e 66 6f 2e 66 5f 62 73 69 7a   = fsInfo.f_bsiz
25920 65 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  e;.      pFile->
25930 64 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  deviceCharacteri
25940 73 74 69 63 73 20 3d 0a 20 20 20 20 20 20 20 20  stics =.        
25950 2f 2a 20 66 75 6c 6c 20 62 69 74 73 65 74 20 6f  /* full bitset o
25960 66 20 61 74 6f 6d 69 63 73 20 66 72 6f 6d 20 6d  f atomics from m
25970 61 78 20 73 65 63 74 6f 72 20 73 69 7a 65 20 61  ax sector size a
25980 6e 64 20 73 6d 61 6c 6c 65 72 20 2a 2f 0a 20 20  nd smaller */.  
25990 20 20 20 20 20 20 28 28 70 46 69 6c 65 2d 3e 73        ((pFile->s
259a0 65 63 74 6f 72 53 69 7a 65 20 2f 20 35 31 32 20  ectorSize / 512 
259b0 2a 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41  * SQLITE_IOCAP_A
259c0 54 4f 4d 49 43 35 31 32 29 20 3c 3c 20 31 29 20  TOMIC512) << 1) 
259d0 2d 20 32 20 7c 0a 20 20 20 20 20 20 20 20 53 51  - 2 |.        SQ
259e0 4c 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45  LITE_IOCAP_SEQUE
259f0 4e 54 49 41 4c 20 7c 20 20 20 20 20 2f 2a 20 54  NTIAL |     /* T
25a00 68 65 20 72 61 6d 20 66 69 6c 65 73 79 73 74 65  he ram filesyste
25a10 6d 20 68 61 73 20 6e 6f 20 77 72 69 74 65 20 62  m has no write b
25a20 65 68 69 6e 64 0a 20 20 20 20 20 20 20 20 20 20  ehind.          
25a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25a40 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73              ** s
25a50 6f 20 69 74 20 69 73 20 6f 72 64 65 72 65 64 20  o it is ordered 
25a60 2a 2f 0a 20 20 20 20 20 20 20 20 30 3b 0a 20 20  */.        0;.  
25a70 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 73    }else if( strs
25a80 74 72 28 66 73 49 6e 66 6f 2e 66 5f 62 61 73 65  tr(fsInfo.f_base
25a90 74 79 70 65 2c 20 22 64 6f 73 22 29 20 29 7b 0a  type, "dos") ){.
25aa0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 73 65 63        pFile->sec
25ab0 74 6f 72 53 69 7a 65 20 3d 20 66 73 49 6e 66 6f  torSize = fsInfo
25ac0 2e 66 5f 62 73 69 7a 65 3b 0a 20 20 20 20 20 20  .f_bsize;.      
25ad0 70 46 69 6c 65 2d 3e 64 65 76 69 63 65 43 68 61  pFile->deviceCha
25ae0 72 61 63 74 65 72 69 73 74 69 63 73 20 3d 0a 20  racteristics =. 
25af0 20 20 20 20 20 20 20 2f 2a 20 66 75 6c 6c 20 62         /* full b
25b00 69 74 73 65 74 20 6f 66 20 61 74 6f 6d 69 63 73  itset of atomics
25b10 20 66 72 6f 6d 20 6d 61 78 20 73 65 63 74 6f 72   from max sector
25b20 20 73 69 7a 65 20 61 6e 64 20 73 6d 61 6c 6c 65   size and smalle
25b30 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 28 28 70  r */.        ((p
25b40 46 69 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65  File->sectorSize
25b50 20 2f 20 35 31 32 20 2a 20 53 51 4c 49 54 45 5f   / 512 * SQLITE_
25b60 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 29  IOCAP_ATOMIC512)
25b70 20 3c 3c 20 31 29 20 2d 20 32 20 7c 0a 20 20 20   << 1) - 2 |.   
25b80 20 20 20 20 20 53 51 4c 49 54 45 5f 49 4f 43 41       SQLITE_IOCA
25b90 50 5f 53 45 51 55 45 4e 54 49 41 4c 20 7c 20 20  P_SEQUENTIAL |  
25ba0 20 20 20 2f 2a 20 54 68 65 20 72 61 6d 20 66 69     /* The ram fi
25bb0 6c 65 73 79 73 74 65 6d 20 68 61 73 20 6e 6f 20  lesystem has no 
25bc0 77 72 69 74 65 20 62 65 68 69 6e 64 0a 20 20 20  write behind.   
25bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25bf0 20 20 20 2a 2a 20 73 6f 20 69 74 20 69 73 20 6f     ** so it is o
25c00 72 64 65 72 65 64 20 2a 2f 0a 20 20 20 20 20 20  rdered */.      
25c10 20 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a    0;.    }else{.
25c20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 64 65 76        pFile->dev
25c30 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
25c40 63 73 20 3d 0a 20 20 20 20 20 20 20 20 53 51 4c  cs =.        SQL
25c50 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43  ITE_IOCAP_ATOMIC
25c60 35 31 32 20 7c 20 20 20 20 20 20 2f 2a 20 62 6c  512 |      /* bl
25c70 6f 63 6b 73 20 61 72 65 20 61 74 6f 6d 69 63 20  ocks are atomic 
25c80 2a 2f 0a 20 20 20 20 20 20 20 20 53 51 4c 49 54  */.        SQLIT
25c90 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50  E_IOCAP_SAFE_APP
25ca0 45 4e 44 20 7c 20 20 20 20 2f 2a 20 67 72 6f 77  END |    /* grow
25cb0 69 6e 67 20 74 68 65 20 66 69 6c 65 20 64 6f 65  ing the file doe
25cc0 73 20 6e 6f 74 20 6f 63 63 75 72 20 75 6e 74 69  s not occur unti
25cd0 6c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l.              
25ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25cf0 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 77          ** the w
25d00 72 69 74 65 20 73 75 63 63 65 65 64 73 20 2a 2f  rite succeeds */
25d10 0a 20 20 20 20 20 20 20 20 30 3b 0a 20 20 20 20  .        0;.    
25d20 7d 0a 20 20 7d 0a 20 20 2f 2a 20 4c 61 73 74 20  }.  }.  /* Last 
25d30 63 68 61 6e 63 65 20 76 65 72 69 66 69 63 61 74  chance verificat
25d40 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 73 65 63  ion.  If the sec
25d50 74 6f 72 20 73 69 7a 65 20 69 73 6e 27 74 20 61  tor size isn't a
25d60 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 35 31 32   multiple of 512
25d70 0a 20 20 2a 2a 20 74 68 65 6e 20 69 74 20 69 73  .  ** then it is
25d80 6e 27 74 20 76 61 6c 69 64 2e 2a 2f 0a 20 20 69  n't valid.*/.  i
25d90 66 28 20 70 46 69 6c 65 2d 3e 73 65 63 74 6f 72  f( pFile->sector
25da0 53 69 7a 65 20 25 20 35 31 32 20 21 3d 20 30 20  Size % 512 != 0 
25db0 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 64 65  ){.    pFile->de
25dc0 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
25dd0 69 63 73 20 3d 20 30 3b 0a 20 20 20 20 70 46 69  ics = 0;.    pFi
25de0 6c 65 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d  le->sectorSize =
25df0 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
25e00 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 20 20 7d  SECTOR_SIZE;.  }
25e10 0a 20 20 72 65 74 75 72 6e 20 70 46 69 6c 65 2d  .  return pFile-
25e20 3e 73 65 63 74 6f 72 53 69 7a 65 3b 0a 7d 0a 23  >sectorSize;.}.#
25e30 65 6e 64 69 66 20 2f 2a 20 5f 5f 51 4e 58 4e 54  endif /* __QNXNT
25e40 4f 5f 5f 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65  O__ */../*.** Re
25e50 74 75 72 6e 20 74 68 65 20 64 65 76 69 63 65 20  turn the device 
25e60 63 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20  characteristics 
25e70 66 6f 72 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a  for the file..**
25e80 0a 2a 2a 20 54 68 69 73 20 56 46 53 20 69 73 20  .** This VFS is 
25e90 73 65 74 20 75 70 20 74 6f 20 72 65 74 75 72 6e  set up to return
25ea0 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f   SQLITE_IOCAP_PO
25eb0 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54  WERSAFE_OVERWRIT
25ec0 45 20 62 79 20 64 65 66 61 75 6c 74 2e 0a 2a 2a  E by default..**
25ed0 20 48 6f 77 65 76 65 72 2c 20 74 68 61 74 20 63   However, that c
25ee0 68 6f 69 63 65 20 69 73 20 63 6f 6e 74 72 6f 76  hoice is controv
25ef0 65 72 73 69 61 6c 20 73 69 6e 63 65 20 74 65 63  ersial since tec
25f00 68 6e 69 63 61 6c 6c 79 20 74 68 65 20 75 6e 64  hnically the und
25f10 65 72 6c 79 69 6e 67 0a 2a 2a 20 66 69 6c 65 20  erlying.** file 
25f20 73 79 73 74 65 6d 20 64 6f 65 73 20 6e 6f 74 20  system does not 
25f30 61 6c 77 61 79 73 20 70 72 6f 76 69 64 65 20 70  always provide p
25f40 6f 77 65 72 73 61 66 65 20 6f 76 65 72 77 72 69  owersafe overwri
25f50 74 65 73 2e 20 20 28 49 6e 20 6f 74 68 65 72 0a  tes.  (In other.
25f60 2a 2a 20 77 6f 72 64 73 2c 20 61 66 74 65 72 20  ** words, after 
25f70 61 20 70 6f 77 65 72 2d 6c 6f 73 73 20 65 76 65  a power-loss eve
25f80 6e 74 2c 20 70 61 72 74 73 20 6f 66 20 74 68 65  nt, parts of the
25f90 20 66 69 6c 65 20 74 68 61 74 20 77 65 72 65 20   file that were 
25fa0 6e 65 76 65 72 0a 2a 2a 20 77 72 69 74 74 65 6e  never.** written
25fb0 20 6d 69 67 68 74 20 65 6e 64 20 75 70 20 62 65   might end up be
25fc0 69 6e 67 20 61 6c 74 65 72 65 64 2e 29 20 20 48  ing altered.)  H
25fd0 6f 77 65 76 65 72 2c 20 6e 6f 6e 2d 50 53 4f 57  owever, non-PSOW
25fe0 20 62 65 68 61 76 69 6f 72 20 69 73 20 76 65 72   behavior is ver
25ff0 79 2c 0a 2a 2a 20 76 65 72 79 20 72 61 72 65 2e  y,.** very rare.
26000 20 20 41 6e 64 20 61 73 73 65 72 74 69 6e 67 20    And asserting 
26010 50 53 4f 57 20 6d 61 6b 65 73 20 61 20 6c 61 72  PSOW makes a lar
26020 67 65 20 72 65 64 75 63 74 69 6f 6e 20 69 6e 20  ge reduction in 
26030 74 68 65 20 61 6d 6f 75 6e 74 0a 2a 2a 20 6f 66  the amount.** of
26040 20 72 65 71 75 69 72 65 64 20 49 2f 4f 20 66 6f   required I/O fo
26050 72 20 6a 6f 75 72 6e 61 6c 69 6e 67 2c 20 73 69  r journaling, si
26060 6e 63 65 20 61 20 6c 6f 74 20 6f 66 20 70 61 64  nce a lot of pad
26070 64 69 6e 67 20 69 73 20 65 6c 69 6d 69 6e 61 74  ding is eliminat
26080 65 64 2e 0a 2a 2a 20 20 48 65 6e 63 65 2c 20 77  ed..**  Hence, w
26090 68 69 6c 65 20 50 4f 57 45 52 53 41 46 45 5f 4f  hile POWERSAFE_O
260a0 56 45 52 57 52 49 54 45 20 69 73 20 6f 6e 20 62  VERWRITE is on b
260b0 79 20 64 65 66 61 75 6c 74 2c 20 74 68 65 72 65  y default, there
260c0 20 69 73 20 61 20 66 69 6c 65 2d 63 6f 6e 74 72   is a file-contr
260d0 6f 6c 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20  ol.** available 
260e0 74 6f 20 74 75 72 6e 20 69 74 20 6f 66 66 20 61  to turn it off a
260f0 6e 64 20 55 52 49 20 71 75 65 72 79 20 70 61 72  nd URI query par
26100 61 6d 65 74 65 72 20 61 76 61 69 6c 61 62 6c 65  ameter available
26110 20 74 6f 20 74 75 72 6e 20 69 74 20 6f 66 66 2e   to turn it off.
26120 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
26130 6e 69 78 44 65 76 69 63 65 43 68 61 72 61 63 74  nixDeviceCharact
26140 65 72 69 73 74 69 63 73 28 73 71 6c 69 74 65 33  eristics(sqlite3
26150 5f 66 69 6c 65 20 2a 69 64 29 7b 0a 20 20 75 6e  _file *id){.  un
26160 69 78 46 69 6c 65 20 2a 70 20 3d 20 28 75 6e 69  ixFile *p = (uni
26170 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74  xFile*)id;.  int
26180 20 72 63 20 3d 20 30 3b 0a 23 69 66 64 65 66 20   rc = 0;.#ifdef 
26190 5f 5f 51 4e 58 4e 54 4f 5f 5f 0a 20 20 69 66 28  __QNXNTO__.  if(
261a0 20 70 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3d 3d   p->sectorSize==
261b0 30 20 29 20 75 6e 69 78 53 65 63 74 6f 72 53 69  0 ) unixSectorSi
261c0 7a 65 28 69 64 29 3b 0a 20 20 72 63 20 3d 20 70  ze(id);.  rc = p
261d0 2d 3e 64 65 76 69 63 65 43 68 61 72 61 63 74 65  ->deviceCharacte
261e0 72 69 73 74 69 63 73 3b 0a 23 65 6e 64 69 66 0a  ristics;.#endif.
261f0 20 20 69 66 28 20 70 2d 3e 63 74 72 6c 46 6c 61    if( p->ctrlFla
26200 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 50 53  gs & UNIXFILE_PS
26210 4f 57 20 29 7b 0a 20 20 20 20 72 63 20 7c 3d 20  OW ){.    rc |= 
26220 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 50 4f 57  SQLITE_IOCAP_POW
26230 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45  ERSAFE_OVERWRITE
26240 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
26250 63 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e  c;.}..#if !defin
26260 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ed(SQLITE_OMIT_W
26270 41 4c 29 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41  AL) || SQLITE_MA
26280 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 0a 2f  X_MMAP_SIZE>0../
26290 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
262a0 73 79 73 74 65 6d 20 70 61 67 65 20 73 69 7a 65  system page size
262b0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
262c0 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 6e 6f 74  ction should not
262d0 20 62 65 20 63 61 6c 6c 65 64 20 64 69 72 65 63   be called direc
262e0 74 6c 79 20 62 79 20 6f 74 68 65 72 20 63 6f 64  tly by other cod
262f0 65 20 69 6e 20 74 68 69 73 20 66 69 6c 65 2e 20  e in this file. 
26300 0a 2a 2a 20 49 6e 73 74 65 61 64 2c 20 69 74 20  .** Instead, it 
26310 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64  should be called
26320 20 76 69 61 20 6d 61 63 72 6f 20 6f 73 47 65 74   via macro osGet
26330 70 61 67 65 73 69 7a 65 28 29 2e 0a 2a 2f 0a 73  pagesize()..*/.s
26340 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 47 65  tatic int unixGe
26350 74 70 61 67 65 73 69 7a 65 28 76 6f 69 64 29 7b  tpagesize(void){
26360 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
26370 20 20 72 65 74 75 72 6e 20 31 30 32 34 3b 0a 23    return 1024;.#
26380 65 6c 69 66 20 64 65 66 69 6e 65 64 28 5f 42 53  elif defined(_BS
26390 44 5f 53 4f 55 52 43 45 29 0a 20 20 72 65 74 75  D_SOURCE).  retu
263a0 72 6e 20 67 65 74 70 61 67 65 73 69 7a 65 28 29  rn getpagesize()
263b0 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74 75 72 6e  ;.#else.  return
263c0 20 28 69 6e 74 29 73 79 73 63 6f 6e 66 28 5f 53   (int)sysconf(_S
263d0 43 5f 50 41 47 45 53 49 5a 45 29 3b 0a 23 65 6e  C_PAGESIZE);.#en
263e0 64 69 66 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a  dif.}..#endif /*
263f0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
26400 5f 4f 4d 49 54 5f 57 41 4c 29 20 7c 7c 20 53 51  _OMIT_WAL) || SQ
26410 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
26420 5a 45 3e 30 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  ZE>0 */..#ifndef
26430 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
26440 0a 0a 2f 2a 0a 2a 2a 20 4f 62 6a 65 63 74 20 75  ../*.** Object u
26450 73 65 64 20 74 6f 20 72 65 70 72 65 73 65 6e 74  sed to represent
26460 20 61 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f 72   an shared memor
26470 79 20 62 75 66 66 65 72 2e 20 20 0a 2a 2a 0a 2a  y buffer.  .**.*
26480 2a 20 57 68 65 6e 20 6d 75 6c 74 69 70 6c 65 20  * When multiple 
26490 74 68 72 65 61 64 73 20 61 6c 6c 20 72 65 66 65  threads all refe
264a0 72 65 6e 63 65 20 74 68 65 20 73 61 6d 65 20 77  rence the same w
264b0 61 6c 2d 69 6e 64 65 78 2c 20 65 61 63 68 20 74  al-index, each t
264c0 68 72 65 61 64 0a 2a 2a 20 68 61 73 20 69 74 73  hread.** has its
264d0 20 6f 77 6e 20 75 6e 69 78 53 68 6d 20 6f 62 6a   own unixShm obj
264e0 65 63 74 2c 20 62 75 74 20 74 68 65 79 20 61 6c  ect, but they al
264f0 6c 20 70 6f 69 6e 74 20 74 6f 20 61 20 73 69 6e  l point to a sin
26500 67 6c 65 20 69 6e 73 74 61 6e 63 65 0a 2a 2a 20  gle instance.** 
26510 6f 66 20 74 68 69 73 20 75 6e 69 78 53 68 6d 4e  of this unixShmN
26520 6f 64 65 20 6f 62 6a 65 63 74 2e 20 20 49 6e 20  ode object.  In 
26530 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 65 61 63  other words, eac
26540 68 20 77 61 6c 2d 69 6e 64 65 78 20 69 73 20 6f  h wal-index is o
26550 70 65 6e 65 64 0a 2a 2a 20 6f 6e 6c 79 20 6f 6e  pened.** only on
26560 63 65 20 70 65 72 20 70 72 6f 63 65 73 73 2e 0a  ce per process..
26570 2a 2a 0a 2a 2a 20 45 61 63 68 20 75 6e 69 78 53  **.** Each unixS
26580 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 69 73  hmNode object is
26590 20 63 6f 6e 6e 65 63 74 65 64 20 74 6f 20 61 20   connected to a 
265a0 73 69 6e 67 6c 65 20 75 6e 69 78 49 6e 6f 64 65  single unixInode
265b0 49 6e 66 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2a 20  Info object..** 
265c0 57 65 20 63 6f 75 6c 64 20 63 6f 61 6c 65 73 63  We could coalesc
265d0 65 20 74 68 69 73 20 6f 62 6a 65 63 74 20 69 6e  e this object in
265e0 74 6f 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  to unixInodeInfo
265f0 2c 20 62 75 74 20 74 68 61 74 20 77 6f 75 6c 64  , but that would
26600 20 6d 65 61 6e 0a 2a 2a 20 65 76 65 72 79 20 6f   mean.** every o
26610 70 65 6e 20 66 69 6c 65 20 74 68 61 74 20 64 6f  pen file that do
26620 65 73 20 6e 6f 74 20 75 73 65 20 73 68 61 72 65  es not use share
26630 64 20 6d 65 6d 6f 72 79 20 28 69 6e 20 6f 74 68  d memory (in oth
26640 65 72 20 77 6f 72 64 73 2c 20 6d 6f 73 74 0a 2a  er words, most.*
26650 2a 20 6f 70 65 6e 20 66 69 6c 65 73 29 20 77 6f  * open files) wo
26660 75 6c 64 20 68 61 76 65 20 74 6f 20 63 61 72 72  uld have to carr
26670 79 20 61 72 6f 75 6e 64 20 74 68 69 73 20 65 78  y around this ex
26680 74 72 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  tra information.
26690 20 20 53 6f 0a 2a 2a 20 74 68 65 20 75 6e 69 78    So.** the unix
266a0 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74  InodeInfo object
266b0 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e   contains a poin
266c0 74 65 72 20 74 6f 20 74 68 69 73 20 75 6e 69 78  ter to this unix
266d0 53 68 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 0a 2a  ShmNode object.*
266e0 2a 20 61 6e 64 20 74 68 65 20 75 6e 69 78 53 68  * and the unixSh
266f0 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 69 73 20  mNode object is 
26700 63 72 65 61 74 65 64 20 6f 6e 6c 79 20 77 68 65  created only whe
26710 6e 20 6e 65 65 64 65 64 2e 0a 2a 2a 0a 2a 2a 20  n needed..**.** 
26720 75 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20  unixMutexHeld() 
26730 6d 75 73 74 20 62 65 20 74 72 75 65 20 77 68 65  must be true whe
26740 6e 20 63 72 65 61 74 69 6e 67 20 6f 72 20 64 65  n creating or de
26750 73 74 72 6f 79 69 6e 67 0a 2a 2a 20 74 68 69 73  stroying.** this
26760 20 6f 62 6a 65 63 74 20 6f 72 20 77 68 69 6c 65   object or while
26770 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74   reading or writ
26780 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ing the followin
26790 67 20 66 69 65 6c 64 73 3a 0a 2a 2a 0a 2a 2a 20  g fields:.**.** 
267a0 20 20 20 20 20 6e 52 65 66 0a 2a 2a 0a 2a 2a 20       nRef.**.** 
267b0 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 69  The following fi
267c0 65 6c 64 73 20 61 72 65 20 72 65 61 64 2d 6f 6e  elds are read-on
267d0 6c 79 20 61 66 74 65 72 20 74 68 65 20 6f 62 6a  ly after the obj
267e0 65 63 74 20 69 73 20 63 72 65 61 74 65 64 3a 0a  ect is created:.
267f0 2a 2a 20 0a 2a 2a 20 20 20 20 20 20 66 69 64 0a  ** .**      fid.
26800 2a 2a 20 20 20 20 20 20 7a 46 69 6c 65 6e 61 6d  **      zFilenam
26810 65 0a 2a 2a 0a 2a 2a 20 45 69 74 68 65 72 20 75  e.**.** Either u
26820 6e 69 78 53 68 6d 4e 6f 64 65 2e 6d 75 74 65 78  nixShmNode.mutex
26830 20 6d 75 73 74 20 62 65 20 68 65 6c 64 20 6f 72   must be held or
26840 20 75 6e 69 78 53 68 6d 4e 6f 64 65 2e 6e 52 65   unixShmNode.nRe
26850 66 3d 3d 30 20 61 6e 64 0a 2a 2a 20 75 6e 69 78  f==0 and.** unix
26860 4d 75 74 65 78 48 65 6c 64 28 29 20 69 73 20 74  MutexHeld() is t
26870 72 75 65 20 77 68 65 6e 20 72 65 61 64 69 6e 67  rue when reading
26880 20 6f 72 20 77 72 69 74 69 6e 67 20 61 6e 79 20   or writing any 
26890 6f 74 68 65 72 20 66 69 65 6c 64 0a 2a 2a 20 69  other field.** i
268a0 6e 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  n this structure
268b0 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 75 6e 69 78  ..*/.struct unix
268c0 53 68 6d 4e 6f 64 65 20 7b 0a 20 20 75 6e 69 78  ShmNode {.  unix
268d0 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64  InodeInfo *pInod
268e0 65 3b 20 20 20 20 20 2f 2a 20 75 6e 69 78 49 6e  e;     /* unixIn
268f0 6f 64 65 49 6e 66 6f 20 74 68 61 74 20 6f 77 6e  odeInfo that own
26900 73 20 74 68 69 73 20 53 48 4d 20 6e 6f 64 65 20  s this SHM node 
26910 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  */.  sqlite3_mut
26920 65 78 20 2a 6d 75 74 65 78 3b 20 20 20 20 20 20  ex *mutex;      
26930 2f 2a 20 4d 75 74 65 78 20 74 6f 20 61 63 63 65  /* Mutex to acce
26940 73 73 20 74 68 69 73 20 6f 62 6a 65 63 74 20 2a  ss this object *
26950 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  /.  char *zFilen
26960 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ame;           /
26970 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6d 6d  * Name of the mm
26980 61 70 70 65 64 20 66 69 6c 65 20 2a 2f 0a 20 20  apped file */.  
26990 69 6e 74 20 68 3b 20 20 20 20 20 20 20 20 20 20  int h;          
269a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70             /* Op
269b0 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  en file descript
269c0 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 52 65  or */.  int szRe
269d0 67 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20  gion;           
269e0 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 68     /* Size of sh
269f0 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72 65 67 69  ared-memory regi
26a00 6f 6e 73 20 2a 2f 0a 20 20 75 31 36 20 6e 52 65  ons */.  u16 nRe
26a10 67 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 20  gion;           
26a20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61      /* Size of a
26a30 72 72 61 79 20 61 70 52 65 67 69 6f 6e 20 2a 2f  rray apRegion */
26a40 0a 20 20 75 38 20 69 73 52 65 61 64 6f 6e 6c 79  .  u8 isReadonly
26a50 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
26a60 20 54 72 75 65 20 69 66 20 72 65 61 64 2d 6f 6e   True if read-on
26a70 6c 79 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61  ly */.  char **a
26a80 70 52 65 67 69 6f 6e 3b 20 20 20 20 20 20 20 20  pRegion;        
26a90 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 6d     /* Array of m
26aa0 61 70 70 65 64 20 73 68 61 72 65 64 2d 6d 65 6d  apped shared-mem
26ab0 6f 72 79 20 72 65 67 69 6f 6e 73 20 2a 2f 0a 20  ory regions */. 
26ac0 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20   int nRef;      
26ad0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
26ae0 75 6d 62 65 72 20 6f 66 20 75 6e 69 78 53 68 6d  umber of unixShm
26af0 20 6f 62 6a 65 63 74 73 20 70 6f 69 6e 74 69 6e   objects pointin
26b00 67 20 74 6f 20 74 68 69 73 20 2a 2f 0a 20 20 75  g to this */.  u
26b10 6e 69 78 53 68 6d 20 2a 70 46 69 72 73 74 3b 20  nixShm *pFirst; 
26b20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
26b30 20 75 6e 69 78 53 68 6d 20 6f 62 6a 65 63 74 73   unixShm objects
26b40 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 69   pointing to thi
26b50 73 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  s */.#ifdef SQLI
26b60 54 45 5f 44 45 42 55 47 0a 20 20 75 38 20 65 78  TE_DEBUG.  u8 ex
26b70 63 6c 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20  clMask;         
26b80 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
26b90 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73   exclusive locks
26ba0 20 68 65 6c 64 20 2a 2f 0a 20 20 75 38 20 73 68   held */.  u8 sh
26bb0 61 72 65 64 4d 61 73 6b 3b 20 20 20 20 20 20 20  aredMask;       
26bc0 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66        /* Mask of
26bd0 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 68 65   shared locks he
26be0 6c 64 20 2a 2f 0a 20 20 75 38 20 6e 65 78 74 53  ld */.  u8 nextS
26bf0 68 6d 49 64 3b 20 20 20 20 20 20 20 20 20 20 20  hmId;           
26c00 20 20 20 2f 2a 20 4e 65 78 74 20 61 76 61 69 6c     /* Next avail
26c10 61 62 6c 65 20 75 6e 69 78 53 68 6d 2e 69 64 20  able unixShm.id 
26c20 76 61 6c 75 65 20 2a 2f 0a 23 65 6e 64 69 66 0a  value */.#endif.
26c30 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 53 74 72 75 63 74  };../*.** Struct
26c40 75 72 65 20 75 73 65 64 20 69 6e 74 65 72 6e 61  ure used interna
26c50 6c 6c 79 20 62 79 20 74 68 69 73 20 56 46 53 20  lly by this VFS 
26c60 74 6f 20 72 65 63 6f 72 64 20 74 68 65 20 73 74  to record the st
26c70 61 74 65 20 6f 66 20 61 6e 0a 2a 2a 20 6f 70 65  ate of an.** ope
26c80 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  n shared memory 
26c90 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  connection..**.*
26ca0 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
26cb0 66 69 65 6c 64 73 20 61 72 65 20 69 6e 69 74 69  fields are initi
26cc0 61 6c 69 7a 65 64 20 77 68 65 6e 20 74 68 69 73  alized when this
26cd0 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61 74   object is creat
26ce0 65 64 20 61 6e 64 0a 2a 2a 20 61 72 65 20 72 65  ed and.** are re
26cf0 61 64 2d 6f 6e 6c 79 20 74 68 65 72 65 61 66 74  ad-only thereaft
26d00 65 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 75 6e 69  er:.**.**    uni
26d10 78 53 68 6d 2e 70 46 69 6c 65 0a 2a 2a 20 20 20  xShm.pFile.**   
26d20 20 75 6e 69 78 53 68 6d 2e 69 64 0a 2a 2a 0a 2a   unixShm.id.**.*
26d30 2a 20 41 6c 6c 20 6f 74 68 65 72 20 66 69 65 6c  * All other fiel
26d40 64 73 20 61 72 65 20 72 65 61 64 2f 77 72 69 74  ds are read/writ
26d50 65 2e 20 20 54 68 65 20 75 6e 69 78 53 68 6d 2e  e.  The unixShm.
26d60 70 46 69 6c 65 2d 3e 6d 75 74 65 78 20 6d 75 73  pFile->mutex mus
26d70 74 20 62 65 20 68 65 6c 64 0a 2a 2a 20 77 68 69  t be held.** whi
26d80 6c 65 20 61 63 63 65 73 73 69 6e 67 20 61 6e 79  le accessing any
26d90 20 72 65 61 64 2f 77 72 69 74 65 20 66 69 65 6c   read/write fiel
26da0 64 73 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 75 6e  ds..*/.struct un
26db0 69 78 53 68 6d 20 7b 0a 20 20 75 6e 69 78 53 68  ixShm {.  unixSh
26dc0 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b  mNode *pShmNode;
26dd0 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65       /* The unde
26de0 72 6c 79 69 6e 67 20 75 6e 69 78 53 68 6d 4e 6f  rlying unixShmNo
26df0 64 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 75  de object */.  u
26e00 6e 69 78 53 68 6d 20 2a 70 4e 65 78 74 3b 20 20  nixShm *pNext;  
26e10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78            /* Nex
26e20 74 20 75 6e 69 78 53 68 6d 20 77 69 74 68 20 74  t unixShm with t
26e30 68 65 20 73 61 6d 65 20 75 6e 69 78 53 68 6d 4e  he same unixShmN
26e40 6f 64 65 20 2a 2f 0a 20 20 75 38 20 68 61 73 4d  ode */.  u8 hasM
26e50 75 74 65 78 3b 20 20 20 20 20 20 20 20 20 20 20  utex;           
26e60 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 68      /* True if h
26e70 6f 6c 64 69 6e 67 20 74 68 65 20 75 6e 69 78 53  olding the unixS
26e80 68 6d 4e 6f 64 65 20 6d 75 74 65 78 20 2a 2f 0a  hmNode mutex */.
26e90 20 20 75 38 20 69 64 3b 20 20 20 20 20 20 20 20    u8 id;        
26ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26eb0 49 64 20 6f 66 20 74 68 69 73 20 63 6f 6e 6e 65  Id of this conne
26ec0 63 74 69 6f 6e 20 77 69 74 68 69 6e 20 69 74 73  ction within its
26ed0 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 2f 0a   unixShmNode */.
26ee0 20 20 75 31 36 20 73 68 61 72 65 64 4d 61 73 6b    u16 sharedMask
26ef0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
26f00 4d 61 73 6b 20 6f 66 20 73 68 61 72 65 64 20 6c  Mask of shared l
26f10 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 20 20 75  ocks held */.  u
26f20 31 36 20 65 78 63 6c 4d 61 73 6b 3b 20 20 20 20  16 exclMask;    
26f30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73            /* Mas
26f40 6b 20 6f 66 20 65 78 63 6c 75 73 69 76 65 20 6c  k of exclusive l
26f50 6f 63 6b 73 20 68 65 6c 64 20 2a 2f 0a 7d 3b 0a  ocks held */.};.
26f60 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 61 6e 74 73  ./*.** Constants
26f70 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e   used for lockin
26f80 67 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49  g.*/.#define UNI
26f90 58 5f 53 48 4d 5f 42 41 53 45 20 20 20 28 28 32  X_SHM_BASE   ((2
26fa0 32 2b 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f  2+SQLITE_SHM_NLO
26fb0 43 4b 29 2a 34 29 20 20 20 20 20 20 20 20 20 2f  CK)*4)         /
26fc0 2a 20 66 69 72 73 74 20 6c 6f 63 6b 20 62 79 74  * first lock byt
26fd0 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49  e */.#define UNI
26fe0 58 5f 53 48 4d 5f 44 4d 53 20 20 20 20 28 55 4e  X_SHM_DMS    (UN
26ff0 49 58 5f 53 48 4d 5f 42 41 53 45 2b 53 51 4c 49  IX_SHM_BASE+SQLI
27000 54 45 5f 53 48 4d 5f 4e 4c 4f 43 4b 29 20 20 2f  TE_SHM_NLOCK)  /
27010 2a 20 64 65 61 64 6d 61 6e 20 73 77 69 74 63 68  * deadman switch
27020 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 6c 79   */../*.** Apply
27030 20 70 6f 73 69 78 20 61 64 76 69 73 6f 72 79 20   posix advisory 
27040 6c 6f 63 6b 73 20 66 6f 72 20 61 6c 6c 20 62 79  locks for all by
27050 74 65 73 20 66 72 6f 6d 20 6f 66 73 74 20 74 68  tes from ofst th
27060 72 6f 75 67 68 20 6f 66 73 74 2b 6e 2d 31 2e 0a  rough ofst+n-1..
27070 2a 2a 0a 2a 2a 20 4c 6f 63 6b 73 20 62 6c 6f 63  **.** Locks bloc
27080 6b 20 69 66 20 74 68 65 20 6d 61 73 6b 20 69 73  k if the mask is
27090 20 65 78 61 63 74 6c 79 20 55 4e 49 58 5f 53 48   exactly UNIX_SH
270a0 4d 5f 43 20 61 6e 64 20 61 72 65 20 6e 6f 6e 2d  M_C and are non-
270b0 62 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 6f 74 68 65  blocking.** othe
270c0 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  rwise..*/.static
270d0 20 69 6e 74 20 75 6e 69 78 53 68 6d 53 79 73 74   int unixShmSyst
270e0 65 6d 4c 6f 63 6b 28 0a 20 20 75 6e 69 78 46 69  emLock(.  unixFi
270f0 6c 65 20 2a 70 46 69 6c 65 2c 20 20 20 20 20 20  le *pFile,      
27100 20 2f 2a 20 4f 70 65 6e 20 63 6f 6e 6e 65 63 74   /* Open connect
27110 69 6f 6e 20 74 6f 20 74 68 65 20 57 41 4c 20 66  ion to the WAL f
27120 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6c 6f 63  ile */.  int loc
27130 6b 54 79 70 65 2c 20 20 20 20 20 20 20 20 20 20  kType,          
27140 2f 2a 20 46 5f 55 4e 4c 43 4b 2c 20 46 5f 52 44  /* F_UNLCK, F_RD
27150 4c 43 4b 2c 20 6f 72 20 46 5f 57 52 4c 43 4b 20  LCK, or F_WRLCK 
27160 2a 2f 0a 20 20 69 6e 74 20 6f 66 73 74 2c 20 20  */.  int ofst,  
27170 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
27180 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65  irst byte of the
27190 20 6c 6f 63 6b 69 6e 67 20 72 61 6e 67 65 20 2a   locking range *
271a0 2f 0a 20 20 69 6e 74 20 6e 20 20 20 20 20 20 20  /.  int n       
271b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
271c0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f  mber of bytes to
271d0 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20 20 75 6e   lock */.){.  un
271e0 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e  ixShmNode *pShmN
271f0 6f 64 65 3b 20 2f 2a 20 41 70 70 6c 79 20 6c 6f  ode; /* Apply lo
27200 63 6b 73 20 74 6f 20 74 68 69 73 20 6f 70 65 6e  cks to this open
27210 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 73   shared-memory s
27220 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 73 74 72 75  egment */.  stru
27230 63 74 20 66 6c 6f 63 6b 20 66 3b 20 20 20 20 20  ct flock f;     
27240 20 20 20 2f 2a 20 54 68 65 20 70 6f 73 69 78 20     /* The posix 
27250 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 69 6e 67  advisory locking
27260 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20   structure */.  
27270 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
27280 4f 4b 3b 20 20 20 20 2f 2a 20 52 65 73 75 6c 74  OK;    /* Result
27290 20 63 6f 64 65 20 66 6f 72 6d 20 66 63 6e 74 6c   code form fcntl
272a0 28 29 20 2a 2f 0a 0a 20 20 2f 2a 20 41 63 63 65  () */..  /* Acce
272b0 73 73 20 74 6f 20 74 68 65 20 75 6e 69 78 53 68  ss to the unixSh
272c0 6d 4e 6f 64 65 20 6f 62 6a 65 63 74 20 69 73 20  mNode object is 
272d0 73 65 72 69 61 6c 69 7a 65 64 20 62 79 20 74 68  serialized by th
272e0 65 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 70 53  e caller */.  pS
272f0 68 6d 4e 6f 64 65 20 3d 20 70 46 69 6c 65 2d 3e  hmNode = pFile->
27300 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f 64 65  pInode->pShmNode
27310 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
27320 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
27330 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 20  ShmNode->mutex) 
27340 7c 7c 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  || pShmNode->nRe
27350 66 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 53 68  f==0 );..  /* Sh
27360 61 72 65 64 20 6c 6f 63 6b 73 20 6e 65 76 65 72  ared locks never
27370 20 73 70 61 6e 20 6d 6f 72 65 20 74 68 61 6e 20   span more than 
27380 6f 6e 65 20 62 79 74 65 20 2a 2f 0a 20 20 61 73  one byte */.  as
27390 73 65 72 74 28 20 6e 3d 3d 31 20 7c 7c 20 6c 6f  sert( n==1 || lo
273a0 63 6b 54 79 70 65 21 3d 46 5f 52 44 4c 43 4b 20  ckType!=F_RDLCK 
273b0 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 63 6b 73 20 61  );..  /* Locks a
273c0 72 65 20 77 69 74 68 69 6e 20 72 61 6e 67 65 20  re within range 
273d0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6e 3e 3d  */.  assert( n>=
273e0 31 20 26 26 20 6e 3c 53 51 4c 49 54 45 5f 53 48  1 && n<SQLITE_SH
273f0 4d 5f 4e 4c 4f 43 4b 20 29 3b 0a 0a 20 20 69 66  M_NLOCK );..  if
27400 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30  ( pShmNode->h>=0
27410 20 29 7b 0a 20 20 20 20 69 6e 74 20 6c 6b 54 79   ){.    int lkTy
27420 70 65 3b 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69  pe;.    /* Initi
27430 61 6c 69 7a 65 20 74 68 65 20 6c 6f 63 6b 69 6e  alize the lockin
27440 67 20 70 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a  g parameters */.
27450 20 20 20 20 6d 65 6d 73 65 74 28 26 66 2c 20 30      memset(&f, 0
27460 2c 20 73 69 7a 65 6f 66 28 66 29 29 3b 0a 20 20  , sizeof(f));.  
27470 20 20 66 2e 6c 5f 74 79 70 65 20 3d 20 6c 6f 63    f.l_type = loc
27480 6b 54 79 70 65 3b 0a 20 20 20 20 66 2e 6c 5f 77  kType;.    f.l_w
27490 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54  hence = SEEK_SET
274a0 3b 0a 20 20 20 20 66 2e 6c 5f 73 74 61 72 74 20  ;.    f.l_start 
274b0 3d 20 6f 66 73 74 3b 0a 20 20 20 20 66 2e 6c 5f  = ofst;.    f.l_
274c0 6c 65 6e 20 3d 20 6e 3b 0a 0a 20 20 20 20 6c 6b  len = n;..    lk
274d0 54 79 70 65 20 3d 20 28 70 46 69 6c 65 2d 3e 63  Type = (pFile->c
274e0 74 72 6c 46 6c 61 67 73 20 26 20 55 4e 49 58 46  trlFlags & UNIXF
274f0 49 4c 45 5f 42 4c 4f 43 4b 29 21 3d 30 20 3f 20  ILE_BLOCK)!=0 ? 
27500 46 5f 53 45 54 4c 4b 57 20 3a 20 46 5f 53 45 54  F_SETLKW : F_SET
27510 4c 4b 3b 0a 20 20 20 20 72 63 20 3d 20 6f 73 46  LK;.    rc = osF
27520 63 6e 74 6c 28 70 53 68 6d 4e 6f 64 65 2d 3e 68  cntl(pShmNode->h
27530 2c 20 6c 6b 54 79 70 65 2c 20 26 66 29 3b 0a 20  , lkType, &f);. 
27540 20 20 20 72 63 20 3d 20 28 72 63 21 3d 28 2d 31     rc = (rc!=(-1
27550 29 29 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a  )) ? SQLITE_OK :
27560 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
27570 20 20 70 46 69 6c 65 2d 3e 63 74 72 6c 46 6c 61    pFile->ctrlFla
27580 67 73 20 26 3d 20 7e 55 4e 49 58 46 49 4c 45 5f  gs &= ~UNIXFILE_
27590 42 4c 4f 43 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  BLOCK;.  }..  /*
275a0 20 55 70 64 61 74 65 20 74 68 65 20 67 6c 6f 62   Update the glob
275b0 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 20 61 6e  al lock state an
275c0 64 20 64 6f 20 64 65 62 75 67 20 74 72 61 63 69  d do debug traci
275d0 6e 67 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  ng */.#ifdef SQL
275e0 49 54 45 5f 44 45 42 55 47 0a 20 20 7b 20 75 31  ITE_DEBUG.  { u1
275f0 36 20 6d 61 73 6b 3b 0a 20 20 4f 53 54 52 41 43  6 mask;.  OSTRAC
27600 45 28 28 22 53 48 4d 2d 4c 4f 43 4b 20 22 29 29  E(("SHM-LOCK "))
27610 3b 0a 20 20 6d 61 73 6b 20 3d 20 6f 66 73 74 3e  ;.  mask = ofst>
27620 33 31 20 3f 20 30 78 66 66 66 66 20 3a 20 28 31  31 ? 0xffff : (1
27630 3c 3c 28 6f 66 73 74 2b 6e 29 29 20 2d 20 28 31  <<(ofst+n)) - (1
27640 3c 3c 6f 66 73 74 29 3b 0a 20 20 69 66 28 20 72  <<ofst);.  if( r
27650 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
27660 20 20 20 20 69 66 28 20 6c 6f 63 6b 54 79 70 65      if( lockType
27670 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20  ==F_UNLCK ){.   
27680 20 20 20 4f 53 54 52 41 43 45 28 28 22 75 6e 6c     OSTRACE(("unl
27690 6f 63 6b 20 25 64 20 6f 6b 22 2c 20 6f 66 73 74  ock %d ok", ofst
276a0 29 29 3b 0a 20 20 20 20 20 20 70 53 68 6d 4e 6f  ));.      pShmNo
276b0 64 65 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 3d 20  de->exclMask &= 
276c0 7e 6d 61 73 6b 3b 0a 20 20 20 20 20 20 70 53 68  ~mask;.      pSh
276d0 6d 4e 6f 64 65 2d 3e 73 68 61 72 65 64 4d 61 73  mNode->sharedMas
276e0 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20  k &= ~mask;.    
276f0 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63 6b 54 79  }else if( lockTy
27700 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b 0a 20  pe==F_RDLCK ){. 
27710 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 72       OSTRACE(("r
27720 65 61 64 2d 6c 6f 63 6b 20 25 64 20 6f 6b 22 2c  ead-lock %d ok",
27730 20 6f 66 73 74 29 29 3b 0a 20 20 20 20 20 20 70   ofst));.      p
27740 53 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61 73  ShmNode->exclMas
27750 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20 20 20 20  k &= ~mask;.    
27760 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 68 61 72    pShmNode->shar
27770 65 64 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a  edMask |= mask;.
27780 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
27790 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 54 79 70   assert( lockTyp
277a0 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 3b 0a 20 20  e==F_WRLCK );.  
277b0 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 77 72      OSTRACE(("wr
277c0 69 74 65 2d 6c 6f 63 6b 20 25 64 20 6f 6b 22 2c  ite-lock %d ok",
277d0 20 6f 66 73 74 29 29 3b 0a 20 20 20 20 20 20 70   ofst));.      p
277e0 53 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61 73  ShmNode->exclMas
277f0 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 20  k |= mask;.     
27800 20 70 53 68 6d 4e 6f 64 65 2d 3e 73 68 61 72 65   pShmNode->share
27810 64 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a  dMask &= ~mask;.
27820 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
27830 20 20 20 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d     if( lockType=
27840 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20  =F_UNLCK ){.    
27850 20 20 4f 53 54 52 41 43 45 28 28 22 75 6e 6c 6f    OSTRACE(("unlo
27860 63 6b 20 25 64 20 66 61 69 6c 65 64 22 2c 20 6f  ck %d failed", o
27870 66 73 74 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65  fst));.    }else
27880 20 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46   if( lockType==F
27890 5f 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20  _RDLCK ){.      
278a0 4f 53 54 52 41 43 45 28 28 22 72 65 61 64 2d 6c  OSTRACE(("read-l
278b0 6f 63 6b 20 66 61 69 6c 65 64 22 29 29 3b 0a 20  ock failed"));. 
278c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
278d0 61 73 73 65 72 74 28 20 6c 6f 63 6b 54 79 70 65  assert( lockType
278e0 3d 3d 46 5f 57 52 4c 43 4b 20 29 3b 0a 20 20 20  ==F_WRLCK );.   
278f0 20 20 20 4f 53 54 52 41 43 45 28 28 22 77 72 69     OSTRACE(("wri
27900 74 65 2d 6c 6f 63 6b 20 25 64 20 66 61 69 6c 65  te-lock %d faile
27910 64 22 2c 20 6f 66 73 74 29 29 3b 0a 20 20 20 20  d", ofst));.    
27920 7d 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28  }.  }.  OSTRACE(
27930 28 22 20 2d 20 61 66 74 65 72 77 61 72 64 73 20  (" - afterwards 
27940 25 30 33 78 2c 25 30 33 78 5c 6e 22 2c 0a 20 20  %03x,%03x\n",.  
27950 20 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f 64           pShmNod
27960 65 2d 3e 73 68 61 72 65 64 4d 61 73 6b 2c 20 70  e->sharedMask, p
27970 53 68 6d 4e 6f 64 65 2d 3e 65 78 63 6c 4d 61 73  ShmNode->exclMas
27980 6b 29 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  k));.  }.#endif.
27990 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 20 20 20  .  return rc;   
279a0 20 20 20 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52       .}../*.** R
279b0 65 74 75 72 6e 20 74 68 65 20 6d 69 6e 69 6d 75  eturn the minimu
279c0 6d 20 6e 75 6d 62 65 72 20 6f 66 20 33 32 4b 42  m number of 32KB
279d0 20 73 68 6d 20 72 65 67 69 6f 6e 73 20 74 68 61   shm regions tha
279e0 74 20 73 68 6f 75 6c 64 20 62 65 20 6d 61 70 70  t should be mapp
279f0 65 64 20 61 74 0a 2a 2a 20 61 20 74 69 6d 65 2c  ed at.** a time,
27a00 20 61 73 73 75 6d 69 6e 67 20 74 68 61 74 20 65   assuming that e
27a10 61 63 68 20 6d 61 70 70 69 6e 67 20 6d 75 73 74  ach mapping must
27a20 20 62 65 20 61 6e 20 69 6e 74 65 67 65 72 20 6d   be an integer m
27a30 75 6c 74 69 70 6c 65 20 6f 66 20 74 68 65 0a 2a  ultiple of the.*
27a40 2a 20 63 75 72 72 65 6e 74 20 73 79 73 74 65 6d  * current system
27a50 20 70 61 67 65 2d 73 69 7a 65 2e 0a 2a 2a 0a 2a   page-size..**.*
27a60 2a 20 55 73 75 61 6c 6c 79 2c 20 74 68 69 73 20  * Usually, this 
27a70 69 73 20 31 2e 20 54 68 65 20 65 78 63 65 70 74  is 1. The except
27a80 69 6f 6e 20 73 65 65 6d 73 20 74 6f 20 62 65 20  ion seems to be 
27a90 73 79 73 74 65 6d 73 20 74 68 61 74 20 61 72 65  systems that are
27aa0 20 63 6f 6e 66 69 67 75 72 65 64 0a 2a 2a 20 74   configured.** t
27ab0 6f 20 75 73 65 20 36 34 4b 42 20 70 61 67 65 73  o use 64KB pages
27ac0 20 2d 20 69 6e 20 74 68 69 73 20 63 61 73 65 20   - in this case 
27ad0 65 61 63 68 20 6d 61 70 70 69 6e 67 20 6d 75 73  each mapping mus
27ae0 74 20 63 6f 76 65 72 20 61 74 20 6c 65 61 73 74  t cover at least
27af0 20 74 77 6f 0a 2a 2a 20 73 68 6d 20 72 65 67 69   two.** shm regi
27b00 6f 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ons..*/.static i
27b10 6e 74 20 75 6e 69 78 53 68 6d 52 65 67 69 6f 6e  nt unixShmRegion
27b20 50 65 72 4d 61 70 28 76 6f 69 64 29 7b 0a 20 20  PerMap(void){.  
27b30 69 6e 74 20 73 68 6d 73 7a 20 3d 20 33 32 2a 31  int shmsz = 32*1
27b40 30 32 34 3b 20 20 20 20 20 20 20 20 20 20 20 20  024;            
27b50 2f 2a 20 53 48 4d 20 72 65 67 69 6f 6e 20 73 69  /* SHM region si
27b60 7a 65 20 2a 2f 0a 20 20 69 6e 74 20 70 67 73 7a  ze */.  int pgsz
27b70 20 3d 20 6f 73 47 65 74 70 61 67 65 73 69 7a 65   = osGetpagesize
27b80 28 29 3b 20 20 20 2f 2a 20 53 79 73 74 65 6d 20  ();   /* System 
27b90 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a 20 20 61  page size */.  a
27ba0 73 73 65 72 74 28 20 28 28 70 67 73 7a 2d 31 29  ssert( ((pgsz-1)
27bb0 26 70 67 73 7a 29 3d 3d 30 20 29 3b 20 20 20 2f  &pgsz)==0 );   /
27bc0 2a 20 50 61 67 65 20 73 69 7a 65 20 6d 75 73 74  * Page size must
27bd0 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20 32   be a power of 2
27be0 20 2a 2f 0a 20 20 69 66 28 20 70 67 73 7a 3c 73   */.  if( pgsz<s
27bf0 68 6d 73 7a 20 29 20 72 65 74 75 72 6e 20 31 3b  hmsz ) return 1;
27c00 0a 20 20 72 65 74 75 72 6e 20 70 67 73 7a 2f 73  .  return pgsz/s
27c10 68 6d 73 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  hmsz;.}../*.** P
27c20 75 72 67 65 20 74 68 65 20 75 6e 69 78 53 68 6d  urge the unixShm
27c30 4e 6f 64 65 4c 69 73 74 20 6c 69 73 74 20 6f 66  NodeList list of
27c40 20 61 6c 6c 20 65 6e 74 72 69 65 73 20 77 69 74   all entries wit
27c50 68 20 75 6e 69 78 53 68 6d 4e 6f 64 65 2e 6e 52  h unixShmNode.nR
27c60 65 66 3d 3d 30 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ef==0..**.** Thi
27c70 73 20 69 73 20 6e 6f 74 20 61 20 56 46 53 20 73  s is not a VFS s
27c80 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6d 65 74  hared-memory met
27c90 68 6f 64 3b 20 69 74 20 69 73 20 61 20 75 74 69  hod; it is a uti
27ca0 6c 69 74 79 20 66 75 6e 63 74 69 6f 6e 20 63 61  lity function ca
27cb0 6c 6c 65 64 0a 2a 2a 20 62 79 20 56 46 53 20 73  lled.** by VFS s
27cc0 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6d 65 74  hared-memory met
27cd0 68 6f 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  hods..*/.static 
27ce0 76 6f 69 64 20 75 6e 69 78 53 68 6d 50 75 72 67  void unixShmPurg
27cf0 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 64 29  e(unixFile *pFd)
27d00 7b 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20  {.  unixShmNode 
27d10 2a 70 20 3d 20 70 46 64 2d 3e 70 49 6e 6f 64 65  *p = pFd->pInode
27d20 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 61 73  ->pShmNode;.  as
27d30 73 65 72 74 28 20 75 6e 69 78 4d 75 74 65 78 48  sert( unixMutexH
27d40 65 6c 64 28 29 20 29 3b 0a 20 20 69 66 28 20 70  eld() );.  if( p
27d50 20 26 26 20 70 2d 3e 6e 52 65 66 3d 3d 30 20 29   && p->nRef==0 )
27d60 7b 0a 20 20 20 20 69 6e 74 20 6e 53 68 6d 50 65  {.    int nShmPe
27d70 72 4d 61 70 20 3d 20 75 6e 69 78 53 68 6d 52 65  rMap = unixShmRe
27d80 67 69 6f 6e 50 65 72 4d 61 70 28 29 3b 0a 20 20  gionPerMap();.  
27d90 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 61 73 73    int i;.    ass
27da0 65 72 74 28 20 70 2d 3e 70 49 6e 6f 64 65 3d 3d  ert( p->pInode==
27db0 70 46 64 2d 3e 70 49 6e 6f 64 65 20 29 3b 0a 20  pFd->pInode );. 
27dc0 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
27dd0 5f 66 72 65 65 28 70 2d 3e 6d 75 74 65 78 29 3b  _free(p->mutex);
27de0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
27df0 70 2d 3e 6e 52 65 67 69 6f 6e 3b 20 69 2b 3d 6e  p->nRegion; i+=n
27e00 53 68 6d 50 65 72 4d 61 70 29 7b 0a 20 20 20 20  ShmPerMap){.    
27e10 20 20 69 66 28 20 70 2d 3e 68 3e 3d 30 20 29 7b    if( p->h>=0 ){
27e20 0a 20 20 20 20 20 20 20 20 6f 73 4d 75 6e 6d 61  .        osMunma
27e30 70 28 70 2d 3e 61 70 52 65 67 69 6f 6e 5b 69 5d  p(p->apRegion[i]
27e40 2c 20 70 2d 3e 73 7a 52 65 67 69 6f 6e 29 3b 0a  , p->szRegion);.
27e50 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
27e60 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
27e70 65 28 70 2d 3e 61 70 52 65 67 69 6f 6e 5b 69 5d  e(p->apRegion[i]
27e80 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
27e90 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
27ea0 65 28 70 2d 3e 61 70 52 65 67 69 6f 6e 29 3b 0a  e(p->apRegion);.
27eb0 20 20 20 20 69 66 28 20 70 2d 3e 68 3e 3d 30 20      if( p->h>=0 
27ec0 29 7b 0a 20 20 20 20 20 20 72 6f 62 75 73 74 5f  ){.      robust_
27ed0 63 6c 6f 73 65 28 70 46 64 2c 20 70 2d 3e 68 2c  close(pFd, p->h,
27ee0 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20   __LINE__);.    
27ef0 20 20 70 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20 20    p->h = -1;.   
27f00 20 7d 0a 20 20 20 20 70 2d 3e 70 49 6e 6f 64 65   }.    p->pInode
27f10 2d 3e 70 53 68 6d 4e 6f 64 65 20 3d 20 30 3b 0a  ->pShmNode = 0;.
27f20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
27f30 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20  (p);.  }.}..#if 
27f40 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
27f50 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41  _) && SQLITE_ENA
27f60 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
27f70 45 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63  E.static const c
27f80 68 61 72 20 2a 70 72 6f 78 79 53 68 61 72 65 64  har *proxyShared
27f90 4d 65 6d 6f 72 79 42 61 73 65 50 61 74 68 28 75  MemoryBasePath(u
27fa0 6e 69 78 46 69 6c 65 20 2a 29 3b 0a 23 65 6e 64  nixFile *);.#end
27fb0 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61  if../*.** Open a
27fc0 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 61   shared-memory a
27fd0 72 65 61 20 61 73 73 6f 63 69 61 74 65 64 20 77  rea associated w
27fe0 69 74 68 20 6f 70 65 6e 20 64 61 74 61 62 61 73  ith open databas
27ff0 65 20 66 69 6c 65 20 70 44 62 46 64 2e 20 20 0a  e file pDbFd.  .
28000 2a 2a 20 54 68 69 73 20 70 61 72 74 69 63 75 6c  ** This particul
28010 61 72 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ar implementatio
28020 6e 20 75 73 65 73 20 6d 6d 61 70 70 65 64 20 66  n uses mmapped f
28030 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  iles..**.** The 
28040 66 69 6c 65 20 75 73 65 64 20 74 6f 20 69 6d 70  file used to imp
28050 6c 65 6d 65 6e 74 20 73 68 61 72 65 64 2d 6d 65  lement shared-me
28060 6d 6f 72 79 20 69 73 20 69 6e 20 74 68 65 20 73  mory is in the s
28070 61 6d 65 20 64 69 72 65 63 74 6f 72 79 0a 2a 2a  ame directory.**
28080 20 61 73 20 74 68 65 20 6f 70 65 6e 20 64 61 74   as the open dat
28090 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 68  abase file and h
280a0 61 73 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65  as the same name
280b0 20 61 73 20 74 68 65 20 6f 70 65 6e 20 64 61 74   as the open dat
280c0 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 77 69  abase.** file wi
280d0 74 68 20 74 68 65 20 22 2d 73 68 6d 22 20 73 75  th the "-shm" su
280e0 66 66 69 78 20 61 64 64 65 64 2e 20 20 46 6f 72  ffix added.  For
280f0 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65   example, if the
28100 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 2a   database file.*
28110 2a 20 69 73 20 22 2f 68 6f 6d 65 2f 75 73 65 72  * is "/home/user
28120 31 2f 63 6f 6e 66 69 67 2e 64 62 22 20 74 68 65  1/config.db" the
28130 6e 20 74 68 65 20 66 69 6c 65 20 74 68 61 74 20  n the file that 
28140 69 73 20 63 72 65 61 74 65 64 20 61 6e 64 20 6d  is created and m
28150 6d 61 70 70 65 64 0a 2a 2a 20 66 6f 72 20 73 68  mapped.** for sh
28160 61 72 65 64 20 6d 65 6d 6f 72 79 20 77 69 6c 6c  ared memory will
28170 20 62 65 20 63 61 6c 6c 65 64 20 22 2f 68 6f 6d   be called "/hom
28180 65 2f 75 73 65 72 31 2f 63 6f 6e 66 69 67 2e 64  e/user1/config.d
28190 62 2d 73 68 6d 22 2e 20 20 0a 2a 2a 0a 2a 2a 20  b-shm".  .**.** 
281a0 41 6e 6f 74 68 65 72 20 61 70 70 72 6f 61 63 68  Another approach
281b0 20 74 6f 20 69 73 20 74 6f 20 75 73 65 20 66 69   to is to use fi
281c0 6c 65 73 20 69 6e 20 2f 64 65 76 2f 73 68 6d 20  les in /dev/shm 
281d0 6f 72 20 2f 64 65 76 2f 74 6d 70 20 6f 72 20 61  or /dev/tmp or a
281e0 6e 0a 2a 2a 20 73 6f 6d 65 20 6f 74 68 65 72 20  n.** some other 
281f0 74 6d 70 66 73 20 6d 6f 75 6e 74 2e 20 42 75 74  tmpfs mount. But
28200 20 69 66 20 61 20 66 69 6c 65 20 69 6e 20 61 20   if a file in a 
28210 64 69 66 66 65 72 65 6e 74 20 64 69 72 65 63 74  different direct
28220 6f 72 79 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20  ory.** from the 
28230 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
28240 20 75 73 65 64 2c 20 74 68 65 6e 20 64 69 66 66   used, then diff
28250 65 72 69 6e 67 20 61 63 63 65 73 73 20 70 65 72  ering access per
28260 6d 69 73 73 69 6f 6e 73 0a 2a 2a 20 6f 72 20 61  missions.** or a
28270 20 63 68 72 6f 6f 74 28 29 20 6d 69 67 68 74 20   chroot() might 
28280 63 61 75 73 65 20 74 77 6f 20 64 69 66 66 65 72  cause two differ
28290 65 6e 74 20 70 72 6f 63 65 73 73 65 73 20 6f 6e  ent processes on
282a0 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 64 61 74   the same.** dat
282b0 61 62 61 73 65 20 74 6f 20 65 6e 64 20 75 70 20  abase to end up 
282c0 75 73 69 6e 67 20 64 69 66 66 65 72 65 6e 74 20  using different 
282d0 66 69 6c 65 73 20 66 6f 72 20 73 68 61 72 65 64  files for shared
282e0 20 6d 65 6d 6f 72 79 20 2d 20 0a 2a 2a 20 6d 65   memory - .** me
282f0 61 6e 69 6e 67 20 74 68 61 74 20 74 68 65 69 72  aning that their
28300 20 6d 65 6d 6f 72 79 20 77 6f 75 6c 64 20 6e 6f   memory would no
28310 74 20 72 65 61 6c 6c 79 20 62 65 20 73 68 61 72  t really be shar
28320 65 64 20 2d 20 72 65 73 75 6c 74 69 6e 67 0a 2a  ed - resulting.*
28330 2a 20 69 6e 20 64 61 74 61 62 61 73 65 20 63 6f  * in database co
28340 72 72 75 70 74 69 6f 6e 2e 20 20 4e 65 76 65 72  rruption.  Never
28350 74 68 65 6c 65 73 73 2c 20 74 68 69 73 20 74 6d  theless, this tm
28360 70 66 73 20 66 69 6c 65 20 75 73 61 67 65 0a 2a  pfs file usage.*
28370 2a 20 63 61 6e 20 62 65 20 65 6e 61 62 6c 65 64  * can be enabled
28380 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65   at compile-time
28390 20 75 73 69 6e 67 20 2d 44 53 51 4c 49 54 45 5f   using -DSQLITE_
283a0 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 3d 22 2f  SHM_DIRECTORY="/
283b0 64 65 76 2f 73 68 6d 22 0a 2a 2a 20 6f 72 20 74  dev/shm".** or t
283c0 68 65 20 65 71 75 69 76 61 6c 65 6e 74 2e 20 20  he equivalent.  
283d0 54 68 65 20 75 73 65 20 6f 66 20 74 68 65 20 53  The use of the S
283e0 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43 54  QLITE_SHM_DIRECT
283f0 4f 52 59 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65  ORY compile-time
28400 0a 2a 2a 20 6f 70 74 69 6f 6e 20 72 65 73 75 6c  .** option resul
28410 74 73 20 69 6e 20 61 6e 20 69 6e 63 6f 6d 70 61  ts in an incompa
28420 74 69 62 6c 65 20 62 75 69 6c 64 20 6f 66 20 53  tible build of S
28430 51 4c 69 74 65 3b 20 20 62 75 69 6c 64 73 20 6f  QLite;  builds o
28440 66 20 53 51 4c 69 74 65 0a 2a 2a 20 74 68 61 74  f SQLite.** that
28450 20 77 69 74 68 20 64 69 66 66 65 72 69 6e 67 20   with differing 
28460 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43  SQLITE_SHM_DIREC
28470 54 4f 52 59 20 73 65 74 74 69 6e 67 73 20 61 74  TORY settings at
28480 74 65 6d 70 74 20 74 6f 20 75 73 65 20 74 68 65  tempt to use the
28490 0a 2a 2a 20 73 61 6d 65 20 64 61 74 61 62 61 73  .** same databas
284a0 65 20 66 69 6c 65 20 61 74 20 74 68 65 20 73 61  e file at the sa
284b0 6d 65 20 74 69 6d 65 2c 20 64 61 74 61 62 61 73  me time, databas
284c0 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 77 69 6c  e corruption wil
284d0 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65 73 75  l likely.** resu
284e0 6c 74 2e 20 54 68 65 20 53 51 4c 49 54 45 5f 53  lt. The SQLITE_S
284f0 48 4d 5f 44 49 52 45 43 54 4f 52 59 20 63 6f 6d  HM_DIRECTORY com
28500 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e  pile-time option
28510 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 0a 2a   is considered.*
28520 2a 20 22 75 6e 73 75 70 70 6f 72 74 65 64 22 20  * "unsupported" 
28530 61 6e 64 20 6d 61 79 20 67 6f 20 61 77 61 79 20  and may go away 
28540 69 6e 20 61 20 66 75 74 75 72 65 20 53 51 4c 69  in a future SQLi
28550 74 65 20 72 65 6c 65 61 73 65 2e 0a 2a 2a 0a 2a  te release..**.*
28560 2a 20 57 68 65 6e 20 6f 70 65 6e 69 6e 67 20 61  * When opening a
28570 20 6e 65 77 20 73 68 61 72 65 64 2d 6d 65 6d 6f   new shared-memo
28580 72 79 20 66 69 6c 65 2c 20 69 66 20 6e 6f 20 6f  ry file, if no o
28590 74 68 65 72 20 69 6e 73 74 61 6e 63 65 73 20 6f  ther instances o
285a0 66 20 74 68 61 74 0a 2a 2a 20 66 69 6c 65 20 61  f that.** file a
285b0 72 65 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65  re currently ope
285c0 6e 2c 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65  n, in this proce
285d0 73 73 20 6f 72 20 69 6e 20 6f 74 68 65 72 20 70  ss or in other p
285e0 72 6f 63 65 73 73 65 73 2c 20 74 68 65 6e 0a 2a  rocesses, then.*
285f0 2a 20 74 68 65 20 66 69 6c 65 20 6d 75 73 74 20  * the file must 
28600 62 65 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20  be truncated to 
28610 7a 65 72 6f 20 6c 65 6e 67 74 68 20 6f 72 20 68  zero length or h
28620 61 76 65 20 69 74 73 20 68 65 61 64 65 72 20 63  ave its header c
28630 6c 65 61 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  leared..**.** If
28640 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61   the original da
28650 74 61 62 61 73 65 20 66 69 6c 65 20 28 70 44 62  tabase file (pDb
28660 46 64 29 20 69 73 20 75 73 69 6e 67 20 74 68 65  Fd) is using the
28670 20 22 75 6e 69 78 2d 65 78 63 6c 22 20 56 46 53   "unix-excl" VFS
28680 0a 2a 2a 20 74 68 61 74 20 6d 65 61 6e 73 20 74  .** that means t
28690 68 61 74 20 61 6e 20 65 78 63 6c 75 73 69 76 65  hat an exclusive
286a0 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e   lock is held on
286b0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
286c0 6c 65 20 61 6e 64 0a 2a 2a 20 74 68 61 74 20 6e  le and.** that n
286d0 6f 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65  o other processe
286e0 73 20 61 72 65 20 61 62 6c 65 20 74 6f 20 72 65  s are able to re
286f0 61 64 20 6f 72 20 77 72 69 74 65 20 74 68 65 20  ad or write the 
28700 64 61 74 61 62 61 73 65 2e 20 20 49 6e 0a 2a 2a  database.  In.**
28710 20 74 68 61 74 20 63 61 73 65 2c 20 77 65 20 64   that case, we d
28720 6f 20 6e 6f 74 20 72 65 61 6c 6c 79 20 6e 65 65  o not really nee
28730 64 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 2e  d shared memory.
28740 20 20 4e 6f 20 73 68 61 72 65 64 20 6d 65 6d 6f    No shared memo
28750 72 79 0a 2a 2a 20 66 69 6c 65 20 69 73 20 63 72  ry.** file is cr
28760 65 61 74 65 64 2e 20 20 54 68 65 20 73 68 61 72  eated.  The shar
28770 65 64 20 6d 65 6d 6f 72 79 20 77 69 6c 6c 20 62  ed memory will b
28780 65 20 73 69 6d 75 6c 61 74 65 64 20 77 69 74 68  e simulated with
28790 20 68 65 61 70 20 6d 65 6d 6f 72 79 2e 0a 2a 2f   heap memory..*/
287a0 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
287b0 4f 70 65 6e 53 68 61 72 65 64 4d 65 6d 6f 72 79  OpenSharedMemory
287c0 28 75 6e 69 78 46 69 6c 65 20 2a 70 44 62 46 64  (unixFile *pDbFd
287d0 29 7b 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78  ){.  struct unix
287e0 53 68 6d 20 2a 70 20 3d 20 30 3b 20 20 20 20 20  Shm *p = 0;     
287f0 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 6e       /* The conn
28800 65 63 74 69 6f 6e 20 74 6f 20 62 65 20 6f 70 65  ection to be ope
28810 6e 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ned */.  struct 
28820 75 6e 69 78 53 68 6d 4e 6f 64 65 20 2a 70 53 68  unixShmNode *pSh
28830 6d 4e 6f 64 65 3b 20 20 20 2f 2a 20 54 68 65 20  mNode;   /* The 
28840 75 6e 64 65 72 6c 79 69 6e 67 20 6d 6d 61 70 70  underlying mmapp
28850 65 64 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  ed file */.  int
28860 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
28870 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28880 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 20  Result code */. 
28890 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a   unixInodeInfo *
288a0 70 49 6e 6f 64 65 3b 20 20 20 20 20 20 20 20 20  pInode;         
288b0 20 2f 2a 20 54 68 65 20 69 6e 6f 64 65 20 6f 66   /* The inode of
288c0 20 66 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a   fd */.  char *z
288d0 53 68 6d 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20  ShmFilename;    
288e0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
288f0 20 6f 66 20 74 68 65 20 66 69 6c 65 20 75 73 65   of the file use
28900 64 20 66 6f 72 20 53 48 4d 20 2a 2f 0a 20 20 69  d for SHM */.  i
28910 6e 74 20 6e 53 68 6d 46 69 6c 65 6e 61 6d 65 3b  nt nShmFilename;
28920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28930 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 53 48  * Size of the SH
28940 4d 20 66 69 6c 65 6e 61 6d 65 20 69 6e 20 62 79  M filename in by
28950 74 65 73 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c  tes */..  /* All
28960 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20  ocate space for 
28970 74 68 65 20 6e 65 77 20 75 6e 69 78 53 68 6d 20  the new unixShm 
28980 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20 20 70 20 3d  object. */.  p =
28990 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36   sqlite3_malloc6
289a0 34 28 20 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b  4( sizeof(*p) );
289b0 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
289c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
289d0 4d 3b 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30  M;.  memset(p, 0
289e0 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20  , sizeof(*p));. 
289f0 20 61 73 73 65 72 74 28 20 70 44 62 46 64 2d 3e   assert( pDbFd->
28a00 70 53 68 6d 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a  pShm==0 );..  /*
28a10 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
28a20 20 61 20 75 6e 69 78 53 68 6d 4e 6f 64 65 20 6f   a unixShmNode o
28a30 62 6a 65 63 74 20 61 6c 72 65 61 64 79 20 65 78  bject already ex
28a40 69 73 74 73 2e 20 52 65 75 73 65 20 61 6e 20 65  ists. Reuse an e
28a50 78 69 73 74 69 6e 67 0a 20 20 2a 2a 20 6f 6e 65  xisting.  ** one
28a60 20 69 66 20 70 72 65 73 65 6e 74 2e 20 43 72 65   if present. Cre
28a70 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 20 69 66  ate a new one if
28a80 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f   necessary..  */
28a90 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  .  unixEnterMute
28aa0 78 28 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20  x();.  pInode = 
28ab0 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 3b 0a 20  pDbFd->pInode;. 
28ac0 20 70 53 68 6d 4e 6f 64 65 20 3d 20 70 49 6e 6f   pShmNode = pIno
28ad0 64 65 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20 20  de->pShmNode;.  
28ae0 69 66 28 20 70 53 68 6d 4e 6f 64 65 3d 3d 30 20  if( pShmNode==0 
28af0 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 73 74  ){.    struct st
28b00 61 74 20 73 53 74 61 74 3b 20 20 20 20 20 20 20  at sStat;       
28b10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 73 74            /* fst
28b20 61 74 28 29 20 69 6e 66 6f 20 66 6f 72 20 64 61  at() info for da
28b30 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 23  tabase file */.#
28b40 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 53 48  ifndef SQLITE_SH
28b50 4d 5f 44 49 52 45 43 54 4f 52 59 0a 20 20 20 20  M_DIRECTORY.    
28b60 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 42 61 73  const char *zBas
28b70 65 50 61 74 68 20 3d 20 70 44 62 46 64 2d 3e 7a  ePath = pDbFd->z
28b80 50 61 74 68 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  Path;.#endif..  
28b90 20 20 2f 2a 20 43 61 6c 6c 20 66 73 74 61 74 28    /* Call fstat(
28ba0 29 20 74 6f 20 66 69 67 75 72 65 20 6f 75 74 20  ) to figure out 
28bb0 74 68 65 20 70 65 72 6d 69 73 73 69 6f 6e 73 20  the permissions 
28bc0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
28bd0 66 69 6c 65 2e 20 49 66 0a 20 20 20 20 2a 2a 20  file. If.    ** 
28be0 61 20 6e 65 77 20 2a 2d 73 68 6d 20 66 69 6c 65  a new *-shm file
28bf0 20 69 73 20 63 72 65 61 74 65 64 2c 20 61 6e 20   is created, an 
28c00 61 74 74 65 6d 70 74 20 77 69 6c 6c 20 62 65 20  attempt will be 
28c10 6d 61 64 65 20 74 6f 20 63 72 65 61 74 65 20 69  made to create i
28c20 74 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 74 68  t.    ** with th
28c30 65 20 73 61 6d 65 20 70 65 72 6d 69 73 73 69 6f  e same permissio
28c40 6e 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ns..    */.    i
28c50 66 28 20 6f 73 46 73 74 61 74 28 70 44 62 46 64  f( osFstat(pDbFd
28c60 2d 3e 68 2c 20 26 73 53 74 61 74 29 20 26 26 20  ->h, &sStat) && 
28c70 70 49 6e 6f 64 65 2d 3e 62 50 72 6f 63 65 73 73  pInode->bProcess
28c80 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Lock==0 ){.     
28c90 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28   storeLastErrno(
28ca0 70 44 62 46 64 2c 20 65 72 72 6e 6f 29 3b 0a 20  pDbFd, errno);. 
28cb0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
28cc0 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a 20 20  _IOERR_FSTAT;.  
28cd0 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65      goto shm_ope
28ce0 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 23 69  n_err;.    }..#i
28cf0 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
28d00 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45  E__) && SQLITE_E
28d10 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
28d20 59 4c 45 20 5c 0a 20 20 20 20 20 20 26 26 20 21  YLE \.      && !
28d30 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 53  defined(SQLITE_S
28d40 48 4d 5f 44 49 52 45 43 54 4f 52 59 29 0a 20 20  HM_DIRECTORY).  
28d50 20 20 2f 2a 20 49 66 20 70 44 62 46 64 20 69 73    /* If pDbFd is
28d60 20 63 6f 6e 66 69 67 75 72 65 64 20 77 69 74 68   configured with
28d70 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 6d   proxy locking m
28d80 6f 64 65 2c 20 75 73 65 20 74 68 65 20 6c 6f 63  ode, use the loc
28d90 61 6c 20 0a 20 20 20 20 2a 2a 20 6c 6f 63 6b 20  al .    ** lock 
28da0 66 69 6c 65 20 70 61 74 68 20 74 6f 20 64 65 74  file path to det
28db0 65 72 6d 69 6e 65 20 74 68 65 20 2d 73 68 6d 20  ermine the -shm 
28dc0 66 69 6c 65 20 70 61 74 68 0a 20 20 20 20 2a 2f  file path.    */
28dd0 0a 20 20 20 20 69 66 28 20 69 73 50 72 6f 78 79  .    if( isProxy
28de0 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28 70 44 62 46  LockingMode(pDbF
28df0 64 29 20 29 7b 0a 20 20 20 20 20 20 7a 42 61 73  d) ){.      zBas
28e00 65 50 61 74 68 20 3d 20 70 72 6f 78 79 53 68 61  ePath = proxySha
28e10 72 65 64 4d 65 6d 6f 72 79 42 61 73 65 50 61 74  redMemoryBasePat
28e20 68 28 70 44 62 46 64 29 3b 0a 20 20 20 20 20 20  h(pDbFd);.      
28e30 69 66 28 20 21 7a 42 61 73 65 50 61 74 68 20 29  if( !zBasePath )
28e40 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
28e50 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42  QLITE_CANTOPEN_B
28e60 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  KPT;.        got
28e70 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a  o shm_open_err;.
28e80 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65        }.    }.#e
28e90 6e 64 69 66 0a 20 20 20 20 0a 23 69 66 64 65 66  ndif.    .#ifdef
28ea0 20 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45   SQLITE_SHM_DIRE
28eb0 43 54 4f 52 59 0a 20 20 20 20 6e 53 68 6d 46 69  CTORY.    nShmFi
28ec0 6c 65 6e 61 6d 65 20 3d 20 73 69 7a 65 6f 66 28  lename = sizeof(
28ed0 53 51 4c 49 54 45 5f 53 48 4d 5f 44 49 52 45 43  SQLITE_SHM_DIREC
28ee0 54 4f 52 59 29 20 2b 20 33 31 3b 0a 23 65 6c 73  TORY) + 31;.#els
28ef0 65 0a 20 20 20 20 6e 53 68 6d 46 69 6c 65 6e 61  e.    nShmFilena
28f00 6d 65 20 3d 20 36 20 2b 20 28 69 6e 74 29 73 74  me = 6 + (int)st
28f10 72 6c 65 6e 28 7a 42 61 73 65 50 61 74 68 29 3b  rlen(zBasePath);
28f20 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 53 68 6d  .#endif.    pShm
28f30 4e 6f 64 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d  Node = sqlite3_m
28f40 61 6c 6c 6f 63 36 34 28 20 73 69 7a 65 6f 66 28  alloc64( sizeof(
28f50 2a 70 53 68 6d 4e 6f 64 65 29 20 2b 20 6e 53 68  *pShmNode) + nSh
28f60 6d 46 69 6c 65 6e 61 6d 65 20 29 3b 0a 20 20 20  mFilename );.   
28f70 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 3d 3d 30   if( pShmNode==0
28f80 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
28f90 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
28fa0 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e     goto shm_open
28fb0 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _err;.    }.    
28fc0 6d 65 6d 73 65 74 28 70 53 68 6d 4e 6f 64 65 2c  memset(pShmNode,
28fd0 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 53 68 6d   0, sizeof(*pShm
28fe0 4e 6f 64 65 29 2b 6e 53 68 6d 46 69 6c 65 6e 61  Node)+nShmFilena
28ff0 6d 65 29 3b 0a 20 20 20 20 7a 53 68 6d 46 69 6c  me);.    zShmFil
29000 65 6e 61 6d 65 20 3d 20 70 53 68 6d 4e 6f 64 65  ename = pShmNode
29010 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 28 63  ->zFilename = (c
29020 68 61 72 2a 29 26 70 53 68 6d 4e 6f 64 65 5b 31  har*)&pShmNode[1
29030 5d 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ];.#ifdef SQLITE
29040 5f 53 48 4d 5f 44 49 52 45 43 54 4f 52 59 0a 20  _SHM_DIRECTORY. 
29050 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
29060 6e 74 66 28 6e 53 68 6d 46 69 6c 65 6e 61 6d 65  ntf(nShmFilename
29070 2c 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 2c 20  , zShmFilename, 
29080 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
29090 20 20 20 20 20 20 53 51 4c 49 54 45 5f 53 48 4d        SQLITE_SHM
290a0 5f 44 49 52 45 43 54 4f 52 59 20 22 2f 73 71 6c  _DIRECTORY "/sql
290b0 69 74 65 2d 73 68 6d 2d 25 78 2d 25 78 22 2c 0a  ite-shm-%x-%x",.
290c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
290d0 20 20 20 20 20 28 75 33 32 29 73 53 74 61 74 2e       (u32)sStat.
290e0 73 74 5f 69 6e 6f 2c 20 28 75 33 32 29 73 53 74  st_ino, (u32)sSt
290f0 61 74 2e 73 74 5f 64 65 76 29 3b 0a 23 65 6c 73  at.st_dev);.#els
29100 65 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  e.    sqlite3_sn
29110 70 72 69 6e 74 66 28 6e 53 68 6d 46 69 6c 65 6e  printf(nShmFilen
29120 61 6d 65 2c 20 7a 53 68 6d 46 69 6c 65 6e 61 6d  ame, zShmFilenam
29130 65 2c 20 22 25 73 2d 73 68 6d 22 2c 20 7a 42 61  e, "%s-shm", zBa
29140 73 65 50 61 74 68 29 3b 0a 20 20 20 20 73 71 6c  sePath);.    sql
29150 69 74 65 33 46 69 6c 65 53 75 66 66 69 78 33 28  ite3FileSuffix3(
29160 70 44 62 46 64 2d 3e 7a 50 61 74 68 2c 20 7a 53  pDbFd->zPath, zS
29170 68 6d 46 69 6c 65 6e 61 6d 65 29 3b 0a 23 65 6e  hmFilename);.#en
29180 64 69 66 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65  dif.    pShmNode
29190 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20 20 20 70 44  ->h = -1;.    pD
291a0 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68  bFd->pInode->pSh
291b0 6d 4e 6f 64 65 20 3d 20 70 53 68 6d 4e 6f 64 65  mNode = pShmNode
291c0 3b 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e  ;.    pShmNode->
291d0 70 49 6e 6f 64 65 20 3d 20 70 44 62 46 64 2d 3e  pInode = pDbFd->
291e0 70 49 6e 6f 64 65 3b 0a 20 20 20 20 70 53 68 6d  pInode;.    pShm
291f0 4e 6f 64 65 2d 3e 6d 75 74 65 78 20 3d 20 73 71  Node->mutex = sq
29200 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f  lite3_mutex_allo
29210 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46  c(SQLITE_MUTEX_F
29220 41 53 54 29 3b 0a 20 20 20 20 69 66 28 20 70 53  AST);.    if( pS
29230 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 3d 3d 30  hmNode->mutex==0
29240 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
29250 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
29260 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e     goto shm_open
29270 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  _err;.    }..   
29280 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 62 50 72   if( pInode->bPr
29290 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 7b 0a  ocessLock==0 ){.
292a0 20 20 20 20 20 20 69 6e 74 20 6f 70 65 6e 46 6c        int openFl
292b0 61 67 73 20 3d 20 4f 5f 52 44 57 52 20 7c 20 4f  ags = O_RDWR | O
292c0 5f 43 52 45 41 54 3b 0a 20 20 20 20 20 20 69 66  _CREAT;.      if
292d0 28 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f  ( sqlite3_uri_bo
292e0 6f 6c 65 61 6e 28 70 44 62 46 64 2d 3e 7a 50 61  olean(pDbFd->zPa
292f0 74 68 2c 20 22 72 65 61 64 6f 6e 6c 79 5f 73 68  th, "readonly_sh
29300 6d 22 2c 20 30 29 0a 23 69 66 20 64 65 66 69 6e  m", 0).#if defin
29310 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
29320 5f 50 45 52 53 49 53 54 5f 57 41 4c 29 26 26 28  _PERSIST_WAL)&&(
29330 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
29340 43 4b 49 4e 47 5f 53 54 59 4c 45 20 5c 0a 20 20  CKING_STYLE \.  
29350 20 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f 41    || defined(__A
29360 50 50 4c 45 5f 5f 29 29 0a 20 20 20 20 20 20 20  PPLE__)).       
29370 20 20 7c 7c 20 28 70 44 62 46 64 2d 3e 6f 70 65    || (pDbFd->ope
29380 6e 46 6c 61 67 73 20 26 20 4f 5f 52 44 57 52 29  nFlags & O_RDWR)
29390 20 21 3d 20 4f 5f 52 44 57 52 0a 23 65 6e 64 69   != O_RDWR.#endi
293a0 66 0a 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20  f.         ){.  
293b0 20 20 20 20 20 20 6f 70 65 6e 46 6c 61 67 73 20        openFlags 
293c0 3d 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20 20 20 20  = O_RDONLY;.    
293d0 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 69 73      pShmNode->is
293e0 52 65 61 64 6f 6e 6c 79 20 3d 20 31 3b 0a 20 20  Readonly = 1;.  
293f0 20 20 20 20 7d 0a 20 20 20 20 20 20 70 53 68 6d      }.      pShm
29400 4e 6f 64 65 2d 3e 68 20 3d 20 72 6f 62 75 73 74  Node->h = robust
29410 5f 6f 70 65 6e 28 7a 53 68 6d 46 69 6c 65 6e 61  _open(zShmFilena
29420 6d 65 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20 28  me, openFlags, (
29430 73 53 74 61 74 2e 73 74 5f 6d 6f 64 65 26 30 37  sStat.st_mode&07
29440 37 37 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  77));.      if( 
29450 70 53 68 6d 4e 6f 64 65 2d 3e 68 3c 30 20 29 7b  pShmNode->h<0 ){
29460 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e  .        rc = un
29470 69 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54  ixLogError(SQLIT
29480 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 2c  E_CANTOPEN_BKPT,
29490 20 22 6f 70 65 6e 22 2c 20 7a 53 68 6d 46 69 6c   "open", zShmFil
294a0 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  ename);.        
294b0 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72  goto shm_open_er
294c0 72 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  r;.      }..    
294d0 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65    /* Check to se
294e0 65 20 69 66 20 61 6e 6f 74 68 65 72 20 70 72 6f  e if another pro
294f0 63 65 73 73 20 69 73 20 68 6f 6c 64 69 6e 67 20  cess is holding 
29500 74 68 65 20 64 65 61 64 2d 6d 61 6e 20 73 77 69  the dead-man swi
29510 74 63 68 2e 0a 20 20 20 20 20 20 2a 2a 20 49 66  tch..      ** If
29520 20 6e 6f 74 2c 20 74 72 75 6e 63 61 74 65 20 74   not, truncate t
29530 68 65 20 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20  he file to zero 
29540 6c 65 6e 67 74 68 2e 20 0a 20 20 20 20 20 20 2a  length. .      *
29550 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  /.      rc = SQL
29560 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 69 66  ITE_OK;.      if
29570 28 20 75 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c  ( unixShmSystemL
29580 6f 63 6b 28 70 44 62 46 64 2c 20 46 5f 57 52 4c  ock(pDbFd, F_WRL
29590 43 4b 2c 20 55 4e 49 58 5f 53 48 4d 5f 44 4d 53  CK, UNIX_SHM_DMS
295a0 2c 20 31 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  , 1)==SQLITE_OK 
295b0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  ){.        if( r
295c0 6f 62 75 73 74 5f 66 74 72 75 6e 63 61 74 65 28  obust_ftruncate(
295d0 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20 30 29 20  pShmNode->h, 0) 
295e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
295f0 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28 53  = unixLogError(S
29600 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4f  QLITE_IOERR_SHMO
29610 50 45 4e 2c 20 22 66 74 72 75 6e 63 61 74 65 22  PEN, "ftruncate"
29620 2c 20 7a 53 68 6d 46 69 6c 65 6e 61 6d 65 29 3b  , zShmFilename);
29630 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
29640 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
29650 72 75 6e 6e 69 6e 67 20 61 73 20 72 6f 6f 74 20  running as root 
29660 73 65 74 20 74 68 65 20 75 69 64 2f 67 69 64 20  set the uid/gid 
29670 6f 66 20 74 68 65 20 73 68 6d 20 66 69 6c 65 20  of the shm file 
29680 74 6f 20 6d 61 74 63 68 0a 20 20 20 20 20 20 20  to match.       
29690 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61     ** the databa
296a0 73 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  se */.          
296b0 75 69 64 5f 74 20 65 75 69 64 20 3d 20 67 65 74  uid_t euid = get
296c0 65 75 69 64 28 29 3b 0a 20 20 20 20 20 20 20 20  euid();.        
296d0 20 20 69 66 28 20 28 21 70 53 68 6d 4e 6f 64 65    if( (!pShmNode
296e0 2d 3e 69 73 52 65 61 64 6f 6e 6c 79 29 20 26 26  ->isReadonly) &&
296f0 20 65 75 69 64 3d 3d 30 20 26 26 20 28 65 75 69   euid==0 && (eui
29700 64 21 3d 73 53 74 61 74 2e 73 74 5f 75 69 64 20  d!=sStat.st_uid 
29710 7c 7c 20 67 65 74 65 67 69 64 28 29 21 3d 73 53  || getegid()!=sS
29720 74 61 74 2e 73 74 5f 67 69 64 29 20 29 7b 0a 20  tat.st_gid) ){. 
29730 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6f             if( o
29740 73 46 63 68 6f 77 6e 28 70 53 68 6d 4e 6f 64 65  sFchown(pShmNode
29750 2d 3e 68 2c 20 73 53 74 61 74 2e 73 74 5f 75 69  ->h, sStat.st_ui
29760 64 2c 20 73 53 74 61 74 2e 73 74 5f 67 69 64 29  d, sStat.st_gid)
29770 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
29780 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
29790 45 52 52 5f 53 48 4d 4f 50 45 4e 3b 0a 20 20 20  ERR_SHMOPEN;.   
297a0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
297b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
297c0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
297d0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
297e0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
297f0 20 75 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f   unixShmSystemLo
29800 63 6b 28 70 44 62 46 64 2c 20 46 5f 52 44 4c 43  ck(pDbFd, F_RDLC
29810 4b 2c 20 55 4e 49 58 5f 53 48 4d 5f 44 4d 53 2c  K, UNIX_SHM_DMS,
29820 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   1);.      }.   
29830 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
29840 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a 20   shm_open_err;. 
29850 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d     }.  }..  /* M
29860 61 6b 65 20 74 68 65 20 6e 65 77 20 63 6f 6e 6e  ake the new conn
29870 65 63 74 69 6f 6e 20 61 20 63 68 69 6c 64 20 6f  ection a child o
29880 66 20 74 68 65 20 75 6e 69 78 53 68 6d 4e 6f 64  f the unixShmNod
29890 65 20 2a 2f 0a 20 20 70 2d 3e 70 53 68 6d 4e 6f  e */.  p->pShmNo
298a0 64 65 20 3d 20 70 53 68 6d 4e 6f 64 65 3b 0a 23  de = pShmNode;.#
298b0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
298c0 55 47 0a 20 20 70 2d 3e 69 64 20 3d 20 70 53 68  UG.  p->id = pSh
298d0 6d 4e 6f 64 65 2d 3e 6e 65 78 74 53 68 6d 49 64  mNode->nextShmId
298e0 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 70 53 68  ++;.#endif.  pSh
298f0 6d 4e 6f 64 65 2d 3e 6e 52 65 66 2b 2b 3b 0a 20  mNode->nRef++;. 
29900 20 70 44 62 46 64 2d 3e 70 53 68 6d 20 3d 20 70   pDbFd->pShm = p
29910 3b 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74  ;.  unixLeaveMut
29920 65 78 28 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  ex();..  /* The 
29930 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
29940 6f 6e 20 70 53 68 6d 4e 6f 64 65 20 68 61 73 20  on pShmNode has 
29950 61 6c 72 65 61 64 79 20 62 65 65 6e 20 69 6e 63  already been inc
29960 72 65 6d 65 6e 74 65 64 20 75 6e 64 65 72 0a 20  remented under. 
29970 20 2a 2a 20 74 68 65 20 63 6f 76 65 72 20 6f 66   ** the cover of
29980 20 74 68 65 20 75 6e 69 78 45 6e 74 65 72 4d 75   the unixEnterMu
29990 74 65 78 28 29 20 6d 75 74 65 78 20 61 6e 64 20  tex() mutex and 
299a0 74 68 65 20 70 6f 69 6e 74 65 72 20 66 72 6f 6d  the pointer from
299b0 20 74 68 65 0a 20 20 2a 2a 20 6e 65 77 20 28 73   the.  ** new (s
299c0 74 72 75 63 74 20 75 6e 69 78 53 68 6d 29 20 6f  truct unixShm) o
299d0 62 6a 65 63 74 20 74 6f 20 74 68 65 20 70 53 68  bject to the pSh
299e0 6d 4e 6f 64 65 20 68 61 73 20 62 65 65 6e 20 73  mNode has been s
299f0 65 74 2e 20 41 6c 6c 20 74 68 61 74 20 69 73 0a  et. All that is.
29a00 20 20 2a 2a 20 6c 65 66 74 20 74 6f 20 64 6f 20    ** left to do 
29a10 69 73 20 74 6f 20 6c 69 6e 6b 20 74 68 65 20 6e  is to link the n
29a20 65 77 20 6f 62 6a 65 63 74 20 69 6e 74 6f 20 74  ew object into t
29a30 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73  he linked list s
29a40 74 61 72 74 69 6e 67 0a 20 20 2a 2a 20 61 74 20  tarting.  ** at 
29a50 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74  pShmNode->pFirst
29a60 2e 20 54 68 69 73 20 6d 75 73 74 20 62 65 20 64  . This must be d
29a70 6f 6e 65 20 77 68 69 6c 65 20 68 6f 6c 64 69 6e  one while holdin
29a80 67 20 74 68 65 20 70 53 68 6d 4e 6f 64 65 2d 3e  g the pShmNode->
29a90 6d 75 74 65 78 20 0a 20 20 2a 2a 20 6d 75 74 65  mutex .  ** mute
29aa0 78 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  x..  */.  sqlite
29ab0 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 53  3_mutex_enter(pS
29ac0 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a  hmNode->mutex);.
29ad0 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 68    p->pNext = pSh
29ae0 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 0a 20  mNode->pFirst;. 
29af0 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73   pShmNode->pFirs
29b00 74 20 3d 20 70 3b 0a 20 20 73 71 6c 69 74 65 33  t = p;.  sqlite3
29b10 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68  _mutex_leave(pSh
29b20 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20  mNode->mutex);. 
29b30 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
29b40 4b 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20 68 65  K;..  /* Jump he
29b50 72 65 20 6f 6e 20 61 6e 79 20 65 72 72 6f 72 20  re on any error 
29b60 2a 2f 0a 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3a  */.shm_open_err:
29b70 0a 20 20 75 6e 69 78 53 68 6d 50 75 72 67 65 28  .  unixShmPurge(
29b80 70 44 62 46 64 29 3b 20 20 20 20 20 20 20 2f 2a  pDbFd);       /*
29b90 20 54 68 69 73 20 63 61 6c 6c 20 66 72 65 65 73   This call frees
29ba0 20 70 53 68 6d 4e 6f 64 65 20 69 66 20 72 65 71   pShmNode if req
29bb0 75 69 72 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74  uired */.  sqlit
29bc0 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 75 6e  e3_free(p);.  un
29bd0 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a  ixLeaveMutex();.
29be0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
29bf0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
29c00 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ion is called to
29c10 20 6f 62 74 61 69 6e 20 61 20 70 6f 69 6e 74 65   obtain a pointe
29c20 72 20 74 6f 20 72 65 67 69 6f 6e 20 69 52 65 67  r to region iReg
29c30 69 6f 6e 20 6f 66 20 74 68 65 20 0a 2a 2a 20 73  ion of the .** s
29c40 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 61 73 73  hared-memory ass
29c50 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
29c60 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66   database file f
29c70 64 2e 20 53 68 61 72 65 64 2d 6d 65 6d 6f 72 79  d. Shared-memory
29c80 20 72 65 67 69 6f 6e 73 20 0a 2a 2a 20 61 72 65   regions .** are
29c90 20 6e 75 6d 62 65 72 65 64 20 73 74 61 72 74 69   numbered starti
29ca0 6e 67 20 66 72 6f 6d 20 7a 65 72 6f 2e 20 45 61  ng from zero. Ea
29cb0 63 68 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  ch shared-memory
29cc0 20 72 65 67 69 6f 6e 20 69 73 20 73 7a 52 65 67   region is szReg
29cd0 69 6f 6e 20 0a 2a 2a 20 62 79 74 65 73 20 69 6e  ion .** bytes in
29ce0 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   size..**.** If 
29cf0 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
29d00 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
29d10 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a  s returned and *
29d20 70 70 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c  pp is set to NUL
29d30 4c 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  L..**.** Otherwi
29d40 73 65 2c 20 69 66 20 74 68 65 20 62 45 78 74 65  se, if the bExte
29d50 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  nd parameter is 
29d60 30 20 61 6e 64 20 74 68 65 20 72 65 71 75 65 73  0 and the reques
29d70 74 65 64 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  ted shared-memor
29d80 79 0a 2a 2a 20 72 65 67 69 6f 6e 20 68 61 73 20  y.** region has 
29d90 6e 6f 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  not been allocat
29da0 65 64 20 28 62 79 20 61 6e 79 20 63 6c 69 65 6e  ed (by any clien
29db0 74 2c 20 69 6e 63 6c 75 64 69 6e 67 20 6f 6e 65  t, including one
29dc0 20 72 75 6e 6e 69 6e 67 20 69 6e 20 61 0a 2a 2a   running in a.**
29dd0 20 73 65 70 61 72 61 74 65 20 70 72 6f 63 65 73   separate proces
29de0 73 29 2c 20 74 68 65 6e 20 2a 70 70 20 69 73 20  s), then *pp is 
29df0 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20  set to NULL and 
29e00 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
29e10 65 64 2e 20 49 66 20 0a 2a 2a 20 62 45 78 74 65  ed. If .** bExte
29e20 6e 64 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 61  nd is non-zero a
29e30 6e 64 20 74 68 65 20 72 65 71 75 65 73 74 65 64  nd the requested
29e40 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 72   shared-memory r
29e50 65 67 69 6f 6e 20 68 61 73 20 6e 6f 74 20 79 65  egion has not ye
29e60 74 20 0a 2a 2a 20 62 65 65 6e 20 61 6c 6c 6f 63  t .** been alloc
29e70 61 74 65 64 2c 20 69 74 20 69 73 20 61 6c 6c 6f  ated, it is allo
29e80 63 61 74 65 64 20 62 79 20 74 68 69 73 20 66 75  cated by this fu
29e90 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66  nction..**.** If
29ea0 20 74 68 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f   the shared-memo
29eb0 72 79 20 72 65 67 69 6f 6e 20 68 61 73 20 61 6c  ry region has al
29ec0 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63  ready been alloc
29ed0 61 74 65 64 20 6f 72 20 69 73 20 61 6c 6c 6f 63  ated or is alloc
29ee0 61 74 65 64 20 62 79 0a 2a 2a 20 74 68 69 73 20  ated by.** this 
29ef0 63 61 6c 6c 20 61 73 20 64 65 73 63 72 69 62 65  call as describe
29f00 64 20 61 62 6f 76 65 2c 20 74 68 65 6e 20 69 74  d above, then it
29f10 20 69 73 20 6d 61 70 70 65 64 20 69 6e 74 6f 20   is mapped into 
29f20 74 68 69 73 20 70 72 6f 63 65 73 73 65 73 20 0a  this processes .
29f30 2a 2a 20 61 64 64 72 65 73 73 20 73 70 61 63 65  ** address space
29f40 20 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61   (if it is not a
29f50 6c 72 65 61 64 79 29 2c 20 2a 70 70 20 69 73 20  lready), *pp is 
29f60 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  set to point to 
29f70 74 68 65 20 6d 61 70 70 65 64 20 0a 2a 2a 20 6d  the mapped .** m
29f80 65 6d 6f 72 79 20 61 6e 64 20 53 51 4c 49 54 45  emory and SQLITE
29f90 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f  _OK returned..*/
29fa0 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
29fb0 53 68 6d 4d 61 70 28 0a 20 20 73 71 6c 69 74 65  ShmMap(.  sqlite
29fc0 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20 20 20  3_file *fd,     
29fd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e            /* Han
29fe0 64 6c 65 20 6f 70 65 6e 20 6f 6e 20 64 61 74 61  dle open on data
29ff0 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69  base file */.  i
2a000 6e 74 20 69 52 65 67 69 6f 6e 2c 20 20 20 20 20  nt iRegion,     
2a010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a020 2a 20 52 65 67 69 6f 6e 20 74 6f 20 72 65 74 72  * Region to retr
2a030 69 65 76 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a  ieve */.  int sz
2a040 52 65 67 69 6f 6e 2c 20 20 20 20 20 20 20 20 20  Region,         
2a050 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
2a060 65 20 6f 66 20 72 65 67 69 6f 6e 73 20 2a 2f 0a  e of regions */.
2a070 20 20 69 6e 74 20 62 45 78 74 65 6e 64 2c 20 20    int bExtend,  
2a080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a090 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 78 74    /* True to ext
2a0a0 65 6e 64 20 66 69 6c 65 20 69 66 20 6e 65 63 65  end file if nece
2a0b0 73 73 61 72 79 20 2a 2f 0a 20 20 76 6f 69 64 20  ssary */.  void 
2a0c0 76 6f 6c 61 74 69 6c 65 20 2a 2a 70 70 20 20 20  volatile **pp   
2a0d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
2a0e0 54 3a 20 4d 61 70 70 65 64 20 6d 65 6d 6f 72 79  T: Mapped memory
2a0f0 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c   */.){.  unixFil
2a100 65 20 2a 70 44 62 46 64 20 3d 20 28 75 6e 69 78  e *pDbFd = (unix
2a110 46 69 6c 65 2a 29 66 64 3b 0a 20 20 75 6e 69 78  File*)fd;.  unix
2a120 53 68 6d 20 2a 70 3b 0a 20 20 75 6e 69 78 53 68  Shm *p;.  unixSh
2a130 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 3b  mNode *pShmNode;
2a140 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
2a150 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 53 68  TE_OK;.  int nSh
2a160 6d 50 65 72 4d 61 70 20 3d 20 75 6e 69 78 53 68  mPerMap = unixSh
2a170 6d 52 65 67 69 6f 6e 50 65 72 4d 61 70 28 29 3b  mRegionPerMap();
2a180 0a 20 20 69 6e 74 20 6e 52 65 71 52 65 67 69 6f  .  int nReqRegio
2a190 6e 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  n;..  /* If the 
2a1a0 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69  shared-memory fi
2a1b0 6c 65 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62  le has not yet b
2a1c0 65 65 6e 20 6f 70 65 6e 65 64 2c 20 6f 70 65 6e  een opened, open
2a1d0 20 69 74 20 6e 6f 77 2e 20 2a 2f 0a 20 20 69 66   it now. */.  if
2a1e0 28 20 70 44 62 46 64 2d 3e 70 53 68 6d 3d 3d 30  ( pDbFd->pShm==0
2a1f0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 75 6e 69   ){.    rc = uni
2a200 78 4f 70 65 6e 53 68 61 72 65 64 4d 65 6d 6f 72  xOpenSharedMemor
2a210 79 28 70 44 62 46 64 29 3b 0a 20 20 20 20 69 66  y(pDbFd);.    if
2a220 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2a230 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d  ) return rc;.  }
2a240 0a 0a 20 20 70 20 3d 20 70 44 62 46 64 2d 3e 70  ..  p = pDbFd->p
2a250 53 68 6d 3b 0a 20 20 70 53 68 6d 4e 6f 64 65 20  Shm;.  pShmNode 
2a260 3d 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20  = p->pShmNode;. 
2a270 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
2a280 6e 74 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d  nter(pShmNode->m
2a290 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28  utex);.  assert(
2a2a0 20 73 7a 52 65 67 69 6f 6e 3d 3d 70 53 68 6d 4e   szRegion==pShmN
2a2b0 6f 64 65 2d 3e 73 7a 52 65 67 69 6f 6e 20 7c 7c  ode->szRegion ||
2a2c0 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69   pShmNode->nRegi
2a2d0 6f 6e 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  on==0 );.  asser
2a2e0 74 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e  t( pShmNode->pIn
2a2f0 6f 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f  ode==pDbFd->pIno
2a300 64 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  de );.  assert( 
2a310 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 7c  pShmNode->h>=0 |
2a320 7c 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d  | pDbFd->pInode-
2a330 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 31  >bProcessLock==1
2a340 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53   );.  assert( pS
2a350 68 6d 4e 6f 64 65 2d 3e 68 3c 30 20 7c 7c 20 70  hmNode->h<0 || p
2a360 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 62 50  DbFd->pInode->bP
2a370 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20 29 3b  rocessLock==0 );
2a380 0a 0a 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 6e  ..  /* Minimum n
2a390 75 6d 62 65 72 20 6f 66 20 72 65 67 69 6f 6e 73  umber of regions
2a3a0 20 72 65 71 75 69 72 65 64 20 74 6f 20 62 65 20   required to be 
2a3b0 6d 61 70 70 65 64 2e 20 2a 2f 0a 20 20 6e 52 65  mapped. */.  nRe
2a3c0 71 52 65 67 69 6f 6e 20 3d 20 28 28 69 52 65 67  qRegion = ((iReg
2a3d0 69 6f 6e 2b 6e 53 68 6d 50 65 72 4d 61 70 29 20  ion+nShmPerMap) 
2a3e0 2f 20 6e 53 68 6d 50 65 72 4d 61 70 29 20 2a 20  / nShmPerMap) * 
2a3f0 6e 53 68 6d 50 65 72 4d 61 70 3b 0a 0a 20 20 69  nShmPerMap;..  i
2a400 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65  f( pShmNode->nRe
2a410 67 69 6f 6e 3c 6e 52 65 71 52 65 67 69 6f 6e 20  gion<nReqRegion 
2a420 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 2a 61 70  ){.    char **ap
2a430 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20  New;            
2a440 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77            /* New
2a450 20 61 70 52 65 67 69 6f 6e 5b 5d 20 61 72 72 61   apRegion[] arra
2a460 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42 79  y */.    int nBy
2a470 74 65 20 3d 20 6e 52 65 71 52 65 67 69 6f 6e 2a  te = nReqRegion*
2a480 73 7a 52 65 67 69 6f 6e 3b 20 20 20 2f 2a 20 4d  szRegion;   /* M
2a490 69 6e 69 6d 75 6d 20 72 65 71 75 69 72 65 64 20  inimum required 
2a4a0 66 69 6c 65 20 73 69 7a 65 20 2a 2f 0a 20 20 20  file size */.   
2a4b0 20 73 74 72 75 63 74 20 73 74 61 74 20 73 53 74   struct stat sSt
2a4c0 61 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  at;             
2a4d0 20 20 20 20 2f 2a 20 55 73 65 64 20 62 79 20 66      /* Used by f
2a4e0 73 74 61 74 28 29 20 2a 2f 0a 0a 20 20 20 20 70  stat() */..    p
2a4f0 53 68 6d 4e 6f 64 65 2d 3e 73 7a 52 65 67 69 6f  ShmNode->szRegio
2a500 6e 20 3d 20 73 7a 52 65 67 69 6f 6e 3b 0a 0a 20  n = szRegion;.. 
2a510 20 20 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d     if( pShmNode-
2a520 3e 68 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  >h>=0 ){.      /
2a530 2a 20 54 68 65 20 72 65 71 75 65 73 74 65 64 20  * The requested 
2a540 72 65 67 69 6f 6e 20 69 73 20 6e 6f 74 20 6d 61  region is not ma
2a550 70 70 65 64 20 69 6e 74 6f 20 74 68 69 73 20 70  pped into this p
2a560 72 6f 63 65 73 73 65 73 20 61 64 64 72 65 73 73  rocesses address
2a570 20 73 70 61 63 65 2e 0a 20 20 20 20 20 20 2a 2a   space..      **
2a580 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
2a590 20 69 74 20 68 61 73 20 62 65 65 6e 20 61 6c 6c   it has been all
2a5a0 6f 63 61 74 65 64 20 28 69 2e 65 2e 20 69 66 20  ocated (i.e. if 
2a5b0 74 68 65 20 77 61 6c 2d 69 6e 64 65 78 20 66 69  the wal-index fi
2a5c0 6c 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 6c  le is.      ** l
2a5d0 61 72 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 63  arge enough to c
2a5e0 6f 6e 74 61 69 6e 20 74 68 65 20 72 65 71 75 65  ontain the reque
2a5f0 73 74 65 64 20 72 65 67 69 6f 6e 29 2e 0a 20 20  sted region)..  
2a600 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
2a610 20 6f 73 46 73 74 61 74 28 70 53 68 6d 4e 6f 64   osFstat(pShmNod
2a620 65 2d 3e 68 2c 20 26 73 53 74 61 74 29 20 29 7b  e->h, &sStat) ){
2a630 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
2a640 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49  LITE_IOERR_SHMSI
2a650 5a 45 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  ZE;.        goto
2a660 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20   shmpage_out;.  
2a670 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 69      }.  .      i
2a680 66 28 20 73 53 74 61 74 2e 73 74 5f 73 69 7a 65  f( sStat.st_size
2a690 3c 6e 42 79 74 65 20 29 7b 0a 20 20 20 20 20 20  <nByte ){.      
2a6a0 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74    /* The request
2a6b0 65 64 20 6d 65 6d 6f 72 79 20 72 65 67 69 6f 6e  ed memory region
2a6c0 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e   does not exist.
2a6d0 20 49 66 20 62 45 78 74 65 6e 64 20 69 73 20 73   If bExtend is s
2a6e0 65 74 20 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a  et to.        **
2a6f0 20 66 61 6c 73 65 2c 20 65 78 69 74 20 65 61 72   false, exit ear
2a700 6c 79 2e 20 2a 70 70 20 77 69 6c 6c 20 62 65 20  ly. *pp will be 
2a710 73 65 74 20 74 6f 20 4e 55 4c 4c 20 61 6e 64 20  set to NULL and 
2a720 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
2a730 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ed..        */. 
2a740 20 20 20 20 20 20 20 69 66 28 20 21 62 45 78 74         if( !bExt
2a750 65 6e 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20  end ){.         
2a760 20 67 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75   goto shmpage_ou
2a770 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  t;.        }..  
2a780 20 20 20 20 20 20 2f 2a 20 41 6c 74 65 72 6e 61        /* Alterna
2a790 74 69 76 65 6c 79 2c 20 69 66 20 62 45 78 74 65  tively, if bExte
2a7a0 6e 64 20 69 73 20 74 72 75 65 2c 20 65 78 74 65  nd is true, exte
2a7b0 6e 64 20 74 68 65 20 66 69 6c 65 2e 20 44 6f 20  nd the file. Do 
2a7c0 74 68 69 73 20 62 79 0a 20 20 20 20 20 20 20 20  this by.        
2a7d0 2a 2a 20 77 72 69 74 69 6e 67 20 61 20 73 69 6e  ** writing a sin
2a7e0 67 6c 65 20 62 79 74 65 20 74 6f 20 74 68 65 20  gle byte to the 
2a7f0 65 6e 64 20 6f 66 20 65 61 63 68 20 28 4f 53 29  end of each (OS)
2a800 20 70 61 67 65 20 62 65 69 6e 67 0a 20 20 20 20   page being.    
2a810 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64      ** allocated
2a820 20 6f 72 20 65 78 74 65 6e 64 65 64 2e 20 54 65   or extended. Te
2a830 63 68 6e 69 63 61 6c 6c 79 2c 20 77 65 20 6e 65  chnically, we ne
2a840 65 64 20 6f 6e 6c 79 20 77 72 69 74 65 20 74 6f  ed only write to
2a850 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
2a860 6c 61 73 74 20 70 61 67 65 20 69 6e 20 6f 72 64  last page in ord
2a870 65 72 20 74 6f 20 65 78 74 65 6e 64 20 74 68 65  er to extend the
2a880 20 66 69 6c 65 2e 20 42 75 74 20 77 72 69 74 69   file. But writi
2a890 6e 67 20 74 6f 20 61 6c 6c 20 6e 65 77 0a 20 20  ng to all new.  
2a8a0 20 20 20 20 20 20 2a 2a 20 70 61 67 65 73 20 66        ** pages f
2a8b0 6f 72 63 65 73 20 74 68 65 20 4f 53 20 74 6f 20  orces the OS to 
2a8c0 61 6c 6c 6f 63 61 74 65 20 74 68 65 6d 20 69 6d  allocate them im
2a8d0 6d 65 64 69 61 74 65 6c 79 2c 20 77 68 69 63 68  mediately, which
2a8e0 20 72 65 64 75 63 65 73 0a 20 20 20 20 20 20 20   reduces.       
2a8f0 20 2a 2a 20 74 68 65 20 63 68 61 6e 63 65 73 20   ** the chances 
2a900 6f 66 20 53 49 47 42 55 53 20 77 68 69 6c 65 20  of SIGBUS while 
2a910 61 63 63 65 73 73 69 6e 67 20 74 68 65 20 6d 61  accessing the ma
2a920 70 70 65 64 20 72 65 67 69 6f 6e 20 6c 61 74 65  pped region late
2a930 72 20 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2f  r on..        */
2a940 0a 20 20 20 20 20 20 20 20 65 6c 73 65 7b 0a 20  .        else{. 
2a950 20 20 20 20 20 20 20 20 20 73 74 61 74 69 63 20           static 
2a960 63 6f 6e 73 74 20 69 6e 74 20 70 67 73 7a 20 3d  const int pgsz =
2a970 20 34 30 39 36 3b 0a 20 20 20 20 20 20 20 20 20   4096;.         
2a980 20 69 6e 74 20 69 50 67 3b 0a 0a 20 20 20 20 20   int iPg;..     
2a990 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 6f       /* Write to
2a9a0 20 74 68 65 20 6c 61 73 74 20 62 79 74 65 20 6f   the last byte o
2a9b0 66 20 65 61 63 68 20 6e 65 77 6c 79 20 61 6c 6c  f each newly all
2a9c0 6f 63 61 74 65 64 20 6f 72 20 65 78 74 65 6e 64  ocated or extend
2a9d0 65 64 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20  ed page */.     
2a9e0 20 20 20 20 20 61 73 73 65 72 74 28 20 28 6e 42       assert( (nB
2a9f0 79 74 65 20 25 20 70 67 73 7a 29 3d 3d 30 20 29  yte % pgsz)==0 )
2aa00 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  ;.          for(
2aa10 69 50 67 3d 28 73 53 74 61 74 2e 73 74 5f 73 69  iPg=(sStat.st_si
2aa20 7a 65 2f 70 67 73 7a 29 3b 20 69 50 67 3c 28 6e  ze/pgsz); iPg<(n
2aa30 42 79 74 65 2f 70 67 73 7a 29 3b 20 69 50 67 2b  Byte/pgsz); iPg+
2aa40 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
2aa50 69 66 28 20 73 65 65 6b 41 6e 64 57 72 69 74 65  if( seekAndWrite
2aa60 46 64 28 70 53 68 6d 4e 6f 64 65 2d 3e 68 2c 20  Fd(pShmNode->h, 
2aa70 69 50 67 2a 70 67 73 7a 20 2b 20 70 67 73 7a 2d  iPg*pgsz + pgsz-
2aa80 31 2c 20 22 22 2c 20 31 2c 20 30 29 21 3d 31 20  1, "", 1, 0)!=1 
2aa90 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2aaa0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
2aab0 6c 65 20 3d 20 70 53 68 6d 4e 6f 64 65 2d 3e 7a  le = pShmNode->z
2aac0 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 20 20  Filename;.      
2aad0 20 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69          rc = uni
2aae0 78 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45  xLogError(SQLITE
2aaf0 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45 2c 20  _IOERR_SHMSIZE, 
2ab00 22 77 72 69 74 65 22 2c 20 7a 46 69 6c 65 29 3b  "write", zFile);
2ab10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 67  .              g
2ab20 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b  oto shmpage_out;
2ab30 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
2ab40 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2ab50 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
2ab60 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 70 20 74   }..    /* Map t
2ab70 68 65 20 72 65 71 75 65 73 74 65 64 20 6d 65 6d  he requested mem
2ab80 6f 72 79 20 72 65 67 69 6f 6e 20 69 6e 74 6f 20  ory region into 
2ab90 74 68 69 73 20 70 72 6f 63 65 73 73 65 73 20 61  this processes a
2aba0 64 64 72 65 73 73 20 73 70 61 63 65 2e 20 2a 2f  ddress space. */
2abb0 0a 20 20 20 20 61 70 4e 65 77 20 3d 20 28 63 68  .    apNew = (ch
2abc0 61 72 20 2a 2a 29 73 71 6c 69 74 65 33 5f 72 65  ar **)sqlite3_re
2abd0 61 6c 6c 6f 63 28 0a 20 20 20 20 20 20 20 20 70  alloc(.        p
2abe0 53 68 6d 4e 6f 64 65 2d 3e 61 70 52 65 67 69 6f  ShmNode->apRegio
2abf0 6e 2c 20 6e 52 65 71 52 65 67 69 6f 6e 2a 73 69  n, nReqRegion*si
2ac00 7a 65 6f 66 28 63 68 61 72 20 2a 29 0a 20 20 20  zeof(char *).   
2ac10 20 29 3b 0a 20 20 20 20 69 66 28 20 21 61 70 4e   );.    if( !apN
2ac20 65 77 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ew ){.      rc =
2ac30 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
2ac40 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  MEM;.      goto 
2ac50 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20  shmpage_out;.   
2ac60 20 7d 0a 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d   }.    pShmNode-
2ac70 3e 61 70 52 65 67 69 6f 6e 20 3d 20 61 70 4e 65  >apRegion = apNe
2ac80 77 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 53  w;.    while( pS
2ac90 68 6d 4e 6f 64 65 2d 3e 6e 52 65 67 69 6f 6e 3c  hmNode->nRegion<
2aca0 6e 52 65 71 52 65 67 69 6f 6e 20 29 7b 0a 20 20  nReqRegion ){.  
2acb0 20 20 20 20 69 6e 74 20 6e 4d 61 70 20 3d 20 73      int nMap = s
2acc0 7a 52 65 67 69 6f 6e 2a 6e 53 68 6d 50 65 72 4d  zRegion*nShmPerM
2acd0 61 70 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b  ap;.      int i;
2ace0 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70 4d 65  .      void *pMe
2acf0 6d 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 68  m;.      if( pSh
2ad00 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 29 7b 0a 20  mNode->h>=0 ){. 
2ad10 20 20 20 20 20 20 20 70 4d 65 6d 20 3d 20 6f 73         pMem = os
2ad20 4d 6d 61 70 28 30 2c 20 6e 4d 61 70 2c 0a 20 20  Mmap(0, nMap,.  
2ad30 20 20 20 20 20 20 20 20 20 20 70 53 68 6d 4e 6f            pShmNo
2ad40 64 65 2d 3e 69 73 52 65 61 64 6f 6e 6c 79 20 3f  de->isReadonly ?
2ad50 20 50 52 4f 54 5f 52 45 41 44 20 3a 20 50 52 4f   PROT_READ : PRO
2ad60 54 5f 52 45 41 44 7c 50 52 4f 54 5f 57 52 49 54  T_READ|PROT_WRIT
2ad70 45 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  E, .            
2ad80 4d 41 50 5f 53 48 41 52 45 44 2c 20 70 53 68 6d  MAP_SHARED, pShm
2ad90 4e 6f 64 65 2d 3e 68 2c 20 73 7a 52 65 67 69 6f  Node->h, szRegio
2ada0 6e 2a 28 69 36 34 29 70 53 68 6d 4e 6f 64 65 2d  n*(i64)pShmNode-
2adb0 3e 6e 52 65 67 69 6f 6e 0a 20 20 20 20 20 20 20  >nRegion.       
2adc0 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
2add0 70 4d 65 6d 3d 3d 4d 41 50 5f 46 41 49 4c 45 44  pMem==MAP_FAILED
2ade0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
2adf0 20 3d 20 75 6e 69 78 4c 6f 67 45 72 72 6f 72 28   = unixLogError(
2ae00 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d  SQLITE_IOERR_SHM
2ae10 4d 41 50 2c 20 22 6d 6d 61 70 22 2c 20 70 53 68  MAP, "mmap", pSh
2ae20 6d 4e 6f 64 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65  mNode->zFilename
2ae30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  );.          got
2ae40 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b 0a 20  o shmpage_out;. 
2ae50 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2ae60 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 4d  else{.        pM
2ae70 65 6d 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  em = sqlite3_mal
2ae80 6c 6f 63 36 34 28 73 7a 52 65 67 69 6f 6e 29 3b  loc64(szRegion);
2ae90 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4d 65  .        if( pMe
2aea0 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  m==0 ){.        
2aeb0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
2aec0 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 67  MEM;.          g
2aed0 6f 74 6f 20 73 68 6d 70 61 67 65 5f 6f 75 74 3b  oto shmpage_out;
2aee0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2aef0 20 20 20 6d 65 6d 73 65 74 28 70 4d 65 6d 2c 20     memset(pMem, 
2af00 30 2c 20 73 7a 52 65 67 69 6f 6e 29 3b 0a 20 20  0, szRegion);.  
2af10 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 66 6f 72      }..      for
2af20 28 69 3d 30 3b 20 69 3c 6e 53 68 6d 50 65 72 4d  (i=0; i<nShmPerM
2af30 61 70 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ap; i++){.      
2af40 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 61 70 52 65    pShmNode->apRe
2af50 67 69 6f 6e 5b 70 53 68 6d 4e 6f 64 65 2d 3e 6e  gion[pShmNode->n
2af60 52 65 67 69 6f 6e 2b 69 5d 20 3d 20 26 28 28 63  Region+i] = &((c
2af70 68 61 72 2a 29 70 4d 65 6d 29 5b 73 7a 52 65 67  har*)pMem)[szReg
2af80 69 6f 6e 2a 69 5d 3b 0a 20 20 20 20 20 20 7d 0a  ion*i];.      }.
2af90 20 20 20 20 20 20 70 53 68 6d 4e 6f 64 65 2d 3e        pShmNode->
2afa0 6e 52 65 67 69 6f 6e 20 2b 3d 20 6e 53 68 6d 50  nRegion += nShmP
2afb0 65 72 4d 61 70 3b 0a 20 20 20 20 7d 0a 20 20 7d  erMap;.    }.  }
2afc0 0a 0a 73 68 6d 70 61 67 65 5f 6f 75 74 3a 0a 20  ..shmpage_out:. 
2afd0 20 69 66 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e   if( pShmNode->n
2afe0 52 65 67 69 6f 6e 3e 69 52 65 67 69 6f 6e 20 29  Region>iRegion )
2aff0 7b 0a 20 20 20 20 2a 70 70 20 3d 20 70 53 68 6d  {.    *pp = pShm
2b000 4e 6f 64 65 2d 3e 61 70 52 65 67 69 6f 6e 5b 69  Node->apRegion[i
2b010 52 65 67 69 6f 6e 5d 3b 0a 20 20 7d 65 6c 73 65  Region];.  }else
2b020 7b 0a 20 20 20 20 2a 70 70 20 3d 20 30 3b 0a 20  {.    *pp = 0;. 
2b030 20 7d 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f 64   }.  if( pShmNod
2b040 65 2d 3e 69 73 52 65 61 64 6f 6e 6c 79 20 26 26  e->isReadonly &&
2b050 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2b060 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41   rc = SQLITE_REA
2b070 44 4f 4e 4c 59 3b 0a 20 20 73 71 6c 69 74 65 33  DONLY;.  sqlite3
2b080 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68  _mutex_leave(pSh
2b090 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 20  mNode->mutex);. 
2b0a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2b0b0 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
2b0c0 6c 6f 63 6b 20 73 74 61 74 65 20 66 6f 72 20 61  lock state for a
2b0d0 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 73   shared-memory s
2b0e0 65 67 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  egment..**.** No
2b0f0 74 65 20 74 68 61 74 20 74 68 65 20 72 65 6c 61  te that the rela
2b100 74 69 6f 6e 73 68 69 70 20 62 65 74 77 65 65 6e  tionship between
2b110 20 53 48 41 52 45 64 20 61 6e 64 20 45 58 43 4c   SHAREd and EXCL
2b120 55 53 49 56 45 20 6c 6f 63 6b 73 20 69 73 20 61  USIVE locks is a
2b130 20 6c 69 74 74 6c 65 0a 2a 2a 20 64 69 66 66 65   little.** diffe
2b140 72 65 6e 74 20 68 65 72 65 20 74 68 61 6e 20 69  rent here than i
2b150 6e 20 70 6f 73 69 78 2e 20 20 49 6e 20 78 53 68  n posix.  In xSh
2b160 6d 4c 6f 63 6b 28 29 2c 20 6f 6e 65 20 63 61 6e  mLock(), one can
2b170 20 67 6f 20 66 72 6f 6d 20 75 6e 6c 6f 63 6b 65   go from unlocke
2b180 64 0a 2a 2a 20 74 6f 20 73 68 61 72 65 64 20 61  d.** to shared a
2b190 6e 64 20 62 61 63 6b 20 6f 72 20 66 72 6f 6d 20  nd back or from 
2b1a0 75 6e 6c 6f 63 6b 65 64 20 74 6f 20 65 78 63 6c  unlocked to excl
2b1b0 75 73 69 76 65 20 61 6e 64 20 62 61 63 6b 2e 20  usive and back. 
2b1c0 20 42 75 74 20 6f 6e 65 20 6d 61 79 0a 2a 2a 20   But one may.** 
2b1d0 6e 6f 74 20 67 6f 20 66 72 6f 6d 20 73 68 61 72  not go from shar
2b1e0 65 64 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20  ed to exclusive 
2b1f0 6f 72 20 66 72 6f 6d 20 65 78 63 6c 75 73 69 76  or from exclusiv
2b200 65 20 74 6f 20 73 68 61 72 65 64 2e 0a 2a 2f 0a  e to shared..*/.
2b210 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53  static int unixS
2b220 68 6d 4c 6f 63 6b 28 0a 20 20 73 71 6c 69 74 65  hmLock(.  sqlite
2b230 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20 20 20  3_file *fd,     
2b240 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
2b250 20 66 69 6c 65 20 68 6f 6c 64 69 6e 67 20 74 68   file holding th
2b260 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20  e shared memory 
2b270 2a 2f 0a 20 20 69 6e 74 20 6f 66 73 74 2c 20 20  */.  int ofst,  
2b280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b290 2f 2a 20 46 69 72 73 74 20 6c 6f 63 6b 20 74 6f  /* First lock to
2b2a0 20 61 63 71 75 69 72 65 20 6f 72 20 72 65 6c 65   acquire or rele
2b2b0 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 2c 20  ase */.  int n, 
2b2c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b2d0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2b2e0 20 6c 6f 63 6b 73 20 74 6f 20 61 63 71 75 69 72   locks to acquir
2b2f0 65 20 6f 72 20 72 65 6c 65 61 73 65 20 2a 2f 0a  e or release */.
2b300 20 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20    int flags     
2b310 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2b320 57 68 61 74 20 74 6f 20 64 6f 20 77 69 74 68 20  What to do with 
2b330 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a 29 7b 0a 20  the lock */.){. 
2b340 20 75 6e 69 78 46 69 6c 65 20 2a 70 44 62 46 64   unixFile *pDbFd
2b350 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 66 64   = (unixFile*)fd
2b360 3b 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63  ;      /* Connec
2b370 74 69 6f 6e 20 68 6f 6c 64 69 6e 67 20 73 68 61  tion holding sha
2b380 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20  red memory */.  
2b390 75 6e 69 78 53 68 6d 20 2a 70 20 3d 20 70 44 62  unixShm *p = pDb
2b3a0 46 64 2d 3e 70 53 68 6d 3b 20 20 20 20 20 20 20  Fd->pShm;       
2b3b0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 68 61        /* The sha
2b3c0 72 65 64 20 6d 65 6d 6f 72 79 20 62 65 69 6e 67  red memory being
2b3d0 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 75 6e 69   locked */.  uni
2b3e0 78 53 68 6d 20 2a 70 58 3b 20 20 20 20 20 20 20  xShm *pX;       
2b3f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b400 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e     /* For loopin
2b410 67 20 6f 76 65 72 20 61 6c 6c 20 73 69 62 6c 69  g over all sibli
2b420 6e 67 73 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d  ngs */.  unixShm
2b430 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 20 3d  Node *pShmNode =
2b440 20 70 2d 3e 70 53 68 6d 4e 6f 64 65 3b 20 20 2f   p->pShmNode;  /
2b450 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67  * The underlying
2b460 20 66 69 6c 65 20 69 4e 6f 64 65 20 2a 2f 0a 20   file iNode */. 
2b470 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
2b480 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
2b490 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
2b4a0 20 63 6f 64 65 20 2a 2f 0a 20 20 75 31 36 20 6d   code */.  u16 m
2b4b0 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ask;            
2b4c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b4d0 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b   /* Mask of lock
2b4e0 73 20 74 6f 20 74 61 6b 65 20 6f 72 20 72 65 6c  s to take or rel
2b4f0 65 61 73 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72  ease */..  asser
2b500 74 28 20 70 53 68 6d 4e 6f 64 65 3d 3d 70 44 62  t( pShmNode==pDb
2b510 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d  Fd->pInode->pShm
2b520 4e 6f 64 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Node );.  assert
2b530 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f  ( pShmNode->pIno
2b540 64 65 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64  de==pDbFd->pInod
2b550 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f  e );.  assert( o
2b560 66 73 74 3e 3d 30 20 26 26 20 6f 66 73 74 2b 6e  fst>=0 && ofst+n
2b570 3c 3d 53 51 4c 49 54 45 5f 53 48 4d 5f 4e 4c 4f  <=SQLITE_SHM_NLO
2b580 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
2b590 6e 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74  n>=1 );.  assert
2b5a0 28 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54 45  ( flags==(SQLITE
2b5b0 5f 53 48 4d 5f 4c 4f 43 4b 20 7c 20 53 51 4c 49  _SHM_LOCK | SQLI
2b5c0 54 45 5f 53 48 4d 5f 53 48 41 52 45 44 29 0a 20  TE_SHM_SHARED). 
2b5d0 20 20 20 20 20 20 7c 7c 20 66 6c 61 67 73 3d 3d        || flags==
2b5e0 28 53 51 4c 49 54 45 5f 53 48 4d 5f 4c 4f 43 4b  (SQLITE_SHM_LOCK
2b5f0 20 7c 20 53 51 4c 49 54 45 5f 53 48 4d 5f 45 58   | SQLITE_SHM_EX
2b600 43 4c 55 53 49 56 45 29 0a 20 20 20 20 20 20 20  CLUSIVE).       
2b610 7c 7c 20 66 6c 61 67 73 3d 3d 28 53 51 4c 49 54  || flags==(SQLIT
2b620 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20 7c 20 53  E_SHM_UNLOCK | S
2b630 51 4c 49 54 45 5f 53 48 4d 5f 53 48 41 52 45 44  QLITE_SHM_SHARED
2b640 29 0a 20 20 20 20 20 20 20 7c 7c 20 66 6c 61 67  ).       || flag
2b650 73 3d 3d 28 53 51 4c 49 54 45 5f 53 48 4d 5f 55  s==(SQLITE_SHM_U
2b660 4e 4c 4f 43 4b 20 7c 20 53 51 4c 49 54 45 5f 53  NLOCK | SQLITE_S
2b670 48 4d 5f 45 58 43 4c 55 53 49 56 45 29 20 29 3b  HM_EXCLUSIVE) );
2b680 0a 20 20 61 73 73 65 72 74 28 20 6e 3d 3d 31 20  .  assert( n==1 
2b690 7c 7c 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49  || (flags & SQLI
2b6a0 54 45 5f 53 48 4d 5f 45 58 43 4c 55 53 49 56 45  TE_SHM_EXCLUSIVE
2b6b0 29 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  )!=0 );.  assert
2b6c0 28 20 70 53 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30  ( pShmNode->h>=0
2b6d0 20 7c 7c 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64   || pDbFd->pInod
2b6e0 65 2d 3e 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d  e->bProcessLock=
2b6f0 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =1 );.  assert( 
2b700 70 53 68 6d 4e 6f 64 65 2d 3e 68 3c 30 20 7c 7c  pShmNode->h<0 ||
2b710 20 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 2d 3e   pDbFd->pInode->
2b720 62 50 72 6f 63 65 73 73 4c 6f 63 6b 3d 3d 30 20  bProcessLock==0 
2b730 29 3b 0a 0a 20 20 6d 61 73 6b 20 3d 20 28 31 3c  );..  mask = (1<
2b740 3c 28 6f 66 73 74 2b 6e 29 29 20 2d 20 28 31 3c  <(ofst+n)) - (1<
2b750 3c 6f 66 73 74 29 3b 0a 20 20 61 73 73 65 72 74  <ofst);.  assert
2b760 28 20 6e 3e 31 20 7c 7c 20 6d 61 73 6b 3d 3d 28  ( n>1 || mask==(
2b770 31 3c 3c 6f 66 73 74 29 20 29 3b 0a 20 20 73 71  1<<ofst) );.  sq
2b780 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
2b790 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65  r(pShmNode->mute
2b7a0 78 29 3b 0a 20 20 69 66 28 20 66 6c 61 67 73 20  x);.  if( flags 
2b7b0 26 20 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c  & SQLITE_SHM_UNL
2b7c0 4f 43 4b 20 29 7b 0a 20 20 20 20 75 31 36 20 61  OCK ){.    u16 a
2b7d0 6c 6c 4d 61 73 6b 20 3d 20 30 3b 20 2f 2a 20 4d  llMask = 0; /* M
2b7e0 61 73 6b 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c  ask of locks hel
2b7f0 64 20 62 79 20 73 69 62 6c 69 6e 67 73 20 2a 2f  d by siblings */
2b800 0a 0a 20 20 20 20 2f 2a 20 53 65 65 20 69 66 20  ..    /* See if 
2b810 61 6e 79 20 73 69 62 6c 69 6e 67 73 20 68 6f 6c  any siblings hol
2b820 64 20 74 68 69 73 20 73 61 6d 65 20 6c 6f 63 6b  d this same lock
2b830 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d 70   */.    for(pX=p
2b840 53 68 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b  ShmNode->pFirst;
2b850 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78   pX; pX=pX->pNex
2b860 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 58  t){.      if( pX
2b870 3d 3d 70 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==p ) continue;.
2b880 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
2b890 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20 28 70  X->exclMask & (p
2b8a0 2d 3e 65 78 63 6c 4d 61 73 6b 7c 70 2d 3e 73 68  ->exclMask|p->sh
2b8b0 61 72 65 64 4d 61 73 6b 29 29 3d 3d 30 20 29 3b  aredMask))==0 );
2b8c0 0a 20 20 20 20 20 20 61 6c 6c 4d 61 73 6b 20 7c  .      allMask |
2b8d0 3d 20 70 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b  = pX->sharedMask
2b8e0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
2b8f0 55 6e 6c 6f 63 6b 20 74 68 65 20 73 79 73 74 65  Unlock the syste
2b900 6d 2d 6c 65 76 65 6c 20 6c 6f 63 6b 73 20 2a 2f  m-level locks */
2b910 0a 20 20 20 20 69 66 28 20 28 6d 61 73 6b 20 26  .    if( (mask &
2b920 20 61 6c 6c 4d 61 73 6b 29 3d 3d 30 20 29 7b 0a   allMask)==0 ){.
2b930 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78 53        rc = unixS
2b940 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 44 62  hmSystemLock(pDb
2b950 46 64 2c 20 46 5f 55 4e 4c 43 4b 2c 20 6f 66 73  Fd, F_UNLCK, ofs
2b960 74 2b 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45 2c  t+UNIX_SHM_BASE,
2b970 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   n);.    }else{.
2b980 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2b990 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  E_OK;.    }..   
2b9a0 20 2f 2a 20 55 6e 64 6f 20 74 68 65 20 6c 6f 63   /* Undo the loc
2b9b0 61 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20  al locks */.    
2b9c0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2b9d0 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 65 78  K ){.      p->ex
2b9e0 63 6c 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b  clMask &= ~mask;
2b9f0 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72 65 64  .      p->shared
2ba00 4d 61 73 6b 20 26 3d 20 7e 6d 61 73 6b 3b 0a 20  Mask &= ~mask;. 
2ba10 20 20 20 7d 20 0a 20 20 7d 65 6c 73 65 20 69 66     } .  }else if
2ba20 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ( flags & SQLITE
2ba30 5f 53 48 4d 5f 53 48 41 52 45 44 20 29 7b 0a 20  _SHM_SHARED ){. 
2ba40 20 20 20 75 31 36 20 61 6c 6c 53 68 61 72 65 64     u16 allShared
2ba50 20 3d 20 30 3b 20 20 2f 2a 20 55 6e 69 6f 6e 20   = 0;  /* Union 
2ba60 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79  of locks held by
2ba70 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 74 68   connections oth
2ba80 65 72 20 74 68 61 6e 20 22 70 22 20 2a 2f 0a 0a  er than "p" */..
2ba90 20 20 20 20 2f 2a 20 46 69 6e 64 20 6f 75 74 20      /* Find out 
2baa0 77 68 69 63 68 20 73 68 61 72 65 64 20 6c 6f 63  which shared loc
2bab0 6b 73 20 61 72 65 20 61 6c 72 65 61 64 79 20 68  ks are already h
2bac0 65 6c 64 20 62 79 20 73 69 62 6c 69 6e 67 20 63  eld by sibling c
2bad0 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0a 20 20 20 20  onnections..    
2bae0 2a 2a 20 49 66 20 61 6e 79 20 73 69 62 6c 69 6e  ** If any siblin
2baf0 67 20 61 6c 72 65 61 64 79 20 68 6f 6c 64 73 20  g already holds 
2bb00 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
2bb10 6b 2c 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20  k, go ahead and 
2bb20 72 65 74 75 72 6e 0a 20 20 20 20 2a 2a 20 53 51  return.    ** SQ
2bb30 4c 49 54 45 5f 42 55 53 59 2e 0a 20 20 20 20 2a  LITE_BUSY..    *
2bb40 2f 0a 20 20 20 20 66 6f 72 28 70 58 3d 70 53 68  /.    for(pX=pSh
2bb50 6d 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 70  mNode->pFirst; p
2bb60 58 3b 20 70 58 3d 70 58 2d 3e 70 4e 65 78 74 29  X; pX=pX->pNext)
2bb70 7b 0a 20 20 20 20 20 20 69 66 28 20 28 70 58 2d  {.      if( (pX-
2bb80 3e 65 78 63 6c 4d 61 73 6b 20 26 20 6d 61 73 6b  >exclMask & mask
2bb90 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
2bba0 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
2bbb0 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
2bbc0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
2bbd0 6c 6c 53 68 61 72 65 64 20 7c 3d 20 70 58 2d 3e  llShared |= pX->
2bbe0 73 68 61 72 65 64 4d 61 73 6b 3b 0a 20 20 20 20  sharedMask;.    
2bbf0 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 73 68  }..    /* Get sh
2bc00 61 72 65 64 20 6c 6f 63 6b 73 20 61 74 20 74 68  ared locks at th
2bc10 65 20 73 79 73 74 65 6d 20 6c 65 76 65 6c 2c 20  e system level, 
2bc20 69 66 20 6e 65 63 65 73 73 61 72 79 20 2a 2f 0a  if necessary */.
2bc30 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2bc40 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69  TE_OK ){.      i
2bc50 66 28 20 28 61 6c 6c 53 68 61 72 65 64 20 26 20  f( (allShared & 
2bc60 6d 61 73 6b 29 3d 3d 30 20 29 7b 0a 20 20 20 20  mask)==0 ){.    
2bc70 20 20 20 20 72 63 20 3d 20 75 6e 69 78 53 68 6d      rc = unixShm
2bc80 53 79 73 74 65 6d 4c 6f 63 6b 28 70 44 62 46 64  SystemLock(pDbFd
2bc90 2c 20 46 5f 52 44 4c 43 4b 2c 20 6f 66 73 74 2b  , F_RDLCK, ofst+
2bca0 55 4e 49 58 5f 53 48 4d 5f 42 41 53 45 2c 20 6e  UNIX_SHM_BASE, n
2bcb0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
2bcc0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
2bcd0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  ITE_OK;.      }.
2bce0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65      }..    /* Ge
2bcf0 74 20 74 68 65 20 6c 6f 63 61 6c 20 73 68 61 72  t the local shar
2bd00 65 64 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 20 20  ed locks */.    
2bd10 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2bd20 4b 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 73 68  K ){.      p->sh
2bd30 61 72 65 64 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b  aredMask |= mask
2bd40 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
2bd50 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  .    /* Make sur
2bd60 65 20 6e 6f 20 73 69 62 6c 69 6e 67 20 63 6f 6e  e no sibling con
2bd70 6e 65 63 74 69 6f 6e 73 20 68 6f 6c 64 20 6c 6f  nections hold lo
2bd80 63 6b 73 20 74 68 61 74 20 77 69 6c 6c 20 62 6c  cks that will bl
2bd90 6f 63 6b 20 74 68 69 73 0a 20 20 20 20 2a 2a 20  ock this.    ** 
2bda0 6c 6f 63 6b 2e 20 20 49 66 20 61 6e 79 20 64 6f  lock.  If any do
2bdb0 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
2bdc0 42 55 53 59 20 72 69 67 68 74 20 61 77 61 79 2e  BUSY right away.
2bdd0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
2bde0 70 58 3d 70 53 68 6d 4e 6f 64 65 2d 3e 70 46 69  pX=pShmNode->pFi
2bdf0 72 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e  rst; pX; pX=pX->
2be00 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66  pNext){.      if
2be10 28 20 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20  ( (pX->exclMask 
2be20 26 20 6d 61 73 6b 29 21 3d 30 20 7c 7c 20 28 70  & mask)!=0 || (p
2be30 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 20  X->sharedMask & 
2be40 6d 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20  mask)!=0 ){.    
2be50 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2be60 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 62 72  BUSY;.        br
2be70 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
2be80 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 47 65 74   }.  .    /* Get
2be90 20 74 68 65 20 65 78 63 6c 75 73 69 76 65 20 6c   the exclusive l
2bea0 6f 63 6b 73 20 61 74 20 74 68 65 20 73 79 73 74  ocks at the syst
2beb0 65 6d 20 6c 65 76 65 6c 2e 20 20 54 68 65 6e 20  em level.  Then 
2bec0 69 66 20 73 75 63 63 65 73 73 66 75 6c 0a 20 20  if successful.  
2bed0 20 20 2a 2a 20 61 6c 73 6f 20 6d 61 72 6b 20 74    ** also mark t
2bee0 68 65 20 6c 6f 63 61 6c 20 63 6f 6e 6e 65 63 74  he local connect
2bef0 69 6f 6e 20 61 73 20 62 65 69 6e 67 20 6c 6f 63  ion as being loc
2bf00 6b 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ked..    */.    
2bf10 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2bf20 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
2bf30 75 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63  unixShmSystemLoc
2bf40 6b 28 70 44 62 46 64 2c 20 46 5f 57 52 4c 43 4b  k(pDbFd, F_WRLCK
2bf50 2c 20 6f 66 73 74 2b 55 4e 49 58 5f 53 48 4d 5f  , ofst+UNIX_SHM_
2bf60 42 41 53 45 2c 20 6e 29 3b 0a 20 20 20 20 20 20  BASE, n);.      
2bf70 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2bf80 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  K ){.        ass
2bf90 65 72 74 28 20 28 70 2d 3e 73 68 61 72 65 64 4d  ert( (p->sharedM
2bfa0 61 73 6b 20 26 20 6d 61 73 6b 29 3d 3d 30 20 29  ask & mask)==0 )
2bfb0 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 65 78 63  ;.        p->exc
2bfc0 6c 4d 61 73 6b 20 7c 3d 20 6d 61 73 6b 3b 0a 20  lMask |= mask;. 
2bfd0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
2bfe0 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
2bff0 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d  _leave(pShmNode-
2c000 3e 6d 75 74 65 78 29 3b 0a 20 20 4f 53 54 52 41  >mutex);.  OSTRA
2c010 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b 20 73 68  CE(("SHM-LOCK sh
2c020 6d 69 64 2d 25 64 2c 20 70 69 64 2d 25 64 20 67  mid-%d, pid-%d g
2c030 6f 74 20 25 30 33 78 2c 25 30 33 78 5c 6e 22 2c  ot %03x,%03x\n",
2c040 0a 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 69  .           p->i
2c050 64 2c 20 6f 73 47 65 74 70 69 64 28 30 29 2c 20  d, osGetpid(0), 
2c060 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 2c 20 70  p->sharedMask, p
2c070 2d 3e 65 78 63 6c 4d 61 73 6b 29 29 3b 0a 20 20  ->exclMask));.  
2c080 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2c090 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 20 61 20  .** Implement a 
2c0a0 6d 65 6d 6f 72 79 20 62 61 72 72 69 65 72 20 6f  memory barrier o
2c0b0 72 20 6d 65 6d 6f 72 79 20 66 65 6e 63 65 20 6f  r memory fence o
2c0c0 6e 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 2e  n shared memory.
2c0d0 20 20 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 6c 6f 61    .**.** All loa
2c0e0 64 73 20 61 6e 64 20 73 74 6f 72 65 73 20 62 65  ds and stores be
2c0f0 67 75 6e 20 62 65 66 6f 72 65 20 74 68 65 20 62  gun before the b
2c100 61 72 72 69 65 72 20 6d 75 73 74 20 63 6f 6d 70  arrier must comp
2c110 6c 65 74 65 20 62 65 66 6f 72 65 0a 2a 2a 20 61  lete before.** a
2c120 6e 79 20 6c 6f 61 64 20 6f 72 20 73 74 6f 72 65  ny load or store
2c130 20 62 65 67 75 6e 20 61 66 74 65 72 20 74 68 65   begun after the
2c140 20 62 61 72 72 69 65 72 2e 0a 2a 2f 0a 73 74 61   barrier..*/.sta
2c150 74 69 63 20 76 6f 69 64 20 75 6e 69 78 53 68 6d  tic void unixShm
2c160 42 61 72 72 69 65 72 28 0a 20 20 73 71 6c 69 74  Barrier(.  sqlit
2c170 65 33 5f 66 69 6c 65 20 2a 66 64 20 20 20 20 20  e3_file *fd     
2c180 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
2c190 74 61 62 61 73 65 20 66 69 6c 65 20 68 6f 6c 64  tabase file hold
2c1a0 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20 6d  ing the shared m
2c1b0 65 6d 6f 72 79 20 2a 2f 0a 29 7b 0a 20 20 55 4e  emory */.){.  UN
2c1c0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66  USED_PARAMETER(f
2c1d0 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 4d 65 6d  d);.  sqlite3Mem
2c1e0 6f 72 79 42 61 72 72 69 65 72 28 29 3b 20 20 20  oryBarrier();   
2c1f0 20 20 20 20 20 20 2f 2a 20 63 6f 6d 70 69 6c 65        /* compile
2c200 72 2d 64 65 66 69 6e 65 64 20 6d 65 6d 6f 72 79  r-defined memory
2c210 20 62 61 72 72 69 65 72 20 2a 2f 0a 20 20 75 6e   barrier */.  un
2c220 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 20  ixEnterMutex(); 
2c230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2c240 20 41 6c 73 6f 20 6d 75 74 65 78 2c 20 66 6f 72   Also mutex, for
2c250 20 72 65 64 75 6e 64 61 6e 63 79 20 2a 2f 0a 20   redundancy */. 
2c260 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
2c270 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  );.}../*.** Clos
2c280 65 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74  e a connection t
2c290 6f 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 2e  o shared-memory.
2c2a0 20 20 44 65 6c 65 74 65 20 74 68 65 20 75 6e 64    Delete the und
2c2b0 65 72 6c 79 69 6e 67 20 0a 2a 2a 20 73 74 6f 72  erlying .** stor
2c2c0 61 67 65 20 69 66 20 64 65 6c 65 74 65 46 6c 61  age if deleteFla
2c2d0 67 20 69 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a  g is true..**.**
2c2e0 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20   If there is no 
2c2f0 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 61 73  shared memory as
2c300 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
2c310 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 68 65  e connection the
2c320 6e 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e  n this.** routin
2c330 65 20 69 73 20 61 20 68 61 72 6d 6c 65 73 73 20  e is a harmless 
2c340 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  no-op..*/.static
2c350 20 69 6e 74 20 75 6e 69 78 53 68 6d 55 6e 6d 61   int unixShmUnma
2c360 70 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  p(.  sqlite3_fil
2c370 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20 20  e *fd,          
2c380 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 64 65       /* The unde
2c390 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65 20  rlying database 
2c3a0 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 64 65  file */.  int de
2c3b0 6c 65 74 65 46 6c 61 67 20 20 20 20 20 20 20 20  leteFlag        
2c3c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 6c            /* Del
2c3d0 65 74 65 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  ete shared-memor
2c3e0 79 20 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a  y if true */.){.
2c3f0 20 20 75 6e 69 78 53 68 6d 20 2a 70 3b 20 20 20    unixShm *p;   
2c400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c410 20 20 2f 2a 20 54 68 65 20 63 6f 6e 6e 65 63 74    /* The connect
2c420 69 6f 6e 20 74 6f 20 62 65 20 63 6c 6f 73 65 64  ion to be closed
2c430 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 4e 6f 64   */.  unixShmNod
2c440 65 20 2a 70 53 68 6d 4e 6f 64 65 3b 20 20 20 20  e *pShmNode;    
2c450 20 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 64        /* The und
2c460 65 72 6c 79 69 6e 67 20 73 68 61 72 65 64 2d 6d  erlying shared-m
2c470 65 6d 6f 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20  emory file */.  
2c480 75 6e 69 78 53 68 6d 20 2a 2a 70 70 3b 20 20 20  unixShm **pp;   
2c490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c4a0 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f  /* For looping o
2c4b0 76 65 72 20 73 69 62 6c 69 6e 67 20 63 6f 6e 6e  ver sibling conn
2c4c0 65 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 75 6e 69  ections */.  uni
2c4d0 78 46 69 6c 65 20 2a 70 44 62 46 64 3b 20 20 20  xFile *pDbFd;   
2c4e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2c4f0 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64  The underlying d
2c500 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
2c510 0a 20 20 70 44 62 46 64 20 3d 20 28 75 6e 69 78  .  pDbFd = (unix
2c520 46 69 6c 65 2a 29 66 64 3b 0a 20 20 70 20 3d 20  File*)fd;.  p = 
2c530 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20 69  pDbFd->pShm;.  i
2c540 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
2c550 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 53   SQLITE_OK;.  pS
2c560 68 6d 4e 6f 64 65 20 3d 20 70 2d 3e 70 53 68 6d  hmNode = p->pShm
2c570 4e 6f 64 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  Node;..  assert(
2c580 20 70 53 68 6d 4e 6f 64 65 3d 3d 70 44 62 46 64   pShmNode==pDbFd
2c590 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68 6d 4e 6f  ->pInode->pShmNo
2c5a0 64 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  de );.  assert( 
2c5b0 70 53 68 6d 4e 6f 64 65 2d 3e 70 49 6e 6f 64 65  pShmNode->pInode
2c5c0 3d 3d 70 44 62 46 64 2d 3e 70 49 6e 6f 64 65 20  ==pDbFd->pInode 
2c5d0 29 3b 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20  );..  /* Remove 
2c5e0 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 20 66 72 6f  connection p fro
2c5f0 6d 20 74 68 65 20 73 65 74 20 6f 66 20 63 6f 6e  m the set of con
2c600 6e 65 63 74 69 6f 6e 73 20 61 73 73 6f 63 69 61  nections associa
2c610 74 65 64 0a 20 20 2a 2a 20 77 69 74 68 20 70 53  ted.  ** with pS
2c620 68 6d 4e 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69  hmNode */.  sqli
2c630 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
2c640 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74 65 78 29  pShmNode->mutex)
2c650 3b 0a 20 20 66 6f 72 28 70 70 3d 26 70 53 68 6d  ;.  for(pp=&pShm
2c660 4e 6f 64 65 2d 3e 70 46 69 72 73 74 3b 20 28 2a  Node->pFirst; (*
2c670 70 70 29 21 3d 70 3b 20 70 70 20 3d 20 26 28 2a  pp)!=p; pp = &(*
2c680 70 70 29 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20 20  pp)->pNext){}.  
2c690 2a 70 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a  *pp = p->pNext;.
2c6a0 0a 20 20 2f 2a 20 46 72 65 65 20 74 68 65 20 63  .  /* Free the c
2c6b0 6f 6e 6e 65 63 74 69 6f 6e 20 70 20 2a 2f 0a 20  onnection p */. 
2c6c0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
2c6d0 3b 0a 20 20 70 44 62 46 64 2d 3e 70 53 68 6d 20  ;.  pDbFd->pShm 
2c6e0 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  = 0;.  sqlite3_m
2c6f0 75 74 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e  utex_leave(pShmN
2c700 6f 64 65 2d 3e 6d 75 74 65 78 29 3b 0a 0a 20 20  ode->mutex);..  
2c710 2f 2a 20 49 66 20 70 53 68 6d 4e 6f 64 65 2d 3e  /* If pShmNode->
2c720 6e 52 65 66 20 68 61 73 20 72 65 61 63 68 65 64  nRef has reached
2c730 20 30 2c 20 74 68 65 6e 20 63 6c 6f 73 65 20 74   0, then close t
2c740 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 0a 20 20  he underlying.  
2c750 2a 2a 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  ** shared-memory
2c760 20 66 69 6c 65 2c 20 74 6f 6f 20 2a 2f 0a 20 20   file, too */.  
2c770 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
2c780 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53 68 6d  ;.  assert( pShm
2c790 4e 6f 64 65 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a  Node->nRef>0 );.
2c7a0 20 20 70 53 68 6d 4e 6f 64 65 2d 3e 6e 52 65 66    pShmNode->nRef
2c7b0 2d 2d 3b 0a 20 20 69 66 28 20 70 53 68 6d 4e 6f  --;.  if( pShmNo
2c7c0 64 65 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20  de->nRef==0 ){. 
2c7d0 20 20 20 69 66 28 20 64 65 6c 65 74 65 46 6c 61     if( deleteFla
2c7e0 67 20 26 26 20 70 53 68 6d 4e 6f 64 65 2d 3e 68  g && pShmNode->h
2c7f0 3e 3d 30 20 29 20 7b 0a 20 20 20 20 20 20 69 66  >=0 ) {.      if
2c800 20 28 64 65 6c 65 74 65 46 6c 61 67 20 3d 3d 20   (deleteFlag == 
2c810 31 29 20 7b 20 0a 20 20 20 20 20 20 20 20 6f 73  1) { .        os
2c820 55 6e 6c 69 6e 6b 28 70 53 68 6d 4e 6f 64 65 2d  Unlink(pShmNode-
2c830 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20  >zFilename);.   
2c840 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 64 65     } else if (de
2c850 6c 65 74 65 46 6c 61 67 20 3d 3d 20 32 29 20 7b  leteFlag == 2) {
2c860 0a 20 20 20 20 20 20 20 20 2f 2a 20 66 74 72 75  .        /* ftru
2c870 6e 63 61 74 65 28 70 53 68 6d 4e 6f 64 65 2d 3e  ncate(pShmNode->
2c880 68 2c 20 33 32 20 2a 20 31 30 32 34 29 3b 20 2a  h, 32 * 1024); *
2c890 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  /.      }.    }.
2c8a0 20 20 20 20 75 6e 69 78 53 68 6d 50 75 72 67 65      unixShmPurge
2c8b0 28 70 44 62 46 64 29 3b 0a 20 20 7d 0a 20 20 75  (pDbFd);.  }.  u
2c8c0 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b  nixLeaveMutex();
2c8d0 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ..  return SQLIT
2c8e0 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 23 65 6c 73 65 0a  E_OK;.}...#else.
2c8f0 23 20 64 65 66 69 6e 65 20 75 6e 69 78 53 68 6d  # define unixShm
2c900 4d 61 70 20 20 20 20 20 30 0a 23 20 64 65 66 69  Map     0.# defi
2c910 6e 65 20 75 6e 69 78 53 68 6d 4c 6f 63 6b 20 20  ne unixShmLock  
2c920 20 20 30 0a 23 20 64 65 66 69 6e 65 20 75 6e 69    0.# define uni
2c930 78 53 68 6d 42 61 72 72 69 65 72 20 30 0a 23 20  xShmBarrier 0.# 
2c940 64 65 66 69 6e 65 20 75 6e 69 78 53 68 6d 55 6e  define unixShmUn
2c950 6d 61 70 20 20 20 30 0a 23 65 6e 64 69 66 20 2f  map   0.#endif /
2c960 2a 20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  * #ifndef SQLITE
2c970 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a 23 69  _OMIT_WAL */..#i
2c980 66 20 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  f (SQLITE_ENABLE
2c990 5f 41 50 50 4c 45 5f 53 50 49 3e 30 29 20 26 26  _APPLE_SPI>0) &&
2c9a0 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
2c9b0 5f 5f 29 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  __).static const
2c9c0 20 63 68 61 72 20 2a 75 6e 69 78 54 65 6d 70 46   char *unixTempF
2c9d0 69 6c 65 44 69 72 28 76 6f 69 64 29 3b 0a 0a 73  ileDir(void);..s
2c9e0 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 49 6e  tatic int unixIn
2c9f0 76 61 6c 69 64 61 74 65 53 75 70 70 6f 72 74 46  validateSupportF
2ca00 69 6c 65 73 28 75 6e 69 78 46 69 6c 65 20 2a 70  iles(unixFile *p
2ca10 46 69 6c 65 2c 20 69 6e 74 20 73 6b 69 70 57 41  File, int skipWA
2ca20 4c 29 20 7b 0a 20 20 63 68 61 72 20 6a 50 61 74  L) {.  char jPat
2ca30 68 5b 4d 41 58 50 41 54 48 4c 45 4e 2b 39 5d 3b  h[MAXPATHLEN+9];
2ca40 0a 20 20 69 6e 74 20 7a 4c 65 6e 20 3d 20 73 74  .  int zLen = st
2ca50 72 6c 63 70 79 28 6a 50 61 74 68 2c 20 70 46 69  rlcpy(jPath, pFi
2ca60 6c 65 2d 3e 7a 50 61 74 68 2c 20 4d 41 58 50 41  le->zPath, MAXPA
2ca70 54 48 4c 45 4e 2b 39 29 3b 0a 20 20 69 66 28 20  THLEN+9);.  if( 
2ca80 7a 4c 65 6e 3c 4d 41 58 50 41 54 48 4c 45 4e 20  zLen<MAXPATHLEN 
2ca90 29 7b 0a 20 20 20 20 73 69 7a 65 5f 74 20 6a 4c  ){.    size_t jL
2caa0 65 6e 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  en;.    const ch
2cab0 61 72 20 65 78 74 65 6e 73 69 6f 6e 73 5b 33 5d  ar extensions[3]
2cac0 5b 39 5d 20 3d 20 7b 20 22 2d 77 61 6c 22 2c 20  [9] = { "-wal", 
2cad0 22 2d 6a 6f 75 72 6e 61 6c 22 2c 20 22 2d 73 68  "-journal", "-sh
2cae0 6d 22 20 7d 3b 0a 20 20 20 20 69 6e 74 20 6a 20  m" };.    int j 
2caf0 3d 20 28 73 6b 69 70 57 41 4c 20 3f 20 31 20 3a  = (skipWAL ? 1 :
2cb00 20 30 29 3b 0a 20 20 20 20 66 6f 72 28 20 3b 20   0);.    for( ; 
2cb10 6a 3c 33 3b 20 6a 2b 2b 20 29 7b 0a 20 20 20 20  j<3; j++ ){.    
2cb20 20 20 0a 20 20 20 20 20 20 2f 2a 20 43 68 65 63    .      /* Chec
2cb30 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20  k to see if the 
2cb40 73 68 6d 20 66 69 6c 65 20 69 73 20 61 6c 72 65  shm file is alre
2cb50 61 64 79 20 6f 70 65 6e 65 64 20 66 6f 72 20 74  ady opened for t
2cb60 68 69 73 20 70 46 69 6c 65 20 2a 2f 0a 20 20 20  his pFile */.   
2cb70 20 20 20 69 66 28 20 6a 3d 3d 32 20 29 7b 0a 20     if( j==2 ){. 
2cb80 20 20 20 20 20 20 20 75 6e 69 78 45 6e 74 65 72         unixEnter
2cb90 4d 75 74 65 78 28 29 3b 20 2f 2a 20 42 65 63 61  Mutex(); /* Beca
2cba0 75 73 65 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  use pFile->pInod
2cbb0 65 20 69 73 20 73 68 61 72 65 64 20 61 63 72 6f  e is shared acro
2cbc0 73 73 20 74 68 72 65 61 64 73 20 2a 2f 0a 20 20  ss threads */.  
2cbd0 20 20 20 20 20 20 75 6e 69 78 53 68 6d 4e 6f 64        unixShmNod
2cbe0 65 20 2a 70 53 68 6d 4e 6f 64 65 20 3d 20 70 46  e *pShmNode = pF
2cbf0 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 68  ile->pInode->pSh
2cc00 6d 4e 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 69  mNode;.        i
2cc10 66 28 20 70 53 68 6d 4e 6f 64 65 20 26 26 20 21  f( pShmNode && !
2cc20 70 53 68 6d 4e 6f 64 65 2d 3e 69 73 52 65 61 64  pShmNode->isRead
2cc30 6f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 20 20  only ){.        
2cc40 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73 53    struct stat sS
2cc50 74 61 74 3b 0a 20 20 20 20 20 20 20 20 20 20 73  tat;.          s
2cc60 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
2cc70 65 72 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75 74  er(pShmNode->mut
2cc80 65 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 0a  ex);.          .
2cc90 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 53            if( pS
2cca0 68 6d 4e 6f 64 65 2d 3e 68 3e 3d 30 20 26 26 20  hmNode->h>=0 && 
2ccb0 21 6f 73 46 73 74 61 74 28 70 53 68 6d 4e 6f 64  !osFstat(pShmNod
2ccc0 65 2d 3e 68 2c 20 26 73 53 74 61 74 29 20 29 7b  e->h, &sStat) ){
2ccd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 75 6e 73  .            uns
2cce0 69 67 6e 65 64 20 6c 6f 6e 67 20 73 69 7a 65 20  igned long size 
2ccf0 3d 20 28 73 53 74 61 74 2e 73 74 5f 73 69 7a 65  = (sStat.st_size
2cd00 3c 34 29 20 3f 20 73 53 74 61 74 2e 73 74 5f 73  <4) ? sStat.st_s
2cd10 69 7a 65 20 3a 20 34 3b 0a 20 20 20 20 20 20 20  ize : 4;.       
2cd20 20 20 20 20 20 69 66 28 20 73 69 7a 65 3e 30 20       if( size>0 
2cd30 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2cd40 20 62 7a 65 72 6f 28 70 53 68 6d 4e 6f 64 65 2d   bzero(pShmNode-
2cd50 3e 61 70 52 65 67 69 6f 6e 5b 30 5d 2c 20 73 69  >apRegion[0], si
2cd60 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ze);.           
2cd70 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
2cd80 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d  _leave(pShmNode-
2cd90 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20 20  >mutex);.       
2cda0 20 20 20 20 20 20 20 75 6e 69 78 4c 65 61 76 65         unixLeave
2cdb0 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 20 20 20  Mutex();.       
2cdc0 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
2cdd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
2cde0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2cdf0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
2ce00 65 78 5f 6c 65 61 76 65 28 70 53 68 6d 4e 6f 64  ex_leave(pShmNod
2ce10 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 20  e->mutex);.     
2ce20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 75 6e 69     }.        uni
2ce30 78 4c 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20  xLeaveMutex();. 
2ce40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6a 4c 65       }.      jLe
2ce50 6e 20 3d 20 73 74 72 6c 63 70 79 28 26 6a 50 61  n = strlcpy(&jPa
2ce60 74 68 5b 7a 4c 65 6e 5d 2c 20 65 78 74 65 6e 73  th[zLen], extens
2ce70 69 6f 6e 73 5b 6a 5d 2c 20 39 29 3b 0a 20 20 20  ions[j], 9);.   
2ce80 20 20 20 69 66 28 20 6a 4c 65 6e 20 3c 20 39 20     if( jLen < 9 
2ce90 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a  ){.        int j
2cea0 66 6c 61 67 73 20 3d 20 28 6a 3c 32 29 20 3f 20  flags = (j<2) ? 
2ceb0 4f 5f 54 52 55 4e 43 20 3a 20 4f 5f 52 44 57 52  O_TRUNC : O_RDWR
2cec0 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a 66  ;.        int jf
2ced0 64 20 3d 20 6f 70 65 6e 28 6a 50 61 74 68 2c 20  d = open(jPath, 
2cee0 6a 66 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 20  jflags);.       
2cef0 20 69 66 28 20 6a 66 64 3d 3d 28 2d 31 29 20 29   if( jfd==(-1) )
2cf00 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
2cf10 65 72 72 6e 6f 21 3d 45 4e 4f 45 4e 54 20 29 7b  errno!=ENOENT ){
2cf20 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 65 72  .            per
2cf30 72 6f 72 28 6a 50 61 74 68 29 3b 0a 20 20 20 20  ror(jPath);.    
2cf40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2cf50 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20  } else {.       
2cf60 20 20 20 69 66 28 20 6a 3d 3d 32 20 29 7b 0a 20     if( j==2 ){. 
2cf70 20 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63             struc
2cf80 74 20 73 74 61 74 20 73 53 74 61 74 3b 0a 20 20  t stat sStat;.  
2cf90 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 6f            if( !o
2cfa0 73 46 73 74 61 74 28 6a 66 64 2c 20 26 73 53 74  sFstat(jfd, &sSt
2cfb0 61 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  at) ){.         
2cfc0 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f       unsigned lo
2cfd0 6e 67 20 73 69 7a 65 20 3d 20 28 73 53 74 61 74  ng size = (sStat
2cfe0 2e 73 74 5f 73 69 7a 65 3c 34 29 20 3f 20 73 53  .st_size<4) ? sS
2cff0 74 61 74 2e 73 74 5f 73 69 7a 65 20 3a 20 34 3b  tat.st_size : 4;
2d000 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
2d010 66 28 20 73 69 7a 65 3e 30 20 29 7b 0a 20 20 20  f( size>0 ){.   
2d020 20 20 20 20 20 20 20 20 20 20 20 20 20 75 69 6e               uin
2d030 74 33 32 5f 74 20 7a 65 72 6f 20 3d 20 30 3b 0a  t32_t zero = 0;.
2d040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d050 70 77 72 69 74 65 28 6a 66 64 2c 20 26 7a 65 72  pwrite(jfd, &zer
2d060 6f 2c 20 28 73 69 7a 65 5f 74 29 73 69 7a 65 2c  o, (size_t)size,
2d070 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
2d080 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
2d090 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
2d0a0 20 20 20 20 20 20 20 20 20 66 73 79 6e 63 28 6a           fsync(j
2d0b0 66 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63  fd);.          c
2d0c0 6c 6f 73 65 28 6a 66 64 29 3b 0a 20 20 20 20 20  lose(jfd);.     
2d0d0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
2d0e0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
2d0f0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 73 74  SQLITE_OK;.}..st
2d100 61 74 69 63 20 69 6e 74 20 75 6e 69 78 55 6e 73  atic int unixUns
2d110 61 66 65 54 72 75 6e 63 61 74 65 44 61 74 61 62  afeTruncateDatab
2d120 61 73 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46  ase(unixFile *pF
2d130 69 6c 65 29 7b 0a 20 20 2f 2a 20 74 68 69 73 20  ile){.  /* this 
2d140 69 73 20 6e 61 73 74 79 20 26 20 62 61 64 2e 20  is nasty & bad. 
2d150 20 64 65 73 74 72 75 63 74 69 6f 6e 20 77 69 74   destruction wit
2d160 68 20 70 72 65 6a 75 64 69 63 65 2e 20 20 77 65  h prejudice.  we
2d170 27 6c 6c 20 6c 6f 73 65 20 61 6c 6c 20 74 68 65  'll lose all the
2d180 0a 20 20 2a 2a 20 66 69 6c 65 20 6c 6f 63 6b 73  .  ** file locks
2d190 20 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73   in this process
2d1a0 2c 20 68 6f 77 65 76 65 72 2e 20 73 71 6c 69 74  , however. sqlit
2d1b0 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20  e3_file_control 
2d1c0 77 6f 72 6b 73 20 70 72 6f 70 65 72 6c 79 2e 0a  works properly..
2d1d0 20 20 2a 2a 20 42 75 74 20 69 66 20 69 74 20 66    ** But if it f
2d1e0 61 69 6c 73 2c 20 74 68 69 73 20 77 6f 72 6b 73  ails, this works
2d1f0 20 61 70 70 72 6f 78 69 6d 61 74 65 6c 79 0a 20   approximately. 
2d200 20 2a 2f 0a 20 20 63 68 61 72 20 6a 6f 75 72 6e   */.  char journ
2d210 61 6c 50 61 74 68 5b 4d 41 58 50 41 54 48 4c 45  alPath[MAXPATHLE
2d220 4e 5d 3b 0a 20 20 63 68 61 72 20 77 61 6c 50 61  N];.  char walPa
2d230 74 68 5b 4d 41 58 50 41 54 48 4c 45 4e 5d 3b 0a  th[MAXPATHLEN];.
2d240 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
2d250 45 5f 4f 4b 3b 0a 20 20 0a 23 69 66 64 65 66 20  E_OK;.  .#ifdef 
2d260 44 45 42 55 47 0a 20 20 66 70 72 69 6e 74 66 28  DEBUG.  fprintf(
2d270 73 74 64 65 72 72 2c 20 22 46 6f 72 63 65 20 74  stderr, "Force t
2d280 72 75 6e 63 61 74 69 6e 67 20 64 61 74 61 62 61  runcating databa
2d290 73 65 20 25 73 5c 6e 22 2c 20 70 46 69 6c 65 2d  se %s\n", pFile-
2d2a0 3e 7a 50 61 74 68 29 3b 0a 23 65 6e 64 69 66 0a  >zPath);.#endif.
2d2b0 20 20 73 74 72 6c 63 70 79 28 6a 6f 75 72 6e 61    strlcpy(journa
2d2c0 6c 50 61 74 68 2c 20 70 46 69 6c 65 2d 3e 7a 50  lPath, pFile->zP
2d2d0 61 74 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29  ath, MAXPATHLEN)
2d2e0 3b 0a 20 20 73 74 72 6c 63 61 74 28 6a 6f 75 72  ;.  strlcat(jour
2d2f0 6e 61 6c 50 61 74 68 2c 20 22 2d 6a 6f 75 72 6e  nalPath, "-journ
2d300 61 6c 22 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29  al", MAXPATHLEN)
2d310 3b 0a 20 20 73 74 72 6c 63 70 79 28 77 61 6c 50  ;.  strlcpy(walP
2d320 61 74 68 2c 20 70 46 69 6c 65 2d 3e 7a 50 61 74  ath, pFile->zPat
2d330 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a  h, MAXPATHLEN);.
2d340 20 20 73 74 72 6c 63 61 74 28 77 61 6c 50 61 74    strlcat(walPat
2d350 68 2c 20 22 2d 77 61 6c 22 2c 20 4d 41 58 50 41  h, "-wal", MAXPA
2d360 54 48 4c 45 4e 29 3b 0a 20 20 69 6e 74 20 66 64  THLEN);.  int fd
2d370 31 20 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 20 20  1 = pFile->h;.  
2d380 69 6e 74 20 72 65 73 75 6c 74 20 3d 20 30 3b 0a  int result = 0;.
2d390 20 20 72 65 73 75 6c 74 20 3d 20 66 74 72 75 6e    result = ftrun
2d3a0 63 61 74 65 28 66 64 31 2c 20 30 6c 6c 29 3b 0a  cate(fd1, 0ll);.
2d3b0 20 20 69 66 20 28 72 65 73 75 6c 74 29 20 7b 0a    if (result) {.
2d3c0 20 20 20 20 72 65 73 75 6c 74 20 3d 20 65 72 72      result = err
2d3d0 6e 6f 3b 0a 20 20 7d 0a 20 20 69 66 20 28 72 65  no;.  }.  if (re
2d3e0 73 75 6c 74 29 20 7b 0a 20 20 20 20 72 63 20 3d  sult) {.    rc =
2d3f0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20   SQLITE_IOERR;. 
2d400 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e     storeLastErrn
2d410 6f 28 70 46 69 6c 65 2c 20 72 65 73 75 6c 74 29  o(pFile, result)
2d420 3b 0a 20 20 7d 0a 20 20 0a 20 20 69 6e 74 20 66  ;.  }.  .  int f
2d430 64 32 20 3d 20 6f 70 65 6e 28 6a 6f 75 72 6e 61  d2 = open(journa
2d440 6c 50 61 74 68 2c 20 4f 5f 52 44 57 52 29 3b 0a  lPath, O_RDWR);.
2d450 20 20 69 6e 74 20 72 65 73 75 6c 74 32 20 3d 20    int result2 = 
2d460 30 3b 0a 20 20 69 66 20 28 66 64 32 20 3c 20 30  0;.  if (fd2 < 0
2d470 29 20 7b 0a 20 20 20 20 69 66 20 28 65 72 72 6e  ) {.    if (errn
2d480 6f 20 21 3d 20 45 4e 4f 45 4e 54 29 20 7b 0a 20  o != ENOENT) {. 
2d490 20 20 20 20 20 72 65 73 75 6c 74 32 20 3d 20 65       result2 = e
2d4a0 72 72 6e 6f 3b 0a 20 20 20 20 7d 20 65 6c 73 65  rrno;.    } else
2d4b0 20 7b 0a 20 20 20 20 20 20 72 65 73 75 6c 74 32   {.      result2
2d4c0 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 20   = 0;.    }.  } 
2d4d0 65 6c 73 65 20 7b 0a 20 20 20 20 72 65 73 75 6c  else {.    resul
2d4e0 74 32 20 3d 20 66 74 72 75 6e 63 61 74 65 28 66  t2 = ftruncate(f
2d4f0 64 32 2c 20 30 6c 6c 29 3b 0a 20 20 20 20 69 66  d2, 0ll);.    if
2d500 20 28 72 65 73 75 6c 74 32 29 20 7b 0a 20 20 20   (result2) {.   
2d510 20 20 20 72 65 73 75 6c 74 32 20 3d 20 65 72 72     result2 = err
2d520 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  no;.    }.  }.  
2d530 69 66 20 28 72 65 73 75 6c 74 32 20 26 26 20 21  if (result2 && !
2d540 72 65 73 75 6c 74 29 20 7b 0a 20 20 20 20 72 63  result) {.    rc
2d550 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b   = SQLITE_IOERR;
2d560 0a 20 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72  .    storeLastEr
2d570 72 6e 6f 28 70 46 69 6c 65 2c 20 72 65 73 75 6c  rno(pFile, resul
2d580 74 32 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 69 6e  t2);.  }.  .  in
2d590 74 20 66 64 33 20 3d 20 6f 70 65 6e 28 77 61 6c  t fd3 = open(wal
2d5a0 50 61 74 68 2c 20 4f 5f 52 44 57 52 29 3b 0a 20  Path, O_RDWR);. 
2d5b0 20 69 6e 74 20 72 65 73 75 6c 74 33 20 3d 20 30   int result3 = 0
2d5c0 3b 0a 20 20 69 66 20 28 66 64 33 20 3c 20 30 29  ;.  if (fd3 < 0)
2d5d0 20 7b 0a 20 20 20 20 69 66 20 28 65 72 72 6e 6f   {.    if (errno
2d5e0 20 21 3d 20 45 4e 4f 45 4e 54 29 20 7b 0a 20 20   != ENOENT) {.  
2d5f0 20 20 20 20 72 65 73 75 6c 74 33 20 3d 20 65 72      result3 = er
2d600 72 6e 6f 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  rno;.    } else 
2d610 7b 0a 20 20 20 20 20 20 72 65 73 75 6c 74 33 20  {.      result3 
2d620 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 65  = 0;.    }.  } e
2d630 6c 73 65 20 7b 0a 20 20 20 20 72 65 73 75 6c 74  lse {.    result
2d640 33 20 3d 20 66 74 72 75 6e 63 61 74 65 28 66 64  3 = ftruncate(fd
2d650 33 2c 20 30 6c 6c 29 3b 0a 20 20 20 20 69 66 20  3, 0ll);.    if 
2d660 28 72 65 73 75 6c 74 33 29 20 7b 0a 20 20 20 20  (result3) {.    
2d670 20 20 72 65 73 75 6c 74 33 20 3d 20 65 72 72 6e    result3 = errn
2d680 6f 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  o;.    }.  }.  i
2d690 66 20 28 72 65 73 75 6c 74 33 20 26 26 20 21 28  f (result3 && !(
2d6a0 72 65 73 75 6c 74 20 7c 7c 20 72 65 73 75 6c 74  result || result
2d6b0 32 29 29 20 7b 0a 20 20 20 20 72 63 20 3d 20 53  2)) {.    rc = S
2d6c0 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20  QLITE_IOERR;.   
2d6d0 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f 28   storeLastErrno(
2d6e0 70 46 69 6c 65 2c 20 72 65 73 75 6c 74 32 29 3b  pFile, result2);
2d6f0 0a 20 20 7d 0a 20 20 0a 20 20 69 66 20 28 66 64  .  }.  .  if (fd
2d700 33 20 3e 3d 20 30 29 20 7b 0a 20 20 20 20 66 73  3 >= 0) {.    fs
2d710 79 6e 63 28 66 64 33 29 3b 0a 20 20 20 20 63 6c  ync(fd3);.    cl
2d720 6f 73 65 28 66 64 33 29 3b 0a 20 20 7d 0a 20 20  ose(fd3);.  }.  
2d730 69 66 20 28 66 64 32 20 3e 3d 20 30 29 20 7b 0a  if (fd2 >= 0) {.
2d740 20 20 20 20 66 73 79 6e 63 28 66 64 32 29 3b 0a      fsync(fd2);.
2d750 20 20 20 20 63 6c 6f 73 65 28 66 64 32 29 3b 0a      close(fd2);.
2d760 20 20 7d 0a 20 20 66 73 79 6e 63 28 66 64 31 29    }.  fsync(fd1)
2d770 3b 0a 09 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ;...  return rc;
2d780 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .}..static int u
2d790 6e 69 78 54 72 75 6e 63 61 74 65 44 61 74 61 62  nixTruncateDatab
2d7a0 61 73 65 28 75 6e 69 78 46 69 6c 65 20 2a 70 46  ase(unixFile *pF
2d7b0 69 6c 65 2c 20 69 6e 74 20 62 46 6c 61 67 73 29  ile, int bFlags)
2d7c0 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c   {.  sqlite3_fil
2d7d0 65 20 2a 69 64 20 3d 20 28 73 71 6c 69 74 65 33  e *id = (sqlite3
2d7e0 5f 66 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20  _file *)pFile;. 
2d7f0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
2d800 5f 4f 4b 3b 0a 20 20 76 6f 69 64 20 2a 70 4c 6f  _OK;.  void *pLo
2d810 63 6b 20 3d 20 4e 55 4c 4c 3b 0a 20 20 69 6e 74  ck = NULL;.  int
2d820 20 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20 69 6e   flags = 0;.  in
2d830 74 20 63 6f 72 72 75 70 74 46 69 6c 65 4c 6f 63  t corruptFileLoc
2d840 6b 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 73 43  k = 0;.  int isC
2d850 6f 72 72 75 70 74 20 3d 20 30 3b 0a 20 20 69 6e  orrupt = 0;.  in
2d860 74 20 66 6f 72 63 65 20 3d 20 28 62 46 6c 61 67  t force = (bFlag
2d870 73 20 26 20 53 51 4c 49 54 45 5f 54 52 55 4e 43  s & SQLITE_TRUNC
2d880 41 54 45 5f 46 4f 52 43 45 29 3b 0a 20 20 69 6e  ATE_FORCE);.  in
2d890 74 20 73 61 66 65 46 61 69 6c 65 64 20 3d 20 30  t safeFailed = 0
2d8a0 3b 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e  ;..#if SQLITE_EN
2d8b0 41 42 4c 45 5f 44 41 54 41 5f 50 52 4f 54 45 43  ABLE_DATA_PROTEC
2d8c0 54 49 4f 4e 0a 20 20 66 6c 61 67 73 20 7c 3d 20  TION.  flags |= 
2d8d0 70 46 69 6c 65 2d 3e 70 72 6f 74 46 6c 61 67 73  pFile->protFlags
2d8e0 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  ;.#endif.#if SQL
2d8f0 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
2d900 4e 47 5f 53 54 59 4c 45 0a 20 20 69 66 28 20 69  NG_STYLE.  if( i
2d910 73 50 72 6f 78 79 4c 6f 63 6b 69 6e 67 4d 6f 64  sProxyLockingMod
2d920 65 28 70 46 69 6c 65 29 20 29 7b 0a 20 20 20 20  e(pFile) ){.    
2d930 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
2d940 4f 50 45 4e 5f 41 55 54 4f 50 52 4f 58 59 3b 0a  OPEN_AUTOPROXY;.
2d950 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20    }.#endif.  .  
2d960 72 63 20 3d 20 73 71 6c 69 74 65 33 64 65 6d 6f  rc = sqlite3demo
2d970 5f 73 75 70 65 72 6c 6f 63 6b 28 70 46 69 6c 65  _superlock(pFile
2d980 2d 3e 7a 50 61 74 68 2c 20 30 2c 20 66 6c 61 67  ->zPath, 0, flag
2d990 73 2c 20 30 2c 20 30 2c 20 26 70 4c 6f 63 6b 29  s, 0, 0, &pLock)
2d9a0 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
2d9b0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2d9c0 5f 43 4f 52 52 55 50 54 20 7c 7c 20 72 63 3d 3d  _CORRUPT || rc==
2d9d0 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 20 29 7b  SQLITE_NOTADB ){
2d9e0 0a 20 20 20 20 20 20 69 73 43 6f 72 72 75 70 74  .      isCorrupt
2d9f0 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 1;.      rc =
2da00 20 73 71 6c 69 74 65 33 64 65 6d 6f 5f 73 75 70   sqlite3demo_sup
2da10 65 72 6c 6f 63 6b 5f 63 6f 72 72 75 70 74 28 69  erlock_corrupt(i
2da20 64 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 45  d, SQLITE_LOCK_E
2da30 58 43 4c 55 53 49 56 45 2c 0a 20 20 20 20 20 20  XCLUSIVE,.      
2da40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2da50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2da60 20 20 20 26 63 6f 72 72 75 70 74 46 69 6c 65 4c     &corruptFileL
2da70 6f 63 6b 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ock);.    }.    
2da80 69 66 28 20 72 63 20 26 26 20 21 66 6f 72 63 65  if( rc && !force
2da90 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
2daa0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72   rc;.    }.    r
2dab0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 2f  c = SQLITE_OK; /
2dac0 2a 20 49 67 6e 6f 72 65 20 74 68 65 20 6c 6f 63  * Ignore the loc
2dad0 6b 69 6e 67 20 66 61 69 6c 75 72 65 20 69 66 20  king failure if 
2dae0 66 6f 72 63 65 20 69 73 20 74 72 75 65 20 2a 2f  force is true */
2daf0 0a 20 20 7d 0a 20 20 69 66 28 20 28 62 46 6c 61  .  }.  if( (bFla
2db00 67 73 26 53 51 4c 49 54 45 5f 54 52 55 4e 43 41  gs&SQLITE_TRUNCA
2db10 54 45 5f 49 4e 49 54 49 41 4c 49 5a 45 5f 48 45  TE_INITIALIZE_HE
2db20 41 44 45 52 5f 4d 41 53 4b 29 21 3d 30 20 29 7b  ADER_MASK)!=0 ){
2db30 0a 20 20 20 20 2f 2a 20 69 6e 69 74 69 61 6c 69  .    /* initiali
2db40 7a 65 20 61 20 6e 65 77 20 64 61 74 61 62 61 73  ze a new databas
2db50 65 20 69 6e 20 54 4d 50 44 49 52 20 61 6e 64 20  e in TMPDIR and 
2db60 63 6f 70 79 20 74 68 65 20 63 6f 6e 74 65 6e 74  copy the content
2db70 73 20 6f 76 65 72 20 2a 2f 0a 20 20 20 20 63 6f  s over */.    co
2db80 6e 73 74 20 63 68 61 72 20 2a 74 44 69 72 20 3d  nst char *tDir =
2db90 20 75 6e 69 78 54 65 6d 70 46 69 6c 65 44 69 72   unixTempFileDir
2dba0 28 29 3b 0a 20 20 20 20 69 6e 74 20 74 44 69 72  ();.    int tDir
2dbb0 4c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 74 44 69  Len = strlen(tDi
2dbc0 72 29 3b 0a 20 20 20 20 69 6e 74 20 74 4c 65 6e  r);.    int tLen
2dbd0 20 3d 20 73 69 7a 65 6f 66 28 63 68 61 72 29 20   = sizeof(char) 
2dbe0 2a 20 28 74 44 69 72 4c 65 6e 20 2b 20 31 32 29  * (tDirLen + 12)
2dbf0 3b 0a 20 20 20 20 63 68 61 72 20 2a 74 44 62 50  ;.    char *tDbP
2dc00 61 74 68 20 3d 20 28 63 68 61 72 20 2a 29 6d 61  ath = (char *)ma
2dc10 6c 6c 6f 63 28 74 4c 65 6e 29 3b 0a 20 20 20 20  lloc(tLen);.    
2dc20 69 6e 74 20 74 46 64 20 3d 20 2d 31 3b 0a 20 20  int tFd = -1;.  
2dc30 20 20 0a 20 20 20 20 73 74 72 6c 63 70 79 28 74    .    strlcpy(t
2dc40 44 62 50 61 74 68 2c 20 74 44 69 72 2c 20 74 4c  DbPath, tDir, tL
2dc50 65 6e 29 3b 0a 20 20 20 20 69 66 28 20 74 44 62  en);.    if( tDb
2dc60 50 61 74 68 5b 28 74 44 69 72 4c 65 6e 2d 31 29  Path[(tDirLen-1)
2dc70 5d 20 21 3d 20 27 2f 27 20 29 7b 0a 20 20 20 20  ] != '/' ){.    
2dc80 20 20 73 74 72 6c 63 61 74 28 74 44 62 50 61 74    strlcat(tDbPat
2dc90 68 2c 20 22 2f 74 6d 70 64 62 58 58 58 58 58 22  h, "/tmpdbXXXXX"
2dca0 2c 20 74 4c 65 6e 29 3b 0a 20 20 20 20 7d 20 65  , tLen);.    } e
2dcb0 6c 73 65 20 7b 0a 20 20 20 20 20 20 73 74 72 6c  lse {.      strl
2dcc0 63 61 74 28 74 44 62 50 61 74 68 2c 20 22 74 6d  cat(tDbPath, "tm
2dcd0 70 64 62 58 58 58 58 58 22 2c 20 74 4c 65 6e 29  pdbXXXXX", tLen)
2dce0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 74 46 64 20  ;.    }.    tFd 
2dcf0 3d 20 6d 6b 73 74 65 6d 70 28 74 44 62 50 61 74  = mkstemp(tDbPat
2dd00 68 29 3b 0a 20 20 20 20 69 66 28 20 74 46 64 3d  h);.    if( tFd=
2dd10 3d 2d 31 20 29 7b 0a 20 20 20 20 20 20 73 74 6f  =-1 ){.      sto
2dd20 72 65 4c 61 73 74 45 72 72 6e 6f 28 70 46 69 6c  reLastErrno(pFil
2dd30 65 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20 20  e, errno);.     
2dd40 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
2dd50 52 52 3b 0a 20 20 20 20 20 20 73 61 66 65 46 61  RR;.      safeFa
2dd60 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 65  iled = 1;.    }e
2dd70 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
2dd80 65 33 20 2a 74 44 62 20 3d 20 4e 55 4c 4c 3b 0a  e3 *tDb = NULL;.
2dd90 20 20 20 20 20 20 63 6f 70 79 66 69 6c 65 5f 73        copyfile_s
2dda0 74 61 74 65 5f 74 20 73 3b 0a 20 20 20 20 20 20  tate_t s;.      
2ddb0 69 6e 74 20 74 72 63 20 3d 20 73 71 6c 69 74 65  int trc = sqlite
2ddc0 33 5f 6f 70 65 6e 5f 76 32 28 74 44 62 50 61 74  3_open_v2(tDbPat
2ddd0 68 2c 20 26 74 44 62 2c 0a 20 20 20 20 20 20 20  h, &tDb,.       
2dde0 20 20 20 20 20 20 20 20 20 20 20 20 28 53 51 4c              (SQL
2ddf0 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20  ITE_OPEN_CREATE 
2de00 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  | SQLITE_OPEN_RE
2de10 41 44 57 52 49 54 45 0a 20 20 20 20 20 20 20 20  ADWRITE.        
2de20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
2de30 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 41 55 54 4f  SQLITE_OPEN_AUTO
2de40 50 52 4f 58 59 29 2c 20 4e 55 4c 4c 29 3b 0a 20  PROXY), NULL);. 
2de50 20 20 20 20 20 63 68 61 72 20 2a 65 72 72 6d 73       char *errms
2de60 67 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 20 20  g = NULL;.      
2de70 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 20  const char *sql 
2de80 3d 20 22 22 3b 0a 20 20 20 20 20 20 69 66 28 20  = "";.      if( 
2de90 21 74 72 63 20 26 26 20 28 62 46 6c 61 67 73 26  !trc && (bFlags&
2dea0 53 51 4c 49 54 45 5f 54 52 55 4e 43 41 54 45 5f  SQLITE_TRUNCATE_
2deb0 50 41 47 45 53 49 5a 45 5f 4d 41 53 4b 29 20 29  PAGESIZE_MASK) )
2dec0 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  {.        const 
2ded0 63 68 61 72 20 70 61 67 65 73 69 7a 65 5f 73 71  char pagesize_sq
2dee0 6c 5b 34 5d 5b 32 32 5d 20 3d 20 7b 0a 20 20 20  l[4][22] = {.   
2def0 20 20 20 20 20 20 20 22 70 72 61 67 6d 61 20 70         "pragma p
2df00 61 67 65 5f 73 69 7a 65 3d 31 30 32 34 22 2c 0a  age_size=1024",.
2df10 20 20 20 20 20 20 20 20 20 20 22 70 72 61 67 6d            "pragm
2df20 61 20 70 61 67 65 5f 73 69 7a 65 3d 32 30 34 38  a page_size=2048
2df30 22 2c 0a 20 20 20 20 20 20 20 20 20 20 22 70 72  ",.          "pr
2df40 61 67 6d 61 20 70 61 67 65 5f 73 69 7a 65 3d 34  agma page_size=4
2df50 30 39 36 22 2c 0a 20 20 20 20 20 20 20 20 20 20  096",.          
2df60 22 70 72 61 67 6d 61 20 70 61 67 65 5f 73 69 7a  "pragma page_siz
2df70 65 3d 38 31 39 32 22 20 0a 20 20 20 20 20 20 20  e=8192" .       
2df80 20 7d 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   };.        int 
2df90 69 50 61 67 65 73 69 7a 65 20 3d 20 28 28 28 62  iPagesize = (((b
2dfa0 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 54 52 55  Flags&SQLITE_TRU
2dfb0 4e 43 41 54 45 5f 50 41 47 45 53 49 5a 45 5f 4d  NCATE_PAGESIZE_M
2dfc0 41 53 4b 29 20 3e 3e 20 34 29 20 2d 20 31 29 3b  ASK) >> 4) - 1);
2dfd0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
2dfe0 20 69 50 61 67 65 73 69 7a 65 3e 3d 30 20 26 26   iPagesize>=0 &&
2dff0 20 69 50 61 67 65 73 69 7a 65 3c 3d 34 20 29 3b   iPagesize<=4 );
2e000 0a 20 20 20 20 20 20 20 20 73 71 6c 20 3d 20 70  .        sql = p
2e010 61 67 65 73 69 7a 65 5f 73 71 6c 5b 69 50 61 67  agesize_sql[iPag
2e020 65 73 69 7a 65 5d 3b 0a 20 20 20 20 20 20 20 20  esize];.        
2e030 74 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78  trc = sqlite3_ex
2e040 65 63 28 74 44 62 2c 20 73 71 6c 2c 20 30 2c 20  ec(tDb, sql, 0, 
2e050 30 2c 20 26 65 72 72 6d 73 67 29 3b 0a 20 20 20  0, &errmsg);.   
2e060 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21     }.      if( !
2e070 74 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 63  trc ){.        c
2e080 6f 6e 73 74 20 63 68 61 72 20 61 75 74 6f 76 61  onst char autova
2e090 63 75 75 6d 5f 73 71 6c 5b 33 5d 5b 32 31 5d 20  cuum_sql[3][21] 
2e0a0 3d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 22 70  = {.          "p
2e0b0 72 61 67 6d 61 20 61 75 74 6f 5f 76 61 63 75 75  ragma auto_vacuu
2e0c0 6d 3d 30 22 2c 0a 20 20 20 20 20 20 20 20 20 20  m=0",.          
2e0d0 22 70 72 61 67 6d 61 20 61 75 74 6f 5f 76 61 63  "pragma auto_vac
2e0e0 75 75 6d 3d 31 22 2c 0a 20 20 20 20 20 20 20 20  uum=1",.        
2e0f0 20 20 22 70 72 61 67 6d 61 20 61 75 74 6f 5f 76    "pragma auto_v
2e100 61 63 75 75 6d 3d 32 22 0a 20 20 20 20 20 20 20  acuum=2".       
2e110 20 7d 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   };.        int 
2e120 69 41 75 74 6f 76 61 63 75 75 6d 20 3d 20 32 3b  iAutovacuum = 2;
2e130 20 2f 2a 20 64 65 66 61 75 6c 74 20 74 6f 20 69   /* default to i
2e140 6e 63 72 65 6d 65 6e 74 61 6c 20 2a 2f 0a 20 20  ncremental */.  
2e150 20 20 20 20 20 20 69 66 28 20 28 62 46 6c 61 67        if( (bFlag
2e160 73 26 53 51 4c 49 54 45 5f 54 52 55 4e 43 41 54  s&SQLITE_TRUNCAT
2e170 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4d 41 53  E_AUTOVACUUM_MAS
2e180 4b 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  K) ){.          
2e190 69 41 75 74 6f 76 61 63 75 75 6d 20 3d 20 28 28  iAutovacuum = ((
2e1a0 28 62 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 54  (bFlags&SQLITE_T
2e1b0 52 55 4e 43 41 54 45 5f 41 55 54 4f 56 41 43 55  RUNCATE_AUTOVACU
2e1c0 55 4d 5f 4d 41 53 4b 29 20 3e 3e 20 32 29 20 2d  UM_MASK) >> 2) -
2e1d0 20 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   1);.        }. 
2e1e0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69         assert( i
2e1f0 41 75 74 6f 76 61 63 75 75 6d 3e 3d 30 20 26 26  Autovacuum>=0 &&
2e200 20 69 41 75 74 6f 76 61 63 75 75 6d 3c 3d 32 20   iAutovacuum<=2 
2e210 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 20 3d  );.        sql =
2e220 20 61 75 74 6f 76 61 63 75 75 6d 5f 73 71 6c 5b   autovacuum_sql[
2e230 69 41 75 74 6f 76 61 63 75 75 6d 5d 3b 0a 20 20  iAutovacuum];.  
2e240 20 20 20 20 20 20 74 72 63 20 3d 20 73 71 6c 69        trc = sqli
2e250 74 65 33 5f 65 78 65 63 28 74 44 62 2c 20 73 71  te3_exec(tDb, sq
2e260 6c 2c 20 30 2c 20 30 2c 20 26 65 72 72 6d 73 67  l, 0, 0, &errmsg
2e270 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
2e280 20 69 66 28 20 21 74 72 63 20 26 26 20 28 62 46   if( !trc && (bF
2e290 6c 61 67 73 26 53 51 4c 49 54 45 5f 54 52 55 4e  lags&SQLITE_TRUN
2e2a0 43 41 54 45 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  CATE_JOURNALMODE
2e2b0 5f 57 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 20  _WAL) ){.       
2e2c0 20 73 71 6c 20 3d 20 22 70 72 61 67 6d 61 20 6a   sql = "pragma j
2e2d0 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 22  ournal_mode=wal"
2e2e0 3b 0a 20 20 20 20 20 20 20 20 74 72 63 20 3d 20  ;.        trc = 
2e2f0 73 71 6c 69 74 65 33 5f 65 78 65 63 28 74 44 62  sqlite3_exec(tDb
2e300 2c 20 73 71 6c 2c 20 30 2c 20 30 2c 20 26 65 72  , sql, 0, 0, &er
2e310 72 6d 73 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20  rmsg);.      }. 
2e320 20 20 20 20 20 69 66 28 20 74 72 63 20 29 7b 0a       if( trc ){.
2e330 20 20 20 20 20 20 20 20 69 66 28 20 21 74 44 62          if( !tDb
2e340 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 66 70   ){.          fp
2e350 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 66  rintf(stderr, "f
2e360 61 69 6c 65 64 20 74 6f 20 6f 70 65 6e 20 74 65  ailed to open te
2e370 6d 70 20 64 61 74 61 62 61 73 65 20 27 25 73 27  mp database '%s'
2e380 20 74 6f 20 72 65 73 65 74 20 22 0a 20 20 20 20   to reset ".    
2e390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e3a0 20 20 20 20 20 20 22 74 72 75 6e 63 61 74 65 64        "truncated
2e3b0 20 64 61 74 61 62 61 73 65 20 25 73 20 77 69 74   database %s wit
2e3c0 68 20 66 6c 61 67 73 20 25 78 3a 20 25 64 5c 6e  h flags %x: %d\n
2e3d0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
2e3e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 44                tD
2e3f0 62 50 61 74 68 2c 20 70 46 69 6c 65 2d 3e 7a 50  bPath, pFile->zP
2e400 61 74 68 2c 20 62 46 6c 61 67 73 2c 20 74 72 63  ath, bFlags, trc
2e410 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
2e420 7b 0a 20 20 20 20 20 20 20 20 20 20 66 70 72 69  {.          fpri
2e430 6e 74 66 28 73 74 64 65 72 72 2c 20 22 66 61 69  ntf(stderr, "fai
2e440 6c 65 64 20 74 6f 20 73 65 74 20 27 25 73 27 20  led to set '%s' 
2e450 6f 6e 20 74 72 75 6e 63 61 74 65 64 20 64 61 74  on truncated dat
2e460 61 62 61 73 65 20 25 73 2c 20 25 64 3a 20 22 0a  abase %s, %d: ".
2e470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e480 20 20 20 20 20 20 20 20 20 20 22 25 73 5c 6e 22            "%s\n"
2e490 2c 20 73 71 6c 2c 20 70 46 69 6c 65 2d 3e 7a 50  , sql, pFile->zP
2e4a0 61 74 68 2c 20 74 72 63 2c 20 65 72 72 6d 73 67  ath, trc, errmsg
2e4b0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
2e4c0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 74     }.      if( t
2e4d0 44 62 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  Db ){.        in
2e4e0 74 20 6f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20  t off = 0;.     
2e4f0 20 20 20 2f 2a 20 6d 65 72 67 65 20 74 68 65 20     /* merge the 
2e500 77 61 6c 20 69 6e 74 6f 20 74 68 65 20 64 62 20  wal into the db 
2e510 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  */.        sqlit
2e520 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28  e3_file_control(
2e530 74 44 62 2c 20 4e 55 4c 4c 2c 20 53 51 4c 49 54  tDb, NULL, SQLIT
2e540 45 5f 46 43 4e 54 4c 5f 50 45 52 53 49 53 54 5f  E_FCNTL_PERSIST_
2e550 57 41 4c 2c 20 26 6f 66 66 29 3b 0a 20 20 20 20  WAL, &off);.    
2e560 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73      sqlite3_clos
2e570 65 28 74 44 62 29 3b 0a 20 20 20 20 20 20 7d 0a  e(tDb);.      }.
2e580 20 20 20 20 20 20 73 20 3d 20 63 6f 70 79 66 69        s = copyfi
2e590 6c 65 5f 73 74 61 74 65 5f 61 6c 6c 6f 63 28 29  le_state_alloc()
2e5a0 3b 0a 20 20 20 20 20 20 6c 73 65 65 6b 28 74 46  ;.      lseek(tF
2e5b0 64 2c 20 30 2c 20 53 45 45 4b 5f 53 45 54 29 3b  d, 0, SEEK_SET);
2e5c0 0a 20 20 20 20 20 20 6c 73 65 65 6b 28 70 46 69  .      lseek(pFi
2e5d0 6c 65 2d 3e 68 2c 20 30 2c 20 53 45 45 4b 5f 53  le->h, 0, SEEK_S
2e5e0 45 54 29 3b 0a 20 20 20 20 20 20 69 66 28 20 66  ET);.      if( f
2e5f0 63 6f 70 79 66 69 6c 65 28 74 46 64 2c 20 70 46  copyfile(tFd, pF
2e600 69 6c 65 2d 3e 68 2c 20 73 2c 20 43 4f 50 59 46  ile->h, s, COPYF
2e610 49 4c 45 5f 44 41 54 41 29 20 29 7b 0a 20 20 20  ILE_DATA) ){.   
2e620 20 20 20 20 20 69 6e 74 20 65 72 72 3d 65 72 72       int err=err
2e630 6e 6f 3b 0a 20 20 20 20 20 20 20 20 73 77 69 74  no;.        swit
2e640 63 68 28 65 72 72 29 20 7b 0a 20 20 20 20 20 20  ch(err) {.      
2e650 20 20 20 20 63 61 73 65 20 45 4e 4f 4d 45 4d 3a      case ENOMEM:
2e660 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 72 63  .            trc
2e670 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
2e680 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
2e690 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 64 65  ak;.          de
2e6a0 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 20 20 20  fault:.         
2e6b0 20 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e     storeLastErrn
2e6c0 6f 28 70 46 69 6c 65 2c 20 65 72 72 29 3b 0a 20  o(pFile, err);. 
2e6d0 20 20 20 20 20 20 20 20 20 20 20 74 72 63 20 3d             trc =
2e6e0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20   SQLITE_IOERR;. 
2e6f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2e700 0a 20 20 20 20 20 20 63 6f 70 79 66 69 6c 65 5f  .      copyfile_
2e710 73 74 61 74 65 5f 66 72 65 65 28 73 29 3b 0a 20  state_free(s);. 
2e720 20 20 20 20 20 66 73 79 6e 63 28 70 46 69 6c 65       fsync(pFile
2e730 2d 3e 68 29 3b 0a 20 20 20 20 20 20 63 6c 6f 73  ->h);.      clos
2e740 65 28 74 46 64 29 3b 0a 20 20 20 20 20 20 75 6e  e(tFd);.      un
2e750 6c 69 6e 6b 28 74 44 62 50 61 74 68 29 3b 0a 20  link(tDbPath);. 
2e760 20 20 20 20 20 69 66 28 20 74 72 63 21 3d 53 51       if( trc!=SQ
2e770 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2e780 20 20 20 73 61 66 65 46 61 69 6c 65 64 20 3d 20     safeFailed = 
2e790 31 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  1;.        rc = 
2e7a0 74 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  trc;.      }.   
2e7b0 20 7d 0a 20 20 20 20 66 72 65 65 28 74 44 62 50   }.    free(tDbP
2e7c0 61 74 68 29 3b 0a 20 20 7d 20 65 6c 73 65 20 7b  ath);.  } else {
2e7d0 0a 20 20 20 20 72 63 20 3d 20 70 46 69 6c 65 2d  .    rc = pFile-
2e7e0 3e 70 4d 65 74 68 6f 64 2d 3e 78 54 72 75 6e 63  >pMethod->xTrunc
2e7f0 61 74 65 28 69 64 2c 20 0a 20 20 20 20 20 20 20  ate(id, .       
2e800 20 20 20 20 28 28 70 46 69 6c 65 2d 3e 66 73 46      ((pFile->fsF
2e810 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 53  lags & SQLITE_FS
2e820 46 4c 41 47 53 5f 49 53 5f 4d 53 44 4f 53 29 20  FLAGS_IS_MSDOS) 
2e830 21 3d 20 30 29 20 3f 20 31 4c 20 3a 20 30 4c 29  != 0) ? 1L : 0L)
2e840 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ;.    if( rc ){.
2e850 20 20 20 20 20 20 73 61 66 65 46 61 69 6c 65 64        safeFailed
2e860 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 1;.    }.  }.
2e870 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2e880 5f 4f 4b 20 7c 7c 20 66 6f 72 63 65 20 29 7b 0a  _OK || force ){.
2e890 20 20 20 20 72 63 20 3d 20 75 6e 69 78 49 6e 76      rc = unixInv
2e8a0 61 6c 69 64 61 74 65 53 75 70 70 6f 72 74 46 69  alidateSupportFi
2e8b0 6c 65 73 28 70 46 69 6c 65 2c 20 30 29 3b 0a 20  les(pFile, 0);. 
2e8c0 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
2e8d0 20 20 20 73 61 66 65 46 61 69 6c 65 64 20 3d 20     safeFailed = 
2e8e0 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  1;.    }.  }.  p
2e8f0 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78  File->pMethod->x
2e900 53 79 6e 63 28 69 64 2c 20 53 51 4c 49 54 45 5f  Sync(id, SQLITE_
2e910 53 59 4e 43 5f 46 55 4c 4c 29 3b 0a 0a 0a 20 20  SYNC_FULL);...  
2e920 69 66 28 20 69 73 43 6f 72 72 75 70 74 20 29 7b  if( isCorrupt ){
2e930 0a 20 20 20 20 73 71 6c 69 74 65 33 64 65 6d 6f  .    sqlite3demo
2e940 5f 73 75 70 65 72 75 6e 6c 6f 63 6b 5f 63 6f 72  _superunlock_cor
2e950 72 75 70 74 28 69 64 2c 20 63 6f 72 72 75 70 74  rupt(id, corrupt
2e960 46 69 6c 65 4c 6f 63 6b 29 3b 0a 20 20 7d 65 6c  FileLock);.  }el
2e970 73 65 20 69 66 28 20 70 4c 6f 63 6b 20 29 7b 0a  se if( pLock ){.
2e980 20 20 20 20 73 71 6c 69 74 65 33 64 65 6d 6f 5f      sqlite3demo_
2e990 73 75 70 65 72 75 6e 6c 6f 63 6b 28 70 4c 6f 63  superunlock(pLoc
2e9a0 6b 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  k);.  }else{.   
2e9b0 20 61 73 73 65 72 74 28 66 6f 72 63 65 29 3b 0a   assert(force);.
2e9c0 20 20 7d 0a 20 20 0a 20 20 69 66 28 20 66 6f 72    }.  .  if( for
2e9d0 63 65 20 26 26 20 73 61 66 65 46 61 69 6c 65 64  ce && safeFailed
2e9e0 29 7b 0a 20 20 20 20 72 63 20 3d 20 75 6e 69 78  ){.    rc = unix
2e9f0 55 6e 73 61 66 65 54 72 75 6e 63 61 74 65 44 61  UnsafeTruncateDa
2ea00 74 61 62 61 73 65 28 70 46 69 6c 65 29 3b 0a 20  tabase(pFile);. 
2ea10 20 7d 0a 20 20 0a 20 20 72 65 74 75 72 6e 20 72   }.  .  return r
2ea20 63 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2a 20 4c 6f 63  c;.}../*. ** Loc
2ea30 6b 20 6c 6f 63 61 74 69 6f 6e 73 20 66 6f 72 20  k locations for 
2ea40 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 6c 6f  shared-memory lo
2ea50 63 6b 73 20 75 73 65 64 20 62 79 20 57 41 4c 20  cks used by WAL 
2ea60 6d 6f 64 65 2e 0a 20 2a 2f 0a 23 69 66 6e 64 65  mode.. */.#ifnde
2ea70 66 20 53 48 4d 5f 42 41 53 45 0a 23 20 64 65 66  f SHM_BASE.# def
2ea80 69 6e 65 20 53 48 4d 5f 42 41 53 45 20 20 20 20  ine SHM_BASE    
2ea90 20 20 20 20 20 20 31 32 30 0a 23 20 64 65 66 69        120.# defi
2eaa0 6e 65 20 53 48 4d 5f 57 52 49 54 45 20 20 20 20  ne SHM_WRITE    
2eab0 20 20 20 20 20 53 48 4d 5f 42 41 53 45 0a 23 20       SHM_BASE.# 
2eac0 64 65 66 69 6e 65 20 53 48 4d 5f 43 48 45 43 4b  define SHM_CHECK
2ead0 50 4f 49 4e 54 20 20 20 20 28 53 48 4d 5f 42 41  POINT    (SHM_BA
2eae0 53 45 2b 31 29 0a 23 20 64 65 66 69 6e 65 20 53  SE+1).# define S
2eaf0 48 4d 5f 52 45 43 4f 56 45 52 20 20 20 20 20 20  HM_RECOVER      
2eb00 20 28 53 48 4d 5f 42 41 53 45 2b 32 29 0a 23 20   (SHM_BASE+2).# 
2eb10 64 65 66 69 6e 65 20 53 48 4d 5f 52 45 41 44 5f  define SHM_READ_
2eb20 46 49 52 53 54 20 20 20 20 28 53 48 4d 5f 42 41  FIRST    (SHM_BA
2eb30 53 45 2b 33 29 0a 23 20 64 65 66 69 6e 65 20 53  SE+3).# define S
2eb40 48 4d 5f 52 45 41 44 5f 53 49 5a 45 20 20 20 20  HM_READ_SIZE    
2eb50 20 35 0a 23 65 6e 64 69 66 20 2f 2a 20 53 48 4d   5.#endif /* SHM
2eb60 5f 42 41 53 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  _BASE */../*.** 
2eb70 54 68 69 73 20 74 65 73 74 20 6f 6e 6c 79 20 77  This test only w
2eb80 6f 72 6b 73 20 66 6f 72 20 6c 6f 63 6b 20 74 65  orks for lock te
2eb90 73 74 69 6e 67 20 6f 6e 20 75 6e 69 78 2f 70 6f  sting on unix/po
2eba0 73 69 78 20 56 46 53 2e 0a 2a 2a 20 41 64 61 70  six VFS..** Adap
2ebb0 74 65 64 20 66 72 6f 6d 20 74 6f 6f 6c 2f 67 65  ted from tool/ge
2ebc0 74 6c 6f 63 6b 2e 63 20 66 34 63 33 39 62 36 35  tlock.c f4c39b65
2ebd0 31 33 37 30 31 35 36 63 61 65 39 37 39 35 30 31  1370156cae979501
2ebe0 61 37 62 31 35 36 62 64 62 61 35 30 65 37 63 65  a7b156bdba50e7ce
2ebf0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
2ec00 6e 69 78 4c 6f 63 6b 73 74 61 74 65 50 69 64 28  nixLockstatePid(
2ec10 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c  unixFile *pFile,
2ec20 20 70 69 64 5f 74 20 70 69 64 2c 20 69 6e 74 20   pid_t pid, int 
2ec30 2a 70 4c 6f 63 6b 73 74 61 74 65 29 7b 0a 20 20  *pLockstate){.  
2ec40 69 6e 74 20 68 44 62 3b 20 20 20 20 20 20 20 20  int hDb;        
2ec50 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70 74  /* File descript
2ec60 6f 72 20 66 6f 72 20 74 68 65 20 6f 70 65 6e 20  or for the open 
2ec70 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
2ec80 0a 20 20 69 6e 74 20 68 53 68 6d 20 3d 20 2d 31  .  int hShm = -1
2ec90 3b 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72  ;  /* File descr
2eca0 69 70 74 6f 72 20 66 6f 72 20 57 41 4c 20 73 68  iptor for WAL sh
2ecb0 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65  ared-memory file
2ecc0 20 2a 2f 0a 20 20 73 73 69 7a 65 5f 74 20 67 6f   */.  ssize_t go
2ecd0 74 3b 20 20 20 20 2f 2a 20 42 79 74 65 73 20 72  t;    /* Bytes r
2ece0 65 61 64 20 66 72 6f 6d 20 68 65 61 64 65 72 20  ead from header 
2ecf0 2a 2f 0a 20 20 69 6e 74 20 69 73 57 61 6c 20 3d  */.  int isWal =
2ed00 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
2ed10 2f 2a 20 54 72 75 65 20 69 66 20 69 6e 20 57 41  /* True if in WA
2ed20 4c 20 6d 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  L mode */.  int 
2ed30 6e 4c 6f 63 6b 20 3d 20 30 3b 20 20 20 20 20 20  nLock = 0;      
2ed40 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2ed50 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a   of locks held *
2ed60 2f 0a 20 20 69 6e 74 20 6e 6f 48 64 72 20 3d 20  /.  int noHdr = 
2ed70 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
2ed80 2a 20 5a 65 72 6f 20 62 79 74 65 20 44 42 20 68  * Zero byte DB h
2ed90 61 73 20 6e 6f 20 68 65 61 64 65 72 20 2a 2f 0a  as no header */.
2eda0 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
2edb0 61 48 64 72 5b 31 30 30 5d 3b 20 20 20 2f 2a 20  aHdr[100];   /* 
2edc0 44 61 74 61 62 61 73 65 20 68 65 61 64 65 72 20  Database header 
2edd0 2a 2f 0a 20 20 0a 20 20 61 73 73 65 72 74 28 70  */.  .  assert(p
2ede0 4c 6f 63 6b 73 74 61 74 65 29 3b 0a 20 20 0a 20  Lockstate);.  . 
2edf0 20 2f 2a 20 6d 61 6b 65 20 73 75 72 65 20 77 65   /* make sure we
2ee00 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69 74   are dealing wit
2ee10 68 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c  h a database fil
2ee20 65 20 2a 2f 0a 20 20 68 44 62 20 3d 20 70 46 69  e */.  hDb = pFi
2ee30 6c 65 2d 3e 68 3b 0a 20 20 69 66 28 20 68 44 62  le->h;.  if( hDb
2ee40 3c 30 20 29 7b 0a 20 20 20 20 2a 70 4c 6f 63 6b  <0 ){.    *pLock
2ee50 73 74 61 74 65 20 3d 20 53 51 4c 49 54 45 5f 4c  state = SQLITE_L
2ee60 4f 43 4b 53 54 41 54 45 5f 45 52 52 4f 52 3b 0a  OCKSTATE_ERROR;.
2ee70 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2ee80 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 61  E_ERROR;.  }.  a
2ee90 73 73 65 72 74 28 20 28 73 74 72 6c 65 6e 28 53  ssert( (strlen(S
2eea0 51 4c 49 54 45 5f 46 49 4c 45 5f 48 45 41 44 45  QLITE_FILE_HEADE
2eeb0 52 29 2b 31 29 3d 3d 53 51 4c 49 54 45 5f 46 49  R)+1)==SQLITE_FI
2eec0 4c 45 5f 48 45 41 44 45 52 5f 4c 45 4e 20 29 3b  LE_HEADER_LEN );
2eed0 0a 20 20 67 6f 74 20 3d 20 70 72 65 61 64 28 68  .  got = pread(h
2eee0 44 62 2c 20 61 48 64 72 2c 20 31 30 30 2c 20 30  Db, aHdr, 100, 0
2eef0 29 3b 0a 20 20 69 66 28 20 67 6f 74 3c 30 20 29  );.  if( got<0 )
2ef00 7b 0a 20 20 20 20 2a 70 4c 6f 63 6b 73 74 61 74  {.    *pLockstat
2ef10 65 20 3d 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 53  e = SQLITE_LOCKS
2ef20 54 41 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  TATE_ERROR;.    
2ef30 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
2ef40 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
2ef50 6f 74 3d 3d 30 20 29 7b 0a 20 20 20 20 6e 6f 48  ot==0 ){.    noH
2ef60 64 72 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 20  dr = 1;.  }else 
2ef70 69 66 28 20 67 6f 74 21 3d 31 30 30 0a 20 20 20  if( got!=100.   
2ef80 20 20 20 20 20 20 7c 7c 20 6d 65 6d 63 6d 70 28        || memcmp(
2ef90 61 48 64 72 2c 20 53 51 4c 49 54 45 5f 46 49 4c  aHdr, SQLITE_FIL
2efa0 45 5f 48 45 41 44 45 52 2c 20 53 51 4c 49 54 45  E_HEADER, SQLITE
2efb0 5f 46 49 4c 45 5f 48 45 41 44 45 52 5f 4c 45 4e  _FILE_HEADER_LEN
2efc0 29 21 3d 30 0a 20 20 29 7b 0a 20 20 20 20 2a 70  )!=0.  ){.    *p
2efd0 4c 6f 63 6b 73 74 61 74 65 20 3d 20 53 51 4c 49  Lockstate = SQLI
2efe0 54 45 5f 4c 4f 43 4b 53 54 41 54 45 5f 4e 4f 54  TE_LOCKSTATE_NOT
2eff0 41 44 42 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ADB;.    return 
2f000 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a 20  SQLITE_NOTADB;. 
2f010 20 7d 0a 20 20 0a 20 20 2f 2a 20 46 69 72 73 74   }.  .  /* First
2f020 20 63 68 65 63 6b 20 66 6f 72 20 61 6e 20 65 78   check for an ex
2f030 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a  clusive lock */.
2f040 20 20 6e 4c 6f 63 6b 20 2b 3d 20 75 6e 69 78 49    nLock += unixI
2f050 73 4c 6f 63 6b 65 64 28 70 69 64 2c 20 68 44 62  sLocked(pid, hDb
2f060 2c 20 46 5f 52 44 4c 43 4b 2c 20 53 48 41 52 45  , F_RDLCK, SHARE
2f070 44 5f 46 49 52 53 54 2c 20 53 48 41 52 45 44 5f  D_FIRST, SHARED_
2f080 53 49 5a 45 2c 0a 20 20 20 20 20 20 20 20 20 20  SIZE,.          
2f090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 45                "E
2f0a0 58 43 4c 55 53 49 56 45 22 29 3b 0a 20 20 69 66  XCLUSIVE");.  if
2f0b0 20 28 21 6e 6f 48 64 72 29 20 7b 0a 20 20 20 20   (!noHdr) {.    
2f0c0 69 73 57 61 6c 20 3d 20 61 48 64 72 5b 31 38 5d  isWal = aHdr[18]
2f0d0 3d 3d 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  ==2;.  }.  if( n
2f0e0 4c 6f 63 6b 3d 3d 30 20 26 26 20 69 73 57 61 6c  Lock==0 && isWal
2f0f0 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 52 6f  ==0 ){.    /* Ro
2f100 6c 6c 62 61 63 6b 20 6d 6f 64 65 20 2a 2f 0a 20  llback mode */. 
2f110 20 20 20 6e 4c 6f 63 6b 20 2b 3d 20 75 6e 69 78     nLock += unix
2f120 49 73 4c 6f 63 6b 65 64 28 70 69 64 2c 20 68 44  IsLocked(pid, hD
2f130 62 2c 20 46 5f 57 52 4c 43 4b 2c 20 50 45 4e 44  b, F_WRLCK, PEND
2f140 49 4e 47 5f 42 59 54 45 2c 20 53 48 41 52 45 44  ING_BYTE, SHARED
2f150 5f 53 49 5a 45 2b 32 2c 0a 20 20 20 20 20 20 20  _SIZE+2,.       
2f160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f170 20 20 20 22 50 45 4e 44 49 4e 47 7c 52 45 53 45     "PENDING|RESE
2f180 52 56 45 44 7c 53 48 41 52 45 44 22 29 3b 0a 20  RVED|SHARED");. 
2f190 20 7d 0a 20 20 69 66 28 20 6e 4c 6f 63 6b 3d 3d   }.  if( nLock==
2f1a0 30 20 26 26 20 69 73 57 61 6c 21 3d 30 20 29 7b  0 && isWal!=0 ){
2f1b0 0a 20 20 20 20 2f 2a 20 6c 6f 6f 6b 75 70 20 74  .    /* lookup t
2f1c0 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
2f1d0 6f 72 20 66 6f 72 20 74 68 65 20 73 68 61 72 65  or for the share
2f1e0 64 20 6d 65 6d 6f 72 79 20 66 69 6c 65 20 69 66  d memory file if
2f1f0 20 77 65 20 68 61 76 65 20 69 74 20 6f 70 65 6e   we have it open
2f200 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 69 73 20  .    ** in this 
2f210 70 72 6f 63 65 73 73 20 2a 2f 0a 20 20 20 20 75  process */.    u
2f220 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b  nixEnterMutex();
2f230 20 2f 2a 20 42 65 63 61 75 73 65 20 70 46 69 6c   /* Because pFil
2f240 65 2d 3e 70 49 6e 6f 64 65 20 69 73 20 73 68 61  e->pInode is sha
2f250 72 65 64 20 61 63 72 6f 73 73 20 74 68 72 65 61  red across threa
2f260 64 73 20 2a 2f 0a 20 20 20 20 75 6e 69 78 53 68  ds */.    unixSh
2f270 6d 4e 6f 64 65 20 2a 70 53 68 6d 4e 6f 64 65 20  mNode *pShmNode 
2f280 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d  = pFile->pInode-
2f290 3e 70 53 68 6d 4e 6f 64 65 3b 0a 20 20 20 20 69  >pShmNode;.    i
2f2a0 66 28 20 70 53 68 6d 4e 6f 64 65 20 29 7b 0a 20  f( pShmNode ){. 
2f2b0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
2f2c0 65 78 5f 65 6e 74 65 72 28 70 53 68 6d 4e 6f 64  ex_enter(pShmNod
2f2d0 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 20  e->mutex);.     
2f2e0 20 0a 20 20 20 20 20 20 68 53 68 6d 20 3d 20 70   .      hShm = p
2f2f0 53 68 6d 4e 6f 64 65 2d 3e 68 3b 0a 20 20 20 20  ShmNode->h;.    
2f300 20 20 69 66 28 20 68 53 68 6d 20 3e 3d 20 30 29    if( hShm >= 0)
2f310 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 75 6e  {.        if( un
2f320 69 78 49 73 4c 6f 63 6b 65 64 28 70 69 64 2c 20  ixIsLocked(pid, 
2f330 68 53 68 6d 2c 20 46 5f 52 44 4c 43 4b 2c 20 53  hShm, F_RDLCK, S
2f340 48 4d 5f 52 45 43 4f 56 45 52 2c 20 31 2c 20 22  HM_RECOVER, 1, "
2f350 57 41 4c 2d 52 45 43 4f 56 45 52 59 22 29 20 7c  WAL-RECOVERY") |
2f360 7c 0a 20 20 20 20 20 20 20 20 20 20 20 75 6e 69  |.           uni
2f370 78 49 73 4c 6f 63 6b 65 64 28 70 69 64 2c 20 68  xIsLocked(pid, h
2f380 53 68 6d 2c 20 46 5f 52 44 4c 43 4b 2c 20 53 48  Shm, F_RDLCK, SH
2f390 4d 5f 57 52 49 54 45 2c 20 31 2c 20 22 57 41 4c  M_WRITE, 1, "WAL
2f3a0 2d 57 52 49 54 45 22 29 20 29 7b 0a 20 20 20 20  -WRITE") ){.    
2f3b0 20 20 20 20 20 20 6e 4c 6f 63 6b 20 3d 20 31 3b        nLock = 1;
2f3c0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2f3d0 20 7d 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20   }.      .      
2f3e0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
2f3f0 61 76 65 28 70 53 68 6d 4e 6f 64 65 2d 3e 6d 75  ave(pShmNode->mu
2f400 74 65 78 29 3b 0a 20 20 20 20 7d 20 0a 20 20 20  tex);.    } .   
2f410 20 0a 20 20 20 20 69 66 28 20 68 53 68 6d 3c 30   .    if( hShm<0
2f420 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 74 68 65   ){.      /* the
2f430 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 66   shared memory f
2f440 69 6c 65 20 69 73 6e 27 74 20 6f 70 65 6e 20 69  ile isn't open i
2f450 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 73  n this process s
2f460 70 61 63 65 2c 20 6f 70 65 6e 20 6f 75 72 0a 20  pace, open our. 
2f470 20 20 20 20 20 2a 2a 20 6f 77 6e 20 46 44 20 2a       ** own FD *
2f480 2f 0a 20 20 20 20 20 20 63 68 61 72 20 7a 53 68  /.      char zSh
2f490 6d 5b 4d 41 58 50 41 54 48 4c 45 4e 5d 3b 0a 20  m[MAXPATHLEN];. 
2f4a0 20 20 20 20 20 0a 20 20 20 20 20 20 2f 2a 20 57       .      /* W
2f4b0 41 4c 20 6d 6f 64 65 20 2a 2f 0a 20 20 20 20 20  AL mode */.     
2f4c0 20 73 74 72 6c 63 70 79 28 7a 53 68 6d 2c 20 70   strlcpy(zShm, p
2f4d0 46 69 6c 65 2d 3e 7a 50 61 74 68 2c 20 4d 41 58  File->zPath, MAX
2f4e0 50 41 54 48 4c 45 4e 29 3b 0a 20 20 20 20 20 20  PATHLEN);.      
2f4f0 73 74 72 6c 63 61 74 28 7a 53 68 6d 2c 20 22 2d  strlcat(zShm, "-
2f500 73 68 6d 22 2c 20 4d 41 58 50 41 54 48 4c 45 4e  shm", MAXPATHLEN
2f510 29 3b 0a 20 20 20 20 20 20 68 53 68 6d 20 3d 20  );.      hShm = 
2f520 6f 70 65 6e 28 7a 53 68 6d 2c 20 4f 5f 52 44 4f  open(zShm, O_RDO
2f530 4e 4c 59 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  NLY, 0);.      i
2f540 66 28 20 68 53 68 6d 3c 30 20 29 7b 0a 20 20 20  f( hShm<0 ){.   
2f550 20 20 20 20 20 2a 70 4c 6f 63 6b 73 74 61 74 65       *pLockstate
2f560 20 3d 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 53 54   = SQLITE_LOCKST
2f570 41 54 45 5f 4f 46 46 3b 0a 20 20 20 20 20 20 20  ATE_OFF;.       
2f580 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
2f590 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
2f5a0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
2f5b0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 75     }.      if( u
2f5c0 6e 69 78 49 73 4c 6f 63 6b 65 64 28 70 69 64 2c  nixIsLocked(pid,
2f5d0 20 68 53 68 6d 2c 20 46 5f 52 44 4c 43 4b 2c 20   hShm, F_RDLCK, 
2f5e0 53 48 4d 5f 52 45 43 4f 56 45 52 2c 20 31 2c 20  SHM_RECOVER, 1, 
2f5f0 22 57 41 4c 2d 52 45 43 4f 56 45 52 59 22 29 20  "WAL-RECOVERY") 
2f600 7c 7c 0a 20 20 20 20 20 20 20 20 20 75 6e 69 78  ||.         unix
2f610 49 73 4c 6f 63 6b 65 64 28 70 69 64 2c 20 68 53  IsLocked(pid, hS
2f620 68 6d 2c 20 46 5f 52 44 4c 43 4b 2c 20 53 48 4d  hm, F_RDLCK, SHM
2f630 5f 57 52 49 54 45 2c 20 31 2c 20 22 57 41 4c 2d  _WRITE, 1, "WAL-
2f640 57 52 49 54 45 22 29 20 29 7b 0a 20 20 20 20 20  WRITE") ){.     
2f650 20 20 20 6e 4c 6f 63 6b 20 3d 20 31 3b 0a 20 20     nLock = 1;.  
2f660 20 20 20 20 7d 0a 20 20 20 20 20 20 63 6c 6f 73      }.      clos
2f670 65 28 68 53 68 6d 29 3b 0a 20 20 20 20 7d 0a 20  e(hShm);.    }. 
2f680 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65     unixLeaveMute
2f690 78 28 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  x();.  }.  if( n
2f6a0 4c 6f 63 6b 3e 30 20 29 7b 0a 20 20 20 20 2a 70  Lock>0 ){.    *p
2f6b0 4c 6f 63 6b 73 74 61 74 65 20 3d 20 53 51 4c 49  Lockstate = SQLI
2f6c0 54 45 5f 4c 4f 43 4b 53 54 41 54 45 5f 4f 4e 3b  TE_LOCKSTATE_ON;
2f6d0 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20  .  } else {.    
2f6e0 2a 70 4c 6f 63 6b 73 74 61 74 65 20 3d 20 53 51  *pLockstate = SQ
2f6f0 4c 49 54 45 5f 4c 4f 43 4b 53 54 41 54 45 5f 4f  LITE_LOCKSTATE_O
2f700 46 46 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  FF;.  }.  return
2f710 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23   SQLITE_OK;.}..#
2f720 65 6e 64 69 66 20 2f 2a 20 28 53 51 4c 49 54 45  endif /* (SQLITE
2f730 5f 45 4e 41 42 4c 45 5f 41 50 50 4c 45 5f 53 50  _ENABLE_APPLE_SP
2f740 49 3e 30 29 20 26 26 20 64 65 66 69 6e 65 64 28  I>0) && defined(
2f750 5f 5f 41 50 50 4c 45 5f 5f 29 20 2a 2f 0a 0a 23  __APPLE__) */..#
2f760 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  if SQLITE_MAX_MM
2f770 41 50 5f 53 49 5a 45 3e 30 0a 2f 2a 0a 2a 2a 20  AP_SIZE>0./*.** 
2f780 49 66 20 69 74 20 69 73 20 63 75 72 72 65 6e 74  If it is current
2f790 6c 79 20 6d 65 6d 6f 72 79 20 6d 61 70 70 65 64  ly memory mapped
2f7a0 2c 20 75 6e 6d 61 70 20 66 69 6c 65 20 70 46 64  , unmap file pFd
2f7b0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2f7c0 20 75 6e 69 78 55 6e 6d 61 70 66 69 6c 65 28 75   unixUnmapfile(u
2f7d0 6e 69 78 46 69 6c 65 20 2a 70 46 64 29 7b 0a 20  nixFile *pFd){. 
2f7e0 20 61 73 73 65 72 74 28 20 70 46 64 2d 3e 6e 46   assert( pFd->nF
2f7f0 65 74 63 68 4f 75 74 3d 3d 30 20 29 3b 0a 20 20  etchOut==0 );.  
2f800 69 66 28 20 70 46 64 2d 3e 70 4d 61 70 52 65 67  if( pFd->pMapReg
2f810 69 6f 6e 20 29 7b 0a 20 20 20 20 6f 73 4d 75 6e  ion ){.    osMun
2f820 6d 61 70 28 70 46 64 2d 3e 70 4d 61 70 52 65 67  map(pFd->pMapReg
2f830 69 6f 6e 2c 20 70 46 64 2d 3e 6d 6d 61 70 53 69  ion, pFd->mmapSi
2f840 7a 65 41 63 74 75 61 6c 29 3b 0a 20 20 20 20 70  zeActual);.    p
2f850 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 20 3d  Fd->pMapRegion =
2f860 20 30 3b 0a 20 20 20 20 70 46 64 2d 3e 6d 6d 61   0;.    pFd->mma
2f870 70 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70  pSize = 0;.    p
2f880 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75  Fd->mmapSizeActu
2f890 61 6c 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f  al = 0;.  }.}../
2f8a0 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20  *.** Attempt to 
2f8b0 73 65 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20  set the size of 
2f8c0 74 68 65 20 6d 65 6d 6f 72 79 20 6d 61 70 70 69  the memory mappi
2f8d0 6e 67 20 6d 61 69 6e 74 61 69 6e 65 64 20 62 79  ng maintained by
2f8e0 20 66 69 6c 65 20 0a 2a 2a 20 64 65 73 63 72 69   file .** descri
2f8f0 70 74 6f 72 20 70 46 64 20 74 6f 20 6e 4e 65 77  ptor pFd to nNew
2f900 20 62 79 74 65 73 2e 20 41 6e 79 20 65 78 69 73   bytes. Any exis
2f910 74 69 6e 67 20 6d 61 70 70 69 6e 67 20 69 73 20  ting mapping is 
2f920 64 69 73 63 61 72 64 65 64 2e 0a 2a 2a 0a 2a 2a  discarded..**.**
2f930 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
2f940 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 65  this function se
2f950 74 73 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ts the following
2f960 20 76 61 72 69 61 62 6c 65 73 3a 0a 2a 2a 0a 2a   variables:.**.*
2f970 2a 20 20 20 20 20 20 20 75 6e 69 78 46 69 6c 65  *       unixFile
2f980 2e 70 4d 61 70 52 65 67 69 6f 6e 0a 2a 2a 20 20  .pMapRegion.**  
2f990 20 20 20 20 20 75 6e 69 78 46 69 6c 65 2e 6d 6d       unixFile.mm
2f9a0 61 70 53 69 7a 65 0a 2a 2a 20 20 20 20 20 20 20  apSize.**       
2f9b0 75 6e 69 78 46 69 6c 65 2e 6d 6d 61 70 53 69 7a  unixFile.mmapSiz
2f9c0 65 41 63 74 75 61 6c 0a 2a 2a 0a 2a 2a 20 49 66  eActual.**.** If
2f9d0 20 75 6e 73 75 63 63 65 73 73 66 75 6c 2c 20 61   unsuccessful, a
2f9e0 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
2f9f0 69 73 20 6c 6f 67 67 65 64 20 76 69 61 20 73 71  is logged via sq
2fa00 6c 69 74 65 33 5f 6c 6f 67 28 29 20 61 6e 64 0a  lite3_log() and.
2fa10 2a 2a 20 74 68 65 20 74 68 72 65 65 20 76 61 72  ** the three var
2fa20 69 61 62 6c 65 73 20 61 62 6f 76 65 20 61 72 65  iables above are
2fa30 20 7a 65 72 6f 65 64 2e 20 49 6e 20 74 68 69 73   zeroed. In this
2fa40 20 63 61 73 65 20 53 51 4c 69 74 65 20 73 68 6f   case SQLite sho
2fa50 75 6c 64 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 20  uld.** continue 
2fa60 61 63 63 65 73 73 69 6e 67 20 74 68 65 20 64 61  accessing the da
2fa70 74 61 62 61 73 65 20 75 73 69 6e 67 20 74 68 65  tabase using the
2fa80 20 78 52 65 61 64 28 29 20 61 6e 64 20 78 57 72   xRead() and xWr
2fa90 69 74 65 28 29 0a 2a 2a 20 6d 65 74 68 6f 64 73  ite().** methods
2faa0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2fab0 20 75 6e 69 78 52 65 6d 61 70 66 69 6c 65 28 0a   unixRemapfile(.
2fac0 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 64 2c    unixFile *pFd,
2fad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fae0 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69    /* File descri
2faf0 70 74 6f 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  ptor object */. 
2fb00 20 69 36 34 20 6e 4e 65 77 20 20 20 20 20 20 20   i64 nNew       
2fb10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fb20 20 2f 2a 20 52 65 71 75 69 72 65 64 20 6d 61 70   /* Required map
2fb30 70 69 6e 67 20 73 69 7a 65 20 2a 2f 0a 29 7b 0a  ping size */.){.
2fb40 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45    const char *zE
2fb50 72 72 20 3d 20 22 6d 6d 61 70 22 3b 0a 20 20 69  rr = "mmap";.  i
2fb60 6e 74 20 68 20 3d 20 70 46 64 2d 3e 68 3b 20 20  nt h = pFd->h;  
2fb70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fb80 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63      /* File desc
2fb90 72 69 70 74 6f 72 20 6f 70 65 6e 20 6f 6e 20 64  riptor open on d
2fba0 62 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 2a  b file */.  u8 *
2fbb0 70 4f 72 69 67 20 3d 20 28 75 38 20 2a 29 70 46  pOrig = (u8 *)pF
2fbc0 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e 3b 20 20  d->pMapRegion;  
2fbd0 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 63   /* Pointer to c
2fbe0 75 72 72 65 6e 74 20 66 69 6c 65 20 6d 61 70 70  urrent file mapp
2fbf0 69 6e 67 20 2a 2f 0a 20 20 69 36 34 20 6e 4f 72  ing */.  i64 nOr
2fc00 69 67 20 3d 20 70 46 64 2d 3e 6d 6d 61 70 53 69  ig = pFd->mmapSi
2fc10 7a 65 41 63 74 75 61 6c 3b 20 20 20 20 20 2f 2a  zeActual;     /*
2fc20 20 53 69 7a 65 20 6f 66 20 70 4f 72 69 67 20 72   Size of pOrig r
2fc30 65 67 69 6f 6e 20 69 6e 20 62 79 74 65 73 20 2a  egion in bytes *
2fc40 2f 0a 20 20 75 38 20 2a 70 4e 65 77 20 3d 20 30  /.  u8 *pNew = 0
2fc50 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2fc60 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61           /* Loca
2fc70 74 69 6f 6e 20 6f 66 20 6e 65 77 20 6d 61 70 70  tion of new mapp
2fc80 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  ing */.  int fla
2fc90 67 73 20 3d 20 50 52 4f 54 5f 52 45 41 44 3b 20  gs = PROT_READ; 
2fca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2fcb0 20 46 6c 61 67 73 20 74 6f 20 70 61 73 73 20 74   Flags to pass t
2fcc0 6f 20 6d 6d 61 70 28 29 20 2a 2f 0a 0a 20 20 61  o mmap() */..  a
2fcd0 73 73 65 72 74 28 20 70 46 64 2d 3e 6e 46 65 74  ssert( pFd->nFet
2fce0 63 68 4f 75 74 3d 3d 30 20 29 3b 0a 20 20 61 73  chOut==0 );.  as
2fcf0 73 65 72 74 28 20 6e 4e 65 77 3e 70 46 64 2d 3e  sert( nNew>pFd->
2fd00 6d 6d 61 70 53 69 7a 65 20 29 3b 0a 20 20 61 73  mmapSize );.  as
2fd10 73 65 72 74 28 20 6e 4e 65 77 3c 3d 70 46 64 2d  sert( nNew<=pFd-
2fd20 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20 29 3b 0a  >mmapSizeMax );.
2fd30 20 20 61 73 73 65 72 74 28 20 6e 4e 65 77 3e 30    assert( nNew>0
2fd40 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 46   );.  assert( pF
2fd50 64 2d 3e 6d 6d 61 70 53 69 7a 65 41 63 74 75 61  d->mmapSizeActua
2fd60 6c 3e 3d 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65  l>=pFd->mmapSize
2fd70 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 4d 41   );.  assert( MA
2fd80 50 5f 46 41 49 4c 45 44 21 3d 30 20 29 3b 0a 0a  P_FAILED!=0 );..
2fd90 20 20 69 66 28 20 28 70 46 64 2d 3e 63 74 72 6c    if( (pFd->ctrl
2fda0 46 6c 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45  Flags & UNIXFILE
2fdb0 5f 52 44 4f 4e 4c 59 29 3d 3d 30 20 29 20 66 6c  _RDONLY)==0 ) fl
2fdc0 61 67 73 20 7c 3d 20 50 52 4f 54 5f 57 52 49 54  ags |= PROT_WRIT
2fdd0 45 3b 0a 0a 20 20 69 66 28 20 70 4f 72 69 67 20  E;..  if( pOrig 
2fde0 29 7b 0a 23 69 66 20 48 41 56 45 5f 4d 52 45 4d  ){.#if HAVE_MREM
2fdf0 41 50 0a 20 20 20 20 69 36 34 20 6e 52 65 75 73  AP.    i64 nReus
2fe00 65 20 3d 20 70 46 64 2d 3e 6d 6d 61 70 53 69 7a  e = pFd->mmapSiz
2fe10 65 3b 0a 23 65 6c 73 65 0a 20 20 20 20 63 6f 6e  e;.#else.    con
2fe20 73 74 20 69 6e 74 20 73 7a 53 79 73 70 61 67 65  st int szSyspage
2fe30 20 3d 20 6f 73 47 65 74 70 61 67 65 73 69 7a 65   = osGetpagesize
2fe40 28 29 3b 0a 20 20 20 20 69 36 34 20 6e 52 65 75  ();.    i64 nReu
2fe50 73 65 20 3d 20 28 70 46 64 2d 3e 6d 6d 61 70 53  se = (pFd->mmapS
2fe60 69 7a 65 20 26 20 7e 28 73 7a 53 79 73 70 61 67  ize & ~(szSyspag
2fe70 65 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20  e-1));.#endif.  
2fe80 20 20 75 38 20 2a 70 52 65 71 20 3d 20 26 70 4f    u8 *pReq = &pO
2fe90 72 69 67 5b 6e 52 65 75 73 65 5d 3b 0a 0a 20 20  rig[nReuse];..  
2fea0 20 20 2f 2a 20 55 6e 6d 61 70 20 61 6e 79 20 70    /* Unmap any p
2feb0 61 67 65 73 20 6f 66 20 74 68 65 20 65 78 69 73  ages of the exis
2fec0 74 69 6e 67 20 6d 61 70 70 69 6e 67 20 74 68 61  ting mapping tha
2fed0 74 20 63 61 6e 6e 6f 74 20 62 65 20 72 65 75 73  t cannot be reus
2fee0 65 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e  ed. */.    if( n
2fef0 52 65 75 73 65 21 3d 6e 4f 72 69 67 20 29 7b 0a  Reuse!=nOrig ){.
2ff00 20 20 20 20 20 20 6f 73 4d 75 6e 6d 61 70 28 70        osMunmap(p
2ff10 52 65 71 2c 20 6e 4f 72 69 67 2d 6e 52 65 75 73  Req, nOrig-nReus
2ff20 65 29 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20 48  e);.    }..#if H
2ff30 41 56 45 5f 4d 52 45 4d 41 50 0a 20 20 20 20 70  AVE_MREMAP.    p
2ff40 4e 65 77 20 3d 20 6f 73 4d 72 65 6d 61 70 28 70  New = osMremap(p
2ff50 4f 72 69 67 2c 20 6e 52 65 75 73 65 2c 20 6e 4e  Orig, nReuse, nN
2ff60 65 77 2c 20 4d 52 45 4d 41 50 5f 4d 41 59 4d 4f  ew, MREMAP_MAYMO
2ff70 56 45 29 3b 0a 20 20 20 20 7a 45 72 72 20 3d 20  VE);.    zErr = 
2ff80 22 6d 72 65 6d 61 70 22 3b 0a 23 65 6c 73 65 0a  "mremap";.#else.
2ff90 20 20 20 20 70 4e 65 77 20 3d 20 6f 73 4d 6d 61      pNew = osMma
2ffa0 70 28 70 52 65 71 2c 20 6e 4e 65 77 2d 6e 52 65  p(pReq, nNew-nRe
2ffb0 75 73 65 2c 20 66 6c 61 67 73 2c 20 4d 41 50 5f  use, flags, MAP_
2ffc0 53 48 41 52 45 44 2c 20 68 2c 20 6e 52 65 75 73  SHARED, h, nReus
2ffd0 65 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77  e);.    if( pNew
2ffe0 21 3d 4d 41 50 5f 46 41 49 4c 45 44 20 29 7b 0a  !=MAP_FAILED ){.
2fff0 20 20 20 20 20 20 69 66 28 20 70 4e 65 77 21 3d        if( pNew!=
30000 70 52 65 71 20 29 7b 0a 20 20 20 20 20 20 20 20  pReq ){.        
30010 6f 73 4d 75 6e 6d 61 70 28 70 4e 65 77 2c 20 6e  osMunmap(pNew, n
30020 4e 65 77 20 2d 20 6e 52 65 75 73 65 29 3b 0a 20  New - nReuse);. 
30030 20 20 20 20 20 20 20 70 4e 65 77 20 3d 20 30 3b         pNew = 0;
30040 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
30050 20 20 20 20 20 20 70 4e 65 77 20 3d 20 70 4f 72        pNew = pOr
30060 69 67 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ig;.      }.    
30070 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  }.#endif..    /*
30080 20 54 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20   The attempt to 
30090 65 78 74 65 6e 64 20 74 68 65 20 65 78 69 73 74  extend the exist
300a0 69 6e 67 20 6d 61 70 70 69 6e 67 20 66 61 69 6c  ing mapping fail
300b0 65 64 2e 20 46 72 65 65 20 69 74 2e 20 2a 2f 0a  ed. Free it. */.
300c0 20 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 4d 41      if( pNew==MA
300d0 50 5f 46 41 49 4c 45 44 20 7c 7c 20 70 4e 65 77  P_FAILED || pNew
300e0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6f 73 4d  ==0 ){.      osM
300f0 75 6e 6d 61 70 28 70 4f 72 69 67 2c 20 6e 52 65  unmap(pOrig, nRe
30100 75 73 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  use);.    }.  }.
30110 0a 20 20 2f 2a 20 49 66 20 70 4e 65 77 20 69 73  .  /* If pNew is
30120 20 73 74 69 6c 6c 20 4e 55 4c 4c 2c 20 74 72 79   still NULL, try
30130 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20 65 6e   to create an en
30140 74 69 72 65 6c 79 20 6e 65 77 20 6d 61 70 70 69  tirely new mappi
30150 6e 67 2e 20 2a 2f 0a 20 20 69 66 28 20 70 4e 65  ng. */.  if( pNe
30160 77 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4e 65 77  w==0 ){.    pNew
30170 20 3d 20 6f 73 4d 6d 61 70 28 30 2c 20 6e 4e 65   = osMmap(0, nNe
30180 77 2c 20 66 6c 61 67 73 2c 20 4d 41 50 5f 53 48  w, flags, MAP_SH
30190 41 52 45 44 2c 20 68 2c 20 30 29 3b 0a 20 20 7d  ARED, h, 0);.  }
301a0 0a 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 4d 41  ..  if( pNew==MA
301b0 50 5f 46 41 49 4c 45 44 20 29 7b 0a 20 20 20 20  P_FAILED ){.    
301c0 70 4e 65 77 20 3d 20 30 3b 0a 20 20 20 20 6e 4e  pNew = 0;.    nN
301d0 65 77 20 3d 20 30 3b 0a 20 20 20 20 75 6e 69 78  ew = 0;.    unix
301e0 4c 6f 67 45 72 72 6f 72 28 53 51 4c 49 54 45 5f  LogError(SQLITE_
301f0 4f 4b 2c 20 7a 45 72 72 2c 20 70 46 64 2d 3e 7a  OK, zErr, pFd->z
30200 50 61 74 68 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  Path);..    /* I
30210 66 20 74 68 65 20 6d 6d 61 70 28 29 20 61 62 6f  f the mmap() abo
30220 76 65 20 66 61 69 6c 65 64 2c 20 61 73 73 75 6d  ve failed, assum
30230 65 20 74 68 61 74 20 61 6c 6c 20 73 75 62 73 65  e that all subse
30240 71 75 65 6e 74 20 6d 6d 61 70 28 29 20 63 61 6c  quent mmap() cal
30250 6c 73 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20 70  ls.    ** will p
30260 72 6f 62 61 62 6c 79 20 66 61 69 6c 20 74 6f 6f  robably fail too
30270 2e 20 46 61 6c 6c 20 62 61 63 6b 20 74 6f 20 75  . Fall back to u
30280 73 69 6e 67 20 78 52 65 61 64 2f 78 57 72 69 74  sing xRead/xWrit
30290 65 20 65 78 63 6c 75 73 69 76 65 6c 79 0a 20 20  e exclusively.  
302a0 20 20 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73    ** in this cas
302b0 65 2e 20 20 2a 2f 0a 20 20 20 20 70 46 64 2d 3e  e.  */.    pFd->
302c0 6d 6d 61 70 53 69 7a 65 4d 61 78 20 3d 20 30 3b  mmapSizeMax = 0;
302d0 0a 20 20 7d 0a 20 20 70 46 64 2d 3e 70 4d 61 70  .  }.  pFd->pMap
302e0 52 65 67 69 6f 6e 20 3d 20 28 76 6f 69 64 20 2a  Region = (void *
302f0 29 70 4e 65 77 3b 0a 20 20 70 46 64 2d 3e 6d 6d  )pNew;.  pFd->mm
30300 61 70 53 69 7a 65 20 3d 20 70 46 64 2d 3e 6d 6d  apSize = pFd->mm
30310 61 70 53 69 7a 65 41 63 74 75 61 6c 20 3d 20 6e  apSizeActual = n
30320 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65  New;.}../*.** Me
30330 6d 6f 72 79 20 6d 61 70 20 6f 72 20 72 65 6d 61  mory map or rema
30340 70 20 74 68 65 20 66 69 6c 65 20 6f 70 65 6e 65  p the file opene
30350 64 20 62 79 20 66 69 6c 65 2d 64 65 73 63 72 69  d by file-descri
30360 70 74 6f 72 20 70 46 64 20 28 69 66 20 74 68 65  ptor pFd (if the
30370 20 66 69 6c 65 0a 2a 2a 20 69 73 20 61 6c 72 65   file.** is alre
30380 61 64 79 20 6d 61 70 70 65 64 2c 20 74 68 65 20  ady mapped, the 
30390 65 78 69 73 74 69 6e 67 20 6d 61 70 70 69 6e 67  existing mapping
303a0 20 69 73 20 72 65 70 6c 61 63 65 64 20 62 79 20   is replaced by 
303b0 74 68 65 20 6e 65 77 29 2e 20 4f 72 2c 20 69 66  the new). Or, if
303c0 20 0a 2a 2a 20 74 68 65 72 65 20 61 6c 72 65 61   .** there alrea
303d0 64 79 20 65 78 69 73 74 73 20 61 20 6d 61 70 70  dy exists a mapp
303e0 69 6e 67 20 66 6f 72 20 74 68 69 73 20 66 69 6c  ing for this fil
303f0 65 2c 20 61 6e 64 20 74 68 65 72 65 20 61 72 65  e, and there are
30400 20 73 74 69 6c 6c 20 0a 2a 2a 20 6f 75 74 73 74   still .** outst
30410 61 6e 64 69 6e 67 20 78 46 65 74 63 68 28 29 20  anding xFetch() 
30420 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 69 74  references to it
30430 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
30440 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  is a no-op..**.*
30450 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72 20 6e  * If parameter n
30460 42 79 74 65 20 69 73 20 6e 6f 6e 2d 6e 65 67 61  Byte is non-nega
30470 74 69 76 65 2c 20 74 68 65 6e 20 69 74 20 69 73  tive, then it is
30480 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 73   the requested s
30490 69 7a 65 20 6f 66 20 0a 2a 2a 20 74 68 65 20 6d  ize of .** the m
304a0 61 70 70 69 6e 67 20 74 6f 20 63 72 65 61 74 65  apping to create
304b0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  . Otherwise, if 
304c0 6e 42 79 74 65 20 69 73 20 6c 65 73 73 20 74 68  nByte is less th
304d0 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  an zero, then th
304e0 65 20 0a 2a 2a 20 72 65 71 75 65 73 74 65 64 20  e .** requested 
304f0 73 69 7a 65 20 69 73 20 74 68 65 20 73 69 7a 65  size is the size
30500 20 6f 66 20 74 68 65 20 66 69 6c 65 20 6f 6e 20   of the file on 
30510 64 69 73 6b 2e 20 54 68 65 20 61 63 74 75 61 6c  disk. The actual
30520 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20   size of the.** 
30530 63 72 65 61 74 65 64 20 6d 61 70 70 69 6e 67 20  created mapping 
30540 69 73 20 65 69 74 68 65 72 20 74 68 65 20 72 65  is either the re
30550 71 75 65 73 74 65 64 20 73 69 7a 65 20 6f 72 20  quested size or 
30560 74 68 65 20 76 61 6c 75 65 20 63 6f 6e 66 69 67  the value config
30570 75 72 65 64 20 0a 2a 2a 20 75 73 69 6e 67 20 53  ured .** using S
30580 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4d 4d 41 50  QLITE_FCNTL_MMAP
30590 5f 4c 49 4d 49 54 2c 20 77 68 69 63 68 65 76 65  _LIMIT, whicheve
305a0 72 20 69 73 20 73 6d 61 6c 6c 65 72 2e 0a 2a 2a  r is smaller..**
305b0 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
305c0 20 72 65 74 75 72 6e 65 64 20 69 66 20 6e 6f 20   returned if no 
305d0 65 72 72 6f 72 20 6f 63 63 75 72 73 20 28 65 76  error occurs (ev
305e0 65 6e 20 69 66 20 74 68 65 20 6d 61 70 70 69 6e  en if the mappin
305f0 67 20 69 73 20 6e 6f 74 0a 2a 2a 20 72 65 63 72  g is not.** recr
30600 65 61 74 65 64 20 61 73 20 61 20 72 65 73 75 6c  eated as a resul
30610 74 20 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e 67  t of outstanding
30620 20 72 65 66 65 72 65 6e 63 65 73 29 20 6f 72 20   references) or 
30630 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 0a  an SQLite error.
30640 2a 2a 20 63 6f 64 65 20 6f 74 68 65 72 77 69 73  ** code otherwis
30650 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
30660 20 75 6e 69 78 4d 61 70 66 69 6c 65 28 75 6e 69   unixMapfile(uni
30670 78 46 69 6c 65 20 2a 70 46 64 2c 20 69 36 34 20  xFile *pFd, i64 
30680 6e 42 79 74 65 29 7b 0a 20 20 69 36 34 20 6e 4d  nByte){.  i64 nM
30690 61 70 20 3d 20 6e 42 79 74 65 3b 0a 20 20 69 6e  ap = nByte;.  in
306a0 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
306b0 20 6e 4d 61 70 3e 3d 30 20 7c 7c 20 70 46 64 2d   nMap>=0 || pFd-
306c0 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30 20 29 3b  >nFetchOut==0 );
306d0 0a 20 20 69 66 28 20 70 46 64 2d 3e 6e 46 65 74  .  if( pFd->nFet
306e0 63 68 4f 75 74 3e 30 20 29 20 72 65 74 75 72 6e  chOut>0 ) return
306f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69   SQLITE_OK;..  i
30700 66 28 20 6e 4d 61 70 3c 30 20 29 7b 0a 20 20 20  f( nMap<0 ){.   
30710 20 73 74 72 75 63 74 20 73 74 61 74 20 73 74 61   struct stat sta
30720 74 62 75 66 3b 20 20 20 20 20 20 20 20 20 20 2f  tbuf;          /
30730 2a 20 4c 6f 77 2d 6c 65 76 65 6c 20 66 69 6c 65  * Low-level file
30740 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a   information */.
30750 20 20 20 20 72 63 20 3d 20 6f 73 46 73 74 61 74      rc = osFstat
30760 28 70 46 64 2d 3e 68 2c 20 26 73 74 61 74 62 75  (pFd->h, &statbu
30770 66 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  f);.    if( rc!=
30780 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
30790 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
307a0 5f 49 4f 45 52 52 5f 46 53 54 41 54 3b 0a 20 20  _IOERR_FSTAT;.  
307b0 20 20 7d 0a 20 20 20 20 6e 4d 61 70 20 3d 20 73    }.    nMap = s
307c0 74 61 74 62 75 66 2e 73 74 5f 73 69 7a 65 3b 0a  tatbuf.st_size;.
307d0 20 20 7d 0a 20 20 69 66 28 20 6e 4d 61 70 3e 70    }.  if( nMap>p
307e0 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 20  Fd->mmapSizeMax 
307f0 29 7b 0a 20 20 20 20 6e 4d 61 70 20 3d 20 70 46  ){.    nMap = pF
30800 64 2d 3e 6d 6d 61 70 53 69 7a 65 4d 61 78 3b 0a  d->mmapSizeMax;.
30810 20 20 7d 0a 0a 20 20 69 66 28 20 6e 4d 61 70 21    }..  if( nMap!
30820 3d 70 46 64 2d 3e 6d 6d 61 70 53 69 7a 65 20 29  =pFd->mmapSize )
30830 7b 0a 20 20 20 20 69 66 28 20 6e 4d 61 70 3e 30  {.    if( nMap>0
30840 20 29 7b 0a 20 20 20 20 20 20 75 6e 69 78 52 65   ){.      unixRe
30850 6d 61 70 66 69 6c 65 28 70 46 64 2c 20 6e 4d 61  mapfile(pFd, nMa
30860 70 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  p);.    }else{. 
30870 20 20 20 20 20 75 6e 69 78 55 6e 6d 61 70 66 69       unixUnmapfi
30880 6c 65 28 70 46 64 29 3b 0a 20 20 20 20 7d 0a 20  le(pFd);.    }. 
30890 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   }..  return SQL
308a0 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
308b0 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d   /* SQLITE_MAX_M
308c0 4d 41 50 5f 53 49 5a 45 3e 30 20 2a 2f 0a 0a 2f  MAP_SIZE>0 */../
308d0 2a 0a 2a 2a 20 49 66 20 70 6f 73 73 69 62 6c 65  *.** If possible
308e0 2c 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  , return a point
308f0 65 72 20 74 6f 20 61 20 6d 61 70 70 69 6e 67 20  er to a mapping 
30900 6f 66 20 66 69 6c 65 20 66 64 20 73 74 61 72 74  of file fd start
30910 69 6e 67 20 61 74 20 6f 66 66 73 65 74 0a 2a 2a  ing at offset.**
30920 20 69 4f 66 66 2e 20 54 68 65 20 6d 61 70 70 69   iOff. The mappi
30930 6e 67 20 6d 75 73 74 20 62 65 20 76 61 6c 69 64  ng must be valid
30940 20 66 6f 72 20 61 74 20 6c 65 61 73 74 20 6e 41   for at least nA
30950 6d 74 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20  mt bytes..**.** 
30960 49 66 20 73 75 63 68 20 61 20 70 6f 69 6e 74 65  If such a pointe
30970 72 20 63 61 6e 20 62 65 20 6f 62 74 61 69 6e 65  r can be obtaine
30980 64 2c 20 73 74 6f 72 65 20 69 74 20 69 6e 20 2a  d, store it in *
30990 70 70 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51  pp and return SQ
309a0 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 4f 72 2c 20  LITE_OK..** Or, 
309b0 69 66 20 6f 6e 65 20 63 61 6e 6e 6f 74 20 62 75  if one cannot bu
309c0 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72  t no error occur
309d0 73 2c 20 73 65 74 20 2a 70 70 20 74 6f 20 30 20  s, set *pp to 0 
309e0 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54  and return SQLIT
309f0 45 5f 4f 4b 2e 0a 2a 2a 20 46 69 6e 61 6c 6c 79  E_OK..** Finally
30a00 2c 20 69 66 20 61 6e 20 65 72 72 6f 72 20 64 6f  , if an error do
30a10 65 73 20 6f 63 63 75 72 2c 20 72 65 74 75 72 6e  es occur, return
30a20 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
30a30 20 63 6f 64 65 2e 20 54 68 65 20 66 69 6e 61 6c   code. The final
30a40 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 2a 70 70  .** value of *pp
30a50 20 69 73 20 75 6e 64 65 66 69 6e 65 64 20 69 6e   is undefined in
30a60 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a   this case..**.*
30a70 2a 20 49 66 20 74 68 69 73 20 66 75 6e 63 74 69  * If this functi
30a80 6f 6e 20 64 6f 65 73 20 72 65 74 75 72 6e 20 61  on does return a
30a90 20 70 6f 69 6e 74 65 72 2c 20 74 68 65 20 63 61   pointer, the ca
30aa0 6c 6c 65 72 20 6d 75 73 74 20 65 76 65 6e 74 75  ller must eventu
30ab0 61 6c 6c 79 20 0a 2a 2a 20 72 65 6c 65 61 73 65  ally .** release
30ac0 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 62   the reference b
30ad0 79 20 63 61 6c 6c 69 6e 67 20 75 6e 69 78 55 6e  y calling unixUn
30ae0 66 65 74 63 68 28 29 2e 0a 2a 2f 0a 73 74 61 74  fetch()..*/.stat
30af0 69 63 20 69 6e 74 20 75 6e 69 78 46 65 74 63 68  ic int unixFetch
30b00 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66  (sqlite3_file *f
30b10 64 2c 20 69 36 34 20 69 4f 66 66 2c 20 69 6e 74  d, i64 iOff, int
30b20 20 6e 41 6d 74 2c 20 76 6f 69 64 20 2a 2a 70 70   nAmt, void **pp
30b30 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  ){.#if SQLITE_MA
30b40 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e 30 0a 20 20  X_MMAP_SIZE>0.  
30b50 75 6e 69 78 46 69 6c 65 20 2a 70 46 64 20 3d 20  unixFile *pFd = 
30b60 28 75 6e 69 78 46 69 6c 65 20 2a 29 66 64 3b 20  (unixFile *)fd; 
30b70 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79    /* The underly
30b80 69 6e 67 20 64 61 74 61 62 61 73 65 20 66 69 6c  ing database fil
30b90 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 2a 70  e */.#endif.  *p
30ba0 70 20 3d 20 30 3b 0a 0a 23 69 66 20 53 51 4c 49  p = 0;..#if SQLI
30bb0 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
30bc0 3e 30 0a 20 20 69 66 28 20 70 46 64 2d 3e 6d 6d  >0.  if( pFd->mm
30bd0 61 70 53 69 7a 65 4d 61 78 3e 30 20 29 7b 0a 20  apSizeMax>0 ){. 
30be0 20 20 20 69 66 28 20 70 46 64 2d 3e 70 4d 61 70     if( pFd->pMap
30bf0 52 65 67 69 6f 6e 3d 3d 30 20 29 7b 0a 20 20 20  Region==0 ){.   
30c00 20 20 20 69 6e 74 20 72 63 20 3d 20 75 6e 69 78     int rc = unix
30c10 4d 61 70 66 69 6c 65 28 70 46 64 2c 20 2d 31 29  Mapfile(pFd, -1)
30c20 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
30c30 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
30c40 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
30c50 20 69 66 28 20 70 46 64 2d 3e 6d 6d 61 70 53 69   if( pFd->mmapSi
30c60 7a 65 20 3e 3d 20 69 4f 66 66 2b 6e 41 6d 74 20  ze >= iOff+nAmt 
30c70 29 7b 0a 20 20 20 20 20 20 2a 70 70 20 3d 20 26  ){.      *pp = &
30c80 28 28 75 38 20 2a 29 70 46 64 2d 3e 70 4d 61 70  ((u8 *)pFd->pMap
30c90 52 65 67 69 6f 6e 29 5b 69 4f 66 66 5d 3b 0a 20  Region)[iOff];. 
30ca0 20 20 20 20 20 70 46 64 2d 3e 6e 46 65 74 63 68       pFd->nFetch
30cb0 4f 75 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d  Out++;.    }.  }
30cc0 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
30cd0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
30ce0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 74 68 69 72  *.** If the thir
30cf0 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f  d argument is no
30d00 6e 2d 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 69  n-NULL, then thi
30d10 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 6c 65 61  s function relea
30d20 73 65 73 20 61 20 0a 2a 2a 20 72 65 66 65 72 65  ses a .** refere
30d30 6e 63 65 20 6f 62 74 61 69 6e 65 64 20 62 79 20  nce obtained by 
30d40 61 6e 20 65 61 72 6c 69 65 72 20 63 61 6c 6c 20  an earlier call 
30d50 74 6f 20 75 6e 69 78 46 65 74 63 68 28 29 2e 20  to unixFetch(). 
30d60 54 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 61 72  The second.** ar
30d70 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f  gument passed to
30d80 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d   this function m
30d90 75 73 74 20 62 65 20 74 68 65 20 73 61 6d 65 20  ust be the same 
30da0 61 73 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  as the correspon
30db0 64 69 6e 67 0a 2a 2a 20 61 72 67 75 6d 65 6e 74  ding.** argument
30dc0 20 74 68 61 74 20 77 61 73 20 70 61 73 73 65 64   that was passed
30dd0 20 74 6f 20 74 68 65 20 75 6e 69 78 46 65 74 63   to the unixFetc
30de0 68 28 29 20 69 6e 76 6f 63 61 74 69 6f 6e 2e 20  h() invocation. 
30df0 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 66 20 74 68  .**.** Or, if th
30e00 65 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74  e third argument
30e10 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74   is NULL, then t
30e20 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
30e30 62 65 69 6e 67 20 63 61 6c 6c 65 64 20 0a 2a 2a  being called .**
30e40 20 74 6f 20 69 6e 66 6f 72 6d 20 74 68 65 20 56   to inform the V
30e50 46 53 20 6c 61 79 65 72 20 74 68 61 74 2c 20 61  FS layer that, a
30e60 63 63 6f 72 64 69 6e 67 20 74 6f 20 50 4f 53 49  ccording to POSI
30e70 58 2c 20 61 6e 79 20 65 78 69 73 74 69 6e 67 20  X, any existing 
30e80 6d 61 70 70 69 6e 67 20 0a 2a 2a 20 6d 61 79 20  mapping .** may 
30e90 6e 6f 77 20 62 65 20 69 6e 76 61 6c 69 64 20 61  now be invalid a
30ea0 6e 64 20 73 68 6f 75 6c 64 20 62 65 20 75 6e 6d  nd should be unm
30eb0 61 70 70 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  apped..*/.static
30ec0 20 69 6e 74 20 75 6e 69 78 55 6e 66 65 74 63 68   int unixUnfetch
30ed0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66  (sqlite3_file *f
30ee0 64 2c 20 69 36 34 20 69 4f 66 66 2c 20 76 6f 69  d, i64 iOff, voi
30ef0 64 20 2a 70 29 7b 0a 23 69 66 20 53 51 4c 49 54  d *p){.#if SQLIT
30f00 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3e  E_MAX_MMAP_SIZE>
30f10 30 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  0.  unixFile *pF
30f20 64 20 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29  d = (unixFile *)
30f30 66 64 3b 20 20 20 2f 2a 20 54 68 65 20 75 6e 64  fd;   /* The und
30f40 65 72 6c 79 69 6e 67 20 64 61 74 61 62 61 73 65  erlying database
30f50 20 66 69 6c 65 20 2a 2f 0a 20 20 55 4e 55 53 45   file */.  UNUSE
30f60 44 5f 50 41 52 41 4d 45 54 45 52 28 69 4f 66 66  D_PARAMETER(iOff
30f70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 3d 3d 30  );..  /* If p==0
30f80 20 28 75 6e 6d 61 70 20 74 68 65 20 65 6e 74 69   (unmap the enti
30f90 72 65 20 66 69 6c 65 29 20 74 68 65 6e 20 74 68  re file) then th
30fa0 65 72 65 20 6d 75 73 74 20 62 65 20 6e 6f 20 6f  ere must be no o
30fb0 75 74 73 74 61 6e 64 69 6e 67 20 0a 20 20 2a 2a  utstanding .  **
30fc0 20 78 46 65 74 63 68 20 72 65 66 65 72 65 6e 63   xFetch referenc
30fd0 65 73 2e 20 4f 72 2c 20 69 66 20 70 21 3d 30 20  es. Or, if p!=0 
30fe0 28 6d 65 61 6e 69 6e 67 20 69 74 20 69 73 20 61  (meaning it is a
30ff0 6e 20 78 46 65 74 63 68 20 72 65 66 65 72 65 6e  n xFetch referen
31000 63 65 29 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 74  ce),.  ** then t
31010 68 65 72 65 20 6d 75 73 74 20 62 65 20 61 74 20  here must be at 
31020 6c 65 61 73 74 20 6f 6e 65 20 6f 75 74 73 74 61  least one outsta
31030 6e 64 69 6e 67 2e 20 20 2a 2f 0a 20 20 61 73 73  nding.  */.  ass
31040 65 72 74 28 20 28 70 3d 3d 30 29 3d 3d 28 70 46  ert( (p==0)==(pF
31050 64 2d 3e 6e 46 65 74 63 68 4f 75 74 3d 3d 30 29  d->nFetchOut==0)
31060 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 21 3d   );..  /* If p!=
31070 30 2c 20 69 74 20 6d 75 73 74 20 6d 61 74 63 68  0, it must match
31080 20 74 68 65 20 69 4f 66 66 20 76 61 6c 75 65 2e   the iOff value.
31090 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 3d   */.  assert( p=
310a0 3d 30 20 7c 7c 20 70 3d 3d 26 28 28 75 38 20 2a  =0 || p==&((u8 *
310b0 29 70 46 64 2d 3e 70 4d 61 70 52 65 67 69 6f 6e  )pFd->pMapRegion
310c0 29 5b 69 4f 66 66 5d 20 29 3b 0a 0a 20 20 69 66  )[iOff] );..  if
310d0 28 20 70 20 29 7b 0a 20 20 20 20 70 46 64 2d 3e  ( p ){.    pFd->
310e0 6e 46 65 74 63 68 4f 75 74 2d 2d 3b 0a 20 20 7d  nFetchOut--;.  }
310f0 65 6c 73 65 7b 0a 20 20 20 20 75 6e 69 78 55 6e  else{.    unixUn
31100 6d 61 70 66 69 6c 65 28 70 46 64 29 3b 0a 20 20  mapfile(pFd);.  
31110 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70 46 64  }..  assert( pFd
31120 2d 3e 6e 46 65 74 63 68 4f 75 74 3e 3d 30 20 29  ->nFetchOut>=0 )
31130 3b 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44  ;.#else.  UNUSED
31140 5f 50 41 52 41 4d 45 54 45 52 28 66 64 29 3b 0a  _PARAMETER(fd);.
31150 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
31160 45 52 28 70 29 3b 0a 20 20 55 4e 55 53 45 44 5f  ER(p);.  UNUSED_
31170 50 41 52 41 4d 45 54 45 52 28 69 4f 66 66 29 3b  PARAMETER(iOff);
31180 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
31190 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
311a0 2a 0a 2a 2a 20 48 65 72 65 20 65 6e 64 73 20 74  *.** Here ends t
311b0 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
311c0 6e 20 6f 66 20 61 6c 6c 20 73 71 6c 69 74 65 33  n of all sqlite3
311d0 5f 66 69 6c 65 20 6d 65 74 68 6f 64 73 2e 0a 2a  _file methods..*
311e0 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
311f0 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 73 71 6c  ******** End sql
31200 69 74 65 33 5f 66 69 6c 65 20 4d 65 74 68 6f 64  ite3_file Method
31210 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  s **************
31220 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
31230 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
31240 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
31250 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
31260 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
31270 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
31280 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 64 69  /../*.** This di
31290 76 69 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20  vision contains 
312a0 64 65 66 69 6e 69 74 69 6f 6e 73 20 6f 66 20 73  definitions of s
312b0 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
312c0 73 20 6f 62 6a 65 63 74 73 20 74 68 61 74 0a 2a  s objects that.*
312d0 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 76 61 72 69  * implement vari
312e0 6f 75 73 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67  ous file locking
312f0 20 73 74 72 61 74 65 67 69 65 73 2e 20 20 49 74   strategies.  It
31300 20 61 6c 73 6f 20 63 6f 6e 74 61 69 6e 73 20 64   also contains d
31310 65 66 69 6e 69 74 69 6f 6e 73 0a 2a 2a 20 6f 66  efinitions.** of
31320 20 22 66 69 6e 64 65 72 22 20 66 75 6e 63 74 69   "finder" functi
31330 6f 6e 73 2e 20 20 41 20 66 69 6e 64 65 72 2d 66  ons.  A finder-f
31340 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
31350 74 6f 20 6c 6f 63 61 74 65 20 74 68 65 20 61 70  to locate the ap
31360 70 72 6f 70 72 69 61 74 65 0a 2a 2a 20 73 71 6c  propriate.** sql
31370 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
31380 6f 62 6a 65 63 74 20 66 6f 72 20 61 20 70 61 72  object for a par
31390 74 69 63 75 6c 61 72 20 64 61 74 61 62 61 73 65  ticular database
313a0 20 66 69 6c 65 2e 20 20 54 68 65 20 70 41 70 70   file.  The pApp
313b0 44 61 74 61 0a 2a 2a 20 66 69 65 6c 64 20 6f 66  Data.** field of
313c0 20 74 68 65 20 73 71 6c 69 74 65 33 5f 76 66 73   the sqlite3_vfs
313d0 20 56 46 53 20 6f 62 6a 65 63 74 73 20 61 72 65   VFS objects are
313e0 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20   initialized to 
313f0 62 65 20 70 6f 69 6e 74 65 72 73 20 74 6f 0a 2a  be pointers to.*
31400 2a 20 74 68 65 20 63 6f 72 72 65 63 74 20 66 69  * the correct fi
31410 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 66 6f  nder-function fo
31420 72 20 74 68 61 74 20 56 46 53 2e 0a 2a 2a 0a 2a  r that VFS..**.*
31430 2a 20 4d 6f 73 74 20 66 69 6e 64 65 72 20 66 75  * Most finder fu
31440 6e 63 74 69 6f 6e 73 20 72 65 74 75 72 6e 20 61  nctions return a
31450 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 69   pointer to a fi
31460 78 65 64 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  xed sqlite3_io_m
31470 65 74 68 6f 64 73 0a 2a 2a 20 6f 62 6a 65 63 74  ethods.** object
31480 2e 20 20 54 68 65 20 6f 6e 6c 79 20 69 6e 74 65  .  The only inte
31490 72 65 73 74 69 6e 67 20 66 69 6e 64 65 72 2d 66  resting finder-f
314a0 75 6e 63 74 69 6f 6e 20 69 73 20 61 75 74 6f 6c  unction is autol
314b0 6f 63 6b 49 6f 46 69 6e 64 65 72 2c 20 77 68 69  ockIoFinder, whi
314c0 63 68 0a 2a 2a 20 6c 6f 6f 6b 73 20 61 74 20 74  ch.** looks at t
314d0 68 65 20 66 69 6c 65 73 79 73 74 65 6d 20 74 79  he filesystem ty
314e0 70 65 20 61 6e 64 20 74 72 69 65 73 20 74 6f 20  pe and tries to 
314f0 67 75 65 73 73 20 74 68 65 20 62 65 73 74 20 6c  guess the best l
31500 6f 63 6b 69 6e 67 0a 2a 2a 20 73 74 72 61 74 65  ocking.** strate
31510 67 79 20 66 72 6f 6d 20 74 68 61 74 2e 0a 2a 2a  gy from that..**
31520 0a 2a 2a 20 46 6f 72 20 66 69 6e 64 65 72 2d 66  .** For finder-f
31530 75 6e 63 74 69 6f 6e 20 46 2c 20 74 77 6f 20 6f  unction F, two o
31540 62 6a 65 63 74 73 20 61 72 65 20 63 72 65 61 74  bjects are creat
31550 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29  ed:.**.**    (1)
31560 20 54 68 65 20 72 65 61 6c 20 66 69 6e 64 65 72   The real finder
31570 2d 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 64 20  -function named 
31580 22 46 49 6d 70 74 28 29 22 2e 0a 2a 2a 0a 2a 2a  "FImpt()"..**.**
31590 20 20 20 20 28 32 29 20 41 20 63 6f 6e 73 74 61      (2) A consta
315a0 6e 74 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68  nt pointer to th
315b0 69 73 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  is function name
315c0 64 20 6a 75 73 74 20 22 46 22 2e 0a 2a 2a 0a 2a  d just "F"..**.*
315d0 2a 0a 2a 2a 20 41 20 70 6f 69 6e 74 65 72 20 74  *.** A pointer t
315e0 6f 20 74 68 65 20 46 20 70 6f 69 6e 74 65 72 20  o the F pointer 
315f0 69 73 20 75 73 65 64 20 61 73 20 74 68 65 20 70  is used as the p
31600 41 70 70 44 61 74 61 20 76 61 6c 75 65 20 66 6f  AppData value fo
31610 72 20 56 46 53 0a 2a 2a 20 6f 62 6a 65 63 74 73  r VFS.** objects
31620 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20 64 6f  .  We have to do
31630 20 74 68 69 73 20 69 6e 73 74 65 61 64 20 6f 66   this instead of
31640 20 6c 65 74 74 69 6e 67 20 70 41 70 70 44 61 74   letting pAppDat
31650 61 20 70 6f 69 6e 74 0a 2a 2a 20 64 69 72 65 63  a point.** direc
31660 74 6c 79 20 61 74 20 74 68 65 20 66 69 6e 64 65  tly at the finde
31670 72 2d 66 75 6e 63 74 69 6f 6e 20 73 69 6e 63 65  r-function since
31680 20 43 39 30 20 72 75 6c 65 73 20 70 72 65 76 65   C90 rules preve
31690 6e 74 20 61 20 76 6f 69 64 2a 0a 2a 2a 20 66 72  nt a void*.** fr
316a0 6f 6d 20 62 65 20 63 61 73 74 20 69 6e 74 6f 20  om be cast into 
316b0 61 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74  a function point
316c0 65 72 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 45 61 63  er..**.**.** Eac
316d0 68 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  h instance of th
316e0 69 73 20 6d 61 63 72 6f 20 67 65 6e 65 72 61 74  is macro generat
316f0 65 73 20 74 77 6f 20 6f 62 6a 65 63 74 73 3a 0a  es two objects:.
31700 2a 2a 0a 2a 2a 20 20 20 2a 20 20 41 20 63 6f 6e  **.**   *  A con
31710 73 74 61 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f  stant sqlite3_io
31720 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20  _methods object 
31730 63 61 6c 6c 20 4d 45 54 48 4f 44 20 74 68 61 74  call METHOD that
31740 20 68 61 73 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20   has locking.** 
31750 20 20 20 20 20 6d 65 74 68 6f 64 73 20 43 4c 4f       methods CLO
31760 53 45 2c 20 4c 4f 43 4b 2c 20 55 4e 4c 4f 43 4b  SE, LOCK, UNLOCK
31770 2c 20 43 4b 52 45 53 4c 4f 43 4b 2e 0a 2a 2a 0a  , CKRESLOCK..**.
31780 2a 2a 20 20 20 2a 20 20 41 6e 20 49 2f 4f 20 6d  **   *  An I/O m
31790 65 74 68 6f 64 20 66 69 6e 64 65 72 20 66 75 6e  ethod finder fun
317a0 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20 46 49 4e  ction called FIN
317b0 44 45 52 20 74 68 61 74 20 72 65 74 75 72 6e 73  DER that returns
317c0 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 20 20   a pointer.**   
317d0 20 20 20 74 6f 20 74 68 65 20 4d 45 54 48 4f 44     to the METHOD
317e0 20 6f 62 6a 65 63 74 20 69 6e 20 74 68 65 20 70   object in the p
317f0 72 65 76 69 6f 75 73 20 62 75 6c 6c 65 74 2e 0a  revious bullet..
31800 2a 2f 0a 23 64 65 66 69 6e 65 20 49 4f 4d 45 54  */.#define IOMET
31810 48 4f 44 53 28 46 49 4e 44 45 52 2c 4d 45 54 48  HODS(FINDER,METH
31820 4f 44 2c 56 45 52 53 49 4f 4e 2c 43 4c 4f 53 45  OD,VERSION,CLOSE
31830 2c 4c 4f 43 4b 2c 55 4e 4c 4f 43 4b 2c 43 4b 4c  ,LOCK,UNLOCK,CKL
31840 4f 43 4b 2c 53 48 4d 4d 41 50 29 20 20 20 20 20  OCK,SHMMAP)     
31850 5c 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73  \.static const s
31860 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
31870 73 20 4d 45 54 48 4f 44 20 3d 20 7b 20 20 20 20  s METHOD = {    
31880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
318a0 0a 20 20 20 56 45 52 53 49 4f 4e 2c 20 20 20 20  .   VERSION,    
318b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
318c0 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 20 20  /* iVersion */  
318d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
318e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
318f0 20 20 20 43 4c 4f 53 45 2c 20 20 20 20 20 20 20     CLOSE,       
31900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
31910 2a 20 78 43 6c 6f 73 65 20 2a 2f 20 20 20 20 20  * xClose */     
31920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31930 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
31940 20 20 75 6e 69 78 52 65 61 64 2c 20 20 20 20 20    unixRead,     
31950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
31960 20 78 52 65 61 64 20 2a 2f 20 20 20 20 20 20 20   xRead */       
31970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31980 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
31990 20 75 6e 69 78 57 72 69 74 65 2c 20 20 20 20 20   unixWrite,     
319a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
319b0 78 57 72 69 74 65 20 2a 2f 20 20 20 20 20 20 20  xWrite */       
319c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
319d0 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
319e0 75 6e 69 78 54 72 75 6e 63 61 74 65 2c 20 20 20  unixTruncate,   
319f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
31a00 54 72 75 6e 63 61 74 65 20 2a 2f 20 20 20 20 20  Truncate */     
31a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31a20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75            \.   u
31a30 6e 69 78 53 79 6e 63 2c 20 20 20 20 20 20 20 20  nixSync,        
31a40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
31a50 79 6e 63 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ync */          
31a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31a70 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e           \.   un
31a80 69 78 46 69 6c 65 53 69 7a 65 2c 20 20 20 20 20  ixFileSize,     
31a90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69            /* xFi
31aa0 6c 65 53 69 7a 65 20 2a 2f 20 20 20 20 20 20 20  leSize */       
31ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31ac0 20 20 20 20 20 20 20 20 5c 0a 20 20 20 4c 4f 43          \.   LOC
31ad0 4b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K,              
31ae0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63           /* xLoc
31af0 6b 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  k */            
31b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31b10 20 20 20 20 20 20 20 5c 0a 20 20 20 55 4e 4c 4f         \.   UNLO
31b20 43 4b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  CK,             
31b30 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f          /* xUnlo
31b40 63 6b 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  ck */           
31b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31b60 20 20 20 20 20 20 5c 0a 20 20 20 43 4b 4c 4f 43        \.   CKLOC
31b70 4b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K,              
31b80 20 20 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b         /* xCheck
31b90 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 2a 2f 20  ReservedLock */ 
31ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31bb0 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 46 69       \.   unixFi
31bc0 6c 65 43 6f 6e 74 72 6f 6c 2c 20 20 20 20 20 20  leControl,      
31bd0 20 20 20 20 20 20 2f 2a 20 78 46 69 6c 65 43 6f        /* xFileCo
31be0 6e 74 72 6f 6c 20 2a 2f 20 20 20 20 20 20 20 20  ntrol */        
31bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31c00 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 65 63      \.   unixSec
31c10 74 6f 72 53 69 7a 65 2c 20 20 20 20 20 20 20 20  torSize,        
31c20 20 20 20 20 20 2f 2a 20 78 53 65 63 74 6f 72 53       /* xSectorS
31c30 69 7a 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ize */          
31c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31c50 20 20 20 5c 0a 20 20 20 75 6e 69 78 44 65 76 69     \.   unixDevi
31c60 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
31c70 73 2c 20 20 2f 2a 20 78 44 65 76 69 63 65 43 61  s,  /* xDeviceCa
31c80 70 61 62 69 6c 69 74 69 65 73 20 2a 2f 20 20 20  pabilities */   
31c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31ca0 20 20 5c 0a 20 20 20 53 48 4d 4d 41 50 2c 20 20    \.   SHMMAP,  
31cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31cc0 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20 2a 2f     /* xShmMap */
31cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31cf0 20 5c 0a 20 20 20 75 6e 69 78 53 68 6d 4c 6f 63   \.   unixShmLoc
31d00 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
31d10 20 20 2f 2a 20 78 53 68 6d 4c 6f 63 6b 20 2a 2f    /* xShmLock */
31d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31d40 5c 0a 20 20 20 75 6e 69 78 53 68 6d 42 61 72 72  \.   unixShmBarr
31d50 69 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ier,            
31d60 20 2f 2a 20 78 53 68 6d 42 61 72 72 69 65 72 20   /* xShmBarrier 
31d70 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  */              
31d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
31d90 0a 20 20 20 75 6e 69 78 53 68 6d 55 6e 6d 61 70  .   unixShmUnmap
31da0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
31db0 2f 2a 20 78 53 68 6d 55 6e 6d 61 70 20 2a 2f 20  /* xShmUnmap */ 
31dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
31de0 20 20 20 75 6e 69 78 46 65 74 63 68 2c 20 20 20     unixFetch,   
31df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
31e00 2a 20 78 46 65 74 63 68 20 2a 2f 20 20 20 20 20  * xFetch */     
31e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31e20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
31e30 20 20 75 6e 69 78 55 6e 66 65 74 63 68 2c 20 20    unixUnfetch,  
31e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
31e50 20 78 55 6e 66 65 74 63 68 20 2a 2f 20 20 20 20   xUnfetch */    
31e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31e70 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 7d 3b              \.};
31e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31ec0 20 20 20 20 20 20 20 20 20 20 20 5c 0a 73 74 61             \.sta
31ed0 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  tic const sqlite
31ee0 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 46 49  3_io_methods *FI
31ef0 4e 44 45 52 23 23 49 6d 70 6c 28 63 6f 6e 73 74  NDER##Impl(const
31f00 20 63 68 61 72 20 2a 7a 2c 20 75 6e 69 78 46 69   char *z, unixFi
31f10 6c 65 20 2a 70 29 7b 20 20 20 5c 0a 20 20 55 4e  le *p){   \.  UN
31f20 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 7a  USED_PARAMETER(z
31f30 29 3b 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  ); UNUSED_PARAME
31f40 54 45 52 28 70 29 3b 20 20 20 20 20 20 20 20 20  TER(p);         
31f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31f60 20 20 20 20 20 20 20 20 20 5c 0a 20 20 72 65 74           \.  ret
31f70 75 72 6e 20 26 4d 45 54 48 4f 44 3b 20 20 20 20  urn &METHOD;    
31f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31fb0 20 20 20 20 20 20 20 20 5c 0a 7d 20 20 20 20 20          \.}     
31fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32000 20 20 20 20 20 20 20 5c 0a 73 74 61 74 69 63 20         \.static 
32010 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f  const sqlite3_io
32020 5f 6d 65 74 68 6f 64 73 20 2a 28 2a 63 6f 6e 73  _methods *(*cons
32030 74 20 46 49 4e 44 45 52 29 28 63 6f 6e 73 74 20  t FINDER)(const 
32040 63 68 61 72 2a 2c 75 6e 69 78 46 69 6c 65 20 2a  char*,unixFile *
32050 70 29 20 20 20 20 5c 0a 20 20 20 20 3d 20 46 49  p)    \.    = FI
32060 4e 44 45 52 23 23 49 6d 70 6c 3b 0a 0a 2f 2a 0a  NDER##Impl;../*.
32070 2a 2a 20 48 65 72 65 20 61 72 65 20 61 6c 6c 20  ** Here are all 
32080 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69  of the sqlite3_i
32090 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74  o_methods object
320a0 73 20 66 6f 72 20 65 61 63 68 20 6f 66 20 74 68  s for each of th
320b0 65 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 73 74 72  e.** locking str
320c0 61 74 65 67 69 65 73 2e 20 20 46 75 6e 63 74 69  ategies.  Functi
320d0 6f 6e 73 20 74 68 61 74 20 72 65 74 75 72 6e 20  ons that return 
320e0 70 6f 69 6e 74 65 72 73 20 74 6f 20 74 68 65 73  pointers to thes
320f0 65 20 6d 65 74 68 6f 64 73 0a 2a 2a 20 61 72 65  e methods.** are
32100 20 61 6c 73 6f 20 63 72 65 61 74 65 64 2e 0a 2a   also created..*
32110 2f 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 70  /.IOMETHODS(.  p
32120 6f 73 69 78 49 6f 46 69 6e 64 65 72 2c 20 20 20  osixIoFinder,   
32130 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64           /* Find
32140 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  er function name
32150 20 2a 2f 0a 20 20 70 6f 73 69 78 49 6f 4d 65 74   */.  posixIoMet
32160 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20 20  hods,           
32170 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65  /* sqlite3_io_me
32180 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d  thods object nam
32190 65 20 2a 2f 0a 20 20 33 2c 20 20 20 20 20 20 20  e */.  3,       
321a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
321b0 20 2f 2a 20 73 68 61 72 65 64 20 6d 65 6d 6f 72   /* shared memor
321c0 79 20 61 6e 64 20 6d 6d 61 70 20 61 72 65 20 65  y and mmap are e
321d0 6e 61 62 6c 65 64 20 2a 2f 0a 20 20 75 6e 69 78  nabled */.  unix
321e0 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20  Close,          
321f0 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20        /* xClose 
32200 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78  method */.  unix
32210 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  Lock,           
32220 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d        /* xLock m
32230 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 55  ethod */.  unixU
32240 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  nlock,          
32250 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20       /* xUnlock 
32260 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e 69 78  method */.  unix
32270 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
32280 6b 2c 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52  k,    /* xCheckR
32290 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68  eservedLock meth
322a0 6f 64 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 4d  od */.  unixShmM
322b0 61 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ap              
322c0 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20 6d 65 74    /* xShmMap met
322d0 68 6f 64 20 2a 2f 0a 29 0a 49 4f 4d 45 54 48 4f  hod */.).IOMETHO
322e0 44 53 28 0a 20 20 6e 6f 6c 6f 63 6b 49 6f 46 69  DS(.  nolockIoFi
322f0 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  nder,           
32300 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69  /* Finder functi
32310 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 6e 6f 6c  on name */.  nol
32320 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20  ockIoMethods,   
32330 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65         /* sqlite
32340 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a  3_io_methods obj
32350 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 32 2c  ect name */.  2,
32360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32370 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72 65          /* share
32380 64 20 6d 65 6d 6f 72 79 20 69 73 20 65 6e 61 62  d memory is enab
32390 6c 65 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 43  led */.  nolockC
323a0 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  lose,           
323b0 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74     /* xClose met
323c0 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 4c  hod */.  nolockL
323d0 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
323e0 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68     /* xLock meth
323f0 6f 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 55 6e  od */.  nolockUn
32400 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  lock,           
32410 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74    /* xUnlock met
32420 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 43  hod */.  nolockC
32430 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
32440 2c 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65  ,  /* xCheckRese
32450 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  rvedLock method 
32460 2a 2f 0a 20 20 30 20 20 20 20 20 20 20 20 20 20  */.  0          
32470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
32480 2a 20 78 53 68 6d 4d 61 70 20 6d 65 74 68 6f 64  * xShmMap method
32490 20 2a 2f 0a 29 0a 49 4f 4d 45 54 48 4f 44 53 28   */.).IOMETHODS(
324a0 0a 20 20 64 6f 74 6c 6f 63 6b 49 6f 46 69 6e 64  .  dotlockIoFind
324b0 65 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  er,          /* 
324c0 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20  Finder function 
324d0 6e 61 6d 65 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63  name */.  dotloc
324e0 6b 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20  kIoMethods,     
324f0 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69      /* sqlite3_i
32500 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74  o_methods object
32510 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20   name */.  1,   
32520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32530 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d       /* shared m
32540 65 6d 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65  emory is disable
32550 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 43 6c  d */.  dotlockCl
32560 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ose,            
32570 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f   /* xClose metho
32580 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 4c 6f  d */.  dotlockLo
32590 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
325a0 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64   /* xLock method
325b0 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 55 6e 6c   */.  dotlockUnl
325c0 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
325d0 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f  /* xUnlock metho
325e0 64 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b 43 68  d */.  dotlockCh
325f0 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c  eckReservedLock,
32600 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76   /* xCheckReserv
32610 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f  edLock method */
32620 0a 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20  .  0            
32630 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
32640 78 53 68 6d 4d 61 70 20 6d 65 74 68 6f 64 20 2a  xShmMap method *
32650 2f 0a 29 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  /.)..#if SQLITE_
32660 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
32670 54 59 4c 45 0a 49 4f 4d 45 54 48 4f 44 53 28 0a  TYLE.IOMETHODS(.
32680 20 20 66 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 2c    flockIoFinder,
32690 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
326a0 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e  inder function n
326b0 61 6d 65 20 2a 2f 0a 20 20 66 6c 6f 63 6b 49 6f  ame */.  flockIo
326c0 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20  Methods,        
326d0 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f     /* sqlite3_io
326e0 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20  _methods object 
326f0 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20  name */.  1,    
32700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32710 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d 65      /* shared me
32720 6d 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65 64  mory is disabled
32730 20 2a 2f 0a 20 20 66 6c 6f 63 6b 43 6c 6f 73 65   */.  flockClose
32740 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
32750 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64  /* xClose method
32760 20 2a 2f 0a 20 20 66 6c 6f 63 6b 4c 6f 63 6b 2c   */.  flockLock,
32770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32780 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  /* xLock method 
32790 2a 2f 0a 20 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b  */.  flockUnlock
327a0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
327b0 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64  * xUnlock method
327c0 20 2a 2f 0a 20 20 66 6c 6f 63 6b 43 68 65 63 6b   */.  flockCheck
327d0 52 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20 20  ReservedLock,   
327e0 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65  /* xCheckReserve
327f0 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  dLock method */.
32800 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20    0             
32810 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
32820 53 68 6d 4d 61 70 20 6d 65 74 68 6f 64 20 2a 2f  ShmMap method */
32830 0a 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 4f  .).#endif..#if O
32840 53 5f 56 58 57 4f 52 4b 53 0a 49 4f 4d 45 54 48  S_VXWORKS.IOMETH
32850 4f 44 53 28 0a 20 20 73 65 6d 49 6f 46 69 6e 64  ODS(.  semIoFind
32860 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
32870 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74   /* Finder funct
32880 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 73 65  ion name */.  se
32890 6d 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20  mIoMethods,     
328a0 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74          /* sqlit
328b0 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62  e3_io_methods ob
328c0 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31  ject name */.  1
328d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
328e0 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68 61 72           /* shar
328f0 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64 69 73  ed memory is dis
32900 61 62 6c 65 64 20 2a 2f 0a 20 20 73 65 6d 58 43  abled */.  semXC
32910 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  lose,           
32920 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d       /* xClose m
32930 65 74 68 6f 64 20 2a 2f 0a 20 20 73 65 6d 58 4c  ethod */.  semXL
32940 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
32950 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65       /* xLock me
32960 74 68 6f 64 20 2a 2f 0a 20 20 73 65 6d 58 55 6e  thod */.  semXUn
32970 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  lock,           
32980 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d      /* xUnlock m
32990 65 74 68 6f 64 20 2a 2f 0a 20 20 73 65 6d 58 43  ethod */.  semXC
329a0 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
329b0 2c 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65  ,    /* xCheckRe
329c0 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f  servedLock metho
329d0 64 20 2a 2f 0a 20 20 30 20 20 20 20 20 20 20 20  d */.  0        
329e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
329f0 20 2f 2a 20 78 53 68 6d 4d 61 70 20 6d 65 74 68   /* xShmMap meth
32a00 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a  od */.).#endif..
32a10 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50  #if defined(__AP
32a20 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45  PLE__) && SQLITE
32a30 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
32a40 53 54 59 4c 45 0a 49 4f 4d 45 54 48 4f 44 53 28  STYLE.IOMETHODS(
32a50 0a 20 20 61 66 70 49 6f 46 69 6e 64 65 72 2c 20  .  afpIoFinder, 
32a60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
32a70 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20  Finder function 
32a80 6e 61 6d 65 20 2a 2f 0a 20 20 61 66 70 49 6f 4d  name */.  afpIoM
32a90 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20  ethods,         
32aa0 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69      /* sqlite3_i
32ab0 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74  o_methods object
32ac0 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20   name */.  1,   
32ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32ae0 20 20 20 20 20 2f 2a 20 73 68 61 72 65 64 20 6d       /* shared m
32af0 65 6d 6f 72 79 20 69 73 20 64 69 73 61 62 6c 65  emory is disable
32b00 64 20 2a 2f 0a 20 20 61 66 70 43 6c 6f 73 65 2c  d */.  afpClose,
32b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32b20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f   /* xClose metho
32b30 64 20 2a 2f 0a 20 20 61 66 70 4c 6f 63 6b 2c 20  d */.  afpLock, 
32b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32b50 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64   /* xLock method
32b60 20 2a 2f 0a 20 20 61 66 70 55 6e 6c 6f 63 6b 2c   */.  afpUnlock,
32b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32b80 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f  /* xUnlock metho
32b90 64 20 2a 2f 0a 20 20 61 66 70 43 68 65 63 6b 52  d */.  afpCheckR
32ba0 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20 20 20  eservedLock,    
32bb0 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76   /* xCheckReserv
32bc0 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f  edLock method */
32bd0 0a 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20  .  0            
32be0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
32bf0 78 53 68 6d 4d 61 70 20 6d 65 74 68 6f 64 20 2a  xShmMap method *
32c00 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  /.).#endif../*.*
32c10 2a 20 54 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b  * The proxy lock
32c20 69 6e 67 20 6d 65 74 68 6f 64 20 69 73 20 61 20  ing method is a 
32c30 22 73 75 70 65 72 2d 6d 65 74 68 6f 64 22 20 69  "super-method" i
32c40 6e 20 74 68 65 20 73 65 6e 73 65 20 74 68 61 74  n the sense that
32c50 20 69 74 0a 2a 2a 20 6f 70 65 6e 73 20 73 65 63   it.** opens sec
32c60 6f 6e 64 61 72 79 20 66 69 6c 65 20 64 65 73 63  ondary file desc
32c70 72 69 70 74 6f 72 73 20 66 6f 72 20 74 68 65 20  riptors for the 
32c80 63 6f 6e 63 68 20 61 6e 64 20 6c 6f 63 6b 20 66  conch and lock f
32c90 69 6c 65 73 20 61 6e 64 0a 2a 2a 20 69 74 20 75  iles and.** it u
32ca0 73 65 73 20 70 72 6f 78 79 2c 20 64 6f 74 2d 66  ses proxy, dot-f
32cb0 69 6c 65 2c 20 41 46 50 2c 20 61 6e 64 20 66 6c  ile, AFP, and fl
32cc0 6f 63 6b 28 29 20 6c 6f 63 6b 69 6e 67 20 6d 65  ock() locking me
32cd0 74 68 6f 64 73 20 6f 6e 20 74 68 6f 73 65 0a 2a  thods on those.*
32ce0 2a 20 73 65 63 6f 6e 64 61 72 79 20 66 69 6c 65  * secondary file
32cf0 73 2e 20 20 46 6f 72 20 74 68 69 73 20 72 65 61  s.  For this rea
32d00 73 6f 6e 2c 20 74 68 65 20 64 69 76 69 73 69 6f  son, the divisio
32d10 6e 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74  n that implement
32d20 73 0a 2a 2a 20 70 72 6f 78 79 20 6c 6f 63 6b 69  s.** proxy locki
32d30 6e 67 20 69 73 20 6c 6f 63 61 74 65 64 20 6d 75  ng is located mu
32d40 63 68 20 66 75 72 74 68 65 72 20 64 6f 77 6e 20  ch further down 
32d50 69 6e 20 74 68 65 20 66 69 6c 65 2e 20 20 42 75  in the file.  Bu
32d60 74 20 77 65 20 6e 65 65 64 0a 2a 2a 20 74 6f 20  t we need.** to 
32d70 67 6f 20 61 68 65 61 64 20 61 6e 64 20 64 65 66  go ahead and def
32d80 69 6e 65 20 74 68 65 20 73 71 6c 69 74 65 33 5f  ine the sqlite3_
32d90 69 6f 5f 6d 65 74 68 6f 64 73 20 61 6e 64 20 66  io_methods and f
32da0 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 0a 2a  inder function.*
32db0 2a 20 66 6f 72 20 70 72 6f 78 79 20 6c 6f 63 6b  * for proxy lock
32dc0 69 6e 67 20 68 65 72 65 2e 20 20 53 6f 20 77 65  ing here.  So we
32dd0 20 66 6f 72 77 61 72 64 20 64 65 63 6c 61 72 65   forward declare
32de0 20 74 68 65 20 49 2f 4f 20 6d 65 74 68 6f 64 73   the I/O methods
32df0 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64  ..*/.#if defined
32e00 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53  (__APPLE__) && S
32e10 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
32e20 4b 49 4e 47 5f 53 54 59 4c 45 0a 73 74 61 74 69  KING_STYLE.stati
32e30 63 20 69 6e 74 20 70 72 6f 78 79 43 6c 6f 73 65  c int proxyClose
32e40 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 3b  (sqlite3_file*);
32e50 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
32e60 79 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  yLock(sqlite3_fi
32e70 6c 65 2a 2c 20 69 6e 74 29 3b 0a 73 74 61 74 69  le*, int);.stati
32e80 63 20 69 6e 74 20 70 72 6f 78 79 55 6e 6c 6f 63  c int proxyUnloc
32e90 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c  k(sqlite3_file*,
32ea0 20 69 6e 74 29 3b 0a 73 74 61 74 69 63 20 69 6e   int);.static in
32eb0 74 20 70 72 6f 78 79 43 68 65 63 6b 52 65 73 65  t proxyCheckRese
32ec0 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33  rvedLock(sqlite3
32ed0 5f 66 69 6c 65 2a 2c 20 69 6e 74 2a 29 3b 0a 49  _file*, int*);.I
32ee0 4f 4d 45 54 48 4f 44 53 28 0a 20 20 70 72 6f 78  OMETHODS(.  prox
32ef0 79 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20  yIoFinder,      
32f00 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20        /* Finder 
32f10 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f  function name */
32f20 0a 20 20 70 72 6f 78 79 49 6f 4d 65 74 68 6f 64  .  proxyIoMethod
32f30 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  s,           /* 
32f40 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
32f50 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a  ds object name *
32f60 2f 0a 20 20 32 2c 20 20 20 20 20 20 20 20 20 20  /.  2,          
32f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
32f80 20 73 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 69   shared memory i
32f90 73 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20 70  s enabled */.  p
32fa0 72 6f 78 79 43 6c 6f 73 65 2c 20 20 20 20 20 20  roxyClose,      
32fb0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f           /* xClo
32fc0 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 70  se method */.  p
32fd0 72 6f 78 79 4c 6f 63 6b 2c 20 20 20 20 20 20 20  roxyLock,       
32fe0 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63           /* xLoc
32ff0 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 70 72  k method */.  pr
33000 6f 78 79 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20  oxyUnlock,      
33010 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f          /* xUnlo
33020 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 70  ck method */.  p
33030 72 6f 78 79 43 68 65 63 6b 52 65 73 65 72 76 65  roxyCheckReserve
33040 64 4c 6f 63 6b 2c 20 20 20 2f 2a 20 78 43 68 65  dLock,   /* xChe
33050 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d  ckReservedLock m
33060 65 74 68 6f 64 20 2a 2f 0a 20 20 30 20 20 20 20  ethod */.  0    
33070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33080 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d 61 70 20       /* xShmMap 
33090 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64  method */.).#end
330a0 69 66 0a 0a 2f 2a 20 6e 66 73 20 6c 6f 63 6b 64  if../* nfs lockd
330b0 20 6f 6e 20 4f 53 58 20 31 30 2e 33 2b 20 64 6f   on OSX 10.3+ do
330c0 65 73 6e 27 74 20 63 6c 65 61 72 20 77 72 69 74  esn't clear writ
330d0 65 20 6c 6f 63 6b 73 20 77 68 65 6e 20 61 20 72  e locks when a r
330e0 65 61 64 20 6c 6f 63 6b 20 69 73 20 73 65 74 20  ead lock is set 
330f0 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  */.#if defined(_
33100 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c  _APPLE__) && SQL
33110 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
33120 4e 47 5f 53 54 59 4c 45 0a 49 4f 4d 45 54 48 4f  NG_STYLE.IOMETHO
33130 44 53 28 0a 20 20 6e 66 73 49 6f 46 69 6e 64 65  DS(.  nfsIoFinde
33140 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
33150 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74   /* Finder funct
33160 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 6e 66  ion name */.  nf
33170 73 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20  sIoMethods,     
33180 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69           /* sqli
33190 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f  te3_io_methods o
331a0 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20  bject name */.  
331b0 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1,              
331c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 68             /* sh
331d0 61 72 65 64 20 6d 65 6d 6f 72 79 20 69 73 20 64  ared memory is d
331e0 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20 75 6e 69  isabled */.  uni
331f0 78 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20  xClose,         
33200 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73          /* xClos
33210 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 75 6e  e method */.  un
33220 69 78 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  ixLock,         
33230 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63           /* xLoc
33240 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 6e 66  k method */.  nf
33250 73 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20  sUnlock,        
33260 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c           /* xUnl
33270 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
33280 75 6e 69 78 43 68 65 63 6b 52 65 73 65 72 76 65  unixCheckReserve
33290 64 4c 6f 63 6b 2c 20 20 20 20 20 2f 2a 20 78 43  dLock,     /* xC
332a0 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
332b0 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 30 20 20   method */.  0  
332c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
332d0 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 4d          /* xShmM
332e0 61 70 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 23  ap method */.).#
332f0 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e  endif..#if defin
33300 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26  ed(__APPLE__) &&
33310 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
33320 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 20  OCKING_STYLE./* 
33330 0a 2a 2a 20 54 68 69 73 20 22 66 69 6e 64 65 72  .** This "finder
33340 22 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d  " function attem
33350 70 74 73 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  pts to determine
33360 20 74 68 65 20 62 65 73 74 20 6c 6f 63 6b 69 6e   the best lockin
33370 67 20 73 74 72 61 74 65 67 79 20 0a 2a 2a 20 66  g strategy .** f
33380 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20  or the database 
33390 66 69 6c 65 20 22 66 69 6c 65 50 61 74 68 22 2e  file "filePath".
333a0 20 20 49 74 20 74 68 65 6e 20 72 65 74 75 72 6e    It then return
333b0 73 20 74 68 65 20 73 71 6c 69 74 65 33 5f 69 6f  s the sqlite3_io
333c0 5f 6d 65 74 68 6f 64 73 0a 2a 2a 20 6f 62 6a 65  _methods.** obje
333d0 63 74 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e  ct that implemen
333e0 74 73 20 74 68 61 74 20 73 74 72 61 74 65 67 79  ts that strategy
333f0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ..**.** This is 
33400 66 6f 72 20 4d 61 63 4f 53 58 20 6f 6e 6c 79 2e  for MacOSX only.
33410 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
33420 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
33430 6f 64 73 20 2a 61 75 74 6f 6c 6f 63 6b 49 6f 46  ods *autolockIoF
33440 69 6e 64 65 72 49 6d 70 6c 28 0a 20 20 63 6f 6e  inderImpl(.  con
33450 73 74 20 63 68 61 72 20 2a 66 69 6c 65 50 61 74  st char *filePat
33460 68 2c 20 20 20 20 2f 2a 20 6e 61 6d 65 20 6f 66  h,    /* name of
33470 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
33480 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c 65  le */.  unixFile
33490 20 2a 70 4e 65 77 20 20 20 20 20 20 20 20 20 20   *pNew          
334a0 20 2f 2a 20 6f 70 65 6e 20 66 69 6c 65 20 6f 62   /* open file ob
334b0 6a 65 63 74 20 66 6f 72 20 74 68 65 20 64 61 74  ject for the dat
334c0 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 29 7b  abase file */.){
334d0 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
334e0 73 74 72 75 63 74 20 4d 61 70 70 69 6e 67 20 7b  struct Mapping {
334f0 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
33500 2a 7a 46 69 6c 65 73 79 73 74 65 6d 3b 20 20 20  *zFilesystem;   
33510 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
33520 6c 65 73 79 73 74 65 6d 20 74 79 70 65 20 6e 61  lesystem type na
33530 6d 65 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20  me */.    const 
33540 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
33550 64 73 20 2a 70 4d 65 74 68 6f 64 73 3b 20 20 20  ds *pMethods;   
33560 2f 2a 20 41 70 70 72 6f 70 72 69 61 74 65 20 6c  /* Appropriate l
33570 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 20 2a 2f  ocking method */
33580 0a 20 20 7d 20 61 4d 61 70 5b 5d 20 3d 20 7b 0a  .  } aMap[] = {.
33590 20 20 20 20 7b 20 22 68 66 73 22 2c 20 20 20 20      { "hfs",    
335a0 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 20  &posixIoMethods 
335b0 7d 2c 0a 20 20 20 20 7b 20 22 75 66 73 22 2c 20  },.    { "ufs", 
335c0 20 20 20 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f     &posixIoMetho
335d0 64 73 20 7d 2c 0a 20 20 20 20 7b 20 22 61 66 70  ds },.    { "afp
335e0 66 73 22 2c 20 20 26 61 66 70 49 6f 4d 65 74 68  fs",  &afpIoMeth
335f0 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20 22 73 6d  ods },.    { "sm
33600 62 66 73 22 2c 20 20 26 61 66 70 49 6f 4d 65 74  bfs",  &afpIoMet
33610 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20 22 77  hods },.    { "w
33620 65 62 64 61 76 22 2c 20 26 6e 6f 6c 6f 63 6b 49  ebdav", &nolockI
33630 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20  oMethods },.    
33640 7b 20 30 2c 20 30 20 7d 0a 20 20 7d 3b 0a 20 20  { 0, 0 }.  };.  
33650 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
33660 73 74 61 74 66 73 20 66 73 49 6e 66 6f 3b 0a 20  statfs fsInfo;. 
33670 20 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f   struct flock lo
33680 63 6b 49 6e 66 6f 3b 0a 0a 20 20 69 66 28 20 21  ckInfo;..  if( !
33690 66 69 6c 65 50 61 74 68 20 29 7b 0a 20 20 20 20  filePath ){.    
336a0 2f 2a 20 49 66 20 66 69 6c 65 50 61 74 68 3d 3d  /* If filePath==
336b0 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61 6e 73 20  NULL that means 
336c0 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77  we are dealing w
336d0 69 74 68 20 61 20 74 72 61 6e 73 69 65 6e 74 20  ith a transient 
336e0 66 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68 61 74  file.    ** that
336f0 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74   does not need t
33700 6f 20 62 65 20 6c 6f 63 6b 65 64 2e 20 2a 2f 0a  o be locked. */.
33710 20 20 20 20 72 65 74 75 72 6e 20 26 6e 6f 6c 6f      return &nolo
33720 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d  ckIoMethods;.  }
33730 0a 20 20 69 66 28 20 73 74 61 74 66 73 28 66 69  .  if( statfs(fi
33740 6c 65 50 61 74 68 2c 20 26 66 73 49 6e 66 6f 29  lePath, &fsInfo)
33750 20 21 3d 20 2d 31 20 29 7b 0a 20 20 20 20 69 66   != -1 ){.    if
33760 28 20 66 73 49 6e 66 6f 2e 66 5f 66 6c 61 67 73  ( fsInfo.f_flags
33770 20 26 20 4d 4e 54 5f 52 44 4f 4e 4c 59 20 29 7b   & MNT_RDONLY ){
33780 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 26 6e  .      return &n
33790 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a  olockIoMethods;.
337a0 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d      }.    for(i=
337b0 30 3b 20 61 4d 61 70 5b 69 5d 2e 7a 46 69 6c 65  0; aMap[i].zFile
337c0 73 79 73 74 65 6d 3b 20 69 2b 2b 29 7b 0a 20 20  system; i++){.  
337d0 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 66      if( strcmp(f
337e0 73 49 6e 66 6f 2e 66 5f 66 73 74 79 70 65 6e 61  sInfo.f_fstypena
337f0 6d 65 2c 20 61 4d 61 70 5b 69 5d 2e 7a 46 69 6c  me, aMap[i].zFil
33800 65 73 79 73 74 65 6d 29 3d 3d 30 20 29 7b 0a 20  esystem)==0 ){. 
33810 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 61 4d         return aM
33820 61 70 5b 69 5d 2e 70 4d 65 74 68 6f 64 73 3b 0a  ap[i].pMethods;.
33830 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
33840 7d 0a 0a 20 20 2f 2a 20 44 65 66 61 75 6c 74 20  }..  /* Default 
33850 63 61 73 65 2e 20 48 61 6e 64 6c 65 73 2c 20 61  case. Handles, a
33860 6d 6f 6e 67 73 74 20 6f 74 68 65 72 73 2c 20 22  mongst others, "
33870 6e 66 73 22 2e 0a 20 20 2a 2a 20 54 65 73 74 20  nfs"..  ** Test 
33880 62 79 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 20  byte-range lock 
33890 75 73 69 6e 67 20 66 63 6e 74 6c 28 29 2e 20 49  using fcntl(). I
338a0 66 20 74 68 65 20 63 61 6c 6c 20 73 75 63 63 65  f the call succe
338b0 65 64 73 2c 20 0a 20 20 2a 2a 20 61 73 73 75 6d  eds, .  ** assum
338c0 65 20 74 68 61 74 20 74 68 65 20 66 69 6c 65 2d  e that the file-
338d0 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 73 20  system supports 
338e0 50 4f 53 49 58 20 73 74 79 6c 65 20 6c 6f 63 6b  POSIX style lock
338f0 73 2e 20 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b 49  s. .  */.  lockI
33900 6e 66 6f 2e 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20  nfo.l_len = 1;. 
33910 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 73 74 61 72   lockInfo.l_star
33920 74 20 3d 20 30 3b 0a 20 20 6c 6f 63 6b 49 6e 66  t = 0;.  lockInf
33930 6f 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45  o.l_whence = SEE
33940 4b 5f 53 45 54 3b 0a 20 20 6c 6f 63 6b 49 6e 66  K_SET;.  lockInf
33950 6f 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c  o.l_type = F_RDL
33960 43 4b 3b 0a 20 20 69 66 28 20 6f 73 46 63 6e 74  CK;.  if( osFcnt
33970 6c 28 70 4e 65 77 2d 3e 68 2c 20 46 5f 47 45 54  l(pNew->h, F_GET
33980 4c 4b 2c 20 26 6c 6f 63 6b 49 6e 66 6f 29 21 3d  LK, &lockInfo)!=
33990 2d 31 20 29 20 7b 0a 20 20 20 20 69 66 28 20 73  -1 ) {.    if( s
339a0 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e 66 5f 66  trcmp(fsInfo.f_f
339b0 73 74 79 70 65 6e 61 6d 65 2c 20 22 6e 66 73 22  stypename, "nfs"
339c0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65  )==0 ){.      re
339d0 74 75 72 6e 20 26 6e 66 73 49 6f 4d 65 74 68 6f  turn &nfsIoMetho
339e0 64 73 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  ds;.    } else {
339f0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 26 70  .      return &p
33a00 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 3b 0a 20  osixIoMethods;. 
33a10 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
33a20 20 20 72 65 74 75 72 6e 20 26 64 6f 74 6c 6f 63    return &dotloc
33a30 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a  kIoMethods;.  }.
33a40 7d 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73  }.static const s
33a50 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
33a60 73 20 0a 20 20 2a 28 2a 63 6f 6e 73 74 20 61 75  s .  *(*const au
33a70 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 29 28  tolockIoFinder)(
33a80 63 6f 6e 73 74 20 63 68 61 72 2a 2c 75 6e 69 78  const char*,unix
33a90 46 69 6c 65 2a 29 20 3d 20 61 75 74 6f 6c 6f 63  File*) = autoloc
33aa0 6b 49 6f 46 69 6e 64 65 72 49 6d 70 6c 3b 0a 0a  kIoFinderImpl;..
33ab0 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65  #endif /* define
33ac0 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20  d(__APPLE__) && 
33ad0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
33ae0 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a  CKING_STYLE */..
33af0 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 2f  #if OS_VXWORKS./
33b00 2a 0a 2a 2a 20 54 68 69 73 20 22 66 69 6e 64 65  *.** This "finde
33b10 72 22 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20  r" function for 
33b20 56 78 57 6f 72 6b 73 20 63 68 65 63 6b 73 20 74  VxWorks checks t
33b30 6f 20 73 65 65 20 69 66 20 70 6f 73 69 78 20 61  o see if posix a
33b40 64 76 69 73 6f 72 79 0a 2a 2a 20 6c 6f 63 6b 69  dvisory.** locki
33b50 6e 67 20 77 6f 72 6b 73 2e 20 20 49 66 20 69 74  ng works.  If it
33b60 20 64 6f 65 73 2c 20 74 68 65 6e 20 74 68 61 74   does, then that
33b70 20 69 73 20 77 68 61 74 20 69 73 20 75 73 65 64   is what is used
33b80 2e 20 20 49 66 20 69 74 20 64 6f 65 73 20 6e 6f  .  If it does no
33b90 74 0a 2a 2a 20 77 6f 72 6b 2c 20 74 68 65 6e 20  t.** work, then 
33ba0 66 61 6c 6c 62 61 63 6b 20 74 6f 20 6e 61 6d 65  fallback to name
33bb0 64 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b  d semaphore lock
33bc0 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ing..*/.static c
33bd0 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f  onst sqlite3_io_
33be0 6d 65 74 68 6f 64 73 20 2a 76 78 77 6f 72 6b 73  methods *vxworks
33bf0 49 6f 46 69 6e 64 65 72 49 6d 70 6c 28 0a 20 20  IoFinderImpl(.  
33c00 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 69 6c 65  const char *file
33c10 50 61 74 68 2c 20 20 20 20 2f 2a 20 6e 61 6d 65  Path,    /* name
33c20 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
33c30 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 46   file */.  unixF
33c40 69 6c 65 20 2a 70 4e 65 77 20 20 20 20 20 20 20  ile *pNew       
33c50 20 20 20 20 2f 2a 20 74 68 65 20 6f 70 65 6e 20      /* the open 
33c60 66 69 6c 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 29  file object */.)
33c70 7b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b  {.  struct flock
33c80 20 6c 6f 63 6b 49 6e 66 6f 3b 0a 0a 20 20 69 66   lockInfo;..  if
33c90 28 20 21 66 69 6c 65 50 61 74 68 20 29 7b 0a 20  ( !filePath ){. 
33ca0 20 20 20 2f 2a 20 49 66 20 66 69 6c 65 50 61 74     /* If filePat
33cb0 68 3d 3d 4e 55 4c 4c 20 74 68 61 74 20 6d 65 61  h==NULL that mea
33cc0 6e 73 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e  ns we are dealin
33cd0 67 20 77 69 74 68 20 61 20 74 72 61 6e 73 69 65  g with a transie
33ce0 6e 74 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 74  nt file.    ** t
33cf0 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65  hat does not nee
33d00 64 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 2e 20  d to be locked. 
33d10 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 26 6e  */.    return &n
33d20 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a  olockIoMethods;.
33d30 20 20 7d 0a 0a 20 20 2f 2a 20 54 65 73 74 20 69    }..  /* Test i
33d40 66 20 66 63 6e 74 6c 28 29 20 69 73 20 73 75 70  f fcntl() is sup
33d50 70 6f 72 74 65 64 20 61 6e 64 20 75 73 65 20 50  ported and use P
33d60 4f 53 49 58 20 73 74 79 6c 65 20 6c 6f 63 6b 73  OSIX style locks
33d70 2e 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65  ..  ** Otherwise
33d80 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 74 68   fall back to th
33d90 65 20 6e 61 6d 65 64 20 73 65 6d 61 70 68 6f 72  e named semaphor
33da0 65 20 6d 65 74 68 6f 64 2e 0a 20 20 2a 2f 0a 20  e method..  */. 
33db0 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 6c 65 6e 20   lockInfo.l_len 
33dc0 3d 20 31 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e  = 1;.  lockInfo.
33dd0 6c 5f 73 74 61 72 74 20 3d 20 30 3b 0a 20 20 6c  l_start = 0;.  l
33de0 6f 63 6b 49 6e 66 6f 2e 6c 5f 77 68 65 6e 63 65  ockInfo.l_whence
33df0 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 6c   = SEEK_SET;.  l
33e00 6f 63 6b 49 6e 66 6f 2e 6c 5f 74 79 70 65 20 3d  ockInfo.l_type =
33e10 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 69 66 28 20   F_RDLCK;.  if( 
33e20 6f 73 46 63 6e 74 6c 28 70 4e 65 77 2d 3e 68 2c  osFcntl(pNew->h,
33e30 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63 6b 49   F_GETLK, &lockI
33e40 6e 66 6f 29 21 3d 2d 31 20 29 20 7b 0a 20 20 20  nfo)!=-1 ) {.   
33e50 20 72 65 74 75 72 6e 20 26 70 6f 73 69 78 49 6f   return &posixIo
33e60 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 65 6c 73 65  Methods;.  }else
33e70 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 26 73 65  {.    return &se
33e80 6d 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a  mIoMethods;.  }.
33e90 7d 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73  }.static const s
33ea0 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
33eb0 73 20 0a 20 20 2a 28 2a 63 6f 6e 73 74 20 76 78  s .  *(*const vx
33ec0 77 6f 72 6b 73 49 6f 46 69 6e 64 65 72 29 28 63  worksIoFinder)(c
33ed0 6f 6e 73 74 20 63 68 61 72 2a 2c 75 6e 69 78 46  onst char*,unixF
33ee0 69 6c 65 2a 29 20 3d 20 76 78 77 6f 72 6b 73 49  ile*) = vxworksI
33ef0 6f 46 69 6e 64 65 72 49 6d 70 6c 3b 0a 0a 23 65  oFinderImpl;..#e
33f00 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52  ndif /* OS_VXWOR
33f10 4b 53 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  KS */../*.** An 
33f20 61 62 73 74 72 61 63 74 20 74 79 70 65 20 66 6f  abstract type fo
33f30 72 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  r a pointer to a
33f40 6e 20 49 4f 20 6d 65 74 68 6f 64 20 66 69 6e 64  n IO method find
33f50 65 72 20 66 75 6e 63 74 69 6f 6e 3a 0a 2a 2f 0a  er function:.*/.
33f60 74 79 70 65 64 65 66 20 63 6f 6e 73 74 20 73 71  typedef const sq
33f70 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
33f80 20 2a 28 2a 66 69 6e 64 65 72 5f 74 79 70 65 29   *(*finder_type)
33f90 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 75 6e 69  (const char*,uni
33fa0 78 46 69 6c 65 2a 29 3b 0a 0a 0a 2f 2a 2a 2a 2a  xFile*);.../****
33fb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33fc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33fd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33fe0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
33ff0 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
34000 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
34010 2a 2a 2a 2a 2a 20 73 71 6c 69 74 65 33 5f 76 66  ***** sqlite3_vf
34020 73 20 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a  s methods ******
34030 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
34040 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69  ******.**.** Thi
34050 73 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e 74 61  s division conta
34060 69 6e 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e  ins the implemen
34070 74 61 74 69 6f 6e 20 6f 66 20 6d 65 74 68 6f 64  tation of method
34080 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 73 71 6c 69  s on the.** sqli
34090 74 65 33 5f 76 66 73 20 6f 62 6a 65 63 74 2e 0a  te3_vfs object..
340a0 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61  */../*.** Initia
340b0 6c 69 7a 65 20 74 68 65 20 63 6f 6e 74 65 6e 74  lize the content
340c0 73 20 6f 66 20 74 68 65 20 75 6e 69 78 46 69 6c  s of the unixFil
340d0 65 20 73 74 72 75 63 74 75 72 65 20 70 6f 69 6e  e structure poin
340e0 74 65 64 20 74 6f 20 62 79 20 70 49 64 2e 0a 2a  ted to by pId..*
340f0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c  /.static int fil
34100 6c 49 6e 55 6e 69 78 46 69 6c 65 28 0a 20 20 73  lInUnixFile(.  s
34110 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
34120 2c 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65  ,      /* Pointe
34130 72 20 74 6f 20 76 66 73 20 6f 62 6a 65 63 74 20  r to vfs object 
34140 2a 2f 0a 20 20 69 6e 74 20 68 2c 20 20 20 20 20  */.  int h,     
34150 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
34160 4f 70 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69  Open file descri
34170 70 74 6f 72 20 6f 66 20 66 69 6c 65 20 62 65 69  ptor of file bei
34180 6e 67 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 73  ng opened */.  s
34190 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 49 64  qlite3_file *pId
341a0 2c 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20  ,      /* Write 
341b0 74 6f 20 74 68 65 20 75 6e 69 78 46 69 6c 65 20  to the unixFile 
341c0 73 74 72 75 63 74 75 72 65 20 68 65 72 65 20 2a  structure here *
341d0 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
341e0 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20 4e  zFilename,  /* N
341f0 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ame of the file 
34200 62 65 69 6e 67 20 6f 70 65 6e 65 64 20 2a 2f 0a  being opened */.
34210 20 20 69 6e 74 20 63 74 72 6c 46 6c 61 67 73 20    int ctrlFlags 
34220 20 20 20 20 20 20 20 20 20 20 2f 2a 20 5a 65 72            /* Zer
34230 6f 20 6f 72 20 6d 6f 72 65 20 55 4e 49 58 46 49  o or more UNIXFI
34240 4c 45 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a 29  LE_* values */.)
34250 7b 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  {.  const sqlite
34260 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a 70 4c  3_io_methods *pL
34270 6f 63 6b 69 6e 67 53 74 79 6c 65 3b 0a 20 20 75  ockingStyle;.  u
34280 6e 69 78 46 69 6c 65 20 2a 70 4e 65 77 20 3d 20  nixFile *pNew = 
34290 28 75 6e 69 78 46 69 6c 65 20 2a 29 70 49 64 3b  (unixFile *)pId;
342a0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
342b0 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74  TE_OK;..  assert
342c0 28 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 3d 3d  ( pNew->pInode==
342d0 4e 55 4c 4c 20 29 3b 0a 0a 20 20 2f 2a 20 55 73  NULL );..  /* Us
342e0 75 61 6c 6c 79 20 74 68 65 20 70 61 74 68 20 7a  ually the path z
342f0 46 69 6c 65 6e 61 6d 65 20 73 68 6f 75 6c 64 20  Filename should 
34300 6e 6f 74 20 62 65 20 61 20 72 65 6c 61 74 69 76  not be a relativ
34310 65 20 70 61 74 68 6e 61 6d 65 2e 20 54 68 65 0a  e pathname. The.
34320 20 20 2a 2a 20 65 78 63 65 70 74 69 6f 6e 20 69    ** exception i
34330 73 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67 20 74  s when opening t
34340 68 65 20 70 72 6f 78 79 20 22 63 6f 6e 63 68 22  he proxy "conch"
34350 20 66 69 6c 65 20 69 6e 20 62 75 69 6c 64 73 20   file in builds 
34360 74 68 61 74 0a 20 20 2a 2a 20 69 6e 63 6c 75 64  that.  ** includ
34370 65 20 74 68 65 20 73 70 65 63 69 61 6c 20 41 70  e the special Ap
34380 70 6c 65 20 6c 6f 63 6b 69 6e 67 20 73 74 79 6c  ple locking styl
34390 65 73 2e 0a 20 20 2a 2f 0a 23 69 66 20 64 65 66  es..  */.#if def
343a0 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
343b0 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
343c0 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20  _LOCKING_STYLE. 
343d0 20 61 73 73 65 72 74 28 20 7a 46 69 6c 65 6e 61   assert( zFilena
343e0 6d 65 3d 3d 30 20 7c 7c 20 7a 46 69 6c 65 6e 61  me==0 || zFilena
343f0 6d 65 5b 30 5d 3d 3d 27 2f 27 20 0a 20 20 20 20  me[0]=='/' .    
34400 7c 7c 20 70 56 66 73 2d 3e 70 41 70 70 44 61 74  || pVfs->pAppDat
34410 61 3d 3d 28 76 6f 69 64 2a 29 26 61 75 74 6f 6c  a==(void*)&autol
34420 6f 63 6b 49 6f 46 69 6e 64 65 72 20 29 3b 0a 23  ockIoFinder );.#
34430 65 6c 73 65 0a 20 20 61 73 73 65 72 74 28 20 7a  else.  assert( z
34440 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20 7a  Filename==0 || z
34450 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 27 2f 27  Filename[0]=='/'
34460 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a   );.#endif..  /*
34470 20 4e 6f 20 6c 6f 63 6b 69 6e 67 20 6f 63 63 75   No locking occu
34480 72 73 20 69 6e 20 74 65 6d 70 6f 72 61 72 79 20  rs in temporary 
34490 66 69 6c 65 73 20 2a 2f 0a 20 20 61 73 73 65 72  files */.  asser
344a0 74 28 20 7a 46 69 6c 65 6e 61 6d 65 21 3d 30 20  t( zFilename!=0 
344b0 7c 7c 20 28 63 74 72 6c 46 6c 61 67 73 20 26 20  || (ctrlFlags & 
344c0 55 4e 49 58 46 49 4c 45 5f 4e 4f 4c 4f 43 4b 29  UNIXFILE_NOLOCK)
344d0 21 3d 30 20 29 3b 0a 0a 20 20 4f 53 54 52 41 43  !=0 );..  OSTRAC
344e0 45 28 28 22 4f 50 45 4e 20 20 20 20 25 2d 33 64  E(("OPEN    %-3d
344f0 20 25 73 5c 6e 22 2c 20 68 2c 20 7a 46 69 6c 65   %s\n", h, zFile
34500 6e 61 6d 65 29 29 3b 0a 20 20 70 4e 65 77 2d 3e  name));.  pNew->
34510 68 20 3d 20 68 3b 0a 20 20 70 4e 65 77 2d 3e 70  h = h;.  pNew->p
34520 56 66 73 20 3d 20 70 56 66 73 3b 0a 20 20 70 4e  Vfs = pVfs;.  pN
34530 65 77 2d 3e 7a 50 61 74 68 20 3d 20 7a 46 69 6c  ew->zPath = zFil
34540 65 6e 61 6d 65 3b 0a 20 20 70 4e 65 77 2d 3e 63  ename;.  pNew->c
34550 74 72 6c 46 6c 61 67 73 20 3d 20 28 75 38 29 63  trlFlags = (u8)c
34560 74 72 6c 46 6c 61 67 73 3b 0a 23 69 66 20 53 51  trlFlags;.#if SQ
34570 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49  LITE_MAX_MMAP_SI
34580 5a 45 3e 30 0a 20 20 70 4e 65 77 2d 3e 6d 6d 61  ZE>0.  pNew->mma
34590 70 53 69 7a 65 4d 61 78 20 3d 20 73 71 6c 69 74  pSizeMax = sqlit
345a0 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73  e3GlobalConfig.s
345b0 7a 4d 6d 61 70 3b 0a 23 65 6e 64 69 66 0a 20 20  zMmap;.#endif.  
345c0 69 66 28 20 73 71 6c 69 74 65 33 5f 75 72 69 5f  if( sqlite3_uri_
345d0 62 6f 6f 6c 65 61 6e 28 28 28 63 74 72 6c 46 6c  boolean(((ctrlFl
345e0 61 67 73 20 26 20 55 4e 49 58 46 49 4c 45 5f 55  ags & UNIXFILE_U
345f0 52 49 29 20 3f 20 7a 46 69 6c 65 6e 61 6d 65 20  RI) ? zFilename 
34600 3a 20 30 29 2c 0a 20 20 20 20 20 20 20 20 20 20  : 0),.          
34610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34620 20 22 70 73 6f 77 22 2c 20 53 51 4c 49 54 45 5f   "psow", SQLITE_
34630 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52  POWERSAFE_OVERWR
34640 49 54 45 29 20 29 7b 0a 20 20 20 20 70 4e 65 77  ITE) ){.    pNew
34650 2d 3e 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55  ->ctrlFlags |= U
34660 4e 49 58 46 49 4c 45 5f 50 53 4f 57 3b 0a 20 20  NIXFILE_PSOW;.  
34670 7d 0a 20 20 69 66 28 20 73 74 72 63 6d 70 28 70  }.  if( strcmp(p
34680 56 66 73 2d 3e 7a 4e 61 6d 65 2c 22 75 6e 69 78  Vfs->zName,"unix
34690 2d 65 78 63 6c 22 29 3d 3d 30 20 29 7b 0a 20 20  -excl")==0 ){.  
346a0 20 20 70 4e 65 77 2d 3e 63 74 72 6c 46 6c 61 67    pNew->ctrlFlag
346b0 73 20 7c 3d 20 55 4e 49 58 46 49 4c 45 5f 45 58  s |= UNIXFILE_EX
346c0 43 4c 3b 0a 20 20 7d 0a 0a 23 69 66 20 4f 53 5f  CL;.  }..#if OS_
346d0 56 58 57 4f 52 4b 53 0a 20 20 70 4e 65 77 2d 3e  VXWORKS.  pNew->
346e0 70 49 64 20 3d 20 76 78 77 6f 72 6b 73 46 69 6e  pId = vxworksFin
346f0 64 46 69 6c 65 49 64 28 7a 46 69 6c 65 6e 61 6d  dFileId(zFilenam
34700 65 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e  e);.  if( pNew->
34710 70 49 64 3d 3d 30 20 29 7b 0a 20 20 20 20 63 74  pId==0 ){.    ct
34720 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49 58 46  rlFlags |= UNIXF
34730 49 4c 45 5f 4e 4f 4c 4f 43 4b 3b 0a 20 20 20 20  ILE_NOLOCK;.    
34740 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
34750 4d 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  M;.  }.#endif.. 
34760 20 69 66 28 20 63 74 72 6c 46 6c 61 67 73 20 26   if( ctrlFlags &
34770 20 55 4e 49 58 46 49 4c 45 5f 4e 4f 4c 4f 43 4b   UNIXFILE_NOLOCK
34780 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 69 6e 67   ){.    pLocking
34790 53 74 79 6c 65 20 3d 20 26 6e 6f 6c 6f 63 6b 49  Style = &nolockI
347a0 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 65 6c 73  oMethods;.  }els
347b0 65 7b 0a 20 20 20 20 70 4c 6f 63 6b 69 6e 67 53  e{.    pLockingS
347c0 74 79 6c 65 20 3d 20 28 2a 2a 28 66 69 6e 64 65  tyle = (**(finde
347d0 72 5f 74 79 70 65 2a 29 70 56 66 73 2d 3e 70 41  r_type*)pVfs->pA
347e0 70 70 44 61 74 61 29 28 7a 46 69 6c 65 6e 61 6d  ppData)(zFilenam
347f0 65 2c 20 70 4e 65 77 29 3b 0a 23 69 66 20 53 51  e, pNew);.#if SQ
34800 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
34810 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20 2f 2a  ING_STYLE.    /*
34820 20 43 61 63 68 65 20 7a 46 69 6c 65 6e 61 6d 65   Cache zFilename
34830 20 69 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   in the locking 
34840 63 6f 6e 74 65 78 74 20 28 41 46 50 20 61 6e 64  context (AFP and
34850 20 64 6f 74 6c 6f 63 6b 20 6f 76 65 72 72 69 64   dotlock overrid
34860 65 29 20 66 6f 72 0a 20 20 20 20 2a 2a 20 70 72  e) for.    ** pr
34870 6f 78 79 4c 6f 63 6b 20 61 63 74 69 76 61 74 69  oxyLock activati
34880 6f 6e 20 69 73 20 70 6f 73 73 69 62 6c 65 20 28  on is possible (
34890 72 65 6d 6f 74 65 20 70 72 6f 78 79 20 69 73 20  remote proxy is 
348a0 62 61 73 65 64 20 6f 6e 20 64 62 20 6e 61 6d 65  based on db name
348b0 29 0a 20 20 20 20 2a 2a 20 7a 46 69 6c 65 6e 61  ).    ** zFilena
348c0 6d 65 20 72 65 6d 61 69 6e 73 20 76 61 6c 69 64  me remains valid
348d0 20 75 6e 74 69 6c 20 66 69 6c 65 20 69 73 20 63   until file is c
348e0 6c 6f 73 65 64 2c 20 74 6f 20 73 75 70 70 6f 72  losed, to suppor
348f0 74 20 2a 2f 0a 20 20 20 20 70 4e 65 77 2d 3e 6c  t */.    pNew->l
34900 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20  ockingContext = 
34910 28 76 6f 69 64 2a 29 7a 46 69 6c 65 6e 61 6d 65  (void*)zFilename
34920 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20  ;.#endif.  }..  
34930 69 66 28 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c  if( pLockingStyl
34940 65 20 3d 3d 20 26 70 6f 73 69 78 49 6f 4d 65 74  e == &posixIoMet
34950 68 6f 64 73 0a 23 69 66 20 64 65 66 69 6e 65 64  hods.#if defined
34960 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53  (__APPLE__) && S
34970 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
34980 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 20 20 7c  KING_STYLE.    |
34990 7c 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20  | pLockingStyle 
349a0 3d 3d 20 26 6e 66 73 49 6f 4d 65 74 68 6f 64 73  == &nfsIoMethods
349b0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 2f 2a 20  .#endif.     /* 
349c0 73 75 70 70 6f 72 74 20 57 41 4c 20 6d 6f 64 65  support WAL mode
349d0 20 6f 6e 20 72 65 61 64 20 6f 6e 6c 79 20 6d 6f   on read only mo
349e0 75 6e 74 65 64 20 66 69 6c 65 73 79 73 74 65 6d  unted filesystem
349f0 20 2a 2f 0a 20 20 20 20 7c 7c 20 28 70 4c 6f 63   */.    || (pLoc
34a00 6b 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26 6e 6f  kingStyle == &no
34a10 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 20 26 26  lockIoMethods &&
34a20 20 7a 46 69 6c 65 6e 61 6d 65 21 3d 30 29 0a 20   zFilename!=0). 
34a30 20 29 7b 0a 20 20 20 20 75 6e 69 78 45 6e 74 65   ){.    unixEnte
34a40 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 72 63  rMutex();.    rc
34a50 20 3d 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f   = findInodeInfo
34a60 28 70 4e 65 77 2c 20 26 70 4e 65 77 2d 3e 70 49  (pNew, &pNew->pI
34a70 6e 6f 64 65 29 3b 0a 20 20 20 20 69 66 28 20 72  node);.    if( r
34a80 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
34a90 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6e 20 65        /* If an e
34aa0 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20 69 6e  rror occurred in
34ab0 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29   findInodeInfo()
34ac0 2c 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65  , close the file
34ad0 20 64 65 73 63 72 69 70 74 6f 72 0a 20 20 20 20   descriptor.    
34ae0 20 20 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79    ** immediately
34af0 2c 20 62 65 66 6f 72 65 20 72 65 6c 65 61 73 69  , before releasi
34b00 6e 67 20 74 68 65 20 6d 75 74 65 78 2e 20 66 69  ng the mutex. fi
34b10 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29 20 6d 61  ndInodeInfo() ma
34b20 79 20 66 61 69 6c 0a 20 20 20 20 20 20 2a 2a 20  y fail.      ** 
34b30 69 6e 20 74 77 6f 20 73 63 65 6e 61 72 69 6f 73  in two scenarios
34b40 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  :.      **.     
34b50 20 2a 2a 20 20 20 28 61 29 20 41 20 63 61 6c 6c   **   (a) A call
34b60 20 74 6f 20 66 73 74 61 74 28 29 20 66 61 69 6c   to fstat() fail
34b70 65 64 2e 0a 20 20 20 20 20 20 2a 2a 20 20 20 28  ed..      **   (
34b80 62 29 20 41 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  b) A malloc fail
34b90 65 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  ed..      **.   
34ba0 20 20 20 2a 2a 20 53 63 65 6e 61 72 69 6f 20 28     ** Scenario (
34bb0 62 29 20 6d 61 79 20 6f 6e 6c 79 20 6f 63 63 75  b) may only occu
34bc0 72 20 69 66 20 74 68 65 20 70 72 6f 63 65 73 73  r if the process
34bd0 20 69 73 20 68 6f 6c 64 69 6e 67 20 6e 6f 20 6f   is holding no o
34be0 74 68 65 72 0a 20 20 20 20 20 20 2a 2a 20 66 69  ther.      ** fi
34bf0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 6f  le descriptors o
34c00 70 65 6e 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  pen on the same 
34c10 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20 77  file. If there w
34c20 65 72 65 20 6f 74 68 65 72 20 66 69 6c 65 0a 20  ere other file. 
34c30 20 20 20 20 20 2a 2a 20 64 65 73 63 72 69 70 74       ** descript
34c40 6f 72 73 20 6f 6e 20 74 68 69 73 20 66 69 6c 65  ors on this file
34c50 2c 20 74 68 65 6e 20 6e 6f 20 6d 61 6c 6c 6f 63  , then no malloc
34c60 20 77 6f 75 6c 64 20 62 65 20 72 65 71 75 69 72   would be requir
34c70 65 64 20 62 79 0a 20 20 20 20 20 20 2a 2a 20 66  ed by.      ** f
34c80 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29 2e 20  indInodeInfo(). 
34c90 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 63  If this is the c
34ca0 61 73 65 2c 20 69 74 20 69 73 20 71 75 69 74 65  ase, it is quite
34cb0 20 73 61 66 65 20 74 6f 20 63 6c 6f 73 65 0a 20   safe to close. 
34cc0 20 20 20 20 20 2a 2a 20 68 61 6e 64 6c 65 20 68       ** handle h
34cd0 20 2d 20 61 73 20 69 74 20 69 73 20 67 75 61 72   - as it is guar
34ce0 61 6e 74 65 65 64 20 74 68 61 74 20 6e 6f 20 70  anteed that no p
34cf0 6f 73 69 78 20 6c 6f 63 6b 73 20 77 69 6c 6c 20  osix locks will 
34d00 62 65 20 72 65 6c 65 61 73 65 64 0a 20 20 20 20  be released.    
34d10 20 20 2a 2a 20 62 79 20 64 6f 69 6e 67 20 73 6f    ** by doing so
34d20 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
34d30 20 2a 2a 20 49 66 20 73 63 65 6e 61 72 69 6f 20   ** If scenario 
34d40 28 61 29 20 63 61 75 73 65 64 20 74 68 65 20 65  (a) caused the e
34d50 72 72 6f 72 20 74 68 65 6e 20 74 68 69 6e 67 73  rror then things
34d60 20 61 72 65 20 6e 6f 74 20 73 6f 20 73 61 66 65   are not so safe
34d70 2e 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 69  . The.      ** i
34d80 6d 70 6c 69 63 69 74 20 61 73 73 75 6d 70 74 69  mplicit assumpti
34d90 6f 6e 20 68 65 72 65 20 69 73 20 74 68 61 74 20  on here is that 
34da0 69 66 20 66 73 74 61 74 28 29 20 66 61 69 6c 73  if fstat() fails
34db0 2c 20 74 68 69 6e 67 73 20 61 72 65 20 69 6e 0a  , things are in.
34dc0 20 20 20 20 20 20 2a 2a 20 73 75 63 68 20 62 61        ** such ba
34dd0 64 20 73 68 61 70 65 20 74 68 61 74 20 64 72 6f  d shape that dro
34de0 70 70 69 6e 67 20 61 20 6c 6f 63 6b 20 6f 72 20  pping a lock or 
34df0 74 77 6f 20 64 6f 65 73 6e 27 74 20 6d 61 74 74  two doesn't matt
34e00 65 72 20 6d 75 63 68 2e 0a 20 20 20 20 20 20 2a  er much..      *
34e10 2f 0a 20 20 20 20 20 20 72 6f 62 75 73 74 5f 63  /.      robust_c
34e20 6c 6f 73 65 28 70 4e 65 77 2c 20 68 2c 20 5f 5f  lose(pNew, h, __
34e30 4c 49 4e 45 5f 5f 29 3b 0a 20 20 20 20 20 20 68  LINE__);.      h
34e40 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20   = -1;.    }.   
34e50 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
34e60 29 3b 0a 20 20 7d 0a 0a 23 69 66 20 53 51 4c 49  );.  }..#if SQLI
34e70 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
34e80 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e  G_STYLE && defin
34e90 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20  ed(__APPLE__).  
34ea0 65 6c 73 65 20 69 66 28 20 70 4c 6f 63 6b 69 6e  else if( pLockin
34eb0 67 53 74 79 6c 65 20 3d 3d 20 26 61 66 70 49 6f  gStyle == &afpIo
34ec0 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 2f  Methods ){.    /
34ed0 2a 20 41 46 50 20 6c 6f 63 6b 69 6e 67 20 75 73  * AFP locking us
34ee0 65 73 20 74 68 65 20 66 69 6c 65 20 70 61 74 68  es the file path
34ef0 20 73 6f 20 69 74 20 6e 65 65 64 73 20 74 6f 20   so it needs to 
34f00 62 65 20 69 6e 63 6c 75 64 65 64 20 69 6e 0a 20  be included in. 
34f10 20 20 20 2a 2a 20 74 68 65 20 61 66 70 4c 6f 63     ** the afpLoc
34f20 6b 69 6e 67 43 6f 6e 74 65 78 74 2e 0a 20 20 20  kingContext..   
34f30 20 2a 2f 0a 20 20 20 20 61 66 70 4c 6f 63 6b 69   */.    afpLocki
34f40 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 3b  ngContext *pCtx;
34f50 0a 20 20 20 20 70 4e 65 77 2d 3e 6c 6f 63 6b 69  .    pNew->locki
34f60 6e 67 43 6f 6e 74 65 78 74 20 3d 20 70 43 74 78  ngContext = pCtx
34f70 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
34f80 63 36 34 28 20 73 69 7a 65 6f 66 28 2a 70 43 74  c64( sizeof(*pCt
34f90 78 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43  x) );.    if( pC
34fa0 74 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  tx==0 ){.      r
34fb0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
34fc0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
34fd0 20 20 20 2f 2a 20 4e 42 3a 20 7a 46 69 6c 65 6e     /* NB: zFilen
34fe0 61 6d 65 20 65 78 69 73 74 73 20 61 6e 64 20 72  ame exists and r
34ff0 65 6d 61 69 6e 73 20 76 61 6c 69 64 20 75 6e 74  emains valid unt
35000 69 6c 20 74 68 65 20 66 69 6c 65 20 69 73 20 63  il the file is c
35010 6c 6f 73 65 64 0a 20 20 20 20 20 20 2a 2a 20 61  losed.      ** a
35020 63 63 6f 72 64 69 6e 67 20 74 6f 20 72 65 71 75  ccording to requ
35030 69 72 65 6d 65 6e 74 20 46 31 31 31 34 31 2e 20  irement F11141. 
35040 20 53 6f 20 77 65 20 64 6f 20 6e 6f 74 20 6e 65   So we do not ne
35050 65 64 20 74 6f 20 6d 61 6b 65 20 61 0a 20 20 20  ed to make a.   
35060 20 20 20 2a 2a 20 63 6f 70 79 20 6f 66 20 74 68     ** copy of th
35070 65 20 66 69 6c 65 6e 61 6d 65 2e 20 2a 2f 0a 20  e filename. */. 
35080 20 20 20 20 20 70 43 74 78 2d 3e 64 62 50 61 74       pCtx->dbPat
35090 68 20 3d 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20  h = zFilename;. 
350a0 20 20 20 20 20 70 43 74 78 2d 3e 72 65 73 65 72       pCtx->reser
350b0 76 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 73  ved = 0;.      s
350c0 72 61 6e 64 6f 6d 64 65 76 28 29 3b 0a 20 20 20  randomdev();.   
350d0 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65     unixEnterMute
350e0 78 28 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  x();.      rc = 
350f0 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 70 4e  findInodeInfo(pN
35100 65 77 2c 20 26 70 4e 65 77 2d 3e 70 49 6e 6f 64  ew, &pNew->pInod
35110 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
35120 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
35130 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
35140 72 65 65 28 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e  ree(pNew->lockin
35150 67 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20  gContext);.     
35160 20 20 20 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28     robust_close(
35170 70 4e 65 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f  pNew, h, __LINE_
35180 5f 29 3b 0a 20 20 20 20 20 20 20 20 68 20 3d 20  _);.        h = 
35190 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  -1;.      }.    
351a0 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
351b0 28 29 3b 20 20 20 20 20 20 20 20 0a 20 20 20 20  ();        .    
351c0 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  }.  }.#endif..  
351d0 65 6c 73 65 20 69 66 28 20 70 4c 6f 63 6b 69 6e  else if( pLockin
351e0 67 53 74 79 6c 65 20 3d 3d 20 26 64 6f 74 6c 6f  gStyle == &dotlo
351f0 63 6b 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20  ckIoMethods ){. 
35200 20 20 20 2f 2a 20 44 6f 74 66 69 6c 65 20 6c 6f     /* Dotfile lo
35210 63 6b 69 6e 67 20 75 73 65 73 20 74 68 65 20 66  cking uses the f
35220 69 6c 65 20 70 61 74 68 20 73 6f 20 69 74 20 6e  ile path so it n
35230 65 65 64 73 20 74 6f 20 62 65 20 69 6e 63 6c 75  eeds to be inclu
35240 64 65 64 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68  ded in.    ** th
35250 65 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67  e dotlockLocking
35260 43 6f 6e 74 65 78 74 20 0a 20 20 20 20 2a 2f 0a  Context .    */.
35270 20 20 20 20 63 68 61 72 20 2a 7a 4c 6f 63 6b 46      char *zLockF
35280 69 6c 65 3b 0a 20 20 20 20 69 6e 74 20 6e 46 69  ile;.    int nFi
35290 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 61 73 73 65  lename;.    asse
352a0 72 74 28 20 7a 46 69 6c 65 6e 61 6d 65 21 3d 30  rt( zFilename!=0
352b0 20 29 3b 0a 20 20 20 20 6e 46 69 6c 65 6e 61 6d   );.    nFilenam
352c0 65 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28  e = (int)strlen(
352d0 7a 46 69 6c 65 6e 61 6d 65 29 20 2b 20 36 3b 0a  zFilename) + 6;.
352e0 20 20 20 20 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20      zLockFile = 
352f0 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f  (char *)sqlite3_
35300 6d 61 6c 6c 6f 63 36 34 28 6e 46 69 6c 65 6e 61  malloc64(nFilena
35310 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 7a 4c 6f  me);.    if( zLo
35320 63 6b 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20  ckFile==0 ){.   
35330 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
35340 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  OMEM;.    }else{
35350 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
35360 6e 70 72 69 6e 74 66 28 6e 46 69 6c 65 6e 61 6d  nprintf(nFilenam
35370 65 2c 20 7a 4c 6f 63 6b 46 69 6c 65 2c 20 22 25  e, zLockFile, "%
35380 73 22 20 44 4f 54 4c 4f 43 4b 5f 53 55 46 46 49  s" DOTLOCK_SUFFI
35390 58 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  X, zFilename);. 
353a0 20 20 20 7d 0a 20 20 20 20 70 4e 65 77 2d 3e 6c     }.    pNew->l
353b0 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d 20  ockingContext = 
353c0 7a 4c 6f 63 6b 46 69 6c 65 3b 0a 20 20 7d 0a 0a  zLockFile;.  }..
353d0 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20  #if OS_VXWORKS. 
353e0 20 65 6c 73 65 20 69 66 28 20 70 4c 6f 63 6b 69   else if( pLocki
353f0 6e 67 53 74 79 6c 65 20 3d 3d 20 26 73 65 6d 49  ngStyle == &semI
35400 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20  oMethods ){.    
35410 2f 2a 20 4e 61 6d 65 64 20 73 65 6d 61 70 68 6f  /* Named semapho
35420 72 65 20 6c 6f 63 6b 69 6e 67 20 75 73 65 73 20  re locking uses 
35430 74 68 65 20 66 69 6c 65 20 70 61 74 68 20 73 6f  the file path so
35440 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 0a   it needs to be.
35450 20 20 20 20 2a 2a 20 69 6e 63 6c 75 64 65 64 20      ** included 
35460 69 6e 20 74 68 65 20 73 65 6d 4c 6f 63 6b 69 6e  in the semLockin
35470 67 43 6f 6e 74 65 78 74 0a 20 20 20 20 2a 2f 0a  gContext.    */.
35480 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74      unixEnterMut
35490 65 78 28 29 3b 0a 20 20 20 20 72 63 20 3d 20 66  ex();.    rc = f
354a0 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 70 4e 65  indInodeInfo(pNe
354b0 77 2c 20 26 70 4e 65 77 2d 3e 70 49 6e 6f 64 65  w, &pNew->pInode
354c0 29 3b 0a 20 20 20 20 69 66 28 20 28 72 63 3d 3d  );.    if( (rc==
354d0 53 51 4c 49 54 45 5f 4f 4b 29 20 26 26 20 28 70  SQLITE_OK) && (p
354e0 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65  New->pInode->pSe
354f0 6d 3d 3d 4e 55 4c 4c 29 20 29 7b 0a 20 20 20 20  m==NULL) ){.    
35500 20 20 63 68 61 72 20 2a 7a 53 65 6d 4e 61 6d 65    char *zSemName
35510 20 3d 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d   = pNew->pInode-
35520 3e 61 53 65 6d 4e 61 6d 65 3b 0a 20 20 20 20 20  >aSemName;.     
35530 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 73 71   int n;.      sq
35540 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 4d  lite3_snprintf(M
35550 41 58 5f 50 41 54 48 4e 41 4d 45 2c 20 7a 53 65  AX_PATHNAME, zSe
35560 6d 4e 61 6d 65 2c 20 22 2f 25 73 2e 73 65 6d 22  mName, "/%s.sem"
35570 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
35580 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70           pNew->p
35590 49 64 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61  Id->zCanonicalNa
355a0 6d 65 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 20  me);.      for( 
355b0 6e 3d 31 3b 20 7a 53 65 6d 4e 61 6d 65 5b 6e 5d  n=1; zSemName[n]
355c0 3b 20 6e 2b 2b 20 29 0a 20 20 20 20 20 20 20 20  ; n++ ).        
355d0 69 66 28 20 7a 53 65 6d 4e 61 6d 65 5b 6e 5d 3d  if( zSemName[n]=
355e0 3d 27 2f 27 20 29 20 7a 53 65 6d 4e 61 6d 65 5b  ='/' ) zSemName[
355f0 6e 5d 20 3d 20 27 5f 27 3b 0a 20 20 20 20 20 20  n] = '_';.      
35600 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53  pNew->pInode->pS
35610 65 6d 20 3d 20 73 65 6d 5f 6f 70 65 6e 28 7a 53  em = sem_open(zS
35620 65 6d 4e 61 6d 65 2c 20 4f 5f 43 52 45 41 54 2c  emName, O_CREAT,
35630 20 30 36 36 36 2c 20 31 29 3b 0a 20 20 20 20 20   0666, 1);.     
35640 20 69 66 28 20 70 4e 65 77 2d 3e 70 49 6e 6f 64   if( pNew->pInod
35650 65 2d 3e 70 53 65 6d 20 3d 3d 20 53 45 4d 5f 46  e->pSem == SEM_F
35660 41 49 4c 45 44 20 29 7b 0a 20 20 20 20 20 20 20  AILED ){.       
35670 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
35680 45 4d 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  EM;.        pNew
35690 2d 3e 70 49 6e 6f 64 65 2d 3e 61 53 65 6d 4e 61  ->pInode->aSemNa
356a0 6d 65 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 20 20  me[0] = '\0';.  
356b0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
356c0 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
356d0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a  ;.  }.#endif.  .
356e0 20 20 73 74 6f 72 65 4c 61 73 74 45 72 72 6e 6f    storeLastErrno
356f0 28 70 4e 65 77 2c 20 30 29 3b 0a 23 69 66 20 4f  (pNew, 0);.#if O
35700 53 5f 56 58 57 4f 52 4b 53 0a 20 20 69 66 28 20  S_VXWORKS.  if( 
35710 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
35720 0a 20 20 20 20 69 66 28 20 68 3e 3d 30 20 29 20  .    if( h>=0 ) 
35730 72 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 4e 65  robust_close(pNe
35740 77 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b  w, h, __LINE__);
35750 0a 20 20 20 20 68 20 3d 20 2d 31 3b 0a 20 20 20  .    h = -1;.   
35760 20 6f 73 55 6e 6c 69 6e 6b 28 7a 46 69 6c 65 6e   osUnlink(zFilen
35770 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  ame);.    pNew->
35780 63 74 72 6c 46 6c 61 67 73 20 7c 3d 20 55 4e 49  ctrlFlags |= UNI
35790 58 46 49 4c 45 5f 44 45 4c 45 54 45 3b 0a 20 20  XFILE_DELETE;.  
357a0 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 72  }.#endif.  if( r
357b0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
357c0 20 20 20 20 69 66 28 20 68 3e 3d 30 20 29 20 72      if( h>=0 ) r
357d0 6f 62 75 73 74 5f 63 6c 6f 73 65 28 70 4e 65 77  obust_close(pNew
357e0 2c 20 68 2c 20 5f 5f 4c 49 4e 45 5f 5f 29 3b 0a  , h, __LINE__);.
357f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4e 65    }else{.    pNe
35800 77 2d 3e 70 4d 65 74 68 6f 64 20 3d 20 70 4c 6f  w->pMethod = pLo
35810 63 6b 69 6e 67 53 74 79 6c 65 3b 0a 20 20 20 20  ckingStyle;.    
35820 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2b 31 29 3b  OpenCounter(+1);
35830 0a 20 20 20 20 76 65 72 69 66 79 44 62 46 69 6c  .    verifyDbFil
35840 65 28 70 4e 65 77 29 3b 0a 20 20 7d 0a 20 20 72  e(pNew);.  }.  r
35850 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
35860 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 61  ** Return the na
35870 6d 65 20 6f 66 20 61 20 64 69 72 65 63 74 6f 72  me of a director
35880 79 20 69 6e 20 77 68 69 63 68 20 74 6f 20 70 75  y in which to pu
35890 74 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  t temporary file
358a0 73 2e 0a 2a 2a 20 49 66 20 6e 6f 20 73 75 69 74  s..** If no suit
358b0 61 62 6c 65 20 74 65 6d 70 6f 72 61 72 79 20 66  able temporary f
358c0 69 6c 65 20 64 69 72 65 63 74 6f 72 79 20 63 61  ile directory ca
358d0 6e 20 62 65 20 66 6f 75 6e 64 2c 20 72 65 74 75  n be found, retu
358e0 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74  rn NULL..*/.stat
358f0 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 75  ic const char *u
35900 6e 69 78 54 65 6d 70 46 69 6c 65 44 69 72 28 76  nixTempFileDir(v
35910 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20 63  oid){.  static c
35920 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 44 69 72  onst char *azDir
35930 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 30 2c 0a  s[] = {.     0,.
35940 20 20 20 20 20 30 2c 0a 20 20 20 20 20 30 2c 0a       0,.     0,.
35950 20 20 20 20 20 22 2f 76 61 72 2f 74 6d 70 22 2c       "/var/tmp",
35960 0a 20 20 20 20 20 22 2f 75 73 72 2f 74 6d 70 22  .     "/usr/tmp"
35970 2c 0a 20 20 20 20 20 22 2f 74 6d 70 22 2c 0a 20  ,.     "/tmp",. 
35980 20 20 20 20 30 20 20 20 20 20 20 20 20 2f 2a 20      0        /* 
35990 4c 69 73 74 20 74 65 72 6d 69 6e 61 74 6f 72 20  List terminator 
359a0 2a 2f 0a 20 20 7d 3b 0a 20 20 75 6e 73 69 67 6e  */.  };.  unsign
359b0 65 64 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75  ed int i;.  stru
359c0 63 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20 63  ct stat buf;.  c
359d0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 69 72 20  onst char *zDir 
359e0 3d 20 30 3b 0a 0a 20 20 61 7a 44 69 72 73 5b 30  = 0;..  azDirs[0
359f0 5d 20 3d 20 73 71 6c 69 74 65 33 5f 74 65 6d 70  ] = sqlite3_temp
35a00 5f 64 69 72 65 63 74 6f 72 79 3b 0a 20 20 69 66  _directory;.  if
35a10 28 20 21 61 7a 44 69 72 73 5b 31 5d 20 29 20 61  ( !azDirs[1] ) a
35a20 7a 44 69 72 73 5b 31 5d 20 3d 20 67 65 74 65 6e  zDirs[1] = geten
35a30 76 28 22 53 51 4c 49 54 45 5f 54 4d 50 44 49 52  v("SQLITE_TMPDIR
35a40 22 29 3b 0a 20 20 69 66 28 20 21 61 7a 44 69 72  ");.  if( !azDir
35a50 73 5b 32 5d 20 29 20 61 7a 44 69 72 73 5b 32 5d  s[2] ) azDirs[2]
35a60 20 3d 20 67 65 74 65 6e 76 28 22 54 4d 50 44 49   = getenv("TMPDI
35a70 52 22 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  R");.  for(i=0; 
35a80 69 3c 73 69 7a 65 6f 66 28 61 7a 44 69 72 73 29  i<sizeof(azDirs)
35a90 2f 73 69 7a 65 6f 66 28 61 7a 44 69 72 73 5b 30  /sizeof(azDirs[0
35aa0 5d 29 3b 20 7a 44 69 72 3d 61 7a 44 69 72 73 5b  ]); zDir=azDirs[
35ab0 69 2b 2b 5d 29 7b 0a 20 20 20 20 69 66 28 20 7a  i++]){.    if( z
35ac0 44 69 72 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  Dir==0 ) continu
35ad0 65 3b 0a 20 20 20 20 69 66 28 20 6f 73 53 74 61  e;.    if( osSta
35ae0 74 28 7a 44 69 72 2c 20 26 62 75 66 29 20 29 20  t(zDir, &buf) ) 
35af0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
35b00 28 20 21 53 5f 49 53 44 49 52 28 62 75 66 2e 73  ( !S_ISDIR(buf.s
35b10 74 5f 6d 6f 64 65 29 20 29 20 63 6f 6e 74 69 6e  t_mode) ) contin
35b20 75 65 3b 0a 20 20 20 20 69 66 28 20 6f 73 41 63  ue;.    if( osAc
35b30 63 65 73 73 28 7a 44 69 72 2c 20 30 37 29 20 29  cess(zDir, 07) )
35b40 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 62   continue;.    b
35b50 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  reak;.  }.  retu
35b60 72 6e 20 7a 44 69 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn zDir;.}../*.*
35b70 2a 20 43 72 65 61 74 65 20 61 20 74 65 6d 70 6f  * Create a tempo
35b80 72 61 72 79 20 66 69 6c 65 20 6e 61 6d 65 20 69  rary file name i
35b90 6e 20 7a 42 75 66 2e 20 20 7a 42 75 66 20 6d 75  n zBuf.  zBuf mu
35ba0 73 74 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 0a  st be allocated.
35bb0 2a 2a 20 62 79 20 74 68 65 20 63 61 6c 6c 69 6e  ** by the callin
35bc0 67 20 70 72 6f 63 65 73 73 20 61 6e 64 20 6d 75  g process and mu
35bd0 73 74 20 62 65 20 62 69 67 20 65 6e 6f 75 67 68  st be big enough
35be0 20 74 6f 20 68 6f 6c 64 20 61 74 20 6c 65 61 73   to hold at leas
35bf0 74 0a 2a 2a 20 70 56 66 73 2d 3e 6d 78 50 61 74  t.** pVfs->mxPat
35c00 68 6e 61 6d 65 20 62 79 74 65 73 2e 0a 2a 2f 0a  hname bytes..*/.
35c10 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 47  static int unixG
35c20 65 74 54 65 6d 70 6e 61 6d 65 28 69 6e 74 20 6e  etTempname(int n
35c30 42 75 66 2c 20 63 68 61 72 20 2a 7a 42 75 66 29  Buf, char *zBuf)
35c40 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  {.  static const
35c50 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 7a   unsigned char z
35c60 43 68 61 72 73 5b 5d 20 3d 0a 20 20 20 20 22 61  Chars[] =.    "a
35c70 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71  bcdefghijklmnopq
35c80 72 73 74 75 76 77 78 79 7a 22 0a 20 20 20 20 22  rstuvwxyz".    "
35c90 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50  ABCDEFGHIJKLMNOP
35ca0 51 52 53 54 55 56 57 58 59 5a 22 0a 20 20 20 20  QRSTUVWXYZ".    
35cb0 22 30 31 32 33 34 35 36 37 38 39 22 3b 0a 20 20  "0123456789";.  
35cc0 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 2c 20  unsigned int i, 
35cd0 6a 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  j;.  const char 
35ce0 2a 7a 44 69 72 3b 0a 0a 20 20 2f 2a 20 49 74 27  *zDir;..  /* It'
35cf0 73 20 6f 64 64 20 74 6f 20 73 69 6d 75 6c 61 74  s odd to simulat
35d00 65 20 61 6e 20 69 6f 2d 65 72 72 6f 72 20 68 65  e an io-error he
35d10 72 65 2c 20 62 75 74 20 72 65 61 6c 6c 79 20 74  re, but really t
35d20 68 69 73 20 69 73 20 6a 75 73 74 0a 20 20 2a 2a  his is just.  **
35d30 20 75 73 69 6e 67 20 74 68 65 20 69 6f 2d 65 72   using the io-er
35d40 72 6f 72 20 69 6e 66 72 61 73 74 72 75 63 74 75  ror infrastructu
35d50 72 65 20 74 6f 20 74 65 73 74 20 74 68 61 74 20  re to test that 
35d60 53 51 4c 69 74 65 20 68 61 6e 64 6c 65 73 20 74  SQLite handles t
35d70 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f  his.  ** functio
35d80 6e 20 66 61 69 6c 69 6e 67 2e 20 0a 20 20 2a 2f  n failing. .  */
35d90 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
35da0 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54  or( return SQLIT
35db0 45 5f 49 4f 45 52 52 20 29 3b 0a 0a 20 20 7a 44  E_IOERR );..  zD
35dc0 69 72 20 3d 20 75 6e 69 78 54 65 6d 70 46 69 6c  ir = unixTempFil
35dd0 65 44 69 72 28 29 3b 0a 20 20 69 66 28 20 7a 44  eDir();.  if( zD
35de0 69 72 3d 3d 30 20 29 20 7a 44 69 72 20 3d 20 22  ir==0 ) zDir = "
35df0 2e 22 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20  .";..  /* Check 
35e00 74 68 61 74 20 74 68 65 20 6f 75 74 70 75 74 20  that the output 
35e10 62 75 66 66 65 72 20 69 73 20 6c 61 72 67 65 20  buffer is large 
35e20 65 6e 6f 75 67 68 20 66 6f 72 20 74 68 65 20 74  enough for the t
35e30 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 0a 20  emporary file . 
35e40 20 2a 2a 20 6e 61 6d 65 2e 20 49 66 20 69 74 20   ** name. If it 
35e50 69 73 20 6e 6f 74 2c 20 72 65 74 75 72 6e 20 53  is not, return S
35e60 51 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 20 20 2a  QLITE_ERROR..  *
35e70 2f 0a 20 20 69 66 28 20 28 73 74 72 6c 65 6e 28  /.  if( (strlen(
35e80 7a 44 69 72 29 20 2b 20 73 74 72 6c 65 6e 28 53  zDir) + strlen(S
35e90 51 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f  QLITE_TEMP_FILE_
35ea0 50 52 45 46 49 58 29 20 2b 20 31 38 29 20 3e 3d  PREFIX) + 18) >=
35eb0 20 28 73 69 7a 65 5f 74 29 6e 42 75 66 20 29 7b   (size_t)nBuf ){
35ec0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
35ed0 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  TE_ERROR;.  }.. 
35ee0 20 64 6f 7b 0a 20 20 20 20 73 71 6c 69 74 65 33   do{.    sqlite3
35ef0 5f 73 6e 70 72 69 6e 74 66 28 6e 42 75 66 2d 31  _snprintf(nBuf-1
35f00 38 2c 20 7a 42 75 66 2c 20 22 25 73 2f 22 53 51  8, zBuf, "%s/"SQ
35f10 4c 49 54 45 5f 54 45 4d 50 5f 46 49 4c 45 5f 50  LITE_TEMP_FILE_P
35f20 52 45 46 49 58 2c 20 7a 44 69 72 29 3b 0a 20 20  REFIX, zDir);.  
35f30 20 20 6a 20 3d 20 28 69 6e 74 29 73 74 72 6c 65    j = (int)strle
35f40 6e 28 7a 42 75 66 29 3b 0a 20 20 20 20 73 71 6c  n(zBuf);.    sql
35f50 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28  ite3_randomness(
35f60 31 35 2c 20 26 7a 42 75 66 5b 6a 5d 29 3b 0a 20  15, &zBuf[j]);. 
35f70 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 31 35     for(i=0; i<15
35f80 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20  ; i++, j++){.   
35f90 20 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 28 63 68     zBuf[j] = (ch
35fa0 61 72 29 7a 43 68 61 72 73 5b 20 28 28 75 6e 73  ar)zChars[ ((uns
35fb0 69 67 6e 65 64 20 63 68 61 72 29 7a 42 75 66 5b  igned char)zBuf[
35fc0 6a 5d 29 25 28 73 69 7a 65 6f 66 28 7a 43 68 61  j])%(sizeof(zCha
35fd0 72 73 29 2d 31 29 20 5d 3b 0a 20 20 20 20 7d 0a  rs)-1) ];.    }.
35fe0 20 20 20 20 7a 42 75 66 5b 6a 5d 20 3d 20 30 3b      zBuf[j] = 0;
35ff0 0a 20 20 20 20 7a 42 75 66 5b 6a 2b 31 5d 20 3d  .    zBuf[j+1] =
36000 20 30 3b 0a 20 20 7d 77 68 69 6c 65 28 20 6f 73   0;.  }while( os
36010 41 63 63 65 73 73 28 7a 42 75 66 2c 30 29 3d 3d  Access(zBuf,0)==
36020 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  0 );.  return SQ
36030 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20  LITE_OK;.}..#if 
36040 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
36050 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64  CKING_STYLE && d
36060 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
36070 29 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e 65 20  )./*.** Routine 
36080 74 6f 20 74 72 61 6e 73 66 6f 72 6d 20 61 20 75  to transform a u
36090 6e 69 78 46 69 6c 65 20 69 6e 74 6f 20 61 20 70  nixFile into a p
360a0 72 6f 78 79 2d 6c 6f 63 6b 69 6e 67 20 75 6e 69  roxy-locking uni
360b0 78 46 69 6c 65 2e 0a 2a 2a 20 49 6d 70 6c 65 6d  xFile..** Implem
360c0 65 6e 74 61 74 69 6f 6e 20 69 6e 20 74 68 65 20  entation in the 
360d0 70 72 6f 78 79 2d 6c 6f 63 6b 20 64 69 76 69 73  proxy-lock divis
360e0 69 6f 6e 2c 20 62 75 74 20 75 73 65 64 20 62 79  ion, but used by
360f0 20 75 6e 69 78 4f 70 65 6e 28 29 0a 2a 2a 20 69   unixOpen().** i
36100 66 20 53 51 4c 49 54 45 5f 50 52 45 46 45 52 5f  f SQLITE_PREFER_
36110 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 20 69 73  PROXY_LOCKING is
36120 20 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61   defined..*/.sta
36130 74 69 63 20 69 6e 74 20 70 72 6f 78 79 54 72 61  tic int proxyTra
36140 6e 73 66 6f 72 6d 55 6e 69 78 46 69 6c 65 28 75  nsformUnixFile(u
36150 6e 69 78 46 69 6c 65 2a 2c 20 63 6f 6e 73 74 20  nixFile*, const 
36160 63 68 61 72 2a 29 3b 0a 23 65 6e 64 69 66 0a 0a  char*);.#endif..
36170 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20 66 6f 72  /*.** Search for
36180 20 61 6e 20 75 6e 75 73 65 64 20 66 69 6c 65 20   an unused file 
36190 64 65 73 63 72 69 70 74 6f 72 20 74 68 61 74 20  descriptor that 
361a0 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 74 68  was opened on th
361b0 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 66  e database .** f
361c0 69 6c 65 20 28 6e 6f 74 20 61 20 6a 6f 75 72 6e  ile (not a journ
361d0 61 6c 20 6f 72 20 6d 61 73 74 65 72 2d 6a 6f 75  al or master-jou
361e0 72 6e 61 6c 20 66 69 6c 65 29 20 69 64 65 6e 74  rnal file) ident
361f0 69 66 69 65 64 20 62 79 20 70 61 74 68 6e 61 6d  ified by pathnam
36200 65 0a 2a 2a 20 7a 50 61 74 68 20 77 69 74 68 20  e.** zPath with 
36210 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 58 58 58 20  SQLITE_OPEN_XXX 
36220 66 6c 61 67 73 20 6d 61 74 63 68 69 6e 67 20 74  flags matching t
36230 68 6f 73 65 20 70 61 73 73 65 64 20 61 73 20 74  hose passed as t
36240 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 61 72 67  he second.** arg
36250 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75  ument to this fu
36260 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 53 75  nction..**.** Su
36270 63 68 20 61 20 66 69 6c 65 20 64 65 73 63 72 69  ch a file descri
36280 70 74 6f 72 20 6d 61 79 20 65 78 69 73 74 20 69  ptor may exist i
36290 66 20 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e  f a database con
362a0 6e 65 63 74 69 6f 6e 20 77 61 73 20 63 6c 6f 73  nection was clos
362b0 65 64 0a 2a 2a 20 62 75 74 20 74 68 65 20 61 73  ed.** but the as
362c0 73 6f 63 69 61 74 65 64 20 66 69 6c 65 20 64 65  sociated file de
362d0 73 63 72 69 70 74 6f 72 20 63 6f 75 6c 64 20 6e  scriptor could n
362e0 6f 74 20 62 65 20 63 6c 6f 73 65 64 20 62 65 63  ot be closed bec
362f0 61 75 73 65 20 73 6f 6d 65 0a 2a 2a 20 6f 74 68  ause some.** oth
36300 65 72 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  er file descript
36310 6f 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73  or open on the s
36320 61 6d 65 20 66 69 6c 65 20 69 73 20 68 6f 6c 64  ame file is hold
36330 69 6e 67 20 61 20 66 69 6c 65 2d 6c 6f 63 6b 2e  ing a file-lock.
36340 0a 2a 2a 20 52 65 66 65 72 20 74 6f 20 63 6f 6d  .** Refer to com
36350 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 75 6e 69  ments in the uni
36360 78 43 6c 6f 73 65 28 29 20 66 75 6e 63 74 69 6f  xClose() functio
36370 6e 20 61 6e 64 20 74 68 65 20 6c 65 6e 67 74 68  n and the length
36380 79 20 63 6f 6d 6d 65 6e 74 0a 2a 2a 20 64 65 73  y comment.** des
36390 63 72 69 62 69 6e 67 20 22 50 6f 73 69 78 20 41  cribing "Posix A
363a0 64 76 69 73 6f 72 79 20 4c 6f 63 6b 69 6e 67 22  dvisory Locking"
363b0 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
363c0 20 74 68 69 73 20 66 69 6c 65 20 66 6f 72 20 0a   this file for .
363d0 2a 2a 20 66 75 72 74 68 65 72 20 64 65 74 61 69  ** further detai
363e0 6c 73 2e 20 41 6c 73 6f 2c 20 74 69 63 6b 65 74  ls. Also, ticket
363f0 20 23 34 30 31 38 2e 0a 2a 2a 0a 2a 2a 20 49 66   #4018..**.** If
36400 20 61 20 73 75 69 74 61 62 6c 65 20 66 69 6c 65   a suitable file
36410 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 66   descriptor is f
36420 6f 75 6e 64 2c 20 74 68 65 6e 20 69 74 20 69 73  ound, then it is
36430 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 6e 6f   returned. If no
36440 0a 2a 2a 20 73 75 63 68 20 66 69 6c 65 20 64 65  .** such file de
36450 73 63 72 69 70 74 6f 72 20 69 73 20 6c 6f 63 61  scriptor is loca
36460 74 65 64 2c 20 2d 31 20 69 73 20 72 65 74 75 72  ted, -1 is retur
36470 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 55  ned..*/.static U
36480 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 66 69 6e  nixUnusedFd *fin
36490 64 52 65 75 73 61 62 6c 65 46 64 28 63 6f 6e 73  dReusableFd(cons
364a0 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 69  t char *zPath, i
364b0 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 55 6e 69  nt flags){.  Uni
364c0 78 55 6e 75 73 65 64 46 64 20 2a 70 55 6e 75 73  xUnusedFd *pUnus
364d0 65 64 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 44 6f  ed = 0;..  /* Do
364e0 20 6e 6f 74 20 73 65 61 72 63 68 20 66 6f 72 20   not search for 
364f0 61 6e 20 75 6e 75 73 65 64 20 66 69 6c 65 20 64  an unused file d
36500 65 73 63 72 69 70 74 6f 72 20 6f 6e 20 76 78 77  escriptor on vxw
36510 6f 72 6b 73 2e 20 4e 6f 74 20 62 65 63 61 75 73  orks. Not becaus
36520 65 0a 20 20 2a 2a 20 76 78 77 6f 72 6b 73 20 77  e.  ** vxworks w
36530 6f 75 6c 64 20 6e 6f 74 20 62 65 6e 65 66 69 74  ould not benefit
36540 20 66 72 6f 6d 20 74 68 65 20 63 68 61 6e 67 65   from the change
36550 20 28 69 74 20 6d 69 67 68 74 2c 20 77 65 27 72   (it might, we'r
36560 65 20 6e 6f 74 20 73 75 72 65 29 2c 0a 20 20 2a  e not sure),.  *
36570 2a 20 62 75 74 20 62 65 63 61 75 73 65 20 6e 6f  * but because no
36580 20 77 61 79 20 74 6f 20 74 65 73 74 20 69 74 20   way to test it 
36590 69 73 20 63 75 72 72 65 6e 74 6c 79 20 61 76 61  is currently ava
365a0 69 6c 61 62 6c 65 2e 20 49 74 20 69 73 20 62 65  ilable. It is be
365b0 74 74 65 72 20 0a 20 20 2a 2a 20 6e 6f 74 20 74  tter .  ** not t
365c0 6f 20 72 69 73 6b 20 62 72 65 61 6b 69 6e 67 20  o risk breaking 
365d0 76 78 77 6f 72 6b 73 20 73 75 70 70 6f 72 74 20  vxworks support 
365e0 66 6f 72 20 74 68 65 20 73 61 6b 65 20 6f 66 20  for the sake of 
365f0 73 75 63 68 20 61 6e 20 6f 62 73 63 75 72 65 20  such an obscure 
36600 0a 20 20 2a 2a 20 66 65 61 74 75 72 65 2e 20 20  .  ** feature.  
36610 2a 2f 0a 23 69 66 20 21 4f 53 5f 56 58 57 4f 52  */.#if !OS_VXWOR
36620 4b 53 0a 20 20 73 74 72 75 63 74 20 73 74 61 74  KS.  struct stat
36630 20 73 53 74 61 74 3b 20 20 20 20 20 20 20 20 20   sStat;         
36640 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73            /* Res
36650 75 6c 74 73 20 6f 66 20 73 74 61 74 28 29 20 63  ults of stat() c
36660 61 6c 6c 20 2a 2f 0a 0a 20 20 2f 2a 20 41 20 73  all */..  /* A s
36670 74 61 74 28 29 20 63 61 6c 6c 20 6d 61 79 20 66  tat() call may f
36680 61 69 6c 20 66 6f 72 20 76 61 72 69 6f 75 73 20  ail for various 
36690 72 65 61 73 6f 6e 73 2e 20 49 66 20 74 68 69 73  reasons. If this
366a0 20 68 61 70 70 65 6e 73 2c 20 69 74 20 69 73 0a   happens, it is.
366b0 20 20 2a 2a 20 61 6c 6d 6f 73 74 20 63 65 72 74    ** almost cert
366c0 61 69 6e 20 74 68 61 74 20 61 6e 20 6f 70 65 6e  ain that an open
366d0 28 29 20 63 61 6c 6c 20 6f 6e 20 74 68 65 20 73  () call on the s
366e0 61 6d 65 20 70 61 74 68 20 77 69 6c 6c 20 61 6c  ame path will al
366f0 73 6f 20 66 61 69 6c 2e 0a 20 20 2a 2a 20 46 6f  so fail..  ** Fo
36700 72 20 74 68 69 73 20 72 65 61 73 6f 6e 2c 20 69  r this reason, i
36710 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
36720 73 20 69 6e 20 74 68 65 20 73 74 61 74 28 29 20  s in the stat() 
36730 63 61 6c 6c 20 68 65 72 65 2c 20 69 74 20 69 73  call here, it is
36740 0a 20 20 2a 2a 20 69 67 6e 6f 72 65 64 20 61 6e  .  ** ignored an
36750 64 20 2d 31 20 69 73 20 72 65 74 75 72 6e 65 64  d -1 is returned
36760 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c  . The caller wil
36770 6c 20 74 72 79 20 74 6f 20 6f 70 65 6e 20 61 20  l try to open a 
36780 6e 65 77 20 66 69 6c 65 0a 20 20 2a 2a 20 64 65  new file.  ** de
36790 73 63 72 69 70 74 6f 72 20 6f 6e 20 74 68 65 20  scriptor on the 
367a0 73 61 6d 65 20 70 61 74 68 2c 20 66 61 69 6c 2c  same path, fail,
367b0 20 61 6e 64 20 72 65 74 75 72 6e 20 61 6e 20 65   and return an e
367c0 72 72 6f 72 20 74 6f 20 53 51 4c 69 74 65 2e 0a  rror to SQLite..
367d0 20 20 2a 2a 0a 20 20 2a 2a 20 45 76 65 6e 20 69    **.  ** Even i
367e0 66 20 61 20 73 75 62 73 65 71 75 65 6e 74 20 6f  f a subsequent o
367f0 70 65 6e 28 29 20 63 61 6c 6c 20 64 6f 65 73 20  pen() call does 
36800 73 75 63 63 65 65 64 2c 20 74 68 65 20 63 6f 6e  succeed, the con
36810 73 65 71 75 65 6e 63 65 73 20 6f 66 0a 20 20 2a  sequences of.  *
36820 2a 20 6e 6f 74 20 73 65 61 72 63 68 69 6e 67 20  * not searching 
36830 66 6f 72 20 61 20 72 65 75 73 61 62 6c 65 20 66  for a reusable f
36840 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 61  ile descriptor a
36850 72 65 20 6e 6f 74 20 64 69 72 65 2e 20 20 2a 2f  re not dire.  */
36860 0a 20 20 69 66 28 20 30 3d 3d 6f 73 53 74 61 74  .  if( 0==osStat
36870 28 7a 50 61 74 68 2c 20 26 73 53 74 61 74 29 20  (zPath, &sStat) 
36880 29 7b 0a 20 20 20 20 75 6e 69 78 49 6e 6f 64 65  ){.    unixInode
36890 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a 0a 20  Info *pInode;.. 
368a0 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65     unixEnterMute
368b0 78 28 29 3b 0a 20 20 20 20 70 49 6e 6f 64 65 20  x();.    pInode 
368c0 3d 20 69 6e 6f 64 65 4c 69 73 74 3b 0a 20 20 20  = inodeList;.   
368d0 20 77 68 69 6c 65 28 20 70 49 6e 6f 64 65 20 26   while( pInode &
368e0 26 20 28 70 49 6e 6f 64 65 2d 3e 66 69 6c 65 49  & (pInode->fileI
368f0 64 2e 64 65 76 21 3d 73 53 74 61 74 2e 73 74 5f  d.dev!=sStat.st_
36900 64 65 76 0a 20 20 20 20 20 20 20 20 20 20 20 20  dev.            
36910 20 20 20 20 20 20 20 20 20 7c 7c 20 70 49 6e 6f           || pIno
36920 64 65 2d 3e 66 69 6c 65 49 64 2e 69 6e 6f 21 3d  de->fileId.ino!=
36930 73 53 74 61 74 2e 73 74 5f 69 6e 6f 29 20 29 7b  sStat.st_ino) ){
36940 0a 20 20 20 20 20 20 20 70 49 6e 6f 64 65 20 3d  .       pInode =
36950 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a   pInode->pNext;.
36960 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 49      }.    if( pI
36970 6e 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 55 6e  node ){.      Un
36980 69 78 55 6e 75 73 65 64 46 64 20 2a 2a 70 70 3b  ixUnusedFd **pp;
36990 0a 20 20 20 20 20 20 66 6f 72 28 70 70 3d 26 70  .      for(pp=&p
369a0 49 6e 6f 64 65 2d 3e 70 55 6e 75 73 65 64 3b 20  Inode->pUnused; 
369b0 2a 70 70 20 26 26 20 28 2a 70 70 29 2d 3e 66 6c  *pp && (*pp)->fl
369c0 61 67 73 21 3d 66 6c 61 67 73 3b 20 70 70 3d 26  ags!=flags; pp=&
369d0 28 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29 29 3b  ((*pp)->pNext));
369e0 0a 20 20 20 20 20 20 70 55 6e 75 73 65 64 20 3d  .      pUnused =
369f0 20 2a 70 70 3b 0a 20 20 20 20 20 20 69 66 28 20   *pp;.      if( 
36a00 70 55 6e 75 73 65 64 20 29 7b 0a 20 20 20 20 20  pUnused ){.     
36a10 20 20 20 2a 70 70 20 3d 20 70 55 6e 75 73 65 64     *pp = pUnused
36a20 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  ->pNext;.      }
36a30 0a 20 20 20 20 7d 0a 20 20 20 20 75 6e 69 78 4c  .    }.    unixL
36a40 65 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d  eaveMutex();.  }
36a50 0a 23 65 6e 64 69 66 20 20 20 20 2f 2a 20 69 66  .#endif    /* if
36a60 20 21 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a   !OS_VXWORKS */.
36a70 20 20 72 65 74 75 72 6e 20 70 55 6e 75 73 65 64    return pUnused
36a80 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
36a90 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
36aa0 65 64 20 62 79 20 75 6e 69 78 4f 70 65 6e 28 29  ed by unixOpen()
36ab0 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68   to determine th
36ac0 65 20 75 6e 69 78 20 70 65 72 6d 69 73 73 69 6f  e unix permissio
36ad0 6e 73 0a 2a 2a 20 74 6f 20 63 72 65 61 74 65 20  ns.** to create 
36ae0 6e 65 77 20 66 69 6c 65 73 20 77 69 74 68 2e 20  new files with. 
36af0 49 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75  If no error occu
36b00 72 73 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f  rs, then SQLITE_
36b10 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a  OK is returned.*
36b20 2a 20 61 6e 64 20 61 20 76 61 6c 75 65 20 73 75  * and a value su
36b30 69 74 61 62 6c 65 20 66 6f 72 20 70 61 73 73 69  itable for passi
36b40 6e 67 20 61 73 20 74 68 65 20 74 68 69 72 64 20  ng as the third 
36b50 61 72 67 75 6d 65 6e 74 20 74 6f 20 6f 70 65 6e  argument to open
36b60 28 32 29 20 69 73 0a 2a 2a 20 77 72 69 74 74 65  (2) is.** writte
36b70 6e 20 74 6f 20 2a 70 4d 6f 64 65 2e 20 49 66 20  n to *pMode. If 
36b80 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
36b90 72 73 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72  rs, an SQLite er
36ba0 72 6f 72 20 63 6f 64 65 20 69 73 20 0a 2a 2a 20  ror code is .** 
36bb0 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65  returned and the
36bc0 20 76 61 6c 75 65 20 6f 66 20 2a 70 4d 6f 64 65   value of *pMode
36bd0 20 69 73 20 6e 6f 74 20 6d 6f 64 69 66 69 65 64   is not modified
36be0 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6d 6f 73 74 20  ..**.** In most 
36bf0 63 61 73 65 73 2c 20 74 68 69 73 20 72 6f 75 74  cases, this rout
36c00 69 6e 65 20 73 65 74 73 20 2a 70 4d 6f 64 65 20  ine sets *pMode 
36c10 74 6f 20 30 2c 20 77 68 69 63 68 20 77 69 6c 6c  to 0, which will
36c20 20 62 65 63 6f 6d 65 0a 2a 2a 20 61 6e 20 69 6e   become.** an in
36c30 64 69 63 61 74 69 6f 6e 20 74 6f 20 72 6f 62 75  dication to robu
36c40 73 74 5f 6f 70 65 6e 28 29 20 74 6f 20 63 72 65  st_open() to cre
36c50 61 74 65 20 74 68 65 20 66 69 6c 65 20 75 73 69  ate the file usi
36c60 6e 67 0a 2a 2a 20 53 51 4c 49 54 45 5f 44 45 46  ng.** SQLITE_DEF
36c70 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53  AULT_FILE_PERMIS
36c80 53 49 4f 4e 53 20 61 64 6a 75 73 74 65 64 20 62  SIONS adjusted b
36c90 79 20 74 68 65 20 75 6d 61 73 6b 2e 0a 2a 2a 20  y the umask..** 
36ca0 42 75 74 20 69 66 20 74 68 65 20 66 69 6c 65 20  But if the file 
36cb0 62 65 69 6e 67 20 6f 70 65 6e 65 64 20 69 73 20  being opened is 
36cc0 61 20 57 41 4c 20 6f 72 20 72 65 67 75 6c 61 72  a WAL or regular
36cd0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74   journal file, t
36ce0 68 65 6e 20 0a 2a 2a 20 74 68 69 73 20 66 75 6e  hen .** this fun
36cf0 63 74 69 6f 6e 20 71 75 65 72 69 65 73 20 74 68  ction queries th
36d00 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 66 6f  e file-system fo
36d10 72 20 74 68 65 20 70 65 72 6d 69 73 73 69 6f 6e  r the permission
36d20 73 20 6f 6e 20 74 68 65 20 0a 2a 2a 20 63 6f 72  s on the .** cor
36d30 72 65 73 70 6f 6e 64 69 6e 67 20 64 61 74 61 62  responding datab
36d40 61 73 65 20 66 69 6c 65 20 61 6e 64 20 73 65 74  ase file and set
36d50 73 20 2a 70 4d 6f 64 65 20 74 6f 20 74 68 69 73  s *pMode to this
36d60 20 76 61 6c 75 65 2e 20 57 68 65 6e 65 76 65 72   value. Whenever
36d70 20 0a 2a 2a 20 70 6f 73 73 69 62 6c 65 2c 20 57   .** possible, W
36d80 41 4c 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 20 66  AL and journal f
36d90 69 6c 65 73 20 61 72 65 20 63 72 65 61 74 65 64  iles are created
36da0 20 75 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20   using the same 
36db0 70 65 72 6d 69 73 73 69 6f 6e 73 20 0a 2a 2a 20  permissions .** 
36dc0 61 73 20 74 68 65 20 61 73 73 6f 63 69 61 74 65  as the associate
36dd0 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  d database file.
36de0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 53 51  .**.** If the SQ
36df0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 38 5f 33 5f  LITE_ENABLE_8_3_
36e00 4e 41 4d 45 53 20 6f 70 74 69 6f 6e 20 69 73 20  NAMES option is 
36e10 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e 20 74 68  enabled, then th
36e20 65 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 66 69  e.** original fi
36e30 6c 65 6e 61 6d 65 20 69 73 20 75 6e 61 76 61 69  lename is unavai
36e40 6c 61 62 6c 65 2e 20 20 42 75 74 20 38 5f 33 5f  lable.  But 8_3_
36e50 4e 41 4d 45 53 20 69 73 20 6f 6e 6c 79 20 75 73  NAMES is only us
36e60 65 64 20 66 6f 72 0a 2a 2a 20 46 41 54 20 66 69  ed for.** FAT fi
36e70 6c 65 73 79 73 74 65 6d 73 20 61 6e 64 20 70 65  lesystems and pe
36e80 72 6d 69 73 73 69 6f 6e 73 20 64 6f 20 6e 6f 74  rmissions do not
36e90 20 6d 61 74 74 65 72 20 74 68 65 72 65 2c 20 73   matter there, s
36ea0 6f 20 6a 75 73 74 20 75 73 65 0a 2a 2a 20 74 68  o just use.** th
36eb0 65 20 64 65 66 61 75 6c 74 20 70 65 72 6d 69 73  e default permis
36ec0 73 69 6f 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  sions..*/.static
36ed0 20 69 6e 74 20 66 69 6e 64 43 72 65 61 74 65 46   int findCreateF
36ee0 69 6c 65 4d 6f 64 65 28 0a 20 20 63 6f 6e 73 74  ileMode(.  const
36ef0 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20   char *zPath,   
36f00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
36f10 74 68 20 6f 66 20 66 69 6c 65 20 28 70 6f 73 73  th of file (poss
36f20 69 62 6c 79 29 20 62 65 69 6e 67 20 63 72 65 61  ibly) being crea
36f30 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  ted */.  int fla
36f40 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gs,             
36f50 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67           /* Flag
36f60 73 20 70 61 73 73 65 64 20 61 73 20 34 74 68 20  s passed as 4th 
36f70 61 72 67 75 6d 65 6e 74 20 74 6f 20 78 4f 70 65  argument to xOpe
36f80 6e 28 29 20 2a 2f 0a 20 20 6d 6f 64 65 5f 74 20  n() */.  mode_t 
36f90 2a 70 4d 6f 64 65 2c 20 20 20 20 20 20 20 20 20  *pMode,         
36fa0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
36fb0 20 50 65 72 6d 69 73 73 69 6f 6e 73 20 74 6f 20   Permissions to 
36fc0 6f 70 65 6e 20 66 69 6c 65 20 77 69 74 68 20 2a  open file with *
36fd0 2f 0a 20 20 75 69 64 5f 74 20 2a 70 55 69 64 2c  /.  uid_t *pUid,
36fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36ff0 20 20 20 20 2f 2a 20 4f 55 54 3a 20 75 69 64 20      /* OUT: uid 
37000 74 6f 20 73 65 74 20 6f 6e 20 74 68 65 20 66 69  to set on the fi
37010 6c 65 20 2a 2f 0a 20 20 67 69 64 5f 74 20 2a 70  le */.  gid_t *p
37020 47 69 64 20 20 20 20 20 20 20 20 20 20 20 20 20  Gid             
37030 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
37040 67 69 64 20 74 6f 20 73 65 74 20 6f 6e 20 74 68  gid to set on th
37050 65 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69  e file */.){.  i
37060 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
37070 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  K;             /
37080 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f  * Return Code */
37090 0a 20 20 2a 70 4d 6f 64 65 20 3d 20 30 3b 0a 20  .  *pMode = 0;. 
370a0 20 2a 70 55 69 64 20 3d 20 30 3b 0a 20 20 2a 70   *pUid = 0;.  *p
370b0 47 69 64 20 3d 20 30 3b 0a 20 20 69 66 28 20 66  Gid = 0;.  if( f
370c0 6c 61 67 73 20 26 20 28 53 51 4c 49 54 45 5f 4f  lags & (SQLITE_O
370d0 50 45 4e 5f 57 41 4c 7c 53 51 4c 49 54 45 5f 4f  PEN_WAL|SQLITE_O
370e0 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
370f0 29 20 29 7b 0a 20 20 20 20 63 68 61 72 20 7a 44  ) ){.    char zD
37100 62 5b 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 31  b[MAX_PATHNAME+1
37110 5d 3b 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61  ];     /* Databa
37120 73 65 20 66 69 6c 65 20 70 61 74 68 20 2a 2f 0a  se file path */.
37130 20 20 20 20 69 6e 74 20 6e 44 62 3b 20 20 20 20      int nDb;    
37140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37150 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 76    /* Number of v
37160 61 6c 69 64 20 62 79 74 65 73 20 69 6e 20 7a 44  alid bytes in zD
37170 62 20 2a 2f 0a 20 20 20 20 73 74 72 75 63 74 20  b */.    struct 
37180 73 74 61 74 20 73 53 74 61 74 3b 20 20 20 20 20  stat sStat;     
37190 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74         /* Output
371a0 20 6f 66 20 73 74 61 74 28 29 20 6f 6e 20 64 61   of stat() on da
371b0 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a  tabase file */..
371c0 20 20 20 20 2f 2a 20 7a 50 61 74 68 20 69 73 20      /* zPath is 
371d0 61 20 70 61 74 68 20 74 6f 20 61 20 57 41 4c 20  a path to a WAL 
371e0 6f 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  or journal file.
371f0 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62   The following b
37200 6c 6f 63 6b 20 64 65 72 69 76 65 73 0a 20 20 20  lock derives.   
37210 20 2a 2a 20 74 68 65 20 70 61 74 68 20 74 6f 20   ** the path to 
37220 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 64  the associated d
37230 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 72 6f  atabase file fro
37240 6d 20 7a 50 61 74 68 2e 20 54 68 69 73 20 62 6c  m zPath. This bl
37250 6f 63 6b 20 68 61 6e 64 6c 65 73 0a 20 20 20 20  ock handles.    
37260 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** the following
37270 20 6e 61 6d 69 6e 67 20 63 6f 6e 76 65 6e 74 69   naming conventi
37280 6f 6e 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ons:.    **.    
37290 2a 2a 20 20 20 22 3c 70 61 74 68 20 74 6f 20 64  **   "<path to d
372a0 62 3e 2d 6a 6f 75 72 6e 61 6c 22 0a 20 20 20 20  b>-journal".    
372b0 2a 2a 20 20 20 22 3c 70 61 74 68 20 74 6f 20 64  **   "<path to d
372c0 62 3e 2d 77 61 6c 22 0a 20 20 20 20 2a 2a 20 20  b>-wal".    **  
372d0 20 22 3c 70 61 74 68 20 74 6f 20 64 62 3e 2d 6a   "<path to db>-j
372e0 6f 75 72 6e 61 6c 4e 4e 22 0a 20 20 20 20 2a 2a  ournalNN".    **
372f0 20 20 20 22 3c 70 61 74 68 20 74 6f 20 64 62 3e     "<path to db>
37300 2d 77 61 6c 4e 4e 22 0a 20 20 20 20 2a 2a 0a 20  -walNN".    **. 
37310 20 20 20 2a 2a 20 77 68 65 72 65 20 4e 4e 20 69     ** where NN i
37320 73 20 61 20 64 65 63 69 6d 61 6c 20 6e 75 6d 62  s a decimal numb
37330 65 72 2e 20 54 68 65 20 4e 4e 20 6e 61 6d 69 6e  er. The NN namin
37340 67 20 73 63 68 65 6d 65 73 20 61 72 65 20 0a 20  g schemes are . 
37350 20 20 20 2a 2a 20 75 73 65 64 20 62 79 20 74 68     ** used by th
37360 65 20 74 65 73 74 5f 6d 75 6c 74 69 70 6c 65 78  e test_multiplex
37370 2e 63 20 6d 6f 64 75 6c 65 2e 0a 20 20 20 20 2a  .c module..    *
37380 2f 0a 20 20 20 20 6e 44 62 20 3d 20 73 71 6c 69  /.    nDb = sqli
37390 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 50 61 74  te3Strlen30(zPat
373a0 68 29 20 2d 20 31 3b 20 0a 23 69 66 64 65 66 20  h) - 1; .#ifdef 
373b0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 38 5f  SQLITE_ENABLE_8_
373c0 33 5f 4e 41 4d 45 53 0a 20 20 20 20 77 68 69 6c  3_NAMES.    whil
373d0 65 28 20 6e 44 62 3e 30 20 26 26 20 73 71 6c 69  e( nDb>0 && sqli
373e0 74 65 33 49 73 61 6c 6e 75 6d 28 7a 50 61 74 68  te3Isalnum(zPath
373f0 5b 6e 44 62 5d 29 20 29 20 6e 44 62 2d 2d 3b 0a  [nDb]) ) nDb--;.
37400 20 20 20 20 69 66 28 20 6e 44 62 3d 3d 30 20 7c      if( nDb==0 |
37410 7c 20 7a 50 61 74 68 5b 6e 44 62 5d 21 3d 27 2d  | zPath[nDb]!='-
37420 27 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ' ) return SQLIT
37430 45 5f 4f 4b 3b 0a 23 65 6c 73 65 0a 20 20 20 20  E_OK;.#else.    
37440 77 68 69 6c 65 28 20 7a 50 61 74 68 5b 6e 44 62  while( zPath[nDb
37450 5d 21 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20 20  ]!='-' ){.      
37460 61 73 73 65 72 74 28 20 6e 44 62 3e 30 20 29 3b  assert( nDb>0 );
37470 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a  .      assert( z
37480 50 61 74 68 5b 6e 44 62 5d 21 3d 27 5c 6e 27 20  Path[nDb]!='\n' 
37490 29 3b 0a 20 20 20 20 20 20 6e 44 62 2d 2d 3b 0a  );.      nDb--;.
374a0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
374b0 20 6d 65 6d 63 70 79 28 7a 44 62 2c 20 7a 50 61   memcpy(zDb, zPa
374c0 74 68 2c 20 6e 44 62 29 3b 0a 20 20 20 20 7a 44  th, nDb);.    zD
374d0 62 5b 6e 44 62 5d 20 3d 20 27 5c 30 27 3b 0a 0a  b[nDb] = '\0';..
374e0 20 20 20 20 69 66 28 20 30 3d 3d 6f 73 53 74 61      if( 0==osSta
374f0 74 28 7a 44 62 2c 20 26 73 53 74 61 74 29 20 29  t(zDb, &sStat) )
37500 7b 0a 20 20 20 20 20 20 2a 70 4d 6f 64 65 20 3d  {.      *pMode =
37510 20 73 53 74 61 74 2e 73 74 5f 6d 6f 64 65 20 26   sStat.st_mode &
37520 20 30 37 37 37 3b 0a 20 20 20 20 20 20 2a 70 55   0777;.      *pU
37530 69 64 20 3d 20 73 53 74 61 74 2e 73 74 5f 75 69  id = sStat.st_ui
37540 64 3b 0a 20 20 20 20 20 20 2a 70 47 69 64 20 3d  d;.      *pGid =
37550 20 73 53 74 61 74 2e 73 74 5f 67 69 64 3b 0a 20   sStat.st_gid;. 
37560 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
37570 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
37580 52 5f 46 53 54 41 54 3b 0a 20 20 20 20 7d 0a 20  R_FSTAT;.    }. 
37590 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73   }else if( flags
375a0 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44   & SQLITE_OPEN_D
375b0 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 29 7b 0a  ELETEONCLOSE ){.
375c0 20 20 20 20 2a 70 4d 6f 64 65 20 3d 20 30 36 30      *pMode = 060
375d0 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
375e0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65  rc;.}../*.** Ope
375f0 6e 20 74 68 65 20 66 69 6c 65 20 7a 50 61 74 68  n the file zPath
37600 2e 0a 2a 2a 20 0a 2a 2a 20 50 72 65 76 69 6f 75  ..** .** Previou
37610 73 6c 79 2c 20 74 68 65 20 53 51 4c 69 74 65 20  sly, the SQLite 
37620 4f 53 20 6c 61 79 65 72 20 75 73 65 64 20 74 68  OS layer used th
37630 72 65 65 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e  ree functions in
37640 20 70 6c 61 63 65 20 6f 66 20 74 68 69 73 0a 2a   place of this.*
37650 2a 20 6f 6e 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  * one:.**.**    
37660 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65   sqlite3OsOpenRe
37670 61 64 57 72 69 74 65 28 29 3b 0a 2a 2a 20 20 20  adWrite();.**   
37680 20 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52    sqlite3OsOpenR
37690 65 61 64 4f 6e 6c 79 28 29 3b 0a 2a 2a 20 20 20  eadOnly();.**   
376a0 20 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 45    sqlite3OsOpenE
376b0 78 63 6c 75 73 69 76 65 28 29 3b 0a 2a 2a 0a 2a  xclusive();.**.*
376c0 2a 20 54 68 65 73 65 20 63 61 6c 6c 73 20 63 6f  * These calls co
376d0 72 72 65 73 70 6f 6e 64 20 74 6f 20 74 68 65 20  rrespond to the 
376e0 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d 62 69 6e  following combin
376f0 61 74 69 6f 6e 73 20 6f 66 20 66 6c 61 67 73 3a  ations of flags:
37700 0a 2a 2a 0a 2a 2a 20 20 20 20 20 52 65 61 64 57  .**.**     ReadW
37710 72 69 74 65 28 29 20 2d 3e 20 20 20 20 20 28 52  rite() ->     (R
37720 45 41 44 57 52 49 54 45 20 7c 20 43 52 45 41 54  EADWRITE | CREAT
37730 45 29 0a 2a 2a 20 20 20 20 20 52 65 61 64 4f 6e  E).**     ReadOn
37740 6c 79 28 29 20 20 2d 3e 20 20 20 20 20 28 52 45  ly()  ->     (RE
37750 41 44 4f 4e 4c 59 29 20 0a 2a 2a 20 20 20 20 20  ADONLY) .**     
37760 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28 29 20  OpenExclusive() 
37770 2d 3e 20 28 52 45 41 44 57 52 49 54 45 20 7c 20  -> (READWRITE | 
37780 43 52 45 41 54 45 20 7c 20 45 58 43 4c 55 53 49  CREATE | EXCLUSI
37790 56 45 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 6c  VE).**.** The ol
377a0 64 20 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28  d OpenExclusive(
377b0 29 20 61 63 63 65 70 74 65 64 20 61 20 62 6f 6f  ) accepted a boo
377c0 6c 65 61 6e 20 61 72 67 75 6d 65 6e 74 20 2d 20  lean argument - 
377d0 22 64 65 6c 46 6c 61 67 22 2e 20 49 66 0a 2a 2a  "delFlag". If.**
377e0 20 74 72 75 65 2c 20 74 68 65 20 66 69 6c 65 20   true, the file 
377f0 77 61 73 20 63 6f 6e 66 69 67 75 72 65 64 20 74  was configured t
37800 6f 20 62 65 20 61 75 74 6f 6d 61 74 69 63 61 6c  o be automatical
37810 6c 79 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20  ly deleted when 
37820 74 68 65 0a 2a 2a 20 66 69 6c 65 20 68 61 6e 64  the.** file hand
37830 6c 65 20 63 6c 6f 73 65 64 2e 20 54 6f 20 61 63  le closed. To ac
37840 68 69 65 76 65 20 74 68 65 20 73 61 6d 65 20 65  hieve the same e
37850 66 66 65 63 74 20 75 73 69 6e 67 20 74 68 69 73  ffect using this
37860 20 6e 65 77 20 0a 2a 2a 20 69 6e 74 65 72 66 61   new .** interfa
37870 63 65 2c 20 61 64 64 20 74 68 65 20 44 45 4c 45  ce, add the DELE
37880 54 45 4f 4e 43 4c 4f 53 45 20 66 6c 61 67 20 74  TEONCLOSE flag t
37890 6f 20 74 68 6f 73 65 20 73 70 65 63 69 66 69 65  o those specifie
378a0 64 20 61 62 6f 76 65 20 66 6f 72 20 0a 2a 2a 20  d above for .** 
378b0 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28 29 2e  OpenExclusive().
378c0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
378d0 6e 69 78 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74  nixOpen(.  sqlit
378e0 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20  e3_vfs *pVfs,   
378f0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56          /* The V
37900 46 53 20 66 6f 72 20 77 68 69 63 68 20 74 68 69  FS for which thi
37910 73 20 69 73 20 74 68 65 20 78 4f 70 65 6e 20 6d  s is the xOpen m
37920 65 74 68 6f 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  ethod */.  const
37930 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20   char *zPath,   
37940 20 20 20 20 20 20 20 20 2f 2a 20 50 61 74 68 6e          /* Pathn
37950 61 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 62  ame of file to b
37960 65 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 73 71  e opened */.  sq
37970 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c  lite3_file *pFil
37980 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  e,         /* Th
37990 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
379a0 72 20 74 6f 20 62 65 20 66 69 6c 6c 65 64 20 69  r to be filled i
379b0 6e 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  n */.  int flags
379c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
379d0 20 20 20 20 2f 2a 20 49 6e 70 75 74 20 66 6c 61      /* Input fla
379e0 67 73 20 74 6f 20 63 6f 6e 74 72 6f 6c 20 74 68  gs to control th
379f0 65 20 6f 70 65 6e 69 6e 67 20 2a 2f 0a 20 20 69  e opening */.  i
37a00 6e 74 20 2a 70 4f 75 74 46 6c 61 67 73 20 20 20  nt *pOutFlags   
37a10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
37a20 75 74 70 75 74 20 66 6c 61 67 73 20 72 65 74 75  utput flags retu
37a30 72 6e 65 64 20 74 6f 20 53 51 4c 69 74 65 20 63  rned to SQLite c
37a40 6f 72 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78  ore */.){.  unix
37a50 46 69 6c 65 20 2a 70 20 3d 20 28 75 6e 69 78 46  File *p = (unixF
37a60 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20 20 69  ile *)pFile;.  i
37a70 6e 74 20 66 64 20 3d 20 2d 31 3b 20 20 20 20 20  nt fd = -1;     
37a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
37a90 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   File descriptor
37aa0 20 72 65 74 75 72 6e 65 64 20 62 79 20 6f 70 65   returned by ope
37ab0 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 65  n() */.  int ope
37ac0 6e 46 6c 61 67 73 20 3d 20 30 3b 20 20 20 20 20  nFlags = 0;     
37ad0 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73          /* Flags
37ae0 20 74 6f 20 70 61 73 73 20 74 6f 20 6f 70 65 6e   to pass to open
37af0 28 29 20 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45  () */.#if SQLITE
37b00 5f 45 4e 41 42 4c 45 5f 44 41 54 41 5f 50 52 4f  _ENABLE_DATA_PRO
37b10 54 45 43 54 49 4f 4e 0a 20 20 69 6e 74 20 65 54  TECTION.  int eT
37b20 79 70 65 20 3d 20 66 6c 61 67 73 26 30 78 46 46  ype = flags&0xFF
37b30 30 46 46 46 30 30 3b 20 20 2f 2a 20 54 79 70 65  0FFF00;  /* Type
37b40 20 6f 66 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e   of file to open
37b50 20 2a 2f 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20   */.#else.  int 
37b60 65 54 79 70 65 20 3d 20 66 6c 61 67 73 26 30 78  eType = flags&0x
37b70 46 46 46 46 46 46 30 30 3b 20 20 2f 2a 20 54 79  FFFFFF00;  /* Ty
37b80 70 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 6f 70  pe of file to op
37b90 65 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 69  en */.#endif.  i
37ba0 6e 74 20 6e 6f 4c 6f 63 6b 3b 20 20 20 20 20 20  nt noLock;      
37bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
37bc0 20 54 72 75 65 20 74 6f 20 6f 6d 69 74 20 6c 6f   True to omit lo
37bd0 63 6b 69 6e 67 20 70 72 69 6d 69 74 69 76 65 73  cking primitives
37be0 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   */.  int rc = S
37bf0 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
37c00 20 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e       /* Function
37c10 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a   Return Code */.
37c20 20 20 69 6e 74 20 63 74 72 6c 46 6c 61 67 73 20    int ctrlFlags 
37c30 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
37c40 20 2f 2a 20 55 4e 49 58 46 49 4c 45 5f 2a 20 66   /* UNIXFILE_* f
37c50 6c 61 67 73 20 2a 2f 0a 0a 20 20 69 6e 74 20 69  lags */..  int i
37c60 73 45 78 63 6c 75 73 69 76 65 20 20 3d 20 28 66  sExclusive  = (f
37c70 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
37c80 45 4e 5f 45 58 43 4c 55 53 49 56 45 29 3b 0a 20  EN_EXCLUSIVE);. 
37c90 20 69 6e 74 20 69 73 44 65 6c 65 74 65 20 20 20   int isDelete   
37ca0 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c    = (flags & SQL
37cb0 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f  ITE_OPEN_DELETEO
37cc0 4e 43 4c 4f 53 45 29 3b 0a 20 20 69 6e 74 20 69  NCLOSE);.  int i
37cd0 73 43 72 65 61 74 65 20 20 20 20 20 3d 20 28 66  sCreate     = (f
37ce0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
37cf0 45 4e 5f 43 52 45 41 54 45 29 3b 0a 20 20 69 6e  EN_CREATE);.  in
37d00 74 20 69 73 52 65 61 64 6f 6e 6c 79 20 20 20 3d  t isReadonly   =
37d10 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45   (flags & SQLITE
37d20 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b  _OPEN_READONLY);
37d30 0a 20 20 69 6e 74 20 69 73 52 65 61 64 57 72 69  .  int isReadWri
37d40 74 65 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53  te  = (flags & S
37d50 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
37d60 52 49 54 45 29 3b 0a 23 69 66 20 53 51 4c 49 54  RITE);.#if SQLIT
37d70 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
37d80 5f 53 54 59 4c 45 0a 20 20 69 6e 74 20 69 73 41  _STYLE.  int isA
37d90 75 74 6f 50 72 6f 78 79 20 20 3d 20 28 66 6c 61  utoProxy  = (fla
37da0 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
37db0 5f 41 55 54 4f 50 52 4f 58 59 29 3b 0a 23 65 6e  _AUTOPROXY);.#en
37dc0 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28  dif.#if defined(
37dd0 5f 5f 41 50 50 4c 45 5f 5f 29 20 7c 7c 20 53 51  __APPLE__) || SQ
37de0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
37df0 49 4e 47 5f 53 54 59 4c 45 0a 20 20 73 74 72 75  ING_STYLE.  stru
37e00 63 74 20 73 74 61 74 66 73 20 66 73 49 6e 66 6f  ct statfs fsInfo
37e10 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49  ;.#endif..  /* I
37e20 66 20 63 72 65 61 74 69 6e 67 20 61 20 6d 61 73  f creating a mas
37e30 74 65 72 20 6f 72 20 6d 61 69 6e 2d 66 69 6c 65  ter or main-file
37e40 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 69 73 20 66   journal, this f
37e50 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 6f 70 65  unction will ope
37e60 6e 0a 20 20 2a 2a 20 61 20 66 69 6c 65 2d 64 65  n.  ** a file-de
37e70 73 63 72 69 70 74 6f 72 20 6f 6e 20 74 68 65 20  scriptor on the 
37e80 64 69 72 65 63 74 6f 72 79 20 74 6f 6f 2e 20 54  directory too. T
37e90 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 75 6e  he first time un
37ea0 69 78 53 79 6e 63 28 29 0a 20 20 2a 2a 20 69 73  ixSync().  ** is
37eb0 20 63 61 6c 6c 65 64 20 74 68 65 20 64 69 72 65   called the dire
37ec0 63 74 6f 72 79 20 66 69 6c 65 20 64 65 73 63 72  ctory file descr
37ed0 69 70 74 6f 72 20 77 69 6c 6c 20 62 65 20 66 73  iptor will be fs
37ee0 79 6e 63 28 29 65 64 20 61 6e 64 20 63 6c 6f 73  ync()ed and clos
37ef0 65 28 29 64 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74  e()d..  */.  int
37f00 20 73 79 6e 63 44 69 72 20 3d 20 28 69 73 43 72   syncDir = (isCr
37f10 65 61 74 65 20 26 26 20 28 0a 20 20 20 20 20 20  eate && (.      
37f20 20 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f    eType==SQLITE_
37f30 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52  OPEN_MASTER_JOUR
37f40 4e 41 4c 20 0a 20 20 20 20 20 7c 7c 20 65 54 79  NAL .     || eTy
37f50 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
37f60 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20  MAIN_JOURNAL .  
37f70 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c     || eType==SQL
37f80 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20 29  ITE_OPEN_WAL.  )
37f90 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 72 67 75  );..  /* If argu
37fa0 6d 65 6e 74 20 7a 50 61 74 68 20 69 73 20 61 20  ment zPath is a 
37fb0 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2c 20 74 68  NULL pointer, th
37fc0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72  is function is r
37fd0 65 71 75 69 72 65 64 20 74 6f 20 6f 70 65 6e 0a  equired to open.
37fe0 20 20 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72 79    ** a temporary
37ff0 20 66 69 6c 65 2e 20 55 73 65 20 74 68 69 73 20   file. Use this 
38000 62 75 66 66 65 72 20 74 6f 20 73 74 6f 72 65 20  buffer to store 
38010 74 68 65 20 66 69 6c 65 20 6e 61 6d 65 20 69 6e  the file name in
38020 2e 0a 20 20 2a 2f 0a 20 20 63 68 61 72 20 7a 54  ..  */.  char zT
38030 6d 70 6e 61 6d 65 5b 4d 41 58 5f 50 41 54 48 4e  mpname[MAX_PATHN
38040 41 4d 45 2b 32 5d 3b 0a 20 20 63 6f 6e 73 74 20  AME+2];.  const 
38050 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 7a 50  char *zName = zP
38060 61 74 68 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  ath;..  /* Check
38070 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
38080 74 61 74 65 6d 65 6e 74 73 20 61 72 65 20 74 72  tatements are tr
38090 75 65 3a 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ue: .  **.  **  
380a0 20 28 61 29 20 45 78 61 63 74 6c 79 20 6f 6e 65   (a) Exactly one
380b0 20 6f 66 20 74 68 65 20 52 45 41 44 57 52 49 54   of the READWRIT
380c0 45 20 61 6e 64 20 52 45 41 44 4f 4e 4c 59 20 66  E and READONLY f
380d0 6c 61 67 73 20 6d 75 73 74 20 62 65 20 73 65 74  lags must be set
380e0 2c 20 61 6e 64 20 0a 20 20 2a 2a 20 20 20 28 62  , and .  **   (b
380f0 29 20 69 66 20 43 52 45 41 54 45 20 69 73 20 73  ) if CREATE is s
38100 65 74 2c 20 74 68 65 6e 20 52 45 41 44 57 52 49  et, then READWRI
38110 54 45 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20  TE must also be 
38120 73 65 74 2c 20 61 6e 64 0a 20 20 2a 2a 20 20 20  set, and.  **   
38130 28 63 29 20 69 66 20 45 58 43 4c 55 53 49 56 45  (c) if EXCLUSIVE
38140 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 43 52   is set, then CR
38150 45 41 54 45 20 6d 75 73 74 20 61 6c 73 6f 20 62  EATE must also b
38160 65 20 73 65 74 2e 0a 20 20 2a 2a 20 20 20 28 64  e set..  **   (d
38170 29 20 69 66 20 44 45 4c 45 54 45 4f 4e 43 4c 4f  ) if DELETEONCLO
38180 53 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20  SE is set, then 
38190 43 52 45 41 54 45 20 6d 75 73 74 20 61 6c 73 6f  CREATE must also
381a0 20 62 65 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20   be set..  */.  
381b0 61 73 73 65 72 74 28 28 69 73 52 65 61 64 6f 6e  assert((isReadon
381c0 6c 79 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64 57  ly==0 || isReadW
381d0 72 69 74 65 3d 3d 30 29 20 26 26 20 28 69 73 52  rite==0) && (isR
381e0 65 61 64 57 72 69 74 65 20 7c 7c 20 69 73 52 65  eadWrite || isRe
381f0 61 64 6f 6e 6c 79 29 29 3b 0a 20 20 61 73 73 65  adonly));.  asse
38200 72 74 28 69 73 43 72 65 61 74 65 3d 3d 30 20 7c  rt(isCreate==0 |
38210 7c 20 69 73 52 65 61 64 57 72 69 74 65 29 3b 0a  | isReadWrite);.
38220 20 20 61 73 73 65 72 74 28 69 73 45 78 63 6c 75    assert(isExclu
38230 73 69 76 65 3d 3d 30 20 7c 7c 20 69 73 43 72 65  sive==0 || isCre
38240 61 74 65 29 3b 0a 20 20 61 73 73 65 72 74 28 69  ate);.  assert(i
38250 73 44 65 6c 65 74 65 3d 3d 30 20 7c 7c 20 69 73  sDelete==0 || is
38260 43 72 65 61 74 65 29 3b 0a 0a 20 20 2f 2a 20 54  Create);..  /* T
38270 68 65 20 6d 61 69 6e 20 44 42 2c 20 6d 61 69 6e  he main DB, main
38280 20 6a 6f 75 72 6e 61 6c 2c 20 57 41 4c 20 66 69   journal, WAL fi
38290 6c 65 20 61 6e 64 20 6d 61 73 74 65 72 20 6a 6f  le and master jo
382a0 75 72 6e 61 6c 20 61 72 65 20 6e 65 76 65 72 20  urnal are never 
382b0 0a 20 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61  .  ** automatica
382c0 6c 6c 79 20 64 65 6c 65 74 65 64 2e 20 4e 6f 72  lly deleted. Nor
382d0 20 61 72 65 20 74 68 65 79 20 65 76 65 72 20 74   are they ever t
382e0 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2e 20  emporary files. 
382f0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28 21   */.  assert( (!
38300 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d  isDelete && zNam
38310 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c  e) || eType!=SQL
38320 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
38330 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 21   );.  assert( (!
38340 69 73 44 65 6c 65 74 65 20 26 26 20 7a 4e 61 6d  isDelete && zNam
38350 65 29 20 7c 7c 20 65 54 79 70 65 21 3d 53 51 4c  e) || eType!=SQL
38360 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f  ITE_OPEN_MAIN_JO
38370 55 52 4e 41 4c 20 29 3b 0a 20 20 61 73 73 65 72  URNAL );.  asser
38380 74 28 20 28 21 69 73 44 65 6c 65 74 65 20 26 26  t( (!isDelete &&
38390 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65   zName) || eType
383a0 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  !=SQLITE_OPEN_MA
383b0 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a  STER_JOURNAL );.
383c0 20 20 61 73 73 65 72 74 28 20 28 21 69 73 44 65    assert( (!isDe
383d0 6c 65 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c  lete && zName) |
383e0 7c 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f  | eType!=SQLITE_
383f0 4f 50 45 4e 5f 57 41 4c 20 29 3b 0a 0a 20 20 2f  OPEN_WAL );..  /
38400 2a 20 41 73 73 65 72 74 20 74 68 61 74 20 74 68  * Assert that th
38410 65 20 75 70 70 65 72 20 6c 61 79 65 72 20 68 61  e upper layer ha
38420 73 20 73 65 74 20 6f 6e 65 20 6f 66 20 74 68 65  s set one of the
38430 20 22 66 69 6c 65 2d 74 79 70 65 22 20 66 6c 61   "file-type" fla
38440 67 73 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  gs. */.  assert(
38450 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
38460 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 20 20 20 20  PEN_MAIN_DB     
38470 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
38480 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 20 0a  E_OPEN_TEMP_DB .
38490 20 20 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d         || eType=
384a0 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  =SQLITE_OPEN_MAI
384b0 4e 5f 4a 4f 55 52 4e 41 4c 20 7c 7c 20 65 54 79  N_JOURNAL || eTy
384c0 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
384d0 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20  TEMP_JOURNAL .  
384e0 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53       || eType==S
384f0 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f  QLITE_OPEN_SUBJO
38500 55 52 4e 41 4c 20 20 20 7c 7c 20 65 54 79 70 65  URNAL   || eType
38510 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  ==SQLITE_OPEN_MA
38520 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 0a 20 20  STER_JOURNAL .  
38530 20 20 20 20 20 7c 7c 20 65 54 79 70 65 3d 3d 53       || eType==S
38540 51 4c 49 54 45 5f 4f 50 45 4e 5