Port calibredb restore_database

This commit is contained in:
Kovid Goyal 2017-05-02 11:00:40 +05:30
parent 23803416ee
commit 7f4f546ce2
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C
2 changed files with 69 additions and 6 deletions

View File

@ -4,19 +4,82 @@
from __future__ import absolute_import, division, print_function, unicode_literals from __future__ import absolute_import, division, print_function, unicode_literals
from calibre import prints
from calibre.db.restore import Restore
readonly = False readonly = False
version = 0 # change this if you change signature of implementation() version = 0 # change this if you change signature of implementation()
no_remote = True
def implementation(db, notify_changes, *args): def implementation(db, notify_changes, *args):
is_remote = notify_changes is not None raise NotImplementedError()
is_remote
def option_parser(get_parser, args): def option_parser(get_parser, args):
pass parser = get_parser(
_(
'''\
%prog restore_database [options]
Restore this database from the metadata stored in OPF files in each
directory of the calibre library. This is useful if your metadata.db file
has been corrupted.
WARNING: This command completely regenerates your database. You will lose
all saved searches, user categories, plugboards, stored per-book conversion
settings, and custom recipes. Restored metadata will only be as accurate as
what is found in the OPF files.
'''
)
)
parser.add_option(
'-r',
'--really-do-it',
default=False,
action='store_true',
help=_(
'Really do the recovery. The command will not run '
'unless this option is specified.'
)
)
return parser
class Progress(object):
def __init__(self):
self.total = 1
def __call__(self, msg, step):
if msg is None:
self.total = float(step)
else:
prints(msg, '...', '%d%%' % int(100 * (step / self.total)))
def main(opts, args, dbctx): def main(opts, args, dbctx):
raise NotImplementedError('TODO: implement this') if not opts.really_do_it:
raise SystemExit(
_('You must provide the %s option to do a'
' recovery') % '--really-do-it'
)
r = Restore(dbctx.library_path, progress_callback=Progress())
r.start()
r.join()
if r.tb is not None:
prints('Restoring database failed with error:')
prints(r.tb)
else:
prints('Restoring database succeeded')
prints('old database saved as', r.olddb)
if r.errors_occurred:
name = 'calibre_db_restore_report.txt'
lopen('calibre_db_restore_report.txt',
'wb').write(r.report.encode('utf-8'))
prints('Some errors occurred. A detailed report was ' 'saved to', name)
return 0 return 0

View File

@ -21,8 +21,8 @@ from calibre.utils.serialize import MSGPACK_MIME
COMMANDS = ( COMMANDS = (
'list', 'add', 'remove', 'add_format', 'remove_format', 'show_metadata', 'list', 'add', 'remove', 'add_format', 'remove_format', 'show_metadata',
'set_metadata', 'export', 'catalog', 'saved_searches', 'add_custom_column', 'set_metadata', 'export', 'catalog', 'saved_searches', 'add_custom_column',
'custom_columns', 'remove_custom_column', 'set_custom', 'custom_columns', 'remove_custom_column', 'set_custom', 'restore_database',
# 'restore_database', 'check_library', 'list_categories', 'backup_metadata', 'clone', 'embed_metadata', 'search' # 'check_library', 'list_categories', 'backup_metadata', 'clone', 'embed_metadata', 'search'
) )