Skip to content

Commit d15b1e1

Browse files
committed
Update dblink to work with qualified relation names.
From Joe Conway.
1 parent 3212cf9 commit d15b1e1

File tree

4 files changed

+73
-71
lines changed

4 files changed

+73
-71
lines changed

contrib/dblink/README.dblink

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -65,17 +65,17 @@ Installation:
6565
- extracts and returns individual field results
6666
dblink_strtok(text,text,int) RETURNS text
6767
- extracts and returns individual token from delimited text
68-
dblink_get_pkey(name) RETURNS setof text
68+
dblink_get_pkey(text) RETURNS setof text
6969
- returns the field names of a relation's primary key fields
7070
dblink_last_oid(int) RETURNS oid
7171
- returns the last inserted oid
72-
dblink_build_sql_insert(name,int2vector,int2,_text,_text) RETURNS text
72+
dblink_build_sql_insert(text,int2vector,int2,_text,_text) RETURNS text
7373
- builds an insert statement using a local tuple, replacing the
7474
selection key field values with alternate supplied values
75-
dblink_build_sql_delete(name,int2vector,int2,_text) RETURNS text
75+
dblink_build_sql_delete(text,int2vector,int2,_text) RETURNS text
7676
- builds a delete statement using supplied values for selection
7777
key field values
78-
dblink_build_sql_update(name,int2vector,int2,_text,_text) RETURNS text
78+
dblink_build_sql_update(text,int2vector,int2,_text,_text) RETURNS text
7979
- builds an update statement using a local tuple, replacing the
8080
selection key field values with alternate supplied values
8181
dblink_current_query() RETURNS text
@@ -206,7 +206,7 @@ dblink_get_pkey -- returns the field names of a relation's primary
206206

207207
Synopsis
208208

209-
dblink_get_pkey(name relname) RETURNS setof text
209+
dblink_get_pkey(text relname) RETURNS setof text
210210

211211
Inputs
212212

@@ -278,16 +278,16 @@ dblink_build_sql_update -- builds an update statement using a local
278278

279279
Synopsis
280280

