/*-
 * See the file LICENSE for redistribution information.
 *
 * Copyright (c) 2009 Oracle.  All rights reserved.
 *
 */
using System;
using System.Collections.Generic;
using System.Text;
using BerkeleyDB.Internal;

namespace BerkeleyDB {
    /// <summary>
    /// The ActiveTransaction class describes a currently active transaction.
    /// </summary>
    public class ActiveTransaction {
        private DB_TXN_ACTIVE txn;
        private LSN _lsn;
        private LSN _read_lsn;
        private byte[] gid;
        private string txnname;

        internal ActiveTransaction(DB_TXN_ACTIVE active, byte[] GlobalID, string Name) {
            txn = active;
                        _lsn = new LSN(txn.lsn.file, txn.lsn.offset);
            _read_lsn = new LSN(txn.read_lsn.file, txn.read_lsn.offset);
            gid = GlobalID;
            txnname = Name;
        }

        /// <summary>
        /// The status of an active transaction.
        /// </summary>
        public enum TransactionStatus {
            /// <summary>
            /// The transaction has been aborted
            /// </summary>
            ABORTED = DB_TXN_ACTIVE_STATUS.TXN_ABORTED,
            /// <summary>
            /// The transaction has been committed
            /// </summary>
            COMMITTED = DB_TXN_ACTIVE_STATUS.TXN_COMMITTED,
            /// <summary>
            /// The transaction has been prepared
            /// </summary>
            PREPARED = DB_TXN_ACTIVE_STATUS.TXN_PREPARED,
            /// <summary>
            /// The transaction is running
            /// </summary>
            RUNNING = DB_TXN_ACTIVE_STATUS.TXN_RUNNING
        }

        /// <summary>
        /// The transaction ID of the transaction.
        /// </summary>
        public uint ID { get { return txn.txnid; } }
        /// <summary>
        /// The transaction ID of the parent transaction (or 0, if no parent). 
        /// </summary>
        public uint ParentID { get { return txn.parentid; } }
        /// <summary>
        /// The process ID of the originator of the transaction.
        /// </summary>
        public int ProcessID { get { return txn.pid; } }
        /// <summary>
        /// The thread of control ID of the originator of the transaction.
        /// </summary>
        public uint ThreadID { get { return txn.tid; } }
        /// <summary>
        /// The current log sequence number when the transaction was begun.
        /// </summary>
        public LSN Begun { get { return _lsn; } }
        /// <summary>
        /// The log sequence number of reads for snapshot transactions. 
        /// </summary>
        public LSN SnapshotReads { get { return _read_lsn; } }
        /// <summary>
        /// The number of MVCC buffer copies created by this transaction that
        /// remain in cache.
        /// </summary>
        public uint BufferCopiesInCache { get { return txn.mvcc_ref; } }
        /// <summary>
        /// Status of the transaction.
        /// </summary>
        public TransactionStatus Status { 
            get { return (TransactionStatus)txn.status; } 
        }
        /// <summary>
        /// If the transaction is a prepare transaction, the transaction's
        /// Global ID. Otherwise, the GlobalID contents are undefined. 
        /// </summary>
        public byte[] GlobalID { get { return gid; } }
        /// <summary>
        /// If a name was specified for the transaction, up to the first 50
        /// bytes of that name. 
        /// </summary>
        public string Name { get { return txnname; } }
    }
}