From 7a58c3f19fd321932fa99d8122d00f788c9a7a02 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B8=A9=E5=B0=91?= Date: Mon, 21 May 2012 05:10:13 +0800 Subject: [PATCH] hbase support --- .../druid/common/jdbc/LocalResultSet.java | 59 ++++++++++ .../druid/common/jdbc/ResultSetBase.java | 34 ++++-- .../alibaba/druid/hbase/HBaseResultSet.java | 10 +- .../java/com/alibaba/druid/hbase/HEngine.java | 6 + .../druid/hbase/HPreparedStatement.java | 3 + .../com/alibaba/druid/hbase/HResultSet.java | 8 ++ .../alibaba/druid/hbase/exec/ExecutePlan.java | 4 +- .../druid/hbase/exec/ExecutePlanAdapter.java | 4 +- .../druid/hbase/exec/ShowTablesPlan.java | 103 ++++++++++++++++++ .../com/alibaba/druid/mock/MockResultSet.java | 7 +- 10 files changed, 216 insertions(+), 22 deletions(-) create mode 100644 src/main/java/com/alibaba/druid/common/jdbc/LocalResultSet.java create mode 100644 src/main/java/com/alibaba/druid/hbase/HResultSet.java create mode 100644 src/main/java/com/alibaba/druid/hbase/exec/ShowTablesPlan.java diff --git a/src/main/java/com/alibaba/druid/common/jdbc/LocalResultSet.java b/src/main/java/com/alibaba/druid/common/jdbc/LocalResultSet.java new file mode 100644 index 0000000000..42227c31c5 --- /dev/null +++ b/src/main/java/com/alibaba/druid/common/jdbc/LocalResultSet.java @@ -0,0 +1,59 @@ +package com.alibaba.druid.common.jdbc; + +import java.sql.SQLException; +import java.sql.Statement; +import java.util.ArrayList; +import java.util.List; + +public class LocalResultSet extends ResultSetBase { + + private int rowIndex = -1; + private List rows = new ArrayList(); + + public LocalResultSet(Statement statement){ + super(statement); + } + + public List getRows() { + return rows; + } + + @Override + public synchronized boolean next() throws SQLException { + if (closed) { + throw new SQLException(); + } + + if (rowIndex < rows.size() - 1) { + rowIndex++; + return true; + } + return false; + } + + public Object getObjectInternal(int columnIndex) { + Object[] row = rows.get(rowIndex); + Object obj = row[columnIndex - 1]; + return obj; + } + + @Override + public synchronized boolean previous() throws SQLException { + if (closed) { + throw new SQLException(); + } + + if (rowIndex > 0) { + rowIndex--; + return true; + } + return false; + } + + @Override + public void updateObject(int columnIndex, Object x) throws SQLException { + Object[] row = rows.get(rowIndex); + row[columnIndex - 1] = x; + } + +} diff --git a/src/main/java/com/alibaba/druid/common/jdbc/ResultSetBase.java b/src/main/java/com/alibaba/druid/common/jdbc/ResultSetBase.java index ccff396c44..8dc5ac146c 100644 --- a/src/main/java/com/alibaba/druid/common/jdbc/ResultSetBase.java +++ b/src/main/java/com/alibaba/druid/common/jdbc/ResultSetBase.java @@ -11,6 +11,7 @@ import java.sql.Date; import java.sql.NClob; import java.sql.Ref; import java.sql.ResultSet; +import java.sql.ResultSetMetaData; import java.sql.RowId; import java.sql.SQLException; import java.sql.SQLFeatureNotSupportedException; @@ -24,14 +25,15 @@ import java.util.Map; public abstract class ResultSetBase implements ResultSet { - protected boolean closed = false; - protected boolean wasNull = false; - private SQLWarning warning; - private String cursorName; - private int fetchSize = 0; - private int fetchDirection = 0; + protected boolean closed = false; + protected boolean wasNull = false; + private SQLWarning warning; + private String cursorName; + private int fetchSize = 0; + private int fetchDirection = 0; - private Statement statement; + private Statement statement; + protected ResultSetMetaData metaData; public ResultSetBase(Statement statement){ super(); @@ -302,7 +304,14 @@ public abstract class ResultSetBase implements ResultSet { return wasNull; } - public abstract Object getObjectInternal(int columnIndex) throws SQLException; + public Object getObjectInternal(int columnIndex) throws SQLException { + if (this.getMetaData() != null) { + String columName = this.getMetaData().getColumnName(columnIndex); + return getObject(columName); + } + + return null; + } @Override public Object getObject(int columnIndex) throws SQLException { @@ -1157,4 +1166,13 @@ public abstract class ResultSetBase implements ResultSet { return 0; } + + @Override + public ResultSetMetaData getMetaData() throws SQLException { + if (closed) { + throw new SQLException("resultSet closed"); + } + + return metaData; + } } diff --git a/src/main/java/com/alibaba/druid/hbase/HBaseResultSet.java b/src/main/java/com/alibaba/druid/hbase/HBaseResultSet.java index 7a2f72cfc6..b88542bb3b 100644 --- a/src/main/java/com/alibaba/druid/hbase/HBaseResultSet.java +++ b/src/main/java/com/alibaba/druid/hbase/HBaseResultSet.java @@ -16,7 +16,7 @@ import com.alibaba.druid.common.jdbc.ResultSetMetaDataBase.ColumnMetaData; import com.alibaba.druid.hbase.mapping.HMapping; import com.alibaba.druid.util.JdbcUtils; -public class HBaseResultSet extends ResultSetBase { +public class HBaseResultSet extends ResultSetBase implements HResultSet { private HStatementInterface statement; private ResultScanner scanner; @@ -24,8 +24,6 @@ public class HBaseResultSet extends ResultSetBase { private Result result; private byte[] family = Bytes.toBytes("d"); - private HResultSetMetaData metaData; - private HMapping mapping; public HBaseResultSet(HStatementInterface statement, HTableInterface htable, ResultScanner scanner){ @@ -60,7 +58,7 @@ public class HBaseResultSet extends ResultSetBase { @Override public HResultSetMetaData getMetaData() throws SQLException { - return metaData; + return (HResultSetMetaData) metaData; } public void setMetaData(HResultSetMetaData metaData) { @@ -78,7 +76,7 @@ public class HBaseResultSet extends ResultSetBase { @Override public Object getObjectInternal(int columnIndex) throws SQLException { - ColumnMetaData column = this.metaData.getColumn(columnIndex); + ColumnMetaData column = this.getMetaData().getColumn(columnIndex); return getObjectInternal(column.getColumnName(), column.getColumnType()); } @@ -129,7 +127,7 @@ public class HBaseResultSet extends ResultSetBase { @Override public byte[] getBytes(int columnIndex) throws SQLException { - ColumnMetaData column = this.metaData.getColumn(columnIndex); + ColumnMetaData column = this.getMetaData().getColumn(columnIndex); return getBytes(column.getColumnName()); } diff --git a/src/main/java/com/alibaba/druid/hbase/HEngine.java b/src/main/java/com/alibaba/druid/hbase/HEngine.java index 2b0bf580a8..f4adbb699c 100644 --- a/src/main/java/com/alibaba/druid/hbase/HEngine.java +++ b/src/main/java/com/alibaba/druid/hbase/HEngine.java @@ -1,10 +1,12 @@ package com.alibaba.druid.hbase; +import java.io.IOException; import java.util.Properties; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; import org.apache.hadoop.conf.Configuration; +import org.apache.hadoop.hbase.client.HBaseAdmin; import org.apache.hadoop.hbase.client.HTableInterface; import org.apache.hadoop.hbase.client.HTablePool; @@ -77,5 +79,9 @@ public class HEngine { } return tablePool.getTable(tableName); } + + public HBaseAdmin getHBaseAdmin() throws IOException { + return new HBaseAdmin(this.config); + } } diff --git a/src/main/java/com/alibaba/druid/hbase/HPreparedStatement.java b/src/main/java/com/alibaba/druid/hbase/HPreparedStatement.java index 8d1a1bf6e5..7f3392e52e 100644 --- a/src/main/java/com/alibaba/druid/hbase/HPreparedStatement.java +++ b/src/main/java/com/alibaba/druid/hbase/HPreparedStatement.java @@ -11,6 +11,7 @@ import com.alibaba.druid.common.jdbc.ResultSetMetaDataBase.ColumnMetaData; import com.alibaba.druid.hbase.exec.ExecutePlan; import com.alibaba.druid.hbase.exec.InsertExecutePlan; import com.alibaba.druid.hbase.exec.SingleTableQueryExecutePlan; +import com.alibaba.druid.hbase.hbql.ast.HBQLShowStatement; import com.alibaba.druid.sql.SQLUtils; import com.alibaba.druid.sql.ast.SQLExpr; import com.alibaba.druid.sql.ast.SQLStatement; @@ -113,6 +114,8 @@ public class HPreparedStatement extends PreparedStatementBase implements Prepare } this.executePlan = insertExecutePlan; + } else if (sqlStmt instanceof HBQLShowStatement) { + } else { throw new SQLException("TODO"); } diff --git a/src/main/java/com/alibaba/druid/hbase/HResultSet.java b/src/main/java/com/alibaba/druid/hbase/HResultSet.java new file mode 100644 index 0000000000..b9671ebbd8 --- /dev/null +++ b/src/main/java/com/alibaba/druid/hbase/HResultSet.java @@ -0,0 +1,8 @@ +package com.alibaba.druid.hbase; + +import java.sql.ResultSet; + + +public interface HResultSet extends ResultSet { + +} diff --git a/src/main/java/com/alibaba/druid/hbase/exec/ExecutePlan.java b/src/main/java/com/alibaba/druid/hbase/exec/ExecutePlan.java index 8439addcac..be7e9b34be 100644 --- a/src/main/java/com/alibaba/druid/hbase/exec/ExecutePlan.java +++ b/src/main/java/com/alibaba/druid/hbase/exec/ExecutePlan.java @@ -3,11 +3,11 @@ package com.alibaba.druid.hbase.exec; import java.sql.SQLException; import com.alibaba.druid.hbase.HPreparedStatement; -import com.alibaba.druid.hbase.HBaseResultSet; +import com.alibaba.druid.hbase.HResultSet; public interface ExecutePlan { - HBaseResultSet executeQuery(HPreparedStatement statement) throws SQLException; + HResultSet executeQuery(HPreparedStatement statement) throws SQLException; boolean execute(HPreparedStatement statement) throws SQLException; } diff --git a/src/main/java/com/alibaba/druid/hbase/exec/ExecutePlanAdapter.java b/src/main/java/com/alibaba/druid/hbase/exec/ExecutePlanAdapter.java index bcd30d9caf..398992ac02 100644 --- a/src/main/java/com/alibaba/druid/hbase/exec/ExecutePlanAdapter.java +++ b/src/main/java/com/alibaba/druid/hbase/exec/ExecutePlanAdapter.java @@ -3,12 +3,12 @@ package com.alibaba.druid.hbase.exec; import java.sql.SQLException; import com.alibaba.druid.hbase.HPreparedStatement; -import com.alibaba.druid.hbase.HBaseResultSet; +import com.alibaba.druid.hbase.HResultSet; public class ExecutePlanAdapter implements ExecutePlan { @Override - public HBaseResultSet executeQuery(HPreparedStatement statement) throws SQLException { + public HResultSet executeQuery(HPreparedStatement statement) throws SQLException { throw new UnsupportedOperationException(); } diff --git a/src/main/java/com/alibaba/druid/hbase/exec/ShowTablesPlan.java b/src/main/java/com/alibaba/druid/hbase/exec/ShowTablesPlan.java new file mode 100644 index 0000000000..efcc9a4f39 --- /dev/null +++ b/src/main/java/com/alibaba/druid/hbase/exec/ShowTablesPlan.java @@ -0,0 +1,103 @@ +package com.alibaba.druid.hbase.exec; + +import java.sql.SQLException; +import java.sql.Statement; + +import org.apache.hadoop.hbase.HColumnDescriptor; +import org.apache.hadoop.hbase.HTableDescriptor; +import org.apache.hadoop.hbase.client.HBaseAdmin; + +import com.alibaba.druid.common.jdbc.ResultSetBase; +import com.alibaba.druid.hbase.HPreparedStatement; +import com.alibaba.druid.hbase.HResultSet; + +public class ShowTablesPlan implements ExecutePlan { + + @Override + public HResultSet executeQuery(HPreparedStatement statement) throws SQLException { + try { + HBaseAdmin admin = statement.getConnection().getEngine().getHBaseAdmin(); + + HTableDescriptor[] tables = admin.listTables(); + + return new ShowTableResultSet(statement, tables); + } catch (SQLException e) { + throw e; + } catch (Exception e) { + throw new SQLException("executeQuery error", e); + } + } + + @Override + public boolean execute(HPreparedStatement statement) throws SQLException { + HResultSet resultSet = executeQuery(statement); + statement.setResultSet(resultSet); + return true; + } + + public static class ShowTableResultSet extends ResultSetBase implements HResultSet { + + private final HTableDescriptor[] tables; + private int rowIndex = -1; + + public ShowTableResultSet(Statement statement, HTableDescriptor[] tables){ + super(statement); + this.tables = tables; + } + + @Override + public synchronized boolean next() throws SQLException { + if (closed) { + throw new SQLException(); + } + + if (rowIndex < tables.length - 1) { + rowIndex++; + return true; + } + return false; + } + + @Override + public synchronized boolean previous() throws SQLException { + if (closed) { + throw new SQLException(); + } + + if (rowIndex > 0) { + rowIndex--; + return true; + } + return false; + } + + public Object getObject(String columnName) { + HTableDescriptor table = tables[rowIndex]; + + if ("name".equals(columnName)) { + return table.getNameAsString(); + } + + if ("owner".equals(columnName)) { + return table.getOwnerString(); + } + + if ("familys".equals(columnName)) { + StringBuffer buf = new StringBuffer(); + for (HColumnDescriptor column : table.getFamilies()) { + if (buf.length() != 0) { + buf.append(','); + } + buf.append(column.getNameAsString()); + } + return buf.toString(); + } + + return null; + } + + @Override + public void updateObject(int columnIndex, Object x) throws SQLException { + } + } +} diff --git a/src/main/java/com/alibaba/druid/mock/MockResultSet.java b/src/main/java/com/alibaba/druid/mock/MockResultSet.java index a4286f6ebf..435e53e116 100644 --- a/src/main/java/com/alibaba/druid/mock/MockResultSet.java +++ b/src/main/java/com/alibaba/druid/mock/MockResultSet.java @@ -29,10 +29,9 @@ public class MockResultSet extends ResultSetBase implements ResultSet { private int rowIndex = -1; private List rows = new ArrayList(); - private MockResultSetMetaData metaData = new MockResultSetMetaData(); - public MockResultSet(Statement statement){ super(statement); + super.metaData = new MockResultSetMetaData(); } public List getRows() { @@ -59,11 +58,11 @@ public class MockResultSet extends ResultSetBase implements ResultSet { throw new SQLException("resultSet closed"); } - return metaData; + return (MockResultSetMetaData) metaData; } public MockResultSetMetaData getMockMetaData() throws SQLException { - return metaData; + return (MockResultSetMetaData) metaData; } public Object getObjectInternal(int columnIndex) {