]> git.phdru.name Git - m_librarian.git/blobdiff - m_librarian/inp.py
Cleanup: Fix flake8 E741 ambiguous variable name 'l'
[m_librarian.git] / m_librarian / inp.py
index e99800a18e13d4ec3fc6ffcefa6915e5699b9642..b3a3d84b43b662bd7870f51d77d0f504d8c18a78 100644 (file)
@@ -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
@@ -12,10 +14,10 @@ EOT = chr(4)  # INP field separator
 
 def split_line(line):
     parts = line.strip().split(EOT)
-    l = len(parts)
-    if l < 11:
+    _l = len(parts)
+    if _l < 11:
         raise ValueError('Unknown INP structure: "%s"' % line)
-    if l == 11:  # Standard structure
+    if _l == 11:  # Standard structure
         parts.append(None)  # Emulate lang
     else:  # New structure
         parts = parts[:12]
@@ -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,20 +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 in ('postgres', 'sqlite'):
+    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")