forked from einoj/charm_shift_tool
-
Notifications
You must be signed in to change notification settings - Fork 0
/
database_ctrl.py
277 lines (252 loc) · 10.5 KB
/
database_ctrl.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
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
# Functions for interacting with the sqltie3 database
import sqlite3
from itertools import chain
#database = '//cern.ch/dfs/Websites/t/test-charmShiftTool/data/charm_shift.db'
database = '//cern.ch/dfs/Websites/c/charmshifttool/data/charm_shift.db'
#database = './charm_shift.db'
set_table = 'settings'
msg_table = 'messages'
#status_table 'status'
response_table = 'response'
shifter_table = 'shifter'
default_pos = []
class db_commands:
def __init__(self):
'''
Here I'm not sure if it's better to leave the database open and close manually after, or do
as you are now and open and close within each function. Either way would work, and I guess
closing it after each call is cleaner and potentially safer.
:return:
'''
self.load_db()
# Make sure that tables exist
self.cur.execute('create table if not exists ' + set_table + ' (id INTEGER PRIMARY KEY, name text, setting int)')
self.cur.execute('create table if not exists ' + msg_table + ' (id INTEGER PRIMARY KEY, time text, msg text, status int, fwhm int, centre int)')
#self.cur.execute('create table if not exists ' + status_table + ' (id INTEGER PRIMARY KEY, text, msg text, status int)')
self.cur.execute('create table if not exists ' + response_table + ' (id INTEGER PRIMARY KEY, name text, status int)')
self.cur.execute('create table if not exists ' + shifter_table + ' (id INTEGER PRIMARY KEY, name text, email text, phone int, current int, alert int)')
self.con.commit()
self.close_db()
#def __del__(self):
# self._db_connection.close()
def load_db(self):
self.con = sqlite3.connect(database)
self.cur = self.con.cursor()
def close_db(self):
self.con.close()
def insert_setting(self, data):
if len(data) != 2:
print("ERROR: A row in settings has 2 columns, not " + str(len(data)) + "!")
return -1
self.load_db()
# Insert new setting if one with the same name does not exist
# else update the setting
# I am unsure if this is the best way of doing it
# Using insert or ingore might be a better method
self.cur.execute("select rowid from settings where name = ?",(data[0],))
row = self.cur.fetchone()
if row is None:
self.cur.execute("insert into " + set_table + "(name, setting)" " values(?,?)", data)
else:
self.cur.execute("update settings set setting=? where name=?",(data[1],data[0]))
self.con.commit()
self.close_db()
def insert_shifter(self, data):
if len(data) != 5:
print("ERROR: shifter data must have length 4!")
return -1
self.load_db()
self.cur.execute("select rowid from " + shifter_table + " where name = ?",[data['name'],])
row = self.cur.fetchone()
if row is None:
self.cur.execute("insert into " + shifter_table + "(name, email, phone, current, alert)" " values(?,?,?,?,?)", [data['name'],data['email'],data['phone'],data['current'],data['alert']])
else:
self.cur.execute("update " + shifter_table + " set email=?, phone=?, current=?, alert=? where name=?",[data['email'],data['phone'],data['current'],data['alert'],data['name']])
self.con.commit()
self.close_db()
def set_shifter_email(self, data):
if len(data) !=2:
print("ERROR: shifter data must have length 4!")
return -1
self.load_db()
self.cur.execute("select rowid from " + shifter_table + " where name = ?",(data[0],))
row = self.cur.fetchone()
if row is None:
data += (0,0,0)
self.cur.execute("insert into " + shifter_table + "(name, email, phone, current, alert)" " values(?,?,?,?,?)", data)
else:
self.cur.execute("update " + shifter_table + " set email=? where name=?",(data[1],data[0]))
self.con.commit()
self.close_db()
def set_shifter_phone(self, data):
if len(data) !=2:
print("ERROR: shifter data must have length 4!")
return -1
self.load_db()
self.cur.execute("select rowid from " + shifter_table + " where name = ?",(data[0],))
row = self.cur.fetchone()
if row is None:
data = (data[0],"",data[1],0,0)
self.cur.execute("insert into " + shifter_table + "(name, email, phone, current, alert)" " values(?,?,?,?,?)", data)
else:
self.cur.execute("update " + shifter_table + " set phone=? where name=?",(data[1],data[0]))
self.con.commit()
self.close_db()
def set_current_shifter(self, name):
self.load_db()
self.cur.execute("select rowid from " + shifter_table + " where name = ?",[name])
row = self.cur.fetchone()
if row is None:
# Shifter does not exist in database, so create him
# This wont send emails to them, but will allow displaying their name in the web interface
data = {'name':name,'email':'','phone':'','current':0,'alert':0}
self.insert_shifter(data)
current = self.get_current_shifter()
self.load_db()
if current == None:
self.cur.execute("update " + shifter_table + " set current=1 where name='"+name+"'")
elif current != name:
self.cur.execute("update " + shifter_table + " set current=0 where name='"+current+"'")
self.cur.execute("update " + shifter_table + " set current=1 where name='"+name+"'")
self.con.commit()
self.close_db()
def get_current_shifter(self):
"""Return current shifter stored in database
"""
self.load_db()
self.cur.execute("select name from " + shifter_table + " where current = 1")
shifter = self.cur.fetchone()
if shifter != None:
shifter = shifter[0]
self.close_db()
return shifter
def get_all_shifters(self):
self.load_db()
self.cur.execute("select name from " + shifter_table)
shifters = self.cur.fetchall()
self.close_db()
shifters = list(chain.from_iterable(shifters))
return shifters
def get_alerts(self):
self.load_db()
self.cur.execute("select name from " + shifter_table + " where alert=1")
alertees = self.cur.fetchall()
# Tested two methods of flatting lists
#$ python -mtimeit -s'l=[[1,2,3],[4,5,6], [7], [8,9]]*99' '[item for sublist in l for item in sublist]'
#10000 loops, best of 3: 62.6 usec per loop
#
#$ python -mtimeit -s 'l=[[1,2,3],[4,5,6], [7], [8,9]]*99' 'list(itertools.chain.from_iterable(l))'
#10000 loops, best of 3: 34.8 usec per loop
alertees = list(chain.from_iterable(alertees))
self.close_db()
return alertees
def set_alert(self,data):
if len(data) !=2:
print("ERROR: set_alert must have length 2!")
return -1
self.load_db()
self.cur.execute("select rowid from " + shifter_table + " where name = ?",(data[0],))
row = self.cur.fetchone()
if row is None:
data = (data[0],"","",0,data[1])
self.cur.execute("insert into " + shifter_table + "(name, email, phone, current, alert)" " values(?,?,?,?,?)", data)
else:
self.cur.execute("update " + shifter_table + " set alert=? where name=?",[data[1],data[0]])
self.con.commit()
self.close_db()
def get_shifter_info(self, name):
self.load_db()
try:
self.cur.execute("select * from " + shifter_table + " where name='" + name + "'")
shifter = self.cur.fetchone()
except TypeError:
shifter = None
self.close_db()
shifter_dict = {}
if shifter != None:
shifter_dict['name'] = shifter[1]
shifter_dict['email'] = shifter[2]
shifter_dict['phone'] = shifter[3]
shifter_dict['current'] = shifter[4]
shifter_dict['alert'] = shifter[5]
else:
shifter_dict['name'] = ""
shifter_dict['email'] = ""
shifter_dict['phone'] = ""
shifter_dict['current'] = ""
shifter_dict['alert'] = ""
return shifter_dict
def get_setting(self, settingname):
if type(settingname) != str:
print("ERROR: must supply setting name as a string")
return -1
self.load_db()
self.cur.execute("select * from settings where name='"+settingname+"'")
setting = self.cur.fetchone()
try:
setting = int(setting[2])
except TypeError:
return None
return setting
def insert_msg(self, data):
if len(data) != 5:
print("ERROR: A row in settings has 5 columns, not " + str(len(data)) + "!")
return -1
self.load_db()
#data = [self.cur.lastrowid()+1]+data
self.cur.execute("insert into " + msg_table + "(time,msg,status,fwhm,centre)" " values(?,?,?,?,?)", data)
self.con.commit()
self.close_db()
def get_last_msg(self):
self.load_db()
self.cur.execute("select * from "+msg_table+" where id=(select max(id) from " + msg_table+")")
msg = self.cur.fetchone()
self.close_db()
return msg
def get_last_x_msgs(self, x):
self.load_db()
self.cur.execute("select * from "+msg_table+" order by id DESC limit " + str(x))
msg = self.cur.fetchall()
self.close_db()
return msg
def get_beam_status(self):
self.load_db()
self.cur.execute("select * from "+msg_table+" where id=(select max(id) from " + msg_table+")")
msg = self.cur.fetchone()
beam = msg[3]
fwhm = msg[4]
centre = msg[5]
return beam, fwhm, centre
def get_response(self):
self.load_db()
self.cur.execute("select status from "+response_table+" where name='beam'")
beam = self.cur.fetchone()
# Will return None if there is no response in database
return beam
def respond(self, x):
if type(x) != int:
print("ERROR: first argument must be a string and second argument an int")
return -1
self.load_db()
self.cur.execute("select rowid from "+response_table+" where name='beam'")
data = ('beam',x)
row = self.cur.fetchone()
if row is None:
self.cur.execute("insert into " + response_table + "(name, status)" " values(?,?)", data)
else:
self.cur.execute("update "+response_table+" set status=? where name='beam'",(x,))
self.con.commit()
self.close_db()
def print_tables(self):
self.load_db()
self.cur.execute("select * from messages")
data = self.cur.fetchall()
for d in data:
print(d)
self.close_db()
def remove_all(self):
self.load_db()
self.cur.execute("delete from " + set_table)
self.cur.execute("delete from " + msg_table)
self.con.commit()
self.close_db()