From d0c417774f18a16da1d680cce8bd637fb56afa64 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B8=A9=E5=B0=91?= Date: Fri, 18 May 2012 22:05:30 +0800 Subject: [PATCH] hbase support --- .../alibaba/druid/hbase/HBaseConnection.java | 18 ++++++++++++- .../com/alibaba/druid/hbase/HBaseDriver.java | 17 ++++++++---- .../druid/hbase/HBasePreparedStatement.java | 10 ++++--- .../java/com/alibaba/druid/sql/SQLUtils.java | 7 ++++- .../alibaba/druid/hbase/HBaseConnectTest.java | 14 +++++----- .../alibaba/druid/hbase/HBaseDriverTest.java | 26 +++++++++++++++++++ src/test/resources/log4j.properties | 1 + 7 files changed, 75 insertions(+), 18 deletions(-) create mode 100644 src/test/java/com/alibaba/druid/hbase/HBaseDriverTest.java diff --git a/src/main/java/com/alibaba/druid/hbase/HBaseConnection.java b/src/main/java/com/alibaba/druid/hbase/HBaseConnection.java index 4249fb6aec..54fd17dd90 100644 --- a/src/main/java/com/alibaba/druid/hbase/HBaseConnection.java +++ b/src/main/java/com/alibaba/druid/hbase/HBaseConnection.java @@ -8,6 +8,7 @@ import java.sql.Connection; import java.sql.DatabaseMetaData; import java.sql.NClob; import java.sql.PreparedStatement; +import java.sql.ResultSet; import java.sql.SQLClientInfoException; import java.sql.SQLException; import java.sql.SQLFeatureNotSupportedException; @@ -15,12 +16,15 @@ import java.sql.SQLXML; import java.sql.Savepoint; import java.sql.Statement; import java.sql.Struct; +import java.util.List; import java.util.Map; import java.util.Properties; import org.apache.hadoop.conf.Configuration; import com.alibaba.druid.common.jdbc.ConnectionBase; +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.sql.ast.SQLStatement; public class HBaseConnection extends ConnectionBase implements Connection { @@ -28,7 +32,7 @@ public class HBaseConnection extends ConnectionBase implements Connection { public HBaseConnection(String url, Properties info){ super(url, info); - config = new Configuration(); + config = new Configuration(false); this.setClientInfo(info); } @@ -234,4 +238,16 @@ public class HBaseConnection extends ConnectionBase implements Connection { return null; } + public ResultSet executeQuery(String sql, List parameters) throws SQLException { + String dbType = this.getConnectProperties().getProperty("dbType"); + List stmtList = SQLUtils.parseStatements(sql, dbType); + + if (stmtList.size() != 1) { + throw new SQLException("not support multi-statement"); + } + + SQLStatement stmt = stmtList.get(0); + + throw new SQLException("TODO"); + } } diff --git a/src/main/java/com/alibaba/druid/hbase/HBaseDriver.java b/src/main/java/com/alibaba/druid/hbase/HBaseDriver.java index 430a936b0d..4fa5951148 100644 --- a/src/main/java/com/alibaba/druid/hbase/HBaseDriver.java +++ b/src/main/java/com/alibaba/druid/hbase/HBaseDriver.java @@ -1,6 +1,5 @@ package com.alibaba.druid.hbase; -import java.sql.Connection; import java.sql.Driver; import java.sql.DriverPropertyInfo; import java.sql.SQLException; @@ -8,10 +7,18 @@ import java.util.Properties; public class HBaseDriver implements Driver { - private String prefix = "jdbc:druid-hbase:"; + public static String PREFIX = "jdbc:druid-hbase:"; @Override - public Connection connect(String url, Properties info) throws SQLException { + public HBaseConnection connect(String url, Properties info) throws SQLException { + if (!acceptsURL(url)) { + return null; + } + + String rest = url.substring(PREFIX.length()); + + info.put("hbase.zookeeper.quorum", rest); + return new HBaseConnection(url, info); } @@ -20,8 +27,8 @@ public class HBaseDriver implements Driver { if (url == null) { return false; } - - return url.startsWith(prefix); + + return url.startsWith(PREFIX); } @Override diff --git a/src/main/java/com/alibaba/druid/hbase/HBasePreparedStatement.java b/src/main/java/com/alibaba/druid/hbase/HBasePreparedStatement.java index d804e4d44b..790d9106a8 100644 --- a/src/main/java/com/alibaba/druid/hbase/HBasePreparedStatement.java +++ b/src/main/java/com/alibaba/druid/hbase/HBasePreparedStatement.java @@ -8,12 +8,15 @@ import com.alibaba.druid.common.jdbc.PreparedStatementBase; public class HBasePreparedStatement extends PreparedStatementBase implements PreparedStatement { - private final String sql; - private String[] columnNames; + private final String sql; + private String[] columnNames; + + private HBaseConnection hbaseConnection; public HBasePreparedStatement(HBaseConnection conn, String sql){ super(conn); this.sql = sql; + this.hbaseConnection = conn; } public String[] getColumnNames() { @@ -30,8 +33,7 @@ public class HBasePreparedStatement extends PreparedStatementBase implements Pre @Override public ResultSet executeQuery() throws SQLException { - // TODO Auto-generated method stub - return null; + return hbaseConnection.executeQuery(sql, getParameters()); } @Override diff --git a/src/main/java/com/alibaba/druid/sql/SQLUtils.java b/src/main/java/com/alibaba/druid/sql/SQLUtils.java index 106a405772..e4ec8c620a 100644 --- a/src/main/java/com/alibaba/druid/sql/SQLUtils.java +++ b/src/main/java/com/alibaba/druid/sql/SQLUtils.java @@ -2,6 +2,7 @@ package com.alibaba.druid.sql; import java.util.List; +import com.alibaba.druid.DruidRuntimeException; import com.alibaba.druid.sql.ast.SQLExpr; import com.alibaba.druid.sql.ast.SQLObject; import com.alibaba.druid.sql.ast.SQLStatement; @@ -146,6 +147,10 @@ public class SQLUtils { public static List parseStatements(String sql, String dbType) { SQLStatementParser parser = SQLParserUtils.createSQLStatementParser(sql, dbType); - return parser.parseStatementList(); + List stmtList = parser.parseStatementList(); + if (parser.getLexer().token() != Token.EOF) { + throw new DruidRuntimeException("syntax error : " + sql); + } + return stmtList; } } diff --git a/src/test/java/com/alibaba/druid/hbase/HBaseConnectTest.java b/src/test/java/com/alibaba/druid/hbase/HBaseConnectTest.java index 3203ee2b4a..bdf6a67a9d 100644 --- a/src/test/java/com/alibaba/druid/hbase/HBaseConnectTest.java +++ b/src/test/java/com/alibaba/druid/hbase/HBaseConnectTest.java @@ -11,14 +11,14 @@ public class HBaseConnectTest extends TestCase { public void test_connection() throws Exception { Configuration config = new Configuration();//HBaseConfiguration.create(); - config.set("dfs.support.append", "true"); - config.set("hbase.rootdir", "hdfs://10.20.153.63:9000/hbase"); - config.set("hbase.cluster.distributed", "true"); - config.set("hbase.master", "10.20.153.63:60000"); +// config.set("dfs.support.append", "true"); +// config.set("hbase.rootdir", "hdfs://10.20.153.63:9000/hbase"); +// config.set("hbase.cluster.distributed", "true"); +// config.set("hbase.master", "10.20.153.63:60000"); config.set("hbase.zookeeper.quorum", "10.20.153.63"); - config.set("zookeeper.session.timeout", "30000"); - config.set("hbase.regionserver.handler.count", "100"); - config.set("hbase.client.keyvalue.maxsize", "67108864"); +// config.set("zookeeper.session.timeout", "30000"); +// config.set("hbase.regionserver.handler.count", "100"); +// config.set("hbase.client.keyvalue.maxsize", "67108864"); // config = HBaseConfiguration.create(); diff --git a/src/test/java/com/alibaba/druid/hbase/HBaseDriverTest.java b/src/test/java/com/alibaba/druid/hbase/HBaseDriverTest.java new file mode 100644 index 0000000000..099935729a --- /dev/null +++ b/src/test/java/com/alibaba/druid/hbase/HBaseDriverTest.java @@ -0,0 +1,26 @@ +package com.alibaba.druid.hbase; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.util.Properties; + +import junit.framework.TestCase; + + +public class HBaseDriverTest extends TestCase { + public void test_0 () throws Exception { + HBaseDriver driver = new HBaseDriver(); + Connection conn = driver.connect("jdbc:druid-hbase::10.20.153.63", new Properties()); + + PreparedStatement stmt = conn.prepareStatement("SELECT * FROM test"); + ResultSet rs = stmt.executeQuery(); + while (rs.next()) { + + } + rs.close(); + stmt.close(); + + conn.close(); + } +} diff --git a/src/test/resources/log4j.properties b/src/test/resources/log4j.properties index 7fb1ab6b07..f897cf40e9 100644 --- a/src/test/resources/log4j.properties +++ b/src/test/resources/log4j.properties @@ -27,5 +27,6 @@ log4j.category.org.codehaus.xfire=INFO log4j.category.httpclient=INFO log4j.category.org.apache.struts.action.ActionServlet=ERROR log4j.category.com.alibaba.druid.mock=ERROR +log4j.category.org.apache.hadoop.conf.Configuration=INFO log4j.rootLogger=TRACE,CONSOLE