/**********************************************************************
// @@@ 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 @@@
**********************************************************************/
/* -*-C++-*-
****************************************************************************
*
* File:         SequenceGeneratorAttributes.h        
* Description:  The attributes of the sequence generator
* Created:      4/22/08
* Language:     C++
*
****************************************************************************/
 
#ifndef SEQUENCEGENERATORATTRIBUTES_H
#define SEQUENCEGENERATORATTRIBUTES_H

#include "ComSmallDefs.h"

class ComSpace;

// -----------------------------------------------------------------------
// contents of this file
// -----------------------------------------------------------------------
class SequenceGeneratorAttributes;

// ***********************************************************************
// SequenceGeneratorAttributes contains all the attributes of a
// sequence generator
// ***********************************************************************
class SequenceGeneratorAttributes : public NABasicObject
{
public:
  // ---------------------------------------------------------------------
  // Constructor functions
  // ---------------------------------------------------------------------
  SequenceGeneratorAttributes(const Int64                     psgStartValue,
                              const Int64                     psgIncrement,
                              const Int64                     psgMaxValue,
                              const Int64                     psgMinValue,                    
                              const ComSequenceGeneratorType  psgSGType,
                              const ComSQLDataType            psgSQLDataType,
                              const ComFSDataType             psgFSDataType,
                              const NABoolean                 psgCycleOption,
                              const NABoolean                 psgResetOption,
			      const ComUID                    psgObjectUID,
			      const Int64                         psgCache,
			      const Int64                         psgNextValue,
			      const Int64                         psgEndValue = 0,
                              const Int64                         psgRedefTime = 0,
                              CollHeap * h=0)
    : sgStartValue_(psgStartValue),
    sgIncrement_(psgIncrement),
    sgMaxValue_(psgMaxValue),
    sgMinValue_(psgMinValue),
    sgSGType_(psgSGType),
    sgSQLDataType_(psgSQLDataType),
    sgFSDataType_(psgFSDataType),
    sgCycleOption_(psgCycleOption),
    sgResetOption_(psgResetOption),
    sgObjectUID_(psgObjectUID),
    sgCache_(psgCache),
    sgNextValue_(psgNextValue),
    sgEndValue_(psgEndValue),
    sgRedefTime_(psgRedefTime)
  {}

      
 SequenceGeneratorAttributes(CollHeap * h=0)
   : sgStartValue_(0),
    sgIncrement_(0),
    sgMaxValue_(0),
    sgMinValue_(0),
    sgSGType_(COM_UNKNOWN_SG),
    sgSQLDataType_(COM_UNKNOWN_SDT),
    sgFSDataType_(COM_UNKNOWN_FSDT),
    sgCycleOption_(FALSE),
    sgResetOption_(FALSE),
    sgObjectUID_(0),
    sgCache_(0),
    sgNextValue_(0),
    sgEndValue_(0),
    sgRedefTime_(0)
      {}
  
  // copy ctor
  SequenceGeneratorAttributes (const SequenceGeneratorAttributes & sga, CollHeap * h=0) 
    : 
  sgStartValue_(sga.sgStartValue_),
    sgIncrement_(sga.sgIncrement_),
    sgMaxValue_(sga.sgMaxValue_),
    sgMinValue_(sga.sgMinValue_),
    sgSGType_(sga.sgSGType_),
    sgSQLDataType_(sga.sgSQLDataType_),
    sgFSDataType_(sga.sgFSDataType_),
    sgCycleOption_(sga.sgCycleOption_),
    sgResetOption_(sga.sgResetOption_),
    sgObjectUID_(sga.sgObjectUID_),
    sgCache_(sga.sgCache_),
    sgNextValue_(sga.sgNextValue_),
    sgEndValue_(sga.sgEndValue_),
    sgRedefTime_(sga.sgRedefTime_)
      {}
  
  // ---------------------------------------------------------------------
  // Sequence generator functions
  // ---------------------------------------------------------------------

  const Int64                      &getSGStartValue()   const     { return sgStartValue_; }
  const Int64                      &getSGIncrement()    const     { return sgIncrement_; }
  const Int64                      &getSGMaxValue()     const     { return sgMaxValue_; }
  const Int64                      &getSGMinValue()     const     { return sgMinValue_; }
  const ComSequenceGeneratorType   &getSGSGType()       const     { return sgSGType_; }
  const ComSQLDataType             &getSGSQLDataType()  const     { return sgSQLDataType_; }
  const ComFSDataType              &getSGFSDataType()   const     { return sgFSDataType_; }
  const NABoolean                   &getSGCycleOption()  const	  { return sgCycleOption_; }
  const NABoolean                  &getSGResetOption() const           {return sgResetOption_;}
  const ComUID                     &getSGObjectUID()    const     { return sgObjectUID_; }
  const Int64                        &getSGCache()   const     { return sgCache_; }
  const Int64                      &getSGNextValue()   const     { return sgNextValue_; }
  const Int64                      &getSGEndValue()   const     { return sgEndValue_; }
  const Int64                      &getSGRedefTime() const     { return sgRedefTime_; }
  void setSGStartValue(const Int64 psgStartValue)
  { sgStartValue_= psgStartValue; }

  void setSGIncrement(const Int64 psgIncrement)
  { sgIncrement_ = psgIncrement; }

  void setSGMaxValue(const Int64 psgMaxValue)
  { sgMaxValue_ = psgMaxValue; }

  void setSGMinValue(const Int64 psgMinValue)
  { sgMinValue_ = psgMinValue; }

  void setSGSGType(const ComSequenceGeneratorType psgSGType)
  { sgSGType_ = psgSGType; }

  void setSGSQLDataType(const ComSQLDataType psgSQLDataType)
  { sgSQLDataType_ = psgSQLDataType; }

  void setSGFSDataType(const ComFSDataType psgFSDataType)
  { sgFSDataType_ = psgFSDataType; }

 void  setSGCycleOption(const NABoolean psgCycleOption)
  { sgCycleOption_ = psgCycleOption; }

 void  setSGResetOption(const NABoolean psgResetOption)
  { sgResetOption_ = psgResetOption; }

 void setSGObjectUID(const ComUID psgObjectUID)
  { sgObjectUID_ = psgObjectUID; }
  
  void setSGCache(const Int64 psgCache)
  { sgCache_= psgCache; }

  void setSGNextValue(const Int64 psgNextValue)
  { sgNextValue_= psgNextValue; }

  void setSGEndValue(const Int64 psgEndValue)
  { sgEndValue_= psgEndValue; }

  void setSGRedefTime(const Int64 psgRedefTime)
  { sgRedefTime_= psgRedefTime; }

  static void genSequenceName(const NAString &catName, const NAString &schName, 
                              const NAString &tabName, const NAString &colName,
                              NAString &seqName);
  
  const void display (ComSpace *space, NAString * nas, 
                      NABoolean noNext = FALSE) const;
 
private:

  // Sequence generator

  Int64                     sgStartValue_;
  Int64                     sgIncrement_;
  Int64                     sgMaxValue_;
  Int64                     sgMinValue_;
  ComSequenceGeneratorType  sgSGType_;
  ComSQLDataType            sgSQLDataType_;
  ComFSDataType             sgFSDataType_;
  NABoolean                 sgCycleOption_;
  NABoolean                 sgResetOption_;
  ComUID                    sgObjectUID_;
  Int64                        sgCache_;
  Int64                        sgNextValue_;
  Int64                        sgEndValue_;
  Int64                        sgRedefTime_;
}; // class SequenceGeneratorAttributes

#endif  /* SEQUENCEGENERATORATTRIBUTES_H */
