Test Failed
Push — develop ( a80574...5ed66c )
by Dean
02:36
created

APSWBaseWrapper.__get_message()   F

Complexity

Conditions 9

Size

Total Lines 29

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 29
rs 3
cc 9
1
from plugin.core.message import InterfaceMessages
2
3
import apsw
4
import logging
5
6
log = logging.getLogger(__name__)
7
8
disabled_databases = {}
9
10
11
class APSWBaseWrapper(object):
12
    name = None
13
14
    critical_errors = (
15
        apsw.CantOpenError,
16
        apsw.CorruptError,
17
        apsw.FullError,
18
        apsw.IOError,
19
        apsw.NotADBError,
20
        apsw.PermissionsError,
21
        apsw.ReadOnlyError
22
    )
23
24
    @property
25
    def error_message(self):
26
        return disabled_databases.get(self.name)
27
28
    @property
29
    def valid(self):
30
        return disabled_databases.get(self.name) is None
31
32
    def on_exception(self, exc_info):
33
        # Ensure database isn't already disabled
34
        if disabled_databases.get(self.name):
35
            # Re-raise exception
36
            raise exc_info[0], exc_info[1], exc_info[2]
37
38
        # Retrieve error message
39
        message = self.__get_message(exc_info[1])
40
41
        # Mark database as disabled
42
        disabled_databases[self.name] = message
43
44
        # Append error message
45
        InterfaceMessages.add(logging.CRITICAL, message)
46
47
        # Display database error
48
        log.critical(message, exc_info=True)
49
50
        # Re-raise exception
51
        raise exc_info[0], exc_info[1], exc_info[2]
52
53
    def __get_message(self, ex):
54
        name = self.name if self.name else 'unknown'
55
        name_cap = name.capitalize()
56
57
        if type(ex) is apsw.CantOpenError:
58
            return 'Unable to open %s' % name
59
60
        if type(ex) is apsw.CorruptError:
61
            return '%s is corrupt' % name_cap
62
63
        if type(ex) is apsw.FullError:
64
            return 'Drive containing the %s is full' % name
65
66
        if type(ex) is apsw.IOError:
67
            return '%s raised an input/output error' % name_cap
68
69
        if type(ex) is apsw.NotADBError:
70
            return '%s doesn\'t have a valid SQLite header' % name_cap
71
72
        if type(ex) is apsw.PermissionsError:
73
            return 'Access denied to the %s' % name
74
75
        if type(ex) is apsw.ReadOnlyError:
76
            return 'Unable to write to the %s' % name
77
78
        # Unknown exception
79
        return '%s: %s' % (
80
            type(ex).__name__,
81
            ex
82
        )
83