⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pg.xs

📁 关系型数据库 Postgresql 6.5.2
💻 XS
📖 第 1 页 / 共 2 页
字号:
/*------------------------------------------------------- * * $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 + -