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 */
3151List * res_id = NIL ;
3252int res_id_index = 0 ;
@@ -281,7 +301,7 @@ PG_FUNCTION_INFO_V1(dblink_get_pkey);
281301Datum
282302dblink_get_pkey (PG_FUNCTION_ARGS )
283303{
284- char * relname ;
304+ text * relname_text ;
285305Oid relid ;
286306char * * result ;
287307text * result_text ;
@@ -294,15 +314,14 @@ dblink_get_pkey(PG_FUNCTION_ARGS)
294314
295315if (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 );
303323if (!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
428447dblink_build_sql_insert (PG_FUNCTION_ARGS )
429448{
430449Oid relid ;
431- char * relname ;
450+ text * relname_text ;
432451int16 * pkattnums ;
433452int16 pknumatts ;
434453char * * src_pkattvals ;
@@ -446,15 +465,14 @@ dblink_build_sql_insert(PG_FUNCTION_ARGS)
446465char * sql ;
447466text * 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 );
455474if (!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
459477pkattnums = (int16 * )PG_GETARG_POINTER (1 );
460478pknumatts = PG_GETARG_INT16 (2 );
@@ -554,7 +572,7 @@ Datum
554572dblink_build_sql_delete (PG_FUNCTION_ARGS )
555573{
556574Oid relid ;
557- char * relname ;
575+ text * relname_text ;
558576int16 * pkattnums ;
559577int16 pknumatts ;
560578char * * tgt_pkattvals ;
@@ -567,15 +585,14 @@ dblink_build_sql_delete(PG_FUNCTION_ARGS)
567585char * sql ;
568586text * 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 );
576594if (!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
580597pkattnums = (int16 * )PG_GETARG_POINTER (1 );
581598pknumatts = PG_GETARG_INT16 (2 );
@@ -653,7 +670,7 @@ Datum
653670dblink_build_sql_update (PG_FUNCTION_ARGS )
654671{
655672Oid relid ;
656- char * relname ;
673+ text * relname_text ;
657674int16 * pkattnums ;
658675int16 pknumatts ;
659676char * * src_pkattvals ;
@@ -671,15 +688,14 @@ dblink_build_sql_update(PG_FUNCTION_ARGS)
671688char * sql ;
672689text * 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 );
680697if (!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
684700pkattnums = (int16 * )PG_GETARG_POINTER (1 );
685701pknumatts = 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 *
845861init_dblink_results (MemoryContext fn_mcxt )
846862{
847863MemoryContext 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 *
870886init_dblink_array_results (MemoryContext fn_mcxt )
871887{
872888MemoryContext 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 * *
896912get_pkey_attnames (Oid relid ,int16 * numatts )
897913{
898914Relation 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 *
965981get_strtok (char * fldtext ,char * fldsep ,int fldnum )
966982{
967983int j = 0 ;
@@ -988,7 +1004,7 @@ get_strtok(char *fldtext, char *fldsep, int fldnum)
9881004return pstrdup (result );
9891005}
9901006
991- char *
1007+ static char *
9921008get_sql_insert (Oid relid ,int16 * pkattnums ,int16 pknumatts ,char * * src_pkattvals ,char * * tgt_pkattvals )
9931009{
9941010Relation rel ;
@@ -1059,7 +1075,7 @@ get_sql_insert(Oid relid, int16 *pkattnums, int16 pknumatts, char **src_pkattval
10591075return (sql );
10601076}
10611077
1062- char *
1078+ static char *
10631079get_sql_delete (Oid relid ,int16 * pkattnums ,int16 pknumatts ,char * * tgt_pkattvals )
10641080{
10651081Relation rel ;
@@ -1112,7 +1128,7 @@ get_sql_delete(Oid relid, int16 *pkattnums, int16 pknumatts, char **tgt_pkattval
11121128return (sql );
11131129}
11141130
1115- char *
1131+ static char *
11161132get_sql_update (Oid relid ,int16 * pkattnums ,int16 pknumatts ,char * * src_pkattvals ,char * * tgt_pkattvals )
11171133{
11181134Relation rel ;
@@ -1235,7 +1251,7 @@ quote_ident_cstr(char *rawstr)
12351251return result ;
12361252}
12371253
1238- int16
1254+ static int16
12391255get_attnum_pk_pos (int16 * pkattnums ,int16 pknumatts ,int16 key )
12401256{
12411257int i ;
@@ -1251,7 +1267,7 @@ get_attnum_pk_pos(int16 *pkattnums, int16 pknumatts, int16 key)
12511267return -1 ;
12521268}
12531269
1254- HeapTuple
1270+ static HeapTuple
12551271get_tuple_of_interest (Oid relid ,int16 * pkattnums ,int16 pknumatts ,char * * src_pkattvals )
12561272{
12571273Relation rel ;
@@ -1340,17 +1356,24 @@ get_tuple_of_interest(Oid relid, int16 *pkattnums, int16 pknumatts, char **src_p
13401356return 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 )));
13541377rel = relation_openr (relname ,AccessShareLock );
13551378relid = RelationGetRelid (rel );
13561379relation_close (rel ,AccessShareLock );
@@ -1359,7 +1382,7 @@ get_relid_from_relname(char *relname)
13591382return relid ;
13601383}
13611384
1362- dblink_results *
1385+ static dblink_results *
13631386get_res_ptr (int32 res_id_index )
13641387{
13651388List * 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
13891412append_res_ptr (dblink_results * results )
13901413{
13911414res_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
13991422remove_res_ptr (dblink_results * results )
14001423{
14011424res_id = lremove (results ,res_id );
@@ -1404,4 +1427,3 @@ remove_res_ptr(dblink_results *results)
14041427res_id_index = 0 ;
14051428}
14061429
1407-