/**************************************************************
 * 
 * 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.
 * 
 *************************************************************/

#ifndef _OSL_DIAGNOSE_H_
#include <osl/diagnose.h>
#endif
#include "mysqlc_propertyids.hxx"

using ::rtl::OUString;

namespace connectivity
{
namespace mysqlc
{
const sal_Char* getPROPERTY_QUERYTIMEOUT()			{ return "QueryTimeOut"; }
const sal_Char* getPROPERTY_MAXFIELDSIZE()			{ return "MaxFieldSize"; }
const sal_Char* getPROPERTY_MAXROWS()				{ return "MaxRows"; }
const sal_Char* getPROPERTY_CURSORNAME()			{ return "CursorName"; }
const sal_Char* getPROPERTY_RESULTSETCONCURRENCY()	{ return "ResultSetConcurrency"; }
const sal_Char* getPROPERTY_RESULTSETTYPE()			{ return "ResultSetType"; }
const sal_Char* getPROPERTY_FETCHDIRECTION()		{ return "FetchDirection"; }
const sal_Char* getPROPERTY_FETCHSIZE()				{ return "FetchSize"; }
const sal_Char* getPROPERTY_ESCAPEPROCESSING()		{ return "EscapeProcessing"; }
const sal_Char* getPROPERTY_USEBOOKMARKS()			{ return "UseBookmarks"; }

const sal_Char* getPROPERTY_NAME()					{ return "Name"; }
const sal_Char* getPROPERTY_TYPE()					{ return "Type"; }
const sal_Char* getPROPERTY_TYPENAME()				{ return "TypeName"; }
const sal_Char* getPROPERTY_PRECISION()				{ return "Precision"; }
const sal_Char* getPROPERTY_SCALE()					{ return "Scale"; }
const sal_Char* getPROPERTY_ISNULLABLE()			{ return "IsNullable"; }
const sal_Char* getPROPERTY_ISAUTOINCREMENT()		{ return "IsAutoIncrement"; }
const sal_Char* getPROPERTY_ISROWVERSION()			{ return "IsRowVersion"; }
const sal_Char* getPROPERTY_DESCRIPTION()			{ return "Description"; }
const sal_Char* getPROPERTY_DEFAULTVALUE()			{ return "DefaultValue"; }

const sal_Char* getPROPERTY_REFERENCEDTABLE()		{ return "ReferencedTable"; }
const sal_Char* getPROPERTY_UPDATERULE()			{ return "UpdateRule"; }
const sal_Char* getPROPERTY_DELETERULE()			{ return "DeleteRule"; }
const sal_Char* getPROPERTY_CATALOG()				{ return "Catalog"; }
const sal_Char* getPROPERTY_ISUNIQUE()				{ return "IsUnique"; }
const sal_Char* getPROPERTY_ISPRIMARYKEYINDEX()		{ return "IsPrimaryKeyIndex"; }
const sal_Char* getPROPERTY_ISCLUSTERED()			{ return "IsClustered"; }
const sal_Char* getPROPERTY_ISASCENDING()			{ return "IsAscending"; }
const sal_Char* getPROPERTY_SCHEMANAME()			{ return "SchemaName"; }
const sal_Char* getPROPERTY_CATALOGNAME()			{ return "CatalogName"; }
const sal_Char* getPROPERTY_COMMAND()				{ return "Command"; }
const sal_Char* getPROPERTY_CHECKOPTION()			{ return "CheckOption"; }
const sal_Char* getPROPERTY_PASSWORD()				{ return "Password"; }
const sal_Char* getPROPERTY_RELATEDCOLUMN()			{ return "RelatedColumn"; }

const sal_Char* getSTAT_INVALID_INDEX()				{ return "Invalid descriptor index"; }

const sal_Char* getPROPERTY_FUNCTION()				{ return "Function"; }
const sal_Char* getPROPERTY_TABLENAME()				{ return "TableName"; }
const sal_Char* getPROPERTY_REALNAME()				{ return "RealName"; }
const sal_Char* getPROPERTY_DBASEPRECISIONCHANGED()	{ return "DbasePrecisionChanged"; }
const sal_Char* getPROPERTY_ISCURRENCY()			{ return "IsCurrency"; }
const sal_Char* getPROPERTY_ISBOOKMARKABLE()		{ return "IsBookmarkable"; }

const sal_Char* getPROPERTY_FORMATKEY()				{ return "FormatKey"; }
const sal_Char* getPROPERTY_LOCALE()				{ return "Locale"; }

const sal_Char* getPROPERTY_AUTOINCREMENTCREATION()	{ return "AutoIncrementCreation"; }
const sal_Char* getPROPERTY_PRIVILEGES()			{ return "Privileges"; }
	//============================================================
	//= error messages
	//============================================================
const sal_Char* getERRORMSG_SEQUENCE()				{ return "Function sequence error"; }
const sal_Char* getSQLSTATE_SEQUENCE()				{ return "HY010"; }
const sal_Char* getSQLSTATE_GENERAL()				{ return "HY0000"; }
const sal_Char* getSTR_DELIMITER()					{ return "/"; }



/* {{{ OPropertyMap::~OPropertyMap() -I- */
OPropertyMap::~OPropertyMap()
{
	::std::map<sal_Int32 , rtl_uString*>::iterator aIter = m_aPropertyMap.begin();
	for(; aIter != m_aPropertyMap.end(); ++aIter) {
		if (aIter->second) {
			rtl_uString_release(aIter->second);
		}
	}
}
/* }}} */


/* {{{ OPropertyMap::getNameByIndex() -I- */
OUString OPropertyMap::getNameByIndex(sal_Int32 idx) const
{
	OUString sRet;
	::std::map<sal_Int32 , rtl_uString*>::const_iterator aIter = m_aPropertyMap.find(idx);
	if (aIter == m_aPropertyMap.end()) {
		sRet = const_cast<OPropertyMap*>(this)->fillValue(idx);
	} else {
		sRet = aIter->second;
	}
	return sRet;
}
/* }}} */

typedef const sal_Char * (*property_callback)();

static const property_callback property_callbacks[PROPERTY_ID_LAST] =
{
	NULL, /* PROPERTY_ID_FIRST */
	getPROPERTY_QUERYTIMEOUT,
	getPROPERTY_MAXFIELDSIZE,
	getPROPERTY_MAXROWS,
	getPROPERTY_CURSORNAME,
	getPROPERTY_RESULTSETCONCURRENCY,
	getPROPERTY_RESULTSETTYPE,
	getPROPERTY_FETCHDIRECTION,
	getPROPERTY_FETCHSIZE,
	getPROPERTY_ESCAPEPROCESSING,
	getPROPERTY_USEBOOKMARKS,
	// Column
	getPROPERTY_NAME,
	getPROPERTY_TYPE,
	getPROPERTY_TYPENAME,
	getPROPERTY_PRECISION,
	getPROPERTY_SCALE,
	getPROPERTY_ISNULLABLE,
	getPROPERTY_ISAUTOINCREMENT,
	getPROPERTY_ISROWVERSION,
	getPROPERTY_DESCRIPTION,
	getPROPERTY_DEFAULTVALUE,

	getPROPERTY_REFERENCEDTABLE,
	getPROPERTY_UPDATERULE,
	getPROPERTY_DELETERULE,
	getPROPERTY_CATALOG,
	getPROPERTY_ISUNIQUE,
	getPROPERTY_ISPRIMARYKEYINDEX,
	getPROPERTY_ISCLUSTERED,
	getPROPERTY_ISASCENDING,
	getPROPERTY_SCHEMANAME,
	getPROPERTY_CATALOGNAME,

	getPROPERTY_COMMAND,
	getPROPERTY_CHECKOPTION,
	getPROPERTY_PASSWORD,
	getPROPERTY_RELATEDCOLUMN,

	getPROPERTY_FUNCTION,
	getPROPERTY_TABLENAME,
	getPROPERTY_REALNAME,
	getPROPERTY_DBASEPRECISIONCHANGED,
	getPROPERTY_ISCURRENCY,
	getPROPERTY_ISBOOKMARKABLE,
	getSTAT_INVALID_INDEX,
	getERRORMSG_SEQUENCE,
	getSQLSTATE_SEQUENCE,
	getSQLSTATE_GENERAL,
	getSTR_DELIMITER,
	getPROPERTY_FORMATKEY,
	getPROPERTY_LOCALE,
	getPROPERTY_AUTOINCREMENTCREATION,
	getPROPERTY_PRIVILEGES,
};


/* {{{ OPropertyMap::fillValue() -I- */
OUString OPropertyMap::fillValue(sal_Int32 idx)
{
	rtl_uString* pStr = NULL;
	rtl_uString_newFromAscii(&pStr, property_callbacks[idx]());
	m_aPropertyMap[idx] = pStr;
	return pStr;
}
/* }}} */

} /* mysqlc */
} /* connectivity */

/*
 * Local variables:
 * tab-width: 4
 * c-basic-offset: 4
 * End:
 * vim600: noet sw=4 ts=4 fdm=marker
 * vim<600: noet sw=4 ts=4
 */
