diff options
Diffstat (limited to 'qutebrowser/browser/history.py')
-rw-r--r-- | qutebrowser/browser/history.py | 24 |
1 files changed, 21 insertions, 3 deletions
diff --git a/qutebrowser/browser/history.py b/qutebrowser/browser/history.py index ef4650a35..773c6cc51 100644 --- a/qutebrowser/browser/history.py +++ b/qutebrowser/browser/history.py @@ -92,8 +92,11 @@ class CompletionMetaInfo(sql.SqlTable): } def __init__(self, parent=None): - super().__init__("CompletionMetaInfo", ['key', 'value'], - constraints={'key': 'PRIMARY KEY'}) + self._fields = ['key', 'value'] + self._constraints = {'key': 'PRIMARY KEY'} + super().__init__( + "CompletionMetaInfo", self._fields, constraints=self._constraints) + if sql.user_version_changed(): self._init_default_values() @@ -101,6 +104,15 @@ class CompletionMetaInfo(sql.SqlTable): if key not in self.KEYS: raise KeyError(key) + def try_recover(self): + """Try recovering the table structure. + + This should be called if getting a value via __getattr__ failed. In theory, this + should never happen, in practice, it does. + """ + self._create_table(self._fields, constraints=self._constraints, force=True) + self._init_default_values() + def _init_default_values(self): for key, default in self.KEYS.items(): if key not in self: @@ -164,7 +176,13 @@ class WebHistory(sql.SqlTable): self.completion = CompletionHistory(parent=self) self.metainfo = CompletionMetaInfo(parent=self) - rebuild_completion = self.metainfo['force_rebuild'] + try: + rebuild_completion = self.metainfo['force_rebuild'] + except sql.BugError: # pragma: no cover + log.sql.warning("Failed to access meta info, trying to recover...", + exc_info=True) + self.metainfo.try_recover() + rebuild_completion = self.metainfo['force_rebuild'] if sql.user_version_changed(): # If the DB user version changed, run a full cleanup and rebuild the |