X-Git-Url: http://xvm.mit.edu/gitweb/invirt/packages/invirt-database.git/blobdiff_plain/0d3077ddcf3e560497f5c3a20fd2669055188219..9b8179e2ab0c8374a9b1ca3b2a14a9b2c3e99fee:/python/database/models.py diff --git a/python/database/models.py b/python/database/models.py index e761c8f..dc87e3b 100644 --- a/python/database/models.py +++ b/python/database/models.py @@ -2,12 +2,26 @@ from sqlalchemy import * from sqlalchemy import orm from sqlalchemy.orm import create_session, relation -from sqlalchemy.ext.assignmapper import assign_mapper - import datetime from invirt.database import record +# Compatibility hack from +# http://www.sqlalchemy.org/trac/wiki/UsageRecipes/SessionAwareMapper +from sqlalchemy.orm import mapper as sqla_mapper + +def session_mapper(scoped_session): + def mapper(cls, *arg, **kw): + if cls.__init__ is object.__init__: + def __init__(self, **kwargs): + for key, value in kwargs.items(): + setattr(self, key, value) + cls.__init__ = __init__ + cls.query = scoped_session.query_property() + return sqla_mapper(cls, *arg, **kw) + return mapper + + __all__ = ['meta', 'session', 'clear_cache', @@ -37,7 +51,7 @@ __all__ = ['meta', ] meta = ThreadLocalMetaData() -session = orm.scoped_session(orm.sessionmaker(transactional=False, autoflush=False)) +session = orm.scoped_session(orm.sessionmaker(autocommit=True, autoflush=False)) machine_table = Table('machines', meta, Column('machine_id', Integer, primary_key=True, nullable=False), @@ -153,23 +167,24 @@ class Build(record.Record): _identity_field = 'build_id' from invirt.database.owner import Owner - -session.mapper(Machine, machine_table, - properties={'nics': relation(NIC, backref="machine"), - 'disks': relation(Disk, backref="machine"), - 'type': relation(Type), - 'acl': relation(MachineAccess, backref="machine", passive_deletes=True, cascade="all, delete-orphan")}); -session.mapper(MachineAccess, machine_access_table) -session.mapper(NIC, nic_table) -session.mapper(Disk, disk_table) -session.mapper(Type, types_table) -session.mapper(Mirror, mirrors_table) -session.mapper(CDROM, cdroms_table, - properties={'mirror': relation(Mirror, backref="cdroms")}) -session.mapper(Autoinstall, autoinstalls_table) -session.mapper(Owner, owners_table) -session.mapper(Admin, admins_table) -session.mapper(Build, builds_table) +mapper = session_mapper(session) + +mapper(Machine, machine_table, + properties={'nics': relation(NIC, backref="machine"), + 'disks': relation(Disk, backref="machine"), + 'type': relation(Type), + 'acl': relation(MachineAccess, backref="machine", passive_deletes=True, cascade="all, delete-orphan")}); +mapper(MachineAccess, machine_access_table) +mapper(NIC, nic_table) +mapper(Disk, disk_table) +mapper(Type, types_table) +mapper(Mirror, mirrors_table) +mapper(CDROM, cdroms_table, + properties={'mirror': relation(Mirror, backref="cdroms")}) +mapper(Autoinstall, autoinstalls_table) +mapper(Owner, owners_table) +mapper(Admin, admins_table) +mapper(Build, builds_table) def clear_cache(): """Clear sqlalchemy's cache