diff options
Diffstat (limited to 'sql/serenitas.c')
| -rw-r--r-- | sql/serenitas.c | 23 |
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); } |
