67 lines
2.3 KiB
Python
67 lines
2.3 KiB
Python
import threading
|
|
from logger import Logger
|
|
import MySQLdb
|
|
|
|
|
|
class DatabaseEngine(threading.Thread):
|
|
singleton = None
|
|
|
|
@classmethod
|
|
def create(cls, queue, config):
|
|
if cls.singleton is None:
|
|
cls.singleton = DatabaseEngine(queue, config)
|
|
return cls.singleton
|
|
|
|
def __init__(self, queue, config):
|
|
threading.Thread.__init__(self)
|
|
self.event = threading.Event()
|
|
self.config = config
|
|
self.queue = queue
|
|
self.startTimer()
|
|
self.setDaemon(True)
|
|
|
|
def triggerStoring(self):
|
|
self.event.set()
|
|
|
|
def startTimer(self):
|
|
self.timer = threading.Timer(self.config['period'], self.event.set)
|
|
self.timer.start()
|
|
|
|
def run(self):
|
|
while True:
|
|
self.event.wait()
|
|
self.event.clear()
|
|
|
|
while not self.queue.empty():
|
|
data = self.queue.get()
|
|
if (type(data) != list):
|
|
data = [data]
|
|
db = MySQLdb.connect(host=self.config['host'], user=self.config['user'],
|
|
passwd=self.config['password'], db=self.config['db'])
|
|
cursor = db.cursor()
|
|
for dbo in data:
|
|
Logger.log("DatabaseEngine receives: %s" % (str(dbo.getData())))
|
|
columns = dbo.getValues()
|
|
columns['name'] = dbo.getItemName()
|
|
columns['ts'] = dbo.getTimestamp().isoformat()
|
|
|
|
columnNames = '(' + ','.join(columns.keys()) + ')'
|
|
valuePlaceholders = '(' + ','.join(['%s' for v in columns.values()]) + ')'
|
|
|
|
#Logger.log("columns: %s" % columnNames)
|
|
#Logger.log("placeholders: %s" % valuePlaceholders)
|
|
#Logger.log("values: %s" % columns.values())
|
|
|
|
stmt = 'INSERT INTO {0} {1} VALUES {2}'.format(dbo.getTableName(), columnNames, valuePlaceholders)
|
|
#Logger.log("stmt: %s" % (stmt))
|
|
|
|
cursor.execute(stmt, columns.values())
|
|
Logger.log("stmt executed")
|
|
|
|
db.commit()
|
|
db.close()
|
|
|
|
else:
|
|
Logger.log("DatabaseEngine: no more data to handle")
|
|
|
|
self.startTimer() |