class BomDB::Import::Contents
Constants
- DEFAULT_VERSE_CONTENT_RE
- DEFAULT_VERSE_REF_RE
- MAX_DUPS
Public Instance Methods
import_json(data)
click to toggle source
# File lib/bomdb/import/contents.rb, line 68 def import_json(data) # this cross-ref is for looking up file-edition-id => database-edition-id editions_xref = {} ed_model = Models::Edition.new(@db) verse_model = Models::Verse.new(@db) data['editions'].each_pair do |id, e| editions_xref[ id ] = ed_model.find_or_create(e["year"].to_i, e["name"]) end data['contents'].each_pair do |book_name, chapters| chapters.each_pair do |chapter, verses| verses.each_pair do |verse_full_ref, editions| match = DEFAULT_VERSE_REF_RE.match(verse_full_ref) if match verse_number = match[3].to_i verse = verse_model.find( book_name: book_name, chapter: chapter, verse: verse_number ) if verse.nil? return Import::Result.new(success: false, error: "Unable to find verse: book: " + "'#{book_name}', chapter: '#{chapter}', " + "verse: '#{verse_number}'") end editions.each_pair do |file_edition_id, content_body| @db[:contents].insert( edition_id: editions_xref[ file_edition_id ], verse_id: verse[:verse_id], content_body: content_body ) end else $stderr.puts "Unable to parse verse ref from '#{verse_full_ref}', skipping" end end end end Import::Result.new(success: true) end
import_json_old(data)
click to toggle source
# File lib/bomdb/import/contents.rb, line 112 def import_json_old(data) data.each_pair do |book_name, year_editions| year_editions.each do |year_edition| year_edition.each_pair do |year, d| m = d["meta"] book = find_book(book_name) return book if book.is_a?(Import::Result) verse_id = Models::Verse.new(@db).find_or_create( chapter: m['chapter'], verse: m['verse'], book_id: book[:book_id], heading: m['heading'] ) ed_id = opts[:edition_id] || find_or_create_edition(year) @db[:contents].insert( edition_id: ed_id, verse_id: verse_id, content_body: d["content"] ) end end end Import::Result.new(success: true) rescue Sequel::UniqueConstraintViolation => e Import::Result.new(success: false, error: e) end
import_text(data)
click to toggle source
# File lib/bomdb/import/contents.rb, line 12 def import_text(data) if opts[:edition_prefix].nil? return Import::Result.new(success: false, error: "'--edition' is required for text import of contents" ) end edition_model = Models::Edition.new(@db) edition = edition_model.find(opts[:edition_prefix]) if edition.nil? return Import::Result.new(success: false, error: "Edition matching prefix '#{opts[:edition_prefix]}' not found" ) end edition_id = edition[:edition_id] verse_re = opts[:verse_re] || DEFAULT_VERSE_CONTENT_RE times_tried = 0 data.each_line do |line| if line =~ verse_re book_name, chapter, verse, content = $1, $2, $3, $4 book = find_book(book_name) return book if book.is_a?(Import::Result) verse_id = Models::Verse.new(@db).find_or_create( chapter: chapter, verse: verse, book_id: book[:book_id] ) begin @db[:contents].insert( edition_id: edition_id, verse_id: verse_id, content_body: content ) rescue Sequel::UniqueConstraintViolation => e msg = "edition_id: #{edition_id}, verse: '#{book_name} #{chapter}:#{verse}', content: #{content.inspect}" $stderr.puts "Warning: duplicate #{msg}" times_tried += 1 if times_tried > MAX_DUPS return Import::Result.new(success: false, error: "Too many duplicate rows. Stopped at #{msg}" ) else next end end end end Import::Result.new(success: true) end
Protected Instance Methods
find_book(book_name)
click to toggle source
# File lib/bomdb/import/contents.rb, line 145 def find_book(book_name) book = @db[:books].where(:book_name => book_name).first if book.nil? Import::Result.new(success: false, error: "Unable to find book '#{book_name}'") else book end end
find_or_create_edition(year, name = nil)
click to toggle source
# File lib/bomdb/import/contents.rb, line 154 def find_or_create_edition(year, name = nil) name ||= year.to_s edition = @db[:editions].where(:edition_year => year).first edition_id = (edition && edition[:edition_id]) || @db[:editions].insert( edition_name: name, edition_year: year ) return edition_id end