diff options
Diffstat (limited to 'sql')
| -rw-r--r-- | sql/date.c | 49 |
1 files changed, 49 insertions, 0 deletions
@@ -1,5 +1,6 @@ #include "postgres.h" #include "fmgr.h" +#include "executor/spi.h" #include "utils/date.h" #include "utils/builtins.h" #include "isda/dateconv.h" @@ -85,3 +86,51 @@ Datum cds_accrued(PG_FUNCTION_ARGS) { pfree(currency); PG_RETURN_FLOAT8((date - date_prev) / 360. * coupon); } + + +Datum test(PG_FUNCTION_ARGS) { + if (SPI_connect() == SPI_ERROR_CONNECT) { + elog(ERROR, "pomme"); + } + const text* redindexcode = PG_GETARG_TEXT_PP(0); + DateADT maturity = PG_GETARG_DATEADT(1); + char* sql_query = "SELECT index, series, tenor::text, coupon, issue_date, indexfactor/100, " + "version, cumulativeloss " + "FROM index_desc " + "WHERE redindexcode=$1 AND maturity=$2"; + int ret; + uint64 proc; + int nargs = 2; + Oid argtypes[2] = {TEXTOID, DATEOID}; + char nulls[2] = " "; + Datum values[2]; + values[0] = PointerGetDatum(redindexcode); + values[1] = DateADTGetDatum(maturity); + ret = SPI_execute_with_args(sql_query, nargs, argtypes, values, nulls, true, 1); + proc = SPI_processed; + short series, version; + int coupon; + char *index, *tenor; + TDate issue_date; + double factor, cumulativeloss; + if (ret == SPI_OK_SELECT && SPI_tuptable != NULL) { + SPITupleTable *tuptable = SPI_tuptable; + TupleDesc tupdesc = tuptable->tupdesc; + bool isnull; + HeapTuple tuple = tuptable->vals[0]; + index = text_to_cstring(DatumGetTextPP(SPI_getbinval(tuple, tupdesc, 1, &isnull))); + series = DatumGetInt16(SPI_getbinval(tuple, tupdesc, 2, &isnull)); + tenor = text_to_cstring(DatumGetTextPP(SPI_getbinval(tuple, tupdesc, 3, &isnull))); + coupon = DatumGetInt32(SPI_getbinval(tuple, tupdesc, 4, &isnull)); + issue_date = TDate_from_DateADT(DatumGetDateADT(SPI_getbinval(tuple, tupdesc, 5, &isnull))); + factor = DatumGetFloat8(SPI_getbinval(tuple, tupdesc, 6, &isnull)); + version = DatumGetInt16(SPI_getbinval(tuple, tupdesc, 7, &isnull)); + cumulativeloss = DatumGetFloat8(SPI_getbinval(tuple, tupdesc, 8, &isnull)); + elog(ERROR, "index: %s, series: %dh, tenor: %s, coupon: %d, issue_date: %d, factor: %f, version: %dh, cumulativeloss: %f", + index, series, tenor, coupon, issue_date, factor, version, cumulativeloss); + } + SPI_finish(); + pfree(index); + pfree(tenor); + PG_RETURN_NULL(); +} |
