/**********************************************************************
// @@@ 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.cpp
* Description:  The attributes of the sequence generator
* Created:      
* Language:     C++
*
****************************************************************************/

#include "SequenceGeneratorAttributes.h"
#include "ComSpace.h"

void SequenceGeneratorAttributes::genSequenceName(const NAString &catName, const NAString &schName, 
                                                  const NAString &tabName, const NAString &colName,
                                                  NAString &seqName)
{
  seqName = "_" + catName + "_" + schName + "_" + 
    tabName + "_" + colName + "_" ;
}

const void SequenceGeneratorAttributes::display 
(ComSpace *space, NAString * nas, NABoolean noNext) const
{
  char buf[10000];

  if (noNext)
    sprintf(buf, "  START WITH %li", 
            getSGStartValue());
  else
    sprintf(buf, "  START WITH %li /* NEXT AVAILABLE VALUE %li */", 
            getSGStartValue(), getSGNextValue());
    
  if (nas)
    *nas += buf;
  else
    space->allocateAndCopyToAlignedSpace(buf, strlen(buf), sizeof(short));

  sprintf(buf, "  INCREMENT BY %li", 
          getSGIncrement());
  if (nas)
    *nas += buf;
  else
    space->allocateAndCopyToAlignedSpace(buf, strlen(buf), sizeof(short));

  if (getSGMaxValue() == 0)
    sprintf(buf, "  NO MAXVALUE");
  else
    sprintf(buf, "  MAXVALUE %li", 
            getSGMaxValue());
  if (nas)
    *nas += buf;
  else
    space->allocateAndCopyToAlignedSpace(buf, strlen(buf), sizeof(short));
  
  if (getSGMinValue() == 0)
    sprintf(buf, "  NO MINVALUE");
  else
    sprintf(buf, "  MINVALUE %li", 
            getSGMinValue());
  if (nas)
    *nas += buf;
  else
    space->allocateAndCopyToAlignedSpace(buf, strlen(buf), sizeof(short));

  if (getSGCache() == 0)
    sprintf(buf, "  NO CACHE");
  else
    sprintf(buf, "  CACHE %li", 
            getSGCache());
  if (nas)
    *nas += buf;
  else
    space->allocateAndCopyToAlignedSpace(buf, strlen(buf), sizeof(short));

  if (getSGCycleOption())
    sprintf(buf, "  CYCLE");
  else
    sprintf(buf, "  NO CYCLE");
  if (nas)
    *nas += buf;
  else
    space->allocateAndCopyToAlignedSpace(buf, strlen(buf), sizeof(short));

  if (getSGFSDataType() == COM_UNSIGNED_BIN16_FSDT)
      sprintf(buf, "  SMALLINT UNSIGNED ");
  else if (getSGFSDataType() == COM_UNSIGNED_BIN32_FSDT)
      sprintf(buf, "  INT UNSIGNED ");
  else
    sprintf(buf, "  LARGEINT ");
  if (nas)
    *nas += buf;
  else
    space->allocateAndCopyToAlignedSpace(buf, strlen(buf), sizeof(short));
}

