1 /*-------------------------------------------------------------------------
4 * Functions for the built-in type tuple id
6 * Portions Copyright (c) 1996-2000, PostgreSQL, Inc
7 * Portions Copyright (c) 1994, Regents of the University of California
11 * $Header: /cvsroot/pgsql/src/backend/utils/adt/tid.c,v 1.21 2000/07/05 23:11:35 tgl Exp $
14 * input routine largely stolen from boxin().
16 *-------------------------------------------------------------------------
21 #include "access/heapam.h"
22 #include "utils/builtins.h"
29 /* ----------------------------------------------------------------
31 * ----------------------------------------------------------------
34 tidin(const char *str)
41 BlockNumber blockNumber;
42 OffsetNumber offsetNumber;
47 for (i = 0, p = str; *p && i < NTIDARGS && *p != RDELIM; p++)
48 if (*p == DELIM || (*p == LDELIM && !i))
51 /* if (i < NTIDARGS - 1) */
54 elog(ERROR, "%s invalid tid format", str);
58 blockNumber = (BlockNumber) atoi(coord[0]);
59 offsetNumber = (OffsetNumber) atoi(coord[1]);
61 result = (ItemPointer) palloc(sizeof(ItemPointerData));
63 ItemPointerSet(result, blockNumber, offsetNumber);
68 /* ----------------------------------------------------------------
70 * ----------------------------------------------------------------
73 tidout(ItemPointer itemPtr)
75 BlockNumber blockNumber;
76 OffsetNumber offsetNumber;
80 static char *invalidTid = "()";
82 if (!itemPtr || !ItemPointerIsValid(itemPtr))
84 str = palloc(strlen(invalidTid));
85 strcpy(str, invalidTid);
89 blockId = &(itemPtr->ip_blkid);
91 blockNumber = BlockIdGetBlockNumber(blockId);
92 offsetNumber = itemPtr->ip_posid;
94 sprintf(buf, "(%d,%d)", blockNumber, offsetNumber);
96 str = (char *) palloc(strlen(buf) + 1);
102 /*****************************************************************************
104 *****************************************************************************/
107 tideq(ItemPointer arg1, ItemPointer arg2)
109 if ((!arg1) || (!arg2))
112 return (BlockIdGetBlockNumber(&(arg1->ip_blkid)) ==
113 BlockIdGetBlockNumber(&(arg2->ip_blkid)) &&
114 arg1->ip_posid == arg2->ip_posid);
119 tidne(ItemPointer arg1, ItemPointer arg2)
121 if ((!arg1) || (!arg2))
123 return (BlockIdGetBlockNumber(&(arg1->ip_blkid)) !=
124 BlockIdGetBlockNumber(&(arg2->ip_blkid)) ||
125 arg1->ip_posid != arg2->ip_posid);
130 * Functions to get latest tid of a specified tuple.
132 * Maybe these implementations should be moved to another place
135 currtid_byreloid(PG_FUNCTION_ARGS)
137 Oid reloid = PG_GETARG_OID(0);
138 ItemPointer tid = (ItemPointer) PG_GETARG_POINTER(1);
143 result = (ItemPointer) palloc(sizeof(ItemPointerData));
144 ItemPointerSetInvalid(result);
145 if ((rel = heap_open(reloid, AccessShareLock)) != NULL)
147 ret = heap_get_latest_tid(rel, SnapshotNow, tid);
149 ItemPointerCopy(ret, result);
150 heap_close(rel, AccessShareLock);
153 elog(ERROR, "Relation %u not found", reloid);
155 PG_RETURN_POINTER(result);
159 currtid_byrelname(PG_FUNCTION_ARGS)
161 text *relname = PG_GETARG_TEXT_P(0);
162 ItemPointer tid = (ItemPointer) PG_GETARG_POINTER(1);
168 str = DatumGetCString(DirectFunctionCall1(textout,
169 PointerGetDatum(relname)));
171 result = (ItemPointer) palloc(sizeof(ItemPointerData));
172 ItemPointerSetInvalid(result);
173 if ((rel = heap_openr(str, AccessShareLock)) != NULL)
175 ret = heap_get_latest_tid(rel, SnapshotNow, tid);
177 ItemPointerCopy(ret, result);
178 heap_close(rel, AccessShareLock);
181 elog(ERROR, "Relation %s not found", str);
185 PG_RETURN_POINTER(result);