diff options
Diffstat (limited to 'src/backend/utils/mmgr/portalmem.c')
-rw-r--r-- | src/backend/utils/mmgr/portalmem.c | 274 |
1 files changed, 0 insertions, 274 deletions
diff --git a/src/backend/utils/mmgr/portalmem.c b/src/backend/utils/mmgr/portalmem.c deleted file mode 100644 index 4805c4481c5..00000000000 --- a/src/backend/utils/mmgr/portalmem.c +++ /dev/null @@ -1,274 +0,0 @@ -/*------------------------------------------------------------------------- - * - * portalmem.c - * backend portal memory context management stuff - * - * Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group - * Portions Copyright (c) 1994, Regents of the University of California - * - * - * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/utils/mmgr/portalmem.c,v 1.49 2002/06/20 20:29:40 momjian Exp $ - * - *------------------------------------------------------------------------- - */ -/* - * NOTES - * A "Portal" is a structure used to keep track of cursor queries. - * - * When the backend sees a "declare cursor" query, it allocates a - * "PortalData" structure, plans the query and then stores the query - * in the portal without executing it. Later, when the backend - * sees a - * fetch 1 from FOO - * the system looks up the portal named "FOO" in the portal table, - * gets the planned query and then calls the executor with a count - * of 1. The executor then runs the query and returns a single - * tuple. The problem is that we have to hold onto the state of the - * portal query until we see a "close". This means we have to be - * careful about memory management. - * - * I hope this makes things clearer to whoever reads this -cim 2/22/91 - */ - -#include "postgres.h" - -#include "utils/hsearch.h" -#include "utils/memutils.h" -#include "utils/portal.h" - -/* ---------------- - * Global state - * ---------------- - */ - -#define MAX_PORTALNAME_LEN 64 - -typedef struct portalhashent -{ - char portalname[MAX_PORTALNAME_LEN]; - Portal portal; -} PortalHashEnt; - -static HTAB *PortalHashTable = NULL; - -#define PortalHashTableLookup(NAME, PORTAL) \ -do { \ - PortalHashEnt *hentry; char key[MAX_PORTALNAME_LEN]; \ - \ - MemSet(key, 0, MAX_PORTALNAME_LEN); \ - snprintf(key, MAX_PORTALNAME_LEN - 1, "%s", NAME); \ - hentry = (PortalHashEnt*)hash_search(PortalHashTable, \ - key, HASH_FIND, NULL); \ - if (hentry) \ - PORTAL = hentry->portal; \ - else \ - PORTAL = NULL; \ -} while(0) - -#define PortalHashTableInsert(PORTAL) \ -do { \ - PortalHashEnt *hentry; bool found; char key[MAX_PORTALNAME_LEN]; \ - \ - MemSet(key, 0, MAX_PORTALNAME_LEN); \ - snprintf(key, MAX_PORTALNAME_LEN - 1, "%s", PORTAL->name); \ - hentry = (PortalHashEnt*)hash_search(PortalHashTable, \ - key, HASH_ENTER, &found); \ - if (hentry == NULL) \ - elog(ERROR, "out of memory in PortalHashTable"); \ - if (found) \ - elog(WARNING, "trying to insert a portal name that exists."); \ - hentry->portal = PORTAL; \ -} while(0) - -#define PortalHashTableDelete(PORTAL) \ -do { \ - PortalHashEnt *hentry; char key[MAX_PORTALNAME_LEN]; \ - \ - MemSet(key, 0, MAX_PORTALNAME_LEN); \ - snprintf(key, MAX_PORTALNAME_LEN - 1, "%s", PORTAL->name); \ - hentry = (PortalHashEnt*)hash_search(PortalHashTable, \ - key, HASH_REMOVE, NULL); \ - if (hentry == NULL) \ - elog(WARNING, "trying to delete portal name that does not exist."); \ -} while(0) - -static MemoryContext PortalMemory = NULL; - - -/* ---------------------------------------------------------------- - * public portal interface functions - * ---------------------------------------------------------------- - */ - -/* - * EnablePortalManager - * Enables the portal management module at backend startup. - */ -void -EnablePortalManager(void) -{ - HASHCTL ctl; - - Assert(PortalMemory == NULL); - - PortalMemory = AllocSetContextCreate(TopMemoryContext, - "PortalMemory", - ALLOCSET_DEFAULT_MINSIZE, - ALLOCSET_DEFAULT_INITSIZE, - ALLOCSET_DEFAULT_MAXSIZE); - - ctl.keysize = MAX_PORTALNAME_LEN; - ctl.entrysize = sizeof(PortalHashEnt); - - /* - * use PORTALS_PER_USER, defined in utils/portal.h as a guess of how - * many hash table entries to create, initially - */ - PortalHashTable = hash_create("Portal hash", PORTALS_PER_USER, - &ctl, HASH_ELEM); -} - -/* - * GetPortalByName - * Returns a portal given a portal name, or NULL if name not found. - */ -Portal -GetPortalByName(char *name) -{ - Portal portal; - - if (PointerIsValid(name)) - PortalHashTableLookup(name, portal); - else - portal = NULL; - - return portal; -} - -/* - * PortalSetQuery - * Attaches a "query" to portal. - * - * Exceptions: - * BadState if called when disabled. - * BadArg if portal is invalid. - * BadArg if queryDesc is "invalid." - * BadArg if state is "invalid." - */ -void -PortalSetQuery(Portal portal, - QueryDesc *queryDesc, - TupleDesc attinfo, - EState *state, - void (*cleanup) (Portal portal)) -{ - AssertArg(PortalIsValid(portal)); - AssertArg(IsA((Node *) state, EState)); - - portal->queryDesc = queryDesc; - portal->attinfo = attinfo; - portal->state = state; - portal->atStart = true; /* Allow fetch forward only */ - portal->atEnd = false; - portal->cleanup = cleanup; -} - -/* - * CreatePortal - * Returns a new portal given a name. - * - * Exceptions: - * BadState if called when disabled. - * BadArg if portal name is invalid. - * "WARNING" if portal name is in use (existing portal is returned!) - */ -Portal -CreatePortal(char *name) -{ - Portal portal; - - AssertArg(PointerIsValid(name)); - - portal = GetPortalByName(name); - if (PortalIsValid(portal)) - { - elog(WARNING, "CreatePortal: portal \"%s\" already exists", name); - return portal; - } - - /* make new portal structure */ - portal = (Portal) MemoryContextAlloc(PortalMemory, sizeof *portal); - - /* initialize portal name */ - portal->name = MemoryContextStrdup(PortalMemory, name); - - /* initialize portal heap context */ - portal->heap = AllocSetContextCreate(PortalMemory, - "PortalHeapMemory", - ALLOCSET_DEFAULT_MINSIZE, - ALLOCSET_DEFAULT_INITSIZE, - ALLOCSET_DEFAULT_MAXSIZE); - - /* initialize portal query */ - portal->queryDesc = NULL; - portal->attinfo = NULL; - portal->state = NULL; - portal->atStart = true; /* disallow fetches until query is set */ - portal->atEnd = true; - portal->cleanup = NULL; - - /* put portal in table */ - PortalHashTableInsert(portal); - - return portal; -} - -/* - * PortalDrop - * Destroys portal. - * - * Exceptions: - * BadState if called when disabled. - * BadArg if portal is invalid. - */ -void -PortalDrop(Portal portal) -{ - AssertArg(PortalIsValid(portal)); - - /* remove portal from hash table */ - PortalHashTableDelete(portal); - - /* reset portal */ - if (PointerIsValid(portal->cleanup)) - (*portal->cleanup) (portal); - - /* release subsidiary storage */ - MemoryContextDelete(PortalGetHeapMemory(portal)); - - /* release name and portal data (both are in PortalMemory) */ - pfree(portal->name); - pfree(portal); -} - -/* - * Destroy all portals created in the current transaction (ie, all of them). - * - * XXX This assumes that portals can be deleted in a random order, ie, - * no portal has a reference to any other (at least not one that will be - * exercised during deletion). I think this is okay at the moment, but - * we've had bugs of that ilk in the past. Keep a close eye on cursor - * references... - */ -void -AtEOXact_portals(void) -{ - HASH_SEQ_STATUS status; - PortalHashEnt *hentry; - - hash_seq_init(&status, PortalHashTable); - - while ((hentry = (PortalHashEnt *) hash_seq_search(&status)) != NULL) - PortalDrop(hentry->portal); -} |