Added: 
openoffice/trunk/main/connectivity/java/sdbc_jdbc/src/com/sun/star/comp/sdbc/JavaSQLDatabaseMetaData.java
URL: 
http://svn.apache.org/viewvc/openoffice/trunk/main/connectivity/java/sdbc_jdbc/src/com/sun/star/comp/sdbc/JavaSQLDatabaseMetaData.java?rev=1814552&view=auto
==============================================================================
--- 
openoffice/trunk/main/connectivity/java/sdbc_jdbc/src/com/sun/star/comp/sdbc/JavaSQLDatabaseMetaData.java
 (added)
+++ 
openoffice/trunk/main/connectivity/java/sdbc_jdbc/src/com/sun/star/comp/sdbc/JavaSQLDatabaseMetaData.java
 Wed Nov  8 04:17:25 2017
@@ -0,0 +1,1682 @@
+/**************************************************************
+ * 
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ * 
+ *************************************************************/
+package com.sun.star.comp.sdbc;
+
+import java.util.ArrayList;
+import java.util.Map;
+import java.util.TreeMap;
+
+import org.apache.openoffice.comp.sdbc.dbtools.util.CustomColumn;
+import org.apache.openoffice.comp.sdbc.dbtools.util.CustomResultSet;
+import org.apache.openoffice.comp.sdbc.dbtools.util.CustomResultSetMetaData;
+import org.apache.openoffice.comp.sdbc.dbtools.util.ORowSetValue;
+
+import com.sun.star.beans.PropertyValue;
+import com.sun.star.lang.IllegalArgumentException;
+import com.sun.star.lib.uno.helper.WeakBase;
+import com.sun.star.sdbc.ColumnValue;
+import com.sun.star.sdbc.DataType;
+import com.sun.star.sdbc.SQLException;
+import com.sun.star.sdbc.XConnection;
+import com.sun.star.sdbc.XDatabaseMetaData2;
+import com.sun.star.sdbc.XResultSet;
+import com.sun.star.sdbc.XResultSetMetaData;
+import com.sun.star.sdbc.XResultSetMetaDataSupplier;
+import com.sun.star.sdbc.XRow;
+import com.sun.star.uno.AnyConverter;
+import com.sun.star.uno.UnoRuntime;
+
+public class JavaSQLDatabaseMetaData extends WeakBase implements 
XDatabaseMetaData2 {
+    private java.sql.DatabaseMetaData jdbcDatabaseMetaData;
+    private JavaSQLConnection connection;
+    private ConnectionLog logger;
+    
+    public JavaSQLDatabaseMetaData(java.sql.DatabaseMetaData 
jdbcDatabaseMetaData, JavaSQLConnection connection) {
+        this.jdbcDatabaseMetaData = jdbcDatabaseMetaData;
+        this.connection = connection;
+        this.logger = connection.getLogger();
+    }
+    
+    @Override
+    public XConnection getConnection() throws SQLException {
+        return connection;
+    }
+
+    @Override
+    public PropertyValue[] getConnectionInfo() {
+        return connection.getConnectionInfo();
+    }
+    
+    private XResultSet wrapResultSet(java.sql.ResultSet resultSet) {
+        if (resultSet == null) {
+            return null;
+        }
+        return new JavaSQLResultSet(resultSet, connection);
+    }
+    
+    @Override
+    public XResultSet getTypeInfo() throws SQLException {
+        try {
+            return wrapResultSet(jdbcDatabaseMetaData.getTypeInfo());
+        } catch (java.sql.SQLException jdbcSQLException) {
+            throw Tools.toUnoException(this, jdbcSQLException);
+        }
+    }
+    
+    @Override
+    public XResultSet getCatalogs() throws SQLException {
+        try {
+            return wrapResultSet(jdbcDatabaseMetaData.getCatalogs());
+        } catch (java.sql.SQLException jdbcSQLException) {
+            throw Tools.toUnoException(this, jdbcSQLException);
+        }
+    }
+    
+    @Override
+    public String getCatalogSeparator() throws SQLException {
+        try {
+            return jdbcDatabaseMetaData.getCatalogSeparator();
+        } catch (java.sql.SQLException jdbcSQLException) {
+            throw Tools.toUnoException(this, jdbcSQLException);
+        }
+    }
+    
+    @Override
+    public XResultSet getSchemas() throws SQLException {
+        try {
+            return wrapResultSet(jdbcDatabaseMetaData.getCatalogs());
+        } catch (java.sql.SQLException jdbcSQLException) {
+            throw Tools.toUnoException(this, jdbcSQLException);
+        }
+    }
+    
+    @Override
+    public XResultSet getColumnPrivileges(Object catalog, String schema, 
String table,
+            String columnNamePattern) throws SQLException {
+        
+        try {
+            String jdbcCatalog = null;
+            if (AnyConverter.isString(catalog)) {
+                jdbcCatalog = AnyConverter.toString(catalog);
+            }
+            if (schema.equals("%")) {
+                schema = null;
+            }
+            return wrapResultSet(jdbcDatabaseMetaData.getColumnPrivileges(
+                    jdbcCatalog, schema, table, columnNamePattern));
+        } catch (java.sql.SQLException | IllegalArgumentException exception) {
+            throw Tools.toUnoException(this, exception);
+        }
+    }
+    
+    @Override
+    public XResultSet getColumns(Object catalog, String schemaPattern, String 
tableNamePattern, String columnNamePattern) throws SQLException {
+        try {
+            String jdbcCatalog = null;
+            if (AnyConverter.isString(catalog)) {
+                jdbcCatalog = AnyConverter.toString(catalog);
+            }
+            if (schemaPattern.equals("%")) {
+                schemaPattern = null;
+            }
+            return wrapResultSet(jdbcDatabaseMetaData.getColumns(
+                    jdbcCatalog, schemaPattern, tableNamePattern, 
columnNamePattern));
+        } catch (java.sql.SQLException | IllegalArgumentException exception) {
+            throw Tools.toUnoException(this, exception);
+        }
+    }
+    
+    @Override
+    public XResultSet getTables(Object catalog, String schemaPattern, String 
tableNamePattern, String[] types) throws SQLException {
+        try {
+            // the SDBC API allows to pass "%" as table type filter, but in 
JDBC, "all table types"
+            // is represented by the table type being null
+            String[] jdbcTypes = types;
+            for (String type : types) {
+                if (type.equals("%")) {
+                    jdbcTypes = null;
+                    break;
+                }
+            }
+            String jdbcCatalog = null;
+            if (AnyConverter.isString(catalog)) {
+                jdbcCatalog = AnyConverter.toString(catalog);
+            }
+            // if we are to display "all catalogs", then respect 
CatalogRestriction
+            if (jdbcCatalog == null) {
+                Object catalogRestriction = connection.getCatalogRestriction();
+                if (AnyConverter.isString(catalogRestriction)) {
+                    jdbcCatalog = AnyConverter.toString(catalogRestriction);
+                }
+            }
+            if (schemaPattern.equals("%")) {
+                Object schemaRestriction = connection.getSchemaRestriction();
+                if (AnyConverter.isString(schemaRestriction)) {
+                    schemaPattern = AnyConverter.toString(schemaRestriction);
+                }
+            }
+            return wrapResultSet(jdbcDatabaseMetaData.getTables(
+                    jdbcCatalog, schemaPattern, tableNamePattern, jdbcTypes));
+        } catch (java.sql.SQLException | IllegalArgumentException exception) {
+            throw Tools.toUnoException(this, exception);
+        }
+    }
+    
+    @Override
+    public XResultSet getProcedureColumns(Object catalog, String 
schemaNamePattern, String procedureNamePattern,
+            String columnNamePattern) throws SQLException {
+        try {
+            String jdbcCatalog = null;
+            if (AnyConverter.isString(catalog)) {
+                jdbcCatalog = AnyConverter.toString(catalog);
+            }
+            if (schemaNamePattern.equals("%")) {
+                schemaNamePattern = null;
+            }
+            return wrapResultSet(jdbcDatabaseMetaData.getProcedureColumns(
+                    jdbcCatalog, schemaNamePattern, procedureNamePattern, 
columnNamePattern));
+        } catch (java.sql.SQLException | IllegalArgumentException exception) {
+            throw Tools.toUnoException(this, exception);
+        }
+    }
+    
+    @Override
+    public XResultSet getProcedures(Object catalog, String schemaNamePattern, 
String procedureNamePattern) throws SQLException {
+        try {
+            String jdbcCatalog = null;
+            if (AnyConverter.isString(catalog)) {
+                jdbcCatalog = AnyConverter.toString(catalog);
+            }
+            if (schemaNamePattern.equals("%")) {
+                schemaNamePattern = null;
+            }
+            return wrapResultSet(jdbcDatabaseMetaData.getProcedures(
+                    jdbcCatalog, schemaNamePattern, procedureNamePattern));
+        } catch (java.sql.SQLException | IllegalArgumentException exception) {
+            throw Tools.toUnoException(this, exception);
+        }
+    }
+
+    @Override
+    public XResultSet getVersionColumns(Object catalog, String schema, String 
table) throws SQLException {
+        try {
+            String jdbcCatalog = null;
+            if (AnyConverter.isString(catalog)) {
+                jdbcCatalog = AnyConverter.toString(catalog);
+            }
+            if (schema.equals("%")) {
+                schema = null;
+            }
+            return 
wrapResultSet(jdbcDatabaseMetaData.getVersionColumns(jdbcCatalog, schema, 
table));
+        } catch (java.sql.SQLException | IllegalArgumentException exception) {
+            throw Tools.toUnoException(this, exception);
+        }
+    }
+    
+    @Override
+    public int getMaxBinaryLiteralLength() throws SQLException {
+        try {
+            return jdbcDatabaseMetaData.getMaxBinaryLiteralLength();
+        } catch (java.sql.SQLException jdbcSQLException) {
+            throw Tools.toUnoException(this, jdbcSQLException);
+        }
+    }
+    
+    @Override
+    public int getMaxRowSize() throws SQLException {
+        try {
+            return jdbcDatabaseMetaData.getMaxRowSize();
+        } catch (java.sql.SQLException jdbcSQLException) {
+            throw Tools.toUnoException(this, jdbcSQLException);
+        }
+    }
+    
+    @Override
+    public int getMaxCatalogNameLength() throws SQLException {
+        try {
+            return jdbcDatabaseMetaData.getMaxCatalogNameLength();
+        } catch (java.sql.SQLException jdbcSQLException) {
+            throw Tools.toUnoException(this, jdbcSQLException);
+        }
+    }
+    
+    @Override
+    public int getMaxCharLiteralLength() throws SQLException {
+        try {
+            return jdbcDatabaseMetaData.getMaxCharLiteralLength();
+        } catch (java.sql.SQLException jdbcSQLException) {
+            throw Tools.toUnoException(this, jdbcSQLException);
+        }
+    }
+    
+    @Override
+    public int getMaxColumnNameLength() throws SQLException {
+        try {
+            return jdbcDatabaseMetaData.getMaxColumnNameLength();
+        } catch (java.sql.SQLException jdbcSQLException) {
+            throw Tools.toUnoException(this, jdbcSQLException);
+        }
+    }
+    
+    @Override
+    public int getMaxColumnsInIndex() throws SQLException {
+        try {
+            return jdbcDatabaseMetaData.getMaxColumnsInIndex();
+        } catch (java.sql.SQLException jdbcSQLException) {
+            throw Tools.toUnoException(this, jdbcSQLException);
+        }
+    }
+    
+    @Override
+    public int getMaxCursorNameLength() throws SQLException {
+        try {
+            return jdbcDatabaseMetaData.getMaxCursorNameLength();
+        } catch (java.sql.SQLException jdbcSQLException) {
+            throw Tools.toUnoException(this, jdbcSQLException);
+        }
+    }
+    
+    @Override
+    public int getMaxConnections() throws SQLException {
+        try {
+            return jdbcDatabaseMetaData.getMaxConnections();
+        } catch (java.sql.SQLException jdbcSQLException) {
+            throw Tools.toUnoException(this, jdbcSQLException);
+        }
+    }
+    
+    @Override
+    public int getMaxColumnsInTable() throws SQLException {
+        try {
+            return jdbcDatabaseMetaData.getMaxColumnsInTable();
+        } catch (java.sql.SQLException jdbcSQLException) {
+            throw Tools.toUnoException(this, jdbcSQLException);
+        }
+    }
+    
+    @Override
+    public int getMaxStatementLength() throws SQLException {
+        try {
+            return jdbcDatabaseMetaData.getMaxStatementLength();
+        } catch (java.sql.SQLException jdbcSQLException) {
+            throw Tools.toUnoException(this, jdbcSQLException);
+        }
+    }
+    
+    @Override
+    public int getMaxTableNameLength() throws SQLException {
+        try {
+            return jdbcDatabaseMetaData.getMaxTableNameLength();
+        } catch (java.sql.SQLException jdbcSQLException) {
+            throw Tools.toUnoException(this, jdbcSQLException);
+        }
+    }
+    
+    @Override
+    public int getMaxTablesInSelect() throws SQLException {
+        try {
+            return jdbcDatabaseMetaData.getMaxTablesInSelect();
+        } catch (java.sql.SQLException jdbcSQLException) {
+            throw Tools.toUnoException(this, jdbcSQLException);
+        }
+    }
+    
+    @Override
+    public XResultSet getExportedKeys(Object catalog, String schema, String 
table) throws SQLException {
+        try {
+            String jdbcCatalog = null;
+            if (AnyConverter.isString(catalog)) {
+                jdbcCatalog = AnyConverter.toString(catalog);
+            }
+            if (schema.equals("%")) {
+                schema = null;
+            }
+            return 
wrapResultSet(jdbcDatabaseMetaData.getExportedKeys(jdbcCatalog, schema, table));
+        } catch (java.sql.SQLException | IllegalArgumentException exception) {
+            throw Tools.toUnoException(this, exception);
+        }
+    }
+    
+    @Override
+    public XResultSet getImportedKeys(Object catalog, String schema, String 
table) throws SQLException {
+        try {
+            String jdbcCatalog = null;
+            if (AnyConverter.isString(catalog)) {
+                jdbcCatalog = AnyConverter.toString(catalog);
+            }
+            if (schema.equals("%")) {
+                schema = null;
+            }
+            return 
wrapResultSet(jdbcDatabaseMetaData.getImportedKeys(jdbcCatalog, schema, table));
+        } catch (java.sql.SQLException | IllegalArgumentException exception) {
+            throw Tools.toUnoException(this, exception);
+        }
+    }
+    
+    @Override
+    public XResultSet getPrimaryKeys(Object catalog, String schema, String 
table) throws SQLException {
+        try {
+            String jdbcCatalog = null;
+            if (AnyConverter.isString(catalog)) {
+                jdbcCatalog = AnyConverter.toString(catalog);
+            }
+            if (schema.equals("%")) {
+                schema = null;
+            }
+            return 
wrapResultSet(jdbcDatabaseMetaData.getPrimaryKeys(jdbcCatalog, schema, table));
+        } catch (java.sql.SQLException | IllegalArgumentException exception) {
+            throw Tools.toUnoException(this, exception);
+        }
+    }
+    
+    @Override
+    public XResultSet getIndexInfo(Object catalog, String schema, String table,
+            boolean unique, boolean approximate) throws SQLException {
+        try {
+            String jdbcCatalog = null;
+            if (AnyConverter.isString(catalog)) {
+                jdbcCatalog = AnyConverter.toString(catalog);
+            }
+            if (schema.equals("%")) {
+                schema = null;
+            }
+            return wrapResultSet(jdbcDatabaseMetaData.getIndexInfo(
+                    jdbcCatalog, schema, table, unique, approximate));
+        } catch (java.sql.SQLException | IllegalArgumentException exception) {
+            throw Tools.toUnoException(this, exception);
+        }
+    }
+    
+    @Override
+    public XResultSet getBestRowIdentifier(Object catalog, String schema, 
String table,
+            int scope, boolean nullable) throws SQLException {
+        try {
+            String jdbcCatalog = null;
+            if (AnyConverter.isString(catalog)) {
+                jdbcCatalog = AnyConverter.toString(catalog);
+            }
+            if (schema.equals("%")) {
+                schema = null;
+            }
+            return wrapResultSet(jdbcDatabaseMetaData.getBestRowIdentifier(
+                    jdbcCatalog, schema, table, scope, nullable));
+        } catch (java.sql.SQLException | IllegalArgumentException exception) {
+            throw Tools.toUnoException(this, exception);
+        }
+    }
+
+    private XResultSetMetaData getTablesPrivilegesMetadata() {
+        CustomColumn[] columns = new CustomColumn[7];
+        columns[0] = new CustomColumn();
+        columns[0].setColumnName("TABLE_CAT");
+        columns[0].setNullable(ColumnValue.NULLABLE);
+        columns[0].setColumnDisplaySize(3);
+        columns[0].setPrecision(0);
+        columns[0].setScale(0);
+        columns[0].setColumnType(DataType.VARCHAR);
+        columns[1] = new CustomColumn();
+        columns[1].setColumnName("TABLE_SCHEM");
+        columns[1].setNullable(ColumnValue.NULLABLE);
+        columns[1].setColumnDisplaySize(3);
+        columns[1].setPrecision(0);
+        columns[1].setScale(0);
+        columns[1].setColumnType(DataType.VARCHAR);
+        columns[2] = new CustomColumn();
+        columns[2].setColumnName("TABLE_NAME");
+        columns[2].setNullable(ColumnValue.NO_NULLS);
+        columns[2].setColumnDisplaySize(3);
+        columns[2].setPrecision(0);
+        columns[2].setScale(0);
+        columns[2].setColumnType(DataType.VARCHAR);
+        columns[3] = new CustomColumn();
+        columns[3].setColumnName("GRANTOR");
+        columns[3].setNullable(ColumnValue.NULLABLE);
+        columns[3].setColumnDisplaySize(0);
+        columns[3].setPrecision(0);
+        columns[3].setScale(0);
+        columns[3].setColumnType(DataType.VARCHAR);
+        columns[4] = new CustomColumn();
+        columns[4].setColumnName("GRANTEE");
+        columns[4].setNullable(ColumnValue.NO_NULLS);
+        columns[4].setColumnDisplaySize(0);
+        columns[4].setPrecision(0);
+        columns[4].setScale(0);
+        columns[4].setColumnType(DataType.VARCHAR);
+        columns[5] = new CustomColumn();
+        columns[5].setColumnName("PRIVILEGE");
+        columns[5].setNullable(ColumnValue.NULLABLE);
+        columns[5].setColumnDisplaySize(0);
+        columns[5].setPrecision(0);
+        columns[5].setScale(0);
+        columns[5].setColumnType(DataType.VARCHAR);
+        columns[6] = new CustomColumn();
+        columns[6].setColumnName("IS_GRANTABLE");
+        columns[6].setNullable(ColumnValue.NULLABLE);
+        columns[6].setColumnDisplaySize(0);
+        columns[6].setPrecision(0);
+        columns[6].setScale(0);
+        columns[6].setColumnType(DataType.VARCHAR);
+        return new CustomResultSetMetaData(columns);
+    }
+    
+    private XResultSet generateOwnTablePrivileges(Object catalog, String 
schemaPattern,
+            String tableNamePattern) throws SQLException {
+        
+        XResultSetMetaData resultSetMetaData = getTablesPrivilegesMetadata();
+        
+        ArrayList<ORowSetValue[]> privileges = new ArrayList<>();
+        String[] privilegeTypes = {
+                "SELECT", "INSERT", "DELETE", "UPDATE", "CREATE",
+                "READ", "ALTER", "DROP", "REFERENCE"
+        };
+        XResultSet tables = getTables(catalog, schemaPattern, tableNamePattern,
+                new String[] {"VIEW", "TABLE", "%"});
+        String username = getUserName();
+        XRow row = UnoRuntime.queryInterface(XRow.class, tables);
+        while (tables.next()) {
+            for (String privilegeType : privilegeTypes) {
+                ORowSetValue[] privilege = new ORowSetValue[7];
+                privilege[0] = new ORowSetValue(row.getString(1));
+                privilege[1] = new ORowSetValue(row.getString(2));
+                privilege[2] = new ORowSetValue(row.getString(3));
+                privilege[3] = new ORowSetValue("");
+                privilege[3].setNull();
+                privilege[4] = new ORowSetValue(username);
+                privilege[5] = new ORowSetValue(privilegeType);
+                privilege[6] = new ORowSetValue("YES");
+                privileges.add(privilege);
+            }
+        }
+        return new CustomResultSet(resultSetMetaData, privileges);
+    }
+    
+    @Override
+    public XResultSet getTablePrivileges(Object catalog, String schemaPattern, 
String tableNamePattern) throws SQLException {
+        try {
+            if (connection.isIgnoreDriverPrivilegesEnabled()) {
+                return generateOwnTablePrivileges(catalog, schemaPattern, 
tableNamePattern);
+            }
+            String jdbcCatalog = null;
+            if (AnyConverter.isString(catalog)) {
+                jdbcCatalog = AnyConverter.toString(catalog);
+            }
+            if (schemaPattern.equals("%")) {
+                schemaPattern = null;
+            }
+            java.sql.ResultSet javaResults = 
jdbcDatabaseMetaData.getTablePrivileges(jdbcCatalog, schemaPattern, 
tableNamePattern);
+            if (javaResults != null) {
+                XResultSet results = new JavaSQLResultSet(javaResults, 
connection);
+                // we have to check the result columns for the tables 
privileges
+                // #106324#
+                XResultSetMetaDataSupplier metaDataSupplier = 
UnoRuntime.queryInterface(XResultSetMetaDataSupplier.class, results);
+                XResultSetMetaData metaData = null;
+                if (metaDataSupplier != null) {
+                    metaData = metaDataSupplier.getMetaData();
+                }
+                if (metaData != null && metaData.getColumnCount() != 7) {
+                    // here we know that the count of column doesn't match
+                    Map<Integer,Integer> columnMatching = new TreeMap<>();
+                    String[] privileges = new String[] {
+                            "TABLE_CAT", "TABLE_SCHEM", "TABLE_NAME", 
"GRANTOR", "GRANTEE", "PRIVILEGE", "IS_GRANTABLE"
+                    };
+                    int count = metaData.getColumnCount();
+                    for (int i = 1; i <= count; i++) {
+                        String columnName = metaData.getColumnName(i);
+                        for (int j = 0; j < privileges.length; j++) {
+                            if (columnName.equals(privileges[j])) {
+                                columnMatching.put(i, j);
+                                break;
+                            }
+                        }
+                    }
+                    // fill our own resultset
+                    ArrayList<ORowSetValue[]> rowsOut = new ArrayList<>();
+                    XRow row = UnoRuntime.queryInterface(XRow.class, results);
+                    while (results.next()) {
+                        ORowSetValue[] rowOut = new ORowSetValue[7];
+                        for (int i = 0; i < rowOut.length; i++) {
+                            rowOut[i] = new ORowSetValue("");
+                            rowOut[i].setNull();
+                        }
+                        for (Map.Entry<Integer,Integer> entry : 
columnMatching.entrySet()) {
+                            String value = row.getString(entry.getKey());
+                            if (row.wasNull()) {
+                                rowOut[entry.getValue()].setNull();
+                            } else {
+                                rowOut[entry.getValue()].setString(value);
+                            }
+                        }
+                        rowsOut.add(rowOut);
+                    }
+                    results = new 
CustomResultSet(getTablesPrivilegesMetadata(), rowsOut);                    
+                }
+                return results;
+            } else {
+                return null;
+            }
+        } catch (java.sql.SQLException | IllegalArgumentException exception) {
+            throw Tools.toUnoException(this, exception);
+        }
+    }
+    
+    @Override
+    public XResultSet getCrossReference(Object primaryCatalog, String 
primarySchema, String primaryTable,
+            Object foreignCatalog, String foreignSchema, String foreignTable) 
throws SQLException {
+        try {
+            String jdbcPrimaryCatalog = null;
+            if (AnyConverter.isString(primaryCatalog)) {
+                jdbcPrimaryCatalog = AnyConverter.toString(primaryCatalog);
+            }
+            String jdbcForeignCatalog = null;
+            if (AnyConverter.isString(foreignCatalog)) {
+                jdbcForeignCatalog = AnyConverter.toString(foreignCatalog);
+            }
+            if (primarySchema.equals("%")) {
+                primarySchema = null;
+            }
+            if (foreignSchema.equals("%")) {
+                foreignSchema = null;
+            }
+            return wrapResultSet(jdbcDatabaseMetaData.getCrossReference(
+                    jdbcPrimaryCatalog, primarySchema, primaryTable,
+                    jdbcForeignCatalog, foreignSchema, foreignTable));
+        } catch (java.sql.SQLException | IllegalArgumentException exception) {
+            throw Tools.toUnoException(this, exception);
+        }
+    }
+    
+    @Override
+    public boolean doesMaxRowSizeIncludeBlobs() throws SQLException {
+        try {
+            return jdbcDatabaseMetaData.doesMaxRowSizeIncludeBlobs();
+        } catch (java.sql.SQLException jdbcSQLException) {
+            throw Tools.toUnoException(this, jdbcSQLException);
+        }
+    }
+    
+    @Override
+    public boolean storesLowerCaseQuotedIdentifiers() throws SQLException {
+        try {
+            return jdbcDatabaseMetaData.storesLowerCaseQuotedIdentifiers();
+        } catch (java.sql.SQLException jdbcSQLException) {
+            throw Tools.toUnoException(this, jdbcSQLException);
+        }
+    }
+    
+    @Override
+    public boolean storesLowerCaseIdentifiers() throws SQLException {
+        try {
+            return jdbcDatabaseMetaData.storesLowerCaseIdentifiers();
+        } catch (java.sql.SQLException jdbcSQLException) {
+            throw Tools.toUnoException(this, jdbcSQLException);
+        }
+    }
+    
+    @Override
+    public boolean storesMixedCaseIdentifiers() throws SQLException {
+        try {
+            return jdbcDatabaseMetaData.storesMixedCaseIdentifiers();
+        } catch (java.sql.SQLException jdbcSQLException) {
+            throw Tools.toUnoException(this, jdbcSQLException);
+        }
+    }
+    
+    @Override
+    public boolean storesMixedCaseQuotedIdentifiers() throws SQLException {
+        try {
+            return jdbcDatabaseMetaData.storesMixedCaseQuotedIdentifiers();
+        } catch (java.sql.SQLException jdbcSQLException) {
+            throw Tools.toUnoException(this, jdbcSQLException);
+        }
+    }
+    
+    @Override
+    public boolean storesUpperCaseQuotedIdentifiers() throws SQLException {
+        try {
+            return jdbcDatabaseMetaData.storesUpperCaseQuotedIdentifiers();
+        } catch (java.sql.SQLException jdbcSQLException) {
+            throw Tools.toUnoException(this, jdbcSQLException);
+        }
+    }
+    
+    @Override
+    public boolean storesUpperCaseIdentifiers() throws SQLException {
+        try {
+            return jdbcDatabaseMetaData.storesUpperCaseIdentifiers();
+        } catch (java.sql.SQLException jdbcSQLException) {
+            throw Tools.toUnoException(this, jdbcSQLException);
+        }
+    }
+    
+    @Override
+    public boolean supportsAlterTableWithAddColumn() throws SQLException {
+        try {
+            return jdbcDatabaseMetaData.supportsAlterTableWithAddColumn();
+        } catch (java.sql.SQLException jdbcSQLException) {
+            throw Tools.toUnoException(this, jdbcSQLException);
+        }
+    }
+    
+    @Override
+    public boolean supportsAlterTableWithDropColumn() throws SQLException {
+        try {
+            return jdbcDatabaseMetaData.supportsAlterTableWithDropColumn();
+        } catch (java.sql.SQLException jdbcSQLException) {
+            throw Tools.toUnoException(this, jdbcSQLException);
+        }
+    }
+    
+    @Override
+    public int getMaxIndexLength() throws SQLException {
+        try {
+            return jdbcDatabaseMetaData.getMaxIndexLength();
+        } catch (java.sql.SQLException jdbcSQLException) {
+            throw Tools.toUnoException(this, jdbcSQLException);
+        }
+    }
+    
+    @Override
+    public boolean supportsNonNullableColumns() throws SQLException {
+        try {
+            return jdbcDatabaseMetaData.supportsNonNullableColumns();
+        } catch (java.sql.SQLException jdbcSQLException) {
+            throw Tools.toUnoException(this, jdbcSQLException);
+        }
+    }
+    
+    @Override
+    public String getCatalogTerm() throws SQLException {
+        try {
+            return jdbcDatabaseMetaData.getCatalogTerm();
+        } catch (java.sql.SQLException jdbcSQLException) {
+            throw Tools.toUnoException(this, jdbcSQLException);
+        }
+    }
+    
+    @Override
+    public String getIdentifierQuoteString() throws SQLException {
+        try {
+            return jdbcDatabaseMetaData.getIdentifierQuoteString();
+        } catch (java.sql.SQLException jdbcSQLException) {
+            throw Tools.toUnoException(this, jdbcSQLException);
+        }
+    }
+    
+    @Override
+    public String getExtraNameCharacters() throws SQLException {
+        try {
+            return jdbcDatabaseMetaData.getExtraNameCharacters();
+        } catch (java.sql.SQLException jdbcSQLException) {
+            throw Tools.toUnoException(this, jdbcSQLException);
+        }
+    }
+    
+    @Override
+    public boolean supportsDifferentTableCorrelationNames() throws 
SQLException {
+        try {
+            return 
jdbcDatabaseMetaData.supportsDifferentTableCorrelationNames();
+        } catch (java.sql.SQLException jdbcSQLException) {
+            throw Tools.toUnoException(this, jdbcSQLException);
+        }
+    }
+    
+    @Override
+    public boolean isCatalogAtStart() throws SQLException {
+        try {
+            return jdbcDatabaseMetaData.isCatalogAtStart();
+        } catch (java.sql.SQLException jdbcSQLException) {
+            throw Tools.toUnoException(this, jdbcSQLException);
+        }
+    }
+    
+    @Override
+    public boolean dataDefinitionIgnoredInTransactions() throws SQLException {
+        try {
+            return jdbcDatabaseMetaData.dataDefinitionIgnoredInTransactions();
+        } catch (java.sql.SQLException jdbcSQLException) {
+            throw Tools.toUnoException(this, jdbcSQLException);
+        }
+    }
+    
+    @Override
+    public boolean dataDefinitionCausesTransactionCommit() throws SQLException 
{
+        try {
+            return 
jdbcDatabaseMetaData.dataDefinitionCausesTransactionCommit();
+        } catch (java.sql.SQLException jdbcSQLException) {
+            throw Tools.toUnoException(this, jdbcSQLException);
+        }
+    }
+    
+    @Override
+    public boolean supportsDataManipulationTransactionsOnly() throws 
SQLException {
+        try {
+            return 
jdbcDatabaseMetaData.supportsDataDefinitionAndDataManipulationTransactions();
+        } catch (java.sql.SQLException jdbcSQLException) {
+            throw Tools.toUnoException(this, jdbcSQLException);
+        }
+    }
+    
+    @Override
+    public boolean supportsDataDefinitionAndDataManipulationTransactions() 
throws SQLException {
+        try {
+            return 
jdbcDatabaseMetaData.supportsDataDefinitionAndDataManipulationTransactions();
+        } catch (java.sql.SQLException jdbcSQLException) {
+            throw Tools.toUnoException(this, jdbcSQLException);
+        }
+    }
+    
+    @Override
+    public boolean supportsPositionedDelete() throws SQLException {
+        try {
+            return jdbcDatabaseMetaData.supportsPositionedDelete();
+        } catch (java.sql.SQLException jdbcSQLException) {
+            throw Tools.toUnoException(this, jdbcSQLException);
+        }
+    }
+    
+    @Override
+    public boolean supportsPositionedUpdate() throws SQLException {
+        try {
+            return jdbcDatabaseMetaData.supportsPositionedUpdate();
+        } catch (java.sql.SQLException jdbcSQLException) {
+            throw Tools.toUnoException(this, jdbcSQLException);
+        }
+    }
+    
+    @Override
+    public boolean supportsOpenStatementsAcrossRollback() throws SQLException {
+        try {
+            return jdbcDatabaseMetaData.supportsOpenStatementsAcrossRollback();
+        } catch (java.sql.SQLException jdbcSQLException) {
+            throw Tools.toUnoException(this, jdbcSQLException);
+        }
+    }
+    
+    @Override
+    public boolean supportsOpenStatementsAcrossCommit() throws SQLException {
+        try {
+            return jdbcDatabaseMetaData.supportsOpenStatementsAcrossCommit();
+        } catch (java.sql.SQLException jdbcSQLException) {
+            throw Tools.toUnoException(this, jdbcSQLException);
+        }
+    }
+    
+    @Override
+    public boolean supportsOpenCursorsAcrossCommit() throws SQLException {
+        try {
+            return jdbcDatabaseMetaData.supportsOpenCursorsAcrossCommit();
+        } catch (java.sql.SQLException jdbcSQLException) {
+            throw Tools.toUnoException(this, jdbcSQLException);
+        }
+    }
+    
+    @Override
+    public boolean supportsOpenCursorsAcrossRollback() throws SQLException {
+        try {
+            return jdbcDatabaseMetaData.supportsOpenCursorsAcrossRollback();
+        } catch (java.sql.SQLException jdbcSQLException) {
+            throw Tools.toUnoException(this, jdbcSQLException);
+        }
+    }
+    
+    @Override
+    public boolean supportsTransactionIsolationLevel(int level) throws 
SQLException {
+        try {
+            return 
jdbcDatabaseMetaData.supportsTransactionIsolationLevel(level);
+        } catch (java.sql.SQLException jdbcSQLException) {
+            throw Tools.toUnoException(this, jdbcSQLException);
+        }
+    }
+    
+    @Override
+    public boolean supportsSchemasInDataManipulation() throws SQLException {
+        try {
+            return jdbcDatabaseMetaData.supportsSchemasInDataManipulation();
+        } catch (java.sql.SQLException jdbcSQLException) {
+            throw Tools.toUnoException(this, jdbcSQLException);
+        }
+    }
+    
+    @Override
+    public boolean supportsANSI92FullSQL() throws SQLException {
+        try {
+            return jdbcDatabaseMetaData.supportsANSI92FullSQL();
+        } catch (java.sql.SQLException jdbcSQLException) {
+            throw Tools.toUnoException(this, jdbcSQLException);
+        }
+    }
+    
+    @Override
+    public boolean supportsANSI92EntryLevelSQL() throws SQLException {
+        try {
+            return jdbcDatabaseMetaData.supportsANSI92EntryLevelSQL();
+        } catch (java.sql.SQLException jdbcSQLException) {
+            throw Tools.toUnoException(this, jdbcSQLException);
+        }
+    }
+    
+    @Override
+    public boolean supportsIntegrityEnhancementFacility() throws SQLException {
+        try {
+            return jdbcDatabaseMetaData.supportsIntegrityEnhancementFacility();
+        } catch (java.sql.SQLException jdbcSQLException) {
+            throw Tools.toUnoException(this, jdbcSQLException);
+        }
+    }
+    
+    @Override
+    public boolean supportsSchemasInIndexDefinitions() throws SQLException {
+        try {
+            return jdbcDatabaseMetaData.supportsSchemasInIndexDefinitions();
+        } catch (java.sql.SQLException jdbcSQLException) {
+            throw Tools.toUnoException(this, jdbcSQLException);
+        }
+    }
+    
+    @Override
+    public boolean supportsCatalogsInIndexDefinitions() throws SQLException {
+        try {
+            return jdbcDatabaseMetaData.supportsCatalogsInIndexDefinitions();
+        } catch (java.sql.SQLException jdbcSQLException) {
+            throw Tools.toUnoException(this, jdbcSQLException);
+        }
+    }
+    
+    @Override
+    public boolean supportsCatalogsInDataManipulation() throws SQLException {
+        try {
+            return jdbcDatabaseMetaData.supportsCatalogsInDataManipulation();
+        } catch (java.sql.SQLException jdbcSQLException) {
+            throw Tools.toUnoException(this, jdbcSQLException);
+        }
+    }
+    
+    @Override
+    public boolean supportsCatalogsInTableDefinitions() throws SQLException {
+        try {
+            return jdbcDatabaseMetaData.supportsCatalogsInTableDefinitions();
+        } catch (java.sql.SQLException jdbcSQLException) {
+            throw Tools.toUnoException(this, jdbcSQLException);
+        }
+    }
+    
+    @Override
+    public boolean supportsSchemasInTableDefinitions() throws SQLException {
+        try {
+            return jdbcDatabaseMetaData.supportsSchemasInTableDefinitions();
+        } catch (java.sql.SQLException jdbcSQLException) {
+            throw Tools.toUnoException(this, jdbcSQLException);
+        }
+    }
+    
+    @Override
+    public boolean supportsOuterJoins() throws SQLException {
+        try {
+            return jdbcDatabaseMetaData.supportsOuterJoins();
+        } catch (java.sql.SQLException jdbcSQLException) {
+            throw Tools.toUnoException(this, jdbcSQLException);
+        }
+    }
+    
+    @Override
+    public XResultSet getTableTypes() throws SQLException {
+        try {
+            return new JavaSQLResultSet(jdbcDatabaseMetaData.getTableTypes(), 
connection);
+        } catch (java.sql.SQLException jdbcSQLException) {
+            throw Tools.toUnoException(this, jdbcSQLException);
+        }
+    }
+    
+    @Override
+    public int getMaxStatements() throws SQLException {
+        try {
+            return jdbcDatabaseMetaData.getMaxStatements();
+        } catch (java.sql.SQLException jdbcSQLException) {
+            throw Tools.toUnoException(this, jdbcSQLException);
+        }
+    }
+    
+    @Override
+    public int getMaxProcedureNameLength() throws SQLException {
+        try {
+            return jdbcDatabaseMetaData.getMaxProcedureNameLength();
+        } catch (java.sql.SQLException jdbcSQLException) {
+            throw Tools.toUnoException(this, jdbcSQLException);
+        }
+    }
+    
+    @Override
+    public int getMaxSchemaNameLength() throws SQLException {
+        try {
+            return jdbcDatabaseMetaData.getMaxSchemaNameLength();
+        } catch (java.sql.SQLException jdbcSQLException) {
+            throw Tools.toUnoException(this, jdbcSQLException);
+        }
+    }
+    
+    @Override
+    public boolean supportsTransactions() throws SQLException {
+        try {
+            return jdbcDatabaseMetaData.supportsTransactions();
+        } catch (java.sql.SQLException jdbcSQLException) {
+            throw Tools.toUnoException(this, jdbcSQLException);
+        }
+    }
+    
+    @Override
+    public boolean allProceduresAreCallable() throws SQLException {
+        try {
+            return jdbcDatabaseMetaData.allProceduresAreCallable();
+        } catch (java.sql.SQLException jdbcSQLException) {
+            throw Tools.toUnoException(this, jdbcSQLException);
+        }
+    }
+    
+    @Override
+    public boolean supportsStoredProcedures() throws SQLException {
+        try {
+            return jdbcDatabaseMetaData.supportsStoredProcedures();
+        } catch (java.sql.SQLException jdbcSQLException) {
+            throw Tools.toUnoException(this, jdbcSQLException);
+        }
+    }
+    
+    @Override
+    public boolean supportsSelectForUpdate() throws SQLException {
+        try {
+            return jdbcDatabaseMetaData.supportsSelectForUpdate();
+        } catch (java.sql.SQLException jdbcSQLException) {
+            throw Tools.toUnoException(this, jdbcSQLException);
+        }
+    }
+    
+    @Override
+    public boolean allTablesAreSelectable() throws SQLException {
+        try {
+            return jdbcDatabaseMetaData.allTablesAreSelectable();
+        } catch (java.sql.SQLException jdbcSQLException) {
+            throw Tools.toUnoException(this, jdbcSQLException);
+        }
+    }
+    
+    @Override
+    public boolean isReadOnly() throws SQLException {
+        try {
+            return jdbcDatabaseMetaData.isReadOnly();
+        } catch (java.sql.SQLException jdbcSQLException) {
+            throw Tools.toUnoException(this, jdbcSQLException);
+        }
+    }
+    
+    @Override
+    public boolean usesLocalFiles() throws SQLException {
+        try {
+            return jdbcDatabaseMetaData.usesLocalFiles();
+        } catch (java.sql.SQLException jdbcSQLException) {
+            throw Tools.toUnoException(this, jdbcSQLException);
+        }
+    }
+    
+    @Override
+    public boolean usesLocalFilePerTable() throws SQLException {
+        try {
+            return jdbcDatabaseMetaData.usesLocalFilePerTable();
+        } catch (java.sql.SQLException jdbcSQLException) {
+            throw Tools.toUnoException(this, jdbcSQLException);
+        }
+    }
+    
+    @Override
+    public boolean supportsTypeConversion() throws SQLException {
+        // This was calling JDBC's supportsTypeConversion(), which doesn't 
exist
+        try {
+            return jdbcDatabaseMetaData.supportsConvert();
+        } catch (java.sql.SQLException jdbcSQLException) {
+            throw Tools.toUnoException(this, jdbcSQLException);
+        }
+    }
+    
+    @Override
+    public boolean nullPlusNonNullIsNull() throws SQLException {
+        try {
+            return jdbcDatabaseMetaData.nullPlusNonNullIsNull();
+        } catch (java.sql.SQLException jdbcSQLException) {
+            throw Tools.toUnoException(this, jdbcSQLException);
+        }
+    }
+    
+    @Override
+    public boolean supportsColumnAliasing() throws SQLException {
+        try {
+            return jdbcDatabaseMetaData.supportsColumnAliasing();
+        } catch (java.sql.SQLException jdbcSQLException) {
+            throw Tools.toUnoException(this, jdbcSQLException);
+        }
+    }
+    
+    @Override
+    public boolean supportsTableCorrelationNames() throws SQLException {
+        try {
+            return jdbcDatabaseMetaData.supportsTableCorrelationNames();
+        } catch (java.sql.SQLException jdbcSQLException) {
+            throw Tools.toUnoException(this, jdbcSQLException);
+        }
+    }
+    
+    @Override
+    public boolean supportsConvert(int fromType, int toType) throws 
SQLException {
+        try {
+            return jdbcDatabaseMetaData.supportsConvert(fromType, toType);
+        } catch (java.sql.SQLException jdbcSQLException) {
+            throw Tools.toUnoException(this, jdbcSQLException);
+        }
+    }
+    
+    @Override
+    public boolean supportsExpressionsInOrderBy() throws SQLException {
+        try {
+            return jdbcDatabaseMetaData.supportsExpressionsInOrderBy();
+        } catch (java.sql.SQLException jdbcSQLException) {
+            throw Tools.toUnoException(this, jdbcSQLException);
+        }
+    }
+    
+    @Override
+    public boolean supportsGroupBy() throws SQLException {
+        try {
+            return jdbcDatabaseMetaData.supportsGroupBy();
+        } catch (java.sql.SQLException jdbcSQLException) {
+            throw Tools.toUnoException(this, jdbcSQLException);
+        }
+    }
+    
+    @Override
+    public boolean supportsGroupByBeyondSelect() throws SQLException {
+        try {
+            return jdbcDatabaseMetaData.supportsGroupByBeyondSelect();
+        } catch (java.sql.SQLException jdbcSQLException) {
+            throw Tools.toUnoException(this, jdbcSQLException);
+        }
+    }
+    
+    @Override
+    public boolean supportsGroupByUnrelated() throws SQLException {
+        try {
+            return jdbcDatabaseMetaData.supportsGroupByUnrelated();
+        } catch (java.sql.SQLException jdbcSQLException) {
+            throw Tools.toUnoException(this, jdbcSQLException);
+        }
+    }
+    
+    @Override
+    public boolean supportsMultipleTransactions() throws SQLException {
+        try {
+            return jdbcDatabaseMetaData.supportsMultipleTransactions();
+        } catch (java.sql.SQLException jdbcSQLException) {
+            throw Tools.toUnoException(this, jdbcSQLException);
+        }
+    }
+    
+    @Override
+    public boolean supportsMultipleResultSets() throws SQLException {
+        try {
+            return jdbcDatabaseMetaData.supportsMultipleResultSets();
+        } catch (java.sql.SQLException jdbcSQLException) {
+            throw Tools.toUnoException(this, jdbcSQLException);
+        }
+    }
+    
+    @Override
+    public boolean supportsLikeEscapeClause() throws SQLException {
+        try {
+            return jdbcDatabaseMetaData.supportsLikeEscapeClause();
+        } catch (java.sql.SQLException jdbcSQLException) {
+            throw Tools.toUnoException(this, jdbcSQLException);
+        }
+    }
+    
+    @Override
+    public boolean supportsOrderByUnrelated() throws SQLException {
+        try {
+            return jdbcDatabaseMetaData.supportsOrderByUnrelated();
+        } catch (java.sql.SQLException jdbcSQLException) {
+            throw Tools.toUnoException(this, jdbcSQLException);
+        }
+    }
+    
+    @Override
+    public boolean supportsUnion() throws SQLException {
+        try {
+            return jdbcDatabaseMetaData.supportsUnion();
+        } catch (java.sql.SQLException jdbcSQLException) {
+            throw Tools.toUnoException(this, jdbcSQLException);
+        }
+    }
+    
+    @Override
+    public boolean supportsUnionAll() throws SQLException {
+        try {
+            return jdbcDatabaseMetaData.supportsUnionAll();
+        } catch (java.sql.SQLException jdbcSQLException) {
+            throw Tools.toUnoException(this, jdbcSQLException);
+        }
+    }
+    
+    @Override
+    public boolean supportsMixedCaseIdentifiers() throws SQLException {
+        try {
+            return jdbcDatabaseMetaData.supportsMixedCaseIdentifiers();
+        } catch (java.sql.SQLException jdbcSQLException) {
+            throw Tools.toUnoException(this, jdbcSQLException);
+        }
+    }
+    
+    @Override
+    public boolean supportsMixedCaseQuotedIdentifiers() throws SQLException {
+        try {
+            return jdbcDatabaseMetaData.supportsMixedCaseQuotedIdentifiers();
+        } catch (java.sql.SQLException jdbcSQLException) {
+            throw Tools.toUnoException(this, jdbcSQLException);
+        }
+    }
+    
+    @Override
+    public boolean nullsAreSortedAtEnd() throws SQLException {
+        try {
+            return jdbcDatabaseMetaData.nullsAreSortedAtEnd();
+        } catch (java.sql.SQLException jdbcSQLException) {
+            throw Tools.toUnoException(this, jdbcSQLException);
+        }
+    }
+    
+    @Override
+    public boolean nullsAreSortedAtStart() throws SQLException {
+        try {
+            return jdbcDatabaseMetaData.nullsAreSortedAtStart();
+        } catch (java.sql.SQLException jdbcSQLException) {
+            throw Tools.toUnoException(this, jdbcSQLException);
+        }
+    }
+    
+    @Override
+    public boolean nullsAreSortedHigh() throws SQLException {
+        try {
+            return jdbcDatabaseMetaData.nullsAreSortedHigh();
+        } catch (java.sql.SQLException jdbcSQLException) {
+            throw Tools.toUnoException(this, jdbcSQLException);
+        }
+    }
+    
+    @Override
+    public boolean nullsAreSortedLow() throws SQLException {
+        try {
+            return jdbcDatabaseMetaData.nullsAreSortedLow();
+        } catch (java.sql.SQLException jdbcSQLException) {
+            throw Tools.toUnoException(this, jdbcSQLException);
+        }
+    }
+    
+    @Override
+    public boolean supportsCatalogsInProcedureCalls() throws SQLException {
+        try {
+            return jdbcDatabaseMetaData.supportsCatalogsInProcedureCalls();
+        } catch (java.sql.SQLException jdbcSQLException) {
+            throw Tools.toUnoException(this, jdbcSQLException);
+        }
+    }
+    
+    @Override
+    public boolean supportsSchemasInProcedureCalls() throws SQLException {
+        try {
+            return jdbcDatabaseMetaData.supportsSchemasInProcedureCalls();
+        } catch (java.sql.SQLException jdbcSQLException) {
+            throw Tools.toUnoException(this, jdbcSQLException);
+        }
+    }
+    
+    @Override
+    public boolean supportsCatalogsInPrivilegeDefinitions() throws 
SQLException {
+        try {
+            return 
jdbcDatabaseMetaData.supportsCatalogsInPrivilegeDefinitions();
+        } catch (java.sql.SQLException jdbcSQLException) {
+            throw Tools.toUnoException(this, jdbcSQLException);
+        }
+    }
+    
+    @Override
+    public boolean supportsSchemasInPrivilegeDefinitions() throws SQLException 
{
+        try {
+            return 
jdbcDatabaseMetaData.supportsSchemasInPrivilegeDefinitions();
+        } catch (java.sql.SQLException jdbcSQLException) {
+            throw Tools.toUnoException(this, jdbcSQLException);
+        }
+    }
+    
+    @Override
+    public boolean supportsCorrelatedSubqueries() throws SQLException {
+        try {
+            return jdbcDatabaseMetaData.supportsCorrelatedSubqueries();
+        } catch (java.sql.SQLException jdbcSQLException) {
+            throw Tools.toUnoException(this, jdbcSQLException);
+        }
+    }
+    
+    @Override
+    public boolean supportsSubqueriesInComparisons() throws SQLException {
+        try {
+            return jdbcDatabaseMetaData.supportsSubqueriesInComparisons();
+        } catch (java.sql.SQLException jdbcSQLException) {
+            throw Tools.toUnoException(this, jdbcSQLException);
+        }
+    }
+    
+    @Override
+    public boolean supportsSubqueriesInExists() throws SQLException {
+        try {
+            return jdbcDatabaseMetaData.supportsSubqueriesInExists();
+        } catch (java.sql.SQLException jdbcSQLException) {
+            throw Tools.toUnoException(this, jdbcSQLException);
+        }
+    }
+    
+    @Override
+    public boolean supportsSubqueriesInIns() throws SQLException {
+        try {
+            return jdbcDatabaseMetaData.supportsSubqueriesInIns();
+        } catch (java.sql.SQLException jdbcSQLException) {
+            throw Tools.toUnoException(this, jdbcSQLException);
+        }
+    }
+    
+    @Override
+    public boolean supportsSubqueriesInQuantifieds() throws SQLException {
+        try {
+            return jdbcDatabaseMetaData.supportsSubqueriesInQuantifieds();
+        } catch (java.sql.SQLException jdbcSQLException) {
+            throw Tools.toUnoException(this, jdbcSQLException);
+        }
+    }
+    
+    @Override
+    public boolean supportsANSI92IntermediateSQL() throws SQLException {
+        try {
+            return jdbcDatabaseMetaData.supportsANSI92IntermediateSQL();
+        } catch (java.sql.SQLException jdbcSQLException) {
+            throw Tools.toUnoException(this, jdbcSQLException);
+        }
+    }
+    
+    @Override
+    public String getURL() throws SQLException {
+        String url = connection.getURL();
+        if (url == null) {
+            try {
+                url = jdbcDatabaseMetaData.getURL();
+            } catch (java.sql.SQLException jdbcSQLException) {
+                throw Tools.toUnoException(this, jdbcSQLException);
+            }            
+        }
+        return url;
+    }
+    
+    @Override
+    public String getUserName() throws SQLException {
+        try {
+            return jdbcDatabaseMetaData.getUserName();
+        } catch (java.sql.SQLException jdbcSQLException) {
+            throw Tools.toUnoException(this, jdbcSQLException);
+        }
+    }
+    
+    @Override
+    public String getDriverName() throws SQLException {
+        try {
+            return jdbcDatabaseMetaData.getDriverName();
+        } catch (java.sql.SQLException jdbcSQLException) {
+            throw Tools.toUnoException(this, jdbcSQLException);
+        }
+    }
+    
+    @Override
+    public String getDriverVersion() throws SQLException {
+        try {
+            return jdbcDatabaseMetaData.getDriverVersion();
+        } catch (java.sql.SQLException jdbcSQLException) {
+            throw Tools.toUnoException(this, jdbcSQLException);
+        }
+    }
+    
+    @Override
+    public String getDatabaseProductVersion() throws SQLException {
+        try {
+            return jdbcDatabaseMetaData.getDatabaseProductVersion();
+        } catch (java.sql.SQLException jdbcSQLException) {
+            throw Tools.toUnoException(this, jdbcSQLException);
+        }
+    }
+    
+    @Override
+    public String getDatabaseProductName() throws SQLException {
+        try {
+            return jdbcDatabaseMetaData.getDatabaseProductName();
+        } catch (java.sql.SQLException jdbcSQLException) {
+            throw Tools.toUnoException(this, jdbcSQLException);
+        }
+    }
+    
+    @Override
+    public String getProcedureTerm() throws SQLException {
+        try {
+            return jdbcDatabaseMetaData.getProcedureTerm();
+        } catch (java.sql.SQLException jdbcSQLException) {
+            throw Tools.toUnoException(this, jdbcSQLException);
+        }
+    }
+    
+    @Override
+    public String getSchemaTerm() throws SQLException {
+        try {
+            return jdbcDatabaseMetaData.getSchemaTerm();
+        } catch (java.sql.SQLException jdbcSQLException) {
+            throw Tools.toUnoException(this, jdbcSQLException);
+        }
+    }
+    
+    @Override
+    public int getDriverMajorVersion() {
+        return jdbcDatabaseMetaData.getDriverMajorVersion();
+    }
+    
+    @Override
+    public int getDriverMinorVersion() {
+        return jdbcDatabaseMetaData.getDriverMinorVersion();
+    }
+    
+    @Override
+    public int getDefaultTransactionIsolation() throws SQLException {
+        try {
+            return jdbcDatabaseMetaData.getDefaultTransactionIsolation();
+        } catch (java.sql.SQLException jdbcSQLException) {
+            throw Tools.toUnoException(this, jdbcSQLException);
+        }
+    }
+    
+    @Override
+    public String getSQLKeywords() throws SQLException {
+        try {
+            return jdbcDatabaseMetaData.getSQLKeywords();
+        } catch (java.sql.SQLException jdbcSQLException) {
+            throw Tools.toUnoException(this, jdbcSQLException);
+        }
+    }
+    
+    @Override
+    public String getSearchStringEscape() throws SQLException {
+        try {
+            return jdbcDatabaseMetaData.getSearchStringEscape();
+        } catch (java.sql.SQLException jdbcSQLException) {
+            throw Tools.toUnoException(this, jdbcSQLException);
+        }
+    }
+    
+    @Override
+    public String getStringFunctions() throws SQLException {
+        try {
+            return jdbcDatabaseMetaData.getStringFunctions();
+        } catch (java.sql.SQLException jdbcSQLException) {
+            throw Tools.toUnoException(this, jdbcSQLException);
+        }
+    }
+    
+    @Override
+    public String getTimeDateFunctions() throws SQLException {
+        try {
+            return jdbcDatabaseMetaData.getTimeDateFunctions();
+        } catch (java.sql.SQLException jdbcSQLException) {
+            throw Tools.toUnoException(this, jdbcSQLException);
+        }
+    }
+    
+    @Override
+    public String getSystemFunctions() throws SQLException {
+        try {
+            return jdbcDatabaseMetaData.getSystemFunctions();
+        } catch (java.sql.SQLException jdbcSQLException) {
+            throw Tools.toUnoException(this, jdbcSQLException);
+        }
+    }
+    
+    @Override
+    public String getNumericFunctions() throws SQLException {
+        try {
+            return jdbcDatabaseMetaData.getNumericFunctions();
+        } catch (java.sql.SQLException jdbcSQLException) {
+            throw Tools.toUnoException(this, jdbcSQLException);
+        }
+    }
+    
+    @Override
+    public boolean supportsExtendedSQLGrammar() throws SQLException {
+        try {
+            return jdbcDatabaseMetaData.supportsExtendedSQLGrammar();
+        } catch (java.sql.SQLException jdbcSQLException) {
+            throw Tools.toUnoException(this, jdbcSQLException);
+        }
+    }
+    
+    @Override
+    public boolean supportsCoreSQLGrammar() throws SQLException {
+        try {
+            return jdbcDatabaseMetaData.supportsCoreSQLGrammar();
+        } catch (java.sql.SQLException jdbcSQLException) {
+            throw Tools.toUnoException(this, jdbcSQLException);
+        }
+    }
+    
+    public boolean supportsMinimumSQLGrammar() {
+        try {
+            return jdbcDatabaseMetaData.supportsMinimumSQLGrammar();
+        } catch (java.sql.SQLException jdbcSQLException) {
+            // FIXME: SDBC bug. Must be able to throw exception.
+            //throw Tools.toUnoException(this, jdbcSQLException);
+            return false;
+        }
+    }
+    
+    @Override
+    public boolean supportsFullOuterJoins() throws SQLException {
+        try {
+            return jdbcDatabaseMetaData.supportsFullOuterJoins();
+        } catch (java.sql.SQLException jdbcSQLException) {
+            throw Tools.toUnoException(this, jdbcSQLException);
+        }
+    }
+    
+    @Override
+    public boolean supportsLimitedOuterJoins() throws SQLException {
+        try {
+            return jdbcDatabaseMetaData.supportsLimitedOuterJoins();
+        } catch (java.sql.SQLException jdbcSQLException) {
+            throw Tools.toUnoException(this, jdbcSQLException);
+        }
+    }
+    
+    @Override
+    public int getMaxColumnsInGroupBy() throws SQLException {
+        try {
+            return jdbcDatabaseMetaData.getMaxColumnsInGroupBy();
+        } catch (java.sql.SQLException jdbcSQLException) {
+            throw Tools.toUnoException(this, jdbcSQLException);
+        }
+    }
+    
+    @Override
+    public int getMaxColumnsInOrderBy() throws SQLException {
+        try {
+            return jdbcDatabaseMetaData.getMaxColumnsInOrderBy();
+        } catch (java.sql.SQLException jdbcSQLException) {
+            throw Tools.toUnoException(this, jdbcSQLException);
+        }
+    }
+    
+    @Override
+    public int getMaxColumnsInSelect() throws SQLException {
+        try {
+            return jdbcDatabaseMetaData.getMaxColumnsInSelect();
+        } catch (java.sql.SQLException jdbcSQLException) {
+            throw Tools.toUnoException(this, jdbcSQLException);
+        }
+    }
+    
+    @Override
+    public int getMaxUserNameLength() throws SQLException {
+        try {
+            return jdbcDatabaseMetaData.getMaxUserNameLength();
+        } catch (java.sql.SQLException jdbcSQLException) {
+            throw Tools.toUnoException(this, jdbcSQLException);
+        }
+    }
+    
+    @Override
+    public boolean supportsResultSetType(int type) throws SQLException {
+        try {
+            return jdbcDatabaseMetaData.supportsResultSetType(type);
+        } catch (java.sql.SQLException jdbcSQLException) {
+            throw Tools.toUnoException(this, jdbcSQLException);
+        }
+    }
+    
+    @Override
+    public boolean supportsResultSetConcurrency(int setType, int concurrency) 
throws SQLException {
+        try {
+            return jdbcDatabaseMetaData.supportsResultSetConcurrency(setType, 
concurrency);
+        } catch (java.sql.SQLException jdbcSQLException) {
+            throw Tools.toUnoException(this, jdbcSQLException);
+        }
+    }
+    
+    @Override
+    public boolean ownUpdatesAreVisible(int setType) throws SQLException {
+        try {
+            return jdbcDatabaseMetaData.ownUpdatesAreVisible(setType);
+        } catch (java.sql.SQLException jdbcSQLException) {
+            throw Tools.toUnoException(this, jdbcSQLException);
+        }
+    }
+    
+    @Override
+    public boolean ownDeletesAreVisible(int setType) throws SQLException {
+        try {
+            return jdbcDatabaseMetaData.ownDeletesAreVisible(setType);
+        } catch (java.sql.SQLException jdbcSQLException) {
+            throw Tools.toUnoException(this, jdbcSQLException);
+        }
+    }
+    
+    @Override
+    public boolean ownInsertsAreVisible(int setType) throws SQLException {
+        try {
+            return jdbcDatabaseMetaData.ownInsertsAreVisible(setType);
+        } catch (java.sql.SQLException jdbcSQLException) {
+            throw Tools.toUnoException(this, jdbcSQLException);
+        }
+    }
+    
+    @Override
+    public boolean othersUpdatesAreVisible(int setType) throws SQLException {
+        try {
+            return jdbcDatabaseMetaData.othersUpdatesAreVisible(setType);
+        } catch (java.sql.SQLException jdbcSQLException) {
+            throw Tools.toUnoException(this, jdbcSQLException);
+        }
+    }
+    
+    @Override
+    public boolean othersDeletesAreVisible(int setType) throws SQLException {
+        try {
+            return jdbcDatabaseMetaData.othersDeletesAreVisible(setType);
+        } catch (java.sql.SQLException jdbcSQLException) {
+            throw Tools.toUnoException(this, jdbcSQLException);
+        }
+    }
+    
+    @Override
+    public boolean othersInsertsAreVisible(int setType) throws SQLException {
+        try {
+            return jdbcDatabaseMetaData.othersInsertsAreVisible(setType);
+        } catch (java.sql.SQLException jdbcSQLException) {
+            throw Tools.toUnoException(this, jdbcSQLException);
+        }
+    }
+    
+    @Override
+    public boolean updatesAreDetected(int setType) throws SQLException {
+        try {
+            return jdbcDatabaseMetaData.updatesAreDetected(setType);
+        } catch (java.sql.SQLException jdbcSQLException) {
+            throw Tools.toUnoException(this, jdbcSQLException);
+        }
+    }
+    
+    @Override
+    public boolean deletesAreDetected(int setType) throws SQLException {
+        try {
+            return jdbcDatabaseMetaData.deletesAreDetected(setType);
+        } catch (java.sql.SQLException jdbcSQLException) {
+            throw Tools.toUnoException(this, jdbcSQLException);
+        }
+    }
+    
+    @Override
+    public boolean insertsAreDetected(int setType) throws SQLException {
+        try {
+            return jdbcDatabaseMetaData.insertsAreDetected(setType);
+        } catch (java.sql.SQLException jdbcSQLException) {
+            throw Tools.toUnoException(this, jdbcSQLException);
+        }
+    }
+    
+    @Override
+    public boolean supportsBatchUpdates() throws SQLException {
+        try {
+            return jdbcDatabaseMetaData.supportsBatchUpdates();
+        } catch (java.sql.SQLException jdbcSQLException) {
+            throw Tools.toUnoException(this, jdbcSQLException);
+        }
+    }
+    
+    @Override
+    public XResultSet getUDTs(Object catalog, String schemaPattern,
+            String typeNamePattern, int[] types) throws SQLException {
+        try {
+            String jdbcCatalog = null;
+            if (AnyConverter.isString(catalog)) {
+                jdbcCatalog = AnyConverter.toString(catalog);
+            }
+            if (schemaPattern.equals("%")) {
+                schemaPattern = null;
+            }
+            return wrapResultSet(jdbcDatabaseMetaData.getUDTs(jdbcCatalog, 
schemaPattern, typeNamePattern, types));
+        } catch (java.sql.SQLException | IllegalArgumentException exception) {
+            throw Tools.toUnoException(this, exception);
+        }
+    }
+}

