dba34c: #i108415# handle structed filter handling

This commit is contained in:
Ocke Janssen [oj]
2011-01-10 13:41:20 +01:00
parent 0ca1b7ace4
commit 1821b0fd52
3 changed files with 105 additions and 33 deletions

View File

@@ -104,6 +104,12 @@ namespace dbtools
::rtl::OUString* _pErrorMessage = NULL ::rtl::OUString* _pErrorMessage = NULL
) const; ) const;
::rtl::OUString getPredicateValue(
const ::rtl::OUString& _sField
, const ::rtl::OUString& _rPredicateValue
, sal_Bool _bForStatementUse
, ::rtl::OUString* _pErrorMessage = NULL) const;
private: private:
::connectivity::OSQLParseNode* implPredicateTree( ::connectivity::OSQLParseNode* implPredicateTree(
::rtl::OUString& _rErrorMessage, ::rtl::OUString& _rErrorMessage,
@@ -116,6 +122,8 @@ namespace dbtools
sal_Unicode& _rDecSep, sal_Unicode& _rDecSep,
sal_Unicode& _rThdSep sal_Unicode& _rThdSep
) const; ) const;
::rtl::OUString implParseNode(::connectivity::OSQLParseNode* pParseNode,sal_Bool _bForStatementUse) const;
}; };
//......................................................................... //.........................................................................

View File

@@ -224,6 +224,7 @@ public class CRMDatabase
// -------------------------------------------------------------------------------------------------------- // --------------------------------------------------------------------------------------------------------
private void validateUnparseable() private void validateUnparseable()
{ {
/*
// The "unparseable" query should be indeed be unparseable by OOo (though a valid HSQL query) // The "unparseable" query should be indeed be unparseable by OOo (though a valid HSQL query)
XSingleSelectQueryComposer composer; XSingleSelectQueryComposer composer;
QueryDefinition unparseableQuery; QueryDefinition unparseableQuery;
@@ -253,6 +254,7 @@ public class CRMDatabase
if ( !caughtExpected ) if ( !caughtExpected )
throw new RuntimeException( "Somebody improved the parser! This is bad :), since we need an unparsable query here!" ); throw new RuntimeException( "Somebody improved the parser! This is bad :), since we need an unparsable query here!" );
*/
} }
// -------------------------------------------------------------------------------------------------------- // --------------------------------------------------------------------------------------------------------
@@ -284,9 +286,10 @@ public class CRMDatabase
m_database.getDataSource().createQuery( "parseable", "SELECT * FROM \"customers\"" ); m_database.getDataSource().createQuery( "parseable", "SELECT * FROM \"customers\"" );
m_database.getDataSource().createQuery( "parseable native", "SELECT * FROM INFORMATION_SCHEMA.SYSTEM_VIEWS", false ); m_database.getDataSource().createQuery( "parseable native", "SELECT * FROM INFORMATION_SCHEMA.SYSTEM_VIEWS", false );
/*
m_database.getDataSource().createQuery( "unparseable", m_database.getDataSource().createQuery( "unparseable",
"SELECT {fn DAYOFMONTH ('2001-01-01')} AS \"ID_VARCHAR\" FROM \"products\"", false ); "SELECT {fn DAYOFMONTH ('2001-01-01')} AS \"ID_VARCHAR\" FROM \"products\"", false );
*/
validateUnparseable(); validateUnparseable();
} }
} }

View File

