diff options
Diffstat (limited to 'connectivity/source/drivers/file/FStatement.cxx')
-rw-r--r-- | connectivity/source/drivers/file/FStatement.cxx | 90 |
1 files changed, 43 insertions, 47 deletions
diff --git a/connectivity/source/drivers/file/FStatement.cxx b/connectivity/source/drivers/file/FStatement.cxx index 08c4f7fdd844..ee260fdb33e5 100644 --- a/connectivity/source/drivers/file/FStatement.cxx +++ b/connectivity/source/drivers/file/FStatement.cxx @@ -32,11 +32,13 @@ #include <com/sun/star/sdbc/FetchDirection.hpp> #include <com/sun/star/lang/DisposedException.hpp> #include <comphelper/sequence.hxx> +#include <comphelper/servicehelper.hxx> #include <cppuhelper/typeprovider.hxx> #include <comphelper/types.hxx> #include <connectivity/dbexception.hxx> #include <strings.hrc> #include <algorithm> +#include <cstddef> namespace connectivity::file { @@ -91,7 +93,7 @@ void OStatement_Base::disposeResultSet() { SAL_INFO( "connectivity.drivers", "file Ocke.Janssen@sun.com OStatement_Base::disposeResultSet" ); // free the cursor if alive - Reference< XComponent > xComp(m_xResultSet.get(), UNO_QUERY); + rtl::Reference< OResultSet > xComp(m_xResultSet.get()); assert(xComp.is() || !m_xResultSet.get().is()); if (xComp.is()) xComp->dispose(); @@ -128,12 +130,12 @@ void OStatement_BASE2::disposing() OStatement_Base::disposing(); } -void SAL_CALL OStatement_Base::acquire() throw() +void SAL_CALL OStatement_Base::acquire() noexcept { OStatement_BASE::acquire(); } -void SAL_CALL OStatement_BASE2::release() throw() +void SAL_CALL OStatement_BASE2::release() noexcept { OStatement_BASE::release(); } @@ -173,7 +175,7 @@ void OStatement_Base::closeResultSet() ::osl::MutexGuard aGuard( m_aMutex ); checkDisposed(OStatement_BASE::rBHelper.bDisposed); - Reference< XCloseable > xCloseable(m_xResultSet.get(), UNO_QUERY); + rtl::Reference< OResultSet > xCloseable(m_xResultSet.get()); assert(xCloseable.is() || !m_xResultSet.get().is()); if (xCloseable.is()) { @@ -192,7 +194,7 @@ Any SAL_CALL OStatement_Base::getWarnings( ) ::osl::MutexGuard aGuard( m_aMutex ); checkDisposed(OStatement_BASE::rBHelper.bDisposed); - return makeAny(m_aLastWarning); + return Any(m_aLastWarning); } void SAL_CALL OStatement_Base::clearWarnings( ) @@ -216,19 +218,19 @@ void SAL_CALL OStatement_Base::clearWarnings( ) return *getArrayHelper(); } -OResultSet* OStatement::createResultSet() +rtl::Reference<OResultSet> OStatement::createResultSet() { return new OResultSet(this,m_aSQLIterator); } -IMPLEMENT_SERVICE_INFO(OStatement,"com.sun.star.sdbc.driver.file.Statement","com.sun.star.sdbc.Statement"); +IMPLEMENT_SERVICE_INFO(OStatement,u"com.sun.star.sdbc.driver.file.Statement"_ustr,u"com.sun.star.sdbc.Statement"_ustr); -void SAL_CALL OStatement::acquire() throw() +void SAL_CALL OStatement::acquire() noexcept { OStatement_BASE2::acquire(); } -void SAL_CALL OStatement::release() throw() +void SAL_CALL OStatement::release() noexcept { OStatement_BASE2::release(); } @@ -250,20 +252,18 @@ Reference< XResultSet > SAL_CALL OStatement::executeQuery( const OUString& sql ) checkDisposed(OStatement_BASE::rBHelper.bDisposed); construct(sql); - Reference< XResultSet > xRS; - OResultSet* pResult = createResultSet(); - xRS = pResult; - initializeResultSet(pResult); - m_xResultSet = xRS; + rtl::Reference<OResultSet> pResult = createResultSet(); + initializeResultSet(pResult.get()); + m_xResultSet = pResult.get(); pResult->OpenImpl(); - return xRS; + return pResult; } Reference< XConnection > SAL_CALL OStatement::getConnection( ) { - return Reference< XConnection >(m_pConnection.get()); + return m_pConnection; } sal_Int32 SAL_CALL OStatement::executeUpdate( const OUString& sql ) @@ -302,9 +302,9 @@ Any SAL_CALL OStatement::queryInterface( const Type & rType ) return aRet.hasValue() ? aRet : OStatement_BASE2::queryInterface( rType); } -void OStatement_Base::anylizeSQL() +void OStatement_Base::analyzeSQL() { - OSL_ENSURE(m_pSQLAnalyzer,"OResultSet::anylizeSQL: Analyzer isn't set!"); + OSL_ENSURE(m_pSQLAnalyzer,"OResultSet::analyzeSQL: Analyzer isn't set!"); // start analysing the statement m_pSQLAnalyzer->setOrigColumns(m_xColNames); m_pSQLAnalyzer->start(m_pParseTree); @@ -394,16 +394,19 @@ void OStatement_Base::construct(const OUString& sql) case OSQLStatementType::Unknown: m_pConnection->throwGenericSQLException(STR_QUERY_TOO_COMPLEX,*this); break; + case OSQLStatementType::Select: + if(SQL_ISRULE(m_aSQLIterator.getParseTree(), union_statement)) + { + m_pConnection->throwGenericSQLException(STR_QUERY_TOO_COMPLEX, *this); + } + assert(SQL_ISRULE(m_aSQLIterator.getParseTree(), select_statement)); + break; default: break; } // at this moment we support only one table per select statement - Reference< css::lang::XUnoTunnel> xTunnel(rTabs.begin()->second,UNO_QUERY); - if(xTunnel.is()) - { - m_pTable = reinterpret_cast<OFileTable*>(xTunnel->getSomething(OFileTable::getUnoTunnelId())); - } + m_pTable = dynamic_cast<OFileTable*>(rTabs.begin()->second.get()); OSL_ENSURE(m_pTable.is(),"No table!"); if ( m_pTable.is() ) m_xColNames = m_pTable->getColumns(); @@ -428,7 +431,7 @@ void OStatement_Base::construct(const OUString& sql) m_pSQLAnalyzer.reset( new OSQLAnalyzer(m_pConnection.get()) ); - anylizeSQL(); + analyzeSQL(); } void OStatement_Base::createColumnMapping() @@ -436,7 +439,7 @@ void OStatement_Base::createColumnMapping() // initialize the column index map (mapping select columns to table columns) ::rtl::Reference<connectivity::OSQLColumns> xColumns = m_aSQLIterator.getSelectColumns(); m_aColMapping.resize(xColumns->size() + 1); - for (sal_Int32 i=0; i<static_cast<sal_Int32>(m_aColMapping.size()); ++i) + for (std::size_t i=0; i<m_aColMapping.size(); ++i) m_aColMapping[i] = i; Reference<XIndexAccess> xNames(m_xColNames,UNO_QUERY); @@ -449,10 +452,10 @@ void OStatement_Base::initializeResultSet(OResultSet* _pResult) GetAssignValues(); _pResult->setSqlAnalyzer(m_pSQLAnalyzer.get()); - _pResult->setOrderByColumns(m_aOrderbyColumnNumber); - _pResult->setOrderByAscending(m_aOrderbyAscending); + _pResult->setOrderByColumns(std::vector(m_aOrderbyColumnNumber)); + _pResult->setOrderByAscending(std::vector(m_aOrderbyAscending)); _pResult->setBindingRow(m_aRow); - _pResult->setColumnMapping(m_aColMapping); + _pResult->setColumnMapping(std::vector(m_aColMapping)); _pResult->setEvaluationRow(m_aEvaluateRow); _pResult->setAssignValues(m_aAssignValues); _pResult->setSelectRow(m_aSelectRow); @@ -494,11 +497,8 @@ void OStatement_Base::GetAssignValues() OSL_ENSURE(SQL_ISRULE(pOptColumnCommalist,opt_column_commalist),"OResultSet: Error in Parse Tree"); if (pOptColumnCommalist->count() == 0) { - const Sequence< OUString>& aNames = m_xColNames->getElementNames(); - const OUString* pBegin = aNames.getConstArray(); - const OUString* pEnd = pBegin + aNames.getLength(); - for (; pBegin != pEnd; ++pBegin) - aColumnNameList.push_back(*pBegin); + const Sequence< OUString> aNames = m_xColNames->getElementNames(); + aColumnNameList.insert(aColumnNameList.end(), aNames.begin(), aNames.end()); } else { @@ -574,7 +574,7 @@ void OStatement_Base::GetAssignValues() OSL_ENSURE(m_pParseTree->count() >= 4,"OResultSet: Error in Parse Tree"); OSQLParseNode * pAssignmentCommalist = m_pParseTree->getChild(3); - OSL_ENSURE(pAssignmentCommalist != nullptr,"OResultSet: pAssignmentCommalist == NULL"); + assert(pAssignmentCommalist && "OResultSet: pAssignmentCommalist == NULL"); OSL_ENSURE(SQL_ISRULE(pAssignmentCommalist,assignment_commalist),"OResultSet: Error in Parse Tree"); OSL_ENSURE(pAssignmentCommalist->count() > 0,"OResultSet: pAssignmentCommalist->count() <= 0"); @@ -583,15 +583,15 @@ void OStatement_Base::GetAssignValues() for (size_t i = 0; i < pAssignmentCommalist->count(); i++) { OSQLParseNode * pAssignment = pAssignmentCommalist->getChild(i); - OSL_ENSURE(pAssignment != nullptr,"OResultSet: pAssignment == NULL"); + assert(pAssignment && "OResultSet: pAssignment == NULL"); OSL_ENSURE(SQL_ISRULE(pAssignment,assignment),"OResultSet: Error in Parse Tree"); OSL_ENSURE(pAssignment->count() == 3,"OResultSet: pAssignment->count() != 3"); OSQLParseNode * pCol = pAssignment->getChild(0); - OSL_ENSURE(pCol != nullptr,"OResultSet: pCol == NULL"); + assert(pCol && "OResultSet: pCol == NULL"); OSQLParseNode * pComp = pAssignment->getChild(1); - OSL_ENSURE(pComp != nullptr,"OResultSet: pComp == NULL"); + assert(pComp && "OResultSet: pComp == NULL"); OSL_ENSURE(pComp->getNodeType() == SQLNodeType::Equal,"OResultSet: pComp->getNodeType() != SQLNodeType::Comparison"); if (pComp->getTokenValue().toChar() != '=') { @@ -610,9 +610,9 @@ void OStatement_Base::GetAssignValues() void OStatement_Base::ParseAssignValues(const std::vector< OUString>& aColumnNameList,OSQLParseNode* pRow_Value_Constructor_Elem, sal_Int32 nIndex) { OSL_ENSURE(o3tl::make_unsigned(nIndex) <= aColumnNameList.size(),"SdbFileCursor::ParseAssignValues: nIndex > aColumnNameList.GetTokenCount()"); - OUString aColumnName(aColumnNameList[nIndex]); + const OUString& aColumnName(aColumnNameList[nIndex]); OSL_ENSURE(aColumnName.getLength() > 0,"OResultSet: Column-Name not found"); - OSL_ENSURE(pRow_Value_Constructor_Elem != nullptr,"OResultSet: pRow_Value_Constructor_Elem must not be NULL!"); + assert(pRow_Value_Constructor_Elem != nullptr && "OResultSet: pRow_Value_Constructor_Elem must not be NULL!"); if (pRow_Value_Constructor_Elem->getNodeType() == SQLNodeType::String || pRow_Value_Constructor_Elem->getNodeType() == SQLNodeType::IntNum || @@ -659,14 +659,6 @@ void OStatement_Base::SetAssignValue(const OUString& aColumnName, { switch (::comphelper::getINT32(xCol->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_TYPE)))) { - // put criteria depending on the Type as String or double in the variable - case DataType::CHAR: - case DataType::VARCHAR: - case DataType::LONGVARCHAR: - *(*m_aAssignValues)[nId] = ORowSetValue(aValue); - //Characterset is already converted, since the entire statement was converted - break; - case DataType::BIT: if (aValue.equalsIgnoreAsciiCase("TRUE") || aValue[0] == '1') *(*m_aAssignValues)[nId] = true; @@ -675,6 +667,10 @@ void OStatement_Base::SetAssignValue(const OUString& aColumnName, else throwFunctionSequenceException(*this); break; + case DataType::CHAR: + case DataType::VARCHAR: + case DataType::LONGVARCHAR: + //Characterset is already converted, since the entire statement was converted case DataType::TINYINT: case DataType::SMALLINT: case DataType::INTEGER: |