-
Notifications
You must be signed in to change notification settings - Fork 0
/
db_cache.py
executable file
·86 lines (71 loc) · 2.55 KB
/
db_cache.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
#!/usr/bin/python
# -*- coding: utf-8 -*-
#
# Copyright (C) 2015 Richard Hughes <richard@hughsie.com>
# Licensed under the GNU General Public License Version 2
import os
import MySQLdb as mdb
from db import LvfsDatabase, CursorError
class LvfsDatabaseCache(object):
def __init__(self, db):
""" Constructor for object """
self._db = db
# test client table exists
try:
cur = self._db.cursor()
cur.execute("SELECT * FROM cache LIMIT 1;")
except mdb.Error as e:
sql_db = """
CREATE TABLE cache (
created TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
filename VARCHAR(255) DEFAULT NULL,
data BLOB DEFAULT NULL,
UNIQUE KEY filename (filename)
) CHARSET=utf8;
"""
cur.execute(sql_db)
def delete(self, filename):
""" Deletes any DB cache for the filename """
assert filename
basename = os.path.basename(filename)
try:
cur = self._db.cursor()
cur.execute("DELETE FROM cache WHERE filename=%s;", (basename,))
except mdb.Error, e:
raise CursorError(cur, e)
def from_file(self, filename):
""" Creates an item in the database with the file contents """
basename = os.path.basename(filename)
data = open(filename, 'rb').read()
try:
cur = self._db.cursor()
cur.execute("REPLACE INTO cache(filename,data) "
"VALUES(%s,%s);", (basename, data,))
except mdb.Error, e:
raise CursorError(cur, e)
def to_file(self, filename, force_overwrite=False):
""" Creates an item on disk from the database copy """
# already exists
if os.path.exists(filename) and not force_overwrite:
return
# recover from database
basename = os.path.basename(filename)
try:
cur = self._db.cursor()
cur.execute("SELECT data FROM cache WHERE filename=%s", (basename,))
except mdb.Error, e:
raise CursorError(cur, e)
data = cur.fetchone()
open(filename, 'wb').write(data[0])
def main():
db = LvfsDatabase(os.environ)
cache = LvfsDatabaseCache(db)
cache.from_file('./README.md')
cache.from_file('./README.md')
if os.path.exists('/tmp/README.md'):
os.remove('/tmp/README.md')
cache.to_file('/tmp/README.md')
cache.to_file('/tmp/README.md')
cache.delete('README.md')
if __name__ == "__main__":
main()