diff options
Diffstat (limited to 'src/backend/utils/adt/tid.c')
-rw-r--r-- | src/backend/utils/adt/tid.c | 53 |
1 files changed, 48 insertions, 5 deletions
diff --git a/src/backend/utils/adt/tid.c b/src/backend/utils/adt/tid.c index 49400082234..8df09b2464b 100644 --- a/src/backend/utils/adt/tid.c +++ b/src/backend/utils/adt/tid.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/utils/adt/tid.c,v 1.36 2002/09/04 20:31:29 momjian Exp $ + * $Header: /cvsroot/pgsql/src/backend/utils/adt/tid.c,v 1.37 2003/05/12 23:08:50 tgl Exp $ * * NOTES * input routine largely stolen from boxin(). @@ -24,8 +24,10 @@ #include "access/heapam.h" #include "catalog/namespace.h" -#include "utils/builtins.h" #include "catalog/pg_type.h" +#include "libpq/pqformat.h" +#include "utils/builtins.h" + #define DatumGetItemPointer(X) ((ItemPointer) DatumGetPointer(X)) #define ItemPointerGetDatum(X) PointerGetDatum(X) @@ -91,13 +93,11 @@ tidout(PG_FUNCTION_ARGS) BlockNumber blockNumber; OffsetNumber offsetNumber; char buf[32]; - static char *invalidTid = "()"; if (!ItemPointerIsValid(itemPtr)) - PG_RETURN_CSTRING(pstrdup(invalidTid)); + PG_RETURN_CSTRING(pstrdup("()")); blockId = &(itemPtr->ip_blkid); - blockNumber = BlockIdGetBlockNumber(blockId); offsetNumber = itemPtr->ip_posid; @@ -106,6 +106,49 @@ tidout(PG_FUNCTION_ARGS) PG_RETURN_CSTRING(pstrdup(buf)); } +/* + * tidrecv - converts external binary format to tid + */ +Datum +tidrecv(PG_FUNCTION_ARGS) +{ + StringInfo buf = (StringInfo) PG_GETARG_POINTER(0); + ItemPointer result; + BlockNumber blockNumber; + OffsetNumber offsetNumber; + + blockNumber = pq_getmsgint(buf, sizeof(blockNumber)); + offsetNumber = pq_getmsgint(buf, sizeof(offsetNumber)); + + result = (ItemPointer) palloc(sizeof(ItemPointerData)); + + ItemPointerSet(result, blockNumber, offsetNumber); + + PG_RETURN_ITEMPOINTER(result); +} + +/* + * tidsend - converts tid to binary format + */ +Datum +tidsend(PG_FUNCTION_ARGS) +{ + ItemPointer itemPtr = PG_GETARG_ITEMPOINTER(0); + BlockId blockId; + BlockNumber blockNumber; + OffsetNumber offsetNumber; + StringInfoData buf; + + blockId = &(itemPtr->ip_blkid); + blockNumber = BlockIdGetBlockNumber(blockId); + offsetNumber = itemPtr->ip_posid; + + pq_begintypsend(&buf); + pq_sendint(&buf, blockNumber, sizeof(blockNumber)); + pq_sendint(&buf, offsetNumber, sizeof(offsetNumber)); + PG_RETURN_BYTEA_P(pq_endtypsend(&buf)); +} + /***************************************************************************** * PUBLIC ROUTINES * *****************************************************************************/ |