diff --git a/bin/xenu-nntp-import b/bin/xenu-nntp-import index 5cd553e..01872f3 100755 --- a/bin/xenu-nntp-import +++ b/bin/xenu-nntp-import @@ -9,37 +9,36 @@ from xenu_nntp.db import Database from xenu_nntp.newsgroup import Newsgroup from xenu_nntp.mbox import MBoxReader -class ImportException(Exception): - def __init__(self, path: str, line: int, error: str): - self.path = path - self.line = line - self.error = error - - def __str__(self): - return "Error importing %s at line %d: %s" % ( - self.path, self.line, self.error - ) - class Importer(): def __init__(self, db: Database, newsgroup: Newsgroup, args): self.db = db self.newsgroup = newsgroup self.args = args - def import_mbox_file(db: Database, newsgroup: Newsgroup, mboxfile: str): + def print_error(self, mboxfile: str, reader: MBoxReader, e: Exception): + print(f"Error importing file {mboxfile} on line {reader.line} to newsgroup {self.newsgroup.name}: {e}") + + def import_mbox_file(self, mboxfile: str): + if self.args.verbose and not self.args.quiet: + print(f"Importing file {mboxfile}") + reader = MBoxReader(mboxfile) - try: - for message in reader.messages(): - if self.args.verbose and not self.args.quiet: - print(f"Importing message {message.id}") - - db.add(message) + for message in reader.messages(): + if self.args.verbose and not self.args.quiet: + print(f"Importing message {message.message_id} to newsgroup {self.newsgroup.name}") - db.execute(f'insert into newsgroup_message values (%s, %s)', - (newsgroup.id, message.id)) - except Exception as e: - raise ImportException(mboxfile, reader.line, str(e)) + try: + self.db.add(message) + + self.db.execute(f'insert into newsgroup_message values (%s, %s)', + (self.newsgroup.id, message.id)) + except Exception as e: + if not self.args.quiet: + self.print_error(mboxfile, reader, e) + + if not self.args.ignore_errors: + exit(1) parser = argparse.ArgumentParser(description='Create new account') parser.add_argument('--dry-run', action='store_true', help='Do not commit to database') @@ -55,21 +54,12 @@ args = parser.parse_args() config = Config.load(args.config_file) db = Database.from_config(config) newsgroup = db.get(Newsgroup, {'name': args.newsgroup}) +importer = Importer(db, newsgroup, args) db.execute("begin transaction") for mboxfile in args.mboxfile: - if args.verbose and not args.quiet: - print(f"Importing mbox file {mboxfile}") - - try: - import_mbox_file(db, newsgroup, mboxfile) - except ImportException as e: - if not args.quiet: - print(str(e), file=sys.stderr) - - if not args.ignore_errors: - exit(1) + importer.import_mbox_file(mboxfile) if not args.dry_run: db.commit()