2 __all__ = ['import_inpx']
5 from zipfile import ZipFile
6 from sqlobject import sqlhub, SQLObjectNotFound
7 from .db import Author, Book, Extension, Genre, Language, insert_name
10 EOT = chr(4) # INP field separator
14 parts = line.strip().split(EOT)
17 raise ValueError('Unknown INP structure: "%s"' % line)
18 if l == 11: # Standard structure
19 parts.append(None) # Emulate lang
25 def import_inp_line(archive, parts):
26 authors, genres, title, series, ser_no, file, size, lib_id, deleted, \
27 extension, date, language = parts
29 Book.archive_file_idx.get(archive, file)
30 except SQLObjectNotFound:
39 deleted = deleted == '1'
40 extension_row = insert_name(Extension, extension)
41 language_row = insert_name(Language, language)
42 book = Book(title=title, series=series, ser_no=ser_no,
43 archive=archive, file=file, size=size,
44 lib_id=lib_id, deleted=deleted,
45 extension=extension_row, date=date,
46 language=language_row)
47 for author in authors.split(':'):
49 author_row = insert_name(Author, author)
50 book.addAuthor(author_row)
51 for genre in genres.split(':'):
53 genre_row = insert_name(Genre, genre, title=genre)
54 book.addGenre(genre_row)
57 def import_inp(archive, inp):
59 import_inp_line(archive, split_line(line))
62 def import_inpx(path):
64 for name in inpx.namelist():
65 archive, ext = os.path.splitext(name)
69 sqlhub.doInTransaction(import_inp, archive + '.zip', inp)
71 connection = sqlhub.processConnection
72 if connection.dbName in ('postgres', 'sqlite'):
73 for table in Author, Book, Extension, Genre, Language:
74 connection.query("VACUUM %s" % table.sqlmeta.table)