Method: FSDB::Database#delete
- Defined in:
- lib/fsdb/database.rb
#delete(path, load = true) ⇒ Object
Delete the object from the db. If a block is given, yields the object (or nil if none) before deleting it from the db (but before releasing the lock on the path), and returns the value of the block. Otherwise, just returns the object (or nil, if none). Raises DirNotEmptyError if path refers to a non-empty dir. If the dir is empty, it is deleted, and the returned value is true. The block is not yielded to. If the load argument is false, delete the object from the db without loading it or yielding, returning true.
670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 |
# File 'lib/fsdb/database.rb', line 670 def delete(path, load=true) # :yields: object abs_path = absolute(path) file_id = get_file_id(abs_path) delete_later = false object_exclusive file_id do |cache_entry| open_write_lock(path) do |f| if load object = cache_object(f, cache_entry) result = block_given? ? (yield object) : object else result = true end if File::CAN_DELETE_OPEN_FILE File.delete(abs_path) else delete_later = true end cache_entry.stale! del_version_of(f) result end end rescue DirIsImmutableError begin Dir.delete(abs_path) rescue Errno::ENOENT # Someone else got it first. end true rescue NotDirError raise NotDirError, "Not a directory - #{path} in #{inspect}" rescue MissingFileError if File.symlink?(abs_path) # get_file_id fails if target deleted File.delete(abs_path) rescue nil end if PLATFORM_IS_WINDOWS_ME and File.directory?(abs_path) Dir.delete(abs_path) end nil rescue Errno::ENOTEMPTY raise DirNotEmptyError, "Directory not empty - #{path} in #{inspect}" rescue Errno::EACCES raise if File::CAN_OPEN_DIR raise unless File.directory?(abs_path) # on some platforms, opening a dir raises EACCESS Dir.delete(abs_path) true rescue AbortedTransaction ensure if delete_later begin File.delete(abs_path) rescue Dir.delete(abs_path) rescue Errno::ENOENT end end clear_entry(file_id) end |