88 * Darko Prenosil <Darko.Prenosil@finteh.hr>
99 * Shridhar Daithankar <shridhar_daithankar@persistent.co.in>
1010 *
11- * $PostgreSQL: pgsql/contrib/dblink/dblink.c,v 1.73 2008/04/04 17:02:56 momjian Exp $
11+ * $PostgreSQL: pgsql/contrib/dblink/dblink.c,v 1.74 2008/07/03 03:56:57 joe Exp $
1212 * Copyright (c) 2001-2008, PostgreSQL Global Development Group
1313 * ALL RIGHTS RESERVED;
1414 *
@@ -94,6 +94,7 @@ static HeapTuple get_tuple_of_interest(Oid relid, int2vector *pkattnums, int16 p
9494static Oid get_relid_from_relname (text * relname_text );
9595static char * generate_relation_name (Oid relid );
9696static void dblink_security_check (PGconn * conn ,remoteConn * rconn );
97+ static void dblink_res_error (const char * conname ,PGresult * res ,const char * dblink_context_msg ,bool fail );
9798
9899/* Global */
99100static remoteConn * pconn = NULL ;
@@ -125,34 +126,20 @@ typedef struct remoteConnHashEnt
125126} \
126127} while (0)
127128
128- #define DBLINK_RES_INTERNALERROR (p2 ) \
129- do { \
130- msg = pstrdup(PQerrorMessage(conn)); \
131- if (res) \
132- PQclear(res); \
133- elog(ERROR, "%s: %s", p2, msg); \
134- } while (0)
135-
136- #define DBLINK_RES_ERROR (p2 ) \
129+ #define xpstrdup (var_c ,var_ ) \
137130do { \
138- msg = pstrdup(PQerrorMessage(conn)); \
139- if (res) \
140- PQclear(res); \
141- ereport(ERROR, \
142- (errcode(ERRCODE_SYNTAX_ERROR), \
143- errmsg("%s", p2), \
144- errdetail("%s", msg))); \
131+ if (var_ != NULL) \
132+ var_c = pstrdup(var_); \
133+ else \
134+ var_c = NULL; \
145135} while (0)
146136
147- #define DBLINK_RES_ERROR_AS_NOTICE (p2 ) \
137+ #define DBLINK_RES_INTERNALERROR (p2 ) \
148138do { \
149139msg = pstrdup(PQerrorMessage(conn)); \
150140if (res) \
151141PQclear(res); \
152- ereport(NOTICE, \
153- (errcode(ERRCODE_SYNTAX_ERROR), \
154- errmsg("%s", p2), \
155- errdetail("%s", msg))); \
142+ elog(ERROR, "%s: %s", p2, msg); \
156143} while (0)
157144
158145#define DBLINK_CONN_NOT_AVAIL \
@@ -396,13 +383,8 @@ dblink_open(PG_FUNCTION_ARGS)
396383res = PQexec (conn ,buf .data );
397384if (!res || PQresultStatus (res )!= PGRES_COMMAND_OK )
398385{
399- if (fail )
400- DBLINK_RES_ERROR ("sql error" );
401- else
402- {
403- DBLINK_RES_ERROR_AS_NOTICE ("sql error" );
404- PG_RETURN_TEXT_P (cstring_to_text ("ERROR" ));
405- }
386+ dblink_res_error (conname ,res ,"could not open cursor" ,fail );
387+ PG_RETURN_TEXT_P (cstring_to_text ("ERROR" ));
406388}
407389
408390PQclear (res );
@@ -470,13 +452,8 @@ dblink_close(PG_FUNCTION_ARGS)
470452res = PQexec (conn ,buf .data );
471453if (!res || PQresultStatus (res )!= PGRES_COMMAND_OK )
472454{
473- if (fail )
474- DBLINK_RES_ERROR ("sql error" );
475- else
476- {
477- DBLINK_RES_ERROR_AS_NOTICE ("sql error" );
478- PG_RETURN_TEXT_P (cstring_to_text ("ERROR" ));
479- }
455+ dblink_res_error (conname ,res ,"could not close cursor" ,fail );
456+ PG_RETURN_TEXT_P (cstring_to_text ("ERROR" ));
480457}
481458
482459PQclear (res );
@@ -513,7 +490,6 @@ dblink_fetch(PG_FUNCTION_ARGS)
513490int call_cntr ;
514491int max_calls ;
515492AttInMetadata * attinmeta ;
516- char * msg ;
517493PGresult * res = NULL ;
518494MemoryContext oldcontext ;
519495char * conname = NULL ;
@@ -590,13 +566,8 @@ dblink_fetch(PG_FUNCTION_ARGS)
590566(PQresultStatus (res )!= PGRES_COMMAND_OK &&
591567PQresultStatus (res )!= PGRES_TUPLES_OK ))
592568{
593- if (fail )
594- DBLINK_RES_ERROR ("sql error" );
595- else
596- {
597- DBLINK_RES_ERROR_AS_NOTICE ("sql error" );
598- SRF_RETURN_DONE (funcctx );
599- }
569+ dblink_res_error (conname ,res ,"could not fetch from cursor" ,fail );
570+ SRF_RETURN_DONE (funcctx );
600571}
601572else if (PQresultStatus (res )== PGRES_COMMAND_OK )
602573{
@@ -846,15 +817,10 @@ dblink_record_internal(FunctionCallInfo fcinfo, bool is_async, bool do_get)
846817(PQresultStatus (res )!= PGRES_COMMAND_OK &&
847818PQresultStatus (res )!= PGRES_TUPLES_OK ))
848819{
849- if (fail )
850- DBLINK_RES_ERROR ("sql error" );
851- else
852- {
853- DBLINK_RES_ERROR_AS_NOTICE ("sql error" );
854- if (freeconn )
855- PQfinish (conn );
856- SRF_RETURN_DONE (funcctx );
857- }
820+ dblink_res_error (conname ,res ,"could not execute query" ,fail );
821+ if (freeconn )
822+ PQfinish (conn );
823+ SRF_RETURN_DONE (funcctx );
858824}
859825
860826if (PQresultStatus (res )== PGRES_COMMAND_OK )
@@ -1180,10 +1146,7 @@ dblink_exec(PG_FUNCTION_ARGS)
11801146(PQresultStatus (res )!= PGRES_COMMAND_OK &&
11811147PQresultStatus (res )!= PGRES_TUPLES_OK ))
11821148{
1183- if (fail )
1184- DBLINK_RES_ERROR ("sql error" );
1185- else
1186- DBLINK_RES_ERROR_AS_NOTICE ("sql error" );
1149+ dblink_res_error (conname ,res ,"could not execute command" ,fail );
11871150
11881151/* need a tuple descriptor representing one TEXT column */
11891152tupdesc = CreateTemplateTupleDesc (1 , false);
@@ -1195,7 +1158,6 @@ dblink_exec(PG_FUNCTION_ARGS)
11951158 * result tuple
11961159 */
11971160sql_cmd_status = cstring_to_text ("ERROR" );
1198-
11991161}
12001162else if (PQresultStatus (res )== PGRES_COMMAND_OK )
12011163{
@@ -2288,3 +2250,54 @@ dblink_security_check(PGconn *conn, remoteConn *rconn)
22882250}
22892251}
22902252}
2253+
2254+ static void
2255+ dblink_res_error (const char * conname ,PGresult * res ,const char * dblink_context_msg ,bool fail )
2256+ {
2257+ int level ;
2258+ char * pg_diag_sqlstate = PQresultErrorField (res ,PG_DIAG_SQLSTATE );
2259+ char * pg_diag_message_primary = PQresultErrorField (res ,PG_DIAG_MESSAGE_PRIMARY );
2260+ char * pg_diag_message_detail = PQresultErrorField (res ,PG_DIAG_MESSAGE_DETAIL );
2261+ char * pg_diag_message_hint = PQresultErrorField (res ,PG_DIAG_MESSAGE_HINT );
2262+ char * pg_diag_context = PQresultErrorField (res ,PG_DIAG_CONTEXT );
2263+ int sqlstate ;
2264+ char * message_primary ;
2265+ char * message_detail ;
2266+ char * message_hint ;
2267+ char * message_context ;
2268+ const char * dblink_context_conname = "unnamed" ;
2269+
2270+ if (fail )
2271+ level = ERROR ;
2272+ else
2273+ level = NOTICE ;
2274+
2275+ if (pg_diag_sqlstate )
2276+ sqlstate = MAKE_SQLSTATE (pg_diag_sqlstate [0 ],
2277+ pg_diag_sqlstate [1 ],
2278+ pg_diag_sqlstate [2 ],
2279+ pg_diag_sqlstate [3 ],
2280+ pg_diag_sqlstate [4 ]);
2281+ else
2282+ sqlstate = ERRCODE_CONNECTION_FAILURE ;
2283+
2284+ xpstrdup (message_primary ,pg_diag_message_primary );
2285+ xpstrdup (message_detail ,pg_diag_message_detail );
2286+ xpstrdup (message_hint ,pg_diag_message_hint );
2287+ xpstrdup (message_context ,pg_diag_context );
2288+
2289+ if (res )
2290+ PQclear (res );
2291+
2292+ if (conname )
2293+ dblink_context_conname = conname ;
2294+
2295+ ereport (level ,
2296+ (errcode (sqlstate ),
2297+ message_primary ?errmsg ("%s" ,message_primary ) :errmsg ("unknown error" ),
2298+ message_detail ?errdetail ("%s" ,message_detail ) :0 ,
2299+ message_hint ?errhint ("%s" ,message_hint ) :0 ,
2300+ message_context ?errcontext ("%s" ,message_context ) :0 ,
2301+ errcontext ("Error occurred on dblink connection named \"%s\": %s." ,
2302+ dblink_context_conname ,dblink_context_msg )));
2303+ }