diff options
Diffstat (limited to 'src/backend/libpq/portal.c')
-rw-r--r-- | src/backend/libpq/portal.c | 643 |
1 files changed, 0 insertions, 643 deletions
diff --git a/src/backend/libpq/portal.c b/src/backend/libpq/portal.c deleted file mode 100644 index 4c97dd1cf11..00000000000 --- a/src/backend/libpq/portal.c +++ /dev/null @@ -1,643 +0,0 @@ -/*------------------------------------------------------------------------- - * - * portal.c - * generalized portal support routines - * - * Portions Copyright (c) 1996-2000, PostgreSQL, Inc - * Portions Copyright (c) 1994, Regents of the University of California - * - * $Id: portal.c,v 1.30 2000/03/17 02:36:08 tgl Exp $ - * - *------------------------------------------------------------------------- - */ -/* - * INTERFACE ROUTINES - * PQnportals - Return the number of open portals. - * PQpnames - Return all the portal names - * PQparray - Return the portal buffer given a portal name - * PQrulep - Return 1 if an asynchronous portal - * PQntuples - Return the number of tuples in a portal buffer - * PQninstances - same as PQntuples using object terminology - * PQngroups - Return the number of tuple groups in a portal buffer - * PQntuplesGroup - Return the number of tuples in a tuple group - * PQninstancesGroup - same as PQntuplesGroup using object terminology - * PQnfieldsGroup - Return the number of fields in a tuple group - * PQfnumberGroup - Return field number given (group index, field name) - * PQftypeGroup - Return field type given (group index, field index) - * PQfsizeGroup - Return field size given (group index, field index) - * PQfnameGroup - Return field name given (group index, field index) - * PQgroup - Return the tuple group that a particular tuple is in - * PQgetgroup - Return the index of the group that a tuple is in - * PQnfields - Return the number of fields in a tuple - * PQfnumber - Return the field index of a field name in a tuple - * PQfname - Return the name of a field - * PQftype - Return the type of a field - * PQfsize - Return the size of a field - * PQftype - Return the type of a field - * PQsametype - Return 1 if the two tuples have the same type - * PQgetvalue - Return an attribute (field) value - * PQgetlength - Return an attribute (field) length - * PQclear - free storage claimed by named portal - * - * NOTES - * These functions may be used by both frontend routines which - * communicate with a backend or by user-defined functions which - * are compiled or dynamically loaded into a backend. - * - * the *portals array should be organized as a hash table for - * quick portal-by-name lookup. - * - * Do not confuse "PortalEntry" (or "PortalBuffer") with "Portal" - * see utils/mmgr/portalmem.c for why. -cim 2/22/91 - * - */ - -#include "postgres.h" - -#include "libpq/libpq.h" - - -/* ---------------------------------------------------------------- - * Helper routines for PQ portal interface routines below - * ---------------------------------------------------------------- - */ - -static int -in_range(char *msg, int value, int min, int max) -{ - if (value < min || value >= max) - { - snprintf(PQerrormsg, PQERRORMSG_LENGTH, - "FATAL: %s, %d is not in range [%d,%d)\n", msg, value, min, max); - pqdebug("%s", PQerrormsg); - fputs(PQerrormsg, stderr); - return 0; - } - return 1; -} - -static int -valid_pointer(char *msg, void *ptr) -{ - if (!ptr) - { - snprintf(PQerrormsg, PQERRORMSG_LENGTH, "FATAL: %s\n", msg); - pqdebug("%s", PQerrormsg); - fputs(PQerrormsg, stderr); - return 0; - } - return 1; -} - - -/* ---------------------------------------------------------------- - * PQ portal interface routines - * ---------------------------------------------------------------- - */ - -/* -------------------------------- - * PQnportals - Return the number of open portals. - * If rule_p, only return asynchronous portals. - * -------------------------------- - */ -int -PQnportals(int rule_p) -{ - int i, - n = 0; - - for (i = 0; i < (int) portals_array_size; ++i) - { - if (portals[i] && portals[i]->portal) - { - if (!rule_p || portals[i]->portal->rule_p) - ++n; - } - } - return n; -} - -/* -------------------------------- - * PQpnames - Return all the portal names - * If rule_p, only return asynchronous portals. - * - * the caller must have allocated sufficient memory for char** pnames - * (an array of PQnportals strings of length PortalNameLength). - * - * notice that this assumes that the user is calling PQnportals and - * PQpnames with the same rule_p argument, and with no intervening - * portal closures. if not, you can get in heap big trouble.. - * -------------------------------- - */ -void -PQpnames(char **pnames, int rule_p) -{ - int i, - cur_pname = 0; - - if (!valid_pointer("PQpnames: invalid name buffer", pnames)) - return; - - for (i = 0; i < (int) portals_array_size; ++i) - { - if (portals[i] && portals[i]->portal) - { - if (!rule_p || portals[i]->portal->rule_p) - { - strncpy(pnames[cur_pname], portals[i]->name, PortalNameLength + 1); - ++cur_pname; - } - } - } -} - -/* -------------------------------- - * PQparray - Return the portal buffer given a portal name - * -------------------------------- - */ -PortalBuffer * -PQparray(char *pname) -{ - int i; - - if (!valid_pointer("PQparray: invalid name buffer", pname)) - return NULL; - - if ((i = pbuf_getIndex(pname)) < 0) - return (PortalBuffer *) NULL; - return portals[i]->portal; -} - -/* -------------------------------- - * PQrulep - Return 1 if an asynchronous portal - * -------------------------------- - */ -int -PQrulep(PortalBuffer *portal) -{ - if (!valid_pointer("PQrulep: invalid portal pointer", portal)) - return -1; - - return portal->rule_p; -} - -/* -------------------------------- - * PQntuples - Return the number of tuples in a portal buffer - * -------------------------------- - */ -int -PQntuples(PortalBuffer *portal) -{ - if (!valid_pointer("PQntuples: invalid portal pointer", portal)) - return -1; - - return portal->no_tuples; -} - -int -PQninstances(PortalBuffer *portal) -{ - return PQntuples(portal); -} - -/* -------------------------------- - * PQngroups - Return the number of tuple groups in a portal buffer - * -------------------------------- - */ -int -PQngroups(PortalBuffer *portal) -{ - if (!valid_pointer("PQngroups: invalid portal pointer", portal)) - return -1; - - return portal->no_groups; -} - -/* -------------------------------- - * PQntuplesGroup - Return the number of tuples in a tuple group - * -------------------------------- - */ -int -PQntuplesGroup(PortalBuffer *portal, int group_index) -{ - GroupBuffer *gbp; - - if (!valid_pointer("PQntuplesGroup: invalid portal pointer", portal) || - !in_range("PQntuplesGroup: group index", - group_index, 0, portal->no_groups)) - return -1; - - gbp = pbuf_findGroup(portal, group_index); - if (gbp) - return gbp->no_tuples; - return -1; -} - -int -PQninstancesGroup(PortalBuffer *portal, int group_index) -{ - return PQntuplesGroup(portal, group_index); -} - -/* -------------------------------- - * PQnfieldsGroup - Return the number of fields in a tuple group - * -------------------------------- - */ -int -PQnfieldsGroup(PortalBuffer *portal, int group_index) -{ - GroupBuffer *gbp; - - if (!valid_pointer("PQnfieldsGroup: invalid portal pointer", portal) || - !in_range("PQnfieldsGroup: group index", - group_index, 0, portal->no_groups)) - return -1; - gbp = pbuf_findGroup(portal, group_index); - if (gbp) - return gbp->no_fields; - return -1; -} - -/* -------------------------------- - * PQfnumberGroup - Return the field number (index) given - * the group index and the field name - * -------------------------------- - */ -int -PQfnumberGroup(PortalBuffer *portal, int group_index, char *field_name) -{ - GroupBuffer *gbp; - - if (!valid_pointer("PQfnumberGroup: invalid portal pointer", portal) || - !valid_pointer("PQfnumberGroup: invalid field name pointer", - field_name) || - !in_range("PQfnumberGroup: group index", - group_index, 0, portal->no_groups)) - return -1; - gbp = pbuf_findGroup(portal, group_index); - if (gbp) - return pbuf_findFnumber(gbp, field_name); - return -1; -} - -/* -------------------------------- - * PQfnameGroup - Return the field (attribute) name given - * the group index and field index. - * -------------------------------- - */ -char * -PQfnameGroup(PortalBuffer *portal, int group_index, int field_number) -{ - GroupBuffer *gbp; - - if (!valid_pointer("PQfnameGroup: invalid portal pointer", portal) || - !in_range("PQfnameGroup: group index", - group_index, 0, portal->no_groups)) - return (char *) NULL; - - if ((gbp = pbuf_findGroup(portal, group_index)) && - in_range("PQfnameGroup: field number", - field_number, 0, gbp->no_fields)) - return pbuf_findFname(gbp, field_number); - return (char *) NULL; -} - -/* -------------------------------- - * PQftypeGroup - Return the type of a field given - * the group index and field index - * -------------------------------- - */ -int -PQftypeGroup(PortalBuffer *portal, int group_index, int field_number) -{ - GroupBuffer *gbp; - - if (!valid_pointer("PQftypeGroup: invalid portal pointer", portal) || - !in_range("PQftypeGroup: group index", - group_index, 0, portal->no_groups)) - return -1; - - if ((gbp = pbuf_findGroup(portal, group_index)) && - in_range("PQftypeGroup: field number", field_number, 0, gbp->no_fields)) - return gbp->types[field_number].typid; - return -1; -} - -/* -------------------------------- - * PQfsizeGroup - Return the size of a field given - * the group index and field index - * -------------------------------- - */ -int -PQfsizeGroup(PortalBuffer *portal, int group_index, int field_number) -{ - GroupBuffer *gbp; - - if (!valid_pointer("PQfsizeGroup: invalid portal pointer", portal) || - !in_range("PQfsizeGroup: tuple index", - group_index, 0, portal->no_groups)) - return -1; - - if ((gbp = pbuf_findGroup(portal, group_index)) && - in_range("PQfsizeGroup: field number", field_number, 0, gbp->no_fields)) - return gbp->types[field_number].typlen; - return -1; -} - - -/* -------------------------------- - * PQgroup - Return the tuple group that a particular tuple is in - * -------------------------------- - */ -GroupBuffer * -PQgroup(PortalBuffer *portal, int tuple_index) -{ - GroupBuffer *gbp; - int tuple_count = 0; - - if (!valid_pointer("PQgroup: invalid portal pointer", portal) || - !in_range("PQgroup: tuple index", - tuple_index, 0, portal->no_tuples)) - return (GroupBuffer *) NULL; - - for (gbp = portal->groups; - gbp && tuple_index >= (tuple_count += gbp->no_tuples); - gbp = gbp->next) - ; - if (!in_range("PQgroup: tuple not found: tuple index", - tuple_index, 0, tuple_count)) - return (GroupBuffer *) NULL; - return gbp; -} - -/* -------------------------------- - * PQgetgroup - Return the index of the group that a - * particular tuple is in - * -------------------------------- - */ -int -PQgetgroup(PortalBuffer *portal, int tuple_index) -{ - GroupBuffer *gbp; - int tuple_count = 0, - group_count = 0; - - if (!valid_pointer("PQgetgroup: invalid portal pointer", portal) || - !in_range("PQgetgroup: tuple index", - tuple_index, 0, portal->no_tuples)) - return -1; - - for (gbp = portal->groups; - gbp && tuple_index >= (tuple_count += gbp->no_tuples); - gbp = gbp->next) - ++group_count; - if (!gbp || !in_range("PQgetgroup: tuple not found: tuple index", - tuple_index, 0, tuple_count)) - return -1; - return group_count; -} - -/* -------------------------------- - * PQnfields - Return the number of fields in a tuple - * -------------------------------- - */ -int -PQnfields(PortalBuffer *portal, int tuple_index) -{ - GroupBuffer *gbp; - - if (!valid_pointer("PQnfields: invalid portal pointer", portal) || - !in_range("PQnfields: tuple index", - tuple_index, 0, portal->no_tuples)) - return -1; - gbp = PQgroup(portal, tuple_index); - if (gbp) - return gbp->no_fields; - return -1; -} - -/* -------------------------------- - * PQfnumber - Return the field index of a given - * field name within a tuple. - * -------------------------------- - */ -int -PQfnumber(PortalBuffer *portal, int tuple_index, char *field_name) -{ - GroupBuffer *gbp; - - if (!valid_pointer("PQfnumber: invalid portal pointer", portal) || - !valid_pointer("PQfnumber: invalid field name pointer", field_name) || - !in_range("PQfnumber: tuple index", - tuple_index, 0, portal->no_tuples)) - return -1; - gbp = PQgroup(portal, tuple_index); - if (gbp) - return pbuf_findFnumber(gbp, field_name); - return -1; -} - -/* -------------------------------- - * PQfname - Return the name of a field - * -------------------------------- - */ -char * -PQfname(PortalBuffer *portal, int tuple_index, int field_number) -{ - GroupBuffer *gbp; - - if (!valid_pointer("PQfname: invalid portal pointer", portal) || - !in_range("PQfname: tuple index", - tuple_index, 0, portal->no_tuples)) - return (char *) NULL; - - if ((gbp = PQgroup(portal, tuple_index)) && - in_range("PQfname: field number", - field_number, 0, gbp->no_fields)) - return pbuf_findFname(gbp, field_number); - return (char *) NULL; -} - -/* -------------------------------- - * PQftype - Return the type of a field - * -------------------------------- - */ -int -PQftype(PortalBuffer *portal, int tuple_index, int field_number) -{ - GroupBuffer *gbp; - - if (!valid_pointer("PQftype: invalid portal pointer", portal) || - !in_range("PQfname: tuple index", - tuple_index, 0, portal->no_tuples)) - return -1; - - if ((gbp = PQgroup(portal, tuple_index)) && - in_range("PQftype: field number", field_number, 0, gbp->no_fields)) - return gbp->types[field_number].typid; - return -1; -} - -/* -------------------------------- - * PQfsize - Return the size of a field - * -------------------------------- - */ -int -PQfsize(PortalBuffer *portal, int tuple_index, int field_number) -{ - GroupBuffer *gbp; - - if (!valid_pointer("PQfsize: invalid portal pointer", portal) || - !in_range("PQfsize: tuple index", - tuple_index, 0, portal->no_tuples)) - return -1; - - if ((gbp = PQgroup(portal, tuple_index)) && - in_range("PQfsize: field number", field_number, 0, gbp->no_fields)) - return gbp->types[field_number].typlen; - return -1; -} - - - -/* -------------------------------- - * PQsametype - Return 1 if the two tuples have the same type - * (in the same group) - * -------------------------------- - */ -int -PQsametype(PortalBuffer *portal, int tuple_index1, int tuple_index2) -{ - GroupBuffer *gbp1, - *gbp2; - - if (!valid_pointer("PQsametype: invalid portal pointer", portal) || - !in_range("PQsametype: tuple index 1", - tuple_index1, 0, portal->no_tuples) || - !in_range("PQsametype: tuple index 2", - tuple_index2, 0, portal->no_tuples)) - return -1; - - gbp1 = PQgroup(portal, tuple_index1); - gbp2 = PQgroup(portal, tuple_index2); - if (gbp1 && gbp2) - return gbp1 == gbp2; - return -1; -} - -static TupleBlock * -PQGetTupleBlock(PortalBuffer *portal, - int tuple_index, - int *tuple_offset) -{ - GroupBuffer *gbp; - TupleBlock *tbp; - int tuple_count = 0; - - if (!valid_pointer("PQGetTupleBlock: invalid portal pointer", portal) || - !valid_pointer("PQGetTupleBlock: invalid offset pointer", - tuple_offset) || - !in_range("PQGetTupleBlock: tuple index", - tuple_index, 0, portal->no_tuples)) - return (TupleBlock *) NULL; - - for (gbp = portal->groups; - gbp && tuple_index >= (tuple_count += gbp->no_tuples); - gbp = gbp->next) - ; - if (!gbp || - !in_range("PQGetTupleBlock: tuple not found: tuple index", - tuple_index, 0, tuple_count)) - return (TupleBlock *) NULL; - tuple_count -= gbp->no_tuples; - for (tbp = gbp->tuples; - tbp && tuple_index >= (tuple_count += TupleBlockSize); - tbp = tbp->next) - ; - if (!tbp || - !in_range("PQGetTupleBlock: tuple not found: tuple index", - tuple_index, 0, tuple_count)) - return (TupleBlock *) NULL; - tuple_count -= TupleBlockSize; - - *tuple_offset = tuple_index - tuple_count; - return tbp; -} - -/* -------------------------------- - * PQgetvalue - Return an attribute (field) value - * -------------------------------- - */ -char * -PQgetvalue(PortalBuffer *portal, - int tuple_index, - int field_number) -{ - TupleBlock *tbp; - int tuple_offset; - - tbp = PQGetTupleBlock(portal, tuple_index, &tuple_offset); - if (tbp) - return tbp->values[tuple_offset][field_number]; - return (char *) NULL; -} - -/* -------------------------------- - * PQgetAttr - Return an attribute (field) value - * this differs from PQgetvalue in that the value returned is - * a copy. The CALLER is responsible for free'ing the data returned. - * -------------------------------- - */ -char * -PQgetAttr(PortalBuffer *portal, - int tuple_index, - int field_number) -{ - TupleBlock *tbp; - int tuple_offset; - int len; - char *result = NULL; - - tbp = PQGetTupleBlock(portal, tuple_index, &tuple_offset); - if (tbp) - { - len = tbp->lengths[tuple_offset][field_number]; - result = palloc(len + 1); - memcpy(result, - tbp->values[tuple_offset][field_number], - len); - result[len] = '\0'; - } - return result; -} - - -/* -------------------------------- - * PQgetlength - Return an attribute (field) length - * -------------------------------- - */ -int -PQgetlength(PortalBuffer *portal, - int tuple_index, - int field_number) -{ - TupleBlock *tbp; - int tuple_offset; - - tbp = PQGetTupleBlock(portal, tuple_index, &tuple_offset); - if (tbp) - return tbp->lengths[tuple_offset][field_number]; - return -1; -} - -/* ---------------- - * PQclear - free storage claimed by named portal - * ---------------- - */ -void -PQclear(char *pname) -{ - if (!valid_pointer("PQclear: invalid portal name pointer", pname)) - return; - pbuf_close(pname); -} |