head	1.7;
access;
symbols
	release_4_2:1.7
	aix_ok:1.6
	Version_2_1:1.2;
locks; strict;
comment	@ * @;


1.7
date	94.01.11.17.36.50;	author jiangwu;	state Exp;
branches;
next	1.6;

1.6
date	93.07.16.19.03.09;	author avi;	state Exp;
branches;
next	1.5;

1.5
date	93.01.05.02.31.00;	author aoki;	state Exp;
branches;
next	1.4;

1.4
date	92.05.28.23.07.42;	author mer;	state Exp;
branches;
next	1.3;

1.3
date	92.05.28.20.23.05;	author mer;	state Exp;
branches;
next	1.2;

1.2
date	90.09.25.16.23.38;	author kemnitz;	state Exp;
branches;
next	1.1;

1.1
date	90.03.31.18.53.30;	author cimarron;	state Exp;
branches;
next	;


desc
@transaction id support routiines moved from the
soon to be obsoleted utils/xact directory.
@


1.7
log
@Changed XID to PG_XID to avoid conflict with Xlib
-- jw, 1/11/94
@
text
@/* ----------------------------------------------------------------
 * xid.c --
 *	POSTGRES transaction identifier code.
 *
 * XXX WARNING
 *	Much of this file will change when we change our representation
 *	of transaction ids -cim 3/23/90
 *
 * It is time to make the switch from 5 byte to 4 byte transaction ids
 * This file was totally reworked. -mer 5/22/92
 * ----------------------------------------------------------------
 */

#include "tmp/postgres.h"

RcsId("$Header: /private/src/postgres/src/backend/lib/RCS/xid.c,v 1.6 1993/07/16 19:03:09 avi Exp jiangwu $");

#include "utils/palloc.h"
#include "utils/log.h"
#include "utils/memutils.h"
#include "utils/nabstime.h"

/* ----------------------------------------------------------------
 *	transaction system constants
 *
 *	read the comments for GetNewTransactionId in order to
 *      understand the initial values for AmiTransactionId and
 *      FirstTransactionId. -cim 3/23/90
 * ----------------------------------------------------------------
 */

extern TransactionId NullTransactionId;
extern TransactionId DisabledTransactionId;
extern TransactionId AmiTransactionId;
extern TransactionId FirstTransactionId;


/* ----------------------------------------------------------------
 * 	TransactionIdIsValid
 *
 *	Macro-ize me.
 * ----------------------------------------------------------------
 */

bool
TransactionIdIsValid(transactionId)
	TransactionId	transactionId;
{
	return ((bool) (transactionId != NullTransactionId) );
}

/* ----------------------------------------------------------------
 *	StringFormTransactionId
 *
 *	Not sure if this is still needed -mer 5/22/92
 * ----------------------------------------------------------------
 */

TransactionId
StringFormTransactionId(representation)
	String	representation;
{
	return (atol(representation));
}

/* XXX char16 name for catalogs */
TransactionId
xidin(representation)
	String	representation;
{
	return (StringFormTransactionId(representation));
}

/* ----------------------------------------------------------------
 *	TransactionIdFormString
 * ----------------------------------------------------------------
 */

String
TransactionIdFormString(transactionId)
	TransactionId	transactionId;
{
	String			representation;

	/* maximum 32 bit unsigned integer representation takes 10 chars */
	representation = palloc(11);

	(void)sprintf(representation, "%lu", transactionId);

	return (representation);
}

/* XXX char16 name for catalogs */
String
xidout(transactionId)
	TransactionId	transactionId;
{
	return(TransactionIdFormString(transactionId));
}

/* ----------------------------------------------------------------
 *	PointerStoreInvalidTransactionId
 *
 *	Maybe do away with Pointer types in these routines.
 *      Macro-ize this one.
 * ----------------------------------------------------------------
 */

void
PointerStoreInvalidTransactionId(destination)
	Pointer		destination;
{
	* (TransactionId *) destination = NullTransactionId;
}

/* ----------------------------------------------------------------
 *	TransactionIdStore
 *
 *      Macro-ize this one.
 * ----------------------------------------------------------------
 */

void
TransactionIdStore(transactionId, destination)
	TransactionId	transactionId;
	TransactionId	*destination;
{
	*destination = transactionId;
}

/* ----------------------------------------------------------------
 *	TransactionIdEquals
 * ----------------------------------------------------------------
 */

bool
TransactionIdEquals(id1, id2)
	TransactionId	id1;
	TransactionId	id2;
{
	return ((bool) (id1 == id2));
}

