Skip to content

Commit 9470fe2

Browse files
committed
Allow custom names for User-Defined Actions
This commit allows custom names for Used-Defined Actions. add_job() and alter_job() accept an additional "job_name" argument to modify the name of User-Defined Action. If "job_name" is not specified, it is names as default.
1 parent 2a3d5d9 commit 9470fe2

File tree

5 files changed

+45
-6
lines changed

5 files changed

+45
-6
lines changed

sql/job_api.sql

+5-3
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,8 @@ CREATE OR REPLACE FUNCTION @[email protected]_job(
1010
scheduled BOOL DEFAULT true,
1111
check_config REGPROC DEFAULT NULL,
1212
fixed_schedule BOOL DEFAULT TRUE,
13-
timezone TEXT DEFAULT NULL
13+
timezone TEXT DEFAULT NULL,
14+
job_name name DEFAULT NULL
1415
) RETURNS INTEGER AS '@MODULE_PATHNAME@', 'ts_job_add' LANGUAGE C VOLATILE;
1516

1617
CREATE OR REPLACE FUNCTION @[email protected]_job(job_id INTEGER) RETURNS VOID AS '@MODULE_PATHNAME@', 'ts_job_delete' LANGUAGE C VOLATILE STRICT;
@@ -30,10 +31,11 @@ CREATE OR REPLACE FUNCTION @[email protected]_job(
3031
check_config REGPROC = NULL,
3132
fixed_schedule BOOL = NULL,
3233
initial_start TIMESTAMPTZ = NULL,
33-
timezone TEXT DEFAULT NULL
34+
timezone TEXT DEFAULT NULL,
35+
job_name name DEFAULT NULL
3436
)
3537
RETURNS TABLE (job_id INTEGER, schedule_interval INTERVAL, max_runtime INTERVAL, max_retries INTEGER, retry_period INTERVAL, scheduled BOOL, config JSONB,
36-
next_start TIMESTAMPTZ, check_config TEXT, fixed_schedule BOOL, initial_start TIMESTAMPTZ, timezone TEXT)
38+
next_start TIMESTAMPTZ, check_config TEXT, fixed_schedule BOOL, initial_start TIMESTAMPTZ, timezone TEXT, job_name name)
3739
AS '@MODULE_PATHNAME@', 'ts_job_alter'
3840
LANGUAGE C VOLATILE;
3941

src/bgw/job.c

+4
Original file line numberDiff line numberDiff line change
@@ -786,6 +786,10 @@ bgw_job_tuple_update_by_id(TupleInfo *ti, void *const data)
786786
bool isnull[Natts_bgw_job] = { 0 };
787787
bool doReplace[Natts_bgw_job] = { 0 };
788788

789+
values[AttrNumberGetAttrOffset(Anum_bgw_job_application_name)] =
790+
NameGetDatum(&updated_job->fd.application_name);
791+
doReplace[AttrNumberGetAttrOffset(Anum_bgw_job_application_name)] = true;
792+
789793
Datum old_schedule_interval =
790794
slot_getattr(ti->slot, Anum_bgw_job_schedule_interval, &isnull[0]);
791795
Assert(!isnull[0]);

tsl/src/bgw_policy/job_api.c

+18-1
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ validate_check_signature(Oid check)
7070
* 5 check_config REGPROC DEFAULT NULL
7171
* 6 fixed_schedule BOOL DEFAULT TRUE
7272
* 7 timezone TEXT DEFAULT NULL
73+
* 8 job_name name DEFAULT NULL
7374
* ) RETURNS INTEGER
7475
*/
7576
Datum
@@ -99,6 +100,7 @@ job_add(PG_FUNCTION_ARGS)
99100
/* verify it's a valid timezone */
100101
if (timezone != NULL)
101102
valid_timezone = ts_bgw_job_validate_timezone(PG_GETARG_DATUM(7));
103+
char *job_name_str = PG_ARGISNULL(8) ? NULL : NameStr(*PG_GETARG_NAME(8));
102104

103105
TS_PREVENT_FUNC_IF_READ_ONLY();
104106

@@ -161,7 +163,10 @@ job_add(PG_FUNCTION_ARGS)
161163
ts_bgw_job_validate_job_owner(owner);
162164

163165
/* Next, insert a new job into jobs table */
164-
namestrcpy(&application_name, "User-Defined Action");
166+
if (job_name_str)
167+
namestrcpy(&application_name, job_name_str);
168+
else
169+
namestrcpy(&application_name, "User-Defined Action");
165170
namestrcpy(&proc_schema, get_namespace_name(get_func_namespace(proc)));
166171
namestrcpy(&proc_name, func_name);
167172

@@ -283,6 +288,7 @@ job_run(PG_FUNCTION_ARGS)
283288
* 10 fixed_schedule BOOL = NULL,
284289
* 11 initial_start TIMESTAMPTZ = NULL
285290
* 12 timezone TEXT = NULL
291+
* 13 job_name name = NULL
286292
* ) RETURNS TABLE (
287293
* job_id INTEGER,
288294
* schedule_interval INTERVAL,
@@ -296,6 +302,7 @@ job_run(PG_FUNCTION_ARGS)
296302
* fixed_schedule BOOL
297303
* initial_start TIMESTAMPTZ
298304
* timezone TEXT
305+
* job_name name
299306
* )
300307
*/
301308
Datum
@@ -436,6 +443,14 @@ job_alter(PG_FUNCTION_ARGS)
436443
job->fd.initial_start = initial_start;
437444
}
438445

