blob: b581587597f7567200db49a970738b94ab2c1e8d [file] [log] [blame]
/**********************************************************************
// @@@ START COPYRIGHT @@@
//
// 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.
//
// @@@ END COPYRIGHT @@@
//
**********************************************************************/
#ifndef _RU_DUPELIM_LOG_RECORD_H_
#define _RU_DUPELIM_LOG_RECORD_H_
/* -*-C++-*-
******************************************************************************
*
* File: RuDupElimLogRecord.h
* Description: Definition of class CRUIUDLogRecord
*
* Created: 06/12/2000
* Language: C++
*
*
******************************************************************************
*/
#include "refresh.h"
#include "dsplatform.h"
#include "dsptrlist.h"
#include "dmresultset.h"
#include "dmSqlTuple.h"
#include "RuDupElimConst.h"
class CRUUpdateBitmap;
//--------------------------------------------------------------------------//
// CRUIUDLogRecord
//
// This class stores the columns of a single IUD-log record
// extracted by the delta computation query: the control columns
// (@EPOCH, @IGNORE etc.), @TS, and the table's clustering key columns.
//
// The non-persistent data members of the class are:
// (1) The clustering key (CK) tag - the number of distinct
// clustering key values encountered so far.
// (2) The (delete/update) action to be performed by DE. Applicable only
// to the single-row records. Set by the range resolver.
//
//--------------------------------------------------------------------------//
class REFRESH_LIB_CLASS CRUIUDLogRecord {
public:
CRUIUDLogRecord(CDMSqlTupleDesc &ckDesc, Int32 updateBmpSize);
CRUIUDLogRecord(const CRUIUDLogRecord &other);
virtual ~CRUIUDLogRecord();
//----------------------------//
// Accessors
//----------------------------//
public:
//-- Persistent attributes
TInt64 GetSyskey() const
{
return syskey_;
}
TInt32 GetEpoch() const
{
return epoch_;
}
TInt32 GetOperationType() const
{
return opType_;
}
TInt32 GetIgnoreMark() const
{
return ignore_;
}
TInt32 GetRangeSize()
{
return rangeSize_;
}
const CRUUpdateBitmap *GetUpdateBitmap() const
{
return pUpdateBitmap_;
}
//-- Operation type decoding
BOOL IsSingleRowOp() const
{
return (0 == (opType_ & CRUDupElimConst::IS_RANGE_RECORD));
}
BOOL IsBeginRange() const
{
return (0 != (opType_ & CRUDupElimConst::IS_BEGIN_RANGE));
}
BOOL IsInsert() const
{
return (TRUE == IsSingleRowOp()
&&
0 == (opType_ & CRUDupElimConst::IS_DELETE));
}
BOOL IsDelete() const
{
return (TRUE == IsSingleRowOp()
&&
0 != (opType_ & CRUDupElimConst::IS_DELETE));
}
BOOL IsPartOfUpdate() const
{
return (0 != (opType_ & CRUDupElimConst::IS_PART_OF_UPDATE));
}
public:
//--- Access to the clustering key tuple
// Copy the tuple's values to N consecutive parameters
// of the statement: firstParam, ... firstParam + N - 1.
// Useful for statements where the whole tuple
// participates in a WHERE expression,
// or the whole tuple is dumped to the log.
void CopyCKTupleValuesToParams(
CDMPreparedStatement &stmt,
Int32 firstParam) const;
const CDMSqlTuple &GetCKTuple() const
{
return ckTuple_;
}
Lng32 GetCKLength() const
{
return ckTuple_.GetLength();
}
BOOL IsClusteringKeyEqualTo(const CRUIUDLogRecord &other) const
{
return (ckTag_ == other.ckTag_);
}
TInt64 GetCKTag() const
{
return ckTag_;
}
//-- Decision type decoding
BOOL WillRangeResolvDeleteMe() const
{
return (0 != action_ & DO_DELETE);
}
BOOL WillRangeResolvUpdateMe() const
{
return (0 != action_ & DO_UPDATE_IGN_MARK);
}
//----------------------------//
// Mutators
//----------------------------//
public:
// Retrieve the data from the result set
void Build(CDMResultSet &rs, Int32 startCKColumn);
void SetCKTag(TInt64 val)
{
ckTag_ = val;
}
void SetIgnoreMark(TInt32 val)
{
ignore_ = val;
}
void SetRangeResolvWillDeleteMe()
{
action_ |= DO_DELETE;
}
void SetRangeResolvWillUpdateMe()
{
action_ |= DO_UPDATE_IGN_MARK;
}
private:
//-- Prevent copying
CRUIUDLogRecord& operator= (const CRUIUDLogRecord &other);
private:
// Constructor callees
void ReadControlColumns(CDMResultSet &rs, Int32 startCKColumn);
void ReadCKColumns(CDMResultSet &rs, Int32 startCKColumn);
private:
TInt64 syskey_;
TInt32 epoch_;
TInt32 opType_;
TInt32 ignore_;
TInt32 rangeSize_;
CRUUpdateBitmap *pUpdateBitmap_;
// The clustering key tuple
CDMSqlTuple ckTuple_;
// Take enough room to prevent overflows if the delta is extremely big
TInt64 ckTag_;
enum Action {
DO_DELETE,
DO_UPDATE_IGN_MARK
};
ULng32 action_; // What to do with the current record?
};
// Declare the class CRUIUDLogRecordList with this macro
DECLARE_PTRLIST(REFRESH_LIB_CLASS, CRUIUDLogRecord);
#endif