Class: Ole::Storage::RangesIOMigrateable
- Inherits:
-
RangesIOResizeable
- Object
- RangesIO
- RangesIOResizeable
- Ole::Storage::RangesIOMigrateable
- Defined in:
- lib/ole/storage/base.rb
Overview
like RangesIOResizeable, but Ole::Storage::Dirent specific. provides for migration between bats based on size, and updating the dirent.
Instance Attribute Summary collapse
-
#dirent ⇒ Object
readonly
Returns the value of attribute dirent.
Attributes inherited from RangesIOResizeable
Attributes inherited from RangesIO
#io, #mode, #pos, #ranges, #size
Instance Method Summary collapse
-
#first_block ⇒ Object
forward this to the dirent.
- #first_block=(val) ⇒ Object
-
#initialize(dirent, mode = 'r') ⇒ RangesIOMigrateable
constructor
A new instance of RangesIOMigrateable.
- #truncate(size) ⇒ Object
Methods inherited from RangesIO
#close, #eof?, #gets, #inspect, open, #read, #rewind, #write
Constructor Details
#initialize(dirent, mode = 'r') ⇒ RangesIOMigrateable
Returns a new instance of RangesIOMigrateable.
636 637 638 639 640 |
# File 'lib/ole/storage/base.rb', line 636 def initialize dirent, mode='r' @dirent = dirent super @dirent.ole.bat_for_size(@dirent.size), mode, :first_block => @dirent.first_block, :size => @dirent.size end |
Instance Attribute Details
#dirent ⇒ Object (readonly)
Returns the value of attribute dirent.
635 636 637 |
# File 'lib/ole/storage/base.rb', line 635 def dirent @dirent end |
Instance Method Details
#first_block ⇒ Object
forward this to the dirent
671 672 673 |
# File 'lib/ole/storage/base.rb', line 671 def first_block @dirent.first_block end |
#first_block=(val) ⇒ Object
675 676 677 |
# File 'lib/ole/storage/base.rb', line 675 def first_block= val @dirent.first_block = val end |
#truncate(size) ⇒ Object
642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 |
# File 'lib/ole/storage/base.rb', line 642 def truncate size bat = @dirent.ole.bat_for_size size if bat.class != @bat.class # bat migration needed! we need to backup some data. the amount of data # should be <= @ole.header.threshold, so we can just hold it all in one buffer. # backup this pos = [@pos, size].min self.pos = 0 keep = read [@size, size].min # this does a normal truncate to 0, removing our presence from the old bat, and # rewrite the dirent's first_block super 0 @bat = bat # just change the underlying io from right under everyone :) @io = bat.io # important to do this now, before the write. as the below write will always # migrate us back to sbat! this will now allocate us +size+ in the new bat. super self.pos = 0 write keep self.pos = pos else super end # now just update the file @dirent.size = size end |