Propchange: 
openoffice/trunk/main/connectivity/java/sdbc_jdbc/src/com/sun/star/comp/sdbc/JavaSQLDatabaseMetaData.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: 
openoffice/trunk/main/connectivity/java/sdbc_jdbc/src/com/sun/star/comp/sdbc/JavaSQLPreparedStatement.java
URL: 
http://svn.apache.org/viewvc/openoffice/trunk/main/connectivity/java/sdbc_jdbc/src/com/sun/star/comp/sdbc/JavaSQLPreparedStatement.java?rev=1814552&view=auto
==============================================================================
--- 
openoffice/trunk/main/connectivity/java/sdbc_jdbc/src/com/sun/star/comp/sdbc/JavaSQLPreparedStatement.java
 (added)
+++ 
openoffice/trunk/main/connectivity/java/sdbc_jdbc/src/com/sun/star/comp/sdbc/JavaSQLPreparedStatement.java
 Wed Nov  8 04:17:25 2017
@@ -0,0 +1,467 @@
+/**************************************************************
+ * 
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ * 
+ *************************************************************/
+package com.sun.star.comp.sdbc;
+
+import java.io.ByteArrayInputStream;
+import java.io.InputStreamReader;
+import java.io.UnsupportedEncodingException;
+import java.math.BigDecimal;
+
+import org.apache.openoffice.comp.sdbc.dbtools.util.DBTypeConversion;
+import org.apache.openoffice.comp.sdbc.dbtools.util.DbTools;
+import org.apache.openoffice.comp.sdbc.dbtools.util.ORowSetValue;
+import org.apache.openoffice.comp.sdbc.dbtools.util.Resources;
+import org.apache.openoffice.comp.sdbc.dbtools.util.SharedResources;
+import org.apache.openoffice.comp.sdbc.dbtools.util.StandardSQLState;
+
+import com.sun.star.io.IOException;
+import com.sun.star.io.XInputStream;
+import com.sun.star.lang.IllegalArgumentException;
+import com.sun.star.lang.XServiceInfo;
+import com.sun.star.logging.LogLevel;
+import com.sun.star.sdbc.DataType;
+import com.sun.star.sdbc.SQLException;
+import com.sun.star.sdbc.XArray;
+import com.sun.star.sdbc.XBlob;
+import com.sun.star.sdbc.XClob;
+import com.sun.star.sdbc.XConnection;
+import com.sun.star.sdbc.XParameters;
+import com.sun.star.sdbc.XPreparedBatchExecution;
+import com.sun.star.sdbc.XPreparedStatement;
+import com.sun.star.sdbc.XRef;
+import com.sun.star.sdbc.XResultSet;
+import com.sun.star.sdbc.XResultSetMetaData;
+import com.sun.star.sdbc.XResultSetMetaDataSupplier;
+import com.sun.star.uno.Any;
+import com.sun.star.uno.AnyConverter;
+import com.sun.star.util.Date;
+import com.sun.star.util.DateTime;
+import com.sun.star.util.Time;
+
+public class JavaSQLPreparedStatement extends JavaSQLStatementBase
+        implements XPreparedStatement, XResultSetMetaDataSupplier, 
XParameters, XPreparedBatchExecution, XServiceInfo {
+
+    private static final String[] services = {
+            "com.sun.star.sdbc.PreparedStatement"
+    };
+    
+    public JavaSQLPreparedStatement(JavaSQLConnection connection, String 
sqlStatement) {
+        super(connection);
+        this.sqlStatement = sqlStatement;
+    }
+    
+    @Override
+    protected void createStatement() throws SQLException {
+        checkDisposed();
+        if (jdbcStatement == null) {
+            try {
+                try {
+                    jdbcStatement = 
connection.getJDBCConnection().prepareStatement(
+                            sqlStatement, resultSetType, resultSetConcurrency);
+                } catch (NoSuchMethodError noSuchMethodError) {
+                    jdbcStatement = 
connection.getJDBCConnection().prepareStatement(sqlStatement);
+                }
+            } catch (java.sql.SQLException sqlException) {
+                throw Tools.toUnoExceptionLogged(this, logger, sqlException);
+            }
+        }
+    }
+    
+    // XServiceInfo
+    
+    @Override
+    public String getImplementationName() {
+        return "com.sun.star.sdbcx.JPreparedStatement";
+    }
+    
+    @Override
+    public String[] getSupportedServiceNames() {
+        return services.clone();
+    }
+    
+    @Override
+    public boolean supportsService(String serviceName) {
+        for (String service : services) {
+            if (service.equals(serviceName)) {
+                return true;
+            }
+        }
+        return false;
+    }
+    
+    // XPreparedStatement
+    
+    @Override
+    public synchronized boolean execute() throws SQLException {
+        createStatement();
+        logger.log(LogLevel.FINE, Resources.STR_LOG_EXECUTING_PREPARED);
+        try {
+            return ((java.sql.PreparedStatement)jdbcStatement).execute();
+        } catch (java.sql.SQLException sqlException) {
+            throw Tools.toUnoExceptionLogged(this, logger, sqlException);
+        }
+    }
+    
+    @Override
+    public synchronized int executeUpdate() throws SQLException {
+        createStatement();
+        logger.log(LogLevel.FINE, Resources.STR_LOG_EXECUTING_PREPARED_UPDATE);
+        try {
+            return ((java.sql.PreparedStatement)jdbcStatement).executeUpdate();
+        } catch (java.sql.SQLException sqlException) {
+            throw Tools.toUnoExceptionLogged(this, logger, sqlException);
+        }
+    }
+    
+    @Override
+    public synchronized XResultSet executeQuery() throws SQLException {
+        createStatement();
+        logger.log(LogLevel.FINE, Resources.STR_LOG_EXECUTING_PREPARED_QUERY);
+        try {
+            java.sql.ResultSet jdbcResults = 
((java.sql.PreparedStatement)jdbcStatement).executeQuery();
+            if (jdbcResults != null) {
+                return new JavaSQLResultSet(jdbcResults, connection);
+            }
+            return null;
+        } catch (java.sql.SQLException sqlException) {
+            throw Tools.toUnoExceptionLogged(this, logger, sqlException);
+        }
+    }
+    
+    @Override
+    public XConnection getConnection() throws SQLException {
+        return connection;
+    }
+    
+    // XParameters
+
+    @Override
+    public synchronized void setArray(int index, XArray x) throws SQLException 
{
+        String error = 
SharedResources.getInstance().getResourceStringWithSubstitution(
+                Resources.STR_UNSUPPORTED_FEATURE, "$featurename$", 
"XParameters::setArray");
+        throw new SQLException(error, this, 
StandardSQLState.SQL_FEATURE_NOT_IMPLEMENTED.text(), 0, Any.VOID);
+    }
+    
+    @Override
+    public synchronized void setBinaryStream(int index, XInputStream x, int 
length) throws SQLException {
+        logger.log(LogLevel.FINER, Resources.STR_LOG_BINARYSTREAM_PARAMETER, 
index);
+        createStatement();
+        try {
+            // FIXME: why did the C++ implementation copy the stream here? 
It's a huge waste of memory.
+            byte[][] bytesReference = new byte[1][0];
+            int bytesRead = x.readBytes(bytesReference, length);
+            ByteArrayInputStream byteArrayInputStream = new 
ByteArrayInputStream(bytesReference[0], 0, bytesRead);
+            ((java.sql.PreparedStatement)jdbcStatement).setBinaryStream(index, 
byteArrayInputStream, bytesRead);
+        } catch (java.sql.SQLException | IOException exception) {
+            throw Tools.toUnoExceptionLogged(this, logger, exception);
+        }
+    }
+    
+    @Override
+    public synchronized void setBlob(int index, XBlob x) throws SQLException {
+        String error = 
SharedResources.getInstance().getResourceStringWithSubstitution(
+                Resources.STR_UNSUPPORTED_FEATURE, "$featurename$", 
"XParameters::setBlob");
+        throw new SQLException(error, this, 
StandardSQLState.SQL_FEATURE_NOT_IMPLEMENTED.text(), 0, Any.VOID);
+    }
+    
+    @Override
+    public synchronized void setBoolean(int index, boolean x) throws 
SQLException {
+        createStatement();
+        logger.log(LogLevel.FINE, Resources.STR_LOG_BOOLEAN_PARAMETER, index, 
x);
+        try {
+            ((java.sql.PreparedStatement)jdbcStatement).setBoolean(index, x);
+        } catch (java.sql.SQLException sqlException) {
+            throw Tools.toUnoExceptionLogged(this, logger, sqlException);
+        }
+    }
+    
+    @Override
+    public synchronized void setByte(int index, byte x) throws SQLException {
+        createStatement();
+        logger.log(LogLevel.FINE, Resources.STR_LOG_BYTE_PARAMETER, index, x);
+        try {
+            ((java.sql.PreparedStatement)jdbcStatement).setByte(index, x);
+        } catch (java.sql.SQLException sqlException) {
+            throw Tools.toUnoExceptionLogged(this, logger, sqlException);
+        }
+    }
+
+    @Override
+    public synchronized void setBytes(int index, byte[] x) throws SQLException 
{
+        createStatement();
+        logger.log(LogLevel.FINE, Resources.STR_LOG_BYTES_PARAMETER, index);
+        try {
+            ((java.sql.PreparedStatement)jdbcStatement).setBytes(index, 
x.clone());
+        } catch (java.sql.SQLException sqlException) {
+            throw Tools.toUnoExceptionLogged(this, logger, sqlException);
+        }
+    }
+    
+    @Override
+    public synchronized void setCharacterStream(int index, XInputStream x, int 
length) throws SQLException {
+        createStatement();
+        logger.log(LogLevel.FINER, Resources.STR_LOG_CHARSTREAM_PARAMETER, 
index);
+        try {
+            // FIXME: why did the C++ implementation copy the stream here? 
It's a huge waste of memory.
+            byte[][] bytesReference = new byte[1][0];
+            int bytesRead = x.readBytes(bytesReference, length);
+            ByteArrayInputStream byteArrayInputStream = new 
ByteArrayInputStream(bytesReference[0], 0, bytesRead);
+            InputStreamReader inputStreamReader = new 
InputStreamReader(byteArrayInputStream, "UTF-16LE");
+            
((java.sql.PreparedStatement)jdbcStatement).setCharacterStream(index, 
inputStreamReader, length);
+        } catch (java.sql.SQLException | IOException | 
UnsupportedEncodingException exception) {
+            throw Tools.toUnoExceptionLogged(this, logger, exception);
+        }
+    }
+    
+    @Override
+    public synchronized void setClob(int index, XClob x) throws SQLException {
+        String error = 
SharedResources.getInstance().getResourceStringWithSubstitution(
+                Resources.STR_UNSUPPORTED_FEATURE, "$featurename$", 
"XParameters::setClob");
+        throw new SQLException(error, this, 
StandardSQLState.SQL_FEATURE_NOT_IMPLEMENTED.text(), 0, Any.VOID);
+    }
+    
+    @Override
+    public synchronized void setDate(int index, Date x) throws SQLException {
+        createStatement();
+        logger.log(LogLevel.FINE, Resources.STR_LOG_DATE_PARAMETER, index, x);
+        try {
+            ((java.sql.PreparedStatement)jdbcStatement).setDate(
+                    index, 
java.sql.Date.valueOf(DBTypeConversion.toDateString(x)));
+        } catch (java.sql.SQLException sqlException) {
+            throw Tools.toUnoExceptionLogged(this, logger, sqlException);
+        }
+    }
+    
+    @Override
+    public synchronized void setDouble(int index, double x) throws 
SQLException {
+        createStatement();
+        logger.log(LogLevel.FINE, Resources.STR_LOG_DOUBLE_PARAMETER, index, 
x);
+        try {
+            ((java.sql.PreparedStatement)jdbcStatement).setDouble(index, x);
+        } catch (java.sql.SQLException sqlException) {
+            throw Tools.toUnoExceptionLogged(this, logger, sqlException);
+        }
+    }
+    
+    @Override
+    public synchronized void setFloat(int index, float x) throws SQLException {
+        createStatement();
+        logger.log(LogLevel.FINE, Resources.STR_LOG_FLOAT_PARAMETER, index, x);
+        try {
+            ((java.sql.PreparedStatement)jdbcStatement).setFloat(index, x);
+        } catch (java.sql.SQLException sqlException) {
+            throw Tools.toUnoExceptionLogged(this, logger, sqlException);
+        }
+    }
+    
+    @Override
+    public synchronized void setInt(int index, int x) throws SQLException {
+        createStatement();
+        logger.log(LogLevel.FINE, Resources.STR_LOG_INT_PARAMETER, index, x);
+        try {
+            ((java.sql.PreparedStatement)jdbcStatement).setInt(index, x);
+        } catch (java.sql.SQLException sqlException) {
+            throw Tools.toUnoExceptionLogged(this, logger, sqlException);
+        }
+    }
+    
+    @Override
+    public synchronized void setLong(int index, long x) throws SQLException {
+        createStatement();
+        logger.log(LogLevel.FINE, Resources.STR_LOG_LONG_PARAMETER, index, x);
+        try {
+            ((java.sql.PreparedStatement)jdbcStatement).setLong(index, x);
+        } catch (java.sql.SQLException sqlException) {
+            throw Tools.toUnoExceptionLogged(this, logger, sqlException);
+        }
+    }
+    
+    @Override
+    public synchronized void setNull(int index, int sqlType) throws 
SQLException {
+        createStatement();
+        logger.log(LogLevel.FINE, Resources.STR_LOG_NULL_PARAMETER, index, 
sqlType);
+        try {
+            ((java.sql.PreparedStatement)jdbcStatement).setNull(index, 
sqlType);
+        } catch (java.sql.SQLException sqlException) {
+            throw Tools.toUnoExceptionLogged(this, logger, sqlException);
+        }
+    }
+    
+    @Override
+    public void setObject(int index, Object x) throws SQLException {
+        if (!DbTools.setObject(this, index, x)) {
+            String error = 
SharedResources.getInstance().getResourceStringWithSubstitution(
+                    Resources.STR_UNKNOWN_PARA_TYPE, "$position$", 
Integer.toString(index));
+            throw new SQLException(error, this, 
StandardSQLState.SQL_GENERAL_ERROR.text(), 0, Any.VOID);
+        }
+    }
+    
+    @Override
+    public synchronized void setObjectNull(int index, int sqlType, String 
typeName) throws SQLException {
+        createStatement();
+        logger.log(LogLevel.FINER, Resources.STR_LOG_OBJECT_NULL_PARAMETER, 
index);
+        try {
+            ((java.sql.PreparedStatement)jdbcStatement).setObject(index, null);
+        } catch (java.sql.SQLException sqlException) {
+            throw Tools.toUnoExceptionLogged(this, logger, sqlException);
+        }
+    }
+    
+    @Override
+    public synchronized void setObjectWithInfo(int index, Object x, int 
targetSqlType, int scale) throws SQLException {
+        createStatement();
+        logger.log(LogLevel.FINER, Resources.STR_LOG_OBJECT_NULL_PARAMETER, 
index);
+        try {
+            if (targetSqlType == DataType.DECIMAL || targetSqlType == 
DataType.NUMERIC) {
+                BigDecimal bigDecimal;
+                if (AnyConverter.isDouble(x)) {
+                    bigDecimal = new BigDecimal(AnyConverter.toDouble(x));
+                } else {
+                    ORowSetValue rowSetValue = new ORowSetValue();
+                    rowSetValue.fill(x);
+                    String value = rowSetValue.toString();
+                    if (value.isEmpty()) {
+                        bigDecimal = new BigDecimal(0.0);
+                    } else {
+                        bigDecimal = new BigDecimal(value);
+                    }
+                }
+                ((java.sql.PreparedStatement)jdbcStatement).setObject(index, 
bigDecimal, targetSqlType, scale);
+            } else {
+                ((java.sql.PreparedStatement)jdbcStatement).setObject(index, 
AnyConverter.toString(x), targetSqlType, scale);
+            }
+        } catch (java.sql.SQLException | IllegalArgumentException exception) {
+            throw Tools.toUnoExceptionLogged(this, logger, exception);
+        }
+    }
+    
+    @Override
+    public void setRef(int index, XRef x) throws SQLException {
+        String error = 
SharedResources.getInstance().getResourceStringWithSubstitution(
+                Resources.STR_UNSUPPORTED_FEATURE, "$featurename$", 
"XParameters::setRef");
+        throw new SQLException(error, this, 
StandardSQLState.SQL_FEATURE_NOT_IMPLEMENTED.text(), 0, Any.VOID);
+    }
+
+    public synchronized void setShort(int index, short x) throws SQLException {
+        createStatement();
+        logger.log(LogLevel.FINE, Resources.STR_LOG_SHORT_PARAMETER, index, x);
+        try {
+            ((java.sql.PreparedStatement)jdbcStatement).setShort(index, x);
+        } catch (java.sql.SQLException sqlException) {
+            throw Tools.toUnoExceptionLogged(this, logger, sqlException);
+        }
+    }
+
+    @Override
+    public synchronized void setString(int index, String x) throws 
SQLException {
+        createStatement();
+        logger.log(LogLevel.FINE, Resources.STR_LOG_STRING_PARAMETER, index, 
x);
+        try {
+            ((java.sql.PreparedStatement)jdbcStatement).setString(index, x);
+        } catch (java.sql.SQLException sqlException) {
+            throw Tools.toUnoExceptionLogged(this, logger, sqlException);
+        }
+    }
+    
+    @Override
+    public synchronized void setTime(int index, Time x) throws SQLException {
+        createStatement();
+        logger.log(LogLevel.FINE, Resources.STR_LOG_TIME_PARAMETER, index, x);
+        try {
+            ((java.sql.PreparedStatement)jdbcStatement).setTime(
+                    index, 
java.sql.Time.valueOf(DBTypeConversion.toTimeString(x)));
+        } catch (java.sql.SQLException sqlException) {
+            throw Tools.toUnoExceptionLogged(this, logger, sqlException);
+        }
+    }
+    
+    @Override
+    public synchronized void setTimestamp(int index, DateTime x) throws 
SQLException {
+        createStatement();
+        logger.log(LogLevel.FINE, Resources.STR_LOG_TIMESTAMP_PARAMETER, 
index, x);
+        try {
+            ((java.sql.PreparedStatement)jdbcStatement).setTimestamp(
+                    index, 
java.sql.Timestamp.valueOf(DBTypeConversion.toDateTimeString(x)));
+        } catch (java.sql.SQLException sqlException) {
+            throw Tools.toUnoExceptionLogged(this, logger, sqlException);
+        }
+    }
+    
+    @Override
+    public synchronized void clearParameters() throws SQLException {
+        createStatement();
+        logger.log(LogLevel.FINE, Resources.STR_LOG_CLEAR_PARAMETERS);
+        try {
+            ((java.sql.PreparedStatement)jdbcStatement).clearParameters();
+        } catch (java.sql.SQLException sqlException) {
+            throw Tools.toUnoExceptionLogged(this, logger, sqlException);
+        }
+    }
+
+    // XPreparedBatchExecution
+    
+    @Override
+    public synchronized void clearBatch() throws SQLException {
+        createStatement();
+        try {
+            ((java.sql.PreparedStatement)jdbcStatement).clearBatch();
+        } catch (java.sql.SQLException sqlException) {
+            throw Tools.toUnoExceptionLogged(this, logger, sqlException);
+        }
+    }
+    
+    @Override
+    public synchronized void addBatch() throws SQLException {
+        createStatement();
+        try {
+            ((java.sql.PreparedStatement)jdbcStatement).addBatch();
+        } catch (java.sql.SQLException sqlException) {
+            throw Tools.toUnoExceptionLogged(this, logger, sqlException);
+        }
+    }
+    
+    @Override
+    public synchronized int[] executeBatch() throws SQLException {
+        createStatement();
+        try {
+            return ((java.sql.PreparedStatement)jdbcStatement).executeBatch();
+        } catch (java.sql.SQLException sqlException) {
+            throw Tools.toUnoExceptionLogged(this, logger, sqlException);
+        }
+    }
+    
+    // XResultSetMetaDataSupplier
+    
+    @Override
+    public synchronized XResultSetMetaData getMetaData() throws SQLException {
+        createStatement();
+        try {
+            java.sql.ResultSetMetaData jdbcMetadata = 
((java.sql.PreparedStatement)jdbcStatement).getMetaData();
+            if (jdbcMetadata != null) {
+                return new JavaSQLResultSetMetaData(connection, jdbcMetadata);
+            } else {
+                return null;
+            }
+        } catch (java.sql.SQLException sqlException) {
+            throw Tools.toUnoExceptionLogged(this, logger, sqlException);
+        }
+    }
+}

