Tag: cws_src680_dba204a User: oj Date: 06/05/22 03:51:50 Modified: /dba/connectivity/source/parse/ sqlbison.y, sqlnode.cxx
Log: #i50910# refactoring and recognize between in predicate check File Changes: Directory: /dba/connectivity/source/parse/ ========================================== File [changed]: sqlbison.y Url: http://dba.openoffice.org/source/browse/dba/connectivity/source/parse/sqlbison.y?r1=1.51&r2=1.51.164.1 Delta lines: +59 -96 --------------------- --- sqlbison.y 17 Feb 2005 10:15:54 -0000 1.51 +++ sqlbison.y 22 May 2006 10:51:45 -0000 1.51.164.1 @@ -1,7 +1,7 @@ %{ //-------------------------------------------------------------------------- // -// $Header: dba/connectivity/source/parse/sqlbison.y,v 1.51 2005/02/17 10:15:54 vg Exp $ +// $Header: dba/connectivity/source/parse/sqlbison.y,v 1.51.164.1 2006/05/22 10:51:45 oj Exp $ // // Copyright 2000 Sun Microsystems, Inc. All Rights Reserved. // @@ -9,7 +9,7 @@ // OJ // // Last change: -// $Author: vg $ $Date: 2005/02/17 10:15:54 $ $Revision: 1.51 $ +// $Author: oj $ $Date: 2006/05/22 10:51:45 $ $Revision: 1.51.164.1 $ // // Description: // @@ -1171,8 +1171,10 @@ } | comparison row_value_constructor { + if(xxx_pGLOBAL_SQLPARSER->inPredicateCheck()) + { $$ = SQL_NEW_RULE; - sal_Int16 nErg = xxx_pGLOBAL_SQLPARSER->buildComparsionRule($$,$2,$1); + sal_Int16 nErg = xxx_pGLOBAL_SQLPARSER->buildPredicateRule($$,$2,$1); if(nErg == 1) { OSQLParseNode* pTemp = $$; @@ -1185,6 +1187,11 @@ YYABORT; } } + else + { + YYERROR; + } + } ; comparison: SQL_LESS @@ -1208,16 +1215,22 @@ { if (xxx_pGLOBAL_SQLPARSER->inPredicateCheck()) { - OSQLParseNode* pColumnRef = newNode(aEmptyString, SQL_NODE_RULE,OSQLParser::RuleID(OSQLParseNode::column_ref)); - pColumnRef->append(newNode(xxx_pGLOBAL_SQLPARSER->getFieldName(),SQL_NODE_NAME)); - $$ = SQL_NEW_RULE; - $$->append(pColumnRef); - $$->append($1); - $$->append($2); - $$->append($3); - $$->append($4); - $$->append($5); + + sal_Int16 nErg = xxx_pGLOBAL_SQLPARSER->buildPredicateRule($$,$3,$2,$5); + if(nErg == 1) + { + OSQLParseNode* pTemp = $$; + $$ = pTemp->removeAt((sal_uInt32)0); + $$->insert(1,$1); + delete pTemp; + delete $4; + } + else + { + delete $$; + YYABORT; + } } else YYERROR; @@ -3677,75 +3690,25 @@ return s_nRuleIDs[(sal_uInt16)eRule]; } // ------------------------------------------------------------------------- -sal_Int16 OSQLParser::buildNode(OSQLParseNode*& pAppend,OSQLParseNode* pLiteral,OSQLParseNode*& pCompare) +sal_Int16 OSQLParser::buildNode(OSQLParseNode*& pAppend,OSQLParseNode* pCompare,OSQLParseNode* pLiteral,OSQLParseNode* pLiteral2) { OSQLParseNode* pColumnRef = new OSQLInternalNode(aEmptyString, SQL_NODE_RULE,OSQLParser::RuleID(OSQLParseNode::column_ref)); pColumnRef->append(new OSQLInternalNode(m_sFieldName,SQL_NODE_NAME)); - OSQLParseNode* pComp = new OSQLInternalNode(aEmptyString, SQL_NODE_RULE,OSQLParser::RuleID(OSQLParseNode::comparison_predicate)); + OSQLParseNode* pComp = NULL; + if ( SQL_ISTOKEN( pCompare, BETWEEN) && pLiteral2 ) + pComp = new OSQLInternalNode(aEmptyString, SQL_NODE_RULE,OSQLParser::RuleID(OSQLParseNode::between_predicate)); + else + pComp = new OSQLInternalNode(aEmptyString, SQL_NODE_RULE,OSQLParser::RuleID(OSQLParseNode::comparison_predicate)); + pComp->append(pColumnRef); pComp->append(pCompare); pComp->append(pLiteral); - pAppend->append(pComp); - return 1; -} -//----------------------------------------------------------------------------- -sal_Int16 OSQLParser::buildNode_Date(const double& fValue, sal_Int32 nType, OSQLParseNode*& pAppend,OSQLParseNode* pLiteral,OSQLParseNode*& pCompare) -{ - OSQLParseNode* pColumnRef = new OSQLInternalNode(aEmptyString, SQL_NODE_RULE,OSQLParser::RuleID(OSQLParseNode::column_ref)); - pColumnRef->append(new OSQLInternalNode(m_sFieldName,SQL_NODE_NAME)); - OSQLParseNode* pComp = new OSQLInternalNode(aEmptyString, SQL_NODE_RULE,OSQLParser::RuleID(OSQLParseNode::comparison_predicate)); - pComp->append(pColumnRef); - pComp->append(pCompare); - - OSQLParseNode* pNewNode = new OSQLInternalNode(aEmptyString, SQL_NODE_RULE,OSQLParser::RuleID(OSQLParseNode::set_fct_spec)); - pNewNode->append(new OSQLInternalNode(::rtl::OUString::createFromAscii("{"), SQL_NODE_PUNCTUATION)); - OSQLParseNode* pDateNode = new OSQLInternalNode(aEmptyString, SQL_NODE_RULE,OSQLParser::RuleID(OSQLParseNode::odbc_fct_spec)); - pNewNode->append(pDateNode); - pNewNode->append(new OSQLInternalNode(::rtl::OUString::createFromAscii("}"), SQL_NODE_PUNCTUATION)); - - switch (nType) - { - case DataType::DATE: - { - Date aDate = DBTypeConversion::toDate(fValue,DBTypeConversion::getNULLDate(m_xFormatter->getNumberFormatsSupplier())); - ::rtl::OUString aString = DBTypeConversion::toDateString(aDate); - pDateNode->append(new OSQLInternalNode(aEmptyString, SQL_NODE_KEYWORD, SQL_TOKEN_D)); - pDateNode->append(new OSQLInternalNode(aString, SQL_NODE_STRING)); - break; - } - case DataType::TIME: - { - Time aTime = DBTypeConversion::toTime(fValue); - ::rtl::OUString aString = DBTypeConversion::toTimeString(aTime); - pDateNode->append(new OSQLInternalNode(aEmptyString, SQL_NODE_KEYWORD, SQL_TOKEN_T)); - pDateNode->append(new OSQLInternalNode(aString, SQL_NODE_STRING)); - break; - } - case DataType::TIMESTAMP: - { - DateTime aDateTime = DBTypeConversion::toDateTime(fValue,DBTypeConversion::getNULLDate(m_xFormatter->getNumberFormatsSupplier())); - if (aDateTime.Seconds || aDateTime.Minutes || aDateTime.Hours) - { - ::rtl::OUString aString = DBTypeConversion::toDateTimeString(aDateTime); - pDateNode->append(new OSQLInternalNode(aEmptyString, SQL_NODE_KEYWORD, SQL_TOKEN_TS)); - pDateNode->append(new OSQLInternalNode(aString, SQL_NODE_STRING)); - } - else + if ( pLiteral2 ) { - Date aDate(aDateTime.Day,aDateTime.Month,aDateTime.Year); - pDateNode->append(new OSQLInternalNode(aEmptyString, SQL_NODE_KEYWORD, SQL_TOKEN_D)); - pDateNode->append(new OSQLInternalNode(DBTypeConversion::toDateString(aDate), SQL_NODE_STRING)); + pComp->append(new OSQLInternalNode(aEmptyString, SQL_NODE_KEYWORD,SQL_TOKEN_AND)); + pComp->append(pLiteral2); } - break; - } - } - - pComp->append(pNewNode); pAppend->append(pComp); - - delete pLiteral; - pLiteral = NULL; - return 1; } //----------------------------------------------------------------------------- @@ -3785,7 +3748,7 @@ sal_Int16 OSQLParser::buildComparsionRule(OSQLParseNode*& pAppend,OSQLParseNode* pLiteral) { OSQLParseNode* pComp = new OSQLInternalNode(::rtl::OUString::createFromAscii("="), SQL_NODE_EQUAL); - return buildComparsionRule(pAppend,pLiteral,pComp); + return buildPredicateRule(pAppend,pLiteral,pComp); } File [changed]: sqlnode.cxx Url: http://dba.openoffice.org/source/browse/dba/connectivity/source/parse/sqlnode.cxx?r1=1.38&r2=1.38.58.1 Delta lines: +234 -182 ----------------------- --- sqlnode.cxx 16 Jan 2006 15:04:30 -0000 1.38 +++ sqlnode.cxx 22 May 2006 10:51:46 -0000 1.38.58.1 @@ -4,9 +4,9 @@ * * $RCSfile: sqlnode.cxx,v $ * - * $Revision: 1.38 $ + * $Revision: 1.38.58.1 $ * - * last change: $Author: obo $ $Date: 2006/01/16 15:04:30 $ + * last change: $Author: oj $ $Date: 2006/05/22 10:51:46 $ * * The Contents of this file are made available subject to * the terms of GNU Lesser General Public License Version 2.1. @@ -282,8 +282,6 @@ //----------------------------------------------------------------------------- void OSQLParseNode::parseNodeToStr(::rtl::OUString& rString, const SQLParseNodeParameter& rParam) const { - - if (!isToken()) { // einmal auswerten wieviel Subtrees dieser Knoten besitzt @@ -432,6 +430,8 @@ } } } + else + i++; } } } @@ -566,36 +566,39 @@ return _rTable.getLength() != 0; } // ----------------------------------------------------------------------------- -sal_Int16 OSQLParser::buildComparsionRule(OSQLParseNode*& pAppend,OSQLParseNode* pLiteral,OSQLParseNode*& pCompare) +void OSQLParser::killThousandSeparator(OSQLParseNode* pLiteral) { - sal_Int16 nErg = 0; - if (m_xField.is()) + if ( pLiteral ) { - sal_Int32 nType = 0; - try + if ( s_xLocaleData->getLocaleItem(*m_pLocale).decimalSeparator.toChar() == ',' ) { - Any aValue; - { - aValue = m_xField->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_TYPE)); - aValue >>= nType; - } + pLiteral->m_aNodeValue = pLiteral->m_aNodeValue.replace('.', sal_Unicode()); + // and replace decimal + pLiteral->m_aNodeValue = pLiteral->m_aNodeValue.replace(',', '.'); } - catch( Exception& ) - { - return nErg; + else + pLiteral->m_aNodeValue = pLiteral->m_aNodeValue.replace(',', sal_Unicode()); } +} +// ----------------------------------------------------------------------------- +OSQLParseNode* OSQLParser::convertNode(sal_Int32 nType,OSQLParseNode*& pLiteral) +{ + if ( !pLiteral ) + return NULL; - if (pLiteral->isRule() && !SQL_ISRULE(pLiteral,value_exp)) + OSQLParseNode* pReturn = pLiteral; + + if ( pLiteral->isRule() && !SQL_ISRULE(pLiteral,value_exp)) { switch(nType) { case DataType::CHAR: case DataType::VARCHAR: case DataType::LONGVARCHAR: - if(!SQL_ISRULE(pLiteral,char_value_exp) && !buildStringNodes(pLiteral)) - break; + if ( !SQL_ISRULE(pReturn,char_value_exp) && !buildStringNodes(pReturn) ) + pReturn = NULL; default: - nErg = buildNode(pAppend,pLiteral,pCompare); + break; } } else @@ -608,16 +611,12 @@ case DataType::CHAR: case DataType::VARCHAR: case DataType::LONGVARCHAR: - nErg = buildNode(pAppend,pLiteral,pCompare); break; case DataType::DATE: case DataType::TIME: case DataType::TIMESTAMP: if (m_xFormatter.is()) - nErg = buildDate( nType, pAppend, pLiteral, pCompare ); - else - nErg = buildNode(pAppend,pLiteral,pCompare); - + pReturn = buildDate( nType, pReturn); break; default: m_sErrorMessage = m_pContext->getErrorMessage(IParseContext::ERROR_INVALID_COMPARE); @@ -629,9 +628,8 @@ case DataType::DATE: case DataType::TIME: case DataType::TIMESTAMP: - nErg = -1; - if (m_xFormatter.is()) - nErg = buildDate( nType, pAppend, pLiteral, pCompare ); + if ( m_xFormatter.is() ) + pReturn = buildDate( nType, pReturn); else m_sErrorMessage = m_pContext->getErrorMessage(IParseContext::ERROR_INVALID_DATE_COMPARE); break; @@ -653,20 +651,12 @@ case DataType::REAL: case DataType::DOUBLE: // kill thousand seperators if any - if (s_xLocaleData->getLocaleItem(*m_pLocale).decimalSeparator.toChar() == ',' ) - { - pLiteral->m_aNodeValue = pLiteral->m_aNodeValue.replace('.', sal_Unicode()); - // and replace decimal - pLiteral->m_aNodeValue = pLiteral->m_aNodeValue.replace(',', '.'); - } - else - pLiteral->m_aNodeValue = pLiteral->m_aNodeValue.replace(',', sal_Unicode()); - nErg = buildNode(pAppend,pLiteral,pCompare); + killThousandSeparator(pReturn); break; case DataType::CHAR: case DataType::VARCHAR: case DataType::LONGVARCHAR: - nErg = buildNode_STR_NUM(pAppend,pLiteral,pCompare); + pReturn = buildNode_STR_NUM(pReturn); break; default: m_sErrorMessage = m_pContext->getErrorMessage(IParseContext::ERROR_INVALID_INT_COMPARE); @@ -680,24 +670,13 @@ case DataType::FLOAT: case DataType::REAL: case DataType::DOUBLE: - if (inPredicateCheck()) - { // kill thousand seperators if any - if (s_xLocaleData->getLocaleItem(*m_pLocale).decimalSeparator.toChar() == ',' ) - { - pLiteral->m_aNodeValue = pLiteral->m_aNodeValue.replace('.', sal_Unicode()); - // and replace decimal - pLiteral->m_aNodeValue = pLiteral->m_aNodeValue.replace(',', '.'); - } - else - pLiteral->m_aNodeValue = pLiteral->m_aNodeValue.replace(',', sal_Unicode()); - } - nErg = buildNode(pAppend,pLiteral,pCompare); + killThousandSeparator(pReturn); break; case DataType::CHAR: case DataType::VARCHAR: case DataType::LONGVARCHAR: - nErg = buildNode_STR_NUM(pAppend,pLiteral,pCompare); + pReturn = buildNode_STR_NUM(pReturn); break; case DataType::INTEGER: default: @@ -706,8 +685,33 @@ break; } } - if (!nErg) - --nErg; + return pReturn; +} +// ----------------------------------------------------------------------------- +sal_Int16 OSQLParser::buildPredicateRule(OSQLParseNode*& pAppend,OSQLParseNode* pLiteral,OSQLParseNode*& pCompare,OSQLParseNode* pLiteral2) +{ + OSL_ENSURE(inPredicateCheck(),"Only in predicate check allowed!"); + sal_Int16 nErg = 0; + if ( m_xField.is() ) + { + sal_Int32 nType = 0; + try + { + m_xField->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_TYPE)) >>= nType; + } + catch( Exception& ) + { + return nErg; + } + + OSQLParseNode* pNode1 = convertNode(nType,pLiteral); + if ( pNode1 ) + { + OSQLParseNode* pNode2 = convertNode(nType,pLiteral2); + if ( !m_sErrorMessage.getLength() ) + nErg = buildNode(pAppend,pCompare,pNode1,pNode2); + } + } if (!pCompare->getParent()) // I have no parent so I was not used and I must die :-) delete pCompare; @@ -787,40 +791,82 @@ } return nErg; } -// ----------------------------------------------------------------------------- -sal_Int16 OSQLParser::buildNode_STR_NUM(OSQLParseNode*& pAppend,OSQLParseNode*& pLiteral,OSQLParseNode*& pCompare) +//----------------------------------------------------------------------------- +OSQLParseNode* OSQLParser::buildNode_Date(const double& fValue, sal_Int32 nType) { - static ::rtl::OUString aEmptyString; - OSQLParseNode* pColumnRef = new OSQLInternalNode(aEmptyString, SQL_NODE_RULE,OSQLParser::RuleID(OSQLParseNode::column_ref)); - pColumnRef->append(new OSQLInternalNode(m_sFieldName,SQL_NODE_NAME)); - OSQLParseNode* pComp = new OSQLInternalNode(aEmptyString, SQL_NODE_RULE,OSQLParser::RuleID(OSQLParseNode::comparison_predicate)); - pComp->append(pColumnRef); - pComp->append(pCompare); + ::rtl::OUString aEmptyString; + OSQLParseNode* pNewNode = new OSQLInternalNode(aEmptyString, SQL_NODE_RULE,OSQLParser::RuleID(OSQLParseNode::set_fct_spec)); + pNewNode->append(new OSQLInternalNode(::rtl::OUString::createFromAscii("{"), SQL_NODE_PUNCTUATION)); + OSQLParseNode* pDateNode = new OSQLInternalNode(aEmptyString, SQL_NODE_RULE,OSQLParser::RuleID(OSQLParseNode::odbc_fct_spec)); + pNewNode->append(pDateNode); + pNewNode->append(new OSQLInternalNode(::rtl::OUString::createFromAscii("}"), SQL_NODE_PUNCTUATION)); + + switch (nType) + { + case DataType::DATE: + { + Date aDate = DBTypeConversion::toDate(fValue,DBTypeConversion::getNULLDate(m_xFormatter->getNumberFormatsSupplier())); + ::rtl::OUString aString = DBTypeConversion::toDateString(aDate); + pDateNode->append(new OSQLInternalNode(aEmptyString, SQL_NODE_KEYWORD, SQL_TOKEN_D)); + pDateNode->append(new OSQLInternalNode(aString, SQL_NODE_STRING)); + break; + } + case DataType::TIME: + { + Time aTime = DBTypeConversion::toTime(fValue); + ::rtl::OUString aString = DBTypeConversion::toTimeString(aTime); + pDateNode->append(new OSQLInternalNode(aEmptyString, SQL_NODE_KEYWORD, SQL_TOKEN_T)); + pDateNode->append(new OSQLInternalNode(aString, SQL_NODE_STRING)); + break; + } + case DataType::TIMESTAMP: + { + DateTime aDateTime = DBTypeConversion::toDateTime(fValue,DBTypeConversion::getNULLDate(m_xFormatter->getNumberFormatsSupplier())); + if (aDateTime.Seconds || aDateTime.Minutes || aDateTime.Hours) + { + ::rtl::OUString aString = DBTypeConversion::toDateTimeString(aDateTime); + pDateNode->append(new OSQLInternalNode(aEmptyString, SQL_NODE_KEYWORD, SQL_TOKEN_TS)); + pDateNode->append(new OSQLInternalNode(aString, SQL_NODE_STRING)); + } + else + { + Date aDate(aDateTime.Day,aDateTime.Month,aDateTime.Year); + pDateNode->append(new OSQLInternalNode(aEmptyString, SQL_NODE_KEYWORD, SQL_TOKEN_D)); + pDateNode->append(new OSQLInternalNode(DBTypeConversion::toDateString(aDate), SQL_NODE_STRING)); + } + break; + } + } + return pNewNode; +} +// ----------------------------------------------------------------------------- +OSQLParseNode* OSQLParser::buildNode_STR_NUM(OSQLParseNode*& _pLiteral) +{ + OSQLParseNode* pReturn = NULL; + if ( _pLiteral ) + { if (m_nFormatKey) { sal_Int16 nScale = 0; ::rtl::OUString aDec; try { - Any aValue = getNumberFormatProperty( m_xFormatter, m_nFormatKey, ::rtl::OUString::createFromAscii("Decimals") ); + Any aValue = getNumberFormatProperty( m_xFormatter, m_nFormatKey, ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Decimals")) ); aValue >>= nScale; } catch( Exception& ) { } - pComp->append(new OSQLInternalNode(stringToDouble(pLiteral->getTokenValue(),nScale),SQL_NODE_STRING)); + pReturn = new OSQLInternalNode(stringToDouble(_pLiteral->getTokenValue(),nScale),SQL_NODE_STRING); } else - pComp->append(new OSQLInternalNode(pLiteral->getTokenValue(),SQL_NODE_STRING)); - - pAppend->append(pComp); - - delete pLiteral; - pLiteral = NULL; - - return 1; + pReturn = new OSQLInternalNode(_pLiteral->getTokenValue(),SQL_NODE_STRING); + delete _pLiteral; + _pLiteral = NULL; + } + return pReturn; } // ----------------------------------------------------------------------------- ::rtl::OUString OSQLParser::stringToDouble(const ::rtl::OUString& _rValue,sal_Int16 _nScale) @@ -1089,14 +1135,9 @@ } } - // ----------------------------------------------------------------------------- -sal_Int16 OSQLParser::buildDate(sal_Int32 _nType,OSQLParseNode*& pAppend,OSQLParseNode* pLiteral,OSQLParseNode*& pCompare) +bool OSQLParser::extractDate(OSQLParseNode* pLiteral,double& _rfValue) { - sal_Int16 nErg = -1; - double fValue = 0.0; - ::rtl::OUString sValue = pLiteral->getTokenValue(); - Reference< XNumberFormatsSupplier > xFormatSup = m_xFormatter->getNumberFormatsSupplier(); Reference< XNumberFormatTypes > xFormatTypes; if ( xFormatSup.is() ) @@ -1109,10 +1150,9 @@ m_nFormatKey = ::dbtools::getDefaultNumberFormat( m_xField, xFormatTypes, *m_pLocale ); } catch( Exception& ) { } - - // try converting the string into a date, according to our format key + ::rtl::OUString sValue = pLiteral->getTokenValue(); sal_Int32 nTryFormat = m_nFormatKey; - bool bSuccess = lcl_saveConvertToNumber( m_xFormatter, nTryFormat, sValue, fValue ); + bool bSuccess = lcl_saveConvertToNumber( m_xFormatter, nTryFormat, sValue, _rfValue ); // If our format key didn't do, try the default date format for our locale. if ( !bSuccess && xFormatTypes.is() ) @@ -1122,7 +1162,7 @@ nTryFormat = xFormatTypes->getStandardFormat( NumberFormat::DATE, *m_pLocale ); } catch( Exception& ) { } - bSuccess = lcl_saveConvertToNumber( m_xFormatter, nTryFormat, sValue, fValue ); + bSuccess = lcl_saveConvertToNumber( m_xFormatter, nTryFormat, sValue, _rfValue ); } // if this also didn't do, try ISO format @@ -1133,21 +1173,33 @@ nTryFormat = xFormatTypes->getFormatIndex( NumberFormatIndex::DATE_DIN_YYYYMMDD, *m_pLocale ); } catch( Exception& ) { } - bSuccess = lcl_saveConvertToNumber( m_xFormatter, nTryFormat, sValue, fValue ); + bSuccess = lcl_saveConvertToNumber( m_xFormatter, nTryFormat, sValue, _rfValue ); } // if this also didn't do, try fallback date format (en-US) if ( !bSuccess ) { nTryFormat = m_nDateFormatKey; - bSuccess = lcl_saveConvertToNumber( m_xFormatter, nTryFormat, sValue, fValue ); + bSuccess = lcl_saveConvertToNumber( m_xFormatter, nTryFormat, sValue, _rfValue ); } + return bSuccess; +} +// ----------------------------------------------------------------------------- +OSQLParseNode* OSQLParser::buildDate(sal_Int32 _nType,OSQLParseNode*& pLiteral) +{ + // try converting the string into a date, according to our format key + double fValue = 0.0; + OSQLParseNode* pFCTNode = NULL; - if ( bSuccess ) - nErg = buildNode_Date( fValue, _nType, pAppend, pLiteral, pCompare ); - else + if ( extractDate(pLiteral,fValue) ) + pFCTNode = buildNode_Date( fValue, _nType); + + delete pLiteral; + pLiteral = NULL; + + if ( !pFCTNode ) m_sErrorMessage = m_pContext->getErrorMessage(IParseContext::ERROR_INVALID_DATE_COMPARE); - return nErg; + return pFCTNode; } // ----------------------------------------------------------------------------- --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
