aboutsummaryrefslogtreecommitdiffstats
path: root/sql/serenitas.c
diff options
context:
space:
mode:
Diffstat (limited to 'sql/serenitas.c')
-rw-r--r--sql/serenitas.c23
1 files changed, 15 insertions, 8 deletions
diff --git a/sql/serenitas.c b/sql/serenitas.c
index 022d45d9..5e4bea1e 100644
--- a/sql/serenitas.c
+++ b/sql/serenitas.c
@@ -96,10 +96,11 @@ Datum cds_accrued(PG_FUNCTION_ARGS) {
PG_RETURN_FLOAT8((date - date_prev) / 360. * coupon);
}
-static inline void get_TCurve(const char* buf, uint32_t length, TCurve* curve) {
+static inline int get_TCurve(const char* buf, uint32_t length, TCurve* curve) {
if (LZ4_decompress_safe(buf, (char*)curve, length, 512) < 0) {
- elog(ERROR, "error during decompression");
- free(curve);
+ return -1;
+ } else {
+ return 0;
}
}
@@ -164,7 +165,7 @@ Datum upfront_from_level(PG_FUNCTION_ARGS) {
DateADT maturity = PG_GETARG_DATEADT(1);
float8 traded_level = PG_GETARG_FLOAT8(2);
DateADT trade_date = PG_GETARG_DATEADT(3);
- const char* currency = text_to_cstring(PG_GETARG_TEXT_PP(4));
+ char* currency = text_to_cstring(PG_GETARG_TEXT_PP(4));
char* sql_query = "SELECT index::text, coupon, issue_date, indexfactor/100, cumulativeloss "
"FROM index_desc "
"WHERE redindexcode=$1 AND maturity=$2";
@@ -193,7 +194,7 @@ Datum upfront_from_level(PG_FUNCTION_ARGS) {
factor = DatumGetFloat8(SPI_getbinval(tuple, tupdesc, 6, &isnull));
cumulativeloss = DatumGetFloat8(SPI_getbinval(tuple, tupdesc, 8, &isnull));
} else {
- SPI_finish();
+ pfree(currency);
elog(ERROR, "something wrong happened");
}
int16 curve_type = 532;
@@ -214,19 +215,24 @@ Datum upfront_from_level(PG_FUNCTION_ARGS) {
HeapTuple tuple = tuptable->vals[0];
tmp = SPI_getbinval(tuple, tupdesc, 1, &isnull);
if (isnull) {
+ pfree(currency);
pfree(index);
- SPI_finish();
elog(ERROR, "no curve for that date");
} else {
buf = DatumGetByteaPP(tmp);
uint32 data_length = VARSIZE_ANY_EXHDR(buf);
const char *raw_data = VARDATA_ANY(buf);
curve = (TCurve*)malloc(512);
- get_TCurve(raw_data, data_length, curve);
+ if (get_TCurve(raw_data, data_length, curve) == -1 ) {
+ free(curve);
+ pfree(currency);
+ pfree(index);
+ elog(ERROR, "error during decompression");
+ }
}
} else {
+ pfree(currency);
pfree(index);
- SPI_finish();
elog(ERROR, "no curve for that date");
}
SPI_finish();
@@ -234,6 +240,7 @@ Datum upfront_from_level(PG_FUNCTION_ARGS) {
double upfront;
upfront = calc(TDate_from_DateADT(trade_date), issue_date, TDate_from_DateADT(maturity), recovery, coupon / 10000.0, cal_from_currency(currency), curve, traded_level, true);
pfree(index);
+ pfree(currency);
free(curve);
PG_RETURN_FLOAT8(upfront);
}