Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit 54b4b68

Browse files
author
Vladimir Ershov
committed
read schema from catalog
1 parent f2b4c3d commit 54b4b68

File tree

2 files changed

+59
-4
lines changed

2 files changed

+59
-4
lines changed

src/pgpro_scheduler.c

Lines changed: 58 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,13 @@
2323
#include "utils/builtins.h"
2424
#include "catalog/pg_db_role_setting.h"
2525
#include "commands/dbcommands.h"
26+
#include "utils/lsyscache.h"
27+
#include "catalog/pg_extension.h"
28+
#include "catalog/indexing.h"
29+
#include "commands/extension.h"
30+
#include "access/sysattr.h"
31+
#include "access/htup_details.h"
32+
#include "utils/fmgroids.h"
2633

2734

2835
#include "char_array.h"
@@ -52,6 +59,7 @@ bool scheduler_service_enabled = false;
5259
char *scheduler_schema = NULL;
5360
/* Custom GUC done */
5461

62+
Oid scheduler_schema_oid = InvalidOid;
5563
Oid scheduler_atjob_id_OID = InvalidOid;
5664

5765
extern void
@@ -166,11 +174,59 @@ bool is_scheduler_enabled(void)
166174
return false;
167175
}
168176

177+
char *get_scheduler_schema_name(void)
178+
{
179+
Oid ns_oid;
180+
Oid ext_oid;
181+
182+
Relation rel;
183+
SysScanDesc scandesc;
184+
HeapTuple tuple;
185+
ScanKeyData entry[1];
186+
LOCKMODE heap_lock = AccessShareLock;
187+
188+
189+
if(scheduler_schema_oid == InvalidOid)
190+
{
191+
if (!IsTransactionState())
192+
elog(ERROR, "pgpro_scheduler: cannot get extension scheme (1)");
193+
ext_oid = get_extension_oid("pgpro_scheduler", true);
194+
if(ext_oid == InvalidOid)
195+
elog(ERROR, "pgpro_scheduler: cannot get extension id");
196+
197+
ScanKeyInit(&entry[0],
198+
ObjectIdAttributeNumber,
199+
BTEqualStrategyNumber,
200+
F_OIDEQ,
201+
ObjectIdGetDatum(ext_oid));
202+
rel = heap_open(ExtensionRelationId, heap_lock);
203+
scandesc = systable_beginscan(rel, ExtensionOidIndexId, true,
204+
NULL, 1, entry);
205+
tuple = systable_getnext(scandesc);
206+
if (HeapTupleIsValid(tuple))
207+
ns_oid = ((Form_pg_extension) GETSTRUCT(tuple))->extnamespace;
208+
else
209+
ns_oid = InvalidOid;
210+
systable_endscan(scandesc);
211+
heap_close(rel, heap_lock);
212+
213+
if(ns_oid == InvalidOid)
214+
elog(ERROR, "pgpro_scheduler: cannot get extension schema oid");
215+
216+
scheduler_schema_oid = ns_oid;
217+
}
218+
else
219+
{
220+
ns_oid = scheduler_schema_oid;
221+
}
222+
223+
return get_namespace_name(ns_oid);
224+
}
225+
169226
char *set_schema(const char *name, bool get_old)
170227
{
171228
char *schema_name = NULL;
172229
char *current = NULL;
173-
bool free_name = false;
174230

175231
if(get_old)
176232
current = _mcopy_string(NULL, (char *)GetConfigOption("search_path", true, false));
@@ -180,11 +236,9 @@ char *set_schema(const char *name, bool get_old)
180236
}
181237
else
182238
{
183-
schema_name = _mcopy_string(NULL, (char *)GetConfigOption("schedule.schema", true, false));
184-
free_name = true;
239+
schema_name = get_scheduler_schema_name();
185240
}
186241
SetConfigOption("search_path", schema_name, PGC_USERSET, PGC_S_SESSION);
187-
if(free_name) pfree(schema_name);
188242

189243
return current;
190244
}

src/pgpro_scheduler.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,5 +41,6 @@ TimestampTz get_timestamp_from_string(char *str);
4141
TimestampTz _round_timestamp_to_minute(TimestampTz ts);
4242
bool is_scheduler_enabled(void);
4343
char *set_schema(const char *name, bool get_old);
44+
char *get_scheduler_schema_name(void);
4445

4546
#endif

0 commit comments

Comments
 (0)