/* ----------------------------------------------------------------
 *	TransactionIdIsLessThan
 * ----------------------------------------------------------------
 */

bool
TransactionIdIsLessThan(id1, id2)
	TransactionId	id1;
	TransactionId	id2;
{
	return ((bool)(id1 < id2));
}

/* ----------------------------------------------------------------
 *	xidgt
 * ----------------------------------------------------------------
 */

/*
 *	xidgt		- returns 1, iff xid1 > xid2
 *				  0  else;
 */
bool
xidgt(xid1, xid2)
PG_XID 	xid1, xid2;
{

	return( (bool) (xid1 > xid2) );
}

/* ----------------------------------------------------------------
 *	xidge
 * ----------------------------------------------------------------
 */

/*
 *	xidge		- returns 1, iff xid1 >= xid2
 *				  0  else;
 */
bool
xidge(xid1, xid2)
PG_XID 	xid1, xid2;
{
	return( (bool) (xid1 >= xid2) );
}


/* ----------------------------------------------------------------
 *	xidle
 * ----------------------------------------------------------------
 */

/*
 *	xidle		- returns 1, iff xid1 <= xid2
 *				  0  else;
 */
bool
xidle(xid1, xid2)
PG_XID 	xid1, xid2;
{
	return((bool) (xid1 <= xid2) );
}


/* ----------------------------------------------------------------
 *	xideq
 * ----------------------------------------------------------------
 */

/*
 *	xideq		- returns 1, iff xid1 == xid2
 *				  0  else;
 */
bool
xideq(xid1, xid2)
PG_XID 	xid1, xid2;
{
	return( (bool) (xid1 == xid2) );
}



/* ----------------------------------------------------------------
 *	xidmi
 * ----------------------------------------------------------------
 */

/*	xidmi		- returns the distance xid1 - xid2
 *
 */
int
xidmi(xid1, xid2)
PG_XID	xid1, xid2;
{	/* computes the 'distance' between xid1 and xid2:
	 * if there was no xidj generated between the generation of
	 * xid1 and xid2, then the distance (xid1 - xid2) has to be 1 (!!!) */
}

/* ----------------------------------------------------------------
 *	TransactionIdIncrement
 * ----------------------------------------------------------------
 */

void
TransactionIdIncrement(transactionId)
	TransactionId	*transactionId;
{

	(*transactionId)++;
	if (*transactionId == DisabledTransactionId)
		elog(FATAL, "TransactionIdIncrement: exhausted XID's");
	return;
}

/* ----------------------------------------------------------------
 *	TransactionIdAdd
 * ----------------------------------------------------------------
 */
void
TransactionIdAdd(xid, value)    
    TransactionId *xid;
    int		  value;
{
    *xid += value;
    return;
}

/* ----------------------------------------------------------------
 *	TransactionIdGetApproximateTime
 * ----------------------------------------------------------------
 */

AbsoluteTime
TransactionIdGetApproximateTime(transactionId)
	TransactionId	*transactionId;
{
	AbsoluteTime temp;
	temp = (*transactionId) / TransactionsPerSecondAdjustment;
	return(temp);
}
@


1.6
log
@time cleanup
@
text
@d16 1
a16 1
RcsId("$Header: /private/src/postgres/src/backend/lib/RCS/xid.c,v 1.5 1993/01/05 02:31:00 aoki Exp avi $");
d168 1
a168 1
XID 	xid1, xid2;
d185 1
a185 1
XID 	xid1, xid2;
d202 1
a202 1
XID 	xid1, xid2;
d219 1
a219 1
XID 	xid1, xid2;
d236 1
a236 1
XID	xid1, xid2;
@


1.5
log
@added some identifiers that fix in a char16
@
text
@d16 1
a16 1
RcsId("$Header: /home2/aoki/postgres/src/backend/lib/RCS/xid.c,v 1.4 1992/05/28 23:07:42 mer Exp aoki $");
d21 1
d276 1
a276 1
Time
d280 1
a280 1
	Time temp;
@


1.4
log
@nix unused routines
@
text
@d16 1
a16 1
RcsId("$Header: /private/mer/pg.latest/src/lib/C/RCS/xid.c,v 1.3 1992/05/28 20:23:05 mer Exp mer $");
d65 8
d90 8
@


1.3
log
@xids are now longs, get rid of xidValue type entirely
@
text
@d16 1
a16 1
RcsId("$Header: /private/mer/pg.latest/src/lib/C/RCS/xid.c,v 1.2 1990/09/25 16:23:38 kemnitz Exp mer $");
a223 119

