diff options
| author | Edmund Mergl | 1997-04-29 19:37:10 +0000 |
|---|---|---|
| committer | Edmund Mergl | 1997-04-29 19:37:10 +0000 |
| commit | 0aba92a2c5684ec141ba3dfcab808d86cd7c2882 (patch) | |
| tree | 97457fb3a29967b3bd6ea4e7e96b25ceeb932e4b /src/interfaces/perl5/Pg.xs | |
| parent | a2fd844c3bb7076874baf6ecb96528cb81b33640 (diff) | |
creation for postgresql-6.1
Diffstat (limited to 'src/interfaces/perl5/Pg.xs')
| -rw-r--r-- | src/interfaces/perl5/Pg.xs | 948 |
1 files changed, 948 insertions, 0 deletions
diff --git a/src/interfaces/perl5/Pg.xs b/src/interfaces/perl5/Pg.xs new file mode 100644 index 00000000000..8cffb5afd69 --- /dev/null +++ b/src/interfaces/perl5/Pg.xs @@ -0,0 +1,948 @@ +/*------------------------------------------------------- + * + * $Id: Pg.xs,v 1.1.1.1 1997/04/29 19:37:10 mergl Exp $ + * + * 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 + + +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 + + +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); + |
