115 lines
3.9 KiB
Python
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"])
|