hbase support

This commit is contained in:
温少
2012-05-21 05:10:13 +08:00
parent 647fc890aa
commit 7a58c3f19f
10 changed files with 216 additions and 22 deletions
@@ -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<Object[]> rows = new ArrayList<Object[]>();
public LocalResultSet(Statement statement){
super(statement);
}
public List<Object[]> 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;
}
}
@@ -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;
}
}
@@ -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());
}
@@ -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);
}
}
@@ -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");
}
@@ -0,0 +1,8 @@
package com.alibaba.druid.hbase;
import java.sql.ResultSet;
public interface HResultSet extends ResultSet {
}
@@ -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;
}
@@ -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();
}
@@ -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 {
}
}
}
@@ -29,10 +29,9 @@ public class MockResultSet extends ResultSetBase implements ResultSet {
private int rowIndex = -1;
private List<Object[]> rows = new ArrayList<Object[]>();
private MockResultSetMetaData metaData = new MockResultSetMetaData();
public MockResultSet(Statement statement){
super(statement);
super.metaData = new MockResultSetMetaData();
}
public List<Object[]> 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) {