Method: FSDB::Database#replace
- Defined in:
- lib/fsdb/database.rb
#replace(path) ⇒ Object
Replace the yielded object (or nil) with the return value of the block. Returns the object that was replaced. No object need exist at path
.
Use replace instead of edit when accessing db over a drb connection. Use replace instead of insert if the path needs to be protected while the object is prepared for insertion.
Note that (unlike #edit) destructive methods on the object do not persistently change the state of the object, unless the object is the return value of the block.
585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 |
# File 'lib/fsdb/database.rb', line 585 def replace(path) abs_path = absolute(path) file_id = make_file_id(abs_path) object_exclusive file_id do |cache_entry| open_write_lock(path) do |f| old_object = f.stat.zero? ? nil : cache_object(f, cache_entry) object = yield old_object if block_given? dump(object, f) cache_entry.update(f.mtime, inc_version_of(f, cache_entry), object) old_object end end rescue DirIsImmutableError raise DirIsImmutableError, "Cannot replace dir #{path} in #{inspect}" rescue NotDirError raise NotDirError, "Not a directory - #{path} in #{inspect}" rescue AbortedTransaction clear_entry(file_id) # The cached object may have edits which are not valid. nil rescue FormatError clear_entry(file_id) File.delete(abs_path) raise rescue PathComponentError raise PathComponentError, "Some component of #{path} in #{inspect} " + "already exists and is not a directory" rescue CreateFileError raise CreateFileError, "Cannot create file at #{path} in #{inspect}" rescue MissingFileError if PLATFORM_IS_WINDOWS_ME and File.directory?(abs_path) raise DirIsImmutableError else raise NotDirError end rescue Exception clear_entry(file_id) raise end |