text: # Version 3 of the database adds the FieldChange class to track flagged
  # regressions in the database.
  
  import sqlalchemy
  from sqlalchemy import Integer, Column, ForeignKey
  
  # Import the original schema from upgrade_0_to_1 since upgrade_1_to_2 does not
  # change the actual schema, but rather adds functionality vis-a-vis orders.
  import lnt.server.db.migrations.upgrade_0_to_1 as upgrade_0_to_1
  
  ###
  # Upgrade TestSuite
  
  
  def get_base(test_suite):
      """Return the schema base with field changes added."""
      return add_fieldchange(test_suite)
  
  
  def add_fieldchange(test_suite):
      # Grab the Base for the previous schema so that we have all
      # the definitions we need.
      Base = upgrade_0_to_1.get_base_for_testsuite(test_suite)
      # Grab our db_key_name for our test suite so we can properly
      # prefix our fields/table names.
      db_key_name = test_suite.db_key_name
  
      class FieldChange(Base):
          __tablename__ = db_key_name + '_FieldChange'
          id = Column("ID", Integer, primary_key=True)
          start_order_id = Column("StartOrderID", Integer,
                                  ForeignKey("%s_Order.ID" % db_key_name))
          end_order_id = Column("EndOrderID", Integer,
                                ForeignKey("%s_Order.ID" % db_key_name))
          test_id = Column("TestID", Integer,
                           ForeignKey("%s_Test.ID" % db_key_name))
          machine_id = Column("MachineID", Integer,
                              ForeignKey("%s_Machine.ID" % db_key_name))
          field_id = Column("FieldID", Integer,
                            ForeignKey(upgrade_0_to_1.SampleField.id))
  
      return Base
  
  
  def upgrade_testsuite(engine, session, name):
      # Grab Test Suite.
      test_suite = session.query(upgrade_0_to_1.TestSuite).\
                   filter_by(name=name).first()
      assert(test_suite is not None)
  
      # Add FieldChange to the test suite.
      Base = add_fieldchange(test_suite)
  
      # Create tables. We commit now since databases like Postgres run
      # into deadlocking issues due to previous queries that we have run
      # during the upgrade process. The commit closes all of the
      # relevant transactions allowing us to then perform our upgrade.
      session.commit()
      Base.metadata.create_all(engine)
      # Commit changes (also closing all relevant transactions with
      # respect to Postgres like databases).
      session.commit()
  
  
  def upgrade(engine):
      # Create a session.
      session = sqlalchemy.orm.sessionmaker(engine)()
  
      # Create our FieldChangeField table and commit.
      upgrade_testsuite(engine, session, 'nts')
      upgrade_testsuite(engine, session, 'compile')
      session.close()
  