#ifdef 86_ME_SOON
/* ----------------------------------------------------------------
 *	StringSetTransactionIdValue
 *
 *	Macro-ize?
 * ----------------------------------------------------------------
 */

void
StringSetTransactionIdValue(representation, value)
	String			representation;
	TransactionId		*value;
{
	*value = atoi(representation);
}


/* ----------------------------------------------------------------
 *	TransactionIdValueIsValid
 * ----------------------------------------------------------------
 */

bool
TransactionIdValueIsValid(transactionIdValue)
	TransactionId	transactionIdValue;
{
	return ((bool) (transactionIdValue != NullTransactionIdValue) );
}

/* ----------------------------------------------------------------
 *	TransactionIdValueFormString
 * ----------------------------------------------------------------
 */

String
TransactionIdValueFormString(transactionId)
	TransactionId	transactionId;
{
	String	representation;

	/* maximum 32 bit unsigned integer representation takes 10 chars */
	representation = palloc(11);

	(void)sprintf(representation, "%d", transactionId);

	return (representation);
}

/* ----------------------------------------------------------------
 *	TransactionIdValueSetTransactionId
 *
 *	86 this routine!!! -mer 5/22/92
 * ----------------------------------------------------------------
 */
void
TransactionIdValueSetTransactionId(idValue, id)
	TransactionIdValue	idValue;
	TransactionId		id;
{
	TransactionIdValueData	valueData;
	uint8			*digitPointer;
	int16			digitsLeft;

	
	valueData = *idValue;
	digitPointer = &id->data[sizeof id->data - 1];

	for (digitsLeft = sizeof id->data - 1; digitsLeft >= 0;
			digitsLeft -= 1) {

		TransactionIdValueData	tempData;

		tempData = floor(valueData / TransactionMultiplierPerByte);
		*digitPointer = valueData -
			(TransactionMultiplierPerByte * tempData);
		valueData = tempData;
		digitPointer -= 1;
	}
}

/* ----------------------------------------------------------------
 *	TransactionIdSetTransactionIdValue
 *
 *	86 this routine!!! -mer 5/22/92
 * ----------------------------------------------------------------
 */

void
TransactionIdSetTransactionIdValue(id, idValue)
	TransactionId		id;
	TransactionIdValue	idValue;
{
	TransactionIdValueData	valueData;
	uint8			*digitPointer;
	int16			digitsLeft;
#ifdef	sun
	uint16			digit;
#endif	/* defined(sun) */

	digitPointer = &id->data[0];
	valueData = 0;

	for (digitsLeft = sizeof id->data - 1; digitsLeft >= 0;
			digitsLeft -= 1) {

		valueData *= TransactionMultiplierPerByte;
#ifdef	sun
		digit = AsUint8(*digitPointer);
		valueData += digit;
#else	/* !defined(sun) */
		valueData += AsUint8(*digitPointer);
#endif	/* !defined(sun) */
		digitPointer += 1;
	}

	*idValue = valueData;
}
#endif 86_ME_SOON
@


1.2
log
@Updating from revision 1.1 to revision 1.5
@
text
@d8 3
a13 2
#include <math.h>	/* for floor ... */

d16 1
a16 1
RcsId("$Header: RCS/xid.c,v 1.5 90/09/12 18:04:02 cimarron Exp $");
d32 1
d39 2
d48 1
a48 6
	return ((bool)(PointerIsValid(transactionId) &&
		(transactionId->data[4] != NullTransactionId->data[4] ||
			transactionId->data[3] != NullTransactionId->data[3] ||
			transactionId->data[2] != NullTransactionId->data[2] ||
			transactionId->data[1] != NullTransactionId->data[1] ||
			transactionId->data[0] != NullTransactionId->data[0])));		
d53 2
d62 1
a62 11
	TransactionId		transactionId;
	TransactionIdValueData	valueData;

	StringSetTransactionIdValue(representation, &valueData);
	
	transactionId = LintCast(TransactionId,
		palloc(sizeof transactionId->data));

	TransactionIdValueSetTransactionId(&valueData, transactionId);

	return (transactionId);
a73 1
	TransactionIdValueData	valueData;
d76 2
a77 1
	TransactionIdSetTransactionIdValue(transactionId, &valueData);
d79 1
a79 1
	representation = TransactionIdValueFormString(&valueData);
d86 3
d96 1
a96 2
	MemoryCopy((String)destination, (String)NullTransactionId,
		TransactionIdDataSize);
d101 2
d109 1
a109 1
	Pointer		destination;
d111 1
a111 2
	MemoryCopy((String)destination, (String)transactionId,
		TransactionIdDataSize);