@@ -31,8 +31,10 @@
#include <comphelper/types.hxx> #include <comphelper/types.hxx>
#include <connectivity/dbtools.hxx> #include <connectivity/dbtools.hxx>
#include <com/sun/star/sdbc/DataType.hpp> #include <com/sun/star/sdbc/DataType.hpp>
#include <com/sun/star/sdbc/ColumnValue.hpp>
#include <osl/diagnose.h> #include <osl/diagnose.h>
#include <connectivity/sqlnode.hxx> #include <connectivity/sqlnode.hxx>
#include <connectivity/PColumn.hxx>
#include <comphelper/numbers.hxx> #include <comphelper/numbers.hxx>
//......................................................................... //.........................................................................
@@ -325,54 +327,113 @@ namespace dbtools
::rtl::OUString sError; ::rtl::OUString sError;
OSQLParseNode* pParseNode = implPredicateTree( sError, sValue, _rxField ); OSQLParseNode* pParseNode = implPredicateTree( sError, sValue, _rxField );
if ( _pErrorMessage ) *_pErrorMessage = sError; if ( _pErrorMessage )
*_pErrorMessage = sError;
if ( pParseNode ) sReturn = implParseNode(pParseNode,_bForStatementUse);
}
return sReturn;
}
::rtl::OUString OPredicateInputController::getPredicateValue(
const ::rtl::OUString& _sField, const ::rtl::OUString& _rPredicateValue, sal_Bool _bForStatementUse, ::rtl::OUString* _pErrorMessage ) const
{
::rtl::OUString sReturn = _rPredicateValue;
::rtl::OUString sError;
::rtl::OUString sField = _sField;
sal_Int32 nIndex = 0;
sField = sField.getToken(0,'(',nIndex);
if(nIndex == -1)
sField = _sField;
sal_Int32 nType = ::connectivity::OSQLParser::getFunctionReturnType(sField,&m_aParser.getContext());
if ( nType == DataType::OTHER || !sField.getLength() )
{
// first try the international version
::rtl::OUString sSql;
sSql += ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("SELECT * "));
sSql += ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(" FROM x WHERE "));
sSql += sField;
sSql += _rPredicateValue;
::std::auto_ptr<OSQLParseNode> pParseNode( const_cast< OSQLParser& >( m_aParser ).parseTree( sError, sSql, sal_True ) );
nType = DataType::DOUBLE;
if ( pParseNode.get() )
{ {
OSQLParseNode* pOdbcSpec = pParseNode->getByRule( OSQLParseNode::odbc_fct_spec ); OSQLParseNode* pColumnRef = pParseNode->getByRule(OSQLParseNode::column_ref);
if ( pOdbcSpec ) if ( pColumnRef )
{ {
if ( _bForStatementUse ) }
{ }
OSQLParseNode* pFuncSpecParent = pOdbcSpec->getParent(); }
OSL_ENSURE( pFuncSpecParent, "OPredicateInputController::getPredicateValue: an ODBC func spec node without parent?" );
if ( pFuncSpecParent ) Reference<XDatabaseMetaData> xMeta = m_xConnection->getMetaData();
pFuncSpecParent->parseNodeToStr(sReturn, m_xConnection, &m_aParser.getContext(), sal_False, sal_True); parse::OParseColumn* pColumn = new parse::OParseColumn( sField,
} ::rtl::OUString(),
else ::rtl::OUString(),
{ ::rtl::OUString(),
pOdbcSpec->getChild(1)->parseNodeToStr(sReturn, m_xConnection, &m_aParser.getContext(), sal_False, sal_True); ColumnValue::NULLABLE_UNKNOWN,
// sReturn = pOdbcSpec->getChild(1)->getTokenValue(); 0,
} 0,
nType,
sal_False,
sal_False,
xMeta.is() && xMeta->supportsMixedCaseQuotedIdentifiers());
Reference<XPropertySet> xColumn = pColumn;
pColumn->setFunction(sal_True);
pColumn->setRealName(sField);
OSQLParseNode* pParseNode = implPredicateTree( sError, _rPredicateValue, xColumn );
if ( _pErrorMessage )
*_pErrorMessage = sError;
return pParseNode ? implParseNode(pParseNode,_bForStatementUse) : sReturn;
}
::rtl::OUString OPredicateInputController::implParseNode(OSQLParseNode* pParseNode,sal_Bool _bForStatementUse) const
{
::rtl::OUString sReturn;
if ( pParseNode )
{
::std::auto_ptr<OSQLParseNode> pTemp(pParseNode);
OSQLParseNode* pOdbcSpec = pParseNode->getByRule( OSQLParseNode::odbc_fct_spec );
if ( pOdbcSpec )
{
if ( _bForStatementUse )
{
OSQLParseNode* pFuncSpecParent = pOdbcSpec->getParent();
OSL_ENSURE( pFuncSpecParent, "OPredicateInputController::getPredicateValue: an ODBC func spec node without parent?" );
if ( pFuncSpecParent )
pFuncSpecParent->parseNodeToStr(sReturn, m_xConnection, &m_aParser.getContext(), sal_False, sal_True);
} }
else else
{ {
if ( pParseNode->count() >= 3 ) pOdbcSpec->getChild(1)->parseNodeToStr(sReturn, m_xConnection, &m_aParser.getContext(), sal_False, sal_True);
// sReturn = pOdbcSpec->getChild(1)->getTokenValue();
}
}
else
{
if ( pParseNode->count() >= 3 )
{
OSQLParseNode* pValueNode = pParseNode->getChild(2);
OSL_ENSURE( pValueNode, "OPredicateInputController::getPredicateValue: invalid node child!" );
if ( !_bForStatementUse )
{ {
OSQLParseNode* pValueNode = pParseNode->getChild(2); if ( SQL_NODE_STRING == pValueNode->getNodeType() )
OSL_ENSURE( pValueNode, "OPredicateInputController::getPredicateValue: invalid node child!" ); sReturn = pValueNode->getTokenValue();
if ( !_bForStatementUse )
{
if ( SQL_NODE_STRING == pValueNode->getNodeType() )
sReturn = pValueNode->getTokenValue();
else
pValueNode->parseNodeToStr(
sReturn, m_xConnection, &m_aParser.getContext(), sal_False, sal_True
);
}
else else
pValueNode->parseNodeToStr( pValueNode->parseNodeToStr(
sReturn, m_xConnection, &m_aParser.getContext(), sal_False, sal_True sReturn, m_xConnection, &m_aParser.getContext(), sal_False, sal_True
); );
} }
else else
OSL_ENSURE( sal_False, "OPredicateInputController::getPredicateValue: unknown/invalid structure (noodbc)!" ); pValueNode->parseNodeToStr(
sReturn, m_xConnection, &m_aParser.getContext(), sal_False, sal_True
);
} }
else
delete pParseNode; OSL_ENSURE( sal_False, "OPredicateInputController::getPredicateValue: unknown/invalid structure (noodbc)!" );
} }
} }
return sReturn; return sReturn;
} }
//......................................................................... //.........................................................................