lih пре 3 година
родитељ
комит
636a163de5

BIN
lib/commons-pool2-2.9.0.jar


BIN
lib/jedis-3.6.3.jar


BIN
lib/slf4j-api-1.7.30.jar


BIN
lib/slf4j-simple-1.7.30.jar


+ 36 - 0
src/com/wecise/odb/jdbc/ODBCommandProtocol.java

@@ -0,0 +1,36 @@
+package com.wecise.odb.jdbc;
+
+import redis.clients.jedis.commands.ProtocolCommand;
+import redis.clients.jedis.util.SafeEncoder;
+
+public class ODBCommandProtocol {
+    public enum JDBC implements ProtocolCommand {
+        jdbc;
+
+        private final byte[] raw;
+
+        JDBC() {
+            raw = SafeEncoder.encode(name());
+        }
+
+        @Override
+        public byte[] getRaw() {
+            return raw;
+        }
+    }
+
+    public enum MQL implements ProtocolCommand {
+        mql;
+
+        private final byte[] raw;
+
+        MQL() {
+            raw = SafeEncoder.encode(name());
+        }
+
+        @Override
+        public byte[] getRaw() {
+            return raw;
+        }
+    }
+}

+ 23 - 26
src/com/wecise/odb/jdbc/ODBConnection.java

@@ -1,11 +1,9 @@
 package com.wecise.odb.jdbc;
 
-import com.wecise.odb.Connector;
 import com.wecise.odb.Error;
 import com.wecise.odb.ObjectPool;
+import redis.clients.jedis.Jedis;
 
-import java.io.IOException;
-import java.net.Socket;
 import java.sql.*;
 import java.util.ArrayList;
 import java.util.Map;
