提交 660b089f 编写于 作者: F Frankie Wu

remove the old handlers

上级 102af371
...@@ -11,7 +11,6 @@ import com.dianping.bee.engine.spi.RowFilter; ...@@ -11,7 +11,6 @@ import com.dianping.bee.engine.spi.RowFilter;
import com.dianping.bee.engine.spi.SingleTableStatement; import com.dianping.bee.engine.spi.SingleTableStatement;
import com.dianping.bee.engine.spi.StatementManager; import com.dianping.bee.engine.spi.StatementManager;
import com.dianping.bee.engine.spi.TableProviderManager; import com.dianping.bee.engine.spi.TableProviderManager;
import com.dianping.bee.engine.spi.handler.internal.DefaultServerQueryHandler;
import com.dianping.bee.engine.spi.handler.internal.DescHandler; import com.dianping.bee.engine.spi.handler.internal.DescHandler;
import com.dianping.bee.engine.spi.handler.internal.SelectHandler; import com.dianping.bee.engine.spi.handler.internal.SelectHandler;
import com.dianping.bee.engine.spi.handler.internal.ShowHandler; import com.dianping.bee.engine.spi.handler.internal.ShowHandler;
...@@ -28,6 +27,7 @@ import com.dianping.bee.engine.spi.session.DefaultSessionManager; ...@@ -28,6 +27,7 @@ import com.dianping.bee.engine.spi.session.DefaultSessionManager;
import com.dianping.bee.engine.spi.session.SessionManager; import com.dianping.bee.engine.spi.session.SessionManager;
import com.dianping.bee.server.InformationSchemaDatabase; import com.dianping.bee.server.InformationSchemaDatabase;
import com.dianping.bee.server.SimpleServer; import com.dianping.bee.server.SimpleServer;
import com.dianping.bee.server.SimpleServerQueryHandler;
import com.site.lookup.configuration.AbstractResourceConfigurator; import com.site.lookup.configuration.AbstractResourceConfigurator;
import com.site.lookup.configuration.Component; import com.site.lookup.configuration.Component;
...@@ -58,30 +58,21 @@ public class ComponentsConfigurator extends AbstractResourceConfigurator { ...@@ -58,30 +58,21 @@ public class ComponentsConfigurator extends AbstractResourceConfigurator {
all.add(C(MultiTableStatementVisitor.class).is(PER_LOOKUP) // all.add(C(MultiTableStatementVisitor.class).is(PER_LOOKUP) //
.req(TableHelper.class, MultiTableStatement.class, RowFilter.class)); .req(TableHelper.class, MultiTableStatement.class, RowFilter.class));
// all.add(C(SimpleShowHandler.class)//
// .req(TableProviderManager.class));
// all.add(C(SimpleUseHandler.class));
// all.add(C(SimpleDescHandler.class)//
// .req(TableProviderManager.class));
// all.add(C(SimpleSelectHandler.class) //
// .req(StatementManager.class));
// all.add(C(SimpleServerQueryHandler.class).is(PER_LOOKUP) //
// .req(SimpleSelectHandler.class, SimpleShowHandler.class,
// SimpleDescHandler.class, SimpleUseHandler.class));
defineHandlers(all); defineHandlers(all);
return all; return all;
} }
private void defineHandlers(List<Component> all) { private void defineHandlers(List<Component> all) {
all.add(C(DefaultServerQueryHandler.class).is(PER_LOOKUP) // all.add(C(SimpleServerQueryHandler.class).is(PER_LOOKUP) //
.req(SelectHandler.class, ShowHandler.class, DescHandler.class, UseHandler.class)); .req(SelectHandler.class, ShowHandler.class, DescHandler.class, UseHandler.class));
all.add(C(UseHandler.class)); all.add(C(UseHandler.class));
all.add(C(ShowHandler.class)); all.add(C(ShowHandler.class));
all.add(C(DescHandler.class) // all.add(C(DescHandler.class) //
.req(TableProviderManager.class)); .req(TableProviderManager.class));
all.add(C(SelectHandler.class) //
.req(StatementManager.class));
} }
public static void main(String[] args) { public static void main(String[] args) {
......
...@@ -41,7 +41,6 @@ import com.site.lookup.annotation.Inject; ...@@ -41,7 +41,6 @@ import com.site.lookup.annotation.Inject;
* @author <a href="mailto:yiming.liu@dianping.com">Yiming Liu</a> * @author <a href="mailto:yiming.liu@dianping.com">Yiming Liu</a>
*/ */
public class SelectHandler extends AbstractCommandHandler { public class SelectHandler extends AbstractCommandHandler {
@Inject @Inject
private StatementManager m_manager; private StatementManager m_manager;
......
...@@ -13,9 +13,7 @@ import com.alibaba.cobar.net.handler.FrontendQueryHandler; ...@@ -13,9 +13,7 @@ import com.alibaba.cobar.net.handler.FrontendQueryHandler;
import com.alibaba.cobar.server.ServerConnection; import com.alibaba.cobar.server.ServerConnection;
import com.alibaba.cobar.server.session.BlockingSession; import com.alibaba.cobar.server.session.BlockingSession;
import com.alibaba.cobar.server.session.NonBlockingSession; import com.alibaba.cobar.server.session.NonBlockingSession;
import com.dianping.bee.engine.spi.handler.internal.DefaultServerQueryHandler;
import com.dianping.bee.engine.spi.session.SessionManager; import com.dianping.bee.engine.spi.session.SessionManager;
import com.dianping.bee.server.handler.SimpleServerQueryHandler;
/** /**
* @author <a href="mailto:yiming.liu@dianping.com">Yiming Liu</a> * @author <a href="mailto:yiming.liu@dianping.com">Yiming Liu</a>
...@@ -26,7 +24,7 @@ public class SimpleServerConnectionFactory extends FrontendConnectionFactory { ...@@ -26,7 +24,7 @@ public class SimpleServerConnectionFactory extends FrontendConnectionFactory {
@Override @Override
protected FrontendConnection getConnection(SocketChannel channel) { protected FrontendConnection getConnection(SocketChannel channel) {
SimpleServerConnection c = new SimpleServerConnection(channel); SimpleServerConnection c = new SimpleServerConnection(channel);
FrontendQueryHandler queryHandler = getDefaultQueryHandler(c); // TODO use another one for test FrontendQueryHandler queryHandler = getQueryHandler(c); // TODO use another one for test
c.setSessionManager(getSessionManager()); c.setSessionManager(getSessionManager());
c.setQueryHandler(queryHandler); c.setQueryHandler(queryHandler);
...@@ -37,19 +35,7 @@ public class SimpleServerConnectionFactory extends FrontendConnectionFactory { ...@@ -37,19 +35,7 @@ public class SimpleServerConnectionFactory extends FrontendConnectionFactory {
return c; return c;
} }
protected DefaultServerQueryHandler getDefaultQueryHandler(ServerConnection c) { protected SimpleServerQueryHandler getQueryHandler(ServerConnection c) {
try {
DefaultServerQueryHandler queryHandler = m_container.lookup(DefaultServerQueryHandler.class);
queryHandler.setServerConnection(c);
return queryHandler;
} catch (ComponentLookupException e) {
throw new RuntimeException(
"Unable to get DefaultServerQueryHandler instance, please check if the environment is setup correctly!", e);
}
}
protected SimpleServerQueryHandler getSimpleQueryHandler(ServerConnection c) {
try { try {
SimpleServerQueryHandler queryHandler = m_container.lookup(SimpleServerQueryHandler.class); SimpleServerQueryHandler queryHandler = m_container.lookup(SimpleServerQueryHandler.class);
...@@ -74,5 +60,4 @@ public class SimpleServerConnectionFactory extends FrontendConnectionFactory { ...@@ -74,5 +60,4 @@ public class SimpleServerConnectionFactory extends FrontendConnectionFactory {
public void setContainer(PlexusContainer container) { public void setContainer(PlexusContainer container) {
m_container = container; m_container = container;
} }
} }
package com.dianping.bee.engine.spi.handler.internal; package com.dianping.bee.server;
import com.alibaba.cobar.ErrorCode; import com.alibaba.cobar.ErrorCode;
import com.alibaba.cobar.net.handler.FrontendQueryHandler; import com.alibaba.cobar.net.handler.FrontendQueryHandler;
...@@ -9,11 +9,14 @@ import com.alibaba.cobar.server.handler.KillHandler; ...@@ -9,11 +9,14 @@ import com.alibaba.cobar.server.handler.KillHandler;
import com.alibaba.cobar.server.handler.SavepointHandler; import com.alibaba.cobar.server.handler.SavepointHandler;
import com.alibaba.cobar.server.handler.SetHandler; import com.alibaba.cobar.server.handler.SetHandler;
import com.alibaba.cobar.server.handler.StartHandler; import com.alibaba.cobar.server.handler.StartHandler;
import com.dianping.bee.server.handler.SimpleSelectHandler; import com.dianping.bee.engine.spi.handler.internal.DescHandler;
import com.dianping.bee.engine.spi.handler.internal.SelectHandler;
import com.dianping.bee.engine.spi.handler.internal.ShowHandler;
import com.dianping.bee.engine.spi.handler.internal.UseHandler;
import com.dianping.bee.server.parse.SimpleServerParse; import com.dianping.bee.server.parse.SimpleServerParse;
import com.site.lookup.annotation.Inject; import com.site.lookup.annotation.Inject;
public class DefaultServerQueryHandler implements FrontendQueryHandler { public class SimpleServerQueryHandler implements FrontendQueryHandler {
@Inject @Inject
private SelectHandler m_selectHandler; private SelectHandler m_selectHandler;
......
/**
* Project: bee-engine
*
* File Created at 2012-8-23
*
* Copyright 2012 dianping.com.
* All rights reserved.
*
* This software is the confidential and proprietary information of
* Dianping Company. ("Confidential Information"). You shall not
* disclose such Confidential Information and shall use it only in
* accordance with the terms of the license agreement you entered into
* with dianping.com.
*/
package com.dianping.bee.server.handler;
import java.nio.ByteBuffer;
import com.alibaba.cobar.CobarServer;
import com.alibaba.cobar.ErrorCode;
import com.alibaba.cobar.Fields;
import com.alibaba.cobar.config.model.SchemaConfig;
import com.alibaba.cobar.net.util.PacketUtil;
import com.alibaba.cobar.protocol.mysql.EOFPacket;
import com.alibaba.cobar.protocol.mysql.FieldPacket;
import com.alibaba.cobar.protocol.mysql.ResultSetHeaderPacket;
import com.alibaba.cobar.protocol.mysql.RowDataPacket;
import com.alibaba.cobar.server.ServerConnection;
import com.alibaba.cobar.util.StringUtil;
import com.dianping.bee.engine.spi.TableProvider;
import com.dianping.bee.engine.spi.TableProviderManager;
import com.dianping.bee.engine.spi.meta.ColumnMeta;
import com.dianping.bee.engine.spi.meta.internal.TypeUtils;
import com.site.lookup.annotation.Inject;
/**
* @author <a href="mailto:yiming.liu@dianping.com">Yiming Liu</a>
*/
public class SimpleDescHandler {
@Inject
private TableProviderManager m_manager;
/**
* @param stmt
* @param c
* @param offset
*/
public void handle(String stmt, ServerConnection c, int offset) {
String tableName = stmt.substring(offset).trim();
int length = tableName.length();
if (length > 0) {
if (tableName.charAt(0) == '`' && tableName.charAt(length - 1) == '`') {
tableName = tableName.substring(1, length - 1);
}
}
// 检查当前使用的DB
String db = c.getSchema();
if (db == null) {
c.writeErrMessage(ErrorCode.ER_NO_DB_ERROR, "No database selected");
return;
}
SchemaConfig schema = CobarServer.getInstance().getConfig().getSchemas().get(db);
if (schema == null) {
c.writeErrMessage(ErrorCode.ER_BAD_DB_ERROR, "Unknown database '" + db + "'");
return;
}
TableProvider table = m_manager.getTableProvider(tableName);
if (table == null) {
c.writeErrMessage(ErrorCode.ER_BAD_TABLE_ERROR, "Unknown table '" + tableName + "'");
return;
}
ColumnMeta[] columns = table.getColumns();
int FIELD_COUNT = 6;
ResultSetHeaderPacket header = PacketUtil.getHeader(FIELD_COUNT);
FieldPacket[] fields = new FieldPacket[FIELD_COUNT];
EOFPacket eof = new EOFPacket();
int i = 0;
byte packetId = 0;
header.packetId = ++packetId;
fields[i] = PacketUtil.getField("Field", Fields.FIELD_TYPE_VAR_STRING);
fields[i++].packetId = ++packetId;
fields[i] = PacketUtil.getField("Type", Fields.FIELD_TYPE_VAR_STRING);
fields[i++].packetId = ++packetId;
fields[i] = PacketUtil.getField("Null", Fields.FIELD_TYPE_VAR_STRING);
fields[i++].packetId = ++packetId;
fields[i] = PacketUtil.getField("Key", Fields.FIELD_TYPE_VAR_STRING);
fields[i++].packetId = ++packetId;
fields[i] = PacketUtil.getField("Default", Fields.FIELD_TYPE_VAR_STRING);
fields[i++].packetId = ++packetId;
fields[i] = PacketUtil.getField("Extra", Fields.FIELD_TYPE_VAR_STRING);
fields[i++].packetId = ++packetId;
eof.packetId = ++packetId;
ByteBuffer buffer = c.allocate();
// write header
buffer = header.write(buffer, c);
// write fields
for (FieldPacket field : fields) {
buffer = field.write(buffer, c);
}
// write eof
buffer = eof.write(buffer, c);
// write rows
packetId = eof.packetId;
if (columns != null) {
for (ColumnMeta column : columns) {
RowDataPacket row = new RowDataPacket(FIELD_COUNT);
row.add(StringUtil.encode(column.getName(), c.getCharset()));
row.add(StringUtil.encode(
TypeUtils.convertFieldTypeToString(TypeUtils.convertJavaTypeToFieldType(column.getType())),
c.getCharset()));
row.add(null);
row.add(null);
row.add(null);
row.add(null);
row.packetId = ++packetId;
buffer = row.write(buffer, c);
}
} else {
RowDataPacket row = new RowDataPacket(FIELD_COUNT);
row.add(null);
row.add(null);
row.add(null);
row.add(null);
row.add(null);
row.add(null);
row.packetId = ++packetId;
buffer = row.write(buffer, c);
}
// write last eof
EOFPacket lastEof = new EOFPacket();
lastEof.packetId = ++packetId;
buffer = lastEof.write(buffer, c);
// post write
c.write(buffer);
}
}
/**
* Project: bee-engine
*
* File Created at 2012-8-14
*
* Copyright 2012 dianping.com.
* All rights reserved.
*
* This software is the confidential and proprietary information of
* Dianping Company. ("Confidential Information"). You shall not
* disclose such Confidential Information and shall use it only in
* accordance with the terms of the license agreement you entered into
* with dianping.com.
*/
package com.dianping.bee.server.handler;
import java.nio.ByteBuffer;
import java.sql.SQLSyntaxErrorException;
import com.alibaba.cobar.ErrorCode;
import com.alibaba.cobar.Fields;
import com.alibaba.cobar.net.util.PacketUtil;
import com.alibaba.cobar.parser.util.ParseUtil;
import com.alibaba.cobar.protocol.mysql.EOFPacket;
import com.alibaba.cobar.protocol.mysql.FieldPacket;
import com.alibaba.cobar.protocol.mysql.ResultSetHeaderPacket;
import com.alibaba.cobar.protocol.mysql.RowDataPacket;
import com.alibaba.cobar.server.ServerConnection;
import com.alibaba.cobar.server.response.SelectDatabase;
import com.alibaba.cobar.server.response.SelectIdentity;
import com.alibaba.cobar.server.response.SelectLastInsertId;
import com.alibaba.cobar.server.response.SelectUser;
import com.alibaba.cobar.server.response.SelectVersion;
import com.alibaba.cobar.server.response.SelectVersionComment;
import com.alibaba.cobar.util.IntegerUtil;
import com.alibaba.cobar.util.StringUtil;
import com.dianping.bee.engine.spi.Statement;
import com.dianping.bee.engine.spi.StatementManager;
import com.dianping.bee.engine.spi.meta.Cell;
import com.dianping.bee.engine.spi.meta.ColumnMeta;
import com.dianping.bee.engine.spi.meta.Row;
import com.dianping.bee.engine.spi.meta.RowSet;
import com.dianping.bee.engine.spi.meta.internal.TypeUtils;
import com.dianping.bee.server.parse.SimpleServerParseSelect;
import com.site.lookup.annotation.Inject;
/**
* @author <a href="mailto:yiming.liu@dianping.com">Yiming Liu</a>
*/
public class SimpleSelectHandler {
@Inject
private StatementManager m_manager;
private RowDataPacket getRow(RowSet rowset, int rowIndex, String charset) {
int cols = rowset.getColumns();
RowDataPacket packet = new RowDataPacket(cols);
Row row = rowset.getRow(rowIndex);
for (int i = 0; i < cols; i++) {
ColumnMeta column = rowset.getColumn(i);
Cell cell = row.getCell(i);
String value = cell.getValue().toString();
switch (TypeUtils.convertJavaTypeToFieldType(column.getType())) {
case Fields.FIELD_TYPE_STRING:
packet.add(StringUtil.encode(value, charset));
break;
case Fields.FIELD_TYPE_INT24:
packet.add(value == null ? null : IntegerUtil.toBytes(Integer.parseInt(value)));
break;
case Fields.FIELD_TYPE_DECIMAL:
case Fields.FIELD_TYPE_TINY:
case Fields.FIELD_TYPE_SHORT:
case Fields.FIELD_TYPE_LONG:
case Fields.FIELD_TYPE_FLOAT:
case Fields.FIELD_TYPE_DOUBLE:
case Fields.FIELD_TYPE_NULL:
case Fields.FIELD_TYPE_TIMESTAMP:
case Fields.FIELD_TYPE_LONGLONG:
case Fields.FIELD_TYPE_DATE:
case Fields.FIELD_TYPE_TIME:
case Fields.FIELD_TYPE_DATETIME:
case Fields.FIELD_TYPE_YEAR:
case Fields.FIELD_TYPE_NEWDATE:
case Fields.FIELD_TYPE_VARCHAR:
case Fields.FIELD_TYPE_BIT:
case Fields.FIELD_TYPE_NEW_DECIMAL:
case Fields.FIELD_TYPE_ENUM:
case Fields.FIELD_TYPE_SET:
case Fields.FIELD_TYPE_TINY_BLOB:
case Fields.FIELD_TYPE_MEDIUM_BLOB:
case Fields.FIELD_TYPE_LONG_BLOB:
case Fields.FIELD_TYPE_BLOB:
case Fields.FIELD_TYPE_VAR_STRING:
case Fields.FIELD_TYPE_GEOMETRY:
default:
packet.add(StringUtil.encode(value, charset));
}
}
return packet;
}
public void handle(String stmt, ServerConnection c, int offs) {
int offset = offs;
switch (SimpleServerParseSelect.parse(stmt, offs)) {
case SimpleServerParseSelect.VERSION_COMMENT:
SelectVersionComment.response(c);
break;
case SimpleServerParseSelect.DATABASE:
SelectDatabase.response(c);
break;
case SimpleServerParseSelect.USER:
SelectUser.response(c);
break;
case SimpleServerParseSelect.VERSION:
SelectVersion.response(c);
break;
case SimpleServerParseSelect.SESSION:
selectSession(c, stmt);
break;
case SimpleServerParseSelect.LAST_INSERT_ID:
// offset = ParseUtil.move(stmt, 0, "select".length());
loop: for (; offset < stmt.length(); ++offset) {
switch (stmt.charAt(offset)) {
case ' ':
continue;
case '/':
case '#':
offset = ParseUtil.comment(stmt, offset);
continue;
case 'L':
case 'l':
break loop;
}
}
offset = SimpleServerParseSelect.indexAfterLastInsertIdFunc(stmt, offset);
offset = SimpleServerParseSelect.skipAs(stmt, offset);
SelectLastInsertId.response(c, stmt, offset);
break;
case SimpleServerParseSelect.IDENTITY:
// offset = ParseUtil.move(stmt, 0, "select".length());
loop: for (; offset < stmt.length(); ++offset) {
switch (stmt.charAt(offset)) {
case ' ':
continue;
case '/':
case '#':
offset = ParseUtil.comment(stmt, offset);
continue;
case '@':
break loop;
}
}
int indexOfAtAt = offset;
offset += 2;
offset = SimpleServerParseSelect.indexAfterIdentity(stmt, offset);
String orgName = stmt.substring(indexOfAtAt, offset);
offset = SimpleServerParseSelect.skipAs(stmt, offset);
SelectIdentity.response(c, stmt, offset, orgName);
break;
default:
try {
response(c, stmt);
} catch (SQLSyntaxErrorException e) {
c.writeErrMessage(ErrorCode.ER_SYNTAX_ERROR, e.getMessage());
}
}
}
/**
* @param c
* @param stmt
*/
private void selectSession(ServerConnection c, String stmt) {
String sessionVariable = stmt.substring(stmt.indexOf("@@session"));
int FIELD_COUNT = 1;
ResultSetHeaderPacket header = PacketUtil.getHeader(FIELD_COUNT);
FieldPacket[] fields = new FieldPacket[FIELD_COUNT];
EOFPacket eof = new EOFPacket();
int i = 0;
byte packetId = 0;
header.packetId = ++packetId;
fields[i] = PacketUtil.getField(sessionVariable, Fields.FIELD_TYPE_VAR_STRING);
fields[i++].packetId = ++packetId;
eof.packetId = ++packetId;
ByteBuffer buffer = c.allocate();
// write header
buffer = header.write(buffer, c);
// write fields
for (FieldPacket field : fields) {
buffer = field.write(buffer, c);
}
// write eof
buffer = eof.write(buffer, c);
// write rows
packetId = eof.packetId;
// TODO: sample result currently
RowDataPacket row = new RowDataPacket(FIELD_COUNT);
row.add(StringUtil.encode("1", c.getCharset()));
row.packetId = ++packetId;
buffer = row.write(buffer, c);
// write last eof
EOFPacket lastEof = new EOFPacket();
lastEof.packetId = ++packetId;
buffer = lastEof.write(buffer, c);
// post write
c.write(buffer);
}
/**
*
* @param c
* @param stmt
* @throws SQLSyntaxErrorException
*/
public void response(ServerConnection c, String sql) throws SQLSyntaxErrorException {
Statement stmt = m_manager.build(sql);
RowSet rowset = stmt.query();
byte packetId = 0;
EOFPacket eof = new EOFPacket();
ByteBuffer buffer = c.allocate();
// write header
int fieldCount = rowset.getColumns();
ResultSetHeaderPacket header = PacketUtil.getHeader(fieldCount);
header.packetId = ++packetId;
buffer = header.write(buffer, c);
// write fields
int columnIndex = 0;
FieldPacket[] fields = new FieldPacket[fieldCount];
for (int i = 0; i < fieldCount; i++) {
fields[columnIndex] = PacketUtil.getField(rowset.getColumn(i).getName(),
TypeUtils.convertJavaTypeToFieldType(rowset.getColumn(i).getType()));
fields[columnIndex++].packetId = ++packetId;
}
eof.packetId = ++packetId;
for (FieldPacket field : fields) {
buffer = field.write(buffer, c);
}
buffer = eof.write(buffer, c);
// write rows
for (int rowIndex = 0; rowIndex < rowset.getRows(); rowIndex++) {
RowDataPacket row = getRow(rowset, rowIndex, c.getCharset());
row.packetId = ++packetId;
buffer = row.write(buffer, c);
}
EOFPacket lastEof = new EOFPacket();
lastEof.packetId = ++packetId;
buffer = lastEof.write(buffer, c);
c.write(buffer);
}
}
/**
* Project: bee-engine
*
* File Created at 2012-8-15
*
* Copyright 2012 dianping.com.
* All rights reserved.
*
* This software is the confidential and proprietary information of
* Dianping Company. ("Confidential Information"). You shall not
* disclose such Confidential Information and shall use it only in
* accordance with the terms of the license agreement you entered into
* with dianping.com.
*/
package com.dianping.bee.server.handler;
import org.apache.log4j.Logger;
import com.alibaba.cobar.ErrorCode;
import com.alibaba.cobar.net.handler.FrontendQueryHandler;
import com.alibaba.cobar.server.ServerConnection;
import com.alibaba.cobar.server.handler.BeginHandler;
import com.alibaba.cobar.server.handler.ExplainHandler;
import com.alibaba.cobar.server.handler.KillHandler;
import com.alibaba.cobar.server.handler.SavepointHandler;
import com.alibaba.cobar.server.handler.SetHandler;
import com.alibaba.cobar.server.handler.StartHandler;
import com.dianping.bee.server.parse.SimpleServerParse;
import com.site.lookup.annotation.Inject;
/**
* @author <a href="mailto:yiming.liu@dianping.com">Yiming Liu</a>
*/
public class SimpleServerQueryHandler implements FrontendQueryHandler {
@Inject
private SimpleSelectHandler m_selectHandler;
@Inject
private SimpleShowHandler m_showHandler;
@Inject
private SimpleDescHandler m_descHandler;
@Inject
private SimpleUseHandler m_useHandler;
private static final Logger LOGGER = Logger.getLogger(SimpleServerQueryHandler.class);
private ServerConnection m_conn;
@Override
public void query(String sql) {
ServerConnection c = this.m_conn;
if (LOGGER.isDebugEnabled()) {
LOGGER.debug(new StringBuilder().append(c).append(sql).toString());
}
int rs = SimpleServerParse.parse(sql);
switch (rs & 0xff) {
case SimpleServerParse.EXPLAIN:
ExplainHandler.handle(sql, c, rs >>> 8);
break;
case SimpleServerParse.SET:
SetHandler.handle(sql, c, rs >>> 8);
break;
case SimpleServerParse.DESC:
m_descHandler.handle(sql, c, rs >>> 8);
break;
case SimpleServerParse.SHOW:
m_showHandler.handle(sql, c, rs >>> 8);
break;
case SimpleServerParse.SELECT:
m_selectHandler.handle(sql, c, rs >>> 8);
break;
case SimpleServerParse.START:
StartHandler.handle(sql, c, rs >>> 8);
break;
case SimpleServerParse.BEGIN:
BeginHandler.handle(sql, c);
break;
case SimpleServerParse.SAVEPOINT:
SavepointHandler.handle(sql, c);
break;
case SimpleServerParse.KILL:
KillHandler.handle(sql, rs >>> 8, c);
break;
case SimpleServerParse.KILL_QUERY:
c.writeErrMessage(ErrorCode.ER_UNKNOWN_COM_ERROR, "Unsupported command");
break;
case SimpleServerParse.USE:
m_useHandler.handle(sql, c, rs >>> 8);
break;
case SimpleServerParse.COMMIT:
c.commit();
break;
case SimpleServerParse.ROLLBACK:
c.rollback();
break;
default:
c.execute(sql, rs);
}
}
public void setServerConnection(ServerConnection c) {
m_conn = c;
}
}
/**
* Project: bee-engine
*
* File Created at 2012-8-23
*
* Copyright 2012 dianping.com.
* All rights reserved.
*
* This software is the confidential and proprietary information of
* Dianping Company. ("Confidential Information"). You shall not
* disclose such Confidential Information and shall use it only in
* accordance with the terms of the license agreement you entered into
* with dianping.com.
*/
package com.dianping.bee.server.handler;
import java.nio.ByteBuffer;
import java.util.HashMap;
import java.util.Map;
import org.codehaus.plexus.component.repository.exception.ComponentLookupException;
import com.alibaba.cobar.CobarServer;
import com.alibaba.cobar.ErrorCode;
import com.alibaba.cobar.Fields;
import com.alibaba.cobar.config.model.SchemaConfig;
import com.alibaba.cobar.net.util.PacketUtil;
import com.alibaba.cobar.protocol.mysql.EOFPacket;
import com.alibaba.cobar.protocol.mysql.FieldPacket;
import com.alibaba.cobar.protocol.mysql.ResultSetHeaderPacket;
import com.alibaba.cobar.protocol.mysql.RowDataPacket;
import com.alibaba.cobar.server.ServerConnection;
import com.alibaba.cobar.server.response.ShowDatabases;
import com.alibaba.cobar.util.StringUtil;
import com.dianping.bee.engine.spi.DatabaseProvider;
import com.dianping.bee.engine.spi.TableProvider;
import com.dianping.bee.engine.spi.TableProviderManager;
import com.dianping.bee.server.parse.SimpleServerParseShow;
import com.site.lookup.ContainerLoader;
import com.site.lookup.annotation.Inject;
/**
* @author <a href="mailto:yiming.liu@dianping.com">Yiming Liu</a>
*/
public class SimpleShowHandler {
@Inject
private TableProviderManager m_manager;
/**
* @param stmt
* @param c
* @param offset
*/
public void handle(String stmt, ServerConnection c, int offset) {
switch (SimpleServerParseShow.parse(stmt, offset)) {
case SimpleServerParseShow.DATABASES:
ShowDatabases.response(c);
break;
case SimpleServerParseShow.TABLES:
showTables(c, stmt);
break;
case SimpleServerParseShow.TABLESTATUS:
showTableStatus(c, stmt);
break;
case SimpleServerParseShow.STATUS:
showStatus(c, stmt);
break;
case SimpleServerParseShow.VARIABLES:
showVariables(c, stmt);
break;
case SimpleServerParseShow.COLLATION:
showCollation(c, stmt);
break;
default:
c.writeErrMessage(ErrorCode.ER_UNKNOWN_COM_ERROR, "Unsupported show command");
}
}
/**
* @param c
* @param stmt
*/
private void showCollation(ServerConnection c, String stmt) {
int FIELD_COUNT = 6;
ResultSetHeaderPacket header = PacketUtil.getHeader(FIELD_COUNT);
FieldPacket[] fields = new FieldPacket[FIELD_COUNT];
EOFPacket eof = new EOFPacket();
int i = 0;
byte packetId = 0;
header.packetId = ++packetId;
fields[i] = PacketUtil.getField("Collation", Fields.FIELD_TYPE_VAR_STRING);
fields[i++].packetId = ++packetId;
fields[i] = PacketUtil.getField("Charset", Fields.FIELD_TYPE_VAR_STRING);
fields[i++].packetId = ++packetId;
fields[i] = PacketUtil.getField("Id", Fields.FIELD_TYPE_LONG);
fields[i++].packetId = ++packetId;
fields[i] = PacketUtil.getField("Default", Fields.FIELD_TYPE_VAR_STRING);
fields[i++].packetId = ++packetId;
fields[i] = PacketUtil.getField("Compiled", Fields.FIELD_TYPE_VAR_STRING);
fields[i++].packetId = ++packetId;
fields[i] = PacketUtil.getField("Sortlen", Fields.FIELD_TYPE_LONG);
fields[i++].packetId = ++packetId;
eof.packetId = ++packetId;
ByteBuffer buffer = c.allocate();
// write header
buffer = header.write(buffer, c);
// write fields
for (FieldPacket field : fields) {
buffer = field.write(buffer, c);
}
// write eof
buffer = eof.write(buffer, c);
// write rows
packetId = eof.packetId;
// TODO: sample result currently
// RowDataPacket row = new RowDataPacket(FIELD_COUNT);
// row.add(StringUtil.encode("utf8_general_ci", c.getCharset()));
// row.add(StringUtil.encode("utf8", c.getCharset()));
// row.add(LongUtil.toBytes(33L));
// row.add(StringUtil.encode("Yes", c.getCharset()));
// row.add(StringUtil.encode("Yes", c.getCharset()));
// row.add(LongUtil.toBytes(1));
// row.packetId = ++packetId;
// buffer = row.write(buffer, c);
//
// row = new RowDataPacket(FIELD_COUNT);
// row.add(StringUtil.encode("utf8_bin", c.getCharset()));
// row.add(StringUtil.encode("utf8", c.getCharset()));
// row.add(LongUtil.toBytes(83L));
// row.add(StringUtil.encode("", c.getCharset()));
// row.add(StringUtil.encode("Yes", c.getCharset()));
// row.add(LongUtil.toBytes(1));
// row.packetId = ++packetId;
// buffer = row.write(buffer, c);
// write last eof
EOFPacket lastEof = new EOFPacket();
lastEof.packetId = ++packetId;
buffer = lastEof.write(buffer, c);
// post write
c.write(buffer);
}
/**
* @param c
* @param stmt
*/
private void showTableStatus(ServerConnection c, String stmt) {
String dbName = stmt.substring("show table status from ".length()).trim();
int length = dbName.length();
if (length > 0) {
if (dbName.charAt(0) == '`' && dbName.charAt(length - 1) == '`') {
dbName = dbName.substring(1, length - 1);
}
}
DatabaseProvider provider = null;
try {
provider = ContainerLoader.getDefaultContainer().lookup(DatabaseProvider.class, dbName);
} catch (ComponentLookupException e) {
c.writeErrMessage(ErrorCode.ER_BAD_DB_ERROR, "Can not load database '" + dbName + "'");
return;
}
int FIELD_COUNT = 18;
ResultSetHeaderPacket header = PacketUtil.getHeader(FIELD_COUNT);
FieldPacket[] fields = new FieldPacket[FIELD_COUNT];
EOFPacket eof = new EOFPacket();
int i = 0;
byte packetId = 0;
header.packetId = ++packetId;
// FIXME field type need to be updated
fields[i] = PacketUtil.getField("Name", Fields.FIELD_TYPE_VAR_STRING);
fields[i++].packetId = ++packetId;
fields[i] = PacketUtil.getField("Engine", Fields.FIELD_TYPE_VAR_STRING);
fields[i++].packetId = ++packetId;
fields[i] = PacketUtil.getField("Version", Fields.FIELD_TYPE_VAR_STRING);
fields[i++].packetId = ++packetId;
fields[i] = PacketUtil.getField("Row_format", Fields.FIELD_TYPE_VAR_STRING);
fields[i++].packetId = ++packetId;
fields[i] = PacketUtil.getField("Rows", Fields.FIELD_TYPE_VAR_STRING);
fields[i++].packetId = ++packetId;
fields[i] = PacketUtil.getField("Avg_row_length", Fields.FIELD_TYPE_VAR_STRING);
fields[i++].packetId = ++packetId;
fields[i] = PacketUtil.getField("Data_length", Fields.FIELD_TYPE_VAR_STRING);
fields[i++].packetId = ++packetId;
fields[i] = PacketUtil.getField("Max_data_length", Fields.FIELD_TYPE_VAR_STRING);
fields[i++].packetId = ++packetId;
fields[i] = PacketUtil.getField("Index_length", Fields.FIELD_TYPE_VAR_STRING);
fields[i++].packetId = ++packetId;
fields[i] = PacketUtil.getField("Data_free", Fields.FIELD_TYPE_VAR_STRING);
fields[i++].packetId = ++packetId;
fields[i] = PacketUtil.getField("Auto_increment", Fields.FIELD_TYPE_VAR_STRING);
fields[i++].packetId = ++packetId;
fields[i] = PacketUtil.getField("Create_time", Fields.FIELD_TYPE_VAR_STRING);
fields[i++].packetId = ++packetId;
fields[i] = PacketUtil.getField("Update_time", Fields.FIELD_TYPE_VAR_STRING);
fields[i++].packetId = ++packetId;
fields[i] = PacketUtil.getField("Check_time", Fields.FIELD_TYPE_VAR_STRING);
fields[i++].packetId = ++packetId;
fields[i] = PacketUtil.getField("Collation", Fields.FIELD_TYPE_VAR_STRING);
fields[i++].packetId = ++packetId;
fields[i] = PacketUtil.getField("Checksum", Fields.FIELD_TYPE_VAR_STRING);
fields[i++].packetId = ++packetId;
fields[i] = PacketUtil.getField("Create_options", Fields.FIELD_TYPE_VAR_STRING);
fields[i++].packetId = ++packetId;
fields[i] = PacketUtil.getField("Comment", Fields.FIELD_TYPE_VAR_STRING);
fields[i++].packetId = ++packetId;
eof.packetId = ++packetId;
ByteBuffer buffer = c.allocate();
// write header
buffer = header.write(buffer, c);
// write fields
for (FieldPacket field : fields) {
buffer = field.write(buffer, c);
}
// write eof
buffer = eof.write(buffer, c);
// write rows
packetId = eof.packetId;
// TODO: sample result currently
TableProvider[] tables = provider.getTables();
if (tables != null) {
for (TableProvider table : tables) {
RowDataPacket row = new RowDataPacket(FIELD_COUNT);
row.add(StringUtil.encode(table.getName(), c.getCharset()));
row.add(StringUtil.encode("Bee", c.getCharset()));
row.add(null);
row.add(null);
row.add(null);
row.add(null);
row.add(null);
row.add(null);
row.add(null);
row.add(null);
row.add(null);
row.add(null);
row.add(null);
row.add(null);
row.add(null);
row.add(null);
row.add(null);
row.add(null);
row.packetId = ++packetId;
buffer = row.write(buffer, c);
}
}
// write last eof
EOFPacket lastEof = new EOFPacket();
lastEof.packetId = ++packetId;
buffer = lastEof.write(buffer, c);
// post write
c.write(buffer);
}
/**
* @param c
* @param stmt
*/
private void showStatus(ServerConnection c, String stmt) {
int FIELD_COUNT = 2;
ResultSetHeaderPacket header = PacketUtil.getHeader(FIELD_COUNT);
FieldPacket[] fields = new FieldPacket[FIELD_COUNT];
EOFPacket eof = new EOFPacket();
int i = 0;
byte packetId = 0;
header.packetId = ++packetId;
fields[i] = PacketUtil.getField("Variable_name", Fields.FIELD_TYPE_VAR_STRING);
fields[i++].packetId = ++packetId;
fields[i] = PacketUtil.getField("Value", Fields.FIELD_TYPE_VAR_STRING);
fields[i++].packetId = ++packetId;
eof.packetId = ++packetId;
ByteBuffer buffer = c.allocate();
// write header
buffer = header.write(buffer, c);
// write fields
for (FieldPacket field : fields) {
buffer = field.write(buffer, c);
}
// write eof
buffer = eof.write(buffer, c);
// write rows
packetId = eof.packetId;
// TODO: sample result currently
Map<String, String> sampleStatus = new HashMap<String, String>();
sampleStatus.put("bee_status", "good");
for (Map.Entry<String, String> variable : sampleStatus.entrySet()) {
RowDataPacket row = new RowDataPacket(FIELD_COUNT);
row.add(StringUtil.encode(variable.getKey(), c.getCharset()));
row.add(StringUtil.encode(variable.getValue(), c.getCharset()));
row.packetId = ++packetId;
buffer = row.write(buffer, c);
}
// write last eof
EOFPacket lastEof = new EOFPacket();
lastEof.packetId = ++packetId;
buffer = lastEof.write(buffer, c);
// post write
c.write(buffer);
}
/**
*
* @param c
* @param stmt
*/
private void showTables(ServerConnection c, String stmt) {
// 检查当前使用的DB
String db = c.getSchema();
if (db == null) {
c.writeErrMessage(ErrorCode.ER_NO_DB_ERROR, "No database selected");
return;
}
SchemaConfig schema = CobarServer.getInstance().getConfig().getSchemas().get(db);
if (schema == null) {
c.writeErrMessage(ErrorCode.ER_BAD_DB_ERROR, "Unknown database '" + db + "'");
return;
}
DatabaseProvider provider = null;
try {
provider = ContainerLoader.getDefaultContainer().lookup(DatabaseProvider.class, db);
} catch (ComponentLookupException e) {
c.writeErrMessage(ErrorCode.ER_BAD_DB_ERROR, "Can not load database '" + db + "'");
return;
}
if (provider == null) {
c.writeErrMessage(ErrorCode.ER_BAD_DB_ERROR, "Can not load database '" + db + "'");
return;
}
TableProvider[] tables = provider.getTables();
int FIELD_COUNT = 1;
ResultSetHeaderPacket header = PacketUtil.getHeader(FIELD_COUNT);
FieldPacket[] fields = new FieldPacket[FIELD_COUNT];
EOFPacket eof = new EOFPacket();
int i = 0;
byte packetId = 0;
header.packetId = ++packetId;
fields[i] = PacketUtil.getField("TABLE", Fields.FIELD_TYPE_VAR_STRING);
fields[i++].packetId = ++packetId;
eof.packetId = ++packetId;
ByteBuffer buffer = c.allocate();
// write header
buffer = header.write(buffer, c);
// write fields
for (FieldPacket field : fields) {
buffer = field.write(buffer, c);
}
// write eof
buffer = eof.write(buffer, c);
// write rows
packetId = eof.packetId;
if (tables != null) {
for (TableProvider table : tables) {
RowDataPacket row = new RowDataPacket(FIELD_COUNT);
row.add(StringUtil.encode(table.getName(), c.getCharset()));
row.packetId = ++packetId;
buffer = row.write(buffer, c);
}
} else {
RowDataPacket row = new RowDataPacket(FIELD_COUNT);
row.add(null);
row.packetId = ++packetId;
buffer = row.write(buffer, c);
}
// write last eof
EOFPacket lastEof = new EOFPacket();
lastEof.packetId = ++packetId;
buffer = lastEof.write(buffer, c);
// post write
c.write(buffer);
}
/**
* @param c
* @param stmt
*/
private void showVariables(ServerConnection c, String stmt) {
int FIELD_COUNT = 2;
ResultSetHeaderPacket header = PacketUtil.getHeader(FIELD_COUNT);
FieldPacket[] fields = new FieldPacket[FIELD_COUNT];
EOFPacket eof = new EOFPacket();
int i = 0;
byte packetId = 0;
header.packetId = ++packetId;
fields[i] = PacketUtil.getField("Variable_name", Fields.FIELD_TYPE_VAR_STRING);
fields[i++].packetId = ++packetId;
fields[i] = PacketUtil.getField("Value", Fields.FIELD_TYPE_VAR_STRING);
fields[i++].packetId = ++packetId;
eof.packetId = ++packetId;
ByteBuffer buffer = c.allocate();
// write header
buffer = header.write(buffer, c);
// write fields
for (FieldPacket field : fields) {
buffer = field.write(buffer, c);
}
// write eof
buffer = eof.write(buffer, c);
// write rows
packetId = eof.packetId;
// TODO: sample result currently
Map<String, String> sampleVariables = new HashMap<String, String>();
sampleVariables.put("bee_status", "good");
for (Map.Entry<String, String> variable : sampleVariables.entrySet()) {
RowDataPacket row = new RowDataPacket(FIELD_COUNT);
row.add(StringUtil.encode(variable.getKey(), c.getCharset()));
row.add(StringUtil.encode(variable.getValue(), c.getCharset()));
row.packetId = ++packetId;
buffer = row.write(buffer, c);
}
// write last eof
EOFPacket lastEof = new EOFPacket();
lastEof.packetId = ++packetId;
buffer = lastEof.write(buffer, c);
// post write
c.write(buffer);
}
}
/**
* Project: bee-engine
*
* File Created at 2012-8-24
*
* Copyright 2012 dianping.com.
* All rights reserved.
*
* This software is the confidential and proprietary information of
* Dianping Company. ("Confidential Information"). You shall not
* disclose such Confidential Information and shall use it only in
* accordance with the terms of the license agreement you entered into
* with dianping.com.
*/
package com.dianping.bee.server.handler;
import java.nio.ByteBuffer;
import java.util.Set;
import com.alibaba.cobar.ErrorCode;
import com.alibaba.cobar.net.handler.FrontendPrivileges;
import com.alibaba.cobar.protocol.mysql.OkPacket;
import com.alibaba.cobar.server.ServerConnection;
/**
* @author <a href="mailto:yiming.liu@dianping.com">Yiming Liu</a>
*/
public class SimpleUseHandler {
public void handle(String sql, ServerConnection c, int offset) {
String schema = sql.substring(offset).trim();
int length = schema.length();
if (length > 0) {
if (schema.charAt(0) == '`' && schema.charAt(length - 1) == '`') {
schema = schema.substring(1, length - 1);
}
}
// 表示当前连接已经指定了schema
// if (c.getSchema() != null) {
// if (c.getSchema().equals(schema)) {
// ByteBuffer buffer = c.allocate();
// c.write(c.writeToBuffer(OkPacket.OK, buffer));
// } else {
// c.writeErrMessage(ErrorCode.ER_DBACCESS_DENIED_ERROR,
// "Not allowed to change the database!");
// }
// return;
// }
// 检查schema的有效性
FrontendPrivileges privileges = c.getPrivileges();
if (schema == null || !privileges.schemaExists(schema)) {
c.writeErrMessage(ErrorCode.ER_BAD_DB_ERROR, "Unknown database '" + schema + "'");
return;
}
String user = c.getUser();
if (!privileges.userExists(user, c.getHost())) {
c.writeErrMessage(ErrorCode.ER_ACCESS_DENIED_ERROR, "Access denied for user '" + c.getUser() + "'");
return;
}
Set<String> schemas = privileges.getUserSchemas(user);
if (schemas == null || schemas.size() == 0 || schemas.contains(schema)) {
c.setSchema(schema);
ByteBuffer buffer = c.allocate();
c.write(c.writeToBuffer(OkPacket.OK, buffer));
} else {
String msg = "Access denied for user '" + c.getUser() + "' to database '" + schema + "'";
c.writeErrMessage(ErrorCode.ER_DBACCESS_DENIED_ERROR, msg);
}
}
}
...@@ -93,62 +93,12 @@ ...@@ -93,62 +93,12 @@
</requirements> </requirements>
</component> </component>
<component> <component>
<role>com.dianping.bee.server.handler.SimpleShowHandler</role> <role>com.dianping.bee.server.SimpleServerQueryHandler</role>
<implementation>com.dianping.bee.server.handler.SimpleShowHandler</implementation> <implementation>com.dianping.bee.server.SimpleServerQueryHandler</implementation>
<requirements>
<requirement>
<role>com.dianping.bee.engine.spi.TableProviderManager</role>
</requirement>
</requirements>
</component>
<component>
<role>com.dianping.bee.server.handler.SimpleUseHandler</role>
<implementation>com.dianping.bee.server.handler.SimpleUseHandler</implementation>
</component>
<component>
<role>com.dianping.bee.server.handler.SimpleDescHandler</role>
<implementation>com.dianping.bee.server.handler.SimpleDescHandler</implementation>
<requirements>
<requirement>
<role>com.dianping.bee.engine.spi.TableProviderManager</role>
</requirement>
</requirements>
</component>
<component>
<role>com.dianping.bee.server.handler.SimpleSelectHandler</role>
<implementation>com.dianping.bee.server.handler.SimpleSelectHandler</implementation>
<requirements>
<requirement>
<role>com.dianping.bee.engine.spi.StatementManager</role>
</requirement>
</requirements>
</component>
<component>
<role>com.dianping.bee.server.handler.SimpleServerQueryHandler</role>
<implementation>com.dianping.bee.server.handler.SimpleServerQueryHandler</implementation>
<instantiation-strategy>per-lookup</instantiation-strategy> <instantiation-strategy>per-lookup</instantiation-strategy>
<requirements> <requirements>
<requirement> <requirement>
<role>com.dianping.bee.server.handler.SimpleSelectHandler</role> <role>com.dianping.bee.engine.spi.handler.internal.SelectHandler</role>
</requirement>
<requirement>
<role>com.dianping.bee.server.handler.SimpleShowHandler</role>
</requirement>
<requirement>
<role>com.dianping.bee.server.handler.SimpleDescHandler</role>
</requirement>
<requirement>
<role>com.dianping.bee.server.handler.SimpleUseHandler</role>
</requirement>
</requirements>
</component>
<component>
<role>com.dianping.bee.engine.spi.handler.internal.DefaultServerQueryHandler</role>
<implementation>com.dianping.bee.engine.spi.handler.internal.DefaultServerQueryHandler</implementation>
<instantiation-strategy>per-lookup</instantiation-strategy>
<requirements>
<requirement>
<role>com.dianping.bee.server.handler.SimpleSelectHandler</role>
</requirement> </requirement>
<requirement> <requirement>
<role>com.dianping.bee.engine.spi.handler.internal.ShowHandler</role> <role>com.dianping.bee.engine.spi.handler.internal.ShowHandler</role>
...@@ -178,5 +128,14 @@ ...@@ -178,5 +128,14 @@
</requirement> </requirement>
</requirements> </requirements>
</component> </component>
<component>
<role>com.dianping.bee.engine.spi.handler.internal.SelectHandler</role>
<implementation>com.dianping.bee.engine.spi.handler.internal.SelectHandler</implementation>
<requirements>
<requirement>
<role>com.dianping.bee.engine.spi.StatementManager</role>
</requirement>
</requirements>
</component>
</components> </components>
</plexus> </plexus>
...@@ -34,7 +34,7 @@ public class JDBCTest extends ComponentTestCase { ...@@ -34,7 +34,7 @@ public class JDBCTest extends ComponentTestCase {
// @Test // @Test
public void testConnection() { public void testConnection() {
Connection conn = null; Connection conn = null;
String url = "jdbc:mysql://localhost:2330/"; String url = "jdbc:mysql://127.0.0.1:2330/";
String dbName = "cat"; String dbName = "cat";
String driver = "com.mysql.jdbc.Driver"; String driver = "com.mysql.jdbc.Driver";
String userName = "test"; String userName = "test";
...@@ -53,28 +53,27 @@ public class JDBCTest extends ComponentTestCase { ...@@ -53,28 +53,27 @@ public class JDBCTest extends ComponentTestCase {
} }
@Test @Test
public void testQuery() { public void testQuery() throws Exception {
Connection conn = null; Connection conn = null;
String url = "jdbc:mysql://localhost:2330/"; String url = "jdbc:mysql://localhost:2330/";
String dbName = "cat"; String dbName = "cat";
String driver = "com.mysql.jdbc.Driver"; String driver = "com.mysql.jdbc.Driver";
String userName = "test"; String userName = "test";
String password = "test"; String password = "test";
try {
Class.forName(driver).newInstance(); Class.forName(driver).newInstance();
System.out.println("Driver loaded"); System.out.println("Driver loaded");
DriverManager.setLoginTimeout(600); DriverManager.setLoginTimeout(600);
conn = DriverManager.getConnection(url + dbName, userName, password); conn = DriverManager.getConnection(url + dbName, userName, password);
System.out.println("Connected to the database"); System.out.println("Connected to the database");
Statement stmt = conn.createStatement(); Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("select type, sum(failures) from transaction where domain=? and starttime=?"); ResultSet rs = stmt.executeQuery("select type, sum(failures) from transaction where domain=? and starttime=?");
while (rs.next()) {
System.out.println(rs.getString(1)); while (rs.next()) {
} System.out.println(rs.getString(1));
conn.close();
System.out.println("Disconnected from database");
} catch (Exception e) {
e.printStackTrace();
} }
conn.close();
System.out.println("Disconnected from database");
} }
} }
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册