fu/FU.xs
Yorhel 8f94dd0921 pg: Initial support for receiving binary results
Just the initial framework stuff and a few types to test with.
2025-02-07 15:18:45 +01:00

185 lines
3.5 KiB
Text

#include <stdio.h>
#include <dlfcn.h>
#undef PERL_IMPLICIT_SYS
#define PERL_NO_GET_CONTEXT
#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"
#include "c/common.c"
#include "c/jsonfmt.c"
#include "c/jsonparse.c"
#include "c/libpq.h"
#include "c/pgtypes.c"
#include "c/pgconn.c"
#define FUPG_CONN_COOKIE \
if (c->cookie) fu_confess("Invalid attempt to run a query on the top-level connection while a transaction object exists")
#define FUPG_ST_COOKIE \
if (st->cookie != st->conn->cookie) fu_confess("Invalid cross-transaction operation on statement object")
typedef fupg_conn *fupg_txn;
MODULE = FU
PROTOTYPES: DISABLE
TYPEMAP: <<EOT
TYPEMAP
fupg_conn * FUPG_CONN
fupg_txn FUPG_TXN
fupg_st * FUPG_ST
INPUT
FUPG_CONN
if (sv_derived_from($arg, \"FU::PG::conn\")) $var = (fupg_conn *)SvIVX(SvRV($arg));
else fu_confess(\"invalid connection object\");
FUPG_TXN
$var = fupg_get_transaction(aTHX_ $arg);
FUPG_ST
if (sv_derived_from($arg, \"FU::PG::st\")) $var = (fupg_st *)SvIVX(SvRV($arg));
else fu_confess(\"invalid statement object\");
#"
EOT
MODULE = FU PACKAGE = FU::Util
void json_format(SV *val, ...)
CODE:
ST(0) = fujson_fmt_xs(aTHX_ ax, items, val);
void json_parse(SV *val, ...)
CODE:
ST(0) = fujson_parse_xs(aTHX_ ax, items, val);
MODULE = FU PACKAGE = FU::PG
void _load_libpq()
CODE:
if (!PQconnectdb) fupg_load();
int lib_version()
CODE:
RETVAL = PQlibVersion();
OUTPUT:
RETVAL
void connect(const char *pkg, const char *conninfo)
CODE:
(void)pkg;
ST(0) = fupg_connect(aTHX_ conninfo);
MODULE = FU PACKAGE = FU::PG::conn
int server_version(fupg_conn *c)
CODE:
RETVAL = PQserverVersion(c->conn);
OUTPUT:
RETVAL
void _debug_trace(fupg_conn *c, bool on)
CODE:
if (on) PQtrace(c->conn, stderr);
else PQuntrace(c->conn);
ST(0) = c->self;
void _set_cookie(fupg_conn *c, UV cookie)
CODE:
c->cookie = cookie;
UV _get_cookie(fupg_conn *c)
CODE:
RETVAL = c->cookie;
OUTPUT:
RETVAL
void status(fupg_conn *c)
CODE:
ST(0) = sv_2mortal(newSVpv(fupg_status(c), 0));
void exec(fupg_conn *c, SV *sv)
CODE:
FUPG_CONN_COOKIE;
ST(0) = fupg_exec(aTHX_ c, SvPVutf8_nolen(sv));
void q(fupg_conn *c, SV *sv, ...)
CODE:
FUPG_CONN_COOKIE;
ST(0) = fupg_q(aTHX_ c, SvPVutf8_nolen(sv), ax, items);
void disconnect(fupg_conn *c)
CODE:
fupg_disconnect(c);
void DESTROY(fupg_conn *c)
CODE:
fupg_destroy(c);
MODULE = FU PACKAGE = FU::PG::txn
void exec(fupg_txn c, SV *sv)
CODE:
ST(0) = fupg_exec(aTHX_ c, SvPVutf8_nolen(sv));
void q(fupg_txn c, SV *sv, ...)
CODE:
ST(0) = fupg_q(aTHX_ c, SvPVutf8_nolen(sv), ax, items);
MODULE = FU PACKAGE = FU::PG::st
void text_results(fupg_st *st, ...)
CODE:
st->text_results = items == 1 || SvTRUE(ST(1));
XSRETURN(1);
void params(fupg_st *st)
CODE:
FUPG_ST_COOKIE;
ST(0) = fupg_st_params(aTHX_ st);
void columns(fupg_st *st)
CODE:
FUPG_ST_COOKIE;
ST(0) = fupg_st_columns(aTHX_ st);
void exec(fupg_st *st)
CODE:
FUPG_ST_COOKIE;
ST(0) = fupg_st_exec(aTHX_ st);
void val(fupg_st *st)
CODE:
FUPG_ST_COOKIE;
ST(0) = fupg_st_val(aTHX_ st);
void rowl(fupg_st *st)
CODE:
FUPG_ST_COOKIE;
XSRETURN(fupg_st_rowl(aTHX_ st, ax));
void rowa(fupg_st *st)
CODE:
FUPG_ST_COOKIE;
ST(0) = fupg_st_rowa(aTHX_ st);
void rowh(fupg_st *st)
CODE:
FUPG_ST_COOKIE;
ST(0) = fupg_st_rowh(aTHX_ st);
void DESTROY(fupg_st *st)
CODE:
fupg_st_destroy(st);