📄 pg.xs
字号:
/*------------------------------------------------------- * * $Id: Pg.xs,v 1.12 1999/02/19 23:27:17 tgl Exp $ * * Copyright (c) 1997, 1998 Edmund Mergl * *-------------------------------------------------------*/#include "EXTERN.h"#include "perl.h"#include "XSUB.h"#include <string.h>#include <stdio.h>#include <fcntl.h>#include "libpq-fe.h"typedef struct pg_conn *PG_conn;typedef struct pg_result *PG_result;typedef struct pg_results{ PGresult *result; int row;} PGresults;typedef struct pg_results *PG_results;static doubleconstant(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 = PgPROTOTYPES: DISABLEdoubleconstant(name,arg) char * name int argPGconn *PQconnectdb(conninfo) char * conninfo CODE: /* convert dbname to lower case if not surrounded by double quotes */ char *ptr = strstr(conninfo, "dbname"); if (ptr) { while (*ptr && *ptr != '=') { ptr++; } ptr++; while (*ptr == ' ' || *ptr == '\t') { ptr++; } if (*ptr == '"') { *ptr++ = ' '; while (*ptr && *ptr != '"') { ptr++; } if (*ptr == '"') { *ptr++ = ' '; } } else { while (*ptr && *ptr != ' ' && *ptr != '\t') { *ptr = tolower(*ptr); ptr++; } } } RETVAL = PQconnectdb((const char *)conninfo); OUTPUT: RETVALPGconn *PQsetdbLogin(pghost, pgport, pgoptions, pgtty, dbname, login, pwd) char * pghost char * pgport char * pgoptions char * pgtty char * dbname char * login char * pwdPGconn *PQsetdb(pghost, pgport, pgoptions, pgtty, dbname) char * pghost char * pgport char * pgoptions char * pgtty char * dbnameHV *PQconndefaults() CODE: PQconninfoOption *infoOption; RETVAL = newHV(); if (infoOption = PQconndefaults()) { while (infoOption->keyword != NULL) { if (infoOption->val != NULL) { hv_store(RETVAL, infoOption->keyword, strlen(infoOption->keyword), newSVpv(infoOption->val, 0), 0); } else { hv_store(RETVAL, infoOption->keyword, strlen(infoOption->keyword), newSVpv("", 0), 0); } infoOption++; } } OUTPUT: RETVALvoidPQfinish(conn) PGconn * connvoidPQreset(conn) PGconn * connintPQrequestCancel(conn) PGconn * connchar *PQdb(conn) PGconn * connchar *PQuser(conn) PGconn * connchar *PQpass(conn) PGconn * connchar *PQhost(conn) PGconn * connchar *PQport(conn) PGconn * connchar *PQtty(conn) PGconn * connchar *PQoptions(conn) PGconn * connConnStatusTypePQstatus(conn) PGconn * connchar *PQerrorMessage(conn) PGconn * connintPQsocket(conn) PGconn * connintPQbackendPID(conn) PGconn * connvoidPQtrace(conn, debug_port) PGconn * conn FILE * debug_portvoidPQuntrace(conn) PGconn * connPGresult *PQexec(conn, query) PGconn * conn char * query CODE: RETVAL = PQexec(conn, query); if (! RETVAL) { RETVAL = PQmakeEmptyPGresult(conn, PGRES_FATAL_ERROR); } OUTPUT: RETVALvoidPQnotifies(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); }intPQsendQuery(conn, query) PGconn * conn char * queryPGresult *PQgetResult(conn) PGconn * conn CODE: RETVAL = PQgetResult(conn); if (! RETVAL) { RETVAL = PQmakeEmptyPGresult(conn, PGRES_FATAL_ERROR); } OUTPUT: RETVALintPQisBusy(conn) PGconn * connintPQconsumeInput(conn) PGconn * connintPQgetline(conn, string, length) PREINIT: SV *bufsv = SvROK(ST(1)) ? SvRV(ST(1)) : ST(1); INPUT: PGconn * conn int length char * string = sv_grow(bufsv, length); CODE: RETVAL = PQgetline(conn, string, length); OUTPUT: RETVAL stringintPQputline(conn, string) PGconn * conn char * stringintPQgetlineAsync(conn, buffer, bufsize) PREINIT: SV *bufsv = SvROK(ST(1)) ? SvRV(ST(1)) : ST(1); INPUT: PGconn * conn int bufsize char * buffer = sv_grow(bufsv, bufsize); CODE: RETVAL = PQgetlineAsync(conn, buffer, bufsize); OUTPUT: RETVAL bufferintPQputnbytes(conn, buffer, nbytes) PGconn * conn char * buffer int nbytesintPQendcopy(conn) PGconn * connPGresult *PQmakeEmptyPGresult(conn, status) PGconn * conn ExecStatusType statusExecStatusTypePQresultStatus(res) PGresult * resintPQntuples(res) PGresult * resintPQnfields(res) PGresult * resintPQbinaryTuples(res) PGresult * reschar *PQfname(res, field_num) PGresult * res int field_numintPQfnumber(res, field_name) PGresult * res char * field_nameOidPQftype(res, field_num) PGresult * res int field_numshortPQfsize(res, field_num) PGresult * res int field_numintPQfmod(res, field_num) PGresult * res int field_numchar *PQcmdStatus(res) PGresult * reschar *PQoidStatus(res) PGresult * res CODE: RETVAL = (char *)PQoidStatus(res); OUTPUT: RETVALchar *PQcmdTuples(res) PGresult * res CODE: RETVAL = (char *)PQcmdTuples(res); OUTPUT: RETVALchar *PQgetvalue(res, tup_num, field_num) PGresult * res int tup_num int field_numintPQgetlength(res, tup_num, field_num) PGresult * res int tup_num int field_numintPQgetisnull(res, tup_num, field_num) PGresult * res int tup_num int field_numvoidPQclear(res) PGresult * resvoidPQprint(fout, res, header, align, standard, html3, expanded, pager, fieldSep, tableOpt, caption, ...) FILE * fout PGresult * res pqbool header pqbool align pqbool standard pqbool html3 pqbool expanded pqbool 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);voidPQdisplayTuples(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);voidPQprintTuples(res, fout, printAttName, terseOutput, width) PGresult * res FILE * fout int printAttName int terseOutput int widthintlo_open(conn, lobjId, mode) PGconn * conn Oid lobjId int mode ALIAS: PQlo_open = 1intlo_close(conn, fd) PGconn * conn int fd ALIAS: PQlo_close = 1intlo_read(conn, fd, buf, len) ALIAS: PQlo_read = 1 PREINIT: SV *bufsv = SvROK(ST(2)) ? SvRV(ST(2)) : ST(2); INPUT: PGconn * conn int fd int len char * buf = sv_grow(bufsv, len + 1); CODE: RETVAL = lo_read(conn, fd, buf, len); if (RETVAL > 0) { SvCUR_set(bufsv, RETVAL); *SvEND(bufsv) = '\0'; } OUTPUT: RETVAL bufintlo_write(conn, fd, buf, len) PGconn * conn int fd char * buf int len ALIAS: PQlo_write = 1intlo_lseek(conn, fd, offset, whence) PGconn * conn
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -