mirror of
https://github.com/postgres/postgres.git
synced 2025-07-08 11:42:09 +03:00
Be more consistent about reporting SPI errors in the various PLs.
Create a shared function to convert a SPI error code into a string (replacing near-duplicate code in several PLs), and use it anywhere that a SPI function call error is reported.
This commit is contained in:
@ -9,10 +9,9 @@
|
||||
|
||||
#include "spi_internal.h"
|
||||
|
||||
static char* plperl_spi_status_string(int);
|
||||
|
||||
static HV* plperl_spi_execute_fetch_result(SPITupleTable*, int, int );
|
||||
|
||||
|
||||
int
|
||||
spi_DEBUG(void)
|
||||
{
|
||||
@ -93,93 +92,35 @@ plperl_hash_from_tuple(HeapTuple tuple, TupleDesc tupdesc)
|
||||
static HV*
|
||||
plperl_spi_execute_fetch_result(SPITupleTable *tuptable, int processed, int status)
|
||||
{
|
||||
|
||||
HV *result;
|
||||
AV *rows;
|
||||
int i;
|
||||
|
||||
result = newHV();
|
||||
rows = newAV();
|
||||
|
||||
if (status == SPI_OK_UTILITY)
|
||||
hv_store(result, "status", strlen("status"),
|
||||
newSVpv((char*)SPI_result_code_string(status),0), 0);
|
||||
hv_store(result, "processed", strlen("processed"),
|
||||
newSViv(processed), 0);
|
||||
|
||||
if (status == SPI_OK_SELECT)
|
||||
{
|
||||
hv_store(result, "status", strlen("status"), newSVpv("SPI_OK_UTILITY",0), 0);
|
||||
hv_store(result, "processed", strlen("processed"), newSViv(processed), 0);
|
||||
}
|
||||
else if (status != SPI_OK_SELECT)
|
||||
{
|
||||
hv_store(result, "status", strlen("status"), newSVpv((char*)plperl_spi_status_string(status),0), 0);
|
||||
hv_store(result, "processed", strlen("processed"), newSViv(processed), 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
hv_store(result, "status", strlen("status"), newSVpv((char*)plperl_spi_status_string(status),0), 0);
|
||||
hv_store(result, "processed", strlen("processed"), newSViv(processed), 0);
|
||||
if (processed)
|
||||
{
|
||||
AV *rows;
|
||||
HV *row;
|
||||
int i;
|
||||
|
||||
rows = newAV();
|
||||
for (i = 0; i < processed; i++)
|
||||
{
|
||||
row = plperl_hash_from_tuple(tuptable->vals[i], tuptable->tupdesc);
|
||||
av_store(rows, i, newRV_noinc((SV*)row));
|
||||
av_store(rows, i, newRV_noinc((SV*)row));
|
||||
}
|
||||
hv_store(result, "rows", strlen("rows"), newRV_noinc((SV*)rows), 0);
|
||||
SPI_freetuptable(tuptable);
|
||||
hv_store(result, "rows", strlen("rows"),
|
||||
newRV_noinc((SV*)rows), 0);
|
||||
}
|
||||
}
|
||||
|
||||
SPI_freetuptable(tuptable);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
static char*
|
||||
plperl_spi_status_string(int status)
|
||||
{
|
||||
switch(status){
|
||||
/*errors*/
|
||||
case SPI_ERROR_TYPUNKNOWN:
|
||||
return "SPI_ERROR_TYPUNKNOWN";
|
||||
case SPI_ERROR_NOOUTFUNC:
|
||||
return "SPI_ERROR_NOOUTFUNC";
|
||||
case SPI_ERROR_NOATTRIBUTE:
|
||||
return "SPI_ERROR_NOATTRIBUTE";
|
||||
case SPI_ERROR_TRANSACTION:
|
||||
return "SPI_ERROR_TRANSACTION";
|
||||
case SPI_ERROR_PARAM:
|
||||
return "SPI_ERROR_PARAM";
|
||||
case SPI_ERROR_ARGUMENT:
|
||||
return "SPI_ERROR_ARGUMENT";
|
||||
case SPI_ERROR_CURSOR:
|
||||
return "SPI_ERROR_CURSOR";
|
||||
case SPI_ERROR_UNCONNECTED:
|
||||
return "SPI_ERROR_UNCONNECTED";
|
||||
case SPI_ERROR_OPUNKNOWN:
|
||||
return "SPI_ERROR_OPUNKNOWN";
|
||||
case SPI_ERROR_COPY:
|
||||
return "SPI_ERROR_COPY";
|
||||
case SPI_ERROR_CONNECT:
|
||||
return "SPI_ERROR_CONNECT";
|
||||
/*ok*/
|
||||
case SPI_OK_CONNECT:
|
||||
return "SPI_OK_CONNECT";
|
||||
case SPI_OK_FINISH:
|
||||
return "SPI_OK_FINISH";
|
||||
case SPI_OK_FETCH:
|
||||
return "SPI_OK_FETCH";
|
||||
case SPI_OK_UTILITY:
|
||||
return "SPI_OK_UTILITY";
|
||||
case SPI_OK_SELECT:
|
||||
return "SPI_OK_SELECT";
|
||||
case SPI_OK_SELINTO:
|
||||
return "SPI_OK_SELINTO";
|
||||
case SPI_OK_INSERT:
|
||||
return "SPI_OK_INSERT";
|
||||
case SPI_OK_DELETE:
|
||||
return "SPI_OK_DELETE";
|
||||
case SPI_OK_UPDATE:
|
||||
return "SPI_OK_UPDATE";
|
||||
case SPI_OK_CURSOR:
|
||||
return "SPI_OK_CURSOR";
|
||||
}
|
||||
|
||||
return "Unknown or Invalid code";
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user