summaryrefslogtreecommitdiff
path: root/connectivity/inc/connectivity/sqliterator.hxx
diff options
context:
space:
mode:
authorJens-Heiner Rechtien <hr@openoffice.org>2000-09-18 15:18:56 +0000
committerJens-Heiner Rechtien <hr@openoffice.org>2000-09-18 15:18:56 +0000
commitcb1a7c1869062c789c65bc55285e6b18fcf378e0 (patch)
treea084b702d7cce826b3b68cb69be833eeedd6bedb /connectivity/inc/connectivity/sqliterator.hxx
initial import
Diffstat (limited to 'connectivity/inc/connectivity/sqliterator.hxx')
-rw-r--r--connectivity/inc/connectivity/sqliterator.hxx337
1 files changed, 337 insertions, 0 deletions
diff --git a/connectivity/inc/connectivity/sqliterator.hxx b/connectivity/inc/connectivity/sqliterator.hxx
new file mode 100644
index 0000000000..6491ec4afa
--- /dev/null
+++ b/connectivity/inc/connectivity/sqliterator.hxx
@@ -0,0 +1,337 @@
+/*************************************************************************
+ *
+ * $RCSfile: sqliterator.hxx,v $
+ *
+ * $Revision: 1.1.1.1 $
+ *
+ * last change: $Author: hr $ $Date: 2000-09-18 16:14:18 $
+ *
+ * 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_
+#define _CONNECTIVITY_PARSE_SQLITERATOR_HXX_
+
+#ifndef _SVTOOLS_HASHCONT_HXX //autogen
+#include <svtools/hashcont.hxx>
+#endif
+#ifndef _CONNECTIVITY_SQLNODE_HXX
+#include "connectivity/sqlnode.hxx"
+#endif
+#ifndef _COM_SUN_STAR_SDBCX_XTABLESSUPPLIER_HPP_
+#include <com/sun/star/sdbcx/XTablesSupplier.hpp>
+#endif
+#ifndef _COM_SUN_STAR_SDBCX_XCOLUMNSSUPPLIER_HPP_
+#include <com/sun/star/sdbcx/XColumnsSupplier.hpp>
+#endif
+#ifndef _COM_SUN_STAR_SDBC_XDATABASEMETADATA_HPP_
+#include <com/sun/star/sdbc/XDatabaseMetaData.hpp>
+#endif
+#ifndef _COM_SUN_STAR_BEANS_XPROPERTYSET_HPP_
+#include <com/sun/star/beans/XPropertySet.hpp>
+#endif
+#ifndef _MAP_
+#include <map>
+#endif
+#ifndef _CONNECTIVITY_COMMONTOOLS_HXX_
+#include "connectivity/CommonTools.hxx"
+#endif
+#ifndef _VOS_REF_HXX_
+#include <vos/ref.hxx>
+#endif
+#ifndef _CPPUHELPER_WEAK_HXX_
+#include <cppuhelper/weak.hxx>
+#endif
+
+namespace connectivity
+{
+
+ class OSQLParseNode;
+
+
+ enum OSQLStatementType {
+ SQL_STATEMENT_UNKNOWN,
+ SQL_STATEMENT_SELECT,
+ SQL_STATEMENT_INSERT,
+ SQL_STATEMENT_UPDATE,
+ SQL_STATEMENT_DELETE,
+ SQL_STATEMENT_ODBC_CALL,
+ SQL_STATEMENT_SELECT_COUNT
+ };
+
+ enum OSQLPredicateType {
+ SQL_PRED_EQUAL = 'a', // Als sichtbare ASCII-Zeichen, damit man
+ SQL_PRED_NOTEQUAL, // den Predicate Type auch in Strings
+ SQL_PRED_LESS, // speichern kann.
+ SQL_PRED_LESSOREQUAL,
+ SQL_PRED_GREATER,
+ SQL_PRED_GREATEROREQUAL,
+ SQL_PRED_LIKE,
+ SQL_PRED_ISNULL,
+ SQL_PRED_ISNOTNULL,
+ SQL_PRED_NOTLIKE
+ };
+
+ //==================================================================
+ // SbaParseIteratorErrorInfo wird dem Call von aErrorHdl aus SbaParseIterator "ubergeben
+ // nErrorCode enth"alt eine Zusatzinformation "uber den Fehler
+ // 1 -> Tabelle nicht gefunden
+ // 2 -> Spalte nicht gefunden
+ //==================================================================
+ struct OSQLParseIteratorErrorInfo
+ {
+ USHORT nErrorCode; // 1 == Tabelle nicht gefunden, 2 == Spalte nicht gefunden
+ String aExpression; // der Teil-Ausdruck, der das Problem verursacht hat (kann leer sein)
+ };
+
+ #define RET_CONTINUE 1 // Parsevorgang fortsetzen
+ #define RET_HANDLED 2 // der Fehler wurde schon behandelt, das Parsen soll (mit Status auf Success) abgebrochen werden
+ #define RET_BREAK 3 // Abbrechen, Status-Fehlercode setzen
+
+ class OSQLParseTreeIterator
+ {
+ private:
+ const OSQLParseNode* m_pParseTree; // aktueller ParseTree
+ OSQLStatementType m_eStatementType; // Art des Statements
+ OSQLTables m_aTables; // Alle Tabellen die im ParseTree und bei der Connection gefunden wurden
+ ::vos::ORef<OSQLColumns> m_aSelectColumns; // alle Spalten aus dem Select-Clause
+ ::utl::UStringMixEqual m_aCaseEqual;
+
+ Link m_aErrorHdl; // wird im Fehlerfall gerufen
+ ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameAccess> m_xTables;
+ ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XDatabaseMetaData> m_xDatabaseMetaData;
+
+ // F"ugt eine Tabelle in die Map ein
+ void traverseOneTableName(const OSQLParseNode * pTableName, const String & rTableRange);
+ void traverseORCriteria(OSQLParseNode * pSearchCondition);
+ void traverseANDCriteria(OSQLParseNode * pSearchCondition);
+ void traverseOnePredicate(
+ OSQLParseNode * pColumnRef,
+ OSQLPredicateType ePredicateType,
+ String& aValue,
+ BOOL bCompareNull,
+ OSQLParseNode * pParameter);
+ OSQLParseNode * getTableRef(OSQLParseNode *pTableRef,String& aTableRange);
+ OSQLParseNode * getQualified_join(OSQLParseNode *pTableRef,String& aTableRange);
+ void getSelect_statement(OSQLParseNode *pSelect);
+ BOOL CallError(USHORT nError, const String& rExpression = String());
+ String getUniqueColumnName(const String & rColumnName) const;
+
+ protected:
+ void setSelectColumnName(const String & rColumnName,const String & rColumnAlias, const String & rTableRange,BOOL bFkt=FALSE);
+ void appendColumns(const OSQLTable& _rTable);
+ // Weitere Member-Variable, die in den "set"-Funktionen zur
+ // Verfuegung stehen sollen, koennen in der abgeleiteten Klasse
+ // definiert werden und z. B. in deren Konstruktor initialisiert
+ // bzw. nach Benutzung der "traverse"-Routinen mit Hilfe weiterer
+ // Funktionen abgefragt werden.
+
+
+ public:
+ OSQLParseTreeIterator();
+ OSQLParseTreeIterator(const OSQLParseTreeIterator & rIter);
+ OSQLParseTreeIterator( const ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameAccess>& _xTableSupplier ,
+ const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XDatabaseMetaData>& _xDatabaseMetaData,
+ const OSQLParseNode* pRoot);
+ ~OSQLParseTreeIterator();
+
+ sal_Bool isCaseSensitive() const { return m_aCaseEqual.isCaseSensitive(); }
+ // Der zu analysierende/zu traversierende Parse Tree:
+ // bei "Ubergabe von NULL wird der aktuelle Parsetree gel"oscht und der Fehlerstatus gecleared
+ void setParseTree(const OSQLParseNode * pNewParseTree);
+ const OSQLParseNode * getParseTree() const { return m_pParseTree; };
+
+ // Teilbaueme bei einem select statement
+ const OSQLParseNode* getWhereTree() const;
+ const OSQLParseNode* getOrderTree() const;
+ const OSQLParseNode* getGroupByTree() const;
+ const OSQLParseNode* getHavingTree() const;
+
+ // Statement-Typ (wird bereits in setParseTree gesetzt):
+ OSQLStatementType getStatementType() const { return m_eStatementType; }
+
+ // Die "traverse"-Routinen durchlaufen bestimmte Teile des Parse Tree
+ // und rufen fuer die erkannten Konstrukte die virtuellen "set"-Routinen
+ // auf und uebergeben diesen die erkannten Informationen als Parameter.
+ //
+ // Der Parse Tree muss in einer bestimmten Form vorliegen:
+ // SELECT [<tablerange>.]<columnname>, [<tablerange>.]<columnname>, ...
+ // FROM <tablename> [<tablerange>], <tablename> [<tablerange>], ...
+ // WHERE (
+ // <predicate>
+ // AND <predicate>
+ // ...
+ // )
+ // OR (
+ // ...
+ // )
+ // ...
+ // ORDER BY <columname>, <columnname>, ...
+ //
+ // (die Klammern sind optional bzw. zusaetzliche Klammern stoeren nicht, aber
+ // es duerfen nur mehrere AND-Bedingungen, die ihrerseits mit OR verknuepft sind,
+ // auftreten).
+ //
+ //
+ // <predicate> kann sein:
+ // [<tablerange>.]<columnname> <operator> <value>
+ // [<tablerange>.]<columnname> LIKE <value>
+ // [<tablerange>.]<columnname> NOT LIKE <value>
+ // [<tablerange>.]<columnname> IS NULL
+ // [<tablerange>.]<columnname> IS NOT NULL
+ //
+ // <operator> kann sein:
+ // "="
+ // "<>"
+ // "<"
+ // "<="
+ // ">"
+ // ">="
+ //
+ // <value> kann auch ein Parameter sein, in diesem Fall enthaelt
+ // das Argument "ParameterName" der "set"-Funktionen den Namen des Parameters
+ // (ohne fuehrenden Doppelpunkt) bzw. "?" bei unbenannten Parametern.
+ //
+ // <columnname> in der Select-Klausel kann auch "*" oder "COUNT(*)" sein.
+ //
+ //
+ // Wenn das Statement NICHT diese Form hat, oder wenn eine der "set"-Routinen
+ // den IteratorStatus != IsSuccessful() hinterlaesst, wird die weitere Analyse
+ // des Parse Tree abgebrochen. Ansonsten liefert "Status().IsSuccessful() == TRUE".
+
+ void traverseTableNames();
+ virtual void setTableName(const String & rTableName, const String & rDBName, const String& rOwner,
+ const String & rTableRange);
+ // [TableName enthaelt immer einen Namen, TableRange ist, falls angegeben, die "Range"-
+ // Variable (eine Art Alias-Name fuer den TableName), falls nicht angegeben, identisch
+ // zum TableName. SchemaName ist leer, wenn nicht angegeben.]
+
+ void traverseSelectColumnNames(const OSQLParseNode* pSelectNode);
+ // [TableRange kann leer sein, wenn nicht angegeben]
+
+ void traverseOrderByColumnNames(const OSQLParseNode* pSelectNode);
+ virtual void setOrderByColumnName(const String & rColumnName, const String & rTableRange, BOOL bAscending);
+ // [TableRange kann leer sein, wenn nicht angegeben]
+
+ // Bei Selektionskriterien werden (selbst bei einem einfachen Praedikat)
+ // folgende "set"-Funktionen in der angegebenen Reihenfolge aufgerufen:
+ //
+ // setORCriteriaPre
+ // |
+ // | setANDCriteriaPre
+ // | | setPredicate
+ // | | [weitere setPredicate-Aufrufe] ...
+ // | setANDCriteriaPost
+ // |
+ // | ... [weitere setANDCriteriaPre/Post-Paare und darin setPredicate-Aufrufe]
+ // |
+ // setORCriteriaPost
+ //
+ // Die AND-Verknuepfungen sind also implizit ODER-Verknuepft. setORCriteriaPre und
+ // setORCriteriaPost werden jeweils nur ein einziges Mal aufgerufen (sind also
+ // eigentlich ziemlich ueberfluessig, da man diese Aktionen auch vor bzw. nach dem
+ // traverse-Aufruf erledigen kann)!
+ //
+ void traverseSelectionCriteria(const OSQLParseNode* pSelectNode);
+ virtual void setORCriteriaPre();
+ virtual void setORCriteriaPost();
+ virtual void setANDCriteriaPre();
+ virtual void setANDCriteriaPost();
+ virtual void setPredicate(const String & rColumnName,
+ const String & rTableRange,
+ OSQLPredicateType ePredicateType,
+ const String & rValue,
+ const String & rParameterName);
+
+
+ // Erweiterung auf UPDATE- und INSERT-Statement ... (nyi):
+ void traverseAssignments();
+ virtual void setAssign(const String & rColumnName,
+ const String & rValue, BOOL bsetNull,
+ const String & rParameterName);
+
+ // Alle "traverse"-Routinen hintereinander aufrufen. Je nach Statement-Typ:
+ // Bei UPDATE und INSERT-Statement nur traverseTableNames und traverseAssignments,
+ // bei DELETE nur traverseTableNames und bei SELECT-Statement
+ // in der Reihenfolge: traverseTableNames, traverseSelectColumnNames,
+ // traverseOrderByColumnNames, traverseSelectionCriteria.
+ // Bricht bei irgendwelchen Fehlern sofort ab und liefert entsprechenden
+ // Status.
+ void traverseAll();
+
+ // Die TableRangeMap enth"alt alle Tabellen unter dem zugeh"origen Rangenamen der zuerst gefunden wird
+ const OSQLTables& getTables() const { return m_aTables;};
+ // return tables as nameaccess
+ ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameAccess >
+ getTablesAsNameAccess(::cppu::OWeakObject& _rParent,::osl::Mutex& _rMutex) const;
+
+ ::vos::ORef<OSQLColumns> getSelectColumns() const { return m_aSelectColumns;}
+ // return select columns as nameaccess
+ ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameAccess >
+ getSelectAsNameAccess(::cppu::OWeakObject& _rParent,::osl::Mutex& _rMutex) const;
+ // gibt den Aliasnamen der Column zur"uck, Leer falls nicht vorhanden
+ String getColumnAlias(const OSQLParseNode* pDerivedColumn) const;
+ // gibt den Columnnamen und die Tablerange (falls vorhanden) zur"uck
+ void getColumnRange(const OSQLParseNode* pColumnRef,String &rColumnName,String &rTableRange) const;
+
+ // Ermittelt fuer eine Funktion, Spalten den zugehoeren TableRange,
+ // wenn nicht eindeutig, dann leer
+ BOOL getColumnTableRange(const OSQLParseNode* pNode, String &rTableRange) const;
+
+ // FehlerHdl setzen
+ void setErrorHdl(const Link& rHdl){ m_aErrorHdl = rHdl;};
+ const Link& getErrorHdl(){ return m_aErrorHdl;};
+ };
+}
+
+#endif // _CONNECTIVITY_PARSE_SQLITERATOR_HXX_
+