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;