You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by vo...@apache.org on 2016/01/27 11:39:36 UTC
[03/28] ignite git commit: IGNITE-2447: Renamed ODBC classes to
follow naming convention.
IGNITE-2447: Renamed ODBC classes to follow naming convention.
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/9baf2668
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/9baf2668
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/9baf2668
Branch: refs/heads/ignite-1786
Commit: 9baf2668e00ed879e7f777d0b21d58aa81c900c3
Parents: a622561
Author: isapego <is...@gridgain.com>
Authored: Mon Jan 25 18:17:07 2016 +0300
Committer: isapego <is...@gridgain.com>
Committed: Mon Jan 25 18:17:07 2016 +0300
----------------------------------------------------------------------
.../ignite/internal/GridKernalContext.java | 4 +-
.../ignite/internal/GridKernalContextImpl.java | 10 +-
.../apache/ignite/internal/IgniteKernal.java | 4 +-
.../processors/odbc/GridOdbcColumnMeta.java | 125 -------
.../processors/odbc/GridOdbcCommandHandler.java | 337 ------------------
.../processors/odbc/GridOdbcProcessor.java | 160 ---------
.../odbc/GridOdbcProtocolHandler.java | 40 ---
.../processors/odbc/GridOdbcTableMeta.java | 89 -----
.../processors/odbc/OdbcColumnMeta.java | 125 +++++++
.../processors/odbc/OdbcCommandHandler.java | 337 ++++++++++++++++++
.../internal/processors/odbc/OdbcProcessor.java | 160 +++++++++
.../processors/odbc/OdbcProtocolHandler.java | 40 +++
.../internal/processors/odbc/OdbcTableMeta.java | 89 +++++
.../odbc/protocol/GridOdbcParser.java | 345 -------------------
.../odbc/protocol/GridTcpOdbcNioListener.java | 102 ------
.../odbc/protocol/GridTcpOdbcServer.java | 191 ----------
.../processors/odbc/protocol/OdbcParser.java | 345 +++++++++++++++++++
.../odbc/protocol/OdbcTcpNioListener.java | 102 ++++++
.../processors/odbc/protocol/OdbcTcpServer.java | 191 ++++++++++
.../odbc/request/GridOdbcRequest.java | 61 ----
.../odbc/request/OdbcQueryCloseRequest.java | 47 +++
.../odbc/request/OdbcQueryExecuteRequest.java | 85 +++++
.../odbc/request/OdbcQueryFetchRequest.java | 66 ++++
.../request/OdbcQueryGetColumnsMetaRequest.java | 84 +++++
.../request/OdbcQueryGetTablesMetaRequest.java | 105 ++++++
.../processors/odbc/request/OdbcRequest.java | 61 ++++
.../odbc/request/QueryCloseRequest.java | 47 ---
.../odbc/request/QueryExecuteRequest.java | 85 -----
.../odbc/request/QueryFetchRequest.java | 66 ----
.../request/QueryGetColumnsMetaRequest.java | 84 -----
.../odbc/request/QueryGetTablesMetaRequest.java | 105 ------
.../odbc/response/GridOdbcResponse.java | 107 ------
.../odbc/response/OdbcQueryCloseResult.java | 39 +++
.../odbc/response/OdbcQueryExecuteResult.java | 55 +++
.../odbc/response/OdbcQueryFetchResult.java | 75 ++++
.../response/OdbcQueryGetColumnsMetaResult.java | 43 +++
.../response/OdbcQueryGetTablesMetaResult.java | 43 +++
.../processors/odbc/response/OdbcResponse.java | 107 ++++++
.../odbc/response/QueryCloseResult.java | 39 ---
.../odbc/response/QueryExecuteResult.java | 55 ---
.../odbc/response/QueryFetchResult.java | 75 ----
.../response/QueryGetColumnsMetaResult.java | 43 ---
.../odbc/response/QueryGetTablesMetaResult.java | 43 ---
43 files changed, 2208 insertions(+), 2208 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ignite/blob/9baf2668/modules/core/src/main/java/org/apache/ignite/internal/GridKernalContext.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/GridKernalContext.java b/modules/core/src/main/java/org/apache/ignite/internal/GridKernalContext.java
index e563478..b95d595 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/GridKernalContext.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/GridKernalContext.java
@@ -48,7 +48,7 @@ import org.apache.ignite.internal.processors.igfs.IgfsHelper;
import org.apache.ignite.internal.processors.igfs.IgfsProcessorAdapter;
import org.apache.ignite.internal.processors.job.GridJobProcessor;
import org.apache.ignite.internal.processors.jobmetrics.GridJobMetricsProcessor;
-import org.apache.ignite.internal.processors.odbc.GridOdbcProcessor;
+import org.apache.ignite.internal.processors.odbc.OdbcProcessor;
import org.apache.ignite.internal.processors.offheap.GridOffHeapProcessor;
import org.apache.ignite.internal.processors.platform.PlatformProcessor;
import org.apache.ignite.internal.processors.plugin.IgnitePluginProcessor;
@@ -316,7 +316,7 @@ public interface GridKernalContext extends Iterable<GridComponent> {
*
* @return ODBC processor.
*/
- public GridOdbcProcessor odbc();
+ public OdbcProcessor odbc();
/**
* @return Plugin processor.
http://git-wip-us.apache.org/repos/asf/ignite/blob/9baf2668/modules/core/src/main/java/org/apache/ignite/internal/GridKernalContextImpl.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/GridKernalContextImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/GridKernalContextImpl.java
index 81088b4..753dbe8 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/GridKernalContextImpl.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/GridKernalContextImpl.java
@@ -65,7 +65,7 @@ import org.apache.ignite.internal.processors.igfs.IgfsProcessorAdapter;
import org.apache.ignite.internal.processors.job.GridJobProcessor;
import org.apache.ignite.internal.processors.jobmetrics.GridJobMetricsProcessor;
import org.apache.ignite.internal.processors.nodevalidation.DiscoveryNodeValidationProcessor;
-import org.apache.ignite.internal.processors.odbc.GridOdbcProcessor;
+import org.apache.ignite.internal.processors.odbc.OdbcProcessor;
import org.apache.ignite.internal.processors.offheap.GridOffHeapProcessor;
import org.apache.ignite.internal.processors.platform.PlatformProcessor;
import org.apache.ignite.internal.processors.plugin.IgnitePluginProcessor;
@@ -161,7 +161,7 @@ public class GridKernalContextImpl implements GridKernalContext, Externalizable
/** */
@GridToStringInclude
- private GridOdbcProcessor odbcProc;
+ private OdbcProcessor odbcProc;
/** */
@GridToStringInclude
@@ -511,8 +511,8 @@ public class GridKernalContextImpl implements GridKernalContext, Externalizable
pluginProc = (IgnitePluginProcessor)comp;
else if (comp instanceof GridQueryProcessor)
qryProc = (GridQueryProcessor)comp;
- else if (comp instanceof GridOdbcProcessor)
- odbcProc = (GridOdbcProcessor)comp;
+ else if (comp instanceof OdbcProcessor)
+ odbcProc = (OdbcProcessor)comp;
else if (comp instanceof DataStructuresProcessor)
dataStructuresProc = (DataStructuresProcessor)comp;
else if (comp instanceof ClusterProcessor)
@@ -756,7 +756,7 @@ public class GridKernalContextImpl implements GridKernalContext, Externalizable
}
/** {@inheritDoc} */
- @Override public GridOdbcProcessor odbc() {
+ @Override public OdbcProcessor odbc() {
return odbcProc;
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/9baf2668/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java b/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java
index 22afe01..cd27995 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java
@@ -117,7 +117,7 @@ import org.apache.ignite.internal.processors.job.GridJobProcessor;
import org.apache.ignite.internal.processors.jobmetrics.GridJobMetricsProcessor;
import org.apache.ignite.internal.processors.nodevalidation.DiscoveryNodeValidationProcessor;
import org.apache.ignite.internal.processors.nodevalidation.OsDiscoveryNodeValidationProcessor;
-import org.apache.ignite.internal.processors.odbc.GridOdbcProcessor;
+import org.apache.ignite.internal.processors.odbc.OdbcProcessor;
import org.apache.ignite.internal.processors.offheap.GridOffHeapProcessor;
import org.apache.ignite.internal.processors.platform.PlatformNoopProcessor;
import org.apache.ignite.internal.processors.platform.PlatformProcessor;
@@ -850,7 +850,7 @@ public class IgniteKernal implements IgniteEx, IgniteMXBean, Externalizable {
startProcessor(createComponent(IgniteCacheObjectProcessor.class, ctx));
startProcessor(new GridCacheProcessor(ctx));
startProcessor(new GridQueryProcessor(ctx));
- startProcessor(new GridOdbcProcessor(ctx));
+ startProcessor(new OdbcProcessor(ctx));
startProcessor(new GridTaskSessionProcessor(ctx));
startProcessor(new GridJobProcessor(ctx));
startProcessor(new GridTaskProcessor(ctx));
http://git-wip-us.apache.org/repos/asf/ignite/blob/9baf2668/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/GridOdbcColumnMeta.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/GridOdbcColumnMeta.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/GridOdbcColumnMeta.java
deleted file mode 100644
index 03a5dd8..0000000
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/GridOdbcColumnMeta.java
+++ /dev/null
@@ -1,125 +0,0 @@
-/*
- * 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;
-
-import org.apache.ignite.internal.binary.BinaryClassDescriptor;
-import org.apache.ignite.internal.binary.BinaryContext;
-import org.apache.ignite.internal.binary.BinaryRawWriterEx;
-import org.apache.ignite.internal.processors.query.GridQueryFieldMetadata;
-
-import java.io.IOException;
-
-import static org.apache.ignite.internal.binary.GridBinaryMarshaller.UNREGISTERED_TYPE_ID;
-
-/**
- * ODBC column-related metadata.
- */
-public class GridOdbcColumnMeta {
- /** Cache name. */
- private String schemaName;
-
- /** Table name. */
- private String tableName;
-
- /** Column name. */
- private String columnName;
-
- /** Data type. */
- private Class<?> dataType;
-
- /**
- * Add quotation marks at the beginning and end of the string.
- * @param str Input string.
- * @return String surrounded with quotation marks.
- */
- private String AddQuotationMarksIfNeeded(String str) {
- if (!str.startsWith("\"") && !str.isEmpty())
- return "\"" + str + "\"";
-
- return str;
- }
-
- /**
- * @param schemaName Cache name.
- * @param tableName Table name.
- * @param columnName Column name.
- * @param dataType Data type.
- */
- public GridOdbcColumnMeta(String schemaName, String tableName, String columnName, Class<?> dataType) {
- this.schemaName = AddQuotationMarksIfNeeded(schemaName);
- this.tableName = tableName;
- this.columnName = columnName;
- this.dataType = dataType;
- }
-
- /**
- * @param info Field metadata.
- */
- public GridOdbcColumnMeta(GridQueryFieldMetadata info) {
- this.schemaName = AddQuotationMarksIfNeeded(info.schemaName());
- this.tableName = info.typeName();
- this.columnName = info.fieldName();
-
- try {
- this.dataType = Class.forName(info.fieldTypeName());
- }
- catch (Exception ignored) {
- this.dataType = Object.class;
- }
- }
-
- @Override
- public boolean equals(Object o)
- {
- if (!(o instanceof GridOdbcColumnMeta))
- return false;
-
- GridOdbcColumnMeta another = (GridOdbcColumnMeta)o;
-
- return schemaName.equals(another.schemaName) &&
- tableName.equals(another.tableName) &&
- columnName.equals(another.columnName) &&
- dataType.equals(another.dataType);
- }
-
- /**
- * Write in a binary format.
- * @param writer Binary writer.
- * @param ctx Portable context.
- * @throws IOException
- */
- public void writeBinary(BinaryRawWriterEx writer, BinaryContext ctx) throws IOException {
- writer.writeString(schemaName);
- writer.writeString(tableName);
- writer.writeString(columnName);
- writer.writeString(dataType.getName());
-
- byte typeId;
-
- BinaryClassDescriptor desc = ctx.descriptorForClass(dataType, false);
-
- if (desc == null)
- throw new IOException("Object is not portable: [class=" + dataType + ']');
-
- if (desc.registered())
- typeId = (byte)desc.typeId();
- else
- typeId = (byte)UNREGISTERED_TYPE_ID;
-
- writer.writeByte(typeId);
- }
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/9baf2668/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/GridOdbcCommandHandler.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/GridOdbcCommandHandler.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/GridOdbcCommandHandler.java
deleted file mode 100644
index 2b19880..0000000
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/GridOdbcCommandHandler.java
+++ /dev/null
@@ -1,337 +0,0 @@
-/*
- * 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;
-
-import org.apache.ignite.IgniteCache;
-import org.apache.ignite.IgniteLogger;
-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.processors.cache.QueryCursorImpl;
-import org.apache.ignite.internal.processors.odbc.request.*;
-import org.apache.ignite.internal.processors.odbc.response.*;
-import org.apache.ignite.internal.processors.query.GridQueryFieldMetadata;
-import org.apache.ignite.internal.processors.query.GridQueryTypeDescriptor;
-import org.apache.ignite.lang.IgniteBiTuple;
-
-import java.util.*;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.atomic.AtomicLong;
-
-import static org.apache.ignite.internal.processors.odbc.request.GridOdbcRequest.*;
-
-/**
- * SQL query handler.
- */
-public class GridOdbcCommandHandler {
- /** Kernal context. */
- protected final GridKernalContext ctx;
-
- /** Log. */
- protected final IgniteLogger log;
-
- /** Query ID sequence. */
- private static final AtomicLong qryIdGen = new AtomicLong();
-
- /** Current queries cursors. */
- private final ConcurrentHashMap<Long, IgniteBiTuple<QueryCursor, Iterator>> qryCurs = new ConcurrentHashMap<>();
-
- /**
- * @param ctx Context.
- */
- public GridOdbcCommandHandler(GridKernalContext ctx) {
- this.ctx = ctx;
-
- log = ctx.log(getClass());
- }
-
- /**
- * @param req Request.
- * @return Response.
- */
- public GridOdbcResponse handle(GridOdbcRequest req) {
- assert req != null;
-
- switch (req.command()) {
- case EXECUTE_SQL_QUERY: {
- return executeQuery((QueryExecuteRequest)req, qryCurs);
- }
-
- case FETCH_SQL_QUERY: {
- return fetchQuery((QueryFetchRequest)req, qryCurs);
- }
-
- case CLOSE_SQL_QUERY: {
- return closeQuery((QueryCloseRequest)req, qryCurs);
- }
-
- case GET_COLUMNS_META: {
- return getColumnsMeta((QueryGetColumnsMetaRequest) req);
- }
-
- case GET_TABLES_META: {
- return getTablesMeta((QueryGetTablesMetaRequest) req);
- }
- }
-
- return null;
- }
-
- /**
- * @param qryCurs Query cursors.
- * @param cur Current cursor.
- * @param req Sql fetch request.
- * @param qryId Query id.
- * @return Query result with items.
- */
- private static QueryFetchResult createQueryResult(
- ConcurrentHashMap<Long, IgniteBiTuple<QueryCursor, Iterator>> qryCurs,
- Iterator cur, QueryFetchRequest req, Long qryId) {
- QueryFetchResult res = new QueryFetchResult(qryId);
-
- List<Object> items = new ArrayList<>();
-
- for (int i = 0; i < req.pageSize() && cur.hasNext(); ++i)
- items.add(cur.next());
-
- res.setItems(items);
-
- res.setLast(!cur.hasNext());
-
- return res;
- }
-
- /**
- * @param meta Internal query field metadata.
- * @return Rest query field metadata.
- */
- private static Collection<GridOdbcColumnMeta> convertMetadata(Collection<GridQueryFieldMetadata> meta) {
- List<GridOdbcColumnMeta> res = new ArrayList<>();
-
- if (meta != null) {
- for (GridQueryFieldMetadata info : meta)
- res.add(new GridOdbcColumnMeta(info));
- }
-
- return res;
- }
-
- /**
- * 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 || ptrn.isEmpty() ||
- str.toUpperCase().matches(ptrn.toUpperCase().replace("%", ".*").replace("_", ".")));
- }
-
- /**
- * Remove quotation marks at the beginning and end of the string if present.
- * @param str Input string.
- * @return String without leading and trailing quotation marks.
- */
- private String RemoveQuotationMarksIfNeeded(String str) {
- if (str.startsWith("\"") && str.endsWith("\""))
- return str.substring(1, str.length() - 1);
-
- return str;
- }
-
- /**
- * @param req Execute query request.
- * @param qryCurs Queries cursors.
- * @return Response.
- */
- private GridOdbcResponse executeQuery(QueryExecuteRequest req,
- ConcurrentHashMap<Long, IgniteBiTuple<QueryCursor, Iterator>> qryCurs) {
- long qryId = qryIdGen.getAndIncrement();
-
- try {
- SqlFieldsQuery qry = new SqlFieldsQuery(req.sqlQuery());
-
- qry.setArgs(req.arguments());
-
- IgniteCache<Object, Object> cache = ctx.grid().cache(req.cacheName());
-
- if (cache == null)
- return new GridOdbcResponse(GridOdbcResponse.STATUS_FAILED,
- "Failed to find cache with name: " + req.cacheName());
-
- QueryCursor qryCur = cache.query(qry);
-
- Iterator cur = qryCur.iterator();
-
- qryCurs.put(qryId, new IgniteBiTuple<>(qryCur, cur));
-
- List<GridQueryFieldMetadata> fieldsMeta = ((QueryCursorImpl) qryCur).fieldsMeta();
-
- System.out.println("Field meta: " + fieldsMeta);
-
- QueryExecuteResult res = new QueryExecuteResult(qryId, convertMetadata(fieldsMeta));
-
- return new GridOdbcResponse(res);
- }
- catch (Exception e) {
- qryCurs.remove(qryId);
-
- return new GridOdbcResponse(GridOdbcResponse.STATUS_FAILED, e.getMessage());
- }
- }
-
- /**
- * @param req Execute query request.
- * @param qryCurs Queries cursors.
- * @return Response.
- */
- private GridOdbcResponse closeQuery(QueryCloseRequest req,
- ConcurrentHashMap<Long, IgniteBiTuple<QueryCursor, Iterator>> qryCurs) {
- try {
- QueryCursor cur = qryCurs.get(req.queryId()).get1();
-
- if (cur == null)
- return new GridOdbcResponse(GridOdbcResponse.STATUS_FAILED,
- "Failed to find query with ID: " + req.queryId());
-
- cur.close();
-
- qryCurs.remove(req.queryId());
-
- QueryCloseResult res = new QueryCloseResult(req.queryId());
-
- return new GridOdbcResponse(res);
- }
- catch (Exception e) {
- qryCurs.remove(req.queryId());
-
- return new GridOdbcResponse(GridOdbcResponse.STATUS_FAILED, e.getMessage());
- }
- }
-
- /**
- * @param req Execute query request.
- * @param qryCurs Queries cursors.
- * @return Response.
- */
- private GridOdbcResponse fetchQuery(QueryFetchRequest req,
- ConcurrentHashMap<Long, IgniteBiTuple<QueryCursor, Iterator>> qryCurs) {
- try {
- Iterator cur = qryCurs.get(req.queryId()).get2();
-
- if (cur == null)
- return new GridOdbcResponse(GridOdbcResponse.STATUS_FAILED,
- "Failed to find query with ID: " + req.queryId());
-
- QueryFetchResult res = createQueryResult(qryCurs, cur, req, req.queryId());
-
- return new GridOdbcResponse(res);
- }
- catch (Exception e) {
- qryCurs.remove(req.queryId());
-
- return new GridOdbcResponse(GridOdbcResponse.STATUS_FAILED, e.getMessage());
- }
- }
-
- /**
- * @param req Get columns metadata request.
- * @return Response.
- */
- private GridOdbcResponse getColumnsMeta(QueryGetColumnsMetaRequest req) {
- try {
- List<GridOdbcColumnMeta> meta = new ArrayList<>();
-
- String cacheName;
- String tableName;
-
- if (req.tableName().contains(".")) {
- // Parsing two-part table name.
- String[] parts = req.tableName().split("\\.");
-
- cacheName = RemoveQuotationMarksIfNeeded(parts[0]);
-
- tableName = parts[1];
- }
- else {
- cacheName = RemoveQuotationMarksIfNeeded(req.cacheName());
-
- tableName = req.tableName();
- }
-
- Collection<GridQueryTypeDescriptor> tablesMeta = ctx.query().types(cacheName);
-
- for (GridQueryTypeDescriptor table : tablesMeta) {
- if (!matches(table.name(), tableName))
- continue;
-
- for (Map.Entry<String, Class<?>> field : table.fields().entrySet()) {
- if (!matches(field.getKey(), req.columnName()))
- continue;
-
- GridOdbcColumnMeta columnMeta = new GridOdbcColumnMeta(req.cacheName(),
- table.name(), field.getKey(), field.getValue());
-
- if (!meta.contains(columnMeta))
- meta.add(columnMeta);
- }
- }
- QueryGetColumnsMetaResult res = new QueryGetColumnsMetaResult(meta);
-
- return new GridOdbcResponse(res);
- }
- catch (Exception e) {
- return new GridOdbcResponse(GridOdbcResponse.STATUS_FAILED, e.getMessage());
- }
- }
-
- /**
- * @param req Get tables metadata request.
- * @return Response.
- */
- private GridOdbcResponse getTablesMeta(QueryGetTablesMetaRequest req) {
- try {
- List<GridOdbcTableMeta> meta = new ArrayList<>();
-
- String realSchema = RemoveQuotationMarksIfNeeded(req.schema());
-
- Collection<GridQueryTypeDescriptor> tablesMeta = ctx.query().types(realSchema);
-
- for (GridQueryTypeDescriptor table : tablesMeta) {
- if (!matches(table.name(), req.table()))
- continue;
-
- if (!matches("TABLE", req.tableType()))
- continue;
-
- GridOdbcTableMeta tableMeta = new GridOdbcTableMeta(req.catalog(), req.schema(),
- table.name(), "TABLE");
-
- if (!meta.contains(tableMeta))
- meta.add(tableMeta);
- }
-
- QueryGetTablesMetaResult res = new QueryGetTablesMetaResult(meta);
-
- return new GridOdbcResponse(res);
- }
- catch (Exception e) {
- return new GridOdbcResponse(GridOdbcResponse.STATUS_FAILED, e.getMessage());
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/9baf2668/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/GridOdbcProcessor.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/GridOdbcProcessor.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/GridOdbcProcessor.java
deleted file mode 100644
index a78b032..0000000
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/GridOdbcProcessor.java
+++ /dev/null
@@ -1,160 +0,0 @@
-/*
- * 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;
-
-import org.apache.ignite.IgniteCheckedException;
-import org.apache.ignite.internal.GridKernalContext;
-import org.apache.ignite.internal.IgniteInternalFuture;
-import org.apache.ignite.internal.binary.BinaryMarshaller;
-import org.apache.ignite.internal.processors.GridProcessorAdapter;
-import org.apache.ignite.internal.processors.odbc.protocol.GridTcpOdbcServer;
-import org.apache.ignite.internal.processors.odbc.request.GridOdbcRequest;
-import org.apache.ignite.internal.processors.odbc.response.GridOdbcResponse;
-import org.apache.ignite.internal.util.GridSpinReadWriteLock;
-import org.apache.ignite.internal.util.future.GridFinishedFuture;
-import org.apache.ignite.marshaller.Marshaller;
-
-/**
- * ODBC processor.
- */
-public class GridOdbcProcessor extends GridProcessorAdapter {
- /** OBCD TCP Server. */
- private GridTcpOdbcServer srv;
-
- /** Busy lock. */
- private final GridSpinReadWriteLock busyLock = new GridSpinReadWriteLock();
-
- /** Command handler. */
- private GridOdbcCommandHandler handler;
-
- /** Protocol handler. */
- private final GridOdbcProtocolHandler protoHnd = new GridOdbcProtocolHandler() {
- @Override public GridOdbcResponse handle(GridOdbcRequest req) throws IgniteCheckedException {
- return handle0(req);
- }
-
- @Override public IgniteInternalFuture<GridOdbcResponse> handleAsync(GridOdbcRequest req) {
- return new GridFinishedFuture<>(
- new IgniteCheckedException("Failed to handle request (asynchronous handling is not implemented)."));
- }
- };
-
- /**
- * @param req Request.
- * @return Response.
- */
- private GridOdbcResponse handle0(final GridOdbcRequest req) throws IgniteCheckedException {
- if (!busyLock.tryReadLock())
- throw new IgniteCheckedException("Failed to handle request (received request while stopping grid).");
-
- GridOdbcResponse rsp = null;
-
- try {
- rsp = handleRequest(req);
- }
- finally {
- busyLock.readUnlock();
- }
-
- return rsp;
- }
-
- /**
- * @param req Request.
- * @return Future.
- */
- private GridOdbcResponse handleRequest(final GridOdbcRequest req) throws IgniteCheckedException {
- if (log.isDebugEnabled())
- log.debug("Received request from client: " + req);
-
- GridOdbcResponse rsp;
-
- try {
- rsp = handler == null ? null : handler.handle(req);
-
- if (rsp == null)
- throw new IgniteCheckedException("Failed to find registered handler for command: " + req.command());
- }
- catch (Exception e) {
- if (log.isDebugEnabled())
- log.debug("Failed to handle request [req=" + req + ", e=" + e + "]");
-
- rsp = new GridOdbcResponse(GridOdbcResponse.STATUS_FAILED, e.getMessage());
- }
-
- return rsp;
- }
-
- /**
- * @param ctx Kernal context.
- */
- public GridOdbcProcessor(GridKernalContext ctx) {
- super(ctx);
-
- srv = new GridTcpOdbcServer(ctx);
- }
-
- /** {@inheritDoc} */
- @Override public void start() throws IgniteCheckedException {
- if (isOdbcEnabled()) {
-
- Marshaller marsh = ctx.config().getMarshaller();
-
- if (marsh != null && !(marsh instanceof BinaryMarshaller))
- throw new IgniteCheckedException("Failed to start processor " +
- "(ODBC may only be used with BinaryMarshaller).");
-
- // Register handler.
- handler = new GridOdbcCommandHandler(ctx);
-
- srv.start(protoHnd);
- }
- }
-
- /** {@inheritDoc} */
- @Override public void stop(boolean cancel) throws IgniteCheckedException {
- if (isOdbcEnabled()) {
- srv.stop();
- }
- }
-
- /** {@inheritDoc} */
- @Override public void onKernalStart() throws IgniteCheckedException {
- if (isOdbcEnabled()) {
-
- if (log.isDebugEnabled())
- log.debug("ODBC processor started.");
- }
- }
-
- /** {@inheritDoc} */
- @Override public void onKernalStop(boolean cancel) {
- if (isOdbcEnabled()) {
- busyLock.writeLock();
-
- if (log.isDebugEnabled())
- log.debug("ODBC processor stopped.");
- }
- }
-
- /**
- * @return Whether or not ODBC is enabled.
- */
- public boolean isOdbcEnabled() {
- return ctx.config().getOdbcConfiguration() != null;
- }
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/9baf2668/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/GridOdbcProtocolHandler.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/GridOdbcProtocolHandler.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/GridOdbcProtocolHandler.java
deleted file mode 100644
index 033f067..0000000
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/GridOdbcProtocolHandler.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * 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;
-
-import org.apache.ignite.IgniteCheckedException;
-import org.apache.ignite.internal.IgniteInternalFuture;
-import org.apache.ignite.internal.processors.odbc.request.GridOdbcRequest;
-import org.apache.ignite.internal.processors.odbc.response.GridOdbcResponse;
-
-/**
- * ODBC command protocol handler.
- */
-public interface GridOdbcProtocolHandler {
- /**
- * @param req Request.
- * @return Response.
- * @throws IgniteCheckedException In case of error.
- */
- public GridOdbcResponse handle(GridOdbcRequest req) throws IgniteCheckedException;
-
- /**
- * @param req Request.
- * @return Future.
- */
- public IgniteInternalFuture<GridOdbcResponse> handleAsync(GridOdbcRequest req);
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/9baf2668/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/GridOdbcTableMeta.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/GridOdbcTableMeta.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/GridOdbcTableMeta.java
deleted file mode 100644
index 1dd11b8..0000000
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/GridOdbcTableMeta.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * 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;
-
-import org.apache.ignite.internal.binary.BinaryRawWriterEx;
-
-import java.io.IOException;
-
-/**
- * ODBC table-related metadata.
- */
-public class GridOdbcTableMeta {
- /** Catalog name. */
- private String catalog;
-
- /** Schema name. */
- private String schema;
-
- /** Table name. */
- private String table;
-
- /** Table type. */
- private String tableType;
-
- /**
- * Add quotation marks at the beginning and end of the string.
- * @param str Input string.
- * @return String surrounded with quotation marks.
- */
- private String AddQuotationMarksIfNeeded(String str) {
- if (!str.startsWith("\"") && !str.isEmpty())
- return "\"" + str + "\"";
-
- return str;
- }
-
- /**
- * @param catalog Catalog name.
- * @param schema Schema name.
- * @param table Table name.
- * @param tableType Table type.
- */
- public GridOdbcTableMeta(String catalog, String schema, String table, String tableType) {
- this.catalog = catalog;
- this.schema = AddQuotationMarksIfNeeded(schema);
- this.table = table;
- this.tableType = tableType;
- }
-
- @Override
- public boolean equals(Object o)
- {
- if (!(o instanceof GridOdbcTableMeta))
- return false;
-
- GridOdbcTableMeta another = (GridOdbcTableMeta)o;
-
- return catalog.equals(another.catalog) &&
- schema.equals(another.schema) &&
- table.equals(another.table) &&
- tableType.equals(another.tableType);
- }
-
- /**
- * Write in a binary format.
- * @param writer Binary writer.
- * @throws IOException
- */
- public void writeBinary(BinaryRawWriterEx writer) throws IOException {
- writer.writeString(catalog);
- writer.writeString(schema);
- writer.writeString(table);
- writer.writeString(tableType);
- }
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/9baf2668/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/OdbcColumnMeta.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/OdbcColumnMeta.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/OdbcColumnMeta.java
new file mode 100644
index 0000000..0c2eed2
--- /dev/null
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/OdbcColumnMeta.java
@@ -0,0 +1,125 @@
+/*
+ * 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;
+
+import org.apache.ignite.internal.binary.BinaryClassDescriptor;
+import org.apache.ignite.internal.binary.BinaryContext;
+import org.apache.ignite.internal.binary.BinaryRawWriterEx;
+import org.apache.ignite.internal.processors.query.GridQueryFieldMetadata;
+
+import java.io.IOException;
+
+import static org.apache.ignite.internal.binary.GridBinaryMarshaller.UNREGISTERED_TYPE_ID;
+
+/**
+ * ODBC column-related metadata.
+ */
+public class OdbcColumnMeta {
+ /** Cache name. */
+ private String schemaName;
+
+ /** Table name. */
+ private String tableName;
+
+ /** Column name. */
+ private String columnName;
+
+ /** Data type. */
+ private Class<?> dataType;
+
+ /**
+ * Add quotation marks at the beginning and end of the string.
+ * @param str Input string.
+ * @return String surrounded with quotation marks.
+ */
+ private String AddQuotationMarksIfNeeded(String str) {
+ if (!str.startsWith("\"") && !str.isEmpty())
+ return "\"" + str + "\"";
+
+ return str;
+ }
+
+ /**
+ * @param schemaName Cache name.
+ * @param tableName Table name.
+ * @param columnName Column name.
+ * @param dataType Data type.
+ */
+ public OdbcColumnMeta(String schemaName, String tableName, String columnName, Class<?> dataType) {
+ this.schemaName = AddQuotationMarksIfNeeded(schemaName);
+ this.tableName = tableName;
+ this.columnName = columnName;
+ this.dataType = dataType;
+ }
+
+ /**
+ * @param info Field metadata.
+ */
+ public OdbcColumnMeta(GridQueryFieldMetadata info) {
+ this.schemaName = AddQuotationMarksIfNeeded(info.schemaName());
+ this.tableName = info.typeName();
+ this.columnName = info.fieldName();
+
+ try {
+ this.dataType = Class.forName(info.fieldTypeName());
+ }
+ catch (Exception ignored) {
+ this.dataType = Object.class;
+ }
+ }
+
+ @Override
+ public boolean equals(Object o)
+ {
+ if (!(o instanceof OdbcColumnMeta))
+ return false;
+
+ OdbcColumnMeta another = (OdbcColumnMeta)o;
+
+ return schemaName.equals(another.schemaName) &&
+ tableName.equals(another.tableName) &&
+ columnName.equals(another.columnName) &&
+ dataType.equals(another.dataType);
+ }
+
+ /**
+ * Write in a binary format.
+ * @param writer Binary writer.
+ * @param ctx Portable context.
+ * @throws IOException
+ */
+ public void writeBinary(BinaryRawWriterEx writer, BinaryContext ctx) throws IOException {
+ writer.writeString(schemaName);
+ writer.writeString(tableName);
+ writer.writeString(columnName);
+ writer.writeString(dataType.getName());
+
+ byte typeId;
+
+ BinaryClassDescriptor desc = ctx.descriptorForClass(dataType, false);
+
+ if (desc == null)
+ throw new IOException("Object is not portable: [class=" + dataType + ']');
+
+ if (desc.registered())
+ typeId = (byte)desc.typeId();
+ else
+ typeId = (byte)UNREGISTERED_TYPE_ID;
+
+ writer.writeByte(typeId);
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/9baf2668/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/OdbcCommandHandler.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/OdbcCommandHandler.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/OdbcCommandHandler.java
new file mode 100644
index 0000000..d8a05f7
--- /dev/null
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/OdbcCommandHandler.java
@@ -0,0 +1,337 @@
+/*
+ * 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;
+
+import org.apache.ignite.IgniteCache;
+import org.apache.ignite.IgniteLogger;
+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.processors.cache.QueryCursorImpl;
+import org.apache.ignite.internal.processors.odbc.request.*;
+import org.apache.ignite.internal.processors.odbc.response.*;
+import org.apache.ignite.internal.processors.query.GridQueryFieldMetadata;
+import org.apache.ignite.internal.processors.query.GridQueryTypeDescriptor;
+import org.apache.ignite.lang.IgniteBiTuple;
+
+import java.util.*;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.atomic.AtomicLong;
+
+import static org.apache.ignite.internal.processors.odbc.request.OdbcRequest.*;
+
+/**
+ * SQL query handler.
+ */
+public class OdbcCommandHandler {
+ /** Kernal context. */
+ protected final GridKernalContext ctx;
+
+ /** Log. */
+ protected final IgniteLogger log;
+
+ /** Query ID sequence. */
+ private static final AtomicLong qryIdGen = new AtomicLong();
+
+ /** Current queries cursors. */
+ private final ConcurrentHashMap<Long, IgniteBiTuple<QueryCursor, Iterator>> qryCurs = new ConcurrentHashMap<>();
+
+ /**
+ * @param ctx Context.
+ */
+ public OdbcCommandHandler(GridKernalContext ctx) {
+ this.ctx = ctx;
+
+ log = ctx.log(getClass());
+ }
+
+ /**
+ * @param req Request.
+ * @return Response.
+ */
+ public OdbcResponse handle(OdbcRequest req) {
+ assert req != null;
+
+ switch (req.command()) {
+ case EXECUTE_SQL_QUERY: {
+ return executeQuery((OdbcQueryExecuteRequest)req, qryCurs);
+ }
+
+ case FETCH_SQL_QUERY: {
+ return fetchQuery((OdbcQueryFetchRequest)req, qryCurs);
+ }
+
+ case CLOSE_SQL_QUERY: {
+ return closeQuery((OdbcQueryCloseRequest)req, qryCurs);
+ }
+
+ case GET_COLUMNS_META: {
+ return getColumnsMeta((OdbcQueryGetColumnsMetaRequest) req);
+ }
+
+ case GET_TABLES_META: {
+ return getTablesMeta((OdbcQueryGetTablesMetaRequest) req);
+ }
+ }
+
+ return null;
+ }
+
+ /**
+ * @param qryCurs Query cursors.
+ * @param cur Current cursor.
+ * @param req Sql fetch request.
+ * @param qryId Query id.
+ * @return Query result with items.
+ */
+ private static OdbcQueryFetchResult createQueryResult(
+ ConcurrentHashMap<Long, IgniteBiTuple<QueryCursor, Iterator>> qryCurs,
+ Iterator cur, OdbcQueryFetchRequest req, Long qryId) {
+ OdbcQueryFetchResult res = new OdbcQueryFetchResult(qryId);
+
+ List<Object> items = new ArrayList<>();
+
+ for (int i = 0; i < req.pageSize() && cur.hasNext(); ++i)
+ items.add(cur.next());
+
+ res.setItems(items);
+
+ res.setLast(!cur.hasNext());
+
+ return res;
+ }
+
+ /**
+ * @param meta Internal query field metadata.
+ * @return Rest query field metadata.
+ */
+ private static Collection<OdbcColumnMeta> convertMetadata(Collection<GridQueryFieldMetadata> meta) {
+ List<OdbcColumnMeta> res = new ArrayList<>();
+
+ if (meta != null) {
+ for (GridQueryFieldMetadata info : meta)
+ res.add(new OdbcColumnMeta(info));
+ }
+
+ return res;
+ }
+
+ /**
+ * 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 || ptrn.isEmpty() ||
+ str.toUpperCase().matches(ptrn.toUpperCase().replace("%", ".*").replace("_", ".")));
+ }
+
+ /**
+ * Remove quotation marks at the beginning and end of the string if present.
+ * @param str Input string.
+ * @return String without leading and trailing quotation marks.
+ */
+ private String RemoveQuotationMarksIfNeeded(String str) {
+ if (str.startsWith("\"") && str.endsWith("\""))
+ return str.substring(1, str.length() - 1);
+
+ return str;
+ }
+
+ /**
+ * @param req Execute query request.
+ * @param qryCurs Queries cursors.
+ * @return Response.
+ */
+ private OdbcResponse executeQuery(OdbcQueryExecuteRequest req,
+ ConcurrentHashMap<Long, IgniteBiTuple<QueryCursor, Iterator>> qryCurs) {
+ long qryId = qryIdGen.getAndIncrement();
+
+ try {
+ SqlFieldsQuery qry = new SqlFieldsQuery(req.sqlQuery());
+
+ qry.setArgs(req.arguments());
+
+ IgniteCache<Object, Object> cache = ctx.grid().cache(req.cacheName());
+
+ if (cache == null)
+ return new OdbcResponse(OdbcResponse.STATUS_FAILED,
+ "Failed to find cache with name: " + req.cacheName());
+
+ QueryCursor qryCur = cache.query(qry);
+
+ Iterator cur = qryCur.iterator();
+
+ qryCurs.put(qryId, new IgniteBiTuple<>(qryCur, cur));
+
+ List<GridQueryFieldMetadata> fieldsMeta = ((QueryCursorImpl) qryCur).fieldsMeta();
+
+ System.out.println("Field meta: " + fieldsMeta);
+
+ OdbcQueryExecuteResult res = new OdbcQueryExecuteResult(qryId, convertMetadata(fieldsMeta));
+
+ return new OdbcResponse(res);
+ }
+ catch (Exception e) {
+ qryCurs.remove(qryId);
+
+ return new OdbcResponse(OdbcResponse.STATUS_FAILED, e.getMessage());
+ }
+ }
+
+ /**
+ * @param req Execute query request.
+ * @param qryCurs Queries cursors.
+ * @return Response.
+ */
+ private OdbcResponse closeQuery(OdbcQueryCloseRequest req,
+ ConcurrentHashMap<Long, IgniteBiTuple<QueryCursor, Iterator>> qryCurs) {
+ try {
+ QueryCursor cur = qryCurs.get(req.queryId()).get1();
+
+ if (cur == null)
+ return new OdbcResponse(OdbcResponse.STATUS_FAILED,
+ "Failed to find query with ID: " + req.queryId());
+
+ cur.close();
+
+ qryCurs.remove(req.queryId());
+
+ OdbcQueryCloseResult res = new OdbcQueryCloseResult(req.queryId());
+
+ return new OdbcResponse(res);
+ }
+ catch (Exception e) {
+ qryCurs.remove(req.queryId());
+
+ return new OdbcResponse(OdbcResponse.STATUS_FAILED, e.getMessage());
+ }
+ }
+
+ /**
+ * @param req Execute query request.
+ * @param qryCurs Queries cursors.
+ * @return Response.
+ */
+ private OdbcResponse fetchQuery(OdbcQueryFetchRequest req,
+ ConcurrentHashMap<Long, IgniteBiTuple<QueryCursor, Iterator>> qryCurs) {
+ try {
+ Iterator cur = qryCurs.get(req.queryId()).get2();
+
+ if (cur == null)
+ return new OdbcResponse(OdbcResponse.STATUS_FAILED,
+ "Failed to find query with ID: " + req.queryId());
+
+ OdbcQueryFetchResult res = createQueryResult(qryCurs, cur, req, req.queryId());
+
+ return new OdbcResponse(res);
+ }
+ catch (Exception e) {
+ qryCurs.remove(req.queryId());
+
+ return new OdbcResponse(OdbcResponse.STATUS_FAILED, e.getMessage());
+ }
+ }
+
+ /**
+ * @param req Get columns metadata request.
+ * @return Response.
+ */
+ private OdbcResponse getColumnsMeta(OdbcQueryGetColumnsMetaRequest req) {
+ try {
+ List<OdbcColumnMeta> meta = new ArrayList<>();
+
+ String cacheName;
+ String tableName;
+
+ if (req.tableName().contains(".")) {
+ // Parsing two-part table name.
+ String[] parts = req.tableName().split("\\.");
+
+ cacheName = RemoveQuotationMarksIfNeeded(parts[0]);
+
+ tableName = parts[1];
+ }
+ else {
+ cacheName = RemoveQuotationMarksIfNeeded(req.cacheName());
+
+ tableName = req.tableName();
+ }
+
+ Collection<GridQueryTypeDescriptor> tablesMeta = ctx.query().types(cacheName);
+
+ for (GridQueryTypeDescriptor table : tablesMeta) {
+ if (!matches(table.name(), tableName))
+ continue;
+
+ for (Map.Entry<String, Class<?>> field : table.fields().entrySet()) {
+ if (!matches(field.getKey(), req.columnName()))
+ continue;
+
+ OdbcColumnMeta columnMeta = new OdbcColumnMeta(req.cacheName(),
+ table.name(), field.getKey(), field.getValue());
+
+ if (!meta.contains(columnMeta))
+ meta.add(columnMeta);
+ }
+ }
+ OdbcQueryGetColumnsMetaResult res = new OdbcQueryGetColumnsMetaResult(meta);
+
+ return new OdbcResponse(res);
+ }
+ catch (Exception e) {
+ return new OdbcResponse(OdbcResponse.STATUS_FAILED, e.getMessage());
+ }
+ }
+
+ /**
+ * @param req Get tables metadata request.
+ * @return Response.
+ */
+ private OdbcResponse getTablesMeta(OdbcQueryGetTablesMetaRequest req) {
+ try {
+ List<OdbcTableMeta> meta = new ArrayList<>();
+
+ String realSchema = RemoveQuotationMarksIfNeeded(req.schema());
+
+ Collection<GridQueryTypeDescriptor> tablesMeta = ctx.query().types(realSchema);
+
+ for (GridQueryTypeDescriptor table : tablesMeta) {
+ if (!matches(table.name(), req.table()))
+ continue;
+
+ if (!matches("TABLE", req.tableType()))
+ continue;
+
+ OdbcTableMeta tableMeta = new OdbcTableMeta(req.catalog(), req.schema(),
+ table.name(), "TABLE");
+
+ if (!meta.contains(tableMeta))
+ meta.add(tableMeta);
+ }
+
+ OdbcQueryGetTablesMetaResult res = new OdbcQueryGetTablesMetaResult(meta);
+
+ return new OdbcResponse(res);
+ }
+ catch (Exception e) {
+ return new OdbcResponse(OdbcResponse.STATUS_FAILED, e.getMessage());
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/9baf2668/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/OdbcProcessor.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/OdbcProcessor.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/OdbcProcessor.java
new file mode 100644
index 0000000..a3f0b94
--- /dev/null
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/OdbcProcessor.java
@@ -0,0 +1,160 @@
+/*
+ * 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;
+
+import org.apache.ignite.IgniteCheckedException;
+import org.apache.ignite.internal.GridKernalContext;
+import org.apache.ignite.internal.IgniteInternalFuture;
+import org.apache.ignite.internal.binary.BinaryMarshaller;
+import org.apache.ignite.internal.processors.GridProcessorAdapter;
+import org.apache.ignite.internal.processors.odbc.protocol.OdbcTcpServer;
+import org.apache.ignite.internal.processors.odbc.request.OdbcRequest;
+import org.apache.ignite.internal.processors.odbc.response.OdbcResponse;
+import org.apache.ignite.internal.util.GridSpinReadWriteLock;
+import org.apache.ignite.internal.util.future.GridFinishedFuture;
+import org.apache.ignite.marshaller.Marshaller;
+
+/**
+ * ODBC processor.
+ */
+public class OdbcProcessor extends GridProcessorAdapter {
+ /** OBCD TCP Server. */
+ private OdbcTcpServer srv;
+
+ /** Busy lock. */
+ private final GridSpinReadWriteLock busyLock = new GridSpinReadWriteLock();
+
+ /** Command handler. */
+ private OdbcCommandHandler handler;
+
+ /** Protocol handler. */
+ private final OdbcProtocolHandler protoHnd = new OdbcProtocolHandler() {
+ @Override public OdbcResponse handle(OdbcRequest req) throws IgniteCheckedException {
+ return handle0(req);
+ }
+
+ @Override public IgniteInternalFuture<OdbcResponse> handleAsync(OdbcRequest req) {
+ return new GridFinishedFuture<>(
+ new IgniteCheckedException("Failed to handle request (asynchronous handling is not implemented)."));
+ }
+ };
+
+ /**
+ * @param req Request.
+ * @return Response.
+ */
+ private OdbcResponse handle0(final OdbcRequest req) throws IgniteCheckedException {
+ if (!busyLock.tryReadLock())
+ throw new IgniteCheckedException("Failed to handle request (received request while stopping grid).");
+
+ OdbcResponse rsp = null;
+
+ try {
+ rsp = handleRequest(req);
+ }
+ finally {
+ busyLock.readUnlock();
+ }
+
+ return rsp;
+ }
+
+ /**
+ * @param req Request.
+ * @return Future.
+ */
+ private OdbcResponse handleRequest(final OdbcRequest req) throws IgniteCheckedException {
+ if (log.isDebugEnabled())
+ log.debug("Received request from client: " + req);
+
+ OdbcResponse rsp;
+
+ try {
+ rsp = handler == null ? null : handler.handle(req);
+
+ if (rsp == null)
+ throw new IgniteCheckedException("Failed to find registered handler for command: " + req.command());
+ }
+ catch (Exception e) {
+ if (log.isDebugEnabled())
+ log.debug("Failed to handle request [req=" + req + ", e=" + e + "]");
+
+ rsp = new OdbcResponse(OdbcResponse.STATUS_FAILED, e.getMessage());
+ }
+
+ return rsp;
+ }
+
+ /**
+ * @param ctx Kernal context.
+ */
+ public OdbcProcessor(GridKernalContext ctx) {
+ super(ctx);
+
+ srv = new OdbcTcpServer(ctx);
+ }
+
+ /** {@inheritDoc} */
+ @Override public void start() throws IgniteCheckedException {
+ if (isOdbcEnabled()) {
+
+ Marshaller marsh = ctx.config().getMarshaller();
+
+ if (marsh != null && !(marsh instanceof BinaryMarshaller))
+ throw new IgniteCheckedException("Failed to start processor " +
+ "(ODBC may only be used with BinaryMarshaller).");
+
+ // Register handler.
+ handler = new OdbcCommandHandler(ctx);
+
+ srv.start(protoHnd);
+ }
+ }
+
+ /** {@inheritDoc} */
+ @Override public void stop(boolean cancel) throws IgniteCheckedException {
+ if (isOdbcEnabled()) {
+ srv.stop();
+ }
+ }
+
+ /** {@inheritDoc} */
+ @Override public void onKernalStart() throws IgniteCheckedException {
+ if (isOdbcEnabled()) {
+
+ if (log.isDebugEnabled())
+ log.debug("ODBC processor started.");
+ }
+ }
+
+ /** {@inheritDoc} */
+ @Override public void onKernalStop(boolean cancel) {
+ if (isOdbcEnabled()) {
+ busyLock.writeLock();
+
+ if (log.isDebugEnabled())
+ log.debug("ODBC processor stopped.");
+ }
+ }
+
+ /**
+ * @return Whether or not ODBC is enabled.
+ */
+ public boolean isOdbcEnabled() {
+ return ctx.config().getOdbcConfiguration() != null;
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/9baf2668/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/OdbcProtocolHandler.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/OdbcProtocolHandler.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/OdbcProtocolHandler.java
new file mode 100644
index 0000000..9af002d
--- /dev/null
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/OdbcProtocolHandler.java
@@ -0,0 +1,40 @@
+/*
+ * 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;
+
+import org.apache.ignite.IgniteCheckedException;
+import org.apache.ignite.internal.IgniteInternalFuture;
+import org.apache.ignite.internal.processors.odbc.request.OdbcRequest;
+import org.apache.ignite.internal.processors.odbc.response.OdbcResponse;
+
+/**
+ * ODBC command protocol handler.
+ */
+public interface OdbcProtocolHandler {
+ /**
+ * @param req Request.
+ * @return Response.
+ * @throws IgniteCheckedException In case of error.
+ */
+ public OdbcResponse handle(OdbcRequest req) throws IgniteCheckedException;
+
+ /**
+ * @param req Request.
+ * @return Future.
+ */
+ public IgniteInternalFuture<OdbcResponse> handleAsync(OdbcRequest req);
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/9baf2668/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/OdbcTableMeta.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/OdbcTableMeta.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/OdbcTableMeta.java
new file mode 100644
index 0000000..b1eea71
--- /dev/null
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/OdbcTableMeta.java
@@ -0,0 +1,89 @@
+/*
+ * 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;
+
+import org.apache.ignite.internal.binary.BinaryRawWriterEx;
+
+import java.io.IOException;
+
+/**
+ * ODBC table-related metadata.
+ */
+public class OdbcTableMeta {
+ /** Catalog name. */
+ private String catalog;
+
+ /** Schema name. */
+ private String schema;
+
+ /** Table name. */
+ private String table;
+
+ /** Table type. */
+ private String tableType;
+
+ /**
+ * Add quotation marks at the beginning and end of the string.
+ * @param str Input string.
+ * @return String surrounded with quotation marks.
+ */
+ private String AddQuotationMarksIfNeeded(String str) {
+ if (!str.startsWith("\"") && !str.isEmpty())
+ return "\"" + str + "\"";
+
+ return str;
+ }
+
+ /**
+ * @param catalog Catalog name.
+ * @param schema Schema name.
+ * @param table Table name.
+ * @param tableType Table type.
+ */
+ public OdbcTableMeta(String catalog, String schema, String table, String tableType) {
+ this.catalog = catalog;
+ this.schema = AddQuotationMarksIfNeeded(schema);
+ this.table = table;
+ this.tableType = tableType;
+ }
+
+ @Override
+ public boolean equals(Object o)
+ {
+ if (!(o instanceof OdbcTableMeta))
+ return false;
+
+ OdbcTableMeta another = (OdbcTableMeta)o;
+
+ return catalog.equals(another.catalog) &&
+ schema.equals(another.schema) &&
+ table.equals(another.table) &&
+ tableType.equals(another.tableType);
+ }
+
+ /**
+ * Write in a binary format.
+ * @param writer Binary writer.
+ * @throws IOException
+ */
+ public void writeBinary(BinaryRawWriterEx writer) throws IOException {
+ writer.writeString(catalog);
+ writer.writeString(schema);
+ writer.writeString(table);
+ writer.writeString(tableType);
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/9baf2668/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/protocol/GridOdbcParser.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/protocol/GridOdbcParser.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/protocol/GridOdbcParser.java
deleted file mode 100644
index 3cd2fad..0000000
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/protocol/GridOdbcParser.java
+++ /dev/null
@@ -1,345 +0,0 @@
-/*
- * 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.protocol;
-
-import org.apache.ignite.IgniteCheckedException;
-import org.apache.ignite.internal.GridKernalContext;
-import org.apache.ignite.internal.binary.*;
-import org.apache.ignite.internal.binary.streams.BinaryHeapInputStream;
-import org.apache.ignite.internal.binary.streams.BinaryHeapOutputStream;
-import org.apache.ignite.internal.binary.streams.BinaryInputStream;
-import org.apache.ignite.internal.processors.cache.binary.CacheObjectBinaryProcessorImpl;
-import org.apache.ignite.internal.processors.odbc.GridOdbcColumnMeta;
-import org.apache.ignite.internal.processors.odbc.GridOdbcTableMeta;
-import org.apache.ignite.internal.processors.odbc.request.*;
-import org.apache.ignite.internal.processors.odbc.response.*;
-import org.apache.ignite.internal.util.nio.GridNioParser;
-import org.apache.ignite.internal.util.nio.GridNioSession;
-import org.jetbrains.annotations.Nullable;
-
-import java.io.IOException;
-import java.nio.ByteBuffer;
-import java.util.Collection;
-
-
-/**
- * ODBC protocol parser.
- */
-public class GridOdbcParser implements GridNioParser {
- /** Initial output stream capacity. */
- private static final int INIT_CAP = 1024;
-
- /** Length in bytes of the remaining message part. */
- int leftToReceive = 0;
-
- /** Already received bytes of current message. */
- ByteBuffer currentMessage = null;
-
- /** Context. */
- protected final GridKernalContext ctx;
-
- /** Marshaller. */
- private final GridBinaryMarshaller marsh;
-
- GridOdbcParser(GridKernalContext context) {
- ctx = context;
-
- CacheObjectBinaryProcessorImpl cacheObjProc = (CacheObjectBinaryProcessorImpl)ctx.cacheObjects();
-
- marsh = cacheObjProc.marshaller();
- }
-
- /**
- * Process data chunk and try to construct new message using stored and freshly received data.
- * @param buf Fresh data buffer.
- * @return Instance of the {@link BinaryReaderExImpl} positioned to read from the beginning of the message on
- * success and null otherwise.
- */
- private BinaryRawReaderEx tryConstructMessage(ByteBuffer buf) {
- if (leftToReceive != 0) {
- // Still receiving message
- int toConsume = Math.min(leftToReceive, buf.remaining());
-
- currentMessage.put(buf.array(), buf.arrayOffset(), toConsume);
- leftToReceive -= toConsume;
-
- buf.position(buf.position() + toConsume);
-
- if (leftToReceive != 0)
- return null;
-
- BinaryInputStream stream = new BinaryHeapInputStream(currentMessage.array());
-
- BinaryReaderExImpl reader = new BinaryReaderExImpl(null, stream, null);
-
- currentMessage = null;
-
- return reader;
- }
-
- // Receiving new message
- // Getting message length. It's in the first four bytes of the message.
- BinaryInputStream stream = new BinaryHeapInputStream(buf.array());
-
- BinaryReaderExImpl reader = new BinaryReaderExImpl(null, stream, null);
-
- int messageLen = reader.readInt();
- buf.getInt();
-
- int remaining = buf.remaining();
-
- if (messageLen > remaining) {
- leftToReceive = messageLen - remaining;
-
- currentMessage = ByteBuffer.allocate(messageLen);
- currentMessage.put(buf);
-
- return null;
- }
-
- buf.position(buf.position() + messageLen);
-
- return reader;
- }
-
- /** {@inheritDoc} */
- @Nullable @Override public GridOdbcRequest decode(GridNioSession ses, ByteBuffer buf) throws IOException,
- IgniteCheckedException {
- BinaryRawReaderEx messageReader = tryConstructMessage(buf);
-
- return messageReader == null ? null : readRequest(ses, messageReader);
- }
-
- /** {@inheritDoc} */
- @Override public ByteBuffer encode(GridNioSession ses, Object msg) throws IOException, IgniteCheckedException {
- assert msg != null;
- assert msg instanceof GridOdbcResponse;
-
- System.out.println("Encoding query processing result");
-
- BinaryRawWriterEx writer = marsh.writer(new BinaryHeapOutputStream(INIT_CAP));
-
- // Reserving space for the message length.
- int msgLenPos = writer.reserveInt();
-
- writeResponse(ses, writer, (GridOdbcResponse)msg);
-
- int msgLenWithHdr = writer.out().position() - msgLenPos;
-
- int msgLen = msgLenWithHdr - 4;
-
- writer.writeInt(msgLenPos, msgLen);
-
- ByteBuffer buf = ByteBuffer.allocate(msgLenWithHdr);
-
- buf.put(writer.out().array(), msgLenPos, msgLenWithHdr);
-
- buf.flip();
-
- return buf;
- }
-
- /**
- * Read ODBC request from the raw data using provided {@link BinaryReaderExImpl} instance.
- * @param ses Current session.
- * @param reader Reader positioned to read the request.
- * @return Instance of the {@link GridOdbcRequest}.
- * @throws IOException if the type of the request is unknown to the parser.
- */
- private GridOdbcRequest readRequest(GridNioSession ses, BinaryRawReaderEx reader) throws IOException {
- GridOdbcRequest res;
-
- byte cmd = reader.readByte();
-
- switch (cmd) {
- case GridOdbcRequest.EXECUTE_SQL_QUERY: {
- String cache = reader.readString();
- String sql = reader.readString();
- int argsNum = reader.readInt();
-
- System.out.println("Message EXECUTE_SQL_QUERY:");
- System.out.println("cache: " + cache);
- System.out.println("query: " + sql);
- System.out.println("argsNum: " + argsNum);
-
- Object[] params = new Object[argsNum];
-
- for (int i = 0; i < argsNum; ++i)
- params[i] = reader.readObjectDetached();
-
- res = new QueryExecuteRequest(cache, sql, params);
- break;
- }
-
- case GridOdbcRequest.FETCH_SQL_QUERY: {
- long queryId = reader.readLong();
- int pageSize = reader.readInt();
-
- System.out.println("Message FETCH_SQL_QUERY:");
- System.out.println("queryId: " + queryId);
- System.out.println("pageSize: " + pageSize);
-
- res = new QueryFetchRequest(queryId, pageSize);
- break;
- }
-
- case GridOdbcRequest.CLOSE_SQL_QUERY: {
- long queryId = reader.readLong();
-
- System.out.println("Message CLOSE_SQL_QUERY:");
- System.out.println("queryId: " + queryId);
-
- res = new QueryCloseRequest(queryId);
- break;
- }
-
- case GridOdbcRequest.GET_COLUMNS_META: {
- String cache = reader.readString();
- String table = reader.readString();
- String column = reader.readString();
-
- System.out.println("Message GET_COLUMNS_META:");
- System.out.println("cache: " + cache);
- System.out.println("table: " + table);
- System.out.println("column: " + column);
-
- res = new QueryGetColumnsMetaRequest(cache, table, column);
- break;
- }
-
- case GridOdbcRequest.GET_TABLES_META: {
- String catalog = reader.readString();
- String schema = reader.readString();
- String table = reader.readString();
- String tableType = reader.readString();
-
- System.out.println("Message GET_COLUMNS_META:");
- System.out.println("catalog: " + catalog);
- System.out.println("schema: " + schema);
- System.out.println("table: " + table);
- System.out.println("tableType: " + tableType);
-
- res = new QueryGetTablesMetaRequest(catalog, schema, table, tableType);
- break;
- }
-
- default:
- throw new IOException("Failed to parse incoming packet (unknown command type) [ses=" + ses +
- ", cmd=[" + Byte.toString(cmd) + ']');
- }
-
- return res;
- }
-
- /**
- * Write ODBC response using provided {@link BinaryRawWriterEx} instance.
- * @param ses Current session.
- * @param writer Writer.
- * @param rsp ODBC response that should be written.
- * @throws IOException if the type of the response is unknown to the parser.
- */
- private void writeResponse(GridNioSession ses, BinaryRawWriterEx writer, GridOdbcResponse rsp) throws IOException {
- // Writing status
- writer.writeByte((byte)rsp.getSuccessStatus());
-
- if (rsp.getSuccessStatus() != GridOdbcResponse.STATUS_SUCCESS) {
- writer.writeString(rsp.getError());
-
- return;
- }
-
- Object res0 = rsp.getResponse();
-
- if (res0 instanceof QueryExecuteResult) {
- QueryExecuteResult res = (QueryExecuteResult) res0;
-
- System.out.println("Resulting query ID: " + res.getQueryId());
-
- writer.writeLong(res.getQueryId());
-
- Collection<GridOdbcColumnMeta> metas = res.getColumnsMetadata();
-
- assert metas != null;
-
- writer.writeInt(metas.size());
-
- for (GridOdbcColumnMeta meta : metas)
- meta.writeBinary(writer, marsh.context());
-
- } else if (res0 instanceof QueryFetchResult) {
- QueryFetchResult res = (QueryFetchResult) res0;
-
- System.out.println("Resulting query ID: " + res.getQueryId());
-
- writer.writeLong(res.getQueryId());
-
- Collection<?> items0 = res.getItems();
-
- assert items0 != null;
-
- Collection<Collection<Object>> items = (Collection<Collection<Object>>)items0;
-
- writer.writeBoolean(res.getLast());
-
- writer.writeInt(items.size());
-
- for (Collection<Object> row : items) {
- if (row != null) {
- writer.writeInt(row.size());
-
- for (Object obj : row) {
- if (obj != null)
- writer.writeObjectDetached(obj);
- }
- }
- }
- } else if (res0 instanceof QueryCloseResult) {
- QueryCloseResult res = (QueryCloseResult) res0;
-
- System.out.println("Resulting query ID: " + res.getQueryId());
-
- writer.writeLong(res.getQueryId());
-
- } else if (res0 instanceof QueryGetColumnsMetaResult) {
- QueryGetColumnsMetaResult res = (QueryGetColumnsMetaResult) res0;
-
- Collection<GridOdbcColumnMeta> columnsMeta = res.getMeta();
-
- assert columnsMeta != null;
-
- writer.writeInt(columnsMeta.size());
-
- for (GridOdbcColumnMeta columnMeta : columnsMeta)
- columnMeta.writeBinary(writer, marsh.context());
-
- } else if (res0 instanceof QueryGetTablesMetaResult) {
- QueryGetTablesMetaResult res = (QueryGetTablesMetaResult) res0;
-
- Collection<GridOdbcTableMeta> tablesMeta = res.getMeta();
-
- assert tablesMeta != null;
-
- writer.writeInt(tablesMeta.size());
-
- for (GridOdbcTableMeta tableMeta : tablesMeta)
- tableMeta.writeBinary(writer);
-
- } else {
- throw new IOException("Failed to serialize response packet (unknown response type) [ses=" + ses + "]");
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/9baf2668/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/protocol/GridTcpOdbcNioListener.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/protocol/GridTcpOdbcNioListener.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/protocol/GridTcpOdbcNioListener.java
deleted file mode 100644
index c53c2c0..0000000
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/protocol/GridTcpOdbcNioListener.java
+++ /dev/null
@@ -1,102 +0,0 @@
-/*
- * 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.protocol;
-
-import org.apache.ignite.IgniteCheckedException;
-import org.apache.ignite.IgniteLogger;
-import org.apache.ignite.internal.GridKernalContext;
-import org.apache.ignite.internal.processors.odbc.GridOdbcProtocolHandler;
-import org.apache.ignite.internal.processors.odbc.request.GridOdbcRequest;
-import org.apache.ignite.internal.processors.odbc.response.GridOdbcResponse;
-import org.apache.ignite.internal.util.nio.GridNioFuture;
-import org.apache.ignite.internal.util.nio.GridNioServerListenerAdapter;
-import org.apache.ignite.internal.util.nio.GridNioSession;
-import org.apache.ignite.internal.util.typedef.internal.U;
-import org.jetbrains.annotations.Nullable;
-
-/**
- * Listener for ODBC driver connection.
- */
-public class GridTcpOdbcNioListener extends GridNioServerListenerAdapter<GridOdbcRequest> {
- /** Server. */
- private GridTcpOdbcServer srv;
-
- /** Logger. */
- protected final IgniteLogger log;
-
- /** Context. */
- protected final GridKernalContext ctx;
-
- /** Protocol handler. */
- private GridOdbcProtocolHandler hnd;
-
- GridTcpOdbcNioListener(IgniteLogger log, GridTcpOdbcServer srv, GridKernalContext ctx, GridOdbcProtocolHandler hnd) {
- this.log = log;
- this.srv = srv;
- this.ctx = ctx;
- this.hnd = hnd;
- }
-
- @Override
- public void onConnected(GridNioSession ses) {
- System.out.println("Driver connected");
- }
-
- @Override
- public void onDisconnected(GridNioSession ses, @Nullable Exception e) {
- System.out.println("Driver disconnected");
-
- if (e != null) {
- if (e instanceof RuntimeException)
- U.error(log, "Failed to process request from remote client: " + ses, e);
- else
- U.warn(log, "Closed client session due to exception [ses=" + ses + ", msg=" + e.getMessage() + ']');
- }
- }
-
- @Override
- public void onMessage(GridNioSession ses, GridOdbcRequest msg) {
- assert msg != null;
-
- System.out.println("Query: " + msg.command());
-
- GridOdbcResponse res;
-
- try {
- res = hnd.handle(msg);
- }
- catch (IgniteCheckedException e) {
- U.error(log, "Failed to process client request: " + msg, e);
-
- res = new GridOdbcResponse(GridOdbcResponse.STATUS_FAILED,
- "Failed to process client request: " + e.getMessage());
- }
-
- System.out.println("Resulting success status: " + res.getSuccessStatus());
-
- GridNioFuture<?> sf = ses.send(res);
-
- // Check if send failed.
- if (sf.isDone()) {
- try {
- sf.get();
- } catch (Exception e) {
- U.error(log, "Failed to process client request [ses=" + ses + ", msg=" + msg + ']', e);
- }
- }
- }
-}