MqttDispatcherPy/DatabaseEngine.py
2017-11-13 15:07:52 +01:00

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()