def do_upgrade(env, ver, cursor, db_connector): link_table = Table('link', key=('src', 'dest'))[Column('src', type='integer'), Column('dest', type='integer')] create_table_with_cursor(link_table, cursor, db_connector) return True
def update_backlog_ticket_table(self): self.delete_items_without_ticket_id() table_name = {'name': 'agilo_backlog_ticket'} self.cursor.execute('ALTER TABLE %(name)s RENAME TO %(name)s_old' % table_name) self.drop_postgres_primary_key() create_table_with_cursor(self.new_table(), self.cursor, self.db_connector) self.copy_values_to_new_table() self.cursor.execute('DROP TABLE %(name)s_old' % table_name)
def do_upgrade(env, ver, cursor, db_connector): link_table = Table('link', key=('src', 'dest'))[ Column('src', type='integer'), Column('dest', type='integer') ] create_table_with_cursor(link_table, cursor, db_connector) return True
def _create_new_tables(cursor, db_connector): contingent = \ Table('agilo_contingent', key=('name', 'sprint'))[ Column('name'), Column('sprint'), Column('amount', type='real'), Column('actual', type='real'), ] create_table_with_cursor(contingent, cursor, db_connector)
def create_burndown_changes_table(self): burndown_changes_table = Table('agilo_burndown_data_change', key=('id',))[ Column('id', type='integer', auto_increment=True), Column('burndown_type'), Column('scope'), Column('timestamp', type='int'), Column('value') ] create_table_with_cursor(burndown_changes_table, self.cursor, self.db_connector)
def _rename_column_key_in_team_metrics_entry(env, cursor, db_connector): team_metrics_entry = \ Table('team_metrics_entry', key=('team', 'sprint', 'metrics_key'))[ Column('team'), Column('sprint'), Column('metrics_key'), Column('value', type='real'), ] if get_db_type(env) == 'mysql': # Agilo 0.7 before final (db version 3) was unable to run with # MySQL. So the table could not be created in db version 2. # Therefore we can just create a new one. create_table_with_cursor(team_metrics_entry, cursor, db_connector) else: old_team_metrics_entry_colum_names = ['team', 'sprint', 'key', 'value'] recreate_table_with_changed_types(team_metrics_entry, cursor, db_connector, old_column_names=old_team_metrics_entry_colum_names)
def recreate_table_with_changed_types(table, cursor, db_connector, old_table_name=None, old_column_names=None): if old_table_name == None: old_table_name = table.name temporary_table_name = old_table_name + '_old' rename_table_and_drop_all_keys(cursor, old_table_name, temporary_table_name) create_table_with_cursor(table, cursor, db_connector) colum_names = [c.name for c in table.columns] if old_column_names == None: old_column_names = colum_names assert len(colum_names) == len(old_column_names) col_string = ', '.join(colum_names) old_col_string = ', '.join(old_column_names) insert_sql = 'INSERT INTO %s (%s) SELECT %s FROM %s' % (table.name, col_string, old_col_string, temporary_table_name) cursor.execute(insert_sql) cursor.execute("DROP TABLE %s" % temporary_table_name)
def _rename_column_key_in_team_metrics_entry(env, cursor, db_connector): team_metrics_entry = \ Table('team_metrics_entry', key=('team', 'sprint', 'metrics_key'))[ Column('team'), Column('sprint'), Column('metrics_key'), Column('value', type='real'), ] if get_db_type(env) == 'mysql': # Agilo 0.7 before final (db version 3) was unable to run with # MySQL. So the table could not be created in db version 2. # Therefore we can just create a new one. create_table_with_cursor(team_metrics_entry, cursor, db_connector) else: old_team_metrics_entry_colum_names = ['team', 'sprint', 'key', 'value'] recreate_table_with_changed_types( team_metrics_entry, cursor, db_connector, old_column_names=old_team_metrics_entry_colum_names)
def recreate_table_with_changed_types(table, cursor, db_connector, old_table_name=None, old_column_names=None): if old_table_name == None: old_table_name = table.name temporary_table_name = old_table_name + '_old' rename_table_and_drop_all_keys(cursor, old_table_name, temporary_table_name) create_table_with_cursor(table, cursor, db_connector) colum_names = [c.name for c in table.columns] if old_column_names == None: old_column_names = colum_names assert len(colum_names) == len(old_column_names) col_string = ', '.join(colum_names) old_col_string = ', '.join(old_column_names) insert_sql = 'INSERT INTO %s (%s) SELECT %s FROM %s' % ( table.name, col_string, old_col_string, temporary_table_name) cursor.execute(insert_sql) cursor.execute("DROP TABLE %s" % temporary_table_name)
def _create_new_tables(env, cursor, db_connector): backlog = \ Table('backlog', key=('name'))[ Column('name'), Column('b_type', type='integer'), Column('description'), Column('ticket_types'), Column('sorting_keys'), Column('b_strict', type='integer') ] backlog_ticket = \ Table('backlog_ticket', key=('name', 'pos', 'scope'))[ Column('name'), # The name of the Backlog Column('pos', type='integer'), # The position of the ticket Column('scope'), # The scope is the name of a Sprint or a Milestone Column('level', type='integer'), # The level in the hierarchy of this ticket Column('ticket_id', type='integer') # The id of the ticket ] calendar_entry = \ Table('calendar_entry', key=('date', 'teammember'))[ Column('date', type='integer'), Column('teammember'), Column('hours', type='real'), ] team = \ Table('team', key=('name'))[ Column('name'), Column('description'), ] team_member = \ Table('team_member', key=('name'))[ Column('name'), Column('team'), Column('description'), Column('ts_mon', type='real'), Column('ts_tue', type='real'), Column('ts_wed', type='real'), Column('ts_thu', type='real'), Column('ts_fri', type='real'), Column('ts_sat', type='real'), Column('ts_sun', type='real'), ] new_tables = [ backlog, backlog_ticket, calendar_entry, team, team_member, ] sprint = \ Table('sprint', key=('name'))[ Column('name'), Column('description'), Column('start', type='integer'), Column('end', type='integer'), Column('milestone'), Column('team'), ] if get_db_type(env) == 'postgres': # For PostgreSQL 'end' is a reserved word. Agilo 0.7 before final # (db version 3) therefore were unable to run with PostgreSQL. # # But we have to create sprints for every milestone in 0.6 and for that # we need a sprint table so we just use the table definition from # 0.7 final here. db3 will take not to recreate the table. end_column = sprint.columns[3] assert end_column.name == 'end' end_column.name = 'sprint_end' new_tables.append(sprint) if get_db_type(env) != 'mysql': # In MySQL 'key' is a reserved word. Agilo 0.7 before final # (db version 3) therefore were unable to run with MySQL. So we # just skip the table creation here. db3 will create the table with the # correct columns (and fixed column names) for us. team_metrics_entry = \ Table('team_metrics_entry', key=('team', 'sprint', 'key'))[ Column('team'), Column('sprint'), Column('key'), Column('value', type='real'), ] new_tables.append(team_metrics_entry) for table in new_tables: create_table_with_cursor(table, cursor, db_connector) return sprint
def _create_new_tables(env, cursor, db_connector): backlog = \ Table('backlog', key=('name'))[ Column('name'), Column('b_type', type='integer'), Column('description'), Column('ticket_types'), Column('sorting_keys'), Column('b_strict', type='integer') ] backlog_ticket = \ Table('backlog_ticket', key=('name', 'pos', 'scope'))[ Column('name'), # The name of the Backlog Column('pos', type='integer'), # The position of the ticket Column('scope'), # The scope is the name of a Sprint or a Milestone Column('level', type='integer'), # The level in the hierarchy of this ticket Column('ticket_id', type='integer') # The id of the ticket ] calendar_entry = \ Table('calendar_entry', key=('date', 'teammember'))[ Column('date', type='integer'), Column('teammember'), Column('hours', type='real'), ] team = \ Table('team', key=('name'))[ Column('name'), Column('description'), ] team_member = \ Table('team_member', key=('name'))[ Column('name'), Column('team'), Column('description'), Column('ts_mon', type='real'), Column('ts_tue', type='real'), Column('ts_wed', type='real'), Column('ts_thu', type='real'), Column('ts_fri', type='real'), Column('ts_sat', type='real'), Column('ts_sun', type='real'), ] new_tables = [backlog, backlog_ticket, calendar_entry, team, team_member,] sprint = \ Table('sprint', key=('name'))[ Column('name'), Column('description'), Column('start', type='integer'), Column('end', type='integer'), Column('milestone'), Column('team'), ] if get_db_type(env) == 'postgres': # For PostgreSQL 'end' is a reserved word. Agilo 0.7 before final # (db version 3) therefore were unable to run with PostgreSQL. # # But we have to create sprints for every milestone in 0.6 and for that # we need a sprint table so we just use the table definition from # 0.7 final here. db3 will take not to recreate the table. end_column = sprint.columns[3] assert end_column.name == 'end' end_column.name = 'sprint_end' new_tables.append(sprint) if get_db_type(env) != 'mysql': # In MySQL 'key' is a reserved word. Agilo 0.7 before final # (db version 3) therefore were unable to run with MySQL. So we # just skip the table creation here. db3 will create the table with the # correct columns (and fixed column names) for us. team_metrics_entry = \ Table('team_metrics_entry', key=('team', 'sprint', 'key'))[ Column('team'), Column('sprint'), Column('key'), Column('value', type='real'), ] new_tables.append(team_metrics_entry) for table in new_tables: create_table_with_cursor(table, cursor, db_connector) return sprint