from django.core.management.base import BaseCommand from django.db import connection def _pg(cursor): cursor.execute(""" CREATE OR REPLACE FUNCTION update_alert_after() RETURNS trigger AS $update_alert_after$ BEGIN IF NEW.last_ping IS NOT NULL THEN NEW.alert_after := NEW.last_ping + NEW.timeout + NEW.grace; END IF; RETURN NEW; END; $update_alert_after$ LANGUAGE plpgsql; DROP TRIGGER IF EXISTS update_alert_after ON api_check; CREATE TRIGGER update_alert_after BEFORE INSERT OR UPDATE OF last_ping, timeout, grace ON api_check FOR EACH ROW EXECUTE PROCEDURE update_alert_after(); """) def _mysql(cursor): cursor.execute(""" DROP TRIGGER IF EXISTS update_alert_after; """) cursor.execute(""" CREATE TRIGGER update_alert_after BEFORE UPDATE ON api_check FOR EACH ROW SET NEW.alert_after = NEW.last_ping + INTERVAL (NEW.timeout + NEW.grace) MICROSECOND; """) def _sqlite(cursor): cursor.execute(""" DROP TRIGGER IF EXISTS update_alert_after; """) cursor.execute(""" CREATE TRIGGER update_alert_after AFTER UPDATE OF last_ping, timeout, grace ON api_check FOR EACH ROW BEGIN UPDATE api_check SET alert_after = datetime(strftime('%s', last_ping) + timeout/1000000 + grace/1000000, 'unixepoch') WHERE id = OLD.id; END; """) class Command(BaseCommand): help = 'Ensures triggers exist in database' def handle(self, *args, **options): with connection.cursor() as cursor: if connection.vendor == "postgresql": _pg(cursor) return "Created PostgreSQL trigger" if connection.vendor == "mysql": _mysql(cursor) return "Created MySQL trigger" if connection.vendor == "sqlite": _sqlite(cursor) return "Created SQLite trigger"