Exemplo n.º 1
0
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);
}
Exemplo n.º 2
0
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);
}