Polymorfní variadická funkce format
Skočit na navigaci
Skočit na vyhledávání
Funkci, která zjednoduší formátování (sestavení) chybového hlášení v PostgreSQL nemáme. S podporou variadických a polymorfních parametrů si ji můžeme dopsat sami:
#include "postgres.h" #include "fmgr.h" #include "lib/stringinfo.h" #include "utils/builtins.h" #include "utils/lsyscache.h" PG_MODULE_MAGIC; PG_FUNCTION_INFO_V1(pg_format); Datum pg_format(PG_FUNCTION_ARGS); Datum pg_format(PG_FUNCTION_ARGS) { char *fmt = PG_GETARG_CSTRING(0); StringInfo str; char *cp; int i = 1; if (PG_ARGISNULL(0)) PG_RETURN_NULL(); str = makeStringInfo(); for (cp = fmt; *cp; cp++) { if (cp[0] == '%') { Oid valtype; Datum value; Oid typoutput; bool typIsVarlena; if (cp[1] == '%') { appendStringInfoChar(str, cp[1]); cp++; continue; } if (i > PG_NARGS()) elog(ERROR, "too few parameters specified by format string"); if (PG_ARGISNULL(i)) { appendStringInfoString(str, "NULL"); } else { /* append n-th value */ value = PG_GETARG_DATUM(i); valtype = get_fn_expr_argtype(fcinfo->flinfo, i); getTypeOutputInfo(valtype, &typoutput, &typIsVarlena); appendStringInfoString(str, OidOutputFunctionCall(typoutput, value)); } i++; } else appendStringInfoChar(str, cp[0]); } if (i != PG_NARGS()) elog(ERROR, "too much parameters"); PG_RETURN_TEXT_P(CStringGetTextDatum(str->data)); } /* * Varianta pouze s formátovacím řetězcem, pouze obálka. */ Datum pg_format1(PG_FUNCTION_ARGS) { return pg_format(fcinfo); }
registrační skript:
SET search_path = public; CREATE OR REPLACE FUNCTION format(cstring, variadic "any") RETURNS text AS 'MODULE_PATHNAME', 'pg_format' LANGUAGE C IMMUTABLE; CREATE OR REPLACE FUNCTION format(cstring) RETURNS text AS 'MODULE_PATHNAME', 'pg_format1' LANGUAGE C IMMUTABLE;