postgresql/src/interfaces/perl5/Pg.xs

973 lines
13 KiB
Plaintext
Raw Normal View History

1997-04-29 21:37:10 +02:00
/*-------------------------------------------------------
*
1997-06-02 21:42:14 +02:00
* $Id: Pg.xs,v 1.2 1997/06/02 19:42:03 mergl Exp $
1997-04-29 21:37:10 +02:00
*
* Copyright (c) 1997 Edmund Mergl
*
*-------------------------------------------------------*/
#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"
#ifdef bool
#undef bool
#endif
#ifdef DEBUG
#undef DEBUG
#endif
#ifdef ABORT
#undef ABORT
#endif
#include "postgres.h"
#include "libpq-fe.h"
typedef struct pg_conn* PG_conn;
typedef struct pg_result* PG_result;
static double
constant(name, arg)
char *name;
int arg;
{
errno = 0;
switch (*name) {
case 'A':
break;
case 'B':
break;
case 'C':
break;
case 'D':
break;
case 'E':
break;
case 'F':
break;
case 'G':
break;
case 'H':
break;
case 'I':
break;
case 'J':
break;
case 'K':
break;
case 'L':
break;
case 'M':
break;
case 'N':
break;
case 'O':
break;
case 'P':
if (strEQ(name, "PGRES_CONNECTION_OK"))
return 0;
if (strEQ(name, "PGRES_CONNECTION_BAD"))
return 1;
if (strEQ(name, "PGRES_INV_SMGRMASK"))
return 0x0000ffff;
if (strEQ(name, "PGRES_INV_ARCHIVE"))
return 0x00010000;
if (strEQ(name, "PGRES_INV_WRITE"))
return 0x00020000;
if (strEQ(name, "PGRES_INV_READ"))
return 0x00040000;
if (strEQ(name, "PGRES_InvalidOid"))
return 0;
if (strEQ(name, "PGRES_EMPTY_QUERY"))
return 0;
if (strEQ(name, "PGRES_COMMAND_OK"))
return 1;
if (strEQ(name, "PGRES_TUPLES_OK"))
return 2;
if (strEQ(name, "PGRES_COPY_OUT"))
return 3;
if (strEQ(name, "PGRES_COPY_IN"))
return 4;
if (strEQ(name, "PGRES_BAD_RESPONSE"))
return 5;
if (strEQ(name, "PGRES_NONFATAL_ERROR"))
return 6;
if (strEQ(name, "PGRES_FATAL_ERROR"))
return 7;
break;
case 'Q':
break;
case 'R':
break;
case 'S':
break;
case 'T':
break;
case 'U':
break;
case 'V':
break;
case 'W':
break;
case 'X':
break;
case 'Y':
break;
case 'Z':
break;
case 'a':
break;
case 'b':
break;
case 'c':
break;
case 'd':
break;
case 'e':
break;
case 'f':
break;
case 'g':
break;
case 'h':
break;
case 'i':
break;
case 'j':
break;
case 'k':
break;
case 'l':
break;
case 'm':
break;
case 'n':
break;
case 'o':
break;
case 'p':
break;
case 'q':
break;
case 'r':
break;
case 's':
break;
case 't':
break;
case 'u':
break;
case 'v':
break;
case 'w':
break;
case 'x':
break;
case 'y':
break;
case 'z':
break;
}
errno = EINVAL;
return 0;
not_there:
errno = ENOENT;
return 0;
}
MODULE = Pg PACKAGE = Pg
PROTOTYPES: DISABLE
double
constant(name,arg)
char * name
int arg
PGconn *
PQconnectdb(conninfo)
char * conninfo
CODE:
RETVAL = PQconnectdb((const char *)conninfo);
OUTPUT:
RETVAL
HV *
PQconndefaults()
CODE:
PQconninfoOption *infoOption;
RETVAL = newHV();
if (infoOption = PQconndefaults()) {
while (infoOption->keyword != NULL) {
hv_store(RETVAL, infoOption->keyword, strlen(infoOption->keyword), newSVpv(infoOption->val, 0), 0);
infoOption++;
}
}
OUTPUT:
RETVAL
PGconn *
PQsetdb(pghost, pgport, pgoptions, pgtty, dbname)
char * pghost
char * pgport
char * pgoptions
char * pgtty
char * dbname
void
PQfinish(conn)
PGconn * conn
void
PQreset(conn)
PGconn * conn
char *
PQdb(conn)
PGconn * conn
char *
PQuser(conn)
PGconn * conn
char *
PQhost(conn)
PGconn * conn
char *
PQoptions(conn)
PGconn * conn
char *
PQport(conn)
PGconn * conn
char *
PQtty(conn)
PGconn * conn
ConnStatusType
PQstatus(conn)
PGconn * conn
char *
PQerrorMessage(conn)
PGconn * conn
void
PQtrace(conn, debug_port)
PGconn * conn
FILE * debug_port
void
PQuntrace(conn)
PGconn * conn
PGresult *
PQexec(conn, query)
PGconn * conn
char * query
CODE:
RETVAL = PQexec(conn, query);
if (! RETVAL) { RETVAL = (PGresult *)calloc(1, sizeof(PGresult)); }
OUTPUT:
RETVAL
int
PQgetline(conn, string, length)
PREINIT:
SV *sv_buffer = SvROK(ST(1)) ? SvRV(ST(1)) : ST(1);
INPUT:
PGconn * conn
int length
char * string = sv_grow(sv_buffer, length);
CODE:
RETVAL = PQgetline(conn, string, length);
OUTPUT:
RETVAL
string
int
PQendcopy(conn)
PGconn * conn
void
PQputline(conn, string)
PGconn * conn
char * string
void
PQnotifies(conn)
PGconn * conn
PREINIT:
PGnotify *notify;
PPCODE:
notify = PQnotifies(conn);
if (notify) {
XPUSHs(sv_2mortal(newSVpv((char *)notify->relname, 0)));
XPUSHs(sv_2mortal(newSViv(notify->be_pid)));
free(notify);
}
ExecStatusType
PQresultStatus(res)
PGresult * res
int
PQntuples(res)
PGresult * res
int
PQnfields(res)
PGresult * res
char *
PQfname(res, field_num)
PGresult * res
int field_num
int
PQfnumber(res, field_name)
PGresult * res
char * field_name
Oid
PQftype(res, field_num)
PGresult * res
int field_num
int2
PQfsize(res, field_num)
PGresult * res
int field_num
char *
PQcmdStatus(res)
PGresult * res
char *
PQoidStatus(res)
PGresult * res
PREINIT:
const char *GAGA;
CODE:
GAGA = PQoidStatus(res);
RETVAL = (char *)GAGA;
OUTPUT:
RETVAL
char *
PQgetvalue(res, tup_num, field_num)
PGresult * res
int tup_num
int field_num
int
PQgetlength(res, tup_num, field_num)
PGresult * res
int tup_num
int field_num
int
PQgetisnull(res, tup_num, field_num)
PGresult * res
int tup_num
int field_num
void
PQclear(res)
PGresult * res
1997-06-02 21:42:14 +02:00
void
PQdisplayTuples(res, fp, fillAlign, fieldSep, printHeader, quiet)
PGresult * res
FILE * fp
int fillAlign
char * fieldSep
int printHeader
int quiet
CODE:
PQdisplayTuples(res, fp, fillAlign, (const char *)fieldSep, printHeader, quiet);
1997-04-29 21:37:10 +02:00
void
PQprintTuples(res, fout, printAttName, terseOutput, width)
PGresult * res
FILE * fout
int printAttName
int terseOutput
int width
void
PQprint(fout, res, header, align, standard, html3, expanded, pager, fieldSep, tableOpt, caption, ...)
FILE * fout
PGresult * res
bool header
bool align
bool standard
bool html3
bool expanded
bool pager
char * fieldSep
char * tableOpt
char * caption
PREINIT:
PQprintOpt ps;
int i;
CODE:
ps.header = header;
ps.align = align;
ps.standard = standard;
ps.html3 = html3;
ps.expanded = expanded;
ps.pager = pager;
ps.fieldSep = fieldSep;
ps.tableOpt = tableOpt;
ps.caption = caption;
Newz(0, ps.fieldName, items + 1 - 11, char*);
for (i = 11; i < items; i++) {
ps.fieldName[i - 11] = (char *)SvPV(ST(i), na);
}
PQprint(fout, res, &ps);
Safefree(ps.fieldName);
int
lo_open(conn, lobjId, mode)
PGconn * conn
Oid lobjId
int mode
ALIAS:
PQlo_open = 1
int
lo_close(conn, fd)
PGconn * conn
int fd
ALIAS:
PQlo_close = 1
int
lo_read(conn, fd, buf, len)
ALIAS:
PQlo_read = 1
PREINIT:
SV *sv_buffer = SvROK(ST(2)) ? SvRV(ST(2)) : ST(2);
INPUT:
PGconn * conn
int fd
int len
char * buf = sv_grow(sv_buffer, len + 1);
CLEANUP:
if (RETVAL >= 0) {
SvCUR(sv_buffer) = RETVAL;
SvPOK_only(sv_buffer);
*SvEND(sv_buffer) = '\0';
if (tainting) {
sv_magic(sv_buffer, 0, 't', 0, 0);
}
}
int
lo_write(conn, fd, buf, len)
PGconn * conn
int fd
char * buf
int len
ALIAS:
PQlo_write = 1
int
lo_lseek(conn, fd, offset, whence)
PGconn * conn
int fd
int offset
int whence
ALIAS:
PQlo_lseek = 1
Oid
lo_creat(conn, mode)
PGconn * conn
int mode
ALIAS:
PQlo_creat = 1
int
lo_tell(conn, fd)
PGconn * conn
int fd
ALIAS:
PQlo_tell = 1
int
lo_unlink(conn, lobjId)
PGconn * conn
Oid lobjId
ALIAS:
PQlo_unlink = 1
Oid
lo_import(conn, filename)
PGconn * conn
char * filename
ALIAS:
PQlo_import = 1
int
lo_export(conn, lobjId, filename)
PGconn * conn
Oid lobjId
char * filename
ALIAS:
PQlo_export = 1
PG_conn
connectdb(conninfo)
char * conninfo
CODE:
RETVAL = PQconnectdb((const char *)conninfo);
OUTPUT:
RETVAL
HV *
conndefaults()
CODE:
PQconninfoOption *infoOption;
RETVAL = newHV();
if (infoOption = PQconndefaults()) {
while (infoOption->keyword != NULL) {
hv_store(RETVAL, infoOption->keyword, strlen(infoOption->keyword), newSVpv(infoOption->val, 0), 0);
infoOption++;
}
}
OUTPUT:
RETVAL
PG_conn
setdb(pghost, pgport, pgoptions, pgtty, dbname)
char * pghost
char * pgport
char * pgoptions
char * pgtty
char * dbname
CODE:
RETVAL = PQsetdb(pghost, pgport, pgoptions, pgtty, dbname);
OUTPUT:
RETVAL
MODULE = Pg PACKAGE = PG_conn PREFIX = PQ
PROTOTYPES: DISABLE
void
DESTROY(conn)
PG_conn conn
CODE:
/* printf("DESTROY connection\n"); */
PQfinish(conn);
void
PQreset(conn)
PG_conn conn
char *
PQdb(conn)
PG_conn conn
char *
PQuser(conn)
PG_conn conn
char *
PQhost(conn)
PG_conn conn
char *
PQoptions(conn)
PG_conn conn
char *
PQport(conn)
PG_conn conn
char *
PQtty(conn)
PG_conn conn
ConnStatusType
PQstatus(conn)
PG_conn conn
char *
PQerrorMessage(conn)
PG_conn conn
void
PQtrace(conn, debug_port)
PG_conn conn
FILE * debug_port
void
PQuntrace(conn)
PG_conn conn
PG_result
PQexec(conn, query)
PG_conn conn
char * query
CODE:
RETVAL = PQexec(conn, query);
if (! RETVAL) { RETVAL = (PGresult *)calloc(1, sizeof(PGresult)); }
OUTPUT:
RETVAL
int
PQgetline(conn, string, length)
PREINIT:
SV *sv_buffer = SvROK(ST(1)) ? SvRV(ST(1)) : ST(1);
INPUT:
PG_conn conn
int length
char * string = sv_grow(sv_buffer, length);
CODE:
RETVAL = PQgetline(conn, string, length);
OUTPUT:
RETVAL
string
int
PQendcopy(conn)
PG_conn conn
void
PQputline(conn, string)
PG_conn conn
char * string
void
PQnotifies(conn)
PG_conn conn
PREINIT:
PGnotify *notify;
PPCODE:
notify = PQnotifies(conn);
if (notify) {
XPUSHs(sv_2mortal(newSVpv((char *)notify->relname, 0)));
XPUSHs(sv_2mortal(newSViv(notify->be_pid)));
free(notify);
}
int
lo_open(conn, lobjId, mode)
PG_conn conn
Oid lobjId
int mode
int
lo_close(conn, fd)
PG_conn conn
int fd
int
lo_read(conn, fd, buf, len)
PREINIT:
SV *sv_buffer = SvROK(ST(2)) ? SvRV(ST(2)) : ST(2);
INPUT:
PG_conn conn
int fd
int len
char * buf = sv_grow(sv_buffer, len + 1);
CLEANUP:
if (RETVAL >= 0) {
SvCUR(sv_buffer) = RETVAL;
SvPOK_only(sv_buffer);
*SvEND(sv_buffer) = '\0';
if (tainting) {
sv_magic(sv_buffer, 0, 't', 0, 0);
}
}
int
lo_write(conn, fd, buf, len)
PG_conn conn
int fd
char * buf
int len
int
lo_lseek(conn, fd, offset, whence)
PG_conn conn
int fd
int offset
int whence
Oid
lo_creat(conn, mode)
PG_conn conn
int mode
int
lo_tell(conn, fd)
PG_conn conn
int fd
int
lo_unlink(conn, lobjId)
PG_conn conn
Oid lobjId
Oid
lo_import(conn, filename)
PG_conn conn
char * filename
int
lo_export(conn, lobjId, filename)
PG_conn conn
Oid lobjId
char * filename
MODULE = Pg PACKAGE = PG_result PREFIX = PQ
PROTOTYPES: DISABLE
void
DESTROY(res)
PG_result res
CODE:
/* printf("DESTROY result\n"); */
PQclear(res);
ExecStatusType
PQresultStatus(res)
PG_result res
int
PQntuples(res)
PG_result res
int
PQnfields(res)
PG_result res
char *
PQfname(res, field_num)
PG_result res
int field_num
int
PQfnumber(res, field_name)
PG_result res
char * field_name
Oid
PQftype(res, field_num)
PG_result res
int field_num
int2
PQfsize(res, field_num)
PG_result res
int field_num
char *
PQcmdStatus(res)
PG_result res
char *
PQoidStatus(res)
PG_result res
PREINIT:
const char *GAGA;
CODE:
GAGA = PQoidStatus(res);
RETVAL = (char *)GAGA;
OUTPUT:
RETVAL
char *
PQgetvalue(res, tup_num, field_num)
PG_result res
int tup_num
int field_num
int
PQgetlength(res, tup_num, field_num)
PG_result res
int tup_num
int field_num
int
PQgetisnull(res, tup_num, field_num)
PG_result res
int tup_num
int field_num
1997-06-02 21:42:14 +02:00
void
PQdisplayTuples(res, fp, fillAlign, fieldSep, printHeader, quiet)
PGresult * res
FILE * fp
int fillAlign
char * fieldSep
int printHeader
int quiet
CODE:
PQdisplayTuples(res, fp, fillAlign, (const char *)fieldSep, printHeader, quiet);
1997-04-29 21:37:10 +02:00
void
PQprintTuples(res, fout, printAttName, terseOutput, width)
PG_result res
FILE * fout
int printAttName
int terseOutput
int width
void
PQprint(res, fout, header, align, standard, html3, expanded, pager, fieldSep, tableOpt, caption, ...)
FILE * fout
PG_result res
bool header
bool align
bool standard
bool html3
bool expanded
bool pager
char * fieldSep
char * tableOpt
char * caption
PREINIT:
PQprintOpt ps;
int i;
CODE:
ps.header = header;
ps.align = align;
ps.standard = standard;
ps.html3 = html3;
ps.expanded = expanded;
ps.pager = pager;
ps.fieldSep = fieldSep;
ps.tableOpt = tableOpt;
ps.caption = caption;
Newz(0, ps.fieldName, items + 1 - 11, char*);
for (i = 11; i < items; i++) {
ps.fieldName[i - 11] = (char *)SvPV(ST(i), na);
}
PQprint(fout, res, &ps);
Safefree(ps.fieldName);