From 23ba556fc08f30d1750c46f0affc2ff11410463d Mon Sep 17 00:00:00 2001 From: zhuam Date: Fri, 6 May 2016 11:44:01 +0800 Subject: [PATCH] =?UTF-8?q?=E6=94=AF=E6=8C=81mysql=20information=5Fschema?= =?UTF-8?q?=20=E5=85=83=E6=95=B0=E6=8D=AE=E8=BF=94=E5=9B=9E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../MysqlInformationSchemaHandler.java | 86 +++++++++++++++++++ 1 file changed, 86 insertions(+) create mode 100644 src/main/java/io/mycat/server/handler/MysqlInformationSchemaHandler.java diff --git a/src/main/java/io/mycat/server/handler/MysqlInformationSchemaHandler.java b/src/main/java/io/mycat/server/handler/MysqlInformationSchemaHandler.java new file mode 100644 index 000000000..bb324c0e8 --- /dev/null +++ b/src/main/java/io/mycat/server/handler/MysqlInformationSchemaHandler.java @@ -0,0 +1,86 @@ +package io.mycat.server.handler; + +import java.nio.ByteBuffer; + +import io.mycat.backend.mysql.PacketUtil; +import io.mycat.config.Fields; +import io.mycat.net.mysql.EOFPacket; +import io.mycat.net.mysql.FieldPacket; +import io.mycat.net.mysql.OkPacket; +import io.mycat.net.mysql.ResultSetHeaderPacket; +import io.mycat.server.ServerConnection; +import io.mycat.server.util.SchemaUtil; + + +/** + * 对 PhpAdmin's 控制台操作进行支持 + * + * 如:SELECT * FROM information_schema.CHARACTER_SETS 等相关语句进行模拟返回 + * + * @author zhuam + * + */ +public class MysqlInformationSchemaHandler { + + /** + * 写入数据包 + * @param field_count + * @param fields + * @param c + */ + private static void doWrite(int field_count, FieldPacket[] fields, ServerConnection c) { + + ByteBuffer buffer = c.allocate(); + + // write header + ResultSetHeaderPacket header = PacketUtil.getHeader(field_count); + byte packetId = header.packetId; + buffer = header.write(buffer, c, true); + + // write fields + for (FieldPacket field : fields) { + field.packetId = ++packetId; + buffer = field.write(buffer, c, true); + } + + // write eof + EOFPacket eof = new EOFPacket(); + eof.packetId = ++packetId; + buffer = eof.write(buffer, c, true); + + // write last eof + EOFPacket lastEof = new EOFPacket(); + lastEof.packetId = ++packetId; + buffer = lastEof.write(buffer, c, true); + + // post write + c.write(buffer); + + } + + public static void handle(String sql, ServerConnection c) { + + SchemaUtil.SchemaInfo schemaInfo = SchemaUtil.parseSchema(sql); + if ( schemaInfo != null ) { + + if ( schemaInfo.table.toUpperCase().equals("CHARACTER_SETS") ) { + + //模拟列头 + int field_count = 4; + FieldPacket[] fields = new FieldPacket[field_count]; + fields[0] = PacketUtil.getField("CHARACTER_SET_NAME", Fields.FIELD_TYPE_VAR_STRING); + fields[1] = PacketUtil.getField("DEFAULT_COLLATE_NAME", Fields.FIELD_TYPE_VAR_STRING); + fields[2] = PacketUtil.getField("DESCRIPTION", Fields.FIELD_TYPE_VAR_STRING); + fields[3] = PacketUtil.getField("MAXLEN", Fields.FIELD_TYPE_LONG); + + doWrite(field_count, fields, c); + + } else { + c.write(c.writeToBuffer(OkPacket.OK, c.allocate())); + } + + } else { + c.write(c.writeToBuffer(OkPacket.OK, c.allocate())); + } + } +} \ No newline at end of file