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.17 2000/05/29 01:59:08 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);
118 tidne(ItemPointer arg1, ItemPointer arg2)
120 if ((!arg1) || (!arg2))
122 return (BlockIdGetBlockNumber(&(arg1->ip_blkid)) !=
123 BlockIdGetBlockNumber(&(arg2->ip_blkid)) ||
124 arg1->ip_posid != arg2->ip_posid);
128 tid_text(ItemPointer tid)
133 return (text *) NULL;
140 text_tid(const text *string)
146 return (ItemPointer) 0;
148 str = textout((text *) string);
157 * Functions to get latest tid of a specified tuple.
158 * Maybe these implementations is moved
161 #include <utils/relcache.h>
163 currtid_byreloid(Oid reloid, ItemPointer tid)
165 ItemPointer result = NULL,
169 result = (ItemPointer) palloc(sizeof(ItemPointerData));
170 ItemPointerSetInvalid(result);
171 if (rel = heap_open(reloid, AccessShareLock), rel)
173 ret = heap_get_latest_tid(rel, SnapshotNow, tid);
175 ItemPointerCopy(ret, result);
176 heap_close(rel, AccessShareLock);
179 elog(ERROR, "Relation %u not found", reloid);
182 } /* currtid_byreloid() */
185 currtid_byrelname(const text *relname, ItemPointer tid)
187 ItemPointer result = NULL,
195 str = textout((text *) relname);
197 result = (ItemPointer) palloc(sizeof(ItemPointerData));
198 ItemPointerSetInvalid(result);
199 if (rel = heap_openr(str, AccessShareLock), rel)
201 ret = heap_get_latest_tid(rel, SnapshotNow, tid);
203 ItemPointerCopy(ret, result);
204 heap_close(rel, AccessShareLock);
207 elog(ERROR, "Relation %s not found", textout((text *) relname));
211 } /* currtid_byrelname() */