/**********************************************************************
// @@@ 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:         RuOptions.cpp
* Description:  API to the command-line parameters of the REFRESH utility.
*
*
* Created:      01/09/2000
* Language:     C++
* 
*
* 
******************************************************************************
*/

#include "RuOptions.h"
#include "uofsIpcMessageTranslator.h"
#include "RuException.h"

// the refresh messages output filename will be initialialized to empty string
CDSString CRUOptions::defOutFilename = "REFRESH.LOG";

//--------------------------------------------------------------------------//
//	Constructors
//--------------------------------------------------------------------------//

CRUOptions::CRUOptions() :
	invocType_(SINGLE_MV),
	isRecompute_(FALSE),
	isCancel_(FALSE),
	lcType_(DONTCARE_LC), 
	catalogName_(""),
	schemaName_(""),
	objectName_(""),
	fullName_(""),
	defaultSchema_(""),
#if defined(NA_WINNT)
        outFilename_(defOutFilename),
#else
        outFilename_(""),
#endif
	forceFilename_("")
{}

CRUOptions::CRUOptions(const CRUOptions& other) :
	invocType_(other.invocType_),
	isRecompute_(other.isRecompute_),
	isCancel_(other.isCancel_),
	lcType_(other.lcType_),
	catalogName_(other.catalogName_),
	schemaName_(other.schemaName_),
	objectName_(other.objectName_),
	fullName_(other.fullName_),
	outFilename_(other.outFilename_),
	forceFilename_(other.forceFilename_)
{}

//--------------------------------------------------------------------------//
//	CRUOptions::FindDebugOption()
//
//	Search for the option using the <testpoint, objectName> pair.
//	If the object name in the options list is empty, 
//	the search does not use it as a criterion.
//
//--------------------------------------------------------------------------//

CRUOptions::DebugOption *CRUOptions::
FindDebugOption(Int32 testpoint, const CDSString &objName)
{
	DSListPosition pos = debugOptionList_.GetHeadPosition();
	while (NULL != pos)
	{
		DebugOption &opt = debugOptionList_.GetNext(pos);

		if (testpoint != opt.testpoint_)
		{
			continue;
		}

		if (0 == opt.objName_.GetLength()
			||
			objName == opt.objName_
			)
		{
			return &opt;
		}
	}

	return NULL;
}

//--------------------------------------------------------------------------//
//	CRUOptions::AddDebugOption()
//--------------------------------------------------------------------------//

void CRUOptions::AddDebugOption(Int32 testpoint, const CDSString &objName)
{
	CRUOptions::DebugOption opt;

	opt.testpoint_ = testpoint;
	opt.objName_ = objName;

	debugOptionList_.AddTail(opt);

        // when debuuging is set outfile is always set to default out filename
        if (outFilename_.IsEmpty())
           outFilename_ = defOutFilename;
}

#ifdef _DEBUG
//--------------------------------------------------------------------------//
//	CRUOptions::Dump()
//--------------------------------------------------------------------------//
// LCOV_EXCL_START :dpm
void CRUOptions::Dump(CDSString &to) 
{
	to += "\n\t\tCOMMAND OPTIONS DUMP\n\n";

	to += "Catalog name = " + GetCatalogName() + "\n";
	to += "Schema name = " + GetSchemaName() + "\n";
	to += "Object name = " + GetObjectName() + " ";
	
	switch (GetInvocType()) {

	case SINGLE_MV:	to += "(MV)\n";
					break;

	case CASCADE  : to += "(CASCADE)\n";
					break;

	case MV_GROUP : to += "(MV GROUP)\n";
					break;

	default		  :	RUASSERT(FALSE);
	}

	to += "Recompute mode = ";
	to += (IsRecompute() ? "YES" : "NO");
	to += "\n";

	to += "DDL locks cancel mode = ";
	to += (IsCancel() ? "YES" : "NO");
	to += "\n";

	switch (GetLogCleanupType()) {

	case DONTCARE_LC:	to += "LOG CLEANUP NOT SPECIFIED";
						break;

	case WITH_LC	:	to += "INCLUDING LOG CLEANUP";
						break;

	case WITHOUT_LC	:	to += "NOT INCLUDING LOG CLEANUP";
						break;

	case DO_ONLY_LC :	to += "LOG CLEANUP ONLY";
						break;
	
	default		  :		ASSERT(FALSE);
	}

	to += "\nOutput file = \""; 
	to += GetOutputFilename();
	to += "\"\n";

	char buf[200];
	DSListPosition pos = debugOptionList_.GetHeadPosition();
	while (NULL != pos)
	{
		DebugOption &opt = debugOptionList_.GetNext(pos);
		sprintf(buf, "TESTPOINT %6d\t%s\n", opt.testpoint_, opt.objName_.c_string());
		to += CDSString(buf);
	}
}
// LCOV_EXCL_STOP
#endif

