X-Git-Url: https://git.phdru.name/?a=blobdiff_plain;f=m_librarian%2Finp.py;h=863523fe2cbbf0f95637656e702f6b364873a5c5;hb=5d5bc4612f374758c3dba144417a4658def2fab5;hp=db0a3d834baf41c5bb7a195a12047d2ceb07c3df;hpb=e53f480b62166cc8028f1d6e4fda307ad7af2233;p=m_librarian.git diff --git a/m_librarian/inp.py b/m_librarian/inp.py index db0a3d8..863523f 100644 --- a/m_librarian/inp.py +++ b/m_librarian/inp.py @@ -1,10 +1,12 @@ -__all__ = ['import_inpx'] - import os from zipfile import ZipFile -from sqlobject import sqlhub, SQLObjectNotFound -from .db import Author, Book, Extension, Genre, Language, insert_name +from sqlobject import sqlhub +from sqlobject.sqlbuilder import Select +from .db import Author, Book, Extension, Genre, Language, \ + insert_name, insert_author + +__all__ = ['import_inpx'] EOT = chr(4) # INP field separator @@ -25,12 +27,6 @@ def split_line(line): def import_inp_line(archive, parts): authors, genres, title, series, ser_no, file, size, lib_id, deleted, \ extension, date, language = parts - try: - Book.archive_file_idx.get(archive, file) - except SQLObjectNotFound: - pass - else: - return try: ser_no = int(ser_no) except ValueError: @@ -44,9 +40,24 @@ def import_inp_line(archive, parts): lib_id=lib_id, deleted=deleted, extension=extension_row, date=date, language=language_row) - for author in authors.split(':'): + authors = authors.split(':') + seen_authors = set() + for author in authors: if author: - author_row = insert_name(Author, author) + if author in seen_authors: + continue + seen_authors.add(author) + alist = author.split(',', 2) + surname = alist[0] + if len(alist) > 1: + name = alist[1] + if len(alist) == 3: + misc_name = alist[2] + else: + misc_name = '' + else: + name = misc_name = '' + author_row = insert_author(surname, name, misc_name) book.addAuthor(author_row) for genre in genres.split(':'): if genre: @@ -55,16 +66,32 @@ def import_inp_line(archive, parts): def import_inp(archive, inp): + files = set() + connection = sqlhub.processConnection + for file, in connection.queryAll(connection.sqlrepr( + Select(Book.q.file, Book.q.archive == archive))): + files.add(file) for line in inp: - import_inp_line(archive, split_line(line)) + line = line.decode('utf-8') + parts = split_line(line) + file = parts[5] + if file not in files: + files.add(file) + import_inp_line(archive, parts) def import_inpx(path): inpx = ZipFile(path) for name in inpx.namelist(): archive, ext = os.path.splitext(name) - if ext != 'inp': + if ext != '.inp': continue inp = inpx.open(name) sqlhub.doInTransaction(import_inp, archive + '.zip', inp) inp.close() + connection = sqlhub.processConnection + if connection.dbName == 'postgres': + for table in Author, Book, Extension, Genre, Language: + connection.query("VACUUM %s" % table.sqlmeta.table) + elif connection.dbName == 'sqlite': + connection.query("VACUUM")