2 __all__ = ['import_inpx']
5 from zipfile import ZipFile
6 from sqlobject import sqlhub
7 from sqlobject.sqlbuilder import Select
8 from .db import Author, Book, Extension, Genre, Language, \
9 insert_name, insert_author
12 EOT = chr(4) # INP field separator
16 parts = line.strip().split(EOT)
19 raise ValueError('Unknown INP structure: "%s"' % line)
20 if l == 11: # Standard structure
21 parts.append(None) # Emulate lang
27 def import_inp_line(archive, parts):
28 authors, genres, title, series, ser_no, file, size, lib_id, deleted, \
29 extension, date, language = parts
35 deleted = deleted == '1'
36 extension_row = insert_name(Extension, extension)
37 language_row = insert_name(Language, language)
38 book = Book(title=title, series=series, ser_no=ser_no,
39 archive=archive, file=file, size=size,
40 lib_id=lib_id, deleted=deleted,
41 extension=extension_row, date=date,
42 language=language_row)
43 authors = authors.split(':')
45 for author in authors:
47 if author in seen_authors:
49 seen_authors.add(author)
50 alist = author.split(',', 2)
60 author_row = insert_author(surname, name, misc_name)
61 book.addAuthor(author_row)
62 for genre in genres.split(':'):
64 genre_row = insert_name(Genre, genre, title=genre)
65 book.addGenre(genre_row)
68 def import_inp(archive, inp):
70 connection = sqlhub.processConnection
71 for file, in connection.queryAll(connection.sqlrepr(
72 Select(Book.q.file, Book.q.archive == archive))):
75 parts = split_line(line)
79 import_inp_line(archive, parts)
82 def import_inpx(path):
84 for name in inpx.namelist():
85 archive, ext = os.path.splitext(name)
89 sqlhub.doInTransaction(import_inp, archive + '.zip', inp)
91 connection = sqlhub.processConnection
92 if connection.dbName in ('postgres', 'sqlite'):
93 for table in Author, Book, Extension, Genre, Language:
94 connection.query("VACUUM %s" % table.sqlmeta.table)