Class: RobustExcelOle::Bookstore

Inherits:
Base
  • Object
show all
Defined in:
lib/robust_excel_ole/bookstore.rb

Instance Method Summary collapse

Constructor Details

#initializeBookstore

Returns a new instance of Bookstore.



7
8
9
10
# File 'lib/robust_excel_ole/bookstore.rb', line 7

def initialize
  @filename2books ||= Hash.new { |hash, key| hash[key] = [] }
  @hidden_excel_instance = nil
end

Instance Method Details

#booksObject

returns all stored books



91
92
93
94
95
96
97
98
99
100
101
102
103
# File 'lib/robust_excel_ole/bookstore.rb', line 91

def books
  result = []
  if @filename2books
    @filename2books.each do |_filename,books|
      next if books.empty?

      books.each do |wr_book|
        result << wr_book.__getobj__ if wr_book.weakref_alive?
      end
    end
  end
  result
end

#excelObject

returns an excel



13
14
15
16
17
18
# File 'lib/robust_excel_ole/bookstore.rb', line 13

def excel
  fn2books = @filename2books.first
  return nil if fn2books.nil? || fn2books.empty? || fn2books[1].empty?  
  book = fn2books[1].first.__getobj__
  book.excel
end

#fetch(filename, options = { :prefer_writable => true }) ⇒ Object

returns a workbook with the given filename, if it was open once prefers open workbooks to closed workbooks, and among them, prefers more recently opened workbooks excludes hidden Excel instance options: :prefer_writable returns the writable workbook, if it is open (default: true)

                   otherwise returns the workbook according to the preference order mentioned above
:prefer_excel      returns the workbook in the given Excel instance, if it exists,
                   otherwise proceeds according to prefer_writable

Parameters:

  • filename (String)

    the file name

  • options (Hash) (defaults to: { :prefer_writable => true })

    the options

  • option (Hash)

    a customizable set of options



31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
# File 'lib/robust_excel_ole/bookstore.rb', line 31

def fetch(filename, options = { :prefer_writable => true })
  return nil unless filename
  filename = General.absolute_path(filename)
  filename_key = General.canonize(filename)
  weakref_books = @filename2books[filename_key]
  return nil if weakref_books.nil? || weakref_books.empty?

  result = open_book = closed_book = nil
  weakref_books = weakref_books.map { |wr_book| wr_book if wr_book.weakref_alive? }.compact
  @filename2books[filename_key] = weakref_books
  weakref_books.each do |wr_book|
    if !wr_book.weakref_alive?
      # trace "warn: this should never happen"
      begin
        @filename2books[filename_key].delete(wr_book)
      rescue
        trace "Warning: deleting dead reference failed: file: #{filename.inspect}"
      end
    else
      book = wr_book.__getobj__
      next if book.excel == try_hidden_excel

      if options[:prefer_excel] && book.excel == options[:prefer_excel]
        result = book
        break
      end
      if book.alive?
        open_book = book
        break if book.writable && options[:prefer_writable]
      else
        closed_book = book
      end
    end
  end
  result ||= (open_book || closed_book)
  result
end

#store(book) ⇒ Object

stores a workbook

Parameters:



71
72
73
74
75
76
77
78
79
# File 'lib/robust_excel_ole/bookstore.rb', line 71

def store(book)
  filename_key = General.canonize(book.filename)
  if book.stored_filename
    old_filename_key = General.canonize(book.stored_filename)
    # deletes the weak reference to the book
    @filename2books[old_filename_key].delete(book)
  end
  @filename2books[filename_key] |= [WeakRef.new(book)]      
end