tldm-universe/Ardent/UV/gcidir/include/TX.h
2024-09-09 17:51:08 -04:00

599 lines
18 KiB
C
Executable File

#ifndef TX_H
#define TX_H
/******************************************************************************
*
* TX.h - UniVerse Transaction processing defines
*
* Module %M% Version %I% Date %H%
*
* (c) Copyright 1998 Ardent Software Inc. - All Rights Reserved
* This is unpublished proprietary source code of Ardent Software Inc.
* The copyright notice above does not evidence any actual or intended
* publication of such source code.
*
*******************************************************************************
*
* Maintenence log - insert most recent change descriptions at top
*
* Date.... GTAR# WHO Description........................................
* 04/12/99 24742 GMH Implement get/set_t25info functions
* 03/28/99 24729 RGA Change from T30TAB to T30TABNEW.
* 10/14/98 23801 SAP Change copyrights.
* 09/28/98 23672 GMH Convert DBITEM to DBITEMNEW
* 02/23/98 21285 CSM Add TX_DEMOTE_SQL_LOCK TX_UPD_COUNTS_LOCK
* 05/29/97 20606 LAG Added support for replication to TXtopinfo structure
* 05/07/97 20453 CSM Fix typos
* 05/02/97 20453 CSM Add list of trigger blocks to tx structure
* 11/19/96 19511 CSM Internal transactions do not notify Resource manager
* 08/08/95 17086 CSM Add flags to TXUINFO,TX_NUMERIC,use comp/compare func
* 06/22/95 15958 PVW Add defines for TX_BEGIN_INPROGRESS
* 06/20/95 15958 PVW,CSM Add defines for tx status
* 06/14/95 15958 PVW Remove TXmemlist structure define
* 06/08/95 15958 CSM Add TX_FREE_ITEM macro to free a tx disk cache item
* 05/24/95 15958 CSM Add TX_GET_PARENT macro for Rollforward of Nested tx
* 05/18/95 16554 PVW Added TX_CHECK_LOCK and TX_ACQUIRE_LOCK
* 04/10/95 16244 GMM Changed ino_t to uv_ino_t
* 05/05/95 15958 PVW Added TXSCANC
* 04/27/95 16446 PVW Add TX_NESTING_LEVEL
* 04/13/95 16346 PVW Changes for isolation level
* 04/11/95 16323 PVW Fix Error Recovery within a tx
* 03/29/95 15958 PVW,CSM Implement Nested Transactions
* 03/29/95 16247 PVW Added TXmemlist and TXdisklist structures
* 01/13/95 15479 RM Remove TXlist
* 10/25/94 15040 PVW Add DBlatch structures to TXDESC
* 10/24/94 14855 MGM Add uniqinfo struct and uqptr to TXdesc
* 10/19/94 15024 PVW Add scanned data structure to TXdesc
* 10/07/94 14895 CSM 1 warn/trn for non-active fils,14825 cnt for uncommit
* 09/02/94 14831 PVW Add TXTEST_makefile
* 09/01/94 14711 PVW,CSM Implement debugging code
* 07/27/94 14504 EAP Changed split30_info and merge30_info
* 07/21/94 14134 WLG Added #ifndef TX_H to guard against multi-includes.
* 07/12/94 14371 RM Added TX QA tests
* 07/11/94 14173 EAP Corrected merge30_item_size() macro
* 07/06/94 14371 RM Added TX QA tests
* 06/23/94 14173 EAP Added Type 25 structures to TXWARM_info
* 06/21/94 13835 PVW Add sqlmode to TXdesc structure
* 06/09/94 14173 EAP included DBFILE.h to fix compile errors
* 06/07/94 14173 EAP added TXWARM_info structure
* 05/25/94 13836 PVW Remove FXLOCK define
* 05/25/94 13835 PVW Implement SQL interface to the Transaction
* Manager
* 05/23/94 13835 PVW add TX_flist structure
* 03/29/94 13511 JKW add TXbefore
* 06/11/93 11704 JKW add ODBC TX interface
* 08/27/92 8806 JKW add log_set to tx descriptor
* 06/18/92 8806 JKW add logging defines
* 06/01/92 8806 JKW delete module define
* 05/31/92 8806 JKW add tx support
******************************************************************************/
#include "xa.h"
#include "DBFILE.h"
#include "btree.h"
#include "inlist.h"
/* The following are valid values of the TX/API function return code: */
typedef int TXRTNCODE;
#define TX_OKAY 0
#define TX_ERR_GENERIC -1
#define TX_ERR_FILETYPE -2
/* The following are valid values of the transaction isolation: */
#define TX_NO_ISOLATION 0
#define TX_READ_UNCOMMITTED 1
#define TX_READ_COMMITTED 2
#define TX_REPEATABLE_READ 3
#define TX_SERIALIZABLE 4
#define TX_CURRENT_ISOLATION 42
/* The following are used in calls to TXCleanCache: */
#define TX_DEMOTE_LOCK 0x1 /* demote lock across tx boundary */
#define TX_RELEASE_LOCK 0x2
#define TX_DEMOTE_SQL_LOCK 0x4 /* demote lock within a tx by SQL */
#define TX_UPD_COUNTS_LOCK 0x8 /* update lock counts if SQL released
or demoted a lock in an active tx */
/* The following are used in calls to TXCheckIsolation: */
#define TX_CHECK_LOCK 0x0
#define TX_ACQUIRE_LOCK 0x1
/**********************************************************************/
#define IS_A_TX (TX_active?1:0)
#define TX_EXISTS (TX_active?1:0)
#define TX_ID TX_active->id
#define TX_NESTING_LEVEL (TX_active?TX_active->level:0)
#define TX_ISOLATION_LEVEL TX_active->isolation
#define TX_TOP_LEVEL TX_active->top
#define TX_GET_CHILD(tx) (tx?((tx)->child?(tx)->child->id:0):0)
#define TX_GET_PARENT(tx) (tx?((tx)->parent?(tx)->parent->id:0):0)
#define ISOLATION_LEVEL (TX_active?TX_active->isolation:DEFAULT_ISOLATION)
#define TX_GET_TRIGGER (TX_active?TX_active->top->tli->trcount:0)
#define TX_GET_TRSCHEMA (TX_active->top->tli->trfired->ptrigblk->schema)
#define TX_GET_TRTABLE (TX_active->top->tli->trfired->ptrigblk->table)
#define TX_GET_TRID (TX_active->top->tli->trfired->id)
#define TX_GET_TRREC (TX_active->top->tli->trfired->rec)
#define TX_GET_TRIDOLD (TX_active->top->tli->trfired->id_old)
#define TX_GET_TRRECOLD (TX_active->top->tli->trfired->rec_old)
#define TX_GET_TREVENT (TX_active->top->tli->trfired->event)
#define TX_GET_UDR_STARTED (TX_active->top->tli->udr_started)
#define TX_GET_UDR_ABORTED (TX_active->top->tli->udr_aborted)
#define TX_SET_UDR_STARTED(x) ((TX_active->top->tli->udr_started) = (x))
#define TX_SET_UDR_ABORTED(x) ((TX_active->top->tli->udr_aborted) = (x))
#define TXREAD 1
#define TXWRITE 2
#define TXDELETE 3
#define TXCOMMIT 4
#define TXROLLBACK 5
#define TXBEFORE 6
#define TXNOBEFORE 7
#define TXRELOVERSZ 8
#define TXGETOVERSZ 9
#define TXGETOVERFL 10
#define TXRELOVERFL 11
#define TXSPLIT30 12
#define TXMERGE30 13
#define TXPACK25 14
#define TXMERGE25 15
#define TXSPLIT25 16
#define TXFREE25 17
#define TXSPLITROOT25 18
#define TX_LOGNOIO_WAIT 1000
#define TX_MAXCACHE 30720 /* temp -- cannot overflow to file */
#define TX_FATAL 909014 /* fatal error code for now */
/****************************************************
* TX QA test masks used by ASSIGN command from BASIC
* see Fassign() in RMmisc.c
****************************************************/
#define TXTEST_commit 0x01
#define TXTEST_rollback 0x02
#define TXTEST_escalate 0x04
#define TXTEST_cleanup 0x08
#define TXTEST_listreadu 0x10
#define TXTEST_prepare 0x20
#define TXTEST_debugcache 0x40
#define TXTEST_makefile 0x80
#define TXTEST_precommit_fatal 0x100
#define TXTEST_commit_fatal 0x200
#define TXTEST_postcommit_fatal 0x400
#define TXTEST_lockdisplay 0x1000
/* These defines are for use by TXPrintCache */
#define TX_TEST_LOCK 0x1
#define TX_TEST_DATA 0x2
#define TX_TEST_STATUS 0x4
/*
There is a tunable array of TXid's in global memory
This allows a daemon to monitor that active transactions
are making progress.
*/
struct TXid
{
int id;
int pid;
int state;
};
typedef struct TXid TXID;
#define TX_NUMERIC 0x1 /* unique for numeric field */
/**********************************************************************
TXuinfo structure
**********************************************************************/
struct TXuinfo
{
struct TXuinfo *next;
uUVLONG dev;
uv_ino_t inode;
INLIST *cache;
int flags;
};
typedef struct TXuinfo TXUINFO;
/**********************************************************************
TXlatch structure
**********************************************************************/
struct TXlatch
{
struct TXlatch *next;
DBDADDR group;
uUVLONG latchacquired;
};
typedef struct TXlatch TXLATCH;
/**********************************************************************
TXinfo structure
**********************************************************************/
#define TX_PREIMAGE 0x1
#define TX_NOPREIMAGE 0x2
#define TX_TRUE_INSERT 0x4
#define TX_TRUE_UPDATE 0x10
#define TX_TRUE_OPERATION 0x14
#define TX_FREE_ITEM(txitem) ((txitem)->m.pfile->status & TX_INMEMORY?0:TXfree_item(txitem))
struct TXinfo
{
struct TXpfile *pfile;
int status;
int operation;
DBDADDR group;
uUVLONG lockexisting;
uUVLONG lockacquired;
};
typedef struct TXinfo TXINFO;
/**********************************************************************
TXitem structure
**********************************************************************/
struct TXitem
{
TXINFO m;
STRING pre;
STRING post;
};
typedef struct TXitem TXITEM;
/**********************************************************************
TXlfile structure
**********************************************************************/
struct TXlfile
{
struct TXlfile *next;
DBFILE *fdesc;
};
typedef struct TXlfile TXLFILE;
/**********************************************************************
TXpfile structure
The following defines are used for the status element
**********************************************************************/
#define TX_INMEMORY 0x1
struct TXpfile
{
struct TXpfile *next;
struct TXpfile *ancestor;
struct TXdesc *tx;
uUVLONG dev;
uv_ino_t inode;
int status;
uUVLONG lockexisting;
uUVLONG lockacquired;
TXLFILE *lfilelist;
STRING disk_key;
int disk_key_len;
INLIST *mem_cache;
int mem_usage;
SELFILE *true_insert_list;
int true_insert_count;
int true_update_count;
int tlfilenum;
int RL_count;
int RU_count;
TXLATCH *held_latch;
};
typedef struct TXpfile TXPFILE;
/**********************************************************************
TXpflist structure
**********************************************************************/
struct TXpflist
{
struct TXpflist *next;
TXPFILE *pfile;
};
typedef struct TXpflist TXPFLIST;
/**********************************************************************
Trigger Events
**********************************************************************/
#define TRINSERT 0
#define TRUPDATE 1
#define TRDELETE 2
#define TRBEFORE 0
#define TRAFTER 1
/**********************************************************************
TXtrinfo structure - information of a single trigger
**********************************************************************/
struct TXtrinfo
{
char *name; /* trigger name */
char *creator; /* trigger creator name for Authid */
char *hstmt;
char *progloc; /* trigger program name */
PROGRAM *program; /* ptr to program in Programs struct */
int chksum; /* checksum of trigger object code */
short trigloc; /* location+1 of trigger information */
};
typedef struct TXtrinfo TXTRINFO;
/**********************************************************************
TXtrlist structure - information of all enabled triggers of a table
**********************************************************************/
struct TXtrlist
{
struct TXtrlist *next;
TXTRINFO trig[6];
TXLFILE *trdesc; /* list of fdescs pointing here */
uv_ino_t inode;
uUVLONG dev;
STRING schema; /* used for trig arg, @OLD,NEW */
STRING table; /* used for trig arg, @OLD,NEW */
};
typedef struct TXtrlist TXTRLIST;
/**********************************************************************
TXtrfired structure - information of a trigger in the fired state
**********************************************************************/
struct TXtrfired
{
struct TXtrfired *next; /* ptr to next trig on stack */
STRING id,
rec,
id_old,
rec_old;
DATUM atid, /* @ ID for error handling */
atrec, /* @ REC for error handling */
atfile; /* @ FILE for error handling */
int tx_level; /* tx lvl at which trig fired */
TXTRLIST *ptrigblk; /* pointer to trigger block */
uid_t sav_authid; /* Auth id before trig exec */
DATUM argptr[14]; /* trigger arguments, datums */
char *sav_hstmt; /* @HSTMT before trig execut */
char savcasc; /* @CASCADE before trig exec */
short trigloc; /* loc+1 of trig in ptrigblk */
short event; /* 0, 1 or 2 - Ins, Upd, Del */
};
typedef struct TXtrfired TXTRFIRED;
/**********************************************************************
TXtopinfo structure - information relevant in top level of nested transaction
**********************************************************************/
struct TXtopinfo
{
TXTRLIST *trlist; /* list of active triggers */
TXTRFIRED *trfired; /* stack of fired triggers */
TXTRFIRED *trfree; /* list of free fired triggers */
int trcount; /* count of active triggers */
int trchain_casc; /* trig nest lvl after casc,0 */
BITMAP sparebits:((8*sizeof(BITMAP))-2),
udr_started:1, /* set if transaction is involved in UDR */
udr_aborted:1; /* set if transaction is being uncommitted */
};
typedef struct TXtopinfo TXTOPINFO;
/**********************************************************************
TXdesc structure
**********************************************************************/
/* The following are valid values of the transaction type: */
#define TX_TYPE_BASIC 0x0001
#define TX_TYPE_DML 0x0002
#define TX_TYPE_INSERT 0x0012
#define TX_TYPE_UPDATE 0x0022
#define TX_TYPE_DELETE 0x0042
#define TX_TYPE_SELECT 0x0102
#define TX_TYPE_ROLLFWD 0x0200
#define TX_TYPE_INTERNAL 0x0400
/* The following are valid values of the transaction status: */
#define TX_BEGIN_INPROGRESS 0x01
#define TX_COMMIT_STARTED 0x02
#define TX_COMMIT_COMPLETED 0x04
#define TX_RELEASE_STARTED 0x08
#define TX_RM_NOTIFIED 0x10
#define TX_LOGDATA_STARTED 0x20
#define TX_ROLLBACK_STARTED 0x40
#define TX_UNCOMMIT_STARTED 0x80
#define TX_LOGIT 0x40000000
#define TX_NONACTFL 0x80000000
struct TXdesc
{
int id;
long starttime;
long committime;
int status;
short type;
short level;
short isolation;
struct TXdesc *child;
struct TXdesc *parent;
struct TXdesc *top;
TXPFILE *pfilelist;
TXUINFO *uinfo;
int rmid;
XID xid;
int mem_max;
int mem_usage;
DBFILE *disk_cache;
uchar *disk_file;
struct SHdata disk_shd;
TXLATCH *gfree_latch;
TXLFILE *scanlist;
int commitcnt;
struct DBlatch *held_latch;
struct DBlatch *free_latch;
TXTOPINFO *tli; /* top level transaction information */
};
typedef struct TXdesc TXDESC;
/**********************************************************************
TXscanc structure
**********************************************************************/
struct TXscanc
{
TXDESC *scan_tx;
SELFILE *selfile; /* merge of all true insert lists */
int has_inserts;
STRING key;
STRING record;
};
typedef struct TXscanc TXSCANC;
/*********************************************************************/
#define TX_KEYBASE (sizeof(long) + sizeof(long))
#define TX_MAX_RM 3
#define TX_RM_START 1
#define TX_RM_COMMIT 2
#define TX_RM_ROLLBACK 3
#define TX_RM_END 4
struct TXrm_entry
{
int rmid;
struct xa_switch_t table;
};
/*********************************************************************/
struct TXdisklist
{
struct TXdisklist *next;
STRING item;
};
typedef struct TXdisklist TXDISKLIST;
/**********************************************************************
Data structures used to encode warm start transaction info
**********************************************************************/
struct freelist_info {
int type;
DBDADDR freelist_hdr;
int ovf30;
int count;
DBDADDR list[1];
};
struct split30_info{
int type;
DBDADDR freelist_hdr;
DBDADDR allocated[2];
DBDADDR freed;
T30INFONEW t30_params;
int Bsize;
int count;
DBITEMNEW data[1];
};
struct merge30_info{
int type;
DBDADDR freelist_hdr;
DBDADDR allocated[2];
DBDADDR freed;
T30INFONEW t30_params;
int Bsize;
int orig_count;
int count;
DBITEMNEW data[1];
};
struct pack25_info{
int type;
DBDADDR freelist_hdr;
DBDADDR parent;
int parent_slot;
DBDADDR leaf;
TERMINAL_NODE data;
};
struct merge25_info{
int type;
DBDADDR parent;
int parent_slot;
DBDADDR left_node;
DBDADDR right_node;
TERMINAL_NODE data;
};
struct split25_info{
int type;
DBDADDR freelist_hdr;
DBDADDR parent;
int parent_slot;
DBDADDR new;
DBDADDR orig;
TERMINAL_NODE data;
};
struct splitroot25_info{
int type;
DBDADDR freelist_hdr;
DBDADDR left;
DBDADDR right;
TERMINAL_NODE data;
};
struct free25_info{
int type;
DBDADDR freelist_hdr;
DBDADDR parent;
int parent_slot;
DBDADDR leafaddr;
DBDADDR l_sibling;
DBDADDR r_sibling;
};
typedef union {
struct freelist_info freelist_info;
struct split30_info split30_info;
struct merge30_info merge30_info;
struct pack25_info pack25_info;
struct split25_info split25_info;
struct merge25_info merge25_info;
struct free25_info free25_info;
struct splitroot25_info splitroot25_info;
} TXWARM_info;
#define freelist_item_size(n) (sizeof(struct freelist_info)+((n)-1)*sizeof(DBDADDR))
#define split30_item_size(fdesc,n) (sizeof(struct split30_info)+(n)*(fdesc->Bsize)-(fdesc->addr_support!=NEW64?sizeof(DBITEMNEW32):sizeof(DBITEMNEW64)))
#define merge30_item_size(fdesc,n) (sizeof(struct merge30_info)+(n)*(fdesc->Bsize)-(fdesc->addr_support!=NEW64?sizeof(DBITEMNEW32):sizeof(DBITEMNEW64)))
#define pack25_item_size(fdesc) (sizeof(struct pack25_info)-sizeof(TERMINAL_NODE)+((fdesc)->Bsize))
#define merge25_item_size(fdesc) (sizeof(struct merge25_info)-sizeof(TERMINAL_NODE)+2*((fdesc)->Bsize))
#define split25_item_size(fdesc) (sizeof(struct split25_info)-sizeof(TERMINAL_NODE)+((fdesc)->Bsize))
#define free25_item_size(fdesc) (sizeof(struct free25_info))
#define splitroot25_item_size(fdesc) (sizeof(struct splitroot25_info)-sizeof(TERMINAL_NODE)+((fdesc)->Bsize))
#endif