Propchange: 
openoffice/trunk/main/connectivity/java/sdbc_jdbc/src/com/sun/star/comp/sdbc/JavaSQLPreparedStatement.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: 
openoffice/trunk/main/connectivity/java/sdbc_jdbc/src/com/sun/star/comp/sdbc/JavaSQLRef.java
URL: 
http://svn.apache.org/viewvc/openoffice/trunk/main/connectivity/java/sdbc_jdbc/src/com/sun/star/comp/sdbc/JavaSQLRef.java?rev=1814552&view=auto
==============================================================================
--- 
openoffice/trunk/main/connectivity/java/sdbc_jdbc/src/com/sun/star/comp/sdbc/JavaSQLRef.java
 (added)
+++ 
openoffice/trunk/main/connectivity/java/sdbc_jdbc/src/com/sun/star/comp/sdbc/JavaSQLRef.java
 Wed Nov  8 04:17:25 2017
@@ -0,0 +1,42 @@
+/**************************************************************
+ * 
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ * 
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ * 
+ *************************************************************/
+package com.sun.star.comp.sdbc;
+
+import com.sun.star.lib.uno.helper.WeakBase;
+import com.sun.star.sdbc.SQLException;
+import com.sun.star.sdbc.XRef;
+
+public class JavaSQLRef extends WeakBase implements XRef {
+    private java.sql.Ref jdbcRef;
+    
+    public JavaSQLRef(java.sql.Ref jdbcRef) {
+        this.jdbcRef = jdbcRef;
+    }
+    
+    @Override
+    public String getBaseTypeName() throws SQLException {
+        try {
+            return jdbcRef.getBaseTypeName();
+        } catch (java.sql.SQLException jdbcSqlException) {
+            throw Tools.toUnoException(this, jdbcSqlException);
+        }
+    }
+}

Propchange: 
openoffice/trunk/main/connectivity/java/sdbc_jdbc/src/com/sun/star/comp/sdbc/JavaSQLRef.java
------------------------------------------------------------------------------
    svn:eol-style = native


Reply via email to