281-
dblink_build_sql_insert(name relname
281+
dblink_build_sql_insert(text relname
282282
,int2vector primary_key_attnums
283283
,int2 num_primary_key_atts
284284
,_text src_pk_att_vals_array
285285
,_text tgt_pk_att_vals_array) RETURNS text
286-
dblink_build_sql_delete(name relname
286+
dblink_build_sql_delete(text relname
287287
,int2vector primary_key_attnums
288288
,int2 num_primary_key_atts
289289
,_text tgt_pk_att_vals_array) RETURNS text
290-
dblink_build_sql_update(name relname
290+
dblink_build_sql_update(text relname
291291
,int2vector primary_key_attnums
292292
,int2 num_primary_key_atts
293293
,_text src_pk_att_vals_array

contrib/dblink/dblink.c

Lines changed: 61 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,26 @@
2727

2828
#include "dblink.h"
2929

30+
31+
/*
32+
* Internal declarations
33+
*/
34+
static dblink_results *init_dblink_results(MemoryContext fn_mcxt);
35+
static dblink_array_results *init_dblink_array_results(MemoryContext fn_mcxt);
36+
static char **get_pkey_attnames(Oid relid, int16 *numatts);
37+
static char *get_strtok(char *fldtext, char *fldsep, int fldnum);
38+
static char *get_sql_insert(Oid relid, int16 *pkattnums, int16 pknumatts, char **src_pkattvals, char **tgt_pkattvals);
39+
static char *get_sql_delete(Oid relid, int16 *pkattnums, int16 pknumatts, char **tgt_pkattvals);
40+
static char *get_sql_update(Oid relid, int16 *pkattnums, int16 pknumatts, char **src_pkattvals, char **tgt_pkattvals);
41+
static char *quote_literal_cstr(char *rawstr);
42+
static char *quote_ident_cstr(char *rawstr);
43+
static int16 get_attnum_pk_pos(int16 *pkattnums, int16 pknumatts, int16 key);
44+
static HeapTuple get_tuple_of_interest(Oid relid, int16 *pkattnums, int16 pknumatts, char **src_pkattvals);
45+
static Oid get_relid_from_relname(text *relname_text);
46+
static dblink_results *get_res_ptr(int32 res_id_index);
47+
static void append_res_ptr(dblink_results *results);
48+
static void remove_res_ptr(dblink_results *results);
49+
3050
/* Global */
3151
List *res_id = NIL;
3252
int res_id_index = 0;
@@ -281,7 +301,7 @@ PG_FUNCTION_INFO_V1(dblink_get_pkey);
281301
Datum
282302
dblink_get_pkey(PG_FUNCTION_ARGS)
283303
{
284-
char *relname;
304+
text *relname_text;
285305
Oid relid;
286306
char **result;
287307
text *result_text;
@@ -294,15 +314,14 @@ dblink_get_pkey(PG_FUNCTION_ARGS)
294314

295315
if (fcinfo->flinfo->fn_extra == NULL)
296316
{
297-
relname = NameStr(*PG_GETARG_NAME(0));
317+
relname_text = PG_GETARG_TEXT_P(0);
298318

299319
/*
300320
* Convert relname to rel OID.
301321
*/
302-
relid = get_relid_from_relname(relname);
322+
relid = get_relid_from_relname(relname_text);
303323
if (!OidIsValid(relid))
304-
elog(ERROR, "dblink_get_pkey: relation \"%s\" does not exist",
305-
relname);
324+
elog(ERROR, "dblink_get_pkey: relation does not exist");
306325

307326
/*
308327
* get an array of attnums.
@@ -428,7 +447,7 @@ Datum
428447
dblink_build_sql_insert(PG_FUNCTION_ARGS)
429448
{
430449
Oid relid;
431-
char *relname;
450+
text *relname_text;
432451
int16 *pkattnums;
433452
int16 pknumatts;
434453
char **src_pkattvals;
@@ -446,15 +465,14 @@ dblink_build_sql_insert(PG_FUNCTION_ARGS)
446465
char *sql;
447466
text *sql_text;
448467

449-
relname = NameStr(*PG_GETARG_NAME(0));
468+
relname_text = PG_GETARG_TEXT_P(0);
450469

451470
/*
452471
* Convert relname to rel OID.
453472
*/
454-
relid = get_relid_from_relname(relname);
473+
relid = get_relid_from_relname(relname_text);
455474
if (!OidIsValid(relid))
456-
elog(ERROR, "dblink_get_pkey: relation \"%s\" does not exist",
457-
relname);
475+
elog(ERROR, "dblink_build_sql_insert: relation does not exist");
458476

459477
pkattnums = (int16 *) PG_GETARG_POINTER(1);
460478
pknumatts = PG_GETARG_INT16(2);
@@ -554,7 +572,7 @@ Datum
554572
dblink_build_sql_delete(PG_FUNCTION_ARGS)
555573
{
556574
Oid relid;
557-
char *relname;
575+
text *relname_text;
558576
int16 *pkattnums;
559577
int16 pknumatts;
560578
char **tgt_pkattvals;
@@ -567,15 +585,14 @@ dblink_build_sql_delete(PG_FUNCTION_ARGS)
567585
char *sql;
568586
text *sql_text;
569587

570-
relname = NameStr(*PG_GETARG_NAME(0));
588+
relname_text = PG_GETARG_TEXT_P(0);
571589

572590
/*
573591
* Convert relname to rel OID.
574592
*/
575-
relid = get_relid_from_relname(relname);
593+
relid = get_relid_from_relname(relname_text);
576594
if (!OidIsValid(relid))
577-
elog(ERROR, "dblink_get_pkey: relation \"%s\" does not exist",
578-
relname);
595+
elog(ERROR, "dblink_build_sql_delete: relation does not exist");
579596

580597
pkattnums = (int16 *) PG_GETARG_POINTER(1);
581598
pknumatts = PG_GETARG_INT16(2);
@@ -653,7 +670,7 @@ Datum
653670
dblink_build_sql_update(PG_FUNCTION_ARGS)
654671
{
655672
Oid relid;
656-
char *relname;
673+
text *relname_text;
657674
int16 *pkattnums;
658675
int16 pknumatts;
659676
char **src_pkattvals;
@@ -671,15 +688,14 @@ dblink_build_sql_update(PG_FUNCTION_ARGS)
671688
char *sql;
672689
text *sql_text;
673690

674-
relname = NameStr(*PG_GETARG_NAME(0));
691+
relname_text = PG_GETARG_TEXT_P(0);
675692

676693
/*
677694
* Convert relname to rel OID.
678695
*/
679-
relid = get_relid_from_relname(relname);
696+
relid = get_relid_from_relname(relname_text);
680697
if (!OidIsValid(relid))
681-
elog(ERROR, "dblink_get_pkey: relation \"%s\" does not exist",
682-
relname);
698+
elog(ERROR, "dblink_build_sql_update: relation does not exist");
683699

684700
pkattnums = (int16 *) PG_GETARG_POINTER(1);
685701
pknumatts = PG_GETARG_INT16(2);
@@ -841,7 +857,7 @@ dblink_replace_text(PG_FUNCTION_ARGS)
841857
* init_dblink_results
842858
* - create an empty dblink_results data structure
843859
*/
844-
dblink_results *
860+
static dblink_results *
845861
init_dblink_results(MemoryContext fn_mcxt)
846862
{
847863
MemoryContext oldcontext;
@@ -866,7 +882,7 @@ init_dblink_results(MemoryContext fn_mcxt)
866882
* init_dblink_array_results
867883
* - create an empty dblink_array_results data structure
868884
*/
869-
dblink_array_results *
885+
static dblink_array_results *
870886
init_dblink_array_results(MemoryContext fn_mcxt)
871887
{
872888
MemoryContext oldcontext;
@@ -892,7 +908,7 @@ init_dblink_array_results(MemoryContext fn_mcxt)
892908
* Get the primary key attnames for the given relation.
893909
* Return NULL, and set numatts = 0, if no primary key exists.
894910
*/
895-
char **
911+
static char **
896912
get_pkey_attnames(Oid relid, int16 *numatts)
897913
{
898914
Relation indexRelation;
@@ -961,7 +977,7 @@ get_pkey_attnames(Oid relid, int16 *numatts)
961977
* return ord item (0 based)
962978
* based on provided field separator
963979
*/
964-
char *
980+
static char *
965981
get_strtok(char *fldtext, char *fldsep, int fldnum)
966982
{
967983
int j = 0;
@@ -988,7 +1004,7 @@ get_strtok(char *fldtext, char *fldsep, int fldnum)
9881004
return pstrdup(result);
9891005
}
9901006

991-
char *
1007+
static char *
9921008
get_sql_insert(Oid relid, int16 *pkattnums, int16 pknumatts, char **src_pkattvals, char **tgt_pkattvals)
9931009
{
9941010
Relation rel;
@@ -1059,7 +1075,7 @@ get_sql_insert(Oid relid, int16 *pkattnums, int16 pknumatts, char **src_pkattval
10591075
return (sql);
10601076
}
10611077

1062-
char *
1078+
static char *
10631079
get_sql_delete(Oid relid, int16 *pkattnums, int16 pknumatts, char **tgt_pkattvals)
10641080
{
10651081
Relation rel;
@@ -1112,7 +1128,7 @@ get_sql_delete(Oid relid, int16 *pkattnums, int16 pknumatts, char **tgt_pkattval
11121128
return (sql);
11131129
}
11141130

1115-
char *
1131+
static char *
11161132
get_sql_update(Oid relid, int16 *pkattnums, int16 pknumatts, char **src_pkattvals, char **tgt_pkattvals)
11171133
{
11181134
Relation rel;
@@ -1235,7 +1251,7 @@ quote_ident_cstr(char *rawstr)
12351251
return result;
12361252
}
12371253

1238-
int16
1254+
static int16
12391255
get_attnum_pk_pos(int16 *pkattnums, int16 pknumatts, int16 key)
12401256
{
12411257
int i;
@@ -1251,7 +1267,7 @@ get_attnum_pk_pos(int16 *pkattnums, int16 pknumatts, int16 key)
12511267
return -1;
12521268
}
12531269

1254-
HeapTuple
1270+
static HeapTuple
12551271
get_tuple_of_interest(Oid relid, int16 *pkattnums, int16 pknumatts, char **src_pkattvals)
12561272
{
12571273
Relation rel;
@@ -1340,17 +1356,24 @@ get_tuple_of_interest(Oid relid, int16 *pkattnums, int16 pknumatts, char **src_p
13401356
return NULL;
13411357
}
13421358

1343-
Oid
1344-
get_relid_from_relname(char *relname)
1359+
static Oid
1360+
get_relid_from_relname(text *relname_text)
13451361
{
13461362
#ifdef NamespaceRelationName
1347-
Oid relid;
1363+
RangeVar *relvar;
1364+
Relation rel;
1365+
Oid relid;
13481366

1349-
relid = RelnameGetRelid(relname);
1367+
relvar = makeRangeVarFromNameList(textToQualifiedNameList(relname_text, "get_relid_from_relname"));
1368+
rel = heap_openrv(relvar, AccessShareLock);
1369+
relid = RelationGetRelid(rel);
1370+
relation_close(rel, AccessShareLock);
13501371
#else
1351-
Relation rel;
1352-
Oid relid;
1372+
char *relname;
1373+
Relation rel;
1374+
Oid relid;
13531375

1376+
relname = DatumGetCString(DirectFunctionCall1(textout, PointerGetDatum(relname_text)));
13541377
rel = relation_openr(relname, AccessShareLock);
13551378
relid = RelationGetRelid(rel);
13561379
relation_close(rel, AccessShareLock);
@@ -1359,7 +1382,7 @@ get_relid_from_relname(char *relname)
13591382
return relid;
13601383
}
13611384

1362-
dblink_results *
1385+
static dblink_results *
13631386
get_res_ptr(int32 res_id_index)
13641387
{
13651388
List *ptr;
@@ -1385,7 +1408,7 @@ get_res_ptr(int32 res_id_index)
13851408
/*
13861409
* Add node to global List res_id
13871410
*/
1388-
void
1411+
static void
13891412
append_res_ptr(dblink_results *results)
13901413
{
13911414
res_id = lappend(res_id, results);
@@ -1395,7 +1418,7 @@ append_res_ptr(dblink_results *results)
13951418
* Remove node from global List
13961419
* using res_id_index
13971420
*/
1398-
void
1421+
static void
13991422
remove_res_ptr(dblink_results *results)
14001423
{
14011424
res_id = lremove(results, res_id);
@@ -1404,4 +1427,3 @@ remove_res_ptr(dblink_results *results)
14041427
res_id_index = 0;
14051428
}
14061429

1407-

contrib/dblink/dblink.h

Lines changed: 0 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -120,26 +120,6 @@ extern Datum dblink_build_sql_update(PG_FUNCTION_ARGS);
120120
extern Datum dblink_current_query(PG_FUNCTION_ARGS);
121121
extern Datum dblink_replace_text(PG_FUNCTION_ARGS);
122122

123-
/*
124-
* Internal declarations
125-
*/
126-
dblink_results *init_dblink_results(MemoryContext fn_mcxt);
127-
dblink_array_results *init_dblink_array_results(MemoryContext fn_mcxt);
128-
char **get_pkey_attnames(Oid relid, int16 *numatts);
129-
char *get_strtok(char *fldtext, char *fldsep, int fldnum);
130-
char *getvalue(HeapTuple tuple, TupleDesc tupdesc, int fnumber);
131-
char *get_sql_insert(Oid relid, int16 *pkattnums, int16 pknumatts, char **src_pkattvals, char **tgt_pkattvals);
132-
char *get_sql_delete(Oid relid, int16 *pkattnums, int16 pknumatts, char **tgt_pkattvals);
133-
char *get_sql_update(Oid relid, int16 *pkattnums, int16 pknumatts, char **src_pkattvals, char **tgt_pkattvals);
134-
static char *quote_literal_cstr(char *rawstr);
135-
static char *quote_ident_cstr(char *rawstr);
136-
int16 get_attnum_pk_pos(int16 *pkattnums, int16 pknumatts, int16 key);
137-
HeapTuple get_tuple_of_interest(Oid relid, int16 *pkattnums, int16 pknumatts, char **src_pkattvals);
138-
Oid get_relid_from_relname(char *relname);
139-
dblink_results *get_res_ptr(int32 res_id_index);
140-
void append_res_ptr(dblink_results *results);
141-
void remove_res_ptr(dblink_results *results);
142-
143123
extern char *debug_query_string;
144124

145125
#endif /* DBLINK_H */

contrib/dblink/dblink.sql.in

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,23 +10,23 @@ CREATE OR REPLACE FUNCTION dblink_strtok (text,text,int) RETURNS text
1010
AS 'MODULE_PATHNAME','dblink_strtok' LANGUAGE 'c'
1111
WITH (iscachable, isstrict);
1212

13-
CREATE OR REPLACE FUNCTION dblink_get_pkey (name) RETURNS setof text
13+
CREATE OR REPLACE FUNCTION dblink_get_pkey (text) RETURNS setof text
1414
AS 'MODULE_PATHNAME','dblink_get_pkey' LANGUAGE 'c'
1515
WITH (isstrict);
1616

1717
CREATE OR REPLACE FUNCTION dblink_last_oid (int) RETURNS oid
1818
AS 'MODULE_PATHNAME','dblink_last_oid' LANGUAGE 'c'
1919
WITH (isstrict);
2020

21-
CREATE OR REPLACE FUNCTION dblink_build_sql_insert (name, int2vector, int2, _text, _text) RETURNS text
21+
CREATE OR REPLACE FUNCTION dblink_build_sql_insert (text, int2vector, int2, _text, _text) RETURNS text
2222
AS 'MODULE_PATHNAME','dblink_build_sql_insert' LANGUAGE 'c'
2323
WITH (isstrict);
2424

25-
CREATE OR REPLACE FUNCTION dblink_build_sql_delete (name, int2vector, int2, _text) RETURNS text
25+
CREATE OR REPLACE FUNCTION dblink_build_sql_delete (text, int2vector, int2, _text) RETURNS text
2626
AS 'MODULE_PATHNAME','dblink_build_sql_delete' LANGUAGE 'c'
2727
WITH (isstrict);
2828

29-
CREATE OR REPLACE FUNCTION dblink_build_sql_update (name, int2vector, int2, _text, _text) RETURNS text
29+
CREATE OR REPLACE FUNCTION dblink_build_sql_update (text, int2vector, int2, _text, _text) RETURNS text
3030
AS 'MODULE_PATHNAME','dblink_build_sql_update' LANGUAGE 'c'
3131
WITH (isstrict);
3232

0 commit comments

Comments
 (0)