446+
if (!PG_ARGISNULL(13))
447+
{
448+
char app_name[NAMEDATALEN];
449+
snprintf(app_name, NAMEDATALEN, "%s [%d]",
450+
NameStr(*PG_GETARG_NAME(13)), job_id);
451+
namestrcpy(&job->fd.application_name, app_name);
452+
}
453+
439454
if (valid_timezone != NULL)
440455
job->fd.timezone = cstring_to_text(valid_timezone);
441456
else
@@ -524,6 +539,8 @@ job_alter(PG_FUNCTION_ARGS)
524539
values[11] = CStringGetTextDatum(valid_timezone);
525540
else
526541
nulls[11] = true;
542+
543+
values[12] = NameGetDatum(&job->fd.application_name);
527544

528545
tuple = heap_form_tuple(tupdesc, values, nulls);
529546
return HeapTupleGetDatum(tuple);

tsl/test/expected/bgw_custom.out

+13-1
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ SELECT * FROM timescaledb_information.jobs WHERE job_id >= 1000 ORDER BY 1;
8282
1001 | User-Defined Action [1001] | @ 1 hour | @ 0 | -1 | @ 5 mins | public | custom_proc | default_perm_user | t | t | {"type": "procedure"} | Fri Dec 31 16:00:00 1999 PST | Fri Dec 31 16:00:00 1999 PST | | | |
8383
1002 | User-Defined Action [1002] | @ 1 hour | @ 0 | -1 | @ 5 mins | public | custom_proc2 | default_perm_user | t | t | {"type": "procedure"} | Fri Dec 31 16:00:00 1999 PST | Fri Dec 31 16:00:00 1999 PST | | | |
8484
1003 | User-Defined Action [1003] | @ 1 hour | @ 0 | -1 | @ 5 mins | public | custom_func | default_perm_user | t | t | {"type": "function"} | Fri Dec 31 16:00:00 1999 PST | Fri Dec 31 16:00:00 1999 PST | | | |
85-
1004 | User-Defined Action [1004] | @ 1 hour | @ 0 | -1 | @ 5 mins | public | custom_func_definer | default_perm_user | t | t | {"type": "function"} | Fri Dec 31 16:00:00 1999 PST | Fri Dec 31 16:00:00 1999 PST | | | |
85+
1004 | custom_job_name [1004] | @ 1 hour | @ 0 | -1 | @ 5 mins | public | custom_func_definer | default_perm_user | t | t | {"type": "function"} | Fri Dec 31 16:00:00 1999 PST | Fri Dec 31 16:00:00 1999 PST | | | |
8686
(5 rows)
8787

8888
SELECT count(*) FROM _timescaledb_config.bgw_job WHERE config->>'type' IN ('procedure', 'function');
@@ -187,6 +187,18 @@ SELECT job_id FROM alter_job(1000,scheduled:=false);
187187
1000
188188
(1 row)
189189

190+
-- test updating the job name
191+
SELECT job_id, job_name FROM alter_job(1000,job_name:='custom_name_2');
192+
job_id | job_name
193+
--------+----------------------
194+
1000 | custom_name_2 [1000]
195+
(1 row)
196+
SELECT application_name FROM timescaledb_information.jobs WHERE job_id = 1000;
197+
application_name
198+
----------------------
199+
custom_name_2 [1000]
200+
(1 row)
201+
190202
SELECT scheduled, config FROM timescaledb_information.jobs WHERE job_id = 1000;
191203
scheduled | config
192204
-----------+----------------------

tsl/test/sql/bgw_custom.sql

+5-1
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ SELECT add_job('custom_proc','1h', config:='{"type":"procedure"}'::jsonb, initia
5151
SELECT add_job('custom_proc2','1h', config:= '{"type":"procedure"}'::jsonb, initial_start => :'time_zero'::TIMESTAMPTZ);
5252

5353
SELECT add_job('custom_func', '1h', config:='{"type":"function"}'::jsonb, initial_start => :'time_zero'::TIMESTAMPTZ);
54-
SELECT add_job('custom_func_definer', '1h', config:='{"type":"function"}'::jsonb, initial_start => :'time_zero'::TIMESTAMPTZ);
54+
SELECT add_job('custom_func_definer', '1h', config:='{"type":"function"}'::jsonb, initial_start => :'time_zero'::TIMESTAMPTZ, job_name := 'custom_job_name');
5555

5656
-- exclude internal jobs
5757
SELECT * FROM timescaledb_information.jobs WHERE job_id >= 1000 ORDER BY 1;
@@ -110,6 +110,10 @@ SELECT scheduled, config FROM timescaledb_information.jobs WHERE job_id = 1000;
110110
SELECT job_id FROM alter_job(1000,scheduled:=false);
111111
SELECT scheduled, config FROM timescaledb_information.jobs WHERE job_id = 1000;
112112

113+
-- test updating the job name
114+
SELECT job_id, job_name FROM alter_job(1000,job_name:=='custom_name_2');
115+
SELECT application_name FROM timescaledb_information.jobs WHERE job_id = 1000;
116+
113117
-- Done with job 1000 now, so remove it.
114118
SELECT delete_job(1000);
115119

0 commit comments

Comments
 (0)