8
8
* Darko Prenosil <Darko.Prenosil@finteh.hr>
9
9
* Shridhar Daithankar <shridhar_daithankar@persistent.co.in>
10
10
*
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 $
12
12
* Copyright (c) 2001-2008, PostgreSQL Global Development Group
13
13
* ALL RIGHTS RESERVED;
14
14
*
@@ -94,6 +94,7 @@ static HeapTuple get_tuple_of_interest(Oid relid, int2vector *pkattnums, int16 p
94
94
static Oid get_relid_from_relname (text * relname_text );
95
95
static char * generate_relation_name (Oid relid );
96
96
static 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 );
97
98
98
99
/* Global */
99
100
static remoteConn * pconn = NULL ;
@@ -125,34 +126,20 @@ typedef struct remoteConnHashEnt
125
126
} \
126
127
} while (0)
127
128
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_ ) \
137
130
do { \
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; \
145
135
} while (0)
146
136
147
- #define DBLINK_RES_ERROR_AS_NOTICE (p2 ) \
137
+ #define DBLINK_RES_INTERNALERROR (p2 ) \
148
138
do { \
149
139
msg = pstrdup(PQerrorMessage(conn)); \
150
140
if (res) \
151
141
PQclear(res); \
152
- ereport(NOTICE, \
153
- (errcode(ERRCODE_SYNTAX_ERROR), \
154
- errmsg("%s", p2), \
155
- errdetail("%s", msg))); \
142
+ elog(ERROR, "%s: %s", p2, msg); \
156
143
} while (0)
157
144
158
145
#define DBLINK_CONN_NOT_AVAIL \
@@ -396,13 +383,8 @@ dblink_open(PG_FUNCTION_ARGS)
396
383
res = PQexec (conn ,buf .data );
397
384
if (!res || PQresultStatus (res )!= PGRES_COMMAND_OK )
398
385
{
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" ));
406
388
}
407
389
408
390
PQclear (res );
@@ -470,13 +452,8 @@ dblink_close(PG_FUNCTION_ARGS)
470
452
res = PQexec (conn ,buf .data );
471
453
if (!res || PQresultStatus (res )!= PGRES_COMMAND_OK )
472
454
{
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" ));
480
457
}
481
458
482
459
PQclear (res );
@@ -513,7 +490,6 @@ dblink_fetch(PG_FUNCTION_ARGS)
513
490
int call_cntr ;
514
491
int max_calls ;
515
492
AttInMetadata * attinmeta ;
516
- char * msg ;
517
493
PGresult * res = NULL ;
518
494
MemoryContext oldcontext ;
519
495
char * conname = NULL ;
@@ -590,13 +566,8 @@ dblink_fetch(PG_FUNCTION_ARGS)
590
566
(PQresultStatus (res )!= PGRES_COMMAND_OK &&
591
567
PQresultStatus (res )!= PGRES_TUPLES_OK ))
592
568
{
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 );
600
571
}
601
572
else if (PQresultStatus (res )== PGRES_COMMAND_OK )
602
573
{
@@ -846,15 +817,10 @@ dblink_record_internal(FunctionCallInfo fcinfo, bool is_async, bool do_get)
846
817
(PQresultStatus (res )!= PGRES_COMMAND_OK &&
847
818
PQresultStatus (res )!= PGRES_TUPLES_OK ))
848
819
{
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 );
858
824
}
859
825
860
826
if (PQresultStatus (res )== PGRES_COMMAND_OK )
@@ -1180,10 +1146,7 @@ dblink_exec(PG_FUNCTION_ARGS)
1180
1146
(PQresultStatus (res )!= PGRES_COMMAND_OK &&
1181
1147
PQresultStatus (res )!= PGRES_TUPLES_OK ))
1182
1148
{
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 );
1187
1150
1188
1151
/* need a tuple descriptor representing one TEXT column */
1189
1152
tupdesc = CreateTemplateTupleDesc (1 , false);
@@ -1195,7 +1158,6 @@ dblink_exec(PG_FUNCTION_ARGS)
1195
1158
* result tuple
1196
1159
*/
1197
1160
sql_cmd_status = cstring_to_text ("ERROR" );
1198
-
1199
1161
}
1200
1162
else if (PQresultStatus (res )== PGRES_COMMAND_OK )
1201
1163
{
@@ -2288,3 +2250,54 @@ dblink_security_check(PGconn *conn, remoteConn *rconn)
2288
2250
}
2289
2251
}
2290
2252
}
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
+ }