d124 1
a124 5
	return ((bool)(id1->data[4] == id2->data[4] &&
			id1->data[3] == id2->data[3] &&
			id1->data[2] == id2->data[2] &&
			id1->data[1] == id2->data[1] &&
			id1->data[0] == id2->data[0]));
d137 1
a137 7
	TransactionIdValueData	valueData1;
	TransactionIdValueData	valueData2;

	TransactionIdSetTransactionIdValue(id1, &valueData1);
	TransactionIdSetTransactionIdValue(id2, &valueData2);

	return ((bool)((valueData2 - valueData1) > 0.7));
d152 1
a152 1
{	extern	int	strcmp();
d154 1
a154 1
	return( (bool) (strcmp(xid1, xid2) > 0) );
d169 2
a170 3
{	extern	int	strcmp();

	return( (bool) (strcmp(xid1, xid2) >= 0) );
d186 2
a187 3
{	extern	int	strcmp();

	return((bool) (strcmp(xid1, xid2) <= 0) );
d203 2
a204 3
{	extern	int	strcmp();

	return( (bool) (strcmp(xid1, xid2) == 0) );
d225 1
d227 3
a229 1
 *	TransactionIdValueIsValid
d233 4
a236 3
bool
TransactionIdValueIsValid(value)
	TransactionIdValue	value;
d238 1
a238 2
	return ((bool)(PointerIsValid(value) &&
		*value != NullTransactionIdValue));
d241 1
d243 1
a243 1
 *	StringSetTransactionIdValue
d247 3
a249 4
void
StringSetTransactionIdValue(representation, value)
	String			representation;
	TransactionIdValue	value;
d251 1
a251 3
	extern double		atof();

	*value = atof(representation);
d260 2
a261 2
TransactionIdValueFormString(value)
	TransactionIdValue	value;
d265 2
a266 2
	/* maximum 40 bit unsigned integer representation takes 12 chars */
	representation = palloc(13);
d268 1
a268 1
	(void)sprintf(representation, "%.0f", *value);
d275 2
a278 1

d307 2
d342 1
d351 1
a351 1
	TransactionId	transactionId;
a352 9
	uint8	*digitPointer;
	int16	digitsLeft;

	digitPointer = &transactionId->data[sizeof transactionId->data - 1];

	for (digitsLeft = sizeof transactionId->data - 1; digitsLeft >= 0;
			digitsLeft -= 1) {

		*digitPointer = AsUint8(1 + AsUint8(*digitPointer));
d354 4
a357 6
		if (!(AsUint8(*digitPointer) == 0)) {
			return;
		}
		digitPointer -= 1;
	}
	elog(FATAL, "TransactionIdIncrement: exhausted XID's");
d366 1
a366 1
    TransactionId xid;
d369 2
a370 5
    TransactionIdValueData xidv;

    TransactionIdSetTransactionIdValue(xid, &xidv);
    xidv += value;
    TransactionIdValueSetTransactionId(&xidv, xid);
d380 1
a380 1
	TransactionId	transactionId;
d382 3
a384 6
	TransactionIdValueData	valueData;

	TransactionIdSetTransactionIdValue(transactionId, &valueData);

	valueData /= TransactionsPerSecondAdjustment;
	return((Time)valueData);
@


1.1
log
@Initial revision
@
text
@d11 1
a11 1
#include "c.h"
d13 1
a13 1
RcsId("$Header: RCS/xid.c,v 1.7 89/10/03 17:11:54 hirohama Exp $");
d15 1
a15 1
#include <math.h>	/* for floor ... */
d17 3
a19 6
#include "bit.h"
#include "clib.h"
#include "log.h"
#include "palloc.h"
#include "postgres.h"	/* XXX for XID, remove this when XID -> TransactionId */
#include "tim.h"
a20 2
#include "xid.h"

d30 3
a32 2
static TransactionIdData NullTransactionIdData = { { 0, 0, 0, 0, 0 } };
TransactionId NullTransactionId = &NullTransactionIdData;
a33 2
static TransactionIdData TransactionIdOneData = { { 0, 0, 0, 2, 0 } };
TransactionId AmiTransactionId = &TransactionIdOneData;
a34 4
static TransactionIdData FirstTransactionIdData = { { 0, 0, 0, 2, 2 } };
TransactionId FirstTransactionId = &FirstTransactionIdData;


a101 2
	Assert(PointerIsValid(destination));

a115 3
	Assert(TransactionIdIsValid(transactionId));
	Assert(PointerIsValid(destination));

@
