blob: ae7081eac19516e700d212a01327e218a50bd745 [file] [log] [blame]
/*
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*/
/**
* \file deq_hdr.h
*
* Qpid asynchronous store plugin library
*
* File containing code for class mrg::journal::deq_hdr (dequeue record),
* used to dequeue a previously enqueued record.
*
* \author Kim van der Riet
*/
#ifndef QPID_LEGACYSTORE_JRNL_DEQ_HDR_H
#define QPID_LEGACYSTORE_JRNL_DEQ_HDR_H
#include <cstddef>
#include "qpid/legacystore/jrnl/rec_hdr.h"
namespace mrg
{
namespace journal
{
#pragma pack(1)
/**
* \brief Struct for dequeue record.
*
* Struct for dequeue record. If this record has a non-zero xidsize field (i.e., there is a
* valid XID), then this header is followed by the XID of xidsize bytes and a rec_tail. If,
* on the other hand, this record has a zero xidsize (i.e., there is no XID), then the rec_tail
* is absent.
*
* Note that this record had its own rid distinct from the rid of the record it is dequeueing.
* The rid field below is the rid of the dequeue record itself; the deq-rid field is the rid of a
* previous enqueue record being dequeued by this record.
*
* Record header info in binary format (32 bytes):
* <pre>
* 0 7
* +---+---+---+---+---+---+---+---+ -+
* | magic | v | e | flags | |
* +---+---+---+---+---+---+---+---+ | struct hdr
* | rid | |
* +---+---+---+---+---+---+---+---+ -+
* | deq-rid |
* +---+---+---+---+---+---+---+---+
* | xidsize |
* +---+---+---+---+---+---+---+---+
* v = file version (If the format or encoding of this file changes, then this
* number should be incremented)
* e = endian flag, false (0x00) for little endian, true (0x01) for big endian
* </pre>
*
* Note that journal files should be transferable between 32- and 64-bit
* hardware of the same endianness, but not between hardware of opposite
* entianness without some sort of binary conversion utility. Thus buffering
* will be needed for types that change size between 32- and 64-bit compiles.
*/
struct deq_hdr : rec_hdr
{
u_int64_t _deq_rid; ///< Record ID of dequeued record
#if defined(JRNL_BIG_ENDIAN) && defined(JRNL_32_BIT)
u_int32_t _filler0; ///< Big-endian filler for 32-bit size_t
#endif
std::size_t _xidsize; ///< XID size
#if defined(JRNL_LITTLE_ENDIAN) && defined(JRNL_32_BIT)
u_int32_t _filler0; ///< Little-endian filler for 32-bit size_t
#endif
static const u_int16_t DEQ_HDR_TXNCMPLCOMMIT_MASK = 0x10;
/**
* \brief Default constructor, which sets all values to 0.
*/
inline deq_hdr(): rec_hdr(), _deq_rid(0),
#if defined(JRNL_BIG_ENDIAN) && defined(JRNL_32_BIT)
_filler0(0),
#endif
_xidsize(0)
#if defined(JRNL_LITTLE_ENDIAN) && defined(JRNL_32_BIT)
, _filler0(0)
#endif
{}
/**
* \brief Convenience constructor which initializes values during construction.
*/
inline deq_hdr(const u_int32_t magic, const u_int8_t version, const u_int64_t rid,
const u_int64_t deq_rid, const std::size_t xidsize, const bool owi,
const bool txn_coml_commit = false):
rec_hdr(magic, version, rid, owi), _deq_rid(deq_rid),
#if defined(JRNL_BIG_ENDIAN) && defined(JRNL_32_BIT)
_filler0(0),
#endif
_xidsize(xidsize)
#if defined(JRNL_LITTLE_ENDIAN) && defined(JRNL_32_BIT)
, _filler0(0)
#endif
{ set_txn_coml_commit(txn_coml_commit); }
inline bool is_txn_coml_commit() const { return _uflag & DEQ_HDR_TXNCMPLCOMMIT_MASK; }
inline void set_txn_coml_commit(const bool commit)
{
_uflag = commit ? _uflag | DEQ_HDR_TXNCMPLCOMMIT_MASK :
_uflag & (~DEQ_HDR_TXNCMPLCOMMIT_MASK);
}
/**
* \brief Returns the size of the header in bytes.
*/
inline static std::size_t size() { return sizeof(deq_hdr); }
};
#pragma pack()
} // namespace journal
} // namespace mrg
#endif // ifndef QPID_LEGACYSTORE_JRNL_DEQ_HDR_H