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.19 2000/06/08 22:37:28 momjian 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);
131 tid_text(ItemPointer tid)
136 return (text *) NULL;
145 text_tid(const text *string)
151 return (ItemPointer) 0;
153 str = textout((text *) string);
162 * Functions to get latest tid of a specified tuple.
163 * Maybe these implementations is moved
167 currtid_byreloid(Oid reloid, ItemPointer tid)
169 ItemPointer result = NULL,
173 result = (ItemPointer) palloc(sizeof(ItemPointerData));
174 ItemPointerSetInvalid(result);
175 if (rel = heap_open(reloid, AccessShareLock), rel)
177 ret = heap_get_latest_tid(rel, SnapshotNow, tid);
179 ItemPointerCopy(ret, result);
180 heap_close(rel, AccessShareLock);
183 elog(ERROR, "Relation %u not found", reloid);
186 } /* currtid_byreloid() */
189 currtid_byrelname(const text *relname, ItemPointer tid)
191 ItemPointer result = NULL,
199 str = textout((text *) relname);
201 result = (ItemPointer) palloc(sizeof(ItemPointerData));
202 ItemPointerSetInvalid(result);
203 if (rel = heap_openr(str, AccessShareLock), rel)
205 ret = heap_get_latest_tid(rel, SnapshotNow, tid);
207 ItemPointerCopy(ret, result);
208 heap_close(rel, AccessShareLock);
211 elog(ERROR, "Relation %s not found", textout((text *) relname));
215 } /* currtid_byrelname() */