diff options
author | Mathias Bauer <mba@openoffice.org> | 2009-09-09 11:45:13 +0200 |
---|---|---|
committer | Mathias Bauer <mba@openoffice.org> | 2009-09-09 11:45:13 +0200 |
commit | e7c6e5d2c248cfb935c91882a3a1e64fea7550b4 (patch) | |
tree | d2f45902cbd12ac6b651e486687130e01272d79f /connectivity | |
parent | 2484e4f7faa1f052ff48d2192ffb5931a71faa8f (diff) | |
parent | d1886d07b439e7197f731c9d98c0b2ec31c62faa (diff) |
merge commit to DEV300_m57
Diffstat (limited to 'connectivity')
150 files changed, 10518 insertions, 2070 deletions
diff --git a/connectivity/inc/connectivity/DriversConfig.hxx b/connectivity/inc/connectivity/DriversConfig.hxx new file mode 100644 index 000000000000..8a33019d57ed --- /dev/null +++ b/connectivity/inc/connectivity/DriversConfig.hxx @@ -0,0 +1,88 @@ +/*************************************************************************
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: makefile,v $
+ *
+ * $Revision: 1.1 $
+ *
+ * last change: $Author: st $ $Date: 2000/11/22 02:32:00 $
+ *
+ * The Contents of this file are made available subject to
+ * the terms of GNU Lesser General Public License Version 2.1.
+ *
+ *
+ * GNU Lesser General Public License Version 2.1
+ * =============================================
+ * Copyright 2005 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
+ *
+ ************************************************************************/
+#ifndef CONNECTIVITY_DRIVERSCONFIG_HXX_INCLUDED
+#define CONNECTIVITY_DRIVERSCONFIG_HXX_INCLUDED
+
+#include <comphelper/stl_types.hxx>
+#include <com/sun/star/lang/XMultiServiceFactory.hpp>
+#include <com/sun/star/beans/NamedValue.hpp>
+#include <com/sun/star/uno/Sequence.h>
+#include "connectivity/dbtoolsdllapi.hxx"
+#include <salhelper/singletonref.hxx>
+#include <comphelper/namedvaluecollection.hxx>
+#include <unotools/confignode.hxx>
+
+namespace connectivity
+{
+ typedef struct
+ {
+ ::comphelper::NamedValueCollection aProperties;
+ ::comphelper::NamedValueCollection aFeatures;
+ ::comphelper::NamedValueCollection aMetaData;
+ ::rtl::OUString sDriverFactory;
+ ::rtl::OUString sDriverTypeDisplayName;
+ } TInstalledDriver;
+ DECLARE_STL_USTRINGACCESS_MAP( TInstalledDriver, TInstalledDrivers);
+
+ class DriversConfigImpl + { + ::utl::OConfigurationTreeRoot m_aInstalled; + public: + DriversConfigImpl(); + void Load(const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& _rxORB,TInstalledDrivers& _rDrivers); + };
+ //
+ // Allows to access all driver which are located in the configuration
+ //
+ class OOO_DLLPUBLIC_DBTOOLS DriversConfig
+ {
+ typedef salhelper::SingletonRef<DriversConfigImpl> OSharedConfigNode;
+
+ const ::comphelper::NamedValueCollection& impl_get(const ::rtl::OUString& _sURL,sal_Int32 _nProps) const;
+ public:
+ DriversConfig(const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& _rxORB);
+
+ ::rtl::OUString getDriverFactoryName(const ::rtl::OUString& _sUrl) const;
+ ::rtl::OUString getDriverTypeDisplayName(const ::rtl::OUString& _sUrl) const;
+ const ::comphelper::NamedValueCollection& getProperties(const ::rtl::OUString& _sURL) const;
+ const ::comphelper::NamedValueCollection& getFeatures(const ::rtl::OUString& _sURL) const;
+ const ::comphelper::NamedValueCollection& getMetaData(const ::rtl::OUString& _sURL) const;
+ ::com::sun::star::uno::Sequence< ::rtl::OUString > getURLs() const;
+ private:
+ TInstalledDrivers m_aDrivers;
+ OSharedConfigNode m_aNode;
+ };
+}
+#endif // CONNECTIVITY_DRIVERSCONFIG_HXX_INCLUDED
diff --git a/connectivity/inc/connectivity/dbexception.hxx b/connectivity/inc/connectivity/dbexception.hxx index 5c9f575da7c7..dbfcf5eb5747 100644 --- a/connectivity/inc/connectivity/dbexception.hxx +++ b/connectivity/inc/connectivity/dbexception.hxx @@ -150,6 +150,12 @@ public: const ::com::sun::star::uno::Any& get() const { return m_aContent; } + void clear() + { + m_aContent.clear(); + m_eType = UNDEFINED; + } + protected: void implDetermineType(); }; diff --git a/connectivity/inc/connectivity/dbmetadata.hxx b/connectivity/inc/connectivity/dbmetadata.hxx index ea284efb2b86..32662c5c157a 100644 --- a/connectivity/inc/connectivity/dbmetadata.hxx +++ b/connectivity/inc/connectivity/dbmetadata.hxx @@ -135,8 +135,15 @@ namespace dbtools <code>SELECT * FROM table correlation_name</code> is generated. */ bool generateASBeforeCorrelationName() const; + + /** should date time be escaped like '2001-01-01' => #2001-01-01# + */ bool shouldEscapeDateTime() const; + /** auto increment columns should be automaticly used as primary key. + */ + bool isAutoIncrementPrimaryKey() const; + /** determines the syntax to use for boolean comparison predicates @see ::com::sun::star::sdb::BooleanComparisonMode diff --git a/connectivity/inc/connectivity/sqlnode.hxx b/connectivity/inc/connectivity/sqlnode.hxx index 7dbc59e0cde8..fda3e24c09e6 100644 --- a/connectivity/inc/connectivity/sqlnode.hxx +++ b/connectivity/inc/connectivity/sqlnode.hxx @@ -39,6 +39,7 @@ #include <functional> #include <set> #include <boost/shared_ptr.hpp> +#include <rtl/ustrbuf.hxx> // forward declarations namespace com @@ -428,22 +429,22 @@ namespace connectivity bool _bSubstitute) const; private: - void impl_parseNodeToString_throw( ::rtl::OUString& rString, const SQLParseNodeParameter& rParam) const; - void impl_parseLikeNodeToString_throw( ::rtl::OUString& rString, const SQLParseNodeParameter& rParam ) const; - void impl_parseTableRangeNodeToString_throw( ::rtl::OUString& rString, const SQLParseNodeParameter& rParam ) const; + void impl_parseNodeToString_throw( ::rtl::OUStringBuffer& rString, const SQLParseNodeParameter& rParam) const; + void impl_parseLikeNodeToString_throw( ::rtl::OUStringBuffer& rString, const SQLParseNodeParameter& rParam ) const; + void impl_parseTableRangeNodeToString_throw( ::rtl::OUStringBuffer& rString, const SQLParseNodeParameter& rParam ) const; /** parses a table_name node into a SQL statement particle. @return <TRUE/> if and only if parsing was successful, <FALSE/> if default handling should be applied. */ - bool impl_parseTableNameNodeToString_throw( ::rtl::OUString& rString, const SQLParseNodeParameter& rParam ) const; + bool impl_parseTableNameNodeToString_throw( ::rtl::OUStringBuffer& rString, const SQLParseNodeParameter& rParam ) const; - sal_Bool addDateValue(::rtl::OUString& rString, const SQLParseNodeParameter& rParam) const; + sal_Bool addDateValue(::rtl::OUStringBuffer& rString, const SQLParseNodeParameter& rParam) const; ::rtl::OUString convertDateTimeString(const SQLParseNodeParameter& rParam, const ::rtl::OUString& rString) const; ::rtl::OUString convertDateString(const SQLParseNodeParameter& rParam, const ::rtl::OUString& rString) const; ::rtl::OUString convertTimeString(const SQLParseNodeParameter& rParam, const ::rtl::OUString& rString) const; - void parseLeaf(::rtl::OUString & rString, const SQLParseNodeParameter& rParam) const; + void parseLeaf(::rtl::OUStringBuffer& rString, const SQLParseNodeParameter& rParam) const; }; //----------------------------------------------------------------------------- diff --git a/connectivity/inc/connectivity/sqlparse.hxx b/connectivity/inc/connectivity/sqlparse.hxx index 6ca31d695bd9..fb775abb480d 100644 --- a/connectivity/inc/connectivity/sqlparse.hxx +++ b/connectivity/inc/connectivity/sqlparse.hxx @@ -232,7 +232,8 @@ namespace connectivity // compares the _sFunctionName with all known function names and return the DataType of the return value static sal_Int32 getFunctionReturnType(const ::rtl::OUString& _sFunctionName, const IParseContext* pContext = NULL); - + // returns the type for a parameter in a given function name + static sal_Int32 getFunctionParameterType(sal_uInt32 _nTokenId,sal_uInt32 _nPos); void error(sal_Char *fmt); int SQLlex(); diff --git a/connectivity/makefile.pmk b/connectivity/makefile.pmk new file mode 100644 index 000000000000..ede06e49d391 --- /dev/null +++ b/connectivity/makefile.pmk @@ -0,0 +1,66 @@ +#************************************************************************* +# +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +# +# Copyright 2008 by Sun Microsystems, Inc. +# +# OpenOffice.org - a multi-platform office productivity suite +# +# $RCSfile: makefile.pmk,v $ +# +# $Revision: 1.6 $ +# +# This file is part of OpenOffice.org. +# +# OpenOffice.org is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License version 3 +# only, as published by the Free Software Foundation. +# +# OpenOffice.org is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License version 3 for more details +# (a copy is included in the LICENSE file that accompanied this code). +# +# You should have received a copy of the GNU Lesser General Public License +# version 3 along with OpenOffice.org. If not, see +# <http://www.openoffice.org/license.html> +# for a copy of the LGPLv3 License. +# +#************************************************************************* + +XSLDIR=$(SOLARXMLDIR)$/processing +ABSXCSROOT=$(PWD)$/$(MISC) +# ABSXCSROOT=$(MISC) +XCSROOT=.. +# XCSROOT=$(SOLARXMLDIR) +# ABSXCSROOT=$(SOLARXMLDIR) +DTDDIR=$(SOLARXMLDIR) +PROCESSOUT=$(MISC) +PROCESSORDIR=$(SOLARBINDIR) + + +# no validation by inspector class +NO_INSPECTION=TRUE + +JAVAPREPRO= +.IF "$(JDK_VERSION)" == "110" +JAVAPREPRO=-jdk11 +.ENDIF +.IF "$(PRODUCT)" != "" +JAVAPREPRO=$(JAVAPREPRO) + " -product" +.ENDIF + +# --- Settings ----------------------------------------------------- +PACKAGE=org.openoffice.Office.DataAccess +.INCLUDE : settings.mk + +COMPONENT_CONFIG_DATA*=$(TARGET).xcu + +LOCALIZEDFILES= \ + $(COMPONENT_CONFIG_DATA) + +XCUFILES= \ + $(LOCALIZEDFILES) \ + + diff --git a/connectivity/prj/build.lst b/connectivity/prj/build.lst index 077c241b9fd8..20cb27644e29 100644 --- a/connectivity/prj/build.lst +++ b/connectivity/prj/build.lst @@ -1,19 +1,19 @@ -cn connectivity : l10n comphelper MOZ:moz SO:moz_prebuilt svtools UNIXODBC:unixODBC unoil javaunohelper HSQLDB:hsqldb QADEVOOO:qadevOOo NULL +cn connectivity : l10n comphelper MOZ:moz SO:moz_prebuilt svtools UNIXODBC:unixODBC unoil javaunohelper HSQLDB:hsqldb QADEVOOO:qadevOOo officecfg NSS:nss NULL cn connectivity usr1 - all cn_mkout NULL cn connectivity\inc nmake - all cn_inc NULL cn connectivity\com\sun\star\sdbcx\comp\hsqldb nmake - all cn_jhsqldbdb cn_hsqldb cn_inc NULL cn connectivity\source\commontools nmake - all cn_cmtools cn_parse cn_inc NULL -cn connectivity\source\manager nmake - all cn_manager cn_inc NULL +cn connectivity\source\manager nmake - all cn_manager cn_dbtools cn_inc NULL cn connectivity\source\cpool nmake - all cn_cpool cn_dbtools cn_inc NULL cn connectivity\source\resource nmake - all cn_res cn_inc NULL cn connectivity\source\sdbcx nmake - all cn_sdbcx cn_inc NULL -cn connectivity\source\drivers\ado nmake - w cn_ado cn_dbtools cn_inc NULL +cn connectivity\source\drivers\ado nmake - all cn_ado cn_dbtools cn_inc NULL cn connectivity\source\drivers\mozab\mozillasrc nmake - all cn_mozab_mozillasrc cn_file cn_inc NULL cn connectivity\source\drivers\mozab\bootstrap nmake - all cn_mozab_bootstrap cn_mozab_mozillasrc cn_inc NULL cn connectivity\source\drivers\mozab nmake - all cn_mozab cn_mozab_bootstrap cn_dbtools cn_inc NULL -cn connectivity\source\drivers\kab nmake - u cn_kab cn_dbtools cn_inc NULL -cn connectivity\source\drivers\macab nmake - u cn_macab cn_dbtools cn_inc NULL -cn connectivity\source\drivers\evoab2 nmake - u cn_evoab2 cn_dbtools cn_file cn_inc NULL +cn connectivity\source\drivers\kab nmake - all cn_kab cn_dbtools cn_inc NULL +cn connectivity\source\drivers\macab nmake - all cn_macab cn_dbtools cn_inc NULL +cn connectivity\source\drivers\evoab2 nmake - all cn_evoab2 cn_dbtools cn_file cn_inc NULL cn connectivity\source\drivers\calc nmake - all cn_calc cn_file cn_inc NULL cn connectivity\source\drivers\odbcbase nmake - all cn_odbcbase cn_dbtools cn_inc NULL cn connectivity\source\drivers\odbc nmake - all cn_odbc cn_odbcbase cn_inc NULL @@ -28,3 +28,5 @@ cn connectivity\source\parse nmake - all cn_parse cn_ cn connectivity\source\simpledbt nmake - all cn_simpledbt cn_cmtools cn_inc NULL cn connectivity\source\dbtools nmake - all cn_dbtools cn_simpledbt cn_cmtools cn_parse cn_res cn_sdbcx cn_inc cn_res NULL cn connectivity\qa\connectivity\tools nmake - all cn_qa_tools cn_inc NULL +cn connectivity\util nmake - all cn_util cn_ado cn_mozab cn_kab cn_evoab2 cn_calc cn_odbc cn_mysql cn_jdbc cn_adabas cn_flat cn_dbase cn_hsqldb NULL + diff --git a/connectivity/prj/d.lst b/connectivity/prj/d.lst index 36d93ca2c35b..728c8fef03c4 100644 --- a/connectivity/prj/d.lst +++ b/connectivity/prj/d.lst @@ -22,8 +22,12 @@ mkdir: %_DEST%\inc%_EXT%\connectivity mkdir: %_DEST%\inc%_EXT%\connectivity\sdbcx +mkdir: %_DEST%\xml%_EXT%\registry\spool\DataAccess ..\inc\connectivity\*.hxx %_DEST%\inc%_EXT%\connectivity\*.hxx ..\%__SRC%\inc\sqlbison.hxx %_DEST%\inc%_EXT%\connectivity\sqlbison.hxx ..\inc\connectivity\sdbcx\*.hxx %_DEST%\inc%_EXT%\connectivity\sdbcx\*.hxx #..\version.mk %_DEST%\inc%_EXT%\connectivity\version.mk +..\%__SRC%\misc\registry\data\org\openoffice\Office\DataAccess\*.xcu %_DEST%\xml%_EXT%\registry\spool\DataAccess\*.xcu +..\%COMMON_OUTDIR%\bin\fcfg_drivers_*.zip %_DEST%\pck%_EXT%\fcfg_drivers_*.zip +..\%__SRC%\bin\fcfg_drivers_*.zip %_DEST%\pck%_EXT%\fcfg_drivers_*.zip
\ No newline at end of file diff --git a/connectivity/qa/connectivity/tools/AbstractDatabase.java b/connectivity/qa/connectivity/tools/AbstractDatabase.java new file mode 100644 index 000000000000..d3150cd8aa07 --- /dev/null +++ b/connectivity/qa/connectivity/tools/AbstractDatabase.java @@ -0,0 +1,230 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: RowSetEventListener.java,v $ + * $Revision: 1.4 $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ +package connectivity.tools; + +import com.sun.star.container.XNameAccess; +import com.sun.star.frame.XModel; +import com.sun.star.frame.XStorable; +import com.sun.star.io.IOException; +import com.sun.star.lang.XMultiServiceFactory; +import com.sun.star.sdb.XDocumentDataSource; +import com.sun.star.sdb.XOfficeDatabaseDocument; +import com.sun.star.sdbc.SQLException; +import com.sun.star.sdbc.XCloseable; +import com.sun.star.sdbc.XConnection; +import com.sun.star.sdbc.XStatement; +import com.sun.star.uno.UnoRuntime; +import com.sun.star.util.CloseVetoException; +import java.io.File; + +/** + * + * @author oj93728 + */ +public abstract class AbstractDatabase implements DatabaseAccess +{ + // the service factory + + protected final XMultiServiceFactory m_orb; + // the URL of the temporary file used for the database document + protected String m_databaseDocumentFile; + // the database document + protected XOfficeDatabaseDocument m_databaseDocument; + // the data source belonging to the database document + protected DataSource m_dataSource; + // the default connection + protected XConnection m_connection; + + public AbstractDatabase(final XMultiServiceFactory orb) throws Exception + { + m_orb = orb; + } + + // -------------------------------------------------------------------------------------------------------- + public AbstractDatabase(final XMultiServiceFactory orb, final String _existingDocumentURL ) throws Exception + { + m_orb = orb; + createDBDocument( _existingDocumentURL ); + } + + /** returns a connection to the database + * + * Multiple calls to this method return the same connection. The DbaseDatabase object keeps + * the ownership of the connection, so you don't need to (and should not) dispose/close it. + * + */ + public XConnection defaultConnection() throws SQLException + { + if (m_connection == null) + { + m_connection = m_databaseDocument.getDataSource().getConnection("", ""); + } + + return m_connection; + } + + /** executes the given SQL statement via the defaultConnection + */ + public void executeSQL(final String statementString) throws SQLException + { + final XStatement statement = defaultConnection().createStatement(); + statement.execute(statementString); + } + + /** stores the database document + */ + public void store() throws IOException + { + if (m_databaseDocument != null) + { + final XStorable storeDoc = (XStorable) UnoRuntime.queryInterface(XStorable.class, + m_databaseDocument); + storeDoc.store(); + } + } + + /** closes the database document + * + * Any CloseVetoExceptions fired by third parties are ignored, and any reference to the + * database document is released. + */ + public void close() + { + // close connection + final XCloseable closeConn = (XCloseable) UnoRuntime.queryInterface(XCloseable.class, + m_connection); + if (closeConn != null) + { + try + { + closeConn.close(); + } + catch (SQLException e) + { + } + } + m_connection = null; + + // close document + final com.sun.star.util.XCloseable closeDoc = (com.sun.star.util.XCloseable) UnoRuntime.queryInterface( + com.sun.star.util.XCloseable.class, m_databaseDocument); + if (closeDoc != null) + { + try + { + closeDoc.close(true); + } + catch (CloseVetoException e) + { + } + } + m_databaseDocument = null; + } + + /** closes the document, and deletes the underlying file + */ + public void closeAndDelete() + { + close(); + + if (m_databaseDocumentFile != null) + { + try + { + final File file = new File(m_databaseDocumentFile); + file.delete(); + } + catch (Exception e) + { + } + } + } + + /** returns the underlying database document + */ + public XOfficeDatabaseDocument getDatabaseDocument() + { + return m_databaseDocument; + } + + /** returns the model interface of the underlying database document + */ + public XModel getModel() + { + return (XModel) UnoRuntime.queryInterface(XModel.class, m_databaseDocument); + } + + public XMultiServiceFactory getORB() + { + return m_orb; + } + + // -------------------------------------------------------------------------------------------------------- + final protected void createDBDocument(final String _docURL) throws Exception + { + m_databaseDocumentFile = _docURL; + + final XNameAccess dbContext = (XNameAccess) UnoRuntime.queryInterface(XNameAccess.class, + m_orb.createInstance("com.sun.star.sdb.DatabaseContext")); + final XDocumentDataSource dataSource = (XDocumentDataSource) UnoRuntime.queryInterface(XDocumentDataSource.class, + dbContext.getByName(_docURL)); + + m_databaseDocument = dataSource.getDatabaseDocument(); + m_dataSource = new DataSource(m_orb, m_databaseDocument.getDataSource()); + } + + /** returns the URL of the ODB document represented by this instance + */ + public String getDocumentURL() + { + return m_databaseDocumentFile; + } + + /** returns the data source belonging to this database + */ + public DataSource getDataSource() + { + return m_dataSource; + } + + /** creates a row set operating the database, with a given command/type + */ + public RowSet createRowSet(final int _commandType, final String _command) + { + return new RowSet(m_orb, getDocumentURL(), _commandType, _command); + } + + @Override + protected void finalize() throws Throwable + { + closeAndDelete(); + super.finalize(); + } +} diff --git a/connectivity/qa/connectivity/tools/DataSource.java b/connectivity/qa/connectivity/tools/DataSource.java index 531ec70d2930..1ed8f7f98af7 100644 --- a/connectivity/qa/connectivity/tools/DataSource.java +++ b/connectivity/qa/connectivity/tools/DataSource.java @@ -27,10 +27,8 @@ * for a copy of the LGPLv3 License. * ************************************************************************/ - package connectivity.tools; -import com.sun.star.beans.UnknownPropertyException; import com.sun.star.container.ElementExistException; import com.sun.star.container.NoSuchElementException; import com.sun.star.container.XNameAccess; @@ -51,21 +49,22 @@ import java.util.logging.Logger; public class DataSource { // the service factory - XMultiServiceFactory m_orb; - XDataSource m_dataSource; - public DataSource( XMultiServiceFactory _orb, String _registeredName ) throws Exception + private final XMultiServiceFactory m_orb; + private XDataSource m_dataSource; + + public DataSource(final XMultiServiceFactory _orb, final String _registeredName) throws Exception { m_orb = _orb; - XNameAccess dbContext = (XNameAccess)UnoRuntime.queryInterface(XNameAccess.class, - _orb.createInstance("com.sun.star.sdb.DatabaseContext")); + final XNameAccess dbContext = (XNameAccess) UnoRuntime.queryInterface(XNameAccess.class, + _orb.createInstance("com.sun.star.sdb.DatabaseContext")); - m_dataSource = (XDataSource)UnoRuntime.queryInterface(XDataSource.class, - dbContext.getByName( _registeredName ) ); + m_dataSource = (XDataSource) UnoRuntime.queryInterface(XDataSource.class, + dbContext.getByName(_registeredName)); } - public DataSource( XMultiServiceFactory _orb, XDataSource _dataSource ) + public DataSource(final XMultiServiceFactory _orb,final XDataSource _dataSource) { m_orb = _orb; m_dataSource = _dataSource; @@ -77,47 +76,47 @@ public class DataSource } /** creates a query with a given name and SQL command - */ - public void createQuery( String _name, String _sqlCommand ) throws ElementExistException, WrappedTargetException, com.sun.star.lang.IllegalArgumentException + */ + public void createQuery(final String _name, final String _sqlCommand) throws ElementExistException, WrappedTargetException, com.sun.star.lang.IllegalArgumentException { - createQuery( _name, _sqlCommand, true ); + createQuery(_name, _sqlCommand, true); } /** creates a query with a given name, SQL command, and EscapeProcessing flag - */ - public void createQuery( String _name, String _sqlCommand, boolean _escapeProcessing ) throws ElementExistException, WrappedTargetException, com.sun.star.lang.IllegalArgumentException + */ + public void createQuery(final String _name, final String _sqlCommand, final boolean _escapeProcessing) throws ElementExistException, WrappedTargetException, com.sun.star.lang.IllegalArgumentException { - XSingleServiceFactory queryDefsFac = (XSingleServiceFactory)UnoRuntime.queryInterface( - XSingleServiceFactory.class, getQueryDefinitions() ); + final XSingleServiceFactory queryDefsFac = (XSingleServiceFactory) UnoRuntime.queryInterface( + XSingleServiceFactory.class, getQueryDefinitions()); XPropertySet queryDef = null; try { - queryDef = (XPropertySet)UnoRuntime.queryInterface( - XPropertySet.class, queryDefsFac.createInstance() ); - queryDef.setPropertyValue( "Command", _sqlCommand ); - queryDef.setPropertyValue( "EscapeProcessing", new Boolean( _escapeProcessing ) ); + queryDef = (XPropertySet) UnoRuntime.queryInterface( + XPropertySet.class, queryDefsFac.createInstance()); + queryDef.setPropertyValue("Command", _sqlCommand); + queryDef.setPropertyValue("EscapeProcessing", Boolean.valueOf(_escapeProcessing)); } - catch( com.sun.star.uno.Exception e ) + catch (com.sun.star.uno.Exception e) { - e.printStackTrace( System.err ); + e.printStackTrace(System.err); } - XNameContainer queryDefsContainer = (XNameContainer)UnoRuntime.queryInterface( - XNameContainer.class, getQueryDefinitions() ); - queryDefsContainer.insertByName( _name, queryDef ); + final XNameContainer queryDefsContainer = (XNameContainer) UnoRuntime.queryInterface( + XNameContainer.class, getQueryDefinitions()); + queryDefsContainer.insertByName(_name, queryDef); } /** provides the query definition with the given name */ - public QueryDefinition getQueryDefinition( String _name ) throws NoSuchElementException + public QueryDefinition getQueryDefinition(final String _name) throws NoSuchElementException { - XNameAccess allDefs = getQueryDefinitions(); + final XNameAccess allDefs = getQueryDefinitions(); try { return new QueryDefinition( - (XPropertySet)UnoRuntime.queryInterface( XPropertySet.class, allDefs.getByName( _name ) ) ); + (XPropertySet) UnoRuntime.queryInterface(XPropertySet.class, allDefs.getByName(_name))); } - catch ( WrappedTargetException e ) + catch (WrappedTargetException e) { } throw new NoSuchElementException(); @@ -127,8 +126,8 @@ public class DataSource */ public XNameAccess getQueryDefinitions() { - XQueryDefinitionsSupplier suppQueries = (XQueryDefinitionsSupplier)UnoRuntime.queryInterface( - XQueryDefinitionsSupplier.class, m_dataSource ); + final XQueryDefinitionsSupplier suppQueries = (XQueryDefinitionsSupplier) UnoRuntime.queryInterface( + XQueryDefinitionsSupplier.class, m_dataSource); return suppQueries.getQueryDefinitions(); } @@ -137,12 +136,12 @@ public class DataSource * This is usually necessary if you created tables by directly executing SQL statements, * bypassing the SDBCX layer. */ - public void refreshTables( com.sun.star.sdbc.XConnection _connection ) + public void refreshTables(final com.sun.star.sdbc.XConnection _connection) { - XTablesSupplier suppTables = (XTablesSupplier)UnoRuntime.queryInterface( - XTablesSupplier.class, _connection ); - XRefreshable refreshTables = (XRefreshable)UnoRuntime.queryInterface( - XRefreshable.class, suppTables.getTables() ); + final XTablesSupplier suppTables = (XTablesSupplier) UnoRuntime.queryInterface( + XTablesSupplier.class, _connection); + final XRefreshable refreshTables = (XRefreshable) UnoRuntime.queryInterface( + XRefreshable.class, suppTables.getTables()); refreshTables.refresh(); } @@ -158,9 +157,9 @@ public class DataSource String name = null; try { - XPropertySet dataSourceProps = (XPropertySet) UnoRuntime.queryInterface( - XPropertySet.class, m_dataSource ); - name = (String)dataSourceProps.getPropertyValue("Name"); + final XPropertySet dataSourceProps = (XPropertySet) UnoRuntime.queryInterface( + XPropertySet.class, m_dataSource); + name = (String) dataSourceProps.getPropertyValue("Name"); } catch (Exception ex) { diff --git a/connectivity/qa/connectivity/tools/DatabaseAccess.java b/connectivity/qa/connectivity/tools/DatabaseAccess.java new file mode 100644 index 000000000000..bc39bb099087 --- /dev/null +++ b/connectivity/qa/connectivity/tools/DatabaseAccess.java @@ -0,0 +1,66 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: RowSetEventListener.java,v $ + * $Revision: 1.4 $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ +package connectivity.tools; + +import com.sun.star.frame.XModel; +import com.sun.star.io.IOException; +import com.sun.star.lang.XMultiServiceFactory; +import com.sun.star.sdb.XOfficeDatabaseDocument; +import com.sun.star.sdbc.SQLException; +import com.sun.star.sdbc.XConnection; + +/** + * + * @author oj93728 + */ +public interface DatabaseAccess +{ + XConnection defaultConnection() throws SQLException; + + void executeSQL(final String statementString) throws SQLException; + + void store() throws IOException; + + void close(); + + void closeAndDelete(); + + XOfficeDatabaseDocument getDatabaseDocument(); + + XModel getModel(); + + String getDocumentURL(); + + DataSource getDataSource(); + + RowSet createRowSet(final int _commandType, final String _command); + + XMultiServiceFactory getORB(); +} diff --git a/connectivity/qa/connectivity/tools/DbaseDatabase.java b/connectivity/qa/connectivity/tools/DbaseDatabase.java new file mode 100644 index 000000000000..9c1d6ea47411 --- /dev/null +++ b/connectivity/qa/connectivity/tools/DbaseDatabase.java @@ -0,0 +1,100 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: DbaseDatabase.java,v $ + * $Revision: 1.4.50.2 $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ +package connectivity.tools; + +import com.sun.star.beans.PropertyValue; +import com.sun.star.beans.XPropertySet; +import com.sun.star.frame.XStorable; +import com.sun.star.lang.XMultiServiceFactory; +import com.sun.star.sdb.XOfficeDatabaseDocument; +import com.sun.star.sdbc.SQLException; +import com.sun.star.uno.UnoRuntime; + +import helper.URLHelper; +import java.io.File; + +/** + * + * @author Ocke + */ +public class DbaseDatabase extends AbstractDatabase +{ + // -------------------------------------------------------------------------------------------------------- + + public DbaseDatabase(final XMultiServiceFactory orb) throws Exception + { + super(orb); + createDBDocument(); + } + + // -------------------------------------------------------------------------------------------------------- + public DbaseDatabase(final XMultiServiceFactory orb, final String _existingDocumentURL) throws Exception + { + super(orb, _existingDocumentURL); + } + + /** creates an empty database document in a temporary location + */ + private void createDBDocument() throws Exception + { + final File documentFile = File.createTempFile("dbase", ".odb"); + documentFile.deleteOnExit(); + final File subPath = new File(documentFile.getParent() + File.separator + documentFile.getName().replaceAll(".odb", "") + File.separator ); + subPath.mkdir(); + //subPath.deleteOnExit(); + m_databaseDocumentFile = URLHelper.getFileURLFromSystemPath(documentFile); + final String path = URLHelper.getFileURLFromSystemPath(subPath.getPath()); + + m_databaseDocument = (XOfficeDatabaseDocument) UnoRuntime.queryInterface( + XOfficeDatabaseDocument.class, m_orb.createInstance("com.sun.star.sdb.OfficeDatabaseDocument")); + m_dataSource = new DataSource(m_orb, m_databaseDocument.getDataSource()); + + final XPropertySet dsProperties = (XPropertySet) UnoRuntime.queryInterface(XPropertySet.class, m_databaseDocument.getDataSource()); + dsProperties.setPropertyValue("URL", "sdbc:dbase:" + path); + + final XStorable storable = (XStorable) UnoRuntime.queryInterface(XStorable.class, m_databaseDocument); + storable.storeAsURL(m_databaseDocumentFile, new PropertyValue[] + { + }); + } + + /** drops the table with a given name + + @param _name + the name of the table to drop + @param _ifExists + TRUE if it should be dropped only when it exists. + */ + public void dropTable(final String _name,final boolean _ifExists) throws SQLException + { + String dropStatement = "DROP TABLE \"" + _name; + executeSQL(dropStatement); + } +} diff --git a/connectivity/qa/connectivity/tools/HsqlDatabase.java b/connectivity/qa/connectivity/tools/HsqlDatabase.java index e532a04bab22..d27816cf4b7e 100644 --- a/connectivity/qa/connectivity/tools/HsqlDatabase.java +++ b/connectivity/qa/connectivity/tools/HsqlDatabase.java @@ -27,29 +27,19 @@ * for a copy of the LGPLv3 License. * ************************************************************************/ - package connectivity.tools; import com.sun.star.beans.PropertyValue; import com.sun.star.beans.XPropertySet; import com.sun.star.container.ElementExistException; -import com.sun.star.container.XNameAccess; import com.sun.star.frame.XStorable; -import com.sun.star.frame.XModel; import com.sun.star.lang.XMultiServiceFactory; import com.sun.star.sdb.XOfficeDatabaseDocument; import com.sun.star.sdbc.SQLException; -import com.sun.star.sdbc.XCloseable; -import com.sun.star.sdbc.XConnection; -import com.sun.star.sdbc.XStatement; import com.sun.star.sdbcx.XAppend; import com.sun.star.sdbcx.XTablesSupplier; import com.sun.star.uno.UnoRuntime; -import com.sun.star.io.IOException; -import com.sun.star.sdb.XDocumentDataSource; -import java.io.File; -import com.sun.star.util.CloseVetoException; import helper.URLHelper; import java.util.HashMap; import java.util.Iterator; @@ -60,309 +50,167 @@ import java.io.File; * * @author fs93730 */ -public class HsqlDatabase +public class HsqlDatabase extends AbstractDatabase { - // the service factory - XMultiServiceFactory m_orb; - // the URL of the temporary file used for the database document - String m_databaseDocumentFile; - // the database document - XOfficeDatabaseDocument m_databaseDocument; - // the data source belonging to the database document - DataSource m_dataSource; - // the default connection - XConnection m_connection; // -------------------------------------------------------------------------------------------------------- - public HsqlDatabase( XMultiServiceFactory orb ) throws Exception + public HsqlDatabase(final XMultiServiceFactory orb) throws Exception { - m_orb = orb; + super(orb); createDBDocument(); } // -------------------------------------------------------------------------------------------------------- - public HsqlDatabase( XMultiServiceFactory orb, String _existingDocumentURL ) throws Exception - { - m_orb = orb; - createDBDocument( _existingDocumentURL ); - } - - // -------------------------------------------------------------------------------------------------------- - private void createDBDocument( String _docURL ) throws Exception + public HsqlDatabase(final XMultiServiceFactory orb, final String _existingDocumentURL) throws Exception { - m_databaseDocumentFile = _docURL; - - XNameAccess dbContext = (XNameAccess)UnoRuntime.queryInterface( XNameAccess.class, - m_orb.createInstance( "com.sun.star.sdb.DatabaseContext" ) ); - XDocumentDataSource dataSource = (XDocumentDataSource)UnoRuntime.queryInterface( XDocumentDataSource.class, - dbContext.getByName( _docURL ) ); - - m_databaseDocument = dataSource.getDatabaseDocument(); - m_dataSource = new DataSource( m_orb, m_databaseDocument.getDataSource() ); + super(orb, _existingDocumentURL); } /** creates an empty database document in a temporary location */ private void createDBDocument() throws Exception { - File documentFile = File.createTempFile("testdb",".odb"); + final File documentFile = File.createTempFile("testdb", ".odb"); documentFile.deleteOnExit(); - m_databaseDocumentFile = URLHelper.getFileURLFromSystemPath( documentFile ); + m_databaseDocumentFile = URLHelper.getFileURLFromSystemPath(documentFile); - m_databaseDocument = (XOfficeDatabaseDocument)UnoRuntime.queryInterface( - XOfficeDatabaseDocument.class, m_orb.createInstance( "com.sun.star.sdb.OfficeDatabaseDocument" ) ); - m_dataSource = new DataSource( m_orb, m_databaseDocument.getDataSource() ); + m_databaseDocument = (XOfficeDatabaseDocument) UnoRuntime.queryInterface( + XOfficeDatabaseDocument.class, m_orb.createInstance("com.sun.star.sdb.OfficeDatabaseDocument")); + m_dataSource = new DataSource(m_orb, m_databaseDocument.getDataSource()); - XPropertySet dsProperties = (XPropertySet)UnoRuntime.queryInterface( XPropertySet.class, m_databaseDocument.getDataSource() ); + final XPropertySet dsProperties = (XPropertySet) UnoRuntime.queryInterface(XPropertySet.class, m_databaseDocument.getDataSource()); dsProperties.setPropertyValue("URL", "sdbc:embedded:hsqldb"); - XStorable storable = (XStorable)UnoRuntime.queryInterface( XStorable.class, m_databaseDocument ); - storable.storeAsURL( m_databaseDocumentFile, new PropertyValue[]{} ); + final XStorable storable = (XStorable) UnoRuntime.queryInterface(XStorable.class, m_databaseDocument); + storable.storeAsURL(m_databaseDocumentFile, new PropertyValue[] + { + }); } - /** returns a connection to the database - * - * Multiple calls to this method return the same connection. The HsqlDatabase object keeps - * the ownership of the connection, so you don't need to (and should not) dispose/close it. - * - */ - public XConnection defaultConnection() throws SQLException - { - if ( m_connection != null ) - return m_connection; - m_connection = m_databaseDocument.getDataSource().getConnection(new String(),new String()); - return m_connection; - } + /** drops the table with a given name - /** executes the given SQL statement via the defaultConnection + @param _name + the name of the table to drop + @param _ifExists + TRUE if it should be dropped only when it exists. */ - public void executeSQL( String statementString ) throws SQLException - { - XStatement statement = defaultConnection().createStatement(); - statement.execute( statementString ); - } - - /** stores the database document - */ - public void store() throws IOException + public void dropTable(final String _name, final boolean _ifExists) throws SQLException { - if ( m_databaseDocument != null ) + final StringBuffer dropStatement = new StringBuffer("DROP TABLE \""); + dropStatement.append(_name); + if (_ifExists) { - XStorable storeDoc = (XStorable)UnoRuntime.queryInterface( XStorable.class, - m_databaseDocument ); - storeDoc.store(); + dropStatement.append("\" IF EXISTS"); } + executeSQL(dropStatement.toString()); } - /** closes the database document - * - * Any CloseVetoExceptions fired by third parties are ignored, and any reference to the - * database document is released. - */ - public void close() + public void createTable(final HsqlTableDescriptor _tableDesc, final boolean _dropIfExists) throws SQLException { - // close connection - XCloseable closeConn = (XCloseable)UnoRuntime.queryInterface( XCloseable.class, - m_connection ); - if ( closeConn != null ) + if (_dropIfExists) { - try - { - closeConn.close(); - } - catch( SQLException e ) - { - } + dropTable(_tableDesc.getName(), true); } - m_connection = null; - - // close document - com.sun.star.util.XCloseable closeDoc = (com.sun.star.util.XCloseable)UnoRuntime.queryInterface( - com.sun.star.util.XCloseable.class, m_databaseDocument ); - if ( closeDoc != null ) - { - try - { - closeDoc.close( true ); - } - catch( CloseVetoException e ) - { - } - } - m_databaseDocument = null; - } - - /** closes the document, and deletes the underlying file - */ - public void closeAndDelete() - { - close(); - - if ( m_databaseDocumentFile != null ) - { - try - { - File file = new File(m_databaseDocumentFile); - file.delete(); - } - catch(Exception e) - { - } - m_databaseDocumentFile = null; - } - } - - /** returns the underlying database document - */ - public XOfficeDatabaseDocument getDatabaseDocument() - { - return m_databaseDocument; - } - - /** returns the model interface of the underlying database document - */ - XModel getModel() - { - return (XModel)UnoRuntime.queryInterface( XModel.class, m_databaseDocument ); - } - - /** drops the table with a given name - - @param _name - the name of the table to drop - @param _ifExists - TRUE if it should be dropped only when it exists. - */ - public void dropTable( String _name, boolean _ifExists ) throws SQLException - { - String dropStatement = "DROP TABLE \"" + _name; - if ( _ifExists ) - dropStatement += "\" IF EXISTS"; - executeSQL( dropStatement ); - } - - public void createTable( HsqlTableDescriptor _tableDesc, boolean _dropIfExists ) throws SQLException - { - if ( _dropIfExists ) - dropTable( _tableDesc.getName(), true ); - createTable( _tableDesc ); + createTable(_tableDesc); } /** creates a table */ - public void createTable( HsqlTableDescriptor _tableDesc ) throws SQLException + public void createTable(final HsqlTableDescriptor _tableDesc) throws SQLException { - String createStatement = "CREATE CACHED TABLE \""; - createStatement += _tableDesc.getName(); - createStatement += "\" ( "; + StringBuffer createStatement = new StringBuffer("CREATE CACHED TABLE \""); + createStatement.append(_tableDesc.getName()); + createStatement.append("\" ( "); String primaryKeyList = ""; - HashMap foreignKeys = new HashMap(); - HashMap foreignKeyRefs = new HashMap(); + final HashMap foreignKeys = new HashMap(); + final HashMap foreignKeyRefs = new HashMap(); - HsqlColumnDescriptor[] columns = _tableDesc.getColumns(); - for ( int i=0; i<columns.length; ++i ) + final HsqlColumnDescriptor[] columns = _tableDesc.getColumns(); + for (int i = 0; i < columns.length; ++i) { - if ( i > 0 ) - createStatement += ", "; + if (i > 0) + { + createStatement.append(", "); + } - createStatement += "\"" + columns[i].getName(); - createStatement += "\" " + columns[i].getTypeName(); + createStatement.append("\"" + columns[i].getName()); + createStatement.append("\" " + columns[i].getTypeName()); - if ( columns[i].isRequired() ) - createStatement += " NOT NULL"; + if (columns[i].isRequired()) + { + createStatement.append(" NOT NULL"); + } - if ( columns[i].isPrimaryKey() ) + if (columns[i].isPrimaryKey()) { - if ( primaryKeyList.length() > 0 ) + if (primaryKeyList.length() > 0) + { primaryKeyList += ", "; + } primaryKeyList += "\"" + columns[i].getName() + "\""; } - if ( columns[i].isForeignKey() ) + if (columns[i].isForeignKey()) { - String foreignTable = columns[i].getForeignTable(); + final String foreignTable = columns[i].getForeignTable(); - String foreignKeysForTable = foreignKeys.containsKey( foreignTable ) ? (String)foreignKeys.get( foreignTable ) : ""; - if ( foreignKeysForTable.length() > 0 ) + String foreignKeysForTable = foreignKeys.containsKey(foreignTable) ? (String) foreignKeys.get(foreignTable) : ""; + if (foreignKeysForTable.length() > 0) + { foreignKeysForTable += ", "; + } foreignKeysForTable += "\"" + columns[i].getName() + "\""; - foreignKeys.put( foreignTable, foreignKeysForTable ); - - String foreignKeyRefsForTable = foreignKeyRefs.containsKey( foreignTable ) ? (String)foreignKeyRefs.get( foreignTable ) : ""; - if ( foreignKeyRefsForTable.length() > 0 ) - foreignKeyRefsForTable += ", "; - foreignKeyRefsForTable += "\"" + columns[i].getForeignColumn() + "\""; - foreignKeyRefs.put( foreignTable, foreignKeyRefsForTable ); + foreignKeys.put(foreignTable, foreignKeysForTable); + + final StringBuffer foreignKeyRefsForTable = new StringBuffer(foreignKeyRefs.containsKey(foreignTable) ? (String) foreignKeyRefs.get(foreignTable) : ""); + if (foreignKeyRefsForTable.length() > 0) + { + foreignKeyRefsForTable.append(", "); + } + foreignKeyRefsForTable.append("\"" + columns[i].getForeignColumn() + "\""); + foreignKeyRefs.put(foreignTable, foreignKeyRefsForTable.toString()); } } - if ( primaryKeyList.length() > 0 ) + if (primaryKeyList.length() > 0) { - createStatement += ", PRIMARY KEY ("; - createStatement += primaryKeyList; - createStatement += ")"; + createStatement.append(", PRIMARY KEY ("); + createStatement.append(primaryKeyList); + createStatement.append(')'); } - Set foreignKeyTables = foreignKeys.keySet(); - for ( Iterator foreignKey = foreignKeyTables.iterator(); - foreignKey.hasNext(); - ) + final Set foreignKeyTables = foreignKeys.keySet(); + for (final Iterator foreignKey = foreignKeyTables.iterator(); + foreignKey.hasNext();) { - String foreignTable = (String)foreignKey.next(); - - createStatement += ", FOREIGN KEY ("; - createStatement += (String)foreignKeys.get(foreignTable); - createStatement += ") REFERENCES \""; - createStatement += foreignTable; - createStatement += "\"("; - createStatement += (String)foreignKeyRefs.get(foreignTable); - createStatement += ")"; + final String foreignTable = (String) foreignKey.next(); + + createStatement.append(", FOREIGN KEY ("); + createStatement.append((String) foreignKeys.get(foreignTable)); + createStatement.append(") REFERENCES \""); + createStatement.append(foreignTable); + createStatement.append("\"("); + createStatement.append((String) foreignKeyRefs.get(foreignTable)); + createStatement.append(')'); } - createStatement += ")"; + createStatement.append(')'); //System.err.println( createStatement ); - executeSQL( createStatement ); + executeSQL(createStatement.toString()); } /** creates a table in the database. using the SDBCX-API */ - public void createTableInSDBCX( HsqlTableDescriptor _tableDesc ) throws SQLException, ElementExistException - { - XPropertySet sdbcxDescriptor = _tableDesc.createSdbcxDescriptor( defaultConnection() ); - XTablesSupplier suppTables = (XTablesSupplier)UnoRuntime.queryInterface( - XTablesSupplier.class, defaultConnection() ); - XAppend appendTable = (XAppend)UnoRuntime.queryInterface( - XAppend.class, suppTables.getTables() ); - appendTable.appendByDescriptor( sdbcxDescriptor ); - } - - /** returns the URL of the ODB document represented by this instance - */ - public String getDocumentURL() - { - return m_databaseDocumentFile; - } - - /** returns the data source belonging to this database - */ - public DataSource getDataSource() - { - return m_dataSource; - } - - /** creates a row set operating the database, with a given command/type - */ - public RowSet createRowSet( int _commandType, String _command ) - { - return new RowSet(m_orb, getDocumentURL(), _commandType, _command); - } - - protected void finalize() throws Throwable - { - closeAndDelete(); - super.finalize(); + public void createTableInSDBCX(final HsqlTableDescriptor _tableDesc) throws SQLException, ElementExistException + { + final XPropertySet sdbcxDescriptor = _tableDesc.createSdbcxDescriptor(defaultConnection()); + final XTablesSupplier suppTables = (XTablesSupplier) UnoRuntime.queryInterface( + XTablesSupplier.class, defaultConnection()); + final XAppend appendTable = (XAppend) UnoRuntime.queryInterface( + XAppend.class, suppTables.getTables()); + appendTable.appendByDescriptor(sdbcxDescriptor); } } diff --git a/connectivity/qa/drivers/dbase/DBaseDateFunctions.java b/connectivity/qa/drivers/dbase/DBaseDateFunctions.java index 7a12866b0121..7ed50cbd9fd0 100644 --- a/connectivity/qa/drivers/dbase/DBaseDateFunctions.java +++ b/connectivity/qa/drivers/dbase/DBaseDateFunctions.java @@ -27,219 +27,286 @@ * for a copy of the LGPLv3 License. * ************************************************************************/ -package complex.connectivity; +package qa.drivers.dbase; -import complex.connectivity.DBaseDriverTest; import com.sun.star.uno.UnoRuntime; -import com.sun.star.util.XCloseable; import com.sun.star.sdbc.*; -import com.sun.star.sdb.*; -import com.sun.star.beans.PropertyValue; import com.sun.star.beans.XPropertySet; import com.sun.star.lang.XMultiServiceFactory; -import complexlib.ComplexTestCase; +public class DBaseDateFunctions +{ -import java.io.PrintWriter; + private final String where = "FROM \"biblio\" \"biblio\" where \"Identifier\" = 'BOR00'"; + private final XMultiServiceFactory m_xORB; + private final DBaseDriverTest testcase; -import util.utils; -import java.util.*; -import java.io.*; - - -public class DBaseDateFunctions { - - private String where = "FROM \"biblio\" \"biblio\" where \"Identifier\" = 'BOR00'"; - private XMultiServiceFactory m_xORB; - private DBaseDriverTest testcase; - public DBaseDateFunctions(XMultiServiceFactory _xORB,DBaseDriverTest _testcase){ - m_xORB = _xORB; - testcase = _testcase; - } + public DBaseDateFunctions(final XMultiServiceFactory _xORB, final DBaseDriverTest _testcase) + { + m_xORB = _xORB; + testcase = _testcase; + } - private void assure(String s,boolean b){ - testcase.assure2(s,b); - } + private void assure(final String s, final boolean b) + { + testcase.assure2(s, b); + } - public void testFunctions() throws com.sun.star.uno.Exception,com.sun.star.beans.UnknownPropertyException { - XRowSet xRowRes = (XRowSet)UnoRuntime.queryInterface(XRowSet.class, - m_xORB.createInstance("com.sun.star.sdb.RowSet")); + public void testFunctions() throws com.sun.star.uno.Exception, com.sun.star.beans.UnknownPropertyException + { + final XRowSet xRowRes = (XRowSet) UnoRuntime.queryInterface(XRowSet.class, + m_xORB.createInstance("com.sun.star.sdb.RowSet")); - System.out.println("starting DateTime function test!"); + testcase.getLog().println("starting DateTime function test!"); // set the properties needed to connect to a database - XPropertySet xProp = (XPropertySet)UnoRuntime.queryInterface(XPropertySet.class,xRowRes); - xProp.setPropertyValue("DataSourceName","Bibliography"); + final XPropertySet xProp = (XPropertySet) UnoRuntime.queryInterface(XPropertySet.class, xRowRes); + xProp.setPropertyValue("DataSourceName", "Bibliography"); - xProp.setPropertyValue("CommandType",new Integer(com.sun.star.sdb.CommandType.COMMAND)); + xProp.setPropertyValue("CommandType", Integer.valueOf(com.sun.star.sdb.CommandType.COMMAND)); - try { + try + { curdate(xRowRes); - } catch( SQLException ex){ - assure("upper " + ex.getMessage(),false); + } + catch (SQLException ex) + { + assure("upper " + ex.getMessage(), false); throw ex; } - try{ + try + { curtime(xRowRes); - } catch( SQLException ex){ - assure("lower " + ex.getMessage(),false); + } + catch (SQLException ex) + { + assure("lower " + ex.getMessage(), false); throw ex; } - try{ + try + { dayname(xRowRes); - } catch( SQLException ex){ - assure("ascii " + ex.getMessage(),false); + } + catch (SQLException ex) + { + assure("ascii " + ex.getMessage(), false); throw ex; } - try{ + try + { dayofmonth(xRowRes); - } catch( SQLException ex){ - assure("char_len " + ex.getMessage(),false); + } + catch (SQLException ex) + { + assure("char_len " + ex.getMessage(), false); throw ex; } - try{ + try + { dayofweek(xRowRes); - } catch( SQLException ex){ - assure("concat " + ex.getMessage(),false); + } + catch (SQLException ex) + { + assure("concat " + ex.getMessage(), false); throw ex; } - try{ + try + { dayofyear(xRowRes); - } catch( SQLException ex){ - assure("locate " + ex.getMessage(),false); + } + catch (SQLException ex) + { + assure("locate " + ex.getMessage(), false); throw ex; } - try{ + try + { hour(xRowRes); - } catch( SQLException ex){ - assure("substr " + ex.getMessage(),false); + } + catch (SQLException ex) + { + assure("substr " + ex.getMessage(), false); throw ex; } - try{ + try + { minute(xRowRes); - } catch( SQLException ex){ - assure("ltrim " + ex.getMessage(),false); + } + catch (SQLException ex) + { + assure("ltrim " + ex.getMessage(), false); throw ex; } - try{ + try + { month(xRowRes); - } catch( SQLException ex){ - assure("rtrim " + ex.getMessage(),false); + } + catch (SQLException ex) + { + assure("rtrim " + ex.getMessage(), false); throw ex; } - try{ + try + { monthname(xRowRes); - } catch( SQLException ex){ - assure("space " + ex.getMessage(),false); + } + catch (SQLException ex) + { + assure("space " + ex.getMessage(), false); throw ex; } - try{ + try + { now(xRowRes); - } catch( SQLException ex){ - assure("replace " + ex.getMessage(),false); + } + catch (SQLException ex) + { + assure("replace " + ex.getMessage(), false); throw ex; } - try{ + try + { quarter(xRowRes); - } catch( SQLException ex){ - assure("repeat " + ex.getMessage(),false); + } + catch (SQLException ex) + { + assure("repeat " + ex.getMessage(), false); throw ex; } - try{ + try + { second(xRowRes); - } catch( SQLException ex){ - assure("insert " + ex.getMessage(),false); + } + catch (SQLException ex) + { + assure("insert " + ex.getMessage(), false); throw ex; } - try{ + try + { week(xRowRes); - } catch( SQLException ex){ - assure("left " + ex.getMessage(),false); + } + catch (SQLException ex) + { + assure("left " + ex.getMessage(), false); throw ex; } - try{ + try + { year(xRowRes); - } catch( SQLException ex){ - assure("right " + ex.getMessage(),false); + } + catch (SQLException ex) + { + assure("right " + ex.getMessage(), false); throw ex; } } - private XRow execute(XRowSet xRowRes,String sql) throws com.sun.star.uno.Exception,com.sun.star.beans.UnknownPropertyException { - XPropertySet xProp = (XPropertySet)UnoRuntime.queryInterface(XPropertySet.class,xRowRes); - xProp.setPropertyValue("Command","SELECT " + sql + where); + private XRow execute(final XRowSet xRowRes, final String sql) throws com.sun.star.uno.Exception, com.sun.star.beans.UnknownPropertyException + { + final XPropertySet xProp = (XPropertySet) UnoRuntime.queryInterface(XPropertySet.class, xRowRes); + xProp.setPropertyValue("Command", "SELECT " + sql + where); xRowRes.execute(); - XResultSet xRes = (XResultSet)UnoRuntime.queryInterface(XResultSet.class,xRowRes); - assure("No valid row! ",xRes.next()); - - return (XRow)UnoRuntime.queryInterface(XRow.class, xRes); - } - - private void dayofweek(XRowSet xRowRes) throws com.sun.star.uno.Exception,com.sun.star.beans.UnknownPropertyException { - XRow row = execute(xRowRes,"DAYOFWEEK('1998-02-03') "); - assure("DAYOFWEEK('1998-02-03') failed!",row.getInt(1) == 3); - } - private void dayofmonth(XRowSet xRowRes) throws com.sun.star.uno.Exception,com.sun.star.beans.UnknownPropertyException { - XRow row = execute(xRowRes,"DAYOFMONTH('1998-02-03') "); - assure("DAYOFMONTH('1998-02-03') failed!",row.getInt(1) == 3); - } - private void dayofyear(XRowSet xRowRes) throws com.sun.star.uno.Exception,com.sun.star.beans.UnknownPropertyException { - XRow row = execute(xRowRes,"DAYOFYEAR('1998-02-03') "); - assure("DAYOFYEAR('1998-02-03') failed!",row.getInt(1) == 34); - } - private void month(XRowSet xRowRes) throws com.sun.star.uno.Exception,com.sun.star.beans.UnknownPropertyException { - XRow row = execute(xRowRes,"month('1998-02-03') "); - assure("month('1998-02-03') failed!",row.getInt(1) == 2); - } - private void dayname(XRowSet xRowRes) throws com.sun.star.uno.Exception,com.sun.star.beans.UnknownPropertyException { - XRow row = execute(xRowRes,"DAYNAME('1998-02-05') "); - assure("DAYNAME('1998-02-05') failed!",row.getString(1).equals("Thursday")); - } - private void monthname(XRowSet xRowRes) throws com.sun.star.uno.Exception,com.sun.star.beans.UnknownPropertyException { - XRow row = execute(xRowRes,"MONTHNAME('1998-02-05') "); - assure("MONTHNAME('1998-02-05') failed!",row.getString(1).equals("February")); - } - private void quarter(XRowSet xRowRes) throws com.sun.star.uno.Exception,com.sun.star.beans.UnknownPropertyException { - XRow row = execute(xRowRes,"QUARTER('98-01-01'),QUARTER('98-04-01'),QUARTER('98-07-01'),QUARTER('98-10-01') "); - assure("QUARTER('98-01-01') failed!",row.getInt(1) == 1); - assure("QUARTER('98-04-01') failed!",row.getInt(2) == 2); - assure("QUARTER('98-07-01') failed!",row.getInt(3) == 3); - assure("QUARTER('98-10-01') failed!",row.getInt(4) == 4); - } - private void week(XRowSet xRowRes) throws com.sun.star.uno.Exception,com.sun.star.beans.UnknownPropertyException { - XRow row = execute(xRowRes,"WEEK('1998-02-20') "); - assure("WEEK('1998-02-20') failed!",row.getInt(1) == 7); - } - private void year(XRowSet xRowRes) throws com.sun.star.uno.Exception,com.sun.star.beans.UnknownPropertyException { - XRow row = execute(xRowRes,"YEAR('98-02-03') "); - assure("YEAR('98-02-03') failed!",row.getInt(1) == 98); - } - private void hour(XRowSet xRowRes) throws com.sun.star.uno.Exception,com.sun.star.beans.UnknownPropertyException { - XRow row = execute(xRowRes,"HOUR('10:05:03') "); - assure("HOUR('10:05:03') failed!",row.getInt(1) == 10); - } - private void minute(XRowSet xRowRes) throws com.sun.star.uno.Exception,com.sun.star.beans.UnknownPropertyException { - XRow row = execute(xRowRes,"MINUTE('98-02-03 10:05:03') "); - assure("MINUTE('98-02-03 10:05:03') failed!",row.getInt(1) == 5); - } - private void second(XRowSet xRowRes) throws com.sun.star.uno.Exception,com.sun.star.beans.UnknownPropertyException { - XRow row = execute(xRowRes,"SECOND('10:05:03') "); - assure("SECOND('10:05:03') failed!",row.getInt(1) == 3); - } - private void curdate(XRowSet xRowRes) throws com.sun.star.uno.Exception,com.sun.star.beans.UnknownPropertyException { - XRow row = execute(xRowRes,"CURDATE() "); - com.sun.star.util.Date aDate = row.getDate(1); - System.out.println("CURDATE() is '" + aDate.Year + "-" + aDate.Month + "-" + aDate.Day +"'"); - } - private void curtime(XRowSet xRowRes) throws com.sun.star.uno.Exception,com.sun.star.beans.UnknownPropertyException { - XRow row = execute(xRowRes,"CURTIME() "); - com.sun.star.util.Time aTime = row.getTime(1); - System.out.println("CURTIME() is '" + aTime.Hours + ":" + aTime.Minutes + ":" + aTime.Seconds + "'"); - } - private void now(XRowSet xRowRes) throws com.sun.star.uno.Exception,com.sun.star.beans.UnknownPropertyException { - XRow row = execute(xRowRes,"NOW() "); - com.sun.star.util.DateTime aTime = row.getTimestamp(1); - System.out.println("NOW() is '" + aTime.Year + "-" + aTime.Month + "-" + aTime.Day + "'"); - System.out.println("'" + aTime.Hours + ":" + aTime.Minutes + ":" + aTime.Seconds + "'"); + final XResultSet xRes = (XResultSet) UnoRuntime.queryInterface(XResultSet.class, xRowRes); + assure("No valid row! ", xRes.next()); + + return (XRow) UnoRuntime.queryInterface(XRow.class, xRes); + } + + private void dayofweek(final XRowSet xRowRes) throws com.sun.star.uno.Exception, com.sun.star.beans.UnknownPropertyException + { + final XRow row = execute(xRowRes, "DAYOFWEEK('1998-02-03') "); + assure("DAYOFWEEK('1998-02-03') failed!", row.getInt(1) == 3); + } + + private void dayofmonth(final XRowSet xRowRes) throws com.sun.star.uno.Exception, com.sun.star.beans.UnknownPropertyException + { + final XRow row = execute(xRowRes, "DAYOFMONTH('1998-02-03') "); + assure("DAYOFMONTH('1998-02-03') failed!", row.getInt(1) == 3); + } + + private void dayofyear(final XRowSet xRowRes) throws com.sun.star.uno.Exception, com.sun.star.beans.UnknownPropertyException + { + final XRow row = execute(xRowRes, "DAYOFYEAR('1998-02-03') "); + assure("DAYOFYEAR('1998-02-03') failed!", row.getInt(1) == 34); + } + + private void month(final XRowSet xRowRes) throws com.sun.star.uno.Exception, com.sun.star.beans.UnknownPropertyException + { + final XRow row = execute(xRowRes, "month('1998-02-03') "); + assure("month('1998-02-03') failed!", row.getInt(1) == 2); + } + + private void dayname(final XRowSet xRowRes) throws com.sun.star.uno.Exception, com.sun.star.beans.UnknownPropertyException + { + final XRow row = execute(xRowRes, "DAYNAME('1998-02-05') "); + assure("DAYNAME('1998-02-05') failed!", row.getString(1).equals("Thursday")); + } + + private void monthname(final XRowSet xRowRes) throws com.sun.star.uno.Exception, com.sun.star.beans.UnknownPropertyException + { + final XRow row = execute(xRowRes, "MONTHNAME('1998-02-05') "); + assure("MONTHNAME('1998-02-05') failed!", row.getString(1).equals("February")); + } + + private void quarter(final XRowSet xRowRes) throws com.sun.star.uno.Exception, com.sun.star.beans.UnknownPropertyException + { + final XRow row = execute(xRowRes, "QUARTER('98-01-01'),QUARTER('98-04-01'),QUARTER('98-07-01'),QUARTER('98-10-01') "); + assure("QUARTER('98-01-01') failed!", row.getInt(1) == 1); + assure("QUARTER('98-04-01') failed!", row.getInt(2) == 2); + assure("QUARTER('98-07-01') failed!", row.getInt(3) == 3); + assure("QUARTER('98-10-01') failed!", row.getInt(4) == 4); + } + + private void week(final XRowSet xRowRes) throws com.sun.star.uno.Exception, com.sun.star.beans.UnknownPropertyException + { + final XRow row = execute(xRowRes, "WEEK('1998-02-20') "); + assure("WEEK('1998-02-20') failed!", row.getInt(1) == 7); + } + + private void year(final XRowSet xRowRes) throws com.sun.star.uno.Exception, com.sun.star.beans.UnknownPropertyException + { + final XRow row = execute(xRowRes, "YEAR('98-02-03') "); + assure("YEAR('98-02-03') failed!", row.getInt(1) == 98); + } + + private void hour(final XRowSet xRowRes) throws com.sun.star.uno.Exception, com.sun.star.beans.UnknownPropertyException + { + final XRow row = execute(xRowRes, "HOUR('10:05:03') "); + assure("HOUR('10:05:03') failed!", row.getInt(1) == 10); + } + + private void minute(final XRowSet xRowRes) throws com.sun.star.uno.Exception, com.sun.star.beans.UnknownPropertyException + { + final XRow row = execute(xRowRes, "MINUTE('98-02-03 10:05:03') "); + assure("MINUTE('98-02-03 10:05:03') failed!", row.getInt(1) == 5); + } + + private void second(final XRowSet xRowRes) throws com.sun.star.uno.Exception, com.sun.star.beans.UnknownPropertyException + { + final XRow row = execute(xRowRes, "SECOND('10:05:03') "); + assure("SECOND('10:05:03') failed!", row.getInt(1) == 3); + } + + private void curdate(final XRowSet xRowRes) throws com.sun.star.uno.Exception, com.sun.star.beans.UnknownPropertyException + { + final XRow row = execute(xRowRes, "CURDATE() "); + final com.sun.star.util.Date aDate = row.getDate(1); + testcase.getLog().println("CURDATE() is '" + aDate.Year + "-" + aDate.Month + "-" + aDate.Day + "'"); + } + + private void curtime(final XRowSet xRowRes) throws com.sun.star.uno.Exception, com.sun.star.beans.UnknownPropertyException + { + final XRow row = execute(xRowRes, "CURTIME() "); + final com.sun.star.util.Time aTime = row.getTime(1); + testcase.getLog().println("CURTIME() is '" + aTime.Hours + ":" + aTime.Minutes + ":" + aTime.Seconds + "'"); + } + + private void now(final XRowSet xRowRes) throws com.sun.star.uno.Exception, com.sun.star.beans.UnknownPropertyException + { + final XRow row = execute(xRowRes, "NOW() "); + final com.sun.star.util.DateTime aTime = row.getTimestamp(1); + testcase.getLog().println("NOW() is '" + aTime.Year + "-" + aTime.Month + "-" + aTime.Day + "'"); + testcase.getLog().println("'" + aTime.Hours + ":" + aTime.Minutes + ":" + aTime.Seconds + "'"); } } diff --git a/connectivity/qa/drivers/dbase/DBaseDriverTest.java b/connectivity/qa/drivers/dbase/DBaseDriverTest.java index 6fcbfa2d9a78..fd15eee54d00 100644 --- a/connectivity/qa/drivers/dbase/DBaseDriverTest.java +++ b/connectivity/qa/drivers/dbase/DBaseDriverTest.java @@ -27,60 +27,71 @@ * for a copy of the LGPLv3 License. * ************************************************************************/ -package complex.connectivity; +package qa.drivers.dbase; -import com.sun.star.uno.UnoRuntime; -import com.sun.star.util.XCloseable; import com.sun.star.sdbc.*; -import com.sun.star.sdb.*; -import com.sun.star.beans.PropertyValue; -import com.sun.star.beans.XPropertySet; - import com.sun.star.lang.XMultiServiceFactory; - import complexlib.ComplexTestCase; - -import java.io.PrintWriter; - -import util.utils; import java.util.*; import java.io.*; +import share.LogWriter; //import complex.connectivity.DBaseStringFunctions; -public class DBaseDriverTest extends ComplexTestCase { +public class DBaseDriverTest extends ComplexTestCase +{ private static Properties props = new Properties(); private XDriver m_xDiver; - private String where = "FROM \"biblio\" \"biblio\" where \"Identifier\" = 'BOR00'"; + private String where = "FROM \"biblio\" \"biblio\" where \"Identifier\" = 'BOR00'"; - static { - try { + static + { + try + { String propsFile = "test.properties"; - props.load( new FileInputStream(propsFile) ); - } catch(Exception ex) { + props.load(new FileInputStream(propsFile)); + } + catch (Exception ex) + { throw new RuntimeException(ex); } } - public String[] getTestMethodNames() { - return new String[] { "Functions" }; + public String[] getTestMethodNames() + { + return new String[] + { + "Functions" + }; } - public String getTestObjectName() { + public String getTestObjectName() + { return "DBaseDriverTest"; } - public void assure2(String s,boolean b){ - assure(s,b); + + public void assure2(String s, boolean b) + { + assure(s, b); + } + + public LogWriter getLog() + { + return log; } - public void Functions() throws com.sun.star.uno.Exception,com.sun.star.beans.UnknownPropertyException { - DBaseStringFunctions aStringTest = new DBaseStringFunctions(((XMultiServiceFactory)param.getMSF()),this); + public void Functions() throws com.sun.star.uno.Exception, com.sun.star.beans.UnknownPropertyException + { + DBaseStringFunctions aStringTest = new DBaseStringFunctions(((XMultiServiceFactory) param.getMSF()), this); aStringTest.testFunctions(); - DBaseNumericFunctions aNumericTest = new DBaseNumericFunctions(((XMultiServiceFactory)param.getMSF()),this); + DBaseNumericFunctions aNumericTest = new DBaseNumericFunctions(((XMultiServiceFactory) param.getMSF()), this); aNumericTest.testFunctions(); - DBaseDateFunctions aDateTest = new DBaseDateFunctions(((XMultiServiceFactory)param.getMSF()),this); + DBaseDateFunctions aDateTest = new DBaseDateFunctions(((XMultiServiceFactory) param.getMSF()), this); aDateTest.testFunctions(); + + DBaseSqlTests aSqlTest = new DBaseSqlTests(((XMultiServiceFactory) param.getMSF()), this); + aSqlTest.testFunctions(); } } diff --git a/connectivity/qa/drivers/dbase/DBaseNumericFunctions.java b/connectivity/qa/drivers/dbase/DBaseNumericFunctions.java index 3e693c35f9a0..b31e92653f71 100644 --- a/connectivity/qa/drivers/dbase/DBaseNumericFunctions.java +++ b/connectivity/qa/drivers/dbase/DBaseNumericFunctions.java @@ -27,285 +27,379 @@ * for a copy of the LGPLv3 License. * ************************************************************************/ -package complex.connectivity; +package qa.drivers.dbase; -import complex.connectivity.DBaseDriverTest; import com.sun.star.uno.UnoRuntime; -import com.sun.star.util.XCloseable; import com.sun.star.sdbc.*; -import com.sun.star.sdb.*; -import com.sun.star.beans.PropertyValue; import com.sun.star.beans.XPropertySet; - import com.sun.star.lang.XMultiServiceFactory; -import complexlib.ComplexTestCase; - -import java.io.PrintWriter; - -import util.utils; -import java.util.*; -import java.io.*; +public class DBaseNumericFunctions +{ -public class DBaseNumericFunctions { + private final String where = "FROM \"biblio\" \"biblio\" where \"Identifier\" = 'BOR00'"; + private final XMultiServiceFactory m_xORB; + private final DBaseDriverTest testcase; - private String where = "FROM \"biblio\" \"biblio\" where \"Identifier\" = 'BOR00'"; - private XMultiServiceFactory m_xORB; - private DBaseDriverTest testcase; - public DBaseNumericFunctions(XMultiServiceFactory _xORB,DBaseDriverTest _testcase){ - m_xORB = _xORB; - testcase = _testcase; - } + public DBaseNumericFunctions(final XMultiServiceFactory _xORB, final DBaseDriverTest _testcase) + { + m_xORB = _xORB; + testcase = _testcase; + } - private void assure(String s,boolean b){ - testcase.assure2(s,b); - } + private void assure(final String s, final boolean b) + { + testcase.assure2(s, b); + } - public void testFunctions() throws com.sun.star.uno.Exception,com.sun.star.beans.UnknownPropertyException { - XRowSet xRowRes = (XRowSet)UnoRuntime.queryInterface(XRowSet.class, - m_xORB.createInstance("com.sun.star.sdb.RowSet")); + public void testFunctions() throws com.sun.star.uno.Exception, com.sun.star.beans.UnknownPropertyException + { + final XRowSet xRowRes = (XRowSet) UnoRuntime.queryInterface(XRowSet.class, + m_xORB.createInstance("com.sun.star.sdb.RowSet")); - System.out.println("starting Numeric function test"); + testcase.getLog().println("starting Numeric function test"); // set the properties needed to connect to a database - XPropertySet xProp = (XPropertySet)UnoRuntime.queryInterface(XPropertySet.class,xRowRes); - xProp.setPropertyValue("DataSourceName","Bibliography"); + final XPropertySet xProp = (XPropertySet) UnoRuntime.queryInterface(XPropertySet.class, xRowRes); + xProp.setPropertyValue("DataSourceName", "Bibliography"); - xProp.setPropertyValue("CommandType",new Integer(com.sun.star.sdb.CommandType.COMMAND)); + xProp.setPropertyValue("CommandType", Integer.valueOf(com.sun.star.sdb.CommandType.COMMAND)); - try { + try + { abs(xRowRes); - } catch( SQLException ex){ - assure("abs " + ex.getMessage(),false); + } + catch (SQLException ex) + { + assure("abs " + ex.getMessage(), false); throw ex; } - try{ + try + { acos(xRowRes); - } catch( SQLException ex){ - assure("acos " + ex.getMessage(),false); + } + catch (SQLException ex) + { + assure("acos " + ex.getMessage(), false); throw ex; } - try{ + try + { asin(xRowRes); - } catch( SQLException ex){ - assure("asin " + ex.getMessage(),false); + } + catch (SQLException ex) + { + assure("asin " + ex.getMessage(), false); throw ex; } - try{ + try + { atan(xRowRes); - } catch( SQLException ex){ - assure("atan " + ex.getMessage(),false); + } + catch (SQLException ex) + { + assure("atan " + ex.getMessage(), false); throw ex; } - try{ + try + { atan2(xRowRes); - } catch( SQLException ex){ - assure("atan2 " + ex.getMessage(),false); + } + catch (SQLException ex) + { + assure("atan2 " + ex.getMessage(), false); throw ex; } - try{ + try + { ceiling(xRowRes); - } catch( SQLException ex){ - assure("ceiling " + ex.getMessage(),false); + } + catch (SQLException ex) + { + assure("ceiling " + ex.getMessage(), false); throw ex; } - try{ + try + { cos(xRowRes); - } catch( SQLException ex){ - assure("cos " + ex.getMessage(),false); + } + catch (SQLException ex) + { + assure("cos " + ex.getMessage(), false); throw ex; } - try{ + try + { degrees(xRowRes); - } catch( SQLException ex){ - assure("degrees " + ex.getMessage(),false); + } + catch (SQLException ex) + { + assure("degrees " + ex.getMessage(), false); throw ex; } - try{ + try + { exp(xRowRes); - } catch( SQLException ex){ - assure("exp " + ex.getMessage(),false); + } + catch (SQLException ex) + { + assure("exp " + ex.getMessage(), false); throw ex; } - try{ + try + { floor(xRowRes); - } catch( SQLException ex){ - assure("floor " + ex.getMessage(),false); + } + catch (SQLException ex) + { + assure("floor " + ex.getMessage(), false); throw ex; } - try{ + try + { log(xRowRes); - } catch( SQLException ex){ - assure("log " + ex.getMessage(),false); + } + catch (SQLException ex) + { + assure("log " + ex.getMessage(), false); throw ex; } - try{ + try + { log10(xRowRes); - } catch( SQLException ex){ - assure("log10 " + ex.getMessage(),false); + } + catch (SQLException ex) + { + assure("log10 " + ex.getMessage(), false); throw ex; } - try{ + try + { mod(xRowRes); - } catch( SQLException ex){ - assure("mod " + ex.getMessage(),false); + } + catch (SQLException ex) + { + assure("mod " + ex.getMessage(), false); throw ex; } - try{ + try + { pi(xRowRes); - } catch( SQLException ex){ - assure("pi " + ex.getMessage(),false); + } + catch (SQLException ex) + { + assure("pi " + ex.getMessage(), false); throw ex; } - try{ + try + { pow(xRowRes); - } catch( SQLException ex){ - assure("pow " + ex.getMessage(),false); + } + catch (SQLException ex) + { + assure("pow " + ex.getMessage(), false); throw ex; } - try{ + try + { radians(xRowRes); - } catch( SQLException ex){ - assure("radians " + ex.getMessage(),false); + } + catch (SQLException ex) + { + assure("radians " + ex.getMessage(), false); throw ex; } - try{ + try + { round(xRowRes); - } catch( SQLException ex){ - assure("round " + ex.getMessage(),false); + } + catch (SQLException ex) + { + assure("round " + ex.getMessage(), false); throw ex; } - try{ + try + { sign(xRowRes); - } catch( SQLException ex){ - assure("sign " + ex.getMessage(),false); + } + catch (SQLException ex) + { + assure("sign " + ex.getMessage(), false); throw ex; } - try{ + try + { sin(xRowRes); - } catch( SQLException ex){ - assure("sin " + ex.getMessage(),false); + } + catch (SQLException ex) + { + assure("sin " + ex.getMessage(), false); throw ex; } - try{ + try + { sqrt(xRowRes); - } catch( SQLException ex){ - assure("sqrt " + ex.getMessage(),false); + } + catch (SQLException ex) + { + assure("sqrt " + ex.getMessage(), false); throw ex; } - try{ + try + { tan(xRowRes); - } catch( SQLException ex){ - assure("tan " + ex.getMessage(),false); + } + catch (SQLException ex) + { + assure("tan " + ex.getMessage(), false); throw ex; } } - private XRow execute(XRowSet xRowRes,String sql) throws com.sun.star.uno.Exception,com.sun.star.beans.UnknownPropertyException { - XPropertySet xProp = (XPropertySet)UnoRuntime.queryInterface(XPropertySet.class,xRowRes); - xProp.setPropertyValue("Command","SELECT " + sql + where); + private XRow execute(final XRowSet xRowRes,final String sql) throws com.sun.star.uno.Exception, com.sun.star.beans.UnknownPropertyException + { + final XPropertySet xProp = (XPropertySet) UnoRuntime.queryInterface(XPropertySet.class, xRowRes); + xProp.setPropertyValue("Command", "SELECT " + sql + where); xRowRes.execute(); - XResultSet xRes = (XResultSet)UnoRuntime.queryInterface(XResultSet.class,xRowRes); - assure("No valid row! ",xRes.next()); + final XResultSet xRes = (XResultSet) UnoRuntime.queryInterface(XResultSet.class, xRowRes); + assure("No valid row! ", xRes.next()); - return (XRow)UnoRuntime.queryInterface(XRow.class, xRes); + return (XRow) UnoRuntime.queryInterface(XRow.class, xRes); } - private void abs(XRowSet xRowRes) throws com.sun.star.uno.Exception,com.sun.star.beans.UnknownPropertyException { - XRow row = execute(xRowRes,"ABS(2),ABS(-32) "); - assure("ABS(2) failed!",row.getInt(1) == 2); - assure("ABS(-32) failed!",row.getInt(2) == 32); + private void abs(final XRowSet xRowRes) throws com.sun.star.uno.Exception, com.sun.star.beans.UnknownPropertyException + { + final XRow row = execute(xRowRes, "ABS(2),ABS(-32) "); + assure("ABS(2) failed!", row.getInt(1) == 2); + assure("ABS(-32) failed!", row.getInt(2) == 32); } - private void sign(XRowSet xRowRes) throws com.sun.star.uno.Exception,com.sun.star.beans.UnknownPropertyException { - XRow row = execute(xRowRes,"SIGN(-32),SIGN(0),SIGN(234) "); - assure("SIGN(-32)failed!",row.getInt(1) == -1); - assure("SIGN(0) failed!",row.getInt(2) == 0); - assure("SIGN(234) failed!",row.getInt(3) == 1); + private void sign(final XRowSet xRowRes) throws com.sun.star.uno.Exception, com.sun.star.beans.UnknownPropertyException + { + final XRow row = execute(xRowRes, "SIGN(-32),SIGN(0),SIGN(234) "); + assure("SIGN(-32)failed!", row.getInt(1) == -1); + assure("SIGN(0) failed!", row.getInt(2) == 0); + assure("SIGN(234) failed!", row.getInt(3) == 1); } - private void mod(XRowSet xRowRes) throws com.sun.star.uno.Exception,com.sun.star.beans.UnknownPropertyException { - XRow row = execute(xRowRes,"MOD(234, 10) "); - assure("MOD(234, 10) failed!",row.getInt(1) == 4); + private void mod(final XRowSet xRowRes) throws com.sun.star.uno.Exception, com.sun.star.beans.UnknownPropertyException + { + final XRow row = execute(xRowRes, "MOD(234, 10) "); + assure("MOD(234, 10) failed!", row.getInt(1) == 4); } - private void floor(XRowSet xRowRes) throws com.sun.star.uno.Exception,com.sun.star.beans.UnknownPropertyException { - XRow row = execute(xRowRes,"FLOOR(1.23),FLOOR(-1.23) "); - assure("FLOOR(1.23) failed!",row.getInt(1) == 1); - assure("FLOOR(-1.23) failed!",row.getInt(2) == -2); + private void floor(final XRowSet xRowRes) throws com.sun.star.uno.Exception, com.sun.star.beans.UnknownPropertyException + { + final XRow row = execute(xRowRes, "FLOOR(1.23),FLOOR(-1.23) "); + assure("FLOOR(1.23) failed!", row.getInt(1) == 1); + assure("FLOOR(-1.23) failed!", row.getInt(2) == -2); } - private void ceiling(XRowSet xRowRes) throws com.sun.star.uno.Exception,com.sun.star.beans.UnknownPropertyException { - XRow row = execute(xRowRes,"CEILING(1.23),CEILING(-1.23) "); - assure("CEILING(1.23) failed!",row.getInt(1) == 2); - assure("CEILING(-1.23) failed!",row.getInt(2) == -1); + + private void ceiling(final XRowSet xRowRes) throws com.sun.star.uno.Exception, com.sun.star.beans.UnknownPropertyException + { + final XRow row = execute(xRowRes, "CEILING(1.23),CEILING(-1.23) "); + assure("CEILING(1.23) failed!", row.getInt(1) == 2); + assure("CEILING(-1.23) failed!", row.getInt(2) == -1); } - private void round(XRowSet xRowRes) throws com.sun.star.uno.Exception,com.sun.star.beans.UnknownPropertyException { - XRow row = execute(xRowRes,"ROUND(-1.23),ROUND(1.298, 1) "); - assure("ROUND(-1.23) failed!",row.getInt(1) == -1); - assure("ROUND(1.298, 1) failed!",row.getDouble(2) == 1.3); + + private void round(final XRowSet xRowRes) throws com.sun.star.uno.Exception, com.sun.star.beans.UnknownPropertyException + { + final XRow row = execute(xRowRes, "ROUND(-1.23),ROUND(1.298, 1) "); + assure("ROUND(-1.23) failed!", row.getInt(1) == -1); + assure("ROUND(1.298, 1) failed!", row.getDouble(2) == 1.3); } - private void exp(XRowSet xRowRes) throws com.sun.star.uno.Exception,com.sun.star.beans.UnknownPropertyException { - XRow row = execute(xRowRes,"EXP(2),EXP(-2) "); - assure("EXP(2) failed!",(float)row.getDouble(1) == (float)java.lang.Math.exp(2) ); - assure("EXP(-2) failed!",(float)row.getDouble(2) == (float)java.lang.Math.exp(-2)); + + private void exp(final XRowSet xRowRes) throws com.sun.star.uno.Exception, com.sun.star.beans.UnknownPropertyException + { + final XRow row = execute(xRowRes, "EXP(2),EXP(-2) "); + assure("EXP(2) failed!", (float) row.getDouble(1) == (float) java.lang.Math.exp(2)); + assure("EXP(-2) failed!", (float) row.getDouble(2) == (float) java.lang.Math.exp(-2)); } - private void log(XRowSet xRowRes) throws com.sun.star.uno.Exception,com.sun.star.beans.UnknownPropertyException { - XRow row = execute(xRowRes,"LOG(2),LOG(-2) "); - assure("LOG(2) failed!",(float)row.getDouble(1) == (float)java.lang.Math.log(2) ); + + private void log(final XRowSet xRowRes) throws com.sun.star.uno.Exception, com.sun.star.beans.UnknownPropertyException + { + final XRow row = execute(xRowRes, "LOG(2),LOG(-2) "); + assure("LOG(2) failed!", (float) row.getDouble(1) == (float) java.lang.Math.log(2)); row.getDouble(2); - assure("LOG(-2) failed!",row.wasNull()); + assure("LOG(-2) failed!", row.wasNull()); } - private void log10(XRowSet xRowRes) throws com.sun.star.uno.Exception,com.sun.star.beans.UnknownPropertyException { - XRow row = execute(xRowRes,"LOG10(100) "); - assure("LOG10(100) failed!",row.getDouble(1) == 2.0 ); + + private void log10(final XRowSet xRowRes) throws com.sun.star.uno.Exception, com.sun.star.beans.UnknownPropertyException + { + final XRow row = execute(xRowRes, "LOG10(100) "); + assure("LOG10(100) failed!", row.getDouble(1) == 2.0); } - private void pow(XRowSet xRowRes) throws com.sun.star.uno.Exception,com.sun.star.beans.UnknownPropertyException { - XRow row = execute(xRowRes,"POWER(2,2) "); - assure("POWER(2,2) failed!",row.getDouble(1) == 4.0 ); + + private void pow(final XRowSet xRowRes) throws com.sun.star.uno.Exception, com.sun.star.beans.UnknownPropertyException + { + final XRow row = execute(xRowRes, "POWER(2,2) "); + assure("POWER(2,2) failed!", row.getDouble(1) == 4.0); } - private void sqrt(XRowSet xRowRes) throws com.sun.star.uno.Exception,com.sun.star.beans.UnknownPropertyException { - XRow row = execute(xRowRes,"SQRT(4) "); - assure("SQRT(4) failed!",row.getDouble(1) == 2.0 ); + + private void sqrt(final XRowSet xRowRes) throws com.sun.star.uno.Exception, com.sun.star.beans.UnknownPropertyException + { + final XRow row = execute(xRowRes, "SQRT(4) "); + assure("SQRT(4) failed!", row.getDouble(1) == 2.0); } - private void pi(XRowSet xRowRes) throws com.sun.star.uno.Exception,com.sun.star.beans.UnknownPropertyException { - XRow row = execute(xRowRes,"PI() "); - assure("PI() failed!",(float)row.getDouble(1) == (float)java.lang.Math.PI ); + + private void pi(final XRowSet xRowRes) throws com.sun.star.uno.Exception, com.sun.star.beans.UnknownPropertyException + { + final XRow row = execute(xRowRes, "PI() "); + assure("PI() failed!", (float) row.getDouble(1) == (float) java.lang.Math.PI); } - private void cos(XRowSet xRowRes) throws com.sun.star.uno.Exception,com.sun.star.beans.UnknownPropertyException { - XRow row = execute(xRowRes,"COS(PI()) "); - assure("COS(PI()) failed!",row.getDouble(1) == -1.0 ); + + private void cos(final XRowSet xRowRes) throws com.sun.star.uno.Exception, com.sun.star.beans.UnknownPropertyException + { + final XRow row = execute(xRowRes, "COS(PI()) "); + assure("COS(PI()) failed!", row.getDouble(1) == -1.0); } - private void sin(XRowSet xRowRes) throws com.sun.star.uno.Exception,com.sun.star.beans.UnknownPropertyException { - XRow row = execute(xRowRes,"SIN(2) "); - assure("SIN(PI()) failed!",(float)row.getDouble(1) == (float)java.lang.Math.sin( 2 ) ); + + private void sin(final XRowSet xRowRes) throws com.sun.star.uno.Exception, com.sun.star.beans.UnknownPropertyException + { + final XRow row = execute(xRowRes, "SIN(2) "); + assure("SIN(PI()) failed!", (float) row.getDouble(1) == (float) java.lang.Math.sin(2)); } - private void tan(XRowSet xRowRes) throws com.sun.star.uno.Exception,com.sun.star.beans.UnknownPropertyException { - XRow row = execute(xRowRes,"TAN(PI()+1) "); - assure("TAN(PI()+1) failed!",(float)row.getDouble(1) == (float)java.lang.Math.tan(java.lang.Math.PI+1.0) ); + + private void tan(final XRowSet xRowRes) throws com.sun.star.uno.Exception, com.sun.star.beans.UnknownPropertyException + { + final XRow row = execute(xRowRes, "TAN(PI()+1) "); + assure("TAN(PI()+1) failed!", (float) row.getDouble(1) == (float) java.lang.Math.tan(java.lang.Math.PI + 1.0)); } - private void acos(XRowSet xRowRes) throws com.sun.star.uno.Exception,com.sun.star.beans.UnknownPropertyException { - XRow row = execute(xRowRes,"ACOS(1) "); - assure("ACOS(1) failed!",(float)row.getDouble(1) == 0.0 ); + + private void acos(final XRowSet xRowRes) throws com.sun.star.uno.Exception, com.sun.star.beans.UnknownPropertyException + { + final XRow row = execute(xRowRes, "ACOS(1) "); + assure("ACOS(1) failed!", (float) row.getDouble(1) == 0.0); } - private void asin(XRowSet xRowRes) throws com.sun.star.uno.Exception,com.sun.star.beans.UnknownPropertyException { - XRow row = execute(xRowRes,"ASIN(0) "); - assure("ASIN(0) failed!",(float)row.getDouble(1) == (float)java.lang.Math.asin(0.0) ); + + private void asin(final XRowSet xRowRes) throws com.sun.star.uno.Exception, com.sun.star.beans.UnknownPropertyException + { + final XRow row = execute(xRowRes, "ASIN(0) "); + assure("ASIN(0) failed!", (float) row.getDouble(1) == (float) java.lang.Math.asin(0.0)); } - private void atan(XRowSet xRowRes) throws com.sun.star.uno.Exception,com.sun.star.beans.UnknownPropertyException { - XRow row = execute(xRowRes,"ATAN(0) "); - assure("ATAN(0) failed!",row.getDouble(1) == 0.0 ); + + private void atan(final XRowSet xRowRes) throws com.sun.star.uno.Exception, com.sun.star.beans.UnknownPropertyException + { + final XRow row = execute(xRowRes, "ATAN(0) "); + assure("ATAN(0) failed!", row.getDouble(1) == 0.0); } - private void atan2(XRowSet xRowRes) throws com.sun.star.uno.Exception,com.sun.star.beans.UnknownPropertyException { - XRow row = execute(xRowRes,"ATAN2(0,2) "); - assure("ATAN2(0,2) failed!",(float)row.getDouble(1) == 0.0 ); + + private void atan2(final XRowSet xRowRes) throws com.sun.star.uno.Exception, com.sun.star.beans.UnknownPropertyException + { + final XRow row = execute(xRowRes, "ATAN2(0,2) "); + assure("ATAN2(0,2) failed!", (float) row.getDouble(1) == 0.0); } - private void degrees(XRowSet xRowRes) throws com.sun.star.uno.Exception,com.sun.star.beans.UnknownPropertyException { - XRow row = execute(xRowRes,"DEGREES(PI()) "); - assure("DEGREES(PI()) failed!",row.getDouble(1) == 180.0 ); + + private void degrees(final XRowSet xRowRes) throws com.sun.star.uno.Exception, com.sun.star.beans.UnknownPropertyException + { + final XRow row = execute(xRowRes, "DEGREES(PI()) "); + assure("DEGREES(PI()) failed!", row.getDouble(1) == 180.0); } - private void radians(XRowSet xRowRes) throws com.sun.star.uno.Exception,com.sun.star.beans.UnknownPropertyException { - XRow row = execute(xRowRes,"RADIANS(90) "); - assure("RADIANS(90) failed!",(float)row.getDouble(1) == (float)(java.lang.Math.PI / 2.0) ); + + private void radians(final XRowSet xRowRes) throws com.sun.star.uno.Exception, com.sun.star.beans.UnknownPropertyException + { + final XRow row = execute(xRowRes, "RADIANS(90) "); + assure("RADIANS(90) failed!", (float) row.getDouble(1) == (float) (java.lang.Math.PI / 2.0)); } } diff --git a/connectivity/qa/drivers/dbase/DBaseSqlTests.java b/connectivity/qa/drivers/dbase/DBaseSqlTests.java new file mode 100644 index 000000000000..0151952ad76b --- /dev/null +++ b/connectivity/qa/drivers/dbase/DBaseSqlTests.java @@ -0,0 +1,99 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: DBaseStringFunctions.java,v $ + * $Revision: 1.6 $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ +package qa.drivers.dbase; + +import com.sun.star.uno.UnoRuntime; +import com.sun.star.sdbc.*; +import com.sun.star.beans.XPropertySet; +import com.sun.star.lang.XMultiServiceFactory; + +public class DBaseSqlTests +{ + private final XMultiServiceFactory m_xORB; + private final DBaseDriverTest testcase; + + public DBaseSqlTests(final XMultiServiceFactory _xORB,final DBaseDriverTest _testcase) + { + m_xORB = _xORB; + testcase = _testcase; + } + + private void assure(final String s,final boolean b) + { + testcase.assure2(s, b); + } + + public void testFunctions() throws com.sun.star.uno.Exception, com.sun.star.beans.UnknownPropertyException + { + final XRowSet xRowRes = (XRowSet) UnoRuntime.queryInterface(XRowSet.class, + m_xORB.createInstance("com.sun.star.sdb.RowSet")); + + testcase.getLog().println("starting SQL test"); + // set the properties needed to connect to a database + final XPropertySet xProp = (XPropertySet) UnoRuntime.queryInterface(XPropertySet.class, xRowRes); + xProp.setPropertyValue("DataSourceName", "Bibliography"); + xProp.setPropertyValue("CommandType", Integer.valueOf(com.sun.star.sdb.CommandType.COMMAND)); + + execute(xRowRes,"1 FROM \"biblio\" \"biblio\" where \"Identifier\" like 'B%'"); + execute(xRowRes,"1 FROM \"biblio\" \"biblio\" where not \"Identifier\" like 'B%'"); + execute(xRowRes,"1 FROM \"biblio\" \"biblio\" where not \"Identifier\" not like 'B%'"); + execute(xRowRes,"1 FROM \"biblio\" \"biblio\" where not(0 = 1)"); + execute(xRowRes,"1 FROM \"biblio\" \"biblio\" where 0 = 0"); + execute(xRowRes,"1 FROM \"biblio\" \"biblio\" where (0 = 0)"); + execute(xRowRes,"1 FROM \"biblio\" \"biblio\" where 0 <> 1"); + execute(xRowRes,"1 FROM \"biblio\" \"biblio\" where 0 < 1"); + execute(xRowRes,"1 FROM \"biblio\" \"biblio\" where 2 > 1"); + execute(xRowRes,"1,1+1,'a' + 'b' FROM \"biblio\" \"biblio\" where 2 > 1"); + // execute(xRowRes,"1 FROM \"biblio\" \"biblio\" where (0 = 0) is true"); + // execute(xRowRes,"1 FROM \"biblio\" \"biblio\" where not (0 = 0) is not true"); + // execute(xRowRes,"1 FROM \"biblio\" \"biblio\" where 1 between 0 and 2"); + execute(xRowRes,"1 FROM \"biblio\" \"biblio\" where not \"Identifier\" is NULL"); + execute(xRowRes,"1 FROM \"biblio\" \"biblio\" where \"Identifier\" is not NULL"); + execute(xRowRes,"1 FROM \"biblio\" \"biblio\" where \"Identifier\" = \"Identifier\""); + execute(xRowRes,"1 FROM \"biblio\" \"biblio\" where not(not(\"Identifier\" = \"Identifier\"))"); + execute(xRowRes,"1 FROM \"biblio\" \"biblio\" where (1 = 1 and 2 = 1) or 3 = 33 or 4 = 44 or ('a' = 'a' and 'b' = 'b')"); + } + + private void execute(final XRowSet xRowRes, String sql) throws com.sun.star.uno.Exception, com.sun.star.beans.UnknownPropertyException + { + try + { + final XPropertySet xProp = (XPropertySet) UnoRuntime.queryInterface(XPropertySet.class, xRowRes); + xProp.setPropertyValue("Command", "SELECT " + sql); + xRowRes.execute(); + } + catch(SQLException e) + { + testcase.getLog().println(sql + " Error: " + e.getMessage()); + } + } + + +} diff --git a/connectivity/qa/drivers/dbase/DBaseStringFunctions.java b/connectivity/qa/drivers/dbase/DBaseStringFunctions.java index 09ce4903b6a9..158a3f8e9489 100644 --- a/connectivity/qa/drivers/dbase/DBaseStringFunctions.java +++ b/connectivity/qa/drivers/dbase/DBaseStringFunctions.java @@ -27,244 +27,300 @@ * for a copy of the LGPLv3 License. * ************************************************************************/ -package complex.connectivity; +package qa.drivers.dbase; -import complex.connectivity.DBaseDriverTest; import com.sun.star.uno.UnoRuntime; -import com.sun.star.util.XCloseable; import com.sun.star.sdbc.*; -import com.sun.star.sdb.*; -import com.sun.star.beans.PropertyValue; import com.sun.star.beans.XPropertySet; - import com.sun.star.lang.XMultiServiceFactory; -import complexlib.ComplexTestCase; - -import java.io.PrintWriter; - -import util.utils; -import java.util.*; -import java.io.*; - +public class DBaseStringFunctions +{ + private String where = "FROM \"biblio\" \"biblio\" where \"Identifier\" = 'BOR00'"; + private final XMultiServiceFactory m_xORB; + private final DBaseDriverTest testcase; -public class DBaseStringFunctions { - - private String where = "FROM \"biblio\" \"biblio\" where \"Identifier\" = 'BOR00'"; - private XMultiServiceFactory m_xORB; - private DBaseDriverTest testcase; - public DBaseStringFunctions(XMultiServiceFactory _xORB,DBaseDriverTest _testcase){ - m_xORB = _xORB; - testcase = _testcase; - } + public DBaseStringFunctions(final XMultiServiceFactory _xORB,final DBaseDriverTest _testcase) + { + m_xORB = _xORB; + testcase = _testcase; + } - private void assure(String s,boolean b){ - testcase.assure2(s,b); - } + private void assure(final String s,final boolean b) + { + testcase.assure2(s, b); + } - public void testFunctions() throws com.sun.star.uno.Exception,com.sun.star.beans.UnknownPropertyException { - XRowSet xRowRes = (XRowSet)UnoRuntime.queryInterface(XRowSet.class, - m_xORB.createInstance("com.sun.star.sdb.RowSet")); + public void testFunctions() throws com.sun.star.uno.Exception, com.sun.star.beans.UnknownPropertyException + { + final XRowSet xRowRes = (XRowSet) UnoRuntime.queryInterface(XRowSet.class, + m_xORB.createInstance("com.sun.star.sdb.RowSet")); - System.out.println("starting String function test"); + testcase.getLog().println("starting String function test"); // set the properties needed to connect to a database - XPropertySet xProp = (XPropertySet)UnoRuntime.queryInterface(XPropertySet.class,xRowRes); - xProp.setPropertyValue("DataSourceName","Bibliography"); + final XPropertySet xProp = (XPropertySet) UnoRuntime.queryInterface(XPropertySet.class, xRowRes); + xProp.setPropertyValue("DataSourceName", "Bibliography"); - xProp.setPropertyValue("CommandType",new Integer(com.sun.star.sdb.CommandType.COMMAND)); + xProp.setPropertyValue("CommandType", Integer.valueOf(com.sun.star.sdb.CommandType.COMMAND)); - try { - upper(xRowRes); - } catch( SQLException ex){ - assure("upper " + ex.getMessage(),false); + try + { + upper(xRowRes); + } + catch (SQLException ex) + { + assure("upper " + ex.getMessage(), false); throw ex; } - try{ - lower(xRowRes); - } catch( SQLException ex){ - assure("lower " + ex.getMessage(),false); + try + { + lower(xRowRes); + } + catch (SQLException ex) + { + assure("lower " + ex.getMessage(), false); throw ex; } - try{ - acsii(xRowRes); - } catch( SQLException ex){ - assure("ascii " + ex.getMessage(),false); + try + { + acsii(xRowRes); + } + catch (SQLException ex) + { + assure("ascii " + ex.getMessage(), false); throw ex; } - try{ - char_length(xRowRes); - } catch( SQLException ex){ - assure("char_len " + ex.getMessage(),false); + try + { + char_length(xRowRes); + } + catch (SQLException ex) + { + assure("char_len " + ex.getMessage(), false); throw ex; } - try{ - concat(xRowRes); - } catch( SQLException ex){ - assure("concat " + ex.getMessage(),false); + try + { + concat(xRowRes); + } + catch (SQLException ex) + { + assure("concat " + ex.getMessage(), false); throw ex; } - try{ + try + { chartest(xRowRes); - } catch( SQLException ex){ - assure("char " + ex.getMessage(),false); + } + catch (SQLException ex) + { + assure("char " + ex.getMessage(), false); throw ex; } - try{ - locate(xRowRes); - } catch( SQLException ex){ - assure("locate " + ex.getMessage(),false); + try + { + locate(xRowRes); + } + catch (SQLException ex) + { + assure("locate " + ex.getMessage(), false); throw ex; } - try{ - substring(xRowRes); - } catch( SQLException ex){ - assure("substr " + ex.getMessage(),false); + try + { + substring(xRowRes); + } + catch (SQLException ex) + { + assure("substr " + ex.getMessage(), false); throw ex; } - try{ - ltrim(xRowRes); - } catch( SQLException ex){ - assure("ltrim " + ex.getMessage(),false); + try + { + ltrim(xRowRes); + } + catch (SQLException ex) + { + assure("ltrim " + ex.getMessage(), false); throw ex; } - try{ - rtrim(xRowRes); - } catch( SQLException ex){ - assure("rtrim " + ex.getMessage(),false); + try + { + rtrim(xRowRes); + } + catch (SQLException ex) + { + assure("rtrim " + ex.getMessage(), false); throw ex; } - try{ - space(xRowRes); - } catch( SQLException ex){ - assure("space " + ex.getMessage(),false); + try + { + space(xRowRes); + } + catch (SQLException ex) + { + assure("space " + ex.getMessage(), false); throw ex; } - try{ - replace(xRowRes); - } catch( SQLException ex){ - assure("replace " + ex.getMessage(),false); + try + { + replace(xRowRes); + } + catch (SQLException ex) + { + assure("replace " + ex.getMessage(), false); throw ex; } - try{ - repeat(xRowRes); - } catch( SQLException ex){ - assure("repeat " + ex.getMessage(),false); + try + { + repeat(xRowRes); + } + catch (SQLException ex) + { + assure("repeat " + ex.getMessage(), false); throw ex; } - try{ - insert(xRowRes); - } catch( SQLException ex){ - assure("insert " + ex.getMessage(),false); + try + { + insert(xRowRes); + } + catch (SQLException ex) + { + assure("insert " + ex.getMessage(), false); throw ex; } - try{ - left(xRowRes); - } catch( SQLException ex){ - assure("left " + ex.getMessage(),false); + try + { + left(xRowRes); + } + catch (SQLException ex) + { + assure("left " + ex.getMessage(), false); throw ex; } - try{ - right(xRowRes); - } catch( SQLException ex){ - assure("right " + ex.getMessage(),false); + try + { + right(xRowRes); + } + catch (SQLException ex) + { + assure("right " + ex.getMessage(), false); throw ex; } } - private XRow execute(XRowSet xRowRes,String sql) throws com.sun.star.uno.Exception,com.sun.star.beans.UnknownPropertyException { - XPropertySet xProp = (XPropertySet)UnoRuntime.queryInterface(XPropertySet.class,xRowRes); - xProp.setPropertyValue("Command","SELECT " + sql + where); + private XRow execute(final XRowSet xRowRes, String sql) throws com.sun.star.uno.Exception, com.sun.star.beans.UnknownPropertyException + { + final XPropertySet xProp = (XPropertySet) UnoRuntime.queryInterface(XPropertySet.class, xRowRes); + xProp.setPropertyValue("Command", "SELECT " + sql + where); xRowRes.execute(); - XResultSet xRes = (XResultSet)UnoRuntime.queryInterface(XResultSet.class,xRowRes); - assure("No valid row! ",xRes.next()); + final XResultSet xRes = (XResultSet) UnoRuntime.queryInterface(XResultSet.class, xRowRes); + assure("No valid row! ", xRes.next()); - return (XRow)UnoRuntime.queryInterface(XRow.class, xRes); + return (XRow) UnoRuntime.queryInterface(XRow.class, xRes); } - private void upper(XRowSet xRowRes) throws com.sun.star.uno.Exception,com.sun.star.beans.UnknownPropertyException { - XRow row = execute(xRowRes,"upper('test'),UCASE('test') "); - assure("upper('test') failed!",row.getString(1).equals("TEST")); - assure("ucase('test') failed!",row.getString(2).equals("TEST")); + private void upper(final XRowSet xRowRes) throws com.sun.star.uno.Exception, com.sun.star.beans.UnknownPropertyException + { + final XRow row = execute(xRowRes, "upper('test'),UCASE('test') "); + assure("upper('test') failed!", row.getString(1).equals("TEST")); + assure("ucase('test') failed!", row.getString(2).equals("TEST")); } - private void lower(XRowSet xRowRes) throws com.sun.star.uno.Exception,com.sun.star.beans.UnknownPropertyException { - XRow row = execute(xRowRes,"lower('TEST'),LCASE('TEST') "); - assure("lower('TEST') failed!",row.getString(1).equals("test")); - assure("lcase('TEST') failed!",row.getString(2).equals("test")); - final String t = where; + private void lower(final XRowSet xRowRes) throws com.sun.star.uno.Exception, com.sun.star.beans.UnknownPropertyException + { + final XRow row = execute(xRowRes, "lower('TEST'),LCASE('TEST') "); + assure("lower('TEST') failed!", row.getString(1).equals("test")); + assure("lcase('TEST') failed!", row.getString(2).equals("test")); + final String temp = where; where = "FROM \"biblio\" \"biblio\" where LOWER(\"Identifier\") like 'bor%'"; - row = execute(xRowRes,"lower('TEST'),LCASE('TEST') "); - where = t; + execute(xRowRes, "lower('TEST'),LCASE('TEST') "); + where = temp; } - private void acsii(XRowSet xRowRes) throws com.sun.star.uno.Exception,com.sun.star.beans.UnknownPropertyException { - XRow row = execute(xRowRes,"ASCII('2') "); - assure("acsii('2') failed!",row.getInt(1) == 50); + private void acsii(final XRowSet xRowRes) throws com.sun.star.uno.Exception, com.sun.star.beans.UnknownPropertyException + { + final XRow row = execute(xRowRes, "ASCII('2') "); + assure("acsii('2') failed!", row.getInt(1) == 50); } - private void char_length(XRowSet xRowRes) throws com.sun.star.uno.Exception,com.sun.star.beans.UnknownPropertyException { - XRow row = execute(xRowRes,"char_length('test'),character_length('test'),OCTET_LENGTH('test') "); - assure("char_length('test') failed!",row.getInt(1) == 4); - assure("character_length('test') failed!",row.getInt(2) == 4); - assure("OCTET_LENGTH('test') failed!",row.getInt(3) == 4); + private void char_length(final XRowSet xRowRes) throws com.sun.star.uno.Exception, com.sun.star.beans.UnknownPropertyException + { + final XRow row = execute(xRowRes, "char_length('test'),character_length('test'),OCTET_LENGTH('test') "); + assure("char_length('test') failed!", row.getInt(1) == 4); + assure("character_length('test') failed!", row.getInt(2) == 4); + assure("OCTET_LENGTH('test') failed!", row.getInt(3) == 4); } - private void concat(XRowSet xRowRes) throws com.sun.star.uno.Exception,com.sun.star.beans.UnknownPropertyException { - XRow row = execute(xRowRes,"CONCAT('Hello',' ','World') "); - assure("CONCAT('Hello',' ',,'World') failed!",row.getString(1).equals("Hello World")); + private void concat(final XRowSet xRowRes) throws com.sun.star.uno.Exception, com.sun.star.beans.UnknownPropertyException + { + final XRow row = execute(xRowRes, "CONCAT('Hello',' ','World') "); + assure("CONCAT('Hello',' ',,'World') failed!", row.getString(1).equals("Hello World")); } - private void locate(XRowSet xRowRes) throws com.sun.star.uno.Exception,com.sun.star.beans.UnknownPropertyException { - XRow row = execute(xRowRes,"LOCATE('bar', 'foobarbar') "); - assure("LOCATE('bar', 'foobarbar') failed!",row.getInt(1) == 4); + private void locate(final XRowSet xRowRes) throws com.sun.star.uno.Exception, com.sun.star.beans.UnknownPropertyException + { + final XRow row = execute(xRowRes, "LOCATE('bar', 'foobarbar') "); + assure("LOCATE('bar', 'foobarbar') failed!", row.getInt(1) == 4); } - private void substring(XRowSet xRowRes) throws com.sun.star.uno.Exception,com.sun.star.beans.UnknownPropertyException { - XRow row = execute(xRowRes,"SUBSTRING('Quadratically',5) "); - assure("SUBSTRING('Quadratically',5) failed!",row.getString(1).equals("ratically")); + private void substring(final XRowSet xRowRes) throws com.sun.star.uno.Exception, com.sun.star.beans.UnknownPropertyException + { + final XRow row = execute(xRowRes, "SUBSTRING('Quadratically',5) "); + assure("SUBSTRING('Quadratically',5) failed!", row.getString(1).equals("ratically")); } - private void ltrim(XRowSet xRowRes) throws com.sun.star.uno.Exception,com.sun.star.beans.UnknownPropertyException { - XRow row = execute(xRowRes,"LTRIM(' barbar') "); - assure("LTRIM(' barbar') failed!",row.getString(1).equals("barbar")); + private void ltrim(final XRowSet xRowRes) throws com.sun.star.uno.Exception, com.sun.star.beans.UnknownPropertyException + { + final XRow row = execute(xRowRes, "LTRIM(' barbar') "); + assure("LTRIM(' barbar') failed!", row.getString(1).equals("barbar")); } - private void rtrim(XRowSet xRowRes) throws com.sun.star.uno.Exception,com.sun.star.beans.UnknownPropertyException { - XRow row = execute(xRowRes,"RTRIM('barbar ') "); - assure("RTRIM('barbar ') failed!",row.getString(1).equals( "barbar")); + private void rtrim(final XRowSet xRowRes) throws com.sun.star.uno.Exception, com.sun.star.beans.UnknownPropertyException + { + final XRow row = execute(xRowRes, "RTRIM('barbar ') "); + assure("RTRIM('barbar ') failed!", row.getString(1).equals("barbar")); } - private void space(XRowSet xRowRes) throws com.sun.star.uno.Exception,com.sun.star.beans.UnknownPropertyException { - XRow row = execute(xRowRes,"space(6) "); - assure("space(6) failed!",row.getString(1).equals(" ")); + private void space(final XRowSet xRowRes) throws com.sun.star.uno.Exception, com.sun.star.beans.UnknownPropertyException + { + final XRow row = execute(xRowRes, "space(6) "); + assure("space(6) failed!", row.getString(1).equals(" ")); } - private void replace(XRowSet xRowRes) throws com.sun.star.uno.Exception,com.sun.star.beans.UnknownPropertyException { - XRow row = execute(xRowRes,"REPLACE('www.OOo.com', 'w', 'Ww') "); - assure("REPLACE('www.OOo.com', 'w', 'Ww') failed!",row.getString(1).equals("WwWwWw.OOo.com")); + private void replace(final XRowSet xRowRes) throws com.sun.star.uno.Exception, com.sun.star.beans.UnknownPropertyException + { + final XRow row = execute(xRowRes, "REPLACE('www.OOo.com', 'w', 'Ww') "); + assure("REPLACE('www.OOo.com', 'w', 'Ww') failed!", row.getString(1).equals("WwWwWw.OOo.com")); } - private void repeat(XRowSet xRowRes) throws com.sun.star.uno.Exception,com.sun.star.beans.UnknownPropertyException { - XRow row = execute(xRowRes,"REPEAT('OOo', 3) "); - assure("REPEAT('OOo', 3) failed!",row.getString(1).equals("OOoOOoOOo")); + private void repeat(final XRowSet xRowRes) throws com.sun.star.uno.Exception, com.sun.star.beans.UnknownPropertyException + { + final XRow row = execute(xRowRes, "REPEAT('OOo', 3) "); + assure("REPEAT('OOo', 3) failed!", row.getString(1).equals("OOoOOoOOo")); } - private void insert(XRowSet xRowRes) throws com.sun.star.uno.Exception,com.sun.star.beans.UnknownPropertyException { - XRow row = execute(xRowRes,"INSERT('Quadratic', 3, 4, 'What') "); - assure("INSERT('Quadratic', 3, 4, 'What') failed!",row.getString(1).equals("QuWhattic")); + private void insert(final XRowSet xRowRes) throws com.sun.star.uno.Exception, com.sun.star.beans.UnknownPropertyException + { + final XRow row = execute(xRowRes, "INSERT('Quadratic', 3, 4, 'What') "); + assure("INSERT('Quadratic', 3, 4, 'What') failed!", row.getString(1).equals("QuWhattic")); } - private void left(XRowSet xRowRes) throws com.sun.star.uno.Exception,com.sun.star.beans.UnknownPropertyException { - XRow row = execute(xRowRes,"LEFT('foobarbar', 5) "); - assure("LEFT('foobarbar', 5) failed!",row.getString(1).equals("fooba")); + private void left(final XRowSet xRowRes) throws com.sun.star.uno.Exception, com.sun.star.beans.UnknownPropertyException + { + final XRow row = execute(xRowRes, "LEFT('foobarbar', 5) "); + assure("LEFT('foobarbar', 5) failed!", row.getString(1).equals("fooba")); } - private void right(XRowSet xRowRes) throws com.sun.star.uno.Exception,com.sun.star.beans.UnknownPropertyException { - XRow row = execute(xRowRes,"RIGHT('foobarbar', 4) "); - assure("RIGHT('foobarbar', 4) failed!",row.getString(1).equals("rbar")); + private void right(final XRowSet xRowRes) throws com.sun.star.uno.Exception, com.sun.star.beans.UnknownPropertyException + { + final XRow row = execute(xRowRes, "RIGHT('foobarbar', 4) "); + assure("RIGHT('foobarbar', 4) failed!", row.getString(1).equals("rbar")); } - private void chartest(XRowSet xRowRes) throws com.sun.star.uno.Exception,com.sun.star.beans.UnknownPropertyException { - XRow row = execute(xRowRes,"CHAR(ascii('t'),ascii('e'),ascii('s'),ascii('t')) "); - assure("CHAR(ascii('t'),ascii('e'),ascii('s'),ascii('t')) failed!",row.getString(1).equals("test")); + + private void chartest(final XRowSet xRowRes) throws com.sun.star.uno.Exception, com.sun.star.beans.UnknownPropertyException + { + final XRow row = execute(xRowRes, "CHAR(ascii('t'),ascii('e'),ascii('s'),ascii('t')) "); + assure("CHAR(ascii('t'),ascii('e'),ascii('s'),ascii('t')) failed!", row.getString(1).equals("test")); } } diff --git a/connectivity/qa/drivers/dbase/makefile.mk b/connectivity/qa/drivers/dbase/makefile.mk index 63a4d5a25569..4544b2a2bc62 100644 --- a/connectivity/qa/drivers/dbase/makefile.mk +++ b/connectivity/qa/drivers/dbase/makefile.mk @@ -32,7 +32,7 @@ PRJ = ..$/..$/.. TARGET = DBaseDriverTest PRJNAME = connectivity -PACKAGE = complex$/connectivity +PACKAGE = qa$/drivers$/dbase # --- Settings ----------------------------------------------------- .INCLUDE: settings.mk @@ -45,7 +45,8 @@ JAVAFILES =\ DBaseDateFunctions.java\ DBaseDriverTest.java\ DBaseNumericFunctions.java\ - DBaseStringFunctions.java + DBaseStringFunctions.java\ + DBaseSqlTests.java JAVACLASSFILES = $(foreach,i,$(JAVAFILES) $(CLASSDIR)$/$(PACKAGE)$/$(i:b).class) @@ -59,15 +60,9 @@ JARCOMPRESS = TRUE # --- Targets ------------------------------------------------------ -.IF "$(depend)" == "" -ALL : ALLTAR -.ELSE -ALL: ALLDEP -.ENDIF - .INCLUDE : target.mk -run: - java -cp $(CLASSPATH)$(PATH_SEPERATOR)$(SOLARBINDIR)$/OOoRunner.jar org.openoffice.Runner -TestBase java_complex -o complex.connectivity.$(TARGET) +run: $(CLASSDIR)$/$(JARTARGET) + java -cp "$(CLASSPATH)$(PATH_SEPERATOR)$(SOLARBINDIR)$/OOoRunner.jar" org.openoffice.Runner -TestBase java_complex -o qa.drivers.dbase.$(TARGET) diff --git a/connectivity/source/commontools/DateConversion.cxx b/connectivity/source/commontools/DateConversion.cxx index e58e292bb91b..1b8f40f3b0d6 100644 --- a/connectivity/source/commontools/DateConversion.cxx +++ b/connectivity/source/commontools/DateConversion.cxx @@ -87,14 +87,15 @@ using namespace ::com::sun::star::beans; break; case DataType::CHAR: case DataType::VARCHAR: + case DataType::LONGVARCHAR: if (bQuote) aRet += ::rtl::OUString::createFromAscii("'"); { ::rtl::OUString aTemp; _rxTypeConverter->convertToSimpleType(_rVal, TypeClass_STRING) >>= aTemp; sal_Int32 nIndex = (sal_Int32)-1; - ::rtl::OUString sQuot(RTL_CONSTASCII_USTRINGPARAM("\'")); - ::rtl::OUString sQuotToReplace(RTL_CONSTASCII_USTRINGPARAM("\'\'")); + const ::rtl::OUString sQuot(RTL_CONSTASCII_USTRINGPARAM("\'")); + const ::rtl::OUString sQuotToReplace(RTL_CONSTASCII_USTRINGPARAM("\'\'")); do { nIndex += 2; diff --git a/connectivity/source/commontools/DriversConfig.cxx b/connectivity/source/commontools/DriversConfig.cxx new file mode 100644 index 000000000000..906024f452a4 --- /dev/null +++ b/connectivity/source/commontools/DriversConfig.cxx @@ -0,0 +1,241 @@ +/************************************************************************* + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: makefile,v $ + * + * $Revision: 1.1 $ + * + * last change: $Author: st $ $Date: 2000/11/22 02:32:00 $ + * + * The Contents of this file are made available subject to + * the terms of GNU Lesser General Public License Version 2.1. + * + * + * GNU Lesser General Public License Version 2.1 + * ============================================= + * Copyright 2005 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 + * + ************************************************************************/ +#include "connectivity/DriversConfig.hxx" +#include <tools/wldcrd.hxx> + +using namespace connectivity; +using namespace utl; +using namespace ::com::sun::star; + +namespace +{ + void lcl_convert(const uno::Sequence< ::rtl::OUString >& _aSource,uno::Any& _rDest) + { + uno::Sequence<uno::Any> aRet(_aSource.getLength()); + uno::Any* pAny = aRet.getArray(); + const ::rtl::OUString* pIter = _aSource.getConstArray(); + const ::rtl::OUString* pEnd = pIter + _aSource.getLength(); + for (;pIter != pEnd ; ++pIter,++pAny) + { + *pAny <<= *pIter; + } + _rDest <<= aRet; + } + void lcl_fillValues(const ::utl::OConfigurationNode& _aURLPatternNode,const ::rtl::OUString& _sNode,::comphelper::NamedValueCollection& _rValues) + { + const ::utl::OConfigurationNode aPropertiesNode = _aURLPatternNode.openNode(_sNode); + if ( aPropertiesNode.isValid() ) + { + uno::Sequence< ::rtl::OUString > aStringSeq; + static const ::rtl::OUString s_sValue(RTL_CONSTASCII_USTRINGPARAM("/Value")); + const uno::Sequence< ::rtl::OUString > aProperties = aPropertiesNode.getNodeNames(); + const ::rtl::OUString* pPropertiesIter = aProperties.getConstArray(); + const ::rtl::OUString* pPropertiesEnd = pPropertiesIter + aProperties.getLength(); + for (;pPropertiesIter != pPropertiesEnd ; ++pPropertiesIter) + { + uno::Any aValue = aPropertiesNode.getNodeValue(*pPropertiesIter + s_sValue); + if ( aValue >>= aStringSeq ) + { + lcl_convert(aStringSeq,aValue); + } + _rValues.put(*pPropertiesIter,aValue); + } // for (;pPropertiesIter != pPropertiesEnd ; ++pPropertiesIter,++pNamedIter) + } // if ( aPropertiesNode.isValid() ) + } + void lcl_readURLPatternNode(const ::utl::OConfigurationTreeRoot& _aInstalled,const ::rtl::OUString& _sEntry,TInstalledDriver& _rInstalledDriver) + { + const ::utl::OConfigurationNode aURLPatternNode = _aInstalled.openNode(_sEntry); + if ( aURLPatternNode.isValid() ) + { + static const ::rtl::OUString s_sParentURLPattern(RTL_CONSTASCII_USTRINGPARAM("ParentURLPattern")); + static const ::rtl::OUString s_sDriver(RTL_CONSTASCII_USTRINGPARAM("Driver")); + static const ::rtl::OUString s_sDriverTypeDisplayName(RTL_CONSTASCII_USTRINGPARAM("DriverTypeDisplayName")); + static const ::rtl::OUString s_sProperties(RTL_CONSTASCII_USTRINGPARAM("Properties")); + static const ::rtl::OUString s_sFeatures(RTL_CONSTASCII_USTRINGPARAM("Features")); + static const ::rtl::OUString s_sMetaData(RTL_CONSTASCII_USTRINGPARAM("MetaData")); + ::rtl::OUString sParentURLPattern; + aURLPatternNode.getNodeValue(s_sParentURLPattern) >>= sParentURLPattern; + if ( sParentURLPattern.getLength() ) + lcl_readURLPatternNode(_aInstalled,sParentURLPattern,_rInstalledDriver); + + ::rtl::OUString sDriverFactory; + aURLPatternNode.getNodeValue(s_sDriver) >>= sDriverFactory; + if ( sDriverFactory.getLength() ) + _rInstalledDriver.sDriverFactory = sDriverFactory; + + ::rtl::OUString sDriverTypeDisplayName; + aURLPatternNode.getNodeValue(s_sDriverTypeDisplayName) >>= sDriverTypeDisplayName; + OSL_ENSURE(sDriverTypeDisplayName.getLength(),"No valid DriverTypeDisplayName property!"); + if ( sDriverTypeDisplayName.getLength() ) + _rInstalledDriver.sDriverTypeDisplayName = sDriverTypeDisplayName; + + lcl_fillValues(aURLPatternNode,s_sProperties,_rInstalledDriver.aProperties); + lcl_fillValues(aURLPatternNode,s_sFeatures,_rInstalledDriver.aFeatures); + lcl_fillValues(aURLPatternNode,s_sMetaData,_rInstalledDriver.aMetaData); + } + } +} +// ----------------------------------------------------------------------------- +DriversConfigImpl::DriversConfigImpl() +{ +} +// ----------------------------------------------------------------------------- +void DriversConfigImpl::Load(const uno::Reference< lang::XMultiServiceFactory >& _rxORB,TInstalledDrivers& _rDrivers) +{ + if ( !m_aInstalled.isValid() ) + { + static const ::rtl::OUString s_sNodeName(RTL_CONSTASCII_USTRINGPARAM("org.openoffice.Office.DataAccess.Drivers/Installed")); ///Installed + m_aInstalled = ::utl::OConfigurationTreeRoot::createWithServiceFactory(_rxORB, s_sNodeName, -1, ::utl::OConfigurationTreeRoot::CM_READONLY); + } + + if ( m_aInstalled.isValid() ) + { + const uno::Sequence< ::rtl::OUString > aURLPatterns = m_aInstalled.getNodeNames(); + const ::rtl::OUString* pPatternIter = aURLPatterns.getConstArray(); + const ::rtl::OUString* pPatternEnd = pPatternIter + aURLPatterns.getLength(); + for (;pPatternIter != pPatternEnd ; ++pPatternIter) + { + TInstalledDriver aInstalledDriver; + lcl_readURLPatternNode(m_aInstalled,*pPatternIter,aInstalledDriver); + if ( aInstalledDriver.sDriverFactory.getLength() ) + _rDrivers.insert(TInstalledDrivers::value_type(*pPatternIter,aInstalledDriver)); + } + } +} +// ----------------------------------------------------------------------------- +DriversConfig::DriversConfig(const uno::Reference< lang::XMultiServiceFactory >& _rxORB) +{ + m_aNode->Load(_rxORB,m_aDrivers); +} +// ----------------------------------------------------------------------------- +::rtl::OUString DriversConfig::getDriverFactoryName(const ::rtl::OUString& _sURL) const +{ + ::rtl::OUString sRet; + ::rtl::OUString sOldPattern; + TInstalledDrivers::const_iterator aIter = m_aDrivers.begin(); + TInstalledDrivers::const_iterator aEnd = m_aDrivers.end(); + for(;aIter != aEnd;++aIter) + { + WildCard aWildCard(aIter->first); + if ( sOldPattern.getLength() < aIter->first.getLength() && aWildCard.Matches(_sURL) ) + { + sRet = aIter->second.sDriverFactory; + sOldPattern = aIter->first; + } + } + + return sRet; +} +// ----------------------------------------------------------------------------- +::rtl::OUString DriversConfig::getDriverTypeDisplayName(const ::rtl::OUString& _sURL) const +{ + ::rtl::OUString sRet; + ::rtl::OUString sOldPattern; + TInstalledDrivers::const_iterator aIter = m_aDrivers.begin(); + TInstalledDrivers::const_iterator aEnd = m_aDrivers.end(); + for(;aIter != aEnd;++aIter) + { + WildCard aWildCard(aIter->first); + if ( sOldPattern.getLength() < aIter->first.getLength() && aWildCard.Matches(_sURL) ) + { + sRet = aIter->second.sDriverTypeDisplayName; + sOldPattern = aIter->first; + } + } + + return sRet; +} +// ----------------------------------------------------------------------------- +const ::comphelper::NamedValueCollection& DriversConfig::getProperties(const ::rtl::OUString& _sURL) const +{ + return impl_get(_sURL,1); +} +// ----------------------------------------------------------------------------- +const ::comphelper::NamedValueCollection& DriversConfig::getFeatures(const ::rtl::OUString& _sURL) const +{ + return impl_get(_sURL,0); +} +// ----------------------------------------------------------------------------- +const ::comphelper::NamedValueCollection& DriversConfig::getMetaData(const ::rtl::OUString& _sURL) const +{ + return impl_get(_sURL,2); +} +// ----------------------------------------------------------------------------- +const ::comphelper::NamedValueCollection& DriversConfig::impl_get(const ::rtl::OUString& _sURL,sal_Int32 _nProps) const +{ + const ::comphelper::NamedValueCollection* pRet = NULL; + ::rtl::OUString sOldPattern; + TInstalledDrivers::const_iterator aIter = m_aDrivers.begin(); + TInstalledDrivers::const_iterator aEnd = m_aDrivers.end(); + for(;aIter != aEnd;++aIter) + { + WildCard aWildCard(aIter->first); + if ( sOldPattern.getLength() < aIter->first.getLength() && aWildCard.Matches(_sURL) ) + { + switch(_nProps) + { + case 0: + pRet = &aIter->second.aFeatures; + break; + case 1: + pRet = &aIter->second.aProperties; + break; + case 2: + pRet = &aIter->second.aMetaData; + break; + } + sOldPattern = aIter->first; + } + } // for(;aIter != aEnd;++aIter) + if ( pRet == NULL ) + { + static const ::comphelper::NamedValueCollection s_sEmpty; + pRet = &s_sEmpty; + } + return *pRet; +} +// ----------------------------------------------------------------------------- +uno::Sequence< ::rtl::OUString > DriversConfig::getURLs() const +{ + uno::Sequence< ::rtl::OUString > aRet(m_aDrivers.size()); + ::rtl::OUString* pIter = aRet.getArray(); + TInstalledDrivers::const_iterator aIter = m_aDrivers.begin(); + TInstalledDrivers::const_iterator aEnd = m_aDrivers.end(); + for(;aIter != aEnd;++aIter,++pIter) + { + *pIter = aIter->first; + } + return aRet; +} diff --git a/connectivity/source/commontools/FValue.cxx b/connectivity/source/commontools/FValue.cxx index 433b5ffc69ec..cd09efa227fe 100644 --- a/connectivity/source/commontools/FValue.cxx +++ b/connectivity/source/commontools/FValue.cxx @@ -37,6 +37,7 @@ #include <connectivity/dbconversion.hxx> #include <cppuhelper/extract.hxx> #include <com/sun/star/io/XInputStream.hpp> +#include <rtl/ustrbuf.hxx> #include <rtl/logfile.hxx> using namespace connectivity; @@ -984,12 +985,13 @@ Any ORowSetValue::makeAny() const case DataType::VARBINARY: case DataType::LONGVARBINARY: { - aRet = ::rtl::OUString::createFromAscii("0x"); + ::rtl::OUStringBuffer sVal = ::rtl::OUString::createFromAscii("0x"); Sequence<sal_Int8> aSeq(getSequence()); const sal_Int8* pBegin = aSeq.getConstArray(); const sal_Int8* pEnd = pBegin + aSeq.getLength(); for(;pBegin != pEnd;++pBegin) - aRet += ::rtl::OUString::valueOf((sal_Int32)*pBegin,16); + sVal.append((sal_Int32)*pBegin,16); + aRet = sVal.makeStringAndClear(); } break; case DataType::BIT: @@ -1972,20 +1974,20 @@ void ORowSetValue::fill(const Any& _rValue) setSigned(sal_False); break; } - case TypeClass_HYPER:
- {
- sal_Int64 nValue(0);
- _rValue >>= nValue;
- (*this) = nValue;
- break;
- }
- case TypeClass_UNSIGNED_HYPER:
- {
- sal_uInt64 nValue(0);
- _rValue >>= nValue;
- (*this) = static_cast<sal_Int64>(nValue);
- setSigned(sal_False);
- break;
+ case TypeClass_HYPER: + { + sal_Int64 nValue(0); + _rValue >>= nValue; + (*this) = nValue; + break; + } + case TypeClass_UNSIGNED_HYPER: + { + sal_uInt64 nValue(0); + _rValue >>= nValue; + (*this) = static_cast<sal_Int64>(nValue); + setSigned(sal_False); + break; } case TypeClass_UNSIGNED_LONG: { diff --git a/connectivity/source/commontools/dbconversion.cxx b/connectivity/source/commontools/dbconversion.cxx index 995c5323bc89..47c6143e6507 100644 --- a/connectivity/source/commontools/dbconversion.cxx +++ b/connectivity/source/commontools/dbconversion.cxx @@ -40,7 +40,7 @@ #include <com/sun/star/util/Date.hpp> #include <com/sun/star/util/Time.hpp> #include <com/sun/star/util/DateTime.hpp> - +#include <rtl/ustrbuf.hxx> #define MAX_DAYS 3636532 @@ -96,13 +96,13 @@ namespace dbtools ::rtl::OUString DBTypeConversion::toDateTimeString(const DateTime& _rDateTime) { Date aDate(_rDateTime.Day,_rDateTime.Month,_rDateTime.Year); - ::rtl::OUString aTemp(toDateString(aDate)); - aTemp += ::rtl::OUString::createFromAscii(" "); + ::rtl::OUStringBuffer aTemp(toDateString(aDate)); + aTemp.appendAscii(" "); Time aTime(0,_rDateTime.Seconds,_rDateTime.Minutes,_rDateTime.Hours); - aTemp += toTimeString(aTime); - aTemp += ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(".")); - aTemp += ::rtl::OUString::valueOf(static_cast<sal_Int32>(_rDateTime.HundredthSeconds)); - return aTemp; + aTemp.append(toTimeString(aTime)); + aTemp.appendAscii("."); + aTemp.append(static_cast<sal_Int32>(_rDateTime.HundredthSeconds)); + return aTemp.makeStringAndClear(); } //------------------------------------------------------------------------------ Date DBTypeConversion::toDate(sal_Int32 _nVal) diff --git a/connectivity/source/commontools/dbmetadata.cxx b/connectivity/source/commontools/dbmetadata.cxx index 66d2791c3fce..0d47cffce0ab 100644 --- a/connectivity/source/commontools/dbmetadata.cxx +++ b/connectivity/source/commontools/dbmetadata.cxx @@ -276,7 +276,15 @@ namespace dbtools OSL_VERIFY( setting >>= doGenerate ); return doGenerate; } - + //-------------------------------------------------------------------- + bool DatabaseMetaData::isAutoIncrementPrimaryKey() const + { + bool doGenerate( true ); + Any setting; + if ( lcl_getConnectionSetting( "AutoIncrementIsPrimaryKey", *m_pImpl, setting ) ) + OSL_VERIFY( setting >>= doGenerate ); + return doGenerate; + } //-------------------------------------------------------------------- sal_Int32 DatabaseMetaData::getBooleanComparisonMode() const { diff --git a/connectivity/source/commontools/dbtools.cxx b/connectivity/source/commontools/dbtools.cxx index 6730d7beb9ce..5bd8c93cb639 100644 --- a/connectivity/source/commontools/dbtools.cxx +++ b/connectivity/source/commontools/dbtools.cxx @@ -1014,7 +1014,6 @@ try Property* pResult = ::std::lower_bound(pNewProps, pNewProps + nNewLen,pOldProps[i].Name, ::comphelper::PropertyStringLessFunctor()); if ( pResult && ( pResult != pNewProps + nNewLen && pResult->Name == pOldProps[i].Name ) - && ( pResult->Attributes == pOldProps[i].Attributes ) && ( (pResult->Attributes & PropertyAttribute::READONLY) == 0 ) && ( pResult->Type.equals(pOldProps[i].Type)) ) { // Attribute stimmen ueberein und Property ist nicht read-only diff --git a/connectivity/source/commontools/dbtools2.cxx b/connectivity/source/commontools/dbtools2.cxx index cc842f56e008..1e1fa87cc58e 100644 --- a/connectivity/source/commontools/dbtools2.cxx +++ b/connectivity/source/commontools/dbtools2.cxx @@ -86,10 +86,10 @@ namespace dbtools sal_Int32 nPrecision = 0; sal_Int32 nScale = 0; - ::rtl::OUString sQuoteString = xMetaData->getIdentifierQuoteString(); - ::rtl::OUString aSql = ::dbtools::quoteName(sQuoteString,::comphelper::getString(xColProp->getPropertyValue(rPropMap.getNameByIndex(PROPERTY_ID_NAME)))); + const ::rtl::OUString sQuoteString = xMetaData->getIdentifierQuoteString(); + ::rtl::OUStringBuffer aSql = ::dbtools::quoteName(sQuoteString,::comphelper::getString(xColProp->getPropertyValue(rPropMap.getNameByIndex(PROPERTY_ID_NAME)))); - aSql += ::rtl::OUString::createFromAscii(" "); + aSql.appendAscii(" "); nDataType = nPrecision = nScale = 0; sal_Bool bIsAutoIncrement = sal_False; @@ -143,54 +143,59 @@ namespace dbtools sal_Int32 nParenPos = sTypeName.indexOf('('); if ( nParenPos == -1 ) { - aSql += sTypeName; - aSql += ::rtl::OUString::createFromAscii("("); + aSql.append(sTypeName); + aSql.appendAscii("("); } else { - aSql += sTypeName.copy(0,++nParenPos); + aSql.append(sTypeName.copy(0,++nParenPos)); } if ( nPrecision > 0 && nDataType != DataType::TIMESTAMP ) { - aSql += ::rtl::OUString::valueOf(nPrecision); + aSql.append(nPrecision); if ( (nScale > 0) || (_sCreatePattern.getLength() && sCreateParams.indexOf(_sCreatePattern) != -1) ) - aSql += ::rtl::OUString::createFromAscii(","); + aSql.appendAscii(","); } if ( (nScale > 0) || (_sCreatePattern.getLength() && sCreateParams.indexOf(_sCreatePattern) != -1 ) || nDataType == DataType::TIMESTAMP ) - aSql += ::rtl::OUString::valueOf(nScale); + aSql.append(nScale); if ( nParenPos == -1 ) - aSql += ::rtl::OUString::createFromAscii(")"); + aSql.appendAscii(")"); else { nParenPos = sTypeName.indexOf(')',nParenPos); - aSql += sTypeName.copy(nParenPos); + aSql.append(sTypeName.copy(nParenPos)); } } else - aSql += sTypeName; // simply add the type name + aSql.append(sTypeName); // simply add the type name ::rtl::OUString aDefault = ::comphelper::getString(xColProp->getPropertyValue(rPropMap.getNameByIndex(PROPERTY_ID_DEFAULTVALUE))); - if(aDefault.getLength()) - aSql += ::rtl::OUString::createFromAscii(" DEFAULT ") + sPreFix + aDefault + sPostFix; + if ( aDefault.getLength() ) + { + aSql.append(::rtl::OUString::createFromAscii(" DEFAULT ")); + aSql.append(sPreFix); + aSql.append(aDefault); + aSql.append(sPostFix); + } // if ( aDefault.getLength() ) if(::comphelper::getINT32(xColProp->getPropertyValue(rPropMap.getNameByIndex(PROPERTY_ID_ISNULLABLE))) == ColumnValue::NO_NULLS) - aSql += ::rtl::OUString::createFromAscii(" NOT NULL"); + aSql.append(::rtl::OUString::createFromAscii(" NOT NULL")); if ( bIsAutoIncrement && sAutoIncrementValue.getLength()) { - aSql += ::rtl::OUString::createFromAscii(" "); - aSql += sAutoIncrementValue; + aSql.appendAscii(" "); + aSql.append(sAutoIncrementValue); } - return aSql; + return aSql.makeStringAndClear(); } // ----------------------------------------------------------------------------- ::rtl::OUString createStandardCreateStatement(const Reference< XPropertySet >& descriptor,const Reference< XConnection>& _xConnection,const ::rtl::OUString& _sCreatePattern) { - ::rtl::OUString aSql = ::rtl::OUString::createFromAscii("CREATE TABLE "); + ::rtl::OUStringBuffer aSql = ::rtl::OUString::createFromAscii("CREATE TABLE "); ::rtl::OUString sCatalog,sSchema,sTable,sComposedName; Reference<XDatabaseMetaData> xMetaData = _xConnection->getMetaData(); @@ -204,7 +209,8 @@ namespace dbtools if ( !sComposedName.getLength() ) ::dbtools::throwFunctionSequenceException(_xConnection); - aSql += sComposedName + ::rtl::OUString::createFromAscii(" ("); + aSql.append(sComposedName); + aSql.append(::rtl::OUString::createFromAscii(" (")); // columns Reference<XColumnsSupplier> xColumnSup(descriptor,UNO_QUERY); @@ -220,11 +226,11 @@ namespace dbtools { if ( (xColumns->getByIndex(i) >>= xColProp) && xColProp.is() ) { - aSql += createStandardColumnPart(xColProp,_xConnection,_sCreatePattern); - aSql += ::rtl::OUString::createFromAscii(","); + aSql.append(createStandardColumnPart(xColProp,_xConnection,_sCreatePattern)); + aSql.appendAscii(","); } } - return aSql; + return aSql.makeStringAndClear(); } namespace { @@ -256,7 +262,7 @@ namespace Reference<XDatabaseMetaData> xMetaData = _xConnection->getMetaData(); ::dbtools::OPropertyMap& rPropMap = OMetaConnection::getPropMap(); - ::rtl::OUString aSql; + ::rtl::OUStringBuffer aSql; // keys Reference<XKeysSupplier> xKeySup(descriptor,UNO_QUERY); Reference<XIndexAccess> xKeys = xKeySup->getKeys(); @@ -286,8 +292,8 @@ namespace ::dbtools::throwFunctionSequenceException(_xConnection); const ::rtl::OUString sQuote = xMetaData->getIdentifierQuoteString(); - aSql += ::rtl::OUString::createFromAscii(" PRIMARY KEY "); - aSql += generateColumnNames(xColumns,xMetaData); + aSql.append(::rtl::OUString::createFromAscii(" PRIMARY KEY ")); + aSql.append(generateColumnNames(xColumns,xMetaData)); } else if(nKeyType == KeyType::UNIQUE) { @@ -297,8 +303,8 @@ namespace ::dbtools::throwFunctionSequenceException(_xConnection); const ::rtl::OUString sQuote = xMetaData->getIdentifierQuoteString(); - aSql += ::rtl::OUString::createFromAscii(" UNIQUE "); - aSql += generateColumnNames(xColumns,xMetaData); + aSql.append(::rtl::OUString::createFromAscii(" UNIQUE ")); + aSql.append(generateColumnNames(xColumns,xMetaData)); } else if(nKeyType == KeyType::FOREIGN) { @@ -309,7 +315,7 @@ namespace if(!xColumns.is() || !xColumns->getCount()) ::dbtools::throwFunctionSequenceException(_xConnection); - aSql += ::rtl::OUString::createFromAscii(" FOREIGN KEY "); + aSql.append(::rtl::OUString::createFromAscii(" FOREIGN KEY ")); ::rtl::OUString sRefTable = getString(xColProp->getPropertyValue(rPropMap.getNameByIndex(PROPERTY_ID_REFERENCEDTABLE))); ::dbtools::qualifiedNameComponents(xMetaData, sRefTable, @@ -323,21 +329,21 @@ namespace if ( !sComposedName.getLength() ) ::dbtools::throwFunctionSequenceException(_xConnection); - aSql += generateColumnNames(xColumns,xMetaData); + aSql.append(generateColumnNames(xColumns,xMetaData)); switch(nDeleteRule) { case KeyRule::CASCADE: - aSql += ::rtl::OUString::createFromAscii(" ON DELETE CASCADE "); + aSql.append(::rtl::OUString::createFromAscii(" ON DELETE CASCADE ")); break; case KeyRule::RESTRICT: - aSql += ::rtl::OUString::createFromAscii(" ON DELETE RESTRICT "); + aSql.append(::rtl::OUString::createFromAscii(" ON DELETE RESTRICT ")); break; case KeyRule::SET_NULL: - aSql += ::rtl::OUString::createFromAscii(" ON DELETE SET NULL "); + aSql.append(::rtl::OUString::createFromAscii(" ON DELETE SET NULL ")); break; case KeyRule::SET_DEFAULT: - aSql += ::rtl::OUString::createFromAscii(" ON DELETE SET DEFAULT "); + aSql.append(::rtl::OUString::createFromAscii(" ON DELETE SET DEFAULT ")); break; default: ; @@ -349,13 +355,13 @@ namespace if ( aSql.getLength() ) { - if ( aSql.lastIndexOf(',') == (aSql.getLength()-1) ) - aSql = aSql.replaceAt(aSql.getLength()-1,1,::rtl::OUString::createFromAscii(")")); + if ( aSql.charAt(aSql.getLength()-1) == ',' ) + aSql.setCharAt(aSql.getLength()-1,')'); else - aSql += ::rtl::OUString::createFromAscii(")"); + aSql.appendAscii(")"); } - return aSql; + return aSql.makeStringAndClear(); } // ----------------------------------------------------------------------------- @@ -364,7 +370,7 @@ namespace const ::rtl::OUString& _sCreatePattern) { ::rtl::OUString aSql = ::dbtools::createStandardCreateStatement(descriptor,_xConnection,_sCreatePattern); - ::rtl::OUString sKeyStmt = ::dbtools::createStandardKeyStatement(descriptor,_xConnection); + const ::rtl::OUString sKeyStmt = ::dbtools::createStandardKeyStatement(descriptor,_xConnection); if ( sKeyStmt.getLength() ) aSql += sKeyStmt; else @@ -603,7 +609,7 @@ Reference< XTablesSupplier> getDataDefinitionByURLAndConnection( // if we don't get the catalog from the original driver we have to try them all. if ( !xTablesSup.is() ) - { + { // !TODO: Why? Reference< XEnumerationAccess> xEnumAccess( xManager, UNO_QUERY_THROW ); Reference< XEnumeration > xEnum( xEnumAccess->createEnumeration(), UNO_QUERY_THROW ); while ( xEnum.is() && xEnum->hasMoreElements() && !xTablesSup.is() ) diff --git a/connectivity/source/commontools/makefile.mk b/connectivity/source/commontools/makefile.mk index a9c942ec9cb2..ee335705e651 100644 --- a/connectivity/source/commontools/makefile.mk +++ b/connectivity/source/commontools/makefile.mk @@ -85,6 +85,7 @@ EXCEPTIONSFILES=\ $(SLO)$/filtermanager.obj \ $(SLO)$/parameters.obj \ $(SLO)$/ParamterSubstitution.obj \ + $(SLO)$/DriversConfig.obj \ $(SLO)$/formattedcolumnvalue.obj \ $(SLO)$/warningscontainer.obj diff --git a/connectivity/source/commontools/parameters.cxx b/connectivity/source/commontools/parameters.cxx index d45a7ac849a3..b2a093753804 100644 --- a/connectivity/source/commontools/parameters.cxx +++ b/connectivity/source/commontools/parameters.cxx @@ -54,6 +54,7 @@ #include <comphelper/proparrhlp.hxx> #include <comphelper/broadcasthelper.hxx> #include "connectivity/ParameterCont.hxx" +#include <rtl/ustrbuf.hxx> //........................................................................ namespace dbtools @@ -394,24 +395,24 @@ namespace dbtools // did we find links where the detail field refers to a detail column (instead of a parameter name)? if ( !aAdditionalFilterComponents.empty() ) { + const static ::rtl::OUString s_sAnd( RTL_CONSTASCII_USTRINGPARAM( " AND " ) ); // build a conjunction of all the filter components - ::rtl::OUString sAdditionalFilter; + ::rtl::OUStringBuffer sAdditionalFilter; for ( ::std::vector< ::rtl::OUString >::const_iterator aComponent = aAdditionalFilterComponents.begin(); aComponent != aAdditionalFilterComponents.end(); ++aComponent ) { - ::rtl::OUString sBracketed( RTL_CONSTASCII_USTRINGPARAM( "( " ) ); - sBracketed += *aComponent; - sBracketed += ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( " )" ) ); - if ( sAdditionalFilter.getLength() ) - sAdditionalFilter += ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( " AND " ) ); - sAdditionalFilter += sBracketed; + sAdditionalFilter.append(s_sAnd); + + sAdditionalFilter.appendAscii("( ",((sal_Int32)(sizeof("( ")-1))); + sAdditionalFilter.append(*aComponent); + sAdditionalFilter.appendAscii(" )",((sal_Int32)(sizeof(" )")-1))); } // now set this filter at the 's filter manager - _rFilterManager.setFilterComponent( FilterManager::fcLinkFilter, sAdditionalFilter ); + _rFilterManager.setFilterComponent( FilterManager::fcLinkFilter, sAdditionalFilter.makeStringAndClear() ); _rColumnsInLinkDetails = true; } @@ -1119,3 +1120,4 @@ namespace dbtools //........................................................................ } // namespace frm //........................................................................ + diff --git a/connectivity/source/dbtools/makefile.mk b/connectivity/source/dbtools/makefile.mk index 908d38c92e03..060ff6c55487 100644 --- a/connectivity/source/dbtools/makefile.mk +++ b/connectivity/source/dbtools/makefile.mk @@ -65,6 +65,7 @@ SHL1STDLIBS=\ $(SALLIB) \ $(JVMACCESSLIB) \ $(UNOTOOLSLIB) \ + $(TOOLSLIB) \ $(COMPHELPERLIB) \ $(I18NISOLANGLIB) diff --git a/connectivity/source/drivers/adabas/adabas.xcu b/connectivity/source/drivers/adabas/adabas.xcu new file mode 100644 index 000000000000..0648d25cebe6 --- /dev/null +++ b/connectivity/source/drivers/adabas/adabas.xcu @@ -0,0 +1,128 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!--*********************************************************************** + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: DataAccess.xcu,v $ + * $Revision: 1.27 $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************ --> +<oor:component-data oor:name="Drivers" oor:package="org.openoffice.Office.DataAccess" xmlns:oor="http://openoffice.org/2001/registry" xmlns:xs="http://www.w3.org/2001/XMLSchema"> + <node oor:name="Installed"> + <node oor:name="sdbc:adabas:*" oor:op="replace"> + <prop oor:name="Driver"> + <value>com.sun.star.comp.sdbcx.adabas.ODriver</value> + </prop> + <prop oor:name="DriverTypeDisplayName" oor:type="xs:string"> + <value xml:lang="en-US">Adabas D</value> + </prop> + <node oor:name="Properties"> + <node oor:name="ShutdownDatabase" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:boolean"> + <value>false</value> + </prop> + </node> + <node oor:name="DataCacheSizeIncrement" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:int"> + <value>20</value> + </prop> + </node> + <node oor:name="DataCacheSize" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:int"> + <value>20</value> + </prop> + </node> + <node oor:name="ControlUser" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:string"> + <value></value> + </prop> + </node> + <node oor:name="ControlPassword" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:string"> + <value></value> + </prop> + </node> + <node oor:name="CharSet" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:string"> + <value></value> + </prop> + </node> + </node> + <node oor:name="Features"> + <node oor:name="UseSQL92NamingConstraints" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:boolean"> + <value>true</value> + </prop> + </node> + <node oor:name="AppendTableAliasInSelect" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:boolean"> + <value>true</value> + </prop> + </node> + <node oor:name="DisplayVersionColumns" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:boolean"> + <value>true</value> + </prop> + </node> + <node oor:name="UseDOSLineEnds" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:boolean"> + <value>true</value> + </prop> + </node> + <node oor:name="BooleanComparisonMode" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:boolean"> + <value>true</value> + </prop> + </node> + <node oor:name="FormsCheckRequiredFields" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:boolean"> + <value>true</value> + </prop> + </node> + <node oor:name="EscapeDateTime" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:boolean"> + <value>true</value> + </prop> + </node> + </node> + <node oor:name="MetaData"> + <node oor:name="SupportsTableCreation" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:boolean"> + <value>true</value> + </prop> + </node> + <node oor:name="SupportsBrowsing" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:boolean"> + <value>true</value> + </prop> + </node> + <node oor:name="Authentication" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:string"> + <value>UserPassword</value> + </prop> + </node> + </node> + </node> + </node> +</oor:component-data> diff --git a/connectivity/source/drivers/adabas/makefile.mk b/connectivity/source/drivers/adabas/makefile.mk index 59f3238b4fdc..09b2936e1c7d 100644 --- a/connectivity/source/drivers/adabas/makefile.mk +++ b/connectivity/source/drivers/adabas/makefile.mk @@ -42,8 +42,8 @@ VISIBILITY_HIDDEN=TRUE ENVCFLAGS+=/FR$(SLO)$/ .ENDIF -.INCLUDE : settings.mk -.INCLUDE : $(PRJ)$/version.mk +.INCLUDE : $(PRJ)$/makefile.pmk +.INCLUDE : $(PRJ)$/version.mk .IF "$(SYSTEM_ODBC_HEADERS)" == "YES" CFLAGS+=-DSYSTEM_ODBC_HEADERS @@ -104,9 +104,7 @@ SHL1DEF= $(MISC)$/$(SHL1TARGET).def DEF1NAME= $(SHL1TARGET) DEF1EXPORTFILE= exports.dxp - # --- Targets ---------------------------------- -.INCLUDE : target.mk - +.INCLUDE : $(PRJ)$/target.pmk
\ No newline at end of file diff --git a/connectivity/source/drivers/ado/ado.xcu b/connectivity/source/drivers/ado/ado.xcu new file mode 100644 index 000000000000..949d6fb86a19 --- /dev/null +++ b/connectivity/source/drivers/ado/ado.xcu @@ -0,0 +1,242 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!--*********************************************************************** + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: DataAccess.xcu,v $ + * $Revision: 1.27 $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************ --> +<oor:component-data oor:name="Drivers" oor:package="org.openoffice.Office.DataAccess" xmlns:oor="http://openoffice.org/2001/registry" xmlns:xs="http://www.w3.org/2001/XMLSchema"> + <node oor:name="Installed"> + <node oor:name="sdbc:ado:*" oor:op="replace"> + <prop oor:name="Driver"> + <value>com.sun.star.comp.sdbc.ado.ODriver</value> + </prop> + <prop oor:name="DriverTypeDisplayName" oor:type="xs:string"> + <value xml:lang="en-US">ADO</value> + </prop> + <node oor:name="Properties"> + <node oor:name="CharSet" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:string"> + <value></value> + </prop> + </node> + </node> + <node oor:name="Features"> + <node oor:name="GeneratedValues" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:boolean"> + <value>true</value> + </prop> + </node> + <node oor:name="UseSQL92NamingConstraints" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:boolean"> + <value>true</value> + </prop> + </node> + <node oor:name="AppendTableAliasInSelect" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:boolean"> + <value>true</value> + </prop> + </node> + <node oor:name="UseKeywordAsBeforeAlias" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:boolean"> + <value>true</value> + </prop> + </node> + <node oor:name="UseBracketedOuterJoinSyntax" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:boolean"> + <value>true</value> + </prop> + </node> + <node oor:name="IgnoreDriverPrivileges" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:boolean"> + <value>true</value> + </prop> + </node> + <node oor:name="DisplayVersionColumns" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:boolean"> + <value>true</value> + </prop> + </node> + <node oor:name="UseCatalogInSelect" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:boolean"> + <value>true</value> + </prop> + </node> + <node oor:name="UseSchemaInSelect" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:boolean"> + <value>true</value> + </prop> + </node> + <node oor:name="UseIndexDirectionKeyword" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:boolean"> + <value>true</value> + </prop> + </node> + <node oor:name="UseDOSLineEnds" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:boolean"> + <value>true</value> + </prop> + </node> + <node oor:name="BooleanComparisonMode" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:boolean"> + <value>true</value> + </prop> + </node> + <node oor:name="FormsCheckRequiredFields" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:boolean"> + <value>true</value> + </prop> + </node> + <node oor:name="EscapeDateTime" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:boolean"> + <value>true</value> + </prop> + </node> + </node> + <node oor:name="MetaData"> + <node oor:name="SupportsTableCreation" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:boolean"> + <value>true</value> + </prop> + </node> + <node oor:name="SupportsBrowsing" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:boolean"> + <value>true</value> + </prop> + </node> + <node oor:name="Authentication" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:string"> + <value>UserPassword</value> + </prop> + </node> + </node> + </node> + <node oor:name="sdbc:ado:access:PROVIDER=Microsoft.Jet.OLEDB.4.0;DATA SOURCE=*" oor:op="replace"> + <prop oor:name="Driver"> + <value>com.sun.star.comp.sdbc.ado.ODriver</value> + </prop> + <prop oor:name="DriverTypeDisplayName" oor:type="xs:string"> + <value xml:lang="en-US">Microsoft Access</value> + </prop> + <node oor:name="Properties"> + <node oor:name="CharSet" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:string"> + <value></value> + </prop> + </node> + </node> + <node oor:name="Features"> + <node oor:name="UseSQL92NamingConstraints" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:boolean"> + <value>true</value> + </prop> + </node> + <node oor:name="AppendTableAliasInSelect" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:boolean"> + <value>true</value> + </prop> + </node> + <node oor:name="UseBracketedOuterJoinSyntax" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:boolean"> + <value>true</value> + </prop> + </node> + <node oor:name="UseDOSLineEnds" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:boolean"> + <value>true</value> + </prop> + </node> + <node oor:name="BooleanComparisonMode" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:boolean"> + <value>true</value> + </prop> + </node> + <node oor:name="FormsCheckRequiredFields" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:boolean"> + <value>true</value> + </prop> + </node> + <node oor:name="EscapeDateTime" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:boolean"> + <value>true</value> + </prop> + </node> + </node> + <node oor:name="MetaData"> + <node oor:name="ColumnAliasInOrderBy" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:boolean"> + <value>false</value> + </prop> + </node> + <node oor:name="SupportsTableCreation" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:boolean"> + <value>true</value> + </prop> + </node> + <node oor:name="SupportsBrowsing" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:boolean"> + <value>true</value> + </prop> + </node> + <node oor:name="FileSystemBased" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:boolean"> + <value>true</value> + </prop> + </node> + <node oor:name="MediaType" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:string"> + <value>application/msaccess</value> + </prop> + </node> + <node oor:name="Extension" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:string"> + <value>mdb</value> + </prop> + </node> + <node oor:name="BooleanComparisonMode" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:int"> + <value>3</value> + </prop> + </node> + </node> + </node> + <node oor:name="sdbc:ado:access:Provider=Microsoft.ACE.OLEDB.12.0;DATA SOURCE=*" oor:op="replace"> + <prop oor:name="ParentURLPattern"> + <value>sdbc:ado:access:PROVIDER=Microsoft.Jet.OLEDB.4.0;DATA SOURCE=*</value> + </prop> + <prop oor:name="DriverTypeDisplayName" oor:type="xs:string"> + <value xml:lang="en-US">Microsoft Access 2007</value> + </prop> + <node oor:name="MetaData"> + <node oor:name="Extension" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:string"> + <value></value> + </prop> + </node> + </node> + </node> + </node> +</oor:component-data> diff --git a/connectivity/source/drivers/ado/makefile.mk b/connectivity/source/drivers/ado/makefile.mk index 1aace34e4de6..b453c528e127 100644 --- a/connectivity/source/drivers/ado/makefile.mk +++ b/connectivity/source/drivers/ado/makefile.mk @@ -28,7 +28,6 @@ # for a copy of the LGPLv3 License. # #************************************************************************* -.IF "$(GUI)"=="WNT" PRJ=..$/..$/.. PRJINC=..$/.. @@ -43,9 +42,10 @@ VISIBILITY_HIDDEN=TRUE ENVCFLAGS+=/FR$(SLO)$/ .ENDIF -.INCLUDE : settings.mk .INCLUDE : $(PRJ)$/version.mk +.INCLUDE : $(PRJ)$/makefile.pmk +.IF "$(GUI)"=="WNT" # --- Files ------------------------------------- EXCEPTIONSFILES= \ @@ -109,9 +109,10 @@ SHL1DEF= $(MISC)$/$(SHL1TARGET).def DEF1NAME= $(SHL1TARGET) DEF1EXPORTFILE= exports.dxp -# --- Targets ---------------------------------- - -.INCLUDE : target.mk - +.ELSE +dummy: + @echo "Nothing to build for GUI $(GUI)" .ENDIF # "$(GUI)"=="WNT" +# --- Targets ---------------------------------- +.INCLUDE : $(PRJ)$/target.pmk diff --git a/connectivity/source/drivers/calc/calc.xcu b/connectivity/source/drivers/calc/calc.xcu new file mode 100644 index 000000000000..7260341946f1 --- /dev/null +++ b/connectivity/source/drivers/calc/calc.xcu @@ -0,0 +1,66 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!--*********************************************************************** + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: DataAccess.xcu,v $ + * $Revision: 1.27 $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************ --> +<oor:component-data oor:name="Drivers" oor:package="org.openoffice.Office.DataAccess" xmlns:oor="http://openoffice.org/2001/registry" xmlns:xs="http://www.w3.org/2001/XMLSchema"> + <node oor:name="Installed"> + <node oor:name="sdbc:calc:*" oor:op="replace"> + <prop oor:name="Driver"> + <value>com.sun.star.comp.sdbc.calc.ODriver</value> + </prop> + <prop oor:name="DriverTypeDisplayName" oor:type="xs:string"> + <value xml:lang="en-US">Spreadsheet</value> + </prop> + <node oor:name="Features"> + <node oor:name="EscapeDateTime" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:boolean"> + <value>true</value> + </prop> + </node> + </node> + <node oor:name="MetaData"> + <node oor:name="SupportsBrowsing" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:boolean"> + <value>true</value> + </prop> + </node> + <node oor:name="FileSystemBased" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:boolean"> + <value>true</value> + </prop> + </node> + <node oor:name="MediaType" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:string"> + <value>application/vnd.oasis.opendocument.spreadsheet</value> + </prop> + </node> + </node> + </node> + </node> +</oor:component-data> diff --git a/connectivity/source/drivers/calc/makefile.mk b/connectivity/source/drivers/calc/makefile.mk index 08d83423638d..620bcd6a8eee 100644 --- a/connectivity/source/drivers/calc/makefile.mk +++ b/connectivity/source/drivers/calc/makefile.mk @@ -42,7 +42,7 @@ VISIBILITY_HIDDEN=TRUE ENVCFLAGS+=/FR$(SLO)$/ .ENDIF -.INCLUDE : settings.mk +.INCLUDE : $(PRJ)$/makefile.pmk .INCLUDE : $(PRJ)$/version.mk @@ -94,6 +94,6 @@ DEF1EXPORTFILE= exports.dxp # --- Targets ---------------------------------- -.INCLUDE : target.mk +.INCLUDE : $(PRJ)$/target.pmk diff --git a/connectivity/source/drivers/dbase/DTable.cxx b/connectivity/source/drivers/dbase/DTable.cxx index 1c5210bfcdc6..d4a83249098a 100644 --- a/connectivity/source/drivers/dbase/DTable.cxx +++ b/connectivity/source/drivers/dbase/DTable.cxx @@ -368,11 +368,12 @@ void ODbaseTable::fillColumns() cType[0] = aDBFColumn.db_typ; cType[1] = 0; aTypeName = ::rtl::OUString::createFromAscii(cType); +OSL_TRACE("column type: %c",aDBFColumn.db_typ); switch (aDBFColumn.db_typ) { case 'C': - eType = DataType::CHAR; + eType = DataType::VARCHAR; aTypeName = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("VARCHAR")); break; case 'F': @@ -2785,13 +2786,13 @@ BOOL ODbaseTable::ReadMemo(ULONG nBlockNo, ORowSetValue& aVariable) if ( bIsText ) { // char cChar; - ::rtl::OUString aStr; + ::rtl::OUStringBuffer aStr; while ( nLength > STRING_MAXLEN ) { ByteString aBStr; aBStr.Expand(STRING_MAXLEN); m_pMemoStream->Read(aBStr.AllocBuffer(STRING_MAXLEN),STRING_MAXLEN); - aStr += ::rtl::OUString(aBStr.GetBuffer(),aBStr.Len(), m_eEncoding); + aStr.append(::rtl::OUString(aBStr.GetBuffer(),aBStr.Len(), m_eEncoding)); nLength -= STRING_MAXLEN; } if ( nLength > 0 ) @@ -2800,12 +2801,10 @@ BOOL ODbaseTable::ReadMemo(ULONG nBlockNo, ORowSetValue& aVariable) aBStr.Expand(static_cast<xub_StrLen>(nLength)); m_pMemoStream->Read(aBStr.AllocBuffer(static_cast<xub_StrLen>(nLength)),nLength); // aBStr.ReleaseBufferAccess(); - - aStr += ::rtl::OUString(aBStr.GetBuffer(),aBStr.Len(), m_eEncoding); - + aStr.append(::rtl::OUString(aBStr.GetBuffer(),aBStr.Len(), m_eEncoding)); } if ( aStr.getLength() ) - aVariable = aStr; + aVariable = aStr.makeStringAndClear(); } // if ( bIsText ) else { diff --git a/connectivity/source/drivers/dbase/dbase.xcu b/connectivity/source/drivers/dbase/dbase.xcu new file mode 100644 index 000000000000..e981a56a34d2 --- /dev/null +++ b/connectivity/source/drivers/dbase/dbase.xcu @@ -0,0 +1,98 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!--*********************************************************************** + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: DataAccess.xcu,v $ + * $Revision: 1.27 $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************ --> +<oor:component-data oor:name="Drivers" oor:package="org.openoffice.Office.DataAccess" xmlns:oor="http://openoffice.org/2001/registry" xmlns:xs="http://www.w3.org/2001/XMLSchema"> + <node oor:name="Installed"> + <node oor:name="sdbc:dbase:*" oor:op="replace"> + <prop oor:name="Driver"> + <value>com.sun.star.comp.sdbc.dbase.ODriver</value> + </prop> + <prop oor:name="DriverTypeDisplayName" oor:type="xs:string"> + <value xml:lang="en-US">dBASE</value> + </prop> + <node oor:name="Properties"> + <node oor:name="CharSet" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:string"> + <value></value> + </prop> + </node> + <node oor:name="ShowDeleted" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:boolean"> + <value>false</value> + </prop> + </node> + <node oor:name="EnableSQL92Check" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:boolean"> + <value>false</value> + </prop> + </node> + </node> + <node oor:name="Features"> + <node oor:name="UseSQL92NamingConstraints" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:boolean"> + <value>true</value> + </prop> + </node> + <node oor:name="UseDOSLineEnds" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:boolean"> + <value>true</value> + </prop> + </node> + <node oor:name="EscapeDateTime" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:boolean"> + <value>true</value> + </prop> + </node> + </node> + <node oor:name="MetaData"> + <node oor:name="SupportsTableCreation" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:boolean"> + <value>true</value> + </prop> + </node> + <node oor:name="SupportsBrowsing" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:boolean"> + <value>true</value> + </prop> + </node> + <node oor:name="FileSystemBased" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:boolean"> + <value>true</value> + </prop> + </node> + <node oor:name="MediaType" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:string"> + <value>application/dbase</value> + </prop> + </node> + </node> + </node> + </node> +</oor:component-data> diff --git a/connectivity/source/drivers/dbase/makefile.mk b/connectivity/source/drivers/dbase/makefile.mk index 7a827b86d46f..37a88ef47674 100644 --- a/connectivity/source/drivers/dbase/makefile.mk +++ b/connectivity/source/drivers/dbase/makefile.mk @@ -41,7 +41,7 @@ VISIBILITY_HIDDEN=TRUE ENVCFLAGS+=/FR$(SLO)$/ .ENDIF -.INCLUDE : settings.mk +.INCLUDE : $(PRJ)$/makefile.pmk .INCLUDE : $(PRJ)$/version.mk # --- Files ------------------------------------- @@ -128,6 +128,6 @@ DEF1EXPORTFILE= exports.dxp # --- Targets ---------------------------------- -.INCLUDE : target.mk +.INCLUDE : $(PRJ)$/target.pmk diff --git a/connectivity/source/drivers/evoab/LCatalog.cxx b/connectivity/source/drivers/evoab/LCatalog.cxx new file mode 100644 index 000000000000..713af210ac38 --- /dev/null +++ b/connectivity/source/drivers/evoab/LCatalog.cxx @@ -0,0 +1,75 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: LCatalog.cxx,v $ + * $Revision: 1.5 $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_connectivity.hxx" + + +#include "LCatalog.hxx" +#include "LConnection.hxx" +#include "LTables.hxx" +#include <com/sun/star/sdbc/XRow.hpp> +#include <com/sun/star/sdbc/XResultSet.hpp> + +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::beans; +using namespace ::com::sun::star::sdbcx; +using namespace ::com::sun::star::sdbc; +using namespace ::com::sun::star::container; + +// ------------------------------------------------------------------------- +using namespace connectivity::evoab; +// ------------------------------------------------------------------------- +OEvoabCatalog::OEvoabCatalog(OEvoabConnection* _pCon) : file::OFileCatalog(_pCon) +{ +} +// ------------------------------------------------------------------------- +void OEvoabCatalog::refreshTables() +{ + TStringVector aVector; + Sequence< ::rtl::OUString > aTypes; + Reference< XResultSet > xResult = m_xMetaData->getTables(Any(), + ::rtl::OUString::createFromAscii("%"),::rtl::OUString::createFromAscii("%"),aTypes); + + if(xResult.is()) + { + Reference< XRow > xRow(xResult,UNO_QUERY); + while(xResult->next()) + aVector.push_back(xRow->getString(3)); + } + if(m_pTables) + m_pTables->reFill(aVector); + else + m_pTables = new OEvoabTables(m_xMetaData,*this,m_aMutex,aVector); +} +// ----------------------------------------------------------------------------- + + + diff --git a/connectivity/source/drivers/evoab/LCatalog.hxx b/connectivity/source/drivers/evoab/LCatalog.hxx new file mode 100644 index 000000000000..e539db3a8fc3 --- /dev/null +++ b/connectivity/source/drivers/evoab/LCatalog.hxx @@ -0,0 +1,52 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: LCatalog.hxx,v $ + * $Revision: 1.4 $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef _CONNECTIVITY_EVOAB_LCATALOG_HXX_ +#define _CONNECTIVITY_EVOAB_LCATALOG_HXX_ + +#include "file/FCatalog.hxx" + +namespace connectivity +{ + namespace evoab + { + class OEvoabConnection; + class OEvoabCatalog : public file::OFileCatalog + { + public: + virtual void refreshTables(); + + public: + OEvoabCatalog(OEvoabConnection* _pCon); + }; + } +} +#endif // _CONNECTIVITY_EVOAB_LCATALOG_HXX_ + diff --git a/connectivity/source/drivers/evoab/LColumnAlias.cxx b/connectivity/source/drivers/evoab/LColumnAlias.cxx new file mode 100644 index 000000000000..30b94e2e20c9 --- /dev/null +++ b/connectivity/source/drivers/evoab/LColumnAlias.cxx @@ -0,0 +1,235 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: LColumnAlias.cxx,v $ + * $Revision: 1.7 $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_connectivity.hxx" +#include "LColumnAlias.hxx" +#include "LDriver.hxx" +#include <com/sun/star/beans/XPropertySet.hpp> +#include <com/sun/star/container/XNameAccess.hpp> +#include "LConfigAccess.hxx" + +using namespace ::connectivity; +using namespace ::connectivity::evoab; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::lang; +using namespace ::com::sun::star::beans; +using namespace ::com::sun::star::container; + +static const ::rtl::OUString sProgrammaticNames[] = +{ + ::rtl::OUString::createFromAscii("FirstName"), + ::rtl::OUString::createFromAscii("LastName"), + ::rtl::OUString::createFromAscii("DisplayName"), + ::rtl::OUString::createFromAscii("NickName"), + ::rtl::OUString::createFromAscii("PrimaryEmail"), + ::rtl::OUString::createFromAscii("SecondEmail"), + ::rtl::OUString::createFromAscii("PreferMailFormat"), + ::rtl::OUString::createFromAscii("WorkPhone"), + ::rtl::OUString::createFromAscii("HomePhone"), + ::rtl::OUString::createFromAscii("FaxNumber"), + ::rtl::OUString::createFromAscii("PagerNumber"), + ::rtl::OUString::createFromAscii("CellularNumber"), + ::rtl::OUString::createFromAscii("HomeAddress"), + ::rtl::OUString::createFromAscii("HomeAddress2"), + ::rtl::OUString::createFromAscii("HomeCity"), + ::rtl::OUString::createFromAscii("HomeState"), + ::rtl::OUString::createFromAscii("HomeZipCode"), + ::rtl::OUString::createFromAscii("HomeCountry"), + ::rtl::OUString::createFromAscii("WorkAddress"), + ::rtl::OUString::createFromAscii("WorkAddress2"), + ::rtl::OUString::createFromAscii("WorkCity"), + ::rtl::OUString::createFromAscii("WorkState"), + ::rtl::OUString::createFromAscii("WorkZipCode"), + ::rtl::OUString::createFromAscii("WorkCountry"), + ::rtl::OUString::createFromAscii("JobTitle"), + ::rtl::OUString::createFromAscii("Department"), + ::rtl::OUString::createFromAscii("Company"), + ::rtl::OUString::createFromAscii("WebPage1"), + ::rtl::OUString::createFromAscii("WebPage2"), + ::rtl::OUString::createFromAscii("BirthYear"), + ::rtl::OUString::createFromAscii("BirthMonth"), + ::rtl::OUString::createFromAscii("BirthDay"), + ::rtl::OUString::createFromAscii("Notes") +}; +//------------------------------------------------------------------------------ +OColumnAlias::OColumnAlias() +{ + // Initialise m_aAlias with the default values from sProgrammaticNames. + initialise(); + + // Initialise m_aAlias map with the default values from sProgrammaticNames. + setAliasMap(); +} +//------------------------------------------------------------------ +OColumnAlias::~OColumnAlias() +{ +} +//------------------------------------------------------------------ +void OColumnAlias::initialise() +{ + m_aAlias.reserve( END - FIRSTNAME + 1 ); + for (sal_Int32 i(FIRSTNAME); i < END; ++i) + { + m_aAlias.push_back(sProgrammaticNames[i]); + m_aHeadLineNames.push_back(sProgrammaticNames[i]); + } + + return; +} +//------------------------------------------------------------------ +void OColumnAlias::setAlias(const ::com::sun::star::uno::Reference< + ::com::sun::star::lang::XMultiServiceFactory >& _rxORB) +{ + OSL_TRACE("OColumnAlias::setAlias()entered"); + + // open our driver settings config node + + // the config path for our own driver's settings + Reference< XPropertySet > xEvoDriverNode = createDriverConfigNode( _rxORB, OEvoabDriver::getImplementationName_Static() ); + //Reference< XPropertySet > xMozDriverNode = createDriverConfigNode( _rxORB, mozab::OConnection::getDriverImplementationName() ); + Reference< XPropertySet > xMozDriverNode = createDriverConfigNode( _rxORB, ::rtl::OUString::createFromAscii ("com.sun.star.comp.sdbc.MozabDriver") ); + if ( xEvoDriverNode.is() && xMozDriverNode.is() ) + { + try + { + //============================================================= + Reference< XNameAccess > xEvoAliasesNode; + Reference< XNameAccess > xMozAliasesNode; + xEvoDriverNode->getPropertyValue( ::rtl::OUString::createFromAscii("ColumnAliases") ) >>= xEvoAliasesNode; + xMozDriverNode->getPropertyValue( ::rtl::OUString::createFromAscii("ColumnAliases") ) >>= xMozAliasesNode; + OSL_ENSURE( xEvoAliasesNode.is(), "OColumnAlias::setAlias: missing the evolution aliases node!" ); + OSL_ENSURE( xMozAliasesNode.is(), "OColumnAlias::setAlias: missing the mozilla aliases node!" ); + + // this is a set of string nodes + Sequence< ::rtl::OUString > aColumnProgrammaticNames; + //OSL_TRACE("OColumnAlias::setAlias()before xAliasesNode->getElementNames()"); + if ( xEvoAliasesNode.is() ) + aColumnProgrammaticNames = xEvoAliasesNode->getElementNames(); + //OSL_TRACE("OColumnAlias::setAlias()after xAliasesNode->getElementNames()"); + + //============================================================= + // travel through all the set elements + const ::rtl::OUString* pProgrammaticNames = aColumnProgrammaticNames.getConstArray(); + const ::rtl::OUString* pProgrammaticNamesEnd = pProgrammaticNames + aColumnProgrammaticNames.getLength(); + ::rtl::OUString sAssignedAlias; + ::rtl::OUString sHeadLineName; + + for ( ; pProgrammaticNames < pProgrammaticNamesEnd; ++pProgrammaticNames ) + { + //OSL_TRACE("OColumnAlias::setAlias()::*pProgrammaticNames = %s\n", ((OUtoCStr(*pProgrammaticNames)) ? (OUtoCStr(*pProgrammaticNames)):("NULL")) ); + OSL_ENSURE( m_aAliasMap.end() != m_aAliasMap.find( *pProgrammaticNames ), + "OColumnAlias::setAlias: found an invalid programmtic name!" ); + // if this asserts, somebody stored a programmatic name in the configuration + // which is not allowed (i.e. not in the list of known programmatics). + //OSL_TRACE("OColumnAlias::setAlias()before xAliasesNode->getByName()"); + +#if OSL_DEBUG_LEVEL > 0 + sal_Bool bExtractionSuccess = +#endif + xMozAliasesNode->getByName( *pProgrammaticNames) >>= sAssignedAlias; + OSL_ENSURE( bExtractionSuccess, "OColumnAlias::setAlias: invalid mozilla config data!" ); +#if OSL_DEBUG_LEVEL > 0 + bExtractionSuccess = +#endif + xEvoAliasesNode->getByName( *pProgrammaticNames) >>= sHeadLineName; + OSL_ENSURE( bExtractionSuccess, "OColumnAlias::setAlias: invalid evolution config data!" ); + //OSL_TRACE("OColumnAlias::setAlias()after xAliasesNode->getByName()"); + + // normalize in case the config data is corrupted + // (what we really don't need is an empty alias ...) + if ( 0 == sAssignedAlias.getLength() ) + sAssignedAlias = *pProgrammaticNames; + if ( 0 == sHeadLineName.getLength() ) + sHeadLineName = *pProgrammaticNames; + //OSL_TRACE("OColumnAlias::setAlias()::sAssignedAlias = %s\n", ((OUtoCStr(sAssignedAlias)) ? (OUtoCStr(sAssignedAlias)):("NULL")) ); + //OSL_TRACE("OColumnAlias::setAlias()::sHeadLineName = %s\n", ((OUtoCStr(sHeadLineName)) ? (OUtoCStr(sHeadLineName)):("NULL")) ); + + //============================================================= + // check the value + // look up the programmatic indicated by pProgrammaticNames in the known programmatics + const ::rtl::OUString* pProgrammatic = sProgrammaticNames + FIRSTNAME; + const ::rtl::OUString* pProgrammaticEnd = sProgrammaticNames + END; + + OSL_ENSURE( (sal_Int32)m_aAlias.size() == pProgrammaticEnd - pProgrammatic, + "OColumnAlias::setAlias: aliases vector not yet initialized!" ); + + // the destination where we want to remember the alias + ::std::vector< ::rtl::OUString >::iterator aAlias = m_aAlias.begin(); + ::std::vector< ::rtl::OUString >::iterator aHeadLineName = m_aHeadLineNames.begin(); + + for ( ; pProgrammatic < pProgrammaticEnd; ++pProgrammatic, ++aAlias, ++aHeadLineName ) + { + //OSL_TRACE("OColumnAlias::setAlias()::*pProgrammatic = %s\n", ((OUtoCStr(*pProgrammatic)) ? (OUtoCStr(*pProgrammatic)):("NULL")) ); + if ( pProgrammaticNames->equals( *pProgrammatic ) ) + { + // add alias to the vector + *aAlias = sAssignedAlias; + *aHeadLineName = sHeadLineName; + break; + } + } + } + } + catch( const Exception& ) + { + OSL_ENSURE( sal_False, "OColumnAlias::setAlias: could not read my driver's configuration data!" ); + } + } + + // Initialise m_aAliasMap. + setAliasMap(); + + return; +} +//------------------------------------------------------------------ +const ::std::vector< ::rtl::OUString> & OColumnAlias::getAlias() const +{ + return m_aAlias; +} +//------------------------------------------------------------------ +const ::std::map< ::rtl::OUString, ::rtl::OUString> & OColumnAlias::getAliasMap() const +{ + return m_aAliasMap; +} +//------------------------------------------------------------------ +void OColumnAlias::setAliasMap() +{ + // Fill the map with the values of m_aAlias + // and the sProgrammaticNames array. + for (sal_Int32 i(FIRSTNAME); i < END; ++i) { + m_aAliasMap[m_aAlias[i]] = m_aHeadLineNames[i]; + //OSL_TRACE("OColumnAlias::setAliasMap()::m_aAlias[i] = %s\n", ((OUtoCStr(m_aAlias[i])) ? (OUtoCStr(m_aAlias[i])):("NULL")) ); + //OSL_TRACE("OColumnAlias::setAliasMap()::m_aAliasMap[m_aAlias[i]] = %s\n", ((OUtoCStr(m_aAliasMap[m_aAlias[i]])) ? (OUtoCStr(m_aAliasMap[m_aAlias[i]])):("NULL")) ); + } + + return; +} +//------------------------------------------------------------------ diff --git a/connectivity/source/drivers/evoab/LColumnAlias.hxx b/connectivity/source/drivers/evoab/LColumnAlias.hxx new file mode 100644 index 000000000000..c91931d121bf --- /dev/null +++ b/connectivity/source/drivers/evoab/LColumnAlias.hxx @@ -0,0 +1,116 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: LColumnAlias.hxx,v $ + * $Revision: 1.4 $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef _CONNECTIVITY_EVOAB_LCOLUMNALIAS_HXX_ +#define _CONNECTIVITY_EVOAB_LCOLUMNALIAS_HXX_ + +#include <unotools/confignode.hxx> + +#include <osl/mutex.hxx> +#include <vector> +#include <map> + +namespace connectivity +{ + namespace evoab + { + typedef enum { + FIRSTNAME = 0, + LASTNAME, + DISPLAYNAME, + NICKNAME, + PRIMARYEMAIL, + SECONDEMAIL, + PREFERMAILFORMAT, + WORKPHONE, + HOMEPHONE, + FAXNUMBER, + PAGERNUMBER, + CELLULARNUMBER, + HOMEADDRESS, + HOMEADDRESS2, + HOMECITY, + HOMESTATE, + HOMEZIPCODE, + HOMECOUNTRY, + WORKADDRESS, + WORKADDRESS2, + WORKCITY, + WORKSTATE, + WORKZIPCODE, + WORKCOUNTRY, + JOBTITLE, + DEPARTMENT, + COMPANY, + WEBPAGE1, + WEBPAGE2, + BIRTHYEAR, + BIRTHMONTH, + BIRTHDAY, + NOTES, + END + } ProgrammaticName; + + class OColumnAlias + { + /** + * m_Alias holds aliases for the evolution addressbook + * column names. This member gets initialised during + * creation of the connection to the driver. + * m_aAlias initialises m_aAliasMap which then can be + * used to find the corresponding programmatic name + * when an alias is used as a query attribute. Mozilla + * expects programmatic names from its clients. + * + * m_aAlias: vector of aliases used to initialise m_aAliasMap. + * m_AliasMap: map of {alias, programmaticname} pairs. + * + */ + private: + ::std::vector< ::rtl::OUString> m_aAlias; + ::std::vector< ::rtl::OUString> m_aHeadLineNames; + ::std::map< ::rtl::OUString, ::rtl::OUString> m_aAliasMap; + protected: + ::osl::Mutex m_aMutex; + public: + void initialise(void); + const ::std::vector< ::rtl::OUString> & getAlias(void) const; + const ::std::map< ::rtl::OUString, ::rtl::OUString> & getAliasMap(void) const; + void setAlias(const ::com::sun::star::uno::Reference< + ::com::sun::star::lang::XMultiServiceFactory > &); + private: + void setAliasMap(void); + public: + OColumnAlias(void); + ~OColumnAlias(void); + }; + } +} +#endif // _CONNECTIVITY_EVOAB_LCOLUMNALIAS_HXX_ diff --git a/connectivity/source/drivers/evoab/LColumns.cxx b/connectivity/source/drivers/evoab/LColumns.cxx new file mode 100644 index 000000000000..9608c8efd384 --- /dev/null +++ b/connectivity/source/drivers/evoab/LColumns.cxx @@ -0,0 +1,60 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: LColumns.cxx,v $ + * $Revision: 1.6 $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_connectivity.hxx" + +#include "LColumns.hxx" +#include "LTable.hxx" +#include "connectivity/sdbcx/VColumn.hxx" + +using namespace connectivity::evoab; +using namespace connectivity; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::beans; +using namespace ::com::sun::star::sdbcx; +using namespace ::com::sun::star::sdbc; +using namespace ::com::sun::star::container; + + +sdbcx::ObjectType OEvoabColumns::createObject(const ::rtl::OUString& _rName) +{ + + OEvoabTable* pTable = (OEvoabTable*)m_pTable; + ::vos::ORef<OSQLColumns> aCols = pTable->getTableColumns(); + OSQLColumns::Vector::const_iterator aIter = find(aCols->get().begin(),aCols->get().end(),_rName,::comphelper::UStringMixEqual(isCaseSensitive())); + sdbcx::ObjectType xRet; + if(aIter != aCols->get().end()) + xRet = sdbcx::ObjectType(*aIter,UNO_QUERY); + return xRet; +} +// ------------------------------------------------------------------------- + + diff --git a/connectivity/source/drivers/evoab/LColumns.hxx b/connectivity/source/drivers/evoab/LColumns.hxx new file mode 100644 index 000000000000..457f319ca7b1 --- /dev/null +++ b/connectivity/source/drivers/evoab/LColumns.hxx @@ -0,0 +1,55 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: LColumns.hxx,v $ + * $Revision: 1.5 $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef _CONNECTIVITY_EVOAB_LCOLUMNS_HXX_ +#define _CONNECTIVITY_EVOAB_LCOLUMNS_HXX_ + +#include "file/FColumns.hxx" + +namespace connectivity +{ + namespace evoab + { + class OEvoabColumns : public file::OColumns + { + protected: + virtual sdbcx::ObjectType createObject(const ::rtl::OUString& _rName); + public: + OEvoabColumns(file::OFileTable* _pTable, + ::osl::Mutex& _rMutex, + const TStringVector &_rVector + ) : file::OColumns(_pTable,_rMutex,_rVector) + {} + + }; + } +} +#endif // _CONNECTIVITY_EVOAB_LCOLUMNS_HXX_ + diff --git a/connectivity/source/drivers/evoab/LConfigAccess.cxx b/connectivity/source/drivers/evoab/LConfigAccess.cxx new file mode 100644 index 000000000000..9df502d35d70 --- /dev/null +++ b/connectivity/source/drivers/evoab/LConfigAccess.cxx @@ -0,0 +1,164 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: LConfigAccess.cxx,v $ + * $Revision: 1.6 $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_connectivity.hxx" +#include "LConfigAccess.hxx" +#include "LDriver.hxx" +#ifndef CONNECTIVITY_EVOAB_DEBUG_HELPER_HXX +#include "LDebug.hxx" +#endif + +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::lang; +using namespace ::com::sun::star::beans; + +//......................................................................... +namespace connectivity +{ + namespace evoab + { + //----------------------------------------------------------------- + Reference< XPropertySet > createDriverConfigNode( Reference< XMultiServiceFactory > _rxORB, ::rtl::OUString _sDriverImplementationName ) + { + OSL_TRACE("createDriverConfigNode()entered"); + + Reference< XPropertySet > xNode; + try + { + //============================================================= + // create the config provider + Reference< XMultiServiceFactory > xConfigProvider( + _rxORB->createInstance( ::rtl::OUString::createFromAscii( "com.sun.star.configuration.ConfigurationProvider" ) ), + UNO_QUERY + ); + OSL_ENSURE( xConfigProvider.is(), "createDriverConfigNode: could not create the config provider!" ); + + if ( xConfigProvider.is() ) + { + ::rtl::OUString sCompleteNodePath = ::rtl::OUString::createFromAscii ("/org.openoffice.Office.DataAccess/DriverSettings/" ); + sCompleteNodePath += _sDriverImplementationName; + //sCompleteNodePath += OEvoabConnection::getDriverImplementationName(); + //sCompleteNodePath += ::rtl::OUString::createFromAscii ("com.sun.star.comp.sdbc.MozabDriver"); + EVO_TRACE_STRING("createDriverConfigNode()::sCompleteNodePath = %s\n", sCompleteNodePath ); + + //========================================================= + // arguments for creating the config access + Sequence< Any > aArguments(2); + // the path to the node to open + aArguments[0] <<= PropertyValue( + ::rtl::OUString::createFromAscii( "nodepath"), + 0, + makeAny( sCompleteNodePath ), + PropertyState_DIRECT_VALUE + ); + // the depth: -1 means unlimited + aArguments[1] <<= PropertyValue( + ::rtl::OUString::createFromAscii( "depth"), + 0, + makeAny( (sal_Int32)-1 ), + PropertyState_DIRECT_VALUE + ); + + //========================================================= + // create the access + Reference< XInterface > xAccess = xConfigProvider->createInstanceWithArguments( + ::rtl::OUString::createFromAscii( "com.sun.star.configuration.ConfigurationAccess" ), + aArguments + ); + OSL_ENSURE( xAccess.is(), "createDriverConfigNode: invalid access returned (should throw an exception instead)!" ); + + xNode = xNode.query( xAccess ); + } + } + catch( const Exception& ) + { + OSL_ENSURE( sal_False, "createDriverConfigNode: caught an exception while accessing the driver's config node!" ); + } + + // outta here + return xNode; + } + + //----------------------------------------------------------------- + namespace + { + // a private helper to accessing the point where we store the reference + // to the factory + Reference< XMultiServiceFactory >& accessFactoryStorage( ) + { + static Reference< XMultiServiceFactory > xEvoabServiceFactory; + return xEvoabServiceFactory; + } + } + + //----------------------------------------------------------------- + void setEvoabServiceFactory( const Reference< XMultiServiceFactory >& _rxFactory ) + { + accessFactoryStorage( ) = _rxFactory; + } + + //----------------------------------------------------------------- + const Reference< XMultiServiceFactory >& getEvoabServiceFactory( ) + { + return accessFactoryStorage( ); + } + + //----------------------------------------------------------------- + ::rtl::OUString getFullPathExportingCommand( Reference< XMultiServiceFactory > _rxORB ) + { + ::rtl::OUString sFullPathExportingCommand; + + //Reference< XMultiServiceFactory > xFactory = getEvoabServiceFactory(); + //OSL_ENSURE( xFactory.is(), "getPreferredProfileName: invalid service factory!" ); + OSL_ENSURE( _rxORB.is(), "getFullPathExportingCommand: invalid service factory!" ); + if ( _rxORB.is() ) + { + try + { + Reference< XPropertySet > xDriverNode = createDriverConfigNode( _rxORB, OEvoabDriver::getImplementationName_Static() ); + Reference< XPropertySet > xEvoPrefsNode; + if ( xDriverNode.is() ) + xDriverNode->getPropertyValue( ::rtl::OUString::createFromAscii( "EvolutionPreferences" ) ) >>= xEvoPrefsNode; + OSL_ENSURE( xEvoPrefsNode.is(), "getFullPathExportingCommand: could not access the node for the evolution preferences!" ); + if ( xEvoPrefsNode.is() ) + xEvoPrefsNode->getPropertyValue( ::rtl::OUString::createFromAscii( "FullPathExportingCommand" ) ) >>= sFullPathExportingCommand; + } + catch( const Exception& ) + { + OSL_ENSURE( sal_False, "getFullPathExportingCommand: caught an exception!" ); + } + } + return sFullPathExportingCommand; + } + } +} + +//......................................................................... diff --git a/connectivity/source/drivers/evoab/LConfigAccess.hxx b/connectivity/source/drivers/evoab/LConfigAccess.hxx new file mode 100644 index 000000000000..9df43ef3226b --- /dev/null +++ b/connectivity/source/drivers/evoab/LConfigAccess.hxx @@ -0,0 +1,49 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: LConfigAccess.hxx,v $ + * $Revision: 1.4 $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef _CONNECTIVITY_EVOAB_LCONFIGACCESS_HXX_ +#define _CONNECTIVITY_EVOAB_LCONFIGACCESS_HXX_ + +// This is the extended version (for use on the SO side of the driver) of MConfigAccess +// (which is for use on the mozilla side only) + +#include <com/sun/star/beans/XPropertySet.hpp> +#include <com/sun/star/lang/XMultiServiceFactory.hpp> + +namespace connectivity +{ + namespace evoab + { + ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet > + createDriverConfigNode( ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory > _rxORB, ::rtl::OUString _sDriverImplementationName ); + ::rtl::OUString getFullPathExportingCommand( ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory > _rxORB ); + } +} +#endif // _CONNECTIVITY_EVOAB_LCONFIGACCESS_HXX_ diff --git a/connectivity/source/drivers/evoab/LConnection.cxx b/connectivity/source/drivers/evoab/LConnection.cxx new file mode 100644 index 000000000000..383354d8ff5f --- /dev/null +++ b/connectivity/source/drivers/evoab/LConnection.cxx @@ -0,0 +1,270 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: LConnection.cxx,v $ + * $Revision: 1.12.56.1 $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_connectivity.hxx" +#include "LConnection.hxx" +#include "LDatabaseMetaData.hxx" +#include "LCatalog.hxx" +#include <com/sun/star/lang/DisposedException.hpp> +#include <tools/urlobj.hxx> +#include "LPreparedStatement.hxx" +#include "LStatement.hxx" +#include <comphelper/extract.hxx> +#include <connectivity/dbcharset.hxx> +#include <connectivity/dbexception.hxx> +#include <comphelper/processfactory.hxx> +#include <vos/process.hxx> +#include <tools/debug.hxx> +#include "LDebug.hxx" +#include "diagnose_ex.h" +#include <comphelper/sequence.hxx> +#include <connectivity/dbexception.hxx> +#include "resource/common_res.hrc" + +using namespace connectivity::evoab; +using namespace connectivity::file; +using namespace vos; + +typedef connectivity::file::OConnection OConnection_B; + +//------------------------------------------------------------------------------ +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::beans; +using namespace ::com::sun::star::sdbcx; +using namespace ::com::sun::star::sdbc; +using namespace ::com::sun::star::lang; + +::rtl::OUString implGetExceptionMsg( Exception& e, const ::rtl::OUString& aExceptionType_ ) +{ + ::rtl::OUString aExceptionType = aExceptionType_; + if( aExceptionType.getLength() == 0 ) + aExceptionType = ::rtl::OUString( ::rtl::OUString::createFromAscii("Unknown" ) ); + + ::rtl::OUString aTypeLine( ::rtl::OUString::createFromAscii("\nType: " ) ); + aTypeLine += aExceptionType; + + ::rtl::OUString aMessageLine( ::rtl::OUString::createFromAscii("\nMessage: " ) ); + aMessageLine += ::rtl::OUString( e.Message ); + + ::rtl::OUString aMsg(aTypeLine); + aMsg += aMessageLine; + return aMsg; +} + + // Exception type unknown +::rtl::OUString implGetExceptionMsg( Exception& e ) +{ + ::rtl::OUString aMsg = implGetExceptionMsg( e, ::rtl::OUString() ); + return aMsg; +} + +// -------------------------------------------------------------------------------- +OEvoabConnection::OEvoabConnection(OEvoabDriver* _pDriver) : OConnection(_pDriver) + ,m_bHeaderLine(sal_True) + ,m_cFieldDelimiter(',') + ,m_cStringDelimiter('"') + ,m_cDecimalDelimiter('.') + ,m_cThousandDelimiter(' ') +{ + // Initialise m_aColumnAlias. + m_aColumnAlias.setAlias(_pDriver->getFactory()); +} +//----------------------------------------------------------------------------- +OEvoabConnection::~OEvoabConnection() +{ +} + +// XServiceInfo +// -------------------------------------------------------------------------------- +IMPLEMENT_SERVICE_INFO(OEvoabConnection, "com.sun.star.sdbc.drivers.evoab.Connection", "com.sun.star.sdbc.Connection") + +//----------------------------------------------------------------------------- +void OEvoabConnection::construct(const ::rtl::OUString& url,const Sequence< PropertyValue >& info) throw(SQLException) +{ + osl_incrementInterlockedCount( &m_refCount ); + EVO_TRACE_STRING("OEvoabConnection::construct()::url = %s\n", url ); + + + ::rtl::OUString aCLICommand = getDriver()->getEvoab_CLI_EffectiveCommand(); + ::rtl::OUString aWorkingDirPath = getDriver()->getWorkingDirPath(); + ::rtl::OUString aArg1 = ::rtl::OUString::createFromAscii(OEvoabDriver::getEVOAB_CLI_ARG_LIST_FOLDERS()); + ::rtl::OUString aArg2 = ::rtl::OUString::createFromAscii(OEvoabDriver::getEVOAB_CLI_ARG_OUTPUT_FILE_PREFIX()); + aArg2 += aWorkingDirPath; + aArg2 += getDriver()->getEvoFolderListFileName(); + OArgumentList aArgs(2,&aArg1,&aArg2); + + EVO_TRACE_STRING("OEvoabConnection::construct()::aCLICommand = %s\n", aCLICommand ); + EVO_TRACE_STRING("OEvoabConnection::construct()::aWorkingDirPath = %s\n", aWorkingDirPath ); + EVO_TRACE_STRING("OEvoabConnection::construct()::aArg1 = %s\n", aArg1 ); + EVO_TRACE_STRING("OEvoabConnection::construct()::aArg2 = %s\n", aArg2 ); + OProcess aApp( aCLICommand,aWorkingDirPath); + OSL_VERIFY_EQUALS( + aApp.execute( (OProcess::TProcessOption)(OProcess::TOption_Hidden | OProcess::TOption_Wait | OProcess::TOption_SearchPath),aArgs), + OProcess::E_None, + "Error at execute evolution-addressbook-export to get VCards"); + + + Sequence<PropertyValue> aDriverParam; + ::std::vector<PropertyValue> aParam; + + aParam.push_back(PropertyValue(::rtl::OUString::createFromAscii("EnableSQL92Check"), 0, Any(), PropertyState_DIRECT_VALUE)); + ::dbtools::OCharsetMap aLookupIanaName; + ::dbtools::OCharsetMap::const_iterator aLookup = aLookupIanaName.find(RTL_TEXTENCODING_UTF8); + aParam.push_back(PropertyValue(::rtl::OUString::createFromAscii("CharSet"), 0, + makeAny((*aLookup).getIanaName()), PropertyState_DIRECT_VALUE)); + aParam.push_back(PropertyValue(::rtl::OUString::createFromAscii("Extension"), 0, makeAny(getDriver()->getFileExt()), PropertyState_DIRECT_VALUE)); + aParam.push_back(PropertyValue(::rtl::OUString::createFromAscii("HeaderLine"), 0, makeAny(m_bHeaderLine), PropertyState_DIRECT_VALUE)); + aParam.push_back(PropertyValue(::rtl::OUString::createFromAscii("FieldDelimiter"), 0, makeAny(::rtl::OUString(&m_cFieldDelimiter,1)), PropertyState_DIRECT_VALUE)); + aParam.push_back(PropertyValue(::rtl::OUString::createFromAscii("StringDelimiter"), 0, makeAny(::rtl::OUString(&m_cStringDelimiter,1)), PropertyState_DIRECT_VALUE)); + aParam.push_back(PropertyValue(::rtl::OUString::createFromAscii("DecimalDelimiter"), 0, makeAny(::rtl::OUString(&m_cDecimalDelimiter,1)), PropertyState_DIRECT_VALUE)); + aParam.push_back(PropertyValue(::rtl::OUString::createFromAscii("ThousandDelimiter"), 0, makeAny(::rtl::OUString(&m_cThousandDelimiter,1)), PropertyState_DIRECT_VALUE)); + + // build a new parameter sequence from the original parameters, appended by the new parameters from above + PropertyValue *pParams = aParam.empty() ? 0 : &aParam[0]; + aDriverParam = ::comphelper::concatSequences( + info, + Sequence< PropertyValue >( pParams, aParam.size() ) + ); + + // transform "sdbc:address:evolution" part of URL to "sdbc:flat:file:///..." + // + sal_Int32 nLen = url.indexOf(':'); + nLen = url.indexOf(':',nLen+1); + ::rtl::OUString aAddrbookURI(url.copy(nLen+1)); + // Get Scheme + nLen = aAddrbookURI.indexOf(':'); + ::rtl::OUString aAddrbookScheme; + if ( nLen == -1 ) + { + // There isn't any subschema: - but could be just subschema + if ( aAddrbookURI.getLength() > 0 ) + { + aAddrbookScheme= aAddrbookURI; + } + else + { + OSL_TRACE( "No subschema given!!!\n"); + throwGenericSQLException(STR_URI_SYNTAX_ERROR ,*this); + } + } + else + { + aAddrbookScheme = aAddrbookURI.copy(0, nLen); + } + + EVO_TRACE_STRING("OEvoabConnection::construct()::URI = %s\n", aAddrbookURI ); + EVO_TRACE_STRING("OEvoabConnection::construct()::Scheme = %s\n", aAddrbookScheme ); + + // + // Now we have a URI convert it to a Evolution CLI flat file URI + // + // The Mapping being used is: + // + // * for Evolution + // "sdbc:address:evolution:" -> "sdbc:flat:file:///(file path generated) + + rtl::OUString aEvoFlatURI; + if ( aAddrbookScheme.compareToAscii( OEvoabDriver::getSDBC_SCHEME_EVOLUTION() ) == 0 ) + { + aEvoFlatURI = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( "sdbc:flat:" )); + } + + + aEvoFlatURI += getDriver()->getWorkingDirURL(); + EVO_TRACE_STRING("OEvoabConnection::construct()::m_aEvoFlatURI = %s\n", aEvoFlatURI ); + //setURL(aEvoFlatURI); + m_aEvoFlatURI = aEvoFlatURI; + + osl_decrementInterlockedCount( &m_refCount ); + OConnection::construct(aEvoFlatURI,aDriverParam); +} +// -------------------------------------------------------------------------------- +Reference< XDatabaseMetaData > SAL_CALL OEvoabConnection::getMetaData( ) throw(SQLException, RuntimeException) +{ + ::osl::MutexGuard aGuard( m_aMutex ); + checkDisposed(OConnection_B::rBHelper.bDisposed); + + + Reference< XDatabaseMetaData > xMetaData = m_xMetaData; + if(!xMetaData.is()) + { + xMetaData = new OEvoabDatabaseMetaData(this); + m_xMetaData = xMetaData; + } + + return xMetaData; +} +//------------------------------------------------------------------------------ +::com::sun::star::uno::Reference< XTablesSupplier > OEvoabConnection::createCatalog() +{ + ::osl::MutexGuard aGuard( m_aMutex ); + Reference< XTablesSupplier > xTab = m_xCatalog; + if(!xTab.is()) + { + OEvoabCatalog *pCat = new OEvoabCatalog(this); + xTab = pCat; + m_xCatalog = xTab; + } + return xTab; +} +// -------------------------------------------------------------------------------- +Reference< XStatement > SAL_CALL OEvoabConnection::createStatement( ) throw(SQLException, RuntimeException) +{ + ::osl::MutexGuard aGuard( m_aMutex ); + checkDisposed(OConnection_B::rBHelper.bDisposed); + + OEvoabStatement* pStmt = new OEvoabStatement(this); + + Reference< XStatement > xStmt = pStmt; + m_aStatements.push_back(WeakReferenceHelper(*pStmt)); + return xStmt; +} +// -------------------------------------------------------------------------------- +Reference< XPreparedStatement > SAL_CALL OEvoabConnection::prepareStatement( const ::rtl::OUString& sql ) throw(SQLException, RuntimeException) +{ + ::osl::MutexGuard aGuard( m_aMutex ); + checkDisposed(OConnection_B::rBHelper.bDisposed); + + + OEvoabPreparedStatement* pStmt = new OEvoabPreparedStatement(this); + Reference< XPreparedStatement > xStmt = pStmt; + pStmt->construct(sql); + + m_aStatements.push_back(WeakReferenceHelper(*pStmt)); + return xStmt; +} +// -------------------------------------------------------------------------------- +Reference< XPreparedStatement > SAL_CALL OEvoabConnection::prepareCall( const ::rtl::OUString& /*sql*/ ) throw(SQLException, RuntimeException) +{ + ::dbtools::throwFeatureNotImplementedException( "XConnection::prepareCall", *this ); + return NULL; +} +// ------------------------------------------------------------------------- diff --git a/connectivity/source/drivers/evoab/LConnection.hxx b/connectivity/source/drivers/evoab/LConnection.hxx new file mode 100644 index 000000000000..e0cd79eb8f78 --- /dev/null +++ b/connectivity/source/drivers/evoab/LConnection.hxx @@ -0,0 +1,81 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: LConnection.hxx,v $ + * $Revision: 1.5 $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef _CONNECTIVITY_EVOAB_LCONNECTION_HXX_ +#define _CONNECTIVITY_EVOAB_LCONNECTION_HXX_ + +#include "LDriver.hxx" +#include "file/FConnection.hxx" +#include "LColumnAlias.hxx" + +namespace connectivity +{ + namespace evoab + { + class OEvoabConnection : public file::OConnection + { + private: + OColumnAlias m_aColumnAlias; + sal_Bool m_bHeaderLine; // column names in first row + sal_Unicode m_cFieldDelimiter; // look at the name + sal_Unicode m_cStringDelimiter; // delimiter for strings m_cStringDelimiter blabla m_cStringDelimiter + sal_Unicode m_cDecimalDelimiter; // Dezimal-delimiter (Dezimalpoint) + sal_Unicode m_cThousandDelimiter; // + rtl::OUString m_aEvoFlatURI; + + public: + OEvoabConnection(OEvoabDriver* _pDriver); + virtual ~OEvoabConnection(); + + virtual void construct(const ::rtl::OUString& _rUrl,const ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue >& _rInfo ) throw( ::com::sun::star::sdbc::SQLException); + + // own methods + inline const OEvoabDriver* getDriver() const { return static_cast< const OEvoabDriver* >( m_pDriver ); } + inline sal_Bool isHeaderLine() const { return m_bHeaderLine; } + inline sal_Unicode getFieldDelimiter() const { return m_cFieldDelimiter; } + inline sal_Unicode getStringDelimiter() const { return m_cStringDelimiter; } + inline sal_Unicode getDecimalDelimiter() const { return m_cDecimalDelimiter; } + inline sal_Unicode getThousandDelimiter() const { return m_cThousandDelimiter;} + const OColumnAlias& getColumnAlias() const { return m_aColumnAlias; } + + // XServiceInfo + DECLARE_SERVICE_INFO(); + + // XConnection + virtual ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XDatabaseMetaData > SAL_CALL getMetaData( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual ::com::sun::star::uno::Reference< ::com::sun::star::sdbcx::XTablesSupplier > createCatalog(); + virtual ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XStatement > SAL_CALL createStatement( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XPreparedStatement > SAL_CALL prepareStatement( const ::rtl::OUString& sql ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XPreparedStatement > SAL_CALL prepareCall( const ::rtl::OUString& sql ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + + }; + } +} +#endif // _CONNECTIVITY_EVOAB_LCONNECTION_HXX_ diff --git a/connectivity/source/drivers/evoab/LDatabaseMetaData.cxx b/connectivity/source/drivers/evoab/LDatabaseMetaData.cxx new file mode 100644 index 000000000000..5a0f80781d2a --- /dev/null +++ b/connectivity/source/drivers/evoab/LDatabaseMetaData.cxx @@ -0,0 +1,394 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: LDatabaseMetaData.cxx,v $ + * $Revision: 1.8 $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_connectivity.hxx" +#include "LDatabaseMetaData.hxx" +#include "LConnection.hxx" +#include <com/sun/star/sdbc/DataType.hpp> +#include <com/sun/star/sdbc/ResultSetType.hpp> +#include <com/sun/star/sdbc/ColumnValue.hpp> +#include <com/sun/star/beans/XFastPropertySet.hpp> +#include <com/sun/star/sdbc/ResultSetConcurrency.hpp> +#include <com/sun/star/sdbcx/XColumnsSupplier.hpp> +#include <com/sun/star/sdbcx/XIndexesSupplier.hpp> +#include <com/sun/star/ucb/XContentAccess.hpp> +#ifndef _COM_SUN_STAR_SQLC_XROW_HPP_ +#include <com/sun/star/sdbc/XRow.hpp> +#endif +#include <tools/urlobj.hxx> +#include "FDatabaseMetaDataResultSet.hxx" +#include <com/sun/star/lang/XUnoTunnel.hpp> +#include <comphelper/extract.hxx> +#include <comphelper/types.hxx> +#include "LFolderList.hxx" +#include "connectivity/CommonTools.hxx" +#include <vos/process.hxx> +#include <osl/process.h> +#include <tools/debug.hxx> +#include <map> +#include <vector> + +#ifndef CONNECTIVITY_EVOAB_DEBUG_HELPER_HXX +#include "LDebug.hxx" +#endif +#include "diagnose_ex.h" + +using namespace ::comphelper; +using namespace connectivity; +using namespace connectivity::evoab; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::beans; +using namespace ::com::sun::star::sdbcx; +using namespace ::com::sun::star::sdbc; +using namespace ::com::sun::star::container; +using namespace ::com::sun::star::ucb; +using namespace osl; +using namespace vos; + +namespace connectivity +{ + namespace evoab + { + static sal_Int32 const s_nCOLUMN_SIZE = 256; + static sal_Int32 const s_nDECIMAL_DIGITS = 0; + static sal_Int32 const s_nNULLABLE = 1; + static sal_Int32 const s_nCHAR_OCTET_LENGTH = 65535; + } +} + +OEvoabDatabaseMetaData::OEvoabDatabaseMetaData(::connectivity::file::OConnection* _pCon) :ODatabaseMetaData(_pCon) +{ +} +// ------------------------------------------------------------------------- +OEvoabDatabaseMetaData::~OEvoabDatabaseMetaData() +{ +} +// ------------------------------------------------------------------------- +Reference< XResultSet > OEvoabDatabaseMetaData::impl_getTypeInfo_throw( ) +{ + ::osl::MutexGuard aGuard( m_aMutex ); + + ::connectivity::ODatabaseMetaDataResultSet* pResult = new ::connectivity::ODatabaseMetaDataResultSet(::connectivity::ODatabaseMetaDataResultSet::eTypeInfo); + Reference< XResultSet > xRef = pResult; + static ODatabaseMetaDataResultSet::ORows aRows; + if(aRows.empty()) + { + ODatabaseMetaDataResultSet::ORow aRow; + + aRow.push_back(ODatabaseMetaDataResultSet::getEmptyValue()); + aRow.push_back(new ORowSetValueDecorator(::rtl::OUString::createFromAscii("CHAR"))); + aRow.push_back(new ORowSetValueDecorator(DataType::CHAR)); + aRow.push_back(new ORowSetValueDecorator((sal_Int32)254)); + aRow.push_back(ODatabaseMetaDataResultSet::getQuoteValue()); + aRow.push_back(ODatabaseMetaDataResultSet::getQuoteValue()); + aRow.push_back(ODatabaseMetaDataResultSet::getEmptyValue()); + aRow.push_back(new ORowSetValueDecorator((sal_Int32)ColumnValue::NULLABLE)); + aRow.push_back(ODatabaseMetaDataResultSet::get1Value()); + aRow.push_back(new ORowSetValueDecorator((sal_Int32)ColumnSearch::CHAR)); + aRow.push_back(ODatabaseMetaDataResultSet::get1Value()); + aRow.push_back(ODatabaseMetaDataResultSet::get0Value()); + aRow.push_back(ODatabaseMetaDataResultSet::get0Value()); + aRow.push_back(ODatabaseMetaDataResultSet::getEmptyValue()); + aRow.push_back(ODatabaseMetaDataResultSet::get0Value()); + aRow.push_back(ODatabaseMetaDataResultSet::get0Value()); + aRow.push_back(ODatabaseMetaDataResultSet::getEmptyValue()); + aRow.push_back(ODatabaseMetaDataResultSet::getEmptyValue()); + aRow.push_back(new ORowSetValueDecorator((sal_Int32)10)); + + aRows.push_back(aRow); + + aRow[1] = new ORowSetValueDecorator(::rtl::OUString::createFromAscii("VARCHAR")); + aRow[2] = new ORowSetValueDecorator(DataType::VARCHAR); + aRow[4] = ODatabaseMetaDataResultSet::getQuoteValue(); + aRow[5] = ODatabaseMetaDataResultSet::getQuoteValue(); + aRows.push_back(aRow); + + + aRow[1] = new ORowSetValueDecorator(::rtl::OUString::createFromAscii("LONGVARCHAR")); + aRow[2] = new ORowSetValueDecorator(DataType::LONGVARCHAR); + aRow[3] = new ORowSetValueDecorator((sal_Int32)65535); + aRow[4] = ODatabaseMetaDataResultSet::getQuoteValue(); + aRow[5] = ODatabaseMetaDataResultSet::getQuoteValue(); + aRows.push_back(aRow); + + aRow[1] = new ORowSetValueDecorator(::rtl::OUString::createFromAscii("DATE")); + aRow[2] = new ORowSetValueDecorator(DataType::DATE); + aRow[3] = new ORowSetValueDecorator((sal_Int32)10); + aRow[4] = ODatabaseMetaDataResultSet::getQuoteValue(); + aRow[5] = ODatabaseMetaDataResultSet::getQuoteValue(); + aRows.push_back(aRow); + + aRow[1] = new ORowSetValueDecorator(::rtl::OUString::createFromAscii("TIME")); + aRow[2] = new ORowSetValueDecorator(DataType::TIME); + aRow[3] = new ORowSetValueDecorator((sal_Int32)8); + aRow[4] = ODatabaseMetaDataResultSet::getQuoteValue(); + aRow[5] = ODatabaseMetaDataResultSet::getQuoteValue(); + aRows.push_back(aRow); + + aRow[1] = new ORowSetValueDecorator(::rtl::OUString::createFromAscii("TIMESTAMP")); + aRow[2] = new ORowSetValueDecorator(DataType::TIMESTAMP); + aRow[3] = new ORowSetValueDecorator((sal_Int32)19); + aRow[4] = ODatabaseMetaDataResultSet::getQuoteValue(); + aRow[5] = ODatabaseMetaDataResultSet::getQuoteValue(); + aRows.push_back(aRow); + + aRow[1] = new ORowSetValueDecorator(::rtl::OUString::createFromAscii("BOOL")); + aRow[2] = new ORowSetValueDecorator(DataType::BIT); + aRow[3] = ODatabaseMetaDataResultSet::get1Value(); + aRow[9] = ODatabaseMetaDataResultSet::getBasicValue(); + aRows.push_back(aRow); + + aRow[1] = new ORowSetValueDecorator(::rtl::OUString::createFromAscii("DECIMAL")); + aRow[2] = new ORowSetValueDecorator(DataType::DECIMAL); + aRow[3] = new ORowSetValueDecorator((sal_Int32)20); + aRow[15] = new ORowSetValueDecorator((sal_Int32)15); + aRows.push_back(aRow); + + aRow[1] = new ORowSetValueDecorator(::rtl::OUString::createFromAscii("DOUBLE")); + aRow[2] = new ORowSetValueDecorator(DataType::DOUBLE); + aRow[3] = new ORowSetValueDecorator((sal_Int32)20); + aRow[15] = ODatabaseMetaDataResultSet::get0Value(); + aRows.push_back(aRow); + + aRow[1] = new ORowSetValueDecorator(::rtl::OUString::createFromAscii("NUMERIC")); + aRow[2] = new ORowSetValueDecorator(DataType::NUMERIC); + aRow[3] = new ORowSetValueDecorator((sal_Int32)20); + aRow[15] = new ORowSetValueDecorator((sal_Int32)20); + aRows.push_back(aRow); + } + + pResult->setRows(aRows); + return xRef; +} +// ------------------------------------------------------------------------- +Reference< XResultSet > SAL_CALL OEvoabDatabaseMetaData::getColumns( + const Any& /*catalog*/, const ::rtl::OUString& /*schemaPattern*/, const ::rtl::OUString& tableNamePattern, + const ::rtl::OUString& columnNamePattern ) throw(SQLException, RuntimeException) +{ + OSL_TRACE("OEvoabDatabaseMetaData::getColumns()::Entered\n"); + EVO_TRACE_STRING("OEvoabDatabaseMetaData::getColumns()::schemaPattern = %s\n", schemaPattern ); + EVO_TRACE_STRING("OEvoabDatabaseMetaData::getColumns()::tableNamePattern = %s\n", tableNamePattern ); + EVO_TRACE_STRING("OEvoabDatabaseMetaData::getColumns()::columnNamePattern = %s\n", columnNamePattern ); + + ::osl::MutexGuard aGuard( m_aMutex ); + + Reference< XTablesSupplier > xTables = m_pConnection->createCatalog(); + if(!xTables.is()) + throw SQLException(); + + Reference< XNameAccess> xNames = xTables->getTables(); + if(!xNames.is()) + throw SQLException(); + + ODatabaseMetaDataResultSet::ORows aRows; + ODatabaseMetaDataResultSet::ORow aRow(19); + aRow[10] = new ORowSetValueDecorator((sal_Int32)10); + Sequence< ::rtl::OUString> aTabNames(xNames->getElementNames()); + const ::rtl::OUString* pTabBegin = aTabNames.getConstArray(); + const ::rtl::OUString* pTabEnd = pTabBegin + aTabNames.getLength(); + for(;pTabBegin != pTabEnd;++pTabBegin) + { + if(match(tableNamePattern,*pTabBegin,'\0')) + { + Reference< XColumnsSupplier> xTable; + ::cppu::extractInterface(xTable,xNames->getByName(*pTabBegin)); + aRow[3] = new ORowSetValueDecorator(*pTabBegin); + + Reference< XNameAccess> xColumns = xTable->getColumns(); + if(!xColumns.is()) + throw SQLException(); + + Sequence< ::rtl::OUString> aColNames(xColumns->getElementNames()); + + const ::rtl::OUString* pBegin = aColNames.getConstArray(); + const ::rtl::OUString* pEnd = pBegin + aColNames.getLength(); + Reference< XPropertySet> xColumn; + for(sal_Int32 i=1;pBegin != pEnd;++pBegin,++i) + { + if(match(columnNamePattern,*pBegin,'\0')) + { + aRow[4] = new ORowSetValueDecorator(*pBegin); + + ::cppu::extractInterface(xColumn,xColumns->getByName(*pBegin)); + OSL_ENSURE(xColumn.is(),"Columns contains a column who isn't a fastpropertyset!"); + aRow[5] = new ORowSetValueDecorator(getINT32(xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_TYPE)))); + aRow[6] = new ORowSetValueDecorator(getString(xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_TYPENAME)))); + aRow[7] = new ORowSetValueDecorator(getINT32(xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_PRECISION)))); + aRow[9] = new ORowSetValueDecorator(getINT32(xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_SCALE)))); + aRow[11] = new ORowSetValueDecorator(getINT32(xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_ISNULLABLE)))); + aRow[13] = new ORowSetValueDecorator(getString(xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_DEFAULTVALUE)))); + + switch((sal_Int32)aRow[5]->getValue()) + { + case DataType::CHAR: + case DataType::VARCHAR: + aRow[16] = new ORowSetValueDecorator((sal_Int32)254); + break; + case DataType::LONGVARCHAR: + aRow[16] = new ORowSetValueDecorator((sal_Int32)65535); + break; + default: + aRow[16] = new ORowSetValueDecorator((sal_Int32)0); + } + aRow[17] = new ORowSetValueDecorator(i); + switch(sal_Int32(aRow[11]->getValue())) + { + case ColumnValue::NO_NULLS: + aRow[18] = new ORowSetValueDecorator(::rtl::OUString::createFromAscii("NO")); + break; + case ColumnValue::NULLABLE: + aRow[18] = new ORowSetValueDecorator(::rtl::OUString::createFromAscii("YES")); + break; + default: + aRow[18] = new ORowSetValueDecorator(::rtl::OUString()); + } + aRows.push_back(aRow); + } + } + } + } + + ::connectivity::ODatabaseMetaDataResultSet* pResult = new ::connectivity::ODatabaseMetaDataResultSet(::connectivity::ODatabaseMetaDataResultSet::eColumns); + Reference< XResultSet > xRef = pResult; + pResult->setRows(aRows); + + return xRef; +} +// ------------------------------------------------------------------------- +::rtl::OUString SAL_CALL OEvoabDatabaseMetaData::getURL( ) throw(SQLException, RuntimeException) +{ + ::osl::MutexGuard aGuard( m_aMutex ); + return ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("sdbc:flat:")) + m_pConnection->getURL(); +} +// ------------------------------------------------------------------------- +Reference< XResultSet > SAL_CALL OEvoabDatabaseMetaData::getTables( + const Any& /*catalog*/, const ::rtl::OUString& /*schemaPattern*/, + const ::rtl::OUString& /*tableNamePattern*/, const Sequence< ::rtl::OUString >& types ) throw(SQLException, RuntimeException) +{ + ::osl::MutexGuard aGuard( m_aMutex ); + + + ODatabaseMetaDataResultSet* pResult = new ODatabaseMetaDataResultSet(ODatabaseMetaDataResultSet::eTables); + Reference< XResultSet > xRef = pResult; + + // check if any type is given + // when no types are given then we have to return all tables e.g. TABLE + + static const ::rtl::OUString aTable(::rtl::OUString::createFromAscii("TABLE")); + + sal_Bool bTableFound = sal_True; + sal_Int32 nLength = types.getLength(); + if(nLength) + { + bTableFound = sal_False; + + const ::rtl::OUString* pBegin = types.getConstArray(); + const ::rtl::OUString* pEnd = pBegin + nLength; + for(;pBegin != pEnd;++pBegin) + { + if(*pBegin == aTable) + { + bTableFound = sal_True; + break; + } + } + } + if(!bTableFound) + return xRef; + + OEvoabConnection* pOEvoabConnection = (OEvoabConnection*)m_pConnection; + OEvoabFolderList* pFolderList = new OEvoabFolderList( pOEvoabConnection ); + + + ODatabaseMetaDataResultSet::ORows aRows; + sal_Bool bMoreData = sal_True; + ::rtl::OUString aName, aLocation; + sal_Int32 nCardsCount; + + pFolderList->initializeRow(3); + bMoreData = pFolderList->first(); + OSL_TRACE("OEvoabDatabaseMetaData::getTables()::first %d\n",bMoreData ); + do + { + if(bMoreData) + bMoreData = pFolderList->getRow(); + if(bMoreData) + { + aLocation = pFolderList->getString(1); + aName = pFolderList->getString(2); + nCardsCount = pFolderList->getInt(3); + EVO_TRACE_STRING( "OEvoabDatabaseMetaData::getTables()::aLocation = %s\n", aLocation ); + EVO_TRACE_STRING( "OEvoabDatabaseMetaData::getTables()::aName = %s\n", aName ); + OSL_TRACE("OEvoabDatabaseMetaData::getTables()::nCardsCount = %d\n", nCardsCount); + + ODatabaseMetaDataResultSet::ORow aRow(3); + aRow.reserve(6); + aRow.push_back(new ORowSetValueDecorator(aName)); + aRow.push_back(new ORowSetValueDecorator(aTable)); + aRow.push_back(ODatabaseMetaDataResultSet::getEmptyValue()); + aRows.push_back(aRow); + + ::rtl::OUString aWorkingDir = pOEvoabConnection->getDriver()->getWorkingDirPath(); + ::rtl::OUString aCLICommand = pOEvoabConnection->getDriver()->getEvoab_CLI_EffectiveCommand(); + ::rtl::OUString aArg1 = aLocation; + ::rtl::OUString aArg2 = ::rtl::OUString::createFromAscii(pOEvoabConnection->getDriver()->getEVOAB_CLI_ARG_OUTPUT_FILE_PREFIX()); + aArg2 += aWorkingDir; + aArg2 += aName; + aArg2 += ::rtl::OUString::createFromAscii("."); + aArg2 += ::rtl::OUString(pOEvoabConnection->getExtension()); + ::rtl::OUString aArg3 = ::rtl::OUString::createFromAscii(pOEvoabConnection->getDriver()->getEVOAB_CLI_ARG_OUTPUT_FORMAT()); + + OArgumentList aArgs(3,&aArg1,&aArg2,&aArg3); + + EVO_TRACE_STRING( "OEvoabDatabaseMetaData::getTables()::aCLICommand = %s\n", aCLICommand ); + EVO_TRACE_STRING( "OEvoabDatabaseMetaData::getTables()::aWorkingDir = %s\n", aWorkingDir ); + EVO_TRACE_STRING( "OEvoabDatabaseMetaData::getTables()::aArg1 = %s\n", aArg1 ); + EVO_TRACE_STRING( "OEvoabDatabaseMetaData::getTables()::aArg2 = %s\n", aArg2 ); + EVO_TRACE_STRING( "OEvoabDatabaseMetaData::getTables()::aArg3 = %s\n", aArg3 ); + + OProcess aApp( aCLICommand,aWorkingDir); + OSL_VERIFY_EQUALS( + aApp.execute( (OProcess::TProcessOption)(OProcess::TOption_Hidden | OProcess::TOption_Wait | OProcess::TOption_SearchPath),aArgs), + OProcess::E_None, + "Error at execute evolution-addressbook-exporter to get VCards" ); + + bMoreData = pFolderList->next(); + } + } + while ( bMoreData ); + + delete pFolderList; + pFolderList = NULL; + + pResult->setRows(aRows); + + return xRef; +} diff --git a/connectivity/source/drivers/evoab/LDatabaseMetaData.hxx b/connectivity/source/drivers/evoab/LDatabaseMetaData.hxx new file mode 100644 index 000000000000..bad565d68e54 --- /dev/null +++ b/connectivity/source/drivers/evoab/LDatabaseMetaData.hxx @@ -0,0 +1,59 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: LDatabaseMetaData.hxx,v $ + * $Revision: 1.5 $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef _CONNECTIVITY_EVOAB_LDATABASEMETADATA_HXX_ +#define _CONNECTIVITY_EVOAB_LDATABASEMETADATA_HXX_ + +#include "file/FDatabaseMetaData.hxx" +#include "FDatabaseMetaDataResultSet.hxx" + +namespace connectivity +{ + namespace evoab + { + //************************************************************** + //************ Class: java.sql.DatabaseMetaDataDate + //************************************************************** + + class OEvoabDatabaseMetaData : public file::ODatabaseMetaData + { + virtual ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XResultSet > impl_getTypeInfo_throw(); + virtual ::rtl::OUString SAL_CALL getURL( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XResultSet > SAL_CALL getColumns( const ::com::sun::star::uno::Any& catalog, const ::rtl::OUString& schemaPattern, const ::rtl::OUString& tableNamePattern, const ::rtl::OUString& columnNamePattern ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XResultSet > SAL_CALL getTables( const ::com::sun::star::uno::Any& catalog, const ::rtl::OUString& schemaPattern, const ::rtl::OUString& tableNamePattern, const ::com::sun::star::uno::Sequence< ::rtl::OUString >& types ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + protected: + virtual ~OEvoabDatabaseMetaData(); + public: + OEvoabDatabaseMetaData(file::OConnection* _pCon); + }; + } +} +#endif // _CONNECTIVITY_EVOAB_LDATABASEMETADATA_HXX_ + diff --git a/connectivity/source/drivers/evoab/LDebug.cxx b/connectivity/source/drivers/evoab/LDebug.cxx new file mode 100644 index 000000000000..64b39f7cea03 --- /dev/null +++ b/connectivity/source/drivers/evoab/LDebug.cxx @@ -0,0 +1,45 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: LDebug.cxx,v $ + * $Revision: 1.5 $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_connectivity.hxx" + +#ifndef CONNECTIVITY_EVOAB_DEBUG_HELPER_HXX +#include "LDebug.hxx" +#endif +#include <osl/diagnose.h> + +void evo_traceStringMessage( const sal_Char* _pFormat, const ::rtl::OUString& _rAsciiString ) +{ + ::rtl::OString sByteStringMessage( _rAsciiString.getStr(), _rAsciiString.getLength(), RTL_TEXTENCODING_ASCII_US ); + if ( !sByteStringMessage.getLength() ) + sByteStringMessage = "<empty>"; + OSL_TRACE( _pFormat, sByteStringMessage.getStr() ); +} diff --git a/connectivity/source/drivers/evoab/LDebug.hxx b/connectivity/source/drivers/evoab/LDebug.hxx new file mode 100644 index 000000000000..dc8a64ef796c --- /dev/null +++ b/connectivity/source/drivers/evoab/LDebug.hxx @@ -0,0 +1,45 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: LDebug.hxx,v $ + * $Revision: 1.5 $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef CONNECTIVITY_EVOAB_DEBUG_HELPER_HXX +#define CONNECTIVITY_EVOAB_DEBUG_HELPER_HXX + +#include <rtl/ustring.hxx> + +#ifdef _DEBUG + void evo_traceStringMessage( const sal_Char* _pFormat, const ::rtl::OUString& _rAsciiString ); + + #define EVO_TRACE_STRING( pFormat, rAsciiString ) evo_traceStringMessage( pFormat, rAsciiString ) +#else + #define EVO_TRACE_STRING( pFormat, rAsciiString ) (void)(0) +#endif + + +#endif // CONNECTIVITY_EVOAB_DEBUG_HELPER_HXX diff --git a/connectivity/source/drivers/evoab/LDriver.cxx b/connectivity/source/drivers/evoab/LDriver.cxx new file mode 100644 index 000000000000..379dfba4b21e --- /dev/null +++ b/connectivity/source/drivers/evoab/LDriver.cxx @@ -0,0 +1,508 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: LDriver.cxx,v $ + * $Revision: 1.10.42.1 $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_connectivity.hxx" +#include "LDriver.hxx" +#include "LConnection.hxx" +#include <com/sun/star/lang/DisposedException.hpp> +#include "connectivity/dbexception.hxx" +#include "LConfigAccess.hxx" +#include <osl/file.hxx> +#include "osl/security.hxx" +#include <comphelper/processfactory.hxx> +#include <com/sun/star/ucb/XCommandEnvironment.hpp> +#include <ucbhelper/content.hxx> +#include <tools/debug.hxx> +#include "resource/common_res.hrc" +#include "resource/sharedresources.hxx" +#include "LDebug.hxx" + +using namespace osl; +using namespace connectivity::evoab; +using namespace connectivity::file; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::beans; +using namespace ::com::sun::star::sdbcx; +using namespace ::com::sun::star::sdbc; +using namespace ::com::sun::star::lang; +using namespace ::com::sun::star::ucb; + +// -------------------------------------------------------------------------------- +OEvoabDriver::OEvoabDriver(const Reference< XMultiServiceFactory >& _rxFactory) : OFileDriver(_rxFactory) + ,m_aTempDir(NULL, sal_True) + ,m_aFolderListName(::rtl::OUString::createFromAscii(getEVOAB_FOLDERLIST_FILE_NAME())) + ,m_aVersionName(::rtl::OUString::createFromAscii(getEVOAB_VERSION_FILE_NAME())) + ,m_aFileExt(::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(getEVOAB_META_FILE_EXT()))) + ,m_bWorkingDirCreated(sal_False) + ,m_eSupportedEvoVersion( eUnknown ) +{ + m_aEvoab_CLI_FullPathCommand = getFullPathExportingCommand(_rxFactory); + + if ( m_aEvoab_CLI_FullPathCommand.getLength() == 0 ) + m_aEvoab_CLI_FullPathCommand = ::rtl::OUString::createFromAscii(getEVOAB_CLI_FULLPATHCOMMAND()); + if ( m_aEvoab_CLI_FullPathCommand.copy(0,7) != ::rtl::OUString::createFromAscii("file://") && m_aEvoab_CLI_FullPathCommand.copy(0,1) == ::rtl::OUString::createFromAscii("/")) + m_aEvoab_CLI_FullPathCommand = ::rtl::OUString::createFromAscii("file://") + m_aEvoab_CLI_FullPathCommand; + m_aEvoab_CLI_EffectiveCommand = m_aEvoab_CLI_FullPathCommand; + m_aTempDir.EnableKillingFile(); + + EVO_TRACE_STRING("OEvoabDriver::OEvoabDriver()::m_aEvoab_CLI_FullPathCommand = %s", m_aEvoab_CLI_FullPathCommand ); +} +// static ServiceInfo +//------------------------------------------------------------------------------ +rtl::OUString OEvoabDriver::getImplementationName_Static( ) throw(RuntimeException) +{ + return rtl::OUString::createFromAscii(EVOAB_DRIVER_IMPL_NAME); +} + +//------------------------------------------------------------------ +::rtl::OUString SAL_CALL OEvoabDriver::getImplementationName( ) throw(RuntimeException) +{ + return getImplementationName_Static(); +} + +//------------------------------------------------------------------ +::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > SAL_CALL connectivity::evoab::OEvoabDriver_CreateInstance(const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& _rxFactory) throw( ::com::sun::star::uno::Exception ) +{ + return *(new OEvoabDriver(_rxFactory)); +} +// -------------------------------------------------------------------------------- +Reference< XConnection > SAL_CALL OEvoabDriver::connect( const ::rtl::OUString& url, const Sequence< PropertyValue >& info ) throw(SQLException, RuntimeException) +{ + ::osl::MutexGuard aGuard( m_aMutex ); + if (ODriver_BASE::rBHelper.bDisposed) + throw DisposedException(); + + if ( ! acceptsURL(url) ) + return NULL; + + OEvoabConnection* pCon = new OEvoabConnection(this); + pCon->construct(url,info); + Reference< XConnection > xCon = pCon; + m_xConnections.push_back(WeakReferenceHelper(*pCon)); + + return xCon; +} +// -------------------------------------------------------------------------------- +namespace +{ + ::rtl::OUString lcl_translateProcessErrorMessage( oslProcessError nProcErr) + { + ::rtl::OUString sProcErr = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(" not executed!.")); + switch (nProcErr) + { + case osl_Process_E_None: + sProcErr = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(" executed sucessful!")); + break; + case osl_Process_E_NotFound: + sProcErr = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(" executed failed: not found!")); + break; + case osl_Process_E_NoPermission: + sProcErr = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(" executed failed: has no permission!")); + break; + case osl_Process_E_TimedOut: + sProcErr = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(" executed failed: time out!")); + break; + case osl_Process_E_Unknown: + sProcErr = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(" executed failed: unkown reason!")); + break; + case osl_Process_E_InvalidError: + sProcErr = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(" executed failed: invalid error!")); + break; + default: + sProcErr = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(" executed failed: other reason!")); + } + return sProcErr; + } + oslProcessError lcl_execute( const ::rtl::OUString& _rCommand, ::rtl::OUString& _rArgument, + const ::rtl::OUString& _rWorkingDir, oslProcessOption _nOptions, oslFileHandle& /*[out]*/ _hStdOut ) + { + oslProcessError nError = osl_Process_E_None; + + EVO_TRACE_STRING("LDriver.cxx::lcl_execute: command : %s", _rCommand ); + EVO_TRACE_STRING("LDriver.cxx::lcl_execute: argument : %s", _rArgument ); + EVO_TRACE_STRING("LDriver.cxx::lcl_execute: working dir: %s", _rWorkingDir ); + + oslProcess hProcess( 0 ); + + nError = osl_executeProcess_WithRedirectedIO( + _rCommand.pData, + &_rArgument.pData, + 1, + _nOptions, + 0, + _rWorkingDir.pData, + 0, + 0, + &hProcess, + NULL, + &_hStdOut, + NULL + ); + ::rtl::OUString sError = _rCommand + lcl_translateProcessErrorMessage( nError); + EVO_TRACE_STRING( "%s", sError ); + + if ( nError == osl_Process_E_None ) + { + TimeValue aFiveSeconds; + aFiveSeconds.Seconds = 5; + aFiveSeconds.Nanosec = 0; + oslProcessError nWaitForProcessError = osl_joinProcessWithTimeout( hProcess, &aFiveSeconds ); + if ( osl_Process_E_None != nWaitForProcessError ) + { + nError = nWaitForProcessError; + // TODO: kill the running process? + } + osl_freeProcessHandle( hProcess ); + } + return nError; + } +} + +// -------------------------------------------------------------------------------- +sal_Bool SAL_CALL OEvoabDriver::acceptsURL( const ::rtl::OUString& url ) + throw(SQLException, RuntimeException) +{ + sal_Bool bRet; + bRet = sal_False; + // here we have to look if we support this url format + if(acceptsURL_Stat(url)) + { + if ( m_eSupportedEvoVersion != eUnknown ) + return m_eSupportedEvoVersion == eTrue ? sal_True : sal_False; + + if(!m_bWorkingDirCreated) + { + String sTempDirURL = getTempDirURL(); + //EVO_TRACE_STRING("OEvoabDriver::acceptsURL()::sTempDirURL = %s", sTempDirURL ); + + ::rtl::OUString aTempDirURL(sTempDirURL); + m_aWorkingDirURL = aTempDirURL; + m_bWorkingDirCreated = sal_True; + } + + ::rtl::OUString aCLICommand = getEvoab_CLI_EffectiveCommand(); + ::rtl::OUString aWorkingDirURL = getWorkingDirURL(); + ::rtl::OUString aArgVersion = ::rtl::OUString::createFromAscii(getEVOAB_CLI_ARG_VERSION()); + + oslFileHandle hStdout = NULL; + oslProcessError nProcErr = lcl_execute( aCLICommand, aArgVersion, aWorkingDirURL, 0, hStdout ); + if(nProcErr != osl_Process_E_None) + { + if(doesEvoab_CLI_HavePath()) + aCLICommand = getEvoab_CLI_Command(); + else + aCLICommand = getEvoab_CLI_Path() + getEvoab_CLI_Command(); + nProcErr = lcl_execute( aCLICommand, aArgVersion, aWorkingDirURL, osl_Process_SEARCHPATH | osl_Process_HIDDEN, hStdout ); + if ( nProcErr == osl_Process_E_None ) + m_aEvoab_CLI_EffectiveCommand = aCLICommand; + } + + if ( hStdout != NULL ) + { + OSL_ASSERT( hStdout ); + sal_Char pBuffer[256]; + sal_uInt64 nBytesRead; + oslFileError nFileErr = osl_File_E_None; + nFileErr = osl_readFile( hStdout, pBuffer, 256, &nBytesRead); + if ( nFileErr != osl_File_E_None ) + { + ::rtl::OUString sErr = translateFileErrorMessage( nFileErr); + OSL_ENSURE(false, ::rtl::OUStringToOString( sErr, RTL_TEXTENCODING_ASCII_US ).getStr()); + } + ::rtl::OUString aVersionInfo; + if ( nFileErr == osl_File_E_None && nBytesRead > 0 && nBytesRead <= 256) + { + OSL_TRACE("OEvoabDriver::acceptsURL()::osl_readFile(),nBytesRead = %u",nBytesRead); + aVersionInfo = + ::rtl::OUString( ( const sal_Char * )pBuffer, + (sal_Int32)nBytesRead, + RTL_TEXTENCODING_UTF8 ); + EVO_TRACE_STRING("OEvoabDriver::acceptsURL()::aVersionInfo = %s", aVersionInfo ); + sal_Int32 nIndex = 0; + sal_Bool bNumRetrieved = sal_False; + ::rtl::OUString aToken; + sal_Int32 aVer[4]; + sal_Int32 i; + for ( i = 0; i < 4; i++ ) + aVer[i] = 0; + do + { + aToken = aVersionInfo.getToken( 0, ' ', nIndex ); + //OSL_TRACE("OEvoabDriver::acceptsURL()::Token:%d", nIndex ); + //EVO_TRACE_STRING("OEvoabDriver::acceptsURL()::aToken = %s", aToken ); + if( aToken.toChar() >= '0' && aToken.toChar() <= '9' ) + { + bNumRetrieved = sal_True; + sal_Int32 nIndex1 = 0; + ::rtl::OUString aNum; + for(i = 0; i < 4 ; i++) + { + if( nIndex1 >= 0 ) + { + aNum = aToken.getToken( 0, '.', nIndex1); + aVer[i] = aNum.toInt32(); + OSL_TRACE("OEvoabDriver::acceptsURL()::Ver[%u]=%u", i, aVer[i] ); + } + } + } + } + while ( nIndex >= 0 && !bNumRetrieved ); + + if((aVer[0]>1)||(aVer[0]==1 && aVer[1]>3)||(aVer[0]==1 && aVer[1]==3 && aVer[2]>2)||(aVer[0]==1 && aVer[1]==3 && aVer[2]==2 && aVer[3]>=99)) + bRet = sal_True; + else + bRet = sal_False; + } + else + bRet = sal_False; + + osl_closeFile( hStdout ); + } + m_eSupportedEvoVersion = bRet ? eTrue : eFalse; + } + EVO_TRACE_STRING("OEvoabDriver::acceptsURL()::return, return value = %s", ::rtl::OUString::valueOf(bRet) ); + return bRet; +} + + +// -------------------------------------------------------------------------------- +sal_Bool OEvoabDriver::acceptsURL_Stat( const ::rtl::OUString& url ) +{ + + EVO_TRACE_STRING("OEvoabDriver::acceptsURL_Stat()::Scheme = %s", url ); + // Skip 'sdbc:address: part of URL + // + sal_Int32 nLen = url.indexOf(':'); + nLen = url.indexOf(':',nLen+1); + ::rtl::OUString aAddrbookURI(url.copy(nLen+1)); + + // Get Scheme + nLen = aAddrbookURI.indexOf(':'); + ::rtl::OUString aAddrbookScheme; + if ( nLen == -1 ) + { + // There isn't any subschema: - but could be just subschema + if ( aAddrbookURI.getLength() > 0 ) + aAddrbookScheme= aAddrbookURI; + else if(url == ::rtl::OUString::createFromAscii("sdbc:address:") ) + return sal_True; // special case here + else + return sal_False; + } + else + aAddrbookScheme = aAddrbookURI.copy(0, nLen); + + + EVO_TRACE_STRING("OEvoabDriver::acceptsURL_Stat()::URI = %s", aAddrbookURI ); + EVO_TRACE_STRING("OEvoabDriver::acceptsURL_Stat()::Scheme = %s", aAddrbookScheme ); + + return aAddrbookScheme.compareToAscii( getSDBC_SCHEME_EVOLUTION() ) == 0 ; +} +// ------------------------------------------------------------------------- +const rtl::OUString OEvoabDriver::getEvoab_CLI_Command() const +{ + rtl::OUString aEvoab_CLI_Command; + sal_Int32 nLen = m_aEvoab_CLI_FullPathCommand.lastIndexOf('/'); + + if ( nLen == -1 ) + aEvoab_CLI_Command = m_aEvoab_CLI_FullPathCommand; + else + aEvoab_CLI_Command = m_aEvoab_CLI_FullPathCommand.copy(nLen+1); + + EVO_TRACE_STRING( "OEvoabDriver::getEvoab_CLI_Command()::aEvoab_CLI_Command = %s", aEvoab_CLI_Command ); + + return aEvoab_CLI_Command; +} +// ------------------------------------------------------------------------- +const rtl::OUString OEvoabDriver::getEvoab_CLI_Path() const +{ + rtl::OUString aEvoab_CLI_Path; + sal_Int32 nLen = m_aEvoab_CLI_FullPathCommand.lastIndexOf('/'); + + if ( nLen == -1 ) + { + rtl::OUString aDefault_CLI_FullPathCommand; + aDefault_CLI_FullPathCommand = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(OEvoabDriver::getEVOAB_CLI_FULLPATHCOMMAND())); + sal_Int32 nLength = aDefault_CLI_FullPathCommand.lastIndexOf('/'); + aEvoab_CLI_Path = aDefault_CLI_FullPathCommand.copy(0, nLength+1); + } + else + aEvoab_CLI_Path = m_aEvoab_CLI_FullPathCommand.copy(0, nLen+1); + EVO_TRACE_STRING( "OEvoabDriver::getEvoab_CLI_Path()::aEvoab_CLI_Path = %s", aEvoab_CLI_Path ); + + return aEvoab_CLI_Path; +} +// ------------------------------------------------------------------------- +const rtl::OUString OEvoabDriver::getWorkingDirPath() const +{ + ::rtl::OUString aWorkingDirPath; + if(m_bWorkingDirCreated) + osl::File::getSystemPathFromFileURL( m_aWorkingDirURL, aWorkingDirPath ); + return aWorkingDirPath; +} +// ------------------------------------------------------------------------- +const String OEvoabDriver::getEvoFolderListFileURL() const +{ + + ::rtl::OUString aEvoFolderListFileURL; + aEvoFolderListFileURL = getWorkingDirURL() + getEvoFolderListFileName(); + + EVO_TRACE_STRING("OEvoabDriver::getEvoFolderListFileURL(): aEvoFolderListFileURL = %s", aEvoFolderListFileURL ); + return aEvoFolderListFileURL.getStr(); +} + +// ------------------------------------------------------------------------- +String OEvoabDriver::getTempDirURL() const +{ + ::rtl::OUString aTempDirURL; + aTempDirURL = m_aTempDir.GetURL(); + if((aTempDirURL.lastIndexOf( '/')) != (aTempDirURL.getLength( ) - 1)) + aTempDirURL += ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("/")); + + EVO_TRACE_STRING("OEvoabDriver::getTempDirURL(): aTempDirURL = %s", aTempDirURL ); + return aTempDirURL.getStr(); +} +//------------------------------------------------------------------------- +sal_Bool OEvoabDriver::fileExists(const ::rtl::OUString& _rURL, sal_Bool _bIsDir) const +{ + ::ucbhelper::Content aCheckExistence; + sal_Bool bExists = sal_False; + try + { + aCheckExistence = ::ucbhelper::Content(_rURL, Reference< XCommandEnvironment >()); + if(_bIsDir) + bExists = aCheckExistence.isFolder(); + else + bExists = aCheckExistence.isDocument(); + } + catch(const Exception&) { } + return bExists; +} + +// ----------------------------------------------------------------------------- +const sal_Char* OEvoabDriver::getSDBC_SCHEME_EVOLUTION() +{ + static const sal_Char* SDBC_SCHEME_EVOLUTION = EVOAB_EVOLUTION_SCHEMA; + return SDBC_SCHEME_EVOLUTION; +} +const sal_Char* OEvoabDriver::getEVOAB_FOLDERLIST_FILE_NAME() +{ + static const sal_Char* EVOAB_FOLDERLIST_FILE_NAME = "FolderList"; + return EVOAB_FOLDERLIST_FILE_NAME; +} +const sal_Char* OEvoabDriver::getEVOAB_VERSION_FILE_NAME() +{ + static const sal_Char* EVOAB_VERSION_FILE_NAME = "EvoVersion"; + return EVOAB_VERSION_FILE_NAME; +} +const sal_Char* OEvoabDriver::getEVOAB_META_FILE_EXT() +{ + static const sal_Char* EVOAB_META_FILE_EXT = "csv"; + return EVOAB_META_FILE_EXT; +} +const sal_Char* OEvoabDriver::getEVOAB_CLI_FULLPATHCOMMAND() +{ + static const sal_Char* EVOAB_CLI_FULLPATHCOMMAND = "file:///home/evoab/extra/share/evolution/*/tools/evolution-addressbook-export"; + return EVOAB_CLI_FULLPATHCOMMAND; +} +const sal_Char* OEvoabDriver::getEVOAB_CLI_ARG_LIST_FOLDERS() +{ + static const sal_Char* EVOAB_CLI_ARG_LIST_FOLDERS = "-l"; + return EVOAB_CLI_ARG_LIST_FOLDERS; +} +const sal_Char* OEvoabDriver::getEVOAB_CLI_ARG_OUTPUT_FILE_PREFIX() +{ + static const sal_Char* EVOAB_CLI_ARG_OUTPUT_FILE_PREFIX = "--output="; + return EVOAB_CLI_ARG_OUTPUT_FILE_PREFIX; +} +const sal_Char* OEvoabDriver::getEVOAB_CLI_ARG_OUTPUT_FORMAT() +{ + static const sal_Char* EVOAB_CLI_ARG_OUTPUT_FORMAT = "--format=csv"; + return EVOAB_CLI_ARG_OUTPUT_FORMAT; +} +const sal_Char* OEvoabDriver::getEVOAB_CLI_ARG_VERSION() +{ + static const sal_Char* EVOAB_CLI_ARG_VERSION = "--version"; + return EVOAB_CLI_ARG_VERSION; +} +const sal_Char* OEvoabDriver::getEVOAB_CLI_ARG_OUTPUT_REDIRECT() +{ + static const sal_Char* EVOAB_CLI_ARG_OUTPUT_REDIRECT = ">"; + return EVOAB_CLI_ARG_OUTPUT_REDIRECT; +} +rtl::OUString OEvoabDriver::translateFileErrorMessage( oslFileError nFileErr) +{ + ::rtl::OUString sFileErr = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(" no file operation!.")); + switch (nFileErr) + { + case osl_File_E_None: + sFileErr = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(" File operation succeeded!")); + break; + case osl_File_E_INVAL: + sFileErr = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(" File operation failed: the format of the parameters was not valid!")); + break; + case osl_File_E_INTR: + sFileErr = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(" File operation failed: function call was interrupted!")); + break; + case osl_File_E_IO: + sFileErr = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(" File operation failed: I/O errors!")); + break; + case osl_File_E_ISDIR: + sFileErr = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(" File operation failed: is a directory!")); + break; + case osl_File_E_BADF: + sFileErr = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(" File operation failed: bad file!")); + break; + case osl_File_E_FAULT: + sFileErr = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(" File operation failed: bad address!")); + break; + case osl_File_E_AGAIN: + sFileErr = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(" File operation failed: operation would block!")); + break; + case osl_File_E_NOLINK: + sFileErr = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(" File operation failed: link has been severed!")); + break; + default: + sFileErr = ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM(" File operation failed: other reason!")); + } + return sFileErr; +} +// ----------------------------------------------------------------------------- +Sequence< DriverPropertyInfo > SAL_CALL OEvoabDriver::getPropertyInfo( const ::rtl::OUString& url, const Sequence< PropertyValue >& /*info*/ ) throw(SQLException, RuntimeException) +{ + if ( !acceptsURL(url) ) + { + ::connectivity::SharedResources aResources; + const ::rtl::OUString sMessage = aResources.getResourceString(STR_URI_SYNTAX_ERROR); + ::dbtools::throwGenericSQLException(sMessage ,*this); + } // if ( !acceptsURL(url) ) + return Sequence< DriverPropertyInfo >(); +} diff --git a/connectivity/source/drivers/evoab/LDriver.hxx b/connectivity/source/drivers/evoab/LDriver.hxx new file mode 100644 index 000000000000..bf45c93d9531 --- /dev/null +++ b/connectivity/source/drivers/evoab/LDriver.hxx @@ -0,0 +1,118 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: LDriver.hxx,v $ + * $Revision: 1.6 $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef _CONNECTIVITY_EVOAB_LDRIVER_HXX_ +#define _CONNECTIVITY_EVOAB_LDRIVER_HXX_ + +#include <cppuhelper/compbase2.hxx> +#include "connectivity/CommonTools.hxx" +#include "file/FDriver.hxx" +#include <unotools/tempfile.hxx> +#include <osl/file.h> +#include <osl/process.h> + +#define EVOAB_EVOLUTION_SCHEMA "evolution" +#define EVOAB_LDAP_SCHEMA "ldap" +#define EVOAB_DRIVER_IMPL_NAME "com.sun.star.comp.sdbc.evoab.OEvoabDriver" + +namespace connectivity +{ + namespace evoab + { + + ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > SAL_CALL OEvoabDriver_CreateInstance(const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& _rxFactory) throw( ::com::sun::star::uno::Exception ); + + class OEvoabDriver : public file::OFileDriver + { + private: + enum MaybeVoidBool + { + eUnknown, + eTrue, + eFalse + }; + ::utl::TempFile m_aTempDir; + rtl::OUString m_aFolderListName; + rtl::OUString m_aVersionName; + rtl::OUString m_aFileExt; + rtl::OUString m_aWorkingDirURL; + rtl::OUString m_aEvoab_CLI_EffectiveCommand; + rtl::OUString m_aEvoab_CLI_FullPathCommand; + sal_Bool m_bWorkingDirCreated; + MaybeVoidBool m_eSupportedEvoVersion; + + sal_Bool fileExists(const ::rtl::OUString& _rURL, sal_Bool _bIsDir=sal_False) const; + + public: + OEvoabDriver(const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& _rxFactory); + + inline rtl::OUString getEvoFolderListName() const { return m_aFolderListName;} + inline rtl::OUString getFileExt() const { return m_aFileExt;} + inline rtl::OUString getEvoFolderListFileName() const { return m_aFolderListName + ::rtl::OUString::createFromAscii(".") + m_aFileExt;} + inline rtl::OUString getEvoVersionFileName() const { return m_aVersionName + ::rtl::OUString::createFromAscii(".") + m_aFileExt;} + inline rtl::OUString getWorkingDirURL() const { return m_aWorkingDirURL;} + inline rtl::OUString getEvoab_CLI_FullPathCommand() const { return m_aEvoab_CLI_FullPathCommand;} + inline rtl::OUString getEvoab_CLI_EffectiveCommand() const { return m_aEvoab_CLI_EffectiveCommand;} + inline sal_Bool doesEvoab_CLI_HavePath() const { return m_aEvoab_CLI_FullPathCommand.lastIndexOf('/')!=-1;} + const rtl::OUString getEvoab_CLI_Command() const; + const rtl::OUString getEvoab_CLI_Path() const; + const rtl::OUString getWorkingDirPath() const; + const String getEvoFolderListFileURL() const; + String getTempDirURL() const; + + // XInterface + ::rtl::OUString SAL_CALL getImplementationName( ) throw(::com::sun::star::uno::RuntimeException); + // XDriver + virtual ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XConnection > SAL_CALL connect( const ::rtl::OUString& url, const ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue >& info ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Bool SAL_CALL acceptsURL( const ::rtl::OUString& url ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual ::com::sun::star::uno::Sequence< ::com::sun::star::sdbc::DriverPropertyInfo > SAL_CALL getPropertyInfo( const ::rtl::OUString& url, const ::com::sun::star::uno::Sequence< ::com::sun::star::beans::PropertyValue >& info ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + + + // static methods + static ::rtl::OUString getImplementationName_Static( ) throw(::com::sun::star::uno::RuntimeException); + static sal_Bool acceptsURL_Stat( const ::rtl::OUString& url ); + static ::rtl::OUString translateProcessErrorMessage( oslProcessError nProcErr); + static ::rtl::OUString translateFileErrorMessage( oslFileError nFileErr); + static const sal_Char* getSDBC_SCHEME_EVOLUTION(); + static const sal_Char* getEVOAB_FOLDERLIST_FILE_NAME(); + static const sal_Char* getEVOAB_VERSION_FILE_NAME(); + static const sal_Char* getEVOAB_META_FILE_EXT(); + static const sal_Char* getEVOAB_CLI_FULLPATHCOMMAND(); + static const sal_Char* getEVOAB_CLI_ARG_LIST_FOLDERS(); + static const sal_Char* getEVOAB_CLI_ARG_OUTPUT_FILE_PREFIX(); + static const sal_Char* getEVOAB_CLI_ARG_OUTPUT_FORMAT(); + static const sal_Char* getEVOAB_CLI_ARG_VERSION(); + static const sal_Char* getEVOAB_CLI_ARG_OUTPUT_REDIRECT(); + + }; + } + +} +#endif //_CONNECTIVITY_EVOAB_LDRIVER_HXX_ diff --git a/connectivity/source/drivers/evoab/LFolderList.cxx b/connectivity/source/drivers/evoab/LFolderList.cxx new file mode 100644 index 000000000000..a3c031c05c05 --- /dev/null +++ b/connectivity/source/drivers/evoab/LFolderList.cxx @@ -0,0 +1,566 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: LFolderList.cxx,v $ + * $Revision: 1.15 $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_connectivity.hxx" + +#include <ctype.h> +#include <algorithm> +#include "LFolderList.hxx" +#include <com/sun/star/sdbc/ColumnValue.hpp> +#include <com/sun/star/sdbc/DataType.hpp> +#include <svtools/converter.hxx> +#include "LConnection.hxx" +#include "LColumns.hxx" +#include <osl/thread.h> +#include <tools/config.hxx> +#include <comphelper/sequence.hxx> +#include <svtools/zforlist.hxx> +#include <rtl/math.hxx> +#include <stdio.h> //sprintf +#include <comphelper/extract.hxx> +#include <comphelper/numbers.hxx> +#include "LDriver.hxx" +#include <com/sun/star/util/NumberFormat.hpp> +#include <unotools/configmgr.hxx> +#include <i18npool/mslangid.hxx> +#include "connectivity/dbconversion.hxx" +#include <comphelper/types.hxx> +#include <unotools/ucbstreamhelper.hxx> +#include <tools/debug.hxx> +#include "connectivity/dbexception.hxx" +#ifndef CONNECTIVITY_EVOAB_DEBUG_HELPER_HXX +#include "LDebug.hxx" +#endif +#include <svtools/syslocale.hxx> + +using namespace ::comphelper; +using namespace connectivity; +using namespace connectivity::evoab; +using namespace connectivity::file; +using namespace ::cppu; +using namespace utl; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::beans; +using namespace ::com::sun::star::sdbcx; +using namespace ::com::sun::star::sdbc; +using namespace ::com::sun::star::container; +using namespace ::com::sun::star::lang; + +// ------------------------------------------------------------------------- +void OEvoabFolderList::fillColumns(const ::com::sun::star::lang::Locale& _aLocale) +{ + BOOL bRead = TRUE; + + QuotedTokenizedString aHeaderLine; + OEvoabConnection* pConnection = (OEvoabConnection*)m_pConnection; + + // read first row + QuotedTokenizedString aFirstLine; + bRead = m_pFileStream->ReadByteStringLine(aFirstLine,pConnection->getTextEncoding()); + + while(bRead && !aFirstLine.Len()) + { + bRead = m_pFileStream->ReadByteStringLine(aFirstLine,pConnection->getTextEncoding()); + } + // use first row as headerline because we need the number of columns + aHeaderLine = aFirstLine; + + // column count + xub_StrLen nFieldCount = aHeaderLine.GetTokenCount(pConnection->getFieldDelimiter(),pConnection->getStringDelimiter()); + + if(!m_aColumns.isValid()) + m_aColumns = new OSQLColumns(); + else + m_aColumns->get().clear(); + + m_aTypes.clear(); + m_aPrecisions.clear(); + m_aScales.clear(); + // reserve some space + m_aColumns->get().reserve(nFieldCount); + m_aTypes.reserve(nFieldCount); + m_aPrecisions.reserve(nFieldCount); + m_aScales.reserve(nFieldCount); + + sal_Bool bCase = getConnection()->getMetaData()->storesMixedCaseQuotedIdentifiers(); + CharClass aCharClass(pConnection->getDriver()->getFactory(),_aLocale); + // read description + sal_Unicode cDecimalDelimiter = pConnection->getDecimalDelimiter(); + sal_Unicode cThousandDelimiter = pConnection->getThousandDelimiter(); + String aColumnName; + ::rtl::OUString aTypeName; + ::comphelper::UStringMixEqual aCase(bCase); + xub_StrLen nStartPosFirstLine = 0; // use for eficient way to get the tokens + xub_StrLen nStartPosFirstLine2 = 0; + for (xub_StrLen i = 0; i < nFieldCount; i++) + { + + // no column name so ... + aColumnName = 'C'; + aColumnName += String::CreateFromInt32(i+1); + + sal_Int32 eType; + UINT16 nPrecision = 0; + UINT16 nScale = 0; + + BOOL bNumeric = FALSE; + ULONG nIndex = 0; + + // first without fielddelimiter + String aField; + aFirstLine.GetTokenSpecial(aField,nStartPosFirstLine,pConnection->getFieldDelimiter(),'\0'); + if (aField.Len() == 0 || + (pConnection->getStringDelimiter() && pConnection->getStringDelimiter() == aField.GetChar(0))) + { + bNumeric = FALSE; + } + else + { + String aField2; + if ( pConnection->getStringDelimiter() != '\0' ) + aFirstLine.GetTokenSpecial(aField2,nStartPosFirstLine2,pConnection->getFieldDelimiter(),pConnection->getStringDelimiter()); + else + aField2 = aField; + + if (aField2.Len() == 0) + { + bNumeric = FALSE; + } + else + { + bNumeric = TRUE; + xub_StrLen nDot = 0; + for (xub_StrLen j = 0; j < aField2.Len(); j++) + { + sal_Unicode c = aField2.GetChar(j); + // nur Ziffern und Dezimalpunkt und Tausender-Trennzeichen? + if ((!cDecimalDelimiter || c != cDecimalDelimiter) && + (!cThousandDelimiter || c != cThousandDelimiter) && + !aCharClass.isDigit(aField2,j)) + { + bNumeric = FALSE; + break; + } + if (cDecimalDelimiter && c == cDecimalDelimiter) + { + nPrecision = 15; // we have an decimal value + nScale = 2; + nDot++; + } + } + + if (nDot > 1) // if there is more than one dot it isn't a number + bNumeric = FALSE; + if (bNumeric && cThousandDelimiter) + { + // Ist der Trenner richtig angegeben? + String aValue = aField2.GetToken(0,cDecimalDelimiter); + for (sal_Int32 j = aValue.Len() - 4; j >= 0; j -= 4) + { + sal_Unicode c = aValue.GetChar(j); + // nur Ziffern und Dezimalpunkt und Tausender-Trennzeichen? + if (c == cThousandDelimiter && j) + continue; + else + { + bNumeric = FALSE; + break; + } + } + } + + // jetzt koennte es noch ein Datumsfeld sein + if (!bNumeric) + { + try + { + nIndex = m_xNumberFormatter->detectNumberFormat(::com::sun::star::util::NumberFormat::ALL,aField2); + } + catch(Exception&) + { + } + } + } + } + + sal_Int32 nFlags = 0; + if (bNumeric) + { + if (cDecimalDelimiter) + { + if(nPrecision) + { + eType = DataType::DECIMAL; + aTypeName = ::rtl::OUString::createFromAscii("DECIMAL"); + } + else + { + eType = DataType::DOUBLE; + aTypeName = ::rtl::OUString::createFromAscii("DOUBLE"); + } + } + else + eType = DataType::INTEGER; + nFlags = ColumnSearch::BASIC; + } + else + { + + switch (comphelper::getNumberFormatType(m_xNumberFormatter,nIndex)) + { + case NUMBERFORMAT_DATE: + eType = DataType::DATE; + aTypeName = ::rtl::OUString::createFromAscii("DATE"); + break; + case NUMBERFORMAT_DATETIME: + eType = DataType::TIMESTAMP; + aTypeName = ::rtl::OUString::createFromAscii("TIMESTAMP"); + break; + case NUMBERFORMAT_TIME: + eType = DataType::TIME; + aTypeName = ::rtl::OUString::createFromAscii("TIME"); + break; + default: + eType = DataType::VARCHAR; + nPrecision = 0; // nyi: Daten koennen aber laenger sein! + nScale = 0; + aTypeName = ::rtl::OUString::createFromAscii("VARCHAR"); + }; + nFlags |= ColumnSearch::CHAR; + } + + // check if the columname already exists + String aAlias(aColumnName); + OSQLColumns::Vector::const_iterator aFind = connectivity::find(m_aColumns->get().begin(),m_aColumns->get().end(),aAlias,aCase); + sal_Int32 nExprCnt = 0; + while(aFind != m_aColumns->get().end()) + { + (aAlias = aColumnName) += String::CreateFromInt32(++nExprCnt); + aFind = connectivity::find(m_aColumns->get().begin(),m_aColumns->get().end(),aAlias,aCase); + } + + sdbcx::OColumn* pColumn = new sdbcx::OColumn(aAlias,aTypeName,::rtl::OUString(), + ColumnValue::NULLABLE, + nPrecision, + nScale, + eType, + sal_False, + sal_False, + sal_False, + bCase); + Reference< XPropertySet> xCol = pColumn; + m_aColumns->get().push_back(xCol); + m_aTypes.push_back(eType); + m_aPrecisions.push_back(nPrecision); + m_aScales.push_back(nScale); + } + m_pFileStream->Seek(STREAM_SEEK_TO_BEGIN); +} +// ------------------------------------------------------------------------- +DBG_NAME( OEvoabFolderList ); +OEvoabFolderList::OEvoabFolderList(OEvoabConnection* _pConnection) + :m_nFilePos(0) + ,m_pFileStream(NULL) + ,m_pConnection(_pConnection) + ,m_bIsNull(sal_False) +{ + DBG_CTOR( OEvoabFolderList, NULL ); + m_aColumns = new OSQLColumns(); + + construct(); +} +// ----------------------------------------------------------------------------- +void OEvoabFolderList::construct() +{ + SvtSysLocale aLocale; + ::com::sun::star::lang::Locale aAppLocale(aLocale.GetLocaleDataPtr()->getLocale()); + Sequence< ::com::sun::star::uno::Any > aArg(1); + aArg[0] <<= aAppLocale; + + Reference< ::com::sun::star::util::XNumberFormatsSupplier > xSupplier(m_pConnection->getDriver()->getFactory()->createInstanceWithArguments(::rtl::OUString::createFromAscii("com.sun.star.util.NumberFormatsSupplier"),aArg),UNO_QUERY); + m_xNumberFormatter = Reference< ::com::sun::star::util::XNumberFormatter >(m_pConnection->getDriver()->getFactory()->createInstance(::rtl::OUString::createFromAscii("com.sun.star.util.NumberFormatter")),UNO_QUERY); + m_xNumberFormatter->attachNumberFormatsSupplier(xSupplier); + + INetURLObject aURL; + aURL.SetURL(m_pConnection->getDriver()->getEvoFolderListFileURL()); + + String aFileName = aURL.GetMainURL(INetURLObject::NO_DECODE); + + EVO_TRACE_STRING("OJ::construct()::aFileName = %s\n", aFileName ); + m_pFileStream = createStream_simpleError( aFileName,STREAM_READWRITE | STREAM_NOCREATE | STREAM_SHARE_DENYWRITE); + + if(!m_pFileStream) + m_pFileStream = createStream_simpleError( aFileName,STREAM_READ | STREAM_NOCREATE | STREAM_SHARE_DENYNONE); + + if(m_pFileStream) + { + m_pFileStream->Seek(STREAM_SEEK_TO_END); + sal_Int32 nSize = m_pFileStream->Tell(); + m_pFileStream->Seek(STREAM_SEEK_TO_BEGIN); + + // Buffersize abhaengig von der Filegroesse + m_pFileStream->SetBufferSize(nSize > 1000000 ? 32768 : + nSize > 100000 ? 16384 : + nSize > 10000 ? 4096 : 1024); + OSL_TRACE("OEvoabFolderList::construct()::m_pFileStream->Tell() = %d\n", nSize ); + + fillColumns(aAppLocale); + } +} + + +//------------------------------------------------------------------ +sal_Bool OEvoabFolderList::fetchRow(OValueRow _rRow,const OSQLColumns & _rCols) +{ + (_rRow->get())[0] = m_nFilePos; // the "bookmark" + + OEvoabConnection* pConnection = (OEvoabConnection*)m_pConnection; + // Felder: + xub_StrLen nStartPos = 0; + String aStr; + OSQLColumns::Vector::const_iterator aIter = _rCols.get().begin(); + for (sal_Int32 i = 0; aIter != _rCols.get().end();++aIter, ++i) + { + m_aCurrentLine.GetTokenSpecial(aStr,nStartPos,pConnection->getFieldDelimiter(),pConnection->getStringDelimiter()); + //OSL_TRACE("OEvoabFolderList::fetchRow()::aStr = %s\n", ((OUtoCStr(::rtl::OUString(aStr))) ? (OUtoCStr(::rtl::OUString(aStr))):("NULL")) ); + + if (aStr.Len() == 0) + (_rRow->get())[i+1].setNull(); + else + { + // length depending on the data type + sal_Int32 nType = m_aTypes[i]; + switch(nType) + { + case DataType::TIMESTAMP: + case DataType::DATE: + case DataType::TIME: + { + double nRes = 0.0; + try + { + nRes = m_xNumberFormatter->convertStringToNumber(::com::sun::star::util::NumberFormat::ALL,aStr); + Reference<XPropertySet> xProp(m_xNumberFormatter->getNumberFormatsSupplier()->getNumberFormatSettings(),UNO_QUERY); + com::sun::star::util::Date aDate; + xProp->getPropertyValue(::rtl::OUString::createFromAscii("NullDate")) >>= aDate; + + switch(nType) + { + case DataType::DATE: + (_rRow->get())[i+1] = ::dbtools::DBTypeConversion::toDouble(::dbtools::DBTypeConversion::toDate(nRes,aDate)); + break; + case DataType::TIMESTAMP: + (_rRow->get())[i+1] = ::dbtools::DBTypeConversion::toDouble(::dbtools::DBTypeConversion::toDateTime(nRes,aDate)); + break; + default: + (_rRow->get())[i+1] = ::dbtools::DBTypeConversion::toDouble(::dbtools::DBTypeConversion::toTime(nRes)); + } + } + catch(Exception&) + { + (_rRow->get())[i+1].setNull(); + } + } break; + case DataType::DOUBLE: + case DataType::INTEGER: + case DataType::DECIMAL: // #99178# OJ + case DataType::NUMERIC: + { + sal_Unicode cDecimalDelimiter = pConnection->getDecimalDelimiter(); + sal_Unicode cThousandDelimiter = pConnection->getThousandDelimiter(); + String aStrConverted; + + OSL_ENSURE(cDecimalDelimiter && nType != DataType::INTEGER || + !cDecimalDelimiter && nType == DataType::INTEGER, + "FalscherTyp"); + + // In Standard-Notation (DezimalPUNKT ohne Tausender-Komma) umwandeln: + for (xub_StrLen j = 0; j < aStr.Len(); ++j) + { + if (cDecimalDelimiter && aStr.GetChar(j) == cDecimalDelimiter) + aStrConverted += '.'; + else if ( aStr.GetChar(j) == '.' ) // special case, if decimal seperator isn't '.' we have to vut the string after it + break; // #99189# OJ + else if (cThousandDelimiter && aStr.GetChar(j) == cThousandDelimiter) + { + // weglassen + } + else + aStrConverted += aStr.GetChar(j) ; + } + double nVal = ::rtl::math::stringToDouble(aStrConverted.GetBuffer(),',','.',NULL,NULL); + + // #99178# OJ + if ( DataType::DECIMAL == nType || DataType::NUMERIC == nType ) + (_rRow->get())[i+1] = String::CreateFromDouble(nVal); + else + (_rRow->get())[i+1] = nVal; + } break; + + default: + { + // Wert als String in Variable der Row uebernehmen + (_rRow->get())[i+1] = aStr; + } + break; + } + } + } + return sal_True; +} + + +//------------------------------------------------------------------ +sal_Bool OEvoabFolderList::seekRow(IResultSetHelper::Movement eCursorPosition) +{ + //OSL_TRACE("OEvoabFolderList::seekRow()::(before SeekRow)m_aCurrentLine = %d\n", ((OUtoCStr(::rtl::OUString(m_aCurrentLine))) ? (OUtoCStr(::rtl::OUString(m_aCurrentLine))):("NULL")) ); + + if ( !m_pFileStream ) + return sal_False; + OEvoabConnection* pConnection = (OEvoabConnection*)m_pConnection; + // ---------------------------------------------------------- + // Positionierung vorbereiten: + //OSL_TRACE("OEvoabFolderList::seekRow()::(before SeekRow,m_pFileStriam Exist)m_aCurrentLine = %d\n", ((OUtoCStr(::rtl::OUString(m_aCurrentLine))) ? (OUtoCStr(::rtl::OUString(m_aCurrentLine))):("NULL")) ); + + switch(eCursorPosition) + { + case IResultSetHelper::FIRST: + m_nFilePos = 0; + // run through + + case IResultSetHelper::NEXT: + m_pFileStream->Seek(m_nFilePos); + + if (m_pFileStream->IsEof()) + { + OSL_TRACE( "OEvoabFolderList::seekRow: EOF /before/ reading the line." ); + return sal_False; + } + + m_pFileStream->ReadByteStringLine(m_aCurrentLine,pConnection->getTextEncoding()); + if (m_pFileStream->IsEof()) + { + OSL_TRACE( "OEvoabFolderList::seekRow: EOF /after/ reading the line." ); + if ( !m_aCurrentLine.Len() ) + { + OSL_TRACE( "OEvoabFolderList::seekRow: empty line read." ); + return sal_False; + } + } + m_nFilePos = m_pFileStream->Tell(); + break; + + default: + OSL_ENSURE( sal_False, "OEvoabFolderList::seekRow: unsupported positioning!" ); + break; + } + + //OSL_TRACE("OEvoabFolderList::seekRow()::(after SeekRow)m_aCurrentLine = %d\n", ((OUtoCStr(::rtl::OUString(m_aCurrentLine))) ? (OUtoCStr(::rtl::OUString(m_aCurrentLine))):("NULL")) ); + + return sal_True; +} +// ----------------------------------------------------------------------------- +SvStream* OEvoabFolderList::createStream_simpleError( const String& _rFileName, StreamMode _eOpenMode) +{ + utl::UcbLockBytesHandler* p_null_dummy=NULL; + SvStream* pReturn = ::utl::UcbStreamHelper::CreateStream( _rFileName, _eOpenMode, p_null_dummy); + if (pReturn && (ERRCODE_NONE != pReturn->GetErrorCode())) + { + delete pReturn; + pReturn = NULL; + } + return pReturn; +} +// ----------------------------------------------------------------------------- +const ORowSetValue& OEvoabFolderList::getValue(sal_Int32 _nColumnIndex ) throw(::com::sun::star::sdbc::SQLException) +{ + checkIndex( _nColumnIndex ); + + m_bIsNull = (m_aRow->get())[_nColumnIndex].isNull(); + return (m_aRow->get())[_nColumnIndex]; +} +// ----------------------------------------------------------------------------- +void OEvoabFolderList::checkIndex(sal_Int32 _nColumnIndex ) throw(::com::sun::star::sdbc::SQLException) +{ + if ( _nColumnIndex <= 0 || _nColumnIndex >= (sal_Int32)m_aRow->get().size() ) { +// ::dbtools::throwInvalidIndexException(); + ; + } +} +// ------------------------------------------------------------------------- +::rtl::OUString SAL_CALL OEvoabFolderList::getString( sal_Int32 _nColumnIndex ) throw(SQLException, RuntimeException) +{ + return getValue(_nColumnIndex); +} +// ------------------------------------------------------------------------- +sal_Int32 SAL_CALL OEvoabFolderList::getInt( sal_Int32 _nColumnIndex ) throw(SQLException, RuntimeException) +{ + return getValue( _nColumnIndex ); +} +// ----------------------------------------------------------------------------- +void OEvoabFolderList::initializeRow(sal_Int32 _nColumnCount) +{ + if(!m_aRow.isValid()) + { + m_aRow = new OValueVector(_nColumnCount); + (m_aRow->get())[0].setBound(sal_True); + ::std::for_each(m_aRow->get().begin()+1,m_aRow->get().end(),TSetBound(sal_False)); + } + //OSL_TRACE("OEvoabFolderList::initializeRow()::_nColumnCount = %d\n", _nColumnCount); + +} +// ------------------------------------------------------------------------- + +sal_Bool SAL_CALL OEvoabFolderList::first( ) throw(SQLException, RuntimeException) +{ + sal_Bool bSuccess = seekRow(IResultSetHelper::FIRST); + + EVO_TRACE_STRING("OEvoabFolderList::first(): returning %s\n", ::rtl::OUString::valueOf(bSuccess) ); + return bSuccess; +} +// ------------------------------------------------------------------------- + +sal_Bool SAL_CALL OEvoabFolderList::next( ) throw(SQLException, RuntimeException) +{ + sal_Bool bSuccess = seekRow(IResultSetHelper::NEXT); + + EVO_TRACE_STRING("OEvoabFolderList::next(): returning %s\n", ::rtl::OUString::valueOf(bSuccess) ); + return bSuccess; +} +// ------------------------------------------------------------------------- + +sal_Int32 SAL_CALL OEvoabFolderList::getRow( ) throw(SQLException, RuntimeException) +{ + sal_Bool bRet = fetchRow(m_aRow,getTableColumns().getBody()); + EVO_TRACE_STRING("OEvoabFolderList::getRow()::fetchRow() = %s\n", ::rtl::OUString::valueOf(bRet) ); + + return bRet; +} diff --git a/connectivity/source/drivers/evoab/LFolderList.hxx b/connectivity/source/drivers/evoab/LFolderList.hxx new file mode 100644 index 000000000000..baa2a3b05e86 --- /dev/null +++ b/connectivity/source/drivers/evoab/LFolderList.hxx @@ -0,0 +1,95 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: LFolderList.hxx,v $ + * $Revision: 1.6 $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef _CONNECTIVITY_EVOAB_LEVOABFOLDERLIST_HXX_ +#define _CONNECTIVITY_EVOAB_LEVOABFOLDERLIST_HXX_ + +#include "connectivity/sdbcx/VColumn.hxx" +#include "connectivity/CommonTools.hxx" +#include <tools/urlobj.hxx> +#include "LTable.hxx" +#include "TResultSetHelper.hxx" + + +namespace connectivity +{ + namespace evoab + { + //================================================================== + // Ableitung von String mit ueberladenen GetToken/GetTokenCount-Methoden + // Speziell fuer FLAT FILE-Format: Strings koennen gequotet sein + //================================================================== + + class OEvoabConnection; + + class OEvoabFolderList + { + // maps a row postion to a file position + ::std::vector<sal_Int32> m_aTypes; // holds all type for columns just to avoid to ask the propertyset + ::std::vector<sal_Int32> m_aPrecisions; // same as aboth + ::std::vector<sal_Int32> m_aScales; + QuotedTokenizedString m_aCurrentLine; + ::com::sun::star::uno::Reference< ::com::sun::star::util::XNumberFormatter > m_xNumberFormatter; + sal_Int32 m_nFilePos; // aktuelle IResultSetHelper::Movement + SvStream* m_pFileStream; + OEvoabConnection* m_pConnection; + ::vos::ORef<OSQLColumns> m_aColumns; + OValueRow m_aRow; + sal_Bool m_bIsNull; + + private: + void fillColumns(const ::com::sun::star::lang::Locale& _aLocale); + BOOL CreateFile(const INetURLObject& aFile, BOOL& bCreateMemo); + + sal_Bool fetchRow(OValueRow _rRow,const OSQLColumns& _rCols); + sal_Bool seekRow(IResultSetHelper::Movement eCursorPosition); + + public: + + OEvoabFolderList( OEvoabConnection* _pConnection); + + OEvoabConnection* getConnection() const { return m_pConnection;} + ::vos::ORef<OSQLColumns> getTableColumns() const {return m_aColumns;} + void construct(); // can throw any exception + static SvStream* createStream_simpleError( const String& _rFileName, StreamMode _eOpenMode); + void initializeRow(sal_Int32 _nColumnCount); + void checkIndex(sal_Int32 _nColumnIndex ) throw(::com::sun::star::sdbc::SQLException); + const ORowSetValue& getValue(sal_Int32 _nColumnIndex ) throw(::com::sun::star::sdbc::SQLException); + ::rtl::OUString SAL_CALL getString( sal_Int32 _nColumnIndex ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + sal_Int32 SAL_CALL getInt( sal_Int32 _nColumnIndex ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + sal_Bool SAL_CALL first( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + sal_Bool SAL_CALL next( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + sal_Int32 SAL_CALL getRow( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + + }; + } +} +#endif // _CONNECTIVITY_EVOAB_LEVOABFOLDERLIST_HXX_ + diff --git a/connectivity/source/drivers/evoab/LNoException.cxx b/connectivity/source/drivers/evoab/LNoException.cxx new file mode 100644 index 000000000000..183ab75559f4 --- /dev/null +++ b/connectivity/source/drivers/evoab/LNoException.cxx @@ -0,0 +1,327 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: LNoException.cxx,v $ + * $Revision: 1.6 $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_connectivity.hxx" +#include "LTable.hxx" +#include "LConnection.hxx" + +using namespace connectivity; +using namespace connectivity::evoab; + +//------------------------------------------------------------------ +xub_StrLen OEvoabString::GetTokenCount( sal_Unicode cTok, sal_Unicode cStrDel ) const +{ + if ( !Len() ) + return 0; + + xub_StrLen nTokCount = 1; + BOOL bStart = TRUE; // Stehen wir auf dem ersten Zeichen im Token? + BOOL bInString = FALSE; // Befinden wir uns INNERHALB eines (cStrDel delimited) String? + + // Suche bis Stringende nach dem ersten nicht uebereinstimmenden Zeichen + for( xub_StrLen i = 0; i < Len(); i++ ) + { + if (bStart) + { + bStart = FALSE; + // Erstes Zeichen ein String-Delimiter? + if ((*this).GetChar(i) == cStrDel) + { + bInString = TRUE; // dann sind wir jetzt INNERHALB des Strings! + continue; // dieses Zeichen ueberlesen! + } + } + + if (bInString) { + // Wenn jetzt das String-Delimiter-Zeichen auftritt ... + if ( (*this).GetChar(i) == cStrDel ) + { + if ((i+1 < Len()) && ((*this).GetChar(i+1) == cStrDel)) + { + // Verdoppeltes String-Delimiter-Zeichen: + i++; // kein String-Ende, naechstes Zeichen ueberlesen. + } + else + { + // String-Ende + bInString = FALSE; + } + } + } else { + // Stimmt das Tokenzeichen ueberein, dann erhoehe TokCount + if ( (*this).GetChar(i) == cTok ) + { + nTokCount++; + bStart = TRUE; + } + } + } + //OSL_TRACE("OEvoabString::nTokCount = %d\n", ((OUtoCStr(::rtl::OUString(nTokCount))) ? (OUtoCStr(::rtl::OUString(nTokCount))):("NULL")) ); + + return nTokCount; +} + +//------------------------------------------------------------------ +void OEvoabString::GetTokenSpecial( String& _rStr,xub_StrLen& nStartPos, sal_Unicode cTok, sal_Unicode cStrDel ) const +{ + _rStr.Erase(); + xub_StrLen nLen = Len(); + if ( nLen ) + { + BOOL bInString = (nStartPos < nLen) && ((*this).GetChar(nStartPos) == cStrDel); // Befinden wir uns INNERHALB eines (cStrDel delimited) String? + + // Erstes Zeichen ein String-Delimiter? + if (bInString ) + ++nStartPos; // dieses Zeichen ueberlesen! + // Suche bis Stringende nach dem ersten nicht uebereinstimmenden Zeichen + for( xub_StrLen i = nStartPos; i < nLen; ++i ) + { + if (bInString) + { + // Wenn jetzt das String-Delimiter-Zeichen auftritt ... + if ( (*this).GetChar(i) == cStrDel ) + { + if ((i+1 < nLen) && ((*this).GetChar(i+1) == cStrDel)) + { + // Verdoppeltes String-Delimiter-Zeichen: + ++i; // kein String-Ende, naechstes Zeichen ueberlesen. + + _rStr += (*this).GetChar(i); // Zeichen gehoert zum Resultat-String + } + else + { + // String-Ende + bInString = FALSE; + } + } + else + { + _rStr += (*this).GetChar(i); // Zeichen gehoert zum Resultat-String + } + + } + else + { + // Stimmt das Tokenzeichen ueberein, dann erhoehe nTok + if ( (*this).GetChar(i) == cTok ) + { + // Vorzeitiger Abbruch der Schleife moeglich, denn + // wir haben, was wir wollten. + nStartPos = i+1; + break; + } + else + { + _rStr += (*this).GetChar(i); // Zeichen gehoert zum Resultat-String + } + } + } + } +} +// ----------------------------------------------------------------------------- +void OEvoabTable::refreshIndexes() +{ +} +// ----------------------------------------------------------------------------- +sal_Bool OEvoabTable::checkHeaderLine() +{ + if (m_nFilePos == 0 && ((OEvoabConnection*)m_pConnection)->isHeaderLine()) + { + BOOL bRead2; + do + { + bRead2 = m_pFileStream->ReadByteStringLine(m_aCurrentLine,m_pConnection->getTextEncoding()); + } + while(bRead2 && !m_aCurrentLine.Len()); + + m_nFilePos = m_pFileStream->Tell(); + if (m_pFileStream->IsEof()) + return sal_False; + } + return sal_True; +} +//------------------------------------------------------------------ +sal_Bool OEvoabTable::seekRow(IResultSetHelper::Movement eCursorPosition, sal_Int32 nOffset, sal_Int32& nCurPos) +{ + //OSL_TRACE("OEvoabTable::(before SeekRow)m_aCurrentLine = %d\n", ((OUtoCStr(::rtl::OUString(m_aCurrentLine))) ? (OUtoCStr(::rtl::OUString(m_aCurrentLine))):("NULL")) ); + + if ( !m_pFileStream ) + return sal_False; + OEvoabConnection* pConnection = (OEvoabConnection*)m_pConnection; + // ---------------------------------------------------------- + // Positionierung vorbereiten: + //OSL_TRACE("OEvoabTable::(before SeekRow,m_pFileStriam Exist)m_aCurrentLine = %d\n", ((OUtoCStr(::rtl::OUString(m_aCurrentLine))) ? (OUtoCStr(::rtl::OUString(m_aCurrentLine))):("NULL")) ); + + m_nFilePos = nCurPos; + + switch(eCursorPosition) + { + case IResultSetHelper::FIRST: + m_nFilePos = 0; + m_nRowPos = 1; + // run through + case IResultSetHelper::NEXT: + if(eCursorPosition != IResultSetHelper::FIRST) + ++m_nRowPos; + m_pFileStream->Seek(m_nFilePos); + if (m_pFileStream->IsEof() || !checkHeaderLine()) + { + m_nMaxRowCount = m_nRowPos; + return sal_False; + } + + m_aRowToFilePos.insert(::std::map<sal_Int32,sal_Int32>::value_type(m_nRowPos,m_nFilePos)); + + m_pFileStream->ReadByteStringLine(m_aCurrentLine,pConnection->getTextEncoding()); + if (m_pFileStream->IsEof()) + { + m_nMaxRowCount = m_nRowPos; + return sal_False; + } + nCurPos = m_pFileStream->Tell(); + break; + case IResultSetHelper::PRIOR: + --m_nRowPos; + if(m_nRowPos > 0) + { + m_nFilePos = m_aRowToFilePos.find(m_nRowPos)->second; + m_pFileStream->Seek(m_nFilePos); + if (m_pFileStream->IsEof() || !checkHeaderLine()) + return sal_False; + m_pFileStream->ReadByteStringLine(m_aCurrentLine,pConnection->getTextEncoding()); + if (m_pFileStream->IsEof()) + return sal_False; + nCurPos = m_pFileStream->Tell(); + } + else + m_nRowPos = 0; + + break; + + break; + case IResultSetHelper::LAST: + if(m_nMaxRowCount) + { + m_nFilePos = m_aRowToFilePos.rbegin()->second; + m_nRowPos = m_aRowToFilePos.rbegin()->first; + m_pFileStream->Seek(m_nFilePos); + if (m_pFileStream->IsEof() || !checkHeaderLine()) + return sal_False; + m_pFileStream->ReadByteStringLine(m_aCurrentLine,pConnection->getTextEncoding()); + if (m_pFileStream->IsEof()) + return sal_False; + nCurPos = m_pFileStream->Tell(); + } + else + { + while(seekRow(IResultSetHelper::NEXT,1,nCurPos)) ; // run through after last row + // now I know all + seekRow(IResultSetHelper::PRIOR,1,nCurPos); + } + break; + case IResultSetHelper::RELATIVE: + if(nOffset > 0) + { + for(sal_Int32 i = 0;i<nOffset;++i) + seekRow(IResultSetHelper::NEXT,1,nCurPos); + } + else if(nOffset < 0) + { + for(sal_Int32 i = nOffset;i;++i) + seekRow(IResultSetHelper::PRIOR,1,nCurPos); + } + break; + case IResultSetHelper::ABSOLUTE: + { + if(nOffset < 0) + nOffset = m_nRowPos + nOffset; + ::std::map<sal_Int32,sal_Int32>::const_iterator aIter = m_aRowToFilePos.find(nOffset); + if(aIter != m_aRowToFilePos.end()) + { + m_nFilePos = aIter->second; + m_pFileStream->Seek(m_nFilePos); + if (m_pFileStream->IsEof() || !checkHeaderLine()) + return sal_False; + m_pFileStream->ReadByteStringLine(m_aCurrentLine,pConnection->getTextEncoding()); + if (m_pFileStream->IsEof()) + return sal_False; + nCurPos = m_pFileStream->Tell(); + } + else if(m_nMaxRowCount && nOffset > m_nMaxRowCount) // offset is outside the table + { + m_nRowPos = m_nMaxRowCount; + return sal_False; + } + else + { + aIter = m_aRowToFilePos.upper_bound(nOffset); + if(aIter == m_aRowToFilePos.end()) + { + m_nRowPos = m_aRowToFilePos.rbegin()->first; + nCurPos = m_nFilePos = m_aRowToFilePos.rbegin()->second; + while(m_nRowPos != nOffset) + seekRow(IResultSetHelper::NEXT,1,nCurPos); + } + else + { + --aIter; + m_nRowPos = aIter->first; + m_nFilePos = aIter->second; + m_pFileStream->Seek(m_nFilePos); + if (m_pFileStream->IsEof() || !checkHeaderLine()) + return sal_False; + m_pFileStream->ReadByteStringLine(m_aCurrentLine,pConnection->getTextEncoding()); + if (m_pFileStream->IsEof()) + return sal_False; + nCurPos = m_pFileStream->Tell(); + } + } + } + + break; + case IResultSetHelper::BOOKMARK: + m_pFileStream->Seek(nOffset); + if (m_pFileStream->IsEof()) + return sal_False; + + m_nFilePos = m_pFileStream->Tell(); // Byte-Position in der Datei merken (am ZeilenANFANG) + m_pFileStream->ReadByteStringLine(m_aCurrentLine,pConnection->getTextEncoding()); + if (m_pFileStream->IsEof()) + return sal_False; + nCurPos = m_pFileStream->Tell(); + break; + } + + //OSL_TRACE("OEvoabTable::(after SeekRow)m_aCurrentLine = %d\n", ((OUtoCStr(::rtl::OUString(m_aCurrentLine))) ? (OUtoCStr(::rtl::OUString(m_aCurrentLine))):("NULL")) ); + + return sal_True; +} +// ----------------------------------------------------------------------------- diff --git a/connectivity/source/drivers/evoab/LPreparedStatement.cxx b/connectivity/source/drivers/evoab/LPreparedStatement.cxx new file mode 100644 index 000000000000..fa4269fdce4d --- /dev/null +++ b/connectivity/source/drivers/evoab/LPreparedStatement.cxx @@ -0,0 +1,46 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: LPreparedStatement.cxx,v $ + * $Revision: 1.5 $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_connectivity.hxx" +#include "LPreparedStatement.hxx" +#include "LResultSet.hxx" + +using namespace connectivity::evoab; +using namespace connectivity::file; +using namespace ::com::sun::star::uno; +// ------------------------------------------------------------------------- +OResultSet* OEvoabPreparedStatement::createResultSet() +{ + return new OEvoabResultSet(this,m_aSQLIterator); +} +// ------------------------------------------------------------------------- +IMPLEMENT_SERVICE_INFO(OEvoabPreparedStatement,"com.sun.star.sdbc.driver.evoab.PreparedStatement","com.sun.star.sdbc.PreparedStatement"); + diff --git a/connectivity/source/drivers/evoab/LPreparedStatement.hxx b/connectivity/source/drivers/evoab/LPreparedStatement.hxx new file mode 100644 index 000000000000..e4260ef3a994 --- /dev/null +++ b/connectivity/source/drivers/evoab/LPreparedStatement.hxx @@ -0,0 +1,53 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: LPreparedStatement.hxx,v $ + * $Revision: 1.4 $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef _CONNECTIVITY_EVOAB_LPREPAREDSTATEMENT_HXX_ +#define _CONNECTIVITY_EVOAB_LPREPAREDSTATEMENT_HXX_ + +#include "file/FPreparedStatement.hxx" + +namespace connectivity +{ + namespace evoab + { + class OConnection; + class OEvoabPreparedStatement : public file::OPreparedStatement + { + protected: + virtual file::OResultSet* createResultSet(); + public: + OEvoabPreparedStatement( file::OConnection* _pConnection) : file::OPreparedStatement( _pConnection){}; + DECLARE_SERVICE_INFO(); + }; + } +} + +#endif //_CONNECTIVITY_EVOAB_LPREPAREDSTATEMENT_HXX_ + diff --git a/connectivity/source/drivers/evoab/LResultSet.cxx b/connectivity/source/drivers/evoab/LResultSet.cxx new file mode 100644 index 000000000000..fd4959465710 --- /dev/null +++ b/connectivity/source/drivers/evoab/LResultSet.cxx @@ -0,0 +1,193 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: LResultSet.cxx,v $ + * $Revision: 1.8 $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_connectivity.hxx" +#include <com/sun/star/sdbcx/CompareBookmark.hpp> +#include <com/sun/star/sdbcx/XDeleteRows.hpp> +#include "LResultSet.hxx" +#include <com/sun/star/lang/DisposedException.hpp> +#include <comphelper/sequence.hxx> +#include <comphelper/types.hxx> + +using namespace ::comphelper; + +using namespace connectivity::evoab; +using namespace connectivity::file; +using namespace ::cppu; +using namespace com::sun::star::uno; +using namespace com::sun::star::lang; +using namespace com::sun::star::beans; +using namespace com::sun::star::sdbc; +using namespace com::sun::star::sdbcx; +// using namespace com::sun::star::container; +// using namespace com::sun::star::util; +//------------------------------------------------------------------------------ +OEvoabResultSet::OEvoabResultSet( OStatement_Base* pStmt,connectivity::OSQLParseTreeIterator& _aSQLIterator) + : file::OResultSet(pStmt,_aSQLIterator) + ,m_bBookmarkable(sal_True) +{ + registerProperty(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_ISBOOKMARKABLE), PROPERTY_ID_ISBOOKMARKABLE, PropertyAttribute::READONLY,&m_bBookmarkable, ::getBooleanCppuType()); +} +// ------------------------------------------------------------------------- +::rtl::OUString SAL_CALL OEvoabResultSet::getImplementationName( ) throw ( RuntimeException) +{ + return ::rtl::OUString::createFromAscii("com.sun.star.sdbcx.evoab.ResultSet"); +} +// ------------------------------------------------------------------------- +Sequence< ::rtl::OUString > SAL_CALL OEvoabResultSet::getSupportedServiceNames( ) throw( RuntimeException) +{ + Sequence< ::rtl::OUString > aSupported(2); + aSupported[0] = ::rtl::OUString::createFromAscii("com.sun.star.sdbc.ResultSet"); + aSupported[1] = ::rtl::OUString::createFromAscii("com.sun.star.sdbcx.ResultSet"); + return aSupported; +} +// ------------------------------------------------------------------------- +sal_Bool SAL_CALL OEvoabResultSet::supportsService( const ::rtl::OUString& _rServiceName ) throw( RuntimeException) +{ + Sequence< ::rtl::OUString > aSupported(getSupportedServiceNames()); + const ::rtl::OUString* pSupported = aSupported.getConstArray(); + const ::rtl::OUString* pEnd = pSupported + aSupported.getLength(); + for (;pSupported != pEnd && !pSupported->equals(_rServiceName); ++pSupported) + ; + + return pSupported != pEnd; +} +// ------------------------------------------------------------------------- +Any SAL_CALL OEvoabResultSet::queryInterface( const Type & rType ) throw(RuntimeException) +{ + if(rType == ::getCppuType((const Reference<XDeleteRows>*)0) || rType == ::getCppuType((const Reference<XResultSetUpdate>*)0) + || rType == ::getCppuType((const Reference<XRowUpdate>*)0)) + return Any(); + + Any aRet = OResultSet::queryInterface(rType); + return aRet.hasValue() ? aRet : OEvoabResultSet_BASE::queryInterface(rType); +} +// ------------------------------------------------------------------------- +Sequence< Type > SAL_CALL OEvoabResultSet::getTypes( ) throw( RuntimeException) +{ + Sequence< Type > aTypes = OResultSet::getTypes(); + ::std::vector<Type> aOwnTypes; + aOwnTypes.reserve(aTypes.getLength()); + const Type* pBegin = aTypes.getConstArray(); + const Type* pEnd = pBegin + aTypes.getLength(); + for(;pBegin != pEnd;++pBegin) + { + if(!(*pBegin == ::getCppuType((const Reference<XDeleteRows>*)0) || + *pBegin == ::getCppuType((const Reference<XResultSetUpdate>*)0) || + *pBegin == ::getCppuType((const Reference<XRowUpdate>*)0))) + { + aOwnTypes.push_back(*pBegin); + } + } + Type *pTypes = aOwnTypes.empty() ? 0 : &aOwnTypes[0]; + Sequence< Type > aRet(pTypes, aOwnTypes.size()); + return ::comphelper::concatSequences(aRet,OEvoabResultSet_BASE::getTypes()); +} + +// ------------------------------------------------------------------------- +// XRowLocate +Any SAL_CALL OEvoabResultSet::getBookmark( ) throw( SQLException, RuntimeException) +{ + ::osl::MutexGuard aGuard( m_aMutex ); + checkDisposed(OResultSet_BASE::rBHelper.bDisposed); + + + return makeAny((sal_Int32)(m_aRow->get())[0]->getValue()); +} +// ------------------------------------------------------------------------- +sal_Bool SAL_CALL OEvoabResultSet::moveToBookmark( const Any& bookmark ) throw( SQLException, RuntimeException) +{ + ::osl::MutexGuard aGuard( m_aMutex ); + checkDisposed(OResultSet_BASE::rBHelper.bDisposed); + + + m_bRowDeleted = m_bRowInserted = m_bRowUpdated = sal_False; + + return Move(IResultSetHelper::BOOKMARK,comphelper::getINT32(bookmark),sal_True); +} +// ------------------------------------------------------------------------- +sal_Bool SAL_CALL OEvoabResultSet::moveRelativeToBookmark( const Any& bookmark, sal_Int32 rows ) throw( SQLException, RuntimeException) +{ + ::osl::MutexGuard aGuard( m_aMutex ); + checkDisposed(OResultSet_BASE::rBHelper.bDisposed); + + + m_bRowDeleted = m_bRowInserted = m_bRowUpdated = sal_False; + + Move(IResultSetHelper::BOOKMARK,comphelper::getINT32(bookmark),sal_False); + + return relative(rows); +} + +// ------------------------------------------------------------------------- +sal_Int32 SAL_CALL OEvoabResultSet::compareBookmarks( const Any& lhs, const Any& rhs ) throw( SQLException, RuntimeException) +{ + return (lhs == rhs) ? 0 : 2; +} +// ------------------------------------------------------------------------- +sal_Bool SAL_CALL OEvoabResultSet::hasOrderedBookmarks( ) throw( SQLException, RuntimeException) +{ + return sal_True; +} +// ------------------------------------------------------------------------- +sal_Int32 SAL_CALL OEvoabResultSet::hashBookmark( const Any& bookmark ) throw( SQLException, RuntimeException) +{ + return comphelper::getINT32(bookmark); +} +// ------------------------------------------------------------------------- +IPropertyArrayHelper* OEvoabResultSet::createArrayHelper( ) const +{ + Sequence< Property > aProps; + describeProperties(aProps); + return new ::cppu::OPropertyArrayHelper(aProps); +} +// ------------------------------------------------------------------------- +IPropertyArrayHelper & OEvoabResultSet::getInfoHelper() +{ + return *OEvoabResultSet_BASE3::getArrayHelper(); +} +// ----------------------------------------------------------------------------- +void SAL_CALL OEvoabResultSet::acquire() throw() +{ + OEvoabResultSet_BASE2::acquire(); +} +// ----------------------------------------------------------------------------- +void SAL_CALL OEvoabResultSet::release() throw() +{ + OEvoabResultSet_BASE2::release(); +} +// ----------------------------------------------------------------------------- +::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySetInfo > SAL_CALL OEvoabResultSet::getPropertySetInfo( ) throw(::com::sun::star::uno::RuntimeException) +{ + return ::cppu::OPropertySetHelper::createPropertySetInfo(getInfoHelper()); +} +// ----------------------------------------------------------------------------- + diff --git a/connectivity/source/drivers/evoab/LResultSet.hxx b/connectivity/source/drivers/evoab/LResultSet.hxx new file mode 100644 index 000000000000..f93ba9364e5a --- /dev/null +++ b/connectivity/source/drivers/evoab/LResultSet.hxx @@ -0,0 +1,84 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: LResultSet.hxx,v $ + * $Revision: 1.4 $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef _CONNECTIVITY_EVOAB_LRESULTSET_HXX_ +#define _CONNECTIVITY_EVOAB_LRESULTSET_HXX_ + +#include "file/FResultSet.hxx" +#include <com/sun/star/sdbcx/XRowLocate.hpp> +#include <cppuhelper/implbase1.hxx> + +namespace connectivity +{ + namespace evoab + { + class OEvoabResultSet; + // these typedef's are only necessary for the compiler + typedef ::cppu::ImplHelper1< ::com::sun::star::sdbcx::XRowLocate> OEvoabResultSet_BASE; + typedef file::OResultSet OEvoabResultSet_BASE2; + typedef ::comphelper::OPropertyArrayUsageHelper<OEvoabResultSet> OEvoabResultSet_BASE3; + + + class OEvoabResultSet : public OEvoabResultSet_BASE2, + public OEvoabResultSet_BASE, + public OEvoabResultSet_BASE3 + { + sal_Bool m_bBookmarkable; + protected: + // OPropertyArrayUsageHelper + virtual ::cppu::IPropertyArrayHelper* createArrayHelper( ) const; + // OPropertySetHelper + virtual ::cppu::IPropertyArrayHelper & SAL_CALL getInfoHelper(); + public: + DECLARE_SERVICE_INFO(); + + OEvoabResultSet( file::OStatement_Base* pStmt,connectivity::OSQLParseTreeIterator& _aSQLIterator); + + // XInterface + virtual ::com::sun::star::uno::Any SAL_CALL queryInterface( const ::com::sun::star::uno::Type & rType ) throw(::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL acquire() throw(); + virtual void SAL_CALL release() throw(); + //XTypeProvider + virtual ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Type > SAL_CALL getTypes( ) throw(::com::sun::star::uno::RuntimeException); + // XPropertySet + virtual ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySetInfo > SAL_CALL getPropertySetInfo( ) throw(::com::sun::star::uno::RuntimeException); + + // XRowLocate + virtual ::com::sun::star::uno::Any SAL_CALL getBookmark( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Bool SAL_CALL moveToBookmark( const ::com::sun::star::uno::Any& bookmark ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Bool SAL_CALL moveRelativeToBookmark( const ::com::sun::star::uno::Any& bookmark, sal_Int32 rows ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Int32 SAL_CALL compareBookmarks( const ::com::sun::star::uno::Any& first, const ::com::sun::star::uno::Any& second ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Bool SAL_CALL hasOrderedBookmarks( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + virtual sal_Int32 SAL_CALL hashBookmark( const ::com::sun::star::uno::Any& bookmark ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); + }; + } +} +#endif //_CONNECTIVITY_EVOAB_LRESULTSET_HXX_ + diff --git a/connectivity/source/drivers/evoab/LServices.cxx b/connectivity/source/drivers/evoab/LServices.cxx new file mode 100644 index 000000000000..bab5ae8cfce9 --- /dev/null +++ b/connectivity/source/drivers/evoab/LServices.cxx @@ -0,0 +1,178 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: LServices.cxx,v $ + * $Revision: 1.6 $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_connectivity.hxx" +#include "LDriver.hxx" +#include <cppuhelper/factory.hxx> +#include <osl/diagnose.h> + +using namespace connectivity::evoab; +using ::rtl::OUString; +using ::com::sun::star::uno::Reference; +using ::com::sun::star::uno::Sequence; +using ::com::sun::star::registry::XRegistryKey; +using ::com::sun::star::lang::XSingleServiceFactory; +using ::com::sun::star::lang::XMultiServiceFactory; + +typedef Reference< XSingleServiceFactory > (SAL_CALL *createFactoryFunc) + ( + const Reference< XMultiServiceFactory > & rServiceManager, + const OUString & rComponentName, + ::cppu::ComponentInstantiation pCreateFunction, + const Sequence< OUString > & rServiceNames, + rtl_ModuleCount* _pT + ); + +//*************************************************************************************** +// +// Die vorgeschriebene C-Api muss erfuellt werden! +// Sie besteht aus drei Funktionen, die von dem Modul exportiert werden muessen. +// + +//--------------------------------------------------------------------------------------- +void REGISTER_PROVIDER( + const OUString& aServiceImplName, + const Sequence< OUString>& Services, + const Reference< ::com::sun::star::registry::XRegistryKey > & xKey) +{ + OUString aMainKeyName; + aMainKeyName = OUString::createFromAscii("/"); + aMainKeyName += aServiceImplName; + aMainKeyName += OUString::createFromAscii("/UNO/SERVICES"); + + Reference< ::com::sun::star::registry::XRegistryKey > xNewKey( xKey->createKey(aMainKeyName) ); + OSL_ENSURE(xNewKey.is(), "FILE::component_writeInfo : could not create a registry key !"); + + for (sal_Int32 i=0; i<Services.getLength(); ++i) + xNewKey->createKey(Services[i]); +} + + +//--------------------------------------------------------------------------------------- +struct ProviderRequest +{ + Reference< XSingleServiceFactory > xRet; + Reference< XMultiServiceFactory > const xServiceManager; + OUString const sImplementationName; + + ProviderRequest( + void* pServiceManager, + sal_Char const* pImplementationName + ) + : xServiceManager(reinterpret_cast<XMultiServiceFactory*>(pServiceManager)) + , sImplementationName(OUString::createFromAscii(pImplementationName)) + { + } + + inline + sal_Bool CREATE_PROVIDER( + const OUString& Implname, + const Sequence< OUString > & Services, + ::cppu::ComponentInstantiation Factory, + createFactoryFunc creator + ) + { + if (!xRet.is() && (Implname == sImplementationName)) + try + { + xRet = creator( xServiceManager, sImplementationName,Factory, Services,0); + } + catch(...) + { + } + return xRet.is(); + } + + void* getProvider() const { return xRet.get(); } +}; + +//--------------------------------------------------------------------------------------- + +extern "C" SAL_DLLPUBLIC_EXPORT void SAL_CALL +component_getImplementationEnvironment( + const sal_Char **ppEnvTypeName, + uno_Environment ** /*ppEnv*/ + ) +{ + *ppEnvTypeName = CPPU_CURRENT_LANGUAGE_BINDING_NAME; +} + +//--------------------------------------------------------------------------------------- +extern "C" SAL_DLLPUBLIC_EXPORT sal_Bool SAL_CALL component_writeInfo( + void* /*pServiceManager*/, + void* pRegistryKey + ) +{ + if (pRegistryKey) + try + { + Reference< ::com::sun::star::registry::XRegistryKey > xKey(reinterpret_cast< ::com::sun::star::registry::XRegistryKey*>(pRegistryKey)); + + REGISTER_PROVIDER( + OEvoabDriver::getImplementationName_Static(), + OEvoabDriver::getSupportedServiceNames_Static(), xKey); + + return sal_True; + } + catch (::com::sun::star::registry::InvalidRegistryException& ) + { + OSL_ENSURE(sal_False, "FILE::component_writeInfo : could not create a registry key ! ## InvalidRegistryException !"); + } + + return sal_False; +} + +//--------------------------------------------------------------------------------------- +extern "C" SAL_DLLPUBLIC_EXPORT void* SAL_CALL component_getFactory( + const sal_Char* pImplementationName, + void* pServiceManager, + void* /*pRegistryKey*/) +{ + void* pRet = 0; + if (pServiceManager) + { + ProviderRequest aReq(pServiceManager,pImplementationName); + + aReq.CREATE_PROVIDER( + OEvoabDriver::getImplementationName_Static(), + OEvoabDriver::getSupportedServiceNames_Static(), + OEvoabDriver_CreateInstance, ::cppu::createSingleFactory) + ; + + if(aReq.xRet.is()) + aReq.xRet->acquire(); + + pRet = aReq.getProvider(); + } + + return pRet; +}; + diff --git a/connectivity/source/drivers/evoab/LStatement.cxx b/connectivity/source/drivers/evoab/LStatement.cxx new file mode 100644 index 000000000000..9ef945b1ccd4 --- /dev/null +++ b/connectivity/source/drivers/evoab/LStatement.cxx @@ -0,0 +1,46 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: LStatement.cxx,v $ + * $Revision: 1.5 $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_connectivity.hxx" +#include "LStatement.hxx" +#include "LResultSet.hxx" + +using namespace connectivity::evoab; +using namespace connectivity::file; +using namespace com::sun::star::uno; +// ------------------------------------------------------------------------- +OResultSet* OEvoabStatement::createResultSet() +{ + return new OEvoabResultSet(this,m_aSQLIterator); +} +// ------------------------------------------------------------------------- +IMPLEMENT_SERVICE_INFO(OEvoabStatement,"com.sun.star.sdbc.driver.evoab.Statement","com.sun.star.sdbc.Statement"); + diff --git a/connectivity/source/drivers/evoab/LStatement.hxx b/connectivity/source/drivers/evoab/LStatement.hxx new file mode 100644 index 000000000000..9e8af7f7b273 --- /dev/null +++ b/connectivity/source/drivers/evoab/LStatement.hxx @@ -0,0 +1,52 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: LStatement.hxx,v $ + * $Revision: 1.4 $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef _CONNECTIVITY_EVOAB_LSTATEMENT_HXX_ +#define _CONNECTIVITY_EVOAB_LSTATEMENT_HXX_ + +#include "file/FStatement.hxx" + +namespace connectivity +{ + namespace evoab + { + class OConnection; + class OEvoabStatement : public file::OStatement + { + protected: + virtual file::OResultSet* createResultSet(); + public: + OEvoabStatement( file::OConnection* _pConnection) : file::OStatement( _pConnection){} + DECLARE_SERVICE_INFO(); + }; + } +} + +#endif //_CONNECTIVITY_EVOAB_LSTATEMENT_HXX_ diff --git a/connectivity/source/drivers/evoab/LTable.cxx b/connectivity/source/drivers/evoab/LTable.cxx new file mode 100644 index 000000000000..cbb4bc53e9f4 --- /dev/null +++ b/connectivity/source/drivers/evoab/LTable.cxx @@ -0,0 +1,873 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: LTable.cxx,v $ + * $Revision: 1.18 $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_connectivity.hxx" + +#include <ctype.h> +#include "LTable.hxx" +#include <com/sun/star/sdbc/ColumnValue.hpp> +#include <com/sun/star/sdbc/DataType.hpp> +#include <com/sun/star/ucb/XContentAccess.hpp> +#ifndef _COM_SUN_STAR_SQLC_XROW_HPP_ +//#include <com/sun/star/sdbc/XRow.hpp> +#endif +#include <svtools/converter.hxx> +#include "LConnection.hxx" +#include "LColumns.hxx" +#include <osl/thread.h> +#include <tools/config.hxx> +#include <comphelper/sequence.hxx> +#include <svtools/zforlist.hxx> +#include <rtl/math.hxx> +#include <stdio.h> //sprintf +#include <comphelper/extract.hxx> +#include <comphelper/numbers.hxx> +#include "LDriver.hxx" +#include <com/sun/star/util/NumberFormat.hpp> +#include <unotools/configmgr.hxx> +#include <i18npool/mslangid.hxx> +#include "connectivity/dbconversion.hxx" +#include <comphelper/types.hxx> +#include <svtools/syslocale.hxx> +#ifndef CONNECTIVITY_EVOAB_DEBUG_HELPER_HXX +#include "LDebug.hxx" +#endif +#include <map> + +using namespace ::comphelper; +using namespace connectivity; +using namespace connectivity::evoab; +using namespace connectivity::file; +using namespace ::cppu; +using namespace utl; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::ucb; +using namespace ::com::sun::star::beans; +using namespace ::com::sun::star::sdbcx; +using namespace ::com::sun::star::sdbc; +using namespace ::com::sun::star::container; +using namespace ::com::sun::star::lang; + +// ------------------------------------------------------------------------- +void OEvoabTable::fillColumns(const ::com::sun::star::lang::Locale& _aLocale) +{ + BOOL bRead = TRUE; + + QuotedTokenizedString aHeaderLine; + OEvoabConnection* pConnection = (OEvoabConnection*)m_pConnection; + if (pConnection->isHeaderLine()) + { + while(bRead && !aHeaderLine.Len()) + { + bRead = m_pFileStream->ReadByteStringLine(aHeaderLine,pConnection->getTextEncoding()); + } + } + + // read first row + QuotedTokenizedString aFirstLine; + bRead = m_pFileStream->ReadByteStringLine(aFirstLine,pConnection->getTextEncoding()); + + if (!pConnection->isHeaderLine() || !aHeaderLine.Len()) + { + while(bRead && !aFirstLine.Len()) + { + bRead = m_pFileStream->ReadByteStringLine(aFirstLine,pConnection->getTextEncoding()); + } + // use first row as headerline because we need the number of columns + aHeaderLine = aFirstLine; + } + // column count + xub_StrLen nFieldCount = aHeaderLine.GetTokenCount(pConnection->getFieldDelimiter(),pConnection->getStringDelimiter()); + + if(!m_aColumns.isValid()) + m_aColumns = new OSQLColumns(); + else + m_aColumns->get().clear(); + + m_aTypes.clear(); + m_aPrecisions.clear(); + m_aScales.clear(); + // reserve some space + m_aColumnRawNames.reserve(nFieldCount); + m_aColumns->get().reserve(nFieldCount); + m_aTypes.reserve(nFieldCount); + m_aPrecisions.reserve(nFieldCount); + m_aScales.reserve(nFieldCount); + + sal_Bool bCase = getConnection()->getMetaData()->storesMixedCaseQuotedIdentifiers(); + CharClass aCharClass(pConnection->getDriver()->getFactory(),_aLocale); + // read description + sal_Unicode cDecimalDelimiter = pConnection->getDecimalDelimiter(); + sal_Unicode cThousandDelimiter = pConnection->getThousandDelimiter(); + String aColumnName; + ::rtl::OUString aTypeName; + ::comphelper::UStringMixEqual aCase(bCase); + xub_StrLen nStartPosHeaderLine = 0; // use for eficient way to get the tokens + xub_StrLen nStartPosFirstLine = 0; // use for eficient way to get the tokens + xub_StrLen nStartPosFirstLine2 = 0; + for (xub_StrLen i = 0; i < nFieldCount; i++) + { + if (pConnection->isHeaderLine()) + { + aHeaderLine.GetTokenSpecial(aColumnName,nStartPosHeaderLine,pConnection->getFieldDelimiter(),pConnection->getStringDelimiter()); + } + else + { + // no column name so ... + aColumnName = 'C'; + aColumnName += String::CreateFromInt32(i+1); + } + //OSL_TRACE("OEvoabTable::aColumnName = %s\n", ((OUtoCStr(::rtl::OUString(aColumnName))) ? (OUtoCStr(::rtl::OUString(aColumnName))):("NULL")) ); + + sal_Int32 eType; + UINT16 nPrecision = 0; + UINT16 nScale = 0; + + BOOL bNumeric = FALSE; + ULONG nIndex = 0; + + // first without fielddelimiter + String aField; + aFirstLine.GetTokenSpecial(aField,nStartPosFirstLine,pConnection->getFieldDelimiter(),'\0'); + //OSL_TRACE("OEvoabTable::aField = %s\n", ((OUtoCStr(::rtl::OUString(aField))) ? (OUtoCStr(::rtl::OUString(aField))):("NULL")) ); + + if (aField.Len() == 0 || + (pConnection->getStringDelimiter() && pConnection->getStringDelimiter() == aField.GetChar(0))) + { + bNumeric = FALSE; + } + else + { + String aField2; + if ( pConnection->getStringDelimiter() != '\0' ) + aFirstLine.GetTokenSpecial(aField2,nStartPosFirstLine2,pConnection->getFieldDelimiter(),pConnection->getStringDelimiter()); + else + aField2 = aField; + + //OSL_TRACE("OEvoabTable::aField2 = %s\n", ((OUtoCStr(::rtl::OUString(aField2))) ? (OUtoCStr(::rtl::OUString(aField2))):("NULL")) ); + + if (aField2.Len() == 0) + { + bNumeric = FALSE; + } + else + { + bNumeric = TRUE; + xub_StrLen nDot = 0; + for (xub_StrLen j = 0; j < aField2.Len(); j++) + { + sal_Unicode c = aField2.GetChar(j); + // nur Ziffern und Dezimalpunkt und Tausender-Trennzeichen? + if ((!cDecimalDelimiter || c != cDecimalDelimiter) && + (!cThousandDelimiter || c != cThousandDelimiter) && + !aCharClass.isDigit(aField2,j)) + { + bNumeric = FALSE; + break; + } + if (cDecimalDelimiter && c == cDecimalDelimiter) + { + nPrecision = 15; // we have an decimal value + nScale = 2; + nDot++; + } + } + + if (nDot > 1) // if there is more than one dot it isn't a number + bNumeric = FALSE; + if (bNumeric && cThousandDelimiter) + { + // Ist der Trenner richtig angegeben? + String aValue = aField2.GetToken(0,cDecimalDelimiter); + for (sal_Int32 j = aValue.Len() - 4; j >= 0; j -= 4) + { + sal_Unicode c = aValue.GetChar(j); + // nur Ziffern und Dezimalpunkt und Tausender-Trennzeichen? + if (c == cThousandDelimiter && j) + continue; + else + { + bNumeric = FALSE; + break; + } + } + } + + // jetzt koennte es noch ein Datumsfeld sein + if (!bNumeric) + { + try + { + nIndex = m_xNumberFormatter->detectNumberFormat(::com::sun::star::util::NumberFormat::ALL,aField2); + } + catch(Exception&) + { + } + } + } + } + + sal_Int32 nFlags = 0; + if (bNumeric) + { + if (cDecimalDelimiter) + { + if(nPrecision) + { + eType = DataType::DECIMAL; + aTypeName = ::rtl::OUString::createFromAscii("DECIMAL"); + } + else + { + eType = DataType::DOUBLE; + aTypeName = ::rtl::OUString::createFromAscii("DOUBLE"); + } + } + else + eType = DataType::INTEGER; + nFlags = ColumnSearch::BASIC; + } + else + { + + switch (comphelper::getNumberFormatType(m_xNumberFormatter,nIndex)) + { + case NUMBERFORMAT_DATE: + eType = DataType::DATE; + aTypeName = ::rtl::OUString::createFromAscii("DATE"); + break; + case NUMBERFORMAT_DATETIME: + eType = DataType::TIMESTAMP; + aTypeName = ::rtl::OUString::createFromAscii("TIMESTAMP"); + break; + case NUMBERFORMAT_TIME: + eType = DataType::TIME; + aTypeName = ::rtl::OUString::createFromAscii("TIME"); + break; + default: + eType = DataType::VARCHAR; + nPrecision = 0; // nyi: Daten koennen aber laenger sein! + nScale = 0; + aTypeName = ::rtl::OUString::createFromAscii("VARCHAR"); + }; + nFlags |= ColumnSearch::CHAR; + } + + // check if the columname already exists + String aAlias(aColumnName); + OSQLColumns::Vector::const_iterator aFind = connectivity::find(m_aColumns->get().begin(),m_aColumns->get().end(),aAlias,aCase); + sal_Int32 nExprCnt = 0; + while(aFind != m_aColumns->get().end()) + { + (aAlias = aColumnName) += String::CreateFromInt32(++nExprCnt); + aFind = connectivity::find(m_aColumns->get().begin(),m_aColumns->get().end(),aAlias,aCase); + } + + m_aColumnRawNames.push_back(::rtl::OUString(aAlias)); + + //~ sdbcx::OColumn* pColumn = new sdbcx::OColumn(aAlias,aTypeName,::rtl::OUString(), + //~ ColumnValue::NULLABLE, + //~ nPrecision, + //~ nScale, + //~ eType, + //~ sal_False, + //~ sal_False, + //~ sal_False, + //~ bCase); + //~ Reference< XPropertySet> xCol = pColumn; + //~ m_aColumns->push_back(xCol); + m_aTypes.push_back(eType); + m_aPrecisions.push_back(nPrecision); + m_aScales.push_back(nScale); + } + setColumnAliases(); + m_pFileStream->Seek(STREAM_SEEK_TO_BEGIN); +} +// ------------------------------------------------------------------------- +OEvoabTable::OEvoabTable(sdbcx::OCollection* _pTables,OEvoabConnection* _pConnection) : OEvoabTable_BASE(_pTables,_pConnection) +{ + +} +// ------------------------------------------------------------------------- +OEvoabTable::OEvoabTable(sdbcx::OCollection* _pTables,OEvoabConnection* _pConnection, + const ::rtl::OUString& _Name, + const ::rtl::OUString& _Type, + const ::rtl::OUString& _Description , + const ::rtl::OUString& _SchemaName, + const ::rtl::OUString& _CatalogName + ) : OEvoabTable_BASE(_pTables,_pConnection,_Name, + _Type, + _Description, + _SchemaName, + _CatalogName) + ,m_nRowPos(0) + ,m_nMaxRowCount(0) +{ + //~ OSL_TRACE("OEvoabTable::(in constructor)_Name = %s\n", ((OUtoCStr(_Name)) ? (OUtoCStr(_Name)):("NULL")) ); + //~ OSL_TRACE("OEvoabTable::(in constructor)_Type = %s\n", ((OUtoCStr(_Type)) ? (OUtoCStr(_Type)):("NULL")) ); + //~ OSL_TRACE("OEvoabTable::(in constructor)_Description = %s\n", ((OUtoCStr(_Description)) ? (OUtoCStr(_Description)):("NULL")) ); + //~ OSL_TRACE("OEvoabTable::(in constructor)_SchemaName = %s\n", ((OUtoCStr(_SchemaName)) ? (OUtoCStr(_SchemaName)):("NULL")) ); + //~ OSL_TRACE("OEvoabTable::(in constructor)_CatalogName = %s\n", ((OUtoCStr(_CatalogName)) ? (OUtoCStr(_CatalogName)):("NULL")) ); +} +// ----------------------------------------------------------------------------- +void OEvoabTable::construct() +{ + SvtSysLocale aLocale; + ::com::sun::star::lang::Locale aAppLocale(aLocale.GetLocaleDataPtr()->getLocale()); + Sequence< ::com::sun::star::uno::Any > aArg(1); + aArg[0] <<= aAppLocale; + + Reference< ::com::sun::star::util::XNumberFormatsSupplier > xSupplier(m_pConnection->getDriver()->getFactory()->createInstanceWithArguments(::rtl::OUString::createFromAscii("com.sun.star.util.NumberFormatsSupplier"),aArg),UNO_QUERY); + m_xNumberFormatter = Reference< ::com::sun::star::util::XNumberFormatter >(m_pConnection->getDriver()->getFactory()->createInstance(::rtl::OUString::createFromAscii("com.sun.star.util.NumberFormatter")),UNO_QUERY); + m_xNumberFormatter->attachNumberFormatsSupplier(xSupplier); + + INetURLObject aURL; + aURL.SetURL(getEntry()); + + if(aURL.getExtension() != rtl::OUString(m_pConnection->getExtension())) + aURL.setExtension(m_pConnection->getExtension()); + + String aFileName = aURL.GetMainURL(INetURLObject::NO_DECODE); + + m_pFileStream = createStream_simpleError( aFileName,STREAM_READWRITE | STREAM_NOCREATE | STREAM_SHARE_DENYWRITE); + + if(!m_pFileStream) + m_pFileStream = createStream_simpleError( aFileName,STREAM_READ | STREAM_NOCREATE | STREAM_SHARE_DENYNONE); + + if(m_pFileStream) + { + OSL_TRACE("OEvoabTable::construct()::m_pFileStream created\n" ); + m_pFileStream->Seek(STREAM_SEEK_TO_END); + sal_Int32 nSize = m_pFileStream->Tell(); + m_pFileStream->Seek(STREAM_SEEK_TO_BEGIN); + + // Buffersize abhaengig von der Filegroesse + m_pFileStream->SetBufferSize(nSize > 1000000 ? 32768 : + nSize > 100000 ? 16384 : + nSize > 10000 ? 4096 : 1024); + OSL_TRACE("OEvoabTable::construct()::m_pFileStream->Tell() = %d\n", nSize ); + + fillColumns(aAppLocale); + + refreshColumns(); + } +} +// ------------------------------------------------------------------------- +String OEvoabTable::getEntry() +{ + ::rtl::OUString sURL; + try + { + Reference< XResultSet > xDir = m_pConnection->getDir()->getStaticResultSet(); + Reference< XRow> xRow(xDir,UNO_QUERY); + ::rtl::OUString sName; + ::rtl::OUString sExt; + + INetURLObject aURL; + xDir->beforeFirst(); + static const ::rtl::OUString s_sSeparator(RTL_CONSTASCII_USTRINGPARAM("/")); + while(xDir->next()) + { + sName = xRow->getString(1); + aURL.SetSmartProtocol(INET_PROT_FILE); + String sUrl = m_pConnection->getURL() + s_sSeparator + sName; + aURL.SetSmartURL( sUrl ); + + // cut the extension + sExt = aURL.getExtension(); + + // name and extension have to coincide + if ( m_pConnection->matchesExtension( sExt ) ) + { + sName = sName.replaceAt(sName.getLength()-(sExt.getLength()+1),sExt.getLength()+1,::rtl::OUString()); + if ( sName == m_Name ) + { + Reference< XContentAccess > xContentAccess( xDir, UNO_QUERY ); + sURL = xContentAccess->queryContentIdentifierString(); + break; + } + } + } + xDir->beforeFirst(); // move back to before first record + } + catch(Exception&) + { + OSL_ASSERT(0); + } + return sURL.getStr(); +} +// ------------------------------------------------------------------------- +void OEvoabTable::refreshColumns() +{ + ::osl::MutexGuard aGuard( m_aMutex ); + + TStringVector aVector; + aVector.reserve(m_aColumns->get().size()); + + for(OSQLColumns::Vector::const_iterator aIter = m_aColumns->get().begin();aIter != m_aColumns->get().end();++aIter) + aVector.push_back(Reference< XNamed>(*aIter,UNO_QUERY)->getName()); + + if(m_pColumns) + m_pColumns->reFill(aVector); + else + m_pColumns = new OEvoabColumns(this,m_aMutex,aVector); + + OSL_TRACE("OEvoabTable::refreshColumns()::end\n" ); +} + +// ------------------------------------------------------------------------- +void SAL_CALL OEvoabTable::disposing(void) +{ + OFileTable::disposing(); + ::osl::MutexGuard aGuard(m_aMutex); + m_aColumns = NULL; +} +// ------------------------------------------------------------------------- +Sequence< Type > SAL_CALL OEvoabTable::getTypes( ) throw(RuntimeException) +{ + Sequence< Type > aTypes = OTable_TYPEDEF::getTypes(); + ::std::vector<Type> aOwnTypes; + aOwnTypes.reserve(aTypes.getLength()); + const Type* pBegin = aTypes.getConstArray(); + const Type* pEnd = pBegin + aTypes.getLength(); + for(;pBegin != pEnd;++pBegin) + { + if(!(*pBegin == ::getCppuType((const Reference<XKeysSupplier>*)0) || + *pBegin == ::getCppuType((const Reference<XRename>*)0) || + *pBegin == ::getCppuType((const Reference<XIndexesSupplier>*)0) || + *pBegin == ::getCppuType((const Reference<XAlterTable>*)0) || + *pBegin == ::getCppuType((const Reference<XDataDescriptorFactory>*)0))) + { + aOwnTypes.push_back(*pBegin); + } + } + Type *pTypes = aOwnTypes.empty() ? 0 : &aOwnTypes[0]; + return Sequence< Type >(pTypes, aOwnTypes.size()); +} + +// ------------------------------------------------------------------------- +Any SAL_CALL OEvoabTable::queryInterface( const Type & rType ) throw(RuntimeException) +{ + if( rType == ::getCppuType((const Reference<XKeysSupplier>*)0) || + rType == ::getCppuType((const Reference<XIndexesSupplier>*)0) || + rType == ::getCppuType((const Reference<XRename>*)0) || + rType == ::getCppuType((const Reference<XAlterTable>*)0) || + rType == ::getCppuType((const Reference<XDataDescriptorFactory>*)0)) + return Any(); + + Any aRet = OTable_TYPEDEF::queryInterface(rType); + return aRet.hasValue() ? aRet : ::cppu::queryInterface(rType,static_cast< ::com::sun::star::lang::XUnoTunnel*> (this)); +} + +//-------------------------------------------------------------------------- +Sequence< sal_Int8 > OEvoabTable::getUnoTunnelImplementationId() +{ + static ::cppu::OImplementationId * pId = 0; + if (! pId) + { + ::osl::MutexGuard aGuard( ::osl::Mutex::getGlobalMutex() ); + if (! pId) + { + static ::cppu::OImplementationId aId; + pId = &aId; + } + } + return pId->getImplementationId(); +} + +// com::sun::star::lang::XUnoTunnel +//------------------------------------------------------------------ +sal_Int64 OEvoabTable::getSomething( const Sequence< sal_Int8 > & rId ) throw (RuntimeException) +{ + return (rId.getLength() == 16 && 0 == rtl_compareMemory(getUnoTunnelImplementationId().getConstArray(), rId.getConstArray(), 16 ) ) + ? reinterpret_cast< sal_Int64 >( this ) + : OEvoabTable_BASE::getSomething(rId); +} +//------------------------------------------------------------------ +sal_Bool OEvoabTable::fetchRow(OValueRefRow& _rRow,const OSQLColumns & _rCols,sal_Bool bIsTable,sal_Bool bRetrieveData) +{ + *(_rRow->get())[0] = m_nFilePos; + + if (!bRetrieveData) + return TRUE; + + OEvoabConnection* pConnection = (OEvoabConnection*)m_pConnection; + // Felder: + xub_StrLen nStartPos = 0; + String aStr; + OSQLColumns::Vector::const_iterator aIter = _rCols.get().begin(); + for (sal_Int32 i = 0; aIter != _rCols.get().end();++aIter, ++i) + { + m_aCurrentLine.GetTokenSpecial(aStr,nStartPos,pConnection->getFieldDelimiter(),pConnection->getStringDelimiter()); + //OSL_TRACE("OEvoabTable::fetchRow()::aStr = %s\n", ((OUtoCStr(::rtl::OUString(aStr))) ? (OUtoCStr(::rtl::OUString(aStr))):("NULL")) ); + + if (aStr.Len() == 0) + (_rRow->get())[i+1]->setNull(); + else + { + // Laengen je nach Datentyp: + sal_Int32 nLen, + nType = 0; + if(bIsTable) + { + nLen = m_aPrecisions[i]; + nType = m_aTypes[i]; + } + else + { + Reference< XPropertySet> xColumn = *aIter; + xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_PRECISION)) >>= nLen; + xColumn->getPropertyValue(OMetaConnection::getPropMap().getNameByIndex(PROPERTY_ID_TYPE)) >>= nType; + } + switch(nType) + { + case DataType::TIMESTAMP: + case DataType::DATE: + case DataType::TIME: + { + double nRes = 0.0; + try + { + nRes = m_xNumberFormatter->convertStringToNumber(::com::sun::star::util::NumberFormat::ALL,aStr); + Reference<XPropertySet> xProp(m_xNumberFormatter->getNumberFormatsSupplier()->getNumberFormatSettings(),UNO_QUERY); + com::sun::star::util::Date aDate; + xProp->getPropertyValue(::rtl::OUString::createFromAscii("NullDate")) >>= aDate; + + switch(nType) + { + case DataType::DATE: + *(_rRow->get())[i+1] = ::dbtools::DBTypeConversion::toDouble(::dbtools::DBTypeConversion::toDate(nRes,aDate)); + break; + case DataType::TIMESTAMP: + *(_rRow->get())[i+1] = ::dbtools::DBTypeConversion::toDouble(::dbtools::DBTypeConversion::toDateTime(nRes,aDate)); + break; + default: + *(_rRow->get())[i+1] = ::dbtools::DBTypeConversion::toDouble(::dbtools::DBTypeConversion::toTime(nRes)); + } + } + catch(Exception&) + { + (_rRow->get())[i+1]->setNull(); + } + } break; + case DataType::DOUBLE: + case DataType::INTEGER: + case DataType::DECIMAL: // #99178# OJ + case DataType::NUMERIC: + { + sal_Unicode cDecimalDelimiter = pConnection->getDecimalDelimiter(); + sal_Unicode cThousandDelimiter = pConnection->getThousandDelimiter(); + String aStrConverted; + + OSL_ENSURE(cDecimalDelimiter && nType != DataType::INTEGER || + !cDecimalDelimiter && nType == DataType::INTEGER, + "FalscherTyp"); + + // In Standard-Notation (DezimalPUNKT ohne Tausender-Komma) umwandeln: + for (xub_StrLen j = 0; j < aStr.Len(); ++j) + { + if (cDecimalDelimiter && aStr.GetChar(j) == cDecimalDelimiter) + aStrConverted += '.'; + else if ( aStr.GetChar(j) == '.' ) // special case, if decimal seperator isn't '.' we have to vut the string after it + break; // #99189# OJ + else if (cThousandDelimiter && aStr.GetChar(j) == cThousandDelimiter) + { + // weglassen + } + else + aStrConverted += aStr.GetChar(j) ; + } + double nVal = ::rtl::math::stringToDouble(aStrConverted.GetBuffer(),',','.',NULL,NULL); + + // #99178# OJ + if ( DataType::DECIMAL == nType || DataType::NUMERIC == nType ) + *(_rRow->get())[i+1] = ORowSetValue(String::CreateFromDouble(nVal)); + else + *(_rRow->get())[i+1] = nVal; + } break; + + default: + { + // Wert als String in Variable der Row uebernehmen + *(_rRow->get())[i+1] = ORowSetValue(aStr); + } + break; + } + } + } + return sal_True; +} +// ----------------------------------------------------------------------------- +sal_Bool OEvoabTable::setColumnAliases() +{ + + size_t nSize = m_aColumnRawNames.size(); + if(nSize == 0 || m_aPrecisions.size() != nSize || m_aScales.size() != nSize || m_aTypes.size() != nSize) + return sal_False; + m_aColumns->get().clear(); + m_aColumns->get().reserve(nSize); + ::rtl::OUString aColumnReadName; + ::rtl::OUString aColumnHeadlineName; + ::rtl::OUString aColumnDisplayName; + ::rtl::OUString aColumnFinalName; + String sColumnFinalName; + + const TStringVector& colAliasNames = ((OEvoabConnection*)m_pConnection)->getColumnAlias().getAlias(); + const ::std::map< ::rtl::OUString, ::rtl::OUString > & colMap = ((OEvoabConnection*)m_pConnection)->getColumnAlias().getAliasMap(); + ::osl::MutexGuard aGuard( m_aMutex ); + + for(size_t i = 0;i < nSize; ++i) + { + aColumnReadName = m_aColumnRawNames[i]; + //OSL_TRACE("OEvoabTable::getColumnRows()::aColumnReadName = %s\n", ((OUtoCStr(aColumnReadName)) ? (OUtoCStr(aColumnReadName)):("NULL")) ); + sal_Bool bFound = sal_False; + for ( size_t j = 0; j < colAliasNames.size(); ++j ) + { + aColumnDisplayName = colAliasNames[j]; + + ::std::map< ::rtl::OUString, ::rtl::OUString >::const_iterator aPos = colMap.find( aColumnDisplayName ); + if ( colMap.end() != aPos ) + { + aColumnHeadlineName = aPos->second; + EVO_TRACE_STRING( "OEvoabTable::getColumnRows()::aColumnDisplayName = %s\n", aColumnDisplayName ); + EVO_TRACE_STRING( "OEvoabTable::getColumnRows()::aColumnHeadlineName= %s\n", aColumnHeadlineName ); + if(aColumnReadName == aColumnHeadlineName) + { + //OSL_TRACE("OEvoabTable::getColumnRows()::aColumnHeadlineName = %s\n", ((OUtoCStr(aColumnHeadlineName)) ? (OUtoCStr(aColumnHeadlineName)):("NULL")) ); + //OSL_TRACE("OEvoabTable::getColumnRows()::aColumnDisplayName = %s\n", ((OUtoCStr(aColumnDisplayName)) ? (OUtoCStr(aColumnDisplayName)):("NULL")) ); + aColumnFinalName = aColumnDisplayName; + bFound = sal_True; + //OSL_TRACE("OEvoabTable::getColumnRows()::j = %d\n", j ); + + break; + } + } + else + OSL_ENSURE( sal_False, "OEvoabTable::setColumnAliases: did not find one of the aliases!" ); + } + if(!bFound) + aColumnFinalName = aColumnReadName; + sColumnFinalName = aColumnFinalName; + + sal_Bool bCase = getConnection()->getMetaData()->storesMixedCaseQuotedIdentifiers(); + ::rtl::OUString aTypeName; + aTypeName = ::rtl::OUString::createFromAscii("VARCHAR"); + sdbcx::OColumn* pColumn = new sdbcx::OColumn(sColumnFinalName,aTypeName,::rtl::OUString(), + ColumnValue::NULLABLE, + m_aPrecisions[i], + m_aScales[i], + m_aTypes[i], + sal_False, + sal_False, + sal_False, + bCase); + Reference< XPropertySet> xCol = pColumn; + m_aColumns->get().push_back(xCol); + } + return sal_True; +} +// ----------------------------------------------------------------------------- +void OEvoabTable::refreshIndexes() +{ +} +// ----------------------------------------------------------------------------- +sal_Bool OEvoabTable::checkHeaderLine() +{ + if (m_nFilePos == 0 && ((OEvoabConnection*)m_pConnection)->isHeaderLine()) + { + BOOL bRead2; + do + { + bRead2 = m_pFileStream->ReadByteStringLine(m_aCurrentLine,m_pConnection->getTextEncoding()); + } + while(bRead2 && !m_aCurrentLine.Len()); + + m_nFilePos = m_pFileStream->Tell(); + if (m_pFileStream->IsEof()) + return sal_False; + } + return sal_True; +} +//------------------------------------------------------------------ +sal_Bool OEvoabTable::seekRow(IResultSetHelper::Movement eCursorPosition, sal_Int32 nOffset, sal_Int32& nCurPos) +{ + //OSL_TRACE("OEvoabTable::(before SeekRow)m_aCurrentLine = %d\n", ((OUtoCStr(::rtl::OUString(m_aCurrentLine))) ? (OUtoCStr(::rtl::OUString(m_aCurrentLine))):("NULL")) ); + + if ( !m_pFileStream ) + return sal_False; + OEvoabConnection* pConnection = (OEvoabConnection*)m_pConnection; + // ---------------------------------------------------------- + // Positionierung vorbereiten: + //OSL_TRACE("OEvoabTable::(before SeekRow,m_pFileStriam Exist)m_aCurrentLine = %d\n", ((OUtoCStr(::rtl::OUString(m_aCurrentLine))) ? (OUtoCStr(::rtl::OUString(m_aCurrentLine))):("NULL")) ); + + m_nFilePos = nCurPos; + + switch(eCursorPosition) + { + case IResultSetHelper::FIRST: + m_nFilePos = 0; + m_nRowPos = 1; + // run through + case IResultSetHelper::NEXT: + if(eCursorPosition != IResultSetHelper::FIRST) + ++m_nRowPos; + m_pFileStream->Seek(m_nFilePos); + if (m_pFileStream->IsEof() || !checkHeaderLine()) + { + m_nMaxRowCount = m_nRowPos; + return sal_False; + } + + m_aRowToFilePos.insert(::std::map<sal_Int32,sal_Int32>::value_type(m_nRowPos,m_nFilePos)); + + m_pFileStream->ReadByteStringLine(m_aCurrentLine,pConnection->getTextEncoding()); + if (m_pFileStream->IsEof()) + { + m_nMaxRowCount = m_nRowPos; + return sal_False; + } + nCurPos = m_pFileStream->Tell(); + break; + case IResultSetHelper::PRIOR: + --m_nRowPos; + if(m_nRowPos > 0) + { + m_nFilePos = m_aRowToFilePos.find(m_nRowPos)->second; + m_pFileStream->Seek(m_nFilePos); + if (m_pFileStream->IsEof() || !checkHeaderLine()) + return sal_False; + m_pFileStream->ReadByteStringLine(m_aCurrentLine,pConnection->getTextEncoding()); + if (m_pFileStream->IsEof()) + return sal_False; + nCurPos = m_pFileStream->Tell(); + } + else + m_nRowPos = 0; + + break; + case IResultSetHelper::LAST: + if(m_nMaxRowCount) + { + m_nFilePos = m_aRowToFilePos.rbegin()->second; + m_nRowPos = m_aRowToFilePos.rbegin()->first; + m_pFileStream->Seek(m_nFilePos); + if (m_pFileStream->IsEof() || !checkHeaderLine()) + return sal_False; + m_pFileStream->ReadByteStringLine(m_aCurrentLine,pConnection->getTextEncoding()); + if (m_pFileStream->IsEof()) + return sal_False; + nCurPos = m_pFileStream->Tell(); + } + else + { + while(seekRow(IResultSetHelper::NEXT,1,nCurPos)) ; // run through after last row + // now I know all + seekRow(IResultSetHelper::PRIOR,1,nCurPos); + } + break; + case IResultSetHelper::RELATIVE: + if(nOffset > 0) + { + for(sal_Int32 i = 0;i<nOffset;++i) + seekRow(IResultSetHelper::NEXT,1,nCurPos); + } + else if(nOffset < 0) + { + for(sal_Int32 i = nOffset;i;++i) + seekRow(IResultSetHelper::PRIOR,1,nCurPos); + } + break; + case IResultSetHelper::ABSOLUTE: + { + if(nOffset < 0) + nOffset = m_nRowPos + nOffset; + ::std::map<sal_Int32,sal_Int32>::const_iterator aIter = m_aRowToFilePos.find(nOffset); + if(aIter != m_aRowToFilePos.end()) + { + m_nFilePos = aIter->second; + m_pFileStream->Seek(m_nFilePos); + if (m_pFileStream->IsEof() || !checkHeaderLine()) + return sal_False; + m_pFileStream->ReadByteStringLine(m_aCurrentLine,pConnection->getTextEncoding()); + if (m_pFileStream->IsEof()) + return sal_False; + nCurPos = m_pFileStream->Tell(); + } + else if(m_nMaxRowCount && nOffset > m_nMaxRowCount) // offset is outside the table + { + m_nRowPos = m_nMaxRowCount; + return sal_False; + } + else + { + aIter = m_aRowToFilePos.upper_bound(nOffset); + if(aIter == m_aRowToFilePos.end()) + { + m_nRowPos = m_aRowToFilePos.rbegin()->first; + nCurPos = m_nFilePos = m_aRowToFilePos.rbegin()->second; + while(m_nRowPos != nOffset) + seekRow(IResultSetHelper::NEXT,1,nCurPos); + } + else + { + --aIter; + m_nRowPos = aIter->first; + m_nFilePos = aIter->second; + m_pFileStream->Seek(m_nFilePos); + if (m_pFileStream->IsEof() || !checkHeaderLine()) + return sal_False; + m_pFileStream->ReadByteStringLine(m_aCurrentLine,pConnection->getTextEncoding()); + if (m_pFileStream->IsEof()) + return sal_False; + nCurPos = m_pFileStream->Tell(); + } + } + } + + break; + case IResultSetHelper::BOOKMARK: + m_pFileStream->Seek(nOffset); + if (m_pFileStream->IsEof()) + return sal_False; + + m_nFilePos = m_pFileStream->Tell(); // Byte-Position in der Datei merken (am ZeilenANFANG) + m_pFileStream->ReadByteStringLine(m_aCurrentLine,pConnection->getTextEncoding()); + if (m_pFileStream->IsEof()) + return sal_False; + nCurPos = m_pFileStream->Tell(); + break; + } + + //OSL_TRACE("OEvoabTable::(after SeekRow)m_aCurrentLine = %d\n", ((OUtoCStr(::rtl::OUString(m_aCurrentLine))) ? (OUtoCStr(::rtl::OUString(m_aCurrentLine))):("NULL")) ); + + return sal_True; +} +// ----------------------------------------------------------------------------- diff --git a/connectivity/source/drivers/evoab/LTable.hxx b/connectivity/source/drivers/evoab/LTable.hxx new file mode 100644 index 000000000000..360e4487cf09 --- /dev/null +++ b/connectivity/source/drivers/evoab/LTable.hxx @@ -0,0 +1,103 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: LTable.hxx,v $ + * $Revision: 1.7 $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef _CONNECTIVITY_EVOAB_LTABLE_HXX_ +#define _CONNECTIVITY_EVOAB_LTABLE_HXX_ + +#include "file/FTable.hxx" +#include "connectivity/sdbcx/VColumn.hxx" +#include "connectivity/CommonTools.hxx" +#include <tools/urlobj.hxx> +#include "file/quotedstring.hxx" +#include <vector> + +namespace connectivity +{ + namespace evoab + { + typedef file::OFileTable OEvoabTable_BASE; + class OEvoabConnection; + + typedef ::std::map< ::rtl::OUString, + ::com::sun::star::uno::Reference< ::com::sun::star::container::XNamed>, comphelper::UStringMixLess > OContainer; + + class OEvoabTable : public OEvoabTable_BASE + { + private: + // maps a row postion to a file position + ::std::map<sal_Int32,sal_Int32> m_aRowToFilePos; + ::std::vector<sal_Int32> m_aTypes; // holds all type for columns just to avoid to ask the propertyset + ::std::vector<sal_Int32> m_aPrecisions; // same as aboth + ::std::vector<sal_Int32> m_aScales; + QuotedTokenizedString m_aCurrentLine; + ::com::sun::star::uno::Reference< ::com::sun::star::util::XNumberFormatter > m_xNumberFormatter; + sal_Int32 m_nRowPos; + sal_Int32 m_nMaxRowCount; // will be set if stream is once eof + ::std::vector< ::rtl::OUString> m_aColumnRawNames; + sal_Bool setColumnAliases(); + void fillColumns(const ::com::sun::star::lang::Locale& _aLocale); + sal_Bool checkHeaderLine(); + ::com::sun::star::uno::Reference< ::com::sun::star::beans::XFastPropertySet> isUniqueByColumnName(const ::rtl::OUString& _rColName); + + public: + virtual void refreshColumns(); + virtual void refreshIndexes(); + + public: + // DECLARE_CTY_DEFAULTS( OFlatTable_BASE); + OEvoabTable( sdbcx::OCollection* _pTables,OEvoabConnection* _pConnection); + OEvoabTable( sdbcx::OCollection* _pTables,OEvoabConnection* _pConnection, + const ::rtl::OUString& _Name, + const ::rtl::OUString& _Type, + const ::rtl::OUString& _Description = ::rtl::OUString(), + const ::rtl::OUString& _SchemaName = ::rtl::OUString(), + const ::rtl::OUString& _CatalogName = ::rtl::OUString() + ); + + void construct(); // can throw any exception + + virtual sal_Bool seekRow(IResultSetHelper::Movement eCursorPosition, sal_Int32 nOffset, sal_Int32& nCurPos); + virtual sal_Bool fetchRow(OValueRefRow& _rRow,const OSQLColumns& _rCols, sal_Bool bIsTable,sal_Bool bRetrieveData); + + virtual ::com::sun::star::uno::Any SAL_CALL queryInterface( const ::com::sun::star::uno::Type & rType ) throw(::com::sun::star::uno::RuntimeException); + //XTypeProvider + virtual ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Type > SAL_CALL getTypes( ) throw(::com::sun::star::uno::RuntimeException); + virtual void SAL_CALL disposing(void); + + // com::sun::star::lang::XUnoTunnel + virtual sal_Int64 SAL_CALL getSomething( const ::com::sun::star::uno::Sequence< sal_Int8 >& aIdentifier ) throw(::com::sun::star::uno::RuntimeException); + static ::com::sun::star::uno::Sequence< sal_Int8 > getUnoTunnelImplementationId(); + + String getEntry(); + }; + } +} +#endif // _CONNECTIVITY_EVOAB_LTABLE_HXX_ + diff --git a/connectivity/source/drivers/evoab/LTables.cxx b/connectivity/source/drivers/evoab/LTables.cxx new file mode 100644 index 000000000000..7465c890f240 --- /dev/null +++ b/connectivity/source/drivers/evoab/LTables.cxx @@ -0,0 +1,65 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: LTables.cxx,v $ + * $Revision: 1.6 $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_connectivity.hxx" +#include "LTables.hxx" +#include "LTable.hxx" +#include <com/sun/star/sdbc/XRow.hpp> +#include <com/sun/star/sdbc/XResultSet.hpp> +#include <com/sun/star/sdbc/ColumnValue.hpp> +#include <com/sun/star/sdbc/KeyRule.hpp> +#include <com/sun/star/sdbcx/KeyType.hpp> +#include "file/FCatalog.hxx" +#include "file/FConnection.hxx" +#include <comphelper/types.hxx> + +using namespace connectivity; +using namespace ::comphelper; +using namespace connectivity::evoab; +using namespace connectivity::file; +using namespace ::com::sun::star::uno; +using namespace ::com::sun::star::beans; +using namespace ::com::sun::star::sdbcx; +using namespace ::com::sun::star::sdbc; +using namespace ::com::sun::star::lang; +using namespace ::com::sun::star::container; +namespace starutil = ::com::sun::star::util; + +sdbcx::ObjectType OEvoabTables::createObject(const ::rtl::OUString& _rName) +{ + OEvoabTable* pRet = new OEvoabTable(this,(OEvoabConnection*)static_cast<OFileCatalog&>(m_rParent).getConnection(), + _rName,::rtl::OUString::createFromAscii("TABLE")); + sdbcx::ObjectType xRet = pRet; + pRet->construct(); + return xRet; +} +// ------------------------------------------------------------------------- + diff --git a/connectivity/source/drivers/evoab/LTables.hxx b/connectivity/source/drivers/evoab/LTables.hxx new file mode 100644 index 000000000000..3fcaaa7d8e58 --- /dev/null +++ b/connectivity/source/drivers/evoab/LTables.hxx @@ -0,0 +1,55 @@ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: LTables.hxx,v $ + * $Revision: 1.5 $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#ifndef _CONNECTIVITY_EVOAB_LTABLES_HXX_ +#define _CONNECTIVITY_EVOAB_LTABLES_HXX_ + +#include "file/FTables.hxx" + +namespace connectivity +{ + namespace evoab + { + // namespace ::com::sun::star::sdbcx = ::com::sun::star::sdbcx; + typedef file::OTables OEvoabTables_BASE; + + class OEvoabTables : public OEvoabTables_BASE + { + protected: + virtual sdbcx::ObjectType createObject(const ::rtl::OUString& _rName); + public: + OEvoabTables(const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XDatabaseMetaData >& _rMetaData,::cppu::OWeakObject& _rParent, ::osl::Mutex& _rMutex, + const TStringVector &_rVector) : OEvoabTables_BASE(_rMetaData,_rParent,_rMutex,_rVector) + {} + }; + } +} +#endif // _CONNECTIVITY_EVOAB_LTABLES_HXX_ + diff --git a/connectivity/source/drivers/evoab/evoab.map b/connectivity/source/drivers/evoab/evoab.map new file mode 100644 index 000000000000..00cf7191f143 --- /dev/null +++ b/connectivity/source/drivers/evoab/evoab.map @@ -0,0 +1,8 @@ +EVOAB_1_0 { + global: + component_getImplementationEnvironment; + component_writeInfo; + component_getFactory; + local: + *; +}; diff --git a/connectivity/source/drivers/evoab/evoab.xcu b/connectivity/source/drivers/evoab/evoab.xcu new file mode 100644 index 000000000000..4c5c4894e0ab --- /dev/null +++ b/connectivity/source/drivers/evoab/evoab.xcu @@ -0,0 +1,64 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!--*********************************************************************** + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: DataAccess.xcu,v $ + * $Revision: 1.27 $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************ --> +<oor:component-data oor:name="Drivers" oor:package="org.openoffice.Office.DataAccess" xmlns:oor="http://openoffice.org/2001/registry" xmlns:xs="http://www.w3.org/2001/XMLSchema"> + <node oor:name="Installed"> + <node oor:name="sdbc:address:evolution:ldap" oor:op="replace"> + <prop oor:name="Driver"> + <value>com.sun.star.comp.sdbc.evoab.OEvoabDriver</value> + </prop> + <prop oor:name="DriverTypeDisplayName" oor:type="xs:string"> + <value xml:lang="en-US">Evolution LDAP</value> + </prop> + <node oor:name="Features"> + <node oor:name="EscapeDateTime" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:boolean"> + <value>true</value> + </prop> + </node> + </node> + </node> + <node oor:name="sdbc:address:evolution:groupwise" oor:op="replace"> + <prop oor:name="Driver"> + <value>com.sun.star.comp.sdbc.evoab.OEvoabDriver</value> + </prop> + <prop oor:name="DriverTypeDisplayName" oor:type="xs:string"> + <value xml:lang="en-US">Groupwise</value> + </prop> + <node oor:name="Features"> + <node oor:name="EscapeDateTime" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:boolean"> + <value>true</value> + </prop> + </node> + </node> + </node> + </node> +</oor:component-data> diff --git a/connectivity/source/drivers/evoab/evoab.xml b/connectivity/source/drivers/evoab/evoab.xml new file mode 100644 index 000000000000..8ed16719ae0e --- /dev/null +++ b/connectivity/source/drivers/evoab/evoab.xml @@ -0,0 +1,33 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE module-description PUBLIC "-//W3C//DTD HTML 3.2//EN" "module-description.dtd"> +<module-description> + <module-name>file</module-name> + <component-description> + <author>Xibei(Berry) Jia</author> + <name>com.sun.star.comp.sdbc.evoab.OEvoabDriver</name> + <description>This library implements the database driver for evolution address book formats. +</description> + <loader-name>com.sun.star.loader.SharedLibrary</loader-name> + <language>c++</language> + <status value="final"/> + <supported-service>com.sun.star.sdbc.Driver</supported-service> + <supported-service>com.sun.star.sdbcx.Driver</supported-service> + <service-dependency> ... </service-dependency> + </component-description> + <project-build-dependency>cppuhelper</project-build-dependency> + <project-build-dependency>cppu</project-build-dependency> + <project-build-dependency>sal</project-build-dependency> + <project-build-dependency>vos</project-build-dependency> + <runtime-module-dependency>file</runtime-module-dependency> + <runtime-module-dependency>cppuhelper</runtime-module-dependency> + <runtime-module-dependency>cppu</runtime-module-dependency> + <runtime-module-dependency>sal</runtime-module-dependency> + <runtime-module-dependency>vos</runtime-module-dependency> + <runtime-module-dependency>osl</runtime-module-dependency> + <runtime-module-dependency>svtools-light1</runtime-module-dependency> + <runtime-module-dependency>svtools</runtime-module-dependency> + <runtime-module-dependency>ucbhelper</runtime-module-dependency> + <runtime-module-dependency>dbtools</runtime-module-dependency> + <runtime-module-dependency>unotools</runtime-module-dependency> + <runtime-module-dependency>comphelper</runtime-module-dependency> +</module-description> diff --git a/connectivity/source/drivers/evoab/exports.dxp b/connectivity/source/drivers/evoab/exports.dxp new file mode 100644 index 000000000000..9630d7e06768 --- /dev/null +++ b/connectivity/source/drivers/evoab/exports.dxp @@ -0,0 +1,3 @@ +component_getImplementationEnvironment +component_writeInfo +component_getFactory diff --git a/connectivity/source/drivers/evoab/makefile.mk b/connectivity/source/drivers/evoab/makefile.mk new file mode 100644 index 000000000000..8982322513de --- /dev/null +++ b/connectivity/source/drivers/evoab/makefile.mk @@ -0,0 +1,108 @@ +#************************************************************************* +# +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +# +# Copyright 2008 by Sun Microsystems, Inc. +# +# OpenOffice.org - a multi-platform office productivity suite +# +# $RCSfile: makefile.mk,v $ +# +# $Revision: 1.9 $ +# +# This file is part of OpenOffice.org. +# +# OpenOffice.org is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License version 3 +# only, as published by the Free Software Foundation. +# +# OpenOffice.org is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License version 3 for more details +# (a copy is included in the LICENSE file that accompanied this code). +# +# You should have received a copy of the GNU Lesser General Public License +# version 3 along with OpenOffice.org. If not, see +# <http://www.openoffice.org/license.html> +# for a copy of the LGPLv3 License. +# +#************************************************************************* + +PRJ=..$/..$/.. +PRJINC=..$/.. +PRJNAME=connectivity +TARGET=evoab + +VISIBILITY_HIDDEN=TRUE + +# --- Settings ---------------------------------- +.IF "$(DBGUTIL_OJ)"!="" +ENVCFLAGS+=/FR$(SLO)$/ +.ENDIF + +.INCLUDE : $(PRJ)$/version.mk +.INCLUDE : $(PRJ)$/makefile.pmk + +.IF "$(GUI)"=="UNX" + +# --- Files ------------------------------------- + +EXCEPTIONSFILES=\ + $(SLO)$/LResultSet.obj \ + $(SLO)$/LStatement.obj \ + $(SLO)$/LPreparedStatement.obj \ + $(SLO)$/LFolderList.obj \ + $(SLO)$/LConfigAccess.obj \ + $(SLO)$/LColumnAlias.obj \ + $(SLO)$/LTable.obj \ + $(SLO)$/LDatabaseMetaData.obj \ + $(SLO)$/LCatalog.obj \ + $(SLO)$/LColumns.obj \ + $(SLO)$/LTables.obj \ + $(SLO)$/LConnection.obj \ + $(SLO)$/LServices.obj \ + $(SLO)$/LDriver.obj + +SLOFILES=\ + $(EXCEPTIONSFILES) \ + $(SLO)$/LDebug.obj + + +SHL1VERSIONMAP=$(TARGET).map + + +# --- Library ----------------------------------- +#SHL1TARGET=$(TARGET)$(DLLPOSTFIX) +SHL1TARGET= $(EVOAB_TARGET)$(DLLPOSTFIX) +SHL1OBJS=$(SLOFILES) +SHL1STDLIBS=\ + $(CPPULIB) \ + $(CPPUHELPERLIB) \ + $(VOSLIB) \ + $(TOOLSLIB) \ + $(SVTOOLLIB) \ + $(UNOTOOLSLIB) \ + $(UCBHELPERLIB) \ + $(SALLIB) \ + $(DBTOOLSLIB) \ + $(DBFILELIB) \ + $(COMPHELPERLIB) + +.IF "$(DBFILELIB)" == "" +SHL1STDLIBS+= ifile.lib +.ENDIF + +SHL1DEPN= +SHL1IMPLIB= i$(TARGET) + +SHL1DEF= $(MISC)$/$(SHL1TARGET).def + +DEF1NAME= $(SHL1TARGET) + +.ELSE +dummy: + @echo "Nothing to build for GUI $(GUI)" +.ENDIF +# --- Targets ---------------------------------- +.INCLUDE : $(PRJ)$/target.pmk diff --git a/connectivity/source/drivers/evoab2/evoab2.xcu b/connectivity/source/drivers/evoab2/evoab2.xcu new file mode 100644 index 000000000000..ddfc3b070e81 --- /dev/null +++ b/connectivity/source/drivers/evoab2/evoab2.xcu @@ -0,0 +1,79 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!--*********************************************************************** + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: DataAccess.xcu,v $ + * $Revision: 1.27 $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************ --> +<oor:component-data oor:name="Drivers" oor:package="org.openoffice.Office.DataAccess" xmlns:oor="http://openoffice.org/2001/registry" xmlns:xs="http://www.w3.org/2001/XMLSchema"> + <node oor:name="Installed"> + <node oor:name="sdbc:address:evolution:local" oor:op="replace"> + <prop oor:name="Driver"> + <value>com.sun.star.comp.sdbc.evoab.OEvoabDriver</value> + </prop> + <prop oor:name="DriverTypeDisplayName" oor:type="xs:string"> + <value xml:lang="en-US">Evolution Local</value> + </prop> + <node oor:name="Features"> + <node oor:name="EscapeDateTime" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:boolean"> + <value>true</value> + </prop> + </node> + </node> + </node> + <node oor:name="sdbc:address:evolution:ldap" oor:op="replace"> + <prop oor:name="Driver"> + <value>com.sun.star.comp.sdbc.evoab.OEvoabDriver</value> + </prop> + <prop oor:name="DriverTypeDisplayName" oor:type="xs:string"> + <value xml:lang="en-US">Evolution LDAP</value> + </prop> + <node oor:name="Features"> + <node oor:name="EscapeDateTime" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:boolean"> + <value>true</value> + </prop> + </node> + </node> + </node> + <node oor:name="sdbc:address:evolution:groupwise" oor:op="replace"> + <prop oor:name="Driver"> + <value>com.sun.star.comp.sdbc.evoab.OEvoabDriver</value> + </prop> + <prop oor:name="DriverTypeDisplayName" oor:type="xs:string"> + <value xml:lang="en-US">Groupwise</value> + </prop> + <node oor:name="Features"> + <node oor:name="EscapeDateTime" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:boolean"> + <value>true</value> + </prop> + </node> + </node> + </node> + </node> +</oor:component-data> diff --git a/connectivity/source/drivers/evoab2/makefile.mk b/connectivity/source/drivers/evoab2/makefile.mk index a911bd262516..e9bb9fdc4d70 100644 --- a/connectivity/source/drivers/evoab2/makefile.mk +++ b/connectivity/source/drivers/evoab2/makefile.mk @@ -39,7 +39,7 @@ dummy: # --- Settings ---------------------------------- -.INCLUDE : settings.mk +.INCLUDE : $(PRJ)$/makefile.pmk .INCLUDE : $(PRJ)$/version.mk PKGCONFIG_MODULES=gtk+-2.0 @@ -111,4 +111,4 @@ DEF1NAME= $(SHL1TARGET) .ENDIF # --- Targets ---------------------------------- -.INCLUDE : target.mk +.INCLUDE : $(PRJ)$/target.pmk diff --git a/connectivity/source/drivers/file/FResultSet.cxx b/connectivity/source/drivers/file/FResultSet.cxx index ca86fb2a3d73..d96245c06cda 100644 --- a/connectivity/source/drivers/file/FResultSet.cxx +++ b/connectivity/source/drivers/file/FResultSet.cxx @@ -1303,8 +1303,9 @@ void OResultSet::sortRows() OSL_ENSURE((sal_Int32)m_aRow->get().size() > *aOrderByIter,"Invalid Index"); switch ((*(m_aRow->get().begin()+*aOrderByIter))->getValue().getTypeKind()) { - case DataType::CHAR: + case DataType::CHAR: case DataType::VARCHAR: + case DataType::LONGVARCHAR: eKeyType[i] = SQL_ORDERBYKEY_STRING; break; @@ -1471,6 +1472,7 @@ BOOL OResultSet::OpenImpl() if(IsSorted()) { aOrderbyColumnNumberSave = m_aOrderbyColumnNumber;// .assign(m_aOrderbyColumnNumber.begin(), m_aOrderbyColumnNumber.end()); + m_aOrderbyColumnNumber.clear(); aOrderbyAscendingSave.assign(m_aOrderbyAscending.begin(), m_aOrderbyAscending.end()); bWasSorted = TRUE; } diff --git a/connectivity/source/drivers/file/FStatement.cxx b/connectivity/source/drivers/file/FStatement.cxx index 2692f02d7614..07cdf95d7b44 100644 --- a/connectivity/source/drivers/file/FStatement.cxx +++ b/connectivity/source/drivers/file/FStatement.cxx @@ -639,7 +639,7 @@ void OStatement_Base::GetAssignValues() aColumnNameList.push_back(pCol->getTokenValue()); } } - if(!aColumnNameList.size()) + if ( aColumnNameList.empty() ) throwFunctionSequenceException(*this); // Werte ... @@ -652,10 +652,10 @@ void OStatement_Base::GetAssignValues() if (! SQL_ISTOKEN(pValuesOrQuerySpec->getChild(0),VALUES)) throwFunctionSequenceException(*this); - OSL_ENSURE(pValuesOrQuerySpec->count() == 2,"OResultSet: pValuesOrQuerySpec->count() != 2"); + OSL_ENSURE(pValuesOrQuerySpec->count() == 4,"OResultSet: pValuesOrQuerySpec->count() != 4"); // Liste von Werten - OSQLParseNode * pInsertAtomCommalist = pValuesOrQuerySpec->getChild(1); + OSQLParseNode * pInsertAtomCommalist = pValuesOrQuerySpec->getChild(2); OSL_ENSURE(pInsertAtomCommalist != NULL,"OResultSet: pInsertAtomCommalist darf nicht NULL sein!"); OSL_ENSURE(pInsertAtomCommalist->count() > 0,"OResultSet: pInsertAtomCommalist <= 0"); @@ -665,40 +665,22 @@ void OStatement_Base::GetAssignValues() for (sal_uInt32 i = 0; i < pInsertAtomCommalist->count(); i++) { pRow_Value_Const = pInsertAtomCommalist->getChild(i); // row_value_constructor - if(pRow_Value_Const->count() == 3) // '(' row_value_const_list ')' + OSL_ENSURE(pRow_Value_Const != NULL,"OResultSet: pRow_Value_Const darf nicht NULL sein!"); + if(SQL_ISRULE(pRow_Value_Const,parameter)) { - pRow_Value_Const = pRow_Value_Const->getChild(1); // row_value_const_list - OSL_ENSURE(pRow_Value_Const != NULL,"OResultSet: pRow_Value_Const darf nicht NULL sein!"); - if(SQL_ISRULE(pRow_Value_Const,parameter)) - { - if(pRow_Value_Const->count() == aColumnNameList.size()) - ParseAssignValues(aColumnNameList,pRow_Value_Const,nIndex++); // kann nur ein Columnname vorhanden sein pro Schleife - else - { -// aStatus.Set(SQL_STAT_ERROR, -// String::CreateFromAscii("S1000"), -// aStatus.CreateErrorMessage(String(SdbResId(STR_STAT_SYNTAX_ERROR))), -// 0, String() ); - throwFunctionSequenceException(*this); - } - } - else if(pRow_Value_Const->isToken()) - ParseAssignValues(aColumnNameList,pRow_Value_Const,static_cast<xub_StrLen>(i)); - else - { - if(pRow_Value_Const->count() == aColumnNameList.size()) - { - for (sal_uInt32 j = 0; j < pRow_Value_Const->count(); ++j) - ParseAssignValues(aColumnNameList,pRow_Value_Const->getChild(j),nIndex++); - } - else - throwFunctionSequenceException(*this); - } + ParseAssignValues(aColumnNameList,pRow_Value_Const,nIndex++); // kann nur ein Columnname vorhanden sein pro Schleife } + else if(pRow_Value_Const->isToken()) + ParseAssignValues(aColumnNameList,pRow_Value_Const,static_cast<xub_StrLen>(i)); else { - // aStatus.SetStatementTooComplex(); - throwFunctionSequenceException(*this); + if(pRow_Value_Const->count() == aColumnNameList.size()) + { + for (sal_uInt32 j = 0; j < pRow_Value_Const->count(); ++j) + ParseAssignValues(aColumnNameList,pRow_Value_Const->getChild(j),nIndex++); + } + else + throwFunctionSequenceException(*this); } } } @@ -814,6 +796,7 @@ void OStatement_Base::SetAssignValue(const String& aColumnName, // Kriterium je nach Typ als String oder double in die Variable packen ... case DataType::CHAR: case DataType::VARCHAR: + case DataType::LONGVARCHAR: *(m_aAssignValues->get())[nId] = ORowSetValue(aValue); // Zeichensatz ist bereits konvertiert, da ja das gesamte Statement konvertiert wurde break; diff --git a/connectivity/source/drivers/file/FStringFunctions.cxx b/connectivity/source/drivers/file/FStringFunctions.cxx index e3eeb52f2d7d..07e620763b79 100644 --- a/connectivity/source/drivers/file/FStringFunctions.cxx +++ b/connectivity/source/drivers/file/FStringFunctions.cxx @@ -32,6 +32,7 @@ #include "precompiled_connectivity.hxx" #include "file/FStringFunctions.hxx" +#include <rtl/ustrbuf.hxx> #include <rtl/logfile.hxx> using namespace connectivity; @@ -102,7 +103,7 @@ ORowSetValue OOp_Concat::operate(const ::std::vector<ORowSetValue>& lhs) const if ( lhs.empty() ) return ORowSetValue(); - ::rtl::OUString sRet; + ::rtl::OUStringBuffer sRet; ::std::vector<ORowSetValue>::const_reverse_iterator aIter = lhs.rbegin(); ::std::vector<ORowSetValue>::const_reverse_iterator aEnd = lhs.rend(); for (; aIter != aEnd; ++aIter) @@ -110,10 +111,10 @@ ORowSetValue OOp_Concat::operate(const ::std::vector<ORowSetValue>& lhs) const if ( aIter->isNull() ) return ORowSetValue(); - sRet += *aIter; + sRet.append(aIter->operator ::rtl::OUString()); } - return sRet; + return sRet.makeStringAndClear(); } //------------------------------------------------------------------ ORowSetValue OOp_Locate::operate(const ::std::vector<ORowSetValue>& lhs) const @@ -183,13 +184,13 @@ ORowSetValue OOp_Space::operate(const ORowSetValue& lhs) const return lhs; const sal_Char c = ' '; - ::rtl::OUString sRet; + ::rtl::OUStringBuffer sRet; sal_Int32 nCount = lhs; for (sal_Int32 i=0; i < nCount; ++i) { - sRet += ::rtl::OUString(&c,1,RTL_TEXTENCODING_ASCII_US); + sRet.appendAscii(&c,1); } - return sRet; + return sRet.makeStringAndClear(); } //------------------------------------------------------------------ ORowSetValue OOp_Replace::operate(const ::std::vector<ORowSetValue>& lhs) const diff --git a/connectivity/source/drivers/file/fcode.cxx b/connectivity/source/drivers/file/fcode.cxx index 0bd0d354ba02..4b2865a67aa2 100644 --- a/connectivity/source/drivers/file/fcode.cxx +++ b/connectivity/source/drivers/file/fcode.cxx @@ -65,6 +65,7 @@ TYPEINIT1(OStopOperand, OOperandValue); TYPEINIT1(OOperator, OCode); TYPEINIT1(OBoolOperator,OOperator); +TYPEINIT1(OOp_NOT, OBoolOperator); TYPEINIT1(OOp_AND, OBoolOperator); TYPEINIT1(OOp_OR, OBoolOperator); TYPEINIT1(OOp_ISNULL, OBoolOperator); @@ -242,6 +243,29 @@ void OBoolOperator::Exec(OCodeStack& rCodeStack) if (IS_TYPE(OOperandResult,pRight)) delete pRight; } +//------------------------------------------------------------------ +sal_Bool OOp_NOT::operate(const OOperand* pLeft, const OOperand* ) const +{ + RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "file", "Ocke.Janssen@sun.com", "OOp_AND::operate" ); + return !pLeft->isValid(); +} +//------------------------------------------------------------------ +void OOp_NOT::Exec(OCodeStack& rCodeStack) +{ + RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "file", "Ocke.Janssen@sun.com", "OOp_ISNULL::Exec" ); + OOperand* pOperand = rCodeStack.top(); + rCodeStack.pop(); + + rCodeStack.push(new OOperandResultBOOL(operate(pOperand))); + if (IS_TYPE(OOperandResult,pOperand)) + delete pOperand; +} +//------------------------------------------------------------------ +sal_uInt16 OOp_NOT::getRequestedOperands() const +{ + RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "file", "Ocke.Janssen@sun.com", "OOp_NOT::getRequestedOperands" ); + return 1; +} //------------------------------------------------------------------ sal_Bool OOp_AND::operate(const OOperand* pLeft, const OOperand* pRight) const @@ -331,6 +355,7 @@ sal_Bool OOp_COMPARE::operate(const OOperand* pLeft, const OOperand* pRight) con { case DataType::CHAR: case DataType::VARCHAR: + case DataType::LONGVARCHAR: { rtl::OUString sLH = aLH, sRH = aRH; INT32 nRes = rtl_ustr_compareIgnoreAsciiCase_WithLength diff --git a/connectivity/source/drivers/file/fcomp.cxx b/connectivity/source/drivers/file/fcomp.cxx index de243f83c71c..9c801d6d9b98 100644 --- a/connectivity/source/drivers/file/fcomp.cxx +++ b/connectivity/source/drivers/file/fcomp.cxx @@ -166,7 +166,7 @@ OOperand* OPredicateCompiler::execute(OSQLParseNode* pPredicateNode) } else if ((SQL_ISRULE(pPredicateNode,search_condition) || (SQL_ISRULE(pPredicateNode,boolean_term))) && // AND/OR-Verknuepfung: - pPredicateNode->count() == 3) + pPredicateNode->count() == 3) { execute(pPredicateNode->getChild(0)); // Bearbeiten des linken Zweigs execute(pPredicateNode->getChild(2)); // Bearbeiten des rechten Zweigs @@ -183,6 +183,11 @@ OOperand* OPredicateCompiler::execute(OSQLParseNode* pPredicateNode) DBG_ERROR("OPredicateCompiler: Fehler im Parse Tree"); } } + else if (SQL_ISRULE(pPredicateNode,boolean_factor)) + { + execute(pPredicateNode->getChild(1)); + m_aCodeList.push_back(new OOp_NOT()); + } else if (SQL_ISRULE(pPredicateNode,comparison_predicate)) { execute_COMPARE(pPredicateNode); diff --git a/connectivity/source/drivers/file/quotedstring.cxx b/connectivity/source/drivers/file/quotedstring.cxx index 5cf56aec9375..abd2d3b51e44 100644 --- a/connectivity/source/drivers/file/quotedstring.cxx +++ b/connectivity/source/drivers/file/quotedstring.cxx @@ -113,7 +113,7 @@ namespace connectivity if ( nStartPos >= nLen ) return; - sal_Unicode* pData = _rStr.AllocBuffer(nLen - nStartPos); + sal_Unicode* pData = _rStr.AllocBuffer( nLen - nStartPos + 1 ); const sal_Unicode* pStart = pData; // Suche bis Stringende nach dem ersten nicht uebereinstimmenden Zeichen for( xub_StrLen i = nStartPos; i < nLen; ++i ) @@ -135,6 +135,7 @@ namespace connectivity { // String-Ende bInString = FALSE; + *pData = 0; } } else @@ -151,6 +152,7 @@ namespace connectivity // Vorzeitiger Abbruch der Schleife moeglich, denn // wir haben, was wir wollten. nStartPos = i+1; + *pData = 0; break; } else diff --git a/connectivity/source/drivers/flat/ETable.cxx b/connectivity/source/drivers/flat/ETable.cxx index b91bee0917f6..fa4f281ea794 100644 --- a/connectivity/source/drivers/flat/ETable.cxx +++ b/connectivity/source/drivers/flat/ETable.cxx @@ -180,13 +180,15 @@ void OFlatTable::fillColumns(const ::com::sun::star::lang::Locale& _aLocale) { bNumeric = TRUE; xub_StrLen nDot = 0; + xub_StrLen nDecimalDelCount = 0; for (xub_StrLen j = 0; j < aField2.Len(); j++) { const sal_Unicode c = aField2.GetChar(j); // nur Ziffern und Dezimalpunkt und Tausender-Trennzeichen? - if ((!cDecimalDelimiter || c != cDecimalDelimiter) && - (!cThousandDelimiter || c != cThousandDelimiter) && - !aCharClass.isDigit(aField2,j)) + if ( ( !cDecimalDelimiter || c != cDecimalDelimiter ) && + ( !cThousandDelimiter || c != cThousandDelimiter ) && + !aCharClass.isDigit(aField2,j) && + ( j != 0 || (c != '+' && c != '-' ) ) ) { bNumeric = FALSE; break; @@ -195,11 +197,13 @@ void OFlatTable::fillColumns(const ::com::sun::star::lang::Locale& _aLocale) { nPrecision = 15; // we have an decimal value nScale = 2; - nDot++; - } + ++nDecimalDelCount; + } // if (cDecimalDelimiter && c == cDecimalDelimiter) + if ( c == '.' ) + ++nDot; } - if (nDot > 1) // if there is more than one dot it isn't a number + if (nDecimalDelCount > 1 || nDot > 1 ) // if there is more than one dot it isn't a number bNumeric = FALSE; if (bNumeric && cThousandDelimiter) { @@ -656,7 +660,10 @@ sal_Bool OFlatTable::fetchRow(OValueRefRow& _rRow,const OSQLColumns & _rCols,sal } return sal_True; } - +void OFlatTable::refreshHeader() +{ + m_nRowPos = 0; +} // ----------------------------------------------------------------------------- sal_Bool OFlatTable::seekRow(IResultSetHelper::Movement eCursorPosition, sal_Int32 nOffset, sal_Int32& nCurPos) { @@ -688,7 +695,7 @@ sal_Bool OFlatTable::seekRow(IResultSetHelper::Movement eCursorPosition, sal_Int m_pFileStream->Seek(m_nFilePos); if ( m_pFileStream->IsEof() || !readLine(nCurPos) /*|| !checkHeaderLine()*/) { - m_nMaxRowCount = m_nRowPos; + m_nMaxRowCount = m_nRowPos -1; return sal_False; } // if ( m_pFileStream->IsEof() || !readLine(nCurPos) /*|| !checkHeaderLine()*/) @@ -793,7 +800,10 @@ sal_Bool OFlatTable::seekRow(IResultSetHelper::Movement eCursorPosition, sal_Int TRowPositionsInFile::const_iterator aFind = m_aFilePosToEndLinePos.find(nOffset); m_bNeedToReadLine = aFind != m_aFilePosToEndLinePos.end(); if ( m_bNeedToReadLine ) + { + m_nFilePos = aFind->first; nCurPos = aFind->second; + } else { m_nFilePos = nOffset; diff --git a/connectivity/source/drivers/flat/flat.xcu b/connectivity/source/drivers/flat/flat.xcu new file mode 100644 index 000000000000..953d1179aa64 --- /dev/null +++ b/connectivity/source/drivers/flat/flat.xcu @@ -0,0 +1,113 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!--*********************************************************************** + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: DataAccess.xcu,v $ + * $Revision: 1.27 $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************ --> +<oor:component-data oor:name="Drivers" oor:package="org.openoffice.Office.DataAccess" xmlns:oor="http://openoffice.org/2001/registry" xmlns:xs="http://www.w3.org/2001/XMLSchema"> + <node oor:name="Installed"> + <node oor:name="sdbc:flat:*" oor:op="replace"> + <prop oor:name="Driver"> + <value>com.sun.star.comp.sdbc.flat.ODriver</value> + </prop> + <prop oor:name="DriverTypeDisplayName" oor:type="xs:string"> + <value xml:lang="en-US">Text</value> + </prop> + <node oor:name="Properties"> + <node oor:name="CharSet" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:string"> + <value></value> + </prop> + </node> + <node oor:name="Extension" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:string"> + <value></value> + </prop> + </node> + <node oor:name="HeaderLine" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:boolean"> + <value>true</value> + </prop> + </node> + <node oor:name="FieldDelimiter" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:string"> + <value>,</value> + </prop> + </node> + <node oor:name="StringDelimiter" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:string"> + <value>"</value> + </prop> + </node> + <node oor:name="DecimalDelimiter" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:string"> + <value>.</value> + </prop> + </node> + <node oor:name="ThousandDelimiter" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:string"> + <value></value> + </prop> + </node> + <node oor:name="EnableSQL92Check" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:boolean"> + <value>false</value> + </prop> + </node> + </node> + <node oor:name="Features"> + <node oor:name="UseSQL92NamingConstraints" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:boolean"> + <value>true</value> + </prop> + </node> + <node oor:name="EscapeDateTime" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:boolean"> + <value>true</value> + </prop> + </node> + </node> + <node oor:name="MetaData"> + <node oor:name="SupportsBrowsing" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:boolean"> + <value>true</value> + </prop> + </node> + <node oor:name="FileSystemBased" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:boolean"> + <value>true</value> + </prop> + </node> + <node oor:name="MediaType" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:string"> + <value>text/csv</value> + </prop> + </node> + </node> + </node> + </node> +</oor:component-data> diff --git a/connectivity/source/drivers/flat/makefile.mk b/connectivity/source/drivers/flat/makefile.mk index 0cc44de7c55e..d044eab2796a 100644 --- a/connectivity/source/drivers/flat/makefile.mk +++ b/connectivity/source/drivers/flat/makefile.mk @@ -41,7 +41,7 @@ VISIBILITY_HIDDEN=TRUE ENVCFLAGS+=/FR$(SLO)$/ .ENDIF -.INCLUDE : settings.mk +.INCLUDE : $(PRJ)$/makefile.pmk .INCLUDE : $(PRJ)$/version.mk @@ -106,6 +106,6 @@ DEF1EXPORTFILE= exports.dxp # --- Targets ---------------------------------- -.INCLUDE : target.mk +.INCLUDE : $(PRJ)$/target.pmk diff --git a/connectivity/source/drivers/hsqldb/hsqldb.xcu b/connectivity/source/drivers/hsqldb/hsqldb.xcu new file mode 100644 index 000000000000..8fbee4f4c00a --- /dev/null +++ b/connectivity/source/drivers/hsqldb/hsqldb.xcu @@ -0,0 +1,76 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!--*********************************************************************** + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: DataAccess.xcu,v $ + * $Revision: 1.27 $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************ --> +<oor:component-data oor:name="Drivers" oor:package="org.openoffice.Office.DataAccess" xmlns:oor="http://openoffice.org/2001/registry" xmlns:xs="http://www.w3.org/2001/XMLSchema"> + <node oor:name="Installed"> + <node oor:name="sdbc:embedded:hsqldb" oor:op="replace"> + <prop oor:name="Driver"> + <value>com.sun.star.sdbcx.comp.hsqldb.Driver</value> + </prop> + <prop oor:name="DriverTypeDisplayName" oor:type="xs:string"> + <value xml:lang="en-US">HSQL database engine</value> + </prop> + <node oor:name="Features"> + <node oor:name="UseDOSLineEnds" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:boolean"> + <value>true</value> + </prop> + </node> + <node oor:name="FormsCheckRequiredFields" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:boolean"> + <value>true</value> + </prop> + </node> + <node oor:name="EscapeDateTime" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:boolean"> + <value>true</value> + </prop> + </node> + </node> + <node oor:name="MetaData"> + <node oor:name="SupportsTableCreation" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:boolean"> + <value>true</value> + </prop> + </node> + <node oor:name="UseJava" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:boolean"> + <value>true</value> + </prop> + </node> + <node oor:name="AutoIncrementIsPrimaryKey" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:boolean"> + <value>true</value> + </prop> + </node> + </node> + </node> + </node> +</oor:component-data> diff --git a/connectivity/source/drivers/hsqldb/makefile.mk b/connectivity/source/drivers/hsqldb/makefile.mk index a97365a4d835..9ed5acb17d4c 100644 --- a/connectivity/source/drivers/hsqldb/makefile.mk +++ b/connectivity/source/drivers/hsqldb/makefile.mk @@ -39,7 +39,7 @@ VISIBILITY_HIDDEN=TRUE USE_DEFFILE=TRUE # --- Settings ---------------------------------- -.INCLUDE : settings.mk +.INCLUDE : $(PRJ)$/makefile.pmk .INCLUDE : $(PRJ)$/version.mk .IF "$(SOLAR_JAVA)"=="" @@ -115,6 +115,6 @@ DEF1EXPORTFILE= exports.dxp # --- Targets ---------------------------------- -.INCLUDE : target.mk +.INCLUDE : $(PRJ)$/target.pmk diff --git a/connectivity/source/drivers/jdbc/DatabaseMetaData.cxx b/connectivity/source/drivers/jdbc/DatabaseMetaData.cxx index 11863be3b8bf..b0341a3fd564 100644 --- a/connectivity/source/drivers/jdbc/DatabaseMetaData.cxx +++ b/connectivity/source/drivers/jdbc/DatabaseMetaData.cxx @@ -616,7 +616,8 @@ Reference< XResultSet > java_sql_DatabaseMetaData::impl_callResultSetMethodWithS const ::rtl::OUString* _pOptionalAdditionalString ) { bool bCatalog = _rCatalog.hasValue(); - ::rtl::OUString sCatalog( ::comphelper::getString( _rCatalog ) ); + ::rtl::OUString sCatalog; + _rCatalog >>= sCatalog; bool bSchema = _rSchemaPattern.toChar() != '%'; diff --git a/connectivity/source/drivers/jdbc/ResultSet.cxx b/connectivity/source/drivers/jdbc/ResultSet.cxx index e78488ffbba3..4728586ad4d0 100644 --- a/connectivity/source/drivers/jdbc/ResultSet.cxx +++ b/connectivity/source/drivers/jdbc/ResultSet.cxx @@ -261,7 +261,7 @@ sal_Int64 SAL_CALL java_sql_ResultSet::getLong( sal_Int32 columnIndex ) throw(SQ RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "jdbc", "Ocke.Janssen@sun.com", "java_sql_ResultSet::getLong" ); static jmethodID mID(NULL); jlong (JNIEnv::*pCallMethod)( jobject obj, jmethodID methodID, ... ) = &JNIEnv::CallLongMethod; - return callMethodWithIntArg<jlong>(pCallMethod,"getLong","(I)L",mID,columnIndex); + return callMethodWithIntArg<jlong>(pCallMethod,"getLong","(I)J",mID,columnIndex); } // ------------------------------------------------------------------------- diff --git a/connectivity/source/drivers/jdbc/jdbc.xcu b/connectivity/source/drivers/jdbc/jdbc.xcu new file mode 100644 index 000000000000..73fe2e9adc55 --- /dev/null +++ b/connectivity/source/drivers/jdbc/jdbc.xcu @@ -0,0 +1,207 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!--*********************************************************************** + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: DataAccess.xcu,v $ + * $Revision: 1.27 $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************ --> +<oor:component-data oor:name="Drivers" oor:package="org.openoffice.Office.DataAccess" xmlns:oor="http://openoffice.org/2001/registry" xmlns:xs="http://www.w3.org/2001/XMLSchema"> + <node oor:name="Installed"> + <node oor:name="jdbc:*" oor:op="replace"> + <prop oor:name="Driver"> + <value>com.sun.star.comp.sdbc.JDBCDriver</value> + </prop> + <prop oor:name="DriverTypeDisplayName" oor:type="xs:string"> + <value xml:lang="en-US">JDBC</value> + </prop> + <node oor:name="Properties"> + <node oor:name="JavaDriverClass" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:string"> + <value></value> + </prop> + </node> + <node oor:name="JavaDriverClassPath" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:string"> + <value></value> + </prop> + </node> + <node oor:name="AutoIncrementCreation" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:string"> + <value></value> + </prop> + </node> + <node oor:name="AutoRetrievingStatement" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:string"> + <value></value> + </prop> + </node> + <node oor:name="IsAutoRetrievingEnabled" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:boolean"> + <value>false</value> + </prop> + </node> + <node oor:name="AddIndexAppendix" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:boolean"> + <value>true</value> + </prop> + </node> + </node> + <node oor:name="Features"> + <node oor:name="GeneratedValues" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:boolean"> + <value>true</value> + </prop> + </node> + <node oor:name="UseSQL92NamingConstraints" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:boolean"> + <value>true</value> + </prop> + </node> + <node oor:name="AppendTableAliasInSelect" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:boolean"> + <value>true</value> + </prop> + </node> + <node oor:name="UseKeywordAsBeforeAlias" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:boolean"> + <value>true</value> + </prop> + </node> + <node oor:name="UseBracketedOuterJoinSyntax" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:boolean"> + <value>true</value> + </prop> + </node> + <node oor:name="IgnoreDriverPrivileges" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:boolean"> + <value>true</value> + </prop> + </node> + <node oor:name="ParameterNameSubstitution" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:boolean"> + <value>true</value> + </prop> + </node> + <node oor:name="DisplayVersionColumns" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:boolean"> + <value>true</value> + </prop> + </node> + <node oor:name="UseCatalogInSelect" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:boolean"> + <value>true</value> + </prop> + </node> + <node oor:name="UseSchemaInSelect" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:boolean"> + <value>true</value> + </prop> + </node> + <node oor:name="UseIndexDirectionKeyword" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:boolean"> + <value>true</value> + </prop> + </node> + <node oor:name="UseDOSLineEnds" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:boolean"> + <value>true</value> + </prop> + </node> + <node oor:name="BooleanComparisonMode" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:boolean"> + <value>true</value> + </prop> + </node> + <node oor:name="FormsCheckRequiredFields" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:boolean"> + <value>true</value> + </prop> + </node> + <node oor:name="EscapeDateTime" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:boolean"> + <value>true</value> + </prop> + </node> + </node> + <node oor:name="MetaData"> + <node oor:name="SupportsTableCreation" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:boolean"> + <value>true</value> + </prop> + </node> + <node oor:name="UseJava" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:boolean"> + <value>true</value> + </prop> + </node> + <node oor:name="Authentication" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:string"> + <value>UserPassword</value> + </prop> + </node> + </node> + </node> + <node oor:name="jdbc:oracle:thin:*" oor:op="replace"> + <prop oor:name="ParentURLPattern"> + <value>jdbc:*</value> + </prop> + <prop oor:name="DriverTypeDisplayName" oor:type="xs:string"> + <value xml:lang="en-US">Oracle JDBC</value> + </prop> + <node oor:name="Properties"> + <node oor:name="IgnoreCurrency" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:boolean"> + <value>false</value> + </prop> + </node> + <node oor:name="TypeInfoSettings" oor:op="replace"> + <prop oor:name="Value" oor:type="oor:string-list"> + <value oor:separator=",">Column(2) = -5,Column(6) = PRECISION,Column(2) = -4,Column(6) = PRECISION,Column(2) = -3,Column(6) = PRECISION,Column(2) = -2,Column(6) = PRECISION,Column(2) = -1,Column(6) = PRECISION,Column(2) = -1,Column(6) = PRECISION,Column(2) = 2,Column(6) = PRECISION,Column(2) = 12,Column(6) = PRECISION</value> + </prop> + </node> + <node oor:name="JavaDriverClass" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:string"> + <value>oracle.jdbc.driver.OracleDriver</value> + </prop> + </node> + </node> + <node oor:name="Features"> + <node oor:name="IgnoreCurrency" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:boolean"> + <value>true</value> + </prop> + </node> + </node> + <node oor:name="MetaData"> + <node oor:name="Authentication" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:string"> + <value>UserPassword</value> + </prop> + </node> + </node> + </node> + </node> +</oor:component-data> diff --git a/connectivity/source/drivers/jdbc/makefile.mk b/connectivity/source/drivers/jdbc/makefile.mk index b8d6a54dd065..831a6755af91 100644 --- a/connectivity/source/drivers/jdbc/makefile.mk +++ b/connectivity/source/drivers/jdbc/makefile.mk @@ -42,7 +42,7 @@ VISIBILITY_HIDDEN=TRUE ENVCFLAGS+=/FR$(SLO)$/ .ENDIF -.INCLUDE : settings.mk +.INCLUDE : $(PRJ)$/makefile.pmk .INCLUDE : $(PRJ)$/version.mk @@ -110,6 +110,6 @@ DEF1EXPORTFILE= exports.dxp # --- Targets ---------------------------------- -.INCLUDE : target.mk +.INCLUDE : $(PRJ)$/target.pmk diff --git a/connectivity/source/drivers/jdbc/tools.cxx b/connectivity/source/drivers/jdbc/tools.cxx index 6f50a6b1affd..daaed46acdd9 100644 --- a/connectivity/source/drivers/jdbc/tools.cxx +++ b/connectivity/source/drivers/jdbc/tools.cxx @@ -150,6 +150,9 @@ java_util_Properties* connectivity::createStringPropertyArray(const Sequence< Pr && pBegin->Name.compareToAscii( "IgnoreDriverPrivileges" ) && pBegin->Name.compareToAscii( "ImplicitCatalogRestriction" ) && pBegin->Name.compareToAscii( "ImplicitSchemaRestriction" ) + && pBegin->Name.compareToAscii( "SupportsTableCreation" ) + && pBegin->Name.compareToAscii( "UseJava" ) + && pBegin->Name.compareToAscii( "Authentication" ) ) { ::rtl::OUString aStr; diff --git a/connectivity/source/drivers/kab/kab.xcu b/connectivity/source/drivers/kab/kab.xcu new file mode 100644 index 000000000000..cc8e6b5329b5 --- /dev/null +++ b/connectivity/source/drivers/kab/kab.xcu @@ -0,0 +1,49 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!--*********************************************************************** + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: DataAccess.xcu,v $ + * $Revision: 1.27 $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************ --> +<oor:component-data oor:name="Drivers" oor:package="org.openoffice.Office.DataAccess" xmlns:oor="http://openoffice.org/2001/registry" xmlns:xs="http://www.w3.org/2001/XMLSchema"> + <node oor:name="Installed"> + <node oor:name="sdbc:address:kab" oor:op="replace"> + <prop oor:name="Driver"> + <value>com.sun.star.comp.sdbc.kab.Driver</value> + </prop> + <prop oor:name="DriverTypeDisplayName" oor:type="xs:string"> + <value xml:lang="en-US">KDE Address Book</value> + </prop> + <node oor:name="Features"> + <node oor:name="EscapeDateTime" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:boolean"> + <value>true</value> + </prop> + </node> + </node> + </node> + </node> +</oor:component-data> diff --git a/connectivity/source/drivers/kab/makefile.mk b/connectivity/source/drivers/kab/makefile.mk index 4ee330345625..2c0a86f8562b 100644 --- a/connectivity/source/drivers/kab/makefile.mk +++ b/connectivity/source/drivers/kab/makefile.mk @@ -40,7 +40,7 @@ VISIBILITY_HIDDEN=TRUE # --- Settings ---------------------------------- -.INCLUDE : settings.mk +.INCLUDE : $(PRJ)$/makefile.pmk .INCLUDE : $(PRJ)$/version.mk .IF "$(GUI)" == "UNX" @@ -137,5 +137,5 @@ dummy: @echo "Nothing to build for GUI $(GUI)" .ENDIF -.INCLUDE : target.mk +.INCLUDE : $(PRJ)$/target.pmk diff --git a/connectivity/source/drivers/macab/macab.xcu b/connectivity/source/drivers/macab/macab.xcu new file mode 100644 index 000000000000..3818c7db882b --- /dev/null +++ b/connectivity/source/drivers/macab/macab.xcu @@ -0,0 +1,49 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!--*********************************************************************** + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: DataAccess.xcu,v $ + * $Revision: 1.27 $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************ --> +<oor:component-data oor:name="Drivers" oor:package="org.openoffice.Office.DataAccess" xmlns:oor="http://openoffice.org/2001/registry" xmlns:xs="http://www.w3.org/2001/XMLSchema"> + <node oor:name="Installed"> + <node oor:name="sdbc:address:macab:*" oor:op="replace"> + <prop oor:name="Driver"> + <value>com.sun.star.comp.sdbc.macab.Driver</value> + </prop> + <prop oor:name="DriverTypeDisplayName" oor:type="xs:string"> + <value xml:lang="en-US">Mac OS X Address Book</value> + </prop> + <node oor:name="Features"> + <node oor:name="EscapeDateTime" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:boolean"> + <value>true</value> + </prop> + </node> + </node> + </node> + </node> +</oor:component-data> diff --git a/connectivity/source/drivers/macab/makefile.mk b/connectivity/source/drivers/macab/makefile.mk index 67f40f2d45cf..8edc8951fa95 100755 --- a/connectivity/source/drivers/macab/makefile.mk +++ b/connectivity/source/drivers/macab/makefile.mk @@ -39,7 +39,7 @@ ENABLE_EXCEPTIONS=TRUE # --- Settings ---------------------------------- -.INCLUDE : settings.mk +.INCLUDE : $(PRJ)$/makefile.pmk .INCLUDE : $(PRJ)$/version.mk .IF "$(GUI)" == "UNX" @@ -133,5 +133,5 @@ dummy: @echo "Nothing to build for GUI $(GUI)" .ENDIF -.INCLUDE : target.mk +.INCLUDE : $(PRJ)$/target.pmk diff --git a/connectivity/source/drivers/mozab/MColumnAlias.cxx b/connectivity/source/drivers/mozab/MColumnAlias.cxx index 8055e25585bc..79fa31551701 100644 --- a/connectivity/source/drivers/mozab/MColumnAlias.cxx +++ b/connectivity/source/drivers/mozab/MColumnAlias.cxx @@ -32,12 +32,15 @@ #include "precompiled_connectivity.hxx" #include "MColumnAlias.hxx" #include "MConnection.hxx" +#include "MExtConfigAccess.hxx" + #include <com/sun/star/beans/XPropertySet.hpp> #include <com/sun/star/container/XNameAccess.hpp> -#ifndef CONNECTIVITY_MOZAB_MEXTCONFIGACCESS_HXX -#include "MExtConfigAccess.hxx" -#endif +#include <tools/diagnose_ex.h> + +#include <algorithm> +#include <functional> using namespace ::connectivity; using namespace ::connectivity::mozab; @@ -46,56 +49,57 @@ using namespace ::com::sun::star::lang; using namespace ::com::sun::star::beans; using namespace ::com::sun::star::container; -static const ::rtl::OUString sProgrammaticNames[] = -{ - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("FirstName")), - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("LastName")), - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("DisplayName")), - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("NickName")), - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("PrimaryEmail")), - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("SecondEmail")), - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("PreferMailFormat")), - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("WorkPhone")), - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("HomePhone")), - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("FaxNumber")), - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("PagerNumber")), - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("CellularNumber")), - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("HomeAddress")), - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("HomeAddress2")), - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("HomeCity")), - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("HomeState")), - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("HomeZipCode")), - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("HomeCountry")), - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("WorkAddress")), - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("WorkAddress2")), - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("WorkCity")), - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("WorkState")), - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("WorkZipCode")), - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("WorkCountry")), - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("JobTitle")), - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("Department")), - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("Company")), - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("WebPage1")), - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("WebPage2")), - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("BirthYear")), - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("BirthMonth")), - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("BirthDay")), - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("Custom1")), - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("Custom2")), - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("Custom3")), - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("Custom4")), - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("Notes")) -}; //------------------------------------------------------------------------------ OColumnAlias::OColumnAlias( const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& _rxORB ) { - for ( size_t i = 0; i < END - BEGIN; ++i ) - m_aAliasMap[ sProgrammaticNames[i] ] = AliasDescription( sProgrammaticNames[i], static_cast< ProgrammaticName>( i ) ); + static const sal_Char* s_pProgrammaticNames[] = + { + "FirstName", + "LastName", + "DisplayName", + "NickName", + "PrimaryEmail", + "SecondEmail", + "PreferMailFormat", + "WorkPhone", + "HomePhone", + "FaxNumber", + "PagerNumber", + "CellularNumber", + "HomeAddress", + "HomeAddress2", + "HomeCity", + "HomeState", + "HomeZipCode", + "HomeCountry", + "WorkAddress", + "WorkAddress2", + "WorkCity", + "WorkState", + "WorkZipCode", + "WorkCountry", + "JobTitle", + "Department", + "Company", + "WebPage1", + "WebPage2", + "BirthYear", + "BirthMonth", + "BirthDay", + "Custom1", + "Custom2", + "Custom3", + "Custom4", + "Notes", + }; + + for ( size_t i = 0; i < sizeof( s_pProgrammaticNames ) / sizeof( s_pProgrammaticNames[0] ); ++i ) + m_aAliasMap[ ::rtl::OUString::createFromAscii( s_pProgrammaticNames[i] ) ] = AliasEntry( s_pProgrammaticNames[i], i ); initialize( _rxORB ); } -//------------------------------------------------------------------ +//------------------------------------------------------------------------------ void OColumnAlias::initialize( const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& _rxORB ) { // open our driver settings config node @@ -112,34 +116,26 @@ void OColumnAlias::initialize( const ::com::sun::star::uno::Reference< ::com::su OSL_ENSURE( xAliasesNode.is(), "OColumnAlias::setAlias: missing the aliases node!" ); // this is a set of string nodes - Sequence< ::rtl::OUString > aColumnProgrammaticNames; + Sequence< ::rtl::OUString > aProgrammaticNames; if ( xAliasesNode.is() ) - aColumnProgrammaticNames = xAliasesNode->getElementNames(); + aProgrammaticNames = xAliasesNode->getElementNames(); //............................................................. // travel through all the set elements - const ::rtl::OUString* pProgrammaticNames = aColumnProgrammaticNames.getConstArray(); - const ::rtl::OUString* pProgrammaticNamesEnd = pProgrammaticNames + aColumnProgrammaticNames.getLength(); + const ::rtl::OUString* pProgrammaticNames = aProgrammaticNames.getConstArray(); + const ::rtl::OUString* pProgrammaticNamesEnd = pProgrammaticNames + aProgrammaticNames.getLength(); ::rtl::OUString sAssignedAlias; for ( ; pProgrammaticNames < pProgrammaticNamesEnd; ++pProgrammaticNames ) { - OSL_ENSURE( m_aAliasMap.end() != m_aAliasMap.find( *pProgrammaticNames ), - "OColumnAlias::setAlias: found an invalid programmtic name!" ); - // if this asserts, somebody stored a programmatic name in the configuration - // which is not allowed (i.e. not in the list of known programmatics). - -#if OSL_DEBUG_LEVEL > 0 - sal_Bool bExtractionSuccess = -#endif - xAliasesNode->getByName( *pProgrammaticNames) >>= sAssignedAlias; - OSL_ENSURE( bExtractionSuccess, "OColumnAlias::setAlias: invalid config data!" ); + OSL_VERIFY( xAliasesNode->getByName( *pProgrammaticNames ) >>= sAssignedAlias ); // normalize in case the config data is corrupted // (what we really don't need is an empty alias ...) if ( 0 == sAssignedAlias.getLength() ) sAssignedAlias = *pProgrammaticNames; + ::rtl::OString sAsciiProgrammaticName( ::rtl::OUStringToOString( *pProgrammaticNames, RTL_TEXTENCODING_ASCII_US ) ); //............................................................. #if OSL_DEBUG_LEVEL > 0 bool bFound = false; @@ -149,15 +145,11 @@ void OColumnAlias::initialize( const ::com::sun::star::uno::Reference< ::com::su ++search ) { - if ( search->second.sProgrammaticName == *pProgrammaticNames ) + if ( search->second.programmaticAsciiName.equals( sAsciiProgrammaticName ) ) { - AliasDescription aDescription( search->second ); - - // delete this old entry for this programmatic name + AliasEntry entry( search->second ); m_aAliasMap.erase( search ); - - // insert the same AliasDescription under a new name - its alias - m_aAliasMap[ sAssignedAlias ] = aDescription; + m_aAliasMap[ sAssignedAlias ] = entry; #if OSL_DEBUG_LEVEL > 0 bFound = true; @@ -172,29 +164,31 @@ void OColumnAlias::initialize( const ::com::sun::star::uno::Reference< ::com::su } catch( const Exception& ) { - OSL_ENSURE( sal_False, "OColumnAlias::setAlias: could not read my driver's configuration data!" ); + DBG_UNHANDLED_EXCEPTION(); } } } //------------------------------------------------------------------ -OColumnAlias::ProgrammaticName OColumnAlias::getProgrammaticNameIndex( const ::rtl::OUString& _rAliasName ) const +::rtl::OString OColumnAlias::getProgrammaticNameOrFallbackToUTF8Alias( const ::rtl::OUString& _rAlias ) const { - AliasMap::const_iterator pos = m_aAliasMap.find( _rAliasName ); + AliasMap::const_iterator pos = m_aAliasMap.find( _rAlias ); if ( pos == m_aAliasMap.end() ) { - OSL_ENSURE( false, "OColumnAlias::getProgrammaticNameIndex: unknown column alias!" ); - return END; + OSL_ENSURE( false, "OColumnAlias::getProgrammaticNameOrFallbackToUTF8Alias: no programmatic name for this alias!" ); + return ::rtl::OUStringToOString( _rAlias, RTL_TEXTENCODING_UTF8 ); } - - return pos->second.eProgrammaticNameIndex; + return pos->second.programmaticAsciiName; } //------------------------------------------------------------------ -::rtl::OUString OColumnAlias::getProgrammaticNameOrFallbackToAlias( const ::rtl::OUString& _rAlias ) const +bool OColumnAlias::isColumnSearchable( const ::rtl::OUString _alias ) const { - AliasMap::const_iterator pos = m_aAliasMap.find( _rAlias ); - if ( pos == m_aAliasMap.end() ) - return _rAlias; - return pos->second.sProgrammaticName; + ::rtl::OString sProgrammatic = getProgrammaticNameOrFallbackToUTF8Alias( _alias ); + + return ( !sProgrammatic.equals( "HomeCountry" ) + && !sProgrammatic.equals( "WorkCountry" ) + ); + // for those, we know that they're not searchable in the Mozilla/LDAP implementation. + // There might be more ... } diff --git a/connectivity/source/drivers/mozab/MColumnAlias.hxx b/connectivity/source/drivers/mozab/MColumnAlias.hxx index f19273be8ae4..64c9e3b3561b 100644 --- a/connectivity/source/drivers/mozab/MColumnAlias.hxx +++ b/connectivity/source/drivers/mozab/MColumnAlias.hxx @@ -36,7 +36,7 @@ #include <osl/mutex.hxx> #include <vector> -#include <map> +#include <hash_map> namespace connectivity { @@ -45,88 +45,41 @@ namespace connectivity class OColumnAlias { public: - typedef enum { - BEGIN = 0, - - FIRSTNAME = BEGIN, - LASTNAME, - DISPLAYNAME, - NICKNAME, - PRIMARYEMAIL, - SECONDEMAIL, - PREFERMAILFORMAT, - WORKPHONE, - HOMEPHONE, - FAXNUMBER, - PAGERNUMBER, - CELLULARNUMBER, - HOMEADDRESS, - HOMEADDRESS2, - HOMECITY, - HOMESTATE, - HOMEZIPCODE, - HOMECOUNTRY, - WORKADDRESS, - WORKADDRESS2, - WORKCITY, - WORKSTATE, - WORKZIPCODE, - WORKCOUNTRY, - JOBTITLE, - DEPARTMENT, - COMPANY, - WEBPAGE1, - WEBPAGE2, - BIRTHYEAR, - BIRTHMONTH, - BIRTHDAY, - CUSTOM1, - CUSTOM2, - CUSTOM3, - CUSTOM4, - NOTES, - - END - } ProgrammaticName; - - struct AliasDescription + struct AliasEntry { - ::rtl::OUString sProgrammaticName; - ProgrammaticName eProgrammaticNameIndex; + ::rtl::OString programmaticAsciiName; + sal_Int32 columnPosition; - AliasDescription() - :eProgrammaticNameIndex( END ) + AliasEntry() + :programmaticAsciiName() + ,columnPosition( 0 ) { } - - AliasDescription( const ::rtl::OUString& _rName, ProgrammaticName _eIndex ) - :sProgrammaticName( _rName ), eProgrammaticNameIndex( _eIndex ) + AliasEntry( const sal_Char* _programmaticAsciiName, sal_Int32 _columnPosition ) + :programmaticAsciiName( _programmaticAsciiName ) + ,columnPosition( _columnPosition ) { } }; - - typedef ::std::map< ::rtl::OUString, AliasDescription > AliasMap; + typedef ::std::hash_map< ::rtl::OUString, AliasEntry, ::rtl::OUStringHash > AliasMap; private: AliasMap m_aAliasMap; - protected: - ::osl::Mutex m_aMutex; - public: - OColumnAlias( - const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory > & ); + OColumnAlias( const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory > & ); - ProgrammaticName getProgrammaticNameIndex( const ::rtl::OUString& _rAliasName ) const; inline bool hasAlias( const ::rtl::OUString& _rAlias ) const { return m_aAliasMap.find( _rAlias ) != m_aAliasMap.end(); } - ::rtl::OUString getProgrammaticNameOrFallbackToAlias( const ::rtl::OUString& _rAlias ) const; + ::rtl::OString getProgrammaticNameOrFallbackToUTF8Alias( const ::rtl::OUString& _rAlias ) const; inline AliasMap::const_iterator begin() const { return m_aAliasMap.begin(); } inline AliasMap::const_iterator end() const { return m_aAliasMap.end(); } + bool isColumnSearchable( const ::rtl::OUString _alias ) const; + private: void initialize( const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& _rxORB ); }; diff --git a/connectivity/source/drivers/mozab/MConnection.cxx b/connectivity/source/drivers/mozab/MConnection.cxx index 6fc45d4ed07f..80da4df794fc 100644 --- a/connectivity/source/drivers/mozab/MConnection.cxx +++ b/connectivity/source/drivers/mozab/MConnection.cxx @@ -378,8 +378,7 @@ Reference< XPreparedStatement > SAL_CALL OConnection::prepareStatement( const :: // the statement can only be executed more than once OPreparedStatement* pPrepared = new OPreparedStatement(this,_sSql); Reference< XPreparedStatement > xReturn = pPrepared; - if ( !pPrepared->lateInit() ) - throw SQLException(); + pPrepared->lateInit(); m_aStatements.push_back(WeakReferenceHelper(xReturn)); return xReturn; diff --git a/connectivity/source/drivers/mozab/MConnection.hxx b/connectivity/source/drivers/mozab/MConnection.hxx index 741bd9ef20e1..d29a36f60a14 100644 --- a/connectivity/source/drivers/mozab/MConnection.hxx +++ b/connectivity/source/drivers/mozab/MConnection.hxx @@ -51,7 +51,6 @@ namespace connectivity namespace mozab { - class OStatement_Base; class MozabDriver; class ODatabaseMetaData; class MNameMapper; diff --git a/connectivity/source/drivers/mozab/MDatabaseMetaData.cxx b/connectivity/source/drivers/mozab/MDatabaseMetaData.cxx index 55350e350474..3ba479abc764 100644 --- a/connectivity/source/drivers/mozab/MDatabaseMetaData.cxx +++ b/connectivity/source/drivers/mozab/MDatabaseMetaData.cxx @@ -157,7 +157,7 @@ ODatabaseMetaDataResultSet::ORows& SAL_CALL ODatabaseMetaData::getColumnRows( // COLUMN_NAME aRow[4] = new ORowSetValueDecorator( compare->first ); // ORDINAL_POSITION - aRow[17] = new ORowSetValueDecorator( static_cast< sal_Int32 >( compare->second.eProgrammaticNameIndex ) + 1 ); + aRow[17] = new ORowSetValueDecorator( static_cast< sal_Int32 >( compare->second.columnPosition ) + 1 ); aRows.push_back(aRow); } } diff --git a/connectivity/source/drivers/mozab/MPreparedStatement.cxx b/connectivity/source/drivers/mozab/MPreparedStatement.cxx index 79c58bc6a90c..8cec9c18f635 100644 --- a/connectivity/source/drivers/mozab/MPreparedStatement.cxx +++ b/connectivity/source/drivers/mozab/MPreparedStatement.cxx @@ -67,11 +67,11 @@ IMPLEMENT_SERVICE_INFO(OPreparedStatement,"com.sun.star.sdbcx.mozab.PreparedStat OPreparedStatement::OPreparedStatement( OConnection* _pConnection,const ::rtl::OUString& sql) - :OStatement_BASE2(_pConnection) + :OCommonStatement(_pConnection) ,m_nNumParams(0) ,m_sSqlStatement(sql) ,m_bPrepared(sal_False) - ,m_pResultSet( NULL ) + ,m_pResultSet() { } // ----------------------------------------------------------------------------- @@ -79,21 +79,17 @@ OPreparedStatement::~OPreparedStatement() { } // ----------------------------------------------------------------------------- -sal_Bool OPreparedStatement::lateInit() +void OPreparedStatement::lateInit() { - return parseSql( m_sSqlStatement ); + if ( eSelect != parseSql( m_sSqlStatement ) ) + throw SQLException(); } // ------------------------------------------------------------------------- void SAL_CALL OPreparedStatement::disposing() { ::osl::MutexGuard aGuard(m_aMutex); - if(m_pResultSet) - m_pResultSet->release(); - - clearMyResultSet(); - - OStatement_BASE2::disposing(); + OCommonStatement::disposing(); m_xMetaData = NULL; if(m_aParameterRow.isValid()) @@ -105,63 +101,61 @@ void SAL_CALL OPreparedStatement::disposing() } // ----------------------------------------------------------------------------- -sal_Bool OPreparedStatement::parseSql( const ::rtl::OUString& sql , sal_Bool bAdjusted ) throw ( - ::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException ) +OCommonStatement::StatementType OPreparedStatement::parseSql( const ::rtl::OUString& sql , sal_Bool bAdjusted ) + throw ( ::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException ) { - OSL_TRACE("in :: OPreparedStatement::parseSql()"); - if (!OStatement_Base::parseSql( sql, bAdjusted )) - return sal_False; + StatementType eStatementType = OCommonStatement::parseSql( sql, bAdjusted ); + if ( eStatementType != eSelect ) + return eStatementType; m_xParamColumns = new OSQLColumns(); - Reference<XIndexAccess> xNames(m_xColNames,UNO_QUERY); - // describe all parameters need for the resultset describeParameter(); - OResultSet::setBoundedColumns(m_aRow,m_xParamColumns,xNames,sal_False,m_xDBMetaData,m_aColMapping); + Reference<XIndexAccess> xNames(m_xColNames,UNO_QUERY); + OResultSet::setBoundedColumns( m_aRow, m_xParamColumns, xNames, sal_False, m_xDBMetaData, m_aColMapping ); - m_pResultSet = createResultSet(); - m_pResultSet->acquire(); - m_xResultSet = Reference<XResultSet>(m_pResultSet); - initializeResultSet(m_pResultSet); - OSL_TRACE("Out :: OPreparedStatement::parseSql()"); - return sal_True; + return eStatementType; } // ----------------------------------------------------------------------------- - -OResultSet* OPreparedStatement::createResultSet( ) +void OPreparedStatement::initializeResultSet( OResultSet* _pResult ) { - OSL_TRACE("In/Out : OPreparedStatement::createResultSet( )"); - return new OResultSet( this, m_pSQLIterator ); + OCommonStatement::initializeResultSet( _pResult ); + _pResult->setParameterColumns( m_xParamColumns ); + _pResult->setParameterRow( m_aParameterRow ); } // ----------------------------------------------------------------------------- -void OPreparedStatement::initializeResultSet( OResultSet* _pResult ) +void OPreparedStatement::clearCachedResultSet() { - OSL_TRACE("In : OPreparedStatement::initializeResultSet( )"); - OStatement_Base::initializeResultSet( _pResult ); - - _pResult->setParameterColumns(m_xParamColumns); - _pResult->setParameterRow(m_aParameterRow); - OSL_TRACE("Out : OPreparedStatement::initializeResultSet( )"); + OCommonStatement::clearCachedResultSet(); + m_pResultSet.clear(); + m_xMetaData.clear(); +} +// ----------------------------------------------------------------------------- +void OPreparedStatement::cacheResultSet( const ::rtl::Reference< OResultSet >& _pResult ) +{ + OCommonStatement::cacheResultSet( _pResult ); + OSL_PRECOND( m_pResultSet == NULL, "OPreparedStatement::parseSql: you should call clearCachedResultSet before!" ); + m_pResultSet = _pResult; } // ----------------------------------------------------------------------------- void SAL_CALL OPreparedStatement::acquire() throw() { - OStatement_BASE2::acquire(); + OCommonStatement::acquire(); } // ----------------------------------------------------------------------------- void SAL_CALL OPreparedStatement::release() throw() { - OStatement_BASE2::release(); + OCommonStatement::release(); } // ----------------------------------------------------------------------------- Any SAL_CALL OPreparedStatement::queryInterface( const Type & rType ) throw(RuntimeException) { - Any aRet = OStatement_BASE2::queryInterface(rType); + Any aRet = OCommonStatement::queryInterface(rType); if(!aRet.hasValue()) aRet = OPreparedStatement_BASE::queryInterface(rType); return aRet; @@ -169,61 +163,41 @@ Any SAL_CALL OPreparedStatement::queryInterface( const Type & rType ) throw(Runt // ------------------------------------------------------------------------- ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Type > SAL_CALL OPreparedStatement::getTypes( ) throw(::com::sun::star::uno::RuntimeException) { - return ::comphelper::concatSequences(OPreparedStatement_BASE::getTypes(),OStatement_BASE2::getTypes()); + return ::comphelper::concatSequences(OPreparedStatement_BASE::getTypes(),OCommonStatement::getTypes()); } // ------------------------------------------------------------------------- Reference< XResultSetMetaData > SAL_CALL OPreparedStatement::getMetaData( ) throw(SQLException, RuntimeException) { ::osl::MutexGuard aGuard( m_aMutex ); - checkDisposed(OStatement_BASE::rBHelper.bDisposed); - sal_Bool bReadOnly= sal_True; - if (m_pResultSet) + checkDisposed(OCommonStatement_IBASE::rBHelper.bDisposed); + + sal_Bool bReadOnly = sal_True; + if ( m_pResultSet.is() ) bReadOnly = m_pResultSet->determineReadOnly(); - if(!m_xMetaData.is()) + // if we do not have a result set, then we have not been executed, yet. In this case, assuming readonly=true is + // okay, /me thinks. + + if ( !m_xMetaData.is() ) m_xMetaData = new OResultSetMetaData( m_pSQLIterator->getSelectColumns(), m_pSQLIterator->getTables().begin()->first ,m_pTable,bReadOnly ); + return m_xMetaData; } -// ------------------------------------------------------------------------- - -void SAL_CALL OPreparedStatement::close( ) throw(SQLException, RuntimeException) -{ - ::osl::MutexGuard aGuard( m_aMutex ); - checkDisposed(OStatement_BASE::rBHelper.bDisposed); - - - // Reset last warning message - - try { - clearWarnings (); - clearMyResultSet(); - // OStatement_BASE2::close(); - } - catch (SQLException &) { - // If we get an error, ignore - } - // Remove this Statement object from the Connection object's - // list -} // ------------------------------------------------------------------------- - sal_Bool SAL_CALL OPreparedStatement::execute( ) throw(SQLException, RuntimeException) { ::osl::MutexGuard aGuard( m_aMutex ); - checkDisposed(OStatement_BASE::rBHelper.bDisposed); + checkDisposed(OCommonStatement_IBASE::rBHelper.bDisposed); - - Reference< XResultSet> xRS = OStatement_Base::executeQuery( m_sSqlStatement ); - // same as in statement with the difference that this statement also can contain parameter - - OSL_TRACE("In/Out: OPreparedStatement::execute" ); - return xRS.is(); + Reference< XResultSet> xResult = executeQuery(); + return xResult.is(); } // ------------------------------------------------------------------------- sal_Int32 SAL_CALL OPreparedStatement::executeUpdate( ) throw(SQLException, RuntimeException) { + ::dbtools::throwFeatureNotImplementedException( "XStatement::executeUpdate", *this ); return 0; } // ------------------------------------------------------------------------- @@ -231,7 +205,7 @@ sal_Int32 SAL_CALL OPreparedStatement::executeUpdate( ) throw(SQLException, Run void SAL_CALL OPreparedStatement::setString( sal_Int32 parameterIndex, const ::rtl::OUString& x ) throw(SQLException, RuntimeException) { ::osl::MutexGuard aGuard( m_aMutex ); - checkDisposed(OStatement_BASE::rBHelper.bDisposed); + checkDisposed(OCommonStatement_IBASE::rBHelper.bDisposed); OSL_TRACE("prepStmt::setString( %s )", OUtoCStr( x ) ); setParameter( parameterIndex, x ); @@ -241,7 +215,7 @@ void SAL_CALL OPreparedStatement::setString( sal_Int32 parameterIndex, const ::r Reference< XConnection > SAL_CALL OPreparedStatement::getConnection( ) throw(SQLException, RuntimeException) { ::osl::MutexGuard aGuard( m_aMutex ); - checkDisposed(OStatement_BASE::rBHelper.bDisposed); + checkDisposed(OCommonStatement_IBASE::rBHelper.bDisposed); return (Reference< XConnection >)m_pConnection; } @@ -251,12 +225,11 @@ Reference< XResultSet > SAL_CALL OPreparedStatement::executeQuery( ) throw(SQLE { ::osl::MutexGuard aGuard( m_aMutex ); OSL_TRACE("In: OPreparedStatement::executeQuery" ); - checkDisposed(OStatement_BASE::rBHelper.bDisposed); - - Reference< XResultSet > rs = OStatement_Base::executeQuery( m_sSqlStatement ); + checkDisposed(OCommonStatement_IBASE::rBHelper.bDisposed); - OSL_TRACE("Out: OPreparedStatement::executeQuery" ); - return rs; + // our statement has already been parsed in lateInit, no need to do all this (potentially expensive) + // stuff again. Just execute. + return impl_executeCurrentQuery(); } // ------------------------------------------------------------------------- @@ -318,7 +291,7 @@ void SAL_CALL OPreparedStatement::setLong( sal_Int32 /*parameterIndex*/, sal_Int void SAL_CALL OPreparedStatement::setNull( sal_Int32 parameterIndex, sal_Int32 /*sqlType*/ ) throw(SQLException, RuntimeException) { ::osl::MutexGuard aGuard( m_aMutex ); - checkDisposed(OStatement_BASE::rBHelper.bDisposed); + checkDisposed(OCommonStatement_IBASE::rBHelper.bDisposed); checkAndResizeParameters(parameterIndex); @@ -410,7 +383,7 @@ void OPreparedStatement::setFastPropertyValue_NoBroadcast(sal_Int32 nHandle,cons case PROPERTY_ID_USEBOOKMARKS: break; default: - OStatement_Base::setFastPropertyValue_NoBroadcast(nHandle,rValue); + OCommonStatement::setFastPropertyValue_NoBroadcast(nHandle,rValue); } } // ----------------------------------------------------------------------------- @@ -422,7 +395,7 @@ void OPreparedStatement::checkParameterIndex(sal_Int32 _parameterIndex) // ----------------------------------------------------------------------------- void OPreparedStatement::checkAndResizeParameters(sal_Int32 parameterIndex) { - ::connectivity::checkDisposed(OStatement_BASE::rBHelper.bDisposed); + ::connectivity::checkDisposed(OCommonStatement_IBASE::rBHelper.bDisposed); if ( !m_aParameterRow.isValid() ) { m_aParameterRow = new OValueVector(); diff --git a/connectivity/source/drivers/mozab/MPreparedStatement.hxx b/connectivity/source/drivers/mozab/MPreparedStatement.hxx index 70f6d0060b6e..f2830654fcfe 100644 --- a/connectivity/source/drivers/mozab/MPreparedStatement.hxx +++ b/connectivity/source/drivers/mozab/MPreparedStatement.hxx @@ -53,7 +53,7 @@ namespace connectivity ::com::sun::star::sdbc::XMultipleResults, ::com::sun::star::lang::XServiceInfo> OPreparedStatement_BASE; - class OPreparedStatement : public OStatement_BASE2, + class OPreparedStatement : public OCommonStatement, public OPreparedStatement_BASE { protected: @@ -79,7 +79,7 @@ namespace connectivity ::rtl::OUString m_sSqlStatement; ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XResultSetMetaData > m_xMetaData; sal_Bool m_bPrepared; - OResultSet* m_pResultSet; + ::rtl::Reference< OResultSet > m_pResultSet; ::vos::ORef<connectivity::OSQLColumns> m_xParamColumns; // the parameter columns OValueRow m_aParameterRow; @@ -93,29 +93,29 @@ namespace connectivity virtual ~OPreparedStatement(); virtual void SAL_CALL disposing(); - virtual sal_Bool parseSql( const ::rtl::OUString& sql , sal_Bool bAdjusted = sal_False) throw ( - ::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException ); - virtual OResultSet* createResultSet(); - ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XResultSet> initResultSet(); + // OCommonStatement overridables + virtual StatementType + parseSql( const ::rtl::OUString& sql , sal_Bool bAdjusted = sal_False) throw ( ::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException ); + virtual void initializeResultSet( OResultSet* _pResult ); + virtual void clearCachedResultSet(); + virtual void cacheResultSet( const ::rtl::Reference< OResultSet >& _pResult ); + void checkAndResizeParameters(sal_Int32 parameterIndex); void setParameter(sal_Int32 parameterIndex, const ORowSetValue& x); - sal_uInt32 AddParameter(connectivity::OSQLParseNode * pParameter, const ::com::sun::star::uno::Reference< ::com::sun::star::beans::XPropertySet>& _xCol); void scanParameter(OSQLParseNode* pParseNode,::std::vector< OSQLParseNode*>& _rParaNodes); void describeColumn(OSQLParseNode* _pParameter,OSQLParseNode* _pNode,const OSQLTable& _xTable); void describeParameter(); - virtual void initializeResultSet( OResultSet* _pResult ); - public: DECLARE_SERVICE_INFO(); // ein Konstruktor, der fuer das Returnen des Objektes benoetigt wird: OPreparedStatement( OConnection* _pConnection,const ::rtl::OUString& sql); - sal_Bool lateInit(); + void lateInit(); //XInterface virtual ::com::sun::star::uno::Any SAL_CALL queryInterface( const ::com::sun::star::uno::Type & rType ) throw(::com::sun::star::uno::RuntimeException); @@ -153,8 +153,6 @@ namespace connectivity virtual void SAL_CALL setClob( sal_Int32 parameterIndex, const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XClob >& x ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); virtual void SAL_CALL setArray( sal_Int32 parameterIndex, const ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XArray >& x ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); virtual void SAL_CALL clearParameters( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); - // XCloseable - virtual void SAL_CALL close( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); // XResultSetMetaDataSupplier virtual ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XResultSetMetaData > SAL_CALL getMetaData( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); // XMultipleResults @@ -163,9 +161,9 @@ namespace connectivity virtual sal_Bool SAL_CALL getMoreResults( ) throw(::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException); public: - using OStatement_Base::executeQuery; - using OStatement_Base::executeUpdate; - using OStatement_Base::execute; + using OCommonStatement::executeQuery; + using OCommonStatement::executeUpdate; + using OCommonStatement::execute; protected: using OPropertySetHelper::getFastPropertyValue; }; diff --git a/connectivity/source/drivers/mozab/MResultSet.cxx b/connectivity/source/drivers/mozab/MResultSet.cxx index a58e442fcc30..18106375f252 100644 --- a/connectivity/source/drivers/mozab/MResultSet.cxx +++ b/connectivity/source/drivers/mozab/MResultSet.cxx @@ -99,7 +99,7 @@ sal_Bool SAL_CALL OResultSet::supportsService( const ::rtl::OUString& _rServiceN } // ------------------------------------------------------------------------- -OResultSet::OResultSet(OStatement_Base* pStmt, const ::boost::shared_ptr< connectivity::OSQLParseTreeIterator >& _pSQLIterator ) +OResultSet::OResultSet(OCommonStatement* pStmt, const ::boost::shared_ptr< connectivity::OSQLParseTreeIterator >& _pSQLIterator ) : OResultSet_BASE(m_aMutex) ,OPropertySetHelper(OResultSet_BASE::rBHelper) ,m_pStatement(pStmt) @@ -512,7 +512,7 @@ void SAL_CALL OResultSet::close( ) throw(SQLException, RuntimeException) { ResultSetEntryGuard aGuard( *this ); OSL_TRACE("In/Out: OResultSet::close" ); - // dispose(); + dispose(); } // ------------------------------------------------------------------------- @@ -1125,9 +1125,6 @@ void OResultSet::fillRowData() m_aQuery.setExpression( queryExpression ); - // We need a unique id for caching mechanism so should fetch card:URI - m_aQuery.setAttributes( m_aAttributeStrings ); - rtl::OUString aStr( m_pTable->getName() ); m_aQuery.setAddressbook( aStr ); diff --git a/connectivity/source/drivers/mozab/MResultSet.hxx b/connectivity/source/drivers/mozab/MResultSet.hxx index 09d53ee616ee..8eccf4cc7673 100644 --- a/connectivity/source/drivers/mozab/MResultSet.hxx +++ b/connectivity/source/drivers/mozab/MResultSet.hxx @@ -83,7 +83,7 @@ namespace connectivity public ::comphelper::OPropertyArrayUsageHelper<OResultSet> { protected: - OStatement_Base* m_pStatement; + OCommonStatement* m_pStatement; ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface> m_xStatement; ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XResultSetMetaData> m_xMetaData; sal_uInt32 m_nRowPos; @@ -126,7 +126,7 @@ namespace connectivity public: DECLARE_SERVICE_INFO(); - OResultSet(OStatement_Base* pStmt, const ::boost::shared_ptr< ::connectivity::OSQLParseTreeIterator >& _pSQLIterator ); + OResultSet(OCommonStatement* pStmt, const ::boost::shared_ptr< ::connectivity::OSQLParseTreeIterator >& _pSQLIterator ); ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > operator *() diff --git a/connectivity/source/drivers/mozab/MResultSetMetaData.cxx b/connectivity/source/drivers/mozab/MResultSetMetaData.cxx index b0caef93c15c..855f3580b797 100644 --- a/connectivity/source/drivers/mozab/MResultSetMetaData.cxx +++ b/connectivity/source/drivers/mozab/MResultSetMetaData.cxx @@ -184,12 +184,7 @@ sal_Bool SAL_CALL OResultSetMetaData::isSearchable( sal_Int32 column ) throw(SQL if ( m_pTable->getConnection()->isLDAP() ) { const OColumnAlias& aAliases( m_pTable->getConnection()->getColumnAlias() ); - OColumnAlias::ProgrammaticName eProgrammatic( aAliases.getProgrammaticNameIndex( sColumnName ) ); - if ( ( eProgrammatic == OColumnAlias::HOMECOUNTRY ) - || ( eProgrammatic == OColumnAlias::WORKCOUNTRY ) - ) - // for those, we know that they're not searchable in the Mozilla/LDAP implementation. - // There might be more ... + if ( !aAliases.isColumnSearchable( sColumnName ) ) return sal_False; } diff --git a/connectivity/source/drivers/mozab/MStatement.cxx b/connectivity/source/drivers/mozab/MStatement.cxx index 50d0b63941f9..852cad9dbc44 100644 --- a/connectivity/source/drivers/mozab/MStatement.cxx +++ b/connectivity/source/drivers/mozab/MStatement.cxx @@ -36,6 +36,7 @@ #include <comphelper/property.hxx> #include <comphelper/uno3.hxx> #include <osl/thread.h> +#include <tools/diagnose_ex.h> #include <com/sun/star/sdbc/ResultSetConcurrency.hpp> #include <com/sun/star/sdbc/ResultSetType.hpp> #include <com/sun/star/sdbc/FetchDirection.hpp> @@ -78,39 +79,33 @@ using namespace com::sun::star::container; using namespace com::sun::star::io; using namespace com::sun::star::util; //------------------------------------------------------------------------------ -OStatement_Base::OStatement_Base(OConnection* _pConnection ) - :OStatement_BASE(m_aMutex) - ,OPropertySetHelper(OStatement_BASE::rBHelper) +OCommonStatement::OCommonStatement(OConnection* _pConnection ) + :OCommonStatement_IBASE(m_aMutex) + ,OPropertySetHelper(OCommonStatement_IBASE::rBHelper) + ,OCommonStatement_SBASE((::cppu::OWeakObject*)_pConnection, this) ,m_xDBMetaData(_pConnection->getMetaData()) ,m_pTable(NULL) ,m_pConnection(_pConnection) ,m_aParser(_pConnection->getDriver()->getMSFactory()) ,m_pSQLIterator( new OSQLParseTreeIterator( _pConnection, _pConnection->createCatalog()->getTables(), m_aParser, NULL ) ) ,m_pParseTree(NULL) - ,rBHelper(OStatement_BASE::rBHelper) + ,rBHelper(OCommonStatement_IBASE::rBHelper) { m_pConnection->acquire(); - OSL_TRACE("In/Out: OStatement_Base::OStatement_Base" ); + OSL_TRACE("In/Out: OCommonStatement::OCommonStatement" ); } // ----------------------------------------------------------------------------- -OStatement_Base::~OStatement_Base() +OCommonStatement::~OCommonStatement() { } + //------------------------------------------------------------------------------ -void OStatement_Base::disposeResultSet() -{ - // free the cursor if alive - Reference< XComponent > xComp(m_xResultSet.get(), UNO_QUERY); - if (xComp.is()) - xComp->dispose(); - m_xResultSet = Reference< XResultSet>(); -} -//------------------------------------------------------------------------------ -void OStatement_BASE2::disposing() +void OCommonStatement::disposing() { ::osl::MutexGuard aGuard(m_aMutex); - disposeResultSet(); + clearWarnings(); + clearCachedResultSet(); if (m_pConnection) m_pConnection->release(); @@ -119,76 +114,38 @@ void OStatement_BASE2::disposing() m_pSQLIterator->dispose(); dispose_ChildImpl(); - OStatement_Base::disposing(); + OCommonStatement_IBASE::disposing(); } //----------------------------------------------------------------------------- -void SAL_CALL OStatement_BASE2::release() throw() +Any SAL_CALL OCommonStatement::queryInterface( const Type & rType ) throw(RuntimeException) { - relase_ChildImpl(); -} -//----------------------------------------------------------------------------- -Any SAL_CALL OStatement_Base::queryInterface( const Type & rType ) throw(RuntimeException) -{ - Any aRet = OStatement_BASE::queryInterface(rType); + Any aRet = OCommonStatement_IBASE::queryInterface(rType); if(!aRet.hasValue()) aRet = OPropertySetHelper::queryInterface(rType); return aRet; } // ------------------------------------------------------------------------- -Sequence< Type > SAL_CALL OStatement_Base::getTypes( ) throw(RuntimeException) +Sequence< Type > SAL_CALL OCommonStatement::getTypes( ) throw(RuntimeException) { ::cppu::OTypeCollection aTypes( ::getCppuType( (const Reference< XMultiPropertySet > *)0 ), ::getCppuType( (const Reference< XFastPropertySet > *)0 ), ::getCppuType( (const Reference< XPropertySet > *)0 )); - return ::comphelper::concatSequences(aTypes.getTypes(),OStatement_BASE::getTypes()); + return ::comphelper::concatSequences(aTypes.getTypes(),OCommonStatement_IBASE::getTypes()); } // ------------------------------------------------------------------------- -void SAL_CALL OStatement_Base::close( ) throw(SQLException, RuntimeException) +void SAL_CALL OCommonStatement::close( ) throw(SQLException, RuntimeException) { { ::osl::MutexGuard aGuard( m_aMutex ); - checkDisposed(OStatement_BASE::rBHelper.bDisposed); - + checkDisposed(OCommonStatement_IBASE::rBHelper.bDisposed); } dispose(); } -// ------------------------------------------------------------------------- - -void OStatement_Base::reset() throw (SQLException) -{ - ::osl::MutexGuard aGuard( m_aMutex ); - checkDisposed(OStatement_BASE::rBHelper.bDisposed); - clearWarnings (); - - if (m_xResultSet.get().is()) - clearMyResultSet(); -} -//-------------------------------------------------------------------- -// clearMyResultSet -// If a ResultSet was created for this Statement, close it -//-------------------------------------------------------------------- - -void OStatement_Base::clearMyResultSet () throw (SQLException) -{ - ::osl::MutexGuard aGuard( m_aMutex ); - checkDisposed(OStatement_BASE::rBHelper.bDisposed); - - try - { - Reference<XCloseable> xCloseable; - if ( ::comphelper::query_interface( m_xResultSet.get(), xCloseable ) ) - xCloseable->close(); - } - catch( const DisposedException& ) { } - - m_xResultSet = Reference< XResultSet >(); -} - -void OStatement_Base::createTable( ) - throw ( SQLException, RuntimeException ) +// ------------------------------------------------------------------------- +void OCommonStatement::createTable( ) throw ( SQLException, RuntimeException ) { if(m_pParseTree) { @@ -233,13 +190,11 @@ void OStatement_Base::createTable( ) getOwnConnection()->throwSQLException( STR_QUERY_TOO_COMPLEX, *this ); } // ------------------------------------------------------------------------- -sal_Bool OStatement_Base::parseSql( const ::rtl::OUString& sql , sal_Bool bAdjusted) +OCommonStatement::StatementType OCommonStatement::parseSql( const ::rtl::OUString& sql , sal_Bool bAdjusted) throw ( SQLException, RuntimeException ) { ::rtl::OUString aErr; - OSL_TRACE("In/Out :: OStatement::parseSql(%s)\n", OUtoCStr( sql ) ); - m_pParseTree = m_aParser.parseTree(aErr,sql); #if OSL_DEBUG_LEVEL > 0 @@ -285,12 +240,14 @@ sal_Bool OStatement_Base::parseSql( const ::rtl::OUString& sql , sal_Bool bAdjus createColumnMapping(); analyseSQL(); - break; + return eSelect; + case SQL_STATEMENT_CREATE_TABLE: createTable(); - return sal_False; + return eCreateTable; + default: - getOwnConnection()->throwSQLException( STR_QUERY_TOO_COMPLEX, *this ); + break; } } else if(!bAdjusted) //Our sql parser does not support a statement like "create table foo" @@ -298,35 +255,71 @@ sal_Bool OStatement_Base::parseSql( const ::rtl::OUString& sql , sal_Bool bAdjus { return parseSql(sql + ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("(""E-mail"" caracter)")),sal_True); } - else - getOwnConnection()->throwSQLException( STR_QUERY_TOO_COMPLEX, *this ); - return sal_True; + + getOwnConnection()->throwSQLException( STR_QUERY_TOO_COMPLEX, *this ); + OSL_ENSURE( false, "OCommonStatement::parseSql: unreachable!" ); + return eSelect; } // ------------------------------------------------------------------------- - -OResultSet* OStatement_Base::createResultSet() +Reference< XResultSet > OCommonStatement::impl_executeCurrentQuery() { - return new OResultSet( this, m_pSQLIterator ); + clearCachedResultSet(); + + ::rtl::Reference< OResultSet > pResult( new OResultSet( this, m_pSQLIterator ) ); + initializeResultSet( pResult.get() ); + + pResult->executeQuery(); + cacheResultSet( pResult ); // only cache if we survived the execution + + return pResult.get(); + } -// ------------------------------------------------------------------------- -void OStatement_Base::initializeResultSet( OResultSet* _pResult ) +// ------------------------------------------------------------------------- +void OCommonStatement::initializeResultSet( OResultSet* _pResult ) { - OSL_TRACE("In : initializeResultSet"); + ENSURE_OR_THROW( _pResult, "invalid result set" ); + _pResult->setColumnMapping(m_aColMapping); _pResult->setOrderByColumns(m_aOrderbyColumnNumber); _pResult->setOrderByAscending(m_aOrderbyAscending); _pResult->setBindingRow(m_aRow); _pResult->setTable(m_pTable); - OSL_TRACE("Out : initializeResultSet"); } // ------------------------------------------------------------------------- -sal_Bool SAL_CALL OStatement_Base::execute( const ::rtl::OUString& sql ) throw(SQLException, RuntimeException) +void OCommonStatement::clearCachedResultSet() +{ + Reference< XResultSet > xResultSet( m_xResultSet.get(), UNO_QUERY ); + if ( !xResultSet.is() ) + return; + + try + { + Reference< XCloseable > xCloseable( xResultSet, UNO_QUERY_THROW ); + xCloseable->close(); + } + catch( const DisposedException& ) + { + DBG_UNHANDLED_EXCEPTION(); + } + + m_xResultSet = Reference< XResultSet >(); +} + +// ------------------------------------------------------------------------- +void OCommonStatement::cacheResultSet( const ::rtl::Reference< OResultSet >& _pResult ) +{ + ENSURE_OR_THROW( _pResult.is(), "invalid result set" ); + m_xResultSet = Reference< XResultSet >( _pResult.get() ); +} + +// ------------------------------------------------------------------------- +sal_Bool SAL_CALL OCommonStatement::execute( const ::rtl::OUString& sql ) throw(SQLException, RuntimeException) { ::osl::MutexGuard aGuard( m_aMutex ); - checkDisposed(OStatement_BASE::rBHelper.bDisposed); + checkDisposed(OCommonStatement_IBASE::rBHelper.bDisposed); OSL_TRACE("Statement::execute( %s )", OUtoCStr( sql ) ); @@ -336,31 +329,26 @@ sal_Bool SAL_CALL OStatement_Base::execute( const ::rtl::OUString& sql ) throw(S } // ------------------------------------------------------------------------- -Reference< XResultSet > SAL_CALL OStatement_Base::executeQuery( const ::rtl::OUString& sql ) throw(SQLException, RuntimeException) +Reference< XResultSet > SAL_CALL OCommonStatement::executeQuery( const ::rtl::OUString& sql ) throw(SQLException, RuntimeException) { ::osl::MutexGuard aGuard( m_ThreadMutex ); - checkDisposed(OStatement_BASE::rBHelper.bDisposed); + checkDisposed(OCommonStatement_IBASE::rBHelper.bDisposed); OSL_TRACE("Statement::executeQuery( %s )", OUtoCStr( sql ) ); - if (!parseSql( sql )) //parseSql return false means this sql is a create table statement + // parse the statement + StatementType eStatementType = parseSql( sql ); + if ( eStatementType != eSelect ) return NULL; - OResultSet* pResult = createResultSet(); - Reference< XResultSet > xRS = pResult; - initializeResultSet( pResult ); - - pResult->executeQuery(); - m_xResultSet = xRS; // we need a reference to it for later use - - return xRS; + return impl_executeCurrentQuery(); } // ------------------------------------------------------------------------- -Reference< XConnection > SAL_CALL OStatement_Base::getConnection( ) throw(SQLException, RuntimeException) +Reference< XConnection > SAL_CALL OCommonStatement::getConnection( ) throw(SQLException, RuntimeException) { ::osl::MutexGuard aGuard( m_aMutex ); - checkDisposed(OStatement_BASE::rBHelper.bDisposed); + checkDisposed(OCommonStatement_IBASE::rBHelper.bDisposed); // just return our connection here return (Reference< XConnection >)m_pConnection; @@ -370,37 +358,37 @@ Any SAL_CALL OStatement::queryInterface( const Type & rType ) throw(RuntimeExcep { Any aRet = ::cppu::queryInterface(rType,static_cast< XServiceInfo*> (this)); if(!aRet.hasValue()) - aRet = OStatement_Base::queryInterface(rType); + aRet = OCommonStatement::queryInterface(rType); return aRet; } // ------------------------------------------------------------------------- -sal_Int32 SAL_CALL OStatement_Base::executeUpdate( const ::rtl::OUString& /*sql*/ ) throw(SQLException, RuntimeException) +sal_Int32 SAL_CALL OCommonStatement::executeUpdate( const ::rtl::OUString& /*sql*/ ) throw(SQLException, RuntimeException) { - ::dbtools::throwFeatureNotImplementedException( "XPreparedStatement::executeUpdate", *this ); + ::dbtools::throwFeatureNotImplementedException( "XStatement::executeUpdate", *this ); return 0; } // ------------------------------------------------------------------------- -Any SAL_CALL OStatement_Base::getWarnings( ) throw(SQLException, RuntimeException) +Any SAL_CALL OCommonStatement::getWarnings( ) throw(SQLException, RuntimeException) { ::osl::MutexGuard aGuard( m_aMutex ); - checkDisposed(OStatement_BASE::rBHelper.bDisposed); + checkDisposed(OCommonStatement_IBASE::rBHelper.bDisposed); return makeAny(m_aLastWarning); } // ------------------------------------------------------------------------- // ------------------------------------------------------------------------- -void SAL_CALL OStatement_Base::clearWarnings( ) throw(SQLException, RuntimeException) +void SAL_CALL OCommonStatement::clearWarnings( ) throw(SQLException, RuntimeException) { ::osl::MutexGuard aGuard( m_aMutex ); - checkDisposed(OStatement_BASE::rBHelper.bDisposed); + checkDisposed(OCommonStatement_IBASE::rBHelper.bDisposed); m_aLastWarning = SQLWarning(); } // ------------------------------------------------------------------------- -::cppu::IPropertyArrayHelper* OStatement_Base::createArrayHelper( ) const +::cppu::IPropertyArrayHelper* OCommonStatement::createArrayHelper( ) const { // this properties are define by the service resultset // they must in alphabetic order @@ -421,12 +409,12 @@ void SAL_CALL OStatement_Base::clearWarnings( ) throw(SQLException, RuntimeExce } // ------------------------------------------------------------------------- -::cppu::IPropertyArrayHelper & OStatement_Base::getInfoHelper() +::cppu::IPropertyArrayHelper & OCommonStatement::getInfoHelper() { - return *const_cast<OStatement_Base*>(this)->getArrayHelper(); + return *const_cast<OCommonStatement*>(this)->getArrayHelper(); } // ------------------------------------------------------------------------- -sal_Bool OStatement_Base::convertFastPropertyValue( +sal_Bool OCommonStatement::convertFastPropertyValue( Any & /*rConvertedValue*/, Any & /*rOldValue*/, sal_Int32 /*nHandle*/, @@ -438,7 +426,7 @@ sal_Bool OStatement_Base::convertFastPropertyValue( return bConverted; } // ------------------------------------------------------------------------- -void OStatement_Base::setFastPropertyValue_NoBroadcast(sal_Int32 nHandle,const Any& /*rValue*/) throw (Exception) +void OCommonStatement::setFastPropertyValue_NoBroadcast(sal_Int32 nHandle,const Any& /*rValue*/) throw (Exception) { // set the value to what ever is nescessary switch(nHandle) @@ -456,7 +444,7 @@ void OStatement_Base::setFastPropertyValue_NoBroadcast(sal_Int32 nHandle,const A } } // ------------------------------------------------------------------------- -void OStatement_Base::getFastPropertyValue(Any& /*rValue*/,sal_Int32 nHandle) const +void OCommonStatement::getFastPropertyValue(Any& /*rValue*/,sal_Int32 nHandle) const { switch(nHandle) { @@ -475,32 +463,32 @@ void OStatement_Base::getFastPropertyValue(Any& /*rValue*/,sal_Int32 nHandle) co // ------------------------------------------------------------------------- IMPLEMENT_SERVICE_INFO(OStatement,"com.sun.star.sdbcx.OStatement","com.sun.star.sdbc.Statement"); // ----------------------------------------------------------------------------- -void SAL_CALL OStatement_Base::acquire() throw() +void SAL_CALL OCommonStatement::acquire() throw() { - OStatement_BASE::acquire(); + OCommonStatement_IBASE::acquire(); } // ----------------------------------------------------------------------------- -void SAL_CALL OStatement_Base::release() throw() +void SAL_CALL OCommonStatement::release() throw() { - OStatement_BASE::release(); + relase_ChildImpl(); } // ----------------------------------------------------------------------------- void SAL_CALL OStatement::acquire() throw() { - OStatement_BASE2::acquire(); + OCommonStatement::acquire(); } // ----------------------------------------------------------------------------- void SAL_CALL OStatement::release() throw() { - OStatement_BASE2::release(); + OCommonStatement::release(); } // ----------------------------------------------------------------------------- -Reference< ::com::sun::star::beans::XPropertySetInfo > SAL_CALL OStatement_Base::getPropertySetInfo( ) throw(RuntimeException) +Reference< ::com::sun::star::beans::XPropertySetInfo > SAL_CALL OCommonStatement::getPropertySetInfo( ) throw(RuntimeException) { return ::cppu::OPropertySetHelper::createPropertySetInfo(getInfoHelper()); } // ----------------------------------------------------------------------------- -void OStatement_Base::createColumnMapping() +void OCommonStatement::createColumnMapping() { size_t i; @@ -524,7 +512,7 @@ void OStatement_Base::createColumnMapping() } // ----------------------------------------------------------------------------- -void OStatement_Base::analyseSQL() +void OCommonStatement::analyseSQL() { const OSQLParseNode* pOrderbyClause = m_pSQLIterator->getOrderTree(); if(pOrderbyClause) @@ -549,7 +537,7 @@ void OStatement_Base::analyseSQL() } } //------------------------------------------------------------------ -void OStatement_Base::setOrderbyColumn( OSQLParseNode* pColumnRef, +void OCommonStatement::setOrderbyColumn( OSQLParseNode* pColumnRef, OSQLParseNode* pAscendingDescending) { ::rtl::OUString aColumnName; diff --git a/connectivity/source/drivers/mozab/MStatement.hxx b/connectivity/source/drivers/mozab/MStatement.hxx index 48e66568b85e..1c3f3f93e8cc 100644 --- a/connectivity/source/drivers/mozab/MStatement.hxx +++ b/connectivity/source/drivers/mozab/MStatement.hxx @@ -64,21 +64,28 @@ namespace connectivity typedef ::cppu::WeakComponentImplHelper3< ::com::sun::star::sdbc::XStatement, ::com::sun::star::sdbc::XWarningsSupplier, - ::com::sun::star::sdbc::XCloseable> OStatement_BASE; + ::com::sun::star::sdbc::XCloseable> OCommonStatement_IBASE; //************************************************************** - //************ Class: OStatement_Base + //************ Class: OCommonStatement // is a base class for the normal statement and for the prepared statement //************************************************************** - class OStatement_Base : public comphelper::OBaseMutex, - public OStatement_BASE, - public ::cppu::OPropertySetHelper, - public ::comphelper::OPropertyArrayUsageHelper<OStatement_Base> - + class OCommonStatement; + typedef ::connectivity::OSubComponent< OCommonStatement, OCommonStatement_IBASE > OCommonStatement_SBASE; + + class OCommonStatement :public comphelper::OBaseMutex + ,public OCommonStatement_IBASE + ,public ::cppu::OPropertySetHelper + ,public ::comphelper::OPropertyArrayUsageHelper< OCommonStatement > + ,public OCommonStatement_SBASE { - ::com::sun::star::sdbc::SQLWarning m_aLastWarning; + friend class ::connectivity::OSubComponent< OCommonStatement, OCommonStatement_IBASE >; + + private: + ::com::sun::star::sdbc::SQLWarning m_aLastWarning; + protected: - ::com::sun::star::uno::WeakReference< ::com::sun::star::sdbc::XResultSet> m_xResultSet; // The last ResultSet created + ::com::sun::star::uno::WeakReference< ::com::sun::star::sdbc::XResultSet > m_xResultSet; ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XDatabaseMetaData> m_xDBMetaData; ::com::sun::star::uno::Reference< ::com::sun::star::container::XNameAccess> m_xColNames; // table columns @@ -105,8 +112,6 @@ namespace connectivity protected: - void disposeResultSet(); - // OPropertyArrayUsageHelper virtual ::cppu::IPropertyArrayHelper* createArrayHelper( ) const; // OPropertySetHelper @@ -123,23 +128,37 @@ namespace connectivity virtual void SAL_CALL getFastPropertyValue( ::com::sun::star::uno::Any& rValue, sal_Int32 nHandle) const; - virtual ~OStatement_Base(); + virtual ~OCommonStatement(); protected: // // Driver Internal Methods // - virtual sal_Bool parseSql( const ::rtl::OUString& sql , sal_Bool bAdjusted = sal_False) throw ( - ::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException ); + enum StatementType { eSelect, eCreateTable }; + /** called to do the parsing of a to-be-executed SQL statement, and set all members as needed + */ + virtual StatementType + parseSql( const ::rtl::OUString& sql , sal_Bool bAdjusted = sal_False) throw ( ::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException ); + /** called to initialize a result set, according to a previously parsed SQL statement + */ + virtual void initializeResultSet( OResultSet* _pResult ); + /** called when a possible cached instance of our last result set should be cleared + */ + virtual void clearCachedResultSet(); + /** caches a result set which has just been created by an execution of an SQL statement + */ + virtual void cacheResultSet( const ::rtl::Reference< OResultSet >& _pResult ); + + + /** executes the current query (the one which has been passed to the last parseSql call) + */ + ::com::sun::star::uno::Reference< ::com::sun::star::sdbc::XResultSet > + impl_executeCurrentQuery(); - OResultSet* createResultSet(); - virtual void initializeResultSet( OResultSet* _pResult ); void createColumnMapping(); void analyseSQL(); void setOrderbyColumn( connectivity::OSQLParseNode* pColumnRef, connectivity::OSQLParseNode* pAscendingDescending); - void reset () throw( ::com::sun::star::sdbc::SQLException); - void clearMyResultSet () throw( ::com::sun::star::sdbc::SQLException); virtual void createTable( ) throw ( ::com::sun::star::sdbc::SQLException, ::com::sun::star::uno::RuntimeException ); @@ -147,11 +166,12 @@ namespace connectivity // other methods OConnection* getOwnConnection() const { return m_pConnection;} - OStatement_Base(OConnection* _pConnection ); - using OStatement_BASE::operator ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >; + OCommonStatement(OConnection* _pConnection ); + using OCommonStatement_IBASE::operator ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface >; // OComponentHelper - virtual void SAL_CALL disposing(void){OStatement_BASE::disposing();} + virtual void SAL_CALL disposing(void); + // XInterface virtual void SAL_CALL release() throw(); virtual void SAL_CALL acquire() throw(); @@ -177,28 +197,14 @@ namespace connectivity using OPropertySetHelper::getFastPropertyValue; }; - class OStatement_BASE2 :public OStatement_Base - ,public ::connectivity::OSubComponent<OStatement_BASE2, OStatement_BASE> - - { - friend class OSubComponent<OStatement_BASE2, OStatement_BASE>; - public: - OStatement_BASE2(OConnection* _pConnection ) : OStatement_Base(_pConnection ), - ::connectivity::OSubComponent<OStatement_BASE2, OStatement_BASE>((::cppu::OWeakObject*)_pConnection, this){} - // OComponentHelper - virtual void SAL_CALL disposing(void); - // XInterface - virtual void SAL_CALL release() throw(); - }; - - class OStatement : public OStatement_BASE2, + class OStatement : public OCommonStatement, public ::com::sun::star::lang::XServiceInfo { protected: ~OStatement(){} public: // ein Konstruktor, der fuer das Returnen des Objektes benoetigt wird: - OStatement( OConnection* _pConnection) : OStatement_BASE2( _pConnection){} + OStatement( OConnection* _pConnection) : OCommonStatement( _pConnection){} DECLARE_SERVICE_INFO(); virtual ::com::sun::star::uno::Any SAL_CALL queryInterface( const ::com::sun::star::uno::Type & rType ) throw(::com::sun::star::uno::RuntimeException); diff --git a/connectivity/source/drivers/mozab/bootstrap/MMozillaBootstrap.cxx b/connectivity/source/drivers/mozab/bootstrap/MMozillaBootstrap.cxx index 4853a9796898..94dc9387d876 100644 --- a/connectivity/source/drivers/mozab/bootstrap/MMozillaBootstrap.cxx +++ b/connectivity/source/drivers/mozab/bootstrap/MMozillaBootstrap.cxx @@ -30,6 +30,7 @@ // MARKER(update_precomp.py): autogen include statement, do not remove #include "precompiled_connectivity.hxx" + #include "MMozillaBootstrap.hxx" using namespace com::sun::star::uno; diff --git a/connectivity/source/drivers/mozab/bootstrap/MNSInit.cxx b/connectivity/source/drivers/mozab/bootstrap/MNSInit.cxx index 180c67a30006..ee983a005920 100644 --- a/connectivity/source/drivers/mozab/bootstrap/MNSInit.cxx +++ b/connectivity/source/drivers/mozab/bootstrap/MNSInit.cxx @@ -34,12 +34,13 @@ #include "mozilla_nsinit.h" +#include <MNSInit.hxx> + #include <sal/types.h> #include <osl/diagnose.h> #include <osl/conditn.hxx> #include <osl/file.hxx> #include <rtl/bootstrap.hxx> -#include <MNSInit.hxx> #ifndef CONNECTIVITY_MOZAB_MCONFIGACCESS_HXX #include "MConfigAccess.hxx" @@ -77,7 +78,8 @@ extern "C" void NS_SetupRegistry(); const PRUnichar* pUsedProfile = *_pValidProfiles; // have a look what the configuration suggests as preferred profile - const PRUnichar* pPreferredProfile = static_cast< const PRUnichar* >( getUserProfile( ) ); + // PRUnichar != sal_Unicode in mingw + const PRUnichar* pPreferredProfile = reinterpret_cast_mingw_only< const PRUnichar* >( getUserProfile( ) ); if ( pPreferredProfile && *pPreferredProfile ) { PRUnichar const* const* pLoop = _pValidProfiles; @@ -128,7 +130,12 @@ sal_Bool MNS_InitXPCOM(sal_Bool* aProfileExists) nsCOMPtr<nsILocalFile> binDir; // Note: if path3 construction fails, mozilla will default to using MOZILLA_FIVE_HOME in the NS_InitXPCOM2() rtl::OUString path1( - RTL_CONSTASCII_USTRINGPARAM("$OOO_BASE_DIR/program")); +#if defined WNT + RTL_CONSTASCII_USTRINGPARAM("$BRAND_BASE_DIR/program") +#else + RTL_CONSTASCII_USTRINGPARAM("$OOO_BASE_DIR/program") +#endif + ); rtl::Bootstrap::expandMacros(path1); rtl::OString path2; if ((osl::FileBase::getSystemPathFromFileURL(path1, path1) == diff --git a/connectivity/source/drivers/mozab/bootstrap/MNSProfile.cxx b/connectivity/source/drivers/mozab/bootstrap/MNSProfile.cxx index 82d0dc4db693..276f87f43b18 100644 --- a/connectivity/source/drivers/mozab/bootstrap/MNSProfile.cxx +++ b/connectivity/source/drivers/mozab/bootstrap/MNSProfile.cxx @@ -179,7 +179,8 @@ NS_IMETHODIMP nsProfile::ProfileExists(const PRUnichar *profileName, PRBool *exi NS_ENSURE_ARG_POINTER(profileName); NS_ENSURE_ARG_POINTER(exists); - *exists = xMozillaBootstrap->getProfileExists(xMozillaBootstrap->getCurrentProduct(),profileName); + // PRUnichar != sal_Unicode in mingw + *exists = xMozillaBootstrap->getProfileExists(xMozillaBootstrap->getCurrentProduct(),reinterpret_cast_mingw_only<const sal_Unicode *>(profileName)); return NS_OK; } // Returns the name of the current profile i.e., the last used profile @@ -463,10 +464,12 @@ NS_IMETHODIMP nsProfile::GetProfileDir(const PRUnichar *profileName, nsIFile **p nsresult rv = NS_OK; - rtl::OUString path = xMozillaBootstrap->getProfilePath(xMozillaBootstrap->getCurrentProduct(),profileName); + // PRUnichar != sal_Unicode in mingw + rtl::OUString path = xMozillaBootstrap->getProfilePath(xMozillaBootstrap->getCurrentProduct(),reinterpret_cast_mingw_only<const sal_Unicode *>(profileName)); nsCOMPtr<nsILocalFile> localFile; - nsAutoString filePath(path.getStr()); + // PRUnichar != sal_Unicode in mingw + nsAutoString filePath(reinterpret_cast_mingw_only<const PRUnichar *>(path.getStr())); rv = NS_NewLocalFile(filePath, PR_TRUE, getter_AddRefs(localFile)); diff --git a/connectivity/source/drivers/mozab/bootstrap/MNSProfileDiscover.cxx b/connectivity/source/drivers/mozab/bootstrap/MNSProfileDiscover.cxx index 142da2237daf..a9ab5c015ace 100644 --- a/connectivity/source/drivers/mozab/bootstrap/MNSProfileDiscover.cxx +++ b/connectivity/source/drivers/mozab/bootstrap/MNSProfileDiscover.cxx @@ -129,7 +129,8 @@ namespace connectivity nsAutoString path; nsresult rv = profilePath->GetPath(path); NS_ENSURE_SUCCESS(rv, ::rtl::OUString()); - return ::rtl::OUString(path.get()); + // PRUnichar != sal_Unicode in mingw + return ::rtl::OUString(reinterpret_cast_mingw_only<const sal_Unicode *>(path.get())); } else return ::rtl::OUString(); @@ -170,7 +171,8 @@ namespace connectivity //step 1 : get mozilla registry file nsCOMPtr<nsILocalFile> localFile; ::rtl::OUString regDir( getRegistryFileName( MozillaProductType_Mozilla ) ); - nsAutoString registryDir(regDir.getStr()); + // PRUnichar != sal_Unicode in mingw + nsAutoString registryDir(reinterpret_cast_mingw_only<const PRUnichar *>(regDir.getStr())); rv = NS_NewLocalFile(registryDir, PR_TRUE, getter_AddRefs(localFile)); NS_ENSURE_SUCCESS(rv,rv); @@ -190,7 +192,8 @@ namespace connectivity //step 3:Enumerator it rv = registry->GetKey(nsIRegistry::Common, - szProfileSubtreeString.getStr(), + // PRUnichar != sal_Unicode in mingw + reinterpret_cast_mingw_only<const PRUnichar *>(szProfileSubtreeString.getStr()), &profilesTreeKey); if (NS_FAILED(rv)) return rv; @@ -198,12 +201,14 @@ namespace connectivity // Get the current profile rv = registry->GetString(profilesTreeKey, - szCurrentProfileString.getStr(), + // PRUnichar != sal_Unicode in mingw + reinterpret_cast_mingw_only<const PRUnichar *>(szCurrentProfileString.getStr()), getter_Copies(tmpCurrentProfile)); if (tmpCurrentProfile) { - m_Product.setCurrentProfile ( NS_STATIC_CAST(const PRUnichar*, tmpCurrentProfile)); + // PRUnichar != sal_Unicode in mingw + m_Product.setCurrentProfile ( reinterpret_cast_mingw_only<const sal_Unicode *>(NS_STATIC_CAST(const PRUnichar*, tmpCurrentProfile))); } @@ -243,7 +248,8 @@ namespace connectivity nsXPIDLString regData; rv = registry->GetString(profKey, - szDirectoryString.getStr(), + // PRUnichar != sal_Unicode in mingw + reinterpret_cast_mingw_only<const PRUnichar *>(szDirectoryString.getStr()), getter_Copies(regData)); if (NS_FAILED(rv)) continue; @@ -257,7 +263,8 @@ namespace connectivity //Add found profile to profile lists if (NS_SUCCEEDED(rv) && tempLocal) { - ProfileStruct* profileItem = new ProfileStruct(MozillaProductType_Mozilla,NS_STATIC_CAST(const PRUnichar*, profile),tempLocal); + // PRUnichar != sal_Unicode in mingw + ProfileStruct* profileItem = new ProfileStruct(MozillaProductType_Mozilla,reinterpret_cast_mingw_only<const sal_Unicode *>(NS_STATIC_CAST(const PRUnichar*, profile)),tempLocal); m_Product.mProfileList[profileItem->getProfileName()] = profileItem; } @@ -330,7 +337,8 @@ namespace connectivity nsCAutoString filePath(sPath.getStr()); if (isRelative) { - nsAutoString registryDir( regDir.getStr() ); + // PRUnichar != sal_Unicode in mingw + nsAutoString registryDir( reinterpret_cast_mingw_only<const PRUnichar *>(regDir.getStr()) ); nsCOMPtr<nsILocalFile> mAppData; rv = NS_NewLocalFile(registryDir, PR_TRUE, getter_AddRefs(mAppData)); @@ -490,7 +498,8 @@ namespace connectivity if (!path.getLength()) return sal_True; - nsAutoString filePath(path.getStr()); + // PRUnichar != sal_Unicode in mingw + nsAutoString filePath(reinterpret_cast_mingw_only<const PRUnichar *>(path.getStr())); nsresult rv; nsCOMPtr<nsILocalFile> localFile; diff --git a/connectivity/source/drivers/mozab/bootstrap/MNSProfileManager.cxx b/connectivity/source/drivers/mozab/bootstrap/MNSProfileManager.cxx index 91f3f273085b..cd098757d7a3 100644 --- a/connectivity/source/drivers/mozab/bootstrap/MNSProfileManager.cxx +++ b/connectivity/source/drivers/mozab/bootstrap/MNSProfileManager.cxx @@ -83,7 +83,8 @@ namespace connectivity rv = theProfile->GetCurrentProfile(getter_Copies(currentProfileStr)); if (NS_FAILED(rv) || currentProfileStr.get() == nsnull) return ::rtl::OUString(); - return ::rtl::OUString(currentProfileStr.get()); + // PRUnichar != sal_Unicode in mingw + return ::rtl::OUString(reinterpret_cast_mingw_only<const sal_Unicode *>(currentProfileStr.get())); } ::rtl::OUString ProfileManager::setCurrentProfile( ::com::sun::star::mozilla::MozillaProductType product, const ::rtl::OUString& profileName ) throw (::com::sun::star::uno::RuntimeException) { @@ -102,7 +103,8 @@ namespace connectivity nsCOMPtr<nsIProfile> theProfile(do_GetService(NS_PROFILE_CONTRACTID,&rv)); if (NS_FAILED(rv)) return ::rtl::OUString(); - const PRUnichar* pUsedProfile = profileName.getStr(); + // PRUnichar != sal_Unicode in mingw + const PRUnichar* pUsedProfile = reinterpret_cast_mingw_only<const PRUnichar *>(profileName.getStr()); //set current profile rv = theProfile->SetCurrentProfile( pUsedProfile ); if (NS_FAILED(rv)) return ::rtl::OUString(); diff --git a/connectivity/source/drivers/mozab/bootstrap/makefile.mk b/connectivity/source/drivers/mozab/bootstrap/makefile.mk index 5e4927f811fd..a22b3699760a 100644 --- a/connectivity/source/drivers/mozab/bootstrap/makefile.mk +++ b/connectivity/source/drivers/mozab/bootstrap/makefile.mk @@ -88,6 +88,8 @@ SLOFILES += \ $(SLO)$/MNSProfileDirServiceProvider.obj .ENDIF +CDEFS += -DMOZILLA_INTERNAL_API + .IF "$(GUI)"=="UNX" .IF "$(COMNAME)"=="sunpro5" CFLAGS += -features=tmplife @@ -167,7 +169,7 @@ CFLAGS += -fPIC CFLAGSCXX += \ -fno-rtti -Wconversion -Wpointer-arith \ -Wcast-align -Woverloaded-virtual -Wsynth \ - -Wno-long-long + -Wno-long-long -Wno-deprecated CDEFS += -DTRACING .ENDIF diff --git a/connectivity/source/drivers/mozab/makefile.mk b/connectivity/source/drivers/mozab/makefile.mk index a842c75c7a72..42ce1ab8ca6e 100644 --- a/connectivity/source/drivers/mozab/makefile.mk +++ b/connectivity/source/drivers/mozab/makefile.mk @@ -66,30 +66,32 @@ MOZ_REG_LIB := $(MOZ_LIB)$/mozreg.lib .IF "$(OS)"=="WNT" .IF "$(COM)"=="GCC" -MOZ_LIB_XPCOM= -L$(MOZ_LIB) -lembed_base_s -lnspr4 -lmozreg_s -lxpcom +MOZ_LIB_XPCOM= -L$(MOZ_LIB) -lembed_base_s -lnspr4 -lmozreg_s -lxpcom -lxpcom_core .ELSE LIB += $(MOZ_LIB) -MOZ_LIB_XPCOM= $(MOZ_EMBED_LIB) $(MOZ_LIB)$/nspr4.lib $(MOZ_REG_LIB) $(MOZ_LIB)$/xpcom.lib +MOZ_LIB_XPCOM= $(MOZ_EMBED_LIB) $(MOZ_LIB)$/nspr4.lib $(MOZ_REG_LIB) $(MOZ_LIB)$/xpcom.lib $(MOZ_LIB)$/xpcom_core.lib .ENDIF .ELSE "$(OS)"=="WNT" -MOZ_LIB_XPCOM= -L$(MOZ_LIB) -lembed_base_s -lnspr4 -lmozreg_s -lxpcom +MOZ_LIB_XPCOM= -L$(MOZ_LIB) -lnspr4 -lxpcom_core -lmozreg_s -lembed_base_s .ENDIF #End of mozilla specific stuff. -# Disable '-z defs' due to broken libxpcom. -LINKFLAGSDEFS=$(0) - USE_DEFFILE=TRUE ENABLE_EXCEPTIONS=TRUE VISIBILITY_HIDDEN=TRUE +.IF "$(OS)"!="WNT" +COMPONENT_CONFIG_DATA=$(TARGET)2.xcu +COMPONENT_CONFIG_SCHEMA=$(TARGET)2.xcs +.ENDIF + # --- Settings ---------------------------------- .IF "$(DBGUTIL_OJ)"!="" ENVCFLAGS+=/FR$(SLO)$/ .ENDIF -.INCLUDE : settings.mk +.INCLUDE : $(PRJ)$/makefile.pmk .INCLUDE : $(PRJ)$/version.mk @@ -98,7 +100,6 @@ ENVCFLAGS+=/FR$(SLO)$/ SLOFILES=\ $(SLO)$/MDriver.obj \ $(SLO)$/MServices.obj - # --- MOZAB BASE Library ----------------------------------- @@ -140,7 +141,8 @@ MOZSLOFILES=\ $(SLO)$/MNSINIParser.obj \ $(SLO)$/MNSRunnable.obj \ $(SLO)$/MNSProfile.obj \ - $(SLO)$/MNSProfileDirServiceProvider.obj + $(SLO)$/MNSProfileDirServiceProvider.obj \ + $(SLO)$/MLdapAttributeMap.obj SLO2FILES=\ @@ -186,7 +188,7 @@ DEF2NAME= $(SHL2TARGET) # --- Targets ---------------------------------- -.INCLUDE : target.mk +.INCLUDE : $(PRJ)$/target.pmk # --- filter file ------------------------------ diff --git a/connectivity/source/drivers/mozab/mozab.xcu b/connectivity/source/drivers/mozab/mozab.xcu new file mode 100644 index 000000000000..f47e1708e690 --- /dev/null +++ b/connectivity/source/drivers/mozab/mozab.xcu @@ -0,0 +1,157 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!--*********************************************************************** + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: DataAccess.xcu,v $ + * $Revision: 1.27 $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************ --> +<oor:component-data oor:name="Drivers" oor:package="org.openoffice.Office.DataAccess" xmlns:oor="http://openoffice.org/2001/registry" xmlns:xs="http://www.w3.org/2001/XMLSchema"> + <node oor:name="Installed"> + <node oor:name="sdbc:address:outlook" oor:op="replace"> + <prop oor:name="Driver"> + <value>com.sun.star.comp.sdbc.MozabDriver</value> + </prop> + <prop oor:name="DriverTypeDisplayName" oor:type="xs:string"> + <value xml:lang="en-US">Microsoft Outlook Address Book</value> + </prop> + <node oor:name="Features"> + <node oor:name="EscapeDateTime" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:boolean"> + <value>true</value> + </prop> + </node> + </node> + </node> + <node oor:name="sdbc:address:outlookexp" oor:op="replace"> + <prop oor:name="Driver"> + <value>com.sun.star.comp.sdbc.MozabDriver</value> + </prop> + <prop oor:name="DriverTypeDisplayName" oor:type="xs:string"> + <value xml:lang="en-US">Microsoft Windows Address Book</value> + </prop> + <node oor:name="Features"> + <node oor:name="EscapeDateTime" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:boolean"> + <value>true</value> + </prop> + </node> + </node> + </node> + <node oor:name="sdbc:address:mozilla:" oor:op="replace"> + <prop oor:name="Driver"> + <value>com.sun.star.comp.sdbc.MozabDriver</value> + </prop> + <prop oor:name="DriverTypeDisplayName" oor:type="xs:string"> + <value xml:lang="en-US">Mozilla Address Book</value> + </prop> + <node oor:name="Features"> + <node oor:name="EscapeDateTime" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:boolean"> + <value>true</value> + </prop> + </node> + </node> + <node oor:name="MetaData"> + <node oor:name="SupportsBrowsing" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:boolean"> + <value>true</value> + </prop> + </node> + </node> + </node> + <node oor:name="sdbc:address:thunderbird:" oor:op="replace"> + <prop oor:name="Driver"> + <value>com.sun.star.comp.sdbc.MozabDriver</value> + </prop> + <prop oor:name="DriverTypeDisplayName" oor:type="xs:string"> + <value xml:lang="en-US">Thunderbird Address Book</value> + </prop> + <node oor:name="Features"> + <node oor:name="EscapeDateTime" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:boolean"> + <value>true</value> + </prop> + </node> + </node> + <node oor:name="MetaData"> + <node oor:name="SupportsBrowsing" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:boolean"> + <value>true</value> + </prop> + </node> + </node> + </node> + <node oor:name="sdbc:address:ldap:*" oor:op="replace"> + <prop oor:name="Driver"> + <value>com.sun.star.comp.sdbc.MozabDriver</value> + </prop> + <prop oor:name="DriverTypeDisplayName" oor:type="xs:string"> + <value xml:lang="en-US">LDAP Address Book</value> + </prop> + <node oor:name="Properties"> + <node oor:name="BaseDN" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:string"> + <value></value> + </prop> + </node> + <node oor:name="MaxRowCount" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:int"> + <value>100</value> + </prop> + </node> + <node oor:name="PortNumber" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:int"> + <value>389</value> + </prop> + </node> + <node oor:name="UseSSL" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:boolean"> + <value>false</value> + </prop> + </node> + </node> + <node oor:name="Features"> + <node oor:name="EscapeDateTime" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:boolean"> + <value>true</value> + </prop> + </node> + </node> + <node oor:name="MetaData"> + <node oor:name="SupportsTableCreation" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:boolean"> + <value>true</value> + </prop> + </node> + <node oor:name="Authentication" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:string"> + <value>UserPassword</value> + </prop> + </node> + </node> + </node> + </node> +</oor:component-data> diff --git a/connectivity/source/drivers/mozab/mozab2.xcu b/connectivity/source/drivers/mozab/mozab2.xcu new file mode 100644 index 000000000000..41d99391c540 --- /dev/null +++ b/connectivity/source/drivers/mozab/mozab2.xcu @@ -0,0 +1,121 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!--*********************************************************************** + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: DataAccess.xcu,v $ + * $Revision: 1.27 $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************ --> +<oor:component-data oor:name="Drivers" oor:package="org.openoffice.Office.DataAccess" xmlns:oor="http://openoffice.org/2001/registry" xmlns:xs="http://www.w3.org/2001/XMLSchema"> + <node oor:name="Installed"> + <node oor:name="sdbc:address:mozilla:" oor:op="replace"> + <prop oor:name="Driver"> + <value>com.sun.star.comp.sdbc.MozabDriver</value> + </prop> + <prop oor:name="DriverTypeDisplayName" oor:type="xs:string"> + <value xml:lang="en-US">Mozilla Address Book</value> + </prop> + <node oor:name="MetaData"> + <node oor:name="SupportsBrowsing" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:boolean"> + <value>true</value> + </prop> + </node> + <node oor:name="EscapeDateTime" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:boolean"> + <value>true</value> + </prop> + </node> + </node> + </node> + <node oor:name="sdbc:address:thunderbird:" oor:op="replace"> + <prop oor:name="Driver"> + <value>com.sun.star.comp.sdbc.MozabDriver</value> + </prop> + <prop oor:name="DriverTypeDisplayName" oor:type="xs:string"> + <value xml:lang="en-US">Thunderbird Address Book</value> + </prop> + <node oor:name="MetaData"> + <node oor:name="SupportsBrowsing" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:boolean"> + <value>true</value> + </prop> + </node> + <node oor:name="EscapeDateTime" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:boolean"> + <value>true</value> + </prop> + </node> + </node> + </node> + <node oor:name="sdbc:address:ldap:*" oor:op="replace"> + <prop oor:name="Driver"> + <value>com.sun.star.comp.sdbc.MozabDriver</value> + </prop> + <prop oor:name="DriverTypeDisplayName" oor:type="xs:string"> + <value xml:lang="en-US">LDAP Address Book</value> + </prop> + <node oor:name="Properties"> + <node oor:name="BaseDN" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:string"> + <value></value> + </prop> + </node> + <node oor:name="MaxRowCount" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:int"> + <value>100</value> + </prop> + </node> + <node oor:name="PortNumber" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:int"> + <value>389</value> + </prop> + </node> + <node oor:name="UseSSL" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:boolean"> + <value>false</value> + </prop> + </node> + </node> + <node oor:name="MetaData"> + <node oor:name="SupportsTableCreation" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:boolean"> + <value>true</value> + </prop> + </node> + <node oor:name="Authentication" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:string"> + <value>UserPassword</value> + </prop> + </node> + <node oor:name="EscapeDateTime" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:boolean"> + <value>true</value> + </prop> + </node> + </node> + </node> + </node> +</oor:component-data> diff --git a/connectivity/source/drivers/mozab/mozillasrc/MDatabaseMetaDataHelper.cxx b/connectivity/source/drivers/mozab/mozillasrc/MDatabaseMetaDataHelper.cxx index f681d6953e04..369adf92a6bc 100644 --- a/connectivity/source/drivers/mozab/mozillasrc/MDatabaseMetaDataHelper.cxx +++ b/connectivity/source/drivers/mozab/mozillasrc/MDatabaseMetaDataHelper.cxx @@ -48,10 +48,12 @@ #include <osl/mutex.hxx> #include <osl/conditn.hxx> +#include <nsIAbDirFactoryService.h> #include <MNSInit.hxx> #include <MNameMapper.hxx> #include "MNSMozabProxy.hxx" #include <MNSDeclares.hxx> + static ::osl::Mutex m_aMetaMutex; #include <osl/diagnose.h> diff --git a/connectivity/source/drivers/mozab/mozillasrc/MLdapAttributeMap.cxx b/connectivity/source/drivers/mozab/mozillasrc/MLdapAttributeMap.cxx new file mode 100644 index 000000000000..351b5a5992f7 --- /dev/null +++ b/connectivity/source/drivers/mozab/mozillasrc/MLdapAttributeMap.cxx @@ -0,0 +1,453 @@ +/************************************************************************* +* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +* +* Copyright 2008 by Sun Microsystems, Inc. +* +* OpenOffice.org - a multi-platform office productivity suite +* +* $RCSfile: code,v $ +* +* $Revision: 1.3 $ +* +* This file is part of OpenOffice.org. +* +* OpenOffice.org is free software: you can redistribute it and/or modify +* it under the terms of the GNU Lesser General Public License version 3 +* only, as published by the Free Software Foundation. +* +* OpenOffice.org is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU Lesser General Public License version 3 for more details +* (a copy is included in the LICENSE file that accompanied this code). +* +* You should have received a copy of the GNU Lesser General Public License +* version 3 along with OpenOffice.org. If not, see +* <http://www.openoffice.org/license.html> +* for a copy of the LGPLv3 License. +************************************************************************/ +
+// MARKER(update_precomp.py): autogen include statement, do not remove +#include "precompiled_connectivity.hxx" + +#include <rtl/strbuf.hxx> + // keep this include at the beginning. Some of the other includes seems to inject a symbol "l" into the + // global namespace, which leads to a compiler warning in strbuf.hxx, about some parameters named "l" + // hiding objects "in an outer scope". + +#include "MLdapAttributeMap.hxx" +#include "MTypeConverter.hxx" +#include "MQueryHelper.hxx" + +#include <tools/diagnose_ex.h> + +#include <hash_map> + +//........................................................................ +namespace connectivity { namespace mozab { +//........................................................................ + + //==================================================================== + //= helper + //==================================================================== + namespace + { + typedef nsresult (NS_STDCALL nsIAbCard::*CardPropertyGetter)( PRUnichar** aFirstName ); + typedef nsresult (NS_STDCALL nsIAbCard::*CardPropertySetter)( const PRUnichar* aFirstName ); + struct CardPropertyData + { + const sal_Char* pLDAPAttributeList; + CardPropertyGetter PropGetter; + CardPropertySetter PropSetter; + + CardPropertyData() + :pLDAPAttributeList( NULL ) + ,PropGetter( NULL ) + ,PropSetter( NULL ) + { + } + CardPropertyData( const sal_Char* _pLDAPAttributeList, CardPropertyGetter _PropGetter, CardPropertySetter _PropSetter ) + :pLDAPAttributeList( _pLDAPAttributeList ) + ,PropGetter( _PropGetter ) + ,PropSetter( _PropSetter ) + { + } + }; + + typedef ::std::hash_map< ::rtl::OString, CardPropertyData, ::rtl::OStringHash > MapPropertiesToAttributes; + + #define DEF_CARD_ACCESS( PropertyName ) \ + &nsIAbCard::Get##PropertyName, &nsIAbCard::Set##PropertyName + + static const MapPropertiesToAttributes& lcl_getPropertyMap() + { + static MapPropertiesToAttributes aMap; + if ( aMap.empty() ) + { + struct MapEntry + { + const sal_Char* pAsciiPropertyName; + const sal_Char* pAsciiAttrributeList; + CardPropertyGetter PropGetter; + CardPropertySetter PropSetter; + }; + const MapEntry aEntries[] = { + { "FirstName", "givenname", DEF_CARD_ACCESS( FirstName ) },
+ { "LastName", "sn,surnname", DEF_CARD_ACCESS( LastName ) },
+ { "DisplayName", "cn,commonname,displayname", DEF_CARD_ACCESS( DisplayName ) },
+ { "NickName", "xmozillanickname", DEF_CARD_ACCESS( NickName ) },
+ { "PrimaryEmail", "mail", DEF_CARD_ACCESS( PrimaryEmail ) },
+ { "SecondEmail", "xmozillasecondemail", DEF_CARD_ACCESS( SecondEmail ) },
+ { "WorkPhone", "telephonenumber", DEF_CARD_ACCESS( WorkPhone ) },
+ { "HomePhone", "homephone", DEF_CARD_ACCESS( HomePhone ) },
+ { "FaxNumber", "fax,facsimiletelephonenumber", DEF_CARD_ACCESS( FaxNumber ) },
+ { "PagerNumber", "pager,pagerphone", DEF_CARD_ACCESS( PagerNumber ) },
+ { "CellularNumber", "mobile,cellphone,carphone", DEF_CARD_ACCESS( CellularNumber ) },
+ { "HomeAddress", "homepostaladdress,mozillaHomeStreet", DEF_CARD_ACCESS( HomeAddress ) },
+ { "HomeAddress2", "mozillaHomeStreet2", DEF_CARD_ACCESS( HomeAddress2 ) },
+ { "HomeCity", "homelocality,mozillaHomeLocalityName", DEF_CARD_ACCESS( HomeCity ) },
+ { "HomeState", "homeregion,mozillaHomeState", DEF_CARD_ACCESS( HomeState ) },
+ { "HomeZipCode", "homepostalcode,mozillaHomePostalCode", DEF_CARD_ACCESS( HomeZipCode ) },
+ { "HomeCountry", "homecountryname,mozillaHomeCountryName", DEF_CARD_ACCESS( HomeCountry ) },
+ { "WorkAddress", "postofficebox,streetaddress,streetaddress1", DEF_CARD_ACCESS( WorkAddress ) },
+ { "WorkAddress2", "streetaddress2", DEF_CARD_ACCESS( WorkAddress2 ) },
+ { "WorkCity", "l,locality", DEF_CARD_ACCESS( WorkCity ) },
+ { "WorkState", "st,region", DEF_CARD_ACCESS( WorkState ) },
+ { "WorkZipCode", "postalcode,zip", DEF_CARD_ACCESS( WorkZipCode ) },
+ { "WorkCountry", "countryname", DEF_CARD_ACCESS( WorkCountry ) },
+ { "JobTitle", "title", DEF_CARD_ACCESS( JobTitle ) },
+ { "Department", "ou,orgunit,department,departmentnumber", DEF_CARD_ACCESS( Department ) },
+ { "Company", "o,company", DEF_CARD_ACCESS( Company ) },
+ { "WebPage1", "workurl", DEF_CARD_ACCESS( WebPage1 ) },
+ { "WebPage2", "homeurl", DEF_CARD_ACCESS( WebPage2 ) },
+ { "BirthYear", "birthyear", DEF_CARD_ACCESS( BirthYear ) },
+ { "BirthMonth", "birthmonth", DEF_CARD_ACCESS( BirthMonth ) },
+ { "BirthYear", "birthday", DEF_CARD_ACCESS( BirthDay ) },
+ { "Custom1", "custom1", DEF_CARD_ACCESS( Custom1 ) },
+ { "Custom2", "custom2", DEF_CARD_ACCESS( Custom2 ) },
+ { "Custom3", "custom3", DEF_CARD_ACCESS( Custom3 ) },
+ { "Custom4", "custom4", DEF_CARD_ACCESS( Custom4 ) },
+ { "Notes", "notes,description", DEF_CARD_ACCESS( Notes ) },
+ { "PreferMailFormat", "xmozillausehtmlmail", NULL, NULL },
+ { NULL, NULL, NULL, NULL }
+ }; + const MapEntry* loop = aEntries; + while ( loop->pAsciiPropertyName ) + { + aMap[ ::rtl::OString( loop->pAsciiPropertyName ) ] = + CardPropertyData( loop->pAsciiAttrributeList, loop->PropGetter, loop->PropSetter ); + ++loop; + } + } + return aMap; + } + }
+
+ //==================================================================== + //= AttributeMap_Data + //==================================================================== + struct AttributeMap_Data + { + }; + + //==================================================================== + //= MLdapAttributeMap + //==================================================================== + // ------------------------------------------------------------------- + MLdapAttributeMap::MLdapAttributeMap() + :m_pData( new AttributeMap_Data ) + { + } + + // ------------------------------------------------------------------- + MLdapAttributeMap::~MLdapAttributeMap() + { + } + + // ------------------------------------------------------------------- + NS_IMPL_THREADSAFE_ISUPPORTS1( MLdapAttributeMap, nsIAbLDAPAttributeMap ) + + // ------------------------------------------------------------------- + NS_IMETHODIMP MLdapAttributeMap::GetAttributeList(const nsACString & aProperty, nsACString & _retval)
+ {
+ ::rtl::OString sProperty( MTypeConverter::nsACStringToOString( aProperty ) );
+
+ const MapPropertiesToAttributes& rPropertyMap( lcl_getPropertyMap() );
+ MapPropertiesToAttributes::const_iterator pos = rPropertyMap.find( sProperty );
+
+ if ( pos == rPropertyMap.end() )
+ {
+ _retval.SetIsVoid( PR_TRUE );
+ }
+ else
+ {
+ MTypeConverter::asciiToNsACString( pos->second.pLDAPAttributeList, _retval );
+ }
+
+ return NS_OK;
+ }
+
+ // ------------------------------------------------------------------- + NS_IMETHODIMP MLdapAttributeMap::GetAttributes(const nsACString & aProperty, PRUint32* aCount, char*** aAttrs)
+ {
+ OSL_ENSURE( false, "MLdapAttributeMap::GetAttributes: not implemented!" );
+ (void)aProperty;
+ (void)aCount;
+ (void)aAttrs;
+ return NS_ERROR_NOT_IMPLEMENTED;
+ }
+
+ // ------------------------------------------------------------------- + NS_IMETHODIMP MLdapAttributeMap::GetFirstAttribute(const nsACString & aProperty, nsACString & _retval)
+ {
+ ::rtl::OString sProperty( MTypeConverter::nsACStringToOString( aProperty ) );
+
+ const MapPropertiesToAttributes& rPropertyMap( lcl_getPropertyMap() );
+ MapPropertiesToAttributes::const_iterator pos = rPropertyMap.find( sProperty );
+
+ if ( pos == rPropertyMap.end() )
+ {
+ _retval.SetIsVoid( PR_TRUE );
+ }
+ else
+ {
+ sal_Int32 tokenPos(0);
+ ::rtl::OString sAttributeList( pos->second.pLDAPAttributeList );
+ MTypeConverter::asciiToNsACString( sAttributeList.getToken( 0, ',', tokenPos ).getStr(), _retval );
+ }
+
+ return NS_OK;
+ }
+
+ // ------------------------------------------------------------------- + NS_IMETHODIMP MLdapAttributeMap::SetAttributeList(const nsACString & aProperty, const nsACString & aAttributeList, PRBool allowInconsistencies)
+ {
+ OSL_ENSURE( false, "MLdapAttributeMap::SetAttributeList: not implemented!" );
+ (void)aProperty;
+ (void)aAttributeList;
+ (void)allowInconsistencies;
+ return NS_ERROR_NOT_IMPLEMENTED;
+ }
+
+ // ------------------------------------------------------------------- + NS_IMETHODIMP MLdapAttributeMap::GetProperty(const nsACString & aAttribute, nsACString & _retval)
+ {
+ OSL_ENSURE( false, "MLdapAttributeMap::GetProperty: not implemented!" );
+ (void)aAttribute;
+ (void)_retval;
+ return NS_ERROR_NOT_IMPLEMENTED;
+ }
+
+ // ------------------------------------------------------------------- + NS_IMETHODIMP MLdapAttributeMap::GetAllCardAttributes(nsACString & _retval)
+ {
+ const MapPropertiesToAttributes& rPropertyMap( lcl_getPropertyMap() );
+
+ ::rtl::OStringBuffer aAllAttributes;
+ for ( MapPropertiesToAttributes::const_iterator loop = rPropertyMap.begin();
+ loop != rPropertyMap.end();
+ ++loop
+ )
+ {
+ aAllAttributes.append( loop->second.pLDAPAttributeList );
+ if ( loop != rPropertyMap.end() )
+ aAllAttributes.append( ',' );
+ }
+
+ MTypeConverter::asciiToNsACString( aAllAttributes.getStr(), _retval );
+ return NS_OK;
+ }
+
+ // ------------------------------------------------------------------- + NS_IMETHODIMP MLdapAttributeMap::CheckState(void)
+ {
+ // we do not allow modifying the map, so we're always in a valid state
+ return NS_OK;
+ }
+
+ // ------------------------------------------------------------------- + NS_IMETHODIMP MLdapAttributeMap::SetFromPrefs(const nsACString & aPrefBranchName)
+ {
+ OSL_ENSURE( false, "MLdapAttributeMap::SetFromPrefs: not implemented!" );
+ (void)aPrefBranchName;
+ return NS_ERROR_NOT_IMPLEMENTED;
+ }
+
+ // ------------------------------------------------------------------- + NS_IMETHODIMP MLdapAttributeMap::SetCardPropertiesFromLDAPMessage(nsILDAPMessage* aMessage, nsIAbCard* aCard)
+ {
+ NS_ENSURE_ARG_POINTER( aMessage );
+ NS_ENSURE_ARG_POINTER( aCard );
+
+ // in case that's not present in the LDAP message: set the "preferred mail format" to "none"
+ aCard->SetPreferMailFormat( nsIAbPreferMailFormat::unknown );
+
+ const MapPropertiesToAttributes& rPropertyMap( lcl_getPropertyMap() ); + for ( MapPropertiesToAttributes::const_iterator prop = rPropertyMap.begin(); + prop != rPropertyMap.end(); + ++prop + ) + { + // split the list of attributes for the current property + ::rtl::OString sAttributeList( prop->second.pLDAPAttributeList ); + ::rtl::OString sAttribute; + + sal_Int32 tokenPos = 0; + while ( tokenPos != -1 ) + { + sAttribute = sAttributeList.getToken( 0, ',', tokenPos ); +
+ // retrieve the values for the current attribute
+ PRUint32 valueCount = 0;
+ PRUnichar** values = NULL;
+ nsresult rv = aMessage->GetValues( sAttribute.getStr(), &valueCount, &values );
+ if ( NS_FAILED( rv ) )
+ // try the next attribute
+ continue;
+
+ if ( valueCount )
+ {
+ CardPropertySetter propSetter = prop->second.PropSetter;
+ OSL_ENSURE( propSetter,
+ "MLdapAttributeMap::SetCardPropertiesFromLDAPMessage: "
+ "unexpected: could retrieve an attribute value, but have no setter for it!" );
+ if ( propSetter )
+ {
+ (aCard->*propSetter)( values[0] );
+ }
+
+ // we're done with this property - no need to handle the remaining attributes which
+ // map to it
+ break;
+ }
+ } + }
+ return NS_OK;
+ }
+ + // ------------------------------------------------------------------- + namespace + { + struct PreferMailFormatType + { + const sal_Char* description; + PRUint32 formatType; + + PreferMailFormatType() + :description( NULL ) + ,formatType( nsIAbPreferMailFormat::unknown ) + { + } + + PreferMailFormatType( const sal_Char* _description, PRUint32 _formatType ) + :description( _description ) + ,formatType( _formatType ) + { + } + }; + + static const PreferMailFormatType* lcl_getMailFormatTypes() + { + static const PreferMailFormatType aMailFormatTypes[] = + { + PreferMailFormatType( "text/plain", nsIAbPreferMailFormat::plaintext ), + PreferMailFormatType( "text/html", nsIAbPreferMailFormat::html ), + PreferMailFormatType( "unknown", nsIAbPreferMailFormat::unknown ), + PreferMailFormatType() + }; + return aMailFormatTypes; + } + } + + // ------------------------------------------------------------------- + void MLdapAttributeMap::fillCardFromResult( nsIAbCard& _card, const MQueryHelperResultEntry& _result ) + { + _card.SetPreferMailFormat( nsIAbPreferMailFormat::unknown );
+
+ ::rtl::OUString resultValue;
+
+ const MapPropertiesToAttributes& rPropertyMap( lcl_getPropertyMap() ); + for ( MapPropertiesToAttributes::const_iterator prop = rPropertyMap.begin(); + prop != rPropertyMap.end(); + ++prop + ) + { + resultValue = _result.getValue( prop->first ); + + CardPropertySetter propSetter = prop->second.PropSetter;
+ if ( propSetter )
+ {
+ // PRUnichar != sal_Unicode in mingw
+ (_card.*propSetter)( reinterpret_cast_mingw_only<const PRUnichar *>(resultValue.getStr()) );
+ }
+ else
+ {
+ if ( prop->first.equals( "PreferMailFormat" ) )
+ {
+ unsigned int format = nsIAbPreferMailFormat::unknown; + const PreferMailFormatType* pMailFormatType = lcl_getMailFormatTypes(); + while ( pMailFormatType->description ) + { + if ( resultValue.equalsAscii( pMailFormatType->description ) ) + { + format = pMailFormatType->formatType; + break; + } + ++pMailFormatType; + } + _card.SetPreferMailFormat(format); + }
+ else
+ OSL_ENSURE( false, "MLdapAttributeMap::fillCardFromResult: unexpected property without default setters!" );
+ }
+ } + } + + // ------------------------------------------------------------------- + void MLdapAttributeMap::fillResultFromCard( MQueryHelperResultEntry& _result, nsIAbCard& _card ) + { + nsXPIDLString value; + ::rtl::OUString resultValue; + + const MapPropertiesToAttributes& rPropertyMap( lcl_getPropertyMap() ); + for ( MapPropertiesToAttributes::const_iterator prop = rPropertyMap.begin(); + prop != rPropertyMap.end(); + ++prop + ) + { + CardPropertyGetter propGetter = prop->second.PropGetter;
+ if ( propGetter )
+ {
+ (_card.*propGetter)( getter_Copies( value ) );
+
+ nsAutoString temp( value ); + MTypeConverter::nsStringToOUString( temp, resultValue ); + }
+ else
+ {
+ if ( prop->first.equals( "PreferMailFormat" ) )
+ {
+ unsigned int format = nsIAbPreferMailFormat::unknown; + _card.GetPreferMailFormat( &format ); + const PreferMailFormatType* pMailFormatType = lcl_getMailFormatTypes(); + while ( pMailFormatType->description ) + { + if ( format == pMailFormatType->formatType ) + { + resultValue = ::rtl::OUString::createFromAscii( pMailFormatType->description ); + break; + } + ++pMailFormatType; + } + }
+ else
+ OSL_ENSURE( false, "MLdapAttributeMap::fillResultFromCard: unexpected property without default getters!" );
+ }
+
+ _result.insert( prop->first, resultValue ); + } + } + +//........................................................................ +} } // namespace connectivity::mozab +//........................................................................ diff --git a/connectivity/source/drivers/mozab/mozillasrc/MLdapAttributeMap.hxx b/connectivity/source/drivers/mozab/mozillasrc/MLdapAttributeMap.hxx new file mode 100644 index 000000000000..7cf5aa86a252 --- /dev/null +++ b/connectivity/source/drivers/mozab/mozillasrc/MLdapAttributeMap.hxx @@ -0,0 +1,78 @@ +/************************************************************************* +* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +* +* Copyright 2008 by Sun Microsystems, Inc. +* +* OpenOffice.org - a multi-platform office productivity suite +* +* $RCSfile: code,v $ +* +* $Revision: 1.3 $ +* +* This file is part of OpenOffice.org. +* +* OpenOffice.org is free software: you can redistribute it and/or modify +* it under the terms of the GNU Lesser General Public License version 3 +* only, as published by the Free Software Foundation. +* +* OpenOffice.org is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU Lesser General Public License version 3 for more details +* (a copy is included in the LICENSE file that accompanied this code). +* +* You should have received a copy of the GNU Lesser General Public License +* version 3 along with OpenOffice.org. If not, see +* <http://www.openoffice.org/license.html> +* for a copy of the LGPLv3 License. +************************************************************************/ +
+#ifndef CONNECTIVITY_MLDAPATTRIBUTEMAP_HXX +#define CONNECTIVITY_MLDAPATTRIBUTEMAP_HXX + +#include <MNSInclude.hxx> + +#include <memory> + +//........................................................................ +namespace connectivity { namespace mozab { +//........................................................................ + + struct AttributeMap_Data; + class MQueryHelperResultEntry; + + //==================================================================== + //= class MLdapAttributeMap + //==================================================================== + /** implements the nsIAbLDAPAttributeMap interface + + Somewhere between Mozilla 1.7.5 and SeaMonkey 1.1.12, the LDAP address book + implementation was changed to take the attribute mapping (from LDAP attributes + to address book properties) not directly from the preferences. Instead, this mapping + is now delivered by a dedicated implementation (supporting the nsIAbLDAPAttributeMap + interface). + + */ + class MLdapAttributeMap : public nsIAbLDAPAttributeMap + { + public: + MLdapAttributeMap(); + + NS_DECL_ISUPPORTS + NS_DECL_NSIABLDAPATTRIBUTEMAP + + static void fillCardFromResult( nsIAbCard& _card, const MQueryHelperResultEntry& _result ); + static void fillResultFromCard( MQueryHelperResultEntry& _result, nsIAbCard& _card ); + + protected: + virtual ~MLdapAttributeMap(); + + private: + ::std::auto_ptr< AttributeMap_Data > m_pData; + }; + +//........................................................................ +} } // namespace connectivity::mozab +//........................................................................ + +#endif // CONNECTIVITY_MLDAPATTRIBUTEMAP_HXX diff --git a/connectivity/source/drivers/mozab/mozillasrc/MNSInclude.hxx b/connectivity/source/drivers/mozab/mozillasrc/MNSInclude.hxx index 881878a665f5..a40de061281b 100644 --- a/connectivity/source/drivers/mozab/mozillasrc/MNSInclude.hxx +++ b/connectivity/source/drivers/mozab/mozillasrc/MNSInclude.hxx @@ -34,6 +34,9 @@ // Only include Mozilla include files once and using this file... // +// moved this here and in first position due to "long l;" unxsoli4 warning +#include <rtl/ustrbuf.hxx> + #include "pre_include_mozilla.h" #if defined __GNUC__ #pragma GCC system_header @@ -44,6 +47,7 @@ #include <nsCOMPtr.h> #include <nsISupportsArray.h> #include <nsString.h> + #if defined __SUNPRO_CC #pragma disable_warn // somewhere in the files included directly or indirectly in nsString.h, warnings are enabled, again @@ -70,6 +74,8 @@ #include <nsIAbDirectoryQueryProxy.h> #include <nsIAbDirFactory.h> #include <nsIRunnable.h> +#include <nsIAbLDAPAttributeMap.h> +#include <nsILDAPMessage.h> #include <prerr.h> diff --git a/connectivity/source/drivers/mozab/mozillasrc/MNSMozabProxy.cxx b/connectivity/source/drivers/mozab/mozillasrc/MNSMozabProxy.cxx index e0a338835b94..d26c34acbced 100644 --- a/connectivity/source/drivers/mozab/mozillasrc/MNSMozabProxy.cxx +++ b/connectivity/source/drivers/mozab/mozillasrc/MNSMozabProxy.cxx @@ -379,7 +379,8 @@ MNSMozabProxy::InitLDAP(sal_Char* sUri, sal_Unicode* sBindDN, sal_Unicode* pPass messageListener->AddRef(); nsCAutoString nsBind; - nsBind.AssignWithConversion(sBindDN); + // PRUnichar != sal_Unicode in mingw + nsBind.AssignWithConversion(reinterpret_cast_mingw_only<const PRUnichar *>(sBindDN)); // Now lets initialize the LDAP connection properly. rv = ldapConnection->Init(host.get(), port, useSSL, nsBind, @@ -395,7 +396,8 @@ MNSMozabProxy::InitLDAP(sal_Char* sUri, sal_Unicode* sBindDN, sal_Unicode* pPass if ( pPasswd && *pPasswd ) { nsCAutoString nsPassword; - nsPassword.AssignWithConversion(pPasswd); + // PRUnichar != sal_Unicode in mingw + nsPassword.AssignWithConversion(reinterpret_cast_mingw_only<const PRUnichar *>(pPasswd)); rv = ldapOperation->SimpleBind(nsPassword); } diff --git a/connectivity/source/drivers/mozab/mozillasrc/MQuery.cxx b/connectivity/source/drivers/mozab/mozillasrc/MQuery.cxx index b298e56262cc..9ff5aa04fc07 100644 --- a/connectivity/source/drivers/mozab/mozillasrc/MQuery.cxx +++ b/connectivity/source/drivers/mozab/mozillasrc/MQuery.cxx @@ -30,14 +30,14 @@ // MARKER(update_precomp.py): autogen include statement, do not remove #include "precompiled_connectivity.hxx" + #include <MQueryHelper.hxx> #include <MNameMapper.hxx> #include <MConnection.hxx> #include <connectivity/dbexception.hxx> #include "MQuery.hxx" -#ifndef _CONNECTIVITY_MAB_CONVERSIONS_HXX_ +#include "MLdapAttributeMap.hxx" #include "MTypeConverter.hxx" -#endif #include "MNSMozabProxy.hxx" #include <com/sun/star/uno/Reference.hxx> #include <unotools/processfactory.hxx> @@ -54,6 +54,7 @@ static NS_DEFINE_CID(kAbDirectoryQueryArgumentsCID, NS_ABDIRECTORYQUERYARGUMENTS static NS_DEFINE_CID(kBooleanConditionStringCID, NS_BOOLEANCONDITIONSTRING_CID); static NS_DEFINE_CID(kBooleanExpressionCID, NS_BOOLEANEXPRESSION_CID); static NS_DEFINE_CID(kAbDirectoryQueryProxyCID, NS_ABDIRECTORYQUERYPROXY_CID); +static NS_DEFINE_CID(kAbLDAPAttributeMap, NS_IABLDAPATTRIBUTEMAP_IID); using namespace connectivity::mozab; using namespace connectivity; @@ -139,31 +140,6 @@ void MQuery::construct() NS_IF_ADDREF( m_aQueryHelper); } // ------------------------------------------------------------------------- -void MQuery::setAttributes(::std::vector< ::rtl::OUString> &attrs) -{ - OSL_TRACE("IN MQuery::setAttributes()\n"); - ::osl::MutexGuard aGuard( m_aMutex ); - - m_aAttributes.clear(); - m_aAttributes.reserve(attrs.size()); - ::std::vector< ::rtl::OUString>::iterator aIterAttr = attrs.begin(); - ::std::map< ::rtl::OUString, ::rtl::OUString>::iterator aIterMap; - - for ( aIterAttr = attrs.begin(); aIterAttr != attrs.end();++aIterAttr ) - m_aAttributes.push_back( m_rColumnAlias.getProgrammaticNameOrFallbackToAlias( *aIterAttr ) ); - - OSL_TRACE("\tOUT MQuery::setAttributes()\n"); -} -// ------------------------------------------------------------------------- -const ::std::vector< ::rtl::OUString> &MQuery::getAttributes() const -{ - OSL_TRACE("IN MQuery::getAttributes()\n"); - - OSL_TRACE("\tOUT MQuery::getAttributes()\n"); - - return(m_aAttributes); -} -// ------------------------------------------------------------------------- void MQuery::setAddressbook(::rtl::OUString &ab) { OSL_TRACE("IN MQuery::setAddressbook()\n"); @@ -253,12 +229,9 @@ static sal_Int32 generateExpression( MQuery* _aQuery, MQueryExpression* _aExpr, // Set the 'name' property of the boolString. // Check if it's an alias first... - rtl::OUString attrName; - ::std::map< ::rtl::OUString, ::rtl::OUString>::const_iterator aIterMap; - attrName = _aQuery->getColumnAlias().getProgrammaticNameOrFallbackToAlias( evStr->getName() ); - ::std::string aMiName = MTypeConverter::ouStringToStlString(attrName); - boolString->SetName(strdup(aMiName.c_str())); - OSL_TRACE("Name = %s ;", aMiName.c_str() ); + rtl::OString attrName = _aQuery->getColumnAlias().getProgrammaticNameOrFallbackToUTF8Alias( evStr->getName() ); + boolString->SetName( strdup( attrName.getStr() ) ); + OSL_TRACE("Name = %s ;", attrName.getStr() ); // Set the 'matchType' property of the boolString. Check for equal length. sal_Bool requiresValue = sal_True; switch(evStr->getCond()) { @@ -609,8 +582,8 @@ sal_Int32 MQuery::executeQueryProxied(OConnection* _pCon) PRInt32 count=1; nsCOMPtr< nsIAbDirectoryQueryArguments > arguments = do_CreateInstance( kAbDirectoryQueryArgumentsCID, &rv); - NS_ENSURE_SUCCESS( rv, rv ); + rv = arguments->SetExpression(queryExpression); NS_ENSURE_SUCCESS( rv, rv ); @@ -620,6 +593,10 @@ sal_Int32 MQuery::executeQueryProxied(OConnection* _pCon) rv = arguments->SetQuerySubDirectories(m_bQuerySubDirs); NS_ENSURE_SUCCESS( rv, rv ); + nsCOMPtr< nsIAbLDAPAttributeMap > attributeMap( new MLdapAttributeMap ); + rv = arguments->SetTypeSpecificArg( attributeMap ); + NS_ENSURE_SUCCESS( rv, rv ); + // Execute the query. OSL_TRACE( "****** calling DoQuery\n"); @@ -719,7 +696,7 @@ MQuery::setRowValue( ORowSetValue& rValue, sal_Int32 nDBRow,const rtl::OUString& switch ( nType ) { case DataType::VARCHAR: - xResEntry->setValue( m_rColumnAlias.getProgrammaticNameOrFallbackToAlias( aDBColumnName ), rValue.getString() ); + xResEntry->setValue( m_rColumnAlias.getProgrammaticNameOrFallbackToUTF8Alias( aDBColumnName ), rValue.getString() ); break; default: OSL_ENSURE( sal_False, "invalid data type!" ); @@ -745,7 +722,7 @@ MQuery::getRowValue( ORowSetValue& rValue, sal_Int32 nDBRow,const rtl::OUString& switch ( nType ) { case DataType::VARCHAR: - rValue = xResEntry->getValue( m_rColumnAlias.getProgrammaticNameOrFallbackToAlias( aDBColumnName ) ); + rValue = xResEntry->getValue( m_rColumnAlias.getProgrammaticNameOrFallbackToUTF8Alias( aDBColumnName ) ); break; default: @@ -828,8 +805,7 @@ MQuery::FreeNameMapper( MNameMapper* _ptr ) delete _ptr; } // ------------------------------------------------------------------------- -sal_Bool MQuery:: -isWritable(OConnection* _pCon) +sal_Bool MQuery::isWritable(OConnection* _pCon) { if ( !m_aQueryDirectory ) return sal_False; diff --git a/connectivity/source/drivers/mozab/mozillasrc/MQuery.hxx b/connectivity/source/drivers/mozab/mozillasrc/MQuery.hxx index 7ff57d8d0d23..8bf376cde61f 100644 --- a/connectivity/source/drivers/mozab/mozillasrc/MQuery.hxx +++ b/connectivity/source/drivers/mozab/mozillasrc/MQuery.hxx @@ -205,7 +205,6 @@ namespace connectivity private: MQueryDirectory *m_aQueryDirectory; MQueryHelper *m_aQueryHelper; - ::std::vector< ::rtl::OUString> m_aAttributes; ::rtl::OUString m_aAddressbook; sal_Int32 m_nMaxNrOfReturns; sal_Bool m_bQuerySubDirs; @@ -240,9 +239,6 @@ namespace connectivity sal_uInt32 InsertLoginInfo(OConnection* _pCon); - void setAttributes( ::std::vector< ::rtl::OUString>&); - const ::std::vector< ::rtl::OUString> &getAttributes(void) const; - void setAddressbook( ::rtl::OUString&); ::rtl::OUString getAddressbook(void) const; diff --git a/connectivity/source/drivers/mozab/mozillasrc/MQueryHelper.cxx b/connectivity/source/drivers/mozab/mozillasrc/MQueryHelper.cxx index 01fed34d8b39..3a1fe97d8311 100644 --- a/connectivity/source/drivers/mozab/mozillasrc/MQueryHelper.cxx +++ b/connectivity/source/drivers/mozab/mozillasrc/MQueryHelper.cxx @@ -30,62 +30,20 @@ // MARKER(update_precomp.py): autogen include statement, do not remove #include "precompiled_connectivity.hxx" -#include <MQueryHelper.hxx> +#include "MQueryHelper.hxx" #include "MTypeConverter.hxx" +#include "MConnection.hxx" +#include "MNSDeclares.hxx" +#include "MLdapAttributeMap.hxx" + #include <connectivity/dbexception.hxx> -#ifndef _CONNECTIVITY_MOZAB_BCONNECTION_HXX_ -#include <MConnection.hxx> -#endif #include "resource/mozab_res.hrc" -#include "MNSDeclares.hxx" using namespace connectivity::mozab; -enum -{ - index_FirstName=0, - index_LastName, - index_DisplayName, - index_NickName, - index_PrimaryEmail, - index_SecondEmail, - index_PreferMailFormat, - index_WorkPhone, - index_HomePhone, - index_FaxNumber, - index_PagerNumber, - index_CellularNumber, - index_HomeAddress, - index_HomeAddress2, - index_HomeCity, - index_HomeState, - index_HomeZipCode, - index_HomeCountry, - index_WorkAddress, - index_WorkAddress2, - index_WorkCity, - index_WorkState, - index_WorkZipCode, - index_WorkCountry, - index_JobTitle, - index_Department, - index_Company, - index_WebPage1, - index_WebPage2, - index_BirthYear, - index_BirthMonth, - index_BirthDay, - index_Custom1, - index_Custom2, - index_Custom3, - index_Custom4, - index_Notes -}; - - NS_IMPL_THREADSAFE_ISUPPORTS1(connectivity::mozab::MQueryHelper,nsIAbDirectoryQueryResultListener) // @@ -101,8 +59,6 @@ MQueryHelperResultEntry::MQueryHelperResultEntry() MQueryHelperResultEntry::~MQueryHelperResultEntry() { - - OSL_TRACE("IN MQueryHelperResultEntry::~MQueryHelperResultEntry()\n"); OSL_TRACE("OUT MQueryHelperResultEntry::~MQueryHelperResultEntry()\n"); @@ -117,39 +73,31 @@ MQueryHelperResultEntry::getCard() { return m_Card; } -void -MQueryHelperResultEntry::insert( const rtl::OUString &key, rtl::OUString &value ) +void MQueryHelperResultEntry::insert( const rtl::OString &key, rtl::OUString &value ) { - m_Fields.insert( fieldMap::value_type( key, value ) ); + m_Fields[ key ] = value; } -rtl::OUString -MQueryHelperResultEntry::getValue( const rtl::OUString &key ) const +rtl::OUString MQueryHelperResultEntry::getValue( const rtl::OString &key ) const { - fieldMap::const_iterator iter; - - iter = m_Fields.find( key ); - - if ( iter == m_Fields.end() ) { + FieldMap::const_iterator iter = m_Fields.find( key ); + if ( iter == m_Fields.end() ) + { return rtl::OUString(); - } else { - return (*iter).second; + } + else + { + return iter->second; } } -rtl::OUString -MQueryHelperResultEntry::setValue( const rtl::OUString &key, const rtl::OUString & rValue) +void MQueryHelperResultEntry::setValue( const rtl::OString &key, const rtl::OUString & rValue) { - m_Fields.erase(key); - m_Fields.insert( fieldMap::value_type( key, rValue ) ); - return rValue; + m_Fields[ key ] = rValue; } // // class MQueryHelper // -// MIME-types. -static char PreferMailFormatTypes[2][11] = {"text/plain", - "text/html"}; MQueryHelper::MQueryHelper() :m_nIndex( 0 ) ,m_bHasMore( sal_True ) @@ -473,7 +421,7 @@ NS_IMETHODIMP MQueryHelper::OnQueryItem(nsIAbDirectoryQueryResult *result) nsCOMPtr<nsIAbCard> card(do_QueryInterface(cardSupports, &rv)); NS_ENSURE_SUCCESS(rv, rv); - getCardValues(card); + getCardValues(card); } nsMemory::Free(name); @@ -484,56 +432,13 @@ NS_IMETHODIMP MQueryHelper::OnQueryItem(nsIAbDirectoryQueryResult *result) return(NS_OK); } +// ----------------------------------------------------------------------------- void MQueryHelper::notifyQueryError() { m_bQueryComplete = sal_True ; notifyResultOrComplete() ; } -static const ::rtl::OUString& getAttribute(PRUint32 index) -{ - static const ::rtl::OUString sAttributeNames[] = - { - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("FirstName")), - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("LastName")), - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("DisplayName")), - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("NickName")), - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("PrimaryEmail")), - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("SecondEmail")), - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("PreferMailFormat")), - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("WorkPhone")), - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("HomePhone")), - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("FaxNumber")), - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("PagerNumber")), - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("CellularNumber")), - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("HomeAddress")), - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("HomeAddress2")), - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("HomeCity")), - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("HomeState")), - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("HomeZipCode")), - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("HomeCountry")), - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("WorkAddress")), - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("WorkAddress2")), - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("WorkCity")), - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("WorkState")), - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("WorkZipCode")), - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("WorkCountry")), - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("JobTitle")), - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("Department")), - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("Company")), - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("WebPage1")), - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("WebPage2")), - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("BirthYear")), - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("BirthMonth")), - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("BirthDay")), - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("Custom1")), - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("Custom2")), - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("Custom3")), - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("Custom4")), - ::rtl::OUString( RTL_CONSTASCII_USTRINGPARAM("Notes")) - }; - return sAttributeNames[index]; -} const char * getAddrURI(const nsIAbDirectory* directory) { nsresult retCode; @@ -687,127 +592,7 @@ sal_Bool MQueryHelper::setCardValues(const sal_Int32 rowIndex) return sal_False; } - ::rtl::OUString sValue; - - getCardAttributeAndValue(getAttribute(index_FirstName),sValue,resEntry); - card->SetFirstName(sValue.getStr()); - - getCardAttributeAndValue(getAttribute(index_LastName),sValue,resEntry); - card->SetLastName(sValue.getStr()); - - getCardAttributeAndValue(getAttribute(index_DisplayName),sValue,resEntry); - card->SetDisplayName(sValue.getStr()); - - getCardAttributeAndValue(getAttribute(index_NickName),sValue,resEntry); - card->SetNickName(sValue.getStr()); - - getCardAttributeAndValue(getAttribute(index_PrimaryEmail),sValue,resEntry); - card->SetPrimaryEmail(sValue.getStr()); - - getCardAttributeAndValue(getAttribute(index_SecondEmail),sValue,resEntry); - card->SetSecondEmail(sValue.getStr()); - - unsigned int format; - ::rtl::OUString prefMailValue; - getCardAttributeAndValue(getAttribute(index_WorkPhone),prefMailValue,resEntry); - for(format=2;format >0;format--) - { - if (! prefMailValue.compareTo( - ::rtl::OUString::createFromAscii(PreferMailFormatTypes[format-1]) ) ) - break; - } - card->SetPreferMailFormat(format); - - getCardAttributeAndValue(getAttribute(index_WorkPhone),sValue,resEntry); - card->SetWorkPhone(sValue.getStr()); - - getCardAttributeAndValue(getAttribute(index_HomePhone),sValue,resEntry); - card->SetHomePhone(sValue.getStr()); - - getCardAttributeAndValue(getAttribute(index_FaxNumber),sValue,resEntry); - card->SetFaxNumber(sValue.getStr()); - - getCardAttributeAndValue(getAttribute(index_PagerNumber),sValue,resEntry); - card->SetPagerNumber(sValue.getStr()); - - getCardAttributeAndValue(getAttribute(index_CellularNumber),sValue,resEntry); - card->SetCellularNumber(sValue.getStr()); - - getCardAttributeAndValue(getAttribute(index_HomeAddress),sValue,resEntry); - card->SetHomeAddress(sValue.getStr()); - - getCardAttributeAndValue(getAttribute(index_HomeAddress2),sValue,resEntry); - card->SetHomeAddress2(sValue.getStr()); - - getCardAttributeAndValue(getAttribute(index_HomeCity),sValue,resEntry); - card->SetHomeCity(sValue.getStr()); - - getCardAttributeAndValue(getAttribute(index_HomeState),sValue,resEntry); - card->SetHomeState(sValue.getStr()); - - getCardAttributeAndValue(getAttribute(index_HomeZipCode),sValue,resEntry); - card->SetHomeZipCode(sValue.getStr()); - - getCardAttributeAndValue(getAttribute(index_HomeCountry),sValue,resEntry); - card->SetHomeCountry(sValue.getStr()); - - getCardAttributeAndValue(getAttribute(index_WorkAddress),sValue,resEntry); - card->SetWorkAddress(sValue.getStr()); - - getCardAttributeAndValue(getAttribute(index_WorkAddress2),sValue,resEntry); - card->SetWorkAddress2(sValue.getStr()); - - getCardAttributeAndValue(getAttribute(index_WorkCity),sValue,resEntry); - card->SetWorkCity(sValue.getStr()); - - getCardAttributeAndValue(getAttribute(index_WorkState),sValue,resEntry); - card->SetWorkState(sValue.getStr()); - - getCardAttributeAndValue(getAttribute(index_WorkZipCode),sValue,resEntry); - card->SetWorkZipCode(sValue.getStr()); - - getCardAttributeAndValue(getAttribute(index_WorkCountry),sValue,resEntry); - card->SetWorkCountry(sValue.getStr()); - - getCardAttributeAndValue(getAttribute(index_JobTitle),sValue,resEntry); - card->SetJobTitle(sValue.getStr()); - - getCardAttributeAndValue(getAttribute(index_Department),sValue,resEntry); - card->SetDepartment(sValue.getStr()); - - getCardAttributeAndValue(getAttribute(index_Company),sValue,resEntry); - card->SetCompany(sValue.getStr()); - - getCardAttributeAndValue(getAttribute(index_WebPage1),sValue,resEntry); - card->SetWebPage1(sValue.getStr()); - - getCardAttributeAndValue(getAttribute(index_WebPage2),sValue,resEntry); - card->SetWebPage2(sValue.getStr()); - - getCardAttributeAndValue(getAttribute(index_BirthYear),sValue,resEntry); - card->SetBirthYear(sValue.getStr()); - - getCardAttributeAndValue(getAttribute(index_BirthMonth),sValue,resEntry); - card->SetBirthMonth(sValue.getStr()); - - getCardAttributeAndValue(getAttribute(index_BirthDay),sValue,resEntry); - card->SetBirthDay(sValue.getStr()); - - getCardAttributeAndValue(getAttribute(index_Custom1),sValue,resEntry); - card->SetCustom1(sValue.getStr()); - - getCardAttributeAndValue(getAttribute(index_Custom2),sValue,resEntry); - card->SetCustom2(sValue.getStr()); - - getCardAttributeAndValue(getAttribute(index_Custom3),sValue,resEntry); - card->SetCustom3(sValue.getStr()); - - getCardAttributeAndValue(getAttribute(index_Custom4),sValue,resEntry); - card->SetCustom4(sValue.getStr()); - - getCardAttributeAndValue(getAttribute(index_Notes),sValue,resEntry); - card->SetNotes(sValue.getStr()); - + MLdapAttributeMap::fillCardFromResult( *card, *resEntry ); return sal_True; } @@ -821,142 +606,7 @@ void MQueryHelper::getCardValues(nsIAbCard *card,sal_Int32 rowIndex) else resEntry = new MQueryHelperResultEntry(); - nsXPIDLString sValue; - - card->GetFirstName(getter_Copies(sValue)); - addCardAttributeAndValue(getAttribute(index_FirstName),sValue,resEntry); - - card->GetLastName(getter_Copies(sValue)); - addCardAttributeAndValue(getAttribute(index_LastName),sValue,resEntry); - - card->GetDisplayName(getter_Copies(sValue)); - addCardAttributeAndValue(getAttribute(index_DisplayName),sValue,resEntry); - - card->GetNickName(getter_Copies(sValue)); - addCardAttributeAndValue(getAttribute(index_NickName),sValue,resEntry); - - card->GetPrimaryEmail(getter_Copies(sValue)); - addCardAttributeAndValue(getAttribute(index_PrimaryEmail),sValue,resEntry); - - card->GetSecondEmail(getter_Copies(sValue)); - addCardAttributeAndValue(getAttribute(index_SecondEmail),sValue,resEntry); - - unsigned int format = 0; - card->GetPreferMailFormat(&format); - ::rtl::OUString prefMailValue; - switch(format) - { - case nsIAbPreferMailFormat::html: - prefMailValue = ::rtl::OUString::createFromAscii(PreferMailFormatTypes[1]); - break; - case nsIAbPreferMailFormat::plaintext: - prefMailValue = ::rtl::OUString::createFromAscii(PreferMailFormatTypes[0]); - break; - case nsIAbPreferMailFormat::unknown: - default: - prefMailValue = ::rtl::OUString::createFromAscii(PreferMailFormatTypes[0]); - break; - - } - resEntry->insert( getAttribute(index_PreferMailFormat), prefMailValue ); - - card->GetWorkPhone(getter_Copies(sValue)); - addCardAttributeAndValue(getAttribute(index_WorkPhone),sValue,resEntry); - - card->GetHomePhone(getter_Copies(sValue)); - addCardAttributeAndValue(getAttribute(index_HomePhone),sValue,resEntry); - - card->GetFaxNumber(getter_Copies(sValue)); - addCardAttributeAndValue(getAttribute(index_FaxNumber),sValue,resEntry); - - card->GetPagerNumber(getter_Copies(sValue)); - addCardAttributeAndValue(getAttribute(index_PagerNumber),sValue,resEntry); - - card->GetCellularNumber(getter_Copies(sValue)); - addCardAttributeAndValue(getAttribute(index_CellularNumber),sValue,resEntry); - - card->GetHomeAddress(getter_Copies(sValue)); - PRInt32 offset; - nsXPIDLString space; - space.Assign(NS_LITERAL_STRING(" ")); - while ((offset = sValue.FindChar('\r')) >= 0) sValue.Replace(offset, 1, space); - while ((offset = sValue.FindChar('\n')) >= 0) sValue.Replace(offset, 1, space); - addCardAttributeAndValue(getAttribute(index_HomeAddress),sValue,resEntry); - - card->GetHomeAddress2(getter_Copies(sValue)); - addCardAttributeAndValue(getAttribute(index_HomeAddress2),sValue,resEntry); - - card->GetHomeCity(getter_Copies(sValue)); - addCardAttributeAndValue(getAttribute(index_HomeCity),sValue,resEntry); - - card->GetHomeState(getter_Copies(sValue)); - addCardAttributeAndValue(getAttribute(index_HomeState),sValue,resEntry); - - card->GetHomeZipCode(getter_Copies(sValue)); - addCardAttributeAndValue(getAttribute(index_HomeZipCode),sValue,resEntry); - - card->GetHomeCountry(getter_Copies(sValue)); - addCardAttributeAndValue(getAttribute(index_HomeCountry),sValue,resEntry); - - card->GetWorkAddress(getter_Copies(sValue)); - while ((offset = sValue.FindChar('\r')) >= 0) sValue.Replace(offset, 1, space); - while ((offset = sValue.FindChar('\n')) >= 0) sValue.Replace(offset, 1, space); - addCardAttributeAndValue(getAttribute(index_WorkAddress),sValue,resEntry); - - card->GetWorkAddress2(getter_Copies(sValue)); - addCardAttributeAndValue(getAttribute(index_WorkAddress2),sValue,resEntry); - - card->GetWorkCity(getter_Copies(sValue)); - addCardAttributeAndValue(getAttribute(index_WorkCity),sValue,resEntry); - - card->GetWorkState(getter_Copies(sValue)); - addCardAttributeAndValue(getAttribute(index_WorkState),sValue,resEntry); - - card->GetWorkZipCode(getter_Copies(sValue)); - addCardAttributeAndValue(getAttribute(index_WorkZipCode),sValue,resEntry); - - card->GetWorkCountry(getter_Copies(sValue)); - addCardAttributeAndValue(getAttribute(index_WorkCountry),sValue,resEntry); - - card->GetJobTitle(getter_Copies(sValue)); - addCardAttributeAndValue(getAttribute(index_JobTitle),sValue,resEntry); - - card->GetDepartment(getter_Copies(sValue)); - addCardAttributeAndValue(getAttribute(index_Department),sValue,resEntry); - - card->GetCompany(getter_Copies(sValue)); - addCardAttributeAndValue(getAttribute(index_Company),sValue,resEntry); - - card->GetWebPage1(getter_Copies(sValue)); - addCardAttributeAndValue(getAttribute(index_WebPage1),sValue,resEntry); - - card->GetWebPage2(getter_Copies(sValue)); - addCardAttributeAndValue(getAttribute(index_WebPage2),sValue,resEntry); - - card->GetBirthYear(getter_Copies(sValue)); - addCardAttributeAndValue(getAttribute(index_BirthYear),sValue,resEntry); - - card->GetBirthMonth(getter_Copies(sValue)); - addCardAttributeAndValue(getAttribute(index_BirthMonth),sValue,resEntry); - - card->GetBirthDay(getter_Copies(sValue)); - addCardAttributeAndValue(getAttribute(index_BirthDay),sValue,resEntry); - - card->GetCustom1(getter_Copies(sValue)); - addCardAttributeAndValue(getAttribute(index_Custom1),sValue,resEntry); - - card->GetCustom2(getter_Copies(sValue)); - addCardAttributeAndValue(getAttribute(index_Custom2),sValue,resEntry); - - card->GetCustom3(getter_Copies(sValue)); - addCardAttributeAndValue(getAttribute(index_Custom3),sValue,resEntry); - - card->GetCustom4(getter_Copies(sValue)); - addCardAttributeAndValue(getAttribute(index_Custom4),sValue,resEntry); - - card->GetNotes(getter_Copies(sValue)); - addCardAttributeAndValue(getAttribute(index_Notes),sValue,resEntry); - + MLdapAttributeMap::fillResultFromCard( *resEntry, *card ); resEntry->setCard(card); if (!rowIndex) append( resEntry ); @@ -975,21 +625,8 @@ sal_Bool MQueryHelper::resyncRow(sal_Int32 rowIndex) getCardValues(card,rowIndex); return sal_True; } -void MQueryHelper::addCardAttributeAndValue(const ::rtl::OUString& sName, nsXPIDLString Value, MQueryHelperResultEntry *resEntry) -{ - nsAutoString temp(Value) ; - ::rtl::OUString attrValue; - MTypeConverter::nsStringToOUString( temp, attrValue ); - resEntry->insert( sName, attrValue ); -} - -void MQueryHelper::getCardAttributeAndValue(const ::rtl::OUString& sName, ::rtl::OUString &ouValue, MQueryHelperResultEntry *resEntry) -{ - ouValue = resEntry->getValue( sName); -} - // ------------------------------------------------------------------------- -sal_Int32 MQueryHelper::createNewCard() +sal_Int32 MQueryHelper::createNewCard() { ::osl::MutexGuard aGuard( m_aMutex ); nsresult rv; diff --git a/connectivity/source/drivers/mozab/mozillasrc/MQueryHelper.hxx b/connectivity/source/drivers/mozab/mozillasrc/MQueryHelper.hxx index 2f3f4db2d7c5..c08a110a04c0 100644 --- a/connectivity/source/drivers/mozab/mozillasrc/MQueryHelper.hxx +++ b/connectivity/source/drivers/mozab/mozillasrc/MQueryHelper.hxx @@ -40,6 +40,8 @@ #include <comphelper/stl_types.hxx> #include <osl/thread.hxx> +#include <hash_map> + namespace connectivity { namespace mozab @@ -47,20 +49,20 @@ namespace connectivity class MQueryHelperResultEntry { private: - mutable ::osl::Mutex m_aMutex; + typedef ::std::hash_map< ::rtl::OString, ::rtl::OUString, ::rtl::OStringHash > FieldMap; - DECLARE_STL_USTRINGACCESS_MAP(::rtl::OUString,fieldMap); + mutable ::osl::Mutex m_aMutex; + FieldMap m_Fields; + nsCOMPtr<nsIAbCard> m_Card; + sal_Int32 m_RowStates; - fieldMap m_Fields; - nsCOMPtr<nsIAbCard> m_Card; - sal_Int32 m_RowStates; public: MQueryHelperResultEntry(); ~MQueryHelperResultEntry(); - void insert( const rtl::OUString &key, rtl::OUString &value ); - rtl::OUString getValue( const rtl::OUString &key ) const; - rtl::OUString setValue( const rtl::OUString &key, const rtl::OUString & rValue); + void insert( const rtl::OString &key, rtl::OUString &value ); + rtl::OUString getValue( const rtl::OString &key ) const; + void setValue( const rtl::OString &key, const rtl::OUString & rValue); void setCard(nsIAbCard *card); nsIAbCard *getCard(); @@ -90,8 +92,6 @@ namespace connectivity void clearResultOrComplete(); void notifyResultOrComplete(); sal_Bool waitForResultOrComplete( ); - void addCardAttributeAndValue(const ::rtl::OUString& sName, nsXPIDLString sValue,MQueryHelperResultEntry *resEntry); - void getCardAttributeAndValue(const ::rtl::OUString& sName, ::rtl::OUString &ouValue, MQueryHelperResultEntry *resEntry) ; void getCardValues(nsIAbCard *card,sal_Int32 rowIndex=0); #if OSL_DEBUG_LEVEL > 0 oslThreadIdentifier m_oThreadID; diff --git a/connectivity/source/drivers/mozab/mozillasrc/MTypeConverter.cxx b/connectivity/source/drivers/mozab/mozillasrc/MTypeConverter.cxx index 129cf2d770f5..bd4201ee3729 100644 --- a/connectivity/source/drivers/mozab/mozillasrc/MTypeConverter.cxx +++ b/connectivity/source/drivers/mozab/mozillasrc/MTypeConverter.cxx @@ -51,6 +51,32 @@ void MTypeConverter::ouStringToNsString(::rtl::OUString const &ous, nsString &ns nss = mozString; // temp. } // ------------------------------------------------------------------------- +::rtl::OUString MTypeConverter::nsACStringToOUString( const nsACString& _source ) +{ + const char* buffer = _source.BeginReading();
+ const char* bufferEnd = _source.EndReading();
+ return ::rtl::OUString( buffer, bufferEnd - buffer, RTL_TEXTENCODING_ASCII_US );
+} +// ------------------------------------------------------------------------- +::rtl::OString MTypeConverter::nsACStringToOString( const nsACString& _source ) +{ + const char* buffer = _source.BeginReading();
+ const char* bufferEnd = _source.EndReading();
+ return ::rtl::OString( buffer, bufferEnd - buffer );
+} +// ------------------------------------------------------------------------- +void MTypeConverter::asciiOUStringToNsACString( const ::rtl::OUString& _asciiString, nsACString& _dest ) +{ + ::rtl::OString sAsciiVersion( _asciiString.getStr(), _asciiString.getLength(), RTL_TEXTENCODING_ASCII_US ); + asciiToNsACString( sAsciiVersion.getStr(), _dest ); +} +// ------------------------------------------------------------------------- +void MTypeConverter::asciiToNsACString( const sal_Char* _asciiString, nsACString& _dest ) +{ + _dest.Truncate();
+ _dest.AppendASCII( _asciiString );
+} +// ------------------------------------------------------------------------- void MTypeConverter::nsStringToOUString(nsString const &nss, ::rtl::OUString &ous) { // Get clone of buffer. @@ -58,7 +84,8 @@ void MTypeConverter::nsStringToOUString(nsString const &nss, ::rtl::OUString &ou sal_Int32 nssLen = nss.Length(); // TODO check if this is ok. - ::rtl::OUString _ous(uc, nssLen); + // PRUnichar != sal_Unicode in mingw + ::rtl::OUString _ous(reinterpret_cast_mingw_only<sal_Unicode *>(uc), nssLen); ous = _ous; nsMemory::Free(uc); @@ -67,7 +94,8 @@ void MTypeConverter::nsStringToOUString(nsString const &nss, ::rtl::OUString &ou void MTypeConverter::prUnicharToOUString(PRUnichar const *pru, ::rtl::OUString &ous) { // TODO, specify length. - ::rtl::OUString _ous(pru); + // PRUnichar != sal_Unicode in mingw + ::rtl::OUString _ous(reinterpret_cast_mingw_only<const sal_Unicode *>(pru)); ous = _ous; } // ------------------------------------------------------------------------- diff --git a/connectivity/source/drivers/mozab/mozillasrc/MTypeConverter.hxx b/connectivity/source/drivers/mozab/mozillasrc/MTypeConverter.hxx index 792934ee1229..dab5af9645df 100644 --- a/connectivity/source/drivers/mozab/mozillasrc/MTypeConverter.hxx +++ b/connectivity/source/drivers/mozab/mozillasrc/MTypeConverter.hxx @@ -54,6 +54,11 @@ namespace connectivity static ::std::string ouStringToStlString(const ::rtl::OUString&); static ::std::string nsStringToStlString(const nsString&); + static ::rtl::OUString nsACStringToOUString( const nsACString& _source ); + static ::rtl::OString nsACStringToOString( const nsACString& _source ); + static void asciiOUStringToNsACString( const ::rtl::OUString& _asciiString, nsACString& _dest ); + static void asciiToNsACString( const sal_Char* _asciiString, nsACString& _dest ); + private: MTypeConverter() {}; }; diff --git a/connectivity/source/drivers/mozab/mozillasrc/makefile.mk b/connectivity/source/drivers/mozab/mozillasrc/makefile.mk index 764081619770..e350365d3442 100644 --- a/connectivity/source/drivers/mozab/mozillasrc/makefile.mk +++ b/connectivity/source/drivers/mozab/mozillasrc/makefile.mk @@ -71,10 +71,13 @@ SLOFILES = \ $(SLO)$/MQuery.obj \ $(SLO)$/MTypeConverter.obj \ $(SLO)$/MNameMapper.obj \ - $(SLO)$/MNSMozabProxy.obj \ - $(SLO)$/MNSTerminateListener.obj + $(SLO)$/MNSMozabProxy.obj \ + $(SLO)$/MNSTerminateListener.obj \ + $(SLO)$/MLdapAttributeMap.obj \ +CDEFS += -DMOZILLA_INTERNAL_API + .IF "$(GUI)"=="UNX" .IF "$(COMNAME)"=="sunpro5" CFLAGS += -features=tmplife @@ -154,7 +157,7 @@ CFLAGS += -fPIC CFLAGSCXX += \ -fno-rtti -Wconversion -Wpointer-arith \ -Wcast-align -Woverloaded-virtual -Wsynth \ - -Wno-long-long + -Wno-long-long -Wno-deprecated CDEFS += -DTRACING .ENDIF .ENDIF diff --git a/connectivity/source/drivers/mozab/post_include_mozilla.h b/connectivity/source/drivers/mozab/post_include_mozilla.h index 3de12f1122bc..25af3fb86d7d 100644 --- a/connectivity/source/drivers/mozab/post_include_mozilla.h +++ b/connectivity/source/drivers/mozab/post_include_mozilla.h @@ -47,3 +47,15 @@ #define _DEBUG _DEBUG_WAS_DEFINED #endif +#ifndef _CONNECTIVITY_MOZILLA_REINTERPRET_CAST_MINGW_ONLY_ +#define _CONNECTIVITY_MOZILLA_REINTERPRET_CAST_MINGW_ONLY_ + +#ifdef __cplusplus +#ifdef __MINGW32__ +template<class T1, class T2> T1 inline reinterpret_cast_mingw_only(T2 p) { return reinterpret_cast<T1>(p); } +#else +template<class T1, class T2> T1 inline reinterpret_cast_mingw_only(T2 p) { return p; } +#endif +#endif + +#endif diff --git a/connectivity/source/drivers/mozab/pre_include_mozilla.h b/connectivity/source/drivers/mozab/pre_include_mozilla.h index 50f3848e4059..b175f654d345 100644 --- a/connectivity/source/drivers/mozab/pre_include_mozilla.h +++ b/connectivity/source/drivers/mozab/pre_include_mozilla.h @@ -38,18 +38,28 @@ // Turn off DEBUG Assertions #ifdef _DEBUG #define _DEBUG_WAS_DEFINED _DEBUG - #undef _DEBUG + #ifndef MOZILLA_ENABLE_DEBUG + #undef _DEBUG + #endif #else #undef _DEBUG_WAS_DEFINED + #ifdef MOZILLA_ENABLE_DEBUG + #define _DEBUG 1 + #endif #endif // and turn off the additional virtual methods which are part of some interfaces when compiled // with debug #ifdef DEBUG #define DEBUG_WAS_DEFINED DEBUG - #undef DEBUG + #ifndef MOZILLA_ENABLE_DEBUG + #undef DEBUG + #endif #else #undef DEBUG_WAS_DEFINED + #ifdef MOZILLA_ENABLE_DEBUG + #define DEBUG 1 + #endif #endif #if defined __GNUC__ diff --git a/connectivity/source/drivers/mysql/makefile.mk b/connectivity/source/drivers/mysql/makefile.mk index 9a24864a9bba..0d46f0c35dbb 100644 --- a/connectivity/source/drivers/mysql/makefile.mk +++ b/connectivity/source/drivers/mysql/makefile.mk @@ -42,7 +42,7 @@ VISIBILITY_HIDDEN=TRUE ENVCFLAGS+=/FR$(SLO)$/ .ENDIF -.INCLUDE : settings.mk +.INCLUDE : $(PRJ)$/makefile.pmk .INCLUDE : $(PRJ)$/version.mk @@ -83,6 +83,6 @@ DEF1EXPORTFILE= exports.dxp # --- Targets ---------------------------------- -.INCLUDE : target.mk +.INCLUDE : $(PRJ)$/target.pmk diff --git a/connectivity/source/drivers/mysql/mysql.xcu b/connectivity/source/drivers/mysql/mysql.xcu new file mode 100644 index 000000000000..c730df2af5c7 --- /dev/null +++ b/connectivity/source/drivers/mysql/mysql.xcu @@ -0,0 +1,177 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!--*********************************************************************** + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: DataAccess.xcu,v $ + * $Revision: 1.27 $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************ --> +<oor:component-data oor:name="Drivers" oor:package="org.openoffice.Office.DataAccess" xmlns:oor="http://openoffice.org/2001/registry" xmlns:xs="http://www.w3.org/2001/XMLSchema"> + <node oor:name="Installed"> + <node oor:name="sdbc:mysql:jdbc:*" oor:op="replace"> + <prop oor:name="Driver"> + <value>org.openoffice.comp.drivers.MySQL.Driver</value> + </prop> + <prop oor:name="DriverTypeDisplayName" oor:type="xs:string"> + <value xml:lang="en-US">MySQL (JDBC)</value> + </prop> + <node oor:name="Properties"> + <node oor:name="CharSet" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:string"> + <value></value> + </prop> + </node> + <node oor:name="JavaDriverClass" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:string"> + <value>com.mysql.jdbc.Driver</value> + </prop> + </node> + </node> + <node oor:name="Features"> + <node oor:name="UseKeywordAsBeforeAlias" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:boolean"> + <value>true</value> + </prop> + </node> + <node oor:name="IgnoreDriverPrivileges" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:boolean"> + <value>true</value> + </prop> + </node> + <node oor:name="DisplayVersionColumns" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:boolean"> + <value>true</value> + </prop> + </node> + <node oor:name="UseDOSLineEnds" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:boolean"> + <value>true</value> + </prop> + </node> + <node oor:name="BooleanComparisonMode" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:boolean"> + <value>true</value> + </prop> + </node> + <node oor:name="FormsCheckRequiredFields" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:boolean"> + <value>true</value> + </prop> + </node> + <node oor:name="EscapeDateTime" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:boolean"> + <value>true</value> + </prop> + </node> + </node> + <node oor:name="MetaData"> + <node oor:name="SupportsTableCreation" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:boolean"> + <value>true</value> + </prop> + </node> + <node oor:name="UseJava" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:boolean"> + <value>true</value> + </prop> + </node> + <node oor:name="Authentication" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:string"> + <value>UserPassword</value> + </prop> + </node> + </node> + </node> + <node oor:name="sdbc:mysql:odbc:*" oor:op="replace"> + <prop oor:name="Driver"> + <value>org.openoffice.comp.drivers.MySQL.Driver</value> + </prop> + <prop oor:name="DriverTypeDisplayName" oor:type="xs:string"> + <value xml:lang="en-US">MySQL (ODBC)</value> + </prop> + <node oor:name="Properties"> + <node oor:name="CharSet" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:string"> + <value></value> + </prop> + </node> + </node> + <node oor:name="Features"> + <node oor:name="UseKeywordAsBeforeAlias" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:boolean"> + <value>true</value> + </prop> + </node> + <node oor:name="IgnoreDriverPrivileges" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:boolean"> + <value>true</value> + </prop> + </node> + <node oor:name="DisplayVersionColumns" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:boolean"> + <value>true</value> + </prop> + </node> + <node oor:name="UseDOSLineEnds" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:boolean"> + <value>true</value> + </prop> + </node> + <node oor:name="BooleanComparisonMode" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:boolean"> + <value>true</value> + </prop> + </node> + <node oor:name="FormsCheckRequiredFields" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:boolean"> + <value>true</value> + </prop> + </node> + <node oor:name="EscapeDateTime" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:boolean"> + <value>true</value> + </prop> + </node> + </node> + <node oor:name="MetaData"> + <node oor:name="SupportsTableCreation" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:boolean"> + <value>true</value> + </prop> + </node> + <node oor:name="SupportsBrowsing" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:boolean"> + <value>true</value> + </prop> + </node> + <node oor:name="Authentication" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:string"> + <value>UserPassword</value> + </prop> + </node> + </node> + </node> + </node> +</oor:component-data> diff --git a/connectivity/source/drivers/odbc/makefile.mk b/connectivity/source/drivers/odbc/makefile.mk index f84f2a725d67..8f37b6185d5e 100644 --- a/connectivity/source/drivers/odbc/makefile.mk +++ b/connectivity/source/drivers/odbc/makefile.mk @@ -45,7 +45,7 @@ LDUMP=ldump2.exe ENVCFLAGS+=/FR$(SLO)$/ .ENDIF -.INCLUDE : settings.mk +.INCLUDE : $(PRJ)$/makefile.pmk .INCLUDE : $(PRJ)$/version.mk .IF "$(SYSTEM_ODBC_HEADERS)" == "YES" @@ -79,4 +79,4 @@ SHL1VERSIONMAP=odbc.map # --- Targets ---------------------------------- -.INCLUDE : target.mk +.INCLUDE : $(PRJ)$/target.pmk diff --git a/connectivity/source/drivers/odbc/odbc.xcu b/connectivity/source/drivers/odbc/odbc.xcu new file mode 100644 index 000000000000..cf306f10d57f --- /dev/null +++ b/connectivity/source/drivers/odbc/odbc.xcu @@ -0,0 +1,173 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!--*********************************************************************** + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2008 by Sun Microsystems, Inc. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * $RCSfile: DataAccess.xcu,v $ + * $Revision: 1.27 $ + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************ --> +<oor:component-data oor:name="Drivers" oor:package="org.openoffice.Office.DataAccess" xmlns:oor="http://openoffice.org/2001/registry" xmlns:xs="http://www.w3.org/2001/XMLSchema"> + <node oor:name="Installed"> + <node oor:name="sdbc:odbc:*" oor:op="replace"> + <prop oor:name="Driver"> + <value>com.sun.star.comp.sdbc.ODBCDriver</value> + </prop> + <prop oor:name="DriverTypeDisplayName" oor:type="xs:string"> + <value xml:lang="en-US">ODBC</value> + </prop> + <node oor:name="Properties"> + <node oor:name="CharSet" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:string"> + <value></value> + </prop> + </node> + <node oor:name="SystemDriverSettings" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:string"> + <value></value> + </prop> + </node> + <node oor:name="UseCatalog" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:boolean"> + <value>false</value> + </prop> + </node> + <node oor:name="AutoIncrementCreation" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:string"> + <value></value> + </prop> + </node> + <node oor:name="AutoRetrievingStatement" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:string"> + <value></value> + </prop> + </node> + <node oor:name="IsAutoRetrievingEnabled" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:boolean"> + <value>false</value> + </prop> + </node> + <node oor:name="AddIndexAppendix" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:boolean"> + <value>true</value> + </prop> + </node> + </node> + <node oor:name="Features"> + <node oor:name="GeneratedValues" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:boolean"> + <value>true</value> + </prop> + </node> + <node oor:name="UseSQL92NamingConstraints" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:boolean"> + <value>true</value> + </prop> + </node> + <node oor:name="AppendTableAliasInSelect" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:boolean"> + <value>true</value> + </prop> + </node> + <node oor:name="UseKeywordAsBeforeAlias" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:boolean"> + <value>true</value> + </prop> + </node> + <node oor:name="UseBracketedOuterJoinSyntax" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:boolean"> + <value>true</value> + </prop> + </node> + <node oor:name="IgnoreDriverPrivileges" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:boolean"> + <value>true</value> + </prop> + </node> + <node oor:name="ParameterNameSubstitution" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:boolean"> + <value>true</value> + </prop> + </node> + <node oor:name="DisplayVersionColumns" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:boolean"> + <value>true</value> + </prop> + </node> + <node oor:name="UseCatalogInSelect" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:boolean"> + <value>true</value> + </prop> + </node> + <node oor:name="UseSchemaInSelect" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:boolean"> + <value>true</value> + </prop> + </node> + <node oor:name="UseIndexDirectionKeyword" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:boolean"> + <value>true</value> + </prop> + </node> + <node oor:name="UseDOSLineEnds" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:boolean"> + <value>true</value> + </prop> + </node> + <node oor:name="BooleanComparisonMode" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:boolean"> + <value>true</value> + </prop> + </node> + <node oor:name="FormsCheckRequiredFields" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:boolean"> + <value>true</value> + </prop> + </node> + <node oor:name="EscapeDateTime" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:boolean"> + <value>true</value> + </prop> + </node> + </node> + <node oor:name="MetaData"> + <node oor:name="SupportsTableCreation" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:boolean"> + <value>true</value> + </prop> + </node> + <node oor:name="SupportsBrowsing" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:boolean"> + <value>true</value> + </prop> + </node> + <node oor:name="Authentication" oor:op="replace"> + <prop oor:name="Value" oor:type="xs:string"> + <value>UserPassword</value> + </prop> + </node> + </node> + </node> + </node> +</oor:component-data> diff --git a/connectivity/source/drivers/odbcbase/OTools.cxx b/connectivity/source/drivers/odbcbase/OTools.cxx index ce03fa325019..f72aec64e7dc 100644 --- a/connectivity/source/drivers/odbcbase/OTools.cxx +++ b/connectivity/source/drivers/odbcbase/OTools.cxx @@ -37,6 +37,8 @@ #include "odbc/OConnection.hxx" #include "diagnose_ex.h" #include <rtl/logfile.hxx> +#include <rtl/ustrbuf.hxx> + #include <string.h> #include <string> @@ -544,7 +546,7 @@ Sequence<sal_Int8> OTools::getBytesValue(OConnection* _pConnection, rtl_TextEncoding _nTextEncoding) throw(SQLException, RuntimeException) { RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "odbc", "Ocke.Janssen@sun.com", "OTools::getStringValue" ); - ::rtl::OUString aData; + ::rtl::OUStringBuffer aData; switch(_fSqlType) { case SQL_WVARCHAR: @@ -599,7 +601,7 @@ Sequence<sal_Int8> OTools::getBytesValue(OConnection* _pConnection, nLen = pcbValue != SQL_NO_TOTAL ? std::min(pcbValue, nMaxLen) : (nMaxLen-1); waCharArray[nLen] = 0; - aData += ::rtl::OUString(waCharArray); + aData.append(::rtl::OUString(waCharArray)); } } break; @@ -648,7 +650,7 @@ Sequence<sal_Int8> OTools::getBytesValue(OConnection* _pConnection, --nLen; aCharArray[nLen] = 0; - aData += ::rtl::OUString((const sal_Char*)aCharArray,nLen,_nTextEncoding); + aData.append(::rtl::OUString((const sal_Char*)aCharArray,nLen,_nTextEncoding)); } // delete all blanks @@ -656,7 +658,7 @@ Sequence<sal_Int8> OTools::getBytesValue(OConnection* _pConnection, } } - return aData; + return aData.makeStringAndClear(); } // ------------------------------------------------------------------------- void OTools::GetInfo(OConnection* _pConnection, diff --git a/connectivity/source/inc/file/fcode.hxx b/connectivity/source/inc/file/fcode.hxx index f916beb91aae..1869a45ca4c5 100644 --- a/connectivity/source/inc/file/fcode.hxx +++ b/connectivity/source/inc/file/fcode.hxx @@ -236,6 +236,16 @@ namespace connectivity virtual sal_Bool operate(const OOperand*, const OOperand*) const; }; + class OOp_NOT : public OBoolOperator + { + public: + TYPEINFO(); + + protected: + virtual void Exec(OCodeStack&); + virtual sal_Bool operate(const OOperand*, const OOperand* = NULL) const; + virtual sal_uInt16 getRequestedOperands() const; + }; class OOp_AND : public OBoolOperator { diff --git a/connectivity/source/inc/flat/ETable.hxx b/connectivity/source/inc/flat/ETable.hxx index b52898655111..5d34cfd75b1d 100644 --- a/connectivity/source/inc/flat/ETable.hxx +++ b/connectivity/source/inc/flat/ETable.hxx @@ -87,6 +87,7 @@ namespace connectivity virtual sal_Bool seekRow(IResultSetHelper::Movement eCursorPosition, sal_Int32 nOffset, sal_Int32& nCurPos); virtual sal_Bool fetchRow(OValueRefRow& _rRow,const OSQLColumns& _rCols, sal_Bool bIsTable,sal_Bool bRetrieveData); + virtual void refreshHeader(); virtual ::com::sun::star::uno::Any SAL_CALL queryInterface( const ::com::sun::star::uno::Type & rType ) throw(::com::sun::star::uno::RuntimeException); //XTypeProvider diff --git a/connectivity/source/manager/makefile.mk b/connectivity/source/manager/makefile.mk index ce16b2f887d8..7cb514cd3696 100644 --- a/connectivity/source/manager/makefile.mk +++ b/connectivity/source/manager/makefile.mk @@ -35,6 +35,7 @@ PRJNAME=connectivity TARGET=sdbc ENABLE_EXCEPTIONS=TRUE +VISIBILITY_HIDDEN=TRUE # --- Settings ---------------------------------- .IF "$(DBGUTIL_OJ)"!="" @@ -62,6 +63,8 @@ SHL1STDLIBS=\ $(CPPULIB) \ $(CPPUHELPERLIB) \ $(COMPHELPERLIB) \ + $(DBTOOLSLIB) \ + $(UNOTOOLSLIB) \ $(SALLIB) SHL1DEPN= diff --git a/connectivity/source/manager/mdrivermanager.cxx b/connectivity/source/manager/mdrivermanager.cxx index 3cc251659854..d62f6294e5f8 100644 --- a/connectivity/source/manager/mdrivermanager.cxx +++ b/connectivity/source/manager/mdrivermanager.cxx @@ -278,13 +278,26 @@ Any SAL_CALL ODriverEnumeration::nextElement( ) throw(NoSuchElementException, W } }; + /// and STL argorithm compatible predicate comparing a DriverAccess' impl name to a string + struct EqualDriverAccessToName : public ::std::binary_function< DriverAccess, ::rtl::OUString, bool > + { + ::rtl::OUString m_sImplName; + EqualDriverAccessToName(const ::rtl::OUString& _sImplName) : m_sImplName(_sImplName){} + //................................................................. + bool operator()( const DriverAccess& lhs) + { + return lhs.sImplementationName.equals(m_sImplName); + } + }; + //========================================================================== //= OSDBCDriverManager //========================================================================== //-------------------------------------------------------------------------- - OSDBCDriverManager::OSDBCDriverManager( const Reference< XComponentContext >& _rxContext ) +OSDBCDriverManager::OSDBCDriverManager( const Reference< XComponentContext >& _rxContext ) :m_aContext( _rxContext ) ,m_aEventLogger( _rxContext, "org.openoffice.logging.sdbc.DriverManager" ) + ,m_aDriverConfig(m_aContext.getLegacyServiceFactory()) ,m_nLoginTimeout(0) { // bootstrap all objects supporting the .sdb.Driver service @@ -375,7 +388,7 @@ void OSDBCDriverManager::bootstrapDrivers() //-------------------------------------------------------------------------- void OSDBCDriverManager::initializeDriverPrecedence() { - if (!m_aDriversBS.size()) + if ( m_aDriversBS.empty() ) // nothing to do return; @@ -420,7 +433,7 @@ void OSDBCDriverManager::initializeDriverPrecedence() { // we have a DriverAccess with this impl name OSL_ENSURE( ::std::distance( aPos.first, aPos.second ) == 1, - "OSDBCDriverManager::initializeDriverPrecedence: move than one driver with this impl name? How this?" ); + "OSDBCDriverManager::initializeDriverPrecedence: more than one driver with this impl name? How this?" ); // move the DriverAccess pointed to by aPos.first to the position pointed to by aNoPrefDriversStart if ( aPos.first != aNoPrefDriversStart ) @@ -686,17 +699,29 @@ Reference< XDriver > OSDBCDriverManager::implGetDriverForURL(const ::rtl::OUStri Reference< XDriver > xReturn; { - // search all bootstrapped drivers - DriverAccessArrayIterator aPos = ::std::find_if( - m_aDriversBS.begin(), // begin of search range - m_aDriversBS.end(), // end of search range - std::unary_compose< AcceptsURL, ExtractAfterLoad >( AcceptsURL( _rURL ), ExtractAfterLoad() ) - // compose two functors: extract the driver from the access, then ask the resulting driver for acceptance - ); + const ::rtl::OUString sDriverFactoryName = m_aDriverConfig.getDriverFactoryName(_rURL); + + EqualDriverAccessToName aEqual(sDriverFactoryName); + DriverAccessArray::iterator aFind = ::std::find_if(m_aDriversBS.begin(),m_aDriversBS.end(),aEqual); + if ( aFind == m_aDriversBS.end() ) + { + // search all bootstrapped drivers + aFind = ::std::find_if( + m_aDriversBS.begin(), // begin of search range + m_aDriversBS.end(), // end of search range + std::unary_compose< AcceptsURL, ExtractAfterLoad >( AcceptsURL( _rURL ), ExtractAfterLoad() ) + // compose two functors: extract the driver from the access, then ask the resulting driver for acceptance + ); + } // if ( m_aDriversBS.find(sDriverFactoryName ) == m_aDriversBS.end() ) + else + { + EnsureDriver aEnsure; + aEnsure(*aFind); + } // found something? - if ( m_aDriversBS.end() != aPos ) - xReturn = aPos->xDriver; + if ( m_aDriversBS.end() != aFind ) + xReturn = aFind->xDriver; } if ( !xReturn.is() ) diff --git a/connectivity/source/manager/mdrivermanager.hxx b/connectivity/source/manager/mdrivermanager.hxx index fef1e1b82429..369b8260f302 100644 --- a/connectivity/source/manager/mdrivermanager.hxx +++ b/connectivity/source/manager/mdrivermanager.hxx @@ -44,6 +44,7 @@ #include <comphelper/logging.hxx> #include <comphelper/componentcontext.hxx> #include <osl/mutex.hxx> +#include "connectivity/DriversConfig.hxx" namespace drivermanager { @@ -81,16 +82,15 @@ namespace drivermanager ::comphelper::EventLogger m_aEventLogger; DECLARE_STL_VECTOR(DriverAccess, DriverAccessArray); - DriverAccessArray m_aDriversBS; + DriverAccessArray m_aDriversBS; // for drivers registered at runtime (not bootstrapped) we don't require an XServiceInfo interface, // so we have to remember their impl-name in another way DECLARE_STL_USTRINGACCESS_MAP(SdbcDriver, DriverCollection); DriverCollection m_aDriversRT; - ::com::sun::star::uno::Reference< ::com::sun::star::uno::XComponentContext > - m_xServiceFactory; - sal_Int32 m_nLoginTimeout; + ::connectivity::DriversConfig m_aDriverConfig; + sal_Int32 m_nLoginTimeout; private: OSDBCDriverManager( diff --git a/connectivity/source/manager/mregistration.cxx b/connectivity/source/manager/mregistration.cxx index 89a7507600f7..4a305267df14 100644 --- a/connectivity/source/manager/mregistration.cxx +++ b/connectivity/source/manager/mregistration.cxx @@ -48,13 +48,13 @@ extern "C" { //--------------------------------------------------------------------------------------- - void SAL_CALL component_getImplementationEnvironment(const sal_Char** _ppEnvTypeName, uno_Environment** /*_ppEnv*/) +SAL_DLLPUBLIC_EXPORT void SAL_CALL component_getImplementationEnvironment(const sal_Char** _ppEnvTypeName, uno_Environment** /*_ppEnv*/) { *_ppEnvTypeName = CPPU_CURRENT_LANGUAGE_BINDING_NAME; } //--------------------------------------------------------------------------------------- -sal_Bool SAL_CALL component_writeInfo(void* /*_pServiceManager*/, com::sun::star::registry::XRegistryKey* _pRegistryKey) +SAL_DLLPUBLIC_EXPORT sal_Bool SAL_CALL component_writeInfo(void* /*_pServiceManager*/, com::sun::star::registry::XRegistryKey* _pRegistryKey) { @@ -86,7 +86,7 @@ sal_Bool SAL_CALL component_writeInfo(void* /*_pServiceManager*/, com::sun::star } //--------------------------------------------------------------------------------------- -void* SAL_CALL component_getFactory(const sal_Char* _pImplName, ::com::sun::star::lang::XMultiServiceFactory* _pServiceManager, void* /*_pRegistryKey*/) +SAL_DLLPUBLIC_EXPORT void* SAL_CALL component_getFactory(const sal_Char* _pImplName, ::com::sun::star::lang::XMultiServiceFactory* _pServiceManager, void* /*_pRegistryKey*/) { void* pRet = NULL; diff --git a/connectivity/source/parse/sqlbison.y b/connectivity/source/parse/sqlbison.y index a42c3cb2302c..be1ee39d9ba2 100644 --- a/connectivity/source/parse/sqlbison.y +++ b/connectivity/source/parse/sqlbison.y @@ -107,7 +107,7 @@ static connectivity::OSQLInternalNode* newNode(const sal_Char* pNewValue, const connectivity::SQLNodeType eNodeType, const sal_uInt32 nNodeID = 0) { - + OSL_TRACE("connectivity: Rule Number: %d,%d",eNodeType,nNodeID); return new connectivity::OSQLInternalNode(pNewValue, eNodeType, nNodeID); } @@ -115,7 +115,7 @@ static connectivity::OSQLInternalNode* newNode(const ::rtl::OString& _NewValue, const connectivity::SQLNodeType eNodeType, const sal_uInt32 nNodeID = 0) { - + OSL_TRACE("connectivity: Rule Number: %d,%d",eNodeType,nNodeID); return new connectivity::OSQLInternalNode(_NewValue, eNodeType, nNodeID); } @@ -123,7 +123,7 @@ static connectivity::OSQLInternalNode* newNode(const ::rtl::OUString& _NewValue, const connectivity::SQLNodeType eNodeType, const sal_uInt32 nNodeID = 0) { - + OSL_TRACE("connectivity: Rule Number: %d,%d",eNodeType,nNodeID); return new connectivity::OSQLInternalNode(_NewValue, eNodeType, nNodeID); } @@ -209,7 +209,7 @@ using namespace connectivity; /* numeric functions */ %token <pParseNode> SQL_TOKEN_ABS SQL_TOKEN_ACOS SQL_TOKEN_ASIN SQL_TOKEN_ATAN SQL_TOKEN_ATAN2 SQL_TOKEN_CEILING -%token <pParseNode> SQL_TOKEN_COS SQL_TOKEN_COT SQL_TOKEN_DEGREES SQL_TOKEN_EXP SQL_TOKEN_DIV SQL_TOKEN_FLOOR SQL_TOKEN_LOGF SQL_TOKEN_LOG SQL_TOKEN_LN +%token <pParseNode> SQL_TOKEN_COS SQL_TOKEN_COT SQL_TOKEN_DEGREES SQL_TOKEN_EXP SQL_TOKEN_FLOOR SQL_TOKEN_LOGF SQL_TOKEN_LOG SQL_TOKEN_LN %token <pParseNode> SQL_TOKEN_LOG10 SQL_TOKEN_MOD SQL_TOKEN_PI SQL_TOKEN_POWER SQL_TOKEN_RADIANS SQL_TOKEN_RAND SQL_TOKEN_ROUNDMAGIC %token <pParseNode> SQL_TOKEN_ROUND SQL_TOKEN_SIGN SQL_TOKEN_SIN SQL_TOKEN_SQRT SQL_TOKEN_TAN SQL_TOKEN_TRUNCATE @@ -676,15 +676,12 @@ manipulative_statement_list: ; ***/ -/*sql: - {$$ = SQL_NEW_LISTRULE;} - ; -*/ sql_not: {$$ = SQL_NEW_RULE;} | SQL_TOKEN_NOT ; - /* manipulative statements */ + +/* manipulative statements */ sql: manipulative_statement ; @@ -767,10 +764,12 @@ insert_statement: $$->append($5);} ; values_or_query_spec: - SQL_TOKEN_VALUES table_value_const_list + SQL_TOKEN_VALUES '(' table_value_const_list ')' {$$ = SQL_NEW_RULE; $$->append($1); - $$->append($2); + $$->append($2 = newNode("(", SQL_NODE_PUNCTUATION)); + $$->append($3); + $$->append($4 = newNode(")", SQL_NODE_PUNCTUATION)); } ; @@ -792,18 +791,14 @@ row_value_const_list: ; row_value_constructor: row_value_constructor_elem - | '(' row_value_const_list ')' +/* | '(' row_value_const_list ')' { $$ = SQL_NEW_RULE; $$->append($1 = newNode("(", SQL_NODE_PUNCTUATION)); $$->append($2); $$->append($3 = newNode(")", SQL_NODE_PUNCTUATION)); } -/* | subquery - { - $$ = SQL_NEW_RULE; - $$->append($1); - }*/ + */ ; row_value_constructor_elem: value_exp /*[^')']*/ @@ -1053,47 +1048,16 @@ truth_value: ; boolean_primary: predicate - | '(' search_condition ')' - { + | '(' search_condition ')' + { // boolean_primary: rule 2 $$ = SQL_NEW_RULE; $$->append($1 = newNode("(", SQL_NODE_PUNCTUATION)); $$->append($2); $$->append($3 = newNode(")", SQL_NODE_PUNCTUATION)); } - ; - -boolean_test: - boolean_primary - | boolean_primary SQL_TOKEN_IS sql_not truth_value - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - $$->append($3); - $$->append($4); - } - ; -boolean_factor: - boolean_test - | SQL_TOKEN_NOT boolean_test - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - } - ; -boolean_term: - boolean_factor - | boolean_term SQL_TOKEN_AND boolean_factor - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - $$->append($3); - } | row_value_constructor_elem /*[^')' ',']*/ { - if(xxx_pGLOBAL_SQLPARSER->inPredicateCheck()) + if(xxx_pGLOBAL_SQLPARSER->inPredicateCheck())// boolean_primary: rule 3 { $$ = SQL_NEW_RULE; sal_Int16 nErg = xxx_pGLOBAL_SQLPARSER->buildComparsionRule($$,$1); @@ -1115,54 +1079,43 @@ boolean_term: else YYERROR; } - | boolean_term SQL_TOKEN_AND literal - { - if(xxx_pGLOBAL_SQLPARSER->inPredicateCheck()) - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - sal_Int16 nErg = xxx_pGLOBAL_SQLPARSER->buildComparsionRule($$,$3); - if(nErg < 1) - { - delete $$; - if(nErg) - YYERROR; - else - YYABORT; - } - } - else - YYERROR; + ; +boolean_test: + boolean_primary + | boolean_primary SQL_TOKEN_IS sql_not truth_value + { + $$ = SQL_NEW_RULE; + $$->append($1); + $$->append($2); + $$->append($3); + $$->append($4); } - | boolean_term SQL_TOKEN_AND SQL_TOKEN_STRING + ; +boolean_factor: + boolean_test + | SQL_TOKEN_NOT boolean_test + { // boolean_factor: rule 1 + $$ = SQL_NEW_RULE; + $$->append($1); + $$->append($2); + } + ; +boolean_term: + boolean_factor + | boolean_term SQL_TOKEN_AND boolean_factor { - if(xxx_pGLOBAL_SQLPARSER->inPredicateCheck()) - { - $$ = SQL_NEW_RULE; - $$->append($1); - $$->append($2); - sal_Int16 nErg = xxx_pGLOBAL_SQLPARSER->buildComparsionRule($$,$3); - if(nErg < 1) - { - delete $$; - if(nErg) - YYERROR; - else - YYABORT; - } - } - else - YYERROR; - + $$ = SQL_NEW_RULE; // boolean_term: rule 1 + $$->append($1); + $$->append($2); + $$->append($3); } ; search_condition: boolean_term | search_condition SQL_TOKEN_OR boolean_term { - $$ = SQL_NEW_RULE; + $$ = SQL_NEW_RULE; // search_condition $$->append($1); $$->append($2); $$->append($3); @@ -1182,14 +1135,14 @@ predicate: comparison_predicate: row_value_constructor comparison row_value_constructor { - $$ = SQL_NEW_RULE; + $$ = SQL_NEW_RULE; // comparison_predicate: rule 1 $$->append($1); $$->append($2); $$->append($3); } | comparison row_value_constructor { - if(xxx_pGLOBAL_SQLPARSER->inPredicateCheck()) + if(xxx_pGLOBAL_SQLPARSER->inPredicateCheck()) // comparison_predicate: rule 2 { $$ = SQL_NEW_RULE; sal_Int16 nErg = xxx_pGLOBAL_SQLPARSER->buildPredicateRule($$,$2,$1); @@ -1221,7 +1174,7 @@ comparison: ; between_predicate: row_value_constructor sql_not SQL_TOKEN_BETWEEN row_value_constructor SQL_TOKEN_AND row_value_constructor - {$$ = SQL_NEW_RULE; + {$$ = SQL_NEW_RULE; // between_predicate: rule 1 $$->append($1); $$->append($2); $$->append($3); @@ -1231,7 +1184,7 @@ between_predicate: } | sql_not SQL_TOKEN_BETWEEN row_value_constructor SQL_TOKEN_AND row_value_constructor { - if (xxx_pGLOBAL_SQLPARSER->inPredicateCheck()) + if (xxx_pGLOBAL_SQLPARSER->inPredicateCheck()) // between_predicate: rule 2 { $$ = SQL_NEW_RULE; @@ -1258,7 +1211,7 @@ between_predicate: like_predicate: row_value_constructor SQL_TOKEN_NOT SQL_TOKEN_LIKE string_value_exp opt_escape { - $$ = SQL_NEW_RULE; + $$ = SQL_NEW_RULE; // like_predicate: rule 1 $$->append($1); $$->append($2); $$->append($3); @@ -1267,7 +1220,7 @@ like_predicate: } | row_value_constructor SQL_TOKEN_LIKE string_value_exp opt_escape { - $$ = SQL_NEW_RULE; + $$ = SQL_NEW_RULE; // like_predicate: rule 2 $$->append($1); $$->append($2); $$->append($3); @@ -1275,7 +1228,7 @@ like_predicate: } | row_value_constructor SQL_TOKEN_NOT SQL_TOKEN_LIKE value_exp_primary opt_escape { - $$ = SQL_NEW_RULE; + $$ = SQL_NEW_RULE; // like_predicate: rule 3 $$->append($1); $$->append($2); $$->append($3); @@ -1284,7 +1237,7 @@ like_predicate: } | row_value_constructor SQL_TOKEN_LIKE value_exp_primary opt_escape { - $$ = SQL_NEW_RULE; + $$ = SQL_NEW_RULE; // like_predicate: rule 4 $$->append($1); $$->append($2); $$->append($3); @@ -1292,7 +1245,7 @@ like_predicate: } | sql_not SQL_TOKEN_LIKE string_value_exp opt_escape { - if (xxx_pGLOBAL_SQLPARSER->inPredicateCheck()) + if (xxx_pGLOBAL_SQLPARSER->inPredicateCheck()) // like_predicate: rule 5 { OSQLParseNode* pColumnRef = newNode(aEmptyString, SQL_NODE_RULE,OSQLParser::RuleID(OSQLParseNode::column_ref)); pColumnRef->append(newNode(xxx_pGLOBAL_SQLPARSER->getFieldName(),SQL_NODE_NAME)); @@ -1314,7 +1267,7 @@ like_predicate: } | sql_not SQL_TOKEN_LIKE value_exp_primary opt_escape { - if (xxx_pGLOBAL_SQLPARSER->inPredicateCheck()) + if (xxx_pGLOBAL_SQLPARSER->inPredicateCheck()) // like_predicate: rule 6 { OSQLParseNode* pColumnRef = newNode(aEmptyString, SQL_NODE_RULE,OSQLParser::RuleID(OSQLParseNode::column_ref)); pColumnRef->append(newNode(xxx_pGLOBAL_SQLPARSER->getFieldName(),SQL_NODE_NAME)); @@ -1355,7 +1308,7 @@ opt_escape: test_for_null: row_value_constructor SQL_TOKEN_IS sql_not truth_value { - $$ = SQL_NEW_RULE; + $$ = SQL_NEW_RULE; // test_for_null: rule 1 $$->append($1); $$->append($2); $$->append($3); @@ -1363,7 +1316,7 @@ test_for_null: } | SQL_TOKEN_IS sql_not truth_value { - if (xxx_pGLOBAL_SQLPARSER->inPredicateCheck()) + if (xxx_pGLOBAL_SQLPARSER->inPredicateCheck())// test_for_null: rule 2 { OSQLParseNode* pColumnRef = newNode(aEmptyString, SQL_NODE_RULE,OSQLParser::RuleID(OSQLParseNode::column_ref)); pColumnRef->append(newNode(xxx_pGLOBAL_SQLPARSER->getFieldName(),SQL_NODE_NAME)); @@ -1393,15 +1346,15 @@ in_predicate_value: in_predicate: row_value_constructor sql_not SQL_TOKEN_IN in_predicate_value { - $$ = SQL_NEW_RULE; + $$ = SQL_NEW_RULE;// in_predicate: rule 1 $$->append($1); $$->append($2); $$->append($3); $$->append($4); } - | sql_not SQL_TOKEN_IN in_predicate_value + | sql_not SQL_TOKEN_IN in_predicate_value { - if ( xxx_pGLOBAL_SQLPARSER->inPredicateCheck() ) + if ( xxx_pGLOBAL_SQLPARSER->inPredicateCheck() )// in_predicate: rule 2 { OSQLParseNode* pColumnRef = newNode(aEmptyString, SQL_NODE_RULE,OSQLParser::RuleID(OSQLParseNode::column_ref)); pColumnRef->append(newNode(xxx_pGLOBAL_SQLPARSER->getFieldName(),SQL_NODE_NAME)); @@ -3132,7 +3085,7 @@ user: SQL_TOKEN_NAME sql: search_condition /* checking predicats */ { - if (xxx_pGLOBAL_SQLPARSER->inPredicateCheck()) + if (xxx_pGLOBAL_SQLPARSER->inPredicateCheck()) // sql: rule 1 { $$ = $1; if ( SQL_ISRULE($$,search_condition) ) @@ -3143,7 +3096,9 @@ sql: } else YYERROR; - }; + } + | '(' sql ')' /* checking predicats */ + ; %% diff --git a/connectivity/source/parse/sqlflex.l b/connectivity/source/parse/sqlflex.l index 19d2b8a27d8e..e365fdec1eca 100644 --- a/connectivity/source/parse/sqlflex.l +++ b/connectivity/source/parse/sqlflex.l @@ -192,7 +192,6 @@ COLLECT {SQL_NEW_KEYWORD(SQL_TOKEN_COLLE [Dd][Ee][Ss][Cc] {SQL_NEW_KEYWORD(SQL_TOKEN_DESC); return SQL_TOKEN_DESC; } [Dd][Ii][Ff][Ff][Ee][Rr][Ee][Nn][Cc][Ee] {SQL_NEW_KEYWORD(SQL_TOKEN_DIFFERENCE); return SQL_TOKEN_DIFFERENCE; } [Dd][Ii][Ss][Tt][Ii][Nn][Cc][Tt] {SQL_NEW_KEYWORD(SQL_TOKEN_DISTINCT); return SQL_TOKEN_DISTINCT; } -[Dd][Ii][Vv] {SQL_NEW_KEYWORD(SQL_TOKEN_DIV); return SQL_TOKEN_DIV; } [Dd][Oo][Uu][Bb][Ll][Ee] {SQL_NEW_KEYWORD(SQL_TOKEN_DOUBLE); return SQL_TOKEN_DOUBLE; } [Dd][Rr][Oo][Pp] {SQL_NEW_KEYWORD(SQL_TOKEN_DROP); return SQL_TOKEN_DROP; } @@ -484,7 +483,7 @@ sal_Int32 gatherString( sal_Int32 delim, sal_Int32 nTyp) } } - else if (ch == '\r' || ch == '\n') + else if (nTyp != 1 && (ch == '\r' || ch == '\n') ) break; else { diff --git a/connectivity/source/parse/sqliterator.cxx b/connectivity/source/parse/sqliterator.cxx index 56f63de5ce14..42778d6a7ed0 100644 --- a/connectivity/source/parse/sqliterator.cxx +++ b/connectivity/source/parse/sqliterator.cxx @@ -1493,6 +1493,20 @@ void OSQLParseTreeIterator::traverseParameter(const OSQLParseNode* _pParseNode } if ( bNotFound ) { + sal_Int32 nType = DataType::VARCHAR; + OSQLParseNode* pParent = _pColumnRef ? _pColumnRef->getParent() : NULL; + if ( pParent && (SQL_ISRULE(pParent,general_set_fct) || SQL_ISRULE(pParent,set_fct_spec)) ) + { + const sal_uInt32 nCount = _pColumnRef->count(); + sal_uInt32 i = 0; + for(; i < nCount;++i) + { + if ( _pColumnRef->getChild(i) == _pParseNode ) + break; + } + nType = ::connectivity::OSQLParser::getFunctionParameterType( pParent->getChild(0)->getTokenID(), i+1); + } + ::rtl::OUString aNewColName( getUniqueColumnName( sParameterName ) ); OParseColumn* pColumn = new OParseColumn(aNewColName, @@ -1501,7 +1515,7 @@ void OSQLParseTreeIterator::traverseParameter(const OSQLParseNode* _pParseNode ColumnValue::NULLABLE_UNKNOWN, 0, 0, - DataType::VARCHAR, + nType, sal_False, sal_False, isCaseSensitive() ); diff --git a/connectivity/source/parse/sqlnode.cxx b/connectivity/source/parse/sqlnode.cxx index 5710d747a5f9..e134d7a757c4 100644 --- a/connectivity/source/parse/sqlnode.cxx +++ b/connectivity/source/parse/sqlnode.cxx @@ -304,9 +304,10 @@ void OSQLParseNode::parseNodeToStr(::rtl::OUString& rString, if ( _rxConnection.is() ) { + ::rtl::OUStringBuffer sBuffer = rString; try { - OSQLParseNode::impl_parseNodeToString_throw( rString, + OSQLParseNode::impl_parseNodeToString_throw( sBuffer, SQLParseNodeParameter( _rxConnection, xFormatter, _xField, rIntl, pContext, _bIntl, _bQuote, _cDecSep, _bPredicate, _bSubstitute @@ -320,6 +321,7 @@ void OSQLParseNode::parseNodeToStr(::rtl::OUString& rString, // in the sub queries, but this cannot be the case here, as we do not parse to // SDBC level. } + rString = sBuffer.makeStringAndClear(); } } //----------------------------------------------------------------------------- @@ -342,10 +344,11 @@ bool OSQLParseNode::parseNodeToExecutableStatement( ::rtl::OUString& _out_rStrin aParseParam.pParser = &_rParser; _out_rString = ::rtl::OUString(); + ::rtl::OUStringBuffer sBuffer; bool bSuccess = false; try { - impl_parseNodeToString_throw( _out_rString, aParseParam ); + impl_parseNodeToString_throw( sBuffer, aParseParam ); bSuccess = true; } catch( const SQLException& e ) @@ -353,6 +356,7 @@ bool OSQLParseNode::parseNodeToExecutableStatement( ::rtl::OUString& _out_rStrin if ( _pErrorHolder ) *_pErrorHolder = e; } + _out_rString = sBuffer.makeStringAndClear(); return bSuccess; } @@ -366,7 +370,7 @@ namespace } //----------------------------------------------------------------------------- -void OSQLParseNode::impl_parseNodeToString_throw(::rtl::OUString& rString, const SQLParseNodeParameter& rParam) const +void OSQLParseNode::impl_parseNodeToString_throw(::rtl::OUStringBuffer& rString, const SQLParseNodeParameter& rParam) const { RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseNode::getTableRange" ); if ( isToken() ) @@ -385,19 +389,19 @@ void OSQLParseNode::impl_parseNodeToString_throw(::rtl::OUString& rString, const case parameter: { if(rString.getLength()) - rString += ::rtl::OUString::createFromAscii(" "); + rString.appendAscii(" "); if (nCount == 1) // ? m_aChildren[0]->impl_parseNodeToString_throw( rString, rParam ); else if (nCount == 2) // :Name { m_aChildren[0]->impl_parseNodeToString_throw( rString, rParam ); - rString += m_aChildren[1]->m_aNodeValue; + rString.append(m_aChildren[1]->m_aNodeValue); } // [Name] else { m_aChildren[0]->impl_parseNodeToString_throw( rString, rParam ); - rString += m_aChildren[1]->m_aNodeValue; - rString += m_aChildren[2]->m_aNodeValue; + rString.append(m_aChildren[1]->m_aNodeValue); + rString.append(m_aChildren[2]->m_aNodeValue); } bHandled = true; } @@ -419,7 +423,7 @@ void OSQLParseNode::impl_parseNodeToString_throw(::rtl::OUString& rString, const case as: if ( rParam.aMetaData.generateASBeforeCorrelationName() ) - rString += ::rtl::OUString::createFromAscii( " AS" ); + rString.append(::rtl::OUString::createFromAscii( " AS" )); bHandled = true; break; @@ -447,7 +451,7 @@ void OSQLParseNode::impl_parseNodeToString_throw(::rtl::OUString& rString, const m_aChildren[0]->impl_parseNodeToString_throw( rString, aNewParam ); aNewParam.bQuote = rParam.bQuote; //aNewParam.bPredicate = sal_False; // disable [ ] around names // look at i73215 - ::rtl::OUString aStringPara; + ::rtl::OUStringBuffer aStringPara; for (sal_uInt32 i=1; i<nCount; i++) { const OSQLParseNode * pSubTree = m_aChildren[i]; @@ -457,13 +461,12 @@ void OSQLParseNode::impl_parseNodeToString_throw(::rtl::OUString& rString, const // bei den CommaListen zwischen alle Subtrees Commas setzen if ((m_eNodeType == SQL_NODE_COMMALISTRULE) && (i < (nCount - 1))) - aStringPara += ::rtl::OUString::createFromAscii(","); + aStringPara.appendAscii(","); } else i++; } - aStringPara.trim(); - rString += aStringPara; + rString.append(aStringPara.makeStringAndClear()); } bHandled = true; } @@ -542,7 +545,7 @@ void OSQLParseNode::impl_parseNodeToString_throw(::rtl::OUString& rString, const // bei den CommaListen zwischen alle Subtrees Commas setzen if ((m_eNodeType == SQL_NODE_COMMALISTRULE) && (i != m_aChildren.end())) - rString += ::rtl::OUString::createFromAscii(","); + rString.appendAscii(","); } } else @@ -554,9 +557,9 @@ void OSQLParseNode::impl_parseNodeToString_throw(::rtl::OUString& rString, const if ((m_eNodeType == SQL_NODE_COMMALISTRULE) && (i != m_aChildren.end())) { if (SQL_ISRULE(this,value_exp_commalist) && rParam.bPredicate) - rString += ::rtl::OUString::createFromAscii(";"); + rString.appendAscii(";"); else - rString += ::rtl::OUString::createFromAscii(","); + rString.appendAscii(","); } } } @@ -564,7 +567,7 @@ void OSQLParseNode::impl_parseNodeToString_throw(::rtl::OUString& rString, const } //----------------------------------------------------------------------------- -bool OSQLParseNode::impl_parseTableNameNodeToString_throw( ::rtl::OUString& rString, const SQLParseNodeParameter& rParam ) const +bool OSQLParseNode::impl_parseTableNameNodeToString_throw( ::rtl::OUStringBuffer& rString, const SQLParseNodeParameter& rParam ) const { RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseNode::impl_parseTableNameNodeToString_throw" ); // is the table_name part of a table_ref? @@ -623,25 +626,25 @@ bool OSQLParseNode::impl_parseTableNameNodeToString_throw( ::rtl::OUString& rStr if ( pSubQueryNode.get() ) { // parse the sub-select to SDBC level, too - ::rtl::OUString sSubSelect; + ::rtl::OUStringBuffer sSubSelect; pSubQueryNode->impl_parseNodeToString_throw( sSubSelect, rParam ); if ( sSubSelect.getLength() ) - sCommand = sSubSelect; + sCommand = sSubSelect.makeStringAndClear(); } } - rString += ::rtl::OUString::createFromAscii( " ( " ); - rString += sCommand; - rString += ::rtl::OUString::createFromAscii( " )" ); + rString.appendAscii( " ( " ); + rString.append(sCommand); + rString.appendAscii( " )" ); // append the query name as table alias, since it might be referenced in other // parts of the statement - but only if there's no other alias name present if ( !lcl_isAliasNamePresent( *this ) ) { - rString += ::rtl::OUString::createFromAscii( " AS " ); + rString.appendAscii( " AS " ); if ( rParam.bQuote ) - rString += SetQuotation( sTableOrQueryName, - rParam.aMetaData.getIdentifierQuoteString(), rParam.aMetaData.getIdentifierQuoteString() ); + rString.append(SetQuotation( sTableOrQueryName, + rParam.aMetaData.getIdentifierQuoteString(), rParam.aMetaData.getIdentifierQuoteString() )); } // don't forget to remove the query name from the history, else multiple inclusions @@ -663,7 +666,7 @@ bool OSQLParseNode::impl_parseTableNameNodeToString_throw( ::rtl::OUString& rStr } //----------------------------------------------------------------------------- -void OSQLParseNode::impl_parseTableRangeNodeToString_throw(::rtl::OUString& rString, const SQLParseNodeParameter& rParam) const +void OSQLParseNode::impl_parseTableRangeNodeToString_throw(::rtl::OUStringBuffer& rString, const SQLParseNodeParameter& rParam) const { RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseNode::impl_parseTableRangeNodeToString_throw" ); OSL_PRECOND( ( count() == 2 ) || ( count() == 3 ) || ( count() == 5 ) ,"Illegal count"); @@ -674,7 +677,7 @@ void OSQLParseNode::impl_parseTableRangeNodeToString_throw(::rtl::OUString& rStr } //----------------------------------------------------------------------------- -void OSQLParseNode::impl_parseLikeNodeToString_throw( ::rtl::OUString& rString, const SQLParseNodeParameter& rParam ) const +void OSQLParseNode::impl_parseLikeNodeToString_throw( ::rtl::OUStringBuffer& rString, const SQLParseNodeParameter& rParam ) const { RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseNode::impl_parseLikeNodeToString_throw" ); OSL_ENSURE(count() >= 4,"count != 5: Prepare for GPF"); @@ -725,8 +728,8 @@ void OSQLParseNode::impl_parseLikeNodeToString_throw( ::rtl::OUString& rString, if (pParaNode->isToken()) { ::rtl::OUString aStr = ConvertLikeToken(pParaNode, pEscNode, rParam.bInternational); - rString += ::rtl::OUString::createFromAscii(" "); - rString += SetQuotation(aStr,::rtl::OUString::createFromAscii("\'"),::rtl::OUString::createFromAscii("\'\'")); + rString.appendAscii(" "); + rString.append(SetQuotation(aStr,::rtl::OUString::createFromAscii("\'"),::rtl::OUString::createFromAscii("\'\'"))); } else pParaNode->impl_parseNodeToString_throw( rString, aNewParam ); @@ -1687,7 +1690,7 @@ void OSQLParseNode::append(OSQLParseNode* pNewNode) m_aChildren.push_back(pNewNode); } // ----------------------------------------------------------------------------- -sal_Bool OSQLParseNode::addDateValue(::rtl::OUString& rString, const SQLParseNodeParameter& rParam) const +sal_Bool OSQLParseNode::addDateValue(::rtl::OUStringBuffer& rString, const SQLParseNodeParameter& rParam) const { RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseNode::addDateValue" ); // special display for date/time values @@ -1708,10 +1711,6 @@ sal_Bool OSQLParseNode::addDateValue(::rtl::OUString& rString, const SQLParseNod { suQuote = ::rtl::OUString::createFromAscii("#"); } - else - { - suQuote = ::rtl::OUString::createFromAscii("'"); - } } else { @@ -1720,29 +1719,25 @@ sal_Bool OSQLParseNode::addDateValue(::rtl::OUString& rString, const SQLParseNod // suQuote = ::rtl::OUString::createFromAscii("'"); return sal_False; } - else - { - suQuote = ::rtl::OUString::createFromAscii("'"); - } } if (rString.getLength()) - rString += ::rtl::OUString::createFromAscii(" "); - rString += suQuote; + rString.appendAscii(" "); + rString.append(suQuote); const ::rtl::OUString sTokenValue = pODBCNode->m_aChildren[1]->getTokenValue(); if (SQL_ISTOKEN(pODBCNodeChild, D)) { - rString += rParam.bPredicate ? convertDateString(rParam, sTokenValue) : sTokenValue; + rString.append(rParam.bPredicate ? convertDateString(rParam, sTokenValue) : sTokenValue); } else if (SQL_ISTOKEN(pODBCNodeChild, T)) { - rString += rParam.bPredicate ? convertTimeString(rParam, sTokenValue) : sTokenValue; + rString.append(rParam.bPredicate ? convertTimeString(rParam, sTokenValue) : sTokenValue); } else { - rString += rParam.bPredicate ? convertDateTimeString(rParam, sTokenValue) : sTokenValue; + rString.append(rParam.bPredicate ? convertDateTimeString(rParam, sTokenValue) : sTokenValue); } - rString += suQuote; + rString.append(suQuote); return sal_True; } } @@ -2443,7 +2438,7 @@ OSQLParseNode* OSQLParseNode::replace (OSQLParseNode* pOldSubNode, OSQLParseNode return pOldSubNode; } // ----------------------------------------------------------------------------- -void OSQLParseNode::parseLeaf(::rtl::OUString & rString, const SQLParseNodeParameter& rParam) const +void OSQLParseNode::parseLeaf(::rtl::OUStringBuffer& rString, const SQLParseNodeParameter& rParam) const { RTL_LOGFILE_CONTEXT_AUTHOR( aLogger, "parse", "Ocke.Janssen@sun.com", "OSQLParseNode::parseLeaf" ); // ein Blatt ist gefunden @@ -2453,51 +2448,51 @@ void OSQLParseNode::parseLeaf(::rtl::OUString & rString, const SQLParseNodeParam case SQL_NODE_KEYWORD: { if (rString.getLength()) - rString += ::rtl::OUString::createFromAscii(" "); + rString.appendAscii(" "); - ::rtl::OString sT = OSQLParser::TokenIDToStr(m_nNodeID, &rParam.m_rContext); - rString += ::rtl::OUString(sT,sT.getLength(),RTL_TEXTENCODING_UTF8); + const ::rtl::OString sT = OSQLParser::TokenIDToStr(m_nNodeID, &rParam.m_rContext); + rString.append(::rtl::OUString(sT,sT.getLength(),RTL_TEXTENCODING_UTF8)); } break; case SQL_NODE_STRING: if (rString.getLength()) - rString += ::rtl::OUString::createFromAscii(" "); - rString += SetQuotation(m_aNodeValue,::rtl::OUString::createFromAscii("\'"),::rtl::OUString::createFromAscii("\'\'")); + rString.appendAscii(" "); + rString.append(SetQuotation(m_aNodeValue,::rtl::OUString::createFromAscii("\'"),::rtl::OUString::createFromAscii("\'\'"))); break; case SQL_NODE_NAME: if (rString.getLength()) { - switch(rString.getStr()[rString.getLength()-1] ) + switch(rString.charAt(rString.getLength()-1) ) { case ' ' : case '.' : break; default : if ( !rParam.aMetaData.getCatalogSeparator().getLength() - || rString.getStr()[ rString.getLength()-1 ] != rParam.aMetaData.getCatalogSeparator().toChar() + || rString.charAt( rString.getLength()-1 ) != rParam.aMetaData.getCatalogSeparator().toChar() ) - rString += ::rtl::OUString::createFromAscii(" "); break; + rString.appendAscii(" "); break; } } if (rParam.bQuote) { if (rParam.bPredicate) { - rString+= ::rtl::OUString::createFromAscii("["); - rString += m_aNodeValue; - rString+= ::rtl::OUString::createFromAscii("]"); + rString.appendAscii("["); + rString.append(m_aNodeValue); + rString.appendAscii("]"); } else - rString += SetQuotation(m_aNodeValue, - rParam.aMetaData.getIdentifierQuoteString(), rParam.aMetaData.getIdentifierQuoteString() ); + rString.append(SetQuotation(m_aNodeValue, + rParam.aMetaData.getIdentifierQuoteString(), rParam.aMetaData.getIdentifierQuoteString() )); } else - rString += m_aNodeValue; + rString.append(m_aNodeValue); break; case SQL_NODE_ACCESS_DATE: if (rString.getLength()) - rString += ::rtl::OUString::createFromAscii(" "); - rString += ::rtl::OUString::createFromAscii("#"); - rString += m_aNodeValue; - rString += ::rtl::OUString::createFromAscii("#"); + rString.appendAscii(" "); + rString.appendAscii("#"); + rString.append(m_aNodeValue); + rString.appendAscii("#"); break; case SQL_NODE_INTNUM: case SQL_NODE_APPROXNUM: @@ -2507,26 +2502,26 @@ void OSQLParseNode::parseLeaf(::rtl::OUString & rString, const SQLParseNodeParam aTmp = aTmp.replace('.', rParam.cDecSep); if (rString.getLength()) - rString += ::rtl::OUString::createFromAscii(" "); - rString += aTmp; + rString.appendAscii(" "); + rString.append(aTmp); } break; // fall through default: if (rString.getLength() && m_aNodeValue.toChar() != '.' && m_aNodeValue.toChar() != ':' ) { - switch( rString.getStr()[rString.getLength()-1] ) + switch( rString.charAt(rString.getLength()-1) ) { case ' ' : case '.' : break; default : if ( !rParam.aMetaData.getCatalogSeparator().getLength() - || rString.getStr()[ rString.getLength()-1 ] != rParam.aMetaData.getCatalogSeparator().toChar() + || rString.charAt( rString.getLength()-1 ) != rParam.aMetaData.getCatalogSeparator().toChar() ) - rString += ::rtl::OUString::createFromAscii(" "); break; + rString.appendAscii(" "); break; } } - rString += m_aNodeValue; + rString.append(m_aNodeValue); } } @@ -2621,6 +2616,113 @@ sal_Int32 OSQLParser::getFunctionReturnType(const ::rtl::OUString& _sFunctionNam return nType; } +// ----------------------------------------------------------------------------- +sal_Int32 OSQLParser::getFunctionParameterType(sal_uInt32 _nTokenId, sal_uInt32 _nPos) +{ + sal_Int32 nType = DataType::VARCHAR; + + if(_nTokenId == SQL_TOKEN_CHAR) nType = DataType::INTEGER; + else if(_nTokenId == SQL_TOKEN_INSERT) + { + if ( _nPos == 2 || _nPos == 3 ) + nType = DataType::INTEGER; + } + else if(_nTokenId == SQL_TOKEN_LEFT) + { + if ( _nPos == 2 ) + nType = DataType::INTEGER; + } + else if(_nTokenId == SQL_TOKEN_LOCATE) + { + if ( _nPos == 3 ) + nType = DataType::INTEGER; + } + else if(_nTokenId == SQL_TOKEN_LOCATE_2) + { + if ( _nPos == 3 ) + nType = DataType::INTEGER; + } + else if( _nTokenId == SQL_TOKEN_REPEAT || _nTokenId == SQL_TOKEN_RIGHT ) + { + if ( _nPos == 2 ) + nType = DataType::INTEGER; + } + else if(_nTokenId == SQL_TOKEN_SPACE ) + { + nType = DataType::INTEGER; + } + else if(_nTokenId == SQL_TOKEN_SUBSTRING) + { + if ( _nPos != 1 ) + nType = DataType::INTEGER; + } + else if(_nTokenId == SQL_TOKEN_DATEDIFF) + { + if ( _nPos != 1 ) + nType = DataType::TIMESTAMP; + } + else if(_nTokenId == SQL_TOKEN_DATEVALUE) + nType = DataType::DATE; + else if(_nTokenId == SQL_TOKEN_DAYNAME) + nType = DataType::DATE; + else if(_nTokenId == SQL_TOKEN_DAYOFMONTH) + nType = DataType::DATE; + else if(_nTokenId == SQL_TOKEN_DAYOFWEEK) + nType = DataType::DATE; + else if(_nTokenId == SQL_TOKEN_DAYOFYEAR) + nType = DataType::DATE; + else if(_nTokenId == SQL_TOKEN_EXTRACT) nType = DataType::VARCHAR; + else if(_nTokenId == SQL_TOKEN_HOUR) nType = DataType::TIME; + else if(_nTokenId == SQL_TOKEN_MINUTE) nType = DataType::TIME; + else if(_nTokenId == SQL_TOKEN_MONTH) nType = DataType::DATE; + else if(_nTokenId == SQL_TOKEN_MONTHNAME) nType = DataType::DATE; + else if(_nTokenId == SQL_TOKEN_NOW) nType = DataType::TIMESTAMP; + else if(_nTokenId == SQL_TOKEN_QUARTER) nType = DataType::DATE; + else if(_nTokenId == SQL_TOKEN_SECOND) nType = DataType::TIME; + else if(_nTokenId == SQL_TOKEN_TIMESTAMPADD) nType = DataType::TIMESTAMP; + else if(_nTokenId == SQL_TOKEN_TIMESTAMPDIFF) nType = DataType::TIMESTAMP; + else if(_nTokenId == SQL_TOKEN_TIMEVALUE) nType = DataType::TIMESTAMP; + else if(_nTokenId == SQL_TOKEN_WEEK) nType = DataType::DATE; + else if(_nTokenId == SQL_TOKEN_YEAR) nType = DataType::DATE; + + else if(_nTokenId == SQL_TOKEN_ABS) nType = DataType::DOUBLE; + else if(_nTokenId == SQL_TOKEN_ACOS) nType = DataType::DOUBLE; + else if(_nTokenId == SQL_TOKEN_ASIN) nType = DataType::DOUBLE; + else if(_nTokenId == SQL_TOKEN_ATAN) nType = DataType::DOUBLE; + else if(_nTokenId == SQL_TOKEN_ATAN2) nType = DataType::DOUBLE; + else if(_nTokenId == SQL_TOKEN_CEILING) nType = DataType::DOUBLE; + else if(_nTokenId == SQL_TOKEN_COS) nType = DataType::DOUBLE; + else if(_nTokenId == SQL_TOKEN_COT) nType = DataType::DOUBLE; + else if(_nTokenId == SQL_TOKEN_DEGREES) nType = DataType::DOUBLE; + else if(_nTokenId == SQL_TOKEN_EXP) nType = DataType::DOUBLE; + else if(_nTokenId == SQL_TOKEN_FLOOR) nType = DataType::DOUBLE; + else if(_nTokenId == SQL_TOKEN_LOGF) nType = DataType::DOUBLE; + else if(_nTokenId == SQL_TOKEN_LOG) nType = DataType::DOUBLE; + else if(_nTokenId == SQL_TOKEN_LOG10) nType = DataType::DOUBLE; + else if(_nTokenId == SQL_TOKEN_LN) nType = DataType::DOUBLE; + else if(_nTokenId == SQL_TOKEN_MOD) nType = DataType::DOUBLE; + else if(_nTokenId == SQL_TOKEN_PI) nType = DataType::DOUBLE; + else if(_nTokenId == SQL_TOKEN_POWER) nType = DataType::DOUBLE; + else if(_nTokenId == SQL_TOKEN_RADIANS) nType = DataType::DOUBLE; + else if(_nTokenId == SQL_TOKEN_RAND) nType = DataType::DOUBLE; + else if(_nTokenId == SQL_TOKEN_ROUND) nType = DataType::DOUBLE; + else if(_nTokenId == SQL_TOKEN_ROUNDMAGIC) nType = DataType::DOUBLE; + else if(_nTokenId == SQL_TOKEN_SIGN) nType = DataType::DOUBLE; + else if(_nTokenId == SQL_TOKEN_SIN) nType = DataType::DOUBLE; + else if(_nTokenId == SQL_TOKEN_SQRT) nType = DataType::DOUBLE; + else if(_nTokenId == SQL_TOKEN_TAN) nType = DataType::DOUBLE; + else if(_nTokenId == SQL_TOKEN_TRUNCATE) nType = DataType::DOUBLE; + else if(_nTokenId == SQL_TOKEN_COUNT) nType = DataType::INTEGER; + else if(_nTokenId == SQL_TOKEN_MAX) nType = DataType::DOUBLE; + else if(_nTokenId == SQL_TOKEN_MIN) nType = DataType::DOUBLE; + else if(_nTokenId == SQL_TOKEN_AVG) nType = DataType::DOUBLE; + else if(_nTokenId == SQL_TOKEN_SUM) nType = DataType::DOUBLE; + + else if(_nTokenId == SQL_TOKEN_LOWER) nType = DataType::VARCHAR; + else if(_nTokenId == SQL_TOKEN_UPPER) nType = DataType::VARCHAR; + + return nType; +} // ----------------------------------------------------------------------------- const SQLError& OSQLParser::getErrorHelper() const diff --git a/connectivity/source/resource/conn_shared_res.src b/connectivity/source/resource/conn_shared_res.src index c9e54b740252..d143dad1ba0f 100644 --- a/connectivity/source/resource/conn_shared_res.src +++ b/connectivity/source/resource/conn_shared_res.src @@ -292,23 +292,23 @@ String STR_OPERATOR_TOO_COMPLEX }; String STR_QUERY_INVALID_LIKE_COLUMN { - Text [ en-US ] = "The query can not be executed. The 'LIKE' can only be used with a column name."; + Text [ en-US ] = "The query can not be executed. You cannot use 'LIKE' with columns of this type."; }; String STR_QUERY_INVALID_LIKE_STRING { - Text [ en-US ] = "The query can not be executed. The 'LIKE' can only be used with a string argument."; + Text [ en-US ] = "The query can not be executed. 'LIKE' can be used with a string argument only."; }; String STR_QUERY_NOT_LIKE_TOO_COMPLEX { - Text [ en-US ] = "The query can not be executed. The 'NOT LIKE' is too complex."; + Text [ en-US ] = "The query can not be executed. The 'NOT LIKE' condition is too complex."; }; String STR_QUERY_LIKE_WILDCARD { - Text [ en-US ] = "The query can not be executed. The 'LIKE' statement contains wildcard in the middle."; + Text [ en-US ] = "The query can not be executed. The 'LIKE' condition contains wildcard in the middle."; }; String STR_QUERY_LIKE_WILDCARD_MANY { - Text [ en-US ] = "The query can not be executed. The 'LIKE' statement contains too many wildcards."; + Text [ en-US ] = "The query can not be executed. The 'LIKE' condition contains too many wildcards."; }; String STR_INVALID_COLUMNNAME { @@ -407,7 +407,7 @@ String STR_COULD_NOT_CREATE_INDEX_NAME }; String STR_COULD_NOT_CREATE_INDEX_KEYSIZE { - Text [ en-US ] = "The index could not be created. The size of the choosen column is to big."; + Text [ en-US ] = "The index could not be created. The size of the chosen column is to big."; }; String STR_SQL_NAME_ERROR diff --git a/connectivity/target.pmk b/connectivity/target.pmk new file mode 100644 index 000000000000..97ef318b5feb --- /dev/null +++ b/connectivity/target.pmk @@ -0,0 +1,40 @@ +#************************************************************************* +# +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +# +# Copyright 2008 by Sun Microsystems, Inc. +# +# OpenOffice.org - a multi-platform office productivity suite +# +# $RCSfile: makefile.pmk,v $ +# +# $Revision: 1.6 $ +# +# This file is part of OpenOffice.org. +# +# OpenOffice.org is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License version 3 +# only, as published by the Free Software Foundation. +# +# OpenOffice.org is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License version 3 for more details +# (a copy is included in the LICENSE file that accompanied this code). +# +# You should have received a copy of the GNU Lesser General Public License +# version 3 along with OpenOffice.org. If not, see +# <http://www.openoffice.org/license.html> +# for a copy of the LGPLv3 License. +# +#************************************************************************* + +.INCLUDE : target.mk + +COMPONENT_CONFIG_SCHEMA*=$(TARGET).xcs + +ALLTAR: "$(PWD)$/$(MISC)$/registry$/schema$/$(PACKAGEDIR)$/$(COMPONENT_CONFIG_SCHEMA)" +"$(PWD)$/$(MISC)$/registry$/schema$/$(PACKAGEDIR)$/$(COMPONENT_CONFIG_SCHEMA)" : $(SOLARXMLDIR)$/registry$/schema$/$(PACKAGEDIR)$/Drivers.xcs + @@-$(MKDIRHIER) $(@:d) + $(COPY) $< $@ + diff --git a/connectivity/util/delzip b/connectivity/util/delzip new file mode 100644 index 000000000000..e69de29bb2d1 --- /dev/null +++ b/connectivity/util/delzip diff --git a/connectivity/util/langfilter.xsl b/connectivity/util/langfilter.xsl new file mode 100644 index 000000000000..76cfcff20ac6 --- /dev/null +++ b/connectivity/util/langfilter.xsl @@ -0,0 +1,37 @@ +<?xml version='1.0' encoding="UTF-8"?> +<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:oor="http://openoffice.org/2001/registry"> +<xsl:output method="xml" indent="yes" omit-xml-declaration="no" version="1.0" encoding="UTF-8"/> +<xsl:param name="lang"/> +<xsl:template match="*"> + <xsl:if test="count(.//*[@xml:lang=$lang])>0"> + <xsl:copy> + <xsl:apply-templates select="*|@*"/> + </xsl:copy> + </xsl:if> +</xsl:template> + +<xsl:template match="@*"> + <xsl:copy> + <xsl:apply-templates select="*|@*"/> + </xsl:copy> +</xsl:template> + +<xsl:template match="value"> + <xsl:if test="@xml:lang=$lang"> + <xsl:copy> + <xsl:apply-templates select="@*|text()"/> + </xsl:copy> + </xsl:if> +</xsl:template> + +<xsl:template match="text()"> + <xsl:if test="../@xml:lang=$lang"> + <xsl:copy> + <xsl:apply-templates select="@*|text()"/> + </xsl:copy> + </xsl:if> +</xsl:template> + + +</xsl:stylesheet> + diff --git a/connectivity/util/makefile.mk b/connectivity/util/makefile.mk new file mode 100644 index 000000000000..805aa0110f6f --- /dev/null +++ b/connectivity/util/makefile.mk @@ -0,0 +1,80 @@ +#************************************************************************* +# +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +# +# Copyright 2008 by Sun Microsystems, Inc. +# +# OpenOffice.org - a multi-platform office productivity suite +# +# $RCSfile: makefile.mk,v $ +# +# $Revision: 1.22 $ +# +# This file is part of OpenOffice.org. +# +# OpenOffice.org is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License version 3 +# only, as published by the Free Software Foundation. +# +# OpenOffice.org is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License version 3 for more details +# (a copy is included in the LICENSE file that accompanied this code). +# +# You should have received a copy of the GNU Lesser General Public License +# version 3 along with OpenOffice.org. If not, see +# <http://www.openoffice.org/license.html> +# for a copy of the LGPLv3 License. +# +#************************************************************************* + +PRJ = .. +TARGET = connectivity +PRJNAME = connectivity + +# ----------------------------------------------------------------------------- +# include global settings +# ----------------------------------------------------------------------------- + +.INCLUDE : settings.mk + +DIR_FILTERCFGOUT := $(MISC)$/drivers +DIR_LANGPACK := $(DIR_FILTERCFGOUT) +.IF "$(WITH_LANG)"!="" +DIR_LANG_SOURCE := $(MISC)$/merge +.ELSE +DIR_LANG_SOURCE := $(MISC)$/registry$/data +.ENDIF +DRIVER_MERGE_XCU := $(shell -@$(FIND) $(DIR_LANG_SOURCE)$/org$/openoffice$/Office$/DataAccess -name "*.xcu") + +REALFILTERPACKAGES_FILTERS_UI_LANGPACKS = \ + $(foreach,i,$(alllangiso) $(foreach,j,$(DRIVER_MERGE_XCU) $(DIR_LANGPACK)$/$i$/org$/openoffice$/Office$/DataAccess$/$(j:f))) + +.INCLUDE: target.mk + +PACKLANG := $(XSLTPROC) --nonet +PACKLANG_IN := +PACKLANG_PARAM := --stringparam +PACKLANG_XSL := + +$(REALFILTERPACKAGES_FILTERS_UI_LANGPACKS) :
+ @echo ===================================================================
+ @echo Building language package for driver $(@:b:s/Filter_//)
+ @echo ===================================================================
+ +-$(MKDIRHIER) $(@:d)
+ $(PACKLANG) $(PACKLANG_PARAM) lang $(@:d:d:d:d:d:d:d:d:d:d:b) $(PACKLANG_XSL) langfilter.xsl $(PACKLANG_IN) $(DIR_LANG_SOURCE)$/org$/openoffice$/Office$/DataAccess$/$(@:f) > $@
+ +$(MISC)$/$(TARGET)_delzip : + -$(RM) $(BIN)$/fcfg_drivers_{$(alllangiso)}.zip + +$(BIN)$/fcfg_drivers_{$(alllangiso)}.zip : $(REALFILTERPACKAGES_FILTERS_UI_LANGPACKS) + cd $(DIR_FILTERCFGOUT)$/$(@:b:s/fcfg_drivers_//) && zip -ru ..$/..$/..$/bin$/fcfg_drivers_$(@:b:s/fcfg_drivers_//).zip org/* +.IF "$(USE_SHELL)"!="4nt" + $(PERL) -w $(SOLARENV)$/bin$/cleanzip.pl $@ +.ENDIF # "$(USE_SHELL)"!="4nt" + +ALLTAR: \ + $(MISC)$/$(TARGET)_delzip \ + $(BIN)$/fcfg_drivers_{$(alllangiso)}.zip + |