def get_base_for_testsuite()

in lnt/server/db/migrations/upgrade_0_to_1.py [0:0]


def get_base_for_testsuite(test_suite):
    Base = sqlalchemy.ext.declarative.declarative_base()

    db_key_name = test_suite.db_key_name
    class Machine(Base):
        __tablename__ = db_key_name + '_Machine'

        id = Column("ID", Integer, primary_key=True)
        name = Column("Name", String(256), index=True)

        parameters_data = Column("Parameters", Binary)

        class_dict = locals()
        for item in test_suite.machine_fields:
            if item.name in class_dict:
                raise ValueError,"test suite defines reserved key %r" % (
                    name,)

            class_dict[item.name] = item.column = Column(
                item.name, String(256))

    class Order(Base):
        __tablename__ = db_key_name + '_Order'

        id = Column("ID", Integer, primary_key=True)

        next_order_id = Column("NextOrder", Integer, ForeignKey(
                "%s.ID" % __tablename__))
        previous_order_id = Column("PreviousOrder", Integer, ForeignKey(
                "%s.ID" % __tablename__))

        class_dict = locals()
        for item in test_suite.order_fields:
            if item.name in class_dict:
                raise ValueError,"test suite defines reserved key %r" % (
                    name,)

            class_dict[item.name] = item.column = Column(
                item.name, String(256))

    class Run(Base):
        __tablename__ = db_key_name + '_Run'

        id = Column("ID", Integer, primary_key=True)
        machine_id = Column("MachineID", Integer, ForeignKey(Machine.id),
                            index=True)
        order_id = Column("OrderID", Integer, ForeignKey(Order.id),
                          index=True)
        imported_from = Column("ImportedFrom", String(512))
        start_time = Column("StartTime", DateTime)
        end_time = Column("EndTime", DateTime)
        simple_run_id = Column("SimpleRunID", Integer)

        parameters_data = Column("Parameters", Binary)

        machine = sqlalchemy.orm.relation(Machine)
        order = sqlalchemy.orm.relation(Order)

        class_dict = locals()
        for item in test_suite.run_fields:
            if item.name in class_dict:
                raise ValueError,"test suite defines reserved key %r" % (
                    name,)

            class_dict[item.name] = item.column = Column(
                item.name, String(256))

    class Test(Base):
        __tablename__ = db_key_name + '_Test'
        id = Column("ID", Integer, primary_key=True)
        name = Column("Name", String(256), unique=True, index=True)

    class Sample(Base):
        __tablename__ = db_key_name + '_Sample'

        id = Column("ID", Integer, primary_key=True)

        run_id = Column("RunID", Integer, ForeignKey(Run.id))
        test_id = Column("TestID", Integer, ForeignKey(Test.id), index=True)

        run = sqlalchemy.orm.relation(Run)
        test = sqlalchemy.orm.relation(Test)

        class_dict = locals()
        for item in test_suite.sample_fields:
            if item.name in class_dict:
                raise ValueError("test suite defines reserved key {}"
                                 .format(name))

            if item.type.name == 'Real':
                item.column = Column(item.name, Float)
            elif item.type.name == 'Status':
                item.column = Column(item.name, Integer, ForeignKey(
                        StatusKind.id))
            elif item.type.name == 'Hash':
                continue
            else:
                raise ValueError("test suite defines unknown sample type {}"
                                 .format(item.type.name))

            class_dict[item.name] = item.column

    sqlalchemy.schema.Index("ix_%s_Sample_RunID_TestID" % db_key_name,
                            Sample.run_id, Sample.test_id)

    args = [Machine.name, Machine.parameters_data]
    for item in test_suite.machine_fields:
        args.append(item.column)
    sqlalchemy.schema.Index("ix_%s_Machine_Unique" % db_key_name,
                            *args, unique = True)

    return Base