-spelling, typos, indentation
This commit is contained in:
parent
979ec38ec4
commit
d4f9417d8c
@ -19,145 +19,154 @@
|
|||||||
PG_MODULE_MAGIC;
|
PG_MODULE_MAGIC;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
typedef struct {
|
typedef struct
|
||||||
|
{
|
||||||
Datum col1;
|
Datum col1;
|
||||||
Datum col2;
|
Datum col2;
|
||||||
} valuest;
|
} valuest;
|
||||||
|
|
||||||
void _PG_init(void);
|
void _PG_init (void);
|
||||||
void _PG_fini(void);
|
|
||||||
|
|
||||||
void _PG_init(void)
|
void _PG_fini (void);
|
||||||
|
|
||||||
|
void
|
||||||
|
_PG_init (void)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
PG_FUNCTION_INFO_V1(pg_spi_insert_int);
|
|
||||||
PG_FUNCTION_INFO_V1(pg_spi_select_from_x);
|
PG_FUNCTION_INFO_V1 (pg_spi_insert_int);
|
||||||
PG_FUNCTION_INFO_V1(pg_spi_select_pair_from_y);
|
PG_FUNCTION_INFO_V1 (pg_spi_select_from_x);
|
||||||
//PG_FUNCTION_INFO_V1(pg_spi_select_with_cond);
|
PG_FUNCTION_INFO_V1 (pg_spi_select_pair_from_y);
|
||||||
PG_FUNCTION_INFO_V1(pg_spi_update_y);
|
// PG_FUNCTION_INFO_V1(pg_spi_select_with_cond);
|
||||||
PG_FUNCTION_INFO_V1(pg_spi_prepare_example);
|
PG_FUNCTION_INFO_V1 (pg_spi_update_y);
|
||||||
PG_FUNCTION_INFO_V1(pg_spi_prepare_example_without_saveplan);
|
PG_FUNCTION_INFO_V1 (pg_spi_prepare_example);
|
||||||
PG_FUNCTION_INFO_V1(pg_spi_prepare_insert);
|
PG_FUNCTION_INFO_V1 (pg_spi_prepare_example_without_saveplan);
|
||||||
PG_FUNCTION_INFO_V1(pg_spi_prepare_insert_without_saveplan);
|
PG_FUNCTION_INFO_V1 (pg_spi_prepare_insert);
|
||||||
//PG_FUNCTION_INFO_V1(pg_spi_prepare_select_with_cond);
|
PG_FUNCTION_INFO_V1 (pg_spi_prepare_insert_without_saveplan);
|
||||||
PG_FUNCTION_INFO_V1(pg_spi_prepare_select_with_cond_without_saveplan);
|
// PG_FUNCTION_INFO_V1(pg_spi_prepare_select_with_cond);
|
||||||
PG_FUNCTION_INFO_V1(pg_spi_prepare_update);
|
PG_FUNCTION_INFO_V1 (pg_spi_prepare_select_with_cond_without_saveplan);
|
||||||
PG_FUNCTION_INFO_V1(pg_spi_get_dep_ref_fees);
|
PG_FUNCTION_INFO_V1 (pg_spi_prepare_update);
|
||||||
|
PG_FUNCTION_INFO_V1 (pg_spi_get_dep_ref_fees);
|
||||||
// SIMPLE SELECT
|
// SIMPLE SELECT
|
||||||
Datum
|
Datum
|
||||||
pg_spi_prepare_example(PG_FUNCTION_ARGS)
|
pg_spi_prepare_example (PG_FUNCTION_ARGS)
|
||||||
{
|
{
|
||||||
static SPIPlanPtr prepared_plan;
|
static SPIPlanPtr prepared_plan;
|
||||||
int ret;
|
int ret;
|
||||||
int64 result;
|
int64 result;
|
||||||
char * value;
|
char *value;
|
||||||
SPIPlanPtr new_plan;
|
SPIPlanPtr new_plan;
|
||||||
|
|
||||||
ret=SPI_connect();
|
ret = SPI_connect ();
|
||||||
if (ret != SPI_OK_CONNECT) {
|
if (ret != SPI_OK_CONNECT)
|
||||||
elog(ERROR, "DB connexion failed ! \n");
|
{
|
||||||
|
elog (ERROR, "DB connection failed ! \n");
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
if (prepared_plan == NULL)
|
if (prepared_plan == NULL)
|
||||||
{
|
{
|
||||||
new_plan = SPI_prepare("SELECT 1 FROM joseph_test.X", 0, NULL);
|
new_plan = SPI_prepare ("SELECT 1 FROM joseph_test.X", 0, NULL);
|
||||||
prepared_plan = SPI_saveplan(new_plan);
|
prepared_plan = SPI_saveplan (new_plan);
|
||||||
|
|
||||||
if (prepared_plan == NULL)
|
if (prepared_plan == NULL)
|
||||||
{
|
{
|
||||||
elog(ERROR, "FAIL TO SAVE !\n");
|
elog (ERROR, "FAIL TO SAVE !\n");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = SPI_execute_plan(prepared_plan, NULL, 0,false, 0);
|
ret = SPI_execute_plan (prepared_plan, NULL, 0,false, 0);
|
||||||
if (ret != SPI_OK_SELECT) {
|
if (ret != SPI_OK_SELECT)
|
||||||
elog(ERROR, "SELECT FAILED %d !\n", ret);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (SPI_tuptable != NULL && SPI_tuptable->vals != NULL && SPI_tuptable->tupdesc != NULL)
|
|
||||||
{
|
{
|
||||||
value = SPI_getvalue(SPI_tuptable->vals[0], SPI_tuptable->tupdesc, 1);
|
elog (ERROR, "SELECT FAILED %d !\n", ret);
|
||||||
result = atoi(value);
|
}
|
||||||
|
|
||||||
|
if (SPI_tuptable != NULL && SPI_tuptable->vals != NULL &&
|
||||||
|
SPI_tuptable->tupdesc != NULL)
|
||||||
|
{
|
||||||
|
value = SPI_getvalue (SPI_tuptable->vals[0], SPI_tuptable->tupdesc, 1);
|
||||||
|
result = atoi (value);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
elog(ERROR, "EMPTY TABLE !\n");
|
elog (ERROR, "EMPTY TABLE !\n");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
SPI_finish();
|
SPI_finish ();
|
||||||
PG_RETURN_INT64(result);
|
PG_RETURN_INT64 (result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Datum
|
Datum
|
||||||
pg_spi_prepare_example_without_saveplan(PG_FUNCTION_ARGS)
|
pg_spi_prepare_example_without_saveplan (PG_FUNCTION_ARGS)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
int64 result;
|
int64 result;
|
||||||
char * value;
|
char *value;
|
||||||
SPIPlanPtr new_plan;
|
SPIPlanPtr new_plan;
|
||||||
|
|
||||||
ret=SPI_connect();
|
ret = SPI_connect ();
|
||||||
if (ret != SPI_OK_CONNECT) {
|
if (ret != SPI_OK_CONNECT)
|
||||||
elog(ERROR, "DB connexion failed ! \n");
|
{
|
||||||
|
elog (ERROR, "DB connection failed ! \n");
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
new_plan = SPI_prepare("SELECT 1 FROM joseph_test.X", 0, NULL);
|
new_plan = SPI_prepare ("SELECT 1 FROM joseph_test.X", 0, NULL);
|
||||||
ret = SPI_execute_plan(new_plan, NULL, 0,false, 0);
|
ret = SPI_execute_plan (new_plan, NULL, 0,false, 0);
|
||||||
if (ret != SPI_OK_SELECT) {
|
if (ret != SPI_OK_SELECT)
|
||||||
elog(ERROR, "SELECT FAILED %d !\n", ret);
|
{
|
||||||
|
elog (ERROR, "SELECT FAILED %d !\n", ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (SPI_tuptable != NULL
|
if (SPI_tuptable != NULL
|
||||||
&& SPI_tuptable->vals != NULL
|
&& SPI_tuptable->vals != NULL
|
||||||
&& SPI_tuptable->tupdesc != NULL)
|
&& SPI_tuptable->tupdesc != NULL)
|
||||||
{
|
{
|
||||||
value = SPI_getvalue(SPI_tuptable->vals[0], SPI_tuptable->tupdesc, 1);
|
value = SPI_getvalue (SPI_tuptable->vals[0], SPI_tuptable->tupdesc, 1);
|
||||||
result = atoi(value);
|
result = atoi (value);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
elog(ERROR, "EMPTY TABLE !\n");
|
elog (ERROR, "EMPTY TABLE !\n");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
SPI_finish();
|
SPI_finish ();
|
||||||
PG_RETURN_INT64(result);// PG_RETURN_INT64(result);
|
PG_RETURN_INT64 (result);// PG_RETURN_INT64(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//SELECT 1 FROM X
|
// SELECT 1 FROM X
|
||||||
//V1
|
// V1
|
||||||
Datum
|
Datum
|
||||||
pg_spi_select_from_x(PG_FUNCTION_ARGS)
|
pg_spi_select_from_x (PG_FUNCTION_ARGS)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
char *query = "SELECT 1 FROM joseph_test.X";
|
char *query = "SELECT 1 FROM joseph_test.X";
|
||||||
uint64 proc;
|
uint64 proc;
|
||||||
ret = SPI_connect();
|
ret = SPI_connect ();
|
||||||
|
|
||||||
if (ret != SPI_OK_CONNECT)
|
if (ret != SPI_OK_CONNECT)
|
||||||
{
|
{
|
||||||
elog(ERROR, "SPI_connect failed");
|
elog (ERROR, "SPI_connect failed");
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = SPI_exec(query, 10);
|
ret = SPI_exec (query, 10);
|
||||||
proc = SPI_processed;
|
proc = SPI_processed;
|
||||||
if (ret != SPI_OK_SELECT)
|
if (ret != SPI_OK_SELECT)
|
||||||
{
|
{
|
||||||
elog(ERROR, "SPI_exec failed");
|
elog (ERROR, "SPI_exec failed");
|
||||||
}
|
}
|
||||||
|
|
||||||
SPI_finish();
|
SPI_finish ();
|
||||||
|
|
||||||
PG_RETURN_INT64(proc);
|
PG_RETURN_INT64 (proc);
|
||||||
}
|
}
|
||||||
|
|
||||||
//INSERT INTO X VALUES (1)
|
|
||||||
|
// INSERT INTO X VALUES (1)
|
||||||
Datum
|
Datum
|
||||||
pg_spi_insert_int(PG_FUNCTION_ARGS)
|
pg_spi_insert_int (PG_FUNCTION_ARGS)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
int nargs;
|
int nargs;
|
||||||
@ -165,30 +174,30 @@ pg_spi_insert_int(PG_FUNCTION_ARGS)
|
|||||||
Datum values[1];
|
Datum values[1];
|
||||||
char *query = "INSERT INTO joseph_test.X (a) VALUES ($1)";
|
char *query = "INSERT INTO joseph_test.X (a) VALUES ($1)";
|
||||||
|
|
||||||
ret = SPI_connect();
|
ret = SPI_connect ();
|
||||||
if (ret != SPI_OK_CONNECT)
|
if (ret != SPI_OK_CONNECT)
|
||||||
{
|
{
|
||||||
elog(ERROR, "SPI_connect failed");
|
elog (ERROR, "SPI_connect failed");
|
||||||
}
|
}
|
||||||
|
|
||||||
nargs = 1;
|
nargs = 1;
|
||||||
argtypes[0] = INT4OID;
|
argtypes[0] = INT4OID;
|
||||||
values[0] = Int32GetDatum(3);
|
values[0] = Int32GetDatum (3);
|
||||||
|
|
||||||
ret = SPI_execute_with_args(query, nargs, argtypes, values, NULL, false, 0);
|
ret = SPI_execute_with_args (query, nargs, argtypes, values, NULL, false, 0);
|
||||||
if (ret != SPI_OK_INSERT)
|
if (ret != SPI_OK_INSERT)
|
||||||
{
|
{
|
||||||
elog(ERROR, "SPI_execute_with_args failed");
|
elog (ERROR, "SPI_execute_with_args failed");
|
||||||
}
|
}
|
||||||
|
|
||||||
SPI_finish();
|
SPI_finish ();
|
||||||
|
|
||||||
PG_RETURN_VOID();
|
PG_RETURN_VOID ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Datum
|
Datum
|
||||||
pg_spi_prepare_insert(PG_FUNCTION_ARGS)
|
pg_spi_prepare_insert (PG_FUNCTION_ARGS)
|
||||||
{
|
{
|
||||||
static SPIPlanPtr prepared_plan = NULL;
|
static SPIPlanPtr prepared_plan = NULL;
|
||||||
int ret;
|
int ret;
|
||||||
@ -197,38 +206,41 @@ pg_spi_prepare_insert(PG_FUNCTION_ARGS)
|
|||||||
Datum values[1];
|
Datum values[1];
|
||||||
char *query = "INSERT INTO joseph_test.X (a) VALUES ($1)";
|
char *query = "INSERT INTO joseph_test.X (a) VALUES ($1)";
|
||||||
SPIPlanPtr new_plan;
|
SPIPlanPtr new_plan;
|
||||||
ret = SPI_connect();
|
ret = SPI_connect ();
|
||||||
if (ret != SPI_OK_CONNECT)
|
if (ret != SPI_OK_CONNECT)
|
||||||
{
|
{
|
||||||
elog(ERROR, "SPI_connect failed ! \n");
|
elog (ERROR, "SPI_connect failed ! \n");
|
||||||
}
|
}
|
||||||
if (prepared_plan == NULL) {
|
if (prepared_plan == NULL)
|
||||||
|
{
|
||||||
|
|
||||||
argtypes[0] = INT4OID;
|
argtypes[0] = INT4OID;
|
||||||
nargs = 1;
|
nargs = 1;
|
||||||
values[0] = Int32GetDatum(3);
|
values[0] = Int32GetDatum (3);
|
||||||
new_plan = SPI_prepare(query, nargs, argtypes);
|
new_plan = SPI_prepare (query, nargs, argtypes);
|
||||||
if (new_plan== NULL)
|
if (new_plan== NULL)
|
||||||
{
|
{
|
||||||
elog(ERROR, "SPI_prepare failed ! \n");
|
elog (ERROR, "SPI_prepare failed ! \n");
|
||||||
}
|
}
|
||||||
prepared_plan = SPI_saveplan(new_plan);
|
prepared_plan = SPI_saveplan (new_plan);
|
||||||
if (prepared_plan == NULL)
|
if (prepared_plan == NULL)
|
||||||
{
|
{
|
||||||
elog(ERROR, "SPI_saveplan failed ! \n");
|
elog (ERROR, "SPI_saveplan failed ! \n");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = SPI_execute_plan(prepared_plan, values, NULL, false, 0);
|
ret = SPI_execute_plan (prepared_plan, values, NULL, false, 0);
|
||||||
if (ret != SPI_OK_INSERT)
|
if (ret != SPI_OK_INSERT)
|
||||||
{
|
{
|
||||||
elog(ERROR, "SPI_execute_plan failed ! \n");
|
elog (ERROR, "SPI_execute_plan failed ! \n");
|
||||||
}
|
}
|
||||||
|
|
||||||
SPI_finish();
|
SPI_finish ();
|
||||||
|
|
||||||
PG_RETURN_VOID();
|
PG_RETURN_VOID ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Datum
|
Datum
|
||||||
pg_spi_prepare_insert_bytea(PG_FUNCTION_ARGS)
|
pg_spi_prepare_insert_bytea(PG_FUNCTION_ARGS)
|
||||||
@ -278,7 +290,7 @@ pg_spi_prepare_insert_bytea(PG_FUNCTION_ARGS)
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
Datum
|
Datum
|
||||||
pg_spi_prepare_insert_without_saveplan(PG_FUNCTION_ARGS)
|
pg_spi_prepare_insert_without_saveplan (PG_FUNCTION_ARGS)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
int nargs;
|
int nargs;
|
||||||
@ -286,38 +298,34 @@ pg_spi_prepare_insert_without_saveplan(PG_FUNCTION_ARGS)
|
|||||||
Datum values[1];
|
Datum values[1];
|
||||||
char *query = "INSERT INTO joseph_test.X (a) VALUES ($1)";
|
char *query = "INSERT INTO joseph_test.X (a) VALUES ($1)";
|
||||||
SPIPlanPtr new_plan;
|
SPIPlanPtr new_plan;
|
||||||
ret = SPI_connect();
|
ret = SPI_connect ();
|
||||||
if (ret != SPI_OK_CONNECT)
|
if (ret != SPI_OK_CONNECT)
|
||||||
{
|
{
|
||||||
elog(ERROR, "SPI_connect failed");
|
elog (ERROR, "SPI_connect failed");
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
argtypes[0] = INT4OID;
|
argtypes[0] = INT4OID;
|
||||||
nargs = 1;
|
nargs = 1;
|
||||||
values[0] = Int32GetDatum(3);
|
values[0] = Int32GetDatum (3);
|
||||||
new_plan = SPI_prepare(query, nargs, argtypes);
|
new_plan = SPI_prepare (query, nargs, argtypes);
|
||||||
if (new_plan== NULL)
|
if (new_plan== NULL)
|
||||||
{
|
{
|
||||||
elog(ERROR, "SPI_prepare failed");
|
elog (ERROR, "SPI_prepare failed");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = SPI_execute_plan(new_plan, values, NULL, false, 0);
|
ret = SPI_execute_plan (new_plan, values, NULL, false, 0);
|
||||||
if (ret != SPI_OK_INSERT)
|
if (ret != SPI_OK_INSERT)
|
||||||
{
|
{
|
||||||
elog(ERROR, "SPI_execute_plan failed");
|
elog (ERROR, "SPI_execute_plan failed");
|
||||||
}
|
}
|
||||||
|
|
||||||
SPI_finish();
|
SPI_finish ();
|
||||||
|
|
||||||
PG_RETURN_VOID();
|
PG_RETURN_VOID ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Datum
|
Datum
|
||||||
pg_spi_select_pair_from_y(PG_FUNCTION_ARGS)
|
pg_spi_select_pair_from_y(PG_FUNCTION_ARGS)
|
||||||
@ -349,7 +357,7 @@ pg_spi_select_pair_from_y(PG_FUNCTION_ARGS)
|
|||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
//SELECT X FROM Y WHERE Z=$1
|
// SELECT X FROM Y WHERE Z=$1
|
||||||
/*
|
/*
|
||||||
Datum
|
Datum
|
||||||
pg_spi_select_with_cond(PG_FUNCTION_ARGS)
|
pg_spi_select_with_cond(PG_FUNCTION_ARGS)
|
||||||
@ -443,7 +451,9 @@ Datum pg_spi_prepare_select_with_cond(PG_FUNCTION_ARGS) {
|
|||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
Datum pg_spi_prepare_select_with_cond_without_saveplan(PG_FUNCTION_ARGS) {
|
Datum
|
||||||
|
pg_spi_prepare_select_with_cond_without_saveplan (PG_FUNCTION_ARGS)
|
||||||
|
{
|
||||||
|
|
||||||
SPIPlanPtr new_plan;
|
SPIPlanPtr new_plan;
|
||||||
int ret;
|
int ret;
|
||||||
@ -454,54 +464,56 @@ Datum pg_spi_prepare_select_with_cond_without_saveplan(PG_FUNCTION_ARGS) {
|
|||||||
char *query = "SELECT col1 FROM joseph_test.Y WHERE col2 = $1";
|
char *query = "SELECT col1 FROM joseph_test.Y WHERE col2 = $1";
|
||||||
int result = 0;
|
int result = 0;
|
||||||
|
|
||||||
ret = SPI_connect();
|
ret = SPI_connect ();
|
||||||
if (ret != SPI_OK_CONNECT)
|
if (ret != SPI_OK_CONNECT)
|
||||||
elog(ERROR, "SPI_connect failed ! \n");
|
elog (ERROR, "SPI_connect failed ! \n");
|
||||||
|
|
||||||
{
|
{
|
||||||
|
|
||||||
argtypes[0] = INT4OID;
|
argtypes[0] = INT4OID;
|
||||||
nargs = 1;
|
nargs = 1;
|
||||||
values[0] = Int32GetDatum(2); //Value col2
|
values[0] = Int32GetDatum (2); // Value col2
|
||||||
|
|
||||||
new_plan = SPI_prepare(query, nargs, argtypes);
|
new_plan = SPI_prepare (query, nargs, argtypes);
|
||||||
if (new_plan == NULL)
|
if (new_plan == NULL)
|
||||||
elog(ERROR, "SPI_prepare failed ! \n");
|
elog (ERROR, "SPI_prepare failed ! \n");
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
ret = SPI_execute_plan(new_plan, values, NULL, false, 0);
|
ret = SPI_execute_plan (new_plan, values, NULL, false, 0);
|
||||||
|
|
||||||
if (ret != SPI_OK_SELECT) {
|
if (ret != SPI_OK_SELECT)
|
||||||
elog(ERROR, "SPI_execute_plan failed: %d \n", ret);
|
{
|
||||||
|
elog (ERROR, "SPI_execute_plan failed: %d \n", ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
proc = SPI_processed;
|
proc = SPI_processed;
|
||||||
|
|
||||||
if (proc > 0) {
|
if (proc > 0)
|
||||||
|
{
|
||||||
SPITupleTable *tuptable = SPI_tuptable;
|
SPITupleTable *tuptable = SPI_tuptable;
|
||||||
TupleDesc tupdesc = tuptable->tupdesc;
|
TupleDesc tupdesc = tuptable->tupdesc;
|
||||||
HeapTuple tuple;
|
HeapTuple tuple;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
for (i = 0; i < proc; i++) {
|
for (i = 0; i < proc; i++)
|
||||||
|
{
|
||||||
tuple = tuptable->vals[i];
|
tuple = tuptable->vals[i];
|
||||||
for (int j = 1; j <= tupdesc->natts; j++) {
|
for (int j = 1; j <= tupdesc->natts; j++)
|
||||||
char * value = SPI_getvalue(tuple, tupdesc, j);
|
{
|
||||||
result += atoi(value);
|
char *value = SPI_getvalue (tuple, tupdesc, j);
|
||||||
|
result += atoi (value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
SPI_finish();
|
SPI_finish ();
|
||||||
PG_RETURN_INT64(result);
|
PG_RETURN_INT64 (result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Datum
|
Datum
|
||||||
pg_spi_update_y(PG_FUNCTION_ARGS)
|
pg_spi_update_y (PG_FUNCTION_ARGS)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
int nargs;
|
int nargs;
|
||||||
@ -509,34 +521,30 @@ pg_spi_update_y(PG_FUNCTION_ARGS)
|
|||||||
Datum values[1];
|
Datum values[1];
|
||||||
char *query = "UPDATE joseph_test.Y SET col1 = 4 WHERE (col2 = $1)";
|
char *query = "UPDATE joseph_test.Y SET col1 = 4 WHERE (col2 = $1)";
|
||||||
|
|
||||||
ret = SPI_connect();
|
ret = SPI_connect ();
|
||||||
if (ret != SPI_OK_CONNECT)
|
if (ret != SPI_OK_CONNECT)
|
||||||
{
|
{
|
||||||
elog(ERROR, "SPI_connect failed ! \n");
|
elog (ERROR, "SPI_connect failed ! \n");
|
||||||
}
|
}
|
||||||
|
|
||||||
nargs = 1;
|
nargs = 1;
|
||||||
argtypes[0] = INT4OID;
|
argtypes[0] = INT4OID;
|
||||||
values[0] = Int32GetDatum(0);
|
values[0] = Int32GetDatum (0);
|
||||||
|
|
||||||
ret = SPI_execute_with_args(query, nargs, argtypes, values, NULL, false, 0);
|
ret = SPI_execute_with_args (query, nargs, argtypes, values, NULL, false, 0);
|
||||||
if (ret != SPI_OK_UPDATE)
|
if (ret != SPI_OK_UPDATE)
|
||||||
{
|
{
|
||||||
elog(ERROR, "SPI_execute_with_args failed ! \n");
|
elog (ERROR, "SPI_execute_with_args failed ! \n");
|
||||||
}
|
}
|
||||||
|
|
||||||
SPI_finish();
|
SPI_finish ();
|
||||||
|
|
||||||
PG_RETURN_VOID();
|
PG_RETURN_VOID ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Datum
|
Datum
|
||||||
pg_spi_prepare_update(PG_FUNCTION_ARGS)
|
pg_spi_prepare_update (PG_FUNCTION_ARGS)
|
||||||
{
|
{
|
||||||
static SPIPlanPtr prepared_plan = NULL;
|
static SPIPlanPtr prepared_plan = NULL;
|
||||||
SPIPlanPtr new_plan;
|
SPIPlanPtr new_plan;
|
||||||
@ -546,60 +554,63 @@ pg_spi_prepare_update(PG_FUNCTION_ARGS)
|
|||||||
Datum values[1];
|
Datum values[1];
|
||||||
char *query = "UPDATE joseph_test.Y SET col1 = 4 WHERE (col2 = $1)";
|
char *query = "UPDATE joseph_test.Y SET col1 = 4 WHERE (col2 = $1)";
|
||||||
|
|
||||||
ret = SPI_connect();
|
ret = SPI_connect ();
|
||||||
if (ret != SPI_OK_CONNECT)
|
if (ret != SPI_OK_CONNECT)
|
||||||
{
|
{
|
||||||
elog(ERROR, "SPI_connect failed ! \n");
|
elog (ERROR, "SPI_connect failed ! \n");
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( prepared_plan == NULL)
|
if (prepared_plan == NULL)
|
||||||
{
|
{
|
||||||
argtypes[0] = INT4OID;
|
argtypes[0] = INT4OID;
|
||||||
nargs = 1;
|
nargs = 1;
|
||||||
values[0] = Int32GetDatum(3);
|
values[0] = Int32GetDatum (3);
|
||||||
//PREPARE
|
// PREPARE
|
||||||
new_plan = SPI_prepare(query, nargs, argtypes);
|
new_plan = SPI_prepare (query, nargs, argtypes);
|
||||||
if (new_plan == NULL)
|
if (new_plan == NULL)
|
||||||
elog(ERROR, "SPI_prepare failed ! \n");
|
elog (ERROR, "SPI_prepare failed ! \n");
|
||||||
//SAVEPLAN
|
// SAVEPLAN
|
||||||
prepared_plan = SPI_saveplan(new_plan);
|
prepared_plan = SPI_saveplan (new_plan);
|
||||||
if(prepared_plan == NULL)
|
if (prepared_plan == NULL)
|
||||||
elog(ERROR, "SPI_saveplan failed ! \n");
|
elog (ERROR, "SPI_saveplan failed ! \n");
|
||||||
}
|
}
|
||||||
ret = SPI_execute_plan(prepared_plan, values, NULL, false, 0);
|
ret = SPI_execute_plan (prepared_plan, values, NULL, false, 0);
|
||||||
if (ret != SPI_OK_UPDATE)
|
if (ret != SPI_OK_UPDATE)
|
||||||
elog(ERROR, "SPI_execute_plan failed ! \n");
|
elog (ERROR, "SPI_execute_plan failed ! \n");
|
||||||
|
|
||||||
SPI_finish();
|
SPI_finish ();
|
||||||
PG_RETURN_VOID();
|
PG_RETURN_VOID ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Datum
|
Datum
|
||||||
pg_spi_prepare_update_without_saveplan(PG_FUNCTION_ARGS)
|
pg_spi_prepare_update_without_saveplan(PG_FUNCTION_ARGS)
|
||||||
{}*/
|
{}*/
|
||||||
void _PG_fini(void)
|
void
|
||||||
|
_PG_fini (void)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Datum
|
Datum
|
||||||
pg_spi_get_dep_ref_fees (PG_FUNCTION_ARGS) {
|
pg_spi_get_dep_ref_fees (PG_FUNCTION_ARGS)
|
||||||
|
{
|
||||||
/* Define plan to save */
|
/* Define plan to save */
|
||||||
static SPIPlanPtr deposit_plan;
|
static SPIPlanPtr deposit_plan;
|
||||||
static SPIPlanPtr ref_plan;
|
static SPIPlanPtr ref_plan;
|
||||||
static SPIPlanPtr fees_plan;
|
static SPIPlanPtr fees_plan;
|
||||||
static SPIPlanPtr dummy_plan;
|
static SPIPlanPtr dummy_plan;
|
||||||
/* Define variables to update */
|
/* Define variables to update */
|
||||||
Timestamp refund_deadline = PG_GETARG_TIMESTAMP(0);
|
Timestamp refund_deadline = PG_GETARG_TIMESTAMP (0);
|
||||||
bytea *merchant_pub = PG_GETARG_BYTEA_P(1);
|
bytea *merchant_pub = PG_GETARG_BYTEA_P (1);
|
||||||
bytea *wire_target_h_payto = PG_GETARG_BYTEA_P(2);
|
bytea *wire_target_h_payto = PG_GETARG_BYTEA_P (2);
|
||||||
bytea *wtid_raw = PG_GETARG_BYTEA_P(3);
|
bytea *wtid_raw = PG_GETARG_BYTEA_P (3);
|
||||||
bool is_null;
|
bool is_null;
|
||||||
/* Define variables to store the results of each SPI query */
|
/* Define variables to store the results of each SPI query */
|
||||||
uint64_t sum_deposit_val = 0;
|
uint64_t sum_deposit_val = 0;
|
||||||
@ -632,11 +643,12 @@ pg_spi_get_dep_ref_fees (PG_FUNCTION_ARGS) {
|
|||||||
bytea *norm_ref_by_coin_coin_pub;
|
bytea *norm_ref_by_coin_coin_pub;
|
||||||
int64_t norm_ref_by_coin_deposit_serial_id = 0;
|
int64_t norm_ref_by_coin_deposit_serial_id = 0;
|
||||||
bytea *new_dep_coin_pub = NULL;
|
bytea *new_dep_coin_pub = NULL;
|
||||||
int res = SPI_connect();
|
int res = SPI_connect ();
|
||||||
|
|
||||||
/* Connect to SPI */
|
/* Connect to SPI */
|
||||||
if (res < 0) {
|
if (res < 0)
|
||||||
elog(ERROR, "Could not connect to SPI manager");
|
{
|
||||||
|
elog (ERROR, "Could not connect to SPI manager");
|
||||||
}
|
}
|
||||||
if (deposit_plan == NULL)
|
if (deposit_plan == NULL)
|
||||||
{
|
{
|
||||||
@ -655,74 +667,98 @@ pg_spi_get_dep_ref_fees (PG_FUNCTION_ARGS) {
|
|||||||
"coin_pub,"
|
"coin_pub,"
|
||||||
"amount_with_fee_val,"
|
"amount_with_fee_val,"
|
||||||
"amount_with_fee_frac;";
|
"amount_with_fee_frac;";
|
||||||
fprintf(stderr, "dep sql %d\n", 1);
|
fprintf (stderr, "dep sql %d\n", 1);
|
||||||
new_plan =
|
new_plan =
|
||||||
SPI_prepare(dep_sql, 4,(Oid[]){INT8OID, BYTEAOID, BYTEAOID});
|
SPI_prepare (dep_sql, 4,(Oid[]){INT8OID, BYTEAOID, BYTEAOID});
|
||||||
fprintf(stderr, "dep sql %d\n", 2);
|
fprintf (stderr, "dep sql %d\n", 2);
|
||||||
if (new_plan == NULL)
|
if (new_plan == NULL)
|
||||||
elog(ERROR, "SPI_prepare failed for dep \n");
|
elog (ERROR, "SPI_prepare failed for dep \n");
|
||||||
deposit_plan = SPI_saveplan(new_plan);
|
deposit_plan = SPI_saveplan (new_plan);
|
||||||
if (deposit_plan == NULL)
|
if (deposit_plan == NULL)
|
||||||
elog(ERROR, "SPI_saveplan failed for dep \n");
|
elog (ERROR, "SPI_saveplan failed for dep \n");
|
||||||
}
|
}
|
||||||
fprintf(stdout, "dep sql %d\n", 3);
|
fprintf (stdout, "dep sql %d\n", 3);
|
||||||
|
|
||||||
values_deposit[0] = Int64GetDatum(refund_deadline);
|
values_deposit[0] = Int64GetDatum (refund_deadline);
|
||||||
values_deposit[1] = PointerGetDatum(merchant_pub);
|
values_deposit[1] = PointerGetDatum (merchant_pub);
|
||||||
values_deposit[2] = PointerGetDatum(wire_target_h_payto);
|
values_deposit[2] = PointerGetDatum (wire_target_h_payto);
|
||||||
|
|
||||||
res = SPI_execute_plan (deposit_plan,
|
res = SPI_execute_plan (deposit_plan,
|
||||||
values_deposit,
|
values_deposit,
|
||||||
NULL,
|
NULL,
|
||||||
true,
|
true,
|
||||||
0);
|
0);
|
||||||
fprintf(stdout, "dep sql %d\n", 4);
|
fprintf (stdout, "dep sql %d\n", 4);
|
||||||
if (res != SPI_OK_UPDATE)
|
if (res != SPI_OK_UPDATE)
|
||||||
{
|
{
|
||||||
elog(ERROR, "Failed to execute subquery 1 \n");
|
elog (ERROR, "Failed to execute subquery 1 \n");
|
||||||
}
|
}
|
||||||
// STORE TUPTABLE deposit
|
// STORE TUPTABLE deposit
|
||||||
dep_res = SPI_tuptable;
|
dep_res = SPI_tuptable;
|
||||||
|
|
||||||
for (unsigned int i = 0; i < SPI_processed; i++) {
|
for (unsigned int i = 0; i < SPI_processed; i++)
|
||||||
int64 dep_deposit_serial_ids = DatumGetInt64(SPI_getbinval(SPI_tuptable->vals[i], SPI_tuptable->tupdesc, 1, &is_null));
|
{
|
||||||
bytea *dep_coin_pub = DatumGetByteaP(SPI_getbinval(SPI_tuptable->vals[i], SPI_tuptable->tupdesc, 2, &is_null));
|
int64 dep_deposit_serial_ids = DatumGetInt64 (SPI_getbinval (
|
||||||
int64 dep_amount_val = DatumGetInt64(SPI_getbinval(SPI_tuptable->vals[i], SPI_tuptable->tupdesc, 3, &is_null));
|
SPI_tuptable->vals[i],
|
||||||
int32 dep_amount_frac = DatumGetInt32(SPI_getbinval(SPI_tuptable->vals[i], SPI_tuptable->tupdesc, 4, &is_null));
|
SPI_tuptable->tupdesc, 1,
|
||||||
|
&is_null));
|
||||||
|
bytea *dep_coin_pub = DatumGetByteaP (SPI_getbinval (SPI_tuptable->vals[i],
|
||||||
|
SPI_tuptable->tupdesc,
|
||||||
|
2, &is_null));
|
||||||
|
int64 dep_amount_val = DatumGetInt64 (SPI_getbinval (SPI_tuptable->vals[i],
|
||||||
|
SPI_tuptable->tupdesc,
|
||||||
|
3, &is_null));
|
||||||
|
int32 dep_amount_frac = DatumGetInt32 (SPI_getbinval (SPI_tuptable->vals[i],
|
||||||
|
SPI_tuptable->tupdesc,
|
||||||
|
4, &is_null));
|
||||||
|
|
||||||
if (is_null)
|
if (is_null)
|
||||||
elog(ERROR, "Failed to retrive data from deposit \n");
|
elog (ERROR, "Failed to retrieve data from deposit \n");
|
||||||
if (ref_plan == NULL)
|
if (ref_plan == NULL)
|
||||||
{
|
{
|
||||||
// Execute second query with parameters from first query and store results in variables
|
// Execute second query with parameters from first query and store results in variables
|
||||||
const char * ref_sql =
|
const char *ref_sql =
|
||||||
"SELECT amount_with_fee_val, amount_with_fee_frac, coin_pub, deposit_serial_id "
|
"SELECT amount_with_fee_val, amount_with_fee_frac, coin_pub, deposit_serial_id "
|
||||||
"FROM refunds "
|
"FROM refunds "
|
||||||
"WHERE coin_pub=$1 "
|
"WHERE coin_pub=$1 "
|
||||||
"AND deposit_serial_id=$2;";
|
"AND deposit_serial_id=$2;";
|
||||||
SPIPlanPtr new_plan = SPI_prepare(ref_sql, 3, (Oid[]){BYTEAOID, INT8OID});
|
SPIPlanPtr new_plan = SPI_prepare (ref_sql, 3, (Oid[]){BYTEAOID,
|
||||||
|
INT8OID});
|
||||||
if (new_plan == NULL)
|
if (new_plan == NULL)
|
||||||
elog(ERROR, "SPI_prepare failed for refund\n");
|
elog (ERROR, "SPI_prepare failed for refund\n");
|
||||||
ref_plan = SPI_saveplan(new_plan);
|
ref_plan = SPI_saveplan (new_plan);
|
||||||
if (ref_plan == NULL)
|
if (ref_plan == NULL)
|
||||||
elog(ERROR, "SPI_saveplan failed for refund\n");
|
elog (ERROR, "SPI_saveplan failed for refund\n");
|
||||||
}
|
}
|
||||||
values_refund[0] = PointerGetDatum(dep_coin_pub);
|
values_refund[0] = PointerGetDatum (dep_coin_pub);
|
||||||
values_refund[1] = Int64GetDatum(dep_deposit_serial_ids);
|
values_refund[1] = Int64GetDatum (dep_deposit_serial_ids);
|
||||||
res = SPI_execute_plan(ref_plan,
|
res = SPI_execute_plan (ref_plan,
|
||||||
values_refund,
|
values_refund,
|
||||||
NULL,
|
NULL,
|
||||||
false,
|
false,
|
||||||
0);
|
0);
|
||||||
if (res != SPI_OK_SELECT)
|
if (res != SPI_OK_SELECT)
|
||||||
elog(ERROR, "Failed to execute subquery 2\n");
|
elog (ERROR, "Failed to execute subquery 2\n");
|
||||||
// STORE TUPTABLE refund
|
// STORE TUPTABLE refund
|
||||||
ref_res = SPI_tuptable;
|
ref_res = SPI_tuptable;
|
||||||
for (unsigned int j = 0; j < SPI_processed; j++) {
|
for (unsigned int j = 0; j < SPI_processed; j++)
|
||||||
int64 ref_refund_val = DatumGetInt64(SPI_getbinval(SPI_tuptable->vals[j], SPI_tuptable->tupdesc, 1, &is_null));
|
{
|
||||||
int32 ref_refund_frac = DatumGetInt32(SPI_getbinval(SPI_tuptable->vals[j], SPI_tuptable->tupdesc, 2, &is_null));
|
int64 ref_refund_val = DatumGetInt64 (SPI_getbinval (
|
||||||
bytea *ref_coin_pub = DatumGetByteaP(SPI_getbinval(SPI_tuptable->vals[j], SPI_tuptable->tupdesc, 3, &is_null));
|
SPI_tuptable->vals[j],
|
||||||
int64 ref_deposit_serial_id = DatumGetInt64(SPI_getbinval(SPI_tuptable->vals[j], SPI_tuptable->tupdesc, 4, &is_null));
|
SPI_tuptable->tupdesc, 1,
|
||||||
|
&is_null));
|
||||||
|
int32 ref_refund_frac = DatumGetInt32 (SPI_getbinval (
|
||||||
|
SPI_tuptable->vals[j],
|
||||||
|
SPI_tuptable->tupdesc, 2,
|
||||||
|
&is_null));
|
||||||
|
bytea *ref_coin_pub = DatumGetByteaP (SPI_getbinval (
|
||||||
|
SPI_tuptable->vals[j],
|
||||||
|
SPI_tuptable->tupdesc, 3,
|
||||||
|
&is_null));
|
||||||
|
int64 ref_deposit_serial_id = DatumGetInt64 (SPI_getbinval (
|
||||||
|
SPI_tuptable->vals[j],
|
||||||
|
SPI_tuptable->tupdesc, 4,
|
||||||
|
&is_null));
|
||||||
// Execute third query with parameters from second query and store results in variables
|
// Execute third query with parameters from second query and store results in variables
|
||||||
ref_by_coin_coin_pub = ref_coin_pub;
|
ref_by_coin_coin_pub = ref_coin_pub;
|
||||||
ref_by_coin_deposit_serial_id = ref_deposit_serial_id;
|
ref_by_coin_deposit_serial_id = ref_deposit_serial_id;
|
||||||
@ -730,10 +766,14 @@ pg_spi_get_dep_ref_fees (PG_FUNCTION_ARGS) {
|
|||||||
for (unsigned int i = 0; i<SPI_processed; i++)
|
for (unsigned int i = 0; i<SPI_processed; i++)
|
||||||
{
|
{
|
||||||
if ((ref_by_coin_coin_pub ==
|
if ((ref_by_coin_coin_pub ==
|
||||||
DatumGetByteaP(SPI_getbinval(SPI_tuptable->vals[i], SPI_tuptable->tupdesc, 1, &is_null)))
|
DatumGetByteaP (SPI_getbinval (SPI_tuptable->vals[i],
|
||||||
|
SPI_tuptable->tupdesc, 1,
|
||||||
|
&is_null)))
|
||||||
&&
|
&&
|
||||||
(ref_by_coin_deposit_serial_id ==
|
(ref_by_coin_deposit_serial_id ==
|
||||||
DatumGetUInt64(SPI_getbinval(SPI_tuptable->vals[i], SPI_tuptable->tupdesc, 2, &is_null)))
|
DatumGetUInt64 (SPI_getbinval (SPI_tuptable->vals[i],
|
||||||
|
SPI_tuptable->tupdesc, 2,
|
||||||
|
&is_null)))
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
sum_refund_val += ref_refund_val;
|
sum_refund_val += ref_refund_val;
|
||||||
@ -742,15 +782,15 @@ pg_spi_get_dep_ref_fees (PG_FUNCTION_ARGS) {
|
|||||||
norm_ref_by_coin_deposit_serial_id = ref_by_coin_deposit_serial_id;
|
norm_ref_by_coin_deposit_serial_id = ref_by_coin_deposit_serial_id;
|
||||||
}
|
}
|
||||||
}// END SUM CALCULATION
|
}// END SUM CALCULATION
|
||||||
//NORMALIZE REFUND VAL FRAC
|
// NORMALIZE REFUND VAL FRAC
|
||||||
norm_refund_val =
|
norm_refund_val =
|
||||||
(sum_refund_val + sum_refund_frac ) / 100000000;
|
(sum_refund_val + sum_refund_frac) / 100000000;
|
||||||
norm_refund_frac =
|
norm_refund_frac =
|
||||||
sum_refund_frac % 100000000;
|
sum_refund_frac % 100000000;
|
||||||
// Get refund values
|
// Get refund values
|
||||||
s_refund_val += sum_refund_val;
|
s_refund_val += sum_refund_val;
|
||||||
s_refund_frac = sum_refund_frac;
|
s_refund_frac = sum_refund_frac;
|
||||||
}//END REFUND
|
}// END REFUND
|
||||||
if (norm_ref_by_coin_coin_pub == dep_coin_pub
|
if (norm_ref_by_coin_coin_pub == dep_coin_pub
|
||||||
&& ref_by_coin_deposit_serial_id == dep_deposit_serial_ids
|
&& ref_by_coin_deposit_serial_id == dep_deposit_serial_ids
|
||||||
&& norm_refund_val == dep_amount_val
|
&& norm_refund_val == dep_amount_val
|
||||||
@ -759,40 +799,46 @@ pg_spi_get_dep_ref_fees (PG_FUNCTION_ARGS) {
|
|||||||
new_dep_coin_pub = dep_coin_pub;
|
new_dep_coin_pub = dep_coin_pub;
|
||||||
}
|
}
|
||||||
// Ensure we get the fee for each coin and not only once per denomination
|
// Ensure we get the fee for each coin and not only once per denomination
|
||||||
if (fees_plan == NULL )
|
if (fees_plan == NULL)
|
||||||
{
|
{
|
||||||
const char * fees_sql =
|
const char *fees_sql =
|
||||||
"SELECT "
|
"SELECT "
|
||||||
" denom.fee_deposit_val AS fee_val, "
|
" denom.fee_deposit_val AS fee_val, "
|
||||||
" denom.fee_deposit_frac AS fee_frac, "
|
" denom.fee_deposit_frac AS fee_frac, "
|
||||||
"FROM known_coins kc"
|
"FROM known_coins kc"
|
||||||
"JOIN denominations denom USING (denominations_serial) "
|
"JOIN denominations denom USING (denominations_serial) "
|
||||||
"WHERE kc.coin_pub = $1 AND kc.coin_pub != $2;";
|
"WHERE kc.coin_pub = $1 AND kc.coin_pub != $2;";
|
||||||
SPIPlanPtr new_plan = SPI_prepare(fees_sql, 3, (Oid[]){BYTEAOID, BYTEAOID});
|
SPIPlanPtr new_plan = SPI_prepare (fees_sql, 3, (Oid[]){BYTEAOID,
|
||||||
|
BYTEAOID});
|
||||||
if (new_plan == NULL)
|
if (new_plan == NULL)
|
||||||
{
|
{
|
||||||
elog(ERROR, "SPI_prepare for fees failed ! \n");
|
elog (ERROR, "SPI_prepare for fees failed ! \n");
|
||||||
}
|
}
|
||||||
fees_plan = SPI_saveplan(new_plan);
|
fees_plan = SPI_saveplan (new_plan);
|
||||||
if (fees_plan == NULL)
|
if (fees_plan == NULL)
|
||||||
{
|
{
|
||||||
elog(ERROR, "SPI_saveplan for fees failed ! \n");
|
elog (ERROR, "SPI_saveplan for fees failed ! \n");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
values_fees[0] = PointerGetDatum(dep_coin_pub);
|
values_fees[0] = PointerGetDatum (dep_coin_pub);
|
||||||
values_fees[1] = PointerGetDatum(new_dep_coin_pub);
|
values_fees[1] = PointerGetDatum (new_dep_coin_pub);
|
||||||
res = SPI_execute_plan(fees_plan, values_fees, NULL, false, 0);
|
res = SPI_execute_plan (fees_plan, values_fees, NULL, false, 0);
|
||||||
if (res != SPI_OK_SELECT)
|
if (res != SPI_OK_SELECT)
|
||||||
elog(ERROR, "SPI_execute_plan failed for fees \n");
|
elog (ERROR, "SPI_execute_plan failed for fees \n");
|
||||||
fees_res = SPI_tuptable;
|
fees_res = SPI_tuptable;
|
||||||
tupdesc = fees_res->tupdesc;
|
tupdesc = fees_res->tupdesc;
|
||||||
for (unsigned int i = 0; i<SPI_processed; i++)
|
for (unsigned int i = 0; i<SPI_processed; i++)
|
||||||
{
|
{
|
||||||
HeapTuple tuple = fees_res->vals[i];
|
HeapTuple tuple = fees_res->vals[i];
|
||||||
bool is_null;
|
bool is_null;
|
||||||
uint64_t fee_val = DatumGetUInt64(SPI_getbinval(tuple, tupdesc, 1, &is_null));
|
uint64_t fee_val = DatumGetUInt64 (SPI_getbinval (tuple, tupdesc, 1,
|
||||||
uint32_t fee_frac = DatumGetUInt32(SPI_getbinval(tuple, tupdesc, 2, &is_null));
|
&is_null));
|
||||||
uint64_t fees_deposit_serial_id = DatumGetUInt64(SPI_getbinval(tuple, tupdesc, 3, &is_null));
|
uint32_t fee_frac = DatumGetUInt32 (SPI_getbinval (tuple, tupdesc, 2,
|
||||||
|
&is_null));
|
||||||
|
uint64_t fees_deposit_serial_id = DatumGetUInt64 (SPI_getbinval (tuple,
|
||||||
|
tupdesc,
|
||||||
|
3,
|
||||||
|
&is_null));
|
||||||
if (dummy_plan == NULL)
|
if (dummy_plan == NULL)
|
||||||
{
|
{
|
||||||
const char *insert_dummy_sql =
|
const char *insert_dummy_sql =
|
||||||
@ -800,18 +846,19 @@ pg_spi_get_dep_ref_fees (PG_FUNCTION_ARGS) {
|
|||||||
"aggregation_tracking(deposit_serial_id, wtid_raw)"
|
"aggregation_tracking(deposit_serial_id, wtid_raw)"
|
||||||
" VALUES ($1, $2)";
|
" VALUES ($1, $2)";
|
||||||
|
|
||||||
SPIPlanPtr new_plan = SPI_prepare(insert_dummy_sql, 2, (Oid[]){INT8OID, BYTEAOID});
|
SPIPlanPtr new_plan = SPI_prepare (insert_dummy_sql, 2, (Oid[]){INT8OID,
|
||||||
|
BYTEAOID});
|
||||||
if (new_plan == NULL)
|
if (new_plan == NULL)
|
||||||
elog(ERROR, "FAILED to prepare aggregation tracking \n");
|
elog (ERROR, "FAILED to prepare aggregation tracking \n");
|
||||||
dummy_plan = SPI_saveplan(new_plan);
|
dummy_plan = SPI_saveplan (new_plan);
|
||||||
if ( dummy_plan == NULL )
|
if (dummy_plan == NULL)
|
||||||
elog(ERROR, "FAILED to saveplan aggregation tracking\n");
|
elog (ERROR, "FAILED to saveplan aggregation tracking\n");
|
||||||
}
|
}
|
||||||
values_dummys[0] = Int64GetDatum(dep_deposit_serial_ids);
|
values_dummys[0] = Int64GetDatum (dep_deposit_serial_ids);
|
||||||
values_dummys[1] = PointerGetDatum(wtid_raw);
|
values_dummys[1] = PointerGetDatum (wtid_raw);
|
||||||
res = SPI_execute_plan(dummy_plan, values_dummys, NULL, false, 0);
|
res = SPI_execute_plan (dummy_plan, values_dummys, NULL, false, 0);
|
||||||
if (res != SPI_OK_INSERT)
|
if (res != SPI_OK_INSERT)
|
||||||
elog(ERROR, "Failed to insert dummy\n");
|
elog (ERROR, "Failed to insert dummy\n");
|
||||||
dummys_res = SPI_tuptable;
|
dummys_res = SPI_tuptable;
|
||||||
// Calculation of deposit fees for not fully refunded deposits
|
// Calculation of deposit fees for not fully refunded deposits
|
||||||
sum_dep_fee_val += fee_val;
|
sum_dep_fee_val += fee_val;
|
||||||
@ -820,7 +867,7 @@ pg_spi_get_dep_ref_fees (PG_FUNCTION_ARGS) {
|
|||||||
// Get deposit values
|
// Get deposit values
|
||||||
sum_deposit_val += dep_amount_val;
|
sum_deposit_val += dep_amount_val;
|
||||||
sum_deposit_frac += dep_amount_frac;
|
sum_deposit_frac += dep_amount_frac;
|
||||||
}//END DEPOSIT
|
}// END DEPOSIT
|
||||||
SPI_finish();
|
SPI_finish ();
|
||||||
PG_RETURN_VOID();
|
PG_RETURN_VOID ();
|
||||||
}
|
}
|
||||||
|
@ -6,9 +6,10 @@
|
|||||||
|
|
||||||
PG_MODULE_MAGIC;
|
PG_MODULE_MAGIC;
|
||||||
|
|
||||||
PG_FUNCTION_INFO_V1(get_deposit_summary);
|
PG_FUNCTION_INFO_V1 (get_deposit_summary);
|
||||||
|
|
||||||
Datum get_deposit_summary(PG_FUNCTION_ARGS)
|
Datum
|
||||||
|
get_deposit_summary (PG_FUNCTION_ARGS)
|
||||||
{
|
{
|
||||||
|
|
||||||
static SPIPlanPtr deposit_plan;
|
static SPIPlanPtr deposit_plan;
|
||||||
@ -18,24 +19,25 @@ Datum get_deposit_summary(PG_FUNCTION_ARGS)
|
|||||||
static SPIPlanPtr fully_refunded_by_coins_plan;
|
static SPIPlanPtr fully_refunded_by_coins_plan;
|
||||||
static SPIPlanPtr fees_plan;
|
static SPIPlanPtr fees_plan;
|
||||||
|
|
||||||
int shard = PG_GETARG_INT32(0);
|
int shard = PG_GETARG_INT32 (0);
|
||||||
char * sql;
|
char *sql;
|
||||||
char *merchant_pub = text_to_cstring(PG_GETARG_TEXT_P(1));
|
char *merchant_pub = text_to_cstring (PG_GETARG_TEXT_P (1));
|
||||||
char *wire_target_h_payto = text_to_cstring(PG_GETARG_TEXT_P(2));
|
char *wire_target_h_payto = text_to_cstring (PG_GETARG_TEXT_P (2));
|
||||||
char *wtid_raw = text_to_cstring(PG_GETARG_TEXT_P(3));
|
char *wtid_raw = text_to_cstring (PG_GETARG_TEXT_P (3));
|
||||||
int refund_deadline = PG_GETARG_INT32(4);
|
int refund_deadline = PG_GETARG_INT32 (4);
|
||||||
int conn = SPI_connect();
|
int conn = SPI_connect ();
|
||||||
if (conn != SPI_OK_CONNECT)
|
if (conn != SPI_OK_CONNECT)
|
||||||
{
|
{
|
||||||
elog(ERROR, "DB connexion failed ! \n");
|
elog (ERROR, "DB connection failed ! \n");
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( deposit_plan == NULL
|
if (deposit_plan == NULL
|
||||||
|| refund_plan == NULL
|
|| refund_plan == NULL
|
||||||
|| refund_by_coin_plan == NULL
|
|| refund_by_coin_plan == NULL
|
||||||
|| norm_refund_by_coin_plan = NULL
|
|| norm_refund_by_coin_plan = NULL
|
||||||
|| fully_refunded_coins_plan = NULL
|
|| fully_refunded_coins_plan = NULL
|
||||||
|| fees_plan == NULL )
|
|| fees_plan
|
||||||
|
== NULL)
|
||||||
{
|
{
|
||||||
if (deposit_plan == NULL)
|
if (deposit_plan == NULL)
|
||||||
{
|
{
|
||||||
@ -57,22 +59,22 @@ Datum get_deposit_summary(PG_FUNCTION_ARGS)
|
|||||||
" ,amount_with_fee_val AS amount_val"
|
" ,amount_with_fee_val AS amount_val"
|
||||||
" ,amount_with_fee_frac AS amount_frac";
|
" ,amount_with_fee_frac AS amount_frac";
|
||||||
SPIPlanPtr new_plan =
|
SPIPlanPtr new_plan =
|
||||||
SPI_prepare(dep_sql, 4, argtypes});
|
SPI_prepare (dep_sql, 4, argtypes);
|
||||||
if (new_plan == NULL)
|
if (new_plan == NULL)
|
||||||
{
|
{
|
||||||
elog(ERROR, "SPI_prepare for deposit failed ! \n");
|
elog (ERROR, "SPI_prepare for deposit failed ! \n");
|
||||||
}
|
}
|
||||||
deposit_plan = SPI_saveplan(new_plan);
|
deposit_plan = SPI_saveplan (new_plan);
|
||||||
if (deposit_plan == NULL)
|
if (deposit_plan == NULL)
|
||||||
{
|
{
|
||||||
elog(ERROR, "SPI_saveplan for deposit failed ! \n");
|
elog (ERROR, "SPI_saveplan for deposit failed ! \n");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Datum values[4];
|
Datum values[4];
|
||||||
values[0] = Int64GetDatum(refund_deadline);
|
values[0] = Int64GetDatum (refund_deadline);
|
||||||
values[1] = CStringGetDatum(merchant_pub);
|
values[1] = CStringGetDatum (merchant_pub);
|
||||||
values[2] = CStringGetDatum(wire_target_h_payto);
|
values[2] = CStringGetDatum (wire_target_h_payto);
|
||||||
int ret = SPI_execute_plan (deposit_plan,
|
int ret = SPI_execute_plan (deposit_plan,
|
||||||
values,
|
values,
|
||||||
NULL,
|
NULL,
|
||||||
@ -80,22 +82,24 @@ Datum get_deposit_summary(PG_FUNCTION_ARGS)
|
|||||||
0);
|
0);
|
||||||
if (ret != SPI_OK_UPDATE)
|
if (ret != SPI_OK_UPDATE)
|
||||||
{
|
{
|
||||||
elog(ERROR, "Failed to execute subquery 1\n");
|
elog (ERROR, "Failed to execute subquery 1\n");
|
||||||
}
|
}
|
||||||
uint64_t *dep_deposit_serial_ids = palloc(sizeof(uint64_t) * SPI_processed);
|
uint64_t *dep_deposit_serial_ids = palloc (sizeof(uint64_t)
|
||||||
BYTEA **dep_coin_pubs = palloc(sizeof(BYTEA *) * SPI_processed);
|
* SPI_processed);
|
||||||
uint64_t *dep_amount_vals = palloc(sizeof(uint64_t) * SPI_processed);
|
BYTEA **dep_coin_pubs = palloc (sizeof(BYTEA *) * SPI_processed);
|
||||||
uint32_t *dep_amount_fracs = palloc(sizeof(uint32_t) * SPI_processed);
|
uint64_t *dep_amount_vals = palloc (sizeof(uint64_t) * SPI_processed);
|
||||||
for (unsigned int i = 0; i < SPI_processed; i++) {
|
uint32_t *dep_amount_fracs = palloc (sizeof(uint32_t) * SPI_processed);
|
||||||
|
for (unsigned int i = 0; i < SPI_processed; i++)
|
||||||
|
{
|
||||||
HeapTuple tuple = SPI_tuptable->vals[i];
|
HeapTuple tuple = SPI_tuptable->vals[i];
|
||||||
dep_deposit_serial_ids[i] =
|
dep_deposit_serial_ids[i] =
|
||||||
DatumGetInt64(SPI_getbinval(tuple, SPI_tuptable->tupdesc, 1, &ret));
|
DatumGetInt64 (SPI_getbinval (tuple, SPI_tuptable->tupdesc, 1, &ret));
|
||||||
dep_coin_pubs[i] =
|
dep_coin_pubs[i] =
|
||||||
DatumGetByteaP(SPI_getbinval(tuple, SPI_tuptable->tupdesc, 2, &ret));
|
DatumGetByteaP (SPI_getbinval (tuple, SPI_tuptable->tupdesc, 2, &ret));
|
||||||
dep_amount_vals[i] =
|
dep_amount_vals[i] =
|
||||||
DatumGetInt64(SPI_getbinval(tuple, SPI_tuptable->tupdesc, 3, &ret));
|
DatumGetInt64 (SPI_getbinval (tuple, SPI_tuptable->tupdesc, 3, &ret));
|
||||||
dep_amount_fracs[i] =
|
dep_amount_fracs[i] =
|
||||||
DatumGetInt32(SPI_getbinval(tuple, SPI_tuptable->tupdesc, 4, &ret));
|
DatumGetInt32 (SPI_getbinval (tuple, SPI_tuptable->tupdesc, 4, &ret));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -111,45 +115,47 @@ Datum get_deposit_summary(PG_FUNCTION_ARGS)
|
|||||||
" FROM refunds"
|
" FROM refunds"
|
||||||
" WHERE coin_pub IN (SELECT coin_pub FROM dep)"
|
" WHERE coin_pub IN (SELECT coin_pub FROM dep)"
|
||||||
" AND deposit_serial_id IN (SELECT deposit_serial_id FROM dep)) ";
|
" AND deposit_serial_id IN (SELECT deposit_serial_id FROM dep)) ";
|
||||||
SPIPlanPtr new_plan = SPI_prepare(ref_sql, 0, NULL);
|
SPIPlanPtr new_plan = SPI_prepare (ref_sql, 0, NULL);
|
||||||
if (new_plan == NULL)
|
if (new_plan == NULL)
|
||||||
elog (ERROR, "SPI_prepare for refund failed ! \n");
|
elog (ERROR, "SPI_prepare for refund failed ! \n");
|
||||||
refund_plan = SPI_saveplan(new_plan);
|
refund_plan = SPI_saveplan (new_plan);
|
||||||
if (refund_plan == NULL)
|
if (refund_plan == NULL)
|
||||||
{
|
{
|
||||||
elog(ERROR, "SPI_saveplan for refund failed ! \n");
|
elog (ERROR, "SPI_saveplan for refund failed ! \n");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int64t_t *ref_deposit_serial_ids = palloc(sizeof(int64_t) * SPI_processed);
|
int64t_t *ref_deposit_serial_ids = palloc (sizeof(int64_t) * SPI_processed);
|
||||||
|
|
||||||
int res = SPI_execute_plan (refund_plan, NULL, NULL, false, 0);
|
int res = SPI_execute_plan (refund_plan, NULL, NULL, false, 0);
|
||||||
if (res != SPI_OK_SELECT)
|
if (res != SPI_OK_SELECT)
|
||||||
{
|
{
|
||||||
elog(ERROR, "Failed to execute subquery 2\n");
|
elog (ERROR, "Failed to execute subquery 2\n");
|
||||||
}
|
}
|
||||||
SPITupleTable *tuptable = SPI_tuptable;
|
SPITupleTable *tuptable = SPI_tuptable;
|
||||||
TupleDesc tupdesc = tuptable->tupdesc;
|
TupleDesc tupdesc = tuptable->tupdesc;
|
||||||
for (unsigned int i = 0; i < SPI_processed; i++)
|
for (unsigned int i = 0; i < SPI_processed; i++)
|
||||||
{
|
{
|
||||||
HeapTuple tuple = tuptable->vals[i];
|
HeapTuple tuple = tuptable->vals[i];
|
||||||
Datum refund_val = SPI_getbinval(tuple, tupdesc, 1, &refund_val_isnull);
|
Datum refund_val = SPI_getbinval (tuple, tupdesc, 1, &refund_val_isnull);
|
||||||
Datum refund_frac = SPI_getbinval(tuple, tupdesc, 2, &refund_frac_isnull);
|
Datum refund_frac = SPI_getbinval (tuple, tupdesc, 2,
|
||||||
Datum coin_pub = SPI_getbinval(tuple, tupdesc, 3, &coin_pub_isnull);
|
&refund_frac_isnull);
|
||||||
Datum deposit_serial_id = SPI_getbinval(tuple, tupdesc, 4, &deposit_serial_id_isnull);
|
Datum coin_pub = SPI_getbinval (tuple, tupdesc, 3, &coin_pub_isnull);
|
||||||
|
Datum deposit_serial_id = SPI_getbinval (tuple, tupdesc, 4,
|
||||||
|
&deposit_serial_id_isnull);
|
||||||
if (refund_val_isnull
|
if (refund_val_isnull
|
||||||
|| refund_frac_isnull
|
|| refund_frac_isnull
|
||||||
|| coin_pub_isnull
|
|| coin_pub_isnull
|
||||||
|| deposit_serial_id_isnull )
|
|| deposit_serial_id_isnull)
|
||||||
{
|
{
|
||||||
elog(ERROR, "Failed to retrieve data from subquery 2");
|
elog (ERROR, "Failed to retrieve data from subquery 2");
|
||||||
}
|
}
|
||||||
uint64_t refund_val_int = DatumGetUInt64(refund_val);
|
uint64_t refund_val_int = DatumGetUInt64 (refund_val);
|
||||||
uint32_t refund_frac_int = DatumGetUInt32(refund_frac);
|
uint32_t refund_frac_int = DatumGetUInt32 (refund_frac);
|
||||||
BYTEA coin_pub = DatumGetByteaP(coin_pub);
|
BYTEA coin_pub = DatumGetByteaP (coin_pub);
|
||||||
ref_deposit_serial_ids = DatumGetInt64(deposit_serial_id);
|
ref_deposit_serial_ids = DatumGetInt64 (deposit_serial_id);
|
||||||
|
|
||||||
refund *new_refund = (refund*) palloc(sizeof(refund));
|
refund *new_refund = (refund*) palloc (sizeof(refund));
|
||||||
new_refund->coin_pub = coin_pub_str;
|
new_refund->coin_pub = coin_pub_str;
|
||||||
new_refund->deposit_serial_id = deposit_serial_id_int;
|
new_refund->deposit_serial_id = deposit_serial_id_int;
|
||||||
new_refund->amount_with_fee_val = refund_val_int;
|
new_refund->amount_with_fee_val = refund_val_int;
|
||||||
@ -170,17 +176,17 @@ Datum get_deposit_summary(PG_FUNCTION_ARGS)
|
|||||||
" GROUP BY coin_pub, deposit_serial_id) ";
|
" GROUP BY coin_pub, deposit_serial_id) ";
|
||||||
SPIPlanPtr new_plan = SPI_prepare (ref_by_coin_sql, 0, NULL);
|
SPIPlanPtr new_plan = SPI_prepare (ref_by_coin_sql, 0, NULL);
|
||||||
if (new_plan == NULL)
|
if (new_plan == NULL)
|
||||||
elog(ERROR, "SPI_prepare for refund by coin failed ! \n");
|
elog (ERROR, "SPI_prepare for refund by coin failed ! \n");
|
||||||
refund_by_coin_plan = SPI_saveplan (new_plan);
|
refund_by_coin_plan = SPI_saveplan (new_plan);
|
||||||
if (refund_by_coin_plan == NULL)
|
if (refund_by_coin_plan == NULL)
|
||||||
elog(ERROR, "SPI_saveplan for refund failed");
|
elog (ERROR, "SPI_saveplan for refund failed");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int res = SPI_execute_plan (refund_by_coin_plan, NULL, NULL, false, 0);
|
int res = SPI_execute_plan (refund_by_coin_plan, NULL, NULL, false, 0);
|
||||||
if (res != SPI_OK_SELECT)
|
if (res != SPI_OK_SELECT)
|
||||||
{
|
{
|
||||||
elog(ERROR, "Failed to execute subquery 2\n");
|
elog (ERROR, "Failed to execute subquery 2\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
SPITupleTable *tuptable = SPI_tuptable;
|
SPITupleTable *tuptable = SPI_tuptable;
|
||||||
@ -188,22 +194,25 @@ Datum get_deposit_summary(PG_FUNCTION_ARGS)
|
|||||||
for (unsigned int i = 0; i < SPI_processed; i++)
|
for (unsigned int i = 0; i < SPI_processed; i++)
|
||||||
{
|
{
|
||||||
HeapTuple tuple = tuptable->vals[i];
|
HeapTuple tuple = tuptable->vals[i];
|
||||||
Datum sum_refund_val = SPI_getbinval(tuple, tupdesc, 1, &refund_val_isnull);
|
Datum sum_refund_val = SPI_getbinval (tuple, tupdesc, 1,
|
||||||
Datum sum_refund_frac = SPI_getbinval(tuple, tupdesc, 2, &refund_frac_isnull);
|
&refund_val_isnull);
|
||||||
Datum coin_pub = SPI_getbinval(tuple, tupdesc, 3, &coin_pub_isnull);
|
Datum sum_refund_frac = SPI_getbinval (tuple, tupdesc, 2,
|
||||||
Datum deposit_serial_id_int = SPI_getbinval(tuple, tupdesc, 4, &deposit_serial_id_isnull);
|
&refund_frac_isnull);
|
||||||
|
Datum coin_pub = SPI_getbinval (tuple, tupdesc, 3, &coin_pub_isnull);
|
||||||
|
Datum deposit_serial_id_int = SPI_getbinval (tuple, tupdesc, 4,
|
||||||
|
&deposit_serial_id_isnull);
|
||||||
if (refund_val_isnull
|
if (refund_val_isnull
|
||||||
|| refund_frac_isnull
|
|| refund_frac_isnull
|
||||||
|| coin_pub_isnull
|
|| coin_pub_isnull
|
||||||
|| deposit_serial_id_isnull )
|
|| deposit_serial_id_isnull)
|
||||||
{
|
{
|
||||||
elog(ERROR, "Failed to retrieve data from subquery 2");
|
elog (ERROR, "Failed to retrieve data from subquery 2");
|
||||||
}
|
}
|
||||||
uint64_t s_refund_val_int = DatumGetUInt64(sum_refund_val);
|
uint64_t s_refund_val_int = DatumGetUInt64 (sum_refund_val);
|
||||||
uint32_t s_refund_frac_int = DatumGetUInt32(sum_refund_frac);
|
uint32_t s_refund_frac_int = DatumGetUInt32 (sum_refund_frac);
|
||||||
BYTEA coin_pub = DatumGetByteaP(coin_pub);
|
BYTEA coin_pub = DatumGetByteaP (coin_pub);
|
||||||
uint64_t deposit_serial_id_int = DatumGetInt64(deposit_serial_id_int);
|
uint64_t deposit_serial_id_int = DatumGetInt64 (deposit_serial_id_int);
|
||||||
refund *new_refund_by_coin = (refund*) palloc(sizeof(refund));
|
refund *new_refund_by_coin = (refund*) palloc (sizeof(refund));
|
||||||
new_refund_by_coin->coin_pub = coin_pub;
|
new_refund_by_coin->coin_pub = coin_pub;
|
||||||
new_refund_by_coin->deposit_serial_id = deposit_serial_id_int;
|
new_refund_by_coin->deposit_serial_id = deposit_serial_id_int;
|
||||||
new_refund_by_coin->refund_amount_with_fee_val = s_refund_val_int;
|
new_refund_by_coin->refund_amount_with_fee_val = s_refund_val_int;
|
||||||
@ -221,17 +230,17 @@ Datum get_deposit_summary(PG_FUNCTION_ARGS)
|
|||||||
" FROM ref_by_coin) ";
|
" FROM ref_by_coin) ";
|
||||||
SPIPlanPtr new_plan = SPI_prepare (norm_ref_by_coin_sql, 0, NULL);
|
SPIPlanPtr new_plan = SPI_prepare (norm_ref_by_coin_sql, 0, NULL);
|
||||||
if (new_plan == NULL)
|
if (new_plan == NULL)
|
||||||
elog(ERROR, "SPI_prepare for norm refund by coin failed ! \n");
|
elog (ERROR, "SPI_prepare for norm refund by coin failed ! \n");
|
||||||
norm_refund_by_coin_plan = SPI_saveplan(new_plan);
|
norm_refund_by_coin_plan = SPI_saveplan (new_plan);
|
||||||
if (norm_refund_by_coin_plan == NULL)
|
if (norm_refund_by_coin_plan == NULL)
|
||||||
elog(ERROR, "SPI_saveplan for norm refund by coin failed ! \n");
|
elog (ERROR, "SPI_saveplan for norm refund by coin failed ! \n");
|
||||||
}
|
}
|
||||||
|
|
||||||
double norm_refund_val =
|
double norm_refund_val =
|
||||||
((double)new_refund_by_coin->refund_amount_with_fee_val
|
((double) new_refund_by_coin->refund_amount_with_fee_val
|
||||||
+ (double)new_refund_by_coin->refund_amount_with_fee_frac) / 100000000;
|
+ (double) new_refund_by_coin->refund_amount_with_fee_frac) / 100000000;
|
||||||
double norm_refund_frac =
|
double norm_refund_frac =
|
||||||
(double)new_refund_by_coin->refund_amount_with_fee_frac % 100000000;
|
(double) new_refund_by_coin->refund_amount_with_fee_frac % 100000000;
|
||||||
|
|
||||||
if (fully_refunded_coins_plan == NULL)
|
if (fully_refunded_coins_plan == NULL)
|
||||||
{
|
{
|
||||||
@ -246,21 +255,21 @@ Datum get_deposit_summary(PG_FUNCTION_ARGS)
|
|||||||
" AND norm.norm_refund_val = dep.amount_val"
|
" AND norm.norm_refund_val = dep.amount_val"
|
||||||
" AND norm.norm_refund_frac = dep.amount_frac)) ";
|
" AND norm.norm_refund_frac = dep.amount_frac)) ";
|
||||||
SPIPlanPtr new_plan =
|
SPIPlanPtr new_plan =
|
||||||
SPI_prepare(fully_refunded_coins_sql, 0, NULL);
|
SPI_prepare (fully_refunded_coins_sql, 0, NULL);
|
||||||
if (new_plan == NULL)
|
if (new_plan == NULL)
|
||||||
elog (ERROR, "SPI_prepare for fully refunded coins failed ! \n");
|
elog (ERROR, "SPI_prepare for fully refunded coins failed ! \n");
|
||||||
fully_refunded_coins_plan = SPI_saveplan(new_plan);
|
fully_refunded_coins_plan = SPI_saveplan (new_plan);
|
||||||
if (fully_refunded_coins_plan == NULL)
|
if (fully_refunded_coins_plan == NULL)
|
||||||
elog (ERROR, "SPI_saveplan for fully refunded coins failed ! \n");
|
elog (ERROR, "SPI_saveplan for fully refunded coins failed ! \n");
|
||||||
}
|
}
|
||||||
|
|
||||||
int res = SPI_execute_plan(fully_refunded_coins_sql);
|
int res = SPI_execute_plan (fully_refunded_coins_sql);
|
||||||
if ( res != SPI_OK_SELECT)
|
if (res != SPI_OK_SELECT)
|
||||||
elog(ERROR, "Failed to execute subquery 4\n");
|
elog (ERROR, "Failed to execute subquery 4\n");
|
||||||
SPITupleTable * tuptable = SPI_tuptable;
|
SPITupleTable *tuptable = SPI_tuptable;
|
||||||
TupleDesc tupdesc = tuptable->tupdesc;
|
TupleDesc tupdesc = tuptable->tupdesc;
|
||||||
|
|
||||||
BYTEA coin_pub = SPI_getbinval(tuple, tupdesc, 1, &coin_pub_isnull);
|
BYTEA coin_pub = SPI_getbinval (tuple, tupdesc, 1, &coin_pub_isnull);
|
||||||
if (fees_plan == NULL)
|
if (fees_plan == NULL)
|
||||||
{
|
{
|
||||||
const char *fees_sql =
|
const char *fees_sql =
|
||||||
@ -273,26 +282,27 @@ Datum get_deposit_summary(PG_FUNCTION_ARGS)
|
|||||||
"JOIN denominations denom USING (denominations_serial) "
|
"JOIN denominations denom USING (denominations_serial) "
|
||||||
"WHERE coin_pub NOT IN (SELECT coin_pub FROM fully_refunded_coins)";
|
"WHERE coin_pub NOT IN (SELECT coin_pub FROM fully_refunded_coins)";
|
||||||
SPIPlanPtr new_plan =
|
SPIPlanPtr new_plan =
|
||||||
SPI_prepare(fees_sql, 0, NULL);
|
SPI_prepare (fees_sql, 0, NULL);
|
||||||
if (new_plan == NULL)
|
if (new_plan == NULL)
|
||||||
{
|
{
|
||||||
elog(ERROR, "SPI_prepare for fees failed ! \n");
|
elog (ERROR, "SPI_prepare for fees failed ! \n");
|
||||||
}
|
}
|
||||||
fees_plan = SPI_saveplan(new_plan);
|
fees_plan = SPI_saveplan (new_plan);
|
||||||
if (fees_plan == NULL)
|
if (fees_plan == NULL)
|
||||||
{
|
{
|
||||||
elog(ERROR, "SPI_saveplan for fees failed ! \n");
|
elog (ERROR, "SPI_saveplan for fees failed ! \n");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
int fees_ntuples;
|
int fees_ntuples;
|
||||||
SPI_execute(fees_sql, true, 0);
|
SPI_execute (fees_sql, true, 0);
|
||||||
if (SPI_result_code() != SPI_OK_SELECT)
|
if (SPI_result_code () != SPI_OK_SELECT)
|
||||||
{
|
{
|
||||||
ereport(
|
ereport (
|
||||||
ERROR,
|
ERROR,
|
||||||
(errcode(ERRCODE_INTERNAL_ERROR),
|
(errcode (ERRCODE_INTERNAL_ERROR),
|
||||||
errmsg("deposit fee query failed: error code %d \n", SPI_result_code())));
|
errmsg ("deposit fee query failed: error code %d \n",
|
||||||
|
SPI_result_code ())));
|
||||||
}
|
}
|
||||||
fees_ntuples = SPI_processed;
|
fees_ntuples = SPI_processed;
|
||||||
|
|
||||||
@ -301,25 +311,28 @@ Datum get_deposit_summary(PG_FUNCTION_ARGS)
|
|||||||
for (i = 0; i < fees_ntuples; i++)
|
for (i = 0; i < fees_ntuples; i++)
|
||||||
{
|
{
|
||||||
Datum fee_val_datum =
|
Datum fee_val_datum =
|
||||||
SPI_getbinval(SPI_tuptable->vals[i], SPI_tuptable->tupdesc, 1, &fee_null);
|
SPI_getbinval (SPI_tuptable->vals[i], SPI_tuptable->tupdesc, 1,
|
||||||
|
&fee_null);
|
||||||
Datum fee_frac_datum =
|
Datum fee_frac_datum =
|
||||||
SPI_getbinval(SPI_tuptable->vals[i], SPI_tuptable->tupdesc, 2, &fee_null);
|
SPI_getbinval (SPI_tuptable->vals[i], SPI_tuptable->tupdesc, 2,
|
||||||
|
&fee_null);
|
||||||
Datum deposit_id_datum =
|
Datum deposit_id_datum =
|
||||||
SPI_getbinval(SPI_tuptable->vals[i], SPI_tuptable->tupdesc, 3, &deposit_null);
|
SPI_getbinval (SPI_tuptable->vals[i], SPI_tuptable->tupdesc, 3,
|
||||||
if (!fee_null && !deposit_null)
|
&deposit_null);
|
||||||
|
if (! fee_null && ! deposit_null)
|
||||||
{
|
{
|
||||||
int64 fee_val = DatumGetInt64(fee_val_datum);
|
int64 fee_val = DatumGetInt64 (fee_val_datum);
|
||||||
int32 fee_frac = DatumGetInt32(fee_frac_datum);
|
int32 fee_frac = DatumGetInt32 (fee_frac_datum);
|
||||||
int64 deposit_id = DatumGetInt64(deposit_id_datum);
|
int64 deposit_id = DatumGetInt64 (deposit_id_datum);
|
||||||
sum_fee_value += fee_val;
|
sum_fee_value += fee_val;
|
||||||
sum_fee_fraction += fee_frac;
|
sum_fee_fraction += fee_frac;
|
||||||
char *insert_agg_sql =
|
char *insert_agg_sql =
|
||||||
psprintf(
|
psprintf (
|
||||||
"INSERT INTO "
|
"INSERT INTO "
|
||||||
"aggregation_tracking(deposit_serial_id, wtid_raw)"
|
"aggregation_tracking(deposit_serial_id, wtid_raw)"
|
||||||
" VALUES (%lld, '%s')",
|
" VALUES (%lld, '%s')",
|
||||||
deposit_id, wtid_raw);
|
deposit_id, wtid_raw);
|
||||||
SPI_execute(insert_agg_sql, false, 0);
|
SPI_execute (insert_agg_sql, false, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -331,33 +344,39 @@ Datum get_deposit_summary(PG_FUNCTION_ARGS)
|
|||||||
|
|
||||||
if (tuptable == NULL || SPI_processed != 1)
|
if (tuptable == NULL || SPI_processed != 1)
|
||||||
{
|
{
|
||||||
ereport(
|
ereport (
|
||||||
ERROR,
|
ERROR,
|
||||||
(errcode(ERRCODE_INTERNAL_ERROR),
|
(errcode (ERRCODE_INTERNAL_ERROR),
|
||||||
errmsg("Unexpected result \n")));
|
errmsg ("Unexpected result \n")));
|
||||||
}
|
}
|
||||||
tupdesc = SPI_tuptable->tupdesc;
|
tupdesc = SPI_tuptable->tupdesc;
|
||||||
tuple = SPI_tuptable->vals[0];
|
tuple = SPI_tuptable->vals[0];
|
||||||
result = HeapTupleGetDatum(tuple);
|
result = HeapTupleGetDatum (tuple);
|
||||||
|
|
||||||
TupleDesc result_desc = CreateTemplateTupleDesc(6, false);
|
TupleDesc result_desc = CreateTemplateTupleDesc (6, false);
|
||||||
TupleDescInitEntry(result_desc, (AttrNumber) 1, "sum_deposit_value", INT8OID, -1, 0);
|
TupleDescInitEntry (result_desc, (AttrNumber) 1, "sum_deposit_value", INT8OID,
|
||||||
TupleDescInitEntry(result_desc, (AttrNumber) 2, "sum_deposit_fraction", INT4OID, -1, 0);
|
-1, 0);
|
||||||
TupleDescInitEntry(result_desc, (AttrNumber) 3, "sum_refund_value", INT8OID, -1, 0);
|
TupleDescInitEntry (result_desc, (AttrNumber) 2, "sum_deposit_fraction",
|
||||||
TupleDescInitEntry(result_desc, (AttrNumber) 4, "sum_refund_fraction", INT4OID, -1, 0);
|
INT4OID, -1, 0);
|
||||||
TupleDescInitEntry(result_desc, (AttrNumber) 5, "sum_fee_value", INT8OID, -1, 0);
|
TupleDescInitEntry (result_desc, (AttrNumber) 3, "sum_refund_value", INT8OID,
|
||||||
TupleDescInitEntry(result_desc, (AttrNumber) 6, "sum_fee_fraction", INT4OID, -1, 0);
|
-1, 0);
|
||||||
|
TupleDescInitEntry (result_desc, (AttrNumber) 4, "sum_refund_fraction",
|
||||||
|
INT4OID, -1, 0);
|
||||||
|
TupleDescInitEntry (result_desc, (AttrNumber) 5, "sum_fee_value", INT8OID, -1,
|
||||||
|
0);
|
||||||
|
TupleDescInitEntry (result_desc, (AttrNumber) 6, "sum_fee_fraction", INT4OID,
|
||||||
|
-1, 0);
|
||||||
|
|
||||||
int ret = SPI_prepare(sql, 4, argtypes);
|
int ret = SPI_prepare (sql, 4, argtypes);
|
||||||
if (ret != SPI_OK_PREPARE)
|
if (ret != SPI_OK_PREPARE)
|
||||||
{
|
{
|
||||||
elog(ERROR, "Failed to prepare statement: %s \n", sql);
|
elog (ERROR, "Failed to prepare statement: %s \n", sql);
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = SPI_execute_plan(plan, args, nulls, true, 0);
|
ret = SPI_execute_plan (plan, args, nulls, true, 0);
|
||||||
if (ret != SPI_OK_SELECT)
|
if (ret != SPI_OK_SELECT)
|
||||||
{
|
{
|
||||||
elog(ERROR, "Failed to execute statement: %s \n", sql);
|
elog (ERROR, "Failed to execute statement: %s \n", sql);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (SPI_processed > 0)
|
if (SPI_processed > 0)
|
||||||
@ -366,24 +385,27 @@ Datum get_deposit_summary(PG_FUNCTION_ARGS)
|
|||||||
Datum values[6];
|
Datum values[6];
|
||||||
bool nulls[6] = {false};
|
bool nulls[6] = {false};
|
||||||
values[0] =
|
values[0] =
|
||||||
SPI_getbinval(SPI_tuptable->vals[0], SPI_tuptable->tupdesc, 1, &nulls[0]);
|
SPI_getbinval (SPI_tuptable->vals[0], SPI_tuptable->tupdesc, 1,
|
||||||
|
&nulls[0]);
|
||||||
values[1] =
|
values[1] =
|
||||||
SPI_getbinval(SPI_tuptable->vals[0], SPI_tuptable->tupdesc, 2, &nulls[1]);
|
SPI_getbinval (SPI_tuptable->vals[0], SPI_tuptable->tupdesc, 2,
|
||||||
|
&nulls[1]);
|
||||||
values[2] =
|
values[2] =
|
||||||
SPI_getbinval(SPI_tuptable->vals[0], SPI_tuptable->tupdesc, 3, &nulls[2]);
|
SPI_getbinval (SPI_tuptable->vals[0], SPI_tuptable->tupdesc, 3,
|
||||||
|
&nulls[2]);
|
||||||
values[3] =
|
values[3] =
|
||||||
SPI_getbinval(SPI_tuptable->vals[0], SPI_tuptable->tupdesc, 4, &nulls[3]);
|
SPI_getbinval (SPI_tuptable->vals[0], SPI_tuptable->tupdesc, 4,
|
||||||
|
&nulls[3]);
|
||||||
values[4] =
|
values[4] =
|
||||||
SPI_getbinval(SPI_tuptable->vals[0], SPI_tuptable->tupdesc, 5, &nulls[4]);
|
SPI_getbinval (SPI_tuptable->vals[0], SPI_tuptable->tupdesc, 5,
|
||||||
|
&nulls[4]);
|
||||||
values[5] =
|
values[5] =
|
||||||
SPI_getbinval(SPI_tuptable->vals[0], SPI_tuptable->tupdesc, 6, &nulls[5]);
|
SPI_getbinval (SPI_tuptable->vals[0], SPI_tuptable->tupdesc, 6,
|
||||||
tuple = heap_form_tuple(result_desc, values, nulls);
|
&nulls[5]);
|
||||||
PG_RETURN_DATUM(HeapTupleGetDatum(tuple));
|
tuple = heap_form_tuple (result_desc, values, nulls);
|
||||||
|
PG_RETURN_DATUM (HeapTupleGetDatum (tuple));
|
||||||
}
|
}
|
||||||
SPI_finish();
|
SPI_finish ();
|
||||||
|
|
||||||
PG_RETURN_NULL();
|
PG_RETURN_NULL ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user