The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
CREATE OR REPLACE FUNCTION make_plpgsql() RETURNS VOID AS $$
CREATE LANGUAGE plpgsql;
$$ LANGUAGE SQL;

SELECT
    CASE WHEN
        EXISTS(
            SELECT
                1
            FROM
                pg_catalog.pg_language
            WHERE
                lanname='plpgsql'
        )
    THEN
        NULL
    ELSE
        make_plpgsql()
    END;

DROP FUNCTION make_plpgsql();

CREATE OR REPLACE FUNCTION create_deploy_table() RETURNS VOID AS $$
BEGIN
    CREATE TABLE _deploy (
        app VARCHAR(40) NOT NULL PRIMARY KEY,
        seq INTEGER NOT NULL DEFAULT 0,
        ctime TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
        type VARCHAR(20),
        data VARCHAR
    );

    EXCEPTION WHEN duplicate_table THEN -- Do nothing
END;
$$ LANGUAGE plpgsql;

SELECT create_deploy_table();

DROP FUNCTION create_deploy_table();

CREATE OR REPLACE FUNCTION deploy_autoinc() RETURNS trigger AS $$
BEGIN
    NEW.seq := NEW.seq + 1;
    RETURN NEW;
END;
$$ LANGUAGE plpgsql;

DROP TRIGGER IF EXISTS au__deploy ON _deploy;

CREATE TRIGGER au__deploy BEFORE UPDATE ON _deploy
FOR EACH ROW EXECUTE PROCEDURE deploy_autoinc();