1 /*-------------------------------------------------------------------------
4 * Functions for the built-in type tuple id
6 * Copyright (c) 1994, Regents of the University of California
10 * $Header: /cvsroot/pgsql/src/backend/utils/adt/tid.c,v 1.13 1999/12/20 01:23:04 tgl Exp $
13 * input routine largely stolen from boxin().
15 *-------------------------------------------------------------------------
19 #include "utils/builtins.h"
26 /* ----------------------------------------------------------------
28 * ----------------------------------------------------------------
31 tidin(const char *str)
38 BlockNumber blockNumber;
39 OffsetNumber offsetNumber;
44 for (i = 0, p = str; *p && i < NTIDARGS && *p != RDELIM; p++)
45 if (*p == DELIM || (*p == LDELIM && !i))
48 /* if (i < NTIDARGS - 1) */
51 elog(ERROR, "%s invalid tid format", str);
55 blockNumber = (BlockNumber) atoi(coord[0]);
56 offsetNumber = (OffsetNumber) atoi(coord[1]);
58 result = (ItemPointer) palloc(sizeof(ItemPointerData));
60 ItemPointerSet(result, blockNumber, offsetNumber);
65 /* ----------------------------------------------------------------
67 * ----------------------------------------------------------------
70 tidout(ItemPointer itemPtr)
72 BlockNumber blockNumber;
73 OffsetNumber offsetNumber;
77 static char *invalidTid = "()";
79 if (!itemPtr || !ItemPointerIsValid(itemPtr))
81 str = palloc(strlen(invalidTid));
82 strcpy(str, invalidTid);
86 blockId = &(itemPtr->ip_blkid);
88 blockNumber = BlockIdGetBlockNumber(blockId);
89 offsetNumber = itemPtr->ip_posid;
91 sprintf(buf, "(%d,%d)", blockNumber, offsetNumber);
93 str = (char *) palloc(strlen(buf) + 1);
99 /*****************************************************************************
101 *****************************************************************************/
104 tideq(ItemPointer arg1, ItemPointer arg2)
106 if ((!arg1) || (!arg2))
111 return ( BlockIdGetBlockNumber(&(arg1->ip_blkid)) ==
112 BlockIdGetBlockNumber(&(arg2->ip_blkid)) &&
113 arg1->ip_posid == arg2->ip_posid );
117 tidne(ItemPointer arg1, ItemPointer arg2)
119 if ((!arg1) || (!arg2))
123 return ( BlockIdGetBlockNumber(&(arg1->ip_blkid)) !=
124 BlockIdGetBlockNumber(&(arg2->ip_blkid)) ||
125 arg1->ip_posid != arg2->ip_posid );
129 tid_text(ItemPointer tid)
133 if (!tid) return (text *)NULL;
140 text_tid(const text *string)
145 if (!string) return (ItemPointer)0;
147 str = textout((text *) string);
156 * Functions to get latest tid of a specified tuple.
157 * Maybe these implementations is moved
160 #include <utils/relcache.h>
162 currtid_byreloid(Oid reloid, ItemPointer tid)
164 ItemPointer result = NULL, ret;
167 result = (ItemPointer) palloc(sizeof(ItemPointerData));
168 ItemPointerSetInvalid(result);
169 if (rel = heap_open(reloid, AccessShareLock), rel)
171 ret = heap_get_latest_tid(rel, SnapshotNow, tid);
173 ItemPointerCopy(ret, result);
174 heap_close(rel, AccessShareLock);
177 elog(ERROR, "Relation %u not found", reloid);
180 } /* currtid_byreloid() */
183 currtid_byrelname(const text *relname, ItemPointer tid)
185 ItemPointer result = NULL, ret;
189 if (!relname) return result;
191 str = textout((text *) relname);
193 result = (ItemPointer) palloc(sizeof(ItemPointerData));
194 ItemPointerSetInvalid(result);
195 if (rel = heap_openr(str, AccessShareLock), rel)
197 ret = heap_get_latest_tid(rel, SnapshotNow, tid);
199 ItemPointerCopy(ret, result);
200 heap_close(rel, AccessShareLock);
203 elog(ERROR, "Relation %s not found", relname);
207 } /* currtid_byrelname() */