Datum pg_armor(PG_FUNCTION_ARGS) { bytea *data; text *res; int data_len, res_len, guess_len; data = PG_GETARG_BYTEA_P(0); data_len = VARSIZE(data) - VARHDRSZ; guess_len = pgp_armor_enc_len(data_len); res = palloc(VARHDRSZ + guess_len); res_len = pgp_armor_encode((uint8 *) VARDATA(data), data_len, (uint8 *) VARDATA(res)); if (res_len > guess_len) ereport(ERROR, (errcode(ERRCODE_EXTERNAL_ROUTINE_INVOCATION_EXCEPTION), errmsg("Overflow - encode estimate too small"))); SET_VARSIZE(res, VARHDRSZ + res_len); PG_FREE_IF_COPY(data, 0); PG_RETURN_TEXT_P(res); }
Datum pg_armor(PG_FUNCTION_ARGS) { bytea *data; text *res; int data_len; StringInfoData buf; int num_headers; char **keys = NULL, **values = NULL; data = PG_GETARG_BYTEA_P(0); data_len = VARSIZE(data) - VARHDRSZ; if (PG_NARGS() == 3) { num_headers = parse_key_value_arrays(PG_GETARG_ARRAYTYPE_P(1), PG_GETARG_ARRAYTYPE_P(2), &keys, &values); } else if (PG_NARGS() == 1) num_headers = 0; else elog(ERROR, "unexpected number of arguments %d", PG_NARGS()); initStringInfo(&buf); pgp_armor_encode((uint8 *) VARDATA(data), data_len, &buf, num_headers, keys, values); res = palloc(VARHDRSZ + buf.len); SET_VARSIZE(res, VARHDRSZ + buf.len); memcpy(VARDATA(res), buf.data, buf.len); pfree(buf.data); PG_FREE_IF_COPY(data, 0); PG_RETURN_TEXT_P(res); }