xref: /aosp_15_r20/external/autotest/database/db_utils.py (revision 9c5db1993ded3edbeafc8092d69fe5de2ee02df7)
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