blob: 6f88fd9c4acdf27a495ef2b140117e9ee8b2eeec [file] [log] [blame]
import plpy
import pipes
from control import MinWarning
def __get_madlib_temp_tables(target_schema):
sql_get_tables_to_drop = """
SELECT quote_ident(tablename) AS tablename
FROM pg_tables
WHERE tablename LIKE E'%madlib\_temp%'
AND quote_ident(schemaname) = '{target_schema}'
""".format(**locals())
return plpy.execute(sql_get_tables_to_drop)
def __get_madlib_temp_views(target_schema):
sql_get_tables_to_drop = """
SELECT quote_ident(viewname) AS viewname
FROM pg_views
WHERE viewname LIKE E'%madlib\_temp%'
AND quote_ident(schemaname) = '{target_schema}'
""".format(**locals())
return plpy.execute(sql_get_tables_to_drop)
# ------------------------------------------------------------------------------
def cleanup_madlib_temp_tables(schema_madlib, target_schema, **kwargs):
""" Drop all tables matching '%madlib_temp%' in the given schema
Args:
@param target_schema
Returns:
None
"""
to_drop_list = __get_madlib_temp_tables(target_schema)
if len(to_drop_list) == 0:
plpy.info("No madlib temp tables found in schema {target_schema}.".format(**locals()))
return None
sql_drop_all = 'DROP TABLE '
sql_drop_all += ",".join(["{target_schema}.{tablename}".format(
tablename=row['tablename'], **locals()) for row in to_drop_list])
sql_drop_all += ";"
plpy.notice("Dropping {0} tables ...".format(len(to_drop_list)))
try:
with MinWarning():
plpy.execute(sql_drop_all)
except plpy.spiexceptions.OutOfMemory:
escaped_sql = pipes.quote(
'SELECT {schema_madlib}.cleanup_madlib_temp_tables_script(\'{target_schema}\')'
.format(**locals()))
plpy.error(
"You have too many tables and cannot be dropped all at once.\n"
"Use the following bash commands instead:\n"
" $ psql -A -t -c {escaped_sql} > /tmp/drop_all_madlib_temp.sql\n"
" $ psql -f /tmp/drop_all_madlib_temp.sql"
.format(**locals()))
plpy.notice("Finished dropping {0} tables.".format(len(to_drop_list)))
# ------------------------------------------------------------------------------
def cleanup_madlib_temp_tables_script(schema_madlib, target_schema, **kwargs):
""" Create a sql script to drop all tables matching '%madlib_temp%' in the given schema
Args:
@param target_schema
Returns:
None
"""
to_drop_list = __get_madlib_temp_tables(target_schema)
if len(to_drop_list) == 0:
plpy.info("No madlib temp tables found in schema {target_schema}.")
return None
sql_content = ''
for row in to_drop_list:
tablename = row['tablename']
sql_drop = "DROP TABLE {target_schema}.{tablename};".format(**locals())
sql_content += sql_drop + "\n"
return sql_content
# ------------------------------------------------------------------------------
def cleanup_madlib_temp_views(schema_madlib, target_schema, **kwargs):
to_drop_list = __get_madlib_temp_views(target_schema)
if len(to_drop_list) == 0:
plpy.info("No madlib temp views found in schema {target_schema}.".format(**locals()))
return None
sql_drop_all = 'DROP VIEW IF EXISTS '
sql_drop_all += ",".join(["{target_schema}.{viewname}".format(
viewname=row['viewname'], **locals()) for row in to_drop_list])
sql_drop_all += " CASCADE;"
plpy.notice("Dropping {0} views ...".format(len(to_drop_list)))
plpy.execute(sql_drop_all)