-
Notifications
You must be signed in to change notification settings - Fork 0
/
async_db.py
106 lines (93 loc) · 3.09 KB
/
async_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
import threading
import json
from queue import Queue
class Database:
def __init__(self, path):
self.path = path
self.task_performer = threading.Thread(target=self.perform_tasks)
self.tasks = Queue(maxsize=20)
try:
open(self.path, 'x').close()
f = open(self.path, 'w')
f.write('{}')
f.close()
except:
pass
def read_file(self):
f = open(self.path, 'r')
data = json.load(f)
f.close()
return data
def write_file(self, data):
f = open(self.path, 'w')
json.dump(data, f)
f.close()
def perform_tasks(self):
while True:
task = self.tasks.get()
command, arg, result = task
data = self.read_file()
match command:
case 0: # dump
result.put(data)
case 1: # read
for key in arg:
data = data[key]
result.put(data)
case 2: # initialize
self.write_file(arg)
result.put(None)
case 3: # write
value, keys = arg[0], arg[1]
exec_str = 'data'
for key in keys:
exec_str += "['{}']".format(key)
exec_str += '=value'
exec(exec_str)
self.write_file(data)
result.put(None)
case 4: # clear
self.write_file({})
result.put(None)
case 5: # remove
exec_str = 'data'
for key in arg[0:-1]:
exec_str += "['{}']".format(key)
exec_str += '.pop(arg[-1])'
exec(exec_str)
self.write_file(data)
result.put(None)
case 6: # quit
result.put(None)
return
def perform_task(self, command, arg):
if self.task_performer.is_alive():
task = (command, arg, Queue(maxsize=1))
self.tasks.put(task)
return task[2].get()
else:
raise ValueError()
def start(self):
if not self.task_performer.is_alive():
self.task_performer = threading.Thread(target=self.perform_tasks)
self.task_performer.start()
else:
raise ValueError()
def stop(self):
if self.task_performer.is_alive():
self.perform_task(6, None)
self.task_performer.join()
else:
raise ValueError()
def dump(self):
return self.perform_task(0, None)
def read(self, *keys):
return self.perform_task(1, keys)
def initialize(self, value):
return self.perform_task(2, value)
def write(self, value, *keys):
return self.perform_task(3, (value, keys))
def clear(self):
return self.perform_task(4, None)
def remove(self, *keys):
return self.perform_task(5, keys)