From b5c48680feb029c614557b457dc4e6451ca20f2d Mon Sep 17 00:00:00 2001 From: tledkov-gridgain Date: Fri, 2 Jun 2017 18:32:04 +0300 Subject: [PATCH 01/32] IGNITE-5233: save the progress --- .../jdbc/suite/IgniteJdbcDriverTestSuite.java | 80 +- .../jdbc/thin/JdbcThinMetadataSelfTest.java | 69 +- .../jdbc/thin/JdbcThinConnection.java | 11 + .../jdbc/thin/JdbcThinDatabaseMetadata.java | 1267 +++++++++++++++++ .../internal/jdbc/thin/JdbcThinResultSet.java | 40 +- .../internal/jdbc/thin/JdbcThinTcpIo.java | 52 +- .../processors/odbc/jdbc/JdbcColumnMeta.java | 20 +- .../processors/odbc/jdbc/JdbcIndexMeta.java | 116 ++ .../odbc/jdbc/JdbcMetaColumnsRequest.java | 102 ++ .../odbc/jdbc/JdbcMetaColumnsResult.java | 91 ++ .../odbc/jdbc/JdbcMetaIndexesRequest.java | 130 ++ .../odbc/jdbc/JdbcMetaIndexesResult.java | 92 ++ .../odbc/jdbc/JdbcMetaParamsRequest.java | 87 ++ .../odbc/jdbc/JdbcMetaParamsResult.java | 91 ++ .../odbc/jdbc/JdbcMetaTablesRequest.java | 115 ++ .../odbc/jdbc/JdbcMetaTablesResult.java | 91 ++ .../processors/odbc/jdbc/JdbcParamMeta.java | 105 ++ .../processors/odbc/jdbc/JdbcRequest.java | 32 + .../odbc/jdbc/JdbcRequestHandler.java | 168 +++ .../processors/odbc/jdbc/JdbcResult.java | 37 +- .../processors/odbc/jdbc/JdbcTableMeta.java | 103 ++ 21 files changed, 2835 insertions(+), 64 deletions(-) create mode 100644 modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinDatabaseMetadata.java create mode 100644 modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcIndexMeta.java create mode 100644 modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaColumnsRequest.java create mode 100644 modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaColumnsResult.java create mode 100644 modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaIndexesRequest.java create mode 100644 modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaIndexesResult.java create mode 100644 modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaParamsRequest.java create mode 100644 modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaParamsResult.java create mode 100644 modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaTablesRequest.java create mode 100644 modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaTablesResult.java create mode 100644 modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcParamMeta.java create mode 100644 modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcTableMeta.java diff --git a/modules/clients/src/test/java/org/apache/ignite/jdbc/suite/IgniteJdbcDriverTestSuite.java b/modules/clients/src/test/java/org/apache/ignite/jdbc/suite/IgniteJdbcDriverTestSuite.java index 121b8df767574..404d53a89f9be 100644 --- a/modules/clients/src/test/java/org/apache/ignite/jdbc/suite/IgniteJdbcDriverTestSuite.java +++ b/modules/clients/src/test/java/org/apache/ignite/jdbc/suite/IgniteJdbcDriverTestSuite.java @@ -61,46 +61,46 @@ public class IgniteJdbcDriverTestSuite extends TestSuite { public static TestSuite suite() throws Exception { TestSuite suite = new TestSuite("Ignite JDBC Driver Test Suite"); - // Thin client based driver tests. - suite.addTest(new TestSuite(JdbcConnectionSelfTest.class)); - suite.addTest(new TestSuite(JdbcStatementSelfTest.class)); - suite.addTest(new TestSuite(JdbcPreparedStatementSelfTest.class)); - suite.addTest(new TestSuite(JdbcResultSetSelfTest.class)); - suite.addTest(new TestSuite(JdbcComplexQuerySelfTest.class)); - suite.addTest(new TestSuite(JdbcMetadataSelfTest.class)); - suite.addTest(new TestSuite(JdbcEmptyCacheSelfTest.class)); - suite.addTest(new TestSuite(JdbcLocalCachesSelfTest.class)); - suite.addTest(new TestSuite(JdbcNoDefaultCacheTest.class)); - suite.addTest(new TestSuite(JdbcPojoQuerySelfTest.class)); - suite.addTest(new TestSuite(JdbcPojoLegacyQuerySelfTest.class)); - - // Ignite client node based driver tests - suite.addTest(new TestSuite(org.apache.ignite.internal.jdbc2.JdbcConnectionSelfTest.class)); - suite.addTest(new TestSuite(org.apache.ignite.internal.jdbc2.JdbcSpringSelfTest.class)); - suite.addTest(new TestSuite(org.apache.ignite.internal.jdbc2.JdbcStatementSelfTest.class)); - suite.addTest(new TestSuite(org.apache.ignite.internal.jdbc2.JdbcPreparedStatementSelfTest.class)); - suite.addTest(new TestSuite(org.apache.ignite.internal.jdbc2.JdbcResultSetSelfTest.class)); - suite.addTest(new TestSuite(org.apache.ignite.internal.jdbc2.JdbcComplexQuerySelfTest.class)); - suite.addTest(new TestSuite(JdbcDistributedJoinsQueryTest.class)); - suite.addTest(new TestSuite(org.apache.ignite.internal.jdbc2.JdbcMetadataSelfTest.class)); - suite.addTest(new TestSuite(org.apache.ignite.internal.jdbc2.JdbcEmptyCacheSelfTest.class)); - suite.addTest(new TestSuite(org.apache.ignite.internal.jdbc2.JdbcLocalCachesSelfTest.class)); - suite.addTest(new TestSuite(org.apache.ignite.internal.jdbc2.JdbcNoDefaultCacheTest.class)); - suite.addTest(new TestSuite(org.apache.ignite.internal.jdbc2.JdbcMergeStatementSelfTest.class)); - suite.addTest(new TestSuite(org.apache.ignite.internal.jdbc2.JdbcBinaryMarshallerMergeStatementSelfTest.class)); - suite.addTest(new TestSuite(org.apache.ignite.internal.jdbc2.JdbcInsertStatementSelfTest.class)); - suite.addTest(new TestSuite(org.apache.ignite.internal.jdbc2.JdbcBinaryMarshallerInsertStatementSelfTest.class)); - suite.addTest(new TestSuite(org.apache.ignite.internal.jdbc2.JdbcDeleteStatementSelfTest.class)); - suite.addTest(new TestSuite(JdbcBlobTest.class)); - suite.addTest(new TestSuite(org.apache.ignite.internal.jdbc2.JdbcStreamingSelfTest.class)); - - // DDL tests. - suite.addTest(new TestSuite(org.apache.ignite.internal.jdbc2.JdbcDynamicIndexAtomicPartitionedNearSelfTest.class)); - suite.addTest(new TestSuite(org.apache.ignite.internal.jdbc2.JdbcDynamicIndexAtomicPartitionedSelfTest.class)); - suite.addTest(new TestSuite(org.apache.ignite.internal.jdbc2.JdbcDynamicIndexAtomicReplicatedSelfTest.class)); - suite.addTest(new TestSuite(org.apache.ignite.internal.jdbc2.JdbcDynamicIndexTransactionalPartitionedNearSelfTest.class)); - suite.addTest(new TestSuite(org.apache.ignite.internal.jdbc2.JdbcDynamicIndexTransactionalPartitionedSelfTest.class)); - suite.addTest(new TestSuite(org.apache.ignite.internal.jdbc2.JdbcDynamicIndexTransactionalReplicatedSelfTest.class)); +// // Thin client based driver tests. +// suite.addTest(new TestSuite(JdbcConnectionSelfTest.class)); +// suite.addTest(new TestSuite(JdbcStatementSelfTest.class)); +// suite.addTest(new TestSuite(JdbcPreparedStatementSelfTest.class)); +// suite.addTest(new TestSuite(JdbcResultSetSelfTest.class)); +// suite.addTest(new TestSuite(JdbcComplexQuerySelfTest.class)); +// suite.addTest(new TestSuite(JdbcMetadataSelfTest.class)); +// suite.addTest(new TestSuite(JdbcEmptyCacheSelfTest.class)); +// suite.addTest(new TestSuite(JdbcLocalCachesSelfTest.class)); +// suite.addTest(new TestSuite(JdbcNoDefaultCacheTest.class)); +// suite.addTest(new TestSuite(JdbcPojoQuerySelfTest.class)); +// suite.addTest(new TestSuite(JdbcPojoLegacyQuerySelfTest.class)); +// +// // Ignite client node based driver tests +// suite.addTest(new TestSuite(org.apache.ignite.internal.jdbc2.JdbcConnectionSelfTest.class)); +// suite.addTest(new TestSuite(org.apache.ignite.internal.jdbc2.JdbcSpringSelfTest.class)); +// suite.addTest(new TestSuite(org.apache.ignite.internal.jdbc2.JdbcStatementSelfTest.class)); +// suite.addTest(new TestSuite(org.apache.ignite.internal.jdbc2.JdbcPreparedStatementSelfTest.class)); +// suite.addTest(new TestSuite(org.apache.ignite.internal.jdbc2.JdbcResultSetSelfTest.class)); +// suite.addTest(new TestSuite(org.apache.ignite.internal.jdbc2.JdbcComplexQuerySelfTest.class)); +// suite.addTest(new TestSuite(JdbcDistributedJoinsQueryTest.class)); +// suite.addTest(new TestSuite(org.apache.ignite.internal.jdbc2.JdbcMetadataSelfTest.class)); +// suite.addTest(new TestSuite(org.apache.ignite.internal.jdbc2.JdbcEmptyCacheSelfTest.class)); +// suite.addTest(new TestSuite(org.apache.ignite.internal.jdbc2.JdbcLocalCachesSelfTest.class)); +// suite.addTest(new TestSuite(org.apache.ignite.internal.jdbc2.JdbcNoDefaultCacheTest.class)); +// suite.addTest(new TestSuite(org.apache.ignite.internal.jdbc2.JdbcMergeStatementSelfTest.class)); +// suite.addTest(new TestSuite(org.apache.ignite.internal.jdbc2.JdbcBinaryMarshallerMergeStatementSelfTest.class)); +// suite.addTest(new TestSuite(org.apache.ignite.internal.jdbc2.JdbcInsertStatementSelfTest.class)); +// suite.addTest(new TestSuite(org.apache.ignite.internal.jdbc2.JdbcBinaryMarshallerInsertStatementSelfTest.class)); +// suite.addTest(new TestSuite(org.apache.ignite.internal.jdbc2.JdbcDeleteStatementSelfTest.class)); +// suite.addTest(new TestSuite(JdbcBlobTest.class)); +// suite.addTest(new TestSuite(org.apache.ignite.internal.jdbc2.JdbcStreamingSelfTest.class)); +// +// // DDL tests. +// suite.addTest(new TestSuite(org.apache.ignite.internal.jdbc2.JdbcDynamicIndexAtomicPartitionedNearSelfTest.class)); +// suite.addTest(new TestSuite(org.apache.ignite.internal.jdbc2.JdbcDynamicIndexAtomicPartitionedSelfTest.class)); +// suite.addTest(new TestSuite(org.apache.ignite.internal.jdbc2.JdbcDynamicIndexAtomicReplicatedSelfTest.class)); +// suite.addTest(new TestSuite(org.apache.ignite.internal.jdbc2.JdbcDynamicIndexTransactionalPartitionedNearSelfTest.class)); +// suite.addTest(new TestSuite(org.apache.ignite.internal.jdbc2.JdbcDynamicIndexTransactionalPartitionedSelfTest.class)); +// suite.addTest(new TestSuite(org.apache.ignite.internal.jdbc2.JdbcDynamicIndexTransactionalReplicatedSelfTest.class)); // New thin JDBC suite.addTest(new TestSuite(JdbcThinConnectionSelfTest.class)); diff --git a/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinMetadataSelfTest.java b/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinMetadataSelfTest.java index 2dae107798e1e..5670786258c9b 100644 --- a/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinMetadataSelfTest.java +++ b/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinMetadataSelfTest.java @@ -25,13 +25,20 @@ import java.sql.ResultSetMetaData; import java.sql.Statement; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collection; +import java.util.Collections; +import java.util.LinkedHashMap; import org.apache.ignite.IgniteCache; +import org.apache.ignite.cache.QueryEntity; +import org.apache.ignite.cache.QueryIndex; import org.apache.ignite.cache.affinity.AffinityKey; import org.apache.ignite.cache.query.annotations.QuerySqlField; import org.apache.ignite.configuration.CacheConfiguration; import org.apache.ignite.configuration.IgniteConfiguration; +import org.apache.ignite.internal.binary.BinaryMarshaller; import org.apache.ignite.internal.util.typedef.F; +import org.apache.ignite.internal.util.typedef.G; import org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi; import org.apache.ignite.spi.discovery.tcp.ipfinder.TcpDiscoveryIpFinder; import org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder; @@ -66,15 +73,18 @@ public class JdbcThinMetadataSelfTest extends JdbcThinAbstractSelfTest { } /** + * @param qryEntity Query entity. * @return Cache configuration. */ - protected CacheConfiguration cacheConfiguration() { + protected CacheConfiguration cacheConfiguration(QueryEntity qryEntity) { CacheConfiguration cache = defaultCacheConfiguration(); cache.setCacheMode(PARTITIONED); cache.setBackups(1); cache.setWriteSynchronizationMode(FULL_SYNC); + cache.setQueryEntities(Collections.singletonList(qryEntity)); + return cache; } @@ -84,16 +94,34 @@ protected CacheConfiguration cacheConfiguration() { startGridsMultiThreaded(3); - IgniteCache orgCache = jcache(grid(0), cacheConfiguration(), "org", - String.class, Organization.class); + IgniteCache orgCache = jcache(grid(0), + cacheConfiguration(new QueryEntity(String.class.getName(), Organization.class.getName()) + .addQueryField("id", Integer.class.getName(), null) + .addQueryField("name", String.class.getName(), null) + .setIndexes(Arrays.asList( + new QueryIndex("id"), + new QueryIndex("name", false, "org_name_index") + ))), "org"); assert orgCache != null; orgCache.put("o1", new Organization(1, "A")); orgCache.put("o2", new Organization(2, "B")); - IgniteCache personCache = jcache(grid(0), cacheConfiguration(), "pers", - AffinityKey.class, Person.class); + LinkedHashMap persFields = new LinkedHashMap<>(); + + persFields.put("name", true); + persFields.put("age", false); + + IgniteCache personCache = jcache(grid(0), cacheConfiguration( + new QueryEntity(AffinityKey.class.getName(), Person.class.getName()) + .addQueryField("name", String.class.getName(), null) + .addQueryField("age", Integer.class.getName(), null) + .addQueryField("orgId", Integer.class.getName(), null) + .setIndexes(Arrays.asList( + new QueryIndex("orgId"), + new QueryIndex().setFields(persFields))) + ), "pers"); assert personCache != null; @@ -147,8 +175,6 @@ public void testResultSetMetaData() throws Exception { * @throws Exception If failed. */ public void testGetTables() throws Exception { - fail("https://issues.apache.org/jira/browse/IGNITE-5233"); - try (Connection conn = DriverManager.getConnection(URL)) { DatabaseMetaData meta = conn.getMetaData(); @@ -185,7 +211,8 @@ public void testGetTables() throws Exception { * @throws Exception If failed. */ public void testGetColumns() throws Exception { - fail("https://issues.apache.org/jira/browse/IGNITE-5233"); + final boolean primitivesInformationIsLostAfterStore = ignite(0).configuration().getMarshaller() + instanceof BinaryMarshaller; try (Connection conn = DriverManager.getConnection(URL)) { conn.setSchema("pers"); @@ -216,7 +243,7 @@ public void testGetColumns() throws Exception { } else if ("AGE".equals(name) || "ORGID".equals(name)) { assert rs.getInt("DATA_TYPE") == INTEGER; assert "INTEGER".equals(rs.getString("TYPE_NAME")); - assert rs.getInt("NULLABLE") == 0; + assertEquals(primitivesInformationIsLostAfterStore ? 1 : 0, rs.getInt("NULLABLE")); } if ("_KEY".equals(name)) { assert rs.getInt("DATA_TYPE") == OTHER; @@ -281,8 +308,6 @@ public void testGetColumns() throws Exception { * @throws Exception If failed. */ public void testMetadataResultSetClose() throws Exception { - fail("https://issues.apache.org/jira/browse/IGNITE-5233"); - try (Connection conn = DriverManager.getConnection(URL); ResultSet tbls = conn.getMetaData().getTables(null, null, "%", null)) { int colCnt = tbls.getMetaData().getColumnCount(); @@ -299,21 +324,35 @@ public void testMetadataResultSetClose() throws Exception { } } + /** + * @throws Exception If failed. + */ + public void _testIndexMetadata() throws Exception { + try (Connection conn = DriverManager.getConnection(URL); + ResultSet tbls = conn.getMetaData().getIndexInfo(null, null, "pers", false, false)) { + + int colCnt = tbls.getMetaData().getColumnCount(); + + } + catch (Exception e) { + log.error("Unexpected exception", e); + + fail(); + } + } + /** * Person. */ @SuppressWarnings("UnusedDeclaration") private static class Person implements Serializable { /** Name. */ - @QuerySqlField(index = false) private final String name; /** Age. */ - @QuerySqlField private final int age; /** Organization ID. */ - @QuerySqlField private final int orgId; /** @@ -338,11 +377,9 @@ private Person(String name, int age, int orgId) { @SuppressWarnings("UnusedDeclaration") private static class Organization implements Serializable { /** ID. */ - @QuerySqlField private final int id; /** Name. */ - @QuerySqlField(index = false) private final String name; /** diff --git a/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinConnection.java b/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinConnection.java index 4ba755734216e..2396d2efe3458 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinConnection.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinConnection.java @@ -55,6 +55,9 @@ public class JdbcThinConnection implements Connection { /** Logger. */ private static final Logger LOG = Logger.getLogger(JdbcThinConnection.class.getName()); + /** Conection URL. */ + private String url; + /** Schema name. */ private String schemaName; @@ -87,6 +90,7 @@ public JdbcThinConnection(String url, Properties props) throws SQLException { assert url != null; assert props != null; + this.url = url; holdability = HOLD_CURSORS_OVER_COMMIT; autoCommit = true; txIsolation = Connection.TRANSACTION_NONE; @@ -542,4 +546,11 @@ private void ensureNotClosed() throws SQLException { JdbcThinTcpIo cliIo() { return cliIo; } + + /** + * @return Connection URL. + */ + public String url() { + return url; + } } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinDatabaseMetadata.java b/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinDatabaseMetadata.java new file mode 100644 index 0000000000000..a5a421e9f8cb2 --- /dev/null +++ b/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinDatabaseMetadata.java @@ -0,0 +1,1267 @@ +/* + * 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 org.apache.ignite.internal.jdbc.thin; + +import java.io.IOException; +import java.sql.Connection; +import java.sql.DatabaseMetaData; +import java.sql.ResultSet; +import java.sql.RowIdLifetime; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.LinkedList; +import java.util.List; +import org.apache.ignite.IgniteCheckedException; +import org.apache.ignite.internal.jdbc2.JdbcUtils; +import org.apache.ignite.internal.processors.odbc.jdbc.JdbcColumnMeta; +import org.apache.ignite.internal.processors.odbc.jdbc.JdbcIndexMeta; +import org.apache.ignite.internal.processors.odbc.jdbc.JdbcMetaColumnsResult; +import org.apache.ignite.internal.processors.odbc.jdbc.JdbcMetaIndexesResult; +import org.apache.ignite.internal.processors.odbc.jdbc.JdbcMetaTablesResult; +import org.apache.ignite.internal.processors.odbc.jdbc.JdbcTableMeta; + +import static java.sql.Connection.TRANSACTION_NONE; +import static java.sql.ResultSet.CONCUR_READ_ONLY; +import static java.sql.ResultSet.HOLD_CURSORS_OVER_COMMIT; +import static java.sql.RowIdLifetime.ROWID_UNSUPPORTED; + +/** + * JDBC database metadata implementation. + */ +@SuppressWarnings("RedundantCast") +public class JdbcThinDatabaseMetadata implements DatabaseMetaData { + /** Connection. */ + private final JdbcThinConnection conn; + + /** + * @param conn Connection. + */ + JdbcThinDatabaseMetadata(JdbcThinConnection conn) { + this.conn = conn; + } + + /** {@inheritDoc} */ + @Override public boolean allProceduresAreCallable() throws SQLException { + return true; + } + + /** {@inheritDoc} */ + @Override public boolean allTablesAreSelectable() throws SQLException { + return true; + } + + /** {@inheritDoc} */ + @Override public String getURL() throws SQLException { + return conn.url(); + } + + /** {@inheritDoc} */ + @Override public String getUserName() throws SQLException { + return ""; + } + + /** {@inheritDoc} */ + @Override public boolean isReadOnly() throws SQLException { + return true; + } + + /** {@inheritDoc} */ + @Override public boolean nullsAreSortedHigh() throws SQLException { + return false; + } + + /** {@inheritDoc} */ + @Override public boolean nullsAreSortedLow() throws SQLException { + return true; + } + + /** {@inheritDoc} */ + @Override public boolean nullsAreSortedAtStart() throws SQLException { + return false; + } + + /** {@inheritDoc} */ + @Override public boolean nullsAreSortedAtEnd() throws SQLException { + return true; + } + + /** {@inheritDoc} */ + @Override public String getDatabaseProductName() throws SQLException { + return "Ignite Cache"; + } + + /** {@inheritDoc} */ + @Override public String getDatabaseProductVersion() throws SQLException { + return "4.1.0"; + } + + /** {@inheritDoc} */ + @Override public String getDriverName() throws SQLException { + return "Ignite JDBC Driver"; + } + + /** {@inheritDoc} */ + @Override public String getDriverVersion() throws SQLException { + return "1.0"; + } + + /** {@inheritDoc} */ + @Override public int getDriverMajorVersion() { + return 1; + } + + /** {@inheritDoc} */ + @Override public int getDriverMinorVersion() { + return 0; + } + + /** {@inheritDoc} */ + @Override public boolean usesLocalFiles() throws SQLException { + return false; + } + + /** {@inheritDoc} */ + @Override public boolean usesLocalFilePerTable() throws SQLException { + return false; + } + + /** {@inheritDoc} */ + @Override public boolean supportsMixedCaseIdentifiers() throws SQLException { + return false; + } + + /** {@inheritDoc} */ + @Override public boolean storesUpperCaseIdentifiers() throws SQLException { + return true; + } + + /** {@inheritDoc} */ + @Override public boolean storesLowerCaseIdentifiers() throws SQLException { + return false; + } + + /** {@inheritDoc} */ + @Override public boolean storesMixedCaseIdentifiers() throws SQLException { + return false; + } + + /** {@inheritDoc} */ + @Override public boolean supportsMixedCaseQuotedIdentifiers() throws SQLException { + return false; + } + + /** {@inheritDoc} */ + @Override public boolean storesUpperCaseQuotedIdentifiers() throws SQLException { + return true; + } + + /** {@inheritDoc} */ + @Override public boolean storesLowerCaseQuotedIdentifiers() throws SQLException { + return false; + } + + /** {@inheritDoc} */ + @Override public boolean storesMixedCaseQuotedIdentifiers() throws SQLException { + return false; + } + + /** {@inheritDoc} */ + @Override public String getIdentifierQuoteString() throws SQLException { + return " "; + } + + /** {@inheritDoc} */ + @Override public String getSQLKeywords() throws SQLException { + return ""; + } + + /** {@inheritDoc} */ + @Override public String getNumericFunctions() throws SQLException { + return ""; + } + + /** {@inheritDoc} */ + @Override public String getStringFunctions() throws SQLException { + return ""; + } + + /** {@inheritDoc} */ + @Override public String getSystemFunctions() throws SQLException { + return ""; + } + + /** {@inheritDoc} */ + @Override public String getTimeDateFunctions() throws SQLException { + return ""; + } + + /** {@inheritDoc} */ + @Override public String getSearchStringEscape() throws SQLException { + return ""; + } + + /** {@inheritDoc} */ + @Override public String getExtraNameCharacters() throws SQLException { + return ""; + } + + /** {@inheritDoc} */ + @Override public boolean supportsAlterTableWithAddColumn() throws SQLException { + return false; + } + + /** {@inheritDoc} */ + @Override public boolean supportsAlterTableWithDropColumn() throws SQLException { + return false; + } + + /** {@inheritDoc} */ + @Override public boolean supportsColumnAliasing() throws SQLException { + return true; + } + + /** {@inheritDoc} */ + @Override public boolean nullPlusNonNullIsNull() throws SQLException { + return false; + } + + /** {@inheritDoc} */ + @Override public boolean supportsConvert() throws SQLException { + return false; + } + + /** {@inheritDoc} */ + @Override public boolean supportsConvert(int fromType, int toType) throws SQLException { + return false; + } + + /** {@inheritDoc} */ + @Override public boolean supportsTableCorrelationNames() throws SQLException { + return true; + } + + /** {@inheritDoc} */ + @Override public boolean supportsDifferentTableCorrelationNames() throws SQLException { + return true; + } + + /** {@inheritDoc} */ + @Override public boolean supportsExpressionsInOrderBy() throws SQLException { + return true; + } + + /** {@inheritDoc} */ + @Override public boolean supportsOrderByUnrelated() throws SQLException { + return true; + } + + /** {@inheritDoc} */ + @Override public boolean supportsGroupBy() throws SQLException { + return true; + } + + /** {@inheritDoc} */ + @Override public boolean supportsGroupByUnrelated() throws SQLException { + return true; + } + + /** {@inheritDoc} */ + @Override public boolean supportsGroupByBeyondSelect() throws SQLException { + return true; + } + + /** {@inheritDoc} */ + @Override public boolean supportsLikeEscapeClause() throws SQLException { + return true; + } + + /** {@inheritDoc} */ + @Override public boolean supportsMultipleResultSets() throws SQLException { + return false; + } + + /** {@inheritDoc} */ + @Override public boolean supportsMultipleTransactions() throws SQLException { + return false; + } + + /** {@inheritDoc} */ + @Override public boolean supportsNonNullableColumns() throws SQLException { + return false; + } + + /** {@inheritDoc} */ + @Override public boolean supportsMinimumSQLGrammar() throws SQLException { + return false; + } + + /** {@inheritDoc} */ + @Override public boolean supportsCoreSQLGrammar() throws SQLException { + return false; + } + + /** {@inheritDoc} */ + @Override public boolean supportsExtendedSQLGrammar() throws SQLException { + return false; + } + + /** {@inheritDoc} */ + @Override public boolean supportsANSI92EntryLevelSQL() throws SQLException { + return false; + } + + /** {@inheritDoc} */ + @Override public boolean supportsANSI92IntermediateSQL() throws SQLException { + return false; + } + + /** {@inheritDoc} */ + @Override public boolean supportsANSI92FullSQL() throws SQLException { + return false; + } + + /** {@inheritDoc} */ + @Override public boolean supportsIntegrityEnhancementFacility() throws SQLException { + return false; + } + + /** {@inheritDoc} */ + @Override public boolean supportsOuterJoins() throws SQLException { + return true; + } + + /** {@inheritDoc} */ + @Override public boolean supportsFullOuterJoins() throws SQLException { + return true; + } + + /** {@inheritDoc} */ + @Override public boolean supportsLimitedOuterJoins() throws SQLException { + return true; + } + + /** {@inheritDoc} */ + @Override public String getSchemaTerm() throws SQLException { + return ""; + } + + /** {@inheritDoc} */ + @Override public String getProcedureTerm() throws SQLException { + return ""; + } + + /** {@inheritDoc} */ + @Override public String getCatalogTerm() throws SQLException { + return ""; + } + + /** {@inheritDoc} */ + @Override public boolean isCatalogAtStart() throws SQLException { + return false; + } + + /** {@inheritDoc} */ + @Override public String getCatalogSeparator() throws SQLException { + return ""; + } + + /** {@inheritDoc} */ + @Override public boolean supportsSchemasInDataManipulation() throws SQLException { + return false; + } + + /** {@inheritDoc} */ + @Override public boolean supportsSchemasInProcedureCalls() throws SQLException { + return false; + } + + /** {@inheritDoc} */ + @Override public boolean supportsSchemasInTableDefinitions() throws SQLException { + return false; + } + + /** {@inheritDoc} */ + @Override public boolean supportsSchemasInIndexDefinitions() throws SQLException { + return false; + } + + /** {@inheritDoc} */ + @Override public boolean supportsSchemasInPrivilegeDefinitions() throws SQLException { + return false; + } + + /** {@inheritDoc} */ + @Override public boolean supportsCatalogsInDataManipulation() throws SQLException { + return false; + } + + /** {@inheritDoc} */ + @Override public boolean supportsCatalogsInProcedureCalls() throws SQLException { + return false; + } + + /** {@inheritDoc} */ + @Override public boolean supportsCatalogsInTableDefinitions() throws SQLException { + return false; + } + + /** {@inheritDoc} */ + @Override public boolean supportsCatalogsInIndexDefinitions() throws SQLException { + return false; + } + + /** {@inheritDoc} */ + @Override public boolean supportsCatalogsInPrivilegeDefinitions() throws SQLException { + return false; + } + + /** {@inheritDoc} */ + @Override public boolean supportsPositionedDelete() throws SQLException { + return false; + } + + /** {@inheritDoc} */ + @Override public boolean supportsPositionedUpdate() throws SQLException { + return false; + } + + /** {@inheritDoc} */ + @Override public boolean supportsSelectForUpdate() throws SQLException { + return false; + } + + /** {@inheritDoc} */ + @Override public boolean supportsStoredProcedures() throws SQLException { + return false; + } + + /** {@inheritDoc} */ + @Override public boolean supportsSubqueriesInComparisons() throws SQLException { + return true; + } + + /** {@inheritDoc} */ + @Override public boolean supportsSubqueriesInExists() throws SQLException { + return true; + } + + /** {@inheritDoc} */ + @Override public boolean supportsSubqueriesInIns() throws SQLException { + return true; + } + + /** {@inheritDoc} */ + @Override public boolean supportsSubqueriesInQuantifieds() throws SQLException { + return true; + } + + /** {@inheritDoc} */ + @Override public boolean supportsCorrelatedSubqueries() throws SQLException { + return true; + } + + /** {@inheritDoc} */ + @Override public boolean supportsUnion() throws SQLException { + return true; + } + + /** {@inheritDoc} */ + @Override public boolean supportsUnionAll() throws SQLException { + return true; + } + + /** {@inheritDoc} */ + @Override public boolean supportsOpenCursorsAcrossCommit() throws SQLException { + return false; + } + + /** {@inheritDoc} */ + @Override public boolean supportsOpenCursorsAcrossRollback() throws SQLException { + return false; + } + + /** {@inheritDoc} */ + @Override public boolean supportsOpenStatementsAcrossCommit() throws SQLException { + return false; + } + + /** {@inheritDoc} */ + @Override public boolean supportsOpenStatementsAcrossRollback() throws SQLException { + return false; + } + + /** {@inheritDoc} */ + @Override public int getMaxBinaryLiteralLength() throws SQLException { + return 0; + } + + /** {@inheritDoc} */ + @Override public int getMaxCharLiteralLength() throws SQLException { + return 0; + } + + /** {@inheritDoc} */ + @Override public int getMaxColumnNameLength() throws SQLException { + return 0; + } + + /** {@inheritDoc} */ + @Override public int getMaxColumnsInGroupBy() throws SQLException { + return 0; + } + + /** {@inheritDoc} */ + @Override public int getMaxColumnsInIndex() throws SQLException { + return 0; + } + + /** {@inheritDoc} */ + @Override public int getMaxColumnsInOrderBy() throws SQLException { + return 0; + } + + /** {@inheritDoc} */ + @Override public int getMaxColumnsInSelect() throws SQLException { + return 0; + } + + /** {@inheritDoc} */ + @Override public int getMaxColumnsInTable() throws SQLException { + return 0; + } + + /** {@inheritDoc} */ + @Override public int getMaxConnections() throws SQLException { + return 0; + } + + /** {@inheritDoc} */ + @Override public int getMaxCursorNameLength() throws SQLException { + return 0; + } + + /** {@inheritDoc} */ + @Override public int getMaxIndexLength() throws SQLException { + return 0; + } + + /** {@inheritDoc} */ + @Override public int getMaxSchemaNameLength() throws SQLException { + return 0; + } + + /** {@inheritDoc} */ + @Override public int getMaxProcedureNameLength() throws SQLException { + return 0; + } + + /** {@inheritDoc} */ + @Override public int getMaxCatalogNameLength() throws SQLException { + return 0; + } + + /** {@inheritDoc} */ + @Override public int getMaxRowSize() throws SQLException { + return 0; + } + + /** {@inheritDoc} */ + @Override public boolean doesMaxRowSizeIncludeBlobs() throws SQLException { + return false; + } + + /** {@inheritDoc} */ + @Override public int getMaxStatementLength() throws SQLException { + return 0; + } + + /** {@inheritDoc} */ + @Override public int getMaxStatements() throws SQLException { + return 0; + } + + /** {@inheritDoc} */ + @Override public int getMaxTableNameLength() throws SQLException { + return 0; + } + + /** {@inheritDoc} */ + @Override public int getMaxTablesInSelect() throws SQLException { + return 0; + } + + /** {@inheritDoc} */ + @Override public int getMaxUserNameLength() throws SQLException { + return 0; + } + + /** {@inheritDoc} */ + @Override public int getDefaultTransactionIsolation() throws SQLException { + return TRANSACTION_NONE; + } + + /** {@inheritDoc} */ + @Override public boolean supportsTransactions() throws SQLException { + return false; + } + + /** {@inheritDoc} */ + @Override public boolean supportsTransactionIsolationLevel(int level) throws SQLException { + return false; + } + + /** {@inheritDoc} */ + @Override public boolean supportsDataDefinitionAndDataManipulationTransactions() throws SQLException { + return false; + } + + /** {@inheritDoc} */ + @Override public boolean supportsDataManipulationTransactionsOnly() throws SQLException { + return false; + } + + /** {@inheritDoc} */ + @Override public boolean dataDefinitionCausesTransactionCommit() throws SQLException { + return false; + } + + /** {@inheritDoc} */ + @Override public boolean dataDefinitionIgnoredInTransactions() throws SQLException { + return false; + } + + /** {@inheritDoc} */ + @Override public ResultSet getProcedures(String catalog, String schemaPtrn, + String procedureNamePtrn) throws SQLException { + return new JdbcThinResultSet(Collections.>emptyList(), Arrays.asList( + new JdbcColumnMeta(null, null, "PROCEDURE_CAT", String.class), + new JdbcColumnMeta(null, null, "PROCEDURE_SCHEM", String.class), + new JdbcColumnMeta(null, null, "PROCEDURE_NAME", String.class), + new JdbcColumnMeta(null, null, "REMARKS", String.class), + new JdbcColumnMeta(null, null, "PROCEDURE_TYPE", String.class), + new JdbcColumnMeta(null, null, "SPECIFIC_NAME", String.class) + )); + } + + /** {@inheritDoc} */ + @Override public ResultSet getProcedureColumns(String catalog, String schemaPtrn, String procedureNamePtrn, + String colNamePtrn) throws SQLException { + return new JdbcThinResultSet(Collections.>emptyList(), Arrays.asList( + new JdbcColumnMeta(null, null, "PROCEDURE_CAT", String.class), + new JdbcColumnMeta(null, null, "PROCEDURE_SCHEM", String.class), + new JdbcColumnMeta(null, null, "PROCEDURE_NAME", String.class), + new JdbcColumnMeta(null, null, "COLUMN_NAME", String.class), + new JdbcColumnMeta(null, null, "COLUMN_TYPE", Short.class), + new JdbcColumnMeta(null, null, "COLUMN_TYPE", Integer.class), + new JdbcColumnMeta(null, null, "TYPE_NAME", String.class), + new JdbcColumnMeta(null, null, "PRECISION", Integer.class), + new JdbcColumnMeta(null, null, "LENGTH", Integer.class), + new JdbcColumnMeta(null, null, "SCALE", Short.class), + new JdbcColumnMeta(null, null, "RADIX", Short.class), + new JdbcColumnMeta(null, null, "NULLABLE", Short.class), + new JdbcColumnMeta(null, null, "REMARKS", String.class), + new JdbcColumnMeta(null, null, "COLUMN_DEF", String.class), + new JdbcColumnMeta(null, null, "SQL_DATA_TYPE", Integer.class), + new JdbcColumnMeta(null, null, "SQL_DATETIME_SUB", Integer.class), + new JdbcColumnMeta(null, null, "CHAR_OCTET_LENGTH", Integer.class), + new JdbcColumnMeta(null, null, "ORDINAL_POSITION", Integer.class), + new JdbcColumnMeta(null, null, "IS_NULLABLE", String.class), + new JdbcColumnMeta(null, null, "SPECIFIC_NAME", String.class) + )); + } + + /** {@inheritDoc} */ + @Override public ResultSet getTables(String catalog, String schemaPtrn, String tblNamePtrn, + String[] tblTypes) throws SQLException { + try { + if (conn.isClosed()) + throw new SQLException("Connection is closed."); + + JdbcMetaTablesResult res = conn.cliIo().tablesMeta(catalog, schemaPtrn, tblNamePtrn, tblTypes); + + List> rows = new LinkedList<>(); + + for (JdbcTableMeta tblMeta : res.meta()) + rows.add(tableRow(tblMeta)); + + return new JdbcThinResultSet(rows, Arrays.asList( + new JdbcColumnMeta(null, null, "TABLE_CAT", String.class), + new JdbcColumnMeta(null, null, "TABLE_SCHEM", String.class), + new JdbcColumnMeta(null, null, "TABLE_NAME", String.class), + new JdbcColumnMeta(null, null, "TABLE_TYPE", String.class), + new JdbcColumnMeta(null, null, "REMARKS", String.class), + new JdbcColumnMeta(null, null, "TYPE_CAT", String.class), + new JdbcColumnMeta(null, null, "TYPE_SCHEM", String.class), + new JdbcColumnMeta(null, null, "TYPE_NAME", String.class), + new JdbcColumnMeta(null, null, "SELF_REFERENCING_COL_NAME", String.class), + new JdbcColumnMeta(null, null, "REF_GENERATION", String.class))); + } + catch (IOException e) { + conn.close(); + + throw new SQLException("Failed to query Ignite.", e); + } + catch (IgniteCheckedException e) { + throw new SQLException("Failed to query Ignite.", e); + } + } + + /** + * @param tblMeta Table metadata. + * @return Table metadata row. + */ + private List tableRow(JdbcTableMeta tblMeta) { + List row = new ArrayList<>(10); + + row.add(upperCase(tblMeta.catalog())); + row.add(upperCase(tblMeta.schema())); + row.add(upperCase(tblMeta.table())); + row.add(upperCase(tblMeta.tableType())); + row.add(null); + row.add(null); + row.add(null); + row.add(null); + row.add(null); + row.add(null); + + return row; + } + + /** + * @param str Source string. + * @return Upper case string. + */ + private String upperCase(String str) { + return str == null ? null : str.toUpperCase(); + } + + /** {@inheritDoc} */ + @Override public ResultSet getSchemas() throws SQLException { + return getSchemas(null, "%"); + } + + /** {@inheritDoc} */ + @Override public ResultSet getCatalogs() throws SQLException { + return new JdbcThinResultSet(Collections.>emptyList(), Arrays.asList( + new JdbcColumnMeta(null, null, "TABLE_CAT", String.class))); + } + + /** {@inheritDoc} */ + @Override public ResultSet getTableTypes() throws SQLException { + return new JdbcThinResultSet(Collections.singletonList(Collections.singletonList("TABLE")), Arrays.asList( + new JdbcColumnMeta(null, null, "TABLE_TYPE", String.class))); + } + + /** {@inheritDoc} */ + @Override public ResultSet getColumns(String catalog, String schemaPtrn, String tblNamePtrn, + String colNamePtrn) throws SQLException { + try { + if (conn.isClosed()) + throw new SQLException("Connection is closed."); + + JdbcMetaColumnsResult res = conn.cliIo().columnsMeta(schemaPtrn, tblNamePtrn, colNamePtrn); + + List> rows = new LinkedList<>(); + + for (int i = 0; i < res.meta().size(); ++i) + rows.add(columnRow(res.meta().get(i), i + 1)); + + return new JdbcThinResultSet(rows, Arrays.asList( + new JdbcColumnMeta(null, null, "TABLE_CAT", String.class), + new JdbcColumnMeta(null, null, "TABLE_SCHEM", String.class), + new JdbcColumnMeta(null, null, "TABLE_NAME", String.class), + new JdbcColumnMeta(null, null, "COLUMN_NAME", String.class), + new JdbcColumnMeta(null, null, "DATA_TYPE", Short.class), + new JdbcColumnMeta(null, null, "TYPE_NAME", String.class), + new JdbcColumnMeta(null, null, "COLUMN_SIZE", Integer.class), + new JdbcColumnMeta(null, null, "DECIMAL_DIGITS", Integer.class), + new JdbcColumnMeta(null, null, "NUM_PREC_RADIX", Short.class), + new JdbcColumnMeta(null, null, "NULLABLE", Short.class), + new JdbcColumnMeta(null, null, "REMARKS", String.class), + new JdbcColumnMeta(null, null, "COLUMN_DEF", String.class), + new JdbcColumnMeta(null, null, "CHAR_OCTET_LENGTH", Integer.class), + new JdbcColumnMeta(null, null, "ORDINAL_POSITION", Integer.class), + new JdbcColumnMeta(null, null, "IS_NULLABLE", String.class), + new JdbcColumnMeta(null, null, "SCOPE_CATLOG", String.class), + new JdbcColumnMeta(null, null, "SCOPE_SCHEMA", String.class), + new JdbcColumnMeta(null, null, "SCOPE_TABLE", String.class), + new JdbcColumnMeta(null, null, "SOURCE_DATA_TYPE", Short.class), + new JdbcColumnMeta(null, null, "IS_AUTOINCREMENT", String.class))); + } + catch (IOException e) { + conn.close(); + + throw new SQLException("Failed to query Ignite.", e); + } + catch (IgniteCheckedException e) { + throw new SQLException("Failed to query Ignite.", e); + } + } + + /** + * @param colMeta Column metadata. + * @param pos Ordinal position. + * @return Column metadata row. + */ + private List columnRow(JdbcColumnMeta colMeta, int pos) { + List row = new ArrayList<>(20); + + row.add((String)null); + row.add(upperCase(colMeta.schemaName())); + row.add(upperCase(colMeta.tableName())); + row.add(upperCase(colMeta.columnName())); + row.add(colMeta.dataType()); + row.add(upperCase(colMeta.dataTypeName())); + row.add((Integer)null); + row.add((Integer)null); + row.add(10); + row.add(JdbcUtils.nullable(colMeta.columnName(), colMeta.dataTypeClass()) ? 1 : 0 ); + row.add((String)null); + row.add((String)null); + row.add(Integer.MAX_VALUE); + row.add(pos); + row.add("YES"); + row.add((String)null); + row.add((String)null); + row.add((String)null); + row.add((Short)null); + row.add("NO"); + + return row; + } + + /** {@inheritDoc} */ + @Override public ResultSet getColumnPrivileges(String catalog, String schema, String tbl, + String colNamePtrn) throws SQLException { + return emptyResultSet(); + } + + /** {@inheritDoc} */ + @Override public ResultSet getTablePrivileges(String catalog, String schemaPtrn, + String tblNamePtrn) throws SQLException { + return emptyResultSet(); + } + + /** {@inheritDoc} */ + @Override public ResultSet getBestRowIdentifier(String catalog, String schema, String tbl, int scope, + boolean nullable) throws SQLException { + return emptyResultSet(); + } + + /** {@inheritDoc} */ + @Override public ResultSet getVersionColumns(String catalog, String schema, String tbl) throws SQLException { + return emptyResultSet(); + } + + /** + * @return Empty result set. + */ + private ResultSet emptyResultSet() { + return new JdbcThinResultSet(Collections.singletonList(Collections.emptyList()), + Collections.emptyList()); + } + + /** {@inheritDoc} */ + @Override public ResultSet getPrimaryKeys(String catalog, String schema, String tbl) throws SQLException { +// List> rows = new LinkedList<>(); +// +// for (Map.Entry>> s : meta.entrySet()) +// if (schema == null || schema.toUpperCase().equals(s.getKey())) +// for (Map.Entry> t : s.getValue().entrySet()) +// if (tbl == null || tbl.toUpperCase().equals(t.getKey())) +// rows.add(Arrays.asList((String)null, s.getKey().toUpperCase(), +// t.getKey().toUpperCase(), "_KEY", 1, "_KEY")); +// +// return new JdbcThinResultSet( +// conn.createStatement0(), +// Collections.emptyList(), +// Arrays.asList("TABLE_CAT", "TABLE_SCHEM", "TABLE_NAME", "COLUMN_NAME", "KEY_SEQ", "PK_NAME"), +// Arrays.asList(String.class.getName(), String.class.getName(), String.class.getName(), +// String.class.getName(), Short.class.getName(), String.class.getName()), +// rows +// ); + + return null; + } + + /** {@inheritDoc} */ + @Override public ResultSet getImportedKeys(String catalog, String schema, String tbl) throws SQLException { + return emptyResultSet(); + } + + /** {@inheritDoc} */ + @Override public ResultSet getExportedKeys(String catalog, String schema, String tbl) throws SQLException { + return emptyResultSet(); + } + + /** {@inheritDoc} */ + @Override public ResultSet getCrossReference(String parentCatalog, String parentSchema, String parentTbl, + String foreignCatalog, String foreignSchema, String foreignTbl) throws SQLException { + return emptyResultSet(); + } + + /** {@inheritDoc} */ + @Override public ResultSet getTypeInfo() throws SQLException { + return emptyResultSet(); + } + + /** {@inheritDoc} */ + @Override public ResultSet getIndexInfo(String catalog, String schema, String tbl, boolean unique, + boolean approximate) throws SQLException { + try { + if (conn.isClosed()) + throw new SQLException("Connection is closed."); + + JdbcMetaIndexesResult res = conn.cliIo().indexMeta(catalog, schema, tbl, unique, approximate); + + List> rows = new LinkedList<>(); + + for (int i = 0; i < res.meta().size(); ++i) + rows.addAll(indexRow(schema, tbl, res.meta().get(i))); + + return new JdbcThinResultSet(rows, Arrays.asList( + new JdbcColumnMeta(null, null, "TABLE_CAT", String.class), + new JdbcColumnMeta(null, null, "TABLE_SCHEM", String.class), + new JdbcColumnMeta(null, null, "TABLE_NAME", String.class), + new JdbcColumnMeta(null, null, "NON_UNIQUE", Boolean.class), + new JdbcColumnMeta(null, null, "INDEX_QUALIFIER", String.class), + new JdbcColumnMeta(null, null, "INDEX_NAME", String.class), + new JdbcColumnMeta(null, null, "TYPE", Short.class), + new JdbcColumnMeta(null, null, "ORDINAL_POSITION", Short.class), + new JdbcColumnMeta(null, null, "COLUMN_NAME", String.class), + new JdbcColumnMeta(null, null, "ASC_OR_DESC", String.class), + new JdbcColumnMeta(null, null, "CARDINALITY", Integer.class), + new JdbcColumnMeta(null, null, "PAGES", Integer.class), + new JdbcColumnMeta(null, null, "FILTER_CONDITION", String.class))); + } + catch (IOException e) { + conn.close(); + + throw new SQLException("Failed to query Ignite.", e); + } + catch (IgniteCheckedException e) { + throw new SQLException("Failed to query Ignite.", e); + } + } + + /** + * @param schema Table schema name. + * @param tbl Table name. + * @param idxMeta Index metadata. + * @return List of result rows correspond to index. + */ + private List> indexRow(String schema, String tbl, JdbcIndexMeta idxMeta) { + List> rows = new ArrayList<>(idxMeta.fields().length); + + for (int i = 0; i < idxMeta.fields().length; ++i) { + List row = new ArrayList<>(13); + + row.add((String)null); // table catalog + row.add(upperCase(schema)); + row.add(upperCase(tbl)); + row.add(true); // non unique + row.add(null); // index qualifier (index catalog) + row.add(upperCase(idxMeta.name())); + row.add((int)tableIndexOther); // type + row.add((Integer)i); // field ordinal position in index + row.add(upperCase(idxMeta.fields()[i])); + row.add(idxMeta.fieldsAsc()[i] ? "A" : "D"); + row.add((Integer)0); // cardinality + row.add((Integer)0); // pages + row.add((String)null); // filer condition + + rows.add(row); + } + + return rows; + } + + /** {@inheritDoc} */ + @Override public boolean supportsResultSetType(int type) throws SQLException { + return true; + } + + /** {@inheritDoc} */ + @Override public boolean supportsResultSetConcurrency(int type, int concurrency) throws SQLException { + return concurrency == CONCUR_READ_ONLY; + } + + /** {@inheritDoc} */ + @Override public boolean ownUpdatesAreVisible(int type) throws SQLException { + return false; + } + + /** {@inheritDoc} */ + @Override public boolean ownDeletesAreVisible(int type) throws SQLException { + return false; + } + + /** {@inheritDoc} */ + @Override public boolean ownInsertsAreVisible(int type) throws SQLException { + return false; + } + + /** {@inheritDoc} */ + @Override public boolean othersUpdatesAreVisible(int type) throws SQLException { + return false; + } + + /** {@inheritDoc} */ + @Override public boolean othersDeletesAreVisible(int type) throws SQLException { + return false; + } + + /** {@inheritDoc} */ + @Override public boolean othersInsertsAreVisible(int type) throws SQLException { + return false; + } + + /** {@inheritDoc} */ + @Override public boolean updatesAreDetected(int type) throws SQLException { + return false; + } + + /** {@inheritDoc} */ + @Override public boolean deletesAreDetected(int type) throws SQLException { + return false; + } + + /** {@inheritDoc} */ + @Override public boolean insertsAreDetected(int type) throws SQLException { + return false; + } + + /** {@inheritDoc} */ + @Override public boolean supportsBatchUpdates() throws SQLException { + return false; + } + + /** {@inheritDoc} */ + @Override public ResultSet getUDTs(String catalog, String schemaPtrn, String typeNamePtrn, + int[] types) throws SQLException { + return emptyResultSet(); + } + + /** {@inheritDoc} */ + @Override public Connection getConnection() throws SQLException { + return conn; + } + + /** {@inheritDoc} */ + @Override public boolean supportsSavepoints() throws SQLException { + return false; + } + + /** {@inheritDoc} */ + @Override public boolean supportsNamedParameters() throws SQLException { + return false; + } + + /** {@inheritDoc} */ + @Override public boolean supportsMultipleOpenResults() throws SQLException { + return false; + } + + /** {@inheritDoc} */ + @Override public boolean supportsGetGeneratedKeys() throws SQLException { + return false; + } + + /** {@inheritDoc} */ + @Override public ResultSet getSuperTypes(String catalog, String schemaPtrn, + String typeNamePtrn) throws SQLException { + return emptyResultSet(); + } + + /** {@inheritDoc} */ + @Override public ResultSet getSuperTables(String catalog, String schemaPtrn, + String tblNamePtrn) throws SQLException { + return emptyResultSet(); + } + + /** {@inheritDoc} */ + @Override public ResultSet getAttributes(String catalog, String schemaPtrn, String typeNamePtrn, + String attributeNamePtrn) throws SQLException { + return emptyResultSet(); + } + + /** {@inheritDoc} */ + @Override public boolean supportsResultSetHoldability(int holdability) throws SQLException { + return holdability == HOLD_CURSORS_OVER_COMMIT; + } + + /** {@inheritDoc} */ + @Override public int getResultSetHoldability() throws SQLException { + return HOLD_CURSORS_OVER_COMMIT; + } + + /** {@inheritDoc} */ + @Override public int getDatabaseMajorVersion() throws SQLException { + return 1; + } + + /** {@inheritDoc} */ + @Override public int getDatabaseMinorVersion() throws SQLException { + return 0; + } + + /** {@inheritDoc} */ + @Override public int getJDBCMajorVersion() throws SQLException { + return 1; + } + + /** {@inheritDoc} */ + @Override public int getJDBCMinorVersion() throws SQLException { + return 0; + } + + /** {@inheritDoc} */ + @Override public int getSQLStateType() throws SQLException { + return 0; + } + + /** {@inheritDoc} */ + @Override public boolean locatorsUpdateCopy() throws SQLException { + return false; + } + + /** {@inheritDoc} */ + @Override public boolean supportsStatementPooling() throws SQLException { + return false; + } + + /** {@inheritDoc} */ + @Override public RowIdLifetime getRowIdLifetime() throws SQLException { + return ROWID_UNSUPPORTED; + } + + /** {@inheritDoc} */ + @Override public ResultSet getSchemas(String catalog, String schemaPtrn) throws SQLException { + // TODO: impl +// List> rows = new ArrayList<>(meta.size()); +// +// for (String schema : meta.keySet()) +// if (matches(schema, schemaPtrn)) +// rows.add(Arrays.asList(schema, (String)null)); +// +// return new JdbcThinResultSet( +// conn.createStatement0(), +// Collections.emptyList(), +// Arrays.asList("TABLE_SCHEM", "TABLE_CATALOG"), +// Arrays.asList(String.class.getName(), String.class.getName()), +// rows +// ); + return emptyResultSet(); + } + + /** {@inheritDoc} */ + @Override public boolean supportsStoredFunctionsUsingCallSyntax() throws SQLException { + return false; + } + + /** {@inheritDoc} */ + @Override public boolean autoCommitFailureClosesAllResultSets() throws SQLException { + return false; + } + + /** {@inheritDoc} */ + @Override public ResultSet getClientInfoProperties() throws SQLException { + return emptyResultSet(); + } + + /** {@inheritDoc} */ + @Override public ResultSet getFunctions(String catalog, String schemaPtrn, + String functionNamePtrn) throws SQLException { + + // TODO: impl +// return new JdbcThinResultSet( +// conn.createStatement0(), +// Collections.emptyList(), +// Arrays.asList("FUNCTION_CAT", "FUNCTION_SCHEM", "FUNCTION_NAME", +// "REMARKS", "FUNCTION_TYPE", "SPECIFIC_NAME"), +// Arrays.asList(String.class.getName(), String.class.getName(), String.class.getName(), +// String.class.getName(), Short.class.getName(), String.class.getName()), +// Collections.>emptyList() +// ); + + return emptyResultSet(); + } + + /** {@inheritDoc} */ + @Override public ResultSet getFunctionColumns(String catalog, String schemaPtrn, String functionNamePtrn, + String colNamePtrn) throws SQLException { + + return new JdbcThinResultSet(Collections.>emptyList(), Arrays.asList( + new JdbcColumnMeta(null, null, "FUNCTION_CAT", String.class), + new JdbcColumnMeta(null, null, "FUNCTION_SCHEM", String.class), + new JdbcColumnMeta(null, null, "FUNCTION_NAME", String.class), + new JdbcColumnMeta(null, null, "COLUMN_NAME", String.class), + new JdbcColumnMeta(null, null, "COLUMN_TYPE", Short.class), + new JdbcColumnMeta(null, null, "DATA_TYPE", Integer.class), + new JdbcColumnMeta(null, null, "TYPE_NAME", String.class), + new JdbcColumnMeta(null, null, "PRECISION", Integer.class), + new JdbcColumnMeta(null, null, "LENGTH", Integer.class), + new JdbcColumnMeta(null, null, "SCALE", Short.class), + new JdbcColumnMeta(null, null, "RADIX", Short.class), + new JdbcColumnMeta(null, null, "NULLABLE", Short.class), + new JdbcColumnMeta(null, null, "REMARKS", String.class), + new JdbcColumnMeta(null, null, "CHAR_OCTET_LENGTH", Integer.class), + new JdbcColumnMeta(null, null, "ORDINAL_POSITION", Integer.class), + new JdbcColumnMeta(null, null, "IS_NULLABLE", String.class), + new JdbcColumnMeta(null, null, "SPECIFIC_NAME", String.class) + )); + } + + /** {@inheritDoc} */ + @Override public T unwrap(Class iface) throws SQLException { + if (!isWrapperFor(iface)) + throw new SQLException("Database meta data is not a wrapper for " + iface.getName()); + + return (T)this; + } + + /** {@inheritDoc} */ + @Override public boolean isWrapperFor(Class iface) throws SQLException { + return iface != null && iface == DatabaseMetaData.class; + } + + /** {@inheritDoc} */ + @Override public ResultSet getPseudoColumns(String catalog, String schemaPtrn, String tblNamePtrn, + String colNamePtrn) throws SQLException { + return emptyResultSet(); + } + + /** {@inheritDoc} */ + @Override public boolean generatedKeyAlwaysReturned() throws SQLException { + return false; + } + + /** + * Checks whether string matches SQL pattern. + * + * @param str String. + * @param ptrn Pattern. + * @return Whether string matches pattern. + */ + private boolean matches(String str, String ptrn) { + return str != null && (ptrn == null || + str.toUpperCase().matches(ptrn.toUpperCase().replace("%", ".*").replace("_", "."))); + } +} \ No newline at end of file diff --git a/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinResultSet.java b/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinResultSet.java index 36f938b5d05bb..3731e47ac6f33 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinResultSet.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinResultSet.java @@ -97,6 +97,31 @@ public class JdbcThinResultSet implements ResultSet { /** Update count. */ private long updCnt; + /** + * Constructs static result set. + * + * @param fields Fields. + * @param meta Columns metadata. + */ + JdbcThinResultSet(List> fields, List meta) { + stmt = null; + fetchSize = 0; + qryId = -1L; + finished = true; + isQuery = true; + updCnt = -1; + + this.rows = fields; + + rowsIter = fields.iterator(); + + this.meta = meta; + + metaInit = true; + + initColumnOrder(); + } + /** * Creates new result set. * @@ -106,6 +131,7 @@ public class JdbcThinResultSet implements ResultSet { * @param finished Finished flag. * @param rows Rows. * @param isQuery Is Result ser for Select query + * @param updCnt Update count. */ @SuppressWarnings("OverlyStrongTypeCast") JdbcThinResultSet(JdbcThinStatement stmt, long qryId, int fetchSize, boolean finished, @@ -174,7 +200,7 @@ public class JdbcThinResultSet implements ResultSet { /** {@inheritDoc} */ @Override public void close() throws SQLException { - if (closed || stmt.connection().isClosed()) + if (closed || stmt == null || stmt.connection().isClosed()) return; try { @@ -1638,7 +1664,6 @@ private List meta() throws SQLException { } /** - * Init column order map. * @throws SQLException On error. * @return Column order map. */ @@ -1649,6 +1674,15 @@ private Map columnOrder() throws SQLException { if(!metaInit) meta(); + initColumnOrder(); + + return colOrder; + } + + /** + * Init column order map. + */ + private void initColumnOrder() { colOrder = new HashMap<>(meta.size()); for (int i = 0; i < meta.size(); ++i) { @@ -1657,8 +1691,6 @@ private Map columnOrder() throws SQLException { if(!colOrder.containsKey(colName)) colOrder.put(colName, i); } - - return colOrder; } /** diff --git a/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinTcpIo.java b/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinTcpIo.java index 136fcf91e134f..d21f80daf0a60 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinTcpIo.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinTcpIo.java @@ -31,6 +31,12 @@ import org.apache.ignite.internal.processors.odbc.SqlListenerProtocolVersion; import org.apache.ignite.internal.processors.odbc.SqlListenerRequest; import org.apache.ignite.internal.processors.odbc.SqlListenerResponse; +import org.apache.ignite.internal.processors.odbc.jdbc.JdbcMetaColumnsRequest; +import org.apache.ignite.internal.processors.odbc.jdbc.JdbcMetaColumnsResult; +import org.apache.ignite.internal.processors.odbc.jdbc.JdbcMetaIndexesRequest; +import org.apache.ignite.internal.processors.odbc.jdbc.JdbcMetaIndexesResult; +import org.apache.ignite.internal.processors.odbc.jdbc.JdbcMetaTablesRequest; +import org.apache.ignite.internal.processors.odbc.jdbc.JdbcMetaTablesResult; import org.apache.ignite.internal.processors.odbc.jdbc.JdbcQueryCloseRequest; import org.apache.ignite.internal.processors.odbc.jdbc.JdbcQueryExecuteRequest; import org.apache.ignite.internal.processors.odbc.jdbc.JdbcQueryExecuteResult; @@ -57,7 +63,7 @@ public class JdbcThinTcpIo { private static final int HANDSHAKE_MSG_SIZE = 10; /** Initial output for query message. */ - private static final int QUERY_EXEC_MSG_INIT_CAP = 1024; + private static final int DYNAMIC_SIZE_MSG_CAP = 1024; /** Initial output for query fetch message. */ private static final int QUERY_FETCH_MSG_SIZE = 13; @@ -173,7 +179,7 @@ public JdbcQueryExecuteResult queryExecute(String cache, int fetchSize, int maxR String sql, List args) throws IOException, IgniteCheckedException { return sendRequest(new JdbcQueryExecuteRequest(cache, fetchSize, maxRows, sql, - args == null ? null : args.toArray(new Object[args.size()])), QUERY_EXEC_MSG_INIT_CAP); + args == null ? null : args.toArray(new Object[args.size()])), DYNAMIC_SIZE_MSG_CAP); } /** @@ -236,6 +242,48 @@ public void queryClose(long qryId) throws IOException, IgniteCheckedException { sendRequest(new JdbcQueryCloseRequest(qryId), QUERY_CLOSE_MSG_SIZE); } + /** + * @param catalog Catalog. + * @param schemaPtrn Schema name pattern. + * @param tablePtrn Table name pattern. + * @param types Table types + * @return Result. + * @throws IOException On error. + * @throws IgniteCheckedException On error. + */ + public JdbcMetaTablesResult tablesMeta(String catalog, String schemaPtrn, String tablePtrn, String[] types) + throws IOException, IgniteCheckedException { + return sendRequest(new JdbcMetaTablesRequest(catalog, schemaPtrn, tablePtrn, types), DYNAMIC_SIZE_MSG_CAP); + } + + /** + * @param schemaPtrn Schema name pattern. + * @param tablePtrn Table name pattern. + * @param columnPtrn Column name pattern. + * @return Result. + * @throws IOException On error. + * @throws IgniteCheckedException On error. + */ + public JdbcMetaColumnsResult columnsMeta(String schemaPtrn, String tablePtrn, String columnPtrn) + throws IOException, IgniteCheckedException { + return sendRequest(new JdbcMetaColumnsRequest(schemaPtrn, tablePtrn, columnPtrn), DYNAMIC_SIZE_MSG_CAP); + } + + /** + * @param catalog Catalog. + * @param schema Schema. + * @param tbl Table + * @param unique Is Index unique. + * @param approximate Request approximate index. + * @throws IOException On error. + * @throws IgniteCheckedException On error. + * @return Result. + */ + public JdbcMetaIndexesResult indexMeta(String catalog, String schema, String tbl, + boolean unique, boolean approximate) throws IOException, IgniteCheckedException { + return sendRequest(new JdbcMetaIndexesRequest(catalog, schema, tbl, unique, approximate), DYNAMIC_SIZE_MSG_CAP); + } + /** * @param req ODBC request. * @throws IOException On error. diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcColumnMeta.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcColumnMeta.java index 07cbabef7ef5c..de144b278310f 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcColumnMeta.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcColumnMeta.java @@ -64,8 +64,26 @@ public JdbcColumnMeta(GridQueryFieldMetadata info) { } /** - * @return Schema name. + * @param schemaName Schema. + * @param tableName Table. + * @param columnName Column. + * @param cls Type. */ + public JdbcColumnMeta(String schemaName, String tableName, String columnName, Class cls) { + this.schemaName = schemaName; + this.tableName = tableName; + this.columnName = columnName; + + String type = cls.getName(); + dataType = JdbcThinUtils.type(type); + dataTypeName = JdbcThinUtils.typeName(type); + dataTypeClass = type; + } + + + /** + * @return Schema name. + */ public String schemaName() { return schemaName; } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcIndexMeta.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcIndexMeta.java new file mode 100644 index 0000000000000..8936479c33274 --- /dev/null +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcIndexMeta.java @@ -0,0 +1,116 @@ +/* + * 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 org.apache.ignite.internal.processors.odbc.jdbc; + +import org.apache.ignite.binary.BinaryObjectException; +import org.apache.ignite.cache.QueryIndexType; +import org.apache.ignite.internal.binary.BinaryReaderExImpl; +import org.apache.ignite.internal.binary.BinaryWriterExImpl; +import org.apache.ignite.internal.processors.query.GridQueryIndexDescriptor; + +/** + * SQL listener index metadata. + */ +public class JdbcIndexMeta implements JdbcRawBinarylizable { + /** Index name. */ + private String name; + + /** Index type. */ + private QueryIndexType type; + + /** Inline size. */ + private int inlineSize; + + /** Index fields */ + private String[] fields; + + /** Index fields is ascending. */ + private boolean[] fieldsAsc; + + /** + * Default constructor is used for binary serialization. + */ + public JdbcIndexMeta() { + // No-op. + } + + /** + * @param idx Index info. + */ + public JdbcIndexMeta(GridQueryIndexDescriptor idx) { + name = idx.name(); + type = idx.type(); + inlineSize = idx.inlineSize(); + } + + /** + * @return Index name. + */ + public String name() { + return name; + } + + /** + * @return Index type. + */ + public QueryIndexType type() { + return type; + } + + /** + * @return Inline size. + */ + public int inlineSize() { + return inlineSize; + } + + /** + * @return Index fields + */ + public String[] fields() { + return fields; + } + + /** + * @return Index fields is ascending. + */ + public boolean[] fieldsAsc() { + return fieldsAsc; + } + + /** {@inheritDoc} */ + @Override public void writeBinary(BinaryWriterExImpl writer) throws BinaryObjectException { + writer.writeString(name); + writer.writeByte((byte)type.ordinal()); + writer.writeInt(inlineSize); + writer.writeStringArray(fields); + writer.writeBooleanArray(fieldsAsc); + } + + /** {@inheritDoc} */ + @Override public void readBinary(BinaryReaderExImpl reader) throws BinaryObjectException { + name = reader.readString(); + type = QueryIndexType.fromOrdinal(reader.readByte()); + inlineSize = reader.readInt(); + fields = reader.readStringArray(); + fieldsAsc = reader.readBooleanArray(); + + assert fields.length == fieldsAsc.length : "Fields info is broken: [fields.length=" + fields.length + + ", fieldsAsc.length=" + fieldsAsc.length + ']'; + } +} diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaColumnsRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaColumnsRequest.java new file mode 100644 index 0000000000000..768b2f8ae40a7 --- /dev/null +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaColumnsRequest.java @@ -0,0 +1,102 @@ +/* + * 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 org.apache.ignite.internal.processors.odbc.jdbc; + +import org.apache.ignite.binary.BinaryObjectException; +import org.apache.ignite.internal.binary.BinaryReaderExImpl; +import org.apache.ignite.internal.binary.BinaryWriterExImpl; +import org.apache.ignite.internal.util.typedef.internal.S; +import org.jetbrains.annotations.Nullable; + +/** + * ODBC query get columns meta request. + */ +public class JdbcMetaColumnsRequest extends JdbcRequest { + /** Cache name. */ + private String schemaName; + + /** Table name. */ + private String tableName; + + /** Column name. */ + private String columnName; + + /** + * Default constructor is used for deserialization. + */ + public JdbcMetaColumnsRequest() { + super(META_COLUMNS); + } + + /** + * @param schemaName Cache name. + * @param tableName Table name. + * @param columnName Column name. + */ + public JdbcMetaColumnsRequest(String schemaName, String tableName, String columnName) { + super(META_COLUMNS); + + this.schemaName = schemaName; + this.tableName = tableName; + this.columnName = columnName; + } + + /** + * @return Cache name. + */ + @Nullable public String cacheName() { + return schemaName; + } + + /** + * @return Table name. + */ + public String tableName() { + return tableName; + } + + /** + * @return Column name. + */ + public String columnName() { + return columnName; + } + + /** {@inheritDoc} */ + @Override public void writeBinary(BinaryWriterExImpl writer) throws BinaryObjectException { + super.writeBinary(writer); + + writer.writeString(schemaName); + writer.writeString(tableName); + writer.writeString(columnName); + } + + /** {@inheritDoc} */ + @Override public void readBinary(BinaryReaderExImpl reader) throws BinaryObjectException { + super.readBinary(reader); + + schemaName = reader.readString(); + tableName = reader.readString(); + columnName = reader.readString(); + } + + /** {@inheritDoc} */ + @Override public String toString() { + return S.toString(JdbcMetaColumnsRequest.class, this); + } +} \ No newline at end of file diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaColumnsResult.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaColumnsResult.java new file mode 100644 index 0000000000000..dd788a6212246 --- /dev/null +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaColumnsResult.java @@ -0,0 +1,91 @@ +/* + * 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 org.apache.ignite.internal.processors.odbc.jdbc; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import org.apache.ignite.binary.BinaryObjectException; +import org.apache.ignite.internal.binary.BinaryReaderExImpl; +import org.apache.ignite.internal.binary.BinaryWriterExImpl; +import org.apache.ignite.internal.util.typedef.F; + +/** + * Query get columns meta result. + */ +public class JdbcMetaColumnsResult extends JdbcResult { + /** Query result rows. */ + private List meta; + + /** + * Default constructor is used for deserialization. + */ + public JdbcMetaColumnsResult() { + super(META_COLUMNS); + } + + /** + * @param meta Column metadata. + */ + public JdbcMetaColumnsResult(List meta) { + super(META_COLUMNS); + this.meta = meta; + } + + /** + * @return Query result rows. + */ + public List meta() { + return meta; + } + + /** {@inheritDoc} */ + @Override public void writeBinary(BinaryWriterExImpl writer) throws BinaryObjectException { + super.writeBinary(writer); + + if (F.isEmpty(meta)) + writer.writeInt(0); + else { + writer.writeInt(meta.size()); + + for(JdbcColumnMeta m : meta) + m.writeBinary(writer); + } + } + + /** {@inheritDoc} */ + @Override public void readBinary(BinaryReaderExImpl reader) throws BinaryObjectException { + super.readBinary(reader); + + int size = reader.readInt(); + + if (size == 0) + meta = Collections.emptyList(); + else { + meta = new ArrayList<>(size); + + for (int i = 0; i < size; ++i) { + JdbcColumnMeta m = new JdbcColumnMeta(); + + m.readBinary(reader); + + meta.add(m); + } + } + } +} diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaIndexesRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaIndexesRequest.java new file mode 100644 index 0000000000000..225e6131b335e --- /dev/null +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaIndexesRequest.java @@ -0,0 +1,130 @@ +/* + * 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 org.apache.ignite.internal.processors.odbc.jdbc; + +import org.apache.ignite.binary.BinaryObjectException; +import org.apache.ignite.internal.binary.BinaryReaderExImpl; +import org.apache.ignite.internal.binary.BinaryWriterExImpl; +import org.apache.ignite.internal.util.typedef.internal.S; +import org.jetbrains.annotations.Nullable; + +/** + * ODBC query get columns meta request. + */ +public class JdbcMetaIndexesRequest extends JdbcRequest { + /** Cache name. */ + private String catalog; + + /** Cache name. */ + private String schema; + + /** Table name. */ + private String tableName; + + /** When true, return only indices for unique values. */ + private boolean unique; + + /** When true, result is allowed to reflect approximate or out of data values. */ + private boolean approximate; + + /** + * Default constructor is used for deserialization. + */ + public JdbcMetaIndexesRequest() { + super(META_INDEXES); + } + + /** + * @param catalog Catalog name. + * @param schema Cache name. + * @param tableName Table name. + * @param unique {@code true} when only indices for unique values are requested. + * @param approximate {@code true} when approximate or out of data values indexes are allowed in results. + */ + public JdbcMetaIndexesRequest(String catalog, String schema, String tableName, boolean unique, boolean approximate) { + super(META_INDEXES); + + this.catalog = catalog; + this.schema = schema; + this.tableName = tableName; + this.unique = unique; + this.approximate = approximate; + } + + /** + * @return Catalog name. + */ + @Nullable public String catalog() { + return catalog; + } + + /** + * @return Schema name. + */ + @Nullable public String schema() { + return schema; + } + + /** + * @return Table name. + */ + public String tableName() { + return tableName; + } + + /** + * @return {@code true} when only indices for unique values are requested. + */ + public boolean unique() { + return unique; + } + + /** + * @return {@code true} when approximate or out of data values indexes are allowed in results. + */ + public boolean approximate() { + return approximate; + } + + /** {@inheritDoc} */ + @Override public void writeBinary(BinaryWriterExImpl writer) throws BinaryObjectException { + super.writeBinary(writer); + + writer.writeString(catalog); + writer.writeString(schema); + writer.writeString(tableName); + writer.writeBoolean(unique); + writer.writeBoolean(approximate); + } + + /** {@inheritDoc} */ + @Override public void readBinary(BinaryReaderExImpl reader) throws BinaryObjectException { + super.readBinary(reader); + + catalog = reader.readString(); + schema = reader.readString(); + tableName = reader.readString(); + unique = reader.readBoolean(); + approximate = reader.readBoolean(); + } + + /** {@inheritDoc} */ + @Override public String toString() { + return S.toString(JdbcMetaIndexesRequest.class, this); + } +} \ No newline at end of file diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaIndexesResult.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaIndexesResult.java new file mode 100644 index 0000000000000..75ee1b559fc10 --- /dev/null +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaIndexesResult.java @@ -0,0 +1,92 @@ +/* + * 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 org.apache.ignite.internal.processors.odbc.jdbc; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import org.apache.ignite.binary.BinaryObjectException; +import org.apache.ignite.internal.binary.BinaryReaderExImpl; +import org.apache.ignite.internal.binary.BinaryWriterExImpl; +import org.apache.ignite.internal.util.typedef.F; + +/** + * Query get indexes meta result. + */ +public class JdbcMetaIndexesResult extends JdbcResult { + /** Query result rows. */ + private List meta; + + /** + * Default constructor is used for deserialization. + */ + public JdbcMetaIndexesResult() { + super(META_INDEXES); + this.meta = meta; + } + + /** + * @param meta Column metadata. + */ + public JdbcMetaIndexesResult(List meta) { + super(META_INDEXES); + this.meta = meta; + } + + /** + * @return Query result rows. + */ + public List meta() { + return meta; + } + + /** {@inheritDoc} */ + @Override public void writeBinary(BinaryWriterExImpl writer) throws BinaryObjectException { + super.writeBinary(writer); + + if (F.isEmpty(meta)) + writer.writeInt(0); + else { + writer.writeInt(meta.size()); + + for(JdbcIndexMeta m : meta) + m.writeBinary(writer); + } + } + + /** {@inheritDoc} */ + @Override public void readBinary(BinaryReaderExImpl reader) throws BinaryObjectException { + super.readBinary(reader); + + int size = reader.readInt(); + + if (size == 0) + meta = Collections.emptyList(); + else { + meta = new ArrayList<>(size); + + for (int i = 0; i < size; ++i) { + JdbcIndexMeta m = new JdbcIndexMeta(); + + m.readBinary(reader); + + meta.add(m); + } + } + } +} diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaParamsRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaParamsRequest.java new file mode 100644 index 0000000000000..bdcd8b9c1b6d0 --- /dev/null +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaParamsRequest.java @@ -0,0 +1,87 @@ +/* + * 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 org.apache.ignite.internal.processors.odbc.jdbc; + +import org.apache.ignite.binary.BinaryObjectException; +import org.apache.ignite.internal.binary.BinaryReaderExImpl; +import org.apache.ignite.internal.binary.BinaryWriterExImpl; +import org.apache.ignite.internal.util.typedef.internal.S; + +/** + * ODBC query get params meta request. + */ +public class JdbcMetaParamsRequest extends JdbcRequest { + /** Cache. */ + private String schemaName; + + /** Query. */ + private String sql; + + /** + * Default constructor is used for deserialization. + */ + public JdbcMetaParamsRequest() { + super(META_PARAMS); + } + + /** + * @param schemaName Schema name. + * @param sql SQL Query. + */ + public JdbcMetaParamsRequest(String schemaName, String sql) { + super(META_PARAMS); + + this.schemaName = schemaName; + this.sql = sql; + } + + /** + * @return SQL Query. + */ + public String query() { + return sql; + } + + /** + * @return Cache name. + */ + public String schemaName() { + return schemaName; + } + + /** {@inheritDoc} */ + @Override public void writeBinary(BinaryWriterExImpl writer) throws BinaryObjectException { + super.writeBinary(writer); + + writer.writeString(schemaName); + writer.writeString(sql); + } + + /** {@inheritDoc} */ + @Override public void readBinary(BinaryReaderExImpl reader) throws BinaryObjectException { + super.readBinary(reader); + + schemaName = reader.readString(); + sql = reader.readString(); + } + + /** {@inheritDoc} */ + @Override public String toString() { + return S.toString(JdbcMetaParamsRequest.class, this); + } +} diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaParamsResult.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaParamsResult.java new file mode 100644 index 0000000000000..c450848cd4f62 --- /dev/null +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaParamsResult.java @@ -0,0 +1,91 @@ +/* + * 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 org.apache.ignite.internal.processors.odbc.jdbc; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import org.apache.ignite.binary.BinaryObjectException; +import org.apache.ignite.internal.binary.BinaryReaderExImpl; +import org.apache.ignite.internal.binary.BinaryWriterExImpl; +import org.apache.ignite.internal.util.typedef.F; + +/** + * Query get columns meta result. + */ +public class JdbcMetaParamsResult extends JdbcResult { + /** Query result rows. */ + private List meta; + + /** + * Default constructor is used for deserialization. + */ + public JdbcMetaParamsResult() { + super(META_PARAMS); + } + + /** + * @param meta Column metadata. + */ + public JdbcMetaParamsResult(List meta) { + super(META_PARAMS); + this.meta = meta; + } + + /** {@inheritDoc} */ + @Override public void writeBinary(BinaryWriterExImpl writer) throws BinaryObjectException { + super.writeBinary(writer); + + if (F.isEmpty(meta)) + writer.writeInt(0); + else { + writer.writeInt(meta.size()); + + for(JdbcParamMeta m : meta) + m.writeBinary(writer); + } + } + + /** {@inheritDoc} */ + @Override public void readBinary(BinaryReaderExImpl reader) throws BinaryObjectException { + super.readBinary(reader); + + int size = reader.readInt(); + + if (size == 0) + meta = Collections.emptyList(); + else { + meta = new ArrayList<>(size); + + for (int i = 0; i < size; ++i) { + JdbcParamMeta m = new JdbcParamMeta(); + + m.readBinary(reader); + + meta.add(m); + } + } + } + + /** + * @return Query result rows. + */ + public List meta() { + return meta; + } +} diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaTablesRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaTablesRequest.java new file mode 100644 index 0000000000000..23b07180a318d --- /dev/null +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaTablesRequest.java @@ -0,0 +1,115 @@ +/* + * 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 org.apache.ignite.internal.processors.odbc.jdbc; + +import org.apache.ignite.binary.BinaryObjectException; +import org.apache.ignite.internal.binary.BinaryReaderExImpl; +import org.apache.ignite.internal.binary.BinaryWriterExImpl; +import org.apache.ignite.internal.util.typedef.internal.S; + +/** + * ODBC query get tables meta request. + */ +public class JdbcMetaTablesRequest extends JdbcRequest { + /** Catalog search pattern. */ + private String catalog; + + /** Schema search pattern. */ + private String schema; + + /** Table search pattern. */ + private String table; + + /** Table types. */ + private String[] tableTypes; + + /** + * Default constructor is used for deserialization. + */ + public JdbcMetaTablesRequest() { + super(META_TABLES); + } + + /** + * @param catalog Catalog search pattern. + * @param schema Schema search pattern. + * @param table Table search pattern. + * @param tableTypes Table types. + */ + public JdbcMetaTablesRequest(String catalog, String schema, String table, String[] tableTypes) { + super(META_TABLES); + + this.catalog = catalog; + this.schema = schema; + this.table = table; + this.tableTypes = tableTypes; + } + + /** + * @return catalog search pattern. + */ + public String catalog() { + return catalog; + } + + /** + * @return Schema search pattern. + */ + public String schema() { + return schema; + } + + /** + * @return Table search pattern. + */ + public String table() { + return table; + } + + /** + * @return Table type search pattern. + */ + public String[] tableTypes() { + return tableTypes; + } + + /** {@inheritDoc} */ + @Override public void writeBinary(BinaryWriterExImpl writer) throws BinaryObjectException { + super.writeBinary(writer); + + writer.writeString(catalog); + writer.writeString(schema); + writer.writeString(table); + writer.writeStringArray(tableTypes); + } + + /** {@inheritDoc} */ + @Override public void readBinary(BinaryReaderExImpl reader) throws BinaryObjectException { + super.readBinary(reader); + + this.catalog = reader.readString(); + this.schema = reader.readString(); + this.table = reader.readString(); + this.tableTypes = reader.readStringArray(); + } + + /** {@inheritDoc} */ + @Override public String toString() { + return S.toString(JdbcMetaTablesRequest.class, this); + } +} \ No newline at end of file diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaTablesResult.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaTablesResult.java new file mode 100644 index 0000000000000..4604604cf5967 --- /dev/null +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaTablesResult.java @@ -0,0 +1,91 @@ +/* + * 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 org.apache.ignite.internal.processors.odbc.jdbc; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import org.apache.ignite.binary.BinaryObjectException; +import org.apache.ignite.internal.binary.BinaryReaderExImpl; +import org.apache.ignite.internal.binary.BinaryWriterExImpl; +import org.apache.ignite.internal.util.typedef.F; + +/** + * Query get columns meta result. + */ +public class JdbcMetaTablesResult extends JdbcResult { + /** Query result rows. */ + private List meta; + + /** + * Default constructor is used for deserialization. + */ + public JdbcMetaTablesResult() { + super(META_TABLES); + } + + /** + * @param meta Column metadata. + */ + public JdbcMetaTablesResult(List meta) { + super(META_TABLES); + this.meta = meta; + } + + /** {@inheritDoc} */ + @Override public void writeBinary(BinaryWriterExImpl writer) throws BinaryObjectException { + super.writeBinary(writer); + + if (F.isEmpty(meta)) + writer.writeInt(0); + else { + writer.writeInt(meta.size()); + + for(JdbcTableMeta m : meta) + m.writeBinary(writer); + } + } + + /** {@inheritDoc} */ + @Override public void readBinary(BinaryReaderExImpl reader) throws BinaryObjectException { + super.readBinary(reader); + + int size = reader.readInt(); + + if (size == 0) + meta = Collections.emptyList(); + else { + meta = new ArrayList<>(size); + + for (int i = 0; i < size; ++i) { + JdbcTableMeta m = new JdbcTableMeta(); + + m.readBinary(reader); + + meta.add(m); + } + } + } + + /** + * @return Query result rows. + */ + public List meta() { + return meta; + } +} diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcParamMeta.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcParamMeta.java new file mode 100644 index 0000000000000..2f47b140735cd --- /dev/null +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcParamMeta.java @@ -0,0 +1,105 @@ +/* + * 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 org.apache.ignite.internal.processors.odbc.jdbc; + +import java.sql.ParameterMetaData; +import java.sql.SQLException; +import org.apache.ignite.binary.BinaryObjectException; +import org.apache.ignite.cache.QueryIndexType; +import org.apache.ignite.internal.binary.BinaryReaderExImpl; +import org.apache.ignite.internal.binary.BinaryWriterExImpl; +import org.apache.ignite.internal.processors.query.GridQueryIndexDescriptor; + +/** + * JDBC parameter metadata + * + * {@see java.sql.ParameterMetaData}. + */ +public class JdbcParamMeta implements JdbcRawBinarylizable { + /** Null value is allow for the param. */ + private int isNullable; + + /** Signed. */ + private boolean signed; + + /** Precision. */ + private int precision; + + /** Scale. */ + private int scale; + + /** SQL type. */ + private int type; + + /** SQL type. */ + private String typeName; + + /** SQL type. */ + private String typeClass; + + /** Mode. */ + private int mode; + + + /** + * Default constructor is used for binary serialization. + */ + public JdbcParamMeta() { + // No-op. + } + + /** + * @param meta Param metadata. + * @param order Param order. + * @throws SQLException On errror. + */ + public JdbcParamMeta(ParameterMetaData meta, int order) throws SQLException { + isNullable = meta.isNullable(order); + signed = meta.isSigned(order); + precision = meta.getPrecision(order); + scale = meta.getScale(order); + type = meta.getParameterType(order); + typeName = meta.getParameterTypeName(order); + typeClass = meta.getParameterClassName(order); + mode = meta.getParameterMode(order); + } + + /** {@inheritDoc} */ + @Override public void writeBinary(BinaryWriterExImpl writer) throws BinaryObjectException { + writer.writeInt(isNullable); + writer.writeBoolean(signed); + writer.writeInt(precision); + writer.writeInt(scale); + writer.writeInt(type); + writer.writeString(typeName); + writer.writeString(typeClass); + writer.writeInt(mode); + } + + /** {@inheritDoc} */ + @Override public void readBinary(BinaryReaderExImpl reader) throws BinaryObjectException { + isNullable = reader.readInt(); + signed = reader.readBoolean(); + precision = reader.readInt(); + scale = reader.readInt(); + type = reader.readInt(); + typeName = reader.readString(); + typeClass = reader.readString(); + mode = reader.readInt(); + } +} diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcRequest.java index d6f8fd32bb376..0fdc3152ae0bd 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcRequest.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcRequest.java @@ -39,6 +39,18 @@ public class JdbcRequest extends SqlListenerRequest implements JdbcRawBinaryliza /** Get columns meta query. */ public static final byte QRY_META = 5; + /** Get columns meta query. */ + public static final byte META_TABLES = 6; + + /** Get columns meta query. */ + public static final byte META_COLUMNS = 7; + + /** Get columns meta query. */ + public static final byte META_INDEXES = 8; + + /** Get columns meta query. */ + public static final byte META_PARAMS = 9; + /** Request type. */ private byte type; @@ -97,6 +109,26 @@ public static JdbcRequest readRequest(BinaryReaderExImpl reader) throws BinaryOb break; + case META_TABLES: + req = new JdbcMetaTablesRequest(); + + break; + + case META_COLUMNS: + req = new JdbcMetaColumnsRequest(); + + break; + + case META_INDEXES: + req = new JdbcMetaIndexesRequest(); + + break; + + case META_PARAMS: + req = new JdbcMetaParamsRequest(); + + break; + default: throw new IgniteException("Unknown SQL listener request ID: [request ID=" + reqType + ']'); } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcRequestHandler.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcRequestHandler.java index b319293090996..d214ac239f5d7 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcRequestHandler.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcRequestHandler.java @@ -17,15 +17,28 @@ package org.apache.ignite.internal.processors.odbc.jdbc; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Map; import org.apache.ignite.IgniteCache; import org.apache.ignite.IgniteLogger; import org.apache.ignite.cache.query.SqlFieldsQuery; import org.apache.ignite.internal.GridKernalContext; import org.apache.ignite.internal.processors.cache.QueryCursorImpl; +import org.apache.ignite.internal.processors.odbc.OdbcUtils; import org.apache.ignite.internal.processors.odbc.SqlListenerRequest; import org.apache.ignite.internal.processors.odbc.SqlListenerRequestHandler; import org.apache.ignite.internal.processors.odbc.SqlListenerResponse; +import org.apache.ignite.internal.processors.odbc.odbc.OdbcColumnMeta; +import org.apache.ignite.internal.processors.odbc.odbc.OdbcQueryGetColumnsMetaRequest; +import org.apache.ignite.internal.processors.odbc.odbc.OdbcQueryGetColumnsMetaResult; +import org.apache.ignite.internal.processors.odbc.odbc.OdbcQueryGetTablesMetaRequest; +import org.apache.ignite.internal.processors.odbc.odbc.OdbcQueryGetTablesMetaResult; +import org.apache.ignite.internal.processors.odbc.odbc.OdbcResponse; +import org.apache.ignite.internal.processors.odbc.odbc.OdbcTableMeta; +import org.apache.ignite.internal.processors.query.GridQueryTypeDescriptor; import org.apache.ignite.internal.util.GridSpinBusyLock; +import org.apache.ignite.internal.util.typedef.F; import org.apache.ignite.internal.util.typedef.internal.S; import org.apache.ignite.internal.util.typedef.internal.U; @@ -33,6 +46,10 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.atomic.AtomicLong; +import static org.apache.ignite.internal.processors.odbc.jdbc.JdbcRequest.META_COLUMNS; +import static org.apache.ignite.internal.processors.odbc.jdbc.JdbcRequest.META_INDEXES; +import static org.apache.ignite.internal.processors.odbc.jdbc.JdbcRequest.META_PARAMS; +import static org.apache.ignite.internal.processors.odbc.jdbc.JdbcRequest.META_TABLES; import static org.apache.ignite.internal.processors.odbc.jdbc.JdbcRequest.QRY_CLOSE; import static org.apache.ignite.internal.processors.odbc.jdbc.JdbcRequest.QRY_EXEC; import static org.apache.ignite.internal.processors.odbc.jdbc.JdbcRequest.QRY_FETCH; @@ -111,6 +128,18 @@ public JdbcRequestHandler(GridKernalContext ctx, GridSpinBusyLock busyLock, int case QRY_META: return getQueryMeta((JdbcQueryMetadataRequest)req); + + case META_TABLES: + return getTablesMeta((JdbcMetaTablesRequest)req); + + case META_COLUMNS: + return getColumnsMeta((JdbcMetaColumnsRequest)req); + + case META_INDEXES: + return getIndexesMeta((JdbcMetaIndexesRequest)req); + + case META_PARAMS: + return getParamsMeta((JdbcMetaParamsRequest)req); } return new JdbcResponse(SqlListenerResponse.STATUS_FAILED, "Unsupported JDBC request [req=" + req + ']'); @@ -282,4 +311,143 @@ private JdbcResponse getQueryMeta(JdbcQueryMetadataRequest req) { return new JdbcResponse(SqlListenerResponse.STATUS_FAILED, e.toString()); } } + + /** + * @param req Get tables metadata request. + * @return Response. + */ + private JdbcResponse getTablesMeta(JdbcMetaTablesRequest req) { + try { + List meta = new ArrayList<>(); + + String realSchema = req.schema(); + + for (String cacheName : ctx.cache().cacheNames()) + { + if (!matches(cacheName, realSchema)) + continue; + + Collection tablesMeta = ctx.query().types(cacheName); + + for (GridQueryTypeDescriptor table : tablesMeta) { + if (!matches(table.name(), req.table())) + continue; + + boolean tblTypeMatch = false; + + if (req.tableTypes() == null) + tblTypeMatch = true; + else { + for (String type : req.tableTypes()) { + if (matches("TABLE", type)) { + tblTypeMatch = true; + + break; + } + } + } + + if (tblTypeMatch) { + JdbcTableMeta tableMeta = new JdbcTableMeta(null, cacheName, table.name(), "TABLE"); + + if (!meta.contains(tableMeta)) + meta.add(tableMeta); + } + } + } + + JdbcMetaTablesResult res = new JdbcMetaTablesResult(meta); + + return new JdbcResponse(res); + } + catch (Exception e) { + U.error(log, "Failed to get tables metadata [reqId=" + req.requestId() + ", req=" + req + ']', e); + + return new JdbcResponse(SqlListenerResponse.STATUS_FAILED, e.toString()); + } + } + + /** + * {@link OdbcQueryGetColumnsMetaRequest} command handler. + * + * @param req Get columns metadata request. + * @return Response. + */ + private JdbcResponse getColumnsMeta(JdbcMetaColumnsRequest req) { + try { + String cacheName; + String tableName; + + if (req.tableName().contains(".")) { + // Parsing two-part table name. + String[] parts = req.tableName().split("\\."); + + cacheName = parts[0]; + + tableName = parts[1]; + } + else { + cacheName = req.cacheName(); + + tableName = req.tableName(); + } + + Collection tablesMeta = ctx.query().types(cacheName); + + List meta = new ArrayList<>(); + + for (GridQueryTypeDescriptor table : tablesMeta) { + if (!matches(table.name(), tableName)) + continue; + + for (Map.Entry> field : table.fields().entrySet()) { + if (!matches(field.getKey(), req.columnName())) + continue; + + JdbcColumnMeta columnMeta = new JdbcColumnMeta(req.cacheName(), table.name(), + field.getKey(), field.getValue()); + + if (!meta.contains(columnMeta)) + meta.add(columnMeta); + } + } + + JdbcMetaColumnsResult res = new JdbcMetaColumnsResult(meta); + + return new JdbcResponse(res); + } + catch (Exception e) { + U.error(log, "Failed to get columns metadata [reqId=" + req.requestId() + ", req=" + req + ']', e); + + return new JdbcResponse(SqlListenerResponse.STATUS_FAILED, e.toString()); + } + } + + /** + * @param req Request. + * @return Response. + */ + private SqlListenerResponse getIndexesMeta(JdbcMetaIndexesRequest req) { + return null; + } + + /** + * @param req Request. + * @return Response. + */ + private SqlListenerResponse getParamsMeta(JdbcMetaParamsRequest req) { + return null; + } + + /** + * Checks whether string matches SQL pattern. + * + * @param str String. + * @param ptrn Pattern. + * @return Whether string matches pattern. + */ + private static boolean matches(String str, String ptrn) { + return str != null && (F.isEmpty(ptrn) || + str.toUpperCase().matches(ptrn.toUpperCase().replace("%", ".*").replace("_", "."))); + } } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcResult.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcResult.java index 2d7666e14f60d..7ce83be83461a 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcResult.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcResult.java @@ -33,7 +33,19 @@ public class JdbcResult implements JdbcRawBinarylizable { public static final byte QRY_FETCH = 3; /** Get columns meta query result. */ - public static final byte QRY_META = 4; + public static final byte QRY_META = 5; + + /** Get columns meta query result. */ + public static final byte META_TABLES = 6; + + /** Get columns meta query result. */ + public static final byte META_COLUMNS = 7; + + /** Get columns meta query result. */ + public static final byte META_INDEXES = 8; + + /** Get columns meta query result. */ + public static final byte META_PARAMS = 9; /** Success status. */ private byte type; @@ -70,14 +82,37 @@ public static JdbcResult readResult(BinaryReaderExImpl reader) throws BinaryObje switch(resId) { case QRY_EXEC: res = new JdbcQueryExecuteResult(); + break; case QRY_FETCH: res = new JdbcQueryFetchResult(); + break; case QRY_META: res = new JdbcQueryMetadataResult(); + + break; + + case META_TABLES: + res = new JdbcMetaTablesResult(); + + break; + + case META_COLUMNS: + res = new JdbcMetaColumnsResult(); + + break; + + case META_INDEXES: + res = new JdbcMetaIndexesResult(); + + break; + + case META_PARAMS: + res = new JdbcMetaParamsResult(); + break; default: diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcTableMeta.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcTableMeta.java new file mode 100644 index 0000000000000..4c40afb7938b5 --- /dev/null +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcTableMeta.java @@ -0,0 +1,103 @@ +/* + * 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 org.apache.ignite.internal.processors.odbc.jdbc; + +import org.apache.ignite.binary.BinaryObjectException; +import org.apache.ignite.internal.binary.BinaryReaderExImpl; +import org.apache.ignite.internal.binary.BinaryWriterExImpl; +import org.apache.ignite.internal.processors.odbc.OdbcUtils; + +/** + * ODBC table-related metadata. + */ +public class JdbcTableMeta implements JdbcRawBinarylizable { + /** Catalog name. */ + private String catalog; + + /** Schema name. */ + private String schema; + + /** Table name. */ + private String table; + + /** Table type. */ + private String tableType; + + /** + * Default constructor is used for deserialization. + */ + public JdbcTableMeta() { + } + + /** + * @param catalog Catalog name. + * @param schema Schema name. + * @param table Table name. + * @param tableType Table type. + */ + public JdbcTableMeta(String catalog, String schema, String table, String tableType) { + this.catalog = catalog; + this.schema = OdbcUtils.addQuotationMarksIfNeeded(schema); + this.table = table; + this.tableType = tableType; + } + + /** + * @return Table's catalog. + */ + public String catalog() { + return catalog; + } + + /** + * @return Schema name. + */ + public String schema() { + return schema; + } + + /** + * @return Table name. + */ + public String table() { + return table; + } + + /** + * @return Table type. + */ + public String tableType() { + return tableType; + } + + /** {@inheritDoc} */ + @Override public void writeBinary(BinaryWriterExImpl writer) throws BinaryObjectException { + writer.writeString(catalog); + writer.writeString(schema); + writer.writeString(table); + writer.writeString(tableType); + } + + /** {@inheritDoc} */ + @Override public void readBinary(BinaryReaderExImpl reader) throws BinaryObjectException { + catalog = reader.readString(); + schema = reader.readString(); + table = reader.readString(); + tableType = reader.readString(); + } +} From 06edb3ea591382aae22b73e0012edb166c022b55 Mon Sep 17 00:00:00 2001 From: tledkov-gridgain Date: Fri, 2 Jun 2017 18:51:27 +0300 Subject: [PATCH 02/32] IGNITE-5233: save the progress --- .../jdbc/thin/JdbcThinConnection.java | 5 +- .../jdbc/thin/JdbcThinParameterMetaData.java | 97 +++++++++++++++++++ .../jdbc/thin/JdbcThinPreparedStatement.java | 19 +++- .../internal/jdbc/thin/JdbcThinStatement.java | 2 +- .../internal/jdbc/thin/JdbcThinTcpIo.java | 16 ++- .../processors/odbc/jdbc/JdbcParamMeta.java | 56 +++++++++++ 6 files changed, 189 insertions(+), 6 deletions(-) create mode 100644 modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinParameterMetaData.java diff --git a/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinConnection.java b/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinConnection.java index 2396d2efe3458..261fd9f6422ba 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinConnection.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinConnection.java @@ -55,7 +55,7 @@ public class JdbcThinConnection implements Connection { /** Logger. */ private static final Logger LOG = Logger.getLogger(JdbcThinConnection.class.getName()); - /** Conection URL. */ + /** Connection URL. */ private String url; /** Schema name. */ @@ -91,6 +91,7 @@ public JdbcThinConnection(String url, Properties props) throws SQLException { assert props != null; this.url = url; + holdability = HOLD_CURSORS_OVER_COMMIT; autoCommit = true; txIsolation = Connection.TRANSACTION_NONE; @@ -272,7 +273,7 @@ private void checkCursorOptions(int resSetType, int resSetConcurrency, @Override public DatabaseMetaData getMetaData() throws SQLException { ensureNotClosed(); - return null; + return new JdbcThinDatabaseMetadata(this); } /** {@inheritDoc} */ diff --git a/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinParameterMetaData.java b/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinParameterMetaData.java new file mode 100644 index 0000000000000..15b2a26799544 --- /dev/null +++ b/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinParameterMetaData.java @@ -0,0 +1,97 @@ +/* + * 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 org.apache.ignite.internal.jdbc.thin; + +import java.sql.ParameterMetaData; +import java.sql.PreparedStatement; +import java.sql.SQLException; +import java.util.List; +import org.apache.ignite.internal.processors.odbc.jdbc.JdbcParamMeta; + +/** + * JDBC prepared statement implementation. + */ +public class JdbcThinParameterMetaData implements ParameterMetaData { + /** Meta. */ + private final List meta; + + /** + * @param meta Parameters metadata. + */ + public JdbcThinParameterMetaData(List meta) { + this.meta = meta; + } + + /** {@inheritDoc} */ + @Override public int getParameterCount() throws SQLException { + return meta.size(); + } + + /** {@inheritDoc} */ + @Override public int isNullable(int param) throws SQLException { + return meta.get(param -1).isNullable(); + } + + /** {@inheritDoc} */ + @Override public boolean isSigned(int param) throws SQLException { + return meta.get(param -1).isSigned(); + } + + /** {@inheritDoc} */ + @Override public int getPrecision(int param) throws SQLException { + return meta.get(param -1).precision(); + } + + /** {@inheritDoc} */ + @Override public int getScale(int param) throws SQLException { + return meta.get(param -1).scale(); + } + + /** {@inheritDoc} */ + @Override public int getParameterType(int param) throws SQLException { + return meta.get(param -1).type(); + } + + /** {@inheritDoc} */ + @Override public String getParameterTypeName(int param) throws SQLException { + return meta.get(param -1).typeName(); + } + + /** {@inheritDoc} */ + @Override public String getParameterClassName(int param) throws SQLException { + return meta.get(param -1).typeClass(); + } + + /** {@inheritDoc} */ + @Override public int getParameterMode(int param) throws SQLException { + return meta.get(param -1).mode(); + } + + /** {@inheritDoc} */ + @Override public T unwrap(Class iface) throws SQLException { + if (!isWrapperFor(iface)) + throw new SQLException("Parameters metadata is not a wrapper for " + iface.getName()); + + return (T)this; + } + + /** {@inheritDoc} */ + @Override public boolean isWrapperFor(Class iface) throws SQLException { + return iface != null && iface.isAssignableFrom(JdbcThinParameterMetaData.class); + } +} \ No newline at end of file diff --git a/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinPreparedStatement.java b/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinPreparedStatement.java index 49a78b6ec743e..8a1ab6b29ca1c 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinPreparedStatement.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinPreparedStatement.java @@ -17,6 +17,7 @@ package org.apache.ignite.internal.jdbc.thin; +import java.io.IOException; import java.io.InputStream; import java.io.Reader; import java.math.BigDecimal; @@ -39,7 +40,9 @@ import java.sql.Timestamp; import java.util.ArrayList; import java.util.Calendar; +import org.apache.ignite.IgniteCheckedException; import org.apache.ignite.internal.processors.odbc.SqlListenerUtils; +import org.apache.ignite.internal.processors.odbc.jdbc.JdbcMetaParamsResult; /** * JDBC prepared statement implementation. @@ -310,8 +313,22 @@ private void executeWithArguments() throws SQLException { /** {@inheritDoc} */ @Override public ParameterMetaData getParameterMetaData() throws SQLException { ensureNotClosed(); + try { + if (conn.isClosed()) + throw new SQLException("Connection is closed."); - throw new SQLFeatureNotSupportedException("Meta data for prepared statement is not supported."); + JdbcMetaParamsResult res = conn.cliIo().parametersMeta(conn.getSchema(), sql); + + return new JdbcThinParameterMetaData(res.meta()); + } + catch (IOException e) { + conn.close(); + + throw new SQLException("Failed to query Ignite.", e); + } + catch (IgniteCheckedException e) { + throw new SQLException("Failed to query Ignite.", e); + } } /** {@inheritDoc} */ diff --git a/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinStatement.java b/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinStatement.java index 91b8b06bf5671..fc56280190a77 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinStatement.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinStatement.java @@ -42,7 +42,7 @@ public class JdbcThinStatement implements Statement { private static final int DFLT_PAGE_SIZE = SqlQuery.DFLT_PAGE_SIZE; /** Ignite endpoint and I/O protocol implementation. */ - private JdbcThinConnection conn; + protected JdbcThinConnection conn; /** Closed flag. */ private boolean closed; diff --git a/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinTcpIo.java b/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinTcpIo.java index d21f80daf0a60..654130581f840 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinTcpIo.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinTcpIo.java @@ -35,6 +35,8 @@ import org.apache.ignite.internal.processors.odbc.jdbc.JdbcMetaColumnsResult; import org.apache.ignite.internal.processors.odbc.jdbc.JdbcMetaIndexesRequest; import org.apache.ignite.internal.processors.odbc.jdbc.JdbcMetaIndexesResult; +import org.apache.ignite.internal.processors.odbc.jdbc.JdbcMetaParamsRequest; +import org.apache.ignite.internal.processors.odbc.jdbc.JdbcMetaParamsResult; import org.apache.ignite.internal.processors.odbc.jdbc.JdbcMetaTablesRequest; import org.apache.ignite.internal.processors.odbc.jdbc.JdbcMetaTablesResult; import org.apache.ignite.internal.processors.odbc.jdbc.JdbcQueryCloseRequest; @@ -47,7 +49,6 @@ import org.apache.ignite.internal.processors.odbc.jdbc.JdbcRequest; import org.apache.ignite.internal.processors.odbc.jdbc.JdbcResponse; import org.apache.ignite.internal.processors.odbc.jdbc.JdbcResult; -import org.apache.ignite.internal.processors.odbc.jdbc.JdbcUtils; import org.apache.ignite.internal.util.ipc.IpcEndpoint; import org.apache.ignite.internal.util.ipc.IpcEndpointFactory; import org.apache.ignite.internal.util.typedef.internal.U; @@ -275,15 +276,26 @@ public JdbcMetaColumnsResult columnsMeta(String schemaPtrn, String tablePtrn, St * @param tbl Table * @param unique Is Index unique. * @param approximate Request approximate index. + * @return Result. * @throws IOException On error. * @throws IgniteCheckedException On error. - * @return Result. */ public JdbcMetaIndexesResult indexMeta(String catalog, String schema, String tbl, boolean unique, boolean approximate) throws IOException, IgniteCheckedException { return sendRequest(new JdbcMetaIndexesRequest(catalog, schema, tbl, unique, approximate), DYNAMIC_SIZE_MSG_CAP); } + /** + * @param schema Schema. + * @param sql SQL query. + * @return Result. + * @throws IOException On error. + * @throws IgniteCheckedException On error. + */ + public JdbcMetaParamsResult parametersMeta(String schema, String sql) throws IOException, IgniteCheckedException { + return sendRequest(new JdbcMetaParamsRequest(schema, sql), DYNAMIC_SIZE_MSG_CAP); + } + /** * @param req ODBC request. * @throws IOException On error. diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcParamMeta.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcParamMeta.java index 2f47b140735cd..babf6721979e9 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcParamMeta.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcParamMeta.java @@ -79,6 +79,62 @@ public JdbcParamMeta(ParameterMetaData meta, int order) throws SQLException { mode = meta.getParameterMode(order); } + /** + * @return Nullable mode. + */ + public int isNullable() { + return isNullable; + } + + /** + * @return Signed flag. + */ + public boolean isSigned() { + return signed; + } + + /** + * @return Precision. + */ + public int precision() { + return precision; + } + + /** + * @return Scale. + */ + public int scale() { + return scale; + } + + /** + * @return SQL type. + */ + public int type() { + return type; + } + + /** + * @return SQL type name. + */ + public String typeName() { + return typeName; + } + + /** + * @return Type class name. + */ + public String typeClass() { + return typeClass; + } + + /** + * @return Mode. + */ + public int mode() { + return mode; + } + /** {@inheritDoc} */ @Override public void writeBinary(BinaryWriterExImpl writer) throws BinaryObjectException { writer.writeInt(isNullable); From a50df0b490cf4972079fb90e0d0c593cf03e670c Mon Sep 17 00:00:00 2001 From: tledkov-gridgain Date: Mon, 5 Jun 2017 14:55:19 +0300 Subject: [PATCH 03/32] IGNITE-5233: index & params meta --- .../jdbc/thin/JdbcThinMetadataSelfTest.java | 66 +++++++++++++++++-- .../jdbc/thin/JdbcThinDatabaseMetadata.java | 2 +- .../processors/odbc/jdbc/JdbcColumnMeta.java | 33 +++++++++- .../processors/odbc/jdbc/JdbcIndexMeta.java | 34 +++++++++- .../odbc/jdbc/JdbcMetaColumnsRequest.java | 4 +- .../odbc/jdbc/JdbcMetaColumnsResult.java | 9 +-- .../odbc/jdbc/JdbcMetaIndexesRequest.java | 18 ++--- .../odbc/jdbc/JdbcMetaIndexesResult.java | 9 +-- .../odbc/jdbc/JdbcMetaParamsRequest.java | 6 +- .../odbc/jdbc/JdbcMetaParamsResult.java | 8 +-- .../odbc/jdbc/JdbcMetaTablesRequest.java | 4 +- .../odbc/jdbc/JdbcMetaTablesResult.java | 6 +- .../odbc/jdbc/JdbcQueryCloseRequest.java | 2 +- .../odbc/jdbc/JdbcQueryExecuteRequest.java | 2 +- .../odbc/jdbc/JdbcQueryExecuteResult.java | 4 +- .../odbc/jdbc/JdbcQueryFetchRequest.java | 2 +- .../odbc/jdbc/JdbcQueryFetchResult.java | 4 +- .../odbc/jdbc/JdbcQueryMetadataRequest.java | 16 ++--- .../odbc/jdbc/JdbcQueryMetadataResult.java | 4 +- .../odbc/jdbc/JdbcRequestHandler.java | 65 +++++++++++++++++- .../processors/odbc/jdbc/JdbcTableMeta.java | 30 ++++----- 21 files changed, 250 insertions(+), 78 deletions(-) diff --git a/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinMetadataSelfTest.java b/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinMetadataSelfTest.java index 5670786258c9b..3e8f948681d8b 100644 --- a/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinMetadataSelfTest.java +++ b/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinMetadataSelfTest.java @@ -21,9 +21,12 @@ import java.sql.Connection; import java.sql.DatabaseMetaData; import java.sql.DriverManager; +import java.sql.ParameterMetaData; +import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.Statement; +import java.sql.Types; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; @@ -33,12 +36,10 @@ import org.apache.ignite.cache.QueryEntity; import org.apache.ignite.cache.QueryIndex; import org.apache.ignite.cache.affinity.AffinityKey; -import org.apache.ignite.cache.query.annotations.QuerySqlField; import org.apache.ignite.configuration.CacheConfiguration; import org.apache.ignite.configuration.IgniteConfiguration; import org.apache.ignite.internal.binary.BinaryMarshaller; import org.apache.ignite.internal.util.typedef.F; -import org.apache.ignite.internal.util.typedef.G; import org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi; import org.apache.ignite.spi.discovery.tcp.ipfinder.TcpDiscoveryIpFinder; import org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder; @@ -327,12 +328,67 @@ public void testMetadataResultSetClose() throws Exception { /** * @throws Exception If failed. */ - public void _testIndexMetadata() throws Exception { + public void testIndexMetadata() throws Exception { try (Connection conn = DriverManager.getConnection(URL); - ResultSet tbls = conn.getMetaData().getIndexInfo(null, null, "pers", false, false)) { + ResultSet rs = conn.getMetaData().getIndexInfo(null, "pers", "Person", false, false)) { - int colCnt = tbls.getMetaData().getColumnCount(); + int cnt = 0; + + while (rs.next()) { + String idxName = rs.getString("INDEX_NAME"); + String field = rs.getString("COLUMN_NAME"); + String ascOrDesc = rs.getString("ASC_OR_DESC"); + + assert rs.getShort("TYPE") == DatabaseMetaData.tableIndexOther; + + if ("PERSON_ORGID_ASC_IDX".equals(idxName)) { + assert "ORGID".equals(field); + assert "A".equals(ascOrDesc); + } + else if ("PERSON_NAME_ASC_AGE_DESC_IDX".equals(idxName)) { + if ("NAME".equals(field)) + assert "A".equals(ascOrDesc); + else if ("AGE".equals(field)) + assert "D".equals(ascOrDesc); + else + fail("Unexpected field: " + field); + } + else + fail("Unexpected index: " + idxName); + + cnt++; + } + + assert cnt == 3; + } + catch (Exception e) { + log.error("Unexpected exception", e); + + fail(); + } + } + + /** + * @throws Exception If failed. + */ + public void testParametersMetadata() throws Exception { + try (Connection conn = DriverManager.getConnection(URL)) { + conn.setSchema("pers"); + + PreparedStatement stmt = conn.prepareStatement("select orgId from Person p where p.name > ? and p.orgId > ?"); + + ParameterMetaData meta = stmt.getParameterMetaData(); + + assert meta != null; + + assert meta.getParameterCount() == 2; + + assert meta.getParameterType(1) == Types.VARCHAR; + assert meta.isNullable(1) == ParameterMetaData.parameterNullableUnknown; + assert meta.getPrecision(1) == Integer.MAX_VALUE; + assert meta.getParameterType(2) == Types.INTEGER; + assert meta.isNullable(2) == ParameterMetaData.parameterNullableUnknown; } catch (Exception e) { log.error("Unexpected exception", e); diff --git a/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinDatabaseMetadata.java b/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinDatabaseMetadata.java index a5a421e9f8cb2..21ccb83e86993 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinDatabaseMetadata.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinDatabaseMetadata.java @@ -979,7 +979,7 @@ private List> indexRow(String schema, String tbl, JdbcIndexMeta idx row.add(true); // non unique row.add(null); // index qualifier (index catalog) row.add(upperCase(idxMeta.name())); - row.add((int)tableIndexOther); // type + row.add((short)tableIndexOther); // type row.add((Integer)i); // field ordinal position in index row.add(upperCase(idxMeta.fields()[i])); row.add(idxMeta.fieldsAsc()[i] ? "A" : "D"); diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcColumnMeta.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcColumnMeta.java index de144b278310f..b80b44e4933fe 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcColumnMeta.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcColumnMeta.java @@ -23,7 +23,7 @@ import org.apache.ignite.internal.processors.query.GridQueryFieldMetadata; /** - * SQL listener column metadata. + * JDBC column metadata. */ public class JdbcColumnMeta implements JdbcRawBinarylizable { /** Cache name. */ @@ -47,13 +47,13 @@ public class JdbcColumnMeta implements JdbcRawBinarylizable { /** * Default constructor is used for serialization. */ - public JdbcColumnMeta() { + JdbcColumnMeta() { } /** * @param info Field metadata. */ - public JdbcColumnMeta(GridQueryFieldMetadata info) { + JdbcColumnMeta(GridQueryFieldMetadata info) { this.schemaName = info.schemaName(); this.tableName = info.typeName(); this.columnName = info.fieldName(); @@ -144,4 +144,31 @@ public String dataTypeClass() { dataTypeName = reader.readString(); dataTypeClass = reader.readString(); } + + /** {@inheritDoc} */ + @Override public boolean equals(Object o) { + if (this == o) + return true; + + if (o == null || getClass() != o.getClass()) + return false; + + JdbcColumnMeta meta = (JdbcColumnMeta)o; + + if (schemaName != null ? !schemaName.equals(meta.schemaName) : meta.schemaName != null) + return false; + + if (tableName != null ? !tableName.equals(meta.tableName) : meta.tableName != null) + return false; + + return columnName.equals(meta.columnName); + } + + /** {@inheritDoc} */ + @Override public int hashCode() { + int result = schemaName != null ? schemaName.hashCode() : 0; + result = 31 * result + (tableName != null ? tableName.hashCode() : 0); + result = 31 * result + columnName.hashCode(); + return result; + } } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcIndexMeta.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcIndexMeta.java index 8936479c33274..6d53482acb343 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcIndexMeta.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcIndexMeta.java @@ -21,10 +21,11 @@ import org.apache.ignite.cache.QueryIndexType; import org.apache.ignite.internal.binary.BinaryReaderExImpl; import org.apache.ignite.internal.binary.BinaryWriterExImpl; +import org.apache.ignite.internal.binary.GridBinaryMarshaller; import org.apache.ignite.internal.processors.query.GridQueryIndexDescriptor; /** - * SQL listener index metadata. + * JDBC index metadata. */ public class JdbcIndexMeta implements JdbcRawBinarylizable { /** Index name. */ @@ -45,17 +46,26 @@ public class JdbcIndexMeta implements JdbcRawBinarylizable { /** * Default constructor is used for binary serialization. */ - public JdbcIndexMeta() { + JdbcIndexMeta() { // No-op. } /** * @param idx Index info. */ - public JdbcIndexMeta(GridQueryIndexDescriptor idx) { + JdbcIndexMeta(GridQueryIndexDescriptor idx) { + assert idx != null; + assert idx.fields() != null; + name = idx.name(); type = idx.type(); inlineSize = idx.inlineSize(); + fields = idx.fields().toArray(new String[idx.fields().size()]); + + fieldsAsc = new boolean[fields.length]; + + for (int i = 0; i < fields.length; ++i) + fieldsAsc[i] = !idx.descending(fields[i]); } /** @@ -113,4 +123,22 @@ public boolean[] fieldsAsc() { assert fields.length == fieldsAsc.length : "Fields info is broken: [fields.length=" + fields.length + ", fieldsAsc.length=" + fieldsAsc.length + ']'; } + + /** {@inheritDoc} */ + @Override public boolean equals(Object o) { + if (this == o) + return true; + + if (o == null || getClass() != o.getClass()) + return false; + + JdbcIndexMeta meta = (JdbcIndexMeta)o; + + return name.equals(meta.name); + } + + /** {@inheritDoc} */ + @Override public int hashCode() { + return name.hashCode(); + } } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaColumnsRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaColumnsRequest.java index 768b2f8ae40a7..dd5c4b1d54923 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaColumnsRequest.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaColumnsRequest.java @@ -24,7 +24,7 @@ import org.jetbrains.annotations.Nullable; /** - * ODBC query get columns meta request. + * JDBC get columns metadata request. */ public class JdbcMetaColumnsRequest extends JdbcRequest { /** Cache name. */ @@ -39,7 +39,7 @@ public class JdbcMetaColumnsRequest extends JdbcRequest { /** * Default constructor is used for deserialization. */ - public JdbcMetaColumnsRequest() { + JdbcMetaColumnsRequest() { super(META_COLUMNS); } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaColumnsResult.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaColumnsResult.java index dd788a6212246..af55a4f946f66 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaColumnsResult.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaColumnsResult.java @@ -18,6 +18,7 @@ package org.apache.ignite.internal.processors.odbc.jdbc; import java.util.ArrayList; +import java.util.Collection; import java.util.Collections; import java.util.List; import org.apache.ignite.binary.BinaryObjectException; @@ -26,7 +27,7 @@ import org.apache.ignite.internal.util.typedef.F; /** - * Query get columns meta result. + * JDBC columns metadata result. */ public class JdbcMetaColumnsResult extends JdbcResult { /** Query result rows. */ @@ -35,16 +36,16 @@ public class JdbcMetaColumnsResult extends JdbcResult { /** * Default constructor is used for deserialization. */ - public JdbcMetaColumnsResult() { + JdbcMetaColumnsResult() { super(META_COLUMNS); } /** * @param meta Column metadata. */ - public JdbcMetaColumnsResult(List meta) { + JdbcMetaColumnsResult(Collection meta) { super(META_COLUMNS); - this.meta = meta; + this.meta = new ArrayList<>(meta); } /** diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaIndexesRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaIndexesRequest.java index 225e6131b335e..531af2c56a196 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaIndexesRequest.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaIndexesRequest.java @@ -24,7 +24,7 @@ import org.jetbrains.annotations.Nullable; /** - * ODBC query get columns meta request. + * JDBC indexes metadata request. */ public class JdbcMetaIndexesRequest extends JdbcRequest { /** Cache name. */ @@ -34,7 +34,7 @@ public class JdbcMetaIndexesRequest extends JdbcRequest { private String schema; /** Table name. */ - private String tableName; + private String tblName; /** When true, return only indices for unique values. */ private boolean unique; @@ -45,23 +45,23 @@ public class JdbcMetaIndexesRequest extends JdbcRequest { /** * Default constructor is used for deserialization. */ - public JdbcMetaIndexesRequest() { + JdbcMetaIndexesRequest() { super(META_INDEXES); } /** * @param catalog Catalog name. * @param schema Cache name. - * @param tableName Table name. + * @param tblName Table name. * @param unique {@code true} when only indices for unique values are requested. * @param approximate {@code true} when approximate or out of data values indexes are allowed in results. */ - public JdbcMetaIndexesRequest(String catalog, String schema, String tableName, boolean unique, boolean approximate) { + public JdbcMetaIndexesRequest(String catalog, String schema, String tblName, boolean unique, boolean approximate) { super(META_INDEXES); this.catalog = catalog; this.schema = schema; - this.tableName = tableName; + this.tblName = tblName; this.unique = unique; this.approximate = approximate; } @@ -84,7 +84,7 @@ public JdbcMetaIndexesRequest(String catalog, String schema, String tableName, b * @return Table name. */ public String tableName() { - return tableName; + return tblName; } /** @@ -107,7 +107,7 @@ public boolean approximate() { writer.writeString(catalog); writer.writeString(schema); - writer.writeString(tableName); + writer.writeString(tblName); writer.writeBoolean(unique); writer.writeBoolean(approximate); } @@ -118,7 +118,7 @@ public boolean approximate() { catalog = reader.readString(); schema = reader.readString(); - tableName = reader.readString(); + tblName = reader.readString(); unique = reader.readBoolean(); approximate = reader.readBoolean(); } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaIndexesResult.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaIndexesResult.java index 75ee1b559fc10..e070441c1d32a 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaIndexesResult.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaIndexesResult.java @@ -18,6 +18,7 @@ package org.apache.ignite.internal.processors.odbc.jdbc; import java.util.ArrayList; +import java.util.Collection; import java.util.Collections; import java.util.List; import org.apache.ignite.binary.BinaryObjectException; @@ -26,7 +27,7 @@ import org.apache.ignite.internal.util.typedef.F; /** - * Query get indexes meta result. + * JDBC indexes metadata result. */ public class JdbcMetaIndexesResult extends JdbcResult { /** Query result rows. */ @@ -35,7 +36,7 @@ public class JdbcMetaIndexesResult extends JdbcResult { /** * Default constructor is used for deserialization. */ - public JdbcMetaIndexesResult() { + JdbcMetaIndexesResult() { super(META_INDEXES); this.meta = meta; } @@ -43,9 +44,9 @@ public JdbcMetaIndexesResult() { /** * @param meta Column metadata. */ - public JdbcMetaIndexesResult(List meta) { + JdbcMetaIndexesResult(Collection meta) { super(META_INDEXES); - this.meta = meta; + this.meta = new ArrayList<>(meta); } /** diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaParamsRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaParamsRequest.java index bdcd8b9c1b6d0..86cf80ae9fa2e 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaParamsRequest.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaParamsRequest.java @@ -23,7 +23,7 @@ import org.apache.ignite.internal.util.typedef.internal.S; /** - * ODBC query get params meta request. + * JDBC SQL query parameters metadata request. */ public class JdbcMetaParamsRequest extends JdbcRequest { /** Cache. */ @@ -35,7 +35,7 @@ public class JdbcMetaParamsRequest extends JdbcRequest { /** * Default constructor is used for deserialization. */ - public JdbcMetaParamsRequest() { + JdbcMetaParamsRequest() { super(META_PARAMS); } @@ -53,7 +53,7 @@ public JdbcMetaParamsRequest(String schemaName, String sql) { /** * @return SQL Query. */ - public String query() { + public String sql() { return sql; } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaParamsResult.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaParamsResult.java index c450848cd4f62..d2317bb953343 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaParamsResult.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaParamsResult.java @@ -26,23 +26,23 @@ import org.apache.ignite.internal.util.typedef.F; /** - * Query get columns meta result. + * JDBC SQL query parameters metadata result. */ public class JdbcMetaParamsResult extends JdbcResult { - /** Query result rows. */ + /** Parameters meta results. */ private List meta; /** * Default constructor is used for deserialization. */ - public JdbcMetaParamsResult() { + JdbcMetaParamsResult() { super(META_PARAMS); } /** * @param meta Column metadata. */ - public JdbcMetaParamsResult(List meta) { + JdbcMetaParamsResult(List meta) { super(META_PARAMS); this.meta = meta; } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaTablesRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaTablesRequest.java index 23b07180a318d..43659229b2554 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaTablesRequest.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaTablesRequest.java @@ -23,7 +23,7 @@ import org.apache.ignite.internal.util.typedef.internal.S; /** - * ODBC query get tables meta request. + * JDBC tables metadata request. */ public class JdbcMetaTablesRequest extends JdbcRequest { /** Catalog search pattern. */ @@ -41,7 +41,7 @@ public class JdbcMetaTablesRequest extends JdbcRequest { /** * Default constructor is used for deserialization. */ - public JdbcMetaTablesRequest() { + JdbcMetaTablesRequest() { super(META_TABLES); } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaTablesResult.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaTablesResult.java index 4604604cf5967..cce3cbedf418c 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaTablesResult.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaTablesResult.java @@ -26,7 +26,7 @@ import org.apache.ignite.internal.util.typedef.F; /** - * Query get columns meta result. + * JDBC tables metadata request. */ public class JdbcMetaTablesResult extends JdbcResult { /** Query result rows. */ @@ -35,14 +35,14 @@ public class JdbcMetaTablesResult extends JdbcResult { /** * Default constructor is used for deserialization. */ - public JdbcMetaTablesResult() { + JdbcMetaTablesResult() { super(META_TABLES); } /** * @param meta Column metadata. */ - public JdbcMetaTablesResult(List meta) { + JdbcMetaTablesResult(List meta) { super(META_TABLES); this.meta = meta; } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcQueryCloseRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcQueryCloseRequest.java index 411d1e098ed84..cccc3f811b822 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcQueryCloseRequest.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcQueryCloseRequest.java @@ -31,7 +31,7 @@ public class JdbcQueryCloseRequest extends JdbcRequest { /** */ - public JdbcQueryCloseRequest() { + JdbcQueryCloseRequest() { super(QRY_CLOSE); } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcQueryExecuteRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcQueryExecuteRequest.java index f1323663b754f..79e9e574bbbef 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcQueryExecuteRequest.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcQueryExecuteRequest.java @@ -49,7 +49,7 @@ public class JdbcQueryExecuteRequest extends JdbcRequest { /** */ - public JdbcQueryExecuteRequest() { + JdbcQueryExecuteRequest() { super(QRY_EXEC); } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcQueryExecuteResult.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcQueryExecuteResult.java index a9352158abc65..54e4e5abcfc0d 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcQueryExecuteResult.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcQueryExecuteResult.java @@ -44,7 +44,7 @@ public class JdbcQueryExecuteResult extends JdbcResult { /** * Condtructor. */ - public JdbcQueryExecuteResult() { + JdbcQueryExecuteResult() { super(QRY_EXEC); } @@ -53,7 +53,7 @@ public JdbcQueryExecuteResult() { * @param items Query result rows. * @param last Flag indicates the query has no unfetched results. */ - public JdbcQueryExecuteResult(long queryId, List> items, boolean last) { + JdbcQueryExecuteResult(long queryId, List> items, boolean last) { super(QRY_EXEC); this.queryId = queryId; diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcQueryFetchRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcQueryFetchRequest.java index 2e1f551a74522..8d811c2fb3491 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcQueryFetchRequest.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcQueryFetchRequest.java @@ -35,7 +35,7 @@ public class JdbcQueryFetchRequest extends JdbcRequest { /** * Constructor. */ - public JdbcQueryFetchRequest() { + JdbcQueryFetchRequest() { super(QRY_FETCH); } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcQueryFetchResult.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcQueryFetchResult.java index 6735c6bdd0c4b..ea082b9afe200 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcQueryFetchResult.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcQueryFetchResult.java @@ -35,7 +35,7 @@ public class JdbcQueryFetchResult extends JdbcResult { /** * Default constructor is used for deserialization. */ - public JdbcQueryFetchResult() { + JdbcQueryFetchResult() { super(QRY_FETCH); } @@ -43,7 +43,7 @@ public JdbcQueryFetchResult() { * @param items Query result rows. * @param last Flag indicating the query has no unfetched results. */ - public JdbcQueryFetchResult(List> items, boolean last){ + JdbcQueryFetchResult(List> items, boolean last){ super(QRY_FETCH); this.items = items; diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcQueryMetadataRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcQueryMetadataRequest.java index d14c9dffd49b2..b428480bc7d43 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcQueryMetadataRequest.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcQueryMetadataRequest.java @@ -27,43 +27,43 @@ */ public class JdbcQueryMetadataRequest extends JdbcRequest { /** Query ID. */ - private long queryId; + private long qryId; /** * Constructor. */ - public JdbcQueryMetadataRequest() { + JdbcQueryMetadataRequest() { super(QRY_META); } /** - * @param queryId Query ID. + * @param qryId Query ID. */ - public JdbcQueryMetadataRequest(long queryId) { + public JdbcQueryMetadataRequest(long qryId) { super(QRY_META); - this.queryId = queryId; + this.qryId = qryId; } /** * @return Query ID. */ public long queryId() { - return queryId; + return qryId; } /** {@inheritDoc} */ @Override public void writeBinary(BinaryWriterExImpl writer) throws BinaryObjectException { super.writeBinary(writer); - writer.writeLong(queryId); + writer.writeLong(qryId); } /** {@inheritDoc} */ @Override public void readBinary(BinaryReaderExImpl reader) throws BinaryObjectException { super.readBinary(reader); - queryId = reader.readLong(); + qryId = reader.readLong(); } /** {@inheritDoc} */ diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcQueryMetadataResult.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcQueryMetadataResult.java index cc193e391530e..a459936c27e15 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcQueryMetadataResult.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcQueryMetadataResult.java @@ -35,7 +35,7 @@ public class JdbcQueryMetadataResult extends JdbcResult { /** * Default constructor is used for deserialization. */ - public JdbcQueryMetadataResult() { + JdbcQueryMetadataResult() { super(QRY_META); } @@ -43,7 +43,7 @@ public JdbcQueryMetadataResult() { * @param queryId Query ID. * @param meta Query metadata. */ - public JdbcQueryMetadataResult(long queryId, List meta){ + JdbcQueryMetadataResult(long queryId, List meta){ super(QRY_META); this.meta = meta; diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcRequestHandler.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcRequestHandler.java index d214ac239f5d7..c531c9040d435 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcRequestHandler.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcRequestHandler.java @@ -17,8 +17,11 @@ package org.apache.ignite.internal.processors.odbc.jdbc; +import java.sql.ParameterMetaData; +import java.sql.PreparedStatement; import java.util.ArrayList; import java.util.Collection; +import java.util.HashSet; import java.util.Map; import org.apache.ignite.IgniteCache; import org.apache.ignite.IgniteLogger; @@ -36,6 +39,7 @@ import org.apache.ignite.internal.processors.odbc.odbc.OdbcQueryGetTablesMetaResult; import org.apache.ignite.internal.processors.odbc.odbc.OdbcResponse; import org.apache.ignite.internal.processors.odbc.odbc.OdbcTableMeta; +import org.apache.ignite.internal.processors.query.GridQueryIndexDescriptor; import org.apache.ignite.internal.processors.query.GridQueryTypeDescriptor; import org.apache.ignite.internal.util.GridSpinBusyLock; import org.apache.ignite.internal.util.typedef.F; @@ -394,7 +398,7 @@ private JdbcResponse getColumnsMeta(JdbcMetaColumnsRequest req) { Collection tablesMeta = ctx.query().types(cacheName); - List meta = new ArrayList<>(); + Collection meta = new HashSet<>(); for (GridQueryTypeDescriptor table : tablesMeta) { if (!matches(table.name(), tableName)) @@ -428,7 +432,43 @@ private JdbcResponse getColumnsMeta(JdbcMetaColumnsRequest req) { * @return Response. */ private SqlListenerResponse getIndexesMeta(JdbcMetaIndexesRequest req) { - return null; + try { + String cacheName; + String tableName; + + if (req.tableName().contains(".")) { + // Parsing two-part table name. + String[] parts = req.tableName().split("\\."); + + cacheName = parts[0]; + + tableName = parts[1]; + } + else { + cacheName = req.schema(); + + tableName = req.tableName(); + } + + Collection tablesMeta = ctx.query().types(cacheName); + + Collection meta = new HashSet<>(); + + for (GridQueryTypeDescriptor table : tablesMeta) { + if (!matches(table.name(), tableName)) + continue; + + for (GridQueryIndexDescriptor idxDesc : table.indexes().values()) + meta.add(new JdbcIndexMeta(idxDesc)); + } + + return new JdbcResponse(new JdbcMetaIndexesResult(meta)); + } + catch (Exception e) { + U.error(log, "Failed to get parameters metadata [reqId=" + req.requestId() + ", req=" + req + ']', e); + + return new JdbcResponse(SqlListenerResponse.STATUS_FAILED, e.toString()); + } } /** @@ -436,7 +476,26 @@ private SqlListenerResponse getIndexesMeta(JdbcMetaIndexesRequest req) { * @return Response. */ private SqlListenerResponse getParamsMeta(JdbcMetaParamsRequest req) { - return null; + try { + ParameterMetaData paramMeta = ctx.query().prepareNativeStatement(req.schemaName(), req.sql()) + .getParameterMetaData(); + + int size = paramMeta.getParameterCount(); + + List meta = new ArrayList<>(size); + + for (int i = 0; i < size; i++) + meta.add(new JdbcParamMeta(paramMeta, i + 1)); + + JdbcMetaParamsResult res = new JdbcMetaParamsResult(meta); + + return new JdbcResponse(res); + } + catch (Exception e) { + U.error(log, "Failed to get parameters metadata [reqId=" + req.requestId() + ", req=" + req + ']', e); + + return new JdbcResponse(SqlListenerResponse.STATUS_FAILED, e.toString()); + } } /** diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcTableMeta.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcTableMeta.java index 4c40afb7938b5..795bf8e461eec 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcTableMeta.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcTableMeta.java @@ -23,7 +23,7 @@ import org.apache.ignite.internal.processors.odbc.OdbcUtils; /** - * ODBC table-related metadata. + * JDBC table metadata. */ public class JdbcTableMeta implements JdbcRawBinarylizable { /** Catalog name. */ @@ -33,28 +33,28 @@ public class JdbcTableMeta implements JdbcRawBinarylizable { private String schema; /** Table name. */ - private String table; + private String tbl; /** Table type. */ - private String tableType; + private String tblType; /** * Default constructor is used for deserialization. */ - public JdbcTableMeta() { + JdbcTableMeta() { } /** * @param catalog Catalog name. * @param schema Schema name. - * @param table Table name. - * @param tableType Table type. + * @param tbl Table name. + * @param tblType Table type. */ - public JdbcTableMeta(String catalog, String schema, String table, String tableType) { + JdbcTableMeta(String catalog, String schema, String tbl, String tblType) { this.catalog = catalog; this.schema = OdbcUtils.addQuotationMarksIfNeeded(schema); - this.table = table; - this.tableType = tableType; + this.tbl = tbl; + this.tblType = tblType; } /** @@ -75,29 +75,29 @@ public String schema() { * @return Table name. */ public String table() { - return table; + return tbl; } /** * @return Table type. */ public String tableType() { - return tableType; + return tblType; } /** {@inheritDoc} */ @Override public void writeBinary(BinaryWriterExImpl writer) throws BinaryObjectException { writer.writeString(catalog); writer.writeString(schema); - writer.writeString(table); - writer.writeString(tableType); + writer.writeString(tbl); + writer.writeString(tblType); } /** {@inheritDoc} */ @Override public void readBinary(BinaryReaderExImpl reader) throws BinaryObjectException { catalog = reader.readString(); schema = reader.readString(); - table = reader.readString(); - tableType = reader.readString(); + tbl = reader.readString(); + tblType = reader.readString(); } } From c9200a5a8dd79fffd8446424585e0e1e7928519f Mon Sep 17 00:00:00 2001 From: tledkov-gridgain Date: Mon, 5 Jun 2017 15:55:00 +0300 Subject: [PATCH 04/32] IGNITE-5233: save the progress --- .../odbc/jdbc/JdbcMetaPrimaryKeysRequest.java | 88 ++++++++++++++++++ .../odbc/jdbc/JdbcMetaPrimaryKeysResult.java | 91 +++++++++++++++++++ .../processors/odbc/jdbc/JdbcRequest.java | 35 +++---- .../processors/odbc/jdbc/JdbcResult.java | 27 +++--- 4 files changed, 213 insertions(+), 28 deletions(-) create mode 100644 modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaPrimaryKeysRequest.java create mode 100644 modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaPrimaryKeysResult.java diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaPrimaryKeysRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaPrimaryKeysRequest.java new file mode 100644 index 0000000000000..8457ef72c81b1 --- /dev/null +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaPrimaryKeysRequest.java @@ -0,0 +1,88 @@ +/* + * 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 org.apache.ignite.internal.processors.odbc.jdbc; + +import org.apache.ignite.binary.BinaryObjectException; +import org.apache.ignite.internal.binary.BinaryReaderExImpl; +import org.apache.ignite.internal.binary.BinaryWriterExImpl; +import org.apache.ignite.internal.util.typedef.internal.S; +import org.jetbrains.annotations.Nullable; + +/** + * JDBC get columns metadata request. + */ +public class JdbcMetaPrimaryKeysRequest extends JdbcRequest { + /** Cache name. */ + private String schemaName; + + /** Table name. */ + private String tblName; + + /** + * Default constructor is used for deserialization. + */ + JdbcMetaPrimaryKeysRequest() { + super(META_PRIMARY_KEYS); + } + + /** + * @param schemaName Cache name. + * @param tblName Table name. + */ + public JdbcMetaPrimaryKeysRequest(String schemaName, String tblName) { + super(META_PRIMARY_KEYS); + + this.schemaName = schemaName; + this.tblName = tblName; + } + + /** + * @return Cache name. + */ + @Nullable public String cacheName() { + return schemaName; + } + + /** + * @return Table name. + */ + public String tableName() { + return tblName; + } + + /** {@inheritDoc} */ + @Override public void writeBinary(BinaryWriterExImpl writer) throws BinaryObjectException { + super.writeBinary(writer); + + writer.writeString(schemaName); + writer.writeString(tblName); + } + + /** {@inheritDoc} */ + @Override public void readBinary(BinaryReaderExImpl reader) throws BinaryObjectException { + super.readBinary(reader); + + schemaName = reader.readString(); + tblName = reader.readString(); + } + + /** {@inheritDoc} */ + @Override public String toString() { + return S.toString(JdbcMetaPrimaryKeysRequest.class, this); + } +} \ No newline at end of file diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaPrimaryKeysResult.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaPrimaryKeysResult.java new file mode 100644 index 0000000000000..c105deb8cadbc --- /dev/null +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaPrimaryKeysResult.java @@ -0,0 +1,91 @@ +/* + * 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 org.apache.ignite.internal.processors.odbc.jdbc; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import org.apache.ignite.binary.BinaryObjectException; +import org.apache.ignite.internal.binary.BinaryReaderExImpl; +import org.apache.ignite.internal.binary.BinaryWriterExImpl; +import org.apache.ignite.internal.util.typedef.F; + +/** + * JDBC tables metadata request. + */ +public class JdbcMetaPrimaryKeysResult extends JdbcResult { + /** Query result rows. */ + private List meta; + + /** + * Default constructor is used for deserialization. + */ + JdbcMetaPrimaryKeysResult() { + super(META_PRIMARY_KEYS); + } + + /** + * @param meta Column metadata. + */ + JdbcMetaPrimaryKeysResult(List meta) { + super(META_PRIMARY_KEYS); + this.meta = meta; + } + + /** {@inheritDoc} */ + @Override public void writeBinary(BinaryWriterExImpl writer) throws BinaryObjectException { + super.writeBinary(writer); + + if (F.isEmpty(meta)) + writer.writeInt(0); + else { + writer.writeInt(meta.size()); + + for(JdbcTableMeta m : meta) + m.writeBinary(writer); + } + } + + /** {@inheritDoc} */ + @Override public void readBinary(BinaryReaderExImpl reader) throws BinaryObjectException { + super.readBinary(reader); + + int size = reader.readInt(); + + if (size == 0) + meta = Collections.emptyList(); + else { + meta = new ArrayList<>(size); + + for (int i = 0; i < size; ++i) { + JdbcTableMeta m = new JdbcTableMeta(); + + m.readBinary(reader); + + meta.add(m); + } + } + } + + /** + * @return Query result rows. + */ + public List meta() { + return meta; + } +} diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcRequest.java index 0fdc3152ae0bd..ada59dfa52681 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcRequest.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcRequest.java @@ -27,29 +27,32 @@ * SQL listener command request. */ public class JdbcRequest extends SqlListenerRequest implements JdbcRawBinarylizable { - /** Execute sql query. */ - public static final byte QRY_EXEC = 2; + /** Execute sql query request. */ + static final byte QRY_EXEC = 2; - /** Fetch query results. */ - public static final byte QRY_FETCH = 3; + /** Fetch query results request. */ + static final byte QRY_FETCH = 3; - /** Close query. */ - public static final byte QRY_CLOSE = 4; + /** Close query request. */ + static final byte QRY_CLOSE = 4; - /** Get columns meta query. */ - public static final byte QRY_META = 5; + /** Get query result's columns metadata request. */ + static final byte QRY_META = 5; - /** Get columns meta query. */ - public static final byte META_TABLES = 6; + /** Gte tables metadata request. */ + static final byte META_TABLES = 6; - /** Get columns meta query. */ - public static final byte META_COLUMNS = 7; + /** Get columns metadata request. */ + static final byte META_COLUMNS = 7; - /** Get columns meta query. */ - public static final byte META_INDEXES = 8; + /** Get indexes metadata request. */ + static final byte META_INDEXES = 8; - /** Get columns meta query. */ - public static final byte META_PARAMS = 9; + /** Get SQL query parameters metadata request. */ + static final byte META_PARAMS = 9; + + /** Get primary keys metadata request. */ + static final byte META_PRIMARY_KEYS = 10; /** Request type. */ private byte type; diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcResult.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcResult.java index 7ce83be83461a..9b869af8b204f 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcResult.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcResult.java @@ -27,25 +27,28 @@ */ public class JdbcResult implements JdbcRawBinarylizable { /** Execute sql result. */ - public static final byte QRY_EXEC = 2; + static final byte QRY_EXEC = 2; /** Fetch query results. */ - public static final byte QRY_FETCH = 3; + static final byte QRY_FETCH = 3; - /** Get columns meta query result. */ - public static final byte QRY_META = 5; + /** Query result's columns metadata result. */ + static final byte QRY_META = 5; - /** Get columns meta query result. */ - public static final byte META_TABLES = 6; + /** Tables metadata result. */ + static final byte META_TABLES = 6; - /** Get columns meta query result. */ - public static final byte META_COLUMNS = 7; + /** Columns metadata result. */ + static final byte META_COLUMNS = 7; - /** Get columns meta query result. */ - public static final byte META_INDEXES = 8; + /** Indexes metadata result. */ + static final byte META_INDEXES = 8; - /** Get columns meta query result. */ - public static final byte META_PARAMS = 9; + /** SQL query parameters metadata result. */ + static final byte META_PARAMS = 9; + + /** Primary keys metadata result. */ + static final byte META_PRIMARY_KEYS = 10; /** Success status. */ private byte type; From 5aacc055a3b7922f291b30a66b13f637f6ebe03a Mon Sep 17 00:00:00 2001 From: tledkov-gridgain Date: Mon, 5 Jun 2017 16:29:14 +0300 Subject: [PATCH 05/32] IGNITE-5233: save the progress --- .../jdbc/thin/JdbcThinDatabaseMetadata.java | 12 +- .../processors/odbc/jdbc/JdbcIndexMeta.java | 38 +++++- .../odbc/jdbc/JdbcMetaPrimaryKeysResult.java | 26 ++-- .../odbc/jdbc/JdbcPrimaryKeyMeta.java | 119 ++++++++++++++++++ .../processors/odbc/jdbc/JdbcRequest.java | 5 + .../odbc/jdbc/JdbcRequestHandler.java | 2 +- .../processors/odbc/jdbc/JdbcResult.java | 5 + 7 files changed, 180 insertions(+), 27 deletions(-) create mode 100644 modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcPrimaryKeyMeta.java diff --git a/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinDatabaseMetadata.java b/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinDatabaseMetadata.java index 21fec393e042f..c845220891724 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinDatabaseMetadata.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinDatabaseMetadata.java @@ -933,8 +933,8 @@ private ResultSet emptyResultSet() { List> rows = new LinkedList<>(); - for (int i = 0; i < res.meta().size(); ++i) - rows.addAll(indexRow(schema, tbl, res.meta().get(i))); + for (JdbcIndexMeta idxMeta : res.meta()) + rows.addAll(indexRow(idxMeta)); return new JdbcThinResultSet(rows, Arrays.asList( new JdbcColumnMeta(null, null, "TABLE_CAT", String.class), @@ -962,20 +962,18 @@ private ResultSet emptyResultSet() { } /** - * @param schema Table schema name. - * @param tbl Table name. * @param idxMeta Index metadata. * @return List of result rows correspond to index. */ - private List> indexRow(String schema, String tbl, JdbcIndexMeta idxMeta) { + private List> indexRow(JdbcIndexMeta idxMeta) { List> rows = new ArrayList<>(idxMeta.fields().length); for (int i = 0; i < idxMeta.fields().length; ++i) { List row = new ArrayList<>(13); row.add((String)null); // table catalog - row.add(upperCase(schema)); - row.add(upperCase(tbl)); + row.add(upperCase(idxMeta.schema())); + row.add(upperCase(idxMeta.tableName())); row.add(true); // non unique row.add(null); // index qualifier (index catalog) row.add(upperCase(idxMeta.name())); diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcIndexMeta.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcIndexMeta.java index 6d53482acb343..b9fed483418e7 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcIndexMeta.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcIndexMeta.java @@ -28,6 +28,12 @@ * JDBC index metadata. */ public class JdbcIndexMeta implements JdbcRawBinarylizable { + /** Index table name. */ + private String schema; + + /** Index table name. */ + private String tbl; + /** Index name. */ private String name; @@ -51,12 +57,18 @@ public class JdbcIndexMeta implements JdbcRawBinarylizable { } /** + * @param schema Schema name. + * @param tbl Table name. * @param idx Index info. */ - JdbcIndexMeta(GridQueryIndexDescriptor idx) { + JdbcIndexMeta(String schema, String tbl, GridQueryIndexDescriptor idx) { + assert tbl != null; assert idx != null; assert idx.fields() != null; + this.schema = schema; + this.tbl = tbl; + name = idx.name(); type = idx.type(); inlineSize = idx.inlineSize(); @@ -68,6 +80,20 @@ public class JdbcIndexMeta implements JdbcRawBinarylizable { fieldsAsc[i] = !idx.descending(fields[i]); } + /** + * @return Schema name. + */ + public String schema() { + return schema; + } + + /** + * @return Table name. + */ + public String tableName() { + return tbl; + } + /** * @return Index name. */ @@ -128,17 +154,23 @@ public boolean[] fieldsAsc() { @Override public boolean equals(Object o) { if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; JdbcIndexMeta meta = (JdbcIndexMeta)o; + if (schema != null ? !schema.equals(meta.schema) : meta.schema != null) + return false; + if (!tbl.equals(meta.tbl)) + return false; return name.equals(meta.name); } /** {@inheritDoc} */ @Override public int hashCode() { - return name.hashCode(); + int result = schema != null ? schema.hashCode() : 0; + result = 31 * result + tbl.hashCode(); + result = 31 * result + name.hashCode(); + return result; } } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaPrimaryKeysResult.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaPrimaryKeysResult.java index c105deb8cadbc..3c1d9161f7d3e 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaPrimaryKeysResult.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaPrimaryKeysResult.java @@ -19,7 +19,9 @@ import java.util.ArrayList; import java.util.Collections; +import java.util.HashMap; import java.util.List; +import java.util.Map; import org.apache.ignite.binary.BinaryObjectException; import org.apache.ignite.internal.binary.BinaryReaderExImpl; import org.apache.ignite.internal.binary.BinaryWriterExImpl; @@ -30,7 +32,7 @@ */ public class JdbcMetaPrimaryKeysResult extends JdbcResult { /** Query result rows. */ - private List meta; + private Map tblsPks; /** * Default constructor is used for deserialization. @@ -44,20 +46,17 @@ public class JdbcMetaPrimaryKeysResult extends JdbcResult { */ JdbcMetaPrimaryKeysResult(List meta) { super(META_PRIMARY_KEYS); - this.meta = meta; } /** {@inheritDoc} */ @Override public void writeBinary(BinaryWriterExImpl writer) throws BinaryObjectException { super.writeBinary(writer); - if (F.isEmpty(meta)) + if (F.isEmpty(tblsPks)) writer.writeInt(0); else { - writer.writeInt(meta.size()); + writer.writeInt(tblsPks.size()); - for(JdbcTableMeta m : meta) - m.writeBinary(writer); } } @@ -68,24 +67,19 @@ public class JdbcMetaPrimaryKeysResult extends JdbcResult { int size = reader.readInt(); if (size == 0) - meta = Collections.emptyList(); + tblsPks = Collections.emptyMap(); else { - meta = new ArrayList<>(size); + tblsPks = new HashMap<>(size); for (int i = 0; i < size; ++i) { - JdbcTableMeta m = new JdbcTableMeta(); - - m.readBinary(reader); - - meta.add(m); } } } /** - * @return Query result rows. + * @return Primary keys map. */ - public List meta() { - return meta; + public Map primaryKeys() { + return tblsPks; } } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcPrimaryKeyMeta.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcPrimaryKeyMeta.java new file mode 100644 index 0000000000000..3e316aa7f74f9 --- /dev/null +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcPrimaryKeyMeta.java @@ -0,0 +1,119 @@ +/* + * 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 org.apache.ignite.internal.processors.odbc.jdbc; + +import org.apache.ignite.binary.BinaryObjectException; +import org.apache.ignite.cache.QueryIndexType; +import org.apache.ignite.internal.binary.BinaryReaderExImpl; +import org.apache.ignite.internal.binary.BinaryWriterExImpl; +import org.apache.ignite.internal.processors.query.GridQueryFieldMetadata; +import org.apache.ignite.internal.processors.query.GridQueryIndexDescriptor; + +/** + * JDBC index metadata. + */ +public class JdbcPrimaryKeyMeta implements JdbcRawBinarylizable { + /** Cache name. */ + private String schema; + + /** Table name. */ + private String tbl; + + /** Primary key name. */ + private String name; + + /** Index fields */ + private String[] fields; + + /** + * Default constructor is used for binary serialization. + */ + JdbcPrimaryKeyMeta() { + // No-op. + } + + /** + * @param idx Index info. + */ + JdbcPrimaryKeyMeta(GridQueryFieldMetadata idx) { + + } + + /** + * @return Schema name. + */ + public String schema() { + return schema; + } + + /** + * @return Table name. + */ + public String tableName() { + return tbl; + } + + /** + * @return Primary key name. + */ + public String name() { + return name; + } + + /** + * @return Index fields + */ + public String[] fields() { + return fields; + } + + + /** {@inheritDoc} */ + @Override public void writeBinary(BinaryWriterExImpl writer) throws BinaryObjectException { + writer.writeString(schema); + writer.writeString(tbl); + writer.writeString(name); + writer.writeStringArray(fields); + } + + /** {@inheritDoc} */ + @Override public void readBinary(BinaryReaderExImpl reader) throws BinaryObjectException { + schema = reader.readString(); + tbl = reader.readString(); + name = reader.readString(); + fields = reader.readStringArray(); + } + + /** {@inheritDoc} */ + @Override public boolean equals(Object o) { + if (this == o) + return true; + + if (o == null || getClass() != o.getClass()) + return false; + + JdbcPrimaryKeyMeta meta = (JdbcPrimaryKeyMeta)o; + + return name.equals(meta.name); + } + + /** {@inheritDoc} */ + @Override public int hashCode() { + return name.hashCode(); + } +} diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcRequest.java index ada59dfa52681..06f75806df757 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcRequest.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcRequest.java @@ -132,6 +132,11 @@ public static JdbcRequest readRequest(BinaryReaderExImpl reader) throws BinaryOb break; + case META_PRIMARY_KEYS: + req = new JdbcMetaPrimaryKeysRequest(); + + break; + default: throw new IgniteException("Unknown SQL listener request ID: [request ID=" + reqType + ']'); } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcRequestHandler.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcRequestHandler.java index c531c9040d435..eeb1cc171d06b 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcRequestHandler.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcRequestHandler.java @@ -459,7 +459,7 @@ private SqlListenerResponse getIndexesMeta(JdbcMetaIndexesRequest req) { continue; for (GridQueryIndexDescriptor idxDesc : table.indexes().values()) - meta.add(new JdbcIndexMeta(idxDesc)); + meta.add(new JdbcIndexMeta(cacheName, table.name(), idxDesc)); } return new JdbcResponse(new JdbcMetaIndexesResult(meta)); diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcResult.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcResult.java index 9b869af8b204f..06e2993ef3107 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcResult.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcResult.java @@ -118,6 +118,11 @@ public static JdbcResult readResult(BinaryReaderExImpl reader) throws BinaryObje break; + case META_PRIMARY_KEYS: + res = new JdbcMetaPrimaryKeysResult(); + + break; + default: throw new IgniteException("Unknown SQL listener request ID: [request ID=" + resId + ']'); } From 4fcdc2117025f23f5d942374fd0d840553dc473b Mon Sep 17 00:00:00 2001 From: tledkov-gridgain Date: Mon, 5 Jun 2017 16:35:14 +0300 Subject: [PATCH 06/32] IGNITE-5233: save the progress --- .../jdbc/thin/JdbcThinDatabaseMetadata.java | 2 +- .../jdbc/thin/JdbcThinResultSetMetadata.java | 2 +- .../processors/odbc/jdbc/JdbcColumnMeta.java | 56 +++++++++---------- .../odbc/jdbc/JdbcMetaParamsRequest.java | 16 +++--- .../odbc/jdbc/JdbcMetaPrimaryKeysRequest.java | 28 +++++----- .../odbc/jdbc/JdbcRequestHandler.java | 50 ++++++++++++++++- 6 files changed, 101 insertions(+), 53 deletions(-) diff --git a/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinDatabaseMetadata.java b/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinDatabaseMetadata.java index c845220891724..b88fa5f2b3d48 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinDatabaseMetadata.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinDatabaseMetadata.java @@ -824,7 +824,7 @@ private List columnRow(JdbcColumnMeta colMeta, int pos) { List row = new ArrayList<>(20); row.add((String)null); - row.add(upperCase(colMeta.schemaName())); + row.add(upperCase(colMeta.schema())); row.add(upperCase(colMeta.tableName())); row.add(upperCase(colMeta.columnName())); row.add(colMeta.dataType()); diff --git a/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinResultSetMetadata.java b/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinResultSetMetadata.java index 4c560bc07464f..2e3c4b8d3a67d 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinResultSetMetadata.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinResultSetMetadata.java @@ -93,7 +93,7 @@ public class JdbcThinResultSetMetadata implements ResultSetMetaData { /** {@inheritDoc} */ @Override public String getSchemaName(int col) throws SQLException { - return meta.get(col - 1).schemaName(); + return meta.get(col - 1).schema(); } /** {@inheritDoc} */ diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcColumnMeta.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcColumnMeta.java index b80b44e4933fe..ecc04577e61f0 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcColumnMeta.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcColumnMeta.java @@ -27,13 +27,13 @@ */ public class JdbcColumnMeta implements JdbcRawBinarylizable { /** Cache name. */ - private String schemaName; + private String schema; /** Table name. */ - private String tableName; + private String tbl; /** Column name. */ - private String columnName; + private String col; /** Data type. */ private int dataType; @@ -54,9 +54,9 @@ public class JdbcColumnMeta implements JdbcRawBinarylizable { * @param info Field metadata. */ JdbcColumnMeta(GridQueryFieldMetadata info) { - this.schemaName = info.schemaName(); - this.tableName = info.typeName(); - this.columnName = info.fieldName(); + this.schema = info.schemaName(); + this.tbl = info.typeName(); + this.col = info.fieldName(); dataType = JdbcThinUtils.type(info.fieldTypeName()); dataTypeName = JdbcThinUtils.typeName(info.fieldTypeName()); @@ -64,15 +64,15 @@ public class JdbcColumnMeta implements JdbcRawBinarylizable { } /** - * @param schemaName Schema. + * @param schema Schema. * @param tableName Table. - * @param columnName Column. + * @param col Column. * @param cls Type. */ - public JdbcColumnMeta(String schemaName, String tableName, String columnName, Class cls) { - this.schemaName = schemaName; - this.tableName = tableName; - this.columnName = columnName; + public JdbcColumnMeta(String schema, String tableName, String col, Class cls) { + this.schema = schema; + this.tbl = tableName; + this.col = col; String type = cls.getName(); dataType = JdbcThinUtils.type(type); @@ -84,22 +84,22 @@ public JdbcColumnMeta(String schemaName, String tableName, String columnName, Cl /** * @return Schema name. */ - public String schemaName() { - return schemaName; + public String schema() { + return schema; } /** * @return Table name. */ public String tableName() { - return tableName; + return tbl; } /** * @return Column name. */ public String columnName() { - return columnName; + return col; } /** @@ -125,9 +125,9 @@ public String dataTypeClass() { /** {@inheritDoc} */ @Override public void writeBinary(BinaryWriterExImpl writer) { - writer.writeString(schemaName); - writer.writeString(tableName); - writer.writeString(columnName); + writer.writeString(schema); + writer.writeString(tbl); + writer.writeString(col); writer.writeInt(dataType); writer.writeString(dataTypeName); @@ -136,9 +136,9 @@ public String dataTypeClass() { /** {@inheritDoc} */ @Override public void readBinary(BinaryReaderExImpl reader) { - schemaName = reader.readString(); - tableName = reader.readString(); - columnName = reader.readString(); + schema = reader.readString(); + tbl = reader.readString(); + col = reader.readString(); dataType = reader.readInt(); dataTypeName = reader.readString(); @@ -155,20 +155,20 @@ public String dataTypeClass() { JdbcColumnMeta meta = (JdbcColumnMeta)o; - if (schemaName != null ? !schemaName.equals(meta.schemaName) : meta.schemaName != null) + if (schema != null ? !schema.equals(meta.schema) : meta.schema != null) return false; - if (tableName != null ? !tableName.equals(meta.tableName) : meta.tableName != null) + if (tbl != null ? !tbl.equals(meta.tbl) : meta.tbl!= null) return false; - return columnName.equals(meta.columnName); + return col.equals(meta.col); } /** {@inheritDoc} */ @Override public int hashCode() { - int result = schemaName != null ? schemaName.hashCode() : 0; - result = 31 * result + (tableName != null ? tableName.hashCode() : 0); - result = 31 * result + columnName.hashCode(); + int result = schema != null ? schema.hashCode() : 0; + result = 31 * result + (tbl != null ? tbl.hashCode() : 0); + result = 31 * result + col.hashCode(); return result; } } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaParamsRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaParamsRequest.java index 86cf80ae9fa2e..f6526dd97ae33 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaParamsRequest.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaParamsRequest.java @@ -27,7 +27,7 @@ */ public class JdbcMetaParamsRequest extends JdbcRequest { /** Cache. */ - private String schemaName; + private String schema; /** Query. */ private String sql; @@ -40,13 +40,13 @@ public class JdbcMetaParamsRequest extends JdbcRequest { } /** - * @param schemaName Schema name. + * @param schema Schema name. * @param sql SQL Query. */ - public JdbcMetaParamsRequest(String schemaName, String sql) { + public JdbcMetaParamsRequest(String schema, String sql) { super(META_PARAMS); - this.schemaName = schemaName; + this.schema = schema; this.sql = sql; } @@ -60,15 +60,15 @@ public String sql() { /** * @return Cache name. */ - public String schemaName() { - return schemaName; + public String schema() { + return schema; } /** {@inheritDoc} */ @Override public void writeBinary(BinaryWriterExImpl writer) throws BinaryObjectException { super.writeBinary(writer); - writer.writeString(schemaName); + writer.writeString(schema); writer.writeString(sql); } @@ -76,7 +76,7 @@ public String schemaName() { @Override public void readBinary(BinaryReaderExImpl reader) throws BinaryObjectException { super.readBinary(reader); - schemaName = reader.readString(); + schema = reader.readString(); sql = reader.readString(); } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaPrimaryKeysRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaPrimaryKeysRequest.java index 8457ef72c81b1..3cc1447a2b0eb 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaPrimaryKeysRequest.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaPrimaryKeysRequest.java @@ -28,10 +28,10 @@ */ public class JdbcMetaPrimaryKeysRequest extends JdbcRequest { /** Cache name. */ - private String schemaName; + private String schema; /** Table name. */ - private String tblName; + private String tbl; /** * Default constructor is used for deserialization. @@ -41,44 +41,44 @@ public class JdbcMetaPrimaryKeysRequest extends JdbcRequest { } /** - * @param schemaName Cache name. + * @param schema Cache name. * @param tblName Table name. */ - public JdbcMetaPrimaryKeysRequest(String schemaName, String tblName) { + public JdbcMetaPrimaryKeysRequest(String schema, String tblName) { super(META_PRIMARY_KEYS); - this.schemaName = schemaName; - this.tblName = tblName; + this.schema = schema; + this.tbl = tblName; } /** - * @return Cache name. + * @return Schema name. */ - @Nullable public String cacheName() { - return schemaName; + @Nullable public String schema() { + return schema; } /** * @return Table name. */ public String tableName() { - return tblName; + return tbl; } /** {@inheritDoc} */ @Override public void writeBinary(BinaryWriterExImpl writer) throws BinaryObjectException { super.writeBinary(writer); - writer.writeString(schemaName); - writer.writeString(tblName); + writer.writeString(schema); + writer.writeString(tbl); } /** {@inheritDoc} */ @Override public void readBinary(BinaryReaderExImpl reader) throws BinaryObjectException { super.readBinary(reader); - schemaName = reader.readString(); - tblName = reader.readString(); + schema = reader.readString(); + tbl = reader.readString(); } /** {@inheritDoc} */ diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcRequestHandler.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcRequestHandler.java index eeb1cc171d06b..bca5b885d51ff 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcRequestHandler.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcRequestHandler.java @@ -53,6 +53,7 @@ import static org.apache.ignite.internal.processors.odbc.jdbc.JdbcRequest.META_COLUMNS; import static org.apache.ignite.internal.processors.odbc.jdbc.JdbcRequest.META_INDEXES; import static org.apache.ignite.internal.processors.odbc.jdbc.JdbcRequest.META_PARAMS; +import static org.apache.ignite.internal.processors.odbc.jdbc.JdbcRequest.META_PRIMARY_KEYS; import static org.apache.ignite.internal.processors.odbc.jdbc.JdbcRequest.META_TABLES; import static org.apache.ignite.internal.processors.odbc.jdbc.JdbcRequest.QRY_CLOSE; import static org.apache.ignite.internal.processors.odbc.jdbc.JdbcRequest.QRY_EXEC; @@ -144,6 +145,9 @@ public JdbcRequestHandler(GridKernalContext ctx, GridSpinBusyLock busyLock, int case META_PARAMS: return getParamsMeta((JdbcMetaParamsRequest)req); + + case META_PRIMARY_KEYS: + return getPrimaryKeys((JdbcMetaPrimaryKeysRequest)req); } return new JdbcResponse(SqlListenerResponse.STATUS_FAILED, "Unsupported JDBC request [req=" + req + ']'); @@ -477,7 +481,7 @@ private SqlListenerResponse getIndexesMeta(JdbcMetaIndexesRequest req) { */ private SqlListenerResponse getParamsMeta(JdbcMetaParamsRequest req) { try { - ParameterMetaData paramMeta = ctx.query().prepareNativeStatement(req.schemaName(), req.sql()) + ParameterMetaData paramMeta = ctx.query().prepareNativeStatement(req.schema(), req.sql()) .getParameterMetaData(); int size = paramMeta.getParameterCount(); @@ -498,6 +502,50 @@ private SqlListenerResponse getParamsMeta(JdbcMetaParamsRequest req) { } } + /** + * @param req Request. + * @return Response. + */ + private SqlListenerResponse getPrimaryKeys(JdbcMetaPrimaryKeysRequest req) { + try { + String cacheName; + String tableName; + + if (req.tableName().contains(".")) { + // Parsing two-part table name. + String[] parts = req.tableName().split("\\."); + + cacheName = parts[0]; + + tableName = parts[1]; + } + else { + cacheName = req.schema(); + + tableName = req.tableName(); + } + + Collection tablesMeta = ctx.query().types(cacheName); + + Collection meta = new HashSet<>(); + + for (GridQueryTypeDescriptor table : tablesMeta) { + if (!matches(table.name(), tableName)) + continue; + + for (GridQueryIndexDescriptor idxDesc : table.indexes().values()) + meta.add(new JdbcIndexMeta(cacheName, table.name(), idxDesc)); + } + + return new JdbcResponse(new JdbcMetaIndexesResult(meta)); + } + catch (Exception e) { + U.error(log, "Failed to get parameters metadata [reqId=" + req.requestId() + ", req=" + req + ']', e); + + return new JdbcResponse(SqlListenerResponse.STATUS_FAILED, e.toString()); + } + } + /** * Checks whether string matches SQL pattern. * From 3244d6577470b2d4275cba027e5ed8c004df602a Mon Sep 17 00:00:00 2001 From: tledkov-gridgain Date: Mon, 5 Jun 2017 17:26:48 +0300 Subject: [PATCH 07/32] IGNITE-5233: primary key metadata --- .../jdbc/thin/JdbcThinMetadataSelfTest.java | 24 ++++++ .../jdbc/thin/JdbcThinDatabaseMetadata.java | 73 ++++++++++++++----- .../internal/jdbc/thin/JdbcThinTcpIo.java | 14 +++- .../processors/odbc/jdbc/JdbcIndexMeta.java | 4 +- .../odbc/jdbc/JdbcMetaPrimaryKeysResult.java | 30 +++++--- .../odbc/jdbc/JdbcPrimaryKeyMeta.java | 28 +++++-- .../odbc/jdbc/JdbcRequestHandler.java | 33 +++++---- 7 files changed, 149 insertions(+), 57 deletions(-) diff --git a/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinMetadataSelfTest.java b/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinMetadataSelfTest.java index 3e8f948681d8b..f165102101e54 100644 --- a/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinMetadataSelfTest.java +++ b/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinMetadataSelfTest.java @@ -368,6 +368,30 @@ else if ("AGE".equals(field)) } } + /** + * @throws Exception If failed. + */ + public void testPrimaryKeyMetadata() throws Exception { + try (Connection conn = DriverManager.getConnection(URL); + ResultSet rs = conn.getMetaData().getPrimaryKeys(null, "pers", "Person")) { + + int cnt = 0; + + while (rs.next()) { + assert "_KEY".equals(rs.getString("COLUMN_NAME")); + + cnt++; + } + + assert cnt == 1; + } + catch (Exception e) { + log.error("Unexpected exception", e); + + fail(); + } + } + /** * @throws Exception If failed. */ diff --git a/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinDatabaseMetadata.java b/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinDatabaseMetadata.java index b88fa5f2b3d48..e5f2dc39325db 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinDatabaseMetadata.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinDatabaseMetadata.java @@ -34,7 +34,9 @@ import org.apache.ignite.internal.processors.odbc.jdbc.JdbcIndexMeta; import org.apache.ignite.internal.processors.odbc.jdbc.JdbcMetaColumnsResult; import org.apache.ignite.internal.processors.odbc.jdbc.JdbcMetaIndexesResult; +import org.apache.ignite.internal.processors.odbc.jdbc.JdbcMetaPrimaryKeysResult; import org.apache.ignite.internal.processors.odbc.jdbc.JdbcMetaTablesResult; +import org.apache.ignite.internal.processors.odbc.jdbc.JdbcPrimaryKeyMeta; import org.apache.ignite.internal.processors.odbc.jdbc.JdbcTableMeta; import static java.sql.Connection.TRANSACTION_NONE; @@ -880,25 +882,56 @@ private ResultSet emptyResultSet() { /** {@inheritDoc} */ @Override public ResultSet getPrimaryKeys(String catalog, String schema, String tbl) throws SQLException { -// List> rows = new LinkedList<>(); -// -// for (Map.Entry>> s : meta.entrySet()) -// if (schema == null || schema.toUpperCase().equals(s.getKey())) -// for (Map.Entry> t : s.getValue().entrySet()) -// if (tbl == null || tbl.toUpperCase().equals(t.getKey())) -// rows.add(Arrays.asList((String)null, s.getKey().toUpperCase(), -// t.getKey().toUpperCase(), "_KEY", 1, "_KEY")); -// -// return new JdbcThinResultSet( -// conn.createStatement0(), -// Collections.emptyList(), -// Arrays.asList("TABLE_CAT", "TABLE_SCHEM", "TABLE_NAME", "COLUMN_NAME", "KEY_SEQ", "PK_NAME"), -// Arrays.asList(String.class.getName(), String.class.getName(), String.class.getName(), -// String.class.getName(), Short.class.getName(), String.class.getName()), -// rows -// ); + try { + if (conn.isClosed()) + throw new SQLException("Connection is closed."); - return null; + JdbcMetaPrimaryKeysResult res = conn.io().primaryKeysMeta(schema, tbl); + + List> rows = new LinkedList<>(); + + for (JdbcPrimaryKeyMeta pkMeta : res.meta()) + rows.addAll(primaryKeyRows(pkMeta)); + + return new JdbcThinResultSet(rows, Arrays.asList( + new JdbcColumnMeta(null, null, "TABLE_CAT", String.class), + new JdbcColumnMeta(null, null, "TABLE_SCHEM", String.class), + new JdbcColumnMeta(null, null, "TABLE_NAME", String.class), + new JdbcColumnMeta(null, null, "COLUMN_NAME", String.class), + new JdbcColumnMeta(null, null, "KEY_SEQ", Short.class), + new JdbcColumnMeta(null, null, "PK_NAME", String.class))); + } + catch (IOException e) { + conn.close(); + + throw new SQLException("Failed to query Ignite.", e); + } + catch (IgniteCheckedException e) { + throw new SQLException("Failed to query Ignite.", e); + } + } + + /** + * @param pkMeta Primary key metadata. + * @return Result set rows for primary key. + */ + private List> primaryKeyRows(JdbcPrimaryKeyMeta pkMeta) { + List> rows = new ArrayList<>(pkMeta.fields().length); + + for (int i = 0; i < pkMeta.fields().length; ++i) { + List row = new ArrayList<>(6); + + row.add((String)null); // table catalog + row.add(upperCase(pkMeta.schema())); + row.add(upperCase(pkMeta.tableName())); + row.add(upperCase(pkMeta.fields()[i])); + row.add((Integer)i + 1); // sequence number + row.add(upperCase(pkMeta.name())); + + rows.add(row); + } + + return rows; } /** {@inheritDoc} */ @@ -934,7 +967,7 @@ private ResultSet emptyResultSet() { List> rows = new LinkedList<>(); for (JdbcIndexMeta idxMeta : res.meta()) - rows.addAll(indexRow(idxMeta)); + rows.addAll(indexRows(idxMeta)); return new JdbcThinResultSet(rows, Arrays.asList( new JdbcColumnMeta(null, null, "TABLE_CAT", String.class), @@ -965,7 +998,7 @@ private ResultSet emptyResultSet() { * @param idxMeta Index metadata. * @return List of result rows correspond to index. */ - private List> indexRow(JdbcIndexMeta idxMeta) { + private List> indexRows(JdbcIndexMeta idxMeta) { List> rows = new ArrayList<>(idxMeta.fields().length); for (int i = 0; i < idxMeta.fields().length; ++i) { diff --git a/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinTcpIo.java b/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinTcpIo.java index 675293c5e4217..2a50766f3f3d9 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinTcpIo.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinTcpIo.java @@ -38,6 +38,8 @@ import org.apache.ignite.internal.processors.odbc.jdbc.JdbcMetaIndexesResult; import org.apache.ignite.internal.processors.odbc.jdbc.JdbcMetaParamsRequest; import org.apache.ignite.internal.processors.odbc.jdbc.JdbcMetaParamsResult; +import org.apache.ignite.internal.processors.odbc.jdbc.JdbcMetaPrimaryKeysRequest; +import org.apache.ignite.internal.processors.odbc.jdbc.JdbcMetaPrimaryKeysResult; import org.apache.ignite.internal.processors.odbc.jdbc.JdbcMetaTablesRequest; import org.apache.ignite.internal.processors.odbc.jdbc.JdbcMetaTablesResult; import org.apache.ignite.internal.processors.odbc.jdbc.JdbcQueryCloseRequest; @@ -50,7 +52,6 @@ import org.apache.ignite.internal.processors.odbc.jdbc.JdbcRequest; import org.apache.ignite.internal.processors.odbc.jdbc.JdbcResponse; import org.apache.ignite.internal.processors.odbc.jdbc.JdbcResult; -import org.apache.ignite.internal.util.ipc.IpcEndpoint; import org.apache.ignite.internal.util.ipc.loopback.IpcClientTcpEndpoint; import org.apache.ignite.internal.util.typedef.internal.U; @@ -332,6 +333,17 @@ public JdbcMetaParamsResult parametersMeta(String schema, String sql) throws IOE return sendRequest(new JdbcMetaParamsRequest(schema, sql), DYNAMIC_SIZE_MSG_CAP); } + /** + * @param schema Schema. + * @param tbl Table. + * @return Result. + * @throws IOException On error. + * @throws IgniteCheckedException On error. + */ + public JdbcMetaPrimaryKeysResult primaryKeysMeta(String schema, String tbl) throws IOException, IgniteCheckedException { + return sendRequest(new JdbcMetaPrimaryKeysRequest(schema, tbl), DYNAMIC_SIZE_MSG_CAP); + } + /** * @param req ODBC request. * @throws IOException On error. diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcIndexMeta.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcIndexMeta.java index b9fed483418e7..7cbb0c3654be6 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcIndexMeta.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcIndexMeta.java @@ -21,7 +21,6 @@ import org.apache.ignite.cache.QueryIndexType; import org.apache.ignite.internal.binary.BinaryReaderExImpl; import org.apache.ignite.internal.binary.BinaryWriterExImpl; -import org.apache.ignite.internal.binary.GridBinaryMarshaller; import org.apache.ignite.internal.processors.query.GridQueryIndexDescriptor; /** @@ -154,6 +153,7 @@ public boolean[] fieldsAsc() { @Override public boolean equals(Object o) { if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; @@ -161,8 +161,10 @@ public boolean[] fieldsAsc() { if (schema != null ? !schema.equals(meta.schema) : meta.schema != null) return false; + if (!tbl.equals(meta.tbl)) return false; + return name.equals(meta.name); } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaPrimaryKeysResult.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaPrimaryKeysResult.java index 3c1d9161f7d3e..15fa04b9b60b3 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaPrimaryKeysResult.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaPrimaryKeysResult.java @@ -18,10 +18,9 @@ package org.apache.ignite.internal.processors.odbc.jdbc; import java.util.ArrayList; +import java.util.Collection; import java.util.Collections; -import java.util.HashMap; import java.util.List; -import java.util.Map; import org.apache.ignite.binary.BinaryObjectException; import org.apache.ignite.internal.binary.BinaryReaderExImpl; import org.apache.ignite.internal.binary.BinaryWriterExImpl; @@ -32,7 +31,7 @@ */ public class JdbcMetaPrimaryKeysResult extends JdbcResult { /** Query result rows. */ - private Map tblsPks; + private List meta; /** * Default constructor is used for deserialization. @@ -44,19 +43,23 @@ public class JdbcMetaPrimaryKeysResult extends JdbcResult { /** * @param meta Column metadata. */ - JdbcMetaPrimaryKeysResult(List meta) { + JdbcMetaPrimaryKeysResult(Collection meta) { super(META_PRIMARY_KEYS); + + this.meta = new ArrayList<>(meta); } /** {@inheritDoc} */ @Override public void writeBinary(BinaryWriterExImpl writer) throws BinaryObjectException { super.writeBinary(writer); - if (F.isEmpty(tblsPks)) + if (F.isEmpty(meta)) writer.writeInt(0); else { - writer.writeInt(tblsPks.size()); + writer.writeInt(meta.size()); + for(JdbcPrimaryKeyMeta m : meta) + m.writeBinary(writer); } } @@ -67,19 +70,24 @@ public class JdbcMetaPrimaryKeysResult extends JdbcResult { int size = reader.readInt(); if (size == 0) - tblsPks = Collections.emptyMap(); + meta = Collections.emptyList(); else { - tblsPks = new HashMap<>(size); + meta = new ArrayList<>(size); for (int i = 0; i < size; ++i) { + JdbcPrimaryKeyMeta m = new JdbcPrimaryKeyMeta(); + + m.readBinary(reader); + + meta.add(m); } } } /** - * @return Primary keys map. + * @return Primary keys meta. */ - public Map primaryKeys() { - return tblsPks; + public List meta() { + return meta; } } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcPrimaryKeyMeta.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcPrimaryKeyMeta.java index 3e316aa7f74f9..8b0caaeea6ce4 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcPrimaryKeyMeta.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcPrimaryKeyMeta.java @@ -18,11 +18,8 @@ package org.apache.ignite.internal.processors.odbc.jdbc; import org.apache.ignite.binary.BinaryObjectException; -import org.apache.ignite.cache.QueryIndexType; import org.apache.ignite.internal.binary.BinaryReaderExImpl; import org.apache.ignite.internal.binary.BinaryWriterExImpl; -import org.apache.ignite.internal.processors.query.GridQueryFieldMetadata; -import org.apache.ignite.internal.processors.query.GridQueryIndexDescriptor; /** * JDBC index metadata. @@ -37,7 +34,7 @@ public class JdbcPrimaryKeyMeta implements JdbcRawBinarylizable { /** Primary key name. */ private String name; - /** Index fields */ + /** Primary key fields. */ private String[] fields; /** @@ -48,10 +45,16 @@ public class JdbcPrimaryKeyMeta implements JdbcRawBinarylizable { } /** - * @param idx Index info. + * @param schema Schema. + * @param tbl Table. + * @param name Name. + * @param fields Primary key fields. */ - JdbcPrimaryKeyMeta(GridQueryFieldMetadata idx) { - + JdbcPrimaryKeyMeta(String schema, String tbl, String name, String [] fields) { + this.schema = schema; + this.tbl = tbl; + this.name = name; + this.fields = fields; } /** @@ -109,11 +112,20 @@ public String[] fields() { JdbcPrimaryKeyMeta meta = (JdbcPrimaryKeyMeta)o; + if (schema != null ? !schema.equals(meta.schema) : meta.schema != null) + return false; + + if (!tbl.equals(meta.tbl)) + return false; + return name.equals(meta.name); } /** {@inheritDoc} */ @Override public int hashCode() { - return name.hashCode(); + int result = schema != null ? schema.hashCode() : 0; + result = 31 * result + tbl.hashCode(); + result = 31 * result + name.hashCode(); + return result; } } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcRequestHandler.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcRequestHandler.java index bca5b885d51ff..1ccf410725067 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcRequestHandler.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcRequestHandler.java @@ -18,27 +18,22 @@ package org.apache.ignite.internal.processors.odbc.jdbc; import java.sql.ParameterMetaData; -import java.sql.PreparedStatement; import java.util.ArrayList; import java.util.Collection; import java.util.HashSet; +import java.util.List; import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.atomic.AtomicLong; import org.apache.ignite.IgniteCache; import org.apache.ignite.IgniteLogger; import org.apache.ignite.cache.query.SqlFieldsQuery; import org.apache.ignite.internal.GridKernalContext; import org.apache.ignite.internal.processors.cache.QueryCursorImpl; -import org.apache.ignite.internal.processors.odbc.OdbcUtils; import org.apache.ignite.internal.processors.odbc.SqlListenerRequest; import org.apache.ignite.internal.processors.odbc.SqlListenerRequestHandler; import org.apache.ignite.internal.processors.odbc.SqlListenerResponse; -import org.apache.ignite.internal.processors.odbc.odbc.OdbcColumnMeta; import org.apache.ignite.internal.processors.odbc.odbc.OdbcQueryGetColumnsMetaRequest; -import org.apache.ignite.internal.processors.odbc.odbc.OdbcQueryGetColumnsMetaResult; -import org.apache.ignite.internal.processors.odbc.odbc.OdbcQueryGetTablesMetaRequest; -import org.apache.ignite.internal.processors.odbc.odbc.OdbcQueryGetTablesMetaResult; -import org.apache.ignite.internal.processors.odbc.odbc.OdbcResponse; -import org.apache.ignite.internal.processors.odbc.odbc.OdbcTableMeta; import org.apache.ignite.internal.processors.query.GridQueryIndexDescriptor; import org.apache.ignite.internal.processors.query.GridQueryTypeDescriptor; import org.apache.ignite.internal.util.GridSpinBusyLock; @@ -46,10 +41,6 @@ import org.apache.ignite.internal.util.typedef.internal.S; import org.apache.ignite.internal.util.typedef.internal.U; -import java.util.List; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.atomic.AtomicLong; - import static org.apache.ignite.internal.processors.odbc.jdbc.JdbcRequest.META_COLUMNS; import static org.apache.ignite.internal.processors.odbc.jdbc.JdbcRequest.META_INDEXES; import static org.apache.ignite.internal.processors.odbc.jdbc.JdbcRequest.META_PARAMS; @@ -527,17 +518,27 @@ private SqlListenerResponse getPrimaryKeys(JdbcMetaPrimaryKeysRequest req) { Collection tablesMeta = ctx.query().types(cacheName); - Collection meta = new HashSet<>(); + Collection meta = new HashSet<>(); for (GridQueryTypeDescriptor table : tablesMeta) { if (!matches(table.name(), tableName)) continue; - for (GridQueryIndexDescriptor idxDesc : table.indexes().values()) - meta.add(new JdbcIndexMeta(cacheName, table.name(), idxDesc)); + List fields = new ArrayList<>(); + + for (String field : table.fields().keySet()) { + if (table.property(field).key()) + fields.add(field); + } + + if (fields.isEmpty()) + meta.add(new JdbcPrimaryKeyMeta(cacheName, table.name(), "_KEY", new String[] {"_KEY"})); + else + meta.add(new JdbcPrimaryKeyMeta(cacheName, table.name(), table.keyFieldName(), + fields.toArray(new String[fields.size()]))); } - return new JdbcResponse(new JdbcMetaIndexesResult(meta)); + return new JdbcResponse(new JdbcMetaPrimaryKeysResult(meta)); } catch (Exception e) { U.error(log, "Failed to get parameters metadata [reqId=" + req.requestId() + ", req=" + req + ']', e); From 144b92d75db9ccd870d80df405aed340a4a46f35 Mon Sep 17 00:00:00 2001 From: tledkov-gridgain Date: Mon, 5 Jun 2017 17:39:03 +0300 Subject: [PATCH 08/32] IGNITE-5233: minors --- .../ignite/internal/jdbc/thin/JdbcThinParameterMetaData.java | 1 - .../processors/odbc/jdbc/JdbcMetaPrimaryKeysRequest.java | 2 +- .../processors/odbc/jdbc/JdbcMetaPrimaryKeysResult.java | 2 +- .../internal/processors/odbc/jdbc/JdbcMetaTablesResult.java | 2 +- .../ignite/internal/processors/odbc/jdbc/JdbcParamMeta.java | 4 +--- .../internal/processors/odbc/jdbc/JdbcPrimaryKeyMeta.java | 2 +- .../internal/processors/odbc/jdbc/JdbcQueryCloseRequest.java | 2 +- .../processors/odbc/jdbc/JdbcQueryExecuteRequest.java | 2 +- .../internal/processors/odbc/jdbc/JdbcQueryExecuteResult.java | 2 +- .../internal/processors/odbc/jdbc/JdbcQueryFetchRequest.java | 2 +- .../internal/processors/odbc/jdbc/JdbcQueryFetchResult.java | 2 +- .../processors/odbc/jdbc/JdbcQueryMetadataRequest.java | 2 +- .../processors/odbc/jdbc/JdbcQueryMetadataResult.java | 2 +- .../ignite/internal/processors/odbc/jdbc/JdbcRequest.java | 2 +- .../internal/processors/odbc/jdbc/JdbcRequestHandler.java | 2 +- .../ignite/internal/processors/odbc/jdbc/JdbcResult.java | 2 +- 16 files changed, 15 insertions(+), 18 deletions(-) diff --git a/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinParameterMetaData.java b/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinParameterMetaData.java index 15b2a26799544..e4fb34065e92d 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinParameterMetaData.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinParameterMetaData.java @@ -18,7 +18,6 @@ package org.apache.ignite.internal.jdbc.thin; import java.sql.ParameterMetaData; -import java.sql.PreparedStatement; import java.sql.SQLException; import java.util.List; import org.apache.ignite.internal.processors.odbc.jdbc.JdbcParamMeta; diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaPrimaryKeysRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaPrimaryKeysRequest.java index 3cc1447a2b0eb..d04be84fdceef 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaPrimaryKeysRequest.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaPrimaryKeysRequest.java @@ -24,7 +24,7 @@ import org.jetbrains.annotations.Nullable; /** - * JDBC get columns metadata request. + * JDBC get primary keys metadata request. */ public class JdbcMetaPrimaryKeysRequest extends JdbcRequest { /** Cache name. */ diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaPrimaryKeysResult.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaPrimaryKeysResult.java index 15fa04b9b60b3..8f322b5ddb111 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaPrimaryKeysResult.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaPrimaryKeysResult.java @@ -27,7 +27,7 @@ import org.apache.ignite.internal.util.typedef.F; /** - * JDBC tables metadata request. + * JDBC primary keys metadata result. */ public class JdbcMetaPrimaryKeysResult extends JdbcResult { /** Query result rows. */ diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaTablesResult.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaTablesResult.java index cce3cbedf418c..a1d7892f2a7b9 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaTablesResult.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaTablesResult.java @@ -26,7 +26,7 @@ import org.apache.ignite.internal.util.typedef.F; /** - * JDBC tables metadata request. + * JDBC tables metadata result. */ public class JdbcMetaTablesResult extends JdbcResult { /** Query result rows. */ diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcParamMeta.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcParamMeta.java index babf6721979e9..cbe8f82d95855 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcParamMeta.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcParamMeta.java @@ -20,13 +20,11 @@ import java.sql.ParameterMetaData; import java.sql.SQLException; import org.apache.ignite.binary.BinaryObjectException; -import org.apache.ignite.cache.QueryIndexType; import org.apache.ignite.internal.binary.BinaryReaderExImpl; import org.apache.ignite.internal.binary.BinaryWriterExImpl; -import org.apache.ignite.internal.processors.query.GridQueryIndexDescriptor; /** - * JDBC parameter metadata + * JDBC SQL query parameter metadata. * * {@see java.sql.ParameterMetaData}. */ diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcPrimaryKeyMeta.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcPrimaryKeyMeta.java index 8b0caaeea6ce4..5b4d5815fafd0 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcPrimaryKeyMeta.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcPrimaryKeyMeta.java @@ -22,7 +22,7 @@ import org.apache.ignite.internal.binary.BinaryWriterExImpl; /** - * JDBC index metadata. + * JDBC primary key metadata. */ public class JdbcPrimaryKeyMeta implements JdbcRawBinarylizable { /** Cache name. */ diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcQueryCloseRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcQueryCloseRequest.java index cccc3f811b822..872889ca9b775 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcQueryCloseRequest.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcQueryCloseRequest.java @@ -23,7 +23,7 @@ import org.apache.ignite.internal.util.typedef.internal.S; /** - * SQL listener query close request. + * JDBC query close request. */ public class JdbcQueryCloseRequest extends JdbcRequest { /** Query ID. */ diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcQueryExecuteRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcQueryExecuteRequest.java index 79e9e574bbbef..37d065f85ff8b 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcQueryExecuteRequest.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcQueryExecuteRequest.java @@ -27,7 +27,7 @@ import org.jetbrains.annotations.Nullable; /** - * SQL listener query execute request. + * JDBC query execute request. */ public class JdbcQueryExecuteRequest extends JdbcRequest { /** Cache name. */ diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcQueryExecuteResult.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcQueryExecuteResult.java index 54e4e5abcfc0d..dc681b707e30b 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcQueryExecuteResult.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcQueryExecuteResult.java @@ -23,7 +23,7 @@ import org.apache.ignite.internal.binary.BinaryWriterExImpl; /** - * SQL listener query execute result. + * JDBC query execute result. */ public class JdbcQueryExecuteResult extends JdbcResult { /** Query ID. */ diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcQueryFetchRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcQueryFetchRequest.java index 8d811c2fb3491..776c3bfa85438 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcQueryFetchRequest.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcQueryFetchRequest.java @@ -23,7 +23,7 @@ import org.apache.ignite.internal.util.typedef.internal.S; /** - * SQL listener query fetch request. + * JDBC query fetch request. */ public class JdbcQueryFetchRequest extends JdbcRequest { /** Query ID. */ diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcQueryFetchResult.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcQueryFetchResult.java index ea082b9afe200..c941940a5aae5 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcQueryFetchResult.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcQueryFetchResult.java @@ -23,7 +23,7 @@ import org.apache.ignite.internal.binary.BinaryWriterExImpl; /** - * SQL listener query fetch result. + * JDBC query fetch result. */ public class JdbcQueryFetchResult extends JdbcResult { /** Query result rows. */ diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcQueryMetadataRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcQueryMetadataRequest.java index b428480bc7d43..bdef321abe678 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcQueryMetadataRequest.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcQueryMetadataRequest.java @@ -23,7 +23,7 @@ import org.apache.ignite.internal.util.typedef.internal.S; /** - * SQL listener query metadata request. + * JDBC query metadata request. */ public class JdbcQueryMetadataRequest extends JdbcRequest { /** Query ID. */ diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcQueryMetadataResult.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcQueryMetadataResult.java index a459936c27e15..cf232d6b51f17 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcQueryMetadataResult.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcQueryMetadataResult.java @@ -26,7 +26,7 @@ import org.apache.ignite.internal.util.typedef.F; /** - * SQL listener query metadata result. + * JDBC query metadata result. */ public class JdbcQueryMetadataResult extends JdbcResult { /** Fields metadata. */ diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcRequest.java index 06f75806df757..3d3e90914120c 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcRequest.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcRequest.java @@ -24,7 +24,7 @@ import org.apache.ignite.internal.processors.odbc.SqlListenerRequest; /** - * SQL listener command request. + * JDBC request. */ public class JdbcRequest extends SqlListenerRequest implements JdbcRawBinarylizable { /** Execute sql query request. */ diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcRequestHandler.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcRequestHandler.java index 1ccf410725067..601ed9b1b7ea2 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcRequestHandler.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcRequestHandler.java @@ -52,7 +52,7 @@ import static org.apache.ignite.internal.processors.odbc.jdbc.JdbcRequest.QRY_META; /** - * SQL query handler. + * JDBC request handler. */ public class JdbcRequestHandler implements SqlListenerRequestHandler { /** Query ID sequence. */ diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcResult.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcResult.java index 06e2993ef3107..f5bea44232dc2 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcResult.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcResult.java @@ -23,7 +23,7 @@ import org.apache.ignite.internal.binary.BinaryWriterExImpl; /** - * SQL listener response. + * JDBS response result. */ public class JdbcResult implements JdbcRawBinarylizable { /** Execute sql result. */ From 74768df17937e9395230627ebde253591b8dd94a Mon Sep 17 00:00:00 2001 From: tledkov-gridgain Date: Mon, 5 Jun 2017 18:01:15 +0300 Subject: [PATCH 09/32] IGNITE-5233: minors --- .../ignite/internal/processors/odbc/jdbc/JdbcTableMeta.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcTableMeta.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcTableMeta.java index 795bf8e461eec..0e878fa066572 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcTableMeta.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcTableMeta.java @@ -20,7 +20,6 @@ import org.apache.ignite.binary.BinaryObjectException; import org.apache.ignite.internal.binary.BinaryReaderExImpl; import org.apache.ignite.internal.binary.BinaryWriterExImpl; -import org.apache.ignite.internal.processors.odbc.OdbcUtils; /** * JDBC table metadata. @@ -52,7 +51,7 @@ public class JdbcTableMeta implements JdbcRawBinarylizable { */ JdbcTableMeta(String catalog, String schema, String tbl, String tblType) { this.catalog = catalog; - this.schema = OdbcUtils.addQuotationMarksIfNeeded(schema); + this.schema = schema; this.tbl = tbl; this.tblType = tblType; } From a8278e67ee7e67fc7e04ca93fbf5cc7d70aba428 Mon Sep 17 00:00:00 2001 From: tledkov-gridgain Date: Wed, 2 Aug 2017 14:55:44 +0300 Subject: [PATCH 10/32] IGNITE-5233: support getSchemas --- .../jdbc/thin/JdbcThinMetadataSelfTest.java | 45 +++++++++++ .../jdbc/thin/JdbcThinDatabaseMetadata.java | 78 +++++++++---------- .../internal/jdbc/thin/JdbcThinTcpIo.java | 17 +++- .../odbc/jdbc/JdbcMetaSchemasRequest.java | 73 +++++++++++++++++ .../odbc/jdbc/JdbcMetaSchemasResult.java | 69 ++++++++++++++++ .../processors/odbc/jdbc/JdbcRequest.java | 8 ++ .../odbc/jdbc/JdbcRequestHandler.java | 33 +++++++- .../processors/odbc/jdbc/JdbcResult.java | 8 ++ 8 files changed, 290 insertions(+), 41 deletions(-) create mode 100644 modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaSchemasRequest.java create mode 100644 modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaSchemasResult.java diff --git a/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinMetadataSelfTest.java b/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinMetadataSelfTest.java index f165102101e54..fe08d860422dc 100644 --- a/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinMetadataSelfTest.java +++ b/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinMetadataSelfTest.java @@ -31,7 +31,9 @@ import java.util.Arrays; import java.util.Collection; import java.util.Collections; +import java.util.HashSet; import java.util.LinkedHashMap; +import java.util.Set; import org.apache.ignite.IgniteCache; import org.apache.ignite.cache.QueryEntity; import org.apache.ignite.cache.QueryIndex; @@ -421,6 +423,49 @@ public void testParametersMetadata() throws Exception { } } + /** + * @throws Exception If failed. + */ + public void testSchemasMetadata() throws Exception { + try (Connection conn = DriverManager.getConnection(URL)) { + ResultSet rs = conn.getMetaData().getSchemas(); + + Set expectedSchemas = new HashSet<>(Arrays.asList("PUBLIC", "PERS", "ORG")); + + Set schemas = new HashSet<>(); + + while (rs.next()) { + schemas.add(rs.getString(1)); + + assert rs.getString(2) == null; + } + + assert expectedSchemas.equals(schemas) : "Unexpected schemas: " + schemas + + ". Expected schemas: " + expectedSchemas; + } + catch (Exception e) { + log.error("Unexpected exception", e); + + fail(); + } + } + + /** + * @throws Exception If failed. + */ + public void testEmptySchemasMetadata() throws Exception { + try (Connection conn = DriverManager.getConnection(URL)) { + ResultSet rs = conn.getMetaData().getSchemas(null, "qqq"); + + assert !rs.next() : " Empty result set is expected"; + } + catch (Exception e) { + log.error("Unexpected exception", e); + + fail(); + } + } + /** * Person. */ diff --git a/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinDatabaseMetadata.java b/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinDatabaseMetadata.java index e5f2dc39325db..250706bb5f2af 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinDatabaseMetadata.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinDatabaseMetadata.java @@ -35,6 +35,7 @@ import org.apache.ignite.internal.processors.odbc.jdbc.JdbcMetaColumnsResult; import org.apache.ignite.internal.processors.odbc.jdbc.JdbcMetaIndexesResult; import org.apache.ignite.internal.processors.odbc.jdbc.JdbcMetaPrimaryKeysResult; +import org.apache.ignite.internal.processors.odbc.jdbc.JdbcMetaSchemasResult; import org.apache.ignite.internal.processors.odbc.jdbc.JdbcMetaTablesResult; import org.apache.ignite.internal.processors.odbc.jdbc.JdbcPrimaryKeyMeta; import org.apache.ignite.internal.processors.odbc.jdbc.JdbcTableMeta; @@ -1185,21 +1186,36 @@ private List> indexRows(JdbcIndexMeta idxMeta) { /** {@inheritDoc} */ @Override public ResultSet getSchemas(String catalog, String schemaPtrn) throws SQLException { - // TODO: impl -// List> rows = new ArrayList<>(meta.size()); -// -// for (String schema : meta.keySet()) -// if (matches(schema, schemaPtrn)) -// rows.add(Arrays.asList(schema, (String)null)); -// -// return new JdbcThinResultSet( -// conn.createStatement0(), -// Collections.emptyList(), -// Arrays.asList("TABLE_SCHEM", "TABLE_CATALOG"), -// Arrays.asList(String.class.getName(), String.class.getName()), -// rows -// ); - return emptyResultSet(); + try { + if (conn.isClosed()) + throw new SQLException("Connection is closed."); + + JdbcMetaSchemasResult res = conn.io().schemasMeta(schemaPtrn); + + List> rows = new LinkedList<>(); + + for (String schema : res.schemas()) { + List row = new ArrayList<>(2); + + row.add(upperCase(schema)); + row.add(null); + + rows.add(row); + } + + return new JdbcThinResultSet(rows, Arrays.asList( + new JdbcColumnMeta(null, null, "TABLE_SCHEM", String.class), + new JdbcColumnMeta(null, null, "TABLE_CATALOG", String.class) + )); + } + catch (IOException e) { + conn.close(); + + throw new SQLException("Failed to query Ignite.", e); + } + catch (IgniteCheckedException e) { + throw new SQLException("Failed to query Ignite.", e); + } } /** {@inheritDoc} */ @@ -1221,18 +1237,14 @@ private List> indexRows(JdbcIndexMeta idxMeta) { @Override public ResultSet getFunctions(String catalog, String schemaPtrn, String functionNamePtrn) throws SQLException { - // TODO: impl -// return new JdbcThinResultSet( -// conn.createStatement0(), -// Collections.emptyList(), -// Arrays.asList("FUNCTION_CAT", "FUNCTION_SCHEM", "FUNCTION_NAME", -// "REMARKS", "FUNCTION_TYPE", "SPECIFIC_NAME"), -// Arrays.asList(String.class.getName(), String.class.getName(), String.class.getName(), -// String.class.getName(), Short.class.getName(), String.class.getName()), -// Collections.>emptyList() -// ); - - return emptyResultSet(); + return new JdbcThinResultSet(Collections.>emptyList(), Arrays.asList( + new JdbcColumnMeta(null, null, "FUNCTION_CAT", String.class), + new JdbcColumnMeta(null, null, "FUNCTION_SCHEM", String.class), + new JdbcColumnMeta(null, null, "FUNCTION_NAME", String.class), + new JdbcColumnMeta(null, null, "REMARKS", String.class), + new JdbcColumnMeta(null, null, "FUNCTION_TYPE", String.class), + new JdbcColumnMeta(null, null, "SPECIFIC_NAME", String.class) + )); } /** {@inheritDoc} */ @@ -1283,16 +1295,4 @@ private List> indexRows(JdbcIndexMeta idxMeta) { @Override public boolean generatedKeyAlwaysReturned() throws SQLException { return false; } - - /** - * Checks whether string matches SQL pattern. - * - * @param str String. - * @param ptrn Pattern. - * @return Whether string matches pattern. - */ - private boolean matches(String str, String ptrn) { - return str != null && (ptrn == null || - str.toUpperCase().matches(ptrn.toUpperCase().replace("%", ".*").replace("_", "."))); - } } \ No newline at end of file diff --git a/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinTcpIo.java b/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinTcpIo.java index 9f2128c168802..7bb1c958fcebd 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinTcpIo.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinTcpIo.java @@ -40,6 +40,8 @@ import org.apache.ignite.internal.processors.odbc.jdbc.JdbcMetaParamsResult; import org.apache.ignite.internal.processors.odbc.jdbc.JdbcMetaPrimaryKeysRequest; import org.apache.ignite.internal.processors.odbc.jdbc.JdbcMetaPrimaryKeysResult; +import org.apache.ignite.internal.processors.odbc.jdbc.JdbcMetaSchemasRequest; +import org.apache.ignite.internal.processors.odbc.jdbc.JdbcMetaSchemasResult; import org.apache.ignite.internal.processors.odbc.jdbc.JdbcMetaTablesRequest; import org.apache.ignite.internal.processors.odbc.jdbc.JdbcMetaTablesResult; import org.apache.ignite.internal.processors.odbc.jdbc.JdbcQueryCloseRequest; @@ -65,9 +67,12 @@ public class JdbcThinTcpIo { /** Initial output stream capacity for handshake. */ private static final int HANDSHAKE_MSG_SIZE = 13; - /** Initial output for query message. */ + /** Initial output size for messages with unknown size. */ private static final int DYNAMIC_SIZE_MSG_CAP = 1024; + /** Initial output size for short messages with unknown size. */ + private static final int DYNAMIC_SIZE_MSG_CAP_256 = 256; + /** Initial output for query fetch message. */ private static final int QUERY_FETCH_MSG_SIZE = 13; @@ -362,6 +367,16 @@ public JdbcMetaPrimaryKeysResult primaryKeysMeta(String schema, String tbl) thro return sendRequest(new JdbcMetaPrimaryKeysRequest(schema, tbl), DYNAMIC_SIZE_MSG_CAP); } + /** + * @param schemaPtrn Schema. + * @return Result. + * @throws IOException On error. + * @throws IgniteCheckedException On error. + */ + public JdbcMetaSchemasResult schemasMeta(String schemaPtrn) throws IOException, IgniteCheckedException { + return sendRequest(new JdbcMetaSchemasRequest(schemaPtrn), DYNAMIC_SIZE_MSG_CAP_256); + } + /** * @param req ODBC request. * @throws IOException On error. diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaSchemasRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaSchemasRequest.java new file mode 100644 index 0000000000000..b830687f91114 --- /dev/null +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaSchemasRequest.java @@ -0,0 +1,73 @@ +/* + * 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 org.apache.ignite.internal.processors.odbc.jdbc; + +import org.apache.ignite.binary.BinaryObjectException; +import org.apache.ignite.internal.binary.BinaryReaderExImpl; +import org.apache.ignite.internal.binary.BinaryWriterExImpl; +import org.apache.ignite.internal.util.typedef.internal.S; + +/** + * JDBC tables metadata request. + */ +public class JdbcMetaSchemasRequest extends JdbcRequest { + /** Schema search pattern. */ + private String schema; + + /** + * Default constructor is used for deserialization. + */ + JdbcMetaSchemasRequest() { + super(META_SCHEMAS); + } + + /** + * @param schema Schema search pattern. + */ + public JdbcMetaSchemasRequest(String schema) { + super(META_SCHEMAS); + + this.schema = schema; + } + + /** + * @return Schema search pattern. + */ + public String schema() { + return schema; + } + + /** {@inheritDoc} */ + @Override public void writeBinary(BinaryWriterExImpl writer) throws BinaryObjectException { + super.writeBinary(writer); + + writer.writeString(schema); + } + + /** {@inheritDoc} */ + @Override public void readBinary(BinaryReaderExImpl reader) throws BinaryObjectException { + super.readBinary(reader); + + this.schema = reader.readString(); + } + + /** {@inheritDoc} */ + @Override public String toString() { + return S.toString(JdbcMetaSchemasRequest.class, this); + } +} \ No newline at end of file diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaSchemasResult.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaSchemasResult.java new file mode 100644 index 0000000000000..c988e85ad7ea2 --- /dev/null +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaSchemasResult.java @@ -0,0 +1,69 @@ +/* + * 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 org.apache.ignite.internal.processors.odbc.jdbc; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import org.apache.ignite.binary.BinaryObjectException; +import org.apache.ignite.internal.binary.BinaryReaderExImpl; +import org.apache.ignite.internal.binary.BinaryWriterExImpl; + +/** + * JDBC tables metadata result. + */ +public class JdbcMetaSchemasResult extends JdbcResult { + /** Query result rows. */ + private List schemas; + + /** + * Default constructor is used for deserialization. + */ + JdbcMetaSchemasResult() { + super(META_SCHEMAS); + } + + /** + * @param schemas Found schemas. + */ + JdbcMetaSchemasResult(List schemas) { + super(META_SCHEMAS); + this.schemas = schemas; + } + + /** {@inheritDoc} */ + @Override public void writeBinary(BinaryWriterExImpl writer) throws BinaryObjectException { + super.writeBinary(writer); + + writer.writeStringArray(schemas.toArray(new String[schemas.size()])); + } + + /** {@inheritDoc} */ + @Override public void readBinary(BinaryReaderExImpl reader) throws BinaryObjectException { + super.readBinary(reader); + + schemas = new ArrayList<>(Arrays.asList(reader.readStringArray())); + } + + /** + * @return Query result rows. + */ + public List schemas() { + return schemas; + } +} diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcRequest.java index 3d3e90914120c..a5b303859ae84 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcRequest.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcRequest.java @@ -54,6 +54,9 @@ public class JdbcRequest extends SqlListenerRequest implements JdbcRawBinaryliza /** Get primary keys metadata request. */ static final byte META_PRIMARY_KEYS = 10; + /** Get schemas metadata request. */ + static final byte META_SCHEMAS = 11; + /** Request type. */ private byte type; @@ -137,6 +140,11 @@ public static JdbcRequest readRequest(BinaryReaderExImpl reader) throws BinaryOb break; + case META_SCHEMAS: + req = new JdbcMetaSchemasRequest(); + + break; + default: throw new IgniteException("Unknown SQL listener request ID: [request ID=" + reqType + ']'); } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcRequestHandler.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcRequestHandler.java index 53adf9dfb5344..55a73484be7de 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcRequestHandler.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcRequestHandler.java @@ -46,6 +46,7 @@ import static org.apache.ignite.internal.processors.odbc.jdbc.JdbcRequest.META_INDEXES; import static org.apache.ignite.internal.processors.odbc.jdbc.JdbcRequest.META_PARAMS; import static org.apache.ignite.internal.processors.odbc.jdbc.JdbcRequest.META_PRIMARY_KEYS; +import static org.apache.ignite.internal.processors.odbc.jdbc.JdbcRequest.META_SCHEMAS; import static org.apache.ignite.internal.processors.odbc.jdbc.JdbcRequest.META_TABLES; import static org.apache.ignite.internal.processors.odbc.jdbc.JdbcRequest.QRY_CLOSE; import static org.apache.ignite.internal.processors.odbc.jdbc.JdbcRequest.QRY_EXEC; @@ -156,6 +157,9 @@ public JdbcRequestHandler(GridKernalContext ctx, GridSpinBusyLock busyLock, int case META_PRIMARY_KEYS: return getPrimaryKeys((JdbcMetaPrimaryKeysRequest)req); + + case META_SCHEMAS: + return getSchemas((JdbcMetaSchemasRequest)req); } return new JdbcResponse(SqlListenerResponse.STATUS_FAILED, "Unsupported JDBC request [req=" + req + ']'); @@ -345,7 +349,7 @@ private JdbcResponse getTablesMeta(JdbcMetaTablesRequest req) { String realSchema = req.schema(); - for (String cacheName : ctx.cache().cacheNames()) + for (String cacheName : ctx.cache().publicCacheNames()) { if (!matches(cacheName, realSchema)) continue; @@ -571,6 +575,33 @@ private SqlListenerResponse getPrimaryKeys(JdbcMetaPrimaryKeysRequest req) { } } + /** + * @param req Request. + * @return Response. + */ + private SqlListenerResponse getSchemas(JdbcMetaSchemasRequest req) { + try { + String schemaPtrn = req.schema(); + + List schemas = new ArrayList<>(); + + if (matches(QueryUtils.DFLT_SCHEMA, schemaPtrn)) + schemas.add(QueryUtils.DFLT_SCHEMA); + + for (String cacheName : ctx.cache().publicCacheNames()) { + if (matches(cacheName, schemaPtrn)) + schemas.add(cacheName); + } + + return new JdbcResponse(new JdbcMetaSchemasResult(schemas)); + } + catch (Exception e) { + U.error(log, "Failed to get parameters metadata [reqId=" + req.requestId() + ", req=" + req + ']', e); + + return new JdbcResponse(SqlListenerResponse.STATUS_FAILED, e.toString()); + } + } + /** * Checks whether string matches SQL pattern. * diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcResult.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcResult.java index f5bea44232dc2..22f183d288655 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcResult.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcResult.java @@ -50,6 +50,9 @@ public class JdbcResult implements JdbcRawBinarylizable { /** Primary keys metadata result. */ static final byte META_PRIMARY_KEYS = 10; + /** Primary keys metadata result. */ + static final byte META_SCHEMAS = 11; + /** Success status. */ private byte type; @@ -123,6 +126,11 @@ public static JdbcResult readResult(BinaryReaderExImpl reader) throws BinaryObje break; + case META_SCHEMAS: + res = new JdbcMetaSchemasResult(); + + break; + default: throw new IgniteException("Unknown SQL listener request ID: [request ID=" + resId + ']'); } From a323ea9957e0a6f652164120320d185c4abbe12c Mon Sep 17 00:00:00 2001 From: tledkov-gridgain Date: Fri, 4 Aug 2017 13:08:42 +0300 Subject: [PATCH 11/32] IGNITE-5233: remove test testMetadataResultSetClose --- .../jdbc/thin/JdbcThinMetadataSelfTest.java | 20 ------------------- 1 file changed, 20 deletions(-) diff --git a/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinMetadataSelfTest.java b/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinMetadataSelfTest.java index fe08d860422dc..4b893c44757d5 100644 --- a/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinMetadataSelfTest.java +++ b/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinMetadataSelfTest.java @@ -307,26 +307,6 @@ public void testGetColumns() throws Exception { } } - /** - * @throws Exception If failed. - */ - public void testMetadataResultSetClose() throws Exception { - try (Connection conn = DriverManager.getConnection(URL); - ResultSet tbls = conn.getMetaData().getTables(null, null, "%", null)) { - int colCnt = tbls.getMetaData().getColumnCount(); - - while (tbls.next()) { - for (int i = 0; i < colCnt; i++) - tbls.getObject(i + 1); - } - } - catch (Exception e) { - log.error("Unexpected exception", e); - - fail(); - } - } - /** * @throws Exception If failed. */ From 189af8589919a8b12e6f08872420d79230c2df70 Mon Sep 17 00:00:00 2001 From: tledkov-gridgain Date: Fri, 4 Aug 2017 15:03:03 +0300 Subject: [PATCH 12/32] IGNITE-5233: minors --- .../org/apache/ignite/jdbc/thin/JdbcThinMetadataSelfTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinMetadataSelfTest.java b/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinMetadataSelfTest.java index 4b893c44757d5..076568d4d64e3 100644 --- a/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinMetadataSelfTest.java +++ b/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinMetadataSelfTest.java @@ -437,7 +437,7 @@ public void testEmptySchemasMetadata() throws Exception { try (Connection conn = DriverManager.getConnection(URL)) { ResultSet rs = conn.getMetaData().getSchemas(null, "qqq"); - assert !rs.next() : " Empty result set is expected"; + assert !rs.next() : "Empty result set is expected"; } catch (Exception e) { log.error("Unexpected exception", e); From 262f820df6c694831cbc27fde18afba21b6e4873 Mon Sep 17 00:00:00 2001 From: tledkov-gridgain Date: Mon, 7 Aug 2017 15:20:07 +0300 Subject: [PATCH 13/32] IGNITE-5233: fix review comments --- .../jdbc/thin/JdbcThinMetadataSelfTest.java | 122 ++++++++++++++- .../jdbc/thin/JdbcThinDatabaseMetadata.java | 50 +++--- .../jdbc/thin/JdbcThinParameterMetaData.java | 2 +- .../processors/odbc/jdbc/JdbcIndexMeta.java | 4 + .../odbc/jdbc/JdbcMetaColumnsRequest.java | 4 +- .../odbc/jdbc/JdbcMetaIndexesResult.java | 1 - .../odbc/jdbc/JdbcRequestHandler.java | 144 ++++++++---------- .../processors/odbc/jdbc/JdbcResult.java | 4 +- 8 files changed, 217 insertions(+), 114 deletions(-) diff --git a/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinMetadataSelfTest.java b/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinMetadataSelfTest.java index 076568d4d64e3..a16bf90329557 100644 --- a/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinMetadataSelfTest.java +++ b/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinMetadataSelfTest.java @@ -131,6 +131,15 @@ protected CacheConfiguration cacheConfiguration(QueryEntity qryEntity) { personCache.put(new AffinityKey<>("p1", "o1"), new Person("John White", 25, 1)); personCache.put(new AffinityKey<>("p2", "o1"), new Person("Joe Black", 35, 1)); personCache.put(new AffinityKey<>("p3", "o2"), new Person("Mike Green", 40, 2)); + + try (Connection conn = DriverManager.getConnection(URL)) { + Statement stmt = conn.createStatement(); + + stmt.execute("CREATE TABLE TEST (ID INT primary key, NAME VARCHAR(50))"); + stmt.execute("CREATE TABLE \"Quoted\" (\"Id\" INT primary key, \"Name\" VARCHAR(50))"); + stmt.execute("CREATE INDEX \"MyTestIndex quoted\" on \"Quoted\" (\"Id\" DESC)"); + stmt.execute("CREATE INDEX IDX ON TEST (ID ASC)"); + } } /** {@inheritDoc} */ @@ -210,6 +219,30 @@ public void testGetTables() throws Exception { } } + public void testGetAllTables() throws Exception { + try (Connection conn = DriverManager.getConnection(URL)) { + DatabaseMetaData meta = conn.getMetaData(); + + ResultSet rs = meta.getTables(null, null, null, null); + + Set expectedTbls = new HashSet<>(Arrays.asList( + "org.ORGANIZATION", + "pers.PERSON", + "PUBLIC.TEST", + "PUBLIC.Quoted")); + + Set actualTbls = new HashSet<>(expectedTbls.size()); + + while(rs.next()) { + actualTbls.add(rs.getString("TABLE_SCHEM") + '.' + + rs.getString("TABLE_NAME")); + } + + assert expectedTbls.equals(actualTbls) : "expectedTbls=" + expectedTbls + + ", actualTbls" + actualTbls; + } + } + /** * @throws Exception If failed. */ @@ -307,6 +340,39 @@ public void testGetColumns() throws Exception { } } + /** + * @throws Exception If failed. + */ + public void testGetAllColumns() throws Exception { + try (Connection conn = DriverManager.getConnection(URL)) { + DatabaseMetaData meta = conn.getMetaData(); + + ResultSet rs = meta.getColumns(null, null, null, null); + + Set expectedCols = new HashSet<>(Arrays.asList( + "org.ORGANIZATION.ID", + "org.ORGANIZATION.NAME", + "pers.PERSON.ORGID", + "pers.PERSON.AGE", + "pers.PERSON.NAME", + "PUBLIC.TEST.ID", + "PUBLIC.TEST.NAME", + "PUBLIC.Quoted.Id", + "PUBLIC.Quoted.Name")); + + Set actualCols = new HashSet<>(expectedCols.size()); + + while(rs.next()) { + actualCols.add(rs.getString("TABLE_SCHEM") + '.' + + rs.getString("TABLE_NAME") + "." + + rs.getString("COLUMN_NAME")); + } + + assert expectedCols.equals(actualCols) : "expectedCols=" + expectedCols + + ", actualCols" + actualCols; + } + } + /** * @throws Exception If failed. */ @@ -350,6 +416,34 @@ else if ("AGE".equals(field)) } } + /** + * @throws Exception If failed. + */ + public void testGetAllIndexes() throws Exception { + try (Connection conn = DriverManager.getConnection(URL)) { + ResultSet rs = conn.getMetaData().getIndexInfo(null, null, null, false, false); + + Set expectedIdxs = new HashSet<>(Arrays.asList( + "org.ORGANIZATION.ORGANIZATION_ID_ASC_IDX", + "org.ORGANIZATION.ORG_NAME_INDEX", + "pers.PERSON.PERSON_ORGID_ASC_IDX", + "pers.PERSON.PERSON_NAME_ASC_AGE_DESC_IDX", + "PUBLIC.TEST.IDX", + "PUBLIC.Quoted.MyTestIndex quoted")); + + Set actualIdxs = new HashSet<>(expectedIdxs.size()); + + while(rs.next()) { + actualIdxs.add(rs.getString("TABLE_SCHEM") + + '.' + rs.getString("TABLE_NAME") + + '.' + rs.getString("INDEX_NAME")); + } + + assert expectedIdxs.equals(actualIdxs) : "expectedIdxs=" + expectedIdxs + + ", actualIdxs" + actualIdxs; + } + } + /** * @throws Exception If failed. */ @@ -374,6 +468,32 @@ public void testPrimaryKeyMetadata() throws Exception { } } + /** + * @throws Exception If failed. + */ + public void testGetAllPrimaryKeys() throws Exception { + try (Connection conn = DriverManager.getConnection(URL)) { + ResultSet rs = conn.getMetaData().getPrimaryKeys(null, null, null); + + Set expectedPks = new HashSet<>(Arrays.asList( + "org.ORGANIZATION._KEY", + "pers.PERSON._KEY", + "PUBLIC.TEST.ID", + "PUBLIC.Quoted.Id")); + + Set actualPks = new HashSet<>(expectedPks.size()); + + while(rs.next()) { + actualPks.add(rs.getString("TABLE_SCHEM") + + '.' + rs.getString("TABLE_NAME") + + '.' + rs.getString("COLUMN_NAME")); + } + + assert expectedPks.equals(actualPks) : "expectedPks=" + expectedPks + + ", actualPks" + actualPks; + } + } + /** * @throws Exception If failed. */ @@ -410,7 +530,7 @@ public void testSchemasMetadata() throws Exception { try (Connection conn = DriverManager.getConnection(URL)) { ResultSet rs = conn.getMetaData().getSchemas(); - Set expectedSchemas = new HashSet<>(Arrays.asList("PUBLIC", "PERS", "ORG")); + Set expectedSchemas = new HashSet<>(Arrays.asList("PUBLIC", "pers", "org")); Set schemas = new HashSet<>(); diff --git a/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinDatabaseMetadata.java b/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinDatabaseMetadata.java index 90951f55c32c9..e5be30c1405e1 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinDatabaseMetadata.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinDatabaseMetadata.java @@ -82,7 +82,7 @@ public class JdbcThinDatabaseMetadata implements DatabaseMetaData { /** {@inheritDoc} */ @Override public boolean isReadOnly() throws SQLException { - return true; + return false; } /** {@inheritDoc} */ @@ -182,17 +182,17 @@ public class JdbcThinDatabaseMetadata implements DatabaseMetaData { /** {@inheritDoc} */ @Override public boolean storesMixedCaseQuotedIdentifiers() throws SQLException { - return false; + return true; } /** {@inheritDoc} */ @Override public String getIdentifierQuoteString() throws SQLException { - return " "; + return "\""; } /** {@inheritDoc} */ @Override public String getSQLKeywords() throws SQLException { - return ""; + return "LIMIT,MINUS,ROWNUM,SYSDATE,SYSTIME,SYSTIMESTAMP,TODAY"; } /** {@inheritDoc} */ @@ -733,10 +733,10 @@ public class JdbcThinDatabaseMetadata implements DatabaseMetaData { private List tableRow(JdbcTableMeta tblMeta) { List row = new ArrayList<>(10); - row.add(upperCase(tblMeta.catalog())); - row.add(upperCase(tblMeta.schema())); - row.add(upperCase(tblMeta.table())); - row.add(upperCase(tblMeta.tableType())); + row.add(tblMeta.catalog()); + row.add(tblMeta.schema()); + row.add(tblMeta.table()); + row.add(tblMeta.tableType()); row.add(null); row.add(null); row.add(null); @@ -747,14 +747,6 @@ private List tableRow(JdbcTableMeta tblMeta) { return row; } - /** - * @param str Source string. - * @return Upper case string. - */ - private String upperCase(String str) { - return str == null ? null : str.toUpperCase(); - } - /** {@inheritDoc} */ @Override public ResultSet getSchemas() throws SQLException { return getSchemas(null, "%"); @@ -827,11 +819,11 @@ private List columnRow(JdbcColumnMeta colMeta, int pos) { List row = new ArrayList<>(20); row.add((String)null); - row.add(upperCase(colMeta.schema())); - row.add(upperCase(colMeta.tableName())); - row.add(upperCase(colMeta.columnName())); + row.add(colMeta.schema()); + row.add(colMeta.tableName()); + row.add(colMeta.columnName()); row.add(colMeta.dataType()); - row.add(upperCase(colMeta.dataTypeName())); + row.add(colMeta.dataTypeName()); row.add((Integer)null); row.add((Integer)null); row.add(10); @@ -923,11 +915,11 @@ private List> primaryKeyRows(JdbcPrimaryKeyMeta pkMeta) { List row = new ArrayList<>(6); row.add((String)null); // table catalog - row.add(upperCase(pkMeta.schema())); - row.add(upperCase(pkMeta.tableName())); - row.add(upperCase(pkMeta.fields()[i])); + row.add(pkMeta.schema()); + row.add(pkMeta.tableName()); + row.add(pkMeta.fields()[i]); row.add((Integer)i + 1); // sequence number - row.add(upperCase(pkMeta.name())); + row.add(pkMeta.name()); rows.add(row); } @@ -1006,14 +998,14 @@ private List> indexRows(JdbcIndexMeta idxMeta) { List row = new ArrayList<>(13); row.add((String)null); // table catalog - row.add(upperCase(idxMeta.schema())); - row.add(upperCase(idxMeta.tableName())); + row.add(idxMeta.schema()); + row.add(idxMeta.tableName()); row.add(true); // non unique row.add(null); // index qualifier (index catalog) - row.add(upperCase(idxMeta.name())); + row.add(idxMeta.name()); row.add((short)tableIndexOther); // type row.add((Integer)i); // field ordinal position in index - row.add(upperCase(idxMeta.fields()[i])); + row.add(idxMeta.fields()[i]); row.add(idxMeta.fieldsAsc()[i] ? "A" : "D"); row.add((Integer)0); // cardinality row.add((Integer)0); // pages @@ -1197,7 +1189,7 @@ private List> indexRows(JdbcIndexMeta idxMeta) { for (String schema : res.schemas()) { List row = new ArrayList<>(2); - row.add(upperCase(schema)); + row.add(schema); row.add(null); rows.add(row); diff --git a/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinParameterMetaData.java b/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinParameterMetaData.java index e4fb34065e92d..af501c9f26472 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinParameterMetaData.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinParameterMetaData.java @@ -23,7 +23,7 @@ import org.apache.ignite.internal.processors.odbc.jdbc.JdbcParamMeta; /** - * JDBC prepared statement implementation. + * JDBC SQL query's parameters metadata. */ public class JdbcThinParameterMetaData implements ParameterMetaData { /** Meta. */ diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcIndexMeta.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcIndexMeta.java index 7cbb0c3654be6..eb13ff0170610 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcIndexMeta.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcIndexMeta.java @@ -130,6 +130,8 @@ public boolean[] fieldsAsc() { /** {@inheritDoc} */ @Override public void writeBinary(BinaryWriterExImpl writer) throws BinaryObjectException { + writer.writeString(schema); + writer.writeString(tbl); writer.writeString(name); writer.writeByte((byte)type.ordinal()); writer.writeInt(inlineSize); @@ -139,6 +141,8 @@ public boolean[] fieldsAsc() { /** {@inheritDoc} */ @Override public void readBinary(BinaryReaderExImpl reader) throws BinaryObjectException { + schema = reader.readString(); + tbl = reader.readString(); name = reader.readString(); type = QueryIndexType.fromOrdinal(reader.readByte()); inlineSize = reader.readInt(); diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaColumnsRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaColumnsRequest.java index dd5c4b1d54923..9799c1c356d3f 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaColumnsRequest.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaColumnsRequest.java @@ -27,7 +27,7 @@ * JDBC get columns metadata request. */ public class JdbcMetaColumnsRequest extends JdbcRequest { - /** Cache name. */ + /** Schean name. */ private String schemaName; /** Table name. */ @@ -59,7 +59,7 @@ public JdbcMetaColumnsRequest(String schemaName, String tableName, String column /** * @return Cache name. */ - @Nullable public String cacheName() { + @Nullable public String schema() { return schemaName; } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaIndexesResult.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaIndexesResult.java index e070441c1d32a..9ef2f1a11befc 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaIndexesResult.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaIndexesResult.java @@ -38,7 +38,6 @@ public class JdbcMetaIndexesResult extends JdbcResult { */ JdbcMetaIndexesResult() { super(META_INDEXES); - this.meta = meta; } /** diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcRequestHandler.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcRequestHandler.java index c0fa739095a26..4d7ae247e22b0 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcRequestHandler.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcRequestHandler.java @@ -21,6 +21,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; +import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Map; @@ -434,7 +435,10 @@ private JdbcResponse getTablesMeta(JdbcMetaTablesRequest req) { } if (tblTypeMatch) { - JdbcTableMeta tableMeta = new JdbcTableMeta(null, cacheName, table.name(), "TABLE"); + String schemaName = + ctx.cache().cacheDescriptor(cacheName).sql() ? QueryUtils.DFLT_SCHEMA : cacheName; + + JdbcTableMeta tableMeta = new JdbcTableMeta(null, schemaName, table.tableName(), "TABLE"); if (!meta.contains(tableMeta)) meta.add(tableMeta); @@ -461,40 +465,34 @@ private JdbcResponse getTablesMeta(JdbcMetaTablesRequest req) { */ private JdbcResponse getColumnsMeta(JdbcMetaColumnsRequest req) { try { - String cacheName; - String tableName; - - if (req.tableName().contains(".")) { - // Parsing two-part table name. - String[] parts = req.tableName().split("\\."); - - cacheName = parts[0]; - - tableName = parts[1]; - } - else { - cacheName = req.cacheName(); + Collection cacheNames; - tableName = req.tableName(); - } - - Collection tablesMeta = ctx.query().types(cacheName); + if (req.schema() == null) + cacheNames = ctx.cache().publicCacheNames(); + else + cacheNames = Collections.singleton(req.schema()); Collection meta = new HashSet<>(); - for (GridQueryTypeDescriptor table : tablesMeta) { - if (!matches(table.name(), tableName)) - continue; + for (String cacheName : cacheNames) { + Collection tablesMeta = ctx.query().types(cacheName); - for (Map.Entry> field : table.fields().entrySet()) { - if (!matches(field.getKey(), req.columnName())) + String schemaName = ctx.cache().cacheDescriptor(cacheName).sql() ? QueryUtils.DFLT_SCHEMA : cacheName; + + for (GridQueryTypeDescriptor table : tablesMeta) { + if (!matches(table.name(), req.tableName())) continue; - JdbcColumnMeta columnMeta = new JdbcColumnMeta(req.cacheName(), table.name(), - field.getKey(), field.getValue()); + for (Map.Entry> field : table.fields().entrySet()) { + if (!matches(field.getKey(), req.columnName())) + continue; + + JdbcColumnMeta columnMeta = new JdbcColumnMeta(schemaName, table.tableName(), + field.getKey(), field.getValue()); - if (!meta.contains(columnMeta)) - meta.add(columnMeta); + if (!meta.contains(columnMeta)) + meta.add(columnMeta); + } } } @@ -515,33 +513,27 @@ private JdbcResponse getColumnsMeta(JdbcMetaColumnsRequest req) { */ private SqlListenerResponse getIndexesMeta(JdbcMetaIndexesRequest req) { try { - String cacheName; - String tableName; - - if (req.tableName().contains(".")) { - // Parsing two-part table name. - String[] parts = req.tableName().split("\\."); + Collection cacheNames; - cacheName = parts[0]; - - tableName = parts[1]; - } - else { - cacheName = req.schema(); + if (req.schema() == null) + cacheNames = ctx.cache().publicCacheNames(); + else + cacheNames = Collections.singleton(req.schema()); - tableName = req.tableName(); - } + Collection meta = new HashSet<>(); - Collection tablesMeta = ctx.query().types(cacheName); + for (String cacheName : cacheNames) { + Collection tablesMeta = ctx.query().types(cacheName); - Collection meta = new HashSet<>(); + String schemaName = ctx.cache().cacheDescriptor(cacheName).sql() ? QueryUtils.DFLT_SCHEMA : cacheName; - for (GridQueryTypeDescriptor table : tablesMeta) { - if (!matches(table.name(), tableName)) - continue; + for (GridQueryTypeDescriptor table : tablesMeta) { + if (!matches(table.name(), req.tableName())) + continue; - for (GridQueryIndexDescriptor idxDesc : table.indexes().values()) - meta.add(new JdbcIndexMeta(cacheName, table.name(), idxDesc)); + for (GridQueryIndexDescriptor idxDesc : table.indexes().values()) + meta.add(new JdbcIndexMeta(schemaName, table.tableName(), idxDesc)); + } } return new JdbcResponse(new JdbcMetaIndexesResult(meta)); @@ -586,43 +578,39 @@ private SqlListenerResponse getParamsMeta(JdbcMetaParamsRequest req) { */ private SqlListenerResponse getPrimaryKeys(JdbcMetaPrimaryKeysRequest req) { try { - String cacheName; - String tableName; + Collection cacheNames; - if (req.tableName().contains(".")) { - // Parsing two-part table name. - String[] parts = req.tableName().split("\\."); + if (req.schema() == null) + cacheNames = ctx.cache().publicCacheNames(); + else + cacheNames = Collections.singleton(req.schema()); - cacheName = parts[0]; + Collection meta = new HashSet<>(); - tableName = parts[1]; - } - else { - cacheName = req.schema(); + for (String cacheName : cacheNames) { + Collection tablesMeta = ctx.query().types(cacheName); - tableName = req.tableName(); - } + String schemaName = ctx.cache().cacheDescriptor(cacheName).sql() ? QueryUtils.DFLT_SCHEMA : cacheName; - Collection tablesMeta = ctx.query().types(cacheName); + for (GridQueryTypeDescriptor table : tablesMeta) { + if (!matches(table.name(), req.tableName())) + continue; - Collection meta = new HashSet<>(); + List fields = new ArrayList<>(); - for (GridQueryTypeDescriptor table : tablesMeta) { - if (!matches(table.name(), tableName)) - continue; + for (String field : table.fields().keySet()) { + if (table.property(field).key()) + fields.add(field); + } - List fields = new ArrayList<>(); + final String keyName = table.keyFieldName() == null ? "_KEY" : table.keyFieldName(); - for (String field : table.fields().keySet()) { - if (table.property(field).key()) - fields.add(field); + if (fields.isEmpty()) + meta.add(new JdbcPrimaryKeyMeta(schemaName, table.tableName(), keyName, new String[] {"_KEY"})); + else + meta.add(new JdbcPrimaryKeyMeta(schemaName, table.tableName(), keyName, + fields.toArray(new String[fields.size()]))); } - - if (fields.isEmpty()) - meta.add(new JdbcPrimaryKeyMeta(cacheName, table.name(), "_KEY", new String[] {"_KEY"})); - else - meta.add(new JdbcPrimaryKeyMeta(cacheName, table.name(), table.keyFieldName(), - fields.toArray(new String[fields.size()]))); } return new JdbcResponse(new JdbcMetaPrimaryKeysResult(meta)); @@ -648,14 +636,14 @@ private SqlListenerResponse getSchemas(JdbcMetaSchemasRequest req) { schemas.add(QueryUtils.DFLT_SCHEMA); for (String cacheName : ctx.cache().publicCacheNames()) { - if (matches(cacheName, schemaPtrn)) + if (!ctx.cache().cacheDescriptor(cacheName).sql() && matches(cacheName, schemaPtrn)) schemas.add(cacheName); } return new JdbcResponse(new JdbcMetaSchemasResult(schemas)); } catch (Exception e) { - U.error(log, "Failed to get parameters metadata [reqId=" + req.requestId() + ", req=" + req + ']', e); + U.error(log, "Failed to get schemas metadata [reqId=" + req.requestId() + ", req=" + req + ']', e); return new JdbcResponse(SqlListenerResponse.STATUS_FAILED, e.toString()); } @@ -670,6 +658,6 @@ private SqlListenerResponse getSchemas(JdbcMetaSchemasRequest req) { */ private static boolean matches(String str, String ptrn) { return str != null && (F.isEmpty(ptrn) || - str.toUpperCase().matches(ptrn.toUpperCase().replace("%", ".*").replace("_", "."))); + str.matches(ptrn.replace("%", ".*").replace("_", "."))); } } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcResult.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcResult.java index 31a98deb80f21..330cc00532856 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcResult.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcResult.java @@ -23,7 +23,7 @@ import org.apache.ignite.internal.binary.BinaryWriterExImpl; /** - * JDBS response result. + * JDBC response result. */ public class JdbcResult implements JdbcRawBinarylizable { /** Execute sql result. */ @@ -53,7 +53,7 @@ public class JdbcResult implements JdbcRawBinarylizable { /** Primary keys metadata result. */ static final byte META_PRIMARY_KEYS = 11; - /** Primary keys metadata result. */ + /** Database schemas metadata result. */ static final byte META_SCHEMAS = 12; /** Success status. */ From f46b1c0d50afa88f7ac61099a6d49f9b9e43f15b Mon Sep 17 00:00:00 2001 From: tledkov-gridgain Date: Tue, 8 Aug 2017 12:54:33 +0300 Subject: [PATCH 14/32] IGNITE-5233: minors --- .../org/apache/ignite/jdbc/thin/JdbcThinMetadataSelfTest.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinMetadataSelfTest.java b/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinMetadataSelfTest.java index a16bf90329557..e619bb1a1a97e 100644 --- a/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinMetadataSelfTest.java +++ b/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinMetadataSelfTest.java @@ -219,6 +219,9 @@ public void testGetTables() throws Exception { } } + /** + * @throws Exception If failed. + */ public void testGetAllTables() throws Exception { try (Connection conn = DriverManager.getConnection(URL)) { DatabaseMetaData meta = conn.getMetaData(); From a849d6f17184eddb075f0e03c2d421dca7b65d42 Mon Sep 17 00:00:00 2001 From: tledkov-gridgain Date: Tue, 8 Aug 2017 13:07:20 +0300 Subject: [PATCH 15/32] IGNITE-5233: minors --- .../ignite/internal/jdbc/thin/JdbcThinDatabaseMetadata.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinDatabaseMetadata.java b/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinDatabaseMetadata.java index e5be30c1405e1..1d4290482fcf3 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinDatabaseMetadata.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinDatabaseMetadata.java @@ -1274,7 +1274,7 @@ private List> indexRows(JdbcIndexMeta idxMeta) { /** {@inheritDoc} */ @Override public boolean isWrapperFor(Class iface) throws SQLException { - return iface != null && iface == DatabaseMetaData.class; + return iface != null && iface.isAssignableFrom(JdbcThinDatabaseMetadata.class); } /** {@inheritDoc} */ From 394eb0e7ebf4695e6a1dcaea2b845e943184ad57 Mon Sep 17 00:00:00 2001 From: tledkov-gridgain Date: Tue, 8 Aug 2017 13:36:36 +0300 Subject: [PATCH 16/32] IGNITE-5233: return correct empty results sets --- .../jdbc/thin/JdbcThinDatabaseMetadata.java | 195 ++++++++++++++++-- 1 file changed, 173 insertions(+), 22 deletions(-) diff --git a/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinDatabaseMetadata.java b/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinDatabaseMetadata.java index 1d4290482fcf3..18e0589e4d79c 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinDatabaseMetadata.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinDatabaseMetadata.java @@ -845,32 +845,59 @@ private List columnRow(JdbcColumnMeta colMeta, int pos) { /** {@inheritDoc} */ @Override public ResultSet getColumnPrivileges(String catalog, String schema, String tbl, String colNamePtrn) throws SQLException { - return emptyResultSet(); + return new JdbcThinResultSet(Collections.>emptyList(), Arrays.asList( + new JdbcColumnMeta(null, null, "TABLE_CAT", String.class), + new JdbcColumnMeta(null, null, "TABLE_SCHEM", String.class), + new JdbcColumnMeta(null, null, "TABLE_NAME", String.class), + new JdbcColumnMeta(null, null, "COLUMN_NAME", String.class), + new JdbcColumnMeta(null, null, "GRANTOR", String.class), + new JdbcColumnMeta(null, null, "GRANTEE", String.class), + new JdbcColumnMeta(null, null, "PRIVILEGE", String.class), + new JdbcColumnMeta(null, null, "IS_GRANTABLE", String.class) + )); } /** {@inheritDoc} */ @Override public ResultSet getTablePrivileges(String catalog, String schemaPtrn, String tblNamePtrn) throws SQLException { - return emptyResultSet(); + return new JdbcThinResultSet(Collections.>emptyList(), Arrays.asList( + new JdbcColumnMeta(null, null, "TABLE_CAT", String.class), + new JdbcColumnMeta(null, null, "TABLE_SCHEM", String.class), + new JdbcColumnMeta(null, null, "TABLE_NAME", String.class), + new JdbcColumnMeta(null, null, "GRANTOR", String.class), + new JdbcColumnMeta(null, null, "GRANTEE", String.class), + new JdbcColumnMeta(null, null, "PRIVILEGE", String.class), + new JdbcColumnMeta(null, null, "IS_GRANTABLE", String.class) + )); } /** {@inheritDoc} */ @Override public ResultSet getBestRowIdentifier(String catalog, String schema, String tbl, int scope, boolean nullable) throws SQLException { - return emptyResultSet(); + return new JdbcThinResultSet(Collections.>emptyList(), Arrays.asList( + new JdbcColumnMeta(null, null, "SCOPE", Short.class), + new JdbcColumnMeta(null, null, "COLUMN_NAME", String.class), + new JdbcColumnMeta(null, null, "DATA_TYPE", Integer.class), + new JdbcColumnMeta(null, null, "TYPE_NAME", String.class), + new JdbcColumnMeta(null, null, "COLUMN_SIZE", Integer.class), + new JdbcColumnMeta(null, null, "BUFFER_LENGTH", Integer.class), + new JdbcColumnMeta(null, null, "DECIMAL_DIGITS", Short.class), + new JdbcColumnMeta(null, null, "PSEUDO_COLUMN", Short.class) + )); } /** {@inheritDoc} */ @Override public ResultSet getVersionColumns(String catalog, String schema, String tbl) throws SQLException { - return emptyResultSet(); - } - - /** - * @return Empty result set. - */ - private ResultSet emptyResultSet() { - return new JdbcThinResultSet(Collections.singletonList(Collections.emptyList()), - Collections.emptyList()); + return new JdbcThinResultSet(Collections.>emptyList(), Arrays.asList( + new JdbcColumnMeta(null, null, "SCOPE", Short.class), + new JdbcColumnMeta(null, null, "COLUMN_NAME", String.class), + new JdbcColumnMeta(null, null, "DATA_TYPE", Integer.class), + new JdbcColumnMeta(null, null, "TYPE_NAME", String.class), + new JdbcColumnMeta(null, null, "COLUMN_SIZE", Integer.class), + new JdbcColumnMeta(null, null, "BUFFER_LENGTH", Integer.class), + new JdbcColumnMeta(null, null, "DECIMAL_DIGITS", Short.class), + new JdbcColumnMeta(null, null, "PSEUDO_COLUMN", Short.class) + )); } /** {@inheritDoc} */ @@ -929,23 +956,87 @@ private List> primaryKeyRows(JdbcPrimaryKeyMeta pkMeta) { /** {@inheritDoc} */ @Override public ResultSet getImportedKeys(String catalog, String schema, String tbl) throws SQLException { - return emptyResultSet(); + return new JdbcThinResultSet(Collections.>emptyList(), Arrays.asList( + new JdbcColumnMeta(null, null, "PKTABLE_CAT", String.class), + new JdbcColumnMeta(null, null, "PKTABLE_SCHEM", String.class), + new JdbcColumnMeta(null, null, "PKTABLE_NAME", String.class), + new JdbcColumnMeta(null, null, "PKCOLUMN_NAME", String.class), + new JdbcColumnMeta(null, null, "FKTABLE_CAT", String.class), + new JdbcColumnMeta(null, null, "FKTABLE_SCHEM", String.class), + new JdbcColumnMeta(null, null, "FKTABLE_NAME", String.class), + new JdbcColumnMeta(null, null, "FKCOLUMN_NAME", String.class), + new JdbcColumnMeta(null, null, "KEY_SEQ", Short.class), + new JdbcColumnMeta(null, null, "UPDATE_RULE", Short.class), + new JdbcColumnMeta(null, null, "DELETE_RULE", Short.class), + new JdbcColumnMeta(null, null, "FK_NAME", String.class), + new JdbcColumnMeta(null, null, "PK_NAME", String.class), + new JdbcColumnMeta(null, null, "DEFERRABILITY", Short.class) + )); } /** {@inheritDoc} */ @Override public ResultSet getExportedKeys(String catalog, String schema, String tbl) throws SQLException { - return emptyResultSet(); + return new JdbcThinResultSet(Collections.>emptyList(), Arrays.asList( + new JdbcColumnMeta(null, null, "PKTABLE_CAT", String.class), + new JdbcColumnMeta(null, null, "PKTABLE_SCHEM", String.class), + new JdbcColumnMeta(null, null, "PKTABLE_NAME", String.class), + new JdbcColumnMeta(null, null, "PKCOLUMN_NAME", String.class), + new JdbcColumnMeta(null, null, "FKTABLE_CAT", String.class), + new JdbcColumnMeta(null, null, "FKTABLE_SCHEM", String.class), + new JdbcColumnMeta(null, null, "FKTABLE_NAME", String.class), + new JdbcColumnMeta(null, null, "FKCOLUMN_NAME", String.class), + new JdbcColumnMeta(null, null, "KEY_SEQ", Short.class), + new JdbcColumnMeta(null, null, "UPDATE_RULE", Short.class), + new JdbcColumnMeta(null, null, "DELETE_RULE", Short.class), + new JdbcColumnMeta(null, null, "FK_NAME", String.class), + new JdbcColumnMeta(null, null, "PK_NAME", String.class), + new JdbcColumnMeta(null, null, "DEFERRABILITY", Short.class) + )); } /** {@inheritDoc} */ @Override public ResultSet getCrossReference(String parentCatalog, String parentSchema, String parentTbl, String foreignCatalog, String foreignSchema, String foreignTbl) throws SQLException { - return emptyResultSet(); + return new JdbcThinResultSet(Collections.>emptyList(), Arrays.asList( + new JdbcColumnMeta(null, null, "PKTABLE_CAT", String.class), + new JdbcColumnMeta(null, null, "PKTABLE_SCHEM", String.class), + new JdbcColumnMeta(null, null, "PKTABLE_NAME", String.class), + new JdbcColumnMeta(null, null, "PKCOLUMN_NAME", String.class), + new JdbcColumnMeta(null, null, "FKTABLE_CAT", String.class), + new JdbcColumnMeta(null, null, "FKTABLE_SCHEM", String.class), + new JdbcColumnMeta(null, null, "FKTABLE_NAME", String.class), + new JdbcColumnMeta(null, null, "FKCOLUMN_NAME", String.class), + new JdbcColumnMeta(null, null, "KEY_SEQ", Short.class), + new JdbcColumnMeta(null, null, "UPDATE_RULE", Short.class), + new JdbcColumnMeta(null, null, "DELETE_RULE", Short.class), + new JdbcColumnMeta(null, null, "FK_NAME", String.class), + new JdbcColumnMeta(null, null, "PK_NAME", String.class), + new JdbcColumnMeta(null, null, "DEFERRABILITY", Short.class) + )); } /** {@inheritDoc} */ @Override public ResultSet getTypeInfo() throws SQLException { - return emptyResultSet(); + return new JdbcThinResultSet(Collections.>emptyList(), Arrays.asList( + new JdbcColumnMeta(null, null, "TYPE_NAME", String.class), + new JdbcColumnMeta(null, null, "DATA_TYPE", Integer.class), + new JdbcColumnMeta(null, null, "PRECISION", Integer.class), + new JdbcColumnMeta(null, null, "LITERAL_PREFIX", String.class), + new JdbcColumnMeta(null, null, "LITERAL_SUFFIX", String.class), + new JdbcColumnMeta(null, null, "CREATE_PARAMS", String.class), + new JdbcColumnMeta(null, null, "NULLABLE", Short.class), + new JdbcColumnMeta(null, null, "CASE_SENSITIVE", Boolean.class), + new JdbcColumnMeta(null, null, "SEARCHABLE", Short.class), + new JdbcColumnMeta(null, null, "UNSIGNED_ATTRIBUTE", Boolean.class), + new JdbcColumnMeta(null, null, "FIXED_PREC_SCALE", Boolean.class), + new JdbcColumnMeta(null, null, "AUTO_INCREMENT", Boolean.class), + new JdbcColumnMeta(null, null, "LOCAL_TYPE_NAME", String.class), + new JdbcColumnMeta(null, null, "MINIMUM_SCALE", Short.class), + new JdbcColumnMeta(null, null, "MAXIMUM_SCALE", Short.class), + new JdbcColumnMeta(null, null, "SQL_DATA_TYPE", Integer.class), + new JdbcColumnMeta(null, null, "SQL_DATETIME_SUB", Integer.class), + new JdbcColumnMeta(null, null, "NUM_PREC_RADIX", Integer.class) + )); } /** {@inheritDoc} */ @@ -1080,7 +1171,15 @@ private List> indexRows(JdbcIndexMeta idxMeta) { /** {@inheritDoc} */ @Override public ResultSet getUDTs(String catalog, String schemaPtrn, String typeNamePtrn, int[] types) throws SQLException { - return emptyResultSet(); + return new JdbcThinResultSet(Collections.>emptyList(), Arrays.asList( + new JdbcColumnMeta(null, null, "TYPE_CAT", String.class), + new JdbcColumnMeta(null, null, "TYPE_SCHEM", String.class), + new JdbcColumnMeta(null, null, "TYPE_NAME", String.class), + new JdbcColumnMeta(null, null, "CLASS_NAME", String.class), + new JdbcColumnMeta(null, null, "DATA_TYPE", Integer.class), + new JdbcColumnMeta(null, null, "REMARKS", String.class), + new JdbcColumnMeta(null, null, "BASE_TYPE", Short.class) + )); } /** {@inheritDoc} */ @@ -1111,19 +1210,53 @@ private List> indexRows(JdbcIndexMeta idxMeta) { /** {@inheritDoc} */ @Override public ResultSet getSuperTypes(String catalog, String schemaPtrn, String typeNamePtrn) throws SQLException { - return emptyResultSet(); + return new JdbcThinResultSet(Collections.>emptyList(), Arrays.asList( + new JdbcColumnMeta(null, null, "TYPE_CAT", String.class), + new JdbcColumnMeta(null, null, "TYPE_SCHEM", String.class), + new JdbcColumnMeta(null, null, "TYPE_NAME", String.class), + new JdbcColumnMeta(null, null, "SUPERTYPE_CAT", String.class), + new JdbcColumnMeta(null, null, "SUPERTYPE_SCHEM", String.class), + new JdbcColumnMeta(null, null, "SUPERTYPE_NAME", String.class) + )); } /** {@inheritDoc} */ @Override public ResultSet getSuperTables(String catalog, String schemaPtrn, String tblNamePtrn) throws SQLException { - return emptyResultSet(); + return new JdbcThinResultSet(Collections.>emptyList(), Arrays.asList( + new JdbcColumnMeta(null, null, "TABLE_CAT", String.class), + new JdbcColumnMeta(null, null, "TABLE_SCHEM", String.class), + new JdbcColumnMeta(null, null, "TABLE_NAME", String.class), + new JdbcColumnMeta(null, null, "SUPERTABLE_NAME", String.class) + )); } /** {@inheritDoc} */ @Override public ResultSet getAttributes(String catalog, String schemaPtrn, String typeNamePtrn, String attributeNamePtrn) throws SQLException { - return emptyResultSet(); + return new JdbcThinResultSet(Collections.>emptyList(), Arrays.asList( + new JdbcColumnMeta(null, null, "TYPE_CAT", String.class), + new JdbcColumnMeta(null, null, "TYPE_SCHEM", String.class), + new JdbcColumnMeta(null, null, "TYPE_NAME", String.class), + new JdbcColumnMeta(null, null, "ATTR_NAME", String.class), + new JdbcColumnMeta(null, null, "DATA_TYPE", Integer.class), + new JdbcColumnMeta(null, null, "ATTR_TYPE_NAME", String.class), + new JdbcColumnMeta(null, null, "ATTR_SIZE", Integer.class), + new JdbcColumnMeta(null, null, "DECIMAL_DIGITS", Integer.class), + new JdbcColumnMeta(null, null, "NUM_PREC_RADIX", Integer.class), + new JdbcColumnMeta(null, null, "NULLABLE", Integer.class), + new JdbcColumnMeta(null, null, "REMARKS", String.class), + new JdbcColumnMeta(null, null, "ATTR_DEF", String.class), + new JdbcColumnMeta(null, null, "SQL_DATA_TYPE", Integer.class), + new JdbcColumnMeta(null, null, "SQL_DATETIME_SUB", Integer.class), + new JdbcColumnMeta(null, null, "CHAR_OCTET_LENGTH", Integer.class), + new JdbcColumnMeta(null, null, "ORDINAL_POSITION", Integer.class), + new JdbcColumnMeta(null, null, "IS_NULLABLE", String.class), + new JdbcColumnMeta(null, null, "SCOPE_CATALOG", String.class), + new JdbcColumnMeta(null, null, "SCOPE_SCHEMA", String.class), + new JdbcColumnMeta(null, null, "SCOPE_TABLE", String.class), + new JdbcColumnMeta(null, null, "SOURCE_DATA_TYPE", Short.class) + )); } /** {@inheritDoc} */ @@ -1222,7 +1355,12 @@ private List> indexRows(JdbcIndexMeta idxMeta) { /** {@inheritDoc} */ @Override public ResultSet getClientInfoProperties() throws SQLException { - return emptyResultSet(); + return new JdbcThinResultSet(Collections.>emptyList(), Arrays.asList( + new JdbcColumnMeta(null, null, "NAME", String.class), + new JdbcColumnMeta(null, null, "MAX_LEN", Integer.class), + new JdbcColumnMeta(null, null, "DEFAULT_VALUE", String.class), + new JdbcColumnMeta(null, null, "DESCRIPTION", String.class) + )); } /** {@inheritDoc} */ @@ -1280,7 +1418,20 @@ private List> indexRows(JdbcIndexMeta idxMeta) { /** {@inheritDoc} */ @Override public ResultSet getPseudoColumns(String catalog, String schemaPtrn, String tblNamePtrn, String colNamePtrn) throws SQLException { - return emptyResultSet(); + return new JdbcThinResultSet(Collections.>emptyList(), Arrays.asList( + new JdbcColumnMeta(null, null, "TABLE_CAT", String.class), + new JdbcColumnMeta(null, null, "TABLE_SCHEM", String.class), + new JdbcColumnMeta(null, null, "TABLE_NAME", String.class), + new JdbcColumnMeta(null, null, "COLUMN_NAME", String.class), + new JdbcColumnMeta(null, null, "DATA_TYPE", Integer.class), + new JdbcColumnMeta(null, null, "COLUMN_SIZE", Integer.class), + new JdbcColumnMeta(null, null, "DECIMAL_DIGITS", Integer.class), + new JdbcColumnMeta(null, null, "NUM_PREC_RADIX", Integer.class), + new JdbcColumnMeta(null, null, "COLUMN_USAGE", Integer.class), + new JdbcColumnMeta(null, null, "REMARKS", String.class), + new JdbcColumnMeta(null, null, "CHAR_OCTET_LENGTH", Integer.class), + new JdbcColumnMeta(null, null, "IS_NULLABLE", String.class) + )); } /** {@inheritDoc} */ From abd33af27d25ca45a962b78c76f89678bdd0ca48 Mon Sep 17 00:00:00 2001 From: tledkov-gridgain Date: Tue, 8 Aug 2017 13:37:26 +0300 Subject: [PATCH 17/32] IGNITE-5233: minors --- .../ignite/internal/jdbc/thin/JdbcThinTcpIo.java | 2 +- .../odbc/jdbc/JdbcMetaColumnsRequest.java | 16 ++++++++-------- .../odbc/jdbc/JdbcMetaTablesRequest.java | 16 +--------------- 3 files changed, 10 insertions(+), 24 deletions(-) diff --git a/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinTcpIo.java b/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinTcpIo.java index 4d3df4798866f..6e394c4cbe7e9 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinTcpIo.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinTcpIo.java @@ -331,7 +331,7 @@ public JdbcBatchExecuteResult batchExecute(String schema, List batch) */ public JdbcMetaTablesResult tablesMeta(String catalog, String schemaPtrn, String tablePtrn, String[] types) throws IOException, IgniteCheckedException { - return sendRequest(new JdbcMetaTablesRequest(catalog, schemaPtrn, tablePtrn, types), DYNAMIC_SIZE_MSG_CAP); + return sendRequest(new JdbcMetaTablesRequest(schemaPtrn, tablePtrn, types), DYNAMIC_SIZE_MSG_CAP); } /** diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaColumnsRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaColumnsRequest.java index 9799c1c356d3f..1fd1d8b9a764b 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaColumnsRequest.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaColumnsRequest.java @@ -27,8 +27,8 @@ * JDBC get columns metadata request. */ public class JdbcMetaColumnsRequest extends JdbcRequest { - /** Schean name. */ - private String schemaName; + /** Schema name. */ + private String schema; /** Table name. */ private String tableName; @@ -44,14 +44,14 @@ public class JdbcMetaColumnsRequest extends JdbcRequest { } /** - * @param schemaName Cache name. + * @param schema Schema name. * @param tableName Table name. * @param columnName Column name. */ - public JdbcMetaColumnsRequest(String schemaName, String tableName, String columnName) { + public JdbcMetaColumnsRequest(String schema, String tableName, String columnName) { super(META_COLUMNS); - this.schemaName = schemaName; + this.schema = schema; this.tableName = tableName; this.columnName = columnName; } @@ -60,7 +60,7 @@ public JdbcMetaColumnsRequest(String schemaName, String tableName, String column * @return Cache name. */ @Nullable public String schema() { - return schemaName; + return schema; } /** @@ -81,7 +81,7 @@ public String columnName() { @Override public void writeBinary(BinaryWriterExImpl writer) throws BinaryObjectException { super.writeBinary(writer); - writer.writeString(schemaName); + writer.writeString(schema); writer.writeString(tableName); writer.writeString(columnName); } @@ -90,7 +90,7 @@ public String columnName() { @Override public void readBinary(BinaryReaderExImpl reader) throws BinaryObjectException { super.readBinary(reader); - schemaName = reader.readString(); + schema = reader.readString(); tableName = reader.readString(); columnName = reader.readString(); } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaTablesRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaTablesRequest.java index 43659229b2554..68018be82c37d 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaTablesRequest.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaTablesRequest.java @@ -26,9 +26,6 @@ * JDBC tables metadata request. */ public class JdbcMetaTablesRequest extends JdbcRequest { - /** Catalog search pattern. */ - private String catalog; - /** Schema search pattern. */ private String schema; @@ -46,27 +43,18 @@ public class JdbcMetaTablesRequest extends JdbcRequest { } /** - * @param catalog Catalog search pattern. * @param schema Schema search pattern. * @param table Table search pattern. * @param tableTypes Table types. */ - public JdbcMetaTablesRequest(String catalog, String schema, String table, String[] tableTypes) { + public JdbcMetaTablesRequest(String schema, String table, String[] tableTypes) { super(META_TABLES); - this.catalog = catalog; this.schema = schema; this.table = table; this.tableTypes = tableTypes; } - /** - * @return catalog search pattern. - */ - public String catalog() { - return catalog; - } - /** * @return Schema search pattern. */ @@ -92,7 +80,6 @@ public String[] tableTypes() { @Override public void writeBinary(BinaryWriterExImpl writer) throws BinaryObjectException { super.writeBinary(writer); - writer.writeString(catalog); writer.writeString(schema); writer.writeString(table); writer.writeStringArray(tableTypes); @@ -102,7 +89,6 @@ public String[] tableTypes() { @Override public void readBinary(BinaryReaderExImpl reader) throws BinaryObjectException { super.readBinary(reader); - this.catalog = reader.readString(); this.schema = reader.readString(); this.table = reader.readString(); this.tableTypes = reader.readStringArray(); From 3f6189e1b272153be2172a00c89c445258e310cd Mon Sep 17 00:00:00 2001 From: tledkov-gridgain Date: Tue, 8 Aug 2017 15:15:26 +0300 Subject: [PATCH 18/32] IGNITE-5233: minors --- .../processors/odbc/jdbc/JdbcRequestHandler.java | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcRequestHandler.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcRequestHandler.java index 4d7ae247e22b0..e5c79fa559875 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcRequestHandler.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcRequestHandler.java @@ -605,11 +605,14 @@ private SqlListenerResponse getPrimaryKeys(JdbcMetaPrimaryKeysRequest req) { final String keyName = table.keyFieldName() == null ? "_KEY" : table.keyFieldName(); - if (fields.isEmpty()) - meta.add(new JdbcPrimaryKeyMeta(schemaName, table.tableName(), keyName, new String[] {"_KEY"})); - else + if (fields.isEmpty()) { + meta.add(new JdbcPrimaryKeyMeta(schemaName, table.tableName(), keyName, + new String[] {keyName})); + } + else { meta.add(new JdbcPrimaryKeyMeta(schemaName, table.tableName(), keyName, fields.toArray(new String[fields.size()]))); + } } } From 5592e1eadf8a56375619f4586c8ab322fe440f44 Mon Sep 17 00:00:00 2001 From: tledkov-gridgain Date: Tue, 8 Aug 2017 15:42:23 +0300 Subject: [PATCH 19/32] IGNITE-5233: add composite PK to tests --- .../org/apache/ignite/jdbc/thin/JdbcThinMetadataSelfTest.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinMetadataSelfTest.java b/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinMetadataSelfTest.java index e619bb1a1a97e..84de6e14caaa4 100644 --- a/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinMetadataSelfTest.java +++ b/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinMetadataSelfTest.java @@ -135,7 +135,7 @@ protected CacheConfiguration cacheConfiguration(QueryEntity qryEntity) { try (Connection conn = DriverManager.getConnection(URL)) { Statement stmt = conn.createStatement(); - stmt.execute("CREATE TABLE TEST (ID INT primary key, NAME VARCHAR(50))"); + stmt.execute("CREATE TABLE TEST (ID INT, NAME VARCHAR(50), VAL VARCHAR(50), PRIMARY KEY (ID, NAME))"); stmt.execute("CREATE TABLE \"Quoted\" (\"Id\" INT primary key, \"Name\" VARCHAR(50))"); stmt.execute("CREATE INDEX \"MyTestIndex quoted\" on \"Quoted\" (\"Id\" DESC)"); stmt.execute("CREATE INDEX IDX ON TEST (ID ASC)"); @@ -360,6 +360,7 @@ public void testGetAllColumns() throws Exception { "pers.PERSON.NAME", "PUBLIC.TEST.ID", "PUBLIC.TEST.NAME", + "PUBLIC.TEST.VAL", "PUBLIC.Quoted.Id", "PUBLIC.Quoted.Name")); @@ -482,6 +483,7 @@ public void testGetAllPrimaryKeys() throws Exception { "org.ORGANIZATION._KEY", "pers.PERSON._KEY", "PUBLIC.TEST.ID", + "PUBLIC.TEST.NAME", "PUBLIC.Quoted.Id")); Set actualPks = new HashSet<>(expectedPks.size()); From e7049a1c65bd8dc0baac491de27c6da975c93dba Mon Sep 17 00:00:00 2001 From: tledkov-gridgain Date: Wed, 9 Aug 2017 17:26:39 +0300 Subject: [PATCH 20/32] IGNITE-5233: remove unused --- .../processors/odbc/jdbc/JdbcIndexMeta.java | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcIndexMeta.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcIndexMeta.java index eb13ff0170610..c180579f93d84 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcIndexMeta.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcIndexMeta.java @@ -39,9 +39,6 @@ public class JdbcIndexMeta implements JdbcRawBinarylizable { /** Index type. */ private QueryIndexType type; - /** Inline size. */ - private int inlineSize; - /** Index fields */ private String[] fields; @@ -70,7 +67,6 @@ public class JdbcIndexMeta implements JdbcRawBinarylizable { name = idx.name(); type = idx.type(); - inlineSize = idx.inlineSize(); fields = idx.fields().toArray(new String[idx.fields().size()]); fieldsAsc = new boolean[fields.length]; @@ -107,13 +103,6 @@ public QueryIndexType type() { return type; } - /** - * @return Inline size. - */ - public int inlineSize() { - return inlineSize; - } - /** * @return Index fields */ @@ -134,7 +123,6 @@ public boolean[] fieldsAsc() { writer.writeString(tbl); writer.writeString(name); writer.writeByte((byte)type.ordinal()); - writer.writeInt(inlineSize); writer.writeStringArray(fields); writer.writeBooleanArray(fieldsAsc); } @@ -145,7 +133,6 @@ public boolean[] fieldsAsc() { tbl = reader.readString(); name = reader.readString(); type = QueryIndexType.fromOrdinal(reader.readByte()); - inlineSize = reader.readInt(); fields = reader.readStringArray(); fieldsAsc = reader.readBooleanArray(); From c243ed32e9c7d3d316541c76500afb3d78bbc867 Mon Sep 17 00:00:00 2001 From: devozerov Date: Thu, 10 Aug 2017 13:16:28 +0300 Subject: [PATCH 21/32] Cosmetics. --- .../jdbc/thin/JdbcThinDatabaseMetadata.java | 2 +- .../jdbc/thin/JdbcThinParameterMetaData.java | 16 ++++++++-------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinDatabaseMetadata.java b/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinDatabaseMetadata.java index 18e0589e4d79c..c3e526bfbd547 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinDatabaseMetadata.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinDatabaseMetadata.java @@ -1354,7 +1354,7 @@ private List> indexRows(JdbcIndexMeta idxMeta) { } /** {@inheritDoc} */ - @Override public ResultSet getClientInfoProperties() throws SQLException { + @Override public ResultSet getClientInfoProperties() throws SQLException { return new JdbcThinResultSet(Collections.>emptyList(), Arrays.asList( new JdbcColumnMeta(null, null, "NAME", String.class), new JdbcColumnMeta(null, null, "MAX_LEN", Integer.class), diff --git a/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinParameterMetaData.java b/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinParameterMetaData.java index af501c9f26472..1fe52e61d5992 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinParameterMetaData.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinParameterMetaData.java @@ -43,42 +43,42 @@ public JdbcThinParameterMetaData(List meta) { /** {@inheritDoc} */ @Override public int isNullable(int param) throws SQLException { - return meta.get(param -1).isNullable(); + return meta.get(param - 1).isNullable(); } /** {@inheritDoc} */ @Override public boolean isSigned(int param) throws SQLException { - return meta.get(param -1).isSigned(); + return meta.get(param - 1).isSigned(); } /** {@inheritDoc} */ @Override public int getPrecision(int param) throws SQLException { - return meta.get(param -1).precision(); + return meta.get(param - 1).precision(); } /** {@inheritDoc} */ @Override public int getScale(int param) throws SQLException { - return meta.get(param -1).scale(); + return meta.get(param - 1).scale(); } /** {@inheritDoc} */ @Override public int getParameterType(int param) throws SQLException { - return meta.get(param -1).type(); + return meta.get(param - 1).type(); } /** {@inheritDoc} */ @Override public String getParameterTypeName(int param) throws SQLException { - return meta.get(param -1).typeName(); + return meta.get(param - 1).typeName(); } /** {@inheritDoc} */ @Override public String getParameterClassName(int param) throws SQLException { - return meta.get(param -1).typeClass(); + return meta.get(param - 1).typeClass(); } /** {@inheritDoc} */ @Override public int getParameterMode(int param) throws SQLException { - return meta.get(param -1).mode(); + return meta.get(param - 1).mode(); } /** {@inheritDoc} */ From d2075938a95424b97e0e47dcd85dfe06a76d1ba1 Mon Sep 17 00:00:00 2001 From: tledkov-gridgain Date: Thu, 10 Aug 2017 17:58:19 +0300 Subject: [PATCH 22/32] IGNITE-5233: fix review comments --- .../jdbc/thin/JdbcThinMetadataSelfTest.java | 32 ++-- .../jdbc/thin/JdbcThinConnection.java | 8 +- .../jdbc/thin/JdbcThinDatabaseMetadata.java | 142 +++++++++++++++--- ...ta.java => JdbcThinParameterMetadata.java} | 42 ++++-- .../jdbc/thin/JdbcThinPreparedStatement.java | 10 +- .../internal/jdbc/thin/JdbcThinTcpIo.java | 26 +++- .../odbc/SqlListenerNioListener.java | 10 +- .../odbc/SqlListenerRequestHandler.java | 9 ++ .../odbc/jdbc/JdbcMetaParamsResult.java | 10 +- ...cParamMeta.java => JdbcParameterMeta.java} | 6 +- .../odbc/jdbc/JdbcRequestHandler.java | 22 ++- .../odbc/odbc/OdbcRequestHandler.java | 6 + 12 files changed, 244 insertions(+), 79 deletions(-) rename modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/{JdbcThinParameterMetaData.java => JdbcThinParameterMetadata.java} (72%) rename modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/{JdbcParamMeta.java => JdbcParameterMeta.java} (95%) diff --git a/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinMetadataSelfTest.java b/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinMetadataSelfTest.java index 84de6e14caaa4..14a3fb1a564ae 100644 --- a/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinMetadataSelfTest.java +++ b/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinMetadataSelfTest.java @@ -40,6 +40,7 @@ import org.apache.ignite.cache.affinity.AffinityKey; import org.apache.ignite.configuration.CacheConfiguration; import org.apache.ignite.configuration.IgniteConfiguration; +import org.apache.ignite.internal.IgniteVersionUtils; import org.apache.ignite.internal.binary.BinaryMarshaller; import org.apache.ignite.internal.util.typedef.F; import org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi; @@ -413,11 +414,6 @@ else if ("AGE".equals(field)) assert cnt == 3; } - catch (Exception e) { - log.error("Unexpected exception", e); - - fail(); - } } /** @@ -465,11 +461,6 @@ public void testPrimaryKeyMetadata() throws Exception { assert cnt == 1; } - catch (Exception e) { - log.error("Unexpected exception", e); - - fail(); - } } /** @@ -521,11 +512,6 @@ public void testParametersMetadata() throws Exception { assert meta.getParameterType(2) == Types.INTEGER; assert meta.isNullable(2) == ParameterMetaData.parameterNullableUnknown; } - catch (Exception e) { - log.error("Unexpected exception", e); - - fail(); - } } /** @@ -548,11 +534,6 @@ public void testSchemasMetadata() throws Exception { assert expectedSchemas.equals(schemas) : "Unexpected schemas: " + schemas + ". Expected schemas: " + expectedSchemas; } - catch (Exception e) { - log.error("Unexpected exception", e); - - fail(); - } } /** @@ -564,10 +545,15 @@ public void testEmptySchemasMetadata() throws Exception { assert !rs.next() : "Empty result set is expected"; } - catch (Exception e) { - log.error("Unexpected exception", e); + } - fail(); + /** + * @throws Exception If failed. + */ + public void testVersions() throws Exception { + try (Connection conn = DriverManager.getConnection(URL)) { + assert conn.getMetaData().getDatabaseProductVersion().equals(IgniteVersionUtils.VER.toString()); + assert conn.getMetaData().getDriverVersion().equals(IgniteVersionUtils.VER.toString()); } } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinConnection.java b/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinConnection.java index 823c8294757c4..e0b9ca7a835e6 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinConnection.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinConnection.java @@ -91,6 +91,9 @@ public class JdbcThinConnection implements Connection { /** Ignite endpoint. */ private JdbcThinTcpIo cliIo; + /** Metadata. */ + private JdbcThinDatabaseMetadata metadata; + /** * Creates new connection. * @@ -279,7 +282,10 @@ private void checkCursorOptions(int resSetType, int resSetConcurrency, @Override public DatabaseMetaData getMetaData() throws SQLException { ensureNotClosed(); - return new JdbcThinDatabaseMetadata(this); + if (metadata == null) + metadata = new JdbcThinDatabaseMetadata(this); + + return metadata; } /** {@inheritDoc} */ diff --git a/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinDatabaseMetadata.java b/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinDatabaseMetadata.java index c3e526bfbd547..6f0d7175410bb 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinDatabaseMetadata.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinDatabaseMetadata.java @@ -23,12 +23,14 @@ import java.sql.ResultSet; import java.sql.RowIdLifetime; import java.sql.SQLException; +import java.sql.Types; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.LinkedList; import java.util.List; import org.apache.ignite.IgniteCheckedException; +import org.apache.ignite.internal.IgniteVersionUtils; import org.apache.ignite.internal.jdbc2.JdbcUtils; import org.apache.ignite.internal.processors.odbc.jdbc.JdbcColumnMeta; import org.apache.ignite.internal.processors.odbc.jdbc.JdbcIndexMeta; @@ -43,6 +45,7 @@ import static java.sql.Connection.TRANSACTION_NONE; import static java.sql.ResultSet.CONCUR_READ_ONLY; import static java.sql.ResultSet.HOLD_CURSORS_OVER_COMMIT; +import static java.sql.ResultSet.TYPE_FORWARD_ONLY; import static java.sql.RowIdLifetime.ROWID_UNSUPPORTED; /** @@ -107,32 +110,32 @@ public class JdbcThinDatabaseMetadata implements DatabaseMetaData { /** {@inheritDoc} */ @Override public String getDatabaseProductName() throws SQLException { - return "Ignite Cache"; + return "Ignite"; } /** {@inheritDoc} */ @Override public String getDatabaseProductVersion() throws SQLException { - return "4.1.0"; + return conn.io().igniteVersion().toString(); } /** {@inheritDoc} */ @Override public String getDriverName() throws SQLException { - return "Ignite JDBC Driver"; + return "Ignite JDBC Thin Driver"; } /** {@inheritDoc} */ @Override public String getDriverVersion() throws SQLException { - return "1.0"; + return IgniteVersionUtils.VER.toString(); } /** {@inheritDoc} */ @Override public int getDriverMajorVersion() { - return 1; + return IgniteVersionUtils.VER.major(); } /** {@inheritDoc} */ @Override public int getDriverMinorVersion() { - return 0; + return IgniteVersionUtils.VER.minor(); } /** {@inheritDoc} */ @@ -197,27 +200,31 @@ public class JdbcThinDatabaseMetadata implements DatabaseMetaData { /** {@inheritDoc} */ @Override public String getNumericFunctions() throws SQLException { + // TODO: IGNITE-6028 return ""; } /** {@inheritDoc} */ @Override public String getStringFunctions() throws SQLException { + // TODO: IGNITE-6028 return ""; } /** {@inheritDoc} */ @Override public String getSystemFunctions() throws SQLException { + // TODO: IGNITE-6028 return ""; } /** {@inheritDoc} */ @Override public String getTimeDateFunctions() throws SQLException { + // TODO: IGNITE-6028 return ""; } /** {@inheritDoc} */ @Override public String getSearchStringEscape() throws SQLException { - return ""; + return "\\"; } /** {@inheritDoc} */ @@ -247,12 +254,12 @@ public class JdbcThinDatabaseMetadata implements DatabaseMetaData { /** {@inheritDoc} */ @Override public boolean supportsConvert() throws SQLException { - return false; + return true; } /** {@inheritDoc} */ @Override public boolean supportsConvert(int fromType, int toType) throws SQLException { - return false; + return true; } /** {@inheritDoc} */ @@ -317,7 +324,7 @@ public class JdbcThinDatabaseMetadata implements DatabaseMetaData { /** {@inheritDoc} */ @Override public boolean supportsCoreSQLGrammar() throws SQLException { - return false; + return true; } /** {@inheritDoc} */ @@ -327,7 +334,7 @@ public class JdbcThinDatabaseMetadata implements DatabaseMetaData { /** {@inheritDoc} */ @Override public boolean supportsANSI92EntryLevelSQL() throws SQLException { - return false; + return true; } /** {@inheritDoc} */ @@ -352,7 +359,7 @@ public class JdbcThinDatabaseMetadata implements DatabaseMetaData { /** {@inheritDoc} */ @Override public boolean supportsFullOuterJoins() throws SQLException { - return true; + return false; } /** {@inheritDoc} */ @@ -387,7 +394,7 @@ public class JdbcThinDatabaseMetadata implements DatabaseMetaData { /** {@inheritDoc} */ @Override public boolean supportsSchemasInDataManipulation() throws SQLException { - return false; + return true; } /** {@inheritDoc} */ @@ -697,7 +704,7 @@ public class JdbcThinDatabaseMetadata implements DatabaseMetaData { if (conn.isClosed()) throw new SQLException("Connection is closed."); - JdbcMetaTablesResult res = conn.io().tablesMeta(catalog, schemaPtrn, tblNamePtrn, tblTypes); + JdbcMetaTablesResult res = conn.io().tablesMeta(schemaPtrn, tblNamePtrn, tblTypes); List> rows = new LinkedList<>(); @@ -1017,7 +1024,93 @@ private List> primaryKeyRows(JdbcPrimaryKeyMeta pkMeta) { /** {@inheritDoc} */ @Override public ResultSet getTypeInfo() throws SQLException { - return new JdbcThinResultSet(Collections.>emptyList(), Arrays.asList( + List> types = new ArrayList<>(21); + + types.add(Arrays.asList("BOOLEAN", Types.BOOLEAN, 1, null, null, null, + (short)typeNullable, false, (short)typeSearchable, false, false, false, "BOOLEAN", 0, 0, + Types.BOOLEAN, 0, 10)); + + types.add(Arrays.asList("TINYINT", Types.TINYINT, 3, null, null, null, + (short)typeNullable, false, (short)typeSearchable, false, false, false, "TINYINT", 0, 0, + Types.TINYINT, 0, 10)); + + types.add(Arrays.asList("SMALLINT", Types.SMALLINT, 5, null, null, null, + (short)typeNullable, false, (short)typeSearchable, false, false, false, "SMALLINT", 0, 0, + Types.SMALLINT, 0, 10)); + + types.add(Arrays.asList("INTEGER", Types.INTEGER, 10, null, null, null, + (short)typeNullable, false, (short)typeSearchable, false, false, false, "INTEGER", 0, 0, + Types.INTEGER, 0, 10)); + + types.add(Arrays.asList("BIGINT", Types.BIGINT, 19, null, null, null, + (short)typeNullable, false, (short)typeSearchable, false, false, false, "BIGINT", 0, 0, + Types.BIGINT, 0, 10)); + + types.add(Arrays.asList("FLOAT", Types.FLOAT, 17, null, null, null, + (short)typeNullable, false, (short)typeSearchable, false, false, false, "FLOAT", 0, 0, + Types.FLOAT, 0, 10)); + + types.add(Arrays.asList("REAL", Types.REAL, 7, null, null, null, + (short)typeNullable, false, (short)typeSearchable, false, false, false, "REAL", 0, 0, + Types.REAL, 0, 10)); + + types.add(Arrays.asList("DOUBLE", Types.DOUBLE, 17, null, null, null, + (short)typeNullable, false, (short)typeSearchable, false, false, false, "DOUBLE", 0, 0, + Types.DOUBLE, 0, 10)); + + types.add(Arrays.asList("NUMERIC", Types.NUMERIC, Integer.MAX_VALUE, null, null, "PRECISION,SCALE", + (short)typeNullable, false, (short)typeSearchable, false, false, false, "NUMERIC", 0, 0, + Types.NUMERIC, 0, 10)); + + types.add(Arrays.asList("DECIMAL", Types.DECIMAL, Integer.MAX_VALUE, null, null, "PRECISION,SCALE", + (short)typeNullable, false, (short)typeSearchable, false, false, false, "DECIMAL", 0, 0, + Types.DECIMAL, 0, 10)); + + types.add(Arrays.asList("DATE", Types.DATE, 8, "DATE '", "'", null, + (short)typeNullable, false, (short)typeSearchable, false, false, false, "DATE", 0, 0, + Types.DATE, 0, null)); + + types.add(Arrays.asList("TIME", Types.TIME, 6, "TIME '", "'", null, + (short)typeNullable, false, (short)typeSearchable, false, false, false, "TIME", 0, 0, + Types.TIME, 0, null)); + + types.add(Arrays.asList("TIMESTAMP", Types.TIMESTAMP, 23, "TIMESTAMP '", "'", null, + (short)typeNullable, false, (short)typeSearchable, false, false, false, "TIMESTAMP", 0, 10, + Types.TIMESTAMP, 0, null)); + + types.add(Arrays.asList("CHAR", Types.CHAR, Integer.MAX_VALUE, "'", "'", "LENGTH", + (short)typeNullable, true, (short)typeSearchable, false, false, false, "CHAR", 0, 0, + Types.CHAR, 0, null)); + + types.add(Arrays.asList("VARCHAR", Types.VARCHAR, Integer.MAX_VALUE, "'", "'", "LENGTH", + (short)typeNullable, true, (short)typeSearchable, false, false, false, "VARCHAR", 0, 0, + Types.VARCHAR, 0, null)); + + types.add(Arrays.asList("LONGVARCHAR", Types.LONGVARCHAR, Integer.MAX_VALUE, "'", "'", "LENGTH", + (short)typeNullable, true, (short)typeSearchable, false, false, false, "LONGVARCHAR", 0, 0, + Types.LONGVARCHAR, 0, null)); + + types.add(Arrays.asList("BINARY", Types.BINARY, Integer.MAX_VALUE, "'", "'", "LENGTH", + (short)typeNullable, false, (short)typeSearchable, false, false, false, "BINARY", 0, 0, + Types.BINARY, 0, null)); + + types.add(Arrays.asList("VARBINARY", Types.VARBINARY, Integer.MAX_VALUE, "'", "'", "LENGTH", + (short)typeNullable, false, (short)typeSearchable, false, false, false, "VARBINARY", 0, 0, + Types.VARBINARY, 0, null)); + + types.add(Arrays.asList("LONGVARBINARY", Types.LONGVARBINARY, Integer.MAX_VALUE, "'", "'", "LENGTH", + (short)typeNullable, false, (short)typeSearchable, false, false, false, "LONGVARBINARY", 0, 0, + Types.LONGVARBINARY, 0, null)); + + types.add(Arrays.asList("OTHER", Types.OTHER, Integer.MAX_VALUE, "'", "'", "LENGTH", + (short)typeNullable, false, (short)typeSearchable, false, false, false, "OTHER", 0, 0, + Types.OTHER, 0, null)); + + types.add(Arrays.asList("ARRAY", Types.ARRAY, 0, "(", "')", null, + (short)typeNullable, false, (short)typeSearchable, false, false, false, "ARRAY", 0, 0, + Types.ARRAY, 0, null)); + + return new JdbcThinResultSet(types, Arrays.asList( new JdbcColumnMeta(null, null, "TYPE_NAME", String.class), new JdbcColumnMeta(null, null, "DATA_TYPE", Integer.class), new JdbcColumnMeta(null, null, "PRECISION", Integer.class), @@ -1110,12 +1203,12 @@ private List> indexRows(JdbcIndexMeta idxMeta) { /** {@inheritDoc} */ @Override public boolean supportsResultSetType(int type) throws SQLException { - return true; + return type == TYPE_FORWARD_ONLY; } /** {@inheritDoc} */ @Override public boolean supportsResultSetConcurrency(int type, int concurrency) throws SQLException { - return concurrency == CONCUR_READ_ONLY; + return supportsResultSetType(type) && concurrency == CONCUR_READ_ONLY; } /** {@inheritDoc} */ @@ -1271,17 +1364,17 @@ private List> indexRows(JdbcIndexMeta idxMeta) { /** {@inheritDoc} */ @Override public int getDatabaseMajorVersion() throws SQLException { - return 1; + return conn.io().igniteVersion().major(); } /** {@inheritDoc} */ @Override public int getDatabaseMinorVersion() throws SQLException { - return 0; + return conn.io().igniteVersion().minor(); } /** {@inheritDoc} */ @Override public int getJDBCMajorVersion() throws SQLException { - return 1; + return 4; } /** {@inheritDoc} */ @@ -1291,7 +1384,7 @@ private List> indexRows(JdbcIndexMeta idxMeta) { /** {@inheritDoc} */ @Override public int getSQLStateType() throws SQLException { - return 0; + return DatabaseMetaData.sqlStateSQL99; } /** {@inheritDoc} */ @@ -1354,7 +1447,8 @@ private List> indexRows(JdbcIndexMeta idxMeta) { } /** {@inheritDoc} */ - @Override public ResultSet getClientInfoProperties() throws SQLException { + @Override public ResultSet getClientInfoProperties() throws SQLException { + // TODO: IGNITE-5425. return new JdbcThinResultSet(Collections.>emptyList(), Arrays.asList( new JdbcColumnMeta(null, null, "NAME", String.class), new JdbcColumnMeta(null, null, "MAX_LEN", Integer.class), @@ -1366,7 +1460,7 @@ private List> indexRows(JdbcIndexMeta idxMeta) { /** {@inheritDoc} */ @Override public ResultSet getFunctions(String catalog, String schemaPtrn, String functionNamePtrn) throws SQLException { - + // TODO: IGNITE-6028 return new JdbcThinResultSet(Collections.>emptyList(), Arrays.asList( new JdbcColumnMeta(null, null, "FUNCTION_CAT", String.class), new JdbcColumnMeta(null, null, "FUNCTION_SCHEM", String.class), @@ -1380,7 +1474,7 @@ private List> indexRows(JdbcIndexMeta idxMeta) { /** {@inheritDoc} */ @Override public ResultSet getFunctionColumns(String catalog, String schemaPtrn, String functionNamePtrn, String colNamePtrn) throws SQLException { - + // TODO: IGNITE-6028 return new JdbcThinResultSet(Collections.>emptyList(), Arrays.asList( new JdbcColumnMeta(null, null, "FUNCTION_CAT", String.class), new JdbcColumnMeta(null, null, "FUNCTION_SCHEM", String.class), diff --git a/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinParameterMetaData.java b/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinParameterMetadata.java similarity index 72% rename from modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinParameterMetaData.java rename to modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinParameterMetadata.java index 1fe52e61d5992..712d3c1d46be2 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinParameterMetaData.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinParameterMetadata.java @@ -20,19 +20,21 @@ import java.sql.ParameterMetaData; import java.sql.SQLException; import java.util.List; -import org.apache.ignite.internal.processors.odbc.jdbc.JdbcParamMeta; +import org.apache.ignite.internal.processors.odbc.jdbc.JdbcParameterMeta; /** * JDBC SQL query's parameters metadata. */ -public class JdbcThinParameterMetaData implements ParameterMetaData { +public class JdbcThinParameterMetadata implements ParameterMetaData { /** Meta. */ - private final List meta; + private final List meta; /** * @param meta Parameters metadata. */ - public JdbcThinParameterMetaData(List meta) { + public JdbcThinParameterMetadata(List meta) { + assert meta != null; + this.meta = meta; } @@ -43,42 +45,42 @@ public JdbcThinParameterMetaData(List meta) { /** {@inheritDoc} */ @Override public int isNullable(int param) throws SQLException { - return meta.get(param - 1).isNullable(); + return parameter(param).isNullable(); } /** {@inheritDoc} */ @Override public boolean isSigned(int param) throws SQLException { - return meta.get(param - 1).isSigned(); + return parameter(param).isSigned(); } /** {@inheritDoc} */ @Override public int getPrecision(int param) throws SQLException { - return meta.get(param - 1).precision(); + return parameter(param).precision(); } /** {@inheritDoc} */ @Override public int getScale(int param) throws SQLException { - return meta.get(param - 1).scale(); + return parameter(param).scale(); } /** {@inheritDoc} */ @Override public int getParameterType(int param) throws SQLException { - return meta.get(param - 1).type(); + return parameter(param).type(); } /** {@inheritDoc} */ @Override public String getParameterTypeName(int param) throws SQLException { - return meta.get(param - 1).typeName(); + return parameter(param).typeName(); } /** {@inheritDoc} */ @Override public String getParameterClassName(int param) throws SQLException { - return meta.get(param - 1).typeClass(); + return parameter(param).typeClass(); } /** {@inheritDoc} */ @Override public int getParameterMode(int param) throws SQLException { - return meta.get(param - 1).mode(); + return parameter(param).mode(); } /** {@inheritDoc} */ @@ -91,6 +93,20 @@ public JdbcThinParameterMetaData(List meta) { /** {@inheritDoc} */ @Override public boolean isWrapperFor(Class iface) throws SQLException { - return iface != null && iface.isAssignableFrom(JdbcThinParameterMetaData.class); + return iface != null && iface.isAssignableFrom(JdbcThinParameterMetadata.class); + } + + /** + * Bounds checks the parameter index. + * + * @param param Parameter index. + * @return Parameter. + * @throws SQLException If failed. + */ + private JdbcParameterMeta parameter(int param) throws SQLException { + if (param <= 0 || param > meta.size()) + throw new SQLException("Invalid parameter number"); + + return meta.get(param - 1); } } \ No newline at end of file diff --git a/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinPreparedStatement.java b/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinPreparedStatement.java index f75a5de02f1e4..92cbef5ef43a5 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinPreparedStatement.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinPreparedStatement.java @@ -55,6 +55,9 @@ public class JdbcThinPreparedStatement extends JdbcThinStatement implements Prep /** Query arguments. */ protected ArrayList args; + /** Parameter meta data. */ + private JdbcThinParameterMetadata metaData; + /** * Creates new prepared statement. * @@ -329,9 +332,14 @@ private void executeWithArguments() throws SQLException { if (conn.isClosed()) throw new SQLException("Connection is closed."); + if (metaData != null) + return metaData; + JdbcMetaParamsResult res = conn.io().parametersMeta(conn.getSchema(), sql); - return new JdbcThinParameterMetaData(res.meta()); + metaData = new JdbcThinParameterMetadata(res.meta()); + + return metaData; } catch (IOException e) { conn.close(); diff --git a/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinTcpIo.java b/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinTcpIo.java index 6e394c4cbe7e9..55939ff6beecb 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinTcpIo.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinTcpIo.java @@ -59,6 +59,7 @@ import org.apache.ignite.internal.processors.odbc.jdbc.JdbcResult; import org.apache.ignite.internal.util.ipc.loopback.IpcClientTcpEndpoint; import org.apache.ignite.internal.util.typedef.internal.U; +import org.apache.ignite.lang.IgniteProductVersion; /** * JDBC IO layer implementation based on blocking IPC streams. @@ -127,6 +128,9 @@ public class JdbcThinTcpIo { /** Closed flag. */ private boolean closed; + /** Ignite server version. */ + private IgniteProductVersion igniteVer; + /** * Constructor. * @@ -214,8 +218,18 @@ public void handshake() throws IOException, IgniteCheckedException { boolean accepted = reader.readBoolean(); - if (accepted) + if (accepted) { + byte maj = reader.readByte(); + byte min = reader.readByte(); + byte maintenance = reader.readByte(); + String stage = reader.readString(); + long ts = reader.readLong(); + byte[] hash = reader.readByteArray(); + + igniteVer = new IgniteProductVersion(maj, min, maintenance, stage, ts, hash); + return; + } short maj = reader.readShort(); short min = reader.readShort(); @@ -321,7 +335,6 @@ public JdbcBatchExecuteResult batchExecute(String schema, List batch) } /** - * @param catalog Catalog. * @param schemaPtrn Schema name pattern. * @param tablePtrn Table name pattern. * @param types Table types @@ -329,7 +342,7 @@ public JdbcBatchExecuteResult batchExecute(String schema, List batch) * @throws IOException On error. * @throws IgniteCheckedException On error. */ - public JdbcMetaTablesResult tablesMeta(String catalog, String schemaPtrn, String tablePtrn, String[] types) + public JdbcMetaTablesResult tablesMeta(String schemaPtrn, String tablePtrn, String[] types) throws IOException, IgniteCheckedException { return sendRequest(new JdbcMetaTablesRequest(schemaPtrn, tablePtrn, types), DYNAMIC_SIZE_MSG_CAP); } @@ -520,4 +533,11 @@ public int socketReceiveBuffer() { public boolean tcpNoDelay() { return tcpNoDelay; } + + /** + * @return Ignnite server version. + */ + IgniteProductVersion igniteVersion() { + return igniteVer; + } } \ No newline at end of file diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/SqlListenerNioListener.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/SqlListenerNioListener.java index a879796dbdf12..e8d042cde79b9 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/SqlListenerNioListener.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/SqlListenerNioListener.java @@ -198,9 +198,11 @@ private void onHandshake(GridNioSession ses, byte[] msg) { String errMsg = null; + SqlListenerConnectionContext connCtx = null; + if (SUPPORTED_VERS.contains(ver)) { // Prepare context. - SqlListenerConnectionContext connCtx = prepareContext(ver, reader); + connCtx = prepareContext(ver, reader); ses.addMeta(CONN_CTX_META_KEY, connCtx); } @@ -213,8 +215,12 @@ private void onHandshake(GridNioSession ses, byte[] msg) { // Send response. BinaryWriterExImpl writer = new BinaryWriterExImpl(null, new BinaryHeapOutputStream(8), null, null); - if (errMsg == null) + if (errMsg == null) { writer.writeBoolean(true); + + if (connCtx != null) + connCtx.handler().handshakeAdditionalResponse(writer); + } else { writer.writeBoolean(false); writer.writeShort(CURRENT_VER.major()); diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/SqlListenerRequestHandler.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/SqlListenerRequestHandler.java index 98dc03932ee5b..27dc66bf4722f 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/SqlListenerRequestHandler.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/SqlListenerRequestHandler.java @@ -17,6 +17,8 @@ package org.apache.ignite.internal.processors.odbc; +import org.apache.ignite.internal.binary.BinaryWriterExImpl; + /** * SQL listener request handler. */ @@ -36,4 +38,11 @@ public interface SqlListenerRequestHandler { * @return Error response. */ public SqlListenerResponse handleException(Exception e); + + /** + * Add custom data to handshake response. + * + * @param writer Binary writer. + */ + public void handshakeAdditionalResponse(BinaryWriterExImpl writer); } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaParamsResult.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaParamsResult.java index d2317bb953343..c6e3f93c49dd8 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaParamsResult.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaParamsResult.java @@ -30,7 +30,7 @@ */ public class JdbcMetaParamsResult extends JdbcResult { /** Parameters meta results. */ - private List meta; + private List meta; /** * Default constructor is used for deserialization. @@ -42,7 +42,7 @@ public class JdbcMetaParamsResult extends JdbcResult { /** * @param meta Column metadata. */ - JdbcMetaParamsResult(List meta) { + JdbcMetaParamsResult(List meta) { super(META_PARAMS); this.meta = meta; } @@ -56,7 +56,7 @@ public class JdbcMetaParamsResult extends JdbcResult { else { writer.writeInt(meta.size()); - for(JdbcParamMeta m : meta) + for(JdbcParameterMeta m : meta) m.writeBinary(writer); } } @@ -73,7 +73,7 @@ public class JdbcMetaParamsResult extends JdbcResult { meta = new ArrayList<>(size); for (int i = 0; i < size; ++i) { - JdbcParamMeta m = new JdbcParamMeta(); + JdbcParameterMeta m = new JdbcParameterMeta(); m.readBinary(reader); @@ -85,7 +85,7 @@ public class JdbcMetaParamsResult extends JdbcResult { /** * @return Query result rows. */ - public List meta() { + public List meta() { return meta; } } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcParamMeta.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcParameterMeta.java similarity index 95% rename from modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcParamMeta.java rename to modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcParameterMeta.java index cbe8f82d95855..8437b95e45f57 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcParamMeta.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcParameterMeta.java @@ -28,7 +28,7 @@ * * {@see java.sql.ParameterMetaData}. */ -public class JdbcParamMeta implements JdbcRawBinarylizable { +public class JdbcParameterMeta implements JdbcRawBinarylizable { /** Null value is allow for the param. */ private int isNullable; @@ -57,7 +57,7 @@ public class JdbcParamMeta implements JdbcRawBinarylizable { /** * Default constructor is used for binary serialization. */ - public JdbcParamMeta() { + public JdbcParameterMeta() { // No-op. } @@ -66,7 +66,7 @@ public JdbcParamMeta() { * @param order Param order. * @throws SQLException On errror. */ - public JdbcParamMeta(ParameterMetaData meta, int order) throws SQLException { + public JdbcParameterMeta(ParameterMetaData meta, int order) throws SQLException { isNullable = meta.isNullable(order); signed = meta.isSigned(order); precision = meta.getPrecision(order); diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcRequestHandler.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcRequestHandler.java index e5c79fa559875..ab5984d58e51d 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcRequestHandler.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcRequestHandler.java @@ -32,6 +32,8 @@ import org.apache.ignite.cache.query.FieldsQueryCursor; import org.apache.ignite.cache.query.SqlFieldsQuery; import org.apache.ignite.internal.GridKernalContext; +import org.apache.ignite.internal.IgniteVersionUtils; +import org.apache.ignite.internal.binary.BinaryWriterExImpl; import org.apache.ignite.internal.processors.cache.QueryCursorImpl; import org.apache.ignite.internal.processors.odbc.SqlListenerRequest; import org.apache.ignite.internal.processors.odbc.SqlListenerRequestHandler; @@ -160,7 +162,7 @@ public JdbcRequestHandler(GridKernalContext ctx, GridSpinBusyLock busyLock, int return getIndexesMeta((JdbcMetaIndexesRequest)req); case META_PARAMS: - return getParamsMeta((JdbcMetaParamsRequest)req); + return getParametersMeta((JdbcMetaParamsRequest)req); case META_PRIMARY_KEYS: return getPrimaryKeys((JdbcMetaPrimaryKeysRequest)req); @@ -181,6 +183,18 @@ public JdbcRequestHandler(GridKernalContext ctx, GridSpinBusyLock busyLock, int return new JdbcResponse(SqlListenerResponse.STATUS_FAILED, e.toString()); } + /** {@inheritDoc} */ + @Override public void handshakeAdditionalResponse(BinaryWriterExImpl writer) { + // Write server version. + writer.writeByte(IgniteVersionUtils.VER.major()); + writer.writeByte(IgniteVersionUtils.VER.minor()); + writer.writeByte(IgniteVersionUtils.VER.maintenance()); + writer.writeString(IgniteVersionUtils.VER.stage()); + writer.writeLong(IgniteVersionUtils.VER.revisionTimestamp()); + writer.writeByteArray(IgniteVersionUtils.VER.revisionHash()); + } + + /** * {@link JdbcQueryExecuteRequest} command handler. * @@ -549,17 +563,17 @@ private SqlListenerResponse getIndexesMeta(JdbcMetaIndexesRequest req) { * @param req Request. * @return Response. */ - private SqlListenerResponse getParamsMeta(JdbcMetaParamsRequest req) { + private SqlListenerResponse getParametersMeta(JdbcMetaParamsRequest req) { try { ParameterMetaData paramMeta = ctx.query().prepareNativeStatement(req.schema(), req.sql()) .getParameterMetaData(); int size = paramMeta.getParameterCount(); - List meta = new ArrayList<>(size); + List meta = new ArrayList<>(size); for (int i = 0; i < size; i++) - meta.add(new JdbcParamMeta(paramMeta, i + 1)); + meta.add(new JdbcParameterMeta(paramMeta, i + 1)); JdbcMetaParamsResult res = new JdbcMetaParamsResult(meta); diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/odbc/OdbcRequestHandler.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/odbc/OdbcRequestHandler.java index bb54b59daac81..3d575334273d4 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/odbc/OdbcRequestHandler.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/odbc/OdbcRequestHandler.java @@ -33,6 +33,7 @@ import org.apache.ignite.cache.query.QueryCursor; import org.apache.ignite.cache.query.SqlFieldsQuery; import org.apache.ignite.internal.GridKernalContext; +import org.apache.ignite.internal.binary.BinaryWriterExImpl; import org.apache.ignite.internal.binary.GridBinaryMarshaller; import org.apache.ignite.internal.processors.cache.QueryCursorImpl; import org.apache.ignite.internal.processors.odbc.SqlListenerRequest; @@ -156,6 +157,11 @@ public OdbcRequestHandler(GridKernalContext ctx, GridSpinBusyLock busyLock, int return new OdbcResponse(SqlListenerResponse.STATUS_FAILED, e.toString()); } + /** {@inheritDoc} */ + @Override public void handshakeAdditionalResponse(BinaryWriterExImpl writer) { + // No-op. + } + /** * {@link OdbcQueryExecuteRequest} command handler. * From c799df6f0ff9e1f52fe193331d307f1dca0b523b Mon Sep 17 00:00:00 2001 From: devozerov Date: Mon, 14 Aug 2017 14:22:54 +0300 Subject: [PATCH 23/32] TODOs and cosmetics. --- .../jdbc/thin/JdbcThinDatabaseMetadata.java | 12 ++-- .../jdbc/thin/JdbcThinResultSetMetadata.java | 2 +- .../processors/odbc/jdbc/JdbcColumnMeta.java | 60 ++++++++++--------- .../processors/odbc/jdbc/JdbcIndexMeta.java | 57 +++++++++--------- .../odbc/jdbc/JdbcMetaColumnsRequest.java | 40 ++++++------- .../odbc/jdbc/JdbcMetaIndexesRequest.java | 19 +++--- .../odbc/jdbc/JdbcMetaParamsRequest.java | 18 +++--- .../odbc/jdbc/JdbcMetaPrimaryKeysRequest.java | 26 ++++---- .../odbc/jdbc/JdbcMetaSchemasRequest.java | 16 ++--- .../odbc/jdbc/JdbcMetaTablesRequest.java | 30 +++++----- .../odbc/jdbc/JdbcPrimaryKeyMeta.java | 36 +++++------ .../odbc/jdbc/JdbcRequestHandler.java | 20 +++---- .../processors/odbc/jdbc/JdbcTableMeta.java | 30 +++++----- 13 files changed, 187 insertions(+), 179 deletions(-) diff --git a/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinDatabaseMetadata.java b/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinDatabaseMetadata.java index 6f0d7175410bb..e5fb79cf73db0 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinDatabaseMetadata.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinDatabaseMetadata.java @@ -741,8 +741,8 @@ private List tableRow(JdbcTableMeta tblMeta) { List row = new ArrayList<>(10); row.add(tblMeta.catalog()); - row.add(tblMeta.schema()); - row.add(tblMeta.table()); + row.add(tblMeta.schemaName()); + row.add(tblMeta.tableName()); row.add(tblMeta.tableType()); row.add(null); row.add(null); @@ -826,7 +826,7 @@ private List columnRow(JdbcColumnMeta colMeta, int pos) { List row = new ArrayList<>(20); row.add((String)null); - row.add(colMeta.schema()); + row.add(colMeta.schemaName()); row.add(colMeta.tableName()); row.add(colMeta.columnName()); row.add(colMeta.dataType()); @@ -949,7 +949,7 @@ private List> primaryKeyRows(JdbcPrimaryKeyMeta pkMeta) { List row = new ArrayList<>(6); row.add((String)null); // table catalog - row.add(pkMeta.schema()); + row.add(pkMeta.schemaName()); row.add(pkMeta.tableName()); row.add(pkMeta.fields()[i]); row.add((Integer)i + 1); // sequence number @@ -1182,11 +1182,11 @@ private List> indexRows(JdbcIndexMeta idxMeta) { List row = new ArrayList<>(13); row.add((String)null); // table catalog - row.add(idxMeta.schema()); + row.add(idxMeta.schemaName()); row.add(idxMeta.tableName()); row.add(true); // non unique row.add(null); // index qualifier (index catalog) - row.add(idxMeta.name()); + row.add(idxMeta.indexName()); row.add((short)tableIndexOther); // type row.add((Integer)i); // field ordinal position in index row.add(idxMeta.fields()[i]); diff --git a/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinResultSetMetadata.java b/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinResultSetMetadata.java index 2e3c4b8d3a67d..4c560bc07464f 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinResultSetMetadata.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinResultSetMetadata.java @@ -93,7 +93,7 @@ public class JdbcThinResultSetMetadata implements ResultSetMetaData { /** {@inheritDoc} */ @Override public String getSchemaName(int col) throws SQLException { - return meta.get(col - 1).schema(); + return meta.get(col - 1).schemaName(); } /** {@inheritDoc} */ diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcColumnMeta.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcColumnMeta.java index ecc04577e61f0..826602247ac97 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcColumnMeta.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcColumnMeta.java @@ -27,13 +27,13 @@ */ public class JdbcColumnMeta implements JdbcRawBinarylizable { /** Cache name. */ - private String schema; + private String schemaName; /** Table name. */ - private String tbl; + private String tblName; /** Column name. */ - private String col; + private String colName; /** Data type. */ private int dataType; @@ -48,15 +48,16 @@ public class JdbcColumnMeta implements JdbcRawBinarylizable { * Default constructor is used for serialization. */ JdbcColumnMeta() { + // TODO: add no-op. } /** * @param info Field metadata. */ JdbcColumnMeta(GridQueryFieldMetadata info) { - this.schema = info.schemaName(); - this.tbl = info.typeName(); - this.col = info.fieldName(); + this.schemaName = info.schemaName(); + this.tblName = info.typeName(); + this.colName = info.fieldName(); dataType = JdbcThinUtils.type(info.fieldTypeName()); dataTypeName = JdbcThinUtils.typeName(info.fieldTypeName()); @@ -64,15 +65,15 @@ public class JdbcColumnMeta implements JdbcRawBinarylizable { } /** - * @param schema Schema. + * @param schemaName Schema. * @param tableName Table. - * @param col Column. + * @param colName Column. * @param cls Type. */ - public JdbcColumnMeta(String schema, String tableName, String col, Class cls) { - this.schema = schema; - this.tbl = tableName; - this.col = col; + public JdbcColumnMeta(String schemaName, String tableName, String colName, Class cls) { + this.schemaName = schemaName; + this.tblName = tableName; + this.colName = colName; String type = cls.getName(); dataType = JdbcThinUtils.type(type); @@ -80,26 +81,26 @@ public JdbcColumnMeta(String schema, String tableName, String col, Class cls) dataTypeClass = type; } - + // TODO: Spacing. /** * @return Schema name. */ - public String schema() { - return schema; + public String schemaName() { + return schemaName; } /** * @return Table name. */ public String tableName() { - return tbl; + return tblName; } /** * @return Column name. */ public String columnName() { - return col; + return colName; } /** @@ -125,9 +126,9 @@ public String dataTypeClass() { /** {@inheritDoc} */ @Override public void writeBinary(BinaryWriterExImpl writer) { - writer.writeString(schema); - writer.writeString(tbl); - writer.writeString(col); + writer.writeString(schemaName); + writer.writeString(tblName); + writer.writeString(colName); writer.writeInt(dataType); writer.writeString(dataTypeName); @@ -136,9 +137,9 @@ public String dataTypeClass() { /** {@inheritDoc} */ @Override public void readBinary(BinaryReaderExImpl reader) { - schema = reader.readString(); - tbl = reader.readString(); - col = reader.readString(); + schemaName = reader.readString(); + tblName = reader.readString(); + colName = reader.readString(); dataType = reader.readInt(); dataTypeName = reader.readString(); @@ -155,20 +156,21 @@ public String dataTypeClass() { JdbcColumnMeta meta = (JdbcColumnMeta)o; - if (schema != null ? !schema.equals(meta.schema) : meta.schema != null) + // TODO: What is that? F.eq(schema, meta.schema); + if (schemaName != null ? !schemaName.equals(meta.schemaName) : meta.schemaName != null) return false; - if (tbl != null ? !tbl.equals(meta.tbl) : meta.tbl!= null) + if (tblName != null ? !tblName.equals(meta.tblName) : meta.tblName != null) return false; - return col.equals(meta.col); + return colName.equals(meta.colName); } /** {@inheritDoc} */ @Override public int hashCode() { - int result = schema != null ? schema.hashCode() : 0; - result = 31 * result + (tbl != null ? tbl.hashCode() : 0); - result = 31 * result + col.hashCode(); + int result = schemaName != null ? schemaName.hashCode() : 0; + result = 31 * result + (tblName != null ? tblName.hashCode() : 0); + result = 31 * result + colName.hashCode(); return result; } } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcIndexMeta.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcIndexMeta.java index c180579f93d84..78e090d5acea9 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcIndexMeta.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcIndexMeta.java @@ -27,14 +27,15 @@ * JDBC index metadata. */ public class JdbcIndexMeta implements JdbcRawBinarylizable { + // TODO: Invalid JavaDocs: table -> schema /** Index table name. */ - private String schema; + private String schemaName; /** Index table name. */ - private String tbl; + private String tblName; /** Index name. */ - private String name; + private String idxName; /** Index type. */ private QueryIndexType type; @@ -53,19 +54,19 @@ public class JdbcIndexMeta implements JdbcRawBinarylizable { } /** - * @param schema Schema name. - * @param tbl Table name. + * @param schemaName Schema name. + * @param tblName Table name. * @param idx Index info. */ - JdbcIndexMeta(String schema, String tbl, GridQueryIndexDescriptor idx) { - assert tbl != null; + JdbcIndexMeta(String schemaName, String tblName, GridQueryIndexDescriptor idx) { + assert tblName != null; assert idx != null; assert idx.fields() != null; - this.schema = schema; - this.tbl = tbl; + this.schemaName = schemaName; + this.tblName = tblName; - name = idx.name(); + idxName = idx.name(); type = idx.type(); fields = idx.fields().toArray(new String[idx.fields().size()]); @@ -78,22 +79,23 @@ public class JdbcIndexMeta implements JdbcRawBinarylizable { /** * @return Schema name. */ - public String schema() { - return schema; + // TOOD: schemaName() + public String schemaName() { + return schemaName; } /** * @return Table name. */ public String tableName() { - return tbl; + return tblName; } /** * @return Index name. */ - public String name() { - return name; + public String indexName() { + return idxName; } /** @@ -119,9 +121,9 @@ public boolean[] fieldsAsc() { /** {@inheritDoc} */ @Override public void writeBinary(BinaryWriterExImpl writer) throws BinaryObjectException { - writer.writeString(schema); - writer.writeString(tbl); - writer.writeString(name); + writer.writeString(schemaName); + writer.writeString(tblName); + writer.writeString(idxName); writer.writeByte((byte)type.ordinal()); writer.writeStringArray(fields); writer.writeBooleanArray(fieldsAsc); @@ -129,9 +131,9 @@ public boolean[] fieldsAsc() { /** {@inheritDoc} */ @Override public void readBinary(BinaryReaderExImpl reader) throws BinaryObjectException { - schema = reader.readString(); - tbl = reader.readString(); - name = reader.readString(); + schemaName = reader.readString(); + tblName = reader.readString(); + idxName = reader.readString(); type = QueryIndexType.fromOrdinal(reader.readByte()); fields = reader.readStringArray(); fieldsAsc = reader.readBooleanArray(); @@ -150,20 +152,21 @@ public boolean[] fieldsAsc() { JdbcIndexMeta meta = (JdbcIndexMeta)o; - if (schema != null ? !schema.equals(meta.schema) : meta.schema != null) + // TODO: F.eq(schema, meta.schema) + if (schemaName != null ? !schemaName.equals(meta.schemaName) : meta.schemaName != null) return false; - if (!tbl.equals(meta.tbl)) + if (!tblName.equals(meta.tblName)) return false; - return name.equals(meta.name); + return idxName.equals(meta.idxName); } /** {@inheritDoc} */ @Override public int hashCode() { - int result = schema != null ? schema.hashCode() : 0; - result = 31 * result + tbl.hashCode(); - result = 31 * result + name.hashCode(); + int result = schemaName != null ? schemaName.hashCode() : 0; + result = 31 * result + tblName.hashCode(); + result = 31 * result + idxName.hashCode(); return result; } } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaColumnsRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaColumnsRequest.java index 1fd1d8b9a764b..2b3854e15ea6e 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaColumnsRequest.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaColumnsRequest.java @@ -28,13 +28,13 @@ */ public class JdbcMetaColumnsRequest extends JdbcRequest { /** Schema name. */ - private String schema; + private String schemaName; /** Table name. */ - private String tableName; + private String tblName; /** Column name. */ - private String columnName; + private String colName; /** * Default constructor is used for deserialization. @@ -44,55 +44,55 @@ public class JdbcMetaColumnsRequest extends JdbcRequest { } /** - * @param schema Schema name. - * @param tableName Table name. - * @param columnName Column name. + * @param schemaName Schema name. + * @param tblName Table name. + * @param colName Column name. */ - public JdbcMetaColumnsRequest(String schema, String tableName, String columnName) { + public JdbcMetaColumnsRequest(String schemaName, String tblName, String colName) { super(META_COLUMNS); - this.schema = schema; - this.tableName = tableName; - this.columnName = columnName; + this.schemaName = schemaName; + this.tblName = tblName; + this.colName = colName; } /** * @return Cache name. */ - @Nullable public String schema() { - return schema; + @Nullable public String schemaName() { + return schemaName; } /** * @return Table name. */ public String tableName() { - return tableName; + return tblName; } /** * @return Column name. */ public String columnName() { - return columnName; + return colName; } /** {@inheritDoc} */ @Override public void writeBinary(BinaryWriterExImpl writer) throws BinaryObjectException { super.writeBinary(writer); - writer.writeString(schema); - writer.writeString(tableName); - writer.writeString(columnName); + writer.writeString(schemaName); + writer.writeString(tblName); + writer.writeString(colName); } /** {@inheritDoc} */ @Override public void readBinary(BinaryReaderExImpl reader) throws BinaryObjectException { super.readBinary(reader); - schema = reader.readString(); - tableName = reader.readString(); - columnName = reader.readString(); + schemaName = reader.readString(); + tblName = reader.readString(); + colName = reader.readString(); } /** {@inheritDoc} */ diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaIndexesRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaIndexesRequest.java index 531af2c56a196..6392cf9fcaf8a 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaIndexesRequest.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaIndexesRequest.java @@ -28,18 +28,21 @@ */ public class JdbcMetaIndexesRequest extends JdbcRequest { /** Cache name. */ + // TODO: We do not support catalogs, remove and throw exception (or return empty result) on the client. private String catalog; /** Cache name. */ - private String schema; + private String schemaName; /** Table name. */ private String tblName; /** When true, return only indices for unique values. */ + // TODO: Unused, remove private boolean unique; /** When true, result is allowed to reflect approximate or out of data values. */ + // TODO: Unused, remove private boolean approximate; /** @@ -51,16 +54,16 @@ public class JdbcMetaIndexesRequest extends JdbcRequest { /** * @param catalog Catalog name. - * @param schema Cache name. + * @param schemaName Cache name. * @param tblName Table name. * @param unique {@code true} when only indices for unique values are requested. * @param approximate {@code true} when approximate or out of data values indexes are allowed in results. */ - public JdbcMetaIndexesRequest(String catalog, String schema, String tblName, boolean unique, boolean approximate) { + public JdbcMetaIndexesRequest(String catalog, String schemaName, String tblName, boolean unique, boolean approximate) { super(META_INDEXES); this.catalog = catalog; - this.schema = schema; + this.schemaName = schemaName; this.tblName = tblName; this.unique = unique; this.approximate = approximate; @@ -76,8 +79,8 @@ public JdbcMetaIndexesRequest(String catalog, String schema, String tblName, boo /** * @return Schema name. */ - @Nullable public String schema() { - return schema; + @Nullable public String schemaName() { + return schemaName; } /** @@ -106,7 +109,7 @@ public boolean approximate() { super.writeBinary(writer); writer.writeString(catalog); - writer.writeString(schema); + writer.writeString(schemaName); writer.writeString(tblName); writer.writeBoolean(unique); writer.writeBoolean(approximate); @@ -117,7 +120,7 @@ public boolean approximate() { super.readBinary(reader); catalog = reader.readString(); - schema = reader.readString(); + schemaName = reader.readString(); tblName = reader.readString(); unique = reader.readBoolean(); approximate = reader.readBoolean(); diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaParamsRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaParamsRequest.java index f6526dd97ae33..67be7a8026cf1 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaParamsRequest.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaParamsRequest.java @@ -26,8 +26,8 @@ * JDBC SQL query parameters metadata request. */ public class JdbcMetaParamsRequest extends JdbcRequest { - /** Cache. */ - private String schema; + /** Schema. */ + private String schemaName; /** Query. */ private String sql; @@ -40,13 +40,13 @@ public class JdbcMetaParamsRequest extends JdbcRequest { } /** - * @param schema Schema name. + * @param schemaName Schema name. * @param sql SQL Query. */ - public JdbcMetaParamsRequest(String schema, String sql) { + public JdbcMetaParamsRequest(String schemaName, String sql) { super(META_PARAMS); - this.schema = schema; + this.schemaName = schemaName; this.sql = sql; } @@ -60,15 +60,15 @@ public String sql() { /** * @return Cache name. */ - public String schema() { - return schema; + public String schemaName() { + return schemaName; } /** {@inheritDoc} */ @Override public void writeBinary(BinaryWriterExImpl writer) throws BinaryObjectException { super.writeBinary(writer); - writer.writeString(schema); + writer.writeString(schemaName); writer.writeString(sql); } @@ -76,7 +76,7 @@ public String schema() { @Override public void readBinary(BinaryReaderExImpl reader) throws BinaryObjectException { super.readBinary(reader); - schema = reader.readString(); + schemaName = reader.readString(); sql = reader.readString(); } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaPrimaryKeysRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaPrimaryKeysRequest.java index d04be84fdceef..905559dbab030 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaPrimaryKeysRequest.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaPrimaryKeysRequest.java @@ -28,10 +28,10 @@ */ public class JdbcMetaPrimaryKeysRequest extends JdbcRequest { /** Cache name. */ - private String schema; + private String schemaName; /** Table name. */ - private String tbl; + private String tblName; /** * Default constructor is used for deserialization. @@ -41,44 +41,44 @@ public class JdbcMetaPrimaryKeysRequest extends JdbcRequest { } /** - * @param schema Cache name. + * @param schemaName Cache name. * @param tblName Table name. */ - public JdbcMetaPrimaryKeysRequest(String schema, String tblName) { + public JdbcMetaPrimaryKeysRequest(String schemaName, String tblName) { super(META_PRIMARY_KEYS); - this.schema = schema; - this.tbl = tblName; + this.schemaName = schemaName; + this.tblName = tblName; } /** * @return Schema name. */ - @Nullable public String schema() { - return schema; + @Nullable public String schemaName() { + return schemaName; } /** * @return Table name. */ public String tableName() { - return tbl; + return tblName; } /** {@inheritDoc} */ @Override public void writeBinary(BinaryWriterExImpl writer) throws BinaryObjectException { super.writeBinary(writer); - writer.writeString(schema); - writer.writeString(tbl); + writer.writeString(schemaName); + writer.writeString(tblName); } /** {@inheritDoc} */ @Override public void readBinary(BinaryReaderExImpl reader) throws BinaryObjectException { super.readBinary(reader); - schema = reader.readString(); - tbl = reader.readString(); + schemaName = reader.readString(); + tblName = reader.readString(); } /** {@inheritDoc} */ diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaSchemasRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaSchemasRequest.java index b830687f91114..43bbe5dbbea11 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaSchemasRequest.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaSchemasRequest.java @@ -27,7 +27,7 @@ */ public class JdbcMetaSchemasRequest extends JdbcRequest { /** Schema search pattern. */ - private String schema; + private String schemaName; /** * Default constructor is used for deserialization. @@ -37,33 +37,33 @@ public class JdbcMetaSchemasRequest extends JdbcRequest { } /** - * @param schema Schema search pattern. + * @param schemaName Schema search pattern. */ - public JdbcMetaSchemasRequest(String schema) { + public JdbcMetaSchemasRequest(String schemaName) { super(META_SCHEMAS); - this.schema = schema; + this.schemaName = schemaName; } /** * @return Schema search pattern. */ - public String schema() { - return schema; + public String schemaName() { + return schemaName; } /** {@inheritDoc} */ @Override public void writeBinary(BinaryWriterExImpl writer) throws BinaryObjectException { super.writeBinary(writer); - writer.writeString(schema); + writer.writeString(schemaName); } /** {@inheritDoc} */ @Override public void readBinary(BinaryReaderExImpl reader) throws BinaryObjectException { super.readBinary(reader); - this.schema = reader.readString(); + this.schemaName = reader.readString(); } /** {@inheritDoc} */ diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaTablesRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaTablesRequest.java index 68018be82c37d..37b9620207c04 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaTablesRequest.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaTablesRequest.java @@ -27,10 +27,10 @@ */ public class JdbcMetaTablesRequest extends JdbcRequest { /** Schema search pattern. */ - private String schema; + private String schemaName; /** Table search pattern. */ - private String table; + private String tblName; /** Table types. */ private String[] tableTypes; @@ -43,30 +43,30 @@ public class JdbcMetaTablesRequest extends JdbcRequest { } /** - * @param schema Schema search pattern. - * @param table Table search pattern. + * @param schemaName Schema search pattern. + * @param tblName Table search pattern. * @param tableTypes Table types. */ - public JdbcMetaTablesRequest(String schema, String table, String[] tableTypes) { + public JdbcMetaTablesRequest(String schemaName, String tblName, String[] tableTypes) { super(META_TABLES); - this.schema = schema; - this.table = table; + this.schemaName = schemaName; + this.tblName = tblName; this.tableTypes = tableTypes; } /** * @return Schema search pattern. */ - public String schema() { - return schema; + public String schemaName() { + return schemaName; } /** * @return Table search pattern. */ - public String table() { - return table; + public String tableName() { + return tblName; } /** @@ -80,8 +80,8 @@ public String[] tableTypes() { @Override public void writeBinary(BinaryWriterExImpl writer) throws BinaryObjectException { super.writeBinary(writer); - writer.writeString(schema); - writer.writeString(table); + writer.writeString(schemaName); + writer.writeString(tblName); writer.writeStringArray(tableTypes); } @@ -89,8 +89,8 @@ public String[] tableTypes() { @Override public void readBinary(BinaryReaderExImpl reader) throws BinaryObjectException { super.readBinary(reader); - this.schema = reader.readString(); - this.table = reader.readString(); + this.schemaName = reader.readString(); + this.tblName = reader.readString(); this.tableTypes = reader.readStringArray(); } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcPrimaryKeyMeta.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcPrimaryKeyMeta.java index 5b4d5815fafd0..6ba9af862be8b 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcPrimaryKeyMeta.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcPrimaryKeyMeta.java @@ -26,10 +26,10 @@ */ public class JdbcPrimaryKeyMeta implements JdbcRawBinarylizable { /** Cache name. */ - private String schema; + private String schemaName; /** Table name. */ - private String tbl; + private String tblName; /** Primary key name. */ private String name; @@ -45,14 +45,14 @@ public class JdbcPrimaryKeyMeta implements JdbcRawBinarylizable { } /** - * @param schema Schema. - * @param tbl Table. + * @param schemaName Schema. + * @param tblName Table. * @param name Name. * @param fields Primary key fields. */ - JdbcPrimaryKeyMeta(String schema, String tbl, String name, String [] fields) { - this.schema = schema; - this.tbl = tbl; + JdbcPrimaryKeyMeta(String schemaName, String tblName, String name, String [] fields) { + this.schemaName = schemaName; + this.tblName = tblName; this.name = name; this.fields = fields; } @@ -60,15 +60,15 @@ public class JdbcPrimaryKeyMeta implements JdbcRawBinarylizable { /** * @return Schema name. */ - public String schema() { - return schema; + public String schemaName() { + return schemaName; } /** * @return Table name. */ public String tableName() { - return tbl; + return tblName; } /** @@ -88,16 +88,16 @@ public String[] fields() { /** {@inheritDoc} */ @Override public void writeBinary(BinaryWriterExImpl writer) throws BinaryObjectException { - writer.writeString(schema); - writer.writeString(tbl); + writer.writeString(schemaName); + writer.writeString(tblName); writer.writeString(name); writer.writeStringArray(fields); } /** {@inheritDoc} */ @Override public void readBinary(BinaryReaderExImpl reader) throws BinaryObjectException { - schema = reader.readString(); - tbl = reader.readString(); + schemaName = reader.readString(); + tblName = reader.readString(); name = reader.readString(); fields = reader.readStringArray(); } @@ -112,10 +112,10 @@ public String[] fields() { JdbcPrimaryKeyMeta meta = (JdbcPrimaryKeyMeta)o; - if (schema != null ? !schema.equals(meta.schema) : meta.schema != null) + if (schemaName != null ? !schemaName.equals(meta.schemaName) : meta.schemaName != null) return false; - if (!tbl.equals(meta.tbl)) + if (!tblName.equals(meta.tblName)) return false; return name.equals(meta.name); @@ -123,8 +123,8 @@ public String[] fields() { /** {@inheritDoc} */ @Override public int hashCode() { - int result = schema != null ? schema.hashCode() : 0; - result = 31 * result + tbl.hashCode(); + int result = schemaName != null ? schemaName.hashCode() : 0; + result = 31 * result + tblName.hashCode(); result = 31 * result + name.hashCode(); return result; } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcRequestHandler.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcRequestHandler.java index ab5984d58e51d..eb9c955a9bcec 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcRequestHandler.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcRequestHandler.java @@ -421,7 +421,7 @@ private JdbcResponse getTablesMeta(JdbcMetaTablesRequest req) { try { List meta = new ArrayList<>(); - String realSchema = req.schema(); + String realSchema = req.schemaName(); for (String cacheName : ctx.cache().publicCacheNames()) { @@ -431,7 +431,7 @@ private JdbcResponse getTablesMeta(JdbcMetaTablesRequest req) { Collection tablesMeta = ctx.query().types(cacheName); for (GridQueryTypeDescriptor table : tablesMeta) { - if (!matches(table.name(), req.table())) + if (!matches(table.name(), req.tableName())) continue; boolean tblTypeMatch = false; @@ -481,10 +481,10 @@ private JdbcResponse getColumnsMeta(JdbcMetaColumnsRequest req) { try { Collection cacheNames; - if (req.schema() == null) + if (req.schemaName() == null) cacheNames = ctx.cache().publicCacheNames(); else - cacheNames = Collections.singleton(req.schema()); + cacheNames = Collections.singleton(req.schemaName()); Collection meta = new HashSet<>(); @@ -529,10 +529,10 @@ private SqlListenerResponse getIndexesMeta(JdbcMetaIndexesRequest req) { try { Collection cacheNames; - if (req.schema() == null) + if (req.schemaName() == null) cacheNames = ctx.cache().publicCacheNames(); else - cacheNames = Collections.singleton(req.schema()); + cacheNames = Collections.singleton(req.schemaName()); Collection meta = new HashSet<>(); @@ -565,7 +565,7 @@ private SqlListenerResponse getIndexesMeta(JdbcMetaIndexesRequest req) { */ private SqlListenerResponse getParametersMeta(JdbcMetaParamsRequest req) { try { - ParameterMetaData paramMeta = ctx.query().prepareNativeStatement(req.schema(), req.sql()) + ParameterMetaData paramMeta = ctx.query().prepareNativeStatement(req.schemaName(), req.sql()) .getParameterMetaData(); int size = paramMeta.getParameterCount(); @@ -594,10 +594,10 @@ private SqlListenerResponse getPrimaryKeys(JdbcMetaPrimaryKeysRequest req) { try { Collection cacheNames; - if (req.schema() == null) + if (req.schemaName() == null) cacheNames = ctx.cache().publicCacheNames(); else - cacheNames = Collections.singleton(req.schema()); + cacheNames = Collections.singleton(req.schemaName()); Collection meta = new HashSet<>(); @@ -645,7 +645,7 @@ private SqlListenerResponse getPrimaryKeys(JdbcMetaPrimaryKeysRequest req) { */ private SqlListenerResponse getSchemas(JdbcMetaSchemasRequest req) { try { - String schemaPtrn = req.schema(); + String schemaPtrn = req.schemaName(); List schemas = new ArrayList<>(); diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcTableMeta.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcTableMeta.java index 0e878fa066572..bfc4d6ab192e0 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcTableMeta.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcTableMeta.java @@ -29,10 +29,10 @@ public class JdbcTableMeta implements JdbcRawBinarylizable { private String catalog; /** Schema name. */ - private String schema; + private String schemaName; /** Table name. */ - private String tbl; + private String tblName; /** Table type. */ private String tblType; @@ -45,14 +45,14 @@ public class JdbcTableMeta implements JdbcRawBinarylizable { /** * @param catalog Catalog name. - * @param schema Schema name. - * @param tbl Table name. + * @param schemaName Schema name. + * @param tblName Table name. * @param tblType Table type. */ - JdbcTableMeta(String catalog, String schema, String tbl, String tblType) { + JdbcTableMeta(String catalog, String schemaName, String tblName, String tblType) { this.catalog = catalog; - this.schema = schema; - this.tbl = tbl; + this.schemaName = schemaName; + this.tblName = tblName; this.tblType = tblType; } @@ -66,15 +66,15 @@ public String catalog() { /** * @return Schema name. */ - public String schema() { - return schema; + public String schemaName() { + return schemaName; } /** * @return Table name. */ - public String table() { - return tbl; + public String tableName() { + return tblName; } /** @@ -87,16 +87,16 @@ public String tableType() { /** {@inheritDoc} */ @Override public void writeBinary(BinaryWriterExImpl writer) throws BinaryObjectException { writer.writeString(catalog); - writer.writeString(schema); - writer.writeString(tbl); + writer.writeString(schemaName); + writer.writeString(tblName); writer.writeString(tblType); } /** {@inheritDoc} */ @Override public void readBinary(BinaryReaderExImpl reader) throws BinaryObjectException { catalog = reader.readString(); - schema = reader.readString(); - tbl = reader.readString(); + schemaName = reader.readString(); + tblName = reader.readString(); tblType = reader.readString(); } } From bf94b4385318faec6c9b07c7f3179939f72bef2f Mon Sep 17 00:00:00 2001 From: tledkov-gridgain Date: Mon, 14 Aug 2017 15:01:53 +0300 Subject: [PATCH 24/32] IGNITE-5233: fix review comments --- .../jdbc/thin/JdbcThinDatabaseMetadata.java | 4 +- .../internal/jdbc/thin/JdbcThinTcpIo.java | 8 +-- .../odbc/jdbc/JdbcBatchExecuteRequest.java | 16 +++--- .../processors/odbc/jdbc/JdbcColumnMeta.java | 21 ++++---- .../processors/odbc/jdbc/JdbcIndexMeta.java | 10 ++-- .../odbc/jdbc/JdbcMetaIndexesRequest.java | 49 +------------------ .../odbc/jdbc/JdbcMetaParamsRequest.java | 2 +- .../odbc/jdbc/JdbcQueryExecuteRequest.java | 4 +- .../odbc/jdbc/JdbcRequestHandler.java | 4 +- .../processors/odbc/jdbc/JdbcTableMeta.java | 16 +----- 10 files changed, 34 insertions(+), 100 deletions(-) diff --git a/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinDatabaseMetadata.java b/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinDatabaseMetadata.java index e5fb79cf73db0..a01049910812d 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinDatabaseMetadata.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinDatabaseMetadata.java @@ -740,7 +740,7 @@ public class JdbcThinDatabaseMetadata implements DatabaseMetaData { private List tableRow(JdbcTableMeta tblMeta) { List row = new ArrayList<>(10); - row.add(tblMeta.catalog()); + row.add(null); row.add(tblMeta.schemaName()); row.add(tblMeta.tableName()); row.add(tblMeta.tableType()); @@ -1139,7 +1139,7 @@ private List> primaryKeyRows(JdbcPrimaryKeyMeta pkMeta) { if (conn.isClosed()) throw new SQLException("Connection is closed."); - JdbcMetaIndexesResult res = conn.io().indexMeta(catalog, schema, tbl, unique, approximate); + JdbcMetaIndexesResult res = conn.io().indexMeta(schema, tbl); List> rows = new LinkedList<>(); diff --git a/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinTcpIo.java b/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinTcpIo.java index 55939ff6beecb..0c8c2bf95af4a 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinTcpIo.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinTcpIo.java @@ -361,18 +361,14 @@ public JdbcMetaColumnsResult columnsMeta(String schemaPtrn, String tablePtrn, St } /** - * @param catalog Catalog. * @param schema Schema. * @param tbl Table - * @param unique Is Index unique. - * @param approximate Request approximate index. * @return Result. * @throws IOException On error. * @throws IgniteCheckedException On error. */ - public JdbcMetaIndexesResult indexMeta(String catalog, String schema, String tbl, - boolean unique, boolean approximate) throws IOException, IgniteCheckedException { - return sendRequest(new JdbcMetaIndexesRequest(catalog, schema, tbl, unique, approximate), DYNAMIC_SIZE_MSG_CAP); + public JdbcMetaIndexesResult indexMeta(String schema, String tbl) throws IOException, IgniteCheckedException { + return sendRequest(new JdbcMetaIndexesRequest(schema, tbl), DYNAMIC_SIZE_MSG_CAP); } /** diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcBatchExecuteRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcBatchExecuteRequest.java index 9f71bff7cc9dc..bd7c59a9b1fce 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcBatchExecuteRequest.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcBatchExecuteRequest.java @@ -32,7 +32,7 @@ */ public class JdbcBatchExecuteRequest extends JdbcRequest { /** Cache name. */ - private String schema; + private String schemaName; /** Sql query. */ @GridToStringInclude(sensitive = true) @@ -46,23 +46,23 @@ public JdbcBatchExecuteRequest() { } /** - * @param schema Schema. + * @param schemaName Schema name. * @param queries Queries. */ - public JdbcBatchExecuteRequest(String schema, List queries) { + public JdbcBatchExecuteRequest(String schemaName, List queries) { super(BATCH_EXEC); assert !F.isEmpty(queries); - this.schema = schema; + this.schemaName = schemaName; this.queries = queries; } /** * @return Schema. */ - @Nullable public String schema() { - return schema; + @Nullable public String schemaName() { + return schemaName; } /** @@ -76,7 +76,7 @@ public List queries() { @Override public void writeBinary(BinaryWriterExImpl writer) throws BinaryObjectException { super.writeBinary(writer); - writer.writeString(schema); + writer.writeString(schemaName); writer.writeInt(queries.size()); for (JdbcQuery q : queries) @@ -87,7 +87,7 @@ public List queries() { @Override public void readBinary(BinaryReaderExImpl reader) throws BinaryObjectException { super.readBinary(reader); - schema = reader.readString(); + schemaName = reader.readString(); int n = reader.readInt(); diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcColumnMeta.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcColumnMeta.java index 826602247ac97..f0b1e896c0457 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcColumnMeta.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcColumnMeta.java @@ -21,6 +21,7 @@ import org.apache.ignite.internal.binary.BinaryWriterExImpl; import org.apache.ignite.internal.jdbc.thin.JdbcThinUtils; import org.apache.ignite.internal.processors.query.GridQueryFieldMetadata; +import org.apache.ignite.internal.util.typedef.F; /** * JDBC column metadata. @@ -48,7 +49,7 @@ public class JdbcColumnMeta implements JdbcRawBinarylizable { * Default constructor is used for serialization. */ JdbcColumnMeta() { - // TODO: add no-op. + // No-op. } /** @@ -66,13 +67,13 @@ public class JdbcColumnMeta implements JdbcRawBinarylizable { /** * @param schemaName Schema. - * @param tableName Table. + * @param tblName Table. * @param colName Column. * @param cls Type. */ - public JdbcColumnMeta(String schemaName, String tableName, String colName, Class cls) { + public JdbcColumnMeta(String schemaName, String tblName, String colName, Class cls) { this.schemaName = schemaName; - this.tblName = tableName; + this.tblName = tblName; this.colName = colName; String type = cls.getName(); @@ -81,10 +82,9 @@ public JdbcColumnMeta(String schemaName, String tableName, String colName, Class dataTypeClass = type; } - // TODO: Spacing. - /** - * @return Schema name. - */ + /** + * @return Schema name. + */ public String schemaName() { return schemaName; } @@ -156,11 +156,10 @@ public String dataTypeClass() { JdbcColumnMeta meta = (JdbcColumnMeta)o; - // TODO: What is that? F.eq(schema, meta.schema); - if (schemaName != null ? !schemaName.equals(meta.schemaName) : meta.schemaName != null) + if (!F.eq(schemaName, meta.schemaName)) return false; - if (tblName != null ? !tblName.equals(meta.tblName) : meta.tblName != null) + if (!F.eq(tblName, meta.tblName)) return false; return colName.equals(meta.colName); diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcIndexMeta.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcIndexMeta.java index 78e090d5acea9..afe8342906041 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcIndexMeta.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcIndexMeta.java @@ -22,13 +22,13 @@ import org.apache.ignite.internal.binary.BinaryReaderExImpl; import org.apache.ignite.internal.binary.BinaryWriterExImpl; import org.apache.ignite.internal.processors.query.GridQueryIndexDescriptor; +import org.apache.ignite.internal.util.typedef.F; /** * JDBC index metadata. */ public class JdbcIndexMeta implements JdbcRawBinarylizable { - // TODO: Invalid JavaDocs: table -> schema - /** Index table name. */ + /** Index schema name. */ private String schemaName; /** Index table name. */ @@ -79,7 +79,6 @@ public class JdbcIndexMeta implements JdbcRawBinarylizable { /** * @return Schema name. */ - // TOOD: schemaName() public String schemaName() { return schemaName; } @@ -152,11 +151,10 @@ public boolean[] fieldsAsc() { JdbcIndexMeta meta = (JdbcIndexMeta)o; - // TODO: F.eq(schema, meta.schema) - if (schemaName != null ? !schemaName.equals(meta.schemaName) : meta.schemaName != null) + if (!F.eq(schemaName, meta.schemaName)) return false; - if (!tblName.equals(meta.tblName)) + if (!F.eq(tblName, meta.tblName)) return false; return idxName.equals(meta.idxName); diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaIndexesRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaIndexesRequest.java index 6392cf9fcaf8a..f8b03c0c09ac3 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaIndexesRequest.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaIndexesRequest.java @@ -27,24 +27,12 @@ * JDBC indexes metadata request. */ public class JdbcMetaIndexesRequest extends JdbcRequest { - /** Cache name. */ - // TODO: We do not support catalogs, remove and throw exception (or return empty result) on the client. - private String catalog; - - /** Cache name. */ + /** Schema name. */ private String schemaName; /** Table name. */ private String tblName; - /** When true, return only indices for unique values. */ - // TODO: Unused, remove - private boolean unique; - - /** When true, result is allowed to reflect approximate or out of data values. */ - // TODO: Unused, remove - private boolean approximate; - /** * Default constructor is used for deserialization. */ @@ -53,27 +41,14 @@ public class JdbcMetaIndexesRequest extends JdbcRequest { } /** - * @param catalog Catalog name. * @param schemaName Cache name. * @param tblName Table name. - * @param unique {@code true} when only indices for unique values are requested. - * @param approximate {@code true} when approximate or out of data values indexes are allowed in results. */ - public JdbcMetaIndexesRequest(String catalog, String schemaName, String tblName, boolean unique, boolean approximate) { + public JdbcMetaIndexesRequest(String schemaName, String tblName) { super(META_INDEXES); - this.catalog = catalog; this.schemaName = schemaName; this.tblName = tblName; - this.unique = unique; - this.approximate = approximate; - } - - /** - * @return Catalog name. - */ - @Nullable public String catalog() { - return catalog; } /** @@ -90,40 +65,20 @@ public String tableName() { return tblName; } - /** - * @return {@code true} when only indices for unique values are requested. - */ - public boolean unique() { - return unique; - } - - /** - * @return {@code true} when approximate or out of data values indexes are allowed in results. - */ - public boolean approximate() { - return approximate; - } - /** {@inheritDoc} */ @Override public void writeBinary(BinaryWriterExImpl writer) throws BinaryObjectException { super.writeBinary(writer); - writer.writeString(catalog); writer.writeString(schemaName); writer.writeString(tblName); - writer.writeBoolean(unique); - writer.writeBoolean(approximate); } /** {@inheritDoc} */ @Override public void readBinary(BinaryReaderExImpl reader) throws BinaryObjectException { super.readBinary(reader); - catalog = reader.readString(); schemaName = reader.readString(); tblName = reader.readString(); - unique = reader.readBoolean(); - approximate = reader.readBoolean(); } /** {@inheritDoc} */ diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaParamsRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaParamsRequest.java index 67be7a8026cf1..711827b38cfb2 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaParamsRequest.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaParamsRequest.java @@ -26,7 +26,7 @@ * JDBC SQL query parameters metadata request. */ public class JdbcMetaParamsRequest extends JdbcRequest { - /** Schema. */ + /** Schema name. */ private String schemaName; /** Query. */ diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcQueryExecuteRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcQueryExecuteRequest.java index 37d065f85ff8b..0b26dce0ecc1d 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcQueryExecuteRequest.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcQueryExecuteRequest.java @@ -30,7 +30,7 @@ * JDBC query execute request. */ public class JdbcQueryExecuteRequest extends JdbcRequest { - /** Cache name. */ + /** Schema name. */ private String schemaName; /** Fetch size. */ @@ -100,7 +100,7 @@ public Object[] arguments() { } /** - * @return Cache name. + * @return Schema name. */ @Nullable public String schemaName() { return schemaName; diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcRequestHandler.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcRequestHandler.java index eb9c955a9bcec..29adf3356051d 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcRequestHandler.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcRequestHandler.java @@ -365,7 +365,7 @@ private JdbcResponse getQueryMeta(JdbcQueryMetadataRequest req) { * @return Response. */ private SqlListenerResponse executeBatch(JdbcBatchExecuteRequest req) { - String schemaName = req.schema(); + String schemaName = req.schemaName(); if (F.isEmpty(schemaName)) schemaName = QueryUtils.DFLT_SCHEMA; @@ -452,7 +452,7 @@ private JdbcResponse getTablesMeta(JdbcMetaTablesRequest req) { String schemaName = ctx.cache().cacheDescriptor(cacheName).sql() ? QueryUtils.DFLT_SCHEMA : cacheName; - JdbcTableMeta tableMeta = new JdbcTableMeta(null, schemaName, table.tableName(), "TABLE"); + JdbcTableMeta tableMeta = new JdbcTableMeta(schemaName, table.tableName(), "TABLE"); if (!meta.contains(tableMeta)) meta.add(tableMeta); diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcTableMeta.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcTableMeta.java index bfc4d6ab192e0..4e453074a0735 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcTableMeta.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcTableMeta.java @@ -25,9 +25,6 @@ * JDBC table metadata. */ public class JdbcTableMeta implements JdbcRawBinarylizable { - /** Catalog name. */ - private String catalog; - /** Schema name. */ private String schemaName; @@ -44,25 +41,16 @@ public class JdbcTableMeta implements JdbcRawBinarylizable { } /** - * @param catalog Catalog name. * @param schemaName Schema name. * @param tblName Table name. * @param tblType Table type. */ - JdbcTableMeta(String catalog, String schemaName, String tblName, String tblType) { - this.catalog = catalog; + JdbcTableMeta(String schemaName, String tblName, String tblType) { this.schemaName = schemaName; this.tblName = tblName; this.tblType = tblType; } - /** - * @return Table's catalog. - */ - public String catalog() { - return catalog; - } - /** * @return Schema name. */ @@ -86,7 +74,6 @@ public String tableType() { /** {@inheritDoc} */ @Override public void writeBinary(BinaryWriterExImpl writer) throws BinaryObjectException { - writer.writeString(catalog); writer.writeString(schemaName); writer.writeString(tblName); writer.writeString(tblType); @@ -94,7 +81,6 @@ public String tableType() { /** {@inheritDoc} */ @Override public void readBinary(BinaryReaderExImpl reader) throws BinaryObjectException { - catalog = reader.readString(); schemaName = reader.readString(); tblName = reader.readString(); tblType = reader.readString(); From fb3f88f0117a408df265ea7eafd7711c166cc9c5 Mon Sep 17 00:00:00 2001 From: tledkov-gridgain Date: Mon, 14 Aug 2017 16:20:19 +0300 Subject: [PATCH 25/32] IGNITE-5233: check catalog pattern & use schema from tables --- .../jdbc/thin/JdbcThinMetadataSelfTest.java | 8 +- .../jdbc/thin/JdbcThinDatabaseMetadata.java | 179 +++++++++++------- .../odbc/jdbc/JdbcMetaSchemasResult.java | 7 +- .../odbc/jdbc/JdbcRequestHandler.java | 127 +++++-------- .../processors/query/GridQueryProcessor.java | 2 +- .../query/GridQueryTypeDescriptor.java | 7 + .../query/QueryTypeDescriptorImpl.java | 15 ++ .../internal/processors/query/QueryUtils.java | 7 +- .../h2/GridIndexingSpiAbstractSelfTest.java | 14 +- 9 files changed, 201 insertions(+), 165 deletions(-) diff --git a/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinMetadataSelfTest.java b/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinMetadataSelfTest.java index 14a3fb1a564ae..9649522f9f990 100644 --- a/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinMetadataSelfTest.java +++ b/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinMetadataSelfTest.java @@ -259,7 +259,7 @@ public void testGetColumns() throws Exception { DatabaseMetaData meta = conn.getMetaData(); - ResultSet rs = meta.getColumns("", "pers", "Person", "%"); + ResultSet rs = meta.getColumns("", "pers", "PERSON", "%"); assert rs != null; @@ -302,7 +302,7 @@ public void testGetColumns() throws Exception { assert names.isEmpty(); assert cnt == 3; - rs = meta.getColumns("", "org", "Organization", "%"); + rs = meta.getColumns("", "org", "ORGANIZATION", "%"); assert rs != null; @@ -383,7 +383,7 @@ public void testGetAllColumns() throws Exception { */ public void testIndexMetadata() throws Exception { try (Connection conn = DriverManager.getConnection(URL); - ResultSet rs = conn.getMetaData().getIndexInfo(null, "pers", "Person", false, false)) { + ResultSet rs = conn.getMetaData().getIndexInfo(null, "pers", "PERSON", false, false)) { int cnt = 0; @@ -449,7 +449,7 @@ public void testGetAllIndexes() throws Exception { */ public void testPrimaryKeyMetadata() throws Exception { try (Connection conn = DriverManager.getConnection(URL); - ResultSet rs = conn.getMetaData().getPrimaryKeys(null, "pers", "Person")) { + ResultSet rs = conn.getMetaData().getPrimaryKeys(null, "pers", "PERSON")) { int cnt = 0; diff --git a/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinDatabaseMetadata.java b/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinDatabaseMetadata.java index a01049910812d..083f8f6d0e85d 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinDatabaseMetadata.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinDatabaseMetadata.java @@ -41,6 +41,7 @@ import org.apache.ignite.internal.processors.odbc.jdbc.JdbcMetaTablesResult; import org.apache.ignite.internal.processors.odbc.jdbc.JdbcPrimaryKeyMeta; import org.apache.ignite.internal.processors.odbc.jdbc.JdbcTableMeta; +import org.apache.ignite.internal.util.typedef.F; import static java.sql.Connection.TRANSACTION_NONE; import static java.sql.ResultSet.CONCUR_READ_ONLY; @@ -700,10 +701,25 @@ public class JdbcThinDatabaseMetadata implements DatabaseMetaData { /** {@inheritDoc} */ @Override public ResultSet getTables(String catalog, String schemaPtrn, String tblNamePtrn, String[] tblTypes) throws SQLException { - try { - if (conn.isClosed()) - throw new SQLException("Connection is closed."); + if (conn.isClosed()) + throw new SQLException("Connection is closed."); + final List meta = Arrays.asList( + new JdbcColumnMeta(null, null, "TABLE_CAT", String.class), + new JdbcColumnMeta(null, null, "TABLE_SCHEM", String.class), + new JdbcColumnMeta(null, null, "TABLE_NAME", String.class), + new JdbcColumnMeta(null, null, "TABLE_TYPE", String.class), + new JdbcColumnMeta(null, null, "REMARKS", String.class), + new JdbcColumnMeta(null, null, "TYPE_CAT", String.class), + new JdbcColumnMeta(null, null, "TYPE_SCHEM", String.class), + new JdbcColumnMeta(null, null, "TYPE_NAME", String.class), + new JdbcColumnMeta(null, null, "SELF_REFERENCING_COL_NAME", String.class), + new JdbcColumnMeta(null, null, "REF_GENERATION", String.class)); + + if (!validCatalogPattern(catalog)) + return new JdbcThinResultSet(Collections.>emptyList(), meta); + + try { JdbcMetaTablesResult res = conn.io().tablesMeta(schemaPtrn, tblNamePtrn, tblTypes); List> rows = new LinkedList<>(); @@ -711,17 +727,7 @@ public class JdbcThinDatabaseMetadata implements DatabaseMetaData { for (JdbcTableMeta tblMeta : res.meta()) rows.add(tableRow(tblMeta)); - return new JdbcThinResultSet(rows, Arrays.asList( - new JdbcColumnMeta(null, null, "TABLE_CAT", String.class), - new JdbcColumnMeta(null, null, "TABLE_SCHEM", String.class), - new JdbcColumnMeta(null, null, "TABLE_NAME", String.class), - new JdbcColumnMeta(null, null, "TABLE_TYPE", String.class), - new JdbcColumnMeta(null, null, "REMARKS", String.class), - new JdbcColumnMeta(null, null, "TYPE_CAT", String.class), - new JdbcColumnMeta(null, null, "TYPE_SCHEM", String.class), - new JdbcColumnMeta(null, null, "TYPE_NAME", String.class), - new JdbcColumnMeta(null, null, "SELF_REFERENCING_COL_NAME", String.class), - new JdbcColumnMeta(null, null, "REF_GENERATION", String.class))); + return new JdbcThinResultSet(rows, meta); } catch (IOException e) { conn.close(); @@ -774,10 +780,35 @@ private List tableRow(JdbcTableMeta tblMeta) { /** {@inheritDoc} */ @Override public ResultSet getColumns(String catalog, String schemaPtrn, String tblNamePtrn, String colNamePtrn) throws SQLException { - try { - if (conn.isClosed()) - throw new SQLException("Connection is closed."); + if (conn.isClosed()) + throw new SQLException("Connection is closed."); + + final List meta = Arrays.asList( + new JdbcColumnMeta(null, null, "TABLE_CAT", String.class), + new JdbcColumnMeta(null, null, "TABLE_SCHEM", String.class), + new JdbcColumnMeta(null, null, "TABLE_NAME", String.class), + new JdbcColumnMeta(null, null, "COLUMN_NAME", String.class), + new JdbcColumnMeta(null, null, "DATA_TYPE", Short.class), + new JdbcColumnMeta(null, null, "TYPE_NAME", String.class), + new JdbcColumnMeta(null, null, "COLUMN_SIZE", Integer.class), + new JdbcColumnMeta(null, null, "DECIMAL_DIGITS", Integer.class), + new JdbcColumnMeta(null, null, "NUM_PREC_RADIX", Short.class), + new JdbcColumnMeta(null, null, "NULLABLE", Short.class), + new JdbcColumnMeta(null, null, "REMARKS", String.class), + new JdbcColumnMeta(null, null, "COLUMN_DEF", String.class), + new JdbcColumnMeta(null, null, "CHAR_OCTET_LENGTH", Integer.class), + new JdbcColumnMeta(null, null, "ORDINAL_POSITION", Integer.class), + new JdbcColumnMeta(null, null, "IS_NULLABLE", String.class), + new JdbcColumnMeta(null, null, "SCOPE_CATLOG", String.class), + new JdbcColumnMeta(null, null, "SCOPE_SCHEMA", String.class), + new JdbcColumnMeta(null, null, "SCOPE_TABLE", String.class), + new JdbcColumnMeta(null, null, "SOURCE_DATA_TYPE", Short.class), + new JdbcColumnMeta(null, null, "IS_AUTOINCREMENT", String.class)); + + if (!validCatalogPattern(catalog)) + return new JdbcThinResultSet(Collections.>emptyList(), meta); + try { JdbcMetaColumnsResult res = conn.io().columnsMeta(schemaPtrn, tblNamePtrn, colNamePtrn); List> rows = new LinkedList<>(); @@ -785,27 +816,7 @@ private List tableRow(JdbcTableMeta tblMeta) { for (int i = 0; i < res.meta().size(); ++i) rows.add(columnRow(res.meta().get(i), i + 1)); - return new JdbcThinResultSet(rows, Arrays.asList( - new JdbcColumnMeta(null, null, "TABLE_CAT", String.class), - new JdbcColumnMeta(null, null, "TABLE_SCHEM", String.class), - new JdbcColumnMeta(null, null, "TABLE_NAME", String.class), - new JdbcColumnMeta(null, null, "COLUMN_NAME", String.class), - new JdbcColumnMeta(null, null, "DATA_TYPE", Short.class), - new JdbcColumnMeta(null, null, "TYPE_NAME", String.class), - new JdbcColumnMeta(null, null, "COLUMN_SIZE", Integer.class), - new JdbcColumnMeta(null, null, "DECIMAL_DIGITS", Integer.class), - new JdbcColumnMeta(null, null, "NUM_PREC_RADIX", Short.class), - new JdbcColumnMeta(null, null, "NULLABLE", Short.class), - new JdbcColumnMeta(null, null, "REMARKS", String.class), - new JdbcColumnMeta(null, null, "COLUMN_DEF", String.class), - new JdbcColumnMeta(null, null, "CHAR_OCTET_LENGTH", Integer.class), - new JdbcColumnMeta(null, null, "ORDINAL_POSITION", Integer.class), - new JdbcColumnMeta(null, null, "IS_NULLABLE", String.class), - new JdbcColumnMeta(null, null, "SCOPE_CATLOG", String.class), - new JdbcColumnMeta(null, null, "SCOPE_SCHEMA", String.class), - new JdbcColumnMeta(null, null, "SCOPE_TABLE", String.class), - new JdbcColumnMeta(null, null, "SOURCE_DATA_TYPE", Short.class), - new JdbcColumnMeta(null, null, "IS_AUTOINCREMENT", String.class))); + return new JdbcThinResultSet(rows, meta); } catch (IOException e) { conn.close(); @@ -909,10 +920,21 @@ private List columnRow(JdbcColumnMeta colMeta, int pos) { /** {@inheritDoc} */ @Override public ResultSet getPrimaryKeys(String catalog, String schema, String tbl) throws SQLException { - try { - if (conn.isClosed()) - throw new SQLException("Connection is closed."); + if (conn.isClosed()) + throw new SQLException("Connection is closed."); + + final List meta = Arrays.asList( + new JdbcColumnMeta(null, null, "TABLE_CAT", String.class), + new JdbcColumnMeta(null, null, "TABLE_SCHEM", String.class), + new JdbcColumnMeta(null, null, "TABLE_NAME", String.class), + new JdbcColumnMeta(null, null, "COLUMN_NAME", String.class), + new JdbcColumnMeta(null, null, "KEY_SEQ", Short.class), + new JdbcColumnMeta(null, null, "PK_NAME", String.class)); + + if (!validCatalogPattern(catalog)) + return new JdbcThinResultSet(Collections.>emptyList(), meta); + try { JdbcMetaPrimaryKeysResult res = conn.io().primaryKeysMeta(schema, tbl); List> rows = new LinkedList<>(); @@ -920,13 +942,7 @@ private List columnRow(JdbcColumnMeta colMeta, int pos) { for (JdbcPrimaryKeyMeta pkMeta : res.meta()) rows.addAll(primaryKeyRows(pkMeta)); - return new JdbcThinResultSet(rows, Arrays.asList( - new JdbcColumnMeta(null, null, "TABLE_CAT", String.class), - new JdbcColumnMeta(null, null, "TABLE_SCHEM", String.class), - new JdbcColumnMeta(null, null, "TABLE_NAME", String.class), - new JdbcColumnMeta(null, null, "COLUMN_NAME", String.class), - new JdbcColumnMeta(null, null, "KEY_SEQ", Short.class), - new JdbcColumnMeta(null, null, "PK_NAME", String.class))); + return new JdbcThinResultSet(rows, meta); } catch (IOException e) { conn.close(); @@ -1135,10 +1151,28 @@ private List> primaryKeyRows(JdbcPrimaryKeyMeta pkMeta) { /** {@inheritDoc} */ @Override public ResultSet getIndexInfo(String catalog, String schema, String tbl, boolean unique, boolean approximate) throws SQLException { - try { - if (conn.isClosed()) - throw new SQLException("Connection is closed."); + if (conn.isClosed()) + throw new SQLException("Connection is closed."); + + final List meta = Arrays.asList( + new JdbcColumnMeta(null, null, "TABLE_CAT", String.class), + new JdbcColumnMeta(null, null, "TABLE_SCHEM", String.class), + new JdbcColumnMeta(null, null, "TABLE_NAME", String.class), + new JdbcColumnMeta(null, null, "NON_UNIQUE", Boolean.class), + new JdbcColumnMeta(null, null, "INDEX_QUALIFIER", String.class), + new JdbcColumnMeta(null, null, "INDEX_NAME", String.class), + new JdbcColumnMeta(null, null, "TYPE", Short.class), + new JdbcColumnMeta(null, null, "ORDINAL_POSITION", Short.class), + new JdbcColumnMeta(null, null, "COLUMN_NAME", String.class), + new JdbcColumnMeta(null, null, "ASC_OR_DESC", String.class), + new JdbcColumnMeta(null, null, "CARDINALITY", Integer.class), + new JdbcColumnMeta(null, null, "PAGES", Integer.class), + new JdbcColumnMeta(null, null, "FILTER_CONDITION", String.class)); + if (!validCatalogPattern(catalog)) + return new JdbcThinResultSet(Collections.>emptyList(), meta); + + try { JdbcMetaIndexesResult res = conn.io().indexMeta(schema, tbl); List> rows = new LinkedList<>(); @@ -1146,20 +1180,7 @@ private List> primaryKeyRows(JdbcPrimaryKeyMeta pkMeta) { for (JdbcIndexMeta idxMeta : res.meta()) rows.addAll(indexRows(idxMeta)); - return new JdbcThinResultSet(rows, Arrays.asList( - new JdbcColumnMeta(null, null, "TABLE_CAT", String.class), - new JdbcColumnMeta(null, null, "TABLE_SCHEM", String.class), - new JdbcColumnMeta(null, null, "TABLE_NAME", String.class), - new JdbcColumnMeta(null, null, "NON_UNIQUE", Boolean.class), - new JdbcColumnMeta(null, null, "INDEX_QUALIFIER", String.class), - new JdbcColumnMeta(null, null, "INDEX_NAME", String.class), - new JdbcColumnMeta(null, null, "TYPE", Short.class), - new JdbcColumnMeta(null, null, "ORDINAL_POSITION", Short.class), - new JdbcColumnMeta(null, null, "COLUMN_NAME", String.class), - new JdbcColumnMeta(null, null, "ASC_OR_DESC", String.class), - new JdbcColumnMeta(null, null, "CARDINALITY", Integer.class), - new JdbcColumnMeta(null, null, "PAGES", Integer.class), - new JdbcColumnMeta(null, null, "FILTER_CONDITION", String.class))); + return new JdbcThinResultSet(rows, meta); } catch (IOException e) { conn.close(); @@ -1404,10 +1425,18 @@ private List> indexRows(JdbcIndexMeta idxMeta) { /** {@inheritDoc} */ @Override public ResultSet getSchemas(String catalog, String schemaPtrn) throws SQLException { - try { - if (conn.isClosed()) - throw new SQLException("Connection is closed."); + if (conn.isClosed()) + throw new SQLException("Connection is closed."); + + final List meta = Arrays.asList( + new JdbcColumnMeta(null, null, "TABLE_SCHEM", String.class), + new JdbcColumnMeta(null, null, "TABLE_CATALOG", String.class) + ); + if (!validCatalogPattern(catalog)) + return new JdbcThinResultSet(Collections.>emptyList(), meta); + + try { JdbcMetaSchemasResult res = conn.io().schemasMeta(schemaPtrn); List> rows = new LinkedList<>(); @@ -1421,10 +1450,7 @@ private List> indexRows(JdbcIndexMeta idxMeta) { rows.add(row); } - return new JdbcThinResultSet(rows, Arrays.asList( - new JdbcColumnMeta(null, null, "TABLE_SCHEM", String.class), - new JdbcColumnMeta(null, null, "TABLE_CATALOG", String.class) - )); + return new JdbcThinResultSet(rows, meta); } catch (IOException e) { conn.close(); @@ -1528,6 +1554,15 @@ private List> indexRows(JdbcIndexMeta idxMeta) { )); } + /** + * @param catalog Catalog pattern. + * @return {@code true} If patter is valid for Ignite (null, empty, or '%' wildcard). + * Otherwise returns {@code false}. + */ + private static boolean validCatalogPattern(String catalog) { + return F.isEmpty(catalog) || "%".equals(catalog); + } + /** {@inheritDoc} */ @Override public boolean generatedKeyAlwaysReturned() throws SQLException { return false; diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaSchemasResult.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaSchemasResult.java index c988e85ad7ea2..b7d1b3464bbc2 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaSchemasResult.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaSchemasResult.java @@ -19,6 +19,7 @@ import java.util.ArrayList; import java.util.Arrays; +import java.util.Collection; import java.util.List; import org.apache.ignite.binary.BinaryObjectException; import org.apache.ignite.internal.binary.BinaryReaderExImpl; @@ -29,7 +30,7 @@ */ public class JdbcMetaSchemasResult extends JdbcResult { /** Query result rows. */ - private List schemas; + private Collection schemas; /** * Default constructor is used for deserialization. @@ -41,7 +42,7 @@ public class JdbcMetaSchemasResult extends JdbcResult { /** * @param schemas Found schemas. */ - JdbcMetaSchemasResult(List schemas) { + JdbcMetaSchemasResult(Collection schemas) { super(META_SCHEMAS); this.schemas = schemas; } @@ -63,7 +64,7 @@ public class JdbcMetaSchemasResult extends JdbcResult { /** * @return Query result rows. */ - public List schemas() { + public Collection schemas() { return schemas; } } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcRequestHandler.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcRequestHandler.java index 29adf3356051d..970a083eb8d0b 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcRequestHandler.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcRequestHandler.java @@ -25,6 +25,7 @@ import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.atomic.AtomicLong; import org.apache.ignite.IgniteCheckedException; @@ -419,44 +420,37 @@ private SqlListenerResponse executeBatch(JdbcBatchExecuteRequest req) { */ private JdbcResponse getTablesMeta(JdbcMetaTablesRequest req) { try { - List meta = new ArrayList<>(); - - String realSchema = req.schemaName(); - - for (String cacheName : ctx.cache().publicCacheNames()) - { - if (!matches(cacheName, realSchema)) - continue; + boolean tblTypeMatch = false; - Collection tablesMeta = ctx.query().types(cacheName); + if (req.tableTypes() == null) + tblTypeMatch = true; + else { + for (String type : req.tableTypes()) { + if (matches("TABLE", type)) { + tblTypeMatch = true; - for (GridQueryTypeDescriptor table : tablesMeta) { - if (!matches(table.name(), req.tableName())) - continue; + break; + } + } + } - boolean tblTypeMatch = false; + if (!tblTypeMatch) + return new JdbcResponse(new JdbcMetaTablesResult(Collections.emptyList())); - if (req.tableTypes() == null) - tblTypeMatch = true; - else { - for (String type : req.tableTypes()) { - if (matches("TABLE", type)) { - tblTypeMatch = true; + List meta = new ArrayList<>(); - break; - } - } - } + for (String cacheName : ctx.cache().publicCacheNames()) { + for (GridQueryTypeDescriptor table : ctx.query().types(cacheName)) { + if (!matches(table.schemaName(), req.schemaName())) + continue; - if (tblTypeMatch) { - String schemaName = - ctx.cache().cacheDescriptor(cacheName).sql() ? QueryUtils.DFLT_SCHEMA : cacheName; + if (!matches(table.tableName(), req.tableName())) + continue; - JdbcTableMeta tableMeta = new JdbcTableMeta(schemaName, table.tableName(), "TABLE"); + JdbcTableMeta tableMeta = new JdbcTableMeta(table.schemaName(), table.tableName(), "TABLE"); - if (!meta.contains(tableMeta)) - meta.add(tableMeta); - } + if (!meta.contains(tableMeta)) + meta.add(tableMeta); } } @@ -479,29 +473,21 @@ private JdbcResponse getTablesMeta(JdbcMetaTablesRequest req) { */ private JdbcResponse getColumnsMeta(JdbcMetaColumnsRequest req) { try { - Collection cacheNames; - - if (req.schemaName() == null) - cacheNames = ctx.cache().publicCacheNames(); - else - cacheNames = Collections.singleton(req.schemaName()); - Collection meta = new HashSet<>(); - for (String cacheName : cacheNames) { - Collection tablesMeta = ctx.query().types(cacheName); - - String schemaName = ctx.cache().cacheDescriptor(cacheName).sql() ? QueryUtils.DFLT_SCHEMA : cacheName; + for (String cacheName : ctx.cache().publicCacheNames()) { + for (GridQueryTypeDescriptor table : ctx.query().types(cacheName)) { + if (!matches(table.schemaName(), req.schemaName())) + continue; - for (GridQueryTypeDescriptor table : tablesMeta) { - if (!matches(table.name(), req.tableName())) + if (!matches(table.tableName(), req.tableName())) continue; for (Map.Entry> field : table.fields().entrySet()) { if (!matches(field.getKey(), req.columnName())) continue; - JdbcColumnMeta columnMeta = new JdbcColumnMeta(schemaName, table.tableName(), + JdbcColumnMeta columnMeta = new JdbcColumnMeta(table.schemaName(), table.tableName(), field.getKey(), field.getValue()); if (!meta.contains(columnMeta)) @@ -527,26 +513,18 @@ private JdbcResponse getColumnsMeta(JdbcMetaColumnsRequest req) { */ private SqlListenerResponse getIndexesMeta(JdbcMetaIndexesRequest req) { try { - Collection cacheNames; - - if (req.schemaName() == null) - cacheNames = ctx.cache().publicCacheNames(); - else - cacheNames = Collections.singleton(req.schemaName()); - Collection meta = new HashSet<>(); - for (String cacheName : cacheNames) { - Collection tablesMeta = ctx.query().types(cacheName); - - String schemaName = ctx.cache().cacheDescriptor(cacheName).sql() ? QueryUtils.DFLT_SCHEMA : cacheName; + for (String cacheName : ctx.cache().publicCacheNames()) { + for (GridQueryTypeDescriptor table : ctx.query().types(cacheName)) { + if (!matches(table.schemaName(), req.schemaName())) + continue; - for (GridQueryTypeDescriptor table : tablesMeta) { - if (!matches(table.name(), req.tableName())) + if (!matches(table.tableName(), req.tableName())) continue; for (GridQueryIndexDescriptor idxDesc : table.indexes().values()) - meta.add(new JdbcIndexMeta(schemaName, table.tableName(), idxDesc)); + meta.add(new JdbcIndexMeta(table.schemaName(), table.tableName(), idxDesc)); } } @@ -592,22 +570,14 @@ private SqlListenerResponse getParametersMeta(JdbcMetaParamsRequest req) { */ private SqlListenerResponse getPrimaryKeys(JdbcMetaPrimaryKeysRequest req) { try { - Collection cacheNames; - - if (req.schemaName() == null) - cacheNames = ctx.cache().publicCacheNames(); - else - cacheNames = Collections.singleton(req.schemaName()); - Collection meta = new HashSet<>(); - for (String cacheName : cacheNames) { - Collection tablesMeta = ctx.query().types(cacheName); - - String schemaName = ctx.cache().cacheDescriptor(cacheName).sql() ? QueryUtils.DFLT_SCHEMA : cacheName; + for (String cacheName : ctx.cache().publicCacheNames()) { + for (GridQueryTypeDescriptor table : ctx.query().types(cacheName)) { + if (!matches(table.schemaName(), req.schemaName())) + continue; - for (GridQueryTypeDescriptor table : tablesMeta) { - if (!matches(table.name(), req.tableName())) + if (!matches(table.tableName(), req.tableName())) continue; List fields = new ArrayList<>(); @@ -620,11 +590,11 @@ private SqlListenerResponse getPrimaryKeys(JdbcMetaPrimaryKeysRequest req) { final String keyName = table.keyFieldName() == null ? "_KEY" : table.keyFieldName(); if (fields.isEmpty()) { - meta.add(new JdbcPrimaryKeyMeta(schemaName, table.tableName(), keyName, + meta.add(new JdbcPrimaryKeyMeta(table.schemaName(), table.tableName(), keyName, new String[] {keyName})); } else { - meta.add(new JdbcPrimaryKeyMeta(schemaName, table.tableName(), keyName, + meta.add(new JdbcPrimaryKeyMeta(table.schemaName(), table.tableName(), keyName, fields.toArray(new String[fields.size()]))); } } @@ -647,14 +617,13 @@ private SqlListenerResponse getSchemas(JdbcMetaSchemasRequest req) { try { String schemaPtrn = req.schemaName(); - List schemas = new ArrayList<>(); - - if (matches(QueryUtils.DFLT_SCHEMA, schemaPtrn)) - schemas.add(QueryUtils.DFLT_SCHEMA); + Set schemas = new HashSet<>(); for (String cacheName : ctx.cache().publicCacheNames()) { - if (!ctx.cache().cacheDescriptor(cacheName).sql() && matches(cacheName, schemaPtrn)) - schemas.add(cacheName); + for (GridQueryTypeDescriptor table : ctx.query().types(cacheName)) { + if (matches(table.schemaName(), schemaPtrn)) + schemas.add(table.schemaName()); + } } return new JdbcResponse(new JdbcMetaSchemasResult(schemas)); diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryProcessor.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryProcessor.java index d44be2c1df07f..4702d0754a0c3 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryProcessor.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryProcessor.java @@ -703,7 +703,7 @@ public void onCacheStart0(GridCacheContext cctx, QuerySchema schema) if (!F.isEmpty(qryEntities)) { for (QueryEntity qryEntity : qryEntities) { - QueryTypeCandidate cand = QueryUtils.typeForQueryEntity(cacheName, cctx, qryEntity, + QueryTypeCandidate cand = QueryUtils.typeForQueryEntity(cacheName, schemaName, cctx, qryEntity, mustDeserializeClss, escape); cands.add(cand); diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryTypeDescriptor.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryTypeDescriptor.java index c1a9e1e918d61..c149335373f65 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryTypeDescriptor.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryTypeDescriptor.java @@ -32,6 +32,13 @@ public interface GridQueryTypeDescriptor { */ public String name(); + /** + * Gets schema name for type (database schema means here). + * + * @return Schema name. + */ + public String schemaName(); + /** * Gets table name for type. * diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/QueryTypeDescriptorImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/QueryTypeDescriptorImpl.java index c0da83fc3948c..79b90e51c06c8 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/QueryTypeDescriptorImpl.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/QueryTypeDescriptorImpl.java @@ -42,6 +42,9 @@ public class QueryTypeDescriptorImpl implements GridQueryTypeDescriptor { /** */ private String name; + /** Schema name. */ + private String schemaName; + /** */ private String tblName; @@ -120,6 +123,11 @@ public String cacheName() { return name; } + /** {@inheritDoc} */ + @Override public String schemaName() { + return schemaName; + } + /** * Sets type name. * @@ -363,6 +371,13 @@ public void addProperty(GridQueryProperty prop, boolean failOnDuplicate) throws fields.put(name, prop.type()); } + /** + * @param schemaName Schema name. + */ + public void schemaName(String schemaName) { + this.schemaName = schemaName; + } + /** {@inheritDoc} */ @Override public boolean valueTextIndex() { return valTextIdx; diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/QueryUtils.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/QueryUtils.java index 320b25a2f770a..26fc776ee42ab 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/QueryUtils.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/QueryUtils.java @@ -343,6 +343,7 @@ private static String aliasForFieldName(String fieldName) { * Create type candidate for query entity. * * @param cacheName Cache name. + * @param schemaName Schema name. * @param cctx Cache context. * @param qryEntity Query entity. * @param mustDeserializeClss Classes which must be deserialized. @@ -350,8 +351,8 @@ private static String aliasForFieldName(String fieldName) { * @return Type candidate. * @throws IgniteCheckedException If failed. */ - public static QueryTypeCandidate typeForQueryEntity(String cacheName, GridCacheContext cctx, QueryEntity qryEntity, - List> mustDeserializeClss, boolean escape) throws IgniteCheckedException { + public static QueryTypeCandidate typeForQueryEntity(String cacheName, String schemaName, GridCacheContext cctx, + QueryEntity qryEntity, List> mustDeserializeClss, boolean escape) throws IgniteCheckedException { GridKernalContext ctx = cctx.kernalContext(); CacheConfiguration ccfg = cctx.config(); @@ -361,6 +362,8 @@ public static QueryTypeCandidate typeForQueryEntity(String cacheName, GridCacheC QueryTypeDescriptorImpl desc = new QueryTypeDescriptorImpl(cacheName); + desc.schemaName(schemaName); + desc.aliases(qryEntity.getAliases()); // Key and value classes still can be available if they are primitive or JDK part. diff --git a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/h2/GridIndexingSpiAbstractSelfTest.java b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/h2/GridIndexingSpiAbstractSelfTest.java index 99246ebc14279..f28a31facaab1 100644 --- a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/h2/GridIndexingSpiAbstractSelfTest.java +++ b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/h2/GridIndexingSpiAbstractSelfTest.java @@ -104,13 +104,13 @@ public abstract class GridIndexingSpiAbstractSelfTest extends GridCommonAbstract } /** */ - private static TypeDesc typeAA = new TypeDesc("A", "A", Collections.>emptyMap(), null); + private static TypeDesc typeAA = new TypeDesc("A", "A", "A", Collections.>emptyMap(), null); /** */ - private static TypeDesc typeAB = new TypeDesc("A", "B", Collections.>emptyMap(), textIdx); + private static TypeDesc typeAB = new TypeDesc("A", "A", "B", Collections.>emptyMap(), textIdx); /** */ - private static TypeDesc typeBA = new TypeDesc("B", "A", Collections.>emptyMap(), null); + private static TypeDesc typeBA = new TypeDesc("B", "B", "A", Collections.>emptyMap(), null); /** {@inheritDoc} */ @Override protected void beforeTest() throws Exception { @@ -474,11 +474,12 @@ private static class TypeDesc implements GridQueryTypeDescriptor { /** * @param cacheName Cache name. + * @param schema Schema name. * @param name Type name. * @param valFields Fields. * @param textIdx Fulltext index. */ - private TypeDesc(String cacheName, String name, Map> valFields, GridQueryIndexDescriptor textIdx) { + private TypeDesc(String cacheName, String schemaName, String name, Map> valFields, GridQueryIndexDescriptor textIdx) { this.name = name; this.cacheName = cacheName; this.valFields = Collections.unmodifiableMap(valFields); @@ -495,6 +496,11 @@ private TypeDesc(String cacheName, String name, Map> valFields, return name; } + /** {@inheritDoc} */ + @Override public String schemaName() { + return null; + } + /** {@inheritDoc} */ @Override public String tableName() { return null; From 65b5894cdeb8550a1492f94c30dc453b8ab7ede9 Mon Sep 17 00:00:00 2001 From: tledkov-gridgain Date: Mon, 14 Aug 2017 16:34:56 +0300 Subject: [PATCH 26/32] IGNITE-5233: check catalog pattern & use schema from tables --- .../jdbc/thin/JdbcThinParameterMetadata.java | 2 +- .../jdbc/thin/JdbcThinPreparedStatement.java | 2 +- .../internal/jdbc/thin/JdbcThinTcpIo.java | 32 +++++++++---------- .../odbc/jdbc/JdbcBatchExecuteRequest.java | 4 +-- .../odbc/jdbc/JdbcMetaColumnsRequest.java | 6 ++-- .../odbc/jdbc/JdbcMetaIndexesRequest.java | 4 +-- .../odbc/jdbc/JdbcMetaParamsRequest.java | 2 +- .../odbc/jdbc/JdbcMetaPrimaryKeysRequest.java | 4 +-- 8 files changed, 28 insertions(+), 28 deletions(-) diff --git a/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinParameterMetadata.java b/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinParameterMetadata.java index 712d3c1d46be2..a0b62b0ffb27a 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinParameterMetadata.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinParameterMetadata.java @@ -26,7 +26,7 @@ * JDBC SQL query's parameters metadata. */ public class JdbcThinParameterMetadata implements ParameterMetaData { - /** Meta. */ + /** Parameters metadata. */ private final List meta; /** diff --git a/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinPreparedStatement.java b/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinPreparedStatement.java index 92cbef5ef43a5..2551d55815ae1 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinPreparedStatement.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinPreparedStatement.java @@ -55,7 +55,7 @@ public class JdbcThinPreparedStatement extends JdbcThinStatement implements Prep /** Query arguments. */ protected ArrayList args; - /** Parameter meta data. */ + /** Parameters meta data. */ private JdbcThinParameterMetadata metaData; /** diff --git a/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinTcpIo.java b/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinTcpIo.java index 0c8c2bf95af4a..2727d88252ed7 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinTcpIo.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinTcpIo.java @@ -321,17 +321,17 @@ public void queryClose(long qryId) throws IOException, IgniteCheckedException { } /** - * @param schema Schema. + * @param schemaName Schema. * @param batch Batch queries. * @return Result. * @throws IOException On error. * @throws IgniteCheckedException On error. */ - public JdbcBatchExecuteResult batchExecute(String schema, List batch) + public JdbcBatchExecuteResult batchExecute(String schemaName, List batch) throws IOException, IgniteCheckedException { int cnt = Math.min(MAX_BATCH_QRY_CNT, batch.size()); - return sendRequest(new JdbcBatchExecuteRequest(schema, batch), DYNAMIC_SIZE_MSG_CAP * cnt); + return sendRequest(new JdbcBatchExecuteRequest(schemaName, batch), DYNAMIC_SIZE_MSG_CAP * cnt); } /** @@ -361,40 +361,40 @@ public JdbcMetaColumnsResult columnsMeta(String schemaPtrn, String tablePtrn, St } /** - * @param schema Schema. - * @param tbl Table + * @param schemaPtrn Schema name pattern. + * @param tablePtrn Table name pattern. * @return Result. * @throws IOException On error. * @throws IgniteCheckedException On error. */ - public JdbcMetaIndexesResult indexMeta(String schema, String tbl) throws IOException, IgniteCheckedException { - return sendRequest(new JdbcMetaIndexesRequest(schema, tbl), DYNAMIC_SIZE_MSG_CAP); + public JdbcMetaIndexesResult indexMeta(String schemaPtrn, String tablePtrn) throws IOException, IgniteCheckedException { + return sendRequest(new JdbcMetaIndexesRequest(schemaPtrn, tablePtrn), DYNAMIC_SIZE_MSG_CAP); } /** - * @param schema Schema. + * @param schemaPtrn Schema name pattern. * @param sql SQL query. * @return Result. * @throws IOException On error. * @throws IgniteCheckedException On error. */ - public JdbcMetaParamsResult parametersMeta(String schema, String sql) throws IOException, IgniteCheckedException { - return sendRequest(new JdbcMetaParamsRequest(schema, sql), DYNAMIC_SIZE_MSG_CAP); + public JdbcMetaParamsResult parametersMeta(String schemaPtrn, String sql) throws IOException, IgniteCheckedException { + return sendRequest(new JdbcMetaParamsRequest(schemaPtrn, sql), DYNAMIC_SIZE_MSG_CAP); } /** - * @param schema Schema. - * @param tbl Table. + * @param schemaPtrn Schema name pattern. + * @param tablePtrn Table name pattern. * @return Result. * @throws IOException On error. * @throws IgniteCheckedException On error. */ - public JdbcMetaPrimaryKeysResult primaryKeysMeta(String schema, String tbl) throws IOException, IgniteCheckedException { - return sendRequest(new JdbcMetaPrimaryKeysRequest(schema, tbl), DYNAMIC_SIZE_MSG_CAP); + public JdbcMetaPrimaryKeysResult primaryKeysMeta(String schemaPtrn, String tablePtrn) throws IOException, IgniteCheckedException { + return sendRequest(new JdbcMetaPrimaryKeysRequest(schemaPtrn, tablePtrn), DYNAMIC_SIZE_MSG_CAP); } /** - * @param schemaPtrn Schema. + * @param schemaPtrn Schema name pattern. * @return Result. * @throws IOException On error. * @throws IgniteCheckedException On error. @@ -404,7 +404,7 @@ public JdbcMetaSchemasResult schemasMeta(String schemaPtrn) throws IOException, } /** - * @param req ODBC request. + * @param req JDBC request bytes. * @throws IOException On error. */ private void send(byte[] req) throws IOException { diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcBatchExecuteRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcBatchExecuteRequest.java index bd7c59a9b1fce..25e1049820b88 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcBatchExecuteRequest.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcBatchExecuteRequest.java @@ -31,7 +31,7 @@ * JDBC batch execute request. */ public class JdbcBatchExecuteRequest extends JdbcRequest { - /** Cache name. */ + /** Schema name. */ private String schemaName; /** Sql query. */ @@ -59,7 +59,7 @@ public JdbcBatchExecuteRequest(String schemaName, List queries) { } /** - * @return Schema. + * @return Schema name. */ @Nullable public String schemaName() { return schemaName; diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaColumnsRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaColumnsRequest.java index 2b3854e15ea6e..7141a509359a3 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaColumnsRequest.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaColumnsRequest.java @@ -27,13 +27,13 @@ * JDBC get columns metadata request. */ public class JdbcMetaColumnsRequest extends JdbcRequest { - /** Schema name. */ + /** Schema name pattern. */ private String schemaName; - /** Table name. */ + /** Table name pattern. */ private String tblName; - /** Column name. */ + /** Column name pattern. */ private String colName; /** diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaIndexesRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaIndexesRequest.java index f8b03c0c09ac3..d4a53d8e79399 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaIndexesRequest.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaIndexesRequest.java @@ -27,10 +27,10 @@ * JDBC indexes metadata request. */ public class JdbcMetaIndexesRequest extends JdbcRequest { - /** Schema name. */ + /** Schema name pattern. */ private String schemaName; - /** Table name. */ + /** Table name pattern. */ private String tblName; /** diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaParamsRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaParamsRequest.java index 711827b38cfb2..11061134abd7c 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaParamsRequest.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaParamsRequest.java @@ -58,7 +58,7 @@ public String sql() { } /** - * @return Cache name. + * @return Schema name. */ public String schemaName() { return schemaName; diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaPrimaryKeysRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaPrimaryKeysRequest.java index 905559dbab030..fb9f4c2045eaf 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaPrimaryKeysRequest.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaPrimaryKeysRequest.java @@ -27,10 +27,10 @@ * JDBC get primary keys metadata request. */ public class JdbcMetaPrimaryKeysRequest extends JdbcRequest { - /** Cache name. */ + /** Schema name pattern. */ private String schemaName; - /** Table name. */ + /** Table name pattern. */ private String tblName; /** From 1aa6fb3748ba2dd61ca7229ab6eac34a45002563 Mon Sep 17 00:00:00 2001 From: tledkov-gridgain Date: Mon, 14 Aug 2017 16:47:39 +0300 Subject: [PATCH 27/32] IGNITE-5233: add test for invalid catalog --- .../jdbc/thin/JdbcThinMetadataSelfTest.java | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinMetadataSelfTest.java b/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinMetadataSelfTest.java index 9649522f9f990..3f9d9e6f7defb 100644 --- a/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinMetadataSelfTest.java +++ b/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinMetadataSelfTest.java @@ -378,6 +378,35 @@ public void testGetAllColumns() throws Exception { } } + /** + * @throws Exception If failed. + */ + public void testInvalidCatalog() throws Exception { + try (Connection conn = DriverManager.getConnection(URL)) { + DatabaseMetaData meta = conn.getMetaData(); + + ResultSet rs = meta.getSchemas("q", null); + + assert !rs.next() : "Results must be empty"; + + rs = meta.getTables("q", null, null, null); + + assert !rs.next() : "Results must be empty"; + + rs = meta.getColumns("q", null, null, null); + + assert !rs.next() : "Results must be empty"; + + rs = meta.getIndexInfo("q", null, null, false, false); + + assert !rs.next() : "Results must be empty"; + + rs = meta.getPrimaryKeys("q", null, null); + + assert !rs.next() : "Results must be empty"; + } + } + /** * @throws Exception If failed. */ From ab97a609abd32ae1312dcc5e69fd660432960098 Mon Sep 17 00:00:00 2001 From: tledkov-gridgain Date: Mon, 14 Aug 2017 17:15:49 +0300 Subject: [PATCH 28/32] IGNITE-5233: self review --- .../jdbc/thin/JdbcThinPreparedStatement.java | 2 +- .../ignite/internal/jdbc/thin/JdbcThinStatement.java | 2 +- .../processors/odbc/jdbc/JdbcColumnMeta.java | 2 +- .../internal/processors/odbc/jdbc/JdbcIndexMeta.java | 2 +- .../processors/odbc/jdbc/JdbcMetaColumnsRequest.java | 6 +++--- .../processors/odbc/jdbc/JdbcMetaColumnsResult.java | 6 +++--- .../processors/odbc/jdbc/JdbcMetaIndexesResult.java | 6 +++--- .../processors/odbc/jdbc/JdbcMetaParamsRequest.java | 12 ++++++------ .../processors/odbc/jdbc/JdbcMetaParamsResult.java | 2 +- .../odbc/jdbc/JdbcMetaPrimaryKeysRequest.java | 4 ++-- .../odbc/jdbc/JdbcMetaPrimaryKeysResult.java | 2 +- .../processors/odbc/jdbc/JdbcMetaSchemasResult.java | 5 ++--- .../processors/odbc/jdbc/JdbcMetaTablesRequest.java | 2 +- .../processors/odbc/jdbc/JdbcMetaTablesResult.java | 6 +++--- .../processors/odbc/jdbc/JdbcParameterMeta.java | 10 +++++----- .../processors/odbc/jdbc/JdbcPrimaryKeyMeta.java | 11 ++++++----- .../odbc/jdbc/JdbcQueryMetadataResult.java | 2 +- .../query/h2/GridIndexingSpiAbstractSelfTest.java | 8 ++++++-- 18 files changed, 47 insertions(+), 43 deletions(-) diff --git a/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinPreparedStatement.java b/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinPreparedStatement.java index 2551d55815ae1..e6dfa59690af4 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinPreparedStatement.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinPreparedStatement.java @@ -55,7 +55,7 @@ public class JdbcThinPreparedStatement extends JdbcThinStatement implements Prep /** Query arguments. */ protected ArrayList args; - /** Parameters meta data. */ + /** Parameters metadata. */ private JdbcThinParameterMetadata metaData; /** diff --git a/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinStatement.java b/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinStatement.java index 84d4b50f2f7f6..3772b83075095 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinStatement.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinStatement.java @@ -46,7 +46,7 @@ public class JdbcThinStatement implements Statement { /** Default queryPage size. */ private static final int DFLT_PAGE_SIZE = SqlQuery.DFLT_PAGE_SIZE; - /** Ignite endpoint and I/O protocol implementation. */ + /** JDBC Connection implementation. */ protected JdbcThinConnection conn; /** Closed flag. */ diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcColumnMeta.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcColumnMeta.java index f0b1e896c0457..e577fffdf80dd 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcColumnMeta.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcColumnMeta.java @@ -162,7 +162,7 @@ public String dataTypeClass() { if (!F.eq(tblName, meta.tblName)) return false; - return colName.equals(meta.colName); + return F.eq(colName, meta.colName); } /** {@inheritDoc} */ diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcIndexMeta.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcIndexMeta.java index afe8342906041..cbf7b6c77a5f4 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcIndexMeta.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcIndexMeta.java @@ -157,7 +157,7 @@ public boolean[] fieldsAsc() { if (!F.eq(tblName, meta.tblName)) return false; - return idxName.equals(meta.idxName); + return F.eq(idxName, meta.idxName); } /** {@inheritDoc} */ diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaColumnsRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaColumnsRequest.java index 7141a509359a3..fca1bf70d2b8e 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaColumnsRequest.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaColumnsRequest.java @@ -57,21 +57,21 @@ public JdbcMetaColumnsRequest(String schemaName, String tblName, String colName) } /** - * @return Cache name. + * @return Schema name pattern. */ @Nullable public String schemaName() { return schemaName; } /** - * @return Table name. + * @return Table name pattern. */ public String tableName() { return tblName; } /** - * @return Column name. + * @return Column name pattern. */ public String columnName() { return colName; diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaColumnsResult.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaColumnsResult.java index af55a4f946f66..814a72810dee4 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaColumnsResult.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaColumnsResult.java @@ -30,7 +30,7 @@ * JDBC columns metadata result. */ public class JdbcMetaColumnsResult extends JdbcResult { - /** Query result rows. */ + /** Columns metadata. */ private List meta; /** @@ -41,7 +41,7 @@ public class JdbcMetaColumnsResult extends JdbcResult { } /** - * @param meta Column metadata. + * @param meta Columns metadata. */ JdbcMetaColumnsResult(Collection meta) { super(META_COLUMNS); @@ -49,7 +49,7 @@ public class JdbcMetaColumnsResult extends JdbcResult { } /** - * @return Query result rows. + * @return Columns metadata. */ public List meta() { return meta; diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaIndexesResult.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaIndexesResult.java index 9ef2f1a11befc..af23e39f1f6ce 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaIndexesResult.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaIndexesResult.java @@ -30,7 +30,7 @@ * JDBC indexes metadata result. */ public class JdbcMetaIndexesResult extends JdbcResult { - /** Query result rows. */ + /** Indexes metadata. */ private List meta; /** @@ -41,7 +41,7 @@ public class JdbcMetaIndexesResult extends JdbcResult { } /** - * @param meta Column metadata. + * @param meta Indexes metadata. */ JdbcMetaIndexesResult(Collection meta) { super(META_INDEXES); @@ -49,7 +49,7 @@ public class JdbcMetaIndexesResult extends JdbcResult { } /** - * @return Query result rows. + * @return Indexes metadata. */ public List meta() { return meta; diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaParamsRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaParamsRequest.java index 11061134abd7c..6b955f9cd4845 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaParamsRequest.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaParamsRequest.java @@ -51,17 +51,17 @@ public JdbcMetaParamsRequest(String schemaName, String sql) { } /** - * @return SQL Query. + * @return Schema name. */ - public String sql() { - return sql; + public String schemaName() { + return schemaName; } /** - * @return Schema name. + * @return SQL Query. */ - public String schemaName() { - return schemaName; + public String sql() { + return sql; } /** {@inheritDoc} */ diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaParamsResult.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaParamsResult.java index c6e3f93c49dd8..c7fe9109dc89d 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaParamsResult.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaParamsResult.java @@ -83,7 +83,7 @@ public class JdbcMetaParamsResult extends JdbcResult { } /** - * @return Query result rows. + * @return SQL query parameters metadata. */ public List meta() { return meta; diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaPrimaryKeysRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaPrimaryKeysRequest.java index fb9f4c2045eaf..957225a380ef7 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaPrimaryKeysRequest.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaPrimaryKeysRequest.java @@ -52,14 +52,14 @@ public JdbcMetaPrimaryKeysRequest(String schemaName, String tblName) { } /** - * @return Schema name. + * @return Schema name pattern. */ @Nullable public String schemaName() { return schemaName; } /** - * @return Table name. + * @return Table name pattern. */ public String tableName() { return tblName; diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaPrimaryKeysResult.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaPrimaryKeysResult.java index 8f322b5ddb111..2dda4bfd474e6 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaPrimaryKeysResult.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaPrimaryKeysResult.java @@ -85,7 +85,7 @@ public class JdbcMetaPrimaryKeysResult extends JdbcResult { } /** - * @return Primary keys meta. + * @return Primary keys metadata. */ public List meta() { return meta; diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaSchemasResult.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaSchemasResult.java index b7d1b3464bbc2..961cb17191d9e 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaSchemasResult.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaSchemasResult.java @@ -20,7 +20,6 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; -import java.util.List; import org.apache.ignite.binary.BinaryObjectException; import org.apache.ignite.internal.binary.BinaryReaderExImpl; import org.apache.ignite.internal.binary.BinaryWriterExImpl; @@ -29,7 +28,7 @@ * JDBC tables metadata result. */ public class JdbcMetaSchemasResult extends JdbcResult { - /** Query result rows. */ + /** Found schemas. */ private Collection schemas; /** @@ -62,7 +61,7 @@ public class JdbcMetaSchemasResult extends JdbcResult { } /** - * @return Query result rows. + * @return Found schemas. */ public Collection schemas() { return schemas; diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaTablesRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaTablesRequest.java index 37b9620207c04..2df570166df37 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaTablesRequest.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaTablesRequest.java @@ -70,7 +70,7 @@ public String tableName() { } /** - * @return Table type search pattern. + * @return Table types. */ public String[] tableTypes() { return tableTypes; diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaTablesResult.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaTablesResult.java index a1d7892f2a7b9..c4f9d013c6743 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaTablesResult.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaTablesResult.java @@ -29,7 +29,7 @@ * JDBC tables metadata result. */ public class JdbcMetaTablesResult extends JdbcResult { - /** Query result rows. */ + /** Tables metadata. */ private List meta; /** @@ -40,7 +40,7 @@ public class JdbcMetaTablesResult extends JdbcResult { } /** - * @param meta Column metadata. + * @param meta Tables metadata. */ JdbcMetaTablesResult(List meta) { super(META_TABLES); @@ -83,7 +83,7 @@ public class JdbcMetaTablesResult extends JdbcResult { } /** - * @return Query result rows. + * @return Tables metadata. */ public List meta() { return meta; diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcParameterMeta.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcParameterMeta.java index 8437b95e45f57..bfc721c69934d 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcParameterMeta.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcParameterMeta.java @@ -32,7 +32,7 @@ public class JdbcParameterMeta implements JdbcRawBinarylizable { /** Null value is allow for the param. */ private int isNullable; - /** Signed. */ + /** Signed flag. */ private boolean signed; /** Precision. */ @@ -41,13 +41,13 @@ public class JdbcParameterMeta implements JdbcRawBinarylizable { /** Scale. */ private int scale; - /** SQL type. */ + /** SQL type ID. */ private int type; - /** SQL type. */ + /** SQL type name. */ private String typeName; - /** SQL type. */ + /** Java type class name. */ private String typeClass; /** Mode. */ @@ -120,7 +120,7 @@ public String typeName() { } /** - * @return Type class name. + * @return Java type class name. */ public String typeClass() { return typeClass; diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcPrimaryKeyMeta.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcPrimaryKeyMeta.java index 6ba9af862be8b..ab187a4059c73 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcPrimaryKeyMeta.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcPrimaryKeyMeta.java @@ -20,12 +20,13 @@ import org.apache.ignite.binary.BinaryObjectException; import org.apache.ignite.internal.binary.BinaryReaderExImpl; import org.apache.ignite.internal.binary.BinaryWriterExImpl; +import org.apache.ignite.internal.util.typedef.F; /** * JDBC primary key metadata. */ public class JdbcPrimaryKeyMeta implements JdbcRawBinarylizable { - /** Cache name. */ + /** Schema name. */ private String schemaName; /** Table name. */ @@ -79,7 +80,7 @@ public String name() { } /** - * @return Index fields + * @return Key fields. */ public String[] fields() { return fields; @@ -112,13 +113,13 @@ public String[] fields() { JdbcPrimaryKeyMeta meta = (JdbcPrimaryKeyMeta)o; - if (schemaName != null ? !schemaName.equals(meta.schemaName) : meta.schemaName != null) + if (!F.eq(schemaName, meta.schemaName)) return false; - if (!tblName.equals(meta.tblName)) + if (!F.eq(tblName, meta.tblName)) return false; - return name.equals(meta.name); + return F.eq(name, meta.name); } /** {@inheritDoc} */ diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcQueryMetadataResult.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcQueryMetadataResult.java index cf232d6b51f17..d7c3ce199bbcf 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcQueryMetadataResult.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcQueryMetadataResult.java @@ -50,7 +50,7 @@ public class JdbcQueryMetadataResult extends JdbcResult { } /** - * @return Query result rows. + * @return Query result metadata. */ public List meta() { return meta; diff --git a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/h2/GridIndexingSpiAbstractSelfTest.java b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/h2/GridIndexingSpiAbstractSelfTest.java index f28a31facaab1..e1ab8e629c6df 100644 --- a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/h2/GridIndexingSpiAbstractSelfTest.java +++ b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/query/h2/GridIndexingSpiAbstractSelfTest.java @@ -466,6 +466,9 @@ private static class TypeDesc implements GridQueryTypeDescriptor { /** */ private final String cacheName; + /** */ + private final String schemaName; + /** */ private final Map> valFields; @@ -474,7 +477,7 @@ private static class TypeDesc implements GridQueryTypeDescriptor { /** * @param cacheName Cache name. - * @param schema Schema name. + * @param schemaName Schema name. * @param name Type name. * @param valFields Fields. * @param textIdx Fulltext index. @@ -482,6 +485,7 @@ private static class TypeDesc implements GridQueryTypeDescriptor { private TypeDesc(String cacheName, String schemaName, String name, Map> valFields, GridQueryIndexDescriptor textIdx) { this.name = name; this.cacheName = cacheName; + this.schemaName = schemaName; this.valFields = Collections.unmodifiableMap(valFields); this.textIdx = textIdx; } @@ -498,7 +502,7 @@ private TypeDesc(String cacheName, String schemaName, String name, Map Date: Tue, 15 Aug 2017 12:41:07 +0300 Subject: [PATCH 29/32] Minors --- .../processors/odbc/jdbc/JdbcColumnMeta.java | 11 ++++------- .../processors/odbc/jdbc/JdbcIndexMeta.java | 13 +++---------- .../processors/odbc/jdbc/JdbcMetaColumnsResult.java | 1 + .../processors/odbc/jdbc/JdbcPrimaryKeyMeta.java | 10 +++------- .../processors/odbc/jdbc/JdbcRequestHandler.java | 4 ++-- .../internal/processors/odbc/jdbc/JdbcResult.java | 1 - .../processors/odbc/jdbc/JdbcTableMeta.java | 1 + 7 files changed, 14 insertions(+), 27 deletions(-) diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcColumnMeta.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcColumnMeta.java index e577fffdf80dd..ea1b96ba776d0 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcColumnMeta.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcColumnMeta.java @@ -77,6 +77,7 @@ public JdbcColumnMeta(String schemaName, String tblName, String colName, Class meta) { super(META_COLUMNS); + this.meta = new ArrayList<>(meta); } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcPrimaryKeyMeta.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcPrimaryKeyMeta.java index ab187a4059c73..e1c889df0bcb1 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcPrimaryKeyMeta.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcPrimaryKeyMeta.java @@ -113,20 +113,16 @@ public String[] fields() { JdbcPrimaryKeyMeta meta = (JdbcPrimaryKeyMeta)o; - if (!F.eq(schemaName, meta.schemaName)) - return false; - - if (!F.eq(tblName, meta.tblName)) - return false; - - return F.eq(name, meta.name); + return F.eq(schemaName, meta.schemaName) && F.eq(tblName, meta.tblName) && F.eq(name, meta.name); } /** {@inheritDoc} */ @Override public int hashCode() { int result = schemaName != null ? schemaName.hashCode() : 0; + result = 31 * result + tblName.hashCode(); result = 31 * result + name.hashCode(); + return result; } } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcRequestHandler.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcRequestHandler.java index 970a083eb8d0b..cab2ba2b07eb0 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcRequestHandler.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcRequestHandler.java @@ -195,7 +195,6 @@ public JdbcRequestHandler(GridKernalContext ctx, GridSpinBusyLock busyLock, int writer.writeByteArray(IgniteVersionUtils.VER.revisionHash()); } - /** * {@link JdbcQueryExecuteRequest} command handler. * @@ -587,7 +586,8 @@ private SqlListenerResponse getPrimaryKeys(JdbcMetaPrimaryKeysRequest req) { fields.add(field); } - final String keyName = table.keyFieldName() == null ? "_KEY" : table.keyFieldName(); + final String keyName = table.keyFieldName() == null ? + QueryUtils.KEY_FIELD_NAME : table.keyFieldName(); if (fields.isEmpty()) { meta.add(new JdbcPrimaryKeyMeta(table.schemaName(), table.tableName(), keyName, diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcResult.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcResult.java index 330cc00532856..202905bbc9e4d 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcResult.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcResult.java @@ -107,7 +107,6 @@ public static JdbcResult readResult(BinaryReaderExImpl reader) throws BinaryObje case BATCH_EXEC: res = new JdbcBatchExecuteResult(); - break; case META_TABLES: diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcTableMeta.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcTableMeta.java index 4e453074a0735..36a8a3184fb0a 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcTableMeta.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcTableMeta.java @@ -38,6 +38,7 @@ public class JdbcTableMeta implements JdbcRawBinarylizable { * Default constructor is used for deserialization. */ JdbcTableMeta() { + // No-op. } /** From dfcba18a56d0b31e578c98a0a788a5d35185a88f Mon Sep 17 00:00:00 2001 From: tledkov-gridgain Date: Tue, 15 Aug 2017 14:14:37 +0300 Subject: [PATCH 30/32] IGNITE-5233: fix review comments --- .../jdbc/thin/JdbcThinMetadataSelfTest.java | 11 ++-- .../jdbc/thin/JdbcThinDatabaseMetadata.java | 34 +++++++---- .../internal/jdbc/thin/JdbcThinTcpIo.java | 5 +- .../odbc/SqlListenerNioListener.java | 9 +-- .../odbc/SqlListenerRequestHandler.java | 4 +- .../odbc/jdbc/JdbcBatchExecuteResult.java | 6 ++ .../processors/odbc/jdbc/JdbcColumnMeta.java | 6 ++ .../processors/odbc/jdbc/JdbcIndexMeta.java | 57 ++++++++++++++----- .../odbc/jdbc/JdbcMetaColumnsResult.java | 6 ++ .../odbc/jdbc/JdbcMetaIndexesResult.java | 6 ++ .../odbc/jdbc/JdbcMetaParamsResult.java | 6 ++ .../odbc/jdbc/JdbcMetaPrimaryKeysResult.java | 6 ++ .../odbc/jdbc/JdbcMetaSchemasResult.java | 12 ++-- .../odbc/jdbc/JdbcMetaTablesRequest.java | 16 +----- .../odbc/jdbc/JdbcMetaTablesResult.java | 6 ++ .../odbc/jdbc/JdbcParameterMeta.java | 6 ++ .../odbc/jdbc/JdbcPrimaryKeyMeta.java | 13 +++-- .../odbc/jdbc/JdbcQueryExecuteResult.java | 6 ++ .../odbc/jdbc/JdbcQueryFetchResult.java | 6 ++ .../odbc/jdbc/JdbcQueryMetadataResult.java | 6 ++ .../odbc/jdbc/JdbcRequestHandler.java | 35 ++++-------- .../processors/odbc/jdbc/JdbcTableMeta.java | 19 ++----- .../processors/odbc/jdbc/JdbcUtils.java | 37 +++++++++++- .../odbc/odbc/OdbcRequestHandler.java | 4 +- 24 files changed, 218 insertions(+), 104 deletions(-) diff --git a/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinMetadataSelfTest.java b/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinMetadataSelfTest.java index 3f9d9e6f7defb..01b2e8a6e97a9 100644 --- a/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinMetadataSelfTest.java +++ b/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinMetadataSelfTest.java @@ -500,17 +500,18 @@ public void testGetAllPrimaryKeys() throws Exception { ResultSet rs = conn.getMetaData().getPrimaryKeys(null, null, null); Set expectedPks = new HashSet<>(Arrays.asList( - "org.ORGANIZATION._KEY", - "pers.PERSON._KEY", - "PUBLIC.TEST.ID", - "PUBLIC.TEST.NAME", - "PUBLIC.Quoted.Id")); + "org.ORGANIZATION.PK_org_ORGANIZATION._KEY", + "pers.PERSON.PK_pers_PERSON._KEY", + "PUBLIC.TEST.PK_PUBLIC_TEST.ID", + "PUBLIC.TEST.PK_PUBLIC_TEST.NAME", + "PUBLIC.Quoted.PK_PUBLIC_Quoted.Id")); Set actualPks = new HashSet<>(expectedPks.size()); while(rs.next()) { actualPks.add(rs.getString("TABLE_SCHEM") + '.' + rs.getString("TABLE_NAME") + + '.' + rs.getString("PK_NAME") + '.' + rs.getString("COLUMN_NAME")); } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinDatabaseMetadata.java b/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinDatabaseMetadata.java index 083f8f6d0e85d..fc579c011392e 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinDatabaseMetadata.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinDatabaseMetadata.java @@ -716,11 +716,25 @@ public class JdbcThinDatabaseMetadata implements DatabaseMetaData { new JdbcColumnMeta(null, null, "SELF_REFERENCING_COL_NAME", String.class), new JdbcColumnMeta(null, null, "REF_GENERATION", String.class)); - if (!validCatalogPattern(catalog)) + boolean tblTypeMatch = false; + + if (tblTypes == null) + tblTypeMatch = true; + else { + for (String type : tblTypes) { + if ("TABLE".equals(type)) { + tblTypeMatch = true; + + break; + } + } + } + + if (!validCatalogPattern(catalog) || !tblTypeMatch) return new JdbcThinResultSet(Collections.>emptyList(), meta); try { - JdbcMetaTablesResult res = conn.io().tablesMeta(schemaPtrn, tblNamePtrn, tblTypes); + JdbcMetaTablesResult res = conn.io().tablesMeta(schemaPtrn, tblNamePtrn); List> rows = new LinkedList<>(); @@ -749,7 +763,7 @@ private List tableRow(JdbcTableMeta tblMeta) { row.add(null); row.add(tblMeta.schemaName()); row.add(tblMeta.tableName()); - row.add(tblMeta.tableType()); + row.add("TABLE"); row.add(null); row.add(null); row.add(null); @@ -959,15 +973,15 @@ private List columnRow(JdbcColumnMeta colMeta, int pos) { * @return Result set rows for primary key. */ private List> primaryKeyRows(JdbcPrimaryKeyMeta pkMeta) { - List> rows = new ArrayList<>(pkMeta.fields().length); + List> rows = new ArrayList<>(pkMeta.fields().size()); - for (int i = 0; i < pkMeta.fields().length; ++i) { + for (int i = 0; i < pkMeta.fields().size(); ++i) { List row = new ArrayList<>(6); row.add((String)null); // table catalog row.add(pkMeta.schemaName()); row.add(pkMeta.tableName()); - row.add(pkMeta.fields()[i]); + row.add(pkMeta.fields().get(i)); row.add((Integer)i + 1); // sequence number row.add(pkMeta.name()); @@ -1197,9 +1211,9 @@ private List> primaryKeyRows(JdbcPrimaryKeyMeta pkMeta) { * @return List of result rows correspond to index. */ private List> indexRows(JdbcIndexMeta idxMeta) { - List> rows = new ArrayList<>(idxMeta.fields().length); + List> rows = new ArrayList<>(idxMeta.fields().size()); - for (int i = 0; i < idxMeta.fields().length; ++i) { + for (int i = 0; i < idxMeta.fields().size(); ++i) { List row = new ArrayList<>(13); row.add((String)null); // table catalog @@ -1210,8 +1224,8 @@ private List> indexRows(JdbcIndexMeta idxMeta) { row.add(idxMeta.indexName()); row.add((short)tableIndexOther); // type row.add((Integer)i); // field ordinal position in index - row.add(idxMeta.fields()[i]); - row.add(idxMeta.fieldsAsc()[i] ? "A" : "D"); + row.add(idxMeta.fields().get(i)); + row.add(idxMeta.fieldsAsc().get(i) ? "A" : "D"); row.add((Integer)0); // cardinality row.add((Integer)0); // pages row.add((String)null); // filer condition diff --git a/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinTcpIo.java b/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinTcpIo.java index 2727d88252ed7..55ea82f42b193 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinTcpIo.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinTcpIo.java @@ -337,14 +337,13 @@ public JdbcBatchExecuteResult batchExecute(String schemaName, List ba /** * @param schemaPtrn Schema name pattern. * @param tablePtrn Table name pattern. - * @param types Table types * @return Result. * @throws IOException On error. * @throws IgniteCheckedException On error. */ - public JdbcMetaTablesResult tablesMeta(String schemaPtrn, String tablePtrn, String[] types) + public JdbcMetaTablesResult tablesMeta(String schemaPtrn, String tablePtrn) throws IOException, IgniteCheckedException { - return sendRequest(new JdbcMetaTablesRequest(schemaPtrn, tablePtrn, types), DYNAMIC_SIZE_MSG_CAP); + return sendRequest(new JdbcMetaTablesRequest(schemaPtrn, tablePtrn), DYNAMIC_SIZE_MSG_CAP); } /** diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/SqlListenerNioListener.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/SqlListenerNioListener.java index e8d042cde79b9..5a49e3faf1650 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/SqlListenerNioListener.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/SqlListenerNioListener.java @@ -215,13 +215,10 @@ private void onHandshake(GridNioSession ses, byte[] msg) { // Send response. BinaryWriterExImpl writer = new BinaryWriterExImpl(null, new BinaryHeapOutputStream(8), null, null); - if (errMsg == null) { - writer.writeBoolean(true); - - if (connCtx != null) - connCtx.handler().handshakeAdditionalResponse(writer); - } + if (connCtx != null) + connCtx.handler().writeHandshake(writer); else { + // Failed handshake response writer.writeBoolean(false); writer.writeShort(CURRENT_VER.major()); writer.writeShort(CURRENT_VER.minor()); diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/SqlListenerRequestHandler.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/SqlListenerRequestHandler.java index 27dc66bf4722f..348054f34708b 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/SqlListenerRequestHandler.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/SqlListenerRequestHandler.java @@ -40,9 +40,9 @@ public interface SqlListenerRequestHandler { public SqlListenerResponse handleException(Exception e); /** - * Add custom data to handshake response. + * Write successful handshake response. * * @param writer Binary writer. */ - public void handshakeAdditionalResponse(BinaryWriterExImpl writer); + public void writeHandshake(BinaryWriterExImpl writer); } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcBatchExecuteResult.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcBatchExecuteResult.java index 7977c224a782d..917e60ae75ccc 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcBatchExecuteResult.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcBatchExecuteResult.java @@ -20,6 +20,7 @@ import org.apache.ignite.binary.BinaryObjectException; import org.apache.ignite.internal.binary.BinaryReaderExImpl; import org.apache.ignite.internal.binary.BinaryWriterExImpl; +import org.apache.ignite.internal.util.typedef.internal.S; /** * JDBC batch execute result. @@ -93,4 +94,9 @@ public String errorMessage() { errMsg = reader.readString(); updateCnts = reader.readIntArray(); } + + /** {@inheritDoc} */ + @Override public String toString() { + return S.toString(JdbcBatchExecuteResult.class, this); + } } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcColumnMeta.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcColumnMeta.java index e577fffdf80dd..abf3f7cfb4ec5 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcColumnMeta.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcColumnMeta.java @@ -22,6 +22,7 @@ import org.apache.ignite.internal.jdbc.thin.JdbcThinUtils; import org.apache.ignite.internal.processors.query.GridQueryFieldMetadata; import org.apache.ignite.internal.util.typedef.F; +import org.apache.ignite.internal.util.typedef.internal.S; /** * JDBC column metadata. @@ -172,4 +173,9 @@ public String dataTypeClass() { result = 31 * result + colName.hashCode(); return result; } + + /** {@inheritDoc} */ + @Override public String toString() { + return S.toString(JdbcColumnMeta.class, this); + } } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcIndexMeta.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcIndexMeta.java index cbf7b6c77a5f4..288af13505caf 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcIndexMeta.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcIndexMeta.java @@ -17,12 +17,16 @@ package org.apache.ignite.internal.processors.odbc.jdbc; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; import org.apache.ignite.binary.BinaryObjectException; import org.apache.ignite.cache.QueryIndexType; import org.apache.ignite.internal.binary.BinaryReaderExImpl; import org.apache.ignite.internal.binary.BinaryWriterExImpl; import org.apache.ignite.internal.processors.query.GridQueryIndexDescriptor; import org.apache.ignite.internal.util.typedef.F; +import org.apache.ignite.internal.util.typedef.internal.S; /** * JDBC index metadata. @@ -41,10 +45,10 @@ public class JdbcIndexMeta implements JdbcRawBinarylizable { private QueryIndexType type; /** Index fields */ - private String[] fields; + private List fields; /** Index fields is ascending. */ - private boolean[] fieldsAsc; + private List fieldsAsc; /** * Default constructor is used for binary serialization. @@ -68,12 +72,12 @@ public class JdbcIndexMeta implements JdbcRawBinarylizable { idxName = idx.name(); type = idx.type(); - fields = idx.fields().toArray(new String[idx.fields().size()]); + fields = new ArrayList(idx.fields()); - fieldsAsc = new boolean[fields.length]; + fieldsAsc = new ArrayList<>(fields.size()); - for (int i = 0; i < fields.length; ++i) - fieldsAsc[i] = !idx.descending(fields[i]); + for (int i = 0; i < fields.size(); ++i) + fieldsAsc.add(!idx.descending(fields.get(i))); } /** @@ -107,14 +111,14 @@ public QueryIndexType type() { /** * @return Index fields */ - public String[] fields() { + public List fields() { return fields; } /** * @return Index fields is ascending. */ - public boolean[] fieldsAsc() { + public List fieldsAsc() { return fieldsAsc; } @@ -124,8 +128,17 @@ public boolean[] fieldsAsc() { writer.writeString(tblName); writer.writeString(idxName); writer.writeByte((byte)type.ordinal()); - writer.writeStringArray(fields); - writer.writeBooleanArray(fieldsAsc); + + JdbcUtils.writeStringCollection(writer, fields); + + if (fieldsAsc == null) + writer.writeInt(0); + else { + writer.writeInt(fieldsAsc.size()); + + for (Boolean b : fieldsAsc) + writer.writeBoolean(b.booleanValue()); + } } /** {@inheritDoc} */ @@ -134,11 +147,22 @@ public boolean[] fieldsAsc() { tblName = reader.readString(); idxName = reader.readString(); type = QueryIndexType.fromOrdinal(reader.readByte()); - fields = reader.readStringArray(); - fieldsAsc = reader.readBooleanArray(); - assert fields.length == fieldsAsc.length : "Fields info is broken: [fields.length=" + fields.length + - ", fieldsAsc.length=" + fieldsAsc.length + ']'; + fields = JdbcUtils.readStringList(reader); + + int size = reader.readInt(); + + if (size > 0) { + fieldsAsc = new ArrayList<>(size); + + for (int i = 0; i < size; ++i) + fieldsAsc .add(reader.readBoolean()); + } + else + fieldsAsc = Collections.emptyList(); + + assert fields.size() == fieldsAsc.size() : "Fields info is broken: [fields.length=" + fields.size() + + ", fieldsAsc.length=" + fieldsAsc.size() + ']'; } /** {@inheritDoc} */ @@ -167,4 +191,9 @@ public boolean[] fieldsAsc() { result = 31 * result + idxName.hashCode(); return result; } + + /** {@inheritDoc} */ + @Override public String toString() { + return S.toString(JdbcIndexMeta.class, this); + } } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaColumnsResult.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaColumnsResult.java index 814a72810dee4..6f7dd9462ccbe 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaColumnsResult.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaColumnsResult.java @@ -25,6 +25,7 @@ import org.apache.ignite.internal.binary.BinaryReaderExImpl; import org.apache.ignite.internal.binary.BinaryWriterExImpl; import org.apache.ignite.internal.util.typedef.F; +import org.apache.ignite.internal.util.typedef.internal.S; /** * JDBC columns metadata result. @@ -89,4 +90,9 @@ public List meta() { } } } + + /** {@inheritDoc} */ + @Override public String toString() { + return S.toString(JdbcMetaColumnsResult.class, this); + } } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaIndexesResult.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaIndexesResult.java index af23e39f1f6ce..2316dfceac416 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaIndexesResult.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaIndexesResult.java @@ -25,6 +25,7 @@ import org.apache.ignite.internal.binary.BinaryReaderExImpl; import org.apache.ignite.internal.binary.BinaryWriterExImpl; import org.apache.ignite.internal.util.typedef.F; +import org.apache.ignite.internal.util.typedef.internal.S; /** * JDBC indexes metadata result. @@ -89,4 +90,9 @@ public List meta() { } } } + + /** {@inheritDoc} */ + @Override public String toString() { + return S.toString(JdbcMetaIndexesResult.class, this); + } } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaParamsResult.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaParamsResult.java index c7fe9109dc89d..7563e014934cd 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaParamsResult.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaParamsResult.java @@ -24,6 +24,7 @@ import org.apache.ignite.internal.binary.BinaryReaderExImpl; import org.apache.ignite.internal.binary.BinaryWriterExImpl; import org.apache.ignite.internal.util.typedef.F; +import org.apache.ignite.internal.util.typedef.internal.S; /** * JDBC SQL query parameters metadata result. @@ -88,4 +89,9 @@ public class JdbcMetaParamsResult extends JdbcResult { public List meta() { return meta; } + + /** {@inheritDoc} */ + @Override public String toString() { + return S.toString(JdbcMetaParamsResult.class, this); + } } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaPrimaryKeysResult.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaPrimaryKeysResult.java index 2dda4bfd474e6..bd0dd90857240 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaPrimaryKeysResult.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaPrimaryKeysResult.java @@ -25,6 +25,7 @@ import org.apache.ignite.internal.binary.BinaryReaderExImpl; import org.apache.ignite.internal.binary.BinaryWriterExImpl; import org.apache.ignite.internal.util.typedef.F; +import org.apache.ignite.internal.util.typedef.internal.S; /** * JDBC primary keys metadata result. @@ -90,4 +91,9 @@ public class JdbcMetaPrimaryKeysResult extends JdbcResult { public List meta() { return meta; } + + /** {@inheritDoc} */ + @Override public String toString() { + return S.toString(JdbcMetaPrimaryKeysResult.class, this); + } } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaSchemasResult.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaSchemasResult.java index 961cb17191d9e..48b6aae387171 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaSchemasResult.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaSchemasResult.java @@ -17,12 +17,11 @@ package org.apache.ignite.internal.processors.odbc.jdbc; -import java.util.ArrayList; -import java.util.Arrays; import java.util.Collection; import org.apache.ignite.binary.BinaryObjectException; import org.apache.ignite.internal.binary.BinaryReaderExImpl; import org.apache.ignite.internal.binary.BinaryWriterExImpl; +import org.apache.ignite.internal.util.typedef.internal.S; /** * JDBC tables metadata result. @@ -50,14 +49,14 @@ public class JdbcMetaSchemasResult extends JdbcResult { @Override public void writeBinary(BinaryWriterExImpl writer) throws BinaryObjectException { super.writeBinary(writer); - writer.writeStringArray(schemas.toArray(new String[schemas.size()])); + JdbcUtils.writeStringCollection(writer, schemas); } /** {@inheritDoc} */ @Override public void readBinary(BinaryReaderExImpl reader) throws BinaryObjectException { super.readBinary(reader); - schemas = new ArrayList<>(Arrays.asList(reader.readStringArray())); + schemas = JdbcUtils.readStringList(reader); } /** @@ -66,4 +65,9 @@ public class JdbcMetaSchemasResult extends JdbcResult { public Collection schemas() { return schemas; } + + /** {@inheritDoc} */ + @Override public String toString() { + return S.toString(JdbcMetaSchemasResult.class, this); + } } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaTablesRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaTablesRequest.java index 2df570166df37..740b6561600c5 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaTablesRequest.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaTablesRequest.java @@ -32,9 +32,6 @@ public class JdbcMetaTablesRequest extends JdbcRequest { /** Table search pattern. */ private String tblName; - /** Table types. */ - private String[] tableTypes; - /** * Default constructor is used for deserialization. */ @@ -45,14 +42,12 @@ public class JdbcMetaTablesRequest extends JdbcRequest { /** * @param schemaName Schema search pattern. * @param tblName Table search pattern. - * @param tableTypes Table types. */ - public JdbcMetaTablesRequest(String schemaName, String tblName, String[] tableTypes) { + public JdbcMetaTablesRequest(String schemaName, String tblName) { super(META_TABLES); this.schemaName = schemaName; this.tblName = tblName; - this.tableTypes = tableTypes; } /** @@ -69,20 +64,12 @@ public String tableName() { return tblName; } - /** - * @return Table types. - */ - public String[] tableTypes() { - return tableTypes; - } - /** {@inheritDoc} */ @Override public void writeBinary(BinaryWriterExImpl writer) throws BinaryObjectException { super.writeBinary(writer); writer.writeString(schemaName); writer.writeString(tblName); - writer.writeStringArray(tableTypes); } /** {@inheritDoc} */ @@ -91,7 +78,6 @@ public String[] tableTypes() { this.schemaName = reader.readString(); this.tblName = reader.readString(); - this.tableTypes = reader.readStringArray(); } /** {@inheritDoc} */ diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaTablesResult.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaTablesResult.java index c4f9d013c6743..585667ef4cf2f 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaTablesResult.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcMetaTablesResult.java @@ -24,6 +24,7 @@ import org.apache.ignite.internal.binary.BinaryReaderExImpl; import org.apache.ignite.internal.binary.BinaryWriterExImpl; import org.apache.ignite.internal.util.typedef.F; +import org.apache.ignite.internal.util.typedef.internal.S; /** * JDBC tables metadata result. @@ -88,4 +89,9 @@ public class JdbcMetaTablesResult extends JdbcResult { public List meta() { return meta; } + + /** {@inheritDoc} */ + @Override public String toString() { + return S.toString(JdbcMetaTablesResult.class, this); + } } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcParameterMeta.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcParameterMeta.java index bfc721c69934d..dd3b18b67c3c1 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcParameterMeta.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcParameterMeta.java @@ -22,6 +22,7 @@ import org.apache.ignite.binary.BinaryObjectException; import org.apache.ignite.internal.binary.BinaryReaderExImpl; import org.apache.ignite.internal.binary.BinaryWriterExImpl; +import org.apache.ignite.internal.util.typedef.internal.S; /** * JDBC SQL query parameter metadata. @@ -156,4 +157,9 @@ public int mode() { typeClass = reader.readString(); mode = reader.readInt(); } + + /** {@inheritDoc} */ + @Override public String toString() { + return S.toString(JdbcParameterMeta.class, this); + } } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcPrimaryKeyMeta.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcPrimaryKeyMeta.java index ab187a4059c73..9559c1e59906e 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcPrimaryKeyMeta.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcPrimaryKeyMeta.java @@ -17,6 +17,7 @@ package org.apache.ignite.internal.processors.odbc.jdbc; +import java.util.List; import org.apache.ignite.binary.BinaryObjectException; import org.apache.ignite.internal.binary.BinaryReaderExImpl; import org.apache.ignite.internal.binary.BinaryWriterExImpl; @@ -36,7 +37,7 @@ public class JdbcPrimaryKeyMeta implements JdbcRawBinarylizable { private String name; /** Primary key fields. */ - private String[] fields; + private List fields; /** * Default constructor is used for binary serialization. @@ -51,7 +52,7 @@ public class JdbcPrimaryKeyMeta implements JdbcRawBinarylizable { * @param name Name. * @param fields Primary key fields. */ - JdbcPrimaryKeyMeta(String schemaName, String tblName, String name, String [] fields) { + JdbcPrimaryKeyMeta(String schemaName, String tblName, String name, List fields) { this.schemaName = schemaName; this.tblName = tblName; this.name = name; @@ -82,7 +83,7 @@ public String name() { /** * @return Key fields. */ - public String[] fields() { + public List fields() { return fields; } @@ -92,7 +93,8 @@ public String[] fields() { writer.writeString(schemaName); writer.writeString(tblName); writer.writeString(name); - writer.writeStringArray(fields); + + JdbcUtils.writeStringCollection(writer, fields); } /** {@inheritDoc} */ @@ -100,7 +102,8 @@ public String[] fields() { schemaName = reader.readString(); tblName = reader.readString(); name = reader.readString(); - fields = reader.readStringArray(); + + fields = JdbcUtils.readStringList(reader); } /** {@inheritDoc} */ diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcQueryExecuteResult.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcQueryExecuteResult.java index dc681b707e30b..fdebdb8c3c450 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcQueryExecuteResult.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcQueryExecuteResult.java @@ -21,6 +21,7 @@ import org.apache.ignite.binary.BinaryObjectException; import org.apache.ignite.internal.binary.BinaryReaderExImpl; import org.apache.ignite.internal.binary.BinaryWriterExImpl; +import org.apache.ignite.internal.util.typedef.internal.S; /** * JDBC query execute result. @@ -147,4 +148,9 @@ public long updateCount() { updateCnt = reader.readLong(); } } + + /** {@inheritDoc} */ + @Override public String toString() { + return S.toString(JdbcQueryExecuteResult.class, this); + } } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcQueryFetchResult.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcQueryFetchResult.java index c941940a5aae5..ac4a6035e6ab6 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcQueryFetchResult.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcQueryFetchResult.java @@ -21,6 +21,7 @@ import org.apache.ignite.binary.BinaryObjectException; import org.apache.ignite.internal.binary.BinaryReaderExImpl; import org.apache.ignite.internal.binary.BinaryWriterExImpl; +import org.apache.ignite.internal.util.typedef.internal.S; /** * JDBC query fetch result. @@ -81,4 +82,9 @@ public boolean last() { items = JdbcUtils.readItems(reader); } + + /** {@inheritDoc} */ + @Override public String toString() { + return S.toString(JdbcQueryFetchResult.class, this); + } } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcQueryMetadataResult.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcQueryMetadataResult.java index d7c3ce199bbcf..c8c0991e344bb 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcQueryMetadataResult.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcQueryMetadataResult.java @@ -24,6 +24,7 @@ import org.apache.ignite.internal.binary.BinaryReaderExImpl; import org.apache.ignite.internal.binary.BinaryWriterExImpl; import org.apache.ignite.internal.util.typedef.F; +import org.apache.ignite.internal.util.typedef.internal.S; /** * JDBC query metadata result. @@ -90,4 +91,9 @@ public List meta() { } } } + + /** {@inheritDoc} */ + @Override public String toString() { + return S.toString(JdbcQueryMetadataResult.class, this); + } } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcRequestHandler.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcRequestHandler.java index 970a083eb8d0b..b0bec8b627caa 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcRequestHandler.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcRequestHandler.java @@ -185,7 +185,10 @@ public JdbcRequestHandler(GridKernalContext ctx, GridSpinBusyLock busyLock, int } /** {@inheritDoc} */ - @Override public void handshakeAdditionalResponse(BinaryWriterExImpl writer) { + @Override public void writeHandshake(BinaryWriterExImpl writer) { + // Handshake OK. + writer.writeBoolean(true); + // Write server version. writer.writeByte(IgniteVersionUtils.VER.major()); writer.writeByte(IgniteVersionUtils.VER.minor()); @@ -420,23 +423,6 @@ private SqlListenerResponse executeBatch(JdbcBatchExecuteRequest req) { */ private JdbcResponse getTablesMeta(JdbcMetaTablesRequest req) { try { - boolean tblTypeMatch = false; - - if (req.tableTypes() == null) - tblTypeMatch = true; - else { - for (String type : req.tableTypes()) { - if (matches("TABLE", type)) { - tblTypeMatch = true; - - break; - } - } - } - - if (!tblTypeMatch) - return new JdbcResponse(new JdbcMetaTablesResult(Collections.emptyList())); - List meta = new ArrayList<>(); for (String cacheName : ctx.cache().publicCacheNames()) { @@ -587,16 +573,17 @@ private SqlListenerResponse getPrimaryKeys(JdbcMetaPrimaryKeysRequest req) { fields.add(field); } - final String keyName = table.keyFieldName() == null ? "_KEY" : table.keyFieldName(); + + final String keyName = table.keyFieldName() == null ? + "PK_" + table.schemaName() + "_" + table.tableName() : + table.keyFieldName(); if (fields.isEmpty()) { meta.add(new JdbcPrimaryKeyMeta(table.schemaName(), table.tableName(), keyName, - new String[] {keyName})); - } - else { - meta.add(new JdbcPrimaryKeyMeta(table.schemaName(), table.tableName(), keyName, - fields.toArray(new String[fields.size()]))); + Collections.singletonList("_KEY"))); } + else + meta.add(new JdbcPrimaryKeyMeta(table.schemaName(), table.tableName(), keyName, fields)); } } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcTableMeta.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcTableMeta.java index 4e453074a0735..8642b74f4d73b 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcTableMeta.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcTableMeta.java @@ -20,6 +20,7 @@ import org.apache.ignite.binary.BinaryObjectException; import org.apache.ignite.internal.binary.BinaryReaderExImpl; import org.apache.ignite.internal.binary.BinaryWriterExImpl; +import org.apache.ignite.internal.util.typedef.internal.S; /** * JDBC table metadata. @@ -31,9 +32,6 @@ public class JdbcTableMeta implements JdbcRawBinarylizable { /** Table name. */ private String tblName; - /** Table type. */ - private String tblType; - /** * Default constructor is used for deserialization. */ @@ -48,7 +46,6 @@ public class JdbcTableMeta implements JdbcRawBinarylizable { JdbcTableMeta(String schemaName, String tblName, String tblType) { this.schemaName = schemaName; this.tblName = tblName; - this.tblType = tblType; } /** @@ -65,24 +62,20 @@ public String tableName() { return tblName; } - /** - * @return Table type. - */ - public String tableType() { - return tblType; - } - /** {@inheritDoc} */ @Override public void writeBinary(BinaryWriterExImpl writer) throws BinaryObjectException { writer.writeString(schemaName); writer.writeString(tblName); - writer.writeString(tblType); } /** {@inheritDoc} */ @Override public void readBinary(BinaryReaderExImpl reader) throws BinaryObjectException { schemaName = reader.readString(); tblName = reader.readString(); - tblType = reader.readString(); + } + + /** {@inheritDoc} */ + @Override public String toString() { + return S.toString(JdbcTableMeta.class, this); } } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcUtils.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcUtils.java index 65efbf5300090..d556419efbb8c 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcUtils.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcUtils.java @@ -18,6 +18,7 @@ package org.apache.ignite.internal.processors.odbc.jdbc; import java.util.ArrayList; +import java.util.Collection; import java.util.Collections; import java.util.List; import org.apache.ignite.internal.binary.BinaryReaderExImpl; @@ -29,7 +30,7 @@ */ public class JdbcUtils { /** - * @param writer Binari writer. + * @param writer Binary writer. * @param items Query results items. */ public static void writeItems(BinaryWriterExImpl writer, List> items) { @@ -70,4 +71,38 @@ public static List> readItems(BinaryReaderExImpl reader) { } else return Collections.emptyList(); } + + /** + * @param writer Binary writer. + * @param lst List to write. + */ + public static void writeStringCollection(BinaryWriterExImpl writer, Collection lst) { + if (lst == null) + writer.writeInt(0); + else { + writer.writeInt(lst.size()); + + for (String s : lst) + writer.writeString(s); + } + } + + /** + * @param reader Binary reader. + * @return List of string. + */ + public static List readStringList(BinaryReaderExImpl reader) { + int size = reader.readInt(); + + if (size > 0) { + List lst = new ArrayList<>(size); + + for (int i = 0; i < size; ++i) + lst.add(reader.readString()); + + return lst; + } + else + return Collections.emptyList(); + } } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/odbc/OdbcRequestHandler.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/odbc/OdbcRequestHandler.java index 3d575334273d4..692043c1abbf0 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/odbc/OdbcRequestHandler.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/odbc/OdbcRequestHandler.java @@ -158,8 +158,8 @@ public OdbcRequestHandler(GridKernalContext ctx, GridSpinBusyLock busyLock, int } /** {@inheritDoc} */ - @Override public void handshakeAdditionalResponse(BinaryWriterExImpl writer) { - // No-op. + @Override public void writeHandshake(BinaryWriterExImpl writer) { + writer.writeBoolean(true); } /** From 84809c2c6db5f828a9aa2ab634c54cbc7564541f Mon Sep 17 00:00:00 2001 From: tledkov-gridgain Date: Thu, 17 Aug 2017 12:05:38 +0300 Subject: [PATCH 31/32] IGNITE-5233: minors --- .../ignite/internal/jdbc/thin/JdbcThinConnection.java | 2 +- .../ignite/internal/jdbc/thin/JdbcThinResultSet.java | 8 +++++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinConnection.java b/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinConnection.java index e0b9ca7a835e6..8836cd51e5e9b 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinConnection.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinConnection.java @@ -91,7 +91,7 @@ public class JdbcThinConnection implements Connection { /** Ignite endpoint. */ private JdbcThinTcpIo cliIo; - /** Metadata. */ + /** Jdbc metadata. Cache the JDBC object on the first access */ private JdbcThinDatabaseMetadata metadata; /** diff --git a/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinResultSet.java b/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinResultSet.java index d28aa98b4541c..c4be5bcf6caa2 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinResultSet.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinResultSet.java @@ -100,6 +100,9 @@ public class JdbcThinResultSet implements ResultSet { /** Update count. */ private long updCnt; + /** Jdbc metadata. Cache the JDBC object on the first access */ + private JdbcThinResultSetMetadata jdbcMeta; + /** * Constructs static result set. * @@ -522,7 +525,10 @@ else if (val.getClass() == java.util.Date.class) @Override public ResultSetMetaData getMetaData() throws SQLException { ensureNotClosed(); - return new JdbcThinResultSetMetadata(meta()); + if (jdbcMeta == null) + jdbcMeta = new JdbcThinResultSetMetadata(meta()); + + return jdbcMeta; } /** {@inheritDoc} */ From e1b59990fa04a187b672d82a3fc918a87acca9cc Mon Sep 17 00:00:00 2001 From: devozerov Date: Thu, 17 Aug 2017 13:38:49 +0300 Subject: [PATCH 32/32] Minors. --- .../internal/jdbc/thin/JdbcThinDatabaseMetadata.java | 11 +++++++---- .../internal/jdbc/thin/JdbcThinParameterMetadata.java | 3 +++ .../ignite/internal/jdbc/thin/JdbcThinTcpIo.java | 2 ++ 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinDatabaseMetadata.java b/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinDatabaseMetadata.java index fc579c011392e..583bcec53148d 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinDatabaseMetadata.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinDatabaseMetadata.java @@ -780,15 +780,17 @@ private List tableRow(JdbcTableMeta tblMeta) { } /** {@inheritDoc} */ + @SuppressWarnings("ArraysAsListWithZeroOrOneArgument") @Override public ResultSet getCatalogs() throws SQLException { - return new JdbcThinResultSet(Collections.>emptyList(), Arrays.asList( - new JdbcColumnMeta(null, null, "TABLE_CAT", String.class))); + return new JdbcThinResultSet(Collections.>emptyList(), + Arrays.asList(new JdbcColumnMeta(null, null, "TABLE_CAT", String.class))); } /** {@inheritDoc} */ + @SuppressWarnings("ArraysAsListWithZeroOrOneArgument") @Override public ResultSet getTableTypes() throws SQLException { - return new JdbcThinResultSet(Collections.singletonList(Collections.singletonList("TABLE")), Arrays.asList( - new JdbcColumnMeta(null, null, "TABLE_TYPE", String.class))); + return new JdbcThinResultSet(Collections.singletonList(Collections.singletonList("TABLE")), + Arrays.asList(new JdbcColumnMeta(null, null, "TABLE_TYPE", String.class))); } /** {@inheritDoc} */ @@ -1537,6 +1539,7 @@ private List> indexRows(JdbcIndexMeta idxMeta) { } /** {@inheritDoc} */ + @SuppressWarnings("unchecked") @Override public T unwrap(Class iface) throws SQLException { if (!isWrapperFor(iface)) throw new SQLException("Database meta data is not a wrapper for " + iface.getName()); diff --git a/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinParameterMetadata.java b/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinParameterMetadata.java index a0b62b0ffb27a..8647258f88867 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinParameterMetadata.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinParameterMetadata.java @@ -44,6 +44,7 @@ public JdbcThinParameterMetadata(List meta) { } /** {@inheritDoc} */ + @SuppressWarnings("MagicConstant") @Override public int isNullable(int param) throws SQLException { return parameter(param).isNullable(); } @@ -79,11 +80,13 @@ public JdbcThinParameterMetadata(List meta) { } /** {@inheritDoc} */ + @SuppressWarnings("MagicConstant") @Override public int getParameterMode(int param) throws SQLException { return parameter(param).mode(); } /** {@inheritDoc} */ + @SuppressWarnings("unchecked") @Override public T unwrap(Class iface) throws SQLException { if (!isWrapperFor(iface)) throw new SQLException("Parameters metadata is not a wrapper for " + iface.getName()); diff --git a/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinTcpIo.java b/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinTcpIo.java index 55ea82f42b193..e124921d0b5a3 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinTcpIo.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinTcpIo.java @@ -222,7 +222,9 @@ public void handshake() throws IOException, IgniteCheckedException { byte maj = reader.readByte(); byte min = reader.readByte(); byte maintenance = reader.readByte(); + String stage = reader.readString(); + long ts = reader.readLong(); byte[] hash = reader.readByteArray();