loudness-scanner/MosDb.py
2017-03-08 15:48:28 +01:00

115 lines
3.9 KiB
Python

from datetime import datetime
import sqlite3
class MosDb():
def __init__(self, dbfile = "mosobjects.db3"):
self.idcache = {}
self.ridcache = {}
self.dbfile = dbfile
self.conn = sqlite3.connect(self.dbfile)
self.c = self.conn.cursor()
self.c.execute("PRAGMA foreign_keys=on;")
def commit(self):
self.conn.commit()
def finish(self):
self.c.execute("VACUUM")
self.conn.commit()
self.conn.close()
def build_id_cache(self, table):
self.idcache[table] = {}
self.ridcache[table] = {}
self.c.execute("SELECT * FROM " + table)
for row in self.c.fetchall():
self.idcache[table][row[1]] = row[0]
self.ridcache[table][row[0]] = row[1]
def add_new_id(self, table, col, value):
self.c.execute("INSERT INTO " + table + " (" + col + ") VALUES (?)", (value,))
self.conn.commit()
rid = self.c.lastrowid
self.idcache[table][value] = rid
self.ridcache[table][rid] = value
def get_id(self, table, col, value):
if not table in self.idcache:
self.build_id_cache(table)
if not value in self.idcache[table]:
# New value we didn't know yet, add it
self.add_new_id(table, col, value)
return self.idcache[table][value]
def get_mos_id(self, mos_server):
return self.get_id("mosservers", "mosServer", mos_server)
def get_status_id(self, status):
return self.get_id("mosstatus", "status", status)
def get_objair_id(self, obj_air):
return self.get_id("mosair", "objAir", obj_air)
def get_objgroup_id(self, obj_group):
return self.get_id("mosgroups", "objGroup", obj_group)
def get_user_id(self, username):
return self.get_id("mosusers", "name", username)
def date_to_stamp(self, datestring):
dt = datetime.strptime(datestring, "%Y-%m-%dT%H:%M:%S")
return dt.timestamp()
def add_link(self, obj_id, planning_id):
self.db_insert_or_replace("mosobjlinks", {"objId": obj_id, "planningId": planning_id})
def db_insert_or_replace(self, table, data):
fieldsList = []
placeHolders = []
valuesTuple = ()
for k in data.keys():
fieldsList.append(k)
placeHolders.append("?")
valuesTuple += (data[k],)
fieldsList = ", ".join(fieldsList)
placeHolders = ", ".join(placeHolders)
self.c.execute(
"INSERT OR REPLACE INTO " + table + " (" + fieldsList + ") VALUES (" + placeHolders + ")",
valuesTuple
)
def mark_deleted(self, objData):
"""Sets the isDeleted column to 1 for the specified object.
*objData* is a dictionary containing mosId and objId values.
"""
self.c.execute(
"UPDATE mosobjects SET isDeleted=1 WHERE mosId=? AND objId=?",
( self.get_mos_id(objData["mosId"]), objData["objId"] )
)
def add_or_replace(self, objData):
insertObj = {
"mosId": self.get_mos_id(objData["mosId"]),
"objId": objData["objId"],
"statusId": self.get_status_id(objData["status"]),
"isDeleted": objData["isDeleted"],
"objSlug": objData["objSlug"],
"objPath": objData["objPath"],
"description": objData["description"],
"duration": objData["duration"],
"objAir": self.get_objair_id(objData["objAir"]),
"created": self.date_to_stamp(objData["created"]),
"createdBy": self.get_user_id(objData["createdBy"]),
"changed": self.date_to_stamp(objData["changed"]),
"changedBy": self.get_user_id(objData["changedBy"]),
"groupId": self.get_objgroup_id(objData["objGroup"])
}
self.db_insert_or_replace("mosobjects", insertObj)
if objData["planningId"] != "":
self.add_link(objData["objId"], objData["planningId"])