2000-09-18 15:18:56 +00:00
|
|
|
/*************************************************************************
|
|
|
|
*
|
|
|
|
* $RCSfile: sqliterator.cxx,v $
|
|
|
|
*
|
2001-03-13 07:24:04 +00:00
|
|
|
* $Revision: 1.16 $
|
2000-09-18 15:18:56 +00:00
|
|
|
*
|
2001-03-13 07:24:04 +00:00
|
|
|
* last change: $Author: oj $ $Date: 2001-03-13 08:24:04 $
|
2000-09-18 15:18:56 +00:00
|
|
|
*
|
|
|
|
* The Contents of this file are made available subject to the terms of
|
|
|
|
* either of the following licenses
|
|
|
|
*
|
|
|
|
* - GNU Lesser General Public License Version 2.1
|
|
|
|
* - Sun Industry Standards Source License Version 1.1
|
|
|
|
*
|
|
|
|
* Sun Microsystems Inc., October, 2000
|
|
|
|
*
|
|
|
|
* GNU Lesser General Public License Version 2.1
|
|
|
|
* =============================================
|
|
|
|
* Copyright 2000 by Sun Microsystems, Inc.
|
|
|
|
* 901 San Antonio Road, Palo Alto, CA 94303, USA
|
|
|
|
*
|
|
|
|
* This library is free software; you can redistribute it and/or
|
|
|
|
* modify it under the terms of the GNU Lesser General Public
|
|
|
|
* License version 2.1, as published by the Free Software Foundation.
|
|
|
|
*
|
|
|
|
* This library 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 for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
|
|
* License along with this library; if not, write to the Free Software
|
|
|
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
|
|
|
|
* MA 02111-1307 USA
|
|
|
|
*
|
|
|
|
*
|
|
|
|
* Sun Industry Standards Source License Version 1.1
|
|
|
|
* =================================================
|
|
|
|
* The contents of this file are subject to the Sun Industry Standards
|
|
|
|
* Source License Version 1.1 (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.openoffice.org/license.html.
|
|
|
|
*
|
|
|
|
* Software provided under this License is provided on an "AS IS" basis,
|
|
|
|
* WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING,
|
|
|
|
* WITHOUT LIMITATION, WARRANTIES THAT THE SOFTWARE IS FREE OF DEFECTS,
|
|
|
|
* MERCHANTABLE, FIT FOR A PARTICULAR PURPOSE, OR NON-INFRINGING.
|
|
|
|
* See the License for the specific provisions governing your rights and
|
|
|
|
* obligations concerning the Software.
|
|
|
|
*
|
|
|
|
* The Initial Developer of the Original Code is: Sun Microsystems, Inc.
|
|
|
|
*
|
|
|
|
* Copyright: 2000 by Sun Microsystems, Inc.
|
|
|
|
*
|
|
|
|
* All Rights Reserved.
|
|
|
|
*
|
|
|
|
* Contributor(s): _______________________________________
|
|
|
|
*
|
|
|
|
*
|
|
|
|
************************************************************************/
|
|
|
|
|
|
|
|
#ifndef _CONNECTIVITY_PARSE_SQLITERATOR_HXX_
|
|
|
|
#include "connectivity/sqliterator.hxx"
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifndef _CONNECTIVITY_SQLPARSE_HXX
|
|
|
|
#include <connectivity/sqlparse.hxx>
|
|
|
|
#endif
|
2001-01-04 09:59:52 +00:00
|
|
|
#ifndef _CONNECTIVITY_DBTOOLS_HXX_
|
|
|
|
#include <connectivity/dbtools.hxx>
|
|
|
|
#endif
|
2000-09-18 15:18:56 +00:00
|
|
|
#ifndef _COM_SUN_STAR_SDBC_COLUMNVALUE_HPP_
|
|
|
|
#include <com/sun/star/sdbc/ColumnValue.hpp>
|
|
|
|
#endif
|
|
|
|
#ifndef _COM_SUN_STAR_SDBC_DATATYPE_HPP_
|
|
|
|
#include <com/sun/star/sdbc/DataType.hpp>
|
|
|
|
#endif
|
|
|
|
#ifndef _COM_SUN_STAR_SDBC_XROW_HPP_
|
|
|
|
#include <com/sun/star/sdbc/XRow.hpp>
|
|
|
|
#endif
|
|
|
|
#ifdef SQL_TEST_PARSETREEITERATOR
|
|
|
|
#include <iostream.h>
|
|
|
|
#endif
|
|
|
|
#ifndef _CONNECTIVITY_SDBCX_COLUMN_HXX_
|
|
|
|
#include "connectivity/PColumn.hxx"
|
|
|
|
#endif
|
2000-10-24 14:42:07 +00:00
|
|
|
#define CONNECTIVITY_PROPERTY_NAME_SPACE dbtools
|
2000-09-18 15:18:56 +00:00
|
|
|
#ifndef _CONNECTIVITY_PROPERTYIDS_HXX_
|
|
|
|
#include "propertyids.hxx"
|
|
|
|
#endif
|
2001-02-01 12:10:17 +00:00
|
|
|
#ifndef _CONNECTIVITY_DBTOOLS_HXX_
|
|
|
|
#include "connectivity/dbtools.hxx"
|
|
|
|
#endif
|
2000-09-18 15:18:56 +00:00
|
|
|
|
2001-02-01 12:10:17 +00:00
|
|
|
using namespace ::connectivity;
|
|
|
|
using namespace ::connectivity::dbtools;
|
2001-01-04 09:59:52 +00:00
|
|
|
using namespace ::dbtools;
|
2001-02-01 12:10:17 +00:00
|
|
|
using namespace ::connectivity::parse;
|
2000-09-18 15:18:56 +00:00
|
|
|
using namespace ::com::sun::star::uno;
|
|
|
|
using namespace ::com::sun::star::container;
|
|
|
|
using namespace ::com::sun::star::sdbcx;
|
|
|
|
using namespace ::com::sun::star::beans;
|
|
|
|
using namespace ::com::sun::star::sdbc;
|
|
|
|
|
2000-10-19 10:47:14 +00:00
|
|
|
static ::rtl::OUString aEmptyString;
|
2000-09-18 15:18:56 +00:00
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
OSQLParseTreeIterator::OSQLParseTreeIterator()
|
|
|
|
: m_pParseTree(NULL)
|
|
|
|
, m_xTables(NULL)
|
|
|
|
, m_xDatabaseMetaData(NULL)
|
2001-02-23 13:54:11 +00:00
|
|
|
,m_pParser(NULL)
|
2000-09-18 15:18:56 +00:00
|
|
|
{
|
2001-03-01 10:02:19 +00:00
|
|
|
m_aSelectColumns = new OSQLColumns();
|
|
|
|
m_aParameters = new OSQLColumns();
|
2000-09-18 15:18:56 +00:00
|
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
OSQLParseTreeIterator::OSQLParseTreeIterator(const Reference< XNameAccess>& _xTables ,
|
|
|
|
const Reference< XDatabaseMetaData>& _xDatabaseMetaData,
|
2001-02-23 13:54:11 +00:00
|
|
|
const OSQLParseNode* pRoot,
|
|
|
|
const OSQLParser* _pParser)
|
2000-09-18 15:18:56 +00:00
|
|
|
: m_xTables(_xTables)
|
|
|
|
, m_xDatabaseMetaData(_xDatabaseMetaData)
|
|
|
|
, m_aTables(_xDatabaseMetaData->storesMixedCaseQuotedIdentifiers())
|
|
|
|
, m_aCaseEqual(_xDatabaseMetaData->storesMixedCaseQuotedIdentifiers())
|
2001-02-23 13:54:11 +00:00
|
|
|
,m_pParser(_pParser)
|
2000-09-18 15:18:56 +00:00
|
|
|
{
|
|
|
|
m_aSelectColumns = new OSQLColumns();// must be done because we need an empty column at zero
|
2001-03-01 10:02:19 +00:00
|
|
|
m_aParameters = new OSQLColumns();
|
2000-09-18 15:18:56 +00:00
|
|
|
setParseTree(pRoot);
|
|
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
OSQLParseTreeIterator::OSQLParseTreeIterator(const OSQLParseTreeIterator & rIter)
|
|
|
|
:m_xTables(NULL)
|
|
|
|
,m_pParseTree(NULL)
|
|
|
|
, m_xDatabaseMetaData(NULL)
|
2001-02-23 13:54:11 +00:00
|
|
|
,m_pParser(NULL)
|
2000-09-18 15:18:56 +00:00
|
|
|
{
|
2000-10-19 10:47:14 +00:00
|
|
|
OSL_ASSERT("OSQLParseTreeIterator: Copy-Konstruktor nicht implementiert!");
|
2000-09-18 15:18:56 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
OSQLParseTreeIterator::~OSQLParseTreeIterator()
|
|
|
|
{
|
|
|
|
m_aTables.clear();
|
|
|
|
}
|
2000-11-03 12:31:35 +00:00
|
|
|
// -----------------------------------------------------------------------------
|
|
|
|
void OSQLParseTreeIterator::dispose()
|
2000-09-18 15:18:56 +00:00
|
|
|
{
|
2000-11-03 12:31:35 +00:00
|
|
|
m_aTables.clear();
|
|
|
|
m_aSelectColumns->clear();
|
2001-03-01 10:02:19 +00:00
|
|
|
m_aParameters->clear();
|
2000-11-03 12:31:35 +00:00
|
|
|
m_xTables = NULL;
|
|
|
|
m_xDatabaseMetaData = NULL;
|
2000-09-18 15:18:56 +00:00
|
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
void OSQLParseTreeIterator::setParseTree(const OSQLParseNode * pNewParseTree)
|
|
|
|
{
|
|
|
|
m_aTables.clear();
|
|
|
|
|
|
|
|
m_aSelectColumns->clear();
|
2001-03-01 10:02:19 +00:00
|
|
|
m_aParameters->clear();
|
2000-09-18 15:18:56 +00:00
|
|
|
|
|
|
|
m_pParseTree = pNewParseTree;
|
|
|
|
if (!m_pParseTree)
|
|
|
|
{
|
|
|
|
m_eStatementType = SQL_STATEMENT_UNKNOWN;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
// falls m_pParseTree aber keine Connection, dann Fehler
|
|
|
|
if(!m_xTables.is())
|
|
|
|
{
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2001-02-23 13:54:11 +00:00
|
|
|
m_aWarning = SQLWarning();
|
2000-09-18 15:18:56 +00:00
|
|
|
// m_aTables.setCaseSensitive(TablesAreSensitive());
|
|
|
|
|
|
|
|
|
|
|
|
// Statement-Typ ermitteln ...
|
|
|
|
if (SQL_ISRULE(m_pParseTree,select_statement) || SQL_ISRULE(m_pParseTree,union_statement) )
|
|
|
|
{
|
|
|
|
m_eStatementType = SQL_STATEMENT_SELECT;
|
|
|
|
}
|
|
|
|
else if (SQL_ISRULE(m_pParseTree,insert_statement))
|
|
|
|
{
|
|
|
|
m_eStatementType = SQL_STATEMENT_INSERT;
|
|
|
|
}
|
|
|
|
else if (SQL_ISRULE(m_pParseTree,update_statement_positioned))
|
|
|
|
{
|
|
|
|
m_eStatementType = SQL_STATEMENT_UPDATE;
|
|
|
|
}
|
|
|
|
else if (SQL_ISRULE(m_pParseTree,update_statement_searched))
|
|
|
|
{
|
|
|
|
m_eStatementType = SQL_STATEMENT_UPDATE;
|
|
|
|
}
|
|
|
|
else if (SQL_ISRULE(m_pParseTree,delete_statement_positioned))
|
|
|
|
{
|
|
|
|
m_eStatementType = SQL_STATEMENT_DELETE;
|
|
|
|
}
|
|
|
|
else if (SQL_ISRULE(m_pParseTree,delete_statement_searched))
|
|
|
|
{
|
|
|
|
m_eStatementType = SQL_STATEMENT_DELETE;
|
|
|
|
}
|
|
|
|
else if (m_pParseTree->count() == 3 && SQL_ISRULE(m_pParseTree->getChild(1),odbc_call_spec))
|
|
|
|
{
|
|
|
|
m_eStatementType = SQL_STATEMENT_ODBC_CALL;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
m_eStatementType = SQL_STATEMENT_UNKNOWN;
|
|
|
|
//aIteratorStatus.setInvalidStatement();
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
2000-10-19 10:47:14 +00:00
|
|
|
void OSQLParseTreeIterator::traverseOneTableName(const OSQLParseNode * pTableName, const ::rtl::OUString & rTableRange)
|
2000-09-18 15:18:56 +00:00
|
|
|
{
|
|
|
|
|
|
|
|
|
2000-10-19 10:47:14 +00:00
|
|
|
OSL_ENSHURE(pTableName != NULL,"OSQLParseTreeIterator::traverseOneTableName: pTableName == NULL");
|
|
|
|
|
2001-01-09 12:11:07 +00:00
|
|
|
Any aCatalog;
|
|
|
|
::rtl::OUString aSchema,aTableName,aComposedName;
|
2000-10-19 10:47:14 +00:00
|
|
|
::rtl::OUString aTableRange(rTableRange);
|
2000-09-18 15:18:56 +00:00
|
|
|
|
|
|
|
// Tabellenname abholen
|
2001-01-09 12:11:07 +00:00
|
|
|
OSQLParseNode::getTableComponents(pTableName,aCatalog,aSchema,aTableName);
|
|
|
|
|
|
|
|
// create the composed name like DOMAIN.USER.TABLE1
|
|
|
|
::dbtools::composeTableName(m_xDatabaseMetaData,
|
|
|
|
aCatalog.hasValue() ? ::comphelper::getString(aCatalog) : ::rtl::OUString(),
|
|
|
|
aSchema,
|
|
|
|
aTableName,
|
|
|
|
aComposedName,
|
|
|
|
sal_False);
|
|
|
|
// if there is no alias for the table name assign the orignal name to it
|
2000-10-19 10:47:14 +00:00
|
|
|
if (!aTableRange.getLength())
|
2001-01-09 12:11:07 +00:00
|
|
|
aTableRange = aComposedName;
|
2000-09-18 15:18:56 +00:00
|
|
|
|
2001-01-09 12:11:07 +00:00
|
|
|
if(aComposedName.getLength())
|
2000-09-18 15:18:56 +00:00
|
|
|
{
|
|
|
|
try
|
|
|
|
{
|
2001-01-09 12:11:07 +00:00
|
|
|
if(!m_xTables->hasByName(aComposedName)) // name not in XNameAccess
|
2000-09-18 15:18:56 +00:00
|
|
|
{
|
2001-01-09 12:11:07 +00:00
|
|
|
// exists the name in the metadata ?!
|
|
|
|
if(!aSchema.getLength())
|
|
|
|
aSchema = ::rtl::OUString::createFromAscii("%");
|
2000-11-14 12:33:29 +00:00
|
|
|
|
2000-09-18 15:18:56 +00:00
|
|
|
Sequence< ::rtl::OUString > aSeq;
|
2001-01-09 12:11:07 +00:00
|
|
|
Reference< XResultSet> xRes = m_xDatabaseMetaData->getTables(aCatalog,aSchema,aTableName,aSeq);
|
|
|
|
aComposedName = ::rtl::OUString(); // now clear the name to avoid reassignment
|
2000-09-18 15:18:56 +00:00
|
|
|
if(xRes.is() && xRes->next())
|
|
|
|
{
|
|
|
|
::rtl::OUString sCatalog, sSchema, sName;
|
|
|
|
Reference< XRow > xCurrentRow(xRes, UNO_QUERY);
|
2001-01-04 09:59:52 +00:00
|
|
|
::dbtools::composeTableName(m_xDatabaseMetaData, xCurrentRow->getString(1),
|
|
|
|
xCurrentRow->getString(2),
|
|
|
|
xCurrentRow->getString(3),
|
2001-01-09 12:11:07 +00:00
|
|
|
aComposedName,
|
2001-01-04 09:59:52 +00:00
|
|
|
sal_False);
|
2000-09-18 15:18:56 +00:00
|
|
|
}
|
|
|
|
}
|
2001-01-09 12:11:07 +00:00
|
|
|
if(m_xTables->hasByName(aComposedName)) // the name can be changed before
|
|
|
|
m_xTables->getByName(aComposedName) >>= m_aTables[aTableRange];
|
2001-02-23 13:54:11 +00:00
|
|
|
else if(m_pParser)
|
|
|
|
{
|
|
|
|
::rtl::OUString sErrMsg = m_pParser->getContext().getErrorMessage(OParseContext::ERROR_INVALID_TABLE);
|
|
|
|
sErrMsg = sErrMsg.replaceAt(sErrMsg.indexOf('#'),1,aTableName);
|
|
|
|
appendWarning(sErrMsg);
|
|
|
|
}
|
2000-09-18 15:18:56 +00:00
|
|
|
|
2000-11-29 09:39:47 +00:00
|
|
|
}
|
|
|
|
catch(Exception&)
|
2000-09-18 15:18:56 +00:00
|
|
|
{
|
2000-11-09 07:48:25 +00:00
|
|
|
OSL_ENSHURE(0,"traverseOneTableName: Exception occured!");
|
2000-09-18 15:18:56 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
2000-10-19 10:47:14 +00:00
|
|
|
OSQLParseNode * OSQLParseTreeIterator::getQualified_join(OSQLParseNode *pTableRef,::rtl::OUString& aTableRange)
|
2000-09-18 15:18:56 +00:00
|
|
|
{
|
2000-10-19 10:47:14 +00:00
|
|
|
|
|
|
|
aTableRange = ::rtl::OUString();
|
2000-09-18 15:18:56 +00:00
|
|
|
|
|
|
|
OSQLParseNode *pNode = getTableRef(pTableRef->getChild(0),aTableRange);
|
2001-01-09 12:11:07 +00:00
|
|
|
if(isTableNode(pNode))
|
2000-09-18 15:18:56 +00:00
|
|
|
traverseOneTableName(pNode,aTableRange);
|
2001-01-09 12:11:07 +00:00
|
|
|
else
|
|
|
|
OSL_ENSURE(0,"To tableNode found!");
|
2000-10-19 10:47:14 +00:00
|
|
|
sal_uInt32 nPos = 4;
|
2000-09-18 15:18:56 +00:00
|
|
|
if(SQL_ISRULE(pTableRef,cross_union) || pTableRef->getChild(1)->getTokenID() != SQL_TOKEN_NATURAL)
|
|
|
|
nPos = 3;
|
|
|
|
|
|
|
|
|
|
|
|
pNode = getTableRef(pTableRef->getChild(nPos),aTableRange);
|
2001-01-09 12:11:07 +00:00
|
|
|
if(isTableNode(pNode))
|
2000-09-18 15:18:56 +00:00
|
|
|
traverseOneTableName(pNode,aTableRange);
|
2001-01-09 12:11:07 +00:00
|
|
|
else
|
|
|
|
OSL_ENSURE(0,"To tableNode found!");
|
2000-09-18 15:18:56 +00:00
|
|
|
return pNode;
|
|
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
2000-10-19 10:47:14 +00:00
|
|
|
OSQLParseNode * OSQLParseTreeIterator::getTableRef(OSQLParseNode *pTableRef,::rtl::OUString& aTableRange)
|
2000-09-18 15:18:56 +00:00
|
|
|
{
|
2000-10-19 10:47:14 +00:00
|
|
|
|
2000-09-18 15:18:56 +00:00
|
|
|
OSQLParseNode *pTableName = pTableRef;
|
|
|
|
if (pTableName->count() == 4 )
|
|
|
|
{
|
|
|
|
if(SQL_ISPUNCTUATION(pTableName->getChild(0),"{"))
|
|
|
|
{ // { OJ joined_table }
|
|
|
|
getQualified_join(pTableName->getChild(2),aTableRange);
|
|
|
|
pTableName = NULL;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
// Tabellennamen gefunden
|
2001-01-09 12:11:07 +00:00
|
|
|
if(!isTableNode(pTableName))
|
2000-09-18 15:18:56 +00:00
|
|
|
pTableName = pTableRef->getChild(0);
|
2000-10-19 10:47:14 +00:00
|
|
|
aTableRange = ::rtl::OUString();
|
2000-09-18 15:18:56 +00:00
|
|
|
if(pTableRef->count() == 4)
|
|
|
|
aTableRange = pTableRef->getChild(2)->getTokenValue(); // Tabellenrange an Pos 2
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else if(SQL_ISRULE(pTableName,qualified_join) || SQL_ISRULE(pTableName,cross_union))
|
|
|
|
{
|
|
|
|
getQualified_join(pTableRef,aTableRange);
|
|
|
|
pTableName = NULL;
|
|
|
|
}
|
|
|
|
else if (SQL_ISRULE(pTableName,joined_table))
|
|
|
|
{
|
|
|
|
// '(' qualified_join ')'
|
|
|
|
getQualified_join(pTableName->getChild(1),aTableRange);
|
|
|
|
pTableName = NULL;
|
|
|
|
}
|
|
|
|
else if(pTableRef->count() == 6)
|
|
|
|
{
|
|
|
|
// '(' joined_table ')' as range_variable op_column_commalist
|
|
|
|
if(SQL_ISRULE(pTableRef->getChild(1),qualified_join) || SQL_ISRULE(pTableRef->getChild(1),cross_union))
|
|
|
|
getQualified_join(pTableRef->getChild(1),aTableRange);
|
|
|
|
else if(SQL_ISRULE(pTableRef->getChild(1),select_statement)) // Unterabfrage
|
|
|
|
getSelect_statement(pTableRef->getChild(1));
|
|
|
|
else if(pTableRef->getChild(1)->count() == 4)
|
|
|
|
// pTableRef->getChild(1) ->> non_join_query_exp
|
|
|
|
getSelect_statement(pTableRef->getChild(0)); // query_exp SQL_TOKEN_UNION all query_term
|
|
|
|
else
|
|
|
|
{// nyi: tiefere Verschachtelung m"oglch
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return pTableName;
|
|
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
void OSQLParseTreeIterator::getSelect_statement(OSQLParseNode *pSelect)
|
|
|
|
{
|
2000-10-19 10:47:14 +00:00
|
|
|
|
2000-09-18 15:18:56 +00:00
|
|
|
if(SQL_ISRULE(pSelect,union_statement))
|
|
|
|
{
|
|
|
|
getSelect_statement(pSelect->getChild(0));
|
|
|
|
//getSelect_statement(pSelect->getChild(3));
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
OSQLParseNode * pTableRefCommalist = pSelect->getChild(3)->getChild(0)->getChild(1);
|
|
|
|
|
2000-10-19 10:47:14 +00:00
|
|
|
OSL_ENSHURE(pTableRefCommalist != NULL,"OSQLParseTreeIterator: Fehler im Parse Tree");
|
|
|
|
OSL_ENSHURE(SQL_ISRULE(pTableRefCommalist,table_ref_commalist),"OSQLParseTreeIterator: Fehler im Parse Tree");
|
2000-09-18 15:18:56 +00:00
|
|
|
|
|
|
|
OSQLParseNode * pTableName = NULL;
|
2000-10-19 10:47:14 +00:00
|
|
|
::rtl::OUString aTableRange;
|
|
|
|
for (sal_uInt32 i = 0; i < pTableRefCommalist->count(); i++)
|
2000-09-18 15:18:56 +00:00
|
|
|
{ // from clause durchlaufen
|
2000-10-19 10:47:14 +00:00
|
|
|
aTableRange = ::rtl::OUString();
|
2000-09-18 15:18:56 +00:00
|
|
|
|
2001-01-09 12:11:07 +00:00
|
|
|
if (isTableNode(pTableRefCommalist->getChild(i)))
|
2000-09-18 15:18:56 +00:00
|
|
|
{
|
|
|
|
pTableName = pTableRefCommalist->getChild(i);
|
2001-01-09 12:11:07 +00:00
|
|
|
traverseOneTableName(pTableName,aTableRange);// aTableRange will be set inside to the tablename
|
2000-09-18 15:18:56 +00:00
|
|
|
}
|
|
|
|
else if (SQL_ISRULE(pTableRefCommalist->getChild(i),table_ref))
|
|
|
|
{
|
|
|
|
// Tabellenreferenz kann aus Tabellennamen, Tabellennamen (+),'('joined_table')'(+) bestehen
|
|
|
|
pTableName = pTableRefCommalist->getChild(i)->getChild(0);
|
2001-01-09 12:11:07 +00:00
|
|
|
if(isTableNode(pTableName))
|
2000-09-18 15:18:56 +00:00
|
|
|
{ // Tabellennamen gefunden
|
|
|
|
if(pTableRefCommalist->getChild(i)->count() == 4) // Tabellenrange an Pos 2
|
|
|
|
aTableRange = pTableRefCommalist->getChild(i)->getChild(2)->getTokenValue();
|
|
|
|
traverseOneTableName(pTableName,aTableRange);
|
|
|
|
}
|
|
|
|
else if(SQL_ISPUNCTUATION(pTableName,"{"))
|
|
|
|
getQualified_join(pTableRefCommalist->getChild(i)->getChild(2),aTableRange);
|
|
|
|
else // '(' joined_table ')' as range_variable op_column_commalist
|
|
|
|
getTableRef(pTableRefCommalist->getChild(i),aTableRange);
|
|
|
|
}
|
|
|
|
else if (SQL_ISRULE(pTableRefCommalist->getChild(i),qualified_join) || SQL_ISRULE(pTableRefCommalist->getChild(i),cross_union) )
|
|
|
|
{
|
|
|
|
// qualified_join oder cross_union vorhanden
|
|
|
|
getQualified_join(pTableRefCommalist->getChild(i),aTableRange);
|
|
|
|
}
|
|
|
|
else if (SQL_ISRULE(pTableRefCommalist->getChild(i),joined_table))
|
|
|
|
{
|
|
|
|
// '(' qualified_join ')'
|
|
|
|
getQualified_join(pTableRefCommalist->getChild(i)->getChild(1),aTableRange);
|
|
|
|
}
|
|
|
|
|
|
|
|
// if (! aIteratorStatus.IsSuccessful()) break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
void OSQLParseTreeIterator::traverseTableNames()
|
|
|
|
{
|
2000-10-19 10:47:14 +00:00
|
|
|
|
2000-09-18 15:18:56 +00:00
|
|
|
// aIteratorStatus.Clear();
|
|
|
|
|
|
|
|
if (m_pParseTree == NULL) {
|
|
|
|
//aIteratorStatus.setInvalidStatement();
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
OSQLParseNode * pTableName = NULL;
|
2000-10-19 10:47:14 +00:00
|
|
|
::rtl::OUString aTableRange;
|
2000-09-18 15:18:56 +00:00
|
|
|
|
|
|
|
// pTableName auf den (einzigen) Tabellennamen im Statement setzen.
|
|
|
|
// Je nach Statement (SELECT, INSERT, UPDATE, DELETE) an anderer Position.
|
|
|
|
// Bei Select koennen mehrere Tabellennamen auftreten, bei den uebrigen Statements
|
|
|
|
// ist ohnehin immer nur einer moeglich.
|
|
|
|
|
|
|
|
if (m_eStatementType == SQL_STATEMENT_SELECT)
|
|
|
|
{
|
|
|
|
OSQLParseNode *pTmp = (OSQLParseNode *)m_pParseTree;
|
|
|
|
getSelect_statement(pTmp);
|
|
|
|
}
|
|
|
|
else if (m_eStatementType == SQL_STATEMENT_INSERT)
|
|
|
|
{
|
|
|
|
pTableName = m_pParseTree->getChild(2);
|
|
|
|
traverseOneTableName(pTableName,aTableRange);
|
|
|
|
}
|
|
|
|
else if (m_eStatementType == SQL_STATEMENT_UPDATE)
|
|
|
|
{
|
|
|
|
pTableName = m_pParseTree->getChild(1);
|
|
|
|
traverseOneTableName(pTableName,aTableRange);
|
|
|
|
}
|
|
|
|
else if (m_eStatementType == SQL_STATEMENT_DELETE)
|
|
|
|
{
|
|
|
|
pTableName = m_pParseTree->getChild(2);
|
|
|
|
traverseOneTableName(pTableName,aTableRange);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
2000-10-19 10:47:14 +00:00
|
|
|
::rtl::OUString OSQLParseTreeIterator::getColumnAlias(const OSQLParseNode* pDerivedColumn) const
|
2000-09-18 15:18:56 +00:00
|
|
|
{
|
2000-10-19 10:47:14 +00:00
|
|
|
|
|
|
|
::rtl::OUString aColumnAlias;
|
2000-09-18 15:18:56 +00:00
|
|
|
if(pDerivedColumn->getChild(1)->count() == 2)
|
|
|
|
aColumnAlias = pDerivedColumn->getChild(1)->getChild(1)->getTokenValue();
|
|
|
|
else if(!pDerivedColumn->getChild(1)->isRule())
|
|
|
|
aColumnAlias = pDerivedColumn->getChild(1)->getTokenValue();
|
|
|
|
return aColumnAlias;
|
|
|
|
}
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
2000-10-19 10:47:14 +00:00
|
|
|
void OSQLParseTreeIterator::getColumnRange(const OSQLParseNode* pColumnRef,::rtl::OUString &rColumnName,::rtl::OUString &rTableRange) const
|
2000-09-18 15:18:56 +00:00
|
|
|
{
|
2000-10-19 10:47:14 +00:00
|
|
|
|
|
|
|
rColumnName = ::rtl::OUString();
|
|
|
|
rTableRange = ::rtl::OUString();
|
2000-09-18 15:18:56 +00:00
|
|
|
if(SQL_ISRULE(pColumnRef,column_ref))// ab hier ist es sicher eine Columnref
|
|
|
|
{
|
|
|
|
if(pColumnRef->count() > 1)
|
|
|
|
{
|
2000-10-19 10:47:14 +00:00
|
|
|
for(sal_Int32 i=0;i<((sal_Int32)pColumnRef->count())-2;i++) // mu"s signed sein, falls count == 1
|
|
|
|
pColumnRef->getChild(i)->parseNodeToStr(rTableRange,m_xDatabaseMetaData,NULL,sal_False,sal_False);
|
2000-09-18 15:18:56 +00:00
|
|
|
// Spaltenname
|
|
|
|
rColumnName = pColumnRef->getChild(pColumnRef->count()-1)->getChild(0)->getTokenValue();
|
|
|
|
}
|
|
|
|
else
|
|
|
|
rColumnName = pColumnRef->getChild(0)->getTokenValue();
|
|
|
|
}
|
|
|
|
else if(SQL_ISRULE(pColumnRef,general_set_fct) || SQL_ISRULE(pColumnRef,set_fct_spec))
|
|
|
|
{ // Funktion
|
|
|
|
pColumnRef->parseNodeToStr(rColumnName,m_xDatabaseMetaData);
|
|
|
|
}
|
|
|
|
else if(pColumnRef->getNodeType() == SQL_NODE_NAME)
|
|
|
|
rColumnName = pColumnRef->getTokenValue();
|
|
|
|
}
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
2000-10-19 10:47:14 +00:00
|
|
|
sal_Bool OSQLParseTreeIterator::getColumnTableRange(const OSQLParseNode* pNode, ::rtl::OUString &rTableRange) const
|
2000-09-18 15:18:56 +00:00
|
|
|
{
|
|
|
|
// Ermitteln ob alle Spalten zu einer Tabelle gehoeren
|
|
|
|
if (SQL_ISRULE(pNode,column_ref))
|
|
|
|
{
|
2000-10-19 10:47:14 +00:00
|
|
|
::rtl::OUString aColName, aTableRange;
|
2000-09-18 15:18:56 +00:00
|
|
|
getColumnRange(pNode, aColName, aTableRange);
|
2000-10-19 10:47:14 +00:00
|
|
|
if (!aTableRange.getLength()) // keinen gefunden
|
2000-09-18 15:18:56 +00:00
|
|
|
{
|
|
|
|
// dann die Spalte in den Tabellen suchen
|
|
|
|
for (ConstOSQLTablesIterator aIter = m_aTables.begin(); aIter != m_aTables.end(); ++aIter)
|
|
|
|
{
|
|
|
|
if (aIter->second.is())
|
|
|
|
{
|
|
|
|
try
|
|
|
|
{
|
|
|
|
Reference< XNameAccess > xColumns = aIter->second->getColumns();
|
2001-01-04 09:59:52 +00:00
|
|
|
if(xColumns->hasByName(aColName))
|
2000-09-18 15:18:56 +00:00
|
|
|
{
|
2001-01-04 09:59:52 +00:00
|
|
|
Reference< XPropertySet > xColumn;
|
|
|
|
if (xColumns->getByName(aColName) >>= xColumn)
|
|
|
|
{
|
|
|
|
OSL_ENSURE(xColumn.is(),"Column isn't a propertyset!");
|
|
|
|
aTableRange = aIter->first;
|
|
|
|
break;
|
|
|
|
}
|
2000-09-18 15:18:56 +00:00
|
|
|
}
|
|
|
|
}
|
2000-11-29 09:39:47 +00:00
|
|
|
catch(Exception&)
|
2000-09-18 15:18:56 +00:00
|
|
|
{
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2000-10-19 10:47:14 +00:00
|
|
|
if (!aTableRange.getLength())
|
|
|
|
return sal_False;
|
2000-09-18 15:18:56 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2000-10-19 10:47:14 +00:00
|
|
|
if (!rTableRange.getLength())
|
2000-09-18 15:18:56 +00:00
|
|
|
rTableRange = aTableRange;
|
|
|
|
else if (rTableRange != aTableRange)
|
2000-10-19 10:47:14 +00:00
|
|
|
return sal_False;
|
2000-09-18 15:18:56 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2000-10-19 10:47:14 +00:00
|
|
|
for (sal_uInt32 i = 0, ncount = pNode->count(); i < ncount; i++)
|
2000-09-18 15:18:56 +00:00
|
|
|
{
|
|
|
|
if (!getColumnTableRange(pNode->getChild(i), rTableRange))
|
2000-10-19 10:47:14 +00:00
|
|
|
return sal_False;
|
2000-09-18 15:18:56 +00:00
|
|
|
}
|
|
|
|
}
|
2000-10-19 10:47:14 +00:00
|
|
|
return sal_True;
|
2000-09-18 15:18:56 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
void OSQLParseTreeIterator::traverseSelectColumnNames(const OSQLParseNode* pSelectNode)
|
|
|
|
{
|
2000-10-19 10:47:14 +00:00
|
|
|
|
2000-09-18 15:18:56 +00:00
|
|
|
// aIteratorStatus.Clear();
|
|
|
|
|
|
|
|
if (!pSelectNode || m_eStatementType != SQL_STATEMENT_SELECT || !m_aTables.size())
|
|
|
|
{
|
2001-02-23 13:54:11 +00:00
|
|
|
if(m_pParser)
|
|
|
|
appendWarning(m_pParser->getContext().getErrorMessage(OParseContext::ERROR_GENERAL));
|
2000-09-18 15:18:56 +00:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if(SQL_ISRULE(pSelectNode,union_statement))
|
|
|
|
{
|
|
|
|
traverseSelectColumnNames(pSelectNode->getChild(0));
|
|
|
|
// traverseSelectColumnNames(pSelectNode->getChild(3));
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
// nyi: mehr Pruefung auf korrekte Struktur!
|
|
|
|
if (pSelectNode->getChild(2)->isRule() && SQL_ISPUNCTUATION(pSelectNode->getChild(2)->getChild(0),"*"))
|
|
|
|
{
|
|
|
|
// SELECT * ...
|
2000-10-19 10:47:14 +00:00
|
|
|
setSelectColumnName(::rtl::OUString::createFromAscii("*"), aEmptyString,aEmptyString);
|
2000-09-18 15:18:56 +00:00
|
|
|
}
|
|
|
|
else if (SQL_ISRULE(pSelectNode->getChild(2),scalar_exp_commalist))
|
|
|
|
{
|
2001-01-09 12:11:07 +00:00
|
|
|
// SELECT column[,column] oder SELECT COUNT(*) ...
|
2000-09-18 15:18:56 +00:00
|
|
|
OSQLParseNode * pSelection = pSelectNode->getChild(2);
|
|
|
|
|
2000-10-19 10:47:14 +00:00
|
|
|
for (sal_uInt32 i = 0; i < pSelection->count(); i++)
|
2000-09-18 15:18:56 +00:00
|
|
|
{
|
|
|
|
OSQLParseNode *pColumnRef = pSelection->getChild(i);
|
|
|
|
|
2001-01-09 12:11:07 +00:00
|
|
|
//if (SQL_ISRULE(pColumnRef,select_sublist))
|
|
|
|
if (SQL_ISRULE(pColumnRef,derived_column) &&
|
|
|
|
SQL_ISRULE(pColumnRef->getChild(0),column_ref) &&
|
|
|
|
pColumnRef->getChild(0)->count() == 3 &&
|
|
|
|
SQL_ISPUNCTUATION(pColumnRef->getChild(0)->getChild(2),"*"))
|
2000-09-18 15:18:56 +00:00
|
|
|
{
|
|
|
|
// alle Spalten der Tabelle
|
2000-10-19 10:47:14 +00:00
|
|
|
::rtl::OUString aTableRange;
|
|
|
|
pColumnRef->getChild(0)->parseNodeToStr(aTableRange,m_xDatabaseMetaData,NULL,sal_False,sal_False);
|
|
|
|
setSelectColumnName(::rtl::OUString::createFromAscii("*"), aEmptyString,aTableRange);
|
2000-09-18 15:18:56 +00:00
|
|
|
continue;
|
|
|
|
}else if (SQL_ISRULE(pColumnRef,derived_column))
|
|
|
|
{
|
2000-10-19 10:47:14 +00:00
|
|
|
::rtl::OUString aColumnAlias(getColumnAlias(pColumnRef)); // kann leer sein
|
|
|
|
::rtl::OUString aColumnName;
|
|
|
|
::rtl::OUString aTableRange;
|
|
|
|
sal_Bool bFkt(sal_False);
|
2000-09-18 15:18:56 +00:00
|
|
|
pColumnRef = pColumnRef->getChild(0);
|
|
|
|
if (SQL_ISRULE(pColumnRef,column_ref))
|
|
|
|
{
|
|
|
|
getColumnRange(pColumnRef,aColumnName,aTableRange);
|
2000-10-19 10:47:14 +00:00
|
|
|
OSL_ENSHURE(aColumnName.getLength(),"Columnname darf nicht leer sein");
|
2000-09-18 15:18:56 +00:00
|
|
|
}
|
|
|
|
else /*if (SQL_ISRULE(pColumnRef,general_set_fct) || SQL_ISRULE(pColumnRef,set_fct_spec) ||
|
|
|
|
SQL_ISRULE(pColumnRef,position_exp) || SQL_ISRULE(pColumnRef,extract_exp) ||
|
|
|
|
SQL_ISRULE(pColumnRef,length_exp) || SQL_ISRULE(pColumnRef,char_value_fct)||
|
|
|
|
SQL_ISRULE(pColumnRef,num_value_exp) || SQL_ISRULE(pColumnRef,term))*/
|
|
|
|
{
|
|
|
|
/* Funktionsaufruf vorhanden */
|
2000-10-19 10:47:14 +00:00
|
|
|
pColumnRef->parseNodeToStr(aColumnName,m_xDatabaseMetaData,NULL,sal_False,sal_True);
|
2000-09-18 15:18:56 +00:00
|
|
|
|
|
|
|
// gehoeren alle beteiligten Spalten der Funktion zu einer Tabelle
|
|
|
|
if (m_aTables.size() == 1)
|
|
|
|
{
|
|
|
|
aTableRange = m_aTables.begin()->first;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
getColumnTableRange(pColumnRef,aTableRange);
|
|
|
|
}
|
2000-10-19 10:47:14 +00:00
|
|
|
bFkt = sal_True;
|
2000-09-18 15:18:56 +00:00
|
|
|
}
|
|
|
|
/*
|
|
|
|
else
|
|
|
|
{
|
|
|
|
aIteratorStatus.setStatementTooComplex();
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
*/
|
2000-10-19 10:47:14 +00:00
|
|
|
if(!aColumnAlias.getLength())
|
2000-09-18 15:18:56 +00:00
|
|
|
aColumnAlias = aColumnName;
|
|
|
|
setSelectColumnName(aColumnName,aColumnAlias,aTableRange,bFkt);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
void OSQLParseTreeIterator::traverseOrderByColumnNames(const OSQLParseNode* pSelectNode)
|
|
|
|
{
|
2000-10-19 10:47:14 +00:00
|
|
|
|
2000-09-18 15:18:56 +00:00
|
|
|
// aIteratorStatus.Clear();
|
|
|
|
|
|
|
|
if (pSelectNode == NULL)
|
|
|
|
{
|
|
|
|
//aIteratorStatus.setInvalidStatement();
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (m_eStatementType != SQL_STATEMENT_SELECT)
|
|
|
|
{
|
|
|
|
//aIteratorStatus.setInvalidStatement();
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if(SQL_ISRULE(pSelectNode,union_statement))
|
|
|
|
{
|
|
|
|
traverseOrderByColumnNames(pSelectNode->getChild(0));
|
|
|
|
//traverseOrderByColumnNames(pSelectNode->getChild(3));
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2000-10-19 10:47:14 +00:00
|
|
|
OSL_ENSHURE(pSelectNode->count() >= 4,"OSQLParseTreeIterator: Fehler im Parse Tree");
|
2000-09-18 15:18:56 +00:00
|
|
|
|
|
|
|
OSQLParseNode * pTableExp = pSelectNode->getChild(3);
|
2000-10-19 10:47:14 +00:00
|
|
|
OSL_ENSHURE(pTableExp != NULL,"OSQLParseTreeIterator: Fehler im Parse Tree");
|
|
|
|
OSL_ENSHURE(SQL_ISRULE(pTableExp,table_exp),"OSQLParseTreeIterator: Fehler im Parse Tree");
|
|
|
|
OSL_ENSHURE(pTableExp->count() == 5,"OSQLParseTreeIterator: Fehler im Parse Tree");
|
2000-09-18 15:18:56 +00:00
|
|
|
|
|
|
|
OSQLParseNode * pOptOrderByClause = pTableExp->getChild(4);
|
2000-10-19 10:47:14 +00:00
|
|
|
OSL_ENSHURE(pOptOrderByClause != NULL,"OSQLParseTreeIterator: Fehler im Parse Tree");
|
|
|
|
OSL_ENSHURE(SQL_ISRULE(pOptOrderByClause,opt_order_by_clause),"OSQLParseTreeIterator: Fehler im Parse Tree");
|
2000-09-18 15:18:56 +00:00
|
|
|
if (pOptOrderByClause->count() == 0)
|
|
|
|
return;
|
|
|
|
|
2000-10-19 10:47:14 +00:00
|
|
|
OSL_ENSHURE(pOptOrderByClause->count() == 3,"OSQLParseTreeIterator: Fehler im Parse Tree");
|
2000-09-18 15:18:56 +00:00
|
|
|
|
|
|
|
OSQLParseNode * pOrderingSpecCommalist = pOptOrderByClause->getChild(2);
|
2000-10-19 10:47:14 +00:00
|
|
|
OSL_ENSHURE(pOrderingSpecCommalist != NULL,"OSQLParseTreeIterator: Fehler im Parse Tree");
|
|
|
|
OSL_ENSHURE(SQL_ISRULE(pOrderingSpecCommalist,ordering_spec_commalist),"OSQLParseTreeIterator: Fehler im Parse Tree");
|
|
|
|
OSL_ENSHURE(pOrderingSpecCommalist->count() > 0,"OSQLParseTreeIterator: Fehler im Parse Tree");
|
2000-09-18 15:18:56 +00:00
|
|
|
|
2000-10-19 10:47:14 +00:00
|
|
|
::rtl::OUString aColumnName,aColumnAlias;
|
|
|
|
::rtl::OUString aTableRange;
|
|
|
|
for (sal_uInt32 i = 0; i < pOrderingSpecCommalist->count(); i++)
|
2000-09-18 15:18:56 +00:00
|
|
|
{
|
|
|
|
OSQLParseNode * pOrderingSpec = pOrderingSpecCommalist->getChild(i);
|
2000-10-19 10:47:14 +00:00
|
|
|
OSL_ENSHURE(pOrderingSpec != NULL,"OSQLParseTreeIterator: Fehler im Parse Tree");
|
|
|
|
OSL_ENSHURE(SQL_ISRULE(pOrderingSpec,ordering_spec),"OSQLParseTreeIterator: Fehler im Parse Tree");
|
|
|
|
OSL_ENSHURE(pOrderingSpec->count() == 2,"OSQLParseTreeIterator: Fehler im Parse Tree");
|
2000-09-18 15:18:56 +00:00
|
|
|
|
|
|
|
OSQLParseNode * pColumnRef = pOrderingSpec->getChild(0);
|
2000-10-19 10:47:14 +00:00
|
|
|
aTableRange = ::rtl::OUString();
|
|
|
|
aColumnName = ::rtl::OUString();
|
2000-09-18 15:18:56 +00:00
|
|
|
if(SQL_ISRULE(pColumnRef,column_ref))
|
|
|
|
{
|
|
|
|
// Column-Name (und TableRange):
|
|
|
|
if(SQL_ISRULE(pColumnRef,column_ref))
|
|
|
|
getColumnRange(pColumnRef,aColumnName,aTableRange);
|
|
|
|
else // eine Expression
|
2000-10-19 10:47:14 +00:00
|
|
|
pColumnRef->parseNodeToStr(aColumnName,m_xDatabaseMetaData,NULL,sal_False,sal_False);
|
2000-09-18 15:18:56 +00:00
|
|
|
|
2000-10-19 10:47:14 +00:00
|
|
|
OSL_ENSHURE(aColumnName.getLength(),"aColumnName darf nicht leer sein");
|
2000-09-18 15:18:56 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{ // here I found a predicate
|
2000-10-19 10:47:14 +00:00
|
|
|
pColumnRef->parseNodeToStr(aColumnName,m_xDatabaseMetaData,NULL,sal_False,sal_False);
|
2000-09-18 15:18:56 +00:00
|
|
|
}
|
2000-10-19 10:47:14 +00:00
|
|
|
OSL_ENSHURE(pColumnRef != NULL,"OSQLParseTreeIterator: Fehler im Parse Tree");
|
2000-09-18 15:18:56 +00:00
|
|
|
// Ascending/Descending
|
|
|
|
OSQLParseNode * pOptAscDesc = pOrderingSpec->getChild(1);
|
2000-10-19 10:47:14 +00:00
|
|
|
OSL_ENSHURE(pOptAscDesc != NULL,"OSQLParseTreeIterator: Fehler im Parse Tree");
|
2000-09-18 15:18:56 +00:00
|
|
|
|
2000-10-19 10:47:14 +00:00
|
|
|
sal_Bool bAscending = sal_True;
|
2000-09-18 15:18:56 +00:00
|
|
|
if(pOptAscDesc)
|
|
|
|
{
|
|
|
|
if (SQL_ISTOKEN(pOptAscDesc,ASC))
|
2000-10-19 10:47:14 +00:00
|
|
|
bAscending = sal_True;
|
2000-09-18 15:18:56 +00:00
|
|
|
else if (SQL_ISTOKEN(pOptAscDesc,DESC))
|
2000-10-19 10:47:14 +00:00
|
|
|
bAscending = sal_False;
|
2000-09-18 15:18:56 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
setOrderByColumnName(aColumnName, aTableRange,bAscending);
|
|
|
|
// if (! aIteratorStatus.IsSuccessful())
|
|
|
|
// return;
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
void OSQLParseTreeIterator::traverseSelectionCriteria(const OSQLParseNode* pSelectNode)
|
|
|
|
{
|
2000-10-19 10:47:14 +00:00
|
|
|
|
2000-09-18 15:18:56 +00:00
|
|
|
// aIteratorStatus.Clear();
|
|
|
|
|
|
|
|
if (pSelectNode == NULL)
|
|
|
|
{
|
|
|
|
//aIteratorStatus.setInvalidStatement();
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Parse Tree analysieren (je nach Statement-Typ)
|
|
|
|
// und Zeiger auf WHERE-Klausel setzen:
|
|
|
|
OSQLParseNode * pWhereClause = NULL;
|
|
|
|
|
|
|
|
if (m_eStatementType == SQL_STATEMENT_SELECT)
|
|
|
|
{
|
|
|
|
if(SQL_ISRULE(pSelectNode,union_statement))
|
|
|
|
{
|
|
|
|
traverseSelectionCriteria(pSelectNode->getChild(0));
|
|
|
|
traverseSelectionCriteria(pSelectNode->getChild(3));
|
|
|
|
return;
|
|
|
|
}
|
2000-10-19 10:47:14 +00:00
|
|
|
OSL_ENSHURE(pSelectNode->count() >= 4,"OSQLParseTreeIterator: Fehler im Parse Tree");
|
2000-09-18 15:18:56 +00:00
|
|
|
|
|
|
|
OSQLParseNode * pTableExp = pSelectNode->getChild(3);
|
2000-10-19 10:47:14 +00:00
|
|
|
OSL_ENSHURE(pTableExp != NULL,"OSQLParseTreeIterator: Fehler im Parse Tree");
|
|
|
|
OSL_ENSHURE(SQL_ISRULE(pTableExp,table_exp),"OSQLParseTreeIterator: Fehler im Parse Tree");
|
|
|
|
OSL_ENSHURE(pTableExp->count() == 5,"OSQLParseTreeIterator: Fehler im Parse Tree");
|
2000-09-18 15:18:56 +00:00
|
|
|
|
|
|
|
pWhereClause = pTableExp->getChild(1);
|
|
|
|
} else if (SQL_ISRULE(pSelectNode,update_statement_searched)) {
|
2000-10-19 10:47:14 +00:00
|
|
|
OSL_ENSHURE(pSelectNode->count() == 5,"OSQLParseTreeIterator: Fehler im Parse Tree");
|
2000-09-18 15:18:56 +00:00
|
|
|
pWhereClause = pSelectNode->getChild(4);
|
|
|
|
} else if (SQL_ISRULE(pSelectNode,update_statement_positioned)) {
|
|
|
|
// nyi
|
2000-10-19 10:47:14 +00:00
|
|
|
OSL_ASSERT("OSQLParseTreeIterator::getSelectionCriteria: positioned nyi");
|
2000-09-18 15:18:56 +00:00
|
|
|
} else if (SQL_ISRULE(pSelectNode,delete_statement_searched)) {
|
2000-10-19 10:47:14 +00:00
|
|
|
OSL_ENSHURE(pSelectNode->count() == 4,"OSQLParseTreeIterator: Fehler im Parse Tree");
|
2000-09-18 15:18:56 +00:00
|
|
|
pWhereClause = pSelectNode->getChild(3);
|
|
|
|
} else if (SQL_ISRULE(pSelectNode,delete_statement_positioned)) {
|
|
|
|
// nyi
|
2000-10-19 10:47:14 +00:00
|
|
|
OSL_ASSERT("OSQLParseTreeIterator::getSelectionCriteria: positioned nyi");
|
2000-09-18 15:18:56 +00:00
|
|
|
} else {
|
|
|
|
// Anderes Statement. Keine Selektionskriterien.
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (! SQL_ISRULE(pWhereClause,where_clause)) {
|
|
|
|
// Die Where Clause ist meistens optional, d. h. es koennte sich auch
|
|
|
|
// um "optional_where_clause" handeln.
|
2000-10-19 10:47:14 +00:00
|
|
|
OSL_ENSHURE(SQL_ISRULE(pWhereClause,opt_where_clause),"OSQLParseTreeIterator: Fehler im Parse Tree");
|
2000-09-18 15:18:56 +00:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Wenn es aber eine where_clause ist, dann darf sie nicht leer sein:
|
2000-10-19 10:47:14 +00:00
|
|
|
OSL_ENSHURE(pWhereClause->count() == 2,"OSQLParseTreeIterator: Fehler im Parse Tree");
|
2000-09-18 15:18:56 +00:00
|
|
|
|
|
|
|
OSQLParseNode * pComparisonPredicate = pWhereClause->getChild(1);
|
2000-10-19 10:47:14 +00:00
|
|
|
OSL_ENSHURE(pComparisonPredicate != NULL,"OSQLParseTreeIterator: Fehler im Parse Tree");
|
2000-09-18 15:18:56 +00:00
|
|
|
|
|
|
|
|
|
|
|
//
|
|
|
|
// Und nun die Vergleichskriterien abarbeiten (rekursiv, alles ist erstmal ein OR-Kriterium):
|
|
|
|
//
|
|
|
|
setORCriteriaPre();
|
|
|
|
// if (! aIteratorStatus.IsSuccessful()) return;
|
|
|
|
|
|
|
|
traverseORCriteria(pComparisonPredicate);
|
|
|
|
// if (! aIteratorStatus.IsSuccessful()) return;
|
|
|
|
|
|
|
|
setORCriteriaPost();
|
|
|
|
|
|
|
|
// Fehler wird ggf. einfach weitergereicht.
|
|
|
|
}
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
void OSQLParseTreeIterator::traverseORCriteria(OSQLParseNode * pSearchCondition)
|
|
|
|
{
|
2000-10-19 10:47:14 +00:00
|
|
|
|
2000-09-18 15:18:56 +00:00
|
|
|
|
|
|
|
if (
|
|
|
|
pSearchCondition->count() == 3 &&
|
|
|
|
SQL_ISPUNCTUATION(pSearchCondition->getChild(0),"(") &&
|
|
|
|
SQL_ISPUNCTUATION(pSearchCondition->getChild(2),")")
|
|
|
|
)
|
|
|
|
{
|
|
|
|
// Runde Klammern um den Ausdruck
|
|
|
|
traverseORCriteria(pSearchCondition->getChild(1));
|
|
|
|
} else if (SQL_ISRULE(pSearchCondition,search_condition) &&
|
|
|
|
pSearchCondition->count() == 3 &&
|
|
|
|
SQL_ISTOKEN(pSearchCondition->getChild(1),OR))
|
|
|
|
{
|
|
|
|
// OR-Verknuepfung:
|
|
|
|
|
|
|
|
for (int i = 0; i < 3; i++) {
|
|
|
|
if (i == 1) continue; // Schluesselwort OR ueberspringen
|
|
|
|
|
|
|
|
// Ist das erste Element wieder eine OR-Verknuepfung?
|
|
|
|
if (i == 0 &&
|
|
|
|
SQL_ISRULE(pSearchCondition->getChild(0),search_condition) &&
|
|
|
|
pSearchCondition->getChild(0)->count() == 3 &&
|
|
|
|
SQL_ISTOKEN(pSearchCondition->getChild(0)->getChild(1),OR))
|
|
|
|
{
|
|
|
|
// Dann rekursiv absteigen ...
|
|
|
|
traverseORCriteria(pSearchCondition->getChild(0));
|
|
|
|
|
|
|
|
} else {
|
|
|
|
// AND-Kriterien ...
|
|
|
|
setANDCriteriaPre();
|
|
|
|
// if (! aIteratorStatus.IsSuccessful()) break;
|
|
|
|
|
|
|
|
traverseANDCriteria(pSearchCondition->getChild(i));
|
|
|
|
// if (! aIteratorStatus.IsSuccessful()) break;
|
|
|
|
|
|
|
|
setANDCriteriaPost();
|
|
|
|
}
|
|
|
|
|
|
|
|
// if (! aIteratorStatus.IsSuccessful()) break;
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
// Nur *ein* Kriterium oder eine AND-Verknuepfung von Kriterien.
|
|
|
|
// Direkt die AND-Kriterien behandeln.
|
|
|
|
setANDCriteriaPre();
|
|
|
|
// if (! aIteratorStatus.IsSuccessful()) return;
|
|
|
|
|
|
|
|
traverseANDCriteria(pSearchCondition);
|
|
|
|
// if (! aIteratorStatus.IsSuccessful()) return;
|
|
|
|
|
|
|
|
setANDCriteriaPost();
|
|
|
|
}
|
|
|
|
|
|
|
|
// Fehler einfach weiterreichen.
|
|
|
|
}
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
void OSQLParseTreeIterator::traverseANDCriteria(OSQLParseNode * pSearchCondition)
|
|
|
|
{
|
2000-10-19 10:47:14 +00:00
|
|
|
|
2000-09-18 15:18:56 +00:00
|
|
|
|
|
|
|
if (
|
|
|
|
SQL_ISRULE(pSearchCondition,boolean_primary) &&
|
|
|
|
pSearchCondition->count() == 3 &&
|
|
|
|
SQL_ISPUNCTUATION(pSearchCondition->getChild(0),"(") &&
|
|
|
|
SQL_ISPUNCTUATION(pSearchCondition->getChild(2),")")
|
|
|
|
)
|
|
|
|
{
|
|
|
|
// Runde Klammern
|
|
|
|
traverseANDCriteria(pSearchCondition->getChild(1));
|
|
|
|
}
|
|
|
|
// Das erste Element ist eine OR-Verknuepfung
|
|
|
|
else if ( SQL_ISRULE(pSearchCondition,search_condition) && pSearchCondition->count() == 3 )
|
|
|
|
{
|
|
|
|
// Dann rekursiv absteigen (dieselbe Row benutzen) ...
|
|
|
|
traverseORCriteria(pSearchCondition->getChild(0));
|
|
|
|
// if (! aIteratorStatus.IsSuccessful())
|
|
|
|
// return;
|
|
|
|
|
|
|
|
// Und mit dem rechten Child weitermachen:
|
|
|
|
traverseANDCriteria(pSearchCondition->getChild(2));
|
|
|
|
}
|
|
|
|
// Das erste Element ist (wieder) eine AND-Verknuepfung
|
|
|
|
else if ( SQL_ISRULE(pSearchCondition,boolean_term) && pSearchCondition->count() == 3 )
|
|
|
|
{
|
|
|
|
// Dann rekursiv absteigen (dieselbe Row benutzen) ...
|
|
|
|
traverseANDCriteria(pSearchCondition->getChild(0));
|
|
|
|
// if (! aIteratorStatus.IsSuccessful())
|
|
|
|
// return;
|
|
|
|
|
|
|
|
// Und mit dem rechten Child weitermachen:
|
|
|
|
traverseANDCriteria(pSearchCondition->getChild(2));
|
|
|
|
}
|
|
|
|
// Sonst einzelne Suchkriterien wie =, !=, ..., LIKE, IS NULL usw. behandeln:
|
|
|
|
else if (SQL_ISRULE(pSearchCondition,comparison_predicate) )
|
|
|
|
{
|
|
|
|
OSQLPredicateType ePredicateType;
|
|
|
|
OSQLParseNode *pPrec = pSearchCondition->getChild(1);
|
|
|
|
if (pPrec->getNodeType() == SQL_NODE_EQUAL)
|
|
|
|
ePredicateType = SQL_PRED_EQUAL;
|
|
|
|
else if (pPrec->getNodeType() == SQL_NODE_NOTEQUAL)
|
|
|
|
ePredicateType = SQL_PRED_NOTEQUAL;
|
|
|
|
else if (pPrec->getNodeType() == SQL_NODE_LESS)
|
|
|
|
ePredicateType = SQL_PRED_LESS;
|
|
|
|
else if (pPrec->getNodeType() == SQL_NODE_LESSEQ)
|
|
|
|
ePredicateType = SQL_PRED_LESSOREQUAL;
|
|
|
|
else if (pPrec->getNodeType() == SQL_NODE_GREATEQ)
|
|
|
|
ePredicateType = SQL_PRED_GREATEROREQUAL;
|
|
|
|
else if (pPrec->getNodeType() == SQL_NODE_GREAT)
|
|
|
|
ePredicateType = SQL_PRED_GREATER;
|
|
|
|
|
2000-10-19 10:47:14 +00:00
|
|
|
::rtl::OUString aValue;
|
|
|
|
pSearchCondition->getChild(2)->parseNodeToStr(aValue,m_xDatabaseMetaData,NULL,sal_False,sal_False);
|
|
|
|
traverseOnePredicate(pSearchCondition->getChild(0),ePredicateType,aValue,sal_False,pSearchCondition->getChild(2));
|
2000-09-18 15:18:56 +00:00
|
|
|
// if (! aIteratorStatus.IsSuccessful())
|
|
|
|
// return;
|
|
|
|
}
|
|
|
|
else if (SQL_ISRULE(pSearchCondition,like_predicate) /*&& SQL_ISRULE(pSearchCondition->getChild(0),column_ref)*/)
|
|
|
|
{
|
|
|
|
OSQLPredicateType ePredicateType;
|
|
|
|
|
2000-10-19 10:47:14 +00:00
|
|
|
OSL_ENSHURE(pSearchCondition->count() >= 4,"OSQLParseTreeIterator: Fehler im Parse Tree");
|
2000-09-18 15:18:56 +00:00
|
|
|
|
2000-09-29 14:13:06 +00:00
|
|
|
sal_Int32 nCurentPos = pSearchCondition->count()-2;
|
|
|
|
|
|
|
|
OSQLParseNode * pNum_value_exp = pSearchCondition->getChild(nCurentPos);
|
|
|
|
OSQLParseNode * pOptEscape = pSearchCondition->getChild(nCurentPos+1);
|
2000-09-18 15:18:56 +00:00
|
|
|
|
|
|
|
if (pSearchCondition->getChild(1)->getTokenID() == SQL_TOKEN_NOT)
|
|
|
|
ePredicateType = SQL_PRED_NOTLIKE;
|
|
|
|
else
|
|
|
|
ePredicateType = SQL_PRED_LIKE;
|
|
|
|
|
2000-10-19 10:47:14 +00:00
|
|
|
OSL_ENSHURE(pNum_value_exp != NULL,"OSQLParseTreeIterator: Fehler im Parse Tree");
|
|
|
|
OSL_ENSHURE(pOptEscape != NULL,"OSQLParseTreeIterator: Fehler im Parse Tree");
|
2000-09-18 15:18:56 +00:00
|
|
|
|
|
|
|
if (pOptEscape->count() != 0)
|
|
|
|
{
|
|
|
|
// aIteratorStatus.setStatementTooComplex();
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2000-10-19 10:47:14 +00:00
|
|
|
::rtl::OUString aValue;
|
2000-09-18 15:18:56 +00:00
|
|
|
OSQLParseNode * pParam = NULL;
|
|
|
|
if (SQL_ISRULE(pNum_value_exp,parameter))
|
|
|
|
pParam = pNum_value_exp;
|
|
|
|
else if(pNum_value_exp->isToken())
|
|
|
|
// Normaler Wert
|
|
|
|
aValue = pNum_value_exp->getTokenValue();
|
|
|
|
else
|
|
|
|
{
|
2000-10-19 10:47:14 +00:00
|
|
|
pNum_value_exp->parseNodeToStr(aValue,m_xDatabaseMetaData,NULL,sal_False,sal_False);
|
2000-09-18 15:18:56 +00:00
|
|
|
pParam = pNum_value_exp;
|
|
|
|
}
|
|
|
|
|
2000-10-19 10:47:14 +00:00
|
|
|
traverseOnePredicate(pSearchCondition->getChild(0),ePredicateType,aValue,sal_False,pParam);
|
2000-09-18 15:18:56 +00:00
|
|
|
// if (! aIteratorStatus.IsSuccessful())
|
|
|
|
// return;
|
|
|
|
}
|
|
|
|
else if (SQL_ISRULE(pSearchCondition,test_for_null) /*&& SQL_ISRULE(pSearchCondition->getChild(0),column_ref)*/)
|
|
|
|
{
|
|
|
|
OSQLPredicateType ePredicateType;
|
|
|
|
|
2000-10-19 10:47:14 +00:00
|
|
|
OSL_ENSHURE(pSearchCondition->count() >= 3,"OSQLParseTreeIterator: Fehler im Parse Tree");
|
|
|
|
OSL_ENSHURE(SQL_ISTOKEN(pSearchCondition->getChild(1),IS),"OSQLParseTreeIterator: Fehler im Parse Tree");
|
2000-09-18 15:18:56 +00:00
|
|
|
|
|
|
|
if (SQL_ISTOKEN(pSearchCondition->getChild(2),NOT) )
|
|
|
|
ePredicateType = SQL_PRED_ISNOTNULL;
|
|
|
|
else
|
|
|
|
ePredicateType = SQL_PRED_ISNULL;
|
|
|
|
|
2000-10-19 10:47:14 +00:00
|
|
|
::rtl::OUString aString;
|
|
|
|
traverseOnePredicate(pSearchCondition->getChild(0),ePredicateType,aString,sal_True,NULL);
|
2000-09-18 15:18:56 +00:00
|
|
|
// if (! aIteratorStatus.IsSuccessful()) return;
|
|
|
|
} else {
|
|
|
|
// Etwas anderes unterstuetzen wir (noch) nicht. Basta!
|
|
|
|
// aIteratorStatus.setStatementTooComplex();
|
|
|
|
}
|
|
|
|
// Fehler einfach weiterreichen.
|
|
|
|
}
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
void OSQLParseTreeIterator::traverseOnePredicate(
|
|
|
|
OSQLParseNode * pColumnRef,
|
|
|
|
OSQLPredicateType ePredicateType,
|
2000-10-19 10:47:14 +00:00
|
|
|
::rtl::OUString& rValue,
|
|
|
|
sal_Bool bCompareNull,
|
2000-09-18 15:18:56 +00:00
|
|
|
OSQLParseNode * pParseNode)
|
|
|
|
{
|
2000-10-19 10:47:14 +00:00
|
|
|
|
2000-09-18 15:18:56 +00:00
|
|
|
|
|
|
|
// Column-Name (und TableRange):
|
2000-10-19 10:47:14 +00:00
|
|
|
::rtl::OUString aColumnName;
|
|
|
|
::rtl::OUString aTableRange;
|
2000-09-18 15:18:56 +00:00
|
|
|
getColumnRange(pColumnRef,aColumnName,aTableRange);
|
|
|
|
|
2000-10-19 10:47:14 +00:00
|
|
|
::rtl::OUString aName;
|
2000-09-18 15:18:56 +00:00
|
|
|
if (pParseNode) //event. Parameter, oder Columnref oder
|
|
|
|
{
|
|
|
|
if (SQL_ISRULE(pParseNode,parameter))
|
|
|
|
{
|
2000-10-19 10:47:14 +00:00
|
|
|
OSL_ENSHURE(pParseNode->count() > 0,"OSQLParseTreeIterator: Fehler im Parse Tree");
|
2000-09-18 15:18:56 +00:00
|
|
|
OSQLParseNode * pMark = pParseNode->getChild(0);
|
|
|
|
|
2000-10-19 10:47:14 +00:00
|
|
|
::rtl::OUString aParameterName;
|
2000-09-18 15:18:56 +00:00
|
|
|
if (SQL_ISPUNCTUATION(pMark,"?"))
|
|
|
|
{
|
|
|
|
// Name = "?", da kein Parametername verfuegbar (z. B. bei Native SQL)
|
2000-10-19 10:47:14 +00:00
|
|
|
rValue = ::rtl::OUString::createFromAscii("?");
|
2001-03-01 10:02:19 +00:00
|
|
|
rValue = aColumnName;
|
2000-10-19 10:47:14 +00:00
|
|
|
aName = ::rtl::OUString::createFromAscii("?");
|
2000-09-18 15:18:56 +00:00
|
|
|
}
|
|
|
|
else if (SQL_ISPUNCTUATION(pMark,":"))
|
|
|
|
{
|
|
|
|
rValue = pParseNode->getChild(1)->getTokenValue();
|
2000-10-19 10:47:14 +00:00
|
|
|
aName = ::rtl::OUString::createFromAscii(":");
|
2000-09-18 15:18:56 +00:00
|
|
|
}
|
|
|
|
else if (SQL_ISPUNCTUATION(pMark,"["))
|
|
|
|
{
|
|
|
|
rValue = pParseNode->getChild(1)->getTokenValue();
|
2000-10-19 10:47:14 +00:00
|
|
|
aName = ::rtl::OUString::createFromAscii("[");
|
2000-09-18 15:18:56 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2000-10-19 10:47:14 +00:00
|
|
|
OSL_ASSERT("OSQLParseTreeIterator: Fehler im Parse Tree");
|
2000-09-18 15:18:56 +00:00
|
|
|
}
|
2001-03-01 10:02:19 +00:00
|
|
|
// found a parameter
|
|
|
|
OSQLColumns::const_iterator aIter = ::connectivity::find(m_aSelectColumns->begin(),m_aSelectColumns->end(),aColumnName,m_aCaseEqual);
|
|
|
|
if(aIter != m_aSelectColumns->end())
|
|
|
|
{
|
|
|
|
OParseColumn* pNewColumn = new OParseColumn(*aIter,m_aCaseEqual.isCaseSensitive());
|
|
|
|
pNewColumn->setName(rValue);
|
2001-03-13 07:24:04 +00:00
|
|
|
pNewColumn->setRealName(rValue);
|
2001-03-01 10:02:19 +00:00
|
|
|
m_aParameters->push_back(pNewColumn);
|
|
|
|
}
|
|
|
|
else // search in the tables for the right one
|
|
|
|
{
|
|
|
|
OSQLTables::const_iterator aTableIter = m_aTables.end();
|
|
|
|
if(aTableRange.getLength())
|
|
|
|
aTableIter = m_aTables.find(aTableRange);
|
|
|
|
if(aTableIter == m_aTables.end())
|
|
|
|
aTableIter = m_aTables.begin();
|
|
|
|
|
|
|
|
for(;aTableIter != m_aTables.end();++aTableIter)
|
|
|
|
{
|
|
|
|
if(aTableIter->second.is())
|
|
|
|
{
|
|
|
|
Reference<XNameAccess> xColumns = aTableIter->second->getColumns();
|
|
|
|
if(xColumns.is() && xColumns->hasByName(aColumnName))
|
|
|
|
{
|
|
|
|
Reference<XPropertySet> xColumn;
|
|
|
|
xColumns->getByName(aColumnName) >>= xColumn;
|
|
|
|
OParseColumn* pNewColumn = new OParseColumn(xColumn,m_aCaseEqual.isCaseSensitive());
|
|
|
|
pNewColumn->setName(rValue);
|
2001-03-13 07:24:04 +00:00
|
|
|
pNewColumn->setRealName(rValue);
|
2001-03-01 10:02:19 +00:00
|
|
|
m_aParameters->push_back(pNewColumn);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2000-09-18 15:18:56 +00:00
|
|
|
}
|
|
|
|
else if (SQL_ISRULE(pParseNode,column_ref))// Column-Name (und TableRange):
|
|
|
|
getColumnRange(pParseNode,aName,rValue);
|
|
|
|
}
|
|
|
|
|
|
|
|
// "set"-Routine aufrufen ...
|
|
|
|
if (bCompareNull) {
|
|
|
|
// nyi: was soll das? Vergleich auf NULL geht nur ueber IS NULL oder IS NOT NULL!
|
2000-10-19 10:47:14 +00:00
|
|
|
setPredicate(aColumnName, aTableRange,ePredicateType, ::rtl::OUString(), ::rtl::OUString());
|
2000-09-18 15:18:56 +00:00
|
|
|
} else {
|
|
|
|
setPredicate(aColumnName, aTableRange, ePredicateType, rValue, aName);
|
|
|
|
}
|
|
|
|
|
|
|
|
// Fehler einfach weiterreichen ...
|
|
|
|
}
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
void OSQLParseTreeIterator::traverseAssignments()
|
|
|
|
{
|
|
|
|
|
2000-10-19 10:47:14 +00:00
|
|
|
|
|
|
|
OSL_ASSERT("OSQLParseTreeIterator::traverseAssignments: noch nicht implementiert");
|
2000-09-18 15:18:56 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
void OSQLParseTreeIterator::traverseAll()
|
|
|
|
{
|
2000-10-19 10:47:14 +00:00
|
|
|
|
2000-09-18 15:18:56 +00:00
|
|
|
|
|
|
|
traverseTableNames();
|
|
|
|
// if (! aIteratorStatus.IsSuccessful()) return;
|
|
|
|
|
|
|
|
if (m_eStatementType == SQL_STATEMENT_SELECT)
|
|
|
|
{
|
|
|
|
const OSQLParseNode* pSelectNode = m_pParseTree;
|
|
|
|
traverseSelectColumnNames(pSelectNode);
|
|
|
|
// if (! aIteratorStatus.IsSuccessful())
|
|
|
|
// return;
|
|
|
|
traverseOrderByColumnNames(pSelectNode);
|
|
|
|
// if (! aIteratorStatus.IsSuccessful())
|
|
|
|
// return;
|
|
|
|
traverseSelectionCriteria(pSelectNode);
|
|
|
|
// if (! aIteratorStatus.IsSuccessful())
|
|
|
|
// return;
|
|
|
|
}
|
|
|
|
else if (m_eStatementType == SQL_STATEMENT_INSERT || m_eStatementType == SQL_STATEMENT_UPDATE)
|
|
|
|
{
|
|
|
|
traverseAssignments();
|
|
|
|
// if (! aIteratorStatus.IsSuccessful())
|
|
|
|
// return;
|
|
|
|
} else if (m_eStatementType == SQL_STATEMENT_INSERT) {
|
|
|
|
// schon alles erledigt
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Dummy-Implementationen:
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
2000-10-19 10:47:14 +00:00
|
|
|
void OSQLParseTreeIterator::setTableName(const ::rtl::OUString & rTableName, const ::rtl::OUString & rDBName, const ::rtl::OUString& rOwner,
|
|
|
|
const ::rtl::OUString & rTableRange)
|
2000-09-18 15:18:56 +00:00
|
|
|
{
|
2000-10-19 10:47:14 +00:00
|
|
|
|
2000-09-18 15:18:56 +00:00
|
|
|
// nichts zu tun ...
|
|
|
|
|
|
|
|
#ifdef SQL_TEST_PARSETREEITERATOR
|
|
|
|
cout << "OSQLParseTreeIterator::setTableName"
|
|
|
|
<< (const char *) rTableName << ", "
|
|
|
|
<< (const char *) rSchemaName << ", "
|
|
|
|
<< (const char *) rTableRange
|
|
|
|
<< "\n";
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
2001-02-01 12:10:17 +00:00
|
|
|
void OSQLParseTreeIterator::appendColumns(const ::rtl::OUString& _rTableAlias,const OSQLTable& _rTable)
|
2000-09-18 15:18:56 +00:00
|
|
|
{
|
2000-10-19 10:47:14 +00:00
|
|
|
|
2000-09-18 15:18:56 +00:00
|
|
|
if (!_rTable.is())
|
|
|
|
return;
|
|
|
|
|
|
|
|
Reference<XNameAccess> xColumns = _rTable->getColumns();
|
|
|
|
|
|
|
|
Sequence< ::rtl::OUString > aColNames = xColumns->getElementNames();
|
|
|
|
const ::rtl::OUString* pBegin = aColNames.getConstArray();
|
|
|
|
const ::rtl::OUString* pEnd = pBegin + aColNames.getLength();
|
|
|
|
|
|
|
|
for(;pBegin != pEnd;++pBegin)
|
|
|
|
{
|
2001-02-01 12:10:17 +00:00
|
|
|
|
|
|
|
::rtl::OUString aName(getUniqueColumnName(*pBegin));
|
2000-10-30 06:47:10 +00:00
|
|
|
Reference< XPropertySet > xColumn;
|
2001-01-04 09:59:52 +00:00
|
|
|
if(xColumns->hasByName(*pBegin) && (xColumns->getByName(*pBegin) >>= xColumn) && xColumn.is())
|
2000-09-18 15:18:56 +00:00
|
|
|
{
|
2001-02-01 12:10:17 +00:00
|
|
|
OParseColumn* pColumn = new OParseColumn(aName
|
|
|
|
, getString(xColumn->getPropertyValue(PROPERTY_TYPENAME))
|
|
|
|
, getString(xColumn->getPropertyValue(PROPERTY_DEFAULTVALUE))
|
|
|
|
, getINT32(xColumn->getPropertyValue(PROPERTY_ISNULLABLE))
|
|
|
|
, getINT32(xColumn->getPropertyValue(PROPERTY_PRECISION))
|
|
|
|
, getINT32(xColumn->getPropertyValue(PROPERTY_SCALE))
|
|
|
|
, getINT32(xColumn->getPropertyValue(PROPERTY_TYPE))
|
|
|
|
, getBOOL(xColumn->getPropertyValue(PROPERTY_ISAUTOINCREMENT))
|
|
|
|
, getBOOL(xColumn->getPropertyValue(PROPERTY_ISCURRENCY))
|
|
|
|
, m_xDatabaseMetaData->storesMixedCaseQuotedIdentifiers());
|
|
|
|
|
|
|
|
pColumn->setTableName(_rTableAlias);
|
|
|
|
pColumn->setRealName(*pBegin);
|
2000-10-30 06:47:10 +00:00
|
|
|
Reference< XPropertySet> xCol = pColumn;
|
2000-09-18 15:18:56 +00:00
|
|
|
m_aSelectColumns->push_back(xCol);
|
|
|
|
}
|
2001-02-23 13:54:11 +00:00
|
|
|
else if(m_pParser)
|
|
|
|
{
|
|
|
|
::rtl::OUString sErrMsg = m_pParser->getContext().getErrorMessage(OParseContext::ERROR_INVALID_COLUMN);
|
|
|
|
sErrMsg = sErrMsg.replaceAt(sErrMsg.indexOf('#'),1,*pBegin);
|
|
|
|
sErrMsg = sErrMsg.replaceAt(sErrMsg.indexOf('#'),1,_rTableAlias);
|
|
|
|
appendWarning(sErrMsg);
|
|
|
|
}
|
|
|
|
|
2000-09-18 15:18:56 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
2000-10-19 10:47:14 +00:00
|
|
|
void OSQLParseTreeIterator::setSelectColumnName(const ::rtl::OUString & rColumnName,const ::rtl::OUString & rColumnAlias, const ::rtl::OUString & rTableRange,sal_Bool bFkt)
|
2000-09-18 15:18:56 +00:00
|
|
|
{
|
2000-10-19 10:47:14 +00:00
|
|
|
|
|
|
|
if(rColumnName.toChar() == '*' && !rTableRange.getLength())
|
2000-09-18 15:18:56 +00:00
|
|
|
{ // Suche "uber alle vorkommenden Tabellen
|
|
|
|
for(ConstOSQLTablesIterator aIter = m_aTables.begin(); aIter != m_aTables.end();++aIter)
|
2001-02-01 12:10:17 +00:00
|
|
|
appendColumns(aIter->first,aIter->second);
|
2000-09-18 15:18:56 +00:00
|
|
|
}
|
2000-10-19 10:47:14 +00:00
|
|
|
else if(rColumnName.toChar() == '*' && rTableRange.getLength()) // alle Columns aus dieser Tabelle
|
2000-09-18 15:18:56 +00:00
|
|
|
{
|
|
|
|
ConstOSQLTablesIterator aFind = m_aTables.find(rTableRange);
|
|
|
|
|
|
|
|
if(aFind == m_aTables.end())
|
|
|
|
{
|
2000-10-19 10:47:14 +00:00
|
|
|
::rtl::OUString strExpression = rTableRange;
|
|
|
|
strExpression += ::rtl::OUString::createFromAscii(".");
|
2000-09-18 15:18:56 +00:00
|
|
|
strExpression += rColumnName;
|
|
|
|
}
|
|
|
|
else
|
2001-02-01 12:10:17 +00:00
|
|
|
appendColumns(rTableRange,aFind->second);
|
2000-09-18 15:18:56 +00:00
|
|
|
}
|
2000-10-19 10:47:14 +00:00
|
|
|
else if(!rTableRange.getLength())// ein Columnname existiert
|
2000-09-18 15:18:56 +00:00
|
|
|
{
|
|
|
|
if(!bFkt)
|
|
|
|
{
|
|
|
|
|
2000-10-19 10:47:14 +00:00
|
|
|
sal_uInt32 ncount = m_aSelectColumns->size();
|
2000-09-18 15:18:56 +00:00
|
|
|
for(OSQLTablesIterator aIter = m_aTables.begin(); aIter != m_aTables.end(); ++aIter)
|
|
|
|
{
|
|
|
|
if (aIter->second.is())
|
|
|
|
{
|
|
|
|
Reference<XNameAccess> xColumns = aIter->second->getColumns();
|
|
|
|
|
2000-10-30 06:47:10 +00:00
|
|
|
Reference< XPropertySet > xColumn;
|
2001-01-04 09:59:52 +00:00
|
|
|
if(xColumns->hasByName(rColumnName) && (xColumns->getByName(rColumnName) >>= xColumn))
|
2000-09-18 15:18:56 +00:00
|
|
|
{
|
2001-01-04 09:59:52 +00:00
|
|
|
OSL_ENSURE(xColumn.is(),"Column isn't a propertyset!");
|
2000-10-19 10:47:14 +00:00
|
|
|
::rtl::OUString aNewColName(getUniqueColumnName(rColumnAlias));
|
2000-09-18 15:18:56 +00:00
|
|
|
|
|
|
|
OParseColumn* pColumn = new OParseColumn(xColumn,m_xDatabaseMetaData->storesMixedCaseQuotedIdentifiers());
|
|
|
|
pColumn->setTableName(aIter->first);
|
|
|
|
pColumn->setName(aNewColName);
|
|
|
|
pColumn->setRealName(rColumnName);
|
|
|
|
|
2000-10-30 06:47:10 +00:00
|
|
|
Reference< XPropertySet> xCol = pColumn;
|
2000-09-18 15:18:56 +00:00
|
|
|
m_aSelectColumns->push_back(xCol);
|
|
|
|
continue; // diese Column darf nur einmal vorkommen
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (ncount == m_aSelectColumns->size())
|
|
|
|
{
|
2000-10-19 10:47:14 +00:00
|
|
|
::rtl::OUString strExpression = rTableRange;
|
|
|
|
if (strExpression.getLength())
|
|
|
|
strExpression += ::rtl::OUString::createFromAscii(".");
|
2000-09-18 15:18:56 +00:00
|
|
|
strExpression += rColumnName;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2000-10-19 10:47:14 +00:00
|
|
|
::rtl::OUString aNewColName(getUniqueColumnName(rColumnAlias));
|
2000-09-18 15:18:56 +00:00
|
|
|
|
|
|
|
OParseColumn* pColumn = new OParseColumn(aNewColName,::rtl::OUString(),::rtl::OUString(),
|
|
|
|
ColumnValue::NULLABLE_UNKNOWN,0,0,DataType::VARCHAR,sal_False,sal_False,m_xDatabaseMetaData->storesMixedCaseQuotedIdentifiers());
|
|
|
|
pColumn->setFunction(bFkt);
|
|
|
|
pColumn->setRealName(rColumnName);
|
|
|
|
|
2000-10-30 06:47:10 +00:00
|
|
|
Reference< XPropertySet> xCol = pColumn;
|
2000-09-18 15:18:56 +00:00
|
|
|
m_aSelectColumns->push_back(xCol);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else // ColumnName und Tablename vorhanden
|
|
|
|
{
|
|
|
|
ConstOSQLTablesIterator aFind = m_aTables.find(rTableRange);
|
|
|
|
|
2000-10-19 10:47:14 +00:00
|
|
|
sal_Bool bError = sal_False;
|
2001-02-01 12:10:17 +00:00
|
|
|
if (aFind != m_aTables.end() && aFind->second.is())
|
2000-09-18 15:18:56 +00:00
|
|
|
{
|
|
|
|
|
|
|
|
if (bFkt)
|
|
|
|
{
|
2000-10-19 10:47:14 +00:00
|
|
|
::rtl::OUString aNewColName(getUniqueColumnName(rColumnAlias));
|
2000-09-18 15:18:56 +00:00
|
|
|
|
|
|
|
OParseColumn* pColumn = new OParseColumn(aNewColName,::rtl::OUString(),::rtl::OUString(),
|
|
|
|
ColumnValue::NULLABLE_UNKNOWN,0,0,DataType::VARCHAR,sal_False,sal_False,m_xDatabaseMetaData->storesMixedCaseQuotedIdentifiers());
|
|
|
|
pColumn->setFunction(sal_True);
|
|
|
|
pColumn->setRealName(rColumnName);
|
|
|
|
pColumn->setTableName(aFind->first);
|
|
|
|
|
2000-10-30 06:47:10 +00:00
|
|
|
Reference< XPropertySet> xCol = pColumn;
|
2000-09-18 15:18:56 +00:00
|
|
|
m_aSelectColumns->push_back(xCol);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2000-10-30 06:47:10 +00:00
|
|
|
Reference< XPropertySet > xColumn;
|
2001-01-04 09:59:52 +00:00
|
|
|
if (aFind->second->getColumns()->hasByName(rColumnName) && (aFind->second->getColumns()->getByName(rColumnName) >>= xColumn))
|
2000-09-18 15:18:56 +00:00
|
|
|
{
|
2000-10-19 10:47:14 +00:00
|
|
|
::rtl::OUString aNewColName(getUniqueColumnName(rColumnAlias));
|
2000-09-18 15:18:56 +00:00
|
|
|
|
|
|
|
OParseColumn* pColumn = new OParseColumn(xColumn,m_xDatabaseMetaData->storesMixedCaseQuotedIdentifiers());
|
|
|
|
pColumn->setName(aNewColName);
|
|
|
|
pColumn->setRealName(rColumnName);
|
|
|
|
pColumn->setTableName(aFind->first);
|
|
|
|
|
2000-10-30 06:47:10 +00:00
|
|
|
Reference< XPropertySet> xCol = pColumn;
|
2000-09-18 15:18:56 +00:00
|
|
|
m_aSelectColumns->push_back(xCol);
|
|
|
|
}
|
|
|
|
else
|
2000-10-19 10:47:14 +00:00
|
|
|
bError = sal_True;
|
2000-09-18 15:18:56 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
2000-10-19 10:47:14 +00:00
|
|
|
bError = sal_True;
|
2000-09-18 15:18:56 +00:00
|
|
|
|
|
|
|
// Tabelle existiert nicht oder Feld nicht vorhanden
|
|
|
|
if (bError)
|
|
|
|
{
|
2000-10-19 10:47:14 +00:00
|
|
|
::rtl::OUString strExpression = rTableRange;
|
|
|
|
if (strExpression.getLength())
|
|
|
|
strExpression += ::rtl::OUString::createFromAscii(".");
|
2000-09-18 15:18:56 +00:00
|
|
|
strExpression += rColumnName;
|
|
|
|
|
2000-10-19 10:47:14 +00:00
|
|
|
::rtl::OUString aNewColName(getUniqueColumnName(rColumnAlias));
|
2000-09-18 15:18:56 +00:00
|
|
|
|
|
|
|
OParseColumn* pColumn = new OParseColumn(aNewColName,::rtl::OUString(),::rtl::OUString(),
|
|
|
|
ColumnValue::NULLABLE_UNKNOWN,0,0,DataType::VARCHAR,sal_False,sal_False,m_xDatabaseMetaData->storesMixedCaseQuotedIdentifiers());
|
|
|
|
pColumn->setFunction(sal_True);
|
|
|
|
|
|
|
|
|
2000-10-30 06:47:10 +00:00
|
|
|
Reference< XPropertySet> xCol = pColumn;
|
2000-09-18 15:18:56 +00:00
|
|
|
m_aSelectColumns->push_back(xCol);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
2000-10-19 10:47:14 +00:00
|
|
|
::rtl::OUString OSQLParseTreeIterator::getUniqueColumnName(const ::rtl::OUString & rColumnName) const
|
2000-09-18 15:18:56 +00:00
|
|
|
{
|
|
|
|
::rtl::OUString aAlias(rColumnName);
|
|
|
|
|
|
|
|
OSQLColumns::const_iterator aIter = find(m_aSelectColumns->begin(),m_aSelectColumns->end(),aAlias,m_aCaseEqual);
|
|
|
|
sal_Int32 i=1;
|
|
|
|
while(aIter != m_aSelectColumns->end())
|
|
|
|
{
|
|
|
|
(aAlias = rColumnName) += ::rtl::OUString::valueOf(i++);
|
|
|
|
aIter = find(m_aSelectColumns->begin(),m_aSelectColumns->end(),aAlias,m_aCaseEqual);
|
|
|
|
}
|
|
|
|
return aAlias;
|
|
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
2000-10-19 10:47:14 +00:00
|
|
|
void OSQLParseTreeIterator::setOrderByColumnName(const ::rtl::OUString & rColumnName, const ::rtl::OUString & rTableRange,sal_Bool bAscending)
|
2000-09-18 15:18:56 +00:00
|
|
|
{
|
2000-10-19 10:47:14 +00:00
|
|
|
|
2000-09-18 15:18:56 +00:00
|
|
|
// nichts zu tun ...
|
|
|
|
|
|
|
|
#ifdef SQL_TEST_PARSETREEITERATOR
|
|
|
|
cout << "OSQLParseTreeIterator::setOrderByColumnName: "
|
|
|
|
<< (const char *) rColumnName << ", "
|
|
|
|
<< (const char *) rTableRange << ", "
|
2000-10-19 10:47:14 +00:00
|
|
|
<< (bAscending ? "sal_True" : "sal_False")
|
2000-09-18 15:18:56 +00:00
|
|
|
<< "\n";
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
void OSQLParseTreeIterator::setORCriteriaPre()
|
|
|
|
{
|
2000-10-19 10:47:14 +00:00
|
|
|
|
2000-09-18 15:18:56 +00:00
|
|
|
// nichts zu tun ...
|
|
|
|
|
|
|
|
#ifdef SQL_TEST_PARSETREEITERATOR
|
|
|
|
cout << "OSQLParseTreeIterator::setORCriteriaPre\n";
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
void OSQLParseTreeIterator::setORCriteriaPost()
|
|
|
|
{
|
2000-10-19 10:47:14 +00:00
|
|
|
|
2000-09-18 15:18:56 +00:00
|
|
|
// nichts zu tun ...
|
|
|
|
|
|
|
|
#ifdef SQL_TEST_PARSETREEITERATOR
|
|
|
|
cout << "OSQLParseTreeIterator::setORCriteriaPost\n";
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
void OSQLParseTreeIterator::setANDCriteriaPre()
|
|
|
|
{
|
2000-10-19 10:47:14 +00:00
|
|
|
|
2000-09-18 15:18:56 +00:00
|
|
|
// nichts zu tun ...
|
|
|
|
|
|
|
|
#ifdef SQL_TEST_PARSETREEITERATOR
|
|
|
|
cout << "OSQLParseTreeIterator::setANDCriteriaPre\n";
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
void OSQLParseTreeIterator::setANDCriteriaPost()
|
|
|
|
{
|
2000-10-19 10:47:14 +00:00
|
|
|
|
2000-09-18 15:18:56 +00:00
|
|
|
// nichts zu tun ...
|
|
|
|
|
|
|
|
#ifdef SQL_TEST_PARSETREEITERATOR
|
|
|
|
cout << "OSQLParseTreeIterator::setANDCriteriaPost\n";
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
2000-10-19 10:47:14 +00:00
|
|
|
void OSQLParseTreeIterator::setPredicate(const ::rtl::OUString & rColumnName,
|
|
|
|
const ::rtl::OUString & rTableRange,
|
2000-09-18 15:18:56 +00:00
|
|
|
OSQLPredicateType ePredicateType,
|
2000-10-19 10:47:14 +00:00
|
|
|
const ::rtl::OUString & rValue,
|
|
|
|
const ::rtl::OUString & rParameterName)
|
2000-09-18 15:18:56 +00:00
|
|
|
{
|
2000-10-19 10:47:14 +00:00
|
|
|
|
2000-09-18 15:18:56 +00:00
|
|
|
// nichts zu tun ...
|
|
|
|
|
|
|
|
#ifdef SQL_TEST_PARSETREEITERATOR
|
|
|
|
cout << "OSQLParseTreeIterator::setPredicate: "
|
|
|
|
<< (const char *) rColumnName << ", "
|
|
|
|
<< (const char *) rTableRange << ", "
|
|
|
|
<< (char) ePredicateType << ", "
|
|
|
|
<< (const char *) rValue << ", "
|
|
|
|
<< (const char *) rParameterName
|
|
|
|
<< "\n";
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
2000-10-19 10:47:14 +00:00
|
|
|
void OSQLParseTreeIterator::setAssign(const ::rtl::OUString & rColumnName,
|
|
|
|
const ::rtl::OUString & rValue, sal_Bool bsetNull,
|
|
|
|
const ::rtl::OUString & rParameterName)
|
2000-09-18 15:18:56 +00:00
|
|
|
{
|
2000-10-19 10:47:14 +00:00
|
|
|
|
2000-09-18 15:18:56 +00:00
|
|
|
// nichts zu tun ...
|
|
|
|
|
|
|
|
#ifdef SQL_TEST_PARSETREEITERATOR
|
|
|
|
cout << "OSQLParseTreeIterator::setAssign: "
|
|
|
|
<< (const char *) rColumnName << ", "
|
|
|
|
<< (const char *) rValue << ", "
|
2000-10-19 10:47:14 +00:00
|
|
|
<< (bsetNull ? "sal_True" : "sal_False") << ", "
|
2000-09-18 15:18:56 +00:00
|
|
|
<< (const char *) rParameterName
|
|
|
|
<< "\n";
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
const OSQLParseNode* OSQLParseTreeIterator::getWhereTree() const
|
|
|
|
{
|
2000-10-19 10:47:14 +00:00
|
|
|
|
2000-09-18 15:18:56 +00:00
|
|
|
|
|
|
|
if (!m_pParseTree)
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
// Parse Tree analysieren (je nach Statement-Typ)
|
|
|
|
// und Zeiger auf WHERE-Klausel setzen:
|
|
|
|
OSQLParseNode * pWhereClause = NULL;
|
|
|
|
if(getStatementType() == SQL_STATEMENT_SELECT)
|
|
|
|
{
|
2000-10-19 10:47:14 +00:00
|
|
|
OSL_ENSHURE(m_pParseTree->count() >= 4,"ParseTreeIterator: Fehler im Parse Tree");
|
2000-09-18 15:18:56 +00:00
|
|
|
OSQLParseNode * pTableExp = m_pParseTree->getChild(3);
|
2000-10-19 10:47:14 +00:00
|
|
|
OSL_ENSHURE(pTableExp != NULL,"OSQLParseTreeIterator: Fehler im Parse Tree");
|
|
|
|
OSL_ENSHURE(SQL_ISRULE(pTableExp,table_exp),"OSQLParseTreeIterator: Fehler im Parse Tree");
|
|
|
|
OSL_ENSHURE(pTableExp->count() == 5,"OSQLParseTreeIterator: Fehler im Parse Tree");
|
2000-09-18 15:18:56 +00:00
|
|
|
|
|
|
|
pWhereClause = pTableExp->getChild(1);
|
|
|
|
}
|
|
|
|
else if (SQL_ISRULE(m_pParseTree,update_statement_searched) ||
|
|
|
|
SQL_ISRULE(m_pParseTree,delete_statement_searched))
|
|
|
|
{
|
|
|
|
pWhereClause = m_pParseTree->getChild(m_pParseTree->count()-1);
|
|
|
|
}
|
|
|
|
if(pWhereClause->count() != 2)
|
|
|
|
pWhereClause = NULL;
|
|
|
|
return pWhereClause;
|
|
|
|
}
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
const OSQLParseNode* OSQLParseTreeIterator::getOrderTree() const
|
|
|
|
{
|
2000-10-19 10:47:14 +00:00
|
|
|
|
2000-09-18 15:18:56 +00:00
|
|
|
|
|
|
|
if (!m_pParseTree || getStatementType() != SQL_STATEMENT_SELECT)
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
// Parse Tree analysieren (je nach Statement-Typ)
|
|
|
|
// und Zeiger auf ORDER-Klausel setzen:
|
|
|
|
OSQLParseNode * pOrderClause = NULL;
|
2000-10-19 10:47:14 +00:00
|
|
|
OSL_ENSHURE(m_pParseTree->count() >= 4,"ParseTreeIterator: Fehler im Parse Tree");
|
2000-09-18 15:18:56 +00:00
|
|
|
OSQLParseNode * pTableExp = m_pParseTree->getChild(3);
|
2000-10-19 10:47:14 +00:00
|
|
|
OSL_ENSHURE(pTableExp != NULL,"OSQLParseTreeIterator: Fehler im Parse Tree");
|
|
|
|
OSL_ENSHURE(SQL_ISRULE(pTableExp,table_exp),"OSQLParseTreeIterator: Fehler im Parse Tree");
|
|
|
|
OSL_ENSHURE(pTableExp->count() == 5,"OSQLParseTreeIterator: Fehler im Parse Tree");
|
2000-09-18 15:18:56 +00:00
|
|
|
|
|
|
|
pOrderClause = pTableExp->getChild(4);
|
|
|
|
// Wenn es aber eine order_by ist, dann darf sie nicht leer sein:
|
|
|
|
if(pOrderClause->count() != 3)
|
|
|
|
pOrderClause = NULL;
|
|
|
|
return pOrderClause;
|
|
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
const OSQLParseNode* OSQLParseTreeIterator::getGroupByTree() const
|
|
|
|
{
|
2000-10-19 10:47:14 +00:00
|
|
|
|
2000-09-18 15:18:56 +00:00
|
|
|
|
|
|
|
if (!m_pParseTree || getStatementType() != SQL_STATEMENT_SELECT)
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
// Parse Tree analysieren (je nach Statement-Typ)
|
|
|
|
// und Zeiger auf ORDER-Klausel setzen:
|
|
|
|
OSQLParseNode * pGroupClause = NULL;
|
2000-10-19 10:47:14 +00:00
|
|
|
OSL_ENSHURE(m_pParseTree->count() >= 4,"ParseTreeIterator: Fehler im Parse Tree");
|
2000-09-18 15:18:56 +00:00
|
|
|
OSQLParseNode * pTableExp = m_pParseTree->getChild(3);
|
2000-10-19 10:47:14 +00:00
|
|
|
OSL_ENSHURE(pTableExp != NULL,"OSQLParseTreeIterator: Fehler im Parse Tree");
|
|
|
|
OSL_ENSHURE(SQL_ISRULE(pTableExp,table_exp),"OSQLParseTreeIterator: Fehler im Parse Tree");
|
|
|
|
OSL_ENSHURE(pTableExp->count() == 5,"OSQLParseTreeIterator: Fehler im Parse Tree");
|
2000-09-18 15:18:56 +00:00
|
|
|
|
|
|
|
pGroupClause = pTableExp->getChild(3);
|
|
|
|
// Wenn es aber eine order_by ist, dann darf sie nicht leer sein:
|
|
|
|
if(pGroupClause->count() != 3)
|
|
|
|
pGroupClause = NULL;
|
|
|
|
return pGroupClause;
|
|
|
|
}
|
|
|
|
//-----------------------------------------------------------------------------
|
|
|
|
const OSQLParseNode* OSQLParseTreeIterator::getHavingTree() const
|
|
|
|
{
|
2000-10-19 10:47:14 +00:00
|
|
|
|
2000-09-18 15:18:56 +00:00
|
|
|
|
|
|
|
if (!m_pParseTree || getStatementType() != SQL_STATEMENT_SELECT)
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
// Parse Tree analysieren (je nach Statement-Typ)
|
|
|
|
// und Zeiger auf ORDER-Klausel setzen:
|
|
|
|
OSQLParseNode * pHavingClause = NULL;
|
2000-10-19 10:47:14 +00:00
|
|
|
OSL_ENSHURE(m_pParseTree->count() >= 4,"ParseTreeIterator: Fehler im Parse Tree");
|
2000-09-18 15:18:56 +00:00
|
|
|
OSQLParseNode * pTableExp = m_pParseTree->getChild(3);
|
2000-10-19 10:47:14 +00:00
|
|
|
OSL_ENSHURE(pTableExp != NULL,"OSQLParseTreeIterator: Fehler im Parse Tree");
|
|
|
|
OSL_ENSHURE(SQL_ISRULE(pTableExp,table_exp),"OSQLParseTreeIterator: Fehler im Parse Tree");
|
|
|
|
OSL_ENSHURE(pTableExp->count() == 5,"OSQLParseTreeIterator: Fehler im Parse Tree");
|
2000-09-18 15:18:56 +00:00
|
|
|
|
|
|
|
pHavingClause = pTableExp->getChild(3);
|
|
|
|
// Wenn es aber eine order_by ist, dann darf sie nicht leer sein:
|
|
|
|
if(pHavingClause->count() < 1)
|
|
|
|
pHavingClause = NULL;
|
|
|
|
return pHavingClause;
|
|
|
|
}
|
2001-01-09 12:11:07 +00:00
|
|
|
// -----------------------------------------------------------------------------
|
|
|
|
sal_Bool OSQLParseTreeIterator::isTableNode(const OSQLParseNode* _pTableNode) const
|
|
|
|
{
|
|
|
|
return _pTableNode && (SQL_ISRULE(_pTableNode,catalog_name) ||
|
|
|
|
SQL_ISRULE(_pTableNode,schema_name) ||
|
|
|
|
SQL_ISRULE(_pTableNode,table_name));
|
|
|
|
}
|
2001-02-23 13:54:11 +00:00
|
|
|
// -----------------------------------------------------------------------------
|
|
|
|
void OSQLParseTreeIterator::appendWarning(const ::rtl::OUString& _sErrMsg)
|
|
|
|
{
|
|
|
|
OSL_ENSURE(m_pParser,"This should normally be checked outside!");
|
|
|
|
if(m_pParser)
|
|
|
|
{
|
|
|
|
if(m_aWarning.Message.getLength())
|
|
|
|
{
|
|
|
|
SQLWarning aWarning = m_aWarning;
|
|
|
|
while(aWarning.NextException.hasValue())
|
|
|
|
aWarning.NextException >>= aWarning;
|
|
|
|
aWarning.NextException <<= SQLWarning(_sErrMsg,NULL,::rtl::OUString::createFromAscii("HY0000"),1000,Any());
|
|
|
|
}
|
|
|
|
else
|
|
|
|
m_aWarning = SQLWarning(_sErrMsg,NULL,::rtl::OUString::createFromAscii("HY0000"),1000,Any());
|
|
|
|
}
|
|
|
|
}
|
2001-03-01 10:02:19 +00:00
|
|
|
// -----------------------------------------------------------------------------
|
2000-10-19 10:47:14 +00:00
|
|
|
|
2000-09-18 15:18:56 +00:00
|
|
|
|