//--------------------------------------------------------------------------//
//	CRUOptions::DebugOption &operator = ()
//--------------------------------------------------------------------------//

CRUOptions::DebugOption &CRUOptions::DebugOption::
operator = (const CRUOptions::DebugOption &other)
{
	testpoint_ = other.testpoint_;
	objName_ = other.objName_;

	return *this;
}

//--------------------------------------------------------------------------//
//	CRUOptions::StoreData()
//
//	The LoadData/StoreData methods move only the output 
//	file's name and the debug options between the processes.
//--------------------------------------------------------------------------//
// LCOV_EXCL_START :cnu
void CRUOptions::StoreData(CUOFsIpcMessageTranslator &translator)
{
 Int32 stringSize;
	
	// Output filename
	stringSize = outFilename_.GetLength() + 1;
	translator.WriteBlock(&stringSize, sizeof(Int32));
#pragma nowarn(1506)   // warning elimination 
	translator.WriteBlock(outFilename_.c_string(), stringSize);
#pragma warn(1506)  // warning elimination 
	
	// Force filename
	stringSize = forceFilename_.GetLength() + 1;
	translator.WriteBlock(&stringSize, sizeof(Int32));
#pragma nowarn(1506)   // warning elimination 
	translator.WriteBlock(forceFilename_.c_string(), stringSize);
#pragma warn(1506)  // warning elimination 

	// Debug options 
 Int32 size = debugOptionList_.GetCount();
	translator.WriteBlock(&size,sizeof(Int32));

	DSListPosition pos = debugOptionList_.GetHeadPosition();
	while (NULL != pos)
	{
		DebugOption &opt = debugOptionList_.GetNext(pos);
		
		translator.WriteBlock(&(opt.testpoint_),sizeof(Int32));
		
		stringSize = opt.objName_.GetLength() + 1;
		translator.WriteBlock(&stringSize, sizeof(Int32));
#pragma nowarn(1506)   // warning elimination 
		translator.WriteBlock(opt.objName_.c_string(), stringSize);
#pragma warn(1506)  // warning elimination 
	}
}
// LCOV_EXCL_STOP

//--------------------------------------------------------------------------//
//	CRUOptions::LoadData()
//--------------------------------------------------------------------------//
// LCOV_EXCL_START :cnu
void CRUOptions::LoadData(CUOFsIpcMessageTranslator &translator)
{
	char buf[PACK_BUFFER_SIZE];
 Int32 stringSize;
	
	// Output filename
	translator.ReadBlock(&stringSize, sizeof(Int32));
#pragma nowarn(1506)   // warning elimination 
	translator.ReadBlock(buf, stringSize);
#pragma warn(1506)  // warning elimination 
	
	CDSString outFileName(buf);
	SetOutputFilename(outFileName);

	// Force filename
	translator.ReadBlock(&stringSize, sizeof(Int32));
#pragma nowarn(1506)   // warning elimination 
	translator.ReadBlock(buf, stringSize);
#pragma warn(1506)  // warning elimination 
	
	CDSString forceFileName(buf);
	SetForceFilename(forceFileName);

	// Debug options 
 Int32 size;
	translator.ReadBlock(&size,sizeof(Int32));

	for (Int32 i=0;i<size;i++)
	{
	 Int32 testpoint;
				
		translator.ReadBlock(&testpoint,sizeof(Int32));
		
		translator.ReadBlock(&stringSize, sizeof(Int32));
		
		RUASSERT(PACK_BUFFER_SIZE > stringSize);

#pragma nowarn(1506)   // warning elimination 
		translator.ReadBlock(buf, stringSize);
#pragma warn(1506)  // warning elimination 
		
		CDSString objName(buf);
		AddDebugOption(testpoint, objName);
	}
}
// LCOV_EXCL_STOP
