Skip to content

Commit 4f3009e

Browse files
authored
add lock on TinyDB (#170)
1 parent 891b99f commit 4f3009e

File tree

2 files changed

+51
-41
lines changed

2 files changed

+51
-41
lines changed

coderbot/activity.py

+28-23
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
from tinydb import TinyDB, Query
2-
2+
from threading import Lock
33
# Programs and Activities databases
44
class Activities():
55
_instance = None
@@ -13,34 +13,39 @@ def get_instance(cls):
1313
def __init__(self):
1414
self.activities = TinyDB("data/activities.json")
1515
self.query = Query()
16+
self.lock = Lock()
1617

1718
def load(self, name, default):
18-
if name and default is None:
19-
activities = self.activities.search(self.query.name == name)
20-
if len(activities) > 0:
21-
return activities[0]
22-
elif default is not None:
23-
if len(self.activities.search(self.query.default == True)) > 0:
24-
return self.activities.search(self.query.default == True)[0]
19+
with self.lock:
20+
if name and default is None:
21+
activities = self.activities.search(self.query.name == name)
22+
if len(activities) > 0:
23+
return activities[0]
24+
elif default is not None:
25+
if len(self.activities.search(self.query.default == True)) > 0:
26+
return self.activities.search(self.query.default == True)[0]
27+
return None
2528
return None
26-
return None
2729

2830
def save(self, name, activity):
29-
# if saved activity is "default", reset existing default activity to "non-default"
30-
if activity.get("default", False) is True:
31-
self.activities.update({'default': False})
32-
if self.activities.search(self.query.name == name) == []:
33-
self.activities.insert(activity)
34-
else:
35-
self.activities.update(activity, self.query.name == activity["name"])
31+
with self.lock:
32+
# if saved activity is "default", reset existing default activity to "non-default"
33+
if activity.get("default", False) is True:
34+
self.activities.update({'default': False})
35+
if self.activities.search(self.query.name == name) == []:
36+
self.activities.insert(activity)
37+
else:
38+
self.activities.update(activity, self.query.name == activity["name"])
3639

3740
def delete(self, name):
38-
activities = self.activities.search(self.query.name == name)
39-
if len(activities) > 0:
40-
activity = activities[0]
41-
if activity.get("default", False) is True:
42-
self.activities.update({'default': True}, self.query.stock == True)
43-
self.activities.remove(self.query.name == activity["name"])
41+
with self.lock:
42+
activities = self.activities.search(self.query.name == name)
43+
if len(activities) > 0:
44+
activity = activities[0]
45+
if activity.get("default", False) is True:
46+
self.activities.update({'default': True}, self.query.stock == True)
47+
self.activities.remove(self.query.name == activity["name"])
4448

4549
def list(self):
46-
return self.activities.all()
50+
with self.lock:
51+
return self.activities.all()

coderbot/program.py

+23-18
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525

2626
import math
2727
from tinydb import TinyDB, Query
28+
from threading import Lock
2829

2930
import coderbot
3031
import camera
@@ -80,6 +81,7 @@ def __init__(self):
8081
self._programs = TinyDB(PROGRAMS_DB)
8182
# initialise DB from default programs
8283
query = Query()
84+
self.lock = Lock()
8385
for dirname, dirnames, filenames, in os.walk(PROGRAMS_PATH_DEFAULTS):
8486
dirnames
8587
for filename in filenames:
@@ -102,28 +104,31 @@ def prog_list(self):
102104
return self._programs.all()
103105

104106
def save(self, program):
105-
query = Query()
106-
self._program = program
107-
program_db_entry = self._program.as_dict()
108-
if self._programs.search(query.name == program.name) != []:
109-
self._programs.update(program_db_entry, query.name == program.name)
110-
else:
111-
self._programs.insert(program_db_entry)
107+
with self.lock:
108+
query = Query()
109+
self._program = program
110+
program_db_entry = self._program.as_dict()
111+
if self._programs.search(query.name == program.name) != []:
112+
self._programs.update(program_db_entry, query.name == program.name)
113+
else:
114+
self._programs.insert(program_db_entry)
112115

113116
def load(self, name):
114-
query = Query()
115-
program_db_entries = self._programs.search(query.name == name)
116-
if len(program_db_entries) > 0:
117-
prog_db_entry = program_db_entries[0]
118-
logging.debug(prog_db_entry)
119-
self._program = Program.from_dict(prog_db_entry)
120-
return self._program
121-
return None
117+
with self.lock:
118+
query = Query()
119+
program_db_entries = self._programs.search(query.name == name)
120+
if len(program_db_entries) > 0:
121+
prog_db_entry = program_db_entries[0]
122+
logging.debug(prog_db_entry)
123+
self._program = Program.from_dict(prog_db_entry)
124+
return self._program
125+
return None
122126

123127
def delete(self, name):
124-
query = Query()
125-
program_db_entries = self._programs.search(query.name == name)
126-
self._programs.remove(query.name == name)
128+
with self.lock:
129+
query = Query()
130+
program_db_entries = self._programs.search(query.name == name)
131+
self._programs.remove(query.name == name)
127132

128133
def create(self, name, code):
129134
self._program = Program(name, code)

0 commit comments

Comments
 (0)