· 6 years ago · Oct 18, 2019, 03:22 AM
1#!/usr/bin/env python3
2import sqlite3
3
4
5class BaseCache:
6 def __init__(self, filename, table):
7 self.filename = filename
8 self.table = table
9 self.db_con = sqlite3.connect(filename)
10 self.create_table()
11
12 def __str__(self):
13 return '{}.{}'.format(self.filename, self.table)
14
15 def __len__(self):
16 cur = self.db_con.cursor()
17 cur.execute("SELECT COUNT(*) FROM {}".format(self.table))
18 return cur.fetchone()[0]
19
20 def __delitem__(self, key):
21 cur = self.db_con.cursor()
22 req = "DELETE FROM {} WHERE key=?".format(self.table)
23 cur.execute(req, (key,))
24 self.db_con.commit()
25
26 def __getitem__(self, key):
27 cur = self.db_con.cursor()
28 req = "SELECT value FROM {} WHERE key=?".format(self.table)
29 cur.execute(req, (key,))
30 res = cur.fetchone()
31 if res:
32 return res[0]
33
34 def __setitem__(self, key, value):
35 cur = self.db_con.cursor()
36 value = str(value)
37 try:
38 req = "INSERT INTO {} VALUES (?,?)".format(self.table)
39 cur.execute(req, (key, value))
40 except sqlite3.IntegrityError:
41 req = "UPDATE {} SET value=? WHERE key=?".format(self.table)
42 cur.execute(req, (value, key))
43 self.db_con.commit()
44
45 def __enter__(self):
46 return self
47
48 def __exit__(self, type, value, traceback):
49 self.close()
50
51 def create_table(self):
52 cur = self.db_con.cursor()
53 req = 'CREATE TABLE IF NOT EXISTS {}'.format(self.table)
54 col = '(key TEXT PRIMARY KEY, value TEXT)'
55 cur.execute(req + ' ' + col)
56 self.db_con.commit()
57
58 def close(self):
59 self.db_con.close()
60
61
62if __name__ == '__main__':
63 with BaseCache('test.db', 'cache') as cache:
64 cache['version'] = '0.1'
65 cache['lang'] = 'fr'
66 print(cache['version'])
67 print(cache['lang'])
68 del cache['lang']
69 print(cache['lang'])