Class: Relaton::DbCache

Inherits:
Object
  • Object
show all
Defined in:
lib/relaton/db_cache.rb

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(dir, ext = "xml") ⇒ DbCache



9
10
11
12
13
14
15
# File 'lib/relaton/db_cache.rb', line 9

def initialize(dir, ext = "xml")
  @dir = dir
  @ext = ext
  FileUtils::mkdir_p @dir
  file_version = "#{@dir}/version"
  set_version unless File.exist? file_version
end

Instance Attribute Details

#dirString (readonly)



6
7
8
# File 'lib/relaton/db_cache.rb', line 6

def dir
  @dir
end

Class Method Details

.init_bib_caches(opts) ⇒ Object

Initialse and return relaton instance, with local and global cache names local_cache: local cache name; none created if nil; “relaton” created if empty global_cache: boolean to create global_cache flush_caches: flush caches



172
173
174
175
176
177
178
179
180
181
# File 'lib/relaton/db_cache.rb', line 172

def init_bib_caches(opts)
  globalname = global_bibliocache_name if opts[:global_cache]
  localname = local_bibliocache_name(opts[:local_cache])
  localname = "relaton" if localname&.empty?
  if opts[:flush_caches]
    FileUtils.rm_f globalname unless globalname.nil?
    FileUtils.rm_f localname unless localname.nil?
  end
  Relaton::Db.new(globalname, localname)
end

Instance Method Details

#[](key) ⇒ String

Read item



34
35
36
37
38
39
40
41
# File 'lib/relaton/db_cache.rb', line 34

def [](key)
  value = get(key)
  if (code = redirect? value)
    self[code]
  else
    value
  end
end

#[]=(key, value) ⇒ Object

Save item



20
21
22
23
24
25
26
27
28
29
# File 'lib/relaton/db_cache.rb', line 20

def []=(key, value)
  if value.nil?
    delete key
    return
  end

  prefix_dir = "#{@dir}/#{prefix(key)}"
  FileUtils::mkdir_p prefix_dir
  File.write filename(key), value, encoding: "utf-8"
end

#allArray<Hash>

Returns all items



67
68
69
70
71
# File 'lib/relaton/db_cache.rb', line 67

def all
  Dir.glob("#{@dir}/**/*.xml").sort.map do |f|
    File.read(f, encoding: "utf-8")
  end
end

#check_version?TrueClass, FalseClass

Check if version of the DB match to the gem version.



82
83
84
85
# File 'lib/relaton/db_cache.rb', line 82

def check_version?
  v = File.read @dir + "/version", encoding: "utf-8"
  v.strip == VERSION
end

#clone_entry(key, db) ⇒ Object



43
44
45
46
47
48
# File 'lib/relaton/db_cache.rb', line 43

def clone_entry(key, db)
  self[key] ||= db.get(key)
  if (code = redirect? get(key))
    clone_entry code, db
  end
end

#delete(key) ⇒ Object

Delete item



75
76
77
78
# File 'lib/relaton/db_cache.rb', line 75

def delete(key)
  file = filename key
  File.delete file if File.exist? file
end

#fetched(key) ⇒ String

Return fetched date



53
54
55
56
57
58
59
60
61
62
63
# File 'lib/relaton/db_cache.rb', line 53

def fetched(key)
  value = self[key]
  return unless value

  if value =~ /^not_found/
    value.match(/\d{4}-\d{2}-\d{2}/).to_s
  else
    doc = Nokogiri::XML value
    doc.at("/bibitem/fetched|bibdata/fetched")&.text
  end
end

#set_versionRelaton::DbCache

Set version of the DB to the gem version.



89
90
91
92
# File 'lib/relaton/db_cache.rb', line 89

def set_version
  File.write @dir + "/version", VERSION, encoding: "utf-8"
  self
end

#valid_entry?(key, year) ⇒ Boolean

if cached reference is undated, expire it after 60 days



97
98
99
100
101
102
103
# File 'lib/relaton/db_cache.rb', line 97

def valid_entry?(key, year)
  datestr = fetched key
  return false unless datestr

  date = Date.parse datestr
  year || Date.today - date < 60
end