diff options
Diffstat (limited to 'connectivity/source/drivers/kab/KStatement.cxx')
-rw-r--r-- | connectivity/source/drivers/kab/KStatement.cxx | 587 |
1 files changed, 0 insertions, 587 deletions
diff --git a/connectivity/source/drivers/kab/KStatement.cxx b/connectivity/source/drivers/kab/KStatement.cxx deleted file mode 100644 index 655e8ae656..0000000000 --- a/connectivity/source/drivers/kab/KStatement.cxx +++ /dev/null @@ -1,587 +0,0 @@ -/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ -/************************************************************************* - * - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * Copyright 2000, 2010 Oracle and/or its affiliates. - * - * OpenOffice.org - a multi-platform office productivity suite - * - * This file is part of OpenOffice.org. - * - * OpenOffice.org is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License version 3 - * only, as published by the Free Software Foundation. - * - * OpenOffice.org is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License version 3 for more details - * (a copy is included in the LICENSE file that accompanied this code). - * - * You should have received a copy of the GNU Lesser General Public License - * version 3 along with OpenOffice.org. If not, see - * <http://www.openoffice.org/license.html> - * for a copy of the LGPLv3 License. - * - ************************************************************************/ - -// MARKER(update_precomp.py): autogen include statement, do not remove -#include "precompiled_connectivity.hxx" - -#include "KStatement.hxx" -#include "KConnection.hxx" -#include "KDriver.hxx" -#include "KResultSet.hxx" -#include "KResultSetMetaData.hxx" -#include "kcondition.hxx" -#include "korder.hxx" -#include "TConnection.hxx" -#include <connectivity/dbexception.hxx> -#include "resource/kab_res.hrc" -#include "resource/sharedresources.hxx" - - -#if OSL_DEBUG_LEVEL > 0 -# define OUtoCStr( x ) ( ::rtl::OUStringToOString ( (x), RTL_TEXTENCODING_ASCII_US).getStr()) -#else /* OSL_DEBUG_LEVEL */ -# define OUtoCStr( x ) ("dummy") -#endif /* OSL_DEBUG_LEVEL */ - -using namespace connectivity::kab; -using namespace com::sun::star::uno; -using namespace com::sun::star::lang; -using namespace com::sun::star::beans; -using namespace com::sun::star::sdbc; -using namespace com::sun::star::sdbcx; -using namespace com::sun::star::container; -using namespace com::sun::star::io; -using namespace com::sun::star::util; - -namespace -{ - void lcl_throwError(sal_uInt16 _nErrorId) - { - ::connectivity::SharedResources aResources; - const ::rtl::OUString sError( aResources.getResourceString(_nErrorId) ); - ::dbtools::throwGenericSQLException(sError,NULL); - } -} - -IMPLEMENT_SERVICE_INFO(KabStatement, "com.sun.star.sdbc.drivers.KabStatement", "com.sun.star.sdbc.Statement"); -//------------------------------------------------------------------------------ -KabCommonStatement::KabCommonStatement(KabConnection* _pConnection ) - : KabCommonStatement_BASE(m_aMutex), - OPropertySetHelper(KabCommonStatement_BASE::rBHelper), - m_aParser(_pConnection->getDriver()->getMSFactory()), - m_aSQLIterator(_pConnection, _pConnection->createCatalog()->getTables(), m_aParser, NULL ), - m_pParseTree(NULL), - m_pConnection(_pConnection), - rBHelper(KabCommonStatement_BASE::rBHelper) -{ - m_pConnection->acquire(); -} -// ----------------------------------------------------------------------------- -KabCommonStatement::~KabCommonStatement() -{ -} -// ----------------------------------------------------------------------------- -void KabCommonStatement::disposing() -{ - KabCommonStatement_BASE::disposing(); -} -// ----------------------------------------------------------------------------- -void KabCommonStatement::resetParameters() const throw(::com::sun::star::sdbc::SQLException) -{ - lcl_throwError(STR_PARA_ONLY_PREPARED); -} -// ----------------------------------------------------------------------------- -void KabCommonStatement::getNextParameter(::rtl::OUString &) const throw(::com::sun::star::sdbc::SQLException) -{ - lcl_throwError(STR_PARA_ONLY_PREPARED); -} -// ----------------------------------------------------------------------------- -KabCondition *KabCommonStatement::analyseWhereClause(const OSQLParseNode *pParseNode) const throw(SQLException) -{ - if (pParseNode->count() == 3) - { - const OSQLParseNode *pLeft = pParseNode->getChild(0), - *pMiddle = pParseNode->getChild(1), - *pRight = pParseNode->getChild(2); - - // WHERE ( ... ) ? - if (SQL_ISPUNCTUATION(pLeft, "(") && SQL_ISPUNCTUATION(pRight, ")")) - { - return analyseWhereClause(pMiddle); - } - else if (SQL_ISRULE(pParseNode, comparison_predicate)) - { - if (pLeft->isToken() && pRight->isToken()) - { - switch (pMiddle->getNodeType()) - { - case SQL_NODE_EQUAL: - // WHERE 0 = 1 - return new KabConditionConstant(pLeft->getTokenValue() == pRight->getTokenValue()); - - case SQL_NODE_NOTEQUAL: - // WHERE 0 <> 1 - // (might not be correct SQL... don't care, handling anyway) - return new KabConditionConstant(pLeft->getTokenValue() != pRight->getTokenValue()); - - default: - break; - } - } - else if (SQL_ISRULE(pLeft, column_ref)) - { - ::rtl::OUString sColumnName, - sTableRange; - - m_aSQLIterator.getColumnRange(pLeft, sColumnName, sTableRange); - - if (pRight->isToken() || SQL_ISRULE(pRight, parameter)) - { - ::rtl::OUString sMatchString; - - if (pRight->isToken()) // WHERE Name = 'Doe' - sMatchString = pRight->getTokenValue(); - else if (SQL_ISRULE(pRight, parameter)) // WHERE Name = ? - getNextParameter(sMatchString); - - switch (pMiddle->getNodeType()) - { - case SQL_NODE_EQUAL: - // WHERE Name = 'Smith' - return new KabConditionEqual(sColumnName, sMatchString); - - case SQL_NODE_NOTEQUAL: - // WHERE Name <> 'Jones' - return new KabConditionDifferent(sColumnName, sMatchString); - - default: - break; - } - } - } - } - else if (SQL_ISRULE(pParseNode, search_condition)) - { - if (SQL_ISTOKEN(pMiddle, OR)) - { - // WHERE Name = 'Smith' OR Name = 'Jones' - return new KabConditionOr( - analyseWhereClause(pLeft), - analyseWhereClause(pRight)); - } - } - else if (SQL_ISRULE(pParseNode, boolean_term)) - { - if (SQL_ISTOKEN(pMiddle, AND)) - { - // WHERE Name = 'Smith' AND "Given Name" = 'Peter' - return new KabConditionAnd( - analyseWhereClause(pLeft), - analyseWhereClause(pRight)); - } - } - } - else if (SQL_ISRULE(pParseNode, test_for_null) || SQL_ISRULE(pParseNode, like_predicate)) - { - const OSQLParseNode *pLeft = pParseNode->getChild(0); - const OSQLParseNode* pPart2 = pParseNode->getChild(1); - const OSQLParseNode *pMiddleLeft = pPart2->getChild(0), - *pMiddleRight = pPart2->getChild(1), - *pRight = pPart2->getChild(2); - - if (SQL_ISRULE(pParseNode, test_for_null)) - { - if (SQL_ISRULE(pLeft, column_ref) && - SQL_ISTOKEN(pMiddleLeft, IS) && - SQL_ISTOKEN(pRight, NULL)) - { - ::rtl::OUString sColumnName, - sTableRange; - - m_aSQLIterator.getColumnRange(pLeft, sColumnName, sTableRange); - - if (SQL_ISTOKEN(pMiddleRight, NOT)) - { - // WHERE "Mobile Phone" IS NOT NULL - return new KabConditionNotNull(sColumnName); - } - else - { - // WHERE "Mobile Phone" IS NULL - return new KabConditionNull(sColumnName); - } - } - } - else if (SQL_ISRULE(pParseNode, like_predicate)) - { - if (SQL_ISRULE(pLeft, column_ref)) - { - ::rtl::OUString sColumnName, - sTableRange; - - m_aSQLIterator.getColumnRange(pLeft, sColumnName, sTableRange); - - if (pMiddleRight->isToken() || SQL_ISRULE(pMiddleRight, parameter)) - { - ::rtl::OUString sMatchString; - - if (pMiddleRight->isToken()) // WHERE Name LIKE 'Sm%' - sMatchString = pMiddleRight->getTokenValue(); - else if (SQL_ISRULE(pMiddleRight, parameter)) // WHERE Name LIKE ? - getNextParameter(sMatchString); - - return new KabConditionSimilar(sColumnName, sMatchString); - } - } - } - } - - lcl_throwError(STR_QUERY_TOO_COMPLEX); - - // Unreachable: - OSL_ASSERT(false); - return 0; -} -// ----------------------------------------------------------------------------- -KabOrder *KabCommonStatement::analyseOrderByClause(const OSQLParseNode *pParseNode) const throw(SQLException) -{ - if (SQL_ISRULE(pParseNode, ordering_spec_commalist)) - { - KabComplexOrder *list = new KabComplexOrder(); - sal_uInt32 n = pParseNode->count(); - - // Iterate through the ordering columns - for (sal_uInt32 i = 0; i < n; i++) - { - list->addOrder - (analyseOrderByClause(pParseNode->getChild(i))); - } - - return list; - } - else if (SQL_ISRULE(pParseNode, ordering_spec)) - { - if (pParseNode->count() == 2) - { - OSQLParseNode* pColumnRef = pParseNode->getChild(0); - OSQLParseNode* pAscendingDescending = pParseNode->getChild(1); - - if (SQL_ISRULE(pColumnRef, column_ref)) - { - if (pColumnRef->count() == 3) - pColumnRef = pColumnRef->getChild(2); - - if (pColumnRef->count() == 1) - { - ::rtl::OUString sColumnName = - pColumnRef->getChild(0)->getTokenValue(); - sal_Bool bAscending = - SQL_ISTOKEN(pAscendingDescending, DESC)? - sal_False: - sal_True; - - return new KabSimpleOrder(sColumnName, bAscending); - } - } - } - } - lcl_throwError(STR_QUERY_TOO_COMPLEX); - // Unreachable: - OSL_ASSERT(false); - return 0; -} -//------------------------------------------------------------------------------ -sal_Bool KabCommonStatement::isTableKnown(KabResultSet *pResult) const -{ - // can handle requests like SELECT * FROM addresses addresses - // but cannot handle requests like SELECT * FROM addresses persons - if (m_aSQLIterator.getTables().size() != 1) - return sal_False; - - if (m_aSQLIterator.getTables().begin()->first != pResult->getMetaData()->getTableName(0)) - return sal_False; - - return sal_True; -} -//------------------------------------------------------------------------------ -void KabCommonStatement::setKabFields(KabResultSet *pResult) const throw(SQLException) -{ - ::rtl::Reference<connectivity::OSQLColumns> xColumns; // selected columns - KabResultSetMetaData *pMeta; // meta information - holds the list of KAddressBook fields - - xColumns = m_aSQLIterator.getSelectColumns(); - if (!xColumns.is()) - { - lcl_throwError(STR_INVALID_COLUMN_SELECTION); - } - pMeta = static_cast<KabResultSetMetaData *>(pResult->getMetaData().get()); - pMeta->setKabFields(xColumns); -} -// ------------------------------------------------------------------------- -void KabCommonStatement::selectAddressees(KabResultSet *pResult) const throw(SQLException) -{ - const OSQLParseNode *pParseNode; - KabCondition *pCondition; - - pParseNode = m_aSQLIterator.getWhereTree(); - if (pParseNode != NULL) - { - if (SQL_ISRULE(pParseNode, where_clause)) - { - resetParameters(); - pParseNode = pParseNode->getChild(1); - pCondition = analyseWhereClause(pParseNode); - if (pCondition->isAlwaysTrue()) - pResult->allKabAddressees(); - else if (!pCondition->isAlwaysFalse()) - pResult->someKabAddressees(pCondition); - delete pCondition; - return; - } - } - - // no WHERE clause: get all rows - pResult->allKabAddressees(); -} -// ------------------------------------------------------------------------- -void KabCommonStatement::sortAddressees(KabResultSet *pResult) const throw(SQLException) -{ - const OSQLParseNode *pParseNode; - KabOrder *pOrder; - - pParseNode = m_aSQLIterator.getOrderTree(); - if (pParseNode != NULL) - { - if (SQL_ISRULE(pParseNode, opt_order_by_clause)) - { - pParseNode = pParseNode->getChild(2); - pOrder = analyseOrderByClause(pParseNode); - pResult->sortKabAddressees(pOrder); - delete pOrder; - } - } -} -//----------------------------------------------------------------------------- -Any SAL_CALL KabCommonStatement::queryInterface( const Type & rType ) throw(RuntimeException) -{ - Any aRet = KabCommonStatement_BASE::queryInterface(rType); - if (!aRet.hasValue()) - aRet = OPropertySetHelper::queryInterface(rType); - return aRet; -} -// ------------------------------------------------------------------------- -Sequence< Type > SAL_CALL KabCommonStatement::getTypes( ) throw(RuntimeException) -{ - ::cppu::OTypeCollection aTypes( ::getCppuType( (const Reference< XMultiPropertySet > *)0 ), - ::getCppuType( (const Reference< XFastPropertySet > *)0 ), - ::getCppuType( (const Reference< XPropertySet > *)0 )); - - return comphelper::concatSequences(aTypes.getTypes(),KabCommonStatement_BASE::getTypes()); -} -// ------------------------------------------------------------------------- -void SAL_CALL KabCommonStatement::cancel( ) throw(RuntimeException) -{ - ::osl::MutexGuard aGuard( m_aMutex ); - - checkDisposed(KabCommonStatement_BASE::rBHelper.bDisposed); - // cancel the current sql statement -} -// ------------------------------------------------------------------------- -void SAL_CALL KabCommonStatement::close( ) throw(SQLException, RuntimeException) -{ - { - ::osl::MutexGuard aGuard( m_aMutex ); - checkDisposed(KabCommonStatement_BASE::rBHelper.bDisposed); - - } - dispose(); -} -// ------------------------------------------------------------------------- -sal_Bool SAL_CALL KabCommonStatement::execute( - const ::rtl::OUString& sql ) throw(SQLException, RuntimeException) -{ - ::osl::MutexGuard aGuard( m_aMutex ); - checkDisposed(KabCommonStatement_BASE::rBHelper.bDisposed); - - Reference< XResultSet > xRS = executeQuery(sql); - - return xRS.is(); -} -// ------------------------------------------------------------------------- -Reference< XResultSet > SAL_CALL KabCommonStatement::executeQuery( - const ::rtl::OUString& sql ) throw(SQLException, RuntimeException) -{ - ::osl::MutexGuard aGuard( m_aMutex ); - checkDisposed(KabCommonStatement_BASE::rBHelper.bDisposed); - -OSL_TRACE("KDE Address book - SQL Request: %s", OUtoCStr(sql)); - - KabResultSet* pResult = new KabResultSet(this); - Reference< XResultSet > xRS = pResult; - ::rtl::OUString aErr; - - m_pParseTree = m_aParser.parseTree(aErr, sql); - if (m_pParseTree == NULL) - throw SQLException(aErr, *this, aErr, 0, Any()); - - m_aSQLIterator.setParseTree(m_pParseTree); - m_aSQLIterator.traverseAll(); - switch (m_aSQLIterator.getStatementType()) - { - case SQL_STATEMENT_SELECT: - if (isTableKnown(pResult)) // FROM which table ? - { - setKabFields(pResult); // SELECT which columns ? - selectAddressees(pResult); // WHERE which condition ? - sortAddressees(pResult); // ORDER BY which columns ? -// To be continued: DISTINCT -// etc... - } - break; - - default: -// To be continued: UPDATE -// DELETE -// etc... - lcl_throwError(STR_QUERY_TOO_COMPLEX); - } - - return xRS; -} -// ------------------------------------------------------------------------- -Reference< XConnection > SAL_CALL KabCommonStatement::getConnection( ) throw(SQLException, RuntimeException) -{ - ::osl::MutexGuard aGuard( m_aMutex ); - checkDisposed(KabCommonStatement_BASE::rBHelper.bDisposed); - - // just return our connection here - return (Reference< XConnection >) m_pConnection; -} -// ------------------------------------------------------------------------- -sal_Int32 SAL_CALL KabCommonStatement::executeUpdate( const ::rtl::OUString& ) throw(SQLException, RuntimeException) -{ - ::osl::MutexGuard aGuard( m_aMutex ); - checkDisposed(KabCommonStatement_BASE::rBHelper.bDisposed); - - // the return values gives information about how many rows are affected by executing the sql statement - return 0; -} -// ------------------------------------------------------------------------- -Any SAL_CALL KabCommonStatement::getWarnings( ) throw(SQLException, RuntimeException) -{ - ::osl::MutexGuard aGuard( m_aMutex ); - checkDisposed(KabCommonStatement_BASE::rBHelper.bDisposed); - - return makeAny(m_aLastWarning); -} -// ------------------------------------------------------------------------- -void SAL_CALL KabCommonStatement::clearWarnings( ) throw(SQLException, RuntimeException) -{ - ::osl::MutexGuard aGuard( m_aMutex ); - checkDisposed(KabCommonStatement_BASE::rBHelper.bDisposed); - - m_aLastWarning = SQLWarning(); -} -// ------------------------------------------------------------------------- -::cppu::IPropertyArrayHelper* KabCommonStatement::createArrayHelper( ) const -{ - // this properties are defined by the service statement - // they must be in alphabetic order - Sequence< Property > aProps(10); - Property* pProperties = aProps.getArray(); - sal_Int32 nPos = 0; - DECL_PROP0(CURSORNAME, ::rtl::OUString); - DECL_BOOL_PROP0(ESCAPEPROCESSING); - DECL_PROP0(FETCHDIRECTION,sal_Int32); - DECL_PROP0(FETCHSIZE, sal_Int32); - DECL_PROP0(MAXFIELDSIZE,sal_Int32); - DECL_PROP0(MAXROWS, sal_Int32); - DECL_PROP0(QUERYTIMEOUT,sal_Int32); - DECL_PROP0(RESULTSETCONCURRENCY,sal_Int32); - DECL_PROP0(RESULTSETTYPE,sal_Int32); - DECL_BOOL_PROP0(USEBOOKMARKS); - - return new ::cppu::OPropertyArrayHelper(aProps); -} -// ------------------------------------------------------------------------- -::cppu::IPropertyArrayHelper & KabCommonStatement::getInfoHelper() -{ - return *const_cast<KabCommonStatement*>(this)->getArrayHelper(); -} -// ------------------------------------------------------------------------- -sal_Bool KabCommonStatement::convertFastPropertyValue( - Any &, - Any &, - sal_Int32, - const Any&) throw (::com::sun::star::lang::IllegalArgumentException) -{ - sal_Bool bConverted = sal_False; - // here we have to try to convert - return bConverted; -} -// ------------------------------------------------------------------------- -void KabCommonStatement::setFastPropertyValue_NoBroadcast(sal_Int32 nHandle,const Any&) throw (Exception) -{ - // set the value to whatever is nescessary - switch (nHandle) - { - case PROPERTY_ID_QUERYTIMEOUT: - case PROPERTY_ID_MAXFIELDSIZE: - case PROPERTY_ID_MAXROWS: - case PROPERTY_ID_CURSORNAME: - case PROPERTY_ID_RESULTSETCONCURRENCY: - case PROPERTY_ID_RESULTSETTYPE: - case PROPERTY_ID_FETCHDIRECTION: - case PROPERTY_ID_FETCHSIZE: - case PROPERTY_ID_ESCAPEPROCESSING: - case PROPERTY_ID_USEBOOKMARKS: - default: - ; - } -} -// ------------------------------------------------------------------------- -void KabCommonStatement::getFastPropertyValue(Any&,sal_Int32 nHandle) const -{ - switch (nHandle) - { - case PROPERTY_ID_QUERYTIMEOUT: - case PROPERTY_ID_MAXFIELDSIZE: - case PROPERTY_ID_MAXROWS: - case PROPERTY_ID_CURSORNAME: - case PROPERTY_ID_RESULTSETCONCURRENCY: - case PROPERTY_ID_RESULTSETTYPE: - case PROPERTY_ID_FETCHDIRECTION: - case PROPERTY_ID_FETCHSIZE: - case PROPERTY_ID_ESCAPEPROCESSING: - case PROPERTY_ID_USEBOOKMARKS: - default: - ; - } -} -// ----------------------------------------------------------------------------- -void SAL_CALL KabCommonStatement::acquire() throw() -{ - KabCommonStatement_BASE::acquire(); -} -// ----------------------------------------------------------------------------- -void SAL_CALL KabCommonStatement::release() throw() -{ - KabCommonStatement_BASE::release(); -} -// ----------------------------------------------------------------------------- -Reference< ::com::sun::star::beans::XPropertySetInfo > SAL_CALL KabCommonStatement::getPropertySetInfo( ) throw(RuntimeException) -{ - return ::cppu::OPropertySetHelper::createPropertySetInfo(getInfoHelper()); -} -// ----------------------------------------------------------------------------- -KabStatement::KabStatement(KabConnection* _pConnection) - : KabStatement_BASE(_pConnection) -{ -} - -/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |