1*9c5db199SXin LiTABLE_TYPE = object() 2*9c5db199SXin LiVIEW_TYPE = object() 3*9c5db199SXin Li 4*9c5db199SXin Li 5*9c5db199SXin Liclass NameMissingException(Exception): 6*9c5db199SXin Li pass 7*9c5db199SXin Li 8*9c5db199SXin Li 9*9c5db199SXin Lidef drop_views(manager, views): 10*9c5db199SXin Li """ 11*9c5db199SXin Li Drops the specified views from the database 12*9c5db199SXin Li 13*9c5db199SXin Li If a specified view does not exist in the database, this method fails 14*9c5db199SXin Li without modification 15*9c5db199SXin Li 16*9c5db199SXin Li @param manager the migration manager 17*9c5db199SXin Li @param views the views to drop 18*9c5db199SXin Li """ 19*9c5db199SXin Li check_exists(manager, views, VIEW_TYPE) 20*9c5db199SXin Li for view in views: 21*9c5db199SXin Li manager.execute('DROP VIEW `%s`' % view) 22*9c5db199SXin Li 23*9c5db199SXin Li 24*9c5db199SXin Lidef rename(manager, mapping): 25*9c5db199SXin Li """ 26*9c5db199SXin Li Renames specified tables in the database 27*9c5db199SXin Li 28*9c5db199SXin Li Use this to rename a specified set of tables in a database. If a source in 29*9c5db199SXin Li the mapping does not exist, this method fails without modification. 30*9c5db199SXin Li 31*9c5db199SXin Li @param manager the migration manager 32*9c5db199SXin Li @param mapping a dictionary of orig_name => new_name. Any table not matching 33*9c5db199SXin Li an entry in this dictionary will not be renamed 34*9c5db199SXin Li """ 35*9c5db199SXin Li check_exists(manager, (table for table, _ in mapping.iteritems()), 36*9c5db199SXin Li TABLE_TYPE) 37*9c5db199SXin Li for orig_name, new_name in mapping.iteritems(): 38*9c5db199SXin Li manager.execute('RENAME TABLE `%s` TO `%s`' % (orig_name, new_name)) 39*9c5db199SXin Li 40*9c5db199SXin Li 41*9c5db199SXin Lidef move_tables(manager, src_manager, tables): 42*9c5db199SXin Li """ 43*9c5db199SXin Li Moves the specified tables from another database 44*9c5db199SXin Li 45*9c5db199SXin Li If a table does not exist in the source database, this method fails without 46*9c5db199SXin Li modification 47*9c5db199SXin Li 48*9c5db199SXin Li @param manager the migration manager 49*9c5db199SXin Li @param src_manager a migration manager that handles the source database 50*9c5db199SXin Li @param tables a list of tables to move 51*9c5db199SXin Li """ 52*9c5db199SXin Li check_exists(src_manager, tables, TABLE_TYPE) 53*9c5db199SXin Li for table in tables: 54*9c5db199SXin Li manager.execute('RENAME TABLE `%(db)s`.`%(table)s` TO `%(table)s`' 55*9c5db199SXin Li % dict(db=src_manager.get_db_name(), table=table)) 56*9c5db199SXin Li 57*9c5db199SXin Li 58*9c5db199SXin Lidef drop_database(manager): 59*9c5db199SXin Li """ 60*9c5db199SXin Li Drops the database that the specified manager controls 61*9c5db199SXin Li 62*9c5db199SXin Li @param manager the migration manager 63*9c5db199SXin Li """ 64*9c5db199SXin Li manager.execute('DROP DATABASE `%s`' % manager.get_db_name()) 65*9c5db199SXin Li 66*9c5db199SXin Li 67*9c5db199SXin Lidef check_exists(manager, names, type): 68*9c5db199SXin Li """ 69*9c5db199SXin Li Checks if the tables or views exists. 70*9c5db199SXin Li 71*9c5db199SXin Li Raise an Exception if any of the names do not exist 72*9c5db199SXin Li 73*9c5db199SXin Li @param manager the migration manager 74*9c5db199SXin Li @param names the table/view names 75*9c5db199SXin Li @param type one of 'TABLE' or 'VIEW' 76*9c5db199SXin Li """ 77*9c5db199SXin Li if type == TABLE_TYPE: 78*9c5db199SXin Li info_table = 'TABLES' 79*9c5db199SXin Li elif type == VIEW_TYPE: 80*9c5db199SXin Li info_table = 'VIEWS' 81*9c5db199SXin Li else: 82*9c5db199SXin Li raise Exception("type parameter must be either TABLE_TYPE or VIEW_TYPE") 83*9c5db199SXin Li 84*9c5db199SXin Li query = ('SELECT table_name FROM information_schema.%s ' 85*9c5db199SXin Li 'WHERE table_schema = %%s' % info_table) 86*9c5db199SXin Li rows = manager.execute(query, manager.get_db_name()) 87*9c5db199SXin Li existing_names = [row[0] for row in rows] 88*9c5db199SXin Li 89*9c5db199SXin Li for name in names: 90*9c5db199SXin Li if name not in existing_names: 91*9c5db199SXin Li raise NameMissingException( 92*9c5db199SXin Li '%s missing from database, stopping' % name) 93*9c5db199SXin Li 94*9c5db199SXin Li 95*9c5db199SXin Lidef check_index_exists(manager, table_name, index_name): 96*9c5db199SXin Li """ 97*9c5db199SXin Li Checks if a particular index exists on the table 98*9c5db199SXin Li 99*9c5db199SXin Li @param manager the migration manager 100*9c5db199SXin Li @param table_name the table to check 101*9c5db199SXin Li @param index_name the index to check 102*9c5db199SXin Li """ 103*9c5db199SXin Li query = ('SELECT 1 FROM information_schema.statistics ' 104*9c5db199SXin Li 'WHERE table_schema = %s AND table_name = %s AND index_name = %s') 105*9c5db199SXin Li rows = manager.execute(query, manager.get_db_name(), table_name, index_name) 106*9c5db199SXin Li return bool(rows) 107*9c5db199SXin Li 108*9c5db199SXin Li 109*9c5db199SXin LiDJANGO_AUTH_TABLES = ('auth_group', 'auth_group_permissions', 'auth_permission') 110*9c5db199SXin Li 111*9c5db199SXin Lidef auth_tables_exist(manager): 112*9c5db199SXin Li try: 113*9c5db199SXin Li check_exists(manager, DJANGO_AUTH_TABLES, TABLE_TYPE) 114*9c5db199SXin Li return True 115*9c5db199SXin Li except NameMissingException: 116*9c5db199SXin Li return False 117