189 lines
3.8 KiB
Plaintext
189 lines
3.8 KiB
Plaintext
/**********************************************************************
|
|
* PostgreSQL::InServer::Util
|
|
*
|
|
* src/pl/plperl/Util.xs
|
|
*
|
|
* Defines plperl interfaces for general-purpose utilities.
|
|
* This module is bootstrapped as soon as an interpreter is initialized.
|
|
* Currently doesn't define a PACKAGE= so all subs are in main:: to avoid
|
|
* the need for explicit importing.
|
|
*
|
|
**********************************************************************/
|
|
|
|
/* this must be first: */
|
|
#include "postgres.h"
|
|
|
|
#include "fmgr.h"
|
|
#include "utils/builtins.h"
|
|
#include "utils/bytea.h" /* for byteain & byteaout */
|
|
|
|
/* perl stuff */
|
|
#define PG_NEED_PERL_XSUB_H
|
|
#include "plperl.h"
|
|
|
|
|
|
static text *
|
|
sv2text(SV *sv)
|
|
{
|
|
char *str = sv2cstr(sv);
|
|
text *text;
|
|
|
|
text = cstring_to_text(str);
|
|
pfree(str);
|
|
return text;
|
|
}
|
|
|
|
MODULE = PostgreSQL::InServer::Util PREFIX = util_
|
|
|
|
PROTOTYPES: ENABLE
|
|
VERSIONCHECK: DISABLE
|
|
|
|
int
|
|
_aliased_constants()
|
|
PROTOTYPE:
|
|
ALIAS:
|
|
DEBUG = DEBUG2
|
|
LOG = LOG
|
|
INFO = INFO
|
|
NOTICE = NOTICE
|
|
WARNING = WARNING
|
|
ERROR = ERROR
|
|
CODE:
|
|
/* uses the ALIAS value as the return value */
|
|
RETVAL = ix;
|
|
OUTPUT:
|
|
RETVAL
|
|
|
|
|
|
void
|
|
util_elog(level, msg)
|
|
int level
|
|
SV *msg
|
|
CODE:
|
|
if (level > ERROR) /* no PANIC allowed thanks */
|
|
level = ERROR;
|
|
if (level < DEBUG5)
|
|
level = DEBUG5;
|
|
plperl_util_elog(level, msg);
|
|
|
|
SV *
|
|
util_quote_literal(sv)
|
|
SV *sv
|
|
CODE:
|
|
if (!sv || !SvOK(sv)) {
|
|
RETVAL = &PL_sv_undef;
|
|
}
|
|
else {
|
|
text *arg = sv2text(sv);
|
|
text *quoted = DatumGetTextPP(DirectFunctionCall1(quote_literal, PointerGetDatum(arg)));
|
|
char *str;
|
|
|
|
pfree(arg);
|
|
str = text_to_cstring(quoted);
|
|
RETVAL = cstr2sv(str);
|
|
pfree(str);
|
|
}
|
|
OUTPUT:
|
|
RETVAL
|
|
|
|
SV *
|
|
util_quote_nullable(sv)
|
|
SV *sv
|
|
CODE:
|
|
if (!sv || !SvOK(sv))
|
|
{
|
|
RETVAL = cstr2sv("NULL");
|
|
}
|
|
else
|
|
{
|
|
text *arg = sv2text(sv);
|
|
text *quoted = DatumGetTextPP(DirectFunctionCall1(quote_nullable, PointerGetDatum(arg)));
|
|
char *str;
|
|
|
|
pfree(arg);
|
|
str = text_to_cstring(quoted);
|
|
RETVAL = cstr2sv(str);
|
|
pfree(str);
|
|
}
|
|
OUTPUT:
|
|
RETVAL
|
|
|
|
SV *
|
|
util_quote_ident(sv)
|
|
SV *sv
|
|
PREINIT:
|
|
text *arg;
|
|
text *quoted;
|
|
char *str;
|
|
CODE:
|
|
arg = sv2text(sv);
|
|
quoted = DatumGetTextPP(DirectFunctionCall1(quote_ident, PointerGetDatum(arg)));
|
|
|
|
pfree(arg);
|
|
str = text_to_cstring(quoted);
|
|
RETVAL = cstr2sv(str);
|
|
pfree(str);
|
|
OUTPUT:
|
|
RETVAL
|
|
|
|
SV *
|
|
util_decode_bytea(sv)
|
|
SV *sv
|
|
PREINIT:
|
|
char *arg;
|
|
text *ret;
|
|
CODE:
|
|
arg = SvPVbyte_nolen(sv);
|
|
ret = DatumGetTextPP(DirectFunctionCall1(byteain, PointerGetDatum(arg)));
|
|
/* not cstr2sv because this is raw bytes not utf8'able */
|
|
RETVAL = newSVpvn(VARDATA_ANY(ret), VARSIZE_ANY_EXHDR(ret));
|
|
OUTPUT:
|
|
RETVAL
|
|
|
|
SV *
|
|
util_encode_bytea(sv)
|
|
SV *sv
|
|
PREINIT:
|
|
text *arg;
|
|
char *ret;
|
|
STRLEN len;
|
|
CODE:
|
|
/* not sv2text because this is raw bytes not utf8'able */
|
|
ret = SvPVbyte(sv, len);
|
|
arg = cstring_to_text_with_len(ret, len);
|
|
ret = DatumGetCString(DirectFunctionCall1(byteaout, PointerGetDatum(arg)));
|
|
RETVAL = cstr2sv(ret);
|
|
OUTPUT:
|
|
RETVAL
|
|
|
|
SV *
|
|
looks_like_number(sv)
|
|
SV *sv
|
|
CODE:
|
|
if (!SvOK(sv))
|
|
RETVAL = &PL_sv_undef;
|
|
else if ( looks_like_number(sv) )
|
|
RETVAL = &PL_sv_yes;
|
|
else
|
|
RETVAL = &PL_sv_no;
|
|
OUTPUT:
|
|
RETVAL
|
|
|
|
SV *
|
|
encode_typed_literal(sv, typname)
|
|
SV *sv
|
|
char *typname;
|
|
PREINIT:
|
|
char *outstr;
|
|
CODE:
|
|
outstr = plperl_sv_to_literal(sv, typname);
|
|
if (outstr == NULL)
|
|
RETVAL = &PL_sv_undef;
|
|
else
|
|
RETVAL = cstr2sv(outstr);
|
|
OUTPUT:
|
|
RETVAL
|
|
|
|
BOOT:
|
|
items = 0; /* avoid 'unused variable' warning */
|