from buildbot.db.schema import base

class Upgrader(base.Upgrader):
    def upgrade(self):
        self.add_index("buildrequests", "buildsetid")
        self.add_index("buildrequests", "buildername", 255)
        self.add_index("buildrequests", "complete")
        self.add_index("buildrequests", "claimed_at")
        self.add_index("buildrequests", "claimed_by_name", 255)

        self.add_index("builds", "number")
        self.add_index("builds", "brid")

        self.add_index("buildsets", "complete")
        self.add_index("buildsets", "submitted_at")

        self.add_index("buildset_properties", "buildsetid")

        self.add_index("changes", "branch", 255)
        self.add_index("changes", "revision", 255)
        self.add_index("changes", "author", 255)
        self.add_index("changes", "category", 255)
        self.add_index("changes", "when_timestamp")

        self.add_index("change_files", "changeid")
        self.add_index("change_links", "changeid")
        self.add_index("change_properties", "changeid")

        # schedulers already has an index

        self.add_index("scheduler_changes", "schedulerid")
        self.add_index("scheduler_changes", "changeid")

        self.add_index("scheduler_upstream_buildsets", "buildsetid")
        self.add_index("scheduler_upstream_buildsets", "schedulerid")
        self.add_index("scheduler_upstream_buildsets", "active")

        # sourcestamps are only queried by id, no need for additional indexes

        self.add_index("sourcestamp_changes", "sourcestampid")

        self.set_version()

    def add_index(self, table, column, length=None):
        lengthstr=""
        if length is not None and self.dbapiName == 'MySQLdb':
            lengthstr = " (%i)" % length
        q = "CREATE INDEX `%(table)s_%(column)s` ON `%(table)s` (`%(column)s`%(lengthstr)s)"
        cursor = self.conn.cursor()
        cursor.execute(q % locals())

    def set_version(self):
        c = self.conn.cursor()
        c.execute("""UPDATE version set version = 5 where version = 4""")
