Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commitd15b1e1

Browse files
committed
Update dblink to work with qualified relation names.
From Joe Conway.
1 parent3212cf9 commitd15b1e1

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+
staticdblink_results*init_dblink_results(MemoryContextfn_mcxt);
35+
staticdblink_array_results*init_dblink_array_results(MemoryContextfn_mcxt);
36+
staticchar**get_pkey_attnames(Oidrelid,int16*numatts);
37+
staticchar*get_strtok(char*fldtext,char*fldsep,intfldnum);
38+
staticchar*get_sql_insert(Oidrelid,int16*pkattnums,int16pknumatts,char**src_pkattvals,char**tgt_pkattvals);
39+
staticchar*get_sql_delete(Oidrelid,int16*pkattnums,int16pknumatts,char**tgt_pkattvals);
40+
staticchar*get_sql_update(Oidrelid,int16*pkattnums,int16pknumatts,char**src_pkattvals,char**tgt_pkattvals);
41+
staticchar*quote_literal_cstr(char*rawstr);
42+
staticchar*quote_ident_cstr(char*rawstr);
43+
staticint16get_attnum_pk_pos(int16*pkattnums,int16pknumatts,int16key);
44+
staticHeapTupleget_tuple_of_interest(Oidrelid,int16*pkattnums,int16pknumatts,char**src_pkattvals);
45+
staticOidget_relid_from_relname(text*relname_text);
46+
staticdblink_results*get_res_ptr(int32res_id_index);
47+
staticvoidappend_res_ptr(dblink_results*results);
48+
staticvoidremove_res_ptr(dblink_results*results);
49+
3050
/* Global */
3151
List*res_id=NIL;
3252
intres_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
Oidrelid;
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
Oidrelid;
431-
char*relname;
450+
text*relname_text;
432451
int16*pkattnums;
433452
int16pknumatts;
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
Oidrelid;
557-
char*relname;
575+
text*relname_text;
558576
int16*pkattnums;
559577
int16pknumatts;
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
Oidrelid;
656-
char*relname;
673+
text*relname_text;
657674
int16*pkattnums;
658675
int16pknumatts;
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+
staticdblink_results*
845861
init_dblink_results(MemoryContextfn_mcxt)
846862
{
847863
MemoryContextoldcontext;
@@ -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+
staticdblink_array_results*
870886
init_dblink_array_results(MemoryContextfn_mcxt)
871887
{
872888
MemoryContextoldcontext;
@@ -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+
staticchar**
896912
get_pkey_attnames(Oidrelid,int16*numatts)
897913
{
898914
RelationindexRelation;
@@ -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+
staticchar*
965981
get_strtok(char*fldtext,char*fldsep,intfldnum)
966982
{
967983
intj=0;
@@ -988,7 +1004,7 @@ get_strtok(char *fldtext, char *fldsep, int fldnum)
9881004
returnpstrdup(result);
9891005
}
9901006

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

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

1115-
char*
1131+
staticchar*
11161132
get_sql_update(Oidrelid,int16*pkattnums,int16pknumatts,char**src_pkattvals,char**tgt_pkattvals)
11171133
{
11181134
Relationrel;
@@ -1235,7 +1251,7 @@ quote_ident_cstr(char *rawstr)
12351251
returnresult;
12361252
}
12371253

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

1254-
HeapTuple
1270+
staticHeapTuple
12551271
get_tuple_of_interest(Oidrelid,int16*pkattnums,int16pknumatts,char**src_pkattvals)
12561272
{
12571273
Relationrel;
@@ -1340,17 +1356,24 @@ get_tuple_of_interest(Oid relid, int16 *pkattnums, int16 pknumatts, char **src_p
13401356
returnNULL;
13411357
}
13421358

1343-
Oid
1344-
get_relid_from_relname(char*relname)
1359+
staticOid
1360+
get_relid_from_relname(text*relname_text)
13451361
{
13461362
#ifdefNamespaceRelationName
1347-
Oidrelid;
1363+
RangeVar*relvar;
1364+
Relationrel;
1365+
Oidrelid;
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-
Relationrel;
1352-
Oidrelid;
1372+
char*relname;
1373+
Relationrel;
1374+
Oidrelid;
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
returnrelid;
13601383
}
13611384

1362-
dblink_results*
1385+
staticdblink_results*
13631386
get_res_ptr(int32res_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+
staticvoid
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+
staticvoid
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
externDatumdblink_current_query(PG_FUNCTION_ARGS);
121121
externDatumdblink_replace_text(PG_FUNCTION_ARGS);
122122

123-
/*
124-
* Internal declarations
125-
*/
126-
dblink_results*init_dblink_results(MemoryContextfn_mcxt);
127-
dblink_array_results*init_dblink_array_results(MemoryContextfn_mcxt);
128-
char**get_pkey_attnames(Oidrelid,int16*numatts);
129-
char*get_strtok(char*fldtext,char*fldsep,intfldnum);
130-
char*getvalue(HeapTupletuple,TupleDesctupdesc,intfnumber);
131-
char*get_sql_insert(Oidrelid,int16*pkattnums,int16pknumatts,char**src_pkattvals,char**tgt_pkattvals);
132-
char*get_sql_delete(Oidrelid,int16*pkattnums,int16pknumatts,char**tgt_pkattvals);
133-
char*get_sql_update(Oidrelid,int16*pkattnums,int16pknumatts,char**src_pkattvals,char**tgt_pkattvals);
134-
staticchar*quote_literal_cstr(char*rawstr);
135-
staticchar*quote_ident_cstr(char*rawstr);
136-
int16get_attnum_pk_pos(int16*pkattnums,int16pknumatts,int16key);
137-
HeapTupleget_tuple_of_interest(Oidrelid,int16*pkattnums,int16pknumatts,char**src_pkattvals);
138-
Oidget_relid_from_relname(char*relname);
139-
dblink_results*get_res_ptr(int32res_id_index);
140-
voidappend_res_ptr(dblink_results*results);
141-
voidremove_res_ptr(dblink_results*results);
142-
143123
externchar*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)

[8]ページ先頭

©2009-2025 Movatter.jp