/ Hex Artifact Content
Login

Artifact a725e2dc6f3d72b1776a04898fe088e3bb7d3a04:


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 44 65 66 69 6e 65 20  f../*.** Define 
0b40: 74 68 65 20 4f 53 5f 56 58 57 4f 52 4b 53 20 70  the OS_VXWORKS p
0b50: 72 65 2d 70 72 6f 63 65 73 73 6f 72 20 6d 61 63  re-processor mac
0b60: 72 6f 20 74 6f 20 31 20 69 66 20 62 75 69 6c 64  ro to 1 if build
0b70: 69 6e 67 20 6f 6e 20 0a 2a 2a 20 76 78 77 6f 72  ing on .** vxwor
0b80: 6b 73 2c 20 6f 72 20 30 20 6f 74 68 65 72 77 69  ks, or 0 otherwi
0b90: 73 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4f  se..*/.#ifndef O
0ba0: 53 5f 56 58 57 4f 52 4b 53 0a 23 20 20 69 66 20  S_VXWORKS.#  if 
0bb0: 64 65 66 69 6e 65 64 28 5f 5f 52 54 50 5f 5f 29  defined(__RTP__)
0bc0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 57 52 53   || defined(_WRS
0bd0: 5f 4b 45 52 4e 45 4c 29 0a 23 20 20 20 20 64 65  _KERNEL).#    de
0be0: 66 69 6e 65 20 4f 53 5f 56 58 57 4f 52 4b 53 20  fine OS_VXWORKS 
0bf0: 31 0a 23 20 20 65 6c 73 65 0a 23 20 20 20 20 64  1.#  else.#    d
0c00: 65 66 69 6e 65 20 4f 53 5f 56 58 57 4f 52 4b 53  efine OS_VXWORKS
0c10: 20 30 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64   0.#  endif.#end
0c20: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20  if../*.** These 
0c30: 23 64 65 66 69 6e 65 73 20 73 68 6f 75 6c 64 20  #defines should 
0c40: 65 6e 61 62 6c 65 20 3e 32 47 42 20 66 69 6c 65  enable >2GB file
0c50: 20 73 75 70 70 6f 72 74 20 6f 6e 20 50 6f 73 69   support on Posi
0c60: 78 20 69 66 20 74 68 65 0a 2a 2a 20 75 6e 64 65  x if the.** unde
0c70: 72 6c 79 69 6e 67 20 6f 70 65 72 61 74 69 6e 67  rlying operating
0c80: 20 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 73   system supports
0c90: 20 69 74 2e 20 20 49 66 20 74 68 65 20 4f 53 20   it.  If the OS 
0ca0: 6c 61 63 6b 73 0a 2a 2a 20 6c 61 72 67 65 20 66  lacks.** large f
0cb0: 69 6c 65 20 73 75 70 70 6f 72 74 2c 20 74 68 65  ile support, the
0cc0: 73 65 20 73 68 6f 75 6c 64 20 62 65 20 6e 6f 2d  se should be no-
0cd0: 6f 70 73 2e 0a 2a 2a 0a 2a 2a 20 4c 61 72 67 65  ops..**.** Large
0ce0: 20 66 69 6c 65 20 73 75 70 70 6f 72 74 20 63 61   file support ca
0cf0: 6e 20 62 65 20 64 69 73 61 62 6c 65 64 20 75 73  n be disabled us
0d00: 69 6e 67 20 74 68 65 20 2d 44 53 51 4c 49 54 45  ing the -DSQLITE
0d10: 5f 44 49 53 41 42 4c 45 5f 4c 46 53 20 73 77 69  _DISABLE_LFS swi
0d20: 74 63 68 0a 2a 2a 20 6f 6e 20 74 68 65 20 63 6f  tch.** on the co
0d30: 6d 70 69 6c 65 72 20 63 6f 6d 6d 61 6e 64 20 6c  mpiler command l
0d40: 69 6e 65 2e 20 20 54 68 69 73 20 69 73 20 6e 65  ine.  This is ne
0d50: 63 65 73 73 61 72 79 20 69 66 20 79 6f 75 20 61  cessary if you a
0d60: 72 65 20 63 6f 6d 70 69 6c 69 6e 67 0a 2a 2a 20  re compiling.** 
0d70: 6f 6e 20 61 20 72 65 63 65 6e 74 20 6d 61 63 68  on a recent mach
0d80: 69 6e 65 20 28 65 78 3a 20 52 65 64 48 61 74 20  ine (ex: RedHat 
0d90: 37 2e 32 29 20 62 75 74 20 79 6f 75 20 77 61 6e  7.2) but you wan
0da0: 74 20 79 6f 75 72 20 63 6f 64 65 20 74 6f 20 77  t your code to w
0db0: 6f 72 6b 0a 2a 2a 20 6f 6e 20 61 6e 20 6f 6c 64  ork.** on an old
0dc0: 65 72 20 6d 61 63 68 69 6e 65 20 28 65 78 3a 20  er machine (ex: 
0dd0: 52 65 64 48 61 74 20 36 2e 30 29 2e 20 20 49 66  RedHat 6.0).  If
0de0: 20 79 6f 75 20 63 6f 6d 70 69 6c 65 20 6f 6e 20   you compile on 
0df0: 52 65 64 48 61 74 20 37 2e 32 0a 2a 2a 20 77 69  RedHat 7.2.** wi
0e00: 74 68 6f 75 74 20 74 68 69 73 20 6f 70 74 69 6f  thout this optio
0e10: 6e 2c 20 4c 46 53 20 69 73 20 65 6e 61 62 6c 65  n, LFS is enable
0e20: 2e 20 20 42 75 74 20 4c 46 53 20 64 6f 65 73 20  .  But LFS does 
0e30: 6e 6f 74 20 65 78 69 73 74 20 69 6e 20 74 68 65  not exist in the
0e40: 20 6b 65 72 6e 65 6c 0a 2a 2a 20 69 6e 20 52 65   kernel.** in Re
0e50: 64 48 61 74 20 36 2e 30 2c 20 73 6f 20 74 68 65  dHat 6.0, so the
0e60: 20 63 6f 64 65 20 77 6f 6e 27 74 20 77 6f 72 6b   code won't work
0e70: 2e 20 20 48 65 6e 63 65 2c 20 66 6f 72 20 6d 61  .  Hence, for ma
0e80: 78 69 6d 75 6d 20 62 69 6e 61 72 79 0a 2a 2a 20  ximum binary.** 
0e90: 70 6f 72 74 61 62 69 6c 69 74 79 20 79 6f 75 20  portability you 
0ea0: 73 68 6f 75 6c 64 20 6f 6d 69 74 20 4c 46 53 2e  should omit LFS.
0eb0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 65 76 69  .**.** The previ
0ec0: 6f 75 73 20 70 61 72 61 67 72 61 70 68 20 77 61  ous paragraph wa
0ed0: 73 20 77 72 69 74 74 65 6e 20 69 6e 20 32 30 30  s written in 200
0ee0: 35 2e 20 20 28 54 68 69 73 20 70 61 72 61 67 72  5.  (This paragr
0ef0: 61 70 68 20 69 73 20 77 72 69 74 74 65 6e 0a 2a  aph is written.*
0f00: 2a 20 6f 6e 20 32 30 30 38 2d 31 31 2d 32 38 2e  * on 2008-11-28.
0f10: 29 20 54 68 65 73 65 20 64 61 79 73 2c 20 61 6c  ) These days, al
0f20: 6c 20 4c 69 6e 75 78 20 6b 65 72 6e 65 6c 73 20  l Linux kernels 
0f30: 73 75 70 70 6f 72 74 20 6c 61 72 67 65 20 66 69  support large fi
0f40: 6c 65 73 2c 20 73 6f 0a 2a 2a 20 79 6f 75 20 73  les, so.** you s
0f50: 68 6f 75 6c 64 20 70 72 6f 62 61 62 6c 79 20 6c  hould probably l
0f60: 65 61 76 65 20 4c 46 53 20 65 6e 61 62 6c 65 64  eave LFS enabled
0f70: 2e 20 20 42 75 74 20 73 6f 6d 65 20 65 6d 62 65  .  But some embe
0f80: 64 64 65 64 20 70 6c 61 74 66 6f 72 6d 73 20 6d  dded platforms m
0f90: 69 67 68 74 0a 2a 2a 20 6c 61 63 6b 20 4c 46 53  ight.** lack LFS
0fa0: 20 69 6e 20 77 68 69 63 68 20 63 61 73 65 20 74   in which case t
0fb0: 68 65 20 53 51 4c 49 54 45 5f 44 49 53 41 42 4c  he SQLITE_DISABL
0fc0: 45 5f 4c 46 53 20 6d 61 63 72 6f 20 6d 69 67 68  E_LFS macro migh
0fd0: 74 20 73 74 69 6c 6c 20 62 65 20 75 73 65 66 75  t still be usefu
0fe0: 6c 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  l..*/.#ifndef SQ
0ff0: 4c 49 54 45 5f 44 49 53 41 42 4c 45 5f 4c 46 53  LITE_DISABLE_LFS
1000: 0a 23 20 64 65 66 69 6e 65 20 5f 4c 41 52 47 45  .# define _LARGE
1010: 5f 46 49 4c 45 20 20 20 20 20 20 20 31 0a 23 20  _FILE       1.# 
1020: 69 66 6e 64 65 66 20 5f 46 49 4c 45 5f 4f 46 46  ifndef _FILE_OFF
1030: 53 45 54 5f 42 49 54 53 0a 23 20 20 20 64 65 66  SET_BITS.#   def
1040: 69 6e 65 20 5f 46 49 4c 45 5f 4f 46 46 53 45 54  ine _FILE_OFFSET
1050: 5f 42 49 54 53 20 36 34 0a 23 20 65 6e 64 69 66  _BITS 64.# endif
1060: 0a 23 20 64 65 66 69 6e 65 20 5f 4c 41 52 47 45  .# define _LARGE
1070: 46 49 4c 45 5f 53 4f 55 52 43 45 20 31 0a 23 65  FILE_SOURCE 1.#e
1080: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 73 74 61 6e  ndif../*.** stan
1090: 64 61 72 64 20 69 6e 63 6c 75 64 65 20 66 69 6c  dard include fil
10a0: 65 73 2e 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20  es..*/.#include 
10b0: 3c 73 79 73 2f 74 79 70 65 73 2e 68 3e 0a 23 69  <sys/types.h>.#i
10c0: 6e 63 6c 75 64 65 20 3c 73 79 73 2f 73 74 61 74  nclude <sys/stat
10d0: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 66 63  .h>.#include <fc
10e0: 6e 74 6c 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  ntl.h>.#include 
10f0: 3c 75 6e 69 73 74 64 2e 68 3e 0a 23 69 6e 63 6c  <unistd.h>.#incl
1100: 75 64 65 20 3c 74 69 6d 65 2e 68 3e 0a 23 69 6e  ude <time.h>.#in
1110: 63 6c 75 64 65 20 3c 73 79 73 2f 74 69 6d 65 2e  clude <sys/time.
1120: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 65 72 72  h>.#include <err
1130: 6e 6f 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  no.h>.#include <
1140: 73 79 73 2f 6d 6d 61 6e 2e 68 3e 0a 0a 23 69 66  sys/mman.h>..#if
1150: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
1160: 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 23 20 69  OCKING_STYLE.# i
1170: 6e 63 6c 75 64 65 20 3c 73 79 73 2f 69 6f 63 74  nclude <sys/ioct
1180: 6c 2e 68 3e 0a 23 20 69 66 20 4f 53 5f 56 58 57  l.h>.# if OS_VXW
1190: 4f 52 4b 53 0a 23 20 20 69 6e 63 6c 75 64 65 20  ORKS.#  include 
11a0: 3c 73 65 6d 61 70 68 6f 72 65 2e 68 3e 0a 23 20  <semaphore.h>.# 
11b0: 20 69 6e 63 6c 75 64 65 20 3c 6c 69 6d 69 74 73   include <limits
11c0: 2e 68 3e 0a 23 20 65 6c 73 65 0a 23 20 20 69 6e  .h>.# else.#  in
11d0: 63 6c 75 64 65 20 3c 73 79 73 2f 66 69 6c 65 2e  clude <sys/file.
11e0: 68 3e 0a 23 20 20 69 6e 63 6c 75 64 65 20 3c 73  h>.#  include <s
11f0: 79 73 2f 70 61 72 61 6d 2e 68 3e 0a 23 20 65 6e  ys/param.h>.# en
1200: 64 69 66 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  dif.#endif /* SQ
1210: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
1220: 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 0a 23 69  ING_STYLE */..#i
1230: 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  f defined(__APPL
1240: 45 5f 5f 29 20 7c 7c 20 28 53 51 4c 49 54 45 5f  E__) || (SQLITE_
1250: 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
1260: 54 59 4c 45 20 26 26 20 21 4f 53 5f 56 58 57 4f  TYLE && !OS_VXWO
1270: 52 4b 53 29 0a 23 20 69 6e 63 6c 75 64 65 20 3c  RKS).# include <
1280: 73 79 73 2f 6d 6f 75 6e 74 2e 68 3e 0a 23 65 6e  sys/mount.h>.#en
1290: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77  dif../*.** Allow
12a0: 65 64 20 76 61 6c 75 65 73 20 6f 66 20 75 6e 69  ed values of uni
12b0: 78 46 69 6c 65 2e 66 73 46 6c 61 67 73 0a 2a 2f  xFile.fsFlags.*/
12c0: 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  .#define SQLITE_
12d0: 46 53 46 4c 41 47 53 5f 49 53 5f 4d 53 44 4f 53  FSFLAGS_IS_MSDOS
12e0: 20 20 20 20 20 30 78 31 0a 0a 2f 2a 0a 2a 2a 20       0x1../*.** 
12f0: 49 66 20 77 65 20 61 72 65 20 74 6f 20 62 65 20  If we are to be 
1300: 74 68 72 65 61 64 2d 73 61 66 65 2c 20 69 6e 63  thread-safe, inc
1310: 6c 75 64 65 20 74 68 65 20 70 74 68 72 65 61 64  lude the pthread
1320: 73 20 68 65 61 64 65 72 20 61 6e 64 20 64 65 66  s header and def
1330: 69 6e 65 0a 2a 2a 20 74 68 65 20 53 51 4c 49 54  ine.** the SQLIT
1340: 45 5f 55 4e 49 58 5f 54 48 52 45 41 44 53 20 6d  E_UNIX_THREADS m
1350: 61 63 72 6f 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c  acro..*/.#if SQL
1360: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a 23  ITE_THREADSAFE.#
1370: 20 69 6e 63 6c 75 64 65 20 3c 70 74 68 72 65 61   include <pthrea
1380: 64 2e 68 3e 0a 23 20 64 65 66 69 6e 65 20 53 51  d.h>.# define SQ
1390: 4c 49 54 45 5f 55 4e 49 58 5f 54 48 52 45 41 44  LITE_UNIX_THREAD
13a0: 53 20 31 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  S 1.#endif../*.*
13b0: 2a 20 44 65 66 61 75 6c 74 20 70 65 72 6d 69 73  * Default permis
13c0: 73 69 6f 6e 73 20 77 68 65 6e 20 63 72 65 61 74  sions when creat
13d0: 69 6e 67 20 61 20 6e 65 77 20 66 69 6c 65 0a 2a  ing a new file.*
13e0: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
13f0: 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50 45  _DEFAULT_FILE_PE
1400: 52 4d 49 53 53 49 4f 4e 53 0a 23 20 64 65 66 69  RMISSIONS.# defi
1410: 6e 65 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  ne SQLITE_DEFAUL
1420: 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53 53 49 4f  T_FILE_PERMISSIO
1430: 4e 53 20 30 36 34 34 0a 23 65 6e 64 69 66 0a 0a  NS 0644.#endif..
1440: 2f 2a 0a 20 2a 2a 20 44 65 66 61 75 6c 74 20 70  /*. ** Default p
1450: 65 72 6d 69 73 73 69 6f 6e 73 20 77 68 65 6e 20  ermissions when 
1460: 63 72 65 61 74 69 6e 67 20 61 75 74 6f 20 70 72  creating auto pr
1470: 6f 78 79 20 64 69 72 0a 20 2a 2f 0a 23 69 66 6e  oxy dir. */.#ifn
1480: 64 65 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55  def SQLITE_DEFAU
1490: 4c 54 5f 50 52 4f 58 59 44 49 52 5f 50 45 52 4d  LT_PROXYDIR_PERM
14a0: 49 53 53 49 4f 4e 53 0a 23 20 64 65 66 69 6e 65  ISSIONS.# define
14b0: 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
14c0: 50 52 4f 58 59 44 49 52 5f 50 45 52 4d 49 53 53  PROXYDIR_PERMISS
14d0: 49 4f 4e 53 20 30 37 35 35 0a 23 65 6e 64 69 66  IONS 0755.#endif
14e0: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20  ../*.** Maximum 
14f0: 73 75 70 70 6f 72 74 65 64 20 70 61 74 68 2d 6c  supported path-l
1500: 65 6e 67 74 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e  ength..*/.#defin
1510: 65 20 4d 41 58 5f 50 41 54 48 4e 41 4d 45 20 35  e MAX_PATHNAME 5
1520: 31 32 0a 0a 2f 2a 0a 2a 2a 20 4f 6e 6c 79 20 73  12../*.** Only s
1530: 65 74 20 74 68 65 20 6c 61 73 74 45 72 72 6e 6f  et the lastErrno
1540: 20 69 66 20 74 68 65 20 65 72 72 6f 72 20 63 6f   if the error co
1550: 64 65 20 69 73 20 61 20 72 65 61 6c 20 65 72 72  de is a real err
1560: 6f 72 20 61 6e 64 20 6e 6f 74 20 0a 2a 2a 20 61  or and not .** a
1570: 20 6e 6f 72 6d 61 6c 20 65 78 70 65 63 74 65 64   normal expected
1580: 20 72 65 74 75 72 6e 20 63 6f 64 65 20 6f 66 20   return code of 
1590: 53 51 4c 49 54 45 5f 42 55 53 59 20 6f 72 20 53  SQLITE_BUSY or S
15a0: 51 4c 49 54 45 5f 4f 4b 0a 2a 2f 0a 23 64 65 66  QLITE_OK.*/.#def
15b0: 69 6e 65 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f  ine IS_LOCK_ERRO
15c0: 52 28 78 29 20 20 28 28 78 20 21 3d 20 53 51 4c  R(x)  ((x != SQL
15d0: 49 54 45 5f 4f 4b 29 20 26 26 20 28 78 20 21 3d  ITE_OK) && (x !=
15e0: 20 53 51 4c 49 54 45 5f 42 55 53 59 29 29 0a 0a   SQLITE_BUSY))..
15f0: 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72  /* Forward refer
1600: 65 6e 63 65 20 2a 2f 0a 74 79 70 65 64 65 66 20  ence */.typedef 
1610: 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d 20 75  struct unixShm u
1620: 6e 69 78 53 68 6d 3b 0a 74 79 70 65 64 65 66 20  nixShm;.typedef 
1630: 73 74 72 75 63 74 20 75 6e 69 78 53 68 6d 46 69  struct unixShmFi
1640: 6c 65 20 75 6e 69 78 53 68 6d 46 69 6c 65 3b 0a  le unixShmFile;.
1650: 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73  ./*.** Sometimes
1660: 2c 20 61 66 74 65 72 20 61 20 66 69 6c 65 20 68  , after a file h
1670: 61 6e 64 6c 65 20 69 73 20 63 6c 6f 73 65 64 20  andle is closed 
1680: 62 79 20 53 51 4c 69 74 65 2c 20 74 68 65 20 66  by SQLite, the f
1690: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 0a 2a  ile descriptor.*
16a0: 2a 20 63 61 6e 6e 6f 74 20 62 65 20 63 6c 6f 73  * cannot be clos
16b0: 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20  ed immediately. 
16c0: 49 6e 20 74 68 65 73 65 20 63 61 73 65 73 2c 20  In these cases, 
16d0: 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68 65  instances of the
16e0: 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74   following.** st
16f0: 72 75 63 74 75 72 65 20 61 72 65 20 75 73 65 64  ructure are used
1700: 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 66 69   to store the fi
1710: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 77 68  le descriptor wh
1720: 69 6c 65 20 77 61 69 74 69 6e 67 20 66 6f 72 20  ile waiting for 
1730: 61 6e 0a 2a 2a 20 6f 70 70 6f 72 74 75 6e 69 74  an.** opportunit
1740: 79 20 74 6f 20 65 69 74 68 65 72 20 63 6c 6f 73  y to either clos
1750: 65 20 6f 72 20 72 65 75 73 65 20 69 74 2e 0a 2a  e or reuse it..*
1760: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
1770: 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 55 6e   UnixUnusedFd Un
1780: 69 78 55 6e 75 73 65 64 46 64 3b 0a 73 74 72 75  ixUnusedFd;.stru
1790: 63 74 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20  ct UnixUnusedFd 
17a0: 7b 0a 20 20 69 6e 74 20 66 64 3b 20 20 20 20 20  {.  int fd;     
17b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17c0: 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   File descriptor
17d0: 20 74 6f 20 63 6c 6f 73 65 20 2a 2f 0a 20 20 69   to close */.  i
17e0: 6e 74 20 66 6c 61 67 73 3b 20 20 20 20 20 20 20  nt flags;       
17f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67           /* Flag
1800: 73 20 74 68 69 73 20 66 69 6c 65 20 64 65 73 63  s this file desc
1810: 72 69 70 74 6f 72 20 77 61 73 20 6f 70 65 6e 65  riptor was opene
1820: 64 20 77 69 74 68 20 2a 2f 0a 20 20 55 6e 69 78  d with */.  Unix
1830: 55 6e 75 73 65 64 46 64 20 2a 70 4e 65 78 74 3b  UnusedFd *pNext;
1840: 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 75 6e        /* Next un
1850: 75 73 65 64 20 66 69 6c 65 20 64 65 73 63 72 69  used file descri
1860: 70 74 6f 72 20 6f 6e 20 73 61 6d 65 20 66 69 6c  ptor on same fil
1870: 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54  e */.};../*.** T
1880: 68 65 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75  he unixFile stru
1890: 63 74 75 72 65 20 69 73 20 73 75 62 63 6c 61 73  cture is subclas
18a0: 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 66 69 6c  s of sqlite3_fil
18b0: 65 20 73 70 65 63 69 66 69 63 20 74 6f 20 74 68  e specific to th
18c0: 65 20 75 6e 69 78 0a 2a 2a 20 56 46 53 20 69 6d  e unix.** VFS im
18d0: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 2e 0a 2a  plementations..*
18e0: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
18f0: 20 75 6e 69 78 46 69 6c 65 20 75 6e 69 78 46 69   unixFile unixFi
1900: 6c 65 3b 0a 73 74 72 75 63 74 20 75 6e 69 78 46  le;.struct unixF
1910: 69 6c 65 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f  ile {.  sqlite3_
1920: 69 6f 5f 6d 65 74 68 6f 64 73 20 63 6f 6e 73 74  io_methods const
1930: 20 2a 70 4d 65 74 68 6f 64 3b 20 20 2f 2a 20 41   *pMethod;  /* A
1940: 6c 77 61 79 73 20 74 68 65 20 66 69 72 73 74 20  lways the first 
1950: 65 6e 74 72 79 20 2a 2f 0a 20 20 73 74 72 75 63  entry */.  struc
1960: 74 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20  t unixInodeInfo 
1970: 2a 70 49 6e 6f 64 65 3b 20 20 20 20 20 20 20 2f  *pInode;       /
1980: 2a 20 49 6e 66 6f 20 61 62 6f 75 74 20 6c 6f 63  * Info about loc
1990: 6b 73 20 6f 6e 20 74 68 69 73 20 69 6e 6f 64 65  ks on this inode
19a0: 20 2a 2f 0a 20 20 69 6e 74 20 68 3b 20 20 20 20   */.  int h;    
19b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
19d0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
19e0: 20 2a 2f 0a 20 20 69 6e 74 20 64 69 72 66 64 3b   */.  int dirfd;
19f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
1a10: 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72  e descriptor for
1a20: 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 2a   the directory *
1a30: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
1a40: 72 20 65 46 69 6c 65 4c 6f 63 6b 3b 20 20 20 20  r eFileLock;    
1a50: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
1a60: 79 70 65 20 6f 66 20 6c 6f 63 6b 20 68 65 6c 64  ype of lock held
1a70: 20 6f 6e 20 74 68 69 73 20 66 64 20 2a 2f 0a 20   on this fd */. 
1a80: 20 69 6e 74 20 6c 61 73 74 45 72 72 6e 6f 3b 20   int lastErrno; 
1a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aa0: 20 20 20 20 20 2f 2a 20 54 68 65 20 75 6e 69 78       /* The unix
1ab0: 20 65 72 72 6e 6f 20 66 72 6f 6d 20 6c 61 73 74   errno from last
1ac0: 20 49 2f 4f 20 65 72 72 6f 72 20 2a 2f 0a 20 20   I/O error */.  
1ad0: 76 6f 69 64 20 2a 6c 6f 63 6b 69 6e 67 43 6f 6e  void *lockingCon
1ae0: 74 65 78 74 3b 20 20 20 20 20 20 20 20 20 20 20  text;           
1af0: 20 20 20 20 2f 2a 20 4c 6f 63 6b 69 6e 67 20 73      /* Locking s
1b00: 74 79 6c 65 20 73 70 65 63 69 66 69 63 20 73 74  tyle specific st
1b10: 61 74 65 20 2a 2f 0a 20 20 55 6e 69 78 55 6e 75  ate */.  UnixUnu
1b20: 73 65 64 46 64 20 2a 70 55 6e 75 73 65 64 3b 20  sedFd *pUnused; 
1b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b40: 50 72 65 2d 61 6c 6c 6f 63 61 74 65 64 20 55 6e  Pre-allocated Un
1b50: 69 78 55 6e 75 73 65 64 46 64 20 2a 2f 0a 20 20  ixUnusedFd */.  
1b60: 69 6e 74 20 66 69 6c 65 46 6c 61 67 73 3b 20 20  int fileFlags;  
1b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b80: 20 20 20 20 2f 2a 20 4d 69 73 63 65 6c 6c 61 6e      /* Miscellan
1b90: 6f 75 73 20 66 6c 61 67 73 20 2a 2f 0a 20 20 63  ous flags */.  c
1ba0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68  onst char *zPath
1bb0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1bc0: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
1bd0: 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78  e file */.  unix
1be0: 53 68 6d 20 2a 70 53 68 6d 3b 20 20 20 20 20 20  Shm *pShm;      
1bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c00: 2f 2a 20 53 68 61 72 65 64 20 6d 65 6d 6f 72 79  /* Shared memory
1c10: 20 73 65 67 6d 65 6e 74 20 69 6e 66 6f 72 6d 61   segment informa
1c20: 74 69 6f 6e 20 2a 2f 0a 23 69 66 20 53 51 4c 49  tion */.#if SQLI
1c30: 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
1c40: 47 5f 53 54 59 4c 45 0a 20 20 69 6e 74 20 6f 70  G_STYLE.  int op
1c50: 65 6e 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20  enFlags;        
1c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c70: 20 54 68 65 20 66 6c 61 67 73 20 73 70 65 63 69   The flags speci
1c80: 66 69 65 64 20 61 74 20 6f 70 65 6e 28 29 20 2a  fied at open() *
1c90: 2f 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  /.#endif.#if SQL
1ca0: 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
1cb0: 4e 47 5f 53 54 59 4c 45 20 7c 7c 20 64 65 66 69  NG_STYLE || defi
1cc0: 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20  ned(__APPLE__). 
1cd0: 20 75 6e 73 69 67 6e 65 64 20 66 73 46 6c 61 67   unsigned fsFlag
1ce0: 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
1cf0: 20 20 20 20 20 2f 2a 20 63 61 63 68 65 64 20 64       /* cached d
1d00: 65 74 61 69 6c 73 20 66 72 6f 6d 20 73 74 61 74  etails from stat
1d10: 66 73 28 29 20 2a 2f 0a 23 65 6e 64 69 66 0a 23  fs() */.#endif.#
1d20: 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20  if OS_VXWORKS.  
1d30: 69 6e 74 20 69 73 44 65 6c 65 74 65 3b 20 20 20  int isDelete;   
1d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d50: 20 20 20 20 2f 2a 20 44 65 6c 65 74 65 20 6f 6e      /* Delete on
1d60: 20 63 6c 6f 73 65 20 69 66 20 74 72 75 65 20 2a   close if true *
1d70: 2f 0a 20 20 73 74 72 75 63 74 20 76 78 77 6f 72  /.  struct vxwor
1d80: 6b 73 46 69 6c 65 49 64 20 2a 70 49 64 3b 20 20  ksFileId *pId;  
1d90: 20 20 20 20 20 20 20 20 2f 2a 20 55 6e 69 71 75          /* Uniqu
1da0: 65 20 66 69 6c 65 20 49 44 20 2a 2f 0a 23 65 6e  e file ID */.#en
1db0: 64 69 66 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  dif.#ifndef NDEB
1dc0: 55 47 0a 20 20 2f 2a 20 54 68 65 20 6e 65 78 74  UG.  /* The next
1dd0: 20 67 72 6f 75 70 20 6f 66 20 76 61 72 69 61 62   group of variab
1de0: 6c 65 73 20 61 72 65 20 75 73 65 64 20 74 6f 20  les are used to 
1df0: 74 72 61 63 6b 20 77 68 65 74 68 65 72 20 6f 72  track whether or
1e00: 20 6e 6f 74 20 74 68 65 0a 20 20 2a 2a 20 74 72   not the.  ** tr
1e10: 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65  ansaction counte
1e20: 72 20 69 6e 20 62 79 74 65 73 20 32 34 2d 32 37  r in bytes 24-27
1e30: 20 6f 66 20 64 61 74 61 62 61 73 65 20 66 69 6c   of database fil
1e40: 65 73 20 61 72 65 20 75 70 64 61 74 65 64 0a 20  es are updated. 
1e50: 20 2a 2a 20 77 68 65 6e 65 76 65 72 20 61 6e 79   ** whenever any
1e60: 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 61 74   part of the dat
1e70: 61 62 61 73 65 20 63 68 61 6e 67 65 73 2e 20 20  abase changes.  
1e80: 41 6e 20 61 73 73 65 72 74 69 6f 6e 20 66 61 75  An assertion fau
1e90: 6c 74 20 77 69 6c 6c 0a 20 20 2a 2a 20 6f 63 63  lt will.  ** occ
1ea0: 75 72 20 69 66 20 61 20 66 69 6c 65 20 69 73 20  ur if a file is 
1eb0: 75 70 64 61 74 65 64 20 77 69 74 68 6f 75 74 20  updated without 
1ec0: 61 6c 73 6f 20 75 70 64 61 74 69 6e 67 20 74 68  also updating th
1ed0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20  e transaction.  
1ee0: 2a 2a 20 63 6f 75 6e 74 65 72 2e 20 20 54 68 69  ** counter.  Thi
1ef0: 73 20 74 65 73 74 20 69 73 20 6d 61 64 65 20 74  s test is made t
1f00: 6f 20 61 76 6f 69 64 20 6e 65 77 20 70 72 6f 62  o avoid new prob
1f10: 6c 65 6d 73 20 73 69 6d 69 6c 61 72 20 74 6f 20  lems similar to 
1f20: 74 68 65 0a 20 20 2a 2a 20 6f 6e 65 20 64 65 73  the.  ** one des
1f30: 63 72 69 62 65 64 20 62 79 20 74 69 63 6b 65 74  cribed by ticket
1f40: 20 23 33 35 38 34 2e 20 0a 20 20 2a 2f 0a 20 20   #3584. .  */.  
1f50: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 74 72  unsigned char tr
1f60: 61 6e 73 43 6e 74 72 43 68 6e 67 3b 20 20 20 2f  ansCntrChng;   /
1f70: 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 74 72  * True if the tr
1f80: 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65  ansaction counte
1f90: 72 20 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20 75  r changed */.  u
1fa0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 64 62 55  nsigned char dbU
1fb0: 70 64 61 74 65 3b 20 20 20 20 20 20 20 20 2f 2a  pdate;        /*
1fc0: 20 54 72 75 65 20 69 66 20 61 6e 79 20 70 61 72   True if any par
1fd0: 74 20 6f 66 20 64 61 74 61 62 61 73 65 20 66 69  t of database fi
1fe0: 6c 65 20 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20  le changed */.  
1ff0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 69 6e  unsigned char in
2000: 4e 6f 72 6d 61 6c 57 72 69 74 65 3b 20 20 20 2f  NormalWrite;   /
2010: 2a 20 54 72 75 65 20 69 66 20 69 6e 20 61 20 6e  * True if in a n
2020: 6f 72 6d 61 6c 20 77 72 69 74 65 20 6f 70 65 72  ormal write oper
2030: 61 74 69 6f 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a  ation */.#endif.
2040: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
2050: 53 54 0a 20 20 2f 2a 20 49 6e 20 74 65 73 74 20  ST.  /* In test 
2060: 6d 6f 64 65 2c 20 69 6e 63 72 65 61 73 65 20 74  mode, increase t
2070: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 69 73 20  he size of this 
2080: 73 74 72 75 63 74 75 72 65 20 61 20 62 69 74 20  structure a bit 
2090: 73 6f 20 74 68 61 74 20 0a 20 20 2a 2a 20 69 74  so that .  ** it
20a0: 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
20b0: 74 68 65 20 73 74 72 75 63 74 20 43 72 61 73 68  the struct Crash
20c0: 46 69 6c 65 20 64 65 66 69 6e 65 64 20 69 6e 20  File defined in 
20d0: 74 65 73 74 36 2e 63 2e 0a 20 20 2a 2f 0a 20 20  test6.c..  */.  
20e0: 63 68 61 72 20 61 50 61 64 64 69 6e 67 5b 33 32  char aPadding[32
20f0: 5d 3b 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a  ];.#endif.};../*
2100: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
2110: 67 20 6d 61 63 72 6f 73 20 64 65 66 69 6e 65 20  g macros define 
2120: 62 69 74 73 20 69 6e 20 75 6e 69 78 46 69 6c 65  bits in unixFile
2130: 2e 66 69 6c 65 46 6c 61 67 73 0a 2a 2f 0a 23 64  .fileFlags.*/.#d
2140: 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 57 48 4f  efine SQLITE_WHO
2150: 4c 45 5f 46 49 4c 45 5f 4c 4f 43 4b 49 4e 47 20  LE_FILE_LOCKING 
2160: 20 30 78 30 30 30 31 20 20 20 2f 2a 20 55 73 65   0x0001   /* Use
2170: 20 77 68 6f 6c 65 2d 66 69 6c 65 20 6c 6f 63 6b   whole-file lock
2180: 69 6e 67 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e  ing */../*.** In
2190: 63 6c 75 64 65 20 63 6f 64 65 20 74 68 61 74 20  clude code that 
21a0: 69 73 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c  is common to all
21b0: 20 6f 73 5f 2a 2e 63 20 66 69 6c 65 73 0a 2a 2f   os_*.c files.*/
21c0: 0a 23 69 6e 63 6c 75 64 65 20 22 6f 73 5f 63 6f  .#include "os_co
21d0: 6d 6d 6f 6e 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 44  mmon.h"../*.** D
21e0: 65 66 69 6e 65 20 76 61 72 69 6f 75 73 20 6d 61  efine various ma
21f0: 63 72 6f 73 20 74 68 61 74 20 61 72 65 20 6d 69  cros that are mi
2200: 73 73 69 6e 67 20 66 72 6f 6d 20 73 6f 6d 65 20  ssing from some 
2210: 73 79 73 74 65 6d 73 2e 0a 2a 2f 0a 23 69 66 6e  systems..*/.#ifn
2220: 64 65 66 20 4f 5f 4c 41 52 47 45 46 49 4c 45 0a  def O_LARGEFILE.
2230: 23 20 64 65 66 69 6e 65 20 4f 5f 4c 41 52 47 45  # define O_LARGE
2240: 46 49 4c 45 20 30 0a 23 65 6e 64 69 66 0a 23 69  FILE 0.#endif.#i
2250: 66 64 65 66 20 53 51 4c 49 54 45 5f 44 49 53 41  fdef SQLITE_DISA
2260: 42 4c 45 5f 4c 46 53 0a 23 20 75 6e 64 65 66 20  BLE_LFS.# undef 
2270: 4f 5f 4c 41 52 47 45 46 49 4c 45 0a 23 20 64 65  O_LARGEFILE.# de
2280: 66 69 6e 65 20 4f 5f 4c 41 52 47 45 46 49 4c 45  fine O_LARGEFILE
2290: 20 30 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65   0.#endif.#ifnde
22a0: 66 20 4f 5f 4e 4f 46 4f 4c 4c 4f 57 0a 23 20 64  f O_NOFOLLOW.# d
22b0: 65 66 69 6e 65 20 4f 5f 4e 4f 46 4f 4c 4c 4f 57  efine O_NOFOLLOW
22c0: 20 30 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65   0.#endif.#ifnde
22d0: 66 20 4f 5f 42 49 4e 41 52 59 0a 23 20 64 65 66  f O_BINARY.# def
22e0: 69 6e 65 20 4f 5f 42 49 4e 41 52 59 20 30 0a 23  ine O_BINARY 0.#
22f0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
2300: 20 44 4a 47 50 50 20 63 6f 6d 70 69 6c 65 72 20   DJGPP compiler 
2310: 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 6c 6f 6f 6b  environment look
2320: 73 20 6d 6f 73 74 6c 79 20 6c 69 6b 65 20 55 6e  s mostly like Un
2330: 69 78 2c 20 62 75 74 20 69 74 0a 2a 2a 20 6c 61  ix, but it.** la
2340: 63 6b 73 20 74 68 65 20 66 63 6e 74 6c 28 29 20  cks the fcntl() 
2350: 73 79 73 74 65 6d 20 63 61 6c 6c 2e 20 20 53 6f  system call.  So
2360: 20 72 65 64 65 66 69 6e 65 20 66 63 6e 74 6c 28   redefine fcntl(
2370: 29 20 74 6f 20 62 65 20 73 6f 6d 65 74 68 69 6e  ) to be somethin
2380: 67 0a 2a 2a 20 74 68 61 74 20 61 6c 77 61 79 73  g.** that always
2390: 20 73 75 63 63 65 65 64 73 2e 20 20 54 68 69 73   succeeds.  This
23a0: 20 6d 65 61 6e 73 20 74 68 61 74 20 6c 6f 63 6b   means that lock
23b0: 69 6e 67 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63  ing does not occ
23c0: 75 72 20 75 6e 64 65 72 0a 2a 2a 20 44 4a 47 50  ur under.** DJGP
23d0: 50 2e 20 20 42 75 74 20 69 74 20 69 73 20 44 4f  P.  But it is DO
23e0: 53 20 2d 20 77 68 61 74 20 64 69 64 20 79 6f 75  S - what did you
23f0: 20 65 78 70 65 63 74 3f 0a 2a 2f 0a 23 69 66 64   expect?.*/.#ifd
2400: 65 66 20 5f 5f 44 4a 47 50 50 5f 5f 0a 23 20 64  ef __DJGPP__.# d
2410: 65 66 69 6e 65 20 66 63 6e 74 6c 28 41 2c 42 2c  efine fcntl(A,B,
2420: 43 29 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  C) 0.#endif../*.
2430: 2a 2a 20 54 68 65 20 74 68 72 65 61 64 69 64 20  ** The threadid 
2440: 6d 61 63 72 6f 20 72 65 73 6f 6c 76 65 73 20 74  macro resolves t
2450: 6f 20 74 68 65 20 74 68 72 65 61 64 2d 69 64 20  o the thread-id 
2460: 6f 72 20 74 6f 20 30 2e 20 20 55 73 65 64 20 66  or to 0.  Used f
2470: 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e  or.** testing an
2480: 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79  d debugging only
2490: 2e 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  ..*/.#if SQLITE_
24a0: 54 48 52 45 41 44 53 41 46 45 0a 23 64 65 66 69  THREADSAFE.#defi
24b0: 6e 65 20 74 68 72 65 61 64 69 64 20 70 74 68 72  ne threadid pthr
24c0: 65 61 64 5f 73 65 6c 66 28 29 0a 23 65 6c 73 65  ead_self().#else
24d0: 0a 23 64 65 66 69 6e 65 20 74 68 72 65 61 64 69  .#define threadi
24e0: 64 20 30 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  d 0.#endif.../*.
24f0: 2a 2a 20 48 65 6c 70 65 72 20 66 75 6e 63 74 69  ** Helper functi
2500: 6f 6e 73 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e  ons to obtain an
2510: 64 20 72 65 6c 69 6e 71 75 69 73 68 20 74 68 65  d relinquish the
2520: 20 67 6c 6f 62 61 6c 20 6d 75 74 65 78 2e 20 54   global mutex. T
2530: 68 65 0a 2a 2a 20 67 6c 6f 62 61 6c 20 6d 75 74  he.** global mut
2540: 65 78 20 69 73 20 75 73 65 64 20 74 6f 20 70 72  ex is used to pr
2550: 6f 74 65 63 74 20 74 68 65 20 75 6e 69 78 49 6e  otect the unixIn
2560: 6f 64 65 49 6e 66 6f 20 61 6e 64 0a 2a 2a 20 76  odeInfo and.** v
2570: 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a  xworksFileId obj
2580: 65 63 74 73 20 75 73 65 64 20 62 79 20 74 68 69  ects used by thi
2590: 73 20 66 69 6c 65 2c 20 61 6c 6c 20 6f 66 20 77  s file, all of w
25a0: 68 69 63 68 20 6d 61 79 20 62 65 20 0a 2a 2a 20  hich may be .** 
25b0: 73 68 61 72 65 64 20 62 79 20 6d 75 6c 74 69 70  shared by multip
25c0: 6c 65 20 74 68 72 65 61 64 73 2e 0a 2a 2a 0a 2a  le threads..**.*
25d0: 2a 20 46 75 6e 63 74 69 6f 6e 20 75 6e 69 78 4d  * Function unixM
25e0: 75 74 65 78 48 65 6c 64 28 29 20 69 73 20 75 73  utexHeld() is us
25f0: 65 64 20 74 6f 20 61 73 73 65 72 74 28 29 20 74  ed to assert() t
2600: 68 61 74 20 74 68 65 20 67 6c 6f 62 61 6c 20 6d  hat the global m
2610: 75 74 65 78 20 0a 2a 2a 20 69 73 20 68 65 6c 64  utex .** is held
2620: 20 77 68 65 6e 20 72 65 71 75 69 72 65 64 2e 20   when required. 
2630: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
2640: 20 6f 6e 6c 79 20 75 73 65 64 20 61 73 20 70 61   only used as pa
2650: 72 74 20 6f 66 20 61 73 73 65 72 74 28 29 20 0a  rt of assert() .
2660: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 65  ** statements. e
2670: 2e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 75 6e 69 78  .g..**.**   unix
2680: 45 6e 74 65 72 4d 75 74 65 78 28 29 0a 2a 2a 20  EnterMutex().** 
2690: 20 20 20 20 61 73 73 65 72 74 28 20 75 6e 69 78      assert( unix
26a0: 4d 75 74 65 78 48 65 6c 64 28 29 20 29 3b 0a 2a  MutexHeld() );.*
26b0: 2a 20 20 20 75 6e 69 78 45 6e 74 65 72 4c 65 61  *   unixEnterLea
26c0: 76 65 28 29 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ve().*/.static v
26d0: 6f 69 64 20 75 6e 69 78 45 6e 74 65 72 4d 75 74  oid unixEnterMut
26e0: 65 78 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69  ex(void){.  sqli
26f0: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
2700: 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
2710: 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
2720: 54 41 54 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a  TATIC_MASTER));.
2730: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e  }.static void un
2740: 69 78 4c 65 61 76 65 4d 75 74 65 78 28 76 6f 69  ixLeaveMutex(voi
2750: 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  d){.  sqlite3_mu
2760: 74 65 78 5f 6c 65 61 76 65 28 73 71 6c 69 74 65  tex_leave(sqlite
2770: 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
2780: 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
2790: 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 23 69 66 64  MASTER));.}.#ifd
27a0: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
27b0: 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 4d  static int unixM
27c0: 75 74 65 78 48 65 6c 64 28 76 6f 69 64 29 20 7b  utexHeld(void) {
27d0: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
27e0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 73 71 6c  3_mutex_held(sql
27f0: 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
2800: 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
2810: 49 43 5f 4d 41 53 54 45 52 29 29 3b 0a 7d 0a 23  IC_MASTER));.}.#
2820: 65 6e 64 69 66 0a 0a 0a 23 69 66 64 65 66 20 53  endif...#ifdef S
2830: 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a  QLITE_DEBUG./*.*
2840: 2a 20 48 65 6c 70 65 72 20 66 75 6e 63 74 69 6f  * Helper functio
2850: 6e 20 66 6f 72 20 70 72 69 6e 74 69 6e 67 20 6f  n for printing o
2860: 75 74 20 74 72 61 63 65 20 69 6e 66 6f 72 6d 61  ut trace informa
2870: 74 69 6f 6e 20 66 72 6f 6d 20 64 65 62 75 67 67  tion from debugg
2880: 69 6e 67 0a 2a 2a 20 62 69 6e 61 72 69 65 73 2e  ing.** binaries.
2890: 20 54 68 69 73 20 72 65 74 75 72 6e 73 20 74 68   This returns th
28a0: 65 20 73 74 72 69 6e 67 20 72 65 70 72 65 73 65  e string represe
28b0: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 75  tation of the su
28c0: 70 70 6c 69 65 64 0a 2a 2a 20 69 6e 74 65 67 65  pplied.** intege
28d0: 72 20 6c 6f 63 6b 2d 74 79 70 65 2e 0a 2a 2f 0a  r lock-type..*/.
28e0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
28f0: 72 20 2a 61 7a 46 69 6c 65 4c 6f 63 6b 28 69 6e  r *azFileLock(in
2900: 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20  t eFileLock){.  
2910: 73 77 69 74 63 68 28 20 65 46 69 6c 65 4c 6f 63  switch( eFileLoc
2920: 6b 20 29 7b 0a 20 20 20 20 63 61 73 65 20 4e 4f  k ){.    case NO
2930: 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 4e  _LOCK: return "N
2940: 4f 4e 45 22 3b 0a 20 20 20 20 63 61 73 65 20 53  ONE";.    case S
2950: 48 41 52 45 44 5f 4c 4f 43 4b 3a 20 72 65 74 75  HARED_LOCK: retu
2960: 72 6e 20 22 53 48 41 52 45 44 22 3b 0a 20 20 20  rn "SHARED";.   
2970: 20 63 61 73 65 20 52 45 53 45 52 56 45 44 5f 4c   case RESERVED_L
2980: 4f 43 4b 3a 20 72 65 74 75 72 6e 20 22 52 45 53  OCK: return "RES
2990: 45 52 56 45 44 22 3b 0a 20 20 20 20 63 61 73 65  ERVED";.    case
29a0: 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3a 20 72   PENDING_LOCK: r
29b0: 65 74 75 72 6e 20 22 50 45 4e 44 49 4e 47 22 3b  eturn "PENDING";
29c0: 0a 20 20 20 20 63 61 73 65 20 45 58 43 4c 55 53  .    case EXCLUS
29d0: 49 56 45 5f 4c 4f 43 4b 3a 20 72 65 74 75 72 6e  IVE_LOCK: return
29e0: 20 22 45 58 43 4c 55 53 49 56 45 22 3b 0a 20 20   "EXCLUSIVE";.  
29f0: 7d 0a 20 20 72 65 74 75 72 6e 20 22 45 52 52 4f  }.  return "ERRO
2a00: 52 22 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  R";.}.#endif..#i
2a10: 66 64 65 66 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  fdef SQLITE_LOCK
2a20: 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20 50 72 69  _TRACE./*.** Pri
2a30: 6e 74 20 6f 75 74 20 69 6e 66 6f 72 6d 61 74 69  nt out informati
2a40: 6f 6e 20 61 62 6f 75 74 20 61 6c 6c 20 6c 6f 63  on about all loc
2a50: 6b 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73 2e  king operations.
2a60: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
2a70: 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20  ine is used for 
2a80: 74 72 6f 75 62 6c 65 73 68 6f 6f 74 69 6e 67 20  troubleshooting 
2a90: 6c 6f 63 6b 73 20 6f 6e 20 6d 75 6c 74 69 74 68  locks on multith
2aa0: 72 65 61 64 65 64 0a 2a 2a 20 70 6c 61 74 66 6f  readed.** platfo
2ab0: 72 6d 73 2e 20 20 45 6e 61 62 6c 65 20 62 79 20  rms.  Enable by 
2ac0: 63 6f 6d 70 69 6c 69 6e 67 20 77 69 74 68 20 74  compiling with t
2ad0: 68 65 20 2d 44 53 51 4c 49 54 45 5f 4c 4f 43 4b  he -DSQLITE_LOCK
2ae0: 5f 54 52 41 43 45 0a 2a 2a 20 63 6f 6d 6d 61 6e  _TRACE.** comman
2af0: 64 2d 6c 69 6e 65 20 6f 70 74 69 6f 6e 20 6f 6e  d-line option on
2b00: 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 2e 20 20   the compiler.  
2b10: 54 68 69 73 20 63 6f 64 65 20 69 73 20 6e 6f 72  This code is nor
2b20: 6d 61 6c 6c 79 0a 2a 2a 20 74 75 72 6e 65 64 20  mally.** turned 
2b30: 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  off..*/.static i
2b40: 6e 74 20 6c 6f 63 6b 54 72 61 63 65 28 69 6e 74  nt lockTrace(int
2b50: 20 66 64 2c 20 69 6e 74 20 6f 70 2c 20 73 74 72   fd, int op, str
2b60: 75 63 74 20 66 6c 6f 63 6b 20 2a 70 29 7b 0a 20  uct flock *p){. 
2b70: 20 63 68 61 72 20 2a 7a 4f 70 4e 61 6d 65 2c 20   char *zOpName, 
2b80: 2a 7a 54 79 70 65 3b 0a 20 20 69 6e 74 20 73 3b  *zType;.  int s;
2b90: 0a 20 20 69 6e 74 20 73 61 76 65 64 45 72 72 6e  .  int savedErrn
2ba0: 6f 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 46 5f 47  o;.  if( op==F_G
2bb0: 45 54 4c 4b 20 29 7b 0a 20 20 20 20 7a 4f 70 4e  ETLK ){.    zOpN
2bc0: 61 6d 65 20 3d 20 22 47 45 54 4c 4b 22 3b 0a 20  ame = "GETLK";. 
2bd0: 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 3d 3d 46   }else if( op==F
2be0: 5f 53 45 54 4c 4b 20 29 7b 0a 20 20 20 20 7a 4f  _SETLK ){.    zO
2bf0: 70 4e 61 6d 65 20 3d 20 22 53 45 54 4c 4b 22 3b  pName = "SETLK";
2c00: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 20  .  }else{.    s 
2c10: 3d 20 66 63 6e 74 6c 28 66 64 2c 20 6f 70 2c 20  = fcntl(fd, op, 
2c20: 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  p);.    sqlite3D
2c30: 65 62 75 67 50 72 69 6e 74 66 28 22 66 63 6e 74  ebugPrintf("fcnt
2c40: 6c 20 75 6e 6b 6e 6f 77 6e 20 25 64 20 25 64 20  l unknown %d %d 
2c50: 25 64 5c 6e 22 2c 20 66 64 2c 20 6f 70 2c 20 73  %d\n", fd, op, s
2c60: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 3b  );.    return s;
2c70: 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 6c 5f  .  }.  if( p->l_
2c80: 74 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b  type==F_RDLCK ){
2c90: 0a 20 20 20 20 7a 54 79 70 65 20 3d 20 22 52 44  .    zType = "RD
2ca0: 4c 43 4b 22 3b 0a 20 20 7d 65 6c 73 65 20 69 66  LCK";.  }else if
2cb0: 28 20 70 2d 3e 6c 5f 74 79 70 65 3d 3d 46 5f 57  ( p->l_type==F_W
2cc0: 52 4c 43 4b 20 29 7b 0a 20 20 20 20 7a 54 79 70  RLCK ){.    zTyp
2cd0: 65 20 3d 20 22 57 52 4c 43 4b 22 3b 0a 20 20 7d  e = "WRLCK";.  }
2ce0: 65 6c 73 65 20 69 66 28 20 70 2d 3e 6c 5f 74 79  else if( p->l_ty
2cf0: 70 65 3d 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20  pe==F_UNLCK ){. 
2d00: 20 20 20 7a 54 79 70 65 20 3d 20 22 55 4e 4c 43     zType = "UNLC
2d10: 4b 22 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  K";.  }else{.   
2d20: 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a 20 20   assert( 0 );.  
2d30: 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6c  }.  assert( p->l
2d40: 5f 77 68 65 6e 63 65 3d 3d 53 45 45 4b 5f 53 45  _whence==SEEK_SE
2d50: 54 20 29 3b 0a 20 20 73 20 3d 20 66 63 6e 74 6c  T );.  s = fcntl
2d60: 28 66 64 2c 20 6f 70 2c 20 70 29 3b 0a 20 20 73  (fd, op, p);.  s
2d70: 61 76 65 64 45 72 72 6e 6f 20 3d 20 65 72 72 6e  avedErrno = errn
2d80: 6f 3b 0a 20 20 73 71 6c 69 74 65 33 44 65 62 75  o;.  sqlite3Debu
2d90: 67 50 72 69 6e 74 66 28 22 66 63 6e 74 6c 20 25  gPrintf("fcntl %
2da0: 64 20 25 64 20 25 73 20 25 73 20 25 64 20 25 64  d %d %s %s %d %d
2db0: 20 25 64 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20   %d %d\n",.     
2dc0: 74 68 72 65 61 64 69 64 2c 20 66 64 2c 20 7a 4f  threadid, fd, zO
2dd0: 70 4e 61 6d 65 2c 20 7a 54 79 70 65 2c 20 28 69  pName, zType, (i
2de0: 6e 74 29 70 2d 3e 6c 5f 73 74 61 72 74 2c 20 28  nt)p->l_start, (
2df0: 69 6e 74 29 70 2d 3e 6c 5f 6c 65 6e 2c 0a 20 20  int)p->l_len,.  
2e00: 20 20 20 28 69 6e 74 29 70 2d 3e 6c 5f 70 69 64     (int)p->l_pid
2e10: 2c 20 73 29 3b 0a 20 20 69 66 28 20 73 3d 3d 28  , s);.  if( s==(
2e20: 2d 31 29 20 26 26 20 6f 70 3d 3d 46 5f 53 45 54  -1) && op==F_SET
2e30: 4c 4b 20 26 26 20 28 70 2d 3e 6c 5f 74 79 70 65  LK && (p->l_type
2e40: 3d 3d 46 5f 52 44 4c 43 4b 20 7c 7c 20 70 2d 3e  ==F_RDLCK || p->
2e50: 6c 5f 74 79 70 65 3d 3d 46 5f 57 52 4c 43 4b 29  l_type==F_WRLCK)
2e60: 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 66   ){.    struct f
2e70: 6c 6f 63 6b 20 6c 32 3b 0a 20 20 20 20 6c 32 20  lock l2;.    l2 
2e80: 3d 20 2a 70 3b 0a 20 20 20 20 66 63 6e 74 6c 28  = *p;.    fcntl(
2e90: 66 64 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 32  fd, F_GETLK, &l2
2ea0: 29 3b 0a 20 20 20 20 69 66 28 20 6c 32 2e 6c 5f  );.    if( l2.l_
2eb0: 74 79 70 65 3d 3d 46 5f 52 44 4c 43 4b 20 29 7b  type==F_RDLCK ){
2ec0: 0a 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22  .      zType = "
2ed0: 52 44 4c 43 4b 22 3b 0a 20 20 20 20 7d 65 6c 73  RDLCK";.    }els
2ee0: 65 20 69 66 28 20 6c 32 2e 6c 5f 74 79 70 65 3d  e if( l2.l_type=
2ef0: 3d 46 5f 57 52 4c 43 4b 20 29 7b 0a 20 20 20 20  =F_WRLCK ){.    
2f00: 20 20 7a 54 79 70 65 20 3d 20 22 57 52 4c 43 4b    zType = "WRLCK
2f10: 22 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  ";.    }else if(
2f20: 20 6c 32 2e 6c 5f 74 79 70 65 3d 3d 46 5f 55 4e   l2.l_type==F_UN
2f30: 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 7a 54 79  LCK ){.      zTy
2f40: 70 65 20 3d 20 22 55 4e 4c 43 4b 22 3b 0a 20 20  pe = "UNLCK";.  
2f50: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
2f60: 73 73 65 72 74 28 20 30 20 29 3b 0a 20 20 20 20  ssert( 0 );.    
2f70: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62  }.    sqlite3Deb
2f80: 75 67 50 72 69 6e 74 66 28 22 66 63 6e 74 6c 2d  ugPrintf("fcntl-
2f90: 66 61 69 6c 75 72 65 2d 72 65 61 73 6f 6e 3a 20  failure-reason: 
2fa0: 25 73 20 25 64 20 25 64 20 25 64 5c 6e 22 2c 0a  %s %d %d %d\n",.
2fb0: 20 20 20 20 20 20 20 7a 54 79 70 65 2c 20 28 69         zType, (i
2fc0: 6e 74 29 6c 32 2e 6c 5f 73 74 61 72 74 2c 20 28  nt)l2.l_start, (
2fd0: 69 6e 74 29 6c 32 2e 6c 5f 6c 65 6e 2c 20 28 69  int)l2.l_len, (i
2fe0: 6e 74 29 6c 32 2e 6c 5f 70 69 64 29 3b 0a 20 20  nt)l2.l_pid);.  
2ff0: 7d 0a 20 20 65 72 72 6e 6f 20 3d 20 73 61 76 65  }.  errno = save
3000: 64 45 72 72 6e 6f 3b 0a 20 20 72 65 74 75 72 6e  dErrno;.  return
3010: 20 73 3b 0a 7d 0a 23 64 65 66 69 6e 65 20 66 63   s;.}.#define fc
3020: 6e 74 6c 20 6c 6f 63 6b 54 72 61 63 65 0a 23 65  ntl lockTrace.#e
3030: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4c  ndif /* SQLITE_L
3040: 4f 43 4b 5f 54 52 41 43 45 20 2a 2f 0a 0a 0a 0a  OCK_TRACE */....
3050: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
3060: 6e 65 20 74 72 61 6e 73 6c 61 74 65 73 20 61 20  ne translates a 
3070: 73 74 61 6e 64 61 72 64 20 50 4f 53 49 58 20 65  standard POSIX e
3080: 72 72 6e 6f 20 63 6f 64 65 20 69 6e 74 6f 20 73  rrno code into s
3090: 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 75 73 65 66  omething.** usef
30a0: 75 6c 20 74 6f 20 74 68 65 20 63 6c 69 65 6e 74  ul to the client
30b0: 73 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33  s of the sqlite3
30c0: 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20 53 70 65   functions.  Spe
30d0: 63 69 66 69 63 61 6c 6c 79 2c 20 69 74 20 69 73  cifically, it is
30e0: 0a 2a 2a 20 69 6e 74 65 6e 64 65 64 20 74 6f 20  .** intended to 
30f0: 74 72 61 6e 73 6c 61 74 65 20 61 20 76 61 72 69  translate a vari
3100: 65 74 79 20 6f 66 20 22 74 72 79 20 61 67 61 69  ety of "try agai
3110: 6e 22 20 65 72 72 6f 72 73 20 69 6e 74 6f 20 53  n" errors into S
3120: 51 4c 49 54 45 5f 42 55 53 59 0a 2a 2a 20 61 6e  QLITE_BUSY.** an
3130: 64 20 61 20 76 61 72 69 65 74 79 20 6f 66 20 22  d a variety of "
3140: 70 6c 65 61 73 65 20 63 6c 6f 73 65 20 74 68 65  please close the
3150: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
3160: 20 4e 4f 57 22 20 65 72 72 6f 72 73 20 69 6e 74   NOW" errors int
3170: 6f 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 49 4f 45  o .** SQLITE_IOE
3180: 52 52 0a 2a 2a 20 0a 2a 2a 20 45 72 72 6f 72 73  RR.** .** Errors
3190: 20 64 75 72 69 6e 67 20 69 6e 69 74 69 61 6c 69   during initiali
31a0: 7a 61 74 69 6f 6e 20 6f 66 20 6c 6f 63 6b 73 2c  zation of locks,
31b0: 20 6f 72 20 66 69 6c 65 20 73 79 73 74 65 6d 20   or file system 
31c0: 73 75 70 70 6f 72 74 20 66 6f 72 20 6c 6f 63 6b  support for lock
31d0: 73 2c 0a 2a 2a 20 73 68 6f 75 6c 64 20 68 61 6e  s,.** should han
31e0: 64 6c 65 20 45 4e 4f 4c 43 4b 2c 20 45 4e 4f 54  dle ENOLCK, ENOT
31f0: 53 55 50 2c 20 45 4f 50 4e 4f 54 53 55 50 50 20  SUP, EOPNOTSUPP 
3200: 73 65 70 61 72 61 74 65 6c 79 2e 0a 2a 2f 0a 73  separately..*/.s
3210: 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65  tatic int sqlite
3220: 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72  ErrorFromPosixEr
3230: 72 6f 72 28 69 6e 74 20 70 6f 73 69 78 45 72 72  ror(int posixErr
3240: 6f 72 2c 20 69 6e 74 20 73 71 6c 69 74 65 49 4f  or, int sqliteIO
3250: 45 72 72 29 20 7b 0a 20 20 73 77 69 74 63 68 20  Err) {.  switch 
3260: 28 70 6f 73 69 78 45 72 72 6f 72 29 20 7b 0a 20  (posixError) {. 
3270: 20 63 61 73 65 20 30 3a 20 0a 20 20 20 20 72 65   case 0: .    re
3280: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
3290: 20 20 20 20 0a 20 20 63 61 73 65 20 45 41 47 41      .  case EAGA
32a0: 49 4e 3a 0a 20 20 63 61 73 65 20 45 54 49 4d 45  IN:.  case ETIME
32b0: 44 4f 55 54 3a 0a 20 20 63 61 73 65 20 45 42 55  DOUT:.  case EBU
32c0: 53 59 3a 0a 20 20 63 61 73 65 20 45 49 4e 54 52  SY:.  case EINTR
32d0: 3a 0a 20 20 63 61 73 65 20 45 4e 4f 4c 43 4b 3a  :.  case ENOLCK:
32e0: 20 20 0a 20 20 20 20 2f 2a 20 72 61 6e 64 6f 6d    .    /* random
32f0: 20 4e 46 53 20 72 65 74 72 79 20 65 72 72 6f 72   NFS retry error
3300: 2c 20 75 6e 6c 65 73 73 20 64 75 72 69 6e 67 20  , unless during 
3310: 66 69 6c 65 20 73 79 73 74 65 6d 20 73 75 70 70  file system supp
3320: 6f 72 74 20 0a 20 20 20 20 20 2a 20 69 6e 74 72  ort .     * intr
3330: 6f 73 70 65 63 74 69 6f 6e 2c 20 69 6e 20 77 68  ospection, in wh
3340: 69 63 68 20 69 74 20 61 63 74 75 61 6c 6c 79 20  ich it actually 
3350: 6d 65 61 6e 73 20 77 68 61 74 20 69 74 20 73 61  means what it sa
3360: 79 73 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  ys */.    return
3370: 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
3380: 20 20 0a 20 20 63 61 73 65 20 45 41 43 43 45 53    .  case EACCES
3390: 3a 20 0a 20 20 20 20 2f 2a 20 45 41 43 43 45 53  : .    /* EACCES
33a0: 20 69 73 20 6c 69 6b 65 20 45 41 47 41 49 4e 20   is like EAGAIN 
33b0: 64 75 72 69 6e 67 20 6c 6f 63 6b 69 6e 67 20 6f  during locking o
33c0: 70 65 72 61 74 69 6f 6e 73 2c 20 62 75 74 20 6e  perations, but n
33d0: 6f 74 20 61 6e 79 20 6f 74 68 65 72 20 74 69 6d  ot any other tim
33e0: 65 2a 2f 0a 20 20 20 20 69 66 28 20 28 73 71 6c  e*/.    if( (sql
33f0: 69 74 65 49 4f 45 72 72 20 3d 3d 20 53 51 4c 49  iteIOErr == SQLI
3400: 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 20 7c  TE_IOERR_LOCK) |
3410: 7c 20 0a 09 28 73 71 6c 69 74 65 49 4f 45 72 72  | ..(sqliteIOErr
3420: 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52   == SQLITE_IOERR
3430: 5f 55 4e 4c 4f 43 4b 29 20 7c 7c 20 0a 09 28 73  _UNLOCK) || ..(s
3440: 71 6c 69 74 65 49 4f 45 72 72 20 3d 3d 20 53 51  qliteIOErr == SQ
3450: 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43  LITE_IOERR_RDLOC
3460: 4b 29 20 7c 7c 0a 09 28 73 71 6c 69 74 65 49 4f  K) ||..(sqliteIO
3470: 45 72 72 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f  Err == SQLITE_IO
3480: 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45  ERR_CHECKRESERVE
3490: 44 4c 4f 43 4b 29 20 29 7b 0a 20 20 20 20 20 20  DLOCK) ){.      
34a0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
34b0: 53 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a  SY;.    }.    /*
34c0: 20 65 6c 73 65 20 66 61 6c 6c 20 74 68 72 6f 75   else fall throu
34d0: 67 68 20 2a 2f 0a 20 20 63 61 73 65 20 45 50 45  gh */.  case EPE
34e0: 52 4d 3a 20 0a 20 20 20 20 72 65 74 75 72 6e 20  RM: .    return 
34f0: 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20 20  SQLITE_PERM;.   
3500: 20 0a 20 20 63 61 73 65 20 45 44 45 41 44 4c 4b   .  case EDEADLK
3510: 3a 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  :.    return SQL
3520: 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b 45  ITE_IOERR_BLOCKE
3530: 44 3b 0a 20 20 20 20 0a 23 69 66 20 45 4f 50 4e  D;.    .#if EOPN
3540: 4f 54 53 55 50 50 21 3d 45 4e 4f 54 53 55 50 0a  OTSUPP!=ENOTSUP.
3550: 20 20 63 61 73 65 20 45 4f 50 4e 4f 54 53 55 50    case EOPNOTSUP
3560: 50 3a 20 0a 20 20 20 20 2f 2a 20 73 6f 6d 65 74  P: .    /* somet
3570: 68 69 6e 67 20 77 65 6e 74 20 74 65 72 72 69 62  hing went terrib
3580: 6c 79 20 61 77 72 79 2c 20 75 6e 6c 65 73 73 20  ly awry, unless 
3590: 64 75 72 69 6e 67 20 66 69 6c 65 20 73 79 73 74  during file syst
35a0: 65 6d 20 73 75 70 70 6f 72 74 20 0a 20 20 20 20  em support .    
35b0: 20 2a 20 69 6e 74 72 6f 73 70 65 63 74 69 6f 6e   * introspection
35c0: 2c 20 69 6e 20 77 68 69 63 68 20 69 74 20 61 63  , in which it ac
35d0: 74 75 61 6c 6c 79 20 6d 65 61 6e 73 20 77 68 61  tually means wha
35e0: 74 20 69 74 20 73 61 79 73 20 2a 2f 0a 23 65 6e  t it says */.#en
35f0: 64 69 66 0a 23 69 66 64 65 66 20 45 4e 4f 54 53  dif.#ifdef ENOTS
3600: 55 50 0a 20 20 63 61 73 65 20 45 4e 4f 54 53 55  UP.  case ENOTSU
3610: 50 3a 20 0a 20 20 20 20 2f 2a 20 69 6e 76 61 6c  P: .    /* inval
3620: 69 64 20 66 64 2c 20 75 6e 6c 65 73 73 20 64 75  id fd, unless du
3630: 72 69 6e 67 20 66 69 6c 65 20 73 79 73 74 65 6d  ring file system
3640: 20 73 75 70 70 6f 72 74 20 69 6e 74 72 6f 73 70   support introsp
3650: 65 63 74 69 6f 6e 2c 20 69 6e 20 77 68 69 63 68  ection, in which
3660: 20 0a 20 20 20 20 20 2a 20 69 74 20 61 63 74 75   .     * it actu
3670: 61 6c 6c 79 20 6d 65 61 6e 73 20 77 68 61 74 20  ally means what 
3680: 69 74 20 73 61 79 73 20 2a 2f 0a 23 65 6e 64 69  it says */.#endi
3690: 66 0a 20 20 63 61 73 65 20 45 49 4f 3a 0a 20 20  f.  case EIO:.  
36a0: 63 61 73 65 20 45 42 41 44 46 3a 0a 20 20 63 61  case EBADF:.  ca
36b0: 73 65 20 45 49 4e 56 41 4c 3a 0a 20 20 63 61 73  se EINVAL:.  cas
36c0: 65 20 45 4e 4f 54 43 4f 4e 4e 3a 0a 20 20 63 61  e ENOTCONN:.  ca
36d0: 73 65 20 45 4e 4f 44 45 56 3a 0a 20 20 63 61 73  se ENODEV:.  cas
36e0: 65 20 45 4e 58 49 4f 3a 0a 20 20 63 61 73 65 20  e ENXIO:.  case 
36f0: 45 4e 4f 45 4e 54 3a 0a 20 20 63 61 73 65 20 45  ENOENT:.  case E
3700: 53 54 41 4c 45 3a 0a 20 20 63 61 73 65 20 45 4e  STALE:.  case EN
3710: 4f 53 59 53 3a 0a 20 20 20 20 2f 2a 20 74 68 65  OSYS:.    /* the
3720: 73 65 20 73 68 6f 75 6c 64 20 66 6f 72 63 65 20  se should force 
3730: 74 68 65 20 63 6c 69 65 6e 74 20 74 6f 20 63 6c  the client to cl
3740: 6f 73 65 20 74 68 65 20 66 69 6c 65 20 61 6e 64  ose the file and
3750: 20 72 65 63 6f 6e 6e 65 63 74 20 2a 2f 0a 20 20   reconnect */.  
3760: 20 20 0a 20 20 64 65 66 61 75 6c 74 3a 20 0a 20    .  default: . 
3770: 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
3780: 49 4f 45 72 72 3b 0a 20 20 7d 0a 7d 0a 0a 0a 0a  IOErr;.  }.}....
3790: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
37a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
37b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
37c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
37d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
37e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
37f0: 2a 2a 20 42 65 67 69 6e 20 55 6e 69 71 75 65 20  ** Begin Unique 
3800: 46 69 6c 65 20 49 44 20 55 74 69 6c 69 74 79 20  File ID Utility 
3810: 55 73 65 64 20 42 79 20 56 78 57 6f 72 6b 73 20  Used By VxWorks 
3820: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
3830: 2a 2a 0a 2a 2a 20 4f 6e 20 6d 6f 73 74 20 76 65  **.** On most ve
3840: 72 73 69 6f 6e 73 20 6f 66 20 75 6e 69 78 2c 20  rsions of unix, 
3850: 77 65 20 63 61 6e 20 67 65 74 20 61 20 75 6e 69  we can get a uni
3860: 71 75 65 20 49 44 20 66 6f 72 20 61 20 66 69 6c  que ID for a fil
3870: 65 20 62 79 20 63 6f 6e 63 61 74 65 6e 61 74 69  e by concatenati
3880: 6e 67 0a 2a 2a 20 74 68 65 20 64 65 76 69 63 65  ng.** the device
3890: 20 6e 75 6d 62 65 72 20 61 6e 64 20 74 68 65 20   number and the 
38a0: 69 6e 6f 64 65 20 6e 75 6d 62 65 72 2e 20 20 42  inode number.  B
38b0: 75 74 20 74 68 69 73 20 64 6f 65 73 20 6e 6f 74  ut this does not
38c0: 20 77 6f 72 6b 20 6f 6e 20 56 78 57 6f 72 6b 73   work on VxWorks
38d0: 2e 0a 2a 2a 20 4f 6e 20 56 78 57 6f 72 6b 73 2c  ..** On VxWorks,
38e0: 20 61 20 75 6e 69 71 75 65 20 66 69 6c 65 20 69   a unique file i
38f0: 64 20 6d 75 73 74 20 62 65 20 62 61 73 65 64 20  d must be based 
3900: 6f 6e 20 74 68 65 20 63 61 6e 6f 6e 69 63 61 6c  on the canonical
3910: 20 66 69 6c 65 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a   filename..**.**
3920: 20 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   A pointer to an
3930: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
3940: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
3950: 74 75 72 65 20 63 61 6e 20 62 65 20 75 73 65 64  ture can be used
3960: 20 61 73 20 61 0a 2a 2a 20 75 6e 69 71 75 65 20   as a.** unique 
3970: 66 69 6c 65 20 49 44 20 69 6e 20 56 78 57 6f 72  file ID in VxWor
3980: 6b 73 2e 20 20 45 61 63 68 20 69 6e 73 74 61 6e  ks.  Each instan
3990: 63 65 20 6f 66 20 74 68 69 73 20 73 74 72 75 63  ce of this struc
39a0: 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a  ture contains.**
39b0: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63   a copy of the c
39c0: 61 6e 6f 6e 69 63 61 6c 20 66 69 6c 65 6e 61 6d  anonical filenam
39d0: 65 2e 20 20 54 68 65 72 65 20 69 73 20 61 6c 73  e.  There is als
39e0: 6f 20 61 20 72 65 66 65 72 65 6e 63 65 20 63 6f  o a reference co
39f0: 75 6e 74 2e 20 20 0a 2a 2a 20 54 68 65 20 73 74  unt.  .** The st
3a00: 72 75 63 74 75 72 65 20 69 73 20 72 65 63 6c 61  ructure is recla
3a10: 69 6d 65 64 20 77 68 65 6e 20 74 68 65 20 6e 75  imed when the nu
3a20: 6d 62 65 72 20 6f 66 20 70 6f 69 6e 74 65 72 73  mber of pointers
3a30: 20 74 6f 20 69 74 20 64 72 6f 70 73 20 74 6f 0a   to it drops to.
3a40: 2a 2a 20 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 54  ** zero..**.** T
3a50: 68 65 72 65 20 61 72 65 20 6e 65 76 65 72 20 76  here are never v
3a60: 65 72 79 20 6d 61 6e 79 20 66 69 6c 65 73 20 6f  ery many files o
3a70: 70 65 6e 20 61 74 20 6f 6e 65 20 74 69 6d 65 20  pen at one time 
3a80: 61 6e 64 20 6c 6f 6f 6b 75 70 73 20 61 72 65 20  and lookups are 
3a90: 6e 6f 74 0a 2a 2a 20 61 20 70 65 72 66 6f 72 6d  not.** a perform
3aa0: 61 6e 63 65 2d 63 72 69 74 69 63 61 6c 20 70 61  ance-critical pa
3ab0: 74 68 2c 20 73 6f 20 69 74 20 69 73 20 73 75 66  th, so it is suf
3ac0: 66 69 63 69 65 6e 74 20 74 6f 20 70 75 74 20 74  ficient to put t
3ad0: 68 65 73 65 0a 2a 2a 20 73 74 72 75 63 74 75 72  hese.** structur
3ae0: 65 73 20 6f 6e 20 61 20 6c 69 6e 6b 65 64 20 6c  es on a linked l
3af0: 69 73 74 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 76  ist..*/.struct v
3b00: 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 7b 0a 20  xworksFileId {. 
3b10: 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46   struct vxworksF
3b20: 69 6c 65 49 64 20 2a 70 4e 65 78 74 3b 20 20 2f  ileId *pNext;  /
3b30: 2a 20 4e 65 78 74 20 69 6e 20 61 20 6c 69 73 74  * Next in a list
3b40: 20 6f 66 20 74 68 65 6d 20 61 6c 6c 20 2a 2f 0a   of them all */.
3b50: 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20 20    int nRef;     
3b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3b70: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 66  /* Number of ref
3b80: 65 72 65 6e 63 65 73 20 74 6f 20 74 68 69 73 20  erences to this 
3b90: 6f 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61  one */.  int nNa
3ba0: 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  me;             
3bb0: 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68         /* Length
3bc0: 20 6f 66 20 74 68 65 20 7a 43 61 6e 6f 6e 69 63   of the zCanonic
3bd0: 61 6c 4e 61 6d 65 5b 5d 20 73 74 72 69 6e 67 20  alName[] string 
3be0: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43 61 6e 6f  */.  char *zCano
3bf0: 6e 69 63 61 6c 4e 61 6d 65 3b 20 20 20 20 20 20  nicalName;      
3c00: 20 20 20 2f 2a 20 43 61 6e 6f 6e 69 63 61 6c 20     /* Canonical 
3c10: 66 69 6c 65 6e 61 6d 65 20 2a 2f 0a 7d 3b 0a 0a  filename */.};..
3c20: 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 2f  #if OS_VXWORKS./
3c30: 2a 20 0a 2a 2a 20 41 6c 6c 20 75 6e 69 71 75 65  * .** All unique
3c40: 20 66 69 6c 65 6e 61 6d 65 73 20 61 72 65 20 68   filenames are h
3c50: 65 6c 64 20 6f 6e 20 61 20 6c 69 6e 6b 65 64 20  eld on a linked 
3c60: 6c 69 73 74 20 68 65 61 64 65 64 20 62 79 20 74  list headed by t
3c70: 68 69 73 0a 2a 2a 20 76 61 72 69 61 62 6c 65 3a  his.** variable:
3c80: 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63  .*/.static struc
3c90: 74 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20  t vxworksFileId 
3ca0: 2a 76 78 77 6f 72 6b 73 46 69 6c 65 4c 69 73 74  *vxworksFileList
3cb0: 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 53 69 6d   = 0;../*.** Sim
3cc0: 70 6c 69 66 79 20 61 20 66 69 6c 65 6e 61 6d 65  plify a filename
3cd0: 20 69 6e 74 6f 20 69 74 73 20 63 61 6e 6f 6e 69   into its canoni
3ce0: 63 61 6c 20 66 6f 72 6d 0a 2a 2a 20 62 79 20 6d  cal form.** by m
3cf0: 61 6b 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77  aking the follow
3d00: 69 6e 67 20 63 68 61 6e 67 65 73 3a 0a 2a 2a 0a  ing changes:.**.
3d10: 2a 2a 20 20 2a 20 72 65 6d 6f 76 69 6e 67 20 61  **  * removing a
3d20: 6e 79 20 74 72 61 69 6c 69 6e 67 20 61 6e 64 20  ny trailing and 
3d30: 64 75 70 6c 69 63 61 74 65 20 2f 0a 2a 2a 20 20  duplicate /.**  
3d40: 2a 20 63 6f 6e 76 65 72 74 20 2f 2e 2f 20 69 6e  * convert /./ in
3d50: 74 6f 20 6a 75 73 74 20 2f 0a 2a 2a 20 20 2a 20  to just /.**  * 
3d60: 63 6f 6e 76 65 72 74 20 2f 41 2f 2e 2e 2f 20 77  convert /A/../ w
3d70: 68 65 72 65 20 41 20 69 73 20 61 6e 79 20 73 69  here A is any si
3d80: 6d 70 6c 65 20 6e 61 6d 65 20 69 6e 74 6f 20 6a  mple name into j
3d90: 75 73 74 20 2f 0a 2a 2a 0a 2a 2a 20 43 68 61 6e  ust /.**.** Chan
3da0: 67 65 73 20 61 72 65 20 6d 61 64 65 20 69 6e 2d  ges are made in-
3db0: 70 6c 61 63 65 2e 20 20 52 65 74 75 72 6e 20 74  place.  Return t
3dc0: 68 65 20 6e 65 77 20 6e 61 6d 65 20 6c 65 6e 67  he new name leng
3dd0: 74 68 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 72  th..**.** The or
3de0: 69 67 69 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20  iginal filename 
3df0: 69 73 20 69 6e 20 7a 5b 30 2e 2e 6e 2d 31 5d 2e  is in z[0..n-1].
3e00: 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d    Return the num
3e10: 62 65 72 20 6f 66 0a 2a 2a 20 63 68 61 72 61 63  ber of.** charac
3e20: 74 65 72 73 20 69 6e 20 74 68 65 20 73 69 6d 70  ters in the simp
3e30: 6c 69 66 69 65 64 20 6e 61 6d 65 2e 0a 2a 2f 0a  lified name..*/.
3e40: 73 74 61 74 69 63 20 69 6e 74 20 76 78 77 6f 72  static int vxwor
3e50: 6b 73 53 69 6d 70 6c 69 66 79 4e 61 6d 65 28 63  ksSimplifyName(c
3e60: 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a  har *z, int n){.
3e70: 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 77 68    int i, j;.  wh
3e80: 69 6c 65 28 20 6e 3e 31 20 26 26 20 7a 5b 6e 2d  ile( n>1 && z[n-
3e90: 31 5d 3d 3d 27 2f 27 20 29 7b 20 6e 2d 2d 3b 20  1]=='/' ){ n--; 
3ea0: 7d 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69  }.  for(i=j=0; i
3eb0: 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  <n; i++){.    if
3ec0: 28 20 7a 5b 69 5d 3d 3d 27 2f 27 20 29 7b 0a 20  ( z[i]=='/' ){. 
3ed0: 20 20 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3d       if( z[i+1]=
3ee0: 3d 27 2f 27 20 29 20 63 6f 6e 74 69 6e 75 65 3b  ='/' ) continue;
3ef0: 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2b 31  .      if( z[i+1
3f00: 5d 3d 3d 27 2e 27 20 26 26 20 69 2b 32 3c 6e 20  ]=='.' && i+2<n 
3f10: 26 26 20 7a 5b 69 2b 32 5d 3d 3d 27 2f 27 20 29  && z[i+2]=='/' )
3f20: 7b 0a 20 20 20 20 20 20 20 20 69 20 2b 3d 20 31  {.        i += 1
3f30: 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e  ;.        contin
3f40: 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ue;.      }.    
3f50: 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3d 3d 27 2e    if( z[i+1]=='.
3f60: 27 20 26 26 20 69 2b 33 3c 6e 20 26 26 20 7a 5b  ' && i+3<n && z[
3f70: 69 2b 32 5d 3d 3d 27 2e 27 20 26 26 20 7a 5b 69  i+2]=='.' && z[i
3f80: 2b 33 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20 20  +3]=='/' ){.    
3f90: 20 20 20 20 77 68 69 6c 65 28 20 6a 3e 30 20 26      while( j>0 &
3fa0: 26 20 7a 5b 6a 2d 31 5d 21 3d 27 2f 27 20 29 7b  & z[j-1]!='/' ){
3fb0: 20 6a 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 20 20   j--; }.        
3fc0: 69 66 28 20 6a 3e 30 20 29 7b 20 6a 2d 2d 3b 20  if( j>0 ){ j--; 
3fd0: 7d 0a 20 20 20 20 20 20 20 20 69 20 2b 3d 20 32  }.        i += 2
3fe0: 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e  ;.        contin
3ff0: 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ue;.      }.    
4000: 7d 0a 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 7a  }.    z[j++] = z
4010: 5b 69 5d 3b 0a 20 20 7d 0a 20 20 7a 5b 6a 5d 20  [i];.  }.  z[j] 
4020: 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 6a 3b  = 0;.  return j;
4030: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61  .}../*.** Find a
4040: 20 75 6e 69 71 75 65 20 66 69 6c 65 20 49 44 20   unique file ID 
4050: 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 61 62  for the given ab
4060: 73 6f 6c 75 74 65 20 70 61 74 68 6e 61 6d 65 2e  solute pathname.
4070: 20 20 52 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f    Return.** a po
4080: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 76 78 77  inter to the vxw
4090: 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a 65 63  orksFileId objec
40a0: 74 2e 20 20 54 68 69 73 20 70 6f 69 6e 74 65 72  t.  This pointer
40b0: 20 69 73 20 74 68 65 20 75 6e 69 71 75 65 0a 2a   is the unique.*
40c0: 2a 20 66 69 6c 65 20 49 44 2e 0a 2a 2a 0a 2a 2a  * file ID..**.**
40d0: 20 54 68 65 20 6e 52 65 66 20 66 69 65 6c 64 20   The nRef field 
40e0: 6f 66 20 74 68 65 20 76 78 77 6f 72 6b 73 46 69  of the vxworksFi
40f0: 6c 65 49 64 20 6f 62 6a 65 63 74 20 69 73 20 69  leId object is i
4100: 6e 63 72 65 6d 65 6e 74 65 64 20 62 65 66 6f 72  ncremented befor
4110: 65 0a 2a 2a 20 74 68 65 20 6f 62 6a 65 63 74 20  e.** the object 
4120: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 41 20  is returned.  A 
4130: 6e 65 77 20 76 78 77 6f 72 6b 73 46 69 6c 65 49  new vxworksFileI
4140: 64 20 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61  d object is crea
4150: 74 65 64 0a 2a 2a 20 61 6e 64 20 61 64 64 65 64  ted.** and added
4160: 20 74 6f 20 74 68 65 20 67 6c 6f 62 61 6c 20 6c   to the global l
4170: 69 73 74 20 69 66 20 6e 65 63 65 73 73 61 72 79  ist if necessary
4180: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d  ..**.** If a mem
4190: 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65  ory allocation e
41a0: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74  rror occurs, ret
41b0: 75 72 6e 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61  urn NULL..*/.sta
41c0: 74 69 63 20 73 74 72 75 63 74 20 76 78 77 6f 72  tic struct vxwor
41d0: 6b 73 46 69 6c 65 49 64 20 2a 76 78 77 6f 72 6b  ksFileId *vxwork
41e0: 73 46 69 6e 64 46 69 6c 65 49 64 28 63 6f 6e 73  sFindFileId(cons
41f0: 74 20 63 68 61 72 20 2a 7a 41 62 73 6f 6c 75 74  t char *zAbsolut
4200: 65 4e 61 6d 65 29 7b 0a 20 20 73 74 72 75 63 74  eName){.  struct
4210: 20 76 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a   vxworksFileId *
4220: 70 4e 65 77 3b 20 20 20 20 20 20 20 20 20 2f 2a  pNew;         /*
4230: 20 73 65 61 72 63 68 20 6b 65 79 20 61 6e 64 20   search key and 
4240: 6e 65 77 20 66 69 6c 65 20 49 44 20 2a 2f 0a 20  new file ID */. 
4250: 20 73 74 72 75 63 74 20 76 78 77 6f 72 6b 73 46   struct vxworksF
4260: 69 6c 65 49 64 20 2a 70 43 61 6e 64 69 64 61 74  ileId *pCandidat
4270: 65 3b 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70  e;   /* For loop
4280: 69 6e 67 20 6f 76 65 72 20 65 78 69 73 74 69 6e  ing over existin
4290: 67 20 66 69 6c 65 20 49 44 73 20 2a 2f 0a 20 20  g file IDs */.  
42a0: 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20  int n;          
42b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
42c0: 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66      /* Length of
42d0: 20 7a 41 62 73 6f 6c 75 74 65 4e 61 6d 65 20 73   zAbsoluteName s
42e0: 74 72 69 6e 67 20 2a 2f 0a 0a 20 20 61 73 73 65  tring */..  asse
42f0: 72 74 28 20 7a 41 62 73 6f 6c 75 74 65 4e 61 6d  rt( zAbsoluteNam
4300: 65 5b 30 5d 3d 3d 27 2f 27 20 29 3b 0a 20 20 6e  e[0]=='/' );.  n
4310: 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a   = (int)strlen(z
4320: 41 62 73 6f 6c 75 74 65 4e 61 6d 65 29 3b 0a 20  AbsoluteName);. 
4330: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 5f   pNew = sqlite3_
4340: 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a  malloc( sizeof(*
4350: 70 4e 65 77 29 20 2b 20 28 6e 2b 31 29 20 29 3b  pNew) + (n+1) );
4360: 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29  .  if( pNew==0 )
4370: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65   return 0;.  pNe
4380: 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d  w->zCanonicalNam
4390: 65 20 3d 20 28 63 68 61 72 2a 29 26 70 4e 65 77  e = (char*)&pNew
43a0: 5b 31 5d 3b 0a 20 20 6d 65 6d 63 70 79 28 70 4e  [1];.  memcpy(pN
43b0: 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61  ew->zCanonicalNa
43c0: 6d 65 2c 20 7a 41 62 73 6f 6c 75 74 65 4e 61 6d  me, zAbsoluteNam
43d0: 65 2c 20 6e 2b 31 29 3b 0a 20 20 6e 20 3d 20 76  e, n+1);.  n = v
43e0: 78 77 6f 72 6b 73 53 69 6d 70 6c 69 66 79 4e 61  xworksSimplifyNa
43f0: 6d 65 28 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69  me(pNew->zCanoni
4400: 63 61 6c 4e 61 6d 65 2c 20 6e 29 3b 0a 0a 20 20  calName, n);..  
4410: 2f 2a 20 53 65 61 72 63 68 20 66 6f 72 20 61 6e  /* Search for an
4420: 20 65 78 69 73 74 69 6e 67 20 65 6e 74 72 79 20   existing entry 
4430: 74 68 61 74 20 6d 61 74 63 68 69 6e 67 20 74 68  that matching th
4440: 65 20 63 61 6e 6f 6e 69 63 61 6c 20 6e 61 6d 65  e canonical name
4450: 2e 0a 20 20 2a 2a 20 49 66 20 66 6f 75 6e 64 2c  ..  ** If found,
4460: 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 72   increment the r
4470: 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 61  eference count a
4480: 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  nd return a poin
4490: 74 65 72 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20  ter to.  ** the 
44a0: 65 78 69 73 74 69 6e 67 20 66 69 6c 65 20 49 44  existing file ID
44b0: 2e 0a 20 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74  ..  */.  unixEnt
44c0: 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 66 6f 72  erMutex();.  for
44d0: 28 70 43 61 6e 64 69 64 61 74 65 3d 76 78 77 6f  (pCandidate=vxwo
44e0: 72 6b 73 46 69 6c 65 4c 69 73 74 3b 20 70 43 61  rksFileList; pCa
44f0: 6e 64 69 64 61 74 65 3b 20 70 43 61 6e 64 69 64  ndidate; pCandid
4500: 61 74 65 3d 70 43 61 6e 64 69 64 61 74 65 2d 3e  ate=pCandidate->
4510: 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  pNext){.    if( 
4520: 70 43 61 6e 64 69 64 61 74 65 2d 3e 6e 4e 61 6d  pCandidate->nNam
4530: 65 3d 3d 6e 20 0a 20 20 20 20 20 26 26 20 6d 65  e==n .     && me
4540: 6d 63 6d 70 28 70 43 61 6e 64 69 64 61 74 65 2d  mcmp(pCandidate-
4550: 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65 2c  >zCanonicalName,
4560: 20 70 4e 65 77 2d 3e 7a 43 61 6e 6f 6e 69 63 61   pNew->zCanonica
4570: 6c 4e 61 6d 65 2c 20 6e 29 3d 3d 30 0a 20 20 20  lName, n)==0.   
4580: 20 29 7b 0a 20 20 20 20 20 20 20 73 71 6c 69 74   ){.       sqlit
4590: 65 33 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a 20  e3_free(pNew);. 
45a0: 20 20 20 20 20 20 70 43 61 6e 64 69 64 61 74 65        pCandidate
45b0: 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20  ->nRef++;.      
45c0: 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
45d0: 29 3b 0a 20 20 20 20 20 20 20 72 65 74 75 72 6e  );.       return
45e0: 20 70 43 61 6e 64 69 64 61 74 65 3b 0a 20 20 20   pCandidate;.   
45f0: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 20   }.  }..  /* No 
4600: 6d 61 74 63 68 20 77 61 73 20 66 6f 75 6e 64 2e  match was found.
4610: 20 20 57 65 20 77 69 6c 6c 20 6d 61 6b 65 20 61    We will make a
4620: 20 6e 65 77 20 66 69 6c 65 20 49 44 20 2a 2f 0a   new file ID */.
4630: 20 20 70 4e 65 77 2d 3e 6e 52 65 66 20 3d 20 31    pNew->nRef = 1
4640: 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4e 61 6d 65 20  ;.  pNew->nName 
4650: 3d 20 6e 3b 0a 20 20 70 4e 65 77 2d 3e 70 4e 65  = n;.  pNew->pNe
4660: 78 74 20 3d 20 76 78 77 6f 72 6b 73 46 69 6c 65  xt = vxworksFile
4670: 4c 69 73 74 3b 0a 20 20 76 78 77 6f 72 6b 73 46  List;.  vxworksF
4680: 69 6c 65 4c 69 73 74 20 3d 20 70 4e 65 77 3b 0a  ileList = pNew;.
4690: 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
46a0: 28 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65  ();.  return pNe
46b0: 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 72  w;.}../*.** Decr
46c0: 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72 65  ement the refere
46d0: 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20 61 20 76  nce count on a v
46e0: 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 6f 62 6a  xworksFileId obj
46f0: 65 63 74 2e 20 20 46 72 65 65 0a 2a 2a 20 74 68  ect.  Free.** th
4700: 65 20 6f 62 6a 65 63 74 20 77 68 65 6e 20 74 68  e object when th
4710: 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
4720: 74 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2e 0a  t reaches zero..
4730: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 76  */.static void v
4740: 78 77 6f 72 6b 73 52 65 6c 65 61 73 65 46 69 6c  xworksReleaseFil
4750: 65 49 64 28 73 74 72 75 63 74 20 76 78 77 6f 72  eId(struct vxwor
4760: 6b 73 46 69 6c 65 49 64 20 2a 70 49 64 29 7b 0a  ksFileId *pId){.
4770: 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
4780: 28 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49  ();.  assert( pI
4790: 64 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 70  d->nRef>0 );.  p
47a0: 49 64 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 69 66  Id->nRef--;.  if
47b0: 28 20 70 49 64 2d 3e 6e 52 65 66 3d 3d 30 20 29  ( pId->nRef==0 )
47c0: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 76 78 77  {.    struct vxw
47d0: 6f 72 6b 73 46 69 6c 65 49 64 20 2a 2a 70 70 3b  orksFileId **pp;
47e0: 0a 20 20 20 20 66 6f 72 28 70 70 3d 26 76 78 77  .    for(pp=&vxw
47f0: 6f 72 6b 73 46 69 6c 65 4c 69 73 74 3b 20 2a 70  orksFileList; *p
4800: 70 20 26 26 20 2a 70 70 21 3d 70 49 64 3b 20 70  p && *pp!=pId; p
4810: 70 20 3d 20 26 28 28 2a 70 70 29 2d 3e 70 4e 65  p = &((*pp)->pNe
4820: 78 74 29 29 7b 7d 0a 20 20 20 20 61 73 73 65 72  xt)){}.    asser
4830: 74 28 20 2a 70 70 3d 3d 70 49 64 20 29 3b 0a 20  t( *pp==pId );. 
4840: 20 20 20 2a 70 70 20 3d 20 70 49 64 2d 3e 70 4e     *pp = pId->pN
4850: 65 78 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ext;.    sqlite3
4860: 5f 66 72 65 65 28 70 49 64 29 3b 0a 20 20 7d 0a  _free(pId);.  }.
4870: 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78    unixLeaveMutex
4880: 28 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ();.}.#endif /* 
4890: 4f 53 5f 56 58 57 4f 52 4b 53 20 2a 2f 0a 2f 2a  OS_VXWORKS */./*
48a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45  ************** E
48b0: 6e 64 20 6f 66 20 55 6e 69 71 75 65 20 46 69 6c  nd of Unique Fil
48c0: 65 20 49 44 20 55 74 69 6c 69 74 79 20 55 73 65  e ID Utility Use
48d0: 64 20 42 79 20 56 78 57 6f 72 6b 73 20 2a 2a 2a  d By VxWorks ***
48e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
48f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4900: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4910: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4920: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4930: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a  ************/...
4940: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
4950: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4960: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4970: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
4980: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
4990: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
49a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 50 6f 73 69  *********** Posi
49b0: 78 20 41 64 76 69 73 6f 72 79 20 4c 6f 63 6b 69  x Advisory Locki
49c0: 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ng *************
49d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
49e0: 2a 2a 0a 2a 2a 20 50 4f 53 49 58 20 61 64 76 69  **.** POSIX advi
49f0: 73 6f 72 79 20 6c 6f 63 6b 73 20 61 72 65 20 62  sory locks are b
4a00: 72 6f 6b 65 6e 20 62 79 20 64 65 73 69 67 6e 2e  roken by design.
4a10: 20 20 41 4e 53 49 20 53 54 44 20 31 30 30 33 2e    ANSI STD 1003.
4a20: 31 20 28 31 39 39 36 29 0a 2a 2a 20 73 65 63 74  1 (1996).** sect
4a30: 69 6f 6e 20 36 2e 35 2e 32 2e 32 20 6c 69 6e 65  ion 6.5.2.2 line
4a40: 73 20 34 38 33 20 74 68 72 6f 75 67 68 20 34 39  s 483 through 49
4a50: 30 20 73 70 65 63 69 66 79 20 74 68 61 74 20 77  0 specify that w
4a60: 68 65 6e 20 61 20 70 72 6f 63 65 73 73 0a 2a 2a  hen a process.**
4a70: 20 73 65 74 73 20 6f 72 20 63 6c 65 61 72 73 20   sets or clears 
4a80: 61 20 6c 6f 63 6b 2c 20 74 68 61 74 20 6f 70 65  a lock, that ope
4a90: 72 61 74 69 6f 6e 20 6f 76 65 72 72 69 64 65 73  ration overrides
4aa0: 20 61 6e 79 20 70 72 69 6f 72 20 6c 6f 63 6b 73   any prior locks
4ab0: 20 73 65 74 0a 2a 2a 20 62 79 20 74 68 65 20 73   set.** by the s
4ac0: 61 6d 65 20 70 72 6f 63 65 73 73 2e 20 20 49 74  ame process.  It
4ad0: 20 64 6f 65 73 20 6e 6f 74 20 65 78 70 6c 69 63   does not explic
4ae0: 69 74 6c 79 20 73 61 79 20 73 6f 2c 20 62 75 74  itly say so, but
4af0: 20 74 68 69 73 20 69 6d 70 6c 69 65 73 0a 2a 2a   this implies.**
4b00: 20 74 68 61 74 20 69 74 20 6f 76 65 72 72 69 64   that it overrid
4b10: 65 73 20 6c 6f 63 6b 73 20 73 65 74 20 62 79 20  es locks set by 
4b20: 74 68 65 20 73 61 6d 65 20 70 72 6f 63 65 73 73  the same process
4b30: 20 75 73 69 6e 67 20 61 20 64 69 66 66 65 72 65   using a differe
4b40: 6e 74 0a 2a 2a 20 66 69 6c 65 20 64 65 73 63 72  nt.** file descr
4b50: 69 70 74 6f 72 2e 20 20 43 6f 6e 73 69 64 65 72  iptor.  Consider
4b60: 20 74 68 69 73 20 74 65 73 74 20 63 61 73 65 3a   this test case:
4b70: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 69 6e 74  .**.**       int
4b80: 20 66 64 31 20 3d 20 6f 70 65 6e 28 22 2e 2f 66   fd1 = open("./f
4b90: 69 6c 65 31 22 2c 20 4f 5f 52 44 57 52 7c 4f 5f  ile1", O_RDWR|O_
4ba0: 43 52 45 41 54 2c 20 30 36 34 34 29 3b 0a 2a 2a  CREAT, 0644);.**
4bb0: 20 20 20 20 20 20 20 69 6e 74 20 66 64 32 20 3d         int fd2 =
4bc0: 20 6f 70 65 6e 28 22 2e 2f 66 69 6c 65 32 22 2c   open("./file2",
4bd0: 20 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54 2c   O_RDWR|O_CREAT,
4be0: 20 30 36 34 34 29 3b 0a 2a 2a 0a 2a 2a 20 53 75   0644);.**.** Su
4bf0: 70 70 6f 73 65 20 2e 2f 66 69 6c 65 31 20 61 6e  ppose ./file1 an
4c00: 64 20 2e 2f 66 69 6c 65 32 20 61 72 65 20 72 65  d ./file2 are re
4c10: 61 6c 6c 79 20 74 68 65 20 73 61 6d 65 20 66 69  ally the same fi
4c20: 6c 65 20 28 62 65 63 61 75 73 65 0a 2a 2a 20 6f  le (because.** o
4c30: 6e 65 20 69 73 20 61 20 68 61 72 64 20 6f 72 20  ne is a hard or 
4c40: 73 79 6d 62 6f 6c 69 63 20 6c 69 6e 6b 20 74 6f  symbolic link to
4c50: 20 74 68 65 20 6f 74 68 65 72 29 20 74 68 65 6e   the other) then
4c60: 20 69 66 20 79 6f 75 20 73 65 74 0a 2a 2a 20 61   if you set.** a
4c70: 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
4c80: 20 6f 6e 20 66 64 31 2c 20 74 68 65 6e 20 74 72   on fd1, then tr
4c90: 79 20 74 6f 20 67 65 74 20 61 6e 20 65 78 63 6c  y to get an excl
4ca0: 75 73 69 76 65 20 6c 6f 63 6b 0a 2a 2a 20 6f 6e  usive lock.** on
4cb0: 20 66 64 32 2c 20 69 74 20 77 6f 72 6b 73 2e 20   fd2, it works. 
4cc0: 20 49 20 77 6f 75 6c 64 20 68 61 76 65 20 65 78   I would have ex
4cd0: 70 65 63 74 65 64 20 74 68 65 20 73 65 63 6f 6e  pected the secon
4ce0: 64 20 6c 6f 63 6b 20 74 6f 0a 2a 2a 20 66 61 69  d lock to.** fai
4cf0: 6c 20 73 69 6e 63 65 20 74 68 65 72 65 20 77 61  l since there wa
4d00: 73 20 61 6c 72 65 61 64 79 20 61 20 6c 6f 63 6b  s already a lock
4d10: 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 64 75 65   on the file due
4d20: 20 74 6f 20 66 64 31 2e 0a 2a 2a 20 42 75 74 20   to fd1..** But 
4d30: 6e 6f 74 20 73 6f 2e 20 20 53 69 6e 63 65 20 62  not so.  Since b
4d40: 6f 74 68 20 6c 6f 63 6b 73 20 63 61 6d 65 20 66  oth locks came f
4d50: 72 6f 6d 20 74 68 65 20 73 61 6d 65 20 70 72 6f  rom the same pro
4d60: 63 65 73 73 2c 20 74 68 65 0a 2a 2a 20 73 65 63  cess, the.** sec
4d70: 6f 6e 64 20 6f 76 65 72 72 69 64 65 73 20 74 68  ond overrides th
4d80: 65 20 66 69 72 73 74 2c 20 65 76 65 6e 20 74 68  e first, even th
4d90: 6f 75 67 68 20 74 68 65 79 20 77 65 72 65 20 6f  ough they were o
4da0: 6e 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 66  n different.** f
4db0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20  ile descriptors 
4dc0: 6f 70 65 6e 65 64 20 6f 6e 20 64 69 66 66 65 72  opened on differ
4dd0: 65 6e 74 20 66 69 6c 65 20 6e 61 6d 65 73 2e 0a  ent file names..
4de0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 6d 65 61 6e 73  **.** This means
4df0: 20 74 68 61 74 20 77 65 20 63 61 6e 6e 6f 74 20   that we cannot 
4e00: 75 73 65 20 50 4f 53 49 58 20 6c 6f 63 6b 73 20  use POSIX locks 
4e10: 74 6f 20 73 79 6e 63 68 72 6f 6e 69 7a 65 20 66  to synchronize f
4e20: 69 6c 65 20 61 63 63 65 73 73 0a 2a 2a 20 61 6d  ile access.** am
4e30: 6f 6e 67 20 63 6f 6d 70 65 74 69 6e 67 20 74 68  ong competing th
4e40: 72 65 61 64 73 20 6f 66 20 74 68 65 20 73 61 6d  reads of the sam
4e50: 65 20 70 72 6f 63 65 73 73 2e 20 20 50 4f 53 49  e process.  POSI
4e60: 58 20 6c 6f 63 6b 73 20 77 69 6c 6c 20 77 6f 72  X locks will wor
4e70: 6b 20 66 69 6e 65 0a 2a 2a 20 74 6f 20 73 79 6e  k fine.** to syn
4e80: 63 68 72 6f 6e 69 7a 65 20 61 63 63 65 73 73 20  chronize access 
4e90: 66 6f 72 20 74 68 72 65 61 64 73 20 69 6e 20 73  for threads in s
4ea0: 65 70 61 72 61 74 65 20 70 72 6f 63 65 73 73 65  eparate processe
4eb0: 73 2c 20 62 75 74 20 6e 6f 74 0a 2a 2a 20 74 68  s, but not.** th
4ec0: 72 65 61 64 73 20 77 69 74 68 69 6e 20 74 68 65  reads within the
4ed0: 20 73 61 6d 65 20 70 72 6f 63 65 73 73 2e 0a 2a   same process..*
4ee0: 2a 0a 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72 6f  *.** To work aro
4ef0: 75 6e 64 20 74 68 65 20 70 72 6f 62 6c 65 6d 2c  und the problem,
4f00: 20 53 51 4c 69 74 65 20 68 61 73 20 74 6f 20 6d   SQLite has to m
4f10: 61 6e 61 67 65 20 66 69 6c 65 20 6c 6f 63 6b 73  anage file locks
4f20: 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 6f   internally.** o
4f30: 6e 20 69 74 73 20 6f 77 6e 2e 20 20 57 68 65 6e  n its own.  When
4f40: 65 76 65 72 20 61 20 6e 65 77 20 64 61 74 61 62  ever a new datab
4f50: 61 73 65 20 69 73 20 6f 70 65 6e 65 64 2c 20 77  ase is opened, w
4f60: 65 20 68 61 76 65 20 74 6f 20 66 69 6e 64 20 74  e have to find t
4f70: 68 65 0a 2a 2a 20 73 70 65 63 69 66 69 63 20 69  he.** specific i
4f80: 6e 6f 64 65 20 6f 66 20 74 68 65 20 64 61 74 61  node of the data
4f90: 62 61 73 65 20 66 69 6c 65 20 28 74 68 65 20 69  base file (the i
4fa0: 6e 6f 64 65 20 69 73 20 64 65 74 65 72 6d 69 6e  node is determin
4fb0: 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 73 74 5f  ed by the.** st_
4fc0: 64 65 76 20 61 6e 64 20 73 74 5f 69 6e 6f 20 66  dev and st_ino f
4fd0: 69 65 6c 64 73 20 6f 66 20 74 68 65 20 73 74 61  ields of the sta
4fe0: 74 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  t structure that
4ff0: 20 66 73 74 61 74 28 29 20 66 69 6c 6c 73 20 69   fstat() fills i
5000: 6e 29 0a 2a 2a 20 61 6e 64 20 63 68 65 63 6b 20  n).** and check 
5010: 66 6f 72 20 6c 6f 63 6b 73 20 61 6c 72 65 61 64  for locks alread
5020: 79 20 65 78 69 73 74 69 6e 67 20 6f 6e 20 74 68  y existing on th
5030: 61 74 20 69 6e 6f 64 65 2e 20 20 57 68 65 6e 20  at inode.  When 
5040: 6c 6f 63 6b 73 20 61 72 65 0a 2a 2a 20 63 72 65  locks are.** cre
5050: 61 74 65 64 20 6f 72 20 72 65 6d 6f 76 65 64 2c  ated or removed,
5060: 20 77 65 20 68 61 76 65 20 74 6f 20 6c 6f 6f 6b   we have to look
5070: 20 61 74 20 6f 75 72 20 6f 77 6e 20 69 6e 74 65   at our own inte
5080: 72 6e 61 6c 20 72 65 63 6f 72 64 20 6f 66 20 74  rnal record of t
5090: 68 65 0a 2a 2a 20 6c 6f 63 6b 73 20 74 6f 20 73  he.** locks to s
50a0: 65 65 20 69 66 20 61 6e 6f 74 68 65 72 20 74 68  ee if another th
50b0: 72 65 61 64 20 68 61 73 20 70 72 65 76 69 6f 75  read has previou
50c0: 73 6c 79 20 73 65 74 20 61 20 6c 6f 63 6b 20 6f  sly set a lock o
50d0: 6e 20 74 68 61 74 20 73 61 6d 65 0a 2a 2a 20 69  n that same.** i
50e0: 6e 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 28 41 73 69  node..**.** (Asi
50f0: 64 65 3a 20 54 68 65 20 75 73 65 20 6f 66 20 69  de: The use of i
5100: 6e 6f 64 65 20 6e 75 6d 62 65 72 73 20 61 73 20  node numbers as 
5110: 75 6e 69 71 75 65 20 49 44 73 20 64 6f 65 73 20  unique IDs does 
5120: 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 56 78 57 6f  not work on VxWo
5130: 72 6b 73 2e 0a 2a 2a 20 46 6f 72 20 56 78 57 6f  rks..** For VxWo
5140: 72 6b 73 2c 20 77 65 20 68 61 76 65 20 74 6f 20  rks, we have to 
5150: 75 73 65 20 74 68 65 20 61 6c 74 65 72 6e 61 74  use the alternat
5160: 69 76 65 20 75 6e 69 71 75 65 20 49 44 20 73 79  ive unique ID sy
5170: 73 74 65 6d 20 62 61 73 65 64 20 6f 6e 0a 2a 2a  stem based on.**
5180: 20 63 61 6e 6f 6e 69 63 61 6c 20 66 69 6c 65 6e   canonical filen
5190: 61 6d 65 20 61 6e 64 20 69 6d 70 6c 65 6d 65 6e  ame and implemen
51a0: 74 65 64 20 69 6e 20 74 68 65 20 70 72 65 76 69  ted in the previ
51b0: 6f 75 73 20 64 69 76 69 73 69 6f 6e 2e 29 0a 2a  ous division.).*
51c0: 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33  *.** The sqlite3
51d0: 5f 66 69 6c 65 20 73 74 72 75 63 74 75 72 65 20  _file structure 
51e0: 66 6f 72 20 50 4f 53 49 58 20 69 73 20 6e 6f 20  for POSIX is no 
51f0: 6c 6f 6e 67 65 72 20 6a 75 73 74 20 61 6e 20 69  longer just an i
5200: 6e 74 65 67 65 72 20 66 69 6c 65 0a 2a 2a 20 64  nteger file.** d
5210: 65 73 63 72 69 70 74 6f 72 2e 20 20 49 74 20 69  escriptor.  It i
5220: 73 20 6e 6f 77 20 61 20 73 74 72 75 63 74 75 72  s now a structur
5230: 65 20 74 68 61 74 20 68 6f 6c 64 73 20 74 68 65  e that holds the
5240: 20 69 6e 74 65 67 65 72 20 66 69 6c 65 0a 2a 2a   integer file.**
5250: 20 64 65 73 63 72 69 70 74 6f 72 20 61 6e 64 20   descriptor and 
5260: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73  a pointer to a s
5270: 74 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65  tructure that de
5280: 73 63 72 69 62 65 73 20 74 68 65 20 69 6e 74 65  scribes the inte
5290: 72 6e 61 6c 0a 2a 2a 20 6c 6f 63 6b 73 20 6f 6e  rnal.** locks on
52a0: 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
52b0: 6e 67 20 69 6e 6f 64 65 2e 20 20 54 68 65 72 65  ng inode.  There
52c0: 20 69 73 20 6f 6e 65 20 6c 6f 63 6b 69 6e 67 20   is one locking 
52d0: 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 70 65 72  structure.** per
52e0: 20 69 6e 6f 64 65 2c 20 73 6f 20 69 66 20 74 68   inode, so if th
52f0: 65 20 73 61 6d 65 20 69 6e 6f 64 65 20 69 73 20  e same inode is 
5300: 6f 70 65 6e 65 64 20 74 77 69 63 65 2c 20 62 6f  opened twice, bo
5310: 74 68 20 75 6e 69 78 46 69 6c 65 20 73 74 72 75  th unixFile stru
5320: 63 74 75 72 65 73 0a 2a 2a 20 70 6f 69 6e 74 20  ctures.** point 
5330: 74 6f 20 74 68 65 20 73 61 6d 65 20 6c 6f 63 6b  to the same lock
5340: 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 20 20  ing structure.  
5350: 54 68 65 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75  The locking stru
5360: 63 74 75 72 65 20 6b 65 65 70 73 0a 2a 2a 20 61  cture keeps.** a
5370: 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
5380: 20 28 73 6f 20 77 65 20 77 69 6c 6c 20 6b 6e 6f   (so we will kno
5390: 77 20 77 68 65 6e 20 74 6f 20 64 65 6c 65 74 65  w when to delete
53a0: 20 69 74 29 20 61 6e 64 20 61 20 22 63 6e 74 22   it) and a "cnt"
53b0: 0a 2a 2a 20 66 69 65 6c 64 20 74 68 61 74 20 74  .** field that t
53c0: 65 6c 6c 73 20 75 73 20 69 74 73 20 69 6e 74 65  ells us its inte
53d0: 72 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 75 73  rnal lock status
53e0: 2e 20 20 63 6e 74 3d 3d 30 20 6d 65 61 6e 73 20  .  cnt==0 means 
53f0: 74 68 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20 75  the.** file is u
5400: 6e 6c 6f 63 6b 65 64 2e 20 20 63 6e 74 3d 3d 2d  nlocked.  cnt==-
5410: 31 20 6d 65 61 6e 73 20 74 68 65 20 66 69 6c 65  1 means the file
5420: 20 68 61 73 20 61 6e 20 65 78 63 6c 75 73 69 76   has an exclusiv
5430: 65 20 6c 6f 63 6b 2e 0a 2a 2a 20 63 6e 74 3e 30  e lock..** cnt>0
5440: 20 6d 65 61 6e 73 20 74 68 65 72 65 20 61 72 65   means there are
5450: 20 63 6e 74 20 73 68 61 72 65 64 20 6c 6f 63 6b   cnt shared lock
5460: 73 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e 0a 2a  s on the file..*
5470: 2a 0a 2a 2a 20 41 6e 79 20 61 74 74 65 6d 70 74  *.** Any attempt
5480: 20 74 6f 20 6c 6f 63 6b 20 6f 72 20 75 6e 6c 6f   to lock or unlo
5490: 63 6b 20 61 20 66 69 6c 65 20 66 69 72 73 74 20  ck a file first 
54a0: 63 68 65 63 6b 73 20 74 68 65 20 6c 6f 63 6b 69  checks the locki
54b0: 6e 67 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2e  ng.** structure.
54c0: 20 20 54 68 65 20 66 63 6e 74 6c 28 29 20 73 79    The fcntl() sy
54d0: 73 74 65 6d 20 63 61 6c 6c 20 69 73 20 6f 6e 6c  stem call is onl
54e0: 79 20 69 6e 76 6f 6b 65 64 20 74 6f 20 73 65 74  y invoked to set
54f0: 20 61 20 0a 2a 2a 20 50 4f 53 49 58 20 6c 6f 63   a .** POSIX loc
5500: 6b 20 69 66 20 74 68 65 20 69 6e 74 65 72 6e 61  k if the interna
5510: 6c 20 6c 6f 63 6b 20 73 74 72 75 63 74 75 72 65  l lock structure
5520: 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 62 65 74   transitions bet
5530: 77 65 65 6e 0a 2a 2a 20 61 20 6c 6f 63 6b 65 64  ween.** a locked
5540: 20 61 6e 64 20 61 6e 20 75 6e 6c 6f 63 6b 65 64   and an unlocked
5550: 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 42 75   state..**.** Bu
5560: 74 20 77 61 69 74 3a 20 20 74 68 65 72 65 20 61  t wait:  there a
5570: 72 65 20 79 65 74 20 6d 6f 72 65 20 70 72 6f 62  re yet more prob
5580: 6c 65 6d 73 20 77 69 74 68 20 50 4f 53 49 58 20  lems with POSIX 
5590: 61 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 2e 0a  advisory locks..
55a0: 2a 2a 0a 2a 2a 20 49 66 20 79 6f 75 20 63 6c 6f  **.** If you clo
55b0: 73 65 20 61 20 66 69 6c 65 20 64 65 73 63 72 69  se a file descri
55c0: 70 74 6f 72 20 74 68 61 74 20 70 6f 69 6e 74 73  ptor that points
55d0: 20 74 6f 20 61 20 66 69 6c 65 20 74 68 61 74 20   to a file that 
55e0: 68 61 73 20 6c 6f 63 6b 73 2c 0a 2a 2a 20 61 6c  has locks,.** al
55f0: 6c 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 61 74 20  l locks on that 
5600: 66 69 6c 65 20 74 68 61 74 20 61 72 65 20 6f 77  file that are ow
5610: 6e 65 64 20 62 79 20 74 68 65 20 63 75 72 72 65  ned by the curre
5620: 6e 74 20 70 72 6f 63 65 73 73 20 61 72 65 0a 2a  nt process are.*
5630: 2a 20 72 65 6c 65 61 73 65 64 2e 20 20 54 6f 20  * released.  To 
5640: 77 6f 72 6b 20 61 72 6f 75 6e 64 20 74 68 69 73  work around this
5650: 20 70 72 6f 62 6c 65 6d 2c 20 65 61 63 68 20 75   problem, each u
5660: 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a  nixInodeInfo obj
5670: 65 63 74 0a 2a 2a 20 6d 61 69 6e 74 61 69 6e 73  ect.** maintains
5680: 20 61 20 63 6f 75 6e 74 20 6f 66 20 74 68 65 20   a count of the 
5690: 6e 75 6d 62 65 72 20 6f 66 20 70 65 6e 64 69 6e  number of pendin
56a0: 67 20 6c 6f 63 6b 73 20 6f 6e 20 74 68 61 20 69  g locks on tha i
56b0: 6e 6f 64 65 2e 0a 2a 2a 20 57 68 65 6e 20 61 6e  node..** When an
56c0: 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65   attempt is made
56d0: 20 74 6f 20 63 6c 6f 73 65 20 61 6e 20 75 6e 69   to close an uni
56e0: 78 46 69 6c 65 2c 20 69 66 20 74 68 65 72 65 20  xFile, if there 
56f0: 61 72 65 0a 2a 2a 20 6f 74 68 65 72 20 75 6e 69  are.** other uni
5700: 78 46 69 6c 65 20 6f 70 65 6e 20 6f 6e 20 74 68  xFile open on th
5710: 65 20 73 61 6d 65 20 69 6e 6f 64 65 20 74 68 61  e same inode tha
5720: 74 20 61 72 65 20 68 6f 6c 64 69 6e 67 20 6c 6f  t are holding lo
5730: 63 6b 73 2c 20 74 68 65 20 63 61 6c 6c 0a 2a 2a  cks, the call.**
5740: 20 74 6f 20 63 6c 6f 73 65 28 29 20 74 68 65 20   to close() the 
5750: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
5760: 69 73 20 64 65 66 65 72 72 65 64 20 75 6e 74 69  is deferred unti
5770: 6c 20 61 6c 6c 20 6f 66 20 74 68 65 20 6c 6f 63  l all of the loc
5780: 6b 73 20 63 6c 65 61 72 2e 0a 2a 2a 20 54 68 65  ks clear..** The
5790: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 73   unixInodeInfo s
57a0: 74 72 75 63 74 75 72 65 20 6b 65 65 70 73 20 61  tructure keeps a
57b0: 20 6c 69 73 74 20 6f 66 20 66 69 6c 65 20 64 65   list of file de
57c0: 73 63 72 69 70 74 6f 72 73 20 74 68 61 74 20 6e  scriptors that n
57d0: 65 65 64 20 74 6f 0a 2a 2a 20 62 65 20 63 6c 6f  eed to.** be clo
57e0: 73 65 64 20 61 6e 64 20 74 68 61 74 20 6c 69 73  sed and that lis
57f0: 74 20 69 73 20 77 61 6c 6b 65 64 20 28 61 6e 64  t is walked (and
5800: 20 63 6c 65 61 72 65 64 29 20 77 68 65 6e 20 74   cleared) when t
5810: 68 65 20 6c 61 73 74 20 6c 6f 63 6b 0a 2a 2a 20  he last lock.** 
5820: 63 6c 65 61 72 73 2e 0a 2a 2a 0a 2a 2a 20 59 65  clears..**.** Ye
5830: 74 20 61 6e 6f 74 68 65 72 20 70 72 6f 62 6c 65  t another proble
5840: 6d 3a 20 20 4c 69 6e 75 78 54 68 72 65 61 64 73  m:  LinuxThreads
5850: 20 64 6f 20 6e 6f 74 20 70 6c 61 79 20 77 65 6c   do not play wel
5860: 6c 20 77 69 74 68 20 70 6f 73 69 78 20 6c 6f 63  l with posix loc
5870: 6b 73 2e 0a 2a 2a 0a 2a 2a 20 4d 61 6e 79 20 6f  ks..**.** Many o
5880: 6c 64 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66  lder versions of
5890: 20 6c 69 6e 75 78 20 75 73 65 20 74 68 65 20 4c   linux use the L
58a0: 69 6e 75 78 54 68 72 65 61 64 73 20 6c 69 62 72  inuxThreads libr
58b0: 61 72 79 20 77 68 69 63 68 20 69 73 0a 2a 2a 20  ary which is.** 
58c0: 6e 6f 74 20 70 6f 73 69 78 20 63 6f 6d 70 6c 69  not posix compli
58d0: 61 6e 74 2e 20 20 55 6e 64 65 72 20 4c 69 6e 75  ant.  Under Linu
58e0: 78 54 68 72 65 61 64 73 2c 20 61 20 6c 6f 63 6b  xThreads, a lock
58f0: 20 63 72 65 61 74 65 64 20 62 79 20 74 68 72 65   created by thre
5900: 61 64 0a 2a 2a 20 41 20 63 61 6e 6e 6f 74 20 62  ad.** A cannot b
5910: 65 20 6d 6f 64 69 66 69 65 64 20 6f 72 20 6f 76  e modified or ov
5920: 65 72 72 69 64 64 65 6e 20 62 79 20 61 20 64 69  erridden by a di
5930: 66 66 65 72 65 6e 74 20 74 68 72 65 61 64 20 42  fferent thread B
5940: 2e 0a 2a 2a 20 4f 6e 6c 79 20 74 68 72 65 61 64  ..** Only thread
5950: 20 41 20 63 61 6e 20 6d 6f 64 69 66 79 20 74 68   A can modify th
5960: 65 20 6c 6f 63 6b 2e 20 20 4c 6f 63 6b 69 6e 67  e lock.  Locking
5970: 20 62 65 68 61 76 69 6f 72 20 69 73 20 63 6f 72   behavior is cor
5980: 72 65 63 74 0a 2a 2a 20 69 66 20 74 68 65 20 61  rect.** if the a
5990: 70 70 6c 69 61 74 69 6f 6e 20 75 73 65 73 20 74  ppliation uses t
59a0: 68 65 20 6e 65 77 65 72 20 4e 61 74 69 76 65 20  he newer Native 
59b0: 50 6f 73 69 78 20 54 68 72 65 61 64 20 4c 69 62  Posix Thread Lib
59c0: 72 61 72 79 20 28 4e 50 54 4c 29 0a 2a 2a 20 6f  rary (NPTL).** o
59d0: 6e 20 6c 69 6e 75 78 20 2d 20 77 69 74 68 20 4e  n linux - with N
59e0: 50 54 4c 20 61 20 6c 6f 63 6b 20 63 72 65 61 74  PTL a lock creat
59f0: 65 64 20 62 79 20 74 68 72 65 61 64 20 41 20 63  ed by thread A c
5a00: 61 6e 20 6f 76 65 72 72 69 64 65 20 6c 6f 63 6b  an override lock
5a10: 73 0a 2a 2a 20 69 6e 20 74 68 72 65 61 64 20 42  s.** in thread B
5a20: 2e 20 20 42 75 74 20 74 68 65 72 65 20 69 73 20  .  But there is 
5a30: 6e 6f 20 77 61 79 20 74 6f 20 6b 6e 6f 77 20 61  no way to know a
5a40: 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 77  t compile-time w
5a50: 68 69 63 68 0a 2a 2a 20 74 68 72 65 61 64 69 6e  hich.** threadin
5a60: 67 20 6c 69 62 72 61 72 79 20 69 73 20 62 65 69  g library is bei
5a70: 6e 67 20 75 73 65 64 2e 20 20 53 6f 20 74 68 65  ng used.  So the
5a80: 72 65 20 69 73 20 6e 6f 20 77 61 79 20 74 6f 20  re is no way to 
5a90: 6b 6e 6f 77 20 61 74 0a 2a 2a 20 63 6f 6d 70 69  know at.** compi
5aa0: 6c 65 2d 74 69 6d 65 20 77 68 65 74 68 65 72 20  le-time whether 
5ab0: 6f 72 20 6e 6f 74 20 74 68 72 65 61 64 20 41 20  or not thread A 
5ac0: 63 61 6e 20 6f 76 65 72 72 69 64 65 20 6c 6f 63  can override loc
5ad0: 6b 73 20 6f 6e 20 74 68 72 65 61 64 20 42 2e 0a  ks on thread B..
5ae0: 2a 2a 20 4f 6e 65 20 68 61 73 20 74 6f 20 64 6f  ** One has to do
5af0: 20 61 20 72 75 6e 2d 74 69 6d 65 20 63 68 65 63   a run-time chec
5b00: 6b 20 74 6f 20 64 69 73 63 6f 76 65 72 20 74 68  k to discover th
5b10: 65 20 62 65 68 61 76 69 6f 72 20 6f 66 20 74 68  e behavior of th
5b20: 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 70 72 6f  e.** current pro
5b30: 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69  cess..**.** SQLi
5b40: 74 65 20 75 73 65 64 20 74 6f 20 73 75 70 70 6f  te used to suppo
5b50: 72 74 20 4c 69 6e 75 78 54 68 72 65 61 64 73 2e  rt LinuxThreads.
5b60: 20 20 42 75 74 20 73 75 70 70 6f 72 74 20 66 6f    But support fo
5b70: 72 20 4c 69 6e 75 78 54 68 72 65 61 64 73 0a 2a  r LinuxThreads.*
5b80: 2a 20 77 61 73 20 64 72 6f 70 70 65 64 20 62 65  * was dropped be
5b90: 67 69 6e 6e 69 6e 67 20 77 69 74 68 20 76 65 72  ginning with ver
5ba0: 73 69 6f 6e 20 33 2e 37 2e 30 2e 20 20 53 51 4c  sion 3.7.0.  SQL
5bb0: 69 74 65 20 77 69 6c 6c 20 73 74 69 6c 6c 20 77  ite will still w
5bc0: 6f 72 6b 20 77 69 74 68 0a 2a 2a 20 4c 69 6e 75  ork with.** Linu
5bd0: 78 54 68 72 65 61 64 73 20 70 72 6f 76 69 64 65  xThreads provide
5be0: 64 20 74 68 61 74 20 28 31 29 20 74 68 65 72 65  d that (1) there
5bf0: 20 69 73 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e   is no more than
5c00: 20 6f 6e 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   one connection 
5c10: 0a 2a 2a 20 70 65 72 20 64 61 74 61 62 61 73 65  .** per database
5c20: 20 66 69 6c 65 20 69 6e 20 74 68 65 20 73 61 6d   file in the sam
5c30: 65 20 70 72 6f 63 65 73 73 20 61 6e 64 20 28 32  e process and (2
5c40: 29 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  ) database conne
5c50: 63 74 69 6f 6e 73 0a 2a 2a 20 64 6f 20 6e 6f 74  ctions.** do not
5c60: 20 6d 6f 76 65 20 61 63 72 6f 73 73 20 74 68 72   move across thr
5c70: 65 61 64 73 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  eads..*/../*.** 
5c80: 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  An instance of t
5c90: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
5ca0: 75 63 74 75 72 65 20 73 65 72 76 65 73 20 61 73  ucture serves as
5cb0: 20 74 68 65 20 6b 65 79 20 75 73 65 64 0a 2a 2a   the key used.**
5cc0: 20 74 6f 20 6c 6f 63 61 74 65 20 61 20 70 61 72   to locate a par
5cd0: 74 69 63 75 6c 61 72 20 75 6e 69 78 49 6e 6f 64  ticular unixInod
5ce0: 65 49 6e 66 6f 20 6f 62 6a 65 63 74 2e 0a 2a 2f  eInfo object..*/
5cf0: 0a 73 74 72 75 63 74 20 75 6e 69 78 46 69 6c 65  .struct unixFile
5d00: 49 64 20 7b 0a 20 20 64 65 76 5f 74 20 64 65 76  Id {.  dev_t dev
5d10: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
5d20: 20 20 20 2f 2a 20 44 65 76 69 63 65 20 6e 75 6d     /* Device num
5d30: 62 65 72 20 2a 2f 0a 23 69 66 20 4f 53 5f 56 58  ber */.#if OS_VX
5d40: 57 4f 52 4b 53 0a 20 20 73 74 72 75 63 74 20 76  WORKS.  struct v
5d50: 78 77 6f 72 6b 73 46 69 6c 65 49 64 20 2a 70 49  xworksFileId *pI
5d60: 64 3b 20 20 2f 2a 20 55 6e 69 71 75 65 20 66 69  d;  /* Unique fi
5d70: 6c 65 20 49 44 20 66 6f 72 20 76 78 77 6f 72 6b  le ID for vxwork
5d80: 73 2e 20 2a 2f 0a 23 65 6c 73 65 0a 20 20 69 6e  s. */.#else.  in
5d90: 6f 5f 74 20 69 6e 6f 3b 20 20 20 20 20 20 20 20  o_t ino;        
5da0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 6f            /* Ino
5db0: 64 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 23 65 6e  de number */.#en
5dc0: 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6e  dif.};../*.** An
5dd0: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
5de0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
5df0: 74 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74 65  ture is allocate
5e00: 64 20 66 6f 72 20 65 61 63 68 20 6f 70 65 6e 0a  d for each open.
5e10: 2a 2a 20 69 6e 6f 64 65 2e 20 20 4f 72 2c 20 6f  ** inode.  Or, o
5e20: 6e 20 4c 69 6e 75 78 54 68 72 65 61 64 73 2c 20  n LinuxThreads, 
5e30: 74 68 65 72 65 20 69 73 20 6f 6e 65 20 6f 66 20  there is one of 
5e40: 74 68 65 73 65 20 73 74 72 75 63 74 75 72 65 73  these structures
5e50: 20 66 6f 72 0a 2a 2a 20 65 61 63 68 20 69 6e 6f   for.** each ino
5e60: 64 65 20 6f 70 65 6e 65 64 20 62 79 20 65 61 63  de opened by eac
5e70: 68 20 74 68 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20  h thread..**.** 
5e80: 41 20 73 69 6e 67 6c 65 20 69 6e 6f 64 65 20 63  A single inode c
5e90: 61 6e 20 68 61 76 65 20 6d 75 6c 74 69 70 6c 65  an have multiple
5ea0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
5eb0: 73 2c 20 73 6f 20 65 61 63 68 20 75 6e 69 78 46  s, so each unixF
5ec0: 69 6c 65 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  ile.** structure
5ed0: 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e   contains a poin
5ee0: 74 65 72 20 74 6f 20 61 6e 20 69 6e 73 74 61 6e  ter to an instan
5ef0: 63 65 20 6f 66 20 74 68 69 73 20 6f 62 6a 65 63  ce of this objec
5f00: 74 20 61 6e 64 20 74 68 69 73 0a 2a 2a 20 6f 62  t and this.** ob
5f10: 6a 65 63 74 20 6b 65 65 70 73 20 61 20 63 6f 75  ject keeps a cou
5f20: 6e 74 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72  nt of the number
5f30: 20 6f 66 20 75 6e 69 78 46 69 6c 65 20 70 6f 69   of unixFile poi
5f40: 6e 74 69 6e 67 20 74 6f 20 69 74 2e 0a 2a 2f 0a  nting to it..*/.
5f50: 73 74 72 75 63 74 20 75 6e 69 78 49 6e 6f 64 65  struct unixInode
5f60: 49 6e 66 6f 20 7b 0a 20 20 73 74 72 75 63 74 20  Info {.  struct 
5f70: 75 6e 69 78 46 69 6c 65 49 64 20 66 69 6c 65 49  unixFileId fileI
5f80: 64 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  d;       /* The 
5f90: 6c 6f 6f 6b 75 70 20 6b 65 79 20 2a 2f 0a 20 20  lookup key */.  
5fa0: 69 6e 74 20 6e 53 68 61 72 65 64 3b 20 20 20 20  int nShared;    
5fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5fc0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 53 48 41  /* Number of SHA
5fd0: 52 45 44 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a  RED locks held *
5fe0: 2f 0a 20 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63  /.  int eFileLoc
5ff0: 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
6000: 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 53 48      /* One of SH
6010: 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45 53 45 52  ARED_LOCK, RESER
6020: 56 45 44 5f 4c 4f 43 4b 20 65 74 63 2e 20 2a 2f  VED_LOCK etc. */
6030: 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20  .  int nRef;    
6040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6050: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
6060: 70 6f 69 6e 74 65 72 73 20 74 6f 20 74 68 69 73  pointers to this
6070: 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 23 69   structure */.#i
6080: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
6090: 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
60a0: 53 54 59 4c 45 29 0a 20 20 75 6e 73 69 67 6e 65  STYLE).  unsigne
60b0: 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 73 68 61 72  d long long shar
60c0: 65 64 42 79 74 65 3b 20 20 2f 2a 20 66 6f 72 20  edByte;  /* for 
60d0: 41 46 50 20 73 69 6d 75 6c 61 74 65 64 20 73 68  AFP simulated sh
60e0: 61 72 65 64 20 6c 6f 63 6b 20 2a 2f 0a 23 65 6e  ared lock */.#en
60f0: 64 69 66 0a 20 20 69 6e 74 20 6e 4c 6f 63 6b 3b  dif.  int nLock;
6100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6110: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
6120: 6f 66 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 66  of outstanding f
6130: 69 6c 65 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 55  ile locks */.  U
6140: 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70 55 6e  nixUnusedFd *pUn
6150: 75 73 65 64 3b 20 20 20 20 20 20 20 20 20 20 2f  used;          /
6160: 2a 20 55 6e 75 73 65 64 20 66 69 6c 65 20 64 65  * Unused file de
6170: 73 63 72 69 70 74 6f 72 73 20 74 6f 20 63 6c 6f  scriptors to clo
6180: 73 65 20 2a 2f 0a 23 69 66 20 4f 53 5f 56 58 57  se */.#if OS_VXW
6190: 4f 52 4b 53 0a 20 20 73 65 6d 5f 74 20 2a 70 53  ORKS.  sem_t *pS
61a0: 65 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  em;             
61b0: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 64 20         /* Named 
61c0: 50 4f 53 49 58 20 73 65 6d 61 70 68 6f 72 65 20  POSIX semaphore 
61d0: 2a 2f 0a 20 20 63 68 61 72 20 61 53 65 6d 4e 61  */.  char aSemNa
61e0: 6d 65 5b 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b  me[MAX_PATHNAME+
61f0: 32 5d 3b 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20  2];  /* Name of 
6200: 74 68 61 74 20 73 65 6d 61 70 68 6f 72 65 20 2a  that semaphore *
6210: 2f 0a 23 65 6e 64 69 66 0a 20 20 73 74 72 75 63  /.#endif.  struc
6220: 74 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20  t unixInodeInfo 
6230: 2a 70 4e 65 78 74 3b 20 20 20 20 2f 2a 20 4c 69  *pNext;    /* Li
6240: 73 74 20 6f 66 20 61 6c 6c 20 75 6e 69 78 49 6e  st of all unixIn
6250: 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 73 20  odeInfo objects 
6260: 2a 2f 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78  */.  struct unix
6270: 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 50 72 65 76  InodeInfo *pPrev
6280: 3b 20 20 20 20 2f 2a 20 20 20 20 2e 2e 2e 2e 20  ;    /*    .... 
6290: 64 6f 75 62 6c 79 20 6c 69 6e 6b 65 64 20 2a 2f  doubly linked */
62a0: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 6c 69 73  .};../*.** A lis
62b0: 74 73 20 6f 66 20 61 6c 6c 20 75 6e 69 78 49 6e  ts of all unixIn
62c0: 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74 73 2e  odeInfo objects.
62d0: 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63  .*/.static struc
62e0: 74 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20  t unixInodeInfo 
62f0: 2a 69 6e 6f 64 65 4c 69 73 74 20 3d 20 30 3b 0a  *inodeList = 0;.
6300: 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61  ./*.** Release a
6310: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 73   unixInodeInfo s
6320: 74 72 75 63 74 75 72 65 20 70 72 65 76 69 6f 75  tructure previou
6330: 73 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 62 79  sly allocated by
6340: 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29   findInodeInfo()
6350: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 75 74 65  ..**.** The mute
6360: 78 20 65 6e 74 65 72 65 64 20 75 73 69 6e 67 20  x entered using 
6370: 74 68 65 20 75 6e 69 78 45 6e 74 65 72 4d 75 74  the unixEnterMut
6380: 65 78 28 29 20 66 75 6e 63 74 69 6f 6e 20 6d 75  ex() function mu
6390: 73 74 20 62 65 20 68 65 6c 64 0a 2a 2a 20 77 68  st be held.** wh
63a0: 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
63b0: 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73   is called..*/.s
63c0: 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61  tatic void relea
63d0: 73 65 49 6e 6f 64 65 49 6e 66 6f 28 73 74 72 75  seInodeInfo(stru
63e0: 63 74 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  ct unixInodeInfo
63f0: 20 2a 70 49 6e 6f 64 65 29 7b 0a 20 20 61 73 73   *pInode){.  ass
6400: 65 72 74 28 20 75 6e 69 78 4d 75 74 65 78 48 65  ert( unixMutexHe
6410: 6c 64 28 29 20 29 3b 0a 20 20 69 66 28 20 70 49  ld() );.  if( pI
6420: 6e 6f 64 65 20 29 7b 0a 20 20 20 20 70 49 6e 6f  node ){.    pIno
6430: 64 65 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20  de->nRef--;.    
6440: 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 52 65 66  if( pInode->nRef
6450: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==0 ){.      if(
6460: 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76 20 29   pInode->pPrev )
6470: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
6480: 28 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76 2d  ( pInode->pPrev-
6490: 3e 70 4e 65 78 74 3d 3d 70 49 6e 6f 64 65 20 29  >pNext==pInode )
64a0: 3b 0a 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65  ;.        pInode
64b0: 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d  ->pPrev->pNext =
64c0: 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a   pInode->pNext;.
64d0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
64e0: 20 20 20 20 20 61 73 73 65 72 74 28 20 69 6e 6f       assert( ino
64f0: 64 65 4c 69 73 74 3d 3d 70 49 6e 6f 64 65 20 29  deList==pInode )
6500: 3b 0a 20 20 20 20 20 20 20 20 69 6e 6f 64 65 4c  ;.        inodeL
6510: 69 73 74 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 4e  ist = pInode->pN
6520: 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ext;.      }.   
6530: 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d 3e 70     if( pInode->p
6540: 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Next ){.        
6550: 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e  assert( pInode->
6560: 70 4e 65 78 74 2d 3e 70 50 72 65 76 3d 3d 70 49  pNext->pPrev==pI
6570: 6e 6f 64 65 20 29 3b 0a 20 20 20 20 20 20 20 20  node );.        
6580: 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 2d 3e 70  pInode->pNext->p
6590: 50 72 65 76 20 3d 20 70 49 6e 6f 64 65 2d 3e 70  Prev = pInode->p
65a0: 50 72 65 76 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Prev;.      }.  
65b0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
65c0: 28 70 49 6e 6f 64 65 29 3b 0a 20 20 20 20 7d 0a  (pInode);.    }.
65d0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76    }.}../*.** Giv
65e0: 65 6e 20 61 20 66 69 6c 65 20 64 65 73 63 72 69  en a file descri
65f0: 70 74 6f 72 2c 20 6c 6f 63 61 74 65 20 74 68 65  ptor, locate the
6600: 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 6f   unixInodeInfo o
6610: 62 6a 65 63 74 20 74 68 61 74 0a 2a 2a 20 64 65  bject that.** de
6620: 73 63 72 69 62 65 73 20 74 68 61 74 20 66 69 6c  scribes that fil
6630: 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 43  e descriptor.  C
6640: 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65 20  reate a new one 
6650: 69 66 20 6e 65 63 65 73 73 61 72 79 2e 20 20 54  if necessary.  T
6660: 68 65 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c  he.** return val
6670: 75 65 20 6d 69 67 68 74 20 62 65 20 75 6e 69 6e  ue might be unin
6680: 69 74 69 61 6c 69 7a 65 64 20 69 66 20 61 6e 20  itialized if an 
6690: 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2a  error occurs..**
66a0: 0a 2a 2a 20 54 68 65 20 6d 75 74 65 78 20 65 6e  .** The mutex en
66b0: 74 65 72 65 64 20 75 73 69 6e 67 20 74 68 65 20  tered using the 
66c0: 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29  unixEnterMutex()
66d0: 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 62   function must b
66e0: 65 20 68 65 6c 64 0a 2a 2a 20 77 68 65 6e 20 74  e held.** when t
66f0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
6700: 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65  called..**.** Re
6710: 74 75 72 6e 20 61 6e 20 61 70 70 72 6f 70 72 69  turn an appropri
6720: 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a  ate error code..
6730: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69  */.static int fi
6740: 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 0a 20 20 75  ndInodeInfo(.  u
6750: 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20  nixFile *pFile, 
6760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6770: 20 55 6e 69 78 20 66 69 6c 65 20 77 69 74 68 20   Unix file with 
6780: 66 69 6c 65 20 64 65 73 63 20 75 73 65 64 20 69  file desc used i
6790: 6e 20 74 68 65 20 6b 65 79 20 2a 2f 0a 20 20 73  n the key */.  s
67a0: 74 72 75 63 74 20 75 6e 69 78 49 6e 6f 64 65 49  truct unixInodeI
67b0: 6e 66 6f 20 2a 2a 70 70 49 6e 6f 64 65 20 2f 2a  nfo **ppInode /*
67c0: 20 52 65 74 75 72 6e 20 74 68 65 20 75 6e 69 78   Return the unix
67d0: 49 6e 6f 64 65 49 6e 66 6f 20 6f 62 6a 65 63 74  InodeInfo object
67e0: 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   here */.){.  in
67f0: 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
6800: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6810: 53 79 73 74 65 6d 20 63 61 6c 6c 20 72 65 74 75  System call retu
6820: 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
6830: 20 66 64 3b 20 20 20 20 20 20 20 20 20 20 20 20   fd;            
6840: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
6850: 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
6860: 6f 72 20 66 6f 72 20 70 46 69 6c 65 20 2a 2f 0a  or for pFile */.
6870: 20 20 73 74 72 75 63 74 20 75 6e 69 78 46 69 6c    struct unixFil
6880: 65 49 64 20 66 69 6c 65 49 64 3b 20 20 20 20 20  eId fileId;     
6890: 20 20 20 20 20 2f 2a 20 4c 6f 6f 6b 75 70 20 6b       /* Lookup k
68a0: 65 79 20 66 6f 72 20 74 68 65 20 75 6e 69 78 49  ey for the unixI
68b0: 6e 6f 64 65 49 6e 66 6f 20 2a 2f 0a 20 20 73 74  nodeInfo */.  st
68c0: 72 75 63 74 20 73 74 61 74 20 73 74 61 74 62 75  ruct stat statbu
68d0: 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
68e0: 20 2f 2a 20 4c 6f 77 2d 6c 65 76 65 6c 20 66 69   /* Low-level fi
68f0: 6c 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a  le information *
6900: 2f 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78 49  /.  struct unixI
6910: 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65  nodeInfo *pInode
6920: 20 3d 20 30 3b 20 20 2f 2a 20 43 61 6e 64 69 64   = 0;  /* Candid
6930: 61 74 65 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  ate unixInodeInf
6940: 6f 20 6f 62 6a 65 63 74 20 2a 2f 0a 0a 20 20 61  o object */..  a
6950: 73 73 65 72 74 28 20 75 6e 69 78 4d 75 74 65 78  ssert( unixMutex
6960: 48 65 6c 64 28 29 20 29 3b 0a 0a 20 20 2f 2a 20  Held() );..  /* 
6970: 47 65 74 20 6c 6f 77 2d 6c 65 76 65 6c 20 69 6e  Get low-level in
6980: 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
6990: 74 68 65 20 66 69 6c 65 20 74 68 61 74 20 77 65  the file that we
69a0: 20 63 61 6e 20 75 73 65 64 20 74 6f 0a 20 20 2a   can used to.  *
69b0: 2a 20 63 72 65 61 74 65 20 61 20 75 6e 69 71 75  * create a uniqu
69c0: 65 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 66  e name for the f
69d0: 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 66 64 20 3d  ile..  */.  fd =
69e0: 20 70 46 69 6c 65 2d 3e 68 3b 0a 20 20 72 63 20   pFile->h;.  rc 
69f0: 3d 20 66 73 74 61 74 28 66 64 2c 20 26 73 74 61  = fstat(fd, &sta
6a00: 74 62 75 66 29 3b 0a 20 20 69 66 28 20 72 63 21  tbuf);.  if( rc!
6a10: 3d 30 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  =0 ){.    pFile-
6a20: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72  >lastErrno = err
6a30: 6e 6f 3b 0a 23 69 66 64 65 66 20 45 4f 56 45 52  no;.#ifdef EOVER
6a40: 46 4c 4f 57 0a 20 20 20 20 69 66 28 20 70 46 69  FLOW.    if( pFi
6a50: 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 3d 3d 45  le->lastErrno==E
6a60: 4f 56 45 52 46 4c 4f 57 20 29 20 72 65 74 75 72  OVERFLOW ) retur
6a70: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 3b 0a  n SQLITE_NOLFS;.
6a80: 23 65 6e 64 69 66 0a 20 20 20 20 72 65 74 75 72  #endif.    retur
6a90: 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a  n SQLITE_IOERR;.
6aa0: 20 20 7d 0a 0a 23 69 66 64 65 66 20 5f 5f 41 50    }..#ifdef __AP
6ab0: 50 4c 45 5f 5f 0a 20 20 2f 2a 20 4f 6e 20 4f 53  PLE__.  /* On OS
6ac0: 20 58 20 6f 6e 20 61 6e 20 6d 73 64 6f 73 20 66   X on an msdos f
6ad0: 69 6c 65 73 79 73 74 65 6d 2c 20 74 68 65 20 69  ilesystem, the i
6ae0: 6e 6f 64 65 20 6e 75 6d 62 65 72 20 69 73 20 72  node number is r
6af0: 65 70 6f 72 74 65 64 0a 20 20 2a 2a 20 69 6e 63  eported.  ** inc
6b00: 6f 72 72 65 63 74 6c 79 20 66 6f 72 20 7a 65 72  orrectly for zer
6b10: 6f 2d 73 69 7a 65 20 66 69 6c 65 73 2e 20 20 53  o-size files.  S
6b20: 65 65 20 74 69 63 6b 65 74 20 23 33 32 36 30 2e  ee ticket #3260.
6b30: 20 20 54 6f 20 77 6f 72 6b 0a 20 20 2a 2a 20 61    To work.  ** a
6b40: 72 6f 75 6e 64 20 74 68 69 73 20 70 72 6f 62 6c  round this probl
6b50: 65 6d 20 28 77 65 20 63 6f 6e 73 69 64 65 72 20  em (we consider 
6b60: 69 74 20 61 20 62 75 67 20 69 6e 20 4f 53 20 58  it a bug in OS X
6b70: 2c 20 6e 6f 74 20 53 51 4c 69 74 65 29 0a 20 20  , not SQLite).  
6b80: 2a 2a 20 77 65 20 61 6c 77 61 79 73 20 69 6e 63  ** we always inc
6b90: 72 65 61 73 65 20 74 68 65 20 66 69 6c 65 20 73  rease the file s
6ba0: 69 7a 65 20 74 6f 20 31 20 62 79 20 77 72 69 74  ize to 1 by writ
6bb0: 69 6e 67 20 61 20 73 69 6e 67 6c 65 20 62 79 74  ing a single byt
6bc0: 65 0a 20 20 2a 2a 20 70 72 69 6f 72 20 74 6f 20  e.  ** prior to 
6bd0: 61 63 63 65 73 73 69 6e 67 20 74 68 65 20 69 6e  accessing the in
6be0: 6f 64 65 20 6e 75 6d 62 65 72 2e 20 20 54 68 65  ode number.  The
6bf0: 20 6f 6e 65 20 62 79 74 65 20 77 72 69 74 74 65   one byte writte
6c00: 6e 20 69 73 0a 20 20 2a 2a 20 61 6e 20 41 53 43  n is.  ** an ASC
6c10: 49 49 20 27 53 27 20 63 68 61 72 61 63 74 65 72  II 'S' character
6c20: 20 77 68 69 63 68 20 61 6c 73 6f 20 68 61 70 70   which also happ
6c30: 65 6e 73 20 74 6f 20 62 65 20 74 68 65 20 66 69  ens to be the fi
6c40: 72 73 74 20 62 79 74 65 0a 20 20 2a 2a 20 69 6e  rst byte.  ** in
6c50: 20 74 68 65 20 68 65 61 64 65 72 20 6f 66 20 65   the header of e
6c60: 76 65 72 79 20 53 51 4c 69 74 65 20 64 61 74 61  very SQLite data
6c70: 62 61 73 65 2e 20 20 49 6e 20 74 68 69 73 20 77  base.  In this w
6c80: 61 79 2c 20 69 66 20 74 68 65 72 65 0a 20 20 2a  ay, if there.  *
6c90: 2a 20 69 73 20 61 20 72 61 63 65 20 63 6f 6e 64  * is a race cond
6ca0: 69 74 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20  ition such that 
6cb0: 61 6e 6f 74 68 65 72 20 74 68 72 65 61 64 20 68  another thread h
6cc0: 61 73 20 61 6c 72 65 61 64 79 20 70 6f 70 75 6c  as already popul
6cd0: 61 74 65 64 0a 20 20 2a 2a 20 74 68 65 20 66 69  ated.  ** the fi
6ce0: 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  rst page of the 
6cf0: 64 61 74 61 62 61 73 65 2c 20 6e 6f 20 64 61 6d  database, no dam
6d00: 61 67 65 20 69 73 20 64 6f 6e 65 2e 0a 20 20 2a  age is done..  *
6d10: 2f 0a 20 20 69 66 28 20 73 74 61 74 62 75 66 2e  /.  if( statbuf.
6d20: 73 74 5f 73 69 7a 65 3d 3d 30 20 26 26 20 28 70  st_size==0 && (p
6d30: 46 69 6c 65 2d 3e 66 73 46 6c 61 67 73 20 26 20  File->fsFlags & 
6d40: 53 51 4c 49 54 45 5f 46 53 46 4c 41 47 53 5f 49  SQLITE_FSFLAGS_I
6d50: 53 5f 4d 53 44 4f 53 29 21 3d 30 20 29 7b 0a 20  S_MSDOS)!=0 ){. 
6d60: 20 20 20 72 63 20 3d 20 77 72 69 74 65 28 66 64     rc = write(fd
6d70: 2c 20 22 53 22 2c 20 31 29 3b 0a 20 20 20 20 69  , "S", 1);.    i
6d80: 66 28 20 72 63 21 3d 31 20 29 7b 0a 20 20 20 20  f( rc!=1 ){.    
6d90: 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
6da0: 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
6db0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
6dc0: 49 4f 45 52 52 3b 0a 20 20 20 20 7d 0a 20 20 20  IOERR;.    }.   
6dd0: 20 72 63 20 3d 20 66 73 74 61 74 28 66 64 2c 20   rc = fstat(fd, 
6de0: 26 73 74 61 74 62 75 66 29 3b 0a 20 20 20 20 69  &statbuf);.    i
6df0: 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20  f( rc!=0 ){.    
6e00: 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
6e10: 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
6e20: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
6e30: 49 4f 45 52 52 3b 0a 20 20 20 20 7d 0a 20 20 7d  IOERR;.    }.  }
6e40: 0a 23 65 6e 64 69 66 0a 0a 20 20 6d 65 6d 73 65  .#endif..  memse
6e50: 74 28 26 66 69 6c 65 49 64 2c 20 30 2c 20 73 69  t(&fileId, 0, si
6e60: 7a 65 6f 66 28 66 69 6c 65 49 64 29 29 3b 0a 20  zeof(fileId));. 
6e70: 20 66 69 6c 65 49 64 2e 64 65 76 20 3d 20 73 74   fileId.dev = st
6e80: 61 74 62 75 66 2e 73 74 5f 64 65 76 3b 0a 23 69  atbuf.st_dev;.#i
6e90: 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 66  f OS_VXWORKS.  f
6ea0: 69 6c 65 49 64 2e 70 49 64 20 3d 20 70 46 69 6c  ileId.pId = pFil
6eb0: 65 2d 3e 70 49 64 3b 0a 23 65 6c 73 65 0a 20 20  e->pId;.#else.  
6ec0: 66 69 6c 65 49 64 2e 69 6e 6f 20 3d 20 73 74 61  fileId.ino = sta
6ed0: 74 62 75 66 2e 73 74 5f 69 6e 6f 3b 0a 23 65 6e  tbuf.st_ino;.#en
6ee0: 64 69 66 0a 20 20 70 49 6e 6f 64 65 20 3d 20 69  dif.  pInode = i
6ef0: 6e 6f 64 65 4c 69 73 74 3b 0a 20 20 77 68 69 6c  nodeList;.  whil
6f00: 65 28 20 70 49 6e 6f 64 65 20 26 26 20 6d 65 6d  e( pInode && mem
6f10: 63 6d 70 28 26 66 69 6c 65 49 64 2c 20 26 70 49  cmp(&fileId, &pI
6f20: 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2c 20 73 69  node->fileId, si
6f30: 7a 65 6f 66 28 66 69 6c 65 49 64 29 29 20 29 7b  zeof(fileId)) ){
6f40: 0a 20 20 20 20 70 49 6e 6f 64 65 20 3d 20 70 49  .    pInode = pI
6f50: 6e 6f 64 65 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d  node->pNext;.  }
6f60: 0a 20 20 69 66 28 20 70 49 6e 6f 64 65 3d 3d 30  .  if( pInode==0
6f70: 20 29 7b 0a 20 20 20 20 70 49 6e 6f 64 65 20 3d   ){.    pInode =
6f80: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
6f90: 20 73 69 7a 65 6f 66 28 2a 70 49 6e 6f 64 65 29   sizeof(*pInode)
6fa0: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 49 6e 6f   );.    if( pIno
6fb0: 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  de==0 ){.      r
6fc0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
6fd0: 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65  EM;.    }.    me
6fe0: 6d 73 65 74 28 70 49 6e 6f 64 65 2c 20 30 2c 20  mset(pInode, 0, 
6ff0: 73 69 7a 65 6f 66 28 2a 70 49 6e 6f 64 65 29 29  sizeof(*pInode))
7000: 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70 49  ;.    memcpy(&pI
7010: 6e 6f 64 65 2d 3e 66 69 6c 65 49 64 2c 20 26 66  node->fileId, &f
7020: 69 6c 65 49 64 2c 20 73 69 7a 65 6f 66 28 66 69  ileId, sizeof(fi
7030: 6c 65 49 64 29 29 3b 0a 20 20 20 20 70 49 6e 6f  leId));.    pIno
7040: 64 65 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20  de->nRef = 1;.  
7050: 20 20 70 49 6e 6f 64 65 2d 3e 70 4e 65 78 74 20    pInode->pNext 
7060: 3d 20 69 6e 6f 64 65 4c 69 73 74 3b 0a 20 20 20  = inodeList;.   
7070: 20 70 49 6e 6f 64 65 2d 3e 70 50 72 65 76 20 3d   pInode->pPrev =
7080: 20 30 3b 0a 20 20 20 20 69 66 28 20 69 6e 6f 64   0;.    if( inod
7090: 65 4c 69 73 74 20 29 20 69 6e 6f 64 65 4c 69 73  eList ) inodeLis
70a0: 74 2d 3e 70 50 72 65 76 20 3d 20 70 49 6e 6f 64  t->pPrev = pInod
70b0: 65 3b 0a 20 20 20 20 69 6e 6f 64 65 4c 69 73 74  e;.    inodeList
70c0: 20 3d 20 70 49 6e 6f 64 65 3b 0a 20 20 7d 65 6c   = pInode;.  }el
70d0: 73 65 7b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e  se{.    pInode->
70e0: 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 2a 70  nRef++;.  }.  *p
70f0: 70 49 6e 6f 64 65 20 3d 20 70 49 6e 6f 64 65 3b  pInode = pInode;
7100: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
7110: 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  _OK;.}.../*.** T
7120: 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63  his routine chec
7130: 6b 73 20 69 66 20 74 68 65 72 65 20 69 73 20 61  ks if there is a
7140: 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 68   RESERVED lock h
7150: 65 6c 64 20 6f 6e 20 74 68 65 20 73 70 65 63 69  eld on the speci
7160: 66 69 65 64 0a 2a 2a 20 66 69 6c 65 20 62 79 20  fied.** file by 
7170: 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65  this or any othe
7180: 72 20 70 72 6f 63 65 73 73 2e 20 49 66 20 73 75  r process. If su
7190: 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c  ch a lock is hel
71a0: 64 2c 20 73 65 74 20 2a 70 52 65 73 4f 75 74 0a  d, set *pResOut.
71b0: 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d 7a 65 72 6f  ** to a non-zero
71c0: 20 76 61 6c 75 65 20 6f 74 68 65 72 77 69 73 65   value otherwise
71d0: 20 2a 70 52 65 73 4f 75 74 20 69 73 20 73 65 74   *pResOut is set
71e0: 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65 20 72   to zero.  The r
71f0: 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a 20 69  eturn value.** i
7200: 73 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45 5f  s set to SQLITE_
7210: 4f 4b 20 75 6e 6c 65 73 73 20 61 6e 20 49 2f 4f  OK unless an I/O
7220: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75   error occurs du
7230: 72 69 6e 67 20 6c 6f 63 6b 20 63 68 65 63 6b 69  ring lock checki
7240: 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
7250: 74 20 75 6e 69 78 43 68 65 63 6b 52 65 73 65 72  t unixCheckReser
7260: 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  vedLock(sqlite3_
7270: 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20 2a 70  file *id, int *p
7280: 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e 74 20 72  ResOut){.  int r
7290: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
72a0: 20 69 6e 74 20 72 65 73 65 72 76 65 64 20 3d 20   int reserved = 
72b0: 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  0;.  unixFile *p
72c0: 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
72d0: 2a 29 69 64 3b 0a 0a 20 20 53 69 6d 75 6c 61 74  *)id;..  Simulat
72e0: 65 49 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e  eIOError( return
72f0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48   SQLITE_IOERR_CH
7300: 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3b  ECKRESERVEDLOCK;
7310: 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   );..  assert( p
7320: 46 69 6c 65 20 29 3b 0a 20 20 75 6e 69 78 45 6e  File );.  unixEn
7330: 74 65 72 4d 75 74 65 78 28 29 3b 20 2f 2a 20 42  terMutex(); /* B
7340: 65 63 61 75 73 65 20 70 46 69 6c 65 2d 3e 70 49  ecause pFile->pI
7350: 6e 6f 64 65 20 69 73 20 73 68 61 72 65 64 20 61  node is shared a
7360: 63 72 6f 73 73 20 74 68 72 65 61 64 73 20 2a 2f  cross threads */
7370: 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20  ..  /* Check if 
7380: 61 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73  a thread in this
7390: 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73   process holds s
73a0: 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20  uch a lock */.  
73b0: 69 66 28 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  if( pFile->pInod
73c0: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41  e->eFileLock>SHA
73d0: 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RED_LOCK ){.    
73e0: 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20  reserved = 1;.  
73f0: 7d 0a 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69 73  }..  /* Otherwis
7400: 65 20 73 65 65 20 69 66 20 73 6f 6d 65 20 6f 74  e see if some ot
7410: 68 65 72 20 70 72 6f 63 65 73 73 20 68 6f 6c 64  her process hold
7420: 73 20 69 74 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64  s it..  */.#ifnd
7430: 65 66 20 5f 5f 44 4a 47 50 50 5f 5f 0a 20 20 69  ef __DJGPP__.  i
7440: 66 28 20 21 72 65 73 65 72 76 65 64 20 29 7b 0a  f( !reserved ){.
7450: 20 20 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b      struct flock
7460: 20 6c 6f 63 6b 3b 0a 20 20 20 20 6c 6f 63 6b 2e   lock;.    lock.
7470: 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f  l_whence = SEEK_
7480: 53 45 54 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f  SET;.    lock.l_
7490: 73 74 61 72 74 20 3d 20 52 45 53 45 52 56 45 44  start = RESERVED
74a0: 5f 42 59 54 45 3b 0a 20 20 20 20 6c 6f 63 6b 2e  _BYTE;.    lock.
74b0: 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 20 20 20 20 6c  l_len = 1;.    l
74c0: 6f 63 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 57  ock.l_type = F_W
74d0: 52 4c 43 4b 3b 0a 20 20 20 20 69 66 20 28 2d 31  RLCK;.    if (-1
74e0: 20 3d 3d 20 66 63 6e 74 6c 28 70 46 69 6c 65 2d   == fcntl(pFile-
74f0: 3e 68 2c 20 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f  >h, F_GETLK, &lo
7500: 63 6b 29 29 20 7b 0a 20 20 20 20 20 20 69 6e 74  ck)) {.      int
7510: 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
7520: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
7530: 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78  teErrorFromPosix
7540: 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51  Error(tErrno, SQ
7550: 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b  LITE_IOERR_CHECK
7560: 52 45 53 45 52 56 45 44 4c 4f 43 4b 29 3b 0a 20  RESERVEDLOCK);. 
7570: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
7580: 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a  Errno = tErrno;.
7590: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 28 20 6c      } else if( l
75a0: 6f 63 6b 2e 6c 5f 74 79 70 65 21 3d 46 5f 55 4e  ock.l_type!=F_UN
75b0: 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 73  LCK ){.      res
75c0: 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d  erved = 1;.    }
75d0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 20  .  }.#endif.  . 
75e0: 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
75f0: 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54  );.  OSTRACE(("T
7600: 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25  EST WR-LOCK %d %
7610: 64 20 25 64 20 28 75 6e 69 78 29 5c 6e 22 2c 20  d %d (unix)\n", 
7620: 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72 65  pFile->h, rc, re
7630: 73 65 72 76 65 64 29 29 3b 0a 0a 20 20 2a 70 52  served));..  *pR
7640: 65 73 4f 75 74 20 3d 20 72 65 73 65 72 76 65 64  esOut = reserved
7650: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
7660: 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68 65  ../*.** Lock the
7670: 20 66 69 6c 65 20 77 69 74 68 20 74 68 65 20 6c   file with the l
7680: 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20 62 79  ock specified by
7690: 20 70 61 72 61 6d 65 74 65 72 20 65 46 69 6c 65   parameter eFile
76a0: 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f 66  Lock - one.** of
76b0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 0a   the following:.
76c0: 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53 48  **.**     (1) SH
76d0: 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  ARED_LOCK.**    
76e0: 20 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c 4f   (2) RESERVED_LO
76f0: 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50 45  CK.**     (3) PE
7700: 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  NDING_LOCK.**   
7710: 20 20 28 34 29 20 45 58 43 4c 55 53 49 56 45 5f    (4) EXCLUSIVE_
7720: 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74  LOCK.**.** Somet
7730: 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65 73  imes when reques
7740: 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73 74  ting one lock st
7750: 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c 20  ate, additional 
7760: 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20 61  lock states.** a
7770: 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20 62  re inserted in b
7780: 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f 63  etween.  The loc
7790: 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c 20  king might fail 
77a0: 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c 61  on one of the la
77b0: 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f  ter.** transitio
77c0: 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20 6c  ns leaving the l
77d0: 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66 65 72  ock state differ
77e0: 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69 74  ent from what it
77f0: 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a 20   started but.** 
7800: 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20 69  still short of i
7810: 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66 6f  ts goal.  The fo
7820: 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73 68  llowing chart sh
7830: 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64 0a  ows the allowed.
7840: 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 61  ** transitions a
7850: 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65 64 20  nd the inserted 
7860: 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74 61  intermediate sta
7870: 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55 4e  tes:.**.**    UN
7880: 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45 44  LOCKED -> SHARED
7890: 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e  .**    SHARED ->
78a0: 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20 20   RESERVED.**    
78b0: 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44 49  SHARED -> (PENDI
78c0: 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  NG) -> EXCLUSIVE
78d0: 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44 20  .**    RESERVED 
78e0: 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20  -> (PENDING) -> 
78f0: 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20  EXCLUSIVE.**    
7900: 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c 55  PENDING -> EXCLU
7910: 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  SIVE.**.** This 
7920: 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e 6c  routine will onl
7930: 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f 63  y increase a loc
7940: 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c 69  k.  Use the sqli
7950: 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a 2a  te3OsUnlock().**
7960: 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77 65   routine to lowe
7970: 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  r a locking leve
7980: 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  l..*/.static int
7990: 20 75 6e 69 78 4c 6f 63 6b 28 73 71 6c 69 74 65   unixLock(sqlite
79a0: 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
79b0: 65 46 69 6c 65 4c 6f 63 6b 29 7b 0a 20 20 2f 2a  eFileLock){.  /*
79c0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 64   The following d
79d0: 65 73 63 72 69 62 65 73 20 74 68 65 20 69 6d 70  escribes the imp
79e0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
79f0: 68 65 20 76 61 72 69 6f 75 73 20 6c 6f 63 6b 73  he various locks
7a00: 20 61 6e 64 0a 20 20 2a 2a 20 6c 6f 63 6b 20 74   and.  ** lock t
7a10: 72 61 6e 73 69 74 69 6f 6e 73 20 69 6e 20 74 65  ransitions in te
7a20: 72 6d 73 20 6f 66 20 74 68 65 20 50 4f 53 49 58  rms of the POSIX
7a30: 20 61 64 76 69 73 6f 72 79 20 73 68 61 72 65 64   advisory shared
7a40: 20 61 6e 64 20 65 78 63 6c 75 73 69 76 65 0a 20   and exclusive. 
7a50: 20 2a 2a 20 6c 6f 63 6b 20 70 72 69 6d 69 74 69   ** lock primiti
7a60: 76 65 73 20 28 63 61 6c 6c 65 64 20 72 65 61 64  ves (called read
7a70: 2d 6c 6f 63 6b 73 20 61 6e 64 20 77 72 69 74 65  -locks and write
7a80: 2d 6c 6f 63 6b 73 20 62 65 6c 6f 77 2c 20 74 6f  -locks below, to
7a90: 20 61 76 6f 69 64 0a 20 20 2a 2a 20 63 6f 6e 66   avoid.  ** conf
7aa0: 75 73 69 6f 6e 20 77 69 74 68 20 53 51 4c 69 74  usion with SQLit
7ab0: 65 20 6c 6f 63 6b 20 6e 61 6d 65 73 29 2e 20 54  e lock names). T
7ac0: 68 65 20 61 6c 67 6f 72 69 74 68 6d 73 20 61 72  he algorithms ar
7ad0: 65 20 63 6f 6d 70 6c 69 63 61 74 65 64 0a 20 20  e complicated.  
7ae0: 2a 2a 20 73 6c 69 67 68 74 6c 79 20 69 6e 20 6f  ** slightly in o
7af0: 72 64 65 72 20 74 6f 20 62 65 20 63 6f 6d 70 61  rder to be compa
7b00: 74 69 62 6c 65 20 77 69 74 68 20 77 69 6e 64 6f  tible with windo
7b10: 77 73 20 73 79 73 74 65 6d 73 20 73 69 6d 75 6c  ws systems simul
7b20: 74 61 6e 65 6f 75 73 6c 79 0a 20 20 2a 2a 20 61  taneously.  ** a
7b30: 63 63 65 73 73 69 6e 67 20 74 68 65 20 73 61 6d  ccessing the sam
7b40: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
7b50: 20 69 6e 20 63 61 73 65 20 74 68 61 74 20 69 73   in case that is
7b60: 20 65 76 65 72 20 72 65 71 75 69 72 65 64 2e 0a   ever required..
7b70: 20 20 2a 2a 0a 20 20 2a 2a 20 53 79 6d 62 6f 6c    **.  ** Symbol
7b80: 73 20 64 65 66 69 6e 65 64 20 69 6e 20 6f 73 2e  s defined in os.
7b90: 68 20 69 6e 64 65 6e 74 69 66 79 20 74 68 65 20  h indentify the 
7ba0: 27 70 65 6e 64 69 6e 67 20 62 79 74 65 27 20 61  'pending byte' a
7bb0: 6e 64 20 74 68 65 20 27 72 65 73 65 72 76 65 64  nd the 'reserved
7bc0: 0a 20 20 2a 2a 20 62 79 74 65 27 2c 20 65 61 63  .  ** byte', eac
7bd0: 68 20 73 69 6e 67 6c 65 20 62 79 74 65 73 20 61  h single bytes a
7be0: 74 20 77 65 6c 6c 20 6b 6e 6f 77 6e 20 6f 66 66  t well known off
7bf0: 73 65 74 73 2c 20 61 6e 64 20 74 68 65 20 27 73  sets, and the 's
7c00: 68 61 72 65 64 20 62 79 74 65 0a 20 20 2a 2a 20  hared byte.  ** 
7c10: 72 61 6e 67 65 27 2c 20 61 20 72 61 6e 67 65 20  range', a range 
7c20: 6f 66 20 35 31 30 20 62 79 74 65 73 20 61 74 20  of 510 bytes at 
7c30: 61 20 77 65 6c 6c 20 6b 6e 6f 77 6e 20 6f 66 66  a well known off
7c40: 73 65 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  set..  **.  ** T
7c50: 6f 20 6f 62 74 61 69 6e 20 61 20 53 48 41 52 45  o obtain a SHARE
7c60: 44 20 6c 6f 63 6b 2c 20 61 20 72 65 61 64 2d 6c  D lock, a read-l
7c70: 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 20  ock is obtained 
7c80: 6f 6e 20 74 68 65 20 27 70 65 6e 64 69 6e 67 0a  on the 'pending.
7c90: 20 20 2a 2a 20 62 79 74 65 27 2e 20 20 49 66 20    ** byte'.  If 
7ca0: 74 68 69 73 20 69 73 20 73 75 63 63 65 73 73 66  this is successf
7cb0: 75 6c 2c 20 61 20 72 61 6e 64 6f 6d 20 62 79 74  ul, a random byt
7cc0: 65 20 66 72 6f 6d 20 74 68 65 20 27 73 68 61 72  e from the 'shar
7cd0: 65 64 20 62 79 74 65 0a 20 20 2a 2a 20 72 61 6e  ed byte.  ** ran
7ce0: 67 65 27 20 69 73 20 72 65 61 64 2d 6c 6f 63 6b  ge' is read-lock
7cf0: 65 64 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20  ed and the lock 
7d00: 6f 6e 20 74 68 65 20 27 70 65 6e 64 69 6e 67 20  on the 'pending 
7d10: 62 79 74 65 27 20 72 65 6c 65 61 73 65 64 2e 0a  byte' released..
7d20: 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 70 72 6f 63    **.  ** A proc
7d30: 65 73 73 20 6d 61 79 20 6f 6e 6c 79 20 6f 62 74  ess may only obt
7d40: 61 69 6e 20 61 20 52 45 53 45 52 56 45 44 20 6c  ain a RESERVED l
7d50: 6f 63 6b 20 61 66 74 65 72 20 69 74 20 68 61 73  ock after it has
7d60: 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2e 0a   a SHARED lock..
7d70: 20 20 2a 2a 20 41 20 52 45 53 45 52 56 45 44 20    ** A RESERVED 
7d80: 6c 6f 63 6b 20 69 73 20 69 6d 70 6c 65 6d 65 6e  lock is implemen
7d90: 74 65 64 20 62 79 20 67 72 61 62 62 69 6e 67 20  ted by grabbing 
7da0: 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20  a write-lock on 
7db0: 74 68 65 0a 20 20 2a 2a 20 27 72 65 73 65 72 76  the.  ** 'reserv
7dc0: 65 64 20 62 79 74 65 27 2e 20 0a 20 20 2a 2a 0a  ed byte'. .  **.
7dd0: 20 20 2a 2a 20 41 20 70 72 6f 63 65 73 73 20 6d    ** A process m
7de0: 61 79 20 6f 6e 6c 79 20 6f 62 74 61 69 6e 20 61  ay only obtain a
7df0: 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 61 66   PENDING lock af
7e00: 74 65 72 20 69 74 20 68 61 73 20 6f 62 74 61 69  ter it has obtai
7e10: 6e 65 64 20 61 0a 20 20 2a 2a 20 53 48 41 52 45  ned a.  ** SHARE
7e20: 44 20 6c 6f 63 6b 2e 20 41 20 50 45 4e 44 49 4e  D lock. A PENDIN
7e30: 47 20 6c 6f 63 6b 20 69 73 20 69 6d 70 6c 65 6d  G lock is implem
7e40: 65 6e 74 65 64 20 62 79 20 6f 62 74 61 69 6e 69  ented by obtaini
7e50: 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 0a  ng a write-lock.
7e60: 20 20 2a 2a 20 6f 6e 20 74 68 65 20 27 70 65 6e    ** on the 'pen
7e70: 64 69 6e 67 20 62 79 74 65 27 2e 20 54 68 69 73  ding byte'. This
7e80: 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 6e 6f   ensures that no
7e90: 20 6e 65 77 20 53 48 41 52 45 44 20 6c 6f 63 6b   new SHARED lock
7ea0: 73 20 63 61 6e 20 62 65 0a 20 20 2a 2a 20 6f 62  s can be.  ** ob
7eb0: 74 61 69 6e 65 64 2c 20 62 75 74 20 65 78 69 73  tained, but exis
7ec0: 74 69 6e 67 20 53 48 41 52 45 44 20 6c 6f 63 6b  ting SHARED lock
7ed0: 73 20 61 72 65 20 61 6c 6c 6f 77 65 64 20 74 6f  s are allowed to
7ee0: 20 70 65 72 73 69 73 74 2e 20 41 20 70 72 6f 63   persist. A proc
7ef0: 65 73 73 0a 20 20 2a 2a 20 64 6f 65 73 20 6e 6f  ess.  ** does no
7f00: 74 20 68 61 76 65 20 74 6f 20 6f 62 74 61 69 6e  t have to obtain
7f10: 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
7f20: 20 6f 6e 20 74 68 65 20 77 61 79 20 74 6f 20 61   on the way to a
7f30: 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 2e 0a 20   PENDING lock.. 
7f40: 20 2a 2a 20 54 68 69 73 20 70 72 6f 70 65 72 74   ** This propert
7f50: 79 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65  y is used by the
7f60: 20 61 6c 67 6f 72 69 74 68 6d 20 66 6f 72 20 72   algorithm for r
7f70: 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 6a 6f  olling back a jo
7f80: 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20 2a 2a 20  urnal file.  ** 
7f90: 61 66 74 65 72 20 61 20 63 72 61 73 68 2e 0a 20  after a crash.. 
7fa0: 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 45 58 43 4c   **.  ** An EXCL
7fb0: 55 53 49 56 45 20 6c 6f 63 6b 2c 20 6f 62 74 61  USIVE lock, obta
7fc0: 69 6e 65 64 20 61 66 74 65 72 20 61 20 50 45 4e  ined after a PEN
7fd0: 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 68 65 6c  DING lock is hel
7fe0: 64 2c 20 69 73 0a 20 20 2a 2a 20 69 6d 70 6c 65  d, is.  ** imple
7ff0: 6d 65 6e 74 65 64 20 62 79 20 6f 62 74 61 69 6e  mented by obtain
8000: 69 6e 67 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b  ing a write-lock
8010: 20 6f 6e 20 74 68 65 20 65 6e 74 69 72 65 20 27   on the entire '
8020: 73 68 61 72 65 64 20 62 79 74 65 0a 20 20 2a 2a  shared byte.  **
8030: 20 72 61 6e 67 65 27 2e 20 53 69 6e 63 65 20 61   range'. Since a
8040: 6c 6c 20 6f 74 68 65 72 20 6c 6f 63 6b 73 20 72  ll other locks r
8050: 65 71 75 69 72 65 20 61 20 72 65 61 64 2d 6c 6f  equire a read-lo
8060: 63 6b 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65  ck on one of the
8070: 20 62 79 74 65 73 0a 20 20 2a 2a 20 77 69 74 68   bytes.  ** with
8080: 69 6e 20 74 68 69 73 20 72 61 6e 67 65 2c 20 74  in this range, t
8090: 68 69 73 20 65 6e 73 75 72 65 73 20 74 68 61 74  his ensures that
80a0: 20 6e 6f 20 6f 74 68 65 72 20 6c 6f 63 6b 73 20   no other locks 
80b0: 61 72 65 20 68 65 6c 64 20 6f 6e 20 74 68 65 0a  are held on the.
80c0: 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 0a    ** database. .
80d0: 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 72 65    **.  ** The re
80e0: 61 73 6f 6e 20 61 20 73 69 6e 67 6c 65 20 62 79  ason a single by
80f0: 74 65 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65  te cannot be use
8100: 64 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65  d instead of the
8110: 20 27 73 68 61 72 65 64 20 62 79 74 65 0a 20 20   'shared byte.  
8120: 2a 2a 20 72 61 6e 67 65 27 20 69 73 20 74 68 61  ** range' is tha
8130: 74 20 73 6f 6d 65 20 76 65 72 73 69 6f 6e 73 20  t some versions 
8140: 6f 66 20 77 69 6e 64 6f 77 73 20 64 6f 20 6e 6f  of windows do no
8150: 74 20 73 75 70 70 6f 72 74 20 72 65 61 64 2d 6c  t support read-l
8160: 6f 63 6b 73 2e 20 42 79 0a 20 20 2a 2a 20 6c 6f  ocks. By.  ** lo
8170: 63 6b 69 6e 67 20 61 20 72 61 6e 64 6f 6d 20 62  cking a random b
8180: 79 74 65 20 66 72 6f 6d 20 61 20 72 61 6e 67 65  yte from a range
8190: 2c 20 63 6f 6e 63 75 72 72 65 6e 74 20 53 48 41  , concurrent SHA
81a0: 52 45 44 20 6c 6f 63 6b 73 20 6d 61 79 20 65 78  RED locks may ex
81b0: 69 73 74 0a 20 20 2a 2a 20 65 76 65 6e 20 69 66  ist.  ** even if
81c0: 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 70 72 69   the locking pri
81d0: 6d 69 74 69 76 65 20 75 73 65 64 20 69 73 20 61  mitive used is a
81e0: 6c 77 61 79 73 20 61 20 77 72 69 74 65 2d 6c 6f  lways a write-lo
81f0: 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20 72  ck..  */.  int r
8200: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
8210: 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
8220: 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
8230: 3b 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78 49  ;.  struct unixI
8240: 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64 65  nodeInfo *pInode
8250: 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65   = pFile->pInode
8260: 3b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63 6b  ;.  struct flock
8270: 20 6c 6f 63 6b 3b 0a 20 20 69 6e 74 20 73 20 3d   lock;.  int s =
8280: 20 30 3b 0a 20 20 69 6e 74 20 74 45 72 72 6e 6f   0;.  int tErrno
8290: 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28   = 0;..  assert(
82a0: 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52   pFile );.  OSTR
82b0: 41 43 45 28 28 22 4c 4f 43 4b 20 20 20 20 25 64  ACE(("LOCK    %d
82c0: 20 25 73 20 77 61 73 20 25 73 28 25 73 2c 25 64   %s was %s(%s,%d
82d0: 29 20 70 69 64 3d 25 64 20 28 75 6e 69 78 29 5c  ) pid=%d (unix)\
82e0: 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20  n", pFile->h,.  
82f0: 20 20 20 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65      azFileLock(e
8300: 46 69 6c 65 4c 6f 63 6b 29 2c 20 61 7a 46 69 6c  FileLock), azFil
8310: 65 4c 6f 63 6b 28 70 46 69 6c 65 2d 3e 65 46 69  eLock(pFile->eFi
8320: 6c 65 4c 6f 63 6b 29 2c 0a 20 20 20 20 20 20 61  leLock),.      a
8330: 7a 46 69 6c 65 4c 6f 63 6b 28 70 49 6e 6f 64 65  zFileLock(pInode
8340: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 70 49  ->eFileLock), pI
8350: 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 20 2c 20  node->nShared , 
8360: 67 65 74 70 69 64 28 29 29 29 3b 0a 0a 20 20 2f  getpid()));..  /
8370: 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6c  * If there is al
8380: 72 65 61 64 79 20 61 20 6c 6f 63 6b 20 6f 66 20  ready a lock of 
8390: 74 68 69 73 20 74 79 70 65 20 6f 72 20 6d 6f 72  this type or mor
83a0: 65 20 72 65 73 74 72 69 63 74 69 76 65 20 6f 6e  e restrictive on
83b0: 20 74 68 65 0a 20 20 2a 2a 20 75 6e 69 78 46 69   the.  ** unixFi
83c0: 6c 65 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20  le, do nothing. 
83d0: 44 6f 6e 27 74 20 75 73 65 20 74 68 65 20 65 6e  Don't use the en
83e0: 64 5f 6c 6f 63 6b 3a 20 65 78 69 74 20 70 61 74  d_lock: exit pat
83f0: 68 2c 20 61 73 0a 20 20 2a 2a 20 75 6e 69 78 45  h, as.  ** unixE
8400: 6e 74 65 72 4d 75 74 65 78 28 29 20 68 61 73 6e  nterMutex() hasn
8410: 27 74 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 79  't been called y
8420: 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  et..  */.  if( p
8430: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e  File->eFileLock>
8440: 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20  =eFileLock ){.  
8450: 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b    OSTRACE(("LOCK
8460: 20 20 20 20 25 64 20 25 73 20 6f 6b 20 28 61 6c      %d %s ok (al
8470: 72 65 61 64 79 20 68 65 6c 64 29 20 28 75 6e 69  ready held) (uni
8480: 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  x)\n", pFile->h,
8490: 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 7a 46  .            azF
84a0: 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63  ileLock(eFileLoc
84b0: 6b 29 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  k)));.    return
84c0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
84d0: 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
84e0: 74 68 65 20 6c 6f 63 6b 69 6e 67 20 73 65 71 75  the locking sequ
84f0: 65 6e 63 65 20 69 73 20 63 6f 72 72 65 63 74 2e  ence is correct.
8500: 0a 20 20 2a 2a 20 20 28 31 29 20 57 65 20 6e 65  .  **  (1) We ne
8510: 76 65 72 20 6d 6f 76 65 20 66 72 6f 6d 20 75 6e  ver move from un
8520: 6c 6f 63 6b 65 64 20 74 6f 20 61 6e 79 74 68 69  locked to anythi
8530: 6e 67 20 68 69 67 68 65 72 20 74 68 61 6e 20 73  ng higher than s
8540: 68 61 72 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2a  hared lock..  **
8550: 20 20 28 32 29 20 53 51 4c 69 74 65 20 6e 65 76    (2) SQLite nev
8560: 65 72 20 65 78 70 6c 69 63 69 74 6c 79 20 72 65  er explicitly re
8570: 71 75 65 73 74 73 20 61 20 70 65 6e 64 69 67 20  quests a pendig 
8580: 6c 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28 33 29 20  lock..  **  (3) 
8590: 41 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 69 73  A shared lock is
85a0: 20 61 6c 77 61 79 73 20 68 65 6c 64 20 77 68 65   always held whe
85b0: 6e 20 61 20 72 65 73 65 72 76 65 20 6c 6f 63 6b  n a reserve lock
85c0: 20 69 73 20 72 65 71 75 65 73 74 65 64 2e 0a 20   is requested.. 
85d0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 46   */.  assert( pF
85e0: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d  ile->eFileLock!=
85f0: 4e 4f 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65  NO_LOCK || eFile
8600: 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
8610: 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65  K );.  assert( e
8620: 46 69 6c 65 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e  FileLock!=PENDIN
8630: 47 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65  G_LOCK );.  asse
8640: 72 74 28 20 65 46 69 6c 65 4c 6f 63 6b 21 3d 52  rt( eFileLock!=R
8650: 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20  ESERVED_LOCK || 
8660: 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
8670: 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  ==SHARED_LOCK );
8680: 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6d 75 74 65  ..  /* This mute
8690: 78 20 69 73 20 6e 65 65 64 65 64 20 62 65 63 61  x is needed beca
86a0: 75 73 65 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  use pFile->pInod
86b0: 65 20 69 73 20 73 68 61 72 65 64 20 61 63 72 6f  e is shared acro
86c0: 73 73 20 74 68 72 65 61 64 73 0a 20 20 2a 2f 0a  ss threads.  */.
86d0: 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65 78    unixEnterMutex
86e0: 28 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20 70  ();.  pInode = p
86f0: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 0a 20  File->pInode;.. 
8700: 20 2f 2a 20 49 66 20 73 6f 6d 65 20 74 68 72 65   /* If some thre
8710: 61 64 20 75 73 69 6e 67 20 74 68 69 73 20 50 49  ad using this PI
8720: 44 20 68 61 73 20 61 20 6c 6f 63 6b 20 76 69 61  D has a lock via
8730: 20 61 20 64 69 66 66 65 72 65 6e 74 20 75 6e 69   a different uni
8740: 78 46 69 6c 65 2a 0a 20 20 2a 2a 20 68 61 6e 64  xFile*.  ** hand
8750: 6c 65 20 74 68 61 74 20 70 72 65 63 6c 75 64 65  le that preclude
8760: 73 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  s the requested 
8770: 6c 6f 63 6b 2c 20 72 65 74 75 72 6e 20 42 55 53  lock, return BUS
8780: 59 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70  Y..  */.  if( (p
8790: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21  File->eFileLock!
87a0: 3d 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f  =pInode->eFileLo
87b0: 63 6b 20 26 26 20 0a 20 20 20 20 20 20 20 20 20  ck && .         
87c0: 20 28 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c   (pInode->eFileL
87d0: 6f 63 6b 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43  ock>=PENDING_LOC
87e0: 4b 20 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3e 53  K || eFileLock>S
87f0: 48 41 52 45 44 5f 4c 4f 43 4b 29 29 0a 20 20 29  HARED_LOCK)).  )
8800: 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
8810: 45 5f 42 55 53 59 3b 0a 20 20 20 20 67 6f 74 6f  E_BUSY;.    goto
8820: 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a   end_lock;.  }..
8830: 20 20 2f 2a 20 49 66 20 61 20 53 48 41 52 45 44    /* If a SHARED
8840: 20 6c 6f 63 6b 20 69 73 20 72 65 71 75 65 73 74   lock is request
8850: 65 64 2c 20 61 6e 64 20 73 6f 6d 65 20 74 68 72  ed, and some thr
8860: 65 61 64 20 75 73 69 6e 67 20 74 68 69 73 20 50  ead using this P
8870: 49 44 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20  ID already.  ** 
8880: 68 61 73 20 61 20 53 48 41 52 45 44 20 6f 72 20  has a SHARED or 
8890: 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c 20 74  RESERVED lock, t
88a0: 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 72 65  hen increment re
88b0: 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 73 20 61  ference counts a
88c0: 6e 64 0a 20 20 2a 2a 20 72 65 74 75 72 6e 20 53  nd.  ** return S
88d0: 51 4c 49 54 45 5f 4f 4b 2e 0a 20 20 2a 2f 0a 20  QLITE_OK..  */. 
88e0: 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d   if( eFileLock==
88f0: 53 48 41 52 45 44 5f 4c 4f 43 4b 20 26 26 20 0a  SHARED_LOCK && .
8900: 20 20 20 20 20 20 28 70 49 6e 6f 64 65 2d 3e 65        (pInode->e
8910: 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
8920: 5f 4c 4f 43 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d  _LOCK || pInode-
8930: 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45  >eFileLock==RESE
8940: 52 56 45 44 5f 4c 4f 43 4b 29 20 29 7b 0a 20 20  RVED_LOCK) ){.  
8950: 20 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c    assert( eFileL
8960: 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
8970: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
8980: 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
8990: 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==0 );.    asser
89a0: 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72  t( pInode->nShar
89b0: 65 64 3e 30 20 29 3b 0a 20 20 20 20 70 46 69 6c  ed>0 );.    pFil
89c0: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53  e->eFileLock = S
89d0: 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20  HARED_LOCK;.    
89e0: 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2b  pInode->nShared+
89f0: 2b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e  +;.    pInode->n
8a00: 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 67 6f 74 6f  Lock++;.    goto
8a10: 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 7d 0a 0a   end_lock;.  }..
8a20: 0a 20 20 2f 2a 20 41 20 50 45 4e 44 49 4e 47 20  .  /* A PENDING 
8a30: 6c 6f 63 6b 20 69 73 20 6e 65 65 64 65 64 20 62  lock is needed b
8a40: 65 66 6f 72 65 20 61 63 71 75 69 72 69 6e 67 20  efore acquiring 
8a50: 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 61 6e  a SHARED lock an
8a60: 64 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20 61 63  d before.  ** ac
8a70: 71 75 69 72 69 6e 67 20 61 6e 20 45 58 43 4c 55  quiring an EXCLU
8a80: 53 49 56 45 20 6c 6f 63 6b 2e 20 20 46 6f 72 20  SIVE lock.  For 
8a90: 74 68 65 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c  the SHARED lock,
8aa0: 20 74 68 65 20 50 45 4e 44 49 4e 47 20 77 69 6c   the PENDING wil
8ab0: 6c 0a 20 20 2a 2a 20 62 65 20 72 65 6c 65 61 73  l.  ** be releas
8ac0: 65 64 2e 0a 20 20 2a 2f 0a 20 20 6c 6f 63 6b 2e  ed..  */.  lock.
8ad0: 6c 5f 6c 65 6e 20 3d 20 31 4c 3b 0a 20 20 6c 6f  l_len = 1L;.  lo
8ae0: 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45  ck.l_whence = SE
8af0: 45 4b 5f 53 45 54 3b 0a 20 20 69 66 28 20 65 46  EK_SET;.  if( eF
8b00: 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f  ileLock==SHARED_
8b10: 4c 4f 43 4b 20 0a 20 20 20 20 20 20 7c 7c 20 28  LOCK .      || (
8b20: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55  eFileLock==EXCLU
8b30: 53 49 56 45 5f 4c 4f 43 4b 20 26 26 20 70 46 69  SIVE_LOCK && pFi
8b40: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 50 45  le->eFileLock<PE
8b50: 4e 44 49 4e 47 5f 4c 4f 43 4b 29 0a 20 20 29 7b  NDING_LOCK).  ){
8b60: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65  .    lock.l_type
8b70: 20 3d 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53   = (eFileLock==S
8b80: 48 41 52 45 44 5f 4c 4f 43 4b 3f 46 5f 52 44 4c  HARED_LOCK?F_RDL
8b90: 43 4b 3a 46 5f 57 52 4c 43 4b 29 3b 0a 20 20 20  CK:F_WRLCK);.   
8ba0: 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20   lock.l_start = 
8bb0: 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20  PENDING_BYTE;.  
8bc0: 20 20 73 20 3d 20 66 63 6e 74 6c 28 70 46 69 6c    s = fcntl(pFil
8bd0: 65 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26  e->h, F_SETLK, &
8be0: 6c 6f 63 6b 29 3b 0a 20 20 20 20 69 66 28 20 73  lock);.    if( s
8bf0: 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20  ==(-1) ){.      
8c00: 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
8c10: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
8c20: 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45  eErrorFromPosixE
8c30: 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c  rror(tErrno, SQL
8c40: 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b  ITE_IOERR_LOCK);
8c50: 0a 20 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f  .      if( IS_LO
8c60: 43 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a  CK_ERROR(rc) ){.
8c70: 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c          pFile->l
8c80: 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e  astErrno = tErrn
8c90: 6f 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  o;.      }.     
8ca0: 20 67 6f 74 6f 20 65 6e 64 5f 6c 6f 63 6b 3b 0a   goto end_lock;.
8cb0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20 2f 2a      }.  }...  /*
8cc0: 20 49 66 20 63 6f 6e 74 72 6f 6c 20 67 65 74 73   If control gets
8cd0: 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 2c 20   to this point, 
8ce0: 74 68 65 6e 20 61 63 74 75 61 6c 6c 79 20 67 6f  then actually go
8cf0: 20 61 68 65 61 64 20 61 6e 64 20 6d 61 6b 65 0a   ahead and make.
8d00: 20 20 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 73    ** operating s
8d10: 79 73 74 65 6d 20 63 61 6c 6c 73 20 66 6f 72 20  ystem calls for 
8d20: 74 68 65 20 73 70 65 63 69 66 69 65 64 20 6c 6f  the specified lo
8d30: 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65  ck..  */.  if( e
8d40: 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44  FileLock==SHARED
8d50: 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73 73  _LOCK ){.    ass
8d60: 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68  ert( pInode->nSh
8d70: 61 72 65 64 3d 3d 30 20 29 3b 0a 20 20 20 20 61  ared==0 );.    a
8d80: 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 65  ssert( pInode->e
8d90: 46 69 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 0a  FileLock==0 );..
8da0: 20 20 20 20 2f 2a 20 4e 6f 77 20 67 65 74 20 74      /* Now get t
8db0: 68 65 20 72 65 61 64 2d 6c 6f 63 6b 20 2a 2f 0a  he read-lock */.
8dc0: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74      lock.l_start
8dd0: 20 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 3b   = SHARED_FIRST;
8de0: 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20  .    lock.l_len 
8df0: 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 3b 0a 20  = SHARED_SIZE;. 
8e00: 20 20 20 69 66 28 20 28 73 20 3d 20 66 63 6e 74     if( (s = fcnt
8e10: 6c 28 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 53 45  l(pFile->h, F_SE
8e20: 54 4c 4b 2c 20 26 6c 6f 63 6b 29 29 3d 3d 28 2d  TLK, &lock))==(-
8e30: 31 29 20 29 7b 0a 20 20 20 20 20 20 74 45 72 72  1) ){.      tErr
8e40: 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  no = errno;.    
8e50: 7d 0a 20 20 20 20 2f 2a 20 44 72 6f 70 20 74 68  }.    /* Drop th
8e60: 65 20 74 65 6d 70 6f 72 61 72 79 20 50 45 4e 44  e temporary PEND
8e70: 49 4e 47 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20  ING lock */.    
8e80: 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50  lock.l_start = P
8e90: 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20  ENDING_BYTE;.   
8ea0: 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 31 4c   lock.l_len = 1L
8eb0: 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70  ;.    lock.l_typ
8ec0: 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20  e = F_UNLCK;.   
8ed0: 20 69 66 28 20 66 63 6e 74 6c 28 70 46 69 6c 65   if( fcntl(pFile
8ee0: 2d 3e 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c  ->h, F_SETLK, &l
8ef0: 6f 63 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ock)!=0 ){.     
8f00: 20 69 66 28 20 73 20 21 3d 20 2d 31 20 29 7b 0a   if( s != -1 ){.
8f10: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20          /* This 
8f20: 63 6f 75 6c 64 20 68 61 70 70 65 6e 20 77 69 74  could happen wit
8f30: 68 20 61 20 6e 65 74 77 6f 72 6b 20 6d 6f 75 6e  h a network moun
8f40: 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 74 45 72  t */.        tEr
8f50: 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 20 0a 20 20  rno = errno; .  
8f60: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
8f70: 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45  eErrorFromPosixE
8f80: 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53 51 4c  rror(tErrno, SQL
8f90: 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
8fa0: 29 3b 20 0a 20 20 20 20 20 20 20 20 69 66 28 20  ); .        if( 
8fb0: 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63  IS_LOCK_ERROR(rc
8fc0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  ) ){.          p
8fd0: 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20  File->lastErrno 
8fe0: 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20  = tErrno;.      
8ff0: 20 20 7d 0a 20 20 20 20 20 20 20 20 67 6f 74 6f    }.        goto
9000: 20 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 20   end_lock;.     
9010: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
9020: 20 73 3d 3d 28 2d 31 29 20 29 7b 0a 20 20 20 20   s==(-1) ){.    
9030: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72    rc = sqliteErr
9040: 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72  orFromPosixError
9050: 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f  (tErrno, SQLITE_
9060: 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20  IOERR_LOCK);.   
9070: 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
9080: 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20  RROR(rc) ){.    
9090: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
90a0: 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20  rrno = tErrno;. 
90b0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
90c0: 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65  {.      pFile->e
90d0: 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41 52 45  FileLock = SHARE
90e0: 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 70 49  D_LOCK;.      pI
90f0: 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20  node->nLock++;. 
9100: 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53 68       pInode->nSh
9110: 61 72 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  ared = 1;.    }.
9120: 20 20 7d 65 6c 73 65 20 69 66 28 20 65 46 69 6c    }else if( eFil
9130: 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49 56 45  eLock==EXCLUSIVE
9140: 5f 4c 4f 43 4b 20 26 26 20 70 49 6e 6f 64 65 2d  _LOCK && pInode-
9150: 3e 6e 53 68 61 72 65 64 3e 31 20 29 7b 0a 20 20  >nShared>1 ){.  
9160: 20 20 2f 2a 20 57 65 20 61 72 65 20 74 72 79 69    /* We are tryi
9170: 6e 67 20 66 6f 72 20 61 6e 20 65 78 63 6c 75 73  ng for an exclus
9180: 69 76 65 20 6c 6f 63 6b 20 62 75 74 20 61 6e 6f  ive lock but ano
9190: 74 68 65 72 20 74 68 72 65 61 64 20 69 6e 20 74  ther thread in t
91a0: 68 69 73 0a 20 20 20 20 2a 2a 20 73 61 6d 65 20  his.    ** same 
91b0: 70 72 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c  process is still
91c0: 20 68 6f 6c 64 69 6e 67 20 61 20 73 68 61 72 65   holding a share
91d0: 64 20 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 20 20 72  d lock. */.    r
91e0: 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  c = SQLITE_BUSY;
91f0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
9200: 20 54 68 65 20 72 65 71 75 65 73 74 20 77 61 73   The request was
9210: 20 66 6f 72 20 61 20 52 45 53 45 52 56 45 44 20   for a RESERVED 
9220: 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  or EXCLUSIVE loc
9230: 6b 2e 20 20 49 74 20 69 73 0a 20 20 20 20 2a 2a  k.  It is.    **
9240: 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68   assumed that th
9250: 65 72 65 20 69 73 20 61 20 53 48 41 52 45 44 20  ere is a SHARED 
9260: 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20  or greater lock 
9270: 6f 6e 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20  on the file.    
9280: 2a 2a 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20  ** already..    
9290: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 30  */.    assert( 0
92a0: 21 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  !=pFile->eFileLo
92b0: 63 6b 20 29 3b 0a 20 20 20 20 6c 6f 63 6b 2e 6c  ck );.    lock.l
92c0: 5f 74 79 70 65 20 3d 20 46 5f 57 52 4c 43 4b 3b  _type = F_WRLCK;
92d0: 0a 20 20 20 20 73 77 69 74 63 68 28 20 65 46 69  .    switch( eFi
92e0: 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20  leLock ){.      
92f0: 63 61 73 65 20 52 45 53 45 52 56 45 44 5f 4c 4f  case RESERVED_LO
9300: 43 4b 3a 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b  CK:.        lock
9310: 2e 6c 5f 73 74 61 72 74 20 3d 20 52 45 53 45 52  .l_start = RESER
9320: 56 45 44 5f 42 59 54 45 3b 0a 20 20 20 20 20 20  VED_BYTE;.      
9330: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
9340: 61 73 65 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ase EXCLUSIVE_LO
9350: 43 4b 3a 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b  CK:.        lock
9360: 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45  .l_start = SHARE
9370: 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20 20  D_FIRST;.       
9380: 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48   lock.l_len = SH
9390: 41 52 45 44 5f 53 49 5a 45 3b 0a 20 20 20 20 20  ARED_SIZE;.     
93a0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
93b0: 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 20  default:.       
93c0: 20 61 73 73 65 72 74 28 30 29 3b 0a 20 20 20 20   assert(0);.    
93d0: 7d 0a 20 20 20 20 73 20 3d 20 66 63 6e 74 6c 28  }.    s = fcntl(
93e0: 70 46 69 6c 65 2d 3e 68 2c 20 46 5f 53 45 54 4c  pFile->h, F_SETL
93f0: 4b 2c 20 26 6c 6f 63 6b 29 3b 0a 20 20 20 20 69  K, &lock);.    i
9400: 66 28 20 73 3d 3d 28 2d 31 29 20 29 7b 0a 20 20  f( s==(-1) ){.  
9410: 20 20 20 20 74 45 72 72 6e 6f 20 3d 20 65 72 72      tErrno = err
9420: 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  no;.      rc = s
9430: 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
9440: 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c  sixError(tErrno,
9450: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f   SQLITE_IOERR_LO
9460: 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 49  CK);.      if( I
9470: 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 63 29  S_LOCK_ERROR(rc)
9480: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c   ){.        pFil
9490: 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74  e->lastErrno = t
94a0: 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 20  Errno;.      }. 
94b0: 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 0a 23 69 66     }.  }.  ..#if
94c0: 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 2f 2a  ndef NDEBUG.  /*
94d0: 20 53 65 74 20 75 70 20 74 68 65 20 74 72 61 6e   Set up the tran
94e0: 73 61 63 74 69 6f 6e 2d 63 6f 75 6e 74 65 72 20  saction-counter 
94f0: 63 68 61 6e 67 65 20 63 68 65 63 6b 69 6e 67 20  change checking 
9500: 66 6c 61 67 73 20 77 68 65 6e 0a 20 20 2a 2a 20  flags when.  ** 
9510: 74 72 61 6e 73 69 74 69 6f 6e 69 6e 67 20 66 72  transitioning fr
9520: 6f 6d 20 61 20 53 48 41 52 45 44 20 74 6f 20 61  om a SHARED to a
9530: 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2e 20   RESERVED lock. 
9540: 20 54 68 65 20 63 68 61 6e 67 65 0a 20 20 2a 2a   The change.  **
9550: 20 66 72 6f 6d 20 53 48 41 52 45 44 20 74 6f 20   from SHARED to 
9560: 52 45 53 45 52 56 45 44 20 6d 61 72 6b 73 20 74  RESERVED marks t
9570: 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
9580: 61 20 6e 6f 72 6d 61 6c 0a 20 20 2a 2a 20 77 72  a normal.  ** wr
9590: 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 20 28 6e  ite operation (n
95a0: 6f 74 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c  ot a hot journal
95b0: 20 72 6f 6c 6c 62 61 63 6b 29 2e 0a 20 20 2a 2f   rollback)..  */
95c0: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
95d0: 45 5f 4f 4b 0a 20 20 20 26 26 20 70 46 69 6c 65  E_OK.   && pFile
95e0: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41  ->eFileLock<=SHA
95f0: 52 45 44 5f 4c 4f 43 4b 0a 20 20 20 26 26 20 65  RED_LOCK.   && e
9600: 46 69 6c 65 4c 6f 63 6b 3d 3d 52 45 53 45 52 56  FileLock==RESERV
9610: 45 44 5f 4c 4f 43 4b 0a 20 20 29 7b 0a 20 20 20  ED_LOCK.  ){.   
9620: 20 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e 74   pFile->transCnt
9630: 72 43 68 6e 67 20 3d 20 30 3b 0a 20 20 20 20 70  rChng = 0;.    p
9640: 46 69 6c 65 2d 3e 64 62 55 70 64 61 74 65 20 3d  File->dbUpdate =
9650: 20 30 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 69   0;.    pFile->i
9660: 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 3d 20 31  nNormalWrite = 1
9670: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 0a 20  ;.  }.#endif... 
9680: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
9690: 4f 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  OK ){.    pFile-
96a0: 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69  >eFileLock = eFi
96b0: 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 70 49 6e 6f  leLock;.    pIno
96c0: 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  de->eFileLock = 
96d0: 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 7d 65 6c  eFileLock;.  }el
96e0: 73 65 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b  se if( eFileLock
96f0: 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
9700: 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65   ){.    pFile->e
9710: 46 69 6c 65 4c 6f 63 6b 20 3d 20 50 45 4e 44 49  FileLock = PENDI
9720: 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 20 20 70 49 6e  NG_LOCK;.    pIn
9730: 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ode->eFileLock =
9740: 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20   PENDING_LOCK;. 
9750: 20 7d 0a 0a 65 6e 64 5f 6c 6f 63 6b 3a 0a 20 20   }..end_lock:.  
9760: 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28 29  unixLeaveMutex()
9770: 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f  ;.  OSTRACE(("LO
9780: 43 4b 20 20 20 20 25 64 20 25 73 20 25 73 20 28  CK    %d %s %s (
9790: 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  unix)\n", pFile-
97a0: 3e 68 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65  >h, azFileLock(e
97b0: 46 69 6c 65 4c 6f 63 6b 29 2c 20 0a 20 20 20 20  FileLock), .    
97c0: 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20    rc==SQLITE_OK 
97d0: 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c 65 64  ? "ok" : "failed
97e0: 22 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  "));.  return rc
97f0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
9800: 20 61 6c 6c 20 66 69 6c 65 20 64 65 73 63 72 69   all file descri
9810: 70 74 6f 72 73 20 61 63 63 75 6d 75 61 74 65 64  ptors accumuated
9820: 20 69 6e 20 74 68 65 20 75 6e 69 78 49 6e 6f 64   in the unixInod
9830: 65 49 6e 66 6f 2d 3e 70 55 6e 75 73 65 64 20 6c  eInfo->pUnused l
9840: 69 73 74 2e 0a 2a 2a 20 49 66 20 61 6c 6c 20 73  ist..** If all s
9850: 75 63 68 20 66 69 6c 65 20 64 65 73 63 72 69 70  uch file descrip
9860: 74 6f 72 73 20 61 72 65 20 63 6c 6f 73 65 64 20  tors are closed 
9870: 77 69 74 68 6f 75 74 20 65 72 72 6f 72 2c 20 74  without error, t
9880: 68 65 20 6c 69 73 74 20 69 73 0a 2a 2a 20 63 6c  he list is.** cl
9890: 65 61 72 65 64 20 61 6e 64 20 53 51 4c 49 54 45  eared and SQLITE
98a0: 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a  _OK returned..**
98b0: 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69  .** Otherwise, i
98c0: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
98d0: 73 2c 20 74 68 65 6e 20 73 75 63 63 65 73 73 66  s, then successf
98e0: 75 6c 6c 79 20 63 6c 6f 73 65 64 20 66 69 6c 65  ully closed file
98f0: 20 64 65 73 63 72 69 70 74 6f 72 0a 2a 2a 20 65   descriptor.** e
9900: 6e 74 72 69 65 73 20 61 72 65 20 72 65 6d 6f 76  ntries are remov
9910: 65 64 20 66 72 6f 6d 20 74 68 65 20 6c 69 73 74  ed from the list
9920: 2c 20 61 6e 64 20 53 51 4c 49 54 45 5f 49 4f 45  , and SQLITE_IOE
9930: 52 52 5f 43 4c 4f 53 45 20 72 65 74 75 72 6e 65  RR_CLOSE returne
9940: 64 2e 20 0a 2a 2a 20 6e 6f 74 20 64 65 6c 65 74  d. .** not delet
9950: 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 49 4f  ed and SQLITE_IO
9960: 45 52 52 5f 43 4c 4f 53 45 20 72 65 74 75 72 6e  ERR_CLOSE return
9970: 65 64 2e 0a 2a 2f 20 0a 73 74 61 74 69 63 20 69  ed..*/ .static i
9980: 6e 74 20 63 6c 6f 73 65 50 65 6e 64 69 6e 67 46  nt closePendingF
9990: 64 73 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  ds(unixFile *pFi
99a0: 6c 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  le){.  int rc = 
99b0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73 74 72  SQLITE_OK;.  str
99c0: 75 63 74 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66  uct unixInodeInf
99d0: 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46 69 6c  o *pInode = pFil
99e0: 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 55 6e 69  e->pInode;.  Uni
99f0: 78 55 6e 75 73 65 64 46 64 20 2a 70 45 72 72 6f  xUnusedFd *pErro
9a00: 72 20 3d 20 30 3b 0a 20 20 55 6e 69 78 55 6e 75  r = 0;.  UnixUnu
9a10: 73 65 64 46 64 20 2a 70 3b 0a 20 20 55 6e 69 78  sedFd *p;.  Unix
9a20: 55 6e 75 73 65 64 46 64 20 2a 70 4e 65 78 74 3b  UnusedFd *pNext;
9a30: 0a 20 20 66 6f 72 28 70 3d 70 49 6e 6f 64 65 2d  .  for(p=pInode-
9a40: 3e 70 55 6e 75 73 65 64 3b 20 70 3b 20 70 3d 70  >pUnused; p; p=p
9a50: 4e 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74  Next){.    pNext
9a60: 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20   = p->pNext;.   
9a70: 20 69 66 28 20 63 6c 6f 73 65 28 70 2d 3e 66 64   if( close(p->fd
9a80: 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69 6c 65  ) ){.      pFile
9a90: 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72  ->lastErrno = er
9aa0: 72 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  rno;.      rc = 
9ab0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f  SQLITE_IOERR_CLO
9ac0: 53 45 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4e 65  SE;.      p->pNe
9ad0: 78 74 20 3d 20 70 45 72 72 6f 72 3b 0a 20 20 20  xt = pError;.   
9ae0: 20 20 20 70 45 72 72 6f 72 20 3d 20 70 3b 0a 20     pError = p;. 
9af0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
9b00: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
9b10: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 49 6e  .    }.  }.  pIn
9b20: 6f 64 65 2d 3e 70 55 6e 75 73 65 64 20 3d 20 70  ode->pUnused = p
9b30: 45 72 72 6f 72 3b 0a 20 20 72 65 74 75 72 6e 20  Error;.  return 
9b40: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  rc;.}../*.** Add
9b50: 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
9b60: 70 74 6f 72 20 75 73 65 64 20 62 79 20 66 69 6c  ptor used by fil
9b70: 65 20 68 61 6e 64 6c 65 20 70 46 69 6c 65 20 74  e handle pFile t
9b80: 6f 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  o the correspond
9b90: 69 6e 67 0a 2a 2a 20 70 55 6e 75 73 65 64 20 6c  ing.** pUnused l
9ba0: 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ist..*/.static v
9bb0: 6f 69 64 20 73 65 74 50 65 6e 64 69 6e 67 46 64  oid setPendingFd
9bc0: 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65  (unixFile *pFile
9bd0: 29 7b 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78  ){.  struct unix
9be0: 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49 6e 6f 64  InodeInfo *pInod
9bf0: 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  e = pFile->pInod
9c00: 65 3b 0a 20 20 55 6e 69 78 55 6e 75 73 65 64 46  e;.  UnixUnusedF
9c10: 64 20 2a 70 20 3d 20 70 46 69 6c 65 2d 3e 70 55  d *p = pFile->pU
9c20: 6e 75 73 65 64 3b 0a 20 20 70 2d 3e 70 4e 65 78  nused;.  p->pNex
9c30: 74 20 3d 20 70 49 6e 6f 64 65 2d 3e 70 55 6e 75  t = pInode->pUnu
9c40: 73 65 64 3b 0a 20 20 70 49 6e 6f 64 65 2d 3e 70  sed;.  pInode->p
9c50: 55 6e 75 73 65 64 20 3d 20 70 3b 0a 20 20 70 46  Unused = p;.  pF
9c60: 69 6c 65 2d 3e 68 20 3d 20 2d 31 3b 0a 20 20 70  ile->h = -1;.  p
9c70: 46 69 6c 65 2d 3e 70 55 6e 75 73 65 64 20 3d 20  File->pUnused = 
9c80: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65  0;.}../*.** Lowe
9c90: 72 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  r the locking le
9ca0: 76 65 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63  vel on file desc
9cb0: 72 69 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20  riptor pFile to 
9cc0: 65 46 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c  eFileLock.  eFil
9cd0: 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65  eLock.** must be
9ce0: 20 65 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20   either NO_LOCK 
9cf0: 6f 72 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a  or SHARED_LOCK..
9d00: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63  **.** If the loc
9d10: 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68  king level of th
9d20: 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
9d30: 72 20 69 73 20 61 6c 72 65 61 64 79 20 61 74 20  r is already at 
9d40: 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20  or below.** the 
9d50: 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e  requested lockin
9d60: 67 20 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f  g level, this ro
9d70: 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
9d80: 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 68 61 6e 64  ..** .** If hand
9d90: 6c 65 4e 46 53 55 6e 6c 6f 63 6b 20 69 73 20 74  leNFSUnlock is t
9da0: 72 75 65 2c 20 74 68 65 6e 20 6f 6e 20 64 6f 77  rue, then on dow
9db0: 6e 67 72 61 64 69 6e 67 20 61 6e 20 45 58 43 4c  ngrading an EXCL
9dc0: 55 53 49 56 45 5f 4c 4f 43 4b 20 74 6f 20 53 48  USIVE_LOCK to SH
9dd0: 41 52 45 44 0a 2a 2a 20 74 68 65 20 62 79 74 65  ARED.** the byte
9de0: 20 72 61 6e 67 65 20 69 73 20 64 69 76 69 64 65   range is divide
9df0: 64 20 69 6e 74 6f 20 32 20 70 61 72 74 73 20 61  d into 2 parts a
9e00: 6e 64 20 74 68 65 20 66 69 72 73 74 20 70 61 72  nd the first par
9e10: 74 20 69 73 20 75 6e 6c 6f 63 6b 65 64 20 74 68  t is unlocked th
9e20: 65 6e 0a 2a 2a 20 73 65 74 20 74 6f 20 61 20 72  en.** set to a r
9e30: 65 61 64 20 6c 6f 63 6b 2c 20 74 68 65 6e 20 74  ead lock, then t
9e40: 68 65 20 6f 74 68 65 72 20 70 61 72 74 20 69 73  he other part is
9e50: 20 73 69 6d 70 6c 79 20 75 6e 6c 6f 63 6b 65 64   simply unlocked
9e60: 2e 20 20 54 68 69 73 20 77 6f 72 6b 73 20 0a 2a  .  This works .*
9e70: 2a 20 61 72 6f 75 6e 64 20 61 20 62 75 67 20 69  * around a bug i
9e80: 6e 20 42 53 44 20 4e 46 53 20 6c 6f 63 6b 64 20  n BSD NFS lockd 
9e90: 28 61 6c 73 6f 20 73 65 65 6e 20 6f 6e 20 4d 61  (also seen on Ma
9ea0: 63 4f 53 58 20 31 30 2e 33 2b 29 20 74 68 61 74  cOSX 10.3+) that
9eb0: 20 66 61 69 6c 73 20 74 6f 20 0a 2a 2a 20 72 65   fails to .** re
9ec0: 6d 6f 76 65 20 74 68 65 20 77 72 69 74 65 20 6c  move the write l
9ed0: 6f 63 6b 20 6f 6e 20 61 20 72 65 67 69 6f 6e 20  ock on a region 
9ee0: 77 68 65 6e 20 61 20 72 65 61 64 20 6c 6f 63 6b  when a read lock
9ef0: 20 69 73 20 73 65 74 2e 0a 2a 2f 0a 73 74 61 74   is set..*/.stat
9f00: 69 63 20 69 6e 74 20 5f 70 6f 73 69 78 55 6e 6c  ic int _posixUnl
9f10: 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
9f20: 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c   *id, int eFileL
9f30: 6f 63 6b 2c 20 69 6e 74 20 68 61 6e 64 6c 65 4e  ock, int handleN
9f40: 46 53 55 6e 6c 6f 63 6b 29 7b 0a 20 20 75 6e 69  FSUnlock){.  uni
9f50: 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
9f60: 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20  unixFile*)id;.  
9f70: 73 74 72 75 63 74 20 75 6e 69 78 49 6e 6f 64 65  struct unixInode
9f80: 49 6e 66 6f 20 2a 70 49 6e 6f 64 65 3b 0a 20 20  Info *pInode;.  
9f90: 73 74 72 75 63 74 20 66 6c 6f 63 6b 20 6c 6f 63  struct flock loc
9fa0: 6b 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  k;.  int rc = SQ
9fb0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 68  LITE_OK;.  int h
9fc0: 3b 0a 20 20 69 6e 74 20 74 45 72 72 6e 6f 3b 20  ;.  int tErrno; 
9fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9fe0: 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f       /* Error co
9ff0: 64 65 20 66 72 6f 6d 20 73 79 73 74 65 6d 20 63  de from system c
a000: 61 6c 6c 20 65 72 72 6f 72 73 20 2a 2f 0a 0a 20  all errors */.. 
a010: 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
a020: 3b 0a 20 20 4f 53 54 52 41 43 45 28 28 22 55 4e  ;.  OSTRACE(("UN
a030: 4c 4f 43 4b 20 20 25 64 20 25 64 20 77 61 73 20  LOCK  %d %d was 
a040: 25 64 28 25 64 2c 25 64 29 20 70 69 64 3d 25 64  %d(%d,%d) pid=%d
a050: 20 28 75 6e 69 78 29 5c 6e 22 2c 20 70 46 69 6c   (unix)\n", pFil
a060: 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c  e->h, eFileLock,
a070: 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46  .      pFile->eF
a080: 69 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e  ileLock, pFile->
a090: 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
a0a0: 6b 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  k, pFile->pInode
a0b0: 2d 3e 6e 53 68 61 72 65 64 2c 0a 20 20 20 20 20  ->nShared,.     
a0c0: 20 67 65 74 70 69 64 28 29 29 29 3b 0a 0a 20 20   getpid()));..  
a0d0: 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f 63  assert( eFileLoc
a0e0: 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  k<=SHARED_LOCK )
a0f0: 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65  ;.  if( pFile->e
a100: 46 69 6c 65 4c 6f 63 6b 3c 3d 65 46 69 6c 65 4c  FileLock<=eFileL
a110: 6f 63 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ock ){.    retur
a120: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
a130: 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  .  unixEnterMute
a140: 78 28 29 3b 0a 20 20 68 20 3d 20 70 46 69 6c 65  x();.  h = pFile
a150: 2d 3e 68 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20  ->h;.  pInode = 
a160: 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20  pFile->pInode;. 
a170: 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d   assert( pInode-
a180: 3e 6e 53 68 61 72 65 64 21 3d 30 20 29 3b 0a 20  >nShared!=0 );. 
a190: 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c   if( pFile->eFil
a1a0: 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43  eLock>SHARED_LOC
a1b0: 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  K ){.    assert(
a1c0: 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f   pInode->eFileLo
a1d0: 63 6b 3d 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65  ck==pFile->eFile
a1e0: 4c 6f 63 6b 20 29 3b 0a 20 20 20 20 53 69 6d 75  Lock );.    Simu
a1f0: 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69 67  lateIOErrorBenig
a200: 6e 28 31 29 3b 0a 20 20 20 20 53 69 6d 75 6c 61  n(1);.    Simula
a210: 74 65 49 4f 45 72 72 6f 72 28 20 68 3d 28 2d 31  teIOError( h=(-1
a220: 29 20 29 0a 20 20 20 20 53 69 6d 75 6c 61 74 65  ) ).    Simulate
a230: 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29  IOErrorBenign(0)
a240: 3b 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  ;..#ifndef NDEBU
a250: 47 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 72 65  G.    /* When re
a260: 64 75 63 69 6e 67 20 61 20 6c 6f 63 6b 20 73 75  ducing a lock su
a270: 63 68 20 74 68 61 74 20 6f 74 68 65 72 20 70 72  ch that other pr
a280: 6f 63 65 73 73 65 73 20 63 61 6e 20 73 74 61 72  ocesses can star
a290: 74 0a 20 20 20 20 2a 2a 20 72 65 61 64 69 6e 67  t.    ** reading
a2a0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
a2b0: 6c 65 20 61 67 61 69 6e 2c 20 6d 61 6b 65 20 73  le again, make s
a2c0: 75 72 65 20 74 68 61 74 20 74 68 65 0a 20 20 20  ure that the.   
a2d0: 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
a2e0: 63 6f 75 6e 74 65 72 20 77 61 73 20 75 70 64 61  counter was upda
a2f0: 74 65 64 20 69 66 20 61 6e 79 20 70 61 72 74 20  ted if any part 
a300: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  of the database.
a310: 20 20 20 20 2a 2a 20 66 69 6c 65 20 63 68 61 6e      ** file chan
a320: 67 65 64 2e 20 20 49 66 20 74 68 65 20 74 72 61  ged.  If the tra
a330: 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72  nsaction counter
a340: 20 69 73 20 6e 6f 74 20 75 70 64 61 74 65 64 2c   is not updated,
a350: 0a 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 63 6f  .    ** other co
a360: 6e 6e 65 63 74 69 6f 6e 73 20 74 6f 20 74 68 65  nnections to the
a370: 20 73 61 6d 65 20 66 69 6c 65 20 6d 69 67 68 74   same file might
a380: 20 6e 6f 74 20 72 65 61 6c 69 7a 65 20 74 68 61   not realize tha
a390: 74 0a 20 20 20 20 2a 2a 20 74 68 65 20 66 69 6c  t.    ** the fil
a3a0: 65 20 68 61 73 20 63 68 61 6e 67 65 64 20 61 6e  e has changed an
a3b0: 64 20 68 65 6e 63 65 20 6d 69 67 68 74 20 6e 6f  d hence might no
a3c0: 74 20 6b 6e 6f 77 20 74 6f 20 66 6c 75 73 68 20  t know to flush 
a3d0: 74 68 65 69 72 0a 20 20 20 20 2a 2a 20 63 61 63  their.    ** cac
a3e0: 68 65 2e 20 20 54 68 65 20 75 73 65 20 6f 66 20  he.  The use of 
a3f0: 61 20 73 74 61 6c 65 20 63 61 63 68 65 20 63 61  a stale cache ca
a400: 6e 20 6c 65 61 64 20 74 6f 20 64 61 74 61 62 61  n lead to databa
a410: 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 20  se corruption.. 
a420: 20 20 20 2a 2f 0a 23 69 66 20 30 0a 20 20 20 20     */.#if 0.    
a430: 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 69  assert( pFile->i
a440: 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 3d 3d 30 0a  nNormalWrite==0.
a450: 20 20 20 20 20 20 20 20 20 7c 7c 20 70 46 69 6c           || pFil
a460: 65 2d 3e 64 62 55 70 64 61 74 65 3d 3d 30 0a 20  e->dbUpdate==0. 
a470: 20 20 20 20 20 20 20 20 7c 7c 20 70 46 69 6c 65          || pFile
a480: 2d 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e 67 3d  ->transCntrChng=
a490: 3d 31 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  =1 );.#endif.   
a4a0: 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c   pFile->inNormal
a4b0: 57 72 69 74 65 20 3d 20 30 3b 0a 23 65 6e 64 69  Write = 0;.#endi
a4c0: 66 0a 0a 20 20 20 20 2f 2a 20 64 6f 77 6e 67 72  f..    /* downgr
a4d0: 61 64 69 6e 67 20 74 6f 20 61 20 73 68 61 72 65  ading to a share
a4e0: 64 20 6c 6f 63 6b 20 6f 6e 20 4e 46 53 20 69 6e  d lock on NFS in
a4f0: 76 6f 6c 76 65 73 20 63 6c 65 61 72 69 6e 67 20  volves clearing 
a500: 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 0a 20  the write lock. 
a510: 20 20 20 2a 2a 20 62 65 66 6f 72 65 20 65 73 74     ** before est
a520: 61 62 6c 69 73 68 69 6e 67 20 74 68 65 20 72 65  ablishing the re
a530: 61 64 6c 6f 63 6b 20 2d 20 74 6f 20 61 76 6f 69  adlock - to avoi
a540: 64 20 61 20 72 61 63 65 20 63 6f 6e 64 69 74 69  d a race conditi
a550: 6f 6e 20 77 65 20 64 6f 77 6e 67 72 61 64 65 0a  on we downgrade.
a560: 20 20 20 20 2a 2a 20 74 68 65 20 6c 6f 63 6b 20      ** the lock 
a570: 69 6e 20 32 20 62 6c 6f 63 6b 73 2c 20 73 6f 20  in 2 blocks, so 
a580: 74 68 61 74 20 70 61 72 74 20 6f 66 20 74 68 65  that part of the
a590: 20 72 61 6e 67 65 20 77 69 6c 6c 20 62 65 20 63   range will be c
a5a0: 6f 76 65 72 65 64 20 62 79 20 61 20 0a 20 20 20  overed by a .   
a5b0: 20 2a 2a 20 77 72 69 74 65 20 6c 6f 63 6b 20 75   ** write lock u
a5c0: 6e 74 69 6c 20 74 68 65 20 72 65 73 74 20 69 73  ntil the rest is
a5d0: 20 63 6f 76 65 72 65 64 20 62 79 20 61 20 72 65   covered by a re
a5e0: 61 64 20 6c 6f 63 6b 3a 0a 20 20 20 20 2a 2a 20  ad lock:.    ** 
a5f0: 20 31 3a 20 20 20 5b 57 57 57 57 57 5d 0a 20 20   1:   [WWWWW].  
a600: 20 20 2a 2a 20 20 32 3a 20 20 20 5b 2e 2e 2e 2e    **  2:   [....
a610: 57 5d 0a 20 20 20 20 2a 2a 20 20 33 3a 20 20 20  W].    **  3:   
a620: 5b 52 52 52 52 57 5d 0a 20 20 20 20 2a 2a 20 20  [RRRRW].    **  
a630: 34 3a 20 20 20 5b 52 52 52 52 2e 5d 0a 20 20 20  4:   [RRRR.].   
a640: 20 2a 2f 0a 20 20 20 20 69 66 28 20 65 46 69 6c   */.    if( eFil
a650: 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
a660: 43 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  CK ){.      if( 
a670: 68 61 6e 64 6c 65 4e 46 53 55 6e 6c 6f 63 6b 20  handleNFSUnlock 
a680: 29 7b 0a 20 20 20 20 20 20 20 20 6f 66 66 5f 74  ){.        off_t
a690: 20 64 69 76 53 69 7a 65 20 3d 20 53 48 41 52 45   divSize = SHARE
a6a0: 44 5f 53 49 5a 45 20 2d 20 31 3b 0a 20 20 20 20  D_SIZE - 1;.    
a6b0: 20 20 20 20 0a 20 20 20 20 20 20 20 20 6c 6f 63      .        loc
a6c0: 6b 2e 6c 5f 74 79 70 65 20 3d 20 46 5f 55 4e 4c  k.l_type = F_UNL
a6d0: 43 4b 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b  CK;.        lock
a6e0: 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b  .l_whence = SEEK
a6f0: 5f 53 45 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f  _SET;.        lo
a700: 63 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41  ck.l_start = SHA
a710: 52 45 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20  RED_FIRST;.     
a720: 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20     lock.l_len = 
a730: 64 69 76 53 69 7a 65 3b 0a 20 20 20 20 20 20 20  divSize;.       
a740: 20 69 66 28 20 66 63 6e 74 6c 28 68 2c 20 46 5f   if( fcntl(h, F_
a750: 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3d 3d 28  SETLK, &lock)==(
a760: 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  -1) ){.         
a770: 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
a780: 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
a790: 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
a7a0: 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
a7b0: 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  , SQLITE_IOERR_U
a7c0: 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20  NLOCK);.        
a7d0: 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52    if( IS_LOCK_ER
a7e0: 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20  ROR(rc) ){.     
a7f0: 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61         pFile->la
a800: 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f  stErrno = tErrno
a810: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
a820: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
a830: 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20  _unlock;.       
a840: 20 7d 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e   }.        lock.
a850: 6c 5f 74 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b  l_type = F_RDLCK
a860: 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  ;.        lock.l
a870: 5f 77 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53  _whence = SEEK_S
a880: 45 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b  ET;.        lock
a890: 2e 6c 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45  .l_start = SHARE
a8a0: 44 5f 46 49 52 53 54 3b 0a 20 20 20 20 20 20 20  D_FIRST;.       
a8b0: 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 64 69   lock.l_len = di
a8c0: 76 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69  vSize;.        i
a8d0: 66 28 20 66 63 6e 74 6c 28 68 2c 20 46 5f 53 45  f( fcntl(h, F_SE
a8e0: 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3d 3d 28 2d 31  TLK, &lock)==(-1
a8f0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74  ) ){.          t
a900: 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
a910: 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
a920: 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73  liteErrorFromPos
a930: 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20  ixError(tErrno, 
a940: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c  SQLITE_IOERR_RDL
a950: 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  OCK);.          
a960: 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f  if( IS_LOCK_ERRO
a970: 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20 20  R(rc) ){.       
a980: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
a990: 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a  Errno = tErrno;.
a9a0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
a9b0: 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 75        goto end_u
a9c0: 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d  nlock;.        }
a9d0: 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  .        lock.l_
a9e0: 74 79 70 65 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a  type = F_UNLCK;.
a9f0: 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77          lock.l_w
aa00: 68 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54  hence = SEEK_SET
aa10: 3b 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c  ;.        lock.l
aa20: 5f 73 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f  _start = SHARED_
aa30: 46 49 52 53 54 2b 64 69 76 53 69 7a 65 3b 0a 20  FIRST+divSize;. 
aa40: 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 6c 65         lock.l_le
aa50: 6e 20 3d 20 53 48 41 52 45 44 5f 53 49 5a 45 2d  n = SHARED_SIZE-
aa60: 64 69 76 53 69 7a 65 3b 0a 20 20 20 20 20 20 20  divSize;.       
aa70: 20 69 66 28 20 66 63 6e 74 6c 28 68 2c 20 46 5f   if( fcntl(h, F_
aa80: 53 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3d 3d 28  SETLK, &lock)==(
aa90: 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  -1) ){.         
aaa0: 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b   tErrno = errno;
aab0: 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
aac0: 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
aad0: 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
aae0: 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  , SQLITE_IOERR_U
aaf0: 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20  NLOCK);.        
ab00: 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52    if( IS_LOCK_ER
ab10: 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20  ROR(rc) ){.     
ab20: 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61         pFile->la
ab30: 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f  stErrno = tErrno
ab40: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
ab50: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
ab60: 5f 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20  _unlock;.       
ab70: 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
ab80: 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74          lock.l_t
ab90: 79 70 65 20 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20  ype = F_RDLCK;. 
aba0: 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 77 68         lock.l_wh
abb0: 65 6e 63 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b  ence = SEEK_SET;
abc0: 0a 20 20 20 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f  .        lock.l_
abd0: 73 74 61 72 74 20 3d 20 53 48 41 52 45 44 5f 46  start = SHARED_F
abe0: 49 52 53 54 3b 0a 20 20 20 20 20 20 20 20 6c 6f  IRST;.        lo
abf0: 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 53 48 41 52 45  ck.l_len = SHARE
ac00: 44 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20 20 20  D_SIZE;.        
ac10: 69 66 28 20 66 63 6e 74 6c 28 68 2c 20 46 5f 53  if( fcntl(h, F_S
ac20: 45 54 4c 4b 2c 20 26 6c 6f 63 6b 29 3d 3d 28 2d  ETLK, &lock)==(-
ac30: 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  1) ){.          
ac40: 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
ac50: 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
ac60: 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
ac70: 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c  sixError(tErrno,
ac80: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44   SQLITE_IOERR_RD
ac90: 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 20  LOCK);.         
aca0: 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52   if( IS_LOCK_ERR
acb0: 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20  OR(rc) ){.      
acc0: 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73        pFile->las
acd0: 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b  tErrno = tErrno;
ace0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
acf0: 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
ad00: 75 6e 6c 6f 63 6b 3b 0a 20 20 20 20 20 20 20 20  unlock;.        
ad10: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
ad20: 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65 20      lock.l_type 
ad30: 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20 6c  = F_UNLCK;.    l
ad40: 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53  ock.l_whence = S
ad50: 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20 6c 6f 63  EEK_SET;.    loc
ad60: 6b 2e 6c 5f 73 74 61 72 74 20 3d 20 50 45 4e 44  k.l_start = PEND
ad70: 49 4e 47 5f 42 59 54 45 3b 0a 20 20 20 20 6c 6f  ING_BYTE;.    lo
ad80: 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 32 4c 3b 20 20  ck.l_len = 2L;  
ad90: 61 73 73 65 72 74 28 20 50 45 4e 44 49 4e 47 5f  assert( PENDING_
ada0: 42 59 54 45 2b 31 3d 3d 52 45 53 45 52 56 45 44  BYTE+1==RESERVED
adb0: 5f 42 59 54 45 20 29 3b 0a 20 20 20 20 69 66 28  _BYTE );.    if(
adc0: 20 66 63 6e 74 6c 28 68 2c 20 46 5f 53 45 54 4c   fcntl(h, F_SETL
add0: 4b 2c 20 26 6c 6f 63 6b 29 21 3d 28 2d 31 29 20  K, &lock)!=(-1) 
ade0: 29 7b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d  ){.      pInode-
adf0: 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 53 48 41  >eFileLock = SHA
ae00: 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 65  RED_LOCK;.    }e
ae10: 6c 73 65 7b 0a 20 20 20 20 20 20 74 45 72 72 6e  lse{.      tErrn
ae20: 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20  o = errno;.     
ae30: 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f   rc = sqliteErro
ae40: 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28  rFromPosixError(
ae50: 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49  tErrno, SQLITE_I
ae60: 4f 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 20 20  OERR_UNLOCK);.  
ae70: 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f      if( IS_LOCK_
ae80: 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20  ERROR(rc) ){.   
ae90: 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
aea0: 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a  Errno = tErrno;.
aeb0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f        }.      go
aec0: 74 6f 20 65 6e 64 5f 75 6e 6c 6f 63 6b 3b 0a 20  to end_unlock;. 
aed0: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 65     }.  }.  if( e
aee0: 46 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43  FileLock==NO_LOC
aef0: 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 44 65 63 72  K ){.    /* Decr
af00: 65 6d 65 6e 74 20 74 68 65 20 73 68 61 72 65 64  ement the shared
af10: 20 6c 6f 63 6b 20 63 6f 75 6e 74 65 72 2e 20 20   lock counter.  
af20: 52 65 6c 65 61 73 65 20 74 68 65 20 6c 6f 63 6b  Release the lock
af30: 20 75 73 69 6e 67 20 61 6e 0a 20 20 20 20 2a 2a   using an.    **
af40: 20 4f 53 20 63 61 6c 6c 20 6f 6e 6c 79 20 77 68   OS call only wh
af50: 65 6e 20 61 6c 6c 20 74 68 72 65 61 64 73 20 69  en all threads i
af60: 6e 20 74 68 69 73 20 73 61 6d 65 20 70 72 6f 63  n this same proc
af70: 65 73 73 20 68 61 76 65 20 72 65 6c 65 61 73 65  ess have release
af80: 64 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c 6f 63  d.    ** the loc
af90: 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 49  k..    */.    pI
afa0: 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 2d 2d 3b  node->nShared--;
afb0: 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d  .    if( pInode-
afc0: 3e 6e 53 68 61 72 65 64 3d 3d 30 20 29 7b 0a 20  >nShared==0 ){. 
afd0: 20 20 20 20 20 6c 6f 63 6b 2e 6c 5f 74 79 70 65       lock.l_type
afe0: 20 3d 20 46 5f 55 4e 4c 43 4b 3b 0a 20 20 20 20   = F_UNLCK;.    
aff0: 20 20 6c 6f 63 6b 2e 6c 5f 77 68 65 6e 63 65 20    lock.l_whence 
b000: 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 20 20  = SEEK_SET;.    
b010: 20 20 6c 6f 63 6b 2e 6c 5f 73 74 61 72 74 20 3d    lock.l_start =
b020: 20 6c 6f 63 6b 2e 6c 5f 6c 65 6e 20 3d 20 30 4c   lock.l_len = 0L
b030: 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65  ;.      Simulate
b040: 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31 29  IOErrorBenign(1)
b050: 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65  ;.      Simulate
b060: 49 4f 45 72 72 6f 72 28 20 68 3d 28 2d 31 29 20  IOError( h=(-1) 
b070: 29 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65  ).      Simulate
b080: 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29  IOErrorBenign(0)
b090: 3b 0a 20 20 20 20 20 20 69 66 28 20 66 63 6e 74  ;.      if( fcnt
b0a0: 6c 28 68 2c 20 46 5f 53 45 54 4c 4b 2c 20 26 6c  l(h, F_SETLK, &l
b0b0: 6f 63 6b 29 21 3d 28 2d 31 29 20 29 7b 0a 20 20  ock)!=(-1) ){.  
b0c0: 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46        pInode->eF
b0d0: 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43  ileLock = NO_LOC
b0e0: 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  K;.      }else{.
b0f0: 20 20 20 20 20 20 20 20 74 45 72 72 6e 6f 20 3d          tErrno =
b100: 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20   errno;.        
b110: 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72  rc = sqliteError
b120: 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74  FromPosixError(t
b130: 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f  Errno, SQLITE_IO
b140: 45 52 52 5f 55 4e 4c 4f 43 4b 29 3b 0a 20 20 20  ERR_UNLOCK);.   
b150: 20 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b       if( IS_LOCK
b160: 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20 20  _ERROR(rc) ){.  
b170: 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c          pFile->l
b180: 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e  astErrno = tErrn
b190: 6f 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  o;.        }.   
b1a0: 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 65 46 69       pInode->eFi
b1b0: 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b  leLock = NO_LOCK
b1c0: 3b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d  ;.        pFile-
b1d0: 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f  >eFileLock = NO_
b1e0: 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  LOCK;.      }.  
b1f0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72    }..    /* Decr
b200: 65 6d 65 6e 74 20 74 68 65 20 63 6f 75 6e 74 20  ement the count 
b210: 6f 66 20 6c 6f 63 6b 73 20 61 67 61 69 6e 73 74  of locks against
b220: 20 74 68 69 73 20 73 61 6d 65 20 66 69 6c 65 2e   this same file.
b230: 20 20 57 68 65 6e 20 74 68 65 0a 20 20 20 20 2a    When the.    *
b240: 2a 20 63 6f 75 6e 74 20 72 65 61 63 68 65 73 20  * count reaches 
b250: 7a 65 72 6f 2c 20 63 6c 6f 73 65 20 61 6e 79 20  zero, close any 
b260: 6f 74 68 65 72 20 66 69 6c 65 20 64 65 73 63 72  other file descr
b270: 69 70 74 6f 72 73 20 77 68 6f 73 65 20 63 6c 6f  iptors whose clo
b280: 73 65 0a 20 20 20 20 2a 2a 20 77 61 73 20 64 65  se.    ** was de
b290: 66 65 72 72 65 64 20 62 65 63 61 75 73 65 20 6f  ferred because o
b2a0: 66 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f  f outstanding lo
b2b0: 63 6b 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  cks..    */.    
b2c0: 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63 6b 2d 2d 3b  pInode->nLock--;
b2d0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 6e  .    assert( pIn
b2e0: 6f 64 65 2d 3e 6e 4c 6f 63 6b 3e 3d 30 20 29 3b  ode->nLock>=0 );
b2f0: 0a 20 20 20 20 69 66 28 20 70 49 6e 6f 64 65 2d  .    if( pInode-
b300: 3e 6e 4c 6f 63 6b 3d 3d 30 20 29 7b 0a 20 20 20  >nLock==0 ){.   
b310: 20 20 20 69 6e 74 20 72 63 32 20 3d 20 63 6c 6f     int rc2 = clo
b320: 73 65 50 65 6e 64 69 6e 67 46 64 73 28 70 46 69  sePendingFds(pFi
b330: 6c 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  le);.      if( r
b340: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
b350: 20 20 20 20 20 20 20 20 72 63 20 3d 20 72 63 32          rc = rc2
b360: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
b370: 20 20 7d 0a 09 0a 65 6e 64 5f 75 6e 6c 6f 63 6b    }...end_unlock
b380: 3a 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74  :.  unixLeaveMut
b390: 65 78 28 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  ex();.  if( rc==
b3a0: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70 46 69 6c  SQLITE_OK ) pFil
b3b0: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65  e->eFileLock = e
b3c0: 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 72 65 74 75  FileLock;.  retu
b3d0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
b3e0: 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e  Lower the lockin
b3f0: 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20  g level on file 
b400: 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65  descriptor pFile
b410: 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20   to eFileLock.  
b420: 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73  eFileLock.** mus
b430: 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c  t be either NO_L
b440: 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f  OCK or SHARED_LO
b450: 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  CK..**.** If the
b460: 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
b470: 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  f the file descr
b480: 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79  iptor is already
b490: 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20   at or below.** 
b4a0: 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
b4b0: 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69  cking level, thi
b4c0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
b4d0: 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
b4e0: 69 6e 74 20 75 6e 69 78 55 6e 6c 6f 63 6b 28 73  int unixUnlock(s
b4f0: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
b500: 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 7b   int eFileLock){
b510: 0a 20 20 72 65 74 75 72 6e 20 5f 70 6f 73 69 78  .  return _posix
b520: 55 6e 6c 6f 63 6b 28 69 64 2c 20 65 46 69 6c 65  Unlock(id, eFile
b530: 4c 6f 63 6b 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a  Lock, 0);.}../*.
b540: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
b550: 20 70 65 72 66 6f 72 6d 73 20 74 68 65 20 70 61   performs the pa
b560: 72 74 73 20 6f 66 20 74 68 65 20 22 63 6c 6f 73  rts of the "clos
b570: 65 20 66 69 6c 65 22 20 6f 70 65 72 61 74 69 6f  e file" operatio
b580: 6e 20 0a 2a 2a 20 63 6f 6d 6d 6f 6e 20 74 6f 20  n .** common to 
b590: 61 6c 6c 20 6c 6f 63 6b 69 6e 67 20 73 63 68 65  all locking sche
b5a0: 6d 65 73 2e 20 49 74 20 63 6c 6f 73 65 73 20 74  mes. It closes t
b5b0: 68 65 20 64 69 72 65 63 74 6f 72 79 20 61 6e 64  he directory and
b5c0: 20 66 69 6c 65 0a 2a 2a 20 68 61 6e 64 6c 65 73   file.** handles
b5d0: 2c 20 69 66 20 74 68 65 79 20 61 72 65 20 76 61  , if they are va
b5e0: 6c 69 64 2c 20 61 6e 64 20 73 65 74 73 20 61 6c  lid, and sets al
b5f0: 6c 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20  l fields of the 
b600: 75 6e 69 78 46 69 6c 65 0a 2a 2a 20 73 74 72 75  unixFile.** stru
b610: 63 74 75 72 65 20 74 6f 20 30 2e 0a 2a 2a 0a 2a  cture to 0..**.*
b620: 2a 20 49 74 20 69 73 20 2a 6e 6f 74 2a 20 6e 65  * It is *not* ne
b630: 63 65 73 73 61 72 79 20 74 6f 20 68 6f 6c 64 20  cessary to hold 
b640: 74 68 65 20 6d 75 74 65 78 20 77 68 65 6e 20 74  the mutex when t
b650: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
b660: 61 6c 6c 65 64 2c 0a 2a 2a 20 65 76 65 6e 20 6f  alled,.** even o
b670: 6e 20 56 78 57 6f 72 6b 73 2e 20 20 41 20 6d 75  n VxWorks.  A mu
b680: 74 65 78 20 77 69 6c 6c 20 62 65 20 61 63 71 75  tex will be acqu
b690: 69 72 65 64 20 6f 6e 20 56 78 57 6f 72 6b 73 20  ired on VxWorks 
b6a0: 62 79 20 74 68 65 0a 2a 2a 20 76 78 77 6f 72 6b  by the.** vxwork
b6b0: 73 52 65 6c 65 61 73 65 46 69 6c 65 49 64 28 29  sReleaseFileId()
b6c0: 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 61   routine..*/.sta
b6d0: 74 69 63 20 69 6e 74 20 63 6c 6f 73 65 55 6e 69  tic int closeUni
b6e0: 78 46 69 6c 65 28 73 71 6c 69 74 65 33 5f 66 69  xFile(sqlite3_fi
b6f0: 6c 65 20 2a 69 64 29 7b 0a 20 20 75 6e 69 78 46  le *id){.  unixF
b700: 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
b710: 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 66  ixFile*)id;.  if
b720: 28 20 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 69  ( pFile ){.    i
b730: 66 28 20 70 46 69 6c 65 2d 3e 64 69 72 66 64 3e  f( pFile->dirfd>
b740: 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  =0 ){.      int 
b750: 65 72 72 20 3d 20 63 6c 6f 73 65 28 70 46 69 6c  err = close(pFil
b760: 65 2d 3e 64 69 72 66 64 29 3b 0a 20 20 20 20 20  e->dirfd);.     
b770: 20 69 66 28 20 65 72 72 20 29 7b 0a 20 20 20 20   if( err ){.    
b780: 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
b790: 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
b7a0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
b7b0: 49 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f 43 4c  ITE_IOERR_DIR_CL
b7c0: 4f 53 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  OSE;.      }else
b7d0: 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d  {.        pFile-
b7e0: 3e 64 69 72 66 64 3d 2d 31 3b 0a 20 20 20 20 20  >dirfd=-1;.     
b7f0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
b800: 20 70 46 69 6c 65 2d 3e 68 3e 3d 30 20 29 7b 0a   pFile->h>=0 ){.
b810: 20 20 20 20 20 20 69 6e 74 20 65 72 72 20 3d 20        int err = 
b820: 63 6c 6f 73 65 28 70 46 69 6c 65 2d 3e 68 29 3b  close(pFile->h);
b830: 0a 20 20 20 20 20 20 69 66 28 20 65 72 72 20 29  .      if( err )
b840: 7b 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d  {.        pFile-
b850: 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72  >lastErrno = err
b860: 6e 6f 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  no;.        retu
b870: 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  rn SQLITE_IOERR_
b880: 43 4c 4f 53 45 3b 0a 20 20 20 20 20 20 7d 0a 20  CLOSE;.      }. 
b890: 20 20 20 7d 0a 23 69 66 20 4f 53 5f 56 58 57 4f     }.#if OS_VXWO
b8a0: 52 4b 53 0a 20 20 20 20 69 66 28 20 70 46 69 6c  RKS.    if( pFil
b8b0: 65 2d 3e 70 49 64 20 29 7b 0a 20 20 20 20 20 20  e->pId ){.      
b8c0: 69 66 28 20 70 46 69 6c 65 2d 3e 69 73 44 65 6c  if( pFile->isDel
b8d0: 65 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 75  ete ){.        u
b8e0: 6e 6c 69 6e 6b 28 70 46 69 6c 65 2d 3e 70 49 64  nlink(pFile->pId
b8f0: 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e 61 6d 65  ->zCanonicalName
b900: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
b910: 20 76 78 77 6f 72 6b 73 52 65 6c 65 61 73 65 46   vxworksReleaseF
b920: 69 6c 65 49 64 28 70 46 69 6c 65 2d 3e 70 49 64  ileId(pFile->pId
b930: 29 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  );.      pFile->
b940: 70 49 64 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 23  pId = 0;.    }.#
b950: 65 6e 64 69 66 0a 20 20 20 20 4f 53 54 52 41 43  endif.    OSTRAC
b960: 45 28 28 22 43 4c 4f 53 45 20 20 20 25 2d 33 64  E(("CLOSE   %-3d
b970: 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 29 3b 0a  \n", pFile->h);.
b980: 20 20 20 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28      OpenCounter(
b990: 2d 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  -1);.    sqlite3
b9a0: 5f 66 72 65 65 28 70 46 69 6c 65 2d 3e 70 55 6e  _free(pFile->pUn
b9b0: 75 73 65 64 29 3b 0a 20 20 20 20 6d 65 6d 73 65  used);.    memse
b9c0: 74 28 70 46 69 6c 65 2c 20 30 2c 20 73 69 7a 65  t(pFile, 0, size
b9d0: 6f 66 28 75 6e 69 78 46 69 6c 65 29 29 29 3b 0a  of(unixFile)));.
b9e0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
b9f0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
ba00: 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 0a 2a   Close a file..*
ba10: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
ba20: 78 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66  xClose(sqlite3_f
ba30: 69 6c 65 20 2a 69 64 29 7b 0a 20 20 69 6e 74 20  ile *id){.  int 
ba40: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
ba50: 20 20 69 66 28 20 69 64 20 29 7b 0a 20 20 20 20    if( id ){.    
ba60: 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
ba70: 3d 20 28 75 6e 69 78 46 69 6c 65 20 2a 29 69 64  = (unixFile *)id
ba80: 3b 0a 20 20 20 20 75 6e 69 78 55 6e 6c 6f 63 6b  ;.    unixUnlock
ba90: 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20  (id, NO_LOCK);. 
baa0: 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65     unixEnterMute
bab0: 78 28 29 3b 0a 20 20 20 20 69 66 28 20 70 46 69  x();.    if( pFi
bac0: 6c 65 2d 3e 70 49 6e 6f 64 65 20 26 26 20 70 46  le->pInode && pF
bad0: 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 4c 6f  ile->pInode->nLo
bae0: 63 6b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  ck ){.      /* I
baf0: 66 20 74 68 65 72 65 20 61 72 65 20 6f 75 74 73  f there are outs
bb00: 74 61 6e 64 69 6e 67 20 6c 6f 63 6b 73 2c 20 64  tanding locks, d
bb10: 6f 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 63  o not actually c
bb20: 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20 6a 75  lose the file ju
bb30: 73 74 0a 20 20 20 20 20 20 2a 2a 20 79 65 74 20  st.      ** yet 
bb40: 62 65 63 61 75 73 65 20 74 68 61 74 20 77 6f 75  because that wou
bb50: 6c 64 20 63 6c 65 61 72 20 74 68 6f 73 65 20 6c  ld clear those l
bb60: 6f 63 6b 73 2e 20 20 49 6e 73 74 65 61 64 2c 20  ocks.  Instead, 
bb70: 61 64 64 20 74 68 65 20 66 69 6c 65 0a 20 20 20  add the file.   
bb80: 20 20 20 2a 2a 20 64 65 73 63 72 69 70 74 6f 72     ** descriptor
bb90: 20 74 6f 20 70 49 6e 6f 64 65 2d 3e 70 55 6e 75   to pInode->pUnu
bba0: 73 65 64 20 6c 69 73 74 2e 20 20 49 74 20 77 69  sed list.  It wi
bbb0: 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74 69 63 61  ll be automatica
bbc0: 6c 6c 79 20 63 6c 6f 73 65 64 20 0a 20 20 20 20  lly closed .    
bbd0: 20 20 2a 2a 20 77 68 65 6e 20 74 68 65 20 6c 61    ** when the la
bbe0: 73 74 20 6c 6f 63 6b 20 69 73 20 63 6c 65 61 72  st lock is clear
bbf0: 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ed..      */.   
bc00: 20 20 20 73 65 74 50 65 6e 64 69 6e 67 46 64 28     setPendingFd(
bc10: 70 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20  pFile);.    }.  
bc20: 20 20 72 65 6c 65 61 73 65 49 6e 6f 64 65 49 6e    releaseInodeIn
bc30: 66 6f 28 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  fo(pFile->pInode
bc40: 29 3b 0a 20 20 20 20 72 63 20 3d 20 63 6c 6f 73  );.    rc = clos
bc50: 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 20  eUnixFile(id);. 
bc60: 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65     unixLeaveMute
bc70: 78 28 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  x();.  }.  retur
bc80: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a  n rc;.}../******
bc90: 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20  ******** End of 
bca0: 74 68 65 20 70 6f 73 69 78 20 61 64 76 69 73 6f  the posix adviso
bcb0: 72 79 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e  ry lock implemen
bcc0: 74 61 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  tation *********
bcd0: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
bce0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
bcf0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
bd00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
bd10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
bd20: 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a  *******/../*****
bd30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
bd40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
bd50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
bd60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
bd70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a  *********.******
bd80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
bd90: 2a 2a 2a 2a 2a 2a 2a 2a 20 4e 6f 2d 6f 70 20 4c  ******** No-op L
bda0: 6f 63 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ocking *********
bdb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
bdc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20  *********.**.** 
bdd0: 4f 66 20 74 68 65 20 76 61 72 69 6f 75 73 20 6c  Of the various l
bde0: 6f 63 6b 69 6e 67 20 69 6d 70 6c 65 6d 65 6e 74  ocking implement
bdf0: 61 74 69 6f 6e 73 20 61 76 61 69 6c 61 62 6c 65  ations available
be00: 2c 20 74 68 69 73 20 69 73 20 62 79 20 66 61 72  , this is by far
be10: 20 74 68 65 0a 2a 2a 20 73 69 6d 70 6c 65 73 74   the.** simplest
be20: 3a 20 20 6c 6f 63 6b 69 6e 67 20 69 73 20 69 67  :  locking is ig
be30: 6e 6f 72 65 64 2e 20 20 4e 6f 20 61 74 74 65 6d  nored.  No attem
be40: 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 6c 6f  pt is made to lo
be50: 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  ck the database.
be60: 2a 2a 20 66 69 6c 65 20 66 6f 72 20 72 65 61 64  ** file for read
be70: 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 2e 0a  ing or writing..
be80: 2a 2a 0a 2a 2a 20 54 68 69 73 20 6c 6f 63 6b 69  **.** This locki
be90: 6e 67 20 6d 6f 64 65 20 69 73 20 61 70 70 72 6f  ng mode is appro
bea0: 70 72 69 61 74 65 20 66 6f 72 20 75 73 65 20 6f  priate for use o
beb0: 6e 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61  n read-only data
bec0: 62 61 73 65 73 0a 2a 2a 20 28 65 78 3a 20 64 61  bases.** (ex: da
bed0: 74 61 62 61 73 65 73 20 74 68 61 74 20 61 72 65  tabases that are
bee0: 20 62 75 72 6e 65 64 20 69 6e 74 6f 20 43 44 2d   burned into CD-
bef0: 52 4f 4d 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65  ROM, for example
bf00: 2e 29 20 20 49 74 20 63 61 6e 0a 2a 2a 20 61 6c  .)  It can.** al
bf10: 73 6f 20 62 65 20 75 73 65 64 20 69 66 20 74 68  so be used if th
bf20: 65 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 65 6d  e application em
bf30: 70 6c 6f 79 73 20 73 6f 6d 65 20 65 78 74 65 72  ploys some exter
bf40: 6e 61 6c 20 6d 65 63 68 61 6e 69 73 6d 20 74 6f  nal mechanism to
bf50: 0a 2a 2a 20 70 72 65 76 65 6e 74 20 73 69 6d 75  .** prevent simu
bf60: 6c 74 61 6e 65 6f 75 73 20 61 63 63 65 73 73 20  ltaneous access 
bf70: 6f 66 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  of the same data
bf80: 62 61 73 65 20 62 79 20 74 77 6f 20 6f 72 20 6d  base by two or m
bf90: 6f 72 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  ore.** database 
bfa0: 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 20 20 42 75  connections.  Bu
bfb0: 74 20 74 68 65 72 65 20 69 73 20 61 20 73 65 72  t there is a ser
bfc0: 69 6f 75 73 20 72 69 73 6b 20 6f 66 20 64 61 74  ious risk of dat
bfd0: 61 62 61 73 65 0a 2a 2a 20 63 6f 72 72 75 70 74  abase.** corrupt
bfe0: 69 6f 6e 20 69 66 20 74 68 69 73 20 6c 6f 63 6b  ion if this lock
bff0: 69 6e 67 20 6d 6f 64 65 20 69 73 20 75 73 65 64  ing mode is used
c000: 20 69 6e 20 73 69 74 75 61 74 69 6f 6e 73 20 77   in situations w
c010: 68 65 72 65 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a  here multiple.**
c020: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
c030: 74 69 6f 6e 73 20 61 72 65 20 61 63 63 65 73 73  tions are access
c040: 69 6e 67 20 74 68 65 20 73 61 6d 65 20 64 61 74  ing the same dat
c050: 61 62 61 73 65 20 66 69 6c 65 20 61 74 20 74 68  abase file at th
c060: 65 20 73 61 6d 65 0a 2a 2a 20 74 69 6d 65 20 61  e same.** time a
c070: 6e 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f  nd one or more o
c080: 66 20 74 68 6f 73 65 20 63 6f 6e 6e 65 63 74 69  f those connecti
c090: 6f 6e 73 20 61 72 65 20 77 72 69 74 69 6e 67 2e  ons are writing.
c0a0: 0a 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  .*/..static int 
c0b0: 6e 6f 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65 72  nolockCheckReser
c0c0: 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  vedLock(sqlite3_
c0d0: 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64 2c 20 69  file *NotUsed, i
c0e0: 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20  nt *pResOut){.  
c0f0: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
c100: 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 2a 70 52  (NotUsed);.  *pR
c110: 65 73 4f 75 74 20 3d 20 30 3b 0a 20 20 72 65 74  esOut = 0;.  ret
c120: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
c130: 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f  .static int nolo
c140: 63 6b 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66  ckLock(sqlite3_f
c150: 69 6c 65 20 2a 4e 6f 74 55 73 65 64 2c 20 69 6e  ile *NotUsed, in
c160: 74 20 4e 6f 74 55 73 65 64 32 29 7b 0a 20 20 55  t NotUsed2){.  U
c170: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 32  NUSED_PARAMETER2
c180: 28 4e 6f 74 55 73 65 64 2c 20 4e 6f 74 55 73 65  (NotUsed, NotUse
c190: 64 32 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  d2);.  return SQ
c1a0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 73 74 61 74 69  LITE_OK;.}.stati
c1b0: 63 20 69 6e 74 20 6e 6f 6c 6f 63 6b 55 6e 6c 6f  c int nolockUnlo
c1c0: 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
c1d0: 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 4e 6f  *NotUsed, int No
c1e0: 74 55 73 65 64 32 29 7b 0a 20 20 55 4e 55 53 45  tUsed2){.  UNUSE
c1f0: 44 5f 50 41 52 41 4d 45 54 45 52 32 28 4e 6f 74  D_PARAMETER2(Not
c200: 55 73 65 64 2c 20 4e 6f 74 55 73 65 64 32 29 3b  Used, NotUsed2);
c210: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
c220: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  _OK;.}../*.** Cl
c230: 6f 73 65 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2f  ose the file..*/
c240: 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 6c 6f  .static int nolo
c250: 63 6b 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f  ckClose(sqlite3_
c260: 66 69 6c 65 20 2a 69 64 29 20 7b 0a 20 20 72 65  file *id) {.  re
c270: 74 75 72 6e 20 63 6c 6f 73 65 55 6e 69 78 46 69  turn closeUnixFi
c280: 6c 65 28 69 64 29 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a  le(id);.}../****
c290: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
c2a0: 45 6e 64 20 6f 66 20 74 68 65 20 6e 6f 2d 6f 70  End of the no-op
c2b0: 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61   lock implementa
c2c0: 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  tion ***********
c2d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a  **********.*****
c2e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c2f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c300: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c310: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a  *********/../***
c330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c350: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c360: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c370: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
c380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c390: 2a 2a 2a 2a 2a 20 42 65 67 69 6e 20 64 6f 74 2d  ***** Begin dot-
c3a0: 66 69 6c 65 20 4c 6f 63 6b 69 6e 67 20 2a 2a 2a  file Locking ***
c3b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
c3c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a  ***********.**.*
c3d0: 2a 20 54 68 65 20 64 6f 74 66 69 6c 65 20 6c 6f  * The dotfile lo
c3e0: 63 6b 69 6e 67 20 69 6d 70 6c 65 6d 65 6e 74 61  cking implementa
c3f0: 74 69 6f 6e 20 75 73 65 73 20 74 68 65 20 65 78  tion uses the ex
c400: 69 73 74 61 6e 63 65 20 6f 66 20 73 65 70 61 72  istance of separ
c410: 61 74 65 20 6c 6f 63 6b 0a 2a 2a 20 66 69 6c 65  ate lock.** file
c420: 73 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 63 6f  s in order to co
c430: 6e 74 72 6f 6c 20 61 63 63 65 73 73 20 74 6f 20  ntrol access to 
c440: 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54  the database.  T
c450: 68 69 73 20 77 6f 72 6b 73 20 6f 6e 20 6a 75 73  his works on jus
c460: 74 0a 2a 2a 20 61 62 6f 75 74 20 65 76 65 72 79  t.** about every
c470: 20 66 69 6c 65 73 79 73 74 65 6d 20 69 6d 61 67   filesystem imag
c480: 69 6e 61 62 6c 65 2e 20 20 42 75 74 20 74 68 65  inable.  But the
c490: 72 65 20 61 72 65 20 73 65 72 69 6f 75 73 20 64  re are serious d
c4a0: 6f 77 6e 73 69 64 65 73 3a 0a 2a 2a 0a 2a 2a 20  ownsides:.**.** 
c4b0: 20 20 20 28 31 29 20 20 54 68 65 72 65 20 69 73     (1)  There is
c4c0: 20 7a 65 72 6f 20 63 6f 6e 63 75 72 72 65 6e 63   zero concurrenc
c4d0: 79 2e 20 20 41 20 73 69 6e 67 6c 65 20 72 65 61  y.  A single rea
c4e0: 64 65 72 20 62 6c 6f 63 6b 73 20 61 6c 6c 20 6f  der blocks all o
c4f0: 74 68 65 72 0a 2a 2a 20 20 20 20 20 20 20 20 20  ther.**         
c500: 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 66 72 6f 6d  connections from
c510: 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74   reading or writ
c520: 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
c530: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20  ..**.**    (2)  
c540: 41 6e 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 63  An application c
c550: 72 61 73 68 20 6f 72 20 70 6f 77 65 72 20 6c 6f  rash or power lo
c560: 73 73 20 63 61 6e 20 6c 65 61 76 65 20 73 74 61  ss can leave sta
c570: 6c 65 20 6c 6f 63 6b 20 66 69 6c 65 73 0a 2a 2a  le lock files.**
c580: 20 20 20 20 20 20 20 20 20 73 69 74 74 69 6e 67           sitting
c590: 20 61 72 6f 75 6e 64 20 74 68 61 74 20 6e 65 65   around that nee
c5a0: 64 20 74 6f 20 62 65 20 63 6c 65 61 72 65 64 20  d to be cleared 
c5b0: 6d 61 6e 75 61 6c 6c 79 2e 0a 2a 2a 0a 2a 2a 20  manually..**.** 
c5c0: 4e 65 76 65 72 74 68 65 6c 65 73 73 2c 20 61 20  Nevertheless, a 
c5d0: 64 6f 74 6c 6f 63 6b 20 69 73 20 61 6e 20 61 70  dotlock is an ap
c5e0: 70 72 6f 70 72 69 61 74 65 20 6c 6f 63 6b 69 6e  propriate lockin
c5f0: 67 20 6d 6f 64 65 20 66 6f 72 20 75 73 65 20 69  g mode for use i
c600: 66 20 6e 6f 0a 2a 2a 20 6f 74 68 65 72 20 6c 6f  f no.** other lo
c610: 63 6b 69 6e 67 20 73 74 72 61 74 65 67 79 20 69  cking strategy i
c620: 73 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a  s available..**.
c630: 2a 2a 20 44 6f 74 66 69 6c 65 20 6c 6f 63 6b 69  ** Dotfile locki
c640: 6e 67 20 77 6f 72 6b 73 20 62 79 20 63 72 65 61  ng works by crea
c650: 74 69 6e 67 20 61 20 66 69 6c 65 20 69 6e 20 74  ting a file in t
c660: 68 65 20 73 61 6d 65 20 64 69 72 65 63 74 6f 72  he same director
c670: 79 20 61 73 20 74 68 65 0a 2a 2a 20 64 61 74 61  y as the.** data
c680: 62 61 73 65 20 61 6e 64 20 77 69 74 68 20 74 68  base and with th
c690: 65 20 73 61 6d 65 20 6e 61 6d 65 20 62 75 74 20  e same name but 
c6a0: 77 69 74 68 20 61 20 22 2e 6c 6f 63 6b 22 20 65  with a ".lock" e
c6b0: 78 74 65 6e 73 69 6f 6e 20 61 64 64 65 64 2e 0a  xtension added..
c6c0: 2a 2a 20 54 68 65 20 65 78 69 73 74 61 6e 63 65  ** The existance
c6d0: 20 6f 66 20 61 20 6c 6f 63 6b 20 66 69 6c 65 20   of a lock file 
c6e0: 69 6d 70 6c 69 65 73 20 61 6e 20 45 58 43 4c 55  implies an EXCLU
c6f0: 53 49 56 45 20 6c 6f 63 6b 2e 20 20 41 6c 6c 20  SIVE lock.  All 
c700: 6f 74 68 65 72 20 6c 6f 63 6b 0a 2a 2a 20 74 79  other lock.** ty
c710: 70 65 73 20 28 53 48 41 52 45 44 2c 20 52 45 53  pes (SHARED, RES
c720: 45 52 56 45 44 2c 20 50 45 4e 44 49 4e 47 29 20  ERVED, PENDING) 
c730: 61 72 65 20 6d 61 70 70 65 64 20 69 6e 74 6f 20  are mapped into 
c740: 45 58 43 4c 55 53 49 56 45 2e 0a 2a 2f 0a 0a 2f  EXCLUSIVE..*/../
c750: 2a 0a 2a 2a 20 54 68 65 20 66 69 6c 65 20 73 75  *.** The file su
c760: 66 66 69 78 20 61 64 64 65 64 20 74 6f 20 74 68  ffix added to th
c770: 65 20 64 61 74 61 20 62 61 73 65 20 66 69 6c 65  e data base file
c780: 6e 61 6d 65 20 69 6e 20 6f 72 64 65 72 20 74 6f  name in order to
c790: 20 63 72 65 61 74 65 20 74 68 65 0a 2a 2a 20 6c   create the.** l
c7a0: 6f 63 6b 20 66 69 6c 65 2e 0a 2a 2f 0a 23 64 65  ock file..*/.#de
c7b0: 66 69 6e 65 20 44 4f 54 4c 4f 43 4b 5f 53 55 46  fine DOTLOCK_SUF
c7c0: 46 49 58 20 22 2e 6c 6f 63 6b 22 0a 0a 2f 2a 0a  FIX ".lock"../*.
c7d0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
c7e0: 63 68 65 63 6b 73 20 69 66 20 74 68 65 72 65 20  checks if there 
c7f0: 69 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  is a RESERVED lo
c800: 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73  ck held on the s
c810: 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65  pecified.** file
c820: 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20   by this or any 
c830: 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49  other process. I
c840: 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73  f such a lock is
c850: 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73   held, set *pRes
c860: 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d  Out.** to a non-
c870: 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72  zero value other
c880: 77 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73  wise *pResOut is
c890: 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54   set to zero.  T
c8a0: 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a  he return value.
c8b0: 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c  ** is set to SQL
c8c0: 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e  ITE_OK unless an
c8d0: 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72   I/O error occur
c8e0: 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68  s during lock ch
c8f0: 65 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 6e  ecking..**.** In
c900: 20 64 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67   dotfile locking
c910: 2c 20 65 69 74 68 65 72 20 61 20 6c 6f 63 6b 20  , either a lock 
c920: 65 78 69 73 74 73 20 6f 72 20 69 74 20 64 6f 65  exists or it doe
c930: 73 20 6e 6f 74 2e 20 20 53 6f 20 69 6e 20 74 68  s not.  So in th
c940: 69 73 0a 2a 2a 20 76 61 72 69 61 74 69 6f 6e 20  is.** variation 
c950: 6f 66 20 43 68 65 63 6b 52 65 73 65 72 76 65 64  of CheckReserved
c960: 4c 6f 63 6b 28 29 2c 20 2a 70 52 65 73 4f 75 74  Lock(), *pResOut
c970: 20 69 73 20 73 65 74 20 74 6f 20 74 72 75 65 20   is set to true 
c980: 69 66 20 61 6e 79 20 6c 6f 63 6b 0a 2a 2a 20 69  if any lock.** i
c990: 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 66 69  s held on the fi
c9a0: 6c 65 20 61 6e 64 20 66 61 6c 73 65 20 69 66 20  le and false if 
c9b0: 74 68 65 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f  the file is unlo
c9c0: 63 6b 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  cked..*/.static 
c9d0: 69 6e 74 20 64 6f 74 6c 6f 63 6b 43 68 65 63 6b  int dotlockCheck
c9e0: 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c  ReservedLock(sql
c9f0: 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
ca00: 6e 74 20 2a 70 52 65 73 4f 75 74 29 20 7b 0a 20  nt *pResOut) {. 
ca10: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
ca20: 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73 65 72  _OK;.  int reser
ca30: 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46  ved = 0;.  unixF
ca40: 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e  ile *pFile = (un
ca50: 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 53  ixFile*)id;..  S
ca60: 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
ca70: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
ca80: 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45  ERR_CHECKRESERVE
ca90: 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61  DLOCK; );.  .  a
caa0: 73 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a  ssert( pFile );.
cab0: 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61  .  /* Check if a
cac0: 20 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 20   thread in this 
cad0: 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 73 75  process holds su
cae0: 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69  ch a lock */.  i
caf0: 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  f( pFile->eFileL
cb00: 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ock>SHARED_LOCK 
cb10: 29 7b 0a 20 20 20 20 2f 2a 20 45 69 74 68 65 72  ){.    /* Either
cb20: 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e   this connection
cb30: 20 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 63   or some other c
cb40: 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 20 74 68 65  onnection in the
cb50: 20 73 61 6d 65 20 70 72 6f 63 65 73 73 0a 20 20   same process.  
cb60: 20 20 2a 2a 20 68 6f 6c 64 73 20 61 20 6c 6f 63    ** holds a loc
cb70: 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e 20 20  k on the file.  
cb80: 4e 6f 20 6e 65 65 64 20 74 6f 20 63 68 65 63 6b  No need to check
cb90: 20 66 75 72 74 68 65 72 2e 20 2a 2f 0a 20 20 20   further. */.   
cba0: 20 72 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20   reserved = 1;. 
cbb0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
cbc0: 68 65 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20  he lock is held 
cbd0: 69 66 20 61 6e 64 20 6f 6e 6c 79 20 69 66 20 74  if and only if t
cbe0: 68 65 20 6c 6f 63 6b 66 69 6c 65 20 65 78 69 73  he lockfile exis
cbf0: 74 73 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20  ts */.    const 
cc00: 63 68 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20  char *zLockFile 
cc10: 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 70  = (const char*)p
cc20: 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
cc30: 74 65 78 74 3b 0a 20 20 20 20 72 65 73 65 72 76  text;.    reserv
cc40: 65 64 20 3d 20 61 63 63 65 73 73 28 7a 4c 6f 63  ed = access(zLoc
cc50: 6b 46 69 6c 65 2c 20 30 29 3d 3d 30 3b 0a 20 20  kFile, 0)==0;.  
cc60: 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54 45  }.  OSTRACE(("TE
cc70: 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64 20 25 64  ST WR-LOCK %d %d
cc80: 20 25 64 20 28 64 6f 74 6c 6f 63 6b 29 5c 6e 22   %d (dotlock)\n"
cc90: 2c 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20  , pFile->h, rc, 
cca0: 72 65 73 65 72 76 65 64 29 29 3b 0a 20 20 2a 70  reserved));.  *p
ccb0: 52 65 73 4f 75 74 20 3d 20 72 65 73 65 72 76 65  ResOut = reserve
ccc0: 64 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  d;.  return rc;.
ccd0: 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68  }../*.** Lock th
cce0: 65 20 66 69 6c 65 20 77 69 74 68 20 74 68 65 20  e file with the 
ccf0: 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20 62  lock specified b
cd00: 79 20 70 61 72 61 6d 65 74 65 72 20 65 46 69 6c  y parameter eFil
cd10: 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f  eLock - one.** o
cd20: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  f the following:
cd30: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53  .**.**     (1) S
cd40: 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  HARED_LOCK.**   
cd50: 20 20 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c    (2) RESERVED_L
cd60: 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50  OCK.**     (3) P
cd70: 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20  ENDING_LOCK.**  
cd80: 20 20 20 28 34 29 20 45 58 43 4c 55 53 49 56 45     (4) EXCLUSIVE
cd90: 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65  _LOCK.**.** Some
cda0: 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65  times when reque
cdb0: 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73  sting one lock s
cdc0: 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c  tate, additional
cdd0: 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20   lock states.** 
cde0: 61 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20  are inserted in 
cdf0: 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f  between.  The lo
ce00: 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c  cking might fail
ce10: 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c   on one of the l
ce20: 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69  ater.** transiti
ce30: 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20  ons leaving the 
ce40: 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66 65  lock state diffe
ce50: 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69  rent from what i
ce60: 74 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a  t started but.**
ce70: 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20   still short of 
ce80: 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66  its goal.  The f
ce90: 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73  ollowing chart s
cea0: 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64  hows the allowed
ceb0: 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  .** transitions 
cec0: 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65 64  and the inserted
ced0: 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74   intermediate st
cee0: 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55  ates:.**.**    U
cef0: 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45  NLOCKED -> SHARE
cf00: 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d  D.**    SHARED -
cf10: 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20  > RESERVED.**   
cf20: 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44   SHARED -> (PEND
cf30: 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56  ING) -> EXCLUSIV
cf40: 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44  E.**    RESERVED
cf50: 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e   -> (PENDING) ->
cf60: 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20   EXCLUSIVE.**   
cf70: 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c   PENDING -> EXCL
cf80: 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73  USIVE.**.** This
cf90: 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e   routine will on
cfa0: 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f  ly increase a lo
cfb0: 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c  ck.  Use the sql
cfc0: 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a  ite3OsUnlock().*
cfd0: 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77  * routine to low
cfe0: 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  er a locking lev
cff0: 65 6c 2e 0a 2a 2a 0a 2a 2a 20 57 69 74 68 20 64  el..**.** With d
d000: 6f 74 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 2c 20  otfile locking, 
d010: 77 65 20 72 65 61 6c 6c 79 20 6f 6e 6c 79 20 73  we really only s
d020: 75 70 70 6f 72 74 20 73 74 61 74 65 20 28 34 29  upport state (4)
d030: 3a 20 45 58 43 4c 55 53 49 56 45 2e 0a 2a 2a 20  : EXCLUSIVE..** 
d040: 42 75 74 20 77 65 20 74 72 61 63 6b 20 74 68 65  But we track the
d050: 20 6f 74 68 65 72 20 6c 6f 63 6b 69 6e 67 20 6c   other locking l
d060: 65 76 65 6c 73 20 69 6e 74 65 72 6e 61 6c 6c 79  evels internally
d070: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
d080: 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69  dotlockLock(sqli
d090: 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
d0a0: 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20  t eFileLock) {. 
d0b0: 20 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65   unixFile *pFile
d0c0: 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64   = (unixFile*)id
d0d0: 3b 0a 20 20 69 6e 74 20 66 64 3b 0a 20 20 63 68  ;.  int fd;.  ch
d0e0: 61 72 20 2a 7a 4c 6f 63 6b 46 69 6c 65 20 3d 20  ar *zLockFile = 
d0f0: 28 63 68 61 72 20 2a 29 70 46 69 6c 65 2d 3e 6c  (char *)pFile->l
d100: 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20  ockingContext;. 
d110: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
d120: 5f 4f 4b 3b 0a 0a 0a 20 20 2f 2a 20 49 66 20 77  _OK;...  /* If w
d130: 65 20 68 61 76 65 20 61 6e 79 20 6c 6f 63 6b 2c  e have any lock,
d140: 20 74 68 65 6e 20 74 68 65 20 6c 6f 63 6b 20 66   then the lock f
d150: 69 6c 65 20 61 6c 72 65 61 64 79 20 65 78 69 73  ile already exis
d160: 74 73 2e 20 20 41 6c 6c 20 77 65 20 68 61 76 65  ts.  All we have
d170: 0a 20 20 2a 2a 20 74 6f 20 64 6f 20 69 73 20 61  .  ** to do is a
d180: 64 6a 75 73 74 20 6f 75 72 20 69 6e 74 65 72 6e  djust our intern
d190: 61 6c 20 72 65 63 6f 72 64 20 6f 66 20 74 68 65  al record of the
d1a0: 20 6c 6f 63 6b 20 6c 65 76 65 6c 2e 0a 20 20 2a   lock level..  *
d1b0: 2f 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65  /.  if( pFile->e
d1c0: 46 69 6c 65 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c 4f  FileLock > NO_LO
d1d0: 43 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  CK ){.    pFile-
d1e0: 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69  >eFileLock = eFi
d1f0: 6c 65 4c 6f 63 6b 3b 0a 23 69 66 20 21 4f 53 5f  leLock;.#if !OS_
d200: 56 58 57 4f 52 4b 53 0a 20 20 20 20 2f 2a 20 41  VXWORKS.    /* A
d210: 6c 77 61 79 73 20 75 70 64 61 74 65 20 74 68 65  lways update the
d220: 20 74 69 6d 65 73 74 61 6d 70 20 6f 6e 20 74 68   timestamp on th
d230: 65 20 6f 6c 64 20 66 69 6c 65 20 2a 2f 0a 20 20  e old file */.  
d240: 20 20 75 74 69 6d 65 73 28 7a 4c 6f 63 6b 46 69    utimes(zLockFi
d250: 6c 65 2c 20 4e 55 4c 4c 29 3b 0a 23 65 6e 64 69  le, NULL);.#endi
d260: 66 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  f.    return SQL
d270: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20  ITE_OK;.  }.  . 
d280: 20 2f 2a 20 67 72 61 62 20 61 6e 20 65 78 63 6c   /* grab an excl
d290: 75 73 69 76 65 20 6c 6f 63 6b 20 2a 2f 0a 20 20  usive lock */.  
d2a0: 66 64 20 3d 20 6f 70 65 6e 28 7a 4c 6f 63 6b 46  fd = open(zLockF
d2b0: 69 6c 65 2c 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f 43  ile,O_RDONLY|O_C
d2c0: 52 45 41 54 7c 4f 5f 45 58 43 4c 2c 30 36 30 30  REAT|O_EXCL,0600
d2d0: 29 3b 0a 20 20 69 66 28 20 66 64 3c 30 20 29 7b  );.  if( fd<0 ){
d2e0: 0a 20 20 20 20 2f 2a 20 66 61 69 6c 65 64 20 74  .    /* failed t
d2f0: 6f 20 6f 70 65 6e 2f 63 72 65 61 74 65 20 74 68  o open/create th
d300: 65 20 66 69 6c 65 2c 20 73 6f 6d 65 6f 6e 65 20  e file, someone 
d310: 65 6c 73 65 20 6d 61 79 20 68 61 76 65 20 73 74  else may have st
d320: 6f 6c 65 6e 20 74 68 65 20 6c 6f 63 6b 20 2a 2f  olen the lock */
d330: 0a 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20  .    int tErrno 
d340: 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 69 66 28  = errno;.    if(
d350: 20 45 45 58 49 53 54 20 3d 3d 20 74 45 72 72 6e   EEXIST == tErrn
d360: 6f 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  o ){.      rc = 
d370: 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
d380: 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
d390: 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72 6f 72  rc = sqliteError
d3a0: 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72 28 74  FromPosixError(t
d3b0: 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f  Errno, SQLITE_IO
d3c0: 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  ERR_LOCK);.     
d3d0: 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52   if( IS_LOCK_ERR
d3e0: 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20  OR(rc) ){.      
d3f0: 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
d400: 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20  no = tErrno;.   
d410: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72     }.    }.    r
d420: 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 20 0a 20  eturn rc;.  } . 
d430: 20 69 66 28 20 63 6c 6f 73 65 28 66 64 29 20 29   if( close(fd) )
d440: 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73  {.    pFile->las
d450: 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a  tErrno = errno;.
d460: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
d470: 49 4f 45 52 52 5f 43 4c 4f 53 45 3b 0a 20 20 7d  IOERR_CLOSE;.  }
d480: 0a 20 20 0a 20 20 2f 2a 20 67 6f 74 20 69 74 2c  .  .  /* got it,
d490: 20 73 65 74 20 74 68 65 20 74 79 70 65 20 61 6e   set the type an
d4a0: 64 20 72 65 74 75 72 6e 20 6f 6b 20 2a 2f 0a 20  d return ok */. 
d4b0: 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
d4c0: 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20  k = eFileLock;. 
d4d0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
d4e0: 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c  *.** Lower the l
d4f0: 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20  ocking level on 
d500: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
d510: 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f  pFile to eFileLo
d520: 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a  ck.  eFileLock.*
d530: 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  * must be either
d540: 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52   NO_LOCK or SHAR
d550: 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49  ED_LOCK..**.** I
d560: 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  f the locking le
d570: 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20  vel of the file 
d580: 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c  descriptor is al
d590: 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f  ready at or belo
d5a0: 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74  w.** the request
d5b0: 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  ed locking level
d5c0: 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
d5d0: 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a  s a no-op..**.**
d5e0: 20 57 68 65 6e 20 74 68 65 20 6c 6f 63 6b 69 6e   When the lockin
d5f0: 67 20 6c 65 76 65 6c 20 72 65 61 63 68 65 73 20  g level reaches 
d600: 4e 4f 5f 4c 4f 43 4b 2c 20 64 65 6c 65 74 65 20  NO_LOCK, delete 
d610: 74 68 65 20 6c 6f 63 6b 20 66 69 6c 65 2e 0a 2a  the lock file..*
d620: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f 74  /.static int dot
d630: 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 73 71 6c 69 74  lockUnlock(sqlit
d640: 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
d650: 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20   eFileLock) {.  
d660: 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20  unixFile *pFile 
d670: 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b  = (unixFile*)id;
d680: 0a 20 20 63 68 61 72 20 2a 7a 4c 6f 63 6b 46 69  .  char *zLockFi
d690: 6c 65 20 3d 20 28 63 68 61 72 20 2a 29 70 46 69  le = (char *)pFi
d6a0: 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65  le->lockingConte
d6b0: 78 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  xt;..  assert( p
d6c0: 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43  File );.  OSTRAC
d6d0: 45 28 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25  E(("UNLOCK  %d %
d6e0: 64 20 77 61 73 20 25 64 20 70 69 64 3d 25 64 20  d was %d pid=%d 
d6f0: 28 64 6f 74 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46  (dotlock)\n", pF
d700: 69 6c 65 2d 3e 68 2c 20 65 46 69 6c 65 4c 6f 63  ile->h, eFileLoc
d710: 6b 2c 0a 09 20 20 20 70 46 69 6c 65 2d 3e 65 46  k,..   pFile->eF
d720: 69 6c 65 4c 6f 63 6b 2c 20 67 65 74 70 69 64 28  ileLock, getpid(
d730: 29 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65  )));.  assert( e
d740: 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44  FileLock<=SHARED
d750: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20 20 2f 2a  _LOCK );.  .  /*
d760: 20 6e 6f 2d 6f 70 20 69 66 20 70 6f 73 73 69 62   no-op if possib
d770: 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c  le */.  if( pFil
d780: 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d 65 46  e->eFileLock==eF
d790: 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 72  ileLock ){.    r
d7a0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
d7b0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 6f 20 64 6f  .  }..  /* To do
d7c0: 77 6e 67 72 61 64 65 20 74 6f 20 73 68 61 72 65  wngrade to share
d7d0: 64 2c 20 73 69 6d 70 6c 79 20 75 70 64 61 74 65  d, simply update
d7e0: 20 6f 75 72 20 69 6e 74 65 72 6e 61 6c 20 6e 6f   our internal no
d7f0: 74 69 6f 6e 20 6f 66 20 74 68 65 0a 20 20 2a 2a  tion of the.  **
d800: 20 6c 6f 63 6b 20 73 74 61 74 65 2e 20 20 4e 6f   lock state.  No
d810: 20 6e 65 65 64 20 74 6f 20 6d 65 73 73 20 77 69   need to mess wi
d820: 74 68 20 74 68 65 20 66 69 6c 65 20 6f 6e 20 64  th the file on d
d830: 69 73 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  isk..  */.  if( 
d840: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
d850: 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 46  D_LOCK ){.    pF
d860: 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
d870: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20   SHARED_LOCK;.  
d880: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
d890: 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20  OK;.  }.  .  /* 
d8a0: 54 6f 20 66 75 6c 6c 79 20 75 6e 6c 6f 63 6b 20  To fully unlock 
d8b0: 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 64 65  the database, de
d8c0: 6c 65 74 65 20 74 68 65 20 6c 6f 63 6b 20 66 69  lete the lock fi
d8d0: 6c 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  le */.  assert( 
d8e0: 65 46 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f  eFileLock==NO_LO
d8f0: 43 4b 20 29 3b 0a 20 20 69 66 28 20 75 6e 6c 69  CK );.  if( unli
d900: 6e 6b 28 7a 4c 6f 63 6b 46 69 6c 65 29 20 29 7b  nk(zLockFile) ){
d910: 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 30 3b  .    int rc = 0;
d920: 0a 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f 20  .    int tErrno 
d930: 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 69 66 28  = errno;.    if(
d940: 20 45 4e 4f 45 4e 54 20 21 3d 20 74 45 72 72 6e   ENOENT != tErrn
d950: 6f 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  o ){.      rc = 
d960: 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50  sqliteErrorFromP
d970: 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f  osixError(tErrno
d980: 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  , SQLITE_IOERR_U
d990: 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20 7d 0a 20 20  NLOCK);.    }.  
d9a0: 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52    if( IS_LOCK_ER
d9b0: 52 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20  ROR(rc) ){.     
d9c0: 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e   pFile->lastErrn
d9d0: 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20  o = tErrno;.    
d9e0: 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  }.    return rc;
d9f0: 20 0a 20 20 7d 0a 20 20 70 46 69 6c 65 2d 3e 65   .  }.  pFile->e
da00: 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f  FileLock = NO_LO
da10: 43 4b 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  CK;.  return SQL
da20: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
da30: 20 43 6c 6f 73 65 20 61 20 66 69 6c 65 2e 20 20   Close a file.  
da40: 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6c 6f  Make sure the lo
da50: 63 6b 20 68 61 73 20 62 65 65 6e 20 72 65 6c 65  ck has been rele
da60: 61 73 65 64 20 62 65 66 6f 72 65 20 63 6c 6f 73  ased before clos
da70: 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ing..*/.static i
da80: 6e 74 20 64 6f 74 6c 6f 63 6b 43 6c 6f 73 65 28  nt dotlockClose(
da90: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
daa0: 29 20 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  ) {.  int rc;.  
dab0: 69 66 28 20 69 64 20 29 7b 0a 20 20 20 20 75 6e  if( id ){.    un
dac0: 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
dad0: 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
dae0: 20 20 20 64 6f 74 6c 6f 63 6b 55 6e 6c 6f 63 6b     dotlockUnlock
daf0: 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20  (id, NO_LOCK);. 
db00: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
db10: 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f  pFile->lockingCo
db20: 6e 74 65 78 74 29 3b 0a 20 20 7d 0a 20 20 72 63  ntext);.  }.  rc
db30: 20 3d 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65   = closeUnixFile
db40: 28 69 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  (id);.  return r
db50: 63 3b 0a 7d 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  c;.}./**********
db60: 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66 20  ******** End of 
db70: 74 68 65 20 64 6f 74 2d 66 69 6c 65 20 6c 6f 63  the dot-file loc
db80: 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  k implementation
db90: 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a   ***************
dba0: 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
dbb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
dbc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
dbd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
dbe0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
dbf0: 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***/../*********
dc00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
dc10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
dc20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
dc30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
dc40: 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *****.**********
dc50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
dc60: 20 42 65 67 69 6e 20 66 6c 6f 63 6b 20 4c 6f 63   Begin flock Loc
dc70: 6b 69 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  king ***********
dc80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
dc90: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 55 73 65 20  *****.**.** Use 
dca0: 74 68 65 20 66 6c 6f 63 6b 28 29 20 73 79 73 74  the flock() syst
dcb0: 65 6d 20 63 61 6c 6c 20 74 6f 20 64 6f 20 66 69  em call to do fi
dcc0: 6c 65 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a  le locking..**.*
dcd0: 2a 20 66 6c 6f 63 6b 28 29 20 6c 6f 63 6b 69 6e  * flock() lockin
dce0: 67 20 69 73 20 6c 69 6b 65 20 64 6f 74 2d 66 69  g is like dot-fi
dcf0: 6c 65 20 6c 6f 63 6b 69 6e 67 20 69 6e 20 74 68  le locking in th
dd00: 61 74 20 74 68 65 20 76 61 72 69 6f 75 73 0a 2a  at the various.*
dd10: 2a 20 66 69 6e 65 2d 67 72 61 69 6e 20 6c 6f 63  * fine-grain loc
dd20: 6b 69 6e 67 20 6c 65 76 65 6c 73 20 73 75 70 70  king levels supp
dd30: 6f 72 74 65 64 20 62 79 20 53 51 4c 69 74 65 20  orted by SQLite 
dd40: 61 72 65 20 63 6f 6c 6c 61 70 73 65 64 20 69 6e  are collapsed in
dd50: 74 6f 0a 2a 2a 20 61 20 73 69 6e 67 6c 65 20 65  to.** a single e
dd60: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e 20 20  xclusive lock.  
dd70: 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
dd80: 53 48 41 52 45 44 2c 20 52 45 53 45 52 56 45 44  SHARED, RESERVED
dd90: 2c 20 61 6e 64 0a 2a 2a 20 50 45 4e 44 49 4e 47  , and.** PENDING
dda0: 20 6c 6f 63 6b 73 20 61 72 65 20 74 68 65 20 73   locks are the s
ddb0: 61 6d 65 20 74 68 69 6e 67 20 61 73 20 61 6e 20  ame thing as an 
ddc0: 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20  EXCLUSIVE lock. 
ddd0: 20 53 51 4c 69 74 65 0a 2a 2a 20 73 74 69 6c 6c   SQLite.** still
dde0: 20 77 6f 72 6b 73 20 77 68 65 6e 20 79 6f 75 20   works when you 
ddf0: 64 6f 20 74 68 69 73 2c 20 62 75 74 20 63 6f 6e  do this, but con
de00: 63 75 72 72 65 6e 63 79 20 69 73 20 72 65 64 75  currency is redu
de10: 63 65 64 20 73 69 6e 63 65 0a 2a 2a 20 6f 6e 6c  ced since.** onl
de20: 79 20 61 20 73 69 6e 67 6c 65 20 70 72 6f 63 65  y a single proce
de30: 73 73 20 63 61 6e 20 62 65 20 72 65 61 64 69 6e  ss can be readin
de40: 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61  g the database a
de50: 74 20 61 20 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20  t a time..**.** 
de60: 4f 6d 69 74 20 74 68 69 73 20 73 65 63 74 69 6f  Omit this sectio
de70: 6e 20 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  n if SQLITE_ENAB
de80: 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
de90: 20 69 73 20 74 75 72 6e 65 64 20 6f 66 66 20 6f   is turned off o
dea0: 72 20 69 66 0a 2a 2a 20 63 6f 6d 70 69 6c 69 6e  r if.** compilin
deb0: 67 20 66 6f 72 20 56 58 57 4f 52 4b 53 2e 0a 2a  g for VXWORKS..*
dec0: 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41  /.#if SQLITE_ENA
ded0: 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
dee0: 45 20 26 26 20 21 4f 53 5f 56 58 57 4f 52 4b 53  E && !OS_VXWORKS
def0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
df00: 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74  tine checks if t
df10: 68 65 72 65 20 69 73 20 61 20 52 45 53 45 52 56  here is a RESERV
df20: 45 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20  ED lock held on 
df30: 74 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a  the specified.**
df40: 20 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72   file by this or
df50: 20 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65   any other proce
df60: 73 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f  ss. If such a lo
df70: 63 6b 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20  ck is held, set 
df80: 2a 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61  *pResOut.** to a
df90: 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20   non-zero value 
dfa0: 6f 74 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f  otherwise *pResO
dfb0: 75 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72  ut is set to zer
dfc0: 6f 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 76  o.  The return v
dfd0: 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74  alue.** is set t
dfe0: 6f 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65  o SQLITE_OK unle
dff0: 73 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20  ss an I/O error 
e000: 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f  occurs during lo
e010: 63 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a  ck checking..*/.
e020: 73 74 61 74 69 63 20 69 6e 74 20 66 6c 6f 63 6b  static int flock
e030: 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
e040: 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
e050: 69 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74  id, int *pResOut
e060: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
e070: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72  LITE_OK;.  int r
e080: 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 75  eserved = 0;.  u
e090: 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
e0a0: 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
e0b0: 20 20 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45    .  SimulateIOE
e0c0: 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c  rror( return SQL
e0d0: 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52  ITE_IOERR_CHECKR
e0e0: 45 53 45 52 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a  ESERVEDLOCK; );.
e0f0: 20 20 0a 20 20 61 73 73 65 72 74 28 20 70 46 69    .  assert( pFi
e100: 6c 65 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 43 68  le );.  .  /* Ch
e110: 65 63 6b 20 69 66 20 61 20 74 68 72 65 61 64 20  eck if a thread 
e120: 69 6e 20 74 68 69 73 20 70 72 6f 63 65 73 73 20  in this process 
e130: 68 6f 6c 64 73 20 73 75 63 68 20 61 20 6c 6f 63  holds such a loc
e140: 6b 20 2a 2f 0a 20 20 69 66 28 20 70 46 69 6c 65  k */.  if( pFile
e150: 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52  ->eFileLock>SHAR
e160: 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72  ED_LOCK ){.    r
e170: 65 73 65 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d  eserved = 1;.  }
e180: 0a 20 20 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69  .  .  /* Otherwi
e190: 73 65 20 73 65 65 20 69 66 20 73 6f 6d 65 20 6f  se see if some o
e1a0: 74 68 65 72 20 70 72 6f 63 65 73 73 20 68 6f 6c  ther process hol
e1b0: 64 73 20 69 74 2e 20 2a 2f 0a 20 20 69 66 28 20  ds it. */.  if( 
e1c0: 21 72 65 73 65 72 76 65 64 20 29 7b 0a 20 20 20  !reserved ){.   
e1d0: 20 2f 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 67   /* attempt to g
e1e0: 65 74 20 74 68 65 20 6c 6f 63 6b 20 2a 2f 0a 20  et the lock */. 
e1f0: 20 20 20 69 6e 74 20 6c 72 63 20 3d 20 66 6c 6f     int lrc = flo
e200: 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43  ck(pFile->h, LOC
e210: 4b 5f 45 58 20 7c 20 4c 4f 43 4b 5f 4e 42 29 3b  K_EX | LOCK_NB);
e220: 0a 20 20 20 20 69 66 28 20 21 6c 72 63 20 29 7b  .    if( !lrc ){
e230: 0a 20 20 20 20 20 20 2f 2a 20 67 6f 74 20 74 68  .      /* got th
e240: 65 20 6c 6f 63 6b 2c 20 75 6e 6c 6f 63 6b 20 69  e lock, unlock i
e250: 74 20 2a 2f 0a 20 20 20 20 20 20 6c 72 63 20 3d  t */.      lrc =
e260: 20 66 6c 6f 63 6b 28 70 46 69 6c 65 2d 3e 68 2c   flock(pFile->h,
e270: 20 4c 4f 43 4b 5f 55 4e 29 3b 0a 20 20 20 20 20   LOCK_UN);.     
e280: 20 69 66 20 28 20 6c 72 63 20 29 20 7b 0a 20 20   if ( lrc ) {.  
e290: 20 20 20 20 20 20 69 6e 74 20 74 45 72 72 6e 6f        int tErrno
e2a0: 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20   = errno;.      
e2b0: 20 20 2f 2a 20 75 6e 6c 6f 63 6b 20 66 61 69 6c    /* unlock fail
e2c0: 65 64 20 77 69 74 68 20 61 6e 20 65 72 72 6f 72  ed with an error
e2d0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 6c 72 63 20   */.        lrc 
e2e0: 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  = sqliteErrorFro
e2f0: 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72  mPosixError(tErr
e300: 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  no, SQLITE_IOERR
e310: 5f 55 4e 4c 4f 43 4b 29 3b 20 0a 20 20 20 20 20  _UNLOCK); .     
e320: 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45     if( IS_LOCK_E
e330: 52 52 4f 52 28 6c 72 63 29 20 29 7b 0a 20 20 20  RROR(lrc) ){.   
e340: 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61         pFile->la
e350: 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f  stErrno = tErrno
e360: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
e370: 20 6c 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a   lrc;.        }.
e380: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 65 6c        }.    } el
e390: 73 65 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 74  se {.      int t
e3a0: 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
e3b0: 20 20 20 20 20 72 65 73 65 72 76 65 64 20 3d 20       reserved = 
e3c0: 31 3b 0a 20 20 20 20 20 20 2f 2a 20 73 6f 6d 65  1;.      /* some
e3d0: 6f 6e 65 20 65 6c 73 65 20 6d 69 67 68 74 20 68  one else might h
e3e0: 61 76 65 20 69 74 20 72 65 73 65 72 76 65 64 20  ave it reserved 
e3f0: 2a 2f 0a 20 20 20 20 20 20 6c 72 63 20 3d 20 73  */.      lrc = s
e400: 71 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f  qliteErrorFromPo
e410: 73 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c  sixError(tErrno,
e420: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f   SQLITE_IOERR_LO
e430: 43 4b 29 3b 20 0a 20 20 20 20 20 20 69 66 28 20  CK); .      if( 
e440: 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28 6c 72  IS_LOCK_ERROR(lr
e450: 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46  c) ){.        pF
e460: 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
e470: 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20   tErrno;.       
e480: 20 72 63 20 3d 20 6c 72 63 3b 0a 20 20 20 20 20   rc = lrc;.     
e490: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 4f   }.    }.  }.  O
e4a0: 53 54 52 41 43 45 28 28 22 54 45 53 54 20 57 52  STRACE(("TEST WR
e4b0: 2d 4c 4f 43 4b 20 25 64 20 25 64 20 25 64 20 28  -LOCK %d %d %d (
e4c0: 66 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65  flock)\n", pFile
e4d0: 2d 3e 68 2c 20 72 63 2c 20 72 65 73 65 72 76 65  ->h, rc, reserve
e4e0: 64 29 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  d));..#ifdef SQL
e4f0: 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b  ITE_IGNORE_FLOCK
e500: 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20 20 69  _LOCK_ERRORS.  i
e510: 66 28 20 28 72 63 20 26 20 53 51 4c 49 54 45 5f  f( (rc & SQLITE_
e520: 49 4f 45 52 52 29 20 3d 3d 20 53 51 4c 49 54 45  IOERR) == SQLITE
e530: 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20 20 72 63  _IOERR ){.    rc
e540: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
e550: 20 20 72 65 73 65 72 76 65 64 3d 31 3b 0a 20 20    reserved=1;.  
e560: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
e570: 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f 43 4b 5f  TE_IGNORE_FLOCK_
e580: 4c 4f 43 4b 5f 45 52 52 4f 52 53 20 2a 2f 0a 20  LOCK_ERRORS */. 
e590: 20 2a 70 52 65 73 4f 75 74 20 3d 20 72 65 73 65   *pResOut = rese
e5a0: 72 76 65 64 3b 0a 20 20 72 65 74 75 72 6e 20 72  rved;.  return r
e5b0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b  c;.}../*.** Lock
e5c0: 20 74 68 65 20 66 69 6c 65 20 77 69 74 68 20 74   the file with t
e5d0: 68 65 20 6c 6f 63 6b 20 73 70 65 63 69 66 69 65  he lock specifie
e5e0: 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 65  d by parameter e
e5f0: 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a  FileLock - one.*
e600: 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  * of the followi
e610: 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31  ng:.**.**     (1
e620: 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a  ) SHARED_LOCK.**
e630: 20 20 20 20 20 28 32 29 20 52 45 53 45 52 56 45       (2) RESERVE
e640: 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33  D_LOCK.**     (3
e650: 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a  ) PENDING_LOCK.*
e660: 2a 20 20 20 20 20 28 34 29 20 45 58 43 4c 55 53  *     (4) EXCLUS
e670: 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53  IVE_LOCK.**.** S
e680: 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e 20 72 65  ometimes when re
e690: 71 75 65 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63  questing one loc
e6a0: 6b 20 73 74 61 74 65 2c 20 61 64 64 69 74 69 6f  k state, additio
e6b0: 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a  nal lock states.
e6c0: 2a 2a 20 61 72 65 20 69 6e 73 65 72 74 65 64 20  ** are inserted 
e6d0: 69 6e 20 62 65 74 77 65 65 6e 2e 20 20 54 68 65  in between.  The
e6e0: 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68 74 20 66   locking might f
e6f0: 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68  ail on one of th
e700: 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73  e later.** trans
e710: 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74  itions leaving t
e720: 68 65 20 6c 6f 63 6b 20 73 74 61 74 65 20 64 69  he lock state di
e730: 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 77 68 61  fferent from wha
e740: 74 20 69 74 20 73 74 61 72 74 65 64 20 62 75 74  t it started but
e750: 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f 72 74 20  .** still short 
e760: 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20 20 54 68  of its goal.  Th
e770: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72  e following char
e780: 74 20 73 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f  t shows the allo
e790: 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f  wed.** transitio
e7a0: 6e 73 20 61 6e 64 20 74 68 65 20 69 6e 73 65 72  ns and the inser
e7b0: 74 65 64 20 69 6e 74 65 72 6d 65 64 69 61 74 65  ted intermediate
e7c0: 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20   states:.**.**  
e7d0: 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48    UNLOCKED -> SH
e7e0: 41 52 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45  ARED.**    SHARE
e7f0: 44 20 2d 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a  D -> RESERVED.**
e800: 20 20 20 20 53 48 41 52 45 44 20 2d 3e 20 28 50      SHARED -> (P
e810: 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55  ENDING) -> EXCLU
e820: 53 49 56 45 0a 2a 2a 20 20 20 20 52 45 53 45 52  SIVE.**    RESER
e830: 56 45 44 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29  VED -> (PENDING)
e840: 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
e850: 20 20 20 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45      PENDING -> E
e860: 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 66  XCLUSIVE.**.** f
e870: 6c 6f 63 6b 28 29 20 6f 6e 6c 79 20 72 65 61 6c  lock() only real
e880: 6c 79 20 73 75 70 70 6f 72 74 20 45 58 43 4c 55  ly support EXCLU
e890: 53 49 56 45 20 6c 6f 63 6b 73 2e 20 20 57 65 20  SIVE locks.  We 
e8a0: 74 72 61 63 6b 20 69 6e 74 65 72 6d 65 64 69 61  track intermedia
e8b0: 74 65 0a 2a 2a 20 6c 6f 63 6b 20 73 74 61 74 65  te.** lock state
e8c0: 73 20 69 6e 20 74 68 65 20 73 71 6c 69 74 65 33  s in the sqlite3
e8d0: 5f 66 69 6c 65 20 73 74 72 75 63 74 75 72 65 2c  _file structure,
e8e0: 20 62 75 74 20 61 6c 6c 20 6c 6f 63 6b 73 20 53   but all locks S
e8f0: 48 41 52 45 44 20 6f 72 0a 2a 2a 20 61 62 6f 76  HARED or.** abov
e900: 65 20 61 72 65 20 72 65 61 6c 6c 79 20 45 58 43  e are really EXC
e910: 4c 55 53 49 56 45 20 6c 6f 63 6b 73 20 61 6e 64  LUSIVE locks and
e920: 20 65 78 63 6c 75 64 65 20 61 6c 6c 20 6f 74 68   exclude all oth
e930: 65 72 20 70 72 6f 63 65 73 73 65 73 20 66 72 6f  er processes fro
e940: 6d 0a 2a 2a 20 61 63 63 65 73 73 20 74 68 65 20  m.** access the 
e950: 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  file..**.** This
e960: 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 6f 6e   routine will on
e970: 6c 79 20 69 6e 63 72 65 61 73 65 20 61 20 6c 6f  ly increase a lo
e980: 63 6b 2e 20 20 55 73 65 20 74 68 65 20 73 71 6c  ck.  Use the sql
e990: 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 0a 2a  ite3OsUnlock().*
e9a0: 2a 20 72 6f 75 74 69 6e 65 20 74 6f 20 6c 6f 77  * routine to low
e9b0: 65 72 20 61 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  er a locking lev
e9c0: 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  el..*/.static in
e9d0: 74 20 66 6c 6f 63 6b 4c 6f 63 6b 28 73 71 6c 69  t flockLock(sqli
e9e0: 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e  te3_file *id, in
e9f0: 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20  t eFileLock) {. 
ea00: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
ea10: 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20  _OK;.  unixFile 
ea20: 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
ea30: 6c 65 2a 29 69 64 3b 0a 0a 20 20 61 73 73 65 72  le*)id;..  asser
ea40: 74 28 20 70 46 69 6c 65 20 29 3b 0a 0a 20 20 2f  t( pFile );..  /
ea50: 2a 20 69 66 20 77 65 20 61 6c 72 65 61 64 79 20  * if we already 
ea60: 68 61 76 65 20 61 20 6c 6f 63 6b 2c 20 69 74 20  have a lock, it 
ea70: 69 73 20 65 78 63 6c 75 73 69 76 65 2e 20 20 0a  is exclusive.  .
ea80: 20 20 2a 2a 20 4a 75 73 74 20 61 64 6a 75 73 74    ** Just adjust
ea90: 20 6c 65 76 65 6c 20 61 6e 64 20 70 75 6e 74 20   level and punt 
eaa0: 6f 6e 20 6f 75 74 74 61 20 68 65 72 65 2e 20 2a  on outta here. *
eab0: 2f 0a 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 65  /.  if (pFile->e
eac0: 46 69 6c 65 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c 4f  FileLock > NO_LO
ead0: 43 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d  CK) {.    pFile-
eae0: 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69  >eFileLock = eFi
eaf0: 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 72 65 74 75  leLock;.    retu
eb00: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
eb10: 7d 0a 20 20 0a 20 20 2f 2a 20 67 72 61 62 20 61  }.  .  /* grab a
eb20: 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
eb30: 20 2a 2f 0a 20 20 0a 20 20 69 66 20 28 66 6c 6f   */.  .  if (flo
eb40: 63 6b 28 70 46 69 6c 65 2d 3e 68 2c 20 4c 4f 43  ck(pFile->h, LOC
eb50: 4b 5f 45 58 20 7c 20 4c 4f 43 4b 5f 4e 42 29 29  K_EX | LOCK_NB))
eb60: 20 7b 0a 20 20 20 20 69 6e 74 20 74 45 72 72 6e   {.    int tErrn
eb70: 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 2f  o = errno;.    /
eb80: 2a 20 64 69 64 6e 27 74 20 67 65 74 2c 20 6d 75  * didn't get, mu
eb90: 73 74 20 62 65 20 62 75 73 79 20 2a 2f 0a 20 20  st be busy */.  
eba0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45 72 72    rc = sqliteErr
ebb0: 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72 6f 72  orFromPosixError
ebc0: 28 74 45 72 72 6e 6f 2c 20 53 51 4c 49 54 45 5f  (tErrno, SQLITE_
ebd0: 49 4f 45 52 52 5f 4c 4f 43 4b 29 3b 0a 20 20 20  IOERR_LOCK);.   
ebe0: 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52   if( IS_LOCK_ERR
ebf0: 4f 52 28 72 63 29 20 29 7b 0a 20 20 20 20 20 20  OR(rc) ){.      
ec00: 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  pFile->lastErrno
ec10: 20 3d 20 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d   = tErrno;.    }
ec20: 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20  .  } else {.    
ec30: 2f 2a 20 67 6f 74 20 69 74 2c 20 73 65 74 20 74  /* got it, set t
ec40: 68 65 20 74 79 70 65 20 61 6e 64 20 72 65 74 75  he type and retu
ec50: 72 6e 20 6f 6b 20 2a 2f 0a 20 20 20 20 70 46 69  rn ok */.    pFi
ec60: 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  le->eFileLock = 
ec70: 65 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 7d 0a 20  eFileLock;.  }. 
ec80: 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20   OSTRACE(("LOCK 
ec90: 20 20 20 25 64 20 25 73 20 25 73 20 28 66 6c 6f     %d %s %s (flo
eca0: 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  ck)\n", pFile->h
ecb0: 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 65 46 69  , azFileLock(eFi
ecc0: 6c 65 4c 6f 63 6b 29 2c 20 0a 20 20 20 20 20 20  leLock), .      
ecd0: 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f       rc==SQLITE_
ece0: 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69  OK ? "ok" : "fai
ecf0: 6c 65 64 22 29 29 3b 0a 23 69 66 64 65 66 20 53  led"));.#ifdef S
ed00: 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f  QLITE_IGNORE_FLO
ed10: 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20  CK_LOCK_ERRORS. 
ed20: 20 69 66 28 20 28 72 63 20 26 20 53 51 4c 49 54   if( (rc & SQLIT
ed30: 45 5f 49 4f 45 52 52 29 20 3d 3d 20 53 51 4c 49  E_IOERR) == SQLI
ed40: 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20 20  TE_IOERR ){.    
ed50: 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
ed60: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ;.  }.#endif /* 
ed70: 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c  SQLITE_IGNORE_FL
ed80: 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 20  OCK_LOCK_ERRORS 
ed90: 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  */.  return rc;.
eda0: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20  }.../*.** Lower 
edb0: 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65  the locking leve
edc0: 6c 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69  l on file descri
edd0: 70 74 6f 72 20 70 46 69 6c 65 20 74 6f 20 65 46  ptor pFile to eF
ede0: 69 6c 65 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c  ileLock.  eFileL
edf0: 6f 63 6b 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65  ock.** must be e
ee00: 69 74 68 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72  ither NO_LOCK or
ee10: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a   SHARED_LOCK..**
ee20: 0a 2a 2a 20 49 66 20 74 68 65 20 6c 6f 63 6b 69  .** If the locki
ee30: 6e 67 20 6c 65 76 65 6c 20 6f 66 20 74 68 65 20  ng level of the 
ee40: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
ee50: 69 73 20 61 6c 72 65 61 64 79 20 61 74 20 6f 72  is already at or
ee60: 20 62 65 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65   below.** the re
ee70: 71 75 65 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20  quested locking 
ee80: 6c 65 76 65 6c 2c 20 74 68 69 73 20 72 6f 75 74  level, this rout
ee90: 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
eea0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 6c  */.static int fl
eeb0: 6f 63 6b 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65  ockUnlock(sqlite
eec0: 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74 20  3_file *id, int 
eed0: 65 46 69 6c 65 4c 6f 63 6b 29 20 7b 0a 20 20 75  eFileLock) {.  u
eee0: 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
eef0: 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
ef00: 20 20 0a 20 20 61 73 73 65 72 74 28 20 70 46 69    .  assert( pFi
ef10: 6c 65 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  le );.  OSTRACE(
ef20: 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20  ("UNLOCK  %d %d 
ef30: 77 61 73 20 25 64 20 70 69 64 3d 25 64 20 28 66  was %d pid=%d (f
ef40: 6c 6f 63 6b 29 5c 6e 22 2c 20 70 46 69 6c 65 2d  lock)\n", pFile-
ef50: 3e 68 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20  >h, eFileLock,. 
ef60: 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d            pFile-
ef70: 3e 65 46 69 6c 65 4c 6f 63 6b 2c 20 67 65 74 70  >eFileLock, getp
ef80: 69 64 28 29 29 29 3b 0a 20 20 61 73 73 65 72 74  id()));.  assert
ef90: 28 20 65 46 69 6c 65 4c 6f 63 6b 3c 3d 53 48 41  ( eFileLock<=SHA
efa0: 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 0a 20  RED_LOCK );.  . 
efb0: 20 2f 2a 20 6e 6f 2d 6f 70 20 69 66 20 70 6f 73   /* no-op if pos
efc0: 73 69 62 6c 65 20 2a 2f 0a 20 20 69 66 28 20 70  sible */.  if( p
efd0: 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  File->eFileLock=
efe0: 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20  =eFileLock ){.  
eff0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
f000: 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20  OK;.  }.  .  /* 
f010: 73 68 61 72 65 64 20 63 61 6e 20 6a 75 73 74 20  shared can just 
f020: 62 65 20 73 65 74 20 62 65 63 61 75 73 65 20 77  be set because w
f030: 65 20 61 6c 77 61 79 73 20 68 61 76 65 20 61 6e  e always have an
f040: 20 65 78 63 6c 75 73 69 76 65 20 2a 2f 0a 20 20   exclusive */.  
f050: 69 66 20 28 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53  if (eFileLock==S
f060: 48 41 52 45 44 5f 4c 4f 43 4b 29 20 7b 0a 20 20  HARED_LOCK) {.  
f070: 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
f080: 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b 0a  ck = eFileLock;.
f090: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
f0a0: 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  E_OK;.  }.  .  /
f0b0: 2a 20 6e 6f 2c 20 72 65 61 6c 6c 79 2c 20 75 6e  * no, really, un
f0c0: 6c 6f 63 6b 2e 20 2a 2f 0a 20 20 69 6e 74 20 72  lock. */.  int r
f0d0: 63 20 3d 20 66 6c 6f 63 6b 28 70 46 69 6c 65 2d  c = flock(pFile-
f0e0: 3e 68 2c 20 4c 4f 43 4b 5f 55 4e 29 3b 0a 20 20  >h, LOCK_UN);.  
f0f0: 69 66 20 28 72 63 29 20 7b 0a 20 20 20 20 69 6e  if (rc) {.    in
f100: 74 20 72 2c 20 74 45 72 72 6e 6f 20 3d 20 65 72  t r, tErrno = er
f110: 72 6e 6f 3b 0a 20 20 20 20 72 20 3d 20 73 71 6c  rno;.    r = sql
f120: 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73 69  iteErrorFromPosi
f130: 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20 53  xError(tErrno, S
f140: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f  QLITE_IOERR_UNLO
f150: 43 4b 29 3b 0a 20 20 20 20 69 66 28 20 49 53 5f  CK);.    if( IS_
f160: 4c 4f 43 4b 5f 45 52 52 4f 52 28 72 29 20 29 7b  LOCK_ERROR(r) ){
f170: 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61  .      pFile->la
f180: 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f  stErrno = tErrno
f190: 3b 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53  ;.    }.#ifdef S
f1a0: 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 46 4c 4f  QLITE_IGNORE_FLO
f1b0: 43 4b 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 0a 20  CK_LOCK_ERRORS. 
f1c0: 20 20 20 69 66 28 20 28 72 20 26 20 53 51 4c 49     if( (r & SQLI
f1d0: 54 45 5f 49 4f 45 52 52 29 20 3d 3d 20 53 51 4c  TE_IOERR) == SQL
f1e0: 49 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20  ITE_IOERR ){.   
f1f0: 20 20 20 72 20 3d 20 53 51 4c 49 54 45 5f 42 55     r = SQLITE_BU
f200: 53 59 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  SY;.    }.#endif
f210: 20 2f 2a 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52   /* SQLITE_IGNOR
f220: 45 5f 46 4c 4f 43 4b 5f 4c 4f 43 4b 5f 45 52 52  E_FLOCK_LOCK_ERR
f230: 4f 52 53 20 2a 2f 0a 20 20 20 20 0a 20 20 20 20  ORS */.    .    
f240: 72 65 74 75 72 6e 20 72 3b 0a 20 20 7d 20 65 6c  return r;.  } el
f250: 73 65 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  se {.    pFile->
f260: 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c  eFileLock = NO_L
f270: 4f 43 4b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  OCK;.    return 
f280: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d  SQLITE_OK;.  }.}
f290: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20  ../*.** Close a 
f2a0: 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
f2b0: 69 6e 74 20 66 6c 6f 63 6b 43 6c 6f 73 65 28 73  int flockClose(s
f2c0: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 29  qlite3_file *id)
f2d0: 20 7b 0a 20 20 69 66 28 20 69 64 20 29 7b 0a 20   {.  if( id ){. 
f2e0: 20 20 20 66 6c 6f 63 6b 55 6e 6c 6f 63 6b 28 69     flockUnlock(i
f2f0: 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 7d  d, NO_LOCK);.  }
f300: 0a 20 20 72 65 74 75 72 6e 20 63 6c 6f 73 65 55  .  return closeU
f310: 6e 69 78 46 69 6c 65 28 69 64 29 3b 0a 7d 0a 0a  nixFile(id);.}..
f320: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
f330: 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
f340: 53 54 59 4c 45 20 26 26 20 21 4f 53 5f 56 58 57  STYLE && !OS_VXW
f350: 4f 52 4b 20 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a  ORK */../*******
f360: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64  ************ End
f370: 20 6f 66 20 74 68 65 20 66 6c 6f 63 6b 20 6c 6f   of the flock lo
f380: 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ck implementatio
f390: 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  n **************
f3a0: 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
f3b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f3c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f3d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f3e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f3f0: 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a  ******/../******
f400: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f410: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f420: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f430: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f440: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
f450: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f460: 2a 20 42 65 67 69 6e 20 4e 61 6d 65 64 20 53 65  * Begin Named Se
f470: 6d 61 70 68 6f 72 65 20 4c 6f 63 6b 69 6e 67 20  maphore Locking 
f480: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
f490: 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 4e  ********.**.** N
f4a0: 61 6d 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6c  amed semaphore l
f4b0: 6f 63 6b 69 6e 67 20 69 73 20 6f 6e 6c 79 20 73  ocking is only s
f4c0: 75 70 70 6f 72 74 65 64 20 6f 6e 20 56 78 57 6f  upported on VxWo
f4d0: 72 6b 73 2e 0a 2a 2a 0a 2a 2a 20 53 65 6d 61 70  rks..**.** Semap
f4e0: 68 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 69 73 20  hore locking is 
f4f0: 6c 69 6b 65 20 64 6f 74 2d 6c 6f 63 6b 20 61 6e  like dot-lock an
f500: 64 20 66 6c 6f 63 6b 20 69 6e 20 74 68 61 74 20  d flock in that 
f510: 69 74 20 72 65 61 6c 6c 79 20 6f 6e 6c 79 0a 2a  it really only.*
f520: 2a 20 73 75 70 70 6f 72 74 73 20 45 58 43 4c 55  * supports EXCLU
f530: 53 49 56 45 20 6c 6f 63 6b 69 6e 67 2e 20 20 4f  SIVE locking.  O
f540: 6e 6c 79 20 61 20 73 69 6e 67 6c 65 20 70 72 6f  nly a single pro
f550: 63 65 73 73 20 63 61 6e 20 72 65 61 64 20 6f 72  cess can read or
f560: 20 77 72 69 74 65 0a 2a 2a 20 74 68 65 20 64 61   write.** the da
f570: 74 61 62 61 73 65 20 66 69 6c 65 20 61 74 20 61  tabase file at a
f580: 20 74 69 6d 65 2e 20 20 54 68 69 73 20 72 65 64   time.  This red
f590: 75 63 65 73 20 70 6f 74 65 6e 74 69 61 6c 20 63  uces potential c
f5a0: 6f 6e 63 75 72 72 65 6e 63 79 2c 20 62 75 74 0a  oncurrency, but.
f5b0: 2a 2a 20 6d 61 6b 65 73 20 74 68 65 20 6c 6f 63  ** makes the loc
f5c0: 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  k implementation
f5d0: 20 6d 75 63 68 20 65 61 73 69 65 72 2e 0a 2a 2f   much easier..*/
f5e0: 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
f5f0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
f600: 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74 68  ine checks if th
f610: 65 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45  ere is a RESERVE
f620: 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74  D lock held on t
f630: 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20  he specified.** 
f640: 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20  file by this or 
f650: 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73  any other proces
f660: 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63  s. If such a loc
f670: 6b 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a  k is held, set *
f680: 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20  pResOut.** to a 
f690: 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f  non-zero value o
f6a0: 74 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75  therwise *pResOu
f6b0: 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f  t is set to zero
f6c0: 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  .  The return va
f6d0: 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f  lue.** is set to
f6e0: 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73   SQLITE_OK unles
f6f0: 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f  s an I/O error o
f700: 63 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63  ccurs during loc
f710: 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73  k checking..*/.s
f720: 74 61 74 69 63 20 69 6e 74 20 73 65 6d 43 68 65  tatic int semChe
f730: 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73  ckReservedLock(s
f740: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
f750: 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 20 7b   int *pResOut) {
f760: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
f770: 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 65 73  TE_OK;.  int res
f780: 65 72 76 65 64 20 3d 20 30 3b 0a 20 20 75 6e 69  erved = 0;.  uni
f790: 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28  xFile *pFile = (
f7a0: 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20  unixFile*)id;.. 
f7b0: 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
f7c0: 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ( return SQLITE_
f7d0: 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52  IOERR_CHECKRESER
f7e0: 56 45 44 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20  VEDLOCK; );.  . 
f7f0: 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 20 29   assert( pFile )
f800: 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66  ;..  /* Check if
f810: 20 61 20 74 68 72 65 61 64 20 69 6e 20 74 68 69   a thread in thi
f820: 73 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20  s process holds 
f830: 73 75 63 68 20 61 20 6c 6f 63 6b 20 2a 2f 0a 20  such a lock */. 
f840: 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69 6c   if( pFile->eFil
f850: 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f 4c 4f 43  eLock>SHARED_LOC
f860: 4b 20 29 7b 0a 20 20 20 20 72 65 73 65 72 76 65  K ){.    reserve
f870: 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 0a 20 20  d = 1;.  }.  .  
f880: 2f 2a 20 4f 74 68 65 72 77 69 73 65 20 73 65 65  /* Otherwise see
f890: 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 70   if some other p
f8a0: 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 69 74 2e  rocess holds it.
f8b0: 20 2a 2f 0a 20 20 69 66 28 20 21 72 65 73 65 72   */.  if( !reser
f8c0: 76 65 64 20 29 7b 0a 20 20 20 20 73 65 6d 5f 74  ved ){.    sem_t
f8d0: 20 2a 70 53 65 6d 20 3d 20 70 46 69 6c 65 2d 3e   *pSem = pFile->
f8e0: 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 3b 0a 20 20  pInode->pSem;.  
f8f0: 20 20 73 74 72 75 63 74 20 73 74 61 74 20 73 74    struct stat st
f900: 61 74 42 75 66 3b 0a 0a 20 20 20 20 69 66 28 20  atBuf;..    if( 
f910: 73 65 6d 5f 74 72 79 77 61 69 74 28 70 53 65 6d  sem_trywait(pSem
f920: 29 3d 3d 2d 31 20 29 7b 0a 20 20 20 20 20 20 69  )==-1 ){.      i
f930: 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e  nt tErrno = errn
f940: 6f 3b 0a 20 20 20 20 20 20 69 66 28 20 45 41 47  o;.      if( EAG
f950: 41 49 4e 20 21 3d 20 74 45 72 72 6e 6f 20 29 7b  AIN != tErrno ){
f960: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
f970: 6c 69 74 65 45 72 72 6f 72 46 72 6f 6d 50 6f 73  liteErrorFromPos
f980: 69 78 45 72 72 6f 72 28 74 45 72 72 6e 6f 2c 20  ixError(tErrno, 
f990: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45  SQLITE_IOERR_CHE
f9a0: 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 29 3b  CKRESERVEDLOCK);
f9b0: 0a 20 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  .        pFile->
f9c0: 6c 61 73 74 45 72 72 6e 6f 20 3d 20 74 45 72 72  lastErrno = tErr
f9d0: 6e 6f 3b 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  no;.      } else
f9e0: 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 73 6f   {.        /* so
f9f0: 6d 65 6f 6e 65 20 65 6c 73 65 20 68 61 73 20 74  meone else has t
fa00: 68 65 20 6c 6f 63 6b 20 77 68 65 6e 20 77 65 20  he lock when we 
fa10: 61 72 65 20 69 6e 20 4e 4f 5f 4c 4f 43 4b 20 2a  are in NO_LOCK *
fa20: 2f 0a 20 20 20 20 20 20 20 20 72 65 73 65 72 76  /.        reserv
fa30: 65 64 20 3d 20 28 70 46 69 6c 65 2d 3e 65 46 69  ed = (pFile->eFi
fa40: 6c 65 4c 6f 63 6b 20 3c 20 53 48 41 52 45 44 5f  leLock < SHARED_
fa50: 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20  LOCK);.      }. 
fa60: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
fa70: 2f 2a 20 77 65 20 63 6f 75 6c 64 20 68 61 76 65  /* we could have
fa80: 20 69 74 20 69 66 20 77 65 20 77 61 6e 74 20 69   it if we want i
fa90: 74 20 2a 2f 0a 20 20 20 20 20 20 73 65 6d 5f 70  t */.      sem_p
faa0: 6f 73 74 28 70 53 65 6d 29 3b 0a 20 20 20 20 7d  ost(pSem);.    }
fab0: 0a 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28  .  }.  OSTRACE((
fac0: 22 54 45 53 54 20 57 52 2d 4c 4f 43 4b 20 25 64  "TEST WR-LOCK %d
fad0: 20 25 64 20 25 64 20 28 73 65 6d 29 5c 6e 22 2c   %d %d (sem)\n",
fae0: 20 70 46 69 6c 65 2d 3e 68 2c 20 72 63 2c 20 72   pFile->h, rc, r
faf0: 65 73 65 72 76 65 64 29 29 3b 0a 0a 20 20 2a 70  eserved));..  *p
fb00: 52 65 73 4f 75 74 20 3d 20 72 65 73 65 72 76 65  ResOut = reserve
fb10: 64 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  d;.  return rc;.
fb20: 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 74 68  }../*.** Lock th
fb30: 65 20 66 69 6c 65 20 77 69 74 68 20 74 68 65 20  e file with the 
fb40: 6c 6f 63 6b 20 73 70 65 63 69 66 69 65 64 20 62  lock specified b
fb50: 79 20 70 61 72 61 6d 65 74 65 72 20 65 46 69 6c  y parameter eFil
fb60: 65 4c 6f 63 6b 20 2d 20 6f 6e 65 0a 2a 2a 20 6f  eLock - one.** o
fb70: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a  f the following:
fb80: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 53  .**.**     (1) S
fb90: 48 41 52 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20  HARED_LOCK.**   
fba0: 20 20 28 32 29 20 52 45 53 45 52 56 45 44 5f 4c    (2) RESERVED_L
fbb0: 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 33 29 20 50  OCK.**     (3) P
fbc0: 45 4e 44 49 4e 47 5f 4c 4f 43 4b 0a 2a 2a 20 20  ENDING_LOCK.**  
fbd0: 20 20 20 28 34 29 20 45 58 43 4c 55 53 49 56 45     (4) EXCLUSIVE
fbe0: 5f 4c 4f 43 4b 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65  _LOCK.**.** Some
fbf0: 74 69 6d 65 73 20 77 68 65 6e 20 72 65 71 75 65  times when reque
fc00: 73 74 69 6e 67 20 6f 6e 65 20 6c 6f 63 6b 20 73  sting one lock s
fc10: 74 61 74 65 2c 20 61 64 64 69 74 69 6f 6e 61 6c  tate, additional
fc20: 20 6c 6f 63 6b 20 73 74 61 74 65 73 0a 2a 2a 20   lock states.** 
fc30: 61 72 65 20 69 6e 73 65 72 74 65 64 20 69 6e 20  are inserted in 
fc40: 62 65 74 77 65 65 6e 2e 20 20 54 68 65 20 6c 6f  between.  The lo
fc50: 63 6b 69 6e 67 20 6d 69 67 68 74 20 66 61 69 6c  cking might fail
fc60: 20 6f 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 6c   on one of the l
fc70: 61 74 65 72 0a 2a 2a 20 74 72 61 6e 73 69 74 69  ater.** transiti
fc80: 6f 6e 73 20 6c 65 61 76 69 6e 67 20 74 68 65 20  ons leaving the 
fc90: 6c 6f 63 6b 20 73 74 61 74 65 20 64 69 66 66 65  lock state diffe
fca0: 72 65 6e 74 20 66 72 6f 6d 20 77 68 61 74 20 69  rent from what i
fcb0: 74 20 73 74 61 72 74 65 64 20 62 75 74 0a 2a 2a  t started but.**
fcc0: 20 73 74 69 6c 6c 20 73 68 6f 72 74 20 6f 66 20   still short of 
fcd0: 69 74 73 20 67 6f 61 6c 2e 20 20 54 68 65 20 66  its goal.  The f
fce0: 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 72 74 20 73  ollowing chart s
fcf0: 68 6f 77 73 20 74 68 65 20 61 6c 6c 6f 77 65 64  hows the allowed
fd00: 0a 2a 2a 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  .** transitions 
fd10: 61 6e 64 20 74 68 65 20 69 6e 73 65 72 74 65 64  and the inserted
fd20: 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74   intermediate st
fd30: 61 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 55  ates:.**.**    U
fd40: 4e 4c 4f 43 4b 45 44 20 2d 3e 20 53 48 41 52 45  NLOCKED -> SHARE
fd50: 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d  D.**    SHARED -
fd60: 3e 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 20 20  > RESERVED.**   
fd70: 20 53 48 41 52 45 44 20 2d 3e 20 28 50 45 4e 44   SHARED -> (PEND
fd80: 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56  ING) -> EXCLUSIV
fd90: 45 0a 2a 2a 20 20 20 20 52 45 53 45 52 56 45 44  E.**    RESERVED
fda0: 20 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e   -> (PENDING) ->
fdb0: 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20   EXCLUSIVE.**   
fdc0: 20 50 45 4e 44 49 4e 47 20 2d 3e 20 45 58 43 4c   PENDING -> EXCL
fdd0: 55 53 49 56 45 0a 2a 2a 0a 2a 2a 20 53 65 6d 61  USIVE.**.** Sema
fde0: 70 68 6f 72 65 20 6c 6f 63 6b 73 20 6f 6e 6c 79  phore locks only
fdf0: 20 72 65 61 6c 6c 79 20 73 75 70 70 6f 72 74 20   really support 
fe00: 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 73 2e  EXCLUSIVE locks.
fe10: 20 20 57 65 20 74 72 61 63 6b 20 69 6e 74 65 72    We track inter
fe20: 6d 65 64 69 61 74 65 0a 2a 2a 20 6c 6f 63 6b 20  mediate.** lock 
fe30: 73 74 61 74 65 73 20 69 6e 20 74 68 65 20 73 71  states in the sq
fe40: 6c 69 74 65 33 5f 66 69 6c 65 20 73 74 72 75 63  lite3_file struc
fe50: 74 75 72 65 2c 20 62 75 74 20 61 6c 6c 20 6c 6f  ture, but all lo
fe60: 63 6b 73 20 53 48 41 52 45 44 20 6f 72 0a 2a 2a  cks SHARED or.**
fe70: 20 61 62 6f 76 65 20 61 72 65 20 72 65 61 6c 6c   above are reall
fe80: 79 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  y EXCLUSIVE lock
fe90: 73 20 61 6e 64 20 65 78 63 6c 75 64 65 20 61 6c  s and exclude al
fea0: 6c 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65  l other processe
feb0: 73 20 66 72 6f 6d 0a 2a 2a 20 61 63 63 65 73 73  s from.** access
fec0: 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a   the file..**.**
fed0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   This routine wi
fee0: 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73 65  ll only increase
fef0: 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74 68   a lock.  Use th
ff00: 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63  e sqlite3OsUnloc
ff10: 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74  k().** routine t
ff20: 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69 6e  o lower a lockin
ff30: 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74  g level..*/.stat
ff40: 69 63 20 69 6e 74 20 73 65 6d 4c 6f 63 6b 28 73  ic int semLock(s
ff50: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c  qlite3_file *id,
ff60: 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20   int eFileLock) 
ff70: 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 46  {.  unixFile *pF
ff80: 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a  ile = (unixFile*
ff90: 29 69 64 3b 0a 20 20 69 6e 74 20 66 64 3b 0a 20  )id;.  int fd;. 
ffa0: 20 73 65 6d 5f 74 20 2a 70 53 65 6d 20 3d 20 70   sem_t *pSem = p
ffb0: 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53  File->pInode->pS
ffc0: 65 6d 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  em;.  int rc = S
ffd0: 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20  QLITE_OK;..  /* 
ffe0: 69 66 20 77 65 20 61 6c 72 65 61 64 79 20 68 61  if we already ha
fff0: 76 65 20 61 20 6c 6f 63 6b 2c 20 69 74 20 69 73  ve a lock, it is
10000 20 65 78 63 6c 75 73 69 76 65 2e 20 20 0a 20 20   exclusive.  .  
10010 2a 2a 20 4a 75 73 74 20 61 64 6a 75 73 74 20 6c  ** Just adjust l
10020 65 76 65 6c 20 61 6e 64 20 70 75 6e 74 20 6f 6e  evel and punt on
10030 20 6f 75 74 74 61 20 68 65 72 65 2e 20 2a 2f 0a   outta here. */.
10040 20 20 69 66 20 28 70 46 69 6c 65 2d 3e 65 46 69    if (pFile->eFi
10050 6c 65 4c 6f 63 6b 20 3e 20 4e 4f 5f 4c 4f 43 4b  leLock > NO_LOCK
10060 29 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65  ) {.    pFile->e
10070 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65  FileLock = eFile
10080 4c 6f 63 6b 3b 0a 20 20 20 20 72 63 20 3d 20 53  Lock;.    rc = S
10090 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 67 6f  QLITE_OK;.    go
100a0 74 6f 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3b  to sem_end_lock;
100b0 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 6c 6f 63  .  }.  .  /* loc
100c0 6b 20 73 65 6d 61 70 68 6f 72 65 20 6e 6f 77 20  k semaphore now 
100d0 62 75 74 20 62 61 69 6c 20 6f 75 74 20 77 68 65  but bail out whe
100e0 6e 20 61 6c 72 65 61 64 79 20 6c 6f 63 6b 65 64  n already locked
100f0 2e 20 2a 2f 0a 20 20 69 66 28 20 73 65 6d 5f 74  . */.  if( sem_t
10100 72 79 77 61 69 74 28 70 53 65 6d 29 3d 3d 2d 31  rywait(pSem)==-1
10110 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
10120 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 67 6f  ITE_BUSY;.    go
10130 74 6f 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3b  to sem_end_lock;
10140 0a 20 20 7d 0a 0a 20 20 2f 2a 20 67 6f 74 20 69  .  }..  /* got i
10150 74 2c 20 73 65 74 20 74 68 65 20 74 79 70 65 20  t, set the type 
10160 61 6e 64 20 72 65 74 75 72 6e 20 6f 6b 20 2a 2f  and return ok */
10170 0a 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c  .  pFile->eFileL
10180 6f 63 6b 20 3d 20 65 46 69 6c 65 4c 6f 63 6b 3b  ock = eFileLock;
10190 0a 0a 20 73 65 6d 5f 65 6e 64 5f 6c 6f 63 6b 3a  .. sem_end_lock:
101a0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
101b0 0a 2f 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65  ./*.** Lower the
101c0 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
101d0 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
101e0 72 20 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65  r pFile to eFile
101f0 4c 6f 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b  Lock.  eFileLock
10200 0a 2a 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68  .** must be eith
10210 65 72 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48  er NO_LOCK or SH
10220 41 52 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a  ARED_LOCK..**.**
10230 20 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   If the locking 
10240 6c 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c  level of the fil
10250 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
10260 61 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65  already at or be
10270 6c 6f 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65  low.** the reque
10280 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  sted locking lev
10290 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  el, this routine
102a0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
102b0 73 74 61 74 69 63 20 69 6e 74 20 73 65 6d 55 6e  static int semUn
102c0 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  lock(sqlite3_fil
102d0 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65  e *id, int eFile
102e0 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69  Lock) {.  unixFi
102f0 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
10300 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 73 65 6d  xFile*)id;.  sem
10310 5f 74 20 2a 70 53 65 6d 20 3d 20 70 46 69 6c 65  _t *pSem = pFile
10320 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53 65 6d 3b 0a  ->pInode->pSem;.
10330 0a 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65  .  assert( pFile
10340 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 53   );.  assert( pS
10350 65 6d 20 29 3b 0a 20 20 4f 53 54 52 41 43 45 28  em );.  OSTRACE(
10360 28 22 55 4e 4c 4f 43 4b 20 20 25 64 20 25 64 20  ("UNLOCK  %d %d 
10370 77 61 73 20 25 64 20 70 69 64 3d 25 64 20 28 73  was %d pid=%d (s
10380 65 6d 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  em)\n", pFile->h
10390 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 09 20 20  , eFileLock,..  
103a0 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
103b0 6b 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a 20  k, getpid()));. 
103c0 20 61 73 73 65 72 74 28 20 65 46 69 6c 65 4c 6f   assert( eFileLo
103d0 63 6b 3c 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  ck<=SHARED_LOCK 
103e0 29 3b 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2d 6f 70  );.  .  /* no-op
103f0 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a 2f 0a   if possible */.
10400 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 65 46 69    if( pFile->eFi
10410 6c 65 4c 6f 63 6b 3d 3d 65 46 69 6c 65 4c 6f 63  leLock==eFileLoc
10420 6b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  k ){.    return 
10430 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
10440 20 0a 20 20 2f 2a 20 73 68 61 72 65 64 20 63 61   .  /* shared ca
10450 6e 20 6a 75 73 74 20 62 65 20 73 65 74 20 62 65  n just be set be
10460 63 61 75 73 65 20 77 65 20 61 6c 77 61 79 73 20  cause we always 
10470 68 61 76 65 20 61 6e 20 65 78 63 6c 75 73 69 76  have an exclusiv
10480 65 20 2a 2f 0a 20 20 69 66 20 28 65 46 69 6c 65  e */.  if (eFile
10490 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  Lock==SHARED_LOC
104a0 4b 29 20 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e  K) {.    pFile->
104b0 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c  eFileLock = eFil
104c0 65 4c 6f 63 6b 3b 0a 20 20 20 20 72 65 74 75 72  eLock;.    retur
104d0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
104e0 0a 20 20 0a 20 20 2f 2a 20 6e 6f 2c 20 72 65 61  .  .  /* no, rea
104f0 6c 6c 79 20 75 6e 6c 6f 63 6b 2e 20 2a 2f 0a 20  lly unlock. */. 
10500 20 69 66 20 28 20 73 65 6d 5f 70 6f 73 74 28 70   if ( sem_post(p
10510 53 65 6d 29 3d 3d 2d 31 20 29 20 7b 0a 20 20 20  Sem)==-1 ) {.   
10520 20 69 6e 74 20 72 63 2c 20 74 45 72 72 6e 6f 20   int rc, tErrno 
10530 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 72 63 20  = errno;.    rc 
10540 3d 20 73 71 6c 69 74 65 45 72 72 6f 72 46 72 6f  = sqliteErrorFro
10550 6d 50 6f 73 69 78 45 72 72 6f 72 28 74 45 72 72  mPosixError(tErr
10560 6e 6f 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  no, SQLITE_IOERR
10570 5f 55 4e 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66  _UNLOCK);.    if
10580 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f 52 28  ( IS_LOCK_ERROR(
10590 72 63 29 20 29 7b 0a 20 20 20 20 20 20 70 46 69  rc) ){.      pFi
105a0 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20  le->lastErrno = 
105b0 74 45 72 72 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20  tErrno;.    }.  
105c0 20 20 72 65 74 75 72 6e 20 72 63 3b 20 0a 20 20    return rc; .  
105d0 7d 0a 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65  }.  pFile->eFile
105e0 4c 6f 63 6b 20 3d 20 4e 4f 5f 4c 4f 43 4b 3b 0a  Lock = NO_LOCK;.
105f0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
10600 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2a 20 43 6c  OK;.}../*. ** Cl
10610 6f 73 65 20 61 20 66 69 6c 65 2e 0a 20 2a 2f 0a  ose a file.. */.
10620 73 74 61 74 69 63 20 69 6e 74 20 73 65 6d 43 6c  static int semCl
10630 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ose(sqlite3_file
10640 20 2a 69 64 29 20 7b 0a 20 20 69 66 28 20 69 64   *id) {.  if( id
10650 20 29 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65   ){.    unixFile
10660 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
10670 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20 73 65 6d  ile*)id;.    sem
10680 55 6e 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f  Unlock(id, NO_LO
10690 43 4b 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  CK);.    assert(
106a0 20 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 75 6e   pFile );.    un
106b0 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
106c0 20 20 20 20 72 65 6c 65 61 73 65 4c 6f 63 6b 49      releaseLockI
106d0 6e 66 6f 28 70 46 69 6c 65 2d 3e 70 49 6e 6f 64  nfo(pFile->pInod
106e0 65 29 3b 0a 20 20 20 20 75 6e 69 78 4c 65 61 76  e);.    unixLeav
106f0 65 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 63 6c  eMutex();.    cl
10700 6f 73 65 55 6e 69 78 46 69 6c 65 28 69 64 29 3b  oseUnixFile(id);
10710 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
10720 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64  LITE_OK;.}..#end
10730 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53  if /* OS_VXWORKS
10740 20 2a 2f 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65 64 20   */./*.** Named 
10750 73 65 6d 61 70 68 6f 72 65 20 6c 6f 63 6b 69 6e  semaphore lockin
10760 67 20 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61  g is only availa
10770 62 6c 65 20 6f 6e 20 56 78 57 6f 72 6b 73 2e 0a  ble on VxWorks..
10780 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
10790 2a 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 6e 61  ** End of the na
107a0 6d 65 64 20 73 65 6d 61 70 68 6f 72 65 20 6c 6f  med semaphore lo
107b0 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ck implementatio
107c0 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  n **************
107d0 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
107e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
107f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10800 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10810 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10820 2a 2f 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  */.../**********
10830 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10840 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10850 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10860 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10870 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
10880 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
10890 20 42 65 67 69 6e 20 41 46 50 20 4c 6f 63 6b 69   Begin AFP Locki
108a0 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ng *************
108b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
108c0 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 41 46 50 20 69  ****.**.** AFP i
108d0 73 20 74 68 65 20 41 70 70 6c 65 20 46 69 6c 69  s the Apple Fili
108e0 6e 67 20 50 72 6f 74 6f 63 6f 6c 2e 20 20 41 46  ng Protocol.  AF
108f0 50 20 69 73 20 61 20 6e 65 74 77 6f 72 6b 20 66  P is a network f
10900 69 6c 65 73 79 73 74 65 6d 20 66 6f 75 6e 64 0a  ilesystem found.
10910 2a 2a 20 6f 6e 20 41 70 70 6c 65 20 4d 61 63 69  ** on Apple Maci
10920 6e 74 6f 73 68 20 63 6f 6d 70 75 74 65 72 73 20  ntosh computers 
10930 2d 20 62 6f 74 68 20 4f 53 39 20 61 6e 64 20 4f  - both OS9 and O
10940 53 58 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 72 64 2d  SX..**.** Third-
10950 70 61 72 74 79 20 69 6d 70 6c 65 6d 65 6e 74 61  party implementa
10960 74 69 6f 6e 73 20 6f 66 20 41 46 50 20 61 72 65  tions of AFP are
10970 20 61 76 61 69 6c 61 62 6c 65 2e 20 20 42 75 74   available.  But
10980 20 74 68 69 73 20 63 6f 64 65 20 68 65 72 65 0a   this code here.
10990 2a 2a 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 6f 6e  ** only works on
109a0 20 4f 53 58 2e 0a 2a 2f 0a 0a 23 69 66 20 64 65   OSX..*/..#if de
109b0 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
109c0 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
109d0 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
109e0 2f 2a 0a 2a 2a 20 54 68 65 20 61 66 70 4c 6f 63  /*.** The afpLoc
109f0 6b 69 6e 67 43 6f 6e 74 65 78 74 20 73 74 72 75  kingContext stru
10a00 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73 20 61  cture contains a
10a10 6c 6c 20 61 66 70 20 6c 6f 63 6b 20 73 70 65 63  ll afp lock spec
10a20 69 66 69 63 20 73 74 61 74 65 0a 2a 2f 0a 74 79  ific state.*/.ty
10a30 70 65 64 65 66 20 73 74 72 75 63 74 20 61 66 70  pedef struct afp
10a40 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 61  LockingContext a
10a50 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
10a60 3b 0a 73 74 72 75 63 74 20 61 66 70 4c 6f 63 6b  ;.struct afpLock
10a70 69 6e 67 43 6f 6e 74 65 78 74 20 7b 0a 20 20 69  ingContext {.  i
10a80 6e 74 20 72 65 73 65 72 76 65 64 3b 0a 20 20 63  nt reserved;.  c
10a90 6f 6e 73 74 20 63 68 61 72 20 2a 64 62 50 61 74  onst char *dbPat
10aa0 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  h;             /
10ab0 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6f 70  * Name of the op
10ac0 65 6e 20 66 69 6c 65 20 2a 2f 0a 7d 3b 0a 0a 73  en file */.};..s
10ad0 74 72 75 63 74 20 42 79 74 65 52 61 6e 67 65 4c  truct ByteRangeL
10ae0 6f 63 6b 50 42 32 0a 7b 0a 20 20 75 6e 73 69 67  ockPB2.{.  unsig
10af0 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67 20 6f 66  ned long long of
10b00 66 73 65 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  fset;        /* 
10b10 6f 66 66 73 65 74 20 74 6f 20 66 69 72 73 74 20  offset to first 
10b20 62 79 74 65 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a  byte to lock */.
10b30 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20    unsigned long 
10b40 6c 6f 6e 67 20 6c 65 6e 67 74 68 3b 20 20 20 20  long length;    
10b50 20 20 20 20 2f 2a 20 6e 62 72 20 6f 66 20 62 79      /* nbr of by
10b60 74 65 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a 20  tes to lock */. 
10b70 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c   unsigned long l
10b80 6f 6e 67 20 72 65 74 52 61 6e 67 65 53 74 61 72  ong retRangeStar
10b90 74 3b 20 2f 2a 20 6e 62 72 20 6f 66 20 31 73 74  t; /* nbr of 1st
10ba0 20 62 79 74 65 20 6c 6f 63 6b 65 64 20 69 66 20   byte locked if 
10bb0 73 75 63 63 65 73 73 66 75 6c 20 2a 2f 0a 20 20  successful */.  
10bc0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 75 6e  unsigned char un
10bd0 4c 6f 63 6b 46 6c 61 67 3b 20 20 20 20 20 20 20  LockFlag;       
10be0 20 20 2f 2a 20 31 20 3d 20 75 6e 6c 6f 63 6b 2c    /* 1 = unlock,
10bf0 20 30 20 3d 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75   0 = lock */.  u
10c00 6e 73 69 67 6e 65 64 20 63 68 61 72 20 73 74 61  nsigned char sta
10c10 72 74 45 6e 64 46 6c 61 67 3b 20 20 20 20 20 20  rtEndFlag;      
10c20 20 2f 2a 20 31 3d 72 65 6c 20 74 6f 20 65 6e 64   /* 1=rel to end
10c30 20 6f 66 20 66 6f 72 6b 2c 20 30 3d 72 65 6c 20   of fork, 0=rel 
10c40 74 6f 20 73 74 61 72 74 20 2a 2f 0a 20 20 69 6e  to start */.  in
10c50 74 20 66 64 3b 20 20 20 20 20 20 20 20 20 20 20  t fd;           
10c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10c70 2f 2a 20 66 69 6c 65 20 64 65 73 63 20 74 6f 20  /* file desc to 
10c80 61 73 73 6f 63 20 74 68 69 73 20 6c 6f 63 6b 20  assoc this lock 
10c90 77 69 74 68 20 2a 2f 0a 7d 3b 0a 0a 23 64 65 66  with */.};..#def
10ca0 69 6e 65 20 61 66 70 66 73 42 79 74 65 52 61 6e  ine afpfsByteRan
10cb0 67 65 4c 6f 63 6b 32 46 53 43 54 4c 20 20 20 20  geLock2FSCTL    
10cc0 20 20 20 20 5f 49 4f 57 52 28 27 7a 27 2c 20 32      _IOWR('z', 2
10cd0 33 2c 20 73 74 72 75 63 74 20 42 79 74 65 52 61  3, struct ByteRa
10ce0 6e 67 65 4c 6f 63 6b 50 42 32 29 0a 0a 2f 2a 0a  ngeLockPB2)../*.
10cf0 2a 2a 20 54 68 69 73 20 69 73 20 61 20 75 74 69  ** This is a uti
10d00 6c 69 74 79 20 66 6f 72 20 73 65 74 74 69 6e 67  lity for setting
10d10 20 6f 72 20 63 6c 65 61 72 69 6e 67 20 61 20 62   or clearing a b
10d20 69 74 2d 72 61 6e 67 65 20 6c 6f 63 6b 20 6f 6e  it-range lock on
10d30 20 61 6e 0a 2a 2a 20 41 46 50 20 66 69 6c 65 73   an.** AFP files
10d40 79 73 74 65 6d 2e 0a 2a 2a 20 0a 2a 2a 20 52 65  ystem..** .** Re
10d50 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
10d60 6e 20 73 75 63 63 65 73 73 2c 20 53 51 4c 49 54  n success, SQLIT
10d70 45 5f 42 55 53 59 20 6f 6e 20 66 61 69 6c 75 72  E_BUSY on failur
10d80 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
10d90 20 61 66 70 53 65 74 4c 6f 63 6b 28 0a 20 20 63   afpSetLock(.  c
10da0 6f 6e 73 74 20 63 68 61 72 20 2a 70 61 74 68 2c  onst char *path,
10db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10dc0 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c   Name of the fil
10dd0 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20 6f  e to be locked o
10de0 72 20 75 6e 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20  r unlocked */.  
10df0 75 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 2c  unixFile *pFile,
10e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10e10 2a 20 4f 70 65 6e 20 66 69 6c 65 20 64 65 73 63  * Open file desc
10e20 72 69 70 74 6f 72 20 6f 6e 20 70 61 74 68 20 2a  riptor on path *
10e30 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e  /.  unsigned lon
10e40 67 20 6c 6f 6e 67 20 6f 66 66 73 65 74 2c 20 20  g long offset,  
10e50 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65     /* First byte
10e60 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20 2a 2f   to be locked */
10e70 0a 20 20 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67  .  unsigned long
10e80 20 6c 6f 6e 67 20 6c 65 6e 67 74 68 2c 20 20 20   long length,   
10e90 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
10ea0 79 74 65 73 20 74 6f 20 6c 6f 63 6b 20 2a 2f 0a  ytes to lock */.
10eb0 20 20 69 6e 74 20 73 65 74 4c 6f 63 6b 46 6c 61    int setLockFla
10ec0 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g               
10ed0 20 2f 2a 20 54 72 75 65 20 74 6f 20 73 65 74 20   /* True to set 
10ee0 6c 6f 63 6b 2e 20 20 46 61 6c 73 65 20 74 6f 20  lock.  False to 
10ef0 63 6c 65 61 72 20 6c 6f 63 6b 20 2a 2f 0a 29 7b  clear lock */.){
10f00 0a 20 20 73 74 72 75 63 74 20 42 79 74 65 52 61  .  struct ByteRa
10f10 6e 67 65 4c 6f 63 6b 50 42 32 20 70 62 3b 0a 20  ngeLockPB2 pb;. 
10f20 20 69 6e 74 20 65 72 72 3b 0a 20 20 0a 20 20 70   int err;.  .  p
10f30 62 2e 75 6e 4c 6f 63 6b 46 6c 61 67 20 3d 20 73  b.unLockFlag = s
10f40 65 74 4c 6f 63 6b 46 6c 61 67 20 3f 20 30 20 3a  etLockFlag ? 0 :
10f50 20 31 3b 0a 20 20 70 62 2e 73 74 61 72 74 45 6e   1;.  pb.startEn
10f60 64 46 6c 61 67 20 3d 20 30 3b 0a 20 20 70 62 2e  dFlag = 0;.  pb.
10f70 6f 66 66 73 65 74 20 3d 20 6f 66 66 73 65 74 3b  offset = offset;
10f80 0a 20 20 70 62 2e 6c 65 6e 67 74 68 20 3d 20 6c  .  pb.length = l
10f90 65 6e 67 74 68 3b 20 0a 20 20 70 62 2e 66 64 20  ength; .  pb.fd 
10fa0 3d 20 70 46 69 6c 65 2d 3e 68 3b 0a 20 20 0a 20  = pFile->h;.  . 
10fb0 20 4f 53 54 52 41 43 45 28 28 22 41 46 50 53 45   OSTRACE(("AFPSE
10fc0 54 4c 4f 43 4b 20 5b 25 73 5d 20 66 6f 72 20 25  TLOCK [%s] for %
10fd0 64 25 73 20 69 6e 20 72 61 6e 67 65 20 25 6c 6c  d%s in range %ll
10fe0 78 3a 25 6c 6c 78 5c 6e 22 2c 20 0a 20 20 20 20  x:%llx\n", .    
10ff0 28 73 65 74 4c 6f 63 6b 46 6c 61 67 3f 22 4f 4e  (setLockFlag?"ON
11000 22 3a 22 4f 46 46 22 29 2c 20 70 46 69 6c 65 2d  ":"OFF"), pFile-
11010 3e 68 2c 20 28 70 62 2e 66 64 3d 3d 2d 31 3f 22  >h, (pb.fd==-1?"
11020 5b 74 65 73 74 76 61 6c 2d 31 5d 22 3a 22 22 29  [testval-1]":"")
11030 2c 0a 20 20 20 20 6f 66 66 73 65 74 2c 20 6c 65  ,.    offset, le
11040 6e 67 74 68 29 29 3b 0a 20 20 65 72 72 20 3d 20  ngth));.  err = 
11050 66 73 63 74 6c 28 70 61 74 68 2c 20 61 66 70 66  fsctl(path, afpf
11060 73 42 79 74 65 52 61 6e 67 65 4c 6f 63 6b 32 46  sByteRangeLock2F
11070 53 43 54 4c 2c 20 26 70 62 2c 20 30 29 3b 0a 20  SCTL, &pb, 0);. 
11080 20 69 66 20 28 20 65 72 72 3d 3d 2d 31 20 29 20   if ( err==-1 ) 
11090 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20  {.    int rc;.  
110a0 20 20 69 6e 74 20 74 45 72 72 6e 6f 20 3d 20 65    int tErrno = e
110b0 72 72 6e 6f 3b 0a 20 20 20 20 4f 53 54 52 41 43  rrno;.    OSTRAC
110c0 45 28 28 22 41 46 50 53 45 54 4c 4f 43 4b 20 66  E(("AFPSETLOCK f
110d0 61 69 6c 65 64 20 74 6f 20 66 73 63 74 6c 28 29  ailed to fsctl()
110e0 20 27 25 73 27 20 25 64 20 25 73 5c 6e 22 2c 0a   '%s' %d %s\n",.
110f0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61 74               pat
11100 68 2c 20 74 45 72 72 6e 6f 2c 20 73 74 72 65 72  h, tErrno, strer
11110 72 6f 72 28 74 45 72 72 6e 6f 29 29 29 3b 0a 23  ror(tErrno)));.#
11120 69 66 64 65 66 20 53 51 4c 49 54 45 5f 49 47 4e  ifdef SQLITE_IGN
11130 4f 52 45 5f 41 46 50 5f 4c 4f 43 4b 5f 45 52 52  ORE_AFP_LOCK_ERR
11140 4f 52 53 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  ORS.    rc = SQL
11150 49 54 45 5f 42 55 53 59 3b 0a 23 65 6c 73 65 0a  ITE_BUSY;.#else.
11160 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 45      rc = sqliteE
11170 72 72 6f 72 46 72 6f 6d 50 6f 73 69 78 45 72 72  rrorFromPosixErr
11180 6f 72 28 74 45 72 72 6e 6f 2c 0a 20 20 20 20 20  or(tErrno,.     
11190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
111a0 65 74 4c 6f 63 6b 46 6c 61 67 20 3f 20 53 51 4c  etLockFlag ? SQL
111b0 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 20 3a  ITE_IOERR_LOCK :
111c0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e   SQLITE_IOERR_UN
111d0 4c 4f 43 4b 29 3b 0a 23 65 6e 64 69 66 20 2f 2a  LOCK);.#endif /*
111e0 20 53 51 4c 49 54 45 5f 49 47 4e 4f 52 45 5f 41   SQLITE_IGNORE_A
111f0 46 50 5f 4c 4f 43 4b 5f 45 52 52 4f 52 53 20 2a  FP_LOCK_ERRORS *
11200 2f 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43  /.    if( IS_LOC
11210 4b 5f 45 52 52 4f 52 28 72 63 29 20 29 7b 0a 20  K_ERROR(rc) ){. 
11220 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
11230 45 72 72 6e 6f 20 3d 20 74 45 72 72 6e 6f 3b 0a  Errno = tErrno;.
11240 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
11250 20 72 63 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a   rc;.  } else {.
11260 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
11270 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  E_OK;.  }.}../*.
11280 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
11290 63 68 65 63 6b 73 20 69 66 20 74 68 65 72 65 20  checks if there 
112a0 69 73 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  is a RESERVED lo
112b0 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73  ck held on the s
112c0 70 65 63 69 66 69 65 64 0a 2a 2a 20 66 69 6c 65  pecified.** file
112d0 20 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20   by this or any 
112e0 6f 74 68 65 72 20 70 72 6f 63 65 73 73 2e 20 49  other process. I
112f0 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73  f such a lock is
11300 20 68 65 6c 64 2c 20 73 65 74 20 2a 70 52 65 73   held, set *pRes
11310 4f 75 74 0a 2a 2a 20 74 6f 20 61 20 6e 6f 6e 2d  Out.** to a non-
11320 7a 65 72 6f 20 76 61 6c 75 65 20 6f 74 68 65 72  zero value other
11330 77 69 73 65 20 2a 70 52 65 73 4f 75 74 20 69 73  wise *pResOut is
11340 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 20 54   set to zero.  T
11350 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 0a  he return value.
11360 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 53 51 4c  ** is set to SQL
11370 49 54 45 5f 4f 4b 20 75 6e 6c 65 73 73 20 61 6e  ITE_OK unless an
11380 20 49 2f 4f 20 65 72 72 6f 72 20 6f 63 63 75 72   I/O error occur
11390 73 20 64 75 72 69 6e 67 20 6c 6f 63 6b 20 63 68  s during lock ch
113a0 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  ecking..*/.stati
113b0 63 20 69 6e 74 20 61 66 70 43 68 65 63 6b 52 65  c int afpCheckRe
113c0 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74  servedLock(sqlit
113d0 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 6e 74  e3_file *id, int
113e0 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20 69 6e   *pResOut){.  in
113f0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
11400 3b 0a 20 20 69 6e 74 20 72 65 73 65 72 76 65 64  ;.  int reserved
11410 20 3d 20 30 3b 0a 20 20 75 6e 69 78 46 69 6c 65   = 0;.  unixFile
11420 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46   *pFile = (unixF
11430 69 6c 65 2a 29 69 64 3b 0a 20 20 0a 20 20 53 69  ile*)id;.  .  Si
11440 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 72  mulateIOError( r
11450 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
11460 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44  RR_CHECKRESERVED
11470 4c 4f 43 4b 3b 20 29 3b 0a 20 20 0a 20 20 61 73  LOCK; );.  .  as
11480 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20  sert( pFile );. 
11490 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65   afpLockingConte
114a0 78 74 20 2a 63 6f 6e 74 65 78 74 20 3d 20 28 61  xt *context = (a
114b0 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
114c0 20 2a 29 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69   *) pFile->locki
114d0 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 69 66 28  ngContext;.  if(
114e0 20 63 6f 6e 74 65 78 74 2d 3e 72 65 73 65 72 76   context->reserv
114f0 65 64 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 4f  ed ){.    *pResO
11500 75 74 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75  ut = 1;.    retu
11510 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
11520 7d 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74  }.  unixEnterMut
11530 65 78 28 29 3b 20 2f 2a 20 42 65 63 61 75 73 65  ex(); /* Because
11540 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 69   pFile->pInode i
11550 73 20 73 68 61 72 65 64 20 61 63 72 6f 73 73 20  s shared across 
11560 74 68 72 65 61 64 73 20 2a 2f 0a 20 20 0a 20 20  threads */.  .  
11570 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 20 74 68  /* Check if a th
11580 72 65 61 64 20 69 6e 20 74 68 69 73 20 70 72 6f  read in this pro
11590 63 65 73 73 20 68 6f 6c 64 73 20 73 75 63 68 20  cess holds such 
115a0 61 20 6c 6f 63 6b 20 2a 2f 0a 20 20 69 66 28 20  a lock */.  if( 
115b0 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d 3e 65  pFile->pInode->e
115c0 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45 44 5f  FileLock>SHARED_
115d0 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 72 65 73 65  LOCK ){.    rese
115e0 72 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  rved = 1;.  }.  
115f0 0a 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 20  .  /* Otherwise 
11600 73 65 65 20 69 66 20 73 6f 6d 65 20 6f 74 68 65  see if some othe
11610 72 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20  r process holds 
11620 69 74 2e 0a 20 20 20 2a 2f 0a 20 20 69 66 28 20  it..   */.  if( 
11630 21 72 65 73 65 72 76 65 64 20 29 7b 0a 20 20 20  !reserved ){.   
11640 20 2f 2a 20 6c 6f 63 6b 20 74 68 65 20 52 45 53   /* lock the RES
11650 45 52 56 45 44 20 62 79 74 65 20 2a 2f 0a 20 20  ERVED byte */.  
11660 20 20 69 6e 74 20 6c 72 63 20 3d 20 61 66 70 53    int lrc = afpS
11670 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
11680 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 52  dbPath, pFile, R
11690 45 53 45 52 56 45 44 5f 42 59 54 45 2c 20 31 2c  ESERVED_BYTE, 1,
116a0 31 29 3b 20 20 0a 20 20 20 20 69 66 28 20 53 51  1);  .    if( SQ
116b0 4c 49 54 45 5f 4f 4b 3d 3d 6c 72 63 20 29 7b 0a  LITE_OK==lrc ){.
116c0 20 20 20 20 20 20 2f 2a 20 69 66 20 77 65 20 73        /* if we s
116d0 75 63 63 65 65 64 65 64 20 69 6e 20 74 61 6b 69  ucceeded in taki
116e0 6e 67 20 74 68 65 20 72 65 73 65 72 76 65 64 20  ng the reserved 
116f0 6c 6f 63 6b 2c 20 75 6e 6c 6f 63 6b 20 69 74 20  lock, unlock it 
11700 74 6f 20 72 65 73 74 6f 72 65 0a 20 20 20 20 20  to restore.     
11710 20 2a 2a 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   ** the original
11720 20 73 74 61 74 65 20 2a 2f 0a 20 20 20 20 20 20   state */.      
11730 6c 72 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b  lrc = afpSetLock
11740 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68  (context->dbPath
11750 2c 20 70 46 69 6c 65 2c 20 52 45 53 45 52 56 45  , pFile, RESERVE
11760 44 5f 42 59 54 45 2c 20 31 2c 20 30 29 3b 0a 20  D_BYTE, 1, 0);. 
11770 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
11780 20 20 2f 2a 20 69 66 20 77 65 20 66 61 69 6c 65    /* if we faile
11790 64 20 74 6f 20 67 65 74 20 74 68 65 20 6c 6f 63  d to get the loc
117a0 6b 20 74 68 65 6e 20 73 6f 6d 65 6f 6e 65 20 65  k then someone e
117b0 6c 73 65 20 6d 75 73 74 20 68 61 76 65 20 69 74  lse must have it
117c0 20 2a 2f 0a 20 20 20 20 20 20 72 65 73 65 72 76   */.      reserv
117d0 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  ed = 1;.    }.  
117e0 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52    if( IS_LOCK_ER
117f0 52 4f 52 28 6c 72 63 29 20 29 7b 0a 20 20 20 20  ROR(lrc) ){.    
11800 20 20 72 63 3d 6c 72 63 3b 0a 20 20 20 20 7d 0a    rc=lrc;.    }.
11810 20 20 7d 0a 20 20 0a 20 20 75 6e 69 78 4c 65 61    }.  .  unixLea
11820 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 4f 53 54  veMutex();.  OST
11830 52 41 43 45 28 28 22 54 45 53 54 20 57 52 2d 4c  RACE(("TEST WR-L
11840 4f 43 4b 20 25 64 20 25 64 20 25 64 20 28 61 66  OCK %d %d %d (af
11850 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  p)\n", pFile->h,
11860 20 72 63 2c 20 72 65 73 65 72 76 65 64 29 29 3b   rc, reserved));
11870 0a 20 20 0a 20 20 2a 70 52 65 73 4f 75 74 20 3d  .  .  *pResOut =
11880 20 72 65 73 65 72 76 65 64 3b 0a 20 20 72 65 74   reserved;.  ret
11890 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
118a0 20 4c 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77   Lock the file w
118b0 69 74 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65  ith the lock spe
118c0 63 69 66 69 65 64 20 62 79 20 70 61 72 61 6d 65  cified by parame
118d0 74 65 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20  ter eFileLock - 
118e0 6f 6e 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f  one.** of the fo
118f0 6c 6c 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20  llowing:.**.**  
11900 20 20 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f     (1) SHARED_LO
11910 43 4b 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45  CK.**     (2) RE
11920 53 45 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20  SERVED_LOCK.**  
11930 20 20 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c     (3) PENDING_L
11940 4f 43 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45  OCK.**     (4) E
11950 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a  XCLUSIVE_LOCK.**
11960 0a 2a 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68  .** Sometimes wh
11970 65 6e 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e  en requesting on
11980 65 20 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64  e lock state, ad
11990 64 69 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74  ditional lock st
119a0 61 74 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65  ates.** are inse
119b0 72 74 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e  rted in between.
119c0 20 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69    The locking mi
119d0 67 68 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20  ght fail on one 
119e0 6f 66 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20  of the later.** 
119f0 74 72 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76  transitions leav
11a00 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61  ing the lock sta
11a10 74 65 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f  te different fro
11a20 6d 20 77 68 61 74 20 69 74 20 73 74 61 72 74 65  m what it starte
11a30 64 20 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73  d but.** still s
11a40 68 6f 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c  hort of its goal
11a50 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .  The following
11a60 20 63 68 61 72 74 20 73 68 6f 77 73 20 74 68 65   chart shows the
11a70 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e   allowed.** tran
11a80 73 69 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20  sitions and the 
11a90 69 6e 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65  inserted interme
11aa0 64 69 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a  diate states:.**
11ab0 0a 2a 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20  .**    UNLOCKED 
11ac0 2d 3e 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20  -> SHARED.**    
11ad0 53 48 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56  SHARED -> RESERV
11ae0 45 44 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20  ED.**    SHARED 
11af0 2d 3e 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20  -> (PENDING) -> 
11b00 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20  EXCLUSIVE.**    
11b10 52 45 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e  RESERVED -> (PEN
11b20 44 49 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49  DING) -> EXCLUSI
11b30 56 45 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47  VE.**    PENDING
11b40 20 2d 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a   -> EXCLUSIVE.**
11b50 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
11b60 20 77 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65   will only incre
11b70 61 73 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65  ase a lock.  Use
11b80 20 74 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e   the sqlite3OsUn
11b90 6c 6f 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e  lock().** routin
11ba0 65 20 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63  e to lower a loc
11bb0 6b 69 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73  king level..*/.s
11bc0 74 61 74 69 63 20 69 6e 74 20 61 66 70 4c 6f 63  tatic int afpLoc
11bd0 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
11be0 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63  id, int eFileLoc
11bf0 6b 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  k){.  int rc = S
11c00 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78  QLITE_OK;.  unix
11c10 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
11c20 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 73  nixFile*)id;.  s
11c30 74 72 75 63 74 20 75 6e 69 78 49 6e 6f 64 65 49  truct unixInodeI
11c40 6e 66 6f 20 2a 70 49 6e 6f 64 65 20 3d 20 70 46  nfo *pInode = pF
11c50 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 20 20 61  ile->pInode;.  a
11c60 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  fpLockingContext
11c70 20 2a 63 6f 6e 74 65 78 74 20 3d 20 28 61 66 70   *context = (afp
11c80 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
11c90 29 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  ) pFile->locking
11ca0 43 6f 6e 74 65 78 74 3b 0a 20 20 0a 20 20 61 73  Context;.  .  as
11cb0 73 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20  sert( pFile );. 
11cc0 20 4f 53 54 52 41 43 45 28 28 22 4c 4f 43 4b 20   OSTRACE(("LOCK 
11cd0 20 20 20 25 64 20 25 73 20 77 61 73 20 25 73 28     %d %s was %s(
11ce0 25 73 2c 25 64 29 20 70 69 64 3d 25 64 20 28 61  %s,%d) pid=%d (a
11cf0 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  fp)\n", pFile->h
11d00 2c 0a 20 20 20 20 20 20 20 20 20 20 20 61 7a 46  ,.           azF
11d10 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63  ileLock(eFileLoc
11d20 6b 29 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b 28 70  k), azFileLock(p
11d30 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 29  File->eFileLock)
11d40 2c 0a 20 20 20 20 20 20 20 20 20 20 20 61 7a 46  ,.           azF
11d50 69 6c 65 4c 6f 63 6b 28 70 49 6e 6f 64 65 2d 3e  ileLock(pInode->
11d60 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 70 49 6e 6f  eFileLock), pIno
11d70 64 65 2d 3e 6e 53 68 61 72 65 64 20 2c 20 67 65  de->nShared , ge
11d80 74 70 69 64 28 29 29 29 3b 0a 0a 20 20 2f 2a 20  tpid()));..  /* 
11d90 49 66 20 74 68 65 72 65 20 69 73 20 61 6c 72 65  If there is alre
11da0 61 64 79 20 61 20 6c 6f 63 6b 20 6f 66 20 74 68  ady a lock of th
11db0 69 73 20 74 79 70 65 20 6f 72 20 6d 6f 72 65 20  is type or more 
11dc0 72 65 73 74 72 69 63 74 69 76 65 20 6f 6e 20 74  restrictive on t
11dd0 68 65 0a 20 20 2a 2a 20 75 6e 69 78 46 69 6c 65  he.  ** unixFile
11de0 2c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 20 44 6f  , do nothing. Do
11df0 6e 27 74 20 75 73 65 20 74 68 65 20 61 66 70 5f  n't use the afp_
11e00 65 6e 64 5f 6c 6f 63 6b 3a 20 65 78 69 74 20 70  end_lock: exit p
11e10 61 74 68 2c 20 61 73 0a 20 20 2a 2a 20 75 6e 69  ath, as.  ** uni
11e20 78 45 6e 74 65 72 4d 75 74 65 78 28 29 20 68 61  xEnterMutex() ha
11e30 73 6e 27 74 20 62 65 65 6e 20 63 61 6c 6c 65 64  sn't been called
11e40 20 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28   yet..  */.  if(
11e50 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
11e60 6b 3e 3d 65 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a  k>=eFileLock ){.
11e70 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 4c 4f      OSTRACE(("LO
11e80 43 4b 20 20 20 20 25 64 20 25 73 20 6f 6b 20 28  CK    %d %s ok (
11e90 61 6c 72 65 61 64 79 20 68 65 6c 64 29 20 28 61  already held) (a
11ea0 66 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  fp)\n", pFile->h
11eb0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 61 7a 46  ,.           azF
11ec0 69 6c 65 4c 6f 63 6b 28 65 46 69 6c 65 4c 6f 63  ileLock(eFileLoc
11ed0 6b 29 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  k)));.    return
11ee0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
11ef0 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
11f00 74 68 65 20 6c 6f 63 6b 69 6e 67 20 73 65 71 75  the locking sequ
11f10 65 6e 63 65 20 69 73 20 63 6f 72 72 65 63 74 0a  ence is correct.
11f20 20 20 2a 2a 20 20 28 31 29 20 57 65 20 6e 65 76    **  (1) We nev
11f30 65 72 20 6d 6f 76 65 20 66 72 6f 6d 20 75 6e 6c  er move from unl
11f40 6f 63 6b 65 64 20 74 6f 20 61 6e 79 74 68 69 6e  ocked to anythin
11f50 67 20 68 69 67 68 65 72 20 74 68 61 6e 20 73 68  g higher than sh
11f60 61 72 65 64 20 6c 6f 63 6b 2e 0a 20 20 2a 2a 20  ared lock..  ** 
11f70 20 28 32 29 20 53 51 4c 69 74 65 20 6e 65 76 65   (2) SQLite neve
11f80 72 20 65 78 70 6c 69 63 69 74 6c 79 20 72 65 71  r explicitly req
11f90 75 65 73 74 73 20 61 20 70 65 6e 64 69 67 20 6c  uests a pendig l
11fa0 6f 63 6b 2e 0a 20 20 2a 2a 20 20 28 33 29 20 41  ock..  **  (3) A
11fb0 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 69 73 20   shared lock is 
11fc0 61 6c 77 61 79 73 20 68 65 6c 64 20 77 68 65 6e  always held when
11fd0 20 61 20 72 65 73 65 72 76 65 20 6c 6f 63 6b 20   a reserve lock 
11fe0 69 73 20 72 65 71 75 65 73 74 65 64 2e 0a 20 20  is requested..  
11ff0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 46 69  */.  assert( pFi
12000 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 21 3d 4e  le->eFileLock!=N
12010 4f 5f 4c 4f 43 4b 20 7c 7c 20 65 46 69 6c 65 4c  O_LOCK || eFileL
12020 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b  ock==SHARED_LOCK
12030 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 65 46   );.  assert( eF
12040 69 6c 65 4c 6f 63 6b 21 3d 50 45 4e 44 49 4e 47  ileLock!=PENDING
12050 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
12060 74 28 20 65 46 69 6c 65 4c 6f 63 6b 21 3d 52 45  t( eFileLock!=RE
12070 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70  SERVED_LOCK || p
12080 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  File->eFileLock=
12090 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
120a0 20 20 0a 20 20 2f 2a 20 54 68 69 73 20 6d 75 74    .  /* This mut
120b0 65 78 20 69 73 20 6e 65 65 64 65 64 20 62 65 63  ex is needed bec
120c0 61 75 73 65 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  ause pFile->pIno
120d0 64 65 20 69 73 20 73 68 61 72 65 64 20 61 63 72  de is shared acr
120e0 6f 73 73 20 74 68 72 65 61 64 73 0a 20 20 2a 2f  oss threads.  */
120f0 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d 75 74 65  .  unixEnterMute
12100 78 28 29 3b 0a 20 20 70 49 6e 6f 64 65 20 3d 20  x();.  pInode = 
12110 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 3b 0a 0a  pFile->pInode;..
12120 20 20 2f 2a 20 49 66 20 73 6f 6d 65 20 74 68 72    /* If some thr
12130 65 61 64 20 75 73 69 6e 67 20 74 68 69 73 20 50  ead using this P
12140 49 44 20 68 61 73 20 61 20 6c 6f 63 6b 20 76 69  ID has a lock vi
12150 61 20 61 20 64 69 66 66 65 72 65 6e 74 20 75 6e  a a different un
12160 69 78 46 69 6c 65 2a 0a 20 20 2a 2a 20 68 61 6e  ixFile*.  ** han
12170 64 6c 65 20 74 68 61 74 20 70 72 65 63 6c 75 64  dle that preclud
12180 65 73 20 74 68 65 20 72 65 71 75 65 73 74 65 64  es the requested
12190 20 6c 6f 63 6b 2c 20 72 65 74 75 72 6e 20 42 55   lock, return BU
121a0 53 59 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28  SY..  */.  if( (
121b0 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
121c0 21 3d 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c  !=pInode->eFileL
121d0 6f 63 6b 20 26 26 20 0a 20 20 20 20 20 20 20 28  ock && .       (
121e0 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
121f0 6b 3e 3d 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 20  k>=PENDING_LOCK 
12200 7c 7c 20 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41  || eFileLock>SHA
12210 52 45 44 5f 4c 4f 43 4b 29 29 0a 20 20 20 20 20  RED_LOCK)).     
12220 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
12230 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 67 6f 74  TE_BUSY;.    got
12240 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a  o afp_end_lock;.
12250 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 49 66 20 61    }.  .  /* If a
12260 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 73 20   SHARED lock is 
12270 72 65 71 75 65 73 74 65 64 2c 20 61 6e 64 20 73  requested, and s
12280 6f 6d 65 20 74 68 72 65 61 64 20 75 73 69 6e 67  ome thread using
12290 20 74 68 69 73 20 50 49 44 20 61 6c 72 65 61 64   this PID alread
122a0 79 0a 20 20 2a 2a 20 68 61 73 20 61 20 53 48 41  y.  ** has a SHA
122b0 52 45 44 20 6f 72 20 52 45 53 45 52 56 45 44 20  RED or RESERVED 
122c0 6c 6f 63 6b 2c 20 74 68 65 6e 20 69 6e 63 72 65  lock, then incre
122d0 6d 65 6e 74 20 72 65 66 65 72 65 6e 63 65 20 63  ment reference c
122e0 6f 75 6e 74 73 20 61 6e 64 0a 20 20 2a 2a 20 72  ounts and.  ** r
122f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e  eturn SQLITE_OK.
12300 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c  .  */.  if( eFil
12310 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
12320 43 4b 20 26 26 20 0a 20 20 20 20 20 28 70 49 6e  CK && .     (pIn
12330 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d 3d  ode->eFileLock==
12340 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c 20 70  SHARED_LOCK || p
12350 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  Inode->eFileLock
12360 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29  ==RESERVED_LOCK)
12370 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
12380 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41 52 45  eFileLock==SHARE
12390 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 61 73  D_LOCK );.    as
123a0 73 65 72 74 28 20 70 46 69 6c 65 2d 3e 65 46 69  sert( pFile->eFi
123b0 6c 65 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 20  leLock==0 );.   
123c0 20 61 73 73 65 72 74 28 20 70 49 6e 6f 64 65 2d   assert( pInode-
123d0 3e 6e 53 68 61 72 65 64 3e 30 20 29 3b 0a 20 20  >nShared>0 );.  
123e0 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f    pFile->eFileLo
123f0 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43 4b  ck = SHARED_LOCK
12400 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e 53  ;.    pInode->nS
12410 68 61 72 65 64 2b 2b 3b 0a 20 20 20 20 70 49 6e  hared++;.    pIn
12420 6f 64 65 2d 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20  ode->nLock++;.  
12430 20 20 67 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c    goto afp_end_l
12440 6f 63 6b 3b 0a 20 20 7d 0a 20 20 20 20 0a 20 20  ock;.  }.    .  
12450 2f 2a 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63  /* A PENDING loc
12460 6b 20 69 73 20 6e 65 65 64 65 64 20 62 65 66 6f  k is needed befo
12470 72 65 20 61 63 71 75 69 72 69 6e 67 20 61 20 53  re acquiring a S
12480 48 41 52 45 44 20 6c 6f 63 6b 20 61 6e 64 20 62  HARED lock and b
12490 65 66 6f 72 65 0a 20 20 2a 2a 20 61 63 71 75 69  efore.  ** acqui
124a0 72 69 6e 67 20 61 6e 20 45 58 43 4c 55 53 49 56  ring an EXCLUSIV
124b0 45 20 6c 6f 63 6b 2e 20 20 46 6f 72 20 74 68 65  E lock.  For the
124c0 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68   SHARED lock, th
124d0 65 20 50 45 4e 44 49 4e 47 20 77 69 6c 6c 0a 20  e PENDING will. 
124e0 20 2a 2a 20 62 65 20 72 65 6c 65 61 73 65 64 2e   ** be released.
124f0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 46 69 6c  .  */.  if( eFil
12500 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
12510 43 4b 20 0a 20 20 20 20 20 20 7c 7c 20 28 65 46  CK .      || (eF
12520 69 6c 65 4c 6f 63 6b 3d 3d 45 58 43 4c 55 53 49  ileLock==EXCLUSI
12530 56 45 5f 4c 4f 43 4b 20 26 26 20 70 46 69 6c 65  VE_LOCK && pFile
12540 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 50 45 4e 44  ->eFileLock<PEND
12550 49 4e 47 5f 4c 4f 43 4b 29 0a 20 20 29 7b 0a 20  ING_LOCK).  ){. 
12560 20 20 20 69 6e 74 20 66 61 69 6c 65 64 3b 0a 20     int failed;. 
12570 20 20 20 66 61 69 6c 65 64 20 3d 20 61 66 70 53     failed = afpS
12580 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e  etLock(context->
12590 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 50  dbPath, pFile, P
125a0 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 31 2c 20  ENDING_BYTE, 1, 
125b0 31 29 3b 0a 20 20 20 20 69 66 20 28 66 61 69 6c  1);.    if (fail
125c0 65 64 29 20 7b 0a 20 20 20 20 20 20 72 63 20 3d  ed) {.      rc =
125d0 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 67   failed;.      g
125e0 6f 74 6f 20 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b  oto afp_end_lock
125f0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20  ;.    }.  }.  . 
12600 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20 67   /* If control g
12610 65 74 73 20 74 6f 20 74 68 69 73 20 70 6f 69 6e  ets to this poin
12620 74 2c 20 74 68 65 6e 20 61 63 74 75 61 6c 6c 79  t, then actually
12630 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 6d 61   go ahead and ma
12640 6b 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69 6e  ke.  ** operatin
12650 67 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 20 66  g system calls f
12660 6f 72 20 74 68 65 20 73 70 65 63 69 66 69 65 64  or the specified
12670 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66   lock..  */.  if
12680 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 53 48 41  ( eFileLock==SHA
12690 52 45 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  RED_LOCK ){.    
126a0 69 6e 74 20 6c 72 63 31 2c 20 6c 72 63 32 2c 20  int lrc1, lrc2, 
126b0 6c 72 63 31 45 72 72 6e 6f 3b 0a 20 20 20 20 6c  lrc1Errno;.    l
126c0 6f 6e 67 20 6c 6b 2c 20 6d 61 73 6b 3b 0a 20 20  ong lk, mask;.  
126d0 20 20 0a 20 20 20 20 61 73 73 65 72 74 28 20 70    .    assert( p
126e0 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 3d 3d  Inode->nShared==
126f0 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
12700 20 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f   pInode->eFileLo
12710 63 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  ck==0 );.       
12720 20 0a 20 20 20 20 6d 61 73 6b 20 3d 20 28 73 69   .    mask = (si
12730 7a 65 6f 66 28 6c 6f 6e 67 29 3d 3d 38 29 20 3f  zeof(long)==8) ?
12740 20 4c 41 52 47 45 53 54 5f 49 4e 54 36 34 20 3a   LARGEST_INT64 :
12750 20 30 78 37 66 66 66 66 66 66 66 3b 0a 20 20 20   0x7fffffff;.   
12760 20 2f 2a 20 4e 6f 77 20 67 65 74 20 74 68 65 20   /* Now get the 
12770 72 65 61 64 2d 6c 6f 63 6b 20 53 48 41 52 45 44  read-lock SHARED
12780 5f 4c 4f 43 4b 20 2a 2f 0a 20 20 20 20 2f 2a 20  _LOCK */.    /* 
12790 6e 6f 74 65 20 74 68 61 74 20 74 68 65 20 71 75  note that the qu
127a0 61 6c 69 74 79 20 6f 66 20 74 68 65 20 72 61 6e  ality of the ran
127b0 64 6f 6d 6e 65 73 73 20 64 6f 65 73 6e 27 74 20  domness doesn't 
127c0 6d 61 74 74 65 72 20 74 68 61 74 20 6d 75 63 68  matter that much
127d0 20 2a 2f 0a 20 20 20 20 6c 6b 20 3d 20 72 61 6e   */.    lk = ran
127e0 64 6f 6d 28 29 3b 20 0a 20 20 20 20 70 49 6e 6f  dom(); .    pIno
127f0 64 65 2d 3e 73 68 61 72 65 64 42 79 74 65 20 3d  de->sharedByte =
12800 20 28 6c 6b 20 26 20 6d 61 73 6b 29 25 28 53 48   (lk & mask)%(SH
12810 41 52 45 44 5f 53 49 5a 45 20 2d 20 31 29 3b 0a  ARED_SIZE - 1);.
12820 20 20 20 20 6c 72 63 31 20 3d 20 61 66 70 53 65      lrc1 = afpSe
12830 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64  tLock(context->d
12840 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20 0a 20  bPath, pFile, . 
12850 20 20 20 20 20 20 20 20 20 53 48 41 52 45 44 5f           SHARED_
12860 46 49 52 53 54 2b 70 49 6e 6f 64 65 2d 3e 73 68  FIRST+pInode->sh
12870 61 72 65 64 42 79 74 65 2c 20 31 2c 20 31 29 3b  aredByte, 1, 1);
12880 0a 20 20 20 20 69 66 28 20 49 53 5f 4c 4f 43 4b  .    if( IS_LOCK
12890 5f 45 52 52 4f 52 28 6c 72 63 31 29 20 29 7b 0a  _ERROR(lrc1) ){.
128a0 20 20 20 20 20 20 6c 72 63 31 45 72 72 6e 6f 20        lrc1Errno 
128b0 3d 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72  = pFile->lastErr
128c0 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a  no;.    }.    /*
128d0 20 44 72 6f 70 20 74 68 65 20 74 65 6d 70 6f 72   Drop the tempor
128e0 61 72 79 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b  ary PENDING lock
128f0 20 2a 2f 0a 20 20 20 20 6c 72 63 32 20 3d 20 61   */.    lrc2 = a
12900 66 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78  fpSetLock(contex
12910 74 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65  t->dbPath, pFile
12920 2c 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20  , PENDING_BYTE, 
12930 31 2c 20 30 29 3b 0a 20 20 20 20 0a 20 20 20 20  1, 0);.    .    
12940 69 66 28 20 49 53 5f 4c 4f 43 4b 5f 45 52 52 4f  if( IS_LOCK_ERRO
12950 52 28 6c 72 63 31 29 20 29 20 7b 0a 20 20 20 20  R(lrc1) ) {.    
12960 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72    pFile->lastErr
12970 6e 6f 20 3d 20 6c 72 63 31 45 72 72 6e 6f 3b 0a  no = lrc1Errno;.
12980 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63 31 3b        rc = lrc1;
12990 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 66 70 5f  .      goto afp_
129a0 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 20  end_lock;.    } 
129b0 65 6c 73 65 20 69 66 28 20 49 53 5f 4c 4f 43 4b  else if( IS_LOCK
129c0 5f 45 52 52 4f 52 28 6c 72 63 32 29 20 29 7b 0a  _ERROR(lrc2) ){.
129d0 20 20 20 20 20 20 72 63 20 3d 20 6c 72 63 32 3b        rc = lrc2;
129e0 0a 20 20 20 20 20 20 67 6f 74 6f 20 61 66 70 5f  .      goto afp_
129f0 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20 20 20 7d 20  end_lock;.    } 
12a00 65 6c 73 65 20 69 66 28 20 6c 72 63 31 20 21 3d  else if( lrc1 !=
12a10 20 53 51 4c 49 54 45 5f 4f 4b 20 29 20 7b 0a 20   SQLITE_OK ) {. 
12a20 20 20 20 20 20 72 63 20 3d 20 6c 72 63 31 3b 0a       rc = lrc1;.
12a30 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
12a40 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
12a50 6f 63 6b 20 3d 20 53 48 41 52 45 44 5f 4c 4f 43  ock = SHARED_LOC
12a60 4b 3b 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d  K;.      pInode-
12a70 3e 6e 4c 6f 63 6b 2b 2b 3b 0a 20 20 20 20 20 20  >nLock++;.      
12a80 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 20  pInode->nShared 
12a90 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  = 1;.    }.  }el
12aa0 73 65 20 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b  se if( eFileLock
12ab0 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
12ac0 20 26 26 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61   && pInode->nSha
12ad0 72 65 64 3e 31 20 29 7b 0a 20 20 20 20 2f 2a 20  red>1 ){.    /* 
12ae0 57 65 20 61 72 65 20 74 72 79 69 6e 67 20 66 6f  We are trying fo
12af0 72 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c  r an exclusive l
12b00 6f 63 6b 20 62 75 74 20 61 6e 6f 74 68 65 72 20  ock but another 
12b10 74 68 72 65 61 64 20 69 6e 20 74 68 69 73 0a 20  thread in this. 
12b20 20 20 20 20 2a 2a 20 73 61 6d 65 20 70 72 6f 63      ** same proc
12b30 65 73 73 20 69 73 20 73 74 69 6c 6c 20 68 6f 6c  ess is still hol
12b40 64 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c 6f  ding a shared lo
12b50 63 6b 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  ck. */.    rc = 
12b60 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d  SQLITE_BUSY;.  }
12b70 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65  else{.    /* The
12b80 20 72 65 71 75 65 73 74 20 77 61 73 20 66 6f 72   request was for
12b90 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 45   a RESERVED or E
12ba0 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 20  XCLUSIVE lock.  
12bb0 49 74 20 69 73 0a 20 20 20 20 2a 2a 20 61 73 73  It is.    ** ass
12bc0 75 6d 65 64 20 74 68 61 74 20 74 68 65 72 65 20  umed that there 
12bd0 69 73 20 61 20 53 48 41 52 45 44 20 6f 72 20 67  is a SHARED or g
12be0 72 65 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74  reater lock on t
12bf0 68 65 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 61  he file.    ** a
12c00 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20  lready..    */. 
12c10 20 20 20 69 6e 74 20 66 61 69 6c 65 64 20 3d 20     int failed = 
12c20 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 30  0;.    assert( 0
12c30 21 3d 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f  !=pFile->eFileLo
12c40 63 6b 20 29 3b 0a 20 20 20 20 69 66 20 28 65 46  ck );.    if (eF
12c50 69 6c 65 4c 6f 63 6b 20 3e 3d 20 52 45 53 45 52  ileLock >= RESER
12c60 56 45 44 5f 4c 4f 43 4b 20 26 26 20 70 46 69 6c  VED_LOCK && pFil
12c70 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3c 20 52  e->eFileLock < R
12c80 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 20 7b 0a  ESERVED_LOCK) {.
12c90 20 20 20 20 20 20 20 20 2f 2a 20 41 63 71 75 69          /* Acqui
12ca0 72 65 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  re a RESERVED lo
12cb0 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 61  ck */.        fa
12cc0 69 6c 65 64 20 3d 20 61 66 70 53 65 74 4c 6f 63  iled = afpSetLoc
12cd0 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74  k(context->dbPat
12ce0 68 2c 20 70 46 69 6c 65 2c 20 52 45 53 45 52 56  h, pFile, RESERV
12cf0 45 44 5f 42 59 54 45 2c 20 31 2c 31 29 3b 0a 20  ED_BYTE, 1,1);. 
12d00 20 20 20 20 20 69 66 28 20 21 66 61 69 6c 65 64       if( !failed
12d10 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74   ){.        cont
12d20 65 78 74 2d 3e 72 65 73 65 72 76 65 64 20 3d 20  ext->reserved = 
12d30 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
12d40 0a 20 20 20 20 69 66 20 28 21 66 61 69 6c 65 64  .    if (!failed
12d50 20 26 26 20 65 46 69 6c 65 4c 6f 63 6b 20 3d 3d   && eFileLock ==
12d60 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29   EXCLUSIVE_LOCK)
12d70 20 7b 0a 20 20 20 20 20 20 2f 2a 20 41 63 71 75   {.      /* Acqu
12d80 69 72 65 20 61 6e 20 45 58 43 4c 55 53 49 56 45  ire an EXCLUSIVE
12d90 20 6c 6f 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20   lock */.       
12da0 20 0a 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76   .      /* Remov
12db0 65 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63  e the shared loc
12dc0 6b 20 62 65 66 6f 72 65 20 74 72 79 69 6e 67 20  k before trying 
12dd0 74 68 65 20 72 61 6e 67 65 2e 20 20 77 65 27 6c  the range.  we'l
12de0 6c 20 6e 65 65 64 20 74 6f 20 0a 20 20 20 20 20  l need to .     
12df0 20 2a 2a 20 72 65 65 73 74 61 62 6c 69 73 68 20   ** reestablish 
12e00 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20  the shared lock 
12e10 69 66 20 77 65 20 63 61 6e 27 74 20 67 65 74 20  if we can't get 
12e20 74 68 65 20 20 61 66 70 55 6e 6c 6f 63 6b 0a 20  the  afpUnlock. 
12e30 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
12e40 28 20 21 28 66 61 69 6c 65 64 20 3d 20 61 66 70  ( !(failed = afp
12e50 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74 2d  SetLock(context-
12e60 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c 20  >dbPath, pFile, 
12e70 53 48 41 52 45 44 5f 46 49 52 53 54 20 2b 0a 20  SHARED_FIRST +. 
12e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12e90 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e          pInode->
12ea0 73 68 61 72 65 64 42 79 74 65 2c 20 31 2c 20 30  sharedByte, 1, 0
12eb0 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  )) ){.        in
12ec0 74 20 66 61 69 6c 65 64 32 20 3d 20 53 51 4c 49  t failed2 = SQLI
12ed0 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 2f  TE_OK;.        /
12ee0 2a 20 6e 6f 77 20 61 74 74 65 6d 6d 70 74 20 74  * now attemmpt t
12ef0 6f 20 67 65 74 20 74 68 65 20 65 78 63 6c 75 73  o get the exclus
12f00 69 76 65 20 6c 6f 63 6b 20 72 61 6e 67 65 20 2a  ive lock range *
12f10 2f 0a 20 20 20 20 20 20 20 20 66 61 69 6c 65 64  /.        failed
12f20 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63 6f   = afpSetLock(co
12f30 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20 70  ntext->dbPath, p
12f40 46 69 6c 65 2c 20 53 48 41 52 45 44 5f 46 49 52  File, SHARED_FIR
12f50 53 54 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  ST, .           
12f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12f70 20 20 20 20 53 48 41 52 45 44 5f 53 49 5a 45 2c      SHARED_SIZE,
12f80 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   1);.        if(
12f90 20 66 61 69 6c 65 64 20 26 26 20 28 66 61 69 6c   failed && (fail
12fa0 65 64 32 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b  ed2 = afpSetLock
12fb0 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68  (context->dbPath
12fc0 2c 20 70 46 69 6c 65 2c 20 0a 20 20 20 20 20 20  , pFile, .      
12fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12fe0 20 53 48 41 52 45 44 5f 46 49 52 53 54 20 2b 20   SHARED_FIRST + 
12ff0 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79  pInode->sharedBy
13000 74 65 2c 20 31 2c 20 31 29 29 20 29 7b 0a 20 20  te, 1, 1)) ){.  
13010 20 20 20 20 20 20 20 20 2f 2a 20 43 61 6e 27 74          /* Can't
13020 20 72 65 65 73 74 61 62 6c 69 73 68 20 74 68 65   reestablish the
13030 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20 20 53   shared lock.  S
13040 71 6c 69 74 65 20 63 61 6e 27 74 20 64 65 61 6c  qlite can't deal
13050 2c 20 74 68 69 73 20 69 73 0a 20 20 20 20 20 20  , this is.      
13060 20 20 20 20 2a 2a 20 61 20 63 72 69 74 69 63 61      ** a critica
13070 6c 20 49 2f 4f 20 65 72 72 6f 72 0a 20 20 20 20  l I/O error.    
13080 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
13090 20 20 20 72 63 20 3d 20 28 28 66 61 69 6c 65 64     rc = ((failed
130a0 20 26 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 29   & SQLITE_IOERR)
130b0 20 3d 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52   == SQLITE_IOERR
130c0 29 20 3f 20 66 61 69 6c 65 64 32 20 3a 20 0a 20  ) ? failed2 : . 
130d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
130e0 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b  LITE_IOERR_LOCK;
130f0 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
13100 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3b 0a 20 20  afp_end_lock;.  
13110 20 20 20 20 20 20 7d 20 0a 20 20 20 20 20 20 7d        } .      }
13120 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63  else{.        rc
13130 20 3d 20 66 61 69 6c 65 64 3b 20 0a 20 20 20 20   = failed; .    
13140 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
13150 28 20 66 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ( failed ){.    
13160 20 20 72 63 20 3d 20 66 61 69 6c 65 64 3b 0a 20    rc = failed;. 
13170 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 69 66     }.  }.  .  if
13180 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
13190 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46  ){.    pFile->eF
131a0 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69 6c 65 4c  ileLock = eFileL
131b0 6f 63 6b 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d  ock;.    pInode-
131c0 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65 46 69  >eFileLock = eFi
131d0 6c 65 4c 6f 63 6b 3b 0a 20 20 7d 65 6c 73 65 20  leLock;.  }else 
131e0 69 66 28 20 65 46 69 6c 65 4c 6f 63 6b 3d 3d 45  if( eFileLock==E
131f0 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b  XCLUSIVE_LOCK ){
13200 0a 20 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c  .    pFile->eFil
13210 65 4c 6f 63 6b 20 3d 20 50 45 4e 44 49 4e 47 5f  eLock = PENDING_
13220 4c 4f 43 4b 3b 0a 20 20 20 20 70 49 6e 6f 64 65  LOCK;.    pInode
13230 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 50 45  ->eFileLock = PE
13240 4e 44 49 4e 47 5f 4c 4f 43 4b 3b 0a 20 20 7d 0a  NDING_LOCK;.  }.
13250 20 20 0a 61 66 70 5f 65 6e 64 5f 6c 6f 63 6b 3a    .afp_end_lock:
13260 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65  .  unixLeaveMute
13270 78 28 29 3b 0a 20 20 4f 53 54 52 41 43 45 28 28  x();.  OSTRACE((
13280 22 4c 4f 43 4b 20 20 20 20 25 64 20 25 73 20 25  "LOCK    %d %s %
13290 73 20 28 61 66 70 29 5c 6e 22 2c 20 70 46 69 6c  s (afp)\n", pFil
132a0 65 2d 3e 68 2c 20 61 7a 46 69 6c 65 4c 6f 63 6b  e->h, azFileLock
132b0 28 65 46 69 6c 65 4c 6f 63 6b 29 2c 20 0a 20 20  (eFileLock), .  
132c0 20 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54         rc==SQLIT
132d0 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66  E_OK ? "ok" : "f
132e0 61 69 6c 65 64 22 29 29 3b 0a 20 20 72 65 74 75  ailed"));.  retu
132f0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
13300 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63 6b 69 6e  Lower the lockin
13310 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69 6c 65 20  g level on file 
13320 64 65 73 63 72 69 70 74 6f 72 20 70 46 69 6c 65  descriptor pFile
13330 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b 2e 20 20   to eFileLock.  
13340 65 46 69 6c 65 4c 6f 63 6b 0a 2a 2a 20 6d 75 73  eFileLock.** mus
13350 74 20 62 65 20 65 69 74 68 65 72 20 4e 4f 5f 4c  t be either NO_L
13360 4f 43 4b 20 6f 72 20 53 48 41 52 45 44 5f 4c 4f  OCK or SHARED_LO
13370 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  CK..**.** If the
13380 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f   locking level o
13390 66 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  f the file descr
133a0 69 70 74 6f 72 20 69 73 20 61 6c 72 65 61 64 79  iptor is already
133b0 20 61 74 20 6f 72 20 62 65 6c 6f 77 0a 2a 2a 20   at or below.** 
133c0 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
133d0 63 6b 69 6e 67 20 6c 65 76 65 6c 2c 20 74 68 69  cking level, thi
133e0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
133f0 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
13400 69 6e 74 20 61 66 70 55 6e 6c 6f 63 6b 28 73 71  int afpUnlock(sq
13410 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
13420 69 6e 74 20 65 46 69 6c 65 4c 6f 63 6b 29 20 7b  int eFileLock) {
13430 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
13440 54 45 5f 4f 4b 3b 0a 20 20 75 6e 69 78 46 69 6c  TE_OK;.  unixFil
13450 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78  e *pFile = (unix
13460 46 69 6c 65 2a 29 69 64 3b 0a 20 20 73 74 72 75  File*)id;.  stru
13470 63 74 20 75 6e 69 78 49 6e 6f 64 65 49 6e 66 6f  ct unixInodeInfo
13480 20 2a 70 49 6e 6f 64 65 3b 0a 20 20 61 66 70 4c   *pInode;.  afpL
13490 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 63  ockingContext *c
134a0 6f 6e 74 65 78 74 20 3d 20 28 61 66 70 4c 6f 63  ontext = (afpLoc
134b0 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 20 70  kingContext *) p
134c0 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
134d0 74 65 78 74 3b 0a 20 20 69 6e 74 20 73 6b 69 70  text;.  int skip
134e0 53 68 61 72 65 64 20 3d 20 30 3b 0a 23 69 66 64  Shared = 0;.#ifd
134f0 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
13500 20 69 6e 74 20 68 20 3d 20 70 46 69 6c 65 2d 3e   int h = pFile->
13510 68 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73  h;.#endif..  ass
13520 65 72 74 28 20 70 46 69 6c 65 20 29 3b 0a 20 20  ert( pFile );.  
13530 4f 53 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b  OSTRACE(("UNLOCK
13540 20 20 25 64 20 25 64 20 77 61 73 20 25 64 28 25    %d %d was %d(%
13550 64 2c 25 64 29 20 70 69 64 3d 25 64 20 28 61 66  d,%d) pid=%d (af
13560 70 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c  p)\n", pFile->h,
13570 20 65 46 69 6c 65 4c 6f 63 6b 2c 0a 20 20 20 20   eFileLock,.    
13580 20 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 46         pFile->eF
13590 69 6c 65 4c 6f 63 6b 2c 20 70 46 69 6c 65 2d 3e  ileLock, pFile->
135a0 70 49 6e 6f 64 65 2d 3e 65 46 69 6c 65 4c 6f 63  pInode->eFileLoc
135b0 6b 2c 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65  k, pFile->pInode
135c0 2d 3e 6e 53 68 61 72 65 64 2c 0a 20 20 20 20 20  ->nShared,.     
135d0 20 20 20 20 20 20 67 65 74 70 69 64 28 29 29 29        getpid()))
135e0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 65 46 69  ;..  assert( eFi
135f0 6c 65 4c 6f 63 6b 3c 3d 53 48 41 52 45 44 5f 4c  leLock<=SHARED_L
13600 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70 46 69  OCK );.  if( pFi
13610 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3c 3d 65  le->eFileLock<=e
13620 46 69 6c 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  FileLock ){.    
13630 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
13640 3b 0a 20 20 7d 0a 20 20 75 6e 69 78 45 6e 74 65  ;.  }.  unixEnte
13650 72 4d 75 74 65 78 28 29 3b 0a 20 20 70 49 6e 6f  rMutex();.  pIno
13660 64 65 20 3d 20 70 46 69 6c 65 2d 3e 70 49 6e 6f  de = pFile->pIno
13670 64 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 49  de;.  assert( pI
13680 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64 21 3d 30  node->nShared!=0
13690 20 29 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d   );.  if( pFile-
136a0 3e 65 46 69 6c 65 4c 6f 63 6b 3e 53 48 41 52 45  >eFileLock>SHARE
136b0 44 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73  D_LOCK ){.    as
136c0 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 65 46  sert( pInode->eF
136d0 69 6c 65 4c 6f 63 6b 3d 3d 70 46 69 6c 65 2d 3e  ileLock==pFile->
136e0 65 46 69 6c 65 4c 6f 63 6b 20 29 3b 0a 20 20 20  eFileLock );.   
136f0 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72   SimulateIOError
13700 42 65 6e 69 67 6e 28 31 29 3b 0a 20 20 20 20 53  Benign(1);.    S
13710 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
13720 68 3d 28 2d 31 29 20 29 0a 20 20 20 20 53 69 6d  h=(-1) ).    Sim
13730 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e 69  ulateIOErrorBeni
13740 67 6e 28 30 29 3b 0a 20 20 20 20 0a 23 69 66 6e  gn(0);.    .#ifn
13750 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20 20 2f  def NDEBUG.    /
13760 2a 20 57 68 65 6e 20 72 65 64 75 63 69 6e 67 20  * When reducing 
13770 61 20 6c 6f 63 6b 20 73 75 63 68 20 74 68 61 74  a lock such that
13780 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65 73   other processes
13790 20 63 61 6e 20 73 74 61 72 74 0a 20 20 20 20 2a   can start.    *
137a0 2a 20 72 65 61 64 69 6e 67 20 74 68 65 20 64 61  * reading the da
137b0 74 61 62 61 73 65 20 66 69 6c 65 20 61 67 61 69  tabase file agai
137c0 6e 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  n, make sure tha
137d0 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 72 61  t the.    ** tra
137e0 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72  nsaction counter
137f0 20 77 61 73 20 75 70 64 61 74 65 64 20 69 66 20   was updated if 
13800 61 6e 79 20 70 61 72 74 20 6f 66 20 74 68 65 20  any part of the 
13810 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20  database.    ** 
13820 66 69 6c 65 20 63 68 61 6e 67 65 64 2e 20 20 49  file changed.  I
13830 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
13840 6e 20 63 6f 75 6e 74 65 72 20 69 73 20 6e 6f 74  n counter is not
13850 20 75 70 64 61 74 65 64 2c 0a 20 20 20 20 2a 2a   updated,.    **
13860 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f   other connectio
13870 6e 73 20 74 6f 20 74 68 65 20 73 61 6d 65 20 66  ns to the same f
13880 69 6c 65 20 6d 69 67 68 74 20 6e 6f 74 20 72 65  ile might not re
13890 61 6c 69 7a 65 20 74 68 61 74 0a 20 20 20 20 2a  alize that.    *
138a0 2a 20 74 68 65 20 66 69 6c 65 20 68 61 73 20 63  * the file has c
138b0 68 61 6e 67 65 64 20 61 6e 64 20 68 65 6e 63 65  hanged and hence
138c0 20 6d 69 67 68 74 20 6e 6f 74 20 6b 6e 6f 77 20   might not know 
138d0 74 6f 20 66 6c 75 73 68 20 74 68 65 69 72 0a 20  to flush their. 
138e0 20 20 20 2a 2a 20 63 61 63 68 65 2e 20 20 54 68     ** cache.  Th
138f0 65 20 75 73 65 20 6f 66 20 61 20 73 74 61 6c 65  e use of a stale
13900 20 63 61 63 68 65 20 63 61 6e 20 6c 65 61 64 20   cache can lead 
13910 74 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72 72  to database corr
13920 75 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  uption..    */. 
13930 20 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65     assert( pFile
13940 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 3d  ->inNormalWrite=
13950 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  =0.           ||
13960 20 70 46 69 6c 65 2d 3e 64 62 55 70 64 61 74 65   pFile->dbUpdate
13970 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 7c  ==0.           |
13980 7c 20 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e  | pFile->transCn
13990 74 72 43 68 6e 67 3d 3d 31 20 29 3b 0a 20 20 20  trChng==1 );.   
139a0 20 70 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c   pFile->inNormal
139b0 57 72 69 74 65 20 3d 20 30 3b 0a 23 65 6e 64 69  Write = 0;.#endi
139c0 66 0a 20 20 20 20 0a 20 20 20 20 69 66 28 20 70  f.    .    if( p
139d0 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3d  File->eFileLock=
139e0 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20  =EXCLUSIVE_LOCK 
139f0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61 66  ){.      rc = af
13a00 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  pSetLock(context
13a10 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c  ->dbPath, pFile,
13a20 20 53 48 41 52 45 44 5f 46 49 52 53 54 2c 20 53   SHARED_FIRST, S
13a30 48 41 52 45 44 5f 53 49 5a 45 2c 20 30 29 3b 0a  HARED_SIZE, 0);.
13a40 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
13a50 4c 49 54 45 5f 4f 4b 20 26 26 20 28 65 46 69 6c  LITE_OK && (eFil
13a60 65 4c 6f 63 6b 3d 3d 53 48 41 52 45 44 5f 4c 4f  eLock==SHARED_LO
13a70 43 4b 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 6e 53  CK || pInode->nS
13a80 68 61 72 65 64 3e 31 29 20 29 7b 0a 20 20 20 20  hared>1) ){.    
13a90 20 20 20 20 2f 2a 20 6f 6e 6c 79 20 72 65 2d 65      /* only re-e
13aa0 73 74 61 62 6c 69 73 68 20 74 68 65 20 73 68 61  stablish the sha
13ab0 72 65 64 20 6c 6f 63 6b 20 69 66 20 6e 65 63 65  red lock if nece
13ac0 73 73 61 72 79 20 2a 2f 0a 20 20 20 20 20 20 20  ssary */.       
13ad0 20 69 6e 74 20 73 68 61 72 65 64 4c 6f 63 6b 42   int sharedLockB
13ae0 79 74 65 20 3d 20 53 48 41 52 45 44 5f 46 49 52  yte = SHARED_FIR
13af0 53 54 2b 70 49 6e 6f 64 65 2d 3e 73 68 61 72 65  ST+pInode->share
13b00 64 42 79 74 65 3b 0a 20 20 20 20 20 20 20 20 72  dByte;.        r
13b10 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63  c = afpSetLock(c
13b20 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20  ontext->dbPath, 
13b30 70 46 69 6c 65 2c 20 73 68 61 72 65 64 4c 6f 63  pFile, sharedLoc
13b40 6b 42 79 74 65 2c 20 31 2c 20 31 29 3b 0a 20 20  kByte, 1, 1);.  
13b50 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
13b60 20 20 20 20 20 73 6b 69 70 53 68 61 72 65 64 20       skipShared 
13b70 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
13b80 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
13b90 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 46 69 6c  QLITE_OK && pFil
13ba0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 3e 3d 50 45  e->eFileLock>=PE
13bb0 4e 44 49 4e 47 5f 4c 4f 43 4b 20 29 7b 0a 20 20  NDING_LOCK ){.  
13bc0 20 20 20 20 72 63 20 3d 20 61 66 70 53 65 74 4c      rc = afpSetL
13bd0 6f 63 6b 28 63 6f 6e 74 65 78 74 2d 3e 64 62 50  ock(context->dbP
13be0 61 74 68 2c 20 70 46 69 6c 65 2c 20 50 45 4e 44  ath, pFile, PEND
13bf0 49 4e 47 5f 42 59 54 45 2c 20 31 2c 20 30 29 3b  ING_BYTE, 1, 0);
13c00 0a 20 20 20 20 7d 20 0a 20 20 20 20 69 66 28 20  .    } .    if( 
13c10 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
13c20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63   pFile->eFileLoc
13c30 6b 3e 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  k>=RESERVED_LOCK
13c40 20 26 26 20 63 6f 6e 74 65 78 74 2d 3e 72 65 73   && context->res
13c50 65 72 76 65 64 20 29 7b 0a 20 20 20 20 20 20 72  erved ){.      r
13c60 63 20 3d 20 61 66 70 53 65 74 4c 6f 63 6b 28 63  c = afpSetLock(c
13c70 6f 6e 74 65 78 74 2d 3e 64 62 50 61 74 68 2c 20  ontext->dbPath, 
13c80 70 46 69 6c 65 2c 20 52 45 53 45 52 56 45 44 5f  pFile, RESERVED_
13c90 42 59 54 45 2c 20 31 2c 20 30 29 3b 0a 20 20 20  BYTE, 1, 0);.   
13ca0 20 20 20 69 66 28 20 21 72 63 20 29 7b 20 0a 20     if( !rc ){ . 
13cb0 20 20 20 20 20 20 20 63 6f 6e 74 65 78 74 2d 3e         context->
13cc0 72 65 73 65 72 76 65 64 20 3d 20 30 3b 20 0a 20  reserved = 0; . 
13cd0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
13ce0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
13cf0 4f 4b 20 26 26 20 28 65 46 69 6c 65 4c 6f 63 6b  OK && (eFileLock
13d00 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 7c 7c  ==SHARED_LOCK ||
13d10 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65 64   pInode->nShared
13d20 3e 31 29 29 7b 0a 20 20 20 20 20 20 70 49 6e 6f  >1)){.      pIno
13d30 64 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20  de->eFileLock = 
13d40 53 48 41 52 45 44 5f 4c 4f 43 4b 3b 0a 20 20 20  SHARED_LOCK;.   
13d50 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d   }.  }.  if( rc=
13d60 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65 46  =SQLITE_OK && eF
13d70 69 6c 65 4c 6f 63 6b 3d 3d 4e 4f 5f 4c 4f 43 4b  ileLock==NO_LOCK
13d80 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 44 65 63 72   ){..    /* Decr
13d90 65 6d 65 6e 74 20 74 68 65 20 73 68 61 72 65 64  ement the shared
13da0 20 6c 6f 63 6b 20 63 6f 75 6e 74 65 72 2e 20 20   lock counter.  
13db0 52 65 6c 65 61 73 65 20 74 68 65 20 6c 6f 63 6b  Release the lock
13dc0 20 75 73 69 6e 67 20 61 6e 0a 20 20 20 20 2a 2a   using an.    **
13dd0 20 4f 53 20 63 61 6c 6c 20 6f 6e 6c 79 20 77 68   OS call only wh
13de0 65 6e 20 61 6c 6c 20 74 68 72 65 61 64 73 20 69  en all threads i
13df0 6e 20 74 68 69 73 20 73 61 6d 65 20 70 72 6f 63  n this same proc
13e00 65 73 73 20 68 61 76 65 20 72 65 6c 65 61 73 65  ess have release
13e10 64 0a 20 20 20 20 2a 2a 20 74 68 65 20 6c 6f 63  d.    ** the loc
13e20 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 75 6e  k..    */.    un
13e30 73 69 67 6e 65 64 20 6c 6f 6e 67 20 6c 6f 6e 67  signed long long
13e40 20 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 20   sharedLockByte 
13e50 3d 20 53 48 41 52 45 44 5f 46 49 52 53 54 2b 70  = SHARED_FIRST+p
13e60 49 6e 6f 64 65 2d 3e 73 68 61 72 65 64 42 79 74  Inode->sharedByt
13e70 65 3b 0a 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e  e;.    pInode->n
13e80 53 68 61 72 65 64 2d 2d 3b 0a 20 20 20 20 69 66  Shared--;.    if
13e90 28 20 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  ( pInode->nShare
13ea0 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 53 69  d==0 ){.      Si
13eb0 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e  mulateIOErrorBen
13ec0 69 67 6e 28 31 29 3b 0a 20 20 20 20 20 20 53 69  ign(1);.      Si
13ed0 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 68  mulateIOError( h
13ee0 3d 28 2d 31 29 20 29 0a 20 20 20 20 20 20 53 69  =(-1) ).      Si
13ef0 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 42 65 6e  mulateIOErrorBen
13f00 69 67 6e 28 30 29 3b 0a 20 20 20 20 20 20 69 66  ign(0);.      if
13f10 28 20 21 73 6b 69 70 53 68 61 72 65 64 20 29 7b  ( !skipShared ){
13f20 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 66  .        rc = af
13f30 70 53 65 74 4c 6f 63 6b 28 63 6f 6e 74 65 78 74  pSetLock(context
13f40 2d 3e 64 62 50 61 74 68 2c 20 70 46 69 6c 65 2c  ->dbPath, pFile,
13f50 20 73 68 61 72 65 64 4c 6f 63 6b 42 79 74 65 2c   sharedLockByte,
13f60 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a   1, 0);.      }.
13f70 20 20 20 20 20 20 69 66 28 20 21 72 63 20 29 7b        if( !rc ){
13f80 0a 20 20 20 20 20 20 20 20 70 49 6e 6f 64 65 2d  .        pInode-
13f90 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 4e 4f 5f  >eFileLock = NO_
13fa0 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 70 46  LOCK;.        pF
13fb0 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
13fc0 20 4e 4f 5f 4c 4f 43 4b 3b 0a 20 20 20 20 20 20   NO_LOCK;.      
13fd0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
13fe0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
13ff0 0a 20 20 20 20 20 20 70 49 6e 6f 64 65 2d 3e 6e  .      pInode->n
14000 4c 6f 63 6b 2d 2d 3b 0a 20 20 20 20 20 20 61 73  Lock--;.      as
14010 73 65 72 74 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c  sert( pInode->nL
14020 6f 63 6b 3e 3d 30 20 29 3b 0a 20 20 20 20 20 20  ock>=0 );.      
14030 69 66 28 20 70 49 6e 6f 64 65 2d 3e 6e 4c 6f 63  if( pInode->nLoc
14040 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  k==0 ){.        
14050 72 63 20 3d 20 63 6c 6f 73 65 50 65 6e 64 69 6e  rc = closePendin
14060 67 46 64 73 28 70 46 69 6c 65 29 3b 0a 20 20 20  gFds(pFile);.   
14070 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
14080 20 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74   .  unixLeaveMut
14090 65 78 28 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  ex();.  if( rc==
140a0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70 46 69 6c  SQLITE_OK ) pFil
140b0 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d 20 65  e->eFileLock = e
140c0 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 72 65 74 75  FileLock;.  retu
140d0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
140e0 43 6c 6f 73 65 20 61 20 66 69 6c 65 20 26 20 63  Close a file & c
140f0 6c 65 61 6e 75 70 20 41 46 50 20 73 70 65 63 69  leanup AFP speci
14100 66 69 63 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74  fic locking cont
14110 65 78 74 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ext .*/.static i
14120 6e 74 20 61 66 70 43 6c 6f 73 65 28 73 71 6c 69  nt afpClose(sqli
14130 74 65 33 5f 66 69 6c 65 20 2a 69 64 29 20 7b 0a  te3_file *id) {.
14140 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
14150 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 69 64 20 29  E_OK;.  if( id )
14160 7b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a  {.    unixFile *
14170 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
14180 65 2a 29 69 64 3b 0a 20 20 20 20 61 66 70 55 6e  e*)id;.    afpUn
14190 6c 6f 63 6b 28 69 64 2c 20 4e 4f 5f 4c 4f 43 4b  lock(id, NO_LOCK
141a0 29 3b 0a 20 20 20 20 75 6e 69 78 45 6e 74 65 72  );.    unixEnter
141b0 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 69 66 28  Mutex();.    if(
141c0 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 20 26   pFile->pInode &
141d0 26 20 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 2d  & pFile->pInode-
141e0 3e 6e 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20  >nLock ){.      
141f0 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
14200 6f 75 74 73 74 61 6e 64 69 6e 67 20 6c 6f 63 6b  outstanding lock
14210 73 2c 20 64 6f 20 6e 6f 74 20 61 63 74 75 61 6c  s, do not actual
14220 6c 79 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c  ly close the fil
14230 65 20 6a 75 73 74 0a 20 20 20 20 20 20 2a 2a 20  e just.      ** 
14240 79 65 74 20 62 65 63 61 75 73 65 20 74 68 61 74  yet because that
14250 20 77 6f 75 6c 64 20 63 6c 65 61 72 20 74 68 6f   would clear tho
14260 73 65 20 6c 6f 63 6b 73 2e 20 20 49 6e 73 74 65  se locks.  Inste
14270 61 64 2c 20 61 64 64 20 74 68 65 20 66 69 6c 65  ad, add the file
14280 0a 20 20 20 20 20 20 2a 2a 20 64 65 73 63 72 69  .      ** descri
14290 70 74 6f 72 20 74 6f 20 70 49 6e 6f 64 65 2d 3e  ptor to pInode->
142a0 61 50 65 6e 64 69 6e 67 2e 20 20 49 74 20 77 69  aPending.  It wi
142b0 6c 6c 20 62 65 20 61 75 74 6f 6d 61 74 69 63 61  ll be automatica
142c0 6c 6c 79 20 63 6c 6f 73 65 64 20 77 68 65 6e 0a  lly closed when.
142d0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6c 61 73        ** the las
142e0 74 20 6c 6f 63 6b 20 69 73 20 63 6c 65 61 72 65  t lock is cleare
142f0 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  d..      */.    
14300 20 20 73 65 74 50 65 6e 64 69 6e 67 46 64 28 70    setPendingFd(p
14310 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  File);.    }.   
14320 20 72 65 6c 65 61 73 65 4c 6f 63 6b 49 6e 66 6f   releaseLockInfo
14330 28 70 46 69 6c 65 2d 3e 70 49 6e 6f 64 65 29 3b  (pFile->pInode);
14340 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
14350 65 28 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  e(pFile->locking
14360 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 72 63  Context);.    rc
14370 20 3d 20 63 6c 6f 73 65 55 6e 69 78 46 69 6c 65   = closeUnixFile
14380 28 69 64 29 3b 0a 20 20 20 20 75 6e 69 78 4c 65  (id);.    unixLe
14390 61 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a  aveMutex();.  }.
143a0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
143b0 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65  #endif /* define
143c0 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20  d(__APPLE__) && 
143d0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
143e0 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 2f  CKING_STYLE */./
143f0 2a 0a 2a 2a 20 54 68 65 20 63 6f 64 65 20 61 62  *.** The code ab
14400 6f 76 65 20 69 73 20 74 68 65 20 41 46 50 20 6c  ove is the AFP l
14410 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ock implementati
14420 6f 6e 2e 20 20 54 68 65 20 63 6f 64 65 20 69 73  on.  The code is
14430 20 73 70 65 63 69 66 69 63 0a 2a 2a 20 74 6f 20   specific.** to 
14440 4d 61 63 4f 53 58 20 61 6e 64 20 64 6f 65 73 20  MacOSX and does 
14450 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20 6f 74 68 65  not work on othe
14460 72 20 75 6e 69 78 20 70 6c 61 74 66 6f 72 6d 73  r unix platforms
14470 2e 20 20 4e 6f 20 61 6c 74 65 72 6e 61 74 69 76  .  No alternativ
14480 65 0a 2a 2a 20 69 73 20 61 76 61 69 6c 61 62 6c  e.** is availabl
14490 65 2e 20 20 49 66 20 79 6f 75 20 64 6f 6e 27 74  e.  If you don't
144a0 20 63 6f 6d 70 69 6c 65 20 66 6f 72 20 61 20 6d   compile for a m
144b0 61 63 2c 20 74 68 65 6e 20 74 68 65 20 22 75 6e  ac, then the "un
144c0 69 78 2d 61 66 70 22 0a 2a 2a 20 56 46 53 20 69  ix-afp".** VFS i
144d0 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e  s not available.
144e0 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  .**.************
144f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20 6f 66  ********* End of
14500 20 74 68 65 20 41 46 50 20 6c 6f 63 6b 20 69 6d   the AFP lock im
14510 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2a 2a  plementation ***
14520 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14530 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
14540 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14550 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14560 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14570 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14580 2a 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **/../**********
14590 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
145a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
145b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
145c0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
145d0 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****.***********
145e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
145f0 20 42 65 67 69 6e 20 4e 46 53 20 4c 6f 63 6b 69   Begin NFS Locki
14600 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ng *************
14610 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14620 2a 2a 2a 2f 0a 0a 23 69 66 20 64 65 66 69 6e 65  ***/..#if define
14630 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20  d(__APPLE__) && 
14640 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
14650 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 2f 2a 0a 20  CKING_STYLE./*. 
14660 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c 6f 63  ** Lower the loc
14670 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20 66 69  king level on fi
14680 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 70 46  le descriptor pF
14690 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f 63 6b  ile to eFileLock
146a0 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 20 2a 2a  .  eFileLock. **
146b0 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72 20   must be either 
146c0 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52 45  NO_LOCK or SHARE
146d0 44 5f 4c 4f 43 4b 2e 0a 20 2a 2a 0a 20 2a 2a 20  D_LOCK.. **. ** 
146e0 49 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c  If the locking l
146f0 65 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65  evel of the file
14700 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61   descriptor is a
14710 6c 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c  lready at or bel
14720 6f 77 0a 20 2a 2a 20 74 68 65 20 72 65 71 75 65  ow. ** the reque
14730 73 74 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76  sted locking lev
14740 65 6c 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  el, this routine
14750 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 2a 2f   is a no-op.. */
14760 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 66 73 55  .static int nfsU
14770 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  nlock(sqlite3_fi
14780 6c 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c  le *id, int eFil
14790 65 4c 6f 63 6b 29 7b 0a 20 20 72 65 74 75 72 6e  eLock){.  return
147a0 20 5f 70 6f 73 69 78 55 6e 6c 6f 63 6b 28 69 64   _posixUnlock(id
147b0 2c 20 65 46 69 6c 65 4c 6f 63 6b 2c 20 31 29 3b  , eFileLock, 1);
147c0 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65  .}..#endif /* de
147d0 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
147e0 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
147f0 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
14800 2a 2f 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 6f 64  */./*.** The cod
14810 65 20 61 62 6f 76 65 20 69 73 20 74 68 65 20 4e  e above is the N
14820 46 53 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e  FS lock implemen
14830 74 61 74 69 6f 6e 2e 20 20 54 68 65 20 63 6f 64  tation.  The cod
14840 65 20 69 73 20 73 70 65 63 69 66 69 63 0a 2a 2a  e is specific.**
14850 20 74 6f 20 4d 61 63 4f 53 58 20 61 6e 64 20 64   to MacOSX and d
14860 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 6f 6e 20  oes not work on 
14870 6f 74 68 65 72 20 75 6e 69 78 20 70 6c 61 74 66  other unix platf
14880 6f 72 6d 73 2e 20 20 4e 6f 20 61 6c 74 65 72 6e  orms.  No altern
14890 61 74 69 76 65 0a 2a 2a 20 69 73 20 61 76 61 69  ative.** is avai
148a0 6c 61 62 6c 65 2e 20 20 0a 2a 2a 0a 2a 2a 2a 2a  lable.  .**.****
148b0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
148c0 2a 20 45 6e 64 20 6f 66 20 74 68 65 20 4e 46 53  * End of the NFS
148d0 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61   lock implementa
148e0 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  tion ***********
148f0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
14900 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14910 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14920 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14930 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14940 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 2a  **********/../**
14950 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14960 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14970 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14980 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
14990 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a  ************.***
149a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 4e 6f  ************* No
149b0 6e 2d 6c 6f 63 6b 69 6e 67 20 73 71 6c 69 74 65  n-locking sqlite
149c0 33 5f 66 69 6c 65 20 6d 65 74 68 6f 64 73 20 2a  3_file methods *
149d0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
149e0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a  ************.**.
149f0 2a 2a 20 54 68 65 20 6e 65 78 74 20 64 69 76 69  ** The next divi
14a00 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 69 6d  sion contains im
14a10 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 66 6f  plementations fo
14a20 72 20 61 6c 6c 20 6d 65 74 68 6f 64 73 20 6f 66  r all methods of
14a30 20 74 68 65 20 0a 2a 2a 20 73 71 6c 69 74 65 33   the .** sqlite3
14a40 5f 66 69 6c 65 20 6f 62 6a 65 63 74 20 6f 74 68  _file object oth
14a50 65 72 20 74 68 61 6e 20 74 68 65 20 6c 6f 63 6b  er than the lock
14a60 69 6e 67 20 6d 65 74 68 6f 64 73 2e 20 20 54 68  ing methods.  Th
14a70 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 6d 65 74  e locking.** met
14a80 68 6f 64 73 20 77 65 72 65 20 64 65 66 69 6e 65  hods were define
14a90 64 20 69 6e 20 64 69 76 69 73 69 6f 6e 73 20 61  d in divisions a
14aa0 62 6f 76 65 20 28 6f 6e 65 20 6c 6f 63 6b 69 6e  bove (one lockin
14ab0 67 20 6d 65 74 68 6f 64 20 70 65 72 0a 2a 2a 20  g method per.** 
14ac0 64 69 76 69 73 69 6f 6e 29 2e 20 20 54 68 6f 73  division).  Thos
14ad0 65 20 6d 65 74 68 6f 64 73 20 74 68 61 74 20 61  e methods that a
14ae0 72 65 20 63 6f 6d 6d 6f 6e 20 74 6f 20 61 6c 6c  re common to all
14af0 20 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 73 0a 2a   locking modes.*
14b00 2a 20 61 72 65 20 67 61 74 68 65 72 20 74 6f 67  * are gather tog
14b10 65 74 68 65 72 20 69 6e 74 6f 20 74 68 69 73 20  ether into this 
14b20 64 69 76 69 73 69 6f 6e 2e 0a 2a 2f 0a 0a 2f 2a  division..*/../*
14b30 0a 2a 2a 20 53 65 65 6b 20 74 6f 20 74 68 65 20  .** Seek to the 
14b40 6f 66 66 73 65 74 20 70 61 73 73 65 64 20 61 73  offset passed as
14b50 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
14b60 6d 65 6e 74 2c 20 74 68 65 6e 20 72 65 61 64 20  ment, then read 
14b70 63 6e 74 20 0a 2a 2a 20 62 79 74 65 73 20 69 6e  cnt .** bytes in
14b80 74 6f 20 70 42 75 66 2e 20 52 65 74 75 72 6e 20  to pBuf. Return 
14b90 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
14ba0 74 65 73 20 61 63 74 75 61 6c 6c 79 20 72 65 61  tes actually rea
14bb0 64 2e 0a 2a 2a 0a 2a 2a 20 4e 42 3a 20 20 49 66  d..**.** NB:  If
14bc0 20 79 6f 75 20 64 65 66 69 6e 65 20 55 53 45 5f   you define USE_
14bd0 50 52 45 41 44 20 6f 72 20 55 53 45 5f 50 52 45  PREAD or USE_PRE
14be0 41 44 36 34 2c 20 74 68 65 6e 20 69 74 20 6d 69  AD64, then it mi
14bf0 67 68 74 20 61 6c 73 6f 0a 2a 2a 20 62 65 20 6e  ght also.** be n
14c00 65 63 65 73 73 61 72 79 20 74 6f 20 64 65 66 69  ecessary to defi
14c10 6e 65 20 5f 58 4f 50 45 4e 5f 53 4f 55 52 43 45  ne _XOPEN_SOURCE
14c20 20 74 6f 20 62 65 20 35 30 30 2e 20 20 54 68 69   to be 500.  Thi
14c30 73 20 76 61 72 69 65 73 20 66 72 6f 6d 0a 2a 2a  s varies from.**
14c40 20 6f 6e 65 20 73 79 73 74 65 6d 20 74 6f 20 61   one system to a
14c50 6e 6f 74 68 65 72 2e 20 20 53 69 6e 63 65 20 53  nother.  Since S
14c60 51 4c 69 74 65 20 64 6f 65 73 20 6e 6f 74 20 64  QLite does not d
14c70 65 66 69 6e 65 20 55 53 45 5f 50 52 45 41 44 0a  efine USE_PREAD.
14c80 2a 2a 20 61 6e 79 20 61 6e 79 20 66 6f 72 6d 20  ** any any form 
14c90 62 79 20 64 65 66 61 75 6c 74 2c 20 77 65 20 77  by default, we w
14ca0 69 6c 6c 20 6e 6f 74 20 61 74 74 65 6d 70 74 20  ill not attempt 
14cb0 74 6f 20 64 65 66 69 6e 65 20 5f 58 4f 50 45 4e  to define _XOPEN
14cc0 5f 53 4f 55 52 43 45 2e 0a 2a 2a 20 53 65 65 20  _SOURCE..** See 
14cd0 74 69 63 6b 65 74 73 20 23 32 37 34 31 20 61 6e  tickets #2741 an
14ce0 64 20 23 32 36 38 31 2e 0a 2a 2a 0a 2a 2a 20 54  d #2681..**.** T
14cf0 6f 20 61 76 6f 69 64 20 73 74 6f 6d 70 69 6e 67  o avoid stomping
14d00 20 74 68 65 20 65 72 72 6e 6f 20 76 61 6c 75 65   the errno value
14d10 20 6f 6e 20 61 20 66 61 69 6c 65 64 20 72 65 61   on a failed rea
14d20 64 20 74 68 65 20 6c 61 73 74 45 72 72 6e 6f 20  d the lastErrno 
14d30 76 61 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20  value.** is set 
14d40 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
14d50 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
14d60 73 65 65 6b 41 6e 64 52 65 61 64 28 75 6e 69 78  seekAndRead(unix
14d70 46 69 6c 65 20 2a 69 64 2c 20 73 71 6c 69 74 65  File *id, sqlite
14d80 33 5f 69 6e 74 36 34 20 6f 66 66 73 65 74 2c 20  3_int64 offset, 
14d90 76 6f 69 64 20 2a 70 42 75 66 2c 20 69 6e 74 20  void *pBuf, int 
14da0 63 6e 74 29 7b 0a 20 20 69 6e 74 20 67 6f 74 3b  cnt){.  int got;
14db0 0a 23 69 66 20 28 21 64 65 66 69 6e 65 64 28 55  .#if (!defined(U
14dc0 53 45 5f 50 52 45 41 44 29 20 26 26 20 21 64 65  SE_PREAD) && !de
14dd0 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44 36  fined(USE_PREAD6
14de0 34 29 29 0a 20 20 69 36 34 20 6e 65 77 4f 66 66  4)).  i64 newOff
14df0 73 65 74 3b 0a 23 65 6e 64 69 66 0a 20 20 54 49  set;.#endif.  TI
14e00 4d 45 52 5f 53 54 41 52 54 3b 0a 23 69 66 20 64  MER_START;.#if d
14e10 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41 44  efined(USE_PREAD
14e20 29 0a 20 20 67 6f 74 20 3d 20 70 72 65 61 64 28  ).  got = pread(
14e30 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74  id->h, pBuf, cnt
14e40 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 53 69 6d  , offset);.  Sim
14e50 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20 67 6f  ulateIOError( go
14e60 74 20 3d 20 2d 31 20 29 3b 0a 23 65 6c 69 66 20  t = -1 );.#elif 
14e70 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45 41  defined(USE_PREA
14e80 44 36 34 29 0a 20 20 67 6f 74 20 3d 20 70 72 65  D64).  got = pre
14e90 61 64 36 34 28 69 64 2d 3e 68 2c 20 70 42 75 66  ad64(id->h, pBuf
14ea0 2c 20 63 6e 74 2c 20 6f 66 66 73 65 74 29 3b 0a  , cnt, offset);.
14eb0 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f    SimulateIOErro
14ec0 72 28 20 67 6f 74 20 3d 20 2d 31 20 29 3b 0a 23  r( got = -1 );.#
14ed0 65 6c 73 65 0a 20 20 6e 65 77 4f 66 66 73 65 74  else.  newOffset
14ee0 20 3d 20 6c 73 65 65 6b 28 69 64 2d 3e 68 2c 20   = lseek(id->h, 
14ef0 6f 66 66 73 65 74 2c 20 53 45 45 4b 5f 53 45 54  offset, SEEK_SET
14f00 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45  );.  SimulateIOE
14f10 72 72 6f 72 28 20 6e 65 77 4f 66 66 73 65 74 2d  rror( newOffset-
14f20 2d 20 29 3b 0a 20 20 69 66 28 20 6e 65 77 4f 66  - );.  if( newOf
14f30 66 73 65 74 21 3d 6f 66 66 73 65 74 20 29 7b 0a  fset!=offset ){.
14f40 20 20 20 20 69 66 28 20 6e 65 77 4f 66 66 73 65      if( newOffse
14f50 74 20 3d 3d 20 2d 31 20 29 7b 0a 20 20 20 20 20  t == -1 ){.     
14f60 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 29   ((unixFile*)id)
14f70 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72  ->lastErrno = er
14f80 72 6e 6f 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  rno;.    }else{.
14f90 20 20 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65        ((unixFile
14fa0 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f  *)id)->lastErrno
14fb0 20 3d 20 30 3b 09 09 09 0a 20 20 20 20 7d 0a 20   = 0;....    }. 
14fc0 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20     return -1;.  
14fd0 7d 0a 20 20 67 6f 74 20 3d 20 72 65 61 64 28 69  }.  got = read(i
14fe0 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63 6e 74 29  d->h, pBuf, cnt)
14ff0 3b 0a 23 65 6e 64 69 66 0a 20 20 54 49 4d 45 52  ;.#endif.  TIMER
15000 5f 45 4e 44 3b 0a 20 20 69 66 28 20 67 6f 74 3c  _END;.  if( got<
15010 30 20 29 7b 0a 20 20 20 20 28 28 75 6e 69 78 46  0 ){.    ((unixF
15020 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72  ile*)id)->lastEr
15030 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 7d  rno = errno;.  }
15040 0a 20 20 4f 53 54 52 41 43 45 28 28 22 52 45 41  .  OSTRACE(("REA
15050 44 20 20 20 20 25 2d 33 64 20 25 35 64 20 25 37  D    %-3d %5d %7
15060 6c 6c 64 20 25 6c 6c 75 5c 6e 22 2c 20 69 64 2d  lld %llu\n", id-
15070 3e 68 2c 20 67 6f 74 2c 20 6f 66 66 73 65 74 2c  >h, got, offset,
15080 20 54 49 4d 45 52 5f 45 4c 41 50 53 45 44 29 29   TIMER_ELAPSED))
15090 3b 0a 20 20 72 65 74 75 72 6e 20 67 6f 74 3b 0a  ;.  return got;.
150a0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 64 61  }../*.** Read da
150b0 74 61 20 66 72 6f 6d 20 61 20 66 69 6c 65 20 69  ta from a file i
150c0 6e 74 6f 20 61 20 62 75 66 66 65 72 2e 20 20 52  nto a buffer.  R
150d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
150e0 69 66 20 61 6c 6c 0a 2a 2a 20 62 79 74 65 73 20  if all.** bytes 
150f0 77 65 72 65 20 72 65 61 64 20 73 75 63 63 65 73  were read succes
15100 73 66 75 6c 6c 79 20 61 6e 64 20 53 51 4c 49 54  sfully and SQLIT
15110 45 5f 49 4f 45 52 52 20 69 66 20 61 6e 79 74 68  E_IOERR if anyth
15120 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e  ing goes.** wron
15130 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
15140 20 75 6e 69 78 52 65 61 64 28 0a 20 20 73 71 6c   unixRead(.  sql
15150 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 0a  ite3_file *id, .
15160 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 0a 20    void *pBuf, . 
15170 20 69 6e 74 20 61 6d 74 2c 0a 20 20 73 71 6c 69   int amt,.  sqli
15180 74 65 33 5f 69 6e 74 36 34 20 6f 66 66 73 65 74  te3_int64 offset
15190 0a 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  .){.  unixFile *
151a0 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c  pFile = (unixFil
151b0 65 20 2a 29 69 64 3b 0a 20 20 69 6e 74 20 67 6f  e *)id;.  int go
151c0 74 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 20  t;.  assert( id 
151d0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  );..  /* If this
151e0 20 69 73 20 61 20 64 61 74 61 62 61 73 65 20 66   is a database f
151f0 69 6c 65 20 28 6e 6f 74 20 61 20 6a 6f 75 72 6e  ile (not a journ
15200 61 6c 2c 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e  al, master-journ
15210 61 6c 20 6f 72 20 74 65 6d 70 0a 20 20 2a 2a 20  al or temp.  ** 
15220 66 69 6c 65 29 2c 20 74 68 65 20 62 79 74 65 73  file), the bytes
15230 20 69 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   in the locking 
15240 72 61 6e 67 65 20 73 68 6f 75 6c 64 20 6e 65 76  range should nev
15250 65 72 20 62 65 20 72 65 61 64 20 6f 72 20 77 72  er be read or wr
15260 69 74 74 65 6e 2e 20 2a 2f 0a 23 69 66 20 30 0a  itten. */.#if 0.
15270 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d    assert( pFile-
15280 3e 70 55 6e 75 73 65 64 3d 3d 30 0a 20 20 20 20  >pUnused==0.    
15290 20 20 20 7c 7c 20 6f 66 66 73 65 74 3e 3d 50 45     || offset>=PE
152a0 4e 44 49 4e 47 5f 42 59 54 45 2b 35 31 32 0a 20  NDING_BYTE+512. 
152b0 20 20 20 20 20 20 7c 7c 20 6f 66 66 73 65 74 2b        || offset+
152c0 61 6d 74 3c 3d 50 45 4e 44 49 4e 47 5f 42 59 54  amt<=PENDING_BYT
152d0 45 20 0a 20 20 29 3b 0a 23 65 6e 64 69 66 0a 0a  E .  );.#endif..
152e0 20 20 67 6f 74 20 3d 20 73 65 65 6b 41 6e 64 52    got = seekAndR
152f0 65 61 64 28 70 46 69 6c 65 2c 20 6f 66 66 73 65  ead(pFile, offse
15300 74 2c 20 70 42 75 66 2c 20 61 6d 74 29 3b 0a 20  t, pBuf, amt);. 
15310 20 69 66 28 20 67 6f 74 3d 3d 61 6d 74 20 29 7b   if( got==amt ){
15320 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
15330 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 20 69  TE_OK;.  }else i
15340 66 28 20 67 6f 74 3c 30 20 29 7b 0a 20 20 20 20  f( got<0 ){.    
15350 2f 2a 20 6c 61 73 74 45 72 72 6e 6f 20 73 65 74  /* lastErrno set
15360 20 62 79 20 73 65 65 6b 41 6e 64 52 65 61 64 20   by seekAndRead 
15370 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  */.    return SQ
15380 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44 3b  LITE_IOERR_READ;
15390 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 46  .  }else{.    pF
153a0 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
153b0 20 30 3b 20 2f 2a 20 6e 6f 74 20 61 20 73 79 73   0; /* not a sys
153c0 74 65 6d 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20  tem error */.   
153d0 20 2f 2a 20 55 6e 72 65 61 64 20 70 61 72 74 73   /* Unread parts
153e0 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 6d   of the buffer m
153f0 75 73 74 20 62 65 20 7a 65 72 6f 2d 66 69 6c 6c  ust be zero-fill
15400 65 64 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74  ed */.    memset
15410 28 26 28 28 63 68 61 72 2a 29 70 42 75 66 29 5b  (&((char*)pBuf)[
15420 67 6f 74 5d 2c 20 30 2c 20 61 6d 74 2d 67 6f 74  got], 0, amt-got
15430 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
15440 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
15450 5f 52 45 41 44 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  _READ;.  }.}../*
15460 0a 2a 2a 20 53 65 65 6b 20 74 6f 20 74 68 65 20  .** Seek to the 
15470 6f 66 66 73 65 74 20 69 6e 20 69 64 2d 3e 6f 66  offset in id->of
15480 66 73 65 74 20 74 68 65 6e 20 72 65 61 64 20 63  fset then read c
15490 6e 74 20 62 79 74 65 73 20 69 6e 74 6f 20 70 42  nt bytes into pB
154a0 75 66 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  uf..** Return th
154b0 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
154c0 73 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64 2e  s actually read.
154d0 20 20 55 70 64 61 74 65 20 74 68 65 20 6f 66 66    Update the off
154e0 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 76  set..**.** To av
154f0 6f 69 64 20 73 74 6f 6d 70 69 6e 67 20 74 68 65  oid stomping the
15500 20 65 72 72 6e 6f 20 76 61 6c 75 65 20 6f 6e 20   errno value on 
15510 61 20 66 61 69 6c 65 64 20 77 72 69 74 65 20 74  a failed write t
15520 68 65 20 6c 61 73 74 45 72 72 6e 6f 20 76 61 6c  he lastErrno val
15530 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 62 65 66  ue.** is set bef
15540 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a  ore returning..*
15550 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 65  /.static int see
15560 6b 41 6e 64 57 72 69 74 65 28 75 6e 69 78 46 69  kAndWrite(unixFi
15570 6c 65 20 2a 69 64 2c 20 69 36 34 20 6f 66 66 73  le *id, i64 offs
15580 65 74 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  et, const void *
15590 70 42 75 66 2c 20 69 6e 74 20 63 6e 74 29 7b 0a  pBuf, int cnt){.
155a0 20 20 69 6e 74 20 67 6f 74 3b 0a 23 69 66 20 28    int got;.#if (
155b0 21 64 65 66 69 6e 65 64 28 55 53 45 5f 50 52 45  !defined(USE_PRE
155c0 41 44 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  AD) && !defined(
155d0 55 53 45 5f 50 52 45 41 44 36 34 29 29 0a 20 20  USE_PREAD64)).  
155e0 69 36 34 20 6e 65 77 4f 66 66 73 65 74 3b 0a 23  i64 newOffset;.#
155f0 65 6e 64 69 66 0a 20 20 54 49 4d 45 52 5f 53 54  endif.  TIMER_ST
15600 41 52 54 3b 0a 23 69 66 20 64 65 66 69 6e 65 64  ART;.#if defined
15610 28 55 53 45 5f 50 52 45 41 44 29 0a 20 20 67 6f  (USE_PREAD).  go
15620 74 20 3d 20 70 77 72 69 74 65 28 69 64 2d 3e 68  t = pwrite(id->h
15630 2c 20 70 42 75 66 2c 20 63 6e 74 2c 20 6f 66 66  , pBuf, cnt, off
15640 73 65 74 29 3b 0a 23 65 6c 69 66 20 64 65 66 69  set);.#elif defi
15650 6e 65 64 28 55 53 45 5f 50 52 45 41 44 36 34 29  ned(USE_PREAD64)
15660 0a 20 20 67 6f 74 20 3d 20 70 77 72 69 74 65 36  .  got = pwrite6
15670 34 28 69 64 2d 3e 68 2c 20 70 42 75 66 2c 20 63  4(id->h, pBuf, c
15680 6e 74 2c 20 6f 66 66 73 65 74 29 3b 0a 23 65 6c  nt, offset);.#el
15690 73 65 0a 20 20 6e 65 77 4f 66 66 73 65 74 20 3d  se.  newOffset =
156a0 20 6c 73 65 65 6b 28 69 64 2d 3e 68 2c 20 6f 66   lseek(id->h, of
156b0 66 73 65 74 2c 20 53 45 45 4b 5f 53 45 54 29 3b  fset, SEEK_SET);
156c0 0a 20 20 69 66 28 20 6e 65 77 4f 66 66 73 65 74  .  if( newOffset
156d0 21 3d 6f 66 66 73 65 74 20 29 7b 0a 20 20 20 20  !=offset ){.    
156e0 69 66 28 20 6e 65 77 4f 66 66 73 65 74 20 3d 3d  if( newOffset ==
156f0 20 2d 31 20 29 7b 0a 20 20 20 20 20 20 28 28 75   -1 ){.      ((u
15700 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61  nixFile*)id)->la
15710 73 74 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b  stErrno = errno;
15720 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
15730 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64    ((unixFile*)id
15740 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30  )->lastErrno = 0
15750 3b 09 09 09 0a 20 20 20 20 7d 0a 20 20 20 20 72  ;....    }.    r
15760 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 20 20  eturn -1;.  }.  
15770 67 6f 74 20 3d 20 77 72 69 74 65 28 69 64 2d 3e  got = write(id->
15780 68 2c 20 70 42 75 66 2c 20 63 6e 74 29 3b 0a 23  h, pBuf, cnt);.#
15790 65 6e 64 69 66 0a 20 20 54 49 4d 45 52 5f 45 4e  endif.  TIMER_EN
157a0 44 3b 0a 20 20 69 66 28 20 67 6f 74 3c 30 20 29  D;.  if( got<0 )
157b0 7b 0a 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65  {.    ((unixFile
157c0 2a 29 69 64 29 2d 3e 6c 61 73 74 45 72 72 6e 6f  *)id)->lastErrno
157d0 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 7d 0a 0a 20   = errno;.  }.. 
157e0 20 4f 53 54 52 41 43 45 28 28 22 57 52 49 54 45   OSTRACE(("WRITE
157f0 20 20 20 25 2d 33 64 20 25 35 64 20 25 37 6c 6c     %-3d %5d %7ll
15800 64 20 25 6c 6c 75 5c 6e 22 2c 20 69 64 2d 3e 68  d %llu\n", id->h
15810 2c 20 67 6f 74 2c 20 6f 66 66 73 65 74 2c 20 54  , got, offset, T
15820 49 4d 45 52 5f 45 4c 41 50 53 45 44 29 29 3b 0a  IMER_ELAPSED));.
15830 20 20 72 65 74 75 72 6e 20 67 6f 74 3b 0a 7d 0a    return got;.}.
15840 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 64 61  ../*.** Write da
15850 74 61 20 66 72 6f 6d 20 61 20 62 75 66 66 65 72  ta from a buffer
15860 20 69 6e 74 6f 20 61 20 66 69 6c 65 2e 20 20 52   into a file.  R
15870 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
15880 6f 6e 20 73 75 63 63 65 73 73 0a 2a 2a 20 6f 72  on success.** or
15890 20 73 6f 6d 65 20 6f 74 68 65 72 20 65 72 72 6f   some other erro
158a0 72 20 63 6f 64 65 20 6f 6e 20 66 61 69 6c 75 72  r code on failur
158b0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
158c0 20 75 6e 69 78 57 72 69 74 65 28 0a 20 20 73 71   unixWrite(.  sq
158d0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20  lite3_file *id, 
158e0 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  .  const void *p
158f0 42 75 66 2c 20 0a 20 20 69 6e 74 20 61 6d 74 2c  Buf, .  int amt,
15900 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
15910 20 6f 66 66 73 65 74 20 0a 29 7b 0a 20 20 75 6e   offset .){.  un
15920 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20  ixFile *pFile = 
15930 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20  (unixFile*)id;. 
15940 20 69 6e 74 20 77 72 6f 74 65 20 3d 20 30 3b 0a   int wrote = 0;.
15950 20 20 61 73 73 65 72 74 28 20 69 64 20 29 3b 0a    assert( id );.
15960 20 20 61 73 73 65 72 74 28 20 61 6d 74 3e 30 20    assert( amt>0 
15970 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  );..  /* If this
15980 20 69 73 20 61 20 64 61 74 61 62 61 73 65 20 66   is a database f
15990 69 6c 65 20 28 6e 6f 74 20 61 20 6a 6f 75 72 6e  ile (not a journ
159a0 61 6c 2c 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e  al, master-journ
159b0 61 6c 20 6f 72 20 74 65 6d 70 0a 20 20 2a 2a 20  al or temp.  ** 
159c0 66 69 6c 65 29 2c 20 74 68 65 20 62 79 74 65 73  file), the bytes
159d0 20 69 6e 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   in the locking 
159e0 72 61 6e 67 65 20 73 68 6f 75 6c 64 20 6e 65 76  range should nev
159f0 65 72 20 62 65 20 72 65 61 64 20 6f 72 20 77 72  er be read or wr
15a00 69 74 74 65 6e 2e 20 2a 2f 0a 23 69 66 20 30 0a  itten. */.#if 0.
15a10 20 20 61 73 73 65 72 74 28 20 70 46 69 6c 65 2d    assert( pFile-
15a20 3e 70 55 6e 75 73 65 64 3d 3d 30 0a 20 20 20 20  >pUnused==0.    
15a30 20 20 20 7c 7c 20 6f 66 66 73 65 74 3e 3d 50 45     || offset>=PE
15a40 4e 44 49 4e 47 5f 42 59 54 45 2b 35 31 32 0a 20  NDING_BYTE+512. 
15a50 20 20 20 20 20 20 7c 7c 20 6f 66 66 73 65 74 2b        || offset+
15a60 61 6d 74 3c 3d 50 45 4e 44 49 4e 47 5f 42 59 54  amt<=PENDING_BYT
15a70 45 20 0a 20 20 29 3b 0a 23 65 6e 64 69 66 0a 0a  E .  );.#endif..
15a80 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
15a90 20 2f 2a 20 49 66 20 77 65 20 61 72 65 20 64 6f   /* If we are do
15aa0 69 6e 67 20 61 20 6e 6f 72 6d 61 6c 20 77 72 69  ing a normal wri
15ab0 74 65 20 74 6f 20 61 20 64 61 74 61 62 61 73 65  te to a database
15ac0 20 66 69 6c 65 20 28 61 73 20 6f 70 70 6f 73 65   file (as oppose
15ad0 64 20 74 6f 0a 20 20 2a 2a 20 64 6f 69 6e 67 20  d to.  ** doing 
15ae0 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  a hot-journal ro
15af0 6c 6c 62 61 63 6b 20 6f 72 20 61 20 77 72 69 74  llback or a writ
15b00 65 20 74 6f 20 73 6f 6d 65 20 66 69 6c 65 20 6f  e to some file o
15b10 74 68 65 72 20 74 68 61 6e 20 61 0a 20 20 2a 2a  ther than a.  **
15b20 20 6e 6f 72 6d 61 6c 20 64 61 74 61 62 61 73 65   normal database
15b30 20 66 69 6c 65 29 20 74 68 65 6e 20 72 65 63 6f   file) then reco
15b40 72 64 20 74 68 65 20 66 61 63 74 20 74 68 61 74  rd the fact that
15b50 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20   the database.  
15b60 2a 2a 20 68 61 73 20 63 68 61 6e 67 65 64 2e 20  ** has changed. 
15b70 20 49 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   If the transact
15b80 69 6f 6e 20 63 6f 75 6e 74 65 72 20 69 73 20 6d  ion counter is m
15b90 6f 64 69 66 69 65 64 2c 20 72 65 63 6f 72 64 20  odified, record 
15ba0 74 68 61 74 0a 20 20 2a 2a 20 66 61 63 74 20 74  that.  ** fact t
15bb0 6f 6f 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  oo..  */.  if( p
15bc0 46 69 6c 65 2d 3e 69 6e 4e 6f 72 6d 61 6c 57 72  File->inNormalWr
15bd0 69 74 65 20 29 7b 0a 20 20 20 20 70 46 69 6c 65  ite ){.    pFile
15be0 2d 3e 64 62 55 70 64 61 74 65 20 3d 20 31 3b 20  ->dbUpdate = 1; 
15bf0 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
15c00 20 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69   has been modifi
15c10 65 64 20 2a 2f 0a 20 20 20 20 69 66 28 20 6f 66  ed */.    if( of
15c20 66 73 65 74 3c 3d 32 34 20 26 26 20 6f 66 66 73  fset<=24 && offs
15c30 65 74 2b 61 6d 74 3e 3d 32 37 20 29 7b 0a 20 20  et+amt>=27 ){.  
15c40 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20      int rc;.    
15c50 20 20 63 68 61 72 20 6f 6c 64 43 6e 74 72 5b 34    char oldCntr[4
15c60 5d 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74  ];.      Simulat
15c70 65 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 31  eIOErrorBenign(1
15c80 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 65  );.      rc = se
15c90 65 6b 41 6e 64 52 65 61 64 28 70 46 69 6c 65 2c  ekAndRead(pFile,
15ca0 20 32 34 2c 20 6f 6c 64 43 6e 74 72 2c 20 34 29   24, oldCntr, 4)
15cb0 3b 0a 20 20 20 20 20 20 53 69 6d 75 6c 61 74 65  ;.      Simulate
15cc0 49 4f 45 72 72 6f 72 42 65 6e 69 67 6e 28 30 29  IOErrorBenign(0)
15cd0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
15ce0 34 20 7c 7c 20 6d 65 6d 63 6d 70 28 6f 6c 64 43  4 || memcmp(oldC
15cf0 6e 74 72 2c 20 26 28 28 63 68 61 72 2a 29 70 42  ntr, &((char*)pB
15d00 75 66 29 5b 32 34 2d 6f 66 66 73 65 74 5d 2c 20  uf)[24-offset], 
15d10 34 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  4)!=0 ){.       
15d20 20 70 46 69 6c 65 2d 3e 74 72 61 6e 73 43 6e 74   pFile->transCnt
15d30 72 43 68 6e 67 20 3d 20 31 3b 20 20 2f 2a 20 54  rChng = 1;  /* T
15d40 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  he transaction c
15d50 6f 75 6e 74 65 72 20 68 61 73 20 63 68 61 6e 67  ounter has chang
15d60 65 64 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20  ed */.      }.  
15d70 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
15d80 20 20 77 68 69 6c 65 28 20 61 6d 74 3e 30 20 26    while( amt>0 &
15d90 26 20 28 77 72 6f 74 65 20 3d 20 73 65 65 6b 41  & (wrote = seekA
15da0 6e 64 57 72 69 74 65 28 70 46 69 6c 65 2c 20 6f  ndWrite(pFile, o
15db0 66 66 73 65 74 2c 20 70 42 75 66 2c 20 61 6d 74  ffset, pBuf, amt
15dc0 29 29 3e 30 20 29 7b 0a 20 20 20 20 61 6d 74 20  ))>0 ){.    amt 
15dd0 2d 3d 20 77 72 6f 74 65 3b 0a 20 20 20 20 6f 66  -= wrote;.    of
15de0 66 73 65 74 20 2b 3d 20 77 72 6f 74 65 3b 0a 20  fset += wrote;. 
15df0 20 20 20 70 42 75 66 20 3d 20 26 28 28 63 68 61     pBuf = &((cha
15e00 72 2a 29 70 42 75 66 29 5b 77 72 6f 74 65 5d 3b  r*)pBuf)[wrote];
15e10 0a 20 20 7d 0a 20 20 53 69 6d 75 6c 61 74 65 49  .  }.  SimulateI
15e20 4f 45 72 72 6f 72 28 28 20 77 72 6f 74 65 3d 28  OError(( wrote=(
15e30 2d 31 29 2c 20 61 6d 74 3d 31 20 29 29 3b 0a 20  -1), amt=1 ));. 
15e40 20 53 69 6d 75 6c 61 74 65 44 69 73 6b 66 75 6c   SimulateDiskful
15e50 6c 45 72 72 6f 72 28 28 20 77 72 6f 74 65 3d 30  lError(( wrote=0
15e60 2c 20 61 6d 74 3d 31 20 29 29 3b 0a 20 20 69 66  , amt=1 ));.  if
15e70 28 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 69  ( amt>0 ){.    i
15e80 66 28 20 77 72 6f 74 65 3c 30 20 29 7b 0a 20 20  f( wrote<0 ){.  
15e90 20 20 20 20 2f 2a 20 6c 61 73 74 45 72 72 6e 6f      /* lastErrno
15ea0 20 73 65 74 20 62 79 20 73 65 65 6b 41 6e 64 57   set by seekAndW
15eb0 72 69 74 65 20 2a 2f 0a 20 20 20 20 20 20 72 65  rite */.      re
15ec0 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
15ed0 52 5f 57 52 49 54 45 3b 0a 20 20 20 20 7d 65 6c  R_WRITE;.    }el
15ee0 73 65 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  se{.      pFile-
15ef0 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 30 3b 20  >lastErrno = 0; 
15f00 2f 2a 20 6e 6f 74 20 61 20 73 79 73 74 65 6d 20  /* not a system 
15f10 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20 72  error */.      r
15f20 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c  eturn SQLITE_FUL
15f30 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  L;.    }.  }.  r
15f40 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
15f50 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
15f60 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20 43 6f 75  E_TEST./*.** Cou
15f70 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  nt the number of
15f80 20 66 75 6c 6c 73 79 6e 63 73 20 61 6e 64 20 6e   fullsyncs and n
15f90 6f 72 6d 61 6c 20 73 79 6e 63 73 2e 20 20 54 68  ormal syncs.  Th
15fa0 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 74 65  is is used to te
15fb0 73 74 0a 2a 2a 20 74 68 61 74 20 73 79 6e 63 73  st.** that syncs
15fc0 20 61 6e 64 20 66 75 6c 6c 73 79 6e 63 73 20 61   and fullsyncs a
15fd0 72 65 20 6f 63 63 75 72 72 69 6e 67 20 61 74 20  re occurring at 
15fe0 74 68 65 20 72 69 67 68 74 20 74 69 6d 65 73 2e  the right times.
15ff0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
16000 73 79 6e 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a  sync_count = 0;.
16010 69 6e 74 20 73 71 6c 69 74 65 33 5f 66 75 6c 6c  int sqlite3_full
16020 73 79 6e 63 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a  sync_count = 0;.
16030 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 65  #endif../*.** We
16040 20 64 6f 20 6e 6f 74 20 74 72 75 73 74 20 73 79   do not trust sy
16050 73 74 65 6d 73 20 74 6f 20 70 72 6f 76 69 64 65  stems to provide
16060 20 61 20 77 6f 72 6b 69 6e 67 20 66 64 61 74 61   a working fdata
16070 73 79 6e 63 28 29 2e 20 20 53 6f 6d 65 20 64 6f  sync().  Some do
16080 2e 0a 2a 2a 20 4f 74 68 65 72 73 20 64 6f 20 6e  ..** Others do n
16090 6f 2e 20 20 54 6f 20 62 65 20 73 61 66 65 2c 20  o.  To be safe, 
160a0 77 65 20 77 69 6c 6c 20 73 74 69 63 6b 20 77 69  we will stick wi
160b0 74 68 20 74 68 65 20 28 73 6c 6f 77 65 72 29 20  th the (slower) 
160c0 66 73 79 6e 63 28 29 2e 0a 2a 2a 20 49 66 20 79  fsync()..** If y
160d0 6f 75 20 6b 6e 6f 77 20 74 68 61 74 20 79 6f 75  ou know that you
160e0 72 20 73 79 73 74 65 6d 20 64 6f 65 73 20 73 75  r system does su
160f0 70 70 6f 72 74 20 66 64 61 74 61 73 79 6e 63 28  pport fdatasync(
16100 29 20 63 6f 72 72 65 63 74 6c 79 2c 0a 2a 2a 20  ) correctly,.** 
16110 74 68 65 6e 20 73 69 6d 70 6c 79 20 63 6f 6d 70  then simply comp
16120 69 6c 65 20 77 69 74 68 20 2d 44 66 64 61 74 61  ile with -Dfdata
16130 73 79 6e 63 3d 66 64 61 74 61 73 79 6e 63 0a 2a  sync=fdatasync.*
16140 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 66  /.#if !defined(f
16150 64 61 74 61 73 79 6e 63 29 20 26 26 20 21 64 65  datasync) && !de
16160 66 69 6e 65 64 28 5f 5f 6c 69 6e 75 78 5f 5f 29  fined(__linux__)
16170 0a 23 20 64 65 66 69 6e 65 20 66 64 61 74 61 73  .# define fdatas
16180 79 6e 63 20 66 73 79 6e 63 0a 23 65 6e 64 69 66  ync fsync.#endif
16190 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 69 6e 65 20 48  ../*.** Define H
161a0 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 20 74 6f  AVE_FULLFSYNC to
161b0 20 30 20 6f 72 20 31 20 64 65 70 65 6e 64 69 6e   0 or 1 dependin
161c0 67 20 6f 6e 20 77 68 65 74 68 65 72 20 6f 72 20  g on whether or 
161d0 6e 6f 74 0a 2a 2a 20 74 68 65 20 46 5f 46 55 4c  not.** the F_FUL
161e0 4c 46 53 59 4e 43 20 6d 61 63 72 6f 20 69 73 20  LFSYNC macro is 
161f0 64 65 66 69 6e 65 64 2e 20 20 46 5f 46 55 4c 4c  defined.  F_FULL
16200 46 53 59 4e 43 20 69 73 20 63 75 72 72 65 6e 74  FSYNC is current
16210 6c 79 0a 2a 2a 20 6f 6e 6c 79 20 61 76 61 69 6c  ly.** only avail
16220 61 62 6c 65 20 6f 6e 20 4d 61 63 20 4f 53 20 58  able on Mac OS X
16230 2e 20 20 42 75 74 20 74 68 61 74 20 63 6f 75 6c  .  But that coul
16240 64 20 63 68 61 6e 67 65 2e 0a 2a 2f 0a 23 69 66  d change..*/.#if
16250 64 65 66 20 46 5f 46 55 4c 4c 46 53 59 4e 43 0a  def F_FULLFSYNC.
16260 23 20 64 65 66 69 6e 65 20 48 41 56 45 5f 46 55  # define HAVE_FU
16270 4c 4c 46 53 59 4e 43 20 31 0a 23 65 6c 73 65 0a  LLFSYNC 1.#else.
16280 23 20 64 65 66 69 6e 65 20 48 41 56 45 5f 46 55  # define HAVE_FU
16290 4c 4c 46 53 59 4e 43 20 30 0a 23 65 6e 64 69 66  LLFSYNC 0.#endif
162a0 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 73 79  .../*.** The fsy
162b0 6e 63 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c  nc() system call
162c0 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20 61   does not work a
162d0 73 20 61 64 76 65 72 74 69 73 65 64 20 6f 6e 20  s advertised on 
162e0 6d 61 6e 79 0a 2a 2a 20 75 6e 69 78 20 73 79 73  many.** unix sys
162f0 74 65 6d 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  tems.  The follo
16300 77 69 6e 67 20 70 72 6f 63 65 64 75 72 65 20 69  wing procedure i
16310 73 20 61 6e 20 61 74 74 65 6d 70 74 20 74 6f 20  s an attempt to 
16320 6d 61 6b 65 0a 2a 2a 20 69 74 20 77 6f 72 6b 20  make.** it work 
16330 62 65 74 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  better..**.** Th
16340 65 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43  e SQLITE_NO_SYNC
16350 20 6d 61 63 72 6f 20 64 69 73 61 62 6c 65 73 20   macro disables 
16360 61 6c 6c 20 66 73 79 6e 63 28 29 73 2e 20 20 54  all fsync()s.  T
16370 68 69 73 20 69 73 20 75 73 65 66 75 6c 0a 2a 2a  his is useful.**
16380 20 66 6f 72 20 74 65 73 74 69 6e 67 20 77 68 65   for testing whe
16390 6e 20 77 65 20 77 61 6e 74 20 74 6f 20 72 75 6e  n we want to run
163a0 20 74 68 72 6f 75 67 68 20 74 68 65 20 74 65 73   through the tes
163b0 74 20 73 75 69 74 65 20 71 75 69 63 6b 6c 79 2e  t suite quickly.
163c0 0a 2a 2a 20 59 6f 75 20 61 72 65 20 73 74 72 6f  .** You are stro
163d0 6e 67 6c 79 20 61 64 76 69 73 65 64 20 2a 6e 6f  ngly advised *no
163e0 74 2a 20 74 6f 20 64 65 70 6c 6f 79 20 77 69 74  t* to deploy wit
163f0 68 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43  h SQLITE_NO_SYNC
16400 0a 2a 2a 20 65 6e 61 62 6c 65 64 2c 20 68 6f 77  .** enabled, how
16410 65 76 65 72 2c 20 73 69 6e 63 65 20 77 69 74 68  ever, since with
16420 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59 4e 43 20   SQLITE_NO_SYNC 
16430 65 6e 61 62 6c 65 64 2c 20 61 6e 20 4f 53 20 63  enabled, an OS c
16440 72 61 73 68 0a 2a 2a 20 6f 72 20 70 6f 77 65 72  rash.** or power
16450 20 66 61 69 6c 75 72 65 20 77 69 6c 6c 20 6c 69   failure will li
16460 6b 65 6c 79 20 63 6f 72 72 75 70 74 20 74 68 65  kely corrupt the
16470 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
16480 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 73 65 74  **.** SQLite set
16490 73 20 74 68 65 20 64 61 74 61 4f 6e 6c 79 20 66  s the dataOnly f
164a0 6c 61 67 20 69 66 20 74 68 65 20 73 69 7a 65 20  lag if the size 
164b0 6f 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 75  of the file is u
164c0 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 20 54 68 65  nchanged..** The
164d0 20 69 64 65 61 20 62 65 68 69 6e 64 20 64 61 74   idea behind dat
164e0 61 4f 6e 6c 79 20 69 73 20 74 68 61 74 20 69 74  aOnly is that it
164f0 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 77 72 69   should only wri
16500 74 65 20 74 68 65 20 66 69 6c 65 20 63 6f 6e 74  te the file cont
16510 65 6e 74 0a 2a 2a 20 74 6f 20 64 69 73 6b 2c 20  ent.** to disk, 
16520 6e 6f 74 20 74 68 65 20 69 6e 6f 64 65 2e 20 20  not the inode.  
16530 57 65 20 6f 6e 6c 79 20 73 65 74 20 64 61 74 61  We only set data
16540 4f 6e 6c 79 20 69 66 20 74 68 65 20 66 69 6c 65  Only if the file
16550 20 73 69 7a 65 20 69 73 20 0a 2a 2a 20 75 6e 63   size is .** unc
16560 68 61 6e 67 65 64 20 73 69 6e 63 65 20 74 68 65  hanged since the
16570 20 66 69 6c 65 20 73 69 7a 65 20 69 73 20 70 61   file size is pa
16580 72 74 20 6f 66 20 74 68 65 20 69 6e 6f 64 65 2e  rt of the inode.
16590 20 20 48 6f 77 65 76 65 72 2c 20 0a 2a 2a 20 54    However, .** T
165a0 65 64 20 54 73 27 6f 20 74 65 6c 6c 73 20 75 73  ed Ts'o tells us
165b0 20 74 68 61 74 20 66 64 61 74 61 73 79 6e 63 28   that fdatasync(
165c0 29 20 77 69 6c 6c 20 61 6c 73 6f 20 77 72 69 74  ) will also writ
165d0 65 20 74 68 65 20 69 6e 6f 64 65 20 69 66 20 74  e the inode if t
165e0 68 65 0a 2a 2a 20 66 69 6c 65 20 73 69 7a 65 20  he.** file size 
165f0 68 61 73 20 63 68 61 6e 67 65 64 2e 20 20 54 68  has changed.  Th
16600 65 20 6f 6e 6c 79 20 72 65 61 6c 20 64 69 66 66  e only real diff
16610 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 66  erence between f
16620 64 61 74 61 73 79 6e 63 28 29 0a 2a 2a 20 61 6e  datasync().** an
16630 64 20 66 73 79 6e 63 28 29 2c 20 54 65 64 20 74  d fsync(), Ted t
16640 65 6c 6c 73 20 75 73 2c 20 69 73 20 74 68 61 74  ells us, is that
16650 20 66 64 61 74 61 73 79 6e 63 28 29 20 77 69 6c   fdatasync() wil
16660 6c 20 6e 6f 74 20 66 6c 75 73 68 20 74 68 65 0a  l not flush the.
16670 2a 2a 20 69 6e 6f 64 65 20 69 66 20 74 68 65 20  ** inode if the 
16680 6d 74 69 6d 65 20 6f 72 20 6f 77 6e 65 72 20 6f  mtime or owner o
16690 72 20 6f 74 68 65 72 20 69 6e 6f 64 65 20 61 74  r other inode at
166a0 74 72 69 62 75 74 65 73 20 68 61 76 65 20 63 68  tributes have ch
166b0 61 6e 67 65 64 2e 0a 2a 2a 20 57 65 20 6f 6e 6c  anged..** We onl
166c0 79 20 63 61 72 65 20 61 62 6f 75 74 20 74 68 65  y care about the
166d0 20 66 69 6c 65 20 73 69 7a 65 2c 20 6e 6f 74 20   file size, not 
166e0 74 68 65 20 6f 74 68 65 72 20 66 69 6c 65 20 61  the other file a
166f0 74 74 72 69 62 75 74 65 73 2c 20 73 6f 0a 2a 2a  ttributes, so.**
16700 20 61 73 20 66 61 72 20 61 73 20 53 51 4c 69 74   as far as SQLit
16710 65 20 69 73 20 63 6f 6e 63 65 72 6e 65 64 2c 20  e is concerned, 
16720 61 6e 20 66 64 61 74 61 73 79 6e 63 28 29 20 69  an fdatasync() i
16730 73 20 61 6c 77 61 79 73 20 61 64 65 71 75 61 74  s always adequat
16740 65 2e 0a 2a 2a 20 53 6f 2c 20 77 65 20 61 6c 77  e..** So, we alw
16750 61 79 73 20 75 73 65 20 66 64 61 74 61 73 79 6e  ays use fdatasyn
16760 63 28 29 20 69 66 20 69 74 20 69 73 20 61 76 61  c() if it is ava
16770 69 6c 61 62 6c 65 2c 20 72 65 67 61 72 64 6c 65  ilable, regardle
16780 73 73 20 6f 66 0a 2a 2a 20 74 68 65 20 76 61 6c  ss of.** the val
16790 75 65 20 6f 66 20 74 68 65 20 64 61 74 61 4f 6e  ue of the dataOn
167a0 6c 79 20 66 6c 61 67 2e 0a 2a 2f 0a 73 74 61 74  ly flag..*/.stat
167b0 69 63 20 69 6e 74 20 66 75 6c 6c 5f 66 73 79 6e  ic int full_fsyn
167c0 63 28 69 6e 74 20 66 64 2c 20 69 6e 74 20 66 75  c(int fd, int fu
167d0 6c 6c 53 79 6e 63 2c 20 69 6e 74 20 64 61 74 61  llSync, int data
167e0 4f 6e 6c 79 29 7b 0a 20 20 69 6e 74 20 72 63 3b  Only){.  int rc;
167f0 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f  ..  /* The follo
16800 77 69 6e 67 20 22 69 66 64 65 66 2f 65 6c 69 66  wing "ifdef/elif
16810 2f 65 6c 73 65 2f 22 20 62 6c 6f 63 6b 20 68 61  /else/" block ha
16820 73 20 74 68 65 20 73 61 6d 65 20 73 74 72 75 63  s the same struc
16830 74 75 72 65 20 61 73 0a 20 20 2a 2a 20 74 68 65  ture as.  ** the
16840 20 6f 6e 65 20 62 65 6c 6f 77 2e 20 49 74 20 69   one below. It i
16850 73 20 72 65 70 6c 69 63 61 74 65 64 20 68 65 72  s replicated her
16860 65 20 73 6f 6c 65 6c 79 20 74 6f 20 61 76 6f 69  e solely to avoi
16870 64 20 63 6c 75 74 74 65 72 69 6e 67 20 0a 20 20  d cluttering .  
16880 2a 2a 20 75 70 20 74 68 65 20 72 65 61 6c 20 63  ** up the real c
16890 6f 64 65 20 77 69 74 68 20 74 68 65 20 55 4e 55  ode with the UNU
168a0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 29 20  SED_PARAMETER() 
168b0 6d 61 63 72 6f 73 2e 0a 20 20 2a 2f 0a 23 69 66  macros..  */.#if
168c0 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59  def SQLITE_NO_SY
168d0 4e 43 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  NC.  UNUSED_PARA
168e0 4d 45 54 45 52 28 66 64 29 3b 0a 20 20 55 4e 55  METER(fd);.  UNU
168f0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 66 75  SED_PARAMETER(fu
16900 6c 6c 53 79 6e 63 29 3b 0a 20 20 55 4e 55 53 45  llSync);.  UNUSE
16910 44 5f 50 41 52 41 4d 45 54 45 52 28 64 61 74 61  D_PARAMETER(data
16920 4f 6e 6c 79 29 3b 0a 23 65 6c 69 66 20 48 41 56  Only);.#elif HAV
16930 45 5f 46 55 4c 4c 46 53 59 4e 43 0a 20 20 55 4e  E_FULLFSYNC.  UN
16940 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64  USED_PARAMETER(d
16950 61 74 61 4f 6e 6c 79 29 3b 0a 23 65 6c 73 65 0a  ataOnly);.#else.
16960 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
16970 45 52 28 66 75 6c 6c 53 79 6e 63 29 3b 0a 20 20  ER(fullSync);.  
16980 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
16990 28 64 61 74 61 4f 6e 6c 79 29 3b 0a 23 65 6e 64  (dataOnly);.#end
169a0 69 66 0a 0a 20 20 2f 2a 20 52 65 63 6f 72 64 20  if..  /* Record 
169b0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 69  the number of ti
169c0 6d 65 73 20 74 68 61 74 20 77 65 20 64 6f 20 61  mes that we do a
169d0 20 6e 6f 72 6d 61 6c 20 66 73 79 6e 63 28 29 20   normal fsync() 
169e0 61 6e 64 20 0a 20 20 2a 2a 20 46 55 4c 4c 53 59  and .  ** FULLSY
169f0 4e 43 2e 20 20 54 68 69 73 20 69 73 20 75 73 65  NC.  This is use
16a00 64 20 64 75 72 69 6e 67 20 74 65 73 74 69 6e 67  d during testing
16a10 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20   to verify that 
16a20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 0a 20  this procedure. 
16a30 20 2a 2a 20 67 65 74 73 20 63 61 6c 6c 65 64 20   ** gets called 
16a40 77 69 74 68 20 74 68 65 20 63 6f 72 72 65 63 74  with the correct
16a50 20 61 72 67 75 6d 65 6e 74 73 2e 0a 20 20 2a 2f   arguments..  */
16a60 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
16a70 45 53 54 0a 20 20 69 66 28 20 66 75 6c 6c 53 79  EST.  if( fullSy
16a80 6e 63 20 29 20 73 71 6c 69 74 65 33 5f 66 75 6c  nc ) sqlite3_ful
16a90 6c 73 79 6e 63 5f 63 6f 75 6e 74 2b 2b 3b 0a 20  lsync_count++;. 
16aa0 20 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f   sqlite3_sync_co
16ab0 75 6e 74 2b 2b 3b 0a 23 65 6e 64 69 66 0a 0a 20  unt++;.#endif.. 
16ac0 20 2f 2a 20 49 66 20 77 65 20 63 6f 6d 70 69 6c   /* If we compil
16ad0 65 64 20 77 69 74 68 20 74 68 65 20 53 51 4c 49  ed with the SQLI
16ae0 54 45 5f 4e 4f 5f 53 59 4e 43 20 66 6c 61 67 2c  TE_NO_SYNC flag,
16af0 20 74 68 65 6e 20 73 79 6e 63 69 6e 67 20 69 73   then syncing is
16b00 20 61 0a 20 20 2a 2a 20 6e 6f 2d 6f 70 0a 20 20   a.  ** no-op.  
16b10 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
16b20 5f 4e 4f 5f 53 59 4e 43 0a 20 20 72 63 20 3d 20  _NO_SYNC.  rc = 
16b30 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6c 69 66  SQLITE_OK;.#elif
16b40 20 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 0a   HAVE_FULLFSYNC.
16b50 20 20 69 66 28 20 66 75 6c 6c 53 79 6e 63 20 29    if( fullSync )
16b60 7b 0a 20 20 20 20 72 63 20 3d 20 66 63 6e 74 6c  {.    rc = fcntl
16b70 28 66 64 2c 20 46 5f 46 55 4c 4c 46 53 59 4e 43  (fd, F_FULLFSYNC
16b80 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  , 0);.  }else{. 
16b90 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 7d 0a 20     rc = 1;.  }. 
16ba0 20 2f 2a 20 49 66 20 74 68 65 20 46 55 4c 4c 46   /* If the FULLF
16bb0 53 59 4e 43 20 66 61 69 6c 65 64 2c 20 66 61 6c  SYNC failed, fal
16bc0 6c 20 62 61 63 6b 20 74 6f 20 61 74 74 65 6d 70  l back to attemp
16bd0 74 69 6e 67 20 61 6e 20 66 73 79 6e 63 28 29 2e  ting an fsync().
16be0 0a 20 20 2a 2a 20 49 74 20 73 68 6f 75 6c 64 6e  .  ** It shouldn
16bf0 27 74 20 62 65 20 70 6f 73 73 69 62 6c 65 20 66  't be possible f
16c00 6f 72 20 66 75 6c 6c 66 73 79 6e 63 20 74 6f 20  or fullfsync to 
16c10 66 61 69 6c 20 6f 6e 20 74 68 65 20 6c 6f 63 61  fail on the loca
16c20 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20 73 79 73  l .  ** file sys
16c30 74 65 6d 20 28 6f 6e 20 4f 53 58 29 2c 20 73 6f  tem (on OSX), so
16c40 20 66 61 69 6c 75 72 65 20 69 6e 64 69 63 61 74   failure indicat
16c50 65 73 20 74 68 61 74 20 46 55 4c 4c 46 53 59 4e  es that FULLFSYN
16c60 43 0a 20 20 2a 2a 20 69 73 6e 27 74 20 73 75 70  C.  ** isn't sup
16c70 70 6f 72 74 65 64 20 66 6f 72 20 74 68 69 73 20  ported for this 
16c80 66 69 6c 65 20 73 79 73 74 65 6d 2e 20 53 6f 2c  file system. So,
16c90 20 61 74 74 65 6d 70 74 20 61 6e 20 66 73 79 6e   attempt an fsyn
16ca0 63 20 0a 20 20 2a 2a 20 61 6e 64 20 28 66 6f 72  c .  ** and (for
16cb0 20 6e 6f 77 29 20 69 67 6e 6f 72 65 20 74 68 65   now) ignore the
16cc0 20 6f 76 65 72 68 65 61 64 20 6f 66 20 61 20 73   overhead of a s
16cd0 75 70 65 72 66 6c 75 6f 75 73 20 66 63 6e 74 6c  uperfluous fcntl
16ce0 20 63 61 6c 6c 2e 20 20 0a 20 20 2a 2a 20 49 74   call.  .  ** It
16cf0 27 64 20 62 65 20 62 65 74 74 65 72 20 74 6f 20  'd be better to 
16d00 64 65 74 65 63 74 20 66 75 6c 6c 66 73 79 6e 63  detect fullfsync
16d10 20 73 75 70 70 6f 72 74 20 6f 6e 63 65 20 61 6e   support once an
16d20 64 20 61 76 6f 69 64 20 0a 20 20 2a 2a 20 74 68  d avoid .  ** th
16d30 65 20 66 63 6e 74 6c 20 63 61 6c 6c 20 65 76 65  e fcntl call eve
16d40 72 79 20 74 69 6d 65 20 73 79 6e 63 20 69 73 20  ry time sync is 
16d50 63 61 6c 6c 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  called..  */.  i
16d60 66 28 20 72 63 20 29 20 72 63 20 3d 20 66 73 79  f( rc ) rc = fsy
16d70 6e 63 28 66 64 29 3b 0a 0a 23 65 6c 69 66 20 64  nc(fd);..#elif d
16d80 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
16d90 29 0a 20 20 2f 2a 20 66 64 61 74 61 73 79 6e 63  ).  /* fdatasync
16da0 28 29 20 6f 6e 20 48 46 53 2b 20 64 6f 65 73 6e  () on HFS+ doesn
16db0 27 74 20 79 65 74 20 66 6c 75 73 68 20 74 68 65  't yet flush the
16dc0 20 66 69 6c 65 20 73 69 7a 65 20 69 66 20 69 74   file size if it
16dd0 20 63 68 61 6e 67 65 64 20 63 6f 72 72 65 63 74   changed correct
16de0 6c 79 0a 20 20 2a 2a 20 73 6f 20 63 75 72 72 65  ly.  ** so curre
16df0 6e 74 6c 79 20 77 65 20 64 65 66 61 75 6c 74 20  ntly we default 
16e00 74 6f 20 74 68 65 20 6d 61 63 72 6f 20 74 68 61  to the macro tha
16e10 74 20 72 65 64 65 66 69 6e 65 73 20 66 64 61 74  t redefines fdat
16e20 61 73 79 6e 63 20 74 6f 20 66 73 79 6e 63 0a 20  async to fsync. 
16e30 20 2a 2f 0a 20 20 72 63 20 3d 20 66 73 79 6e 63   */.  rc = fsync
16e40 28 66 64 29 3b 0a 23 65 6c 73 65 20 0a 20 20 72  (fd);.#else .  r
16e50 63 20 3d 20 66 64 61 74 61 73 79 6e 63 28 66 64  c = fdatasync(fd
16e60 29 3b 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b  );.#if OS_VXWORK
16e70 53 0a 20 20 69 66 28 20 72 63 3d 3d 2d 31 20 26  S.  if( rc==-1 &
16e80 26 20 65 72 72 6e 6f 3d 3d 45 4e 4f 54 53 55 50  & errno==ENOTSUP
16e90 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 73 79   ){.    rc = fsy
16ea0 6e 63 28 66 64 29 3b 0a 20 20 7d 0a 23 65 6e 64  nc(fd);.  }.#end
16eb0 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f 52 4b 53  if /* OS_VXWORKS
16ec0 20 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 69 66   */.#endif /* if
16ed0 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 5f 53 59  def SQLITE_NO_SY
16ee0 4e 43 20 65 6c 69 66 20 48 41 56 45 5f 46 55 4c  NC elif HAVE_FUL
16ef0 4c 46 53 59 4e 43 20 2a 2f 0a 0a 20 20 69 66 28  LFSYNC */..  if(
16f00 20 4f 53 5f 56 58 57 4f 52 4b 53 20 26 26 20 72   OS_VXWORKS && r
16f10 63 21 3d 20 2d 31 20 29 7b 0a 20 20 20 20 72 63  c!= -1 ){.    rc
16f20 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
16f30 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
16f40 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 77 72  Make sure all wr
16f50 69 74 65 73 20 74 6f 20 61 20 70 61 72 74 69 63  ites to a partic
16f60 75 6c 61 72 20 66 69 6c 65 20 61 72 65 20 63 6f  ular file are co
16f70 6d 6d 69 74 74 65 64 20 74 6f 20 64 69 73 6b 2e  mmitted to disk.
16f80 0a 2a 2a 0a 2a 2a 20 49 66 20 64 61 74 61 4f 6e  .**.** If dataOn
16f90 6c 79 3d 3d 30 20 74 68 65 6e 20 62 6f 74 68 20  ly==0 then both 
16fa0 74 68 65 20 66 69 6c 65 20 69 74 73 65 6c 66 20  the file itself 
16fb0 61 6e 64 20 69 74 73 20 6d 65 74 61 64 61 74 61  and its metadata
16fc0 20 28 66 69 6c 65 0a 2a 2a 20 73 69 7a 65 2c 20   (file.** size, 
16fd0 61 63 63 65 73 73 20 74 69 6d 65 2c 20 65 74 63  access time, etc
16fe0 29 20 61 72 65 20 73 79 6e 63 65 64 2e 20 20 49  ) are synced.  I
16ff0 66 20 64 61 74 61 4f 6e 6c 79 21 3d 30 20 74 68  f dataOnly!=0 th
17000 65 6e 20 6f 6e 6c 79 20 74 68 65 0a 2a 2a 20 66  en only the.** f
17010 69 6c 65 20 64 61 74 61 20 69 73 20 73 79 6e 63  ile data is sync
17020 65 64 2e 0a 2a 2a 0a 2a 2a 20 55 6e 64 65 72 20  ed..**.** Under 
17030 55 6e 69 78 2c 20 61 6c 73 6f 20 6d 61 6b 65 20  Unix, also make 
17040 73 75 72 65 20 74 68 61 74 20 74 68 65 20 64 69  sure that the di
17050 72 65 63 74 6f 72 79 20 65 6e 74 72 79 20 66 6f  rectory entry fo
17060 72 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 68 61  r the file.** ha
17070 73 20 62 65 65 6e 20 63 72 65 61 74 65 64 20 62  s been created b
17080 79 20 66 73 79 6e 63 2d 69 6e 67 20 74 68 65 20  y fsync-ing the 
17090 64 69 72 65 63 74 6f 72 79 20 74 68 61 74 20 63  directory that c
170a0 6f 6e 74 61 69 6e 73 20 74 68 65 20 66 69 6c 65  ontains the file
170b0 2e 0a 2a 2a 20 49 66 20 77 65 20 64 6f 20 6e 6f  ..** If we do no
170c0 74 20 64 6f 20 74 68 69 73 20 61 6e 64 20 77 65  t do this and we
170d0 20 65 6e 63 6f 75 6e 74 65 72 20 61 20 70 6f 77   encounter a pow
170e0 65 72 20 66 61 69 6c 75 72 65 2c 20 74 68 65 20  er failure, the 
170f0 64 69 72 65 63 74 6f 72 79 0a 2a 2a 20 65 6e 74  directory.** ent
17100 72 79 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e  ry for the journ
17110 61 6c 20 6d 69 67 68 74 20 6e 6f 74 20 65 78 69  al might not exi
17120 73 74 20 61 66 74 65 72 20 77 65 20 72 65 62 6f  st after we rebo
17130 6f 74 2e 20 20 54 68 65 20 6e 65 78 74 0a 2a 2a  ot.  The next.**
17140 20 53 51 4c 69 74 65 20 74 6f 20 61 63 63 65 73   SQLite to acces
17150 73 20 74 68 65 20 66 69 6c 65 20 77 69 6c 6c 20  s the file will 
17160 6e 6f 74 20 6b 6e 6f 77 20 74 68 61 74 20 74 68  not know that th
17170 65 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73  e journal exists
17180 20 28 62 65 63 61 75 73 65 0a 2a 2a 20 74 68 65   (because.** the
17190 20 64 69 72 65 63 74 6f 72 79 20 65 6e 74 72 79   directory entry
171a0 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c   for the journal
171b0 20 77 61 73 20 6e 65 76 65 72 20 63 72 65 61 74   was never creat
171c0 65 64 29 20 61 6e 64 20 74 68 65 20 74 72 61 6e  ed) and the tran
171d0 73 61 63 74 69 6f 6e 0a 2a 2a 20 77 69 6c 6c 20  saction.** will 
171e0 6e 6f 74 20 72 6f 6c 6c 20 62 61 63 6b 20 2d 20  not roll back - 
171f0 70 6f 73 73 69 62 6c 79 20 6c 65 61 64 69 6e 67  possibly leading
17200 20 74 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72   to database cor
17210 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  ruption..*/.stat
17220 69 63 20 69 6e 74 20 75 6e 69 78 53 79 6e 63 28  ic int unixSync(
17230 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
17240 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
17250 69 6e 74 20 72 63 3b 0a 20 20 75 6e 69 78 46 69  int rc;.  unixFi
17260 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
17270 78 46 69 6c 65 2a 29 69 64 3b 0a 0a 20 20 69 6e  xFile*)id;..  in
17280 74 20 69 73 44 61 74 61 4f 6e 6c 79 20 3d 20 28  t isDataOnly = (
17290 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 53 59 4e  flags&SQLITE_SYN
172a0 43 5f 44 41 54 41 4f 4e 4c 59 29 3b 0a 20 20 69  C_DATAONLY);.  i
172b0 6e 74 20 69 73 46 75 6c 6c 73 79 6e 63 20 3d 20  nt isFullsync = 
172c0 28 66 6c 61 67 73 26 30 78 30 46 29 3d 3d 53 51  (flags&0x0F)==SQ
172d0 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c 3b 0a  LITE_SYNC_FULL;.
172e0 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74  .  /* Check that
172f0 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 53   one of SQLITE_S
17300 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 46 55  YNC_NORMAL or FU
17310 4c 4c 20 77 61 73 20 70 61 73 73 65 64 20 2a 2f  LL was passed */
17320 0a 20 20 61 73 73 65 72 74 28 28 66 6c 61 67 73  .  assert((flags
17330 26 30 78 30 46 29 3d 3d 53 51 4c 49 54 45 5f 53  &0x0F)==SQLITE_S
17340 59 4e 43 5f 4e 4f 52 4d 41 4c 0a 20 20 20 20 20  YNC_NORMAL.     
17350 20 7c 7c 20 28 66 6c 61 67 73 26 30 78 30 46 29   || (flags&0x0F)
17360 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55  ==SQLITE_SYNC_FU
17370 4c 4c 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 55 6e  LL.  );..  /* Un
17380 69 78 20 63 61 6e 6e 6f 74 2c 20 62 75 74 20 73  ix cannot, but s
17390 6f 6d 65 20 73 79 73 74 65 6d 73 20 6d 61 79 20  ome systems may 
173a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55  return SQLITE_FU
173b0 4c 4c 20 66 72 6f 6d 20 68 65 72 65 2e 20 54 68  LL from here. Th
173c0 69 73 0a 20 20 2a 2a 20 6c 69 6e 65 20 69 73 20  is.  ** line is 
173d0 74 6f 20 74 65 73 74 20 74 68 61 74 20 64 6f 69  to test that doi
173e0 6e 67 20 73 6f 20 64 6f 65 73 20 6e 6f 74 20 63  ng so does not c
173f0 61 75 73 65 20 61 6e 79 20 70 72 6f 62 6c 65 6d  ause any problem
17400 73 2e 0a 20 20 2a 2f 0a 20 20 53 69 6d 75 6c 61  s..  */.  Simula
17410 74 65 44 69 73 6b 66 75 6c 6c 45 72 72 6f 72 28  teDiskfullError(
17420 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46   return SQLITE_F
17430 55 4c 4c 20 29 3b 0a 0a 20 20 61 73 73 65 72 74  ULL );..  assert
17440 28 20 70 46 69 6c 65 20 29 3b 0a 20 20 4f 53 54  ( pFile );.  OST
17450 52 41 43 45 28 28 22 53 59 4e 43 20 20 20 20 25  RACE(("SYNC    %
17460 2d 33 64 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 68  -3d\n", pFile->h
17470 29 29 3b 0a 20 20 72 63 20 3d 20 66 75 6c 6c 5f  ));.  rc = full_
17480 66 73 79 6e 63 28 70 46 69 6c 65 2d 3e 68 2c 20  fsync(pFile->h, 
17490 69 73 46 75 6c 6c 73 79 6e 63 2c 20 69 73 44 61  isFullsync, isDa
174a0 74 61 4f 6e 6c 79 29 3b 0a 20 20 53 69 6d 75 6c  taOnly);.  Simul
174b0 61 74 65 49 4f 45 72 72 6f 72 28 20 72 63 3d 31  ateIOError( rc=1
174c0 20 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a   );.  if( rc ){.
174d0 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74 45      pFile->lastE
174e0 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  rrno = errno;.  
174f0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
17500 49 4f 45 52 52 5f 46 53 59 4e 43 3b 0a 20 20 7d  IOERR_FSYNC;.  }
17510 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 64 69  .  if( pFile->di
17520 72 66 64 3e 3d 30 20 29 7b 0a 20 20 20 20 69 6e  rfd>=0 ){.    in
17530 74 20 65 72 72 3b 0a 20 20 20 20 4f 53 54 52 41  t err;.    OSTRA
17540 43 45 28 28 22 44 49 52 53 59 4e 43 20 25 2d 33  CE(("DIRSYNC %-3
17550 64 20 28 68 61 76 65 5f 66 75 6c 6c 66 73 79 6e  d (have_fullfsyn
17560 63 3d 25 64 20 66 75 6c 6c 73 79 6e 63 3d 25 64  c=%d fullsync=%d
17570 29 5c 6e 22 2c 20 70 46 69 6c 65 2d 3e 64 69 72  )\n", pFile->dir
17580 66 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  fd,.            
17590 48 41 56 45 5f 46 55 4c 4c 46 53 59 4e 43 2c 20  HAVE_FULLFSYNC, 
175a0 69 73 46 75 6c 6c 73 79 6e 63 29 29 3b 0a 23 69  isFullsync));.#i
175b0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 44 49 53  fndef SQLITE_DIS
175c0 41 42 4c 45 5f 44 49 52 53 59 4e 43 0a 20 20 20  ABLE_DIRSYNC.   
175d0 20 2f 2a 20 54 68 65 20 64 69 72 65 63 74 6f 72   /* The director
175e0 79 20 73 79 6e 63 20 69 73 20 6f 6e 6c 79 20 61  y sync is only a
175f0 74 74 65 6d 70 74 65 64 20 69 66 20 66 75 6c 6c  ttempted if full
17600 5f 66 73 79 6e 63 20 69 73 0a 20 20 20 20 2a 2a  _fsync is.    **
17610 20 74 75 72 6e 65 64 20 6f 66 66 20 6f 72 20 75   turned off or u
17620 6e 61 76 61 69 6c 61 62 6c 65 2e 20 20 49 66 20  navailable.  If 
17630 61 20 66 75 6c 6c 5f 66 73 79 6e 63 20 6f 63 63  a full_fsync occ
17640 75 72 72 65 64 20 61 62 6f 76 65 2c 0a 20 20 20  urred above,.   
17650 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 64 69 72   ** then the dir
17660 65 63 74 6f 72 79 20 73 79 6e 63 20 69 73 20 73  ectory sync is s
17670 75 70 65 72 66 6c 75 6f 75 73 2e 0a 20 20 20 20  uperfluous..    
17680 2a 2f 0a 20 20 20 20 69 66 28 20 28 21 48 41 56  */.    if( (!HAV
17690 45 5f 46 55 4c 4c 46 53 59 4e 43 20 7c 7c 20 21  E_FULLFSYNC || !
176a0 69 73 46 75 6c 6c 73 79 6e 63 29 20 26 26 20 66  isFullsync) && f
176b0 75 6c 6c 5f 66 73 79 6e 63 28 70 46 69 6c 65 2d  ull_fsync(pFile-
176c0 3e 64 69 72 66 64 2c 30 2c 30 29 20 29 7b 0a 20  >dirfd,0,0) ){. 
176d0 20 20 20 20 20 20 2f 2a 0a 20 20 20 20 20 20 20        /*.       
176e0 2a 2a 20 57 65 20 68 61 76 65 20 72 65 63 65 69  ** We have recei
176f0 76 65 64 20 6d 75 6c 74 69 70 6c 65 20 72 65 70  ved multiple rep
17700 6f 72 74 73 20 6f 66 20 66 73 79 6e 63 28 29 20  orts of fsync() 
17710 72 65 74 75 72 6e 69 6e 67 0a 20 20 20 20 20 20  returning.      
17720 20 2a 2a 20 65 72 72 6f 72 73 20 77 68 65 6e 20   ** errors when 
17730 61 70 70 6c 69 65 64 20 74 6f 20 64 69 72 65 63  applied to direc
17740 74 6f 72 69 65 73 20 6f 6e 20 63 65 72 74 61 69  tories on certai
17750 6e 20 66 69 6c 65 20 73 79 73 74 65 6d 73 2e 0a  n file systems..
17760 20 20 20 20 20 20 20 2a 2a 20 41 20 66 61 69 6c         ** A fail
17770 65 64 20 64 69 72 65 63 74 6f 72 79 20 73 79 6e  ed directory syn
17780 63 20 69 73 20 6e 6f 74 20 61 20 62 69 67 20 64  c is not a big d
17790 65 61 6c 2e 20 20 53 6f 20 69 74 20 73 65 65 6d  eal.  So it seem
177a0 73 0a 20 20 20 20 20 20 20 2a 2a 20 62 65 74 74  s.       ** bett
177b0 65 72 20 74 6f 20 69 67 6e 6f 72 65 20 74 68 65  er to ignore the
177c0 20 65 72 72 6f 72 2e 20 20 54 69 63 6b 65 74 20   error.  Ticket 
177d0 23 31 36 35 37 0a 20 20 20 20 20 20 20 2a 2f 0a  #1657.       */.
177e0 20 20 20 20 20 20 20 2f 2a 20 70 46 69 6c 65 2d         /* pFile-
177f0 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72  >lastErrno = err
17800 6e 6f 3b 20 2a 2f 0a 20 20 20 20 20 20 20 2f 2a  no; */.       /*
17810 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
17820 4f 45 52 52 3b 20 2a 2f 0a 20 20 20 20 7d 0a 23  OERR; */.    }.#
17830 65 6e 64 69 66 0a 20 20 20 20 65 72 72 20 3d 20  endif.    err = 
17840 63 6c 6f 73 65 28 70 46 69 6c 65 2d 3e 64 69 72  close(pFile->dir
17850 66 64 29 3b 20 2f 2a 20 4f 6e 6c 79 20 6e 65 65  fd); /* Only nee
17860 64 20 74 6f 20 73 79 6e 63 20 6f 6e 63 65 2c 20  d to sync once, 
17870 73 6f 20 63 6c 6f 73 65 20 74 68 65 20 2a 2f 0a  so close the */.
17880 20 20 20 20 69 66 28 20 65 72 72 3d 3d 30 20 29      if( err==0 )
17890 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  {              /
178a0 2a 20 64 69 72 65 63 74 6f 72 79 20 77 68 65 6e  * directory when
178b0 20 77 65 20 61 72 65 20 64 6f 6e 65 20 2a 2f 0a   we are done */.
178c0 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 64 69 72        pFile->dir
178d0 66 64 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 65 6c  fd = -1;.    }el
178e0 73 65 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d  se{.      pFile-
178f0 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72 72  >lastErrno = err
17900 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  no;.      rc = S
17910 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f  QLITE_IOERR_DIR_
17920 43 4c 4f 53 45 3b 0a 20 20 20 20 7d 0a 20 20 7d  CLOSE;.    }.  }
17930 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
17940 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20  ./*.** Truncate 
17950 61 6e 20 6f 70 65 6e 20 66 69 6c 65 20 74 6f 20  an open file to 
17960 61 20 73 70 65 63 69 66 69 65 64 20 73 69 7a 65  a specified size
17970 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
17980 6e 69 78 54 72 75 6e 63 61 74 65 28 73 71 6c 69  nixTruncate(sqli
17990 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69 36  te3_file *id, i6
179a0 34 20 6e 42 79 74 65 29 7b 0a 20 20 69 6e 74 20  4 nByte){.  int 
179b0 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64  rc;.  assert( id
179c0 20 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f   );.  SimulateIO
179d0 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53 51  Error( return SQ
179e0 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43  LITE_IOERR_TRUNC
179f0 41 54 45 20 29 3b 0a 20 20 72 63 20 3d 20 66 74  ATE );.  rc = ft
17a00 72 75 6e 63 61 74 65 28 28 28 75 6e 69 78 46 69  runcate(((unixFi
17a10 6c 65 2a 29 69 64 29 2d 3e 68 2c 20 28 6f 66 66  le*)id)->h, (off
17a20 5f 74 29 6e 42 79 74 65 29 3b 0a 20 20 69 66 28  _t)nByte);.  if(
17a30 20 72 63 20 29 7b 0a 20 20 20 20 28 28 75 6e 69   rc ){.    ((uni
17a40 78 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74  xFile*)id)->last
17a50 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
17a60 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
17a70 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 3b  _IOERR_TRUNCATE;
17a80 0a 20 20 7d 65 6c 73 65 7b 0a 23 69 66 6e 64 65  .  }else{.#ifnde
17a90 66 20 4e 44 45 42 55 47 0a 20 20 20 20 2f 2a 20  f NDEBUG.    /* 
17aa0 49 66 20 77 65 20 61 72 65 20 64 6f 69 6e 67 20  If we are doing 
17ab0 61 20 6e 6f 72 6d 61 6c 20 77 72 69 74 65 20 74  a normal write t
17ac0 6f 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c  o a database fil
17ad0 65 20 28 61 73 20 6f 70 70 6f 73 65 64 20 74 6f  e (as opposed to
17ae0 0a 20 20 20 20 2a 2a 20 64 6f 69 6e 67 20 61 20  .    ** doing a 
17af0 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  hot-journal roll
17b00 62 61 63 6b 20 6f 72 20 61 20 77 72 69 74 65 20  back or a write 
17b10 74 6f 20 73 6f 6d 65 20 66 69 6c 65 20 6f 74 68  to some file oth
17b20 65 72 20 74 68 61 6e 20 61 0a 20 20 20 20 2a 2a  er than a.    **
17b30 20 6e 6f 72 6d 61 6c 20 64 61 74 61 62 61 73 65   normal database
17b40 20 66 69 6c 65 29 20 61 6e 64 20 77 65 20 74 72   file) and we tr
17b50 75 6e 63 61 74 65 20 74 68 65 20 66 69 6c 65 20  uncate the file 
17b60 74 6f 20 7a 65 72 6f 20 6c 65 6e 67 74 68 2c 0a  to zero length,.
17b70 20 20 20 20 2a 2a 20 74 68 61 74 20 65 66 66 65      ** that effe
17b80 63 74 69 76 65 6c 79 20 75 70 64 61 74 65 73 20  ctively updates 
17b90 74 68 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74  the change count
17ba0 65 72 2e 20 20 54 68 69 73 20 6d 69 67 68 74 20  er.  This might 
17bb0 68 61 70 70 65 6e 0a 20 20 20 20 2a 2a 20 77 68  happen.    ** wh
17bc0 65 6e 20 72 65 73 74 6f 72 69 6e 67 20 61 20 64  en restoring a d
17bd0 61 74 61 62 61 73 65 20 75 73 69 6e 67 20 74 68  atabase using th
17be0 65 20 62 61 63 6b 75 70 20 41 50 49 20 66 72 6f  e backup API fro
17bf0 6d 20 61 20 7a 65 72 6f 2d 6c 65 6e 67 74 68 0a  m a zero-length.
17c00 20 20 20 20 2a 2a 20 73 6f 75 72 63 65 2e 0a 20      ** source.. 
17c10 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 28     */.    if( ((
17c20 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 69  unixFile*)id)->i
17c30 6e 4e 6f 72 6d 61 6c 57 72 69 74 65 20 26 26 20  nNormalWrite && 
17c40 6e 42 79 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20  nByte==0 ){.    
17c50 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64    ((unixFile*)id
17c60 29 2d 3e 74 72 61 6e 73 43 6e 74 72 43 68 6e 67  )->transCntrChng
17c70 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64   = 1;.    }.#end
17c80 69 66 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 53  if..    return S
17c90 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a  QLITE_OK;.  }.}.
17ca0 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65  ./*.** Determine
17cb0 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a   the current siz
17cc0 65 20 6f 66 20 61 20 66 69 6c 65 20 69 6e 20 62  e of a file in b
17cd0 79 74 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ytes.*/.static i
17ce0 6e 74 20 75 6e 69 78 46 69 6c 65 53 69 7a 65 28  nt unixFileSize(
17cf0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
17d00 2c 20 69 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20  , i64 *pSize){. 
17d10 20 69 6e 74 20 72 63 3b 0a 20 20 73 74 72 75 63   int rc;.  struc
17d20 74 20 73 74 61 74 20 62 75 66 3b 0a 20 20 61 73  t stat buf;.  as
17d30 73 65 72 74 28 20 69 64 20 29 3b 0a 20 20 72 63  sert( id );.  rc
17d40 20 3d 20 66 73 74 61 74 28 28 28 75 6e 69 78 46   = fstat(((unixF
17d50 69 6c 65 2a 29 69 64 29 2d 3e 68 2c 20 26 62 75  ile*)id)->h, &bu
17d60 66 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f  f);.  SimulateIO
17d70 45 72 72 6f 72 28 20 72 63 3d 31 20 29 3b 0a 20  Error( rc=1 );. 
17d80 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20   if( rc!=0 ){.  
17d90 20 20 28 28 75 6e 69 78 46 69 6c 65 2a 29 69 64    ((unixFile*)id
17da0 29 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65  )->lastErrno = e
17db0 72 72 6e 6f 3b 0a 20 20 20 20 72 65 74 75 72 6e  rrno;.    return
17dc0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53   SQLITE_IOERR_FS
17dd0 54 41 54 3b 0a 20 20 7d 0a 20 20 2a 70 53 69 7a  TAT;.  }.  *pSiz
17de0 65 20 3d 20 62 75 66 2e 73 74 5f 73 69 7a 65 3b  e = buf.st_size;
17df0 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 6f 70 65 6e  ..  /* When open
17e00 69 6e 67 20 61 20 7a 65 72 6f 2d 73 69 7a 65 20  ing a zero-size 
17e10 64 61 74 61 62 61 73 65 2c 20 74 68 65 20 66 69  database, the fi
17e20 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29 20 70 72  ndInodeInfo() pr
17e30 6f 63 65 64 75 72 65 0a 20 20 2a 2a 20 77 72 69  ocedure.  ** wri
17e40 74 65 73 20 61 20 73 69 6e 67 6c 65 20 62 79 74  tes a single byt
17e50 65 20 69 6e 74 6f 20 74 68 61 74 20 66 69 6c 65  e into that file
17e60 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 77 6f 72   in order to wor
17e70 6b 20 61 72 6f 75 6e 64 20 61 20 62 75 67 0a 20  k around a bug. 
17e80 20 2a 2a 20 69 6e 20 74 68 65 20 4f 53 2d 58 20   ** in the OS-X 
17e90 6d 73 64 6f 73 20 66 69 6c 65 73 79 73 74 65 6d  msdos filesystem
17ea0 2e 20 20 49 6e 20 6f 72 64 65 72 20 74 6f 20 61  .  In order to a
17eb0 76 6f 69 64 20 70 72 6f 62 6c 65 6d 73 20 77 69  void problems wi
17ec0 74 68 20 75 70 70 65 72 0a 20 20 2a 2a 20 6c 61  th upper.  ** la
17ed0 79 65 72 73 2c 20 77 65 20 6e 65 65 64 20 74 6f  yers, we need to
17ee0 20 72 65 70 6f 72 74 20 74 68 69 73 20 66 69 6c   report this fil
17ef0 65 20 73 69 7a 65 20 61 73 20 7a 65 72 6f 20 65  e size as zero e
17f00 76 65 6e 20 74 68 6f 75 67 68 20 69 74 20 69 73  ven though it is
17f10 0a 20 20 2a 2a 20 72 65 61 6c 6c 79 20 31 2e 20  .  ** really 1. 
17f20 20 20 54 69 63 6b 65 74 20 23 33 32 36 30 2e 0a    Ticket #3260..
17f30 20 20 2a 2f 0a 20 20 69 66 28 20 2a 70 53 69 7a    */.  if( *pSiz
17f40 65 3d 3d 31 20 29 20 2a 70 53 69 7a 65 20 3d 20  e==1 ) *pSize = 
17f50 30 3b 0a 0a 0a 20 20 72 65 74 75 72 6e 20 53 51  0;...  return SQ
17f60 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20  LITE_OK;.}..#if 
17f70 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
17f80 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64  CKING_STYLE && d
17f90 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
17fa0 29 0a 2f 2a 0a 2a 2a 20 48 61 6e 64 6c 65 72 20  )./*.** Handler 
17fb0 66 6f 72 20 70 72 6f 78 79 2d 6c 6f 63 6b 69 6e  for proxy-lockin
17fc0 67 20 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 76  g file-control v
17fd0 65 72 62 73 2e 20 20 44 65 66 69 6e 65 64 20 62  erbs.  Defined b
17fe0 65 6c 6f 77 20 69 6e 20 74 68 65 0a 2a 2a 20 70  elow in the.** p
17ff0 72 6f 78 79 69 6e 67 20 6c 6f 63 6b 69 6e 67 20  roxying locking 
18000 64 69 76 69 73 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  division..*/.sta
18010 74 69 63 20 69 6e 74 20 70 72 6f 78 79 46 69 6c  tic int proxyFil
18020 65 43 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33  eControl(sqlite3
18030 5f 66 69 6c 65 2a 2c 69 6e 74 2c 76 6f 69 64 2a  _file*,int,void*
18040 29 3b 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  );.#endif.../*.*
18050 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 6e  * Information an
18060 64 20 63 6f 6e 74 72 6f 6c 20 6f 66 20 61 6e 20  d control of an 
18070 6f 70 65 6e 20 66 69 6c 65 20 68 61 6e 64 6c 65  open file handle
18080 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
18090 75 6e 69 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 28  unixFileControl(
180a0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69 64  sqlite3_file *id
180b0 2c 20 69 6e 74 20 6f 70 2c 20 76 6f 69 64 20 2a  , int op, void *
180c0 70 41 72 67 29 7b 0a 20 20 73 77 69 74 63 68 28  pArg){.  switch(
180d0 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20   op ){.    case 
180e0 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43  SQLITE_FCNTL_LOC
180f0 4b 53 54 41 54 45 3a 20 7b 0a 20 20 20 20 20 20  KSTATE: {.      
18100 2a 28 69 6e 74 2a 29 70 41 72 67 20 3d 20 28 28  *(int*)pArg = ((
18110 75 6e 69 78 46 69 6c 65 2a 29 69 64 29 2d 3e 65  unixFile*)id)->e
18120 46 69 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 20 20  FileLock;.      
18130 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
18140 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
18150 20 53 51 4c 49 54 45 5f 4c 41 53 54 5f 45 52 52   SQLITE_LAST_ERR
18160 4e 4f 3a 20 7b 0a 20 20 20 20 20 20 2a 28 69 6e  NO: {.      *(in
18170 74 2a 29 70 41 72 67 20 3d 20 28 28 75 6e 69 78  t*)pArg = ((unix
18180 46 69 6c 65 2a 29 69 64 29 2d 3e 6c 61 73 74 45  File*)id)->lastE
18190 72 72 6e 6f 3b 0a 20 20 20 20 20 20 72 65 74 75  rrno;.      retu
181a0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
181b0 20 20 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42    }.#ifndef NDEB
181c0 55 47 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61  UG.    /* The pa
181d0 67 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20 6d  ger calls this m
181e0 65 74 68 6f 64 20 74 6f 20 73 69 67 6e 61 6c 20  ethod to signal 
181f0 74 68 61 74 20 69 74 20 68 61 73 20 64 6f 6e 65  that it has done
18200 0a 20 20 20 20 2a 2a 20 61 20 72 6f 6c 6c 62 61  .    ** a rollba
18210 63 6b 20 61 6e 64 20 74 68 61 74 20 74 68 65 20  ck and that the 
18220 64 61 74 61 62 61 73 65 20 69 73 20 74 68 65 72  database is ther
18230 65 66 6f 72 65 20 75 6e 63 68 61 6e 67 65 64 20  efore unchanged 
18240 61 6e 64 0a 20 20 20 20 2a 2a 20 69 74 20 68 65  and.    ** it he
18250 6e 63 65 20 69 74 20 69 73 20 4f 4b 20 66 6f 72  nce it is OK for
18260 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
18270 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20   change counter 
18280 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20 75 6e 63  to be.    ** unc
18290 68 61 6e 67 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  hanged..    */. 
182a0 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
182b0 43 4e 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45  CNTL_DB_UNCHANGE
182c0 44 3a 20 7b 0a 20 20 20 20 20 20 28 28 75 6e 69  D: {.      ((uni
182d0 78 46 69 6c 65 2a 29 69 64 29 2d 3e 64 62 55 70  xFile*)id)->dbUp
182e0 64 61 74 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  date = 0;.      
182f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
18300 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23  ;.    }.#endif.#
18310 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  if SQLITE_ENABLE
18320 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26  _LOCKING_STYLE &
18330 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  & defined(__APPL
18340 45 5f 5f 29 0a 20 20 20 20 63 61 73 65 20 53 51  E__).    case SQ
18350 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f  LITE_SET_LOCKPRO
18360 58 59 46 49 4c 45 3a 0a 20 20 20 20 63 61 73 65  XYFILE:.    case
18370 20 53 51 4c 49 54 45 5f 47 45 54 5f 4c 4f 43 4b   SQLITE_GET_LOCK
18380 50 52 4f 58 59 46 49 4c 45 3a 20 7b 0a 20 20 20  PROXYFILE: {.   
18390 20 20 20 72 65 74 75 72 6e 20 70 72 6f 78 79 46     return proxyF
183a0 69 6c 65 43 6f 6e 74 72 6f 6c 28 69 64 2c 6f 70  ileControl(id,op
183b0 2c 70 41 72 67 29 3b 0a 20 20 20 20 7d 0a 23 65  ,pArg);.    }.#e
183c0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45  ndif /* SQLITE_E
183d0 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
183e0 59 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f  YLE && defined(_
183f0 5f 41 50 50 4c 45 5f 5f 29 20 2a 2f 0a 20 20 7d  _APPLE__) */.  }
18400 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
18410 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  _ERROR;.}../*.**
18420 20 52 65 74 75 72 6e 20 74 68 65 20 73 65 63 74   Return the sect
18430 6f 72 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73  or size in bytes
18440 20 6f 66 20 74 68 65 20 75 6e 64 65 72 6c 79 69   of the underlyi
18450 6e 67 20 62 6c 6f 63 6b 20 64 65 76 69 63 65 20  ng block device 
18460 66 6f 72 0a 2a 2a 20 74 68 65 20 73 70 65 63 69  for.** the speci
18470 66 69 65 64 20 66 69 6c 65 2e 20 54 68 69 73 20  fied file. This 
18480 69 73 20 61 6c 6d 6f 73 74 20 61 6c 77 61 79 73  is almost always
18490 20 35 31 32 20 62 79 74 65 73 2c 20 62 75 74 20   512 bytes, but 
184a0 6d 61 79 20 62 65 0a 2a 2a 20 6c 61 72 67 65 72  may be.** larger
184b0 20 66 6f 72 20 73 6f 6d 65 20 64 65 76 69 63 65   for some device
184c0 73 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20  s..**.** SQLite 
184d0 63 6f 64 65 20 61 73 73 75 6d 65 73 20 74 68 69  code assumes thi
184e0 73 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e 6e 6f  s function canno
184f0 74 20 66 61 69 6c 2e 20 49 74 20 61 6c 73 6f 20  t fail. It also 
18500 61 73 73 75 6d 65 73 20 74 68 61 74 0a 2a 2a 20  assumes that.** 
18510 69 66 20 74 77 6f 20 66 69 6c 65 73 20 61 72 65  if two files are
18520 20 63 72 65 61 74 65 64 20 69 6e 20 74 68 65 20   created in the 
18530 73 61 6d 65 20 66 69 6c 65 2d 73 79 73 74 65 6d  same file-system
18540 20 64 69 72 65 63 74 6f 72 79 20 28 69 2e 65 2e   directory (i.e.
18550 0a 2a 2a 20 61 20 64 61 74 61 62 61 73 65 20 61  .** a database a
18560 6e 64 20 69 74 73 20 6a 6f 75 72 6e 61 6c 20 66  nd its journal f
18570 69 6c 65 29 20 74 68 61 74 20 74 68 65 20 73 65  ile) that the se
18580 63 74 6f 72 20 73 69 7a 65 20 77 69 6c 6c 20 62  ctor size will b
18590 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 66 6f  e the.** same fo
185a0 72 20 62 6f 74 68 2e 0a 2a 2f 0a 73 74 61 74 69  r both..*/.stati
185b0 63 20 69 6e 74 20 75 6e 69 78 53 65 63 74 6f 72  c int unixSector
185c0 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  Size(sqlite3_fil
185d0 65 20 2a 4e 6f 74 55 73 65 64 29 7b 0a 20 20 55  e *NotUsed){.  U
185e0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
185f0 4e 6f 74 55 73 65 64 29 3b 0a 20 20 72 65 74 75  NotUsed);.  retu
18600 72 6e 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  rn SQLITE_DEFAUL
18610 54 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 7d  T_SECTOR_SIZE;.}
18620 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
18630 68 65 20 64 65 76 69 63 65 20 63 68 61 72 61 63  he device charac
18640 74 65 72 69 73 74 69 63 73 20 66 6f 72 20 74 68  teristics for th
18650 65 20 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20  e file. This is 
18660 61 6c 77 61 79 73 20 30 20 66 6f 72 20 75 6e 69  always 0 for uni
18670 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  x..*/.static int
18680 20 75 6e 69 78 44 65 76 69 63 65 43 68 61 72 61   unixDeviceChara
18690 63 74 65 72 69 73 74 69 63 73 28 73 71 6c 69 74  cteristics(sqlit
186a0 65 33 5f 66 69 6c 65 20 2a 4e 6f 74 55 73 65 64  e3_file *NotUsed
186b0 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  ){.  UNUSED_PARA
186c0 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a  METER(NotUsed);.
186d0 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 23    return 0;.}..#
186e0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
186f0 49 54 5f 57 41 4c 0a 0a 0a 2f 2a 0a 2a 2a 20 4f  IT_WAL.../*.** O
18700 62 6a 65 63 74 20 75 73 65 64 20 74 6f 20 72 65  bject used to re
18710 70 72 65 73 65 6e 74 20 61 20 73 69 6e 67 6c 65  present a single
18720 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 61 6e 64   file opened and
18730 20 6d 6d 61 70 70 65 64 20 74 6f 20 70 72 6f 76   mmapped to prov
18740 69 64 65 0a 2a 2a 20 73 68 61 72 65 64 20 6d 65  ide.** shared me
18750 6d 6f 72 79 2e 20 20 57 68 65 6e 20 6d 75 6c 74  mory.  When mult
18760 69 70 6c 65 20 74 68 72 65 61 64 73 20 61 6c 6c  iple threads all
18770 20 72 65 66 65 72 65 6e 63 65 20 74 68 65 20 73   reference the s
18780 61 6d 65 0a 2a 2a 20 6c 6f 67 2d 73 75 6d 6d 61  ame.** log-summa
18790 72 79 2c 20 65 61 63 68 20 74 68 72 65 61 64 20  ry, each thread 
187a0 68 61 73 20 69 74 73 20 6f 77 6e 20 75 6e 69 78  has its own unix
187b0 46 69 6c 65 20 6f 62 6a 65 63 74 2c 20 62 75 74  File object, but
187c0 20 74 68 65 79 20 61 6c 6c 0a 2a 2a 20 70 6f 69   they all.** poi
187d0 6e 74 20 74 6f 20 61 20 73 69 6e 67 6c 65 20 69  nt to a single i
187e0 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 69 73 20  nstance of this 
187f0 6f 62 6a 65 63 74 2e 20 20 49 6e 20 6f 74 68 65  object.  In othe
18800 72 20 77 6f 72 64 73 2c 20 65 61 63 68 0a 2a 2a  r words, each.**
18810 20 6c 6f 67 2d 73 75 6d 6d 61 72 79 20 69 73 20   log-summary is 
18820 6f 70 65 6e 65 64 20 6f 6e 6c 79 20 6f 6e 63 65  opened only once
18830 20 70 65 72 20 70 72 6f 63 65 73 73 2e 0a 2a 2a   per process..**
18840 0a 2a 2a 20 75 6e 69 78 4d 75 74 65 78 48 65 6c  .** unixMutexHel
18850 64 28 29 20 6d 75 73 74 20 62 65 20 74 72 75 65  d() must be true
18860 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67 20 6f   when creating o
18870 72 20 64 65 73 74 72 6f 79 69 6e 67 0a 2a 2a 20  r destroying.** 
18880 74 68 69 73 20 6f 62 6a 65 63 74 20 6f 72 20 77  this object or w
18890 68 69 6c 65 20 72 65 61 64 69 6e 67 20 6f 72 20  hile reading or 
188a0 77 72 69 74 69 6e 67 20 74 68 65 20 66 6f 6c 6c  writing the foll
188b0 6f 77 69 6e 67 20 66 69 65 6c 64 73 3a 0a 2a 2a  owing fields:.**
188c0 0a 2a 2a 20 20 20 20 20 20 6e 52 65 66 0a 2a 2a  .**      nRef.**
188d0 20 20 20 20 20 20 70 4e 65 78 74 20 0a 2a 2a 0a        pNext .**.
188e0 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
188f0 20 66 69 65 6c 64 73 20 61 72 65 20 72 65 61 64   fields are read
18900 2d 6f 6e 6c 79 20 61 66 74 65 72 20 74 68 65 20  -only after the 
18910 6f 62 6a 65 63 74 20 69 73 20 63 72 65 61 74 65  object is create
18920 64 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 20 20 20 66  d:.** .**      f
18930 69 64 0a 2a 2a 20 20 20 20 20 20 7a 46 69 6c 65  id.**      zFile
18940 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 45 69 74 68 65  name.**.** Eithe
18950 72 20 75 6e 69 78 53 68 6d 46 69 6c 65 2e 6d 75  r unixShmFile.mu
18960 74 65 78 20 6d 75 73 74 20 62 65 20 68 65 6c 64  tex must be held
18970 20 6f 72 20 75 6e 69 78 53 68 6d 46 69 6c 65 2e   or unixShmFile.
18980 6e 52 65 66 3d 3d 30 20 61 6e 64 0a 2a 2a 20 75  nRef==0 and.** u
18990 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20 69  nixMutexHeld() i
189a0 73 20 74 72 75 65 20 77 68 65 6e 20 72 65 61 64  s true when read
189b0 69 6e 67 20 6f 72 20 77 72 69 74 69 6e 67 20 61  ing or writing a
189c0 6e 79 20 6f 74 68 65 72 20 66 69 65 6c 64 0a 2a  ny other field.*
189d0 2a 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74  * in this struct
189e0 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 76  ure..**.** To av
189f0 6f 69 64 20 64 65 61 64 6c 6f 63 6b 73 2c 20 6d  oid deadlocks, m
18a00 75 74 65 78 20 61 6e 64 20 6d 75 74 65 78 42 75  utex and mutexBu
18a10 66 20 61 72 65 20 61 6c 77 61 79 73 20 72 65 6c  f are always rel
18a20 65 61 73 65 64 20 69 6e 20 74 68 65 0a 2a 2a 20  eased in the.** 
18a30 72 65 76 65 72 73 65 20 6f 72 64 65 72 20 74 68  reverse order th
18a40 61 74 20 74 68 65 79 20 61 72 65 20 61 63 71 75  at they are acqu
18a50 69 72 65 64 2e 20 20 6d 75 74 65 78 42 75 66 20  ired.  mutexBuf 
18a60 69 73 20 61 6c 77 61 79 73 20 61 63 71 75 69 72  is always acquir
18a70 65 64 0a 2a 2a 20 66 69 72 73 74 20 61 6e 64 20  ed.** first and 
18a80 72 65 6c 65 61 73 65 64 20 6c 61 73 74 2e 20 20  released last.  
18a90 54 68 69 73 20 69 6e 76 61 72 69 61 6e 74 20 69  This invariant i
18aa0 73 20 63 68 65 63 6b 20 62 79 20 61 73 73 65 72  s check by asser
18ab0 74 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 5f  ting.** sqlite3_
18ac0 6d 75 74 65 78 5f 6e 6f 74 68 65 6c 64 28 29 20  mutex_notheld() 
18ad0 6f 6e 20 6d 75 74 65 78 20 77 68 65 6e 65 76 65  on mutex wheneve
18ae0 72 20 6d 75 74 65 78 42 75 66 20 69 73 20 61 63  r mutexBuf is ac
18af0 71 75 69 72 65 64 20 6f 72 0a 2a 2a 20 72 65 6c  quired or.** rel
18b00 65 61 73 65 64 2e 0a 2a 2f 0a 73 74 72 75 63 74  eased..*/.struct
18b10 20 75 6e 69 78 53 68 6d 46 69 6c 65 20 7b 0a 20   unixShmFile {. 
18b20 20 73 74 72 75 63 74 20 75 6e 69 78 46 69 6c 65   struct unixFile
18b30 49 64 20 66 69 64 3b 20 20 20 20 20 2f 2a 20 55  Id fid;     /* U
18b40 6e 69 71 75 65 20 66 69 6c 65 20 69 64 65 6e 74  nique file ident
18b50 69 66 69 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74  ifier */.  sqlit
18b60 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 3b  e3_mutex *mutex;
18b70 20 20 20 20 20 20 2f 2a 20 4d 75 74 65 78 20 74        /* Mutex t
18b80 6f 20 61 63 63 65 73 73 20 74 68 69 73 20 6f 62  o access this ob
18b90 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ject */.  sqlite
18ba0 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 42 75  3_mutex *mutexBu
18bb0 66 3b 20 20 20 2f 2a 20 4d 75 74 65 78 20 74 6f  f;   /* Mutex to
18bc0 20 61 63 63 65 73 73 20 7a 42 75 66 5b 5d 20 2a   access zBuf[] *
18bd0 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  /.  char *zFilen
18be0 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ame;           /
18bf0 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6d 6d  * Name of the mm
18c00 61 70 70 65 64 20 66 69 6c 65 20 2a 2f 0a 20 20  apped file */.  
18c10 69 6e 74 20 68 3b 20 20 20 20 20 20 20 20 20 20  int h;          
18c20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70             /* Op
18c30 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  en file descript
18c40 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 4d 61  or */.  int szMa
18c50 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
18c60 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68     /* Size of th
18c70 65 20 6d 61 70 70 69 6e 67 20 6f 66 20 66 69 6c  e mapping of fil
18c80 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 2a 2f  e into memory */
18c90 0a 20 20 63 68 61 72 20 2a 70 4d 4d 61 70 42 75  .  char *pMMapBu
18ca0 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  f;            /*
18cb0 20 57 68 65 72 65 20 63 75 72 72 65 6e 74 6c 79   Where currently
18cc0 20 6d 6d 61 70 70 65 64 28 29 2e 20 20 4e 55 4c   mmapped().  NUL
18cd0 4c 20 69 66 20 75 6e 6d 61 70 70 65 64 20 2a 2f  L if unmapped */
18ce0 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20  .  int nRef;    
18cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
18d00 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e 69 78 53   Number of unixS
18d10 68 6d 20 6f 62 6a 65 63 74 73 20 70 6f 69 6e 74  hm objects point
18d20 69 6e 67 20 74 6f 20 74 68 69 73 20 2a 2f 0a 20  ing to this */. 
18d30 20 75 6e 69 78 53 68 6d 20 2a 70 46 69 72 73 74   unixShm *pFirst
18d40 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  ;           /* A
18d50 6c 6c 20 75 6e 69 78 53 68 6d 20 6f 62 6a 65 63  ll unixShm objec
18d60 74 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  ts pointing to t
18d70 68 69 73 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d  his */.  unixShm
18d80 46 69 6c 65 20 2a 70 4e 65 78 74 3b 20 20 20 20  File *pNext;    
18d90 20 20 20 20 2f 2a 20 4e 65 78 74 20 69 6e 20 6c      /* Next in l
18da0 69 73 74 20 6f 66 20 61 6c 6c 20 75 6e 69 78 53  ist of all unixS
18db0 68 6d 46 69 6c 65 20 6f 62 6a 65 63 74 73 20 2a  hmFile objects *
18dc0 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
18dd0 44 45 42 55 47 0a 20 20 75 38 20 65 78 63 6c 4d  DEBUG.  u8 exclM
18de0 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ask;            
18df0 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 65 78     /* Mask of ex
18e00 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20 68 65  clusive locks he
18e10 6c 64 20 2a 2f 0a 20 20 75 38 20 73 68 61 72 65  ld */.  u8 share
18e20 64 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20  dMask;          
18e30 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 73 68     /* Mask of sh
18e40 61 72 65 64 20 6c 6f 63 6b 73 20 68 65 6c 64 20  ared locks held 
18e50 2a 2f 0a 20 20 75 38 20 6e 65 78 74 53 68 6d 49  */.  u8 nextShmI
18e60 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
18e70 2f 2a 20 4e 65 78 74 20 61 76 61 69 6c 61 62 6c  /* Next availabl
18e80 65 20 75 6e 69 78 53 68 6d 2e 69 64 20 76 61 6c  e unixShm.id val
18e90 75 65 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a  ue */.#endif.};.
18ea0 0a 2f 2a 0a 2a 2a 20 41 20 67 6c 6f 62 61 6c 20  ./*.** A global 
18eb0 61 72 72 61 79 20 6f 66 20 61 6c 6c 20 75 6e 69  array of all uni
18ec0 78 53 68 6d 46 69 6c 65 20 6f 62 6a 65 63 74 73  xShmFile objects
18ed0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 75 6e 69 78  ..**.** The unix
18ee0 4d 75 74 65 78 48 65 6c 64 28 29 20 6d 75 73 74  MutexHeld() must
18ef0 20 62 65 20 74 72 75 65 20 77 68 69 6c 65 20 72   be true while r
18f00 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e  eading or writin
18f10 67 20 74 68 69 73 20 6c 69 73 74 2e 0a 2a 2f 0a  g this list..*/.
18f20 73 74 61 74 69 63 20 75 6e 69 78 53 68 6d 46 69  static unixShmFi
18f30 6c 65 20 2a 75 6e 69 78 53 68 6d 46 69 6c 65 4c  le *unixShmFileL
18f40 69 73 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20  ist = 0;../*.** 
18f50 53 74 72 75 63 74 75 72 65 20 75 73 65 64 20 69  Structure used i
18f60 6e 74 65 72 6e 61 6c 6c 79 20 62 79 20 74 68 69  nternally by thi
18f70 73 20 56 46 53 20 74 6f 20 72 65 63 6f 72 64 20  s VFS to record 
18f80 74 68 65 20 73 74 61 74 65 20 6f 66 20 61 6e 0a  the state of an.
18f90 2a 2a 20 6f 70 65 6e 20 73 68 61 72 65 64 20 6d  ** open shared m
18fa0 65 6d 6f 72 79 20 63 6f 6e 6e 65 63 74 69 6f 6e  emory connection
18fb0 2e 0a 2a 2a 0a 2a 2a 20 75 6e 69 78 53 68 6d 2e  ..**.** unixShm.
18fc0 70 46 69 6c 65 2d 3e 6d 75 74 65 78 20 6d 75 73  pFile->mutex mus
18fd0 74 20 62 65 20 68 65 6c 64 20 77 68 69 6c 65 20  t be held while 
18fe0 72 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69  reading or writi
18ff0 6e 67 20 74 68 65 0a 2a 2a 20 75 6e 69 78 53 68  ng the.** unixSh
19000 6d 2e 70 4e 65 78 74 20 61 6e 64 20 75 6e 69 78  m.pNext and unix
19010 53 68 6d 2e 6c 6f 63 6b 73 5b 5d 20 65 6c 65 6d  Shm.locks[] elem
19020 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ents..**.** The 
19030 75 6e 69 78 53 68 6d 2e 70 46 69 6c 65 20 65 6c  unixShm.pFile el
19040 65 6d 65 6e 74 20 69 73 20 69 6e 69 74 69 61 6c  ement is initial
19050 69 7a 65 64 20 77 68 65 6e 20 74 68 65 20 6f 62  ized when the ob
19060 6a 65 63 74 20 69 73 20 63 72 65 61 74 65 64 0a  ject is created.
19070 2a 2a 20 61 6e 64 20 69 73 20 72 65 61 64 2d 6f  ** and is read-o
19080 6e 6c 79 20 74 68 65 72 65 61 66 74 65 72 2e 0a  nly thereafter..
19090 2a 2f 0a 73 74 72 75 63 74 20 75 6e 69 78 53 68  */.struct unixSh
190a0 6d 20 7b 0a 20 20 75 6e 69 78 53 68 6d 46 69 6c  m {.  unixShmFil
190b0 65 20 2a 70 46 69 6c 65 3b 20 20 20 20 20 20 20  e *pFile;       
190c0 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69   /* The underlyi
190d0 6e 67 20 75 6e 69 78 53 68 6d 46 69 6c 65 20 6f  ng unixShmFile o
190e0 62 6a 65 63 74 20 2a 2f 0a 20 20 75 6e 69 78 53  bject */.  unixS
190f0 68 6d 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20  hm *pNext;      
19100 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 75 6e        /* Next un
19110 69 78 53 68 6d 20 77 69 74 68 20 74 68 65 20 73  ixShm with the s
19120 61 6d 65 20 75 6e 69 78 53 68 6d 46 69 6c 65 20  ame unixShmFile 
19130 2a 2f 0a 20 20 75 38 20 6c 6f 63 6b 53 74 61 74  */.  u8 lockStat
19140 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
19150 2f 2a 20 43 75 72 72 65 6e 74 20 6c 6f 63 6b 20  /* Current lock 
19160 73 74 61 74 65 20 2a 2f 0a 20 20 75 38 20 68 61  state */.  u8 ha
19170 73 4d 75 74 65 78 3b 20 20 20 20 20 20 20 20 20  sMutex;         
19180 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
19190 20 68 6f 6c 64 69 6e 67 20 74 68 65 20 75 6e 69   holding the uni
191a0 78 53 68 6d 46 69 6c 65 20 6d 75 74 65 78 20 2a  xShmFile mutex *
191b0 2f 0a 20 20 75 38 20 68 61 73 4d 75 74 65 78 42  /.  u8 hasMutexB
191c0 75 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  uf;            /
191d0 2a 20 54 72 75 65 20 69 66 20 68 6f 6c 64 69 6e  * True if holdin
191e0 67 20 70 46 69 6c 65 2d 3e 6d 75 74 65 78 42 75  g pFile->mutexBu
191f0 66 20 2a 2f 0a 20 20 75 38 20 73 68 61 72 65 64  f */.  u8 shared
19200 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20  Mask;           
19210 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 73 68 61    /* Mask of sha
19220 72 65 64 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a  red locks held *
19230 2f 0a 20 20 75 38 20 65 78 63 6c 4d 61 73 6b 3b  /.  u8 exclMask;
19240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
19250 2a 20 4d 61 73 6b 20 6f 66 20 65 78 63 6c 75 73  * Mask of exclus
19260 69 76 65 20 6c 6f 63 6b 73 20 68 65 6c 64 20 2a  ive locks held *
19270 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
19280 44 45 42 55 47 0a 20 20 75 38 20 69 64 3b 20 20  DEBUG.  u8 id;  
19290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
192a0 20 20 20 2f 2a 20 49 64 20 6f 66 20 74 68 69 73     /* Id of this
192b0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68   connection with
192c0 20 69 74 73 20 75 6e 69 78 53 68 6d 46 69 6c 65   its unixShmFile
192d0 20 2a 2f 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f   */.#endif.};../
192e0 2a 0a 2a 2a 20 53 69 7a 65 20 69 6e 63 72 65 6d  *.** Size increm
192f0 65 6e 74 20 62 79 20 77 68 69 63 68 20 73 68 61  ent by which sha
19300 72 65 64 20 6d 65 6d 6f 72 79 20 67 72 6f 77 73  red memory grows
19310 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 51 4c 49  .*/.#define SQLI
19320 54 45 5f 55 4e 49 58 5f 53 48 4d 5f 49 4e 43 52  TE_UNIX_SHM_INCR
19330 20 20 34 30 39 36 0a 0a 2f 2a 0a 2a 2a 20 43 6f    4096../*.** Co
19340 6e 73 74 61 6e 74 73 20 75 73 65 64 20 66 6f 72  nstants used for
19350 20 6c 6f 63 6b 69 6e 67 0a 2a 2f 0a 23 64 65 66   locking.*/.#def
19360 69 6e 65 20 55 4e 49 58 5f 53 48 4d 5f 42 41 53  ine UNIX_SHM_BAS
19370 45 20 20 20 20 20 20 33 32 20 20 20 20 20 20 20  E      32       
19380 20 2f 2a 20 42 79 74 65 20 6f 66 66 73 65 74 20   /* Byte offset 
19390 6f 66 20 74 68 65 20 66 69 72 73 74 20 6c 6f 63  of the first loc
193a0 6b 20 62 79 74 65 20 2a 2f 0a 23 64 65 66 69 6e  k byte */.#defin
193b0 65 20 55 4e 49 58 5f 53 48 4d 5f 44 4d 53 20 20  e UNIX_SHM_DMS  
193c0 20 20 20 20 20 30 78 30 31 20 20 20 20 20 20 2f       0x01      /
193d0 2a 20 4d 61 73 6b 20 66 6f 72 20 44 65 61 64 2d  * Mask for Dead-
193e0 4d 61 6e 2d 53 77 69 74 63 68 20 6c 6f 63 6b 20  Man-Switch lock 
193f0 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 49 58 5f  */.#define UNIX_
19400 53 48 4d 5f 41 20 20 20 20 20 20 20 20 20 30 78  SHM_A         0x
19410 31 30 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20  10      /* Mask 
19420 66 6f 72 20 72 65 67 69 6f 6e 20 6c 6f 63 6b 73  for region locks
19430 2e 2e 2e 20 2a 2f 0a 23 64 65 66 69 6e 65 20 55  ... */.#define U
19440 4e 49 58 5f 53 48 4d 5f 42 20 20 20 20 20 20 20  NIX_SHM_B       
19450 20 20 30 78 32 30 0a 23 64 65 66 69 6e 65 20 55    0x20.#define U
19460 4e 49 58 5f 53 48 4d 5f 43 20 20 20 20 20 20 20  NIX_SHM_C       
19470 20 20 30 78 34 30 0a 23 64 65 66 69 6e 65 20 55    0x40.#define U
19480 4e 49 58 5f 53 48 4d 5f 44 20 20 20 20 20 20 20  NIX_SHM_D       
19490 20 20 30 78 38 30 0a 0a 23 69 66 64 65 66 20 53    0x80..#ifdef S
194a0 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a  QLITE_DEBUG./*.*
194b0 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
194c0 65 72 20 74 6f 20 61 20 6e 75 6c 2d 74 65 72 6d  er to a nul-term
194d0 69 6e 61 74 65 64 20 73 74 72 69 6e 67 20 69 6e  inated string in
194e0 20 73 74 61 74 69 63 20 6d 65 6d 6f 72 79 20 74   static memory t
194f0 68 61 74 0a 2a 2a 20 64 65 73 63 72 69 62 65 73  hat.** describes
19500 20 61 20 6c 6f 63 6b 69 6e 67 20 6d 61 73 6b 2e   a locking mask.
19510 20 20 54 68 65 20 73 74 72 69 6e 67 20 69 73 20    The string is 
19520 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 4d 53 41  of the form "MSA
19530 42 43 44 22 20 77 69 74 68 0a 2a 2a 20 65 61 63  BCD" with.** eac
19540 68 20 63 68 61 72 61 63 74 65 72 20 72 65 70 72  h character repr
19550 65 73 65 6e 74 69 6e 67 20 61 20 6c 6f 63 6b 2e  esenting a lock.
19560 20 20 22 4d 22 20 66 6f 72 20 4d 55 54 45 58 2c    "M" for MUTEX,
19570 20 22 53 22 20 66 6f 72 20 44 4d 53 2c 20 0a 2a   "S" for DMS, .*
19580 2a 20 61 6e 64 20 22 41 22 20 74 68 72 6f 75 67  * and "A" throug
19590 68 20 22 44 22 20 66 6f 72 20 74 68 65 20 72 65  h "D" for the re
195a0 67 69 6f 6e 20 6c 6f 63 6b 73 2e 20 20 49 66 20  gion locks.  If 
195b0 61 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 2c 20  a lock is held, 
195c0 74 68 65 0a 2a 2a 20 6c 65 74 74 65 72 20 69 73  the.** letter is
195d0 20 73 68 6f 77 6e 2e 20 20 49 66 20 74 68 65 20   shown.  If the 
195e0 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 68 65 6c 64  lock is not held
195f0 2c 20 74 68 65 20 6c 65 74 74 65 72 20 69 73 20  , the letter is 
19600 63 6f 6e 76 65 72 74 65 64 0a 2a 2a 20 74 6f 20  converted.** to 
19610 22 2e 22 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  "."..**.** This 
19620 72 6f 75 74 69 6e 65 20 69 73 20 66 6f 72 20 64  routine is for d
19630 65 62 75 67 67 69 6e 67 20 70 75 72 70 6f 73 65  ebugging purpose
19640 73 20 6f 6e 6c 79 20 61 6e 64 20 64 6f 65 73 20  s only and does 
19650 6e 6f 74 20 61 70 70 65 61 72 0a 2a 2a 20 69 6e  not appear.** in
19660 20 61 20 70 72 6f 64 75 63 74 69 6f 6e 20 62 75   a production bu
19670 69 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ild..*/.static c
19680 6f 6e 73 74 20 63 68 61 72 20 2a 75 6e 69 78 53  onst char *unixS
19690 68 6d 4c 6f 63 6b 53 74 72 69 6e 67 28 75 38 20  hmLockString(u8 
196a0 6d 61 73 6b 29 7b 0a 20 20 73 74 61 74 69 63 20  mask){.  static 
196b0 63 68 61 72 20 7a 42 75 66 5b 34 38 5d 3b 0a 20  char zBuf[48];. 
196c0 20 73 74 61 74 69 63 20 69 6e 74 20 69 42 75 66   static int iBuf
196d0 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 3b   = 0;.  char *z;
196e0 0a 0a 20 20 7a 20 3d 20 26 7a 42 75 66 5b 69 42  ..  z = &zBuf[iB
196f0 75 66 5d 3b 0a 20 20 69 42 75 66 20 2b 3d 20 38  uf];.  iBuf += 8
19700 3b 0a 20 20 69 66 28 20 69 42 75 66 3e 3d 73 69  ;.  if( iBuf>=si
19710 7a 65 6f 66 28 7a 42 75 66 29 20 29 20 69 42 75  zeof(zBuf) ) iBu
19720 66 20 3d 20 30 3b 0a 0a 20 20 7a 5b 30 5d 20 3d  f = 0;..  z[0] =
19730 20 28 6d 61 73 6b 20 26 20 55 4e 49 58 5f 53 48   (mask & UNIX_SH
19740 4d 5f 44 4d 53 29 20 20 20 3f 20 27 53 27 20 3a  M_DMS)   ? 'S' :
19750 20 27 2e 27 3b 0a 20 20 7a 5b 31 5d 20 3d 20 28   '.';.  z[1] = (
19760 6d 61 73 6b 20 26 20 55 4e 49 58 5f 53 48 4d 5f  mask & UNIX_SHM_
19770 41 29 20 20 20 20 20 3f 20 27 41 27 20 3a 20 27  A)     ? 'A' : '
19780 2e 27 3b 0a 20 20 7a 5b 32 5d 20 3d 20 28 6d 61  .';.  z[2] = (ma
19790 73 6b 20 26 20 55 4e 49 58 5f 53 48 4d 5f 42 29  sk & UNIX_SHM_B)
197a0 20 20 20 20 20 3f 20 27 42 27 20 3a 20 27 2e 27       ? 'B' : '.'
197b0 3b 0a 20 20 7a 5b 33 5d 20 3d 20 28 6d 61 73 6b  ;.  z[3] = (mask
197c0 20 26 20 55 4e 49 58 5f 53 48 4d 5f 43 29 20 20   & UNIX_SHM_C)  
197d0 20 20 20 3f 20 27 43 27 20 3a 20 27 2e 27 3b 0a     ? 'C' : '.';.
197e0 20 20 7a 5b 34 5d 20 3d 20 28 6d 61 73 6b 20 26    z[4] = (mask &
197f0 20 55 4e 49 58 5f 53 48 4d 5f 44 29 20 20 20 20   UNIX_SHM_D)    
19800 20 3f 20 27 44 27 20 3a 20 27 2e 27 3b 0a 20 20   ? 'D' : '.';.  
19810 7a 5b 35 5d 20 3d 20 30 3b 0a 20 20 72 65 74 75  z[5] = 0;.  retu
19820 72 6e 20 7a 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  rn z;.}.#endif /
19830 2a 20 53 51 4c 49 54 45 5f 44 45 42 55 47 20 2a  * SQLITE_DEBUG *
19840 2f 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 6c 79 20 70  /../*.** Apply p
19850 6f 73 69 78 20 61 64 76 69 73 6f 72 79 20 6c 6f  osix advisory lo
19860 63 6b 73 20 66 6f 72 20 61 6c 6c 20 62 79 74 65  cks for all byte
19870 73 20 69 64 65 6e 74 69 66 69 65 64 20 69 6e 20  s identified in 
19880 6c 6f 63 6b 4d 61 73 6b 2e 0a 2a 2a 0a 2a 2a 20  lockMask..**.** 
19890 6c 6f 63 6b 4d 61 73 6b 20 6d 69 67 68 74 20 63  lockMask might c
198a0 6f 6e 74 61 69 6e 20 6d 75 6c 74 69 70 6c 65 20  ontain multiple 
198b0 62 69 74 73 20 62 75 74 20 61 6c 6c 20 62 69 74  bits but all bit
198c0 73 20 61 72 65 20 67 75 61 72 61 6e 74 65 65 64  s are guaranteed
198d0 0a 2a 2a 20 74 6f 20 62 65 20 63 6f 6e 74 69 67  .** to be contig
198e0 75 6f 75 73 2e 0a 2a 2a 0a 2a 2a 20 4c 6f 63 6b  uous..**.** Lock
198f0 73 20 62 6c 6f 63 6b 20 69 66 20 74 68 65 20 6d  s block if the m
19900 61 73 6b 20 69 73 20 65 78 61 63 74 6c 79 20 55  ask is exactly U
19910 4e 49 58 5f 53 48 4d 5f 43 20 61 6e 64 20 61 72  NIX_SHM_C and ar
19920 65 20 6e 6f 6e 2d 62 6c 6f 63 6b 69 6e 67 0a 2a  e non-blocking.*
19930 2a 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a  * otherwise..*/.
19940 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53  static int unixS
19950 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 0a 20 20  hmSystemLock(.  
19960 75 6e 69 78 53 68 6d 46 69 6c 65 20 2a 70 46 69  unixShmFile *pFi
19970 6c 65 2c 20 20 20 2f 2a 20 41 70 70 6c 79 20 6c  le,   /* Apply l
19980 6f 63 6b 73 20 74 6f 20 74 68 69 73 20 6f 70 65  ocks to this ope
19990 6e 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20  n shared-memory 
199a0 73 65 67 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e 74  segment */.  int
199b0 20 6c 6f 63 6b 54 79 70 65 2c 20 20 20 20 20 20   lockType,      
199c0 20 20 20 2f 2a 20 46 5f 55 4e 4c 43 4b 2c 20 46     /* F_UNLCK, F
199d0 5f 52 44 4c 43 4b 2c 20 6f 72 20 46 5f 57 52 4c  _RDLCK, or F_WRL
199e0 43 4b 20 2a 2f 0a 20 20 75 38 20 6c 6f 63 6b 4d  CK */.  u8 lockM
199f0 61 73 6b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ask           /*
19a00 20 57 68 69 63 68 20 62 79 74 65 73 20 74 6f 20   Which bytes to 
19a10 6c 6f 63 6b 20 6f 72 20 75 6e 6c 6f 63 6b 20 2a  lock or unlock *
19a20 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 66 6c  /.){.  struct fl
19a30 6f 63 6b 20 66 3b 20 20 20 20 20 20 20 2f 2a 20  ock f;       /* 
19a40 54 68 65 20 70 6f 73 69 78 20 61 64 76 69 73 6f  The posix adviso
19a50 72 79 20 6c 6f 63 6b 69 6e 67 20 73 74 72 75 63  ry locking struc
19a60 74 75 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6c 6f  ture */.  int lo
19a70 63 6b 4f 70 3b 20 20 20 20 20 20 20 20 20 20 20  ckOp;           
19a80 2f 2a 20 54 68 65 20 6f 70 63 6f 64 65 20 66 6f  /* The opcode fo
19a90 72 20 66 63 6e 74 6c 28 29 20 2a 2f 0a 20 20 69  r fcntl() */.  i
19aa0 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
19ab0 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69       /* Offset i
19ac0 6e 74 6f 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20  nto the locking 
19ad0 62 79 74 65 20 72 61 6e 67 65 20 2a 2f 0a 20 20  byte range */.  
19ae0 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
19af0 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
19b00 63 6f 64 65 20 66 6f 72 6d 20 66 63 6e 74 6c 28  code form fcntl(
19b10 29 20 2a 2f 0a 20 20 75 38 20 6d 61 73 6b 3b 20  ) */.  u8 mask; 
19b20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19b30 4d 61 73 6b 20 6f 66 20 62 69 74 73 20 69 6e 20  Mask of bits in 
19b40 6c 6f 63 6b 4d 61 73 6b 20 2a 2f 0a 0a 20 20 2f  lockMask */..  /
19b50 2a 20 41 63 63 65 73 73 20 74 6f 20 74 68 65 20  * Access to the 
19b60 75 6e 69 78 53 68 6d 46 69 6c 65 20 6f 62 6a 65  unixShmFile obje
19b70 63 74 20 69 73 20 73 65 72 69 61 6c 69 7a 65 64  ct is serialized
19b80 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 2a   by the caller *
19b90 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  /.  assert( sqli
19ba0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
19bb0 46 69 6c 65 2d 3e 6d 75 74 65 78 29 20 7c 7c 20  File->mutex) || 
19bc0 70 46 69 6c 65 2d 3e 6e 52 65 66 3d 3d 30 20 29  pFile->nRef==0 )
19bd0 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69  ;..  /* Initiali
19be0 7a 65 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 70  ze the locking p
19bf0 61 72 61 6d 65 74 65 72 73 20 2a 2f 0a 20 20 6d  arameters */.  m
19c00 65 6d 73 65 74 28 26 66 2c 20 30 2c 20 73 69 7a  emset(&f, 0, siz
19c10 65 6f 66 28 66 29 29 3b 0a 20 20 66 2e 6c 5f 74  eof(f));.  f.l_t
19c20 79 70 65 20 3d 20 6c 6f 63 6b 54 79 70 65 3b 0a  ype = lockType;.
19c30 20 20 66 2e 6c 5f 77 68 65 6e 63 65 20 3d 20 53    f.l_whence = S
19c40 45 45 4b 5f 53 45 54 3b 0a 20 20 69 66 28 20 6c  EEK_SET;.  if( l
19c50 6f 63 6b 4d 61 73 6b 3d 3d 55 4e 49 58 5f 53 48  ockMask==UNIX_SH
19c60 4d 5f 43 20 26 26 20 6c 6f 63 6b 54 79 70 65 21  M_C && lockType!
19c70 3d 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20  =F_UNLCK ){.    
19c80 6c 6f 63 6b 4f 70 20 3d 20 46 5f 53 45 54 4c 4b  lockOp = F_SETLK
19c90 57 3b 0a 20 20 20 20 4f 53 54 52 41 43 45 28 28  W;.    OSTRACE((
19ca0 22 53 48 4d 2d 4c 4f 43 4b 20 72 65 71 75 65 73  "SHM-LOCK reques
19cb0 74 69 6e 67 20 62 6c 6f 63 6b 69 6e 67 20 6c 6f  ting blocking lo
19cc0 63 6b 5c 6e 22 29 29 3b 0a 20 20 7d 65 6c 73 65  ck\n"));.  }else
19cd0 7b 0a 20 20 20 20 6c 6f 63 6b 4f 70 20 3d 20 46  {.    lockOp = F
19ce0 5f 53 45 54 4c 4b 3b 0a 20 20 7d 0a 0a 20 20 2f  _SETLK;.  }..  /
19cf0 2a 20 46 69 6e 64 20 74 68 65 20 66 69 72 73 74  * Find the first
19d00 20 62 69 74 20 69 6e 20 6c 6f 63 6b 4d 61 73 6b   bit in lockMask
19d10 20 74 68 61 74 20 69 73 20 73 65 74 20 2a 2f 0a   that is set */.
19d20 20 20 66 6f 72 28 69 3d 30 2c 20 6d 61 73 6b 3d    for(i=0, mask=
19d30 30 78 30 31 3b 20 6d 61 73 6b 21 3d 30 20 26 26  0x01; mask!=0 &&
19d40 20 28 6c 6f 63 6b 4d 61 73 6b 26 6d 61 73 6b 29   (lockMask&mask)
19d50 3d 3d 30 3b 20 6d 61 73 6b 20 3c 3c 3d 20 31 2c  ==0; mask <<= 1,
19d60 20 69 2b 2b 29 7b 7d 0a 20 20 61 73 73 65 72 74   i++){}.  assert
19d70 28 20 6d 61 73 6b 21 3d 30 20 29 3b 0a 20 20 66  ( mask!=0 );.  f
19d80 2e 6c 5f 73 74 61 72 74 20 3d 20 69 2b 55 4e 49  .l_start = i+UNI
19d90 58 5f 53 48 4d 5f 42 41 53 45 3b 0a 20 20 66 2e  X_SHM_BASE;.  f.
19da0 6c 5f 6c 65 6e 20 3d 20 31 3b 0a 0a 20 20 2f 2a  l_len = 1;..  /*
19db0 20 45 78 74 65 6e 64 20 74 68 65 20 6c 6f 63 6b   Extend the lock
19dc0 69 6e 67 20 72 61 6e 67 65 20 66 6f 72 20 65 61  ing range for ea
19dd0 63 68 20 61 64 64 69 74 69 6f 6e 61 6c 20 62 69  ch additional bi
19de0 74 20 74 68 61 74 20 69 73 20 73 65 74 20 2a 2f  t that is set */
19df0 0a 20 20 6d 61 73 6b 20 3c 3c 3d 20 31 3b 0a 20  .  mask <<= 1;. 
19e00 20 77 68 69 6c 65 28 20 6d 61 73 6b 21 3d 30 20   while( mask!=0 
19e10 26 26 20 28 6c 6f 63 6b 4d 61 73 6b 20 26 20 6d  && (lockMask & m
19e20 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 66  ask)!=0 ){.    f
19e30 2e 6c 5f 6c 65 6e 2b 2b 3b 0a 20 20 20 20 6d 61  .l_len++;.    ma
19e40 73 6b 20 3c 3c 3d 20 31 3b 0a 20 20 7d 0a 0a 20  sk <<= 1;.  }.. 
19e50 20 2f 2a 20 56 65 72 69 66 79 20 74 68 61 74 20   /* Verify that 
19e60 61 6c 6c 20 62 69 74 73 20 73 65 74 20 69 6e 20  all bits set in 
19e70 6c 6f 63 6b 4d 61 73 6b 20 61 72 65 20 63 6f 6e  lockMask are con
19e80 74 69 67 75 6f 75 73 20 2a 2f 0a 20 20 61 73 73  tiguous */.  ass
19e90 65 72 74 28 20 6d 61 73 6b 3d 3d 30 20 7c 7c 20  ert( mask==0 || 
19ea0 28 6c 6f 63 6b 4d 61 73 6b 20 26 20 7e 28 6d 61  (lockMask & ~(ma
19eb0 73 6b 20 7c 20 28 6d 61 73 6b 2d 31 29 29 29 3d  sk | (mask-1)))=
19ec0 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 63 71 75  =0 );..  /* Acqu
19ed0 69 72 65 20 74 68 65 20 73 79 73 74 65 6d 2d 6c  ire the system-l
19ee0 65 76 65 6c 20 6c 6f 63 6b 20 2a 2f 0a 20 20 72  evel lock */.  r
19ef0 63 20 3d 20 66 63 6e 74 6c 28 70 46 69 6c 65 2d  c = fcntl(pFile-
19f00 3e 68 2c 20 6c 6f 63 6b 4f 70 2c 20 26 66 29 3b  >h, lockOp, &f);
19f10 0a 20 20 72 63 20 3d 20 28 72 63 21 3d 28 2d 31  .  rc = (rc!=(-1
19f20 29 29 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a  )) ? SQLITE_OK :
19f30 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 0a 20   SQLITE_BUSY;.. 
19f40 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 67   /* Update the g
19f50 6c 6f 62 61 6c 20 6c 6f 63 6b 20 73 74 61 74 65  lobal lock state
19f60 20 61 6e 64 20 64 6f 20 64 65 62 75 67 20 74 72   and do debug tr
19f70 61 63 69 6e 67 20 2a 2f 0a 23 69 66 64 65 66 20  acing */.#ifdef 
19f80 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 4f  SQLITE_DEBUG.  O
19f90 53 54 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f 43  STRACE(("SHM-LOC
19fa0 4b 20 22 29 29 3b 0a 20 20 69 66 28 20 72 63 3d  K "));.  if( rc=
19fb0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
19fc0 20 20 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d    if( lockType==
19fd0 46 5f 55 4e 4c 43 4b 20 29 7b 0a 20 20 20 20 20  F_UNLCK ){.     
19fe0 20 4f 53 54 52 41 43 45 28 28 22 75 6e 6c 6f 63   OSTRACE(("unloc
19ff0 6b 20 6f 6b 22 29 29 3b 0a 20 20 20 20 20 20 70  k ok"));.      p
1a000 46 69 6c 65 2d 3e 65 78 63 6c 4d 61 73 6b 20 26  File->exclMask &
1a010 3d 20 7e 6c 6f 63 6b 4d 61 73 6b 3b 0a 20 20 20  = ~lockMask;.   
1a020 20 20 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64     pFile->shared
1a030 4d 61 73 6b 20 26 3d 20 7e 6c 6f 63 6b 4d 61 73  Mask &= ~lockMas
1a040 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  k;.    }else if(
1a050 20 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 52 44 4c   lockType==F_RDL
1a060 43 4b 20 29 7b 0a 20 20 20 20 20 20 4f 53 54 52  CK ){.      OSTR
1a070 41 43 45 28 28 22 72 65 61 64 2d 6c 6f 63 6b 20  ACE(("read-lock 
1a080 6f 6b 22 29 29 3b 0a 20 20 20 20 20 20 70 46 69  ok"));.      pFi
1a090 6c 65 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 3d 20  le->exclMask &= 
1a0a0 7e 6c 6f 63 6b 4d 61 73 6b 3b 0a 20 20 20 20 20  ~lockMask;.     
1a0b0 20 70 46 69 6c 65 2d 3e 73 68 61 72 65 64 4d 61   pFile->sharedMa
1a0c0 73 6b 20 7c 3d 20 6c 6f 63 6b 4d 61 73 6b 3b 0a  sk |= lockMask;.
1a0d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1a0e0 20 61 73 73 65 72 74 28 20 6c 6f 63 6b 54 79 70   assert( lockTyp
1a0f0 65 3d 3d 46 5f 57 52 4c 43 4b 20 29 3b 0a 20 20  e==F_WRLCK );.  
1a100 20 20 20 20 4f 53 54 52 41 43 45 28 28 22 77 72      OSTRACE(("wr
1a110 69 74 65 2d 6c 6f 63 6b 20 6f 6b 22 29 29 3b 0a  ite-lock ok"));.
1a120 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 65 78 63        pFile->exc
1a130 6c 4d 61 73 6b 20 7c 3d 20 6c 6f 63 6b 4d 61 73  lMask |= lockMas
1a140 6b 3b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  k;.      pFile->
1a150 73 68 61 72 65 64 4d 61 73 6b 20 26 3d 20 7e 6c  sharedMask &= ~l
1a160 6f 63 6b 4d 61 73 6b 3b 0a 20 20 20 20 7d 0a 20  ockMask;.    }. 
1a170 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20   }else{.    if( 
1a180 6c 6f 63 6b 54 79 70 65 3d 3d 46 5f 55 4e 4c 43  lockType==F_UNLC
1a190 4b 20 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41  K ){.      OSTRA
1a1a0 43 45 28 28 22 75 6e 6c 6f 63 6b 20 66 61 69 6c  CE(("unlock fail
1a1b0 65 64 22 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65  ed"));.    }else
1a1c0 20 69 66 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 46   if( lockType==F
1a1d0 5f 52 44 4c 43 4b 20 29 7b 0a 20 20 20 20 20 20  _RDLCK ){.      
1a1e0 4f 53 54 52 41 43 45 28 28 22 72 65 61 64 2d 6c  OSTRACE(("read-l
1a1f0 6f 63 6b 20 66 61 69 6c 65 64 22 29 29 3b 0a 20  ock failed"));. 
1a200 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1a210 61 73 73 65 72 74 28 20 6c 6f 63 6b 54 79 70 65  assert( lockType
1a220 3d 3d 46 5f 57 52 4c 43 4b 20 29 3b 0a 20 20 20  ==F_WRLCK );.   
1a230 20 20 20 4f 53 54 52 41 43 45 28 28 22 77 72 69     OSTRACE(("wri
1a240 74 65 2d 6c 6f 63 6b 20 66 61 69 6c 65 64 22 29  te-lock failed")
1a250 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 4f  );.    }.  }.  O
1a260 53 54 52 41 43 45 28 28 22 20 2d 20 63 68 61 6e  STRACE((" - chan
1a270 67 65 20 72 65 71 75 65 73 74 65 64 20 25 73 20  ge requested %s 
1a280 2d 20 61 66 74 65 72 77 61 72 64 73 20 25 73 3a  - afterwards %s:
1a290 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %s\n",.         
1a2a0 20 20 75 6e 69 78 53 68 6d 4c 6f 63 6b 53 74 72    unixShmLockStr
1a2b0 69 6e 67 28 6c 6f 63 6b 4d 61 73 6b 29 2c 0a 20  ing(lockMask),. 
1a2c0 20 20 20 20 20 20 20 20 20 20 75 6e 69 78 53 68            unixSh
1a2d0 6d 4c 6f 63 6b 53 74 72 69 6e 67 28 70 46 69 6c  mLockString(pFil
1a2e0 65 2d 3e 73 68 61 72 65 64 4d 61 73 6b 29 2c 0a  e->sharedMask),.
1a2f0 20 20 20 20 20 20 20 20 20 20 20 75 6e 69 78 53             unixS
1a300 68 6d 4c 6f 63 6b 53 74 72 69 6e 67 28 70 46 69  hmLockString(pFi
1a310 6c 65 2d 3e 65 78 63 6c 4d 61 73 6b 29 29 29 3b  le->exclMask)));
1a320 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72  .#endif..  retur
1a330 6e 20 72 63 3b 20 20 20 20 20 20 20 20 0a 7d 0a  n rc;        .}.
1a340 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 63 6f 6e 6e 65  ./*.** For conne
1a350 63 74 69 6f 6e 20 70 2c 20 75 6e 6c 6f 63 6b 20  ction p, unlock 
1a360 61 6c 6c 20 6f 66 20 74 68 65 20 6c 6f 63 6b 73  all of the locks
1a370 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 74   identified by t
1a380 68 65 20 75 6e 6c 6f 63 6b 4d 61 73 6b 0a 2a 2a  he unlockMask.**
1a390 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2f 0a 73   parameter..*/.s
1a3a0 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 68  tatic int unixSh
1a3b0 6d 55 6e 6c 6f 63 6b 28 0a 20 20 75 6e 69 78 53  mUnlock(.  unixS
1a3c0 68 6d 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20  hmFile *pFile,  
1a3d0 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69   /* The underlyi
1a3e0 6e 67 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72 79  ng shared-memory
1a3f0 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78 53   file */.  unixS
1a400 68 6d 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  hm *p,          
1a410 20 2f 2a 20 54 68 65 20 63 6f 6e 6e 65 63 74 69   /* The connecti
1a420 6f 6e 20 74 6f 20 62 65 20 75 6e 6c 6f 63 6b 65  on to be unlocke
1a430 64 20 2a 2f 0a 20 20 75 38 20 75 6e 6c 6f 63 6b  d */.  u8 unlock
1a440 4d 61 73 6b 20 20 20 20 20 20 20 20 20 2f 2a 20  Mask         /* 
1a450 4d 61 73 6b 20 6f 66 20 6c 6f 63 6b 73 20 74 6f  Mask of locks to
1a460 20 62 65 20 75 6e 6c 6f 63 6b 65 64 20 2a 2f 0a   be unlocked */.
1a470 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
1a480 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
1a490 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70   */.  unixShm *p
1a4a0 58 3b 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e  X; /* For loopin
1a4b0 67 20 6f 76 65 72 20 61 6c 6c 20 73 69 62 6c 69  g over all sibli
1a4c0 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a  ng connections *
1a4d0 2f 0a 20 20 75 38 20 61 6c 6c 4d 61 73 6b 3b 20  /.  u8 allMask; 
1a4e0 20 2f 2a 20 55 6e 69 6f 6e 20 6f 66 20 6c 6f 63   /* Union of loc
1a4f0 6b 73 20 68 65 6c 64 20 62 79 20 63 6f 6e 6e 65  ks held by conne
1a500 63 74 69 6f 6e 73 20 6f 74 68 65 72 20 74 68 61  ctions other tha
1a510 6e 20 22 70 22 20 2a 2f 0a 0a 20 20 2f 2a 20 41  n "p" */..  /* A
1a520 63 63 65 73 73 20 74 6f 20 74 68 65 20 75 6e 69  ccess to the uni
1a530 78 53 68 6d 46 69 6c 65 20 6f 62 6a 65 63 74 20  xShmFile object 
1a540 69 73 20 73 65 72 69 61 6c 69 7a 65 64 20 62 79  is serialized by
1a550 20 74 68 65 20 63 61 6c 6c 65 72 20 2a 2f 0a 20   the caller */. 
1a560 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1a570 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 46 69 6c  _mutex_held(pFil
1a580 65 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20  e->mutex) );..  
1a590 2f 2a 20 43 6f 6d 70 75 74 65 20 6c 6f 63 6b 73  /* Compute locks
1a5a0 20 68 65 6c 64 20 62 79 20 73 69 62 6c 69 6e 67   held by sibling
1a5b0 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a   connections */.
1a5c0 20 20 61 6c 6c 4d 61 73 6b 20 3d 20 30 3b 0a 20    allMask = 0;. 
1a5d0 20 66 6f 72 28 70 58 3d 70 46 69 6c 65 2d 3e 70   for(pX=pFile->p
1a5e0 46 69 72 73 74 3b 20 70 58 3b 20 70 58 3d 70 58  First; pX; pX=pX
1a5f0 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66  ->pNext){.    if
1a600 28 20 70 58 3d 3d 70 20 29 20 63 6f 6e 74 69 6e  ( pX==p ) contin
1a610 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ue;.    assert( 
1a620 28 70 58 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20  (pX->exclMask & 
1a630 28 70 2d 3e 65 78 63 6c 4d 61 73 6b 7c 70 2d 3e  (p->exclMask|p->
1a640 73 68 61 72 65 64 4d 61 73 6b 29 29 3d 3d 30 20  sharedMask))==0 
1a650 29 3b 0a 20 20 20 20 61 6c 6c 4d 61 73 6b 20 7c  );.    allMask |
1a660 3d 20 70 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b  = pX->sharedMask
1a670 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e 6c 6f  ;.  }..  /* Unlo
1a680 63 6b 20 74 68 65 20 73 79 73 74 65 6d 2d 6c 65  ck the system-le
1a690 76 65 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 69  vel locks */.  i
1a6a0 66 28 20 28 75 6e 6c 6f 63 6b 4d 61 73 6b 20 26  f( (unlockMask &
1a6b0 20 61 6c 6c 4d 61 73 6b 29 21 3d 75 6e 6c 6f 63   allMask)!=unloc
1a6c0 6b 4d 61 73 6b 20 29 7b 0a 20 20 20 20 72 63 20  kMask ){.    rc 
1a6d0 3d 20 75 6e 69 78 53 68 6d 53 79 73 74 65 6d 4c  = unixShmSystemL
1a6e0 6f 63 6b 28 70 46 69 6c 65 2c 20 46 5f 55 4e 4c  ock(pFile, F_UNL
1a6f0 43 4b 2c 20 75 6e 6c 6f 63 6b 4d 61 73 6b 20 26  CK, unlockMask &
1a700 20 7e 61 6c 6c 4d 61 73 6b 29 3b 0a 20 20 7d 65   ~allMask);.  }e
1a710 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  lse{.    rc = SQ
1a720 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20  LITE_OK;.  }..  
1a730 2f 2a 20 55 6e 64 6f 20 74 68 65 20 6c 6f 63 61  /* Undo the loca
1a740 6c 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 69 66 28  l locks */.  if(
1a750 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1a760 7b 0a 20 20 20 20 70 2d 3e 65 78 63 6c 4d 61 73  {.    p->exclMas
1a770 6b 20 26 3d 20 7e 75 6e 6c 6f 63 6b 4d 61 73 6b  k &= ~unlockMask
1a780 3b 0a 20 20 20 20 70 2d 3e 73 68 61 72 65 64 4d  ;.    p->sharedM
1a790 61 73 6b 20 26 3d 20 7e 75 6e 6c 6f 63 6b 4d 61  ask &= ~unlockMa
1a7a0 73 6b 3b 0a 20 20 7d 20 0a 20 20 72 65 74 75 72  sk;.  } .  retur
1a7b0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  n rc;.}../*.** G
1a7c0 65 74 20 72 65 61 64 65 72 20 6c 6f 63 6b 73 20  et reader locks 
1a7d0 66 6f 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70  for connection p
1a7e0 20 6f 6e 20 61 6c 6c 20 6c 6f 63 6b 73 20 69 6e   on all locks in
1a7f0 20 74 68 65 20 72 65 61 64 4d 61 73 6b 20 70 61   the readMask pa
1a800 72 61 6d 65 74 65 72 2e 0a 2a 2f 0a 73 74 61 74  rameter..*/.stat
1a810 69 63 20 69 6e 74 20 75 6e 69 78 53 68 6d 53 68  ic int unixShmSh
1a820 61 72 65 64 4c 6f 63 6b 28 0a 20 20 75 6e 69 78  aredLock(.  unix
1a830 53 68 6d 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20  ShmFile *pFile, 
1a840 20 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79    /* The underly
1a850 69 6e 67 20 73 68 61 72 65 64 2d 6d 65 6d 6f 72  ing shared-memor
1a860 79 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78  y file */.  unix
1a870 53 68 6d 20 2a 70 2c 20 20 20 20 20 20 20 20 20  Shm *p,         
1a880 20 20 2f 2a 20 54 68 65 20 63 6f 6e 6e 65 63 74    /* The connect
1a890 69 6f 6e 20 74 6f 20 67 65 74 20 74 68 65 20 73  ion to get the s
1a8a0 68 61 72 65 64 20 6c 6f 63 6b 73 20 2a 2f 0a 20  hared locks */. 
1a8b0 20 75 38 20 72 65 61 64 4d 61 73 6b 20 20 20 20   u8 readMask    
1a8c0 20 20 20 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f         /* Mask o
1a8d0 66 20 73 68 61 72 65 64 20 6c 6f 63 6b 73 20 74  f shared locks t
1a8e0 6f 20 62 65 20 61 63 71 75 69 72 65 64 20 2a 2f  o be acquired */
1a8f0 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  .){.  int rc;   
1a900 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63       /* Result c
1a910 6f 64 65 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d  ode */.  unixShm
1a920 20 2a 70 58 3b 20 20 20 2f 2a 20 46 6f 72 20 6c   *pX;   /* For l
1a930 6f 6f 70 69 6e 67 20 6f 76 65 72 20 61 6c 6c 20  ooping over all 
1a940 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69  sibling connecti
1a950 6f 6e 73 20 2a 2f 0a 20 20 75 38 20 61 6c 6c 53  ons */.  u8 allS
1a960 68 61 72 65 64 3b 20 20 2f 2a 20 55 6e 69 6f 6e  hared;  /* Union
1a970 20 6f 66 20 6c 6f 63 6b 73 20 68 65 6c 64 20 62   of locks held b
1a980 79 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 74  y connections ot
1a990 68 65 72 20 74 68 61 6e 20 22 70 22 20 2a 2f 0a  her than "p" */.
1a9a0 0a 20 20 2f 2a 20 41 63 63 65 73 73 20 74 6f 20  .  /* Access to 
1a9b0 74 68 65 20 75 6e 69 78 53 68 6d 46 69 6c 65 20  the unixShmFile 
1a9c0 6f 62 6a 65 63 74 20 69 73 20 73 65 72 69 61 6c  object is serial
1a9d0 69 7a 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  ized by the call
1a9e0 65 72 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  er */.  assert( 
1a9f0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
1aa00 6c 64 28 70 46 69 6c 65 2d 3e 6d 75 74 65 78 29  ld(pFile->mutex)
1aa10 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 6f   );..  /* Find o
1aa20 75 74 20 77 68 69 63 68 20 73 68 61 72 65 64 20  ut which shared 
1aa30 6c 6f 63 6b 73 20 61 72 65 20 61 6c 72 65 61 64  locks are alread
1aa40 79 20 68 65 6c 64 20 62 79 20 73 69 62 6c 69 6e  y held by siblin
1aa50 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0a 20  g connections.. 
1aa60 20 2a 2a 20 49 66 20 61 6e 79 20 73 69 62 6c 69   ** If any sibli
1aa70 6e 67 20 61 6c 72 65 61 64 79 20 68 6f 6c 64 73  ng already holds
1aa80 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
1aa90 63 6b 2c 20 67 6f 20 61 68 65 61 64 20 61 6e 64  ck, go ahead and
1aaa0 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 53 51 4c   return.  ** SQL
1aab0 49 54 45 5f 42 55 53 59 2e 0a 20 20 2a 2f 0a 20  ITE_BUSY..  */. 
1aac0 20 61 6c 6c 53 68 61 72 65 64 20 3d 20 30 3b 0a   allShared = 0;.
1aad0 20 20 66 6f 72 28 70 58 3d 70 46 69 6c 65 2d 3e    for(pX=pFile->
1aae0 70 46 69 72 73 74 3b 20 70 58 3b 20 70 58 3d 70  pFirst; pX; pX=p
1aaf0 58 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  X->pNext){.    i
1ab00 66 28 20 70 58 3d 3d 70 20 29 20 63 6f 6e 74 69  f( pX==p ) conti
1ab10 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 28 70 58  nue;.    if( (pX
1ab20 2d 3e 65 78 63 6c 4d 61 73 6b 20 26 20 72 65 61  ->exclMask & rea
1ab30 64 4d 61 73 6b 29 21 3d 30 20 29 20 72 65 74 75  dMask)!=0 ) retu
1ab40 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a  rn SQLITE_BUSY;.
1ab50 20 20 20 20 61 6c 6c 53 68 61 72 65 64 20 7c 3d      allShared |=
1ab60 20 70 58 2d 3e 73 68 61 72 65 64 4d 61 73 6b 3b   pX->sharedMask;
1ab70 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 74 20 73  .  }..  /* Get s
1ab80 68 61 72 65 64 20 6c 6f 63 6b 73 20 61 74 20 74  hared locks at t
1ab90 68 65 20 73 79 73 74 65 6d 20 6c 65 76 65 6c 2c  he system level,
1aba0 20 69 66 20 6e 65 63 65 73 73 61 72 79 20 2a 2f   if necessary */
1abb0 0a 20 20 69 66 28 20 28 7e 61 6c 6c 53 68 61 72  .  if( (~allShar
1abc0 65 64 29 20 26 20 72 65 61 64 4d 61 73 6b 20 29  ed) & readMask )
1abd0 7b 0a 20 20 20 20 72 63 20 3d 20 75 6e 69 78 53  {.    rc = unixS
1abe0 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70 46 69  hmSystemLock(pFi
1abf0 6c 65 2c 20 46 5f 52 44 4c 43 4b 2c 20 72 65 61  le, F_RDLCK, rea
1ac00 64 4d 61 73 6b 29 3b 0a 20 20 7d 65 6c 73 65 7b  dMask);.  }else{
1ac10 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
1ac20 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47  _OK;.  }..  /* G
1ac30 65 74 20 74 68 65 20 6c 6f 63 61 6c 20 73 68 61  et the local sha
1ac40 72 65 64 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 69  red locks */.  i
1ac50 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1ac60 20 29 7b 0a 20 20 20 20 70 2d 3e 73 68 61 72 65   ){.    p->share
1ac70 64 4d 61 73 6b 20 7c 3d 20 72 65 61 64 4d 61 73  dMask |= readMas
1ac80 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  k;.  }.  return 
1ac90 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72  rc;.}../*.** For
1aca0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 2c 20 67   connection p, g
1acb0 65 74 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  et an exclusive 
1acc0 6c 6f 63 6b 20 6f 6e 20 61 6c 6c 20 6c 6f 63 6b  lock on all lock
1acd0 73 20 69 64 65 6e 74 69 66 69 65 64 20 69 6e 0a  s identified in.
1ace0 2a 2a 20 74 68 65 20 77 72 69 74 65 4d 61 73 6b  ** the writeMask
1acf0 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2f 0a 73   parameter..*/.s
1ad00 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 68  tatic int unixSh
1ad10 6d 45 78 63 6c 75 73 69 76 65 4c 6f 63 6b 28 0a  mExclusiveLock(.
1ad20 20 20 75 6e 69 78 53 68 6d 46 69 6c 65 20 2a 70    unixShmFile *p
1ad30 46 69 6c 65 2c 20 20 20 20 2f 2a 20 54 68 65 20  File,    /* The 
1ad40 75 6e 64 65 72 6c 79 69 6e 67 20 73 68 61 72 65  underlying share
1ad50 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20 2a 2f  d-memory file */
1ad60 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 2c 20 20  .  unixShm *p,  
1ad70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1ad80 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 67   connection to g
1ad90 65 74 20 74 68 65 20 65 78 63 6c 75 73 69 76 65  et the exclusive
1ada0 20 6c 6f 63 6b 73 20 2a 2f 0a 20 20 75 38 20 77   locks */.  u8 w
1adb0 72 69 74 65 4d 61 73 6b 20 20 20 20 20 20 20 20  riteMask        
1adc0 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 65 78     /* Mask of ex
1add0 63 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20 74 6f  clusive locks to
1ade0 20 62 65 20 61 63 71 75 69 72 65 64 20 2a 2f 0a   be acquired */.
1adf0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
1ae00 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f      /* Result co
1ae10 64 65 20 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20  de */.  unixShm 
1ae20 2a 70 58 3b 20 20 20 2f 2a 20 46 6f 72 20 6c 6f  *pX;   /* For lo
1ae30 6f 70 69 6e 67 20 6f 76 65 72 20 61 6c 6c 20 73  oping over all s
1ae40 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f  ibling connectio
1ae50 6e 73 20 2a 2f 0a 0a 20 20 2f 2a 20 41 63 63 65  ns */..  /* Acce
1ae60 73 73 20 74 6f 20 74 68 65 20 75 6e 69 78 53 68  ss to the unixSh
1ae70 6d 46 69 6c 65 20 6f 62 6a 65 63 74 20 69 73 20  mFile object is 
1ae80 73 65 72 69 61 6c 69 7a 65 64 20 62 79 20 74 68  serialized by th
1ae90 65 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 61 73  e caller */.  as
1aea0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
1aeb0 74 65 78 5f 68 65 6c 64 28 70 46 69 6c 65 2d 3e  tex_held(pFile->
1aec0 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20  mutex) );..  /* 
1aed0 4d 61 6b 65 20 73 75 72 65 20 6e 6f 20 73 69 62  Make sure no sib
1aee0 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  ling connections
1aef0 20 68 6f 6c 64 20 6c 6f 63 6b 73 20 74 68 61 74   hold locks that
1af00 20 77 69 6c 6c 20 62 6c 6f 63 6b 20 74 68 69 73   will block this
1af10 0a 20 20 2a 2a 20 6c 6f 63 6b 2e 20 20 49 66 20  .  ** lock.  If 
1af20 61 6e 79 20 64 6f 2c 20 72 65 74 75 72 6e 20 53  any do, return S
1af30 51 4c 49 54 45 5f 42 55 53 59 20 72 69 67 68 74  QLITE_BUSY right
1af40 20 61 77 61 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f   away..  */.  fo
1af50 72 28 70 58 3d 70 46 69 6c 65 2d 3e 70 46 69 72  r(pX=pFile->pFir
1af60 73 74 3b 20 70 58 3b 20 70 58 3d 70 58 2d 3e 70  st; pX; pX=pX->p
1af70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70  Next){.    if( p
1af80 58 3d 3d 70 20 29 20 63 6f 6e 74 69 6e 75 65 3b  X==p ) continue;
1af90 0a 20 20 20 20 69 66 28 20 28 70 58 2d 3e 65 78  .    if( (pX->ex
1afa0 63 6c 4d 61 73 6b 20 26 20 77 72 69 74 65 4d 61  clMask & writeMa
1afb0 73 6b 29 21 3d 30 20 29 20 72 65 74 75 72 6e 20  sk)!=0 ) return 
1afc0 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
1afd0 20 69 66 28 20 28 70 58 2d 3e 73 68 61 72 65 64   if( (pX->shared
1afe0 4d 61 73 6b 20 26 20 77 72 69 74 65 4d 61 73 6b  Mask & writeMask
1aff0 29 21 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  )!=0 ) return SQ
1b000 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 0a  LITE_BUSY;.  }..
1b010 20 20 2f 2a 20 47 65 74 20 74 68 65 20 65 78 63    /* Get the exc
1b020 6c 75 73 69 76 65 20 6c 6f 63 6b 73 20 61 74 20  lusive locks at 
1b030 74 68 65 20 73 79 73 74 65 6d 20 6c 65 76 65 6c  the system level
1b040 2e 20 20 54 68 65 6e 20 69 66 20 73 75 63 63 65  .  Then if succe
1b050 73 73 66 75 6c 0a 20 20 2a 2a 20 61 6c 73 6f 20  ssful.  ** also 
1b060 6d 61 72 6b 20 74 68 65 20 6c 6f 63 61 6c 20 63  mark the local c
1b070 6f 6e 6e 65 63 74 69 6f 6e 20 61 73 20 62 65 69  onnection as bei
1b080 6e 67 20 6c 6f 63 6b 65 64 2e 0a 20 20 2a 2f 0a  ng locked..  */.
1b090 20 20 72 63 20 3d 20 75 6e 69 78 53 68 6d 53 79    rc = unixShmSy
1b0a0 73 74 65 6d 4c 6f 63 6b 28 70 46 69 6c 65 2c 20  stemLock(pFile, 
1b0b0 46 5f 57 52 4c 43 4b 2c 20 77 72 69 74 65 4d 61  F_WRLCK, writeMa
1b0c0 73 6b 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  sk);.  if( rc==S
1b0d0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1b0e0 70 2d 3e 73 68 61 72 65 64 4d 61 73 6b 20 26 3d  p->sharedMask &=
1b0f0 20 7e 77 72 69 74 65 4d 61 73 6b 3b 0a 20 20 20   ~writeMask;.   
1b100 20 70 2d 3e 65 78 63 6c 4d 61 73 6b 20 7c 3d 20   p->exclMask |= 
1b110 77 72 69 74 65 4d 61 73 6b 3b 0a 20 20 7d 0a 20  writeMask;.  }. 
1b120 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1b130 2a 0a 2a 2a 20 50 75 72 67 65 20 74 68 65 20 75  *.** Purge the u
1b140 6e 69 78 53 68 6d 46 69 6c 65 4c 69 73 74 20 6c  nixShmFileList l
1b150 69 73 74 20 6f 66 20 61 6c 6c 20 65 6e 74 72 69  ist of all entri
1b160 65 73 20 77 69 74 68 20 75 6e 69 78 53 68 6d 46  es with unixShmF
1b170 69 6c 65 2e 6e 52 65 66 3d 3d 30 2e 0a 2a 2a 0a  ile.nRef==0..**.
1b180 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61  ** This is not a
1b190 20 56 46 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f   VFS shared-memo
1b1a0 72 79 20 6d 65 74 68 6f 64 3b 20 69 74 20 69 73  ry method; it is
1b1b0 20 61 20 75 74 69 6c 69 74 79 20 66 75 6e 63 74   a utility funct
1b1c0 69 6f 6e 20 63 61 6c 6c 65 64 0a 2a 2a 20 62 79  ion called.** by
1b1d0 20 56 46 53 20 73 68 61 72 65 64 2d 6d 65 6d 6f   VFS shared-memo
1b1e0 72 79 20 6d 65 74 68 6f 64 73 2e 0a 2a 2f 0a 73  ry methods..*/.s
1b1f0 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69 78 53  tatic void unixS
1b200 68 6d 50 75 72 67 65 28 76 6f 69 64 29 7b 0a 20  hmPurge(void){. 
1b210 20 75 6e 69 78 53 68 6d 46 69 6c 65 20 2a 2a 70   unixShmFile **p
1b220 70 3b 0a 20 20 75 6e 69 78 53 68 6d 46 69 6c 65  p;.  unixShmFile
1b230 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28 20 75   *p;.  assert( u
1b240 6e 69 78 4d 75 74 65 78 48 65 6c 64 28 29 20 29  nixMutexHeld() )
1b250 3b 0a 20 20 70 70 20 3d 20 26 75 6e 69 78 53 68  ;.  pp = &unixSh
1b260 6d 46 69 6c 65 4c 69 73 74 3b 0a 20 20 77 68 69  mFileList;.  whi
1b270 6c 65 28 20 28 70 20 3d 20 2a 70 70 29 21 3d 30  le( (p = *pp)!=0
1b280 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e   ){.    if( p->n
1b290 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Ref==0 ){.      
1b2a0 69 66 28 20 70 2d 3e 6d 75 74 65 78 20 29 20 73  if( p->mutex ) s
1b2b0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65  qlite3_mutex_fre
1b2c0 65 28 70 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20  e(p->mutex);.   
1b2d0 20 20 20 69 66 28 20 70 2d 3e 6d 75 74 65 78 42     if( p->mutexB
1b2e0 75 66 20 29 20 73 71 6c 69 74 65 33 5f 6d 75 74  uf ) sqlite3_mut
1b2f0 65 78 5f 66 72 65 65 28 70 2d 3e 6d 75 74 65 78  ex_free(p->mutex
1b300 42 75 66 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Buf);.      if( 
1b310 70 2d 3e 68 3e 3d 30 20 29 20 63 6c 6f 73 65 28  p->h>=0 ) close(
1b320 70 2d 3e 68 29 3b 0a 20 20 20 20 20 20 2a 70 70  p->h);.      *pp
1b330 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20   = p->pNext;.   
1b340 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
1b350 70 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  p);.    }else{. 
1b360 20 20 20 20 20 70 70 20 3d 20 26 70 2d 3e 70 4e       pp = &p->pN
1b370 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  ext;.    }.  }.}
1b380 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 73  ../*.** Open a s
1b390 68 61 72 65 64 2d 6d 65 6d 6f 72 79 20 61 72 65  hared-memory are
1b3a0 61 2e 20 20 54 68 69 73 20 70 61 72 74 69 63 75  a.  This particu
1b3b0 6c 61 72 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  lar implementati
1b3c0 6f 6e 20 75 73 65 73 0a 2a 2a 20 6d 6d 61 70 70  on uses.** mmapp
1b3d0 65 64 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  ed files..**.** 
1b3e0 7a 4e 61 6d 65 20 69 73 20 61 20 66 69 6c 65 6e  zName is a filen
1b3f0 61 6d 65 20 75 73 65 64 20 74 6f 20 69 64 65 6e  ame used to iden
1b400 74 69 66 79 20 74 68 65 20 73 68 61 72 65 64 2d  tify the shared-
1b410 6d 65 6d 6f 72 79 20 61 72 65 61 2e 20 20 54 68  memory area.  Th
1b420 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74  e.** implementat
1b430 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 28 61 6e  ion does not (an
1b440 64 20 70 65 72 68 61 70 73 20 73 68 6f 75 6c 64  d perhaps should
1b450 20 6e 6f 74 29 20 75 73 65 20 74 68 69 73 20 6e   not) use this n
1b460 61 6d 65 0a 2a 2a 20 64 69 72 65 63 74 6c 79 2c  ame.** directly,
1b470 20 62 75 74 20 72 61 74 68 65 72 20 75 73 65 20   but rather use 
1b480 69 74 20 61 73 20 61 20 74 65 6d 70 6c 61 74 65  it as a template
1b490 20 66 6f 72 20 66 69 6e 64 69 6e 67 20 61 6e 20   for finding an 
1b4a0 61 70 70 72 6f 70 72 69 61 74 65 0a 2a 2a 20 6e  appropriate.** n
1b4b0 61 6d 65 20 66 6f 72 20 74 68 65 20 73 68 61 72  ame for the shar
1b4c0 65 64 2d 6d 65 6d 6f 72 79 20 73 74 6f 72 61 67  ed-memory storag
1b4d0 65 2e 20 20 49 6e 20 74 68 69 73 20 69 6d 70 6c  e.  In this impl
1b4e0 65 6d 65 6e 74 61 74 69 6f 6e 2c 20 74 68 65 0a  ementation, the.
1b4f0 2a 2a 20 73 74 72 69 6e 67 20 22 2d 69 6e 64 65  ** string "-inde
1b500 78 22 20 69 73 20 61 70 70 65 6e 64 65 64 20 74  x" is appended t
1b510 6f 20 7a 4e 61 6d 65 20 61 6e 64 20 75 73 65 64  o zName and used
1b520 20 61 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   as the name of 
1b530 74 68 65 0a 2a 2a 20 6d 6d 61 70 70 65 64 20 66  the.** mmapped f
1b540 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  ile..**.** When 
1b550 6f 70 65 6e 69 6e 67 20 61 20 6e 65 77 20 73 68  opening a new sh
1b560 61 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65  ared-memory file
1b570 2c 20 69 66 20 6e 6f 20 6f 74 68 65 72 20 69 6e  , if no other in
1b580 73 74 61 6e 63 65 73 20 6f 66 20 74 68 61 74 0a  stances of that.
1b590 2a 2a 20 66 69 6c 65 20 61 72 65 20 63 75 72 72  ** file are curr
1b5a0 65 6e 74 6c 79 20 6f 70 65 6e 2c 20 69 6e 20 74  ently open, in t
1b5b0 68 69 73 20 70 72 6f 63 65 73 73 20 6f 72 20 69  his process or i
1b5c0 6e 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 65  n other processe
1b5d0 73 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 66  s, then.** the f
1b5e0 69 6c 65 20 6d 75 73 74 20 62 65 20 74 72 75 6e  ile must be trun
1b5f0 63 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 6c 65  cated to zero le
1b600 6e 67 74 68 20 6f 72 20 68 61 76 65 20 69 74 73  ngth or have its
1b610 20 68 65 61 64 65 72 20 63 6c 65 61 72 65 64 2e   header cleared.
1b620 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75  .*/.static int u
1b630 6e 69 78 53 68 6d 4f 70 65 6e 28 0a 20 20 73 71  nixShmOpen(.  sq
1b640 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 20 20  lite3_file *fd  
1b650 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20      /* The file 
1b660 64 65 73 63 72 69 70 74 6f 72 20 6f 66 20 74 68  descriptor of th
1b670 65 20 61 73 73 6f 63 69 61 74 65 64 20 64 61 74  e associated dat
1b680 61 62 61 73 65 20 2a 2f 0a 29 7b 0a 20 20 73 74  abase */.){.  st
1b690 72 75 63 74 20 75 6e 69 78 53 68 6d 20 2a 70 20  ruct unixShm *p 
1b6a0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
1b6b0 20 2f 2a 20 54 68 65 20 63 6f 6e 6e 65 63 74 69   /* The connecti
1b6c0 6f 6e 20 74 6f 20 62 65 20 6f 70 65 6e 65 64 20  on to be opened 
1b6d0 2a 2f 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78  */.  struct unix
1b6e0 53 68 6d 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  ShmFile *pFile =
1b6f0 20 30 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 75   0;     /* The u
1b700 6e 64 65 72 6c 79 69 6e 67 20 6d 6d 61 70 70 65  nderlying mmappe
1b710 64 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  d file */.  int 
1b720 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
1b730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1b740 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f  * Result code */
1b750 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78 46 69  .  struct unixFi
1b760 6c 65 49 64 20 66 69 64 3b 20 20 20 20 20 20 20  leId fid;       
1b770 20 20 20 20 20 20 2f 2a 20 55 6e 69 78 20 66 69        /* Unix fi
1b780 6c 65 20 69 64 65 6e 74 69 66 69 65 72 20 2a 2f  le identifier */
1b790 0a 20 20 73 74 72 75 63 74 20 75 6e 69 78 53 68  .  struct unixSh
1b7a0 6d 46 69 6c 65 20 2a 70 4e 65 77 3b 20 20 20 20  mFile *pNew;    
1b7b0 20 20 20 20 20 20 2f 2a 20 4e 65 77 6c 79 20 61        /* Newly a
1b7c0 6c 6c 6f 63 61 74 65 64 20 70 46 69 6c 65 20 2a  llocated pFile *
1b7d0 2f 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 20  /.  struct stat 
1b7e0 73 53 74 61 74 3b 20 20 20 20 20 20 20 20 20 20  sStat;          
1b7f0 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
1b800 20 66 72 6f 6d 20 73 74 61 74 28 29 20 61 6e 20   from stat() an 
1b810 66 73 74 61 74 28 29 20 2a 2f 0a 20 20 73 74 72  fstat() */.  str
1b820 75 63 74 20 75 6e 69 78 46 69 6c 65 20 2a 70 44  uct unixFile *pD
1b830 62 46 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  bFd;            
1b840 2f 2a 20 55 6e 64 65 72 6c 79 69 6e 67 20 64 61  /* Underlying da
1b850 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
1b860 20 69 6e 74 20 6e 50 61 74 68 3b 20 20 20 20 20   int nPath;     
1b870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b880 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 70      /* Size of p
1b890 44 62 46 64 2d 3e 7a 50 61 74 68 20 69 6e 20 62  DbFd->zPath in b
1b8a0 79 74 65 73 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c  ytes */..  /* Al
1b8b0 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72  locate space for
1b8c0 20 74 68 65 20 6e 65 77 20 73 71 6c 69 74 65 33   the new sqlite3
1b8d0 5f 73 68 6d 20 6f 62 6a 65 63 74 2e 20 20 41 6c  _shm object.  Al
1b8e0 73 6f 20 73 70 65 63 75 6c 61 74 69 76 65 6c 79  so speculatively
1b8f0 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 20 73  .  ** allocate s
1b900 70 61 63 65 20 66 6f 72 20 61 20 6e 65 77 20 75  pace for a new u
1b910 6e 69 78 53 68 6d 46 69 6c 65 20 61 6e 64 20 66  nixShmFile and f
1b920 69 6c 65 6e 61 6d 65 2e 0a 20 20 2a 2f 0a 20 20  ilename..  */.  
1b930 70 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  p = sqlite3_mall
1b940 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 29 20 29  oc( sizeof(*p) )
1b950 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
1b960 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
1b970 45 4d 3b 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20  EM;.  memset(p, 
1b980 30 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a  0, sizeof(*p));.
1b990 20 20 70 44 62 46 64 20 3d 20 28 73 74 72 75 63    pDbFd = (struc
1b9a0 74 20 75 6e 69 78 46 69 6c 65 2a 29 66 64 3b 0a  t unixFile*)fd;.
1b9b0 20 20 61 73 73 65 72 74 28 20 70 44 62 46 64 2d    assert( pDbFd-
1b9c0 3e 70 53 68 6d 3d 3d 30 20 29 3b 0a 20 20 6e 50  >pShm==0 );.  nP
1b9d0 61 74 68 20 3d 20 73 74 72 6c 65 6e 28 70 44 62  ath = strlen(pDb
1b9e0 46 64 2d 3e 7a 50 61 74 68 29 3b 0a 20 20 70 4e  Fd->zPath);.  pN
1b9f0 65 77 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  ew = sqlite3_mal
1ba00 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 46 69  loc( sizeof(*pFi
1ba10 6c 65 29 20 2b 20 6e 50 61 74 68 20 2b 20 31 35  le) + nPath + 15
1ba20 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d   );.  if( pNew==
1ba30 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
1ba40 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 72 65  _free(p);.    re
1ba50 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
1ba60 4d 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28  M;.  }.  memset(
1ba70 70 4e 65 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28  pNew, 0, sizeof(
1ba80 2a 70 4e 65 77 29 29 3b 0a 20 20 70 4e 65 77 2d  *pNew));.  pNew-
1ba90 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 28 63 68  >zFilename = (ch
1baa0 61 72 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a 20 20  ar*)&pNew[1];.  
1bab0 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
1bac0 28 6e 50 61 74 68 2b 31 35 2c 20 70 4e 65 77 2d  (nPath+15, pNew-
1bad0 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 25 73 2d  >zFilename, "%s-
1bae0 77 61 6c 2d 69 6e 64 65 78 22 2c 20 70 44 62 46  wal-index", pDbF
1baf0 64 2d 3e 7a 50 61 74 68 29 3b 0a 0a 20 20 2f 2a  d->zPath);..  /*
1bb00 20 4c 6f 6f 6b 20 74 6f 20 73 65 65 20 69 66 20   Look to see if 
1bb10 74 68 65 72 65 20 69 73 20 61 6e 20 65 78 69 73  there is an exis
1bb20 74 69 6e 67 20 75 6e 69 78 53 68 6d 46 69 6c 65  ting unixShmFile
1bb30 20 74 68 61 74 20 63 61 6e 20 62 65 20 75 73 65   that can be use
1bb40 64 2e 0a 20 20 2a 2a 20 49 66 20 6e 6f 20 6d 61  d..  ** If no ma
1bb50 74 63 68 69 6e 67 20 75 6e 69 78 53 68 6d 46 69  tching unixShmFi
1bb60 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 65 78 69  le currently exi
1bb70 73 74 73 2c 20 63 72 65 61 74 65 20 61 20 6e 65  sts, create a ne
1bb80 77 20 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 75 6e  w one..  */.  un
1bb90 69 78 45 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a  ixEnterMutex();.
1bba0 20 20 72 63 20 3d 20 73 74 61 74 28 70 4e 65 77    rc = stat(pNew
1bbb0 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 26 73 53  ->zFilename, &sS
1bbc0 74 61 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  tat);.  if( rc==
1bbd0 30 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28  0 ){.    memset(
1bbe0 26 66 69 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28  &fid, 0, sizeof(
1bbf0 66 69 64 29 29 3b 0a 20 20 20 20 66 69 64 2e 64  fid));.    fid.d
1bc00 65 76 20 3d 20 73 53 74 61 74 2e 73 74 5f 64 65  ev = sStat.st_de
1bc10 76 3b 0a 20 20 20 20 66 69 64 2e 69 6e 6f 20 3d  v;.    fid.ino =
1bc20 20 73 53 74 61 74 2e 73 74 5f 69 6e 6f 3b 0a 20   sStat.st_ino;. 
1bc30 20 20 20 66 6f 72 28 70 46 69 6c 65 20 3d 20 75     for(pFile = u
1bc40 6e 69 78 53 68 6d 46 69 6c 65 4c 69 73 74 3b 20  nixShmFileList; 
1bc50 70 46 69 6c 65 3b 20 70 46 69 6c 65 3d 70 46 69  pFile; pFile=pFi
1bc60 6c 65 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  le->pNext){.    
1bc70 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 26 70 46    if( memcmp(&pF
1bc80 69 6c 65 2d 3e 66 69 64 2c 20 26 66 69 64 2c 20  ile->fid, &fid, 
1bc90 73 69 7a 65 6f 66 28 66 69 64 29 29 3d 3d 30 20  sizeof(fid))==0 
1bca0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20  ) break;.    }. 
1bcb0 20 7d 0a 20 20 69 66 28 20 70 46 69 6c 65 20 29   }.  if( pFile )
1bcc0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
1bcd0 65 65 28 70 4e 65 77 29 3b 0a 20 20 7d 65 6c 73  ee(pNew);.  }els
1bce0 65 7b 0a 20 20 20 20 70 46 69 6c 65 20 3d 20 70  e{.    pFile = p
1bcf0 4e 65 77 3b 0a 20 20 20 20 70 4e 65 77 20 3d 20  New;.    pNew = 
1bd00 30 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 68 20  0;.    pFile->h 
1bd10 3d 20 2d 31 3b 0a 20 20 20 20 70 46 69 6c 65 2d  = -1;.    pFile-
1bd20 3e 70 4e 65 78 74 20 3d 20 75 6e 69 78 53 68 6d  >pNext = unixShm
1bd30 46 69 6c 65 4c 69 73 74 3b 0a 20 20 20 20 75 6e  FileList;.    un
1bd40 69 78 53 68 6d 46 69 6c 65 4c 69 73 74 20 3d 20  ixShmFileList = 
1bd50 70 46 69 6c 65 3b 0a 0a 20 20 20 20 70 46 69 6c  pFile;..    pFil
1bd60 65 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69 74  e->mutex = sqlit
1bd70 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53  e3_mutex_alloc(S
1bd80 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41 53 54  QLITE_MUTEX_FAST
1bd90 29 3b 0a 20 20 20 20 69 66 28 20 70 46 69 6c 65  );.    if( pFile
1bda0 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20  ->mutex==0 ){.  
1bdb0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1bdc0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74  NOMEM;.      got
1bdd0 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65 72 72 3b 0a  o shm_open_err;.
1bde0 20 20 20 20 7d 0a 20 20 20 20 70 46 69 6c 65 2d      }.    pFile-
1bdf0 3e 6d 75 74 65 78 42 75 66 20 3d 20 73 71 6c 69  >mutexBuf = sqli
1be00 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28  te3_mutex_alloc(
1be10 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41 53  SQLITE_MUTEX_FAS
1be20 54 29 3b 0a 20 20 20 20 69 66 28 20 70 46 69 6c  T);.    if( pFil
1be30 65 2d 3e 6d 75 74 65 78 42 75 66 3d 3d 30 20 29  e->mutexBuf==0 )
1be40 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
1be50 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
1be60 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65   goto shm_open_e
1be70 72 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70  rr;.    }..    p
1be80 46 69 6c 65 2d 3e 68 20 3d 20 6f 70 65 6e 28 70  File->h = open(p
1be90 46 69 6c 65 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c  File->zFilename,
1bea0 20 4f 5f 52 44 57 52 7c 4f 5f 43 52 45 41 54 2c   O_RDWR|O_CREAT,
1beb0 20 30 36 36 34 29 3b 0a 20 20 20 20 69 66 28 20   0664);.    if( 
1bec0 70 46 69 6c 65 2d 3e 68 3c 30 20 29 7b 0a 20 20  pFile->h<0 ){.  
1bed0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1bee0 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20  CANTOPEN_BKPT;. 
1bef0 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f 70       goto shm_op
1bf00 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 0a 20  en_err;.    }.. 
1bf10 20 20 20 72 63 20 3d 20 66 73 74 61 74 28 70 46     rc = fstat(pF
1bf20 69 6c 65 2d 3e 68 2c 20 26 73 53 74 61 74 29 3b  ile->h, &sStat);
1bf30 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
1bf40 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1bf50 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a  _CANTOPEN_BKPT;.
1bf60 20 20 20 20 20 20 67 6f 74 6f 20 73 68 6d 5f 6f        goto shm_o
1bf70 70 65 6e 5f 65 72 72 3b 0a 20 20 20 20 7d 0a 20  pen_err;.    }. 
1bf80 20 20 20 70 46 69 6c 65 2d 3e 66 69 64 2e 64 65     pFile->fid.de
1bf90 76 20 3d 20 73 53 74 61 74 2e 73 74 5f 64 65 76  v = sStat.st_dev
1bfa0 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 66 69 64  ;.    pFile->fid
1bfb0 2e 69 6e 6f 20 3d 20 73 53 74 61 74 2e 73 74 5f  .ino = sStat.st_
1bfc0 69 6e 6f 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65  ino;..    /* Che
1bfd0 63 6b 20 74 6f 20 73 65 65 20 69 66 20 61 6e 6f  ck to see if ano
1bfe0 74 68 65 72 20 70 72 6f 63 65 73 73 20 69 73 20  ther process is 
1bff0 68 6f 6c 64 69 6e 67 20 74 68 65 20 64 65 61 64  holding the dead
1c000 2d 6d 61 6e 20 73 77 69 74 63 68 2e 0a 20 20 20  -man switch..   
1c010 20 2a 2a 20 49 66 20 6e 6f 74 2c 20 74 72 75 6e   ** If not, trun
1c020 63 61 74 65 20 74 68 65 20 66 69 6c 65 20 74 6f  cate the file to
1c030 20 7a 65 72 6f 20 6c 65 6e 67 74 68 2e 20 0a 20   zero length. . 
1c040 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 75 6e     */.    if( un
1c050 69 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28  ixShmSystemLock(
1c060 70 46 69 6c 65 2c 20 46 5f 57 52 4c 43 4b 2c 20  pFile, F_WRLCK, 
1c070 55 4e 49 58 5f 53 48 4d 5f 44 4d 53 29 3d 3d 53  UNIX_SHM_DMS)==S
1c080 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1c090 20 20 69 66 28 20 66 74 72 75 6e 63 61 74 65 28    if( ftruncate(
1c0a0 70 46 69 6c 65 2d 3e 68 2c 20 30 29 20 29 7b 0a  pFile->h, 0) ){.
1c0b0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
1c0c0 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20 20  ITE_IOERR;.     
1c0d0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
1c0e0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1c0f0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69  {.      rc = uni
1c100 78 53 68 6d 53 79 73 74 65 6d 4c 6f 63 6b 28 70  xShmSystemLock(p
1c110 46 69 6c 65 2c 20 46 5f 52 44 4c 43 4b 2c 20 55  File, F_RDLCK, U
1c120 4e 49 58 5f 53 48 4d 5f 44 4d 53 29 3b 0a 20 20  NIX_SHM_DMS);.  
1c130 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 20 29    }.    if( rc )
1c140 20 67 6f 74 6f 20 73 68 6d 5f 6f 70 65 6e 5f 65   goto shm_open_e
1c150 72 72 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61  rr;.  }..  /* Ma
1c160 6b 65 20 74 68 65 20 6e 65 77 20 63 6f 6e 6e 65  ke the new conne
1c170 63 74 69 6f 6e 20 61 20 63 68 69 6c 64 20 6f 66  ction a child of
1c180 20 74 68 65 20 75 6e 69 78 53 68 6d 46 69 6c 65   the unixShmFile
1c190 20 2a 2f 0a 20 20 70 2d 3e 70 46 69 6c 65 20 3d   */.  p->pFile =
1c1a0 20 70 46 69 6c 65 3b 0a 20 20 70 2d 3e 70 4e 65   pFile;.  p->pNe
1c1b0 78 74 20 3d 20 70 46 69 6c 65 2d 3e 70 46 69 72  xt = pFile->pFir
1c1c0 73 74 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  st;.#ifdef SQLIT
1c1d0 45 5f 44 45 42 55 47 0a 20 20 70 2d 3e 69 64 20  E_DEBUG.  p->id 
1c1e0 3d 20 70 46 69 6c 65 2d 3e 6e 65 78 74 53 68 6d  = pFile->nextShm
1c1f0 49 64 2b 2b 3b 0a 23 65 6e 64 69 66 0a 20 20 70  Id++;.#endif.  p
1c200 46 69 6c 65 2d 3e 70 46 69 72 73 74 20 3d 20 70  File->pFirst = p
1c210 3b 0a 20 20 70 46 69 6c 65 2d 3e 6e 52 65 66 2b  ;.  pFile->nRef+
1c220 2b 3b 0a 20 20 70 44 62 46 64 2d 3e 70 53 68 6d  +;.  pDbFd->pShm
1c230 20 3d 20 70 3b 0a 20 20 75 6e 69 78 4c 65 61 76   = p;.  unixLeav
1c240 65 4d 75 74 65 78 28 29 3b 0a 20 20 72 65 74 75  eMutex();.  retu
1c250 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20  rn SQLITE_OK;.. 
1c260 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 6f 6e   /* Jump here on
1c270 20 61 6e 79 20 65 72 72 6f 72 20 2a 2f 0a 73 68   any error */.sh
1c280 6d 5f 6f 70 65 6e 5f 65 72 72 3a 0a 20 20 75 6e  m_open_err:.  un
1c290 69 78 53 68 6d 50 75 72 67 65 28 29 3b 20 20 20  ixShmPurge();   
1c2a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c2b0 20 54 68 69 73 20 63 61 6c 6c 20 66 72 65 65 73   This call frees
1c2c0 20 70 46 69 6c 65 20 69 66 20 72 65 71 75 69 72   pFile if requir
1c2d0 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ed */.  sqlite3_
1c2e0 66 72 65 65 28 70 29 3b 0a 20 20 73 71 6c 69 74  free(p);.  sqlit
1c2f0 65 33 5f 66 72 65 65 28 70 4e 65 77 29 3b 0a 20  e3_free(pNew);. 
1c300 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
1c310 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
1c320 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
1c330 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 73   connection to s
1c340 68 61 72 65 64 2d 6d 65 6d 6f 72 79 2e 20 20 44  hared-memory.  D
1c350 65 6c 65 74 65 20 74 68 65 20 75 6e 64 65 72 6c  elete the underl
1c360 79 69 6e 67 20 0a 2a 2a 20 73 74 6f 72 61 67 65  ying .** storage
1c370 20 69 66 20 64 65 6c 65 74 65 46 6c 61 67 20 69   if deleteFlag i
1c380 73 20 74 72 75 65 2e 0a 2a 2f 0a 73 74 61 74 69  s true..*/.stati
1c390 63 20 69 6e 74 20 75 6e 69 78 53 68 6d 43 6c 6f  c int unixShmClo
1c3a0 73 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  se(.  sqlite3_fi
1c3b0 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20 20 20  le *fd,         
1c3c0 20 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69   /* The underlyi
1c3d0 6e 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ng database file
1c3e0 20 2a 2f 0a 20 20 69 6e 74 20 64 65 6c 65 74 65   */.  int delete
1c3f0 46 6c 61 67 20 20 20 20 20 20 20 20 20 20 20 20  Flag            
1c400 20 2f 2a 20 44 65 6c 65 74 65 20 73 68 61 72 65   /* Delete share
1c410 64 2d 6d 65 6d 6f 72 79 20 69 66 20 74 72 75 65  d-memory if true
1c420 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 53 68 6d   */.){.  unixShm
1c430 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   *p;            
1c440 2f 2a 20 54 68 65 20 63 6f 6e 6e 65 63 74 69 6f  /* The connectio
1c450 6e 20 74 6f 20 62 65 20 63 6c 6f 73 65 64 20 2a  n to be closed *
1c460 2f 0a 20 20 75 6e 69 78 53 68 6d 46 69 6c 65 20  /.  unixShmFile 
1c470 2a 70 46 69 6c 65 3b 20 20 20 20 2f 2a 20 54 68  *pFile;    /* Th
1c480 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 73 68 61  e underlying sha
1c490 72 65 64 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20  red-memory file 
1c4a0 2a 2f 0a 20 20 75 6e 69 78 53 68 6d 20 2a 2a 70  */.  unixShm **p
1c4b0 70 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  p;          /* F
1c4c0 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20  or looping over 
1c4d0 73 69 62 6c 69 6e 67 20 63 6f 6e 6e 65 63 74 69  sibling connecti
1c4e0 6f 6e 73 20 2a 2f 0a 20 20 75 6e 69 78 46 69 6c  ons */.  unixFil
1c4f0 65 20 2a 70 44 62 46 64 3b 20 20 20 20 20 20 20  e *pDbFd;       
1c500 2f 2a 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e  /* The underlyin
1c510 67 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  g database file 
1c520 2a 2f 0a 0a 20 20 70 44 62 46 64 20 3d 20 28 75  */..  pDbFd = (u
1c530 6e 69 78 46 69 6c 65 2a 29 66 64 3b 0a 20 20 70  nixFile*)fd;.  p
1c540 20 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a   = pDbFd->pShm;.
1c550 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
1c560 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1c570 20 70 46 69 6c 65 20 3d 20 70 2d 3e 70 46 69 6c   pFile = p->pFil
1c580 65 3b 0a 0a 20 20 2f 2a 20 56 65 72 69 66 79 20  e;..  /* Verify 
1c590 74 68 61 74 20 74 68 65 20 63 6f 6e 6e 65 63 74  that the connect
1c5a0 69 6f 6e 20 62 65 69 6e 67 20 63 6c 6f 73 65 64  ion being closed
1c5b0 20 68 6f 6c 64 73 20 6e 6f 20 6c 6f 63 6b 73 20   holds no locks 
1c5c0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  */.  assert( p->
1c5d0 65 78 63 6c 4d 61 73 6b 3d 3d 30 20 29 3b 0a 20  exclMask==0 );. 
1c5e0 20 61 73 73 65 72 74 28 20 70 2d 3e 73 68 61 72   assert( p->shar
1c5f0 65 64 4d 61 73 6b 3d 3d 30 20 29 3b 0a 0a 20 20  edMask==0 );..  
1c600 2f 2a 20 52 65 6d 6f 76 65 20 63 6f 6e 6e 65 63  /* Remove connec
1c610 74 69 6f 6e 20 70 20 66 72 6f 6d 20 74 68 65 20  tion p from the 
1c620 73 65 74 20 6f 66 20 63 6f 6e 6e 65 63 74 69 6f  set of connectio
1c630 6e 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ns associated wi
1c640 74 68 20 70 46 69 6c 65 20 2a 2f 0a 20 20 73 71  th pFile */.  sq
1c650 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
1c660 72 28 70 46 69 6c 65 2d 3e 6d 75 74 65 78 29 3b  r(pFile->mutex);
1c670 0a 20 20 66 6f 72 28 70 70 3d 26 70 46 69 6c 65  .  for(pp=&pFile
1c680 2d 3e 70 46 69 72 73 74 3b 20 28 2a 70 70 29 21  ->pFirst; (*pp)!
1c690 3d 70 3b 20 70 70 20 3d 20 26 28 2a 70 70 29 2d  =p; pp = &(*pp)-
1c6a0 3e 70 4e 65 78 74 29 7b 7d 0a 20 20 2a 70 70 20  >pNext){}.  *pp 
1c6b0 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 0a 20 20 2f  = p->pNext;..  /
1c6c0 2a 20 46 72 65 65 20 74 68 65 20 63 6f 6e 6e 65  * Free the conne
1c6d0 63 74 69 6f 6e 20 70 20 2a 2f 0a 20 20 73 71 6c  ction p */.  sql
1c6e0 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
1c6f0 70 44 62 46 64 2d 3e 70 53 68 6d 20 3d 20 30 3b  pDbFd->pShm = 0;
1c700 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
1c710 5f 6c 65 61 76 65 28 70 46 69 6c 65 2d 3e 6d 75  _leave(pFile->mu
1c720 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70  tex);..  /* If p
1c730 46 69 6c 65 2d 3e 6e 52 65 66 20 68 61 73 20 72  File->nRef has r
1c740 65 61 63 68 65 64 20 30 2c 20 74 68 65 6e 20 63  eached 0, then c
1c750 6c 6f 73 65 20 74 68 65 20 75 6e 64 65 72 6c 79  lose the underly
1c760 69 6e 67 0a 20 20 2a 2a 20 73 68 61 72 65 64 2d  ing.  ** shared-
1c770 6d 65 6d 6f 72 79 20 66 69 6c 65 2c 20 74 6f 6f  memory file, too
1c780 20 2a 2f 0a 20 20 75 6e 69 78 45 6e 74 65 72 4d   */.  unixEnterM
1c790 75 74 65 78 28 29 3b 0a 20 20 61 73 73 65 72 74  utex();.  assert
1c7a0 28 20 70 46 69 6c 65 2d 3e 6e 52 65 66 3e 30 20  ( pFile->nRef>0 
1c7b0 29 3b 0a 20 20 70 46 69 6c 65 2d 3e 6e 52 65 66  );.  pFile->nRef
1c7c0 2d 2d 3b 0a 20 20 69 66 28 20 70 46 69 6c 65 2d  --;.  if( pFile-
1c7d0 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20  >nRef==0 ){.    
1c7e0 69 66 28 20 64 65 6c 65 74 65 46 6c 61 67 20 29  if( deleteFlag )
1c7f0 20 75 6e 6c 69 6e 6b 28 70 46 69 6c 65 2d 3e 7a   unlink(pFile->z
1c800 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 75  Filename);.    u
1c810 6e 69 78 53 68 6d 50 75 72 67 65 28 29 3b 0a 20  nixShmPurge();. 
1c820 20 7d 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75   }.  unixLeaveMu
1c830 74 65 78 28 29 3b 0a 0a 20 20 72 65 74 75 72 6e  tex();..  return
1c840 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
1c850 2a 0a 2a 2a 20 51 75 65 72 79 20 61 6e 64 2f 6f  *.** Query and/o
1c860 72 20 63 68 61 6e 67 65 73 20 74 68 65 20 73 69  r changes the si
1c870 7a 65 20 6f 66 20 74 68 65 20 75 6e 64 65 72 6c  ze of the underl
1c880 79 69 6e 67 20 73 74 6f 72 61 67 65 20 66 6f 72  ying storage for
1c890 0a 2a 2a 20 61 20 73 68 61 72 65 64 2d 6d 65 6d  .** a shared-mem
1c8a0 6f 72 79 20 73 65 67 6d 65 6e 74 2e 20 20 54 68  ory segment.  Th
1c8b0 65 20 72 65 71 53 69 7a 65 20 70 61 72 61 6d 65  e reqSize parame
1c8c0 74 65 72 20 69 73 20 74 68 65 20 6e 65 77 20 73  ter is the new s
1c8d0 69 7a 65 0a 2a 2a 20 6f 66 20 74 68 65 20 75 6e  ize.** of the un
1c8e0 64 65 72 6c 79 69 6e 67 20 73 74 6f 72 61 67 65  derlying storage
1c8f0 2c 20 6f 72 20 2d 31 20 74 6f 20 64 6f 20 6a 75  , or -1 to do ju
1c900 73 74 20 61 20 71 75 65 72 79 2e 20 20 54 68 65  st a query.  The
1c910 20 73 69 7a 65 0a 2a 2a 20 6f 66 20 74 68 65 20   size.** of the 
1c920 75 6e 64 65 72 6c 79 69 6e 67 20 73 74 6f 72 61  underlying stora
1c930 67 65 20 28 61 66 74 65 72 20 72 65 73 69 7a 69  ge (after resizi
1c940 6e 67 20 69 66 20 72 65 73 69 7a 69 6e 67 20 6f  ng if resizing o
1c950 63 63 75 72 73 29 20 69 73 0a 2a 2a 20 77 72 69  ccurs) is.** wri
1c960 74 74 65 6e 20 69 6e 74 6f 20 70 4e 65 77 53 69  tten into pNewSi
1c970 7a 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ze..**.** This r
1c980 6f 75 74 69 6e 65 20 64 6f 65 73 20 6e 6f 74 20  outine does not 
1c990 28 6e 65 63 65 73 73 61 72 69 6c 79 29 20 63 68  (necessarily) ch
1c9a0 61 6e 67 65 20 74 68 65 20 73 69 7a 65 20 6f 66  ange the size of
1c9b0 20 74 68 65 20 6d 61 70 70 69 6e 67 20 0a 2a 2a   the mapping .**
1c9c0 20 6f 66 20 74 68 65 20 75 6e 64 65 72 6c 79 69   of the underlyi
1c9d0 6e 67 20 73 74 6f 72 61 67 65 20 69 6e 74 6f 20  ng storage into 
1c9e0 6d 65 6d 6f 72 79 2e 20 20 55 73 65 20 78 53 68  memory.  Use xSh
1c9f0 6d 47 65 74 28 29 20 74 6f 20 63 68 61 6e 67 65  mGet() to change
1ca00 0a 2a 2a 20 74 68 65 20 6d 61 70 70 69 6e 67 20  .** the mapping 
1ca10 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  size..**.** The 
1ca20 72 65 71 53 69 7a 65 20 70 61 72 61 6d 65 74 65  reqSize paramete
1ca30 72 20 69 73 20 74 68 65 20 6d 69 6e 69 6d 75 6d  r is the minimum
1ca40 20 73 69 7a 65 20 72 65 71 75 65 73 74 65 64 2e   size requested.
1ca50 20 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61    The implementa
1ca60 74 69 6f 6e 0a 2a 2a 20 69 73 20 66 72 65 65 20  tion.** is free 
1ca70 74 6f 20 65 78 70 61 6e 64 20 74 68 65 20 73 74  to expand the st
1ca80 6f 72 61 67 65 20 74 6f 20 73 6f 6d 65 20 6c 61  orage to some la
1ca90 72 67 65 72 20 61 6d 6f 75 6e 74 20 69 66 20 69  rger amount if i
1caa0 74 20 63 68 6f 6f 73 65 73 2e 0a 2a 2f 0a 73 74  t chooses..*/.st
1cab0 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 68 6d  atic int unixShm
1cac0 53 69 7a 65 28 0a 20 20 73 71 6c 69 74 65 33 5f  Size(.  sqlite3_
1cad0 66 69 6c 65 20 2a 66 64 2c 20 20 20 20 20 20 20  file *fd,       
1cae0 20 20 2f 2a 20 54 68 65 20 6f 70 65 6e 20 64 61    /* The open da
1caf0 74 61 62 61 73 65 20 66 69 6c 65 20 68 6f 6c 64  tabase file hold
1cb00 69 6e 67 20 53 48 4d 20 2a 2f 0a 20 20 69 6e 74  ing SHM */.  int
1cb10 20 72 65 71 53 69 7a 65 2c 20 20 20 20 20 20 20   reqSize,       
1cb20 20 20 20 20 20 20 20 2f 2a 20 52 65 71 75 65 73         /* Reques
1cb30 74 65 64 20 73 69 7a 65 2e 20 20 2d 31 20 66 6f  ted size.  -1 fo
1cb40 72 20 71 75 65 72 79 20 6f 6e 6c 79 20 2a 2f 0a  r query only */.
1cb50 20 20 69 6e 74 20 2a 70 4e 65 77 53 69 7a 65 20    int *pNewSize 
1cb60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
1cb70 72 69 74 65 20 6e 65 77 20 73 69 7a 65 20 68 65  rite new size he
1cb80 72 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 69 78 46  re */.){.  unixF
1cb90 69 6c 65 20 2a 70 44 62 46 64 20 3d 20 28 75 6e  ile *pDbFd = (un
1cba0 69 78 46 69 6c 65 2a 29 66 64 3b 0a 20 20 75 6e  ixFile*)fd;.  un
1cbb0 69 78 53 68 6d 20 2a 70 20 3d 20 70 44 62 46 64  ixShm *p = pDbFd
1cbc0 2d 3e 70 53 68 6d 3b 0a 20 20 75 6e 69 78 53 68  ->pShm;.  unixSh
1cbd0 6d 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 70  mFile *pFile = p
1cbe0 2d 3e 70 46 69 6c 65 3b 0a 20 20 69 6e 74 20 72  ->pFile;.  int r
1cbf0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1cc00 20 73 74 72 75 63 74 20 73 74 61 74 20 73 53 74   struct stat sSt
1cc10 61 74 3b 0a 0a 20 20 2f 2a 20 4f 6e 20 61 20 71  at;..  /* On a q
1cc20 75 65 72 79 2c 20 74 68 69 73 20 6c 6f 6f 70 20  uery, this loop 
1cc30 72 75 6e 73 20 6f 6e 63 65 2e 20 20 57 68 65 6e  runs once.  When
1cc40 20 72 65 71 53 69 7a 65 3e 3d 30 2c 20 74 68 65   reqSize>=0, the
1cc50 20 6c 6f 6f 70 20 70 6f 74 65 6e 74 69 61 6c 6c   loop potentiall
1cc60 79 0a 20 20 2a 2a 20 72 75 6e 73 20 74 77 69 63  y.  ** runs twic
1cc70 65 2c 20 65 78 63 65 70 74 20 69 66 20 74 68 65  e, except if the
1cc80 20 61 63 74 75 61 6c 20 73 69 7a 65 20 69 73 20   actual size is 
1cc90 61 6c 72 65 61 64 79 20 67 72 65 61 74 65 72 20  already greater 
1cca0 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a 20 20  than or equal.  
1ccb0 2a 2a 20 74 6f 20 74 68 65 20 72 65 71 75 65 73  ** to the reques
1ccc0 74 65 64 20 73 69 7a 65 2c 20 72 65 71 53 69 7a  ted size, reqSiz
1ccd0 65 20 69 73 20 73 65 74 20 74 6f 20 2d 31 20 6f  e is set to -1 o
1cce0 6e 20 74 68 65 20 66 69 72 73 74 20 69 74 65 72  n the first iter
1ccf0 61 74 69 6f 6e 20 61 6e 64 0a 20 20 2a 2a 20 74  ation and.  ** t
1cd00 68 65 20 6c 6f 6f 70 20 6f 6e 6c 79 20 72 75 6e  he loop only run
1cd10 73 20 6f 6e 63 65 2e 0a 20 20 2a 2f 0a 20 20 77  s once..  */.  w
1cd20 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20 20 69  hile( 1 ){.    i
1cd30 66 28 20 66 73 74 61 74 28 70 46 69 6c 65 2d 3e  f( fstat(pFile->
1cd40 68 2c 20 26 73 53 74 61 74 29 3d 3d 30 20 29 7b  h, &sStat)==0 ){
1cd50 0a 20 20 20 20 20 20 2a 70 4e 65 77 53 69 7a 65  .      *pNewSize
1cd60 20 3d 20 28 69 6e 74 29 73 53 74 61 74 2e 73 74   = (int)sStat.st
1cd70 5f 73 69 7a 65 3b 0a 20 20 20 20 20 20 69 66 28  _size;.      if(
1cd80 20 72 65 71 53 69 7a 65 3e 3d 30 20 26 26 20 72   reqSize>=0 && r
1cd90 65 71 53 69 7a 65 3c 3d 28 69 6e 74 29 73 53 74  eqSize<=(int)sSt
1cda0 61 74 2e 73 74 5f 73 69 7a 65 20 29 20 62 72 65  at.st_size ) bre
1cdb0 61 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ak;.    }else{. 
1cdc0 20 20 20 20 20 2a 70 4e 65 77 53 69 7a 65 20 3d       *pNewSize =
1cdd0 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   0;.      rc = S
1cde0 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20  QLITE_IOERR;.   
1cdf0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1ce00 20 20 20 20 69 66 28 20 72 65 71 53 69 7a 65 3c      if( reqSize<
1ce10 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 72  0 ) break;.    r
1ce20 65 71 53 69 7a 65 20 3d 20 28 72 65 71 53 69 7a  eqSize = (reqSiz
1ce30 65 20 2b 20 53 51 4c 49 54 45 5f 55 4e 49 58 5f  e + SQLITE_UNIX_
1ce40 53 48 4d 5f 49 4e 43 52 20 2d 20 31 29 2f 53 51  SHM_INCR - 1)/SQ
1ce50 4c 49 54 45 5f 55 4e 49 58 5f 53 48 4d 5f 49 4e  LITE_UNIX_SHM_IN
1ce60 43 52 3b 0a 20 20 20 20 72 65 71 53 69 7a 65 20  CR;.    reqSize 
1ce70 2a 3d 20 53 51 4c 49 54 45 5f 55 4e 49 58 5f 53  *= SQLITE_UNIX_S
1ce80 48 4d 5f 49 4e 43 52 3b 0a 20 20 20 20 72 63 20  HM_INCR;.    rc 
1ce90 3d 20 66 74 72 75 6e 63 61 74 65 28 70 46 69 6c  = ftruncate(pFil
1cea0 65 2d 3e 68 2c 20 72 65 71 53 69 7a 65 29 3b 0a  e->h, reqSize);.
1ceb0 20 20 20 20 72 65 71 53 69 7a 65 20 3d 20 2d 31      reqSize = -1
1cec0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
1ced0 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 61 70  c;.}.../*.** Map
1cee0 20 74 68 65 20 73 68 61 72 65 64 20 73 74 6f 72   the shared stor
1cef0 61 67 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e  age into memory.
1cf00 20 20 54 68 65 20 6d 69 6e 69 6d 75 6d 20 73 69    The minimum si
1cf10 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 6d 61 70  ze of the.** map
1cf20 70 69 6e 67 20 73 68 6f 75 6c 64 20 62 65 20 72  ping should be r
1cf30 65 71 4d 61 70 53 69 7a 65 20 69 66 20 72 65 71  eqMapSize if req
1cf40 4d 61 70 53 69 7a 65 20 69 73 20 70 6f 73 69 74  MapSize is posit
1cf50 69 76 65 2e 20 20 49 66 0a 2a 2a 20 72 65 71 4d  ive.  If.** reqM
1cf60 61 70 53 69 7a 65 20 69 73 20 7a 65 72 6f 20 6f  apSize is zero o
1cf70 72 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65 20  r negative, the 
1cf80 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 63  implementation c
1cf90 61 6e 20 63 68 6f 6f 73 65 0a 2a 2a 20 77 68 61  an choose.** wha
1cfa0 74 65 76 65 72 20 6d 61 70 70 69 6e 67 20 73 69  tever mapping si
1cfb0 7a 65 20 69 73 20 63 6f 6e 76 65 6e 69 65 6e 74  ze is convenient
1cfc0 2e 0a 2a 2a 0a 2a 2a 20 2a 70 70 42 75 66 20 69  ..**.** *ppBuf i
1cfd0 73 20 6d 61 64 65 20 74 6f 20 70 6f 69 6e 74 20  s made to point 
1cfe0 74 6f 20 74 68 65 20 6d 65 6d 6f 72 79 20 77 68  to the memory wh
1cff0 69 63 68 20 69 73 20 61 20 6d 61 70 70 69 6e 67  ich is a mapping
1d000 20 6f 66 20 74 68 65 0a 2a 2a 20 75 6e 64 65 72   of the.** under
1d010 6c 79 69 6e 67 20 73 74 6f 72 61 67 65 2e 20 20  lying storage.  
1d020 41 20 6d 75 74 65 78 20 69 73 20 61 63 71 75 69  A mutex is acqui
1d030 72 65 64 20 74 6f 20 70 72 65 76 65 6e 74 20 6f  red to prevent o
1d040 74 68 65 72 20 74 68 72 65 61 64 73 0a 2a 2a 20  ther threads.** 
1d050 66 72 6f 6d 20 72 75 6e 6e 69 6e 67 20 77 68 69  from running whi
1d060 6c 65 20 2a 70 70 42 75 66 20 69 73 20 69 6e 20  le *ppBuf is in 
1d070 75 73 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  use in order to 
1d080 70 72 65 76 65 6e 74 20 6f 74 68 65 72 20 74 68  prevent other th
1d090 72 65 61 64 73 0a 2a 2a 20 72 65 6d 61 70 70 69  reads.** remappi
1d0a0 6e 67 20 2a 70 70 42 75 66 20 6f 75 74 20 66 72  ng *ppBuf out fr
1d0b0 6f 6d 20 75 6e 64 65 72 20 74 68 69 73 20 74 68  om under this th
1d0c0 72 65 61 64 2e 20 20 54 68 65 20 75 6e 69 78 53  read.  The unixS
1d0d0 68 6d 52 65 6c 65 61 73 65 28 29 0a 2a 2a 20 63  hmRelease().** c
1d0e0 61 6c 6c 20 77 69 6c 6c 20 72 65 6c 65 61 73 65  all will release
1d0f0 20 74 68 65 20 6d 75 74 65 78 2e 20 20 48 6f 77   the mutex.  How
1d100 65 76 65 72 2c 20 69 66 20 74 68 65 20 6c 6f 63  ever, if the loc
1d110 6b 20 73 74 61 74 65 20 69 73 20 43 48 45 43 4b  k state is CHECK
1d120 50 4f 49 4e 54 2c 0a 2a 2a 20 74 68 65 20 6d 75  POINT,.** the mu
1d130 74 65 78 20 69 73 20 6e 6f 74 20 61 63 71 75 69  tex is not acqui
1d140 72 65 64 20 62 65 63 61 75 73 65 20 43 48 45 43  red because CHEC
1d150 4b 50 4f 49 4e 54 20 77 69 6c 6c 20 6e 65 76 65  KPOINT will neve
1d160 72 20 72 65 6d 61 70 20 74 68 65 0a 2a 2a 20 62  r remap the.** b
1d170 75 66 66 65 72 2e 20 20 52 45 43 4f 56 45 52 20  uffer.  RECOVER 
1d180 6d 69 67 68 74 20 72 65 6d 61 70 2c 20 74 68 6f  might remap, tho
1d190 75 67 68 2c 20 73 6f 20 43 48 45 43 4b 50 4f 49  ugh, so CHECKPOI
1d1a0 4e 54 20 77 69 6c 6c 20 61 63 71 75 69 72 65 0a  NT will acquire.
1d1b0 2a 2a 20 74 68 65 20 6d 75 74 65 78 20 69 66 20  ** the mutex if 
1d1c0 61 6e 64 20 77 68 65 6e 20 69 74 20 70 72 6f 6d  and when it prom
1d1d0 6f 74 65 73 20 74 6f 20 52 45 43 4f 56 45 52 2e  otes to RECOVER.
1d1e0 0a 2a 2a 0a 2a 2a 20 52 45 43 4f 56 45 52 20 6e  .**.** RECOVER n
1d1f0 65 65 64 73 20 74 6f 20 62 65 20 61 74 6f 6d 69  eeds to be atomi
1d200 63 2e 20 20 54 68 65 20 73 61 6d 65 20 6d 75 74  c.  The same mut
1d210 65 78 20 74 68 61 74 20 70 72 65 76 65 6e 74 73  ex that prevents
1d220 20 2a 70 70 42 75 66 20 66 72 6f 6d 0a 2a 2a 20   *ppBuf from.** 
1d230 62 65 69 6e 67 20 72 65 6d 61 70 70 65 64 20 61  being remapped a
1d240 6c 73 6f 20 70 72 65 76 65 6e 74 73 20 6d 6f 72  lso prevents mor
1d250 65 20 74 68 61 6e 20 6f 6e 65 20 74 68 72 65 61  e than one threa
1d260 64 20 66 72 6f 6d 20 62 65 69 6e 67 20 69 6e 0a  d from being in.
1d270 2a 2a 20 52 45 43 4f 56 45 52 20 61 74 20 61 20  ** RECOVER at a 
1d280 74 69 6d 65 2e 20 20 42 75 74 2c 20 52 45 43 4f  time.  But, RECO
1d290 56 45 52 20 73 6f 6d 65 74 69 6d 65 73 20 77 61  VER sometimes wa
1d2a0 6e 74 73 20 74 6f 20 72 65 6d 61 70 20 69 74 73  nts to remap its
1d2b0 65 6c 66 2e 0a 2a 2a 20 54 6f 20 70 72 65 76 65  elf..** To preve
1d2c0 6e 74 20 52 45 43 4f 56 45 52 20 66 72 6f 6d 20  nt RECOVER from 
1d2d0 6c 6f 73 69 6e 67 20 69 74 73 20 6c 6f 63 6b 20  losing its lock 
1d2e0 77 68 69 6c 65 20 72 65 6d 61 70 70 69 6e 67 2c  while remapping,
1d2f0 20 74 68 65 0a 2a 2a 20 6d 75 74 65 78 20 69 73   the.** mutex is
1d300 20 6e 6f 74 20 72 65 6c 65 61 73 65 64 20 62 79   not released by
1d310 20 75 6e 69 78 53 68 6d 52 65 6c 65 61 73 65 28   unixShmRelease(
1d320 29 20 77 68 65 6e 20 69 6e 20 52 45 43 4f 56 45  ) when in RECOVE
1d330 52 2e 0a 2a 2a 0a 2a 2a 20 2a 70 4e 65 77 4d 61  R..**.** *pNewMa
1d340 70 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20  pSize is set to 
1d350 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
1d360 6d 61 70 70 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 2a  mapping..**.** *
1d370 70 70 42 75 66 20 61 6e 64 20 2a 70 4e 65 77 4d  ppBuf and *pNewM
1d380 61 70 53 69 7a 65 20 6d 69 67 68 74 20 62 65 20  apSize might be 
1d390 4e 55 4c 4c 20 61 6e 64 20 7a 65 72 6f 20 69 66  NULL and zero if
1d3a0 20 6e 6f 20 73 70 61 63 65 20 68 61 73 0a 2a 2a   no space has.**
1d3b0 20 79 65 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61   yet been alloca
1d3c0 74 65 64 20 74 6f 20 74 68 65 20 75 6e 64 65 72  ted to the under
1d3d0 6c 79 69 6e 67 20 73 74 6f 72 61 67 65 2e 0a 2a  lying storage..*
1d3e0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
1d3f0 78 53 68 6d 47 65 74 28 0a 20 20 73 71 6c 69 74  xShmGet(.  sqlit
1d400 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20 20  e3_file *fd,    
1d410 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
1d420 66 69 6c 65 20 68 6f 6c 64 69 6e 67 20 73 68 61  file holding sha
1d430 72 65 64 20 6d 65 6d 6f 72 79 20 2a 2f 0a 20 20  red memory */.  
1d440 69 6e 74 20 72 65 71 4d 61 70 53 69 7a 65 2c 20  int reqMapSize, 
1d450 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 71 75           /* Requ
1d460 65 73 74 65 64 20 73 69 7a 65 20 6f 66 20 6d 61  ested size of ma
1d470 70 70 69 6e 67 2e 20 2d 31 20 6d 65 61 6e 73 20  pping. -1 means 
1d480 64 6f 6e 27 74 20 63 61 72 65 20 2a 2f 0a 20 20  don't care */.  
1d490 69 6e 74 20 2a 70 4e 65 77 4d 61 70 53 69 7a 65  int *pNewMapSize
1d4a0 2c 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74  ,        /* Writ
1d4b0 65 20 6e 65 77 20 73 69 7a 65 20 6f 66 20 6d 61  e new size of ma
1d4c0 70 70 69 6e 67 20 68 65 72 65 20 2a 2f 0a 20 20  pping here */.  
1d4d0 76 6f 69 64 20 2a 2a 70 70 42 75 66 20 20 20 20  void **ppBuf    
1d4e0 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
1d4f0 65 20 6d 61 70 70 69 6e 67 20 62 75 66 66 65 72  e mapping buffer
1d500 20 6f 72 69 67 69 6e 20 68 65 72 65 20 2a 2f 0a   origin here */.
1d510 29 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70  ){.  unixFile *p
1d520 44 62 46 64 20 3d 20 28 75 6e 69 78 46 69 6c 65  DbFd = (unixFile
1d530 2a 29 66 64 3b 0a 20 20 75 6e 69 78 53 68 6d 20  *)fd;.  unixShm 
1d540 2a 70 20 3d 20 70 44 62 46 64 2d 3e 70 53 68 6d  *p = pDbFd->pShm
1d550 3b 0a 20 20 75 6e 69 78 53 68 6d 46 69 6c 65 20  ;.  unixShmFile 
1d560 2a 70 46 69 6c 65 20 3d 20 70 2d 3e 70 46 69 6c  *pFile = p->pFil
1d570 65 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  e;.  int rc = SQ
1d580 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20  LITE_OK;..  if( 
1d590 70 2d 3e 6c 6f 63 6b 53 74 61 74 65 21 3d 53 51  p->lockState!=SQ
1d5a0 4c 49 54 45 5f 53 48 4d 5f 43 48 45 43 4b 50 4f  LITE_SHM_CHECKPO
1d5b0 49 4e 54 20 26 26 20 70 2d 3e 68 61 73 4d 75 74  INT && p->hasMut
1d5c0 65 78 42 75 66 3d 3d 30 20 29 7b 0a 20 20 20 20  exBuf==0 ){.    
1d5d0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
1d5e0 6d 75 74 65 78 5f 6e 6f 74 68 65 6c 64 28 70 46  mutex_notheld(pF
1d5f0 69 6c 65 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  ile->mutex) );. 
1d600 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
1d610 5f 65 6e 74 65 72 28 70 46 69 6c 65 2d 3e 6d 75  _enter(pFile->mu
1d620 74 65 78 42 75 66 29 3b 0a 20 20 20 20 70 2d 3e  texBuf);.    p->
1d630 68 61 73 4d 75 74 65 78 42 75 66 20 3d 20 31 3b  hasMutexBuf = 1;
1d640 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d  .  }.  sqlite3_m
1d650 75 74 65 78 5f 65 6e 74 65 72 28 70 46 69 6c 65  utex_enter(pFile
1d660 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20  ->mutex);.  if( 
1d670 70 46 69 6c 65 2d 3e 73 7a 4d 61 70 3d 3d 30 20  pFile->szMap==0 
1d680 7c 7c 20 72 65 71 4d 61 70 53 69 7a 65 3e 70 46  || reqMapSize>pF
1d690 69 6c 65 2d 3e 73 7a 4d 61 70 20 29 7b 0a 20 20  ile->szMap ){.  
1d6a0 20 20 69 6e 74 20 61 63 74 75 61 6c 53 69 7a 65    int actualSize
1d6b0 3b 0a 20 20 20 20 69 66 28 20 75 6e 69 78 53 68  ;.    if( unixSh
1d6c0 6d 53 69 7a 65 28 66 64 2c 20 2d 31 2c 20 26 61  mSize(fd, -1, &a
1d6d0 63 74 75 61 6c 53 69 7a 65 29 3d 3d 53 51 4c 49  ctualSize)==SQLI
1d6e0 54 45 5f 4f 4b 0a 20 20 20 20 20 26 26 20 72 65  TE_OK.     && re
1d6f0 71 4d 61 70 53 69 7a 65 3c 61 63 74 75 61 6c 53  qMapSize<actualS
1d700 69 7a 65 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  ize.    ){.     
1d710 20 72 65 71 4d 61 70 53 69 7a 65 20 3d 20 61 63   reqMapSize = ac
1d720 74 75 61 6c 53 69 7a 65 3b 0a 20 20 20 20 7d 0a  tualSize;.    }.
1d730 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70      if( pFile->p
1d740 4d 4d 61 70 42 75 66 20 29 7b 0a 20 20 20 20 20  MMapBuf ){.     
1d750 20 6d 75 6e 6d 61 70 28 70 46 69 6c 65 2d 3e 70   munmap(pFile->p
1d760 4d 4d 61 70 42 75 66 2c 20 70 46 69 6c 65 2d 3e  MMapBuf, pFile->
1d770 73 7a 4d 61 70 29 3b 0a 20 20 20 20 7d 0a 20 20  szMap);.    }.  
1d780 20 20 70 46 69 6c 65 2d 3e 70 4d 4d 61 70 42 75    pFile->pMMapBu
1d790 66 20 3d 20 6d 6d 61 70 28 30 2c 20 72 65 71 4d  f = mmap(0, reqM
1d7a0 61 70 53 69 7a 65 2c 20 50 52 4f 54 5f 52 45 41  apSize, PROT_REA
1d7b0 44 7c 50 52 4f 54 5f 57 52 49 54 45 2c 20 4d 41  D|PROT_WRITE, MA
1d7c0 50 5f 53 48 41 52 45 44 2c 0a 20 20 20 20 20 20  P_SHARED,.      
1d7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d7e0 20 20 20 20 20 70 46 69 6c 65 2d 3e 68 2c 20 30       pFile->h, 0
1d7f0 29 3b 0a 20 20 20 20 70 46 69 6c 65 2d 3e 73 7a  );.    pFile->sz
1d800 4d 61 70 20 3d 20 70 46 69 6c 65 2d 3e 70 4d 4d  Map = pFile->pMM
1d810 61 70 42 75 66 20 3f 20 72 65 71 4d 61 70 53 69  apBuf ? reqMapSi
1d820 7a 65 20 3a 20 30 3b 0a 20 20 7d 0a 20 20 2a 70  ze : 0;.  }.  *p
1d830 4e 65 77 4d 61 70 53 69 7a 65 20 3d 20 70 46 69  NewMapSize = pFi
1d840 6c 65 2d 3e 73 7a 4d 61 70 3b 0a 20 20 2a 70 70  le->szMap;.  *pp
1d850 42 75 66 20 3d 20 70 46 69 6c 65 2d 3e 70 4d 4d  Buf = pFile->pMM
1d860 61 70 42 75 66 3b 0a 20 20 73 71 6c 69 74 65 33  apBuf;.  sqlite3
1d870 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 46 69  _mutex_leave(pFi
1d880 6c 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  le->mutex);.  re
1d890 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1d8a0 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20 6c 6f  * Release the lo
1d8b0 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 73  ck held on the s
1d8c0 68 61 72 65 64 20 6d 65 6d 6f 72 79 20 73 65 67  hared memory seg
1d8d0 6d 65 6e 74 20 74 6f 20 74 68 61 74 20 6f 74 68  ment to that oth
1d8e0 65 72 0a 2a 2a 20 74 68 72 65 61 64 73 20 61 72  er.** threads ar
1d8f0 65 20 66 72 65 65 20 74 6f 20 72 65 73 69 7a 65  e free to resize
1d900 20 69 74 20 69 66 20 6e 65 63 65 73 73 61 72 79   it if necessary
1d910 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c  ..**.** If the l
1d920 6f 63 6b 20 69 73 20 6e 6f 74 20 63 75 72 72 65  ock is not curre
1d930 6e 74 6c 79 20 68 65 6c 64 2c 20 74 68 69 73 20  ntly held, this 
1d940 72 6f 75 74 69 6e 65 20 69 73 20 61 20 68 61 72  routine is a har
1d950 6d 6c 65 73 73 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a  mless no-op..**.
1d960 2a 2a 20 49 66 20 74 68 65 20 73 68 61 72 65 64  ** If the shared
1d970 2d 6d 65 6d 6f 72 79 20 6f 62 6a 65 63 74 20 69  -memory object i
1d980 73 20 69 6e 20 6c 6f 63 6b 20 73 74 61 74 65 20  s in lock state 
1d990 52 45 43 4f 56 45 52 2c 20 74 68 65 6e 20 77 65  RECOVER, then we
1d9a0 20 64 6f 20 6e 6f 74 0a 2a 2a 20 72 65 61 6c 6c   do not.** reall
1d9b0 79 20 77 61 6e 74 20 74 6f 20 72 65 6c 65 61 73  y want to releas
1d9c0 65 20 74 68 65 20 6c 6f 63 6b 2c 20 73 6f 20 69  e the lock, so i
1d9d0 6e 20 74 68 61 74 20 63 61 73 65 20 74 6f 6f 2c  n that case too,
1d9e0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
1d9f0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a   is a no-op..*/.
1da00 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53  static int unixS
1da10 68 6d 52 65 6c 65 61 73 65 28 73 71 6c 69 74 65  hmRelease(sqlite
1da20 33 5f 66 69 6c 65 20 2a 66 64 29 7b 0a 20 20 75  3_file *fd){.  u
1da30 6e 69 78 46 69 6c 65 20 2a 70 44 62 46 64 20 3d  nixFile *pDbFd =
1da40 20 28 75 6e 69 78 46 69 6c 65 2a 29 66 64 3b 0a   (unixFile*)fd;.
1da50 20 20 75 6e 69 78 53 68 6d 20 2a 70 20 3d 20 70    unixShm *p = p
1da60 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 0a 20 20 69  DbFd->pShm;..  i
1da70 66 28 20 70 2d 3e 68 61 73 4d 75 74 65 78 42 75  f( p->hasMutexBu
1da80 66 20 26 26 20 70 2d 3e 6c 6f 63 6b 53 74 61 74  f && p->lockStat
1da90 65 21 3d 53 51 4c 49 54 45 5f 53 48 4d 5f 52 45  e!=SQLITE_SHM_RE
1daa0 43 4f 56 45 52 20 29 7b 0a 20 20 20 20 61 73 73  COVER ){.    ass
1dab0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
1dac0 65 78 5f 6e 6f 74 68 65 6c 64 28 70 2d 3e 70 46  ex_notheld(p->pF
1dad0 69 6c 65 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  ile->mutex) );. 
1dae0 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
1daf0 5f 6c 65 61 76 65 28 70 2d 3e 70 46 69 6c 65 2d  _leave(p->pFile-
1db00 3e 6d 75 74 65 78 42 75 66 29 3b 0a 20 20 20 20  >mutexBuf);.    
1db10 70 2d 3e 68 61 73 4d 75 74 65 78 42 75 66 20 3d  p->hasMutexBuf =
1db20 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
1db30 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
1db40 2a 0a 2a 2a 20 53 79 6d 62 6f 6c 69 63 20 6e 61  *.** Symbolic na
1db50 6d 65 73 20 66 6f 72 20 4c 4f 43 4b 20 73 74 61  mes for LOCK sta
1db60 74 65 73 20 75 73 65 64 20 66 6f 72 20 64 65 62  tes used for deb
1db70 75 67 67 69 6e 67 2e 0a 2a 2f 0a 23 69 66 64 65  ugging..*/.#ifde
1db80 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 73  f SQLITE_DEBUG.s
1db90 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
1dba0 20 2a 61 7a 4c 6b 4e 61 6d 65 5b 5d 20 3d 20 7b   *azLkName[] = {
1dbb0 0a 20 20 22 55 4e 4c 4f 43 4b 22 2c 0a 20 20 22  .  "UNLOCK",.  "
1dbc0 52 45 41 44 22 2c 0a 20 20 22 52 45 41 44 5f 46  READ",.  "READ_F
1dbd0 55 4c 4c 22 2c 0a 20 20 22 57 52 49 54 45 22 2c  ULL",.  "WRITE",
1dbe0 0a 20 20 22 50 45 4e 44 49 4e 47 22 2c 0a 20 20  .  "PENDING",.  
1dbf0 22 43 48 45 43 4b 50 4f 49 4e 54 22 2c 0a 20 20  "CHECKPOINT",.  
1dc00 22 52 45 43 4f 56 45 52 22 0a 7d 3b 0a 23 65 6e  "RECOVER".};.#en
1dc10 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  dif.../*.** Chan
1dc20 67 65 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74  ge the lock stat
1dc30 65 20 66 6f 72 20 61 20 73 68 61 72 65 64 2d 6d  e for a shared-m
1dc40 65 6d 6f 72 79 20 73 65 67 6d 65 6e 74 2e 0a 2a  emory segment..*
1dc50 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69  /.static int uni
1dc60 78 53 68 6d 4c 6f 63 6b 28 0a 20 20 73 71 6c 69  xShmLock(.  sqli
1dc70 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 20 20  te3_file *fd,   
1dc80 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
1dc90 73 65 20 66 69 6c 65 20 68 6f 6c 64 69 6e 67 20  se file holding 
1dca0 74 68 65 20 73 68 61 72 65 64 20 6d 65 6d 6f 72  the shared memor
1dcb0 79 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 69 72  y */.  int desir
1dcc0 65 64 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  edLock,         
1dcd0 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 53 51 4c 49    /* One of SQLI
1dce0 54 45 5f 53 48 4d 5f 78 78 78 78 78 20 6c 6f 63  TE_SHM_xxxxx loc
1dcf0 6b 69 6e 67 20 73 74 61 74 65 73 20 2a 2f 0a 20  king states */. 
1dd00 20 69 6e 74 20 2a 70 47 6f 74 4c 6f 63 6b 20 20   int *pGotLock  
1dd10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1dd20 68 65 20 6c 6f 63 6b 20 79 6f 75 20 61 63 74 75  he lock you actu
1dd30 61 6c 6c 79 20 67 6f 74 20 2a 2f 0a 29 7b 0a 20  ally got */.){. 
1dd40 20 75 6e 69 78 46 69 6c 65 20 2a 70 44 62 46 64   unixFile *pDbFd
1dd50 20 3d 20 28 75 6e 69 78 46 69 6c 65 2a 29 66 64   = (unixFile*)fd
1dd60 3b 0a 20 20 75 6e 69 78 53 68 6d 20 2a 70 20 3d  ;.  unixShm *p =
1dd70 20 70 44 62 46 64 2d 3e 70 53 68 6d 3b 0a 20 20   pDbFd->pShm;.  
1dd80 75 6e 69 78 53 68 6d 46 69 6c 65 20 2a 70 46 69  unixShmFile *pFi
1dd90 6c 65 20 3d 20 70 2d 3e 70 46 69 6c 65 3b 0a 20  le = p->pFile;. 
1dda0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1ddb0 5f 50 52 4f 54 4f 43 4f 4c 3b 0a 0a 20 20 2f 2a  _PROTOCOL;..  /*
1ddc0 20 4e 6f 74 65 20 74 68 61 74 20 53 51 4c 49 54   Note that SQLIT
1ddd0 45 5f 53 48 4d 5f 52 45 41 44 5f 46 55 4c 4c 20  E_SHM_READ_FULL 
1dde0 61 6e 64 20 53 51 4c 49 54 45 5f 53 48 4d 5f 50  and SQLITE_SHM_P
1ddf0 45 4e 44 49 4e 47 20 61 72 65 20 6e 65 76 65 72  ENDING are never
1de00 0a 20 20 2a 2a 20 64 69 72 65 63 74 6c 79 20 72  .  ** directly r
1de10 65 71 75 65 73 74 65 64 3b 20 74 68 65 79 20 61  equested; they a
1de20 72 65 20 73 69 64 65 20 65 66 66 65 63 74 73 20  re side effects 
1de30 66 72 6f 6d 20 72 65 71 75 65 73 74 69 6e 67 0a  from requesting.
1de40 20 20 2a 2a 20 53 51 4c 49 54 45 5f 53 48 4d 5f    ** SQLITE_SHM_
1de50 52 45 41 44 20 61 6e 64 20 53 51 4c 49 54 45 5f  READ and SQLITE_
1de60 53 48 4d 5f 43 48 45 43 4b 50 4f 49 4e 54 2c 20  SHM_CHECKPOINT, 
1de70 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a 20 20  respectively..  
1de80 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 64 65 73  */.  assert( des
1de90 69 72 65 64 4c 6f 63 6b 3d 3d 53 51 4c 49 54 45  iredLock==SQLITE
1dea0 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 0a 20 20 20 20  _SHM_UNLOCK.    
1deb0 20 20 20 7c 7c 20 64 65 73 69 72 65 64 4c 6f 63     || desiredLoc
1dec0 6b 3d 3d 53 51 4c 49 54 45 5f 53 48 4d 5f 52 45  k==SQLITE_SHM_RE
1ded0 41 44 0a 20 20 20 20 20 20 20 7c 7c 20 64 65 73  AD.       || des
1dee0 69 72 65 64 4c 6f 63 6b 3d 3d 53 51 4c 49 54 45  iredLock==SQLITE
1def0 5f 53 48 4d 5f 57 52 49 54 45 0a 20 20 20 20 20  _SHM_WRITE.     
1df00 20 20 7c 7c 20 64 65 73 69 72 65 64 4c 6f 63 6b    || desiredLock
1df10 3d 3d 53 51 4c 49 54 45 5f 53 48 4d 5f 43 48 45  ==SQLITE_SHM_CHE
1df20 43 4b 50 4f 49 4e 54 0a 20 20 20 20 20 20 20 7c  CKPOINT.       |
1df30 7c 20 64 65 73 69 72 65 64 4c 6f 63 6b 3d 3d 53  | desiredLock==S
1df40 51 4c 49 54 45 5f 53 48 4d 5f 52 45 43 4f 56 45  QLITE_SHM_RECOVE
1df50 52 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 74 75 72  R );..  /* Retur
1df60 6e 20 64 69 72 65 63 74 6c 79 20 69 66 20 74 68  n directly if th
1df70 69 73 20 69 73 20 6a 75 73 74 20 61 20 6c 6f 63  is is just a loc
1df80 6b 20 73 74 61 74 65 20 71 75 65 72 79 2c 20 6f  k state query, o
1df90 72 20 69 66 0a 20 20 2a 2a 20 74 68 65 20 63 6f  r if.  ** the co
1dfa0 6e 6e 65 63 74 69 6f 6e 20 69 73 20 61 6c 72 65  nnection is alre
1dfb0 61 64 79 20 69 6e 20 74 68 65 20 64 65 73 69 72  ady in the desir
1dfc0 65 64 20 6c 6f 63 6b 69 6e 67 20 73 74 61 74 65  ed locking state
1dfd0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 65 73  ..  */.  if( des
1dfe0 69 72 65 64 4c 6f 63 6b 3d 3d 70 2d 3e 6c 6f 63  iredLock==p->loc
1dff0 6b 53 74 61 74 65 0a 20 20 20 7c 7c 20 28 64 65  kState.   || (de
1e000 73 69 72 65 64 4c 6f 63 6b 3d 3d 53 51 4c 49 54  siredLock==SQLIT
1e010 45 5f 53 48 4d 5f 52 45 41 44 20 26 26 20 70 2d  E_SHM_READ && p-
1e020 3e 6c 6f 63 6b 53 74 61 74 65 3d 3d 53 51 4c 49  >lockState==SQLI
1e030 54 45 5f 53 48 4d 5f 52 45 41 44 5f 46 55 4c 4c  TE_SHM_READ_FULL
1e040 29 0a 20 20 29 7b 0a 20 20 20 20 4f 53 54 52 41  ).  ){.    OSTRA
1e050 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b 20 73 68  CE(("SHM-LOCK sh
1e060 6d 69 64 2d 25 64 2c 20 70 69 64 2d 25 64 20 72  mid-%d, pid-%d r
1e070 65 71 75 65 73 74 20 25 73 20 61 6e 64 20 67 6f  equest %s and go
1e080 74 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  t %s\n",.       
1e090 20 20 20 20 20 20 70 2d 3e 69 64 2c 20 67 65 74        p->id, get
1e0a0 70 69 64 28 29 2c 20 61 7a 4c 6b 4e 61 6d 65 5b  pid(), azLkName[
1e0b0 64 65 73 69 72 65 64 4c 6f 63 6b 5d 2c 20 61 7a  desiredLock], az
1e0c0 4c 6b 4e 61 6d 65 5b 70 2d 3e 6c 6f 63 6b 53 74  LkName[p->lockSt
1e0d0 61 74 65 5d 29 29 3b 0a 20 20 20 20 69 66 28 20  ate]));.    if( 
1e0e0 70 47 6f 74 4c 6f 63 6b 20 29 20 2a 70 47 6f 74  pGotLock ) *pGot
1e0f0 4c 6f 63 6b 20 3d 20 70 2d 3e 6c 6f 63 6b 53 74  Lock = p->lockSt
1e100 61 74 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ate;.    return 
1e110 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
1e120 20 20 4f 53 54 52 41 43 45 28 28 22 53 48 4d 2d    OSTRACE(("SHM-
1e130 4c 4f 43 4b 20 73 68 6d 69 64 2d 25 64 2c 20 70  LOCK shmid-%d, p
1e140 69 64 2d 25 64 20 72 65 71 75 65 73 74 20 25 73  id-%d request %s
1e150 2d 3e 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  ->%s\n",.       
1e160 20 20 20 20 20 70 2d 3e 69 64 2c 20 67 65 74 70       p->id, getp
1e170 69 64 28 29 2c 20 61 7a 4c 6b 4e 61 6d 65 5b 70  id(), azLkName[p
1e180 2d 3e 6c 6f 63 6b 53 74 61 74 65 5d 2c 20 61 7a  ->lockState], az
1e190 4c 6b 4e 61 6d 65 5b 64 65 73 69 72 65 64 4c 6f  LkName[desiredLo
1e1a0 63 6b 5d 29 29 3b 0a 20 20 0a 20 20 69 66 28 20  ck]));.  .  if( 
1e1b0 64 65 73 69 72 65 64 4c 6f 63 6b 3d 3d 53 51 4c  desiredLock==SQL
1e1c0 49 54 45 5f 53 48 4d 5f 52 45 43 4f 56 45 52 20  ITE_SHM_RECOVER 
1e1d0 26 26 20 21 70 2d 3e 68 61 73 4d 75 74 65 78 42  && !p->hasMutexB
1e1e0 75 66 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  uf ){.    assert
1e1f0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
1e200 6e 6f 74 68 65 6c 64 28 70 46 69 6c 65 2d 3e 6d  notheld(pFile->m
1e210 75 74 65 78 29 20 29 3b 0a 20 20 20 20 73 71 6c  utex) );.    sql
1e220 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
1e230 28 70 46 69 6c 65 2d 3e 6d 75 74 65 78 42 75 66  (pFile->mutexBuf
1e240 29 3b 0a 20 20 20 20 70 2d 3e 68 61 73 4d 75 74  );.    p->hasMut
1e250 65 78 42 75 66 20 3d 20 31 3b 0a 20 20 7d 0a 20  exBuf = 1;.  }. 
1e260 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
1e270 6e 74 65 72 28 70 46 69 6c 65 2d 3e 6d 75 74 65  nter(pFile->mute
1e280 78 29 3b 0a 20 20 73 77 69 74 63 68 28 20 64 65  x);.  switch( de
1e290 73 69 72 65 64 4c 6f 63 6b 20 29 7b 0a 20 20 20  siredLock ){.   
1e2a0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 53 48 4d   case SQLITE_SHM
1e2b0 5f 55 4e 4c 4f 43 4b 3a 20 7b 0a 20 20 20 20 20  _UNLOCK: {.     
1e2c0 20 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b   assert( p->lock
1e2d0 53 74 61 74 65 21 3d 53 51 4c 49 54 45 5f 53 48  State!=SQLITE_SH
1e2e0 4d 5f 52 45 43 4f 56 45 52 20 29 3b 0a 20 20 20  M_RECOVER );.   
1e2f0 20 20 20 75 6e 69 78 53 68 6d 55 6e 6c 6f 63 6b     unixShmUnlock
1e300 28 70 46 69 6c 65 2c 20 70 2c 20 55 4e 49 58 5f  (pFile, p, UNIX_
1e310 53 48 4d 5f 41 7c 55 4e 49 58 5f 53 48 4d 5f 42  SHM_A|UNIX_SHM_B
1e320 7c 55 4e 49 58 5f 53 48 4d 5f 43 7c 55 4e 49 58  |UNIX_SHM_C|UNIX
1e330 5f 53 48 4d 5f 44 29 3b 0a 20 20 20 20 20 20 72  _SHM_D);.      r
1e340 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1e350 20 20 20 20 20 70 2d 3e 6c 6f 63 6b 53 74 61 74       p->lockStat
1e360 65 20 3d 20 53 51 4c 49 54 45 5f 53 48 4d 5f 55  e = SQLITE_SHM_U
1e370 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 62 72 65  NLOCK;.      bre
1e380 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
1e390 73 65 20 53 51 4c 49 54 45 5f 53 48 4d 5f 52 45  se SQLITE_SHM_RE
1e3a0 41 44 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  AD: {.      if( 
1e3b0 70 2d 3e 6c 6f 63 6b 53 74 61 74 65 3d 3d 53 51  p->lockState==SQ
1e3c0 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43 4b 20  LITE_SHM_UNLOCK 
1e3d0 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  ){.        int n
1e3e0 41 74 74 65 6d 70 74 3b 0a 20 20 20 20 20 20 20  Attempt;.       
1e3f0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53   rc = SQLITE_BUS
1e400 59 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  Y;.        asser
1e410 74 28 20 70 2d 3e 6c 6f 63 6b 53 74 61 74 65 3d  t( p->lockState=
1e420 3d 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f  =SQLITE_SHM_UNLO
1e430 43 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 66 6f  CK );.        fo
1e440 72 28 6e 41 74 74 65 6d 70 74 3d 30 3b 20 6e 41  r(nAttempt=0; nA
1e450 74 74 65 6d 70 74 3c 35 20 26 26 20 72 63 3d 3d  ttempt<5 && rc==
1e460 53 51 4c 49 54 45 5f 42 55 53 59 3b 20 6e 41 74  SQLITE_BUSY; nAt
1e470 74 65 6d 70 74 2b 2b 29 7b 0a 20 20 20 20 20 20  tempt++){.      
1e480 20 20 20 20 72 63 20 3d 20 75 6e 69 78 53 68 6d      rc = unixShm
1e490 53 68 61 72 65 64 4c 6f 63 6b 28 70 46 69 6c 65  SharedLock(pFile
1e4a0 2c 20 70 2c 20 55 4e 49 58 5f 53 48 4d 5f 41 7c  , p, UNIX_SHM_A|
1e4b0 55 4e 49 58 5f 53 48 4d 5f 42 29 3b 0a 20 20 20  UNIX_SHM_B);.   
1e4c0 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
1e4d0 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20  QLITE_BUSY ){.  
1e4e0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 75            rc = u
1e4f0 6e 69 78 53 68 6d 53 68 61 72 65 64 4c 6f 63 6b  nixShmSharedLock
1e500 28 70 46 69 6c 65 2c 20 70 2c 20 55 4e 49 58 5f  (pFile, p, UNIX_
1e510 53 48 4d 5f 44 29 3b 0a 20 20 20 20 20 20 20 20  SHM_D);.        
1e520 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1e530 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1e540 20 20 20 20 20 20 20 70 2d 3e 6c 6f 63 6b 53 74         p->lockSt
1e550 61 74 65 20 3d 20 53 51 4c 49 54 45 5f 53 48 4d  ate = SQLITE_SHM
1e560 5f 52 45 41 44 5f 46 55 4c 4c 3b 0a 20 20 20 20  _READ_FULL;.    
1e570 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1e580 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1e590 20 20 20 20 20 20 20 75 6e 69 78 53 68 6d 55 6e         unixShmUn
1e5a0 6c 6f 63 6b 28 70 46 69 6c 65 2c 20 70 2c 20 55  lock(pFile, p, U
1e5b0 4e 49 58 5f 53 48 4d 5f 42 29 3b 0a 20 20 20 20  NIX_SHM_B);.    
1e5c0 20 20 20 20 20 20 20 20 70 2d 3e 6c 6f 63 6b 53          p->lockS
1e5d0 74 61 74 65 20 3d 20 53 51 4c 49 54 45 5f 53 48  tate = SQLITE_SH
1e5e0 4d 5f 52 45 41 44 3b 0a 20 20 20 20 20 20 20 20  M_READ;.        
1e5f0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
1e600 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1e610 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f 63    assert( p->loc
1e620 6b 53 74 61 74 65 3d 3d 53 51 4c 49 54 45 5f 53  kState==SQLITE_S
1e630 48 4d 5f 57 52 49 54 45 0a 20 20 20 20 20 20 20  HM_WRITE.       
1e640 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6c 6f          || p->lo
1e650 63 6b 53 74 61 74 65 3d 3d 53 51 4c 49 54 45 5f  ckState==SQLITE_
1e660 53 48 4d 5f 52 45 43 4f 56 45 52 20 29 3b 0a 20  SHM_RECOVER );. 
1e670 20 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78         rc = unix
1e680 53 68 6d 53 68 61 72 65 64 4c 6f 63 6b 28 70 46  ShmSharedLock(pF
1e690 69 6c 65 2c 20 70 2c 20 55 4e 49 58 5f 53 48 4d  ile, p, UNIX_SHM
1e6a0 5f 41 29 3b 0a 20 20 20 20 20 20 20 20 75 6e 69  _A);.        uni
1e6b0 78 53 68 6d 55 6e 6c 6f 63 6b 28 70 46 69 6c 65  xShmUnlock(pFile
1e6c0 2c 20 70 2c 20 55 4e 49 58 5f 53 48 4d 5f 43 7c  , p, UNIX_SHM_C|
1e6d0 55 4e 49 58 5f 53 48 4d 5f 44 29 3b 0a 20 20 20  UNIX_SHM_D);.   
1e6e0 20 20 20 20 20 70 2d 3e 6c 6f 63 6b 53 74 61 74       p->lockStat
1e6f0 65 20 3d 20 53 51 4c 49 54 45 5f 53 48 4d 5f 52  e = SQLITE_SHM_R
1e700 45 41 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  EAD;.      }.   
1e710 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1e720 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1e730 53 48 4d 5f 57 52 49 54 45 3a 20 7b 0a 20 20 20  SHM_WRITE: {.   
1e740 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f     assert( p->lo
1e750 63 6b 53 74 61 74 65 3d 3d 53 51 4c 49 54 45 5f  ckState==SQLITE_
1e760 53 48 4d 5f 52 45 41 44 20 0a 20 20 20 20 20 20  SHM_READ .      
1e770 20 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6c 6f          || p->lo
1e780 63 6b 53 74 61 74 65 3d 3d 53 51 4c 49 54 45 5f  ckState==SQLITE_
1e790 53 48 4d 5f 52 45 41 44 5f 46 55 4c 4c 20 29 3b  SHM_READ_FULL );
1e7a0 0a 20 20 20 20 20 20 72 63 20 3d 20 75 6e 69 78  .      rc = unix
1e7b0 53 68 6d 45 78 63 6c 75 73 69 76 65 4c 6f 63 6b  ShmExclusiveLock
1e7c0 28 70 46 69 6c 65 2c 20 70 2c 20 55 4e 49 58 5f  (pFile, p, UNIX_
1e7d0 53 48 4d 5f 43 7c 55 4e 49 58 5f 53 48 4d 5f 44  SHM_C|UNIX_SHM_D
1e7e0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
1e7f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1e800 20 20 20 20 20 20 70 2d 3e 6c 6f 63 6b 53 74 61        p->lockSta
1e810 74 65 20 3d 20 53 51 4c 49 54 45 5f 53 48 4d 5f  te = SQLITE_SHM_
1e820 57 52 49 54 45 3b 0a 20 20 20 20 20 20 7d 0a 20  WRITE;.      }. 
1e830 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1e840 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
1e850 45 5f 53 48 4d 5f 43 48 45 43 4b 50 4f 49 4e 54  E_SHM_CHECKPOINT
1e860 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
1e870 28 20 70 2d 3e 6c 6f 63 6b 53 74 61 74 65 3d 3d  ( p->lockState==
1e880 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c 4f 43  SQLITE_SHM_UNLOC
1e890 4b 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  K.           || 
1e8a0 70 2d 3e 6c 6f 63 6b 53 74 61 74 65 3d 3d 53 51  p->lockState==SQ
1e8b0 4c 49 54 45 5f 53 48 4d 5f 50 45 4e 44 49 4e 47  LITE_SHM_PENDING
1e8c0 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
1e8d0 69 66 28 20 70 2d 3e 6c 6f 63 6b 53 74 61 74 65  if( p->lockState
1e8e0 3d 3d 53 51 4c 49 54 45 5f 53 48 4d 5f 55 4e 4c  ==SQLITE_SHM_UNL
1e8f0 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  OCK ){.        r
1e900 63 20 3d 20 75 6e 69 78 53 68 6d 45 78 63 6c 75  c = unixShmExclu
1e910 73 69 76 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20  siveLock(pFile, 
1e920 70 2c 20 55 4e 49 58 5f 53 48 4d 5f 42 7c 55 4e  p, UNIX_SHM_B|UN
1e930 49 58 5f 53 48 4d 5f 43 29 3b 0a 20 20 20 20 20  IX_SHM_C);.     
1e940 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1e950 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1e960 20 20 70 2d 3e 6c 6f 63 6b 53 74 61 74 65 20 3d    p->lockState =
1e970 20 53 51 4c 49 54 45 5f 53 48 4d 5f 50 45 4e 44   SQLITE_SHM_PEND
1e980 49 4e 47 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ING;.        }. 
1e990 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
1e9a0 20 70 2d 3e 6c 6f 63 6b 53 74 61 74 65 3d 3d 53   p->lockState==S
1e9b0 51 4c 49 54 45 5f 53 48 4d 5f 50 45 4e 44 49 4e  QLITE_SHM_PENDIN
1e9c0 47 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  G ){.        rc 
1e9d0 3d 20 75 6e 69 78 53 68 6d 45 78 63 6c 75 73 69  = unixShmExclusi
1e9e0 76 65 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 70 2c  veLock(pFile, p,
1e9f0 20 55 4e 49 58 5f 53 48 4d 5f 41 29 3b 0a 20 20   UNIX_SHM_A);.  
1ea00 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
1ea10 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1ea20 20 20 20 20 20 70 2d 3e 6c 6f 63 6b 53 74 61 74       p->lockStat
1ea30 65 20 3d 20 53 51 4c 49 54 45 5f 53 48 4d 5f 43  e = SQLITE_SHM_C
1ea40 48 45 43 4b 50 4f 49 4e 54 3b 0a 20 20 20 20 20  HECKPOINT;.     
1ea50 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1ea60 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1ea70 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
1ea80 20 20 20 20 20 61 73 73 65 72 74 28 20 64 65 73       assert( des
1ea90 69 72 65 64 4c 6f 63 6b 3d 3d 53 51 4c 49 54 45  iredLock==SQLITE
1eaa0 5f 53 48 4d 5f 52 45 43 4f 56 45 52 20 29 3b 0a  _SHM_RECOVER );.
1eab0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
1eac0 3e 6c 6f 63 6b 53 74 61 74 65 3d 3d 53 51 4c 49  >lockState==SQLI
1ead0 54 45 5f 53 48 4d 5f 52 45 41 44 0a 20 20 20 20  TE_SHM_READ.    
1eae0 20 20 20 20 20 20 20 7c 7c 20 70 2d 3e 6c 6f 63         || p->loc
1eaf0 6b 53 74 61 74 65 3d 3d 53 51 4c 49 54 45 5f 53  kState==SQLITE_S
1eb00 48 4d 5f 52 45 41 44 5f 46 55 4c 4c 0a 20 20 20  HM_READ_FULL.   
1eb10 20 20 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65     );.      asse
1eb20 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
1eb30 78 5f 68 65 6c 64 28 70 46 69 6c 65 2d 3e 6d 75  x_held(pFile->mu
1eb40 74 65 78 42 75 66 29 20 29 3b 0a 20 20 20 20 20  texBuf) );.     
1eb50 20 72 63 20 3d 20 75 6e 69 78 53 68 6d 45 78 63   rc = unixShmExc
1eb60 6c 75 73 69 76 65 4c 6f 63 6b 28 70 46 69 6c 65  lusiveLock(pFile
1eb70 2c 20 70 2c 20 55 4e 49 58 5f 53 48 4d 5f 43 29  , p, UNIX_SHM_C)
1eb80 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
1eb90 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1eba0 20 20 20 20 20 70 2d 3e 6c 6f 63 6b 53 74 61 74       p->lockStat
1ebb0 65 20 3d 20 53 51 4c 49 54 45 5f 53 48 4d 5f 52  e = SQLITE_SHM_R
1ebc0 45 43 4f 56 45 52 3b 0a 20 20 20 20 20 20 7d 0a  ECOVER;.      }.
1ebd0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1ebe0 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
1ebf0 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 46 69  _mutex_leave(pFi
1ec00 6c 65 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 4f 53  le->mutex);.  OS
1ec10 54 52 41 43 45 28 28 22 53 48 4d 2d 4c 4f 43 4b  TRACE(("SHM-LOCK
1ec20 20 73 68 6d 69 64 2d 25 64 2c 20 70 69 64 2d 25   shmid-%d, pid-%
1ec30 64 20 67 6f 74 20 25 73 5c 6e 22 2c 0a 20 20 20  d got %s\n",.   
1ec40 20 20 20 20 20 20 20 20 70 2d 3e 69 64 2c 20 67          p->id, g
1ec50 65 74 70 69 64 28 29 2c 20 61 7a 4c 6b 4e 61 6d  etpid(), azLkNam
1ec60 65 5b 70 2d 3e 6c 6f 63 6b 53 74 61 74 65 5d 29  e[p->lockState])
1ec70 29 3b 0a 20 20 69 66 28 20 70 47 6f 74 4c 6f 63  );.  if( pGotLoc
1ec80 6b 20 29 20 2a 70 47 6f 74 4c 6f 63 6b 20 3d 20  k ) *pGotLock = 
1ec90 70 2d 3e 6c 6f 63 6b 53 74 61 74 65 3b 0a 20 20  p->lockState;.  
1eca0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65  return rc;.}..#e
1ecb0 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 75 6e 69  lse.# define uni
1ecc0 78 53 68 6d 4f 70 65 6e 20 20 20 20 30 0a 23 20  xShmOpen    0.# 
1ecd0 64 65 66 69 6e 65 20 75 6e 69 78 53 68 6d 53 69  define unixShmSi
1ece0 7a 65 20 20 20 20 30 0a 23 20 64 65 66 69 6e 65  ze    0.# define
1ecf0 20 75 6e 69 78 53 68 6d 47 65 74 20 20 20 20 20   unixShmGet     
1ed00 30 0a 23 20 64 65 66 69 6e 65 20 75 6e 69 78 53  0.# define unixS
1ed10 68 6d 52 65 6c 65 61 73 65 20 30 0a 23 20 64 65  hmRelease 0.# de
1ed20 66 69 6e 65 20 75 6e 69 78 53 68 6d 4c 6f 63 6b  fine unixShmLock
1ed30 20 20 20 20 30 0a 23 20 64 65 66 69 6e 65 20 75      0.# define u
1ed40 6e 69 78 53 68 6d 43 6c 6f 73 65 20 20 20 30 0a  nixShmClose   0.
1ed50 23 65 6e 64 69 66 20 2f 2a 20 23 69 66 6e 64 65  #endif /* #ifnde
1ed60 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
1ed70 4c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 48 65 72 65  L */../*.** Here
1ed80 20 65 6e 64 73 20 74 68 65 20 69 6d 70 6c 65 6d   ends the implem
1ed90 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 6c 6c 20  entation of all 
1eda0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 6d 65 74  sqlite3_file met
1edb0 68 6f 64 73 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  hods..**.*******
1edc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
1edd0 45 6e 64 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  End sqlite3_file
1ede0 20 4d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a   Methods *******
1edf0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ee00 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a  ********.*******
1ee10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ee20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ee30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ee40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
1ee50 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  *******/../*.** 
1ee60 54 68 69 73 20 64 69 76 69 73 69 6f 6e 20 63 6f  This division co
1ee70 6e 74 61 69 6e 73 20 64 65 66 69 6e 69 74 69 6f  ntains definitio
1ee80 6e 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 69 6f  ns of sqlite3_io
1ee90 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 73  _methods objects
1eea0 20 74 68 61 74 0a 2a 2a 20 69 6d 70 6c 65 6d 65   that.** impleme
1eeb0 6e 74 20 76 61 72 69 6f 75 73 20 66 69 6c 65 20  nt various file 
1eec0 6c 6f 63 6b 69 6e 67 20 73 74 72 61 74 65 67 69  locking strategi
1eed0 65 73 2e 20 20 49 74 20 61 6c 73 6f 20 63 6f 6e  es.  It also con
1eee0 74 61 69 6e 73 20 64 65 66 69 6e 69 74 69 6f 6e  tains definition
1eef0 73 0a 2a 2a 20 6f 66 20 22 66 69 6e 64 65 72 22  s.** of "finder"
1ef00 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20 41 20 66   functions.  A f
1ef10 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 69  inder-function i
1ef20 73 20 75 73 65 64 20 74 6f 20 6c 6f 63 61 74 65  s used to locate
1ef30 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65   the appropriate
1ef40 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  .** sqlite3_io_m
1ef50 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20 66 6f  ethods object fo
1ef60 72 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 64  r a particular d
1ef70 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54  atabase file.  T
1ef80 68 65 20 70 41 70 70 44 61 74 61 0a 2a 2a 20 66  he pAppData.** f
1ef90 69 65 6c 64 20 6f 66 20 74 68 65 20 73 71 6c 69  ield of the sqli
1efa0 74 65 33 5f 76 66 73 20 56 46 53 20 6f 62 6a 65  te3_vfs VFS obje
1efb0 63 74 73 20 61 72 65 20 69 6e 69 74 69 61 6c 69  cts are initiali
1efc0 7a 65 64 20 74 6f 20 62 65 20 70 6f 69 6e 74 65  zed to be pointe
1efd0 72 73 20 74 6f 0a 2a 2a 20 74 68 65 20 63 6f 72  rs to.** the cor
1efe0 72 65 63 74 20 66 69 6e 64 65 72 2d 66 75 6e 63  rect finder-func
1eff0 74 69 6f 6e 20 66 6f 72 20 74 68 61 74 20 56 46  tion for that VF
1f000 53 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 73 74 20 66 69  S..**.** Most fi
1f010 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 73 20 72  nder functions r
1f020 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
1f030 74 6f 20 61 20 66 69 78 65 64 20 73 71 6c 69 74  to a fixed sqlit
1f040 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 0a 2a 2a  e3_io_methods.**
1f050 20 6f 62 6a 65 63 74 2e 20 20 54 68 65 20 6f 6e   object.  The on
1f060 6c 79 20 69 6e 74 65 72 65 73 74 69 6e 67 20 66  ly interesting f
1f070 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20 69  inder-function i
1f080 73 20 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64  s autolockIoFind
1f090 65 72 2c 20 77 68 69 63 68 0a 2a 2a 20 6c 6f 6f  er, which.** loo
1f0a0 6b 73 20 61 74 20 74 68 65 20 66 69 6c 65 73 79  ks at the filesy
1f0b0 73 74 65 6d 20 74 79 70 65 20 61 6e 64 20 74 72  stem type and tr
1f0c0 69 65 73 20 74 6f 20 67 75 65 73 73 20 74 68 65  ies to guess the
1f0d0 20 62 65 73 74 20 6c 6f 63 6b 69 6e 67 0a 2a 2a   best locking.**
1f0e0 20 73 74 72 61 74 65 67 79 20 66 72 6f 6d 20 74   strategy from t
1f0f0 68 61 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 66  hat..**.** For f
1f100 69 6e 64 65 72 2d 66 75 6e 74 69 6f 6e 20 46 2c  inder-funtion F,
1f110 20 74 77 6f 20 6f 62 6a 65 63 74 73 20 61 72 65   two objects are
1f120 20 63 72 65 61 74 65 64 3a 0a 2a 2a 0a 2a 2a 20   created:.**.** 
1f130 20 20 20 28 31 29 20 54 68 65 20 72 65 61 6c 20     (1) The real 
1f140 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e 20  finder-function 
1f150 6e 61 6d 65 64 20 22 46 49 6d 70 74 28 29 22 2e  named "FImpt()".
1f160 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 41 20  .**.**    (2) A 
1f170 63 6f 6e 73 74 61 6e 74 20 70 6f 69 6e 74 65 72  constant pointer
1f180 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
1f190 6e 20 6e 61 6d 65 64 20 6a 75 73 74 20 22 46 22  n named just "F"
1f1a0 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 41 20 70 6f 69  ..**.**.** A poi
1f1b0 6e 74 65 72 20 74 6f 20 74 68 65 20 46 20 70 6f  nter to the F po
1f1c0 69 6e 74 65 72 20 69 73 20 75 73 65 64 20 61 73  inter is used as
1f1d0 20 74 68 65 20 70 41 70 70 44 61 74 61 20 76 61   the pAppData va
1f1e0 6c 75 65 20 66 6f 72 20 56 46 53 0a 2a 2a 20 6f  lue for VFS.** o
1f1f0 62 6a 65 63 74 73 2e 20 20 57 65 20 68 61 76 65  bjects.  We have
1f200 20 74 6f 20 64 6f 20 74 68 69 73 20 69 6e 73 74   to do this inst
1f210 65 61 64 20 6f 66 20 6c 65 74 74 69 6e 67 20 70  ead of letting p
1f220 41 70 70 44 61 74 61 20 70 6f 69 6e 74 0a 2a 2a  AppData point.**
1f230 20 64 69 72 65 63 74 6c 79 20 61 74 20 74 68 65   directly at the
1f240 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f 6e   finder-function
1f250 20 73 69 6e 63 65 20 43 39 30 20 72 75 6c 65 73   since C90 rules
1f260 20 70 72 65 76 65 6e 74 20 61 20 76 6f 69 64 2a   prevent a void*
1f270 0a 2a 2a 20 66 72 6f 6d 20 62 65 20 63 61 73 74  .** from be cast
1f280 20 69 6e 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e   into a function
1f290 20 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 0a   pointer..**.**.
1f2a0 2a 2a 20 45 61 63 68 20 69 6e 73 74 61 6e 63 65  ** Each instance
1f2b0 20 6f 66 20 74 68 69 73 20 6d 61 63 72 6f 20 67   of this macro g
1f2c0 65 6e 65 72 61 74 65 73 20 74 77 6f 20 6f 62 6a  enerates two obj
1f2d0 65 63 74 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  ects:.**.**   * 
1f2e0 20 41 20 63 6f 6e 73 74 61 6e 74 20 73 71 6c 69   A constant sqli
1f2f0 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f  te3_io_methods o
1f300 62 6a 65 63 74 20 63 61 6c 6c 20 4d 45 54 48 4f  bject call METHO
1f310 44 20 74 68 61 74 20 68 61 73 20 6c 6f 63 6b 69  D that has locki
1f320 6e 67 0a 2a 2a 20 20 20 20 20 20 6d 65 74 68 6f  ng.**      metho
1f330 64 73 20 43 4c 4f 53 45 2c 20 4c 4f 43 4b 2c 20  ds CLOSE, LOCK, 
1f340 55 4e 4c 4f 43 4b 2c 20 43 4b 52 45 53 4c 4f 43  UNLOCK, CKRESLOC
1f350 4b 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 41 6e  K..**.**   *  An
1f360 20 49 2f 4f 20 6d 65 74 68 6f 64 20 66 69 6e 64   I/O method find
1f370 65 72 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c  er function call
1f380 65 64 20 46 49 4e 44 45 52 20 74 68 61 74 20 72  ed FINDER that r
1f390 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72  eturns a pointer
1f3a0 0a 2a 2a 20 20 20 20 20 20 74 6f 20 74 68 65 20  .**      to the 
1f3b0 4d 45 54 48 4f 44 20 6f 62 6a 65 63 74 20 69 6e  METHOD object in
1f3c0 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 62 75   the previous bu
1f3d0 6c 6c 65 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  llet..*/.#define
1f3e0 20 49 4f 4d 45 54 48 4f 44 53 28 46 49 4e 44 45   IOMETHODS(FINDE
1f3f0 52 2c 20 4d 45 54 48 4f 44 2c 20 56 45 52 53 49  R, METHOD, VERSI
1f400 4f 4e 2c 20 43 4c 4f 53 45 2c 20 4c 4f 43 4b 2c  ON, CLOSE, LOCK,
1f410 20 55 4e 4c 4f 43 4b 2c 20 43 4b 4c 4f 43 4b 29   UNLOCK, CKLOCK)
1f420 20 20 20 20 20 20 5c 0a 73 74 61 74 69 63 20 63        \.static c
1f430 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f  onst sqlite3_io_
1f440 6d 65 74 68 6f 64 73 20 4d 45 54 48 4f 44 20 3d  methods METHOD =
1f450 20 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20   {              
1f460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f470 20 20 20 20 20 5c 0a 20 20 20 56 45 52 53 49 4f       \.   VERSIO
1f480 4e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  N,              
1f490 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f        /* iVersio
1f4a0 6e 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  n */            
1f4b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f4c0 20 20 20 20 5c 0a 20 20 20 43 4c 4f 53 45 2c 20      \.   CLOSE, 
1f4d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f4e0 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 2a       /* xClose *
1f4f0 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
1f500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f510 20 20 20 5c 0a 20 20 20 75 6e 69 78 52 65 61 64     \.   unixRead
1f520 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1f530 20 20 20 20 2f 2a 20 78 52 65 61 64 20 2a 2f 20      /* xRead */ 
1f540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f560 20 20 5c 0a 20 20 20 75 6e 69 78 57 72 69 74 65    \.   unixWrite
1f570 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1f580 20 20 20 2f 2a 20 78 57 72 69 74 65 20 2a 2f 20     /* xWrite */ 
1f590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f5a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f5b0 20 5c 0a 20 20 20 75 6e 69 78 54 72 75 6e 63 61   \.   unixTrunca
1f5c0 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  te,             
1f5d0 20 20 2f 2a 20 78 54 72 75 6e 63 61 74 65 20 2a    /* xTruncate *
1f5e0 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
1f5f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f600 5c 0a 20 20 20 75 6e 69 78 53 79 6e 63 2c 20 20  \.   unixSync,  
1f610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f620 20 2f 2a 20 78 53 79 6e 63 20 2a 2f 20 20 20 20   /* xSync */    
1f630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
1f650 0a 20 20 20 75 6e 69 78 46 69 6c 65 53 69 7a 65  .   unixFileSize
1f660 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1f670 2f 2a 20 78 46 69 6c 65 53 69 7a 65 20 2a 2f 20  /* xFileSize */ 
1f680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
1f6a0 20 20 20 4c 4f 43 4b 2c 20 20 20 20 20 20 20 20     LOCK,        
1f6b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1f6c0 2a 20 78 4c 6f 63 6b 20 2a 2f 20 20 20 20 20 20  * xLock */      
1f6d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f6e0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
1f6f0 20 20 55 4e 4c 4f 43 4b 2c 20 20 20 20 20 20 20    UNLOCK,       
1f700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1f710 20 78 55 6e 6c 6f 63 6b 20 2a 2f 20 20 20 20 20   xUnlock */     
1f720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f730 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
1f740 20 43 4b 4c 4f 43 4b 2c 20 20 20 20 20 20 20 20   CKLOCK,        
1f750 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1f760 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  xCheckReservedLo
1f770 63 6b 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  ck */           
1f780 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
1f790 75 6e 69 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 2c  unixFileControl,
1f7a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
1f7b0 46 69 6c 65 43 6f 6e 74 72 6f 6c 20 2a 2f 20 20  FileControl */  
1f7c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f7d0 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75            \.   u
1f7e0 6e 69 78 53 65 63 74 6f 72 53 69 7a 65 2c 20 20  nixSectorSize,  
1f7f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53             /* xS
1f800 65 63 74 6f 72 53 69 7a 65 20 2a 2f 20 20 20 20  ectorSize */    
1f810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f820 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e           \.   un
1f830 69 78 44 65 76 69 63 65 43 68 61 72 61 63 74 65  ixDeviceCharacte
1f840 72 69 73 74 69 63 73 2c 20 20 2f 2a 20 78 44 65  ristics,  /* xDe
1f850 76 69 63 65 43 61 70 61 62 69 6c 69 74 69 65 73  viceCapabilities
1f860 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
1f870 20 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69          \.   uni
1f880 78 53 68 6d 4f 70 65 6e 2c 20 20 20 20 20 20 20  xShmOpen,       
1f890 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d           /* xShm
1f8a0 4f 70 65 6e 20 2a 2f 20 20 20 20 20 20 20 20 20  Open */         
1f8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f8c0 20 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78         \.   unix
1f8d0 53 68 6d 53 69 7a 65 2c 20 20 20 20 20 20 20 20  ShmSize,        
1f8e0 20 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 53          /* xShmS
1f8f0 69 7a 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ize */          
1f900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f910 20 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53        \.   unixS
1f920 68 6d 47 65 74 2c 20 20 20 20 20 20 20 20 20 20  hmGet,          
1f930 20 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 47 65         /* xShmGe
1f940 74 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  t */            
1f950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f960 20 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 68       \.   unixSh
1f970 6d 52 65 6c 65 61 73 65 2c 20 20 20 20 20 20 20  mRelease,       
1f980 20 20 20 20 20 20 2f 2a 20 78 53 68 6d 52 65 6c        /* xShmRel
1f990 65 61 73 65 20 2a 2f 20 20 20 20 20 20 20 20 20  ease */         
1f9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f9b0 20 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 68 6d      \.   unixShm
1f9c0 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  Lock,           
1f9d0 20 20 20 20 20 2f 2a 20 78 53 68 6d 4c 6f 63 6b       /* xShmLock
1f9e0 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
1f9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa00 20 20 20 5c 0a 20 20 20 75 6e 69 78 53 68 6d 43     \.   unixShmC
1fa10 6c 6f 73 65 20 20 20 20 20 20 20 20 20 20 20 20  lose            
1fa20 20 20 20 20 2f 2a 20 78 53 68 6d 43 6c 6f 73 65      /* xShmClose
1fa30 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20 20   */             
1fa40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa50 20 20 5c 0a 7d 3b 20 20 20 20 20 20 20 20 20 20    \.};          
1fa60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fa90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1faa0 20 5c 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20   \.static const 
1fab0 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
1fac0 64 73 20 2a 46 49 4e 44 45 52 23 23 49 6d 70 6c  ds *FINDER##Impl
1fad0 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20  (const char *z, 
1fae0 75 6e 69 78 46 69 6c 65 20 2a 70 29 7b 20 20 20  unixFile *p){   
1faf0 5c 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  \.  UNUSED_PARAM
1fb00 45 54 45 52 28 7a 29 3b 20 55 4e 55 53 45 44 5f  ETER(z); UNUSED_
1fb10 50 41 52 41 4d 45 54 45 52 28 70 29 3b 20 20 20  PARAMETER(p);   
1fb20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
1fb40 0a 20 20 72 65 74 75 72 6e 20 26 4d 45 54 48 4f  .  return &METHO
1fb50 44 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  D;              
1fb60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fb80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
1fb90 7d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }               
1fba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fbb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fbc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fbd0 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 73               \.s
1fbe0 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71 6c 69  tatic const sqli
1fbf0 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 2a  te3_io_methods *
1fc00 28 2a 63 6f 6e 73 74 20 46 49 4e 44 45 52 29 28  (*const FINDER)(
1fc10 63 6f 6e 73 74 20 63 68 61 72 2a 2c 75 6e 69 78  const char*,unix
1fc20 46 69 6c 65 20 2a 70 29 20 20 20 20 5c 0a 20 20  File *p)    \.  
1fc30 20 20 3d 20 46 49 4e 44 45 52 23 23 49 6d 70 6c    = FINDER##Impl
1fc40 3b 0a 0a 2f 2a 0a 2a 2a 20 48 65 72 65 20 61 72  ;../*.** Here ar
1fc50 65 20 61 6c 6c 20 6f 66 20 74 68 65 20 73 71 6c  e all of the sql
1fc60 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
1fc70 6f 62 6a 65 63 74 73 20 66 6f 72 20 65 61 63 68  objects for each
1fc80 20 6f 66 20 74 68 65 0a 2a 2a 20 6c 6f 63 6b 69   of the.** locki
1fc90 6e 67 20 73 74 72 61 74 65 67 69 65 73 2e 20 20  ng strategies.  
1fca0 46 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 72  Functions that r
1fcb0 65 74 75 72 6e 20 70 6f 69 6e 74 65 72 73 20 74  eturn pointers t
1fcc0 6f 20 74 68 65 73 65 20 6d 65 74 68 6f 64 73 0a  o these methods.
1fcd0 2a 2a 20 61 72 65 20 61 6c 73 6f 20 63 72 65 61  ** are also crea
1fce0 74 65 64 2e 0a 2a 2f 0a 49 4f 4d 45 54 48 4f 44  ted..*/.IOMETHOD
1fcf0 53 28 0a 20 20 70 6f 73 69 78 49 6f 46 69 6e 64  S(.  posixIoFind
1fd00 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  er,            /
1fd10 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f  * Finder functio
1fd20 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 70 6f 73 69  n name */.  posi
1fd30 78 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20  xIoMethods,     
1fd40 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33        /* sqlite3
1fd50 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65  _io_methods obje
1fd60 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 32 2c 20  ct name */.  2, 
1fd70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fd80 20 20 20 20 20 20 20 2f 2a 20 53 68 6d 4f 70 65         /* ShmOpe
1fd90 6e 20 69 73 20 65 6e 61 62 6c 65 64 20 2a 2f 0a  n is enabled */.
1fda0 20 20 75 6e 69 78 43 6c 6f 73 65 2c 20 20 20 20    unixClose,    
1fdb0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
1fdc0 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a  Close method */.
1fdd0 20 20 75 6e 69 78 4c 6f 63 6b 2c 20 20 20 20 20    unixLock,     
1fde0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
1fdf0 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  Lock method */. 
1fe00 20 75 6e 69 78 55 6e 6c 6f 63 6b 2c 20 20 20 20   unixUnlock,    
1fe10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55             /* xU
1fe20 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a  nlock method */.
1fe30 20 20 75 6e 69 78 43 68 65 63 6b 52 65 73 65 72    unixCheckReser
1fe40 76 65 64 4c 6f 63 6b 20 20 20 20 20 2f 2a 20 78  vedLock     /* x
1fe50 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
1fe60 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 49 4f  k method */.).IO
1fe70 4d 45 54 48 4f 44 53 28 0a 20 20 6e 6f 6c 6f 63  METHODS(.  noloc
1fe80 6b 49 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20  kIoFinder,      
1fe90 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66       /* Finder f
1fea0 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a  unction name */.
1feb0 20 20 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64    nolockIoMethod
1fec0 73 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73  s,          /* s
1fed0 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64  qlite3_io_method
1fee0 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f  s object name */
1fef0 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20 20 20  .  1,           
1ff00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ff10 53 68 6d 4f 70 65 6e 20 69 73 20 64 69 73 61 62  ShmOpen is disab
1ff20 6c 65 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 43  led */.  nolockC
1ff30 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  lose,           
1ff40 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74     /* xClose met
1ff50 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 4c  hod */.  nolockL
1ff60 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20  ock,            
1ff70 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68     /* xLock meth
1ff80 6f 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 55 6e  od */.  nolockUn
1ff90 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  lock,           
1ffa0 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74    /* xUnlock met
1ffb0 68 6f 64 20 2a 2f 0a 20 20 6e 6f 6c 6f 63 6b 43  hod */.  nolockC
1ffc0 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
1ffd0 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65     /* xCheckRese
1ffe0 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20  rvedLock method 
1fff0 2a 2f 0a 29 0a 49 4f 4d 45 54 48 4f 44 53 28 0a  */.).IOMETHODS(.
20000 20 20 64 6f 74 6c 6f 63 6b 49 6f 46 69 6e 64 65    dotlockIoFinde
20010 72 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  r,          /* F
20020 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20 6e  inder function n
20030 61 6d 65 20 2a 2f 0a 20 20 64 6f 74 6c 6f 63 6b  ame */.  dotlock
20040 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20 20  IoMethods,      
20050 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 69 6f     /* sqlite3_io
20060 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63 74 20  _methods object 
20070 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20 20 20  name */.  1,    
20080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20090 20 20 20 20 2f 2a 20 53 68 6d 4f 70 65 6e 20 69      /* ShmOpen i
200a0 73 20 64 69 73 61 62 6c 65 64 20 2a 2f 0a 20 20  s disabled */.  
200b0 64 6f 74 6c 6f 63 6b 43 6c 6f 73 65 2c 20 20 20  dotlockClose,   
200c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 6c            /* xCl
200d0 6f 73 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ose method */.  
200e0 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 2c 20 20 20 20  dotlockLock,    
200f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f            /* xLo
20100 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 64  ck method */.  d
20110 6f 74 6c 6f 63 6b 55 6e 6c 6f 63 6b 2c 20 20 20  otlockUnlock,   
20120 20 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c           /* xUnl
20130 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ock method */.  
20140 64 6f 74 6c 6f 63 6b 43 68 65 63 6b 52 65 73 65  dotlockCheckRese
20150 72 76 65 64 4c 6f 63 6b 20 20 2f 2a 20 78 43 68  rvedLock  /* xCh
20160 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20  eckReservedLock 
20170 6d 65 74 68 6f 64 20 2a 2f 0a 29 0a 0a 23 69 66  method */.)..#if
20180 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
20190 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20  OCKING_STYLE && 
201a0 21 4f 53 5f 56 58 57 4f 52 4b 53 0a 49 4f 4d 45  !OS_VXWORKS.IOME
201b0 54 48 4f 44 53 28 0a 20 20 66 6c 6f 63 6b 49 6f  THODS(.  flockIo
201c0 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20 20  Finder,         
201d0 20 20 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e     /* Finder fun
201e0 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  ction name */.  
201f0 66 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 2c 20  flockIoMethods, 
20200 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c            /* sql
20210 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
20220 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20  object name */. 
20230 20 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   1,             
20240 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68             /* Sh
20250 6d 4f 70 65 6e 20 69 73 20 64 69 73 61 62 6c 65  mOpen is disable
20260 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b 43 6c 6f 73  d */.  flockClos
20270 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
20280 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f   /* xClose metho
20290 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b 4c 6f 63 6b  d */.  flockLock
202a0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
202b0 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64   /* xLock method
202c0 20 2a 2f 0a 20 20 66 6c 6f 63 6b 55 6e 6c 6f 63   */.  flockUnloc
202d0 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
202e0 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f  /* xUnlock metho
202f0 64 20 2a 2f 0a 20 20 66 6c 6f 63 6b 43 68 65 63  d */.  flockChec
20300 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 20 20  kReservedLock   
20310 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76   /* xCheckReserv
20320 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f  edLock method */
20330 0a 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 4f  .).#endif..#if O
20340 53 5f 56 58 57 4f 52 4b 53 0a 49 4f 4d 45 54 48  S_VXWORKS.IOMETH
20350 4f 44 53 28 0a 20 20 73 65 6d 49 6f 46 69 6e 64  ODS(.  semIoFind
20360 65 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  er,             
20370 20 2f 2a 20 46 69 6e 64 65 72 20 66 75 6e 63 74   /* Finder funct
20380 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 73 65  ion name */.  se
20390 6d 49 6f 4d 65 74 68 6f 64 73 2c 20 20 20 20 20  mIoMethods,     
203a0 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74          /* sqlit
203b0 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62  e3_io_methods ob
203c0 6a 65 63 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31  ject name */.  1
203d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
203e0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 68 6d 4f           /* ShmO
203f0 70 65 6e 20 69 73 20 64 69 73 61 62 6c 65 64 20  pen is disabled 
20400 2a 2f 0a 20 20 73 65 6d 43 6c 6f 73 65 2c 20 20  */.  semClose,  
20410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20420 2a 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20  * xClose method 
20430 2a 2f 0a 20 20 73 65 6d 4c 6f 63 6b 2c 20 20 20  */.  semLock,   
20440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20450 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  * xLock method *
20460 2f 0a 20 20 73 65 6d 55 6e 6c 6f 63 6b 2c 20 20  /.  semUnlock,  
20470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20480 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64 20   xUnlock method 
20490 2a 2f 0a 20 20 73 65 6d 43 68 65 63 6b 52 65 73  */.  semCheckRes
204a0 65 72 76 65 64 4c 6f 63 6b 20 20 20 20 20 20 2f  ervedLock      /
204b0 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65 64  * xCheckReserved
204c0 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f 0a 29  Lock method */.)
204d0 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66  .#endif..#if def
204e0 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20  ined(__APPLE__) 
204f0 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  && SQLITE_ENABLE
20500 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 49  _LOCKING_STYLE.I
20510 4f 4d 45 54 48 4f 44 53 28 0a 20 20 61 66 70 49  OMETHODS(.  afpI
20520 6f 46 69 6e 64 65 72 2c 20 20 20 20 20 20 20 20  oFinder,        
20530 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65 72 20        /* Finder 
20540 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f  function name */
20550 0a 20 20 61 66 70 49 6f 4d 65 74 68 6f 64 73 2c  .  afpIoMethods,
20560 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20570 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f  sqlite3_io_metho
20580 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 2a  ds object name *
20590 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20 20  /.  1,          
205a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
205b0 20 53 68 6d 4f 70 65 6e 20 69 73 20 64 69 73 61   ShmOpen is disa
205c0 62 6c 65 64 20 2a 2f 0a 20 20 61 66 70 43 6c 6f  bled */.  afpClo
205d0 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  se,             
205e0 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 6d 65      /* xClose me
205f0 74 68 6f 64 20 2a 2f 0a 20 20 61 66 70 4c 6f 63  thod */.  afpLoc
20600 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
20610 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d 65 74      /* xLock met
20620 68 6f 64 20 2a 2f 0a 20 20 61 66 70 55 6e 6c 6f  hod */.  afpUnlo
20630 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
20640 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65     /* xUnlock me
20650 74 68 6f 64 20 2a 2f 0a 20 20 61 66 70 43 68 65  thod */.  afpChe
20660 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 20  ckReservedLock  
20670 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73      /* xCheckRes
20680 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64  ervedLock method
20690 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a   */.).#endif../*
206a0 0a 2a 2a 20 54 68 65 20 70 72 6f 78 79 20 6c 6f  .** The proxy lo
206b0 63 6b 69 6e 67 20 6d 65 74 68 6f 64 20 69 73 20  cking method is 
206c0 61 20 22 73 75 70 65 72 2d 6d 65 74 68 6f 64 22  a "super-method"
206d0 20 69 6e 20 74 68 65 20 73 65 6e 73 65 20 74 68   in the sense th
206e0 61 74 20 69 74 0a 2a 2a 20 6f 70 65 6e 73 20 73  at it.** opens s
206f0 65 63 6f 6e 64 61 72 79 20 66 69 6c 65 20 64 65  econdary file de
20700 73 63 72 69 70 74 6f 72 73 20 66 6f 72 20 74 68  scriptors for th
20710 65 20 63 6f 6e 63 68 20 61 6e 64 20 6c 6f 63 6b  e conch and lock
20720 20 66 69 6c 65 73 20 61 6e 64 0a 2a 2a 20 69 74   files and.** it
20730 20 75 73 65 73 20 70 72 6f 78 79 2c 20 64 6f 74   uses proxy, dot
20740 2d 66 69 6c 65 2c 20 41 46 50 2c 20 61 6e 64 20  -file, AFP, and 
20750 66 6c 6f 63 6b 28 29 20 6c 6f 63 6b 69 6e 67 20  flock() locking 
20760 6d 65 74 68 6f 64 73 20 6f 6e 20 74 68 6f 73 65  methods on those
20770 0a 2a 2a 20 73 65 63 6f 6e 64 61 72 79 20 66 69  .** secondary fi
20780 6c 65 73 2e 20 20 46 6f 72 20 74 68 69 73 20 72  les.  For this r
20790 65 61 73 6f 6e 2c 20 74 68 65 20 64 69 76 69 73  eason, the divis
207a0 69 6f 6e 20 74 68 61 74 20 69 6d 70 6c 65 6d 65  ion that impleme
207b0 6e 74 73 0a 2a 2a 20 70 72 6f 78 79 20 6c 6f 63  nts.** proxy loc
207c0 6b 69 6e 67 20 69 73 20 6c 6f 63 61 74 65 64 20  king is located 
207d0 6d 75 63 68 20 66 75 72 74 68 65 72 20 64 6f 77  much further dow
207e0 6e 20 69 6e 20 74 68 65 20 66 69 6c 65 2e 20 20  n in the file.  
207f0 42 75 74 20 77 65 20 6e 65 65 64 0a 2a 2a 20 74  But we need.** t
20800 6f 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20 64  o go ahead and d
20810 65 66 69 6e 65 20 74 68 65 20 73 71 6c 69 74 65  efine the sqlite
20820 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 61 6e 64  3_io_methods and
20830 20 66 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e   finder function
20840 0a 2a 2a 20 66 6f 72 20 70 72 6f 78 79 20 6c 6f  .** for proxy lo
20850 63 6b 69 6e 67 20 68 65 72 65 2e 20 20 53 6f 20  cking here.  So 
20860 77 65 20 66 6f 72 77 61 72 64 20 64 65 63 6c 61  we forward decla
20870 72 65 20 74 68 65 20 49 2f 4f 20 6d 65 74 68 6f  re the I/O metho
20880 64 73 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e  ds..*/.#if defin
20890 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26  ed(__APPLE__) &&
208a0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
208b0 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 73 74 61  OCKING_STYLE.sta
208c0 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43 6c 6f  tic int proxyClo
208d0 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  se(sqlite3_file*
208e0 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  );.static int pr
208f0 6f 78 79 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  oxyLock(sqlite3_
20900 66 69 6c 65 2a 2c 20 69 6e 74 29 3b 0a 73 74 61  file*, int);.sta
20910 74 69 63 20 69 6e 74 20 70 72 6f 78 79 55 6e 6c  tic int proxyUnl
20920 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
20930 2a 2c 20 69 6e 74 29 3b 0a 73 74 61 74 69 63 20  *, int);.static 
20940 69 6e 74 20 70 72 6f 78 79 43 68 65 63 6b 52 65  int proxyCheckRe
20950 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74  servedLock(sqlit
20960 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 2a 29 3b  e3_file*, int*);
20970 0a 49 4f 4d 45 54 48 4f 44 53 28 0a 20 20 70 72  .IOMETHODS(.  pr
20980 6f 78 79 49 6f 46 69 6e 64 65 72 2c 20 20 20 20  oxyIoFinder,    
20990 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 65          /* Finde
209a0 72 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20  r function name 
209b0 2a 2f 0a 20 20 70 72 6f 78 79 49 6f 4d 65 74 68  */.  proxyIoMeth
209c0 6f 64 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ods,           /
209d0 2a 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74  * sqlite3_io_met
209e0 68 6f 64 73 20 6f 62 6a 65 63 74 20 6e 61 6d 65  hods object name
209f0 20 2a 2f 0a 20 20 31 2c 20 20 20 20 20 20 20 20   */.  1,        
20a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20a10 2f 2a 20 53 68 6d 4f 70 65 6e 20 69 73 20 64 69  /* ShmOpen is di
20a20 73 61 62 6c 65 64 20 2a 2f 0a 20 20 70 72 6f 78  sabled */.  prox
20a30 79 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20  yClose,         
20a40 20 20 20 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20        /* xClose 
20a50 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 70 72 6f 78  method */.  prox
20a60 79 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  yLock,          
20a70 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 6d        /* xLock m
20a80 65 74 68 6f 64 20 2a 2f 0a 20 20 70 72 6f 78 79  ethod */.  proxy
20a90 55 6e 6c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  Unlock,         
20aa0 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20       /* xUnlock 
20ab0 6d 65 74 68 6f 64 20 2a 2f 0a 20 20 70 72 6f 78  method */.  prox
20ac0 79 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  yCheckReservedLo
20ad0 63 6b 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52  ck    /* xCheckR
20ae0 65 73 65 72 76 65 64 4c 6f 63 6b 20 6d 65 74 68  eservedLock meth
20af0 6f 64 20 2a 2f 0a 29 0a 23 65 6e 64 69 66 0a 0a  od */.).#endif..
20b00 2f 2a 20 6e 66 73 20 6c 6f 63 6b 64 20 6f 6e 20  /* nfs lockd on 
20b10 4f 53 58 20 31 30 2e 33 2b 20 64 6f 65 73 6e 27  OSX 10.3+ doesn'
20b20 74 20 63 6c 65 61 72 20 77 72 69 74 65 20 6c 6f  t clear write lo
20b30 63 6b 73 20 77 68 65 6e 20 61 20 72 65 61 64 20  cks when a read 
20b40 6c 6f 63 6b 20 69 73 20 73 65 74 20 2a 2f 0a 23  lock is set */.#
20b50 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  if defined(__APP
20b60 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f  LE__) && SQLITE_
20b70 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
20b80 54 59 4c 45 0a 49 4f 4d 45 54 48 4f 44 53 28 0a  TYLE.IOMETHODS(.
20b90 20 20 6e 66 73 49 6f 46 69 6e 64 65 72 2c 20 20    nfsIoFinder,  
20ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20bb0 46 69 6e 64 65 72 20 66 75 6e 63 74 69 6f 6e 20  Finder function 
20bc0 6e 61 6d 65 20 2a 2f 0a 20 20 6e 66 73 49 6f 4d  name */.  nfsIoM
20bd0 65 74 68 6f 64 73 2c 20 20 20 20 20 20 20 20 20  ethods,         
20be0 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f       /* sqlite3_
20bf0 69 6f 5f 6d 65 74 68 6f 64 73 20 6f 62 6a 65 63  io_methods objec
20c00 74 20 6e 61 6d 65 20 2a 2f 0a 20 20 31 2c 20 20  t name */.  1,  
20c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20c20 20 20 20 20 20 20 20 2f 2a 20 53 68 6d 4f 70 65         /* ShmOpe
20c30 6e 20 69 73 20 64 69 73 61 62 6c 65 64 20 2a 2f  n is disabled */
20c40 0a 20 20 75 6e 69 78 43 6c 6f 73 65 2c 20 20 20  .  unixClose,   
20c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20c60 20 78 43 6c 6f 73 65 20 6d 65 74 68 6f 64 20 2a   xClose method *
20c70 2f 0a 20 20 75 6e 69 78 4c 6f 63 6b 2c 20 20 20  /.  unixLock,   
20c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20c90 2a 20 78 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a  * xLock method *
20ca0 2f 0a 20 20 6e 66 73 55 6e 6c 6f 63 6b 2c 20 20  /.  nfsUnlock,  
20cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20cc0 2a 20 78 55 6e 6c 6f 63 6b 20 6d 65 74 68 6f 64  * xUnlock method
20cd0 20 2a 2f 0a 20 20 75 6e 69 78 43 68 65 63 6b 52   */.  unixCheckR
20ce0 65 73 65 72 76 65 64 4c 6f 63 6b 20 20 20 20 20  eservedLock     
20cf0 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76   /* xCheckReserv
20d00 65 64 4c 6f 63 6b 20 6d 65 74 68 6f 64 20 2a 2f  edLock method */
20d10 0a 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64  .).#endif..#if d
20d20 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
20d30 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42  ) && SQLITE_ENAB
20d40 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
20d50 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 22 66 69  ./* .** This "fi
20d60 6e 64 65 72 22 20 66 75 6e 63 74 69 6f 6e 20 61  nder" function a
20d70 74 74 65 6d 70 74 73 20 74 6f 20 64 65 74 65 72  ttempts to deter
20d80 6d 69 6e 65 20 74 68 65 20 62 65 73 74 20 6c 6f  mine the best lo
20d90 63 6b 69 6e 67 20 73 74 72 61 74 65 67 79 20 0a  cking strategy .
20da0 2a 2a 20 66 6f 72 20 74 68 65 20 64 61 74 61 62  ** for the datab
20db0 61 73 65 20 66 69 6c 65 20 22 66 69 6c 65 50 61  ase file "filePa
20dc0 74 68 22 2e 20 20 49 74 20 74 68 65 6e 20 72 65  th".  It then re
20dd0 74 75 72 6e 73 20 74 68 65 20 73 71 6c 69 74 65  turns the sqlite
20de0 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 0a 2a 2a 20  3_io_methods.** 
20df0 6f 62 6a 65 63 74 20 74 68 61 74 20 69 6d 70 6c  object that impl
20e00 65 6d 65 6e 74 73 20 74 68 61 74 20 73 74 72 61  ements that stra
20e10 74 65 67 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tegy..**.** This
20e20 20 69 73 20 66 6f 72 20 4d 61 63 4f 53 58 20 6f   is for MacOSX o
20e30 6e 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  nly..*/.static c
20e40 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f  onst sqlite3_io_
20e50 6d 65 74 68 6f 64 73 20 2a 61 75 74 6f 6c 6f 63  methods *autoloc
20e60 6b 49 6f 46 69 6e 64 65 72 49 6d 70 6c 28 0a 20  kIoFinderImpl(. 
20e70 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 69 6c   const char *fil
20e80 65 50 61 74 68 2c 20 20 20 20 2f 2a 20 6e 61 6d  ePath,    /* nam
20e90 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
20ea0 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78  e file */.  unix
20eb0 46 69 6c 65 20 2a 70 4e 65 77 20 20 20 20 20 20  File *pNew      
20ec0 20 20 20 20 20 2f 2a 20 6f 70 65 6e 20 66 69 6c       /* open fil
20ed0 65 20 6f 62 6a 65 63 74 20 66 6f 72 20 74 68 65  e object for the
20ee0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
20ef0 2f 0a 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f  /.){.  static co
20f00 6e 73 74 20 73 74 72 75 63 74 20 4d 61 70 70 69  nst struct Mappi
20f10 6e 67 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ng {.    const c
20f20 68 61 72 20 2a 7a 46 69 6c 65 73 79 73 74 65 6d  har *zFilesystem
20f30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
20f40 2a 20 46 69 6c 65 73 79 73 74 65 6d 20 74 79 70  * Filesystem typ
20f50 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 63 6f  e name */.    co
20f60 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  nst sqlite3_io_m
20f70 65 74 68 6f 64 73 20 2a 70 4d 65 74 68 6f 64 73  ethods *pMethods
20f80 3b 20 20 20 2f 2a 20 41 70 70 72 6f 70 72 69 61  ;   /* Appropria
20f90 74 65 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f  te locking metho
20fa0 64 20 2a 2f 0a 20 20 7d 20 61 4d 61 70 5b 5d 20  d */.  } aMap[] 
20fb0 3d 20 7b 0a 20 20 20 20 7b 20 22 68 66 73 22 2c  = {.    { "hfs",
20fc0 20 20 20 20 26 70 6f 73 69 78 49 6f 4d 65 74 68      &posixIoMeth
20fd0 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20 22 75 66  ods },.    { "uf
20fe0 73 22 2c 20 20 20 20 26 70 6f 73 69 78 49 6f 4d  s",    &posixIoM
20ff0 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b 20  ethods },.    { 
21000 22 61 66 70 66 73 22 2c 20 20 26 61 66 70 49 6f  "afpfs",  &afpIo
21010 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20 7b  Methods },.    {
21020 20 22 73 6d 62 66 73 22 2c 20 20 26 61 66 70 49   "smbfs",  &afpI
21030 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a 20 20 20 20  oMethods },.    
21040 7b 20 22 77 65 62 64 61 76 22 2c 20 26 6e 6f 6c  { "webdav", &nol
21050 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 20 7d 2c 0a  ockIoMethods },.
21060 20 20 20 20 7b 20 30 2c 20 30 20 7d 0a 20 20 7d      { 0, 0 }.  }
21070 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72  ;.  int i;.  str
21080 75 63 74 20 73 74 61 74 66 73 20 66 73 49 6e 66  uct statfs fsInf
21090 6f 3b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63  o;.  struct floc
210a0 6b 20 6c 6f 63 6b 49 6e 66 6f 3b 0a 0a 20 20 69  k lockInfo;..  i
210b0 66 28 20 21 66 69 6c 65 50 61 74 68 20 29 7b 0a  f( !filePath ){.
210c0 20 20 20 20 2f 2a 20 49 66 20 66 69 6c 65 50 61      /* If filePa
210d0 74 68 3d 3d 4e 55 4c 4c 20 74 68 61 74 20 6d 65  th==NULL that me
210e0 61 6e 73 20 77 65 20 61 72 65 20 64 65 61 6c 69  ans we are deali
210f0 6e 67 20 77 69 74 68 20 61 20 74 72 61 6e 73 69  ng with a transi
21100 65 6e 74 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20  ent file.    ** 
21110 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65  that does not ne
21120 65 64 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 2e  ed to be locked.
21130 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 26   */.    return &
21140 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b  nolockIoMethods;
21150 0a 20 20 7d 0a 20 20 69 66 28 20 73 74 61 74 66  .  }.  if( statf
21160 73 28 66 69 6c 65 50 61 74 68 2c 20 26 66 73 49  s(filePath, &fsI
21170 6e 66 6f 29 20 21 3d 20 2d 31 20 29 7b 0a 20 20  nfo) != -1 ){.  
21180 20 20 69 66 28 20 66 73 49 6e 66 6f 2e 66 5f 66    if( fsInfo.f_f
21190 6c 61 67 73 20 26 20 4d 4e 54 5f 52 44 4f 4e 4c  lags & MNT_RDONL
211a0 59 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  Y ){.      retur
211b0 6e 20 26 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f  n &nolockIoMetho
211c0 64 73 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  ds;.    }.    fo
211d0 72 28 69 3d 30 3b 20 61 4d 61 70 5b 69 5d 2e 7a  r(i=0; aMap[i].z
211e0 46 69 6c 65 73 79 73 74 65 6d 3b 20 69 2b 2b 29  Filesystem; i++)
211f0 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63  {.      if( strc
21200 6d 70 28 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79  mp(fsInfo.f_fsty
21210 70 65 6e 61 6d 65 2c 20 61 4d 61 70 5b 69 5d 2e  pename, aMap[i].
21220 7a 46 69 6c 65 73 79 73 74 65 6d 29 3d 3d 30 20  zFilesystem)==0 
21230 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
21240 6e 20 61 4d 61 70 5b 69 5d 2e 70 4d 65 74 68 6f  n aMap[i].pMetho
21250 64 73 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ds;.      }.    
21260 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 65 66 61  }.  }..  /* Defa
21270 75 6c 74 20 63 61 73 65 2e 20 48 61 6e 64 6c 65  ult case. Handle
21280 73 2c 20 61 6d 6f 6e 67 73 74 20 6f 74 68 65 72  s, amongst other
21290 73 2c 20 22 6e 66 73 22 2e 0a 20 20 2a 2a 20 54  s, "nfs"..  ** T
212a0 65 73 74 20 62 79 74 65 2d 72 61 6e 67 65 20 6c  est byte-range l
212b0 6f 63 6b 20 75 73 69 6e 67 20 66 63 6e 74 6c 28  ock using fcntl(
212c0 29 2e 20 49 66 20 74 68 65 20 63 61 6c 6c 20 73  ). If the call s
212d0 75 63 63 65 65 64 73 2c 20 0a 20 20 2a 2a 20 61  ucceeds, .  ** a
212e0 73 73 75 6d 65 20 74 68 61 74 20 74 68 65 20 66  ssume that the f
212f0 69 6c 65 2d 73 79 73 74 65 6d 20 73 75 70 70 6f  ile-system suppo
21300 72 74 73 20 50 4f 53 49 58 20 73 74 79 6c 65 20  rts POSIX style 
21310 6c 6f 63 6b 73 2e 20 0a 20 20 2a 2f 0a 20 20 6c  locks. .  */.  l
21320 6f 63 6b 49 6e 66 6f 2e 6c 5f 6c 65 6e 20 3d 20  ockInfo.l_len = 
21330 31 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f  1;.  lockInfo.l_
21340 73 74 61 72 74 20 3d 20 30 3b 0a 20 20 6c 6f 63  start = 0;.  loc
21350 6b 49 6e 66 6f 2e 6c 5f 77 68 65 6e 63 65 20 3d  kInfo.l_whence =
21360 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20 6c 6f 63   SEEK_SET;.  loc
21370 6b 49 6e 66 6f 2e 6c 5f 74 79 70 65 20 3d 20 46  kInfo.l_type = F
21380 5f 52 44 4c 43 4b 3b 0a 20 20 69 66 28 20 66 63  _RDLCK;.  if( fc
21390 6e 74 6c 28 70 4e 65 77 2d 3e 68 2c 20 46 5f 47  ntl(pNew->h, F_G
213a0 45 54 4c 4b 2c 20 26 6c 6f 63 6b 49 6e 66 6f 29  ETLK, &lockInfo)
213b0 21 3d 2d 31 20 29 20 7b 0a 20 20 20 20 69 66 28  !=-1 ) {.    if(
213c0 20 73 74 72 63 6d 70 28 66 73 49 6e 66 6f 2e 66   strcmp(fsInfo.f
213d0 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20 22 6e 66  _fstypename, "nf
213e0 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  s")==0 ){.      
213f0 72 65 74 75 72 6e 20 26 6e 66 73 49 6f 4d 65 74  return &nfsIoMet
21400 68 6f 64 73 3b 0a 20 20 20 20 7d 20 65 6c 73 65  hods;.    } else
21410 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   {.      return 
21420 26 70 6f 73 69 78 49 6f 4d 65 74 68 6f 64 73 3b  &posixIoMethods;
21430 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
21440 20 20 20 20 72 65 74 75 72 6e 20 26 64 6f 74 6c      return &dotl
21450 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20  ockIoMethods;.  
21460 7d 0a 7d 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  }.}.static const
21470 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
21480 6f 64 73 20 0a 20 20 2a 28 2a 63 6f 6e 73 74 20  ods .  *(*const 
21490 61 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72  autolockIoFinder
214a0 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 75 6e  )(const char*,un
214b0 69 78 46 69 6c 65 2a 29 20 3d 20 61 75 74 6f 6c  ixFile*) = autol
214c0 6f 63 6b 49 6f 46 69 6e 64 65 72 49 6d 70 6c 3b  ockIoFinderImpl;
214d0 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69  ..#endif /* defi
214e0 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26  ned(__APPLE__) &
214f0 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  & SQLITE_ENABLE_
21500 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 2a 2f  LOCKING_STYLE */
21510 0a 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53  ..#if OS_VXWORKS
21520 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
21530 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
21540 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 22 66 69 6e  /* .** This "fin
21550 64 65 72 22 20 66 75 6e 63 74 69 6f 6e 20 61 74  der" function at
21560 74 65 6d 70 74 73 20 74 6f 20 64 65 74 65 72 6d  tempts to determ
21570 69 6e 65 20 74 68 65 20 62 65 73 74 20 6c 6f 63  ine the best loc
21580 6b 69 6e 67 20 73 74 72 61 74 65 67 79 20 0a 2a  king strategy .*
21590 2a 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61  * for the databa
215a0 73 65 20 66 69 6c 65 20 22 66 69 6c 65 50 61 74  se file "filePat
215b0 68 22 2e 20 20 49 74 20 74 68 65 6e 20 72 65 74  h".  It then ret
215c0 75 72 6e 73 20 74 68 65 20 73 71 6c 69 74 65 33  urns the sqlite3
215d0 5f 69 6f 5f 6d 65 74 68 6f 64 73 0a 2a 2a 20 6f  _io_methods.** o
215e0 62 6a 65 63 74 20 74 68 61 74 20 69 6d 70 6c 65  bject that imple
215f0 6d 65 6e 74 73 20 74 68 61 74 20 73 74 72 61 74  ments that strat
21600 65 67 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  egy..**.** This 
21610 69 73 20 66 6f 72 20 56 58 57 6f 72 6b 73 20 6f  is for VXWorks o
21620 6e 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  nly..*/.static c
21630 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f  onst sqlite3_io_
21640 6d 65 74 68 6f 64 73 20 2a 61 75 74 6f 6c 6f 63  methods *autoloc
21650 6b 49 6f 46 69 6e 64 65 72 49 6d 70 6c 28 0a 20  kIoFinderImpl(. 
21660 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 69 6c   const char *fil
21670 65 50 61 74 68 2c 20 20 20 20 2f 2a 20 6e 61 6d  ePath,    /* nam
21680 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
21690 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 6e 69 78  e file */.  unix
216a0 46 69 6c 65 20 2a 70 4e 65 77 20 20 20 20 20 20  File *pNew      
216b0 20 20 20 20 20 2f 2a 20 74 68 65 20 6f 70 65 6e       /* the open
216c0 20 66 69 6c 65 20 6f 62 6a 65 63 74 20 2a 2f 0a   file object */.
216d0 29 7b 0a 20 20 73 74 72 75 63 74 20 66 6c 6f 63  ){.  struct floc
216e0 6b 20 6c 6f 63 6b 49 6e 66 6f 3b 0a 0a 20 20 69  k lockInfo;..  i
216f0 66 28 20 21 66 69 6c 65 50 61 74 68 20 29 7b 0a  f( !filePath ){.
21700 20 20 20 20 2f 2a 20 49 66 20 66 69 6c 65 50 61      /* If filePa
21710 74 68 3d 3d 4e 55 4c 4c 20 74 68 61 74 20 6d 65  th==NULL that me
21720 61 6e 73 20 77 65 20 61 72 65 20 64 65 61 6c 69  ans we are deali
21730 6e 67 20 77 69 74 68 20 61 20 74 72 61 6e 73 69  ng with a transi
21740 65 6e 74 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20  ent file.    ** 
21750 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65  that does not ne
21760 65 64 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 2e  ed to be locked.
21770 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 26   */.    return &
21780 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b  nolockIoMethods;
21790 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 65 73 74 20  .  }..  /* Test 
217a0 69 66 20 66 63 6e 74 6c 28 29 20 69 73 20 73 75  if fcntl() is su
217b0 70 70 6f 72 74 65 64 20 61 6e 64 20 75 73 65 20  pported and use 
217c0 50 4f 53 49 58 20 73 74 79 6c 65 20 6c 6f 63 6b  POSIX style lock
217d0 73 2e 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69 73  s..  ** Otherwis
217e0 65 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 74  e fall back to t
217f0 68 65 20 6e 61 6d 65 64 20 73 65 6d 61 70 68 6f  he named semapho
21800 72 65 20 6d 65 74 68 6f 64 2e 0a 20 20 2a 2f 0a  re method..  */.
21810 20 20 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 6c 65 6e    lockInfo.l_len
21820 20 3d 20 31 3b 0a 20 20 6c 6f 63 6b 49 6e 66 6f   = 1;.  lockInfo
21830 2e 6c 5f 73 74 61 72 74 20 3d 20 30 3b 0a 20 20  .l_start = 0;.  
21840 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 77 68 65 6e 63  lockInfo.l_whenc
21850 65 20 3d 20 53 45 45 4b 5f 53 45 54 3b 0a 20 20  e = SEEK_SET;.  
21860 6c 6f 63 6b 49 6e 66 6f 2e 6c 5f 74 79 70 65 20  lockInfo.l_type 
21870 3d 20 46 5f 52 44 4c 43 4b 3b 0a 20 20 69 66 28  = F_RDLCK;.  if(
21880 20 66 63 6e 74 6c 28 70 4e 65 77 2d 3e 68 2c 20   fcntl(pNew->h, 
21890 46 5f 47 45 54 4c 4b 2c 20 26 6c 6f 63 6b 49 6e  F_GETLK, &lockIn
218a0 66 6f 29 21 3d 2d 31 20 29 20 7b 0a 20 20 20 20  fo)!=-1 ) {.    
218b0 72 65 74 75 72 6e 20 26 70 6f 73 69 78 49 6f 4d  return &posixIoM
218c0 65 74 68 6f 64 73 3b 0a 20 20 7d 65 6c 73 65 7b  ethods;.  }else{
218d0 0a 20 20 20 20 72 65 74 75 72 6e 20 26 73 65 6d  .    return &sem
218e0 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20 7d 0a 7d  IoMethods;.  }.}
218f0 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 71  .static const sq
21900 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73  lite3_io_methods
21910 20 0a 20 20 2a 28 2a 63 6f 6e 73 74 20 61 75 74   .  *(*const aut
21920 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 29 28 63  olockIoFinder)(c
21930 6f 6e 73 74 20 63 68 61 72 2a 2c 75 6e 69 78 46  onst char*,unixF
21940 69 6c 65 2a 29 20 3d 20 61 75 74 6f 6c 6f 63 6b  ile*) = autolock
21950 49 6f 46 69 6e 64 65 72 49 6d 70 6c 3b 0a 0a 23  IoFinderImpl;..#
21960 65 6e 64 69 66 20 2f 2a 20 4f 53 5f 56 58 57 4f  endif /* OS_VXWO
21970 52 4b 53 20 26 26 20 53 51 4c 49 54 45 5f 45 4e  RKS && SQLITE_EN
21980 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
21990 4c 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  LE */../*.** An 
219a0 61 62 73 74 72 61 63 74 20 74 79 70 65 20 66 6f  abstract type fo
219b0 72 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  r a pointer to a
219c0 20 49 4f 20 6d 65 74 68 6f 64 20 66 69 6e 64 65   IO method finde
219d0 72 20 66 75 6e 63 74 69 6f 6e 3a 0a 2a 2f 0a 74  r function:.*/.t
219e0 79 70 65 64 65 66 20 63 6f 6e 73 74 20 73 71 6c  ypedef const sql
219f0 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
21a00 2a 28 2a 66 69 6e 64 65 72 5f 74 79 70 65 29 28  *(*finder_type)(
21a10 63 6f 6e 73 74 20 63 68 61 72 2a 2c 75 6e 69 78  const char*,unix
21a20 46 69 6c 65 2a 29 3b 0a 0a 0a 2f 2a 2a 2a 2a 2a  File*);.../*****
21a30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21a40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21a50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21a60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21a70 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  *******.********
21a80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21a90 2a 2a 2a 2a 20 73 71 6c 69 74 65 33 5f 76 66 73  **** sqlite3_vfs
21aa0 20 6d 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a   methods *******
21ab0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21ac0 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
21ad0 20 64 69 76 69 73 69 6f 6e 20 63 6f 6e 74 61 69   division contai
21ae0 6e 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74  ns the implement
21af0 61 74 69 6f 6e 20 6f 66 20 6d 65 74 68 6f 64 73  ation of methods
21b00 20 6f 6e 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74   on the.** sqlit
21b10 65 33 5f 76 66 73 20 6f 62 6a 65 63 74 2e 0a 2a  e3_vfs object..*
21b20 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  /../*.** Initial
21b30 69 7a 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ize the contents
21b40 20 6f 66 20 74 68 65 20 75 6e 69 78 46 69 6c 65   of the unixFile
21b50 20 73 74 72 75 63 74 75 72 65 20 70 6f 69 6e 74   structure point
21b60 65 64 20 74 6f 20 62 79 20 70 49 64 2e 0a 2a 2f  ed to by pId..*/
21b70 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c 6c  .static int fill
21b80 49 6e 55 6e 69 78 46 69 6c 65 28 0a 20 20 73 71  InUnixFile(.  sq
21b90 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
21ba0 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
21bb0 20 74 6f 20 76 66 73 20 6f 62 6a 65 63 74 20 2a   to vfs object *
21bc0 2f 0a 20 20 69 6e 74 20 68 2c 20 20 20 20 20 20  /.  int h,      
21bd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
21be0 70 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70  pen file descrip
21bf0 74 6f 72 20 6f 66 20 66 69 6c 65 20 62 65 69 6e  tor of file bein
21c00 67 20 6f 70 65 6e 65 64 20 2a 2f 0a 20 20 69 6e  g opened */.  in
21c10 74 20 64 69 72 66 64 2c 20 20 20 20 20 20 20 20  t dirfd,        
21c20 20 20 20 20 20 20 2f 2a 20 44 69 72 65 63 74 6f        /* Directo
21c30 72 79 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  ry file descript
21c40 6f 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  or */.  sqlite3_
21c50 66 69 6c 65 20 2a 70 49 64 2c 20 20 20 20 20 20  file *pId,      
21c60 2f 2a 20 57 72 69 74 65 20 74 6f 20 74 68 65 20  /* Write to the 
21c70 75 6e 69 78 46 69 6c 65 20 73 74 72 75 63 74 75  unixFile structu
21c80 72 65 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e  re here */.  con
21c90 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
21ca0 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20  me,  /* Name of 
21cb0 74 68 65 20 66 69 6c 65 20 62 65 69 6e 67 20 6f  the file being o
21cc0 70 65 6e 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e  pened */.  int n
21cd0 6f 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20  oLock,          
21ce0 20 20 20 2f 2a 20 4f 6d 69 74 20 6c 6f 63 6b 69     /* Omit locki
21cf0 6e 67 20 69 66 20 74 72 75 65 20 2a 2f 0a 20 20  ng if true */.  
21d00 69 6e 74 20 69 73 44 65 6c 65 74 65 20 20 20 20  int isDelete    
21d10 20 20 20 20 20 20 20 20 2f 2a 20 44 65 6c 65 74          /* Delet
21d20 65 20 6f 6e 20 63 6c 6f 73 65 20 69 66 20 74 72  e on close if tr
21d30 75 65 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74  ue */.){.  const
21d40 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
21d50 6f 64 73 20 2a 70 4c 6f 63 6b 69 6e 67 53 74 79  ods *pLockingSty
21d60 6c 65 3b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a  le;.  unixFile *
21d70 70 4e 65 77 20 3d 20 28 75 6e 69 78 46 69 6c 65  pNew = (unixFile
21d80 20 2a 29 70 49 64 3b 0a 20 20 69 6e 74 20 72 63   *)pId;.  int rc
21d90 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
21da0 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 70   assert( pNew->p
21db0 49 6e 6f 64 65 3d 3d 4e 55 4c 4c 20 29 3b 0a 0a  Inode==NULL );..
21dc0 20 20 2f 2a 20 50 61 72 61 6d 65 74 65 72 20 69    /* Parameter i
21dd0 73 44 65 6c 65 74 65 20 69 73 20 6f 6e 6c 79 20  sDelete is only 
21de0 75 73 65 64 20 6f 6e 20 76 78 77 6f 72 6b 73 2e  used on vxworks.
21df0 20 45 78 70 72 65 73 73 20 74 68 69 73 20 65 78   Express this ex
21e00 70 6c 69 63 69 74 6c 79 20 0a 20 20 2a 2a 20 68  plicitly .  ** h
21e10 65 72 65 20 74 6f 20 70 72 65 76 65 6e 74 20 63  ere to prevent c
21e20 6f 6d 70 69 6c 65 72 20 77 61 72 6e 69 6e 67 73  ompiler warnings
21e30 20 61 62 6f 75 74 20 75 6e 75 73 65 64 20 70 61   about unused pa
21e40 72 61 6d 65 74 65 72 73 2e 0a 20 20 2a 2f 0a 20  rameters..  */. 
21e50 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
21e60 52 28 69 73 44 65 6c 65 74 65 29 3b 0a 0a 20 20  R(isDelete);..  
21e70 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e 20 20  OSTRACE(("OPEN  
21e80 20 20 25 2d 33 64 20 25 73 5c 6e 22 2c 20 68 2c    %-3d %s\n", h,
21e90 20 7a 46 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20   zFilename));.  
21ea0 70 4e 65 77 2d 3e 68 20 3d 20 68 3b 0a 20 20 70  pNew->h = h;.  p
21eb0 4e 65 77 2d 3e 64 69 72 66 64 20 3d 20 64 69 72  New->dirfd = dir
21ec0 66 64 3b 0a 20 20 70 4e 65 77 2d 3e 66 69 6c 65  fd;.  pNew->file
21ed0 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 61 73 73  Flags = 0;.  ass
21ee0 65 72 74 28 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d  ert( zFilename==
21ef0 30 20 7c 7c 20 7a 46 69 6c 65 6e 61 6d 65 5b 30  0 || zFilename[0
21f00 5d 3d 3d 27 2f 27 20 29 3b 20 20 2f 2a 20 4e 65  ]=='/' );  /* Ne
21f10 76 65 72 20 61 20 72 65 6c 61 74 69 76 65 20 70  ver a relative p
21f20 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 70 4e 65  athname */.  pNe
21f30 77 2d 3e 7a 50 61 74 68 20 3d 20 7a 46 69 6c 65  w->zPath = zFile
21f40 6e 61 6d 65 3b 0a 0a 23 69 66 20 4f 53 5f 56 58  name;..#if OS_VX
21f50 57 4f 52 4b 53 0a 20 20 70 4e 65 77 2d 3e 70 49  WORKS.  pNew->pI
21f60 64 20 3d 20 76 78 77 6f 72 6b 73 46 69 6e 64 46  d = vxworksFindF
21f70 69 6c 65 49 64 28 7a 46 69 6c 65 6e 61 6d 65 29  ileId(zFilename)
21f80 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e 70 49  ;.  if( pNew->pI
21f90 64 3d 3d 30 20 29 7b 0a 20 20 20 20 6e 6f 4c 6f  d==0 ){.    noLo
21fa0 63 6b 20 3d 20 31 3b 0a 20 20 20 20 72 63 20 3d  ck = 1;.    rc =
21fb0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
21fc0 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28   }.#endif..  if(
21fd0 20 6e 6f 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70   noLock ){.    p
21fe0 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 20 26  LockingStyle = &
21ff0 6e 6f 6c 6f 63 6b 49 6f 4d 65 74 68 6f 64 73 3b  nolockIoMethods;
22000 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4c  .  }else{.    pL
22010 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d 20 28 2a  ockingStyle = (*
22020 2a 28 66 69 6e 64 65 72 5f 74 79 70 65 2a 29 70  *(finder_type*)p
22030 56 66 73 2d 3e 70 41 70 70 44 61 74 61 29 28 7a  Vfs->pAppData)(z
22040 46 69 6c 65 6e 61 6d 65 2c 20 70 4e 65 77 29 3b  Filename, pNew);
22050 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  .#if SQLITE_ENAB
22060 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
22070 0a 20 20 20 20 2f 2a 20 43 61 63 68 65 20 7a 46  .    /* Cache zF
22080 69 6c 65 6e 61 6d 65 20 69 6e 20 74 68 65 20 6c  ilename in the l
22090 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 28  ocking context (
220a0 41 46 50 20 61 6e 64 20 64 6f 74 6c 6f 63 6b 20  AFP and dotlock 
220b0 6f 76 65 72 72 69 64 65 29 20 66 6f 72 0a 20 20  override) for.  
220c0 20 20 2a 2a 20 70 72 6f 78 79 4c 6f 63 6b 20 61    ** proxyLock a
220d0 63 74 69 76 61 74 69 6f 6e 20 69 73 20 70 6f 73  ctivation is pos
220e0 73 69 62 6c 65 20 28 72 65 6d 6f 74 65 20 70 72  sible (remote pr
220f0 6f 78 79 20 69 73 20 62 61 73 65 64 20 6f 6e 20  oxy is based on 
22100 64 62 20 6e 61 6d 65 29 0a 20 20 20 20 2a 2a 20  db name).    ** 
22110 7a 46 69 6c 65 6e 61 6d 65 20 72 65 6d 61 69 6e  zFilename remain
22120 73 20 76 61 6c 69 64 20 75 6e 74 69 6c 20 66 69  s valid until fi
22130 6c 65 20 69 73 20 63 6c 6f 73 65 64 2c 20 74 6f  le is closed, to
22140 20 73 75 70 70 6f 72 74 20 2a 2f 0a 20 20 20 20   support */.    
22150 70 4e 65 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  pNew->lockingCon
22160 74 65 78 74 20 3d 20 28 76 6f 69 64 2a 29 7a 46  text = (void*)zF
22170 69 6c 65 6e 61 6d 65 3b 0a 23 65 6e 64 69 66 0a  ilename;.#endif.
22180 20 20 7d 0a 0a 20 20 69 66 28 20 70 4c 6f 63 6b    }..  if( pLock
22190 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26 70 6f 73  ingStyle == &pos
221a0 69 78 49 6f 4d 65 74 68 6f 64 73 0a 23 69 66 20  ixIoMethods.#if 
221b0 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
221c0 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41  _) && SQLITE_ENA
221d0 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
221e0 45 0a 20 20 20 20 7c 7c 20 70 4c 6f 63 6b 69 6e  E.    || pLockin
221f0 67 53 74 79 6c 65 20 3d 3d 20 26 6e 66 73 49 6f  gStyle == &nfsIo
22200 4d 65 74 68 6f 64 73 0a 23 65 6e 64 69 66 0a 20  Methods.#endif. 
22210 20 29 7b 0a 20 20 20 20 75 6e 69 78 45 6e 74 65   ){.    unixEnte
22220 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 72 63  rMutex();.    rc
22230 20 3d 20 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f   = findInodeInfo
22240 28 70 4e 65 77 2c 20 26 70 4e 65 77 2d 3e 70 49  (pNew, &pNew->pI
22250 6e 6f 64 65 29 3b 0a 20 20 20 20 69 66 28 20 72  node);.    if( r
22260 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
22270 20 20 20 20 20 20 2f 2a 20 49 66 20 61 6e 20 65        /* If an e
22280 72 72 6f 72 20 6f 63 63 75 72 65 64 20 69 6e 20  rror occured in 
22290 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29 2c  findInodeInfo(),
222a0 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c 65 20   close the file 
222b0 64 65 73 63 72 69 70 74 6f 72 0a 20 20 20 20 20  descriptor.     
222c0 20 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 2c   ** immediately,
222d0 20 62 65 66 6f 72 65 20 72 65 6c 65 61 73 69 6e   before releasin
222e0 67 20 74 68 65 20 6d 75 74 65 78 2e 20 66 69 6e  g the mutex. fin
222f0 64 49 6e 6f 64 65 49 6e 66 6f 28 29 20 6d 61 79  dInodeInfo() may
22300 20 66 61 69 6c 0a 20 20 20 20 20 20 2a 2a 20 69   fail.      ** i
22310 6e 20 74 77 6f 20 73 63 65 6e 61 72 69 6f 73 3a  n two scenarios:
22320 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
22330 2a 2a 20 20 20 28 61 29 20 41 20 63 61 6c 6c 20  **   (a) A call 
22340 74 6f 20 66 73 74 61 74 28 29 20 66 61 69 6c 65  to fstat() faile
22350 64 2e 0a 20 20 20 20 20 20 2a 2a 20 20 20 28 62  d..      **   (b
22360 29 20 41 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 65  ) A malloc faile
22370 64 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  d..      **.    
22380 20 20 2a 2a 20 53 63 65 6e 61 72 69 6f 20 28 62    ** Scenario (b
22390 29 20 6d 61 79 20 6f 6e 6c 79 20 6f 63 63 75 72  ) may only occur
223a0 20 69 66 20 74 68 65 20 70 72 6f 63 65 73 73 20   if the process 
223b0 69 73 20 68 6f 6c 64 69 6e 67 20 6e 6f 20 6f 74  is holding no ot
223c0 68 65 72 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c  her.      ** fil
223d0 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 6f 70  e descriptors op
223e0 65 6e 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 66  en on the same f
223f0 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20 77 65  ile. If there we
22400 72 65 20 6f 74 68 65 72 20 66 69 6c 65 0a 20 20  re other file.  
22410 20 20 20 20 2a 2a 20 64 65 73 63 72 69 70 74 6f      ** descripto
22420 72 73 20 6f 6e 20 74 68 69 73 20 66 69 6c 65 2c  rs on this file,
22430 20 74 68 65 6e 20 6e 6f 20 6d 61 6c 6c 6f 63 20   then no malloc 
22440 77 6f 75 6c 64 20 62 65 20 72 65 71 75 69 72 65  would be require
22450 64 20 62 79 0a 20 20 20 20 20 20 2a 2a 20 66 69  d by.      ** fi
22460 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 29 2e 20 49  ndInodeInfo(). I
22470 66 20 74 68 69 73 20 69 73 20 74 68 65 20 63 61  f this is the ca
22480 73 65 2c 20 69 74 20 69 73 20 71 75 69 74 65 20  se, it is quite 
22490 73 61 66 65 20 74 6f 20 63 6c 6f 73 65 0a 20 20  safe to close.  
224a0 20 20 20 20 2a 2a 20 68 61 6e 64 6c 65 20 68 20      ** handle h 
224b0 2d 20 61 73 20 69 74 20 69 73 20 67 75 61 72 61  - as it is guara
224c0 6e 74 65 65 64 20 74 68 61 74 20 6e 6f 20 70 6f  nteed that no po
224d0 73 69 78 20 6c 6f 63 6b 73 20 77 69 6c 6c 20 62  six locks will b
224e0 65 20 72 65 6c 65 61 73 65 64 0a 20 20 20 20 20  e released.     
224f0 20 2a 2a 20 62 79 20 64 6f 69 6e 67 20 73 6f 2e   ** by doing so.
22500 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
22510 2a 2a 20 49 66 20 73 63 65 6e 61 72 69 6f 20 28  ** If scenario (
22520 61 29 20 63 61 75 73 65 64 20 74 68 65 20 65 72  a) caused the er
22530 72 6f 72 20 74 68 65 6e 20 74 68 69 6e 67 73 20  ror then things 
22540 61 72 65 20 6e 6f 74 20 73 6f 20 73 61 66 65 2e  are not so safe.
22550 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 69 6d   The.      ** im
22560 70 6c 69 63 69 74 20 61 73 73 75 6d 70 74 69 6f  plicit assumptio
22570 6e 20 68 65 72 65 20 69 73 20 74 68 61 74 20 69  n here is that i
22580 66 20 66 73 74 61 74 28 29 20 66 61 69 6c 73 2c  f fstat() fails,
22590 20 74 68 69 6e 67 73 20 61 72 65 20 69 6e 0a 20   things are in. 
225a0 20 20 20 20 20 2a 2a 20 73 75 63 68 20 62 61 64       ** such bad
225b0 20 73 68 61 70 65 20 74 68 61 74 20 64 72 6f 70   shape that drop
225c0 70 69 6e 67 20 61 20 6c 6f 63 6b 20 6f 72 20 74  ping a lock or t
225d0 77 6f 20 64 6f 65 73 6e 27 74 20 6d 61 74 74 65  wo doesn't matte
225e0 72 20 6d 75 63 68 2e 0a 20 20 20 20 20 20 2a 2f  r much..      */
225f0 0a 20 20 20 20 20 20 63 6c 6f 73 65 28 68 29 3b  .      close(h);
22600 0a 20 20 20 20 20 20 68 20 3d 20 2d 31 3b 0a 20  .      h = -1;. 
22610 20 20 20 7d 0a 20 20 20 20 75 6e 69 78 4c 65 61     }.    unixLea
22620 76 65 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a 0a  veMutex();.  }..
22630 23 69 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  #if SQLITE_ENABL
22640 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
22650 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50  && defined(__APP
22660 4c 45 5f 5f 29 0a 20 20 65 6c 73 65 20 69 66 28  LE__).  else if(
22670 20 70 4c 6f 63 6b 69 6e 67 53 74 79 6c 65 20 3d   pLockingStyle =
22680 3d 20 26 61 66 70 49 6f 4d 65 74 68 6f 64 73 20  = &afpIoMethods 
22690 29 7b 0a 20 20 20 20 2f 2a 20 41 46 50 20 6c 6f  ){.    /* AFP lo
226a0 63 6b 69 6e 67 20 75 73 65 73 20 74 68 65 20 66  cking uses the f
226b0 69 6c 65 20 70 61 74 68 20 73 6f 20 69 74 20 6e  ile path so it n
226c0 65 65 64 73 20 74 6f 20 62 65 20 69 6e 63 6c 75  eeds to be inclu
226d0 64 65 64 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68  ded in.    ** th
226e0 65 20 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74  e afpLockingCont
226f0 65 78 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ext..    */.    
22700 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  afpLockingContex
22710 74 20 2a 70 43 74 78 3b 0a 20 20 20 20 70 4e 65  t *pCtx;.    pNe
22720 77 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78  w->lockingContex
22730 74 20 3d 20 70 43 74 78 20 3d 20 73 71 6c 69 74  t = pCtx = sqlit
22740 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  e3_malloc( sizeo
22750 66 28 2a 70 43 74 78 29 20 29 3b 0a 20 20 20 20  f(*pCtx) );.    
22760 69 66 28 20 70 43 74 78 3d 3d 30 20 29 7b 0a 20  if( pCtx==0 ){. 
22770 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
22780 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73  _NOMEM;.    }els
22790 65 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 42 3a 20  e{.      /* NB: 
227a0 7a 46 69 6c 65 6e 61 6d 65 20 65 78 69 73 74 73  zFilename exists
227b0 20 61 6e 64 20 72 65 6d 61 69 6e 73 20 76 61 6c   and remains val
227c0 69 64 20 75 6e 74 69 6c 20 74 68 65 20 66 69 6c  id until the fil
227d0 65 20 69 73 20 63 6c 6f 73 65 64 0a 20 20 20 20  e is closed.    
227e0 20 20 2a 2a 20 61 63 63 6f 72 64 69 6e 67 20 74    ** according t
227f0 6f 20 72 65 71 75 69 72 65 6d 65 6e 74 20 46 31  o requirement F1
22800 31 31 34 31 2e 20 20 53 6f 20 77 65 20 64 6f 20  1141.  So we do 
22810 6e 6f 74 20 6e 65 65 64 20 74 6f 20 6d 61 6b 65  not need to make
22820 20 61 0a 20 20 20 20 20 20 2a 2a 20 63 6f 70 79   a.      ** copy
22830 20 6f 66 20 74 68 65 20 66 69 6c 65 6e 61 6d 65   of the filename
22840 2e 20 2a 2f 0a 20 20 20 20 20 20 70 43 74 78 2d  . */.      pCtx-
22850 3e 64 62 50 61 74 68 20 3d 20 7a 46 69 6c 65 6e  >dbPath = zFilen
22860 61 6d 65 3b 0a 20 20 20 20 20 20 70 43 74 78 2d  ame;.      pCtx-
22870 3e 72 65 73 65 72 76 65 64 20 3d 20 30 3b 0a 20  >reserved = 0;. 
22880 20 20 20 20 20 73 72 61 6e 64 6f 6d 64 65 76 28       srandomdev(
22890 29 3b 0a 20 20 20 20 20 20 75 6e 69 78 45 6e 74  );.      unixEnt
228a0 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 20  erMutex();.     
228b0 20 72 63 20 3d 20 66 69 6e 64 49 6e 6f 64 65 49   rc = findInodeI
228c0 6e 66 6f 28 70 4e 65 77 2c 20 26 70 4e 65 77 2d  nfo(pNew, &pNew-
228d0 3e 70 49 6e 6f 64 65 29 3b 0a 20 20 20 20 20 20  >pInode);.      
228e0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
228f0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  K ){.        sql
22900 69 74 65 33 5f 66 72 65 65 28 70 4e 65 77 2d 3e  ite3_free(pNew->
22910 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 29 3b  lockingContext);
22920 0a 20 20 20 20 20 20 20 20 63 6c 6f 73 65 28 68  .        close(h
22930 29 3b 0a 20 20 20 20 20 20 20 20 68 20 3d 20 2d  );.        h = -
22940 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
22950 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
22960 29 3b 20 20 20 20 20 20 20 20 0a 20 20 20 20 7d  );        .    }
22970 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 65  .  }.#endif..  e
22980 6c 73 65 20 69 66 28 20 70 4c 6f 63 6b 69 6e 67  lse if( pLocking
22990 53 74 79 6c 65 20 3d 3d 20 26 64 6f 74 6c 6f 63  Style == &dotloc
229a0 6b 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20  kIoMethods ){.  
229b0 20 20 2f 2a 20 44 6f 74 66 69 6c 65 20 6c 6f 63    /* Dotfile loc
229c0 6b 69 6e 67 20 75 73 65 73 20 74 68 65 20 66 69  king uses the fi
229d0 6c 65 20 70 61 74 68 20 73 6f 20 69 74 20 6e 65  le path so it ne
229e0 65 64 73 20 74 6f 20 62 65 20 69 6e 63 6c 75 64  eds to be includ
229f0 65 64 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65  ed in.    ** the
22a00 20 64 6f 74 6c 6f 63 6b 4c 6f 63 6b 69 6e 67 43   dotlockLockingC
22a10 6f 6e 74 65 78 74 20 0a 20 20 20 20 2a 2f 0a 20  ontext .    */. 
22a20 20 20 20 63 68 61 72 20 2a 7a 4c 6f 63 6b 46 69     char *zLockFi
22a30 6c 65 3b 0a 20 20 20 20 69 6e 74 20 6e 46 69 6c  le;.    int nFil
22a40 65 6e 61 6d 65 3b 0a 20 20 20 20 6e 46 69 6c 65  ename;.    nFile
22a50 6e 61 6d 65 20 3d 20 28 69 6e 74 29 73 74 72 6c  name = (int)strl
22a60 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 29 20 2b 20  en(zFilename) + 
22a70 36 3b 0a 20 20 20 20 7a 4c 6f 63 6b 46 69 6c 65  6;.    zLockFile
22a80 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74   = (char *)sqlit
22a90 65 33 5f 6d 61 6c 6c 6f 63 28 6e 46 69 6c 65 6e  e3_malloc(nFilen
22aa0 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 7a 4c  ame);.    if( zL
22ab0 6f 63 6b 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20  ockFile==0 ){.  
22ac0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
22ad0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65  NOMEM;.    }else
22ae0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
22af0 73 6e 70 72 69 6e 74 66 28 6e 46 69 6c 65 6e 61  snprintf(nFilena
22b00 6d 65 2c 20 7a 4c 6f 63 6b 46 69 6c 65 2c 20 22  me, zLockFile, "
22b10 25 73 22 20 44 4f 54 4c 4f 43 4b 5f 53 55 46 46  %s" DOTLOCK_SUFF
22b20 49 58 2c 20 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  IX, zFilename);.
22b30 20 20 20 20 7d 0a 20 20 20 20 70 4e 65 77 2d 3e      }.    pNew->
22b40 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d  lockingContext =
22b50 20 7a 4c 6f 63 6b 46 69 6c 65 3b 0a 20 20 7d 0a   zLockFile;.  }.
22b60 0a 23 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  .#if OS_VXWORKS.
22b70 20 20 65 6c 73 65 20 69 66 28 20 70 4c 6f 63 6b    else if( pLock
22b80 69 6e 67 53 74 79 6c 65 20 3d 3d 20 26 73 65 6d  ingStyle == &sem
22b90 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20  IoMethods ){.   
22ba0 20 2f 2a 20 4e 61 6d 65 64 20 73 65 6d 61 70 68   /* Named semaph
22bb0 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 75 73 65 73  ore locking uses
22bc0 20 74 68 65 20 66 69 6c 65 20 70 61 74 68 20 73   the file path s
22bd0 6f 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65  o it needs to be
22be0 0a 20 20 20 20 2a 2a 20 69 6e 63 6c 75 64 65 64  .    ** included
22bf0 20 69 6e 20 74 68 65 20 73 65 6d 4c 6f 63 6b 69   in the semLocki
22c00 6e 67 43 6f 6e 74 65 78 74 0a 20 20 20 20 2a 2f  ngContext.    */
22c10 0a 20 20 20 20 75 6e 69 78 45 6e 74 65 72 4d 75  .    unixEnterMu
22c20 74 65 78 28 29 3b 0a 20 20 20 20 72 63 20 3d 20  tex();.    rc = 
22c30 66 69 6e 64 49 6e 6f 64 65 49 6e 66 6f 28 70 4e  findInodeInfo(pN
22c40 65 77 2c 20 26 70 4e 65 77 2d 3e 70 49 6e 6f 64  ew, &pNew->pInod
22c50 65 29 3b 0a 20 20 20 20 69 66 28 20 28 72 63 3d  e);.    if( (rc=
22c60 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 26 26 20 28  =SQLITE_OK) && (
22c70 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 70 53  pNew->pInode->pS
22c80 65 6d 3d 3d 4e 55 4c 4c 29 20 29 7b 0a 20 20 20  em==NULL) ){.   
22c90 20 20 20 63 68 61 72 20 2a 7a 53 65 6d 4e 61 6d     char *zSemNam
22ca0 65 20 3d 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65  e = pNew->pInode
22cb0 2d 3e 61 53 65 6d 4e 61 6d 65 3b 0a 20 20 20 20  ->aSemName;.    
22cc0 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 73    int n;.      s
22cd0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
22ce0 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2c 20 7a 53  MAX_PATHNAME, zS
22cf0 65 6d 4e 61 6d 65 2c 20 22 2f 25 73 2e 73 65 6d  emName, "/%s.sem
22d00 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
22d10 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
22d20 70 49 64 2d 3e 7a 43 61 6e 6f 6e 69 63 61 6c 4e  pId->zCanonicalN
22d30 61 6d 65 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  ame);.      for(
22d40 20 6e 3d 31 3b 20 7a 53 65 6d 4e 61 6d 65 5b 6e   n=1; zSemName[n
22d50 5d 3b 20 6e 2b 2b 20 29 0a 20 20 20 20 20 20 20  ]; n++ ).       
22d60 20 69 66 28 20 7a 53 65 6d 4e 61 6d 65 5b 6e 5d   if( zSemName[n]
22d70 3d 3d 27 2f 27 20 29 20 7a 53 65 6d 4e 61 6d 65  =='/' ) zSemName
22d80 5b 6e 5d 20 3d 20 27 5f 27 3b 0a 20 20 20 20 20  [n] = '_';.     
22d90 20 70 4e 65 77 2d 3e 70 49 6e 6f 64 65 2d 3e 70   pNew->pInode->p
22da0 53 65 6d 20 3d 20 73 65 6d 5f 6f 70 65 6e 28 7a  Sem = sem_open(z
22db0 53 65 6d 4e 61 6d 65 2c 20 4f 5f 43 52 45 41 54  SemName, O_CREAT
22dc0 2c 20 30 36 36 36 2c 20 31 29 3b 0a 20 20 20 20  , 0666, 1);.    
22dd0 20 20 69 66 28 20 70 4e 65 77 2d 3e 70 49 6e 6f    if( pNew->pIno
22de0 64 65 2d 3e 70 53 65 6d 20 3d 3d 20 53 45 4d 5f  de->pSem == SEM_
22df0 46 41 49 4c 45 44 20 29 7b 0a 20 20 20 20 20 20  FAILED ){.      
22e00 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
22e10 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  MEM;.        pNe
22e20 77 2d 3e 70 49 6e 6f 64 65 2d 3e 61 53 65 6d 4e  w->pInode->aSemN
22e30 61 6d 65 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 20  ame[0] = '\0';. 
22e40 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
22e50 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65 78 28   unixLeaveMutex(
22e60 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
22e70 0a 20 20 70 4e 65 77 2d 3e 6c 61 73 74 45 72 72  .  pNew->lastErr
22e80 6e 6f 20 3d 20 30 3b 0a 23 69 66 20 4f 53 5f 56  no = 0;.#if OS_V
22e90 58 57 4f 52 4b 53 0a 20 20 69 66 28 20 72 63 21  XWORKS.  if( rc!
22ea0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
22eb0 20 20 69 66 28 20 68 3e 3d 30 20 29 20 63 6c 6f    if( h>=0 ) clo
22ec0 73 65 28 68 29 3b 0a 20 20 20 20 68 20 3d 20 2d  se(h);.    h = -
22ed0 31 3b 0a 20 20 20 20 75 6e 6c 69 6e 6b 28 7a 46  1;.    unlink(zF
22ee0 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 69 73  ilename);.    is
22ef0 44 65 6c 65 74 65 20 3d 20 30 3b 0a 20 20 7d 0a  Delete = 0;.  }.
22f00 20 20 70 4e 65 77 2d 3e 69 73 44 65 6c 65 74 65    pNew->isDelete
22f10 20 3d 20 69 73 44 65 6c 65 74 65 3b 0a 23 65 6e   = isDelete;.#en
22f20 64 69 66 0a 20 20 69 66 28 20 72 63 21 3d 53 51  dif.  if( rc!=SQ
22f30 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
22f40 66 28 20 64 69 72 66 64 3e 3d 30 20 29 20 63 6c  f( dirfd>=0 ) cl
22f50 6f 73 65 28 64 69 72 66 64 29 3b 20 2f 2a 20 73  ose(dirfd); /* s
22f60 69 6c 65 6e 74 20 6c 65 61 6b 20 69 66 20 66 61  ilent leak if fa
22f70 69 6c 2c 20 61 6c 72 65 61 64 79 20 69 6e 20 65  il, already in e
22f80 72 72 6f 72 20 2a 2f 0a 20 20 20 20 69 66 28 20  rror */.    if( 
22f90 68 3e 3d 30 20 29 20 63 6c 6f 73 65 28 68 29 3b  h>=0 ) close(h);
22fa0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4e  .  }else{.    pN
22fb0 65 77 2d 3e 70 4d 65 74 68 6f 64 20 3d 20 70 4c  ew->pMethod = pL
22fc0 6f 63 6b 69 6e 67 53 74 79 6c 65 3b 0a 20 20 20  ockingStyle;.   
22fd0 20 4f 70 65 6e 43 6f 75 6e 74 65 72 28 2b 31 29   OpenCounter(+1)
22fe0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
22ff0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e  c;.}../*.** Open
23000 20 61 20 66 69 6c 65 20 64 65 73 63 72 69 70 74   a file descript
23010 6f 72 20 74 6f 20 74 68 65 20 64 69 72 65 63 74  or to the direct
23020 6f 72 79 20 63 6f 6e 74 61 69 6e 69 6e 67 20 66  ory containing f
23030 69 6c 65 20 7a 46 69 6c 65 6e 61 6d 65 2e 0a 2a  ile zFilename..*
23040 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
23050 20 2a 70 46 64 20 69 73 20 73 65 74 20 74 6f 20   *pFd is set to 
23060 74 68 65 20 6f 70 65 6e 65 64 20 66 69 6c 65 20  the opened file 
23070 64 65 73 63 72 69 70 74 6f 72 20 61 6e 64 0a 2a  descriptor and.*
23080 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
23090 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 65  eturned. If an e
230a0 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 65 69 74  rror occurs, eit
230b0 68 65 72 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  her SQLITE_NOMEM
230c0 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f 43 41  .** or SQLITE_CA
230d0 4e 54 4f 50 45 4e 20 69 73 20 72 65 74 75 72 6e  NTOPEN is return
230e0 65 64 20 61 6e 64 20 2a 70 46 64 20 69 73 20 73  ed and *pFd is s
230f0 65 74 20 74 6f 20 61 6e 20 75 6e 64 65 66 69 6e  et to an undefin
23100 65 64 0a 2a 2a 20 76 61 6c 75 65 2e 0a 2a 2a 0a  ed.** value..**.
23110 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 4f 4b 20  ** If SQLITE_OK 
23120 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65  is returned, the
23130 20 63 61 6c 6c 65 72 20 69 73 20 72 65 73 70 6f   caller is respo
23140 6e 73 69 62 6c 65 20 66 6f 72 20 63 6c 6f 73 69  nsible for closi
23150 6e 67 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20 64  ng.** the file d
23160 65 73 63 72 69 70 74 6f 72 20 2a 70 46 64 20 75  escriptor *pFd u
23170 73 69 6e 67 20 63 6c 6f 73 65 28 29 2e 0a 2a 2f  sing close()..*/
23180 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 70 65 6e  .static int open
23190 44 69 72 65 63 74 6f 72 79 28 63 6f 6e 73 74 20  Directory(const 
231a0 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
231b0 20 69 6e 74 20 2a 70 46 64 29 7b 0a 20 20 69 6e   int *pFd){.  in
231c0 74 20 69 69 3b 0a 20 20 69 6e 74 20 66 64 20 3d  t ii;.  int fd =
231d0 20 2d 31 3b 0a 20 20 63 68 61 72 20 7a 44 69 72   -1;.  char zDir
231e0 6e 61 6d 65 5b 4d 41 58 5f 50 41 54 48 4e 41 4d  name[MAX_PATHNAM
231f0 45 2b 31 5d 3b 0a 0a 20 20 73 71 6c 69 74 65 33  E+1];..  sqlite3
23200 5f 73 6e 70 72 69 6e 74 66 28 4d 41 58 5f 50 41  _snprintf(MAX_PA
23210 54 48 4e 41 4d 45 2c 20 7a 44 69 72 6e 61 6d 65  THNAME, zDirname
23220 2c 20 22 25 73 22 2c 20 7a 46 69 6c 65 6e 61 6d  , "%s", zFilenam
23230 65 29 3b 0a 20 20 66 6f 72 28 69 69 3d 28 69 6e  e);.  for(ii=(in
23240 74 29 73 74 72 6c 65 6e 28 7a 44 69 72 6e 61 6d  t)strlen(zDirnam
23250 65 29 3b 20 69 69 3e 31 20 26 26 20 7a 44 69 72  e); ii>1 && zDir
23260 6e 61 6d 65 5b 69 69 5d 21 3d 27 2f 27 3b 20 69  name[ii]!='/'; i
23270 69 2d 2d 29 3b 0a 20 20 69 66 28 20 69 69 3e 30  i--);.  if( ii>0
23280 20 29 7b 0a 20 20 20 20 7a 44 69 72 6e 61 6d 65   ){.    zDirname
23290 5b 69 69 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20  [ii] = '\0';.   
232a0 20 66 64 20 3d 20 6f 70 65 6e 28 7a 44 69 72 6e   fd = open(zDirn
232b0 61 6d 65 2c 20 4f 5f 52 44 4f 4e 4c 59 7c 4f 5f  ame, O_RDONLY|O_
232c0 42 49 4e 41 52 59 2c 20 30 29 3b 0a 20 20 20 20  BINARY, 0);.    
232d0 69 66 28 20 66 64 3e 3d 30 20 29 7b 0a 23 69 66  if( fd>=0 ){.#if
232e0 64 65 66 20 46 44 5f 43 4c 4f 45 58 45 43 0a 20  def FD_CLOEXEC. 
232f0 20 20 20 20 20 66 63 6e 74 6c 28 66 64 2c 20 46       fcntl(fd, F
23300 5f 53 45 54 46 44 2c 20 66 63 6e 74 6c 28 66 64  _SETFD, fcntl(fd
23310 2c 20 46 5f 47 45 54 46 44 2c 20 30 29 20 7c 20  , F_GETFD, 0) | 
23320 46 44 5f 43 4c 4f 45 58 45 43 29 3b 0a 23 65 6e  FD_CLOEXEC);.#en
23330 64 69 66 0a 20 20 20 20 20 20 4f 53 54 52 41 43  dif.      OSTRAC
23340 45 28 28 22 4f 50 45 4e 44 49 52 20 25 2d 33 64  E(("OPENDIR %-3d
23350 20 25 73 5c 6e 22 2c 20 66 64 2c 20 7a 44 69 72   %s\n", fd, zDir
23360 6e 61 6d 65 29 29 3b 0a 20 20 20 20 7d 0a 20 20  name));.    }.  
23370 7d 0a 20 20 2a 70 46 64 20 3d 20 66 64 3b 0a 20  }.  *pFd = fd;. 
23380 20 72 65 74 75 72 6e 20 28 66 64 3e 3d 30 3f 53   return (fd>=0?S
23390 51 4c 49 54 45 5f 4f 4b 3a 53 51 4c 49 54 45 5f  QLITE_OK:SQLITE_
233a0 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 29 3b 0a  CANTOPEN_BKPT);.
233b0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
233c0 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
233d0 20 6e 61 6d 65 20 69 6e 20 7a 42 75 66 2e 20 20   name in zBuf.  
233e0 7a 42 75 66 20 6d 75 73 74 20 62 65 20 61 6c 6c  zBuf must be all
233f0 6f 63 61 74 65 64 0a 2a 2a 20 62 79 20 74 68 65  ocated.** by the
23400 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65 73 73   calling process
23410 20 61 6e 64 20 6d 75 73 74 20 62 65 20 62 69 67   and must be big
23420 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20   enough to hold 
23430 61 74 20 6c 65 61 73 74 0a 2a 2a 20 70 56 66 73  at least.** pVfs
23440 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 20 62 79 74  ->mxPathname byt
23450 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  es..*/.static in
23460 74 20 67 65 74 54 65 6d 70 6e 61 6d 65 28 69 6e  t getTempname(in
23470 74 20 6e 42 75 66 2c 20 63 68 61 72 20 2a 7a 42  t nBuf, char *zB
23480 75 66 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f  uf){.  static co
23490 6e 73 74 20 63 68 61 72 20 2a 61 7a 44 69 72 73  nst char *azDirs
234a0 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 30 2c 0a 20  [] = {.     0,. 
234b0 20 20 20 20 30 2c 0a 20 20 20 20 20 22 2f 76 61      0,.     "/va
234c0 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20 22 2f 75  r/tmp",.     "/u
234d0 73 72 2f 74 6d 70 22 2c 0a 20 20 20 20 20 22 2f  sr/tmp",.     "/
234e0 74 6d 70 22 2c 0a 20 20 20 20 20 22 2e 22 2c 0a  tmp",.     ".",.
234f0 20 20 7d 3b 0a 20 20 73 74 61 74 69 63 20 63 6f    };.  static co
23500 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
23510 72 20 7a 43 68 61 72 73 5b 5d 20 3d 0a 20 20 20  r zChars[] =.   
23520 20 22 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e   "abcdefghijklmn
23530 6f 70 71 72 73 74 75 76 77 78 79 7a 22 0a 20 20  opqrstuvwxyz".  
23540 20 20 22 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d    "ABCDEFGHIJKLM
23550 4e 4f 50 51 52 53 54 55 56 57 58 59 5a 22 0a 20  NOPQRSTUVWXYZ". 
23560 20 20 20 22 30 31 32 33 34 35 36 37 38 39 22 3b     "0123456789";
23570 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  .  unsigned int 
23580 69 2c 20 6a 3b 0a 20 20 73 74 72 75 63 74 20 73  i, j;.  struct s
23590 74 61 74 20 62 75 66 3b 0a 20 20 63 6f 6e 73 74  tat buf;.  const
235a0 20 63 68 61 72 20 2a 7a 44 69 72 20 3d 20 22 2e   char *zDir = ".
235b0 22 3b 0a 0a 20 20 2f 2a 20 49 74 27 73 20 6f 64  ";..  /* It's od
235c0 64 20 74 6f 20 73 69 6d 75 6c 61 74 65 20 61 6e  d to simulate an
235d0 20 69 6f 2d 65 72 72 6f 72 20 68 65 72 65 2c 20   io-error here, 
235e0 62 75 74 20 72 65 61 6c 6c 79 20 74 68 69 73 20  but really this 
235f0 69 73 20 6a 75 73 74 0a 20 20 2a 2a 20 75 73 69  is just.  ** usi
23600 6e 67 20 74 68 65 20 69 6f 2d 65 72 72 6f 72 20  ng the io-error 
23610 69 6e 66 72 61 73 74 72 75 63 74 75 72 65 20 74  infrastructure t
23620 6f 20 74 65 73 74 20 74 68 61 74 20 53 51 4c 69  o test that SQLi
23630 74 65 20 68 61 6e 64 6c 65 73 20 74 68 69 73 0a  te handles this.
23640 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66 61    ** function fa
23650 69 6c 69 6e 67 2e 20 0a 20 20 2a 2f 0a 20 20 53  iling. .  */.  S
23660 69 6d 75 6c 61 74 65 49 4f 45 72 72 6f 72 28 20  imulateIOError( 
23670 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
23680 45 52 52 20 29 3b 0a 0a 20 20 61 7a 44 69 72 73  ERR );..  azDirs
23690 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 5f 74 65  [0] = sqlite3_te
236a0 6d 70 5f 64 69 72 65 63 74 6f 72 79 3b 0a 20 20  mp_directory;.  
236b0 69 66 20 28 4e 55 4c 4c 20 3d 3d 20 61 7a 44 69  if (NULL == azDi
236c0 72 73 5b 31 5d 29 20 7b 0a 20 20 20 20 61 7a 44  rs[1]) {.    azD
236d0 69 72 73 5b 31 5d 20 3d 20 67 65 74 65 6e 76 28  irs[1] = getenv(
236e0 22 54 4d 50 44 49 52 22 29 3b 0a 20 20 7d 0a 20  "TMPDIR");.  }. 
236f0 20 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73   .  for(i=0; i<s
23700 69 7a 65 6f 66 28 61 7a 44 69 72 73 29 2f 73 69  izeof(azDirs)/si
23710 7a 65 6f 66 28 61 7a 44 69 72 73 5b 30 5d 29 3b  zeof(azDirs[0]);
23720 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 61   i++){.    if( a
23730 7a 44 69 72 73 5b 69 5d 3d 3d 30 20 29 20 63 6f  zDirs[i]==0 ) co
23740 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
23750 73 74 61 74 28 61 7a 44 69 72 73 5b 69 5d 2c 20  stat(azDirs[i], 
23760 26 62 75 66 29 20 29 20 63 6f 6e 74 69 6e 75 65  &buf) ) continue
23770 3b 0a 20 20 20 20 69 66 28 20 21 53 5f 49 53 44  ;.    if( !S_ISD
23780 49 52 28 62 75 66 2e 73 74 5f 6d 6f 64 65 29 20  IR(buf.st_mode) 
23790 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
237a0 69 66 28 20 61 63 63 65 73 73 28 61 7a 44 69 72  if( access(azDir
237b0 73 5b 69 5d 2c 20 30 37 29 20 29 20 63 6f 6e 74  s[i], 07) ) cont
237c0 69 6e 75 65 3b 0a 20 20 20 20 7a 44 69 72 20 3d  inue;.    zDir =
237d0 20 61 7a 44 69 72 73 5b 69 5d 3b 0a 20 20 20 20   azDirs[i];.    
237e0 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  break;.  }..  /*
237f0 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   Check that the 
23800 6f 75 74 70 75 74 20 62 75 66 66 65 72 20 69 73  output buffer is
23810 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 66 6f   large enough fo
23820 72 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  r the temporary 
23830 66 69 6c 65 20 0a 20 20 2a 2a 20 6e 61 6d 65 2e  file .  ** name.
23840 20 49 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 72   If it is not, r
23850 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
23860 4f 52 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28  OR..  */.  if( (
23870 73 74 72 6c 65 6e 28 7a 44 69 72 29 20 2b 20 73  strlen(zDir) + s
23880 74 72 6c 65 6e 28 53 51 4c 49 54 45 5f 54 45 4d  trlen(SQLITE_TEM
23890 50 5f 46 49 4c 45 5f 50 52 45 46 49 58 29 20 2b  P_FILE_PREFIX) +
238a0 20 31 37 29 20 3e 3d 20 28 73 69 7a 65 5f 74 29   17) >= (size_t)
238b0 6e 42 75 66 20 29 7b 0a 20 20 20 20 72 65 74 75  nBuf ){.    retu
238c0 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
238d0 0a 20 20 7d 0a 0a 20 20 64 6f 7b 0a 20 20 20 20  .  }..  do{.    
238e0 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
238f0 28 6e 42 75 66 2d 31 37 2c 20 7a 42 75 66 2c 20  (nBuf-17, zBuf, 
23900 22 25 73 2f 22 53 51 4c 49 54 45 5f 54 45 4d 50  "%s/"SQLITE_TEMP
23910 5f 46 49 4c 45 5f 50 52 45 46 49 58 2c 20 7a 44  _FILE_PREFIX, zD
23920 69 72 29 3b 0a 20 20 20 20 6a 20 3d 20 28 69 6e  ir);.    j = (in
23930 74 29 73 74 72 6c 65 6e 28 7a 42 75 66 29 3b 0a  t)strlen(zBuf);.
23940 20 20 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64      sqlite3_rand
23950 6f 6d 6e 65 73 73 28 31 35 2c 20 26 7a 42 75 66  omness(15, &zBuf
23960 5b 6a 5d 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  [j]);.    for(i=
23970 30 3b 20 69 3c 31 35 3b 20 69 2b 2b 2c 20 6a 2b  0; i<15; i++, j+
23980 2b 29 7b 0a 20 20 20 20 20 20 7a 42 75 66 5b 6a  +){.      zBuf[j
23990 5d 20 3d 20 28 63 68 61 72 29 7a 43 68 61 72 73  ] = (char)zChars
239a0 5b 20 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61  [ ((unsigned cha
239b0 72 29 7a 42 75 66 5b 6a 5d 29 25 28 73 69 7a 65  r)zBuf[j])%(size
239c0 6f 66 28 7a 43 68 61 72 73 29 2d 31 29 20 5d 3b  of(zChars)-1) ];
239d0 0a 20 20 20 20 7d 0a 20 20 20 20 7a 42 75 66 5b  .    }.    zBuf[
239e0 6a 5d 20 3d 20 30 3b 0a 20 20 7d 77 68 69 6c 65  j] = 0;.  }while
239f0 28 20 61 63 63 65 73 73 28 7a 42 75 66 2c 30 29  ( access(zBuf,0)
23a00 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ==0 );.  return 
23a10 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69  SQLITE_OK;.}..#i
23a20 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
23a30 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26  LOCKING_STYLE &&
23a40 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45   defined(__APPLE
23a50 5f 5f 29 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e  __)./*.** Routin
23a60 65 20 74 6f 20 74 72 61 6e 73 66 6f 72 6d 20 61  e to transform a
23a70 20 75 6e 69 78 46 69 6c 65 20 69 6e 74 6f 20 61   unixFile into a
23a80 20 70 72 6f 78 79 2d 6c 6f 63 6b 69 6e 67 20 75   proxy-locking u
23a90 6e 69 78 46 69 6c 65 2e 0a 2a 2a 20 49 6d 70 6c  nixFile..** Impl
23aa0 65 6d 65 6e 74 61 74 69 6f 6e 20 69 6e 20 74 68  ementation in th
23ab0 65 20 70 72 6f 78 79 2d 6c 6f 63 6b 20 64 69 76  e proxy-lock div
23ac0 69 73 69 6f 6e 2c 20 62 75 74 20 75 73 65 64 20  ision, but used 
23ad0 62 79 20 75 6e 69 78 4f 70 65 6e 28 29 0a 2a 2a  by unixOpen().**
23ae0 20 69 66 20 53 51 4c 49 54 45 5f 50 52 45 46 45   if SQLITE_PREFE
23af0 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 20  R_PROXY_LOCKING 
23b00 69 73 20 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73  is defined..*/.s
23b10 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 54  tatic int proxyT
23b20 72 61 6e 73 66 6f 72 6d 55 6e 69 78 46 69 6c 65  ransformUnixFile
23b30 28 75 6e 69 78 46 69 6c 65 2a 2c 20 63 6f 6e 73  (unixFile*, cons
23b40 74 20 63 68 61 72 2a 29 3b 0a 23 65 6e 64 69 66  t char*);.#endif
23b50 0a 0a 2f 2a 0a 2a 2a 20 53 65 61 72 63 68 20 66  ../*.** Search f
23b60 6f 72 20 61 6e 20 75 6e 75 73 65 64 20 66 69 6c  or an unused fil
23b70 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 68 61  e descriptor tha
23b80 74 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20  t was opened on 
23b90 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a  the database .**
23ba0 20 66 69 6c 65 20 28 6e 6f 74 20 61 20 6a 6f 75   file (not a jou
23bb0 72 6e 61 6c 20 6f 72 20 6d 61 73 74 65 72 2d 6a  rnal or master-j
23bc0 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 69 64 65  ournal file) ide
23bd0 6e 74 69 66 69 65 64 20 62 79 20 70 61 74 68 6e  ntified by pathn
23be0 61 6d 65 0a 2a 2a 20 7a 50 61 74 68 20 77 69 74  ame.** zPath wit
23bf0 68 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 58 58  h SQLITE_OPEN_XX
23c00 58 20 66 6c 61 67 73 20 6d 61 74 63 68 69 6e 67  X flags matching
23c10 20 74 68 6f 73 65 20 70 61 73 73 65 64 20 61 73   those passed as
23c20 20 74 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 61   the second.** a
23c30 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20  rgument to this 
23c40 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  function..**.** 
23c50 53 75 63 68 20 61 20 66 69 6c 65 20 64 65 73 63  Such a file desc
23c60 72 69 70 74 6f 72 20 6d 61 79 20 65 78 69 73 74  riptor may exist
23c70 20 69 66 20 61 20 64 61 74 61 62 61 73 65 20 63   if a database c
23c80 6f 6e 6e 65 63 74 69 6f 6e 20 77 61 73 20 63 6c  onnection was cl
23c90 6f 73 65 64 0a 2a 2a 20 62 75 74 20 74 68 65 20  osed.** but the 
23ca0 61 73 73 6f 63 69 61 74 65 64 20 66 69 6c 65 20  associated file 
23cb0 64 65 73 63 72 69 70 74 6f 72 20 63 6f 75 6c 64  descriptor could
23cc0 20 6e 6f 74 20 62 65 20 63 6c 6f 73 65 64 20 62   not be closed b
23cd0 65 63 61 75 73 65 20 73 6f 6d 65 0a 2a 2a 20 6f  ecause some.** o
23ce0 74 68 65 72 20 66 69 6c 65 20 64 65 73 63 72 69  ther file descri
23cf0 70 74 6f 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65  ptor open on the
23d00 20 73 61 6d 65 20 66 69 6c 65 20 69 73 20 68 6f   same file is ho
23d10 6c 64 69 6e 67 20 61 20 66 69 6c 65 2d 6c 6f 63  lding a file-loc
23d20 6b 2e 0a 2a 2a 20 52 65 66 65 72 20 74 6f 20 63  k..** Refer to c
23d30 6f 6d 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 75  omments in the u
23d40 6e 69 78 43 6c 6f 73 65 28 29 20 66 75 6e 63 74  nixClose() funct
23d50 69 6f 6e 20 61 6e 64 20 74 68 65 20 6c 65 6e 67  ion and the leng
23d60 74 68 79 20 63 6f 6d 6d 65 6e 74 0a 2a 2a 20 64  thy comment.** d
23d70 65 73 63 72 69 62 69 6e 67 20 22 50 6f 73 69 78  escribing "Posix
23d80 20 41 64 76 69 73 6f 72 79 20 4c 6f 63 6b 69 6e   Advisory Lockin
23d90 67 22 20 61 74 20 74 68 65 20 73 74 61 72 74 20  g" at the start 
23da0 6f 66 20 74 68 69 73 20 66 69 6c 65 20 66 6f 72  of this file for
23db0 20 0a 2a 2a 20 66 75 72 74 68 65 72 20 64 65 74   .** further det
23dc0 61 69 6c 73 2e 20 41 6c 73 6f 2c 20 74 69 63 6b  ails. Also, tick
23dd0 65 74 20 23 34 30 31 38 2e 0a 2a 2a 0a 2a 2a 20  et #4018..**.** 
23de0 49 66 20 61 20 73 75 69 74 61 62 6c 65 20 66 69  If a suitable fi
23df0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73  le descriptor is
23e00 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20 69 74 20   found, then it 
23e10 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  is returned. If 
23e20 6e 6f 0a 2a 2a 20 73 75 63 68 20 66 69 6c 65 20  no.** such file 
23e30 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 6c 6f  descriptor is lo
23e40 63 61 74 65 64 2c 20 2d 31 20 69 73 20 72 65 74  cated, -1 is ret
23e50 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
23e60 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 66   UnixUnusedFd *f
23e70 69 6e 64 52 65 75 73 61 62 6c 65 46 64 28 63 6f  indReusableFd(co
23e80 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c  nst char *zPath,
23e90 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 55   int flags){.  U
23ea0 6e 69 78 55 6e 75 73 65 64 46 64 20 2a 70 55 6e  nixUnusedFd *pUn
23eb0 75 73 65 64 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  used = 0;..  /* 
23ec0 44 6f 20 6e 6f 74 20 73 65 61 72 63 68 20 66 6f  Do not search fo
23ed0 72 20 61 6e 20 75 6e 75 73 65 64 20 66 69 6c 65  r an unused file
23ee0 20 64 65 73 63 72 69 70 74 6f 72 20 6f 6e 20 76   descriptor on v
23ef0 78 77 6f 72 6b 73 2e 20 4e 6f 74 20 62 65 63 61  xworks. Not beca
23f00 75 73 65 0a 20 20 2a 2a 20 76 78 77 6f 72 6b 73  use.  ** vxworks
23f10 20 77 6f 75 6c 64 20 6e 6f 74 20 62 65 6e 65 66   would not benef
23f20 69 74 20 66 72 6f 6d 20 74 68 65 20 63 68 61 6e  it from the chan
23f30 67 65 20 28 69 74 20 6d 69 67 68 74 2c 20 77 65  ge (it might, we
23f40 27 72 65 20 6e 6f 74 20 73 75 72 65 29 2c 0a 20  're not sure),. 
23f50 20 2a 2a 20 62 75 74 20 62 65 63 61 75 73 65 20   ** but because 
23f60 6e 6f 20 77 61 79 20 74 6f 20 74 65 73 74 20 69  no way to test i
23f70 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 61  t is currently a
23f80 76 61 69 6c 61 62 6c 65 2e 20 49 74 20 69 73 20  vailable. It is 
23f90 62 65 74 74 65 72 20 0a 20 20 2a 2a 20 6e 6f 74  better .  ** not
23fa0 20 74 6f 20 72 69 73 6b 20 62 72 65 61 6b 69 6e   to risk breakin
23fb0 67 20 76 78 77 6f 72 6b 73 20 73 75 70 70 6f 72  g vxworks suppor
23fc0 74 20 66 6f 72 20 74 68 65 20 73 61 6b 65 20 6f  t for the sake o
23fd0 66 20 73 75 63 68 20 61 6e 20 6f 62 73 63 75 72  f such an obscur
23fe0 65 20 0a 20 20 2a 2a 20 66 65 61 74 75 72 65 2e  e .  ** feature.
23ff0 20 20 2a 2f 0a 23 69 66 20 21 4f 53 5f 56 58 57    */.#if !OS_VXW
24000 4f 52 4b 53 0a 20 20 73 74 72 75 63 74 20 73 74  ORKS.  struct st
24010 61 74 20 73 53 74 61 74 3b 20 20 20 20 20 20 20  at sStat;       
24020 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
24030 65 73 75 6c 74 73 20 6f 66 20 73 74 61 74 28 29  esults of stat()
24040 20 63 61 6c 6c 20 2a 2f 0a 0a 20 20 2f 2a 20 41   call */..  /* A
24050 20 73 74 61 74 28 29 20 63 61 6c 6c 20 6d 61 79   stat() call may
24060 20 66 61 69 6c 20 66 6f 72 20 76 61 72 69 6f 75   fail for variou
24070 73 20 72 65 61 73 6f 6e 73 2e 20 49 66 20 74 68  s reasons. If th
24080 69 73 20 68 61 70 70 65 6e 73 2c 20 69 74 20 69  is happens, it i
24090 73 0a 20 20 2a 2a 20 61 6c 6d 6f 73 74 20 63 65  s.  ** almost ce
240a0 72 74 61 69 6e 20 74 68 61 74 20 61 6e 20 6f 70  rtain that an op
240b0 65 6e 28 29 20 63 61 6c 6c 20 6f 6e 20 74 68 65  en() call on the
240c0 20 73 61 6d 65 20 70 61 74 68 20 77 69 6c 6c 20   same path will 
240d0 61 6c 73 6f 20 66 61 69 6c 2e 0a 20 20 2a 2a 20  also fail..  ** 
240e0 46 6f 72 20 74 68 69 73 20 72 65 61 73 6f 6e 2c  For this reason,
240f0 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   if an error occ
24100 75 72 73 20 69 6e 20 74 68 65 20 73 74 61 74 28  urs in the stat(
24110 29 20 63 61 6c 6c 20 68 65 72 65 2c 20 69 74 20  ) call here, it 
24120 69 73 0a 20 20 2a 2a 20 69 67 6e 6f 72 65 64 20  is.  ** ignored 
24130 61 6e 64 20 2d 31 20 69 73 20 72 65 74 75 72 6e  and -1 is return
24140 65 64 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77  ed. The caller w
24150 69 6c 6c 20 74 72 79 20 74 6f 20 6f 70 65 6e 20  ill try to open 
24160 61 20 6e 65 77 20 66 69 6c 65 0a 20 20 2a 2a 20  a new file.  ** 
24170 64 65 73 63 72 69 70 74 6f 72 20 6f 6e 20 74 68  descriptor on th
24180 65 20 73 61 6d 65 20 70 61 74 68 2c 20 66 61 69  e same path, fai
24190 6c 2c 20 61 6e 64 20 72 65 74 75 72 6e 20 61 6e  l, and return an
241a0 20 65 72 72 6f 72 20 74 6f 20 53 51 4c 69 74 65   error to SQLite
241b0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 76 65 6e  ..  **.  ** Even
241c0 20 69 66 20 61 20 73 75 62 73 65 71 75 65 6e 74   if a subsequent
241d0 20 6f 70 65 6e 28 29 20 63 61 6c 6c 20 64 6f 65   open() call doe
241e0 73 20 73 75 63 63 65 65 64 2c 20 74 68 65 20 63  s succeed, the c
241f0 6f 6e 73 65 71 75 65 6e 63 65 73 20 6f 66 0a 20  onsequences of. 
24200 20 2a 2a 20 6e 6f 74 20 73 65 61 72 63 68 69 6e   ** not searchin
24210 67 20 66 6f 72 20 61 20 72 65 73 75 73 61 62 6c  g for a resusabl
24220 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  e file descripto
24230 72 20 61 72 65 20 6e 6f 74 20 64 69 72 65 2e 20  r are not dire. 
24240 20 2a 2f 0a 20 20 69 66 28 20 30 3d 3d 73 74 61   */.  if( 0==sta
24250 74 28 7a 50 61 74 68 2c 20 26 73 53 74 61 74 29  t(zPath, &sStat)
24260 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 75   ){.    struct u
24270 6e 69 78 49 6e 6f 64 65 49 6e 66 6f 20 2a 70 49  nixInodeInfo *pI
24280 6e 6f 64 65 3b 0a 0a 20 20 20 20 75 6e 69 78 45  node;..    unixE
24290 6e 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 20  nterMutex();.   
242a0 20 70 49 6e 6f 64 65 20 3d 20 69 6e 6f 64 65 4c   pInode = inodeL
242b0 69 73 74 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  ist;.    while( 
242c0 70 49 6e 6f 64 65 20 26 26 20 28 70 49 6e 6f 64  pInode && (pInod
242d0 65 2d 3e 66 69 6c 65 49 64 2e 64 65 76 21 3d 73  e->fileId.dev!=s
242e0 53 74 61 74 2e 73 74 5f 64 65 76 0a 20 20 20 20  Stat.st_dev.    
242f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24300 20 7c 7c 20 70 49 6e 6f 64 65 2d 3e 66 69 6c 65   || pInode->file
24310 49 64 2e 69 6e 6f 21 3d 73 53 74 61 74 2e 73 74  Id.ino!=sStat.st
24320 5f 69 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 20  _ino) ){.       
24330 70 49 6e 6f 64 65 20 3d 20 70 49 6e 6f 64 65 2d  pInode = pInode-
24340 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20  >pNext;.    }.  
24350 20 20 69 66 28 20 70 49 6e 6f 64 65 20 29 7b 0a    if( pInode ){.
24360 20 20 20 20 20 20 55 6e 69 78 55 6e 75 73 65 64        UnixUnused
24370 46 64 20 2a 2a 70 70 3b 0a 20 20 20 20 20 20 66  Fd **pp;.      f
24380 6f 72 28 70 70 3d 26 70 49 6e 6f 64 65 2d 3e 70  or(pp=&pInode->p
24390 55 6e 75 73 65 64 3b 20 2a 70 70 20 26 26 20 28  Unused; *pp && (
243a0 2a 70 70 29 2d 3e 66 6c 61 67 73 21 3d 66 6c 61  *pp)->flags!=fla
243b0 67 73 3b 20 70 70 3d 26 28 28 2a 70 70 29 2d 3e  gs; pp=&((*pp)->
243c0 70 4e 65 78 74 29 29 3b 0a 20 20 20 20 20 20 70  pNext));.      p
243d0 55 6e 75 73 65 64 20 3d 20 2a 70 70 3b 0a 20 20  Unused = *pp;.  
243e0 20 20 20 20 69 66 28 20 70 55 6e 75 73 65 64 20      if( pUnused 
243f0 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 70 20 3d  ){.        *pp =
24400 20 70 55 6e 75 73 65 64 2d 3e 70 4e 65 78 74 3b   pUnused->pNext;
24410 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
24420 20 20 20 75 6e 69 78 4c 65 61 76 65 4d 75 74 65     unixLeaveMute
24430 78 28 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20  x();.  }.#endif 
24440 20 20 20 2f 2a 20 69 66 20 21 4f 53 5f 56 58 57     /* if !OS_VXW
24450 4f 52 4b 53 20 2a 2f 0a 20 20 72 65 74 75 72 6e  ORKS */.  return
24460 20 70 55 6e 75 73 65 64 3b 0a 7d 0a 0a 2f 2a 0a   pUnused;.}../*.
24470 2a 2a 20 4f 70 65 6e 20 74 68 65 20 66 69 6c 65  ** Open the file
24480 20 7a 50 61 74 68 2e 0a 2a 2a 20 0a 2a 2a 20 50   zPath..** .** P
24490 72 65 76 69 6f 75 73 6c 79 2c 20 74 68 65 20 53  reviously, the S
244a0 51 4c 69 74 65 20 4f 53 20 6c 61 79 65 72 20 75  QLite OS layer u
244b0 73 65 64 20 74 68 72 65 65 20 66 75 6e 63 74 69  sed three functi
244c0 6f 6e 73 20 69 6e 20 70 6c 61 63 65 20 6f 66 20  ons in place of 
244d0 74 68 69 73 0a 2a 2a 20 6f 6e 65 3a 0a 2a 2a 0a  this.** one:.**.
244e0 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73  **     sqlite3Os
244f0 4f 70 65 6e 52 65 61 64 57 72 69 74 65 28 29 3b  OpenReadWrite();
24500 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33 4f  .**     sqlite3O
24510 73 4f 70 65 6e 52 65 61 64 4f 6e 6c 79 28 29 3b  sOpenReadOnly();
24520 0a 2a 2a 20 20 20 20 20 73 71 6c 69 74 65 33 4f  .**     sqlite3O
24530 73 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28 29  sOpenExclusive()
24540 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 63 61  ;.**.** These ca
24550 6c 6c 73 20 63 6f 72 72 65 73 70 6f 6e 64 20 74  lls correspond t
24560 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  o the following 
24570 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6f 66 20  combinations of 
24580 66 6c 61 67 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  flags:.**.**    
24590 20 52 65 61 64 57 72 69 74 65 28 29 20 2d 3e 20   ReadWrite() -> 
245a0 20 20 20 20 28 52 45 41 44 57 52 49 54 45 20 7c      (READWRITE |
245b0 20 43 52 45 41 54 45 29 0a 2a 2a 20 20 20 20 20   CREATE).**     
245c0 52 65 61 64 4f 6e 6c 79 28 29 20 20 2d 3e 20 20  ReadOnly()  ->  
245d0 20 20 20 28 52 45 41 44 4f 4e 4c 59 29 20 0a 2a     (READONLY) .*
245e0 2a 20 20 20 20 20 4f 70 65 6e 45 78 63 6c 75 73  *     OpenExclus
245f0 69 76 65 28 29 20 2d 3e 20 28 52 45 41 44 57 52  ive() -> (READWR
24600 49 54 45 20 7c 20 43 52 45 41 54 45 20 7c 20 45  ITE | CREATE | E
24610 58 43 4c 55 53 49 56 45 29 0a 2a 2a 0a 2a 2a 20  XCLUSIVE).**.** 
24620 54 68 65 20 6f 6c 64 20 4f 70 65 6e 45 78 63 6c  The old OpenExcl
24630 75 73 69 76 65 28 29 20 61 63 63 65 70 74 65 64  usive() accepted
24640 20 61 20 62 6f 6f 6c 65 61 6e 20 61 72 67 75 6d   a boolean argum
24650 65 6e 74 20 2d 20 22 64 65 6c 46 6c 61 67 22 2e  ent - "delFlag".
24660 20 49 66 0a 2a 2a 20 74 72 75 65 2c 20 74 68 65   If.** true, the
24670 20 66 69 6c 65 20 77 61 73 20 63 6f 6e 66 69 67   file was config
24680 75 72 65 64 20 74 6f 20 62 65 20 61 75 74 6f 6d  ured to be autom
24690 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 64  atically deleted
246a0 20 77 68 65 6e 20 74 68 65 0a 2a 2a 20 66 69 6c   when the.** fil
246b0 65 20 68 61 6e 64 6c 65 20 63 6c 6f 73 65 64 2e  e handle closed.
246c0 20 54 6f 20 61 63 68 69 65 76 65 20 74 68 65 20   To achieve the 
246d0 73 61 6d 65 20 65 66 66 65 63 74 20 75 73 69 6e  same effect usin
246e0 67 20 74 68 69 73 20 6e 65 77 20 0a 2a 2a 20 69  g this new .** i
246f0 6e 74 65 72 66 61 63 65 2c 20 61 64 64 20 74 68  nterface, add th
24700 65 20 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20  e DELETEONCLOSE 
24710 66 6c 61 67 20 74 6f 20 74 68 6f 73 65 20 73 70  flag to those sp
24720 65 63 69 66 69 65 64 20 61 62 6f 76 65 20 66 6f  ecified above fo
24730 72 20 0a 2a 2a 20 4f 70 65 6e 45 78 63 6c 75 73  r .** OpenExclus
24740 69 76 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  ive()..*/.static
24750 20 69 6e 74 20 75 6e 69 78 4f 70 65 6e 28 0a 20   int unixOpen(. 
24760 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
24770 66 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  fs,           /*
24780 20 54 68 65 20 56 46 53 20 66 6f 72 20 77 68 69   The VFS for whi
24790 63 68 20 74 68 69 73 20 69 73 20 74 68 65 20 78  ch this is the x
247a0 4f 70 65 6e 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  Open method */. 
247b0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
247c0 74 68 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  th,           /*
247d0 20 50 61 74 68 6e 61 6d 65 20 6f 66 20 66 69 6c   Pathname of fil
247e0 65 20 74 6f 20 62 65 20 6f 70 65 6e 65 64 20 2a  e to be opened *
247f0 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  /.  sqlite3_file
24800 20 2a 70 46 69 6c 65 2c 20 20 20 20 20 20 20 20   *pFile,        
24810 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 64 65 73   /* The file des
24820 63 72 69 70 74 6f 72 20 74 6f 20 62 65 20 66 69  criptor to be fi
24830 6c 6c 65 64 20 69 6e 20 2a 2f 0a 20 20 69 6e 74  lled in */.  int
24840 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20   flags,         
24850 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 70            /* Inp
24860 75 74 20 66 6c 61 67 73 20 74 6f 20 63 6f 6e 74  ut flags to cont
24870 72 6f 6c 20 74 68 65 20 6f 70 65 6e 69 6e 67 20  rol the opening 
24880 2a 2f 0a 20 20 69 6e 74 20 2a 70 4f 75 74 46 6c  */.  int *pOutFl
24890 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20 20  ags             
248a0 20 20 2f 2a 20 4f 75 74 70 75 74 20 66 6c 61 67    /* Output flag
248b0 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20 53 51  s returned to SQ
248c0 4c 69 74 65 20 63 6f 72 65 20 2a 2f 0a 29 7b 0a  Lite core */.){.
248d0 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 20 3d 20    unixFile *p = 
248e0 28 75 6e 69 78 46 69 6c 65 20 2a 29 70 46 69 6c  (unixFile *)pFil
248f0 65 3b 0a 20 20 69 6e 74 20 66 64 20 3d 20 2d 31  e;.  int fd = -1
24900 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
24910 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63      /* File desc
24920 72 69 70 74 6f 72 20 72 65 74 75 72 6e 65 64 20  riptor returned 
24930 62 79 20 6f 70 65 6e 28 29 20 2a 2f 0a 20 20 69  by open() */.  i
24940 6e 74 20 64 69 72 66 64 20 3d 20 2d 31 3b 20 20  nt dirfd = -1;  
24950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24960 20 44 69 72 65 63 74 6f 72 79 20 66 69 6c 65 20   Directory file 
24970 64 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20  descriptor */.  
24980 69 6e 74 20 6f 70 65 6e 46 6c 61 67 73 20 3d 20  int openFlags = 
24990 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
249a0 2a 20 46 6c 61 67 73 20 74 6f 20 70 61 73 73 20  * Flags to pass 
249b0 74 6f 20 6f 70 65 6e 28 29 20 2a 2f 0a 20 20 69  to open() */.  i
249c0 6e 74 20 65 54 79 70 65 20 3d 20 66 6c 61 67 73  nt eType = flags
249d0 26 30 78 46 46 46 46 46 46 30 30 3b 20 20 2f 2a  &0xFFFFFF00;  /*
249e0 20 54 79 70 65 20 6f 66 20 66 69 6c 65 20 74 6f   Type of file to
249f0 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e   open */.  int n
24a00 6f 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20  oLock;          
24a10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
24a20 65 20 74 6f 20 6f 6d 69 74 20 6c 6f 63 6b 69 6e  e to omit lockin
24a30 67 20 70 72 69 6d 69 74 69 76 65 73 20 2a 2f 0a  g primitives */.
24a40 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
24a50 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
24a60 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 52 65 74   /* Function Ret
24a70 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 0a 20 20 69  urn Code */..  i
24a80 6e 74 20 69 73 45 78 63 6c 75 73 69 76 65 20 20  nt isExclusive  
24a90 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  = (flags & SQLIT
24aa0 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45  E_OPEN_EXCLUSIVE
24ab0 29 3b 0a 20 20 69 6e 74 20 69 73 44 65 6c 65 74  );.  int isDelet
24ac0 65 20 20 20 20 20 3d 20 28 66 6c 61 67 73 20 26  e     = (flags &
24ad0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c   SQLITE_OPEN_DEL
24ae0 45 54 45 4f 4e 43 4c 4f 53 45 29 3b 0a 20 20 69  ETEONCLOSE);.  i
24af0 6e 74 20 69 73 43 72 65 61 74 65 20 20 20 20 20  nt isCreate     
24b00 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  = (flags & SQLIT
24b10 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29 3b 0a  E_OPEN_CREATE);.
24b20 20 20 69 6e 74 20 69 73 52 65 61 64 6f 6e 6c 79    int isReadonly
24b30 20 20 20 3d 20 28 66 6c 61 67 73 20 26 20 53 51     = (flags & SQ
24b40 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
24b50 4c 59 29 3b 0a 20 20 69 6e 74 20 69 73 52 65 61  LY);.  int isRea
24b60 64 57 72 69 74 65 20 20 3d 20 28 66 6c 61 67 73  dWrite  = (flags
24b70 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   & SQLITE_OPEN_R
24b80 45 41 44 57 52 49 54 45 29 3b 0a 23 69 66 20 53  EADWRITE);.#if S
24b90 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
24ba0 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 69 6e 74  KING_STYLE.  int
24bb0 20 69 73 41 75 74 6f 50 72 6f 78 79 20 20 3d 20   isAutoProxy  = 
24bc0 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
24bd0 4f 50 45 4e 5f 41 55 54 4f 50 52 4f 58 59 29 3b  OPEN_AUTOPROXY);
24be0 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49 66  .#endif..  /* If
24bf0 20 63 72 65 61 74 69 6e 67 20 61 20 6d 61 73 74   creating a mast
24c00 65 72 20 6f 72 20 6d 61 69 6e 2d 66 69 6c 65 20  er or main-file 
24c10 6a 6f 75 72 6e 61 6c 2c 20 74 68 69 73 20 66 75  journal, this fu
24c20 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 6f 70 65 6e  nction will open
24c30 0a 20 20 2a 2a 20 61 20 66 69 6c 65 2d 64 65 73  .  ** a file-des
24c40 63 72 69 70 74 6f 72 20 6f 6e 20 74 68 65 20 64  criptor on the d
24c50 69 72 65 63 74 6f 72 79 20 74 6f 6f 2e 20 54 68  irectory too. Th
24c60 65 20 66 69 72 73 74 20 74 69 6d 65 20 75 6e 69  e first time uni
24c70 78 53 79 6e 63 28 29 0a 20 20 2a 2a 20 69 73 20  xSync().  ** is 
24c80 63 61 6c 6c 65 64 20 74 68 65 20 64 69 72 65 63  called the direc
24c90 74 6f 72 79 20 66 69 6c 65 20 64 65 73 63 72 69  tory file descri
24ca0 70 74 6f 72 20 77 69 6c 6c 20 62 65 20 66 73 79  ptor will be fsy
24cb0 6e 63 28 29 65 64 20 61 6e 64 20 63 6c 6f 73 65  nc()ed and close
24cc0 28 29 64 2e 0a 20 20 2a 2f 0a 20 20 69 6e 74 20  ()d..  */.  int 
24cd0 69 73 4f 70 65 6e 44 69 72 65 63 74 6f 72 79 20  isOpenDirectory 
24ce0 3d 20 28 69 73 43 72 65 61 74 65 20 26 26 20 0a  = (isCreate && .
24cf0 20 20 20 20 20 20 28 65 54 79 70 65 3d 3d 53 51        (eType==SQ
24d00 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52  LITE_OPEN_MASTER
24d10 5f 4a 4f 55 52 4e 41 4c 20 7c 7c 20 65 54 79 70  _JOURNAL || eTyp
24d20 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  e==SQLITE_OPEN_M
24d30 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 0a 20 20 29  AIN_JOURNAL).  )
24d40 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 72 67 75 6d  ;..  /* If argum
24d50 65 6e 74 20 7a 50 61 74 68 20 69 73 20 61 20 4e  ent zPath is a N
24d60 55 4c 4c 20 70 6f 69 6e 74 65 72 2c 20 74 68 69  ULL pointer, thi
24d70 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65  s function is re
24d80 71 75 69 72 65 64 20 74 6f 20 6f 70 65 6e 0a 20  quired to open. 
24d90 20 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72 79 20   ** a temporary 
24da0 66 69 6c 65 2e 20 55 73 65 20 74 68 69 73 20 62  file. Use this b
24db0 75 66 66 65 72 20 74 6f 20 73 74 6f 72 65 20 74  uffer to store t
24dc0 68 65 20 66 69 6c 65 20 6e 61 6d 65 20 69 6e 2e  he file name in.
24dd0 0a 20 20 2a 2f 0a 20 20 63 68 61 72 20 7a 54 6d  .  */.  char zTm
24de0 70 6e 61 6d 65 5b 4d 41 58 5f 50 41 54 48 4e 41  pname[MAX_PATHNA
24df0 4d 45 2b 31 5d 3b 0a 20 20 63 6f 6e 73 74 20 63  ME+1];.  const c
24e00 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 7a 50 61  har *zName = zPa
24e10 74 68 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20  th;..  /* Check 
24e20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  the following st
24e30 61 74 65 6d 65 6e 74 73 20 61 72 65 20 74 72 75  atements are tru
24e40 65 3a 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  e: .  **.  **   
24e50 28 61 29 20 45 78 61 63 74 6c 79 20 6f 6e 65 20  (a) Exactly one 
24e60 6f 66 20 74 68 65 20 52 45 41 44 57 52 49 54 45  of the READWRITE
24e70 20 61 6e 64 20 52 45 41 44 4f 4e 4c 59 20 66 6c   and READONLY fl
24e80 61 67 73 20 6d 75 73 74 20 62 65 20 73 65 74 2c  ags must be set,
24e90 20 61 6e 64 20 0a 20 20 2a 2a 20 20 20 28 62 29   and .  **   (b)
24ea0 20 69 66 20 43 52 45 41 54 45 20 69 73 20 73 65   if CREATE is se
24eb0 74 2c 20 74 68 65 6e 20 52 45 41 44 57 52 49 54  t, then READWRIT
24ec0 45 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20 73  E must also be s
24ed0 65 74 2c 20 61 6e 64 0a 20 20 2a 2a 20 20 20 28  et, and.  **   (
24ee0 63 29 20 69 66 20 45 58 43 4c 55 53 49 56 45 20  c) if EXCLUSIVE 
24ef0 69 73 20 73 65 74 2c 20 74 68 65 6e 20 43 52 45  is set, then CRE
24f00 41 54 45 20 6d 75 73 74 20 61 6c 73 6f 20 62 65  ATE must also be
24f10 20 73 65 74 2e 0a 20 20 2a 2a 20 20 20 28 64 29   set..  **   (d)
24f20 20 69 66 20 44 45 4c 45 54 45 4f 4e 43 4c 4f 53   if DELETEONCLOS
24f30 45 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 43  E is set, then C
24f40 52 45 41 54 45 20 6d 75 73 74 20 61 6c 73 6f 20  REATE must also 
24f50 62 65 20 73 65 74 2e 0a 20 20 2a 2f 0a 20 20 61  be set..  */.  a
24f60 73 73 65 72 74 28 28 69 73 52 65 61 64 6f 6e 6c  ssert((isReadonl
24f70 79 3d 3d 30 20 7c 7c 20 69 73 52 65 61 64 57 72  y==0 || isReadWr
24f80 69 74 65 3d 3d 30 29 20 26 26 20 28 69 73 52 65  ite==0) && (isRe
24f90 61 64 57 72 69 74 65 20 7c 7c 20 69 73 52 65 61  adWrite || isRea
24fa0 64 6f 6e 6c 79 29 29 3b 0a 20 20 61 73 73 65 72  donly));.  asser
24fb0 74 28 69 73 43 72 65 61 74 65 3d 3d 30 20 7c 7c  t(isCreate==0 ||
24fc0 20 69 73 52 65 61 64 57 72 69 74 65 29 3b 0a 20   isReadWrite);. 
24fd0 20 61 73 73 65 72 74 28 69 73 45 78 63 6c 75 73   assert(isExclus
24fe0 69 76 65 3d 3d 30 20 7c 7c 20 69 73 43 72 65 61  ive==0 || isCrea
24ff0 74 65 29 3b 0a 20 20 61 73 73 65 72 74 28 69 73  te);.  assert(is
25000 44 65 6c 65 74 65 3d 3d 30 20 7c 7c 20 69 73 43  Delete==0 || isC
25010 72 65 61 74 65 29 3b 0a 0a 20 20 2f 2a 20 54 68  reate);..  /* Th
25020 65 20 6d 61 69 6e 20 44 42 2c 20 6d 61 69 6e 20  e main DB, main 
25030 6a 6f 75 72 6e 61 6c 2c 20 61 6e 64 20 6d 61 73  journal, and mas
25040 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 72 65 20  ter journal are 
25050 6e 65 76 65 72 20 61 75 74 6f 6d 61 74 69 63 61  never automatica
25060 6c 6c 79 0a 20 20 2a 2a 20 64 65 6c 65 74 65 64  lly.  ** deleted
25070 2e 20 4e 6f 72 20 61 72 65 20 74 68 65 79 20 65  . Nor are they e
25080 76 65 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69  ver temporary fi
25090 6c 65 73 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72  les.  */.  asser
250a0 74 28 20 28 21 69 73 44 65 6c 65 74 65 20 26 26  t( (!isDelete &&
250b0 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65   zName) || eType
250c0 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  !=SQLITE_OPEN_MA
250d0 49 4e 5f 44 42 20 29 3b 0a 20 20 61 73 73 65 72  IN_DB );.  asser
250e0 74 28 20 28 21 69 73 44 65 6c 65 74 65 20 26 26  t( (!isDelete &&
250f0 20 7a 4e 61 6d 65 29 20 7c 7c 20 65 54 79 70 65   zName) || eType
25100 21 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  !=SQLITE_OPEN_MA
25110 49 4e 5f 4a 4f 55 52 4e 41 4c 20 29 3b 0a 20 20  IN_JOURNAL );.  
25120 61 73 73 65 72 74 28 20 28 21 69 73 44 65 6c 65  assert( (!isDele
25130 74 65 20 26 26 20 7a 4e 61 6d 65 29 20 7c 7c 20  te && zName) || 
25140 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50  eType!=SQLITE_OP
25150 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41  EN_MASTER_JOURNA
25160 4c 20 29 3b 0a 0a 20 20 2f 2a 20 41 73 73 65 72  L );..  /* Asser
25170 74 20 74 68 61 74 20 74 68 65 20 75 70 70 65 72  t that the upper
25180 20 6c 61 79 65 72 20 68 61 73 20 73 65 74 20 6f   layer has set o
25190 6e 65 20 6f 66 20 74 68 65 20 22 66 69 6c 65 2d  ne of the "file-
251a0 74 79 70 65 22 20 66 6c 61 67 73 2e 20 2a 2f 0a  type" flags. */.
251b0 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65 3d    assert( eType=
251c0 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  =SQLITE_OPEN_MAI
251d0 4e 5f 44 42 20 20 20 20 20 20 7c 7c 20 65 54 79  N_DB      || eTy
251e0 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  pe==SQLITE_OPEN_
251f0 54 45 4d 50 5f 44 42 20 0a 20 20 20 20 20 20 20  TEMP_DB .       
25200 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45  || eType==SQLITE
25210 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e  _OPEN_MAIN_JOURN
25220 41 4c 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c  AL || eType==SQL
25230 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f  ITE_OPEN_TEMP_JO
25240 55 52 4e 41 4c 20 0a 20 20 20 20 20 20 20 7c 7c  URNAL .       ||
25250 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
25260 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 20 20  PEN_SUBJOURNAL  
25270 20 7c 7c 20 65 54 79 70 65 3d 3d 53 51 4c 49 54   || eType==SQLIT
25280 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f  E_OPEN_MASTER_JO
25290 55 52 4e 41 4c 20 0a 20 20 20 20 20 20 20 7c 7c  URNAL .       ||
252a0 20 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f   eType==SQLITE_O
252b0 50 45 4e 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42  PEN_TRANSIENT_DB
252c0 0a 20 20 29 3b 0a 0a 20 20 6d 65 6d 73 65 74 28  .  );..  memset(
252d0 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 75 6e 69  p, 0, sizeof(uni
252e0 78 46 69 6c 65 29 29 3b 0a 0a 20 20 69 66 28 20  xFile));..  if( 
252f0 65 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4f 50  eType==SQLITE_OP
25300 45 4e 5f 4d 41 49 4e 5f 44 42 20 29 7b 0a 20 20  EN_MAIN_DB ){.  
25310 20 20 55 6e 69 78 55 6e 75 73 65 64 46 64 20 2a    UnixUnusedFd *
25320 70 55 6e 75 73 65 64 3b 0a 20 20 20 20 70 55 6e  pUnused;.    pUn
25330 75 73 65 64 20 3d 20 66 69 6e 64 52 65 75 73 61  used = findReusa
25340 62 6c 65 46 64 28 7a 4e 61 6d 65 2c 20 66 6c 61  bleFd(zName, fla
25350 67 73 29 3b 0a 20 20 20 20 69 66 28 20 70 55 6e  gs);.    if( pUn
25360 75 73 65 64 20 29 7b 0a 20 20 20 20 20 20 66 64  used ){.      fd
25370 20 3d 20 70 55 6e 75 73 65 64 2d 3e 66 64 3b 0a   = pUnused->fd;.
25380 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
25390 20 70 55 6e 75 73 65 64 20 3d 20 73 71 6c 69 74   pUnused = sqlit
253a0 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66  e3_malloc(sizeof
253b0 28 2a 70 55 6e 75 73 65 64 29 29 3b 0a 20 20 20  (*pUnused));.   
253c0 20 20 20 69 66 28 20 21 70 55 6e 75 73 65 64 20     if( !pUnused 
253d0 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
253e0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
253f0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
25400 20 20 70 2d 3e 70 55 6e 75 73 65 64 20 3d 20 70    p->pUnused = p
25410 55 6e 75 73 65 64 3b 0a 20 20 7d 65 6c 73 65 20  Unused;.  }else 
25420 69 66 28 20 21 7a 4e 61 6d 65 20 29 7b 0a 20 20  if( !zName ){.  
25430 20 20 2f 2a 20 49 66 20 7a 4e 61 6d 65 20 69 73    /* If zName is
25440 20 4e 55 4c 4c 2c 20 74 68 65 20 75 70 70 65 72   NULL, the upper
25450 20 6c 61 79 65 72 20 69 73 20 72 65 71 75 65 73   layer is reques
25460 74 69 6e 67 20 61 20 74 65 6d 70 20 66 69 6c 65  ting a temp file
25470 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
25480 69 73 44 65 6c 65 74 65 20 26 26 20 21 69 73 4f  isDelete && !isO
25490 70 65 6e 44 69 72 65 63 74 6f 72 79 29 3b 0a 20  penDirectory);. 
254a0 20 20 20 72 63 20 3d 20 67 65 74 54 65 6d 70 6e     rc = getTempn
254b0 61 6d 65 28 4d 41 58 5f 50 41 54 48 4e 41 4d 45  ame(MAX_PATHNAME
254c0 2b 31 2c 20 7a 54 6d 70 6e 61 6d 65 29 3b 0a 20  +1, zTmpname);. 
254d0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
254e0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
254f0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
25500 20 20 20 7a 4e 61 6d 65 20 3d 20 7a 54 6d 70 6e     zName = zTmpn
25510 61 6d 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44  ame;.  }..  /* D
25520 65 74 65 72 6d 69 6e 65 20 74 68 65 20 76 61 6c  etermine the val
25530 75 65 20 6f 66 20 74 68 65 20 66 6c 61 67 73 20  ue of the flags 
25540 70 61 72 61 6d 65 74 65 72 20 70 61 73 73 65 64  parameter passed
25550 20 74 6f 20 50 4f 53 49 58 20 66 75 6e 63 74 69   to POSIX functi
25560 6f 6e 0a 20 20 2a 2a 20 6f 70 65 6e 28 29 2e 20  on.  ** open(). 
25570 54 68 65 73 65 20 6d 75 73 74 20 62 65 20 63 61  These must be ca
25580 6c 63 75 6c 61 74 65 64 20 65 76 65 6e 20 69 66  lculated even if
25590 20 6f 70 65 6e 28 29 20 69 73 20 6e 6f 74 20 63   open() is not c
255a0 61 6c 6c 65 64 2c 20 61 73 0a 20 20 2a 2a 20 74  alled, as.  ** t
255b0 68 65 79 20 6d 61 79 20 62 65 20 73 74 6f 72 65  hey may be store
255c0 64 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65  d as part of the
255d0 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 61 6e 64   file handle and
255e0 20 75 73 65 64 20 62 79 20 74 68 65 20 0a 20 20   used by the .  
255f0 2a 2a 20 27 63 6f 6e 63 68 20 66 69 6c 65 27 20  ** 'conch file' 
25600 6c 6f 63 6b 69 6e 67 20 66 75 6e 63 74 69 6f 6e  locking function
25610 73 20 6c 61 74 65 72 20 6f 6e 2e 20 20 2a 2f 0a  s later on.  */.
25620 20 20 69 66 28 20 69 73 52 65 61 64 6f 6e 6c 79    if( isReadonly
25630 20 29 20 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d   )  openFlags |=
25640 20 4f 5f 52 44 4f 4e 4c 59 3b 0a 20 20 69 66 28   O_RDONLY;.  if(
25650 20 69 73 52 65 61 64 57 72 69 74 65 20 29 20 6f   isReadWrite ) o
25660 70 65 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f 52 44  penFlags |= O_RD
25670 57 52 3b 0a 20 20 69 66 28 20 69 73 43 72 65 61  WR;.  if( isCrea
25680 74 65 20 29 20 20 20 20 6f 70 65 6e 46 6c 61 67  te )    openFlag
25690 73 20 7c 3d 20 4f 5f 43 52 45 41 54 3b 0a 20 20  s |= O_CREAT;.  
256a0 69 66 28 20 69 73 45 78 63 6c 75 73 69 76 65 20  if( isExclusive 
256b0 29 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 28  ) openFlags |= (
256c0 4f 5f 45 58 43 4c 7c 4f 5f 4e 4f 46 4f 4c 4c 4f  O_EXCL|O_NOFOLLO
256d0 57 29 3b 0a 20 20 6f 70 65 6e 46 6c 61 67 73 20  W);.  openFlags 
256e0 7c 3d 20 28 4f 5f 4c 41 52 47 45 46 49 4c 45 7c  |= (O_LARGEFILE|
256f0 4f 5f 42 49 4e 41 52 59 29 3b 0a 0a 20 20 69 66  O_BINARY);..  if
25700 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 6d 6f  ( fd<0 ){.    mo
25710 64 65 5f 74 20 6f 70 65 6e 4d 6f 64 65 20 3d 20  de_t openMode = 
25720 28 69 73 44 65 6c 65 74 65 3f 30 36 30 30 3a 53  (isDelete?0600:S
25730 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49  QLITE_DEFAULT_FI
25740 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 29 3b  LE_PERMISSIONS);
25750 0a 20 20 20 20 66 64 20 3d 20 6f 70 65 6e 28 7a  .    fd = open(z
25760 4e 61 6d 65 2c 20 6f 70 65 6e 46 6c 61 67 73 2c  Name, openFlags,
25770 20 6f 70 65 6e 4d 6f 64 65 29 3b 0a 20 20 20 20   openMode);.    
25780 4f 53 54 52 41 43 45 28 28 22 4f 50 45 4e 58 20  OSTRACE(("OPENX 
25790 20 20 25 2d 33 64 20 25 73 20 30 25 6f 5c 6e 22    %-3d %s 0%o\n"
257a0 2c 20 66 64 2c 20 7a 4e 61 6d 65 2c 20 6f 70 65  , fd, zName, ope
257b0 6e 46 6c 61 67 73 29 29 3b 0a 20 20 20 20 69 66  nFlags));.    if
257c0 28 20 66 64 3c 30 20 26 26 20 65 72 72 6e 6f 21  ( fd<0 && errno!
257d0 3d 45 49 53 44 49 52 20 26 26 20 69 73 52 65 61  =EISDIR && isRea
257e0 64 57 72 69 74 65 20 26 26 20 21 69 73 45 78 63  dWrite && !isExc
257f0 6c 75 73 69 76 65 20 29 7b 0a 20 20 20 20 20 20  lusive ){.      
25800 2f 2a 20 46 61 69 6c 65 64 20 74 6f 20 6f 70 65  /* Failed to ope
25810 6e 20 74 68 65 20 66 69 6c 65 20 66 6f 72 20 72  n the file for r
25820 65 61 64 2f 77 72 69 74 65 20 61 63 63 65 73 73  ead/write access
25830 2e 20 54 72 79 20 72 65 61 64 2d 6f 6e 6c 79 2e  . Try read-only.
25840 20 2a 2f 0a 20 20 20 20 20 20 66 6c 61 67 73 20   */.      flags 
25850 26 3d 20 7e 28 53 51 4c 49 54 45 5f 4f 50 45 4e  &= ~(SQLITE_OPEN
25860 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54  _READWRITE|SQLIT
25870 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29 3b 0a  E_OPEN_CREATE);.
25880 20 20 20 20 20 20 6f 70 65 6e 46 6c 61 67 73 20        openFlags 
25890 26 3d 20 7e 28 4f 5f 52 44 57 52 7c 4f 5f 43 52  &= ~(O_RDWR|O_CR
258a0 45 41 54 29 3b 0a 20 20 20 20 20 20 66 6c 61 67  EAT);.      flag
258b0 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e  s |= SQLITE_OPEN
258c0 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20  _READONLY;.     
258d0 20 6f 70 65 6e 46 6c 61 67 73 20 7c 3d 20 4f 5f   openFlags |= O_
258e0 52 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 66 64  RDONLY;.      fd
258f0 20 3d 20 6f 70 65 6e 28 7a 4e 61 6d 65 2c 20 6f   = open(zName, o
25900 70 65 6e 46 6c 61 67 73 2c 20 6f 70 65 6e 4d 6f  penFlags, openMo
25910 64 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  de);.    }.    i
25920 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20 20 20  f( fd<0 ){.     
25930 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e   rc = SQLITE_CAN
25940 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20  TOPEN_BKPT;.    
25950 20 20 67 6f 74 6f 20 6f 70 65 6e 5f 66 69 6e 69    goto open_fini
25960 73 68 65 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  shed;.    }.  }.
25970 20 20 61 73 73 65 72 74 28 20 66 64 3e 3d 30 20    assert( fd>=0 
25980 29 3b 0a 20 20 69 66 28 20 70 4f 75 74 46 6c 61  );.  if( pOutFla
25990 67 73 20 29 7b 0a 20 20 20 20 2a 70 4f 75 74 46  gs ){.    *pOutF
259a0 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20  lags = flags;.  
259b0 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 70 55 6e 75  }..  if( p->pUnu
259c0 73 65 64 20 29 7b 0a 20 20 20 20 70 2d 3e 70 55  sed ){.    p->pU
259d0 6e 75 73 65 64 2d 3e 66 64 20 3d 20 66 64 3b 0a  nused->fd = fd;.
259e0 20 20 20 20 70 2d 3e 70 55 6e 75 73 65 64 2d 3e      p->pUnused->
259f0 66 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20  flags = flags;. 
25a00 20 7d 0a 0a 20 20 69 66 28 20 69 73 44 65 6c 65   }..  if( isDele
25a10 74 65 20 29 7b 0a 23 69 66 20 4f 53 5f 56 58 57  te ){.#if OS_VXW
25a20 4f 52 4b 53 0a 20 20 20 20 7a 50 61 74 68 20 3d  ORKS.    zPath =
25a30 20 7a 4e 61 6d 65 3b 0a 23 65 6c 73 65 0a 20 20   zName;.#else.  
25a40 20 20 75 6e 6c 69 6e 6b 28 7a 4e 61 6d 65 29 3b    unlink(zName);
25a50 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23 69 66 20  .#endif.  }.#if 
25a60 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
25a70 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 65 6c  CKING_STYLE.  el
25a80 73 65 7b 0a 20 20 20 20 70 2d 3e 6f 70 65 6e 46  se{.    p->openF
25a90 6c 61 67 73 20 3d 20 6f 70 65 6e 46 6c 61 67 73  lags = openFlags
25aa0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
25ab0 69 66 28 20 69 73 4f 70 65 6e 44 69 72 65 63 74  if( isOpenDirect
25ac0 6f 72 79 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ory ){.    rc = 
25ad0 6f 70 65 6e 44 69 72 65 63 74 6f 72 79 28 7a 50  openDirectory(zP
25ae0 61 74 68 2c 20 26 64 69 72 66 64 29 3b 0a 20 20  ath, &dirfd);.  
25af0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
25b00 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  _OK ){.      /* 
25b10 49 74 20 69 73 20 73 61 66 65 20 74 6f 20 63 6c  It is safe to cl
25b20 6f 73 65 20 66 64 20 61 74 20 74 68 69 73 20 70  ose fd at this p
25b30 6f 69 6e 74 2c 20 62 65 63 61 75 73 65 20 69 74  oint, because it
25b40 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 6e   is guaranteed n
25b50 6f 74 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 62  ot.      ** to b
25b60 65 20 6f 70 65 6e 20 6f 6e 20 61 20 64 61 74 61  e open on a data
25b70 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 69 74  base file. If it
25b80 20 77 65 72 65 20 6f 70 65 6e 20 6f 6e 20 61 20   were open on a 
25b90 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 0a 20  database file,. 
25ba0 20 20 20 20 20 2a 2a 20 69 74 20 77 6f 75 6c 64       ** it would
25bb0 20 6e 6f 74 20 62 65 20 73 61 66 65 20 74 6f 20   not be safe to 
25bc0 63 6c 6f 73 65 20 61 73 20 74 68 69 73 20 77 6f  close as this wo
25bd0 75 6c 64 20 72 65 6c 65 61 73 65 20 61 6e 79 20  uld release any 
25be0 6c 6f 63 6b 73 20 68 65 6c 64 0a 20 20 20 20 20  locks held.     
25bf0 20 2a 2a 20 6f 6e 20 74 68 65 20 66 69 6c 65 20   ** on the file 
25c00 62 79 20 74 68 69 73 20 70 72 6f 63 65 73 73 2e  by this process.
25c10 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72    */.      asser
25c20 74 28 20 65 54 79 70 65 21 3d 53 51 4c 49 54 45  t( eType!=SQLITE
25c30 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 29 3b  _OPEN_MAIN_DB );
25c40 0a 20 20 20 20 20 20 63 6c 6f 73 65 28 66 64 29  .      close(fd)
25c50 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
25c60 20 73 69 6c 65 6e 74 6c 79 20 6c 65 61 6b 20 69   silently leak i
25c70 66 20 66 61 69 6c 2c 20 61 6c 72 65 61 64 79 20  f fail, already 
25c80 69 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20  in error */.    
25c90 20 20 67 6f 74 6f 20 6f 70 65 6e 5f 66 69 6e 69    goto open_fini
25ca0 73 68 65 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  shed;.    }.  }.
25cb0 0a 23 69 66 64 65 66 20 46 44 5f 43 4c 4f 45 58  .#ifdef FD_CLOEX
25cc0 45 43 0a 20 20 66 63 6e 74 6c 28 66 64 2c 20 46  EC.  fcntl(fd, F
25cd0 5f 53 45 54 46 44 2c 20 66 63 6e 74 6c 28 66 64  _SETFD, fcntl(fd
25ce0 2c 20 46 5f 47 45 54 46 44 2c 20 30 29 20 7c 20  , F_GETFD, 0) | 
25cf0 46 44 5f 43 4c 4f 45 58 45 43 29 3b 0a 23 65 6e  FD_CLOEXEC);.#en
25d00 64 69 66 0a 0a 20 20 6e 6f 4c 6f 63 6b 20 3d 20  dif..  noLock = 
25d10 65 54 79 70 65 21 3d 53 51 4c 49 54 45 5f 4f 50  eType!=SQLITE_OP
25d20 45 4e 5f 4d 41 49 4e 5f 44 42 3b 0a 0a 20 20 0a  EN_MAIN_DB;..  .
25d30 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50  #if defined(__AP
25d40 50 4c 45 5f 5f 29 20 7c 7c 20 53 51 4c 49 54 45  PLE__) || SQLITE
25d50 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
25d60 53 54 59 4c 45 0a 20 20 73 74 72 75 63 74 20 73  STYLE.  struct s
25d70 74 61 74 66 73 20 66 73 49 6e 66 6f 3b 0a 20 20  tatfs fsInfo;.  
25d80 69 66 28 20 66 73 74 61 74 66 73 28 66 64 2c 20  if( fstatfs(fd, 
25d90 26 66 73 49 6e 66 6f 29 20 3d 3d 20 2d 31 20 29  &fsInfo) == -1 )
25da0 7b 0a 20 20 20 20 28 28 75 6e 69 78 46 69 6c 65  {.    ((unixFile
25db0 2a 29 70 46 69 6c 65 29 2d 3e 6c 61 73 74 45 72  *)pFile)->lastEr
25dc0 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  rno = errno;.   
25dd0 20 69 66 28 20 64 69 72 66 64 3e 3d 30 20 29 20   if( dirfd>=0 ) 
25de0 63 6c 6f 73 65 28 64 69 72 66 64 29 3b 20 2f 2a  close(dirfd); /*
25df0 20 73 69 6c 65 6e 74 6c 79 20 6c 65 61 6b 20 69   silently leak i
25e00 66 20 66 61 69 6c 2c 20 69 6e 20 65 72 72 6f 72  f fail, in error
25e10 20 2a 2f 0a 20 20 20 20 63 6c 6f 73 65 28 66 64   */.    close(fd
25e20 29 3b 20 2f 2a 20 73 69 6c 65 6e 74 6c 79 20 6c  ); /* silently l
25e30 65 61 6b 20 69 66 20 66 61 69 6c 2c 20 69 6e 20  eak if fail, in 
25e40 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 72 65 74  error */.    ret
25e50 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
25e60 5f 41 43 43 45 53 53 3b 0a 20 20 7d 0a 20 20 69  _ACCESS;.  }.  i
25e70 66 20 28 30 20 3d 3d 20 73 74 72 6e 63 6d 70 28  f (0 == strncmp(
25e80 22 6d 73 64 6f 73 22 2c 20 66 73 49 6e 66 6f 2e  "msdos", fsInfo.
25e90 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20 35 29  f_fstypename, 5)
25ea0 29 20 7b 0a 20 20 20 20 28 28 75 6e 69 78 46 69  ) {.    ((unixFi
25eb0 6c 65 2a 29 70 46 69 6c 65 29 2d 3e 66 73 46 6c  le*)pFile)->fsFl
25ec0 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 46 53  ags |= SQLITE_FS
25ed0 46 4c 41 47 53 5f 49 53 5f 4d 53 44 4f 53 3b 0a  FLAGS_IS_MSDOS;.
25ee0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 0a 23 69    }.#endif.  .#i
25ef0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
25f00 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 23 69  LOCKING_STYLE.#i
25f10 66 20 53 51 4c 49 54 45 5f 50 52 45 46 45 52 5f  f SQLITE_PREFER_
25f20 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 0a 20 20  PROXY_LOCKING.  
25f30 69 73 41 75 74 6f 50 72 6f 78 79 20 3d 20 31 3b  isAutoProxy = 1;
25f40 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 69 73  .#endif.  if( is
25f50 41 75 74 6f 50 72 6f 78 79 20 26 26 20 28 7a 50  AutoProxy && (zP
25f60 61 74 68 21 3d 4e 55 4c 4c 29 20 26 26 20 28 21  ath!=NULL) && (!
25f70 6e 6f 4c 6f 63 6b 29 20 26 26 20 70 56 66 73 2d  noLock) && pVfs-
25f80 3e 78 4f 70 65 6e 20 29 7b 0a 20 20 20 20 63 68  >xOpen ){.    ch
25f90 61 72 20 2a 65 6e 76 66 6f 72 63 65 20 3d 20 67  ar *envforce = g
25fa0 65 74 65 6e 76 28 22 53 51 4c 49 54 45 5f 46 4f  etenv("SQLITE_FO
25fb0 52 43 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e  RCE_PROXY_LOCKIN
25fc0 47 22 29 3b 0a 20 20 20 20 69 6e 74 20 75 73 65  G");.    int use
25fd0 50 72 6f 78 79 20 3d 20 30 3b 0a 0a 20 20 20 20  Proxy = 0;..    
25fe0 2f 2a 20 53 51 4c 49 54 45 5f 46 4f 52 43 45 5f  /* SQLITE_FORCE_
25ff0 50 52 4f 58 59 5f 4c 4f 43 4b 49 4e 47 3d 3d 31  PROXY_LOCKING==1
26000 20 6d 65 61 6e 73 20 66 6f 72 63 65 20 61 6c 77   means force alw
26010 61 79 73 20 75 73 65 20 70 72 6f 78 79 2c 20 30  ays use proxy, 0
26020 20 6d 65 61 6e 73 20 0a 20 20 20 20 2a 2a 20 6e   means .    ** n
26030 65 76 65 72 20 75 73 65 20 70 72 6f 78 79 2c 20  ever use proxy, 
26040 4e 55 4c 4c 20 6d 65 61 6e 73 20 75 73 65 20 70  NULL means use p
26050 72 6f 78 79 20 66 6f 72 20 6e 6f 6e 2d 6c 6f 63  roxy for non-loc
26060 61 6c 20 66 69 6c 65 73 20 6f 6e 6c 79 2e 20 20  al files only.  
26070 2a 2f 0a 20 20 20 20 69 66 28 20 65 6e 76 66 6f  */.    if( envfo
26080 72 63 65 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20  rce!=NULL ){.   
26090 20 20 20 75 73 65 50 72 6f 78 79 20 3d 20 61 74     useProxy = at
260a0 6f 69 28 65 6e 76 66 6f 72 63 65 29 3e 30 3b 0a  oi(envforce)>0;.
260b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
260c0 20 73 74 72 75 63 74 20 73 74 61 74 66 73 20 66   struct statfs f
260d0 73 49 6e 66 6f 3b 0a 20 20 20 20 20 20 69 66 28  sInfo;.      if(
260e0 20 73 74 61 74 66 73 28 7a 50 61 74 68 2c 20 26   statfs(zPath, &
260f0 66 73 49 6e 66 6f 29 20 3d 3d 20 2d 31 20 29 7b  fsInfo) == -1 ){
26100 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 20 74  .        /* In t
26110 68 65 6f 72 79 2c 20 74 68 65 20 63 6c 6f 73 65  heory, the close
26120 28 66 64 29 20 63 61 6c 6c 20 69 73 20 73 75 62  (fd) call is sub
26130 2d 6f 70 74 69 6d 61 6c 2e 20 49 66 20 74 68 65  -optimal. If the
26140 20 66 69 6c 65 20 6f 70 65 6e 65 64 0a 20 20 20   file opened.   
26150 20 20 20 20 20 2a 2a 20 77 69 74 68 20 66 64 20       ** with fd 
26160 69 73 20 61 20 64 61 74 61 62 61 73 65 20 66 69  is a database fi
26170 6c 65 2c 20 61 6e 64 20 74 68 65 72 65 20 61 72  le, and there ar
26180 65 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69  e other connecti
26190 6f 6e 73 20 6f 70 65 6e 0a 20 20 20 20 20 20 20  ons open.       
261a0 20 2a 2a 20 6f 6e 20 74 68 61 74 20 66 69 6c 65   ** on that file
261b0 20 74 68 61 74 20 61 72 65 20 63 75 72 72 65 6e   that are curren
261c0 74 6c 79 20 68 6f 6c 64 69 6e 67 20 61 64 76 69  tly holding advi
261d0 73 6f 72 79 20 6c 6f 63 6b 73 20 6f 6e 20 69 74  sory locks on it
261e0 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  ,.        ** the
261f0 6e 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 63 6c  n the call to cl
26200 6f 73 65 28 29 20 77 69 6c 6c 20 63 61 6e 63 65  ose() will cance
26210 6c 20 74 68 6f 73 65 20 6c 6f 63 6b 73 2e 20 49  l those locks. I
26220 6e 20 70 72 61 63 74 69 63 65 2c 0a 20 20 20 20  n practice,.    
26230 20 20 20 20 2a 2a 20 77 65 27 72 65 20 61 73 73      ** we're ass
26240 75 6d 69 6e 67 20 74 68 61 74 20 73 74 61 74 66  uming that statf
26250 73 28 29 20 64 6f 65 73 6e 27 74 20 66 61 69 6c  s() doesn't fail
26260 20 76 65 72 79 20 6f 66 74 65 6e 2e 20 41 74 20   very often. At 
26270 6c 65 61 73 74 0a 20 20 20 20 20 20 20 20 2a 2a  least.        **
26280 20 6e 6f 74 20 77 68 69 6c 65 20 6f 74 68 65 72   not while other
26290 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
262a0 73 20 6f 70 65 6e 65 64 20 62 79 20 74 68 65 20  s opened by the 
262b0 73 61 6d 65 20 70 72 6f 63 65 73 73 20 6f 6e 0a  same process on.
262c0 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 73          ** the s
262d0 61 6d 65 20 66 69 6c 65 20 61 72 65 20 77 6f 72  ame file are wor
262e0 6b 69 6e 67 2e 20 20 2a 2f 0a 20 20 20 20 20 20  king.  */.      
262f0 20 20 70 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d    p->lastErrno =
26300 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20   errno;.        
26310 69 66 28 20 64 69 72 66 64 3e 3d 30 20 29 7b 0a  if( dirfd>=0 ){.
26320 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 28            close(
26330 64 69 72 66 64 29 3b 20 2f 2a 20 73 69 6c 65 6e  dirfd); /* silen
26340 74 6c 79 20 6c 65 61 6b 20 69 66 20 66 61 69 6c  tly leak if fail
26350 2c 20 69 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20  , in error */.  
26360 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
26370 63 6c 6f 73 65 28 66 64 29 3b 20 2f 2a 20 73 69  close(fd); /* si
26380 6c 65 6e 74 6c 79 20 6c 65 61 6b 20 69 66 20 66  lently leak if f
26390 61 69 6c 2c 20 69 6e 20 65 72 72 6f 72 20 2a 2f  ail, in error */
263a0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
263b0 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53  LITE_IOERR_ACCES
263c0 53 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  S;.        goto 
263d0 6f 70 65 6e 5f 66 69 6e 69 73 68 65 64 3b 0a 20  open_finished;. 
263e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 75 73 65       }.      use
263f0 50 72 6f 78 79 20 3d 20 21 28 66 73 49 6e 66 6f  Proxy = !(fsInfo
26400 2e 66 5f 66 6c 61 67 73 26 4d 4e 54 5f 4c 4f 43  .f_flags&MNT_LOC
26410 41 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  AL);.    }.    i
26420 66 28 20 75 73 65 50 72 6f 78 79 20 29 7b 0a 20  f( useProxy ){. 
26430 20 20 20 20 20 72 63 20 3d 20 66 69 6c 6c 49 6e       rc = fillIn
26440 55 6e 69 78 46 69 6c 65 28 70 56 66 73 2c 20 66  UnixFile(pVfs, f
26450 64 2c 20 64 69 72 66 64 2c 20 70 46 69 6c 65 2c  d, dirfd, pFile,
26460 20 7a 50 61 74 68 2c 20 6e 6f 4c 6f 63 6b 2c 20   zPath, noLock, 
26470 69 73 44 65 6c 65 74 65 29 3b 0a 20 20 20 20 20  isDelete);.     
26480 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
26490 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
264a0 20 3d 20 70 72 6f 78 79 54 72 61 6e 73 66 6f 72   = proxyTransfor
264b0 6d 55 6e 69 78 46 69 6c 65 28 28 75 6e 69 78 46  mUnixFile((unixF
264c0 69 6c 65 2a 29 70 46 69 6c 65 2c 20 22 3a 61 75  ile*)pFile, ":au
264d0 74 6f 3a 22 29 3b 0a 20 20 20 20 20 20 20 20 69  to:");.        i
264e0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
264f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
26500 20 55 73 65 20 75 6e 69 78 43 6c 6f 73 65 20 74   Use unixClose t
26510 6f 20 63 6c 65 61 6e 20 75 70 20 74 68 65 20 72  o clean up the r
26520 65 73 6f 75 72 63 65 73 20 61 64 64 65 64 20 69  esources added i
26530 6e 20 66 69 6c 6c 49 6e 55 6e 69 78 46 69 6c 65  n fillInUnixFile
26540 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61   .          ** a
26550 6e 64 20 63 6c 65 61 72 20 61 6c 6c 20 74 68 65  nd clear all the
26560 20 73 74 72 75 63 74 75 72 65 27 73 20 72 65 66   structure's ref
26570 65 72 65 6e 63 65 73 2e 20 20 53 70 65 63 69 66  erences.  Specif
26580 69 63 61 6c 6c 79 2c 20 0a 20 20 20 20 20 20 20  ically, .       
26590 20 20 20 2a 2a 20 70 46 69 6c 65 2d 3e 70 4d 65     ** pFile->pMe
265a0 74 68 6f 64 73 20 77 69 6c 6c 20 62 65 20 4e 55  thods will be NU
265b0 4c 4c 20 73 6f 20 73 71 6c 69 74 65 33 4f 73 43  LL so sqlite3OsC
265c0 6c 6f 73 65 20 77 69 6c 6c 20 62 65 20 61 20 6e  lose will be a n
265d0 6f 2d 6f 70 20 0a 20 20 20 20 20 20 20 20 20 20  o-op .          
265e0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 75 6e 69  */.          uni
265f0 78 43 6c 6f 73 65 28 70 46 69 6c 65 29 3b 0a 20  xClose(pFile);. 
26600 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
26610 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
26620 20 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f      }.      goto
26630 20 6f 70 65 6e 5f 66 69 6e 69 73 68 65 64 3b 0a   open_finished;.
26640 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
26650 0a 20 20 0a 20 20 72 63 20 3d 20 66 69 6c 6c 49  .  .  rc = fillI
26660 6e 55 6e 69 78 46 69 6c 65 28 70 56 66 73 2c 20  nUnixFile(pVfs, 
26670 66 64 2c 20 64 69 72 66 64 2c 20 70 46 69 6c 65  fd, dirfd, pFile
26680 2c 20 7a 50 61 74 68 2c 20 6e 6f 4c 6f 63 6b 2c  , zPath, noLock,
26690 20 69 73 44 65 6c 65 74 65 29 3b 0a 6f 70 65 6e   isDelete);.open
266a0 5f 66 69 6e 69 73 68 65 64 3a 0a 20 20 69 66 28  _finished:.  if(
266b0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
266c0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
266d0 65 65 28 70 2d 3e 70 55 6e 75 73 65 64 29 3b 0a  ee(p->pUnused);.
266e0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
266f0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  .}.../*.** Delet
26700 65 20 74 68 65 20 66 69 6c 65 20 61 74 20 7a 50  e the file at zP
26710 61 74 68 2e 20 49 66 20 74 68 65 20 64 69 72 53  ath. If the dirS
26720 79 6e 63 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ync argument is 
26730 74 72 75 65 2c 20 66 73 79 6e 63 28 29 0a 2a 2a  true, fsync().**
26740 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 61   the directory a
26750 66 74 65 72 20 64 65 6c 65 74 69 6e 67 20 74 68  fter deleting th
26760 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  e file..*/.stati
26770 63 20 69 6e 74 20 75 6e 69 78 44 65 6c 65 74 65  c int unixDelete
26780 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  (.  sqlite3_vfs 
26790 2a 4e 6f 74 55 73 65 64 2c 20 20 20 20 20 2f 2a  *NotUsed,     /*
267a0 20 56 46 53 20 63 6f 6e 74 61 69 6e 69 6e 67 20   VFS containing 
267b0 74 68 69 73 20 61 73 20 74 68 65 20 78 44 65 6c  this as the xDel
267c0 65 74 65 20 6d 65 74 68 6f 64 20 2a 2f 0a 20 20  ete method */.  
267d0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74  const char *zPat
267e0 68 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d  h,        /* Nam
267f0 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 62 65 20  e of file to be 
26800 64 65 6c 65 74 65 64 20 2a 2f 0a 20 20 69 6e 74  deleted */.  int
26810 20 64 69 72 53 79 6e 63 20 20 20 20 20 20 20 20   dirSync        
26820 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75         /* If tru
26830 65 2c 20 66 73 79 6e 63 28 29 20 64 69 72 65 63  e, fsync() direc
26840 74 6f 72 79 20 61 66 74 65 72 20 64 65 6c 65 74  tory after delet
26850 69 6e 67 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20  ing file */.){. 
26860 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
26870 5f 4f 4b 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  _OK;.  UNUSED_PA
26880 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
26890 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72  ;.  SimulateIOEr
268a0 72 6f 72 28 72 65 74 75 72 6e 20 53 51 4c 49 54  ror(return SQLIT
268b0 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 29 3b  E_IOERR_DELETE);
268c0 0a 20 20 75 6e 6c 69 6e 6b 28 7a 50 61 74 68 29  .  unlink(zPath)
268d0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
268e0 5f 44 49 53 41 42 4c 45 5f 44 49 52 53 59 4e 43  _DISABLE_DIRSYNC
268f0 0a 20 20 69 66 28 20 64 69 72 53 79 6e 63 20 29  .  if( dirSync )
26900 7b 0a 20 20 20 20 69 6e 74 20 66 64 3b 0a 20 20  {.    int fd;.  
26910 20 20 72 63 20 3d 20 6f 70 65 6e 44 69 72 65 63    rc = openDirec
26920 74 6f 72 79 28 7a 50 61 74 68 2c 20 26 66 64 29  tory(zPath, &fd)
26930 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
26940 4c 49 54 45 5f 4f 4b 20 29 7b 0a 23 69 66 20 4f  LITE_OK ){.#if O
26950 53 5f 56 58 57 4f 52 4b 53 0a 20 20 20 20 20 20  S_VXWORKS.      
26960 69 66 28 20 66 73 79 6e 63 28 66 64 29 3d 3d 2d  if( fsync(fd)==-
26970 31 20 29 0a 23 65 6c 73 65 0a 20 20 20 20 20 20  1 ).#else.      
26980 69 66 28 20 66 73 79 6e 63 28 66 64 29 20 29 0a  if( fsync(fd) ).
26990 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7b 0a 20  #endif.      {. 
269a0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
269b0 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f 46 53 59  TE_IOERR_DIR_FSY
269c0 4e 43 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  NC;.      }.    
269d0 20 20 69 66 28 20 63 6c 6f 73 65 28 66 64 29 26    if( close(fd)&
269e0 26 21 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  &!rc ){.        
269f0 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52  rc = SQLITE_IOER
26a00 52 5f 44 49 52 5f 43 4c 4f 53 45 3b 0a 20 20 20  R_DIR_CLOSE;.   
26a10 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23     }.    }.  }.#
26a20 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 72  endif.  return r
26a30 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65 73 74  c;.}../*.** Test
26a40 20 74 68 65 20 65 78 69 73 74 61 6e 63 65 20 6f   the existance o
26a50 66 20 6f 72 20 61 63 63 65 73 73 20 70 65 72 6d  f or access perm
26a60 69 73 73 69 6f 6e 73 20 6f 66 20 66 69 6c 65 20  issions of file 
26a70 7a 50 61 74 68 2e 20 54 68 65 0a 2a 2a 20 74 65  zPath. The.** te
26a80 73 74 20 70 65 72 66 6f 72 6d 65 64 20 64 65 70  st performed dep
26a90 65 6e 64 73 20 6f 6e 20 74 68 65 20 76 61 6c 75  ends on the valu
26aa0 65 20 6f 66 20 66 6c 61 67 73 3a 0a 2a 2a 0a 2a  e of flags:.**.*
26ab0 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 41 43 43  *     SQLITE_ACC
26ac0 45 53 53 5f 45 58 49 53 54 53 3a 20 52 65 74 75  ESS_EXISTS: Retu
26ad0 72 6e 20 31 20 69 66 20 74 68 65 20 66 69 6c 65  rn 1 if the file
26ae0 20 65 78 69 73 74 73 0a 2a 2a 20 20 20 20 20 53   exists.**     S
26af0 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 52 45 41  QLITE_ACCESS_REA
26b00 44 57 52 49 54 45 3a 20 52 65 74 75 72 6e 20 31  DWRITE: Return 1
26b10 20 69 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   if the file is 
26b20 72 65 61 64 20 61 6e 64 20 77 72 69 74 61 62 6c  read and writabl
26b30 65 2e 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45  e..**     SQLITE
26b40 5f 41 43 43 45 53 53 5f 52 45 41 44 4f 4e 4c 59  _ACCESS_READONLY
26b50 3a 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68  : Return 1 if th
26b60 65 20 66 69 6c 65 20 69 73 20 72 65 61 64 61 62  e file is readab
26b70 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77  le..**.** Otherw
26b80 69 73 65 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f  ise return 0..*/
26b90 0a 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78  .static int unix
26ba0 41 63 63 65 73 73 28 0a 20 20 73 71 6c 69 74 65  Access(.  sqlite
26bb0 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20  3_vfs *NotUsed, 
26bc0 20 20 2f 2a 20 54 68 65 20 56 46 53 20 63 6f 6e    /* The VFS con
26bd0 74 61 69 6e 69 6e 67 20 74 68 69 73 20 78 41 63  taining this xAc
26be0 63 65 73 73 20 6d 65 74 68 6f 64 20 2a 2f 0a 20  cess method */. 
26bf0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
26c00 74 68 2c 20 20 20 20 20 20 2f 2a 20 50 61 74 68  th,      /* Path
26c10 20 6f 66 20 74 68 65 20 66 69 6c 65 20 74 6f 20   of the file to 
26c20 65 78 61 6d 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  examine */.  int
26c30 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20   flags,         
26c40 20 20 20 20 20 2f 2a 20 57 68 61 74 20 64 6f 20       /* What do 
26c50 77 65 20 77 61 6e 74 20 74 6f 20 6c 65 61 72 6e  we want to learn
26c60 20 61 62 6f 75 74 20 74 68 65 20 7a 50 61 74 68   about the zPath
26c70 20 66 69 6c 65 3f 20 2a 2f 0a 20 20 69 6e 74 20   file? */.  int 
26c80 2a 70 52 65 73 4f 75 74 20 20 20 20 20 20 20 20  *pResOut        
26c90 20 20 20 20 2f 2a 20 57 72 69 74 65 20 72 65 73      /* Write res
26ca0 75 6c 74 20 62 6f 6f 6c 65 61 6e 20 68 65 72 65  ult boolean here
26cb0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61 6d 6f   */.){.  int amo
26cc0 64 65 20 3d 20 30 3b 0a 20 20 55 4e 55 53 45 44  de = 0;.  UNUSED
26cd0 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
26ce0 65 64 29 3b 0a 20 20 53 69 6d 75 6c 61 74 65 49  ed);.  SimulateI
26cf0 4f 45 72 72 6f 72 28 20 72 65 74 75 72 6e 20 53  OError( return S
26d00 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43 43 45  QLITE_IOERR_ACCE
26d10 53 53 3b 20 29 3b 0a 20 20 73 77 69 74 63 68 28  SS; );.  switch(
26d20 20 66 6c 61 67 73 20 29 7b 0a 20 20 20 20 63 61   flags ){.    ca
26d30 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  se SQLITE_ACCESS
26d40 5f 45 58 49 53 54 53 3a 0a 20 20 20 20 20 20 61  _EXISTS:.      a
26d50 6d 6f 64 65 20 3d 20 46 5f 4f 4b 3b 0a 20 20 20  mode = F_OK;.   
26d60 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
26d70 73 65 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  se SQLITE_ACCESS
26d80 5f 52 45 41 44 57 52 49 54 45 3a 0a 20 20 20 20  _READWRITE:.    
26d90 20 20 61 6d 6f 64 65 20 3d 20 57 5f 4f 4b 7c 52    amode = W_OK|R
26da0 5f 4f 4b 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  _OK;.      break
26db0 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
26dc0 45 5f 41 43 43 45 53 53 5f 52 45 41 44 3a 0a 20  E_ACCESS_READ:. 
26dd0 20 20 20 20 20 61 6d 6f 64 65 20 3d 20 52 5f 4f       amode = R_O
26de0 4b 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  K;.      break;.
26df0 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20  .    default:.  
26e00 20 20 20 20 61 73 73 65 72 74 28 21 22 49 6e 76      assert(!"Inv
26e10 61 6c 69 64 20 66 6c 61 67 73 20 61 72 67 75 6d  alid flags argum
26e20 65 6e 74 22 29 3b 0a 20 20 7d 0a 20 20 2a 70 52  ent");.  }.  *pR
26e30 65 73 4f 75 74 20 3d 20 28 61 63 63 65 73 73 28  esOut = (access(
26e40 7a 50 61 74 68 2c 20 61 6d 6f 64 65 29 3d 3d 30  zPath, amode)==0
26e50 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
26e60 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  TE_OK;.}.../*.**
26e70 20 54 75 72 6e 20 61 20 72 65 6c 61 74 69 76 65   Turn a relative
26e80 20 70 61 74 68 6e 61 6d 65 20 69 6e 74 6f 20 61   pathname into a
26e90 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 2e 20   full pathname. 
26ea0 54 68 65 20 72 65 6c 61 74 69 76 65 20 70 61 74  The relative pat
26eb0 68 0a 2a 2a 20 69 73 20 73 74 6f 72 65 64 20 61  h.** is stored a
26ec0 73 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74  s a nul-terminat
26ed0 65 64 20 73 74 72 69 6e 67 20 69 6e 20 74 68 65  ed string in the
26ee0 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20   buffer pointed 
26ef0 74 6f 20 62 79 0a 2a 2a 20 7a 50 61 74 68 2e 20  to by.** zPath. 
26f00 0a 2a 2a 0a 2a 2a 20 7a 4f 75 74 20 70 6f 69 6e  .**.** zOut poin
26f10 74 73 20 74 6f 20 61 20 62 75 66 66 65 72 20 6f  ts to a buffer o
26f20 66 20 61 74 20 6c 65 61 73 74 20 73 71 6c 69 74  f at least sqlit
26f30 65 33 5f 76 66 73 2e 6d 78 50 61 74 68 6e 61 6d  e3_vfs.mxPathnam
26f40 65 20 62 79 74 65 73 20 0a 2a 2a 20 28 69 6e 20  e bytes .** (in 
26f50 74 68 69 73 20 63 61 73 65 2c 20 4d 41 58 5f 50  this case, MAX_P
26f60 41 54 48 4e 41 4d 45 20 62 79 74 65 73 29 2e 20  ATHNAME bytes). 
26f70 54 68 65 20 66 75 6c 6c 2d 70 61 74 68 20 69 73  The full-path is
26f80 20 77 72 69 74 74 65 6e 20 74 6f 0a 2a 2a 20 74   written to.** t
26f90 68 69 73 20 62 75 66 66 65 72 20 62 65 66 6f 72  his buffer befor
26fa0 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a  e returning..*/.
26fb0 73 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 46  static int unixF
26fc0 75 6c 6c 50 61 74 68 6e 61 6d 65 28 0a 20 20 73  ullPathname(.  s
26fd0 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
26fe0 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
26ff0 50 6f 69 6e 74 65 72 20 74 6f 20 76 66 73 20 6f  Pointer to vfs o
27000 62 6a 65 63 74 20 2a 2f 0a 20 20 63 6f 6e 73 74  bject */.  const
27010 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 20 20   char *zPath,   
27020 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 73 73           /* Poss
27030 69 62 6c 79 20 72 65 6c 61 74 69 76 65 20 69 6e  ibly relative in
27040 70 75 74 20 70 61 74 68 20 2a 2f 0a 20 20 69 6e  put path */.  in
27050 74 20 6e 4f 75 74 2c 20 20 20 20 20 20 20 20 20  t nOut,         
27060 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
27070 69 7a 65 20 6f 66 20 6f 75 74 70 75 74 20 62 75  ize of output bu
27080 66 66 65 72 20 69 6e 20 62 79 74 65 73 20 2a 2f  ffer in bytes */
27090 0a 20 20 63 68 61 72 20 2a 7a 4f 75 74 20 20 20  .  char *zOut   
270a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
270b0 20 2f 2a 20 4f 75 74 70 75 74 20 62 75 66 66 65   /* Output buffe
270c0 72 20 2a 2f 0a 29 7b 0a 0a 20 20 2f 2a 20 49 74  r */.){..  /* It
270d0 27 73 20 6f 64 64 20 74 6f 20 73 69 6d 75 6c 61  's odd to simula
270e0 74 65 20 61 6e 20 69 6f 2d 65 72 72 6f 72 20 68  te an io-error h
270f0 65 72 65 2c 20 62 75 74 20 72 65 61 6c 6c 79 20  ere, but really 
27100 74 68 69 73 20 69 73 20 6a 75 73 74 0a 20 20 2a  this is just.  *
27110 2a 20 75 73 69 6e 67 20 74 68 65 20 69 6f 2d 65  * using the io-e
27120 72 72 6f 72 20 69 6e 66 72 61 73 74 72 75 63 74  rror infrastruct
27130 75 72 65 20 74 6f 20 74 65 73 74 20 74 68 61 74  ure to test that
27140 20 53 51 4c 69 74 65 20 68 61 6e 64 6c 65 73 20   SQLite handles 
27150 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69  this.  ** functi
27160 6f 6e 20 66 61 69 6c 69 6e 67 2e 20 54 68 69 73  on failing. This
27170 20 66 75 6e 63 74 69 6f 6e 20 63 6f 75 6c 64 20   function could 
27180 66 61 69 6c 20 69 66 2c 20 66 6f 72 20 65 78 61  fail if, for exa
27190 6d 70 6c 65 2c 20 74 68 65 0a 20 20 2a 2a 20 63  mple, the.  ** c
271a0 75 72 72 65 6e 74 20 77 6f 72 6b 69 6e 67 20 64  urrent working d
271b0 69 72 65 63 74 6f 72 79 20 68 61 73 20 62 65 65  irectory has bee
271c0 6e 20 75 6e 6c 69 6e 6b 65 64 2e 0a 20 20 2a 2f  n unlinked..  */
271d0 0a 20 20 53 69 6d 75 6c 61 74 65 49 4f 45 72 72  .  SimulateIOErr
271e0 6f 72 28 20 72 65 74 75 72 6e 20 53 51 4c 49 54  or( return SQLIT
271f0 45 5f 45 52 52 4f 52 20 29 3b 0a 0a 20 20 61 73  E_ERROR );..  as
27200 73 65 72 74 28 20 70 56 66 73 2d 3e 6d 78 50 61  sert( pVfs->mxPa
27210 74 68 6e 61 6d 65 3d 3d 4d 41 58 5f 50 41 54 48  thname==MAX_PATH
27220 4e 41 4d 45 20 29 3b 0a 20 20 55 4e 55 53 45 44  NAME );.  UNUSED
27230 5f 50 41 52 41 4d 45 54 45 52 28 70 56 66 73 29  _PARAMETER(pVfs)
27240 3b 0a 0a 20 20 7a 4f 75 74 5b 6e 4f 75 74 2d 31  ;..  zOut[nOut-1
27250 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 69 66 28 20  ] = '\0';.  if( 
27260 7a 50 61 74 68 5b 30 5d 3d 3d 27 2f 27 20 29 7b  zPath[0]=='/' ){
27270 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
27280 72 69 6e 74 66 28 6e 4f 75 74 2c 20 7a 4f 75 74  rintf(nOut, zOut
27290 2c 20 22 25 73 22 2c 20 7a 50 61 74 68 29 3b 0a  , "%s", zPath);.
272a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
272b0 20 6e 43 77 64 3b 0a 20 20 20 20 69 66 28 20 67   nCwd;.    if( g
272c0 65 74 63 77 64 28 7a 4f 75 74 2c 20 6e 4f 75 74  etcwd(zOut, nOut
272d0 2d 31 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  -1)==0 ){.      
272e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 41  return SQLITE_CA
272f0 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20  NTOPEN_BKPT;.   
27300 20 7d 0a 20 20 20 20 6e 43 77 64 20 3d 20 28 69   }.    nCwd = (i
27310 6e 74 29 73 74 72 6c 65 6e 28 7a 4f 75 74 29 3b  nt)strlen(zOut);
27320 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
27330 72 69 6e 74 66 28 6e 4f 75 74 2d 6e 43 77 64 2c  rintf(nOut-nCwd,
27340 20 26 7a 4f 75 74 5b 6e 43 77 64 5d 2c 20 22 2f   &zOut[nCwd], "/
27350 25 73 22 2c 20 7a 50 61 74 68 29 3b 0a 20 20 7d  %s", zPath);.  }
27360 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
27370 5f 4f 4b 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66  _OK;.}...#ifndef
27380 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41   SQLITE_OMIT_LOA
27390 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 2f 2a 0a 2a  D_EXTENSION./*.*
273a0 2a 20 49 6e 74 65 72 66 61 63 65 73 20 66 6f 72  * Interfaces for
273b0 20 6f 70 65 6e 69 6e 67 20 61 20 73 68 61 72 65   opening a share
273c0 64 20 6c 69 62 72 61 72 79 2c 20 66 69 6e 64 69  d library, findi
273d0 6e 67 20 65 6e 74 72 79 20 70 6f 69 6e 74 73 0a  ng entry points.
273e0 2a 2a 20 77 69 74 68 69 6e 20 74 68 65 20 73 68  ** within the sh
273f0 61 72 65 64 20 6c 69 62 72 61 72 79 2c 20 61 6e  ared library, an
27400 64 20 63 6c 6f 73 69 6e 67 20 74 68 65 20 73 68  d closing the sh
27410 61 72 65 64 20 6c 69 62 72 61 72 79 2e 0a 2a 2f  ared library..*/
27420 0a 23 69 6e 63 6c 75 64 65 20 3c 64 6c 66 63 6e  .#include <dlfcn
27430 2e 68 3e 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .h>.static void 
27440 2a 75 6e 69 78 44 6c 4f 70 65 6e 28 73 71 6c 69  *unixDlOpen(sqli
27450 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64  te3_vfs *NotUsed
27460 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  , const char *zF
27470 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 55 4e 55 53  ilename){.  UNUS
27480 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
27490 55 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20  Used);.  return 
274a0 64 6c 6f 70 65 6e 28 7a 46 69 6c 65 6e 61 6d 65  dlopen(zFilename
274b0 2c 20 52 54 4c 44 5f 4e 4f 57 20 7c 20 52 54 4c  , RTLD_NOW | RTL
274c0 44 5f 47 4c 4f 42 41 4c 29 3b 0a 7d 0a 0a 2f 2a  D_GLOBAL);.}../*
274d0 0a 2a 2a 20 53 51 4c 69 74 65 20 63 61 6c 6c 73  .** SQLite calls
274e0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
274f0 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 72  mmediately after
27500 20 61 20 63 61 6c 6c 20 74 6f 20 75 6e 69 78 44   a call to unixD
27510 6c 53 79 6d 28 29 20 6f 72 0a 2a 2a 20 75 6e 69  lSym() or.** uni
27520 78 44 6c 4f 70 65 6e 28 29 20 66 61 69 6c 73 20  xDlOpen() fails 
27530 28 72 65 74 75 72 6e 73 20 61 20 6e 75 6c 6c 20  (returns a null 
27540 70 6f 69 6e 74 65 72 29 2e 20 49 66 20 61 20 6d  pointer). If a m
27550 6f 72 65 20 64 65 74 61 69 6c 65 64 20 65 72 72  ore detailed err
27560 6f 72 0a 2a 2a 20 6d 65 73 73 61 67 65 20 69 73  or.** message is
27570 20 61 76 61 69 6c 61 62 6c 65 2c 20 69 74 20 69   available, it i
27580 73 20 77 72 69 74 74 65 6e 20 74 6f 20 7a 42 75  s written to zBu
27590 66 4f 75 74 2e 20 49 66 20 6e 6f 20 65 72 72 6f  fOut. If no erro
275a0 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20 69 73 20  r message.** is 
275b0 61 76 61 69 6c 61 62 6c 65 2c 20 7a 42 75 66 4f  available, zBufO
275c0 75 74 20 69 73 20 6c 65 66 74 20 75 6e 6d 6f 64  ut is left unmod
275d0 69 66 69 65 64 20 61 6e 64 20 53 51 4c 69 74 65  ified and SQLite
275e0 20 75 73 65 73 20 61 20 64 65 66 61 75 6c 74 0a   uses a default.
275f0 2a 2a 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  ** error message
27600 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
27610 20 75 6e 69 78 44 6c 45 72 72 6f 72 28 73 71 6c   unixDlError(sql
27620 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74 55 73 65  ite3_vfs *NotUse
27630 64 2c 20 69 6e 74 20 6e 42 75 66 2c 20 63 68 61  d, int nBuf, cha
27640 72 20 2a 7a 42 75 66 4f 75 74 29 7b 0a 20 20 63  r *zBufOut){.  c
27650 68 61 72 20 2a 7a 45 72 72 3b 0a 20 20 55 4e 55  har *zErr;.  UNU
27660 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
27670 74 55 73 65 64 29 3b 0a 20 20 75 6e 69 78 45 6e  tUsed);.  unixEn
27680 74 65 72 4d 75 74 65 78 28 29 3b 0a 20 20 7a 45  terMutex();.  zE
27690 72 72 20 3d 20 64 6c 65 72 72 6f 72 28 29 3b 0a  rr = dlerror();.
276a0 20 20 69 66 28 20 7a 45 72 72 20 29 7b 0a 20 20    if( zErr ){.  
276b0 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
276c0 74 66 28 6e 42 75 66 2c 20 7a 42 75 66 4f 75 74  tf(nBuf, zBufOut
276d0 2c 20 22 25 73 22 2c 20 7a 45 72 72 29 3b 0a 20  , "%s", zErr);. 
276e0 20 7d 0a 20 20 75 6e 69 78 4c 65 61 76 65 4d 75   }.  unixLeaveMu
276f0 74 65 78 28 29 3b 0a 7d 0a 73 74 61 74 69 63 20  tex();.}.static 
27700 76 6f 69 64 20 28 2a 75 6e 69 78 44 6c 53 79 6d  void (*unixDlSym
27710 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f  (sqlite3_vfs *No
27720 74 55 73 65 64 2c 20 76 6f 69 64 20 2a 70 2c 20  tUsed, void *p, 
27730 63 6f 6e 73 74 20 63 68 61 72 2a 7a 53 79 6d 29  const char*zSym)
27740 29 28 76 6f 69 64 29 7b 0a 20 20 2f 2a 20 0a 20  )(void){.  /* . 
27750 20 2a 2a 20 47 43 43 20 77 69 74 68 20 2d 70 65   ** GCC with -pe
27760 64 61 6e 74 69 63 2d 65 72 72 6f 72 73 20 73 61  dantic-errors sa
27770 79 73 20 74 68 61 74 20 43 39 30 20 64 6f 65 73  ys that C90 does
27780 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 20 76 6f 69   not allow a voi
27790 64 2a 20 74 6f 20 62 65 0a 20 20 2a 2a 20 63 61  d* to be.  ** ca
277a0 73 74 20 69 6e 74 6f 20 61 20 70 6f 69 6e 74 65  st into a pointe
277b0 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 2e  r to a function.
277c0 20 20 41 6e 64 20 79 65 74 20 74 68 65 20 6c 69    And yet the li
277d0 62 72 61 72 79 20 64 6c 73 79 6d 28 29 20 72 6f  brary dlsym() ro
277e0 75 74 69 6e 65 0a 20 20 2a 2a 20 72 65 74 75 72  utine.  ** retur
277f0 6e 73 20 61 20 76 6f 69 64 2a 20 77 68 69 63 68  ns a void* which
27800 20 69 73 20 72 65 61 6c 6c 79 20 61 20 70 6f 69   is really a poi
27810 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69  nter to a functi
27820 6f 6e 2e 20 20 53 6f 20 68 6f 77 20 64 6f 20 77  on.  So how do w
27830 65 0a 20 20 2a 2a 20 75 73 65 20 64 6c 73 79 6d  e.  ** use dlsym
27840 28 29 20 77 69 74 68 20 2d 70 65 64 61 6e 74 69  () with -pedanti
27850 63 2d 65 72 72 6f 72 73 3f 0a 20 20 2a 2a 0a 20  c-errors?.  **. 
27860 20 2a 2a 20 56 61 72 69 61 62 6c 65 20 78 20 62   ** Variable x b
27870 65 6c 6f 77 20 69 73 20 64 65 66 69 6e 65 64 20  elow is defined 
27880 74 6f 20 62 65 20 61 20 70 6f 69 6e 74 65 72 20  to be a pointer 
27890 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20 74 61  to a function ta
278a0 6b 69 6e 67 0a 20 20 2a 2a 20 70 61 72 61 6d 65  king.  ** parame
278b0 74 65 72 73 20 76 6f 69 64 2a 20 61 6e 64 20 63  ters void* and c
278c0 6f 6e 73 74 20 63 68 61 72 2a 20 61 6e 64 20 72  onst char* and r
278d0 65 74 75 72 6e 69 6e 67 20 61 20 70 6f 69 6e 74  eturning a point
278e0 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e  er to a function
278f0 2e 0a 20 20 2a 2a 20 57 65 20 69 6e 69 74 69 61  ..  ** We initia
27900 6c 69 7a 65 20 78 20 62 79 20 61 73 73 69 67 6e  lize x by assign
27910 69 6e 67 20 69 74 20 61 20 70 6f 69 6e 74 65 72  ing it a pointer
27920 20 74 6f 20 74 68 65 20 64 6c 73 79 6d 28 29 20   to the dlsym() 
27930 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 28  function..  ** (
27940 54 68 61 74 20 61 73 73 69 67 6e 6d 65 6e 74 20  That assignment 
27950 72 65 71 75 69 72 65 73 20 61 20 63 61 73 74 2e  requires a cast.
27960 29 20 20 54 68 65 6e 20 77 65 20 63 61 6c 6c 20  )  Then we call 
27970 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 74 68 61  the function tha
27980 74 0a 20 20 2a 2a 20 78 20 70 6f 69 6e 74 73 20  t.  ** x points 
27990 74 6f 2e 20 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20  to.  .  **.  ** 
279a0 54 68 69 73 20 77 6f 72 6b 2d 61 72 6f 75 6e 64  This work-around
279b0 20 69 73 20 75 6e 6c 69 6b 65 6c 79 20 74 6f 20   is unlikely to 
279c0 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79 20 6f  work correctly o
279d0 6e 20 61 6e 79 20 73 79 73 74 65 6d 20 77 68 65  n any system whe
279e0 72 65 0a 20 20 2a 2a 20 79 6f 75 20 72 65 61 6c  re.  ** you real
279f0 6c 79 20 63 61 6e 6e 6f 74 20 63 61 73 74 20 61  ly cannot cast a
27a00 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65   function pointe
27a10 72 20 69 6e 74 6f 20 76 6f 69 64 2a 2e 20 20 42  r into void*.  B
27a20 75 74 20 74 68 65 6e 2c 20 6f 6e 20 74 68 65 0a  ut then, on the.
27a30 20 20 2a 2a 20 6f 74 68 65 72 20 68 61 6e 64 2c    ** other hand,
27a40 20 64 6c 73 79 6d 28 29 20 77 69 6c 6c 20 6e 6f   dlsym() will no
27a50 74 20 77 6f 72 6b 20 6f 6e 20 73 75 63 68 20 61  t work on such a
27a60 20 73 79 73 74 65 6d 20 65 69 74 68 65 72 2c 20   system either, 
27a70 73 6f 20 77 65 20 68 61 76 65 0a 20 20 2a 2a 20  so we have.  ** 
27a80 6e 6f 74 20 72 65 61 6c 6c 79 20 6c 6f 73 74 20  not really lost 
27a90 61 6e 79 74 68 69 6e 67 2e 0a 20 20 2a 2f 0a 20  anything..  */. 
27aa0 20 76 6f 69 64 20 28 2a 28 2a 78 29 28 76 6f 69   void (*(*x)(voi
27ab0 64 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 29  d*,const char*))
27ac0 28 76 6f 69 64 29 3b 0a 20 20 55 4e 55 53 45 44  (void);.  UNUSED
27ad0 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
27ae0 65 64 29 3b 0a 20 20 78 20 3d 20 28 76 6f 69 64  ed);.  x = (void
27af0 28 2a 28 2a 29 28 76 6f 69 64 2a 2c 63 6f 6e 73  (*(*)(void*,cons
27b00 74 20 63 68 61 72 2a 29 29 28 76 6f 69 64 29 29  t char*))(void))
27b10 64 6c 73 79 6d 3b 0a 20 20 72 65 74 75 72 6e 20  dlsym;.  return 
27b20 28 2a 78 29 28 70 2c 20 7a 53 79 6d 29 3b 0a 7d  (*x)(p, zSym);.}
27b30 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 69  .static void uni
27b40 78 44 6c 43 6c 6f 73 65 28 73 71 6c 69 74 65 33  xDlClose(sqlite3
27b50 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 76  _vfs *NotUsed, v
27b60 6f 69 64 20 2a 70 48 61 6e 64 6c 65 29 7b 0a 20  oid *pHandle){. 
27b70 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
27b80 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 64 6c  R(NotUsed);.  dl
27b90 63 6c 6f 73 65 28 70 48 61 6e 64 6c 65 29 3b 0a  close(pHandle);.
27ba0 7d 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 53 51  }.#else /* if SQ
27bb0 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45  LITE_OMIT_LOAD_E
27bc0 58 54 45 4e 53 49 4f 4e 20 69 73 20 64 65 66 69  XTENSION is defi
27bd0 6e 65 64 3a 20 2a 2f 0a 20 20 23 64 65 66 69 6e  ned: */.  #defin
27be0 65 20 75 6e 69 78 44 6c 4f 70 65 6e 20 20 30 0a  e unixDlOpen  0.
27bf0 20 20 23 64 65 66 69 6e 65 20 75 6e 69 78 44 6c    #define unixDl
27c00 45 72 72 6f 72 20 30 0a 20 20 23 64 65 66 69 6e  Error 0.  #defin
27c10 65 20 75 6e 69 78 44 6c 53 79 6d 20 20 20 30 0a  e unixDlSym   0.
27c20 20 20 23 64 65 66 69 6e 65 20 75 6e 69 78 44 6c    #define unixDl
27c30 43 6c 6f 73 65 20 30 0a 23 65 6e 64 69 66 0a 0a  Close 0.#endif..
27c40 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 6e 42 75 66  /*.** Write nBuf
27c50 20 62 79 74 65 73 20 6f 66 20 72 61 6e 64 6f 6d   bytes of random
27c60 20 64 61 74 61 20 74 6f 20 74 68 65 20 73 75 70   data to the sup
27c70 70 6c 69 65 64 20 62 75 66 66 65 72 20 7a 42 75  plied buffer zBu
27c80 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  f..*/.static int
27c90 20 75 6e 69 78 52 61 6e 64 6f 6d 6e 65 73 73 28   unixRandomness(
27ca0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e 6f 74  sqlite3_vfs *Not
27cb0 55 73 65 64 2c 20 69 6e 74 20 6e 42 75 66 2c 20  Used, int nBuf, 
27cc0 63 68 61 72 20 2a 7a 42 75 66 29 7b 0a 20 20 55  char *zBuf){.  U
27cd0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
27ce0 4e 6f 74 55 73 65 64 29 3b 0a 20 20 61 73 73 65  NotUsed);.  asse
27cf0 72 74 28 28 73 69 7a 65 5f 74 29 6e 42 75 66 3e  rt((size_t)nBuf>
27d00 3d 28 73 69 7a 65 6f 66 28 74 69 6d 65 5f 74 29  =(sizeof(time_t)
27d10 2b 73 69 7a 65 6f 66 28 69 6e 74 29 29 29 3b 0a  +sizeof(int)));.
27d20 0a 20 20 2f 2a 20 57 65 20 68 61 76 65 20 74 6f  .  /* We have to
27d30 20 69 6e 69 74 69 61 6c 69 7a 65 20 7a 42 75 66   initialize zBuf
27d40 20 74 6f 20 70 72 65 76 65 6e 74 20 76 61 6c 67   to prevent valg
27d50 72 69 6e 64 20 66 72 6f 6d 20 72 65 70 6f 72 74  rind from report
27d60 69 6e 67 0a 20 20 2a 2a 20 65 72 72 6f 72 73 2e  ing.  ** errors.
27d70 20 20 54 68 65 20 72 65 70 6f 72 74 73 20 69 73    The reports is
27d80 73 75 65 64 20 62 79 20 76 61 6c 67 72 69 6e 64  sued by valgrind
27d90 20 61 72 65 20 69 6e 63 6f 72 72 65 63 74 20 2d   are incorrect -
27da0 20 77 65 20 77 6f 75 6c 64 0a 20 20 2a 2a 20 70   we would.  ** p
27db0 72 65 66 65 72 20 74 68 61 74 20 74 68 65 20 72  refer that the r
27dc0 61 6e 64 6f 6d 6e 65 73 73 20 62 65 20 69 6e 63  andomness be inc
27dd0 72 65 61 73 65 64 20 62 79 20 6d 61 6b 69 6e 67  reased by making
27de0 20 75 73 65 20 6f 66 20 74 68 65 0a 20 20 2a 2a   use of the.  **
27df0 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 73   uninitialized s
27e00 70 61 63 65 20 69 6e 20 7a 42 75 66 20 2d 20 62  pace in zBuf - b
27e10 75 74 20 76 61 6c 67 72 69 6e 64 20 65 72 72 6f  ut valgrind erro
27e20 72 73 20 74 65 6e 64 20 74 6f 20 77 6f 72 72 79  rs tend to worry
27e30 0a 20 20 2a 2a 20 73 6f 6d 65 20 75 73 65 72 73  .  ** some users
27e40 2e 20 20 52 61 74 68 65 72 20 74 68 61 6e 20 61  .  Rather than a
27e50 72 67 75 65 2c 20 69 74 20 73 65 65 6d 73 20 65  rgue, it seems e
27e60 61 73 69 65 72 20 6a 75 73 74 20 74 6f 20 69 6e  asier just to in
27e70 69 74 69 61 6c 69 7a 65 0a 20 20 2a 2a 20 74 68  itialize.  ** th
27e80 65 20 77 68 6f 6c 65 20 61 72 72 61 79 20 61 6e  e whole array an
27e90 64 20 73 69 6c 65 6e 63 65 20 76 61 6c 67 72 69  d silence valgri
27ea0 6e 64 2c 20 65 76 65 6e 20 69 66 20 74 68 61 74  nd, even if that
27eb0 20 6d 65 61 6e 73 20 6c 65 73 73 20 72 61 6e 64   means less rand
27ec0 6f 6d 6e 65 73 73 0a 20 20 2a 2a 20 69 6e 20 74  omness.  ** in t
27ed0 68 65 20 72 61 6e 64 6f 6d 20 73 65 65 64 2e 0a  he random seed..
27ee0 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 74    **.  ** When t
27ef0 65 73 74 69 6e 67 2c 20 69 6e 69 74 69 61 6c 69  esting, initiali
27f00 7a 69 6e 67 20 7a 42 75 66 5b 5d 20 74 6f 20 7a  zing zBuf[] to z
27f10 65 72 6f 20 69 73 20 61 6c 6c 20 77 65 20 64 6f  ero is all we do
27f20 2e 20 20 54 68 61 74 20 6d 65 61 6e 73 0a 20 20  .  That means.  
27f30 2a 2a 20 74 68 61 74 20 77 65 20 61 6c 77 61 79  ** that we alway
27f40 73 20 75 73 65 20 74 68 65 20 73 61 6d 65 20 72  s use the same r
27f50 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 73 65 71  andom number seq
27f60 75 65 6e 63 65 2e 20 20 54 68 69 73 20 6d 61 6b  uence.  This mak
27f70 65 73 20 74 68 65 0a 20 20 2a 2a 20 74 65 73 74  es the.  ** test
27f80 73 20 72 65 70 65 61 74 61 62 6c 65 2e 0a 20 20  s repeatable..  
27f90 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 7a 42 75 66  */.  memset(zBuf
27fa0 2c 20 30 2c 20 6e 42 75 66 29 3b 0a 23 69 66 20  , 0, nBuf);.#if 
27fb0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
27fc0 54 45 53 54 29 0a 20 20 7b 0a 20 20 20 20 69 6e  TEST).  {.    in
27fd0 74 20 70 69 64 2c 20 66 64 3b 0a 20 20 20 20 66  t pid, fd;.    f
27fe0 64 20 3d 20 6f 70 65 6e 28 22 2f 64 65 76 2f 75  d = open("/dev/u
27ff0 72 61 6e 64 6f 6d 22 2c 20 4f 5f 52 44 4f 4e 4c  random", O_RDONL
28000 59 29 3b 0a 20 20 20 20 69 66 28 20 66 64 3c 30  Y);.    if( fd<0
28010 20 29 7b 0a 20 20 20 20 20 20 74 69 6d 65 5f 74   ){.      time_t
28020 20 74 3b 0a 20 20 20 20 20 20 74 69 6d 65 28 26   t;.      time(&
28030 74 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79  t);.      memcpy
28040 28 7a 42 75 66 2c 20 26 74 2c 20 73 69 7a 65 6f  (zBuf, &t, sizeo
28050 66 28 74 29 29 3b 0a 20 20 20 20 20 20 70 69 64  f(t));.      pid
28060 20 3d 20 67 65 74 70 69 64 28 29 3b 0a 20 20 20   = getpid();.   
28070 20 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b     memcpy(&zBuf[
28080 73 69 7a 65 6f 66 28 74 29 5d 2c 20 26 70 69 64  sizeof(t)], &pid
28090 2c 20 73 69 7a 65 6f 66 28 70 69 64 29 29 3b 0a  , sizeof(pid));.
280a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 69        assert( si
280b0 7a 65 6f 66 28 74 29 2b 73 69 7a 65 6f 66 28 70  zeof(t)+sizeof(p
280c0 69 64 29 3c 3d 28 73 69 7a 65 5f 74 29 6e 42 75  id)<=(size_t)nBu
280d0 66 20 29 3b 0a 20 20 20 20 20 20 6e 42 75 66 20  f );.      nBuf 
280e0 3d 20 73 69 7a 65 6f 66 28 74 29 20 2b 20 73 69  = sizeof(t) + si
280f0 7a 65 6f 66 28 70 69 64 29 3b 0a 20 20 20 20 7d  zeof(pid);.    }
28100 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 42 75 66  else{.      nBuf
28110 20 3d 20 72 65 61 64 28 66 64 2c 20 7a 42 75 66   = read(fd, zBuf
28120 2c 20 6e 42 75 66 29 3b 0a 20 20 20 20 20 20 63  , nBuf);.      c
28130 6c 6f 73 65 28 66 64 29 3b 0a 20 20 20 20 7d 0a  lose(fd);.    }.
28140 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74    }.#endif.  ret
28150 75 72 6e 20 6e 42 75 66 3b 0a 7d 0a 0a 0a 2f 2a  urn nBuf;.}.../*
28160 0a 2a 2a 20 53 6c 65 65 70 20 66 6f 72 20 61 20  .** Sleep for a 
28170 6c 69 74 74 6c 65 20 77 68 69 6c 65 2e 20 20 52  little while.  R
28180 65 74 75 72 6e 20 74 68 65 20 61 6d 6f 75 6e 74  eturn the amount
28190 20 6f 66 20 74 69 6d 65 20 73 6c 65 70 74 2e 0a   of time slept..
281a0 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20  ** The argument 
281b0 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
281c0 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20 77 65   microseconds we
281d0 20 77 61 6e 74 20 74 6f 20 73 6c 65 65 70 2e 0a   want to sleep..
281e0 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  ** The return va
281f0 6c 75 65 20 69 73 20 74 68 65 20 6e 75 6d 62 65  lue is the numbe
28200 72 20 6f 66 20 6d 69 63 72 6f 73 65 63 6f 6e 64  r of microsecond
28210 73 20 6f 66 20 73 6c 65 65 70 20 61 63 74 75 61  s of sleep actua
28220 6c 6c 79 0a 2a 2a 20 72 65 71 75 65 73 74 65 64  lly.** requested
28230 20 66 72 6f 6d 20 74 68 65 20 75 6e 64 65 72 6c   from the underl
28240 79 69 6e 67 20 6f 70 65 72 61 74 69 6e 67 20 73  ying operating s
28250 79 73 74 65 6d 2c 20 61 20 6e 75 6d 62 65 72 20  ystem, a number 
28260 77 68 69 63 68 0a 2a 2a 20 6d 69 67 68 74 20 62  which.** might b
28270 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f  e greater than o
28280 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20 61  r equal to the a
28290 72 67 75 6d 65 6e 74 2c 20 62 75 74 20 6e 6f 74  rgument, but not
282a0 20 6c 65 73 73 0a 2a 2a 20 74 68 61 6e 20 74 68   less.** than th
282b0 65 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73  e argument..*/.s
282c0 74 61 74 69 63 20 69 6e 74 20 75 6e 69 78 53 6c  tatic int unixSl
282d0 65 65 70 28 73 71 6c 69 74 65 33 5f 76 66 73 20  eep(sqlite3_vfs 
282e0 2a 4e 6f 74 55 73 65 64 2c 20 69 6e 74 20 6d 69  *NotUsed, int mi
282f0 63 72 6f 73 65 63 6f 6e 64 73 29 7b 0a 23 69 66  croseconds){.#if
28300 20 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 73 74   OS_VXWORKS.  st
28310 72 75 63 74 20 74 69 6d 65 73 70 65 63 20 73 70  ruct timespec sp
28320 3b 0a 0a 20 20 73 70 2e 74 76 5f 73 65 63 20 3d  ;..  sp.tv_sec =
28330 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20 2f 20   microseconds / 
28340 31 30 30 30 30 30 30 3b 0a 20 20 73 70 2e 74 76  1000000;.  sp.tv
28350 5f 6e 73 65 63 20 3d 20 28 6d 69 63 72 6f 73 65  _nsec = (microse
28360 63 6f 6e 64 73 20 25 20 31 30 30 30 30 30 30 29  conds % 1000000)
28370 20 2a 20 31 30 30 30 3b 0a 20 20 6e 61 6e 6f 73   * 1000;.  nanos
28380 6c 65 65 70 28 26 73 70 2c 20 4e 55 4c 4c 29 3b  leep(&sp, NULL);
28390 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
283a0 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
283b0 72 65 74 75 72 6e 20 6d 69 63 72 6f 73 65 63 6f  return microseco
283c0 6e 64 73 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e  nds;.#elif defin
283d0 65 64 28 48 41 56 45 5f 55 53 4c 45 45 50 29 20  ed(HAVE_USLEEP) 
283e0 26 26 20 48 41 56 45 5f 55 53 4c 45 45 50 0a 20  && HAVE_USLEEP. 
283f0 20 75 73 6c 65 65 70 28 6d 69 63 72 6f 73 65 63   usleep(microsec
28400 6f 6e 64 73 29 3b 0a 20 20 55 4e 55 53 45 44 5f  onds);.  UNUSED_
28410 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
28420 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 6d 69 63  d);.  return mic
28430 72 6f 73 65 63 6f 6e 64 73 3b 0a 23 65 6c 73 65  roseconds;.#else
28440 0a 20 20 69 6e 74 20 73 65 63 6f 6e 64 73 20 3d  .  int seconds =
28450 20 28 6d 69 63 72 6f 73 65 63 6f 6e 64 73 2b 39   (microseconds+9
28460 39 39 39 39 39 29 2f 31 30 30 30 30 30 30 3b 0a  99999)/1000000;.
28470 20 20 73 6c 65 65 70 28 73 65 63 6f 6e 64 73 29    sleep(seconds)
28480 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
28490 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
284a0 20 72 65 74 75 72 6e 20 73 65 63 6f 6e 64 73 2a   return seconds*
284b0 31 30 30 30 30 30 30 3b 0a 23 65 6e 64 69 66 0a  1000000;.#endif.
284c0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  }../*.** The fol
284d0 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65 2c  lowing variable,
284e0 20 69 66 20 73 65 74 20 74 6f 20 61 20 6e 6f 6e   if set to a non
284f0 2d 7a 65 72 6f 20 76 61 6c 75 65 2c 20 69 73 20  -zero value, is 
28500 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 0a 2a  interpreted as.*
28510 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * the number of 
28520 73 65 63 6f 6e 64 73 20 73 69 6e 63 65 20 31 39  seconds since 19
28530 37 30 20 61 6e 64 20 69 73 20 75 73 65 64 20 74  70 and is used t
28540 6f 20 73 65 74 20 74 68 65 20 72 65 73 75 6c 74  o set the result
28550 20 6f 66 0a 2a 2a 20 73 71 6c 69 74 65 33 4f 73   of.** sqlite3Os
28560 43 75 72 72 65 6e 74 54 69 6d 65 28 29 20 64 75  CurrentTime() du
28570 72 69 6e 67 20 74 65 73 74 69 6e 67 2e 0a 2a 2f  ring testing..*/
28580 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
28590 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  EST.int sqlite3_
285a0 63 75 72 72 65 6e 74 5f 74 69 6d 65 20 3d 20 30  current_time = 0
285b0 3b 20 20 2f 2a 20 46 61 6b 65 20 73 79 73 74 65  ;  /* Fake syste
285c0 6d 20 74 69 6d 65 20 69 6e 20 73 65 63 6f 6e 64  m time in second
285d0 73 20 73 69 6e 63 65 20 31 39 37 30 2e 20 2a 2f  s since 1970. */
285e0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46  .#endif../*.** F
285f0 69 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20  ind the current 
28600 74 69 6d 65 20 28 69 6e 20 55 6e 69 76 65 72 73  time (in Univers
28610 61 6c 20 43 6f 6f 72 64 69 6e 61 74 65 64 20 54  al Coordinated T
28620 69 6d 65 29 2e 20 20 57 72 69 74 65 20 69 6e 74  ime).  Write int
28630 6f 20 2a 70 69 4e 6f 77 0a 2a 2a 20 74 68 65 20  o *piNow.** the 
28640 63 75 72 72 65 6e 74 20 74 69 6d 65 20 61 6e 64  current time and
28650 20 64 61 74 65 20 61 73 20 61 20 4a 75 6c 69 61   date as a Julia
28660 6e 20 44 61 79 20 6e 75 6d 62 65 72 20 74 69 6d  n Day number tim
28670 65 73 20 38 36 5f 34 30 30 5f 30 30 30 2e 20 20  es 86_400_000.  
28680 49 6e 0a 2a 2a 20 6f 74 68 65 72 20 77 6f 72 64  In.** other word
28690 73 2c 20 77 72 69 74 65 20 69 6e 74 6f 20 2a 70  s, write into *p
286a0 69 4e 6f 77 20 74 68 65 20 6e 75 6d 62 65 72 20  iNow the number 
286b0 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20  of milliseconds 
286c0 73 69 6e 63 65 20 74 68 65 20 4a 75 6c 69 61 6e  since the Julian
286d0 0a 2a 2a 20 65 70 6f 63 68 20 6f 66 20 6e 6f 6f  .** epoch of noo
286e0 6e 20 69 6e 20 47 72 65 65 6e 77 69 63 68 20 6f  n in Greenwich o
286f0 6e 20 4e 6f 76 65 6d 62 65 72 20 32 34 2c 20 34  n November 24, 4
28700 37 31 34 20 42 2e 43 20 61 63 63 6f 72 64 69 6e  714 B.C accordin
28710 67 20 74 6f 20 74 68 65 0a 2a 2a 20 70 72 6f 6c  g to the.** prol
28720 65 70 74 69 63 20 47 72 65 67 6f 72 69 61 6e 20  eptic Gregorian 
28730 63 61 6c 65 6e 64 61 72 2e 0a 2a 2a 0a 2a 2a 20  calendar..**.** 
28740 4f 6e 20 73 75 63 63 65 73 73 2c 20 72 65 74 75  On success, retu
28750 72 6e 20 30 2e 20 20 52 65 74 75 72 6e 20 31 20  rn 0.  Return 1 
28760 69 66 20 74 68 65 20 74 69 6d 65 20 61 6e 64 20  if the time and 
28770 64 61 74 65 20 63 61 6e 6e 6f 74 20 62 65 20 66  date cannot be f
28780 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ound..*/.static 
28790 69 6e 74 20 75 6e 69 78 43 75 72 72 65 6e 74 54  int unixCurrentT
287a0 69 6d 65 49 6e 74 36 34 28 73 71 6c 69 74 65 33  imeInt64(sqlite3
287b0 5f 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 73  _vfs *NotUsed, s
287c0 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a 70 69  qlite3_int64 *pi
287d0 4e 6f 77 29 7b 0a 20 20 73 74 61 74 69 63 20 63  Now){.  static c
287e0 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 69 6e 74  onst sqlite3_int
287f0 36 34 20 75 6e 69 78 45 70 6f 63 68 20 3d 20 32  64 unixEpoch = 2
28800 34 34 30 35 38 37 35 2a 28 73 71 6c 69 74 65 33  4405875*(sqlite3
28810 5f 69 6e 74 36 34 29 38 36 34 30 30 30 30 3b 0a  _int64)8640000;.
28820 23 69 66 20 64 65 66 69 6e 65 64 28 4e 4f 5f 47  #if defined(NO_G
28830 45 54 54 4f 44 29 0a 20 20 74 69 6d 65 5f 74 20  ETTOD).  time_t 
28840 74 3b 0a 20 20 74 69 6d 65 28 26 74 29 3b 0a 20  t;.  time(&t);. 
28850 20 2a 70 69 4e 6f 77 20 3d 20 28 28 73 71 6c 69   *piNow = ((sqli
28860 74 65 33 5f 69 6e 74 36 34 29 69 29 2a 31 30 30  te3_int64)i)*100
28870 30 20 2b 20 75 6e 69 78 45 70 6f 63 68 3b 0a 23  0 + unixEpoch;.#
28880 65 6c 69 66 20 4f 53 5f 56 58 57 4f 52 4b 53 0a  elif OS_VXWORKS.
28890 20 20 73 74 72 75 63 74 20 74 69 6d 65 73 70 65    struct timespe
288a0 63 20 73 4e 6f 77 3b 0a 20 20 63 6c 6f 63 6b 5f  c sNow;.  clock_
288b0 67 65 74 74 69 6d 65 28 43 4c 4f 43 4b 5f 52 45  gettime(CLOCK_RE
288c0 41 4c 54 49 4d 45 2c 20 26 73 4e 6f 77 29 3b 0a  ALTIME, &sNow);.
288d0 20 20 2a 70 69 4e 6f 77 20 3d 20 75 6e 69 78 45    *piNow = unixE
288e0 70 6f 63 68 20 2b 20 31 30 30 30 2a 28 73 71 6c  poch + 1000*(sql
288f0 69 74 65 33 5f 69 6e 74 36 34 29 73 4e 6f 77 2e  ite3_int64)sNow.
28900 74 76 5f 73 65 63 20 2b 20 73 4e 6f 77 2e 74 76  tv_sec + sNow.tv
28910 5f 6e 73 65 63 2f 31 30 30 30 30 30 30 3b 0a 23  _nsec/1000000;.#
28920 65 6c 73 65 0a 20 20 73 74 72 75 63 74 20 74 69  else.  struct ti
28930 6d 65 76 61 6c 20 73 4e 6f 77 3b 0a 20 20 67 65  meval sNow;.  ge
28940 74 74 69 6d 65 6f 66 64 61 79 28 26 73 4e 6f 77  ttimeofday(&sNow
28950 2c 20 30 29 3b 0a 20 20 2a 70 69 4e 6f 77 20 3d  , 0);.  *piNow =
28960 20 75 6e 69 78 45 70 6f 63 68 20 2b 20 31 30 30   unixEpoch + 100
28970 30 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  0*(sqlite3_int64
28980 29 73 4e 6f 77 2e 74 76 5f 73 65 63 20 2b 20 73  )sNow.tv_sec + s
28990 4e 6f 77 2e 74 76 5f 75 73 65 63 2f 31 30 30 30  Now.tv_usec/1000
289a0 3b 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  ;.#endif..#ifdef
289b0 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69   SQLITE_TEST.  i
289c0 66 28 20 73 71 6c 69 74 65 33 5f 63 75 72 72 65  f( sqlite3_curre
289d0 6e 74 5f 74 69 6d 65 20 29 7b 0a 20 20 20 20 2a  nt_time ){.    *
289e0 70 69 4e 6f 77 20 3d 20 31 30 30 30 2a 28 73 71  piNow = 1000*(sq
289f0 6c 69 74 65 33 5f 69 6e 74 36 34 29 73 71 6c 69  lite3_int64)sqli
28a00 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65  te3_current_time
28a10 20 2b 20 75 6e 69 78 45 70 6f 63 68 3b 0a 20 20   + unixEpoch;.  
28a20 7d 0a 23 65 6e 64 69 66 0a 20 20 55 4e 55 53 45  }.#endif.  UNUSE
28a30 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55  D_PARAMETER(NotU
28a40 73 65 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 30  sed);.  return 0
28a50 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20  ;.}../*.** Find 
28a60 74 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65  the current time
28a70 20 28 69 6e 20 55 6e 69 76 65 72 73 61 6c 20 43   (in Universal C
28a80 6f 6f 72 64 69 6e 61 74 65 64 20 54 69 6d 65 29  oordinated Time)
28a90 2e 20 20 57 72 69 74 65 20 74 68 65 0a 2a 2a 20  .  Write the.** 
28aa0 63 75 72 72 65 6e 74 20 74 69 6d 65 20 61 6e 64  current time and
28ab0 20 64 61 74 65 20 61 73 20 61 20 4a 75 6c 69 61   date as a Julia
28ac0 6e 20 44 61 79 20 6e 75 6d 62 65 72 20 69 6e 74  n Day number int
28ad0 6f 20 2a 70 72 4e 6f 77 20 61 6e 64 0a 2a 2a 20  o *prNow and.** 
28ae0 72 65 74 75 72 6e 20 30 2e 20 20 52 65 74 75 72  return 0.  Retur
28af0 6e 20 31 20 69 66 20 74 68 65 20 74 69 6d 65 20  n 1 if the time 
28b00 61 6e 64 20 64 61 74 65 20 63 61 6e 6e 6f 74 20  and date cannot 
28b10 62 65 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61  be found..*/.sta
28b20 74 69 63 20 69 6e 74 20 75 6e 69 78 43 75 72 72  tic int unixCurr
28b30 65 6e 74 54 69 6d 65 28 73 71 6c 69 74 65 33 5f  entTime(sqlite3_
28b40 76 66 73 20 2a 4e 6f 74 55 73 65 64 2c 20 64 6f  vfs *NotUsed, do
28b50 75 62 6c 65 20 2a 70 72 4e 6f 77 29 7b 0a 20 20  uble *prNow){.  
28b60 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 3b  sqlite3_int64 i;
28b70 0a 20 20 75 6e 69 78 43 75 72 72 65 6e 74 54 69  .  unixCurrentTi
28b80 6d 65 49 6e 74 36 34 28 30 2c 20 26 69 29 3b 0a  meInt64(0, &i);.
28b90 20 20 2a 70 72 4e 6f 77 20 3d 20 69 2f 38 36 34    *prNow = i/864
28ba0 30 30 30 30 30 2e 30 3b 0a 20 20 72 65 74 75 72  00000.0;.  retur
28bb0 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 65  n 0;.}../*.** We
28bc0 20 61 64 64 65 64 20 74 68 65 20 78 47 65 74 4c   added the xGetL
28bd0 61 73 74 45 72 72 6f 72 28 29 20 6d 65 74 68 6f  astError() metho
28be0 64 20 77 69 74 68 20 74 68 65 20 69 6e 74 65 6e  d with the inten
28bf0 74 69 6f 6e 20 6f 66 20 70 72 6f 76 69 64 69 6e  tion of providin
28c00 67 0a 2a 2a 20 62 65 74 74 65 72 20 6c 6f 77 2d  g.** better low-
28c10 6c 65 76 65 6c 20 65 72 72 6f 72 20 6d 65 73 73  level error mess
28c20 61 67 65 73 20 77 68 65 6e 20 6f 70 65 72 61 74  ages when operat
28c30 69 6e 67 2d 73 79 73 74 65 6d 20 70 72 6f 62 6c  ing-system probl
28c40 65 6d 73 20 63 6f 6d 65 20 75 70 0a 2a 2a 20 64  ems come up.** d
28c50 75 72 69 6e 67 20 53 51 4c 69 74 65 20 6f 70 65  uring SQLite ope
28c60 72 61 74 69 6f 6e 2e 20 20 42 75 74 20 73 6f 20  ration.  But so 
28c70 66 61 72 2c 20 6e 6f 6e 65 20 6f 66 20 74 68 61  far, none of tha
28c80 74 20 68 61 73 20 62 65 65 6e 20 69 6d 70 6c 65  t has been imple
28c90 6d 65 6e 74 65 64 0a 2a 2a 20 69 6e 20 74 68 65  mented.** in the
28ca0 20 63 6f 72 65 2e 20 20 53 6f 20 74 68 69 73 20   core.  So this 
28cb0 72 6f 75 74 69 6e 65 20 69 73 20 6e 65 76 65 72  routine is never
28cc0 20 63 61 6c 6c 65 64 2e 20 20 46 6f 72 20 6e 6f   called.  For no
28cd0 77 2c 20 69 74 20 69 73 20 6d 65 72 65 6c 79 0a  w, it is merely.
28ce0 2a 2a 20 61 20 70 6c 61 63 65 2d 68 6f 6c 64 65  ** a place-holde
28cf0 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
28d00 20 75 6e 69 78 47 65 74 4c 61 73 74 45 72 72 6f   unixGetLastErro
28d10 72 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 4e  r(sqlite3_vfs *N
28d20 6f 74 55 73 65 64 2c 20 69 6e 74 20 4e 6f 74 55  otUsed, int NotU
28d30 73 65 64 32 2c 20 63 68 61 72 20 2a 4e 6f 74 55  sed2, char *NotU
28d40 73 65 64 33 29 7b 0a 20 20 55 4e 55 53 45 44 5f  sed3){.  UNUSED_
28d50 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
28d60 64 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  d);.  UNUSED_PAR
28d70 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 32 29  AMETER(NotUsed2)
28d80 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
28d90 45 54 45 52 28 4e 6f 74 55 73 65 64 33 29 3b 0a  ETER(NotUsed3);.
28da0 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a    return 0;.}...
28db0 2f 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /*.*************
28dc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 45 6e 64 20  *********** End 
28dd0 6f 66 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6d  of sqlite3_vfs m
28de0 65 74 68 6f 64 73 20 2a 2a 2a 2a 2a 2a 2a 2a 2a  ethods *********
28df0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28e00 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  **.*************
28e10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28e20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28e30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28e40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28e50 2a 2f 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  */../***********
28e60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28e70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28e80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28e90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28ea0 2a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ***.************
28eb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20 42  ************** B
28ec0 65 67 69 6e 20 50 72 6f 78 79 20 4c 6f 63 6b 69  egin Proxy Locki
28ed0 6e 67 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ng *************
28ee0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
28ef0 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 50 72 6f 78 79 20  ***.**.** Proxy 
28f00 6c 6f 63 6b 69 6e 67 20 69 73 20 61 20 22 75 62  locking is a "ub
28f10 65 72 2d 6c 6f 63 6b 69 6e 67 2d 6d 65 74 68 6f  er-locking-metho
28f20 64 22 20 69 6e 20 74 68 69 73 20 73 65 6e 73 65  d" in this sense
28f30 3a 20 20 49 74 20 75 73 65 73 20 74 68 65 0a 2a  :  It uses the.*
28f40 2a 20 6f 74 68 65 72 20 6c 6f 63 6b 69 6e 67 20  * other locking 
28f50 6d 65 74 68 6f 64 73 20 6f 6e 20 73 65 63 6f 6e  methods on secon
28f60 64 61 72 79 20 6c 6f 63 6b 20 66 69 6c 65 73 2e  dary lock files.
28f70 20 20 50 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20    Proxy locking 
28f80 69 73 20 61 0a 2a 2a 20 6d 65 74 61 2d 6c 61 79  is a.** meta-lay
28f90 65 72 20 6f 76 65 72 20 74 6f 70 20 6f 66 20 74  er over top of t
28fa0 68 65 20 70 72 69 6d 69 74 69 76 65 20 6c 6f 63  he primitive loc
28fb0 6b 69 6e 67 20 69 6d 70 6c 65 6d 65 6e 74 65 64  king implemented
28fc0 20 61 62 6f 76 65 2e 20 20 46 6f 72 0a 2a 2a 20   above.  For.** 
28fd0 74 68 69 73 20 72 65 61 73 6f 6e 2c 20 74 68 65  this reason, the
28fe0 20 64 69 76 69 73 69 6f 6e 20 74 68 61 74 20 69   division that i
28ff0 6d 70 6c 65 6d 65 6e 74 73 20 6f 66 20 70 72 6f  mplements of pro
29000 78 79 20 6c 6f 63 6b 69 6e 67 20 69 73 20 64 65  xy locking is de
29010 66 65 72 72 65 64 0a 2a 2a 20 75 6e 74 69 6c 20  ferred.** until 
29020 6c 61 74 65 20 69 6e 20 74 68 65 20 66 69 6c 65  late in the file
29030 20 28 68 65 72 65 29 20 61 66 74 65 72 20 61 6c   (here) after al
29040 6c 20 6f 66 20 74 68 65 20 6f 74 68 65 72 20 49  l of the other I
29050 2f 4f 20 6d 65 74 68 6f 64 73 20 68 61 76 65 0a  /O methods have.
29060 2a 2a 20 62 65 65 6e 20 64 65 66 69 6e 65 64 20  ** been defined 
29070 2d 20 73 6f 20 74 68 61 74 20 74 68 65 20 70 72  - so that the pr
29080 69 6d 69 74 69 76 65 20 6c 6f 63 6b 69 6e 67 20  imitive locking 
29090 6d 65 74 68 6f 64 73 20 61 72 65 20 61 76 61 69  methods are avai
290a0 6c 61 62 6c 65 0a 2a 2a 20 61 73 20 73 65 72 76  lable.** as serv
290b0 69 63 65 73 20 74 6f 20 68 65 6c 70 20 77 69 74  ices to help wit
290c0 68 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  h the implementa
290d0 74 69 6f 6e 20 6f 66 20 70 72 6f 78 79 20 6c 6f  tion of proxy lo
290e0 63 6b 69 6e 67 2e 0a 2a 2a 0a 2a 2a 2a 2a 0a 2a  cking..**.****.*
290f0 2a 0a 2a 2a 20 54 68 65 20 64 65 66 61 75 6c 74  *.** The default
29100 20 6c 6f 63 6b 69 6e 67 20 73 63 68 65 6d 65 73   locking schemes
29110 20 69 6e 20 53 51 4c 69 74 65 20 75 73 65 20 62   in SQLite use b
29120 79 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 73 20  yte-range locks 
29130 6f 6e 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  on the.** databa
29140 73 65 20 66 69 6c 65 20 74 6f 20 63 6f 6f 72 64  se file to coord
29150 69 6e 61 74 65 20 73 61 66 65 2c 20 63 6f 6e 63  inate safe, conc
29160 75 72 72 65 6e 74 20 61 63 63 65 73 73 20 62 79  urrent access by
29170 20 6d 75 6c 74 69 70 6c 65 20 72 65 61 64 65 72   multiple reader
29180 73 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65 72 73  s.** and writers
29190 20 5b 68 74 74 70 3a 2f 2f 73 71 6c 69 74 65 2e   [http://sqlite.
291a0 6f 72 67 2f 6c 6f 63 6b 69 6e 67 76 33 2e 68 74  org/lockingv3.ht
291b0 6d 6c 5d 2e 20 20 54 68 65 20 66 69 76 65 20 66  ml].  The five f
291c0 69 6c 65 20 6c 6f 63 6b 69 6e 67 0a 2a 2a 20 73  ile locking.** s
291d0 74 61 74 65 73 20 28 55 4e 4c 4f 43 4b 45 44 2c  tates (UNLOCKED,
291e0 20 50 45 4e 44 49 4e 47 2c 20 53 48 41 52 45 44   PENDING, SHARED
291f0 2c 20 52 45 53 45 52 56 45 44 2c 20 45 58 43 4c  , RESERVED, EXCL
29200 55 53 49 56 45 29 20 61 72 65 20 69 6d 70 6c 65  USIVE) are imple
29210 6d 65 6e 74 65 64 0a 2a 2a 20 61 73 20 50 4f 53  mented.** as POS
29220 49 58 20 72 65 61 64 20 26 20 77 72 69 74 65 20  IX read & write 
29230 6c 6f 63 6b 73 20 6f 76 65 72 20 66 69 78 65 64  locks over fixed
29240 20 73 65 74 20 6f 66 20 6c 6f 63 61 74 69 6f 6e   set of location
29250 73 20 28 76 69 61 20 66 73 63 74 6c 29 2c 0a 2a  s (via fsctl),.*
29260 2a 20 6f 6e 20 41 46 50 20 61 6e 64 20 53 4d 42  * on AFP and SMB
29270 20 6f 6e 6c 79 20 65 78 63 6c 75 73 69 76 65 20   only exclusive 
29280 62 79 74 65 2d 72 61 6e 67 65 20 6c 6f 63 6b 73  byte-range locks
29290 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 20 76   are available v
292a0 69 61 20 66 73 63 74 6c 0a 2a 2a 20 77 69 74 68  ia fsctl.** with
292b0 20 5f 49 4f 57 52 28 27 7a 27 2c 20 32 33 2c 20   _IOWR('z', 23, 
292c0 73 74 72 75 63 74 20 42 79 74 65 52 61 6e 67 65  struct ByteRange
292d0 4c 6f 63 6b 50 42 32 29 20 74 6f 20 74 72 61 63  LockPB2) to trac
292e0 6b 20 74 68 65 20 73 61 6d 65 20 35 20 73 74 61  k the same 5 sta
292f0 74 65 73 2e 0a 2a 2a 20 54 6f 20 73 69 6d 75 6c  tes..** To simul
29300 61 74 65 20 61 20 46 5f 52 44 4c 43 4b 20 6f 6e  ate a F_RDLCK on
29310 20 74 68 65 20 73 68 61 72 65 64 20 72 61 6e 67   the shared rang
29320 65 2c 20 6f 6e 20 41 46 50 20 61 20 72 61 6e 64  e, on AFP a rand
29330 6f 6d 6c 79 20 73 65 6c 65 63 74 65 64 0a 2a 2a  omly selected.**
29340 20 61 64 64 72 65 73 73 20 69 6e 20 74 68 65 20   address in the 
29350 73 68 61 72 65 64 20 72 61 6e 67 65 20 69 73 20  shared range is 
29360 74 61 6b 65 6e 20 66 6f 72 20 61 20 53 48 41 52  taken for a SHAR
29370 45 44 20 6c 6f 63 6b 2c 20 74 68 65 20 65 6e 74  ED lock, the ent
29380 69 72 65 0a 2a 2a 20 73 68 61 72 65 64 20 72 61  ire.** shared ra
29390 6e 67 65 20 69 73 20 74 61 6b 65 6e 20 66 6f 72  nge is taken for
293a0 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
293b0 63 6b 29 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  ck):.**.**      
293c0 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 20 20 20  PENDING_BYTE    
293d0 20 20 20 20 30 78 34 30 30 30 30 30 30 30 09 09      0x40000000..
293e0 20 20 20 09 0a 2a 2a 20 20 20 20 20 20 52 45 53     ..**      RES
293f0 45 52 56 45 44 5f 42 59 54 45 20 20 20 20 20 20  ERVED_BYTE      
29400 20 30 78 34 30 30 30 30 30 30 31 0a 2a 2a 20 20   0x40000001.**  
29410 20 20 20 20 53 48 41 52 45 44 5f 52 41 4e 47 45      SHARED_RANGE
29420 20 20 20 20 20 20 20 20 30 78 34 30 30 30 30 30          0x400000
29430 30 32 20 2d 3e 20 30 78 34 30 30 30 30 32 30 30  02 -> 0x40000200
29440 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 6f 72 6b  .**.** This work
29450 73 20 77 65 6c 6c 20 6f 6e 20 74 68 65 20 6c 6f  s well on the lo
29460 63 61 6c 20 66 69 6c 65 20 73 79 73 74 65 6d 2c  cal file system,
29470 20 62 75 74 20 73 68 6f 77 73 20 61 20 6e 65 61   but shows a nea
29480 72 6c 79 20 31 30 30 78 0a 2a 2a 20 73 6c 6f 77  rly 100x.** slow
29490 64 6f 77 6e 20 69 6e 20 72 65 61 64 20 70 65 72  down in read per
294a0 66 6f 72 6d 61 6e 63 65 20 6f 6e 20 41 46 50 20  formance on AFP 
294b0 62 65 63 61 75 73 65 20 74 68 65 20 41 46 50 20  because the AFP 
294c0 63 6c 69 65 6e 74 20 64 69 73 61 62 6c 65 73 0a  client disables.
294d0 2a 2a 20 74 68 65 20 72 65 61 64 20 63 61 63 68  ** the read cach
294e0 65 20 77 68 65 6e 20 62 79 74 65 2d 72 61 6e 67  e when byte-rang
294f0 65 20 6c 6f 63 6b 73 20 61 72 65 20 70 72 65 73  e locks are pres
29500 65 6e 74 2e 20 20 45 6e 61 62 6c 69 6e 67 20 74  ent.  Enabling t
29510 68 65 20 72 65 61 64 0a 2a 2a 20 63 61 63 68 65  he read.** cache
29520 20 65 78 70 6f 73 65 73 20 61 20 63 61 63 68 65   exposes a cache
29530 20 63 6f 68 65 72 65 6e 63 79 20 70 72 6f 62 6c   coherency probl
29540 65 6d 20 74 68 61 74 20 69 73 20 70 72 65 73 65  em that is prese
29550 6e 74 20 6f 6e 20 61 6c 6c 20 4f 53 20 58 0a 2a  nt on all OS X.*
29560 2a 20 73 75 70 70 6f 72 74 65 64 20 6e 65 74 77  * supported netw
29570 6f 72 6b 20 66 69 6c 65 20 73 79 73 74 65 6d 73  ork file systems
29580 2e 20 20 4e 46 53 20 61 6e 64 20 41 46 50 20 62  .  NFS and AFP b
29590 6f 74 68 20 6f 62 73 65 72 76 65 20 74 68 65 0a  oth observe the.
295a0 2a 2a 20 63 6c 6f 73 65 2d 74 6f 2d 6f 70 65 6e  ** close-to-open
295b0 20 73 65 6d 61 6e 74 69 63 73 20 66 6f 72 20 65   semantics for e
295c0 6e 73 75 72 69 6e 67 20 63 61 63 68 65 20 63 6f  nsuring cache co
295d0 68 65 72 65 6e 63 79 0a 2a 2a 20 5b 68 74 74 70  herency.** [http
295e0 3a 2f 2f 6e 66 73 2e 73 6f 75 72 63 65 66 6f 72  ://nfs.sourcefor
295f0 67 65 2e 6e 65 74 2f 23 66 61 71 5f 61 38 5d 2c  ge.net/#faq_a8],
29600 20 77 68 69 63 68 20 64 6f 65 73 20 6e 6f 74 20   which does not 
29610 65 66 66 65 63 74 69 76 65 6c 79 0a 2a 2a 20 61  effectively.** a
29620 64 64 72 65 73 73 20 74 68 65 20 72 65 71 75 69  ddress the requi
29630 72 65 6d 65 6e 74 73 20 66 6f 72 20 63 6f 6e 63  rements for conc
29640 75 72 72 65 6e 74 20 64 61 74 61 62 61 73 65 20  urrent database 
29650 61 63 63 65 73 73 20 62 79 20 6d 75 6c 74 69 70  access by multip
29660 6c 65 0a 2a 2a 20 72 65 61 64 65 72 73 20 61 6e  le.** readers an
29670 64 20 77 72 69 74 65 72 73 0a 2a 2a 20 5b 68 74  d writers.** [ht
29680 74 70 3a 2f 2f 77 77 77 2e 6e 61 62 62 6c 65 2e  tp://www.nabble.
29690 63 6f 6d 2f 53 51 4c 69 74 65 2d 6f 6e 2d 4e 46  com/SQLite-on-NF
296a0 53 2d 63 61 63 68 65 2d 63 6f 68 65 72 65 6e 63  S-cache-coherenc
296b0 79 2d 74 64 31 35 36 35 35 37 30 31 2e 68 74 6d  y-td15655701.htm
296c0 6c 5d 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 61 64 64  l]..**.** To add
296d0 72 65 73 73 20 74 68 65 20 70 65 72 66 6f 72 6d  ress the perform
296e0 61 6e 63 65 20 61 6e 64 20 63 61 63 68 65 20 63  ance and cache c
296f0 6f 68 65 72 65 6e 63 79 20 69 73 73 75 65 73 2c  oherency issues,
29700 20 70 72 6f 78 79 20 66 69 6c 65 20 6c 6f 63 6b   proxy file lock
29710 69 6e 67 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74  ing.** changes t
29720 68 65 20 77 61 79 20 64 61 74 61 62 61 73 65 20  he way database 
29730 61 63 63 65 73 73 20 69 73 20 63 6f 6e 74 72 6f  access is contro
29740 6c 6c 65 64 20 62 79 20 6c 69 6d 69 74 69 6e 67  lled by limiting
29750 20 61 63 63 65 73 73 20 74 6f 20 61 0a 2a 2a 20   access to a.** 
29760 73 69 6e 67 6c 65 20 68 6f 73 74 20 61 74 20 61  single host at a
29770 20 74 69 6d 65 20 61 6e 64 20 6d 6f 76 69 6e 67   time and moving
29780 20 66 69 6c 65 20 6c 6f 63 6b 73 20 6f 66 66 20   file locks off 
29790 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
297a0 66 69 6c 65 0a 2a 2a 20 61 6e 64 20 6f 6e 74 6f  file.** and onto
297b0 20 61 20 70 72 6f 78 79 20 66 69 6c 65 20 6f 6e   a proxy file on
297c0 20 74 68 65 20 6c 6f 63 61 6c 20 66 69 6c 65 20   the local file 
297d0 73 79 73 74 65 6d 2e 20 20 0a 2a 2a 0a 2a 2a 0a  system.  .**.**.
297e0 2a 2a 20 55 73 69 6e 67 20 70 72 6f 78 79 20 6c  ** Using proxy l
297f0 6f 63 6b 73 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d  ocks.** --------
29800 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20  ---------.**.** 
29810 43 20 41 50 49 73 0a 2a 2a 0a 2a 2a 20 20 73 71  C APIs.**.**  sq
29820 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72  lite3_file_contr
29830 6f 6c 28 64 62 2c 20 64 62 6e 61 6d 65 2c 20 53  ol(db, dbname, S
29840 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50 52  QLITE_SET_LOCKPR
29850 4f 58 59 46 49 4c 45 2c 0a 2a 2a 20 20 20 20 20  OXYFILE,.**     
29860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29870 20 20 3c 70 72 6f 78 79 5f 70 61 74 68 3e 20 7c    <proxy_path> |
29880 20 22 3a 61 75 74 6f 3a 22 29 3b 0a 2a 2a 20 20   ":auto:");.**  
29890 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e  sqlite3_file_con
298a0 74 72 6f 6c 28 64 62 2c 20 64 62 6e 61 6d 65 2c  trol(db, dbname,
298b0 20 53 51 4c 49 54 45 5f 47 45 54 5f 4c 4f 43 4b   SQLITE_GET_LOCK
298c0 50 52 4f 58 59 46 49 4c 45 2c 20 26 3c 70 72 6f  PROXYFILE, &<pro
298d0 78 79 5f 70 61 74 68 3e 29 3b 0a 2a 2a 0a 2a 2a  xy_path>);.**.**
298e0 0a 2a 2a 20 53 51 4c 20 70 72 61 67 6d 61 73 0a  .** SQL pragmas.
298f0 2a 2a 0a 2a 2a 20 20 50 52 41 47 4d 41 20 5b 64  **.**  PRAGMA [d
29900 61 74 61 62 61 73 65 2e 5d 6c 6f 63 6b 5f 70 72  atabase.]lock_pr
29910 6f 78 79 5f 66 69 6c 65 3d 3c 70 72 6f 78 79 5f  oxy_file=<proxy_
29920 70 61 74 68 3e 20 7c 20 3a 61 75 74 6f 3a 0a 2a  path> | :auto:.*
29930 2a 20 20 50 52 41 47 4d 41 20 5b 64 61 74 61 62  *  PRAGMA [datab
29940 61 73 65 2e 5d 6c 6f 63 6b 5f 70 72 6f 78 79 5f  ase.]lock_proxy_
29950 66 69 6c 65 0a 2a 2a 0a 2a 2a 20 53 70 65 63 69  file.**.** Speci
29960 66 79 69 6e 67 20 22 3a 61 75 74 6f 3a 22 20 6d  fying ":auto:" m
29970 65 61 6e 73 20 74 68 61 74 20 69 66 20 74 68 65  eans that if the
29980 72 65 20 69 73 20 61 20 63 6f 6e 63 68 20 66 69  re is a conch fi
29990 6c 65 20 77 69 74 68 20 61 20 6d 61 74 63 68 69  le with a matchi
299a0 6e 67 0a 2a 2a 20 68 6f 73 74 20 49 44 20 69 6e  ng.** host ID in
299b0 20 69 74 2c 20 74 68 65 20 70 72 6f 78 79 20 70   it, the proxy p
299c0 61 74 68 20 69 6e 20 74 68 65 20 63 6f 6e 63 68  ath in the conch
299d0 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 75 73   file will be us
299e0 65 64 2c 20 6f 74 68 65 72 77 69 73 65 0a 2a 2a  ed, otherwise.**
299f0 20 61 20 70 72 6f 78 79 20 70 61 74 68 20 62 61   a proxy path ba
29a00 73 65 64 20 6f 6e 20 74 68 65 20 75 73 65 72 27  sed on the user'
29a10 73 20 74 65 6d 70 20 64 69 72 0a 2a 2a 20 28 76  s temp dir.** (v
29a20 69 61 20 63 6f 6e 66 73 74 72 28 5f 43 53 5f 44  ia confstr(_CS_D
29a30 41 52 57 49 4e 5f 55 53 45 52 5f 54 45 4d 50 5f  ARWIN_USER_TEMP_
29a40 44 49 52 2c 2e 2e 2e 29 29 20 77 69 6c 6c 20 62  DIR,...)) will b
29a50 65 20 75 73 65 64 20 61 6e 64 20 74 68 65 0a 2a  e used and the.*
29a60 2a 20 61 63 74 75 61 6c 20 70 72 6f 78 79 20 66  * actual proxy f
29a70 69 6c 65 20 6e 61 6d 65 20 69 73 20 67 65 6e 65  ile name is gene
29a80 72 61 74 65 64 20 66 72 6f 6d 20 74 68 65 20 6e  rated from the n
29a90 61 6d 65 20 61 6e 64 20 70 61 74 68 20 6f 66 20  ame and path of 
29aa0 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
29ab0 66 69 6c 65 2e 20 20 46 6f 72 20 65 78 61 6d 70  file.  For examp
29ac0 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  le:.**.**       
29ad0 46 6f 72 20 64 61 74 61 62 61 73 65 20 70 61 74  For database pat
29ae0 68 20 22 2f 55 73 65 72 73 2f 6d 65 2f 66 6f 6f  h "/Users/me/foo
29af0 2e 64 62 22 20 0a 2a 2a 20 20 20 20 20 20 20 54  .db" .**       T
29b00 68 65 20 6c 6f 63 6b 20 70 61 74 68 20 77 69 6c  he lock path wil
29b10 6c 20 62 65 20 22 3c 74 6d 70 64 69 72 3e 2f 73  l be "<tmpdir>/s
29b20 71 6c 69 74 65 70 6c 6f 63 6b 73 2f 5f 55 73 65  qliteplocks/_Use
29b30 72 73 5f 6d 65 5f 66 6f 6f 2e 64 62 3a 61 75 74  rs_me_foo.db:aut
29b40 6f 3a 22 29 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20  o:").**.** Once 
29b50 61 20 6c 6f 63 6b 20 70 72 6f 78 79 20 69 73 20  a lock proxy is 
29b60 63 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20 61  configured for a
29b70 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
29b80 74 69 6f 6e 2c 20 69 74 20 63 61 6e 20 6e 6f 74  tion, it can not
29b90 0a 2a 2a 20 62 65 20 72 65 6d 6f 76 65 64 2c 20  .** be removed, 
29ba0 68 6f 77 65 76 65 72 20 69 74 20 6d 61 79 20 62  however it may b
29bb0 65 20 73 77 69 74 63 68 65 64 20 74 6f 20 61 20  e switched to a 
29bc0 64 69 66 66 65 72 65 6e 74 20 70 72 6f 78 79 20  different proxy 
29bd0 70 61 74 68 20 76 69 61 0a 2a 2a 20 74 68 65 20  path via.** the 
29be0 61 62 6f 76 65 20 41 50 49 73 20 28 61 73 73 75  above APIs (assu
29bf0 6d 69 6e 67 20 74 68 65 20 63 6f 6e 63 68 20 66  ming the conch f
29c00 69 6c 65 20 69 73 20 6e 6f 74 20 62 65 69 6e 67  ile is not being
29c10 20 68 65 6c 64 20 62 79 20 61 6e 6f 74 68 65 72   held by another
29c20 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f  .** connection o
29c30 72 20 70 72 6f 63 65 73 73 29 2e 20 0a 2a 2a 0a  r process). .**.
29c40 2a 2a 0a 2a 2a 20 48 6f 77 20 70 72 6f 78 79 20  **.** How proxy 
29c50 6c 6f 63 6b 69 6e 67 20 77 6f 72 6b 73 0a 2a 2a  locking works.**
29c60 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
29c70 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 50  --------.**.** P
29c80 72 6f 78 79 20 66 69 6c 65 20 6c 6f 63 6b 69 6e  roxy file lockin
29c90 67 20 72 65 6c 69 65 73 20 70 72 69 6d 61 72 69  g relies primari
29ca0 6c 79 20 6f 6e 20 74 77 6f 20 6e 65 77 20 73 75  ly on two new su
29cb0 70 70 6f 72 74 69 6e 67 20 66 69 6c 65 73 3a 20  pporting files: 
29cc0 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 63 6f 6e 63  .**.**   *  conc
29cd0 68 20 66 69 6c 65 20 74 6f 20 6c 69 6d 69 74 20  h file to limit 
29ce0 61 63 63 65 73 73 20 74 6f 20 74 68 65 20 64 61  access to the da
29cf0 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 61  tabase file to a
29d00 20 73 69 6e 67 6c 65 20 68 6f 73 74 0a 2a 2a 20   single host.** 
29d10 20 20 20 20 20 61 74 20 61 20 74 69 6d 65 0a 2a       at a time.*
29d20 2a 0a 2a 2a 20 20 20 2a 20 20 70 72 6f 78 79 20  *.**   *  proxy 
29d30 66 69 6c 65 20 74 6f 20 61 63 74 20 61 73 20 61  file to act as a
29d40 20 70 72 6f 78 79 20 66 6f 72 20 74 68 65 20 61   proxy for the a
29d50 64 76 69 73 6f 72 79 20 6c 6f 63 6b 73 20 6e 6f  dvisory locks no
29d60 72 6d 61 6c 6c 79 0a 2a 2a 20 20 20 20 20 20 74  rmally.**      t
29d70 61 6b 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61  aken on the data
29d80 62 61 73 65 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  base.**.** The c
29d90 6f 6e 63 68 20 66 69 6c 65 20 2d 20 74 6f 20 75  onch file - to u
29da0 73 65 20 61 20 70 72 6f 78 79 20 66 69 6c 65 2c  se a proxy file,
29db0 20 73 71 6c 69 74 65 20 6d 75 73 74 20 66 69 72   sqlite must fir
29dc0 73 74 20 22 68 6f 6c 64 20 74 68 65 20 63 6f 6e  st "hold the con
29dd0 63 68 22 0a 2a 2a 20 62 79 20 74 61 6b 69 6e 67  ch".** by taking
29de0 20 61 6e 20 73 71 6c 69 74 65 2d 73 74 79 6c 65   an sqlite-style
29df0 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20   shared lock on 
29e00 74 68 65 20 63 6f 6e 63 68 20 66 69 6c 65 2c 20  the conch file, 
29e10 72 65 61 64 69 6e 67 20 74 68 65 0a 2a 2a 20 63  reading the.** c
29e20 6f 6e 74 65 6e 74 73 20 61 6e 64 20 63 6f 6d 70  ontents and comp
29e30 61 72 69 6e 67 20 74 68 65 20 68 6f 73 74 27 73  aring the host's
29e40 20 75 6e 69 71 75 65 20 68 6f 73 74 20 49 44 20   unique host ID 
29e50 28 73 65 65 20 62 65 6c 6f 77 29 20 61 6e 64 20  (see below) and 
29e60 6c 6f 63 6b 0a 2a 2a 20 70 72 6f 78 79 20 70 61  lock.** proxy pa
29e70 74 68 20 61 67 61 69 6e 73 74 20 74 68 65 20 76  th against the v
29e80 61 6c 75 65 73 20 73 74 6f 72 65 64 20 69 6e 20  alues stored in 
29e90 74 68 65 20 63 6f 6e 63 68 2e 20 20 54 68 65 20  the conch.  The 
29ea0 63 6f 6e 63 68 20 66 69 6c 65 20 69 73 0a 2a 2a  conch file is.**
29eb0 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 73   stored in the s
29ec0 61 6d 65 20 64 69 72 65 63 74 6f 72 79 20 61 73  ame directory as
29ed0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
29ee0 6c 65 20 61 6e 64 20 74 68 65 20 66 69 6c 65 20  le and the file 
29ef0 6e 61 6d 65 0a 2a 2a 20 69 73 20 70 61 74 74 65  name.** is patte
29f00 72 6e 65 64 20 61 66 74 65 72 20 74 68 65 20 64  rned after the d
29f10 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d  atabase file nam
29f20 65 20 61 73 20 22 2e 3c 64 61 74 61 62 61 73 65  e as ".<database
29f30 6e 61 6d 65 3e 2d 63 6f 6e 63 68 22 2e 0a 2a 2a  name>-conch"..**
29f40 20 49 66 20 74 68 65 20 63 6f 6e 63 68 20 66 69   If the conch fi
29f50 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  le does not exis
29f60 74 2c 20 6f 72 20 69 74 27 73 20 63 6f 6e 74 65  t, or it's conte
29f70 6e 74 73 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68  nts do not match
29f80 20 74 68 65 0a 2a 2a 20 68 6f 73 74 20 49 44 20   the.** host ID 
29f90 61 6e 64 2f 6f 72 20 70 72 6f 78 79 20 70 61 74  and/or proxy pat
29fa0 68 2c 20 74 68 65 6e 20 74 68 65 20 6c 6f 63 6b  h, then the lock
29fb0 20 69 73 20 65 73 63 61 6c 61 74 65 64 20 74 6f   is escalated to
29fc0 20 61 6e 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a   an exclusive.**
29fd0 20 6c 6f 63 6b 20 61 6e 64 20 74 68 65 20 63 6f   lock and the co
29fe0 6e 63 68 20 66 69 6c 65 20 63 6f 6e 74 65 6e 74  nch file content
29ff0 73 20 69 73 20 75 70 64 61 74 65 64 20 77 69 74  s is updated wit
2a000 68 20 74 68 65 20 68 6f 73 74 20 49 44 20 61 6e  h the host ID an
2a010 64 20 70 72 6f 78 79 0a 2a 2a 20 70 61 74 68 20  d proxy.** path 
2a020 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 69 73 20  and the lock is 
2a030 64 6f 77 6e 67 72 61 64 65 64 20 74 6f 20 61 20  downgraded to a 
2a040 73 68 61 72 65 64 20 6c 6f 63 6b 20 61 67 61 69  shared lock agai
2a050 6e 2e 20 20 49 66 20 74 68 65 20 63 6f 6e 63 68  n.  If the conch
2a060 0a 2a 2a 20 69 73 20 68 65 6c 64 20 62 79 20 61  .** is held by a
2a070 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 28  nother process (
2a080 77 69 74 68 20 61 20 73 68 61 72 65 64 20 6c 6f  with a shared lo
2a090 63 6b 29 2c 20 74 68 65 20 65 78 63 6c 75 73 69  ck), the exclusi
2a0a0 76 65 20 6c 6f 63 6b 0a 2a 2a 20 77 69 6c 6c 20  ve lock.** will 
2a0b0 66 61 69 6c 20 61 6e 64 20 53 51 4c 49 54 45 5f  fail and SQLITE_
2a0c0 42 55 53 59 20 69 73 20 72 65 74 75 72 6e 65 64  BUSY is returned
2a0d0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 78  ..**.** The prox
2a0e0 79 20 66 69 6c 65 20 2d 20 61 20 73 69 6e 67 6c  y file - a singl
2a0f0 65 2d 62 79 74 65 20 66 69 6c 65 20 75 73 65 64  e-byte file used
2a100 20 66 6f 72 20 61 6c 6c 20 61 64 76 69 73 6f 72   for all advisor
2a110 79 20 66 69 6c 65 20 6c 6f 63 6b 73 0a 2a 2a 20  y file locks.** 
2a120 6e 6f 72 6d 61 6c 6c 79 20 74 61 6b 65 6e 20 6f  normally taken o
2a130 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2a140 69 6c 65 2e 20 20 20 54 68 69 73 20 61 6c 6c 6f  ile.   This allo
2a150 77 73 20 66 6f 72 20 73 61 66 65 20 73 68 61 72  ws for safe shar
2a160 69 6e 67 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61  ing.** of the da
2a170 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20  tabase file for 
2a180 6d 75 6c 74 69 70 6c 65 20 72 65 61 64 65 72 73  multiple readers
2a190 20 61 6e 64 20 77 72 69 74 65 72 73 20 6f 6e 20   and writers on 
2a1a0 74 68 65 20 73 61 6d 65 0a 2a 2a 20 68 6f 73 74  the same.** host
2a1b0 20 28 74 68 65 20 63 6f 6e 63 68 20 65 6e 73 75   (the conch ensu
2a1c0 72 65 73 20 74 68 61 74 20 74 68 65 79 20 61 6c  res that they al
2a1d0 6c 20 75 73 65 20 74 68 65 20 73 61 6d 65 20 6c  l use the same l
2a1e0 6f 63 61 6c 20 6c 6f 63 6b 20 66 69 6c 65 29 2e  ocal lock file).
2a1f0 0a 2a 2a 0a 2a 2a 20 52 65 71 75 65 73 74 69 6e  .**.** Requestin
2a200 67 20 74 68 65 20 6c 6f 63 6b 20 70 72 6f 78 79  g the lock proxy
2a210 20 64 6f 65 73 20 6e 6f 74 20 69 6d 6d 65 64 69   does not immedi
2a220 61 74 65 6c 79 20 74 61 6b 65 20 74 68 65 20 63  ately take the c
2a230 6f 6e 63 68 2c 20 69 74 20 69 73 0a 2a 2a 20 6f  onch, it is.** o
2a240 6e 6c 79 20 74 61 6b 65 6e 20 77 68 65 6e 20 74  nly taken when t
2a250 68 65 20 66 69 72 73 74 20 72 65 71 75 65 73 74  he first request
2a260 20 74 6f 20 6c 6f 63 6b 20 64 61 74 61 62 61 73   to lock databas
2a270 65 20 66 69 6c 65 20 69 73 20 6d 61 64 65 2e 20  e file is made. 
2a280 20 0a 2a 2a 20 54 68 69 73 20 6d 61 74 63 68 65   .** This matche
2a290 73 20 74 68 65 20 73 65 6d 61 6e 74 69 63 73 20  s the semantics 
2a2a0 6f 66 20 74 68 65 20 74 72 61 64 69 74 69 6f 6e  of the tradition
2a2b0 61 6c 20 6c 6f 63 6b 69 6e 67 20 62 65 68 61 76  al locking behav
2a2c0 69 6f 72 2c 20 77 68 65 72 65 0a 2a 2a 20 6f 70  ior, where.** op
2a2d0 65 6e 69 6e 67 20 61 20 63 6f 6e 6e 65 63 74 69  ening a connecti
2a2e0 6f 6e 20 74 6f 20 61 20 64 61 74 61 62 61 73 65  on to a database
2a2f0 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 74   file does not t
2a300 61 6b 65 20 61 20 6c 6f 63 6b 20 6f 6e 20 69 74  ake a lock on it
2a310 2e 0a 2a 2a 20 54 68 65 20 73 68 61 72 65 64 20  ..** The shared 
2a320 6c 6f 63 6b 20 61 6e 64 20 61 6e 20 6f 70 65 6e  lock and an open
2a330 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
2a340 20 61 72 65 20 6d 61 69 6e 74 61 69 6e 65 64 20   are maintained 
2a350 75 6e 74 69 6c 20 0a 2a 2a 20 74 68 65 20 63 6f  until .** the co
2a360 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 74 68 65 20  nnection to the 
2a370 64 61 74 61 62 61 73 65 20 69 73 20 63 6c 6f 73  database is clos
2a380 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  ed. .**.** The p
2a390 72 6f 78 79 20 66 69 6c 65 20 61 6e 64 20 74 68  roxy file and th
2a3a0 65 20 6c 6f 63 6b 20 66 69 6c 65 20 61 72 65 20  e lock file are 
2a3b0 6e 65 76 65 72 20 64 65 6c 65 74 65 64 20 73 6f  never deleted so
2a3c0 20 74 68 65 79 20 6f 6e 6c 79 20 6e 65 65 64 0a   they only need.
2a3d0 2a 2a 20 74 6f 20 62 65 20 63 72 65 61 74 65 64  ** to be created
2a3e0 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   the first time 
2a3f0 74 68 65 79 20 61 72 65 20 75 73 65 64 2e 0a 2a  they are used..*
2a400 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 61 74 69  *.** Configurati
2a410 6f 6e 20 6f 70 74 69 6f 6e 73 0a 2a 2a 20 2d 2d  on options.** --
2a420 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2a430 2d 2d 2d 0a 2a 2a 0a 2a 2a 20 20 53 51 4c 49 54  ---.**.**  SQLIT
2a440 45 5f 50 52 45 46 45 52 5f 50 52 4f 58 59 5f 4c  E_PREFER_PROXY_L
2a450 4f 43 4b 49 4e 47 0a 2a 2a 0a 2a 2a 20 20 20 20  OCKING.**.**    
2a460 20 20 20 44 61 74 61 62 61 73 65 20 66 69 6c 65     Database file
2a470 73 20 61 63 63 65 73 73 65 64 20 6f 6e 20 6e 6f  s accessed on no
2a480 6e 2d 6c 6f 63 61 6c 20 66 69 6c 65 20 73 79 73  n-local file sys
2a490 74 65 6d 73 20 61 72 65 0a 2a 2a 20 20 20 20 20  tems are.**     
2a4a0 20 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20    automatically 
2a4b0 63 6f 6e 66 69 67 75 72 65 64 20 66 6f 72 20 70  configured for p
2a4c0 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 2c 20 6c 6f  roxy locking, lo
2a4d0 63 6b 20 66 69 6c 65 73 20 61 72 65 0a 2a 2a 20  ck files are.** 
2a4e0 20 20 20 20 20 20 6e 61 6d 65 64 20 61 75 74 6f        named auto
2a4f0 6d 61 74 69 63 61 6c 6c 79 20 75 73 69 6e 67 20  matically using 
2a500 74 68 65 20 73 61 6d 65 20 6c 6f 67 69 63 20 61  the same logic a
2a510 73 0a 2a 2a 20 20 20 20 20 20 20 50 52 41 47 4d  s.**       PRAGM
2a520 41 20 6c 6f 63 6b 5f 70 72 6f 78 79 5f 66 69 6c  A lock_proxy_fil
2a530 65 3d 22 3a 61 75 74 6f 3a 22 0a 2a 2a 20 20 20  e=":auto:".**   
2a540 20 0a 2a 2a 20 20 53 51 4c 49 54 45 5f 50 52 4f   .**  SQLITE_PRO
2a550 58 59 5f 44 45 42 55 47 0a 2a 2a 0a 2a 2a 20 20  XY_DEBUG.**.**  
2a560 20 20 20 20 20 45 6e 61 62 6c 65 73 20 74 68 65       Enables the
2a570 20 6c 6f 67 67 69 6e 67 20 6f 66 20 65 72 72 6f   logging of erro
2a580 72 20 6d 65 73 73 61 67 65 73 20 64 75 72 69 6e  r messages durin
2a590 67 20 68 6f 73 74 20 69 64 20 66 69 6c 65 0a 2a  g host id file.*
2a5a0 2a 20 20 20 20 20 20 20 72 65 74 72 69 65 76 61  *       retrieva
2a5b0 6c 20 61 6e 64 20 63 72 65 61 74 69 6f 6e 0a 2a  l and creation.*
2a5c0 2a 0a 2a 2a 20 20 4c 4f 43 4b 50 52 4f 58 59 44  *.**  LOCKPROXYD
2a5d0 49 52 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 4f  IR.**.**       O
2a5e0 76 65 72 72 69 64 65 73 20 74 68 65 20 64 65 66  verrides the def
2a5f0 61 75 6c 74 20 64 69 72 65 63 74 6f 72 79 20 75  ault directory u
2a600 73 65 64 20 66 6f 72 20 6c 6f 63 6b 20 70 72 6f  sed for lock pro
2a610 78 79 20 66 69 6c 65 73 20 74 68 61 74 0a 2a 2a  xy files that.**
2a620 20 20 20 20 20 20 20 61 72 65 20 6e 61 6d 65 64         are named
2a630 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 76   automatically v
2a640 69 61 20 74 68 65 20 22 3a 61 75 74 6f 3a 22 20  ia the ":auto:" 
2a650 73 65 74 74 69 6e 67 0a 2a 2a 0a 2a 2a 20 20 53  setting.**.**  S
2a660 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 52  QLITE_DEFAULT_PR
2a670 4f 58 59 44 49 52 5f 50 45 52 4d 49 53 53 49 4f  OXYDIR_PERMISSIO
2a680 4e 53 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 50  NS.**.**       P
2a690 65 72 6d 69 73 73 69 6f 6e 73 20 74 6f 20 75 73  ermissions to us
2a6a0 65 20 77 68 65 6e 20 63 72 65 61 74 69 6e 67 20  e when creating 
2a6b0 61 20 64 69 72 65 63 74 6f 72 79 20 66 6f 72 20  a directory for 
2a6c0 73 74 6f 72 69 6e 67 20 74 68 65 0a 2a 2a 20 20  storing the.**  
2a6d0 20 20 20 20 20 6c 6f 63 6b 20 70 72 6f 78 79 20       lock proxy 
2a6e0 66 69 6c 65 73 2c 20 6f 6e 6c 79 20 75 73 65 64  files, only used
2a6f0 20 77 68 65 6e 20 4c 4f 43 4b 50 52 4f 58 59 44   when LOCKPROXYD
2a700 49 52 20 69 73 20 6e 6f 74 20 73 65 74 2e 0a 2a  IR is not set..*
2a710 2a 20 20 20 20 0a 2a 2a 20 20 20 20 0a 2a 2a 20  *    .**    .** 
2a720 41 73 20 6d 65 6e 74 69 6f 6e 65 64 20 61 62 6f  As mentioned abo
2a730 76 65 2c 20 77 68 65 6e 20 63 6f 6d 70 69 6c 65  ve, when compile
2a740 64 20 77 69 74 68 20 53 51 4c 49 54 45 5f 50 52  d with SQLITE_PR
2a750 45 46 45 52 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49  EFER_PROXY_LOCKI
2a760 4e 47 2c 0a 2a 2a 20 73 65 74 74 69 6e 67 20 74  NG,.** setting t
2a770 68 65 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20 76  he environment v
2a780 61 72 69 61 62 6c 65 20 53 51 4c 49 54 45 5f 46  ariable SQLITE_F
2a790 4f 52 43 45 5f 50 52 4f 58 59 5f 4c 4f 43 4b 49  ORCE_PROXY_LOCKI
2a7a0 4e 47 20 74 6f 20 31 20 77 69 6c 6c 0a 2a 2a 20  NG to 1 will.** 
2a7b0 66 6f 72 63 65 20 70 72 6f 78 79 20 6c 6f 63 6b  force proxy lock
2a7c0 69 6e 67 20 74 6f 20 62 65 20 75 73 65 64 20 66  ing to be used f
2a7d0 6f 72 20 65 76 65 72 79 20 64 61 74 61 62 61 73  or every databas
2a7e0 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 2c 20 61  e file opened, a
2a7f0 6e 64 20 30 0a 2a 2a 20 77 69 6c 6c 20 66 6f 72  nd 0.** will for
2a800 63 65 20 61 75 74 6f 6d 61 74 69 63 20 70 72 6f  ce automatic pro
2a810 78 79 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 62 65  xy locking to be
2a820 20 64 69 73 61 62 6c 65 64 20 66 6f 72 20 61 6c   disabled for al
2a830 6c 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69  l database.** fi
2a840 6c 65 73 20 28 65 78 70 6c 69 63 69 74 79 20 63  les (explicity c
2a850 61 6c 6c 69 6e 67 20 74 68 65 20 53 51 4c 49 54  alling the SQLIT
2a860 45 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46  E_SET_LOCKPROXYF
2a870 49 4c 45 20 70 72 61 67 6d 61 20 6f 72 0a 2a 2a  ILE pragma or.**
2a880 20 73 71 6c 69 74 65 5f 66 69 6c 65 5f 63 6f 6e   sqlite_file_con
2a890 74 72 6f 6c 20 41 50 49 20 69 73 20 6e 6f 74 20  trol API is not 
2a8a0 61 66 66 65 63 74 65 64 20 62 79 20 53 51 4c 49  affected by SQLI
2a8b0 54 45 5f 46 4f 52 43 45 5f 50 52 4f 58 59 5f 4c  TE_FORCE_PROXY_L
2a8c0 4f 43 4b 49 4e 47 29 2e 0a 2a 2f 0a 0a 2f 2a 0a  OCKING)..*/../*.
2a8d0 2a 2a 20 50 72 6f 78 79 20 6c 6f 63 6b 69 6e 67  ** Proxy locking
2a8e0 20 69 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62   is only availab
2a8f0 6c 65 20 6f 6e 20 4d 61 63 4f 53 58 20 0a 2a 2f  le on MacOSX .*/
2a900 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41  .#if defined(__A
2a910 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54  PPLE__) && SQLIT
2a920 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
2a930 5f 53 54 59 4c 45 0a 0a 2f 2a 0a 2a 2a 20 54 68  _STYLE../*.** Th
2a940 65 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f  e proxyLockingCo
2a950 6e 74 65 78 74 20 68 61 73 20 74 68 65 20 70 61  ntext has the pa
2a960 74 68 20 61 6e 64 20 66 69 6c 65 20 73 74 72 75  th and file stru
2a970 63 74 75 72 65 73 20 66 6f 72 20 74 68 65 20 72  ctures for the r
2a980 65 6d 6f 74 65 20 0a 2a 2a 20 61 6e 64 20 6c 6f  emote .** and lo
2a990 63 61 6c 20 70 72 6f 78 79 20 66 69 6c 65 73 20  cal proxy files 
2a9a0 69 6e 20 69 74 0a 2a 2f 0a 74 79 70 65 64 65 66  in it.*/.typedef
2a9b0 20 73 74 72 75 63 74 20 70 72 6f 78 79 4c 6f 63   struct proxyLoc
2a9c0 6b 69 6e 67 43 6f 6e 74 65 78 74 20 70 72 6f 78  kingContext prox
2a9d0 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  yLockingContext;
2a9e0 0a 73 74 72 75 63 74 20 70 72 6f 78 79 4c 6f 63  .struct proxyLoc
2a9f0 6b 69 6e 67 43 6f 6e 74 65 78 74 20 7b 0a 20 20  kingContext {.  
2aa00 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46  unixFile *conchF
2aa10 69 6c 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ile;         /* 
2aa20 4f 70 65 6e 20 63 6f 6e 63 68 20 66 69 6c 65 20  Open conch file 
2aa30 2a 2f 0a 20 20 63 68 61 72 20 2a 63 6f 6e 63 68  */.  char *conch
2aa40 46 69 6c 65 50 61 74 68 3b 20 20 20 20 20 20 20  FilePath;       
2aa50 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
2aa60 20 63 6f 6e 63 68 20 66 69 6c 65 20 2a 2f 0a 20   conch file */. 
2aa70 20 75 6e 69 78 46 69 6c 65 20 2a 6c 6f 63 6b 50   unixFile *lockP
2aa80 72 6f 78 79 3b 20 20 20 20 20 20 20 20 20 2f 2a  roxy;         /*
2aa90 20 4f 70 65 6e 20 70 72 6f 78 79 20 6c 6f 63 6b   Open proxy lock
2aaa0 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20   file */.  char 
2aab0 2a 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 3b 20  *lockProxyPath; 
2aac0 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
2aad0 6f 66 20 74 68 65 20 70 72 6f 78 79 20 6c 6f 63  of the proxy loc
2aae0 6b 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72  k file */.  char
2aaf0 20 2a 64 62 50 61 74 68 3b 20 20 20 20 20 20 20   *dbPath;       
2ab00 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
2ab10 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 66 69 6c   of the open fil
2ab20 65 20 2a 2f 0a 20 20 69 6e 74 20 63 6f 6e 63 68  e */.  int conch
2ab30 48 65 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20  Held;           
2ab40 20 20 20 20 2f 2a 20 31 20 69 66 20 74 68 65 20      /* 1 if the 
2ab50 63 6f 6e 63 68 20 69 73 20 68 65 6c 64 2c 20 2d  conch is held, -
2ab60 31 20 69 66 20 6c 6f 63 6b 6c 65 73 73 20 2a 2f  1 if lockless */
2ab70 0a 20 20 76 6f 69 64 20 2a 6f 6c 64 4c 6f 63 6b  .  void *oldLock
2ab80 69 6e 67 43 6f 6e 74 65 78 74 3b 20 20 20 20 20  ingContext;     
2ab90 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 6c 6f 63 6b  /* Original lock
2aba0 69 6e 67 63 6f 6e 74 65 78 74 20 74 6f 20 72 65  ingcontext to re
2abb0 73 74 6f 72 65 20 6f 6e 20 63 6c 6f 73 65 20 2a  store on close *
2abc0 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  /.  sqlite3_io_m
2abd0 65 74 68 6f 64 73 20 63 6f 6e 73 74 20 2a 70 4f  ethods const *pO
2abe0 6c 64 4d 65 74 68 6f 64 3b 20 20 20 20 20 2f 2a  ldMethod;     /*
2abf0 20 4f 72 69 67 69 6e 61 6c 20 49 2f 4f 20 6d 65   Original I/O me
2ac00 74 68 6f 64 73 20 66 6f 72 20 63 6c 6f 73 65 20  thods for close 
2ac10 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 0a 2a 2a 20 54 68  */.};../* .** Th
2ac20 65 20 70 72 6f 78 79 20 6c 6f 63 6b 20 66 69 6c  e proxy lock fil
2ac30 65 20 70 61 74 68 20 66 6f 72 20 74 68 65 20 64  e path for the d
2ac40 61 74 61 62 61 73 65 20 61 74 20 64 62 50 61 74  atabase at dbPat
2ac50 68 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74  h is written int
2ac60 6f 20 6c 50 61 74 68 2c 20 0a 2a 2a 20 77 68 69  o lPath, .** whi
2ac70 63 68 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f  ch must point to
2ac80 20 76 61 6c 69 64 2c 20 77 72 69 74 61 62 6c 65   valid, writable
2ac90 20 6d 65 6d 6f 72 79 20 6c 61 72 67 65 20 65 6e   memory large en
2aca0 6f 75 67 68 20 66 6f 72 20 61 20 6d 61 78 4c 65  ough for a maxLe
2acb0 6e 20 6c 65 6e 67 74 68 0a 2a 2a 20 66 69 6c 65  n length.** file
2acc0 20 70 61 74 68 2e 20 0a 2a 2f 0a 73 74 61 74 69   path. .*/.stati
2acd0 63 20 69 6e 74 20 70 72 6f 78 79 47 65 74 4c 6f  c int proxyGetLo
2ace0 63 6b 50 61 74 68 28 63 6f 6e 73 74 20 63 68 61  ckPath(const cha
2acf0 72 20 2a 64 62 50 61 74 68 2c 20 63 68 61 72 20  r *dbPath, char 
2ad00 2a 6c 50 61 74 68 2c 20 73 69 7a 65 5f 74 20 6d  *lPath, size_t m
2ad10 61 78 4c 65 6e 29 7b 0a 20 20 69 6e 74 20 6c 65  axLen){.  int le
2ad20 6e 3b 0a 20 20 69 6e 74 20 64 62 4c 65 6e 3b 0a  n;.  int dbLen;.
2ad30 20 20 69 6e 74 20 69 3b 0a 0a 23 69 66 64 65 66    int i;..#ifdef
2ad40 20 4c 4f 43 4b 50 52 4f 58 59 44 49 52 0a 20 20   LOCKPROXYDIR.  
2ad50 6c 65 6e 20 3d 20 73 74 72 6c 63 70 79 28 6c 50  len = strlcpy(lP
2ad60 61 74 68 2c 20 4c 4f 43 4b 50 52 4f 58 59 44 49  ath, LOCKPROXYDI
2ad70 52 2c 20 6d 61 78 4c 65 6e 29 3b 0a 23 65 6c 73  R, maxLen);.#els
2ad80 65 0a 23 20 69 66 64 65 66 20 5f 43 53 5f 44 41  e.# ifdef _CS_DA
2ad90 52 57 49 4e 5f 55 53 45 52 5f 54 45 4d 50 5f 44  RWIN_USER_TEMP_D
2ada0 49 52 0a 20 20 7b 0a 20 20 20 20 69 66 28 20 21  IR.  {.    if( !
2adb0 63 6f 6e 66 73 74 72 28 5f 43 53 5f 44 41 52 57  confstr(_CS_DARW
2adc0 49 4e 5f 55 53 45 52 5f 54 45 4d 50 5f 44 49 52  IN_USER_TEMP_DIR
2add0 2c 20 6c 50 61 74 68 2c 20 6d 61 78 4c 65 6e 29  , lPath, maxLen)
2ade0 20 29 7b 0a 20 20 20 20 20 20 4f 53 54 52 41 43   ){.      OSTRAC
2adf0 45 28 28 22 47 45 54 4c 4f 43 4b 50 41 54 48 20  E(("GETLOCKPATH 
2ae00 20 66 61 69 6c 65 64 20 25 73 20 65 72 72 6e 6f   failed %s errno
2ae10 3d 25 64 20 70 69 64 3d 25 64 5c 6e 22 2c 0a 20  =%d pid=%d\n",. 
2ae20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 50                lP
2ae30 61 74 68 2c 20 65 72 72 6e 6f 2c 20 67 65 74 70  ath, errno, getp
2ae40 69 64 28 29 29 29 3b 0a 20 20 20 20 20 20 72 65  id()));.      re
2ae50 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52  turn SQLITE_IOER
2ae60 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20 7d 0a 20 20  R_LOCK;.    }.  
2ae70 20 20 6c 65 6e 20 3d 20 73 74 72 6c 63 61 74 28    len = strlcat(
2ae80 6c 50 61 74 68 2c 20 22 73 71 6c 69 74 65 70 6c  lPath, "sqlitepl
2ae90 6f 63 6b 73 22 2c 20 6d 61 78 4c 65 6e 29 3b 20  ocks", maxLen); 
2aea0 20 20 20 0a 20 20 7d 0a 23 20 65 6c 73 65 0a 20     .  }.# else. 
2aeb0 20 6c 65 6e 20 3d 20 73 74 72 6c 63 70 79 28 6c   len = strlcpy(l
2aec0 50 61 74 68 2c 20 22 2f 74 6d 70 2f 22 2c 20 6d  Path, "/tmp/", m
2aed0 61 78 4c 65 6e 29 3b 0a 23 20 65 6e 64 69 66 0a  axLen);.# endif.
2aee0 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 6c 50  #endif..  if( lP
2aef0 61 74 68 5b 6c 65 6e 2d 31 5d 21 3d 27 2f 27 20  ath[len-1]!='/' 
2af00 29 7b 0a 20 20 20 20 6c 65 6e 20 3d 20 73 74 72  ){.    len = str
2af10 6c 63 61 74 28 6c 50 61 74 68 2c 20 22 2f 22 2c  lcat(lPath, "/",
2af20 20 6d 61 78 4c 65 6e 29 3b 0a 20 20 7d 0a 20 20   maxLen);.  }.  
2af30 0a 20 20 2f 2a 20 74 72 61 6e 73 66 6f 72 6d 20  .  /* transform 
2af40 74 68 65 20 64 62 20 70 61 74 68 20 74 6f 20 61  the db path to a
2af50 20 75 6e 69 71 75 65 20 63 61 63 68 65 20 6e 61   unique cache na
2af60 6d 65 20 2a 2f 0a 20 20 64 62 4c 65 6e 20 3d 20  me */.  dbLen = 
2af70 28 69 6e 74 29 73 74 72 6c 65 6e 28 64 62 50 61  (int)strlen(dbPa
2af80 74 68 29 3b 0a 20 20 66 6f 72 28 20 69 3d 30 3b  th);.  for( i=0;
2af90 20 69 3c 64 62 4c 65 6e 20 26 26 20 28 69 2b 6c   i<dbLen && (i+l
2afa0 65 6e 2b 37 29 3c 6d 61 78 4c 65 6e 3b 20 69 2b  en+7)<maxLen; i+
2afb0 2b 29 7b 0a 20 20 20 20 63 68 61 72 20 63 20 3d  +){.    char c =
2afc0 20 64 62 50 61 74 68 5b 69 5d 3b 0a 20 20 20 20   dbPath[i];.    
2afd0 6c 50 61 74 68 5b 69 2b 6c 65 6e 5d 20 3d 20 28  lPath[i+len] = (
2afe0 63 3d 3d 27 2f 27 29 3f 27 5f 27 3a 63 3b 0a 20  c=='/')?'_':c;. 
2aff0 20 7d 0a 20 20 6c 50 61 74 68 5b 69 2b 6c 65 6e   }.  lPath[i+len
2b000 5d 3d 27 5c 30 27 3b 0a 20 20 73 74 72 6c 63 61  ]='\0';.  strlca
2b010 74 28 6c 50 61 74 68 2c 20 22 3a 61 75 74 6f 3a  t(lPath, ":auto:
2b020 22 2c 20 6d 61 78 4c 65 6e 29 3b 0a 20 20 4f 53  ", maxLen);.  OS
2b030 54 52 41 43 45 28 28 22 47 45 54 4c 4f 43 4b 50  TRACE(("GETLOCKP
2b040 41 54 48 20 20 70 72 6f 78 79 20 6c 6f 63 6b 20  ATH  proxy lock 
2b050 70 61 74 68 3d 25 73 20 70 69 64 3d 25 64 5c 6e  path=%s pid=%d\n
2b060 22 2c 20 6c 50 61 74 68 2c 20 67 65 74 70 69 64  ", lPath, getpid
2b070 28 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  ()));.  return S
2b080 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20  QLITE_OK;.}../* 
2b090 0a 20 2a 2a 20 43 72 65 61 74 65 73 20 74 68 65  . ** Creates the
2b0a0 20 6c 6f 63 6b 20 66 69 6c 65 20 61 6e 64 20 61   lock file and a
2b0b0 6e 79 20 6d 69 73 73 69 6e 67 20 64 69 72 65 63  ny missing direc
2b0c0 74 6f 72 69 65 73 20 69 6e 20 6c 6f 63 6b 50 61  tories in lockPa
2b0d0 74 68 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e  th. */.static in
2b0e0 74 20 70 72 6f 78 79 43 72 65 61 74 65 4c 6f 63  t proxyCreateLoc
2b0f0 6b 50 61 74 68 28 63 6f 6e 73 74 20 63 68 61 72  kPath(const char
2b100 20 2a 6c 6f 63 6b 50 61 74 68 29 7b 0a 20 20 69   *lockPath){.  i
2b110 6e 74 20 69 2c 20 6c 65 6e 3b 0a 20 20 63 68 61  nt i, len;.  cha
2b120 72 20 62 75 66 5b 4d 41 58 50 41 54 48 4c 45 4e  r buf[MAXPATHLEN
2b130 5d 3b 0a 20 20 69 6e 74 20 73 74 61 72 74 20 3d  ];.  int start =
2b140 20 30 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28   0;.  .  assert(
2b150 6c 6f 63 6b 50 61 74 68 21 3d 4e 55 4c 4c 29 3b  lockPath!=NULL);
2b160 0a 20 20 2f 2a 20 74 72 79 20 74 6f 20 63 72 65  .  /* try to cre
2b170 61 74 65 20 61 6c 6c 20 74 68 65 20 69 6e 74 65  ate all the inte
2b180 72 6d 65 64 69 61 74 65 20 64 69 72 65 63 74 6f  rmediate directo
2b190 72 69 65 73 20 2a 2f 0a 20 20 6c 65 6e 20 3d 20  ries */.  len = 
2b1a0 28 69 6e 74 29 73 74 72 6c 65 6e 28 6c 6f 63 6b  (int)strlen(lock
2b1b0 50 61 74 68 29 3b 0a 20 20 62 75 66 5b 30 5d 20  Path);.  buf[0] 
2b1c0 3d 20 6c 6f 63 6b 50 61 74 68 5b 30 5d 3b 0a 20  = lockPath[0];. 
2b1d0 20 66 6f 72 28 20 69 3d 31 3b 20 69 3c 6c 65 6e   for( i=1; i<len
2b1e0 3b 20 69 2b 2b 20 29 7b 0a 20 20 20 20 69 66 28  ; i++ ){.    if(
2b1f0 20 6c 6f 63 6b 50 61 74 68 5b 69 5d 20 3d 3d 20   lockPath[i] == 
2b200 27 2f 27 20 26 26 20 28 69 20 2d 20 73 74 61 72  '/' && (i - star
2b210 74 20 3e 20 30 29 20 29 7b 0a 20 20 20 20 20 20  t > 0) ){.      
2b220 2f 2a 20 6f 6e 6c 79 20 6d 6b 64 69 72 20 69 66  /* only mkdir if
2b230 20 6c 65 61 66 20 64 69 72 20 21 3d 20 22 2e 22   leaf dir != "."
2b240 20 6f 72 20 22 2f 22 20 6f 72 20 22 2e 2e 22 20   or "/" or ".." 
2b250 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69 2d 73  */.      if( i-s
2b260 74 61 72 74 3e 32 20 7c 7c 20 28 69 2d 73 74 61  tart>2 || (i-sta
2b270 72 74 3d 3d 31 20 26 26 20 62 75 66 5b 73 74 61  rt==1 && buf[sta
2b280 72 74 5d 20 21 3d 20 27 2e 27 20 26 26 20 62 75  rt] != '.' && bu
2b290 66 5b 73 74 61 72 74 5d 20 21 3d 20 27 2f 27 29  f[start] != '/')
2b2a0 20 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28 69   .         || (i
2b2b0 2d 73 74 61 72 74 3d 3d 32 20 26 26 20 62 75 66  -start==2 && buf
2b2c0 5b 73 74 61 72 74 5d 20 21 3d 20 27 2e 27 20 26  [start] != '.' &
2b2d0 26 20 62 75 66 5b 73 74 61 72 74 2b 31 5d 20 21  & buf[start+1] !
2b2e0 3d 20 27 2e 27 29 20 29 7b 0a 20 20 20 20 20 20  = '.') ){.      
2b2f0 20 20 62 75 66 5b 69 5d 3d 27 5c 30 27 3b 0a 20    buf[i]='\0';. 
2b300 20 20 20 20 20 20 20 69 66 28 20 6d 6b 64 69 72         if( mkdir
2b310 28 62 75 66 2c 20 53 51 4c 49 54 45 5f 44 45 46  (buf, SQLITE_DEF
2b320 41 55 4c 54 5f 50 52 4f 58 59 44 49 52 5f 50 45  AULT_PROXYDIR_PE
2b330 52 4d 49 53 53 49 4f 4e 53 29 20 29 7b 0a 20 20  RMISSIONS) ){.  
2b340 20 20 20 20 20 20 20 20 69 6e 74 20 65 72 72 3d          int err=
2b350 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20  errno;.         
2b360 20 69 66 28 20 65 72 72 21 3d 45 45 58 49 53 54   if( err!=EEXIST
2b370 20 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20   ) {.           
2b380 20 4f 53 54 52 41 43 45 28 28 22 43 52 45 41 54   OSTRACE(("CREAT
2b390 45 4c 4f 43 4b 50 41 54 48 20 20 46 41 49 4c 45  ELOCKPATH  FAILE
2b3a0 44 20 63 72 65 61 74 69 6e 67 20 25 73 2c 20 22  D creating %s, "
2b3b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2b3c0 20 20 20 20 20 20 22 27 25 73 27 20 70 72 6f 78        "'%s' prox
2b3d0 79 20 6c 6f 63 6b 20 70 61 74 68 3d 25 73 20 70  y lock path=%s p
2b3e0 69 64 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  id=%d\n",.      
2b3f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
2b400 75 66 2c 20 73 74 72 65 72 72 6f 72 28 65 72 72  uf, strerror(err
2b410 29 2c 20 6c 6f 63 6b 50 61 74 68 2c 20 67 65 74  ), lockPath, get
2b420 70 69 64 28 29 29 29 3b 0a 20 20 20 20 20 20 20  pid()));.       
2b430 20 20 20 20 20 72 65 74 75 72 6e 20 65 72 72 3b       return err;
2b440 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2b450 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
2b460 20 20 20 20 20 73 74 61 72 74 3d 69 2b 31 3b 0a       start=i+1;.
2b470 20 20 20 20 7d 0a 20 20 20 20 62 75 66 5b 69 5d      }.    buf[i]
2b480 20 3d 20 6c 6f 63 6b 50 61 74 68 5b 69 5d 3b 0a   = lockPath[i];.
2b490 20 20 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22    }.  OSTRACE(("
2b4a0 43 52 45 41 54 45 4c 4f 43 4b 50 41 54 48 20 20  CREATELOCKPATH  
2b4b0 70 72 6f 78 79 20 6c 6f 63 6b 20 70 61 74 68 3d  proxy lock path=
2b4c0 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c 20 6c 6f  %s pid=%d\n", lo
2b4d0 63 6b 50 61 74 68 2c 20 67 65 74 70 69 64 28 29  ckPath, getpid()
2b4e0 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a  ));.  return 0;.
2b4f0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
2b500 61 20 6e 65 77 20 56 46 53 20 66 69 6c 65 20 64  a new VFS file d
2b510 65 73 63 72 69 70 74 6f 72 20 28 73 74 6f 72 65  escriptor (store
2b520 64 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61  d in memory obta
2b530 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 73 71 6c  ined from.** sql
2b540 69 74 65 33 5f 6d 61 6c 6c 6f 63 29 20 61 6e 64  ite3_malloc) and
2b550 20 6f 70 65 6e 20 74 68 65 20 66 69 6c 65 20 6e   open the file n
2b560 61 6d 65 64 20 22 70 61 74 68 22 20 69 6e 20 74  amed "path" in t
2b570 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
2b580 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61  or..**.** The ca
2b590 6c 6c 65 72 20 69 73 20 72 65 73 70 6f 6e 73 69  ller is responsi
2b5a0 62 6c 65 20 6e 6f 74 20 6f 6e 6c 79 20 66 6f 72  ble not only for
2b5b0 20 63 6c 6f 73 69 6e 67 20 74 68 65 20 66 69 6c   closing the fil
2b5c0 65 20 64 65 73 63 72 69 70 74 6f 72 0a 2a 2a 20  e descriptor.** 
2b5d0 62 75 74 20 61 6c 73 6f 20 66 6f 72 20 66 72 65  but also for fre
2b5e0 65 69 6e 67 20 74 68 65 20 6d 65 6d 6f 72 79 20  eing the memory 
2b5f0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
2b600 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
2b610 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  tor..*/.static i
2b620 6e 74 20 70 72 6f 78 79 43 72 65 61 74 65 55 6e  nt proxyCreateUn
2b630 69 78 46 69 6c 65 28 0a 20 20 20 20 63 6f 6e 73  ixFile(.    cons
2b640 74 20 63 68 61 72 20 2a 70 61 74 68 2c 20 20 20  t char *path,   
2b650 20 20 20 20 20 2f 2a 20 70 61 74 68 20 66 6f 72       /* path for
2b660 20 74 68 65 20 6e 65 77 20 75 6e 69 78 46 69 6c   the new unixFil
2b670 65 20 2a 2f 0a 20 20 20 20 75 6e 69 78 46 69 6c  e */.    unixFil
2b680 65 20 2a 2a 70 70 46 69 6c 65 2c 20 20 20 20 20  e **ppFile,     
2b690 20 20 2f 2a 20 75 6e 69 78 46 69 6c 65 20 63 72    /* unixFile cr
2b6a0 65 61 74 65 64 20 61 6e 64 20 72 65 74 75 72 6e  eated and return
2b6b0 65 64 20 62 79 20 72 65 66 20 2a 2f 0a 20 20 20  ed by ref */.   
2b6c0 20 69 6e 74 20 69 73 6c 6f 63 6b 66 69 6c 65 20   int islockfile 
2b6d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 66 20            /* if 
2b6e0 6e 6f 6e 20 7a 65 72 6f 20 6d 69 73 73 69 6e 67  non zero missing
2b6f0 20 64 69 72 73 20 77 69 6c 6c 20 62 65 20 63 72   dirs will be cr
2b700 65 61 74 65 64 20 2a 2f 0a 29 20 7b 0a 20 20 69  eated */.) {.  i
2b710 6e 74 20 66 64 20 3d 20 2d 31 3b 0a 20 20 69 6e  nt fd = -1;.  in
2b720 74 20 64 69 72 66 64 20 3d 20 2d 31 3b 0a 20 20  t dirfd = -1;.  
2b730 75 6e 69 78 46 69 6c 65 20 2a 70 4e 65 77 3b 0a  unixFile *pNew;.
2b740 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
2b750 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6f 70 65 6e  E_OK;.  int open
2b760 46 6c 61 67 73 20 3d 20 4f 5f 52 44 57 52 20 7c  Flags = O_RDWR |
2b770 20 4f 5f 43 52 45 41 54 3b 0a 20 20 73 71 6c 69   O_CREAT;.  sqli
2b780 74 65 33 5f 76 66 73 20 64 75 6d 6d 79 56 66 73  te3_vfs dummyVfs
2b790 3b 0a 20 20 69 6e 74 20 74 65 72 72 6e 6f 20 3d  ;.  int terrno =
2b7a0 20 30 3b 0a 20 20 55 6e 69 78 55 6e 75 73 65 64   0;.  UnixUnused
2b7b0 46 64 20 2a 70 55 6e 75 73 65 64 20 3d 20 4e 55  Fd *pUnused = NU
2b7c0 4c 4c 3b 0a 0a 20 20 2f 2a 20 31 2e 20 66 69 72  LL;..  /* 1. fir
2b7d0 73 74 20 74 72 79 20 74 6f 20 6f 70 65 6e 2f 63  st try to open/c
2b7e0 72 65 61 74 65 20 74 68 65 20 66 69 6c 65 0a 20  reate the file. 
2b7f0 20 2a 2a 20 32 2e 20 69 66 20 74 68 61 74 20 66   ** 2. if that f
2b800 61 69 6c 73 2c 20 61 6e 64 20 74 68 69 73 20 69  ails, and this i
2b810 73 20 61 20 6c 6f 63 6b 20 66 69 6c 65 20 28 6e  s a lock file (n
2b820 6f 74 2d 63 6f 6e 63 68 29 2c 20 74 72 79 20 63  ot-conch), try c
2b830 72 65 61 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65  reating.  ** the
2b840 20 70 61 72 65 6e 74 20 64 69 72 65 63 74 6f 72   parent director
2b850 69 65 73 20 61 6e 64 20 74 68 65 6e 20 74 72 79  ies and then try
2b860 20 61 67 61 69 6e 2e 0a 20 20 2a 2a 20 33 2e 20   again..  ** 3. 
2b870 69 66 20 74 68 61 74 20 66 61 69 6c 73 2c 20 74  if that fails, t
2b880 72 79 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 66  ry to open the f
2b890 69 6c 65 20 72 65 61 64 2d 6f 6e 6c 79 0a 20 20  ile read-only.  
2b8a0 2a 2a 20 6f 74 68 65 72 77 69 73 65 20 72 65 74  ** otherwise ret
2b8b0 75 72 6e 20 42 55 53 59 20 28 69 66 20 6c 6f 63  urn BUSY (if loc
2b8c0 6b 20 66 69 6c 65 29 20 6f 72 20 43 41 4e 54 4f  k file) or CANTO
2b8d0 50 45 4e 20 66 6f 72 20 74 68 65 20 63 6f 6e 63  PEN for the conc
2b8e0 68 20 66 69 6c 65 0a 20 20 2a 2f 0a 20 20 70 55  h file.  */.  pU
2b8f0 6e 75 73 65 64 20 3d 20 66 69 6e 64 52 65 75 73  nused = findReus
2b900 61 62 6c 65 46 64 28 70 61 74 68 2c 20 6f 70 65  ableFd(path, ope
2b910 6e 46 6c 61 67 73 29 3b 0a 20 20 69 66 28 20 70  nFlags);.  if( p
2b920 55 6e 75 73 65 64 20 29 7b 0a 20 20 20 20 66 64  Unused ){.    fd
2b930 20 3d 20 70 55 6e 75 73 65 64 2d 3e 66 64 3b 0a   = pUnused->fd;.
2b940 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 55 6e    }else{.    pUn
2b950 75 73 65 64 20 3d 20 73 71 6c 69 74 65 33 5f 6d  used = sqlite3_m
2b960 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 70 55  alloc(sizeof(*pU
2b970 6e 75 73 65 64 29 29 3b 0a 20 20 20 20 69 66 28  nused));.    if(
2b980 20 21 70 55 6e 75 73 65 64 20 29 7b 0a 20 20 20   !pUnused ){.   
2b990 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2b9a0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20  _NOMEM;.    }.  
2b9b0 7d 0a 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a  }.  if( fd<0 ){.
2b9c0 20 20 20 20 66 64 20 3d 20 6f 70 65 6e 28 70 61      fd = open(pa
2b9d0 74 68 2c 20 6f 70 65 6e 46 6c 61 67 73 2c 20 53  th, openFlags, S
2b9e0 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49  QLITE_DEFAULT_FI
2b9f0 4c 45 5f 50 45 52 4d 49 53 53 49 4f 4e 53 29 3b  LE_PERMISSIONS);
2ba00 0a 20 20 20 20 74 65 72 72 6e 6f 20 3d 20 65 72  .    terrno = er
2ba10 72 6e 6f 3b 0a 20 20 20 20 69 66 28 20 66 64 3c  rno;.    if( fd<
2ba20 30 20 26 26 20 65 72 72 6e 6f 3d 3d 45 4e 4f 45  0 && errno==ENOE
2ba30 4e 54 20 26 26 20 69 73 6c 6f 63 6b 66 69 6c 65  NT && islockfile
2ba40 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 72   ){.      if( pr
2ba50 6f 78 79 43 72 65 61 74 65 4c 6f 63 6b 50 61 74  oxyCreateLockPat
2ba60 68 28 70 61 74 68 29 20 3d 3d 20 53 51 4c 49 54  h(path) == SQLIT
2ba70 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2ba80 66 64 20 3d 20 6f 70 65 6e 28 70 61 74 68 2c 20  fd = open(path, 
2ba90 6f 70 65 6e 46 6c 61 67 73 2c 20 53 51 4c 49 54  openFlags, SQLIT
2baa0 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 50  E_DEFAULT_FILE_P
2bab0 45 52 4d 49 53 53 49 4f 4e 53 29 3b 0a 20 20 20  ERMISSIONS);.   
2bac0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
2bad0 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20   if( fd<0 ){.   
2bae0 20 6f 70 65 6e 46 6c 61 67 73 20 3d 20 4f 5f 52   openFlags = O_R
2baf0 44 4f 4e 4c 59 3b 0a 20 20 20 20 66 64 20 3d 20  DONLY;.    fd = 
2bb00 6f 70 65 6e 28 70 61 74 68 2c 20 6f 70 65 6e 46  open(path, openF
2bb10 6c 61 67 73 2c 20 53 51 4c 49 54 45 5f 44 45 46  lags, SQLITE_DEF
2bb20 41 55 4c 54 5f 46 49 4c 45 5f 50 45 52 4d 49 53  AULT_FILE_PERMIS
2bb30 53 49 4f 4e 53 29 3b 0a 20 20 20 20 74 65 72 72  SIONS);.    terr
2bb40 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 7d 0a  no = errno;.  }.
2bb50 20 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20    if( fd<0 ){.  
2bb60 20 20 69 66 28 20 69 73 6c 6f 63 6b 66 69 6c 65    if( islockfile
2bb70 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
2bb80 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
2bb90 20 20 7d 0a 20 20 20 20 73 77 69 74 63 68 20 28    }.    switch (
2bba0 74 65 72 72 6e 6f 29 20 7b 0a 20 20 20 20 20 20  terrno) {.      
2bbb0 63 61 73 65 20 45 41 43 43 45 53 3a 0a 20 20 20  case EACCES:.   
2bbc0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2bbd0 54 45 5f 50 45 52 4d 3b 0a 20 20 20 20 20 20 63  TE_PERM;.      c
2bbe0 61 73 65 20 45 49 4f 3a 20 0a 20 20 20 20 20 20  ase EIO: .      
2bbf0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2bc00 49 4f 45 52 52 5f 4c 4f 43 4b 3b 20 2f 2a 20 65  IOERR_LOCK; /* e
2bc10 76 65 6e 20 74 68 6f 75 67 68 20 69 74 20 69 73  ven though it is
2bc20 20 74 68 65 20 63 6f 6e 63 68 20 2a 2f 0a 20 20   the conch */.  
2bc30 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20      default:.   
2bc40 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
2bc50 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54  TE_CANTOPEN_BKPT
2bc60 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20  ;.    }.  }.  . 
2bc70 20 70 4e 65 77 20 3d 20 28 75 6e 69 78 46 69 6c   pNew = (unixFil
2bc80 65 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  e *)sqlite3_mall
2bc90 6f 63 28 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29  oc(sizeof(*pNew)
2bca0 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 4e  );.  if( pNew==N
2bcb0 55 4c 4c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ULL ){.    rc = 
2bcc0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
2bcd0 20 20 67 6f 74 6f 20 65 6e 64 5f 63 72 65 61 74    goto end_creat
2bce0 65 5f 70 72 6f 78 79 3b 0a 20 20 7d 0a 20 20 6d  e_proxy;.  }.  m
2bcf0 65 6d 73 65 74 28 70 4e 65 77 2c 20 30 2c 20 73  emset(pNew, 0, s
2bd00 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65 29 29  izeof(unixFile))
2bd10 3b 0a 20 20 70 4e 65 77 2d 3e 6f 70 65 6e 46 6c  ;.  pNew->openFl
2bd20 61 67 73 20 3d 20 6f 70 65 6e 46 6c 61 67 73 3b  ags = openFlags;
2bd30 0a 20 20 64 75 6d 6d 79 56 66 73 2e 70 41 70 70  .  dummyVfs.pApp
2bd40 44 61 74 61 20 3d 20 28 76 6f 69 64 2a 29 26 61  Data = (void*)&a
2bd50 75 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 3b  utolockIoFinder;
2bd60 0a 20 20 70 55 6e 75 73 65 64 2d 3e 66 64 20 3d  .  pUnused->fd =
2bd70 20 66 64 3b 0a 20 20 70 55 6e 75 73 65 64 2d 3e   fd;.  pUnused->
2bd80 66 6c 61 67 73 20 3d 20 6f 70 65 6e 46 6c 61 67  flags = openFlag
2bd90 73 3b 0a 20 20 70 4e 65 77 2d 3e 70 55 6e 75 73  s;.  pNew->pUnus
2bda0 65 64 20 3d 20 70 55 6e 75 73 65 64 3b 0a 20 20  ed = pUnused;.  
2bdb0 0a 20 20 72 63 20 3d 20 66 69 6c 6c 49 6e 55 6e  .  rc = fillInUn
2bdc0 69 78 46 69 6c 65 28 26 64 75 6d 6d 79 56 66 73  ixFile(&dummyVfs
2bdd0 2c 20 66 64 2c 20 64 69 72 66 64 2c 20 28 73 71  , fd, dirfd, (sq
2bde0 6c 69 74 65 33 5f 66 69 6c 65 2a 29 70 4e 65 77  lite3_file*)pNew
2bdf0 2c 20 70 61 74 68 2c 20 30 2c 20 30 29 3b 0a 20  , path, 0, 0);. 
2be00 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2be10 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 70 46 69 6c  OK ){.    *ppFil
2be20 65 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 72 65  e = pNew;.    re
2be30 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2be40 20 20 7d 0a 65 6e 64 5f 63 72 65 61 74 65 5f 70    }.end_create_p
2be50 72 6f 78 79 3a 20 20 20 20 0a 20 20 63 6c 6f 73  roxy:    .  clos
2be60 65 28 66 64 29 3b 20 2f 2a 20 73 69 6c 65 6e 74  e(fd); /* silent
2be70 6c 79 20 6c 65 61 6b 20 66 64 20 69 66 20 65 72  ly leak fd if er
2be80 72 6f 72 2c 20 77 65 27 72 65 20 61 6c 72 65 61  ror, we're alrea
2be90 64 79 20 69 6e 20 65 72 72 6f 72 20 2a 2f 0a 20  dy in error */. 
2bea0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4e   sqlite3_free(pN
2beb0 65 77 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  ew);.  sqlite3_f
2bec0 72 65 65 28 70 55 6e 75 73 65 64 29 3b 0a 20 20  ree(pUnused);.  
2bed0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
2bee0 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
2bef0 0a 2f 2a 20 73 69 6d 75 6c 61 74 65 20 6d 75 6c  ./* simulate mul
2bf00 74 69 70 6c 65 20 68 6f 73 74 73 20 62 79 20 63  tiple hosts by c
2bf10 72 65 61 74 69 6e 67 20 75 6e 69 71 75 65 20 68  reating unique h
2bf20 6f 73 74 69 64 20 66 69 6c 65 20 70 61 74 68 73  ostid file paths
2bf30 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f   */.int sqlite3_
2bf40 68 6f 73 74 69 64 5f 6e 75 6d 20 3d 20 30 3b 0a  hostid_num = 0;.
2bf50 23 65 6e 64 69 66 0a 0a 23 64 65 66 69 6e 65 20  #endif..#define 
2bf60 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 20  PROXY_HOSTIDLEN 
2bf70 20 20 20 31 36 20 20 2f 2a 20 63 6f 6e 63 68 20     16  /* conch 
2bf80 66 69 6c 65 20 68 6f 73 74 20 69 64 20 6c 65 6e  file host id len
2bf90 67 74 68 20 2a 2f 0a 0a 2f 2a 20 67 65 74 20 74  gth */../* get t
2bfa0 68 65 20 68 6f 73 74 20 49 44 20 76 69 61 20 67  he host ID via g
2bfb0 65 74 68 6f 73 74 75 75 69 64 28 29 2c 20 70 48  ethostuuid(), pH
2bfc0 6f 73 74 49 44 20 6d 75 73 74 20 70 6f 69 6e 74  ostID must point
2bfd0 20 74 6f 20 50 52 4f 58 59 5f 48 4f 53 54 49 44   to PROXY_HOSTID
2bfe0 4c 45 4e 20 0a 2a 2a 20 62 79 74 65 73 20 6f 66  LEN .** bytes of
2bff0 20 77 72 69 74 61 62 6c 65 20 6d 65 6d 6f 72 79   writable memory
2c000 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2c010 70 72 6f 78 79 47 65 74 48 6f 73 74 49 44 28 75  proxyGetHostID(u
2c020 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 48  nsigned char *pH
2c030 6f 73 74 49 44 2c 20 69 6e 74 20 2a 70 45 72 72  ostID, int *pErr
2c040 6f 72 29 7b 0a 20 20 73 74 72 75 63 74 20 74 69  or){.  struct ti
2c050 6d 65 73 70 65 63 20 74 69 6d 65 6f 75 74 20 3d  mespec timeout =
2c060 20 7b 31 2c 20 30 7d 3b 20 2f 2a 20 31 20 73 65   {1, 0}; /* 1 se
2c070 63 20 74 69 6d 65 6f 75 74 20 2a 2f 0a 20 20 0a  c timeout */.  .
2c080 20 20 61 73 73 65 72 74 28 50 52 4f 58 59 5f 48    assert(PROXY_H
2c090 4f 53 54 49 44 4c 45 4e 20 3d 3d 20 73 69 7a 65  OSTIDLEN == size
2c0a0 6f 66 28 75 75 69 64 5f 74 29 29 3b 0a 20 20 6d  of(uuid_t));.  m
2c0b0 65 6d 73 65 74 28 70 48 6f 73 74 49 44 2c 20 30  emset(pHostID, 0
2c0c0 2c 20 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45  , PROXY_HOSTIDLE
2c0d0 4e 29 3b 0a 20 20 69 66 28 20 67 65 74 68 6f 73  N);.  if( gethos
2c0e0 74 75 75 69 64 28 70 48 6f 73 74 49 44 2c 20 26  tuuid(pHostID, &
2c0f0 74 69 6d 65 6f 75 74 29 20 29 7b 0a 20 20 20 20  timeout) ){.    
2c100 69 6e 74 20 65 72 72 20 3d 20 65 72 72 6e 6f 3b  int err = errno;
2c110 0a 20 20 20 20 69 66 28 20 70 45 72 72 6f 72 20  .    if( pError 
2c120 29 7b 0a 20 20 20 20 20 20 2a 70 45 72 72 6f 72  ){.      *pError
2c130 20 3d 20 65 72 72 3b 0a 20 20 20 20 7d 0a 20 20   = err;.    }.  
2c140 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2c150 49 4f 45 52 52 3b 0a 20 20 7d 0a 23 69 66 64 65  IOERR;.  }.#ifde
2c160 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20  f SQLITE_TEST.  
2c170 2f 2a 20 73 69 6d 75 6c 61 74 65 20 6d 75 6c 74  /* simulate mult
2c180 69 70 6c 65 20 68 6f 73 74 73 20 62 79 20 63 72  iple hosts by cr
2c190 65 61 74 69 6e 67 20 75 6e 69 71 75 65 20 68 6f  eating unique ho
2c1a0 73 74 69 64 20 66 69 6c 65 20 70 61 74 68 73 20  stid file paths 
2c1b0 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  */.  if( sqlite3
2c1c0 5f 68 6f 73 74 69 64 5f 6e 75 6d 20 21 3d 20 30  _hostid_num != 0
2c1d0 29 7b 0a 20 20 20 20 70 48 6f 73 74 49 44 5b 30  ){.    pHostID[0
2c1e0 5d 20 3d 20 28 63 68 61 72 29 28 70 48 6f 73 74  ] = (char)(pHost
2c1f0 49 44 5b 30 5d 20 2b 20 28 63 68 61 72 29 28 73  ID[0] + (char)(s
2c200 71 6c 69 74 65 33 5f 68 6f 73 74 69 64 5f 6e 75  qlite3_hostid_nu
2c210 6d 20 26 20 30 78 46 46 29 29 3b 0a 20 20 7d 0a  m & 0xFF));.  }.
2c220 23 65 6e 64 69 66 0a 20 20 0a 20 20 72 65 74 75  #endif.  .  retu
2c230 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
2c240 0a 2f 2a 20 54 68 65 20 63 6f 6e 63 68 20 66 69  ./* The conch fi
2c250 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  le contains the 
2c260 68 65 61 64 65 72 2c 20 68 6f 73 74 20 69 64 20  header, host id 
2c270 61 6e 64 20 6c 6f 63 6b 20 66 69 6c 65 20 70 61  and lock file pa
2c280 74 68 0a 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50  th. */.#define P
2c290 52 4f 58 59 5f 43 4f 4e 43 48 56 45 52 53 49 4f  ROXY_CONCHVERSIO
2c2a0 4e 20 32 20 20 20 2f 2a 20 31 2d 62 79 74 65 20  N 2   /* 1-byte 
2c2b0 68 65 61 64 65 72 2c 20 31 36 2d 62 79 74 65 20  header, 16-byte 
2c2c0 68 6f 73 74 20 69 64 2c 20 70 61 74 68 20 2a 2f  host id, path */
2c2d0 0a 23 64 65 66 69 6e 65 20 50 52 4f 58 59 5f 48  .#define PROXY_H
2c2e0 45 41 44 45 52 4c 45 4e 20 20 20 20 31 20 20 20  EADERLEN    1   
2c2f0 2f 2a 20 63 6f 6e 63 68 20 66 69 6c 65 20 68 65  /* conch file he
2c300 61 64 65 72 20 6c 65 6e 67 74 68 20 2a 2f 0a 23  ader length */.#
2c310 64 65 66 69 6e 65 20 50 52 4f 58 59 5f 50 41 54  define PROXY_PAT
2c320 48 49 4e 44 45 58 20 20 20 20 28 50 52 4f 58 59  HINDEX    (PROXY
2c330 5f 48 45 41 44 45 52 4c 45 4e 2b 50 52 4f 58 59  _HEADERLEN+PROXY
2c340 5f 48 4f 53 54 49 44 4c 45 4e 29 0a 23 64 65 66  _HOSTIDLEN).#def
2c350 69 6e 65 20 50 52 4f 58 59 5f 4d 41 58 43 4f 4e  ine PROXY_MAXCON
2c360 43 48 4c 45 4e 20 20 28 50 52 4f 58 59 5f 48 45  CHLEN  (PROXY_HE
2c370 41 44 45 52 4c 45 4e 2b 50 52 4f 58 59 5f 48 4f  ADERLEN+PROXY_HO
2c380 53 54 49 44 4c 45 4e 2b 4d 41 58 50 41 54 48 4c  STIDLEN+MAXPATHL
2c390 45 4e 29 0a 0a 2f 2a 20 0a 2a 2a 20 54 61 6b 65  EN)../* .** Take
2c3a0 73 20 61 6e 20 6f 70 65 6e 20 63 6f 6e 63 68 20  s an open conch 
2c3b0 66 69 6c 65 2c 20 63 6f 70 69 65 73 20 74 68 65  file, copies the
2c3c0 20 63 6f 6e 74 65 6e 74 73 20 74 6f 20 61 20 6e   contents to a n
2c3d0 65 77 20 70 61 74 68 20 61 6e 64 20 74 68 65 6e  ew path and then
2c3e0 20 6d 6f 76 65 73 20 0a 2a 2a 20 69 74 20 62 61   moves .** it ba
2c3f0 63 6b 2e 20 20 54 68 65 20 6e 65 77 6c 79 20 63  ck.  The newly c
2c400 72 65 61 74 65 64 20 66 69 6c 65 27 73 20 66 69  reated file's fi
2c410 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73  le descriptor is
2c420 20 61 73 73 69 67 6e 65 64 20 74 6f 20 74 68 65   assigned to the
2c430 0a 2a 2a 20 63 6f 6e 63 68 20 66 69 6c 65 20 73  .** conch file s
2c440 74 72 75 63 74 75 72 65 20 61 6e 64 20 66 69 6e  tructure and fin
2c450 61 6c 6c 79 20 74 68 65 20 6f 72 69 67 69 6e 61  ally the origina
2c460 6c 20 63 6f 6e 63 68 20 66 69 6c 65 20 64 65 73  l conch file des
2c470 63 72 69 70 74 6f 72 20 69 73 20 0a 2a 2a 20 63  criptor is .** c
2c480 6c 6f 73 65 64 2e 20 20 52 65 74 75 72 6e 73 20  losed.  Returns 
2c490 7a 65 72 6f 20 69 66 20 73 75 63 63 65 73 73 66  zero if successf
2c4a0 75 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ul..*/.static in
2c4b0 74 20 70 72 6f 78 79 42 72 65 61 6b 43 6f 6e 63  t proxyBreakConc
2c4c0 68 4c 6f 63 6b 28 75 6e 69 78 46 69 6c 65 20 2a  hLock(unixFile *
2c4d0 70 46 69 6c 65 2c 20 75 75 69 64 5f 74 20 6d 79  pFile, uuid_t my
2c4e0 48 6f 73 74 49 44 29 7b 0a 20 20 70 72 6f 78 79  HostID){.  proxy
2c4f0 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a  LockingContext *
2c500 70 43 74 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63  pCtx = (proxyLoc
2c510 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 29 70 46  kingContext *)pF
2c520 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74  ile->lockingCont
2c530 65 78 74 3b 20 0a 20 20 75 6e 69 78 46 69 6c 65  ext; .  unixFile
2c540 20 2a 63 6f 6e 63 68 46 69 6c 65 20 3d 20 70 43   *conchFile = pC
2c550 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 3b 0a 20  tx->conchFile;. 
2c560 20 63 68 61 72 20 74 50 61 74 68 5b 4d 41 58 50   char tPath[MAXP
2c570 41 54 48 4c 45 4e 5d 3b 0a 20 20 63 68 61 72 20  ATHLEN];.  char 
2c580 62 75 66 5b 50 52 4f 58 59 5f 4d 41 58 43 4f 4e  buf[PROXY_MAXCON
2c590 43 48 4c 45 4e 5d 3b 0a 20 20 63 68 61 72 20 2a  CHLEN];.  char *
2c5a0 63 50 61 74 68 20 3d 20 70 43 74 78 2d 3e 63 6f  cPath = pCtx->co
2c5b0 6e 63 68 46 69 6c 65 50 61 74 68 3b 0a 20 20 73  nchFilePath;.  s
2c5c0 69 7a 65 5f 74 20 72 65 61 64 4c 65 6e 20 3d 20  ize_t readLen = 
2c5d0 30 3b 0a 20 20 73 69 7a 65 5f 74 20 70 61 74 68  0;.  size_t path
2c5e0 4c 65 6e 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  Len = 0;.  char 
2c5f0 65 72 72 6d 73 67 5b 36 34 5d 20 3d 20 22 22 3b  errmsg[64] = "";
2c600 0a 20 20 69 6e 74 20 66 64 20 3d 20 2d 31 3b 0a  .  int fd = -1;.
2c610 20 20 69 6e 74 20 72 63 20 3d 20 2d 31 3b 0a 0a    int rc = -1;..
2c620 20 20 2f 2a 20 63 72 65 61 74 65 20 61 20 6e 65    /* create a ne
2c630 77 20 70 61 74 68 20 62 79 20 72 65 70 6c 61 63  w path by replac
2c640 65 20 74 68 65 20 74 72 61 69 6c 69 6e 67 20 27  e the trailing '
2c650 2d 63 6f 6e 63 68 27 20 77 69 74 68 20 27 2d 62  -conch' with '-b
2c660 72 65 61 6b 27 20 2a 2f 0a 20 20 70 61 74 68 4c  reak' */.  pathL
2c670 65 6e 20 3d 20 73 74 72 6c 63 70 79 28 74 50 61  en = strlcpy(tPa
2c680 74 68 2c 20 63 50 61 74 68 2c 20 4d 41 58 50 41  th, cPath, MAXPA
2c690 54 48 4c 45 4e 29 3b 0a 20 20 69 66 28 20 70 61  THLEN);.  if( pa
2c6a0 74 68 4c 65 6e 3e 4d 41 58 50 41 54 48 4c 45 4e  thLen>MAXPATHLEN
2c6b0 20 7c 7c 20 70 61 74 68 4c 65 6e 3c 36 20 7c 7c   || pathLen<6 ||
2c6c0 20 0a 20 20 20 20 20 28 73 74 72 6c 63 70 79 28   .     (strlcpy(
2c6d0 26 74 50 61 74 68 5b 70 61 74 68 4c 65 6e 2d 35  &tPath[pathLen-5
2c6e0 5d 2c 20 22 62 72 65 61 6b 22 2c 20 36 29 20 21  ], "break", 6) !
2c6f0 3d 20 35 29 20 29 7b 0a 20 20 20 20 73 70 72 69  = 5) ){.    spri
2c700 6e 74 66 28 65 72 72 6d 73 67 2c 20 22 70 61 74  ntf(errmsg, "pat
2c710 68 20 65 72 72 6f 72 20 28 6c 65 6e 20 25 64 29  h error (len %d)
2c720 22 2c 20 28 69 6e 74 29 70 61 74 68 4c 65 6e 29  ", (int)pathLen)
2c730 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 62  ;.    goto end_b
2c740 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20  reaklock;.  }.  
2c750 2f 2a 20 72 65 61 64 20 74 68 65 20 63 6f 6e 63  /* read the conc
2c760 68 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 72  h content */.  r
2c770 65 61 64 4c 65 6e 20 3d 20 70 72 65 61 64 28 63  eadLen = pread(c
2c780 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 62 75 66  onchFile->h, buf
2c790 2c 20 50 52 4f 58 59 5f 4d 41 58 43 4f 4e 43 48  , PROXY_MAXCONCH
2c7a0 4c 45 4e 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  LEN, 0);.  if( r
2c7b0 65 61 64 4c 65 6e 3c 50 52 4f 58 59 5f 50 41 54  eadLen<PROXY_PAT
2c7c0 48 49 4e 44 45 58 20 29 7b 0a 20 20 20 20 73 70  HINDEX ){.    sp
2c7d0 72 69 6e 74 66 28 65 72 72 6d 73 67 2c 20 22 72  rintf(errmsg, "r
2c7e0 65 61 64 20 65 72 72 6f 72 20 28 6c 65 6e 20 25  ead error (len %
2c7f0 64 29 22 2c 20 28 69 6e 74 29 72 65 61 64 4c 65  d)", (int)readLe
2c800 6e 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64  n);.    goto end
2c810 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a  _breaklock;.  }.
2c820 20 20 2f 2a 20 77 72 69 74 65 20 69 74 20 6f 75    /* write it ou
2c830 74 20 74 6f 20 74 68 65 20 74 65 6d 70 6f 72 61  t to the tempora
2c840 72 79 20 62 72 65 61 6b 20 66 69 6c 65 20 2a 2f  ry break file */
2c850 0a 20 20 66 64 20 3d 20 6f 70 65 6e 28 74 50 61  .  fd = open(tPa
2c860 74 68 2c 20 28 4f 5f 52 44 57 52 7c 4f 5f 43 52  th, (O_RDWR|O_CR
2c870 45 41 54 7c 4f 5f 45 58 43 4c 29 2c 20 53 51 4c  EAT|O_EXCL), SQL
2c880 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45  ITE_DEFAULT_FILE
2c890 5f 50 45 52 4d 49 53 53 49 4f 4e 53 29 3b 0a 20  _PERMISSIONS);. 
2c8a0 20 69 66 28 20 66 64 3c 30 20 29 7b 0a 20 20 20   if( fd<0 ){.   
2c8b0 20 73 70 72 69 6e 74 66 28 65 72 72 6d 73 67 2c   sprintf(errmsg,
2c8c0 20 22 63 72 65 61 74 65 20 66 61 69 6c 65 64 20   "create failed 
2c8d0 28 25 64 29 22 2c 20 65 72 72 6e 6f 29 3b 0a 20  (%d)", errno);. 
2c8e0 20 20 20 67 6f 74 6f 20 65 6e 64 5f 62 72 65 61     goto end_brea
2c8f0 6b 6c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 69 66 28  klock;.  }.  if(
2c900 20 70 77 72 69 74 65 28 66 64 2c 20 62 75 66 2c   pwrite(fd, buf,
2c910 20 72 65 61 64 4c 65 6e 2c 20 30 29 20 21 3d 20   readLen, 0) != 
2c920 72 65 61 64 4c 65 6e 20 29 7b 0a 20 20 20 20 73  readLen ){.    s
2c930 70 72 69 6e 74 66 28 65 72 72 6d 73 67 2c 20 22  printf(errmsg, "
2c940 77 72 69 74 65 20 66 61 69 6c 65 64 20 28 25 64  write failed (%d
2c950 29 22 2c 20 65 72 72 6e 6f 29 3b 0a 20 20 20 20  )", errno);.    
2c960 67 6f 74 6f 20 65 6e 64 5f 62 72 65 61 6b 6c 6f  goto end_breaklo
2c970 63 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 65  ck;.  }.  if( re
2c980 6e 61 6d 65 28 74 50 61 74 68 2c 20 63 50 61 74  name(tPath, cPat
2c990 68 29 20 29 7b 0a 20 20 20 20 73 70 72 69 6e 74  h) ){.    sprint
2c9a0 66 28 65 72 72 6d 73 67 2c 20 22 72 65 6e 61 6d  f(errmsg, "renam
2c9b0 65 20 66 61 69 6c 65 64 20 28 25 64 29 22 2c 20  e failed (%d)", 
2c9c0 65 72 72 6e 6f 29 3b 0a 20 20 20 20 67 6f 74 6f  errno);.    goto
2c9d0 20 65 6e 64 5f 62 72 65 61 6b 6c 6f 63 6b 3b 0a   end_breaklock;.
2c9e0 20 20 7d 0a 20 20 72 63 20 3d 20 30 3b 0a 20 20    }.  rc = 0;.  
2c9f0 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  fprintf(stderr, 
2ca00 22 62 72 6f 6b 65 20 73 74 61 6c 65 20 6c 6f 63  "broke stale loc
2ca10 6b 20 6f 6e 20 25 73 5c 6e 22 2c 20 63 50 61 74  k on %s\n", cPat
2ca20 68 29 3b 0a 20 20 63 6c 6f 73 65 28 63 6f 6e 63  h);.  close(conc
2ca30 68 46 69 6c 65 2d 3e 68 29 3b 0a 20 20 63 6f 6e  hFile->h);.  con
2ca40 63 68 46 69 6c 65 2d 3e 68 20 3d 20 66 64 3b 0a  chFile->h = fd;.
2ca50 20 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 6f 70 65    conchFile->ope
2ca60 6e 46 6c 61 67 73 20 3d 20 4f 5f 52 44 57 52 20  nFlags = O_RDWR 
2ca70 7c 20 4f 5f 43 52 45 41 54 3b 0a 0a 65 6e 64 5f  | O_CREAT;..end_
2ca80 62 72 65 61 6b 6c 6f 63 6b 3a 0a 20 20 69 66 28  breaklock:.  if(
2ca90 20 72 63 20 29 7b 0a 20 20 20 20 69 66 28 20 66   rc ){.    if( f
2caa0 64 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 75 6e  d>=0 ){.      un
2cab0 6c 69 6e 6b 28 74 50 61 74 68 29 3b 0a 20 20 20  link(tPath);.   
2cac0 20 20 20 63 6c 6f 73 65 28 66 64 29 3b 0a 20 20     close(fd);.  
2cad0 20 20 7d 0a 20 20 20 20 66 70 72 69 6e 74 66 28    }.    fprintf(
2cae0 73 74 64 65 72 72 2c 20 22 66 61 69 6c 65 64 20  stderr, "failed 
2caf0 74 6f 20 62 72 65 61 6b 20 73 74 61 6c 65 20 6c  to break stale l
2cb00 6f 63 6b 20 6f 6e 20 25 73 2c 20 25 73 5c 6e 22  ock on %s, %s\n"
2cb10 2c 20 63 50 61 74 68 2c 20 65 72 72 6d 73 67 29  , cPath, errmsg)
2cb20 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
2cb30 63 3b 0a 7d 0a 0a 2f 2a 20 54 61 6b 65 20 74 68  c;.}../* Take th
2cb40 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f 63 6b  e requested lock
2cb50 20 6f 6e 20 74 68 65 20 63 6f 6e 63 68 20 66 69   on the conch fi
2cb60 6c 65 20 61 6e 64 20 62 72 65 61 6b 20 61 20 73  le and break a s
2cb70 74 61 6c 65 20 6c 6f 63 6b 20 69 66 20 74 68 65  tale lock if the
2cb80 20 0a 2a 2a 20 68 6f 73 74 20 69 64 20 6d 61 74   .** host id mat
2cb90 63 68 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ches..*/.static 
2cba0 69 6e 74 20 70 72 6f 78 79 43 6f 6e 63 68 4c 6f  int proxyConchLo
2cbb0 63 6b 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  ck(unixFile *pFi
2cbc0 6c 65 2c 20 75 75 69 64 5f 74 20 6d 79 48 6f 73  le, uuid_t myHos
2cbd0 74 49 44 2c 20 69 6e 74 20 6c 6f 63 6b 54 79 70  tID, int lockTyp
2cbe0 65 29 7b 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 69  e){.  proxyLocki
2cbf0 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20  ngContext *pCtx 
2cc00 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43  = (proxyLockingC
2cc10 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e  ontext *)pFile->
2cc20 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 20  lockingContext; 
2cc30 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f 6e  .  unixFile *con
2cc40 63 68 46 69 6c 65 20 3d 20 70 43 74 78 2d 3e 63  chFile = pCtx->c
2cc50 6f 6e 63 68 46 69 6c 65 3b 0a 20 20 69 6e 74 20  onchFile;.  int 
2cc60 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
2cc70 20 20 69 6e 74 20 6e 54 72 69 65 73 20 3d 20 30    int nTries = 0
2cc80 3b 0a 20 20 73 74 72 75 63 74 20 74 69 6d 65 73  ;.  struct times
2cc90 70 65 63 20 63 6f 6e 63 68 4d 6f 64 54 69 6d 65  pec conchModTime
2cca0 3b 0a 20 20 0a 20 20 64 6f 20 7b 0a 20 20 20 20  ;.  .  do {.    
2ccb0 72 63 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e  rc = conchFile->
2ccc0 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28  pMethod->xLock((
2ccd0 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f  sqlite3_file*)co
2cce0 6e 63 68 46 69 6c 65 2c 20 6c 6f 63 6b 54 79 70  nchFile, lockTyp
2ccf0 65 29 3b 0a 20 20 20 20 6e 54 72 69 65 73 20 2b  e);.    nTries +
2cd00 2b 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  +;.    if( rc==S
2cd10 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20  QLITE_BUSY ){.  
2cd20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6c 6f      /* If the lo
2cd30 63 6b 20 66 61 69 6c 65 64 20 28 62 75 73 79 29  ck failed (busy)
2cd40 3a 0a 20 20 20 20 20 20 20 2a 20 31 73 74 20 74  :.       * 1st t
2cd50 72 79 3a 20 67 65 74 20 74 68 65 20 6d 6f 64 20  ry: get the mod 
2cd60 74 69 6d 65 20 6f 66 20 74 68 65 20 63 6f 6e 63  time of the conc
2cd70 68 2c 20 77 61 69 74 20 30 2e 35 73 20 61 6e 64  h, wait 0.5s and
2cd80 20 74 72 79 20 61 67 61 69 6e 2e 20 0a 20 20 20   try again. .   
2cd90 20 20 20 20 2a 20 32 6e 64 20 74 72 79 3a 20 66      * 2nd try: f
2cda0 61 69 6c 20 69 66 20 74 68 65 20 6d 6f 64 20 74  ail if the mod t
2cdb0 69 6d 65 20 63 68 61 6e 67 65 64 20 6f 72 20 68  ime changed or h
2cdc0 6f 73 74 20 69 64 20 69 73 20 64 69 66 66 65 72  ost id is differ
2cdd0 65 6e 74 2c 20 77 61 69 74 20 0a 20 20 20 20 20  ent, wait .     
2cde0 20 20 2a 20 20 20 20 20 20 20 20 20 20 20 31 30    *           10
2cdf0 20 73 65 63 20 61 6e 64 20 74 72 79 20 61 67 61   sec and try aga
2ce00 69 6e 0a 20 20 20 20 20 20 20 2a 20 33 72 64 20  in.       * 3rd 
2ce10 74 72 79 3a 20 62 72 65 61 6b 20 74 68 65 20 6c  try: break the l
2ce20 6f 63 6b 20 75 6e 6c 65 73 73 20 74 68 65 20 6d  ock unless the m
2ce30 6f 64 20 74 69 6d 65 20 68 61 73 20 63 68 61 6e  od time has chan
2ce40 67 65 64 2e 0a 20 20 20 20 20 20 20 2a 2f 0a 20  ged..       */. 
2ce50 20 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74       struct stat
2ce60 20 62 75 66 3b 0a 20 20 20 20 20 20 69 66 28 20   buf;.      if( 
2ce70 66 73 74 61 74 28 63 6f 6e 63 68 46 69 6c 65 2d  fstat(conchFile-
2ce80 3e 68 2c 20 26 62 75 66 29 20 29 7b 0a 20 20 20  >h, &buf) ){.   
2ce90 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c 61 73 74       pFile->last
2cea0 45 72 72 6e 6f 20 3d 20 65 72 72 6e 6f 3b 0a 20  Errno = errno;. 
2ceb0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
2cec0 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3b  LITE_IOERR_LOCK;
2ced0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 0a  .      }.      .
2cee0 20 20 20 20 20 20 69 66 28 20 6e 54 72 69 65 73        if( nTries
2cef0 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ==1 ){.        c
2cf00 6f 6e 63 68 4d 6f 64 54 69 6d 65 20 3d 20 62 75  onchModTime = bu
2cf10 66 2e 73 74 5f 6d 74 69 6d 65 73 70 65 63 3b 0a  f.st_mtimespec;.
2cf20 20 20 20 20 20 20 20 20 75 73 6c 65 65 70 28 35          usleep(5
2cf30 30 30 30 30 30 29 3b 20 2f 2a 20 77 61 69 74 20  00000); /* wait 
2cf40 30 2e 35 20 73 65 63 20 61 6e 64 20 74 72 79 20  0.5 sec and try 
2cf50 74 68 65 20 6c 6f 63 6b 20 61 67 61 69 6e 2a 2f  the lock again*/
2cf60 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  .        continu
2cf70 65 3b 20 20 0a 20 20 20 20 20 20 7d 0a 0a 20 20  e;  .      }..  
2cf80 20 20 20 20 61 73 73 65 72 74 28 20 6e 54 72 69      assert( nTri
2cf90 65 73 3e 31 20 29 3b 0a 20 20 20 20 20 20 69 66  es>1 );.      if
2cfa0 28 20 63 6f 6e 63 68 4d 6f 64 54 69 6d 65 2e 74  ( conchModTime.t
2cfb0 76 5f 73 65 63 20 21 3d 20 62 75 66 2e 73 74 5f  v_sec != buf.st_
2cfc0 6d 74 69 6d 65 73 70 65 63 2e 74 76 5f 73 65 63  mtimespec.tv_sec
2cfd0 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 63 6f   || .         co
2cfe0 6e 63 68 4d 6f 64 54 69 6d 65 2e 74 76 5f 6e 73  nchModTime.tv_ns
2cff0 65 63 20 21 3d 20 62 75 66 2e 73 74 5f 6d 74 69  ec != buf.st_mti
2d000 6d 65 73 70 65 63 2e 74 76 5f 6e 73 65 63 20 29  mespec.tv_nsec )
2d010 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
2d020 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
2d030 20 20 20 20 7d 0a 20 20 20 20 20 20 0a 20 20 20      }.      .   
2d040 20 20 20 69 66 28 20 6e 54 72 69 65 73 3d 3d 32     if( nTries==2
2d050 20 29 7b 20 20 0a 20 20 20 20 20 20 20 20 63 68   ){  .        ch
2d060 61 72 20 74 42 75 66 5b 50 52 4f 58 59 5f 4d 41  ar tBuf[PROXY_MA
2d070 58 43 4f 4e 43 48 4c 45 4e 5d 3b 0a 20 20 20 20  XCONCHLEN];.    
2d080 20 20 20 20 69 6e 74 20 6c 65 6e 20 3d 20 70 72      int len = pr
2d090 65 61 64 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68  ead(conchFile->h
2d0a0 2c 20 74 42 75 66 2c 20 50 52 4f 58 59 5f 4d 41  , tBuf, PROXY_MA
2d0b0 58 43 4f 4e 43 48 4c 45 4e 2c 20 30 29 3b 0a 20  XCONCHLEN, 0);. 
2d0c0 20 20 20 20 20 20 20 69 66 28 20 6c 65 6e 3c 30         if( len<0
2d0d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46   ){.          pF
2d0e0 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d  ile->lastErrno =
2d0f0 20 65 72 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20   errno;.        
2d100 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2d110 49 4f 45 52 52 5f 4c 4f 43 4b 3b 0a 20 20 20 20  IOERR_LOCK;.    
2d120 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
2d130 28 20 6c 65 6e 3e 50 52 4f 58 59 5f 50 41 54 48  ( len>PROXY_PATH
2d140 49 4e 44 45 58 20 26 26 20 74 42 75 66 5b 30 5d  INDEX && tBuf[0]
2d150 3d 3d 28 63 68 61 72 29 50 52 4f 58 59 5f 43 4f  ==(char)PROXY_CO
2d160 4e 43 48 56 45 52 53 49 4f 4e 29 7b 0a 20 20 20  NCHVERSION){.   
2d170 20 20 20 20 20 20 20 2f 2a 20 64 6f 6e 27 74 20         /* don't 
2d180 62 72 65 61 6b 20 74 68 65 20 6c 6f 63 6b 20 69  break the lock i
2d190 66 20 74 68 65 20 68 6f 73 74 20 69 64 20 64 6f  f the host id do
2d1a0 65 73 6e 27 74 20 6d 61 74 63 68 20 2a 2f 0a 20  esn't match */. 
2d1b0 20 20 20 20 20 20 20 20 20 69 66 28 20 30 21 3d           if( 0!=
2d1c0 6d 65 6d 63 6d 70 28 26 74 42 75 66 5b 50 52 4f  memcmp(&tBuf[PRO
2d1d0 58 59 5f 48 45 41 44 45 52 4c 45 4e 5d 2c 20 6d  XY_HEADERLEN], m
2d1e0 79 48 6f 73 74 49 44 2c 20 50 52 4f 58 59 5f 48  yHostID, PROXY_H
2d1f0 4f 53 54 49 44 4c 45 4e 29 20 29 7b 0a 20 20 20  OSTIDLEN) ){.   
2d200 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
2d210 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
2d220 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2d230 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2d240 20 20 2f 2a 20 64 6f 6e 27 74 20 62 72 65 61 6b    /* don't break
2d250 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 73 68 6f   the lock on sho
2d260 72 74 20 72 65 61 64 20 6f 72 20 61 20 76 65 72  rt read or a ver
2d270 73 69 6f 6e 20 6d 69 73 6d 61 74 63 68 20 2a 2f  sion mismatch */
2d280 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
2d290 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  n SQLITE_BUSY;. 
2d2a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2d2b0 20 75 73 6c 65 65 70 28 31 30 30 30 30 30 30 30   usleep(10000000
2d2c0 29 3b 20 2f 2a 20 77 61 69 74 20 31 30 20 73 65  ); /* wait 10 se
2d2d0 63 20 61 6e 64 20 74 72 79 20 74 68 65 20 6c 6f  c and try the lo
2d2e0 63 6b 20 61 67 61 69 6e 20 2a 2f 0a 20 20 20 20  ck again */.    
2d2f0 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 20 0a 20      continue; . 
2d300 20 20 20 20 20 7d 0a 20 20 20 20 20 20 0a 20 20       }.      .  
2d310 20 20 20 20 61 73 73 65 72 74 28 20 6e 54 72 69      assert( nTri
2d320 65 73 3d 3d 33 20 29 3b 0a 20 20 20 20 20 20 69  es==3 );.      i
2d330 66 28 20 30 3d 3d 70 72 6f 78 79 42 72 65 61 6b  f( 0==proxyBreak
2d340 43 6f 6e 63 68 4c 6f 63 6b 28 70 46 69 6c 65 2c  ConchLock(pFile,
2d350 20 6d 79 48 6f 73 74 49 44 29 20 29 7b 0a 20 20   myHostID) ){.  
2d360 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2d370 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 69 66  E_OK;.        if
2d380 28 20 6c 6f 63 6b 54 79 70 65 3d 3d 45 58 43 4c  ( lockType==EXCL
2d390 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20  USIVE_LOCK ){.  
2d3a0 20 20 20 20 20 20 20 20 72 63 20 3d 20 63 6f 6e          rc = con
2d3b0 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d  chFile->pMethod-
2d3c0 3e 78 4c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f  >xLock((sqlite3_
2d3d0 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c  file*)conchFile,
2d3e0 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 20 20   SHARED_LOCK);  
2d3f0 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20          .       
2d400 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 21   }.        if( !
2d410 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
2d420 72 63 20 3d 20 63 6f 6e 63 68 46 69 6c 65 2d 3e  rc = conchFile->
2d430 70 4d 65 74 68 6f 64 2d 3e 78 4c 6f 63 6b 28 28  pMethod->xLock((
2d440 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 63 6f  sqlite3_file*)co
2d450 6e 63 68 46 69 6c 65 2c 20 6c 6f 63 6b 54 79 70  nchFile, lockTyp
2d460 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e);.        }.  
2d470 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20      }.    }.  } 
2d480 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
2d490 45 5f 42 55 53 59 20 26 26 20 6e 54 72 69 65 73  E_BUSY && nTries
2d4a0 3c 33 20 29 3b 0a 20 20 0a 20 20 72 65 74 75 72  <3 );.  .  retur
2d4b0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 54 61 6b 65  n rc;.}../* Take
2d4c0 73 20 74 68 65 20 63 6f 6e 63 68 20 62 79 20 74  s the conch by t
2d4d0 61 6b 69 6e 67 20 61 20 73 68 61 72 65 64 20 6c  aking a shared l
2d4e0 6f 63 6b 20 61 6e 64 20 72 65 61 64 20 74 68 65  ock and read the
2d4f0 20 63 6f 6e 74 65 6e 74 73 20 63 6f 6e 63 68 2c   contents conch,
2d500 20 69 66 20 0a 2a 2a 20 6c 6f 63 6b 50 61 74 68   if .** lockPath
2d510 20 69 73 20 6e 6f 6e 2d 4e 55 4c 4c 2c 20 74 68   is non-NULL, th
2d520 65 20 68 6f 73 74 20 49 44 20 61 6e 64 20 6c 6f  e host ID and lo
2d530 63 6b 20 66 69 6c 65 20 70 61 74 68 20 6d 75 73  ck file path mus
2d540 74 20 6d 61 74 63 68 2e 20 20 41 20 4e 55 4c 4c  t match.  A NULL
2d550 20 0a 2a 2a 20 6c 6f 63 6b 50 61 74 68 20 6d 65   .** lockPath me
2d560 61 6e 73 20 74 68 61 74 20 74 68 65 20 6c 6f 63  ans that the loc
2d570 6b 50 61 74 68 20 69 6e 20 74 68 65 20 63 6f 6e  kPath in the con
2d580 63 68 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20  ch file will be 
2d590 75 73 65 64 20 69 66 20 74 68 65 20 0a 2a 2a 20  used if the .** 
2d5a0 68 6f 73 74 20 49 44 73 20 6d 61 74 63 68 2c 20  host IDs match, 
2d5b0 6f 72 20 61 20 6e 65 77 20 6c 6f 63 6b 20 70 61  or a new lock pa
2d5c0 74 68 20 77 69 6c 6c 20 62 65 20 67 65 6e 65 72  th will be gener
2d5d0 61 74 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c  ated automatical
2d5e0 6c 79 20 0a 2a 2a 20 61 6e 64 20 77 72 69 74 74  ly .** and writt
2d5f0 65 6e 20 74 6f 20 74 68 65 20 63 6f 6e 63 68 20  en to the conch 
2d600 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
2d610 69 6e 74 20 70 72 6f 78 79 54 61 6b 65 43 6f 6e  int proxyTakeCon
2d620 63 68 28 75 6e 69 78 46 69 6c 65 20 2a 70 46 69  ch(unixFile *pFi
2d630 6c 65 29 7b 0a 20 20 70 72 6f 78 79 4c 6f 63 6b  le){.  proxyLock
2d640 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78  ingContext *pCtx
2d650 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67   = (proxyLocking
2d660 43 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c 65 2d  Context *)pFile-
2d670 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b  >lockingContext;
2d680 20 0a 20 20 0a 20 20 69 66 28 20 70 43 74 78 2d   .  .  if( pCtx-
2d690 3e 63 6f 6e 63 68 48 65 6c 64 21 3d 30 20 29 7b  >conchHeld!=0 ){
2d6a0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2d6b0 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  TE_OK;.  }else{.
2d6c0 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 63 6f      unixFile *co
2d6d0 6e 63 68 46 69 6c 65 20 3d 20 70 43 74 78 2d 3e  nchFile = pCtx->
2d6e0 63 6f 6e 63 68 46 69 6c 65 3b 0a 20 20 20 20 75  conchFile;.    u
2d6f0 75 69 64 5f 74 20 6d 79 48 6f 73 74 49 44 3b 0a  uid_t myHostID;.
2d700 20 20 20 20 69 6e 74 20 70 45 72 72 6f 72 20 3d      int pError =
2d710 20 30 3b 0a 20 20 20 20 63 68 61 72 20 72 65 61   0;.    char rea
2d720 64 42 75 66 5b 50 52 4f 58 59 5f 4d 41 58 43 4f  dBuf[PROXY_MAXCO
2d730 4e 43 48 4c 45 4e 5d 3b 0a 20 20 20 20 63 68 61  NCHLEN];.    cha
2d740 72 20 6c 6f 63 6b 50 61 74 68 5b 4d 41 58 50 41  r lockPath[MAXPA
2d750 54 48 4c 45 4e 5d 3b 0a 20 20 20 20 63 68 61 72  THLEN];.    char
2d760 20 2a 74 65 6d 70 4c 6f 63 6b 50 61 74 68 20 3d   *tempLockPath =
2d770 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 72   NULL;.    int r
2d780 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
2d790 20 20 20 69 6e 74 20 63 72 65 61 74 65 43 6f 6e     int createCon
2d7a0 63 68 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  ch = 0;.    int 
2d7b0 68 6f 73 74 49 64 4d 61 74 63 68 20 3d 20 30 3b  hostIdMatch = 0;
2d7c0 0a 20 20 20 20 69 6e 74 20 72 65 61 64 4c 65 6e  .    int readLen
2d7d0 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 74 72   = 0;.    int tr
2d7e0 79 4f 6c 64 4c 6f 63 6b 50 61 74 68 20 3d 20 30  yOldLockPath = 0
2d7f0 3b 0a 20 20 20 20 69 6e 74 20 66 6f 72 63 65 4e  ;.    int forceN
2d800 65 77 4c 6f 63 6b 50 61 74 68 20 3d 20 30 3b 0a  ewLockPath = 0;.
2d810 20 20 20 20 0a 20 20 20 20 4f 53 54 52 41 43 45      .    OSTRACE
2d820 28 28 22 54 41 4b 45 43 4f 4e 43 48 20 20 25 64  (("TAKECONCH  %d
2d830 20 66 6f 72 20 25 73 20 70 69 64 3d 25 64 5c 6e   for %s pid=%d\n
2d840 22 2c 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c  ", conchFile->h,
2d850 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 28 70  .             (p
2d860 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61  Ctx->lockProxyPa
2d870 74 68 20 3f 20 70 43 74 78 2d 3e 6c 6f 63 6b 50  th ? pCtx->lockP
2d880 72 6f 78 79 50 61 74 68 20 3a 20 22 3a 61 75 74  roxyPath : ":aut
2d890 6f 3a 22 29 2c 20 67 65 74 70 69 64 28 29 29 29  o:"), getpid()))
2d8a0 3b 0a 0a 20 20 20 20 72 63 20 3d 20 70 72 6f 78  ;..    rc = prox
2d8b0 79 47 65 74 48 6f 73 74 49 44 28 6d 79 48 6f 73  yGetHostID(myHos
2d8c0 74 49 44 2c 20 26 70 45 72 72 6f 72 29 3b 0a 20  tID, &pError);. 
2d8d0 20 20 20 69 66 28 20 28 72 63 26 30 78 66 66 29     if( (rc&0xff)
2d8e0 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 29  ==SQLITE_IOERR )
2d8f0 7b 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e 6c  {.      pFile->l
2d900 61 73 74 45 72 72 6e 6f 20 3d 20 70 45 72 72 6f  astErrno = pErro
2d910 72 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e  r;.      goto en
2d920 64 5f 74 61 6b 65 63 6f 6e 63 68 3b 0a 20 20 20  d_takeconch;.   
2d930 20 7d 0a 20 20 20 20 72 63 20 3d 20 70 72 6f 78   }.    rc = prox
2d940 79 43 6f 6e 63 68 4c 6f 63 6b 28 70 46 69 6c 65  yConchLock(pFile
2d950 2c 20 6d 79 48 6f 73 74 49 44 2c 20 53 48 41 52  , myHostID, SHAR
2d960 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66  ED_LOCK);.    if
2d970 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2d980 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e  ){.      goto en
2d990 64 5f 74 61 6b 65 63 6f 6e 63 68 3b 0a 20 20 20  d_takeconch;.   
2d9a0 20 7d 0a 20 20 20 20 2f 2a 20 72 65 61 64 20 74   }.    /* read t
2d9b0 68 65 20 65 78 69 73 74 69 6e 67 20 63 6f 6e 63  he existing conc
2d9c0 68 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 72 65  h file */.    re
2d9d0 61 64 4c 65 6e 20 3d 20 73 65 65 6b 41 6e 64 52  adLen = seekAndR
2d9e0 65 61 64 28 28 75 6e 69 78 46 69 6c 65 2a 29 63  ead((unixFile*)c
2d9f0 6f 6e 63 68 46 69 6c 65 2c 20 30 2c 20 72 65 61  onchFile, 0, rea
2da00 64 42 75 66 2c 20 50 52 4f 58 59 5f 4d 41 58 43  dBuf, PROXY_MAXC
2da10 4f 4e 43 48 4c 45 4e 29 3b 0a 20 20 20 20 69 66  ONCHLEN);.    if
2da20 28 20 72 65 61 64 4c 65 6e 3c 30 20 29 7b 0a 20  ( readLen<0 ){. 
2da30 20 20 20 20 20 2f 2a 20 49 2f 4f 20 65 72 72 6f       /* I/O erro
2da40 72 3a 20 6c 61 73 74 45 72 72 6e 6f 20 73 65 74  r: lastErrno set
2da50 20 62 79 20 73 65 65 6b 41 6e 64 52 65 61 64 20   by seekAndRead 
2da60 2a 2f 0a 20 20 20 20 20 20 70 46 69 6c 65 2d 3e  */.      pFile->
2da70 6c 61 73 74 45 72 72 6e 6f 20 3d 20 63 6f 6e 63  lastErrno = conc
2da80 68 46 69 6c 65 2d 3e 6c 61 73 74 45 72 72 6e 6f  hFile->lastErrno
2da90 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  ;.      rc = SQL
2daa0 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44 3b 0a  ITE_IOERR_READ;.
2dab0 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 74        goto end_t
2dac0 61 6b 65 63 6f 6e 63 68 3b 0a 20 20 20 20 7d 65  akeconch;.    }e
2dad0 6c 73 65 20 69 66 28 20 72 65 61 64 4c 65 6e 3c  lse if( readLen<
2dae0 3d 28 50 52 4f 58 59 5f 48 45 41 44 45 52 4c 45  =(PROXY_HEADERLE
2daf0 4e 2b 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45  N+PROXY_HOSTIDLE
2db00 4e 29 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20  N) || .         
2db10 20 20 20 20 72 65 61 64 42 75 66 5b 30 5d 21 3d      readBuf[0]!=
2db20 28 63 68 61 72 29 50 52 4f 58 59 5f 43 4f 4e 43  (char)PROXY_CONC
2db30 48 56 45 52 53 49 4f 4e 20 29 7b 0a 20 20 20 20  HVERSION ){.    
2db40 20 20 2f 2a 20 61 20 73 68 6f 72 74 20 72 65 61    /* a short rea
2db50 64 20 6f 72 20 76 65 72 73 69 6f 6e 20 66 6f 72  d or version for
2db60 6d 61 74 20 6d 69 73 6d 61 74 63 68 20 6d 65 61  mat mismatch mea
2db70 6e 73 20 77 65 20 6e 65 65 64 20 74 6f 20 63 72  ns we need to cr
2db80 65 61 74 65 20 61 20 6e 65 77 20 0a 20 20 20 20  eate a new .    
2db90 20 20 2a 2a 20 63 6f 6e 63 68 20 66 69 6c 65 2e    ** conch file.
2dba0 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20   .      */.     
2dbb0 20 63 72 65 61 74 65 43 6f 6e 63 68 20 3d 20 31   createConch = 1
2dbc0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 69  ;.    }.    /* i
2dbd0 66 20 74 68 65 20 68 6f 73 74 20 69 64 20 6d 61  f the host id ma
2dbe0 74 63 68 65 73 20 61 6e 64 20 74 68 65 20 6c 6f  tches and the lo
2dbf0 63 6b 20 70 61 74 68 20 61 6c 72 65 61 64 79 20  ck path already 
2dc00 65 78 69 73 74 73 20 69 6e 20 74 68 65 20 63 6f  exists in the co
2dc10 6e 63 68 0a 20 20 20 20 2a 2a 20 77 65 27 6c 6c  nch.    ** we'll
2dc20 20 74 72 79 20 74 6f 20 75 73 65 20 74 68 65 20   try to use the 
2dc30 70 61 74 68 20 74 68 65 72 65 2c 20 69 66 20 77  path there, if w
2dc40 65 20 63 61 6e 27 74 20 6f 70 65 6e 20 74 68 61  e can't open tha
2dc50 74 20 70 61 74 68 2c 20 77 65 27 6c 6c 20 0a 20  t path, we'll . 
2dc60 20 20 20 2a 2a 20 72 65 74 72 79 20 77 69 74 68     ** retry with
2dc70 20 61 20 6e 65 77 20 61 75 74 6f 2d 67 65 6e 65   a new auto-gene
2dc80 72 61 74 65 64 20 70 61 74 68 20 0a 20 20 20 20  rated path .    
2dc90 2a 2f 0a 20 20 20 20 64 6f 20 7b 20 2f 2a 20 69  */.    do { /* i
2dca0 6e 20 63 61 73 65 20 77 65 20 6e 65 65 64 20 74  n case we need t
2dcb0 6f 20 74 72 79 20 61 67 61 69 6e 20 66 6f 72 20  o try again for 
2dcc0 61 6e 20 3a 61 75 74 6f 3a 20 6e 61 6d 65 64 20  an :auto: named 
2dcd0 6c 6f 63 6b 20 66 69 6c 65 20 2a 2f 0a 0a 20 20  lock file */..  
2dce0 20 20 20 20 69 66 28 20 21 63 72 65 61 74 65 43      if( !createC
2dcf0 6f 6e 63 68 20 26 26 20 21 66 6f 72 63 65 4e 65  onch && !forceNe
2dd00 77 4c 6f 63 6b 50 61 74 68 20 29 7b 0a 20 20 20  wLockPath ){.   
2dd10 20 20 20 20 20 68 6f 73 74 49 64 4d 61 74 63 68       hostIdMatch
2dd20 20 3d 20 21 6d 65 6d 63 6d 70 28 26 72 65 61 64   = !memcmp(&read
2dd30 42 75 66 5b 50 52 4f 58 59 5f 48 45 41 44 45 52  Buf[PROXY_HEADER
2dd40 4c 45 4e 5d 2c 20 6d 79 48 6f 73 74 49 44 2c 20  LEN], myHostID, 
2dd50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2dd60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dd70 20 20 20 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c     PROXY_HOSTIDL
2dd80 45 4e 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  EN);.        /* 
2dd90 69 66 20 74 68 65 20 63 6f 6e 63 68 20 68 61 73  if the conch has
2dda0 20 64 61 74 61 20 63 6f 6d 70 61 72 65 20 74 68   data compare th
2ddb0 65 20 63 6f 6e 74 65 6e 74 73 20 2a 2f 0a 20 20  e contents */.  
2ddc0 20 20 20 20 20 20 69 66 28 20 21 70 43 74 78 2d        if( !pCtx-
2ddd0 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 29  >lockProxyPath )
2dde0 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66  {.          /* f
2ddf0 6f 72 20 61 75 74 6f 2d 6e 61 6d 65 64 20 6c 6f  or auto-named lo
2de00 63 61 6c 20 6c 6f 63 6b 20 66 69 6c 65 2c 20 6a  cal lock file, j
2de10 75 73 74 20 63 68 65 63 6b 20 74 68 65 20 68 6f  ust check the ho
2de20 73 74 20 49 44 20 61 6e 64 20 77 65 27 6c 6c 0a  st ID and we'll.
2de30 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 75 73             ** us
2de40 65 20 74 68 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b  e the local lock
2de50 20 66 69 6c 65 20 70 61 74 68 20 74 68 61 74 27   file path that'
2de60 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  s already in the
2de70 72 65 0a 20 20 20 20 20 20 20 20 20 20 20 2a 2f  re.           */
2de80 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 68  .          if( h
2de90 6f 73 74 49 64 4d 61 74 63 68 20 29 7b 0a 20 20  ostIdMatch ){.  
2dea0 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 5f 74            size_t
2deb0 20 70 61 74 68 4c 65 6e 20 3d 20 28 72 65 61 64   pathLen = (read
2dec0 4c 65 6e 20 2d 20 50 52 4f 58 59 5f 50 41 54 48  Len - PROXY_PATH
2ded0 49 4e 44 45 58 29 3b 0a 20 20 20 20 20 20 20 20  INDEX);.        
2dee0 20 20 20 20 0a 20 20 20 20 20 20 20 20 20 20 20      .           
2def0 20 69 66 28 20 70 61 74 68 4c 65 6e 3e 3d 4d 41   if( pathLen>=MA
2df00 58 50 41 54 48 4c 45 4e 20 29 7b 0a 20 20 20 20  XPATHLEN ){.    
2df10 20 20 20 20 20 20 20 20 20 20 70 61 74 68 4c 65            pathLe
2df20 6e 3d 4d 41 58 50 41 54 48 4c 45 4e 2d 31 3b 0a  n=MAXPATHLEN-1;.
2df30 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
2df40 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
2df50 28 6c 6f 63 6b 50 61 74 68 2c 20 26 72 65 61 64  (lockPath, &read
2df60 42 75 66 5b 50 52 4f 58 59 5f 50 41 54 48 49 4e  Buf[PROXY_PATHIN
2df70 44 45 58 5d 2c 20 70 61 74 68 4c 65 6e 29 3b 0a  DEX], pathLen);.
2df80 20 20 20 20 20 20 20 20 20 20 20 20 6c 6f 63 6b              lock
2df90 50 61 74 68 5b 70 61 74 68 4c 65 6e 5d 20 3d 20  Path[pathLen] = 
2dfa0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  0;.            t
2dfb0 65 6d 70 4c 6f 63 6b 50 61 74 68 20 3d 20 6c 6f  empLockPath = lo
2dfc0 63 6b 50 61 74 68 3b 0a 20 20 20 20 20 20 20 20  ckPath;.        
2dfd0 20 20 20 20 74 72 79 4f 6c 64 4c 6f 63 6b 50 61      tryOldLockPa
2dfe0 74 68 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  th = 1;.        
2dff0 20 20 20 20 2f 2a 20 63 72 65 61 74 65 20 61 20      /* create a 
2e000 63 6f 70 79 20 6f 66 20 74 68 65 20 6c 6f 63 6b  copy of the lock
2e010 20 70 61 74 68 20 69 66 20 74 68 65 20 63 6f 6e   path if the con
2e020 63 68 20 69 73 20 74 61 6b 65 6e 20 2a 2f 0a 20  ch is taken */. 
2e030 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
2e040 65 6e 64 5f 74 61 6b 65 63 6f 6e 63 68 3b 0a 20  end_takeconch;. 
2e050 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2e060 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68 6f 73     }else if( hos
2e070 74 49 64 4d 61 74 63 68 0a 20 20 20 20 20 20 20  tIdMatch.       
2e080 20 20 20 20 20 20 20 20 26 26 20 21 73 74 72 6e          && !strn
2e090 63 6d 70 28 70 43 74 78 2d 3e 6c 6f 63 6b 50 72  cmp(pCtx->lockPr
2e0a0 6f 78 79 50 61 74 68 2c 20 26 72 65 61 64 42 75  oxyPath, &readBu
2e0b0 66 5b 50 52 4f 58 59 5f 50 41 54 48 49 4e 44 45  f[PROXY_PATHINDE
2e0c0 58 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  X],.            
2e0d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
2e0e0 65 61 64 4c 65 6e 2d 50 52 4f 58 59 5f 50 41 54  eadLen-PROXY_PAT
2e0f0 48 49 4e 44 45 58 29 0a 20 20 20 20 20 20 20 20  HINDEX).        
2e100 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
2e110 63 6f 6e 63 68 20 68 6f 73 74 20 61 6e 64 20 6c  conch host and l
2e120 6f 63 6b 20 70 61 74 68 20 6d 61 74 63 68 20 2a  ock path match *
2e130 2f 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  /.          goto
2e140 20 65 6e 64 5f 74 61 6b 65 63 6f 6e 63 68 3b 20   end_takeconch; 
2e150 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2e160 20 7d 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20   }.      .      
2e170 2f 2a 20 69 66 20 74 68 65 20 63 6f 6e 63 68 20  /* if the conch 
2e180 69 73 6e 27 74 20 77 72 69 74 61 62 6c 65 20 61  isn't writable a
2e190 6e 64 20 64 6f 65 73 6e 27 74 20 6d 61 74 63 68  nd doesn't match
2e1a0 2c 20 77 65 20 63 61 6e 27 74 20 74 61 6b 65 20  , we can't take 
2e1b0 69 74 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  it */.      if( 
2e1c0 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 6f 70 65 6e  (conchFile->open
2e1d0 46 6c 61 67 73 26 4f 5f 52 44 57 52 29 20 3d 3d  Flags&O_RDWR) ==
2e1e0 20 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63   0 ){.        rc
2e1f0 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
2e200 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
2e210 5f 74 61 6b 65 63 6f 6e 63 68 3b 0a 20 20 20 20  _takeconch;.    
2e220 20 20 7d 0a 20 20 20 20 20 20 0a 20 20 20 20 20    }.      .     
2e230 20 2f 2a 20 65 69 74 68 65 72 20 74 68 65 20 63   /* either the c
2e240 6f 6e 63 68 20 64 69 64 6e 27 74 20 6d 61 74 63  onch didn't matc
2e250 68 20 6f 72 20 77 65 20 6e 65 65 64 20 74 6f 20  h or we need to 
2e260 63 72 65 61 74 65 20 61 20 6e 65 77 20 6f 6e 65  create a new one
2e270 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 21 70   */.      if( !p
2e280 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61  Ctx->lockProxyPa
2e290 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20 70 72  th ){.        pr
2e2a0 6f 78 79 47 65 74 4c 6f 63 6b 50 61 74 68 28 70  oxyGetLockPath(p
2e2b0 43 74 78 2d 3e 64 62 50 61 74 68 2c 20 6c 6f 63  Ctx->dbPath, loc
2e2c0 6b 50 61 74 68 2c 20 4d 41 58 50 41 54 48 4c 45  kPath, MAXPATHLE
2e2d0 4e 29 3b 0a 20 20 20 20 20 20 20 20 74 65 6d 70  N);.        temp
2e2e0 4c 6f 63 6b 50 61 74 68 20 3d 20 6c 6f 63 6b 50  LockPath = lockP
2e2f0 61 74 68 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ath;.        /* 
2e300 63 72 65 61 74 65 20 61 20 63 6f 70 79 20 6f 66  create a copy of
2e310 20 74 68 65 20 6c 6f 63 6b 20 70 61 74 68 20 5f   the lock path _
2e320 6f 6e 6c 79 5f 20 69 66 20 74 68 65 20 63 6f 6e  only_ if the con
2e330 63 68 20 69 73 20 74 61 6b 65 6e 20 2a 2f 0a 20  ch is taken */. 
2e340 20 20 20 20 20 7d 0a 20 20 20 20 20 20 0a 20 20       }.      .  
2e350 20 20 20 20 2f 2a 20 75 70 64 61 74 65 20 63 6f      /* update co
2e360 6e 63 68 20 77 69 74 68 20 68 6f 73 74 20 61 6e  nch with host an
2e370 64 20 70 61 74 68 20 28 74 68 69 73 20 77 69 6c  d path (this wil
2e380 6c 20 66 61 69 6c 20 69 66 20 6f 74 68 65 72 20  l fail if other 
2e390 70 72 6f 63 65 73 73 0a 20 20 20 20 20 20 2a 2a  process.      **
2e3a0 20 68 61 73 20 61 20 73 68 61 72 65 64 20 6c 6f   has a shared lo
2e3b0 63 6b 20 61 6c 72 65 61 64 79 29 2c 20 69 66 20  ck already), if 
2e3c0 74 68 65 20 68 6f 73 74 20 69 64 20 6d 61 74 63  the host id matc
2e3d0 68 65 73 2c 20 75 73 65 20 74 68 65 20 62 69 67  hes, use the big
2e3e0 0a 20 20 20 20 20 20 2a 2a 20 73 74 69 63 6b 2e  .      ** stick.
2e3f0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
2e400 66 75 74 69 6d 65 73 28 63 6f 6e 63 68 46 69 6c  futimes(conchFil
2e410 65 2d 3e 68 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20  e->h, NULL);.   
2e420 20 20 20 69 66 28 20 68 6f 73 74 49 64 4d 61 74     if( hostIdMat
2e430 63 68 20 26 26 20 21 63 72 65 61 74 65 43 6f 6e  ch && !createCon
2e440 63 68 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  ch ){.        if
2e450 28 20 63 6f 6e 63 68 46 69 6c 65 2d 3e 70 49 6e  ( conchFile->pIn
2e460 6f 64 65 20 26 26 20 63 6f 6e 63 68 46 69 6c 65  ode && conchFile
2e470 2d 3e 70 49 6e 6f 64 65 2d 3e 6e 53 68 61 72 65  ->pInode->nShare
2e480 64 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20  d>1 ){.         
2e490 20 2f 2a 20 57 65 20 61 72 65 20 74 72 79 69 6e   /* We are tryin
2e4a0 67 20 66 6f 72 20 61 6e 20 65 78 63 6c 75 73 69  g for an exclusi
2e4b0 76 65 20 6c 6f 63 6b 20 62 75 74 20 61 6e 6f 74  ve lock but anot
2e4c0 68 65 72 20 74 68 72 65 61 64 20 69 6e 20 74 68  her thread in th
2e4d0 69 73 0a 20 20 20 20 20 20 20 20 20 20 20 2a 2a  is.           **
2e4e0 20 73 61 6d 65 20 70 72 6f 63 65 73 73 20 69 73   same process is
2e4f0 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20 61   still holding a
2e500 20 73 68 61 72 65 64 20 6c 6f 63 6b 2e 20 2a 2f   shared lock. */
2e510 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
2e520 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
2e530 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 20 20 20       } else {   
2e540 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20         .        
2e550 20 20 72 63 20 3d 20 70 72 6f 78 79 43 6f 6e 63    rc = proxyConc
2e560 68 4c 6f 63 6b 28 70 46 69 6c 65 2c 20 6d 79 48  hLock(pFile, myH
2e570 6f 73 74 49 44 2c 20 45 58 43 4c 55 53 49 56 45  ostID, EXCLUSIVE
2e580 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20  _LOCK);.        
2e590 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
2e5a0 20 20 20 20 20 20 20 72 63 20 3d 20 63 6f 6e 63         rc = conc
2e5b0 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e  hFile->pMethod->
2e5c0 78 4c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66  xLock((sqlite3_f
2e5d0 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20  ile*)conchFile, 
2e5e0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b  EXCLUSIVE_LOCK);
2e5f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
2e600 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2e610 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72   ){.        char
2e620 20 77 72 69 74 65 42 75 66 66 65 72 5b 50 52 4f   writeBuffer[PRO
2e630 58 59 5f 4d 41 58 43 4f 4e 43 48 4c 45 4e 5d 3b  XY_MAXCONCHLEN];
2e640 0a 20 20 20 20 20 20 20 20 69 6e 74 20 77 72 69  .        int wri
2e650 74 65 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20  teSize = 0;.    
2e660 20 20 20 20 0a 20 20 20 20 20 20 20 20 77 72 69      .        wri
2e670 74 65 42 75 66 66 65 72 5b 30 5d 20 3d 20 28 63  teBuffer[0] = (c
2e680 68 61 72 29 50 52 4f 58 59 5f 43 4f 4e 43 48 56  har)PROXY_CONCHV
2e690 45 52 53 49 4f 4e 3b 0a 20 20 20 20 20 20 20 20  ERSION;.        
2e6a0 6d 65 6d 63 70 79 28 26 77 72 69 74 65 42 75 66  memcpy(&writeBuf
2e6b0 66 65 72 5b 50 52 4f 58 59 5f 48 45 41 44 45 52  fer[PROXY_HEADER
2e6c0 4c 45 4e 5d 2c 20 6d 79 48 6f 73 74 49 44 2c 20  LEN], myHostID, 
2e6d0 50 52 4f 58 59 5f 48 4f 53 54 49 44 4c 45 4e 29  PROXY_HOSTIDLEN)
2e6e0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43  ;.        if( pC
2e6f0 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74  tx->lockProxyPat
2e700 68 21 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 20  h!=NULL ){.     
2e710 20 20 20 20 20 73 74 72 6c 63 70 79 28 26 77 72       strlcpy(&wr
2e720 69 74 65 42 75 66 66 65 72 5b 50 52 4f 58 59 5f  iteBuffer[PROXY_
2e730 50 41 54 48 49 4e 44 45 58 5d 2c 20 70 43 74 78  PATHINDEX], pCtx
2e740 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 2c  ->lockProxyPath,
2e750 20 4d 41 58 50 41 54 48 4c 45 4e 29 3b 0a 20 20   MAXPATHLEN);.  
2e760 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2e770 20 20 20 20 20 20 20 73 74 72 6c 63 70 79 28 26         strlcpy(&
2e780 77 72 69 74 65 42 75 66 66 65 72 5b 50 52 4f 58  writeBuffer[PROX
2e790 59 5f 50 41 54 48 49 4e 44 45 58 5d 2c 20 74 65  Y_PATHINDEX], te
2e7a0 6d 70 4c 6f 63 6b 50 61 74 68 2c 20 4d 41 58 50  mpLockPath, MAXP
2e7b0 41 54 48 4c 45 4e 29 3b 0a 20 20 20 20 20 20 20  ATHLEN);.       
2e7c0 20 7d 0a 20 20 20 20 20 20 20 20 77 72 69 74 65   }.        write
2e7d0 53 69 7a 65 20 3d 20 50 52 4f 58 59 5f 50 41 54  Size = PROXY_PAT
2e7e0 48 49 4e 44 45 58 20 2b 20 73 74 72 6c 65 6e 28  HINDEX + strlen(
2e7f0 26 77 72 69 74 65 42 75 66 66 65 72 5b 50 52 4f  &writeBuffer[PRO
2e800 58 59 5f 50 41 54 48 49 4e 44 45 58 5d 29 3b 0a  XY_PATHINDEX]);.
2e810 20 20 20 20 20 20 20 20 66 74 72 75 6e 63 61 74          ftruncat
2e820 65 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20  e(conchFile->h, 
2e830 77 72 69 74 65 53 69 7a 65 29 3b 0a 20 20 20 20  writeSize);.    
2e840 20 20 20 20 72 63 20 3d 20 75 6e 69 78 57 72 69      rc = unixWri
2e850 74 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  te((sqlite3_file
2e860 20 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20 77 72   *)conchFile, wr
2e870 69 74 65 42 75 66 66 65 72 2c 20 77 72 69 74 65  iteBuffer, write
2e880 53 69 7a 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  Size, 0);.      
2e890 20 20 66 73 79 6e 63 28 63 6f 6e 63 68 46 69 6c    fsync(conchFil
2e8a0 65 2d 3e 68 29 3b 0a 20 20 20 20 20 20 20 20 2f  e->h);.        /
2e8b0 2a 20 49 66 20 77 65 20 63 72 65 61 74 65 64 20  * If we created 
2e8c0 61 20 6e 65 77 20 63 6f 6e 63 68 20 66 69 6c 65  a new conch file
2e8d0 20 28 6e 6f 74 20 6a 75 73 74 20 75 70 64 61 74   (not just updat
2e8e0 65 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  ed the contents 
2e8f0 6f 66 20 61 20 0a 20 20 20 20 20 20 20 20 20 2a  of a .         *
2e900 2a 20 76 61 6c 69 64 20 63 6f 6e 63 68 20 66 69  * valid conch fi
2e910 6c 65 29 2c 20 74 72 79 20 74 6f 20 6d 61 74 63  le), try to matc
2e920 68 20 74 68 65 20 70 65 72 6d 69 73 73 69 6f 6e  h the permission
2e930 73 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  s of the databas
2e940 65 20 0a 20 20 20 20 20 20 20 20 20 2a 2f 0a 20  e .         */. 
2e950 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
2e960 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 72 65 61  QLITE_OK && crea
2e970 74 65 43 6f 6e 63 68 20 29 7b 0a 20 20 20 20 20  teConch ){.     
2e980 20 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74       struct stat
2e990 20 62 75 66 3b 0a 20 20 20 20 20 20 20 20 20 20   buf;.          
2e9a0 69 6e 74 20 65 72 72 20 3d 20 66 73 74 61 74 28  int err = fstat(
2e9b0 70 46 69 6c 65 2d 3e 68 2c 20 26 62 75 66 29 3b  pFile->h, &buf);
2e9c0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 65  .          if( e
2e9d0 72 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  rr==0 ){.       
2e9e0 20 20 20 20 20 6d 6f 64 65 5f 74 20 63 6d 6f 64       mode_t cmod
2e9f0 65 20 3d 20 62 75 66 2e 73 74 5f 6d 6f 64 65 26  e = buf.st_mode&
2ea00 28 53 5f 49 52 55 53 52 7c 53 5f 49 57 55 53 52  (S_IRUSR|S_IWUSR
2ea10 20 7c 20 53 5f 49 52 47 52 50 7c 53 5f 49 57 47   | S_IRGRP|S_IWG
2ea20 52 50 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20  RP |.           
2ea30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ea40 20 20 20 20 20 20 20 20 20 20 20 20 20 53 5f 49               S_I
2ea50 52 4f 54 48 7c 53 5f 49 57 4f 54 48 29 3b 0a 20  ROTH|S_IWOTH);. 
2ea60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74 72             /* tr
2ea70 79 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20 64  y to match the d
2ea80 61 74 61 62 61 73 65 20 66 69 6c 65 20 52 2f 57  atabase file R/W
2ea90 20 70 65 72 6d 69 73 73 69 6f 6e 73 2c 20 69 67   permissions, ig
2eaa0 6e 6f 72 65 20 66 61 69 6c 75 72 65 20 2a 2f 0a  nore failure */.
2eab0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 50  #ifndef SQLITE_P
2eac0 52 4f 58 59 5f 44 45 42 55 47 0a 20 20 20 20 20  ROXY_DEBUG.     
2ead0 20 20 20 20 20 20 20 66 63 68 6d 6f 64 28 63 6f         fchmod(co
2eae0 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 63 6d 6f 64  nchFile->h, cmod
2eaf0 65 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20  e);.#else.      
2eb00 20 20 20 20 20 20 69 66 28 20 66 63 68 6d 6f 64        if( fchmod
2eb10 28 63 6f 6e 63 68 46 69 6c 65 2d 3e 68 2c 20 63  (conchFile->h, c
2eb20 6d 6f 64 65 29 21 3d 30 20 29 7b 0a 20 20 20 20  mode)!=0 ){.    
2eb30 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 63 6f            int co
2eb40 64 65 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20  de = errno;.    
2eb50 20 20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74            fprint
2eb60 66 28 73 74 64 65 72 72 2c 20 22 66 63 68 6d 6f  f(stderr, "fchmo
2eb70 64 20 25 6f 20 46 41 49 4c 45 44 20 77 69 74 68  d %o FAILED with
2eb80 20 25 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20   %d %s\n",.     
2eb90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2eba0 20 63 6d 6f 64 65 2c 20 63 6f 64 65 2c 20 73 74   cmode, code, st
2ebb0 72 65 72 72 6f 72 28 63 6f 64 65 29 29 3b 0a 20  rerror(code));. 
2ebc0 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73             } els
2ebd0 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e {.            
2ebe0 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
2ebf0 2c 20 22 66 63 68 6d 6f 64 20 25 6f 20 53 55 43  , "fchmod %o SUC
2ec00 43 45 44 45 44 5c 6e 22 2c 63 6d 6f 64 65 29 3b  CEDED\n",cmode);
2ec10 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
2ec20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
2ec30 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
2ec40 63 6f 64 65 20 3d 20 65 72 72 6e 6f 3b 0a 20 20  code = errno;.  
2ec50 20 20 20 20 20 20 20 20 20 20 66 70 72 69 6e 74            fprint
2ec60 66 28 73 74 64 65 72 72 2c 20 22 53 54 41 54 20  f(stderr, "STAT 
2ec70 46 41 49 4c 45 44 5b 25 64 5d 20 77 69 74 68 20  FAILED[%d] with 
2ec80 25 64 20 25 73 5c 6e 22 2c 20 0a 20 20 20 20 20  %d %s\n", .     
2ec90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65                 e
2eca0 72 72 2c 20 63 6f 64 65 2c 20 73 74 72 65 72 72  rr, code, strerr
2ecb0 6f 72 28 63 6f 64 65 29 29 3b 0a 23 65 6e 64 69  or(code));.#endi
2ecc0 66 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  f.          }.  
2ecd0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
2ece0 20 20 20 20 20 20 63 6f 6e 63 68 46 69 6c 65 2d        conchFile-
2ecf0 3e 70 4d 65 74 68 6f 64 2d 3e 78 55 6e 6c 6f 63  >pMethod->xUnloc
2ed00 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  k((sqlite3_file*
2ed10 29 63 6f 6e 63 68 46 69 6c 65 2c 20 53 48 41 52  )conchFile, SHAR
2ed20 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  ED_LOCK);.      
2ed30 0a 20 20 20 20 65 6e 64 5f 74 61 6b 65 63 6f 6e  .    end_takecon
2ed40 63 68 3a 0a 20 20 20 20 20 20 4f 53 54 52 41 43  ch:.      OSTRAC
2ed50 45 28 28 22 54 52 41 4e 53 50 52 4f 58 59 3a 20  E(("TRANSPROXY: 
2ed60 43 4c 4f 53 45 20 20 25 64 5c 6e 22 2c 20 70 46  CLOSE  %d\n", pF
2ed70 69 6c 65 2d 3e 68 29 29 3b 0a 20 20 20 20 20 20  ile->h));.      
2ed80 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2ed90 4b 20 26 26 20 70 46 69 6c 65 2d 3e 6f 70 65 6e  K && pFile->open
2eda0 46 6c 61 67 73 20 29 7b 0a 20 20 20 20 20 20 20  Flags ){.       
2edb0 20 69 66 28 20 70 46 69 6c 65 2d 3e 68 3e 3d 30   if( pFile->h>=0
2edc0 20 29 7b 0a 23 69 66 64 65 66 20 53 54 52 49 43   ){.#ifdef STRIC
2edd0 54 5f 43 4c 4f 53 45 5f 45 52 52 4f 52 0a 20 20  T_CLOSE_ERROR.  
2ede0 20 20 20 20 20 20 20 20 69 66 28 20 63 6c 6f 73          if( clos
2edf0 65 28 70 46 69 6c 65 2d 3e 68 29 20 29 7b 0a 20  e(pFile->h) ){. 
2ee00 20 20 20 20 20 20 20 20 20 20 20 70 46 69 6c 65             pFile
2ee10 2d 3e 6c 61 73 74 45 72 72 6e 6f 20 3d 20 65 72  ->lastErrno = er
2ee20 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 20 20 20  rno;.           
2ee30 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
2ee40 4f 45 52 52 5f 43 4c 4f 53 45 3b 0a 20 20 20 20  OERR_CLOSE;.    
2ee50 20 20 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20        }.#else.  
2ee60 20 20 20 20 20 20 20 20 63 6c 6f 73 65 28 70 46          close(pF
2ee70 69 6c 65 2d 3e 68 29 3b 20 2f 2a 20 73 69 6c 65  ile->h); /* sile
2ee80 6e 74 6c 79 20 6c 65 61 6b 20 66 64 20 69 66 20  ntly leak fd if 
2ee90 66 61 69 6c 20 2a 2f 0a 23 65 6e 64 69 66 0a 20  fail */.#endif. 
2eea0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2eeb0 20 70 46 69 6c 65 2d 3e 68 20 3d 20 2d 31 3b 0a   pFile->h = -1;.
2eec0 20 20 20 20 20 20 20 20 69 6e 74 20 66 64 20 3d          int fd =
2eed0 20 6f 70 65 6e 28 70 43 74 78 2d 3e 64 62 50 61   open(pCtx->dbPa
2eee0 74 68 2c 20 70 46 69 6c 65 2d 3e 6f 70 65 6e 46  th, pFile->openF
2eef0 6c 61 67 73 2c 0a 20 20 20 20 20 20 20 20 20 20  lags,.          
2ef00 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
2ef10 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f  TE_DEFAULT_FILE_
2ef20 50 45 52 4d 49 53 53 49 4f 4e 53 29 3b 0a 20 20  PERMISSIONS);.  
2ef30 20 20 20 20 20 20 4f 53 54 52 41 43 45 28 28 22        OSTRACE(("
2ef40 54 52 41 4e 53 50 52 4f 58 59 3a 20 4f 50 45 4e  TRANSPROXY: OPEN
2ef50 20 20 25 64 5c 6e 22 2c 20 66 64 29 29 3b 0a 20    %d\n", fd));. 
2ef60 20 20 20 20 20 20 20 69 66 28 20 66 64 3e 3d 30         if( fd>=0
2ef70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 46   ){.          pF
2ef80 69 6c 65 2d 3e 68 20 3d 20 66 64 3b 0a 20 20 20  ile->h = fd;.   
2ef90 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2efa0 20 20 20 20 20 20 72 63 3d 53 51 4c 49 54 45 5f        rc=SQLITE_
2efb0 43 41 4e 54 4f 50 45 4e 5f 42 4b 50 54 3b 20 2f  CANTOPEN_BKPT; /
2efc0 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 3f 20 70  * SQLITE_BUSY? p
2efd0 72 6f 78 79 54 61 6b 65 43 6f 6e 63 68 20 63 61  roxyTakeConch ca
2efe0 6c 6c 65 64 0a 20 20 20 20 20 20 20 20 20 20 20  lled.           
2eff0 64 75 72 69 6e 67 20 6c 6f 63 6b 69 6e 67 20 2a  during locking *
2f000 2f 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  /.        }.    
2f010 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
2f020 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21  ==SQLITE_OK && !
2f030 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 20  pCtx->lockProxy 
2f040 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
2f050 2a 70 61 74 68 20 3d 20 74 65 6d 70 4c 6f 63 6b  *path = tempLock
2f060 50 61 74 68 20 3f 20 74 65 6d 70 4c 6f 63 6b 50  Path ? tempLockP
2f070 61 74 68 20 3a 20 70 43 74 78 2d 3e 6c 6f 63 6b  ath : pCtx->lock
2f080 50 72 6f 78 79 50 61 74 68 3b 0a 20 20 20 20 20  ProxyPath;.     
2f090 20 20 20 72 63 20 3d 20 70 72 6f 78 79 43 72 65     rc = proxyCre
2f0a0 61 74 65 55 6e 69 78 46 69 6c 65 28 70 61 74 68  ateUnixFile(path
2f0b0 2c 20 26 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f  , &pCtx->lockPro
2f0c0 78 79 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  xy, 1);.        
2f0d0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2f0e0 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f  K && rc!=SQLITE_
2f0f0 4e 4f 4d 45 4d 20 26 26 20 74 72 79 4f 6c 64 4c  NOMEM && tryOldL
2f100 6f 63 6b 50 61 74 68 20 29 7b 0a 20 20 20 20 20  ockPath ){.     
2f110 20 20 20 20 20 2f 2a 20 77 65 20 63 6f 75 6c 64       /* we could
2f120 6e 27 74 20 63 72 65 61 74 65 20 74 68 65 20 70  n't create the p
2f130 72 6f 78 79 20 6c 6f 63 6b 20 66 69 6c 65 20 77  roxy lock file w
2f140 69 74 68 20 74 68 65 20 6f 6c 64 20 6c 6f 63 6b  ith the old lock
2f150 20 66 69 6c 65 20 70 61 74 68 0a 20 20 20 20 20   file path.     
2f160 20 20 20 20 20 20 2a 2a 20 73 6f 20 74 72 79 20        ** so try 
2f170 61 67 61 69 6e 20 76 69 61 20 61 75 74 6f 2d 6e  again via auto-n
2f180 61 6d 69 6e 67 20 0a 20 20 20 20 20 20 20 20 20  aming .         
2f190 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 66    */.          f
2f1a0 6f 72 63 65 4e 65 77 4c 6f 63 6b 50 61 74 68 20  orceNewLockPath 
2f1b0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 74  = 1;.          t
2f1c0 72 79 4f 6c 64 4c 6f 63 6b 50 61 74 68 20 3d 20  ryOldLockPath = 
2f1d0 30 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e  0;.          con
2f1e0 74 69 6e 75 65 3b 20 2f 2a 20 67 6f 20 62 61 63  tinue; /* go bac
2f1f0 6b 20 74 6f 20 74 68 65 20 64 6f 20 7b 7d 20 77  k to the do {} w
2f200 68 69 6c 65 20 73 74 61 72 74 20 70 6f 69 6e 74  hile start point
2f210 2c 20 74 72 79 20 61 67 61 69 6e 20 2a 2f 0a 20  , try again */. 
2f220 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2f230 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
2f240 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2f250 20 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20 6d      /* Need to m
2f260 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 70 61  ake a copy of pa
2f270 74 68 20 69 66 20 77 65 20 65 78 74 72 61 63 74  th if we extract
2f280 65 64 20 74 68 65 20 76 61 6c 75 65 0a 20 20 20  ed the value.   
2f290 20 20 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68        ** from th
2f2a0 65 20 63 6f 6e 63 68 20 66 69 6c 65 20 6f 72 20  e conch file or 
2f2b0 74 68 65 20 70 61 74 68 20 77 61 73 20 61 6c 6c  the path was all
2f2c0 6f 63 61 74 65 64 20 6f 6e 20 74 68 65 20 73 74  ocated on the st
2f2d0 61 63 6b 0a 20 20 20 20 20 20 20 20 20 2a 2f 0a  ack.         */.
2f2e0 20 20 20 20 20 20 20 20 69 66 28 20 74 65 6d 70          if( temp
2f2f0 4c 6f 63 6b 50 61 74 68 20 29 7b 0a 20 20 20 20  LockPath ){.    
2f300 20 20 20 20 20 20 70 43 74 78 2d 3e 6c 6f 63 6b        pCtx->lock
2f310 50 72 6f 78 79 50 61 74 68 20 3d 20 73 71 6c 69  ProxyPath = sqli
2f320 74 65 33 44 62 53 74 72 44 75 70 28 30 2c 20 74  te3DbStrDup(0, t
2f330 65 6d 70 4c 6f 63 6b 50 61 74 68 29 3b 0a 20 20  empLockPath);.  
2f340 20 20 20 20 20 20 20 20 69 66 28 20 21 70 43 74          if( !pCt
2f350 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68  x->lockProxyPath
2f360 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2f370 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
2f380 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  M;.          }. 
2f390 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2f3a0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
2f3b0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2f3c0 20 20 20 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48      pCtx->conchH
2f3d0 65 6c 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  eld = 1;.       
2f3e0 20 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43   .        if( pC
2f3f0 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 2d 3e 70  tx->lockProxy->p
2f400 4d 65 74 68 6f 64 20 3d 3d 20 26 61 66 70 49 6f  Method == &afpIo
2f410 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 20  Methods ){.     
2f420 20 20 20 20 20 61 66 70 4c 6f 63 6b 69 6e 67 43       afpLockingC
2f430 6f 6e 74 65 78 74 20 2a 61 66 70 43 74 78 3b 0a  ontext *afpCtx;.
2f440 20 20 20 20 20 20 20 20 20 20 61 66 70 43 74 78            afpCtx
2f450 20 3d 20 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f   = (afpLockingCo
2f460 6e 74 65 78 74 20 2a 29 70 43 74 78 2d 3e 6c 6f  ntext *)pCtx->lo
2f470 63 6b 50 72 6f 78 79 2d 3e 6c 6f 63 6b 69 6e 67  ckProxy->locking
2f480 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 20 20 20  Context;.       
2f490 20 20 20 61 66 70 43 74 78 2d 3e 64 62 50 61 74     afpCtx->dbPat
2f4a0 68 20 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72  h = pCtx->lockPr
2f4b0 6f 78 79 50 61 74 68 3b 0a 20 20 20 20 20 20 20  oxyPath;.       
2f4c0 20 7d 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20   }.      } else 
2f4d0 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 63 68 46  {.        conchF
2f4e0 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 55  ile->pMethod->xU
2f4f0 6e 6c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66  nlock((sqlite3_f
2f500 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c 20  ile*)conchFile, 
2f510 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  NO_LOCK);.      
2f520 7d 0a 20 20 20 20 20 20 4f 53 54 52 41 43 45 28  }.      OSTRACE(
2f530 28 22 54 41 4b 45 43 4f 4e 43 48 20 20 25 64 20  ("TAKECONCH  %d 
2f540 25 73 5c 6e 22 2c 20 63 6f 6e 63 68 46 69 6c 65  %s\n", conchFile
2f550 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ->h,.           
2f560 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f      rc==SQLITE_O
2f570 4b 3f 22 6f 6b 22 3a 22 66 61 69 6c 65 64 22 29  K?"ok":"failed")
2f580 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
2f590 72 63 3b 0a 20 20 20 20 7d 20 77 68 69 6c 65 20  rc;.    } while 
2f5a0 28 31 29 3b 20 2f 2a 20 69 6e 20 63 61 73 65 20  (1); /* in case 
2f5b0 77 65 20 6e 65 65 64 20 74 6f 20 72 65 74 72 79  we need to retry
2f5c0 20 74 68 65 20 3a 61 75 74 6f 3a 20 6c 6f 63 6b   the :auto: lock
2f5d0 20 66 69 6c 65 20 2d 20 0a 20 20 20 20 20 20 20   file - .       
2f5e0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 77 65 20            ** we 
2f5f0 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 67 65 74  should never get
2f600 20 68 65 72 65 20 65 78 63 65 70 74 20 76 69 61   here except via
2f610 20 74 68 65 20 27 63 6f 6e 74 69 6e 75 65 27 20   the 'continue' 
2f620 63 61 6c 6c 2e 20 2a 2f 0a 20 20 7d 0a 7d 0a 0a  call. */.  }.}..
2f630 2f 2a 0a 2a 2a 20 49 66 20 70 46 69 6c 65 20 68  /*.** If pFile h
2f640 6f 6c 64 73 20 61 20 6c 6f 63 6b 20 6f 6e 20 61  olds a lock on a
2f650 20 63 6f 6e 63 68 20 66 69 6c 65 2c 20 74 68 65   conch file, the
2f660 6e 20 72 65 6c 65 61 73 65 20 74 68 61 74 20 6c  n release that l
2f670 6f 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ock..*/.static i
2f680 6e 74 20 70 72 6f 78 79 52 65 6c 65 61 73 65 43  nt proxyReleaseC
2f690 6f 6e 63 68 28 75 6e 69 78 46 69 6c 65 20 2a 70  onch(unixFile *p
2f6a0 46 69 6c 65 29 7b 0a 20 20 69 6e 74 20 72 63 20  File){.  int rc 
2f6b0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
2f6c0 20 20 20 20 20 2f 2a 20 53 75 62 72 6f 75 74 69       /* Subrouti
2f6d0 6e 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a  ne return code *
2f6e0 2f 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67  /.  proxyLocking
2f6f0 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 3b 20 20  Context *pCtx;  
2f700 2f 2a 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 63  /* The locking c
2f710 6f 6e 74 65 78 74 20 66 6f 72 20 74 68 65 20 70  ontext for the p
2f720 72 6f 78 79 20 6c 6f 63 6b 20 2a 2f 0a 20 20 75  roxy lock */.  u
2f730 6e 69 78 46 69 6c 65 20 2a 63 6f 6e 63 68 46 69  nixFile *conchFi
2f740 6c 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 4e 61  le;        /* Na
2f750 6d 65 20 6f 66 20 74 68 65 20 63 6f 6e 63 68 20  me of the conch 
2f760 66 69 6c 65 20 2a 2f 0a 0a 20 20 70 43 74 78 20  file */..  pCtx 
2f770 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43  = (proxyLockingC
2f780 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e  ontext *)pFile->
2f790 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  lockingContext;.
2f7a0 20 20 63 6f 6e 63 68 46 69 6c 65 20 3d 20 70 43    conchFile = pC
2f7b0 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 3b 0a 20  tx->conchFile;. 
2f7c0 20 4f 53 54 52 41 43 45 28 28 22 52 45 4c 45 41   OSTRACE(("RELEA
2f7d0 53 45 43 4f 4e 43 48 20 20 25 64 20 66 6f 72 20  SECONCH  %d for 
2f7e0 25 73 20 70 69 64 3d 25 64 5c 6e 22 2c 20 63 6f  %s pid=%d\n", co
2f7f0 6e 63 68 46 69 6c 65 2d 3e 68 2c 0a 20 20 20 20  nchFile->h,.    
2f800 20 20 20 20 20 20 20 28 70 43 74 78 2d 3e 6c 6f         (pCtx->lo
2f810 63 6b 50 72 6f 78 79 50 61 74 68 20 3f 20 70 43  ckProxyPath ? pC
2f820 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74  tx->lockProxyPat
2f830 68 20 3a 20 22 3a 61 75 74 6f 3a 22 29 2c 20 0a  h : ":auto:"), .
2f840 20 20 20 20 20 20 20 20 20 20 20 67 65 74 70 69             getpi
2f850 64 28 29 29 29 3b 0a 20 20 69 66 28 20 70 43 74  d()));.  if( pCt
2f860 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 3e 30 20 29  x->conchHeld>0 )
2f870 7b 0a 20 20 20 20 72 63 20 3d 20 63 6f 6e 63 68  {.    rc = conch
2f880 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78  File->pMethod->x
2f890 55 6e 6c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f  Unlock((sqlite3_
2f8a0 66 69 6c 65 2a 29 63 6f 6e 63 68 46 69 6c 65 2c  file*)conchFile,
2f8b0 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 7d 0a 20   NO_LOCK);.  }. 
2f8c0 20 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64   pCtx->conchHeld
2f8d0 20 3d 20 30 3b 0a 20 20 4f 53 54 52 41 43 45 28   = 0;.  OSTRACE(
2f8e0 28 22 52 45 4c 45 41 53 45 43 4f 4e 43 48 20 20  ("RELEASECONCH  
2f8f0 25 64 20 25 73 5c 6e 22 2c 20 63 6f 6e 63 68 46  %d %s\n", conchF
2f900 69 6c 65 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20  ile->h,.        
2f910 20 20 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f     (rc==SQLITE_O
2f920 4b 20 3f 20 22 6f 6b 22 20 3a 20 22 66 61 69 6c  K ? "ok" : "fail
2f930 65 64 22 29 29 29 3b 0a 20 20 72 65 74 75 72 6e  ed")));.  return
2f940 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69   rc;.}../*.** Gi
2f950 76 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ven the name of 
2f960 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  a database file,
2f970 20 63 6f 6d 70 75 74 65 20 74 68 65 20 6e 61 6d   compute the nam
2f980 65 20 6f 66 20 69 74 73 20 63 6f 6e 63 68 20 66  e of its conch f
2f990 69 6c 65 2e 0a 2a 2a 20 53 74 6f 72 65 20 74 68  ile..** Store th
2f9a0 65 20 63 6f 6e 63 68 20 66 69 6c 65 6e 61 6d 65  e conch filename
2f9b0 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69   in memory obtai
2f9c0 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  ned from sqlite3
2f9d0 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 4d 61  _malloc()..** Ma
2f9e0 6b 65 20 2a 70 43 6f 6e 63 68 50 61 74 68 20 70  ke *pConchPath p
2f9f0 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e 65 77 20  oint to the new 
2fa00 6e 61 6d 65 2e 20 20 52 65 74 75 72 6e 20 53 51  name.  Return SQ
2fa10 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
2fa20 73 73 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f  ss.** or SQLITE_
2fa30 4e 4f 4d 45 4d 20 69 66 20 75 6e 61 62 6c 65 20  NOMEM if unable 
2fa40 74 6f 20 6f 62 74 61 69 6e 20 6d 65 6d 6f 72 79  to obtain memory
2fa50 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c  ..**.** The call
2fa60 65 72 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  er is responsibl
2fa70 65 20 66 6f 72 20 65 6e 73 75 72 69 6e 67 20 74  e for ensuring t
2fa80 68 61 74 20 74 68 65 20 61 6c 6c 6f 63 61 74 65  hat the allocate
2fa90 64 20 6d 65 6d 6f 72 79 0a 2a 2a 20 73 70 61 63  d memory.** spac
2faa0 65 20 69 73 20 65 76 65 6e 74 75 61 6c 6c 79 20  e is eventually 
2fab0 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 2a 70 43  freed..**.** *pC
2fac0 6f 6e 63 68 50 61 74 68 20 69 73 20 73 65 74 20  onchPath is set 
2fad0 74 6f 20 4e 55 4c 4c 20 69 66 20 61 20 6d 65 6d  to NULL if a mem
2fae0 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65  ory allocation e
2faf0 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a  rror occurs..*/.
2fb00 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
2fb10 43 72 65 61 74 65 43 6f 6e 63 68 50 61 74 68 6e  CreateConchPathn
2fb20 61 6d 65 28 63 68 61 72 20 2a 64 62 50 61 74 68  ame(char *dbPath
2fb30 2c 20 63 68 61 72 20 2a 2a 70 43 6f 6e 63 68 50  , char **pConchP
2fb40 61 74 68 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20  ath){.  int i;  
2fb50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fb60 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
2fb70 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6c  unter */.  int l
2fb80 65 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e  en = (int)strlen
2fb90 28 64 62 50 61 74 68 29 3b 20 2f 2a 20 4c 65 6e  (dbPath); /* Len
2fba0 67 74 68 20 6f 66 20 64 61 74 61 62 61 73 65 20  gth of database 
2fbb0 66 69 6c 65 6e 61 6d 65 20 2d 20 64 62 50 61 74  filename - dbPat
2fbc0 68 20 2a 2f 0a 20 20 63 68 61 72 20 2a 63 6f 6e  h */.  char *con
2fbd0 63 68 50 61 74 68 3b 20 20 20 20 20 20 20 20 20  chPath;         
2fbe0 20 20 20 20 20 2f 2a 20 62 75 66 66 65 72 20 69       /* buffer i
2fbf0 6e 20 77 68 69 63 68 20 74 6f 20 63 6f 6e 73 74  n which to const
2fc00 72 75 63 74 20 63 6f 6e 63 68 20 6e 61 6d 65 20  ruct conch name 
2fc10 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  */..  /* Allocat
2fc20 65 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 20  e space for the 
2fc30 63 6f 6e 63 68 20 66 69 6c 65 6e 61 6d 65 20 61  conch filename a
2fc40 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68  nd initialize th
2fc50 65 20 6e 61 6d 65 20 74 6f 0a 20 20 2a 2a 20 74  e name to.  ** t
2fc60 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 6f  he name of the o
2fc70 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65  riginal database
2fc80 20 66 69 6c 65 2e 20 2a 2f 20 20 0a 20 20 2a 70   file. */  .  *p
2fc90 43 6f 6e 63 68 50 61 74 68 20 3d 20 63 6f 6e 63  ConchPath = conc
2fca0 68 50 61 74 68 20 3d 20 28 63 68 61 72 20 2a 29  hPath = (char *)
2fcb0 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6c  sqlite3_malloc(l
2fcc0 65 6e 20 2b 20 38 29 3b 0a 20 20 69 66 28 20 63  en + 8);.  if( c
2fcd0 6f 6e 63 68 50 61 74 68 3d 3d 30 20 29 7b 0a 20  onchPath==0 ){. 
2fce0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2fcf0 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 6d 65  _NOMEM;.  }.  me
2fd00 6d 63 70 79 28 63 6f 6e 63 68 50 61 74 68 2c 20  mcpy(conchPath, 
2fd10 64 62 50 61 74 68 2c 20 6c 65 6e 2b 31 29 3b 0a  dbPath, len+1);.
2fd20 20 20 0a 20 20 2f 2a 20 6e 6f 77 20 69 6e 73 65    .  /* now inse
2fd30 72 74 20 61 20 22 2e 22 20 62 65 66 6f 72 65 20  rt a "." before 
2fd40 74 68 65 20 6c 61 73 74 20 2f 20 63 68 61 72 61  the last / chara
2fd50 63 74 65 72 20 2a 2f 0a 20 20 66 6f 72 28 20 69  cter */.  for( i
2fd60 3d 28 6c 65 6e 2d 31 29 3b 20 69 3e 3d 30 3b 20  =(len-1); i>=0; 
2fd70 69 2d 2d 20 29 7b 0a 20 20 20 20 69 66 28 20 63  i-- ){.    if( c
2fd80 6f 6e 63 68 50 61 74 68 5b 69 5d 3d 3d 27 2f 27  onchPath[i]=='/'
2fd90 20 29 7b 0a 20 20 20 20 20 20 69 2b 2b 3b 0a 20   ){.      i++;. 
2fda0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2fdb0 7d 0a 20 20 7d 0a 20 20 63 6f 6e 63 68 50 61 74  }.  }.  conchPat
2fdc0 68 5b 69 5d 3d 27 2e 27 3b 0a 20 20 77 68 69 6c  h[i]='.';.  whil
2fdd0 65 20 28 20 69 3c 6c 65 6e 20 29 7b 0a 20 20 20  e ( i<len ){.   
2fde0 20 63 6f 6e 63 68 50 61 74 68 5b 69 2b 31 5d 3d   conchPath[i+1]=
2fdf0 64 62 50 61 74 68 5b 69 5d 3b 0a 20 20 20 20 69  dbPath[i];.    i
2fe00 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 61 70  ++;.  }..  /* ap
2fe10 70 65 6e 64 20 74 68 65 20 22 2d 63 6f 6e 63 68  pend the "-conch
2fe20 22 20 73 75 66 66 69 78 20 74 6f 20 74 68 65 20  " suffix to the 
2fe30 66 69 6c 65 20 2a 2f 0a 20 20 6d 65 6d 63 70 79  file */.  memcpy
2fe40 28 26 63 6f 6e 63 68 50 61 74 68 5b 69 2b 31 5d  (&conchPath[i+1]
2fe50 2c 20 22 2d 63 6f 6e 63 68 22 2c 20 37 29 3b 0a  , "-conch", 7);.
2fe60 20 20 61 73 73 65 72 74 28 20 28 69 6e 74 29 73    assert( (int)s
2fe70 74 72 6c 65 6e 28 63 6f 6e 63 68 50 61 74 68 29  trlen(conchPath)
2fe80 20 3d 3d 20 6c 65 6e 2b 37 20 29 3b 0a 0a 20 20   == len+7 );..  
2fe90 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2fea0 3b 0a 7d 0a 0a 0a 2f 2a 20 54 61 6b 65 73 20 61  ;.}.../* Takes a
2feb0 20 66 75 6c 6c 79 20 63 6f 6e 66 69 67 75 72 65   fully configure
2fec0 64 20 70 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 2d  d proxy locking-
2fed0 73 74 79 6c 65 20 75 6e 69 78 20 66 69 6c 65 20  style unix file 
2fee0 61 6e 64 20 73 77 69 74 63 68 65 73 0a 2a 2a 20  and switches.** 
2fef0 74 68 65 20 6c 6f 63 61 6c 20 6c 6f 63 6b 20 66  the local lock f
2ff00 69 6c 65 20 70 61 74 68 20 0a 2a 2f 0a 73 74 61  ile path .*/.sta
2ff10 74 69 63 20 69 6e 74 20 73 77 69 74 63 68 4c 6f  tic int switchLo
2ff20 63 6b 50 72 6f 78 79 50 61 74 68 28 75 6e 69 78  ckProxyPath(unix
2ff30 46 69 6c 65 20 2a 70 46 69 6c 65 2c 20 63 6f 6e  File *pFile, con
2ff40 73 74 20 63 68 61 72 20 2a 70 61 74 68 29 20 7b  st char *path) {
2ff50 0a 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43  .  proxyLockingC
2ff60 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 3d 20 28  ontext *pCtx = (
2ff70 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74  proxyLockingCont
2ff80 65 78 74 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ext*)pFile->lock
2ff90 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 63 68  ingContext;.  ch
2ffa0 61 72 20 2a 6f 6c 64 50 61 74 68 20 3d 20 70 43  ar *oldPath = pC
2ffb0 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74  tx->lockProxyPat
2ffc0 68 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  h;.  int rc = SQ
2ffd0 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20  LITE_OK;..  if( 
2ffe0 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
2fff0 21 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  !=NO_LOCK ){.   
30000 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
30010 55 53 59 3b 0a 20 20 7d 20 20 0a 0a 20 20 2f 2a  USY;.  }  ..  /*
30020 20 6e 6f 74 68 69 6e 67 20 74 6f 20 64 6f 20 69   nothing to do i
30030 66 20 74 68 65 20 70 61 74 68 20 69 73 20 4e 55  f the path is NU
30040 4c 4c 2c 20 3a 61 75 74 6f 3a 20 6f 72 20 6d 61  LL, :auto: or ma
30050 74 63 68 65 73 20 74 68 65 20 65 78 69 73 74 69  tches the existi
30060 6e 67 20 70 61 74 68 20 2a 2f 0a 20 20 69 66 28  ng path */.  if(
30070 20 21 70 61 74 68 20 7c 7c 20 70 61 74 68 5b 30   !path || path[0
30080 5d 3d 3d 27 5c 30 27 20 7c 7c 20 21 73 74 72 63  ]=='\0' || !strc
30090 6d 70 28 70 61 74 68 2c 20 22 3a 61 75 74 6f 3a  mp(path, ":auto:
300a0 22 29 20 7c 7c 0a 20 20 20 20 28 6f 6c 64 50 61  ") ||.    (oldPa
300b0 74 68 20 26 26 20 21 73 74 72 6e 63 6d 70 28 6f  th && !strncmp(o
300c0 6c 64 50 61 74 68 2c 20 70 61 74 68 2c 20 4d 41  ldPath, path, MA
300d0 58 50 41 54 48 4c 45 4e 29 29 20 29 7b 0a 20 20  XPATHLEN)) ){.  
300e0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
300f0 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  OK;.  }else{.   
30100 20 75 6e 69 78 46 69 6c 65 20 2a 6c 6f 63 6b 50   unixFile *lockP
30110 72 6f 78 79 20 3d 20 70 43 74 78 2d 3e 6c 6f 63  roxy = pCtx->loc
30120 6b 50 72 6f 78 79 3b 0a 20 20 20 20 70 43 74 78  kProxy;.    pCtx
30130 2d 3e 6c 6f 63 6b 50 72 6f 78 79 3d 4e 55 4c 4c  ->lockProxy=NULL
30140 3b 0a 20 20 20 20 70 43 74 78 2d 3e 63 6f 6e 63  ;.    pCtx->conc
30150 68 48 65 6c 64 20 3d 20 30 3b 0a 20 20 20 20 69  hHeld = 0;.    i
30160 66 28 20 6c 6f 63 6b 50 72 6f 78 79 21 3d 4e 55  f( lockProxy!=NU
30170 4c 4c 20 29 7b 0a 20 20 20 20 20 20 72 63 3d 6c  LL ){.      rc=l
30180 6f 63 6b 50 72 6f 78 79 2d 3e 70 4d 65 74 68 6f  ockProxy->pMetho
30190 64 2d 3e 78 43 6c 6f 73 65 28 28 73 71 6c 69 74  d->xClose((sqlit
301a0 65 33 5f 66 69 6c 65 20 2a 29 6c 6f 63 6b 50 72  e3_file *)lockPr
301b0 6f 78 79 29 3b 0a 20 20 20 20 20 20 69 66 28 20  oxy);.      if( 
301c0 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
301d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
301e0 65 65 28 6c 6f 63 6b 50 72 6f 78 79 29 3b 0a 20  ee(lockProxy);. 
301f0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
30200 5f 66 72 65 65 28 6f 6c 64 50 61 74 68 29 3b 0a  _free(oldPath);.
30210 20 20 20 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72      pCtx->lockPr
30220 6f 78 79 50 61 74 68 20 3d 20 73 71 6c 69 74 65  oxyPath = sqlite
30230 33 44 62 53 74 72 44 75 70 28 30 2c 20 70 61 74  3DbStrDup(0, pat
30240 68 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 72 65 74  h);.  }.  .  ret
30250 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
30260 20 70 46 69 6c 65 20 69 73 20 61 20 66 69 6c 65   pFile is a file
30270 20 74 68 61 74 20 68 61 73 20 62 65 65 6e 20 6f   that has been o
30280 70 65 6e 65 64 20 62 79 20 61 20 70 72 69 6f 72  pened by a prior
30290 20 78 4f 70 65 6e 20 63 61 6c 6c 2e 20 20 64 62   xOpen call.  db
302a0 50 61 74 68 0a 2a 2a 20 69 73 20 61 20 73 74 72  Path.** is a str
302b0 69 6e 67 20 62 75 66 66 65 72 20 61 74 20 6c 65  ing buffer at le
302c0 61 73 74 20 4d 41 58 50 41 54 48 4c 45 4e 2b 31  ast MAXPATHLEN+1
302d0 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 73   characters in s
302e0 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ize..**.** This 
302f0 72 6f 75 74 69 6e 65 20 66 69 6e 64 20 74 68 65  routine find the
30300 20 66 69 6c 65 6e 61 6d 65 20 61 73 73 6f 63 69   filename associ
30310 61 74 65 64 20 77 69 74 68 20 70 46 69 6c 65 20  ated with pFile 
30320 61 6e 64 20 77 72 69 74 65 73 20 69 74 0a 2a 2a  and writes it.**
30330 20 69 6e 74 20 64 62 50 61 74 68 2e 0a 2a 2f 0a   int dbPath..*/.
30340 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
30350 47 65 74 44 62 50 61 74 68 46 6f 72 55 6e 69 78  GetDbPathForUnix
30360 46 69 6c 65 28 75 6e 69 78 46 69 6c 65 20 2a 70  File(unixFile *p
30370 46 69 6c 65 2c 20 63 68 61 72 20 2a 64 62 50 61  File, char *dbPa
30380 74 68 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64  th){.#if defined
30390 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 69 66  (__APPLE__).  if
303a0 28 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64  ( pFile->pMethod
303b0 20 3d 3d 20 26 61 66 70 49 6f 4d 65 74 68 6f 64   == &afpIoMethod
303c0 73 20 29 7b 0a 20 20 20 20 2f 2a 20 61 66 70 20  s ){.    /* afp 
303d0 73 74 79 6c 65 20 6b 65 65 70 73 20 61 20 72 65  style keeps a re
303e0 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 64  ference to the d
303f0 62 20 70 61 74 68 20 69 6e 20 74 68 65 20 66 69  b path in the fi
30400 6c 65 50 61 74 68 20 66 69 65 6c 64 20 0a 20 20  lePath field .  
30410 20 20 2a 2a 20 6f 66 20 74 68 65 20 73 74 72 75    ** of the stru
30420 63 74 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  ct */.    assert
30430 28 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 28 63  ( (int)strlen((c
30440 68 61 72 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b  har*)pFile->lock
30450 69 6e 67 43 6f 6e 74 65 78 74 29 3c 3d 4d 41 58  ingContext)<=MAX
30460 50 41 54 48 4c 45 4e 20 29 3b 0a 20 20 20 20 73  PATHLEN );.    s
30470 74 72 6c 63 70 79 28 64 62 50 61 74 68 2c 20 28  trlcpy(dbPath, (
30480 28 61 66 70 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  (afpLockingConte
30490 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b  xt *)pFile->lock
304a0 69 6e 67 43 6f 6e 74 65 78 74 29 2d 3e 64 62 50  ingContext)->dbP
304b0 61 74 68 2c 20 4d 41 58 50 41 54 48 4c 45 4e 29  ath, MAXPATHLEN)
304c0 3b 0a 20 20 7d 20 65 6c 73 65 0a 23 65 6e 64 69  ;.  } else.#endi
304d0 66 0a 20 20 69 66 28 20 70 46 69 6c 65 2d 3e 70  f.  if( pFile->p
304e0 4d 65 74 68 6f 64 20 3d 3d 20 26 64 6f 74 6c 6f  Method == &dotlo
304f0 63 6b 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20  ckIoMethods ){. 
30500 20 20 20 2f 2a 20 64 6f 74 20 6c 6f 63 6b 20 73     /* dot lock s
30510 74 79 6c 65 20 75 73 65 73 20 74 68 65 20 6c 6f  tyle uses the lo
30520 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 74 6f  cking context to
30530 20 73 74 6f 72 65 20 74 68 65 20 64 6f 74 20 6c   store the dot l
30540 6f 63 6b 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20  ock.    ** file 
30550 70 61 74 68 20 2a 2f 0a 20 20 20 20 69 6e 74 20  path */.    int 
30560 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 28 63 68  len = strlen((ch
30570 61 72 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b  ar *)pFile->lock
30580 69 6e 67 43 6f 6e 74 65 78 74 29 20 2d 20 73 74  ingContext) - st
30590 72 6c 65 6e 28 44 4f 54 4c 4f 43 4b 5f 53 55 46  rlen(DOTLOCK_SUF
305a0 46 49 58 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  FIX);.    memcpy
305b0 28 64 62 50 61 74 68 2c 20 28 63 68 61 72 20 2a  (dbPath, (char *
305c0 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43  )pFile->lockingC
305d0 6f 6e 74 65 78 74 2c 20 6c 65 6e 20 2b 20 31 29  ontext, len + 1)
305e0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
305f0 2a 20 61 6c 6c 20 6f 74 68 65 72 20 73 74 79 6c  * all other styl
30600 65 73 20 75 73 65 20 74 68 65 20 6c 6f 63 6b 69  es use the locki
30610 6e 67 20 63 6f 6e 74 65 78 74 20 74 6f 20 73 74  ng context to st
30620 6f 72 65 20 74 68 65 20 64 62 20 66 69 6c 65 20  ore the db file 
30630 70 61 74 68 20 2a 2f 0a 20 20 20 20 61 73 73 65  path */.    asse
30640 72 74 28 20 73 74 72 6c 65 6e 28 28 63 68 61 72  rt( strlen((char
30650 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  *)pFile->locking
30660 43 6f 6e 74 65 78 74 29 3c 3d 4d 41 58 50 41 54  Context)<=MAXPAT
30670 48 4c 45 4e 20 29 3b 0a 20 20 20 20 73 74 72 6c  HLEN );.    strl
30680 63 70 79 28 64 62 50 61 74 68 2c 20 28 63 68 61  cpy(dbPath, (cha
30690 72 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69  r *)pFile->locki
306a0 6e 67 43 6f 6e 74 65 78 74 2c 20 4d 41 58 50 41  ngContext, MAXPA
306b0 54 48 4c 45 4e 29 3b 0a 20 20 7d 0a 20 20 72 65  THLEN);.  }.  re
306c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
306d0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 61 6b 65 73 20 61  }../*.** Takes a
306e0 6e 20 61 6c 72 65 61 64 79 20 66 69 6c 6c 65 64  n already filled
306f0 20 69 6e 20 75 6e 69 78 20 66 69 6c 65 20 61 6e   in unix file an
30700 64 20 61 6c 74 65 72 73 20 69 74 20 73 6f 20 61  d alters it so a
30710 6c 6c 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20  ll file locking 
30720 0a 2a 2a 20 77 69 6c 6c 20 62 65 20 70 65 72 66  .** will be perf
30730 6f 72 6d 65 64 20 6f 6e 20 74 68 65 20 6c 6f 63  ormed on the loc
30740 61 6c 20 70 72 6f 78 79 20 6c 6f 63 6b 20 66 69  al proxy lock fi
30750 6c 65 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  le.  The followi
30760 6e 67 20 66 69 65 6c 64 73 0a 2a 2a 20 61 72 65  ng fields.** are
30770 20 70 72 65 73 65 72 76 65 64 20 69 6e 20 74 68   preserved in th
30780 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 6e 74 65 78  e locking contex
30790 74 20 73 6f 20 74 68 61 74 20 74 68 65 79 20 63  t so that they c
307a0 61 6e 20 62 65 20 72 65 73 74 6f 72 65 64 20 61  an be restored a
307b0 6e 64 20 0a 2a 2a 20 74 68 65 20 75 6e 69 78 20  nd .** the unix 
307c0 73 74 72 75 63 74 75 72 65 20 70 72 6f 70 65 72  structure proper
307d0 6c 79 20 63 6c 65 61 6e 65 64 20 75 70 20 61 74  ly cleaned up at
307e0 20 63 6c 6f 73 65 20 74 69 6d 65 3a 0a 2a 2a 20   close time:.** 
307f0 20 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78   ->lockingContex
30800 74 0a 2a 2a 20 20 2d 3e 70 4d 65 74 68 6f 64 0a  t.**  ->pMethod.
30810 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  */.static int pr
30820 6f 78 79 54 72 61 6e 73 66 6f 72 6d 55 6e 69 78  oxyTransformUnix
30830 46 69 6c 65 28 75 6e 69 78 46 69 6c 65 20 2a 70  File(unixFile *p
30840 46 69 6c 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  File, const char
30850 20 2a 70 61 74 68 29 20 7b 0a 20 20 70 72 6f 78   *path) {.  prox
30860 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  yLockingContext 
30870 2a 70 43 74 78 3b 0a 20 20 63 68 61 72 20 64 62  *pCtx;.  char db
30880 50 61 74 68 5b 4d 41 58 50 41 54 48 4c 45 4e 2b  Path[MAXPATHLEN+
30890 31 5d 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d  1];       /* Nam
308a0 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
308b0 65 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72  e file */.  char
308c0 20 2a 6c 6f 63 6b 50 61 74 68 3d 4e 55 4c 4c 3b   *lockPath=NULL;
308d0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
308e0 54 45 5f 4f 4b 3b 0a 20 20 0a 20 20 69 66 28 20  TE_OK;.  .  if( 
308f0 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b  pFile->eFileLock
30900 21 3d 4e 4f 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20  !=NO_LOCK ){.   
30910 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
30920 55 53 59 3b 0a 20 20 7d 0a 20 20 70 72 6f 78 79  USY;.  }.  proxy
30930 47 65 74 44 62 50 61 74 68 46 6f 72 55 6e 69 78  GetDbPathForUnix
30940 46 69 6c 65 28 70 46 69 6c 65 2c 20 64 62 50 61  File(pFile, dbPa
30950 74 68 29 3b 0a 20 20 69 66 28 20 21 70 61 74 68  th);.  if( !path
30960 20 7c 7c 20 70 61 74 68 5b 30 5d 3d 3d 27 5c 30   || path[0]=='\0
30970 27 20 7c 7c 20 21 73 74 72 63 6d 70 28 70 61 74  ' || !strcmp(pat
30980 68 2c 20 22 3a 61 75 74 6f 3a 22 29 20 29 7b 0a  h, ":auto:") ){.
30990 20 20 20 20 6c 6f 63 6b 50 61 74 68 3d 4e 55 4c      lockPath=NUL
309a0 4c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  L;.  }else{.    
309b0 6c 6f 63 6b 50 61 74 68 3d 28 63 68 61 72 20 2a  lockPath=(char *
309c0 29 70 61 74 68 3b 0a 20 20 7d 0a 20 20 0a 20 20  )path;.  }.  .  
309d0 4f 53 54 52 41 43 45 28 28 22 54 52 41 4e 53 50  OSTRACE(("TRANSP
309e0 52 4f 58 59 20 20 25 64 20 66 6f 72 20 25 73 20  ROXY  %d for %s 
309f0 70 69 64 3d 25 64 5c 6e 22 2c 20 70 46 69 6c 65  pid=%d\n", pFile
30a00 2d 3e 68 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ->h,.           
30a10 28 6c 6f 63 6b 50 61 74 68 20 3f 20 6c 6f 63 6b  (lockPath ? lock
30a20 50 61 74 68 20 3a 20 22 3a 61 75 74 6f 3a 22 29  Path : ":auto:")
30a30 2c 20 67 65 74 70 69 64 28 29 29 29 3b 0a 0a 20  , getpid()));.. 
30a40 20 70 43 74 78 20 3d 20 73 71 6c 69 74 65 33 5f   pCtx = sqlite3_
30a50 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a  malloc( sizeof(*
30a60 70 43 74 78 29 20 29 3b 0a 20 20 69 66 28 20 70  pCtx) );.  if( p
30a70 43 74 78 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  Ctx==0 ){.    re
30a80 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
30a90 4d 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28  M;.  }.  memset(
30aa0 70 43 74 78 2c 20 30 2c 20 73 69 7a 65 6f 66 28  pCtx, 0, sizeof(
30ab0 2a 70 43 74 78 29 29 3b 0a 0a 20 20 72 63 20 3d  *pCtx));..  rc =
30ac0 20 70 72 6f 78 79 43 72 65 61 74 65 43 6f 6e 63   proxyCreateConc
30ad0 68 50 61 74 68 6e 61 6d 65 28 64 62 50 61 74 68  hPathname(dbPath
30ae0 2c 20 26 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69  , &pCtx->conchFi
30af0 6c 65 50 61 74 68 29 3b 0a 20 20 69 66 28 20 72  lePath);.  if( r
30b00 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
30b10 20 20 20 20 72 63 20 3d 20 70 72 6f 78 79 43 72      rc = proxyCr
30b20 65 61 74 65 55 6e 69 78 46 69 6c 65 28 70 43 74  eateUnixFile(pCt
30b30 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 50 61 74 68  x->conchFilePath
30b40 2c 20 26 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69  , &pCtx->conchFi
30b50 6c 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  le, 0);.    if( 
30b60 72 63 3d 3d 53 51 4c 49 54 45 5f 43 41 4e 54 4f  rc==SQLITE_CANTO
30b70 50 45 4e 20 26 26 20 28 28 70 46 69 6c 65 2d 3e  PEN && ((pFile->
30b80 6f 70 65 6e 46 6c 61 67 73 26 4f 5f 52 44 57 52  openFlags&O_RDWR
30b90 29 20 3d 3d 20 30 29 20 29 7b 0a 20 20 20 20 20  ) == 0) ){.     
30ba0 20 2f 2a 20 69 66 20 28 61 29 20 74 68 65 20 6f   /* if (a) the o
30bb0 70 65 6e 20 66 6c 61 67 73 20 61 72 65 20 6e 6f  pen flags are no
30bc0 74 20 4f 5f 52 44 57 52 2c 20 28 62 29 20 74 68  t O_RDWR, (b) th
30bd0 65 20 63 6f 6e 63 68 20 69 73 6e 27 74 20 74 68  e conch isn't th
30be0 65 72 65 2c 20 61 6e 64 0a 20 20 20 20 20 20 2a  ere, and.      *
30bf0 2a 20 28 63 29 20 74 68 65 20 66 69 6c 65 20 73  * (c) the file s
30c00 79 73 74 65 6d 20 69 73 20 72 65 61 64 2d 6f 6e  ystem is read-on
30c10 6c 79 2c 20 74 68 65 6e 20 65 6e 61 62 6c 65 20  ly, then enable 
30c20 6e 6f 2d 6c 6f 63 6b 69 6e 67 20 61 63 63 65 73  no-locking acces
30c30 73 2e 0a 20 20 20 20 20 20 2a 2a 20 55 67 68 2c  s..      ** Ugh,
30c40 20 73 69 6e 63 65 20 4f 5f 52 44 4f 4e 4c 59 3d   since O_RDONLY=
30c50 3d 30 78 30 30 30 30 20 77 65 20 74 65 73 74 20  =0x0000 we test 
30c60 66 6f 72 20 21 4f 5f 52 44 57 52 20 73 69 6e 63  for !O_RDWR sinc
30c70 65 20 75 6e 69 78 4f 70 65 6e 20 61 73 73 65 72  e unixOpen asser
30c80 74 73 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74  ts.      ** that
30c90 20 6f 70 65 6e 46 6c 61 67 73 20 77 69 6c 6c 20   openFlags will 
30ca0 68 61 76 65 20 6f 6e 6c 79 20 6f 6e 65 20 6f 66  have only one of
30cb0 20 4f 5f 52 44 4f 4e 4c 59 20 6f 72 20 4f 5f 52   O_RDONLY or O_R
30cc0 44 57 52 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  DWR..      */.  
30cd0 20 20 20 20 73 74 72 75 63 74 20 73 74 61 74 66      struct statf
30ce0 73 20 66 73 49 6e 66 6f 3b 0a 20 20 20 20 20 20  s fsInfo;.      
30cf0 73 74 72 75 63 74 20 73 74 61 74 20 63 6f 6e 63  struct stat conc
30d00 68 49 6e 66 6f 3b 0a 20 20 20 20 20 20 69 6e 74  hInfo;.      int
30d10 20 67 6f 4c 6f 63 6b 6c 65 73 73 20 3d 20 30 3b   goLockless = 0;
30d20 0a 0a 20 20 20 20 20 20 69 66 28 20 73 74 61 74  ..      if( stat
30d30 28 70 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65  (pCtx->conchFile
30d40 50 61 74 68 2c 20 26 63 6f 6e 63 68 49 6e 66 6f  Path, &conchInfo
30d50 29 20 3d 3d 20 2d 31 20 29 20 7b 0a 20 20 20 20  ) == -1 ) {.    
30d60 20 20 20 20 69 6e 74 20 65 72 72 20 3d 20 65 72      int err = er
30d70 72 6e 6f 3b 0a 20 20 20 20 20 20 20 20 69 66 28  rno;.        if(
30d80 20 28 65 72 72 3d 3d 45 4e 4f 45 4e 54 29 20 26   (err==ENOENT) &
30d90 26 20 28 73 74 61 74 66 73 28 64 62 50 61 74 68  & (statfs(dbPath
30da0 2c 20 26 66 73 49 6e 66 6f 29 20 21 3d 20 2d 31  , &fsInfo) != -1
30db0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  ) ){.          g
30dc0 6f 4c 6f 63 6b 6c 65 73 73 20 3d 20 28 66 73 49  oLockless = (fsI
30dd0 6e 66 6f 2e 66 5f 66 6c 61 67 73 26 4d 4e 54 5f  nfo.f_flags&MNT_
30de0 52 44 4f 4e 4c 59 29 20 3d 3d 20 4d 4e 54 5f 52  RDONLY) == MNT_R
30df0 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 20 20 7d  DONLY;.        }
30e00 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
30e10 66 28 20 67 6f 4c 6f 63 6b 6c 65 73 73 20 29 7b  f( goLockless ){
30e20 0a 20 20 20 20 20 20 20 20 70 43 74 78 2d 3e 63  .        pCtx->c
30e30 6f 6e 63 68 48 65 6c 64 20 3d 20 2d 31 3b 20 2f  onchHeld = -1; /
30e40 2a 20 72 65 61 64 20 6f 6e 6c 79 20 46 53 2f 20  * read only FS/ 
30e50 6c 6f 63 6b 6c 65 73 73 20 2a 2f 0a 20 20 20 20  lockless */.    
30e60 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
30e70 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OK;.      }.    
30e80 7d 0a 20 20 7d 20 20 0a 20 20 69 66 28 20 72 63  }.  }  .  if( rc
30e90 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6c  ==SQLITE_OK && l
30ea0 6f 63 6b 50 61 74 68 20 29 7b 0a 20 20 20 20 70  ockPath ){.    p
30eb0 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61  Ctx->lockProxyPa
30ec0 74 68 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74  th = sqlite3DbSt
30ed0 72 44 75 70 28 30 2c 20 6c 6f 63 6b 50 61 74 68  rDup(0, lockPath
30ee0 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63  );.  }..  if( rc
30ef0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
30f00 20 20 20 70 43 74 78 2d 3e 64 62 50 61 74 68 20     pCtx->dbPath 
30f10 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
30f20 70 28 30 2c 20 64 62 50 61 74 68 29 3b 0a 20 20  p(0, dbPath);.  
30f30 20 20 69 66 28 20 70 43 74 78 2d 3e 64 62 50 61    if( pCtx->dbPa
30f40 74 68 3d 3d 4e 55 4c 4c 20 29 7b 0a 20 20 20 20  th==NULL ){.    
30f50 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
30f60 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  MEM;.    }.  }. 
30f70 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
30f80 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 61 6c 6c  OK ){.    /* all
30f90 20 6d 65 6d 6f 72 79 20 69 73 20 61 6c 6c 6f 63   memory is alloc
30fa0 61 74 65 64 2c 20 70 72 6f 78 79 73 20 61 72 65  ated, proxys are
30fb0 20 63 72 65 61 74 65 64 20 61 6e 64 20 61 73 73   created and ass
30fc0 69 67 6e 65 64 2c 20 0a 20 20 20 20 2a 2a 20 73  igned, .    ** s
30fd0 77 69 74 63 68 20 74 68 65 20 6c 6f 63 6b 69 6e  witch the lockin
30fe0 67 20 63 6f 6e 74 65 78 74 20 61 6e 64 20 70 4d  g context and pM
30ff0 65 74 68 6f 64 20 74 68 65 6e 20 72 65 74 75 72  ethod then retur
31000 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 43  n..    */.    pC
31010 74 78 2d 3e 6f 6c 64 4c 6f 63 6b 69 6e 67 43 6f  tx->oldLockingCo
31020 6e 74 65 78 74 20 3d 20 70 46 69 6c 65 2d 3e 6c  ntext = pFile->l
31030 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20  ockingContext;. 
31040 20 20 20 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e     pFile->lockin
31050 67 43 6f 6e 74 65 78 74 20 3d 20 70 43 74 78 3b  gContext = pCtx;
31060 0a 20 20 20 20 70 43 74 78 2d 3e 70 4f 6c 64 4d  .    pCtx->pOldM
31070 65 74 68 6f 64 20 3d 20 70 46 69 6c 65 2d 3e 70  ethod = pFile->p
31080 4d 65 74 68 6f 64 3b 0a 20 20 20 20 70 46 69 6c  Method;.    pFil
31090 65 2d 3e 70 4d 65 74 68 6f 64 20 3d 20 26 70 72  e->pMethod = &pr
310a0 6f 78 79 49 6f 4d 65 74 68 6f 64 73 3b 0a 20 20  oxyIoMethods;.  
310b0 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70  }else{.    if( p
310c0 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 20 29  Ctx->conchFile )
310d0 7b 20 0a 20 20 20 20 20 20 70 43 74 78 2d 3e 63  { .      pCtx->c
310e0 6f 6e 63 68 46 69 6c 65 2d 3e 70 4d 65 74 68 6f  onchFile->pMetho
310f0 64 2d 3e 78 43 6c 6f 73 65 28 28 73 71 6c 69 74  d->xClose((sqlit
31100 65 33 5f 66 69 6c 65 20 2a 29 70 43 74 78 2d 3e  e3_file *)pCtx->
31110 63 6f 6e 63 68 46 69 6c 65 29 3b 0a 20 20 20 20  conchFile);.    
31120 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
31130 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 29 3b  Ctx->conchFile);
31140 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
31150 65 33 5f 66 72 65 65 28 70 43 74 78 2d 3e 6c 6f  e3_free(pCtx->lo
31160 63 6b 50 72 6f 78 79 50 61 74 68 29 3b 0a 20 20  ckProxyPath);.  
31170 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
31180 43 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 50 61  Ctx->conchFilePa
31190 74 68 29 3b 20 0a 20 20 20 20 73 71 6c 69 74 65  th); .    sqlite
311a0 33 5f 66 72 65 65 28 70 43 74 78 29 3b 0a 20 20  3_free(pCtx);.  
311b0 7d 0a 20 20 4f 53 54 52 41 43 45 28 28 22 54 52  }.  OSTRACE(("TR
311c0 41 4e 53 50 52 4f 58 59 20 20 25 64 20 25 73 5c  ANSPROXY  %d %s\
311d0 6e 22 2c 20 70 46 69 6c 65 2d 3e 68 2c 0a 20 20  n", pFile->h,.  
311e0 20 20 20 20 20 20 20 20 20 28 72 63 3d 3d 53 51           (rc==SQ
311f0 4c 49 54 45 5f 4f 4b 20 3f 20 22 6f 6b 22 20 3a  LITE_OK ? "ok" :
31200 20 22 66 61 69 6c 65 64 22 29 29 29 3b 0a 20 20   "failed")));.  
31210 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
31220 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
31230 65 20 68 61 6e 64 6c 65 73 20 73 71 6c 69 74 65  e handles sqlite
31240 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 29  3_file_control()
31250 20 63 61 6c 6c 73 20 74 68 61 74 20 61 72 65 20   calls that are 
31260 73 70 65 63 69 66 69 63 0a 2a 2a 20 74 6f 20 70  specific.** to p
31270 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f  roxy locking..*/
31280 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78  .static int prox
31290 79 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 73 71 6c  yFileControl(sql
312a0 69 74 65 33 5f 66 69 6c 65 20 2a 69 64 2c 20 69  ite3_file *id, i
312b0 6e 74 20 6f 70 2c 20 76 6f 69 64 20 2a 70 41 72  nt op, void *pAr
312c0 67 29 7b 0a 20 20 73 77 69 74 63 68 28 20 6f 70  g){.  switch( op
312d0 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c   ){.    case SQL
312e0 49 54 45 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f 58  ITE_GET_LOCKPROX
312f0 59 46 49 4c 45 3a 20 7b 0a 20 20 20 20 20 20 75  YFILE: {.      u
31300 6e 69 78 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d  nixFile *pFile =
31310 20 28 75 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a   (unixFile*)id;.
31320 20 20 20 20 20 20 69 66 28 20 70 46 69 6c 65 2d        if( pFile-
31330 3e 70 4d 65 74 68 6f 64 20 3d 3d 20 26 70 72 6f  >pMethod == &pro
31340 78 79 49 6f 4d 65 74 68 6f 64 73 20 29 7b 0a 20  xyIoMethods ){. 
31350 20 20 20 20 20 20 20 70 72 6f 78 79 4c 6f 63 6b         proxyLock
31360 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78  ingContext *pCtx
31370 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67   = (proxyLocking
31380 43 6f 6e 74 65 78 74 2a 29 70 46 69 6c 65 2d 3e  Context*)pFile->
31390 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a  lockingContext;.
313a0 20 20 20 20 20 20 20 20 70 72 6f 78 79 54 61 6b          proxyTak
313b0 65 43 6f 6e 63 68 28 70 46 69 6c 65 29 3b 0a 20  eConch(pFile);. 
313c0 20 20 20 20 20 20 20 69 66 28 20 70 43 74 78 2d         if( pCtx-
313d0 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20 29  >lockProxyPath )
313e0 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 28 63 6f  {.          *(co
313f0 6e 73 74 20 63 68 61 72 20 2a 2a 29 70 41 72 67  nst char **)pArg
31400 20 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f   = pCtx->lockPro
31410 78 79 50 61 74 68 3b 0a 20 20 20 20 20 20 20 20  xyPath;.        
31420 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
31430 20 2a 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a   *(const char **
31440 29 70 41 72 67 20 3d 20 22 3a 61 75 74 6f 3a 20  )pArg = ":auto: 
31450 28 6e 6f 74 20 68 65 6c 64 29 22 3b 0a 20 20 20  (not held)";.   
31460 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 65       }.      } e
31470 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 2a 28  lse {.        *(
31480 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 29 70 41  const char **)pA
31490 72 67 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 20  rg = NULL;.     
314a0 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
314b0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
314c0 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
314d0 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49  _SET_LOCKPROXYFI
314e0 4c 45 3a 20 7b 0a 20 20 20 20 20 20 75 6e 69 78  LE: {.      unix
314f0 46 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75  File *pFile = (u
31500 6e 69 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20  nixFile*)id;.   
31510 20 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49     int rc = SQLI
31520 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 69 6e 74  TE_OK;.      int
31530 20 69 73 50 72 6f 78 79 53 74 79 6c 65 20 3d 20   isProxyStyle = 
31540 28 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 20  (pFile->pMethod 
31550 3d 3d 20 26 70 72 6f 78 79 49 6f 4d 65 74 68 6f  == &proxyIoMetho
31560 64 73 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ds);.      if( p
31570 41 72 67 3d 3d 4e 55 4c 4c 20 7c 7c 20 28 63 6f  Arg==NULL || (co
31580 6e 73 74 20 63 68 61 72 20 2a 29 70 41 72 67 3d  nst char *)pArg=
31590 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  =0 ){.        if
315a0 28 20 69 73 50 72 6f 78 79 53 74 79 6c 65 20 29  ( isProxyStyle )
315b0 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74  {.          /* t
315c0 75 72 6e 20 6f 66 66 20 70 72 6f 78 79 20 6c 6f  urn off proxy lo
315d0 63 6b 69 6e 67 20 2d 20 6e 6f 74 20 73 75 70 70  cking - not supp
315e0 6f 72 74 65 64 20 2a 2f 0a 20 20 20 20 20 20 20  orted */.       
315f0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
31600 52 52 4f 52 20 2f 2a 53 51 4c 49 54 45 5f 50 52  RROR /*SQLITE_PR
31610 4f 54 4f 43 4f 4c 3f 20 53 51 4c 49 54 45 5f 4d  OTOCOL? SQLITE_M
31620 49 53 55 53 45 3f 2a 2f 3b 0a 20 20 20 20 20 20  ISUSE?*/;.      
31630 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
31640 20 20 20 2f 2a 20 74 75 72 6e 20 6f 66 66 20 70     /* turn off p
31650 72 6f 78 79 20 6c 6f 63 6b 69 6e 67 20 2d 20 61  roxy locking - a
31660 6c 72 65 61 64 79 20 6f 66 66 20 2d 20 4e 4f 4f  lready off - NOO
31670 50 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 72  P */.          r
31680 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
31690 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
316a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f  else{.        co
316b0 6e 73 74 20 63 68 61 72 20 2a 70 72 6f 78 79 50  nst char *proxyP
316c0 61 74 68 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  ath = (const cha
316d0 72 20 2a 29 70 41 72 67 3b 0a 20 20 20 20 20 20  r *)pArg;.      
316e0 20 20 69 66 28 20 69 73 50 72 6f 78 79 53 74 79    if( isProxySty
316f0 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  le ){.          
31700 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74  proxyLockingCont
31710 65 78 74 20 2a 70 43 74 78 20 3d 20 0a 20 20 20  ext *pCtx = .   
31720 20 20 20 20 20 20 20 20 20 28 70 72 6f 78 79 4c           (proxyL
31730 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 2a 29 70  ockingContext*)p
31740 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e  File->lockingCon
31750 74 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20  text;.          
31760 69 66 28 20 21 73 74 72 63 6d 70 28 70 41 72 67  if( !strcmp(pArg
31770 2c 20 22 3a 61 75 74 6f 3a 22 29 20 0a 20 20 20  , ":auto:") .   
31780 20 20 20 20 20 20 20 20 7c 7c 20 28 70 43 74 78          || (pCtx
31790 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 20  ->lockProxyPath 
317a0 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  &&.             
317b0 20 20 21 73 74 72 6e 63 6d 70 28 70 43 74 78 2d    !strncmp(pCtx-
317c0 3e 6c 6f 63 6b 50 72 6f 78 79 50 61 74 68 2c 20  >lockProxyPath, 
317d0 70 72 6f 78 79 50 61 74 68 2c 20 4d 41 58 50 41  proxyPath, MAXPA
317e0 54 48 4c 45 4e 29 29 0a 20 20 20 20 20 20 20 20  THLEN)).        
317f0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20    ){.           
31800 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
31810 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
31820 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
31830 20 3d 20 73 77 69 74 63 68 4c 6f 63 6b 50 72 6f   = switchLockPro
31840 78 79 50 61 74 68 28 70 46 69 6c 65 2c 20 70 72  xyPath(pFile, pr
31850 6f 78 79 50 61 74 68 29 3b 0a 20 20 20 20 20 20  oxyPath);.      
31860 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65      }.        }e
31870 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  lse{.          /
31880 2a 20 74 75 72 6e 20 6f 6e 20 70 72 6f 78 79 20  * turn on proxy 
31890 66 69 6c 65 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a  file locking */.
318a0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70            rc = p
318b0 72 6f 78 79 54 72 61 6e 73 66 6f 72 6d 55 6e 69  roxyTransformUni
318c0 78 46 69 6c 65 28 70 46 69 6c 65 2c 20 70 72 6f  xFile(pFile, pro
318d0 78 79 50 61 74 68 29 3b 0a 20 20 20 20 20 20 20  xyPath);.       
318e0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
318f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
31900 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  }.    default: {
31910 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 30  .      assert( 0
31920 20 29 3b 20 20 2f 2a 20 54 68 65 20 63 61 6c 6c   );  /* The call
31930 20 61 73 73 75 72 65 73 20 74 68 61 74 20 6f 6e   assures that on
31940 6c 79 20 76 61 6c 69 64 20 6f 70 63 6f 64 65 73  ly valid opcodes
31950 20 61 72 65 20 73 65 6e 74 20 2a 2f 0a 20 20 20   are sent */.   
31960 20 7d 0a 20 20 7d 0a 20 20 2f 2a 4e 4f 54 52 45   }.  }.  /*NOTRE
31970 41 43 48 45 44 2a 2f 0a 20 20 72 65 74 75 72 6e  ACHED*/.  return
31980 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 7d   SQLITE_ERROR;.}
31990 0a 0a 2f 2a 0a 2a 2a 20 57 69 74 68 69 6e 20 74  ../*.** Within t
319a0 68 69 73 20 64 69 76 69 73 69 6f 6e 20 28 74 68  his division (th
319b0 65 20 70 72 6f 78 79 69 6e 67 20 6c 6f 63 6b 69  e proxying locki
319c0 6e 67 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ng implementatio
319d0 6e 29 20 74 68 65 20 70 72 6f 63 65 64 75 72 65  n) the procedure
319e0 73 0a 2a 2a 20 61 62 6f 76 65 20 74 68 69 73 20  s.** above this 
319f0 70 6f 69 6e 74 20 61 72 65 20 61 6c 6c 20 75 74  point are all ut
31a00 69 6c 69 74 69 65 73 2e 20 20 54 68 65 20 6c 6f  ilities.  The lo
31a10 63 6b 2d 72 65 6c 61 74 65 64 20 6d 65 74 68 6f  ck-related metho
31a20 64 73 20 6f 66 20 74 68 65 0a 2a 2a 20 70 72 6f  ds of the.** pro
31a30 78 79 2d 6c 6f 63 6b 69 6e 67 20 73 71 6c 69 74  xy-locking sqlit
31a40 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 20 6f 62 6a  e3_io_method obj
31a50 65 63 74 20 66 6f 6c 6c 6f 77 2e 0a 2a 2f 0a 0a  ect follow..*/..
31a60 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
31a70 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 74 68  ine checks if th
31a80 65 72 65 20 69 73 20 61 20 52 45 53 45 52 56 45  ere is a RESERVE
31a90 44 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74  D lock held on t
31aa0 68 65 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20  he specified.** 
31ab0 66 69 6c 65 20 62 79 20 74 68 69 73 20 6f 72 20  file by this or 
31ac0 61 6e 79 20 6f 74 68 65 72 20 70 72 6f 63 65 73  any other proces
31ad0 73 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63  s. If such a loc
31ae0 6b 20 69 73 20 68 65 6c 64 2c 20 73 65 74 20 2a  k is held, set *
31af0 70 52 65 73 4f 75 74 0a 2a 2a 20 74 6f 20 61 20  pResOut.** to a 
31b00 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20 6f  non-zero value o
31b10 74 68 65 72 77 69 73 65 20 2a 70 52 65 73 4f 75  therwise *pResOu
31b20 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f  t is set to zero
31b30 2e 20 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  .  The return va
31b40 6c 75 65 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f  lue.** is set to
31b50 20 53 51 4c 49 54 45 5f 4f 4b 20 75 6e 6c 65 73   SQLITE_OK unles
31b60 73 20 61 6e 20 49 2f 4f 20 65 72 72 6f 72 20 6f  s an I/O error o
31b70 63 63 75 72 73 20 64 75 72 69 6e 67 20 6c 6f 63  ccurs during loc
31b80 6b 20 63 68 65 63 6b 69 6e 67 2e 0a 2a 2f 0a 73  k checking..*/.s
31b90 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 43  tatic int proxyC
31ba0 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
31bb0 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 69  (sqlite3_file *i
31bc0 64 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29  d, int *pResOut)
31bd0 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20 2a 70   {.  unixFile *p
31be0 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69 6c 65  File = (unixFile
31bf0 2a 29 69 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d  *)id;.  int rc =
31c00 20 70 72 6f 78 79 54 61 6b 65 43 6f 6e 63 68 28   proxyTakeConch(
31c10 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 72 63  pFile);.  if( rc
31c20 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
31c30 20 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43     proxyLockingC
31c40 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 3d 20 28  ontext *pCtx = (
31c50 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74  proxyLockingCont
31c60 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63  ext *)pFile->loc
31c70 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20  kingContext;.   
31c80 20 69 66 28 20 70 43 74 78 2d 3e 63 6f 6e 63 68   if( pCtx->conch
31c90 48 65 6c 64 3e 30 20 29 7b 0a 20 20 20 20 20 20  Held>0 ){.      
31ca0 75 6e 69 78 46 69 6c 65 20 2a 70 72 6f 78 79 20  unixFile *proxy 
31cb0 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78  = pCtx->lockProx
31cc0 79 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  y;.      return 
31cd0 70 72 6f 78 79 2d 3e 70 4d 65 74 68 6f 64 2d 3e  proxy->pMethod->
31ce0 78 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  xCheckReservedLo
31cf0 63 6b 28 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ck((sqlite3_file
31d00 2a 29 70 72 6f 78 79 2c 20 70 52 65 73 4f 75 74  *)proxy, pResOut
31d10 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 20 2f 2a  );.    }else{ /*
31d20 20 63 6f 6e 63 68 48 65 6c 64 20 3c 20 30 20 69   conchHeld < 0 i
31d30 73 20 6c 6f 63 6b 6c 65 73 73 20 2a 2f 0a 20 20  s lockless */.  
31d40 20 20 20 20 70 52 65 73 4f 75 74 3d 30 3b 0a 20      pResOut=0;. 
31d50 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
31d60 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c  n rc;.}../*.** L
31d70 6f 63 6b 20 74 68 65 20 66 69 6c 65 20 77 69 74  ock the file wit
31d80 68 20 74 68 65 20 6c 6f 63 6b 20 73 70 65 63 69  h the lock speci
31d90 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65  fied by paramete
31da0 72 20 65 46 69 6c 65 4c 6f 63 6b 20 2d 20 6f 6e  r eFileLock - on
31db0 65 0a 2a 2a 20 6f 66 20 74 68 65 20 66 6f 6c 6c  e.** of the foll
31dc0 6f 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  owing:.**.**    
31dd0 20 28 31 29 20 53 48 41 52 45 44 5f 4c 4f 43 4b   (1) SHARED_LOCK
31de0 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 45 53 45  .**     (2) RESE
31df0 52 56 45 44 5f 4c 4f 43 4b 0a 2a 2a 20 20 20 20  RVED_LOCK.**    
31e00 20 28 33 29 20 50 45 4e 44 49 4e 47 5f 4c 4f 43   (3) PENDING_LOC
31e10 4b 0a 2a 2a 20 20 20 20 20 28 34 29 20 45 58 43  K.**     (4) EXC
31e20 4c 55 53 49 56 45 5f 4c 4f 43 4b 0a 2a 2a 0a 2a  LUSIVE_LOCK.**.*
31e30 2a 20 53 6f 6d 65 74 69 6d 65 73 20 77 68 65 6e  * Sometimes when
31e40 20 72 65 71 75 65 73 74 69 6e 67 20 6f 6e 65 20   requesting one 
31e50 6c 6f 63 6b 20 73 74 61 74 65 2c 20 61 64 64 69  lock state, addi
31e60 74 69 6f 6e 61 6c 20 6c 6f 63 6b 20 73 74 61 74  tional lock stat
31e70 65 73 0a 2a 2a 20 61 72 65 20 69 6e 73 65 72 74  es.** are insert
31e80 65 64 20 69 6e 20 62 65 74 77 65 65 6e 2e 20 20  ed in between.  
31e90 54 68 65 20 6c 6f 63 6b 69 6e 67 20 6d 69 67 68  The locking migh
31ea0 74 20 66 61 69 6c 20 6f 6e 20 6f 6e 65 20 6f 66  t fail on one of
31eb0 20 74 68 65 20 6c 61 74 65 72 0a 2a 2a 20 74 72   the later.** tr
31ec0 61 6e 73 69 74 69 6f 6e 73 20 6c 65 61 76 69 6e  ansitions leavin
31ed0 67 20 74 68 65 20 6c 6f 63 6b 20 73 74 61 74 65  g the lock state
31ee0 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20   different from 
31ef0 77 68 61 74 20 69 74 20 73 74 61 72 74 65 64 20  what it started 
31f00 62 75 74 0a 2a 2a 20 73 74 69 6c 6c 20 73 68 6f  but.** still sho
31f10 72 74 20 6f 66 20 69 74 73 20 67 6f 61 6c 2e 20  rt of its goal. 
31f20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   The following c
31f30 68 61 72 74 20 73 68 6f 77 73 20 74 68 65 20 61  hart shows the a
31f40 6c 6c 6f 77 65 64 0a 2a 2a 20 74 72 61 6e 73 69  llowed.** transi
31f50 74 69 6f 6e 73 20 61 6e 64 20 74 68 65 20 69 6e  tions and the in
31f60 73 65 72 74 65 64 20 69 6e 74 65 72 6d 65 64 69  serted intermedi
31f70 61 74 65 20 73 74 61 74 65 73 3a 0a 2a 2a 0a 2a  ate states:.**.*
31f80 2a 20 20 20 20 55 4e 4c 4f 43 4b 45 44 20 2d 3e  *    UNLOCKED ->
31f90 20 53 48 41 52 45 44 0a 2a 2a 20 20 20 20 53 48   SHARED.**    SH
31fa0 41 52 45 44 20 2d 3e 20 52 45 53 45 52 56 45 44  ARED -> RESERVED
31fb0 0a 2a 2a 20 20 20 20 53 48 41 52 45 44 20 2d 3e  .**    SHARED ->
31fc0 20 28 50 45 4e 44 49 4e 47 29 20 2d 3e 20 45 58   (PENDING) -> EX
31fd0 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 52 45  CLUSIVE.**    RE
31fe0 53 45 52 56 45 44 20 2d 3e 20 28 50 45 4e 44 49  SERVED -> (PENDI
31ff0 4e 47 29 20 2d 3e 20 45 58 43 4c 55 53 49 56 45  NG) -> EXCLUSIVE
32000 0a 2a 2a 20 20 20 20 50 45 4e 44 49 4e 47 20 2d  .**    PENDING -
32010 3e 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 0a 2a  > EXCLUSIVE.**.*
32020 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * This routine w
32030 69 6c 6c 20 6f 6e 6c 79 20 69 6e 63 72 65 61 73  ill only increas
32040 65 20 61 20 6c 6f 63 6b 2e 20 20 55 73 65 20 74  e a lock.  Use t
32050 68 65 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f  he sqlite3OsUnlo
32060 63 6b 28 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  ck().** routine 
32070 74 6f 20 6c 6f 77 65 72 20 61 20 6c 6f 63 6b 69  to lower a locki
32080 6e 67 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61  ng level..*/.sta
32090 74 69 63 20 69 6e 74 20 70 72 6f 78 79 4c 6f 63  tic int proxyLoc
320a0 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
320b0 69 64 2c 20 69 6e 74 20 65 46 69 6c 65 4c 6f 63  id, int eFileLoc
320c0 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69 6c 65 20  k) {.  unixFile 
320d0 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69 78 46 69  *pFile = (unixFi
320e0 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74 20 72 63  le*)id;.  int rc
320f0 20 3d 20 70 72 6f 78 79 54 61 6b 65 43 6f 6e 63   = proxyTakeConc
32100 68 28 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20  h(pFile);.  if( 
32110 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
32120 0a 20 20 20 20 70 72 6f 78 79 4c 6f 63 6b 69 6e  .    proxyLockin
32130 67 43 6f 6e 74 65 78 74 20 2a 70 43 74 78 20 3d  gContext *pCtx =
32140 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f   (proxyLockingCo
32150 6e 74 65 78 74 20 2a 29 70 46 69 6c 65 2d 3e 6c  ntext *)pFile->l
32160 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 3b 0a 20  ockingContext;. 
32170 20 20 20 69 66 28 20 70 43 74 78 2d 3e 63 6f 6e     if( pCtx->con
32180 63 68 48 65 6c 64 3e 30 20 29 7b 0a 20 20 20 20  chHeld>0 ){.    
32190 20 20 75 6e 69 78 46 69 6c 65 20 2a 70 72 6f 78    unixFile *prox
321a0 79 20 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72  y = pCtx->lockPr
321b0 6f 78 79 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  oxy;.      rc = 
321c0 70 72 6f 78 79 2d 3e 70 4d 65 74 68 6f 64 2d 3e  proxy->pMethod->
321d0 78 4c 6f 63 6b 28 28 73 71 6c 69 74 65 33 5f 66  xLock((sqlite3_f
321e0 69 6c 65 2a 29 70 72 6f 78 79 2c 20 65 46 69 6c  ile*)proxy, eFil
321f0 65 4c 6f 63 6b 29 3b 0a 20 20 20 20 20 20 70 46  eLock);.      pF
32200 69 6c 65 2d 3e 65 46 69 6c 65 4c 6f 63 6b 20 3d  ile->eFileLock =
32210 20 70 72 6f 78 79 2d 3e 65 46 69 6c 65 4c 6f 63   proxy->eFileLoc
32220 6b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  k;.    }else{.  
32230 20 20 20 20 2f 2a 20 63 6f 6e 63 68 48 65 6c 64      /* conchHeld
32240 20 3c 20 30 20 69 73 20 6c 6f 63 6b 6c 65 73 73   < 0 is lockless
32250 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   */.    }.  }.  
32260 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
32270 2a 0a 2a 2a 20 4c 6f 77 65 72 20 74 68 65 20 6c  *.** Lower the l
32280 6f 63 6b 69 6e 67 20 6c 65 76 65 6c 20 6f 6e 20  ocking level on 
32290 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
322a0 70 46 69 6c 65 20 74 6f 20 65 46 69 6c 65 4c 6f  pFile to eFileLo
322b0 63 6b 2e 20 20 65 46 69 6c 65 4c 6f 63 6b 0a 2a  ck.  eFileLock.*
322c0 2a 20 6d 75 73 74 20 62 65 20 65 69 74 68 65 72  * must be either
322d0 20 4e 4f 5f 4c 4f 43 4b 20 6f 72 20 53 48 41 52   NO_LOCK or SHAR
322e0 45 44 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 49  ED_LOCK..**.** I
322f0 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 6c 65  f the locking le
32300 76 65 6c 20 6f 66 20 74 68 65 20 66 69 6c 65 20  vel of the file 
32310 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 6c  descriptor is al
32320 72 65 61 64 79 20 61 74 20 6f 72 20 62 65 6c 6f  ready at or belo
32330 77 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74  w.** the request
32340 65 64 20 6c 6f 63 6b 69 6e 67 20 6c 65 76 65 6c  ed locking level
32350 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
32360 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
32370 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79 55 6e  atic int proxyUn
32380 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  lock(sqlite3_fil
32390 65 20 2a 69 64 2c 20 69 6e 74 20 65 46 69 6c 65  e *id, int eFile
323a0 4c 6f 63 6b 29 20 7b 0a 20 20 75 6e 69 78 46 69  Lock) {.  unixFi
323b0 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
323c0 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 69 6e 74  xFile*)id;.  int
323d0 20 72 63 20 3d 20 70 72 6f 78 79 54 61 6b 65 43   rc = proxyTakeC
323e0 6f 6e 63 68 28 70 46 69 6c 65 29 3b 0a 20 20 69  onch(pFile);.  i
323f0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
32400 20 29 7b 0a 20 20 20 20 70 72 6f 78 79 4c 6f 63   ){.    proxyLoc
32410 6b 69 6e 67 43 6f 6e 74 65 78 74 20 2a 70 43 74  kingContext *pCt
32420 78 20 3d 20 28 70 72 6f 78 79 4c 6f 63 6b 69 6e  x = (proxyLockin
32430 67 43 6f 6e 74 65 78 74 20 2a 29 70 46 69 6c 65  gContext *)pFile
32440 2d 3e 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74  ->lockingContext
32450 3b 0a 20 20 20 20 69 66 28 20 70 43 74 78 2d 3e  ;.    if( pCtx->
32460 63 6f 6e 63 68 48 65 6c 64 3e 30 20 29 7b 0a 20  conchHeld>0 ){. 
32470 20 20 20 20 20 75 6e 69 78 46 69 6c 65 20 2a 70       unixFile *p
32480 72 6f 78 79 20 3d 20 70 43 74 78 2d 3e 6c 6f 63  roxy = pCtx->loc
32490 6b 50 72 6f 78 79 3b 0a 20 20 20 20 20 20 72 63  kProxy;.      rc
324a0 20 3d 20 70 72 6f 78 79 2d 3e 70 4d 65 74 68 6f   = proxy->pMetho
324b0 64 2d 3e 78 55 6e 6c 6f 63 6b 28 28 73 71 6c 69  d->xUnlock((sqli
324c0 74 65 33 5f 66 69 6c 65 2a 29 70 72 6f 78 79 2c  te3_file*)proxy,
324d0 20 65 46 69 6c 65 4c 6f 63 6b 29 3b 0a 20 20 20   eFileLock);.   
324e0 20 20 20 70 46 69 6c 65 2d 3e 65 46 69 6c 65 4c     pFile->eFileL
324f0 6f 63 6b 20 3d 20 70 72 6f 78 79 2d 3e 65 46 69  ock = proxy->eFi
32500 6c 65 4c 6f 63 6b 3b 0a 20 20 20 20 7d 65 6c 73  leLock;.    }els
32510 65 7b 0a 20 20 20 20 20 20 2f 2a 20 63 6f 6e 63  e{.      /* conc
32520 68 48 65 6c 64 20 3c 20 30 20 69 73 20 6c 6f 63  hHeld < 0 is loc
32530 6b 6c 65 73 73 20 2a 2f 0a 20 20 20 20 7d 0a 20  kless */.    }. 
32540 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
32550 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61  }../*.** Close a
32560 20 66 69 6c 65 20 74 68 61 74 20 75 73 65 73 20   file that uses 
32570 70 72 6f 78 79 20 6c 6f 63 6b 73 2e 0a 2a 2f 0a  proxy locks..*/.
32580 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 78 79  static int proxy
32590 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69  Close(sqlite3_fi
325a0 6c 65 20 2a 69 64 29 20 7b 0a 20 20 69 66 28 20  le *id) {.  if( 
325b0 69 64 20 29 7b 0a 20 20 20 20 75 6e 69 78 46 69  id ){.    unixFi
325c0 6c 65 20 2a 70 46 69 6c 65 20 3d 20 28 75 6e 69  le *pFile = (uni
325d0 78 46 69 6c 65 2a 29 69 64 3b 0a 20 20 20 20 70  xFile*)id;.    p
325e0 72 6f 78 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65  roxyLockingConte
325f0 78 74 20 2a 70 43 74 78 20 3d 20 28 70 72 6f 78  xt *pCtx = (prox
32600 79 4c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20  yLockingContext 
32610 2a 29 70 46 69 6c 65 2d 3e 6c 6f 63 6b 69 6e 67  *)pFile->locking
32620 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 75 6e 69  Context;.    uni
32630 78 46 69 6c 65 20 2a 6c 6f 63 6b 50 72 6f 78 79  xFile *lockProxy
32640 20 3d 20 70 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f   = pCtx->lockPro
32650 78 79 3b 0a 20 20 20 20 75 6e 69 78 46 69 6c 65  xy;.    unixFile
32660 20 2a 63 6f 6e 63 68 46 69 6c 65 20 3d 20 70 43   *conchFile = pC
32670 74 78 2d 3e 63 6f 6e 63 68 46 69 6c 65 3b 0a 20  tx->conchFile;. 
32680 20 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49     int rc = SQLI
32690 54 45 5f 4f 4b 3b 0a 20 20 20 20 0a 20 20 20 20  TE_OK;.    .    
326a0 69 66 28 20 6c 6f 63 6b 50 72 6f 78 79 20 29 7b  if( lockProxy ){
326b0 0a 20 20 20 20 20 20 72 63 20 3d 20 6c 6f 63 6b  .      rc = lock
326c0 50 72 6f 78 79 2d 3e 70 4d 65 74 68 6f 64 2d 3e  Proxy->pMethod->
326d0 78 55 6e 6c 6f 63 6b 28 28 73 71 6c 69 74 65 33  xUnlock((sqlite3
326e0 5f 66 69 6c 65 2a 29 6c 6f 63 6b 50 72 6f 78 79  _file*)lockProxy
326f0 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  , NO_LOCK);.    
32700 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
32710 6e 20 72 63 3b 0a 20 20 20 20 20 20 72 63 20 3d  n rc;.      rc =
32720 20 6c 6f 63 6b 50 72 6f 78 79 2d 3e 70 4d 65 74   lockProxy->pMet
32730 68 6f 64 2d 3e 78 43 6c 6f 73 65 28 28 73 71 6c  hod->xClose((sql
32740 69 74 65 33 5f 66 69 6c 65 2a 29 6c 6f 63 6b 50  ite3_file*)lockP
32750 72 6f 78 79 29 3b 0a 20 20 20 20 20 20 69 66 28  roxy);.      if(
32760 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
32770 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
32780 72 65 65 28 6c 6f 63 6b 50 72 6f 78 79 29 3b 0a  ree(lockProxy);.
32790 20 20 20 20 20 20 70 43 74 78 2d 3e 6c 6f 63 6b        pCtx->lock
327a0 50 72 6f 78 79 20 3d 20 30 3b 0a 20 20 20 20 7d  Proxy = 0;.    }
327b0 0a 20 20 20 20 69 66 28 20 63 6f 6e 63 68 46 69  .    if( conchFi
327c0 6c 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  le ){.      if( 
327d0 70 43 74 78 2d 3e 63 6f 6e 63 68 48 65 6c 64 20  pCtx->conchHeld 
327e0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
327f0 70 72 6f 78 79 52 65 6c 65 61 73 65 43 6f 6e 63  proxyReleaseConc
32800 68 28 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20  h(pFile);.      
32810 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
32820 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
32830 20 20 20 20 72 63 20 3d 20 63 6f 6e 63 68 46 69      rc = conchFi
32840 6c 65 2d 3e 70 4d 65 74 68 6f 64 2d 3e 78 43 6c  le->pMethod->xCl
32850 6f 73 65 28 28 73 71 6c 69 74 65 33 5f 66 69 6c  ose((sqlite3_fil
32860 65 2a 29 63 6f 6e 63 68 46 69 6c 65 29 3b 0a 20  e*)conchFile);. 
32870 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
32880 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 73  turn rc;.      s
32890 71 6c 69 74 65 33 5f 66 72 65 65 28 63 6f 6e 63  qlite3_free(conc
328a0 68 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20  hFile);.    }.  
328b0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
328c0 43 74 78 2d 3e 6c 6f 63 6b 50 72 6f 78 79 50 61  Ctx->lockProxyPa
328d0 74 68 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  th);.    sqlite3
328e0 5f 66 72 65 65 28 70 43 74 78 2d 3e 63 6f 6e 63  _free(pCtx->conc
328f0 68 46 69 6c 65 50 61 74 68 29 3b 0a 20 20 20 20  hFilePath);.    
32900 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 74  sqlite3_free(pCt
32910 78 2d 3e 64 62 50 61 74 68 29 3b 0a 20 20 20 20  x->dbPath);.    
32920 2f 2a 20 72 65 73 74 6f 72 65 20 74 68 65 20 6f  /* restore the o
32930 72 69 67 69 6e 61 6c 20 6c 6f 63 6b 69 6e 67 20  riginal locking 
32940 63 6f 6e 74 65 78 74 20 61 6e 64 20 70 4d 65 74  context and pMet
32950 68 6f 64 20 74 68 65 6e 20 63 6c 6f 73 65 20 69  hod then close i
32960 74 20 2a 2f 0a 20 20 20 20 70 46 69 6c 65 2d 3e  t */.    pFile->
32970 6c 6f 63 6b 69 6e 67 43 6f 6e 74 65 78 74 20 3d  lockingContext =
32980 20 70 43 74 78 2d 3e 6f 6c 64 4c 6f 63 6b 69 6e   pCtx->oldLockin
32990 67 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 70 46  gContext;.    pF
329a0 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 20 3d 20 70  ile->pMethod = p
329b0 43 74 78 2d 3e 70 4f 6c 64 4d 65 74 68 6f 64 3b  Ctx->pOldMethod;
329c0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
329d0 65 28 70 43 74 78 29 3b 0a 20 20 20 20 72 65 74  e(pCtx);.    ret
329e0 75 72 6e 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68  urn pFile->pMeth
329f0 6f 64 2d 3e 78 43 6c 6f 73 65 28 69 64 29 3b 0a  od->xClose(id);.
32a00 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
32a10 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 0a 23 65 6e  ITE_OK;.}....#en
32a20 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f  dif /* defined(_
32a30 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c  _APPLE__) && SQL
32a40 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
32a50 4e 47 5f 53 54 59 4c 45 20 2a 2f 0a 2f 2a 0a 2a  NG_STYLE */./*.*
32a60 2a 20 54 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b  * The proxy lock
32a70 69 6e 67 20 73 74 79 6c 65 20 69 73 20 69 6e 74  ing style is int
32a80 65 6e 64 65 64 20 66 6f 72 20 75 73 65 20 77 69  ended for use wi
32a90 74 68 20 41 46 50 20 66 69 6c 65 73 79 73 74 65  th AFP filesyste
32aa0 6d 73 2e 0a 2a 2a 20 41 6e 64 20 73 69 6e 63 65  ms..** And since
32ab0 20 41 46 50 20 69 73 20 6f 6e 6c 79 20 73 75 70   AFP is only sup
32ac0 70 6f 72 74 65 64 20 6f 6e 20 4d 61 63 4f 53 58  ported on MacOSX
32ad0 2c 20 74 68 65 20 70 72 6f 78 79 20 6c 6f 63 6b  , the proxy lock
32ae0 69 6e 67 20 69 73 20 61 6c 73 6f 0a 2a 2a 20 72  ing is also.** r
32af0 65 73 74 72 69 63 74 65 64 20 74 6f 20 4d 61 63  estricted to Mac
32b00 4f 53 58 2e 0a 2a 2a 20 0a 2a 2a 0a 2a 2a 2a 2a  OSX..** .**.****
32b10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 20  *************** 
32b20 45 6e 64 20 6f 66 20 74 68 65 20 70 72 6f 78 79  End of the proxy
32b30 20 6c 6f 63 6b 20 69 6d 70 6c 65 6d 65 6e 74 61   lock implementa
32b40 74 69 6f 6e 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  tion ***********
32b50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 2a 2a  ***********.****
32b60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
32b70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
32b80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
32b90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
32ba0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a  **********/../*.
32bb0 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  ** Initialize th
32bc0 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74  e operating syst
32bd0 65 6d 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2a  em interface..**
32be0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
32bf0 20 72 65 67 69 73 74 65 72 73 20 61 6c 6c 20 56   registers all V
32c00 46 53 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  FS implementatio
32c10 6e 73 20 66 6f 72 20 75 6e 69 78 2d 6c 69 6b 65  ns for unix-like
32c20 20 6f 70 65 72 61 74 69 6e 67 0a 2a 2a 20 73 79   operating.** sy
32c30 73 74 65 6d 73 2e 20 20 54 68 69 73 20 72 6f 75  stems.  This rou
32c40 74 69 6e 65 2c 20 61 6e 64 20 74 68 65 20 73 71  tine, and the sq
32c50 6c 69 74 65 33 5f 6f 73 5f 65 6e 64 28 29 20 72  lite3_os_end() r
32c60 6f 75 74 69 6e 65 20 74 68 61 74 20 66 6f 6c 6c  outine that foll
32c70 6f 77 73 2c 0a 2a 2a 20 73 68 6f 75 6c 64 20 62  ows,.** should b
32c80 65 20 74 68 65 20 6f 6e 6c 79 20 72 6f 75 74 69  e the only routi
32c90 6e 65 73 20 69 6e 20 74 68 69 73 20 66 69 6c 65  nes in this file
32ca0 20 74 68 61 74 20 61 72 65 20 76 69 73 69 62 6c   that are visibl
32cb0 65 20 66 72 6f 6d 20 6f 74 68 65 72 0a 2a 2a 20  e from other.** 
32cc0 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  files..**.** Thi
32cd0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
32ce0 6c 65 64 20 6f 6e 63 65 20 64 75 72 69 6e 67 20  led once during 
32cf0 53 51 4c 69 74 65 20 69 6e 69 74 69 61 6c 69 7a  SQLite initializ
32d00 61 74 69 6f 6e 20 61 6e 64 20 62 79 20 61 0a 2a  ation and by a.*
32d10 2a 20 73 69 6e 67 6c 65 20 74 68 72 65 61 64 2e  * single thread.
32d20 20 20 54 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c    The memory all
32d30 6f 63 61 74 69 6f 6e 20 61 6e 64 20 6d 75 74 65  ocation and mute
32d40 78 20 73 75 62 73 79 73 74 65 6d 73 20 68 61 76  x subsystems hav
32d50 65 20 6e 6f 74 0a 2a 2a 20 6e 65 63 65 73 73 61  e not.** necessa
32d60 72 69 6c 79 20 62 65 65 6e 20 69 6e 69 74 69 61  rily been initia
32d70 6c 69 7a 65 64 20 77 68 65 6e 20 74 68 69 73 20  lized when this 
32d80 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
32d90 64 2c 20 61 6e 64 20 73 6f 20 74 68 65 79 0a 2a  d, and so they.*
32da0 2a 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20  * should not be 
32db0 75 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  used..*/.int sql
32dc0 69 74 65 33 5f 6f 73 5f 69 6e 69 74 28 76 6f 69  ite3_os_init(voi
32dd0 64 29 7b 20 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20  d){ .  /* .  ** 
32de0 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61  The following ma
32df0 63 72 6f 20 64 65 66 69 6e 65 73 20 61 6e 20 69  cro defines an i
32e00 6e 69 74 69 61 6c 69 7a 65 72 20 66 6f 72 20 61  nitializer for a
32e10 6e 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6f 62  n sqlite3_vfs ob
32e20 6a 65 63 74 2e 0a 20 20 2a 2a 20 54 68 65 20 6e  ject..  ** The n
32e30 61 6d 65 20 6f 66 20 74 68 65 20 56 46 53 20 69  ame of the VFS i
32e40 73 20 4e 41 4d 45 2e 20 20 54 68 65 20 70 41 70  s NAME.  The pAp
32e50 70 44 61 74 61 20 69 73 20 61 20 70 6f 69 6e 74  pData is a point
32e60 65 72 20 74 6f 20 61 20 70 6f 69 6e 74 65 72 0a  er to a pointer.
32e70 20 20 2a 2a 20 74 6f 20 74 68 65 20 22 66 69 6e    ** to the "fin
32e80 64 65 72 22 20 66 75 6e 63 74 69 6f 6e 2e 20 20  der" function.  
32e90 28 70 41 70 70 44 61 74 61 20 69 73 20 61 20 70  (pAppData is a p
32ea0 6f 69 6e 74 65 72 20 74 6f 20 61 20 70 6f 69 6e  ointer to a poin
32eb0 74 65 72 20 62 65 63 61 75 73 65 0a 20 20 2a 2a  ter because.  **
32ec0 20 73 69 6c 6c 79 20 43 39 30 20 72 75 6c 65 73   silly C90 rules
32ed0 20 70 72 6f 68 69 62 69 74 20 61 20 76 6f 69 64   prohibit a void
32ee0 2a 20 66 72 6f 6d 20 62 65 69 6e 67 20 63 61 73  * from being cas
32ef0 74 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20  t to a function 
32f00 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 61 6e 64  pointer.  ** and
32f10 20 73 6f 20 77 65 20 68 61 76 65 20 74 6f 20 67   so we have to g
32f20 6f 20 74 68 72 6f 75 67 68 20 74 68 65 20 69 6e  o through the in
32f30 74 65 72 6d 65 64 69 61 74 65 20 70 6f 69 6e 74  termediate point
32f40 65 72 20 74 6f 20 61 76 6f 69 64 20 70 72 6f 62  er to avoid prob
32f50 6c 65 6d 73 0a 20 20 2a 2a 20 77 68 65 6e 20 63  lems.  ** when c
32f60 6f 6d 70 69 6c 69 6e 67 20 77 69 74 68 20 2d 70  ompiling with -p
32f70 65 64 61 6e 74 69 63 2d 65 72 72 6f 72 73 20 6f  edantic-errors o
32f80 6e 20 47 43 43 2e 29 0a 20 20 2a 2a 0a 20 20 2a  n GCC.).  **.  *
32f90 2a 20 54 68 65 20 46 49 4e 44 45 52 20 70 61 72  * The FINDER par
32fa0 61 6d 65 74 65 72 20 74 6f 20 74 68 69 73 20 6d  ameter to this m
32fb0 61 63 72 6f 20 69 73 20 74 68 65 20 6e 61 6d 65  acro is the name
32fc0 20 6f 66 20 74 68 65 20 70 6f 69 6e 74 65 72 20   of the pointer 
32fd0 74 6f 20 74 68 65 0a 20 20 2a 2a 20 66 69 6e 64  to the.  ** find
32fe0 65 72 2d 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68  er-function.  Th
32ff0 65 20 66 69 6e 64 65 72 2d 66 75 6e 63 74 69 6f  e finder-functio
33000 6e 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e  n returns a poin
33010 74 65 72 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20  ter to the.  ** 
33020 73 71 6c 69 74 65 5f 69 6f 5f 6d 65 74 68 6f 64  sqlite_io_method
33030 73 20 6f 62 6a 65 63 74 20 74 68 61 74 20 69 6d  s object that im
33040 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 64 65 73  plements the des
33050 69 72 65 64 20 6c 6f 63 6b 69 6e 67 0a 20 20 2a  ired locking.  *
33060 2a 20 62 65 68 61 76 69 6f 72 73 2e 20 20 53 65  * behaviors.  Se
33070 65 20 74 68 65 20 64 69 76 69 73 69 6f 6e 20 61  e the division a
33080 62 6f 76 65 20 74 68 61 74 20 63 6f 6e 74 61 69  bove that contai
33090 6e 73 20 74 68 65 20 49 4f 4d 45 54 48 4f 44 53  ns the IOMETHODS
330a0 0a 20 20 2a 2a 20 6d 61 63 72 6f 20 66 6f 72 20  .  ** macro for 
330b0 61 64 64 69 74 69 6f 6e 20 69 6e 66 6f 72 6d 61  addition informa
330c0 74 69 6f 6e 20 6f 6e 20 66 69 6e 64 65 72 2d 66  tion on finder-f
330d0 75 6e 63 74 69 6f 6e 73 2e 0a 20 20 2a 2a 0a 20  unctions..  **. 
330e0 20 2a 2a 20 4d 6f 73 74 20 66 69 6e 64 65 72 73   ** Most finders
330f0 20 73 69 6d 70 6c 79 20 72 65 74 75 72 6e 20 61   simply return a
33100 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 69   pointer to a fi
33110 78 65 64 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d  xed sqlite3_io_m
33120 65 74 68 6f 64 73 0a 20 20 2a 2a 20 6f 62 6a 65  ethods.  ** obje
33130 63 74 2e 20 20 42 75 74 20 74 68 65 20 22 61 75  ct.  But the "au
33140 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 22 20  tolockIoFinder" 
33150 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 4d 61 63  available on Mac
33160 4f 53 58 20 64 6f 65 73 20 61 20 6c 69 74 74 6c  OSX does a littl
33170 65 0a 20 20 2a 2a 20 6d 6f 72 65 20 74 68 61 6e  e.  ** more than
33180 20 74 68 61 74 3b 20 69 74 20 6c 6f 6f 6b 73 20   that; it looks 
33190 61 74 20 74 68 65 20 66 69 6c 65 73 79 73 74 65  at the filesyste
331a0 6d 20 74 79 70 65 20 74 68 61 74 20 68 6f 73 74  m type that host
331b0 73 20 74 68 65 20 0a 20 20 2a 2a 20 64 61 74 61  s the .  ** data
331c0 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 74 72  base file and tr
331d0 69 65 73 20 74 6f 20 63 68 6f 6f 73 65 20 61 6e  ies to choose an
331e0 20 6c 6f 63 6b 69 6e 67 20 6d 65 74 68 6f 64 20   locking method 
331f0 61 70 70 72 6f 70 72 69 61 74 65 20 66 6f 72 0a  appropriate for.
33200 20 20 2a 2a 20 74 68 61 74 20 66 69 6c 65 73 79    ** that filesy
33210 73 74 65 6d 20 74 69 6d 65 2e 0a 20 20 2a 2f 0a  stem time..  */.
33220 20 20 23 64 65 66 69 6e 65 20 55 4e 49 58 56 46    #define UNIXVF
33230 53 28 56 46 53 4e 41 4d 45 2c 20 46 49 4e 44 45  S(VFSNAME, FINDE
33240 52 29 20 7b 20 20 20 20 20 20 20 20 20 20 20 20  R) {            
33250 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
33260 20 20 32 2c 20 20 20 20 20 20 20 20 20 20 20 20    2,            
33270 20 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73          /* iVers
33280 69 6f 6e 20 2a 2f 20 20 20 20 20 20 20 20 20 20  ion */          
33290 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
332a0 73 69 7a 65 6f 66 28 75 6e 69 78 46 69 6c 65 29  sizeof(unixFile)
332b0 2c 20 20 20 20 20 2f 2a 20 73 7a 4f 73 46 69 6c  ,     /* szOsFil
332c0 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  e */            
332d0 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 4d 41          \.    MA
332e0 58 5f 50 41 54 48 4e 41 4d 45 2c 20 20 20 20 20  X_PATHNAME,     
332f0 20 20 20 20 2f 2a 20 6d 78 50 61 74 68 6e 61 6d      /* mxPathnam
33300 65 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20 20  e */            
33310 20 20 20 20 20 20 5c 0a 20 20 20 20 30 2c 20 20        \.    0,  
33320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33330 20 20 2f 2a 20 70 4e 65 78 74 20 2a 2f 20 20 20    /* pNext */   
33340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33350 20 20 20 20 5c 0a 20 20 20 20 56 46 53 4e 41 4d      \.    VFSNAM
33360 45 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  E,              
33370 2f 2a 20 7a 4e 61 6d 65 20 2a 2f 20 20 20 20 20  /* zName */     
33380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33390 20 20 5c 0a 20 20 20 20 28 76 6f 69 64 2a 29 26    \.    (void*)&
333a0 46 49 4e 44 45 52 2c 20 20 20 20 20 20 20 2f 2a  FINDER,       /*
333b0 20 70 41 70 70 44 61 74 61 20 2a 2f 20 20 20 20   pAppData */    
333c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
333d0 5c 0a 20 20 20 20 75 6e 69 78 4f 70 65 6e 2c 20  \.    unixOpen, 
333e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
333f0 4f 70 65 6e 20 2a 2f 20 20 20 20 20 20 20 20 20  Open */         
33400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
33410 20 20 20 20 75 6e 69 78 44 65 6c 65 74 65 2c 20      unixDelete, 
33420 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 65            /* xDe
33430 6c 65 74 65 20 2a 2f 20 20 20 20 20 20 20 20 20  lete */         
33440 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
33450 20 20 75 6e 69 78 41 63 63 65 73 73 2c 20 20 20    unixAccess,   
33460 20 20 20 20 20 20 20 20 2f 2a 20 78 41 63 63 65          /* xAcce
33470 73 73 20 2a 2f 20 20 20 20 20 20 20 20 20 20 20  ss */           
33480 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
33490 75 6e 69 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65  unixFullPathname
334a0 2c 20 20 20 20 20 2f 2a 20 78 46 75 6c 6c 50 61  ,     /* xFullPa
334b0 74 68 6e 61 6d 65 20 2a 2f 20 20 20 20 20 20 20  thname */       
334c0 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e          \.    un
334d0 69 78 44 6c 4f 70 65 6e 2c 20 20 20 20 20 20 20  ixDlOpen,       
334e0 20 20 20 20 2f 2a 20 78 44 6c 4f 70 65 6e 20 2a      /* xDlOpen *
334f0 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
33500 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78        \.    unix
33510 44 6c 45 72 72 6f 72 2c 20 20 20 20 20 20 20 20  DlError,        
33520 20 20 2f 2a 20 78 44 6c 45 72 72 6f 72 20 2a 2f    /* xDlError */
33530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33540 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78 44 6c      \.    unixDl
33550 53 79 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20  Sym,            
33560 2f 2a 20 78 44 6c 53 79 6d 20 2a 2f 20 20 20 20  /* xDlSym */    
33570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33580 20 20 5c 0a 20 20 20 20 75 6e 69 78 44 6c 43 6c    \.    unixDlCl
33590 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  ose,          /*
335a0 20 78 44 6c 43 6c 6f 73 65 20 2a 2f 20 20 20 20   xDlClose */    
335b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
335c0 5c 0a 20 20 20 20 75 6e 69 78 52 61 6e 64 6f 6d  \.    unixRandom
335d0 6e 65 73 73 2c 20 20 20 20 20 20 20 2f 2a 20 78  ness,       /* x
335e0 52 61 6e 64 6f 6d 6e 65 73 73 20 2a 2f 20 20 20  Randomness */   
335f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
33600 20 20 20 20 75 6e 69 78 53 6c 65 65 70 2c 20 20      unixSleep,  
33610 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 6c            /* xSl
33620 65 65 70 20 2a 2f 20 20 20 20 20 20 20 20 20 20  eep */          
33630 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20              \.  
33640 20 20 75 6e 69 78 43 75 72 72 65 6e 74 54 69 6d    unixCurrentTim
33650 65 2c 20 20 20 20 20 20 2f 2a 20 78 43 75 72 72  e,      /* xCurr
33660 65 6e 74 54 69 6d 65 20 2a 2f 20 20 20 20 20 20  entTime */      
33670 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20            \.    
33680 75 6e 69 78 47 65 74 4c 61 73 74 45 72 72 6f 72  unixGetLastError
33690 2c 20 20 20 20 20 2f 2a 20 78 47 65 74 4c 61 73  ,     /* xGetLas
336a0 74 45 72 72 6f 72 20 2a 2f 20 20 20 20 20 20 20  tError */       
336b0 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 30 2c          \.    0,
336c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
336d0 20 20 20 20 2f 2a 20 78 52 65 6e 61 6d 65 20 2a      /* xRename *
336e0 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /               
336f0 20 20 20 20 20 20 5c 0a 20 20 20 20 75 6e 69 78        \.    unix
33700 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34  CurrentTimeInt64
33710 2c 20 2f 2a 20 78 43 75 72 72 65 6e 74 54 69 6d  , /* xCurrentTim
33720 65 49 6e 74 36 34 20 2a 2f 20 20 20 20 20 20 20  eInt64 */       
33730 20 20 20 20 5c 0a 20 20 7d 0a 0a 20 20 2f 2a 0a      \.  }..  /*.
33740 20 20 2a 2a 20 41 6c 6c 20 64 65 66 61 75 6c 74    ** All default
33750 20 56 46 53 65 73 20 66 6f 72 20 75 6e 69 78 20   VFSes for unix 
33760 61 72 65 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e  are contained in
33770 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   the following a
33780 72 72 61 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  rray..  **.  ** 
33790 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 73 71  Note that the sq
337a0 6c 69 74 65 33 5f 76 66 73 2e 70 4e 65 78 74 20  lite3_vfs.pNext 
337b0 66 69 65 6c 64 20 6f 66 20 74 68 65 20 56 46 53  field of the VFS
337c0 20 6f 62 6a 65 63 74 20 69 73 20 6d 6f 64 69 66   object is modif
337d0 69 65 64 0a 20 20 2a 2a 20 62 79 20 74 68 65 20  ied.  ** by the 
337e0 53 51 4c 69 74 65 20 63 6f 72 65 20 77 68 65 6e  SQLite core when
337f0 20 74 68 65 20 56 46 53 20 69 73 20 72 65 67 69   the VFS is regi
33800 73 74 65 72 65 64 2e 20 20 53 6f 20 74 68 65 20  stered.  So the 
33810 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 2a 2a 20 61  following.  ** a
33820 72 72 61 79 20 63 61 6e 6e 6f 74 20 62 65 20 63  rray cannot be c
33830 6f 6e 73 74 2e 0a 20 20 2a 2f 0a 20 20 73 74 61  onst..  */.  sta
33840 74 69 63 20 73 71 6c 69 74 65 33 5f 76 66 73 20  tic sqlite3_vfs 
33850 61 56 66 73 5b 5d 20 3d 20 7b 0a 23 69 66 20 53  aVfs[] = {.#if S
33860 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
33870 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 28 4f  KING_STYLE && (O
33880 53 5f 56 58 57 4f 52 4b 53 20 7c 7c 20 64 65 66  S_VXWORKS || def
33890 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 29  ined(__APPLE__))
338a0 0a 20 20 20 20 55 4e 49 58 56 46 53 28 22 75 6e  .    UNIXVFS("un
338b0 69 78 22 2c 20 20 20 20 20 20 20 20 20 20 61 75  ix",          au
338c0 74 6f 6c 6f 63 6b 49 6f 46 69 6e 64 65 72 20 29  tolockIoFinder )
338d0 2c 0a 23 65 6c 73 65 0a 20 20 20 20 55 4e 49 58  ,.#else.    UNIX
338e0 56 46 53 28 22 75 6e 69 78 22 2c 20 20 20 20 20  VFS("unix",     
338f0 20 20 20 20 20 70 6f 73 69 78 49 6f 46 69 6e 64       posixIoFind
33900 65 72 20 29 2c 0a 23 65 6e 64 69 66 0a 20 20 20  er ),.#endif.   
33910 20 55 4e 49 58 56 46 53 28 22 75 6e 69 78 2d 6e   UNIXVFS("unix-n
33920 6f 6e 65 22 2c 20 20 20 20 20 6e 6f 6c 6f 63 6b  one",     nolock
33930 49 6f 46 69 6e 64 65 72 20 29 2c 0a 20 20 20 20  IoFinder ),.    
33940 55 4e 49 58 56 46 53 28 22 75 6e 69 78 2d 64 6f  UNIXVFS("unix-do
33950 74 66 69 6c 65 22 2c 20 20 64 6f 74 6c 6f 63 6b  tfile",  dotlock
33960 49 6f 46 69 6e 64 65 72 20 29 2c 0a 23 69 66 20  IoFinder ),.#if 
33970 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 20 20 55  OS_VXWORKS.    U
33980 4e 49 58 56 46 53 28 22 75 6e 69 78 2d 6e 61 6d  NIXVFS("unix-nam
33990 65 64 73 65 6d 22 2c 20 73 65 6d 49 6f 46 69 6e  edsem", semIoFin
339a0 64 65 72 20 29 2c 0a 23 65 6e 64 69 66 0a 23 69  der ),.#endif.#i
339b0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
339c0 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20  LOCKING_STYLE.  
339d0 20 20 55 4e 49 58 56 46 53 28 22 75 6e 69 78 2d    UNIXVFS("unix-
339e0 70 6f 73 69 78 22 2c 20 20 20 20 70 6f 73 69 78  posix",    posix
339f0 49 6f 46 69 6e 64 65 72 20 29 2c 0a 23 69 66 20  IoFinder ),.#if 
33a00 21 4f 53 5f 56 58 57 4f 52 4b 53 0a 20 20 20 20  !OS_VXWORKS.    
33a10 55 4e 49 58 56 46 53 28 22 75 6e 69 78 2d 66 6c  UNIXVFS("unix-fl
33a20 6f 63 6b 22 2c 20 20 20 20 66 6c 6f 63 6b 49 6f  ock",    flockIo
33a30 46 69 6e 64 65 72 20 29 2c 0a 23 65 6e 64 69 66  Finder ),.#endif
33a40 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
33a50 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
33a60 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e  G_STYLE && defin
33a70 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20  ed(__APPLE__).  
33a80 20 20 55 4e 49 58 56 46 53 28 22 75 6e 69 78 2d    UNIXVFS("unix-
33a90 61 66 70 22 2c 20 20 20 20 20 20 61 66 70 49 6f  afp",      afpIo
33aa0 46 69 6e 64 65 72 20 29 2c 0a 20 20 20 20 55 4e  Finder ),.    UN
33ab0 49 58 56 46 53 28 22 75 6e 69 78 2d 6e 66 73 22  IXVFS("unix-nfs"
33ac0 2c 20 20 20 20 20 20 6e 66 73 49 6f 46 69 6e 64  ,      nfsIoFind
33ad0 65 72 20 29 2c 0a 20 20 20 20 55 4e 49 58 56 46  er ),.    UNIXVF
33ae0 53 28 22 75 6e 69 78 2d 70 72 6f 78 79 22 2c 20  S("unix-proxy", 
33af0 20 20 20 70 72 6f 78 79 49 6f 46 69 6e 64 65 72     proxyIoFinder
33b00 20 29 2c 0a 23 65 6e 64 69 66 0a 20 20 7d 3b 0a   ),.#endif.  };.
33b10 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69    unsigned int i
33b20 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f  ;          /* Lo
33b30 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20  op counter */.. 
33b40 20 2f 2a 20 52 65 67 69 73 74 65 72 20 61 6c 6c   /* Register all
33b50 20 56 46 53 65 73 20 64 65 66 69 6e 65 64 20 69   VFSes defined i
33b60 6e 20 74 68 65 20 61 56 66 73 5b 5d 20 61 72 72  n the aVfs[] arr
33b70 61 79 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  ay */.  for(i=0;
33b80 20 69 3c 28 73 69 7a 65 6f 66 28 61 56 66 73 29   i<(sizeof(aVfs)
33b90 2f 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 5f  /sizeof(sqlite3_
33ba0 76 66 73 29 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  vfs)); i++){.   
33bb0 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67   sqlite3_vfs_reg
33bc0 69 73 74 65 72 28 26 61 56 66 73 5b 69 5d 2c 20  ister(&aVfs[i], 
33bd0 69 3d 3d 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74  i==0);.  }.  ret
33be0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 0a  urn SQLITE_OK; .
33bf0 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68 75 74 64 6f 77  }../*.** Shutdow
33c00 6e 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20  n the operating 
33c10 73 79 73 74 65 6d 20 69 6e 74 65 72 66 61 63 65  system interface
33c20 2e 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 20 6f 70 65  ..**.** Some ope
33c30 72 61 74 69 6e 67 20 73 79 73 74 65 6d 73 20 6d  rating systems m
33c40 69 67 68 74 20 6e 65 65 64 20 74 6f 20 64 6f 20  ight need to do 
33c50 73 6f 6d 65 20 63 6c 65 61 6e 75 70 20 69 6e 20  some cleanup in 
33c60 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 0a 2a 2a  this routine,.**
33c70 20 74 6f 20 72 65 6c 65 61 73 65 20 64 79 6e 61   to release dyna
33c80 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65  mically allocate
33c90 64 20 6f 62 6a 65 63 74 73 2e 20 20 42 75 74 20  d objects.  But 
33ca0 6e 6f 74 20 6f 6e 20 75 6e 69 78 2e 0a 2a 2a 20  not on unix..** 
33cb0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
33cc0 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 75 6e 69 78  a no-op for unix
33cd0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
33ce0 5f 6f 73 5f 65 6e 64 28 76 6f 69 64 29 7b 20 0a  _os_end(void){ .
33cf0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
33d00 4f 4b 3b 20 0a 7d 0a 20 0a 23 65 6e 64 69 66 20  OK; .}. .#endif 
33d10 2f 2a 20 53 51 4c 49 54 45 5f 4f 53 5f 55 4e 49  /* SQLITE_OS_UNI
33d20 58 20 2a 2f 0a                                   X */.