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:38 UTC
[05/28] ignite git commit: IGNITE-2447: Moved all ODBC classes into
org.apache.ignite.internal.processors.odbc package.
IGNITE-2447: Moved all ODBC classes into
org.apache.ignite.internal.processors.odbc package.
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/2a756311
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/2a756311
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/2a756311
Branch: refs/heads/ignite-1786
Commit: 2a756311134e971fbfbc671f2b53090cae1085ad
Parents: 9baf266
Author: isapego <is...@gridgain.com>
Authored: Mon Jan 25 18:23:20 2016 +0300
Committer: isapego <is...@gridgain.com>
Committed: Mon Jan 25 18:23:20 2016 +0300
----------------------------------------------------------------------
.../processors/odbc/OdbcCommandHandler.java | 4 +-
.../internal/processors/odbc/OdbcParser.java | 341 ++++++++++++++++++
.../internal/processors/odbc/OdbcProcessor.java | 3 -
.../processors/odbc/OdbcProtocolHandler.java | 2 -
.../processors/odbc/OdbcQueryCloseRequest.java | 47 +++
.../processors/odbc/OdbcQueryCloseResult.java | 39 +++
.../odbc/OdbcQueryExecuteRequest.java | 85 +++++
.../processors/odbc/OdbcQueryExecuteResult.java | 55 +++
.../processors/odbc/OdbcQueryFetchRequest.java | 66 ++++
.../processors/odbc/OdbcQueryFetchResult.java | 75 ++++
.../odbc/OdbcQueryGetColumnsMetaRequest.java | 84 +++++
.../odbc/OdbcQueryGetColumnsMetaResult.java | 43 +++
.../odbc/OdbcQueryGetTablesMetaRequest.java | 105 ++++++
.../odbc/OdbcQueryGetTablesMetaResult.java | 43 +++
.../internal/processors/odbc/OdbcRequest.java | 61 ++++
.../internal/processors/odbc/OdbcResponse.java | 107 ++++++
.../processors/odbc/OdbcTcpNioListener.java | 99 ++++++
.../internal/processors/odbc/OdbcTcpServer.java | 189 ++++++++++
.../processors/odbc/protocol/OdbcParser.java | 345 -------------------
.../odbc/protocol/OdbcTcpNioListener.java | 102 ------
.../processors/odbc/protocol/OdbcTcpServer.java | 191 ----------
.../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/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 ------
33 files changed, 1440 insertions(+), 1456 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ignite/blob/2a756311/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
index d8a05f7..9e56888 100644
--- 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
@@ -22,8 +22,6 @@ 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;
@@ -32,7 +30,7 @@ import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicLong;
-import static org.apache.ignite.internal.processors.odbc.request.OdbcRequest.*;
+import static org.apache.ignite.internal.processors.odbc.OdbcRequest.*;
/**
* SQL query handler.
http://git-wip-us.apache.org/repos/asf/ignite/blob/2a756311/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/OdbcParser.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/OdbcParser.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/OdbcParser.java
new file mode 100644
index 0000000..ead6d3b
--- /dev/null
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/OdbcParser.java
@@ -0,0 +1,341 @@
+/*
+ * 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.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.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 OdbcParser 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;
+
+ OdbcParser(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 OdbcRequest 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 OdbcResponse;
+
+ 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, (OdbcResponse)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 OdbcRequest}.
+ * @throws IOException if the type of the request is unknown to the parser.
+ */
+ private OdbcRequest readRequest(GridNioSession ses, BinaryRawReaderEx reader) throws IOException {
+ OdbcRequest res;
+
+ byte cmd = reader.readByte();
+
+ switch (cmd) {
+ case OdbcRequest.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 OdbcQueryExecuteRequest(cache, sql, params);
+ break;
+ }
+
+ case OdbcRequest.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 OdbcQueryFetchRequest(queryId, pageSize);
+ break;
+ }
+
+ case OdbcRequest.CLOSE_SQL_QUERY: {
+ long queryId = reader.readLong();
+
+ System.out.println("Message CLOSE_SQL_QUERY:");
+ System.out.println("queryId: " + queryId);
+
+ res = new OdbcQueryCloseRequest(queryId);
+ break;
+ }
+
+ case OdbcRequest.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 OdbcQueryGetColumnsMetaRequest(cache, table, column);
+ break;
+ }
+
+ case OdbcRequest.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 OdbcQueryGetTablesMetaRequest(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, OdbcResponse rsp) throws IOException {
+ // Writing status
+ writer.writeByte((byte)rsp.getSuccessStatus());
+
+ if (rsp.getSuccessStatus() != OdbcResponse.STATUS_SUCCESS) {
+ writer.writeString(rsp.getError());
+
+ return;
+ }
+
+ Object res0 = rsp.getResponse();
+
+ if (res0 instanceof OdbcQueryExecuteResult) {
+ OdbcQueryExecuteResult res = (OdbcQueryExecuteResult) res0;
+
+ System.out.println("Resulting query ID: " + res.getQueryId());
+
+ writer.writeLong(res.getQueryId());
+
+ Collection<OdbcColumnMeta> metas = res.getColumnsMetadata();
+
+ assert metas != null;
+
+ writer.writeInt(metas.size());
+
+ for (OdbcColumnMeta meta : metas)
+ meta.writeBinary(writer, marsh.context());
+
+ } else if (res0 instanceof OdbcQueryFetchResult) {
+ OdbcQueryFetchResult res = (OdbcQueryFetchResult) 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 OdbcQueryCloseResult) {
+ OdbcQueryCloseResult res = (OdbcQueryCloseResult) res0;
+
+ System.out.println("Resulting query ID: " + res.getQueryId());
+
+ writer.writeLong(res.getQueryId());
+
+ } else if (res0 instanceof OdbcQueryGetColumnsMetaResult) {
+ OdbcQueryGetColumnsMetaResult res = (OdbcQueryGetColumnsMetaResult) res0;
+
+ Collection<OdbcColumnMeta> columnsMeta = res.getMeta();
+
+ assert columnsMeta != null;
+
+ writer.writeInt(columnsMeta.size());
+
+ for (OdbcColumnMeta columnMeta : columnsMeta)
+ columnMeta.writeBinary(writer, marsh.context());
+
+ } else if (res0 instanceof OdbcQueryGetTablesMetaResult) {
+ OdbcQueryGetTablesMetaResult res = (OdbcQueryGetTablesMetaResult) res0;
+
+ Collection<OdbcTableMeta> tablesMeta = res.getMeta();
+
+ assert tablesMeta != null;
+
+ writer.writeInt(tablesMeta.size());
+
+ for (OdbcTableMeta 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/2a756311/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
index a3f0b94..91b24a4 100644
--- 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
@@ -21,9 +21,6 @@ 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;
http://git-wip-us.apache.org/repos/asf/ignite/blob/2a756311/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
index 9af002d..e1957d7 100644
--- 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
@@ -18,8 +18,6 @@ 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.
http://git-wip-us.apache.org/repos/asf/ignite/blob/2a756311/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/OdbcQueryCloseRequest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/OdbcQueryCloseRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/OdbcQueryCloseRequest.java
new file mode 100644
index 0000000..e9b5698
--- /dev/null
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/OdbcQueryCloseRequest.java
@@ -0,0 +1,47 @@
+/*
+ * 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;
+
+/**
+ * ODBC query close request.
+ */
+public class OdbcQueryCloseRequest extends OdbcRequest {
+ /** Query ID. */
+ private long queryId;
+
+ /**
+ * @param queryId Query ID.
+ */
+ public OdbcQueryCloseRequest(long queryId) {
+ super(CLOSE_SQL_QUERY);
+ this.queryId = queryId;
+ }
+
+ /**
+ * @param queryId Query ID.
+ */
+ public void cacheName(long queryId) {
+ this.queryId = queryId;
+ }
+
+ /**
+ * @return Query ID.
+ */
+ public long queryId() {
+ return queryId;
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ignite/blob/2a756311/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/OdbcQueryCloseResult.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/OdbcQueryCloseResult.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/OdbcQueryCloseResult.java
new file mode 100644
index 0000000..cbc23c8
--- /dev/null
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/OdbcQueryCloseResult.java
@@ -0,0 +1,39 @@
+/*
+ * 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;
+
+/**
+ * Query result.
+ */
+public class OdbcQueryCloseResult {
+ /** Query ID. */
+ private long queryId;
+
+ /**
+ * @param queryId Query ID.
+ */
+ public OdbcQueryCloseResult(long queryId){
+ this.queryId = queryId;
+ }
+
+ /**
+ * @return Query ID.
+ */
+ public long getQueryId() {
+ return queryId;
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/2a756311/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/OdbcQueryExecuteRequest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/OdbcQueryExecuteRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/OdbcQueryExecuteRequest.java
new file mode 100644
index 0000000..4628b52
--- /dev/null
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/OdbcQueryExecuteRequest.java
@@ -0,0 +1,85 @@
+/*
+ * 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;
+
+/**
+ * ODBC query execute request.
+ */
+public class OdbcQueryExecuteRequest extends OdbcRequest {
+ /** Cache name. */
+ private String cacheName;
+
+ /** Sql query. */
+ private String sqlQry;
+
+ /** Sql query arguments. */
+ private Object[] args;
+
+ /**
+ * @param cacheName Cache name.
+ * @param sqlQry SQL query.
+ * @param args Arguments list.
+ */
+ public OdbcQueryExecuteRequest(String cacheName, String sqlQry, Object[] args) {
+ super(EXECUTE_SQL_QUERY);
+ this.cacheName = cacheName;
+ this.sqlQry = sqlQry;
+ this.args = args;
+ }
+
+ /**
+ * @param sqlQry Sql query.
+ */
+ public void sqlQuery(String sqlQry) {
+ this.sqlQry = sqlQry;
+ }
+
+ /**
+ * @return Sql query.
+ */
+ public String sqlQuery() {
+ return sqlQry;
+ }
+
+ /**
+ * @param args Sql query arguments.
+ */
+ public void arguments(Object[] args) {
+ this.args = args;
+ }
+
+ /**
+ * @return Sql query arguments.
+ */
+ public Object[] arguments() {
+ return args;
+ }
+
+ /**
+ * @param cacheName Cache name.
+ */
+ public void cacheName(String cacheName) {
+ this.cacheName = cacheName;
+ }
+
+ /**
+ * @return Cache name.
+ */
+ public String cacheName() {
+ return cacheName;
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/2a756311/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/OdbcQueryExecuteResult.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/OdbcQueryExecuteResult.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/OdbcQueryExecuteResult.java
new file mode 100644
index 0000000..a4dec54
--- /dev/null
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/OdbcQueryExecuteResult.java
@@ -0,0 +1,55 @@
+/*
+ * 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.processors.odbc.OdbcColumnMeta;
+
+import java.util.Collection;
+
+/**
+ * Query execute result.
+ */
+public class OdbcQueryExecuteResult {
+ /** Query ID. */
+ private long queryId;
+
+ /** Fields metadata. */
+ private Collection<OdbcColumnMeta> columnsMeta;
+
+ /**
+ * @param queryId Query ID.
+ * @param columnsMeta Columns metadata.
+ */
+ public OdbcQueryExecuteResult(long queryId, Collection<OdbcColumnMeta> columnsMeta){
+ this.queryId = queryId;
+ this.columnsMeta = columnsMeta;
+ }
+
+ /**
+ * @return Query ID.
+ */
+ public long getQueryId() {
+ return queryId;
+ }
+
+ /**
+ * @return Columns metadata.
+ */
+ public Collection<OdbcColumnMeta> getColumnsMetadata() {
+ return columnsMeta;
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/2a756311/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/OdbcQueryFetchRequest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/OdbcQueryFetchRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/OdbcQueryFetchRequest.java
new file mode 100644
index 0000000..7609649
--- /dev/null
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/OdbcQueryFetchRequest.java
@@ -0,0 +1,66 @@
+/*
+ * 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;
+
+/**
+ * ODBC query fetch request.
+ */
+public class OdbcQueryFetchRequest extends OdbcRequest {
+ /** Query ID. */
+ private long queryId;
+
+ /** Page size - maximum number of rows to return. */
+ private Integer pageSize;
+
+ /**
+ * @param queryId Query ID.
+ * @param pageSize Page size.
+ */
+ public OdbcQueryFetchRequest(long queryId, int pageSize) {
+ super(FETCH_SQL_QUERY);
+ this.queryId = queryId;
+ this.pageSize = pageSize;
+ }
+
+ /**
+ * @param pageSize Page size.
+ */
+ public void pageSize(Integer pageSize) {
+ this.pageSize = pageSize;
+ }
+
+ /**
+ * @return Page size.
+ */
+ public int pageSize() {
+ return pageSize;
+ }
+
+ /**
+ * @param queryId Query ID.
+ */
+ public void cacheName(long queryId) {
+ this.queryId = queryId;
+ }
+
+ /**
+ * @return Query ID.
+ */
+ public long queryId() {
+ return queryId;
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ignite/blob/2a756311/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/OdbcQueryFetchResult.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/OdbcQueryFetchResult.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/OdbcQueryFetchResult.java
new file mode 100644
index 0000000..b103914
--- /dev/null
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/OdbcQueryFetchResult.java
@@ -0,0 +1,75 @@
+/*
+ * 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 java.util.Collection;
+
+/**
+ * Query fetch result.
+ */
+public class OdbcQueryFetchResult {
+ /** Query ID. */
+ private long queryId;
+
+ /** Query result rows. */
+ private Collection<?> items = null;
+
+ /** Flag indicating the query has no unfetched results. */
+ private boolean last = false;
+
+ /**
+ * @param queryId Query ID.
+ */
+ public OdbcQueryFetchResult(long queryId){
+ this.queryId = queryId;
+ }
+
+ /**
+ * @return Query ID.
+ */
+ public long getQueryId() {
+ return queryId;
+ }
+
+ /**
+ * @param items Query result rows.
+ */
+ public void setItems(Collection<?> items) {
+ this.items = items;
+ }
+
+ /**
+ * @return Query result rows.
+ */
+ public Collection<?> getItems() {
+ return items;
+ }
+
+ /**
+ * @param last Flag indicating the query has no unfetched results.
+ */
+ public void setLast(boolean last) {
+ this.last = last;
+ }
+
+ /**
+ * @return Flag indicating the query has no unfetched results.
+ */
+ public boolean getLast() {
+ return last;
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/2a756311/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/OdbcQueryGetColumnsMetaRequest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/OdbcQueryGetColumnsMetaRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/OdbcQueryGetColumnsMetaRequest.java
new file mode 100644
index 0000000..b0f1ba6
--- /dev/null
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/OdbcQueryGetColumnsMetaRequest.java
@@ -0,0 +1,84 @@
+/*
+ * 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;
+
+/**
+ * ODBC query get columns meta request.
+ */
+public class OdbcQueryGetColumnsMetaRequest extends OdbcRequest {
+ /** Cache name. */
+ private String cacheName;
+
+ /** Table name. */
+ private String tableName;
+
+ /** Column name. */
+ private String columnName;
+
+ /**
+ * @param cacheName Cache name.
+ */
+ public OdbcQueryGetColumnsMetaRequest(String cacheName, String tableName, String columnName) {
+ super(GET_COLUMNS_META);
+
+ this.cacheName = cacheName;
+ this.tableName = tableName;
+ this.columnName = columnName;
+ }
+
+ /**
+ * @param cacheName Cache name.
+ */
+ public void cacheName(String cacheName) {
+ this.cacheName = cacheName;
+ }
+
+ /**
+ * @return Cache name.
+ */
+ public String cacheName() {
+ return cacheName;
+ }
+
+ /**
+ * @param tableName Table name.
+ */
+ public void tableName(String tableName) {
+ this.tableName = tableName;
+ }
+
+ /**
+ * @return Table name.
+ */
+ public String tableName() {
+ return tableName;
+ }
+
+ /**
+ * @param columnName Column name.
+ */
+ public void columnName(String columnName) {
+ this.columnName = columnName;
+ }
+
+ /**
+ * @return Column name.
+ */
+ public String columnName() {
+ return columnName;
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ignite/blob/2a756311/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/OdbcQueryGetColumnsMetaResult.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/OdbcQueryGetColumnsMetaResult.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/OdbcQueryGetColumnsMetaResult.java
new file mode 100644
index 0000000..f00176c
--- /dev/null
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/OdbcQueryGetColumnsMetaResult.java
@@ -0,0 +1,43 @@
+/*
+ * 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.processors.odbc.OdbcColumnMeta;
+
+import java.util.Collection;
+
+/**
+ * Query get columns meta result.
+ */
+public class OdbcQueryGetColumnsMetaResult {
+ /** Query result rows. */
+ private Collection<OdbcColumnMeta> meta;
+
+ /**
+ * @param meta Column metadata.
+ */
+ public OdbcQueryGetColumnsMetaResult(Collection<OdbcColumnMeta> meta) {
+ this.meta = meta;
+ }
+
+ /**
+ * @return Query result rows.
+ */
+ public Collection<OdbcColumnMeta> getMeta() {
+ return meta;
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/2a756311/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/OdbcQueryGetTablesMetaRequest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/OdbcQueryGetTablesMetaRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/OdbcQueryGetTablesMetaRequest.java
new file mode 100644
index 0000000..7d8194c
--- /dev/null
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/OdbcQueryGetTablesMetaRequest.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;
+
+/**
+ * ODBC query get tables meta request.
+ */
+public class OdbcQueryGetTablesMetaRequest extends OdbcRequest {
+ /** Catalog search pattern. */
+ private String catalog;
+
+ /** Schema search pattern. */
+ private String schema;
+
+ /** Table search pattern. */
+ private String table;
+
+ /** Table type search pattern. */
+ private String tableType;
+
+ /**
+ * @param catalog Catalog search pattern.
+ * @param schema Schema search pattern.
+ * @param table Table search pattern.
+ * @param tableType Table type search pattern.
+ */
+ public OdbcQueryGetTablesMetaRequest(String catalog, String schema, String table, String tableType) {
+ super(GET_TABLES_META);
+
+ this.catalog = catalog;
+ this.schema = schema;
+ this.table = table;
+ this.tableType = tableType;
+ }
+
+ /**
+ * @param catalog Catalog search pattern.
+ */
+ public void catalog(String catalog) {
+ this.catalog = catalog;
+ }
+
+ /**
+ * @return catalog search pattern.
+ */
+ public String catalog() {
+ return catalog;
+ }
+
+ /**
+ * @param schema Schema search pattern.
+ */
+ public void schema(String schema) {
+ this.schema = schema;
+ }
+
+ /**
+ * @return Schema search pattern.
+ */
+ public String schema() {
+ return schema;
+ }
+
+ /**
+ * @param table Schema search pattern.
+ */
+ public void table(String table) {
+ this.table = table;
+ }
+
+ /**
+ * @return Table search pattern.
+ */
+ public String table() {
+ return table;
+ }
+
+ /**
+ * @param tableType Table type search pattern.
+ */
+ public void tableType(String tableType) {
+ this.tableType = tableType;
+ }
+
+ /**
+ * @return Table type search pattern.
+ */
+ public String tableType() {
+ return tableType;
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ignite/blob/2a756311/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/OdbcQueryGetTablesMetaResult.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/OdbcQueryGetTablesMetaResult.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/OdbcQueryGetTablesMetaResult.java
new file mode 100644
index 0000000..e737772
--- /dev/null
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/OdbcQueryGetTablesMetaResult.java
@@ -0,0 +1,43 @@
+/*
+ * 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.processors.odbc.OdbcTableMeta;
+
+import java.util.Collection;
+
+/**
+ * Query get columns meta result.
+ */
+public class OdbcQueryGetTablesMetaResult {
+ /** Query result rows. */
+ private Collection<OdbcTableMeta> meta;
+
+ /**
+ * @param meta Column metadata.
+ */
+ public OdbcQueryGetTablesMetaResult(Collection<OdbcTableMeta> meta) {
+ this.meta = meta;
+ }
+
+ /**
+ * @return Query result rows.
+ */
+ public Collection<OdbcTableMeta> getMeta() {
+ return meta;
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/2a756311/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/OdbcRequest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/OdbcRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/OdbcRequest.java
new file mode 100644
index 0000000..1e8aecc
--- /dev/null
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/OdbcRequest.java
@@ -0,0 +1,61 @@
+/*
+ * 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;
+
+/**
+ * ODBC command request.
+ */
+public class OdbcRequest {
+ /** Execute sql query. */
+ public static final int EXECUTE_SQL_QUERY = 1;
+
+ /** Fetch query results. */
+ public static final int FETCH_SQL_QUERY = 2;
+
+ /** Close query. */
+ public static final int CLOSE_SQL_QUERY = 3;
+
+ /** Get columns meta query. */
+ public static final int GET_COLUMNS_META = 4;
+
+ /** Get columns meta query. */
+ public static final int GET_TABLES_META = 5;
+
+ /** Command. */
+ private int cmd;
+
+ /**
+ * @param cmd Command type.
+ */
+ public OdbcRequest(int cmd) {
+ this.cmd = cmd;
+ }
+
+ /**
+ * @return Command.
+ */
+ public int command() {
+ return cmd;
+ }
+
+ /**
+ * @param cmd Command.
+ */
+ public void command(int cmd) {
+ this.cmd = cmd;
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/2a756311/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/OdbcResponse.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/OdbcResponse.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/OdbcResponse.java
new file mode 100644
index 0000000..653e3f4
--- /dev/null
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/OdbcResponse.java
@@ -0,0 +1,107 @@
+/*
+ * 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.util.tostring.GridToStringInclude;
+import org.apache.ignite.internal.util.typedef.internal.S;
+import org.jetbrains.annotations.Nullable;
+
+/**
+ * ODBC protocol response.
+ */
+public class OdbcResponse {
+
+ /** Command succeeded. */
+ public static final int STATUS_SUCCESS = 0;
+
+ /** Command failed. */
+ public static final int STATUS_FAILED = 1;
+
+ /** Success status. */
+ @SuppressWarnings("RedundantFieldInitialization")
+ private int successStatus = STATUS_SUCCESS;
+
+ /** Error. */
+ private String err;
+
+ /** Response object. */
+ @GridToStringInclude
+ private Object obj;
+
+ /**
+ * Constructs successful rest response.
+ *
+ * @param obj Response object.
+ */
+ public OdbcResponse(Object obj) {
+ successStatus = STATUS_SUCCESS;
+ this.obj = obj;
+ }
+
+ /**
+ * Constructs failed rest response.
+ *
+ * @param status Response status.
+ * @param err Error, {@code null} if success is {@code true}.
+ */
+ public OdbcResponse(int status, @Nullable String err) {
+ assert status != STATUS_SUCCESS;
+
+ successStatus = status;
+ this.err = err;
+ }
+
+ /**
+ * @return Success flag.
+ */
+ public int getSuccessStatus() {
+ return successStatus;
+ }
+
+ /**
+ * @return Response object.
+ */
+ public Object getResponse() {
+ return obj;
+ }
+
+ /**
+ * @param obj Response object.
+ */
+ public void setResponse(@Nullable Object obj) {
+ this.obj = obj;
+ }
+
+ /**
+ * @return Error.
+ */
+ public String getError() {
+ return err;
+ }
+
+ /**
+ * @param err Error.
+ */
+ public void setError(String err) {
+ this.err = err;
+ }
+
+ /** {@inheritDoc} */
+ @Override public String toString() {
+ return S.toString(OdbcResponse.class, this);
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/2a756311/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/OdbcTcpNioListener.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/OdbcTcpNioListener.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/OdbcTcpNioListener.java
new file mode 100644
index 0000000..c30daff
--- /dev/null
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/OdbcTcpNioListener.java
@@ -0,0 +1,99 @@
+/*
+ * 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.IgniteLogger;
+import org.apache.ignite.internal.GridKernalContext;
+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 OdbcTcpNioListener extends GridNioServerListenerAdapter<OdbcRequest> {
+ /** Server. */
+ private OdbcTcpServer srv;
+
+ /** Logger. */
+ protected final IgniteLogger log;
+
+ /** Context. */
+ protected final GridKernalContext ctx;
+
+ /** Protocol handler. */
+ private OdbcProtocolHandler hnd;
+
+ OdbcTcpNioListener(IgniteLogger log, OdbcTcpServer srv, GridKernalContext ctx, OdbcProtocolHandler 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, OdbcRequest msg) {
+ assert msg != null;
+
+ System.out.println("Query: " + msg.command());
+
+ OdbcResponse res;
+
+ try {
+ res = hnd.handle(msg);
+ }
+ catch (IgniteCheckedException e) {
+ U.error(log, "Failed to process client request: " + msg, e);
+
+ res = new OdbcResponse(OdbcResponse.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);
+ }
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/2a756311/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/OdbcTcpServer.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/OdbcTcpServer.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/OdbcTcpServer.java
new file mode 100644
index 0000000..83adb1b
--- /dev/null
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/OdbcTcpServer.java
@@ -0,0 +1,189 @@
+/*
+ * 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.IgniteLogger;
+import org.apache.ignite.configuration.ConnectorConfiguration;
+import org.apache.ignite.configuration.IgniteConfiguration;
+import org.apache.ignite.configuration.OdbcConfiguration;
+import org.apache.ignite.internal.GridKernalContext;
+import org.apache.ignite.internal.util.nio.*;
+import org.apache.ignite.internal.util.typedef.internal.U;
+import org.apache.ignite.spi.IgnitePortProtocol;
+
+import java.io.IOException;
+import java.net.InetAddress;
+import java.nio.ByteOrder;
+
+/**
+ * TCP server that handles communication with ODBC driver.
+ */
+public class OdbcTcpServer {
+
+ /** Server. */
+ private GridNioServer<OdbcRequest> srv;
+
+ /** NIO server listener. */
+ private GridNioServerListener<OdbcRequest> lsnr;
+
+ /** Logger. */
+ protected final IgniteLogger log;
+
+ /** Context. */
+ protected final GridKernalContext ctx;
+
+ /** Host used by this protocol. */
+ protected InetAddress host;
+
+ /** Port used by this protocol. */
+ protected int port;
+
+ /** */
+ public String name() {
+ return "ODBC server";
+ }
+
+ public OdbcTcpServer(GridKernalContext ctx) {
+ assert ctx != null;
+ assert ctx.config().getConnectorConfiguration() != null;
+
+ this.ctx = ctx;
+
+ log = ctx.log(getClass());
+ }
+
+ @SuppressWarnings("BusyWait")
+ public void start(final OdbcProtocolHandler hnd) throws IgniteCheckedException {
+ OdbcConfiguration cfg = ctx.config().getOdbcConfiguration();
+
+ assert cfg != null;
+
+ lsnr = new OdbcTcpNioListener(log, this, ctx, hnd);
+
+ GridNioParser parser = new OdbcParser(ctx);
+
+ try {
+ host = resolveOdbcTcpHost(ctx.config());
+
+ int odbcPort = cfg.getPort();
+
+ if (startTcpServer(host, odbcPort, lsnr, parser, cfg)) {
+ port = odbcPort;
+
+ System.out.println("ODBC Server has started on TCP port " + port);
+
+ return;
+ }
+
+ U.warn(log, "Failed to start " + name() + " (possibly all ports in range are in use) " +
+ "[odbcPort=" + odbcPort + ", host=" + host + ']');
+ }
+ catch (IOException e) {
+ U.warn(log, "Failed to start " + name() + " on port " + port + ": " + e.getMessage(),
+ "Failed to start " + name() + " on port " + port + ". " +
+ "Check restTcpHost configuration property.");
+ }
+ }
+
+ /** */
+ public void onKernalStart() {
+ }
+
+ /** */
+ public void stop() {
+ if (srv != null) {
+ ctx.ports().deregisterPorts(getClass());
+
+ srv.stop();
+ }
+ }
+
+ /**
+ * Resolves host for server using grid configuration.
+ *
+ * @param cfg Grid configuration.
+ * @return Host address.
+ * @throws IOException If failed to resolve host.
+ */
+ private InetAddress resolveOdbcTcpHost(IgniteConfiguration cfg) throws IOException {
+ String host = null;
+
+ ConnectorConfiguration connectionCfg = cfg.getConnectorConfiguration();
+
+ if (connectionCfg != null)
+ host = connectionCfg.getHost();
+
+ if (host == null)
+ host = cfg.getLocalHost();
+
+ return U.resolveLocalHost(host);
+ }
+
+ /**
+ * Tries to start server with given parameters.
+ *
+ * @param hostAddr Host on which server should be bound.
+ * @param port Port on which server should be bound.
+ * @param lsnr Server message listener.
+ * @param parser Server message parser.
+ * @param cfg Configuration for other parameters.
+ * @return {@code True} if server successfully started, {@code false} if port is used and
+ * server was unable to start.
+ */
+ private boolean startTcpServer(InetAddress hostAddr, int port, GridNioServerListener<OdbcRequest> lsnr,
+ GridNioParser parser, OdbcConfiguration cfg) {
+ try {
+ GridNioFilter codec = new GridNioCodecFilter(parser, log, false);
+
+ GridNioFilter[] filters;
+
+ filters = new GridNioFilter[] { codec };
+
+ srv = GridNioServer.<OdbcRequest>builder()
+ .address(hostAddr)
+ .port(port)
+ .listener(lsnr)
+ .logger(log)
+ .selectorCount(cfg.getSelectorCount())
+ .gridName(ctx.gridName())
+ .tcpNoDelay(cfg.isNoDelay())
+ .directBuffer(cfg.isDirectBuffer())
+ .byteOrder(ByteOrder.nativeOrder())
+ .socketSendBufferSize(cfg.getSendBufferSize())
+ .socketReceiveBufferSize(cfg.getReceiveBufferSize())
+ .sendQueueLimit(cfg.getSendQueueLimit())
+ .filters(filters)
+ .directMode(false)
+ .build();
+
+ srv.idleTimeout(cfg.getIdleTimeout());
+
+ srv.start();
+
+ ctx.ports().registerPort(port, IgnitePortProtocol.TCP, getClass());
+
+ return true;
+ }
+ catch (IgniteCheckedException e) {
+ if (log.isDebugEnabled())
+ log.debug("Failed to start " + name() + " on port " + port + ": " + e.getMessage());
+
+ return false;
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/2a756311/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/protocol/OdbcParser.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/protocol/OdbcParser.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/protocol/OdbcParser.java
deleted file mode 100644
index 602f859..0000000
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/protocol/OdbcParser.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.OdbcColumnMeta;
-import org.apache.ignite.internal.processors.odbc.OdbcTableMeta;
-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 OdbcParser 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;
-
- OdbcParser(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 OdbcRequest 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 OdbcResponse;
-
- 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, (OdbcResponse)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 OdbcRequest}.
- * @throws IOException if the type of the request is unknown to the parser.
- */
- private OdbcRequest readRequest(GridNioSession ses, BinaryRawReaderEx reader) throws IOException {
- OdbcRequest res;
-
- byte cmd = reader.readByte();
-
- switch (cmd) {
- case OdbcRequest.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 OdbcQueryExecuteRequest(cache, sql, params);
- break;
- }
-
- case OdbcRequest.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 OdbcQueryFetchRequest(queryId, pageSize);
- break;
- }
-
- case OdbcRequest.CLOSE_SQL_QUERY: {
- long queryId = reader.readLong();
-
- System.out.println("Message CLOSE_SQL_QUERY:");
- System.out.println("queryId: " + queryId);
-
- res = new OdbcQueryCloseRequest(queryId);
- break;
- }
-
- case OdbcRequest.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 OdbcQueryGetColumnsMetaRequest(cache, table, column);
- break;
- }
-
- case OdbcRequest.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 OdbcQueryGetTablesMetaRequest(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, OdbcResponse rsp) throws IOException {
- // Writing status
- writer.writeByte((byte)rsp.getSuccessStatus());
-
- if (rsp.getSuccessStatus() != OdbcResponse.STATUS_SUCCESS) {
- writer.writeString(rsp.getError());
-
- return;
- }
-
- Object res0 = rsp.getResponse();
-
- if (res0 instanceof OdbcQueryExecuteResult) {
- OdbcQueryExecuteResult res = (OdbcQueryExecuteResult) res0;
-
- System.out.println("Resulting query ID: " + res.getQueryId());
-
- writer.writeLong(res.getQueryId());
-
- Collection<OdbcColumnMeta> metas = res.getColumnsMetadata();
-
- assert metas != null;
-
- writer.writeInt(metas.size());
-
- for (OdbcColumnMeta meta : metas)
- meta.writeBinary(writer, marsh.context());
-
- } else if (res0 instanceof OdbcQueryFetchResult) {
- OdbcQueryFetchResult res = (OdbcQueryFetchResult) 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 OdbcQueryCloseResult) {
- OdbcQueryCloseResult res = (OdbcQueryCloseResult) res0;
-
- System.out.println("Resulting query ID: " + res.getQueryId());
-
- writer.writeLong(res.getQueryId());
-
- } else if (res0 instanceof OdbcQueryGetColumnsMetaResult) {
- OdbcQueryGetColumnsMetaResult res = (OdbcQueryGetColumnsMetaResult) res0;
-
- Collection<OdbcColumnMeta> columnsMeta = res.getMeta();
-
- assert columnsMeta != null;
-
- writer.writeInt(columnsMeta.size());
-
- for (OdbcColumnMeta columnMeta : columnsMeta)
- columnMeta.writeBinary(writer, marsh.context());
-
- } else if (res0 instanceof OdbcQueryGetTablesMetaResult) {
- OdbcQueryGetTablesMetaResult res = (OdbcQueryGetTablesMetaResult) res0;
-
- Collection<OdbcTableMeta> tablesMeta = res.getMeta();
-
- assert tablesMeta != null;
-
- writer.writeInt(tablesMeta.size());
-
- for (OdbcTableMeta 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/2a756311/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/protocol/OdbcTcpNioListener.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/protocol/OdbcTcpNioListener.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/protocol/OdbcTcpNioListener.java
deleted file mode 100644
index 656a477..0000000
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/protocol/OdbcTcpNioListener.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.OdbcProtocolHandler;
-import org.apache.ignite.internal.processors.odbc.request.OdbcRequest;
-import org.apache.ignite.internal.processors.odbc.response.OdbcResponse;
-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 OdbcTcpNioListener extends GridNioServerListenerAdapter<OdbcRequest> {
- /** Server. */
- private OdbcTcpServer srv;
-
- /** Logger. */
- protected final IgniteLogger log;
-
- /** Context. */
- protected final GridKernalContext ctx;
-
- /** Protocol handler. */
- private OdbcProtocolHandler hnd;
-
- OdbcTcpNioListener(IgniteLogger log, OdbcTcpServer srv, GridKernalContext ctx, OdbcProtocolHandler 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, OdbcRequest msg) {
- assert msg != null;
-
- System.out.println("Query: " + msg.command());
-
- OdbcResponse res;
-
- try {
- res = hnd.handle(msg);
- }
- catch (IgniteCheckedException e) {
- U.error(log, "Failed to process client request: " + msg, e);
-
- res = new OdbcResponse(OdbcResponse.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);
- }
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/2a756311/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/protocol/OdbcTcpServer.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/protocol/OdbcTcpServer.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/protocol/OdbcTcpServer.java
deleted file mode 100644
index 4fbd326..0000000
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/protocol/OdbcTcpServer.java
+++ /dev/null
@@ -1,191 +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.configuration.ConnectorConfiguration;
-import org.apache.ignite.configuration.IgniteConfiguration;
-import org.apache.ignite.configuration.OdbcConfiguration;
-import org.apache.ignite.internal.GridKernalContext;
-import org.apache.ignite.internal.processors.odbc.OdbcProtocolHandler;
-import org.apache.ignite.internal.processors.odbc.request.OdbcRequest;
-import org.apache.ignite.internal.util.nio.*;
-import org.apache.ignite.internal.util.typedef.internal.U;
-import org.apache.ignite.spi.IgnitePortProtocol;
-
-import java.io.IOException;
-import java.net.InetAddress;
-import java.nio.ByteOrder;
-
-/**
- * TCP server that handles communication with ODBC driver.
- */
-public class OdbcTcpServer {
-
- /** Server. */
- private GridNioServer<OdbcRequest> srv;
-
- /** NIO server listener. */
- private GridNioServerListener<OdbcRequest> lsnr;
-
- /** Logger. */
- protected final IgniteLogger log;
-
- /** Context. */
- protected final GridKernalContext ctx;
-
- /** Host used by this protocol. */
- protected InetAddress host;
-
- /** Port used by this protocol. */
- protected int port;
-
- /** */
- public String name() {
- return "ODBC server";
- }
-
- public OdbcTcpServer(GridKernalContext ctx) {
- assert ctx != null;
- assert ctx.config().getConnectorConfiguration() != null;
-
- this.ctx = ctx;
-
- log = ctx.log(getClass());
- }
-
- @SuppressWarnings("BusyWait")
- public void start(final OdbcProtocolHandler hnd) throws IgniteCheckedException {
- OdbcConfiguration cfg = ctx.config().getOdbcConfiguration();
-
- assert cfg != null;
-
- lsnr = new OdbcTcpNioListener(log, this, ctx, hnd);
-
- GridNioParser parser = new OdbcParser(ctx);
-
- try {
- host = resolveOdbcTcpHost(ctx.config());
-
- int odbcPort = cfg.getPort();
-
- if (startTcpServer(host, odbcPort, lsnr, parser, cfg)) {
- port = odbcPort;
-
- System.out.println("ODBC Server has started on TCP port " + port);
-
- return;
- }
-
- U.warn(log, "Failed to start " + name() + " (possibly all ports in range are in use) " +
- "[odbcPort=" + odbcPort + ", host=" + host + ']');
- }
- catch (IOException e) {
- U.warn(log, "Failed to start " + name() + " on port " + port + ": " + e.getMessage(),
- "Failed to start " + name() + " on port " + port + ". " +
- "Check restTcpHost configuration property.");
- }
- }
-
- /** */
- public void onKernalStart() {
- }
-
- /** */
- public void stop() {
- if (srv != null) {
- ctx.ports().deregisterPorts(getClass());
-
- srv.stop();
- }
- }
-
- /**
- * Resolves host for server using grid configuration.
- *
- * @param cfg Grid configuration.
- * @return Host address.
- * @throws IOException If failed to resolve host.
- */
- private InetAddress resolveOdbcTcpHost(IgniteConfiguration cfg) throws IOException {
- String host = null;
-
- ConnectorConfiguration connectionCfg = cfg.getConnectorConfiguration();
-
- if (connectionCfg != null)
- host = connectionCfg.getHost();
-
- if (host == null)
- host = cfg.getLocalHost();
-
- return U.resolveLocalHost(host);
- }
-
- /**
- * Tries to start server with given parameters.
- *
- * @param hostAddr Host on which server should be bound.
- * @param port Port on which server should be bound.
- * @param lsnr Server message listener.
- * @param parser Server message parser.
- * @param cfg Configuration for other parameters.
- * @return {@code True} if server successfully started, {@code false} if port is used and
- * server was unable to start.
- */
- private boolean startTcpServer(InetAddress hostAddr, int port, GridNioServerListener<OdbcRequest> lsnr,
- GridNioParser parser, OdbcConfiguration cfg) {
- try {
- GridNioFilter codec = new GridNioCodecFilter(parser, log, false);
-
- GridNioFilter[] filters;
-
- filters = new GridNioFilter[] { codec };
-
- srv = GridNioServer.<OdbcRequest>builder()
- .address(hostAddr)
- .port(port)
- .listener(lsnr)
- .logger(log)
- .selectorCount(cfg.getSelectorCount())
- .gridName(ctx.gridName())
- .tcpNoDelay(cfg.isNoDelay())
- .directBuffer(cfg.isDirectBuffer())
- .byteOrder(ByteOrder.nativeOrder())
- .socketSendBufferSize(cfg.getSendBufferSize())
- .socketReceiveBufferSize(cfg.getReceiveBufferSize())
- .sendQueueLimit(cfg.getSendQueueLimit())
- .filters(filters)
- .directMode(false)
- .build();
-
- srv.idleTimeout(cfg.getIdleTimeout());
-
- srv.start();
-
- ctx.ports().registerPort(port, IgnitePortProtocol.TCP, getClass());
-
- return true;
- }
- catch (IgniteCheckedException e) {
- if (log.isDebugEnabled())
- log.debug("Failed to start " + name() + " on port " + port + ": " + e.getMessage());
-
- return false;
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/ignite/blob/2a756311/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/request/OdbcQueryCloseRequest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/request/OdbcQueryCloseRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/request/OdbcQueryCloseRequest.java
deleted file mode 100644
index 8ebcca1..0000000
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/request/OdbcQueryCloseRequest.java
+++ /dev/null
@@ -1,47 +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.request;
-
-/**
- * ODBC query close request.
- */
-public class OdbcQueryCloseRequest extends OdbcRequest {
- /** Query ID. */
- private long queryId;
-
- /**
- * @param queryId Query ID.
- */
- public OdbcQueryCloseRequest(long queryId) {
- super(CLOSE_SQL_QUERY);
- this.queryId = queryId;
- }
-
- /**
- * @param queryId Query ID.
- */
- public void cacheName(long queryId) {
- this.queryId = queryId;
- }
-
- /**
- * @return Query ID.
- */
- public long queryId() {
- return queryId;
- }
-}
\ No newline at end of file