@@ -15,7 +13,7 @@ import java.util.concurrent.Executor;
 public class ODBConnection implements Connection {
     private String address;
     private String keyspace;
-    private Connector[] connectors;
+    private Jedis[] connectors;
     private ObjectPool pool;
     private boolean autoCommit = false;
     private boolean closed = false;
@@ -25,48 +23,47 @@ public class ODBConnection implements Connection {
         this.address = address;
         this.keyspace = keyspace;
         String[] cluster = address.split(",");
-        connectors = new Connector[cluster.length * numConns];
+        connectors = new Jedis[cluster.length * numConns];
         int num = 0;
         for (String c: cluster) {
             String[] a = c.split(":");
             String host = a[0];
-            int port = 9062;
+            int port = 11001;
             if (a.length > 1) {
                 port = Integer.parseInt(a[1]);
             }
-            try {
-                for (int k = 0; k < numConns; k++) {
-                    Connector ctr = new Connector(new Socket(host, port));
-                    new Thread(ctr).start();
-                    this.connectors[num] = ctr;
-                    num++;
+            for (int k = 0; k < numConns; k++) {
+                Jedis jc = new Jedis(host, port);
+                String s = jc.ping();
+                if (!"PONG".equals(s)) {
+                    throw new SQLException("Unable to connect to " + host + ":" + port + ", no PONG message received");
                 }
-            } catch (IOException e) {
-                throw new SQLException(e.toString());
+                this.connectors[num] = jc;
+                num++;
             }
         }
         this.pool = new ObjectPool(connectors);
     }
 
-    public Connector getConnector() {
-        Connector ctr;
-        ArrayList<Connector> offlineSockets = new ArrayList<>();
+    public Jedis getConnector() {
+        Jedis conn;
+        ArrayList<Jedis> offlineSockets = new ArrayList<>();
         while (true) {
-            ctr = (Connector) this.pool.get();
-            if (ctr.isAlive()) {
+            conn = (Jedis) this.pool.get();
+            if (conn.isConnected()) {
                 break;
             } else {
-                offlineSockets.add(ctr);
+                offlineSockets.add(conn);
             }
         }
-        for (Connector offctr: offlineSockets) {
-            releaseConnector(offctr);
+        for (Jedis jc: offlineSockets) {
+            releaseConnector(jc);
         }
 
-        return ctr;
+        return conn;
     }
 
-    public void releaseConnector(Connector socket) {
+    public void releaseConnector(Jedis socket) {
         this.pool.release(socket);
     }
 
@@ -114,8 +111,8 @@ public class ODBConnection implements Connection {
     public void close() throws SQLException {
         if (!this.closed) {
             this.pool.closeObjectPool();
-            for (Connector c: this.connectors) {
-                if (!c.isClosed()) {
+            for (Jedis c: this.connectors) {
+                if (c.isConnected()) {
                     c.close();
                 }
             }

+ 11 - 13
src/com/wecise/odb/jdbc/ODBDatabaseMetaData.java

@@ -1,9 +1,9 @@
 package com.wecise.odb.jdbc;
 
 import com.google.gson.Gson;
-import com.wecise.odb.Connector;
 import com.wecise.odb.Error;
 import com.wecise.odb.Message;
+import redis.clients.jedis.Jedis;
 
 import java.sql.*;
 import java.util.ArrayList;
@@ -619,7 +619,7 @@ public class ODBDatabaseMetaData implements DatabaseMetaData {
 
     @Override
     public ResultSet getTables(String catalog, String schem, String tableNamePattern, String[] type) throws SQLException {
-        Connector ctr = ((ODBConnection)this.connection).getConnector();
+        Jedis ctr = ((ODBConnection)this.connection).getConnector();
         try {
             HashMap<String, Object> body = new HashMap<>();
             body.put("keyspace", ((ODBConnection)this.connection).getKeyspace());
@@ -628,12 +628,11 @@ public class ODBDatabaseMetaData implements DatabaseMetaData {
             body.put("tablename", tableNamePattern);
             body.put("type", type);
 
-            Message recvmsg = ctr.request("/odb/system/tables", new Gson().toJson(body));
-            if (recvmsg == null) {
-                throw new SQLException(Error.unableConnectServer);
-            }
+            Object o = ctr.sendCommand(ODBCommandProtocol.JDBC.jdbc, "tables", new Gson().toJson(body));
+            String recvmsg = new String((byte[]) o);
+
             Gson gs = new Gson();
-            Map recvBody = gs.fromJson(recvmsg.getBody(), Map.class); // {message:{data:[...],meta:{...}}, status:""}
+            Map recvBody = gs.fromJson(recvmsg, Map.class); // {message:{data:[...],meta:{...}}, status:""}
             String status = recvBody.get("status").toString();
             if (status.equals("success")) {
                 Map msg = (Map) recvBody.get("message");
@@ -735,7 +734,7 @@ public class ODBDatabaseMetaData implements DatabaseMetaData {
 
     @Override
     public ResultSet getColumns(String catalog, String schemaPattern, String tableNamePattern, String columnNamePattern) throws SQLException {
-        Connector ctr = ((ODBConnection)this.connection).getConnector();
+        Jedis ctr = ((ODBConnection)this.connection).getConnector();
         try {
             HashMap<String, Object> body = new HashMap<>();
             body.put("keyspace", ((ODBConnection)this.connection).getKeyspace());
@@ -744,12 +743,11 @@ public class ODBDatabaseMetaData implements DatabaseMetaData {
             body.put("tablename", tableNamePattern);
             body.put("column", columnNamePattern);
 
-            Message recvmsg = ctr.request("/odb/system/columns", new Gson().toJson(body));
-            if (recvmsg == null) {
-                throw new SQLException(Error.unableConnectServer);
-            }
+            Object o = ctr.sendCommand(ODBCommandProtocol.JDBC.jdbc, "columns", new Gson().toJson(body));
+            String recvmsg = new String((byte[]) o);
+
             Gson gs = new Gson();
-            Map recvBody = gs.fromJson(recvmsg.getBody(), Map.class); // {message:{data:[...],meta:{...}}, status:""}
+            Map recvBody = gs.fromJson(recvmsg, Map.class); // {message:{data:[...],meta:{...}}, status:""}
             String status = recvBody.get("status").toString();
             if (status.equals("success")) {
                 Map msg = (Map) recvBody.get("message");

+ 1 - 0
src/com/wecise/odb/jdbc/ODBDriver.java

@@ -2,6 +2,7 @@ package com.wecise.odb.jdbc;
 
 import com.wecise.odb.Error;
 
+import java.io.IOException;
 import java.sql.*;
 import java.util.Properties;
 import java.util.logging.Logger;

+ 17 - 12
src/com/wecise/odb/jdbc/ODBStatement.java

@@ -1,9 +1,9 @@
 package com.wecise.odb.jdbc;
 
 import com.google.gson.Gson;
-import com.wecise.odb.Connector;
 import com.wecise.odb.Error;
 import com.wecise.odb.Message;
+import redis.clients.jedis.Jedis;
 
 import java.sql.*;
 import java.util.ArrayList;
@@ -23,22 +23,27 @@ public class ODBStatement implements Statement {
         this.batch = new ArrayList<>();
     }
 
-    protected void exec(String s, Object[] values) throws SQLException {
-        Connector ctr = ((ODBConnection)this.conn).getConnector();
+    protected void exec(String sql, Object[] values) throws SQLException {
+        Jedis ctr = ((ODBConnection)this.conn).getConnector();
 //        System.out.println(ctr.getSocket().getRemoteSocketAddress());
         try {
-            HashMap<String, Object> body = new HashMap<>();
-            body.put("keyspace", ((ODBConnection)this.conn).getKeyspace());
-            body.put("stmt", s);
+//            HashMap<String, Object> body = new HashMap<>();
+//            body.put("keyspace", ((ODBConnection)this.conn).getKeyspace());
+//            body.put("stmt", sql);
+//            if (values != null && values.length > 0) {
+//                body.put("values", values);
+//            }
+
+            String valsJson = "[]";
             if (values != null && values.length > 0) {
-                body.put("values", values);
-            }
-            Message recvmsg = ctr.request("/data/mql/execute", new Gson().toJson(body));
-            if (recvmsg == null) {
-                throw new SQLException(Error.unableConnectServer);
+                valsJson = new Gson().toJson(values);
             }
+
+            Object o = ctr.sendCommand(ODBCommandProtocol.MQL.mql, sql, "meta", valsJson);
+            String recvmsg = new String((byte[]) o);
+
             Gson gs = new Gson();
-            Map recvBody = gs.fromJson(recvmsg.getBody(), Map.class); // {message:{data:[...],meta:{...}}, status:""}
+            Map recvBody = gs.fromJson(recvmsg, Map.class); // {message:{data:[...],meta:{...}}, status:""}
             String status = recvBody.get("status").toString();
             if (status.equals("success")) {
                 Map msg = (Map) recvBody.get("message");

+ 26 - 1
src/com/wecise/odb/test/Test.java

@@ -1,18 +1,43 @@
 package com.wecise.odb.test;
 
+import com.wecise.odb.jdbc.ODBCommandProtocol;
 import com.wecise.odb.table.SimpleConsoleTable;
+import redis.clients.jedis.HostAndPort;
+import redis.clients.jedis.Jedis;
+import redis.clients.jedis.JedisCluster;
+import redis.clients.jedis.commands.ProtocolCommand;
+import redis.clients.jedis.util.SafeEncoder;
 
 import java.sql.*;
 import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.Set;
 
 public class Test {
+
     public static void main(String[] args) throws Exception {
+//        Jedis jc = new Jedis("47.92.151.165", 11001);
+//        String pong = jc.ping();
+//        System.out.println(pong);
+//        Object o = jc.sendCommand(ODBCommandProtocol.MQL.mql, "select id from /matrix/devops/ limit 1", "meta");
+//        String s = new String((byte[]) o);
+//        System.out.println(s);
+
+//        Set<HostAndPort> jedisClusterNodes = new HashSet<>();
+//        //Jedis Cluster will attempt to discover cluster nodes automatically
+//        jedisClusterNodes.add(new HostAndPort("47.92.151.165", 11001));
+//        JedisCluster jc = new JedisCluster(jedisClusterNodes);
+//        jc.sendCommand("mql", ODBCommandProtocol.MQL.mql, "select id from /matrix/devops/ limit 1");
+
+//        System.exit(0);
+
         test(false);
         System.out.println("JDBC Test");
 
         Class.forName("com.wecise.odb.jdbc.ODBDriver");
 //        Connection conn = DriverManager.getConnection("jdbc:wecise:omdb://192.168.31.221,127.0.0.1:9062/matrix");
-        Connection conn = DriverManager.getConnection("jdbc:wecise:omdb://47.92.151.165:9062/matrix");
+//        Connection conn = DriverManager.getConnection("jdbc:wecise:omdb://47.92.151.165:9062/matrix");
+        Connection conn = DriverManager.getConnection("jdbc:wecise:omdb://47.92.151.165:11001/matrix");
 
         System.out.println("Meta info:");
         printMetaData(conn.getMetaData());