]> git.8kb.co.uk Git - slony-i/pg_sched/blob - pg_sched.sql
Improve logging order by actually joining threads as they complete rather than waitin...
[slony-i/pg_sched] / pg_sched.sql
1 SET search_path=public; 
2
3 DROP TYPE IF EXISTS node_role CASCADE;
4 CREATE TYPE node_role AS ENUM ('O', 'R', 'A', 'D');
5
6 DROP TABLE IF EXISTS pg_sched CASCADE;
7 CREATE TABLE pg_sched
8 (
9   id bigserial NOT NULL PRIMARY KEY,
10   datname text NOT NULL,
11   proname text NOT NULL,
12   pronamespace text NOT NULL,
13   proargs text[],
14   proargtypes text[],
15   usename text,
16   frequency interval NOT NULL,
17   frequency_offset interval NOT NULL DEFAULT '0s',
18   last_run timestamp,
19   last_completed timestamp,
20   enabled node_role NULL DEFAULT 'O', 
21   isexclusive boolean NOT NULL DEFAULT true,
22   isloose boolean NOT NULL DEFAULT true,
23   tag varchar(50),  
24   running integer,
25   CONSTRAINT pg_sched_unique UNIQUE (datname, proname, pronamespace, proargs, proargtypes, frequency, frequency_offset, enabled),
26   CHECK (array_length(proargs,1) IS NOT DISTINCT FROM array_length(proargtypes,1))
27 );
28
29 CREATE OR REPLACE FUNCTION pg_sched_check_types() RETURNS TRIGGER AS
30 $BODY$
31 BEGIN
32         IF EXISTS(SELECT 1 FROM unnest(NEW.proargtypes) a
33                         LEFT JOIN pg_catalog.pg_type 
34                         ON pg_catalog.format_type(oid, NULL) = a
35                                 OR typname = a WHERE typname IS NULL) THEN
36                 RAISE EXCEPTION 'Value for column "proargtypes" contains invalid types: %', NEW.proargtypes;
37         END IF;
38         RETURN NEW;
39 END;
40 $BODY$
41 LANGUAGE plpgsql;
42
43 REVOKE ALL ON pg_sched FROM public;
44 GRANT SELECT ON pg_sched TO public;
45
46 CREATE TRIGGER pg_sched_check_types_trigger
47 BEFORE UPDATE OR INSERT ON pg_sched
48 FOR EACH ROW WHEN (NEW.proargtypes IS NOT NULL)
49 EXECUTE PROCEDURE pg_sched_check_types();
50
51 -- Superuser is required to run tasks under differing credentials
52 -- CREATE USER pg_sched WITH PASSWORD 'my password' SUPERUSER ; 
53 -- ALTER TABLE pg_sched OWNER TO pg_sched;
54
55 -- Example task
56 -- INSERT INTO pg_sched (usename, datname, pronamespace, proname, proargs, proargtypes, enabled, frequency, frequency_offset) 
57 -- VALUES ('test_user', 'mydb', 'pg_catalog', 'date_part', '{"hour", "2015-03-25 13:50:59"}', '{text, timestamp}', 'A', '1 hour', '1 minute');