http://postgres.cz/index.php?title=Polymorfn%C3%AD_variadick%C3%A1_funkce_format&feed=atom&action=history
Polymorfní variadická funkce format - Historie editací
2024-03-29T09:34:20Z
Historie editací této stránky
MediaWiki 1.36.0
http://postgres.cz/index.php?title=Polymorfn%C3%AD_variadick%C3%A1_funkce_format&diff=462&oldid=prev
imported>Pavel: Nová stránka: 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: <...
2009-09-10T04:16:43Z
<p>Nová stránka: 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: <...</p>
<p><b>Nová stránka</b></p><div>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:<br />
<br />
<pre><br />
#include "postgres.h"<br />
#include "fmgr.h"<br />
#include "lib/stringinfo.h"<br />
#include "utils/builtins.h"<br />
#include "utils/lsyscache.h"<br />
<br />
PG_MODULE_MAGIC;<br />
<br />
PG_FUNCTION_INFO_V1(pg_format);<br />
<br />
Datum pg_format(PG_FUNCTION_ARGS);<br />
<br />
Datum<br />
pg_format(PG_FUNCTION_ARGS)<br />
{<br />
char *fmt = PG_GETARG_CSTRING(0);<br />
StringInfo str;<br />
char *cp;<br />
int i = 1;<br />
<br />
if (PG_ARGISNULL(0))<br />
PG_RETURN_NULL();<br />
<br />
str = makeStringInfo();<br />
<br />
for (cp = fmt; *cp; cp++)<br />
{<br />
if (cp[0] == '%')<br />
{<br />
Oid valtype;<br />
Datum value;<br />
Oid typoutput;<br />
bool typIsVarlena;<br />
<br />
<br />
if (cp[1] == '%')<br />
{<br />
appendStringInfoChar(str, cp[1]);<br />
cp++;<br />
continue;<br />
}<br />
<br />
if (i > PG_NARGS())<br />
elog(ERROR, "too few parameters specified by format string");<br />
<br />
if (PG_ARGISNULL(i))<br />
{<br />
appendStringInfoString(str, "NULL");<br />
}<br />
else<br />
{<br />
/* append n-th value */<br />
value = PG_GETARG_DATUM(i);<br />
valtype = get_fn_expr_argtype(fcinfo->flinfo, i);<br />
<br />
getTypeOutputInfo(valtype, &typoutput, &typIsVarlena);<br />
appendStringInfoString(str, OidOutputFunctionCall(typoutput, value));<br />
}<br />
i++;<br />
}<br />
else<br />
appendStringInfoChar(str, cp[0]);<br />
}<br />
<br />
if (i != PG_NARGS())<br />
elog(ERROR, "too much parameters");<br />
<br />
PG_RETURN_TEXT_P(CStringGetTextDatum(str->data));<br />
}<br />
<br />
/*<br />
* Varianta pouze s formátovacím řetězcem, pouze obálka.<br />
*/<br />
Datum<br />
pg_format1(PG_FUNCTION_ARGS)<br />
{<br />
return pg_format(fcinfo);<br />
}<br />
</pre><br />
registrační skript:<br />
<pre><br />
SET search_path = public;<br />
<br />
CREATE OR REPLACE FUNCTION format(cstring, variadic "any")<br />
RETURNS text<br />
AS 'MODULE_PATHNAME', 'pg_format'<br />
LANGUAGE C IMMUTABLE;<br />
<br />
CREATE OR REPLACE FUNCTION format(cstring)<br />
RETURNS text<br />
AS 'MODULE_PATHNAME', 'pg_format1'<br />
LANGUAGE C IMMUTABLE;<br />
</pre></div>
imported>Pavel