-
Notifications
You must be signed in to change notification settings - Fork 0
/
alarm_db.py
138 lines (103 loc) · 3.88 KB
/
alarm_db.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
import sqlite3
import datetime
import logging
import sys
ver = 1
logger = logging.getLogger('ArtSunrise')
logger.setLevel(logging.DEBUG)
ch = logging.StreamHandler(sys.stdout)
logger.addHandler(ch)
class NotFoundError(Exception):
pass
# функция, которая преобразует запись из базы данных в словарь
def dict_factory(cursor, row):
d = {}
for idx, col in enumerate(cursor.description):
d[col[0]] = row[idx]
return d
# Time
def convert_time(s):
return datetime.datetime.strptime(s.decode(), '%H:%M:%S').time()
# Register the adapter
sqlite3.register_adapter(datetime.time, lambda d: d.strftime("%H:%M:%S"))
# Register the converter
sqlite3.register_converter("time", convert_time)
# Timedelta
def adapt_timedelta(td):
return str(td.total_seconds())
def convert_timedelta(s):
return datetime.timedelta(seconds=int(s.decode()))
# Register the adapter
sqlite3.register_adapter(datetime.timedelta, adapt_timedelta)
# Register the converter
sqlite3.register_converter("timedelta", convert_timedelta)
sqlite3.register_adapter(datetime.datetime, lambda d: d.strftime('%Y-%m-%d %H:%M:%S'))
# Register the converter
sqlite3.register_converter("datetime", lambda s: datetime.datetime.strptime(s.decode(), '%Y-%m-%d %H:%M:%S'))
def init_db(cn):
c = cn.cursor()
try:
c.execute('select value from properties where name = "version"')
v = int(c.fetchone()["value"])
except sqlite3.OperationalError:
v = -1
if v != ver:
c.execute('drop table if exists alarms')
c.execute(
'create table alarms(id integer primary key autoincrement, alarm_time time, sunrise_time timedelta, days list, enabled integer, active integer, disable_time datetime)')
c.execute('create table if not exists properties(name text unique, value text)')
c.execute('replace into properties values (?, ?)', ("version", ver))
cn.commit()
# Функция, которая возвращает запись в базе данных по id
def get_alarm_by_id(alarm_id):
cur.execute('select * from alarms where id = ?', (alarm_id,))
alarm = cur.fetchone()
if alarm is None:
raise NotFoundError
return alarm
def get_alarm_list():
alarms = []
for e in cur.execute('select * from alarms'):
alarms.append(e)
return alarms
def create_alarm(alarm_time, sunrise_time, days, enabled, active, disable_time):
cur.execute(
'insert into alarms (alarm_time, sunrise_time, days, enabled, active, disable_time) values(?, ?, ?, ?, ?, ?)',
[alarm_time, sunrise_time, days, enabled, active, disable_time])
conn.commit()
return cur.lastrowid
def update_alarm(id, alarm_time=None, sunrise_time=None, days=None, enabled=None, active=None, disable_time=None):
kwargs = {
'alarm_time': alarm_time,
'sunrise_time': sunrise_time,
'days': days,
'enabled': enabled,
'active': active,
'disable_time': disable_time
}
args_list = [k for k, v in kwargs.items() if v is not None]
cur.execute('update alarms '
'set {} '
'where id = ?'.format(', '.join('{} = ?'.format(k) for k in args_list)),
([kwargs[k] for k in args_list] + [id]))
conn.commit()
def delete_alarm(id):
cur.execute('delete from alarms '
'where id = ?', (id,))
conn.commit()
def singleton(fun):
global instance
instance = None
def get_instance(*args, **kwargs):
global instance
if instance is None:
instance = fun(*args, **kwargs)
return instance
return get_instance
@singleton
def connect_to_db():
conn = sqlite3.connect('alarms.db', detect_types=sqlite3.PARSE_DECLTYPES, check_same_thread=False)
conn.row_factory = dict_factory
init_db(conn)
return conn.cursor(), conn
cur, conn = connect_to_db()