/**********************************************************************
// @@@ 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:         ComSchemaName.C
 * Description:  methods for class ComSchemaName
 *
 * Created:      9/12/95
 * Language:     C++
 *
 *
 *
 *****************************************************************************
 */


#define  SQLPARSERGLOBALS_NADEFAULTS		// first

#include <string.h>
#include "ComASSERT.h"
#include "ComMPLoc.h"
#include "ComSchemaName.h"
#include "ComSqlText.h"
#include "NAString.h"

#include "SqlParserGlobals.h"			// last


//
// constructors
//

//
// default constructor
//
ComSchemaName::ComSchemaName () 
{
}

//
// initializing constructor
//
ComSchemaName::ComSchemaName (const NAString &externalSchemaName)
{
  scan(externalSchemaName);
}

//
// initializing constructor
//
ComSchemaName::ComSchemaName (const NAString &externalSchemaName,
                              size_t &bytesScanned)
{
  scan(externalSchemaName, bytesScanned);
}

//
// initializing constructor
//
ComSchemaName::ComSchemaName (const ComAnsiNamePart &schemaNamePart)
: schemaNamePart_ (schemaNamePart)
{
}

//
// initializing constructor
//
ComSchemaName::ComSchemaName (const ComAnsiNamePart &catalogNamePart,
                              const ComAnsiNamePart &schemaNamePart)
: catalogNamePart_ (catalogNamePart)
, schemaNamePart_ (schemaNamePart)
{
  // "cat." is invalid
  if (NOT catalogNamePart_.isEmpty() AND schemaNamePart_.isEmpty())
    clear();
}


//
// virtual destructor
//
ComSchemaName::~ComSchemaName ()
{
}


//
// assignment operator
//
ComSchemaName &ComSchemaName::operator= (const NAString &rhsSchemaName)
{
  clear();
  scan(rhsSchemaName);
  return *this;
}

// 
// accessors
//
const NAString &
ComSchemaName::getCatalogNamePartAsAnsiString(NABoolean) const
{
  return catalogNamePart_.getExternalName();
}

const NAString &
ComSchemaName::getSchemaNamePartAsAnsiString(NABoolean) const
{
  return schemaNamePart_.getExternalName();
}

NAString
ComSchemaName::getExternalName(NABoolean) const
{
  NAString extSchemaName;
  #ifndef NDEBUG
  Int32 ok = 0;
  #endif

  if (NOT schemaNamePart_.isEmpty())
  {
    if (NOT catalogNamePart_.isEmpty())
    { 
  #ifndef NDEBUG
      ok = 1;
  #endif
      extSchemaName = getCatalogNamePartAsAnsiString() + "." +
      		      getSchemaNamePartAsAnsiString();
    }
    else
    {
      extSchemaName = getSchemaNamePartAsAnsiString();
    }
  }

  #ifndef NDEBUG
    if (!ok) 
      cerr << "Warning: incomplete ComSchemaName " << extSchemaName << endl;
  #endif
  return extSchemaName;
}

//
// mutators
//

//
// Resets data members
//
void ComSchemaName::clear()
{
  catalogNamePart_.clear();
  schemaNamePart_.clear();
}


//
//  private methods
//
//
// Scans (parses) input external-format schema name.
//
NABoolean
ComSchemaName::scan(const NAString &externalSchemaName)
{
  size_t bytesScanned;
  return scan(externalSchemaName, bytesScanned);
}

//
// Scans (parses) input external-format schema name.
//
// This method assumes that the parameter  externalSchemaName  only
// contains the external-format schema name.  The syntax of an
// schema name is
//
//   [ <catalog-name-part> ] . <schema-name-part>
//
// A schema name part must be specified; the catalog name part is optional.
//
// The method returns the number of bytes scanned via the parameter
// bytesScanned.  If the scanned schema name is illegal, bytesScanned
// contains the number of bytes examined when the name is determined
// to be invalid.
//
// If the specified external-format schema name is valid, this method
// returns TRUE and saves the parsed ANSI SQL name part into data
// members catalogNamePart_ and schemaNamePart_; otherwise, it returns
// FALSE and does not changes the contents of the data members.
//
NABoolean
ComSchemaName::scan(const NAString &externalSchemaName,
                    size_t &bytesScanned)
{
  size_t count;
  size_t externalSchemaNameLen = externalSchemaName.length();
  bytesScanned = 0;

  // Each ComAnsiNamePart ctor below must be preceded by "count = 0;"
  // -- see ComAnsiNamePart.cpp, and for a better scan implementation,
  //    see ComObjectName::scan() + ComObjectName(bytesScanned) ctor.

  // ---------------------------------------------------------------------
  // Scan the leftmost ANSI SQL name part.
  // ---------------------------------------------------------------------

  count = 0;
  ComAnsiNamePart part1(externalSchemaName, count);
  bytesScanned += count;
  if (NOT part1.isValid())
    return FALSE;

  if (bytesScanned >= externalSchemaNameLen)
  {
    ComASSERT(bytesScanned == externalSchemaNameLen);
    schemaNamePart_  = part1;
    return TRUE;					// "sch"
  }

  // Get past the period separator
  if (NOT ComSqlText.isPeriod(externalSchemaName[bytesScanned++]))
    return FALSE;

  // ---------------------------------------------------------------------
  // Scan the last ANSI SQL name part
  // ---------------------------------------------------------------------

  Int32 remainingLen = externalSchemaNameLen - bytesScanned;
  NAString remainingName = externalSchemaName(bytesScanned, remainingLen);
  count = 0;
  ComAnsiNamePart part2(remainingName, count);
  bytesScanned += count;
  if (NOT part2.isValid())
    return FALSE;

  if (bytesScanned == externalSchemaNameLen)
  {
    catalogNamePart_ = part1;
    schemaNamePart_  = part2;
    return TRUE;					// "cat.sch"
  }

  // The specified external-format object name contains some extra
  // trailing characters -- illegal.
  //
  return FALSE;

} // ComSchemaName::scan()



void ComSchemaName::setDefinitionSchemaName (const COM_VERSION version)
{
}

