import sys sys.path.append('..') sys.path.append('../..') from models import User, Portfolio, Album, Photo, AccessRight from enum import IntEnum, unique import inspect from baseorm import Observer @unique class DBDriver(IntEnum): PG = 1 MySQL = 2 class DB(Observer): __filename__ = None def __init__(self, password, driver = DBDriver.PG, user = 'pwp', database = 'pwp', host = 'localhost', port = None): self.password = password self.user = user self.database = database self.driver = driver self.host = host self.port = port self.__connect() if driver == DBDriver.PG: self.__filename__ = 'db_postgres.sql' elif driver == DBDriver.MySQL: self.__filename__ = 'db_mysql.sql' def __connect(self): if self.driver is DBDriver.PG: from postgres import Postgres try: self.db = Postgres(self.database, self.user, self.password, self.host, self.port) except Exception as e: raise Exception(e) elif self.driver is DBDriver.MySQL: from mysqld import Mysql try: self.db = Mysql(self.database, self.user, self.password, self.host, self.port) except Exception as e: raise Exception(e) else: raise Exception("%s: Unknown DB driver" % self.driver) def update(self, subject): print("update: {0}".format(subject)) self.store(subject) def initDb(self): file = None try: file = open(self.__filename__, "r") sql = file.read() file.close() self.db.ddl(sql) except: raise def store(self, object): if inspect.isclass(object): raise Exception("{0}: Class not instance".format(object)) if hasattr(object, '__tablename__'): table = object.__tablename__ else: table = object.__class__.__name__ print("Table<{0}>".format(table)) v = [i for i in dir(object) if isinstance(getattr(type(object), i, None), property)] for p in v: print("{0}: {1}".format(p, getattr(object, p))) action = None column = [] values = [] sql = None id = None for p in v: value = getattr(object, p) if p == 'id': id = value if value < 0: # insert action = 'insert' else: # update action = 'update' else: if hasattr(value, 'id'): values.append(value.id) else: values.append(value) column.append(p) print(action) if action == 'insert': if table.lower() == 'user' and self.driver is DBDriver.PG: sql = 'insert into "' + table + '" (' else: sql = 'insert into ' + table + ' (' for i in range(0, len(column)): field = column[i] if field.lower() == 'user' and self.driver is DBDriver.PG: field = '"{0}"'.format(field) if i == 0: sql += field else: sql += ', ' + field sql += ') values (' for i in range(0, len(values)): if i == 0: sql += '%s' else: sql += ', %s' sql += ') ' object.id = self.db.insert(sql, values) else: if table.lower() == 'user' and self.driver is DBDriver.PG: sql = 'update "' + table + '" set ' else: sql = 'update ' + table + ' set ' for i in range(0, len(column)): if i == 0: sql += '{0} = %s'.format(column[i]) else: sql += ', {0} = %s'.format(column[i]) sql += ' where id = {0}'.format(id) self.db.update(sql, values) print(sql) print(values) def __repr__(self): default = '<%s.%s object at %s>' % (self.__class__.__module__, self.__class__.__name__, hex(id(self))) return "%s " % (default, self.driver.name, self.user, self.database) def __del__(self): #print("%s: deleted" % self.__class__.__name__) try: del self.db except AttributeError: pass class Test(object): def __init__(self, x): self.x = x @property def x(self): return self.__x @x.setter def x(self, x): if x < 0: self.__x = 0 elif x > 1000: self.__x = 1000 else: self.__x = x db = DB('test', DBDriver.MySQL) #db = DB('test') db.initDb() user = User('test', 'test@test.dk', 'test', 'test') user.addObserver(db) print(user) db.store(user) portfolio = Portfolio('test', user) print(portfolio) album = Album('test', portfolio) print(album) accessright = AccessRight(user) print(accessright) photo = Photo('test', album) print(photo) db.store(portfolio) user.name = 'MIR' del db