require 'store'
require 'walkdir'
-outputDir = 'output'
+@outputDir = 'output'
book_ids = []
-imageCount = 0
+@config_file = 'quanlib.ini'
+@skip_class = false
def handleArg(arg)
- if "--purge" == arg
+ if arg.start_with?("--config=")
+ @config_file = arg[9..-1]
+ puts 'Using config file "' + @config_file + '".'
+ elsif "--purge" == arg
puts 'Purging database...'
@store.dropSchema()
- if File.exists?(Store.unclassified_csv)
- File.delete(Store.unclassified_csv)
+ if File.exists?(@store.unclassified_csv)
+ File.delete(@store.unclassified_csv)
end
+ elsif "--skip-class" == arg
+ puts 'Skipping load of classification table.'
+ @skip_class = true
elsif arg.start_with?("--")
abort('ERROR: Unrecognized option "' + arg + '".')
end
end
-@store = Store.new()
+@store = Store.new(@config_file)
@store.connect()
for arg in ARGV
handleArg(arg)
end
-@store.init_db()
+@store.init_db(@skip_class)
for arg in ARGV
if ! arg.start_with?("--")
require 'csv'
require 'fileutils'
+require 'inifile'
require 'pg'
require 'series'
class Store
- @@BASEPATH = '/arc/quanlib' # TODO: FIXME: configure this in a sane way
- @@UNCLASSIFIED_CSV = @@BASEPATH + '/unclassified.csv'
-
- def self.unclassified_csv
- @@UNCLASSIFIED_CSV
+ def unclassified_csv
+ @basePath + '/csv/unclassified.csv'
end
- def initialize
+ def initialize(config_file)
@conn = nil
- #@dburl = 'dbi:Pg:quanlib:localhost'
- @dbhost = "localhost"
+ config = IniFile.load(config_file)
+ if nil == config
+ puts 'FATAL: Failed to load config file "' + config_file + '". Aborting initialization.'
+ return
+ end
+
+ section = config['database']
+ @dbhost = section['host']
@dbport = 5432
- @dbname = 'quanlib'
- @dbuser = 'quanlib'
- @dbpass = 'quanlib'
+ @dbname = section['name']
+ @dbuser = section['user']
+ @dbpass = section['pass']
+
+ section = config['filesystem']
+ @basePath = section['basePath']
end
def connect
# @conn = PGconn.connect('localhost', 5432, '', '', 'quanlib', 'quanlib', 'quanlib')
- @conn = PG.connect('localhost', 5432, '', '', 'quanlib', 'quanlib', 'quanlib')
+ @conn = PG.connect(@dbhost, @dbport, '', '', @dbname, @dbuser, @dbpass)
return @conn
end
return path, name
end
- def create_schema
+ def create_schema(skip_class)
create_authors =
<<EOS
CREATE TABLE Authors (
id INTEGER PRIMARY KEY,
grouping VARCHAR(64),
- reading VARCHAR(196),
- sort VARCHAR(196)
+ reading VARCHAR(256),
+ sort VARCHAR(256)
);
EOS
@conn.exec(stmt)
end
- populate_fast_table()
- populate_classifications_table()
+ if skip_class == false
+ populate_fast_table()
+ populate_classifications_table()
+ end
+
populate_series_table()
+
end
def dropSchema
return nil
end
- def init_db
+ def init_db(skip_class)
sql = "SELECT 1 FROM pg_tables WHERE tableowner='quanlib' AND tablename='books'"
found = false
@conn.exec(sql).each do |row|
end
if ! found
- create_schema()
+ create_schema(skip_class)
end
end
def load_author(id)
- #puts 'DEBUG: load_author(' + id + ')'
sqlSelect = "SELECT grouping, reading, sort FROM Authors WHERE id=$1"
args = [id]
@conn.exec_params(sqlSelect, args) do |rs|
end
row = rs[0]
author = Author.new(row['grouping'], row['reading'], row['sort'])
- #puts 'DEBUG: author: ' + author.inspect()
return author
end
- #puts 'DEBUG: NOT FOUND'
return nil
end
end
def load_book(id)
- #puts 'DEBUG: load_book(' + id + ')'
sql = "SELECT author, classification, cover, description, path, series, title, volume FROM Books WHERE id=$1;"
book = nil
puts $@
end
- #puts 'DEBUG: loaded book: ' + book.inspect()
return book
end
(efspath, efsname) = construct_efs_path(id)
- fullpath = @@BASEPATH + '/efs/' + efspath + '/' + efsname
+ fullpath = @basePath + '/efs/' + efspath + '/' + efsname
return Cover.new(nil, fullpath, mime_type)
(efspath, efsname) = construct_efs_path(efs_id)
- efspath = @@BASEPATH + '/efs/' + efspath
+ efspath = @basePath + '/efs/' + efspath
FileUtils.mkdir_p(efspath)
def populate_classifications_table
puts "Populating the Classifications table..."
first = true
- CSV.foreach(@@BASEPATH + '/csv/class.csv') do |row|
+ CSV.foreach(@basePath + '/csv/class.csv') do |row|
if first
# skip the header row
first = false
def populate_fast_table
puts "Populating the FAST table..."
first = true
- CSV.foreach(@@BASEPATH + '/csv/fast.csv') do |row|
+ CSV.foreach(@basePath + '/csv/fast.csv') do |row|
if first
first = false # skip the header row
else
def populate_series_table
puts "Populating the Series table..."
- CSV.foreach(@@BASEPATH + '/csv/series.csv') do |row|
+ CSV.foreach(@basePath + '/csv/series.csv') do |row|
id = next_id('series_id')
sqlInsert = "INSERT INTO Series (id, age, genre, grouping, code, descr) VALUES ($1, $2, $3, $4, $5, $6);"
args = [id] + row